From cd4a86650813d1aa9ae045b7018ce233eac0209c Mon Sep 17 00:00:00 2001 From: Adam Richie-Halford Date: Fri, 25 Mar 2022 04:57:52 -0700 Subject: [PATCH] Use jsPsychPavlovia plugin for jsPsych v7 --- .eslintrc.json | 6 +- d55e8d982e20df4e7bd9.png | Bin 1747 -> 0 bytes firebaseConfig.bundle.js | 23176 ----------------- index.bundle.js | 43988 --------------------------------- index.html | 9 - jsPsychPavlovia.bundle.js | 1001 - package-lock.json | 31805 +++++++++++++++++------- package.json | 1 + regeneratorRuntime.bundle.js | 803 - src/index.js | 30 +- src/jsPsychPavlovia.js | 1095 +- webpack.config.js | 2 +- 12 files changed, 23828 insertions(+), 78088 deletions(-) delete mode 100644 d55e8d982e20df4e7bd9.png delete mode 100644 firebaseConfig.bundle.js delete mode 100644 index.bundle.js delete mode 100644 index.html delete mode 100644 jsPsychPavlovia.bundle.js delete mode 100644 regeneratorRuntime.bundle.js diff --git a/.eslintrc.json b/.eslintrc.json index 228d0f1..4b3a49f 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -11,5 +11,9 @@ "sourceType": "module" }, "rules": { - } + }, + "ignorePatterns": [ + "**/node_modules/**", + "**/dist/**" + ], } diff --git a/d55e8d982e20df4e7bd9.png b/d55e8d982e20df4e7bd9.png deleted file mode 100644 index 5c3e73adb872fe8f839359f04f3512517bc36968..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1747 zcmeAS@N?(olHy`uVBq!ia0vp^>LAR)1|)kH2buyYmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5ln6+T@J#ddWzYh$IT)B2 zg&3HDEJh$?XwPI|0katxfF=O}^8!YM>;fjZtoj0G1RJDK=jEGi3=B*LnIRD+5xzcF z$@#f@i7EL>sd^Q;1t0|sHWgMtW^QUpqC!P(PF}H9g{=};g%ywu64qBz04piUwpEJo z4N!2-FG^J~)icpEP_pAvP*AWbN=dT{a&d!d2l8x{GD=Dctn~HE%ggo3jrH=2()A53 zEiLs8jP#9+bb%^#i!1X=5-W7`ij^UTz|3(;Elw`VEGWs$&r<-Io0ybeT4JlD1hNPY zAnq*5Ohed|R}A$Q(1ZFQ8GS=N1AT1TQY$iXXamVWw1NEvvCal$n3aD~W-8FZAZOVb z+JG%U5kol724sqrbAC>KQE)+Gaw zG@2MAYebTOYP8V@g(*@PLn06?3XDNJE*pJ#YOv$F6nIM zZv84#+x64**yXzY|0~POzYBe?zwThh_>0$y)x^q`HIaAsk%Q&JpAxH%w5`fv&g;q( zx_nQ~uSoE_`h$aC8rT-_E{R{Td(n~U+J27|KPWvooU;9rnfTEZqsq=F+CSRk&N#oR zuC6|^SE;`}xvP1F`QnQ&cs#S?9wpy6xVf$SMNf^`y-7O)HY&4xU(1rqT%Z{HX4A77 zmje#gt-o%)N$Z9{yYdZ(qkastMAVpWohW{+QD8TJ{)G7CV~_S7ewml5H&g9_je37{ z57)fccUpH8RN7zmvsFLn94*cE$GLWPWQTL6edQC)0GZr_db)AlvByNjRvp)>pK>Eg zrbk%f+R+v6{A+w&PQ6cLyXSZzxMRonsDRrs;javnJCD9vxc9OD$##ol>M=*oS{>3m z#B%=B#to`+kAq)n{VZG9b8@BYB%gqD>vmo_YW$P^S8;2w|61kG9FK0?u@I`|8kyogRm2y=DB(c8ha^?i?scnQ0^FT68M(Z`NF{U-5QgJ))0){|kEhD0kzz=@x2s6XwWhw^^*HI$GTKC@f3P;9$@` z86%k=a~}Q3y>M%fR-}@SG^Y(udrj1%xf3l=;gx2xZ zIm^$L)del^J2lCY-T8Gy$Km2n+zg>{ISZ^lbuxLQK)I*vr2PW!%-f!@Hsu|C z*=w0{=4>zb?h5a^vo{6W7u-*c+~>xcZgpZdx21dLG~b$Q5?W@;`aes3oMmKxJo?|J zTrpcapt*Ezx51~0=I7#tjx(spE@oP9ur05UXU6Vj23u|)D9(9$_kH_A)&p#l&KIT} zW=M0nJM)PCVsVYS2XUWd4)5AH)kYs85dw`VUbr`5Q~9Wq;_zr0jPz2Q^7)wSpsf2yPxNPX3| ocN5w9h+AjAMU8Cq&--8Y$Gd%>wvRdJGN{b=boFyt=akR{01zm#1poj5 diff --git a/firebaseConfig.bundle.js b/firebaseConfig.bundle.js deleted file mode 100644 index 418c868..0000000 --- a/firebaseConfig.bundle.js +++ /dev/null @@ -1,23176 +0,0 @@ -/******/ (() => { // webpackBootstrap -/******/ "use strict"; -/******/ var __webpack_modules__ = ({ - -/***/ "./node_modules/@firebase/firestore/dist/index.esm2017.js": -/*!****************************************************************!*\ - !*** ./node_modules/@firebase/firestore/dist/index.esm2017.js ***! - \****************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "AbstractUserDataWriter": () => (/* binding */ Bh), -/* harmony export */ "Bytes": () => (/* binding */ Mc), -/* harmony export */ "CACHE_SIZE_UNLIMITED": () => (/* binding */ mc), -/* harmony export */ "CollectionReference": () => (/* binding */ ac), -/* harmony export */ "DocumentReference": () => (/* binding */ rc), -/* harmony export */ "DocumentSnapshot": () => (/* binding */ _h), -/* harmony export */ "FieldPath": () => (/* binding */ Nc), -/* harmony export */ "FieldValue": () => (/* binding */ Oc), -/* harmony export */ "Firestore": () => (/* binding */ gc), -/* harmony export */ "FirestoreError": () => (/* binding */ Q), -/* harmony export */ "GeoPoint": () => (/* binding */ $c), -/* harmony export */ "LoadBundleTask": () => (/* binding */ wc), -/* harmony export */ "Query": () => (/* binding */ oc), -/* harmony export */ "QueryConstraint": () => (/* binding */ Ih), -/* harmony export */ "QueryDocumentSnapshot": () => (/* binding */ wh), -/* harmony export */ "QuerySnapshot": () => (/* binding */ mh), -/* harmony export */ "SnapshotMetadata": () => (/* binding */ dh), -/* harmony export */ "Timestamp": () => (/* binding */ ut), -/* harmony export */ "Transaction": () => (/* binding */ rl), -/* harmony export */ "WriteBatch": () => (/* binding */ Uh), -/* harmony export */ "_DatabaseId": () => (/* binding */ vt), -/* harmony export */ "_DocumentKey": () => (/* binding */ xt), -/* harmony export */ "_EmptyAppCheckTokenProvider": () => (/* binding */ et), -/* harmony export */ "_EmptyAuthCredentialsProvider": () => (/* binding */ z), -/* harmony export */ "_FieldPath": () => (/* binding */ mt), -/* harmony export */ "_cast": () => (/* binding */ tc), -/* harmony export */ "_debugAssert": () => (/* binding */ U), -/* harmony export */ "_isBase64Available": () => (/* binding */ yt), -/* harmony export */ "_logWarn": () => (/* binding */ F), -/* harmony export */ "_setIndexConfiguration": () => (/* binding */ dl), -/* harmony export */ "_validateIsNotUsedTogether": () => (/* binding */ Ju), -/* harmony export */ "addDoc": () => (/* binding */ tl), -/* harmony export */ "arrayRemove": () => (/* binding */ hl), -/* harmony export */ "arrayUnion": () => (/* binding */ cl), -/* harmony export */ "clearIndexedDbPersistence": () => (/* binding */ bc), -/* harmony export */ "collection": () => (/* binding */ uc), -/* harmony export */ "collectionGroup": () => (/* binding */ cc), -/* harmony export */ "connectFirestoreEmulator": () => (/* binding */ ic), -/* harmony export */ "deleteDoc": () => (/* binding */ Zh), -/* harmony export */ "deleteField": () => (/* binding */ al), -/* harmony export */ "disableNetwork": () => (/* binding */ vc), -/* harmony export */ "doc": () => (/* binding */ hc), -/* harmony export */ "documentId": () => (/* binding */ kc), -/* harmony export */ "enableIndexedDbPersistence": () => (/* binding */ Ec), -/* harmony export */ "enableMultiTabIndexedDbPersistence": () => (/* binding */ Ac), -/* harmony export */ "enableNetwork": () => (/* binding */ Vc), -/* harmony export */ "endAt": () => (/* binding */ kh), -/* harmony export */ "endBefore": () => (/* binding */ Nh), -/* harmony export */ "ensureFirestoreConfigured": () => (/* binding */ Ic), -/* harmony export */ "executeWrite": () => (/* binding */ sl), -/* harmony export */ "getDoc": () => (/* binding */ Gh), -/* harmony export */ "getDocFromCache": () => (/* binding */ jh), -/* harmony export */ "getDocFromServer": () => (/* binding */ Wh), -/* harmony export */ "getDocs": () => (/* binding */ zh), -/* harmony export */ "getDocsFromCache": () => (/* binding */ Hh), -/* harmony export */ "getDocsFromServer": () => (/* binding */ Jh), -/* harmony export */ "getFirestore": () => (/* binding */ pc), -/* harmony export */ "increment": () => (/* binding */ ll), -/* harmony export */ "initializeFirestore": () => (/* binding */ yc), -/* harmony export */ "limit": () => (/* binding */ Vh), -/* harmony export */ "limitToLast": () => (/* binding */ vh), -/* harmony export */ "loadBundle": () => (/* binding */ Dc), -/* harmony export */ "namedQuery": () => (/* binding */ Cc), -/* harmony export */ "onSnapshot": () => (/* binding */ el), -/* harmony export */ "onSnapshotsInSync": () => (/* binding */ nl), -/* harmony export */ "orderBy": () => (/* binding */ bh), -/* harmony export */ "query": () => (/* binding */ Th), -/* harmony export */ "queryEqual": () => (/* binding */ fc), -/* harmony export */ "refEqual": () => (/* binding */ lc), -/* harmony export */ "runTransaction": () => (/* binding */ ol), -/* harmony export */ "serverTimestamp": () => (/* binding */ ul), -/* harmony export */ "setDoc": () => (/* binding */ Yh), -/* harmony export */ "setLogLevel": () => (/* binding */ M), -/* harmony export */ "snapshotEqual": () => (/* binding */ yh), -/* harmony export */ "startAfter": () => (/* binding */ Ch), -/* harmony export */ "startAt": () => (/* binding */ Dh), -/* harmony export */ "terminate": () => (/* binding */ Sc), -/* harmony export */ "updateDoc": () => (/* binding */ Xh), -/* harmony export */ "waitForPendingWrites": () => (/* binding */ Pc), -/* harmony export */ "where": () => (/* binding */ Ah), -/* harmony export */ "writeBatch": () => (/* binding */ fl) -/* harmony export */ }); -/* harmony import */ var _firebase_app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @firebase/app */ "./node_modules/@firebase/app/dist/esm/index.esm2017.js"); -/* harmony import */ var _firebase_component__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @firebase/component */ "./node_modules/@firebase/component/dist/esm/index.esm2017.js"); -/* harmony import */ var _firebase_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @firebase/logger */ "./node_modules/@firebase/logger/dist/esm/index.esm2017.js"); -/* harmony import */ var _firebase_util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @firebase/util */ "./node_modules/@firebase/util/dist/index.esm2017.js"); -/* harmony import */ var _firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @firebase/webchannel-wrapper */ "./node_modules/@firebase/webchannel-wrapper/dist/index.esm2017.js"); - - - - - - -const D = "@firebase/firestore"; - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Simple wrapper around a nullable UID. Mostly exists to make code more - * readable. - */ -class C { - constructor(t) { - this.uid = t; - } - isAuthenticated() { - return null != this.uid; - } - /** - * Returns a key representing this user, suitable for inclusion in a - * dictionary. - */ toKey() { - return this.isAuthenticated() ? "uid:" + this.uid : "anonymous-user"; - } - isEqual(t) { - return t.uid === this.uid; - } -} - -/** A user with a null UID. */ C.UNAUTHENTICATED = new C(null), -// TODO(mikelehen): Look into getting a proper uid-equivalent for -// non-FirebaseAuth providers. -C.GOOGLE_CREDENTIALS = new C("google-credentials-uid"), C.FIRST_PARTY = new C("first-party-uid"), -C.MOCK_USER = new C("mock-user"); - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -let x = "9.6.9"; - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const N = new _firebase_logger__WEBPACK_IMPORTED_MODULE_2__.Logger("@firebase/firestore"); - -// Helper methods are needed because variables can't be exported as read/write -function k() { - return N.logLevel; -} - -/** - * Sets the verbosity of Cloud Firestore logs (debug, error, or silent). - * - * @param logLevel - The verbosity you set for activity and error logging. Can - * be any of the following values: - * - *
    - *
  • `debug` for the most verbose logging level, primarily for - * debugging.
  • - *
  • `error` to log errors only.
  • - *
  • `silent` to turn off logging.
  • - *
- */ function M(t) { - N.setLogLevel(t); -} - -function O(t, ...e) { - if (N.logLevel <= _firebase_logger__WEBPACK_IMPORTED_MODULE_2__.LogLevel.DEBUG) { - const n = e.map(B); - N.debug(`Firestore (${x}): ${t}`, ...n); - } -} - -function $(t, ...e) { - if (N.logLevel <= _firebase_logger__WEBPACK_IMPORTED_MODULE_2__.LogLevel.ERROR) { - const n = e.map(B); - N.error(`Firestore (${x}): ${t}`, ...n); - } -} - -/** - * @internal - */ function F(t, ...e) { - if (N.logLevel <= _firebase_logger__WEBPACK_IMPORTED_MODULE_2__.LogLevel.WARN) { - const n = e.map(B); - N.warn(`Firestore (${x}): ${t}`, ...n); - } -} - -/** - * Converts an additional log parameter to a string representation. - */ function B(t) { - if ("string" == typeof t) return t; - try { - return e = t, JSON.stringify(e); - } catch (e) { - // Converting to JSON failed, just log the object directly - return t; - } - /** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** Formats an object as a JSON string, suitable for logging. */ - var e; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Unconditionally fails, throwing an Error with the given message. - * Messages are stripped in production builds. - * - * Returns `never` and can be used in expressions: - * @example - * let futureVar = fail('not implemented yet'); - */ function L(t = "Unexpected state") { - // Log the failure in addition to throw an exception, just in case the - // exception is swallowed. - const e = `FIRESTORE (${x}) INTERNAL ASSERTION FAILED: ` + t; - // NOTE: We don't use FirestoreError here because these are internal failures - // that cannot be handled by the user. (Also it would create a circular - // dependency between the error and assert modules which doesn't work.) - throw $(e), new Error(e); -} - -/** - * Fails if the given assertion condition is false, throwing an Error with the - * given message if it did. - * - * Messages are stripped in production builds. - */ function q(t, e) { - t || L(); -} - -/** - * Fails if the given assertion condition is false, throwing an Error with the - * given message if it did. - * - * The code of callsites invoking this function are stripped out in production - * builds. Any side-effects of code within the debugAssert() invocation will not - * happen in this case. - * - * @internal - */ function U(t, e) { - t || L(); -} - -/** - * Casts `obj` to `T`. In non-production builds, verifies that `obj` is an - * instance of `T` before casting. - */ function K(t, -// eslint-disable-next-line @typescript-eslint/no-explicit-any -e) { - return t; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ const G = { - // Causes are copied from: - // https://github.com/grpc/grpc/blob/bceec94ea4fc5f0085d81235d8e1c06798dc341a/include/grpc%2B%2B/impl/codegen/status_code_enum.h - /** Not an error; returned on success. */ - OK: "ok", - /** The operation was cancelled (typically by the caller). */ - CANCELLED: "cancelled", - /** Unknown error or an error from a different error domain. */ - UNKNOWN: "unknown", - /** - * Client specified an invalid argument. Note that this differs from - * FAILED_PRECONDITION. INVALID_ARGUMENT indicates arguments that are - * problematic regardless of the state of the system (e.g., a malformed file - * name). - */ - INVALID_ARGUMENT: "invalid-argument", - /** - * Deadline expired before operation could complete. For operations that - * change the state of the system, this error may be returned even if the - * operation has completed successfully. For example, a successful response - * from a server could have been delayed long enough for the deadline to - * expire. - */ - DEADLINE_EXCEEDED: "deadline-exceeded", - /** Some requested entity (e.g., file or directory) was not found. */ - NOT_FOUND: "not-found", - /** - * Some entity that we attempted to create (e.g., file or directory) already - * exists. - */ - ALREADY_EXISTS: "already-exists", - /** - * The caller does not have permission to execute the specified operation. - * PERMISSION_DENIED must not be used for rejections caused by exhausting - * some resource (use RESOURCE_EXHAUSTED instead for those errors). - * PERMISSION_DENIED must not be used if the caller can not be identified - * (use UNAUTHENTICATED instead for those errors). - */ - PERMISSION_DENIED: "permission-denied", - /** - * The request does not have valid authentication credentials for the - * operation. - */ - UNAUTHENTICATED: "unauthenticated", - /** - * Some resource has been exhausted, perhaps a per-user quota, or perhaps the - * entire file system is out of space. - */ - RESOURCE_EXHAUSTED: "resource-exhausted", - /** - * Operation was rejected because the system is not in a state required for - * the operation's execution. For example, directory to be deleted may be - * non-empty, an rmdir operation is applied to a non-directory, etc. - * - * A litmus test that may help a service implementor in deciding - * between FAILED_PRECONDITION, ABORTED, and UNAVAILABLE: - * (a) Use UNAVAILABLE if the client can retry just the failing call. - * (b) Use ABORTED if the client should retry at a higher-level - * (e.g., restarting a read-modify-write sequence). - * (c) Use FAILED_PRECONDITION if the client should not retry until - * the system state has been explicitly fixed. E.g., if an "rmdir" - * fails because the directory is non-empty, FAILED_PRECONDITION - * should be returned since the client should not retry unless - * they have first fixed up the directory by deleting files from it. - * (d) Use FAILED_PRECONDITION if the client performs conditional - * REST Get/Update/Delete on a resource and the resource on the - * server does not match the condition. E.g., conflicting - * read-modify-write on the same resource. - */ - FAILED_PRECONDITION: "failed-precondition", - /** - * The operation was aborted, typically due to a concurrency issue like - * sequencer check failures, transaction aborts, etc. - * - * See litmus test above for deciding between FAILED_PRECONDITION, ABORTED, - * and UNAVAILABLE. - */ - ABORTED: "aborted", - /** - * Operation was attempted past the valid range. E.g., seeking or reading - * past end of file. - * - * Unlike INVALID_ARGUMENT, this error indicates a problem that may be fixed - * if the system state changes. For example, a 32-bit file system will - * generate INVALID_ARGUMENT if asked to read at an offset that is not in the - * range [0,2^32-1], but it will generate OUT_OF_RANGE if asked to read from - * an offset past the current file size. - * - * There is a fair bit of overlap between FAILED_PRECONDITION and - * OUT_OF_RANGE. We recommend using OUT_OF_RANGE (the more specific error) - * when it applies so that callers who are iterating through a space can - * easily look for an OUT_OF_RANGE error to detect when they are done. - */ - OUT_OF_RANGE: "out-of-range", - /** Operation is not implemented or not supported/enabled in this service. */ - UNIMPLEMENTED: "unimplemented", - /** - * Internal errors. Means some invariants expected by underlying System has - * been broken. If you see one of these errors, Something is very broken. - */ - INTERNAL: "internal", - /** - * The service is currently unavailable. This is a most likely a transient - * condition and may be corrected by retrying with a backoff. - * - * See litmus test above for deciding between FAILED_PRECONDITION, ABORTED, - * and UNAVAILABLE. - */ - UNAVAILABLE: "unavailable", - /** Unrecoverable data loss or corruption. */ - DATA_LOSS: "data-loss" -}; - -/** An error returned by a Firestore operation. */ class Q extends _firebase_util__WEBPACK_IMPORTED_MODULE_3__.FirebaseError { - /** @hideconstructor */ - constructor( - /** - * The backend error code associated with this error. - */ - t, - /** - * A custom error description. - */ - e) { - super(t, e), this.code = t, this.message = e, - // HACK: We write a toString property directly because Error is not a real - // class and so inheritance does not work correctly. We could alternatively - // do the same "back-door inheritance" trick that FirebaseError does. - this.toString = () => `${this.name}: [code=${this.code}]: ${this.message}`; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ class j { - constructor() { - this.promise = new Promise(((t, e) => { - this.resolve = t, this.reject = e; - })); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ class W { - constructor(t, e) { - this.user = e, this.type = "OAuth", this.headers = new Map, this.headers.set("Authorization", `Bearer ${t}`); - } -} - -/** - * A CredentialsProvider that always yields an empty token. - * @internal - */ class z { - getToken() { - return Promise.resolve(null); - } - invalidateToken() {} - start(t, e) { - // Fire with initial user. - t.enqueueRetryable((() => e(C.UNAUTHENTICATED))); - } - shutdown() {} -} - -/** - * A CredentialsProvider that always returns a constant token. Used for - * emulator token mocking. - */ class H { - constructor(t) { - this.token = t, - /** - * Stores the listener registered with setChangeListener() - * This isn't actually necessary since the UID never changes, but we use this - * to verify the listen contract is adhered to in tests. - */ - this.changeListener = null; - } - getToken() { - return Promise.resolve(this.token); - } - invalidateToken() {} - start(t, e) { - this.changeListener = e, - // Fire with initial user. - t.enqueueRetryable((() => e(this.token.user))); - } - shutdown() { - this.changeListener = null; - } -} - -class J { - constructor(t) { - this.t = t, - /** Tracks the current User. */ - this.currentUser = C.UNAUTHENTICATED, - /** - * Counter used to detect if the token changed while a getToken request was - * outstanding. - */ - this.i = 0, this.forceRefresh = !1, this.auth = null; - } - start(t, e) { - let n = this.i; - // A change listener that prevents double-firing for the same token change. - const s = t => this.i !== n ? (n = this.i, e(t)) : Promise.resolve(); - // A promise that can be waited on to block on the next token change. - // This promise is re-created after each change. - let i = new j; - this.o = () => { - this.i++, this.currentUser = this.u(), i.resolve(), i = new j, t.enqueueRetryable((() => s(this.currentUser))); - }; - const r = () => { - const e = i; - t.enqueueRetryable((async () => { - await e.promise, await s(this.currentUser); - })); - }, o = t => { - O("FirebaseAuthCredentialsProvider", "Auth detected"), this.auth = t, this.auth.addAuthTokenListener(this.o), - r(); - }; - this.t.onInit((t => o(t))), - // Our users can initialize Auth right after Firestore, so we give it - // a chance to register itself with the component framework before we - // determine whether to start up in unauthenticated mode. - setTimeout((() => { - if (!this.auth) { - const t = this.t.getImmediate({ - optional: !0 - }); - t ? o(t) : ( - // If auth is still not available, proceed with `null` user - O("FirebaseAuthCredentialsProvider", "Auth not yet detected"), i.resolve(), i = new j); - } - }), 0), r(); - } - getToken() { - // Take note of the current value of the tokenCounter so that this method - // can fail (with an ABORTED error) if there is a token change while the - // request is outstanding. - const t = this.i, e = this.forceRefresh; - return this.forceRefresh = !1, this.auth ? this.auth.getToken(e).then((e => - // Cancel the request since the token changed while the request was - // outstanding so the response is potentially for a previous user (which - // user, we can't be sure). - this.i !== t ? (O("FirebaseAuthCredentialsProvider", "getToken aborted due to token change."), - this.getToken()) : e ? (q("string" == typeof e.accessToken), new W(e.accessToken, this.currentUser)) : null)) : Promise.resolve(null); - } - invalidateToken() { - this.forceRefresh = !0; - } - shutdown() { - this.auth && this.auth.removeAuthTokenListener(this.o); - } - // Auth.getUid() can return null even with a user logged in. It is because - // getUid() is synchronous, but the auth code populating Uid is asynchronous. - // This method should only be called in the AuthTokenListener callback - // to guarantee to get the actual user. - u() { - const t = this.auth && this.auth.getUid(); - return q(null === t || "string" == typeof t), new C(t); - } -} - -/* - * FirstPartyToken provides a fresh token each time its value - * is requested, because if the token is too old, requests will be rejected. - * Technically this may no longer be necessary since the SDK should gracefully - * recover from unauthenticated errors (see b/33147818 for context), but it's - * safer to keep the implementation as-is. - */ class Y { - constructor(t, e, n) { - this.type = "FirstParty", this.user = C.FIRST_PARTY, this.headers = new Map, this.headers.set("X-Goog-AuthUser", e); - const s = t.auth.getAuthHeaderValueForFirstParty([]); - s && this.headers.set("Authorization", s), n && this.headers.set("X-Goog-Iam-Authorization-Token", n); - } -} - -/* - * Provides user credentials required for the Firestore JavaScript SDK - * to authenticate the user, using technique that is only available - * to applications hosted by Google. - */ class X { - constructor(t, e, n) { - this.h = t, this.l = e, this.m = n; - } - getToken() { - return Promise.resolve(new Y(this.h, this.l, this.m)); - } - start(t, e) { - // Fire with initial uid. - t.enqueueRetryable((() => e(C.FIRST_PARTY))); - } - shutdown() {} - invalidateToken() {} -} - -class Z { - constructor(t) { - this.value = t, this.type = "AppCheck", this.headers = new Map, t && t.length > 0 && this.headers.set("x-firebase-appcheck", this.value); - } -} - -class tt { - constructor(t) { - this.g = t, this.forceRefresh = !1, this.appCheck = null, this.p = null; - } - start(t, e) { - const n = t => { - null != t.error && O("FirebaseAppCheckTokenProvider", `Error getting App Check token; using placeholder token instead. Error: ${t.error.message}`); - const n = t.token !== this.p; - return this.p = t.token, O("FirebaseAppCheckTokenProvider", `Received ${n ? "new" : "existing"} token.`), - n ? e(t.token) : Promise.resolve(); - }; - this.o = e => { - t.enqueueRetryable((() => n(e))); - }; - const s = t => { - O("FirebaseAppCheckTokenProvider", "AppCheck detected"), this.appCheck = t, this.appCheck.addTokenListener(this.o); - }; - this.g.onInit((t => s(t))), - // Our users can initialize AppCheck after Firestore, so we give it - // a chance to register itself with the component framework. - setTimeout((() => { - if (!this.appCheck) { - const t = this.g.getImmediate({ - optional: !0 - }); - t ? s(t) : - // If AppCheck is still not available, proceed without it. - O("FirebaseAppCheckTokenProvider", "AppCheck not yet detected"); - } - }), 0); - } - getToken() { - const t = this.forceRefresh; - return this.forceRefresh = !1, this.appCheck ? this.appCheck.getToken(t).then((t => t ? (q("string" == typeof t.token), - this.p = t.token, new Z(t.token)) : null)) : Promise.resolve(null); - } - invalidateToken() { - this.forceRefresh = !0; - } - shutdown() { - this.appCheck && this.appCheck.removeTokenListener(this.o); - } -} - -/** - * An AppCheck token provider that always yields an empty token. - * @internal - */ class et { - getToken() { - return Promise.resolve(new Z("")); - } - invalidateToken() {} - start(t, e) {} - shutdown() {} -} - -/** - * Builds a CredentialsProvider depending on the type of - * the credentials passed in. - */ -/** - * @license - * Copyright 2018 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * `ListenSequence` is a monotonic sequence. It is initialized with a minimum value to - * exceed. All subsequent calls to next will return increasing values. If provided with a - * `SequenceNumberSyncer`, it will additionally bump its next value when told of a new value, as - * well as write out sequence numbers that it produces via `next()`. - */ -class nt { - constructor(t, e) { - this.previousValue = t, e && (e.sequenceNumberHandler = t => this.I(t), this.T = t => e.writeSequenceNumber(t)); - } - I(t) { - return this.previousValue = Math.max(t, this.previousValue), this.previousValue; - } - next() { - const t = ++this.previousValue; - return this.T && this.T(t), t; - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Generates `nBytes` of random bytes. - * - * If `nBytes < 0` , an error will be thrown. - */ -function st(t) { - // Polyfills for IE and WebWorker by using `self` and `msCrypto` when `crypto` is not available. - const e = - // eslint-disable-next-line @typescript-eslint/no-explicit-any - "undefined" != typeof self && (self.crypto || self.msCrypto), n = new Uint8Array(t); - if (e && "function" == typeof e.getRandomValues) e.getRandomValues(n); else - // Falls back to Math.random - for (let e = 0; e < t; e++) n[e] = Math.floor(256 * Math.random()); - return n; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ nt.A = -1; - -class it { - static R() { - // Alphanumeric characters - const t = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", e = Math.floor(256 / t.length) * t.length; - // The largest byte value that is a multiple of `char.length`. - let n = ""; - for (;n.length < 20; ) { - const s = st(40); - for (let i = 0; i < s.length; ++i) - // Only accept values that are [0, maxMultiple), this ensures they can - // be evenly mapped to indices of `chars` via a modulo operation. - n.length < 20 && s[i] < e && (n += t.charAt(s[i] % t.length)); - } - return n; - } -} - -function rt(t, e) { - return t < e ? -1 : t > e ? 1 : 0; -} - -/** Helper to compare arrays using isEqual(). */ function ot(t, e, n) { - return t.length === e.length && t.every(((t, s) => n(t, e[s]))); -} - -/** - * Returns the immediate lexicographically-following string. This is useful to - * construct an inclusive range for indexeddb iterators. - */ function at(t) { - // Return the input string, with an additional NUL byte appended. - return t + "\0"; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -// The earliest date supported by Firestore timestamps (0001-01-01T00:00:00Z). -/** - * A `Timestamp` represents a point in time independent of any time zone or - * calendar, represented as seconds and fractions of seconds at nanosecond - * resolution in UTC Epoch time. - * - * It is encoded using the Proleptic Gregorian Calendar which extends the - * Gregorian calendar backwards to year one. It is encoded assuming all minutes - * are 60 seconds long, i.e. leap seconds are "smeared" so that no leap second - * table is needed for interpretation. Range is from 0001-01-01T00:00:00Z to - * 9999-12-31T23:59:59.999999999Z. - * - * For examples and further specifications, refer to the - * {@link https://github.com/google/protobuf/blob/master/src/google/protobuf/timestamp.proto | Timestamp definition}. - */ -class ut { - /** - * Creates a new timestamp. - * - * @param seconds - The number of seconds of UTC time since Unix epoch - * 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to - * 9999-12-31T23:59:59Z inclusive. - * @param nanoseconds - The non-negative fractions of a second at nanosecond - * resolution. Negative second values with fractions must still have - * non-negative nanoseconds values that count forward in time. Must be - * from 0 to 999,999,999 inclusive. - */ - constructor( - /** - * The number of seconds of UTC time since Unix epoch 1970-01-01T00:00:00Z. - */ - t, - /** - * The fractions of a second at nanosecond resolution.* - */ - e) { - if (this.seconds = t, this.nanoseconds = e, e < 0) throw new Q(G.INVALID_ARGUMENT, "Timestamp nanoseconds out of range: " + e); - if (e >= 1e9) throw new Q(G.INVALID_ARGUMENT, "Timestamp nanoseconds out of range: " + e); - if (t < -62135596800) throw new Q(G.INVALID_ARGUMENT, "Timestamp seconds out of range: " + t); - // This will break in the year 10,000. - if (t >= 253402300800) throw new Q(G.INVALID_ARGUMENT, "Timestamp seconds out of range: " + t); - } - /** - * Creates a new timestamp with the current date, with millisecond precision. - * - * @returns a new timestamp representing the current date. - */ static now() { - return ut.fromMillis(Date.now()); - } - /** - * Creates a new timestamp from the given date. - * - * @param date - The date to initialize the `Timestamp` from. - * @returns A new `Timestamp` representing the same point in time as the given - * date. - */ static fromDate(t) { - return ut.fromMillis(t.getTime()); - } - /** - * Creates a new timestamp from the given number of milliseconds. - * - * @param milliseconds - Number of milliseconds since Unix epoch - * 1970-01-01T00:00:00Z. - * @returns A new `Timestamp` representing the same point in time as the given - * number of milliseconds. - */ static fromMillis(t) { - const e = Math.floor(t / 1e3), n = Math.floor(1e6 * (t - 1e3 * e)); - return new ut(e, n); - } - /** - * Converts a `Timestamp` to a JavaScript `Date` object. This conversion - * causes a loss of precision since `Date` objects only support millisecond - * precision. - * - * @returns JavaScript `Date` object representing the same point in time as - * this `Timestamp`, with millisecond precision. - */ toDate() { - return new Date(this.toMillis()); - } - /** - * Converts a `Timestamp` to a numeric timestamp (in milliseconds since - * epoch). This operation causes a loss of precision. - * - * @returns The point in time corresponding to this timestamp, represented as - * the number of milliseconds since Unix epoch 1970-01-01T00:00:00Z. - */ toMillis() { - return 1e3 * this.seconds + this.nanoseconds / 1e6; - } - _compareTo(t) { - return this.seconds === t.seconds ? rt(this.nanoseconds, t.nanoseconds) : rt(this.seconds, t.seconds); - } - /** - * Returns true if this `Timestamp` is equal to the provided one. - * - * @param other - The `Timestamp` to compare against. - * @returns true if this `Timestamp` is equal to the provided one. - */ isEqual(t) { - return t.seconds === this.seconds && t.nanoseconds === this.nanoseconds; - } - /** Returns a textual representation of this `Timestamp`. */ toString() { - return "Timestamp(seconds=" + this.seconds + ", nanoseconds=" + this.nanoseconds + ")"; - } - /** Returns a JSON-serializable representation of this `Timestamp`. */ toJSON() { - return { - seconds: this.seconds, - nanoseconds: this.nanoseconds - }; - } - /** - * Converts this object to a primitive string, which allows `Timestamp` objects - * to be compared using the `>`, `<=`, `>=` and `>` operators. - */ valueOf() { - // This method returns a string of the form . where - // is translated to have a non-negative value and both - // and are left-padded with zeroes to be a consistent length. - // Strings with this format then have a lexiographical ordering that matches - // the expected ordering. The translation is done to avoid having - // a leading negative sign (i.e. a leading '-' character) in its string - // representation, which would affect its lexiographical ordering. - const t = this.seconds - -62135596800; - // Note: Up to 12 decimal digits are required to represent all valid - // 'seconds' values. - return String(t).padStart(12, "0") + "." + String(this.nanoseconds).padStart(9, "0"); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A version of a document in Firestore. This corresponds to the version - * timestamp, such as update_time or read_time. - */ class ct { - constructor(t) { - this.timestamp = t; - } - static fromTimestamp(t) { - return new ct(t); - } - static min() { - return new ct(new ut(0, 0)); - } - compareTo(t) { - return this.timestamp._compareTo(t.timestamp); - } - isEqual(t) { - return this.timestamp.isEqual(t.timestamp); - } - /** Returns a number representation of the version for use in spec tests. */ toMicroseconds() { - // Convert to microseconds. - return 1e6 * this.timestamp.seconds + this.timestamp.nanoseconds / 1e3; - } - toString() { - return "SnapshotVersion(" + this.timestamp.toString() + ")"; - } - toTimestamp() { - return this.timestamp; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ function ht(t) { - let e = 0; - for (const n in t) Object.prototype.hasOwnProperty.call(t, n) && e++; - return e; -} - -function lt(t, e) { - for (const n in t) Object.prototype.hasOwnProperty.call(t, n) && e(n, t[n]); -} - -function ft(t) { - for (const e in t) if (Object.prototype.hasOwnProperty.call(t, e)) return !1; - return !0; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Path represents an ordered sequence of string segments. - */ -class dt { - constructor(t, e, n) { - void 0 === e ? e = 0 : e > t.length && L(), void 0 === n ? n = t.length - e : n > t.length - e && L(), - this.segments = t, this.offset = e, this.len = n; - } - get length() { - return this.len; - } - isEqual(t) { - return 0 === dt.comparator(this, t); - } - child(t) { - const e = this.segments.slice(this.offset, this.limit()); - return t instanceof dt ? t.forEach((t => { - e.push(t); - })) : e.push(t), this.construct(e); - } - /** The index of one past the last segment of the path. */ limit() { - return this.offset + this.length; - } - popFirst(t) { - return t = void 0 === t ? 1 : t, this.construct(this.segments, this.offset + t, this.length - t); - } - popLast() { - return this.construct(this.segments, this.offset, this.length - 1); - } - firstSegment() { - return this.segments[this.offset]; - } - lastSegment() { - return this.get(this.length - 1); - } - get(t) { - return this.segments[this.offset + t]; - } - isEmpty() { - return 0 === this.length; - } - isPrefixOf(t) { - if (t.length < this.length) return !1; - for (let e = 0; e < this.length; e++) if (this.get(e) !== t.get(e)) return !1; - return !0; - } - isImmediateParentOf(t) { - if (this.length + 1 !== t.length) return !1; - for (let e = 0; e < this.length; e++) if (this.get(e) !== t.get(e)) return !1; - return !0; - } - forEach(t) { - for (let e = this.offset, n = this.limit(); e < n; e++) t(this.segments[e]); - } - toArray() { - return this.segments.slice(this.offset, this.limit()); - } - static comparator(t, e) { - const n = Math.min(t.length, e.length); - for (let s = 0; s < n; s++) { - const n = t.get(s), i = e.get(s); - if (n < i) return -1; - if (n > i) return 1; - } - return t.length < e.length ? -1 : t.length > e.length ? 1 : 0; - } -} - -/** - * A slash-separated path for navigating resources (documents and collections) - * within Firestore. - * - * @internal - */ class _t extends dt { - construct(t, e, n) { - return new _t(t, e, n); - } - canonicalString() { - // NOTE: The client is ignorant of any path segments containing escape - // sequences (e.g. __id123__) and just passes them through raw (they exist - // for legacy reasons and should not be used frequently). - return this.toArray().join("/"); - } - toString() { - return this.canonicalString(); - } - /** - * Creates a resource path from the given slash-delimited string. If multiple - * arguments are provided, all components are combined. Leading and trailing - * slashes from all components are ignored. - */ static fromString(...t) { - // NOTE: The client is ignorant of any path segments containing escape - // sequences (e.g. __id123__) and just passes them through raw (they exist - // for legacy reasons and should not be used frequently). - const e = []; - for (const n of t) { - if (n.indexOf("//") >= 0) throw new Q(G.INVALID_ARGUMENT, `Invalid segment (${n}). Paths must not contain // in them.`); - // Strip leading and traling slashed. - e.push(...n.split("/").filter((t => t.length > 0))); - } - return new _t(e); - } - static emptyPath() { - return new _t([]); - } -} - -const wt = /^[_a-zA-Z][_a-zA-Z0-9]*$/; - -/** - * A dot-separated path for navigating sub-objects within a document. - * @internal - */ class mt extends dt { - construct(t, e, n) { - return new mt(t, e, n); - } - /** - * Returns true if the string could be used as a segment in a field path - * without escaping. - */ static isValidIdentifier(t) { - return wt.test(t); - } - canonicalString() { - return this.toArray().map((t => (t = t.replace(/\\/g, "\\\\").replace(/`/g, "\\`"), - mt.isValidIdentifier(t) || (t = "`" + t + "`"), t))).join("."); - } - toString() { - return this.canonicalString(); - } - /** - * Returns true if this field references the key of a document. - */ isKeyField() { - return 1 === this.length && "__name__" === this.get(0); - } - /** - * The field designating the key of a document. - */ static keyField() { - return new mt([ "__name__" ]); - } - /** - * Parses a field string from the given server-formatted string. - * - * - Splitting the empty string is not allowed (for now at least). - * - Empty segments within the string (e.g. if there are two consecutive - * separators) are not allowed. - * - * TODO(b/37244157): we should make this more strict. Right now, it allows - * non-identifier path components, even if they aren't escaped. - */ static fromServerFormat(t) { - const e = []; - let n = "", s = 0; - const i = () => { - if (0 === n.length) throw new Q(G.INVALID_ARGUMENT, `Invalid field path (${t}). Paths must not be empty, begin with '.', end with '.', or contain '..'`); - e.push(n), n = ""; - }; - let r = !1; - for (;s < t.length; ) { - const e = t[s]; - if ("\\" === e) { - if (s + 1 === t.length) throw new Q(G.INVALID_ARGUMENT, "Path has trailing escape character: " + t); - const e = t[s + 1]; - if ("\\" !== e && "." !== e && "`" !== e) throw new Q(G.INVALID_ARGUMENT, "Path has invalid escape sequence: " + t); - n += e, s += 2; - } else "`" === e ? (r = !r, s++) : "." !== e || r ? (n += e, s++) : (i(), s++); - } - if (i(), r) throw new Q(G.INVALID_ARGUMENT, "Unterminated ` in path: " + t); - return new mt(e); - } - static emptyPath() { - return new mt([]); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Provides a set of fields that can be used to partially patch a document. - * FieldMask is used in conjunction with ObjectValue. - * Examples: - * foo - Overwrites foo entirely with the provided value. If foo is not - * present in the companion ObjectValue, the field is deleted. - * foo.bar - Overwrites only the field bar of the object foo. - * If foo is not an object, foo is replaced with an object - * containing foo - */ class gt { - constructor(t) { - this.fields = t, - // TODO(dimond): validation of FieldMask - // Sort the field mask to support `FieldMask.isEqual()` and assert below. - t.sort(mt.comparator); - } - /** - * Verifies that `fieldPath` is included by at least one field in this field - * mask. - * - * This is an O(n) operation, where `n` is the size of the field mask. - */ covers(t) { - for (const e of this.fields) if (e.isPrefixOf(t)) return !0; - return !1; - } - isEqual(t) { - return ot(this.fields, t.fields, ((t, e) => t.isEqual(e))); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** Converts a Base64 encoded string to a binary string. */ -/** True if and only if the Base64 conversion functions are available. */ -function yt() { - return "undefined" != typeof atob; -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Immutable class that represents a "proto" byte string. - * - * Proto byte strings can either be Base64-encoded strings or Uint8Arrays when - * sent on the wire. This class abstracts away this differentiation by holding - * the proto byte string in a common class that must be converted into a string - * before being sent as a proto. - * @internal - */ class pt { - constructor(t) { - this.binaryString = t; - } - static fromBase64String(t) { - const e = atob(t); - return new pt(e); - } - static fromUint8Array(t) { - // TODO(indexing); Remove the copy of the byte string here as this method - // is frequently called during indexing. - const e = - /** - * Helper function to convert an Uint8array to a binary string. - */ - function(t) { - let e = ""; - for (let n = 0; n < t.length; ++n) e += String.fromCharCode(t[n]); - return e; - } - /** - * Helper function to convert a binary string to an Uint8Array. - */ (t); - return new pt(e); - } - [Symbol.iterator]() { - let t = 0; - return { - next: () => t < this.binaryString.length ? { - value: this.binaryString.charCodeAt(t++), - done: !1 - } : { - value: void 0, - done: !0 - } - }; - } - toBase64() { - return t = this.binaryString, btoa(t); - /** Converts a binary string to a Base64 encoded string. */ - var t; - } - toUint8Array() { - return function(t) { - const e = new Uint8Array(t.length); - for (let n = 0; n < t.length; n++) e[n] = t.charCodeAt(n); - return e; - } - /** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - // A RegExp matching ISO 8601 UTC timestamps with optional fraction. - (this.binaryString); - } - approximateByteSize() { - return 2 * this.binaryString.length; - } - compareTo(t) { - return rt(this.binaryString, t.binaryString); - } - isEqual(t) { - return this.binaryString === t.binaryString; - } -} - -pt.EMPTY_BYTE_STRING = new pt(""); - -const It = new RegExp(/^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d(?:\.(\d+))?Z$/); - -/** - * Converts the possible Proto values for a timestamp value into a "seconds and - * nanos" representation. - */ function Tt(t) { - // The json interface (for the browser) will return an iso timestamp string, - // while the proto js library (for node) will return a - // google.protobuf.Timestamp instance. - if (q(!!t), "string" == typeof t) { - // The date string can have higher precision (nanos) than the Date class - // (millis), so we do some custom parsing here. - // Parse the nanos right out of the string. - let e = 0; - const n = It.exec(t); - if (q(!!n), n[1]) { - // Pad the fraction out to 9 digits (nanos). - let t = n[1]; - t = (t + "000000000").substr(0, 9), e = Number(t); - } - // Parse the date to get the seconds. - const s = new Date(t); - return { - seconds: Math.floor(s.getTime() / 1e3), - nanos: e - }; - } - return { - seconds: Et(t.seconds), - nanos: Et(t.nanos) - }; -} - -/** - * Converts the possible Proto types for numbers into a JavaScript number. - * Returns 0 if the value is not numeric. - */ function Et(t) { - // TODO(bjornick): Handle int64 greater than 53 bits. - return "number" == typeof t ? t : "string" == typeof t ? Number(t) : 0; -} - -/** Converts the possible Proto types for Blobs into a ByteString. */ function At(t) { - return "string" == typeof t ? pt.fromBase64String(t) : pt.fromUint8Array(t); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Represents a locally-applied ServerTimestamp. - * - * Server Timestamps are backed by MapValues that contain an internal field - * `__type__` with a value of `server_timestamp`. The previous value and local - * write time are stored in its `__previous_value__` and `__local_write_time__` - * fields respectively. - * - * Notes: - * - ServerTimestampValue instances are created as the result of applying a - * transform. They can only exist in the local view of a document. Therefore - * they do not need to be parsed or serialized. - * - When evaluated locally (e.g. for snapshot.data()), they by default - * evaluate to `null`. This behavior can be configured by passing custom - * FieldValueOptions to value(). - * - With respect to other ServerTimestampValues, they sort by their - * localWriteTime. - */ function Rt(t) { - var e, n; - return "server_timestamp" === (null === (n = ((null === (e = null == t ? void 0 : t.mapValue) || void 0 === e ? void 0 : e.fields) || {}).__type__) || void 0 === n ? void 0 : n.stringValue); -} - -/** - * Creates a new ServerTimestamp proto value (using the internal format). - */ -/** - * Returns the value of the field before this ServerTimestamp was set. - * - * Preserving the previous values allows the user to display the last resoled - * value until the backend responds with the timestamp. - */ -function bt(t) { - const e = t.mapValue.fields.__previous_value__; - return Rt(e) ? bt(e) : e; -} - -/** - * Returns the local time at which this timestamp was first set. - */ function Pt(t) { - const e = Tt(t.mapValue.fields.__local_write_time__.timestampValue); - return new ut(e.seconds, e.nanos); -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ class Vt { - /** - * Constructs a DatabaseInfo using the provided host, databaseId and - * persistenceKey. - * - * @param databaseId - The database to use. - * @param appId - The Firebase App Id. - * @param persistenceKey - A unique identifier for this Firestore's local - * storage (used in conjunction with the databaseId). - * @param host - The Firestore backend host to connect to. - * @param ssl - Whether to use SSL when connecting. - * @param forceLongPolling - Whether to use the forceLongPolling option - * when using WebChannel as the network transport. - * @param autoDetectLongPolling - Whether to use the detectBufferingProxy - * option when using WebChannel as the network transport. - * @param useFetchStreams Whether to use the Fetch API instead of - * XMLHTTPRequest - */ - constructor(t, e, n, s, i, r, o, a) { - this.databaseId = t, this.appId = e, this.persistenceKey = n, this.host = s, this.ssl = i, - this.forceLongPolling = r, this.autoDetectLongPolling = o, this.useFetchStreams = a; - } -} - -/** The default database name for a project. */ -/** - * Represents the database ID a Firestore client is associated with. - * @internal - */ -class vt { - constructor(t, e) { - this.projectId = t, this.database = e || "(default)"; - } - static empty() { - return new vt("", ""); - } - get isDefaultDatabase() { - return "(default)" === this.database; - } - isEqual(t) { - return t instanceof vt && t.projectId === this.projectId && t.database === this.database; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** Sentinel value that sorts before any Mutation Batch ID. */ -/** - * Returns whether a variable is either undefined or null. - */ -function St(t) { - return null == t; -} - -/** Returns whether the value represents -0. */ function Dt(t) { - // Detect if the value is -0.0. Based on polyfill from - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is - return 0 === t && 1 / t == -1 / 0; -} - -/** - * Returns whether a value is an integer and in the safe integer range - * @param value - The value to test for being an integer and in the safe range - */ function Ct(t) { - return "number" == typeof t && Number.isInteger(t) && !Dt(t) && t <= Number.MAX_SAFE_INTEGER && t >= Number.MIN_SAFE_INTEGER; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @internal - */ class xt { - constructor(t) { - this.path = t; - } - static fromPath(t) { - return new xt(_t.fromString(t)); - } - static fromName(t) { - return new xt(_t.fromString(t).popFirst(5)); - } - static empty() { - return new xt(_t.emptyPath()); - } - get collectionGroup() { - return this.path.popLast().lastSegment(); - } - /** Returns true if the document is in the specified collectionId. */ hasCollectionId(t) { - return this.path.length >= 2 && this.path.get(this.path.length - 2) === t; - } - /** Returns the collection group (i.e. the name of the parent collection) for this key. */ getCollectionGroup() { - return this.path.get(this.path.length - 2); - } - /** Returns the fully qualified path to the parent collection. */ getCollectionPath() { - return this.path.popLast(); - } - isEqual(t) { - return null !== t && 0 === _t.comparator(this.path, t.path); - } - toString() { - return this.path.toString(); - } - static comparator(t, e) { - return _t.comparator(t.path, e.path); - } - static isDocumentKey(t) { - return t.length % 2 == 0; - } - /** - * Creates and returns a new document key with the given segments. - * - * @param segments - The segments of the path to the document - * @returns A new instance of DocumentKey - */ static fromSegments(t) { - return new xt(new _t(t.slice())); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ const Nt = { - mapValue: { - fields: { - __type__: { - stringValue: "__max__" - } - } - } -}, kt = { - nullValue: "NULL_VALUE" -}; - -/** Extracts the backend's type order for the provided value. */ -function Mt(t) { - return "nullValue" in t ? 0 /* NullValue */ : "booleanValue" in t ? 1 /* BooleanValue */ : "integerValue" in t || "doubleValue" in t ? 2 /* NumberValue */ : "timestampValue" in t ? 3 /* TimestampValue */ : "stringValue" in t ? 5 /* StringValue */ : "bytesValue" in t ? 6 /* BlobValue */ : "referenceValue" in t ? 7 /* RefValue */ : "geoPointValue" in t ? 8 /* GeoPointValue */ : "arrayValue" in t ? 9 /* ArrayValue */ : "mapValue" in t ? Rt(t) ? 4 /* ServerTimestampValue */ : Ht(t) ? 9 /* ArrayValue */ : 10 /* ObjectValue */ : L(); -} - -/** Tests `left` and `right` for equality based on the backend semantics. */ function Ot(t, e) { - if (t === e) return !0; - const n = Mt(t); - if (n !== Mt(e)) return !1; - switch (n) { - case 0 /* NullValue */ : - case 9007199254740991 /* MaxValue */ : - return !0; - - case 1 /* BooleanValue */ : - return t.booleanValue === e.booleanValue; - - case 4 /* ServerTimestampValue */ : - return Pt(t).isEqual(Pt(e)); - - case 3 /* TimestampValue */ : - return function(t, e) { - if ("string" == typeof t.timestampValue && "string" == typeof e.timestampValue && t.timestampValue.length === e.timestampValue.length) - // Use string equality for ISO 8601 timestamps - return t.timestampValue === e.timestampValue; - const n = Tt(t.timestampValue), s = Tt(e.timestampValue); - return n.seconds === s.seconds && n.nanos === s.nanos; - }(t, e); - - case 5 /* StringValue */ : - return t.stringValue === e.stringValue; - - case 6 /* BlobValue */ : - return function(t, e) { - return At(t.bytesValue).isEqual(At(e.bytesValue)); - }(t, e); - - case 7 /* RefValue */ : - return t.referenceValue === e.referenceValue; - - case 8 /* GeoPointValue */ : - return function(t, e) { - return Et(t.geoPointValue.latitude) === Et(e.geoPointValue.latitude) && Et(t.geoPointValue.longitude) === Et(e.geoPointValue.longitude); - }(t, e); - - case 2 /* NumberValue */ : - return function(t, e) { - if ("integerValue" in t && "integerValue" in e) return Et(t.integerValue) === Et(e.integerValue); - if ("doubleValue" in t && "doubleValue" in e) { - const n = Et(t.doubleValue), s = Et(e.doubleValue); - return n === s ? Dt(n) === Dt(s) : isNaN(n) && isNaN(s); - } - return !1; - }(t, e); - - case 9 /* ArrayValue */ : - return ot(t.arrayValue.values || [], e.arrayValue.values || [], Ot); - - case 10 /* ObjectValue */ : - return function(t, e) { - const n = t.mapValue.fields || {}, s = e.mapValue.fields || {}; - if (ht(n) !== ht(s)) return !1; - for (const t in n) if (n.hasOwnProperty(t) && (void 0 === s[t] || !Ot(n[t], s[t]))) return !1; - return !0; - } - /** Returns true if the ArrayValue contains the specified element. */ (t, e); - - default: - return L(); - } -} - -function $t(t, e) { - return void 0 !== (t.values || []).find((t => Ot(t, e))); -} - -function Ft(t, e) { - if (t === e) return 0; - const n = Mt(t), s = Mt(e); - if (n !== s) return rt(n, s); - switch (n) { - case 0 /* NullValue */ : - case 9007199254740991 /* MaxValue */ : - return 0; - - case 1 /* BooleanValue */ : - return rt(t.booleanValue, e.booleanValue); - - case 2 /* NumberValue */ : - return function(t, e) { - const n = Et(t.integerValue || t.doubleValue), s = Et(e.integerValue || e.doubleValue); - return n < s ? -1 : n > s ? 1 : n === s ? 0 : - // one or both are NaN. - isNaN(n) ? isNaN(s) ? 0 : -1 : 1; - }(t, e); - - case 3 /* TimestampValue */ : - return Bt(t.timestampValue, e.timestampValue); - - case 4 /* ServerTimestampValue */ : - return Bt(Pt(t), Pt(e)); - - case 5 /* StringValue */ : - return rt(t.stringValue, e.stringValue); - - case 6 /* BlobValue */ : - return function(t, e) { - const n = At(t), s = At(e); - return n.compareTo(s); - }(t.bytesValue, e.bytesValue); - - case 7 /* RefValue */ : - return function(t, e) { - const n = t.split("/"), s = e.split("/"); - for (let t = 0; t < n.length && t < s.length; t++) { - const e = rt(n[t], s[t]); - if (0 !== e) return e; - } - return rt(n.length, s.length); - }(t.referenceValue, e.referenceValue); - - case 8 /* GeoPointValue */ : - return function(t, e) { - const n = rt(Et(t.latitude), Et(e.latitude)); - if (0 !== n) return n; - return rt(Et(t.longitude), Et(e.longitude)); - }(t.geoPointValue, e.geoPointValue); - - case 9 /* ArrayValue */ : - return function(t, e) { - const n = t.values || [], s = e.values || []; - for (let t = 0; t < n.length && t < s.length; ++t) { - const e = Ft(n[t], s[t]); - if (e) return e; - } - return rt(n.length, s.length); - }(t.arrayValue, e.arrayValue); - - case 10 /* ObjectValue */ : - return function(t, e) { - const n = t.fields || {}, s = Object.keys(n), i = e.fields || {}, r = Object.keys(i); - // Even though MapValues are likely sorted correctly based on their insertion - // order (e.g. when received from the backend), local modifications can bring - // elements out of order. We need to re-sort the elements to ensure that - // canonical IDs are independent of insertion order. - s.sort(), r.sort(); - for (let t = 0; t < s.length && t < r.length; ++t) { - const e = rt(s[t], r[t]); - if (0 !== e) return e; - const o = Ft(n[s[t]], i[r[t]]); - if (0 !== o) return o; - } - return rt(s.length, r.length); - } - /** - * Generates the canonical ID for the provided field value (as used in Target - * serialization). - */ (t.mapValue, e.mapValue); - - default: - throw L(); - } -} - -function Bt(t, e) { - if ("string" == typeof t && "string" == typeof e && t.length === e.length) return rt(t, e); - const n = Tt(t), s = Tt(e), i = rt(n.seconds, s.seconds); - return 0 !== i ? i : rt(n.nanos, s.nanos); -} - -function Lt(t) { - return qt(t); -} - -function qt(t) { - return "nullValue" in t ? "null" : "booleanValue" in t ? "" + t.booleanValue : "integerValue" in t ? "" + t.integerValue : "doubleValue" in t ? "" + t.doubleValue : "timestampValue" in t ? function(t) { - const e = Tt(t); - return `time(${e.seconds},${e.nanos})`; - }(t.timestampValue) : "stringValue" in t ? t.stringValue : "bytesValue" in t ? At(t.bytesValue).toBase64() : "referenceValue" in t ? (n = t.referenceValue, - xt.fromName(n).toString()) : "geoPointValue" in t ? `geo(${(e = t.geoPointValue).latitude},${e.longitude})` : "arrayValue" in t ? function(t) { - let e = "[", n = !0; - for (const s of t.values || []) n ? n = !1 : e += ",", e += qt(s); - return e + "]"; - } - /** Returns a reference value for the provided database and key. */ (t.arrayValue) : "mapValue" in t ? function(t) { - // Iteration order in JavaScript is not guaranteed. To ensure that we generate - // matching canonical IDs for identical maps, we need to sort the keys. - const e = Object.keys(t.fields || {}).sort(); - let n = "{", s = !0; - for (const i of e) s ? s = !1 : n += ",", n += `${i}:${qt(t.fields[i])}`; - return n + "}"; - }(t.mapValue) : L(); - var e, n; -} - -function Ut(t, e) { - return { - referenceValue: `projects/${t.projectId}/databases/${t.database}/documents/${e.path.canonicalString()}` - }; -} - -/** Returns true if `value` is an IntegerValue . */ function Kt(t) { - return !!t && "integerValue" in t; -} - -/** Returns true if `value` is a DoubleValue. */ -/** Returns true if `value` is an ArrayValue. */ -function Gt(t) { - return !!t && "arrayValue" in t; -} - -/** Returns true if `value` is a NullValue. */ function Qt(t) { - return !!t && "nullValue" in t; -} - -/** Returns true if `value` is NaN. */ function jt(t) { - return !!t && "doubleValue" in t && isNaN(Number(t.doubleValue)); -} - -/** Returns true if `value` is a MapValue. */ function Wt(t) { - return !!t && "mapValue" in t; -} - -/** Creates a deep copy of `source`. */ function zt(t) { - if (t.geoPointValue) return { - geoPointValue: Object.assign({}, t.geoPointValue) - }; - if (t.timestampValue && "object" == typeof t.timestampValue) return { - timestampValue: Object.assign({}, t.timestampValue) - }; - if (t.mapValue) { - const e = { - mapValue: { - fields: {} - } - }; - return lt(t.mapValue.fields, ((t, n) => e.mapValue.fields[t] = zt(n))), e; - } - if (t.arrayValue) { - const e = { - arrayValue: { - values: [] - } - }; - for (let n = 0; n < (t.arrayValue.values || []).length; ++n) e.arrayValue.values[n] = zt(t.arrayValue.values[n]); - return e; - } - return Object.assign({}, t); -} - -/** Returns true if the Value represents the canonical {@link #MAX_VALUE} . */ function Ht(t) { - return "__max__" === (((t.mapValue || {}).fields || {}).__type__ || {}).stringValue; -} - -/** Returns the lowest value for the given value type (inclusive). */ function Jt(t, e) { - return void 0 === t ? e : void 0 === e || Ft(t, e) > 0 ? t : e; -} - -function Yt(t, e) { - return void 0 === t ? e : void 0 === e || Ft(t, e) < 0 ? t : e; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * An ObjectValue represents a MapValue in the Firestore Proto and offers the - * ability to add and remove fields (via the ObjectValueBuilder). - */ class Xt { - constructor(t) { - this.value = t; - } - static empty() { - return new Xt({ - mapValue: {} - }); - } - /** - * Returns the value at the given path or null. - * - * @param path - the path to search - * @returns The value at the path or null if the path is not set. - */ field(t) { - if (t.isEmpty()) return this.value; - { - let e = this.value; - for (let n = 0; n < t.length - 1; ++n) if (e = (e.mapValue.fields || {})[t.get(n)], - !Wt(e)) return null; - return e = (e.mapValue.fields || {})[t.lastSegment()], e || null; - } - } - /** - * Sets the field to the provided value. - * - * @param path - The field path to set. - * @param value - The value to set. - */ set(t, e) { - this.getFieldsMap(t.popLast())[t.lastSegment()] = zt(e); - } - /** - * Sets the provided fields to the provided values. - * - * @param data - A map of fields to values (or null for deletes). - */ setAll(t) { - let e = mt.emptyPath(), n = {}, s = []; - t.forEach(((t, i) => { - if (!e.isImmediateParentOf(i)) { - // Insert the accumulated changes at this parent location - const t = this.getFieldsMap(e); - this.applyChanges(t, n, s), n = {}, s = [], e = i.popLast(); - } - t ? n[i.lastSegment()] = zt(t) : s.push(i.lastSegment()); - })); - const i = this.getFieldsMap(e); - this.applyChanges(i, n, s); - } - /** - * Removes the field at the specified path. If there is no field at the - * specified path, nothing is changed. - * - * @param path - The field path to remove. - */ delete(t) { - const e = this.field(t.popLast()); - Wt(e) && e.mapValue.fields && delete e.mapValue.fields[t.lastSegment()]; - } - isEqual(t) { - return Ot(this.value, t.value); - } - /** - * Returns the map that contains the leaf element of `path`. If the parent - * entry does not yet exist, or if it is not a map, a new map will be created. - */ getFieldsMap(t) { - let e = this.value; - e.mapValue.fields || (e.mapValue = { - fields: {} - }); - for (let n = 0; n < t.length; ++n) { - let s = e.mapValue.fields[t.get(n)]; - Wt(s) && s.mapValue.fields || (s = { - mapValue: { - fields: {} - } - }, e.mapValue.fields[t.get(n)] = s), e = s; - } - return e.mapValue.fields; - } - /** - * Modifies `fieldsMap` by adding, replacing or deleting the specified - * entries. - */ applyChanges(t, e, n) { - lt(e, ((e, n) => t[e] = n)); - for (const e of n) delete t[e]; - } - clone() { - return new Xt(zt(this.value)); - } -} - -/** - * Returns a FieldMask built from all fields in a MapValue. - */ function Zt(t) { - const e = []; - return lt(t.fields, ((t, n) => { - const s = new mt([ t ]); - if (Wt(n)) { - const t = Zt(n.mapValue).fields; - if (0 === t.length) - // Preserve the empty map by adding it to the FieldMask. - e.push(s); else - // For nested and non-empty ObjectValues, add the FieldPath of the - // leaf nodes. - for (const n of t) e.push(s.child(n)); - } else - // For nested and non-empty ObjectValues, add the FieldPath of the leaf - // nodes. - e.push(s); - })), new gt(e); -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Represents a document in Firestore with a key, version, data and whether it - * has local mutations applied to it. - * - * Documents can transition between states via `convertToFoundDocument()`, - * `convertToNoDocument()` and `convertToUnknownDocument()`. If a document does - * not transition to one of these states even after all mutations have been - * applied, `isValidDocument()` returns false and the document should be removed - * from all views. - */ class te { - constructor(t, e, n, s, i, r) { - this.key = t, this.documentType = e, this.version = n, this.readTime = s, this.data = i, - this.documentState = r; - } - /** - * Creates a document with no known version or data, but which can serve as - * base document for mutations. - */ static newInvalidDocument(t) { - return new te(t, 0 /* INVALID */ , ct.min(), ct.min(), Xt.empty(), 0 /* SYNCED */); - } - /** - * Creates a new document that is known to exist with the given data at the - * given version. - */ static newFoundDocument(t, e, n) { - return new te(t, 1 /* FOUND_DOCUMENT */ , e, ct.min(), n, 0 /* SYNCED */); - } - /** Creates a new document that is known to not exist at the given version. */ static newNoDocument(t, e) { - return new te(t, 2 /* NO_DOCUMENT */ , e, ct.min(), Xt.empty(), 0 /* SYNCED */); - } - /** - * Creates a new document that is known to exist at the given version but - * whose data is not known (e.g. a document that was updated without a known - * base document). - */ static newUnknownDocument(t, e) { - return new te(t, 3 /* UNKNOWN_DOCUMENT */ , e, ct.min(), Xt.empty(), 2 /* HAS_COMMITTED_MUTATIONS */); - } - /** - * Changes the document type to indicate that it exists and that its version - * and data are known. - */ convertToFoundDocument(t, e) { - return this.version = t, this.documentType = 1 /* FOUND_DOCUMENT */ , this.data = e, - this.documentState = 0 /* SYNCED */ , this; - } - /** - * Changes the document type to indicate that it doesn't exist at the given - * version. - */ convertToNoDocument(t) { - return this.version = t, this.documentType = 2 /* NO_DOCUMENT */ , this.data = Xt.empty(), - this.documentState = 0 /* SYNCED */ , this; - } - /** - * Changes the document type to indicate that it exists at a given version but - * that its data is not known (e.g. a document that was updated without a known - * base document). - */ convertToUnknownDocument(t) { - return this.version = t, this.documentType = 3 /* UNKNOWN_DOCUMENT */ , this.data = Xt.empty(), - this.documentState = 2 /* HAS_COMMITTED_MUTATIONS */ , this; - } - setHasCommittedMutations() { - return this.documentState = 2 /* HAS_COMMITTED_MUTATIONS */ , this; - } - setHasLocalMutations() { - return this.documentState = 1 /* HAS_LOCAL_MUTATIONS */ , this; - } - setReadTime(t) { - return this.readTime = t, this; - } - get hasLocalMutations() { - return 1 /* HAS_LOCAL_MUTATIONS */ === this.documentState; - } - get hasCommittedMutations() { - return 2 /* HAS_COMMITTED_MUTATIONS */ === this.documentState; - } - get hasPendingWrites() { - return this.hasLocalMutations || this.hasCommittedMutations; - } - isValidDocument() { - return 0 /* INVALID */ !== this.documentType; - } - isFoundDocument() { - return 1 /* FOUND_DOCUMENT */ === this.documentType; - } - isNoDocument() { - return 2 /* NO_DOCUMENT */ === this.documentType; - } - isUnknownDocument() { - return 3 /* UNKNOWN_DOCUMENT */ === this.documentType; - } - isEqual(t) { - return t instanceof te && this.key.isEqual(t.key) && this.version.isEqual(t.version) && this.documentType === t.documentType && this.documentState === t.documentState && this.data.isEqual(t.data); - } - mutableCopy() { - return new te(this.key, this.documentType, this.version, this.readTime, this.data.clone(), this.documentState); - } - toString() { - return `Document(${this.key}, ${this.version}, ${JSON.stringify(this.data.value)}, {documentType: ${this.documentType}}), {documentState: ${this.documentState}})`; - } -} - -/** - * Compares the value for field `field` in the provided documents. Throws if - * the field does not exist in both documents. - */ -/** - * An index definition for field indexes in Firestore. - * - * Every index is associated with a collection. The definition contains a list - * of fields and their index kind (which can be `ASCENDING`, `DESCENDING` or - * `CONTAINS` for ArrayContains/ArrayContainsAny queries). - * - * Unlike the backend, the SDK does not differentiate between collection or - * collection group-scoped indices. Every index can be used for both single - * collection and collection group queries. - */ -class ee { - constructor( - /** - * The index ID. Returns -1 if the index ID is not available (e.g. the index - * has not yet been persisted). - */ - t, - /** The collection ID this index applies to. */ - e, - /** The field segments for this index. */ - n, - /** Shows how up-to-date the index is for the current user. */ - s) { - this.indexId = t, this.collectionGroup = e, this.fields = n, this.indexState = s; - } -} - -/** An ID for an index that has not yet been added to persistence. */ -/** Returns the ArrayContains/ArrayContainsAny segment for this index. */ -function ne(t) { - return t.fields.find((t => 2 /* CONTAINS */ === t.kind)); -} - -/** Returns all directional (ascending/descending) segments for this index. */ function se(t) { - return t.fields.filter((t => 2 /* CONTAINS */ !== t.kind)); -} - -/** Returns a debug representation of the field index */ ee.UNKNOWN_ID = -1; - -/** An index component consisting of field path and index type. */ -class ie { - constructor( - /** The field path of the component. */ - t, - /** The fields sorting order. */ - e) { - this.fieldPath = t, this.kind = e; - } -} - -/** - * Stores the "high water mark" that indicates how updated the Index is for the - * current user. - */ class re { - constructor( - /** - * Indicates when the index was last updated (relative to other indexes). - */ - t, - /** The the latest indexed read time, document and batch id. */ - e) { - this.sequenceNumber = t, this.offset = e; - } - /** The state of an index that has not yet been backfilled. */ static empty() { - return new re(0, oe.min()); - } -} - -/** - * Stores the latest read time, document and batch ID that were processed for an - * index. - */ class oe { - constructor( - /** - * The latest read time version that has been indexed by Firestore for this - * field index. - */ - t, - /** - * The key of the last document that was indexed for this query. Use - * `DocumentKey.empty()` if no document has been indexed. - */ - e, - /* - * The largest mutation batch id that's been processed by Firestore. - */ - n) { - this.readTime = t, this.documentKey = e, this.largestBatchId = n; - } - /** The state of an index that has not yet been backfilled. */ static min() { - return new oe(ct.min(), xt.empty(), -1); - } -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -// Visible for testing -class ae { - constructor(t, e = null, n = [], s = [], i = null, r = null, o = null) { - this.path = t, this.collectionGroup = e, this.orderBy = n, this.filters = s, this.limit = i, - this.startAt = r, this.endAt = o, this.P = null; - } -} - -/** - * Initializes a Target with a path and optional additional query constraints. - * Path must currently be empty if this is a collection group query. - * - * NOTE: you should always construct `Target` from `Query.toTarget` instead of - * using this factory method, because `Query` provides an implicit `orderBy` - * property. - */ function ue(t, e = null, n = [], s = [], i = null, r = null, o = null) { - return new ae(t, e, n, s, i, r, o); -} - -function ce(t) { - const e = K(t); - if (null === e.P) { - let t = e.path.canonicalString(); - null !== e.collectionGroup && (t += "|cg:" + e.collectionGroup), t += "|f:", t += e.filters.map((t => { - return (e = t).field.canonicalString() + e.op.toString() + Lt(e.value); - var e; - })).join(","), t += "|ob:", t += e.orderBy.map((t => function(t) { - // TODO(b/29183165): Make this collision robust. - return t.field.canonicalString() + t.dir; - }(t))).join(","), St(e.limit) || (t += "|l:", t += e.limit), e.startAt && (t += "|lb:", - t += e.startAt.inclusive ? "b:" : "a:", t += e.startAt.position.map((t => Lt(t))).join(",")), - e.endAt && (t += "|ub:", t += e.endAt.inclusive ? "a:" : "b:", t += e.endAt.position.map((t => Lt(t))).join(",")), - e.P = t; - } - return e.P; -} - -function he(t) { - let e = t.path.canonicalString(); - return null !== t.collectionGroup && (e += " collectionGroup=" + t.collectionGroup), - t.filters.length > 0 && (e += `, filters: [${t.filters.map((t => { - return `${(e = t).field.canonicalString()} ${e.op} ${Lt(e.value)}`; - /** Returns a debug description for `filter`. */ - var e; - /** Filter that matches on key fields (i.e. '__name__'). */ })).join(", ")}]`), - St(t.limit) || (e += ", limit: " + t.limit), t.orderBy.length > 0 && (e += `, orderBy: [${t.orderBy.map((t => function(t) { - return `${t.field.canonicalString()} (${t.dir})`; - }(t))).join(", ")}]`), t.startAt && (e += ", startAt: ", e += t.startAt.inclusive ? "b:" : "a:", - e += t.startAt.position.map((t => Lt(t))).join(",")), t.endAt && (e += ", endAt: ", - e += t.endAt.inclusive ? "a:" : "b:", e += t.endAt.position.map((t => Lt(t))).join(",")), - `Target(${e})`; -} - -function le(t, e) { - if (t.limit !== e.limit) return !1; - if (t.orderBy.length !== e.orderBy.length) return !1; - for (let n = 0; n < t.orderBy.length; n++) if (!be(t.orderBy[n], e.orderBy[n])) return !1; - if (t.filters.length !== e.filters.length) return !1; - for (let i = 0; i < t.filters.length; i++) if (n = t.filters[i], s = e.filters[i], - n.op !== s.op || !n.field.isEqual(s.field) || !Ot(n.value, s.value)) return !1; - var n, s; - return t.collectionGroup === e.collectionGroup && (!!t.path.isEqual(e.path) && (!!Ve(t.startAt, e.startAt) && Ve(t.endAt, e.endAt))); -} - -function fe(t) { - return xt.isDocumentKey(t.path) && null === t.collectionGroup && 0 === t.filters.length; -} - -/** Returns the field filters that target the given field path. */ function de(t, e) { - return t.filters.filter((t => t instanceof _e && t.field.isEqual(e))); -} - -/** - * Returns the values that are used in ARRAY_CONTAINS or ARRAY_CONTAINS_ANY - * filters. Returns `null` if there are no such filters. - */ class _e extends class {} { - constructor(t, e, n) { - super(), this.field = t, this.op = e, this.value = n; - } - /** - * Creates a filter based on the provided arguments. - */ static create(t, e, n) { - return t.isKeyField() ? "in" /* IN */ === e || "not-in" /* NOT_IN */ === e ? this.V(t, e, n) : new we(t, e, n) : "array-contains" /* ARRAY_CONTAINS */ === e ? new pe(t, n) : "in" /* IN */ === e ? new Ie(t, n) : "not-in" /* NOT_IN */ === e ? new Te(t, n) : "array-contains-any" /* ARRAY_CONTAINS_ANY */ === e ? new Ee(t, n) : new _e(t, e, n); - } - static V(t, e, n) { - return "in" /* IN */ === e ? new me(t, n) : new ge(t, n); - } - matches(t) { - const e = t.data.field(this.field); - // Types do not have to match in NOT_EQUAL filters. - return "!=" /* NOT_EQUAL */ === this.op ? null !== e && this.v(Ft(e, this.value)) : null !== e && Mt(this.value) === Mt(e) && this.v(Ft(e, this.value)); - // Only compare types with matching backend order (such as double and int). - } - v(t) { - switch (this.op) { - case "<" /* LESS_THAN */ : - return t < 0; - - case "<=" /* LESS_THAN_OR_EQUAL */ : - return t <= 0; - - case "==" /* EQUAL */ : - return 0 === t; - - case "!=" /* NOT_EQUAL */ : - return 0 !== t; - - case ">" /* GREATER_THAN */ : - return t > 0; - - case ">=" /* GREATER_THAN_OR_EQUAL */ : - return t >= 0; - - default: - return L(); - } - } - S() { - return [ "<" /* LESS_THAN */ , "<=" /* LESS_THAN_OR_EQUAL */ , ">" /* GREATER_THAN */ , ">=" /* GREATER_THAN_OR_EQUAL */ , "!=" /* NOT_EQUAL */ , "not-in" /* NOT_IN */ ].indexOf(this.op) >= 0; - } -} - -class we extends _e { - constructor(t, e, n) { - super(t, e, n), this.key = xt.fromName(n.referenceValue); - } - matches(t) { - const e = xt.comparator(t.key, this.key); - return this.v(e); - } -} - -/** Filter that matches on key fields within an array. */ class me extends _e { - constructor(t, e) { - super(t, "in" /* IN */ , e), this.keys = ye("in" /* IN */ , e); - } - matches(t) { - return this.keys.some((e => e.isEqual(t.key))); - } -} - -/** Filter that matches on key fields not present within an array. */ class ge extends _e { - constructor(t, e) { - super(t, "not-in" /* NOT_IN */ , e), this.keys = ye("not-in" /* NOT_IN */ , e); - } - matches(t) { - return !this.keys.some((e => e.isEqual(t.key))); - } -} - -function ye(t, e) { - var n; - return ((null === (n = e.arrayValue) || void 0 === n ? void 0 : n.values) || []).map((t => xt.fromName(t.referenceValue))); -} - -/** A Filter that implements the array-contains operator. */ class pe extends _e { - constructor(t, e) { - super(t, "array-contains" /* ARRAY_CONTAINS */ , e); - } - matches(t) { - const e = t.data.field(this.field); - return Gt(e) && $t(e.arrayValue, this.value); - } -} - -/** A Filter that implements the IN operator. */ class Ie extends _e { - constructor(t, e) { - super(t, "in" /* IN */ , e); - } - matches(t) { - const e = t.data.field(this.field); - return null !== e && $t(this.value.arrayValue, e); - } -} - -/** A Filter that implements the not-in operator. */ class Te extends _e { - constructor(t, e) { - super(t, "not-in" /* NOT_IN */ , e); - } - matches(t) { - if ($t(this.value.arrayValue, { - nullValue: "NULL_VALUE" - })) return !1; - const e = t.data.field(this.field); - return null !== e && !$t(this.value.arrayValue, e); - } -} - -/** A Filter that implements the array-contains-any operator. */ class Ee extends _e { - constructor(t, e) { - super(t, "array-contains-any" /* ARRAY_CONTAINS_ANY */ , e); - } - matches(t) { - const e = t.data.field(this.field); - return !(!Gt(e) || !e.arrayValue.values) && e.arrayValue.values.some((t => $t(this.value.arrayValue, t))); - } -} - -/** - * Represents a bound of a query. - * - * The bound is specified with the given components representing a position and - * whether it's just before or just after the position (relative to whatever the - * query order is). - * - * The position represents a logical index position for a query. It's a prefix - * of values for the (potentially implicit) order by clauses of a query. - * - * Bound provides a function to determine whether a document comes before or - * after a bound. This is influenced by whether the position is just before or - * just after the provided values. - */ class Ae { - constructor(t, e) { - this.position = t, this.inclusive = e; - } -} - -/** - * An ordering on a field, in some Direction. Direction defaults to ASCENDING. - */ class Re { - constructor(t, e = "asc" /* ASCENDING */) { - this.field = t, this.dir = e; - } -} - -function be(t, e) { - return t.dir === e.dir && t.field.isEqual(e.field); -} - -function Pe(t, e, n) { - let s = 0; - for (let i = 0; i < t.position.length; i++) { - const r = e[i], o = t.position[i]; - if (r.field.isKeyField()) s = xt.comparator(xt.fromName(o.referenceValue), n.key); else { - s = Ft(o, n.data.field(r.field)); - } - if ("desc" /* DESCENDING */ === r.dir && (s *= -1), 0 !== s) break; - } - return s; -} - -/** - * Returns true if a document sorts after a bound using the provided sort - * order. - */ function Ve(t, e) { - if (null === t) return null === e; - if (null === e) return !1; - if (t.inclusive !== e.inclusive || t.position.length !== e.position.length) return !1; - for (let n = 0; n < t.position.length; n++) { - if (!Ot(t.position[n], e.position[n])) return !1; - } - return !0; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Query encapsulates all the query attributes we support in the SDK. It can - * be run against the LocalStore, as well as be converted to a `Target` to - * query the RemoteStore results. - * - * Visible for testing. - */ class ve { - /** - * Initializes a Query with a path and optional additional query constraints. - * Path must currently be empty if this is a collection group query. - */ - constructor(t, e = null, n = [], s = [], i = null, r = "F" /* First */ , o = null, a = null) { - this.path = t, this.collectionGroup = e, this.explicitOrderBy = n, this.filters = s, - this.limit = i, this.limitType = r, this.startAt = o, this.endAt = a, this.D = null, - // The corresponding `Target` of this `Query` instance. - this.C = null, this.startAt, this.endAt; - } -} - -/** Creates a new Query instance with the options provided. */ function Se(t, e, n, s, i, r, o, a) { - return new ve(t, e, n, s, i, r, o, a); -} - -/** Creates a new Query for a query that matches all documents at `path` */ function De(t) { - return new ve(t); -} - -/** - * Helper to convert a collection group query into a collection query at a - * specific path. This is used when executing collection group queries, since - * we have to split the query into a set of collection queries at multiple - * paths. - */ function Ce(t) { - return !St(t.limit) && "F" /* First */ === t.limitType; -} - -function xe(t) { - return !St(t.limit) && "L" /* Last */ === t.limitType; -} - -function Ne(t) { - return t.explicitOrderBy.length > 0 ? t.explicitOrderBy[0].field : null; -} - -function ke(t) { - for (const e of t.filters) if (e.S()) return e.field; - return null; -} - -/** - * Checks if any of the provided Operators are included in the query and - * returns the first one that is, or null if none are. - */ -/** - * Returns whether the query matches a collection group rather than a specific - * collection. - */ -function Me(t) { - return null !== t.collectionGroup; -} - -/** - * Returns the implicit order by constraint that is used to execute the Query, - * which can be different from the order by constraints the user provided (e.g. - * the SDK and backend always orders by `__name__`). - */ function Oe(t) { - const e = K(t); - if (null === e.D) { - e.D = []; - const t = ke(e), n = Ne(e); - if (null !== t && null === n) - // In order to implicitly add key ordering, we must also add the - // inequality filter field for it to be a valid query. - // Note that the default inequality field and key ordering is ascending. - t.isKeyField() || e.D.push(new Re(t)), e.D.push(new Re(mt.keyField(), "asc" /* ASCENDING */)); else { - let t = !1; - for (const n of e.explicitOrderBy) e.D.push(n), n.field.isKeyField() && (t = !0); - if (!t) { - // The order of the implicit key ordering always matches the last - // explicit order by - const t = e.explicitOrderBy.length > 0 ? e.explicitOrderBy[e.explicitOrderBy.length - 1].dir : "asc" /* ASCENDING */; - e.D.push(new Re(mt.keyField(), t)); - } - } - } - return e.D; -} - -/** - * Converts this `Query` instance to it's corresponding `Target` representation. - */ function $e(t) { - const e = K(t); - if (!e.C) if ("F" /* First */ === e.limitType) e.C = ue(e.path, e.collectionGroup, Oe(e), e.filters, e.limit, e.startAt, e.endAt); else { - // Flip the orderBy directions since we want the last results - const t = []; - for (const n of Oe(e)) { - const e = "desc" /* DESCENDING */ === n.dir ? "asc" /* ASCENDING */ : "desc" /* DESCENDING */; - t.push(new Re(n.field, e)); - } - // We need to swap the cursors to match the now-flipped query ordering. - const n = e.endAt ? new Ae(e.endAt.position, !e.endAt.inclusive) : null, s = e.startAt ? new Ae(e.startAt.position, !e.startAt.inclusive) : null; - // Now return as a LimitType.First query. - e.C = ue(e.path, e.collectionGroup, t, e.filters, e.limit, n, s); - } - return e.C; -} - -function Fe(t, e, n) { - return new ve(t.path, t.collectionGroup, t.explicitOrderBy.slice(), t.filters.slice(), e, n, t.startAt, t.endAt); -} - -function Be(t, e) { - return le($e(t), $e(e)) && t.limitType === e.limitType; -} - -// TODO(b/29183165): This is used to get a unique string from a query to, for -// example, use as a dictionary key, but the implementation is subject to -// collisions. Make it collision-free. -function Le(t) { - return `${ce($e(t))}|lt:${t.limitType}`; -} - -function qe(t) { - return `Query(target=${he($e(t))}; limitType=${t.limitType})`; -} - -/** Returns whether `doc` matches the constraints of `query`. */ function Ue(t, e) { - return e.isFoundDocument() && function(t, e) { - const n = e.key.path; - return null !== t.collectionGroup ? e.key.hasCollectionId(t.collectionGroup) && t.path.isPrefixOf(n) : xt.isDocumentKey(t.path) ? t.path.isEqual(n) : t.path.isImmediateParentOf(n); - } - /** - * A document must have a value for every ordering clause in order to show up - * in the results. - */ (t, e) && function(t, e) { - for (const n of t.explicitOrderBy) - // order by key always matches - if (!n.field.isKeyField() && null === e.data.field(n.field)) return !1; - return !0; - }(t, e) && function(t, e) { - for (const n of t.filters) if (!n.matches(e)) return !1; - return !0; - } - /** Makes sure a document is within the bounds, if provided. */ (t, e) && function(t, e) { - if (t.startAt && ! - /** - * Returns true if a document sorts before a bound using the provided sort - * order. - */ - function(t, e, n) { - const s = Pe(t, e, n); - return t.inclusive ? s <= 0 : s < 0; - }(t.startAt, Oe(t), e)) return !1; - if (t.endAt && !function(t, e, n) { - const s = Pe(t, e, n); - return t.inclusive ? s >= 0 : s > 0; - }(t.endAt, Oe(t), e)) return !1; - return !0; - } - /** - * Returns a new comparator function that can be used to compare two documents - * based on the Query's ordering constraint. - */ (t, e); -} - -function Ke(t) { - return (e, n) => { - let s = !1; - for (const i of Oe(t)) { - const t = Ge(i, e, n); - if (0 !== t) return t; - s = s || i.field.isKeyField(); - } - return 0; - }; -} - -function Ge(t, e, n) { - const s = t.field.isKeyField() ? xt.comparator(e.key, n.key) : function(t, e, n) { - const s = e.data.field(t), i = n.data.field(t); - return null !== s && null !== i ? Ft(s, i) : L(); - } - /** - * @license - * Copyright 2021 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * The initial mutation batch id for each index. Gets updated during index - * backfill. - */ (t.field, e, n); - switch (t.dir) { - case "asc" /* ASCENDING */ : - return s; - - case "desc" /* DESCENDING */ : - return -1 * s; - - default: - return L(); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Returns an DoubleValue for `value` that is encoded based the serializer's - * `useProto3Json` setting. - */ function Qe(t, e) { - if (t.N) { - if (isNaN(e)) return { - doubleValue: "NaN" - }; - if (e === 1 / 0) return { - doubleValue: "Infinity" - }; - if (e === -1 / 0) return { - doubleValue: "-Infinity" - }; - } - return { - doubleValue: Dt(e) ? "-0" : e - }; -} - -/** - * Returns an IntegerValue for `value`. - */ function je(t) { - return { - integerValue: "" + t - }; -} - -/** - * Returns a value for a number that's appropriate to put into a proto. - * The return value is an IntegerValue if it can safely represent the value, - * otherwise a DoubleValue is returned. - */ function We(t, e) { - return Ct(e) ? je(e) : Qe(t, e); -} - -/** - * @license - * Copyright 2018 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** Used to represent a field transform on a mutation. */ class ze { - constructor() { - // Make sure that the structural type of `TransformOperation` is unique. - // See https://github.com/microsoft/TypeScript/issues/5451 - this._ = void 0; - } -} - -/** - * Computes the local transform result against the provided `previousValue`, - * optionally using the provided localWriteTime. - */ function He(t, e, n) { - return t instanceof Xe ? function(t, e) { - const n = { - fields: { - __type__: { - stringValue: "server_timestamp" - }, - __local_write_time__: { - timestampValue: { - seconds: t.seconds, - nanos: t.nanoseconds - } - } - } - }; - return e && (n.fields.__previous_value__ = e), { - mapValue: n - }; - }(n, e) : t instanceof Ze ? tn(t, e) : t instanceof en ? nn(t, e) : function(t, e) { - // PORTING NOTE: Since JavaScript's integer arithmetic is limited to 53 bit - // precision and resolves overflows by reducing precision, we do not - // manually cap overflows at 2^63. - const n = Ye(t, e), s = rn(n) + rn(t.k); - return Kt(n) && Kt(t.k) ? je(s) : Qe(t.M, s); - }(t, e); -} - -/** - * Computes a final transform result after the transform has been acknowledged - * by the server, potentially using the server-provided transformResult. - */ function Je(t, e, n) { - // The server just sends null as the transform result for array operations, - // so we have to calculate a result the same as we do for local - // applications. - return t instanceof Ze ? tn(t, e) : t instanceof en ? nn(t, e) : n; -} - -/** - * If this transform operation is not idempotent, returns the base value to - * persist for this transform. If a base value is returned, the transform - * operation is always applied to this base value, even if document has - * already been updated. - * - * Base values provide consistent behavior for non-idempotent transforms and - * allow us to return the same latency-compensated value even if the backend - * has already applied the transform operation. The base value is null for - * idempotent transforms, as they can be re-played even if the backend has - * already applied them. - * - * @returns a base value to store along with the mutation, or null for - * idempotent transforms. - */ function Ye(t, e) { - return t instanceof sn ? Kt(n = e) || function(t) { - return !!t && "doubleValue" in t; - } - /** Returns true if `value` is either an IntegerValue or a DoubleValue. */ (n) ? e : { - integerValue: 0 - } : null; - var n; -} - -/** Transforms a value into a server-generated timestamp. */ -class Xe extends ze {} - -/** Transforms an array value via a union operation. */ class Ze extends ze { - constructor(t) { - super(), this.elements = t; - } -} - -function tn(t, e) { - const n = on(e); - for (const e of t.elements) n.some((t => Ot(t, e))) || n.push(e); - return { - arrayValue: { - values: n - } - }; -} - -/** Transforms an array value via a remove operation. */ class en extends ze { - constructor(t) { - super(), this.elements = t; - } -} - -function nn(t, e) { - let n = on(e); - for (const e of t.elements) n = n.filter((t => !Ot(t, e))); - return { - arrayValue: { - values: n - } - }; -} - -/** - * Implements the backend semantics for locally computed NUMERIC_ADD (increment) - * transforms. Converts all field values to integers or doubles, but unlike the - * backend does not cap integer values at 2^63. Instead, JavaScript number - * arithmetic is used and precision loss can occur for values greater than 2^53. - */ class sn extends ze { - constructor(t, e) { - super(), this.M = t, this.k = e; - } -} - -function rn(t) { - return Et(t.integerValue || t.doubleValue); -} - -function on(t) { - return Gt(t) && t.arrayValue.values ? t.arrayValue.values.slice() : []; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** A field path and the TransformOperation to perform upon it. */ class an { - constructor(t, e) { - this.field = t, this.transform = e; - } -} - -function un(t, e) { - return t.field.isEqual(e.field) && function(t, e) { - return t instanceof Ze && e instanceof Ze || t instanceof en && e instanceof en ? ot(t.elements, e.elements, Ot) : t instanceof sn && e instanceof sn ? Ot(t.k, e.k) : t instanceof Xe && e instanceof Xe; - }(t.transform, e.transform); -} - -/** The result of successfully applying a mutation to the backend. */ -class cn { - constructor( - /** - * The version at which the mutation was committed: - * - * - For most operations, this is the updateTime in the WriteResult. - * - For deletes, the commitTime of the WriteResponse (because deletes are - * not stored and have no updateTime). - * - * Note that these versions can be different: No-op writes will not change - * the updateTime even though the commitTime advances. - */ - t, - /** - * The resulting fields returned from the backend after a mutation - * containing field transforms has been committed. Contains one FieldValue - * for each FieldTransform that was in the mutation. - * - * Will be empty if the mutation did not contain any field transforms. - */ - e) { - this.version = t, this.transformResults = e; - } -} - -/** - * Encodes a precondition for a mutation. This follows the model that the - * backend accepts with the special case of an explicit "empty" precondition - * (meaning no precondition). - */ class hn { - constructor(t, e) { - this.updateTime = t, this.exists = e; - } - /** Creates a new empty Precondition. */ static none() { - return new hn; - } - /** Creates a new Precondition with an exists flag. */ static exists(t) { - return new hn(void 0, t); - } - /** Creates a new Precondition based on a version a document exists at. */ static updateTime(t) { - return new hn(t); - } - /** Returns whether this Precondition is empty. */ get isNone() { - return void 0 === this.updateTime && void 0 === this.exists; - } - isEqual(t) { - return this.exists === t.exists && (this.updateTime ? !!t.updateTime && this.updateTime.isEqual(t.updateTime) : !t.updateTime); - } -} - -/** Returns true if the preconditions is valid for the given document. */ function ln(t, e) { - return void 0 !== t.updateTime ? e.isFoundDocument() && e.version.isEqual(t.updateTime) : void 0 === t.exists || t.exists === e.isFoundDocument(); -} - -/** - * A mutation describes a self-contained change to a document. Mutations can - * create, replace, delete, and update subsets of documents. - * - * Mutations not only act on the value of the document but also its version. - * - * For local mutations (mutations that haven't been committed yet), we preserve - * the existing version for Set and Patch mutations. For Delete mutations, we - * reset the version to 0. - * - * Here's the expected transition table. - * - * MUTATION APPLIED TO RESULTS IN - * - * SetMutation Document(v3) Document(v3) - * SetMutation NoDocument(v3) Document(v0) - * SetMutation InvalidDocument(v0) Document(v0) - * PatchMutation Document(v3) Document(v3) - * PatchMutation NoDocument(v3) NoDocument(v3) - * PatchMutation InvalidDocument(v0) UnknownDocument(v3) - * DeleteMutation Document(v3) NoDocument(v0) - * DeleteMutation NoDocument(v3) NoDocument(v0) - * DeleteMutation InvalidDocument(v0) NoDocument(v0) - * - * For acknowledged mutations, we use the updateTime of the WriteResponse as - * the resulting version for Set and Patch mutations. As deletes have no - * explicit update time, we use the commitTime of the WriteResponse for - * Delete mutations. - * - * If a mutation is acknowledged by the backend but fails the precondition check - * locally, we transition to an `UnknownDocument` and rely on Watch to send us - * the updated version. - * - * Field transforms are used only with Patch and Set Mutations. We use the - * `updateTransforms` message to store transforms, rather than the `transforms`s - * messages. - * - * ## Subclassing Notes - * - * Every type of mutation needs to implement its own applyToRemoteDocument() and - * applyToLocalView() to implement the actual behavior of applying the mutation - * to some source document (see `setMutationApplyToRemoteDocument()` for an - * example). - */ class fn {} - -/** - * Applies this mutation to the given document for the purposes of computing a - * new remote document. If the input document doesn't match the expected state - * (e.g. it is invalid or outdated), the document type may transition to - * unknown. - * - * @param mutation - The mutation to apply. - * @param document - The document to mutate. The input document can be an - * invalid document if the client has no knowledge of the pre-mutation state - * of the document. - * @param mutationResult - The result of applying the mutation from the backend. - */ function dn(t, e, n) { - t instanceof yn ? function(t, e, n) { - // Unlike setMutationApplyToLocalView, if we're applying a mutation to a - // remote document the server has accepted the mutation so the precondition - // must have held. - const s = t.value.clone(), i = Tn(t.fieldTransforms, e, n.transformResults); - s.setAll(i), e.convertToFoundDocument(n.version, s).setHasCommittedMutations(); - }(t, e, n) : t instanceof pn ? function(t, e, n) { - if (!ln(t.precondition, e)) - // Since the mutation was not rejected, we know that the precondition - // matched on the backend. We therefore must not have the expected version - // of the document in our cache and convert to an UnknownDocument with a - // known updateTime. - return void e.convertToUnknownDocument(n.version); - const s = Tn(t.fieldTransforms, e, n.transformResults), i = e.data; - i.setAll(In(t)), i.setAll(s), e.convertToFoundDocument(n.version, i).setHasCommittedMutations(); - }(t, e, n) : function(t, e, n) { - // Unlike applyToLocalView, if we're applying a mutation to a remote - // document the server has accepted the mutation so the precondition must - // have held. - e.convertToNoDocument(n.version).setHasCommittedMutations(); - }(0, e, n); -} - -/** - * Applies this mutation to the given document for the purposes of computing - * the new local view of a document. If the input document doesn't match the - * expected state, the document is not modified. - * - * @param mutation - The mutation to apply. - * @param document - The document to mutate. The input document can be an - * invalid document if the client has no knowledge of the pre-mutation state - * of the document. - * @param localWriteTime - A timestamp indicating the local write time of the - * batch this mutation is a part of. - */ function _n(t, e, n) { - t instanceof yn ? function(t, e, n) { - if (!ln(t.precondition, e)) - // The mutation failed to apply (e.g. a document ID created with add() - // caused a name collision). - return; - const s = t.value.clone(), i = En(t.fieldTransforms, n, e); - s.setAll(i), e.convertToFoundDocument(gn(e), s).setHasLocalMutations(); - } - /** - * A mutation that modifies fields of the document at the given key with the - * given values. The values are applied through a field mask: - * - * * When a field is in both the mask and the values, the corresponding field - * is updated. - * * When a field is in neither the mask nor the values, the corresponding - * field is unmodified. - * * When a field is in the mask but not in the values, the corresponding field - * is deleted. - * * When a field is not in the mask but is in the values, the values map is - * ignored. - */ (t, e, n) : t instanceof pn ? function(t, e, n) { - if (!ln(t.precondition, e)) return; - const s = En(t.fieldTransforms, n, e), i = e.data; - i.setAll(In(t)), i.setAll(s), e.convertToFoundDocument(gn(e), i).setHasLocalMutations(); - } - /** - * Returns a FieldPath/Value map with the content of the PatchMutation. - */ (t, e, n) : function(t, e) { - ln(t.precondition, e) && - // We don't call `setHasLocalMutations()` since we want to be backwards - // compatible with the existing SDK behavior. - e.convertToNoDocument(ct.min()); - } - /** - * A mutation that verifies the existence of the document at the given key with - * the provided precondition. - * - * The `verify` operation is only used in Transactions, and this class serves - * primarily to facilitate serialization into protos. - */ (t, e); -} - -/** - * If this mutation is not idempotent, returns the base value to persist with - * this mutation. If a base value is returned, the mutation is always applied - * to this base value, even if document has already been updated. - * - * The base value is a sparse object that consists of only the document - * fields for which this mutation contains a non-idempotent transformation - * (e.g. a numeric increment). The provided value guarantees consistent - * behavior for non-idempotent transforms and allow us to return the same - * latency-compensated value even if the backend has already applied the - * mutation. The base value is null for idempotent mutations, as they can be - * re-played even if the backend has already applied them. - * - * @returns a base value to store along with the mutation, or null for - * idempotent mutations. - */ function wn(t, e) { - let n = null; - for (const s of t.fieldTransforms) { - const t = e.data.field(s.field), i = Ye(s.transform, t || null); - null != i && (null == n && (n = Xt.empty()), n.set(s.field, i)); - } - return n || null; -} - -function mn(t, e) { - return t.type === e.type && (!!t.key.isEqual(e.key) && (!!t.precondition.isEqual(e.precondition) && (!!function(t, e) { - return void 0 === t && void 0 === e || !(!t || !e) && ot(t, e, ((t, e) => un(t, e))); - }(t.fieldTransforms, e.fieldTransforms) && (0 /* Set */ === t.type ? t.value.isEqual(e.value) : 1 /* Patch */ !== t.type || t.data.isEqual(e.data) && t.fieldMask.isEqual(e.fieldMask))))); -} - -/** - * Returns the version from the given document for use as the result of a - * mutation. Mutations are defined to return the version of the base document - * only if it is an existing document. Deleted and unknown documents have a - * post-mutation version of SnapshotVersion.min(). - */ function gn(t) { - return t.isFoundDocument() ? t.version : ct.min(); -} - -/** - * A mutation that creates or replaces the document at the given key with the - * object value contents. - */ class yn extends fn { - constructor(t, e, n, s = []) { - super(), this.key = t, this.value = e, this.precondition = n, this.fieldTransforms = s, - this.type = 0 /* Set */; - } -} - -class pn extends fn { - constructor(t, e, n, s, i = []) { - super(), this.key = t, this.data = e, this.fieldMask = n, this.precondition = s, - this.fieldTransforms = i, this.type = 1 /* Patch */; - } -} - -function In(t) { - const e = new Map; - return t.fieldMask.fields.forEach((n => { - if (!n.isEmpty()) { - const s = t.data.field(n); - e.set(n, s); - } - })), e; -} - -/** - * Creates a list of "transform results" (a transform result is a field value - * representing the result of applying a transform) for use after a mutation - * containing transforms has been acknowledged by the server. - * - * @param fieldTransforms - The field transforms to apply the result to. - * @param mutableDocument - The current state of the document after applying all - * previous mutations. - * @param serverTransformResults - The transform results received by the server. - * @returns The transform results list. - */ function Tn(t, e, n) { - const s = new Map; - q(t.length === n.length); - for (let i = 0; i < n.length; i++) { - const r = t[i], o = r.transform, a = e.data.field(r.field); - s.set(r.field, Je(o, a, n[i])); - } - return s; -} - -/** - * Creates a list of "transform results" (a transform result is a field value - * representing the result of applying a transform) for use when applying a - * transform locally. - * - * @param fieldTransforms - The field transforms to apply the result to. - * @param localWriteTime - The local time of the mutation (used to - * generate ServerTimestampValues). - * @param mutableDocument - The current state of the document after applying all - * previous mutations. - * @returns The transform results list. - */ function En(t, e, n) { - const s = new Map; - for (const i of t) { - const t = i.transform, r = n.data.field(i.field); - s.set(i.field, He(t, r, e)); - } - return s; -} - -/** A mutation that deletes the document at the given key. */ class An extends fn { - constructor(t, e) { - super(), this.key = t, this.precondition = e, this.type = 2 /* Delete */ , this.fieldTransforms = []; - } -} - -class Rn extends fn { - constructor(t, e) { - super(), this.key = t, this.precondition = e, this.type = 3 /* Verify */ , this.fieldTransforms = []; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ class bn { - // TODO(b/33078163): just use simplest form of existence filter for now - constructor(t) { - this.count = t; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Error Codes describing the different ways GRPC can fail. These are copied - * directly from GRPC's sources here: - * - * https://github.com/grpc/grpc/blob/bceec94ea4fc5f0085d81235d8e1c06798dc341a/include/grpc%2B%2B/impl/codegen/status_code_enum.h - * - * Important! The names of these identifiers matter because the string forms - * are used for reverse lookups from the webchannel stream. Do NOT change the - * names of these identifiers or change this into a const enum. - */ var Pn, Vn; - -/** - * Determines whether an error code represents a permanent error when received - * in response to a non-write operation. - * - * See isPermanentWriteError for classifying write errors. - */ -function vn(t) { - switch (t) { - default: - return L(); - - case G.CANCELLED: - case G.UNKNOWN: - case G.DEADLINE_EXCEEDED: - case G.RESOURCE_EXHAUSTED: - case G.INTERNAL: - case G.UNAVAILABLE: - // Unauthenticated means something went wrong with our token and we need - // to retry with new credentials which will happen automatically. - case G.UNAUTHENTICATED: - return !1; - - case G.INVALID_ARGUMENT: - case G.NOT_FOUND: - case G.ALREADY_EXISTS: - case G.PERMISSION_DENIED: - case G.FAILED_PRECONDITION: - // Aborted might be retried in some scenarios, but that is dependant on - // the context and should handled individually by the calling code. - // See https://cloud.google.com/apis/design/errors. - case G.ABORTED: - case G.OUT_OF_RANGE: - case G.UNIMPLEMENTED: - case G.DATA_LOSS: - return !0; - } -} - -/** - * Determines whether an error code represents a permanent error when received - * in response to a write operation. - * - * Write operations must be handled specially because as of b/119437764, ABORTED - * errors on the write stream should be retried too (even though ABORTED errors - * are not generally retryable). - * - * Note that during the initial handshake on the write stream an ABORTED error - * signals that we should discard our stream token (i.e. it is permanent). This - * means a handshake error should be classified with isPermanentError, above. - */ -/** - * Maps an error Code from GRPC status code number, like 0, 1, or 14. These - * are not the same as HTTP status codes. - * - * @returns The Code equivalent to the given GRPC status code. Fails if there - * is no match. - */ -function Sn(t) { - if (void 0 === t) - // This shouldn't normally happen, but in certain error cases (like trying - // to send invalid proto messages) we may get an error with no GRPC code. - return $("GRPC error has no .code"), G.UNKNOWN; - switch (t) { - case Pn.OK: - return G.OK; - - case Pn.CANCELLED: - return G.CANCELLED; - - case Pn.UNKNOWN: - return G.UNKNOWN; - - case Pn.DEADLINE_EXCEEDED: - return G.DEADLINE_EXCEEDED; - - case Pn.RESOURCE_EXHAUSTED: - return G.RESOURCE_EXHAUSTED; - - case Pn.INTERNAL: - return G.INTERNAL; - - case Pn.UNAVAILABLE: - return G.UNAVAILABLE; - - case Pn.UNAUTHENTICATED: - return G.UNAUTHENTICATED; - - case Pn.INVALID_ARGUMENT: - return G.INVALID_ARGUMENT; - - case Pn.NOT_FOUND: - return G.NOT_FOUND; - - case Pn.ALREADY_EXISTS: - return G.ALREADY_EXISTS; - - case Pn.PERMISSION_DENIED: - return G.PERMISSION_DENIED; - - case Pn.FAILED_PRECONDITION: - return G.FAILED_PRECONDITION; - - case Pn.ABORTED: - return G.ABORTED; - - case Pn.OUT_OF_RANGE: - return G.OUT_OF_RANGE; - - case Pn.UNIMPLEMENTED: - return G.UNIMPLEMENTED; - - case Pn.DATA_LOSS: - return G.DATA_LOSS; - - default: - return L(); - } -} - -/** - * Converts an HTTP response's error status to the equivalent error code. - * - * @param status - An HTTP error response status ("FAILED_PRECONDITION", - * "UNKNOWN", etc.) - * @returns The equivalent Code. Non-matching responses are mapped to - * Code.UNKNOWN. - */ (Vn = Pn || (Pn = {}))[Vn.OK = 0] = "OK", Vn[Vn.CANCELLED = 1] = "CANCELLED", -Vn[Vn.UNKNOWN = 2] = "UNKNOWN", Vn[Vn.INVALID_ARGUMENT = 3] = "INVALID_ARGUMENT", -Vn[Vn.DEADLINE_EXCEEDED = 4] = "DEADLINE_EXCEEDED", Vn[Vn.NOT_FOUND = 5] = "NOT_FOUND", -Vn[Vn.ALREADY_EXISTS = 6] = "ALREADY_EXISTS", Vn[Vn.PERMISSION_DENIED = 7] = "PERMISSION_DENIED", -Vn[Vn.UNAUTHENTICATED = 16] = "UNAUTHENTICATED", Vn[Vn.RESOURCE_EXHAUSTED = 8] = "RESOURCE_EXHAUSTED", -Vn[Vn.FAILED_PRECONDITION = 9] = "FAILED_PRECONDITION", Vn[Vn.ABORTED = 10] = "ABORTED", -Vn[Vn.OUT_OF_RANGE = 11] = "OUT_OF_RANGE", Vn[Vn.UNIMPLEMENTED = 12] = "UNIMPLEMENTED", -Vn[Vn.INTERNAL = 13] = "INTERNAL", Vn[Vn.UNAVAILABLE = 14] = "UNAVAILABLE", Vn[Vn.DATA_LOSS = 15] = "DATA_LOSS"; - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A map implementation that uses objects as keys. Objects must have an - * associated equals function and must be immutable. Entries in the map are - * stored together with the key being produced from the mapKeyFn. This map - * automatically handles collisions of keys. - */ -class Dn { - constructor(t, e) { - this.mapKeyFn = t, this.equalsFn = e, - /** - * The inner map for a key/value pair. Due to the possibility of collisions we - * keep a list of entries that we do a linear search through to find an actual - * match. Note that collisions should be rare, so we still expect near - * constant time lookups in practice. - */ - this.inner = {}, - /** The number of entries stored in the map */ - this.innerSize = 0; - } - /** Get a value for this key, or undefined if it does not exist. */ get(t) { - const e = this.mapKeyFn(t), n = this.inner[e]; - if (void 0 !== n) for (const [e, s] of n) if (this.equalsFn(e, t)) return s; - } - has(t) { - return void 0 !== this.get(t); - } - /** Put this key and value in the map. */ set(t, e) { - const n = this.mapKeyFn(t), s = this.inner[n]; - if (void 0 === s) return this.inner[n] = [ [ t, e ] ], void this.innerSize++; - for (let n = 0; n < s.length; n++) if (this.equalsFn(s[n][0], t)) - // This is updating an existing entry and does not increase `innerSize`. - return void (s[n] = [ t, e ]); - s.push([ t, e ]), this.innerSize++; - } - /** - * Remove this key from the map. Returns a boolean if anything was deleted. - */ delete(t) { - const e = this.mapKeyFn(t), n = this.inner[e]; - if (void 0 === n) return !1; - for (let s = 0; s < n.length; s++) if (this.equalsFn(n[s][0], t)) return 1 === n.length ? delete this.inner[e] : n.splice(s, 1), - this.innerSize--, !0; - return !1; - } - forEach(t) { - lt(this.inner, ((e, n) => { - for (const [e, s] of n) t(e, s); - })); - } - isEmpty() { - return ft(this.inner); - } - size() { - return this.innerSize; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -// An immutable sorted map implementation, based on a Left-leaning Red-Black -// tree. -class Cn { - constructor(t, e) { - this.comparator = t, this.root = e || Nn.EMPTY; - } - // Returns a copy of the map, with the specified key/value added or replaced. - insert(t, e) { - return new Cn(this.comparator, this.root.insert(t, e, this.comparator).copy(null, null, Nn.BLACK, null, null)); - } - // Returns a copy of the map, with the specified key removed. - remove(t) { - return new Cn(this.comparator, this.root.remove(t, this.comparator).copy(null, null, Nn.BLACK, null, null)); - } - // Returns the value of the node with the given key, or null. - get(t) { - let e = this.root; - for (;!e.isEmpty(); ) { - const n = this.comparator(t, e.key); - if (0 === n) return e.value; - n < 0 ? e = e.left : n > 0 && (e = e.right); - } - return null; - } - // Returns the index of the element in this sorted map, or -1 if it doesn't - // exist. - indexOf(t) { - // Number of nodes that were pruned when descending right - let e = 0, n = this.root; - for (;!n.isEmpty(); ) { - const s = this.comparator(t, n.key); - if (0 === s) return e + n.left.size; - s < 0 ? n = n.left : ( - // Count all nodes left of the node plus the node itself - e += n.left.size + 1, n = n.right); - } - // Node not found - return -1; - } - isEmpty() { - return this.root.isEmpty(); - } - // Returns the total number of nodes in the map. - get size() { - return this.root.size; - } - // Returns the minimum key in the map. - minKey() { - return this.root.minKey(); - } - // Returns the maximum key in the map. - maxKey() { - return this.root.maxKey(); - } - // Traverses the map in key order and calls the specified action function - // for each key/value pair. If action returns true, traversal is aborted. - // Returns the first truthy value returned by action, or the last falsey - // value returned by action. - inorderTraversal(t) { - return this.root.inorderTraversal(t); - } - forEach(t) { - this.inorderTraversal(((e, n) => (t(e, n), !1))); - } - toString() { - const t = []; - return this.inorderTraversal(((e, n) => (t.push(`${e}:${n}`), !1))), `{${t.join(", ")}}`; - } - // Traverses the map in reverse key order and calls the specified action - // function for each key/value pair. If action returns true, traversal is - // aborted. - // Returns the first truthy value returned by action, or the last falsey - // value returned by action. - reverseTraversal(t) { - return this.root.reverseTraversal(t); - } - // Returns an iterator over the SortedMap. - getIterator() { - return new xn(this.root, null, this.comparator, !1); - } - getIteratorFrom(t) { - return new xn(this.root, t, this.comparator, !1); - } - getReverseIterator() { - return new xn(this.root, null, this.comparator, !0); - } - getReverseIteratorFrom(t) { - return new xn(this.root, t, this.comparator, !0); - } -} - - // end SortedMap -// An iterator over an LLRBNode. -class xn { - constructor(t, e, n, s) { - this.isReverse = s, this.nodeStack = []; - let i = 1; - for (;!t.isEmpty(); ) if (i = e ? n(t.key, e) : 1, - // flip the comparison if we're going in reverse - e && s && (i *= -1), i < 0) - // This node is less than our start key. ignore it - t = this.isReverse ? t.left : t.right; else { - if (0 === i) { - // This node is exactly equal to our start key. Push it on the stack, - // but stop iterating; - this.nodeStack.push(t); - break; - } - // This node is greater than our start key, add it to the stack and move - // to the next one - this.nodeStack.push(t), t = this.isReverse ? t.right : t.left; - } - } - getNext() { - let t = this.nodeStack.pop(); - const e = { - key: t.key, - value: t.value - }; - if (this.isReverse) for (t = t.left; !t.isEmpty(); ) this.nodeStack.push(t), t = t.right; else for (t = t.right; !t.isEmpty(); ) this.nodeStack.push(t), - t = t.left; - return e; - } - hasNext() { - return this.nodeStack.length > 0; - } - peek() { - if (0 === this.nodeStack.length) return null; - const t = this.nodeStack[this.nodeStack.length - 1]; - return { - key: t.key, - value: t.value - }; - } -} - - // end SortedMapIterator -// Represents a node in a Left-leaning Red-Black tree. -class Nn { - constructor(t, e, n, s, i) { - this.key = t, this.value = e, this.color = null != n ? n : Nn.RED, this.left = null != s ? s : Nn.EMPTY, - this.right = null != i ? i : Nn.EMPTY, this.size = this.left.size + 1 + this.right.size; - } - // Returns a copy of the current node, optionally replacing pieces of it. - copy(t, e, n, s, i) { - return new Nn(null != t ? t : this.key, null != e ? e : this.value, null != n ? n : this.color, null != s ? s : this.left, null != i ? i : this.right); - } - isEmpty() { - return !1; - } - // Traverses the tree in key order and calls the specified action function - // for each node. If action returns true, traversal is aborted. - // Returns the first truthy value returned by action, or the last falsey - // value returned by action. - inorderTraversal(t) { - return this.left.inorderTraversal(t) || t(this.key, this.value) || this.right.inorderTraversal(t); - } - // Traverses the tree in reverse key order and calls the specified action - // function for each node. If action returns true, traversal is aborted. - // Returns the first truthy value returned by action, or the last falsey - // value returned by action. - reverseTraversal(t) { - return this.right.reverseTraversal(t) || t(this.key, this.value) || this.left.reverseTraversal(t); - } - // Returns the minimum node in the tree. - min() { - return this.left.isEmpty() ? this : this.left.min(); - } - // Returns the maximum key in the tree. - minKey() { - return this.min().key; - } - // Returns the maximum key in the tree. - maxKey() { - return this.right.isEmpty() ? this.key : this.right.maxKey(); - } - // Returns new tree, with the key/value added. - insert(t, e, n) { - let s = this; - const i = n(t, s.key); - return s = i < 0 ? s.copy(null, null, null, s.left.insert(t, e, n), null) : 0 === i ? s.copy(null, e, null, null, null) : s.copy(null, null, null, null, s.right.insert(t, e, n)), - s.fixUp(); - } - removeMin() { - if (this.left.isEmpty()) return Nn.EMPTY; - let t = this; - return t.left.isRed() || t.left.left.isRed() || (t = t.moveRedLeft()), t = t.copy(null, null, null, t.left.removeMin(), null), - t.fixUp(); - } - // Returns new tree, with the specified item removed. - remove(t, e) { - let n, s = this; - if (e(t, s.key) < 0) s.left.isEmpty() || s.left.isRed() || s.left.left.isRed() || (s = s.moveRedLeft()), - s = s.copy(null, null, null, s.left.remove(t, e), null); else { - if (s.left.isRed() && (s = s.rotateRight()), s.right.isEmpty() || s.right.isRed() || s.right.left.isRed() || (s = s.moveRedRight()), - 0 === e(t, s.key)) { - if (s.right.isEmpty()) return Nn.EMPTY; - n = s.right.min(), s = s.copy(n.key, n.value, null, null, s.right.removeMin()); - } - s = s.copy(null, null, null, null, s.right.remove(t, e)); - } - return s.fixUp(); - } - isRed() { - return this.color; - } - // Returns new tree after performing any needed rotations. - fixUp() { - let t = this; - return t.right.isRed() && !t.left.isRed() && (t = t.rotateLeft()), t.left.isRed() && t.left.left.isRed() && (t = t.rotateRight()), - t.left.isRed() && t.right.isRed() && (t = t.colorFlip()), t; - } - moveRedLeft() { - let t = this.colorFlip(); - return t.right.left.isRed() && (t = t.copy(null, null, null, null, t.right.rotateRight()), - t = t.rotateLeft(), t = t.colorFlip()), t; - } - moveRedRight() { - let t = this.colorFlip(); - return t.left.left.isRed() && (t = t.rotateRight(), t = t.colorFlip()), t; - } - rotateLeft() { - const t = this.copy(null, null, Nn.RED, null, this.right.left); - return this.right.copy(null, null, this.color, t, null); - } - rotateRight() { - const t = this.copy(null, null, Nn.RED, this.left.right, null); - return this.left.copy(null, null, this.color, null, t); - } - colorFlip() { - const t = this.left.copy(null, null, !this.left.color, null, null), e = this.right.copy(null, null, !this.right.color, null, null); - return this.copy(null, null, !this.color, t, e); - } - // For testing. - checkMaxDepth() { - const t = this.check(); - return Math.pow(2, t) <= this.size + 1; - } - // In a balanced RB tree, the black-depth (number of black nodes) from root to - // leaves is equal on both sides. This function verifies that or asserts. - check() { - if (this.isRed() && this.left.isRed()) throw L(); - if (this.right.isRed()) throw L(); - const t = this.left.check(); - if (t !== this.right.check()) throw L(); - return t + (this.isRed() ? 0 : 1); - } -} - - // end LLRBNode -// Empty node is shared between all LLRB trees. -// eslint-disable-next-line @typescript-eslint/no-explicit-any -Nn.EMPTY = null, Nn.RED = !0, Nn.BLACK = !1; - -// end LLRBEmptyNode -Nn.EMPTY = new -// Represents an empty node (a leaf node in the Red-Black Tree). -class { - constructor() { - this.size = 0; - } - get key() { - throw L(); - } - get value() { - throw L(); - } - get color() { - throw L(); - } - get left() { - throw L(); - } - get right() { - throw L(); - } - // Returns a copy of the current node. - copy(t, e, n, s, i) { - return this; - } - // Returns a copy of the tree, with the specified key/value added. - insert(t, e, n) { - return new Nn(t, e); - } - // Returns a copy of the tree, with the specified key removed. - remove(t, e) { - return this; - } - isEmpty() { - return !0; - } - inorderTraversal(t) { - return !1; - } - reverseTraversal(t) { - return !1; - } - minKey() { - return null; - } - maxKey() { - return null; - } - isRed() { - return !1; - } - // For testing. - checkMaxDepth() { - return !0; - } - check() { - return 0; - } -}; - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * SortedSet is an immutable (copy-on-write) collection that holds elements - * in order specified by the provided comparator. - * - * NOTE: if provided comparator returns 0 for two elements, we consider them to - * be equal! - */ -class kn { - constructor(t) { - this.comparator = t, this.data = new Cn(this.comparator); - } - has(t) { - return null !== this.data.get(t); - } - first() { - return this.data.minKey(); - } - last() { - return this.data.maxKey(); - } - get size() { - return this.data.size; - } - indexOf(t) { - return this.data.indexOf(t); - } - /** Iterates elements in order defined by "comparator" */ forEach(t) { - this.data.inorderTraversal(((e, n) => (t(e), !1))); - } - /** Iterates over `elem`s such that: range[0] <= elem < range[1]. */ forEachInRange(t, e) { - const n = this.data.getIteratorFrom(t[0]); - for (;n.hasNext(); ) { - const s = n.getNext(); - if (this.comparator(s.key, t[1]) >= 0) return; - e(s.key); - } - } - /** - * Iterates over `elem`s such that: start <= elem until false is returned. - */ forEachWhile(t, e) { - let n; - for (n = void 0 !== e ? this.data.getIteratorFrom(e) : this.data.getIterator(); n.hasNext(); ) { - if (!t(n.getNext().key)) return; - } - } - /** Finds the least element greater than or equal to `elem`. */ firstAfterOrEqual(t) { - const e = this.data.getIteratorFrom(t); - return e.hasNext() ? e.getNext().key : null; - } - getIterator() { - return new Mn(this.data.getIterator()); - } - getIteratorFrom(t) { - return new Mn(this.data.getIteratorFrom(t)); - } - /** Inserts or updates an element */ add(t) { - return this.copy(this.data.remove(t).insert(t, !0)); - } - /** Deletes an element */ delete(t) { - return this.has(t) ? this.copy(this.data.remove(t)) : this; - } - isEmpty() { - return this.data.isEmpty(); - } - unionWith(t) { - let e = this; - // Make sure `result` always refers to the larger one of the two sets. - return e.size < t.size && (e = t, t = this), t.forEach((t => { - e = e.add(t); - })), e; - } - isEqual(t) { - if (!(t instanceof kn)) return !1; - if (this.size !== t.size) return !1; - const e = this.data.getIterator(), n = t.data.getIterator(); - for (;e.hasNext(); ) { - const t = e.getNext().key, s = n.getNext().key; - if (0 !== this.comparator(t, s)) return !1; - } - return !0; - } - toArray() { - const t = []; - return this.forEach((e => { - t.push(e); - })), t; - } - toString() { - const t = []; - return this.forEach((e => t.push(e))), "SortedSet(" + t.toString() + ")"; - } - copy(t) { - const e = new kn(this.comparator); - return e.data = t, e; - } -} - -class Mn { - constructor(t) { - this.iter = t; - } - getNext() { - return this.iter.getNext().key; - } - hasNext() { - return this.iter.hasNext(); - } -} - -/** - * Compares two sorted sets for equality using their natural ordering. The - * method computes the intersection and invokes `onAdd` for every element that - * is in `after` but not `before`. `onRemove` is invoked for every element in - * `before` but missing from `after`. - * - * The method creates a copy of both `before` and `after` and runs in O(n log - * n), where n is the size of the two lists. - * - * @param before - The elements that exist in the original set. - * @param after - The elements to diff against the original set. - * @param comparator - The comparator for the elements in before and after. - * @param onAdd - A function to invoke for every element that is part of ` - * after` but not `before`. - * @param onRemove - A function to invoke for every element that is part of - * `before` but not `after`. - */ -/** - * Returns the next element from the iterator or `undefined` if none available. - */ -function On(t) { - return t.hasNext() ? t.getNext() : void 0; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ const $n = new Cn(xt.comparator); - -function Fn() { - return $n; -} - -const Bn = new Cn(xt.comparator); - -function Ln() { - return Bn; -} - -function qn() { - return new Dn((t => t.toString()), ((t, e) => t.isEqual(e))); -} - -const Un = new Cn(xt.comparator); - -const Kn = new kn(xt.comparator); - -function Gn(...t) { - let e = Kn; - for (const n of t) e = e.add(n); - return e; -} - -const Qn = new kn(rt); - -function jn() { - return Qn; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * An event from the RemoteStore. It is split into targetChanges (changes to the - * state or the set of documents in our watched targets) and documentUpdates - * (changes to the actual documents). - */ class Wn { - constructor( - /** - * The snapshot version this event brings us up to, or MIN if not set. - */ - t, - /** - * A map from target to changes to the target. See TargetChange. - */ - e, - /** - * A set of targets that is known to be inconsistent. Listens for these - * targets should be re-established without resume tokens. - */ - n, - /** - * A set of which documents have changed or been deleted, along with the - * doc's new values (if not deleted). - */ - s, - /** - * A set of which document updates are due only to limbo resolution targets. - */ - i) { - this.snapshotVersion = t, this.targetChanges = e, this.targetMismatches = n, this.documentUpdates = s, - this.resolvedLimboDocuments = i; - } - /** - * HACK: Views require RemoteEvents in order to determine whether the view is - * CURRENT, but secondary tabs don't receive remote events. So this method is - * used to create a synthesized RemoteEvent that can be used to apply a - * CURRENT status change to a View, for queries executed in a different tab. - */ - // PORTING NOTE: Multi-tab only - static createSynthesizedRemoteEventForCurrentChange(t, e) { - const n = new Map; - return n.set(t, zn.createSynthesizedTargetChangeForCurrentChange(t, e)), new Wn(ct.min(), n, jn(), Fn(), Gn()); - } -} - -/** - * A TargetChange specifies the set of changes for a specific target as part of - * a RemoteEvent. These changes track which documents are added, modified or - * removed, as well as the target's resume token and whether the target is - * marked CURRENT. - * The actual changes *to* documents are not part of the TargetChange since - * documents may be part of multiple targets. - */ class zn { - constructor( - /** - * An opaque, server-assigned token that allows watching a query to be resumed - * after disconnecting without retransmitting all the data that matches the - * query. The resume token essentially identifies a point in time from which - * the server should resume sending results. - */ - t, - /** - * The "current" (synced) status of this target. Note that "current" - * has special meaning in the RPC protocol that implies that a target is - * both up-to-date and consistent with the rest of the watch stream. - */ - e, - /** - * The set of documents that were newly assigned to this target as part of - * this remote event. - */ - n, - /** - * The set of documents that were already assigned to this target but received - * an update during this remote event. - */ - s, - /** - * The set of documents that were removed from this target as part of this - * remote event. - */ - i) { - this.resumeToken = t, this.current = e, this.addedDocuments = n, this.modifiedDocuments = s, - this.removedDocuments = i; - } - /** - * This method is used to create a synthesized TargetChanges that can be used to - * apply a CURRENT status change to a View (for queries executed in a different - * tab) or for new queries (to raise snapshots with correct CURRENT status). - */ static createSynthesizedTargetChangeForCurrentChange(t, e) { - return new zn(pt.EMPTY_BYTE_STRING, e, Gn(), Gn(), Gn()); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Represents a changed document and a list of target ids to which this change - * applies. - * - * If document has been deleted NoDocument will be provided. - */ class Hn { - constructor( - /** The new document applies to all of these targets. */ - t, - /** The new document is removed from all of these targets. */ - e, - /** The key of the document for this change. */ - n, - /** - * The new document or NoDocument if it was deleted. Is null if the - * document went out of view without the server sending a new document. - */ - s) { - this.O = t, this.removedTargetIds = e, this.key = n, this.$ = s; - } -} - -class Jn { - constructor(t, e) { - this.targetId = t, this.F = e; - } -} - -class Yn { - constructor( - /** What kind of change occurred to the watch target. */ - t, - /** The target IDs that were added/removed/set. */ - e, - /** - * An opaque, server-assigned token that allows watching a target to be - * resumed after disconnecting without retransmitting all the data that - * matches the target. The resume token essentially identifies a point in - * time from which the server should resume sending results. - */ - n = pt.EMPTY_BYTE_STRING - /** An RPC error indicating why the watch failed. */ , s = null) { - this.state = t, this.targetIds = e, this.resumeToken = n, this.cause = s; - } -} - -/** Tracks the internal state of a Watch target. */ class Xn { - constructor() { - /** - * The number of pending responses (adds or removes) that we are waiting on. - * We only consider targets active that have no pending responses. - */ - this.B = 0, - /** - * Keeps track of the document changes since the last raised snapshot. - * - * These changes are continuously updated as we receive document updates and - * always reflect the current set of changes against the last issued snapshot. - */ - this.L = es(), - /** See public getters for explanations of these fields. */ - this.q = pt.EMPTY_BYTE_STRING, this.U = !1, - /** - * Whether this target state should be included in the next snapshot. We - * initialize to true so that newly-added targets are included in the next - * RemoteEvent. - */ - this.K = !0; - } - /** - * Whether this target has been marked 'current'. - * - * 'Current' has special meaning in the RPC protocol: It implies that the - * Watch backend has sent us all changes up to the point at which the target - * was added and that the target is consistent with the rest of the watch - * stream. - */ get current() { - return this.U; - } - /** The last resume token sent to us for this target. */ get resumeToken() { - return this.q; - } - /** Whether this target has pending target adds or target removes. */ get G() { - return 0 !== this.B; - } - /** Whether we have modified any state that should trigger a snapshot. */ get j() { - return this.K; - } - /** - * Applies the resume token to the TargetChange, but only when it has a new - * value. Empty resumeTokens are discarded. - */ W(t) { - t.approximateByteSize() > 0 && (this.K = !0, this.q = t); - } - /** - * Creates a target change from the current set of changes. - * - * To reset the document changes after raising this snapshot, call - * `clearPendingChanges()`. - */ H() { - let t = Gn(), e = Gn(), n = Gn(); - return this.L.forEach(((s, i) => { - switch (i) { - case 0 /* Added */ : - t = t.add(s); - break; - - case 2 /* Modified */ : - e = e.add(s); - break; - - case 1 /* Removed */ : - n = n.add(s); - break; - - default: - L(); - } - })), new zn(this.q, this.U, t, e, n); - } - /** - * Resets the document changes and sets `hasPendingChanges` to false. - */ J() { - this.K = !1, this.L = es(); - } - Y(t, e) { - this.K = !0, this.L = this.L.insert(t, e); - } - X(t) { - this.K = !0, this.L = this.L.remove(t); - } - Z() { - this.B += 1; - } - tt() { - this.B -= 1; - } - et() { - this.K = !0, this.U = !0; - } -} - -/** - * A helper class to accumulate watch changes into a RemoteEvent. - */ -class Zn { - constructor(t) { - this.nt = t, - /** The internal state of all tracked targets. */ - this.st = new Map, - /** Keeps track of the documents to update since the last raised snapshot. */ - this.it = Fn(), - /** A mapping of document keys to their set of target IDs. */ - this.rt = ts(), - /** - * A list of targets with existence filter mismatches. These targets are - * known to be inconsistent and their listens needs to be re-established by - * RemoteStore. - */ - this.ot = new kn(rt); - } - /** - * Processes and adds the DocumentWatchChange to the current set of changes. - */ at(t) { - for (const e of t.O) t.$ && t.$.isFoundDocument() ? this.ut(e, t.$) : this.ct(e, t.key, t.$); - for (const e of t.removedTargetIds) this.ct(e, t.key, t.$); - } - /** Processes and adds the WatchTargetChange to the current set of changes. */ ht(t) { - this.forEachTarget(t, (e => { - const n = this.lt(e); - switch (t.state) { - case 0 /* NoChange */ : - this.ft(e) && n.W(t.resumeToken); - break; - - case 1 /* Added */ : - // We need to decrement the number of pending acks needed from watch - // for this targetId. - n.tt(), n.G || - // We have a freshly added target, so we need to reset any state - // that we had previously. This can happen e.g. when remove and add - // back a target for existence filter mismatches. - n.J(), n.W(t.resumeToken); - break; - - case 2 /* Removed */ : - // We need to keep track of removed targets to we can post-filter and - // remove any target changes. - // We need to decrement the number of pending acks needed from watch - // for this targetId. - n.tt(), n.G || this.removeTarget(e); - break; - - case 3 /* Current */ : - this.ft(e) && (n.et(), n.W(t.resumeToken)); - break; - - case 4 /* Reset */ : - this.ft(e) && ( - // Reset the target and synthesizes removes for all existing - // documents. The backend will re-add any documents that still - // match the target before it sends the next global snapshot. - this.dt(e), n.W(t.resumeToken)); - break; - - default: - L(); - } - })); - } - /** - * Iterates over all targetIds that the watch change applies to: either the - * targetIds explicitly listed in the change or the targetIds of all currently - * active targets. - */ forEachTarget(t, e) { - t.targetIds.length > 0 ? t.targetIds.forEach(e) : this.st.forEach(((t, n) => { - this.ft(n) && e(n); - })); - } - /** - * Handles existence filters and synthesizes deletes for filter mismatches. - * Targets that are invalidated by filter mismatches are added to - * `pendingTargetResets`. - */ _t(t) { - const e = t.targetId, n = t.F.count, s = this.wt(e); - if (s) { - const t = s.target; - if (fe(t)) if (0 === n) { - // The existence filter told us the document does not exist. We deduce - // that this document does not exist and apply a deleted document to - // our updates. Without applying this deleted document there might be - // another query that will raise this document as part of a snapshot - // until it is resolved, essentially exposing inconsistency between - // queries. - const n = new xt(t.path); - this.ct(e, n, te.newNoDocument(n, ct.min())); - } else q(1 === n); else { - this.gt(e) !== n && ( - // Existence filter mismatch: We reset the mapping and raise a new - // snapshot with `isFromCache:true`. - this.dt(e), this.ot = this.ot.add(e)); - } - } - } - /** - * Converts the currently accumulated state into a remote event at the - * provided snapshot version. Resets the accumulated changes before returning. - */ yt(t) { - const e = new Map; - this.st.forEach(((n, s) => { - const i = this.wt(s); - if (i) { - if (n.current && fe(i.target)) { - // Document queries for document that don't exist can produce an empty - // result set. To update our local cache, we synthesize a document - // delete if we have not previously received the document. This - // resolves the limbo state of the document, removing it from - // limboDocumentRefs. - // TODO(dimond): Ideally we would have an explicit lookup target - // instead resulting in an explicit delete message and we could - // remove this special logic. - const e = new xt(i.target.path); - null !== this.it.get(e) || this.It(s, e) || this.ct(s, e, te.newNoDocument(e, t)); - } - n.j && (e.set(s, n.H()), n.J()); - } - })); - let n = Gn(); - // We extract the set of limbo-only document updates as the GC logic - // special-cases documents that do not appear in the target cache. - - // TODO(gsoltis): Expand on this comment once GC is available in the JS - // client. - this.rt.forEach(((t, e) => { - let s = !0; - e.forEachWhile((t => { - const e = this.wt(t); - return !e || 2 /* LimboResolution */ === e.purpose || (s = !1, !1); - })), s && (n = n.add(t)); - })), this.it.forEach(((e, n) => n.setReadTime(t))); - const s = new Wn(t, e, this.ot, this.it, n); - return this.it = Fn(), this.rt = ts(), this.ot = new kn(rt), s; - } - /** - * Adds the provided document to the internal list of document updates and - * its document key to the given target's mapping. - */ - // Visible for testing. - ut(t, e) { - if (!this.ft(t)) return; - const n = this.It(t, e.key) ? 2 /* Modified */ : 0 /* Added */; - this.lt(t).Y(e.key, n), this.it = this.it.insert(e.key, e), this.rt = this.rt.insert(e.key, this.Tt(e.key).add(t)); - } - /** - * Removes the provided document from the target mapping. If the - * document no longer matches the target, but the document's state is still - * known (e.g. we know that the document was deleted or we received the change - * that caused the filter mismatch), the new document can be provided - * to update the remote document cache. - */ - // Visible for testing. - ct(t, e, n) { - if (!this.ft(t)) return; - const s = this.lt(t); - this.It(t, e) ? s.Y(e, 1 /* Removed */) : - // The document may have entered and left the target before we raised a - // snapshot, so we can just ignore the change. - s.X(e), this.rt = this.rt.insert(e, this.Tt(e).delete(t)), n && (this.it = this.it.insert(e, n)); - } - removeTarget(t) { - this.st.delete(t); - } - /** - * Returns the current count of documents in the target. This includes both - * the number of documents that the LocalStore considers to be part of the - * target as well as any accumulated changes. - */ gt(t) { - const e = this.lt(t).H(); - return this.nt.getRemoteKeysForTarget(t).size + e.addedDocuments.size - e.removedDocuments.size; - } - /** - * Increment the number of acks needed from watch before we can consider the - * server to be 'in-sync' with the client's active targets. - */ Z(t) { - this.lt(t).Z(); - } - lt(t) { - let e = this.st.get(t); - return e || (e = new Xn, this.st.set(t, e)), e; - } - Tt(t) { - let e = this.rt.get(t); - return e || (e = new kn(rt), this.rt = this.rt.insert(t, e)), e; - } - /** - * Verifies that the user is still interested in this target (by calling - * `getTargetDataForTarget()`) and that we are not waiting for pending ADDs - * from watch. - */ ft(t) { - const e = null !== this.wt(t); - return e || O("WatchChangeAggregator", "Detected inactive target", t), e; - } - /** - * Returns the TargetData for an active target (i.e. a target that the user - * is still interested in that has no outstanding target change requests). - */ wt(t) { - const e = this.st.get(t); - return e && e.G ? null : this.nt.Et(t); - } - /** - * Resets the state of a Watch target to its initial state (e.g. sets - * 'current' to false, clears the resume token and removes its target mapping - * from all documents). - */ dt(t) { - this.st.set(t, new Xn); - this.nt.getRemoteKeysForTarget(t).forEach((e => { - this.ct(t, e, /*updatedDocument=*/ null); - })); - } - /** - * Returns whether the LocalStore considers the document to be part of the - * specified target. - */ It(t, e) { - return this.nt.getRemoteKeysForTarget(t).has(e); - } -} - -function ts() { - return new Cn(xt.comparator); -} - -function es() { - return new Cn(xt.comparator); -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ const ns = (() => { - const t = { - asc: "ASCENDING", - desc: "DESCENDING" - }; - return t; -})(), ss = (() => { - const t = { - "<": "LESS_THAN", - "<=": "LESS_THAN_OR_EQUAL", - ">": "GREATER_THAN", - ">=": "GREATER_THAN_OR_EQUAL", - "==": "EQUAL", - "!=": "NOT_EQUAL", - "array-contains": "ARRAY_CONTAINS", - in: "IN", - "not-in": "NOT_IN", - "array-contains-any": "ARRAY_CONTAINS_ANY" - }; - return t; -})(); - -/** - * This class generates JsonObject values for the Datastore API suitable for - * sending to either GRPC stub methods or via the JSON/HTTP REST API. - * - * The serializer supports both Protobuf.js and Proto3 JSON formats. By - * setting `useProto3Json` to true, the serializer will use the Proto3 JSON - * format. - * - * For a description of the Proto3 JSON format check - * https://developers.google.com/protocol-buffers/docs/proto3#json - * - * TODO(klimt): We can remove the databaseId argument if we keep the full - * resource name in documents. - */ -class is { - constructor(t, e) { - this.databaseId = t, this.N = e; - } -} - -/** - * Returns a value for a Date that's appropriate to put into a proto. - */ -function rs(t, e) { - if (t.N) { - return `${new Date(1e3 * e.seconds).toISOString().replace(/\.\d*/, "").replace("Z", "")}.${("000000000" + e.nanoseconds).slice(-9)}Z`; - } - return { - seconds: "" + e.seconds, - nanos: e.nanoseconds - }; -} - -/** - * Returns a value for bytes that's appropriate to put in a proto. - * - * Visible for testing. - */ -function os(t, e) { - return t.N ? e.toBase64() : e.toUint8Array(); -} - -/** - * Returns a ByteString based on the proto string value. - */ function as(t, e) { - return rs(t, e.toTimestamp()); -} - -function us(t) { - return q(!!t), ct.fromTimestamp(function(t) { - const e = Tt(t); - return new ut(e.seconds, e.nanos); - }(t)); -} - -function cs(t, e) { - return function(t) { - return new _t([ "projects", t.projectId, "databases", t.database ]); - }(t).child("documents").child(e).canonicalString(); -} - -function hs(t) { - const e = _t.fromString(t); - return q(Os(e)), e; -} - -function ls(t, e) { - return cs(t.databaseId, e.path); -} - -function fs(t, e) { - const n = hs(e); - if (n.get(1) !== t.databaseId.projectId) throw new Q(G.INVALID_ARGUMENT, "Tried to deserialize key from different project: " + n.get(1) + " vs " + t.databaseId.projectId); - if (n.get(3) !== t.databaseId.database) throw new Q(G.INVALID_ARGUMENT, "Tried to deserialize key from different database: " + n.get(3) + " vs " + t.databaseId.database); - return new xt(ms(n)); -} - -function ds(t, e) { - return cs(t.databaseId, e); -} - -function _s(t) { - const e = hs(t); - // In v1beta1 queries for collections at the root did not have a trailing - // "/documents". In v1 all resource paths contain "/documents". Preserve the - // ability to read the v1beta1 form for compatibility with queries persisted - // in the local target cache. - return 4 === e.length ? _t.emptyPath() : ms(e); -} - -function ws(t) { - return new _t([ "projects", t.databaseId.projectId, "databases", t.databaseId.database ]).canonicalString(); -} - -function ms(t) { - return q(t.length > 4 && "documents" === t.get(4)), t.popFirst(5); -} - -/** Creates a Document proto from key and fields (but no create/update time) */ function gs(t, e, n) { - return { - name: ls(t, e), - fields: n.value.mapValue.fields - }; -} - -function ys(t, e, n) { - const s = fs(t, e.name), i = us(e.updateTime), r = new Xt({ - mapValue: { - fields: e.fields - } - }), o = te.newFoundDocument(s, i, r); - return n && o.setHasCommittedMutations(), n ? o.setHasCommittedMutations() : o; -} - -function ps(t, e) { - return "found" in e ? function(t, e) { - q(!!e.found), e.found.name, e.found.updateTime; - const n = fs(t, e.found.name), s = us(e.found.updateTime), i = new Xt({ - mapValue: { - fields: e.found.fields - } - }); - return te.newFoundDocument(n, s, i); - }(t, e) : "missing" in e ? function(t, e) { - q(!!e.missing), q(!!e.readTime); - const n = fs(t, e.missing), s = us(e.readTime); - return te.newNoDocument(n, s); - }(t, e) : L(); -} - -function Is(t, e) { - let n; - if ("targetChange" in e) { - e.targetChange; - // proto3 default value is unset in JSON (undefined), so use 'NO_CHANGE' - // if unset - const s = function(t) { - return "NO_CHANGE" === t ? 0 /* NoChange */ : "ADD" === t ? 1 /* Added */ : "REMOVE" === t ? 2 /* Removed */ : "CURRENT" === t ? 3 /* Current */ : "RESET" === t ? 4 /* Reset */ : L(); - }(e.targetChange.targetChangeType || "NO_CHANGE"), i = e.targetChange.targetIds || [], r = function(t, e) { - return t.N ? (q(void 0 === e || "string" == typeof e), pt.fromBase64String(e || "")) : (q(void 0 === e || e instanceof Uint8Array), - pt.fromUint8Array(e || new Uint8Array)); - }(t, e.targetChange.resumeToken), o = e.targetChange.cause, a = o && function(t) { - const e = void 0 === t.code ? G.UNKNOWN : Sn(t.code); - return new Q(e, t.message || ""); - } - /** - * Returns a value for a number (or null) that's appropriate to put into - * a google.protobuf.Int32Value proto. - * DO NOT USE THIS FOR ANYTHING ELSE. - * This method cheats. It's typed as returning "number" because that's what - * our generated proto interfaces say Int32Value must be. But GRPC actually - * expects a { value: } struct. - */ (o); - n = new Yn(s, i, r, a || null); - } else if ("documentChange" in e) { - e.documentChange; - const s = e.documentChange; - s.document, s.document.name, s.document.updateTime; - const i = fs(t, s.document.name), r = us(s.document.updateTime), o = new Xt({ - mapValue: { - fields: s.document.fields - } - }), a = te.newFoundDocument(i, r, o), u = s.targetIds || [], c = s.removedTargetIds || []; - n = new Hn(u, c, a.key, a); - } else if ("documentDelete" in e) { - e.documentDelete; - const s = e.documentDelete; - s.document; - const i = fs(t, s.document), r = s.readTime ? us(s.readTime) : ct.min(), o = te.newNoDocument(i, r), a = s.removedTargetIds || []; - n = new Hn([], a, o.key, o); - } else if ("documentRemove" in e) { - e.documentRemove; - const s = e.documentRemove; - s.document; - const i = fs(t, s.document), r = s.removedTargetIds || []; - n = new Hn([], r, i, null); - } else { - if (!("filter" in e)) return L(); - { - e.filter; - const t = e.filter; - t.targetId; - const s = t.count || 0, i = new bn(s), r = t.targetId; - n = new Jn(r, i); - } - } - return n; -} - -function Ts(t, e) { - let n; - if (e instanceof yn) n = { - update: gs(t, e.key, e.value) - }; else if (e instanceof An) n = { - delete: ls(t, e.key) - }; else if (e instanceof pn) n = { - update: gs(t, e.key, e.data), - updateMask: Ms(e.fieldMask) - }; else { - if (!(e instanceof Rn)) return L(); - n = { - verify: ls(t, e.key) - }; - } - return e.fieldTransforms.length > 0 && (n.updateTransforms = e.fieldTransforms.map((t => function(t, e) { - const n = e.transform; - if (n instanceof Xe) return { - fieldPath: e.field.canonicalString(), - setToServerValue: "REQUEST_TIME" - }; - if (n instanceof Ze) return { - fieldPath: e.field.canonicalString(), - appendMissingElements: { - values: n.elements - } - }; - if (n instanceof en) return { - fieldPath: e.field.canonicalString(), - removeAllFromArray: { - values: n.elements - } - }; - if (n instanceof sn) return { - fieldPath: e.field.canonicalString(), - increment: n.k - }; - throw L(); - }(0, t)))), e.precondition.isNone || (n.currentDocument = function(t, e) { - return void 0 !== e.updateTime ? { - updateTime: as(t, e.updateTime) - } : void 0 !== e.exists ? { - exists: e.exists - } : L(); - }(t, e.precondition)), n; -} - -function Es(t, e) { - const n = e.currentDocument ? function(t) { - return void 0 !== t.updateTime ? hn.updateTime(us(t.updateTime)) : void 0 !== t.exists ? hn.exists(t.exists) : hn.none(); - }(e.currentDocument) : hn.none(), s = e.updateTransforms ? e.updateTransforms.map((e => function(t, e) { - let n = null; - if ("setToServerValue" in e) q("REQUEST_TIME" === e.setToServerValue), n = new Xe; else if ("appendMissingElements" in e) { - const t = e.appendMissingElements.values || []; - n = new Ze(t); - } else if ("removeAllFromArray" in e) { - const t = e.removeAllFromArray.values || []; - n = new en(t); - } else "increment" in e ? n = new sn(t, e.increment) : L(); - const s = mt.fromServerFormat(e.fieldPath); - return new an(s, n); - }(t, e))) : []; - if (e.update) { - e.update.name; - const i = fs(t, e.update.name), r = new Xt({ - mapValue: { - fields: e.update.fields - } - }); - if (e.updateMask) { - const t = function(t) { - const e = t.fieldPaths || []; - return new gt(e.map((t => mt.fromServerFormat(t)))); - }(e.updateMask); - return new pn(i, r, t, n, s); - } - return new yn(i, r, n, s); - } - if (e.delete) { - const s = fs(t, e.delete); - return new An(s, n); - } - if (e.verify) { - const s = fs(t, e.verify); - return new Rn(s, n); - } - return L(); -} - -function As(t, e) { - return t && t.length > 0 ? (q(void 0 !== e), t.map((t => function(t, e) { - // NOTE: Deletes don't have an updateTime. - let n = t.updateTime ? us(t.updateTime) : us(e); - return n.isEqual(ct.min()) && ( - // The Firestore Emulator currently returns an update time of 0 for - // deletes of non-existing documents (rather than null). This breaks the - // test "get deleted doc while offline with source=cache" as NoDocuments - // with version 0 are filtered by IndexedDb's RemoteDocumentCache. - // TODO(#2149): Remove this when Emulator is fixed - n = us(e)), new cn(n, t.transformResults || []); - }(t, e)))) : []; -} - -function Rs(t, e) { - return { - documents: [ ds(t, e.path) ] - }; -} - -function bs(t, e) { - // Dissect the path into parent, collectionId, and optional key filter. - const n = { - structuredQuery: {} - }, s = e.path; - null !== e.collectionGroup ? (n.parent = ds(t, s), n.structuredQuery.from = [ { - collectionId: e.collectionGroup, - allDescendants: !0 - } ]) : (n.parent = ds(t, s.popLast()), n.structuredQuery.from = [ { - collectionId: s.lastSegment() - } ]); - const i = function(t) { - if (0 === t.length) return; - const e = t.map((t => - // visible for testing - function(t) { - if ("==" /* EQUAL */ === t.op) { - if (jt(t.value)) return { - unaryFilter: { - field: Cs(t.field), - op: "IS_NAN" - } - }; - if (Qt(t.value)) return { - unaryFilter: { - field: Cs(t.field), - op: "IS_NULL" - } - }; - } else if ("!=" /* NOT_EQUAL */ === t.op) { - if (jt(t.value)) return { - unaryFilter: { - field: Cs(t.field), - op: "IS_NOT_NAN" - } - }; - if (Qt(t.value)) return { - unaryFilter: { - field: Cs(t.field), - op: "IS_NOT_NULL" - } - }; - } - return { - fieldFilter: { - field: Cs(t.field), - op: Ds(t.op), - value: t.value - } - }; - }(t))); - if (1 === e.length) return e[0]; - return { - compositeFilter: { - op: "AND", - filters: e - } - }; - }(e.filters); - i && (n.structuredQuery.where = i); - const r = function(t) { - if (0 === t.length) return; - return t.map((t => - // visible for testing - function(t) { - return { - field: Cs(t.field), - direction: Ss(t.dir) - }; - }(t))); - }(e.orderBy); - r && (n.structuredQuery.orderBy = r); - const o = function(t, e) { - return t.N || St(e) ? e : { - value: e - }; - } - /** - * Returns a number (or null) from a google.protobuf.Int32Value proto. - */ (t, e.limit); - var a; - return null !== o && (n.structuredQuery.limit = o), e.startAt && (n.structuredQuery.startAt = { - before: (a = e.startAt).inclusive, - values: a.position - }), e.endAt && (n.structuredQuery.endAt = function(t) { - return { - before: !t.inclusive, - values: t.position - }; - }(e.endAt)), n; -} - -function Ps(t) { - let e = _s(t.parent); - const n = t.structuredQuery, s = n.from ? n.from.length : 0; - let i = null; - if (s > 0) { - q(1 === s); - const t = n.from[0]; - t.allDescendants ? i = t.collectionId : e = e.child(t.collectionId); - } - let r = []; - n.where && (r = vs(n.where)); - let o = []; - n.orderBy && (o = n.orderBy.map((t => function(t) { - return new Re(xs(t.field), - // visible for testing - function(t) { - switch (t) { - case "ASCENDING": - return "asc" /* ASCENDING */; - - case "DESCENDING": - return "desc" /* DESCENDING */; - - default: - return; - } - } - // visible for testing - (t.direction)); - }(t)))); - let a = null; - n.limit && (a = function(t) { - let e; - return e = "object" == typeof t ? t.value : t, St(e) ? null : e; - }(n.limit)); - let u = null; - n.startAt && (u = function(t) { - const e = !!t.before, n = t.values || []; - return new Ae(n, e); - }(n.startAt)); - let c = null; - return n.endAt && (c = function(t) { - const e = !t.before, n = t.values || []; - return new Ae(n, e); - } - // visible for testing - (n.endAt)), Se(e, i, o, r, a, "F" /* First */ , u, c); -} - -function Vs(t, e) { - const n = function(t, e) { - switch (e) { - case 0 /* Listen */ : - return null; - - case 1 /* ExistenceFilterMismatch */ : - return "existence-filter-mismatch"; - - case 2 /* LimboResolution */ : - return "limbo-document"; - - default: - return L(); - } - }(0, e.purpose); - return null == n ? null : { - "goog-listen-tags": n - }; -} - -function vs(t) { - return t ? void 0 !== t.unaryFilter ? [ ks(t) ] : void 0 !== t.fieldFilter ? [ Ns(t) ] : void 0 !== t.compositeFilter ? t.compositeFilter.filters.map((t => vs(t))).reduce(((t, e) => t.concat(e))) : L() : []; -} - -function Ss(t) { - return ns[t]; -} - -function Ds(t) { - return ss[t]; -} - -function Cs(t) { - return { - fieldPath: t.canonicalString() - }; -} - -function xs(t) { - return mt.fromServerFormat(t.fieldPath); -} - -function Ns(t) { - return _e.create(xs(t.fieldFilter.field), function(t) { - switch (t) { - case "EQUAL": - return "==" /* EQUAL */; - - case "NOT_EQUAL": - return "!=" /* NOT_EQUAL */; - - case "GREATER_THAN": - return ">" /* GREATER_THAN */; - - case "GREATER_THAN_OR_EQUAL": - return ">=" /* GREATER_THAN_OR_EQUAL */; - - case "LESS_THAN": - return "<" /* LESS_THAN */; - - case "LESS_THAN_OR_EQUAL": - return "<=" /* LESS_THAN_OR_EQUAL */; - - case "ARRAY_CONTAINS": - return "array-contains" /* ARRAY_CONTAINS */; - - case "IN": - return "in" /* IN */; - - case "NOT_IN": - return "not-in" /* NOT_IN */; - - case "ARRAY_CONTAINS_ANY": - return "array-contains-any" /* ARRAY_CONTAINS_ANY */; - - default: - return L(); - } - }(t.fieldFilter.op), t.fieldFilter.value); -} - -function ks(t) { - switch (t.unaryFilter.op) { - case "IS_NAN": - const e = xs(t.unaryFilter.field); - return _e.create(e, "==" /* EQUAL */ , { - doubleValue: NaN - }); - - case "IS_NULL": - const n = xs(t.unaryFilter.field); - return _e.create(n, "==" /* EQUAL */ , { - nullValue: "NULL_VALUE" - }); - - case "IS_NOT_NAN": - const s = xs(t.unaryFilter.field); - return _e.create(s, "!=" /* NOT_EQUAL */ , { - doubleValue: NaN - }); - - case "IS_NOT_NULL": - const i = xs(t.unaryFilter.field); - return _e.create(i, "!=" /* NOT_EQUAL */ , { - nullValue: "NULL_VALUE" - }); - - default: - return L(); - } -} - -function Ms(t) { - const e = []; - return t.fields.forEach((t => e.push(t.canonicalString()))), { - fieldPaths: e - }; -} - -function Os(t) { - // Resource names have at least 4 components (project ID, database ID) - return t.length >= 4 && "projects" === t.get(0) && "databases" === t.get(2); -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Encodes a resource path into a IndexedDb-compatible string form. - */ -function $s(t) { - let e = ""; - for (let n = 0; n < t.length; n++) e.length > 0 && (e = Bs(e)), e = Fs(t.get(n), e); - return Bs(e); -} - -/** Encodes a single segment of a resource path into the given result */ function Fs(t, e) { - let n = e; - const s = t.length; - for (let e = 0; e < s; e++) { - const s = t.charAt(e); - switch (s) { - case "\0": - n += ""; - break; - - case "": - n += ""; - break; - - default: - n += s; - } - } - return n; -} - -/** Encodes a path separator into the given result */ function Bs(t) { - return t + ""; -} - -/** - * Decodes the given IndexedDb-compatible string form of a resource path into - * a ResourcePath instance. Note that this method is not suitable for use with - * decoding resource names from the server; those are One Platform format - * strings. - */ function Ls(t) { - // Event the empty path must encode as a path of at least length 2. A path - // with exactly 2 must be the empty path. - const e = t.length; - if (q(e >= 2), 2 === e) return q("" === t.charAt(0) && "" === t.charAt(1)), _t.emptyPath(); - // Escape characters cannot exist past the second-to-last position in the - // source value. - const n = e - 2, s = []; - let i = ""; - for (let r = 0; r < e; ) { - // The last two characters of a valid encoded path must be a separator, so - // there must be an end to this segment. - const e = t.indexOf("", r); - (e < 0 || e > n) && L(); - switch (t.charAt(e + 1)) { - case "": - const n = t.substring(r, e); - let o; - 0 === i.length ? - // Avoid copying for the common case of a segment that excludes \0 - // and \001 - o = n : (i += n, o = i, i = ""), s.push(o); - break; - - case "": - i += t.substring(r, e), i += "\0"; - break; - - case "": - // The escape character can be used in the output to encode itself. - i += t.substring(r, e + 1); - break; - - default: - L(); - } - r = e + 2; - } - return new _t(s); -} - -/** - * @license - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Name of the IndexedDb object store. - * - * Note that the name 'owner' is chosen to ensure backwards compatibility with - * older clients that only supported single locked access to the persistence - * layer. - */ const qs = [ "userId", "batchId" ]; - -/** - * The key string used for the single object that exists in the - * DbPrimaryClient store. - */ -/** - * Creates a [userId, encodedPath] key for use in the DbDocumentMutations - * index to iterate over all at document mutations for a given path or lower. - */ -function Us(t, e) { - return [ t, $s(e) ]; -} - -/** - * Creates a full index key of [userId, encodedPath, batchId] for inserting - * and deleting into the DbDocumentMutations index. - */ function Ks(t, e, n) { - return [ t, $s(e), n ]; -} - -/** - * Because we store all the useful information for this store in the key, - * there is no useful information to store as the value. The raw (unencoded) - * path cannot be stored because IndexedDb doesn't store prototype - * information. - */ const Gs = {}, Qs = [ "parentPath", "readTime" ], js = [ "canonicalId", "targetId" ], Ws = [ "targetId", "path" ], zs = [ "path", "targetId" ], Hs = [ "collectionId", "parent" ], Js = [ "indexId", "uid" ], Ys = [ "uid", "sequenceNumber" ], Xs = [ "indexId", "uid", "arrayValue", "directionalValue", "documentKey" ], Zs = [ "indexId", "uid", "documentKey" ], ti = [ "userId", "collectionPath", "documentId" ], ei = [ "userId", "collectionPath", "largestBatchId" ], ni = [ "userId", "collectionGroup", "largestBatchId" ], si = [ ...[ ...[ ...[ ...[ "mutationQueues", "mutations", "documentMutations", "remoteDocuments", "targets", "owner", "targetGlobal", "targetDocuments" ], "clientMetadata" ], "remoteDocumentGlobal" ], "collectionParents" ], "bundles", "namedQueries" ], ii = [ ...si, "documentOverlays" ], ri = [ ...ii, "indexConfiguration", "indexState", "indexEntries" ]; - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const oi = "The current tab is not in the required state to perform this operation. It might be necessary to refresh the browser tab."; - -/** - * A base class representing a persistence transaction, encapsulating both the - * transaction's sequence numbers as well as a list of onCommitted listeners. - * - * When you call Persistence.runTransaction(), it will create a transaction and - * pass it to your callback. You then pass it to any method that operates - * on persistence. - */ class ai { - constructor() { - this.onCommittedListeners = []; - } - addOnCommittedListener(t) { - this.onCommittedListeners.push(t); - } - raiseOnCommittedEvent() { - this.onCommittedListeners.forEach((t => t())); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * PersistencePromise is essentially a re-implementation of Promise except - * it has a .next() method instead of .then() and .next() and .catch() callbacks - * are executed synchronously when a PersistencePromise resolves rather than - * asynchronously (Promise implementations use setImmediate() or similar). - * - * This is necessary to interoperate with IndexedDB which will automatically - * commit transactions if control is returned to the event loop without - * synchronously initiating another operation on the transaction. - * - * NOTE: .then() and .catch() only allow a single consumer, unlike normal - * Promises. - */ class ui { - constructor(t) { - // NOTE: next/catchCallback will always point to our own wrapper functions, - // not the user's raw next() or catch() callbacks. - this.nextCallback = null, this.catchCallback = null, - // When the operation resolves, we'll set result or error and mark isDone. - this.result = void 0, this.error = void 0, this.isDone = !1, - // Set to true when .then() or .catch() are called and prevents additional - // chaining. - this.callbackAttached = !1, t((t => { - this.isDone = !0, this.result = t, this.nextCallback && - // value should be defined unless T is Void, but we can't express - // that in the type system. - this.nextCallback(t); - }), (t => { - this.isDone = !0, this.error = t, this.catchCallback && this.catchCallback(t); - })); - } - catch(t) { - return this.next(void 0, t); - } - next(t, e) { - return this.callbackAttached && L(), this.callbackAttached = !0, this.isDone ? this.error ? this.wrapFailure(e, this.error) : this.wrapSuccess(t, this.result) : new ui(((n, s) => { - this.nextCallback = e => { - this.wrapSuccess(t, e).next(n, s); - }, this.catchCallback = t => { - this.wrapFailure(e, t).next(n, s); - }; - })); - } - toPromise() { - return new Promise(((t, e) => { - this.next(t, e); - })); - } - wrapUserFunction(t) { - try { - const e = t(); - return e instanceof ui ? e : ui.resolve(e); - } catch (t) { - return ui.reject(t); - } - } - wrapSuccess(t, e) { - return t ? this.wrapUserFunction((() => t(e))) : ui.resolve(e); - } - wrapFailure(t, e) { - return t ? this.wrapUserFunction((() => t(e))) : ui.reject(e); - } - static resolve(t) { - return new ui(((e, n) => { - e(t); - })); - } - static reject(t) { - return new ui(((e, n) => { - n(t); - })); - } - static waitFor( - // Accept all Promise types in waitFor(). - // eslint-disable-next-line @typescript-eslint/no-explicit-any - t) { - return new ui(((e, n) => { - let s = 0, i = 0, r = !1; - t.forEach((t => { - ++s, t.next((() => { - ++i, r && i === s && e(); - }), (t => n(t))); - })), r = !0, i === s && e(); - })); - } - /** - * Given an array of predicate functions that asynchronously evaluate to a - * boolean, implements a short-circuiting `or` between the results. Predicates - * will be evaluated until one of them returns `true`, then stop. The final - * result will be whether any of them returned `true`. - */ static or(t) { - let e = ui.resolve(!1); - for (const n of t) e = e.next((t => t ? ui.resolve(t) : n())); - return e; - } - static forEach(t, e) { - const n = []; - return t.forEach(((t, s) => { - n.push(e.call(this, t, s)); - })), this.waitFor(n); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -// References to `window` are guarded by SimpleDb.isAvailable() -/* eslint-disable no-restricted-globals */ -/** - * Wraps an IDBTransaction and exposes a store() method to get a handle to a - * specific object store. - */ -class ci { - constructor(t, e) { - this.action = t, this.transaction = e, this.aborted = !1, - /** - * A `Promise` that resolves with the result of the IndexedDb transaction. - */ - this.At = new j, this.transaction.oncomplete = () => { - this.At.resolve(); - }, this.transaction.onabort = () => { - e.error ? this.At.reject(new fi(t, e.error)) : this.At.resolve(); - }, this.transaction.onerror = e => { - const n = gi(e.target.error); - this.At.reject(new fi(t, n)); - }; - } - static open(t, e, n, s) { - try { - return new ci(e, t.transaction(s, n)); - } catch (t) { - throw new fi(e, t); - } - } - get Rt() { - return this.At.promise; - } - abort(t) { - t && this.At.reject(t), this.aborted || (O("SimpleDb", "Aborting transaction:", t ? t.message : "Client-initiated abort"), - this.aborted = !0, this.transaction.abort()); - } - bt() { - // If the browser supports V3 IndexedDB, we invoke commit() explicitly to - // speed up index DB processing if the event loop remains blocks. - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const t = this.transaction; - this.aborted || "function" != typeof t.commit || t.commit(); - } - /** - * Returns a SimpleDbStore for the specified store. All - * operations performed on the SimpleDbStore happen within the context of this - * transaction and it cannot be used anymore once the transaction is - * completed. - * - * Note that we can't actually enforce that the KeyType and ValueType are - * correct, but they allow type safety through the rest of the consuming code. - */ store(t) { - const e = this.transaction.objectStore(t); - return new _i(e); - } -} - -/** - * Provides a wrapper around IndexedDb with a simplified interface that uses - * Promise-like return values to chain operations. Real promises cannot be used - * since .then() continuations are executed asynchronously (e.g. via - * .setImmediate), which would cause IndexedDB to end the transaction. - * See PersistencePromise for more details. - */ class hi { - /* - * Creates a new SimpleDb wrapper for IndexedDb database `name`. - * - * Note that `version` must not be a downgrade. IndexedDB does not support - * downgrading the schema version. We currently do not support any way to do - * versioning outside of IndexedDB's versioning mechanism, as only - * version-upgrade transactions are allowed to do things like create - * objectstores. - */ - constructor(t, e, n) { - this.name = t, this.version = e, this.Pt = n; - // NOTE: According to https://bugs.webkit.org/show_bug.cgi?id=197050, the - // bug we're checking for should exist in iOS >= 12.2 and < 13, but for - // whatever reason it's much harder to hit after 12.2 so we only proactively - // log on 12.2. - 12.2 === hi.Vt((0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getUA)()) && $("Firestore persistence suffers from a bug in iOS 12.2 Safari that may cause your app to stop working. See https://stackoverflow.com/q/56496296/110915 for details and a potential workaround."); - } - /** Deletes the specified database. */ static delete(t) { - return O("SimpleDb", "Removing database:", t), wi(window.indexedDB.deleteDatabase(t)).toPromise(); - } - /** Returns true if IndexedDB is available in the current environment. */ static vt() { - if (!(0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.isIndexedDBAvailable)()) return !1; - if (hi.St()) return !0; - // We extensively use indexed array values and compound keys, - // which IE and Edge do not support. However, they still have indexedDB - // defined on the window, so we need to check for them here and make sure - // to return that persistence is not enabled for those browsers. - // For tracking support of this feature, see here: - // https://developer.microsoft.com/en-us/microsoft-edge/platform/status/indexeddbarraysandmultientrysupport/ - // Check the UA string to find out the browser. - const t = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getUA)(), e = hi.Vt(t), n = 0 < e && e < 10, s = hi.Dt(t), i = 0 < s && s < 4.5; - // IE 10 - // ua = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)'; - // IE 11 - // ua = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko'; - // Edge - // ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, - // like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0'; - // iOS Safari: Disable for users running iOS version < 10. - return !(t.indexOf("MSIE ") > 0 || t.indexOf("Trident/") > 0 || t.indexOf("Edge/") > 0 || n || i); - } - /** - * Returns true if the backing IndexedDB store is the Node IndexedDBShim - * (see https://github.com/axemclion/IndexedDBShim). - */ static St() { - var t; - return "undefined" != typeof process && "YES" === (null === (t = process.env) || void 0 === t ? void 0 : t.Ct); - } - /** Helper to get a typed SimpleDbStore from a transaction. */ static xt(t, e) { - return t.store(e); - } - // visible for testing - /** Parse User Agent to determine iOS version. Returns -1 if not found. */ - static Vt(t) { - const e = t.match(/i(?:phone|pad|pod) os ([\d_]+)/i), n = e ? e[1].split("_").slice(0, 2).join(".") : "-1"; - return Number(n); - } - // visible for testing - /** Parse User Agent to determine Android version. Returns -1 if not found. */ - static Dt(t) { - const e = t.match(/Android ([\d.]+)/i), n = e ? e[1].split(".").slice(0, 2).join(".") : "-1"; - return Number(n); - } - /** - * Opens the specified database, creating or upgrading it if necessary. - */ async Nt(t) { - return this.db || (O("SimpleDb", "Opening database:", this.name), this.db = await new Promise(((e, n) => { - // TODO(mikelehen): Investigate browser compatibility. - // https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Using_IndexedDB - // suggests IE9 and older WebKit browsers handle upgrade - // differently. They expect setVersion, as described here: - // https://developer.mozilla.org/en-US/docs/Web/API/IDBVersionChangeRequest/setVersion - const s = indexedDB.open(this.name, this.version); - s.onsuccess = t => { - const n = t.target.result; - e(n); - }, s.onblocked = () => { - n(new fi(t, "Cannot upgrade IndexedDB schema while another tab is open. Close all tabs that access Firestore and reload this page to proceed.")); - }, s.onerror = e => { - const s = e.target.error; - "VersionError" === s.name ? n(new Q(G.FAILED_PRECONDITION, "A newer version of the Firestore SDK was previously used and so the persisted data is not compatible with the version of the SDK you are now using. The SDK will operate with persistence disabled. If you need persistence, please re-upgrade to a newer version of the SDK or else clear the persisted IndexedDB data for your app to start fresh.")) : "InvalidStateError" === s.name ? n(new Q(G.FAILED_PRECONDITION, "Unable to open an IndexedDB connection. This could be due to running in a private browsing session on a browser whose private browsing sessions do not support IndexedDB: " + s)) : n(new fi(t, s)); - }, s.onupgradeneeded = t => { - O("SimpleDb", 'Database "' + this.name + '" requires upgrade from version:', t.oldVersion); - const e = t.target.result; - this.Pt.kt(e, s.transaction, t.oldVersion, this.version).next((() => { - O("SimpleDb", "Database upgrade to version " + this.version + " complete"); - })); - }; - }))), this.Mt && (this.db.onversionchange = t => this.Mt(t)), this.db; - } - Ot(t) { - this.Mt = t, this.db && (this.db.onversionchange = e => t(e)); - } - async runTransaction(t, e, n, s) { - const i = "readonly" === e; - let r = 0; - for (;;) { - ++r; - try { - this.db = await this.Nt(t); - const e = ci.open(this.db, t, i ? "readonly" : "readwrite", n), r = s(e).next((t => (e.bt(), - t))).catch((t => ( - // Abort the transaction if there was an error. - e.abort(t), ui.reject(t)))).toPromise(); - // As noted above, errors are propagated by aborting the transaction. So - // we swallow any error here to avoid the browser logging it as unhandled. - return r.catch((() => {})), - // Wait for the transaction to complete (i.e. IndexedDb's onsuccess event to - // fire), but still return the original transactionFnResult back to the - // caller. - await e.Rt, r; - } catch (t) { - // TODO(schmidt-sebastian): We could probably be smarter about this and - // not retry exceptions that are likely unrecoverable (such as quota - // exceeded errors). - // Note: We cannot use an instanceof check for FirestoreException, since the - // exception is wrapped in a generic error by our async/await handling. - const e = "FirebaseError" !== t.name && r < 3; - if (O("SimpleDb", "Transaction failed with error:", t.message, "Retrying:", e), - this.close(), !e) return Promise.reject(t); - } - } - } - close() { - this.db && this.db.close(), this.db = void 0; - } -} - -/** - * A controller for iterating over a key range or index. It allows an iterate - * callback to delete the currently-referenced object, or jump to a new key - * within the key range or index. - */ class li { - constructor(t) { - this.$t = t, this.Ft = !1, this.Bt = null; - } - get isDone() { - return this.Ft; - } - get Lt() { - return this.Bt; - } - set cursor(t) { - this.$t = t; - } - /** - * This function can be called to stop iteration at any point. - */ done() { - this.Ft = !0; - } - /** - * This function can be called to skip to that next key, which could be - * an index or a primary key. - */ qt(t) { - this.Bt = t; - } - /** - * Delete the current cursor value from the object store. - * - * NOTE: You CANNOT do this with a keysOnly query. - */ delete() { - return wi(this.$t.delete()); - } -} - -/** An error that wraps exceptions that thrown during IndexedDB execution. */ class fi extends Q { - constructor(t, e) { - super(G.UNAVAILABLE, `IndexedDB transaction '${t}' failed: ${e}`), this.name = "IndexedDbTransactionError"; - } -} - -/** Verifies whether `e` is an IndexedDbTransactionError. */ function di(t) { - // Use name equality, as instanceof checks on errors don't work with errors - // that wrap other errors. - return "IndexedDbTransactionError" === t.name; -} - -/** - * A wrapper around an IDBObjectStore providing an API that: - * - * 1) Has generic KeyType / ValueType parameters to provide strongly-typed - * methods for acting against the object store. - * 2) Deals with IndexedDB's onsuccess / onerror event callbacks, making every - * method return a PersistencePromise instead. - * 3) Provides a higher-level API to avoid needing to do excessive wrapping of - * intermediate IndexedDB types (IDBCursorWithValue, etc.) - */ class _i { - constructor(t) { - this.store = t; - } - put(t, e) { - let n; - return void 0 !== e ? (O("SimpleDb", "PUT", this.store.name, t, e), n = this.store.put(e, t)) : (O("SimpleDb", "PUT", this.store.name, "", t), - n = this.store.put(t)), wi(n); - } - /** - * Adds a new value into an Object Store and returns the new key. Similar to - * IndexedDb's `add()`, this method will fail on primary key collisions. - * - * @param value - The object to write. - * @returns The key of the value to add. - */ add(t) { - O("SimpleDb", "ADD", this.store.name, t, t); - return wi(this.store.add(t)); - } - /** - * Gets the object with the specified key from the specified store, or null - * if no object exists with the specified key. - * - * @key The key of the object to get. - * @returns The object with the specified key or null if no object exists. - */ get(t) { - // We're doing an unsafe cast to ValueType. - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return wi(this.store.get(t)).next((e => ( - // Normalize nonexistence to null. - void 0 === e && (e = null), O("SimpleDb", "GET", this.store.name, t, e), e))); - } - delete(t) { - O("SimpleDb", "DELETE", this.store.name, t); - return wi(this.store.delete(t)); - } - /** - * If we ever need more of the count variants, we can add overloads. For now, - * all we need is to count everything in a store. - * - * Returns the number of rows in the store. - */ count() { - O("SimpleDb", "COUNT", this.store.name); - return wi(this.store.count()); - } - Ut(t, e) { - const n = this.options(t, e); - // Use `getAll()` if the browser supports IndexedDB v3, as it is roughly - // 20% faster. Unfortunately, getAll() does not support custom indices. - if (n.index || "function" != typeof this.store.getAll) { - const t = this.cursor(n), e = []; - return this.Kt(t, ((t, n) => { - e.push(n); - })).next((() => e)); - } - { - const t = this.store.getAll(n.range); - return new ui(((e, n) => { - t.onerror = t => { - n(t.target.error); - }, t.onsuccess = t => { - e(t.target.result); - }; - })); - } - } - /** - * Loads the first `count` elements from the provided index range. Loads all - * elements if no limit is provided. - */ Gt(t, e) { - const n = this.store.getAll(t, null === e ? void 0 : e); - return new ui(((t, e) => { - n.onerror = t => { - e(t.target.error); - }, n.onsuccess = e => { - t(e.target.result); - }; - })); - } - Qt(t, e) { - O("SimpleDb", "DELETE ALL", this.store.name); - const n = this.options(t, e); - n.jt = !1; - const s = this.cursor(n); - return this.Kt(s, ((t, e, n) => n.delete())); - } - Wt(t, e) { - let n; - e ? n = t : (n = {}, e = t); - const s = this.cursor(n); - return this.Kt(s, e); - } - /** - * Iterates over a store, but waits for the given callback to complete for - * each entry before iterating the next entry. This allows the callback to do - * asynchronous work to determine if this iteration should continue. - * - * The provided callback should return `true` to continue iteration, and - * `false` otherwise. - */ zt(t) { - const e = this.cursor({}); - return new ui(((n, s) => { - e.onerror = t => { - const e = gi(t.target.error); - s(e); - }, e.onsuccess = e => { - const s = e.target.result; - s ? t(s.primaryKey, s.value).next((t => { - t ? s.continue() : n(); - })) : n(); - }; - })); - } - Kt(t, e) { - const n = []; - return new ui(((s, i) => { - t.onerror = t => { - i(t.target.error); - }, t.onsuccess = t => { - const i = t.target.result; - if (!i) return void s(); - const r = new li(i), o = e(i.primaryKey, i.value, r); - if (o instanceof ui) { - const t = o.catch((t => (r.done(), ui.reject(t)))); - n.push(t); - } - r.isDone ? s() : null === r.Lt ? i.continue() : i.continue(r.Lt); - }; - })).next((() => ui.waitFor(n))); - } - options(t, e) { - let n; - return void 0 !== t && ("string" == typeof t ? n = t : e = t), { - index: n, - range: e - }; - } - cursor(t) { - let e = "next"; - if (t.reverse && (e = "prev"), t.index) { - const n = this.store.index(t.index); - return t.jt ? n.openKeyCursor(t.range, e) : n.openCursor(t.range, e); - } - return this.store.openCursor(t.range, e); - } -} - -/** - * Wraps an IDBRequest in a PersistencePromise, using the onsuccess / onerror - * handlers to resolve / reject the PersistencePromise as appropriate. - */ function wi(t) { - return new ui(((e, n) => { - t.onsuccess = t => { - const n = t.target.result; - e(n); - }, t.onerror = t => { - const e = gi(t.target.error); - n(e); - }; - })); -} - -// Guard so we only report the error once. -let mi = !1; - -function gi(t) { - const e = hi.Vt((0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getUA)()); - if (e >= 12.2 && e < 13) { - const e = "An internal error was encountered in the Indexed Database server"; - if (t.message.indexOf(e) >= 0) { - // Wrap error in a more descriptive one. - const t = new Q("internal", `IOS_INDEXEDDB_BUG1: IndexedDb has thrown '${e}'. This is likely due to an unavoidable bug in iOS. See https://stackoverflow.com/q/56496296/110915 for details and a potential workaround.`); - return mi || (mi = !0, - // Throw a global exception outside of this promise chain, for the user to - // potentially catch. - setTimeout((() => { - throw t; - }), 0)), t; - } - } - return t; -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ class yi extends ai { - constructor(t, e) { - super(), this.Ht = t, this.currentSequenceNumber = e; - } -} - -function pi(t, e) { - const n = K(t); - return hi.xt(n.Ht, e); -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A batch of mutations that will be sent as one unit to the backend. - */ class Ii { - /** - * @param batchId - The unique ID of this mutation batch. - * @param localWriteTime - The original write time of this mutation. - * @param baseMutations - Mutations that are used to populate the base - * values when this mutation is applied locally. This can be used to locally - * overwrite values that are persisted in the remote document cache. Base - * mutations are never sent to the backend. - * @param mutations - The user-provided mutations in this mutation batch. - * User-provided mutations are applied both locally and remotely on the - * backend. - */ - constructor(t, e, n, s) { - this.batchId = t, this.localWriteTime = e, this.baseMutations = n, this.mutations = s; - } - /** - * Applies all the mutations in this MutationBatch to the specified document - * to compute the state of the remote document - * - * @param document - The document to apply mutations to. - * @param batchResult - The result of applying the MutationBatch to the - * backend. - */ applyToRemoteDocument(t, e) { - const n = e.mutationResults; - for (let e = 0; e < this.mutations.length; e++) { - const s = this.mutations[e]; - if (s.key.isEqual(t.key)) { - dn(s, t, n[e]); - } - } - } - /** - * Computes the local view of a document given all the mutations in this - * batch. - * - * @param document - The document to apply mutations to. - */ applyToLocalView(t) { - // First, apply the base state. This allows us to apply non-idempotent - // transform against a consistent set of values. - for (const e of this.baseMutations) e.key.isEqual(t.key) && _n(e, t, this.localWriteTime); - // Second, apply all user-provided mutations. - for (const e of this.mutations) e.key.isEqual(t.key) && _n(e, t, this.localWriteTime); - } - /** - * Computes the local view for all provided documents given the mutations in - * this batch. - */ applyToLocalDocumentSet(t) { - // TODO(mrschmidt): This implementation is O(n^2). If we apply the mutations - // directly (as done in `applyToLocalView()`), we can reduce the complexity - // to O(n). - this.mutations.forEach((e => { - const n = t.get(e.key), s = n; - // TODO(mutabledocuments): This method should take a MutableDocumentMap - // and we should remove this cast. - this.applyToLocalView(s), n.isValidDocument() || s.convertToNoDocument(ct.min()); - })); - } - keys() { - return this.mutations.reduce(((t, e) => t.add(e.key)), Gn()); - } - isEqual(t) { - return this.batchId === t.batchId && ot(this.mutations, t.mutations, ((t, e) => mn(t, e))) && ot(this.baseMutations, t.baseMutations, ((t, e) => mn(t, e))); - } -} - -/** The result of applying a mutation batch to the backend. */ class Ti { - constructor(t, e, n, - /** - * A pre-computed mapping from each mutated document to the resulting - * version. - */ - s) { - this.batch = t, this.commitVersion = e, this.mutationResults = n, this.docVersions = s; - } - /** - * Creates a new MutationBatchResult for the given batch and results. There - * must be one result for each mutation in the batch. This static factory - * caches a document=>version mapping (docVersions). - */ static from(t, e, n) { - q(t.mutations.length === n.length); - let s = Un; - const i = t.mutations; - for (let t = 0; t < i.length; t++) s = s.insert(i[t].key, n[t].version); - return new Ti(t, e, n, s); - } -} - -/** - * @license - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Representation of an overlay computed by Firestore. - * - * Holds information about a mutation and the largest batch id in Firestore when - * the mutation was created. - */ class Ei { - constructor(t, e) { - this.largestBatchId = t, this.mutation = e; - } - getKey() { - return this.mutation.key; - } - isEqual(t) { - return null !== t && this.mutation === t.mutation; - } - toString() { - return `Overlay{\n largestBatchId: ${this.largestBatchId},\n mutation: ${this.mutation.toString()}\n }`; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * An immutable set of metadata that the local store tracks for each target. - */ class Ai { - constructor( - /** The target being listened to. */ - t, - /** - * The target ID to which the target corresponds; Assigned by the - * LocalStore for user listens and by the SyncEngine for limbo watches. - */ - e, - /** The purpose of the target. */ - n, - /** - * The sequence number of the last transaction during which this target data - * was modified. - */ - s, - /** The latest snapshot version seen for this target. */ - i = ct.min() - /** - * The maximum snapshot version at which the associated view - * contained no limbo documents. - */ , r = ct.min() - /** - * An opaque, server-assigned token that allows watching a target to be - * resumed after disconnecting without retransmitting all the data that - * matches the target. The resume token essentially identifies a point in - * time from which the server should resume sending results. - */ , o = pt.EMPTY_BYTE_STRING) { - this.target = t, this.targetId = e, this.purpose = n, this.sequenceNumber = s, this.snapshotVersion = i, - this.lastLimboFreeSnapshotVersion = r, this.resumeToken = o; - } - /** Creates a new target data instance with an updated sequence number. */ withSequenceNumber(t) { - return new Ai(this.target, this.targetId, this.purpose, t, this.snapshotVersion, this.lastLimboFreeSnapshotVersion, this.resumeToken); - } - /** - * Creates a new target data instance with an updated resume token and - * snapshot version. - */ withResumeToken(t, e) { - return new Ai(this.target, this.targetId, this.purpose, this.sequenceNumber, e, this.lastLimboFreeSnapshotVersion, t); - } - /** - * Creates a new target data instance with an updated last limbo free - * snapshot version number. - */ withLastLimboFreeSnapshotVersion(t) { - return new Ai(this.target, this.targetId, this.purpose, this.sequenceNumber, this.snapshotVersion, t, this.resumeToken); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** Serializer for values stored in the LocalStore. */ class Ri { - constructor(t) { - this.Jt = t; - } -} - -/** Decodes a remote document from storage locally to a Document. */ function bi(t, e) { - let n; - if (e.document) n = ys(t.Jt, e.document, !!e.hasCommittedMutations); else if (e.noDocument) { - const t = xt.fromSegments(e.noDocument.path), s = Di(e.noDocument.readTime); - n = te.newNoDocument(t, s), e.hasCommittedMutations && n.setHasCommittedMutations(); - } else { - if (!e.unknownDocument) return L(); - { - const t = xt.fromSegments(e.unknownDocument.path), s = Di(e.unknownDocument.version); - n = te.newUnknownDocument(t, s); - } - } - return e.readTime && n.setReadTime(vi(e.readTime)), n; -} - -/** Encodes a document for storage locally. */ function Pi(t, e) { - const n = e.key.path.popLast().toArray(), s = Vi(e.readTime); - if (e.isFoundDocument()) { - const i = function(t, e) { - return { - name: ls(t, e.key), - fields: e.data.value.mapValue.fields, - updateTime: rs(t, e.version.toTimestamp()) - }; - }(t.Jt, e); - return { - document: i, - hasCommittedMutations: e.hasCommittedMutations, - readTime: s, - parentPath: n - }; - } - if (e.isNoDocument()) { - const t = e.key.path.toArray(), i = e.hasCommittedMutations; - return { - noDocument: { - path: t, - readTime: Si(e.version) - }, - hasCommittedMutations: i, - readTime: s, - parentPath: n - }; - } - if (e.isUnknownDocument()) { - return { - unknownDocument: { - path: e.key.path.toArray(), - version: Si(e.version) - }, - hasCommittedMutations: !0, - readTime: s, - parentPath: n - }; - } - return L(); -} - -function Vi(t) { - const e = t.toTimestamp(); - return [ e.seconds, e.nanoseconds ]; -} - -function vi(t) { - const e = new ut(t[0], t[1]); - return ct.fromTimestamp(e); -} - -function Si(t) { - const e = t.toTimestamp(); - return { - seconds: e.seconds, - nanoseconds: e.nanoseconds - }; -} - -function Di(t) { - const e = new ut(t.seconds, t.nanoseconds); - return ct.fromTimestamp(e); -} - -/** Encodes a batch of mutations into a DbMutationBatch for local storage. */ -/** Decodes a DbMutationBatch into a MutationBatch */ -function Ci(t, e) { - const n = (e.baseMutations || []).map((e => Es(t.Jt, e))); - // Squash old transform mutations into existing patch or set mutations. - // The replacement of representing `transforms` with `update_transforms` - // on the SDK means that old `transform` mutations stored in IndexedDB need - // to be updated to `update_transforms`. - // TODO(b/174608374): Remove this code once we perform a schema migration. - for (let t = 0; t < e.mutations.length - 1; ++t) { - const n = e.mutations[t]; - if (t + 1 < e.mutations.length && void 0 !== e.mutations[t + 1].transform) { - const s = e.mutations[t + 1]; - n.updateTransforms = s.transform.fieldTransforms, e.mutations.splice(t + 1, 1), - ++t; - } - } - const s = e.mutations.map((e => Es(t.Jt, e))), i = ut.fromMillis(e.localWriteTimeMs); - return new Ii(e.batchId, i, n, s); -} - -/** Decodes a DbTarget into TargetData */ function xi(t) { - const e = Di(t.readTime), n = void 0 !== t.lastLimboFreeSnapshotVersion ? Di(t.lastLimboFreeSnapshotVersion) : ct.min(); - let s; - var i; - return void 0 !== t.query.documents ? (q(1 === (i = t.query).documents.length), - s = $e(De(_s(i.documents[0])))) : s = function(t) { - return $e(Ps(t)); - }(t.query), new Ai(s, t.targetId, 0 /* Listen */ , t.lastListenSequenceNumber, e, n, pt.fromBase64String(t.resumeToken)); -} - -/** Encodes TargetData into a DbTarget for storage locally. */ function Ni(t, e) { - const n = Si(e.snapshotVersion), s = Si(e.lastLimboFreeSnapshotVersion); - let i; - i = fe(e.target) ? Rs(t.Jt, e.target) : bs(t.Jt, e.target); - // We can't store the resumeToken as a ByteString in IndexedDb, so we - // convert it to a base64 string for storage. - const r = e.resumeToken.toBase64(); - // lastListenSequenceNumber is always 0 until we do real GC. - return { - targetId: e.targetId, - canonicalId: ce(e.target), - readTime: n, - resumeToken: r, - lastListenSequenceNumber: e.sequenceNumber, - lastLimboFreeSnapshotVersion: s, - query: i - }; -} - -/** - * A helper function for figuring out what kind of query has been stored. - */ -/** - * Encodes a `BundledQuery` from bundle proto to a Query object. - * - * This reconstructs the original query used to build the bundle being loaded, - * including features exists only in SDKs (for example: limit-to-last). - */ -function ki(t) { - const e = Ps({ - parent: t.parent, - structuredQuery: t.structuredQuery - }); - return "LAST" === t.limitType ? Fe(e, e.limit, "L" /* Last */) : e; -} - -/** Encodes a NamedQuery proto object to a NamedQuery model object. */ -/** Encodes a DbDocumentOverlay object to an Overlay model object. */ -function Mi(t, e) { - return new Ei(e.largestBatchId, Es(t.Jt, e.overlayMutation)); -} - -/** Decodes an Overlay model object into a DbDocumentOverlay object. */ -/** - * Returns the DbDocumentOverlayKey corresponding to the given user and - * document key. - */ -function Oi(t, e) { - const n = e.path.lastSegment(); - return [ t, $s(e.path.popLast()), n ]; -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -class $i { - getBundleMetadata(t, e) { - return Fi(t).get(e).next((t => { - if (t) return { - id: (e = t).bundleId, - createTime: Di(e.createTime), - version: e.version - }; - /** Encodes a DbBundle to a BundleMetadata object. */ - var e; - /** Encodes a BundleMetadata to a DbBundle. */ })); - } - saveBundleMetadata(t, e) { - return Fi(t).put({ - bundleId: (n = e).id, - createTime: Si(us(n.createTime)), - version: n.version - }); - var n; - /** Encodes a DbNamedQuery to a NamedQuery. */ } - getNamedQuery(t, e) { - return Bi(t).get(e).next((t => { - if (t) return { - name: (e = t).name, - query: ki(e.bundledQuery), - readTime: Di(e.readTime) - }; - var e; - /** Encodes a NamedQuery from a bundle proto to a DbNamedQuery. */ })); - } - saveNamedQuery(t, e) { - return Bi(t).put(function(t) { - return { - name: t.name, - readTime: Si(us(t.readTime)), - bundledQuery: t.bundledQuery - }; - }(e)); - } -} - -/** - * Helper to get a typed SimpleDbStore for the bundles object store. - */ function Fi(t) { - return pi(t, "bundles"); -} - -/** - * Helper to get a typed SimpleDbStore for the namedQueries object store. - */ function Bi(t) { - return pi(t, "namedQueries"); -} - -/** - * @license - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Implementation of DocumentOverlayCache using IndexedDb. - */ class Li { - /** - * @param serializer - The document serializer. - * @param userId - The userId for which we are accessing overlays. - */ - constructor(t, e) { - this.M = t, this.userId = e; - } - static Yt(t, e) { - const n = e.uid || ""; - return new Li(t, n); - } - getOverlay(t, e) { - return qi(t).get(Oi(this.userId, e)).next((t => t ? Mi(this.M, t) : null)); - } - saveOverlays(t, e, n) { - const s = []; - return n.forEach(((n, i) => { - const r = new Ei(e, i); - s.push(this.Xt(t, r)); - })), ui.waitFor(s); - } - removeOverlaysForBatchId(t, e, n) { - const s = new Set; - // Get the set of unique collection paths. - e.forEach((t => s.add($s(t.getCollectionPath())))); - const i = []; - return s.forEach((e => { - const s = IDBKeyRange.bound([ this.userId, e, n ], [ this.userId, e, n + 1 ], - /*lowerOpen=*/ !1, - /*upperOpen=*/ !0); - i.push(qi(t).Qt("collectionPathOverlayIndex", s)); - })), ui.waitFor(i); - } - getOverlaysForCollection(t, e, n) { - const s = qn(), i = $s(e), r = IDBKeyRange.bound([ this.userId, i, n ], [ this.userId, i, Number.POSITIVE_INFINITY ], - /*lowerOpen=*/ !0); - return qi(t).Ut("collectionPathOverlayIndex", r).next((t => { - for (const e of t) { - const t = Mi(this.M, e); - s.set(t.getKey(), t); - } - return s; - })); - } - getOverlaysForCollectionGroup(t, e, n, s) { - const i = qn(); - let r; - // We want batch IDs larger than `sinceBatchId`, and so the lower bound - // is not inclusive. - const o = IDBKeyRange.bound([ this.userId, e, n ], [ this.userId, e, Number.POSITIVE_INFINITY ], - /*lowerOpen=*/ !0); - return qi(t).Wt({ - index: "collectionGroupOverlayIndex", - range: o - }, ((t, e, n) => { - // We do not want to return partial batch overlays, even if the size - // of the result set exceeds the given `count` argument. Therefore, we - // continue to aggregate results even after the result size exceeds - // `count` if there are more overlays from the `currentBatchId`. - const o = Mi(this.M, e); - i.size() < s || o.largestBatchId === r ? (i.set(o.getKey(), o), r = o.largestBatchId) : n.done(); - })).next((() => i)); - } - Xt(t, e) { - return qi(t).put(function(t, e, n) { - const [s, i, r] = Oi(e, n.mutation.key); - return { - userId: e, - collectionPath: i, - documentId: r, - collectionGroup: n.mutation.key.getCollectionGroup(), - largestBatchId: n.largestBatchId, - overlayMutation: Ts(t.Jt, n.mutation) - }; - }(this.M, this.userId, e)); - } -} - -/** - * Helper to get a typed SimpleDbStore for the document overlay object store. - */ function qi(t) { - return pi(t, "documentOverlays"); -} - -/** - * @license - * Copyright 2021 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -// Note: This code is copied from the backend. Code that is not used by -// Firestore was removed. -/** Firestore index value writer. */ -class Ui { - constructor() {} - // The write methods below short-circuit writing terminators for values - // containing a (terminating) truncated value. - // As an example, consider the resulting encoding for: - // ["bar", [2, "foo"]] -> (STRING, "bar", TERM, ARRAY, NUMBER, 2, STRING, "foo", TERM, TERM, TERM) - // ["bar", [2, truncated("foo")]] -> (STRING, "bar", TERM, ARRAY, NUMBER, 2, STRING, "foo", TRUNC) - // ["bar", truncated(["foo"])] -> (STRING, "bar", TERM, ARRAY. STRING, "foo", TERM, TRUNC) - /** Writes an index value. */ - Zt(t, e) { - this.te(t, e), - // Write separator to split index values - // (see go/firestore-storage-format#encodings). - e.ee(); - } - te(t, e) { - if ("nullValue" in t) this.ne(e, 5); else if ("booleanValue" in t) this.ne(e, 10), - e.se(t.booleanValue ? 1 : 0); else if ("integerValue" in t) this.ne(e, 15), e.se(Et(t.integerValue)); else if ("doubleValue" in t) { - const n = Et(t.doubleValue); - isNaN(n) ? this.ne(e, 13) : (this.ne(e, 15), Dt(n) ? - // -0.0, 0 and 0.0 are all considered the same - e.se(0) : e.se(n)); - } else if ("timestampValue" in t) { - const n = t.timestampValue; - this.ne(e, 20), "string" == typeof n ? e.ie(n) : (e.ie(`${n.seconds || ""}`), e.se(n.nanos || 0)); - } else if ("stringValue" in t) this.re(t.stringValue, e), this.oe(e); else if ("bytesValue" in t) this.ne(e, 30), - e.ae(At(t.bytesValue)), this.oe(e); else if ("referenceValue" in t) this.ue(t.referenceValue, e); else if ("geoPointValue" in t) { - const n = t.geoPointValue; - this.ne(e, 45), e.se(n.latitude || 0), e.se(n.longitude || 0); - } else "mapValue" in t ? Ht(t) ? this.ne(e, Number.MAX_SAFE_INTEGER) : (this.ce(t.mapValue, e), - this.oe(e)) : "arrayValue" in t ? (this.he(t.arrayValue, e), this.oe(e)) : L(); - } - re(t, e) { - this.ne(e, 25), this.le(t, e); - } - le(t, e) { - e.ie(t); - } - ce(t, e) { - const n = t.fields || {}; - this.ne(e, 55); - for (const t of Object.keys(n)) this.re(t, e), this.te(n[t], e); - } - he(t, e) { - const n = t.values || []; - this.ne(e, 50); - for (const t of n) this.te(t, e); - } - ue(t, e) { - this.ne(e, 37); - xt.fromName(t).path.forEach((t => { - this.ne(e, 60), this.le(t, e); - })); - } - ne(t, e) { - t.se(e); - } - oe(t) { - // While the SDK does not implement truncation, the truncation marker is - // used to terminate all variable length values (which are strings, bytes, - // references, arrays and maps). - t.se(2); - } -} - -Ui.fe = new Ui; - -/** - * Counts the number of zeros in a byte. - * - * Visible for testing. - */ -function Ki(t) { - if (0 === t) return 8; - let e = 0; - return t >> 4 == 0 && ( - // Test if the first four bits are zero. - e += 4, t <<= 4), t >> 6 == 0 && ( - // Test if the first two (or next two) bits are zero. - e += 2, t <<= 2), t >> 7 == 0 && ( - // Test if the remaining bit is zero. - e += 1), e; -} - -/** Counts the number of leading zeros in the given byte array. */ -/** - * Returns the number of bytes required to store "value". Leading zero bytes - * are skipped. - */ -function Gi(t) { - // This is just the number of bytes for the unsigned representation of the number. - const e = 64 - function(t) { - let e = 0; - for (let n = 0; n < 8; ++n) { - const s = Ki(255 & t[n]); - if (e += s, 8 !== s) break; - } - return e; - }(t); - return Math.ceil(e / 8); -} - -/** - * OrderedCodeWriter is a minimal-allocation implementation of the writing - * behavior defined by the backend. - * - * The code is ported from its Java counterpart. - */ class Qi { - constructor() { - this.buffer = new Uint8Array(1024), this.position = 0; - } - de(t) { - const e = t[Symbol.iterator](); - let n = e.next(); - for (;!n.done; ) this._e(n.value), n = e.next(); - this.we(); - } - me(t) { - const e = t[Symbol.iterator](); - let n = e.next(); - for (;!n.done; ) this.ge(n.value), n = e.next(); - this.ye(); - } - /** Writes utf8 bytes into this byte sequence, ascending. */ pe(t) { - for (const e of t) { - const t = e.charCodeAt(0); - if (t < 128) this._e(t); else if (t < 2048) this._e(960 | t >>> 6), this._e(128 | 63 & t); else if (e < "\ud800" || "\udbff" < e) this._e(480 | t >>> 12), - this._e(128 | 63 & t >>> 6), this._e(128 | 63 & t); else { - const t = e.codePointAt(0); - this._e(240 | t >>> 18), this._e(128 | 63 & t >>> 12), this._e(128 | 63 & t >>> 6), - this._e(128 | 63 & t); - } - } - this.we(); - } - /** Writes utf8 bytes into this byte sequence, descending */ Ie(t) { - for (const e of t) { - const t = e.charCodeAt(0); - if (t < 128) this.ge(t); else if (t < 2048) this.ge(960 | t >>> 6), this.ge(128 | 63 & t); else if (e < "\ud800" || "\udbff" < e) this.ge(480 | t >>> 12), - this.ge(128 | 63 & t >>> 6), this.ge(128 | 63 & t); else { - const t = e.codePointAt(0); - this.ge(240 | t >>> 18), this.ge(128 | 63 & t >>> 12), this.ge(128 | 63 & t >>> 6), - this.ge(128 | 63 & t); - } - } - this.ye(); - } - Te(t) { - // Values are encoded with a single byte length prefix, followed by the - // actual value in big-endian format with leading 0 bytes dropped. - const e = this.Ee(t), n = Gi(e); - this.Ae(1 + n), this.buffer[this.position++] = 255 & n; - // Write the length - for (let t = e.length - n; t < e.length; ++t) this.buffer[this.position++] = 255 & e[t]; - } - Re(t) { - // Values are encoded with a single byte length prefix, followed by the - // inverted value in big-endian format with leading 0 bytes dropped. - const e = this.Ee(t), n = Gi(e); - this.Ae(1 + n), this.buffer[this.position++] = ~(255 & n); - // Write the length - for (let t = e.length - n; t < e.length; ++t) this.buffer[this.position++] = ~(255 & e[t]); - } - /** - * Writes the "infinity" byte sequence that sorts after all other byte - * sequences written in ascending order. - */ be() { - this.Pe(255), this.Pe(255); - } - /** - * Writes the "infinity" byte sequence that sorts before all other byte - * sequences written in descending order. - */ Ve() { - this.ve(255), this.ve(255); - } - /** - * Resets the buffer such that it is the same as when it was newly - * constructed. - */ reset() { - this.position = 0; - } - seed(t) { - this.Ae(t.length), this.buffer.set(t, this.position), this.position += t.length; - } - /** Makes a copy of the encoded bytes in this buffer. */ Se() { - return this.buffer.slice(0, this.position); - } - /** - * Encodes `val` into an encoding so that the order matches the IEEE 754 - * floating-point comparison results with the following exceptions: - * -0.0 < 0.0 - * all non-NaN < NaN - * NaN = NaN - */ Ee(t) { - const e = - /** Converts a JavaScript number to a byte array (using big endian encoding). */ - function(t) { - const e = new DataView(new ArrayBuffer(8)); - return e.setFloat64(0, t, /* littleEndian= */ !1), new Uint8Array(e.buffer); - }(t), n = 0 != (128 & e[0]); - // Check if the first bit is set. We use a bit mask since value[0] is - // encoded as a number from 0 to 255. - // Revert the two complement to get natural ordering - e[0] ^= n ? 255 : 128; - for (let t = 1; t < e.length; ++t) e[t] ^= n ? 255 : 0; - return e; - } - /** Writes a single byte ascending to the buffer. */ _e(t) { - const e = 255 & t; - 0 === e ? (this.Pe(0), this.Pe(255)) : 255 === e ? (this.Pe(255), this.Pe(0)) : this.Pe(e); - } - /** Writes a single byte descending to the buffer. */ ge(t) { - const e = 255 & t; - 0 === e ? (this.ve(0), this.ve(255)) : 255 === e ? (this.ve(255), this.ve(0)) : this.ve(t); - } - we() { - this.Pe(0), this.Pe(1); - } - ye() { - this.ve(0), this.ve(1); - } - Pe(t) { - this.Ae(1), this.buffer[this.position++] = t; - } - ve(t) { - this.Ae(1), this.buffer[this.position++] = ~t; - } - Ae(t) { - const e = t + this.position; - if (e <= this.buffer.length) return; - // Try doubling. - let n = 2 * this.buffer.length; - // Still not big enough? Just allocate the right size. - n < e && (n = e); - // Create the new buffer. - const s = new Uint8Array(n); - s.set(this.buffer), // copy old data - this.buffer = s; - } -} - -class ji { - constructor(t) { - this.De = t; - } - ae(t) { - this.De.de(t); - } - ie(t) { - this.De.pe(t); - } - se(t) { - this.De.Te(t); - } - ee() { - this.De.be(); - } -} - -class Wi { - constructor(t) { - this.De = t; - } - ae(t) { - this.De.me(t); - } - ie(t) { - this.De.Ie(t); - } - se(t) { - this.De.Re(t); - } - ee() { - this.De.Ve(); - } -} - -/** - * Implements `DirectionalIndexByteEncoder` using `OrderedCodeWriter` for the - * actual encoding. - */ class zi { - constructor() { - this.De = new Qi, this.Ce = new ji(this.De), this.xe = new Wi(this.De); - } - seed(t) { - this.De.seed(t); - } - Ne(t) { - return 0 /* ASCENDING */ === t ? this.Ce : this.xe; - } - Se() { - return this.De.Se(); - } - reset() { - this.De.reset(); - } -} - -/** - * @license - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** Represents an index entry saved by the SDK in persisted storage. */ class Hi { - constructor(t, e, n, s) { - this.indexId = t, this.documentKey = e, this.arrayValue = n, this.directionalValue = s; - } - /** - * Returns an IndexEntry entry that sorts immediately after the current - * directional value. - */ ke() { - const t = this.directionalValue.length, e = 0 === t || 255 === this.directionalValue[t - 1] ? t + 1 : t, n = new Uint8Array(e); - return n.set(this.directionalValue, 0), e !== t ? n.set([ 0 ], this.directionalValue.length) : ++n[n.length - 1], - new Hi(this.indexId, this.documentKey, this.arrayValue, n); - } -} - -function Ji(t, e) { - let n = t.indexId - e.indexId; - return 0 !== n ? n : (n = Yi(t.arrayValue, e.arrayValue), 0 !== n ? n : (n = Yi(t.directionalValue, e.directionalValue), - 0 !== n ? n : xt.comparator(t.documentKey, e.documentKey))); -} - -function Yi(t, e) { - for (let n = 0; n < t.length && n < e.length; ++n) { - const s = t[n] - e[n]; - if (0 !== s) return s; - } - return t.length - e.length; -} - -/** - * @license - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A light query planner for Firestore. - * - * This class matches a `FieldIndex` against a Firestore Query `Target`. It - * determines whether a given index can be used to serve the specified target. - * - * The following table showcases some possible index configurations: - * - * Query | Index - * ----------------------------------------------------------------------------- - * where('a', '==', 'a').where('b', '==', 'b') | a ASC, b DESC - * where('a', '==', 'a').where('b', '==', 'b') | a ASC - * where('a', '==', 'a').where('b', '==', 'b') | b DESC - * where('a', '>=', 'a').orderBy('a') | a ASC - * where('a', '>=', 'a').orderBy('a', 'desc') | a DESC - * where('a', '>=', 'a').orderBy('a').orderBy('b') | a ASC, b ASC - * where('a', '>=', 'a').orderBy('a').orderBy('b') | a ASC - * where('a', 'array-contains', 'a').orderBy('b') | a CONTAINS, b ASCENDING - * where('a', 'array-contains', 'a').orderBy('b') | a CONTAINS - */ class Xi { - constructor(t) { - this.collectionId = null != t.collectionGroup ? t.collectionGroup : t.path.lastSegment(), - this.Me = t.orderBy, this.Oe = []; - for (const e of t.filters) { - const t = e; - t.S() ? this.$e = t : this.Oe.push(t); - } - } - /** - * Returns whether the index can be used to serve the TargetIndexMatcher's - * target. - * - * An index is considered capable of serving the target when: - * - The target uses all index segments for its filters and orderBy clauses. - * The target can have additional filter and orderBy clauses, but not - * fewer. - * - If an ArrayContains/ArrayContainsAnyfilter is used, the index must also - * have a corresponding `CONTAINS` segment. - * - All directional index segments can be mapped to the target as a series of - * equality filters, a single inequality filter and a series of orderBy - * clauses. - * - The segments that represent the equality filters may appear out of order. - * - The optional segment for the inequality filter must appear after all - * equality segments. - * - The segments that represent that orderBy clause of the target must appear - * in order after all equality and inequality segments. Single orderBy - * clauses cannot be skipped, but a continuous orderBy suffix may be - * omitted. - */ Fe(t) { - // If there is an array element, find a matching filter. - const e = ne(t); - if (void 0 !== e && !this.Be(e)) return !1; - const n = se(t); - let s = 0, i = 0; - // Process all equalities first. Equalities can appear out of order. - for (;s < n.length && this.Be(n[s]); ++s) ; - // If we already have processed all segments, all segments are used to serve - // the equality filters and we do not need to map any segments to the - // target's inequality and orderBy clauses. - if (s === n.length) return !0; - // If there is an inequality filter, the next segment must match both the - // filter and the first orderBy clause. - if (void 0 !== this.$e) { - const t = n[s]; - if (!this.Le(this.$e, t) || !this.qe(this.Me[i++], t)) return !1; - ++s; - } - // All remaining segments need to represent the prefix of the target's - // orderBy. - for (;s < n.length; ++s) { - const t = n[s]; - if (i >= this.Me.length || !this.qe(this.Me[i++], t)) return !1; - } - return !0; - } - Be(t) { - for (const e of this.Oe) if (this.Le(e, t)) return !0; - return !1; - } - Le(t, e) { - if (void 0 === t || !t.field.isEqual(e.fieldPath)) return !1; - const n = "array-contains" /* ARRAY_CONTAINS */ === t.op || "array-contains-any" /* ARRAY_CONTAINS_ANY */ === t.op; - return 2 /* CONTAINS */ === e.kind === n; - } - qe(t, e) { - return !!t.field.isEqual(e.fieldPath) && (0 /* ASCENDING */ === e.kind && "asc" /* ASCENDING */ === t.dir || 1 /* DESCENDING */ === e.kind && "desc" /* DESCENDING */ === t.dir); - } -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * An in-memory implementation of IndexManager. - */ class Zi { - constructor() { - this.Ue = new tr; - } - addToCollectionParentIndex(t, e) { - return this.Ue.add(e), ui.resolve(); - } - getCollectionParents(t, e) { - return ui.resolve(this.Ue.getEntries(e)); - } - addFieldIndex(t, e) { - // Field indices are not supported with memory persistence. - return ui.resolve(); - } - deleteFieldIndex(t, e) { - // Field indices are not supported with memory persistence. - return ui.resolve(); - } - getDocumentsMatchingTarget(t, e) { - // Field indices are not supported with memory persistence. - return ui.resolve(null); - } - getFieldIndex(t, e) { - // Field indices are not supported with memory persistence. - return ui.resolve(null); - } - getFieldIndexes(t, e) { - // Field indices are not supported with memory persistence. - return ui.resolve([]); - } - getNextCollectionGroupToUpdate(t) { - // Field indices are not supported with memory persistence. - return ui.resolve(null); - } - updateCollectionGroup(t, e, n) { - // Field indices are not supported with memory persistence. - return ui.resolve(); - } - updateIndexEntries(t, e) { - // Field indices are not supported with memory persistence. - return ui.resolve(); - } -} - -/** - * Internal implementation of the collection-parent index exposed by MemoryIndexManager. - * Also used for in-memory caching by IndexedDbIndexManager and initial index population - * in indexeddb_schema.ts - */ class tr { - constructor() { - this.index = {}; - } - // Returns false if the entry already existed. - add(t) { - const e = t.lastSegment(), n = t.popLast(), s = this.index[e] || new kn(_t.comparator), i = !s.has(n); - return this.index[e] = s.add(n), i; - } - has(t) { - const e = t.lastSegment(), n = t.popLast(), s = this.index[e]; - return s && s.has(n); - } - getEntries(t) { - return (this.index[t] || new kn(_t.comparator)).toArray(); - } -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ const er = new Uint8Array(0); - -/** - * A persisted implementation of IndexManager. - * - * PORTING NOTE: Unlike iOS and Android, the Web SDK does not memoize index - * data as it supports multi-tab access. - */ -class nr { - constructor(t) { - this.user = t, - /** - * An in-memory copy of the index entries we've already written since the SDK - * launched. Used to avoid re-writing the same entry repeatedly. - * - * This is *NOT* a complete cache of what's in persistence and so can never be - * used to satisfy reads. - */ - this.Ke = new tr, - /** - * Maps from a target to its equivalent list of sub-targets. Each sub-target - * contains only one term from the target's disjunctive normal form (DNF). - */ - this.Ge = new Dn((t => ce(t)), ((t, e) => le(t, e))), this.uid = t.uid || ""; - } - /** - * Adds a new entry to the collection parent index. - * - * Repeated calls for the same collectionPath should be avoided within a - * transaction as IndexedDbIndexManager only caches writes once a transaction - * has been committed. - */ addToCollectionParentIndex(t, e) { - if (!this.Ke.has(e)) { - const n = e.lastSegment(), s = e.popLast(); - t.addOnCommittedListener((() => { - // Add the collection to the in memory cache only if the transaction was - // successfully committed. - this.Ke.add(e); - })); - const i = { - collectionId: n, - parent: $s(s) - }; - return sr(t).put(i); - } - return ui.resolve(); - } - getCollectionParents(t, e) { - const n = [], s = IDBKeyRange.bound([ e, "" ], [ at(e), "" ], - /*lowerOpen=*/ !1, - /*upperOpen=*/ !0); - return sr(t).Ut(s).next((t => { - for (const s of t) { - // This collectionId guard shouldn't be necessary (and isn't as long - // as we're running in a real browser), but there's a bug in - // indexeddbshim that breaks our range in our tests running in node: - // https://github.com/axemclion/IndexedDBShim/issues/334 - if (s.collectionId !== e) break; - n.push(Ls(s.parent)); - } - return n; - })); - } - addFieldIndex(t, e) { - // TODO(indexing): Verify that the auto-incrementing index ID works in - // Safari & Firefox. - const n = rr(t), s = function(t) { - return { - indexId: t.indexId, - collectionGroup: t.collectionGroup, - fields: t.fields.map((t => [ t.fieldPath.canonicalString(), t.kind ])) - }; - }(e); - // `indexId` is auto-populated by IndexedDb - return delete s.indexId, n.add(s).next(); - } - deleteFieldIndex(t, e) { - const n = rr(t), s = or(t), i = ir(t); - return n.delete(e.indexId).next((() => s.delete(IDBKeyRange.bound([ e.indexId ], [ e.indexId + 1 ], - /*lowerOpen=*/ !1, - /*upperOpen=*/ !0)))).next((() => i.delete(IDBKeyRange.bound([ e.indexId ], [ e.indexId + 1 ], - /*lowerOpen=*/ !1, - /*upperOpen=*/ !0)))); - } - getDocumentsMatchingTarget(t, e) { - const n = ir(t); - let s = !0; - const i = new Map; - return ui.forEach(this.Qe(e), (e => this.getFieldIndex(t, e).next((t => { - s && (s = !!t), i.set(e, t); - })))).next((() => { - if (s) { - let t = Gn(); - return ui.forEach(i, ((s, i) => { - var r; - O("IndexedDbIndexManager", `Using index ${r = s, `id=${r.indexId}|cg=${r.collectionGroup}|f=${r.fields.map((t => `${t.fieldPath}:${t.kind}`)).join(",")}`} to execute ${ce(e)}`); - const o = function(t, e) { - const n = ne(e); - if (void 0 === n) return null; - for (const e of de(t, n.fieldPath)) switch (e.op) { - case "array-contains-any" /* ARRAY_CONTAINS_ANY */ : - return e.value.arrayValue.values || []; - - case "array-contains" /* ARRAY_CONTAINS */ : - return [ e.value ]; - // Remaining filters are not array filters. - } - return null; - } - /** - * Returns the list of values that are used in != or NOT_IN filters. Returns - * `null` if there are no such filters. - */ (i, s), a = function(t, e) { - const n = new Map; - for (const s of se(e)) for (const e of de(t, s.fieldPath)) switch (e.op) { - case "==" /* EQUAL */ : - case "in" /* IN */ : - // Encode equality prefix, which is encoded in the index value before - // the inequality (e.g. `a == 'a' && b != 'b'` is encoded to - // `value != 'ab'`). - n.set(s.fieldPath.canonicalString(), e.value); - break; - - case "not-in" /* NOT_IN */ : - case "!=" /* NOT_EQUAL */ : - // NotIn/NotEqual is always a suffix. There cannot be any remaining - // segments and hence we can return early here. - return n.set(s.fieldPath.canonicalString(), e.value), Array.from(n.values()); - // Remaining filters cannot be used as notIn bounds. - } - return null; - } - /** - * Returns a lower bound of field values that can be used as a starting point to - * scan the index defined by `fieldIndex`. Returns `null` if no lower bound - * exists. - */ (i, s), u = function(t, e) { - const n = []; - let s = !0; - // For each segment, retrieve a lower bound if there is a suitable filter or - // startAt. - for (const r of se(e)) { - let e, o = !0; - // Process all filters to find a value for the current field segment - for (const n of de(t, r.fieldPath)) { - let t, s = !0; - switch (n.op) { - case "<" /* LESS_THAN */ : - case "<=" /* LESS_THAN_OR_EQUAL */ : - t = "nullValue" in (i = n.value) ? kt : "booleanValue" in i ? { - booleanValue: !1 - } : "integerValue" in i || "doubleValue" in i ? { - doubleValue: NaN - } : "timestampValue" in i ? { - timestampValue: { - seconds: Number.MIN_SAFE_INTEGER - } - } : "stringValue" in i ? { - stringValue: "" - } : "bytesValue" in i ? { - bytesValue: "" - } : "referenceValue" in i ? Ut(vt.empty(), xt.empty()) : "geoPointValue" in i ? { - geoPointValue: { - latitude: -90, - longitude: -180 - } - } : "arrayValue" in i ? { - arrayValue: {} - } : "mapValue" in i ? { - mapValue: {} - } : L(); - break; - - case "==" /* EQUAL */ : - case "in" /* IN */ : - case ">=" /* GREATER_THAN_OR_EQUAL */ : - t = n.value; - break; - - case ">" /* GREATER_THAN */ : - t = n.value, s = !1; - break; - - case "!=" /* NOT_EQUAL */ : - case "not-in" /* NOT_IN */ : - t = kt; - // Remaining filters cannot be used as lower bounds. - } - Jt(e, t) === t && (e = t, o = s); - } - // If there is a startAt bound, compare the values against the existing - // boundary to see if we can narrow the scope. - if (null !== t.startAt) for (let n = 0; n < t.orderBy.length; ++n) if (t.orderBy[n].field.isEqual(r.fieldPath)) { - const s = t.startAt.position[n]; - Jt(e, s) === s && (e = s, o = t.startAt.inclusive); - break; - } - if (void 0 === e) - // No lower bound exists - return null; - n.push(e), s && (s = o); - } - var i; - /** Returns the largest value for the given value type (exclusive). */ return new Ae(n, s); - } - /** - * Returns an upper bound of field values that can be used as an ending point - * when scanning the index defined by `fieldIndex`. Returns `null` if no - * upper bound exists. - */ (i, s), c = function(t, e) { - const n = []; - let s = !0; - // For each segment, retrieve an upper bound if there is a suitable filter or - // endAt. - for (const r of se(e)) { - let e, o = !0; - // Process all filters to find a value for the current field segment - for (const n of de(t, r.fieldPath)) { - let t, s = !0; - switch (n.op) { - case ">=" /* GREATER_THAN_OR_EQUAL */ : - case ">" /* GREATER_THAN */ : - t = "nullValue" in (i = n.value) ? { - booleanValue: !1 - } : "booleanValue" in i ? { - doubleValue: NaN - } : "integerValue" in i || "doubleValue" in i ? { - timestampValue: { - seconds: Number.MIN_SAFE_INTEGER - } - } : "timestampValue" in i ? { - stringValue: "" - } : "stringValue" in i ? { - bytesValue: "" - } : "bytesValue" in i ? Ut(vt.empty(), xt.empty()) : "referenceValue" in i ? { - geoPointValue: { - latitude: -90, - longitude: -180 - } - } : "geoPointValue" in i ? { - arrayValue: {} - } : "arrayValue" in i ? { - mapValue: {} - } : "mapValue" in i ? Nt : L(), s = !1; - break; - - case "==" /* EQUAL */ : - case "in" /* IN */ : - case "<=" /* LESS_THAN_OR_EQUAL */ : - t = n.value; - break; - - case "<" /* LESS_THAN */ : - t = n.value, s = !1; - break; - - case "!=" /* NOT_EQUAL */ : - case "not-in" /* NOT_IN */ : - t = Nt; - // Remaining filters cannot be used as upper bounds. - } - Yt(e, t) === t && (e = t, o = s); - } - // If there is a endAt bound, compare the values against the existing - // boundary to see if we can narrow the scope. - if (null !== t.endAt) for (let n = 0; n < t.orderBy.length; ++n) if (t.orderBy[n].field.isEqual(r.fieldPath)) { - const s = t.endAt.position[n]; - Yt(e, s) === s && (e = s, o = t.endAt.inclusive); - break; - } - if (void 0 === e) - // No upper bound exists - return null; - n.push(e), s && (s = o); - } - var i; - return new Ae(n, s); - }(i, s), h = this.je(s, i, u), l = this.je(s, i, c), f = this.We(s, i, a), d = this.ze(s.indexId, o, h, !!u && u.inclusive, l, !!c && c.inclusive, f); - return ui.forEach(d, (s => n.Gt(s, e.limit).next((e => { - e.forEach((e => { - t = t.add(new xt(Ls(e.documentKey))); - })); - })))); - })).next((() => t)); - } - return ui.resolve(null); - })); - } - Qe(t) { - let e = this.Ge.get(t); - return e || ( - // TODO(orquery): Implement DNF transform - e = [ t ], this.Ge.set(t, e), e); - } - /** - * Constructs a key range query on `DbIndexEntryStore` that unions all - * bounds. - */ ze(t, e, n, s, i, r, o) { - // The number of total index scans we union together. This is similar to a - // distributed normal form, but adapted for array values. We create a single - // index range per value in an ARRAY_CONTAINS or ARRAY_CONTAINS_ANY filter - // combined with the values from the query bounds. - const a = (null != e ? e.length : 1) * Math.max(null != n ? n.length : 1, null != i ? i.length : 1), u = a / (null != e ? e.length : 1), c = []; - for (let h = 0; h < a; ++h) { - const a = e ? this.He(e[h / u]) : er, l = n ? this.Je(t, a, n[h % u], s) : this.Ye(t), f = i ? this.Xe(t, a, i[h % u], r) : this.Ye(t + 1); - c.push(...this.createRange(l, f, o.map((e => this.Je(t, a, e, - /* inclusive= */ !0))))); - } - return c; - } - /** Generates the lower bound for `arrayValue` and `directionalValue`. */ Je(t, e, n, s) { - const i = new Hi(t, xt.empty(), e, n); - return s ? i : i.ke(); - } - /** Generates the upper bound for `arrayValue` and `directionalValue`. */ Xe(t, e, n, s) { - const i = new Hi(t, xt.empty(), e, n); - return s ? i.ke() : i; - } - /** - * Generates an empty bound that scopes the index scan to the current index - * and user. - */ Ye(t) { - return new Hi(t, xt.empty(), er, er); - } - getFieldIndex(t, e) { - const n = new Xi(e), s = null != e.collectionGroup ? e.collectionGroup : e.path.lastSegment(); - return this.getFieldIndexes(t, s).next((t => { - const e = t.filter((t => n.Fe(t))); - // Return the index that matches the most number of segments. - return e.sort(((t, e) => e.fields.length - t.fields.length)), e.length > 0 ? e[0] : null; - })); - } - /** - * Returns the byte encoded form of the directional values in the field index. - * Returns `null` if the document does not have all fields specified in the - * index. - */ Ze(t, e) { - const n = new zi; - for (const s of se(t)) { - const t = e.data.field(s.fieldPath); - if (null == t) return null; - const i = n.Ne(s.kind); - Ui.fe.Zt(t, i); - } - return n.Se(); - } - /** Encodes a single value to the ascending index format. */ He(t) { - const e = new zi; - return Ui.fe.Zt(t, e.Ne(0 /* ASCENDING */)), e.Se(); - } - /** - * Encodes the given field values according to the specification in `target`. - * For IN queries, a list of possible values is returned. - */ We(t, e, n) { - if (null === n) return []; - let s = []; - s.push(new zi); - let i = 0; - for (const r of se(t)) { - const t = n[i++]; - for (const n of s) if (this.tn(e, r.fieldPath) && Gt(t)) s = this.en(s, r, t); else { - const e = n.Ne(r.kind); - Ui.fe.Zt(t, e); - } - } - return this.nn(s); - } - /** - * Encodes the given bounds according to the specification in `target`. For IN - * queries, a list of possible values is returned. - */ je(t, e, n) { - return null == n ? null : this.We(t, e, n.position); - } - /** Returns the byte representation for the provided encoders. */ nn(t) { - const e = []; - for (let n = 0; n < t.length; ++n) e[n] = t[n].Se(); - return e; - } - /** - * Creates a separate encoder for each element of an array. - * - * The method appends each value to all existing encoders (e.g. filter("a", - * "==", "a1").filter("b", "in", ["b1", "b2"]) becomes ["a1,b1", "a1,b2"]). A - * list of new encoders is returned. - */ en(t, e, n) { - const s = [ ...t ], i = []; - for (const t of n.arrayValue.values || []) for (const n of s) { - const s = new zi; - s.seed(n.Se()), Ui.fe.Zt(t, s.Ne(e.kind)), i.push(s); - } - return i; - } - tn(t, e) { - return !!t.filters.find((t => t instanceof _e && t.field.isEqual(e) && ("in" /* IN */ === t.op || "not-in" /* NOT_IN */ === t.op))); - } - getFieldIndexes(t, e) { - const n = rr(t), s = or(t); - return (e ? n.Ut("collectionGroupIndex", IDBKeyRange.bound(e, e)) : n.Ut()).next((t => { - const e = []; - return ui.forEach(t, (t => s.get([ t.indexId, this.uid ]).next((n => { - e.push(function(t, e) { - const n = e ? new re(e.sequenceNumber, new oe(Di(e.readTime), new xt(Ls(e.documentKey)), e.largestBatchId)) : re.empty(), s = t.fields.map((([t, e]) => new ie(mt.fromServerFormat(t), e))); - return new ee(t.indexId, t.collectionGroup, s, n); - }(t, n)); - })))).next((() => e)); - })); - } - getNextCollectionGroupToUpdate(t) { - return this.getFieldIndexes(t).next((t => 0 === t.length ? null : (t.sort(((t, e) => { - const n = t.indexState.sequenceNumber - e.indexState.sequenceNumber; - return 0 !== n ? n : rt(t.collectionGroup, e.collectionGroup); - })), t[0].collectionGroup))); - } - updateCollectionGroup(t, e, n) { - const s = rr(t), i = or(t); - return this.sn(t).next((t => s.Ut("collectionGroupIndex", IDBKeyRange.bound(e, e)).next((e => ui.forEach(e, (e => i.put(function(t, e, n, s) { - return { - indexId: t, - uid: e.uid || "", - sequenceNumber: n, - readTime: Si(s.readTime), - documentKey: $s(s.documentKey.path), - largestBatchId: s.largestBatchId - }; - }(e.indexId, this.user, t, n)))))))); - } - updateIndexEntries(t, e) { - // Porting Note: `getFieldIndexes()` on Web does not cache index lookups as - // it could be used across different IndexedDB transactions. As any cached - // data might be invalidated by other multi-tab clients, we can only trust - // data within a single IndexedDB transaction. We therefore add a cache - // here. - const n = new Map; - return ui.forEach(e, ((e, s) => { - const i = n.get(e.collectionGroup); - return (i ? ui.resolve(i) : this.getFieldIndexes(t, e.collectionGroup)).next((i => (n.set(e.collectionGroup, i), - ui.forEach(i, (n => this.rn(t, e, n).next((e => { - const i = this.on(s, n); - return e.isEqual(i) ? ui.resolve() : this.an(t, s, e, i); - }))))))); - })); - } - un(t, e, n) { - return ir(t).put({ - indexId: n.indexId, - uid: this.uid, - arrayValue: n.arrayValue, - directionalValue: n.directionalValue, - documentKey: $s(e.key.path) - }); - } - cn(t, e, n) { - return ir(t).delete([ n.indexId, this.uid, n.arrayValue, n.directionalValue, $s(e.key.path) ]); - } - rn(t, e, n) { - const s = ir(t); - let i = new kn(Ji); - return s.Wt({ - index: "documentKeyIndex", - range: IDBKeyRange.only([ n.indexId, this.uid, $s(e.path) ]) - }, ((t, s) => { - i = i.add(new Hi(n.indexId, e, s.arrayValue, s.directionalValue)); - })).next((() => i)); - } - /** Creates the index entries for the given document. */ on(t, e) { - let n = new kn(Ji); - const s = this.Ze(e, t); - if (null == s) return n; - const i = ne(e); - if (null != i) { - const r = t.data.field(i.fieldPath); - if (Gt(r)) for (const i of r.arrayValue.values || []) n = n.add(new Hi(e.indexId, t.key, this.He(i), s)); - } else n = n.add(new Hi(e.indexId, t.key, er, s)); - return n; - } - /** - * Updates the index entries for the provided document by deleting entries - * that are no longer referenced in `newEntries` and adding all newly added - * entries. - */ an(t, e, n, s) { - O("IndexedDbIndexManager", "Updating index entries for document '%s'", e.key); - const i = []; - return function(t, e, n, s, i) { - const r = t.getIterator(), o = e.getIterator(); - let a = On(r), u = On(o); - // Walk through the two sets at the same time, using the ordering defined by - // `comparator`. - for (;a || u; ) { - let t = !1, e = !1; - if (a && u) { - const s = n(a, u); - s < 0 ? - // The element was removed if the next element in our ordered - // walkthrough is only in `before`. - e = !0 : s > 0 && ( - // The element was added if the next element in our ordered walkthrough - // is only in `after`. - t = !0); - } else null != a ? e = !0 : t = !0; - t ? (s(u), u = On(o)) : e ? (i(a), a = On(r)) : (a = On(r), u = On(o)); - } - }(n, s, Ji, ( - /* onAdd= */ n => { - i.push(this.un(t, e, n)); - }), ( - /* onRemove= */ n => { - i.push(this.cn(t, e, n)); - })), ui.waitFor(i); - } - sn(t) { - let e = 1; - return or(t).Wt({ - index: "sequenceNumberIndex", - reverse: !0, - range: IDBKeyRange.upperBound([ this.uid, Number.MAX_SAFE_INTEGER ]) - }, ((t, n, s) => { - s.done(), e = n.sequenceNumber + 1; - })).next((() => e)); - } - /** - * Returns a new set of IDB ranges that splits the existing range and excludes - * any values that match the `notInValue` from these ranges. As an example, - * '[foo > 2 && foo != 3]` becomes `[foo > 2 && < 3, foo > 3]`. - */ createRange(t, e, n) { - // The notIb values need to be sorted and unique so that we can return a - // sorted set of non-overlapping ranges. - n = n.sort(((t, e) => Ji(t, e))).filter(((t, e, n) => !e || 0 !== Ji(t, n[e - 1]))); - const s = []; - s.push(t); - for (const i of n) { - const n = Ji(i, t), r = Ji(i, e); - if (0 === n) - // `notInValue` is the lower bound. We therefore need to raise the bound - // to the next value. - s[0] = t.ke(); else if (n > 0 && r < 0) - // `notInValue` is in the middle of the range - s.push(i), s.push(i.ke()); else if (r > 0) - // `notInValue` (and all following values) are out of the range - break; - } - s.push(e); - const i = []; - for (let t = 0; t < s.length; t += 2) i.push(IDBKeyRange.bound([ s[t].indexId, this.uid, s[t].arrayValue, s[t].directionalValue, "" ], [ s[t + 1].indexId, this.uid, s[t + 1].arrayValue, s[t + 1].directionalValue, "" ])); - return i; - } -} - -/** - * Helper to get a typed SimpleDbStore for the collectionParents - * document store. - */ function sr(t) { - return pi(t, "collectionParents"); -} - -/** - * Helper to get a typed SimpleDbStore for the index entry object store. - */ function ir(t) { - return pi(t, "indexEntries"); -} - -/** - * Helper to get a typed SimpleDbStore for the index configuration object store. - */ function rr(t) { - return pi(t, "indexConfiguration"); -} - -/** - * Helper to get a typed SimpleDbStore for the index state object store. - */ function or(t) { - return pi(t, "indexState"); -} - -/** - * @license - * Copyright 2018 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ const ar = { - didRun: !1, - sequenceNumbersCollected: 0, - targetsRemoved: 0, - documentsRemoved: 0 -}; - -class ur { - constructor( - // When we attempt to collect, we will only do so if the cache size is greater than this - // threshold. Passing `COLLECTION_DISABLED` here will cause collection to always be skipped. - t, - // The percentage of sequence numbers that we will attempt to collect - e, - // A cap on the total number of sequence numbers that will be collected. This prevents - // us from collecting a huge number of sequence numbers if the cache has grown very large. - n) { - this.cacheSizeCollectionThreshold = t, this.percentileToCollect = e, this.maximumSequenceNumbersToCollect = n; - } - static withCacheSize(t) { - return new ur(t, ur.DEFAULT_COLLECTION_PERCENTILE, ur.DEFAULT_MAX_SEQUENCE_NUMBERS_TO_COLLECT); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Delete a mutation batch and the associated document mutations. - * @returns A PersistencePromise of the document mutations that were removed. - */ -function cr(t, e, n) { - const s = t.store("mutations"), i = t.store("documentMutations"), r = [], o = IDBKeyRange.only(n.batchId); - let a = 0; - const u = s.Wt({ - range: o - }, ((t, e, n) => (a++, n.delete()))); - r.push(u.next((() => { - q(1 === a); - }))); - const c = []; - for (const t of n.mutations) { - const s = Ks(e, t.key.path, n.batchId); - r.push(i.delete(s)), c.push(t.key); - } - return ui.waitFor(r).next((() => c)); -} - -/** - * Returns an approximate size for the given document. - */ function hr(t) { - if (!t) return 0; - let e; - if (t.document) e = t.document; else if (t.unknownDocument) e = t.unknownDocument; else { - if (!t.noDocument) throw L(); - e = t.noDocument; - } - return JSON.stringify(e).length; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** A mutation queue for a specific user, backed by IndexedDB. */ ur.DEFAULT_COLLECTION_PERCENTILE = 10, -ur.DEFAULT_MAX_SEQUENCE_NUMBERS_TO_COLLECT = 1e3, ur.DEFAULT = new ur(41943040, ur.DEFAULT_COLLECTION_PERCENTILE, ur.DEFAULT_MAX_SEQUENCE_NUMBERS_TO_COLLECT), -ur.DISABLED = new ur(-1, 0, 0); - -class lr { - constructor( - /** - * The normalized userId (e.g. null UID => "" userId) used to store / - * retrieve mutations. - */ - t, e, n, s) { - this.userId = t, this.M = e, this.indexManager = n, this.referenceDelegate = s, - /** - * Caches the document keys for pending mutation batches. If the mutation - * has been removed from IndexedDb, the cached value may continue to - * be used to retrieve the batch's document keys. To remove a cached value - * locally, `removeCachedMutationKeys()` should be invoked either directly - * or through `removeMutationBatches()`. - * - * With multi-tab, when the primary client acknowledges or rejects a mutation, - * this cache is used by secondary clients to invalidate the local - * view of the documents that were previously affected by the mutation. - */ - // PORTING NOTE: Multi-tab only. - this.hn = {}; - } - /** - * Creates a new mutation queue for the given user. - * @param user - The user for which to create a mutation queue. - * @param serializer - The serializer to use when persisting to IndexedDb. - */ static Yt(t, e, n, s) { - // TODO(mcg): Figure out what constraints there are on userIDs - // In particular, are there any reserved characters? are empty ids allowed? - // For the moment store these together in the same mutations table assuming - // that empty userIDs aren't allowed. - q("" !== t.uid); - const i = t.isAuthenticated() ? t.uid : ""; - return new lr(i, e, n, s); - } - checkEmpty(t) { - let e = !0; - const n = IDBKeyRange.bound([ this.userId, Number.NEGATIVE_INFINITY ], [ this.userId, Number.POSITIVE_INFINITY ]); - return dr(t).Wt({ - index: "userMutationsIndex", - range: n - }, ((t, n, s) => { - e = !1, s.done(); - })).next((() => e)); - } - addMutationBatch(t, e, n, s) { - const i = _r(t), r = dr(t); - // The IndexedDb implementation in Chrome (and Firefox) does not handle - // compound indices that include auto-generated keys correctly. To ensure - // that the index entry is added correctly in all browsers, we perform two - // writes: The first write is used to retrieve the next auto-generated Batch - // ID, and the second write populates the index and stores the actual - // mutation batch. - // See: https://bugs.chromium.org/p/chromium/issues/detail?id=701972 - // We write an empty object to obtain key - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return r.add({}).next((o => { - q("number" == typeof o); - const a = new Ii(o, e, n, s), u = function(t, e, n) { - const s = n.baseMutations.map((e => Ts(t.Jt, e))), i = n.mutations.map((e => Ts(t.Jt, e))); - return { - userId: e, - batchId: n.batchId, - localWriteTimeMs: n.localWriteTime.toMillis(), - baseMutations: s, - mutations: i - }; - }(this.M, this.userId, a), c = []; - let h = new kn(((t, e) => rt(t.canonicalString(), e.canonicalString()))); - for (const t of s) { - const e = Ks(this.userId, t.key.path, o); - h = h.add(t.key.path.popLast()), c.push(r.put(u)), c.push(i.put(e, Gs)); - } - return h.forEach((e => { - c.push(this.indexManager.addToCollectionParentIndex(t, e)); - })), t.addOnCommittedListener((() => { - this.hn[o] = a.keys(); - })), ui.waitFor(c).next((() => a)); - })); - } - lookupMutationBatch(t, e) { - return dr(t).get(e).next((t => t ? (q(t.userId === this.userId), Ci(this.M, t)) : null)); - } - /** - * Returns the document keys for the mutation batch with the given batchId. - * For primary clients, this method returns `null` after - * `removeMutationBatches()` has been called. Secondary clients return a - * cached result until `removeCachedMutationKeys()` is invoked. - */ - // PORTING NOTE: Multi-tab only. - ln(t, e) { - return this.hn[e] ? ui.resolve(this.hn[e]) : this.lookupMutationBatch(t, e).next((t => { - if (t) { - const n = t.keys(); - return this.hn[e] = n, n; - } - return null; - })); - } - getNextMutationBatchAfterBatchId(t, e) { - const n = e + 1, s = IDBKeyRange.lowerBound([ this.userId, n ]); - let i = null; - return dr(t).Wt({ - index: "userMutationsIndex", - range: s - }, ((t, e, s) => { - e.userId === this.userId && (q(e.batchId >= n), i = Ci(this.M, e)), s.done(); - })).next((() => i)); - } - getHighestUnacknowledgedBatchId(t) { - const e = IDBKeyRange.upperBound([ this.userId, Number.POSITIVE_INFINITY ]); - let n = -1; - return dr(t).Wt({ - index: "userMutationsIndex", - range: e, - reverse: !0 - }, ((t, e, s) => { - n = e.batchId, s.done(); - })).next((() => n)); - } - getAllMutationBatches(t) { - const e = IDBKeyRange.bound([ this.userId, -1 ], [ this.userId, Number.POSITIVE_INFINITY ]); - return dr(t).Ut("userMutationsIndex", e).next((t => t.map((t => Ci(this.M, t))))); - } - getAllMutationBatchesAffectingDocumentKey(t, e) { - // Scan the document-mutation index starting with a prefix starting with - // the given documentKey. - const n = Us(this.userId, e.path), s = IDBKeyRange.lowerBound(n), i = []; - return _r(t).Wt({ - range: s - }, ((n, s, r) => { - const [o, a, u] = n, c = Ls(a); - // Only consider rows matching exactly the specific key of - // interest. Note that because we order by path first, and we - // order terminators before path separators, we'll encounter all - // the index rows for documentKey contiguously. In particular, all - // the rows for documentKey will occur before any rows for - // documents nested in a subcollection beneath documentKey so we - // can stop as soon as we hit any such row. - if (o === this.userId && e.path.isEqual(c)) - // Look up the mutation batch in the store. - return dr(t).get(u).next((t => { - if (!t) throw L(); - q(t.userId === this.userId), i.push(Ci(this.M, t)); - })); - r.done(); - })).next((() => i)); - } - getAllMutationBatchesAffectingDocumentKeys(t, e) { - let n = new kn(rt); - const s = []; - return e.forEach((e => { - const i = Us(this.userId, e.path), r = IDBKeyRange.lowerBound(i), o = _r(t).Wt({ - range: r - }, ((t, s, i) => { - const [r, o, a] = t, u = Ls(o); - // Only consider rows matching exactly the specific key of - // interest. Note that because we order by path first, and we - // order terminators before path separators, we'll encounter all - // the index rows for documentKey contiguously. In particular, all - // the rows for documentKey will occur before any rows for - // documents nested in a subcollection beneath documentKey so we - // can stop as soon as we hit any such row. - r === this.userId && e.path.isEqual(u) ? n = n.add(a) : i.done(); - })); - s.push(o); - })), ui.waitFor(s).next((() => this.fn(t, n))); - } - getAllMutationBatchesAffectingQuery(t, e) { - const n = e.path, s = n.length + 1, i = Us(this.userId, n), r = IDBKeyRange.lowerBound(i); - // Collect up unique batchIDs encountered during a scan of the index. Use a - // SortedSet to accumulate batch IDs so they can be traversed in order in a - // scan of the main table. - let o = new kn(rt); - return _r(t).Wt({ - range: r - }, ((t, e, i) => { - const [r, a, u] = t, c = Ls(a); - r === this.userId && n.isPrefixOf(c) ? - // Rows with document keys more than one segment longer than the - // query path can't be matches. For example, a query on 'rooms' - // can't match the document /rooms/abc/messages/xyx. - // TODO(mcg): we'll need a different scanner when we implement - // ancestor queries. - c.length === s && (o = o.add(u)) : i.done(); - })).next((() => this.fn(t, o))); - } - fn(t, e) { - const n = [], s = []; - // TODO(rockwood): Implement this using iterate. - return e.forEach((e => { - s.push(dr(t).get(e).next((t => { - if (null === t) throw L(); - q(t.userId === this.userId), n.push(Ci(this.M, t)); - }))); - })), ui.waitFor(s).next((() => n)); - } - removeMutationBatch(t, e) { - return cr(t.Ht, this.userId, e).next((n => (t.addOnCommittedListener((() => { - this.dn(e.batchId); - })), ui.forEach(n, (e => this.referenceDelegate.markPotentiallyOrphaned(t, e)))))); - } - /** - * Clears the cached keys for a mutation batch. This method should be - * called by secondary clients after they process mutation updates. - * - * Note that this method does not have to be called from primary clients as - * the corresponding cache entries are cleared when an acknowledged or - * rejected batch is removed from the mutation queue. - */ - // PORTING NOTE: Multi-tab only - dn(t) { - delete this.hn[t]; - } - performConsistencyCheck(t) { - return this.checkEmpty(t).next((e => { - if (!e) return ui.resolve(); - // Verify that there are no entries in the documentMutations index if - // the queue is empty. - const n = IDBKeyRange.lowerBound([ this.userId ]); - const s = []; - return _r(t).Wt({ - range: n - }, ((t, e, n) => { - if (t[0] === this.userId) { - const e = Ls(t[1]); - s.push(e); - } else n.done(); - })).next((() => { - q(0 === s.length); - })); - })); - } - containsKey(t, e) { - return fr(t, this.userId, e); - } - // PORTING NOTE: Multi-tab only (state is held in memory in other clients). - /** Returns the mutation queue's metadata from IndexedDb. */ - _n(t) { - return wr(t).get(this.userId).next((t => t || { - userId: this.userId, - lastAcknowledgedBatchId: -1, - lastStreamToken: "" - })); - } -} - -/** - * @returns true if the mutation queue for the given user contains a pending - * mutation for the given key. - */ function fr(t, e, n) { - const s = Us(e, n.path), i = s[1], r = IDBKeyRange.lowerBound(s); - let o = !1; - return _r(t).Wt({ - range: r, - jt: !0 - }, ((t, n, s) => { - const [r, a, /*batchID*/ u] = t; - r === e && a === i && (o = !0), s.done(); - })).next((() => o)); -} - -/** Returns true if any mutation queue contains the given document. */ -/** - * Helper to get a typed SimpleDbStore for the mutations object store. - */ -function dr(t) { - return pi(t, "mutations"); -} - -/** - * Helper to get a typed SimpleDbStore for the mutationQueues object store. - */ function _r(t) { - return pi(t, "documentMutations"); -} - -/** - * Helper to get a typed SimpleDbStore for the mutationQueues object store. - */ function wr(t) { - return pi(t, "mutationQueues"); -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** Offset to ensure non-overlapping target ids. */ -/** - * Generates monotonically increasing target IDs for sending targets to the - * watch stream. - * - * The client constructs two generators, one for the target cache, and one for - * for the sync engine (to generate limbo documents targets). These - * generators produce non-overlapping IDs (by using even and odd IDs - * respectively). - * - * By separating the target ID space, the query cache can generate target IDs - * that persist across client restarts, while sync engine can independently - * generate in-memory target IDs that are transient and can be reused after a - * restart. - */ -class mr { - constructor(t) { - this.wn = t; - } - next() { - return this.wn += 2, this.wn; - } - static mn() { - // The target cache generator must return '2' in its first call to `next()` - // as there is no differentiation in the protocol layer between an unset - // number and the number '0'. If we were to sent a target with target ID - // '0', the backend would consider it unset and replace it with its own ID. - return new mr(0); - } - static gn() { - // Sync engine assigns target IDs for limbo document detection. - return new mr(-1); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ class gr { - constructor(t, e) { - this.referenceDelegate = t, this.M = e; - } - // PORTING NOTE: We don't cache global metadata for the target cache, since - // some of it (in particular `highestTargetId`) can be modified by secondary - // tabs. We could perhaps be more granular (and e.g. still cache - // `lastRemoteSnapshotVersion` in memory) but for simplicity we currently go - // to IndexedDb whenever we need to read metadata. We can revisit if it turns - // out to have a meaningful performance impact. - allocateTargetId(t) { - return this.yn(t).next((e => { - const n = new mr(e.highestTargetId); - return e.highestTargetId = n.next(), this.pn(t, e).next((() => e.highestTargetId)); - })); - } - getLastRemoteSnapshotVersion(t) { - return this.yn(t).next((t => ct.fromTimestamp(new ut(t.lastRemoteSnapshotVersion.seconds, t.lastRemoteSnapshotVersion.nanoseconds)))); - } - getHighestSequenceNumber(t) { - return this.yn(t).next((t => t.highestListenSequenceNumber)); - } - setTargetsMetadata(t, e, n) { - return this.yn(t).next((s => (s.highestListenSequenceNumber = e, n && (s.lastRemoteSnapshotVersion = n.toTimestamp()), - e > s.highestListenSequenceNumber && (s.highestListenSequenceNumber = e), this.pn(t, s)))); - } - addTargetData(t, e) { - return this.In(t, e).next((() => this.yn(t).next((n => (n.targetCount += 1, this.Tn(e, n), - this.pn(t, n)))))); - } - updateTargetData(t, e) { - return this.In(t, e); - } - removeTargetData(t, e) { - return this.removeMatchingKeysForTargetId(t, e.targetId).next((() => yr(t).delete(e.targetId))).next((() => this.yn(t))).next((e => (q(e.targetCount > 0), - e.targetCount -= 1, this.pn(t, e)))); - } - /** - * Drops any targets with sequence number less than or equal to the upper bound, excepting those - * present in `activeTargetIds`. Document associations for the removed targets are also removed. - * Returns the number of targets removed. - */ removeTargets(t, e, n) { - let s = 0; - const i = []; - return yr(t).Wt(((r, o) => { - const a = xi(o); - a.sequenceNumber <= e && null === n.get(a.targetId) && (s++, i.push(this.removeTargetData(t, a))); - })).next((() => ui.waitFor(i))).next((() => s)); - } - /** - * Call provided function with each `TargetData` that we have cached. - */ forEachTarget(t, e) { - return yr(t).Wt(((t, n) => { - const s = xi(n); - e(s); - })); - } - yn(t) { - return pr(t).get("targetGlobalKey").next((t => (q(null !== t), t))); - } - pn(t, e) { - return pr(t).put("targetGlobalKey", e); - } - In(t, e) { - return yr(t).put(Ni(this.M, e)); - } - /** - * In-place updates the provided metadata to account for values in the given - * TargetData. Saving is done separately. Returns true if there were any - * changes to the metadata. - */ Tn(t, e) { - let n = !1; - return t.targetId > e.highestTargetId && (e.highestTargetId = t.targetId, n = !0), - t.sequenceNumber > e.highestListenSequenceNumber && (e.highestListenSequenceNumber = t.sequenceNumber, - n = !0), n; - } - getTargetCount(t) { - return this.yn(t).next((t => t.targetCount)); - } - getTargetData(t, e) { - // Iterating by the canonicalId may yield more than one result because - // canonicalId values are not required to be unique per target. This query - // depends on the queryTargets index to be efficient. - const n = ce(e), s = IDBKeyRange.bound([ n, Number.NEGATIVE_INFINITY ], [ n, Number.POSITIVE_INFINITY ]); - let i = null; - return yr(t).Wt({ - range: s, - index: "queryTargetsIndex" - }, ((t, n, s) => { - const r = xi(n); - // After finding a potential match, check that the target is - // actually equal to the requested target. - le(e, r.target) && (i = r, s.done()); - })).next((() => i)); - } - addMatchingKeys(t, e, n) { - // PORTING NOTE: The reverse index (documentsTargets) is maintained by - // IndexedDb. - const s = [], i = Ir(t); - return e.forEach((e => { - const r = $s(e.path); - s.push(i.put({ - targetId: n, - path: r - })), s.push(this.referenceDelegate.addReference(t, n, e)); - })), ui.waitFor(s); - } - removeMatchingKeys(t, e, n) { - // PORTING NOTE: The reverse index (documentsTargets) is maintained by - // IndexedDb. - const s = Ir(t); - return ui.forEach(e, (e => { - const i = $s(e.path); - return ui.waitFor([ s.delete([ n, i ]), this.referenceDelegate.removeReference(t, n, e) ]); - })); - } - removeMatchingKeysForTargetId(t, e) { - const n = Ir(t), s = IDBKeyRange.bound([ e ], [ e + 1 ], - /*lowerOpen=*/ !1, - /*upperOpen=*/ !0); - return n.delete(s); - } - getMatchingKeysForTargetId(t, e) { - const n = IDBKeyRange.bound([ e ], [ e + 1 ], - /*lowerOpen=*/ !1, - /*upperOpen=*/ !0), s = Ir(t); - let i = Gn(); - return s.Wt({ - range: n, - jt: !0 - }, ((t, e, n) => { - const s = Ls(t[1]), r = new xt(s); - i = i.add(r); - })).next((() => i)); - } - containsKey(t, e) { - const n = $s(e.path), s = IDBKeyRange.bound([ n ], [ at(n) ], - /*lowerOpen=*/ !1, - /*upperOpen=*/ !0); - let i = 0; - return Ir(t).Wt({ - index: "documentTargetsIndex", - jt: !0, - range: s - }, (([t, e], n, s) => { - // Having a sentinel row for a document does not count as containing that document; - // For the target cache, containing the document means the document is part of some - // target. - 0 !== t && (i++, s.done()); - })).next((() => i > 0)); - } - /** - * Looks up a TargetData entry by target ID. - * - * @param targetId - The target ID of the TargetData entry to look up. - * @returns The cached TargetData entry, or null if the cache has no entry for - * the target. - */ - // PORTING NOTE: Multi-tab only. - Et(t, e) { - return yr(t).get(e).next((t => t ? xi(t) : null)); - } -} - -/** - * Helper to get a typed SimpleDbStore for the queries object store. - */ function yr(t) { - return pi(t, "targets"); -} - -/** - * Helper to get a typed SimpleDbStore for the target globals object store. - */ function pr(t) { - return pi(t, "targetGlobal"); -} - -/** - * Helper to get a typed SimpleDbStore for the document target object store. - */ function Ir(t) { - return pi(t, "targetDocuments"); -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Verifies the error thrown by a LocalStore operation. If a LocalStore - * operation fails because the primary lease has been taken by another client, - * we ignore the error (the persistence layer will immediately call - * `applyPrimaryLease` to propagate the primary state change). All other errors - * are re-thrown. - * - * @param err - An error returned by a LocalStore operation. - * @returns A Promise that resolves after we recovered, or the original error. - */ async function Tr(t) { - if (t.code !== G.FAILED_PRECONDITION || t.message !== oi) throw t; - O("LocalStore", "Unexpectedly lost primary lease"); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ function Er([t, e], [n, s]) { - const i = rt(t, n); - return 0 === i ? rt(e, s) : i; -} - -/** - * Used to calculate the nth sequence number. Keeps a rolling buffer of the - * lowest n values passed to `addElement`, and finally reports the largest of - * them in `maxValue`. - */ class Ar { - constructor(t) { - this.En = t, this.buffer = new kn(Er), this.An = 0; - } - Rn() { - return ++this.An; - } - bn(t) { - const e = [ t, this.Rn() ]; - if (this.buffer.size < this.En) this.buffer = this.buffer.add(e); else { - const t = this.buffer.last(); - Er(e, t) < 0 && (this.buffer = this.buffer.delete(t).add(e)); - } - } - get maxValue() { - // Guaranteed to be non-empty. If we decide we are not collecting any - // sequence numbers, nthSequenceNumber below short-circuits. If we have - // decided that we are collecting n sequence numbers, it's because n is some - // percentage of the existing sequence numbers. That means we should never - // be in a situation where we are collecting sequence numbers but don't - // actually have any. - return this.buffer.last()[0]; - } -} - -/** - * This class is responsible for the scheduling of LRU garbage collection. It handles checking - * whether or not GC is enabled, as well as which delay to use before the next run. - */ class Rr { - constructor(t, e) { - this.garbageCollector = t, this.asyncQueue = e, this.Pn = !1, this.Vn = null; - } - start(t) { - -1 !== this.garbageCollector.params.cacheSizeCollectionThreshold && this.vn(t); - } - stop() { - this.Vn && (this.Vn.cancel(), this.Vn = null); - } - get started() { - return null !== this.Vn; - } - vn(t) { - const e = this.Pn ? 3e5 : 6e4; - O("LruGarbageCollector", `Garbage collection scheduled in ${e}ms`), this.Vn = this.asyncQueue.enqueueAfterDelay("lru_garbage_collection" /* LruGarbageCollection */ , e, (async () => { - this.Vn = null, this.Pn = !0; - try { - await t.collectGarbage(this.garbageCollector); - } catch (t) { - di(t) ? O("LruGarbageCollector", "Ignoring IndexedDB error during garbage collection: ", t) : await Tr(t); - } - await this.vn(t); - })); - } -} - -/** Implements the steps for LRU garbage collection. */ class br { - constructor(t, e) { - this.Sn = t, this.params = e; - } - calculateTargetCount(t, e) { - return this.Sn.Dn(t).next((t => Math.floor(e / 100 * t))); - } - nthSequenceNumber(t, e) { - if (0 === e) return ui.resolve(nt.A); - const n = new Ar(e); - return this.Sn.forEachTarget(t, (t => n.bn(t.sequenceNumber))).next((() => this.Sn.Cn(t, (t => n.bn(t))))).next((() => n.maxValue)); - } - removeTargets(t, e, n) { - return this.Sn.removeTargets(t, e, n); - } - removeOrphanedDocuments(t, e) { - return this.Sn.removeOrphanedDocuments(t, e); - } - collect(t, e) { - return -1 === this.params.cacheSizeCollectionThreshold ? (O("LruGarbageCollector", "Garbage collection skipped; disabled"), - ui.resolve(ar)) : this.getCacheSize(t).next((n => n < this.params.cacheSizeCollectionThreshold ? (O("LruGarbageCollector", `Garbage collection skipped; Cache size ${n} is lower than threshold ${this.params.cacheSizeCollectionThreshold}`), - ar) : this.xn(t, e))); - } - getCacheSize(t) { - return this.Sn.getCacheSize(t); - } - xn(t, e) { - let n, s, i, r, o, u, c; - const h = Date.now(); - return this.calculateTargetCount(t, this.params.percentileToCollect).next((e => ( - // Cap at the configured max - e > this.params.maximumSequenceNumbersToCollect ? (O("LruGarbageCollector", `Capping sequence numbers to collect down to the maximum of ${this.params.maximumSequenceNumbersToCollect} from ${e}`), - s = this.params.maximumSequenceNumbersToCollect) : s = e, r = Date.now(), this.nthSequenceNumber(t, s)))).next((s => (n = s, - o = Date.now(), this.removeTargets(t, n, e)))).next((e => (i = e, u = Date.now(), - this.removeOrphanedDocuments(t, n)))).next((t => { - if (c = Date.now(), k() <= _firebase_logger__WEBPACK_IMPORTED_MODULE_2__.LogLevel.DEBUG) { - O("LruGarbageCollector", `LRU Garbage Collection\n\tCounted targets in ${r - h}ms\n\tDetermined least recently used ${s} in ` + (o - r) + "ms\n" + `\tRemoved ${i} targets in ` + (u - o) + "ms\n" + `\tRemoved ${t} documents in ` + (c - u) + "ms\n" + `Total Duration: ${c - h}ms`); - } - return ui.resolve({ - didRun: !0, - sequenceNumbersCollected: s, - targetsRemoved: i, - documentsRemoved: t - }); - })); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** Provides LRU functionality for IndexedDB persistence. */ -class Pr { - constructor(t, e) { - this.db = t, this.garbageCollector = function(t, e) { - return new br(t, e); - }(this, e); - } - Dn(t) { - const e = this.Nn(t); - return this.db.getTargetCache().getTargetCount(t).next((t => e.next((e => t + e)))); - } - Nn(t) { - let e = 0; - return this.Cn(t, (t => { - e++; - })).next((() => e)); - } - forEachTarget(t, e) { - return this.db.getTargetCache().forEachTarget(t, e); - } - Cn(t, e) { - return this.kn(t, ((t, n) => e(n))); - } - addReference(t, e, n) { - return Vr(t, n); - } - removeReference(t, e, n) { - return Vr(t, n); - } - removeTargets(t, e, n) { - return this.db.getTargetCache().removeTargets(t, e, n); - } - markPotentiallyOrphaned(t, e) { - return Vr(t, e); - } - /** - * Returns true if anything would prevent this document from being garbage - * collected, given that the document in question is not present in any - * targets and has a sequence number less than or equal to the upper bound for - * the collection run. - */ Mn(t, e) { - return function(t, e) { - let n = !1; - return wr(t).zt((s => fr(t, s, e).next((t => (t && (n = !0), ui.resolve(!t)))))).next((() => n)); - }(t, e); - } - removeOrphanedDocuments(t, e) { - const n = this.db.getRemoteDocumentCache().newChangeBuffer(), s = []; - let i = 0; - return this.kn(t, ((r, o) => { - if (o <= e) { - const e = this.Mn(t, r).next((e => { - if (!e) - // Our size accounting requires us to read all documents before - // removing them. - return i++, n.getEntry(t, r).next((() => (n.removeEntry(r, ct.min()), Ir(t).delete([ 0, $s(r.path) ])))); - })); - s.push(e); - } - })).next((() => ui.waitFor(s))).next((() => n.apply(t))).next((() => i)); - } - removeTarget(t, e) { - const n = e.withSequenceNumber(t.currentSequenceNumber); - return this.db.getTargetCache().updateTargetData(t, n); - } - updateLimboDocument(t, e) { - return Vr(t, e); - } - /** - * Call provided function for each document in the cache that is 'orphaned'. Orphaned - * means not a part of any target, so the only entry in the target-document index for - * that document will be the sentinel row (targetId 0), which will also have the sequence - * number for the last time the document was accessed. - */ kn(t, e) { - const n = Ir(t); - let s, i = nt.A; - return n.Wt({ - index: "documentTargetsIndex" - }, (([t, n], {path: r, sequenceNumber: o}) => { - 0 === t ? ( - // if nextToReport is valid, report it, this is a new key so the - // last one must not be a member of any targets. - i !== nt.A && e(new xt(Ls(s)), i), - // set nextToReport to be this sequence number. It's the next one we - // might report, if we don't find any targets for this document. - // Note that the sequence number must be defined when the targetId - // is 0. - i = o, s = r) : - // set nextToReport to be invalid, we know we don't need to report - // this one since we found a target for it. - i = nt.A; - })).next((() => { - // Since we report sequence numbers after getting to the next key, we - // need to check if the last key we iterated over was an orphaned - // document and report it. - i !== nt.A && e(new xt(Ls(s)), i); - })); - } - getCacheSize(t) { - return this.db.getRemoteDocumentCache().getSize(t); - } -} - -function Vr(t, e) { - return Ir(t).put( - /** - * @returns A value suitable for writing a sentinel row in the target-document - * store. - */ - function(t, e) { - return { - targetId: 0, - path: $s(t.path), - sequenceNumber: e - }; - }(e, t.currentSequenceNumber)); -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * An in-memory buffer of entries to be written to a RemoteDocumentCache. - * It can be used to batch up a set of changes to be written to the cache, but - * additionally supports reading entries back with the `getEntry()` method, - * falling back to the underlying RemoteDocumentCache if no entry is - * buffered. - * - * Entries added to the cache *must* be read first. This is to facilitate - * calculating the size delta of the pending changes. - * - * PORTING NOTE: This class was implemented then removed from other platforms. - * If byte-counting ends up being needed on the other platforms, consider - * porting this class as part of that implementation work. - */ class vr { - constructor() { - // A mapping of document key to the new cache entry that should be written. - this.changes = new Dn((t => t.toString()), ((t, e) => t.isEqual(e))), this.changesApplied = !1; - } - /** - * Buffers a `RemoteDocumentCache.addEntry()` call. - * - * You can only modify documents that have already been retrieved via - * `getEntry()/getEntries()` (enforced via IndexedDbs `apply()`). - */ addEntry(t) { - this.assertNotApplied(), this.changes.set(t.key, t); - } - /** - * Buffers a `RemoteDocumentCache.removeEntry()` call. - * - * You can only remove documents that have already been retrieved via - * `getEntry()/getEntries()` (enforced via IndexedDbs `apply()`). - */ removeEntry(t, e) { - this.assertNotApplied(), this.changes.set(t, te.newInvalidDocument(t).setReadTime(e)); - } - /** - * Looks up an entry in the cache. The buffered changes will first be checked, - * and if no buffered change applies, this will forward to - * `RemoteDocumentCache.getEntry()`. - * - * @param transaction - The transaction in which to perform any persistence - * operations. - * @param documentKey - The key of the entry to look up. - * @returns The cached document or an invalid document if we have nothing - * cached. - */ getEntry(t, e) { - this.assertNotApplied(); - const n = this.changes.get(e); - return void 0 !== n ? ui.resolve(n) : this.getFromCache(t, e); - } - /** - * Looks up several entries in the cache, forwarding to - * `RemoteDocumentCache.getEntry()`. - * - * @param transaction - The transaction in which to perform any persistence - * operations. - * @param documentKeys - The keys of the entries to look up. - * @returns A map of cached documents, indexed by key. If an entry cannot be - * found, the corresponding key will be mapped to an invalid document. - */ getEntries(t, e) { - return this.getAllFromCache(t, e); - } - /** - * Applies buffered changes to the underlying RemoteDocumentCache, using - * the provided transaction. - */ apply(t) { - return this.assertNotApplied(), this.changesApplied = !0, this.applyChanges(t); - } - /** Helper to assert this.changes is not null */ assertNotApplied() {} -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * The RemoteDocumentCache for IndexedDb. To construct, invoke - * `newIndexedDbRemoteDocumentCache()`. - */ class Sr { - constructor(t) { - this.M = t; - } - setIndexManager(t) { - this.indexManager = t; - } - /** - * Adds the supplied entries to the cache. - * - * All calls of `addEntry` are required to go through the RemoteDocumentChangeBuffer - * returned by `newChangeBuffer()` to ensure proper accounting of metadata. - */ addEntry(t, e, n) { - return xr(t).put(Nr(e), n); - } - /** - * Removes a document from the cache. - * - * All calls of `removeEntry` are required to go through the RemoteDocumentChangeBuffer - * returned by `newChangeBuffer()` to ensure proper accounting of metadata. - */ removeEntry(t, e) { - const n = xr(t), s = Nr(e); - return n.delete(s); - } - /** - * Updates the current cache size. - * - * Callers to `addEntry()` and `removeEntry()` *must* call this afterwards to update the - * cache's metadata. - */ updateMetadata(t, e) { - return this.getMetadata(t).next((n => (n.byteSize += e, this.On(t, n)))); - } - getEntry(t, e) { - return xr(t).get(Nr(e)).next((t => this.$n(e, t))); - } - /** - * Looks up an entry in the cache. - * - * @param documentKey - The key of the entry to look up. - * @returns The cached document entry and its size. - */ Fn(t, e) { - return xr(t).get(Nr(e)).next((t => ({ - document: this.$n(e, t), - size: hr(t) - }))); - } - getEntries(t, e) { - let n = Fn(); - return this.Bn(t, e, ((t, e) => { - const s = this.$n(t, e); - n = n.insert(t, s); - })).next((() => n)); - } - /** - * Looks up several entries in the cache. - * - * @param documentKeys - The set of keys entries to look up. - * @returns A map of documents indexed by key and a map of sizes indexed by - * key (zero if the document does not exist). - */ Ln(t, e) { - let n = Fn(), s = new Cn(xt.comparator); - return this.Bn(t, e, ((t, e) => { - const i = this.$n(t, e); - n = n.insert(t, i), s = s.insert(t, hr(e)); - })).next((() => ({ - documents: n, - qn: s - }))); - } - Bn(t, e, n) { - if (e.isEmpty()) return ui.resolve(); - const s = IDBKeyRange.bound(e.first().path.toArray(), e.last().path.toArray()), i = e.getIterator(); - let r = i.getNext(); - return xr(t).Wt({ - range: s - }, ((t, e, s) => { - const o = xt.fromSegments(t); - // Go through keys not found in cache. - for (;r && xt.comparator(r, o) < 0; ) n(r, null), r = i.getNext(); - r && r.isEqual(o) && ( - // Key found in cache. - n(r, e), r = i.hasNext() ? i.getNext() : null), - // Skip to the next key (if there is one). - r ? s.qt(r.path.toArray()) : s.done(); - })).next((() => { - // The rest of the keys are not in the cache. One case where `iterate` - // above won't go through them is when the cache is empty. - for (;r; ) n(r, null), r = i.hasNext() ? i.getNext() : null; - })); - } - getAll(t, e, n) { - let s = Fn(); - const i = e.length + 1, r = {}; - if (n.isEqual(ct.min())) { - // Documents are ordered by key, so we can use a prefix scan to narrow - // down the documents we need to match the query against. - const t = e.toArray(); - r.range = IDBKeyRange.lowerBound(t); - } else { - // Execute an index-free query and filter by read time. This is safe - // since all document changes to queries that have a - // lastLimboFreeSnapshotVersion (`sinceReadTime`) have a read time set. - const t = e.toArray(), s = Vi(n); - r.range = IDBKeyRange.lowerBound([ t, s ], - /* open= */ !0), r.index = "collectionReadTimeIndex"; - } - return xr(t).Wt(r, ((t, n, r) => { - // The query is actually returning any path that starts with the query - // path prefix which may include documents in subcollections. For - // example, a query on 'rooms' will return rooms/abc/messages/xyx but we - // shouldn't match it. Fix this by discarding rows with document keys - // more than one segment longer than the query path. - if (t.length !== i) return; - const o = this.$n(xt.fromSegments(t), n); - e.isPrefixOf(o.key.path) ? s = s.insert(o.key, o) : r.done(); - })).next((() => s)); - } - newChangeBuffer(t) { - return new Dr(this, !!t && t.trackRemovals); - } - getSize(t) { - return this.getMetadata(t).next((t => t.byteSize)); - } - getMetadata(t) { - return Cr(t).get("remoteDocumentGlobalKey").next((t => (q(!!t), t))); - } - On(t, e) { - return Cr(t).put("remoteDocumentGlobalKey", e); - } - /** - * Decodes `dbRemoteDoc` and returns the document (or an invalid document if - * the document corresponds to the format used for sentinel deletes). - */ $n(t, e) { - if (e) { - const t = bi(this.M, e); - // Whether the document is a sentinel removal and should only be used in the - // `getNewDocumentChanges()` - if (!(t.isNoDocument() && t.version.isEqual(ct.min()))) return t; - } - return te.newInvalidDocument(t); - } -} - -/** Creates a new IndexedDbRemoteDocumentCache. */ -/** - * Handles the details of adding and updating documents in the IndexedDbRemoteDocumentCache. - * - * Unlike the MemoryRemoteDocumentChangeBuffer, the IndexedDb implementation computes the size - * delta for all submitted changes. This avoids having to re-read all documents from IndexedDb - * when we apply the changes. - */ -class Dr extends vr { - /** - * @param documentCache - The IndexedDbRemoteDocumentCache to apply the changes to. - * @param trackRemovals - Whether to create sentinel deletes that can be tracked by - * `getNewDocumentChanges()`. - */ - constructor(t, e) { - super(), this.Un = t, this.trackRemovals = e, - // A map of document sizes prior to applying the changes in this buffer. - this.Kn = new Dn((t => t.toString()), ((t, e) => t.isEqual(e))); - } - applyChanges(t) { - const e = []; - let n = 0, s = new kn(((t, e) => rt(t.canonicalString(), e.canonicalString()))); - return this.changes.forEach(((i, r) => { - const o = this.Kn.get(i); - if (r.isValidDocument()) { - const a = Pi(this.Un.M, r); - s = s.add(i.path.popLast()); - const u = hr(a); - n += u - o, e.push(this.Un.addEntry(t, i, a)); - } else if (n -= o, this.trackRemovals) { - // In order to track removals, we store a "sentinel delete" in the - // RemoteDocumentCache. This entry is represented by a NoDocument - // with a version of 0 and ignored by `maybeDecodeDocument()` but - // preserved in `getNewDocumentChanges()`. - const n = Pi(this.Un.M, r.convertToNoDocument(ct.min())); - e.push(this.Un.addEntry(t, i, n)); - } else e.push(this.Un.removeEntry(t, i)); - })), s.forEach((n => { - e.push(this.Un.indexManager.addToCollectionParentIndex(t, n)); - })), e.push(this.Un.updateMetadata(t, n)), ui.waitFor(e); - } - getFromCache(t, e) { - // Record the size of everything we load from the cache so we can compute a delta later. - return this.Un.Fn(t, e).next((t => (this.Kn.set(e, t.size), t.document))); - } - getAllFromCache(t, e) { - // Record the size of everything we load from the cache so we can compute - // a delta later. - return this.Un.Ln(t, e).next((({documents: t, qn: e}) => ( - // Note: `getAllFromCache` returns two maps instead of a single map from - // keys to `DocumentSizeEntry`s. This is to allow returning the - // `MutableDocumentMap` directly, without a conversion. - e.forEach(((t, e) => { - this.Kn.set(t, e); - })), t))); - } -} - -function Cr(t) { - return pi(t, "remoteDocumentGlobal"); -} - -/** - * Helper to get a typed SimpleDbStore for the remoteDocuments object store. - */ function xr(t) { - return pi(t, "remoteDocuments"); -} - -function Nr(t) { - return t.path.toArray(); -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -// TODO(indexing): Remove this constant -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** Performs database creation and schema upgrades. */ -class kr { - constructor(t) { - this.M = t; - } - /** - * Performs database creation and schema upgrades. - * - * Note that in production, this method is only ever used to upgrade the schema - * to SCHEMA_VERSION. Different values of toVersion are only used for testing - * and local feature development. - */ kt(t, e, n, s) { - const i = new ci("createOrUpgrade", e); - n < 1 && s >= 1 && (function(t) { - t.createObjectStore("owner"); - }(t), function(t) { - t.createObjectStore("mutationQueues", { - keyPath: "userId" - }); - t.createObjectStore("mutations", { - keyPath: "batchId", - autoIncrement: !0 - }).createIndex("userMutationsIndex", qs, { - unique: !0 - }), t.createObjectStore("documentMutations"); - } - /** - * Upgrade function to migrate the 'mutations' store from V1 to V3. Loads - * and rewrites all data. - */ (t), Mr(t), function(t) { - t.createObjectStore("remoteDocuments"); - }(t)); - // Migration 2 to populate the targetGlobal object no longer needed since - // migration 3 unconditionally clears it. - let r = ui.resolve(); - return n < 3 && s >= 3 && ( - // Brand new clients don't need to drop and recreate--only clients that - // potentially have corrupt data. - 0 !== n && (!function(t) { - t.deleteObjectStore("targetDocuments"), t.deleteObjectStore("targets"), t.deleteObjectStore("targetGlobal"); - }(t), Mr(t)), r = r.next((() => - /** - * Creates the target global singleton row. - * - * @param txn - The version upgrade transaction for indexeddb - */ - function(t) { - const e = t.store("targetGlobal"), n = { - highestTargetId: 0, - highestListenSequenceNumber: 0, - lastRemoteSnapshotVersion: ct.min().toTimestamp(), - targetCount: 0 - }; - return e.put("targetGlobalKey", n); - } - /** - * Creates indices on the RemoteDocuments store used for both multi-tab - * and Index-Free queries. - */ (i)))), n < 4 && s >= 4 && (0 !== n && ( - // Schema version 3 uses auto-generated keys to generate globally unique - // mutation batch IDs (this was previously ensured internally by the - // client). To migrate to the new schema, we have to read all mutations - // and write them back out. We preserve the existing batch IDs to guarantee - // consistency with other object stores. Any further mutation batch IDs will - // be auto-generated. - r = r.next((() => function(t, e) { - return e.store("mutations").Ut().next((n => { - t.deleteObjectStore("mutations"); - t.createObjectStore("mutations", { - keyPath: "batchId", - autoIncrement: !0 - }).createIndex("userMutationsIndex", qs, { - unique: !0 - }); - const s = e.store("mutations"), i = n.map((t => s.put(t))); - return ui.waitFor(i); - })); - }(t, i)))), r = r.next((() => { - !function(t) { - t.createObjectStore("clientMetadata", { - keyPath: "clientId" - }); - }(t); - }))), n < 5 && s >= 5 && (r = r.next((() => this.Gn(i)))), n < 6 && s >= 6 && (r = r.next((() => (function(t) { - t.createObjectStore("remoteDocumentGlobal"); - }(t), this.Qn(i))))), n < 7 && s >= 7 && (r = r.next((() => this.jn(i)))), n < 8 && s >= 8 && (r = r.next((() => this.Wn(t, i)))), - n < 9 && s >= 9 && (r = r.next((() => { - // Multi-Tab used to manage its own changelog, but this has been moved - // to the DbRemoteDocument object store itself. Since the previous change - // log only contained transient data, we can drop its object store. - !function(t) { - t.objectStoreNames.contains("remoteDocumentChanges") && t.deleteObjectStore("remoteDocumentChanges"); - }(t), function(t) { - const e = t.objectStore("remoteDocuments"); - e.createIndex("readTimeIndex", "readTime", { - unique: !1 - }), e.createIndex("collectionReadTimeIndex", Qs, { - unique: !1 - }); - }(e); - }))), n < 10 && s >= 10 && (r = r.next((() => this.zn(i)))), n < 11 && s >= 11 && (r = r.next((() => { - !function(t) { - t.createObjectStore("bundles", { - keyPath: "bundleId" - }); - }(t), function(t) { - t.createObjectStore("namedQueries", { - keyPath: "name" - }); - }(t); - }))), n < 12 && s >= 12 && (r = r.next((() => { - !function(t) { - const e = t.createObjectStore("documentOverlays", { - keyPath: ti - }); - e.createIndex("collectionPathOverlayIndex", ei, { - unique: !1 - }), e.createIndex("collectionGroupOverlayIndex", ni, { - unique: !1 - }); - } - /** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ (t); - }))), n < 13 && s >= 13 && (r = r.next((() => { - !function(t) { - t.createObjectStore("indexConfiguration", { - keyPath: "indexId", - autoIncrement: !0 - }).createIndex("collectionGroupIndex", "collectionGroup", { - unique: !1 - }); - t.createObjectStore("indexState", { - keyPath: Js - }).createIndex("sequenceNumberIndex", Ys, { - unique: !1 - }); - t.createObjectStore("indexEntries", { - keyPath: Xs - }).createIndex("documentKeyIndex", Zs, { - unique: !1 - }); - }(t); - }))), r; - } - Qn(t) { - let e = 0; - return t.store("remoteDocuments").Wt(((t, n) => { - e += hr(n); - })).next((() => { - const n = { - byteSize: e - }; - return t.store("remoteDocumentGlobal").put("remoteDocumentGlobalKey", n); - })); - } - Gn(t) { - const e = t.store("mutationQueues"), n = t.store("mutations"); - return e.Ut().next((e => ui.forEach(e, (e => { - const s = IDBKeyRange.bound([ e.userId, -1 ], [ e.userId, e.lastAcknowledgedBatchId ]); - return n.Ut("userMutationsIndex", s).next((n => ui.forEach(n, (n => { - q(n.userId === e.userId); - const s = Ci(this.M, n); - return cr(t, e.userId, s).next((() => {})); - })))); - })))); - } - /** - * Ensures that every document in the remote document cache has a corresponding sentinel row - * with a sequence number. Missing rows are given the most recently used sequence number. - */ jn(t) { - const e = t.store("targetDocuments"), n = t.store("remoteDocuments"); - return t.store("targetGlobal").get("targetGlobalKey").next((t => { - const s = []; - return n.Wt(((n, i) => { - const r = new _t(n), o = function(t) { - return [ 0, $s(t) ]; - }(r); - s.push(e.get(o).next((n => n ? ui.resolve() : (n => e.put({ - targetId: 0, - path: $s(n), - sequenceNumber: t.highestListenSequenceNumber - }))(r)))); - })).next((() => ui.waitFor(s))); - })); - } - Wn(t, e) { - // Create the index. - t.createObjectStore("collectionParents", { - keyPath: Hs - }); - const n = e.store("collectionParents"), s = new tr, i = t => { - if (s.add(t)) { - const e = t.lastSegment(), s = t.popLast(); - return n.put({ - collectionId: e, - parent: $s(s) - }); - } - }; - // Helper to add an index entry iff we haven't already written it. - // Index existing remote documents. - return e.store("remoteDocuments").Wt({ - jt: !0 - }, ((t, e) => { - const n = new _t(t); - return i(n.popLast()); - })).next((() => e.store("documentMutations").Wt({ - jt: !0 - }, (([t, e, n], s) => { - const r = Ls(e); - return i(r.popLast()); - })))); - } - zn(t) { - const e = t.store("targets"); - return e.Wt(((t, n) => { - const s = xi(n), i = Ni(this.M, s); - return e.put(i); - })); - } -} - -function Mr(t) { - t.createObjectStore("targetDocuments", { - keyPath: Ws - }).createIndex("documentTargetsIndex", zs, { - unique: !0 - }); - // NOTE: This is unique only because the TargetId is the suffix. - t.createObjectStore("targets", { - keyPath: "targetId" - }).createIndex("queryTargetsIndex", js, { - unique: !0 - }), t.createObjectStore("targetGlobal"); -} - -const Or = "Failed to obtain exclusive access to the persistence layer. To allow shared access, multi-tab synchronization has to be enabled in all tabs. If you are using `experimentalForceOwningTab:true`, make sure that only one tab has persistence enabled at any given time."; - -/** - * Oldest acceptable age in milliseconds for client metadata before the client - * is considered inactive and its associated data is garbage collected. - */ -/** - * An IndexedDB-backed instance of Persistence. Data is stored persistently - * across sessions. - * - * On Web only, the Firestore SDKs support shared access to its persistence - * layer. This allows multiple browser tabs to read and write to IndexedDb and - * to synchronize state even without network connectivity. Shared access is - * currently optional and not enabled unless all clients invoke - * `enablePersistence()` with `{synchronizeTabs:true}`. - * - * In multi-tab mode, if multiple clients are active at the same time, the SDK - * will designate one client as the “primary client”. An effort is made to pick - * a visible, network-connected and active client, and this client is - * responsible for letting other clients know about its presence. The primary - * client writes a unique client-generated identifier (the client ID) to - * IndexedDb’s “owner” store every 4 seconds. If the primary client fails to - * update this entry, another client can acquire the lease and take over as - * primary. - * - * Some persistence operations in the SDK are designated as primary-client only - * operations. This includes the acknowledgment of mutations and all updates of - * remote documents. The effects of these operations are written to persistence - * and then broadcast to other tabs via LocalStorage (see - * `WebStorageSharedClientState`), which then refresh their state from - * persistence. - * - * Similarly, the primary client listens to notifications sent by secondary - * clients to discover persistence changes written by secondary clients, such as - * the addition of new mutations and query targets. - * - * If multi-tab is not enabled and another tab already obtained the primary - * lease, IndexedDbPersistence enters a failed state and all subsequent - * operations will automatically fail. - * - * Additionally, there is an optimization so that when a tab is closed, the - * primary lease is released immediately (this is especially important to make - * sure that a refreshed tab is able to immediately re-acquire the primary - * lease). Unfortunately, IndexedDB cannot be reliably used in window.unload - * since it is an asynchronous API. So in addition to attempting to give up the - * lease, the leaseholder writes its client ID to a "zombiedClient" entry in - * LocalStorage which acts as an indicator that another tab should go ahead and - * take the primary lease immediately regardless of the current lease timestamp. - * - * TODO(b/114226234): Remove `synchronizeTabs` section when multi-tab is no - * longer optional. - */ -class $r { - constructor( - /** - * Whether to synchronize the in-memory state of multiple tabs and share - * access to local persistence. - */ - t, e, n, s, i, r, o, a, u, - /** - * If set to true, forcefully obtains database access. Existing tabs will - * no longer be able to access IndexedDB. - */ - c, h = 12) { - if (this.allowTabSynchronization = t, this.persistenceKey = e, this.clientId = n, - this.Hn = i, this.window = r, this.document = o, this.Jn = u, this.Yn = c, this.Xn = h, - this.Zn = null, this.ts = !1, this.isPrimary = !1, this.networkEnabled = !0, - /** Our window.unload handler, if registered. */ - this.es = null, this.inForeground = !1, - /** Our 'visibilitychange' listener if registered. */ - this.ns = null, - /** The client metadata refresh task. */ - this.ss = null, - /** The last time we garbage collected the client metadata object store. */ - this.rs = Number.NEGATIVE_INFINITY, - /** A listener to notify on primary state changes. */ - this.os = t => Promise.resolve(), !$r.vt()) throw new Q(G.UNIMPLEMENTED, "This platform is either missing IndexedDB or is known to have an incomplete implementation. Offline persistence has been disabled."); - this.referenceDelegate = new Pr(this, s), this.us = e + "main", this.M = new Ri(a), - this.cs = new hi(this.us, this.Xn, new kr(this.M)), this.hs = new gr(this.referenceDelegate, this.M), - this.ls = function(t) { - return new Sr(t); - } - /** - * Returns the set of documents that have changed since the specified read - * time. - */ - // PORTING NOTE: This is only used for multi-tab synchronization. - (this.M), this.fs = new $i, this.window && this.window.localStorage ? this.ds = this.window.localStorage : (this.ds = null, - !1 === c && $("IndexedDbPersistence", "LocalStorage is unavailable. As a result, persistence may not work reliably. In particular enablePersistence() could fail immediately after refreshing the page.")); - } - /** - * Attempt to start IndexedDb persistence. - * - * @returns Whether persistence was enabled. - */ start() { - // NOTE: This is expected to fail sometimes (in the case of another tab - // already having the persistence lock), so it's the first thing we should - // do. - return this._s().then((() => { - if (!this.isPrimary && !this.allowTabSynchronization) - // Fail `start()` if `synchronizeTabs` is disabled and we cannot - // obtain the primary lease. - throw new Q(G.FAILED_PRECONDITION, Or); - return this.ws(), this.gs(), this.ys(), this.runTransaction("getHighestListenSequenceNumber", "readonly", (t => this.hs.getHighestSequenceNumber(t))); - })).then((t => { - this.Zn = new nt(t, this.Jn); - })).then((() => { - this.ts = !0; - })).catch((t => (this.cs && this.cs.close(), Promise.reject(t)))); - } - /** - * Registers a listener that gets called when the primary state of the - * instance changes. Upon registering, this listener is invoked immediately - * with the current primary state. - * - * PORTING NOTE: This is only used for Web multi-tab. - */ ps(t) { - return this.os = async e => { - if (this.started) return t(e); - }, t(this.isPrimary); - } - /** - * Registers a listener that gets called when the database receives a - * version change event indicating that it has deleted. - * - * PORTING NOTE: This is only used for Web multi-tab. - */ setDatabaseDeletedListener(t) { - this.cs.Ot((async e => { - // Check if an attempt is made to delete IndexedDB. - null === e.newVersion && await t(); - })); - } - /** - * Adjusts the current network state in the client's metadata, potentially - * affecting the primary lease. - * - * PORTING NOTE: This is only used for Web multi-tab. - */ setNetworkEnabled(t) { - this.networkEnabled !== t && (this.networkEnabled = t, - // Schedule a primary lease refresh for immediate execution. The eventual - // lease update will be propagated via `primaryStateListener`. - this.Hn.enqueueAndForget((async () => { - this.started && await this._s(); - }))); - } - /** - * Updates the client metadata in IndexedDb and attempts to either obtain or - * extend the primary lease for the local client. Asynchronously notifies the - * primary state listener if the client either newly obtained or released its - * primary lease. - */ _s() { - return this.runTransaction("updateClientMetadataAndTryBecomePrimary", "readwrite", (t => Br(t).put({ - clientId: this.clientId, - updateTimeMs: Date.now(), - networkEnabled: this.networkEnabled, - inForeground: this.inForeground - }).next((() => { - if (this.isPrimary) return this.Is(t).next((t => { - t || (this.isPrimary = !1, this.Hn.enqueueRetryable((() => this.os(!1)))); - })); - })).next((() => this.Ts(t))).next((e => this.isPrimary && !e ? this.Es(t).next((() => !1)) : !!e && this.As(t).next((() => !0)))))).catch((t => { - if (di(t)) - // Proceed with the existing state. Any subsequent access to - // IndexedDB will verify the lease. - return O("IndexedDbPersistence", "Failed to extend owner lease: ", t), this.isPrimary; - if (!this.allowTabSynchronization) throw t; - return O("IndexedDbPersistence", "Releasing owner lease after error during lease refresh", t), - /* isPrimary= */ !1; - })).then((t => { - this.isPrimary !== t && this.Hn.enqueueRetryable((() => this.os(t))), this.isPrimary = t; - })); - } - Is(t) { - return Fr(t).get("owner").next((t => ui.resolve(this.Rs(t)))); - } - bs(t) { - return Br(t).delete(this.clientId); - } - /** - * If the garbage collection threshold has passed, prunes the - * RemoteDocumentChanges and the ClientMetadata store based on the last update - * time of all clients. - */ async Ps() { - if (this.isPrimary && !this.Vs(this.rs, 18e5)) { - this.rs = Date.now(); - const t = await this.runTransaction("maybeGarbageCollectMultiClientState", "readwrite-primary", (t => { - const e = pi(t, "clientMetadata"); - return e.Ut().next((t => { - const n = this.vs(t, 18e5), s = t.filter((t => -1 === n.indexOf(t))); - // Delete metadata for clients that are no longer considered active. - return ui.forEach(s, (t => e.delete(t.clientId))).next((() => s)); - })); - })).catch((() => [])); - // Delete potential leftover entries that may continue to mark the - // inactive clients as zombied in LocalStorage. - // Ideally we'd delete the IndexedDb and LocalStorage zombie entries for - // the client atomically, but we can't. So we opt to delete the IndexedDb - // entries first to avoid potentially reviving a zombied client. - if (this.ds) for (const e of t) this.ds.removeItem(this.Ss(e.clientId)); - } - } - /** - * Schedules a recurring timer to update the client metadata and to either - * extend or acquire the primary lease if the client is eligible. - */ ys() { - this.ss = this.Hn.enqueueAfterDelay("client_metadata_refresh" /* ClientMetadataRefresh */ , 4e3, (() => this._s().then((() => this.Ps())).then((() => this.ys())))); - } - /** Checks whether `client` is the local client. */ Rs(t) { - return !!t && t.ownerId === this.clientId; - } - /** - * Evaluate the state of all active clients and determine whether the local - * client is or can act as the holder of the primary lease. Returns whether - * the client is eligible for the lease, but does not actually acquire it. - * May return 'false' even if there is no active leaseholder and another - * (foreground) client should become leaseholder instead. - */ Ts(t) { - if (this.Yn) return ui.resolve(!0); - return Fr(t).get("owner").next((e => { - // A client is eligible for the primary lease if: - // - its network is enabled and the client's tab is in the foreground. - // - its network is enabled and no other client's tab is in the - // foreground. - // - every clients network is disabled and the client's tab is in the - // foreground. - // - every clients network is disabled and no other client's tab is in - // the foreground. - // - the `forceOwningTab` setting was passed in. - if (null !== e && this.Vs(e.leaseTimestampMs, 5e3) && !this.Ds(e.ownerId)) { - if (this.Rs(e) && this.networkEnabled) return !0; - if (!this.Rs(e)) { - if (!e.allowTabSynchronization) - // Fail the `canActAsPrimary` check if the current leaseholder has - // not opted into multi-tab synchronization. If this happens at - // client startup, we reject the Promise returned by - // `enablePersistence()` and the user can continue to use Firestore - // with in-memory persistence. - // If this fails during a lease refresh, we will instead block the - // AsyncQueue from executing further operations. Note that this is - // acceptable since mixing & matching different `synchronizeTabs` - // settings is not supported. - // TODO(b/114226234): Remove this check when `synchronizeTabs` can - // no longer be turned off. - throw new Q(G.FAILED_PRECONDITION, Or); - return !1; - } - } - return !(!this.networkEnabled || !this.inForeground) || Br(t).Ut().next((t => void 0 === this.vs(t, 5e3).find((t => { - if (this.clientId !== t.clientId) { - const e = !this.networkEnabled && t.networkEnabled, n = !this.inForeground && t.inForeground, s = this.networkEnabled === t.networkEnabled; - if (e || n && s) return !0; - } - return !1; - })))); - })).next((t => (this.isPrimary !== t && O("IndexedDbPersistence", `Client ${t ? "is" : "is not"} eligible for a primary lease.`), - t))); - } - async shutdown() { - // The shutdown() operations are idempotent and can be called even when - // start() aborted (e.g. because it couldn't acquire the persistence lease). - this.ts = !1, this.Cs(), this.ss && (this.ss.cancel(), this.ss = null), this.xs(), - this.Ns(), - // Use `SimpleDb.runTransaction` directly to avoid failing if another tab - // has obtained the primary lease. - await this.cs.runTransaction("shutdown", "readwrite", [ "owner", "clientMetadata" ], (t => { - const e = new yi(t, nt.A); - return this.Es(e).next((() => this.bs(e))); - })), this.cs.close(), - // Remove the entry marking the client as zombied from LocalStorage since - // we successfully deleted its metadata from IndexedDb. - this.ks(); - } - /** - * Returns clients that are not zombied and have an updateTime within the - * provided threshold. - */ vs(t, e) { - return t.filter((t => this.Vs(t.updateTimeMs, e) && !this.Ds(t.clientId))); - } - /** - * Returns the IDs of the clients that are currently active. If multi-tab - * is not supported, returns an array that only contains the local client's - * ID. - * - * PORTING NOTE: This is only used for Web multi-tab. - */ Ms() { - return this.runTransaction("getActiveClients", "readonly", (t => Br(t).Ut().next((t => this.vs(t, 18e5).map((t => t.clientId)))))); - } - get started() { - return this.ts; - } - getMutationQueue(t, e) { - return lr.Yt(t, this.M, e, this.referenceDelegate); - } - getTargetCache() { - return this.hs; - } - getRemoteDocumentCache() { - return this.ls; - } - getIndexManager(t) { - return new nr(t); - } - getDocumentOverlayCache(t) { - return Li.Yt(this.M, t); - } - getBundleCache() { - return this.fs; - } - runTransaction(t, e, n) { - O("IndexedDbPersistence", "Starting transaction:", t); - const s = "readonly" === e ? "readonly" : "readwrite", i = 13 === (r = this.Xn) ? ri : 12 === r ? ii : 11 === r ? si : void L(); - /** Returns the object stores for the provided schema. */ - var r; - let o; - // Do all transactions as readwrite against all object stores, since we - // are the only reader/writer. - return this.cs.runTransaction(t, s, i, (s => (o = new yi(s, this.Zn ? this.Zn.next() : nt.A), - "readwrite-primary" === e ? this.Is(o).next((t => !!t || this.Ts(o))).next((e => { - if (!e) throw $(`Failed to obtain primary lease for action '${t}'.`), this.isPrimary = !1, - this.Hn.enqueueRetryable((() => this.os(!1))), new Q(G.FAILED_PRECONDITION, oi); - return n(o); - })).next((t => this.As(o).next((() => t)))) : this.Os(o).next((() => n(o)))))).then((t => (o.raiseOnCommittedEvent(), - t))); - } - /** - * Verifies that the current tab is the primary leaseholder or alternatively - * that the leaseholder has opted into multi-tab synchronization. - */ - // TODO(b/114226234): Remove this check when `synchronizeTabs` can no longer - // be turned off. - Os(t) { - return Fr(t).get("owner").next((t => { - if (null !== t && this.Vs(t.leaseTimestampMs, 5e3) && !this.Ds(t.ownerId) && !this.Rs(t) && !(this.Yn || this.allowTabSynchronization && t.allowTabSynchronization)) throw new Q(G.FAILED_PRECONDITION, Or); - })); - } - /** - * Obtains or extends the new primary lease for the local client. This - * method does not verify that the client is eligible for this lease. - */ As(t) { - const e = { - ownerId: this.clientId, - allowTabSynchronization: this.allowTabSynchronization, - leaseTimestampMs: Date.now() - }; - return Fr(t).put("owner", e); - } - static vt() { - return hi.vt(); - } - /** Checks the primary lease and removes it if we are the current primary. */ Es(t) { - const e = Fr(t); - return e.get("owner").next((t => this.Rs(t) ? (O("IndexedDbPersistence", "Releasing primary lease."), - e.delete("owner")) : ui.resolve())); - } - /** Verifies that `updateTimeMs` is within `maxAgeMs`. */ Vs(t, e) { - const n = Date.now(); - return !(t < n - e) && (!(t > n) || ($(`Detected an update time that is in the future: ${t} > ${n}`), - !1)); - } - ws() { - null !== this.document && "function" == typeof this.document.addEventListener && (this.ns = () => { - this.Hn.enqueueAndForget((() => (this.inForeground = "visible" === this.document.visibilityState, - this._s()))); - }, this.document.addEventListener("visibilitychange", this.ns), this.inForeground = "visible" === this.document.visibilityState); - } - xs() { - this.ns && (this.document.removeEventListener("visibilitychange", this.ns), this.ns = null); - } - /** - * Attaches a window.unload handler that will synchronously write our - * clientId to a "zombie client id" location in LocalStorage. This can be used - * by tabs trying to acquire the primary lease to determine that the lease - * is no longer valid even if the timestamp is recent. This is particularly - * important for the refresh case (so the tab correctly re-acquires the - * primary lease). LocalStorage is used for this rather than IndexedDb because - * it is a synchronous API and so can be used reliably from an unload - * handler. - */ gs() { - var t; - "function" == typeof (null === (t = this.window) || void 0 === t ? void 0 : t.addEventListener) && (this.es = () => { - // Note: In theory, this should be scheduled on the AsyncQueue since it - // accesses internal state. We execute this code directly during shutdown - // to make sure it gets a chance to run. - this.Cs(), (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.isSafari)() && navigator.appVersion.match(/Version\/1[45]/) && - // On Safari 14 and 15, we do not run any cleanup actions as it might - // trigger a bug that prevents Safari from re-opening IndexedDB during - // the next page load. - // See https://bugs.webkit.org/show_bug.cgi?id=226547 - this.Hn.enterRestrictedMode(/* purgeExistingTasks= */ !0), this.Hn.enqueueAndForget((() => this.shutdown())); - }, this.window.addEventListener("pagehide", this.es)); - } - Ns() { - this.es && (this.window.removeEventListener("pagehide", this.es), this.es = null); - } - /** - * Returns whether a client is "zombied" based on its LocalStorage entry. - * Clients become zombied when their tab closes without running all of the - * cleanup logic in `shutdown()`. - */ Ds(t) { - var e; - try { - const n = null !== (null === (e = this.ds) || void 0 === e ? void 0 : e.getItem(this.Ss(t))); - return O("IndexedDbPersistence", `Client '${t}' ${n ? "is" : "is not"} zombied in LocalStorage`), - n; - } catch (t) { - // Gracefully handle if LocalStorage isn't working. - return $("IndexedDbPersistence", "Failed to get zombied client id.", t), !1; - } - } - /** - * Record client as zombied (a client that had its tab closed). Zombied - * clients are ignored during primary tab selection. - */ Cs() { - if (this.ds) try { - this.ds.setItem(this.Ss(this.clientId), String(Date.now())); - } catch (t) { - // Gracefully handle if LocalStorage isn't available / working. - $("Failed to set zombie client id.", t); - } - } - /** Removes the zombied client entry if it exists. */ ks() { - if (this.ds) try { - this.ds.removeItem(this.Ss(this.clientId)); - } catch (t) { - // Ignore - } - } - Ss(t) { - return `firestore_zombie_${this.persistenceKey}_${t}`; - } -} - -/** - * Helper to get a typed SimpleDbStore for the primary client object store. - */ function Fr(t) { - return pi(t, "owner"); -} - -/** - * Helper to get a typed SimpleDbStore for the client metadata object store. - */ function Br(t) { - return pi(t, "clientMetadata"); -} - -/** - * Generates a string used as a prefix when storing data in IndexedDB and - * LocalStorage. - */ function Lr(t, e) { - // Use two different prefix formats: - // * firestore / persistenceKey / projectID . databaseID / ... - // * firestore / persistenceKey / projectID / ... - // projectIDs are DNS-compatible names and cannot contain dots - // so there's no danger of collisions. - let n = t.projectId; - return t.isDefaultDatabase || (n += "." + t.database), "firestore/" + e + "/" + n + "/"; -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -class qr { - constructor(t, e) { - this.progress = t, this.$s = e; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A readonly view of the local state of all documents we're tracking (i.e. we - * have a cached version in remoteDocumentCache or local mutations for the - * document). The view is computed by applying the mutations in the - * MutationQueue to the RemoteDocumentCache. - */ class Ur { - constructor(t, e, n) { - this.ls = t, this.Fs = e, this.indexManager = n; - } - /** - * Get the local view of the document identified by `key`. - * - * @returns Local view of the document or null if we don't have any cached - * state for it. - */ Bs(t, e) { - return this.Fs.getAllMutationBatchesAffectingDocumentKey(t, e).next((n => this.Ls(t, e, n))); - } - /** Internal version of `getDocument` that allows reusing batches. */ Ls(t, e, n) { - return this.ls.getEntry(t, e).next((t => { - for (const e of n) e.applyToLocalView(t); - return t; - })); - } - // Returns the view of the given `docs` as they would appear after applying - // all mutations in the given `batches`. - qs(t, e) { - t.forEach(((t, n) => { - for (const t of e) t.applyToLocalView(n); - })); - } - /** - * Gets the local view of the documents identified by `keys`. - * - * If we don't have cached state for a document in `keys`, a NoDocument will - * be stored for that key in the resulting set. - */ Us(t, e) { - return this.ls.getEntries(t, e).next((e => this.Ks(t, e).next((() => e)))); - } - /** - * Applies the local view the given `baseDocs` without retrieving documents - * from the local store. - */ Ks(t, e) { - return this.Fs.getAllMutationBatchesAffectingDocumentKeys(t, e).next((t => this.qs(e, t))); - } - /** - * Performs a query against the local view of all documents. - * - * @param transaction - The persistence transaction. - * @param query - The query to match documents against. - * @param sinceReadTime - If not set to SnapshotVersion.min(), return only - * documents that have been read since this snapshot version (exclusive). - */ Gs(t, e, n) { - /** - * Returns whether the query matches a single document by path (rather than a - * collection). - */ - return function(t) { - return xt.isDocumentKey(t.path) && null === t.collectionGroup && 0 === t.filters.length; - }(e) ? this.Qs(t, e.path) : Me(e) ? this.js(t, e, n) : this.Ws(t, e, n); - } - Qs(t, e) { - // Just do a simple document lookup. - return this.Bs(t, new xt(e)).next((t => { - let e = Ln(); - return t.isFoundDocument() && (e = e.insert(t.key, t)), e; - })); - } - js(t, e, n) { - const s = e.collectionGroup; - let i = Ln(); - return this.indexManager.getCollectionParents(t, s).next((r => ui.forEach(r, (r => { - const o = function(t, e) { - return new ve(e, - /*collectionGroup=*/ null, t.explicitOrderBy.slice(), t.filters.slice(), t.limit, t.limitType, t.startAt, t.endAt); - } - /** - * Returns true if this query does not specify any query constraints that - * could remove results. - */ (e, r.child(s)); - return this.Ws(t, o, n).next((t => { - t.forEach(((t, e) => { - i = i.insert(t, e); - })); - })); - })).next((() => i)))); - } - Ws(t, e, n) { - // Query the remote documents and overlay mutations. - let s; - return this.ls.getAll(t, e.path, n).next((n => (s = n, this.Fs.getAllMutationBatchesAffectingQuery(t, e)))).next((t => { - for (const e of t) for (const t of e.mutations) { - const n = t.key; - let i = s.get(n); - null == i && ( - // Create invalid document to apply mutations on top of - i = te.newInvalidDocument(n), s = s.insert(n, i)), _n(t, i, e.localWriteTime), i.isFoundDocument() || (s = s.remove(n)); - } - })).next((() => ( - // Finally, filter out any documents that don't actually match - // the query. - s.forEach(((t, n) => { - Ue(e, n) || (s = s.remove(t)); - })), s))); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A set of changes to what documents are currently in view and out of view for - * a given query. These changes are sent to the LocalStore by the View (via - * the SyncEngine) and are used to pin / unpin documents as appropriate. - */ class Kr { - constructor(t, e, n, s) { - this.targetId = t, this.fromCache = e, this.zs = n, this.Hs = s; - } - static Js(t, e) { - let n = Gn(), s = Gn(); - for (const t of e.docChanges) switch (t.type) { - case 0 /* Added */ : - n = n.add(t.doc.key); - break; - - case 1 /* Removed */ : - s = s.add(t.doc.key); - // do nothing - } - return new Kr(t, e.fromCache, n, s); - } -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A query engine that takes advantage of the target document mapping in the - * QueryCache. Query execution is optimized by only reading the documents that - * previously matched a query plus any documents that were edited after the - * query was last listened to. - * - * There are some cases when this optimization is not guaranteed to produce - * the same results as full collection scans. In these cases, query - * processing falls back to full scans. These cases are: - * - * - Limit queries where a document that matched the query previously no longer - * matches the query. - * - * - Limit queries where a document edit may cause the document to sort below - * another document that is in the local cache. - * - * - Queries that have never been CURRENT or free of limbo documents. - */ class Gr { - /** Sets the document view to query against. */ - Ys(t) { - this.Xs = t; - } - /** Returns all local documents matching the specified query. */ Gs(t, e, n, s) { - // Queries that match all documents don't benefit from using - // key-based lookups. It is more efficient to scan all documents in a - // collection, rather than to perform individual lookups. - return function(t) { - return 0 === t.filters.length && null === t.limit && null == t.startAt && null == t.endAt && (0 === t.explicitOrderBy.length || 1 === t.explicitOrderBy.length && t.explicitOrderBy[0].field.isKeyField()); - }(e) || n.isEqual(ct.min()) ? this.Zs(t, e) : this.Xs.Us(t, s).next((i => { - const r = this.ti(e, i); - return (Ce(e) || xe(e)) && this.ei(e.limitType, r, s, n) ? this.Zs(t, e) : (k() <= _firebase_logger__WEBPACK_IMPORTED_MODULE_2__.LogLevel.DEBUG && O("QueryEngine", "Re-using previous result from %s to execute query: %s", n.toString(), qe(e)), - this.Xs.Gs(t, e, n).next((t => ( - // We merge `previousResults` into `updateResults`, since - // `updateResults` is already a DocumentMap. If a document is - // contained in both lists, then its contents are the same. - r.forEach((e => { - t = t.insert(e.key, e); - })), t)))); - })); - // Queries that have never seen a snapshot without limbo free documents - // should also be run as a full collection scan. - } - /** Applies the query filter and sorting to the provided documents. */ ti(t, e) { - // Sort the documents and re-apply the query filter since previously - // matching documents do not necessarily still match the query. - let n = new kn(Ke(t)); - return e.forEach(((e, s) => { - Ue(t, s) && (n = n.add(s)); - })), n; - } - /** - * Determines if a limit query needs to be refilled from cache, making it - * ineligible for index-free execution. - * - * @param sortedPreviousResults - The documents that matched the query when it - * was last synchronized, sorted by the query's comparator. - * @param remoteKeys - The document keys that matched the query at the last - * snapshot. - * @param limboFreeSnapshotVersion - The version of the snapshot when the - * query was last synchronized. - */ ei(t, e, n, s) { - // The query needs to be refilled if a previously matching document no - // longer matches. - if (n.size !== e.size) return !0; - // Limit queries are not eligible for index-free query execution if there is - // a potential that an older document from cache now sorts before a document - // that was previously part of the limit. This, however, can only happen if - // the document at the edge of the limit goes out of limit. - // If a document that is not the limit boundary sorts differently, - // the boundary of the limit itself did not change and documents from cache - // will continue to be "rejected" by this boundary. Therefore, we can ignore - // any modifications that don't affect the last document. - const i = "F" /* First */ === t ? e.last() : e.first(); - return !!i && (i.hasPendingWrites || i.version.compareTo(s) > 0); - } - Zs(t, e) { - return k() <= _firebase_logger__WEBPACK_IMPORTED_MODULE_2__.LogLevel.DEBUG && O("QueryEngine", "Using full collection scan to execute query:", qe(e)), - this.Xs.Gs(t, e, ct.min()); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Implements `LocalStore` interface. - * - * Note: some field defined in this class might have public access level, but - * the class is not exported so they are only accessible from this module. - * This is useful to implement optional features (like bundles) in free - * functions, such that they are tree-shakeable. - */ -class Qr { - constructor( - /** Manages our in-memory or durable persistence. */ - t, e, n, s) { - this.persistence = t, this.ni = e, this.M = s, - /** - * Maps a targetID to data about its target. - * - * PORTING NOTE: We are using an immutable data structure on Web to make re-runs - * of `applyRemoteEvent()` idempotent. - */ - this.si = new Cn(rt), - /** Maps a target to its targetID. */ - // TODO(wuandy): Evaluate if TargetId can be part of Target. - this.ii = new Dn((t => ce(t)), le), - /** - * The read time of the last entry processed by `getNewDocumentChanges()`. - * - * PORTING NOTE: This is only used for multi-tab synchronization. - */ - this.ri = ct.min(), this.oi = t.getRemoteDocumentCache(), this.hs = t.getTargetCache(), - this.fs = t.getBundleCache(), this.ai(n); - } - ai(t) { - // TODO(indexing): Add spec tests that test these components change after a - // user change - this.indexManager = this.persistence.getIndexManager(t), this.Fs = this.persistence.getMutationQueue(t, this.indexManager), - this.ui = new Ur(this.oi, this.Fs, this.indexManager), this.oi.setIndexManager(this.indexManager), - this.ni.Ys(this.ui); - } - collectGarbage(t) { - return this.persistence.runTransaction("Collect garbage", "readwrite-primary", (e => t.collect(e, this.si))); - } -} - -function jr( -/** Manages our in-memory or durable persistence. */ -t, e, n, s) { - return new Qr(t, e, n, s); -} - -/** - * Tells the LocalStore that the currently authenticated user has changed. - * - * In response the local store switches the mutation queue to the new user and - * returns any resulting document changes. - */ -// PORTING NOTE: Android and iOS only return the documents affected by the -// change. -async function Wr(t, e) { - const n = K(t); - return await n.persistence.runTransaction("Handle user change", "readonly", (t => { - // Swap out the mutation queue, grabbing the pending mutation batches - // before and after. - let s; - return n.Fs.getAllMutationBatches(t).next((i => (s = i, n.ai(e), n.Fs.getAllMutationBatches(t)))).next((e => { - const i = [], r = []; - // Union the old/new changed keys. - let o = Gn(); - for (const t of s) { - i.push(t.batchId); - for (const e of t.mutations) o = o.add(e.key); - } - for (const t of e) { - r.push(t.batchId); - for (const e of t.mutations) o = o.add(e.key); - } - // Return the set of all (potentially) changed documents and the list - // of mutation batch IDs that were affected by change. - return n.ui.Us(t, o).next((t => ({ - ci: t, - removedBatchIds: i, - addedBatchIds: r - }))); - })); - })); -} - -/* Accepts locally generated Mutations and commit them to storage. */ -/** - * Acknowledges the given batch. - * - * On the happy path when a batch is acknowledged, the local store will - * - * + remove the batch from the mutation queue; - * + apply the changes to the remote document cache; - * + recalculate the latency compensated view implied by those changes (there - * may be mutations in the queue that affect the documents but haven't been - * acknowledged yet); and - * + give the changed documents back the sync engine - * - * @returns The resulting (modified) documents. - */ -function zr(t, e) { - const n = K(t); - return n.persistence.runTransaction("Acknowledge batch", "readwrite-primary", (t => { - const s = e.batch.keys(), i = n.oi.newChangeBuffer({ - trackRemovals: !0 - }); - return function(t, e, n, s) { - const i = n.batch, r = i.keys(); - let o = ui.resolve(); - return r.forEach((t => { - o = o.next((() => s.getEntry(e, t))).next((e => { - const r = n.docVersions.get(t); - q(null !== r), e.version.compareTo(r) < 0 && (i.applyToRemoteDocument(e, n), e.isValidDocument() && ( - // We use the commitVersion as the readTime rather than the - // document's updateTime since the updateTime is not advanced - // for updates that do not modify the underlying document. - e.setReadTime(n.commitVersion), s.addEntry(e))); - })); - })), o.next((() => t.Fs.removeMutationBatch(e, i))); - } - /** Returns the local view of the documents affected by a mutation batch. */ - // PORTING NOTE: Multi-Tab only. - (n, t, e, i).next((() => i.apply(t))).next((() => n.Fs.performConsistencyCheck(t))).next((() => n.ui.Us(t, s))); - })); -} - -/** - * Removes mutations from the MutationQueue for the specified batch; - * LocalDocuments will be recalculated. - * - * @returns The resulting modified documents. - */ -/** - * Returns the last consistent snapshot processed (used by the RemoteStore to - * determine whether to buffer incoming snapshots from the backend). - */ -function Hr(t) { - const e = K(t); - return e.persistence.runTransaction("Get last remote snapshot version", "readonly", (t => e.hs.getLastRemoteSnapshotVersion(t))); -} - -/** - * Updates the "ground-state" (remote) documents. We assume that the remote - * event reflects any write batches that have been acknowledged or rejected - * (i.e. we do not re-apply local mutations to updates from this event). - * - * LocalDocuments are re-calculated if there are remaining mutations in the - * queue. - */ function Jr(t, e) { - const n = K(t), s = e.snapshotVersion; - let i = n.si; - return n.persistence.runTransaction("Apply remote event", "readwrite-primary", (t => { - const r = n.oi.newChangeBuffer({ - trackRemovals: !0 - }); - // Reset newTargetDataByTargetMap in case this transaction gets re-run. - i = n.si; - const o = []; - e.targetChanges.forEach(((r, a) => { - const u = i.get(a); - if (!u) return; - // Only update the remote keys if the target is still active. This - // ensures that we can persist the updated target data along with - // the updated assignment. - o.push(n.hs.removeMatchingKeys(t, r.removedDocuments, a).next((() => n.hs.addMatchingKeys(t, r.addedDocuments, a)))); - let c = u.withSequenceNumber(t.currentSequenceNumber); - e.targetMismatches.has(a) ? c = c.withResumeToken(pt.EMPTY_BYTE_STRING, ct.min()).withLastLimboFreeSnapshotVersion(ct.min()) : r.resumeToken.approximateByteSize() > 0 && (c = c.withResumeToken(r.resumeToken, s)), - i = i.insert(a, c), - // Update the target data if there are target changes (or if - // sufficient time has passed since the last update). - /** - * Returns true if the newTargetData should be persisted during an update of - * an active target. TargetData should always be persisted when a target is - * being released and should not call this function. - * - * While the target is active, TargetData updates can be omitted when nothing - * about the target has changed except metadata like the resume token or - * snapshot version. Occasionally it's worth the extra write to prevent these - * values from getting too stale after a crash, but this doesn't have to be - * too frequent. - */ - function(t, e, n) { - // Always persist target data if we don't already have a resume token. - if (0 === t.resumeToken.approximateByteSize()) return !0; - // Don't allow resume token changes to be buffered indefinitely. This - // allows us to be reasonably up-to-date after a crash and avoids needing - // to loop over all active queries on shutdown. Especially in the browser - // we may not get time to do anything interesting while the current tab is - // closing. - if (e.snapshotVersion.toMicroseconds() - t.snapshotVersion.toMicroseconds() >= 3e8) return !0; - // Otherwise if the only thing that has changed about a target is its resume - // token it's not worth persisting. Note that the RemoteStore keeps an - // in-memory view of the currently active targets which includes the current - // resume token, so stream failure or user changes will still use an - // up-to-date resume token regardless of what we do here. - return n.addedDocuments.size + n.modifiedDocuments.size + n.removedDocuments.size > 0; - } - /** - * Notifies local store of the changed views to locally pin documents. - */ (u, c, r) && o.push(n.hs.updateTargetData(t, c)); - })); - let a = Fn(); - // HACK: The only reason we allow a null snapshot version is so that we - // can synthesize remote events when we get permission denied errors while - // trying to resolve the state of a locally cached document that is in - // limbo. - if (e.documentUpdates.forEach((s => { - e.resolvedLimboDocuments.has(s) && o.push(n.persistence.referenceDelegate.updateLimboDocument(t, s)); - })), - // Each loop iteration only affects its "own" doc, so it's safe to get all the remote - // documents in advance in a single call. - o.push(Yr(t, r, e.documentUpdates).next((t => { - a = t; - }))), !s.isEqual(ct.min())) { - const e = n.hs.getLastRemoteSnapshotVersion(t).next((e => n.hs.setTargetsMetadata(t, t.currentSequenceNumber, s))); - o.push(e); - } - return ui.waitFor(o).next((() => r.apply(t))).next((() => n.ui.Ks(t, a))).next((() => a)); - })).then((t => (n.si = i, t))); -} - -/** - * Populates document change buffer with documents from backend or a bundle. - * Returns the document changes resulting from applying those documents. - * - * @param txn - Transaction to use to read existing documents from storage. - * @param documentBuffer - Document buffer to collect the resulted changes to be - * applied to storage. - * @param documents - Documents to be applied. - * @param globalVersion - A `SnapshotVersion` representing the read time if all - * documents have the same read time. - * @param documentVersions - A DocumentKey-to-SnapshotVersion map if documents - * have their own read time. - * - * Note: this function will use `documentVersions` if it is defined; - * when it is not defined, resorts to `globalVersion`. - */ function Yr(t, e, n) { - let s = Gn(); - return n.forEach((t => s = s.add(t))), e.getEntries(t, s).next((t => { - let s = Fn(); - return n.forEach(((n, i) => { - const r = t.get(n); - // Note: The order of the steps below is important, since we want - // to ensure that rejected limbo resolutions (which fabricate - // NoDocuments with SnapshotVersion.min()) never add documents to - // cache. - i.isNoDocument() && i.version.isEqual(ct.min()) ? ( - // NoDocuments with SnapshotVersion.min() are used in manufactured - // events. We remove these documents from cache since we lost - // access. - e.removeEntry(n, i.readTime), s = s.insert(n, i)) : !r.isValidDocument() || i.version.compareTo(r.version) > 0 || 0 === i.version.compareTo(r.version) && r.hasPendingWrites ? (e.addEntry(i), - s = s.insert(n, i)) : O("LocalStore", "Ignoring outdated watch update for ", n, ". Current version:", r.version, " Watch version:", i.version); - })), s; - })); -} - -/** - * Gets the mutation batch after the passed in batchId in the mutation queue - * or null if empty. - * @param afterBatchId - If provided, the batch to search after. - * @returns The next mutation or null if there wasn't one. - */ -function Xr(t, e) { - const n = K(t); - return n.persistence.runTransaction("Get next mutation batch", "readonly", (t => (void 0 === e && (e = -1), - n.Fs.getNextMutationBatchAfterBatchId(t, e)))); -} - -/** - * Reads the current value of a Document with a given key or null if not - * found - used for testing. - */ -/** - * Assigns the given target an internal ID so that its results can be pinned so - * they don't get GC'd. A target must be allocated in the local store before - * the store can be used to manage its view. - * - * Allocating an already allocated `Target` will return the existing `TargetData` - * for that `Target`. - */ -function Zr(t, e) { - const n = K(t); - return n.persistence.runTransaction("Allocate target", "readwrite", (t => { - let s; - return n.hs.getTargetData(t, e).next((i => i ? ( - // This target has been listened to previously, so reuse the - // previous targetID. - // TODO(mcg): freshen last accessed date? - s = i, ui.resolve(s)) : n.hs.allocateTargetId(t).next((i => (s = new Ai(e, i, 0 /* Listen */ , t.currentSequenceNumber), - n.hs.addTargetData(t, s).next((() => s))))))); - })).then((t => { - // If Multi-Tab is enabled, the existing target data may be newer than - // the in-memory data - const s = n.si.get(t.targetId); - return (null === s || t.snapshotVersion.compareTo(s.snapshotVersion) > 0) && (n.si = n.si.insert(t.targetId, t), - n.ii.set(e, t.targetId)), t; - })); -} - -/** - * Returns the TargetData as seen by the LocalStore, including updates that may - * have not yet been persisted to the TargetCache. - */ -// Visible for testing. -/** - * Unpins all the documents associated with the given target. If - * `keepPersistedTargetData` is set to false and Eager GC enabled, the method - * directly removes the associated target data from the target cache. - * - * Releasing a non-existing `Target` is a no-op. - */ -// PORTING NOTE: `keepPersistedTargetData` is multi-tab only. -async function to(t, e, n) { - const s = K(t), i = s.si.get(e), r = n ? "readwrite" : "readwrite-primary"; - try { - n || await s.persistence.runTransaction("Release target", r, (t => s.persistence.referenceDelegate.removeTarget(t, i))); - } catch (t) { - if (!di(t)) throw t; - // All `releaseTarget` does is record the final metadata state for the - // target, but we've been recording this periodically during target - // activity. If we lose this write this could cause a very slight - // difference in the order of target deletion during GC, but we - // don't define exact LRU semantics so this is acceptable. - O("LocalStore", `Failed to update sequence numbers for target ${e}: ${t}`); - } - s.si = s.si.remove(e), s.ii.delete(i.target); -} - -/** - * Runs the specified query against the local store and returns the results, - * potentially taking advantage of query data from previous executions (such - * as the set of remote keys). - * - * @param usePreviousResults - Whether results from previous executions can - * be used to optimize this query execution. - */ function eo(t, e, n) { - const s = K(t); - let i = ct.min(), r = Gn(); - return s.persistence.runTransaction("Execute query", "readonly", (t => function(t, e, n) { - const s = K(t), i = s.ii.get(n); - return void 0 !== i ? ui.resolve(s.si.get(i)) : s.hs.getTargetData(e, n); - }(s, t, $e(e)).next((e => { - if (e) return i = e.lastLimboFreeSnapshotVersion, s.hs.getMatchingKeysForTargetId(t, e.targetId).next((t => { - r = t; - })); - })).next((() => s.ni.Gs(t, e, n ? i : ct.min(), n ? r : Gn()))).next((t => ({ - documents: t, - hi: r - }))))); -} - -// PORTING NOTE: Multi-Tab only. -function no(t, e) { - const n = K(t), s = K(n.hs), i = n.si.get(e); - return i ? Promise.resolve(i.target) : n.persistence.runTransaction("Get target data", "readonly", (t => s.Et(t, e).next((t => t ? t.target : null)))); -} - -/** - * Returns the set of documents that have been updated since the last call. - * If this is the first call, returns the set of changes since client - * initialization. Further invocations will return document that have changed - * since the prior call. - */ -// PORTING NOTE: Multi-Tab only. -function so(t) { - const e = K(t); - return e.persistence.runTransaction("Get new document changes", "readonly", (t => function(t, e, n) { - const s = K(t); - let i = Fn(), r = Vi(n); - const o = xr(e), a = IDBKeyRange.lowerBound(r, !0); - return o.Wt({ - index: "readTimeIndex", - range: a - }, ((t, e) => { - // Unlike `getEntry()` and others, `getNewDocumentChanges()` parses - // the documents directly since we want to keep sentinel deletes. - const n = bi(s.M, e); - i = i.insert(n.key, n), r = e.readTime; - })).next((() => ({ - $s: i, - readTime: vi(r) - }))); - } - /** - * Returns the read time of the most recently read document in the cache, or - * SnapshotVersion.min() if not available. - */ - // PORTING NOTE: This is only used for multi-tab synchronization. - (e.oi, t, e.ri))).then((({$s: t, readTime: n}) => (e.ri = n, t))); -} - -/** - * Reads the newest document change from persistence and moves the internal - * synchronization marker forward so that calls to `getNewDocumentChanges()` - * only return changes that happened after client initialization. - */ -// PORTING NOTE: Multi-Tab only. -async function io(t) { - const e = K(t); - return e.persistence.runTransaction("Synchronize last document change read time", "readonly", (t => function(t) { - const e = xr(t); - // If there are no existing entries, we return SnapshotVersion.min(). - let n = ct.min(); - return e.Wt({ - index: "readTimeIndex", - reverse: !0 - }, ((t, e, s) => { - e.readTime && (n = vi(e.readTime)), s.done(); - })).next((() => n)); - }(t))).then((t => { - e.ri = t; - })); -} - -/** - * Creates a new target using the given bundle name, which will be used to - * hold the keys of all documents from the bundle in query-document mappings. - * This ensures that the loaded documents do not get garbage collected - * right away. - */ -/** - * Applies the documents from a bundle to the "ground-state" (remote) - * documents. - * - * LocalDocuments are re-calculated if there are remaining mutations in the - * queue. - */ -async function ro(t, e, n, s) { - const i = K(t); - let r = Gn(), o = Fn(); - for (const t of n) { - const n = e.li(t.metadata.name); - t.document && (r = r.add(n)); - const s = e.fi(t); - s.setReadTime(e.di(t.metadata.readTime)), o = o.insert(n, s); - } - const a = i.oi.newChangeBuffer({ - trackRemovals: !0 - }), u = await Zr(i, function(t) { - // It is OK that the path used for the query is not valid, because this will - // not be read and queried. - return $e(De(_t.fromString(`__bundle__/docs/${t}`))); - }(s)); - // Allocates a target to hold all document keys from the bundle, such that - // they will not get garbage collected right away. - return i.persistence.runTransaction("Apply bundle documents", "readwrite", (t => Yr(t, a, o).next((e => (a.apply(t), - e))).next((e => i.hs.removeMatchingKeysForTargetId(t, u.targetId).next((() => i.hs.addMatchingKeys(t, r, u.targetId))).next((() => i.ui.Ks(t, e))).next((() => e)))))); -} - -/** - * Returns a promise of a boolean to indicate if the given bundle has already - * been loaded and the create time is newer than the current loading bundle. - */ -/** - * Saves the given `NamedQuery` to local persistence. - */ -async function oo(t, e, n = Gn()) { - // Allocate a target for the named query such that it can be resumed - // from associated read time if users use it to listen. - // NOTE: this also means if no corresponding target exists, the new target - // will remain active and will not get collected, unless users happen to - // unlisten the query somehow. - const s = await Zr(t, $e(ki(e.bundledQuery))), i = K(t); - return i.persistence.runTransaction("Save named query", "readwrite", (t => { - const r = us(e.readTime); - // Simply save the query itself if it is older than what the SDK already - // has. - if (s.snapshotVersion.compareTo(r) >= 0) return i.fs.saveNamedQuery(t, e); - // Update existing target data because the query from the bundle is newer. - const o = s.withResumeToken(pt.EMPTY_BYTE_STRING, r); - return i.si = i.si.insert(o.targetId, o), i.hs.updateTargetData(t, o).next((() => i.hs.removeMatchingKeysForTargetId(t, s.targetId))).next((() => i.hs.addMatchingKeys(t, n, s.targetId))).next((() => i.fs.saveNamedQuery(t, e))); - })); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ class ao { - constructor(t) { - this.M = t, this._i = new Map, this.wi = new Map; - } - getBundleMetadata(t, e) { - return ui.resolve(this._i.get(e)); - } - saveBundleMetadata(t, e) { - /** Decodes a BundleMetadata proto into a BundleMetadata object. */ - var n; - return this._i.set(e.id, { - id: (n = e).id, - version: n.version, - createTime: us(n.createTime) - }), ui.resolve(); - } - getNamedQuery(t, e) { - return ui.resolve(this.wi.get(e)); - } - saveNamedQuery(t, e) { - return this.wi.set(e.name, function(t) { - return { - name: t.name, - query: ki(t.bundledQuery), - readTime: us(t.readTime) - }; - }(e)), ui.resolve(); - } -} - -/** - * @license - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * An in-memory implementation of DocumentOverlayCache. - */ class uo { - constructor() { - // A map sorted by DocumentKey, whose value is a pair of the largest batch id - // for the overlay and the overlay itself. - this.overlays = new Cn(xt.comparator), this.mi = new Map; - } - getOverlay(t, e) { - return ui.resolve(this.overlays.get(e)); - } - saveOverlays(t, e, n) { - return n.forEach(((n, s) => { - this.Xt(t, e, s); - })), ui.resolve(); - } - removeOverlaysForBatchId(t, e, n) { - const s = this.mi.get(n); - return void 0 !== s && (s.forEach((t => this.overlays = this.overlays.remove(t))), - this.mi.delete(n)), ui.resolve(); - } - getOverlaysForCollection(t, e, n) { - const s = qn(), i = e.length + 1, r = new xt(e.child("")), o = this.overlays.getIteratorFrom(r); - for (;o.hasNext(); ) { - const t = o.getNext().value, r = t.getKey(); - if (!e.isPrefixOf(r.path)) break; - // Documents from sub-collections - r.path.length === i && (t.largestBatchId > n && s.set(t.getKey(), t)); - } - return ui.resolve(s); - } - getOverlaysForCollectionGroup(t, e, n, s) { - let i = new Cn(((t, e) => t - e)); - const r = this.overlays.getIterator(); - for (;r.hasNext(); ) { - const t = r.getNext().value; - if (t.getKey().getCollectionGroup() === e && t.largestBatchId > n) { - let e = i.get(t.largestBatchId); - null === e && (e = qn(), i = i.insert(t.largestBatchId, e)), e.set(t.getKey(), t); - } - } - const o = qn(), a = i.getIterator(); - for (;a.hasNext(); ) { - if (a.getNext().value.forEach(((t, e) => o.set(t, e))), o.size() >= s) break; - } - return ui.resolve(o); - } - Xt(t, e, n) { - if (null === n) return; - // Remove the association of the overlay to its batch id. - const s = this.overlays.get(n.key); - if (null !== s) { - const t = this.mi.get(s.largestBatchId).delete(n.key); - this.mi.set(s.largestBatchId, t); - } - this.overlays = this.overlays.insert(n.key, new Ei(e, n)); - // Create the association of this overlay to the given largestBatchId. - let i = this.mi.get(e); - void 0 === i && (i = Gn(), this.mi.set(e, i)), this.mi.set(e, i.add(n.key)); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A collection of references to a document from some kind of numbered entity - * (either a target ID or batch ID). As references are added to or removed from - * the set corresponding events are emitted to a registered garbage collector. - * - * Each reference is represented by a DocumentReference object. Each of them - * contains enough information to uniquely identify the reference. They are all - * stored primarily in a set sorted by key. A document is considered garbage if - * there's no references in that set (this can be efficiently checked thanks to - * sorting by key). - * - * ReferenceSet also keeps a secondary set that contains references sorted by - * IDs. This one is used to efficiently implement removal of all references by - * some target ID. - */ class co { - constructor() { - // A set of outstanding references to a document sorted by key. - this.gi = new kn(ho.yi), - // A set of outstanding references to a document sorted by target id. - this.pi = new kn(ho.Ii); - } - /** Returns true if the reference set contains no references. */ isEmpty() { - return this.gi.isEmpty(); - } - /** Adds a reference to the given document key for the given ID. */ addReference(t, e) { - const n = new ho(t, e); - this.gi = this.gi.add(n), this.pi = this.pi.add(n); - } - /** Add references to the given document keys for the given ID. */ Ti(t, e) { - t.forEach((t => this.addReference(t, e))); - } - /** - * Removes a reference to the given document key for the given - * ID. - */ removeReference(t, e) { - this.Ei(new ho(t, e)); - } - Ai(t, e) { - t.forEach((t => this.removeReference(t, e))); - } - /** - * Clears all references with a given ID. Calls removeRef() for each key - * removed. - */ Ri(t) { - const e = new xt(new _t([])), n = new ho(e, t), s = new ho(e, t + 1), i = []; - return this.pi.forEachInRange([ n, s ], (t => { - this.Ei(t), i.push(t.key); - })), i; - } - bi() { - this.gi.forEach((t => this.Ei(t))); - } - Ei(t) { - this.gi = this.gi.delete(t), this.pi = this.pi.delete(t); - } - Pi(t) { - const e = new xt(new _t([])), n = new ho(e, t), s = new ho(e, t + 1); - let i = Gn(); - return this.pi.forEachInRange([ n, s ], (t => { - i = i.add(t.key); - })), i; - } - containsKey(t) { - const e = new ho(t, 0), n = this.gi.firstAfterOrEqual(e); - return null !== n && t.isEqual(n.key); - } -} - -class ho { - constructor(t, e) { - this.key = t, this.Vi = e; - } - /** Compare by key then by ID */ static yi(t, e) { - return xt.comparator(t.key, e.key) || rt(t.Vi, e.Vi); - } - /** Compare by ID then by key */ static Ii(t, e) { - return rt(t.Vi, e.Vi) || xt.comparator(t.key, e.key); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ class lo { - constructor(t, e) { - this.indexManager = t, this.referenceDelegate = e, - /** - * The set of all mutations that have been sent but not yet been applied to - * the backend. - */ - this.Fs = [], - /** Next value to use when assigning sequential IDs to each mutation batch. */ - this.vi = 1, - /** An ordered mapping between documents and the mutations batch IDs. */ - this.Si = new kn(ho.yi); - } - checkEmpty(t) { - return ui.resolve(0 === this.Fs.length); - } - addMutationBatch(t, e, n, s) { - const i = this.vi; - this.vi++, this.Fs.length > 0 && this.Fs[this.Fs.length - 1]; - const r = new Ii(i, e, n, s); - this.Fs.push(r); - // Track references by document key and index collection parents. - for (const e of s) this.Si = this.Si.add(new ho(e.key, i)), this.indexManager.addToCollectionParentIndex(t, e.key.path.popLast()); - return ui.resolve(r); - } - lookupMutationBatch(t, e) { - return ui.resolve(this.Di(e)); - } - getNextMutationBatchAfterBatchId(t, e) { - const n = e + 1, s = this.Ci(n), i = s < 0 ? 0 : s; - // The requested batchId may still be out of range so normalize it to the - // start of the queue. - return ui.resolve(this.Fs.length > i ? this.Fs[i] : null); - } - getHighestUnacknowledgedBatchId() { - return ui.resolve(0 === this.Fs.length ? -1 : this.vi - 1); - } - getAllMutationBatches(t) { - return ui.resolve(this.Fs.slice()); - } - getAllMutationBatchesAffectingDocumentKey(t, e) { - const n = new ho(e, 0), s = new ho(e, Number.POSITIVE_INFINITY), i = []; - return this.Si.forEachInRange([ n, s ], (t => { - const e = this.Di(t.Vi); - i.push(e); - })), ui.resolve(i); - } - getAllMutationBatchesAffectingDocumentKeys(t, e) { - let n = new kn(rt); - return e.forEach((t => { - const e = new ho(t, 0), s = new ho(t, Number.POSITIVE_INFINITY); - this.Si.forEachInRange([ e, s ], (t => { - n = n.add(t.Vi); - })); - })), ui.resolve(this.xi(n)); - } - getAllMutationBatchesAffectingQuery(t, e) { - // Use the query path as a prefix for testing if a document matches the - // query. - const n = e.path, s = n.length + 1; - // Construct a document reference for actually scanning the index. Unlike - // the prefix the document key in this reference must have an even number of - // segments. The empty segment can be used a suffix of the query path - // because it precedes all other segments in an ordered traversal. - let i = n; - xt.isDocumentKey(i) || (i = i.child("")); - const r = new ho(new xt(i), 0); - // Find unique batchIDs referenced by all documents potentially matching the - // query. - let o = new kn(rt); - return this.Si.forEachWhile((t => { - const e = t.key.path; - return !!n.isPrefixOf(e) && ( - // Rows with document keys more than one segment longer than the query - // path can't be matches. For example, a query on 'rooms' can't match - // the document /rooms/abc/messages/xyx. - // TODO(mcg): we'll need a different scanner when we implement - // ancestor queries. - e.length === s && (o = o.add(t.Vi)), !0); - }), r), ui.resolve(this.xi(o)); - } - xi(t) { - // Construct an array of matching batches, sorted by batchID to ensure that - // multiple mutations affecting the same document key are applied in order. - const e = []; - return t.forEach((t => { - const n = this.Di(t); - null !== n && e.push(n); - })), e; - } - removeMutationBatch(t, e) { - q(0 === this.Ni(e.batchId, "removed")), this.Fs.shift(); - let n = this.Si; - return ui.forEach(e.mutations, (s => { - const i = new ho(s.key, e.batchId); - return n = n.delete(i), this.referenceDelegate.markPotentiallyOrphaned(t, s.key); - })).next((() => { - this.Si = n; - })); - } - dn(t) { - // No-op since the memory mutation queue does not maintain a separate cache. - } - containsKey(t, e) { - const n = new ho(e, 0), s = this.Si.firstAfterOrEqual(n); - return ui.resolve(e.isEqual(s && s.key)); - } - performConsistencyCheck(t) { - return this.Fs.length, ui.resolve(); - } - /** - * Finds the index of the given batchId in the mutation queue and asserts that - * the resulting index is within the bounds of the queue. - * - * @param batchId - The batchId to search for - * @param action - A description of what the caller is doing, phrased in passive - * form (e.g. "acknowledged" in a routine that acknowledges batches). - */ Ni(t, e) { - return this.Ci(t); - } - /** - * Finds the index of the given batchId in the mutation queue. This operation - * is O(1). - * - * @returns The computed index of the batch with the given batchId, based on - * the state of the queue. Note this index can be negative if the requested - * batchId has already been remvoed from the queue or past the end of the - * queue if the batchId is larger than the last added batch. - */ Ci(t) { - if (0 === this.Fs.length) - // As an index this is past the end of the queue - return 0; - // Examine the front of the queue to figure out the difference between the - // batchId and indexes in the array. Note that since the queue is ordered - // by batchId, if the first batch has a larger batchId then the requested - // batchId doesn't exist in the queue. - return t - this.Fs[0].batchId; - } - /** - * A version of lookupMutationBatch that doesn't return a promise, this makes - * other functions that uses this code easier to read and more efficent. - */ Di(t) { - const e = this.Ci(t); - if (e < 0 || e >= this.Fs.length) return null; - return this.Fs[e]; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * The memory-only RemoteDocumentCache for IndexedDb. To construct, invoke - * `newMemoryRemoteDocumentCache()`. - */ -class fo { - /** - * @param sizer - Used to assess the size of a document. For eager GC, this is - * expected to just return 0 to avoid unnecessarily doing the work of - * calculating the size. - */ - constructor(t) { - this.ki = t, - /** Underlying cache of documents and their read times. */ - this.docs = new Cn(xt.comparator), - /** Size of all cached documents. */ - this.size = 0; - } - setIndexManager(t) { - this.indexManager = t; - } - /** - * Adds the supplied entry to the cache and updates the cache size as appropriate. - * - * All calls of `addEntry` are required to go through the RemoteDocumentChangeBuffer - * returned by `newChangeBuffer()`. - */ addEntry(t, e) { - const n = e.key, s = this.docs.get(n), i = s ? s.size : 0, r = this.ki(e); - return this.docs = this.docs.insert(n, { - document: e.mutableCopy(), - size: r - }), this.size += r - i, this.indexManager.addToCollectionParentIndex(t, n.path.popLast()); - } - /** - * Removes the specified entry from the cache and updates the cache size as appropriate. - * - * All calls of `removeEntry` are required to go through the RemoteDocumentChangeBuffer - * returned by `newChangeBuffer()`. - */ removeEntry(t) { - const e = this.docs.get(t); - e && (this.docs = this.docs.remove(t), this.size -= e.size); - } - getEntry(t, e) { - const n = this.docs.get(e); - return ui.resolve(n ? n.document.mutableCopy() : te.newInvalidDocument(e)); - } - getEntries(t, e) { - let n = Fn(); - return e.forEach((t => { - const e = this.docs.get(t); - n = n.insert(t, e ? e.document.mutableCopy() : te.newInvalidDocument(t)); - })), ui.resolve(n); - } - getAll(t, e, n) { - let s = Fn(); - // Documents are ordered by key, so we can use a prefix scan to narrow down - // the documents we need to match the query against. - const i = new xt(e.child("")), r = this.docs.getIteratorFrom(i); - for (;r.hasNext(); ) { - const {key: t, value: {document: i}} = r.getNext(); - if (!e.isPrefixOf(t.path)) break; - t.path.length > e.length + 1 || (i.readTime.compareTo(n) <= 0 || (s = s.insert(i.key, i.mutableCopy()))); - } - return ui.resolve(s); - } - Mi(t, e) { - return ui.forEach(this.docs, (t => e(t))); - } - newChangeBuffer(t) { - // `trackRemovals` is ignores since the MemoryRemoteDocumentCache keeps - // a separate changelog and does not need special handling for removals. - return new _o(this); - } - getSize(t) { - return ui.resolve(this.size); - } -} - -/** - * Creates a new memory-only RemoteDocumentCache. - * - * @param sizer - Used to assess the size of a document. For eager GC, this is - * expected to just return 0 to avoid unnecessarily doing the work of - * calculating the size. - */ -/** - * Handles the details of adding and updating documents in the MemoryRemoteDocumentCache. - */ -class _o extends vr { - constructor(t) { - super(), this.Un = t; - } - applyChanges(t) { - const e = []; - return this.changes.forEach(((n, s) => { - s.isValidDocument() ? e.push(this.Un.addEntry(t, s)) : this.Un.removeEntry(n); - })), ui.waitFor(e); - } - getFromCache(t, e) { - return this.Un.getEntry(t, e); - } - getAllFromCache(t, e) { - return this.Un.getEntries(t, e); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ class wo { - constructor(t) { - this.persistence = t, - /** - * Maps a target to the data about that target - */ - this.Oi = new Dn((t => ce(t)), le), - /** The last received snapshot version. */ - this.lastRemoteSnapshotVersion = ct.min(), - /** The highest numbered target ID encountered. */ - this.highestTargetId = 0, - /** The highest sequence number encountered. */ - this.$i = 0, - /** - * A ordered bidirectional mapping between documents and the remote target - * IDs. - */ - this.Fi = new co, this.targetCount = 0, this.Bi = mr.mn(); - } - forEachTarget(t, e) { - return this.Oi.forEach(((t, n) => e(n))), ui.resolve(); - } - getLastRemoteSnapshotVersion(t) { - return ui.resolve(this.lastRemoteSnapshotVersion); - } - getHighestSequenceNumber(t) { - return ui.resolve(this.$i); - } - allocateTargetId(t) { - return this.highestTargetId = this.Bi.next(), ui.resolve(this.highestTargetId); - } - setTargetsMetadata(t, e, n) { - return n && (this.lastRemoteSnapshotVersion = n), e > this.$i && (this.$i = e), - ui.resolve(); - } - In(t) { - this.Oi.set(t.target, t); - const e = t.targetId; - e > this.highestTargetId && (this.Bi = new mr(e), this.highestTargetId = e), t.sequenceNumber > this.$i && (this.$i = t.sequenceNumber); - } - addTargetData(t, e) { - return this.In(e), this.targetCount += 1, ui.resolve(); - } - updateTargetData(t, e) { - return this.In(e), ui.resolve(); - } - removeTargetData(t, e) { - return this.Oi.delete(e.target), this.Fi.Ri(e.targetId), this.targetCount -= 1, - ui.resolve(); - } - removeTargets(t, e, n) { - let s = 0; - const i = []; - return this.Oi.forEach(((r, o) => { - o.sequenceNumber <= e && null === n.get(o.targetId) && (this.Oi.delete(r), i.push(this.removeMatchingKeysForTargetId(t, o.targetId)), - s++); - })), ui.waitFor(i).next((() => s)); - } - getTargetCount(t) { - return ui.resolve(this.targetCount); - } - getTargetData(t, e) { - const n = this.Oi.get(e) || null; - return ui.resolve(n); - } - addMatchingKeys(t, e, n) { - return this.Fi.Ti(e, n), ui.resolve(); - } - removeMatchingKeys(t, e, n) { - this.Fi.Ai(e, n); - const s = this.persistence.referenceDelegate, i = []; - return s && e.forEach((e => { - i.push(s.markPotentiallyOrphaned(t, e)); - })), ui.waitFor(i); - } - removeMatchingKeysForTargetId(t, e) { - return this.Fi.Ri(e), ui.resolve(); - } - getMatchingKeysForTargetId(t, e) { - const n = this.Fi.Pi(e); - return ui.resolve(n); - } - containsKey(t, e) { - return ui.resolve(this.Fi.containsKey(e)); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A memory-backed instance of Persistence. Data is stored only in RAM and - * not persisted across sessions. - */ -class mo { - /** - * The constructor accepts a factory for creating a reference delegate. This - * allows both the delegate and this instance to have strong references to - * each other without having nullable fields that would then need to be - * checked or asserted on every access. - */ - constructor(t, e) { - this.Li = {}, this.overlays = {}, this.Zn = new nt(0), this.ts = !1, this.ts = !0, - this.referenceDelegate = t(this), this.hs = new wo(this); - this.indexManager = new Zi, this.ls = function(t) { - return new fo(t); - }((t => this.referenceDelegate.qi(t))), this.M = new Ri(e), this.fs = new ao(this.M); - } - start() { - return Promise.resolve(); - } - shutdown() { - // No durable state to ensure is closed on shutdown. - return this.ts = !1, Promise.resolve(); - } - get started() { - return this.ts; - } - setDatabaseDeletedListener() { - // No op. - } - setNetworkEnabled() { - // No op. - } - getIndexManager(t) { - // We do not currently support indices for memory persistence, so we can - // return the same shared instance of the memory index manager. - return this.indexManager; - } - getDocumentOverlayCache(t) { - let e = this.overlays[t.toKey()]; - return e || (e = new uo, this.overlays[t.toKey()] = e), e; - } - getMutationQueue(t, e) { - let n = this.Li[t.toKey()]; - return n || (n = new lo(e, this.referenceDelegate), this.Li[t.toKey()] = n), n; - } - getTargetCache() { - return this.hs; - } - getRemoteDocumentCache() { - return this.ls; - } - getBundleCache() { - return this.fs; - } - runTransaction(t, e, n) { - O("MemoryPersistence", "Starting transaction:", t); - const s = new go(this.Zn.next()); - return this.referenceDelegate.Ui(), n(s).next((t => this.referenceDelegate.Ki(s).next((() => t)))).toPromise().then((t => (s.raiseOnCommittedEvent(), - t))); - } - Gi(t, e) { - return ui.or(Object.values(this.Li).map((n => () => n.containsKey(t, e)))); - } -} - -/** - * Memory persistence is not actually transactional, but future implementations - * may have transaction-scoped state. - */ class go extends ai { - constructor(t) { - super(), this.currentSequenceNumber = t; - } -} - -class yo { - constructor(t) { - this.persistence = t, - /** Tracks all documents that are active in Query views. */ - this.Qi = new co, - /** The list of documents that are potentially GCed after each transaction. */ - this.ji = null; - } - static Wi(t) { - return new yo(t); - } - get zi() { - if (this.ji) return this.ji; - throw L(); - } - addReference(t, e, n) { - return this.Qi.addReference(n, e), this.zi.delete(n.toString()), ui.resolve(); - } - removeReference(t, e, n) { - return this.Qi.removeReference(n, e), this.zi.add(n.toString()), ui.resolve(); - } - markPotentiallyOrphaned(t, e) { - return this.zi.add(e.toString()), ui.resolve(); - } - removeTarget(t, e) { - this.Qi.Ri(e.targetId).forEach((t => this.zi.add(t.toString()))); - const n = this.persistence.getTargetCache(); - return n.getMatchingKeysForTargetId(t, e.targetId).next((t => { - t.forEach((t => this.zi.add(t.toString()))); - })).next((() => n.removeTargetData(t, e))); - } - Ui() { - this.ji = new Set; - } - Ki(t) { - // Remove newly orphaned documents. - const e = this.persistence.getRemoteDocumentCache().newChangeBuffer(); - return ui.forEach(this.zi, (n => { - const s = xt.fromPath(n); - return this.Hi(t, s).next((t => { - t || e.removeEntry(s, ct.min()); - })); - })).next((() => (this.ji = null, e.apply(t)))); - } - updateLimboDocument(t, e) { - return this.Hi(t, e).next((t => { - t ? this.zi.delete(e.toString()) : this.zi.add(e.toString()); - })); - } - qi(t) { - // For eager GC, we don't care about the document size, there are no size thresholds. - return 0; - } - Hi(t, e) { - return ui.or([ () => ui.resolve(this.Qi.containsKey(e)), () => this.persistence.getTargetCache().containsKey(t, e), () => this.persistence.Gi(t, e) ]); - } -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -// The format of the LocalStorage key that stores the client state is: -// firestore_clients__ -/** Assembles the key for a client state in WebStorage */ -function po(t, e) { - return `firestore_clients_${t}_${e}`; -} - -// The format of the WebStorage key that stores the mutation state is: -// firestore_mutations__ -// (for unauthenticated users) -// or: firestore_mutations___ - -// 'user_uid' is last to avoid needing to escape '_' characters that it might -// contain. -/** Assembles the key for a mutation batch in WebStorage */ -function Io(t, e, n) { - let s = `firestore_mutations_${t}_${n}`; - return e.isAuthenticated() && (s += `_${e.uid}`), s; -} - -// The format of the WebStorage key that stores a query target's metadata is: -// firestore_targets__ -/** Assembles the key for a query state in WebStorage */ -function To(t, e) { - return `firestore_targets_${t}_${e}`; -} - -// The WebStorage prefix that stores the primary tab's online state. The -// format of the key is: -// firestore_online_state_ -/** - * Holds the state of a mutation batch, including its user ID, batch ID and - * whether the batch is 'pending', 'acknowledged' or 'rejected'. - */ -// Visible for testing -class Eo { - constructor(t, e, n, s) { - this.user = t, this.batchId = e, this.state = n, this.error = s; - } - /** - * Parses a MutationMetadata from its JSON representation in WebStorage. - * Logs a warning and returns null if the format of the data is not valid. - */ static Ji(t, e, n) { - const s = JSON.parse(n); - let i, r = "object" == typeof s && -1 !== [ "pending", "acknowledged", "rejected" ].indexOf(s.state) && (void 0 === s.error || "object" == typeof s.error); - return r && s.error && (r = "string" == typeof s.error.message && "string" == typeof s.error.code, - r && (i = new Q(s.error.code, s.error.message))), r ? new Eo(t, e, s.state, i) : ($("SharedClientState", `Failed to parse mutation state for ID '${e}': ${n}`), - null); - } - Yi() { - const t = { - state: this.state, - updateTimeMs: Date.now() - }; - return this.error && (t.error = { - code: this.error.code, - message: this.error.message - }), JSON.stringify(t); - } -} - -/** - * Holds the state of a query target, including its target ID and whether the - * target is 'not-current', 'current' or 'rejected'. - */ -// Visible for testing -class Ao { - constructor(t, e, n) { - this.targetId = t, this.state = e, this.error = n; - } - /** - * Parses a QueryTargetMetadata from its JSON representation in WebStorage. - * Logs a warning and returns null if the format of the data is not valid. - */ static Ji(t, e) { - const n = JSON.parse(e); - let s, i = "object" == typeof n && -1 !== [ "not-current", "current", "rejected" ].indexOf(n.state) && (void 0 === n.error || "object" == typeof n.error); - return i && n.error && (i = "string" == typeof n.error.message && "string" == typeof n.error.code, - i && (s = new Q(n.error.code, n.error.message))), i ? new Ao(t, n.state, s) : ($("SharedClientState", `Failed to parse target state for ID '${t}': ${e}`), - null); - } - Yi() { - const t = { - state: this.state, - updateTimeMs: Date.now() - }; - return this.error && (t.error = { - code: this.error.code, - message: this.error.message - }), JSON.stringify(t); - } -} - -/** - * This class represents the immutable ClientState for a client read from - * WebStorage, containing the list of active query targets. - */ class Ro { - constructor(t, e) { - this.clientId = t, this.activeTargetIds = e; - } - /** - * Parses a RemoteClientState from the JSON representation in WebStorage. - * Logs a warning and returns null if the format of the data is not valid. - */ static Ji(t, e) { - const n = JSON.parse(e); - let s = "object" == typeof n && n.activeTargetIds instanceof Array, i = jn(); - for (let t = 0; s && t < n.activeTargetIds.length; ++t) s = Ct(n.activeTargetIds[t]), - i = i.add(n.activeTargetIds[t]); - return s ? new Ro(t, i) : ($("SharedClientState", `Failed to parse client data for instance '${t}': ${e}`), - null); - } -} - -/** - * This class represents the online state for all clients participating in - * multi-tab. The online state is only written to by the primary client, and - * used in secondary clients to update their query views. - */ class bo { - constructor(t, e) { - this.clientId = t, this.onlineState = e; - } - /** - * Parses a SharedOnlineState from its JSON representation in WebStorage. - * Logs a warning and returns null if the format of the data is not valid. - */ static Ji(t) { - const e = JSON.parse(t); - return "object" == typeof e && -1 !== [ "Unknown", "Online", "Offline" ].indexOf(e.onlineState) && "string" == typeof e.clientId ? new bo(e.clientId, e.onlineState) : ($("SharedClientState", `Failed to parse online state: ${t}`), - null); - } -} - -/** - * Metadata state of the local client. Unlike `RemoteClientState`, this class is - * mutable and keeps track of all pending mutations, which allows us to - * update the range of pending mutation batch IDs as new mutations are added or - * removed. - * - * The data in `LocalClientState` is not read from WebStorage and instead - * updated via its instance methods. The updated state can be serialized via - * `toWebStorageJSON()`. - */ -// Visible for testing. -class Po { - constructor() { - this.activeTargetIds = jn(); - } - Xi(t) { - this.activeTargetIds = this.activeTargetIds.add(t); - } - Zi(t) { - this.activeTargetIds = this.activeTargetIds.delete(t); - } - /** - * Converts this entry into a JSON-encoded format we can use for WebStorage. - * Does not encode `clientId` as it is part of the key in WebStorage. - */ Yi() { - const t = { - activeTargetIds: this.activeTargetIds.toArray(), - updateTimeMs: Date.now() - }; - return JSON.stringify(t); - } -} - -/** - * `WebStorageSharedClientState` uses WebStorage (window.localStorage) as the - * backing store for the SharedClientState. It keeps track of all active - * clients and supports modifications of the local client's data. - */ class Vo { - constructor(t, e, n, s, i) { - this.window = t, this.Hn = e, this.persistenceKey = n, this.tr = s, this.syncEngine = null, - this.onlineStateHandler = null, this.sequenceNumberHandler = null, this.er = this.nr.bind(this), - this.sr = new Cn(rt), this.started = !1, - /** - * Captures WebStorage events that occur before `start()` is called. These - * events are replayed once `WebStorageSharedClientState` is started. - */ - this.ir = []; - // Escape the special characters mentioned here: - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions - const r = n.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - this.storage = this.window.localStorage, this.currentUser = i, this.rr = po(this.persistenceKey, this.tr), - this.ar = - /** Assembles the key for the current sequence number. */ - function(t) { - return `firestore_sequence_number_${t}`; - } - /** - * @license - * Copyright 2018 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ (this.persistenceKey), this.sr = this.sr.insert(this.tr, new Po), this.ur = new RegExp(`^firestore_clients_${r}_([^_]*)$`), - this.cr = new RegExp(`^firestore_mutations_${r}_(\\d+)(?:_(.*))?$`), this.hr = new RegExp(`^firestore_targets_${r}_(\\d+)$`), - this.lr = - /** Assembles the key for the online state of the primary tab. */ - function(t) { - return `firestore_online_state_${t}`; - } - // The WebStorage prefix that plays as a event to indicate the remote documents - // might have changed due to some secondary tabs loading a bundle. - // format of the key is: - // firestore_bundle_loaded_ - (this.persistenceKey), this.dr = function(t) { - return `firestore_bundle_loaded_${t}`; - } - // The WebStorage key prefix for the key that stores the last sequence number allocated. The key - // looks like 'firestore_sequence_number_'. - (this.persistenceKey), - // Rather than adding the storage observer during start(), we add the - // storage observer during initialization. This ensures that we collect - // events before other components populate their initial state (during their - // respective start() calls). Otherwise, we might for example miss a - // mutation that is added after LocalStore's start() processed the existing - // mutations but before we observe WebStorage events. - this.window.addEventListener("storage", this.er); - } - /** Returns 'true' if WebStorage is available in the current environment. */ static vt(t) { - return !(!t || !t.localStorage); - } - async start() { - // Retrieve the list of existing clients to backfill the data in - // SharedClientState. - const t = await this.syncEngine.Ms(); - for (const e of t) { - if (e === this.tr) continue; - const t = this.getItem(po(this.persistenceKey, e)); - if (t) { - const n = Ro.Ji(e, t); - n && (this.sr = this.sr.insert(n.clientId, n)); - } - } - this._r(); - // Check if there is an existing online state and call the callback handler - // if applicable. - const e = this.storage.getItem(this.lr); - if (e) { - const t = this.wr(e); - t && this.mr(t); - } - for (const t of this.ir) this.nr(t); - this.ir = [], - // Register a window unload hook to remove the client metadata entry from - // WebStorage even if `shutdown()` was not called. - this.window.addEventListener("pagehide", (() => this.shutdown())), this.started = !0; - } - writeSequenceNumber(t) { - this.setItem(this.ar, JSON.stringify(t)); - } - getAllActiveQueryTargets() { - return this.gr(this.sr); - } - isActiveQueryTarget(t) { - let e = !1; - return this.sr.forEach(((n, s) => { - s.activeTargetIds.has(t) && (e = !0); - })), e; - } - addPendingMutation(t) { - this.yr(t, "pending"); - } - updateMutationState(t, e, n) { - this.yr(t, e, n), - // Once a final mutation result is observed by other clients, they no longer - // access the mutation's metadata entry. Since WebStorage replays events - // in order, it is safe to delete the entry right after updating it. - this.pr(t); - } - addLocalQueryTarget(t) { - let e = "not-current"; - // Lookup an existing query state if the target ID was already registered - // by another tab - if (this.isActiveQueryTarget(t)) { - const n = this.storage.getItem(To(this.persistenceKey, t)); - if (n) { - const s = Ao.Ji(t, n); - s && (e = s.state); - } - } - return this.Ir.Xi(t), this._r(), e; - } - removeLocalQueryTarget(t) { - this.Ir.Zi(t), this._r(); - } - isLocalQueryTarget(t) { - return this.Ir.activeTargetIds.has(t); - } - clearQueryState(t) { - this.removeItem(To(this.persistenceKey, t)); - } - updateQueryState(t, e, n) { - this.Tr(t, e, n); - } - handleUserChange(t, e, n) { - e.forEach((t => { - this.pr(t); - })), this.currentUser = t, n.forEach((t => { - this.addPendingMutation(t); - })); - } - setOnlineState(t) { - this.Er(t); - } - notifyBundleLoaded() { - this.Ar(); - } - shutdown() { - this.started && (this.window.removeEventListener("storage", this.er), this.removeItem(this.rr), - this.started = !1); - } - getItem(t) { - const e = this.storage.getItem(t); - return O("SharedClientState", "READ", t, e), e; - } - setItem(t, e) { - O("SharedClientState", "SET", t, e), this.storage.setItem(t, e); - } - removeItem(t) { - O("SharedClientState", "REMOVE", t), this.storage.removeItem(t); - } - nr(t) { - // Note: The function is typed to take Event to be interface-compatible with - // `Window.addEventListener`. - const e = t; - if (e.storageArea === this.storage) { - if (O("SharedClientState", "EVENT", e.key, e.newValue), e.key === this.rr) return void $("Received WebStorage notification for local change. Another client might have garbage-collected our state"); - this.Hn.enqueueRetryable((async () => { - if (this.started) { - if (null !== e.key) if (this.ur.test(e.key)) { - if (null == e.newValue) { - const t = this.Rr(e.key); - return this.br(t, null); - } - { - const t = this.Pr(e.key, e.newValue); - if (t) return this.br(t.clientId, t); - } - } else if (this.cr.test(e.key)) { - if (null !== e.newValue) { - const t = this.Vr(e.key, e.newValue); - if (t) return this.vr(t); - } - } else if (this.hr.test(e.key)) { - if (null !== e.newValue) { - const t = this.Sr(e.key, e.newValue); - if (t) return this.Dr(t); - } - } else if (e.key === this.lr) { - if (null !== e.newValue) { - const t = this.wr(e.newValue); - if (t) return this.mr(t); - } - } else if (e.key === this.ar) { - const t = function(t) { - let e = nt.A; - if (null != t) try { - const n = JSON.parse(t); - q("number" == typeof n), e = n; - } catch (t) { - $("SharedClientState", "Failed to read sequence number from WebStorage", t); - } - return e; - } - /** - * `MemorySharedClientState` is a simple implementation of SharedClientState for - * clients using memory persistence. The state in this class remains fully - * isolated and no synchronization is performed. - */ (e.newValue); - t !== nt.A && this.sequenceNumberHandler(t); - } else if (e.key === this.dr) return this.syncEngine.Cr(); - } else this.ir.push(e); - })); - } - } - get Ir() { - return this.sr.get(this.tr); - } - _r() { - this.setItem(this.rr, this.Ir.Yi()); - } - yr(t, e, n) { - const s = new Eo(this.currentUser, t, e, n), i = Io(this.persistenceKey, this.currentUser, t); - this.setItem(i, s.Yi()); - } - pr(t) { - const e = Io(this.persistenceKey, this.currentUser, t); - this.removeItem(e); - } - Er(t) { - const e = { - clientId: this.tr, - onlineState: t - }; - this.storage.setItem(this.lr, JSON.stringify(e)); - } - Tr(t, e, n) { - const s = To(this.persistenceKey, t), i = new Ao(t, e, n); - this.setItem(s, i.Yi()); - } - Ar() { - this.setItem(this.dr, "value-not-used"); - } - /** - * Parses a client state key in WebStorage. Returns null if the key does not - * match the expected key format. - */ Rr(t) { - const e = this.ur.exec(t); - return e ? e[1] : null; - } - /** - * Parses a client state in WebStorage. Returns 'null' if the value could not - * be parsed. - */ Pr(t, e) { - const n = this.Rr(t); - return Ro.Ji(n, e); - } - /** - * Parses a mutation batch state in WebStorage. Returns 'null' if the value - * could not be parsed. - */ Vr(t, e) { - const n = this.cr.exec(t), s = Number(n[1]), i = void 0 !== n[2] ? n[2] : null; - return Eo.Ji(new C(i), s, e); - } - /** - * Parses a query target state from WebStorage. Returns 'null' if the value - * could not be parsed. - */ Sr(t, e) { - const n = this.hr.exec(t), s = Number(n[1]); - return Ao.Ji(s, e); - } - /** - * Parses an online state from WebStorage. Returns 'null' if the value - * could not be parsed. - */ wr(t) { - return bo.Ji(t); - } - async vr(t) { - if (t.user.uid === this.currentUser.uid) return this.syncEngine.Nr(t.batchId, t.state, t.error); - O("SharedClientState", `Ignoring mutation for non-active user ${t.user.uid}`); - } - Dr(t) { - return this.syncEngine.kr(t.targetId, t.state, t.error); - } - br(t, e) { - const n = e ? this.sr.insert(t, e) : this.sr.remove(t), s = this.gr(this.sr), i = this.gr(n), r = [], o = []; - return i.forEach((t => { - s.has(t) || r.push(t); - })), s.forEach((t => { - i.has(t) || o.push(t); - })), this.syncEngine.Mr(r, o).then((() => { - this.sr = n; - })); - } - mr(t) { - // We check whether the client that wrote this online state is still active - // by comparing its client ID to the list of clients kept active in - // IndexedDb. If a client does not update their IndexedDb client state - // within 5 seconds, it is considered inactive and we don't emit an online - // state event. - this.sr.get(t.clientId) && this.onlineStateHandler(t.onlineState); - } - gr(t) { - let e = jn(); - return t.forEach(((t, n) => { - e = e.unionWith(n.activeTargetIds); - })), e; - } -} - -class vo { - constructor() { - this.Or = new Po, this.$r = {}, this.onlineStateHandler = null, this.sequenceNumberHandler = null; - } - addPendingMutation(t) { - // No op. - } - updateMutationState(t, e, n) { - // No op. - } - addLocalQueryTarget(t) { - return this.Or.Xi(t), this.$r[t] || "not-current"; - } - updateQueryState(t, e, n) { - this.$r[t] = e; - } - removeLocalQueryTarget(t) { - this.Or.Zi(t); - } - isLocalQueryTarget(t) { - return this.Or.activeTargetIds.has(t); - } - clearQueryState(t) { - delete this.$r[t]; - } - getAllActiveQueryTargets() { - return this.Or.activeTargetIds; - } - isActiveQueryTarget(t) { - return this.Or.activeTargetIds.has(t); - } - start() { - return this.Or = new Po, Promise.resolve(); - } - handleUserChange(t, e, n) { - // No op. - } - setOnlineState(t) { - // No op. - } - shutdown() {} - writeSequenceNumber(t) {} - notifyBundleLoaded() { - // No op. - } -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ class So { - Fr(t) { - // No-op. - } - shutdown() { - // No-op. - } -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -// References to `window` are guarded by BrowserConnectivityMonitor.isAvailable() -/* eslint-disable no-restricted-globals */ -/** - * Browser implementation of ConnectivityMonitor. - */ -class Do { - constructor() { - this.Br = () => this.Lr(), this.qr = () => this.Ur(), this.Kr = [], this.Gr(); - } - Fr(t) { - this.Kr.push(t); - } - shutdown() { - window.removeEventListener("online", this.Br), window.removeEventListener("offline", this.qr); - } - Gr() { - window.addEventListener("online", this.Br), window.addEventListener("offline", this.qr); - } - Lr() { - O("ConnectivityMonitor", "Network connectivity changed: AVAILABLE"); - for (const t of this.Kr) t(0 /* AVAILABLE */); - } - Ur() { - O("ConnectivityMonitor", "Network connectivity changed: UNAVAILABLE"); - for (const t of this.Kr) t(1 /* UNAVAILABLE */); - } - // TODO(chenbrian): Consider passing in window either into this component or - // here for testing via FakeWindow. - /** Checks that all used attributes of window are available. */ - static vt() { - return "undefined" != typeof window && void 0 !== window.addEventListener && void 0 !== window.removeEventListener; - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ const Co = { - BatchGetDocuments: "batchGet", - Commit: "commit", - RunQuery: "runQuery" -}; - -/** - * Maps RPC names to the corresponding REST endpoint name. - * - * We use array notation to avoid mangling. - */ -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Provides a simple helper class that implements the Stream interface to - * bridge to other implementations that are streams but do not implement the - * interface. The stream callbacks are invoked with the callOn... methods. - */ -class xo { - constructor(t) { - this.Qr = t.Qr, this.jr = t.jr; - } - Wr(t) { - this.zr = t; - } - Hr(t) { - this.Jr = t; - } - onMessage(t) { - this.Yr = t; - } - close() { - this.jr(); - } - send(t) { - this.Qr(t); - } - Xr() { - this.zr(); - } - Zr(t) { - this.Jr(t); - } - eo(t) { - this.Yr(t); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ class No extends -/** - * Base class for all Rest-based connections to the backend (WebChannel and - * HTTP). - */ -class { - constructor(t) { - this.databaseInfo = t, this.databaseId = t.databaseId; - const e = t.ssl ? "https" : "http"; - this.no = e + "://" + t.host, this.so = "projects/" + this.databaseId.projectId + "/databases/" + this.databaseId.database + "/documents"; - } - io(t, e, n, s, i) { - const r = this.ro(t, e); - O("RestConnection", "Sending: ", r, n); - const o = {}; - return this.oo(o, s, i), this.ao(t, r, o, n).then((t => (O("RestConnection", "Received: ", t), - t)), (e => { - throw F("RestConnection", `${t} failed with error: `, e, "url: ", r, "request:", n), - e; - })); - } - uo(t, e, n, s, i) { - // The REST API automatically aggregates all of the streamed results, so we - // can just use the normal invoke() method. - return this.io(t, e, n, s, i); - } - /** - * Modifies the headers for a request, adding any authorization token if - * present and any additional headers for the request. - */ oo(t, e, n) { - t["X-Goog-Api-Client"] = "gl-js/ fire/" + x, - // Content-Type: text/plain will avoid preflight requests which might - // mess with CORS and redirects by proxies. If we add custom headers - // we will need to change this code to potentially use the $httpOverwrite - // parameter supported by ESF to avoid triggering preflight requests. - t["Content-Type"] = "text/plain", this.databaseInfo.appId && (t["X-Firebase-GMPID"] = this.databaseInfo.appId), - e && e.headers.forEach(((e, n) => t[n] = e)), n && n.headers.forEach(((e, n) => t[n] = e)); - } - ro(t, e) { - const n = Co[t]; - return `${this.no}/v1/${e}:${n}`; - } -} { - constructor(t) { - super(t), this.forceLongPolling = t.forceLongPolling, this.autoDetectLongPolling = t.autoDetectLongPolling, - this.useFetchStreams = t.useFetchStreams; - } - ao(t, e, n, s) { - return new Promise(((i, r) => { - const o = new _firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.XhrIo; - o.listenOnce(_firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.EventType.COMPLETE, (() => { - try { - switch (o.getLastErrorCode()) { - case _firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.ErrorCode.NO_ERROR: - const e = o.getResponseJson(); - O("Connection", "XHR received:", JSON.stringify(e)), i(e); - break; - - case _firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.ErrorCode.TIMEOUT: - O("Connection", 'RPC "' + t + '" timed out'), r(new Q(G.DEADLINE_EXCEEDED, "Request time out")); - break; - - case _firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.ErrorCode.HTTP_ERROR: - const n = o.getStatus(); - if (O("Connection", 'RPC "' + t + '" failed with status:', n, "response text:", o.getResponseText()), - n > 0) { - const t = o.getResponseJson().error; - if (t && t.status && t.message) { - const e = function(t) { - const e = t.toLowerCase().replace(/_/g, "-"); - return Object.values(G).indexOf(e) >= 0 ? e : G.UNKNOWN; - }(t.status); - r(new Q(e, t.message)); - } else r(new Q(G.UNKNOWN, "Server responded with status " + o.getStatus())); - } else - // If we received an HTTP_ERROR but there's no status code, - // it's most probably a connection issue - r(new Q(G.UNAVAILABLE, "Connection failed.")); - break; - - default: - L(); - } - } finally { - O("Connection", 'RPC "' + t + '" completed.'); - } - })); - const a = JSON.stringify(s); - o.send(e, "POST", a, n, 15); - })); - } - co(t, e, n) { - const s = [ this.no, "/", "google.firestore.v1.Firestore", "/", t, "/channel" ], i = (0,_firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.createWebChannelTransport)(), r = (0,_firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.getStatEventTarget)(), o = { - // Required for backend stickiness, routing behavior is based on this - // parameter. - httpSessionIdParam: "gsessionid", - initMessageHeaders: {}, - messageUrlParams: { - // This param is used to improve routing and project isolation by the - // backend and must be included in every request. - database: `projects/${this.databaseId.projectId}/databases/${this.databaseId.database}` - }, - sendRawJson: !0, - supportsCrossDomainXhr: !0, - internalChannelParams: { - // Override the default timeout (randomized between 10-20 seconds) since - // a large write batch on a slow internet connection may take a long - // time to send to the backend. Rather than have WebChannel impose a - // tight timeout which could lead to infinite timeouts and retries, we - // set it very large (5-10 minutes) and rely on the browser's builtin - // timeouts to kick in if the request isn't working. - forwardChannelRequestTimeoutMs: 6e5 - }, - forceLongPolling: this.forceLongPolling, - detectBufferingProxy: this.autoDetectLongPolling - }; - this.useFetchStreams && (o.xmlHttpFactory = new _firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.FetchXmlHttpFactory({})), this.oo(o.initMessageHeaders, e, n), - // Sending the custom headers we just added to request.initMessageHeaders - // (Authorization, etc.) will trigger the browser to make a CORS preflight - // request because the XHR will no longer meet the criteria for a "simple" - // CORS request: - // https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Simple_requests - // Therefore to avoid the CORS preflight request (an extra network - // roundtrip), we use the httpHeadersOverwriteParam option to specify that - // the headers should instead be encoded into a special "$httpHeaders" query - // parameter, which is recognized by the webchannel backend. This is - // formally defined here: - // https://github.com/google/closure-library/blob/b0e1815b13fb92a46d7c9b3c30de5d6a396a3245/closure/goog/net/rpc/httpcors.js#L32 - // TODO(b/145624756): There is a backend bug where $httpHeaders isn't respected if the request - // doesn't have an Origin header. So we have to exclude a few browser environments that are - // known to (sometimes) not include an Origin. See - // https://github.com/firebase/firebase-js-sdk/issues/1491. - (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.isMobileCordova)() || (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.isReactNative)() || (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.isElectron)() || (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.isIE)() || (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.isUWP)() || (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.isBrowserExtension)() || (o.httpHeadersOverwriteParam = "$httpHeaders"); - const a = s.join(""); - O("Connection", "Creating WebChannel: " + a, o); - const u = i.createWebChannel(a, o); - // WebChannel supports sending the first message with the handshake - saving - // a network round trip. However, it will have to call send in the same - // JS event loop as open. In order to enforce this, we delay actually - // opening the WebChannel until send is called. Whether we have called - // open is tracked with this variable. - let c = !1, h = !1; - // A flag to determine whether the stream was closed (by us or through an - // error/close event) to avoid delivering multiple close events or sending - // on a closed stream - const l = new xo({ - Qr: t => { - h ? O("Connection", "Not sending because WebChannel is closed:", t) : (c || (O("Connection", "Opening WebChannel transport."), - u.open(), c = !0), O("Connection", "WebChannel sending:", t), u.send(t)); - }, - jr: () => u.close() - }), y = (t, e, n) => { - // TODO(dimond): closure typing seems broken because WebChannel does - // not implement goog.events.Listenable - t.listen(e, (t => { - try { - n(t); - } catch (t) { - setTimeout((() => { - throw t; - }), 0); - } - })); - }; - // Closure events are guarded and exceptions are swallowed, so catch any - // exception and rethrow using a setTimeout so they become visible again. - // Note that eventually this function could go away if we are confident - // enough the code is exception free. - return y(u, _firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.WebChannel.EventType.OPEN, (() => { - h || O("Connection", "WebChannel transport opened."); - })), y(u, _firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.WebChannel.EventType.CLOSE, (() => { - h || (h = !0, O("Connection", "WebChannel transport closed"), l.Zr()); - })), y(u, _firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.WebChannel.EventType.ERROR, (t => { - h || (h = !0, F("Connection", "WebChannel transport errored:", t), l.Zr(new Q(G.UNAVAILABLE, "The operation could not be completed"))); - })), y(u, _firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.WebChannel.EventType.MESSAGE, (t => { - var e; - if (!h) { - const n = t.data[0]; - q(!!n); - // TODO(b/35143891): There is a bug in One Platform that caused errors - // (and only errors) to be wrapped in an extra array. To be forward - // compatible with the bug we need to check either condition. The latter - // can be removed once the fix has been rolled out. - // Use any because msgData.error is not typed. - const s = n, i = s.error || (null === (e = s[0]) || void 0 === e ? void 0 : e.error); - if (i) { - O("Connection", "WebChannel received error:", i); - // error.status will be a string like 'OK' or 'NOT_FOUND'. - const t = i.status; - let e = - /** - * Maps an error Code from a GRPC status identifier like 'NOT_FOUND'. - * - * @returns The Code equivalent to the given status string or undefined if - * there is no match. - */ - function(t) { - // lookup by string - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const e = Pn[t]; - if (void 0 !== e) return Sn(e); - }(t), n = i.message; - void 0 === e && (e = G.INTERNAL, n = "Unknown error status: " + t + " with message " + i.message), - // Mark closed so no further events are propagated - h = !0, l.Zr(new Q(e, n)), u.close(); - } else O("Connection", "WebChannel received:", n), l.eo(n); - } - })), y(r, _firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.Event.STAT_EVENT, (t => { - t.stat === _firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.Stat.PROXY ? O("Connection", "Detected buffering proxy") : t.stat === _firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.Stat.NOPROXY && O("Connection", "Detected no buffering proxy"); - })), setTimeout((() => { - // Technically we could/should wait for the WebChannel opened event, - // but because we want to send the first message with the WebChannel - // handshake we pretend the channel opened here (asynchronously), and - // then delay the actual open until the first message is sent. - l.Xr(); - }), 0), l; - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** Initializes the WebChannelConnection for the browser. */ -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** The Platform's 'window' implementation or null if not available. */ -function ko() { - // `window` is not always available, e.g. in ReactNative and WebWorkers. - // eslint-disable-next-line no-restricted-globals - return "undefined" != typeof window ? window : null; -} - -/** The Platform's 'document' implementation or null if not available. */ function Mo() { - // `document` is not always available, e.g. in ReactNative and WebWorkers. - // eslint-disable-next-line no-restricted-globals - return "undefined" != typeof document ? document : null; -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ function Oo(t) { - return new is(t, /* useProto3Json= */ !0); -} - -/** - * An instance of the Platform's 'TextEncoder' implementation. - */ -/** - * A helper for running delayed tasks following an exponential backoff curve - * between attempts. - * - * Each delay is made up of a "base" delay which follows the exponential - * backoff curve, and a +/- 50% "jitter" that is calculated and added to the - * base delay. This prevents clients from accidentally synchronizing their - * delays causing spikes of load to the backend. - */ -class $o { - constructor( - /** - * The AsyncQueue to run backoff operations on. - */ - t, - /** - * The ID to use when scheduling backoff operations on the AsyncQueue. - */ - e, - /** - * The initial delay (used as the base delay on the first retry attempt). - * Note that jitter will still be applied, so the actual delay could be as - * little as 0.5*initialDelayMs. - */ - n = 1e3 - /** - * The multiplier to use to determine the extended base delay after each - * attempt. - */ , s = 1.5 - /** - * The maximum base delay after which no further backoff is performed. - * Note that jitter will still be applied, so the actual delay could be as - * much as 1.5*maxDelayMs. - */ , i = 6e4) { - this.Hn = t, this.timerId = e, this.ho = n, this.lo = s, this.fo = i, this._o = 0, - this.wo = null, - /** The last backoff attempt, as epoch milliseconds. */ - this.mo = Date.now(), this.reset(); - } - /** - * Resets the backoff delay. - * - * The very next backoffAndWait() will have no delay. If it is called again - * (i.e. due to an error), initialDelayMs (plus jitter) will be used, and - * subsequent ones will increase according to the backoffFactor. - */ reset() { - this._o = 0; - } - /** - * Resets the backoff delay to the maximum delay (e.g. for use after a - * RESOURCE_EXHAUSTED error). - */ yo() { - this._o = this.fo; - } - /** - * Returns a promise that resolves after currentDelayMs, and increases the - * delay for any subsequent attempts. If there was a pending backoff operation - * already, it will be canceled. - */ po(t) { - // Cancel any pending backoff operation. - this.cancel(); - // First schedule using the current base (which may be 0 and should be - // honored as such). - const e = Math.floor(this._o + this.Io()), n = Math.max(0, Date.now() - this.mo), s = Math.max(0, e - n); - // Guard against lastAttemptTime being in the future due to a clock change. - s > 0 && O("ExponentialBackoff", `Backing off for ${s} ms (base delay: ${this._o} ms, delay with jitter: ${e} ms, last attempt: ${n} ms ago)`), - this.wo = this.Hn.enqueueAfterDelay(this.timerId, s, (() => (this.mo = Date.now(), - t()))), - // Apply backoff factor to determine next delay and ensure it is within - // bounds. - this._o *= this.lo, this._o < this.ho && (this._o = this.ho), this._o > this.fo && (this._o = this.fo); - } - To() { - null !== this.wo && (this.wo.skipDelay(), this.wo = null); - } - cancel() { - null !== this.wo && (this.wo.cancel(), this.wo = null); - } - /** Returns a random value in the range [-currentBaseMs/2, currentBaseMs/2] */ Io() { - return (Math.random() - .5) * this._o; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A PersistentStream is an abstract base class that represents a streaming RPC - * to the Firestore backend. It's built on top of the connections own support - * for streaming RPCs, and adds several critical features for our clients: - * - * - Exponential backoff on failure - * - Authentication via CredentialsProvider - * - Dispatching all callbacks into the shared worker queue - * - Closing idle streams after 60 seconds of inactivity - * - * Subclasses of PersistentStream implement serialization of models to and - * from the JSON representation of the protocol buffers for a specific - * streaming RPC. - * - * ## Starting and Stopping - * - * Streaming RPCs are stateful and need to be start()ed before messages can - * be sent and received. The PersistentStream will call the onOpen() function - * of the listener once the stream is ready to accept requests. - * - * Should a start() fail, PersistentStream will call the registered onClose() - * listener with a FirestoreError indicating what went wrong. - * - * A PersistentStream can be started and stopped repeatedly. - * - * Generic types: - * SendType: The type of the outgoing message of the underlying - * connection stream - * ReceiveType: The type of the incoming message of the underlying - * connection stream - * ListenerType: The type of the listener that will be used for callbacks - */ -class Fo { - constructor(t, e, n, s, i, r, o, a) { - this.Hn = t, this.Eo = n, this.Ao = s, this.Ro = i, this.authCredentialsProvider = r, - this.appCheckCredentialsProvider = o, this.listener = a, this.state = 0 /* Initial */ , - /** - * A close count that's incremented every time the stream is closed; used by - * getCloseGuardedDispatcher() to invalidate callbacks that happen after - * close. - */ - this.bo = 0, this.Po = null, this.Vo = null, this.stream = null, this.vo = new $o(t, e); - } - /** - * Returns true if start() has been called and no error has occurred. True - * indicates the stream is open or in the process of opening (which - * encompasses respecting backoff, getting auth tokens, and starting the - * actual RPC). Use isOpen() to determine if the stream is open and ready for - * outbound requests. - */ So() { - return 1 /* Starting */ === this.state || 5 /* Backoff */ === this.state || this.Do(); - } - /** - * Returns true if the underlying RPC is open (the onOpen() listener has been - * called) and the stream is ready for outbound requests. - */ Do() { - return 2 /* Open */ === this.state || 3 /* Healthy */ === this.state; - } - /** - * Starts the RPC. Only allowed if isStarted() returns false. The stream is - * not immediately ready for use: onOpen() will be invoked when the RPC is - * ready for outbound requests, at which point isOpen() will return true. - * - * When start returns, isStarted() will return true. - */ start() { - 4 /* Error */ !== this.state ? this.auth() : this.Co(); - } - /** - * Stops the RPC. This call is idempotent and allowed regardless of the - * current isStarted() state. - * - * When stop returns, isStarted() and isOpen() will both return false. - */ async stop() { - this.So() && await this.close(0 /* Initial */); - } - /** - * After an error the stream will usually back off on the next attempt to - * start it. If the error warrants an immediate restart of the stream, the - * sender can use this to indicate that the receiver should not back off. - * - * Each error will call the onClose() listener. That function can decide to - * inhibit backoff if required. - */ xo() { - this.state = 0 /* Initial */ , this.vo.reset(); - } - /** - * Marks this stream as idle. If no further actions are performed on the - * stream for one minute, the stream will automatically close itself and - * notify the stream's onClose() handler with Status.OK. The stream will then - * be in a !isStarted() state, requiring the caller to start the stream again - * before further use. - * - * Only streams that are in state 'Open' can be marked idle, as all other - * states imply pending network operations. - */ No() { - // Starts the idle time if we are in state 'Open' and are not yet already - // running a timer (in which case the previous idle timeout still applies). - this.Do() && null === this.Po && (this.Po = this.Hn.enqueueAfterDelay(this.Eo, 6e4, (() => this.ko()))); - } - /** Sends a message to the underlying stream. */ Mo(t) { - this.Oo(), this.stream.send(t); - } - /** Called by the idle timer when the stream should close due to inactivity. */ async ko() { - if (this.Do()) - // When timing out an idle stream there's no reason to force the stream into backoff when - // it restarts so set the stream state to Initial instead of Error. - return this.close(0 /* Initial */); - } - /** Marks the stream as active again. */ Oo() { - this.Po && (this.Po.cancel(), this.Po = null); - } - /** Cancels the health check delayed operation. */ $o() { - this.Vo && (this.Vo.cancel(), this.Vo = null); - } - /** - * Closes the stream and cleans up as necessary: - * - * * closes the underlying GRPC stream; - * * calls the onClose handler with the given 'error'; - * * sets internal stream state to 'finalState'; - * * adjusts the backoff timer based on the error - * - * A new stream can be opened by calling start(). - * - * @param finalState - the intended state of the stream after closing. - * @param error - the error the connection was closed with. - */ async close(t, e) { - // Cancel any outstanding timers (they're guaranteed not to execute). - this.Oo(), this.$o(), this.vo.cancel(), - // Invalidates any stream-related callbacks (e.g. from auth or the - // underlying stream), guaranteeing they won't execute. - this.bo++, 4 /* Error */ !== t ? - // If this is an intentional close ensure we don't delay our next connection attempt. - this.vo.reset() : e && e.code === G.RESOURCE_EXHAUSTED ? ( - // Log the error. (Probably either 'quota exceeded' or 'max queue length reached'.) - $(e.toString()), $("Using maximum backoff delay to prevent overloading the backend."), - this.vo.yo()) : e && e.code === G.UNAUTHENTICATED && 3 /* Healthy */ !== this.state && ( - // "unauthenticated" error means the token was rejected. This should rarely - // happen since both Auth and AppCheck ensure a sufficient TTL when we - // request a token. If a user manually resets their system clock this can - // fail, however. In this case, we should get a Code.UNAUTHENTICATED error - // before we received the first message and we need to invalidate the token - // to ensure that we fetch a new token. - this.authCredentialsProvider.invalidateToken(), this.appCheckCredentialsProvider.invalidateToken()), - // Clean up the underlying stream because we are no longer interested in events. - null !== this.stream && (this.Fo(), this.stream.close(), this.stream = null), - // This state must be assigned before calling onClose() to allow the callback to - // inhibit backoff or otherwise manipulate the state in its non-started state. - this.state = t, - // Notify the listener that the stream closed. - await this.listener.Hr(e); - } - /** - * Can be overridden to perform additional cleanup before the stream is closed. - * Calling super.tearDown() is not required. - */ Fo() {} - auth() { - this.state = 1 /* Starting */; - const t = this.Bo(this.bo), e = this.bo; - // TODO(mikelehen): Just use dispatchIfNotClosed, but see TODO below. - Promise.all([ this.authCredentialsProvider.getToken(), this.appCheckCredentialsProvider.getToken() ]).then((([t, n]) => { - // Stream can be stopped while waiting for authentication. - // TODO(mikelehen): We really should just use dispatchIfNotClosed - // and let this dispatch onto the queue, but that opened a spec test can - // of worms that I don't want to deal with in this PR. - this.bo === e && - // Normally we'd have to schedule the callback on the AsyncQueue. - // However, the following calls are safe to be called outside the - // AsyncQueue since they don't chain asynchronous calls - this.Lo(t, n); - }), (e => { - t((() => { - const t = new Q(G.UNKNOWN, "Fetching auth token failed: " + e.message); - return this.qo(t); - })); - })); - } - Lo(t, e) { - const n = this.Bo(this.bo); - this.stream = this.Uo(t, e), this.stream.Wr((() => { - n((() => (this.state = 2 /* Open */ , this.Vo = this.Hn.enqueueAfterDelay(this.Ao, 1e4, (() => (this.Do() && (this.state = 3 /* Healthy */), - Promise.resolve()))), this.listener.Wr()))); - })), this.stream.Hr((t => { - n((() => this.qo(t))); - })), this.stream.onMessage((t => { - n((() => this.onMessage(t))); - })); - } - Co() { - this.state = 5 /* Backoff */ , this.vo.po((async () => { - this.state = 0 /* Initial */ , this.start(); - })); - } - // Visible for tests - qo(t) { - // In theory the stream could close cleanly, however, in our current model - // we never expect this to happen because if we stop a stream ourselves, - // this callback will never be called. To prevent cases where we retry - // without a backoff accidentally, we set the stream to error in all cases. - return O("PersistentStream", `close with error: ${t}`), this.stream = null, this.close(4 /* Error */ , t); - } - /** - * Returns a "dispatcher" function that dispatches operations onto the - * AsyncQueue but only runs them if closeCount remains unchanged. This allows - * us to turn auth / stream callbacks into no-ops if the stream is closed / - * re-opened, etc. - */ Bo(t) { - return e => { - this.Hn.enqueueAndForget((() => this.bo === t ? e() : (O("PersistentStream", "stream callback skipped by getCloseGuardedDispatcher."), - Promise.resolve()))); - }; - } -} - -/** - * A PersistentStream that implements the Listen RPC. - * - * Once the Listen stream has called the onOpen() listener, any number of - * listen() and unlisten() calls can be made to control what changes will be - * sent from the server for ListenResponses. - */ class Bo extends Fo { - constructor(t, e, n, s, i, r) { - super(t, "listen_stream_connection_backoff" /* ListenStreamConnectionBackoff */ , "listen_stream_idle" /* ListenStreamIdle */ , "health_check_timeout" /* HealthCheckTimeout */ , e, n, s, r), - this.M = i; - } - Uo(t, e) { - return this.Ro.co("Listen", t, e); - } - onMessage(t) { - // A successful response means the stream is healthy - this.vo.reset(); - const e = Is(this.M, t), n = function(t) { - // We have only reached a consistent snapshot for the entire stream if there - // is a read_time set and it applies to all targets (i.e. the list of - // targets is empty). The backend is guaranteed to send such responses. - if (!("targetChange" in t)) return ct.min(); - const e = t.targetChange; - return e.targetIds && e.targetIds.length ? ct.min() : e.readTime ? us(e.readTime) : ct.min(); - }(t); - return this.listener.Ko(e, n); - } - /** - * Registers interest in the results of the given target. If the target - * includes a resumeToken it will be included in the request. Results that - * affect the target will be streamed back as WatchChange messages that - * reference the targetId. - */ Go(t) { - const e = {}; - e.database = ws(this.M), e.addTarget = function(t, e) { - let n; - const s = e.target; - return n = fe(s) ? { - documents: Rs(t, s) - } : { - query: bs(t, s) - }, n.targetId = e.targetId, e.resumeToken.approximateByteSize() > 0 ? n.resumeToken = os(t, e.resumeToken) : e.snapshotVersion.compareTo(ct.min()) > 0 && ( - // TODO(wuandy): Consider removing above check because it is most likely true. - // Right now, many tests depend on this behaviour though (leaving min() out - // of serialization). - n.readTime = rs(t, e.snapshotVersion.toTimestamp())), n; - }(this.M, t); - const n = Vs(this.M, t); - n && (e.labels = n), this.Mo(e); - } - /** - * Unregisters interest in the results of the target associated with the - * given targetId. - */ Qo(t) { - const e = {}; - e.database = ws(this.M), e.removeTarget = t, this.Mo(e); - } -} - -/** - * A Stream that implements the Write RPC. - * - * The Write RPC requires the caller to maintain special streamToken - * state in between calls, to help the server understand which responses the - * client has processed by the time the next request is made. Every response - * will contain a streamToken; this value must be passed to the next - * request. - * - * After calling start() on this stream, the next request must be a handshake, - * containing whatever streamToken is on hand. Once a response to this - * request is received, all pending mutations may be submitted. When - * submitting multiple batches of mutations at the same time, it's - * okay to use the same streamToken for the calls to writeMutations. - * - * TODO(b/33271235): Use proto types - */ class Lo extends Fo { - constructor(t, e, n, s, i, r) { - super(t, "write_stream_connection_backoff" /* WriteStreamConnectionBackoff */ , "write_stream_idle" /* WriteStreamIdle */ , "health_check_timeout" /* HealthCheckTimeout */ , e, n, s, r), - this.M = i, this.jo = !1; - } - /** - * Tracks whether or not a handshake has been successfully exchanged and - * the stream is ready to accept mutations. - */ get Wo() { - return this.jo; - } - // Override of PersistentStream.start - start() { - this.jo = !1, this.lastStreamToken = void 0, super.start(); - } - Fo() { - this.jo && this.zo([]); - } - Uo(t, e) { - return this.Ro.co("Write", t, e); - } - onMessage(t) { - if ( - // Always capture the last stream token. - q(!!t.streamToken), this.lastStreamToken = t.streamToken, this.jo) { - // A successful first write response means the stream is healthy, - // Note, that we could consider a successful handshake healthy, however, - // the write itself might be causing an error we want to back off from. - this.vo.reset(); - const e = As(t.writeResults, t.commitTime), n = us(t.commitTime); - return this.listener.Ho(n, e); - } - // The first response is always the handshake response - return q(!t.writeResults || 0 === t.writeResults.length), this.jo = !0, this.listener.Jo(); - } - /** - * Sends an initial streamToken to the server, performing the handshake - * required to make the StreamingWrite RPC work. Subsequent - * calls should wait until onHandshakeComplete was called. - */ Yo() { - // TODO(dimond): Support stream resumption. We intentionally do not set the - // stream token on the handshake, ignoring any stream token we might have. - const t = {}; - t.database = ws(this.M), this.Mo(t); - } - /** Sends a group of mutations to the Firestore backend to apply. */ zo(t) { - const e = { - streamToken: this.lastStreamToken, - writes: t.map((t => Ts(this.M, t))) - }; - this.Mo(e); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Datastore and its related methods are a wrapper around the external Google - * Cloud Datastore grpc API, which provides an interface that is more convenient - * for the rest of the client SDK architecture to consume. - */ -/** - * An implementation of Datastore that exposes additional state for internal - * consumption. - */ -class qo extends class {} { - constructor(t, e, n, s) { - super(), this.authCredentials = t, this.appCheckCredentials = e, this.Ro = n, this.M = s, - this.Xo = !1; - } - Zo() { - if (this.Xo) throw new Q(G.FAILED_PRECONDITION, "The client has already been terminated."); - } - /** Invokes the provided RPC with auth and AppCheck tokens. */ io(t, e, n) { - return this.Zo(), Promise.all([ this.authCredentials.getToken(), this.appCheckCredentials.getToken() ]).then((([s, i]) => this.Ro.io(t, e, n, s, i))).catch((t => { - throw "FirebaseError" === t.name ? (t.code === G.UNAUTHENTICATED && (this.authCredentials.invalidateToken(), - this.appCheckCredentials.invalidateToken()), t) : new Q(G.UNKNOWN, t.toString()); - })); - } - /** Invokes the provided RPC with streamed results with auth and AppCheck tokens. */ uo(t, e, n) { - return this.Zo(), Promise.all([ this.authCredentials.getToken(), this.appCheckCredentials.getToken() ]).then((([s, i]) => this.Ro.uo(t, e, n, s, i))).catch((t => { - throw "FirebaseError" === t.name ? (t.code === G.UNAUTHENTICATED && (this.authCredentials.invalidateToken(), - this.appCheckCredentials.invalidateToken()), t) : new Q(G.UNKNOWN, t.toString()); - })); - } - terminate() { - this.Xo = !0; - } -} - -// TODO(firestorexp): Make sure there is only one Datastore instance per -// firestore-exp client. -/** - * A component used by the RemoteStore to track the OnlineState (that is, - * whether or not the client as a whole should be considered to be online or - * offline), implementing the appropriate heuristics. - * - * In particular, when the client is trying to connect to the backend, we - * allow up to MAX_WATCH_STREAM_FAILURES within ONLINE_STATE_TIMEOUT_MS for - * a connection to succeed. If we have too many failures or the timeout elapses, - * then we set the OnlineState to Offline, and the client will behave as if - * it is offline (get()s will return cached data, etc.). - */ -class Uo { - constructor(t, e) { - this.asyncQueue = t, this.onlineStateHandler = e, - /** The current OnlineState. */ - this.state = "Unknown" /* Unknown */ , - /** - * A count of consecutive failures to open the stream. If it reaches the - * maximum defined by MAX_WATCH_STREAM_FAILURES, we'll set the OnlineState to - * Offline. - */ - this.ta = 0, - /** - * A timer that elapses after ONLINE_STATE_TIMEOUT_MS, at which point we - * transition from OnlineState.Unknown to OnlineState.Offline without waiting - * for the stream to actually fail (MAX_WATCH_STREAM_FAILURES times). - */ - this.ea = null, - /** - * Whether the client should log a warning message if it fails to connect to - * the backend (initially true, cleared after a successful stream, or if we've - * logged the message already). - */ - this.na = !0; - } - /** - * Called by RemoteStore when a watch stream is started (including on each - * backoff attempt). - * - * If this is the first attempt, it sets the OnlineState to Unknown and starts - * the onlineStateTimer. - */ sa() { - 0 === this.ta && (this.ia("Unknown" /* Unknown */), this.ea = this.asyncQueue.enqueueAfterDelay("online_state_timeout" /* OnlineStateTimeout */ , 1e4, (() => (this.ea = null, - this.ra("Backend didn't respond within 10 seconds."), this.ia("Offline" /* Offline */), - Promise.resolve())))); - } - /** - * Updates our OnlineState as appropriate after the watch stream reports a - * failure. The first failure moves us to the 'Unknown' state. We then may - * allow multiple failures (based on MAX_WATCH_STREAM_FAILURES) before we - * actually transition to the 'Offline' state. - */ oa(t) { - "Online" /* Online */ === this.state ? this.ia("Unknown" /* Unknown */) : (this.ta++, - this.ta >= 1 && (this.aa(), this.ra(`Connection failed 1 times. Most recent error: ${t.toString()}`), - this.ia("Offline" /* Offline */))); - } - /** - * Explicitly sets the OnlineState to the specified state. - * - * Note that this resets our timers / failure counters, etc. used by our - * Offline heuristics, so must not be used in place of - * handleWatchStreamStart() and handleWatchStreamFailure(). - */ set(t) { - this.aa(), this.ta = 0, "Online" /* Online */ === t && ( - // We've connected to watch at least once. Don't warn the developer - // about being offline going forward. - this.na = !1), this.ia(t); - } - ia(t) { - t !== this.state && (this.state = t, this.onlineStateHandler(t)); - } - ra(t) { - const e = `Could not reach Cloud Firestore backend. ${t}\nThis typically indicates that your device does not have a healthy Internet connection at the moment. The client will operate in offline mode until it is able to successfully connect to the backend.`; - this.na ? ($(e), this.na = !1) : O("OnlineStateTracker", e); - } - aa() { - null !== this.ea && (this.ea.cancel(), this.ea = null); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ class Ko { - constructor( - /** - * The local store, used to fill the write pipeline with outbound mutations. - */ - t, - /** The client-side proxy for interacting with the backend. */ - e, n, s, i) { - this.localStore = t, this.datastore = e, this.asyncQueue = n, this.remoteSyncer = {}, - /** - * A list of up to MAX_PENDING_WRITES writes that we have fetched from the - * LocalStore via fillWritePipeline() and have or will send to the write - * stream. - * - * Whenever writePipeline.length > 0 the RemoteStore will attempt to start or - * restart the write stream. When the stream is established the writes in the - * pipeline will be sent in order. - * - * Writes remain in writePipeline until they are acknowledged by the backend - * and thus will automatically be re-sent if the stream is interrupted / - * restarted before they're acknowledged. - * - * Write responses from the backend are linked to their originating request - * purely based on order, and so we can just shift() writes from the front of - * the writePipeline as we receive responses. - */ - this.ua = [], - /** - * A mapping of watched targets that the client cares about tracking and the - * user has explicitly called a 'listen' for this target. - * - * These targets may or may not have been sent to or acknowledged by the - * server. On re-establishing the listen stream, these targets should be sent - * to the server. The targets removed with unlistens are removed eagerly - * without waiting for confirmation from the listen stream. - */ - this.ca = new Map, - /** - * A set of reasons for why the RemoteStore may be offline. If empty, the - * RemoteStore may start its network connections. - */ - this.ha = new Set, - /** - * Event handlers that get called when the network is disabled or enabled. - * - * PORTING NOTE: These functions are used on the Web client to create the - * underlying streams (to support tree-shakeable streams). On Android and iOS, - * the streams are created during construction of RemoteStore. - */ - this.la = [], this.fa = i, this.fa.Fr((t => { - n.enqueueAndForget((async () => { - // Porting Note: Unlike iOS, `restartNetwork()` is called even when the - // network becomes unreachable as we don't have any other way to tear - // down our streams. - Xo(this) && (O("RemoteStore", "Restarting streams for network reachability change."), - await async function(t) { - const e = K(t); - e.ha.add(4 /* ConnectivityChange */), await Qo(e), e.da.set("Unknown" /* Unknown */), - e.ha.delete(4 /* ConnectivityChange */), await Go(e); - }(this)); - })); - })), this.da = new Uo(n, s); - } -} - -async function Go(t) { - if (Xo(t)) for (const e of t.la) await e(/* enabled= */ !0); -} - -/** - * Temporarily disables the network. The network can be re-enabled using - * enableNetwork(). - */ async function Qo(t) { - for (const e of t.la) await e(/* enabled= */ !1); -} - -/** - * Starts new listen for the given target. Uses resume token if provided. It - * is a no-op if the target of given `TargetData` is already being listened to. - */ -function jo(t, e) { - const n = K(t); - n.ca.has(e.targetId) || ( - // Mark this as something the client is currently listening for. - n.ca.set(e.targetId, e), Yo(n) ? - // The listen will be sent in onWatchStreamOpen - Jo(n) : ma(n).Do() && zo(n, e)); -} - -/** - * Removes the listen from server. It is a no-op if the given target id is - * not being listened to. - */ function Wo(t, e) { - const n = K(t), s = ma(n); - n.ca.delete(e), s.Do() && Ho(n, e), 0 === n.ca.size && (s.Do() ? s.No() : Xo(n) && - // Revert to OnlineState.Unknown if the watch stream is not open and we - // have no listeners, since without any listens to send we cannot - // confirm if the stream is healthy and upgrade to OnlineState.Online. - n.da.set("Unknown" /* Unknown */)); -} - -/** - * We need to increment the the expected number of pending responses we're due - * from watch so we wait for the ack to process any messages from this target. - */ function zo(t, e) { - t._a.Z(e.targetId), ma(t).Go(e); -} - -/** - * We need to increment the expected number of pending responses we're due - * from watch so we wait for the removal on the server before we process any - * messages from this target. - */ function Ho(t, e) { - t._a.Z(e), ma(t).Qo(e); -} - -function Jo(t) { - t._a = new Zn({ - getRemoteKeysForTarget: e => t.remoteSyncer.getRemoteKeysForTarget(e), - Et: e => t.ca.get(e) || null - }), ma(t).start(), t.da.sa(); -} - -/** - * Returns whether the watch stream should be started because it's necessary - * and has not yet been started. - */ function Yo(t) { - return Xo(t) && !ma(t).So() && t.ca.size > 0; -} - -function Xo(t) { - return 0 === K(t).ha.size; -} - -function Zo(t) { - t._a = void 0; -} - -async function ta(t) { - t.ca.forEach(((e, n) => { - zo(t, e); - })); -} - -async function ea(t, e) { - Zo(t), - // If we still need the watch stream, retry the connection. - Yo(t) ? (t.da.oa(e), Jo(t)) : - // No need to restart watch stream because there are no active targets. - // The online state is set to unknown because there is no active attempt - // at establishing a connection - t.da.set("Unknown" /* Unknown */); -} - -async function na(t, e, n) { - if ( - // Mark the client as online since we got a message from the server - t.da.set("Online" /* Online */), e instanceof Yn && 2 /* Removed */ === e.state && e.cause) - // There was an error on a target, don't wait for a consistent snapshot - // to raise events - try { - await - /** Handles an error on a target */ - async function(t, e) { - const n = e.cause; - for (const s of e.targetIds) - // A watched target might have been removed already. - t.ca.has(s) && (await t.remoteSyncer.rejectListen(s, n), t.ca.delete(s), t._a.removeTarget(s)); - } - /** - * Attempts to fill our write pipeline with writes from the LocalStore. - * - * Called internally to bootstrap or refill the write pipeline and by - * SyncEngine whenever there are new mutations to process. - * - * Starts the write stream if necessary. - */ (t, e); - } catch (n) { - O("RemoteStore", "Failed to remove targets %s: %s ", e.targetIds.join(","), n), - await sa(t, n); - } else if (e instanceof Hn ? t._a.at(e) : e instanceof Jn ? t._a._t(e) : t._a.ht(e), - !n.isEqual(ct.min())) try { - const e = await Hr(t.localStore); - n.compareTo(e) >= 0 && - // We have received a target change with a global snapshot if the snapshot - // version is not equal to SnapshotVersion.min(). - await - /** - * Takes a batch of changes from the Datastore, repackages them as a - * RemoteEvent, and passes that on to the listener, which is typically the - * SyncEngine. - */ - function(t, e) { - const n = t._a.yt(e); - // Update in-memory resume tokens. LocalStore will update the - // persistent view of these when applying the completed RemoteEvent. - return n.targetChanges.forEach(((n, s) => { - if (n.resumeToken.approximateByteSize() > 0) { - const i = t.ca.get(s); - // A watched target might have been removed already. - i && t.ca.set(s, i.withResumeToken(n.resumeToken, e)); - } - })), - // Re-establish listens for the targets that have been invalidated by - // existence filter mismatches. - n.targetMismatches.forEach((e => { - const n = t.ca.get(e); - if (!n) - // A watched target might have been removed already. - return; - // Clear the resume token for the target, since we're in a known mismatch - // state. - t.ca.set(e, n.withResumeToken(pt.EMPTY_BYTE_STRING, n.snapshotVersion)), - // Cause a hard reset by unwatching and rewatching immediately, but - // deliberately don't send a resume token so that we get a full update. - Ho(t, e); - // Mark the target we send as being on behalf of an existence filter - // mismatch, but don't actually retain that in listenTargets. This ensures - // that we flag the first re-listen this way without impacting future - // listens of this target (that might happen e.g. on reconnect). - const s = new Ai(n.target, e, 1 /* ExistenceFilterMismatch */ , n.sequenceNumber); - zo(t, s); - })), t.remoteSyncer.applyRemoteEvent(n); - }(t, n); - } catch (e) { - O("RemoteStore", "Failed to raise snapshot:", e), await sa(t, e); - } -} - -/** - * Recovery logic for IndexedDB errors that takes the network offline until - * `op` succeeds. Retries are scheduled with backoff using - * `enqueueRetryable()`. If `op()` is not provided, IndexedDB access is - * validated via a generic operation. - * - * The returned Promise is resolved once the network is disabled and before - * any retry attempt. - */ async function sa(t, e, n) { - if (!di(e)) throw e; - t.ha.add(1 /* IndexedDbFailed */), - // Disable network and raise offline snapshots - await Qo(t), t.da.set("Offline" /* Offline */), n || ( - // Use a simple read operation to determine if IndexedDB recovered. - // Ideally, we would expose a health check directly on SimpleDb, but - // RemoteStore only has access to persistence through LocalStore. - n = () => Hr(t.localStore)), - // Probe IndexedDB periodically and re-enable network - t.asyncQueue.enqueueRetryable((async () => { - O("RemoteStore", "Retrying IndexedDB access"), await n(), t.ha.delete(1 /* IndexedDbFailed */), - await Go(t); - })); -} - -/** - * Executes `op`. If `op` fails, takes the network offline until `op` - * succeeds. Returns after the first attempt. - */ function ia(t, e) { - return e().catch((n => sa(t, n, e))); -} - -async function ra(t) { - const e = K(t), n = ga(e); - let s = e.ua.length > 0 ? e.ua[e.ua.length - 1].batchId : -1; - for (;oa(e); ) try { - const t = await Xr(e.localStore, s); - if (null === t) { - 0 === e.ua.length && n.No(); - break; - } - s = t.batchId, aa(e, t); - } catch (t) { - await sa(e, t); - } - ua(e) && ca(e); -} - -/** - * Returns true if we can add to the write pipeline (i.e. the network is - * enabled and the write pipeline is not full). - */ function oa(t) { - return Xo(t) && t.ua.length < 10; -} - -/** - * Queues additional writes to be sent to the write stream, sending them - * immediately if the write stream is established. - */ function aa(t, e) { - t.ua.push(e); - const n = ga(t); - n.Do() && n.Wo && n.zo(e.mutations); -} - -function ua(t) { - return Xo(t) && !ga(t).So() && t.ua.length > 0; -} - -function ca(t) { - ga(t).start(); -} - -async function ha(t) { - ga(t).Yo(); -} - -async function la(t) { - const e = ga(t); - // Send the write pipeline now that the stream is established. - for (const n of t.ua) e.zo(n.mutations); -} - -async function fa(t, e, n) { - const s = t.ua.shift(), i = Ti.from(s, e, n); - await ia(t, (() => t.remoteSyncer.applySuccessfulWrite(i))), - // It's possible that with the completion of this mutation another - // slot has freed up. - await ra(t); -} - -async function da(t, e) { - // If the write stream closed after the write handshake completes, a write - // operation failed and we fail the pending operation. - e && ga(t).Wo && - // This error affects the actual write. - await async function(t, e) { - // Only handle permanent errors here. If it's transient, just let the retry - // logic kick in. - if (n = e.code, vn(n) && n !== G.ABORTED) { - // This was a permanent error, the request itself was the problem - // so it's not going to succeed if we resend it. - const n = t.ua.shift(); - // In this case it's also unlikely that the server itself is melting - // down -- this was just a bad request so inhibit backoff on the next - // restart. - ga(t).xo(), await ia(t, (() => t.remoteSyncer.rejectFailedWrite(n.batchId, e))), - // It's possible that with the completion of this mutation - // another slot has freed up. - await ra(t); - } - var n; - }(t, e), - // The write stream might have been started by refilling the write - // pipeline for failed writes - ua(t) && ca(t); -} - -async function _a(t, e) { - const n = K(t); - n.asyncQueue.verifyOperationInProgress(), O("RemoteStore", "RemoteStore received new credentials"); - const s = Xo(n); - // Tear down and re-create our network streams. This will ensure we get a - // fresh auth token for the new user and re-fill the write pipeline with - // new mutations from the LocalStore (since mutations are per-user). - n.ha.add(3 /* CredentialChange */), await Qo(n), s && - // Don't set the network status to Unknown if we are offline. - n.da.set("Unknown" /* Unknown */), await n.remoteSyncer.handleCredentialChange(e), - n.ha.delete(3 /* CredentialChange */), await Go(n); -} - -/** - * Toggles the network state when the client gains or loses its primary lease. - */ async function wa(t, e) { - const n = K(t); - e ? (n.ha.delete(2 /* IsSecondary */), await Go(n)) : e || (n.ha.add(2 /* IsSecondary */), - await Qo(n), n.da.set("Unknown" /* Unknown */)); -} - -/** - * If not yet initialized, registers the WatchStream and its network state - * callback with `remoteStoreImpl`. Returns the existing stream if one is - * already available. - * - * PORTING NOTE: On iOS and Android, the WatchStream gets registered on startup. - * This is not done on Web to allow it to be tree-shaken. - */ function ma(t) { - return t.wa || ( - // Create stream (but note that it is not started yet). - t.wa = function(t, e, n) { - const s = K(t); - return s.Zo(), new Bo(e, s.Ro, s.authCredentials, s.appCheckCredentials, s.M, n); - } - /** - * @license - * Copyright 2018 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ (t.datastore, t.asyncQueue, { - Wr: ta.bind(null, t), - Hr: ea.bind(null, t), - Ko: na.bind(null, t) - }), t.la.push((async e => { - e ? (t.wa.xo(), Yo(t) ? Jo(t) : t.da.set("Unknown" /* Unknown */)) : (await t.wa.stop(), - Zo(t)); - }))), t.wa; -} - -/** - * If not yet initialized, registers the WriteStream and its network state - * callback with `remoteStoreImpl`. Returns the existing stream if one is - * already available. - * - * PORTING NOTE: On iOS and Android, the WriteStream gets registered on startup. - * This is not done on Web to allow it to be tree-shaken. - */ function ga(t) { - return t.ma || ( - // Create stream (but note that it is not started yet). - t.ma = function(t, e, n) { - const s = K(t); - return s.Zo(), new Lo(e, s.Ro, s.authCredentials, s.appCheckCredentials, s.M, n); - }(t.datastore, t.asyncQueue, { - Wr: ha.bind(null, t), - Hr: da.bind(null, t), - Jo: la.bind(null, t), - Ho: fa.bind(null, t) - }), t.la.push((async e => { - e ? (t.ma.xo(), - // This will start the write stream if necessary. - await ra(t)) : (await t.ma.stop(), t.ua.length > 0 && (O("RemoteStore", `Stopping write stream with ${t.ua.length} pending writes`), - t.ua = [])); - }))), t.ma; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Represents an operation scheduled to be run in the future on an AsyncQueue. - * - * It is created via DelayedOperation.createAndSchedule(). - * - * Supports cancellation (via cancel()) and early execution (via skipDelay()). - * - * Note: We implement `PromiseLike` instead of `Promise`, as the `Promise` type - * in newer versions of TypeScript defines `finally`, which is not available in - * IE. - */ -class ya { - constructor(t, e, n, s, i) { - this.asyncQueue = t, this.timerId = e, this.targetTimeMs = n, this.op = s, this.removalCallback = i, - this.deferred = new j, this.then = this.deferred.promise.then.bind(this.deferred.promise), - // It's normal for the deferred promise to be canceled (due to cancellation) - // and so we attach a dummy catch callback to avoid - // 'UnhandledPromiseRejectionWarning' log spam. - this.deferred.promise.catch((t => {})); - } - /** - * Creates and returns a DelayedOperation that has been scheduled to be - * executed on the provided asyncQueue after the provided delayMs. - * - * @param asyncQueue - The queue to schedule the operation on. - * @param id - A Timer ID identifying the type of operation this is. - * @param delayMs - The delay (ms) before the operation should be scheduled. - * @param op - The operation to run. - * @param removalCallback - A callback to be called synchronously once the - * operation is executed or canceled, notifying the AsyncQueue to remove it - * from its delayedOperations list. - * PORTING NOTE: This exists to prevent making removeDelayedOperation() and - * the DelayedOperation class public. - */ static createAndSchedule(t, e, n, s, i) { - const r = Date.now() + n, o = new ya(t, e, r, s, i); - return o.start(n), o; - } - /** - * Starts the timer. This is called immediately after construction by - * createAndSchedule(). - */ start(t) { - this.timerHandle = setTimeout((() => this.handleDelayElapsed()), t); - } - /** - * Queues the operation to run immediately (if it hasn't already been run or - * canceled). - */ skipDelay() { - return this.handleDelayElapsed(); - } - /** - * Cancels the operation if it hasn't already been executed or canceled. The - * promise will be rejected. - * - * As long as the operation has not yet been run, calling cancel() provides a - * guarantee that the operation will not be run. - */ cancel(t) { - null !== this.timerHandle && (this.clearTimeout(), this.deferred.reject(new Q(G.CANCELLED, "Operation cancelled" + (t ? ": " + t : "")))); - } - handleDelayElapsed() { - this.asyncQueue.enqueueAndForget((() => null !== this.timerHandle ? (this.clearTimeout(), - this.op().then((t => this.deferred.resolve(t)))) : Promise.resolve())); - } - clearTimeout() { - null !== this.timerHandle && (this.removalCallback(this), clearTimeout(this.timerHandle), - this.timerHandle = null); - } -} - -/** - * Returns a FirestoreError that can be surfaced to the user if the provided - * error is an IndexedDbTransactionError. Re-throws the error otherwise. - */ function pa(t, e) { - if ($("AsyncQueue", `${e}: ${t}`), di(t)) return new Q(G.UNAVAILABLE, `${e}: ${t}`); - throw t; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * DocumentSet is an immutable (copy-on-write) collection that holds documents - * in order specified by the provided comparator. We always add a document key - * comparator on top of what is provided to guarantee document equality based on - * the key. - */ class Ia { - /** The default ordering is by key if the comparator is omitted */ - constructor(t) { - // We are adding document key comparator to the end as it's the only - // guaranteed unique property of a document. - this.comparator = t ? (e, n) => t(e, n) || xt.comparator(e.key, n.key) : (t, e) => xt.comparator(t.key, e.key), - this.keyedMap = Ln(), this.sortedSet = new Cn(this.comparator); - } - /** - * Returns an empty copy of the existing DocumentSet, using the same - * comparator. - */ static emptySet(t) { - return new Ia(t.comparator); - } - has(t) { - return null != this.keyedMap.get(t); - } - get(t) { - return this.keyedMap.get(t); - } - first() { - return this.sortedSet.minKey(); - } - last() { - return this.sortedSet.maxKey(); - } - isEmpty() { - return this.sortedSet.isEmpty(); - } - /** - * Returns the index of the provided key in the document set, or -1 if the - * document key is not present in the set; - */ indexOf(t) { - const e = this.keyedMap.get(t); - return e ? this.sortedSet.indexOf(e) : -1; - } - get size() { - return this.sortedSet.size; - } - /** Iterates documents in order defined by "comparator" */ forEach(t) { - this.sortedSet.inorderTraversal(((e, n) => (t(e), !1))); - } - /** Inserts or updates a document with the same key */ add(t) { - // First remove the element if we have it. - const e = this.delete(t.key); - return e.copy(e.keyedMap.insert(t.key, t), e.sortedSet.insert(t, null)); - } - /** Deletes a document with a given key */ delete(t) { - const e = this.get(t); - return e ? this.copy(this.keyedMap.remove(t), this.sortedSet.remove(e)) : this; - } - isEqual(t) { - if (!(t instanceof Ia)) return !1; - if (this.size !== t.size) return !1; - const e = this.sortedSet.getIterator(), n = t.sortedSet.getIterator(); - for (;e.hasNext(); ) { - const t = e.getNext().key, s = n.getNext().key; - if (!t.isEqual(s)) return !1; - } - return !0; - } - toString() { - const t = []; - return this.forEach((e => { - t.push(e.toString()); - })), 0 === t.length ? "DocumentSet ()" : "DocumentSet (\n " + t.join(" \n") + "\n)"; - } - copy(t, e) { - const n = new Ia; - return n.comparator = this.comparator, n.keyedMap = t, n.sortedSet = e, n; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * DocumentChangeSet keeps track of a set of changes to docs in a query, merging - * duplicate events for the same doc. - */ class Ta { - constructor() { - this.ga = new Cn(xt.comparator); - } - track(t) { - const e = t.doc.key, n = this.ga.get(e); - n ? - // Merge the new change with the existing change. - 0 /* Added */ !== t.type && 3 /* Metadata */ === n.type ? this.ga = this.ga.insert(e, t) : 3 /* Metadata */ === t.type && 1 /* Removed */ !== n.type ? this.ga = this.ga.insert(e, { - type: n.type, - doc: t.doc - }) : 2 /* Modified */ === t.type && 2 /* Modified */ === n.type ? this.ga = this.ga.insert(e, { - type: 2 /* Modified */ , - doc: t.doc - }) : 2 /* Modified */ === t.type && 0 /* Added */ === n.type ? this.ga = this.ga.insert(e, { - type: 0 /* Added */ , - doc: t.doc - }) : 1 /* Removed */ === t.type && 0 /* Added */ === n.type ? this.ga = this.ga.remove(e) : 1 /* Removed */ === t.type && 2 /* Modified */ === n.type ? this.ga = this.ga.insert(e, { - type: 1 /* Removed */ , - doc: n.doc - }) : 0 /* Added */ === t.type && 1 /* Removed */ === n.type ? this.ga = this.ga.insert(e, { - type: 2 /* Modified */ , - doc: t.doc - }) : - // This includes these cases, which don't make sense: - // Added->Added - // Removed->Removed - // Modified->Added - // Removed->Modified - // Metadata->Added - // Removed->Metadata - L() : this.ga = this.ga.insert(e, t); - } - ya() { - const t = []; - return this.ga.inorderTraversal(((e, n) => { - t.push(n); - })), t; - } -} - -class Ea { - constructor(t, e, n, s, i, r, o, a) { - this.query = t, this.docs = e, this.oldDocs = n, this.docChanges = s, this.mutatedKeys = i, - this.fromCache = r, this.syncStateChanged = o, this.excludesMetadataChanges = a; - } - /** Returns a view snapshot as if all documents in the snapshot were added. */ static fromInitialDocuments(t, e, n, s) { - const i = []; - return e.forEach((t => { - i.push({ - type: 0 /* Added */ , - doc: t - }); - })), new Ea(t, e, Ia.emptySet(e), i, n, s, - /* syncStateChanged= */ !0, - /* excludesMetadataChanges= */ !1); - } - get hasPendingWrites() { - return !this.mutatedKeys.isEmpty(); - } - isEqual(t) { - if (!(this.fromCache === t.fromCache && this.syncStateChanged === t.syncStateChanged && this.mutatedKeys.isEqual(t.mutatedKeys) && Be(this.query, t.query) && this.docs.isEqual(t.docs) && this.oldDocs.isEqual(t.oldDocs))) return !1; - const e = this.docChanges, n = t.docChanges; - if (e.length !== n.length) return !1; - for (let t = 0; t < e.length; t++) if (e[t].type !== n[t].type || !e[t].doc.isEqual(n[t].doc)) return !1; - return !0; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Holds the listeners and the last received ViewSnapshot for a query being - * tracked by EventManager. - */ class Aa { - constructor() { - this.pa = void 0, this.listeners = []; - } -} - -class Ra { - constructor() { - this.queries = new Dn((t => Le(t)), Be), this.onlineState = "Unknown" /* Unknown */ , - this.Ia = new Set; - } -} - -async function ba(t, e) { - const n = K(t), s = e.query; - let i = !1, r = n.queries.get(s); - if (r || (i = !0, r = new Aa), i) try { - r.pa = await n.onListen(s); - } catch (t) { - const n = pa(t, `Initialization of query '${qe(e.query)}' failed`); - return void e.onError(n); - } - if (n.queries.set(s, r), r.listeners.push(e), - // Run global snapshot listeners if a consistent snapshot has been emitted. - e.Ta(n.onlineState), r.pa) { - e.Ea(r.pa) && Sa(n); - } -} - -async function Pa(t, e) { - const n = K(t), s = e.query; - let i = !1; - const r = n.queries.get(s); - if (r) { - const t = r.listeners.indexOf(e); - t >= 0 && (r.listeners.splice(t, 1), i = 0 === r.listeners.length); - } - if (i) return n.queries.delete(s), n.onUnlisten(s); -} - -function Va(t, e) { - const n = K(t); - let s = !1; - for (const t of e) { - const e = t.query, i = n.queries.get(e); - if (i) { - for (const e of i.listeners) e.Ea(t) && (s = !0); - i.pa = t; - } - } - s && Sa(n); -} - -function va(t, e, n) { - const s = K(t), i = s.queries.get(e); - if (i) for (const t of i.listeners) t.onError(n); - // Remove all listeners. NOTE: We don't need to call syncEngine.unlisten() - // after an error. - s.queries.delete(e); -} - -// Call all global snapshot listeners that have been set. -function Sa(t) { - t.Ia.forEach((t => { - t.next(); - })); -} - -/** - * QueryListener takes a series of internal view snapshots and determines - * when to raise the event. - * - * It uses an Observer to dispatch events. - */ class Da { - constructor(t, e, n) { - this.query = t, this.Aa = e, - /** - * Initial snapshots (e.g. from cache) may not be propagated to the wrapped - * observer. This flag is set to true once we've actually raised an event. - */ - this.Ra = !1, this.ba = null, this.onlineState = "Unknown" /* Unknown */ , this.options = n || {}; - } - /** - * Applies the new ViewSnapshot to this listener, raising a user-facing event - * if applicable (depending on what changed, whether the user has opted into - * metadata-only changes, etc.). Returns true if a user-facing event was - * indeed raised. - */ Ea(t) { - if (!this.options.includeMetadataChanges) { - // Remove the metadata only changes. - const e = []; - for (const n of t.docChanges) 3 /* Metadata */ !== n.type && e.push(n); - t = new Ea(t.query, t.docs, t.oldDocs, e, t.mutatedKeys, t.fromCache, t.syncStateChanged, - /* excludesMetadataChanges= */ !0); - } - let e = !1; - return this.Ra ? this.Pa(t) && (this.Aa.next(t), e = !0) : this.Va(t, this.onlineState) && (this.va(t), - e = !0), this.ba = t, e; - } - onError(t) { - this.Aa.error(t); - } - /** Returns whether a snapshot was raised. */ Ta(t) { - this.onlineState = t; - let e = !1; - return this.ba && !this.Ra && this.Va(this.ba, t) && (this.va(this.ba), e = !0), - e; - } - Va(t, e) { - // Always raise the first event when we're synced - if (!t.fromCache) return !0; - // NOTE: We consider OnlineState.Unknown as online (it should become Offline - // or Online if we wait long enough). - const n = "Offline" /* Offline */ !== e; - // Don't raise the event if we're online, aren't synced yet (checked - // above) and are waiting for a sync. - return (!this.options.Sa || !n) && (!t.docs.isEmpty() || "Offline" /* Offline */ === e); - // Raise data from cache if we have any documents or we are offline - } - Pa(t) { - // We don't need to handle includeDocumentMetadataChanges here because - // the Metadata only changes have already been stripped out if needed. - // At this point the only changes we will see are the ones we should - // propagate. - if (t.docChanges.length > 0) return !0; - const e = this.ba && this.ba.hasPendingWrites !== t.hasPendingWrites; - return !(!t.syncStateChanged && !e) && !0 === this.options.includeMetadataChanges; - // Generally we should have hit one of the cases above, but it's possible - // to get here if there were only metadata docChanges and they got - // stripped out. - } - va(t) { - t = Ea.fromInitialDocuments(t.query, t.docs, t.mutatedKeys, t.fromCache), this.Ra = !0, - this.Aa.next(t); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A complete element in the bundle stream, together with the byte length it - * occupies in the stream. - */ class Ca { - constructor(t, - // How many bytes this element takes to store in the bundle. - e) { - this.payload = t, this.byteLength = e; - } - Da() { - return "metadata" in this.payload; - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Helper to convert objects from bundles to model objects in the SDK. - */ class xa { - constructor(t) { - this.M = t; - } - li(t) { - return fs(this.M, t); - } - /** - * Converts a BundleDocument to a MutableDocument. - */ fi(t) { - return t.metadata.exists ? ys(this.M, t.document, !1) : te.newNoDocument(this.li(t.metadata.name), this.di(t.metadata.readTime)); - } - di(t) { - return us(t); - } -} - -/** - * A class to process the elements from a bundle, load them into local - * storage and provide progress update while loading. - */ class Na { - constructor(t, e, n) { - this.Ca = t, this.localStore = e, this.M = n, - /** Batched queries to be saved into storage */ - this.queries = [], - /** Batched documents to be saved into storage */ - this.documents = [], this.progress = ka(t); - } - /** - * Adds an element from the bundle to the loader. - * - * Returns a new progress if adding the element leads to a new progress, - * otherwise returns null. - */ xa(t) { - this.progress.bytesLoaded += t.byteLength; - let e = this.progress.documentsLoaded; - return t.payload.namedQuery ? this.queries.push(t.payload.namedQuery) : t.payload.documentMetadata ? (this.documents.push({ - metadata: t.payload.documentMetadata - }), t.payload.documentMetadata.exists || ++e) : t.payload.document && (this.documents[this.documents.length - 1].document = t.payload.document, - ++e), e !== this.progress.documentsLoaded ? (this.progress.documentsLoaded = e, - Object.assign({}, this.progress)) : null; - } - Na(t) { - const e = new Map, n = new xa(this.M); - for (const s of t) if (s.metadata.queries) { - const t = n.li(s.metadata.name); - for (const n of s.metadata.queries) { - const s = (e.get(n) || Gn()).add(t); - e.set(n, s); - } - } - return e; - } - /** - * Update the progress to 'Success' and return the updated progress. - */ async complete() { - const t = await ro(this.localStore, new xa(this.M), this.documents, this.Ca.id), e = this.Na(this.documents); - for (const t of this.queries) await oo(this.localStore, t, e.get(t.name)); - return this.progress.taskState = "Success", new qr(Object.assign({}, this.progress), t); - } -} - -/** - * Returns a `LoadBundleTaskProgress` representing the initial progress of - * loading a bundle. - */ function ka(t) { - return { - taskState: "Running", - documentsLoaded: 0, - bytesLoaded: 0, - totalDocuments: t.totalDocuments, - totalBytes: t.totalBytes - }; -} - -/** - * Returns a `LoadBundleTaskProgress` representing the progress that the loading - * has succeeded. - */ -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -class Ma { - constructor(t) { - this.key = t; - } -} - -class Oa { - constructor(t) { - this.key = t; - } -} - -/** - * View is responsible for computing the final merged truth of what docs are in - * a query. It gets notified of local and remote changes to docs, and applies - * the query filters and limits to determine the most correct possible results. - */ class $a { - constructor(t, - /** Documents included in the remote target */ - e) { - this.query = t, this.ka = e, this.Ma = null, - /** - * A flag whether the view is current with the backend. A view is considered - * current after it has seen the current flag from the backend and did not - * lose consistency within the watch stream (e.g. because of an existence - * filter mismatch). - */ - this.current = !1, - /** Documents in the view but not in the remote target */ - this.Oa = Gn(), - /** Document Keys that have local changes */ - this.mutatedKeys = Gn(), this.$a = Ke(t), this.Fa = new Ia(this.$a); - } - /** - * The set of remote documents that the server has told us belongs to the target associated with - * this view. - */ get Ba() { - return this.ka; - } - /** - * Iterates over a set of doc changes, applies the query limit, and computes - * what the new results should be, what the changes were, and whether we may - * need to go back to the local cache for more results. Does not make any - * changes to the view. - * @param docChanges - The doc changes to apply to this view. - * @param previousChanges - If this is being called with a refill, then start - * with this set of docs and changes instead of the current view. - * @returns a new set of docs, changes, and refill flag. - */ La(t, e) { - const n = e ? e.qa : new Ta, s = e ? e.Fa : this.Fa; - let i = e ? e.mutatedKeys : this.mutatedKeys, r = s, o = !1; - // Track the last doc in a (full) limit. This is necessary, because some - // update (a delete, or an update moving a doc past the old limit) might - // mean there is some other document in the local cache that either should - // come (1) between the old last limit doc and the new last document, in the - // case of updates, or (2) after the new last document, in the case of - // deletes. So we keep this doc at the old limit to compare the updates to. - // Note that this should never get used in a refill (when previousChanges is - // set), because there will only be adds -- no deletes or updates. - const a = Ce(this.query) && s.size === this.query.limit ? s.last() : null, u = xe(this.query) && s.size === this.query.limit ? s.first() : null; - // Drop documents out to meet limit/limitToLast requirement. - if (t.inorderTraversal(((t, e) => { - const c = s.get(t), h = Ue(this.query, e) ? e : null, l = !!c && this.mutatedKeys.has(c.key), f = !!h && (h.hasLocalMutations || - // We only consider committed mutations for documents that were - // mutated during the lifetime of the view. - this.mutatedKeys.has(h.key) && h.hasCommittedMutations); - let d = !1; - // Calculate change - if (c && h) { - c.data.isEqual(h.data) ? l !== f && (n.track({ - type: 3 /* Metadata */ , - doc: h - }), d = !0) : this.Ua(c, h) || (n.track({ - type: 2 /* Modified */ , - doc: h - }), d = !0, (a && this.$a(h, a) > 0 || u && this.$a(h, u) < 0) && ( - // This doc moved from inside the limit to outside the limit. - // That means there may be some other doc in the local cache - // that should be included instead. - o = !0)); - } else !c && h ? (n.track({ - type: 0 /* Added */ , - doc: h - }), d = !0) : c && !h && (n.track({ - type: 1 /* Removed */ , - doc: c - }), d = !0, (a || u) && ( - // A doc was removed from a full limit query. We'll need to - // requery from the local cache to see if we know about some other - // doc that should be in the results. - o = !0)); - d && (h ? (r = r.add(h), i = f ? i.add(t) : i.delete(t)) : (r = r.delete(t), i = i.delete(t))); - })), Ce(this.query) || xe(this.query)) for (;r.size > this.query.limit; ) { - const t = Ce(this.query) ? r.last() : r.first(); - r = r.delete(t.key), i = i.delete(t.key), n.track({ - type: 1 /* Removed */ , - doc: t - }); - } - return { - Fa: r, - qa: n, - ei: o, - mutatedKeys: i - }; - } - Ua(t, e) { - // We suppress the initial change event for documents that were modified as - // part of a write acknowledgment (e.g. when the value of a server transform - // is applied) as Watch will send us the same document again. - // By suppressing the event, we only raise two user visible events (one with - // `hasPendingWrites` and the final state of the document) instead of three - // (one with `hasPendingWrites`, the modified document with - // `hasPendingWrites` and the final state of the document). - return t.hasLocalMutations && e.hasCommittedMutations && !e.hasLocalMutations; - } - /** - * Updates the view with the given ViewDocumentChanges and optionally updates - * limbo docs and sync state from the provided target change. - * @param docChanges - The set of changes to make to the view's docs. - * @param updateLimboDocuments - Whether to update limbo documents based on - * this change. - * @param targetChange - A target change to apply for computing limbo docs and - * sync state. - * @returns A new ViewChange with the given docs, changes, and sync state. - */ - // PORTING NOTE: The iOS/Android clients always compute limbo document changes. - applyChanges(t, e, n) { - const s = this.Fa; - this.Fa = t.Fa, this.mutatedKeys = t.mutatedKeys; - // Sort changes based on type and query comparator - const i = t.qa.ya(); - i.sort(((t, e) => function(t, e) { - const n = t => { - switch (t) { - case 0 /* Added */ : - return 1; - - case 2 /* Modified */ : - case 3 /* Metadata */ : - // A metadata change is converted to a modified change at the public - // api layer. Since we sort by document key and then change type, - // metadata and modified changes must be sorted equivalently. - return 2; - - case 1 /* Removed */ : - return 0; - - default: - return L(); - } - }; - return n(t) - n(e); - } - /** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ (t.type, e.type) || this.$a(t.doc, e.doc))), this.Ka(n); - const r = e ? this.Ga() : [], o = 0 === this.Oa.size && this.current ? 1 /* Synced */ : 0 /* Local */ , a = o !== this.Ma; - if (this.Ma = o, 0 !== i.length || a) { - return { - snapshot: new Ea(this.query, t.Fa, s, i, t.mutatedKeys, 0 /* Local */ === o, a, - /* excludesMetadataChanges= */ !1), - Qa: r - }; - } - // no changes - return { - Qa: r - }; - } - /** - * Applies an OnlineState change to the view, potentially generating a - * ViewChange if the view's syncState changes as a result. - */ Ta(t) { - return this.current && "Offline" /* Offline */ === t ? ( - // If we're offline, set `current` to false and then call applyChanges() - // to refresh our syncState and generate a ViewChange as appropriate. We - // are guaranteed to get a new TargetChange that sets `current` back to - // true once the client is back online. - this.current = !1, this.applyChanges({ - Fa: this.Fa, - qa: new Ta, - mutatedKeys: this.mutatedKeys, - ei: !1 - }, - /* updateLimboDocuments= */ !1)) : { - Qa: [] - }; - } - /** - * Returns whether the doc for the given key should be in limbo. - */ ja(t) { - // If the remote end says it's part of this query, it's not in limbo. - return !this.ka.has(t) && ( - // The local store doesn't think it's a result, so it shouldn't be in limbo. - !!this.Fa.has(t) && !this.Fa.get(t).hasLocalMutations); - } - /** - * Updates syncedDocuments, current, and limbo docs based on the given change. - * Returns the list of changes to which docs are in limbo. - */ Ka(t) { - t && (t.addedDocuments.forEach((t => this.ka = this.ka.add(t))), t.modifiedDocuments.forEach((t => {})), - t.removedDocuments.forEach((t => this.ka = this.ka.delete(t))), this.current = t.current); - } - Ga() { - // We can only determine limbo documents when we're in-sync with the server. - if (!this.current) return []; - // TODO(klimt): Do this incrementally so that it's not quadratic when - // updating many documents. - const t = this.Oa; - this.Oa = Gn(), this.Fa.forEach((t => { - this.ja(t.key) && (this.Oa = this.Oa.add(t.key)); - })); - // Diff the new limbo docs with the old limbo docs. - const e = []; - return t.forEach((t => { - this.Oa.has(t) || e.push(new Oa(t)); - })), this.Oa.forEach((n => { - t.has(n) || e.push(new Ma(n)); - })), e; - } - /** - * Update the in-memory state of the current view with the state read from - * persistence. - * - * We update the query view whenever a client's primary status changes: - * - When a client transitions from primary to secondary, it can miss - * LocalStorage updates and its query views may temporarily not be - * synchronized with the state on disk. - * - For secondary to primary transitions, the client needs to update the list - * of `syncedDocuments` since secondary clients update their query views - * based purely on synthesized RemoteEvents. - * - * @param queryResult.documents - The documents that match the query according - * to the LocalStore. - * @param queryResult.remoteKeys - The keys of the documents that match the - * query according to the backend. - * - * @returns The ViewChange that resulted from this synchronization. - */ - // PORTING NOTE: Multi-tab only. - Wa(t) { - this.ka = t.hi, this.Oa = Gn(); - const e = this.La(t.documents); - return this.applyChanges(e, /*updateLimboDocuments=*/ !0); - } - /** - * Returns a view snapshot as if this query was just listened to. Contains - * a document add for every existing document and the `fromCache` and - * `hasPendingWrites` status of the already established view. - */ - // PORTING NOTE: Multi-tab only. - za() { - return Ea.fromInitialDocuments(this.query, this.Fa, this.mutatedKeys, 0 /* Local */ === this.Ma); - } -} - -/** - * QueryView contains all of the data that SyncEngine needs to keep track of for - * a particular query. - */ -class Fa { - constructor( - /** - * The query itself. - */ - t, - /** - * The target number created by the client that is used in the watch - * stream to identify this query. - */ - e, - /** - * The view is responsible for computing the final merged truth of what - * docs are in the query. It gets notified of local and remote changes, - * and applies the query filters and limits to determine the most correct - * possible results. - */ - n) { - this.query = t, this.targetId = e, this.view = n; - } -} - -/** Tracks a limbo resolution. */ class Ba { - constructor(t) { - this.key = t, - /** - * Set to true once we've received a document. This is used in - * getRemoteKeysForTarget() and ultimately used by WatchChangeAggregator to - * decide whether it needs to manufacture a delete event for the target once - * the target is CURRENT. - */ - this.Ha = !1; - } -} - -/** - * An implementation of `SyncEngine` coordinating with other parts of SDK. - * - * The parts of SyncEngine that act as a callback to RemoteStore need to be - * registered individually. This is done in `syncEngineWrite()` and - * `syncEngineListen()` (as well as `applyPrimaryState()`) as these methods - * serve as entry points to RemoteStore's functionality. - * - * Note: some field defined in this class might have public access level, but - * the class is not exported so they are only accessible from this module. - * This is useful to implement optional features (like bundles) in free - * functions, such that they are tree-shakeable. - */ class La { - constructor(t, e, n, - // PORTING NOTE: Manages state synchronization in multi-tab environments. - s, i, r) { - this.localStore = t, this.remoteStore = e, this.eventManager = n, this.sharedClientState = s, - this.currentUser = i, this.maxConcurrentLimboResolutions = r, this.Ja = {}, this.Ya = new Dn((t => Le(t)), Be), - this.Xa = new Map, - /** - * The keys of documents that are in limbo for which we haven't yet started a - * limbo resolution query. The strings in this set are the result of calling - * `key.path.canonicalString()` where `key` is a `DocumentKey` object. - * - * The `Set` type was chosen because it provides efficient lookup and removal - * of arbitrary elements and it also maintains insertion order, providing the - * desired queue-like FIFO semantics. - */ - this.Za = new Set, - /** - * Keeps track of the target ID for each document that is in limbo with an - * active target. - */ - this.tu = new Cn(xt.comparator), - /** - * Keeps track of the information about an active limbo resolution for each - * active target ID that was started for the purpose of limbo resolution. - */ - this.eu = new Map, this.nu = new co, - /** Stores user completion handlers, indexed by User and BatchId. */ - this.su = {}, - /** Stores user callbacks waiting for all pending writes to be acknowledged. */ - this.iu = new Map, this.ru = mr.gn(), this.onlineState = "Unknown" /* Unknown */ , - // The primary state is set to `true` or `false` immediately after Firestore - // startup. In the interim, a client should only be considered primary if - // `isPrimary` is true. - this.ou = void 0; - } - get isPrimaryClient() { - return !0 === this.ou; - } -} - -/** - * Initiates the new listen, resolves promise when listen enqueued to the - * server. All the subsequent view snapshots or errors are sent to the - * subscribed handlers. Returns the initial snapshot. - */ -async function qa(t, e) { - const n = mu(t); - let s, i; - const r = n.Ya.get(e); - if (r) - // PORTING NOTE: With Multi-Tab Web, it is possible that a query view - // already exists when EventManager calls us for the first time. This - // happens when the primary tab is already listening to this query on - // behalf of another tab and the user of the primary also starts listening - // to the query. EventManager will not have an assigned target ID in this - // case and calls `listen` to obtain this ID. - s = r.targetId, n.sharedClientState.addLocalQueryTarget(s), i = r.view.za(); else { - const t = await Zr(n.localStore, $e(e)); - n.isPrimaryClient && jo(n.remoteStore, t); - const r = n.sharedClientState.addLocalQueryTarget(t.targetId); - s = t.targetId, i = await Ua(n, e, s, "current" === r); - } - return i; -} - -/** - * Registers a view for a previously unknown query and computes its initial - * snapshot. - */ async function Ua(t, e, n, s) { - // PORTING NOTE: On Web only, we inject the code that registers new Limbo - // targets based on view changes. This allows us to only depend on Limbo - // changes when user code includes queries. - t.au = (e, n, s) => async function(t, e, n, s) { - let i = e.view.La(n); - i.ei && ( - // The query has a limit and some docs were removed, so we need - // to re-run the query against the local store to make sure we - // didn't lose any good docs that had been past the limit. - i = await eo(t.localStore, e.query, - /* usePreviousResults= */ !1).then((({documents: t}) => e.view.La(t, i)))); - const r = s && s.targetChanges.get(e.targetId), o = e.view.applyChanges(i, - /* updateLimboDocuments= */ t.isPrimaryClient, r); - return eu(t, e.targetId, o.Qa), o.snapshot; - }(t, e, n, s); - const i = await eo(t.localStore, e, - /* usePreviousResults= */ !0), r = new $a(e, i.hi), o = r.La(i.documents), a = zn.createSynthesizedTargetChangeForCurrentChange(n, s && "Offline" /* Offline */ !== t.onlineState), u = r.applyChanges(o, - /* updateLimboDocuments= */ t.isPrimaryClient, a); - eu(t, n, u.Qa); - const c = new Fa(e, n, r); - return t.Ya.set(e, c), t.Xa.has(n) ? t.Xa.get(n).push(e) : t.Xa.set(n, [ e ]), u.snapshot; -} - -/** Stops listening to the query. */ async function Ka(t, e) { - const n = K(t), s = n.Ya.get(e), i = n.Xa.get(s.targetId); - if (i.length > 1) return n.Xa.set(s.targetId, i.filter((t => !Be(t, e)))), void n.Ya.delete(e); - // No other queries are mapped to the target, clean up the query and the target. - if (n.isPrimaryClient) { - // We need to remove the local query target first to allow us to verify - // whether any other client is still interested in this target. - n.sharedClientState.removeLocalQueryTarget(s.targetId); - n.sharedClientState.isActiveQueryTarget(s.targetId) || await to(n.localStore, s.targetId, - /*keepPersistedTargetData=*/ !1).then((() => { - n.sharedClientState.clearQueryState(s.targetId), Wo(n.remoteStore, s.targetId), - Za(n, s.targetId); - })).catch(Tr); - } else Za(n, s.targetId), await to(n.localStore, s.targetId, - /*keepPersistedTargetData=*/ !0); -} - -/** - * Initiates the write of local mutation batch which involves adding the - * writes to the mutation queue, notifying the remote store about new - * mutations and raising events for any changes this write caused. - * - * The promise returned by this call is resolved when the above steps - * have completed, *not* when the write was acked by the backend. The - * userCallback is resolved once the write was acked/rejected by the - * backend (or failed locally for any other reason). - */ async function Ga(t, e, n) { - const s = gu(t); - try { - const t = await function(t, e) { - const n = K(t), s = ut.now(), i = e.reduce(((t, e) => t.add(e.key)), Gn()); - let r; - return n.persistence.runTransaction("Locally write mutations", "readwrite", (t => n.ui.Us(t, i).next((i => { - r = i; - // For non-idempotent mutations (such as `FieldValue.increment()`), - // we record the base state in a separate patch mutation. This is - // later used to guarantee consistent values and prevents flicker - // even if the backend sends us an update that already includes our - // transform. - const o = []; - for (const t of e) { - const e = wn(t, r.get(t.key)); - null != e && - // NOTE: The base state should only be applied if there's some - // existing document to override, so use a Precondition of - // exists=true - o.push(new pn(t.key, e, Zt(e.value.mapValue), hn.exists(!0))); - } - return n.Fs.addMutationBatch(t, s, o, e); - })))).then((t => (t.applyToLocalDocumentSet(r), { - batchId: t.batchId, - changes: r - }))); - }(s.localStore, e); - s.sharedClientState.addPendingMutation(t.batchId), function(t, e, n) { - let s = t.su[t.currentUser.toKey()]; - s || (s = new Cn(rt)); - s = s.insert(e, n), t.su[t.currentUser.toKey()] = s; - } - /** - * Resolves or rejects the user callback for the given batch and then discards - * it. - */ (s, t.batchId, n), await iu(s, t.changes), await ra(s.remoteStore); - } catch (t) { - // If we can't persist the mutation, we reject the user callback and - // don't send the mutation. The user can then retry the write. - const e = pa(t, "Failed to persist write"); - n.reject(e); - } -} - -/** - * Applies one remote event to the sync engine, notifying any views of the - * changes, and releasing any pending mutation batches that would become - * visible because of the snapshot version the remote event contains. - */ async function Qa(t, e) { - const n = K(t); - try { - const t = await Jr(n.localStore, e); - // Update `receivedDocument` as appropriate for any limbo targets. - e.targetChanges.forEach(((t, e) => { - const s = n.eu.get(e); - s && ( - // Since this is a limbo resolution lookup, it's for a single document - // and it could be added, modified, or removed, but not a combination. - q(t.addedDocuments.size + t.modifiedDocuments.size + t.removedDocuments.size <= 1), - t.addedDocuments.size > 0 ? s.Ha = !0 : t.modifiedDocuments.size > 0 ? q(s.Ha) : t.removedDocuments.size > 0 && (q(s.Ha), - s.Ha = !1)); - })), await iu(n, t, e); - } catch (t) { - await Tr(t); - } -} - -/** - * Applies an OnlineState change to the sync engine and notifies any views of - * the change. - */ function ja(t, e, n) { - const s = K(t); - // If we are the secondary client, we explicitly ignore the remote store's - // online state (the local client may go offline, even though the primary - // tab remains online) and only apply the primary tab's online state from - // SharedClientState. - if (s.isPrimaryClient && 0 /* RemoteStore */ === n || !s.isPrimaryClient && 1 /* SharedClientState */ === n) { - const t = []; - s.Ya.forEach(((n, s) => { - const i = s.view.Ta(e); - i.snapshot && t.push(i.snapshot); - })), function(t, e) { - const n = K(t); - n.onlineState = e; - let s = !1; - n.queries.forEach(((t, n) => { - for (const t of n.listeners) - // Run global snapshot listeners if a consistent snapshot has been emitted. - t.Ta(e) && (s = !0); - })), s && Sa(n); - }(s.eventManager, e), t.length && s.Ja.Ko(t), s.onlineState = e, s.isPrimaryClient && s.sharedClientState.setOnlineState(e); - } -} - -/** - * Rejects the listen for the given targetID. This can be triggered by the - * backend for any active target. - * - * @param syncEngine - The sync engine implementation. - * @param targetId - The targetID corresponds to one previously initiated by the - * user as part of TargetData passed to listen() on RemoteStore. - * @param err - A description of the condition that has forced the rejection. - * Nearly always this will be an indication that the user is no longer - * authorized to see the data matching the target. - */ async function Wa(t, e, n) { - const s = K(t); - // PORTING NOTE: Multi-tab only. - s.sharedClientState.updateQueryState(e, "rejected", n); - const i = s.eu.get(e), r = i && i.key; - if (r) { - // TODO(klimt): We really only should do the following on permission - // denied errors, but we don't have the cause code here. - // It's a limbo doc. Create a synthetic event saying it was deleted. - // This is kind of a hack. Ideally, we would have a method in the local - // store to purge a document. However, it would be tricky to keep all of - // the local store's invariants with another method. - let t = new Cn(xt.comparator); - // TODO(b/217189216): This limbo document should ideally have a read time, - // so that it is picked up by any read-time based scans. The backend, - // however, does not send a read time for target removals. - t = t.insert(r, te.newNoDocument(r, ct.min())); - const n = Gn().add(r), i = new Wn(ct.min(), - /* targetChanges= */ new Map, - /* targetMismatches= */ new kn(rt), t, n); - await Qa(s, i), - // Since this query failed, we won't want to manually unlisten to it. - // We only remove it from bookkeeping after we successfully applied the - // RemoteEvent. If `applyRemoteEvent()` throws, we want to re-listen to - // this query when the RemoteStore restarts the Watch stream, which should - // re-trigger the target failure. - s.tu = s.tu.remove(r), s.eu.delete(e), su(s); - } else await to(s.localStore, e, - /* keepPersistedTargetData */ !1).then((() => Za(s, e, n))).catch(Tr); -} - -async function za(t, e) { - const n = K(t), s = e.batch.batchId; - try { - const t = await zr(n.localStore, e); - // The local store may or may not be able to apply the write result and - // raise events immediately (depending on whether the watcher is caught - // up), so we raise user callbacks first so that they consistently happen - // before listen events. - Xa(n, s, /*error=*/ null), Ya(n, s), n.sharedClientState.updateMutationState(s, "acknowledged"), - await iu(n, t); - } catch (t) { - await Tr(t); - } -} - -async function Ha(t, e, n) { - const s = K(t); - try { - const t = await function(t, e) { - const n = K(t); - return n.persistence.runTransaction("Reject batch", "readwrite-primary", (t => { - let s; - return n.Fs.lookupMutationBatch(t, e).next((e => (q(null !== e), s = e.keys(), n.Fs.removeMutationBatch(t, e)))).next((() => n.Fs.performConsistencyCheck(t))).next((() => n.ui.Us(t, s))); - })); - } - /** - * Returns the largest (latest) batch id in mutation queue that is pending - * server response. - * - * Returns `BATCHID_UNKNOWN` if the queue is empty. - */ (s.localStore, e); - // The local store may or may not be able to apply the write result and - // raise events immediately (depending on whether the watcher is caught up), - // so we raise user callbacks first so that they consistently happen before - // listen events. - Xa(s, e, n), Ya(s, e), s.sharedClientState.updateMutationState(e, "rejected", n), - await iu(s, t); - } catch (n) { - await Tr(n); - } -} - -/** - * Registers a user callback that resolves when all pending mutations at the moment of calling - * are acknowledged . - */ async function Ja(t, e) { - const n = K(t); - Xo(n.remoteStore) || O("SyncEngine", "The network is disabled. The task returned by 'awaitPendingWrites()' will not complete until the network is enabled."); - try { - const t = await function(t) { - const e = K(t); - return e.persistence.runTransaction("Get highest unacknowledged batch id", "readonly", (t => e.Fs.getHighestUnacknowledgedBatchId(t))); - }(n.localStore); - if (-1 === t) - // Trigger the callback right away if there is no pending writes at the moment. - return void e.resolve(); - const s = n.iu.get(t) || []; - s.push(e), n.iu.set(t, s); - } catch (t) { - const n = pa(t, "Initialization of waitForPendingWrites() operation failed"); - e.reject(n); - } -} - -/** - * Triggers the callbacks that are waiting for this batch id to get acknowledged by server, - * if there are any. - */ function Ya(t, e) { - (t.iu.get(e) || []).forEach((t => { - t.resolve(); - })), t.iu.delete(e); -} - -/** Reject all outstanding callbacks waiting for pending writes to complete. */ function Xa(t, e, n) { - const s = K(t); - let i = s.su[s.currentUser.toKey()]; - // NOTE: Mutations restored from persistence won't have callbacks, so it's - // okay for there to be no callback for this ID. - if (i) { - const t = i.get(e); - t && (n ? t.reject(n) : t.resolve(), i = i.remove(e)), s.su[s.currentUser.toKey()] = i; - } -} - -function Za(t, e, n = null) { - t.sharedClientState.removeLocalQueryTarget(e); - for (const s of t.Xa.get(e)) t.Ya.delete(s), n && t.Ja.uu(s, n); - if (t.Xa.delete(e), t.isPrimaryClient) { - t.nu.Ri(e).forEach((e => { - t.nu.containsKey(e) || - // We removed the last reference for this key - tu(t, e); - })); - } -} - -function tu(t, e) { - t.Za.delete(e.path.canonicalString()); - // It's possible that the target already got removed because the query failed. In that case, - // the key won't exist in `limboTargetsByKey`. Only do the cleanup if we still have the target. - const n = t.tu.get(e); - null !== n && (Wo(t.remoteStore, n), t.tu = t.tu.remove(e), t.eu.delete(n), su(t)); -} - -function eu(t, e, n) { - for (const s of n) if (s instanceof Ma) t.nu.addReference(s.key, e), nu(t, s); else if (s instanceof Oa) { - O("SyncEngine", "Document no longer in limbo: " + s.key), t.nu.removeReference(s.key, e); - t.nu.containsKey(s.key) || - // We removed the last reference for this key - tu(t, s.key); - } else L(); -} - -function nu(t, e) { - const n = e.key, s = n.path.canonicalString(); - t.tu.get(n) || t.Za.has(s) || (O("SyncEngine", "New document in limbo: " + n), t.Za.add(s), - su(t)); -} - -/** - * Starts listens for documents in limbo that are enqueued for resolution, - * subject to a maximum number of concurrent resolutions. - * - * Without bounding the number of concurrent resolutions, the server can fail - * with "resource exhausted" errors which can lead to pathological client - * behavior as seen in https://github.com/firebase/firebase-js-sdk/issues/2683. - */ function su(t) { - for (;t.Za.size > 0 && t.tu.size < t.maxConcurrentLimboResolutions; ) { - const e = t.Za.values().next().value; - t.Za.delete(e); - const n = new xt(_t.fromString(e)), s = t.ru.next(); - t.eu.set(s, new Ba(n)), t.tu = t.tu.insert(n, s), jo(t.remoteStore, new Ai($e(De(n.path)), s, 2 /* LimboResolution */ , nt.A)); - } -} - -async function iu(t, e, n) { - const s = K(t), i = [], r = [], o = []; - s.Ya.isEmpty() || (s.Ya.forEach(((t, a) => { - o.push(s.au(a, e, n).then((t => { - if (t) { - s.isPrimaryClient && s.sharedClientState.updateQueryState(a.targetId, t.fromCache ? "not-current" : "current"), - i.push(t); - const e = Kr.Js(a.targetId, t); - r.push(e); - } - }))); - })), await Promise.all(o), s.Ja.Ko(i), await async function(t, e) { - const n = K(t); - try { - await n.persistence.runTransaction("notifyLocalViewChanges", "readwrite", (t => ui.forEach(e, (e => ui.forEach(e.zs, (s => n.persistence.referenceDelegate.addReference(t, e.targetId, s))).next((() => ui.forEach(e.Hs, (s => n.persistence.referenceDelegate.removeReference(t, e.targetId, s))))))))); - } catch (t) { - if (!di(t)) throw t; - // If `notifyLocalViewChanges` fails, we did not advance the sequence - // number for the documents that were included in this transaction. - // This might trigger them to be deleted earlier than they otherwise - // would have, but it should not invalidate the integrity of the data. - O("LocalStore", "Failed to update sequence numbers: " + t); - } - for (const t of e) { - const e = t.targetId; - if (!t.fromCache) { - const t = n.si.get(e), s = t.snapshotVersion, i = t.withLastLimboFreeSnapshotVersion(s); - // Advance the last limbo free snapshot version - n.si = n.si.insert(e, i); - } - } - }(s.localStore, r)); -} - -async function ru(t, e) { - const n = K(t); - if (!n.currentUser.isEqual(e)) { - O("SyncEngine", "User change. New user:", e.toKey()); - const t = await Wr(n.localStore, e); - n.currentUser = e, - // Fails tasks waiting for pending writes requested by previous user. - function(t, e) { - t.iu.forEach((t => { - t.forEach((t => { - t.reject(new Q(G.CANCELLED, e)); - })); - })), t.iu.clear(); - }(n, "'waitForPendingWrites' promise is rejected due to a user change."), - // TODO(b/114226417): Consider calling this only in the primary tab. - n.sharedClientState.handleUserChange(e, t.removedBatchIds, t.addedBatchIds), await iu(n, t.ci); - } -} - -function ou(t, e) { - const n = K(t), s = n.eu.get(e); - if (s && s.Ha) return Gn().add(s.key); - { - let t = Gn(); - const s = n.Xa.get(e); - if (!s) return t; - for (const e of s) { - const s = n.Ya.get(e); - t = t.unionWith(s.view.Ba); - } - return t; - } -} - -/** - * Reconcile the list of synced documents in an existing view with those - * from persistence. - */ async function au(t, e) { - const n = K(t), s = await eo(n.localStore, e.query, - /* usePreviousResults= */ !0), i = e.view.Wa(s); - return n.isPrimaryClient && eu(n, e.targetId, i.Qa), i; -} - -/** - * Retrieves newly changed documents from remote document cache and raises - * snapshots if needed. - */ -// PORTING NOTE: Multi-Tab only. -async function uu(t) { - const e = K(t); - return so(e.localStore).then((t => iu(e, t))); -} - -/** Applies a mutation state to an existing batch. */ -// PORTING NOTE: Multi-Tab only. -async function cu(t, e, n, s) { - const i = K(t), r = await function(t, e) { - const n = K(t), s = K(n.Fs); - return n.persistence.runTransaction("Lookup mutation documents", "readonly", (t => s.ln(t, e).next((e => e ? n.ui.Us(t, e) : ui.resolve(null))))); - } - // PORTING NOTE: Multi-Tab only. - (i.localStore, e); - null !== r ? ("pending" === n ? - // If we are the primary client, we need to send this write to the - // backend. Secondary clients will ignore these writes since their remote - // connection is disabled. - await ra(i.remoteStore) : "acknowledged" === n || "rejected" === n ? ( - // NOTE: Both these methods are no-ops for batches that originated from - // other clients. - Xa(i, e, s || null), Ya(i, e), function(t, e) { - K(K(t).Fs).dn(e); - } - // PORTING NOTE: Multi-Tab only. - (i.localStore, e)) : L(), await iu(i, r)) : - // A throttled tab may not have seen the mutation before it was completed - // and removed from the mutation queue, in which case we won't have cached - // the affected documents. In this case we can safely ignore the update - // since that means we didn't apply the mutation locally at all (if we - // had, we would have cached the affected documents), and so we will just - // see any resulting document changes via normal remote document updates - // as applicable. - O("SyncEngine", "Cannot apply mutation batch with id: " + e); -} - -/** Applies a query target change from a different tab. */ -// PORTING NOTE: Multi-Tab only. -async function hu(t, e) { - const n = K(t); - if (mu(n), gu(n), !0 === e && !0 !== n.ou) { - // Secondary tabs only maintain Views for their local listeners and the - // Views internal state may not be 100% populated (in particular - // secondary tabs don't track syncedDocuments, the set of documents the - // server considers to be in the target). So when a secondary becomes - // primary, we need to need to make sure that all views for all targets - // match the state on disk. - const t = n.sharedClientState.getAllActiveQueryTargets(), e = await lu(n, t.toArray()); - n.ou = !0, await wa(n.remoteStore, !0); - for (const t of e) jo(n.remoteStore, t); - } else if (!1 === e && !1 !== n.ou) { - const t = []; - let e = Promise.resolve(); - n.Xa.forEach(((s, i) => { - n.sharedClientState.isLocalQueryTarget(i) ? t.push(i) : e = e.then((() => (Za(n, i), - to(n.localStore, i, - /*keepPersistedTargetData=*/ !0)))), Wo(n.remoteStore, i); - })), await e, await lu(n, t), - // PORTING NOTE: Multi-Tab only. - function(t) { - const e = K(t); - e.eu.forEach(((t, n) => { - Wo(e.remoteStore, n); - })), e.nu.bi(), e.eu = new Map, e.tu = new Cn(xt.comparator); - } - /** - * Reconcile the query views of the provided query targets with the state from - * persistence. Raises snapshots for any changes that affect the local - * client and returns the updated state of all target's query data. - * - * @param syncEngine - The sync engine implementation - * @param targets - the list of targets with views that need to be recomputed - * @param transitionToPrimary - `true` iff the tab transitions from a secondary - * tab to a primary tab - */ - // PORTING NOTE: Multi-Tab only. - (n), n.ou = !1, await wa(n.remoteStore, !1); - } -} - -async function lu(t, e, n) { - const s = K(t), i = [], r = []; - for (const t of e) { - let e; - const n = s.Xa.get(t); - if (n && 0 !== n.length) { - // For queries that have a local View, we fetch their current state - // from LocalStore (as the resume token and the snapshot version - // might have changed) and reconcile their views with the persisted - // state (the list of syncedDocuments may have gotten out of sync). - e = await Zr(s.localStore, $e(n[0])); - for (const t of n) { - const e = s.Ya.get(t), n = await au(s, e); - n.snapshot && r.push(n.snapshot); - } - } else { - // For queries that never executed on this client, we need to - // allocate the target in LocalStore and initialize a new View. - const n = await no(s.localStore, t); - e = await Zr(s.localStore, n), await Ua(s, fu(n), t, - /*current=*/ !1); - } - i.push(e); - } - return s.Ja.Ko(r), i; -} - -/** - * Creates a `Query` object from the specified `Target`. There is no way to - * obtain the original `Query`, so we synthesize a `Query` from the `Target` - * object. - * - * The synthesized result might be different from the original `Query`, but - * since the synthesized `Query` should return the same results as the - * original one (only the presentation of results might differ), the potential - * difference will not cause issues. - */ -// PORTING NOTE: Multi-Tab only. -function fu(t) { - return Se(t.path, t.collectionGroup, t.orderBy, t.filters, t.limit, "F" /* First */ , t.startAt, t.endAt); -} - -/** Returns the IDs of the clients that are currently active. */ -// PORTING NOTE: Multi-Tab only. -function du(t) { - const e = K(t); - return K(K(e.localStore).persistence).Ms(); -} - -/** Applies a query target change from a different tab. */ -// PORTING NOTE: Multi-Tab only. -async function _u(t, e, n, s) { - const i = K(t); - if (i.ou) - // If we receive a target state notification via WebStorage, we are - // either already secondary or another tab has taken the primary lease. - O("SyncEngine", "Ignoring unexpected query state notification."); else if (i.Xa.has(e)) switch (n) { - case "current": - case "not-current": - { - const t = await so(i.localStore), s = Wn.createSynthesizedRemoteEventForCurrentChange(e, "current" === n); - await iu(i, t, s); - break; - } - - case "rejected": - await to(i.localStore, e, - /* keepPersistedTargetData */ !0), Za(i, e, s); - break; - - default: - L(); - } -} - -/** Adds or removes Watch targets for queries from different tabs. */ async function wu(t, e, n) { - const s = mu(t); - if (s.ou) { - for (const t of e) { - if (s.Xa.has(t)) { - // A target might have been added in a previous attempt - O("SyncEngine", "Adding an already active target " + t); - continue; - } - const e = await no(s.localStore, t), n = await Zr(s.localStore, e); - await Ua(s, fu(e), n.targetId, - /*current=*/ !1), jo(s.remoteStore, n); - } - for (const t of n) - // Check that the target is still active since the target might have been - // removed if it has been rejected by the backend. - s.Xa.has(t) && - // Release queries that are still active. - await to(s.localStore, t, - /* keepPersistedTargetData */ !1).then((() => { - Wo(s.remoteStore, t), Za(s, t); - })).catch(Tr); - } -} - -function mu(t) { - const e = K(t); - return e.remoteStore.remoteSyncer.applyRemoteEvent = Qa.bind(null, e), e.remoteStore.remoteSyncer.getRemoteKeysForTarget = ou.bind(null, e), - e.remoteStore.remoteSyncer.rejectListen = Wa.bind(null, e), e.Ja.Ko = Va.bind(null, e.eventManager), - e.Ja.uu = va.bind(null, e.eventManager), e; -} - -function gu(t) { - const e = K(t); - return e.remoteStore.remoteSyncer.applySuccessfulWrite = za.bind(null, e), e.remoteStore.remoteSyncer.rejectFailedWrite = Ha.bind(null, e), - e; -} - -/** - * Loads a Firestore bundle into the SDK. The returned promise resolves when - * the bundle finished loading. - * - * @param syncEngine - SyncEngine to use. - * @param bundleReader - Bundle to load into the SDK. - * @param task - LoadBundleTask used to update the loading progress to public API. - */ function yu(t, e, n) { - const s = K(t); - // eslint-disable-next-line @typescript-eslint/no-floating-promises - (async function(t, e, n) { - try { - const s = await e.getMetadata(); - if (await function(t, e) { - const n = K(t), s = us(e.createTime); - return n.persistence.runTransaction("hasNewerBundle", "readonly", (t => n.fs.getBundleMetadata(t, e.id))).then((t => !!t && t.createTime.compareTo(s) >= 0)); - } - /** - * Saves the given `BundleMetadata` to local persistence. - */ (t.localStore, s)) return await e.close(), void n._completeWith(function(t) { - return { - taskState: "Success", - documentsLoaded: t.totalDocuments, - bytesLoaded: t.totalBytes, - totalDocuments: t.totalDocuments, - totalBytes: t.totalBytes - }; - }(s)); - n._updateProgress(ka(s)); - const i = new Na(s, t.localStore, e.M); - let r = await e.cu(); - for (;r; ) { - const t = await i.xa(r); - t && n._updateProgress(t), r = await e.cu(); - } - const o = await i.complete(); - // TODO(b/160876443): This currently raises snapshots with - // `fromCache=false` if users already listen to some queries and bundles - // has newer version. - await iu(t, o.$s, - /* remoteEvent */ void 0), - // Save metadata, so loading the same bundle will skip. - await function(t, e) { - const n = K(t); - return n.persistence.runTransaction("Save bundle", "readwrite", (t => n.fs.saveBundleMetadata(t, e))); - } - /** - * Returns a promise of a `NamedQuery` associated with given query name. Promise - * resolves to undefined if no persisted data can be found. - */ (t.localStore, s), n._completeWith(o.progress); - } catch (t) { - F("SyncEngine", `Loading bundle failed with ${t}`), n._failWith(t); - } - } - /** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * Provides all components needed for Firestore with in-memory persistence. - * Uses EagerGC garbage collection. - */)(s, e, n).then((() => { - s.sharedClientState.notifyBundleLoaded(); - })); -} - -class pu { - constructor() { - this.synchronizeTabs = !1; - } - async initialize(t) { - this.M = Oo(t.databaseInfo.databaseId), this.sharedClientState = this.hu(t), this.persistence = this.lu(t), - await this.persistence.start(), this.gcScheduler = this.fu(t), this.localStore = this.du(t); - } - fu(t) { - return null; - } - du(t) { - return jr(this.persistence, new Gr, t.initialUser, this.M); - } - lu(t) { - return new mo(yo.Wi, this.M); - } - hu(t) { - return new vo; - } - async terminate() { - this.gcScheduler && this.gcScheduler.stop(), await this.sharedClientState.shutdown(), - await this.persistence.shutdown(); - } -} - -/** - * Provides all components needed for Firestore with IndexedDB persistence. - */ class Iu extends pu { - constructor(t, e, n) { - super(), this._u = t, this.cacheSizeBytes = e, this.forceOwnership = n, this.synchronizeTabs = !1; - } - async initialize(t) { - await super.initialize(t), await io(this.localStore), await this._u.initialize(this, t), - // Enqueue writes from a previous session - await gu(this._u.syncEngine), await ra(this._u.remoteStore), - // NOTE: This will immediately call the listener, so we make sure to - // set it after localStore / remoteStore are started. - await this.persistence.ps((() => (this.gcScheduler && !this.gcScheduler.started && this.gcScheduler.start(this.localStore), - Promise.resolve()))); - } - du(t) { - return jr(this.persistence, new Gr, t.initialUser, this.M); - } - fu(t) { - const e = this.persistence.referenceDelegate.garbageCollector; - return new Rr(e, t.asyncQueue); - } - lu(t) { - const e = Lr(t.databaseInfo.databaseId, t.databaseInfo.persistenceKey), n = void 0 !== this.cacheSizeBytes ? ur.withCacheSize(this.cacheSizeBytes) : ur.DEFAULT; - return new $r(this.synchronizeTabs, e, t.clientId, n, t.asyncQueue, ko(), Mo(), this.M, this.sharedClientState, !!this.forceOwnership); - } - hu(t) { - return new vo; - } -} - -/** - * Provides all components needed for Firestore with multi-tab IndexedDB - * persistence. - * - * In the legacy client, this provider is used to provide both multi-tab and - * non-multi-tab persistence since we cannot tell at build time whether - * `synchronizeTabs` will be enabled. - */ class Tu extends Iu { - constructor(t, e) { - super(t, e, /* forceOwnership= */ !1), this._u = t, this.cacheSizeBytes = e, this.synchronizeTabs = !0; - } - async initialize(t) { - await super.initialize(t); - const e = this._u.syncEngine; - this.sharedClientState instanceof Vo && (this.sharedClientState.syncEngine = { - Nr: cu.bind(null, e), - kr: _u.bind(null, e), - Mr: wu.bind(null, e), - Ms: du.bind(null, e), - Cr: uu.bind(null, e) - }, await this.sharedClientState.start()), - // NOTE: This will immediately call the listener, so we make sure to - // set it after localStore / remoteStore are started. - await this.persistence.ps((async t => { - await hu(this._u.syncEngine, t), this.gcScheduler && (t && !this.gcScheduler.started ? this.gcScheduler.start(this.localStore) : t || this.gcScheduler.stop()); - })); - } - hu(t) { - const e = ko(); - if (!Vo.vt(e)) throw new Q(G.UNIMPLEMENTED, "IndexedDB persistence is only available on platforms that support LocalStorage."); - const n = Lr(t.databaseInfo.databaseId, t.databaseInfo.persistenceKey); - return new Vo(e, t.asyncQueue, n, t.clientId, t.initialUser); - } -} - -/** - * Initializes and wires the components that are needed to interface with the - * network. - */ class Eu { - async initialize(t, e) { - this.localStore || (this.localStore = t.localStore, this.sharedClientState = t.sharedClientState, - this.datastore = this.createDatastore(e), this.remoteStore = this.createRemoteStore(e), - this.eventManager = this.createEventManager(e), this.syncEngine = this.createSyncEngine(e, - /* startAsPrimary=*/ !t.synchronizeTabs), this.sharedClientState.onlineStateHandler = t => ja(this.syncEngine, t, 1 /* SharedClientState */), - this.remoteStore.remoteSyncer.handleCredentialChange = ru.bind(null, this.syncEngine), - await wa(this.remoteStore, this.syncEngine.isPrimaryClient)); - } - createEventManager(t) { - return new Ra; - } - createDatastore(t) { - const e = Oo(t.databaseInfo.databaseId), n = (s = t.databaseInfo, new No(s)); - var s; - /** Return the Platform-specific connectivity monitor. */ return function(t, e, n, s) { - return new qo(t, e, n, s); - }(t.authCredentials, t.appCheckCredentials, n, e); - } - createRemoteStore(t) { - return e = this.localStore, n = this.datastore, s = t.asyncQueue, i = t => ja(this.syncEngine, t, 0 /* RemoteStore */), - r = Do.vt() ? new Do : new So, new Ko(e, n, s, i, r); - var e, n, s, i, r; - /** Re-enables the network. Idempotent. */ } - createSyncEngine(t, e) { - return function(t, e, n, - // PORTING NOTE: Manages state synchronization in multi-tab environments. - s, i, r, o) { - const a = new La(t, e, n, s, i, r); - return o && (a.ou = !0), a; - }(this.localStore, this.remoteStore, this.eventManager, this.sharedClientState, t.initialUser, t.maxConcurrentLimboResolutions, e); - } - terminate() { - return async function(t) { - const e = K(t); - O("RemoteStore", "RemoteStore shutting down."), e.ha.add(5 /* Shutdown */), await Qo(e), - e.fa.shutdown(), - // Set the OnlineState to Unknown (rather than Offline) to avoid potentially - // triggering spurious listener events with cached data, etc. - e.da.set("Unknown" /* Unknown */); - }(this.remoteStore); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * How many bytes to read each time when `ReadableStreamReader.read()` is - * called. Only applicable for byte streams that we control (e.g. those backed - * by an UInt8Array). - */ -/** - * Builds a `ByteStreamReader` from a UInt8Array. - * @param source - The data source to use. - * @param bytesPerRead - How many bytes each `read()` from the returned reader - * will read. - */ -function Au(t, e = 10240) { - let n = 0; - // The TypeScript definition for ReadableStreamReader changed. We use - // `any` here to allow this code to compile with different versions. - // See https://github.com/microsoft/TypeScript/issues/42970 - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async read() { - if (n < t.byteLength) { - const s = { - value: t.slice(n, n + e), - done: !1 - }; - return n += e, s; - } - return { - done: !0 - }; - }, - async cancel() {}, - releaseLock() {}, - closed: Promise.reject("unimplemented") - }; -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * On web, a `ReadableStream` is wrapped around by a `ByteStreamReader`. - */ -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/* - * A wrapper implementation of Observer that will dispatch events - * asynchronously. To allow immediate silencing, a mute call is added which - * causes events scheduled to no longer be raised. - */ -class Ru { - constructor(t) { - this.observer = t, - /** - * When set to true, will not raise future events. Necessary to deal with - * async detachment of listener. - */ - this.muted = !1; - } - next(t) { - this.observer.next && this.wu(this.observer.next, t); - } - error(t) { - this.observer.error ? this.wu(this.observer.error, t) : console.error("Uncaught Error in snapshot listener:", t); - } - mu() { - this.muted = !0; - } - wu(t, e) { - this.muted || setTimeout((() => { - this.muted || t(e); - }), 0); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A class representing a bundle. - * - * Takes a bundle stream or buffer, and presents abstractions to read bundled - * elements out of the underlying content. - */ class bu { - constructor( - /** The reader to read from underlying binary bundle data source. */ - t, e) { - this.gu = t, this.M = e, - /** Cached bundle metadata. */ - this.metadata = new j, - /** - * Internal buffer to hold bundle content, accumulating incomplete element - * content. - */ - this.buffer = new Uint8Array, this.yu = new TextDecoder("utf-8"), - // Read the metadata (which is the first element). - this.pu().then((t => { - t && t.Da() ? this.metadata.resolve(t.payload.metadata) : this.metadata.reject(new Error(`The first element of the bundle is not a metadata, it is\n ${JSON.stringify(null == t ? void 0 : t.payload)}`)); - }), (t => this.metadata.reject(t))); - } - close() { - return this.gu.cancel(); - } - async getMetadata() { - return this.metadata.promise; - } - async cu() { - // Makes sure metadata is read before proceeding. - return await this.getMetadata(), this.pu(); - } - /** - * Reads from the head of internal buffer, and pulling more data from - * underlying stream if a complete element cannot be found, until an - * element(including the prefixed length and the JSON string) is found. - * - * Once a complete element is read, it is dropped from internal buffer. - * - * Returns either the bundled element, or null if we have reached the end of - * the stream. - */ async pu() { - const t = await this.Iu(); - if (null === t) return null; - const e = this.yu.decode(t), n = Number(e); - isNaN(n) && this.Tu(`length string (${e}) is not valid number`); - const s = await this.Eu(n); - return new Ca(JSON.parse(s), t.length + n); - } - /** First index of '{' from the underlying buffer. */ Au() { - return this.buffer.findIndex((t => t === "{".charCodeAt(0))); - } - /** - * Reads from the beginning of the internal buffer, until the first '{', and - * return the content. - * - * If reached end of the stream, returns a null. - */ async Iu() { - for (;this.Au() < 0; ) { - if (await this.Ru()) break; - } - // Broke out of the loop because underlying stream is closed, and there - // happens to be no more data to process. - if (0 === this.buffer.length) return null; - const t = this.Au(); - // Broke out of the loop because underlying stream is closed, but still - // cannot find an open bracket. - t < 0 && this.Tu("Reached the end of bundle when a length string is expected."); - const e = this.buffer.slice(0, t); - // Update the internal buffer to drop the read length. - return this.buffer = this.buffer.slice(t), e; - } - /** - * Reads from a specified position from the internal buffer, for a specified - * number of bytes, pulling more data from the underlying stream if needed. - * - * Returns a string decoded from the read bytes. - */ async Eu(t) { - for (;this.buffer.length < t; ) { - await this.Ru() && this.Tu("Reached the end of bundle when more is expected."); - } - const e = this.yu.decode(this.buffer.slice(0, t)); - // Update the internal buffer to drop the read json string. - return this.buffer = this.buffer.slice(t), e; - } - Tu(t) { - // eslint-disable-next-line @typescript-eslint/no-floating-promises - throw this.gu.cancel(), new Error(`Invalid bundle format: ${t}`); - } - /** - * Pulls more data from underlying stream to internal buffer. - * Returns a boolean indicating whether the stream is finished. - */ async Ru() { - const t = await this.gu.read(); - if (!t.done) { - const e = new Uint8Array(this.buffer.length + t.value.length); - e.set(this.buffer), e.set(t.value, this.buffer.length), this.buffer = e; - } - return t.done; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Internal transaction object responsible for accumulating the mutations to - * perform and the base versions for any documents read. - */ -class Pu { - constructor(t) { - this.datastore = t, - // The version of each document that was read during this transaction. - this.readVersions = new Map, this.mutations = [], this.committed = !1, - /** - * A deferred usage error that occurred previously in this transaction that - * will cause the transaction to fail once it actually commits. - */ - this.lastWriteError = null, - /** - * Set of documents that have been written in the transaction. - * - * When there's more than one write to the same key in a transaction, any - * writes after the first are handled differently. - */ - this.writtenDocs = new Set; - } - async lookup(t) { - if (this.ensureCommitNotCalled(), this.mutations.length > 0) throw new Q(G.INVALID_ARGUMENT, "Firestore transactions require all reads to be executed before all writes."); - const e = await async function(t, e) { - const n = K(t), s = ws(n.M) + "/documents", i = { - documents: e.map((t => ls(n.M, t))) - }, r = await n.uo("BatchGetDocuments", s, i), o = new Map; - r.forEach((t => { - const e = ps(n.M, t); - o.set(e.key.toString(), e); - })); - const a = []; - return e.forEach((t => { - const e = o.get(t.toString()); - q(!!e), a.push(e); - })), a; - }(this.datastore, t); - return e.forEach((t => this.recordVersion(t))), e; - } - set(t, e) { - this.write(e.toMutation(t, this.precondition(t))), this.writtenDocs.add(t.toString()); - } - update(t, e) { - try { - this.write(e.toMutation(t, this.preconditionForUpdate(t))); - } catch (t) { - this.lastWriteError = t; - } - this.writtenDocs.add(t.toString()); - } - delete(t) { - this.write(new An(t, this.precondition(t))), this.writtenDocs.add(t.toString()); - } - async commit() { - if (this.ensureCommitNotCalled(), this.lastWriteError) throw this.lastWriteError; - const t = this.readVersions; - // For each mutation, note that the doc was written. - this.mutations.forEach((e => { - t.delete(e.key.toString()); - })), - // For each document that was read but not written to, we want to perform - // a `verify` operation. - t.forEach(((t, e) => { - const n = xt.fromPath(e); - this.mutations.push(new Rn(n, this.precondition(n))); - })), await async function(t, e) { - const n = K(t), s = ws(n.M) + "/documents", i = { - writes: e.map((t => Ts(n.M, t))) - }; - await n.io("Commit", s, i); - }(this.datastore, this.mutations), this.committed = !0; - } - recordVersion(t) { - let e; - if (t.isFoundDocument()) e = t.version; else { - if (!t.isNoDocument()) throw L(); - // For deleted docs, we must use baseVersion 0 when we overwrite them. - e = ct.min(); - } - const n = this.readVersions.get(t.key.toString()); - if (n) { - if (!e.isEqual(n)) - // This transaction will fail no matter what. - throw new Q(G.ABORTED, "Document version changed between two reads."); - } else this.readVersions.set(t.key.toString(), e); - } - /** - * Returns the version of this document when it was read in this transaction, - * as a precondition, or no precondition if it was not read. - */ precondition(t) { - const e = this.readVersions.get(t.toString()); - return !this.writtenDocs.has(t.toString()) && e ? hn.updateTime(e) : hn.none(); - } - /** - * Returns the precondition for a document if the operation is an update. - */ preconditionForUpdate(t) { - const e = this.readVersions.get(t.toString()); - // The first time a document is written, we want to take into account the - // read time and existence - if (!this.writtenDocs.has(t.toString()) && e) { - if (e.isEqual(ct.min())) - // The document doesn't exist, so fail the transaction. - // This has to be validated locally because you can't send a - // precondition that a document does not exist without changing the - // semantics of the backend write to be an insert. This is the reverse - // of what we want, since we want to assert that the document doesn't - // exist but then send the update and have it fail. Since we can't - // express that to the backend, we have to validate locally. - // Note: this can change once we can send separate verify writes in the - // transaction. - throw new Q(G.INVALID_ARGUMENT, "Can't update a document that doesn't exist."); - // Document exists, base precondition on document update time. - return hn.updateTime(e); - } - // Document was not read, so we just use the preconditions for a blind - // update. - return hn.exists(!0); - } - write(t) { - this.ensureCommitNotCalled(), this.mutations.push(t); - } - ensureCommitNotCalled() {} -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * TransactionRunner encapsulates the logic needed to run and retry transactions - * with backoff. - */ -class Vu { - constructor(t, e, n, s) { - this.asyncQueue = t, this.datastore = e, this.updateFunction = n, this.deferred = s, - this.bu = 5, this.vo = new $o(this.asyncQueue, "transaction_retry" /* TransactionRetry */); - } - /** Runs the transaction and sets the result on deferred. */ run() { - this.bu -= 1, this.Pu(); - } - Pu() { - this.vo.po((async () => { - const t = new Pu(this.datastore), e = this.Vu(t); - e && e.then((e => { - this.asyncQueue.enqueueAndForget((() => t.commit().then((() => { - this.deferred.resolve(e); - })).catch((t => { - this.vu(t); - })))); - })).catch((t => { - this.vu(t); - })); - })); - } - Vu(t) { - try { - const e = this.updateFunction(t); - return !St(e) && e.catch && e.then ? e : (this.deferred.reject(Error("Transaction callback must return a Promise")), - null); - } catch (t) { - // Do not retry errors thrown by user provided updateFunction. - return this.deferred.reject(t), null; - } - } - vu(t) { - this.bu > 0 && this.Su(t) ? (this.bu -= 1, this.asyncQueue.enqueueAndForget((() => (this.Pu(), - Promise.resolve())))) : this.deferred.reject(t); - } - Su(t) { - if ("FirebaseError" === t.name) { - // In transactions, the backend will fail outdated reads with FAILED_PRECONDITION and - // non-matching document versions with ABORTED. These errors should be retried. - const e = t.code; - return "aborted" === e || "failed-precondition" === e || !vn(e); - } - return !1; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * FirestoreClient is a top-level class that constructs and owns all of the - * pieces of the client SDK architecture. It is responsible for creating the - * async queue that is shared by all of the other components in the system. - */ -class vu { - constructor(t, e, - /** - * Asynchronous queue responsible for all of our internal processing. When - * we get incoming work from the user (via public API) or the network - * (incoming GRPC messages), we should always schedule onto this queue. - * This ensures all of our work is properly serialized (e.g. we don't - * start processing a new operation while the previous one is waiting for - * an async I/O to complete). - */ - n, s) { - this.authCredentials = t, this.appCheckCredentials = e, this.asyncQueue = n, this.databaseInfo = s, - this.user = C.UNAUTHENTICATED, this.clientId = it.R(), this.authCredentialListener = () => Promise.resolve(), - this.appCheckCredentialListener = () => Promise.resolve(), this.authCredentials.start(n, (async t => { - O("FirestoreClient", "Received user=", t.uid), await this.authCredentialListener(t), - this.user = t; - })), this.appCheckCredentials.start(n, (t => (O("FirestoreClient", "Received new app check token=", t), - this.appCheckCredentialListener(t, this.user)))); - } - async getConfiguration() { - return { - asyncQueue: this.asyncQueue, - databaseInfo: this.databaseInfo, - clientId: this.clientId, - authCredentials: this.authCredentials, - appCheckCredentials: this.appCheckCredentials, - initialUser: this.user, - maxConcurrentLimboResolutions: 100 - }; - } - setCredentialChangeListener(t) { - this.authCredentialListener = t; - } - setAppCheckTokenChangeListener(t) { - this.appCheckCredentialListener = t; - } - /** - * Checks that the client has not been terminated. Ensures that other methods on - * this class cannot be called after the client is terminated. - */ verifyNotTerminated() { - if (this.asyncQueue.isShuttingDown) throw new Q(G.FAILED_PRECONDITION, "The client has already been terminated."); - } - terminate() { - this.asyncQueue.enterRestrictedMode(); - const t = new j; - return this.asyncQueue.enqueueAndForgetEvenWhileRestricted((async () => { - try { - this.onlineComponents && await this.onlineComponents.terminate(), this.offlineComponents && await this.offlineComponents.terminate(), - // The credentials provider must be terminated after shutting down the - // RemoteStore as it will prevent the RemoteStore from retrieving auth - // tokens. - this.authCredentials.shutdown(), this.appCheckCredentials.shutdown(), t.resolve(); - } catch (e) { - const n = pa(e, "Failed to shutdown persistence"); - t.reject(n); - } - })), t.promise; - } -} - -async function Su(t, e) { - t.asyncQueue.verifyOperationInProgress(), O("FirestoreClient", "Initializing OfflineComponentProvider"); - const n = await t.getConfiguration(); - await e.initialize(n); - let s = n.initialUser; - t.setCredentialChangeListener((async t => { - s.isEqual(t) || (await Wr(e.localStore, t), s = t); - })), - // When a user calls clearPersistence() in one client, all other clients - // need to be terminated to allow the delete to succeed. - e.persistence.setDatabaseDeletedListener((() => t.terminate())), t.offlineComponents = e; -} - -async function Du(t, e) { - t.asyncQueue.verifyOperationInProgress(); - const n = await Cu(t); - O("FirestoreClient", "Initializing OnlineComponentProvider"); - const s = await t.getConfiguration(); - await e.initialize(n, s), - // The CredentialChangeListener of the online component provider takes - // precedence over the offline component provider. - t.setCredentialChangeListener((t => _a(e.remoteStore, t))), t.setAppCheckTokenChangeListener(((t, n) => _a(e.remoteStore, n))), - t.onlineComponents = e; -} - -async function Cu(t) { - return t.offlineComponents || (O("FirestoreClient", "Using default OfflineComponentProvider"), - await Su(t, new pu)), t.offlineComponents; -} - -async function xu(t) { - return t.onlineComponents || (O("FirestoreClient", "Using default OnlineComponentProvider"), - await Du(t, new Eu)), t.onlineComponents; -} - -function Nu(t) { - return Cu(t).then((t => t.persistence)); -} - -function ku(t) { - return Cu(t).then((t => t.localStore)); -} - -function Mu(t) { - return xu(t).then((t => t.remoteStore)); -} - -function Ou(t) { - return xu(t).then((t => t.syncEngine)); -} - -async function $u(t) { - const e = await xu(t), n = e.eventManager; - return n.onListen = qa.bind(null, e.syncEngine), n.onUnlisten = Ka.bind(null, e.syncEngine), - n; -} - -/** Enables the network connection and re-enqueues all pending operations. */ function Fu(t) { - return t.asyncQueue.enqueue((async () => { - const e = await Nu(t), n = await Mu(t); - return e.setNetworkEnabled(!0), function(t) { - const e = K(t); - return e.ha.delete(0 /* UserDisabled */), Go(e); - }(n); - })); -} - -/** Disables the network connection. Pending operations will not complete. */ function Bu(t) { - return t.asyncQueue.enqueue((async () => { - const e = await Nu(t), n = await Mu(t); - return e.setNetworkEnabled(!1), async function(t) { - const e = K(t); - e.ha.add(0 /* UserDisabled */), await Qo(e), - // Set the OnlineState to Offline so get()s return from cache, etc. - e.da.set("Offline" /* Offline */); - }(n); - })); -} - -/** - * Returns a Promise that resolves when all writes that were pending at the time - * this method was called received server acknowledgement. An acknowledgement - * can be either acceptance or rejection. - */ function Lu(t, e) { - const n = new j; - return t.asyncQueue.enqueueAndForget((async () => async function(t, e, n) { - try { - const s = await function(t, e) { - const n = K(t); - return n.persistence.runTransaction("read document", "readonly", (t => n.ui.Bs(t, e))); - }(t, e); - s.isFoundDocument() ? n.resolve(s) : s.isNoDocument() ? n.resolve(null) : n.reject(new Q(G.UNAVAILABLE, "Failed to get document from cache. (However, this document may exist on the server. Run again without setting 'source' in the GetOptions to attempt to retrieve the document from the server.)")); - } catch (t) { - const s = pa(t, `Failed to get document '${e} from cache`); - n.reject(s); - } - } - /** - * Retrieves a latency-compensated document from the backend via a - * SnapshotListener. - */ (await ku(t), e, n))), n.promise; -} - -function qu(t, e, n = {}) { - const s = new j; - return t.asyncQueue.enqueueAndForget((async () => function(t, e, n, s, i) { - const r = new Ru({ - next: r => { - // Remove query first before passing event to user to avoid - // user actions affecting the now stale query. - e.enqueueAndForget((() => Pa(t, o))); - const a = r.docs.has(n); - !a && r.fromCache ? - // TODO(dimond): If we're online and the document doesn't - // exist then we resolve with a doc.exists set to false. If - // we're offline however, we reject the Promise in this - // case. Two options: 1) Cache the negative response from - // the server so we can deliver that even when you're - // offline 2) Actually reject the Promise in the online case - // if the document doesn't exist. - i.reject(new Q(G.UNAVAILABLE, "Failed to get document because the client is offline.")) : a && r.fromCache && s && "server" === s.source ? i.reject(new Q(G.UNAVAILABLE, 'Failed to get document from server. (However, this document does exist in the local cache. Run again without setting source to "server" to retrieve the cached document.)')) : i.resolve(r); - }, - error: t => i.reject(t) - }), o = new Da(De(n.path), r, { - includeMetadataChanges: !0, - Sa: !0 - }); - return ba(t, o); - }(await $u(t), t.asyncQueue, e, n, s))), s.promise; -} - -function Uu(t, e) { - const n = new j; - return t.asyncQueue.enqueueAndForget((async () => async function(t, e, n) { - try { - const s = await eo(t, e, - /* usePreviousResults= */ !0), i = new $a(e, s.hi), r = i.La(s.documents), o = i.applyChanges(r, - /* updateLimboDocuments= */ !1); - n.resolve(o.snapshot); - } catch (t) { - const s = pa(t, `Failed to execute query '${e} against cache`); - n.reject(s); - } - } - /** - * Retrieves a latency-compensated query snapshot from the backend via a - * SnapshotListener. - */ (await ku(t), e, n))), n.promise; -} - -function Ku(t, e, n = {}) { - const s = new j; - return t.asyncQueue.enqueueAndForget((async () => function(t, e, n, s, i) { - const r = new Ru({ - next: n => { - // Remove query first before passing event to user to avoid - // user actions affecting the now stale query. - e.enqueueAndForget((() => Pa(t, o))), n.fromCache && "server" === s.source ? i.reject(new Q(G.UNAVAILABLE, 'Failed to get documents from server. (However, these documents may exist in the local cache. Run again without setting source to "server" to retrieve the cached documents.)')) : i.resolve(n); - }, - error: t => i.reject(t) - }), o = new Da(n, r, { - includeMetadataChanges: !0, - Sa: !0 - }); - return ba(t, o); - }(await $u(t), t.asyncQueue, e, n, s))), s.promise; -} - -function Gu(t, e) { - const n = new Ru(e); - return t.asyncQueue.enqueueAndForget((async () => function(t, e) { - K(t).Ia.add(e), - // Immediately fire an initial event, indicating all existing listeners - // are in-sync. - e.next(); - }(await $u(t), n))), () => { - n.mu(), t.asyncQueue.enqueueAndForget((async () => function(t, e) { - K(t).Ia.delete(e); - }(await $u(t), n))); - }; -} - -/** - * Takes an updateFunction in which a set of reads and writes can be performed - * atomically. In the updateFunction, the client can read and write values - * using the supplied transaction object. After the updateFunction, all - * changes will be committed. If a retryable error occurs (ex: some other - * client has changed any of the data referenced), then the updateFunction - * will be called again after a backoff. If the updateFunction still fails - * after all retries, then the transaction will be rejected. - * - * The transaction object passed to the updateFunction contains methods for - * accessing documents and collections. Unlike other datastore access, data - * accessed with the transaction will not reflect local changes that have not - * been committed. For this reason, it is required that all reads are - * performed before any writes. Transactions must be performed while online. - */ function Qu(t, e) { - const n = new j; - return t.asyncQueue.enqueueAndForget((async () => { - const s = await function(t) { - return xu(t).then((t => t.datastore)); - }(t); - new Vu(t.asyncQueue, s, e, n).run(); - })), n.promise; -} - -function ju(t, e, n, s) { - const i = function(t, e) { - let n; - n = "string" == typeof t ? (new TextEncoder).encode(t) : t; - return function(t, e) { - return new bu(t, e); - }(function(t, e) { - if (t instanceof Uint8Array) return Au(t, e); - if (t instanceof ArrayBuffer) return Au(new Uint8Array(t), e); - if (t instanceof ReadableStream) return t.getReader(); - throw new Error("Source of `toByteStreamReader` has to be a ArrayBuffer or ReadableStream"); - }(n), e); - } - /** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ (n, Oo(e)); - t.asyncQueue.enqueueAndForget((async () => { - yu(await Ou(t), i, s); - })); -} - -function Wu(t, e) { - return t.asyncQueue.enqueue((async () => function(t, e) { - const n = K(t); - return n.persistence.runTransaction("Get named query", "readonly", (t => n.fs.getNamedQuery(t, e))); - }(await ku(t), e))); -} - -const zu = new Map; - -/** - * An instance map that ensures only one Datastore exists per Firestore - * instance. - */ -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function Hu(t, e, n) { - if (!n) throw new Q(G.INVALID_ARGUMENT, `Function ${t}() cannot be called with an empty ${e}.`); -} - -/** - * Validates that two boolean options are not set at the same time. - * @internal - */ function Ju(t, e, n, s) { - if (!0 === e && !0 === s) throw new Q(G.INVALID_ARGUMENT, `${t} and ${n} cannot be used together.`); -} - -/** - * Validates that `path` refers to a document (indicated by the fact it contains - * an even numbers of segments). - */ function Yu(t) { - if (!xt.isDocumentKey(t)) throw new Q(G.INVALID_ARGUMENT, `Invalid document reference. Document references must have an even number of segments, but ${t} has ${t.length}.`); -} - -/** - * Validates that `path` refers to a collection (indicated by the fact it - * contains an odd numbers of segments). - */ function Xu(t) { - if (xt.isDocumentKey(t)) throw new Q(G.INVALID_ARGUMENT, `Invalid collection reference. Collection references must have an odd number of segments, but ${t} has ${t.length}.`); -} - -/** - * Returns true if it's a non-null object without a custom prototype - * (i.e. excludes Array, Date, etc.). - */ -/** Returns a string describing the type / value of the provided input. */ -function Zu(t) { - if (void 0 === t) return "undefined"; - if (null === t) return "null"; - if ("string" == typeof t) return t.length > 20 && (t = `${t.substring(0, 20)}...`), - JSON.stringify(t); - if ("number" == typeof t || "boolean" == typeof t) return "" + t; - if ("object" == typeof t) { - if (t instanceof Array) return "an array"; - { - const e = - /** try to get the constructor name for an object. */ - function(t) { - if (t.constructor) return t.constructor.name; - return null; - } - /** - * Casts `obj` to `T`, optionally unwrapping Compat types to expose the - * underlying instance. Throws if `obj` is not an instance of `T`. - * - * This cast is used in the Lite and Full SDK to verify instance types for - * arguments passed to the public API. - * @internal - */ (t); - return e ? `a custom ${e} object` : "an object"; - } - } - return "function" == typeof t ? "a function" : L(); -} - -function tc(t, -// eslint-disable-next-line @typescript-eslint/no-explicit-any -e) { - if ("_delegate" in t && ( - // Unwrap Compat types - // eslint-disable-next-line @typescript-eslint/no-explicit-any - t = t._delegate), !(t instanceof e)) { - if (e.name === t.constructor.name) throw new Q(G.INVALID_ARGUMENT, "Type does not match the expected instance. Did you pass a reference from a different Firestore SDK?"); - { - const n = Zu(t); - throw new Q(G.INVALID_ARGUMENT, `Expected type '${e.name}', but it was: ${n}`); - } - } - return t; -} - -function ec(t, e) { - if (e <= 0) throw new Q(G.INVALID_ARGUMENT, `Function ${t}() requires a positive number, but it was: ${e}.`); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -// settings() defaults: -/** - * A concrete type describing all the values that can be applied via a - * user-supplied `FirestoreSettings` object. This is a separate type so that - * defaults can be supplied and the value can be checked for equality. - */ -class nc { - constructor(t) { - var e; - if (void 0 === t.host) { - if (void 0 !== t.ssl) throw new Q(G.INVALID_ARGUMENT, "Can't provide ssl option if host option is not set"); - this.host = "firestore.googleapis.com", this.ssl = true; - } else this.host = t.host, this.ssl = null === (e = t.ssl) || void 0 === e || e; - if (this.credentials = t.credentials, this.ignoreUndefinedProperties = !!t.ignoreUndefinedProperties, - void 0 === t.cacheSizeBytes) this.cacheSizeBytes = 41943040; else { - if (-1 !== t.cacheSizeBytes && t.cacheSizeBytes < 1048576) throw new Q(G.INVALID_ARGUMENT, "cacheSizeBytes must be at least 1048576"); - this.cacheSizeBytes = t.cacheSizeBytes; - } - this.experimentalForceLongPolling = !!t.experimentalForceLongPolling, this.experimentalAutoDetectLongPolling = !!t.experimentalAutoDetectLongPolling, - this.useFetchStreams = !!t.useFetchStreams, Ju("experimentalForceLongPolling", t.experimentalForceLongPolling, "experimentalAutoDetectLongPolling", t.experimentalAutoDetectLongPolling); - } - isEqual(t) { - return this.host === t.host && this.ssl === t.ssl && this.credentials === t.credentials && this.cacheSizeBytes === t.cacheSizeBytes && this.experimentalForceLongPolling === t.experimentalForceLongPolling && this.experimentalAutoDetectLongPolling === t.experimentalAutoDetectLongPolling && this.ignoreUndefinedProperties === t.ignoreUndefinedProperties && this.useFetchStreams === t.useFetchStreams; - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * The Cloud Firestore service interface. - * - * Do not call this constructor directly. Instead, use {@link getFirestore}. - */ class sc { - /** @hideconstructor */ - constructor(t, e, n) { - this._authCredentials = e, this._appCheckCredentials = n, - /** - * Whether it's a Firestore or Firestore Lite instance. - */ - this.type = "firestore-lite", this._persistenceKey = "(lite)", this._settings = new nc({}), - this._settingsFrozen = !1, t instanceof vt ? this._databaseId = t : (this._app = t, - this._databaseId = function(t) { - if (!Object.prototype.hasOwnProperty.apply(t.options, [ "projectId" ])) throw new Q(G.INVALID_ARGUMENT, '"projectId" not provided in firebase.initializeApp.'); - return new vt(t.options.projectId); - } - /** - * Modify this instance to communicate with the Cloud Firestore emulator. - * - * Note: This must be called before this instance has been used to do any - * operations. - * - * @param firestore - The `Firestore` instance to configure to connect to the - * emulator. - * @param host - the emulator host (ex: localhost). - * @param port - the emulator port (ex: 9000). - * @param options.mockUserToken - the mock auth token to use for unit testing - * Security Rules. - */ (t)); - } - /** - * The {@link @firebase/app#FirebaseApp} associated with this `Firestore` service - * instance. - */ get app() { - if (!this._app) throw new Q(G.FAILED_PRECONDITION, "Firestore was not initialized using the Firebase SDK. 'app' is not available"); - return this._app; - } - get _initialized() { - return this._settingsFrozen; - } - get _terminated() { - return void 0 !== this._terminateTask; - } - _setSettings(t) { - if (this._settingsFrozen) throw new Q(G.FAILED_PRECONDITION, "Firestore has already been started and its settings can no longer be changed. You can only modify settings before calling any other methods on a Firestore object."); - this._settings = new nc(t), void 0 !== t.credentials && (this._authCredentials = function(t) { - if (!t) return new z; - switch (t.type) { - case "gapi": - const e = t.client; - // Make sure this really is a Gapi client. - return q(!("object" != typeof e || null === e || !e.auth || !e.auth.getAuthHeaderValueForFirstParty)), - new X(e, t.sessionIndex || "0", t.iamToken || null); - - case "provider": - return t.client; - - default: - throw new Q(G.INVALID_ARGUMENT, "makeAuthCredentialsProvider failed due to invalid credential type"); - } - }(t.credentials)); - } - _getSettings() { - return this._settings; - } - _freezeSettings() { - return this._settingsFrozen = !0, this._settings; - } - _delete() { - return this._terminateTask || (this._terminateTask = this._terminate()), this._terminateTask; - } - /** Returns a JSON-serializable representation of this `Firestore` instance. */ toJSON() { - return { - app: this._app, - databaseId: this._databaseId, - settings: this._settings - }; - } - /** - * Terminates all components used by this client. Subclasses can override - * this method to clean up their own dependencies, but must also call this - * method. - * - * Only ever called once. - */ _terminate() { - /** - * Removes all components associated with the provided instance. Must be called - * when the `Firestore` instance is terminated. - */ - return function(t) { - const e = zu.get(t); - e && (O("ComponentProvider", "Removing Datastore"), zu.delete(t), e.terminate()); - }(this), Promise.resolve(); - } -} - -function ic(t, e, n, s = {}) { - var i; - const r = (t = tc(t, sc))._getSettings(); - if ("firestore.googleapis.com" !== r.host && r.host !== e && F("Host has been set in both settings() and useEmulator(), emulator host will be used"), - t._setSettings(Object.assign(Object.assign({}, r), { - host: `${e}:${n}`, - ssl: !1 - })), s.mockUserToken) { - let e, n; - if ("string" == typeof s.mockUserToken) e = s.mockUserToken, n = C.MOCK_USER; else { - // Let createMockUserToken validate first (catches common mistakes like - // invalid field "uid" and missing field "sub" / "user_id".) - e = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.createMockUserToken)(s.mockUserToken, null === (i = t._app) || void 0 === i ? void 0 : i.options.projectId); - const r = s.mockUserToken.sub || s.mockUserToken.user_id; - if (!r) throw new Q(G.INVALID_ARGUMENT, "mockUserToken must contain 'sub' or 'user_id' field!"); - n = new C(r); - } - t._authCredentials = new H(new W(e, n)); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A `DocumentReference` refers to a document location in a Firestore database - * and can be used to write, read, or listen to the location. The document at - * the referenced location may or may not exist. - */ class rc { - /** @hideconstructor */ - constructor(t, - /** - * If provided, the `FirestoreDataConverter` associated with this instance. - */ - e, n) { - this.converter = e, this._key = n, - /** The type of this Firestore reference. */ - this.type = "document", this.firestore = t; - } - get _path() { - return this._key.path; - } - /** - * The document's identifier within its collection. - */ get id() { - return this._key.path.lastSegment(); - } - /** - * A string representing the path of the referenced document (relative - * to the root of the database). - */ get path() { - return this._key.path.canonicalString(); - } - /** - * The collection this `DocumentReference` belongs to. - */ get parent() { - return new ac(this.firestore, this.converter, this._key.path.popLast()); - } - withConverter(t) { - return new rc(this.firestore, t, this._key); - } -} - -/** - * A `Query` refers to a query which you can read or listen to. You can also - * construct refined `Query` objects by adding filters and ordering. - */ class oc { - // This is the lite version of the Query class in the main SDK. - /** @hideconstructor protected */ - constructor(t, - /** - * If provided, the `FirestoreDataConverter` associated with this instance. - */ - e, n) { - this.converter = e, this._query = n, - /** The type of this Firestore reference. */ - this.type = "query", this.firestore = t; - } - withConverter(t) { - return new oc(this.firestore, t, this._query); - } -} - -/** - * A `CollectionReference` object can be used for adding documents, getting - * document references, and querying for documents (using {@link query}). - */ class ac extends oc { - /** @hideconstructor */ - constructor(t, e, n) { - super(t, e, De(n)), this._path = n, - /** The type of this Firestore reference. */ - this.type = "collection"; - } - /** The collection's identifier. */ get id() { - return this._query.path.lastSegment(); - } - /** - * A string representing the path of the referenced collection (relative - * to the root of the database). - */ get path() { - return this._query.path.canonicalString(); - } - /** - * A reference to the containing `DocumentReference` if this is a - * subcollection. If this isn't a subcollection, the reference is null. - */ get parent() { - const t = this._path.popLast(); - return t.isEmpty() ? null : new rc(this.firestore, - /* converter= */ null, new xt(t)); - } - withConverter(t) { - return new ac(this.firestore, t, this._path); - } -} - -function uc(t, e, ...n) { - if (t = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(t), Hu("collection", "path", e), t instanceof sc) { - const s = _t.fromString(e, ...n); - return Xu(s), new ac(t, /* converter= */ null, s); - } - { - if (!(t instanceof rc || t instanceof ac)) throw new Q(G.INVALID_ARGUMENT, "Expected first argument to collection() to be a CollectionReference, a DocumentReference or FirebaseFirestore"); - const s = t._path.child(_t.fromString(e, ...n)); - return Xu(s), new ac(t.firestore, - /* converter= */ null, s); - } -} - -// TODO(firestorelite): Consider using ErrorFactory - -// https://github.com/firebase/firebase-js-sdk/blob/0131e1f/packages/util/src/errors.ts#L106 -/** - * Creates and returns a new `Query` instance that includes all documents in the - * database that are contained in a collection or subcollection with the - * given `collectionId`. - * - * @param firestore - A reference to the root `Firestore` instance. - * @param collectionId - Identifies the collections to query over. Every - * collection or subcollection with this ID as the last segment of its path - * will be included. Cannot contain a slash. - * @returns The created `Query`. - */ function cc(t, e) { - if (t = tc(t, sc), Hu("collectionGroup", "collection id", e), e.indexOf("/") >= 0) throw new Q(G.INVALID_ARGUMENT, `Invalid collection ID '${e}' passed to function collectionGroup(). Collection IDs must not contain '/'.`); - return new oc(t, - /* converter= */ null, - /** - * Creates a new Query for a collection group query that matches all documents - * within the provided collection group. - */ - function(t) { - return new ve(_t.emptyPath(), t); - }(e)); -} - -function hc(t, e, ...n) { - if (t = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(t), - // We allow omission of 'pathString' but explicitly prohibit passing in both - // 'undefined' and 'null'. - 1 === arguments.length && (e = it.R()), Hu("doc", "path", e), t instanceof sc) { - const s = _t.fromString(e, ...n); - return Yu(s), new rc(t, - /* converter= */ null, new xt(s)); - } - { - if (!(t instanceof rc || t instanceof ac)) throw new Q(G.INVALID_ARGUMENT, "Expected first argument to collection() to be a CollectionReference, a DocumentReference or FirebaseFirestore"); - const s = t._path.child(_t.fromString(e, ...n)); - return Yu(s), new rc(t.firestore, t instanceof ac ? t.converter : null, new xt(s)); - } -} - -/** - * Returns true if the provided references are equal. - * - * @param left - A reference to compare. - * @param right - A reference to compare. - * @returns true if the references point to the same location in the same - * Firestore database. - */ function lc(t, e) { - return t = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(t), e = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(e), (t instanceof rc || t instanceof ac) && (e instanceof rc || e instanceof ac) && (t.firestore === e.firestore && t.path === e.path && t.converter === e.converter); -} - -/** - * Returns true if the provided queries point to the same collection and apply - * the same constraints. - * - * @param left - A `Query` to compare. - * @param right - A `Query` to compare. - * @returns true if the references point to the same location in the same - * Firestore database. - */ function fc(t, e) { - return t = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(t), e = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(e), t instanceof oc && e instanceof oc && (t.firestore === e.firestore && Be(t._query, e._query) && t.converter === e.converter); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ class dc { - constructor() { - // The last promise in the queue. - this.Du = Promise.resolve(), - // A list of retryable operations. Retryable operations are run in order and - // retried with backoff. - this.Cu = [], - // Is this AsyncQueue being shut down? Once it is set to true, it will not - // be changed again. - this.xu = !1, - // Operations scheduled to be queued in the future. Operations are - // automatically removed after they are run or canceled. - this.Nu = [], - // visible for testing - this.ku = null, - // Flag set while there's an outstanding AsyncQueue operation, used for - // assertion sanity-checks. - this.Mu = !1, - // Enabled during shutdown on Safari to prevent future access to IndexedDB. - this.Ou = !1, - // List of TimerIds to fast-forward delays for. - this.$u = [], - // Backoff timer used to schedule retries for retryable operations - this.vo = new $o(this, "async_queue_retry" /* AsyncQueueRetry */), - // Visibility handler that triggers an immediate retry of all retryable - // operations. Meant to speed up recovery when we regain file system access - // after page comes into foreground. - this.Fu = () => { - const t = Mo(); - t && O("AsyncQueue", "Visibility state changed to " + t.visibilityState), this.vo.To(); - }; - const t = Mo(); - t && "function" == typeof t.addEventListener && t.addEventListener("visibilitychange", this.Fu); - } - get isShuttingDown() { - return this.xu; - } - /** - * Adds a new operation to the queue without waiting for it to complete (i.e. - * we ignore the Promise result). - */ enqueueAndForget(t) { - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.enqueue(t); - } - enqueueAndForgetEvenWhileRestricted(t) { - this.Bu(), - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.Lu(t); - } - enterRestrictedMode(t) { - if (!this.xu) { - this.xu = !0, this.Ou = t || !1; - const e = Mo(); - e && "function" == typeof e.removeEventListener && e.removeEventListener("visibilitychange", this.Fu); - } - } - enqueue(t) { - if (this.Bu(), this.xu) - // Return a Promise which never resolves. - return new Promise((() => {})); - // Create a deferred Promise that we can return to the callee. This - // allows us to return a "hanging Promise" only to the callee and still - // advance the queue even when the operation is not run. - const e = new j; - return this.Lu((() => this.xu && this.Ou ? Promise.resolve() : (t().then(e.resolve, e.reject), - e.promise))).then((() => e.promise)); - } - enqueueRetryable(t) { - this.enqueueAndForget((() => (this.Cu.push(t), this.qu()))); - } - /** - * Runs the next operation from the retryable queue. If the operation fails, - * reschedules with backoff. - */ async qu() { - if (0 !== this.Cu.length) { - try { - await this.Cu[0](), this.Cu.shift(), this.vo.reset(); - } catch (t) { - if (!di(t)) throw t; - // Failure will be handled by AsyncQueue - O("AsyncQueue", "Operation failed with retryable error: " + t); - } - this.Cu.length > 0 && - // If there are additional operations, we re-schedule `retryNextOp()`. - // This is necessary to run retryable operations that failed during - // their initial attempt since we don't know whether they are already - // enqueued. If, for example, `op1`, `op2`, `op3` are enqueued and `op1` - // needs to be re-run, we will run `op1`, `op1`, `op2` using the - // already enqueued calls to `retryNextOp()`. `op3()` will then run in the - // call scheduled here. - // Since `backoffAndRun()` cancels an existing backoff and schedules a - // new backoff on every call, there is only ever a single additional - // operation in the queue. - this.vo.po((() => this.qu())); - } - } - Lu(t) { - const e = this.Du.then((() => (this.Mu = !0, t().catch((t => { - this.ku = t, this.Mu = !1; - const e = - /** - * Chrome includes Error.message in Error.stack. Other browsers do not. - * This returns expected output of message + stack when available. - * @param error - Error or FirestoreError - */ - function(t) { - let e = t.message || ""; - t.stack && (e = t.stack.includes(t.message) ? t.stack : t.message + "\n" + t.stack); - return e; - } - /** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ (t); - // Re-throw the error so that this.tail becomes a rejected Promise and - // all further attempts to chain (via .then) will just short-circuit - // and return the rejected Promise. - throw $("INTERNAL UNHANDLED ERROR: ", e), t; - })).then((t => (this.Mu = !1, t)))))); - return this.Du = e, e; - } - enqueueAfterDelay(t, e, n) { - this.Bu(), - // Fast-forward delays for timerIds that have been overriden. - this.$u.indexOf(t) > -1 && (e = 0); - const s = ya.createAndSchedule(this, t, e, n, (t => this.Uu(t))); - return this.Nu.push(s), s; - } - Bu() { - this.ku && L(); - } - verifyOperationInProgress() {} - /** - * Waits until all currently queued tasks are finished executing. Delayed - * operations are not run. - */ async Ku() { - // Operations in the queue prior to draining may have enqueued additional - // operations. Keep draining the queue until the tail is no longer advanced, - // which indicates that no more new operations were enqueued and that all - // operations were executed. - let t; - do { - t = this.Du, await t; - } while (t !== this.Du); - } - /** - * For Tests: Determine if a delayed operation with a particular TimerId - * exists. - */ Gu(t) { - for (const e of this.Nu) if (e.timerId === t) return !0; - return !1; - } - /** - * For Tests: Runs some or all delayed operations early. - * - * @param lastTimerId - Delayed operations up to and including this TimerId - * will be drained. Pass TimerId.All to run all delayed operations. - * @returns a Promise that resolves once all operations have been run. - */ Qu(t) { - // Note that draining may generate more delayed ops, so we do that first. - return this.Ku().then((() => { - // Run ops in the same order they'd run if they ran naturally. - this.Nu.sort(((t, e) => t.targetTimeMs - e.targetTimeMs)); - for (const e of this.Nu) if (e.skipDelay(), "all" /* All */ !== t && e.timerId === t) break; - return this.Ku(); - })); - } - /** - * For Tests: Skip all subsequent delays for a timer id. - */ ju(t) { - this.$u.push(t); - } - /** Called once a DelayedOperation is run or canceled. */ Uu(t) { - // NOTE: indexOf / slice are O(n), but delayedOperations is expected to be small. - const e = this.Nu.indexOf(t); - this.Nu.splice(e, 1); - } -} - -function _c(t) { - /** - * Returns true if obj is an object and contains at least one of the specified - * methods. - */ - return function(t, e) { - if ("object" != typeof t || null === t) return !1; - const n = t; - for (const t of e) if (t in n && "function" == typeof n[t]) return !0; - return !1; - } - /** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * Represents the task of loading a Firestore bundle. It provides progress of bundle - * loading, as well as task completion and error events. - * - * The API is compatible with `Promise`. - */ (t, [ "next", "error", "complete" ]); -} - -class wc { - constructor() { - this._progressObserver = {}, this._taskCompletionResolver = new j, this._lastProgress = { - taskState: "Running", - totalBytes: 0, - totalDocuments: 0, - bytesLoaded: 0, - documentsLoaded: 0 - }; - } - /** - * Registers functions to listen to bundle loading progress events. - * @param next - Called when there is a progress update from bundle loading. Typically `next` calls occur - * each time a Firestore document is loaded from the bundle. - * @param error - Called when an error occurs during bundle loading. The task aborts after reporting the - * error, and there should be no more updates after this. - * @param complete - Called when the loading task is complete. - */ onProgress(t, e, n) { - this._progressObserver = { - next: t, - error: e, - complete: n - }; - } - /** - * Implements the `Promise.catch` interface. - * - * @param onRejected - Called when an error occurs during bundle loading. - */ catch(t) { - return this._taskCompletionResolver.promise.catch(t); - } - /** - * Implements the `Promise.then` interface. - * - * @param onFulfilled - Called on the completion of the loading task with a final `LoadBundleTaskProgress` update. - * The update will always have its `taskState` set to `"Success"`. - * @param onRejected - Called when an error occurs during bundle loading. - */ then(t, e) { - return this._taskCompletionResolver.promise.then(t, e); - } - /** - * Notifies all observers that bundle loading has completed, with a provided - * `LoadBundleTaskProgress` object. - * - * @private - */ _completeWith(t) { - this._updateProgress(t), this._progressObserver.complete && this._progressObserver.complete(), - this._taskCompletionResolver.resolve(t); - } - /** - * Notifies all observers that bundle loading has failed, with a provided - * `Error` as the reason. - * - * @private - */ _failWith(t) { - this._lastProgress.taskState = "Error", this._progressObserver.next && this._progressObserver.next(this._lastProgress), - this._progressObserver.error && this._progressObserver.error(t), this._taskCompletionResolver.reject(t); - } - /** - * Notifies a progress update of loading a bundle. - * @param progress - The new progress. - * - * @private - */ _updateProgress(t) { - this._lastProgress = t, this._progressObserver.next && this._progressObserver.next(t); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** DOMException error code constants. */ const mc = -1; - -/** - * The Cloud Firestore service interface. - * - * Do not call this constructor directly. Instead, use {@link getFirestore}. - */ -class gc extends sc { - /** @hideconstructor */ - constructor(t, e, n) { - super(t, e, n), - /** - * Whether it's a {@link Firestore} or Firestore Lite instance. - */ - this.type = "firestore", this._queue = new dc, this._persistenceKey = "name" in t ? t.name : "[DEFAULT]"; - } - _terminate() { - return this._firestoreClient || - // The client must be initialized to ensure that all subsequent API - // usage throws an exception. - Tc(this), this._firestoreClient.terminate(); - } -} - -/** - * Initializes a new instance of {@link Firestore} with the provided settings. - * Can only be called before any other function, including - * {@link getFirestore}. If the custom settings are empty, this function is - * equivalent to calling {@link getFirestore}. - * - * @param app - The {@link @firebase/app#FirebaseApp} with which the {@link Firestore} instance will - * be associated. - * @param settings - A settings object to configure the {@link Firestore} instance. - * @returns A newly initialized {@link Firestore} instance. - */ function yc(t, e) { - const n = (0,_firebase_app__WEBPACK_IMPORTED_MODULE_0__._getProvider)(t, "firestore"); - if (n.isInitialized()) { - const t = n.getImmediate(), s = n.getOptions(); - if ((0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.deepEqual)(s, e)) return t; - throw new Q(G.FAILED_PRECONDITION, "initializeFirestore() has already been called with different options. To avoid this error, call initializeFirestore() with the same options as when it was originally called, or call getFirestore() to return the already initialized instance."); - } - if (void 0 !== e.cacheSizeBytes && -1 !== e.cacheSizeBytes && e.cacheSizeBytes < 1048576) throw new Q(G.INVALID_ARGUMENT, "cacheSizeBytes must be at least 1048576"); - return n.initialize({ - options: e - }); -} - -/** - * Returns the existing {@link Firestore} instance that is associated with the - * provided {@link @firebase/app#FirebaseApp}. If no instance exists, initializes a new - * instance with default settings. - * - * @param app - The {@link @firebase/app#FirebaseApp} instance that the returned {@link Firestore} - * instance is associated with. - * @returns The {@link Firestore} instance of the provided app. - */ function pc(e = (0,_firebase_app__WEBPACK_IMPORTED_MODULE_0__.getApp)()) { - return (0,_firebase_app__WEBPACK_IMPORTED_MODULE_0__._getProvider)(e, "firestore").getImmediate(); -} - -/** - * @internal - */ function Ic(t) { - return t._firestoreClient || Tc(t), t._firestoreClient.verifyNotTerminated(), t._firestoreClient; -} - -function Tc(t) { - var e; - const n = t._freezeSettings(), s = function(t, e, n, s) { - return new Vt(t, e, n, s.host, s.ssl, s.experimentalForceLongPolling, s.experimentalAutoDetectLongPolling, s.useFetchStreams); - }(t._databaseId, (null === (e = t._app) || void 0 === e ? void 0 : e.options.appId) || "", t._persistenceKey, n); - t._firestoreClient = new vu(t._authCredentials, t._appCheckCredentials, t._queue, s); -} - -/** - * Attempts to enable persistent storage, if possible. - * - * Must be called before any other functions (other than - * {@link initializeFirestore}, {@link getFirestore} or - * {@link clearIndexedDbPersistence}. - * - * If this fails, `enableIndexedDbPersistence()` will reject the promise it - * returns. Note that even after this failure, the {@link Firestore} instance will - * remain usable, however offline persistence will be disabled. - * - * There are several reasons why this can fail, which can be identified by - * the `code` on the error. - * - * * failed-precondition: The app is already open in another browser tab. - * * unimplemented: The browser is incompatible with the offline - * persistence implementation. - * - * @param firestore - The {@link Firestore} instance to enable persistence for. - * @param persistenceSettings - Optional settings object to configure - * persistence. - * @returns A `Promise` that represents successfully enabling persistent storage. - */ function Ec(t, e) { - xc(t = tc(t, gc)); - const n = Ic(t), s = t._freezeSettings(), i = new Eu; - return Rc(n, i, new Iu(i, s.cacheSizeBytes, null == e ? void 0 : e.forceOwnership)); -} - -/** - * Attempts to enable multi-tab persistent storage, if possible. If enabled - * across all tabs, all operations share access to local persistence, including - * shared execution of queries and latency-compensated local document updates - * across all connected instances. - * - * If this fails, `enableMultiTabIndexedDbPersistence()` will reject the promise - * it returns. Note that even after this failure, the {@link Firestore} instance will - * remain usable, however offline persistence will be disabled. - * - * There are several reasons why this can fail, which can be identified by - * the `code` on the error. - * - * * failed-precondition: The app is already open in another browser tab and - * multi-tab is not enabled. - * * unimplemented: The browser is incompatible with the offline - * persistence implementation. - * - * @param firestore - The {@link Firestore} instance to enable persistence for. - * @returns A `Promise` that represents successfully enabling persistent - * storage. - */ function Ac(t) { - xc(t = tc(t, gc)); - const e = Ic(t), n = t._freezeSettings(), s = new Eu; - return Rc(e, s, new Tu(s, n.cacheSizeBytes)); -} - -/** - * Registers both the `OfflineComponentProvider` and `OnlineComponentProvider`. - * If the operation fails with a recoverable error (see - * `canRecoverFromIndexedDbError()` below), the returned Promise is rejected - * but the client remains usable. - */ function Rc(t, e, n) { - const s = new j; - return t.asyncQueue.enqueue((async () => { - try { - await Su(t, n), await Du(t, e), s.resolve(); - } catch (t) { - if (! - /** - * Decides whether the provided error allows us to gracefully disable - * persistence (as opposed to crashing the client). - */ - function(t) { - if ("FirebaseError" === t.name) return t.code === G.FAILED_PRECONDITION || t.code === G.UNIMPLEMENTED; - if ("undefined" != typeof DOMException && t instanceof DOMException) - // There are a few known circumstances where we can open IndexedDb but - // trying to read/write will fail (e.g. quota exceeded). For - // well-understood cases, we attempt to detect these and then gracefully - // fall back to memory persistence. - // NOTE: Rather than continue to add to this list, we could decide to - // always fall back, with the risk that we might accidentally hide errors - // representing actual SDK bugs. - // When the browser is out of quota we could get either quota exceeded - // or an aborted error depending on whether the error happened during - // schema migration. - return 22 === t.code || 20 === t.code || - // Firefox Private Browsing mode disables IndexedDb and returns - // INVALID_STATE for any usage. - 11 === t.code; - return !0; - } - /** - * Clears the persistent storage. This includes pending writes and cached - * documents. - * - * Must be called while the {@link Firestore} instance is not started (after the app is - * terminated or when the app is first initialized). On startup, this function - * must be called before other functions (other than {@link - * initializeFirestore} or {@link getFirestore})). If the {@link Firestore} - * instance is still running, the promise will be rejected with the error code - * of `failed-precondition`. - * - * Note: `clearIndexedDbPersistence()` is primarily intended to help write - * reliable tests that use Cloud Firestore. It uses an efficient mechanism for - * dropping existing data but does not attempt to securely overwrite or - * otherwise make cached data unrecoverable. For applications that are sensitive - * to the disclosure of cached data in between user sessions, we strongly - * recommend not enabling persistence at all. - * - * @param firestore - The {@link Firestore} instance to clear persistence for. - * @returns A `Promise` that is resolved when the persistent storage is - * cleared. Otherwise, the promise is rejected with an error. - */ (t)) throw t; - console.warn("Error enabling offline persistence. Falling back to persistence disabled: " + t), - s.reject(t); - } - })).then((() => s.promise)); -} - -function bc(t) { - if (t._initialized && !t._terminated) throw new Q(G.FAILED_PRECONDITION, "Persistence can only be cleared before a Firestore instance is initialized or after it is terminated."); - const e = new j; - return t._queue.enqueueAndForgetEvenWhileRestricted((async () => { - try { - await async function(t) { - if (!hi.vt()) return Promise.resolve(); - const e = t + "main"; - await hi.delete(e); - }(Lr(t._databaseId, t._persistenceKey)), e.resolve(); - } catch (t) { - e.reject(t); - } - })), e.promise; -} - -/** - * Waits until all currently pending writes for the active user have been - * acknowledged by the backend. - * - * The returned promise resolves immediately if there are no outstanding writes. - * Otherwise, the promise waits for all previously issued writes (including - * those written in a previous app session), but it does not wait for writes - * that were added after the function is called. If you want to wait for - * additional writes, call `waitForPendingWrites()` again. - * - * Any outstanding `waitForPendingWrites()` promises are rejected during user - * changes. - * - * @returns A `Promise` which resolves when all currently pending writes have been - * acknowledged by the backend. - */ function Pc(t) { - return function(t) { - const e = new j; - return t.asyncQueue.enqueueAndForget((async () => Ja(await Ou(t), e))), e.promise; - }(Ic(t = tc(t, gc))); -} - -/** - * Re-enables use of the network for this {@link Firestore} instance after a prior - * call to {@link disableNetwork}. - * - * @returns A `Promise` that is resolved once the network has been enabled. - */ function Vc(t) { - return Fu(Ic(t = tc(t, gc))); -} - -/** - * Disables network usage for this instance. It can be re-enabled via {@link - * enableNetwork}. While the network is disabled, any snapshot listeners, - * `getDoc()` or `getDocs()` calls will return results from cache, and any write - * operations will be queued until the network is restored. - * - * @returns A `Promise` that is resolved once the network has been disabled. - */ function vc(t) { - return Bu(Ic(t = tc(t, gc))); -} - -/** - * Terminates the provided {@link Firestore} instance. - * - * After calling `terminate()` only the `clearIndexedDbPersistence()` function - * may be used. Any other function will throw a `FirestoreError`. - * - * To restart after termination, create a new instance of FirebaseFirestore with - * {@link getFirestore}. - * - * Termination does not cancel any pending writes, and any promises that are - * awaiting a response from the server will not be resolved. If you have - * persistence enabled, the next time you start this instance, it will resume - * sending these writes to the server. - * - * Note: Under normal circumstances, calling `terminate()` is not required. This - * function is useful only when you want to force this instance to release all - * of its resources or in combination with `clearIndexedDbPersistence()` to - * ensure that all local state is destroyed between test runs. - * - * @returns A `Promise` that is resolved when the instance has been successfully - * terminated. - */ function Sc(t) { - return (0,_firebase_app__WEBPACK_IMPORTED_MODULE_0__._removeServiceInstance)(t.app, "firestore"), t._delete(); -} - -/** - * Loads a Firestore bundle into the local cache. - * - * @param firestore - The {@link Firestore} instance to load bundles for. - * @param bundleData - An object representing the bundle to be loaded. Valid - * objects are `ArrayBuffer`, `ReadableStream` or `string`. - * - * @returns A `LoadBundleTask` object, which notifies callers with progress - * updates, and completion or error events. It can be used as a - * `Promise`. - */ function Dc(t, e) { - const n = Ic(t = tc(t, gc)), s = new wc; - return ju(n, t._databaseId, e, s), s; -} - -/** - * Reads a Firestore {@link Query} from local cache, identified by the given - * name. - * - * The named queries are packaged into bundles on the server side (along - * with resulting documents), and loaded to local cache using `loadBundle`. Once - * in local cache, use this method to extract a {@link Query} by name. - * - * @param firestore - The {@link Firestore} instance to read the query from. - * @param name - The name of the query. - * @returns A `Promise` that is resolved with the Query or `null`. - */ function Cc(t, e) { - return Wu(Ic(t = tc(t, gc)), e).then((e => e ? new oc(t, null, e.query) : null)); -} - -function xc(t) { - if (t._initialized || t._terminated) throw new Q(G.FAILED_PRECONDITION, "Firestore has already been started and persistence can no longer be enabled. You can only enable persistence before calling any other methods on a Firestore object."); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A `FieldPath` refers to a field in a document. The path may consist of a - * single field name (referring to a top-level field in the document), or a - * list of field names (referring to a nested field in the document). - * - * Create a `FieldPath` by providing field names. If more than one field - * name is provided, the path will point to a nested field in a document. - */ -class Nc { - /** - * Creates a `FieldPath` from the provided field names. If more than one field - * name is provided, the path will point to a nested field in a document. - * - * @param fieldNames - A list of field names. - */ - constructor(...t) { - for (let e = 0; e < t.length; ++e) if (0 === t[e].length) throw new Q(G.INVALID_ARGUMENT, "Invalid field name at argument $(i + 1). Field names must not be empty."); - this._internalPath = new mt(t); - } - /** - * Returns true if this `FieldPath` is equal to the provided one. - * - * @param other - The `FieldPath` to compare against. - * @returns true if this `FieldPath` is equal to the provided one. - */ isEqual(t) { - return this._internalPath.isEqual(t._internalPath); - } -} - -/** - * Returns a special sentinel `FieldPath` to refer to the ID of a document. - * It can be used in queries to sort or filter by the document ID. - */ function kc() { - return new Nc("__name__"); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * An immutable object representing an array of bytes. - */ class Mc { - /** @hideconstructor */ - constructor(t) { - this._byteString = t; - } - /** - * Creates a new `Bytes` object from the given Base64 string, converting it to - * bytes. - * - * @param base64 - The Base64 string used to create the `Bytes` object. - */ static fromBase64String(t) { - try { - return new Mc(pt.fromBase64String(t)); - } catch (t) { - throw new Q(G.INVALID_ARGUMENT, "Failed to construct data from Base64 string: " + t); - } - } - /** - * Creates a new `Bytes` object from the given Uint8Array. - * - * @param array - The Uint8Array used to create the `Bytes` object. - */ static fromUint8Array(t) { - return new Mc(pt.fromUint8Array(t)); - } - /** - * Returns the underlying bytes as a Base64-encoded string. - * - * @returns The Base64-encoded string created from the `Bytes` object. - */ toBase64() { - return this._byteString.toBase64(); - } - /** - * Returns the underlying bytes in a new `Uint8Array`. - * - * @returns The Uint8Array created from the `Bytes` object. - */ toUint8Array() { - return this._byteString.toUint8Array(); - } - /** - * Returns a string representation of the `Bytes` object. - * - * @returns A string representation of the `Bytes` object. - */ toString() { - return "Bytes(base64: " + this.toBase64() + ")"; - } - /** - * Returns true if this `Bytes` object is equal to the provided one. - * - * @param other - The `Bytes` object to compare against. - * @returns true if this `Bytes` object is equal to the provided one. - */ isEqual(t) { - return this._byteString.isEqual(t._byteString); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Sentinel values that can be used when writing document fields with `set()` - * or `update()`. - */ class Oc { - /** - * @param _methodName - The public API endpoint that returns this class. - * @hideconstructor - */ - constructor(t) { - this._methodName = t; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * An immutable object representing a geographic location in Firestore. The - * location is represented as latitude/longitude pair. - * - * Latitude values are in the range of [-90, 90]. - * Longitude values are in the range of [-180, 180]. - */ class $c { - /** - * Creates a new immutable `GeoPoint` object with the provided latitude and - * longitude values. - * @param latitude - The latitude as number between -90 and 90. - * @param longitude - The longitude as number between -180 and 180. - */ - constructor(t, e) { - if (!isFinite(t) || t < -90 || t > 90) throw new Q(G.INVALID_ARGUMENT, "Latitude must be a number between -90 and 90, but was: " + t); - if (!isFinite(e) || e < -180 || e > 180) throw new Q(G.INVALID_ARGUMENT, "Longitude must be a number between -180 and 180, but was: " + e); - this._lat = t, this._long = e; - } - /** - * The latitude of this `GeoPoint` instance. - */ get latitude() { - return this._lat; - } - /** - * The longitude of this `GeoPoint` instance. - */ get longitude() { - return this._long; - } - /** - * Returns true if this `GeoPoint` is equal to the provided one. - * - * @param other - The `GeoPoint` to compare against. - * @returns true if this `GeoPoint` is equal to the provided one. - */ isEqual(t) { - return this._lat === t._lat && this._long === t._long; - } - /** Returns a JSON-serializable representation of this GeoPoint. */ toJSON() { - return { - latitude: this._lat, - longitude: this._long - }; - } - /** - * Actually private to JS consumers of our API, so this function is prefixed - * with an underscore. - */ _compareTo(t) { - return rt(this._lat, t._lat) || rt(this._long, t._long); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ const Fc = /^__.*__$/; - -/** The result of parsing document data (e.g. for a setData call). */ class Bc { - constructor(t, e, n) { - this.data = t, this.fieldMask = e, this.fieldTransforms = n; - } - toMutation(t, e) { - return null !== this.fieldMask ? new pn(t, this.data, this.fieldMask, e, this.fieldTransforms) : new yn(t, this.data, e, this.fieldTransforms); - } -} - -/** The result of parsing "update" data (i.e. for an updateData call). */ class Lc { - constructor(t, - // The fieldMask does not include document transforms. - e, n) { - this.data = t, this.fieldMask = e, this.fieldTransforms = n; - } - toMutation(t, e) { - return new pn(t, this.data, this.fieldMask, e, this.fieldTransforms); - } -} - -function qc(t) { - switch (t) { - case 0 /* Set */ : - // fall through - case 2 /* MergeSet */ : - // fall through - case 1 /* Update */ : - return !0; - - case 3 /* Argument */ : - case 4 /* ArrayArgument */ : - return !1; - - default: - throw L(); - } -} - -/** A "context" object passed around while parsing user data. */ class Uc { - /** - * Initializes a ParseContext with the given source and path. - * - * @param settings - The settings for the parser. - * @param databaseId - The database ID of the Firestore instance. - * @param serializer - The serializer to use to generate the Value proto. - * @param ignoreUndefinedProperties - Whether to ignore undefined properties - * rather than throw. - * @param fieldTransforms - A mutable list of field transforms encountered - * while parsing the data. - * @param fieldMask - A mutable list of field paths encountered while parsing - * the data. - * - * TODO(b/34871131): We don't support array paths right now, so path can be - * null to indicate the context represents any location within an array (in - * which case certain features will not work and errors will be somewhat - * compromised). - */ - constructor(t, e, n, s, i, r) { - this.settings = t, this.databaseId = e, this.M = n, this.ignoreUndefinedProperties = s, - // Minor hack: If fieldTransforms is undefined, we assume this is an - // external call and we need to validate the entire path. - void 0 === i && this.Wu(), this.fieldTransforms = i || [], this.fieldMask = r || []; - } - get path() { - return this.settings.path; - } - get zu() { - return this.settings.zu; - } - /** Returns a new context with the specified settings overwritten. */ Hu(t) { - return new Uc(Object.assign(Object.assign({}, this.settings), t), this.databaseId, this.M, this.ignoreUndefinedProperties, this.fieldTransforms, this.fieldMask); - } - Ju(t) { - var e; - const n = null === (e = this.path) || void 0 === e ? void 0 : e.child(t), s = this.Hu({ - path: n, - Yu: !1 - }); - return s.Xu(t), s; - } - Zu(t) { - var e; - const n = null === (e = this.path) || void 0 === e ? void 0 : e.child(t), s = this.Hu({ - path: n, - Yu: !1 - }); - return s.Wu(), s; - } - tc(t) { - // TODO(b/34871131): We don't support array paths right now; so make path - // undefined. - return this.Hu({ - path: void 0, - Yu: !0 - }); - } - ec(t) { - return uh(t, this.settings.methodName, this.settings.nc || !1, this.path, this.settings.sc); - } - /** Returns 'true' if 'fieldPath' was traversed when creating this context. */ contains(t) { - return void 0 !== this.fieldMask.find((e => t.isPrefixOf(e))) || void 0 !== this.fieldTransforms.find((e => t.isPrefixOf(e.field))); - } - Wu() { - // TODO(b/34871131): Remove null check once we have proper paths for fields - // within arrays. - if (this.path) for (let t = 0; t < this.path.length; t++) this.Xu(this.path.get(t)); - } - Xu(t) { - if (0 === t.length) throw this.ec("Document fields must not be empty"); - if (qc(this.zu) && Fc.test(t)) throw this.ec('Document fields cannot begin and end with "__"'); - } -} - -/** - * Helper for parsing raw user input (provided via the API) into internal model - * classes. - */ class Kc { - constructor(t, e, n) { - this.databaseId = t, this.ignoreUndefinedProperties = e, this.M = n || Oo(t); - } - /** Creates a new top-level parse context. */ ic(t, e, n, s = !1) { - return new Uc({ - zu: t, - methodName: e, - sc: n, - path: mt.emptyPath(), - Yu: !1, - nc: s - }, this.databaseId, this.M, this.ignoreUndefinedProperties); - } -} - -function Gc(t) { - const e = t._freezeSettings(), n = Oo(t._databaseId); - return new Kc(t._databaseId, !!e.ignoreUndefinedProperties, n); -} - -/** Parse document data from a set() call. */ function Qc(t, e, n, s, i, r = {}) { - const o = t.ic(r.merge || r.mergeFields ? 2 /* MergeSet */ : 0 /* Set */ , e, n, i); - ih("Data must be an object, but it was:", o, s); - const a = nh(s, o); - let u, c; - if (r.merge) u = new gt(o.fieldMask), c = o.fieldTransforms; else if (r.mergeFields) { - const t = []; - for (const s of r.mergeFields) { - const i = rh(e, s, n); - if (!o.contains(i)) throw new Q(G.INVALID_ARGUMENT, `Field '${i}' is specified in your field mask but missing from your input data.`); - ch(t, i) || t.push(i); - } - u = new gt(t), c = o.fieldTransforms.filter((t => u.covers(t.field))); - } else u = null, c = o.fieldTransforms; - return new Bc(new Xt(a), u, c); -} - -class jc extends Oc { - _toFieldTransform(t) { - if (2 /* MergeSet */ !== t.zu) throw 1 /* Update */ === t.zu ? t.ec(`${this._methodName}() can only appear at the top level of your update data`) : t.ec(`${this._methodName}() cannot be used with set() unless you pass {merge:true}`); - // No transform to add for a delete, but we need to add it to our - // fieldMask so it gets deleted. - return t.fieldMask.push(t.path), null; - } - isEqual(t) { - return t instanceof jc; - } -} - -/** - * Creates a child context for parsing SerializableFieldValues. - * - * This is different than calling `ParseContext.contextWith` because it keeps - * the fieldTransforms and fieldMask separate. - * - * The created context has its `dataSource` set to `UserDataSource.Argument`. - * Although these values are used with writes, any elements in these FieldValues - * are not considered writes since they cannot contain any FieldValue sentinels, - * etc. - * - * @param fieldValue - The sentinel FieldValue for which to create a child - * context. - * @param context - The parent context. - * @param arrayElement - Whether or not the FieldValue has an array. - */ function Wc(t, e, n) { - return new Uc({ - zu: 3 /* Argument */ , - sc: e.settings.sc, - methodName: t._methodName, - Yu: n - }, e.databaseId, e.M, e.ignoreUndefinedProperties); -} - -class zc extends Oc { - _toFieldTransform(t) { - return new an(t.path, new Xe); - } - isEqual(t) { - return t instanceof zc; - } -} - -class Hc extends Oc { - constructor(t, e) { - super(t), this.rc = e; - } - _toFieldTransform(t) { - const e = Wc(this, t, - /*array=*/ !0), n = this.rc.map((t => eh(t, e))), s = new Ze(n); - return new an(t.path, s); - } - isEqual(t) { - // TODO(mrschmidt): Implement isEquals - return this === t; - } -} - -class Jc extends Oc { - constructor(t, e) { - super(t), this.rc = e; - } - _toFieldTransform(t) { - const e = Wc(this, t, - /*array=*/ !0), n = this.rc.map((t => eh(t, e))), s = new en(n); - return new an(t.path, s); - } - isEqual(t) { - // TODO(mrschmidt): Implement isEquals - return this === t; - } -} - -class Yc extends Oc { - constructor(t, e) { - super(t), this.oc = e; - } - _toFieldTransform(t) { - const e = new sn(t.M, We(t.M, this.oc)); - return new an(t.path, e); - } - isEqual(t) { - // TODO(mrschmidt): Implement isEquals - return this === t; - } -} - -/** Parse update data from an update() call. */ function Xc(t, e, n, s) { - const i = t.ic(1 /* Update */ , e, n); - ih("Data must be an object, but it was:", i, s); - const r = [], o = Xt.empty(); - lt(s, ((t, s) => { - const a = ah(e, t, n); - // For Compat types, we have to "extract" the underlying types before - // performing validation. - s = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(s); - const u = i.Zu(a); - if (s instanceof jc) - // Add it to the field mask, but don't add anything to updateData. - r.push(a); else { - const t = eh(s, u); - null != t && (r.push(a), o.set(a, t)); - } - })); - const a = new gt(r); - return new Lc(o, a, i.fieldTransforms); -} - -/** Parse update data from a list of field/value arguments. */ function Zc(t, e, n, s, i, r) { - const o = t.ic(1 /* Update */ , e, n), a = [ rh(e, s, n) ], u = [ i ]; - if (r.length % 2 != 0) throw new Q(G.INVALID_ARGUMENT, `Function ${e}() needs to be called with an even number of arguments that alternate between field names and values.`); - for (let t = 0; t < r.length; t += 2) a.push(rh(e, r[t])), u.push(r[t + 1]); - const c = [], h = Xt.empty(); - // We iterate in reverse order to pick the last value for a field if the - // user specified the field multiple times. - for (let t = a.length - 1; t >= 0; --t) if (!ch(c, a[t])) { - const e = a[t]; - let n = u[t]; - // For Compat types, we have to "extract" the underlying types before - // performing validation. - n = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(n); - const s = o.Zu(e); - if (n instanceof jc) - // Add it to the field mask, but don't add anything to updateData. - c.push(e); else { - const t = eh(n, s); - null != t && (c.push(e), h.set(e, t)); - } - } - const l = new gt(c); - return new Lc(h, l, o.fieldTransforms); -} - -/** - * Parse a "query value" (e.g. value in a where filter or a value in a cursor - * bound). - * - * @param allowArrays - Whether the query value is an array that may directly - * contain additional arrays (e.g. the operand of an `in` query). - */ function th(t, e, n, s = !1) { - return eh(n, t.ic(s ? 4 /* ArrayArgument */ : 3 /* Argument */ , e)); -} - -/** - * Parses user data to Protobuf Values. - * - * @param input - Data to be parsed. - * @param context - A context object representing the current path being parsed, - * the source of the data being parsed, etc. - * @returns The parsed value, or null if the value was a FieldValue sentinel - * that should not be included in the resulting parsed data. - */ function eh(t, e) { - if (sh( - // Unwrap the API type from the Compat SDK. This will return the API type - // from firestore-exp. - t = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(t))) return ih("Unsupported field value:", e, t), nh(t, e); - if (t instanceof Oc) - // FieldValues usually parse into transforms (except deleteField()) - // in which case we do not want to include this field in our parsed data - // (as doing so will overwrite the field directly prior to the transform - // trying to transform it). So we don't add this location to - // context.fieldMask and we return null as our parsing result. - /** - * "Parses" the provided FieldValueImpl, adding any necessary transforms to - * context.fieldTransforms. - */ - return function(t, e) { - // Sentinels are only supported with writes, and not within arrays. - if (!qc(e.zu)) throw e.ec(`${t._methodName}() can only be used with update() and set()`); - if (!e.path) throw e.ec(`${t._methodName}() is not currently supported inside arrays`); - const n = t._toFieldTransform(e); - n && e.fieldTransforms.push(n); - } - /** - * Helper to parse a scalar value (i.e. not an Object, Array, or FieldValue) - * - * @returns The parsed value - */ (t, e), null; - if (void 0 === t && e.ignoreUndefinedProperties) - // If the input is undefined it can never participate in the fieldMask, so - // don't handle this below. If `ignoreUndefinedProperties` is false, - // `parseScalarValue` will reject an undefined value. - return null; - if ( - // If context.path is null we are inside an array and we don't support - // field mask paths more granular than the top-level array. - e.path && e.fieldMask.push(e.path), t instanceof Array) { - // TODO(b/34871131): Include the path containing the array in the error - // message. - // In the case of IN queries, the parsed data is an array (representing - // the set of values to be included for the IN query) that may directly - // contain additional arrays (each representing an individual field - // value), so we disable this validation. - if (e.settings.Yu && 4 /* ArrayArgument */ !== e.zu) throw e.ec("Nested arrays are not supported"); - return function(t, e) { - const n = []; - let s = 0; - for (const i of t) { - let t = eh(i, e.tc(s)); - null == t && ( - // Just include nulls in the array for fields being replaced with a - // sentinel. - t = { - nullValue: "NULL_VALUE" - }), n.push(t), s++; - } - return { - arrayValue: { - values: n - } - }; - }(t, e); - } - return function(t, e) { - if (null === (t = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(t))) return { - nullValue: "NULL_VALUE" - }; - if ("number" == typeof t) return We(e.M, t); - if ("boolean" == typeof t) return { - booleanValue: t - }; - if ("string" == typeof t) return { - stringValue: t - }; - if (t instanceof Date) { - const n = ut.fromDate(t); - return { - timestampValue: rs(e.M, n) - }; - } - if (t instanceof ut) { - // Firestore backend truncates precision down to microseconds. To ensure - // offline mode works the same with regards to truncation, perform the - // truncation immediately without waiting for the backend to do that. - const n = new ut(t.seconds, 1e3 * Math.floor(t.nanoseconds / 1e3)); - return { - timestampValue: rs(e.M, n) - }; - } - if (t instanceof $c) return { - geoPointValue: { - latitude: t.latitude, - longitude: t.longitude - } - }; - if (t instanceof Mc) return { - bytesValue: os(e.M, t._byteString) - }; - if (t instanceof rc) { - const n = e.databaseId, s = t.firestore._databaseId; - if (!s.isEqual(n)) throw e.ec(`Document reference is for database ${s.projectId}/${s.database} but should be for database ${n.projectId}/${n.database}`); - return { - referenceValue: cs(t.firestore._databaseId || e.databaseId, t._key.path) - }; - } - throw e.ec(`Unsupported field value: ${Zu(t)}`); - } - /** - * Checks whether an object looks like a JSON object that should be converted - * into a struct. Normal class/prototype instances are considered to look like - * JSON objects since they should be converted to a struct value. Arrays, Dates, - * GeoPoints, etc. are not considered to look like JSON objects since they map - * to specific FieldValue types other than ObjectValue. - */ (t, e); -} - -function nh(t, e) { - const n = {}; - return ft(t) ? - // If we encounter an empty object, we explicitly add it to the update - // mask to ensure that the server creates a map entry. - e.path && e.path.length > 0 && e.fieldMask.push(e.path) : lt(t, ((t, s) => { - const i = eh(s, e.Ju(t)); - null != i && (n[t] = i); - })), { - mapValue: { - fields: n - } - }; -} - -function sh(t) { - return !("object" != typeof t || null === t || t instanceof Array || t instanceof Date || t instanceof ut || t instanceof $c || t instanceof Mc || t instanceof rc || t instanceof Oc); -} - -function ih(t, e, n) { - if (!sh(n) || !function(t) { - return "object" == typeof t && null !== t && (Object.getPrototypeOf(t) === Object.prototype || null === Object.getPrototypeOf(t)); - }(n)) { - const s = Zu(n); - throw "an object" === s ? e.ec(t + " a custom object") : e.ec(t + " " + s); - } -} - -/** - * Helper that calls fromDotSeparatedString() but wraps any error thrown. - */ function rh(t, e, n) { - if (( - // If required, replace the FieldPath Compat class with with the firestore-exp - // FieldPath. - e = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(e)) instanceof Nc) return e._internalPath; - if ("string" == typeof e) return ah(t, e); - throw uh("Field path arguments must be of type string or ", t, - /* hasConverter= */ !1, - /* path= */ void 0, n); -} - -/** - * Matches any characters in a field path string that are reserved. - */ const oh = new RegExp("[~\\*/\\[\\]]"); - -/** - * Wraps fromDotSeparatedString with an error message about the method that - * was thrown. - * @param methodName - The publicly visible method name - * @param path - The dot-separated string form of a field path which will be - * split on dots. - * @param targetDoc - The document against which the field path will be - * evaluated. - */ function ah(t, e, n) { - if (e.search(oh) >= 0) throw uh(`Invalid field path (${e}). Paths must not contain '~', '*', '/', '[', or ']'`, t, - /* hasConverter= */ !1, - /* path= */ void 0, n); - try { - return new Nc(...e.split("."))._internalPath; - } catch (s) { - throw uh(`Invalid field path (${e}). Paths must not be empty, begin with '.', end with '.', or contain '..'`, t, - /* hasConverter= */ !1, - /* path= */ void 0, n); - } -} - -function uh(t, e, n, s, i) { - const r = s && !s.isEmpty(), o = void 0 !== i; - let a = `Function ${e}() called with invalid data`; - n && (a += " (via `toFirestore()`)"), a += ". "; - let u = ""; - return (r || o) && (u += " (found", r && (u += ` in field ${s}`), o && (u += ` in document ${i}`), - u += ")"), new Q(G.INVALID_ARGUMENT, a + t + u); -} - -/** Checks `haystack` if FieldPath `needle` is present. Runs in O(n). */ function ch(t, e) { - return t.some((t => t.isEqual(e))); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A `DocumentSnapshot` contains data read from a document in your Firestore - * database. The data can be extracted with `.data()` or `.get()` to - * get a specific field. - * - * For a `DocumentSnapshot` that points to a non-existing document, any data - * access will return 'undefined'. You can use the `exists()` method to - * explicitly verify a document's existence. - */ class hh { - // Note: This class is stripped down version of the DocumentSnapshot in - // the legacy SDK. The changes are: - // - No support for SnapshotMetadata. - // - No support for SnapshotOptions. - /** @hideconstructor protected */ - constructor(t, e, n, s, i) { - this._firestore = t, this._userDataWriter = e, this._key = n, this._document = s, - this._converter = i; - } - /** Property of the `DocumentSnapshot` that provides the document's ID. */ get id() { - return this._key.path.lastSegment(); - } - /** - * The `DocumentReference` for the document included in the `DocumentSnapshot`. - */ get ref() { - return new rc(this._firestore, this._converter, this._key); - } - /** - * Signals whether or not the document at the snapshot's location exists. - * - * @returns true if the document exists. - */ exists() { - return null !== this._document; - } - /** - * Retrieves all fields in the document as an `Object`. Returns `undefined` if - * the document doesn't exist. - * - * @returns An `Object` containing all fields in the document or `undefined` - * if the document doesn't exist. - */ data() { - if (this._document) { - if (this._converter) { - // We only want to use the converter and create a new DocumentSnapshot - // if a converter has been provided. - const t = new lh(this._firestore, this._userDataWriter, this._key, this._document, - /* converter= */ null); - return this._converter.fromFirestore(t); - } - return this._userDataWriter.convertValue(this._document.data.value); - } - } - /** - * Retrieves the field specified by `fieldPath`. Returns `undefined` if the - * document or field doesn't exist. - * - * @param fieldPath - The path (for example 'foo' or 'foo.bar') to a specific - * field. - * @returns The data at the specified field location or undefined if no such - * field exists in the document. - */ - // We are using `any` here to avoid an explicit cast by our users. - // eslint-disable-next-line @typescript-eslint/no-explicit-any - get(t) { - if (this._document) { - const e = this._document.data.field(fh("DocumentSnapshot.get", t)); - if (null !== e) return this._userDataWriter.convertValue(e); - } - } -} - -/** - * A `QueryDocumentSnapshot` contains data read from a document in your - * Firestore database as part of a query. The document is guaranteed to exist - * and its data can be extracted with `.data()` or `.get()` to get a - * specific field. - * - * A `QueryDocumentSnapshot` offers the same API surface as a - * `DocumentSnapshot`. Since query results contain only existing documents, the - * `exists` property will always be true and `data()` will never return - * 'undefined'. - */ class lh extends hh { - /** - * Retrieves all fields in the document as an `Object`. - * - * @override - * @returns An `Object` containing all fields in the document. - */ - data() { - return super.data(); - } -} - -/** - * Helper that calls `fromDotSeparatedString()` but wraps any error thrown. - */ function fh(t, e) { - return "string" == typeof e ? ah(t, e) : e instanceof Nc ? e._internalPath : e._delegate._internalPath; -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Metadata about a snapshot, describing the state of the snapshot. - */ class dh { - /** @hideconstructor */ - constructor(t, e) { - this.hasPendingWrites = t, this.fromCache = e; - } - /** - * Returns true if this `SnapshotMetadata` is equal to the provided one. - * - * @param other - The `SnapshotMetadata` to compare against. - * @returns true if this `SnapshotMetadata` is equal to the provided one. - */ isEqual(t) { - return this.hasPendingWrites === t.hasPendingWrites && this.fromCache === t.fromCache; - } -} - -/** - * A `DocumentSnapshot` contains data read from a document in your Firestore - * database. The data can be extracted with `.data()` or `.get()` to - * get a specific field. - * - * For a `DocumentSnapshot` that points to a non-existing document, any data - * access will return 'undefined'. You can use the `exists()` method to - * explicitly verify a document's existence. - */ class _h extends hh { - /** @hideconstructor protected */ - constructor(t, e, n, s, i, r) { - super(t, e, n, s, r), this._firestore = t, this._firestoreImpl = t, this.metadata = i; - } - /** - * Returns whether or not the data exists. True if the document exists. - */ exists() { - return super.exists(); - } - /** - * Retrieves all fields in the document as an `Object`. Returns `undefined` if - * the document doesn't exist. - * - * By default, `serverTimestamp()` values that have not yet been - * set to their final value will be returned as `null`. You can override - * this by passing an options object. - * - * @param options - An options object to configure how data is retrieved from - * the snapshot (for example the desired behavior for server timestamps that - * have not yet been set to their final value). - * @returns An `Object` containing all fields in the document or `undefined` if - * the document doesn't exist. - */ data(t = {}) { - if (this._document) { - if (this._converter) { - // We only want to use the converter and create a new DocumentSnapshot - // if a converter has been provided. - const e = new wh(this._firestore, this._userDataWriter, this._key, this._document, this.metadata, - /* converter= */ null); - return this._converter.fromFirestore(e, t); - } - return this._userDataWriter.convertValue(this._document.data.value, t.serverTimestamps); - } - } - /** - * Retrieves the field specified by `fieldPath`. Returns `undefined` if the - * document or field doesn't exist. - * - * By default, a `serverTimestamp()` that has not yet been set to - * its final value will be returned as `null`. You can override this by - * passing an options object. - * - * @param fieldPath - The path (for example 'foo' or 'foo.bar') to a specific - * field. - * @param options - An options object to configure how the field is retrieved - * from the snapshot (for example the desired behavior for server timestamps - * that have not yet been set to their final value). - * @returns The data at the specified field location or undefined if no such - * field exists in the document. - */ - // We are using `any` here to avoid an explicit cast by our users. - // eslint-disable-next-line @typescript-eslint/no-explicit-any - get(t, e = {}) { - if (this._document) { - const n = this._document.data.field(fh("DocumentSnapshot.get", t)); - if (null !== n) return this._userDataWriter.convertValue(n, e.serverTimestamps); - } - } -} - -/** - * A `QueryDocumentSnapshot` contains data read from a document in your - * Firestore database as part of a query. The document is guaranteed to exist - * and its data can be extracted with `.data()` or `.get()` to get a - * specific field. - * - * A `QueryDocumentSnapshot` offers the same API surface as a - * `DocumentSnapshot`. Since query results contain only existing documents, the - * `exists` property will always be true and `data()` will never return - * 'undefined'. - */ class wh extends _h { - /** - * Retrieves all fields in the document as an `Object`. - * - * By default, `serverTimestamp()` values that have not yet been - * set to their final value will be returned as `null`. You can override - * this by passing an options object. - * - * @override - * @param options - An options object to configure how data is retrieved from - * the snapshot (for example the desired behavior for server timestamps that - * have not yet been set to their final value). - * @returns An `Object` containing all fields in the document. - */ - data(t = {}) { - return super.data(t); - } -} - -/** - * A `QuerySnapshot` contains zero or more `DocumentSnapshot` objects - * representing the results of a query. The documents can be accessed as an - * array via the `docs` property or enumerated using the `forEach` method. The - * number of documents can be determined via the `empty` and `size` - * properties. - */ class mh { - /** @hideconstructor */ - constructor(t, e, n, s) { - this._firestore = t, this._userDataWriter = e, this._snapshot = s, this.metadata = new dh(s.hasPendingWrites, s.fromCache), - this.query = n; - } - /** An array of all the documents in the `QuerySnapshot`. */ get docs() { - const t = []; - return this.forEach((e => t.push(e))), t; - } - /** The number of documents in the `QuerySnapshot`. */ get size() { - return this._snapshot.docs.size; - } - /** True if there are no documents in the `QuerySnapshot`. */ get empty() { - return 0 === this.size; - } - /** - * Enumerates all of the documents in the `QuerySnapshot`. - * - * @param callback - A callback to be called with a `QueryDocumentSnapshot` for - * each document in the snapshot. - * @param thisArg - The `this` binding for the callback. - */ forEach(t, e) { - this._snapshot.docs.forEach((n => { - t.call(e, new wh(this._firestore, this._userDataWriter, n.key, n, new dh(this._snapshot.mutatedKeys.has(n.key), this._snapshot.fromCache), this.query.converter)); - })); - } - /** - * Returns an array of the documents changes since the last snapshot. If this - * is the first snapshot, all documents will be in the list as 'added' - * changes. - * - * @param options - `SnapshotListenOptions` that control whether metadata-only - * changes (i.e. only `DocumentSnapshot.metadata` changed) should trigger - * snapshot events. - */ docChanges(t = {}) { - const e = !!t.includeMetadataChanges; - if (e && this._snapshot.excludesMetadataChanges) throw new Q(G.INVALID_ARGUMENT, "To include metadata changes with your document changes, you must also pass { includeMetadataChanges:true } to onSnapshot()."); - return this._cachedChanges && this._cachedChangesIncludeMetadataChanges === e || (this._cachedChanges = - /** Calculates the array of `DocumentChange`s for a given `ViewSnapshot`. */ - function(t, e) { - if (t._snapshot.oldDocs.isEmpty()) { - let e = 0; - return t._snapshot.docChanges.map((n => ({ - type: "added", - doc: new wh(t._firestore, t._userDataWriter, n.doc.key, n.doc, new dh(t._snapshot.mutatedKeys.has(n.doc.key), t._snapshot.fromCache), t.query.converter), - oldIndex: -1, - newIndex: e++ - }))); - } - { - // A `DocumentSet` that is updated incrementally as changes are applied to use - // to lookup the index of a document. - let n = t._snapshot.oldDocs; - return t._snapshot.docChanges.filter((t => e || 3 /* Metadata */ !== t.type)).map((e => { - const s = new wh(t._firestore, t._userDataWriter, e.doc.key, e.doc, new dh(t._snapshot.mutatedKeys.has(e.doc.key), t._snapshot.fromCache), t.query.converter); - let i = -1, r = -1; - return 0 /* Added */ !== e.type && (i = n.indexOf(e.doc.key), n = n.delete(e.doc.key)), - 1 /* Removed */ !== e.type && (n = n.add(e.doc), r = n.indexOf(e.doc.key)), { - type: gh(e.type), - doc: s, - oldIndex: i, - newIndex: r - }; - })); - } - }(this, e), this._cachedChangesIncludeMetadataChanges = e), this._cachedChanges; - } -} - -function gh(t) { - switch (t) { - case 0 /* Added */ : - return "added"; - - case 2 /* Modified */ : - case 3 /* Metadata */ : - return "modified"; - - case 1 /* Removed */ : - return "removed"; - - default: - return L(); - } -} - -// TODO(firestoreexp): Add tests for snapshotEqual with different snapshot -// metadata -/** - * Returns true if the provided snapshots are equal. - * - * @param left - A snapshot to compare. - * @param right - A snapshot to compare. - * @returns true if the snapshots are equal. - */ function yh(t, e) { - return t instanceof _h && e instanceof _h ? t._firestore === e._firestore && t._key.isEqual(e._key) && (null === t._document ? null === e._document : t._document.isEqual(e._document)) && t._converter === e._converter : t instanceof mh && e instanceof mh && (t._firestore === e._firestore && fc(t.query, e.query) && t.metadata.isEqual(e.metadata) && t._snapshot.isEqual(e._snapshot)); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ function ph(t) { - if (xe(t) && 0 === t.explicitOrderBy.length) throw new Q(G.UNIMPLEMENTED, "limitToLast() queries require specifying at least one orderBy() clause"); -} - -/** - * A `QueryConstraint` is used to narrow the set of documents returned by a - * Firestore query. `QueryConstraint`s are created by invoking {@link where}, - * {@link orderBy}, {@link (startAt:1)}, {@link (startAfter:1)}, {@link - * endBefore:1}, {@link (endAt:1)}, {@link limit} or {@link limitToLast} and - * can then be passed to {@link query} to create a new query instance that - * also contains this `QueryConstraint`. - */ class Ih {} - -/** - * Creates a new immutable instance of {@link Query} that is extended to also include - * additional query constraints. - * - * @param query - The {@link Query} instance to use as a base for the new constraints. - * @param queryConstraints - The list of {@link QueryConstraint}s to apply. - * @throws if any of the provided query constraints cannot be combined with the - * existing or new constraints. - */ function Th(t, ...e) { - for (const n of e) t = n._apply(t); - return t; -} - -class Eh extends Ih { - constructor(t, e, n) { - super(), this.ac = t, this.uc = e, this.cc = n, this.type = "where"; - } - _apply(t) { - const e = Gc(t.firestore), n = function(t, e, n, s, i, r, o) { - let a; - if (i.isKeyField()) { - if ("array-contains" /* ARRAY_CONTAINS */ === r || "array-contains-any" /* ARRAY_CONTAINS_ANY */ === r) throw new Q(G.INVALID_ARGUMENT, `Invalid Query. You can't perform '${r}' queries on documentId().`); - if ("in" /* IN */ === r || "not-in" /* NOT_IN */ === r) { - $h(o, r); - const e = []; - for (const n of o) e.push(Oh(s, t, n)); - a = { - arrayValue: { - values: e - } - }; - } else a = Oh(s, t, o); - } else "in" /* IN */ !== r && "not-in" /* NOT_IN */ !== r && "array-contains-any" /* ARRAY_CONTAINS_ANY */ !== r || $h(o, r), - a = th(n, e, o, - /* allowArrays= */ "in" /* IN */ === r || "not-in" /* NOT_IN */ === r); - const u = _e.create(i, r, a); - return function(t, e) { - if (e.S()) { - const n = ke(t); - if (null !== n && !n.isEqual(e.field)) throw new Q(G.INVALID_ARGUMENT, `Invalid query. All where filters with an inequality (<, <=, !=, not-in, >, or >=) must be on the same field. But you have inequality filters on '${n.toString()}' and '${e.field.toString()}'`); - const s = Ne(t); - null !== s && Fh(t, e.field, s); - } - const n = function(t, e) { - for (const n of t.filters) if (e.indexOf(n.op) >= 0) return n.op; - return null; - }(t, - /** - * Given an operator, returns the set of operators that cannot be used with it. - * - * Operators in a query must adhere to the following set of rules: - * 1. Only one array operator is allowed. - * 2. Only one disjunctive operator is allowed. - * 3. `NOT_EQUAL` cannot be used with another `NOT_EQUAL` operator. - * 4. `NOT_IN` cannot be used with array, disjunctive, or `NOT_EQUAL` operators. - * - * Array operators: `ARRAY_CONTAINS`, `ARRAY_CONTAINS_ANY` - * Disjunctive operators: `IN`, `ARRAY_CONTAINS_ANY`, `NOT_IN` - */ - function(t) { - switch (t) { - case "!=" /* NOT_EQUAL */ : - return [ "!=" /* NOT_EQUAL */ , "not-in" /* NOT_IN */ ]; - - case "array-contains" /* ARRAY_CONTAINS */ : - return [ "array-contains" /* ARRAY_CONTAINS */ , "array-contains-any" /* ARRAY_CONTAINS_ANY */ , "not-in" /* NOT_IN */ ]; - - case "in" /* IN */ : - return [ "array-contains-any" /* ARRAY_CONTAINS_ANY */ , "in" /* IN */ , "not-in" /* NOT_IN */ ]; - - case "array-contains-any" /* ARRAY_CONTAINS_ANY */ : - return [ "array-contains" /* ARRAY_CONTAINS */ , "array-contains-any" /* ARRAY_CONTAINS_ANY */ , "in" /* IN */ , "not-in" /* NOT_IN */ ]; - - case "not-in" /* NOT_IN */ : - return [ "array-contains" /* ARRAY_CONTAINS */ , "array-contains-any" /* ARRAY_CONTAINS_ANY */ , "in" /* IN */ , "not-in" /* NOT_IN */ , "!=" /* NOT_EQUAL */ ]; - - default: - return []; - } - }(e.op)); - if (null !== n) - // Special case when it's a duplicate op to give a slightly clearer error message. - throw n === e.op ? new Q(G.INVALID_ARGUMENT, `Invalid query. You cannot use more than one '${e.op.toString()}' filter.`) : new Q(G.INVALID_ARGUMENT, `Invalid query. You cannot use '${e.op.toString()}' filters with '${n.toString()}' filters.`); - }(t, u), u; - }(t._query, "where", e, t.firestore._databaseId, this.ac, this.uc, this.cc); - return new oc(t.firestore, t.converter, function(t, e) { - const n = t.filters.concat([ e ]); - return new ve(t.path, t.collectionGroup, t.explicitOrderBy.slice(), n, t.limit, t.limitType, t.startAt, t.endAt); - }(t._query, n)); - } -} - -/** - * Creates a {@link QueryConstraint} that enforces that documents must contain the - * specified field and that the value should satisfy the relation constraint - * provided. - * - * @param fieldPath - The path to compare - * @param opStr - The operation string (e.g "<", "<=", "==", "<", - * "<=", "!="). - * @param value - The value for comparison - * @returns The created {@link Query}. - */ function Ah(t, e, n) { - const s = e, i = fh("where", t); - return new Eh(i, s, n); -} - -class Rh extends Ih { - constructor(t, e) { - super(), this.ac = t, this.hc = e, this.type = "orderBy"; - } - _apply(t) { - const e = function(t, e, n) { - if (null !== t.startAt) throw new Q(G.INVALID_ARGUMENT, "Invalid query. You must not call startAt() or startAfter() before calling orderBy()."); - if (null !== t.endAt) throw new Q(G.INVALID_ARGUMENT, "Invalid query. You must not call endAt() or endBefore() before calling orderBy()."); - const s = new Re(e, n); - return function(t, e) { - if (null === Ne(t)) { - // This is the first order by. It must match any inequality. - const n = ke(t); - null !== n && Fh(t, n, e.field); - } - }(t, s), s; - } - /** - * Create a `Bound` from a query and a document. - * - * Note that the `Bound` will always include the key of the document - * and so only the provided document will compare equal to the returned - * position. - * - * Will throw if the document does not contain all fields of the order by - * of the query or if any of the fields in the order by are an uncommitted - * server timestamp. - */ (t._query, this.ac, this.hc); - return new oc(t.firestore, t.converter, function(t, e) { - // TODO(dimond): validate that orderBy does not list the same key twice. - const n = t.explicitOrderBy.concat([ e ]); - return new ve(t.path, t.collectionGroup, n, t.filters.slice(), t.limit, t.limitType, t.startAt, t.endAt); - }(t._query, e)); - } -} - -/** - * Creates a {@link QueryConstraint} that sorts the query result by the - * specified field, optionally in descending order instead of ascending. - * - * @param fieldPath - The field to sort by. - * @param directionStr - Optional direction to sort by ('asc' or 'desc'). If - * not specified, order will be ascending. - * @returns The created {@link Query}. - */ function bh(t, e = "asc") { - const n = e, s = fh("orderBy", t); - return new Rh(s, n); -} - -class Ph extends Ih { - constructor(t, e, n) { - super(), this.type = t, this.lc = e, this.fc = n; - } - _apply(t) { - return new oc(t.firestore, t.converter, Fe(t._query, this.lc, this.fc)); - } -} - -/** - * Creates a {@link QueryConstraint} that only returns the first matching documents. - * - * @param limit - The maximum number of items to return. - * @returns The created {@link Query}. - */ function Vh(t) { - return ec("limit", t), new Ph("limit", t, "F" /* First */); -} - -/** - * Creates a {@link QueryConstraint} that only returns the last matching documents. - * - * You must specify at least one `orderBy` clause for `limitToLast` queries, - * otherwise an exception will be thrown during execution. - * - * @param limit - The maximum number of items to return. - * @returns The created {@link Query}. - */ function vh(t) { - return ec("limitToLast", t), new Ph("limitToLast", t, "L" /* Last */); -} - -class Sh extends Ih { - constructor(t, e, n) { - super(), this.type = t, this.dc = e, this._c = n; - } - _apply(t) { - const e = Mh(t, this.type, this.dc, this._c); - return new oc(t.firestore, t.converter, function(t, e) { - return new ve(t.path, t.collectionGroup, t.explicitOrderBy.slice(), t.filters.slice(), t.limit, t.limitType, e, t.endAt); - }(t._query, e)); - } -} - -function Dh(...t) { - return new Sh("startAt", t, - /*inclusive=*/ !0); -} - -function Ch(...t) { - return new Sh("startAfter", t, - /*inclusive=*/ !1); -} - -class xh extends Ih { - constructor(t, e, n) { - super(), this.type = t, this.dc = e, this._c = n; - } - _apply(t) { - const e = Mh(t, this.type, this.dc, this._c); - return new oc(t.firestore, t.converter, function(t, e) { - return new ve(t.path, t.collectionGroup, t.explicitOrderBy.slice(), t.filters.slice(), t.limit, t.limitType, t.startAt, e); - }(t._query, e)); - } -} - -function Nh(...t) { - return new xh("endBefore", t, - /*inclusive=*/ !1); -} - -function kh(...t) { - return new xh("endAt", t, /*inclusive=*/ !0); -} - -/** Helper function to create a bound from a document or fields */ function Mh(t, e, n, s) { - if (n[0] = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(n[0]), n[0] instanceof hh) return function(t, e, n, s, i) { - if (!s) throw new Q(G.NOT_FOUND, `Can't use a DocumentSnapshot that doesn't exist for ${n}().`); - const r = []; - // Because people expect to continue/end a query at the exact document - // provided, we need to use the implicit sort order rather than the explicit - // sort order, because it's guaranteed to contain the document key. That way - // the position becomes unambiguous and the query continues/ends exactly at - // the provided document. Without the key (by using the explicit sort - // orders), multiple documents could match the position, yielding duplicate - // results. - for (const n of Oe(t)) if (n.field.isKeyField()) r.push(Ut(e, s.key)); else { - const t = s.data.field(n.field); - if (Rt(t)) throw new Q(G.INVALID_ARGUMENT, 'Invalid query. You are trying to start or end a query using a document for which the field "' + n.field + '" is an uncommitted server timestamp. (Since the value of this field is unknown, you cannot start/end a query with it.)'); - if (null === t) { - const t = n.field.canonicalString(); - throw new Q(G.INVALID_ARGUMENT, `Invalid query. You are trying to start or end a query using a document for which the field '${t}' (used as the orderBy) does not exist.`); - } - r.push(t); - } - return new Ae(r, i); - } - /** - * Converts a list of field values to a `Bound` for the given query. - */ (t._query, t.firestore._databaseId, e, n[0]._document, s); - { - const i = Gc(t.firestore); - return function(t, e, n, s, i, r) { - // Use explicit order by's because it has to match the query the user made - const o = t.explicitOrderBy; - if (i.length > o.length) throw new Q(G.INVALID_ARGUMENT, `Too many arguments provided to ${s}(). The number of arguments must be less than or equal to the number of orderBy() clauses`); - const a = []; - for (let r = 0; r < i.length; r++) { - const u = i[r]; - if (o[r].field.isKeyField()) { - if ("string" != typeof u) throw new Q(G.INVALID_ARGUMENT, `Invalid query. Expected a string for document ID in ${s}(), but got a ${typeof u}`); - if (!Me(t) && -1 !== u.indexOf("/")) throw new Q(G.INVALID_ARGUMENT, `Invalid query. When querying a collection and ordering by documentId(), the value passed to ${s}() must be a plain document ID, but '${u}' contains a slash.`); - const n = t.path.child(_t.fromString(u)); - if (!xt.isDocumentKey(n)) throw new Q(G.INVALID_ARGUMENT, `Invalid query. When querying a collection group and ordering by documentId(), the value passed to ${s}() must result in a valid document path, but '${n}' is not because it contains an odd number of segments.`); - const i = new xt(n); - a.push(Ut(e, i)); - } else { - const t = th(n, s, u); - a.push(t); - } - } - return new Ae(a, r); - } - /** - * Parses the given `documentIdValue` into a `ReferenceValue`, throwing - * appropriate errors if the value is anything other than a `DocumentReference` - * or `string`, or if the string is malformed. - */ (t._query, t.firestore._databaseId, i, e, n, s); - } -} - -function Oh(t, e, n) { - if ("string" == typeof (n = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(n))) { - if ("" === n) throw new Q(G.INVALID_ARGUMENT, "Invalid query. When querying with documentId(), you must provide a valid document ID, but it was an empty string."); - if (!Me(e) && -1 !== n.indexOf("/")) throw new Q(G.INVALID_ARGUMENT, `Invalid query. When querying a collection by documentId(), you must provide a plain document ID, but '${n}' contains a '/' character.`); - const s = e.path.child(_t.fromString(n)); - if (!xt.isDocumentKey(s)) throw new Q(G.INVALID_ARGUMENT, `Invalid query. When querying a collection group by documentId(), the value provided must result in a valid document path, but '${s}' is not because it has an odd number of segments (${s.length}).`); - return Ut(t, new xt(s)); - } - if (n instanceof rc) return Ut(t, n._key); - throw new Q(G.INVALID_ARGUMENT, `Invalid query. When querying with documentId(), you must provide a valid string or a DocumentReference, but it was: ${Zu(n)}.`); -} - -/** - * Validates that the value passed into a disjunctive filter satisfies all - * array requirements. - */ function $h(t, e) { - if (!Array.isArray(t) || 0 === t.length) throw new Q(G.INVALID_ARGUMENT, `Invalid Query. A non-empty array is required for '${e.toString()}' filters.`); - if (t.length > 10) throw new Q(G.INVALID_ARGUMENT, `Invalid Query. '${e.toString()}' filters support a maximum of 10 elements in the value array.`); -} - -function Fh(t, e, n) { - if (!n.isEqual(e)) throw new Q(G.INVALID_ARGUMENT, `Invalid query. You have a where filter with an inequality (<, <=, !=, not-in, >, or >=) on field '${e.toString()}' and so you must also use '${e.toString()}' as your first argument to orderBy(), but your first orderBy() is on field '${n.toString()}' instead.`); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Converts Firestore's internal types to the JavaScript types that we expose - * to the user. - * - * @internal - */ class Bh { - convertValue(t, e = "none") { - switch (Mt(t)) { - case 0 /* NullValue */ : - return null; - - case 1 /* BooleanValue */ : - return t.booleanValue; - - case 2 /* NumberValue */ : - return Et(t.integerValue || t.doubleValue); - - case 3 /* TimestampValue */ : - return this.convertTimestamp(t.timestampValue); - - case 4 /* ServerTimestampValue */ : - return this.convertServerTimestamp(t, e); - - case 5 /* StringValue */ : - return t.stringValue; - - case 6 /* BlobValue */ : - return this.convertBytes(At(t.bytesValue)); - - case 7 /* RefValue */ : - return this.convertReference(t.referenceValue); - - case 8 /* GeoPointValue */ : - return this.convertGeoPoint(t.geoPointValue); - - case 9 /* ArrayValue */ : - return this.convertArray(t.arrayValue, e); - - case 10 /* ObjectValue */ : - return this.convertObject(t.mapValue, e); - - default: - throw L(); - } - } - convertObject(t, e) { - const n = {}; - return lt(t.fields, ((t, s) => { - n[t] = this.convertValue(s, e); - })), n; - } - convertGeoPoint(t) { - return new $c(Et(t.latitude), Et(t.longitude)); - } - convertArray(t, e) { - return (t.values || []).map((t => this.convertValue(t, e))); - } - convertServerTimestamp(t, e) { - switch (e) { - case "previous": - const n = bt(t); - return null == n ? null : this.convertValue(n, e); - - case "estimate": - return this.convertTimestamp(Pt(t)); - - default: - return null; - } - } - convertTimestamp(t) { - const e = Tt(t); - return new ut(e.seconds, e.nanos); - } - convertDocumentKey(t, e) { - const n = _t.fromString(t); - q(Os(n)); - const s = new vt(n.get(1), n.get(3)), i = new xt(n.popFirst(5)); - return s.isEqual(e) || - // TODO(b/64130202): Somehow support foreign references. - $(`Document ${i} contains a document reference within a different database (${s.projectId}/${s.database}) which is not supported. It will be treated as a reference in the current database (${e.projectId}/${e.database}) instead.`), - i; - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Converts custom model object of type T into `DocumentData` by applying the - * converter if it exists. - * - * This function is used when converting user objects to `DocumentData` - * because we want to provide the user with a more specific error message if - * their `set()` or fails due to invalid data originating from a `toFirestore()` - * call. - */ function Lh(t, e, n) { - let s; - // Cast to `any` in order to satisfy the union type constraint on - // toFirestore(). - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return s = t ? n && (n.merge || n.mergeFields) ? t.toFirestore(e, n) : t.toFirestore(e) : e, - s; -} - -class qh extends Bh { - constructor(t) { - super(), this.firestore = t; - } - convertBytes(t) { - return new Mc(t); - } - convertReference(t) { - const e = this.convertDocumentKey(t, this.firestore._databaseId); - return new rc(this.firestore, /* converter= */ null, e); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A write batch, used to perform multiple writes as a single atomic unit. - * - * A `WriteBatch` object can be acquired by calling {@link writeBatch}. It - * provides methods for adding writes to the write batch. None of the writes - * will be committed (or visible locally) until {@link WriteBatch.commit} is - * called. - */ class Uh { - /** @hideconstructor */ - constructor(t, e) { - this._firestore = t, this._commitHandler = e, this._mutations = [], this._committed = !1, - this._dataReader = Gc(t); - } - set(t, e, n) { - this._verifyNotCommitted(); - const s = Kh(t, this._firestore), i = Lh(s.converter, e, n), r = Qc(this._dataReader, "WriteBatch.set", s._key, i, null !== s.converter, n); - return this._mutations.push(r.toMutation(s._key, hn.none())), this; - } - update(t, e, n, ...s) { - this._verifyNotCommitted(); - const i = Kh(t, this._firestore); - // For Compat types, we have to "extract" the underlying types before - // performing validation. - let r; - return r = "string" == typeof (e = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(e)) || e instanceof Nc ? Zc(this._dataReader, "WriteBatch.update", i._key, e, n, s) : Xc(this._dataReader, "WriteBatch.update", i._key, e), - this._mutations.push(r.toMutation(i._key, hn.exists(!0))), this; - } - /** - * Deletes the document referred to by the provided {@link DocumentReference}. - * - * @param documentRef - A reference to the document to be deleted. - * @returns This `WriteBatch` instance. Used for chaining method calls. - */ delete(t) { - this._verifyNotCommitted(); - const e = Kh(t, this._firestore); - return this._mutations = this._mutations.concat(new An(e._key, hn.none())), this; - } - /** - * Commits all of the writes in this write batch as a single atomic unit. - * - * The result of these writes will only be reflected in document reads that - * occur after the returned promise resolves. If the client is offline, the - * write fails. If you would like to see local modifications or buffer writes - * until the client is online, use the full Firestore SDK. - * - * @returns A `Promise` resolved once all of the writes in the batch have been - * successfully written to the backend as an atomic unit (note that it won't - * resolve while you're offline). - */ commit() { - return this._verifyNotCommitted(), this._committed = !0, this._mutations.length > 0 ? this._commitHandler(this._mutations) : Promise.resolve(); - } - _verifyNotCommitted() { - if (this._committed) throw new Q(G.FAILED_PRECONDITION, "A write batch can no longer be used after commit() has been called."); - } -} - -function Kh(t, e) { - if ((t = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(t)).firestore !== e) throw new Q(G.INVALID_ARGUMENT, "Provided document reference is from a different Firestore instance."); - return t; -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -// TODO(mrschmidt) Consider using `BaseTransaction` as the base class in the -// legacy SDK. -/** - * A reference to a transaction. - * - * The `Transaction` object passed to a transaction's `updateFunction` provides - * the methods to read and write data within the transaction context. See - * {@link runTransaction}. - */ -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Reads the document referred to by this `DocumentReference`. - * - * Note: `getDoc()` attempts to provide up-to-date data when possible by waiting - * for data from the server, but it may return cached data or fail if you are - * offline and the server cannot be reached. To specify this behavior, invoke - * {@link getDocFromCache} or {@link getDocFromServer}. - * - * @param reference - The reference of the document to fetch. - * @returns A Promise resolved with a `DocumentSnapshot` containing the - * current document contents. - */ -function Gh(t) { - t = tc(t, rc); - const e = tc(t.firestore, gc); - return qu(Ic(e), t._key).then((n => il(e, t, n))); -} - -class Qh extends Bh { - constructor(t) { - super(), this.firestore = t; - } - convertBytes(t) { - return new Mc(t); - } - convertReference(t) { - const e = this.convertDocumentKey(t, this.firestore._databaseId); - return new rc(this.firestore, /* converter= */ null, e); - } -} - -/** - * Reads the document referred to by this `DocumentReference` from cache. - * Returns an error if the document is not currently cached. - * - * @returns A `Promise` resolved with a `DocumentSnapshot` containing the - * current document contents. - */ function jh(t) { - t = tc(t, rc); - const e = tc(t.firestore, gc), n = Ic(e), s = new Qh(e); - return Lu(n, t._key).then((n => new _h(e, s, t._key, n, new dh(null !== n && n.hasLocalMutations, - /* fromCache= */ !0), t.converter))); -} - -/** - * Reads the document referred to by this `DocumentReference` from the server. - * Returns an error if the network is not available. - * - * @returns A `Promise` resolved with a `DocumentSnapshot` containing the - * current document contents. - */ function Wh(t) { - t = tc(t, rc); - const e = tc(t.firestore, gc); - return qu(Ic(e), t._key, { - source: "server" - }).then((n => il(e, t, n))); -} - -/** - * Executes the query and returns the results as a `QuerySnapshot`. - * - * Note: `getDocs()` attempts to provide up-to-date data when possible by - * waiting for data from the server, but it may return cached data or fail if - * you are offline and the server cannot be reached. To specify this behavior, - * invoke {@link getDocsFromCache} or {@link getDocsFromServer}. - * - * @returns A `Promise` that will be resolved with the results of the query. - */ function zh(t) { - t = tc(t, oc); - const e = tc(t.firestore, gc), n = Ic(e), s = new Qh(e); - return ph(t._query), Ku(n, t._query).then((n => new mh(e, s, t, n))); -} - -/** - * Executes the query and returns the results as a `QuerySnapshot` from cache. - * Returns an error if the document is not currently cached. - * - * @returns A `Promise` that will be resolved with the results of the query. - */ function Hh(t) { - t = tc(t, oc); - const e = tc(t.firestore, gc), n = Ic(e), s = new Qh(e); - return Uu(n, t._query).then((n => new mh(e, s, t, n))); -} - -/** - * Executes the query and returns the results as a `QuerySnapshot` from the - * server. Returns an error if the network is not available. - * - * @returns A `Promise` that will be resolved with the results of the query. - */ function Jh(t) { - t = tc(t, oc); - const e = tc(t.firestore, gc), n = Ic(e), s = new Qh(e); - return Ku(n, t._query, { - source: "server" - }).then((n => new mh(e, s, t, n))); -} - -function Yh(t, e, n) { - t = tc(t, rc); - const s = tc(t.firestore, gc), i = Lh(t.converter, e, n); - return sl(s, [ Qc(Gc(s), "setDoc", t._key, i, null !== t.converter, n).toMutation(t._key, hn.none()) ]); -} - -function Xh(t, e, n, ...s) { - t = tc(t, rc); - const i = tc(t.firestore, gc), r = Gc(i); - let o; - o = "string" == typeof ( - // For Compat types, we have to "extract" the underlying types before - // performing validation. - e = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(e)) || e instanceof Nc ? Zc(r, "updateDoc", t._key, e, n, s) : Xc(r, "updateDoc", t._key, e); - return sl(i, [ o.toMutation(t._key, hn.exists(!0)) ]); -} - -/** - * Deletes the document referred to by the specified `DocumentReference`. - * - * @param reference - A reference to the document to delete. - * @returns A Promise resolved once the document has been successfully - * deleted from the backend (note that it won't resolve while you're offline). - */ function Zh(t) { - return sl(tc(t.firestore, gc), [ new An(t._key, hn.none()) ]); -} - -/** - * Add a new document to specified `CollectionReference` with the given data, - * assigning it a document ID automatically. - * - * @param reference - A reference to the collection to add this document to. - * @param data - An Object containing the data for the new document. - * @returns A `Promise` resolved with a `DocumentReference` pointing to the - * newly created document after it has been written to the backend (Note that it - * won't resolve while you're offline). - */ function tl(t, e) { - const n = tc(t.firestore, gc), s = hc(t), i = Lh(t.converter, e); - return sl(n, [ Qc(Gc(t.firestore), "addDoc", s._key, i, null !== t.converter, {}).toMutation(s._key, hn.exists(!1)) ]).then((() => s)); -} - -function el(t, ...e) { - var n, s, i; - t = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(t); - let r = { - includeMetadataChanges: !1 - }, o = 0; - "object" != typeof e[o] || _c(e[o]) || (r = e[o], o++); - const a = { - includeMetadataChanges: r.includeMetadataChanges - }; - if (_c(e[o])) { - const t = e[o]; - e[o] = null === (n = t.next) || void 0 === n ? void 0 : n.bind(t), e[o + 1] = null === (s = t.error) || void 0 === s ? void 0 : s.bind(t), - e[o + 2] = null === (i = t.complete) || void 0 === i ? void 0 : i.bind(t); - } - let u, c, h; - if (t instanceof rc) c = tc(t.firestore, gc), h = De(t._key.path), u = { - next: n => { - e[o] && e[o](il(c, t, n)); - }, - error: e[o + 1], - complete: e[o + 2] - }; else { - const n = tc(t, oc); - c = tc(n.firestore, gc), h = n._query; - const s = new Qh(c); - u = { - next: t => { - e[o] && e[o](new mh(c, s, n, t)); - }, - error: e[o + 1], - complete: e[o + 2] - }, ph(t._query); - } - return function(t, e, n, s) { - const i = new Ru(s), r = new Da(e, i, n); - return t.asyncQueue.enqueueAndForget((async () => ba(await $u(t), r))), () => { - i.mu(), t.asyncQueue.enqueueAndForget((async () => Pa(await $u(t), r))); - }; - }(Ic(c), h, a, u); -} - -function nl(t, e) { - return Gu(Ic(t = tc(t, gc)), _c(e) ? e : { - next: e - }); -} - -/** - * Locally writes `mutations` on the async queue. - * @internal - */ function sl(t, e) { - return function(t, e) { - const n = new j; - return t.asyncQueue.enqueueAndForget((async () => Ga(await Ou(t), e, n))), n.promise; - }(Ic(t), e); -} - -/** - * Converts a {@link ViewSnapshot} that contains the single document specified by `ref` - * to a {@link DocumentSnapshot}. - */ function il(t, e, n) { - const s = n.docs.get(e._key), i = new Qh(t); - return new _h(t, i, e._key, s, new dh(n.hasPendingWrites, n.fromCache), e.converter); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A reference to a transaction. - * - * The `Transaction` object passed to a transaction's `updateFunction` provides - * the methods to read and write data within the transaction context. See - * {@link runTransaction}. - */ class rl extends class { - /** @hideconstructor */ - constructor(t, e) { - this._firestore = t, this._transaction = e, this._dataReader = Gc(t); - } - /** - * Reads the document referenced by the provided {@link DocumentReference}. - * - * @param documentRef - A reference to the document to be read. - * @returns A `DocumentSnapshot` with the read data. - */ get(t) { - const e = Kh(t, this._firestore), n = new qh(this._firestore); - return this._transaction.lookup([ e._key ]).then((t => { - if (!t || 1 !== t.length) return L(); - const s = t[0]; - if (s.isFoundDocument()) return new hh(this._firestore, n, s.key, s, e.converter); - if (s.isNoDocument()) return new hh(this._firestore, n, e._key, null, e.converter); - throw L(); - })); - } - set(t, e, n) { - const s = Kh(t, this._firestore), i = Lh(s.converter, e, n), r = Qc(this._dataReader, "Transaction.set", s._key, i, null !== s.converter, n); - return this._transaction.set(s._key, r), this; - } - update(t, e, n, ...s) { - const i = Kh(t, this._firestore); - // For Compat types, we have to "extract" the underlying types before - // performing validation. - let r; - return r = "string" == typeof (e = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(e)) || e instanceof Nc ? Zc(this._dataReader, "Transaction.update", i._key, e, n, s) : Xc(this._dataReader, "Transaction.update", i._key, e), - this._transaction.update(i._key, r), this; - } - /** - * Deletes the document referred to by the provided {@link DocumentReference}. - * - * @param documentRef - A reference to the document to be deleted. - * @returns This `Transaction` instance. Used for chaining method calls. - */ delete(t) { - const e = Kh(t, this._firestore); - return this._transaction.delete(e._key), this; - } -} { - // This class implements the same logic as the Transaction API in the Lite SDK - // but is subclassed in order to return its own DocumentSnapshot types. - /** @hideconstructor */ - constructor(t, e) { - super(t, e), this._firestore = t; - } - /** - * Reads the document referenced by the provided {@link DocumentReference}. - * - * @param documentRef - A reference to the document to be read. - * @returns A `DocumentSnapshot` with the read data. - */ get(t) { - const e = Kh(t, this._firestore), n = new Qh(this._firestore); - return super.get(t).then((t => new _h(this._firestore, n, e._key, t._document, new dh( - /* hasPendingWrites= */ !1, - /* fromCache= */ !1), e.converter))); - } -} - -/** - * Executes the given `updateFunction` and then attempts to commit the changes - * applied within the transaction. If any document read within the transaction - * has changed, Cloud Firestore retries the `updateFunction`. If it fails to - * commit after 5 attempts, the transaction fails. - * - * The maximum number of writes allowed in a single transaction is 500. - * - * @param firestore - A reference to the Firestore database to run this - * transaction against. - * @param updateFunction - The function to execute within the transaction - * context. - * @returns If the transaction completed successfully or was explicitly aborted - * (the `updateFunction` returned a failed promise), the promise returned by the - * `updateFunction `is returned here. Otherwise, if the transaction failed, a - * rejected promise with the corresponding failure error is returned. - */ function ol(t, e) { - return Qu(Ic(t = tc(t, gc)), (n => e(new rl(t, n)))); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Returns a sentinel for use with {@link @firebase/firestore/lite#(updateDoc:1)} or - * {@link @firebase/firestore/lite#(setDoc:1)} with `{merge: true}` to mark a field for deletion. - */ function al() { - return new jc("deleteField"); -} - -/** - * Returns a sentinel used with {@link @firebase/firestore/lite#(setDoc:1)} or {@link @firebase/firestore/lite#(updateDoc:1)} to - * include a server-generated timestamp in the written data. - */ function ul() { - return new zc("serverTimestamp"); -} - -/** - * Returns a special value that can be used with {@link @firebase/firestore/lite#(setDoc:1)} or {@link - * @firebase/firestore/lite#(updateDoc:1)} that tells the server to union the given elements with any array - * value that already exists on the server. Each specified element that doesn't - * already exist in the array will be added to the end. If the field being - * modified is not already an array it will be overwritten with an array - * containing exactly the specified elements. - * - * @param elements - The elements to union into the array. - * @returns The `FieldValue` sentinel for use in a call to `setDoc()` or - * `updateDoc()`. - */ function cl(...t) { - // NOTE: We don't actually parse the data until it's used in set() or - // update() since we'd need the Firestore instance to do this. - return new Hc("arrayUnion", t); -} - -/** - * Returns a special value that can be used with {@link (setDoc:1)} or {@link - * updateDoc:1} that tells the server to remove the given elements from any - * array value that already exists on the server. All instances of each element - * specified will be removed from the array. If the field being modified is not - * already an array it will be overwritten with an empty array. - * - * @param elements - The elements to remove from the array. - * @returns The `FieldValue` sentinel for use in a call to `setDoc()` or - * `updateDoc()` - */ function hl(...t) { - // NOTE: We don't actually parse the data until it's used in set() or - // update() since we'd need the Firestore instance to do this. - return new Jc("arrayRemove", t); -} - -/** - * Returns a special value that can be used with {@link @firebase/firestore/lite#(setDoc:1)} or {@link - * @firebase/firestore/lite#(updateDoc:1)} that tells the server to increment the field's current value by - * the given value. - * - * If either the operand or the current field value uses floating point - * precision, all arithmetic follows IEEE 754 semantics. If both values are - * integers, values outside of JavaScript's safe number range - * (`Number.MIN_SAFE_INTEGER` to `Number.MAX_SAFE_INTEGER`) are also subject to - * precision loss. Furthermore, once processed by the Firestore backend, all - * integer operations are capped between -2^63 and 2^63-1. - * - * If the current field value is not of type `number`, or if the field does not - * yet exist, the transformation sets the field to the given value. - * - * @param n - The value to increment by. - * @returns The `FieldValue` sentinel for use in a call to `setDoc()` or - * `updateDoc()` - */ function ll(t) { - return new Yc("increment", t); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Creates a write batch, used for performing multiple writes as a single - * atomic operation. The maximum number of writes allowed in a single {@link WriteBatch} - * is 500. - * - * Unlike transactions, write batches are persisted offline and therefore are - * preferable when you don't need to condition your writes on read data. - * - * @returns A {@link WriteBatch} that can be used to atomically execute multiple - * writes. - */ function fl(t) { - return Ic(t = tc(t, gc)), new Uh(t, (e => sl(t, e))); -} - -/** - * @license - * Copyright 2021 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ function dl(t, e) { - Ic(t = tc(t, gc)); - const n = "string" == typeof e ? function(t) { - try { - return JSON.parse(t); - } catch (t) { - throw new Q(G.INVALID_ARGUMENT, "Failed to parse JSON:" + t.message); - } - }(e) : e, s = []; - // PORTING NOTE: We don't return an error if the user has not enabled - // persistence since `enableIndexeddbPersistence()` can fail on the Web. - if (Array.isArray(n.indexes)) for (const t of n.indexes) { - const e = _l(t, "collectionGroup"), n = []; - if (Array.isArray(t.fields)) for (const e of t.fields) { - const t = ah("setIndexConfiguration", _l(e, "fieldPath")); - "CONTAINS" === e.arrayConfig ? n.push(new ie(t, 2 /* CONTAINS */)) : "ASCENDING" === e.order ? n.push(new ie(t, 0 /* ASCENDING */)) : "DESCENDING" === e.order && n.push(new ie(t, 1 /* DESCENDING */)); - } - s.push(new ee(ee.UNKNOWN_ID, e, n, re.empty())); - } - // TODO(indexing): Configure indexes - return Promise.resolve(); -} - -function _l(t, e) { - if ("string" != typeof t[e]) throw new Q(G.INVALID_ARGUMENT, "Missing string value for: " + e); - return t[e]; -} - -/** - * Cloud Firestore - * - * @packageDocumentation - */ !function(t, e = !0) { - !function(t) { - x = t; - }(_firebase_app__WEBPACK_IMPORTED_MODULE_0__.SDK_VERSION), (0,_firebase_app__WEBPACK_IMPORTED_MODULE_0__._registerComponent)(new _firebase_component__WEBPACK_IMPORTED_MODULE_1__.Component("firestore", ((t, {options: n}) => { - const s = t.getProvider("app").getImmediate(), i = new gc(s, new J(t.getProvider("auth-internal")), new tt(t.getProvider("app-check-internal"))); - return n = Object.assign({ - useFetchStreams: e - }, n), i._setSettings(n), i; - }), "PUBLIC")), (0,_firebase_app__WEBPACK_IMPORTED_MODULE_0__.registerVersion)(D, "3.4.6", t), - // BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation - (0,_firebase_app__WEBPACK_IMPORTED_MODULE_0__.registerVersion)(D, "3.4.6", "esm2017"); -}(); - - -//# sourceMappingURL=index.esm2017.js.map - - -/***/ }), - -/***/ "./node_modules/@firebase/util/dist/index.esm2017.js": -/*!***********************************************************!*\ - !*** ./node_modules/@firebase/util/dist/index.esm2017.js ***! - \***********************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "CONSTANTS": () => (/* binding */ CONSTANTS), -/* harmony export */ "DBWrapper": () => (/* binding */ DBWrapper), -/* harmony export */ "Deferred": () => (/* binding */ Deferred), -/* harmony export */ "ErrorFactory": () => (/* binding */ ErrorFactory), -/* harmony export */ "FirebaseError": () => (/* binding */ FirebaseError), -/* harmony export */ "MAX_VALUE_MILLIS": () => (/* binding */ MAX_VALUE_MILLIS), -/* harmony export */ "RANDOM_FACTOR": () => (/* binding */ RANDOM_FACTOR), -/* harmony export */ "Sha1": () => (/* binding */ Sha1), -/* harmony export */ "areCookiesEnabled": () => (/* binding */ areCookiesEnabled), -/* harmony export */ "assert": () => (/* binding */ assert), -/* harmony export */ "assertionError": () => (/* binding */ assertionError), -/* harmony export */ "async": () => (/* binding */ async), -/* harmony export */ "base64": () => (/* binding */ base64), -/* harmony export */ "base64Decode": () => (/* binding */ base64Decode), -/* harmony export */ "base64Encode": () => (/* binding */ base64Encode), -/* harmony export */ "base64urlEncodeWithoutPadding": () => (/* binding */ base64urlEncodeWithoutPadding), -/* harmony export */ "calculateBackoffMillis": () => (/* binding */ calculateBackoffMillis), -/* harmony export */ "contains": () => (/* binding */ contains), -/* harmony export */ "createMockUserToken": () => (/* binding */ createMockUserToken), -/* harmony export */ "createSubscribe": () => (/* binding */ createSubscribe), -/* harmony export */ "decode": () => (/* binding */ decode), -/* harmony export */ "deepCopy": () => (/* binding */ deepCopy), -/* harmony export */ "deepEqual": () => (/* binding */ deepEqual), -/* harmony export */ "deepExtend": () => (/* binding */ deepExtend), -/* harmony export */ "deleteDB": () => (/* binding */ deleteDB), -/* harmony export */ "errorPrefix": () => (/* binding */ errorPrefix), -/* harmony export */ "extractQuerystring": () => (/* binding */ extractQuerystring), -/* harmony export */ "getGlobal": () => (/* binding */ getGlobal), -/* harmony export */ "getModularInstance": () => (/* binding */ getModularInstance), -/* harmony export */ "getUA": () => (/* binding */ getUA), -/* harmony export */ "isAdmin": () => (/* binding */ isAdmin), -/* harmony export */ "isBrowser": () => (/* binding */ isBrowser), -/* harmony export */ "isBrowserExtension": () => (/* binding */ isBrowserExtension), -/* harmony export */ "isElectron": () => (/* binding */ isElectron), -/* harmony export */ "isEmpty": () => (/* binding */ isEmpty), -/* harmony export */ "isIE": () => (/* binding */ isIE), -/* harmony export */ "isIndexedDBAvailable": () => (/* binding */ isIndexedDBAvailable), -/* harmony export */ "isMobileCordova": () => (/* binding */ isMobileCordova), -/* harmony export */ "isNode": () => (/* binding */ isNode), -/* harmony export */ "isNodeSdk": () => (/* binding */ isNodeSdk), -/* harmony export */ "isReactNative": () => (/* binding */ isReactNative), -/* harmony export */ "isSafari": () => (/* binding */ isSafari), -/* harmony export */ "isUWP": () => (/* binding */ isUWP), -/* harmony export */ "isValidFormat": () => (/* binding */ isValidFormat), -/* harmony export */ "isValidTimestamp": () => (/* binding */ isValidTimestamp), -/* harmony export */ "issuedAtTime": () => (/* binding */ issuedAtTime), -/* harmony export */ "jsonEval": () => (/* binding */ jsonEval), -/* harmony export */ "map": () => (/* binding */ map), -/* harmony export */ "openDB": () => (/* binding */ openDB), -/* harmony export */ "ordinal": () => (/* binding */ ordinal), -/* harmony export */ "querystring": () => (/* binding */ querystring), -/* harmony export */ "querystringDecode": () => (/* binding */ querystringDecode), -/* harmony export */ "safeGet": () => (/* binding */ safeGet), -/* harmony export */ "stringLength": () => (/* binding */ stringLength), -/* harmony export */ "stringToByteArray": () => (/* binding */ stringToByteArray), -/* harmony export */ "stringify": () => (/* binding */ stringify), -/* harmony export */ "validateArgCount": () => (/* binding */ validateArgCount), -/* harmony export */ "validateCallback": () => (/* binding */ validateCallback), -/* harmony export */ "validateContextObject": () => (/* binding */ validateContextObject), -/* harmony export */ "validateIndexedDBOpenable": () => (/* binding */ validateIndexedDBOpenable), -/* harmony export */ "validateNamespace": () => (/* binding */ validateNamespace) -/* harmony export */ }); -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @fileoverview Firebase constants. Some of these (@defines) can be overridden at compile-time. - */ -const CONSTANTS = { - /** - * @define {boolean} Whether this is the client Node.js SDK. - */ - NODE_CLIENT: false, - /** - * @define {boolean} Whether this is the Admin Node.js SDK. - */ - NODE_ADMIN: false, - /** - * Firebase SDK Version - */ - SDK_VERSION: '${JSCORE_VERSION}' -}; - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Throws an error if the provided assertion is falsy - */ -const assert = function (assertion, message) { - if (!assertion) { - throw assertionError(message); - } -}; -/** - * Returns an Error object suitable for throwing. - */ -const assertionError = function (message) { - return new Error('Firebase Database (' + - CONSTANTS.SDK_VERSION + - ') INTERNAL ASSERT FAILED: ' + - message); -}; - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const stringToByteArray$1 = function (str) { - // TODO(user): Use native implementations if/when available - const out = []; - let p = 0; - for (let i = 0; i < str.length; i++) { - let c = str.charCodeAt(i); - if (c < 128) { - out[p++] = c; - } - else if (c < 2048) { - out[p++] = (c >> 6) | 192; - out[p++] = (c & 63) | 128; - } - else if ((c & 0xfc00) === 0xd800 && - i + 1 < str.length && - (str.charCodeAt(i + 1) & 0xfc00) === 0xdc00) { - // Surrogate Pair - c = 0x10000 + ((c & 0x03ff) << 10) + (str.charCodeAt(++i) & 0x03ff); - out[p++] = (c >> 18) | 240; - out[p++] = ((c >> 12) & 63) | 128; - out[p++] = ((c >> 6) & 63) | 128; - out[p++] = (c & 63) | 128; - } - else { - out[p++] = (c >> 12) | 224; - out[p++] = ((c >> 6) & 63) | 128; - out[p++] = (c & 63) | 128; - } - } - return out; -}; -/** - * Turns an array of numbers into the string given by the concatenation of the - * characters to which the numbers correspond. - * @param bytes Array of numbers representing characters. - * @return Stringification of the array. - */ -const byteArrayToString = function (bytes) { - // TODO(user): Use native implementations if/when available - const out = []; - let pos = 0, c = 0; - while (pos < bytes.length) { - const c1 = bytes[pos++]; - if (c1 < 128) { - out[c++] = String.fromCharCode(c1); - } - else if (c1 > 191 && c1 < 224) { - const c2 = bytes[pos++]; - out[c++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63)); - } - else if (c1 > 239 && c1 < 365) { - // Surrogate Pair - const c2 = bytes[pos++]; - const c3 = bytes[pos++]; - const c4 = bytes[pos++]; - const u = (((c1 & 7) << 18) | ((c2 & 63) << 12) | ((c3 & 63) << 6) | (c4 & 63)) - - 0x10000; - out[c++] = String.fromCharCode(0xd800 + (u >> 10)); - out[c++] = String.fromCharCode(0xdc00 + (u & 1023)); - } - else { - const c2 = bytes[pos++]; - const c3 = bytes[pos++]; - out[c++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); - } - } - return out.join(''); -}; -// We define it as an object literal instead of a class because a class compiled down to es5 can't -// be treeshaked. https://github.com/rollup/rollup/issues/1691 -// Static lookup maps, lazily populated by init_() -const base64 = { - /** - * Maps bytes to characters. - */ - byteToCharMap_: null, - /** - * Maps characters to bytes. - */ - charToByteMap_: null, - /** - * Maps bytes to websafe characters. - * @private - */ - byteToCharMapWebSafe_: null, - /** - * Maps websafe characters to bytes. - * @private - */ - charToByteMapWebSafe_: null, - /** - * Our default alphabet, shared between - * ENCODED_VALS and ENCODED_VALS_WEBSAFE - */ - ENCODED_VALS_BASE: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + 'abcdefghijklmnopqrstuvwxyz' + '0123456789', - /** - * Our default alphabet. Value 64 (=) is special; it means "nothing." - */ - get ENCODED_VALS() { - return this.ENCODED_VALS_BASE + '+/='; - }, - /** - * Our websafe alphabet. - */ - get ENCODED_VALS_WEBSAFE() { - return this.ENCODED_VALS_BASE + '-_.'; - }, - /** - * Whether this browser supports the atob and btoa functions. This extension - * started at Mozilla but is now implemented by many browsers. We use the - * ASSUME_* variables to avoid pulling in the full useragent detection library - * but still allowing the standard per-browser compilations. - * - */ - HAS_NATIVE_SUPPORT: typeof atob === 'function', - /** - * Base64-encode an array of bytes. - * - * @param input An array of bytes (numbers with - * value in [0, 255]) to encode. - * @param webSafe Boolean indicating we should use the - * alternative alphabet. - * @return The base64 encoded string. - */ - encodeByteArray(input, webSafe) { - if (!Array.isArray(input)) { - throw Error('encodeByteArray takes an array as a parameter'); - } - this.init_(); - const byteToCharMap = webSafe - ? this.byteToCharMapWebSafe_ - : this.byteToCharMap_; - const output = []; - for (let i = 0; i < input.length; i += 3) { - const byte1 = input[i]; - const haveByte2 = i + 1 < input.length; - const byte2 = haveByte2 ? input[i + 1] : 0; - const haveByte3 = i + 2 < input.length; - const byte3 = haveByte3 ? input[i + 2] : 0; - const outByte1 = byte1 >> 2; - const outByte2 = ((byte1 & 0x03) << 4) | (byte2 >> 4); - let outByte3 = ((byte2 & 0x0f) << 2) | (byte3 >> 6); - let outByte4 = byte3 & 0x3f; - if (!haveByte3) { - outByte4 = 64; - if (!haveByte2) { - outByte3 = 64; - } - } - output.push(byteToCharMap[outByte1], byteToCharMap[outByte2], byteToCharMap[outByte3], byteToCharMap[outByte4]); - } - return output.join(''); - }, - /** - * Base64-encode a string. - * - * @param input A string to encode. - * @param webSafe If true, we should use the - * alternative alphabet. - * @return The base64 encoded string. - */ - encodeString(input, webSafe) { - // Shortcut for Mozilla browsers that implement - // a native base64 encoder in the form of "btoa/atob" - if (this.HAS_NATIVE_SUPPORT && !webSafe) { - return btoa(input); - } - return this.encodeByteArray(stringToByteArray$1(input), webSafe); - }, - /** - * Base64-decode a string. - * - * @param input to decode. - * @param webSafe True if we should use the - * alternative alphabet. - * @return string representing the decoded value. - */ - decodeString(input, webSafe) { - // Shortcut for Mozilla browsers that implement - // a native base64 encoder in the form of "btoa/atob" - if (this.HAS_NATIVE_SUPPORT && !webSafe) { - return atob(input); - } - return byteArrayToString(this.decodeStringToByteArray(input, webSafe)); - }, - /** - * Base64-decode a string. - * - * In base-64 decoding, groups of four characters are converted into three - * bytes. If the encoder did not apply padding, the input length may not - * be a multiple of 4. - * - * In this case, the last group will have fewer than 4 characters, and - * padding will be inferred. If the group has one or two characters, it decodes - * to one byte. If the group has three characters, it decodes to two bytes. - * - * @param input Input to decode. - * @param webSafe True if we should use the web-safe alphabet. - * @return bytes representing the decoded value. - */ - decodeStringToByteArray(input, webSafe) { - this.init_(); - const charToByteMap = webSafe - ? this.charToByteMapWebSafe_ - : this.charToByteMap_; - const output = []; - for (let i = 0; i < input.length;) { - const byte1 = charToByteMap[input.charAt(i++)]; - const haveByte2 = i < input.length; - const byte2 = haveByte2 ? charToByteMap[input.charAt(i)] : 0; - ++i; - const haveByte3 = i < input.length; - const byte3 = haveByte3 ? charToByteMap[input.charAt(i)] : 64; - ++i; - const haveByte4 = i < input.length; - const byte4 = haveByte4 ? charToByteMap[input.charAt(i)] : 64; - ++i; - if (byte1 == null || byte2 == null || byte3 == null || byte4 == null) { - throw Error(); - } - const outByte1 = (byte1 << 2) | (byte2 >> 4); - output.push(outByte1); - if (byte3 !== 64) { - const outByte2 = ((byte2 << 4) & 0xf0) | (byte3 >> 2); - output.push(outByte2); - if (byte4 !== 64) { - const outByte3 = ((byte3 << 6) & 0xc0) | byte4; - output.push(outByte3); - } - } - } - return output; - }, - /** - * Lazy static initialization function. Called before - * accessing any of the static map variables. - * @private - */ - init_() { - if (!this.byteToCharMap_) { - this.byteToCharMap_ = {}; - this.charToByteMap_ = {}; - this.byteToCharMapWebSafe_ = {}; - this.charToByteMapWebSafe_ = {}; - // We want quick mappings back and forth, so we precompute two maps. - for (let i = 0; i < this.ENCODED_VALS.length; i++) { - this.byteToCharMap_[i] = this.ENCODED_VALS.charAt(i); - this.charToByteMap_[this.byteToCharMap_[i]] = i; - this.byteToCharMapWebSafe_[i] = this.ENCODED_VALS_WEBSAFE.charAt(i); - this.charToByteMapWebSafe_[this.byteToCharMapWebSafe_[i]] = i; - // Be forgiving when decoding and correctly decode both encodings. - if (i >= this.ENCODED_VALS_BASE.length) { - this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(i)] = i; - this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(i)] = i; - } - } - } - } -}; -/** - * URL-safe base64 encoding - */ -const base64Encode = function (str) { - const utf8Bytes = stringToByteArray$1(str); - return base64.encodeByteArray(utf8Bytes, true); -}; -/** - * URL-safe base64 encoding (without "." padding in the end). - * e.g. Used in JSON Web Token (JWT) parts. - */ -const base64urlEncodeWithoutPadding = function (str) { - // Use base64url encoding and remove padding in the end (dot characters). - return base64Encode(str).replace(/\./g, ''); -}; -/** - * URL-safe base64 decoding - * - * NOTE: DO NOT use the global atob() function - it does NOT support the - * base64Url variant encoding. - * - * @param str To be decoded - * @return Decoded result, if possible - */ -const base64Decode = function (str) { - try { - return base64.decodeString(str, true); - } - catch (e) { - console.error('base64Decode failed: ', e); - } - return null; -}; - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Do a deep-copy of basic JavaScript Objects or Arrays. - */ -function deepCopy(value) { - return deepExtend(undefined, value); -} -/** - * Copy properties from source to target (recursively allows extension - * of Objects and Arrays). Scalar values in the target are over-written. - * If target is undefined, an object of the appropriate type will be created - * (and returned). - * - * We recursively copy all child properties of plain Objects in the source- so - * that namespace- like dictionaries are merged. - * - * Note that the target can be a function, in which case the properties in - * the source Object are copied onto it as static properties of the Function. - * - * Note: we don't merge __proto__ to prevent prototype pollution - */ -function deepExtend(target, source) { - if (!(source instanceof Object)) { - return source; - } - switch (source.constructor) { - case Date: - // Treat Dates like scalars; if the target date object had any child - // properties - they will be lost! - const dateValue = source; - return new Date(dateValue.getTime()); - case Object: - if (target === undefined) { - target = {}; - } - break; - case Array: - // Always copy the array source and overwrite the target. - target = []; - break; - default: - // Not a plain Object - treat it as a scalar. - return source; - } - for (const prop in source) { - // use isValidKey to guard against prototype pollution. See https://snyk.io/vuln/SNYK-JS-LODASH-450202 - if (!source.hasOwnProperty(prop) || !isValidKey(prop)) { - continue; - } - target[prop] = deepExtend(target[prop], source[prop]); - } - return target; -} -function isValidKey(key) { - return key !== '__proto__'; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -class Deferred { - constructor() { - this.reject = () => { }; - this.resolve = () => { }; - this.promise = new Promise((resolve, reject) => { - this.resolve = resolve; - this.reject = reject; - }); - } - /** - * Our API internals are not promiseified and cannot because our callback APIs have subtle expectations around - * invoking promises inline, which Promises are forbidden to do. This method accepts an optional node-style callback - * and returns a node-style callback which will resolve or reject the Deferred's promise. - */ - wrapCallback(callback) { - return (error, value) => { - if (error) { - this.reject(error); - } - else { - this.resolve(value); - } - if (typeof callback === 'function') { - // Attaching noop handler just in case developer wasn't expecting - // promises - this.promise.catch(() => { }); - // Some of our callbacks don't expect a value and our own tests - // assert that the parameter length is 1 - if (callback.length === 1) { - callback(error); - } - else { - callback(error, value); - } - } - }; - } -} - -/** - * @license - * Copyright 2021 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function createMockUserToken(token, projectId) { - if (token.uid) { - throw new Error('The "uid" field is no longer supported by mockUserToken. Please use "sub" instead for Firebase Auth User ID.'); - } - // Unsecured JWTs use "none" as the algorithm. - const header = { - alg: 'none', - type: 'JWT' - }; - const project = projectId || 'demo-project'; - const iat = token.iat || 0; - const sub = token.sub || token.user_id; - if (!sub) { - throw new Error("mockUserToken must contain 'sub' or 'user_id' field!"); - } - const payload = Object.assign({ - // Set all required fields to decent defaults - iss: `https://securetoken.google.com/${project}`, aud: project, iat, exp: iat + 3600, auth_time: iat, sub, user_id: sub, firebase: { - sign_in_provider: 'custom', - identities: {} - } }, token); - // Unsecured JWTs use the empty string as a signature. - const signature = ''; - return [ - base64urlEncodeWithoutPadding(JSON.stringify(header)), - base64urlEncodeWithoutPadding(JSON.stringify(payload)), - signature - ].join('.'); -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Returns navigator.userAgent string or '' if it's not defined. - * @return user agent string - */ -function getUA() { - if (typeof navigator !== 'undefined' && - typeof navigator['userAgent'] === 'string') { - return navigator['userAgent']; - } - else { - return ''; - } -} -/** - * Detect Cordova / PhoneGap / Ionic frameworks on a mobile device. - * - * Deliberately does not rely on checking `file://` URLs (as this fails PhoneGap - * in the Ripple emulator) nor Cordova `onDeviceReady`, which would normally - * wait for a callback. - */ -function isMobileCordova() { - return (typeof window !== 'undefined' && - // @ts-ignore Setting up an broadly applicable index signature for Window - // just to deal with this case would probably be a bad idea. - !!(window['cordova'] || window['phonegap'] || window['PhoneGap']) && - /ios|iphone|ipod|ipad|android|blackberry|iemobile/i.test(getUA())); -} -/** - * Detect Node.js. - * - * @return true if Node.js environment is detected. - */ -// Node detection logic from: https://github.com/iliakan/detect-node/ -function isNode() { - try { - return (Object.prototype.toString.call(__webpack_require__.g.process) === '[object process]'); - } - catch (e) { - return false; - } -} -/** - * Detect Browser Environment - */ -function isBrowser() { - return typeof self === 'object' && self.self === self; -} -function isBrowserExtension() { - const runtime = typeof chrome === 'object' - ? chrome.runtime - : typeof browser === 'object' - ? browser.runtime - : undefined; - return typeof runtime === 'object' && runtime.id !== undefined; -} -/** - * Detect React Native. - * - * @return true if ReactNative environment is detected. - */ -function isReactNative() { - return (typeof navigator === 'object' && navigator['product'] === 'ReactNative'); -} -/** Detects Electron apps. */ -function isElectron() { - return getUA().indexOf('Electron/') >= 0; -} -/** Detects Internet Explorer. */ -function isIE() { - const ua = getUA(); - return ua.indexOf('MSIE ') >= 0 || ua.indexOf('Trident/') >= 0; -} -/** Detects Universal Windows Platform apps. */ -function isUWP() { - return getUA().indexOf('MSAppHost/') >= 0; -} -/** - * Detect whether the current SDK build is the Node version. - * - * @return true if it's the Node SDK build. - */ -function isNodeSdk() { - return CONSTANTS.NODE_CLIENT === true || CONSTANTS.NODE_ADMIN === true; -} -/** Returns true if we are running in Safari. */ -function isSafari() { - return (!isNode() && - navigator.userAgent.includes('Safari') && - !navigator.userAgent.includes('Chrome')); -} -/** - * This method checks if indexedDB is supported by current browser/service worker context - * @return true if indexedDB is supported by current browser/service worker context - */ -function isIndexedDBAvailable() { - return typeof indexedDB === 'object'; -} -/** - * This method validates browser/sw context for indexedDB by opening a dummy indexedDB database and reject - * if errors occur during the database open operation. - * - * @throws exception if current browser/sw context can't run idb.open (ex: Safari iframe, Firefox - * private browsing) - */ -function validateIndexedDBOpenable() { - return new Promise((resolve, reject) => { - try { - let preExist = true; - const DB_CHECK_NAME = 'validate-browser-context-for-indexeddb-analytics-module'; - const request = self.indexedDB.open(DB_CHECK_NAME); - request.onsuccess = () => { - request.result.close(); - // delete database only when it doesn't pre-exist - if (!preExist) { - self.indexedDB.deleteDatabase(DB_CHECK_NAME); - } - resolve(true); - }; - request.onupgradeneeded = () => { - preExist = false; - }; - request.onerror = () => { - var _a; - reject(((_a = request.error) === null || _a === void 0 ? void 0 : _a.message) || ''); - }; - } - catch (error) { - reject(error); - } - }); -} -/** - * - * This method checks whether cookie is enabled within current browser - * @return true if cookie is enabled within current browser - */ -function areCookiesEnabled() { - if (typeof navigator === 'undefined' || !navigator.cookieEnabled) { - return false; - } - return true; -} -/** - * Polyfill for `globalThis` object. - * @returns the `globalThis` object for the given environment. - */ -function getGlobal() { - if (typeof self !== 'undefined') { - return self; - } - if (typeof window !== 'undefined') { - return window; - } - if (typeof __webpack_require__.g !== 'undefined') { - return __webpack_require__.g; - } - throw new Error('Unable to locate global object.'); -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @fileoverview Standardized Firebase Error. - * - * Usage: - * - * // Typescript string literals for type-safe codes - * type Err = - * 'unknown' | - * 'object-not-found' - * ; - * - * // Closure enum for type-safe error codes - * // at-enum {string} - * var Err = { - * UNKNOWN: 'unknown', - * OBJECT_NOT_FOUND: 'object-not-found', - * } - * - * let errors: Map = { - * 'generic-error': "Unknown error", - * 'file-not-found': "Could not find file: {$file}", - * }; - * - * // Type-safe function - must pass a valid error code as param. - * let error = new ErrorFactory('service', 'Service', errors); - * - * ... - * throw error.create(Err.GENERIC); - * ... - * throw error.create(Err.FILE_NOT_FOUND, {'file': fileName}); - * ... - * // Service: Could not file file: foo.txt (service/file-not-found). - * - * catch (e) { - * assert(e.message === "Could not find file: foo.txt."); - * if (e.code === 'service/file-not-found') { - * console.log("Could not read file: " + e['file']); - * } - * } - */ -const ERROR_NAME = 'FirebaseError'; -// Based on code from: -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Custom_Error_Types -class FirebaseError extends Error { - constructor( - /** The error code for this error. */ - code, message, - /** Custom data for this error. */ - customData) { - super(message); - this.code = code; - this.customData = customData; - /** The custom name for all FirebaseErrors. */ - this.name = ERROR_NAME; - // Fix For ES5 - // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work - Object.setPrototypeOf(this, FirebaseError.prototype); - // Maintains proper stack trace for where our error was thrown. - // Only available on V8. - if (Error.captureStackTrace) { - Error.captureStackTrace(this, ErrorFactory.prototype.create); - } - } -} -class ErrorFactory { - constructor(service, serviceName, errors) { - this.service = service; - this.serviceName = serviceName; - this.errors = errors; - } - create(code, ...data) { - const customData = data[0] || {}; - const fullCode = `${this.service}/${code}`; - const template = this.errors[code]; - const message = template ? replaceTemplate(template, customData) : 'Error'; - // Service Name: Error message (service/code). - const fullMessage = `${this.serviceName}: ${message} (${fullCode}).`; - const error = new FirebaseError(fullCode, fullMessage, customData); - return error; - } -} -function replaceTemplate(template, data) { - return template.replace(PATTERN, (_, key) => { - const value = data[key]; - return value != null ? String(value) : `<${key}?>`; - }); -} -const PATTERN = /\{\$([^}]+)}/g; - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Evaluates a JSON string into a javascript object. - * - * @param {string} str A string containing JSON. - * @return {*} The javascript object representing the specified JSON. - */ -function jsonEval(str) { - return JSON.parse(str); -} -/** - * Returns JSON representing a javascript object. - * @param {*} data Javascript object to be stringified. - * @return {string} The JSON contents of the object. - */ -function stringify(data) { - return JSON.stringify(data); -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Decodes a Firebase auth. token into constituent parts. - * - * Notes: - * - May return with invalid / incomplete claims if there's no native base64 decoding support. - * - Doesn't check if the token is actually valid. - */ -const decode = function (token) { - let header = {}, claims = {}, data = {}, signature = ''; - try { - const parts = token.split('.'); - header = jsonEval(base64Decode(parts[0]) || ''); - claims = jsonEval(base64Decode(parts[1]) || ''); - signature = parts[2]; - data = claims['d'] || {}; - delete claims['d']; - } - catch (e) { } - return { - header, - claims, - data, - signature - }; -}; -/** - * Decodes a Firebase auth. token and checks the validity of its time-based claims. Will return true if the - * token is within the time window authorized by the 'nbf' (not-before) and 'iat' (issued-at) claims. - * - * Notes: - * - May return a false negative if there's no native base64 decoding support. - * - Doesn't check if the token is actually valid. - */ -const isValidTimestamp = function (token) { - const claims = decode(token).claims; - const now = Math.floor(new Date().getTime() / 1000); - let validSince = 0, validUntil = 0; - if (typeof claims === 'object') { - if (claims.hasOwnProperty('nbf')) { - validSince = claims['nbf']; - } - else if (claims.hasOwnProperty('iat')) { - validSince = claims['iat']; - } - if (claims.hasOwnProperty('exp')) { - validUntil = claims['exp']; - } - else { - // token will expire after 24h by default - validUntil = validSince + 86400; - } - } - return (!!now && - !!validSince && - !!validUntil && - now >= validSince && - now <= validUntil); -}; -/** - * Decodes a Firebase auth. token and returns its issued at time if valid, null otherwise. - * - * Notes: - * - May return null if there's no native base64 decoding support. - * - Doesn't check if the token is actually valid. - */ -const issuedAtTime = function (token) { - const claims = decode(token).claims; - if (typeof claims === 'object' && claims.hasOwnProperty('iat')) { - return claims['iat']; - } - return null; -}; -/** - * Decodes a Firebase auth. token and checks the validity of its format. Expects a valid issued-at time. - * - * Notes: - * - May return a false negative if there's no native base64 decoding support. - * - Doesn't check if the token is actually valid. - */ -const isValidFormat = function (token) { - const decoded = decode(token), claims = decoded.claims; - return !!claims && typeof claims === 'object' && claims.hasOwnProperty('iat'); -}; -/** - * Attempts to peer into an auth token and determine if it's an admin auth token by looking at the claims portion. - * - * Notes: - * - May return a false negative if there's no native base64 decoding support. - * - Doesn't check if the token is actually valid. - */ -const isAdmin = function (token) { - const claims = decode(token).claims; - return typeof claims === 'object' && claims['admin'] === true; -}; - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function contains(obj, key) { - return Object.prototype.hasOwnProperty.call(obj, key); -} -function safeGet(obj, key) { - if (Object.prototype.hasOwnProperty.call(obj, key)) { - return obj[key]; - } - else { - return undefined; - } -} -function isEmpty(obj) { - for (const key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) { - return false; - } - } - return true; -} -function map(obj, fn, contextObj) { - const res = {}; - for (const key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) { - res[key] = fn.call(contextObj, obj[key], key, obj); - } - } - return res; -} -/** - * Deep equal two objects. Support Arrays and Objects. - */ -function deepEqual(a, b) { - if (a === b) { - return true; - } - const aKeys = Object.keys(a); - const bKeys = Object.keys(b); - for (const k of aKeys) { - if (!bKeys.includes(k)) { - return false; - } - const aProp = a[k]; - const bProp = b[k]; - if (isObject(aProp) && isObject(bProp)) { - if (!deepEqual(aProp, bProp)) { - return false; - } - } - else if (aProp !== bProp) { - return false; - } - } - for (const k of bKeys) { - if (!aKeys.includes(k)) { - return false; - } - } - return true; -} -function isObject(thing) { - return thing !== null && typeof thing === 'object'; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Returns a querystring-formatted string (e.g. &arg=val&arg2=val2) from a - * params object (e.g. {arg: 'val', arg2: 'val2'}) - * Note: You must prepend it with ? when adding it to a URL. - */ -function querystring(querystringParams) { - const params = []; - for (const [key, value] of Object.entries(querystringParams)) { - if (Array.isArray(value)) { - value.forEach(arrayVal => { - params.push(encodeURIComponent(key) + '=' + encodeURIComponent(arrayVal)); - }); - } - else { - params.push(encodeURIComponent(key) + '=' + encodeURIComponent(value)); - } - } - return params.length ? '&' + params.join('&') : ''; -} -/** - * Decodes a querystring (e.g. ?arg=val&arg2=val2) into a params object - * (e.g. {arg: 'val', arg2: 'val2'}) - */ -function querystringDecode(querystring) { - const obj = {}; - const tokens = querystring.replace(/^\?/, '').split('&'); - tokens.forEach(token => { - if (token) { - const [key, value] = token.split('='); - obj[decodeURIComponent(key)] = decodeURIComponent(value); - } - }); - return obj; -} -/** - * Extract the query string part of a URL, including the leading question mark (if present). - */ -function extractQuerystring(url) { - const queryStart = url.indexOf('?'); - if (!queryStart) { - return ''; - } - const fragmentStart = url.indexOf('#', queryStart); - return url.substring(queryStart, fragmentStart > 0 ? fragmentStart : undefined); -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @fileoverview SHA-1 cryptographic hash. - * Variable names follow the notation in FIPS PUB 180-3: - * http://csrc.nist.gov/publications/fips/fips180-3/fips180-3_final.pdf. - * - * Usage: - * var sha1 = new sha1(); - * sha1.update(bytes); - * var hash = sha1.digest(); - * - * Performance: - * Chrome 23: ~400 Mbit/s - * Firefox 16: ~250 Mbit/s - * - */ -/** - * SHA-1 cryptographic hash constructor. - * - * The properties declared here are discussed in the above algorithm document. - * @constructor - * @final - * @struct - */ -class Sha1 { - constructor() { - /** - * Holds the previous values of accumulated variables a-e in the compress_ - * function. - * @private - */ - this.chain_ = []; - /** - * A buffer holding the partially computed hash result. - * @private - */ - this.buf_ = []; - /** - * An array of 80 bytes, each a part of the message to be hashed. Referred to - * as the message schedule in the docs. - * @private - */ - this.W_ = []; - /** - * Contains data needed to pad messages less than 64 bytes. - * @private - */ - this.pad_ = []; - /** - * @private {number} - */ - this.inbuf_ = 0; - /** - * @private {number} - */ - this.total_ = 0; - this.blockSize = 512 / 8; - this.pad_[0] = 128; - for (let i = 1; i < this.blockSize; ++i) { - this.pad_[i] = 0; - } - this.reset(); - } - reset() { - this.chain_[0] = 0x67452301; - this.chain_[1] = 0xefcdab89; - this.chain_[2] = 0x98badcfe; - this.chain_[3] = 0x10325476; - this.chain_[4] = 0xc3d2e1f0; - this.inbuf_ = 0; - this.total_ = 0; - } - /** - * Internal compress helper function. - * @param buf Block to compress. - * @param offset Offset of the block in the buffer. - * @private - */ - compress_(buf, offset) { - if (!offset) { - offset = 0; - } - const W = this.W_; - // get 16 big endian words - if (typeof buf === 'string') { - for (let i = 0; i < 16; i++) { - // TODO(user): [bug 8140122] Recent versions of Safari for Mac OS and iOS - // have a bug that turns the post-increment ++ operator into pre-increment - // during JIT compilation. We have code that depends heavily on SHA-1 for - // correctness and which is affected by this bug, so I've removed all uses - // of post-increment ++ in which the result value is used. We can revert - // this change once the Safari bug - // (https://bugs.webkit.org/show_bug.cgi?id=109036) has been fixed and - // most clients have been updated. - W[i] = - (buf.charCodeAt(offset) << 24) | - (buf.charCodeAt(offset + 1) << 16) | - (buf.charCodeAt(offset + 2) << 8) | - buf.charCodeAt(offset + 3); - offset += 4; - } - } - else { - for (let i = 0; i < 16; i++) { - W[i] = - (buf[offset] << 24) | - (buf[offset + 1] << 16) | - (buf[offset + 2] << 8) | - buf[offset + 3]; - offset += 4; - } - } - // expand to 80 words - for (let i = 16; i < 80; i++) { - const t = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]; - W[i] = ((t << 1) | (t >>> 31)) & 0xffffffff; - } - let a = this.chain_[0]; - let b = this.chain_[1]; - let c = this.chain_[2]; - let d = this.chain_[3]; - let e = this.chain_[4]; - let f, k; - // TODO(user): Try to unroll this loop to speed up the computation. - for (let i = 0; i < 80; i++) { - if (i < 40) { - if (i < 20) { - f = d ^ (b & (c ^ d)); - k = 0x5a827999; - } - else { - f = b ^ c ^ d; - k = 0x6ed9eba1; - } - } - else { - if (i < 60) { - f = (b & c) | (d & (b | c)); - k = 0x8f1bbcdc; - } - else { - f = b ^ c ^ d; - k = 0xca62c1d6; - } - } - const t = (((a << 5) | (a >>> 27)) + f + e + k + W[i]) & 0xffffffff; - e = d; - d = c; - c = ((b << 30) | (b >>> 2)) & 0xffffffff; - b = a; - a = t; - } - this.chain_[0] = (this.chain_[0] + a) & 0xffffffff; - this.chain_[1] = (this.chain_[1] + b) & 0xffffffff; - this.chain_[2] = (this.chain_[2] + c) & 0xffffffff; - this.chain_[3] = (this.chain_[3] + d) & 0xffffffff; - this.chain_[4] = (this.chain_[4] + e) & 0xffffffff; - } - update(bytes, length) { - // TODO(johnlenz): tighten the function signature and remove this check - if (bytes == null) { - return; - } - if (length === undefined) { - length = bytes.length; - } - const lengthMinusBlock = length - this.blockSize; - let n = 0; - // Using local instead of member variables gives ~5% speedup on Firefox 16. - const buf = this.buf_; - let inbuf = this.inbuf_; - // The outer while loop should execute at most twice. - while (n < length) { - // When we have no data in the block to top up, we can directly process the - // input buffer (assuming it contains sufficient data). This gives ~25% - // speedup on Chrome 23 and ~15% speedup on Firefox 16, but requires that - // the data is provided in large chunks (or in multiples of 64 bytes). - if (inbuf === 0) { - while (n <= lengthMinusBlock) { - this.compress_(bytes, n); - n += this.blockSize; - } - } - if (typeof bytes === 'string') { - while (n < length) { - buf[inbuf] = bytes.charCodeAt(n); - ++inbuf; - ++n; - if (inbuf === this.blockSize) { - this.compress_(buf); - inbuf = 0; - // Jump to the outer loop so we use the full-block optimization. - break; - } - } - } - else { - while (n < length) { - buf[inbuf] = bytes[n]; - ++inbuf; - ++n; - if (inbuf === this.blockSize) { - this.compress_(buf); - inbuf = 0; - // Jump to the outer loop so we use the full-block optimization. - break; - } - } - } - } - this.inbuf_ = inbuf; - this.total_ += length; - } - /** @override */ - digest() { - const digest = []; - let totalBits = this.total_ * 8; - // Add pad 0x80 0x00*. - if (this.inbuf_ < 56) { - this.update(this.pad_, 56 - this.inbuf_); - } - else { - this.update(this.pad_, this.blockSize - (this.inbuf_ - 56)); - } - // Add # bits. - for (let i = this.blockSize - 1; i >= 56; i--) { - this.buf_[i] = totalBits & 255; - totalBits /= 256; // Don't use bit-shifting here! - } - this.compress_(this.buf_); - let n = 0; - for (let i = 0; i < 5; i++) { - for (let j = 24; j >= 0; j -= 8) { - digest[n] = (this.chain_[i] >> j) & 255; - ++n; - } - } - return digest; - } -} - -/** - * Helper to make a Subscribe function (just like Promise helps make a - * Thenable). - * - * @param executor Function which can make calls to a single Observer - * as a proxy. - * @param onNoObservers Callback when count of Observers goes to zero. - */ -function createSubscribe(executor, onNoObservers) { - const proxy = new ObserverProxy(executor, onNoObservers); - return proxy.subscribe.bind(proxy); -} -/** - * Implement fan-out for any number of Observers attached via a subscribe - * function. - */ -class ObserverProxy { - /** - * @param executor Function which can make calls to a single Observer - * as a proxy. - * @param onNoObservers Callback when count of Observers goes to zero. - */ - constructor(executor, onNoObservers) { - this.observers = []; - this.unsubscribes = []; - this.observerCount = 0; - // Micro-task scheduling by calling task.then(). - this.task = Promise.resolve(); - this.finalized = false; - this.onNoObservers = onNoObservers; - // Call the executor asynchronously so subscribers that are called - // synchronously after the creation of the subscribe function - // can still receive the very first value generated in the executor. - this.task - .then(() => { - executor(this); - }) - .catch(e => { - this.error(e); - }); - } - next(value) { - this.forEachObserver((observer) => { - observer.next(value); - }); - } - error(error) { - this.forEachObserver((observer) => { - observer.error(error); - }); - this.close(error); - } - complete() { - this.forEachObserver((observer) => { - observer.complete(); - }); - this.close(); - } - /** - * Subscribe function that can be used to add an Observer to the fan-out list. - * - * - We require that no event is sent to a subscriber sychronously to their - * call to subscribe(). - */ - subscribe(nextOrObserver, error, complete) { - let observer; - if (nextOrObserver === undefined && - error === undefined && - complete === undefined) { - throw new Error('Missing Observer.'); - } - // Assemble an Observer object when passed as callback functions. - if (implementsAnyMethods(nextOrObserver, [ - 'next', - 'error', - 'complete' - ])) { - observer = nextOrObserver; - } - else { - observer = { - next: nextOrObserver, - error, - complete - }; - } - if (observer.next === undefined) { - observer.next = noop; - } - if (observer.error === undefined) { - observer.error = noop; - } - if (observer.complete === undefined) { - observer.complete = noop; - } - const unsub = this.unsubscribeOne.bind(this, this.observers.length); - // Attempt to subscribe to a terminated Observable - we - // just respond to the Observer with the final error or complete - // event. - if (this.finalized) { - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.task.then(() => { - try { - if (this.finalError) { - observer.error(this.finalError); - } - else { - observer.complete(); - } - } - catch (e) { - // nothing - } - return; - }); - } - this.observers.push(observer); - return unsub; - } - // Unsubscribe is synchronous - we guarantee that no events are sent to - // any unsubscribed Observer. - unsubscribeOne(i) { - if (this.observers === undefined || this.observers[i] === undefined) { - return; - } - delete this.observers[i]; - this.observerCount -= 1; - if (this.observerCount === 0 && this.onNoObservers !== undefined) { - this.onNoObservers(this); - } - } - forEachObserver(fn) { - if (this.finalized) { - // Already closed by previous event....just eat the additional values. - return; - } - // Since sendOne calls asynchronously - there is no chance that - // this.observers will become undefined. - for (let i = 0; i < this.observers.length; i++) { - this.sendOne(i, fn); - } - } - // Call the Observer via one of it's callback function. We are careful to - // confirm that the observe has not been unsubscribed since this asynchronous - // function had been queued. - sendOne(i, fn) { - // Execute the callback asynchronously - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.task.then(() => { - if (this.observers !== undefined && this.observers[i] !== undefined) { - try { - fn(this.observers[i]); - } - catch (e) { - // Ignore exceptions raised in Observers or missing methods of an - // Observer. - // Log error to console. b/31404806 - if (typeof console !== 'undefined' && console.error) { - console.error(e); - } - } - } - }); - } - close(err) { - if (this.finalized) { - return; - } - this.finalized = true; - if (err !== undefined) { - this.finalError = err; - } - // Proxy is no longer needed - garbage collect references - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.task.then(() => { - this.observers = undefined; - this.onNoObservers = undefined; - }); - } -} -/** Turn synchronous function into one called asynchronously. */ -// eslint-disable-next-line @typescript-eslint/ban-types -function async(fn, onError) { - return (...args) => { - Promise.resolve(true) - .then(() => { - fn(...args); - }) - .catch((error) => { - if (onError) { - onError(error); - } - }); - }; -} -/** - * Return true if the object passed in implements any of the named methods. - */ -function implementsAnyMethods(obj, methods) { - if (typeof obj !== 'object' || obj === null) { - return false; - } - for (const method of methods) { - if (method in obj && typeof obj[method] === 'function') { - return true; - } - } - return false; -} -function noop() { - // do nothing -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Check to make sure the appropriate number of arguments are provided for a public function. - * Throws an error if it fails. - * - * @param fnName The function name - * @param minCount The minimum number of arguments to allow for the function call - * @param maxCount The maximum number of argument to allow for the function call - * @param argCount The actual number of arguments provided. - */ -const validateArgCount = function (fnName, minCount, maxCount, argCount) { - let argError; - if (argCount < minCount) { - argError = 'at least ' + minCount; - } - else if (argCount > maxCount) { - argError = maxCount === 0 ? 'none' : 'no more than ' + maxCount; - } - if (argError) { - const error = fnName + - ' failed: Was called with ' + - argCount + - (argCount === 1 ? ' argument.' : ' arguments.') + - ' Expects ' + - argError + - '.'; - throw new Error(error); - } -}; -/** - * Generates a string to prefix an error message about failed argument validation - * - * @param fnName The function name - * @param argName The name of the argument - * @return The prefix to add to the error thrown for validation. - */ -function errorPrefix(fnName, argName) { - return `${fnName} failed: ${argName} argument `; -} -/** - * @param fnName - * @param argumentNumber - * @param namespace - * @param optional - */ -function validateNamespace(fnName, namespace, optional) { - if (optional && !namespace) { - return; - } - if (typeof namespace !== 'string') { - //TODO: I should do more validation here. We only allow certain chars in namespaces. - throw new Error(errorPrefix(fnName, 'namespace') + 'must be a valid firebase namespace.'); - } -} -function validateCallback(fnName, argumentName, -// eslint-disable-next-line @typescript-eslint/ban-types -callback, optional) { - if (optional && !callback) { - return; - } - if (typeof callback !== 'function') { - throw new Error(errorPrefix(fnName, argumentName) + 'must be a valid function.'); - } -} -function validateContextObject(fnName, argumentName, context, optional) { - if (optional && !context) { - return; - } - if (typeof context !== 'object' || context === null) { - throw new Error(errorPrefix(fnName, argumentName) + 'must be a valid context object.'); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -// Code originally came from goog.crypt.stringToUtf8ByteArray, but for some reason they -// automatically replaced '\r\n' with '\n', and they didn't handle surrogate pairs, -// so it's been modified. -// Note that not all Unicode characters appear as single characters in JavaScript strings. -// fromCharCode returns the UTF-16 encoding of a character - so some Unicode characters -// use 2 characters in Javascript. All 4-byte UTF-8 characters begin with a first -// character in the range 0xD800 - 0xDBFF (the first character of a so-called surrogate -// pair). -// See http://www.ecma-international.org/ecma-262/5.1/#sec-15.1.3 -/** - * @param {string} str - * @return {Array} - */ -const stringToByteArray = function (str) { - const out = []; - let p = 0; - for (let i = 0; i < str.length; i++) { - let c = str.charCodeAt(i); - // Is this the lead surrogate in a surrogate pair? - if (c >= 0xd800 && c <= 0xdbff) { - const high = c - 0xd800; // the high 10 bits. - i++; - assert(i < str.length, 'Surrogate pair missing trail surrogate.'); - const low = str.charCodeAt(i) - 0xdc00; // the low 10 bits. - c = 0x10000 + (high << 10) + low; - } - if (c < 128) { - out[p++] = c; - } - else if (c < 2048) { - out[p++] = (c >> 6) | 192; - out[p++] = (c & 63) | 128; - } - else if (c < 65536) { - out[p++] = (c >> 12) | 224; - out[p++] = ((c >> 6) & 63) | 128; - out[p++] = (c & 63) | 128; - } - else { - out[p++] = (c >> 18) | 240; - out[p++] = ((c >> 12) & 63) | 128; - out[p++] = ((c >> 6) & 63) | 128; - out[p++] = (c & 63) | 128; - } - } - return out; -}; -/** - * Calculate length without actually converting; useful for doing cheaper validation. - * @param {string} str - * @return {number} - */ -const stringLength = function (str) { - let p = 0; - for (let i = 0; i < str.length; i++) { - const c = str.charCodeAt(i); - if (c < 128) { - p++; - } - else if (c < 2048) { - p += 2; - } - else if (c >= 0xd800 && c <= 0xdbff) { - // Lead surrogate of a surrogate pair. The pair together will take 4 bytes to represent. - p += 4; - i++; // skip trail surrogate. - } - else { - p += 3; - } - } - return p; -}; - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * The amount of milliseconds to exponentially increase. - */ -const DEFAULT_INTERVAL_MILLIS = 1000; -/** - * The factor to backoff by. - * Should be a number greater than 1. - */ -const DEFAULT_BACKOFF_FACTOR = 2; -/** - * The maximum milliseconds to increase to. - * - *

Visible for testing - */ -const MAX_VALUE_MILLIS = 4 * 60 * 60 * 1000; // Four hours, like iOS and Android. -/** - * The percentage of backoff time to randomize by. - * See - * http://go/safe-client-behavior#step-1-determine-the-appropriate-retry-interval-to-handle-spike-traffic - * for context. - * - *

Visible for testing - */ -const RANDOM_FACTOR = 0.5; -/** - * Based on the backoff method from - * https://github.com/google/closure-library/blob/master/closure/goog/math/exponentialbackoff.js. - * Extracted here so we don't need to pass metadata and a stateful ExponentialBackoff object around. - */ -function calculateBackoffMillis(backoffCount, intervalMillis = DEFAULT_INTERVAL_MILLIS, backoffFactor = DEFAULT_BACKOFF_FACTOR) { - // Calculates an exponentially increasing value. - // Deviation: calculates value from count and a constant interval, so we only need to save value - // and count to restore state. - const currBaseValue = intervalMillis * Math.pow(backoffFactor, backoffCount); - // A random "fuzz" to avoid waves of retries. - // Deviation: randomFactor is required. - const randomWait = Math.round( - // A fraction of the backoff value to add/subtract. - // Deviation: changes multiplication order to improve readability. - RANDOM_FACTOR * - currBaseValue * - // A random float (rounded to int by Math.round above) in the range [-1, 1]. Determines - // if we add or subtract. - (Math.random() - 0.5) * - 2); - // Limits backoff to max to avoid effectively permanent backoff. - return Math.min(MAX_VALUE_MILLIS, currBaseValue + randomWait); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Provide English ordinal letters after a number - */ -function ordinal(i) { - if (!Number.isFinite(i)) { - return `${i}`; - } - return i + indicator(i); -} -function indicator(i) { - i = Math.abs(i); - const cent = i % 100; - if (cent >= 10 && cent <= 20) { - return 'th'; - } - const dec = i % 10; - if (dec === 1) { - return 'st'; - } - if (dec === 2) { - return 'nd'; - } - if (dec === 3) { - return 'rd'; - } - return 'th'; -} - -/** - * @license - * Copyright 2021 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function getModularInstance(service) { - if (service && service._delegate) { - return service._delegate; - } - else { - return service; - } -} - -/** - * @license - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function promisifyRequest(request, errorMessage) { - return new Promise((resolve, reject) => { - request.onsuccess = event => { - resolve(event.target.result); - }; - request.onerror = event => { - var _a; - reject(`${errorMessage}: ${(_a = event.target.error) === null || _a === void 0 ? void 0 : _a.message}`); - }; - }); -} -class DBWrapper { - constructor(_db) { - this._db = _db; - this.objectStoreNames = this._db.objectStoreNames; - } - transaction(storeNames, mode) { - return new TransactionWrapper(this._db.transaction.call(this._db, storeNames, mode)); - } - createObjectStore(storeName, options) { - return new ObjectStoreWrapper(this._db.createObjectStore(storeName, options)); - } - close() { - this._db.close(); - } -} -class TransactionWrapper { - constructor(_transaction) { - this._transaction = _transaction; - this.complete = new Promise((resolve, reject) => { - this._transaction.oncomplete = function () { - resolve(); - }; - this._transaction.onerror = () => { - reject(this._transaction.error); - }; - this._transaction.onabort = () => { - reject(this._transaction.error); - }; - }); - } - objectStore(storeName) { - return new ObjectStoreWrapper(this._transaction.objectStore(storeName)); - } -} -class ObjectStoreWrapper { - constructor(_store) { - this._store = _store; - } - index(name) { - return new IndexWrapper(this._store.index(name)); - } - createIndex(name, keypath, options) { - return new IndexWrapper(this._store.createIndex(name, keypath, options)); - } - get(key) { - const request = this._store.get(key); - return promisifyRequest(request, 'Error reading from IndexedDB'); - } - put(value, key) { - const request = this._store.put(value, key); - return promisifyRequest(request, 'Error writing to IndexedDB'); - } - delete(key) { - const request = this._store.delete(key); - return promisifyRequest(request, 'Error deleting from IndexedDB'); - } - clear() { - const request = this._store.clear(); - return promisifyRequest(request, 'Error clearing IndexedDB object store'); - } -} -class IndexWrapper { - constructor(_index) { - this._index = _index; - } - get(key) { - const request = this._index.get(key); - return promisifyRequest(request, 'Error reading from IndexedDB'); - } -} -function openDB(dbName, dbVersion, upgradeCallback) { - return new Promise((resolve, reject) => { - try { - const request = indexedDB.open(dbName, dbVersion); - request.onsuccess = event => { - resolve(new DBWrapper(event.target.result)); - }; - request.onerror = event => { - var _a; - reject(`Error opening indexedDB: ${(_a = event.target.error) === null || _a === void 0 ? void 0 : _a.message}`); - }; - request.onupgradeneeded = event => { - upgradeCallback(new DBWrapper(request.result), event.oldVersion, event.newVersion, new TransactionWrapper(request.transaction)); - }; - } - catch (e) { - reject(`Error opening indexedDB: ${e.message}`); - } - }); -} -async function deleteDB(dbName) { - return new Promise((resolve, reject) => { - try { - const request = indexedDB.deleteDatabase(dbName); - request.onsuccess = () => { - resolve(); - }; - request.onerror = event => { - var _a; - reject(`Error deleting indexedDB database "${dbName}": ${(_a = event.target.error) === null || _a === void 0 ? void 0 : _a.message}`); - }; - } - catch (e) { - reject(`Error deleting indexedDB database "${dbName}": ${e.message}`); - } - }); -} - - -//# sourceMappingURL=index.esm2017.js.map - - -/***/ }), - -/***/ "./node_modules/@firebase/webchannel-wrapper/dist/index.esm2017.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@firebase/webchannel-wrapper/dist/index.esm2017.js ***! - \*************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "ErrorCode": () => (/* binding */ ErrorCode), -/* harmony export */ "Event": () => (/* binding */ Event), -/* harmony export */ "EventType": () => (/* binding */ EventType), -/* harmony export */ "FetchXmlHttpFactory": () => (/* binding */ FetchXmlHttpFactory), -/* harmony export */ "Stat": () => (/* binding */ Stat), -/* harmony export */ "WebChannel": () => (/* binding */ WebChannel), -/* harmony export */ "XhrIo": () => (/* binding */ XhrIo), -/* harmony export */ "createWebChannelTransport": () => (/* binding */ createWebChannelTransport), -/* harmony export */ "default": () => (/* binding */ esm), -/* harmony export */ "getStatEventTarget": () => (/* binding */ getStatEventTarget) -/* harmony export */ }); -var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {}; - -var esm = {}; - -/* - - Copyright The Closure Library Authors. - SPDX-License-Identifier: Apache-2.0 -*/ -var k,goog=goog||{},l=commonjsGlobal||self;function aa(){}function ba(a){var b=typeof a;b="object"!=b?b:a?Array.isArray(a)?"array":b:"null";return "array"==b||"object"==b&&"number"==typeof a.length}function p(a){var b=typeof a;return "object"==b&&null!=a||"function"==b}function da(a){return Object.prototype.hasOwnProperty.call(a,ea)&&a[ea]||(a[ea]=++fa)}var ea="closure_uid_"+(1E9*Math.random()>>>0),fa=0;function ha(a,b,c){return a.call.apply(a.bind,arguments)} -function ia(a,b,c){if(!a)throw Error();if(2b?null:"string"===typeof a?a.charAt(b):a[b]}function qa(a){return Array.prototype.concat.apply([],arguments)}function ra(a){const b=a.length;if(0b?1:0}var x;a:{var va=l.navigator;if(va){var wa=va.userAgent;if(wa){x=wa;break a}}x="";}function xa(a,b,c){for(const d in a)b.call(c,a[d],d,a);}function ya(a){const b={};for(const c in a)b[c]=a[c];return b}var za="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" ");function Aa(a,b){let c,d;for(let e=1;eparseFloat(Oa)){Na=String(Qa);break a}}Na=Oa;}var Ga={}; -function Ra(){return Fa(function(){let a=0;const b=ta(String(Na)).split("."),c=ta("9").split("."),d=Math.max(b.length,c.length);for(let h=0;0==a&&h>>0);function hb(a){if("function"===typeof a)return a;a[pb]||(a[pb]=function(b){return a.handleEvent(b)});return a[pb]}function C(){v.call(this);this.i=new $a(this);this.P=this;this.I=null;}t(C,v);C.prototype[B]=!0;C.prototype.removeEventListener=function(a,b,c,d){nb(this,a,b,c,d);}; -function D(a,b){var c,d=a.I;if(d)for(c=[];d;d=d.I)c.push(d);a=a.P;d=b.type||b;if("string"===typeof b)b=new z(b,a);else if(b instanceof z)b.target=b.target||a;else {var e=b;b=new z(d,a);Aa(b,e);}e=!0;if(c)for(var f=c.length-1;0<=f;f--){var h=b.g=c[f];e=qb(h,d,!0,b)&&e;}h=b.g=a;e=qb(h,d,!0,b)&&e;e=qb(h,d,!1,b)&&e;if(c)for(f=0;fnew wb,a=>a.reset()); -class wb{constructor(){this.next=this.g=this.h=null;}set(a,b){this.h=a;this.g=b;this.next=null;}reset(){this.next=this.g=this.h=null;}}function yb(a){l.setTimeout(()=>{throw a;},0);}function zb(a,b){Ab||Bb();Cb||(Ab(),Cb=!0);tb.add(a,b);}var Ab;function Bb(){var a=l.Promise.resolve(void 0);Ab=function(){a.then(Db);};}var Cb=!1,tb=new ub;function Db(){for(var a;a=sb();){try{a.h.call(a.g);}catch(c){yb(c);}var b=vb;b.j(a);100>b.h&&(b.h++,a.next=b.g,b.g=a);}Cb=!1;}function Eb(a,b){C.call(this);this.h=a||1;this.g=b||l;this.j=q(this.kb,this);this.l=Date.now();}t(Eb,C);k=Eb.prototype;k.da=!1;k.S=null;k.kb=function(){if(this.da){var a=Date.now()-this.l;0{a.g=null;a.i&&(a.i=!1,Hb(a));},a.j);const b=a.h;a.h=null;a.m.apply(null,b);}class Ib extends v{constructor(a,b){super();this.m=a;this.j=b;this.h=null;this.i=!1;this.g=null;}l(a){this.h=arguments;this.g?this.i=!0:Hb(this);}M(){super.M();this.g&&(l.clearTimeout(this.g),this.g=null,this.i=!1,this.h=null);}}function E(a){v.call(this);this.h=a;this.g={};}t(E,v);var Jb=[];function Kb(a,b,c,d){Array.isArray(c)||(c&&(Jb[0]=c.toString()),c=Jb);for(var e=0;ed.length)){var e=d[1];if(Array.isArray(e)&&!(1>e.length)){var f=e[0];if("noop"!=f&&"stop"!=f&&"close"!=f)for(var h=1;hr)&&(3!=r||Ja||this.g&&(this.h.h||this.g.ga()||oc(this.g)))){this.I||4!=r||7==b||(8==b||0>=G?I(3):I(2));pc(this);var c=this.g.ba();this.N=c;b:if(qc(this)){var d=oc(this.g);a="";var e=d.length,f=4==O(this.g);if(!this.h.i){if("undefined"===typeof TextDecoder){P(this);rc(this);var h="";break b}this.h.i=new l.TextDecoder;}for(b=0;bb.length)return hc;b=b.substr(d,c);a.C=d+c;return b}k.cancel=function(){this.I=!0;P(this);};function lc(a){a.Y=Date.now()+a.P;xc(a,a.P);} -function xc(a,b){if(null!=a.B)throw Error("WatchDog timer not null");a.B=K(q(a.eb,a),b);}function pc(a){a.B&&(l.clearTimeout(a.B),a.B=null);}k.eb=function(){this.B=null;const a=Date.now();0<=a-this.Y?(Qb(this.j,this.A),2!=this.K&&(I(3),J(17)),P(this),this.o=2,rc(this)):xc(this,this.Y-a);};function rc(a){0==a.l.G||a.I||uc(a.l,a);}function P(a){pc(a);var b=a.L;b&&"function"==typeof b.na&&b.na();a.L=null;Fb(a.W);Lb(a.V);a.g&&(b=a.g,a.g=null,b.abort(),b.na());} -function sc(a,b){try{var c=a.l;if(0!=c.G&&(c.g==a||yc(c.i,a)))if(c.I=a.N,!a.J&&yc(c.i,a)&&3==c.G){try{var d=c.Ca.g.parse(b);}catch(m){d=null;}if(Array.isArray(d)&&3==d.length){var e=d;if(0==e[0])a:{if(!c.u){if(c.g)if(c.g.F+3E3e[2]&&c.N&&0==c.A&&!c.v&&(c.v=K(q(c.ab,c),6E3));if(1>=Cc(c.i)&&c.ka){try{c.ka();}catch(m){}c.ka=void 0;}}else Q(c,11);}else if((a.J||c.g==a)&&zc(c),!sa(b))for(e=c.Ca.g.parse(b),b=0;bb)throw Error("Bad port number "+b);a.m=b;}else a.m=null;}function Sc(a,b,c){b instanceof Rc?(a.h=b,Zc(a.h,a.g)):(c||(b=Uc(b,$c)),a.h=new Rc(b,a.g));}function R(a,b,c){a.h.set(b,c);}function jc(a){R(a,"zx",Math.floor(2147483648*Math.random()).toString(36)+Math.abs(Math.floor(2147483648*Math.random())^Date.now()).toString(36));return a} -function ad(a){return a instanceof U?N(a):new U(a,void 0)}function bd(a,b,c,d){var e=new U(null,void 0);a&&Oc(e,a);b&&Pc(e,b);c&&Qc(e,c);d&&(e.l=d);return e}function Tc(a,b){return a?b?decodeURI(a.replace(/%25/g,"%2525")):decodeURIComponent(a):""}function Uc(a,b,c){return "string"===typeof a?(a=encodeURI(a).replace(b,cd),c&&(a=a.replace(/%25([0-9a-fA-F]{2})/g,"%$1")),a):null}function cd(a){a=a.charCodeAt(0);return "%"+(a>>4&15).toString(16)+(a&15).toString(16)} -var Vc=/[#\/\?@]/g,Xc=/[#\?:]/g,Wc=/[#\?]/g,$c=/[#\?@]/g,Yc=/#/g;function Rc(a,b){this.h=this.g=null;this.i=a||null;this.j=!!b;}function V(a){a.g||(a.g=new S,a.h=0,a.i&&Nc(a.i,function(b,c){a.add(decodeURIComponent(b.replace(/\+/g," ")),c);}));}k=Rc.prototype;k.add=function(a,b){V(this);this.i=null;a=W(this,a);var c=this.g.get(a);c||this.g.set(a,c=[]);c.push(b);this.h+=1;return this}; -function dd(a,b){V(a);b=W(a,b);T(a.g.h,b)&&(a.i=null,a.h-=a.g.get(b).length,a=a.g,T(a.h,b)&&(delete a.h[b],a.i--,a.g.length>2*a.i&&Lc(a)));}function ed(a,b){V(a);b=W(a,b);return T(a.g.h,b)}k.forEach=function(a,b){V(this);this.g.forEach(function(c,d){na(c,function(e){a.call(b,e,d,this);},this);},this);};k.T=function(){V(this);for(var a=this.g.R(),b=this.g.T(),c=[],d=0;d=a.j:!1}function Cc(a){return a.h?1:a.g?a.g.size:0}function yc(a,b){return a.h?a.h==b:a.g?a.g.has(b):!1}function Dc(a,b){a.g?a.g.add(b):a.h=b;} -function Fc(a,b){a.h&&a.h==b?a.h=null:a.g&&a.g.has(b)&&a.g.delete(b);}gd.prototype.cancel=function(){this.i=jd(this);if(this.h)this.h.cancel(),this.h=null;else if(this.g&&0!==this.g.size){for(const a of this.g.values())a.cancel();this.g.clear();}};function jd(a){if(null!=a.h)return a.i.concat(a.h.D);if(null!=a.g&&0!==a.g.size){let b=a.i;for(const c of a.g.values())b=b.concat(c.D);return b}return ra(a.i)}function kd(){}kd.prototype.stringify=function(a){return l.JSON.stringify(a,void 0)};kd.prototype.parse=function(a){return l.JSON.parse(a,void 0)};function ld(){this.g=new kd;}function md(a,b,c){const d=c||"";try{Kc(a,function(e,f){let h=e;p(e)&&(h=rb(e));b.push(d+f+"="+encodeURIComponent(h));});}catch(e){throw b.push(d+"type="+encodeURIComponent("_badmap")),e;}}function nd(a,b){const c=new Mb;if(l.Image){const d=new Image;d.onload=ja(od,c,d,"TestLoadImage: loaded",!0,b);d.onerror=ja(od,c,d,"TestLoadImage: error",!1,b);d.onabort=ja(od,c,d,"TestLoadImage: abort",!1,b);d.ontimeout=ja(od,c,d,"TestLoadImage: timeout",!1,b);l.setTimeout(function(){if(d.ontimeout)d.ontimeout();},1E4);d.src=a;}else b(!1);}function od(a,b,c,d,e){try{b.onload=null,b.onerror=null,b.onabort=null,b.ontimeout=null,e(d);}catch(f){}}function pd(a){this.l=a.$b||null;this.j=a.ib||!1;}t(pd,Yb);pd.prototype.g=function(){return new qd(this.l,this.j)};pd.prototype.i=function(a){return function(){return a}}({});function qd(a,b){C.call(this);this.D=a;this.u=b;this.m=void 0;this.readyState=rd;this.status=0;this.responseType=this.responseText=this.response=this.statusText="";this.onreadystatechange=null;this.v=new Headers;this.h=null;this.C="GET";this.B="";this.g=!1;this.A=this.j=this.l=null;}t(qd,C);var rd=0;k=qd.prototype; -k.open=function(a,b){if(this.readyState!=rd)throw this.abort(),Error("Error reopening a connection");this.C=a;this.B=b;this.readyState=1;sd(this);};k.send=function(a){if(1!=this.readyState)throw this.abort(),Error("need to call open() first. ");this.g=!0;const b={headers:this.v,method:this.C,credentials:this.m,cache:void 0};a&&(b.body=a);(this.D||l).fetch(new Request(this.B,b)).then(this.Va.bind(this),this.ha.bind(this));}; -k.abort=function(){this.response=this.responseText="";this.v=new Headers;this.status=0;this.j&&this.j.cancel("Request was aborted.");1<=this.readyState&&this.g&&4!=this.readyState&&(this.g=!1,td(this));this.readyState=rd;}; -k.Va=function(a){if(this.g&&(this.l=a,this.h||(this.status=this.l.status,this.statusText=this.l.statusText,this.h=a.headers,this.readyState=2,sd(this)),this.g&&(this.readyState=3,sd(this),this.g)))if("arraybuffer"===this.responseType)a.arrayBuffer().then(this.Ta.bind(this),this.ha.bind(this));else if("undefined"!==typeof l.ReadableStream&&"body"in a){this.j=a.body.getReader();if(this.u){if(this.responseType)throw Error('responseType must be empty for "streamBinaryChunks" mode responses.');this.response= -[];}else this.response=this.responseText="",this.A=new TextDecoder;ud(this);}else a.text().then(this.Ua.bind(this),this.ha.bind(this));};function ud(a){a.j.read().then(a.Sa.bind(a)).catch(a.ha.bind(a));}k.Sa=function(a){if(this.g){if(this.u&&a.value)this.response.push(a.value);else if(!this.u){var b=a.value?a.value:new Uint8Array(0);if(b=this.A.decode(b,{stream:!a.done}))this.response=this.responseText+=b;}a.done?td(this):sd(this);3==this.readyState&&ud(this);}}; -k.Ua=function(a){this.g&&(this.response=this.responseText=a,td(this));};k.Ta=function(a){this.g&&(this.response=a,td(this));};k.ha=function(){this.g&&td(this);};function td(a){a.readyState=4;a.l=null;a.j=null;a.A=null;sd(a);}k.setRequestHeader=function(a,b){this.v.append(a,b);};k.getResponseHeader=function(a){return this.h?this.h.get(a.toLowerCase())||"":""}; -k.getAllResponseHeaders=function(){if(!this.h)return "";const a=[],b=this.h.entries();for(var c=b.next();!c.done;)c=c.value,a.push(c[0]+": "+c[1]),c=b.next();return a.join("\r\n")};function sd(a){a.onreadystatechange&&a.onreadystatechange.call(a);}Object.defineProperty(qd.prototype,"withCredentials",{get:function(){return "include"===this.m},set:function(a){this.m=a?"include":"same-origin";}});var vd=l.JSON.parse;function X(a){C.call(this);this.headers=new S;this.u=a||null;this.h=!1;this.C=this.g=null;this.H="";this.m=0;this.j="";this.l=this.F=this.v=this.D=!1;this.B=0;this.A=null;this.J=wd;this.K=this.L=!1;}t(X,C);var wd="",xd=/^https?$/i,yd=["POST","PUT"];k=X.prototype; -k.ea=function(a,b,c,d){if(this.g)throw Error("[goog.net.XhrIo] Object is active with another request="+this.H+"; newUri="+a);b=b?b.toUpperCase():"GET";this.H=a;this.j="";this.m=0;this.D=!1;this.h=!0;this.g=this.u?this.u.g():cc.g();this.C=this.u?Zb(this.u):Zb(cc);this.g.onreadystatechange=q(this.Fa,this);try{this.F=!0,this.g.open(b,String(a),!0),this.F=!1;}catch(f){zd(this,f);return}a=c||"";const e=new S(this.headers);d&&Kc(d,function(f,h){e.set(h,f);});d=oa(e.T());c=l.FormData&&a instanceof l.FormData; -!(0<=ma(yd,b))||d||c||e.set("Content-Type","application/x-www-form-urlencoded;charset=utf-8");e.forEach(function(f,h){this.g.setRequestHeader(h,f);},this);this.J&&(this.g.responseType=this.J);"withCredentials"in this.g&&this.g.withCredentials!==this.L&&(this.g.withCredentials=this.L);try{Ad(this),0=a.i.j-(a.m?1:0))return !1;if(a.m)return a.l=b.D.concat(a.l),!0;if(1==a.G||2==a.G||a.C>=(a.Xa?0:a.Ya))return !1;a.m=K(q(a.Ha,a,b),Od(a,a.C));a.C++;return !0} -k.Ha=function(a){if(this.m)if(this.m=null,1==this.G){if(!a){this.V=Math.floor(1E5*Math.random());a=this.V++;const e=new M(this,this.h,a,void 0);let f=this.s;this.P&&(f?(f=ya(f),Aa(f,this.P)):f=this.P);null===this.o&&(e.H=f);if(this.ja)a:{var b=0;for(var c=0;cm)f=Math.max(0,e[u].h-100),n=!1;else try{md(r,h,"req"+m+"_");}catch(G){d&&d(r);}}if(n){d=h.join("&");break a}}}a=a.l.splice(0,c);b.D=a;return d}function Gc(a){a.g||a.u||(a.Y=1,zb(a.Ga,a),a.A=0);} -function Bc(a){if(a.g||a.u||3<=a.A)return !1;a.Y++;a.u=K(q(a.Ga,a),Od(a,a.A));a.A++;return !0}k.Ga=function(){this.u=null;Rd(this);if(this.$&&!(this.L||null==this.g||0>=this.O)){var a=2*this.O;this.h.info("BP detection timer enabled: "+a);this.B=K(q(this.bb,this),a);}};k.bb=function(){this.B&&(this.B=null,this.h.info("BP detection timeout reached."),this.h.info("Buffering proxy detected and switch to long-polling!"),this.N=!1,this.L=!0,J(10),Ac(this),Rd(this));}; -function wc(a){null!=a.B&&(l.clearTimeout(a.B),a.B=null);}function Rd(a){a.g=new M(a,a.h,"rpc",a.Y);null===a.o&&(a.g.H=a.s);a.g.O=0;var b=N(a.oa);R(b,"RID","rpc");R(b,"SID",a.J);R(b,"CI",a.N?"0":"1");R(b,"AID",a.U);Kd(a,b);R(b,"TYPE","xmlhttp");a.o&&a.s&&Gd(b,a.o,a.s);a.K&&a.g.setTimeout(a.K);var c=a.g;a=a.la;c.K=1;c.v=jc(N(b));c.s=null;c.U=!0;kc(c,a);}k.ab=function(){null!=this.v&&(this.v=null,Ac(this),Bc(this),J(19));};function zc(a){null!=a.v&&(l.clearTimeout(a.v),a.v=null);} -function uc(a,b){var c=null;if(a.g==b){zc(a);wc(a);a.g=null;var d=2;}else if(yc(a.i,b))c=b.D,Fc(a.i,b),d=1;else return;a.I=b.N;if(0!=a.G)if(b.i)if(1==d){c=b.s?b.s.length:0;b=Date.now()-b.F;var e=a.C;d=Sb();D(d,new Vb(d,c,b,e));Hc(a);}else Gc(a);else if(e=b.o,3==e||0==e&&0 { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "FirebaseError": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__.FirebaseError), -/* harmony export */ "SDK_VERSION": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__.SDK_VERSION), -/* harmony export */ "_DEFAULT_ENTRY_NAME": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__._DEFAULT_ENTRY_NAME), -/* harmony export */ "_addComponent": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__._addComponent), -/* harmony export */ "_addOrOverwriteComponent": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__._addOrOverwriteComponent), -/* harmony export */ "_apps": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__._apps), -/* harmony export */ "_clearComponents": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__._clearComponents), -/* harmony export */ "_components": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__._components), -/* harmony export */ "_getProvider": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__._getProvider), -/* harmony export */ "_registerComponent": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__._registerComponent), -/* harmony export */ "_removeServiceInstance": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__._removeServiceInstance), -/* harmony export */ "deleteApp": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__.deleteApp), -/* harmony export */ "getApp": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__.getApp), -/* harmony export */ "getApps": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__.getApps), -/* harmony export */ "initializeApp": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__.initializeApp), -/* harmony export */ "onLog": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__.onLog), -/* harmony export */ "registerVersion": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__.registerVersion), -/* harmony export */ "setLogLevel": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__.setLogLevel) -/* harmony export */ }); -/* harmony import */ var _firebase_app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @firebase/app */ "./node_modules/@firebase/app/dist/esm/index.esm2017.js"); - - - -var name = "firebase"; -var version = "9.6.9"; - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -(0,_firebase_app__WEBPACK_IMPORTED_MODULE_0__.registerVersion)(name, version, 'app'); -//# sourceMappingURL=index.esm.js.map - - -/***/ }), - -/***/ "./node_modules/firebase/firestore/dist/index.esm.js": -/*!***********************************************************!*\ - !*** ./node_modules/firebase/firestore/dist/index.esm.js ***! - \***********************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "AbstractUserDataWriter": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.AbstractUserDataWriter), -/* harmony export */ "Bytes": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.Bytes), -/* harmony export */ "CACHE_SIZE_UNLIMITED": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.CACHE_SIZE_UNLIMITED), -/* harmony export */ "CollectionReference": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.CollectionReference), -/* harmony export */ "DocumentReference": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.DocumentReference), -/* harmony export */ "DocumentSnapshot": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.DocumentSnapshot), -/* harmony export */ "FieldPath": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.FieldPath), -/* harmony export */ "FieldValue": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.FieldValue), -/* harmony export */ "Firestore": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.Firestore), -/* harmony export */ "FirestoreError": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.FirestoreError), -/* harmony export */ "GeoPoint": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.GeoPoint), -/* harmony export */ "LoadBundleTask": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.LoadBundleTask), -/* harmony export */ "Query": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.Query), -/* harmony export */ "QueryConstraint": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.QueryConstraint), -/* harmony export */ "QueryDocumentSnapshot": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.QueryDocumentSnapshot), -/* harmony export */ "QuerySnapshot": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.QuerySnapshot), -/* harmony export */ "SnapshotMetadata": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.SnapshotMetadata), -/* harmony export */ "Timestamp": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.Timestamp), -/* harmony export */ "Transaction": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.Transaction), -/* harmony export */ "WriteBatch": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.WriteBatch), -/* harmony export */ "_DatabaseId": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__._DatabaseId), -/* harmony export */ "_DocumentKey": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__._DocumentKey), -/* harmony export */ "_EmptyAppCheckTokenProvider": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__._EmptyAppCheckTokenProvider), -/* harmony export */ "_EmptyAuthCredentialsProvider": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__._EmptyAuthCredentialsProvider), -/* harmony export */ "_FieldPath": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__._FieldPath), -/* harmony export */ "_cast": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__._cast), -/* harmony export */ "_debugAssert": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__._debugAssert), -/* harmony export */ "_isBase64Available": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__._isBase64Available), -/* harmony export */ "_logWarn": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__._logWarn), -/* harmony export */ "_setIndexConfiguration": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__._setIndexConfiguration), -/* harmony export */ "_validateIsNotUsedTogether": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__._validateIsNotUsedTogether), -/* harmony export */ "addDoc": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.addDoc), -/* harmony export */ "arrayRemove": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.arrayRemove), -/* harmony export */ "arrayUnion": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.arrayUnion), -/* harmony export */ "clearIndexedDbPersistence": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.clearIndexedDbPersistence), -/* harmony export */ "collection": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.collection), -/* harmony export */ "collectionGroup": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.collectionGroup), -/* harmony export */ "connectFirestoreEmulator": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.connectFirestoreEmulator), -/* harmony export */ "deleteDoc": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.deleteDoc), -/* harmony export */ "deleteField": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.deleteField), -/* harmony export */ "disableNetwork": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.disableNetwork), -/* harmony export */ "doc": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.doc), -/* harmony export */ "documentId": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.documentId), -/* harmony export */ "enableIndexedDbPersistence": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.enableIndexedDbPersistence), -/* harmony export */ "enableMultiTabIndexedDbPersistence": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.enableMultiTabIndexedDbPersistence), -/* harmony export */ "enableNetwork": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.enableNetwork), -/* harmony export */ "endAt": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.endAt), -/* harmony export */ "endBefore": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.endBefore), -/* harmony export */ "ensureFirestoreConfigured": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.ensureFirestoreConfigured), -/* harmony export */ "executeWrite": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.executeWrite), -/* harmony export */ "getDoc": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.getDoc), -/* harmony export */ "getDocFromCache": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.getDocFromCache), -/* harmony export */ "getDocFromServer": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.getDocFromServer), -/* harmony export */ "getDocs": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.getDocs), -/* harmony export */ "getDocsFromCache": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.getDocsFromCache), -/* harmony export */ "getDocsFromServer": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.getDocsFromServer), -/* harmony export */ "getFirestore": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.getFirestore), -/* harmony export */ "increment": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.increment), -/* harmony export */ "initializeFirestore": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.initializeFirestore), -/* harmony export */ "limit": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.limit), -/* harmony export */ "limitToLast": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.limitToLast), -/* harmony export */ "loadBundle": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.loadBundle), -/* harmony export */ "namedQuery": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.namedQuery), -/* harmony export */ "onSnapshot": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.onSnapshot), -/* harmony export */ "onSnapshotsInSync": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.onSnapshotsInSync), -/* harmony export */ "orderBy": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.orderBy), -/* harmony export */ "query": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.query), -/* harmony export */ "queryEqual": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.queryEqual), -/* harmony export */ "refEqual": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.refEqual), -/* harmony export */ "runTransaction": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.runTransaction), -/* harmony export */ "serverTimestamp": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.serverTimestamp), -/* harmony export */ "setDoc": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.setDoc), -/* harmony export */ "setLogLevel": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.setLogLevel), -/* harmony export */ "snapshotEqual": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.snapshotEqual), -/* harmony export */ "startAfter": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.startAfter), -/* harmony export */ "startAt": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.startAt), -/* harmony export */ "terminate": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.terminate), -/* harmony export */ "updateDoc": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.updateDoc), -/* harmony export */ "waitForPendingWrites": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.waitForPendingWrites), -/* harmony export */ "where": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.where), -/* harmony export */ "writeBatch": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.writeBatch) -/* harmony export */ }); -/* harmony import */ var _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @firebase/firestore */ "./node_modules/@firebase/firestore/dist/index.esm2017.js"); - -//# sourceMappingURL=index.esm.js.map - - -/***/ }), - -/***/ "./node_modules/@firebase/app/dist/esm/index.esm2017.js": -/*!**************************************************************!*\ - !*** ./node_modules/@firebase/app/dist/esm/index.esm2017.js ***! - \**************************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "FirebaseError": () => (/* reexport safe */ _firebase_util__WEBPACK_IMPORTED_MODULE_2__.FirebaseError), -/* harmony export */ "SDK_VERSION": () => (/* binding */ SDK_VERSION), -/* harmony export */ "_DEFAULT_ENTRY_NAME": () => (/* binding */ DEFAULT_ENTRY_NAME), -/* harmony export */ "_addComponent": () => (/* binding */ _addComponent), -/* harmony export */ "_addOrOverwriteComponent": () => (/* binding */ _addOrOverwriteComponent), -/* harmony export */ "_apps": () => (/* binding */ _apps), -/* harmony export */ "_clearComponents": () => (/* binding */ _clearComponents), -/* harmony export */ "_components": () => (/* binding */ _components), -/* harmony export */ "_getProvider": () => (/* binding */ _getProvider), -/* harmony export */ "_registerComponent": () => (/* binding */ _registerComponent), -/* harmony export */ "_removeServiceInstance": () => (/* binding */ _removeServiceInstance), -/* harmony export */ "deleteApp": () => (/* binding */ deleteApp), -/* harmony export */ "getApp": () => (/* binding */ getApp), -/* harmony export */ "getApps": () => (/* binding */ getApps), -/* harmony export */ "initializeApp": () => (/* binding */ initializeApp), -/* harmony export */ "onLog": () => (/* binding */ onLog), -/* harmony export */ "registerVersion": () => (/* binding */ registerVersion), -/* harmony export */ "setLogLevel": () => (/* binding */ setLogLevel) -/* harmony export */ }); -/* harmony import */ var _firebase_component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @firebase/component */ "./node_modules/@firebase/component/dist/esm/index.esm2017.js"); -/* harmony import */ var _firebase_logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @firebase/logger */ "./node_modules/@firebase/logger/dist/esm/index.esm2017.js"); -/* harmony import */ var _firebase_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @firebase/util */ "./node_modules/@firebase/util/dist/index.esm2017.js"); - - - - - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -class PlatformLoggerServiceImpl { - constructor(container) { - this.container = container; - } - // In initial implementation, this will be called by installations on - // auth token refresh, and installations will send this string. - getPlatformInfoString() { - const providers = this.container.getProviders(); - // Loop through providers and get library/version pairs from any that are - // version components. - return providers - .map(provider => { - if (isVersionServiceProvider(provider)) { - const service = provider.getImmediate(); - return `${service.library}/${service.version}`; - } - else { - return null; - } - }) - .filter(logString => logString) - .join(' '); - } -} -/** - * - * @param provider check if this provider provides a VersionService - * - * NOTE: Using Provider<'app-version'> is a hack to indicate that the provider - * provides VersionService. The provider is not necessarily a 'app-version' - * provider. - */ -function isVersionServiceProvider(provider) { - const component = provider.getComponent(); - return (component === null || component === void 0 ? void 0 : component.type) === "VERSION" /* VERSION */; -} - -const name$o = "@firebase/app"; -const version$1 = "0.7.19"; - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const logger = new _firebase_logger__WEBPACK_IMPORTED_MODULE_1__.Logger('@firebase/app'); - -const name$n = "@firebase/app-compat"; - -const name$m = "@firebase/analytics-compat"; - -const name$l = "@firebase/analytics"; - -const name$k = "@firebase/app-check-compat"; - -const name$j = "@firebase/app-check"; - -const name$i = "@firebase/auth"; - -const name$h = "@firebase/auth-compat"; - -const name$g = "@firebase/database"; - -const name$f = "@firebase/database-compat"; - -const name$e = "@firebase/functions"; - -const name$d = "@firebase/functions-compat"; - -const name$c = "@firebase/installations"; - -const name$b = "@firebase/installations-compat"; - -const name$a = "@firebase/messaging"; - -const name$9 = "@firebase/messaging-compat"; - -const name$8 = "@firebase/performance"; - -const name$7 = "@firebase/performance-compat"; - -const name$6 = "@firebase/remote-config"; - -const name$5 = "@firebase/remote-config-compat"; - -const name$4 = "@firebase/storage"; - -const name$3 = "@firebase/storage-compat"; - -const name$2 = "@firebase/firestore"; - -const name$1 = "@firebase/firestore-compat"; - -const name = "firebase"; -const version = "9.6.9"; - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * The default app name - * - * @internal - */ -const DEFAULT_ENTRY_NAME = '[DEFAULT]'; -const PLATFORM_LOG_STRING = { - [name$o]: 'fire-core', - [name$n]: 'fire-core-compat', - [name$l]: 'fire-analytics', - [name$m]: 'fire-analytics-compat', - [name$j]: 'fire-app-check', - [name$k]: 'fire-app-check-compat', - [name$i]: 'fire-auth', - [name$h]: 'fire-auth-compat', - [name$g]: 'fire-rtdb', - [name$f]: 'fire-rtdb-compat', - [name$e]: 'fire-fn', - [name$d]: 'fire-fn-compat', - [name$c]: 'fire-iid', - [name$b]: 'fire-iid-compat', - [name$a]: 'fire-fcm', - [name$9]: 'fire-fcm-compat', - [name$8]: 'fire-perf', - [name$7]: 'fire-perf-compat', - [name$6]: 'fire-rc', - [name$5]: 'fire-rc-compat', - [name$4]: 'fire-gcs', - [name$3]: 'fire-gcs-compat', - [name$2]: 'fire-fst', - [name$1]: 'fire-fst-compat', - 'fire-js': 'fire-js', - [name]: 'fire-js-all' -}; - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @internal - */ -const _apps = new Map(); -/** - * Registered components. - * - * @internal - */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const _components = new Map(); -/** - * @param component - the component being added to this app's container - * - * @internal - */ -function _addComponent(app, component) { - try { - app.container.addComponent(component); - } - catch (e) { - logger.debug(`Component ${component.name} failed to register with FirebaseApp ${app.name}`, e); - } -} -/** - * - * @internal - */ -function _addOrOverwriteComponent(app, component) { - app.container.addOrOverwriteComponent(component); -} -/** - * - * @param component - the component to register - * @returns whether or not the component is registered successfully - * - * @internal - */ -function _registerComponent(component) { - const componentName = component.name; - if (_components.has(componentName)) { - logger.debug(`There were multiple attempts to register component ${componentName}.`); - return false; - } - _components.set(componentName, component); - // add the component to existing app instances - for (const app of _apps.values()) { - _addComponent(app, component); - } - return true; -} -/** - * - * @param app - FirebaseApp instance - * @param name - service name - * - * @returns the provider for the service with the matching name - * - * @internal - */ -function _getProvider(app, name) { - const heartbeatController = app.container - .getProvider('heartbeat') - .getImmediate({ optional: true }); - if (heartbeatController) { - void heartbeatController.triggerHeartbeat(); - } - return app.container.getProvider(name); -} -/** - * - * @param app - FirebaseApp instance - * @param name - service name - * @param instanceIdentifier - service instance identifier in case the service supports multiple instances - * - * @internal - */ -function _removeServiceInstance(app, name, instanceIdentifier = DEFAULT_ENTRY_NAME) { - _getProvider(app, name).clearInstance(instanceIdentifier); -} -/** - * Test only - * - * @internal - */ -function _clearComponents() { - _components.clear(); -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const ERRORS = { - ["no-app" /* NO_APP */]: "No Firebase App '{$appName}' has been created - " + - 'call Firebase App.initializeApp()', - ["bad-app-name" /* BAD_APP_NAME */]: "Illegal App name: '{$appName}", - ["duplicate-app" /* DUPLICATE_APP */]: "Firebase App named '{$appName}' already exists with different options or config", - ["app-deleted" /* APP_DELETED */]: "Firebase App named '{$appName}' already deleted", - ["invalid-app-argument" /* INVALID_APP_ARGUMENT */]: 'firebase.{$appName}() takes either no argument or a ' + - 'Firebase App instance.', - ["invalid-log-argument" /* INVALID_LOG_ARGUMENT */]: 'First argument to `onLog` must be null or a function.', - ["storage-open" /* STORAGE_OPEN */]: 'Error thrown when opening storage. Original error: {$originalErrorMessage}.', - ["storage-get" /* STORAGE_GET */]: 'Error thrown when reading from storage. Original error: {$originalErrorMessage}.', - ["storage-set" /* STORAGE_WRITE */]: 'Error thrown when writing to storage. Original error: {$originalErrorMessage}.', - ["storage-delete" /* STORAGE_DELETE */]: 'Error thrown when deleting from storage. Original error: {$originalErrorMessage}.' -}; -const ERROR_FACTORY = new _firebase_util__WEBPACK_IMPORTED_MODULE_2__.ErrorFactory('app', 'Firebase', ERRORS); - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -class FirebaseAppImpl { - constructor(options, config, container) { - this._isDeleted = false; - this._options = Object.assign({}, options); - this._config = Object.assign({}, config); - this._name = config.name; - this._automaticDataCollectionEnabled = - config.automaticDataCollectionEnabled; - this._container = container; - this.container.addComponent(new _firebase_component__WEBPACK_IMPORTED_MODULE_0__.Component('app', () => this, "PUBLIC" /* PUBLIC */)); - } - get automaticDataCollectionEnabled() { - this.checkDestroyed(); - return this._automaticDataCollectionEnabled; - } - set automaticDataCollectionEnabled(val) { - this.checkDestroyed(); - this._automaticDataCollectionEnabled = val; - } - get name() { - this.checkDestroyed(); - return this._name; - } - get options() { - this.checkDestroyed(); - return this._options; - } - get config() { - this.checkDestroyed(); - return this._config; - } - get container() { - return this._container; - } - get isDeleted() { - return this._isDeleted; - } - set isDeleted(val) { - this._isDeleted = val; - } - /** - * This function will throw an Error if the App has already been deleted - - * use before performing API actions on the App. - */ - checkDestroyed() { - if (this.isDeleted) { - throw ERROR_FACTORY.create("app-deleted" /* APP_DELETED */, { appName: this._name }); - } - } -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * The current SDK version. - * - * @public - */ -const SDK_VERSION = version; -function initializeApp(options, rawConfig = {}) { - if (typeof rawConfig !== 'object') { - const name = rawConfig; - rawConfig = { name }; - } - const config = Object.assign({ name: DEFAULT_ENTRY_NAME, automaticDataCollectionEnabled: false }, rawConfig); - const name = config.name; - if (typeof name !== 'string' || !name) { - throw ERROR_FACTORY.create("bad-app-name" /* BAD_APP_NAME */, { - appName: String(name) - }); - } - const existingApp = _apps.get(name); - if (existingApp) { - // return the existing app if options and config deep equal the ones in the existing app. - if ((0,_firebase_util__WEBPACK_IMPORTED_MODULE_2__.deepEqual)(options, existingApp.options) && - (0,_firebase_util__WEBPACK_IMPORTED_MODULE_2__.deepEqual)(config, existingApp.config)) { - return existingApp; - } - else { - throw ERROR_FACTORY.create("duplicate-app" /* DUPLICATE_APP */, { appName: name }); - } - } - const container = new _firebase_component__WEBPACK_IMPORTED_MODULE_0__.ComponentContainer(name); - for (const component of _components.values()) { - container.addComponent(component); - } - const newApp = new FirebaseAppImpl(options, config, container); - _apps.set(name, newApp); - return newApp; -} -/** - * Retrieves a {@link @firebase/app#FirebaseApp} instance. - * - * When called with no arguments, the default app is returned. When an app name - * is provided, the app corresponding to that name is returned. - * - * An exception is thrown if the app being retrieved has not yet been - * initialized. - * - * @example - * ```javascript - * // Return the default app - * const app = getApp(); - * ``` - * - * @example - * ```javascript - * // Return a named app - * const otherApp = getApp("otherApp"); - * ``` - * - * @param name - Optional name of the app to return. If no name is - * provided, the default is `"[DEFAULT]"`. - * - * @returns The app corresponding to the provided app name. - * If no app name is provided, the default app is returned. - * - * @public - */ -function getApp(name = DEFAULT_ENTRY_NAME) { - const app = _apps.get(name); - if (!app) { - throw ERROR_FACTORY.create("no-app" /* NO_APP */, { appName: name }); - } - return app; -} -/** - * A (read-only) array of all initialized apps. - * @public - */ -function getApps() { - return Array.from(_apps.values()); -} -/** - * Renders this app unusable and frees the resources of all associated - * services. - * - * @example - * ```javascript - * deleteApp(app) - * .then(function() { - * console.log("App deleted successfully"); - * }) - * .catch(function(error) { - * console.log("Error deleting app:", error); - * }); - * ``` - * - * @public - */ -async function deleteApp(app) { - const name = app.name; - if (_apps.has(name)) { - _apps.delete(name); - await Promise.all(app.container - .getProviders() - .map(provider => provider.delete())); - app.isDeleted = true; - } -} -/** - * Registers a library's name and version for platform logging purposes. - * @param library - Name of 1p or 3p library (e.g. firestore, angularfire) - * @param version - Current version of that library. - * @param variant - Bundle variant, e.g., node, rn, etc. - * - * @public - */ -function registerVersion(libraryKeyOrName, version, variant) { - var _a; - // TODO: We can use this check to whitelist strings when/if we set up - // a good whitelist system. - let library = (_a = PLATFORM_LOG_STRING[libraryKeyOrName]) !== null && _a !== void 0 ? _a : libraryKeyOrName; - if (variant) { - library += `-${variant}`; - } - const libraryMismatch = library.match(/\s|\//); - const versionMismatch = version.match(/\s|\//); - if (libraryMismatch || versionMismatch) { - const warning = [ - `Unable to register library "${library}" with version "${version}":` - ]; - if (libraryMismatch) { - warning.push(`library name "${library}" contains illegal characters (whitespace or "/")`); - } - if (libraryMismatch && versionMismatch) { - warning.push('and'); - } - if (versionMismatch) { - warning.push(`version name "${version}" contains illegal characters (whitespace or "/")`); - } - logger.warn(warning.join(' ')); - return; - } - _registerComponent(new _firebase_component__WEBPACK_IMPORTED_MODULE_0__.Component(`${library}-version`, () => ({ library, version }), "VERSION" /* VERSION */)); -} -/** - * Sets log handler for all Firebase SDKs. - * @param logCallback - An optional custom log handler that executes user code whenever - * the Firebase SDK makes a logging call. - * - * @public - */ -function onLog(logCallback, options) { - if (logCallback !== null && typeof logCallback !== 'function') { - throw ERROR_FACTORY.create("invalid-log-argument" /* INVALID_LOG_ARGUMENT */); - } - (0,_firebase_logger__WEBPACK_IMPORTED_MODULE_1__.setUserLogHandler)(logCallback, options); -} -/** - * Sets log level for all Firebase SDKs. - * - * All of the log types above the current log level are captured (i.e. if - * you set the log level to `info`, errors are logged, but `debug` and - * `verbose` logs are not). - * - * @public - */ -function setLogLevel(logLevel) { - (0,_firebase_logger__WEBPACK_IMPORTED_MODULE_1__.setLogLevel)(logLevel); -} - -/** - * @license - * Copyright 2021 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const DB_NAME = 'firebase-heartbeat-database'; -const DB_VERSION = 1; -const STORE_NAME = 'firebase-heartbeat-store'; -let dbPromise = null; -function getDbPromise() { - if (!dbPromise) { - dbPromise = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_2__.openDB)(DB_NAME, DB_VERSION, (db, oldVersion) => { - // We don't use 'break' in this switch statement, the fall-through - // behavior is what we want, because if there are multiple versions between - // the old version and the current version, we want ALL the migrations - // that correspond to those versions to run, not only the last one. - // eslint-disable-next-line default-case - switch (oldVersion) { - case 0: - db.createObjectStore(STORE_NAME); - } - }).catch(e => { - throw ERROR_FACTORY.create("storage-open" /* STORAGE_OPEN */, { - originalErrorMessage: e.message - }); - }); - } - return dbPromise; -} -async function readHeartbeatsFromIndexedDB(app) { - try { - const db = await getDbPromise(); - return db - .transaction(STORE_NAME) - .objectStore(STORE_NAME) - .get(computeKey(app)); - } - catch (e) { - throw ERROR_FACTORY.create("storage-get" /* STORAGE_GET */, { - originalErrorMessage: e.message - }); - } -} -async function writeHeartbeatsToIndexedDB(app, heartbeatObject) { - try { - const db = await getDbPromise(); - const tx = db.transaction(STORE_NAME, 'readwrite'); - const objectStore = tx.objectStore(STORE_NAME); - await objectStore.put(heartbeatObject, computeKey(app)); - return tx.complete; - } - catch (e) { - throw ERROR_FACTORY.create("storage-set" /* STORAGE_WRITE */, { - originalErrorMessage: e.message - }); - } -} -function computeKey(app) { - return `${app.name}!${app.options.appId}`; -} - -/** - * @license - * Copyright 2021 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const MAX_HEADER_BYTES = 1024; -// 30 days -const STORED_HEARTBEAT_RETENTION_MAX_MILLIS = 30 * 24 * 60 * 60 * 1000; -class HeartbeatServiceImpl { - constructor(container) { - this.container = container; - /** - * In-memory cache for heartbeats, used by getHeartbeatsHeader() to generate - * the header string. - * Stores one record per date. This will be consolidated into the standard - * format of one record per user agent string before being sent as a header. - * Populated from indexedDB when the controller is instantiated and should - * be kept in sync with indexedDB. - * Leave public for easier testing. - */ - this._heartbeatsCache = null; - const app = this.container.getProvider('app').getImmediate(); - this._storage = new HeartbeatStorageImpl(app); - this._heartbeatsCachePromise = this._storage.read().then(result => { - this._heartbeatsCache = result; - return result; - }); - } - /** - * Called to report a heartbeat. The function will generate - * a HeartbeatsByUserAgent object, update heartbeatsCache, and persist it - * to IndexedDB. - * Note that we only store one heartbeat per day. So if a heartbeat for today is - * already logged, subsequent calls to this function in the same day will be ignored. - */ - async triggerHeartbeat() { - const platformLogger = this.container - .getProvider('platform-logger') - .getImmediate(); - // This is the "Firebase user agent" string from the platform logger - // service, not the browser user agent. - const agent = platformLogger.getPlatformInfoString(); - const date = getUTCDateString(); - if (this._heartbeatsCache === null) { - this._heartbeatsCache = await this._heartbeatsCachePromise; - } - // Do not store a heartbeat if one is already stored for this day - // or if a header has already been sent today. - if (this._heartbeatsCache.lastSentHeartbeatDate === date || - this._heartbeatsCache.heartbeats.some(singleDateHeartbeat => singleDateHeartbeat.date === date)) { - return; - } - else { - // There is no entry for this date. Create one. - this._heartbeatsCache.heartbeats.push({ date, agent }); - } - // Remove entries older than 30 days. - this._heartbeatsCache.heartbeats = this._heartbeatsCache.heartbeats.filter(singleDateHeartbeat => { - const hbTimestamp = new Date(singleDateHeartbeat.date).valueOf(); - const now = Date.now(); - return now - hbTimestamp <= STORED_HEARTBEAT_RETENTION_MAX_MILLIS; - }); - return this._storage.overwrite(this._heartbeatsCache); - } - /** - * Returns a base64 encoded string which can be attached to the heartbeat-specific header directly. - * It also clears all heartbeats from memory as well as in IndexedDB. - * - * NOTE: Consuming product SDKs should not send the header if this method - * returns an empty string. - */ - async getHeartbeatsHeader() { - if (this._heartbeatsCache === null) { - await this._heartbeatsCachePromise; - } - // If it's still null or the array is empty, there is no data to send. - if (this._heartbeatsCache === null || - this._heartbeatsCache.heartbeats.length === 0) { - return ''; - } - const date = getUTCDateString(); - // Extract as many heartbeats from the cache as will fit under the size limit. - const { heartbeatsToSend, unsentEntries } = extractHeartbeatsForHeader(this._heartbeatsCache.heartbeats); - const headerString = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_2__.base64urlEncodeWithoutPadding)(JSON.stringify({ version: 2, heartbeats: heartbeatsToSend })); - // Store last sent date to prevent another being logged/sent for the same day. - this._heartbeatsCache.lastSentHeartbeatDate = date; - if (unsentEntries.length > 0) { - // Store any unsent entries if they exist. - this._heartbeatsCache.heartbeats = unsentEntries; - // This seems more likely than emptying the array (below) to lead to some odd state - // since the cache isn't empty and this will be called again on the next request, - // and is probably safest if we await it. - await this._storage.overwrite(this._heartbeatsCache); - } - else { - this._heartbeatsCache.heartbeats = []; - // Do not wait for this, to reduce latency. - void this._storage.overwrite(this._heartbeatsCache); - } - return headerString; - } -} -function getUTCDateString() { - const today = new Date(); - // Returns date format 'YYYY-MM-DD' - return today.toISOString().substring(0, 10); -} -function extractHeartbeatsForHeader(heartbeatsCache, maxSize = MAX_HEADER_BYTES) { - // Heartbeats grouped by user agent in the standard format to be sent in - // the header. - const heartbeatsToSend = []; - // Single date format heartbeats that are not sent. - let unsentEntries = heartbeatsCache.slice(); - for (const singleDateHeartbeat of heartbeatsCache) { - // Look for an existing entry with the same user agent. - const heartbeatEntry = heartbeatsToSend.find(hb => hb.agent === singleDateHeartbeat.agent); - if (!heartbeatEntry) { - // If no entry for this user agent exists, create one. - heartbeatsToSend.push({ - agent: singleDateHeartbeat.agent, - dates: [singleDateHeartbeat.date] - }); - if (countBytes(heartbeatsToSend) > maxSize) { - // If the header would exceed max size, remove the added heartbeat - // entry and stop adding to the header. - heartbeatsToSend.pop(); - break; - } - } - else { - heartbeatEntry.dates.push(singleDateHeartbeat.date); - // If the header would exceed max size, remove the added date - // and stop adding to the header. - if (countBytes(heartbeatsToSend) > maxSize) { - heartbeatEntry.dates.pop(); - break; - } - } - // Pop unsent entry from queue. (Skipped if adding the entry exceeded - // quota and the loop breaks early.) - unsentEntries = unsentEntries.slice(1); - } - return { - heartbeatsToSend, - unsentEntries - }; -} -class HeartbeatStorageImpl { - constructor(app) { - this.app = app; - this._canUseIndexedDBPromise = this.runIndexedDBEnvironmentCheck(); - } - async runIndexedDBEnvironmentCheck() { - if (!(0,_firebase_util__WEBPACK_IMPORTED_MODULE_2__.isIndexedDBAvailable)()) { - return false; - } - else { - return (0,_firebase_util__WEBPACK_IMPORTED_MODULE_2__.validateIndexedDBOpenable)() - .then(() => true) - .catch(() => false); - } - } - /** - * Read all heartbeats. - */ - async read() { - const canUseIndexedDB = await this._canUseIndexedDBPromise; - if (!canUseIndexedDB) { - return { heartbeats: [] }; - } - else { - const idbHeartbeatObject = await readHeartbeatsFromIndexedDB(this.app); - return idbHeartbeatObject || { heartbeats: [] }; - } - } - // overwrite the storage with the provided heartbeats - async overwrite(heartbeatsObject) { - var _a; - const canUseIndexedDB = await this._canUseIndexedDBPromise; - if (!canUseIndexedDB) { - return; - } - else { - const existingHeartbeatsObject = await this.read(); - return writeHeartbeatsToIndexedDB(this.app, { - lastSentHeartbeatDate: (_a = heartbeatsObject.lastSentHeartbeatDate) !== null && _a !== void 0 ? _a : existingHeartbeatsObject.lastSentHeartbeatDate, - heartbeats: heartbeatsObject.heartbeats - }); - } - } - // add heartbeats - async add(heartbeatsObject) { - var _a; - const canUseIndexedDB = await this._canUseIndexedDBPromise; - if (!canUseIndexedDB) { - return; - } - else { - const existingHeartbeatsObject = await this.read(); - return writeHeartbeatsToIndexedDB(this.app, { - lastSentHeartbeatDate: (_a = heartbeatsObject.lastSentHeartbeatDate) !== null && _a !== void 0 ? _a : existingHeartbeatsObject.lastSentHeartbeatDate, - heartbeats: [ - ...existingHeartbeatsObject.heartbeats, - ...heartbeatsObject.heartbeats - ] - }); - } - } -} -/** - * Calculate bytes of a HeartbeatsByUserAgent array after being wrapped - * in a platform logging header JSON object, stringified, and converted - * to base 64. - */ -function countBytes(heartbeatsCache) { - // base64 has a restricted set of characters, all of which should be 1 byte. - return (0,_firebase_util__WEBPACK_IMPORTED_MODULE_2__.base64urlEncodeWithoutPadding)( - // heartbeatsCache wrapper properties - JSON.stringify({ version: 2, heartbeats: heartbeatsCache })).length; -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function registerCoreComponents(variant) { - _registerComponent(new _firebase_component__WEBPACK_IMPORTED_MODULE_0__.Component('platform-logger', container => new PlatformLoggerServiceImpl(container), "PRIVATE" /* PRIVATE */)); - _registerComponent(new _firebase_component__WEBPACK_IMPORTED_MODULE_0__.Component('heartbeat', container => new HeartbeatServiceImpl(container), "PRIVATE" /* PRIVATE */)); - // Register `app` package. - registerVersion(name$o, version$1, variant); - // BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation - registerVersion(name$o, version$1, 'esm2017'); - // Register platform SDK identifier (no version). - registerVersion('fire-js', ''); -} - -/** - * Firebase App - * - * @remarks This package coordinates the communication between the different Firebase components - * @packageDocumentation - */ -registerCoreComponents(''); - - -//# sourceMappingURL=index.esm2017.js.map - - -/***/ }), - -/***/ "./node_modules/@firebase/component/dist/esm/index.esm2017.js": -/*!********************************************************************!*\ - !*** ./node_modules/@firebase/component/dist/esm/index.esm2017.js ***! - \********************************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Component": () => (/* binding */ Component), -/* harmony export */ "ComponentContainer": () => (/* binding */ ComponentContainer), -/* harmony export */ "Provider": () => (/* binding */ Provider) -/* harmony export */ }); -/* harmony import */ var _firebase_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @firebase/util */ "./node_modules/@firebase/util/dist/index.esm2017.js"); - - -/** - * Component for service name T, e.g. `auth`, `auth-internal` - */ -class Component { - /** - * - * @param name The public service name, e.g. app, auth, firestore, database - * @param instanceFactory Service factory responsible for creating the public interface - * @param type whether the service provided by the component is public or private - */ - constructor(name, instanceFactory, type) { - this.name = name; - this.instanceFactory = instanceFactory; - this.type = type; - this.multipleInstances = false; - /** - * Properties to be added to the service namespace - */ - this.serviceProps = {}; - this.instantiationMode = "LAZY" /* LAZY */; - this.onInstanceCreated = null; - } - setInstantiationMode(mode) { - this.instantiationMode = mode; - return this; - } - setMultipleInstances(multipleInstances) { - this.multipleInstances = multipleInstances; - return this; - } - setServiceProps(props) { - this.serviceProps = props; - return this; - } - setInstanceCreatedCallback(callback) { - this.onInstanceCreated = callback; - return this; - } -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const DEFAULT_ENTRY_NAME = '[DEFAULT]'; - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Provider for instance for service name T, e.g. 'auth', 'auth-internal' - * NameServiceMapping[T] is an alias for the type of the instance - */ -class Provider { - constructor(name, container) { - this.name = name; - this.container = container; - this.component = null; - this.instances = new Map(); - this.instancesDeferred = new Map(); - this.instancesOptions = new Map(); - this.onInitCallbacks = new Map(); - } - /** - * @param identifier A provider can provide mulitple instances of a service - * if this.component.multipleInstances is true. - */ - get(identifier) { - // if multipleInstances is not supported, use the default name - const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier); - if (!this.instancesDeferred.has(normalizedIdentifier)) { - const deferred = new _firebase_util__WEBPACK_IMPORTED_MODULE_0__.Deferred(); - this.instancesDeferred.set(normalizedIdentifier, deferred); - if (this.isInitialized(normalizedIdentifier) || - this.shouldAutoInitialize()) { - // initialize the service if it can be auto-initialized - try { - const instance = this.getOrInitializeService({ - instanceIdentifier: normalizedIdentifier - }); - if (instance) { - deferred.resolve(instance); - } - } - catch (e) { - // when the instance factory throws an exception during get(), it should not cause - // a fatal error. We just return the unresolved promise in this case. - } - } - } - return this.instancesDeferred.get(normalizedIdentifier).promise; - } - getImmediate(options) { - var _a; - // if multipleInstances is not supported, use the default name - const normalizedIdentifier = this.normalizeInstanceIdentifier(options === null || options === void 0 ? void 0 : options.identifier); - const optional = (_a = options === null || options === void 0 ? void 0 : options.optional) !== null && _a !== void 0 ? _a : false; - if (this.isInitialized(normalizedIdentifier) || - this.shouldAutoInitialize()) { - try { - return this.getOrInitializeService({ - instanceIdentifier: normalizedIdentifier - }); - } - catch (e) { - if (optional) { - return null; - } - else { - throw e; - } - } - } - else { - // In case a component is not initialized and should/can not be auto-initialized at the moment, return null if the optional flag is set, or throw - if (optional) { - return null; - } - else { - throw Error(`Service ${this.name} is not available`); - } - } - } - getComponent() { - return this.component; - } - setComponent(component) { - if (component.name !== this.name) { - throw Error(`Mismatching Component ${component.name} for Provider ${this.name}.`); - } - if (this.component) { - throw Error(`Component for ${this.name} has already been provided`); - } - this.component = component; - // return early without attempting to initialize the component if the component requires explicit initialization (calling `Provider.initialize()`) - if (!this.shouldAutoInitialize()) { - return; - } - // if the service is eager, initialize the default instance - if (isComponentEager(component)) { - try { - this.getOrInitializeService({ instanceIdentifier: DEFAULT_ENTRY_NAME }); - } - catch (e) { - // when the instance factory for an eager Component throws an exception during the eager - // initialization, it should not cause a fatal error. - // TODO: Investigate if we need to make it configurable, because some component may want to cause - // a fatal error in this case? - } - } - // Create service instances for the pending promises and resolve them - // NOTE: if this.multipleInstances is false, only the default instance will be created - // and all promises with resolve with it regardless of the identifier. - for (const [instanceIdentifier, instanceDeferred] of this.instancesDeferred.entries()) { - const normalizedIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier); - try { - // `getOrInitializeService()` should always return a valid instance since a component is guaranteed. use ! to make typescript happy. - const instance = this.getOrInitializeService({ - instanceIdentifier: normalizedIdentifier - }); - instanceDeferred.resolve(instance); - } - catch (e) { - // when the instance factory throws an exception, it should not cause - // a fatal error. We just leave the promise unresolved. - } - } - } - clearInstance(identifier = DEFAULT_ENTRY_NAME) { - this.instancesDeferred.delete(identifier); - this.instancesOptions.delete(identifier); - this.instances.delete(identifier); - } - // app.delete() will call this method on every provider to delete the services - // TODO: should we mark the provider as deleted? - async delete() { - const services = Array.from(this.instances.values()); - await Promise.all([ - ...services - .filter(service => 'INTERNAL' in service) // legacy services - // eslint-disable-next-line @typescript-eslint/no-explicit-any - .map(service => service.INTERNAL.delete()), - ...services - .filter(service => '_delete' in service) // modularized services - // eslint-disable-next-line @typescript-eslint/no-explicit-any - .map(service => service._delete()) - ]); - } - isComponentSet() { - return this.component != null; - } - isInitialized(identifier = DEFAULT_ENTRY_NAME) { - return this.instances.has(identifier); - } - getOptions(identifier = DEFAULT_ENTRY_NAME) { - return this.instancesOptions.get(identifier) || {}; - } - initialize(opts = {}) { - const { options = {} } = opts; - const normalizedIdentifier = this.normalizeInstanceIdentifier(opts.instanceIdentifier); - if (this.isInitialized(normalizedIdentifier)) { - throw Error(`${this.name}(${normalizedIdentifier}) has already been initialized`); - } - if (!this.isComponentSet()) { - throw Error(`Component ${this.name} has not been registered yet`); - } - const instance = this.getOrInitializeService({ - instanceIdentifier: normalizedIdentifier, - options - }); - // resolve any pending promise waiting for the service instance - for (const [instanceIdentifier, instanceDeferred] of this.instancesDeferred.entries()) { - const normalizedDeferredIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier); - if (normalizedIdentifier === normalizedDeferredIdentifier) { - instanceDeferred.resolve(instance); - } - } - return instance; - } - /** - * - * @param callback - a function that will be invoked after the provider has been initialized by calling provider.initialize(). - * The function is invoked SYNCHRONOUSLY, so it should not execute any longrunning tasks in order to not block the program. - * - * @param identifier An optional instance identifier - * @returns a function to unregister the callback - */ - onInit(callback, identifier) { - var _a; - const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier); - const existingCallbacks = (_a = this.onInitCallbacks.get(normalizedIdentifier)) !== null && _a !== void 0 ? _a : new Set(); - existingCallbacks.add(callback); - this.onInitCallbacks.set(normalizedIdentifier, existingCallbacks); - const existingInstance = this.instances.get(normalizedIdentifier); - if (existingInstance) { - callback(existingInstance, normalizedIdentifier); - } - return () => { - existingCallbacks.delete(callback); - }; - } - /** - * Invoke onInit callbacks synchronously - * @param instance the service instance` - */ - invokeOnInitCallbacks(instance, identifier) { - const callbacks = this.onInitCallbacks.get(identifier); - if (!callbacks) { - return; - } - for (const callback of callbacks) { - try { - callback(instance, identifier); - } - catch (_a) { - // ignore errors in the onInit callback - } - } - } - getOrInitializeService({ instanceIdentifier, options = {} }) { - let instance = this.instances.get(instanceIdentifier); - if (!instance && this.component) { - instance = this.component.instanceFactory(this.container, { - instanceIdentifier: normalizeIdentifierForFactory(instanceIdentifier), - options - }); - this.instances.set(instanceIdentifier, instance); - this.instancesOptions.set(instanceIdentifier, options); - /** - * Invoke onInit listeners. - * Note this.component.onInstanceCreated is different, which is used by the component creator, - * while onInit listeners are registered by consumers of the provider. - */ - this.invokeOnInitCallbacks(instance, instanceIdentifier); - /** - * Order is important - * onInstanceCreated() should be called after this.instances.set(instanceIdentifier, instance); which - * makes `isInitialized()` return true. - */ - if (this.component.onInstanceCreated) { - try { - this.component.onInstanceCreated(this.container, instanceIdentifier, instance); - } - catch (_a) { - // ignore errors in the onInstanceCreatedCallback - } - } - } - return instance || null; - } - normalizeInstanceIdentifier(identifier = DEFAULT_ENTRY_NAME) { - if (this.component) { - return this.component.multipleInstances ? identifier : DEFAULT_ENTRY_NAME; - } - else { - return identifier; // assume multiple instances are supported before the component is provided. - } - } - shouldAutoInitialize() { - return (!!this.component && - this.component.instantiationMode !== "EXPLICIT" /* EXPLICIT */); - } -} -// undefined should be passed to the service factory for the default instance -function normalizeIdentifierForFactory(identifier) { - return identifier === DEFAULT_ENTRY_NAME ? undefined : identifier; -} -function isComponentEager(component) { - return component.instantiationMode === "EAGER" /* EAGER */; -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * ComponentContainer that provides Providers for service name T, e.g. `auth`, `auth-internal` - */ -class ComponentContainer { - constructor(name) { - this.name = name; - this.providers = new Map(); - } - /** - * - * @param component Component being added - * @param overwrite When a component with the same name has already been registered, - * if overwrite is true: overwrite the existing component with the new component and create a new - * provider with the new component. It can be useful in tests where you want to use different mocks - * for different tests. - * if overwrite is false: throw an exception - */ - addComponent(component) { - const provider = this.getProvider(component.name); - if (provider.isComponentSet()) { - throw new Error(`Component ${component.name} has already been registered with ${this.name}`); - } - provider.setComponent(component); - } - addOrOverwriteComponent(component) { - const provider = this.getProvider(component.name); - if (provider.isComponentSet()) { - // delete the existing provider from the container, so we can register the new component - this.providers.delete(component.name); - } - this.addComponent(component); - } - /** - * getProvider provides a type safe interface where it can only be called with a field name - * present in NameServiceMapping interface. - * - * Firebase SDKs providing services should extend NameServiceMapping interface to register - * themselves. - */ - getProvider(name) { - if (this.providers.has(name)) { - return this.providers.get(name); - } - // create a Provider for a service that hasn't registered with Firebase - const provider = new Provider(name, this); - this.providers.set(name, provider); - return provider; - } - getProviders() { - return Array.from(this.providers.values()); - } -} - - -//# sourceMappingURL=index.esm2017.js.map - - -/***/ }), - -/***/ "./node_modules/@firebase/logger/dist/esm/index.esm2017.js": -/*!*****************************************************************!*\ - !*** ./node_modules/@firebase/logger/dist/esm/index.esm2017.js ***! - \*****************************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "LogLevel": () => (/* binding */ LogLevel), -/* harmony export */ "Logger": () => (/* binding */ Logger), -/* harmony export */ "setLogLevel": () => (/* binding */ setLogLevel), -/* harmony export */ "setUserLogHandler": () => (/* binding */ setUserLogHandler) -/* harmony export */ }); -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A container for all of the Logger instances - */ -const instances = []; -/** - * The JS SDK supports 5 log levels and also allows a user the ability to - * silence the logs altogether. - * - * The order is a follows: - * DEBUG < VERBOSE < INFO < WARN < ERROR - * - * All of the log types above the current log level will be captured (i.e. if - * you set the log level to `INFO`, errors will still be logged, but `DEBUG` and - * `VERBOSE` logs will not) - */ -var LogLevel; -(function (LogLevel) { - LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG"; - LogLevel[LogLevel["VERBOSE"] = 1] = "VERBOSE"; - LogLevel[LogLevel["INFO"] = 2] = "INFO"; - LogLevel[LogLevel["WARN"] = 3] = "WARN"; - LogLevel[LogLevel["ERROR"] = 4] = "ERROR"; - LogLevel[LogLevel["SILENT"] = 5] = "SILENT"; -})(LogLevel || (LogLevel = {})); -const levelStringToEnum = { - 'debug': LogLevel.DEBUG, - 'verbose': LogLevel.VERBOSE, - 'info': LogLevel.INFO, - 'warn': LogLevel.WARN, - 'error': LogLevel.ERROR, - 'silent': LogLevel.SILENT -}; -/** - * The default log level - */ -const defaultLogLevel = LogLevel.INFO; -/** - * By default, `console.debug` is not displayed in the developer console (in - * chrome). To avoid forcing users to have to opt-in to these logs twice - * (i.e. once for firebase, and once in the console), we are sending `DEBUG` - * logs to the `console.log` function. - */ -const ConsoleMethod = { - [LogLevel.DEBUG]: 'log', - [LogLevel.VERBOSE]: 'log', - [LogLevel.INFO]: 'info', - [LogLevel.WARN]: 'warn', - [LogLevel.ERROR]: 'error' -}; -/** - * The default log handler will forward DEBUG, VERBOSE, INFO, WARN, and ERROR - * messages on to their corresponding console counterparts (if the log method - * is supported by the current log level) - */ -const defaultLogHandler = (instance, logType, ...args) => { - if (logType < instance.logLevel) { - return; - } - const now = new Date().toISOString(); - const method = ConsoleMethod[logType]; - if (method) { - console[method](`[${now}] ${instance.name}:`, ...args); - } - else { - throw new Error(`Attempted to log a message with an invalid logType (value: ${logType})`); - } -}; -class Logger { - /** - * Gives you an instance of a Logger to capture messages according to - * Firebase's logging scheme. - * - * @param name The name that the logs will be associated with - */ - constructor(name) { - this.name = name; - /** - * The log level of the given Logger instance. - */ - this._logLevel = defaultLogLevel; - /** - * The main (internal) log handler for the Logger instance. - * Can be set to a new function in internal package code but not by user. - */ - this._logHandler = defaultLogHandler; - /** - * The optional, additional, user-defined log handler for the Logger instance. - */ - this._userLogHandler = null; - /** - * Capture the current instance for later use - */ - instances.push(this); - } - get logLevel() { - return this._logLevel; - } - set logLevel(val) { - if (!(val in LogLevel)) { - throw new TypeError(`Invalid value "${val}" assigned to \`logLevel\``); - } - this._logLevel = val; - } - // Workaround for setter/getter having to be the same type. - setLogLevel(val) { - this._logLevel = typeof val === 'string' ? levelStringToEnum[val] : val; - } - get logHandler() { - return this._logHandler; - } - set logHandler(val) { - if (typeof val !== 'function') { - throw new TypeError('Value assigned to `logHandler` must be a function'); - } - this._logHandler = val; - } - get userLogHandler() { - return this._userLogHandler; - } - set userLogHandler(val) { - this._userLogHandler = val; - } - /** - * The functions below are all based on the `console` interface - */ - debug(...args) { - this._userLogHandler && this._userLogHandler(this, LogLevel.DEBUG, ...args); - this._logHandler(this, LogLevel.DEBUG, ...args); - } - log(...args) { - this._userLogHandler && - this._userLogHandler(this, LogLevel.VERBOSE, ...args); - this._logHandler(this, LogLevel.VERBOSE, ...args); - } - info(...args) { - this._userLogHandler && this._userLogHandler(this, LogLevel.INFO, ...args); - this._logHandler(this, LogLevel.INFO, ...args); - } - warn(...args) { - this._userLogHandler && this._userLogHandler(this, LogLevel.WARN, ...args); - this._logHandler(this, LogLevel.WARN, ...args); - } - error(...args) { - this._userLogHandler && this._userLogHandler(this, LogLevel.ERROR, ...args); - this._logHandler(this, LogLevel.ERROR, ...args); - } -} -function setLogLevel(level) { - instances.forEach(inst => { - inst.setLogLevel(level); - }); -} -function setUserLogHandler(logCallback, options) { - for (const instance of instances) { - let customLogLevel = null; - if (options && options.level) { - customLogLevel = levelStringToEnum[options.level]; - } - if (logCallback === null) { - instance.userLogHandler = null; - } - else { - instance.userLogHandler = (instance, level, ...args) => { - const message = args - .map(arg => { - if (arg == null) { - return null; - } - else if (typeof arg === 'string') { - return arg; - } - else if (typeof arg === 'number' || typeof arg === 'boolean') { - return arg.toString(); - } - else if (arg instanceof Error) { - return arg.message; - } - else { - try { - return JSON.stringify(arg); - } - catch (ignored) { - return null; - } - } - }) - .filter(arg => arg) - .join(' '); - if (level >= (customLogLevel !== null && customLogLevel !== void 0 ? customLogLevel : instance.logLevel)) { - logCallback({ - level: LogLevel[level].toLowerCase(), - message, - args, - type: instance.name - }); - } - }; - } - } -} - - -//# sourceMappingURL=index.esm2017.js.map - - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/global */ -/******/ (() => { -/******/ __webpack_require__.g = (function() { -/******/ if (typeof globalThis === 'object') return globalThis; -/******/ try { -/******/ return this || new Function('return this')(); -/******/ } catch (e) { -/******/ if (typeof window === 'object') return window; -/******/ } -/******/ })(); -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. -(() => { -/*!*******************************!*\ - !*** ./src/firebaseConfig.js ***! - \*******************************/ -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "rootDoc": () => (/* binding */ rootDoc) -/* harmony export */ }); -/* harmony import */ var firebase_app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! firebase/app */ "./node_modules/firebase/app/dist/index.esm.js"); -/* harmony import */ var firebase_firestore__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! firebase/firestore */ "./node_modules/firebase/firestore/dist/index.esm.js"); -/* eslint-disable import/prefer-default-export */ - - -var firebaseConfig = { - apiKey: 'AIzaSyCX9WR-j9yv1giYeFsMpbjj2G3p7jNHxIU', - authDomain: 'gse-yeatmanlab.firebaseapp.com', - projectId: 'gse-yeatmanlab', - storageBucket: 'gse-yeatmanlab.appspot.com', - messagingSenderId: '292331000426', - appId: '1:292331000426:web:91a04220991e3405737013', - measurementId: 'G-0TBTMDS993' -}; -var firebaseApp = (0,firebase_app__WEBPACK_IMPORTED_MODULE_0__.initializeApp)(firebaseConfig); -var db = (0,firebase_firestore__WEBPACK_IMPORTED_MODULE_1__.getFirestore)(firebaseApp); -var rootDoc = (0,firebase_firestore__WEBPACK_IMPORTED_MODULE_1__.doc)(db, 'dev', 'richford-20220217'); -})(); - -/******/ })() -; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlyZWJhc2VDb25maWcuYnVuZGxlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUErSDtBQUMvRTtBQUNJO0FBQ21LO0FBQy9DOztBQUV4Szs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLG9EQUFNOztBQUVwQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxzQkFBc0IsNERBQWM7QUFDcEM7QUFDQSw4QkFBOEIsRUFBRSxLQUFLLEVBQUU7QUFDdkM7QUFDQTs7QUFFQTtBQUNBLHNCQUFzQiw0REFBYztBQUNwQztBQUNBLDhCQUE4QixFQUFFLEtBQUssRUFBRTtBQUN2QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQiwyREFBYTtBQUNuQztBQUNBLDZCQUE2QixFQUFFLEtBQUssRUFBRTtBQUN0QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLEVBQUU7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUVBQW1FLHlEQUFhO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsVUFBVSxVQUFVLFVBQVUsS0FBSyxhQUFhO0FBQ2pGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0hBQWdILEVBQUU7QUFDbEg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0dBQWtHLDBDQUEwQyxnQkFBZ0I7QUFDNUo7QUFDQSxvRkFBb0Ysd0JBQXdCO0FBQzVHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJFQUEyRTtBQUMzRTtBQUNBLG9CQUFvQixPQUFPO0FBQzNCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxlQUFlO0FBQzdCO0FBQ0EsNEJBQTRCLGNBQWM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxnSEFBZ0g7QUFDcEg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixpQkFBaUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsaUJBQWlCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRCxPQUFPO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixPQUFPO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEZBQTBGLEVBQUU7QUFDNUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUZBQXVGLEVBQUU7QUFDekY7QUFDQTtBQUNBO0FBQ0EsY0FBYyxjQUFjO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLGNBQWM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsY0FBYztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSwyQkFBMkIsRUFBRTs7QUFFN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNElBQTRJO0FBQzVJOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLFNBQVMsSUFBSSxhQUFhLElBQUksZ0NBQWdDLEdBQUcsZ0JBQWdCLG1CQUFtQixJQUFJLGlCQUFpQixvQkFBb0I7QUFDeEs7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaURBQWlEO0FBQ2pELGtCQUFrQixpQ0FBaUMsRUFBRSxNQUFNLEVBQUUsWUFBWTtBQUN6RTtBQUNBO0FBQ0Esd0VBQXdFLGNBQWM7QUFDdEYsOEZBQThGO0FBQzlGLGtCQUFrQiwyQkFBMkIsR0FBRyxNQUFNO0FBQ3RELEtBQUssaUJBQWlCO0FBQ3RCO0FBQ0E7QUFDQSxjQUFjLEVBQUU7QUFDaEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHNCQUFzQjtBQUMxQztBQUNBLG9CQUFvQixzQkFBc0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQix1QkFBdUI7QUFDM0M7QUFDQSwyRkFBMkY7QUFDM0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHVCQUF1QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUdBQXVHO0FBQ3ZHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVJQUF1STtBQUN2STtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxVQUFVLE1BQU0sWUFBWTtBQUMxQzs7QUFFQTtBQUNBLDJCQUEyQixZQUFZLFlBQVksWUFBWTtBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixjQUFjO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixjQUFjO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsY0FBYztBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxjQUFjO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJEQUEyRCxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsY0FBYztBQUMvRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsY0FBYztBQUM1QjtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0M7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxjQUFjLHVDQUF1Qyx1QkFBdUIsY0FBYztBQUN2STtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUVBQWlFO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNELFlBQVk7QUFDbEU7QUFDQSxjQUFjLGFBQWE7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtEO0FBQ2xEO0FBQ0E7QUFDQSx3RkFBd0YsYUFBYTtBQUNyRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsYUFBYTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsaUJBQWlCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDhFQUE4RSxHQUFHLHdDQUF3QztBQUMzSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsa0JBQWtCO0FBQ2pDO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSwyRkFBMkY7QUFDM0Y7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsT0FBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixPQUFPO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7O0FBRWpCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHFEQUFLO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLG9FQUFvQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLHFEQUFLO0FBQy9CO0FBQ0EsMENBQTBDLFdBQVcsZ0JBQWdCO0FBQ3JFO0FBQ0EsOENBQThDLGFBQWE7QUFDM0Q7QUFDQSwrQ0FBK0M7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVEQUF1RCxFQUFFLFlBQVksRUFBRTtBQUN2RTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5RUFBeUU7QUFDekU7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsNEJBQTRCO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtRUFBbUU7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUZBQXVGO0FBQ3ZGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CLDhCQUE4QjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLCtCQUErQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixjQUFjO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJGQUEyRjtBQUMzRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGNBQWM7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsY0FBYztBQUN0QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsbURBQW1EO0FBQ3ZGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQixhQUFhO0FBQ2I7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7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RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsOEJBQThCLDhCQUE4QjtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxrQkFBa0IsR0FBRztBQUNyQixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0Msb0JBQW9CO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYjtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxpQkFBaUI7QUFDakIsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0Q7QUFDeEQsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxxQkFBcUI7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTLDJFQUEyRSxxQkFBcUI7QUFDekc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwRUFBMEUsRUFBRTtBQUM1RTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpR0FBaUcsR0FBRyxJQUFJLEVBQUU7QUFDMUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHdEQUFRO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdELEVBQUUsSUFBSSxxQkFBcUI7QUFDbkY7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsb0JBQW9CLEdBQUcsRUFBRTtBQUM1RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsK0ZBQStGLDREQUFjO0FBQzdHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQiw0REFBYztBQUNwQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RUFBd0UsRUFBRSxJQUFJLEVBQUU7QUFDaEY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixtQkFBbUI7QUFDakQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLHNEQUFzRCxFQUFFO0FBQ3hELEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxhQUFhO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxhQUFhO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxhQUFhO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsYUFBYTtBQUMzQixtQkFBbUIsZ0JBQWdCLGNBQWM7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixvQkFBb0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxFQUFFLEdBQUcsRUFBRTtBQUN2Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxFQUFFLEdBQUcsRUFBRTtBQUMxQyw0Q0FBNEMsTUFBTTtBQUNsRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxFQUFFLEdBQUcsRUFBRTtBQUN2Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJKQUEySixFQUFFLEtBQUssRUFBRTtBQUNwSztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0pBQXNKLEVBQUUsS0FBSyxFQUFFO0FBQy9KO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsbUNBQW1DO0FBQzNEO0FBQ0EsdUdBQXVHLEVBQUUsS0FBSyxFQUFFO0FBQ2hIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdPQUF3TyxFQUFFO0FBQzFPO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELEVBQUU7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpSEFBaUgsRUFBRTtBQUNuSCxxREFBcUQsRUFBRSxpRUFBaUUsRUFBRTtBQUMxSDtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsRUFBRTtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsRUFBRTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QixrQkFBa0I7QUFDbEIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdFQUF3RSxXQUFXO0FBQ25GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLEdBQUc7QUFDNUM7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FLEdBQUcsa0JBQWtCLFNBQVMseUJBQXlCLEdBQUcsb0JBQW9CLEdBQUc7QUFDcko7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZFQUE2RTtBQUM3RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQsRUFBRTtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZGQUE2RixhQUFhO0FBQzFHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RCxFQUFFO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEZBQTRGO0FBQzVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1QsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsT0FBTztBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSw4R0FBOEcsYUFBYTtBQUMzSDtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsRUFBRSxJQUFJLEVBQUUsMENBQTBDLEVBQUUsSUFBSSxFQUFFO0FBQ3JGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGFBQWE7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGNBQWM7QUFDdEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTixvREFBb0QsWUFBWTtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRUFBMkU7QUFDM0U7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsNENBQTRDLDJCQUEyQjtBQUNoRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2R0FBNkc7QUFDN0c7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0ZBQWtGO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpRkFBaUY7QUFDakY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxhQUFhO0FBQzNEO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1GQUFtRjtBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLDhEQUE4RDtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNFQUFzRTtBQUN0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLEdBQUc7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLDBEQUEwRCxFQUFFO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCx5QkFBeUI7QUFDekIsd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrS0FBK0ssK0NBQStDO0FBQzlOLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsRUFBRTtBQUNoRDtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekIsbURBQW1EO0FBQ25EO0FBQ0E7QUFDQSwwRUFBMEU7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGVBQWU7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLHdCQUF3QjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FLEVBQUU7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYjtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsVUFBVTtBQUNWLHVEQUF1RCxHQUFHO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLHdEQUF3RCxHQUFHO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlKQUFpSixFQUFFO0FBQ25KO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSxZQUFZLGtFQUFrQjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxrRUFBa0IsU0FBUyxrRUFBa0I7QUFDNUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxrRUFBa0IsU0FBUyxrRUFBa0I7QUFDNUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVB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LG1DQUFtQyxjQUFjO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsMEJBQTBCLGtFQUFrQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0ZBQWdGLFlBQVksR0FBRyxZQUFZLDZCQUE2QixZQUFZLEdBQUcsV0FBVztBQUNsSztBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyxNQUFNO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGtFQUFrQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQsRUFBRTtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTix3Q0FBd0MsRUFBRTtBQUMxQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0JBQXdCLEVBQUU7QUFDMUI7QUFDQTtBQUNBLGdFQUFnRSxFQUFFLCtCQUErQixFQUFFO0FBQ25HO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxxQkFBcUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksdUJBQXVCLElBQUksdUJBQXVCO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHdCQUF3QixJQUFJLHdCQUF3QjtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxrRUFBa0I7QUFDMUI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDtBQUN0RDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGtCQUFrQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsaUJBQWlCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0Qiw4QkFBOEI7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDLFFBQVE7QUFDdkQ7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyxxQkFBTTtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUscUJBQU07QUFDckIsZUFBZSxxQkFBTTtBQUNyQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsTUFBTTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLGlCQUFpQjtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsYUFBYSxHQUFHLEtBQUs7QUFDakQ7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLGlCQUFpQixJQUFJLFNBQVMsR0FBRyxTQUFTO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELElBQUk7QUFDdkQsS0FBSztBQUNMO0FBQ0EsbUJBQW1CLE1BQU0sSUFBSTs7QUFFN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsWUFBWSxHQUFHO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsWUFBWSxRQUFRO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixhQUFhLFdBQVc7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix5QkFBeUI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLHlCQUF5QjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG9CQUFvQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFFBQVE7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixRQUFRO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixRQUFRO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLFFBQVE7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsU0FBUztBQUNsRDtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsT0FBTztBQUMvQiw2QkFBNkIsUUFBUTtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsMkJBQTJCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVEsVUFBVSxTQUFTO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGdCQUFnQjtBQUNwQztBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQsV0FBVyxRQUFRO0FBQ25CLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsZ0JBQWdCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLEVBQUU7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGFBQWEsSUFBSSwwRUFBMEU7QUFDakg7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixnQkFBZ0IsR0FBRyxnQkFBZ0I7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixvREFBTTs7QUFFekI7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLGdCQUFnQixzQ0FBc0MsU0FBUztBQUNqRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJFQUEyRSxjQUFjO0FBQ3pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixnQkFBZ0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsU0FBUztBQUN6RDtBQUNBLDhEQUE4RCxTQUFTO0FBQ3ZFLGlFQUFpRSxTQUFTO0FBQzFFLDZEQUE2RCxTQUFTO0FBQ3RFLG9FQUFvRSxTQUFTO0FBQzdFO0FBQ0E7QUFDQSw4RkFBOEYsc0JBQXNCO0FBQ3BILGlHQUFpRyxzQkFBc0I7QUFDdkgsaUdBQWlHLHNCQUFzQjtBQUN2SCx3R0FBd0csc0JBQXNCO0FBQzlIO0FBQ0EsMEJBQTBCLHdEQUFZOztBQUV0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4Qyx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsMERBQVM7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEVBQTBFLHFCQUFxQjtBQUMvRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBLG1DQUFtQyxpRUFBaUU7QUFDcEc7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHlEQUFTO0FBQ3JCLFlBQVkseURBQVM7QUFDckI7QUFDQTtBQUNBO0FBQ0EsOEVBQThFLGVBQWU7QUFDN0Y7QUFDQTtBQUNBLDBCQUEwQixtRUFBa0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixpQ0FBaUM7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTRELGVBQWU7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixRQUFRO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsUUFBUSxrQkFBa0IsUUFBUTtBQUM3RTtBQUNBO0FBQ0EsMENBQTBDLFFBQVE7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxRQUFRO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLDBEQUFTLElBQUksUUFBUSxvQkFBb0Isa0JBQWtCO0FBQ3RGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksbUVBQWlCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLDZEQUFhO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHNEQUFNO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWMsU0FBUyxHQUFHLGtCQUFrQjtBQUM1Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0QsYUFBYTtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixrQ0FBa0M7QUFDbEQsNkJBQTZCLDZFQUE2QixrQkFBa0IsMENBQTBDO0FBQ3RIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxvRUFBb0I7QUFDakM7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHlFQUF5QjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyw2RUFBNkI7QUFDeEM7QUFDQSxxQkFBcUIseUNBQXlDO0FBQzlEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsMERBQVM7QUFDcEMsMkJBQTJCLDBEQUFTO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUUyUjtBQUMzUjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNTRCMEM7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRW1EO0FBQ25EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4WkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyw0QkFBNEI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsSUFBSSxLQUFLLGNBQWM7QUFDbkQ7QUFDQTtBQUNBLHNGQUFzRixRQUFRO0FBQzlGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELElBQUk7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRTREO0FBQzVEOzs7Ozs7O1VDMU5BO1VBQ0E7O1VBRUE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7O1VBRUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7Ozs7O1dDdEJBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EseUNBQXlDLHdDQUF3QztXQUNqRjtXQUNBO1dBQ0E7Ozs7O1dDUEE7V0FDQTtXQUNBO1dBQ0E7V0FDQSxHQUFHO1dBQ0g7V0FDQTtXQUNBLENBQUM7Ozs7O1dDUEQ7Ozs7O1dDQUE7V0FDQTtXQUNBO1dBQ0EsdURBQXVELGlCQUFpQjtXQUN4RTtXQUNBLGdEQUFnRCxhQUFhO1dBQzdEOzs7Ozs7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUNBO0FBRUEsSUFBTUcsY0FBYyxHQUFHO0FBQ3JCQyxFQUFBQSxNQUFNLEVBQUUseUNBRGE7QUFFckJDLEVBQUFBLFVBQVUsRUFBRSxnQ0FGUztBQUdyQkMsRUFBQUEsU0FBUyxFQUFFLGdCQUhVO0FBSXJCQyxFQUFBQSxhQUFhLEVBQUUsNEJBSk07QUFLckJDLEVBQUFBLGlCQUFpQixFQUFFLGNBTEU7QUFNckJDLEVBQUFBLEtBQUssRUFBRSwyQ0FOYztBQU9yQkMsRUFBQUEsYUFBYSxFQUFFO0FBUE0sQ0FBdkI7QUFVQSxJQUFNQyxXQUFXLEdBQUdYLDJEQUFhLENBQUNHLGNBQUQsQ0FBakM7QUFDQSxJQUFNUyxFQUFFLEdBQUdYLGdFQUFZLENBQUNVLFdBQUQsQ0FBdkI7QUFDTyxJQUFNRSxPQUFPLEdBQUdYLHVEQUFHLENBQUNVLEVBQUQsRUFBSyxLQUFMLEVBQVksbUJBQVosQ0FBbkIsQyIsInNvdXJjZXMiOlsid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay8uL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvZmlyZXN0b3JlL2Rpc3QvaW5kZXguZXNtMjAxNy5qcyIsIndlYnBhY2s6Ly9hc3Rlcm9pZC1hdHRhY2svLi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL3V0aWwvZGlzdC9pbmRleC5lc20yMDE3LmpzIiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay8uL25vZGVfbW9kdWxlcy9AZmlyZWJhc2Uvd2ViY2hhbm5lbC13cmFwcGVyL2Rpc3QvaW5kZXguZXNtMjAxNy5qcyIsIndlYnBhY2s6Ly9hc3Rlcm9pZC1hdHRhY2svLi9ub2RlX21vZHVsZXMvZmlyZWJhc2UvYXBwL2Rpc3QvaW5kZXguZXNtLmpzIiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay8uL25vZGVfbW9kdWxlcy9maXJlYmFzZS9maXJlc3RvcmUvZGlzdC9pbmRleC5lc20uanMiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrLy4vbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hcHAvZGlzdC9lc20vaW5kZXguZXNtMjAxNy5qcyIsIndlYnBhY2s6Ly9hc3Rlcm9pZC1hdHRhY2svLi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2NvbXBvbmVudC9kaXN0L2VzbS9pbmRleC5lc20yMDE3LmpzIiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay8uL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvbG9nZ2VyL2Rpc3QvZXNtL2luZGV4LmVzbTIwMTcuanMiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrL3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrLy4vc3JjL2ZpcmViYXNlQ29uZmlnLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IF9yZWdpc3RlckNvbXBvbmVudCwgcmVnaXN0ZXJWZXJzaW9uLCBfZ2V0UHJvdmlkZXIsIGdldEFwcCwgX3JlbW92ZVNlcnZpY2VJbnN0YW5jZSwgU0RLX1ZFUlNJT04gfSBmcm9tICdAZmlyZWJhc2UvYXBwJztcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0BmaXJlYmFzZS9jb21wb25lbnQnO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dMZXZlbCB9IGZyb20gJ0BmaXJlYmFzZS9sb2dnZXInO1xuaW1wb3J0IHsgRmlyZWJhc2VFcnJvciwgY3JlYXRlTW9ja1VzZXJUb2tlbiwgZ2V0TW9kdWxhckluc3RhbmNlLCBkZWVwRXF1YWwsIGdldFVBLCBpc0luZGV4ZWREQkF2YWlsYWJsZSwgaXNTYWZhcmksIGlzTW9iaWxlQ29yZG92YSwgaXNSZWFjdE5hdGl2ZSwgaXNFbGVjdHJvbiwgaXNJRSwgaXNVV1AsIGlzQnJvd3NlckV4dGVuc2lvbiB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7IFhocklvLCBFdmVudFR5cGUsIEVycm9yQ29kZSwgY3JlYXRlV2ViQ2hhbm5lbFRyYW5zcG9ydCwgZ2V0U3RhdEV2ZW50VGFyZ2V0LCBGZXRjaFhtbEh0dHBGYWN0b3J5LCBXZWJDaGFubmVsLCBFdmVudCwgU3RhdCB9IGZyb20gJ0BmaXJlYmFzZS93ZWJjaGFubmVsLXdyYXBwZXInO1xuXG5jb25zdCBEID0gXCJAZmlyZWJhc2UvZmlyZXN0b3JlXCI7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFNpbXBsZSB3cmFwcGVyIGFyb3VuZCBhIG51bGxhYmxlIFVJRC4gTW9zdGx5IGV4aXN0cyB0byBtYWtlIGNvZGUgbW9yZVxuICogcmVhZGFibGUuXG4gKi9cbmNsYXNzIEMge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy51aWQgPSB0O1xuICAgIH1cbiAgICBpc0F1dGhlbnRpY2F0ZWQoKSB7XG4gICAgICAgIHJldHVybiBudWxsICE9IHRoaXMudWlkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEga2V5IHJlcHJlc2VudGluZyB0aGlzIHVzZXIsIHN1aXRhYmxlIGZvciBpbmNsdXNpb24gaW4gYVxuICAgICAqIGRpY3Rpb25hcnkuXG4gICAgICovICAgIHRvS2V5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0F1dGhlbnRpY2F0ZWQoKSA/IFwidWlkOlwiICsgdGhpcy51aWQgOiBcImFub255bW91cy11c2VyXCI7XG4gICAgfVxuICAgIGlzRXF1YWwodCkge1xuICAgICAgICByZXR1cm4gdC51aWQgPT09IHRoaXMudWlkO1xuICAgIH1cbn1cblxuLyoqIEEgdXNlciB3aXRoIGEgbnVsbCBVSUQuICovIEMuVU5BVVRIRU5USUNBVEVEID0gbmV3IEMobnVsbCksIFxuLy8gVE9ETyhtaWtlbGVoZW4pOiBMb29rIGludG8gZ2V0dGluZyBhIHByb3BlciB1aWQtZXF1aXZhbGVudCBmb3Jcbi8vIG5vbi1GaXJlYmFzZUF1dGggcHJvdmlkZXJzLlxuQy5HT09HTEVfQ1JFREVOVElBTFMgPSBuZXcgQyhcImdvb2dsZS1jcmVkZW50aWFscy11aWRcIiksIEMuRklSU1RfUEFSVFkgPSBuZXcgQyhcImZpcnN0LXBhcnR5LXVpZFwiKSwgXG5DLk1PQ0tfVVNFUiA9IG5ldyBDKFwibW9jay11c2VyXCIpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xubGV0IHggPSBcIjkuNi45XCI7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5jb25zdCBOID0gbmV3IExvZ2dlcihcIkBmaXJlYmFzZS9maXJlc3RvcmVcIik7XG5cbi8vIEhlbHBlciBtZXRob2RzIGFyZSBuZWVkZWQgYmVjYXVzZSB2YXJpYWJsZXMgY2FuJ3QgYmUgZXhwb3J0ZWQgYXMgcmVhZC93cml0ZVxuZnVuY3Rpb24gaygpIHtcbiAgICByZXR1cm4gTi5sb2dMZXZlbDtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSB2ZXJib3NpdHkgb2YgQ2xvdWQgRmlyZXN0b3JlIGxvZ3MgKGRlYnVnLCBlcnJvciwgb3Igc2lsZW50KS5cbiAqXG4gKiBAcGFyYW0gbG9nTGV2ZWwgLSBUaGUgdmVyYm9zaXR5IHlvdSBzZXQgZm9yIGFjdGl2aXR5IGFuZCBlcnJvciBsb2dnaW5nLiBDYW5cbiAqICAgYmUgYW55IG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOlxuICpcbiAqICAgPHVsPlxuICogICAgIDxsaT5gZGVidWdgIGZvciB0aGUgbW9zdCB2ZXJib3NlIGxvZ2dpbmcgbGV2ZWwsIHByaW1hcmlseSBmb3JcbiAqICAgICBkZWJ1Z2dpbmcuPC9saT5cbiAqICAgICA8bGk+YGVycm9yYCB0byBsb2cgZXJyb3JzIG9ubHkuPC9saT5cbiAqICAgICA8bGk+PGNvZGU+YHNpbGVudGAgdG8gdHVybiBvZmYgbG9nZ2luZy48L2xpPlxuICogICA8L3VsPlxuICovIGZ1bmN0aW9uIE0odCkge1xuICAgIE4uc2V0TG9nTGV2ZWwodCk7XG59XG5cbmZ1bmN0aW9uIE8odCwgLi4uZSkge1xuICAgIGlmIChOLmxvZ0xldmVsIDw9IExvZ0xldmVsLkRFQlVHKSB7XG4gICAgICAgIGNvbnN0IG4gPSBlLm1hcChCKTtcbiAgICAgICAgTi5kZWJ1ZyhgRmlyZXN0b3JlICgke3h9KTogJHt0fWAsIC4uLm4pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gJCh0LCAuLi5lKSB7XG4gICAgaWYgKE4ubG9nTGV2ZWwgPD0gTG9nTGV2ZWwuRVJST1IpIHtcbiAgICAgICAgY29uc3QgbiA9IGUubWFwKEIpO1xuICAgICAgICBOLmVycm9yKGBGaXJlc3RvcmUgKCR7eH0pOiAke3R9YCwgLi4ubik7XG4gICAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovIGZ1bmN0aW9uIEYodCwgLi4uZSkge1xuICAgIGlmIChOLmxvZ0xldmVsIDw9IExvZ0xldmVsLldBUk4pIHtcbiAgICAgICAgY29uc3QgbiA9IGUubWFwKEIpO1xuICAgICAgICBOLndhcm4oYEZpcmVzdG9yZSAoJHt4fSk6ICR7dH1gLCAuLi5uKTtcbiAgICB9XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gYWRkaXRpb25hbCBsb2cgcGFyYW1ldGVyIHRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uLlxuICovIGZ1bmN0aW9uIEIodCkge1xuICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiB0KSByZXR1cm4gdDtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZSA9IHQsIEpTT04uc3RyaW5naWZ5KGUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gQ29udmVydGluZyB0byBKU09OIGZhaWxlZCwganVzdCBsb2cgdGhlIG9iamVjdCBkaXJlY3RseVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9XG4gICAgLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbiAgICAvKiogRm9ybWF0cyBhbiBvYmplY3QgYXMgYSBKU09OIHN0cmluZywgc3VpdGFibGUgZm9yIGxvZ2dpbmcuICovXG4gICAgdmFyIGU7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFVuY29uZGl0aW9uYWxseSBmYWlscywgdGhyb3dpbmcgYW4gRXJyb3Igd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS5cbiAqIE1lc3NhZ2VzIGFyZSBzdHJpcHBlZCBpbiBwcm9kdWN0aW9uIGJ1aWxkcy5cbiAqXG4gKiBSZXR1cm5zIGBuZXZlcmAgYW5kIGNhbiBiZSB1c2VkIGluIGV4cHJlc3Npb25zOlxuICogQGV4YW1wbGVcbiAqIGxldCBmdXR1cmVWYXIgPSBmYWlsKCdub3QgaW1wbGVtZW50ZWQgeWV0Jyk7XG4gKi8gZnVuY3Rpb24gTCh0ID0gXCJVbmV4cGVjdGVkIHN0YXRlXCIpIHtcbiAgICAvLyBMb2cgdGhlIGZhaWx1cmUgaW4gYWRkaXRpb24gdG8gdGhyb3cgYW4gZXhjZXB0aW9uLCBqdXN0IGluIGNhc2UgdGhlXG4gICAgLy8gZXhjZXB0aW9uIGlzIHN3YWxsb3dlZC5cbiAgICBjb25zdCBlID0gYEZJUkVTVE9SRSAoJHt4fSkgSU5URVJOQUwgQVNTRVJUSU9OIEZBSUxFRDogYCArIHQ7XG4gICAgLy8gTk9URTogV2UgZG9uJ3QgdXNlIEZpcmVzdG9yZUVycm9yIGhlcmUgYmVjYXVzZSB0aGVzZSBhcmUgaW50ZXJuYWwgZmFpbHVyZXNcbiAgICAvLyB0aGF0IGNhbm5vdCBiZSBoYW5kbGVkIGJ5IHRoZSB1c2VyLiAoQWxzbyBpdCB3b3VsZCBjcmVhdGUgYSBjaXJjdWxhclxuICAgIC8vIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGUgZXJyb3IgYW5kIGFzc2VydCBtb2R1bGVzIHdoaWNoIGRvZXNuJ3Qgd29yay4pXG4gICAgdGhyb3cgJChlKSwgbmV3IEVycm9yKGUpO1xufVxuXG4vKipcbiAqIEZhaWxzIGlmIHRoZSBnaXZlbiBhc3NlcnRpb24gY29uZGl0aW9uIGlzIGZhbHNlLCB0aHJvd2luZyBhbiBFcnJvciB3aXRoIHRoZVxuICogZ2l2ZW4gbWVzc2FnZSBpZiBpdCBkaWQuXG4gKlxuICogTWVzc2FnZXMgYXJlIHN0cmlwcGVkIGluIHByb2R1Y3Rpb24gYnVpbGRzLlxuICovIGZ1bmN0aW9uIHEodCwgZSkge1xuICAgIHQgfHwgTCgpO1xufVxuXG4vKipcbiAqIEZhaWxzIGlmIHRoZSBnaXZlbiBhc3NlcnRpb24gY29uZGl0aW9uIGlzIGZhbHNlLCB0aHJvd2luZyBhbiBFcnJvciB3aXRoIHRoZVxuICogZ2l2ZW4gbWVzc2FnZSBpZiBpdCBkaWQuXG4gKlxuICogVGhlIGNvZGUgb2YgY2FsbHNpdGVzIGludm9raW5nIHRoaXMgZnVuY3Rpb24gYXJlIHN0cmlwcGVkIG91dCBpbiBwcm9kdWN0aW9uXG4gKiBidWlsZHMuIEFueSBzaWRlLWVmZmVjdHMgb2YgY29kZSB3aXRoaW4gdGhlIGRlYnVnQXNzZXJ0KCkgaW52b2NhdGlvbiB3aWxsIG5vdFxuICogaGFwcGVuIGluIHRoaXMgY2FzZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqLyBmdW5jdGlvbiBVKHQsIGUpIHtcbiAgICB0IHx8IEwoKTtcbn1cblxuLyoqXG4gKiBDYXN0cyBgb2JqYCB0byBgVGAuIEluIG5vbi1wcm9kdWN0aW9uIGJ1aWxkcywgdmVyaWZpZXMgdGhhdCBgb2JqYCBpcyBhblxuICogaW5zdGFuY2Ugb2YgYFRgIGJlZm9yZSBjYXN0aW5nLlxuICovIGZ1bmN0aW9uIEsodCwgXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZSkge1xuICAgIHJldHVybiB0O1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjb25zdCBHID0ge1xuICAgIC8vIENhdXNlcyBhcmUgY29waWVkIGZyb206XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2dycGMvZ3JwYy9ibG9iL2JjZWVjOTRlYTRmYzVmMDA4NWQ4MTIzNWQ4ZTFjMDY3OThkYzM0MWEvaW5jbHVkZS9ncnBjJTJCJTJCL2ltcGwvY29kZWdlbi9zdGF0dXNfY29kZV9lbnVtLmhcbiAgICAvKiogTm90IGFuIGVycm9yOyByZXR1cm5lZCBvbiBzdWNjZXNzLiAqL1xuICAgIE9LOiBcIm9rXCIsXG4gICAgLyoqIFRoZSBvcGVyYXRpb24gd2FzIGNhbmNlbGxlZCAodHlwaWNhbGx5IGJ5IHRoZSBjYWxsZXIpLiAqL1xuICAgIENBTkNFTExFRDogXCJjYW5jZWxsZWRcIixcbiAgICAvKiogVW5rbm93biBlcnJvciBvciBhbiBlcnJvciBmcm9tIGEgZGlmZmVyZW50IGVycm9yIGRvbWFpbi4gKi9cbiAgICBVTktOT1dOOiBcInVua25vd25cIixcbiAgICAvKipcbiAgICAgKiBDbGllbnQgc3BlY2lmaWVkIGFuIGludmFsaWQgYXJndW1lbnQuIE5vdGUgdGhhdCB0aGlzIGRpZmZlcnMgZnJvbVxuICAgICAqIEZBSUxFRF9QUkVDT05ESVRJT04uIElOVkFMSURfQVJHVU1FTlQgaW5kaWNhdGVzIGFyZ3VtZW50cyB0aGF0IGFyZVxuICAgICAqIHByb2JsZW1hdGljIHJlZ2FyZGxlc3Mgb2YgdGhlIHN0YXRlIG9mIHRoZSBzeXN0ZW0gKGUuZy4sIGEgbWFsZm9ybWVkIGZpbGVcbiAgICAgKiBuYW1lKS5cbiAgICAgKi9cbiAgICBJTlZBTElEX0FSR1VNRU5UOiBcImludmFsaWQtYXJndW1lbnRcIixcbiAgICAvKipcbiAgICAgKiBEZWFkbGluZSBleHBpcmVkIGJlZm9yZSBvcGVyYXRpb24gY291bGQgY29tcGxldGUuIEZvciBvcGVyYXRpb25zIHRoYXRcbiAgICAgKiBjaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZSBzeXN0ZW0sIHRoaXMgZXJyb3IgbWF5IGJlIHJldHVybmVkIGV2ZW4gaWYgdGhlXG4gICAgICogb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiBGb3IgZXhhbXBsZSwgYSBzdWNjZXNzZnVsIHJlc3BvbnNlXG4gICAgICogZnJvbSBhIHNlcnZlciBjb3VsZCBoYXZlIGJlZW4gZGVsYXllZCBsb25nIGVub3VnaCBmb3IgdGhlIGRlYWRsaW5lIHRvXG4gICAgICogZXhwaXJlLlxuICAgICAqL1xuICAgIERFQURMSU5FX0VYQ0VFREVEOiBcImRlYWRsaW5lLWV4Y2VlZGVkXCIsXG4gICAgLyoqIFNvbWUgcmVxdWVzdGVkIGVudGl0eSAoZS5nLiwgZmlsZSBvciBkaXJlY3RvcnkpIHdhcyBub3QgZm91bmQuICovXG4gICAgTk9UX0ZPVU5EOiBcIm5vdC1mb3VuZFwiLFxuICAgIC8qKlxuICAgICAqIFNvbWUgZW50aXR5IHRoYXQgd2UgYXR0ZW1wdGVkIHRvIGNyZWF0ZSAoZS5nLiwgZmlsZSBvciBkaXJlY3RvcnkpIGFscmVhZHlcbiAgICAgKiBleGlzdHMuXG4gICAgICovXG4gICAgQUxSRUFEWV9FWElTVFM6IFwiYWxyZWFkeS1leGlzdHNcIixcbiAgICAvKipcbiAgICAgKiBUaGUgY2FsbGVyIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBleGVjdXRlIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uLlxuICAgICAqIFBFUk1JU1NJT05fREVOSUVEIG11c3Qgbm90IGJlIHVzZWQgZm9yIHJlamVjdGlvbnMgY2F1c2VkIGJ5IGV4aGF1c3RpbmdcbiAgICAgKiBzb21lIHJlc291cmNlICh1c2UgUkVTT1VSQ0VfRVhIQVVTVEVEIGluc3RlYWQgZm9yIHRob3NlIGVycm9ycykuXG4gICAgICogUEVSTUlTU0lPTl9ERU5JRUQgbXVzdCBub3QgYmUgdXNlZCBpZiB0aGUgY2FsbGVyIGNhbiBub3QgYmUgaWRlbnRpZmllZFxuICAgICAqICh1c2UgVU5BVVRIRU5USUNBVEVEIGluc3RlYWQgZm9yIHRob3NlIGVycm9ycykuXG4gICAgICovXG4gICAgUEVSTUlTU0lPTl9ERU5JRUQ6IFwicGVybWlzc2lvbi1kZW5pZWRcIixcbiAgICAvKipcbiAgICAgKiBUaGUgcmVxdWVzdCBkb2VzIG5vdCBoYXZlIHZhbGlkIGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIGZvciB0aGVcbiAgICAgKiBvcGVyYXRpb24uXG4gICAgICovXG4gICAgVU5BVVRIRU5USUNBVEVEOiBcInVuYXV0aGVudGljYXRlZFwiLFxuICAgIC8qKlxuICAgICAqIFNvbWUgcmVzb3VyY2UgaGFzIGJlZW4gZXhoYXVzdGVkLCBwZXJoYXBzIGEgcGVyLXVzZXIgcXVvdGEsIG9yIHBlcmhhcHMgdGhlXG4gICAgICogZW50aXJlIGZpbGUgc3lzdGVtIGlzIG91dCBvZiBzcGFjZS5cbiAgICAgKi9cbiAgICBSRVNPVVJDRV9FWEhBVVNURUQ6IFwicmVzb3VyY2UtZXhoYXVzdGVkXCIsXG4gICAgLyoqXG4gICAgICogT3BlcmF0aW9uIHdhcyByZWplY3RlZCBiZWNhdXNlIHRoZSBzeXN0ZW0gaXMgbm90IGluIGEgc3RhdGUgcmVxdWlyZWQgZm9yXG4gICAgICogdGhlIG9wZXJhdGlvbidzIGV4ZWN1dGlvbi4gRm9yIGV4YW1wbGUsIGRpcmVjdG9yeSB0byBiZSBkZWxldGVkIG1heSBiZVxuICAgICAqIG5vbi1lbXB0eSwgYW4gcm1kaXIgb3BlcmF0aW9uIGlzIGFwcGxpZWQgdG8gYSBub24tZGlyZWN0b3J5LCBldGMuXG4gICAgICpcbiAgICAgKiBBIGxpdG11cyB0ZXN0IHRoYXQgbWF5IGhlbHAgYSBzZXJ2aWNlIGltcGxlbWVudG9yIGluIGRlY2lkaW5nXG4gICAgICogYmV0d2VlbiBGQUlMRURfUFJFQ09ORElUSU9OLCBBQk9SVEVELCBhbmQgVU5BVkFJTEFCTEU6XG4gICAgICogIChhKSBVc2UgVU5BVkFJTEFCTEUgaWYgdGhlIGNsaWVudCBjYW4gcmV0cnkganVzdCB0aGUgZmFpbGluZyBjYWxsLlxuICAgICAqICAoYikgVXNlIEFCT1JURUQgaWYgdGhlIGNsaWVudCBzaG91bGQgcmV0cnkgYXQgYSBoaWdoZXItbGV2ZWxcbiAgICAgKiAgICAgIChlLmcuLCByZXN0YXJ0aW5nIGEgcmVhZC1tb2RpZnktd3JpdGUgc2VxdWVuY2UpLlxuICAgICAqICAoYykgVXNlIEZBSUxFRF9QUkVDT05ESVRJT04gaWYgdGhlIGNsaWVudCBzaG91bGQgbm90IHJldHJ5IHVudGlsXG4gICAgICogICAgICB0aGUgc3lzdGVtIHN0YXRlIGhhcyBiZWVuIGV4cGxpY2l0bHkgZml4ZWQuIEUuZy4sIGlmIGFuIFwicm1kaXJcIlxuICAgICAqICAgICAgZmFpbHMgYmVjYXVzZSB0aGUgZGlyZWN0b3J5IGlzIG5vbi1lbXB0eSwgRkFJTEVEX1BSRUNPTkRJVElPTlxuICAgICAqICAgICAgc2hvdWxkIGJlIHJldHVybmVkIHNpbmNlIHRoZSBjbGllbnQgc2hvdWxkIG5vdCByZXRyeSB1bmxlc3NcbiAgICAgKiAgICAgIHRoZXkgaGF2ZSBmaXJzdCBmaXhlZCB1cCB0aGUgZGlyZWN0b3J5IGJ5IGRlbGV0aW5nIGZpbGVzIGZyb20gaXQuXG4gICAgICogIChkKSBVc2UgRkFJTEVEX1BSRUNPTkRJVElPTiBpZiB0aGUgY2xpZW50IHBlcmZvcm1zIGNvbmRpdGlvbmFsXG4gICAgICogICAgICBSRVNUIEdldC9VcGRhdGUvRGVsZXRlIG9uIGEgcmVzb3VyY2UgYW5kIHRoZSByZXNvdXJjZSBvbiB0aGVcbiAgICAgKiAgICAgIHNlcnZlciBkb2VzIG5vdCBtYXRjaCB0aGUgY29uZGl0aW9uLiBFLmcuLCBjb25mbGljdGluZ1xuICAgICAqICAgICAgcmVhZC1tb2RpZnktd3JpdGUgb24gdGhlIHNhbWUgcmVzb3VyY2UuXG4gICAgICovXG4gICAgRkFJTEVEX1BSRUNPTkRJVElPTjogXCJmYWlsZWQtcHJlY29uZGl0aW9uXCIsXG4gICAgLyoqXG4gICAgICogVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZCwgdHlwaWNhbGx5IGR1ZSB0byBhIGNvbmN1cnJlbmN5IGlzc3VlIGxpa2VcbiAgICAgKiBzZXF1ZW5jZXIgY2hlY2sgZmFpbHVyZXMsIHRyYW5zYWN0aW9uIGFib3J0cywgZXRjLlxuICAgICAqXG4gICAgICogU2VlIGxpdG11cyB0ZXN0IGFib3ZlIGZvciBkZWNpZGluZyBiZXR3ZWVuIEZBSUxFRF9QUkVDT05ESVRJT04sIEFCT1JURUQsXG4gICAgICogYW5kIFVOQVZBSUxBQkxFLlxuICAgICAqL1xuICAgIEFCT1JURUQ6IFwiYWJvcnRlZFwiLFxuICAgIC8qKlxuICAgICAqIE9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIHBhc3QgdGhlIHZhbGlkIHJhbmdlLiBFLmcuLCBzZWVraW5nIG9yIHJlYWRpbmdcbiAgICAgKiBwYXN0IGVuZCBvZiBmaWxlLlxuICAgICAqXG4gICAgICogVW5saWtlIElOVkFMSURfQVJHVU1FTlQsIHRoaXMgZXJyb3IgaW5kaWNhdGVzIGEgcHJvYmxlbSB0aGF0IG1heSBiZSBmaXhlZFxuICAgICAqIGlmIHRoZSBzeXN0ZW0gc3RhdGUgY2hhbmdlcy4gRm9yIGV4YW1wbGUsIGEgMzItYml0IGZpbGUgc3lzdGVtIHdpbGxcbiAgICAgKiBnZW5lcmF0ZSBJTlZBTElEX0FSR1VNRU5UIGlmIGFza2VkIHRvIHJlYWQgYXQgYW4gb2Zmc2V0IHRoYXQgaXMgbm90IGluIHRoZVxuICAgICAqIHJhbmdlIFswLDJeMzItMV0sIGJ1dCBpdCB3aWxsIGdlbmVyYXRlIE9VVF9PRl9SQU5HRSBpZiBhc2tlZCB0byByZWFkIGZyb21cbiAgICAgKiBhbiBvZmZzZXQgcGFzdCB0aGUgY3VycmVudCBmaWxlIHNpemUuXG4gICAgICpcbiAgICAgKiBUaGVyZSBpcyBhIGZhaXIgYml0IG9mIG92ZXJsYXAgYmV0d2VlbiBGQUlMRURfUFJFQ09ORElUSU9OIGFuZFxuICAgICAqIE9VVF9PRl9SQU5HRS4gV2UgcmVjb21tZW5kIHVzaW5nIE9VVF9PRl9SQU5HRSAodGhlIG1vcmUgc3BlY2lmaWMgZXJyb3IpXG4gICAgICogd2hlbiBpdCBhcHBsaWVzIHNvIHRoYXQgY2FsbGVycyB3aG8gYXJlIGl0ZXJhdGluZyB0aHJvdWdoIGEgc3BhY2UgY2FuXG4gICAgICogZWFzaWx5IGxvb2sgZm9yIGFuIE9VVF9PRl9SQU5HRSBlcnJvciB0byBkZXRlY3Qgd2hlbiB0aGV5IGFyZSBkb25lLlxuICAgICAqL1xuICAgIE9VVF9PRl9SQU5HRTogXCJvdXQtb2YtcmFuZ2VcIixcbiAgICAvKiogT3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBvciBub3Qgc3VwcG9ydGVkL2VuYWJsZWQgaW4gdGhpcyBzZXJ2aWNlLiAqL1xuICAgIFVOSU1QTEVNRU5URUQ6IFwidW5pbXBsZW1lbnRlZFwiLFxuICAgIC8qKlxuICAgICAqIEludGVybmFsIGVycm9ycy4gTWVhbnMgc29tZSBpbnZhcmlhbnRzIGV4cGVjdGVkIGJ5IHVuZGVybHlpbmcgU3lzdGVtIGhhc1xuICAgICAqIGJlZW4gYnJva2VuLiBJZiB5b3Ugc2VlIG9uZSBvZiB0aGVzZSBlcnJvcnMsIFNvbWV0aGluZyBpcyB2ZXJ5IGJyb2tlbi5cbiAgICAgKi9cbiAgICBJTlRFUk5BTDogXCJpbnRlcm5hbFwiLFxuICAgIC8qKlxuICAgICAqIFRoZSBzZXJ2aWNlIGlzIGN1cnJlbnRseSB1bmF2YWlsYWJsZS4gVGhpcyBpcyBhIG1vc3QgbGlrZWx5IGEgdHJhbnNpZW50XG4gICAgICogY29uZGl0aW9uIGFuZCBtYXkgYmUgY29ycmVjdGVkIGJ5IHJldHJ5aW5nIHdpdGggYSBiYWNrb2ZmLlxuICAgICAqXG4gICAgICogU2VlIGxpdG11cyB0ZXN0IGFib3ZlIGZvciBkZWNpZGluZyBiZXR3ZWVuIEZBSUxFRF9QUkVDT05ESVRJT04sIEFCT1JURUQsXG4gICAgICogYW5kIFVOQVZBSUxBQkxFLlxuICAgICAqL1xuICAgIFVOQVZBSUxBQkxFOiBcInVuYXZhaWxhYmxlXCIsXG4gICAgLyoqIFVucmVjb3ZlcmFibGUgZGF0YSBsb3NzIG9yIGNvcnJ1cHRpb24uICovXG4gICAgREFUQV9MT1NTOiBcImRhdGEtbG9zc1wiXG59O1xuXG4vKiogQW4gZXJyb3IgcmV0dXJuZWQgYnkgYSBGaXJlc3RvcmUgb3BlcmF0aW9uLiAqLyBjbGFzcyBRIGV4dGVuZHMgRmlyZWJhc2VFcnJvciB7XG4gICAgLyoqIEBoaWRlY29uc3RydWN0b3IgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBUaGUgYmFja2VuZCBlcnJvciBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVycm9yLlxuICAgICAqL1xuICAgIHQsIFxuICAgIC8qKlxuICAgICAqIEEgY3VzdG9tIGVycm9yIGRlc2NyaXB0aW9uLlxuICAgICAqL1xuICAgIGUpIHtcbiAgICAgICAgc3VwZXIodCwgZSksIHRoaXMuY29kZSA9IHQsIHRoaXMubWVzc2FnZSA9IGUsIFxuICAgICAgICAvLyBIQUNLOiBXZSB3cml0ZSBhIHRvU3RyaW5nIHByb3BlcnR5IGRpcmVjdGx5IGJlY2F1c2UgRXJyb3IgaXMgbm90IGEgcmVhbFxuICAgICAgICAvLyBjbGFzcyBhbmQgc28gaW5oZXJpdGFuY2UgZG9lcyBub3Qgd29yayBjb3JyZWN0bHkuIFdlIGNvdWxkIGFsdGVybmF0aXZlbHlcbiAgICAgICAgLy8gZG8gdGhlIHNhbWUgXCJiYWNrLWRvb3IgaW5oZXJpdGFuY2VcIiB0cmljayB0aGF0IEZpcmViYXNlRXJyb3IgZG9lcy5cbiAgICAgICAgdGhpcy50b1N0cmluZyA9ICgpID0+IGAke3RoaXMubmFtZX06IFtjb2RlPSR7dGhpcy5jb2RlfV06ICR7dGhpcy5tZXNzYWdlfWA7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjbGFzcyBqIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKCh0LCBlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmUgPSB0LCB0aGlzLnJlamVjdCA9IGU7XG4gICAgICAgIH0pKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGNsYXNzIFcge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy51c2VyID0gZSwgdGhpcy50eXBlID0gXCJPQXV0aFwiLCB0aGlzLmhlYWRlcnMgPSBuZXcgTWFwLCB0aGlzLmhlYWRlcnMuc2V0KFwiQXV0aG9yaXphdGlvblwiLCBgQmVhcmVyICR7dH1gKTtcbiAgICB9XG59XG5cbi8qKlxuICogQSBDcmVkZW50aWFsc1Byb3ZpZGVyIHRoYXQgYWx3YXlzIHlpZWxkcyBhbiBlbXB0eSB0b2tlbi5cbiAqIEBpbnRlcm5hbFxuICovIGNsYXNzIHoge1xuICAgIGdldFRva2VuKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICAgIH1cbiAgICBpbnZhbGlkYXRlVG9rZW4oKSB7fVxuICAgIHN0YXJ0KHQsIGUpIHtcbiAgICAgICAgLy8gRmlyZSB3aXRoIGluaXRpYWwgdXNlci5cbiAgICAgICAgdC5lbnF1ZXVlUmV0cnlhYmxlKCgoKSA9PiBlKEMuVU5BVVRIRU5USUNBVEVEKSkpO1xuICAgIH1cbiAgICBzaHV0ZG93bigpIHt9XG59XG5cbi8qKlxuICogQSBDcmVkZW50aWFsc1Byb3ZpZGVyIHRoYXQgYWx3YXlzIHJldHVybnMgYSBjb25zdGFudCB0b2tlbi4gVXNlZCBmb3JcbiAqIGVtdWxhdG9yIHRva2VuIG1vY2tpbmcuXG4gKi8gY2xhc3MgSCB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLnRva2VuID0gdCwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTdG9yZXMgdGhlIGxpc3RlbmVyIHJlZ2lzdGVyZWQgd2l0aCBzZXRDaGFuZ2VMaXN0ZW5lcigpXG4gICAgICAgICAqIFRoaXMgaXNuJ3QgYWN0dWFsbHkgbmVjZXNzYXJ5IHNpbmNlIHRoZSBVSUQgbmV2ZXIgY2hhbmdlcywgYnV0IHdlIHVzZSB0aGlzXG4gICAgICAgICAqIHRvIHZlcmlmeSB0aGUgbGlzdGVuIGNvbnRyYWN0IGlzIGFkaGVyZWQgdG8gaW4gdGVzdHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNoYW5nZUxpc3RlbmVyID0gbnVsbDtcbiAgICB9XG4gICAgZ2V0VG9rZW4oKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy50b2tlbik7XG4gICAgfVxuICAgIGludmFsaWRhdGVUb2tlbigpIHt9XG4gICAgc3RhcnQodCwgZSkge1xuICAgICAgICB0aGlzLmNoYW5nZUxpc3RlbmVyID0gZSwgXG4gICAgICAgIC8vIEZpcmUgd2l0aCBpbml0aWFsIHVzZXIuXG4gICAgICAgIHQuZW5xdWV1ZVJldHJ5YWJsZSgoKCkgPT4gZSh0aGlzLnRva2VuLnVzZXIpKSk7XG4gICAgfVxuICAgIHNodXRkb3duKCkge1xuICAgICAgICB0aGlzLmNoYW5nZUxpc3RlbmVyID0gbnVsbDtcbiAgICB9XG59XG5cbmNsYXNzIEoge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy50ID0gdCwgXG4gICAgICAgIC8qKiBUcmFja3MgdGhlIGN1cnJlbnQgVXNlci4gKi9cbiAgICAgICAgdGhpcy5jdXJyZW50VXNlciA9IEMuVU5BVVRIRU5USUNBVEVELCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvdW50ZXIgdXNlZCB0byBkZXRlY3QgaWYgdGhlIHRva2VuIGNoYW5nZWQgd2hpbGUgYSBnZXRUb2tlbiByZXF1ZXN0IHdhc1xuICAgICAgICAgKiBvdXRzdGFuZGluZy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaSA9IDAsIHRoaXMuZm9yY2VSZWZyZXNoID0gITEsIHRoaXMuYXV0aCA9IG51bGw7XG4gICAgfVxuICAgIHN0YXJ0KHQsIGUpIHtcbiAgICAgICAgbGV0IG4gPSB0aGlzLmk7XG4gICAgICAgIC8vIEEgY2hhbmdlIGxpc3RlbmVyIHRoYXQgcHJldmVudHMgZG91YmxlLWZpcmluZyBmb3IgdGhlIHNhbWUgdG9rZW4gY2hhbmdlLlxuICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB0ID0+IHRoaXMuaSAhPT0gbiA/IChuID0gdGhpcy5pLCBlKHQpKSA6IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAvLyBBIHByb21pc2UgdGhhdCBjYW4gYmUgd2FpdGVkIG9uIHRvIGJsb2NrIG9uIHRoZSBuZXh0IHRva2VuIGNoYW5nZS5cbiAgICAgICAgLy8gVGhpcyBwcm9taXNlIGlzIHJlLWNyZWF0ZWQgYWZ0ZXIgZWFjaCBjaGFuZ2UuXG4gICAgICAgICAgICAgICAgbGV0IGkgPSBuZXcgajtcbiAgICAgICAgdGhpcy5vID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pKyssIHRoaXMuY3VycmVudFVzZXIgPSB0aGlzLnUoKSwgaS5yZXNvbHZlKCksIGkgPSBuZXcgaiwgdC5lbnF1ZXVlUmV0cnlhYmxlKCgoKSA9PiBzKHRoaXMuY3VycmVudFVzZXIpKSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHIgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlID0gaTtcbiAgICAgICAgICAgIHQuZW5xdWV1ZVJldHJ5YWJsZSgoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IGUucHJvbWlzZSwgYXdhaXQgcyh0aGlzLmN1cnJlbnRVc2VyKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSwgbyA9IHQgPT4ge1xuICAgICAgICAgICAgTyhcIkZpcmViYXNlQXV0aENyZWRlbnRpYWxzUHJvdmlkZXJcIiwgXCJBdXRoIGRldGVjdGVkXCIpLCB0aGlzLmF1dGggPSB0LCB0aGlzLmF1dGguYWRkQXV0aFRva2VuTGlzdGVuZXIodGhpcy5vKSwgXG4gICAgICAgICAgICByKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudC5vbkluaXQoKHQgPT4gbyh0KSkpLCBcbiAgICAgICAgLy8gT3VyIHVzZXJzIGNhbiBpbml0aWFsaXplIEF1dGggcmlnaHQgYWZ0ZXIgRmlyZXN0b3JlLCBzbyB3ZSBnaXZlIGl0XG4gICAgICAgIC8vIGEgY2hhbmNlIHRvIHJlZ2lzdGVyIGl0c2VsZiB3aXRoIHRoZSBjb21wb25lbnQgZnJhbWV3b3JrIGJlZm9yZSB3ZVxuICAgICAgICAvLyBkZXRlcm1pbmUgd2hldGhlciB0byBzdGFydCB1cCBpbiB1bmF1dGhlbnRpY2F0ZWQgbW9kZS5cbiAgICAgICAgc2V0VGltZW91dCgoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmF1dGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy50LmdldEltbWVkaWF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsOiAhMFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHQgPyBvKHQpIDogKFxuICAgICAgICAgICAgICAgIC8vIElmIGF1dGggaXMgc3RpbGwgbm90IGF2YWlsYWJsZSwgcHJvY2VlZCB3aXRoIGBudWxsYCB1c2VyXG4gICAgICAgICAgICAgICAgTyhcIkZpcmViYXNlQXV0aENyZWRlbnRpYWxzUHJvdmlkZXJcIiwgXCJBdXRoIG5vdCB5ZXQgZGV0ZWN0ZWRcIiksIGkucmVzb2x2ZSgpLCBpID0gbmV3IGopO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSwgMCksIHIoKTtcbiAgICB9XG4gICAgZ2V0VG9rZW4oKSB7XG4gICAgICAgIC8vIFRha2Ugbm90ZSBvZiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgdG9rZW5Db3VudGVyIHNvIHRoYXQgdGhpcyBtZXRob2RcbiAgICAgICAgLy8gY2FuIGZhaWwgKHdpdGggYW4gQUJPUlRFRCBlcnJvcikgaWYgdGhlcmUgaXMgYSB0b2tlbiBjaGFuZ2Ugd2hpbGUgdGhlXG4gICAgICAgIC8vIHJlcXVlc3QgaXMgb3V0c3RhbmRpbmcuXG4gICAgICAgIGNvbnN0IHQgPSB0aGlzLmksIGUgPSB0aGlzLmZvcmNlUmVmcmVzaDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9yY2VSZWZyZXNoID0gITEsIHRoaXMuYXV0aCA/IHRoaXMuYXV0aC5nZXRUb2tlbihlKS50aGVuKChlID0+IFxuICAgICAgICAvLyBDYW5jZWwgdGhlIHJlcXVlc3Qgc2luY2UgdGhlIHRva2VuIGNoYW5nZWQgd2hpbGUgdGhlIHJlcXVlc3Qgd2FzXG4gICAgICAgIC8vIG91dHN0YW5kaW5nIHNvIHRoZSByZXNwb25zZSBpcyBwb3RlbnRpYWxseSBmb3IgYSBwcmV2aW91cyB1c2VyICh3aGljaFxuICAgICAgICAvLyB1c2VyLCB3ZSBjYW4ndCBiZSBzdXJlKS5cbiAgICAgICAgdGhpcy5pICE9PSB0ID8gKE8oXCJGaXJlYmFzZUF1dGhDcmVkZW50aWFsc1Byb3ZpZGVyXCIsIFwiZ2V0VG9rZW4gYWJvcnRlZCBkdWUgdG8gdG9rZW4gY2hhbmdlLlwiKSwgXG4gICAgICAgIHRoaXMuZ2V0VG9rZW4oKSkgOiBlID8gKHEoXCJzdHJpbmdcIiA9PSB0eXBlb2YgZS5hY2Nlc3NUb2tlbiksIG5ldyBXKGUuYWNjZXNzVG9rZW4sIHRoaXMuY3VycmVudFVzZXIpKSA6IG51bGwpKSA6IFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICB9XG4gICAgaW52YWxpZGF0ZVRva2VuKCkge1xuICAgICAgICB0aGlzLmZvcmNlUmVmcmVzaCA9ICEwO1xuICAgIH1cbiAgICBzaHV0ZG93bigpIHtcbiAgICAgICAgdGhpcy5hdXRoICYmIHRoaXMuYXV0aC5yZW1vdmVBdXRoVG9rZW5MaXN0ZW5lcih0aGlzLm8pO1xuICAgIH1cbiAgICAvLyBBdXRoLmdldFVpZCgpIGNhbiByZXR1cm4gbnVsbCBldmVuIHdpdGggYSB1c2VyIGxvZ2dlZCBpbi4gSXQgaXMgYmVjYXVzZVxuICAgIC8vIGdldFVpZCgpIGlzIHN5bmNocm9ub3VzLCBidXQgdGhlIGF1dGggY29kZSBwb3B1bGF0aW5nIFVpZCBpcyBhc3luY2hyb25vdXMuXG4gICAgLy8gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGluIHRoZSBBdXRoVG9rZW5MaXN0ZW5lciBjYWxsYmFja1xuICAgIC8vIHRvIGd1YXJhbnRlZSB0byBnZXQgdGhlIGFjdHVhbCB1c2VyLlxuICAgIHUoKSB7XG4gICAgICAgIGNvbnN0IHQgPSB0aGlzLmF1dGggJiYgdGhpcy5hdXRoLmdldFVpZCgpO1xuICAgICAgICByZXR1cm4gcShudWxsID09PSB0IHx8IFwic3RyaW5nXCIgPT0gdHlwZW9mIHQpLCBuZXcgQyh0KTtcbiAgICB9XG59XG5cbi8qXG4gKiBGaXJzdFBhcnR5VG9rZW4gcHJvdmlkZXMgYSBmcmVzaCB0b2tlbiBlYWNoIHRpbWUgaXRzIHZhbHVlXG4gKiBpcyByZXF1ZXN0ZWQsIGJlY2F1c2UgaWYgdGhlIHRva2VuIGlzIHRvbyBvbGQsIHJlcXVlc3RzIHdpbGwgYmUgcmVqZWN0ZWQuXG4gKiBUZWNobmljYWxseSB0aGlzIG1heSBubyBsb25nZXIgYmUgbmVjZXNzYXJ5IHNpbmNlIHRoZSBTREsgc2hvdWxkIGdyYWNlZnVsbHlcbiAqIHJlY292ZXIgZnJvbSB1bmF1dGhlbnRpY2F0ZWQgZXJyb3JzIChzZWUgYi8zMzE0NzgxOCBmb3IgY29udGV4dCksIGJ1dCBpdCdzXG4gKiBzYWZlciB0byBrZWVwIHRoZSBpbXBsZW1lbnRhdGlvbiBhcy1pcy5cbiAqLyBjbGFzcyBZIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IFwiRmlyc3RQYXJ0eVwiLCB0aGlzLnVzZXIgPSBDLkZJUlNUX1BBUlRZLCB0aGlzLmhlYWRlcnMgPSBuZXcgTWFwLCB0aGlzLmhlYWRlcnMuc2V0KFwiWC1Hb29nLUF1dGhVc2VyXCIsIGUpO1xuICAgICAgICBjb25zdCBzID0gdC5hdXRoLmdldEF1dGhIZWFkZXJWYWx1ZUZvckZpcnN0UGFydHkoW10pO1xuICAgICAgICBzICYmIHRoaXMuaGVhZGVycy5zZXQoXCJBdXRob3JpemF0aW9uXCIsIHMpLCBuICYmIHRoaXMuaGVhZGVycy5zZXQoXCJYLUdvb2ctSWFtLUF1dGhvcml6YXRpb24tVG9rZW5cIiwgbik7XG4gICAgfVxufVxuXG4vKlxuICogUHJvdmlkZXMgdXNlciBjcmVkZW50aWFscyByZXF1aXJlZCBmb3IgdGhlIEZpcmVzdG9yZSBKYXZhU2NyaXB0IFNES1xuICogdG8gYXV0aGVudGljYXRlIHRoZSB1c2VyLCB1c2luZyB0ZWNobmlxdWUgdGhhdCBpcyBvbmx5IGF2YWlsYWJsZVxuICogdG8gYXBwbGljYXRpb25zIGhvc3RlZCBieSBHb29nbGUuXG4gKi8gY2xhc3MgWCB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbikge1xuICAgICAgICB0aGlzLmggPSB0LCB0aGlzLmwgPSBlLCB0aGlzLm0gPSBuO1xuICAgIH1cbiAgICBnZXRUb2tlbigpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgWSh0aGlzLmgsIHRoaXMubCwgdGhpcy5tKSk7XG4gICAgfVxuICAgIHN0YXJ0KHQsIGUpIHtcbiAgICAgICAgLy8gRmlyZSB3aXRoIGluaXRpYWwgdWlkLlxuICAgICAgICB0LmVucXVldWVSZXRyeWFibGUoKCgpID0+IGUoQy5GSVJTVF9QQVJUWSkpKTtcbiAgICB9XG4gICAgc2h1dGRvd24oKSB7fVxuICAgIGludmFsaWRhdGVUb2tlbigpIHt9XG59XG5cbmNsYXNzIFoge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHQsIHRoaXMudHlwZSA9IFwiQXBwQ2hlY2tcIiwgdGhpcy5oZWFkZXJzID0gbmV3IE1hcCwgdCAmJiB0Lmxlbmd0aCA+IDAgJiYgdGhpcy5oZWFkZXJzLnNldChcIngtZmlyZWJhc2UtYXBwY2hlY2tcIiwgdGhpcy52YWx1ZSk7XG4gICAgfVxufVxuXG5jbGFzcyB0dCB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLmcgPSB0LCB0aGlzLmZvcmNlUmVmcmVzaCA9ICExLCB0aGlzLmFwcENoZWNrID0gbnVsbCwgdGhpcy5wID0gbnVsbDtcbiAgICB9XG4gICAgc3RhcnQodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gdCA9PiB7XG4gICAgICAgICAgICBudWxsICE9IHQuZXJyb3IgJiYgTyhcIkZpcmViYXNlQXBwQ2hlY2tUb2tlblByb3ZpZGVyXCIsIGBFcnJvciBnZXR0aW5nIEFwcCBDaGVjayB0b2tlbjsgdXNpbmcgcGxhY2Vob2xkZXIgdG9rZW4gaW5zdGVhZC4gRXJyb3I6ICR7dC5lcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgY29uc3QgbiA9IHQudG9rZW4gIT09IHRoaXMucDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnAgPSB0LnRva2VuLCBPKFwiRmlyZWJhc2VBcHBDaGVja1Rva2VuUHJvdmlkZXJcIiwgYFJlY2VpdmVkICR7biA/IFwibmV3XCIgOiBcImV4aXN0aW5nXCJ9IHRva2VuLmApLCBcbiAgICAgICAgICAgIG4gPyBlKHQudG9rZW4pIDogUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubyA9IGUgPT4ge1xuICAgICAgICAgICAgdC5lbnF1ZXVlUmV0cnlhYmxlKCgoKSA9PiBuKGUpKSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHMgPSB0ID0+IHtcbiAgICAgICAgICAgIE8oXCJGaXJlYmFzZUFwcENoZWNrVG9rZW5Qcm92aWRlclwiLCBcIkFwcENoZWNrIGRldGVjdGVkXCIpLCB0aGlzLmFwcENoZWNrID0gdCwgdGhpcy5hcHBDaGVjay5hZGRUb2tlbkxpc3RlbmVyKHRoaXMubyk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZy5vbkluaXQoKHQgPT4gcyh0KSkpLCBcbiAgICAgICAgLy8gT3VyIHVzZXJzIGNhbiBpbml0aWFsaXplIEFwcENoZWNrIGFmdGVyIEZpcmVzdG9yZSwgc28gd2UgZ2l2ZSBpdFxuICAgICAgICAvLyBhIGNoYW5jZSB0byByZWdpc3RlciBpdHNlbGYgd2l0aCB0aGUgY29tcG9uZW50IGZyYW1ld29yay5cbiAgICAgICAgc2V0VGltZW91dCgoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFwcENoZWNrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuZy5nZXRJbW1lZGlhdGUoe1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25hbDogITBcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0ID8gcyh0KSA6IFxuICAgICAgICAgICAgICAgIC8vIElmIEFwcENoZWNrIGlzIHN0aWxsIG5vdCBhdmFpbGFibGUsIHByb2NlZWQgd2l0aG91dCBpdC5cbiAgICAgICAgICAgICAgICBPKFwiRmlyZWJhc2VBcHBDaGVja1Rva2VuUHJvdmlkZXJcIiwgXCJBcHBDaGVjayBub3QgeWV0IGRldGVjdGVkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSwgMCk7XG4gICAgfVxuICAgIGdldFRva2VuKCkge1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5mb3JjZVJlZnJlc2g7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcmNlUmVmcmVzaCA9ICExLCB0aGlzLmFwcENoZWNrID8gdGhpcy5hcHBDaGVjay5nZXRUb2tlbih0KS50aGVuKCh0ID0+IHQgPyAocShcInN0cmluZ1wiID09IHR5cGVvZiB0LnRva2VuKSwgXG4gICAgICAgIHRoaXMucCA9IHQudG9rZW4sIG5ldyBaKHQudG9rZW4pKSA6IG51bGwpKSA6IFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICB9XG4gICAgaW52YWxpZGF0ZVRva2VuKCkge1xuICAgICAgICB0aGlzLmZvcmNlUmVmcmVzaCA9ICEwO1xuICAgIH1cbiAgICBzaHV0ZG93bigpIHtcbiAgICAgICAgdGhpcy5hcHBDaGVjayAmJiB0aGlzLmFwcENoZWNrLnJlbW92ZVRva2VuTGlzdGVuZXIodGhpcy5vKTtcbiAgICB9XG59XG5cbi8qKlxuICogQW4gQXBwQ2hlY2sgdG9rZW4gcHJvdmlkZXIgdGhhdCBhbHdheXMgeWllbGRzIGFuIGVtcHR5IHRva2VuLlxuICogQGludGVybmFsXG4gKi8gY2xhc3MgZXQge1xuICAgIGdldFRva2VuKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBaKFwiXCIpKTtcbiAgICB9XG4gICAgaW52YWxpZGF0ZVRva2VuKCkge31cbiAgICBzdGFydCh0LCBlKSB7fVxuICAgIHNodXRkb3duKCkge31cbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBDcmVkZW50aWFsc1Byb3ZpZGVyIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZlxuICogdGhlIGNyZWRlbnRpYWxzIHBhc3NlZCBpbi5cbiAqL1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogYExpc3RlblNlcXVlbmNlYCBpcyBhIG1vbm90b25pYyBzZXF1ZW5jZS4gSXQgaXMgaW5pdGlhbGl6ZWQgd2l0aCBhIG1pbmltdW0gdmFsdWUgdG9cbiAqIGV4Y2VlZC4gQWxsIHN1YnNlcXVlbnQgY2FsbHMgdG8gbmV4dCB3aWxsIHJldHVybiBpbmNyZWFzaW5nIHZhbHVlcy4gSWYgcHJvdmlkZWQgd2l0aCBhXG4gKiBgU2VxdWVuY2VOdW1iZXJTeW5jZXJgLCBpdCB3aWxsIGFkZGl0aW9uYWxseSBidW1wIGl0cyBuZXh0IHZhbHVlIHdoZW4gdG9sZCBvZiBhIG5ldyB2YWx1ZSwgYXNcbiAqIHdlbGwgYXMgd3JpdGUgb3V0IHNlcXVlbmNlIG51bWJlcnMgdGhhdCBpdCBwcm9kdWNlcyB2aWEgYG5leHQoKWAuXG4gKi9cbmNsYXNzIG50IHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMucHJldmlvdXNWYWx1ZSA9IHQsIGUgJiYgKGUuc2VxdWVuY2VOdW1iZXJIYW5kbGVyID0gdCA9PiB0aGlzLkkodCksIHRoaXMuVCA9IHQgPT4gZS53cml0ZVNlcXVlbmNlTnVtYmVyKHQpKTtcbiAgICB9XG4gICAgSSh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXZpb3VzVmFsdWUgPSBNYXRoLm1heCh0LCB0aGlzLnByZXZpb3VzVmFsdWUpLCB0aGlzLnByZXZpb3VzVmFsdWU7XG4gICAgfVxuICAgIG5leHQoKSB7XG4gICAgICAgIGNvbnN0IHQgPSArK3RoaXMucHJldmlvdXNWYWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuVCAmJiB0aGlzLlQodCksIHQ7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBHZW5lcmF0ZXMgYG5CeXRlc2Agb2YgcmFuZG9tIGJ5dGVzLlxuICpcbiAqIElmIGBuQnl0ZXMgPCAwYCAsIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICovXG5mdW5jdGlvbiBzdCh0KSB7XG4gICAgLy8gUG9seWZpbGxzIGZvciBJRSBhbmQgV2ViV29ya2VyIGJ5IHVzaW5nIGBzZWxmYCBhbmQgYG1zQ3J5cHRvYCB3aGVuIGBjcnlwdG9gIGlzIG5vdCBhdmFpbGFibGUuXG4gICAgY29uc3QgZSA9IFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2Ygc2VsZiAmJiAoc2VsZi5jcnlwdG8gfHwgc2VsZi5tc0NyeXB0byksIG4gPSBuZXcgVWludDhBcnJheSh0KTtcbiAgICBpZiAoZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGUuZ2V0UmFuZG9tVmFsdWVzKSBlLmdldFJhbmRvbVZhbHVlcyhuKTsgZWxzZSBcbiAgICAvLyBGYWxscyBiYWNrIHRvIE1hdGgucmFuZG9tXG4gICAgZm9yIChsZXQgZSA9IDA7IGUgPCB0OyBlKyspIG5bZV0gPSBNYXRoLmZsb29yKDI1NiAqIE1hdGgucmFuZG9tKCkpO1xuICAgIHJldHVybiBuO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBudC5BID0gLTE7XG5cbmNsYXNzIGl0IHtcbiAgICBzdGF0aWMgUigpIHtcbiAgICAgICAgLy8gQWxwaGFudW1lcmljIGNoYXJhY3RlcnNcbiAgICAgICAgY29uc3QgdCA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODlcIiwgZSA9IE1hdGguZmxvb3IoMjU2IC8gdC5sZW5ndGgpICogdC5sZW5ndGg7XG4gICAgICAgIC8vIFRoZSBsYXJnZXN0IGJ5dGUgdmFsdWUgdGhhdCBpcyBhIG11bHRpcGxlIG9mIGBjaGFyLmxlbmd0aGAuXG4gICAgICAgICAgICAgICAgbGV0IG4gPSBcIlwiO1xuICAgICAgICBmb3IgKDtuLmxlbmd0aCA8IDIwOyApIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBzdCg0MCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHMubGVuZ3RoOyArK2kpIFxuICAgICAgICAgICAgLy8gT25seSBhY2NlcHQgdmFsdWVzIHRoYXQgYXJlIFswLCBtYXhNdWx0aXBsZSksIHRoaXMgZW5zdXJlcyB0aGV5IGNhblxuICAgICAgICAgICAgLy8gYmUgZXZlbmx5IG1hcHBlZCB0byBpbmRpY2VzIG9mIGBjaGFyc2AgdmlhIGEgbW9kdWxvIG9wZXJhdGlvbi5cbiAgICAgICAgICAgIG4ubGVuZ3RoIDwgMjAgJiYgc1tpXSA8IGUgJiYgKG4gKz0gdC5jaGFyQXQoc1tpXSAlIHQubGVuZ3RoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG47XG4gICAgfVxufVxuXG5mdW5jdGlvbiBydCh0LCBlKSB7XG4gICAgcmV0dXJuIHQgPCBlID8gLTEgOiB0ID4gZSA/IDEgOiAwO1xufVxuXG4vKiogSGVscGVyIHRvIGNvbXBhcmUgYXJyYXlzIHVzaW5nIGlzRXF1YWwoKS4gKi8gZnVuY3Rpb24gb3QodCwgZSwgbikge1xuICAgIHJldHVybiB0Lmxlbmd0aCA9PT0gZS5sZW5ndGggJiYgdC5ldmVyeSgoKHQsIHMpID0+IG4odCwgZVtzXSkpKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbW1lZGlhdGUgbGV4aWNvZ3JhcGhpY2FsbHktZm9sbG93aW5nIHN0cmluZy4gVGhpcyBpcyB1c2VmdWwgdG9cbiAqIGNvbnN0cnVjdCBhbiBpbmNsdXNpdmUgcmFuZ2UgZm9yIGluZGV4ZWRkYiBpdGVyYXRvcnMuXG4gKi8gZnVuY3Rpb24gYXQodCkge1xuICAgIC8vIFJldHVybiB0aGUgaW5wdXQgc3RyaW5nLCB3aXRoIGFuIGFkZGl0aW9uYWwgTlVMIGJ5dGUgYXBwZW5kZWQuXG4gICAgcmV0dXJuIHQgKyBcIlxcMFwiO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLy8gVGhlIGVhcmxpZXN0IGRhdGUgc3VwcG9ydGVkIGJ5IEZpcmVzdG9yZSB0aW1lc3RhbXBzICgwMDAxLTAxLTAxVDAwOjAwOjAwWikuXG4vKipcbiAqIEEgYFRpbWVzdGFtcGAgcmVwcmVzZW50cyBhIHBvaW50IGluIHRpbWUgaW5kZXBlbmRlbnQgb2YgYW55IHRpbWUgem9uZSBvclxuICogY2FsZW5kYXIsIHJlcHJlc2VudGVkIGFzIHNlY29uZHMgYW5kIGZyYWN0aW9ucyBvZiBzZWNvbmRzIGF0IG5hbm9zZWNvbmRcbiAqIHJlc29sdXRpb24gaW4gVVRDIEVwb2NoIHRpbWUuXG4gKlxuICogSXQgaXMgZW5jb2RlZCB1c2luZyB0aGUgUHJvbGVwdGljIEdyZWdvcmlhbiBDYWxlbmRhciB3aGljaCBleHRlbmRzIHRoZVxuICogR3JlZ29yaWFuIGNhbGVuZGFyIGJhY2t3YXJkcyB0byB5ZWFyIG9uZS4gSXQgaXMgZW5jb2RlZCBhc3N1bWluZyBhbGwgbWludXRlc1xuICogYXJlIDYwIHNlY29uZHMgbG9uZywgaS5lLiBsZWFwIHNlY29uZHMgYXJlIFwic21lYXJlZFwiIHNvIHRoYXQgbm8gbGVhcCBzZWNvbmRcbiAqIHRhYmxlIGlzIG5lZWRlZCBmb3IgaW50ZXJwcmV0YXRpb24uIFJhbmdlIGlzIGZyb20gMDAwMS0wMS0wMVQwMDowMDowMFogdG9cbiAqIDk5OTktMTItMzFUMjM6NTk6NTkuOTk5OTk5OTk5Wi5cbiAqXG4gKiBGb3IgZXhhbXBsZXMgYW5kIGZ1cnRoZXIgc3BlY2lmaWNhdGlvbnMsIHJlZmVyIHRvIHRoZVxuICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvcHJvdG9idWYvYmxvYi9tYXN0ZXIvc3JjL2dvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucHJvdG8gfCBUaW1lc3RhbXAgZGVmaW5pdGlvbn0uXG4gKi9cbmNsYXNzIHV0IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHRpbWVzdGFtcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzZWNvbmRzIC0gVGhlIG51bWJlciBvZiBzZWNvbmRzIG9mIFVUQyB0aW1lIHNpbmNlIFVuaXggZXBvY2hcbiAgICAgKiAgICAgMTk3MC0wMS0wMVQwMDowMDowMFouIE11c3QgYmUgZnJvbSAwMDAxLTAxLTAxVDAwOjAwOjAwWiB0b1xuICAgICAqICAgICA5OTk5LTEyLTMxVDIzOjU5OjU5WiBpbmNsdXNpdmUuXG4gICAgICogQHBhcmFtIG5hbm9zZWNvbmRzIC0gVGhlIG5vbi1uZWdhdGl2ZSBmcmFjdGlvbnMgb2YgYSBzZWNvbmQgYXQgbmFub3NlY29uZFxuICAgICAqICAgICByZXNvbHV0aW9uLiBOZWdhdGl2ZSBzZWNvbmQgdmFsdWVzIHdpdGggZnJhY3Rpb25zIG11c3Qgc3RpbGwgaGF2ZVxuICAgICAqICAgICBub24tbmVnYXRpdmUgbmFub3NlY29uZHMgdmFsdWVzIHRoYXQgY291bnQgZm9yd2FyZCBpbiB0aW1lLiBNdXN0IGJlXG4gICAgICogICAgIGZyb20gMCB0byA5OTksOTk5LDk5OSBpbmNsdXNpdmUuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBzZWNvbmRzIG9mIFVUQyB0aW1lIHNpbmNlIFVuaXggZXBvY2ggMTk3MC0wMS0wMVQwMDowMDowMFouXG4gICAgICovXG4gICAgdCwgXG4gICAgLyoqXG4gICAgICogVGhlIGZyYWN0aW9ucyBvZiBhIHNlY29uZCBhdCBuYW5vc2Vjb25kIHJlc29sdXRpb24uKlxuICAgICAqL1xuICAgIGUpIHtcbiAgICAgICAgaWYgKHRoaXMuc2Vjb25kcyA9IHQsIHRoaXMubmFub3NlY29uZHMgPSBlLCBlIDwgMCkgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBcIlRpbWVzdGFtcCBuYW5vc2Vjb25kcyBvdXQgb2YgcmFuZ2U6IFwiICsgZSk7XG4gICAgICAgIGlmIChlID49IDFlOSkgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBcIlRpbWVzdGFtcCBuYW5vc2Vjb25kcyBvdXQgb2YgcmFuZ2U6IFwiICsgZSk7XG4gICAgICAgIGlmICh0IDwgLTYyMTM1NTk2ODAwKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIFwiVGltZXN0YW1wIHNlY29uZHMgb3V0IG9mIHJhbmdlOiBcIiArIHQpO1xuICAgICAgICAvLyBUaGlzIHdpbGwgYnJlYWsgaW4gdGhlIHllYXIgMTAsMDAwLlxuICAgICAgICAgICAgICAgIGlmICh0ID49IDI1MzQwMjMwMDgwMCkgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBcIlRpbWVzdGFtcCBzZWNvbmRzIG91dCBvZiByYW5nZTogXCIgKyB0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyB0aW1lc3RhbXAgd2l0aCB0aGUgY3VycmVudCBkYXRlLCB3aXRoIG1pbGxpc2Vjb25kIHByZWNpc2lvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGEgbmV3IHRpbWVzdGFtcCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgZGF0ZS5cbiAgICAgKi8gICAgc3RhdGljIG5vdygpIHtcbiAgICAgICAgcmV0dXJuIHV0LmZyb21NaWxsaXMoRGF0ZS5ub3coKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgdGltZXN0YW1wIGZyb20gdGhlIGdpdmVuIGRhdGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGluaXRpYWxpemUgdGhlIGBUaW1lc3RhbXBgIGZyb20uXG4gICAgICogQHJldHVybnMgQSBuZXcgYFRpbWVzdGFtcGAgcmVwcmVzZW50aW5nIHRoZSBzYW1lIHBvaW50IGluIHRpbWUgYXMgdGhlIGdpdmVuXG4gICAgICogICAgIGRhdGUuXG4gICAgICovICAgIHN0YXRpYyBmcm9tRGF0ZSh0KSB7XG4gICAgICAgIHJldHVybiB1dC5mcm9tTWlsbGlzKHQuZ2V0VGltZSgpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyB0aW1lc3RhbXAgZnJvbSB0aGUgZ2l2ZW4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtaWxsaXNlY29uZHMgLSBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIFVuaXggZXBvY2hcbiAgICAgKiAgICAgMTk3MC0wMS0wMVQwMDowMDowMFouXG4gICAgICogQHJldHVybnMgQSBuZXcgYFRpbWVzdGFtcGAgcmVwcmVzZW50aW5nIHRoZSBzYW1lIHBvaW50IGluIHRpbWUgYXMgdGhlIGdpdmVuXG4gICAgICogICAgIG51bWJlciBvZiBtaWxsaXNlY29uZHMuXG4gICAgICovICAgIHN0YXRpYyBmcm9tTWlsbGlzKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IE1hdGguZmxvb3IodCAvIDFlMyksIG4gPSBNYXRoLmZsb29yKDFlNiAqICh0IC0gMWUzICogZSkpO1xuICAgICAgICByZXR1cm4gbmV3IHV0KGUsIG4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhIGBUaW1lc3RhbXBgIHRvIGEgSmF2YVNjcmlwdCBgRGF0ZWAgb2JqZWN0LiBUaGlzIGNvbnZlcnNpb25cbiAgICAgKiBjYXVzZXMgYSBsb3NzIG9mIHByZWNpc2lvbiBzaW5jZSBgRGF0ZWAgb2JqZWN0cyBvbmx5IHN1cHBvcnQgbWlsbGlzZWNvbmRcbiAgICAgKiBwcmVjaXNpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBKYXZhU2NyaXB0IGBEYXRlYCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzYW1lIHBvaW50IGluIHRpbWUgYXNcbiAgICAgKiAgICAgdGhpcyBgVGltZXN0YW1wYCwgd2l0aCBtaWxsaXNlY29uZCBwcmVjaXNpb24uXG4gICAgICovICAgIHRvRGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMudG9NaWxsaXMoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEgYFRpbWVzdGFtcGAgdG8gYSBudW1lcmljIHRpbWVzdGFtcCAoaW4gbWlsbGlzZWNvbmRzIHNpbmNlXG4gICAgICogZXBvY2gpLiBUaGlzIG9wZXJhdGlvbiBjYXVzZXMgYSBsb3NzIG9mIHByZWNpc2lvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBwb2ludCBpbiB0aW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyB0aW1lc3RhbXAsIHJlcHJlc2VudGVkIGFzXG4gICAgICogICAgIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIFVuaXggZXBvY2ggMTk3MC0wMS0wMVQwMDowMDowMFouXG4gICAgICovICAgIHRvTWlsbGlzKCkge1xuICAgICAgICByZXR1cm4gMWUzICogdGhpcy5zZWNvbmRzICsgdGhpcy5uYW5vc2Vjb25kcyAvIDFlNjtcbiAgICB9XG4gICAgX2NvbXBhcmVUbyh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlY29uZHMgPT09IHQuc2Vjb25kcyA/IHJ0KHRoaXMubmFub3NlY29uZHMsIHQubmFub3NlY29uZHMpIDogcnQodGhpcy5zZWNvbmRzLCB0LnNlY29uZHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBgVGltZXN0YW1wYCBpcyBlcXVhbCB0byB0aGUgcHJvdmlkZWQgb25lLlxuICAgICAqXG4gICAgICogQHBhcmFtIG90aGVyIC0gVGhlIGBUaW1lc3RhbXBgIHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoaXMgYFRpbWVzdGFtcGAgaXMgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIG9uZS5cbiAgICAgKi8gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIHJldHVybiB0LnNlY29uZHMgPT09IHRoaXMuc2Vjb25kcyAmJiB0Lm5hbm9zZWNvbmRzID09PSB0aGlzLm5hbm9zZWNvbmRzO1xuICAgIH1cbiAgICAvKiogUmV0dXJucyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBgVGltZXN0YW1wYC4gKi8gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBcIlRpbWVzdGFtcChzZWNvbmRzPVwiICsgdGhpcy5zZWNvbmRzICsgXCIsIG5hbm9zZWNvbmRzPVwiICsgdGhpcy5uYW5vc2Vjb25kcyArIFwiKVwiO1xuICAgIH1cbiAgICAvKiogUmV0dXJucyBhIEpTT04tc2VyaWFsaXphYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgYFRpbWVzdGFtcGAuICovICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNlY29uZHM6IHRoaXMuc2Vjb25kcyxcbiAgICAgICAgICAgIG5hbm9zZWNvbmRzOiB0aGlzLm5hbm9zZWNvbmRzXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgcHJpbWl0aXZlIHN0cmluZywgd2hpY2ggYWxsb3dzIGBUaW1lc3RhbXBgIG9iamVjdHNcbiAgICAgKiB0byBiZSBjb21wYXJlZCB1c2luZyB0aGUgYD5gLCBgPD1gLCBgPj1gIGFuZCBgPmAgb3BlcmF0b3JzLlxuICAgICAqLyAgICB2YWx1ZU9mKCkge1xuICAgICAgICAvLyBUaGlzIG1ldGhvZCByZXR1cm5zIGEgc3RyaW5nIG9mIHRoZSBmb3JtIDxzZWNvbmRzPi48bmFub3NlY29uZHM+IHdoZXJlXG4gICAgICAgIC8vIDxzZWNvbmRzPiBpcyB0cmFuc2xhdGVkIHRvIGhhdmUgYSBub24tbmVnYXRpdmUgdmFsdWUgYW5kIGJvdGggPHNlY29uZHM+XG4gICAgICAgIC8vIGFuZCA8bmFub3NlY29uZHM+IGFyZSBsZWZ0LXBhZGRlZCB3aXRoIHplcm9lcyB0byBiZSBhIGNvbnNpc3RlbnQgbGVuZ3RoLlxuICAgICAgICAvLyBTdHJpbmdzIHdpdGggdGhpcyBmb3JtYXQgdGhlbiBoYXZlIGEgbGV4aW9ncmFwaGljYWwgb3JkZXJpbmcgdGhhdCBtYXRjaGVzXG4gICAgICAgIC8vIHRoZSBleHBlY3RlZCBvcmRlcmluZy4gVGhlIDxzZWNvbmRzPiB0cmFuc2xhdGlvbiBpcyBkb25lIHRvIGF2b2lkIGhhdmluZ1xuICAgICAgICAvLyBhIGxlYWRpbmcgbmVnYXRpdmUgc2lnbiAoaS5lLiBhIGxlYWRpbmcgJy0nIGNoYXJhY3RlcikgaW4gaXRzIHN0cmluZ1xuICAgICAgICAvLyByZXByZXNlbnRhdGlvbiwgd2hpY2ggd291bGQgYWZmZWN0IGl0cyBsZXhpb2dyYXBoaWNhbCBvcmRlcmluZy5cbiAgICAgICAgY29uc3QgdCA9IHRoaXMuc2Vjb25kcyAtIC02MjEzNTU5NjgwMDtcbiAgICAgICAgLy8gTm90ZTogVXAgdG8gMTIgZGVjaW1hbCBkaWdpdHMgYXJlIHJlcXVpcmVkIHRvIHJlcHJlc2VudCBhbGwgdmFsaWRcbiAgICAgICAgLy8gJ3NlY29uZHMnIHZhbHVlcy5cbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHQpLnBhZFN0YXJ0KDEyLCBcIjBcIikgKyBcIi5cIiArIFN0cmluZyh0aGlzLm5hbm9zZWNvbmRzKS5wYWRTdGFydCg5LCBcIjBcIik7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIHZlcnNpb24gb2YgYSBkb2N1bWVudCBpbiBGaXJlc3RvcmUuIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIHZlcnNpb25cbiAqIHRpbWVzdGFtcCwgc3VjaCBhcyB1cGRhdGVfdGltZSBvciByZWFkX3RpbWUuXG4gKi8gY2xhc3MgY3Qge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy50aW1lc3RhbXAgPSB0O1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbVRpbWVzdGFtcCh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgY3QodCk7XG4gICAgfVxuICAgIHN0YXRpYyBtaW4oKSB7XG4gICAgICAgIHJldHVybiBuZXcgY3QobmV3IHV0KDAsIDApKTtcbiAgICB9XG4gICAgY29tcGFyZVRvKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGltZXN0YW1wLl9jb21wYXJlVG8odC50aW1lc3RhbXApO1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGltZXN0YW1wLmlzRXF1YWwodC50aW1lc3RhbXApO1xuICAgIH1cbiAgICAvKiogUmV0dXJucyBhIG51bWJlciByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVyc2lvbiBmb3IgdXNlIGluIHNwZWMgdGVzdHMuICovICAgIHRvTWljcm9zZWNvbmRzKCkge1xuICAgICAgICAvLyBDb252ZXJ0IHRvIG1pY3Jvc2Vjb25kcy5cbiAgICAgICAgcmV0dXJuIDFlNiAqIHRoaXMudGltZXN0YW1wLnNlY29uZHMgKyB0aGlzLnRpbWVzdGFtcC5uYW5vc2Vjb25kcyAvIDFlMztcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBcIlNuYXBzaG90VmVyc2lvbihcIiArIHRoaXMudGltZXN0YW1wLnRvU3RyaW5nKCkgKyBcIilcIjtcbiAgICB9XG4gICAgdG9UaW1lc3RhbXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRpbWVzdGFtcDtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGZ1bmN0aW9uIGh0KHQpIHtcbiAgICBsZXQgZSA9IDA7XG4gICAgZm9yIChjb25zdCBuIGluIHQpIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiBlKys7XG4gICAgcmV0dXJuIGU7XG59XG5cbmZ1bmN0aW9uIGx0KHQsIGUpIHtcbiAgICBmb3IgKGNvbnN0IG4gaW4gdCkgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIGUobiwgdFtuXSk7XG59XG5cbmZ1bmN0aW9uIGZ0KHQpIHtcbiAgICBmb3IgKGNvbnN0IGUgaW4gdCkgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBlKSkgcmV0dXJuICExO1xuICAgIHJldHVybiAhMDtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogUGF0aCByZXByZXNlbnRzIGFuIG9yZGVyZWQgc2VxdWVuY2Ugb2Ygc3RyaW5nIHNlZ21lbnRzLlxuICovXG5jbGFzcyBkdCB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbikge1xuICAgICAgICB2b2lkIDAgPT09IGUgPyBlID0gMCA6IGUgPiB0Lmxlbmd0aCAmJiBMKCksIHZvaWQgMCA9PT0gbiA/IG4gPSB0Lmxlbmd0aCAtIGUgOiBuID4gdC5sZW5ndGggLSBlICYmIEwoKSwgXG4gICAgICAgIHRoaXMuc2VnbWVudHMgPSB0LCB0aGlzLm9mZnNldCA9IGUsIHRoaXMubGVuID0gbjtcbiAgICB9XG4gICAgZ2V0IGxlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVuO1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIDAgPT09IGR0LmNvbXBhcmF0b3IodGhpcywgdCk7XG4gICAgfVxuICAgIGNoaWxkKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMuc2VnbWVudHMuc2xpY2UodGhpcy5vZmZzZXQsIHRoaXMubGltaXQoKSk7XG4gICAgICAgIHJldHVybiB0IGluc3RhbmNlb2YgZHQgPyB0LmZvckVhY2goKHQgPT4ge1xuICAgICAgICAgICAgZS5wdXNoKHQpO1xuICAgICAgICB9KSkgOiBlLnB1c2godCksIHRoaXMuY29uc3RydWN0KGUpO1xuICAgIH1cbiAgICAvKiogVGhlIGluZGV4IG9mIG9uZSBwYXN0IHRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIHBhdGguICovICAgIGxpbWl0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vZmZzZXQgKyB0aGlzLmxlbmd0aDtcbiAgICB9XG4gICAgcG9wRmlyc3QodCkge1xuICAgICAgICByZXR1cm4gdCA9IHZvaWQgMCA9PT0gdCA/IDEgOiB0LCB0aGlzLmNvbnN0cnVjdCh0aGlzLnNlZ21lbnRzLCB0aGlzLm9mZnNldCArIHQsIHRoaXMubGVuZ3RoIC0gdCk7XG4gICAgfVxuICAgIHBvcExhc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdCh0aGlzLnNlZ21lbnRzLCB0aGlzLm9mZnNldCwgdGhpcy5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgZmlyc3RTZWdtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWdtZW50c1t0aGlzLm9mZnNldF07XG4gICAgfVxuICAgIGxhc3RTZWdtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXQodGhpcy5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgZ2V0KHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VnbWVudHNbdGhpcy5vZmZzZXQgKyB0XTtcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIDAgPT09IHRoaXMubGVuZ3RoO1xuICAgIH1cbiAgICBpc1ByZWZpeE9mKHQpIHtcbiAgICAgICAgaWYgKHQubGVuZ3RoIDwgdGhpcy5sZW5ndGgpIHJldHVybiAhMTtcbiAgICAgICAgZm9yIChsZXQgZSA9IDA7IGUgPCB0aGlzLmxlbmd0aDsgZSsrKSBpZiAodGhpcy5nZXQoZSkgIT09IHQuZ2V0KGUpKSByZXR1cm4gITE7XG4gICAgICAgIHJldHVybiAhMDtcbiAgICB9XG4gICAgaXNJbW1lZGlhdGVQYXJlbnRPZih0KSB7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCArIDEgIT09IHQubGVuZ3RoKSByZXR1cm4gITE7XG4gICAgICAgIGZvciAobGV0IGUgPSAwOyBlIDwgdGhpcy5sZW5ndGg7IGUrKykgaWYgKHRoaXMuZ2V0KGUpICE9PSB0LmdldChlKSkgcmV0dXJuICExO1xuICAgICAgICByZXR1cm4gITA7XG4gICAgfVxuICAgIGZvckVhY2godCkge1xuICAgICAgICBmb3IgKGxldCBlID0gdGhpcy5vZmZzZXQsIG4gPSB0aGlzLmxpbWl0KCk7IGUgPCBuOyBlKyspIHQodGhpcy5zZWdtZW50c1tlXSk7XG4gICAgfVxuICAgIHRvQXJyYXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlZ21lbnRzLnNsaWNlKHRoaXMub2Zmc2V0LCB0aGlzLmxpbWl0KCkpO1xuICAgIH1cbiAgICBzdGF0aWMgY29tcGFyYXRvcih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBNYXRoLm1pbih0Lmxlbmd0aCwgZS5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBzID0gMDsgcyA8IG47IHMrKykge1xuICAgICAgICAgICAgY29uc3QgbiA9IHQuZ2V0KHMpLCBpID0gZS5nZXQocyk7XG4gICAgICAgICAgICBpZiAobiA8IGkpIHJldHVybiAtMTtcbiAgICAgICAgICAgIGlmIChuID4gaSkgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQubGVuZ3RoIDwgZS5sZW5ndGggPyAtMSA6IHQubGVuZ3RoID4gZS5sZW5ndGggPyAxIDogMDtcbiAgICB9XG59XG5cbi8qKlxuICogQSBzbGFzaC1zZXBhcmF0ZWQgcGF0aCBmb3IgbmF2aWdhdGluZyByZXNvdXJjZXMgKGRvY3VtZW50cyBhbmQgY29sbGVjdGlvbnMpXG4gKiB3aXRoaW4gRmlyZXN0b3JlLlxuICpcbiAqIEBpbnRlcm5hbFxuICovIGNsYXNzIF90IGV4dGVuZHMgZHQge1xuICAgIGNvbnN0cnVjdCh0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiBuZXcgX3QodCwgZSwgbik7XG4gICAgfVxuICAgIGNhbm9uaWNhbFN0cmluZygpIHtcbiAgICAgICAgLy8gTk9URTogVGhlIGNsaWVudCBpcyBpZ25vcmFudCBvZiBhbnkgcGF0aCBzZWdtZW50cyBjb250YWluaW5nIGVzY2FwZVxuICAgICAgICAvLyBzZXF1ZW5jZXMgKGUuZy4gX19pZDEyM19fKSBhbmQganVzdCBwYXNzZXMgdGhlbSB0aHJvdWdoIHJhdyAodGhleSBleGlzdFxuICAgICAgICAvLyBmb3IgbGVnYWN5IHJlYXNvbnMgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBmcmVxdWVudGx5KS5cbiAgICAgICAgcmV0dXJuIHRoaXMudG9BcnJheSgpLmpvaW4oXCIvXCIpO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2Fub25pY2FsU3RyaW5nKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSByZXNvdXJjZSBwYXRoIGZyb20gdGhlIGdpdmVuIHNsYXNoLWRlbGltaXRlZCBzdHJpbmcuIElmIG11bHRpcGxlXG4gICAgICogYXJndW1lbnRzIGFyZSBwcm92aWRlZCwgYWxsIGNvbXBvbmVudHMgYXJlIGNvbWJpbmVkLiBMZWFkaW5nIGFuZCB0cmFpbGluZ1xuICAgICAqIHNsYXNoZXMgZnJvbSBhbGwgY29tcG9uZW50cyBhcmUgaWdub3JlZC5cbiAgICAgKi8gICAgc3RhdGljIGZyb21TdHJpbmcoLi4udCkge1xuICAgICAgICAvLyBOT1RFOiBUaGUgY2xpZW50IGlzIGlnbm9yYW50IG9mIGFueSBwYXRoIHNlZ21lbnRzIGNvbnRhaW5pbmcgZXNjYXBlXG4gICAgICAgIC8vIHNlcXVlbmNlcyAoZS5nLiBfX2lkMTIzX18pIGFuZCBqdXN0IHBhc3NlcyB0aGVtIHRocm91Z2ggcmF3ICh0aGV5IGV4aXN0XG4gICAgICAgIC8vIGZvciBsZWdhY3kgcmVhc29ucyBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGZyZXF1ZW50bHkpLlxuICAgICAgICBjb25zdCBlID0gW107XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiB0KSB7XG4gICAgICAgICAgICBpZiAobi5pbmRleE9mKFwiLy9cIikgPj0gMCkgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBgSW52YWxpZCBzZWdtZW50ICgke259KS4gUGF0aHMgbXVzdCBub3QgY29udGFpbiAvLyBpbiB0aGVtLmApO1xuICAgICAgICAgICAgLy8gU3RyaXAgbGVhZGluZyBhbmQgdHJhbGluZyBzbGFzaGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgZS5wdXNoKC4uLm4uc3BsaXQoXCIvXCIpLmZpbHRlcigodCA9PiB0Lmxlbmd0aCA+IDApKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBfdChlKTtcbiAgICB9XG4gICAgc3RhdGljIGVtcHR5UGF0aCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBfdChbXSk7XG4gICAgfVxufVxuXG5jb25zdCB3dCA9IC9eW19hLXpBLVpdW19hLXpBLVowLTldKiQvO1xuXG4vKipcbiAqIEEgZG90LXNlcGFyYXRlZCBwYXRoIGZvciBuYXZpZ2F0aW5nIHN1Yi1vYmplY3RzIHdpdGhpbiBhIGRvY3VtZW50LlxuICogQGludGVybmFsXG4gKi8gY2xhc3MgbXQgZXh0ZW5kcyBkdCB7XG4gICAgY29uc3RydWN0KHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBtdCh0LCBlLCBuKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdHJpbmcgY291bGQgYmUgdXNlZCBhcyBhIHNlZ21lbnQgaW4gYSBmaWVsZCBwYXRoXG4gICAgICogd2l0aG91dCBlc2NhcGluZy5cbiAgICAgKi8gICAgc3RhdGljIGlzVmFsaWRJZGVudGlmaWVyKHQpIHtcbiAgICAgICAgcmV0dXJuIHd0LnRlc3QodCk7XG4gICAgfVxuICAgIGNhbm9uaWNhbFN0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9BcnJheSgpLm1hcCgodCA9PiAodCA9IHQucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpLnJlcGxhY2UoL2AvZywgXCJcXFxcYFwiKSwgXG4gICAgICAgIG10LmlzVmFsaWRJZGVudGlmaWVyKHQpIHx8ICh0ID0gXCJgXCIgKyB0ICsgXCJgXCIpLCB0KSkpLmpvaW4oXCIuXCIpO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2Fub25pY2FsU3RyaW5nKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGZpZWxkIHJlZmVyZW5jZXMgdGhlIGtleSBvZiBhIGRvY3VtZW50LlxuICAgICAqLyAgICBpc0tleUZpZWxkKCkge1xuICAgICAgICByZXR1cm4gMSA9PT0gdGhpcy5sZW5ndGggJiYgXCJfX25hbWVfX1wiID09PSB0aGlzLmdldCgwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGZpZWxkIGRlc2lnbmF0aW5nIHRoZSBrZXkgb2YgYSBkb2N1bWVudC5cbiAgICAgKi8gICAgc3RhdGljIGtleUZpZWxkKCkge1xuICAgICAgICByZXR1cm4gbmV3IG10KFsgXCJfX25hbWVfX1wiIF0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSBmaWVsZCBzdHJpbmcgZnJvbSB0aGUgZ2l2ZW4gc2VydmVyLWZvcm1hdHRlZCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiAtIFNwbGl0dGluZyB0aGUgZW1wdHkgc3RyaW5nIGlzIG5vdCBhbGxvd2VkIChmb3Igbm93IGF0IGxlYXN0KS5cbiAgICAgKiAtIEVtcHR5IHNlZ21lbnRzIHdpdGhpbiB0aGUgc3RyaW5nIChlLmcuIGlmIHRoZXJlIGFyZSB0d28gY29uc2VjdXRpdmVcbiAgICAgKiAgIHNlcGFyYXRvcnMpIGFyZSBub3QgYWxsb3dlZC5cbiAgICAgKlxuICAgICAqIFRPRE8oYi8zNzI0NDE1Nyk6IHdlIHNob3VsZCBtYWtlIHRoaXMgbW9yZSBzdHJpY3QuIFJpZ2h0IG5vdywgaXQgYWxsb3dzXG4gICAgICogbm9uLWlkZW50aWZpZXIgcGF0aCBjb21wb25lbnRzLCBldmVuIGlmIHRoZXkgYXJlbid0IGVzY2FwZWQuXG4gICAgICovICAgIHN0YXRpYyBmcm9tU2VydmVyRm9ybWF0KHQpIHtcbiAgICAgICAgY29uc3QgZSA9IFtdO1xuICAgICAgICBsZXQgbiA9IFwiXCIsIHMgPSAwO1xuICAgICAgICBjb25zdCBpID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKDAgPT09IG4ubGVuZ3RoKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIGBJbnZhbGlkIGZpZWxkIHBhdGggKCR7dH0pLiBQYXRocyBtdXN0IG5vdCBiZSBlbXB0eSwgYmVnaW4gd2l0aCAnLicsIGVuZCB3aXRoICcuJywgb3IgY29udGFpbiAnLi4nYCk7XG4gICAgICAgICAgICBlLnB1c2gobiksIG4gPSBcIlwiO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgciA9ICExO1xuICAgICAgICBmb3IgKDtzIDwgdC5sZW5ndGg7ICkge1xuICAgICAgICAgICAgY29uc3QgZSA9IHRbc107XG4gICAgICAgICAgICBpZiAoXCJcXFxcXCIgPT09IGUpIHtcbiAgICAgICAgICAgICAgICBpZiAocyArIDEgPT09IHQubGVuZ3RoKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIFwiUGF0aCBoYXMgdHJhaWxpbmcgZXNjYXBlIGNoYXJhY3RlcjogXCIgKyB0KTtcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gdFtzICsgMV07XG4gICAgICAgICAgICAgICAgaWYgKFwiXFxcXFwiICE9PSBlICYmIFwiLlwiICE9PSBlICYmIFwiYFwiICE9PSBlKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIFwiUGF0aCBoYXMgaW52YWxpZCBlc2NhcGUgc2VxdWVuY2U6IFwiICsgdCk7XG4gICAgICAgICAgICAgICAgbiArPSBlLCBzICs9IDI7XG4gICAgICAgICAgICB9IGVsc2UgXCJgXCIgPT09IGUgPyAociA9ICFyLCBzKyspIDogXCIuXCIgIT09IGUgfHwgciA/IChuICs9IGUsIHMrKykgOiAoaSgpLCBzKyspO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpKCksIHIpIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgXCJVbnRlcm1pbmF0ZWQgYCBpbiBwYXRoOiBcIiArIHQpO1xuICAgICAgICByZXR1cm4gbmV3IG10KGUpO1xuICAgIH1cbiAgICBzdGF0aWMgZW1wdHlQYXRoKCkge1xuICAgICAgICByZXR1cm4gbmV3IG10KFtdKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFByb3ZpZGVzIGEgc2V0IG9mIGZpZWxkcyB0aGF0IGNhbiBiZSB1c2VkIHRvIHBhcnRpYWxseSBwYXRjaCBhIGRvY3VtZW50LlxuICogRmllbGRNYXNrIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBPYmplY3RWYWx1ZS5cbiAqIEV4YW1wbGVzOlxuICogICBmb28gLSBPdmVyd3JpdGVzIGZvbyBlbnRpcmVseSB3aXRoIHRoZSBwcm92aWRlZCB2YWx1ZS4gSWYgZm9vIGlzIG5vdFxuICogICAgICAgICBwcmVzZW50IGluIHRoZSBjb21wYW5pb24gT2JqZWN0VmFsdWUsIHRoZSBmaWVsZCBpcyBkZWxldGVkLlxuICogICBmb28uYmFyIC0gT3ZlcndyaXRlcyBvbmx5IHRoZSBmaWVsZCBiYXIgb2YgdGhlIG9iamVjdCBmb28uXG4gKiAgICAgICAgICAgICBJZiBmb28gaXMgbm90IGFuIG9iamVjdCwgZm9vIGlzIHJlcGxhY2VkIHdpdGggYW4gb2JqZWN0XG4gKiAgICAgICAgICAgICBjb250YWluaW5nIGZvb1xuICovIGNsYXNzIGd0IHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMuZmllbGRzID0gdCwgXG4gICAgICAgIC8vIFRPRE8oZGltb25kKTogdmFsaWRhdGlvbiBvZiBGaWVsZE1hc2tcbiAgICAgICAgLy8gU29ydCB0aGUgZmllbGQgbWFzayB0byBzdXBwb3J0IGBGaWVsZE1hc2suaXNFcXVhbCgpYCBhbmQgYXNzZXJ0IGJlbG93LlxuICAgICAgICB0LnNvcnQobXQuY29tcGFyYXRvcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFZlcmlmaWVzIHRoYXQgYGZpZWxkUGF0aGAgaXMgaW5jbHVkZWQgYnkgYXQgbGVhc3Qgb25lIGZpZWxkIGluIHRoaXMgZmllbGRcbiAgICAgKiBtYXNrLlxuICAgICAqXG4gICAgICogVGhpcyBpcyBhbiBPKG4pIG9wZXJhdGlvbiwgd2hlcmUgYG5gIGlzIHRoZSBzaXplIG9mIHRoZSBmaWVsZCBtYXNrLlxuICAgICAqLyAgICBjb3ZlcnModCkge1xuICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdGhpcy5maWVsZHMpIGlmIChlLmlzUHJlZml4T2YodCkpIHJldHVybiAhMDtcbiAgICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIG90KHRoaXMuZmllbGRzLCB0LmZpZWxkcywgKCh0LCBlKSA9PiB0LmlzRXF1YWwoZSkpKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogQ29udmVydHMgYSBCYXNlNjQgZW5jb2RlZCBzdHJpbmcgdG8gYSBiaW5hcnkgc3RyaW5nLiAqL1xuLyoqIFRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIEJhc2U2NCBjb252ZXJzaW9uIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlLiAqL1xuZnVuY3Rpb24geXQoKSB7XG4gICAgcmV0dXJuIFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIGF0b2I7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEltbXV0YWJsZSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgYSBcInByb3RvXCIgYnl0ZSBzdHJpbmcuXG4gKlxuICogUHJvdG8gYnl0ZSBzdHJpbmdzIGNhbiBlaXRoZXIgYmUgQmFzZTY0LWVuY29kZWQgc3RyaW5ncyBvciBVaW50OEFycmF5cyB3aGVuXG4gKiBzZW50IG9uIHRoZSB3aXJlLiBUaGlzIGNsYXNzIGFic3RyYWN0cyBhd2F5IHRoaXMgZGlmZmVyZW50aWF0aW9uIGJ5IGhvbGRpbmdcbiAqIHRoZSBwcm90byBieXRlIHN0cmluZyBpbiBhIGNvbW1vbiBjbGFzcyB0aGF0IG11c3QgYmUgY29udmVydGVkIGludG8gYSBzdHJpbmdcbiAqIGJlZm9yZSBiZWluZyBzZW50IGFzIGEgcHJvdG8uXG4gKiBAaW50ZXJuYWxcbiAqLyBjbGFzcyBwdCB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLmJpbmFyeVN0cmluZyA9IHQ7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tQmFzZTY0U3RyaW5nKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IGF0b2IodCk7XG4gICAgICAgIHJldHVybiBuZXcgcHQoZSk7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tVWludDhBcnJheSh0KSB7XG4gICAgICAgIC8vIFRPRE8oaW5kZXhpbmcpOyBSZW1vdmUgdGhlIGNvcHkgb2YgdGhlIGJ5dGUgc3RyaW5nIGhlcmUgYXMgdGhpcyBtZXRob2RcbiAgICAgICAgLy8gaXMgZnJlcXVlbnRseSBjYWxsZWQgZHVyaW5nIGluZGV4aW5nLlxuICAgICAgICBjb25zdCBlID0gXG4gICAgICAgIC8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGNvbnZlcnQgYW4gVWludDhhcnJheSB0byBhIGJpbmFyeSBzdHJpbmcuXG4gKi9cbiAgICAgICAgZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgbGV0IGUgPSBcIlwiO1xuICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCB0Lmxlbmd0aDsgKytuKSBlICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodFtuXSk7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBjb252ZXJ0IGEgYmluYXJ5IHN0cmluZyB0byBhbiBVaW50OEFycmF5LlxuICovICh0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBwdChlKTtcbiAgICB9XG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIGxldCB0ID0gMDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHQgPCB0aGlzLmJpbmFyeVN0cmluZy5sZW5ndGggPyB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuYmluYXJ5U3RyaW5nLmNoYXJDb2RlQXQodCsrKSxcbiAgICAgICAgICAgICAgICBkb25lOiAhMVxuICAgICAgICAgICAgfSA6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogdm9pZCAwLFxuICAgICAgICAgICAgICAgIGRvbmU6ICEwXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIHRvQmFzZTY0KCkge1xuICAgICAgICByZXR1cm4gdCA9IHRoaXMuYmluYXJ5U3RyaW5nLCBidG9hKHQpO1xuICAgICAgICAvKiogQ29udmVydHMgYSBiaW5hcnkgc3RyaW5nIHRvIGEgQmFzZTY0IGVuY29kZWQgc3RyaW5nLiAqL1xuICAgICAgICB2YXIgdDtcbiAgICB9XG4gICAgdG9VaW50OEFycmF5KCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBVaW50OEFycmF5KHQubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdC5sZW5ndGg7IG4rKykgZVtuXSA9IHQuY2hhckNvZGVBdChuKTtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4gICAgICAgIC8vIEEgUmVnRXhwIG1hdGNoaW5nIElTTyA4NjAxIFVUQyB0aW1lc3RhbXBzIHdpdGggb3B0aW9uYWwgZnJhY3Rpb24uXG4gICAgICAgICh0aGlzLmJpbmFyeVN0cmluZyk7XG4gICAgfVxuICAgIGFwcHJveGltYXRlQnl0ZVNpemUoKSB7XG4gICAgICAgIHJldHVybiAyICogdGhpcy5iaW5hcnlTdHJpbmcubGVuZ3RoO1xuICAgIH1cbiAgICBjb21wYXJlVG8odCkge1xuICAgICAgICByZXR1cm4gcnQodGhpcy5iaW5hcnlTdHJpbmcsIHQuYmluYXJ5U3RyaW5nKTtcbiAgICB9XG4gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbmFyeVN0cmluZyA9PT0gdC5iaW5hcnlTdHJpbmc7XG4gICAgfVxufVxuXG5wdC5FTVBUWV9CWVRFX1NUUklORyA9IG5ldyBwdChcIlwiKTtcblxuY29uc3QgSXQgPSBuZXcgUmVnRXhwKC9eXFxkezR9LVxcZFxcZC1cXGRcXGRUXFxkXFxkOlxcZFxcZDpcXGRcXGQoPzpcXC4oXFxkKykpP1okLyk7XG5cbi8qKlxuICogQ29udmVydHMgdGhlIHBvc3NpYmxlIFByb3RvIHZhbHVlcyBmb3IgYSB0aW1lc3RhbXAgdmFsdWUgaW50byBhIFwic2Vjb25kcyBhbmRcbiAqIG5hbm9zXCIgcmVwcmVzZW50YXRpb24uXG4gKi8gZnVuY3Rpb24gVHQodCkge1xuICAgIC8vIFRoZSBqc29uIGludGVyZmFjZSAoZm9yIHRoZSBicm93c2VyKSB3aWxsIHJldHVybiBhbiBpc28gdGltZXN0YW1wIHN0cmluZyxcbiAgICAvLyB3aGlsZSB0aGUgcHJvdG8ganMgbGlicmFyeSAoZm9yIG5vZGUpIHdpbGwgcmV0dXJuIGFcbiAgICAvLyBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wIGluc3RhbmNlLlxuICAgIGlmIChxKCEhdCksIFwic3RyaW5nXCIgPT0gdHlwZW9mIHQpIHtcbiAgICAgICAgLy8gVGhlIGRhdGUgc3RyaW5nIGNhbiBoYXZlIGhpZ2hlciBwcmVjaXNpb24gKG5hbm9zKSB0aGFuIHRoZSBEYXRlIGNsYXNzXG4gICAgICAgIC8vIChtaWxsaXMpLCBzbyB3ZSBkbyBzb21lIGN1c3RvbSBwYXJzaW5nIGhlcmUuXG4gICAgICAgIC8vIFBhcnNlIHRoZSBuYW5vcyByaWdodCBvdXQgb2YgdGhlIHN0cmluZy5cbiAgICAgICAgbGV0IGUgPSAwO1xuICAgICAgICBjb25zdCBuID0gSXQuZXhlYyh0KTtcbiAgICAgICAgaWYgKHEoISFuKSwgblsxXSkge1xuICAgICAgICAgICAgLy8gUGFkIHRoZSBmcmFjdGlvbiBvdXQgdG8gOSBkaWdpdHMgKG5hbm9zKS5cbiAgICAgICAgICAgIGxldCB0ID0gblsxXTtcbiAgICAgICAgICAgIHQgPSAodCArIFwiMDAwMDAwMDAwXCIpLnN1YnN0cigwLCA5KSwgZSA9IE51bWJlcih0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQYXJzZSB0aGUgZGF0ZSB0byBnZXQgdGhlIHNlY29uZHMuXG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IG5ldyBEYXRlKHQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2Vjb25kczogTWF0aC5mbG9vcihzLmdldFRpbWUoKSAvIDFlMyksXG4gICAgICAgICAgICBuYW5vczogZVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBzZWNvbmRzOiBFdCh0LnNlY29uZHMpLFxuICAgICAgICBuYW5vczogRXQodC5uYW5vcylcbiAgICB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBwb3NzaWJsZSBQcm90byB0eXBlcyBmb3IgbnVtYmVycyBpbnRvIGEgSmF2YVNjcmlwdCBudW1iZXIuXG4gKiBSZXR1cm5zIDAgaWYgdGhlIHZhbHVlIGlzIG5vdCBudW1lcmljLlxuICovIGZ1bmN0aW9uIEV0KHQpIHtcbiAgICAvLyBUT0RPKGJqb3JuaWNrKTogSGFuZGxlIGludDY0IGdyZWF0ZXIgdGhhbiA1MyBiaXRzLlxuICAgIHJldHVybiBcIm51bWJlclwiID09IHR5cGVvZiB0ID8gdCA6IFwic3RyaW5nXCIgPT0gdHlwZW9mIHQgPyBOdW1iZXIodCkgOiAwO1xufVxuXG4vKiogQ29udmVydHMgdGhlIHBvc3NpYmxlIFByb3RvIHR5cGVzIGZvciBCbG9icyBpbnRvIGEgQnl0ZVN0cmluZy4gKi8gZnVuY3Rpb24gQXQodCkge1xuICAgIHJldHVybiBcInN0cmluZ1wiID09IHR5cGVvZiB0ID8gcHQuZnJvbUJhc2U2NFN0cmluZyh0KSA6IHB0LmZyb21VaW50OEFycmF5KHQpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgbG9jYWxseS1hcHBsaWVkIFNlcnZlclRpbWVzdGFtcC5cbiAqXG4gKiBTZXJ2ZXIgVGltZXN0YW1wcyBhcmUgYmFja2VkIGJ5IE1hcFZhbHVlcyB0aGF0IGNvbnRhaW4gYW4gaW50ZXJuYWwgZmllbGRcbiAqIGBfX3R5cGVfX2Agd2l0aCBhIHZhbHVlIG9mIGBzZXJ2ZXJfdGltZXN0YW1wYC4gVGhlIHByZXZpb3VzIHZhbHVlIGFuZCBsb2NhbFxuICogd3JpdGUgdGltZSBhcmUgc3RvcmVkIGluIGl0cyBgX19wcmV2aW91c192YWx1ZV9fYCBhbmQgYF9fbG9jYWxfd3JpdGVfdGltZV9fYFxuICogZmllbGRzIHJlc3BlY3RpdmVseS5cbiAqXG4gKiBOb3RlczpcbiAqIC0gU2VydmVyVGltZXN0YW1wVmFsdWUgaW5zdGFuY2VzIGFyZSBjcmVhdGVkIGFzIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgYVxuICogICB0cmFuc2Zvcm0uIFRoZXkgY2FuIG9ubHkgZXhpc3QgaW4gdGhlIGxvY2FsIHZpZXcgb2YgYSBkb2N1bWVudC4gVGhlcmVmb3JlXG4gKiAgIHRoZXkgZG8gbm90IG5lZWQgdG8gYmUgcGFyc2VkIG9yIHNlcmlhbGl6ZWQuXG4gKiAtIFdoZW4gZXZhbHVhdGVkIGxvY2FsbHkgKGUuZy4gZm9yIHNuYXBzaG90LmRhdGEoKSksIHRoZXkgYnkgZGVmYXVsdFxuICogICBldmFsdWF0ZSB0byBgbnVsbGAuIFRoaXMgYmVoYXZpb3IgY2FuIGJlIGNvbmZpZ3VyZWQgYnkgcGFzc2luZyBjdXN0b21cbiAqICAgRmllbGRWYWx1ZU9wdGlvbnMgdG8gdmFsdWUoKS5cbiAqIC0gV2l0aCByZXNwZWN0IHRvIG90aGVyIFNlcnZlclRpbWVzdGFtcFZhbHVlcywgdGhleSBzb3J0IGJ5IHRoZWlyXG4gKiAgIGxvY2FsV3JpdGVUaW1lLlxuICovIGZ1bmN0aW9uIFJ0KHQpIHtcbiAgICB2YXIgZSwgbjtcbiAgICByZXR1cm4gXCJzZXJ2ZXJfdGltZXN0YW1wXCIgPT09IChudWxsID09PSAobiA9ICgobnVsbCA9PT0gKGUgPSBudWxsID09IHQgPyB2b2lkIDAgOiB0Lm1hcFZhbHVlKSB8fCB2b2lkIDAgPT09IGUgPyB2b2lkIDAgOiBlLmZpZWxkcykgfHwge30pLl9fdHlwZV9fKSB8fCB2b2lkIDAgPT09IG4gPyB2b2lkIDAgOiBuLnN0cmluZ1ZhbHVlKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFNlcnZlclRpbWVzdGFtcCBwcm90byB2YWx1ZSAodXNpbmcgdGhlIGludGVybmFsIGZvcm1hdCkuXG4gKi9cbi8qKlxuICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIGJlZm9yZSB0aGlzIFNlcnZlclRpbWVzdGFtcCB3YXMgc2V0LlxuICpcbiAqIFByZXNlcnZpbmcgdGhlIHByZXZpb3VzIHZhbHVlcyBhbGxvd3MgdGhlIHVzZXIgdG8gZGlzcGxheSB0aGUgbGFzdCByZXNvbGVkXG4gKiB2YWx1ZSB1bnRpbCB0aGUgYmFja2VuZCByZXNwb25kcyB3aXRoIHRoZSB0aW1lc3RhbXAuXG4gKi9cbmZ1bmN0aW9uIGJ0KHQpIHtcbiAgICBjb25zdCBlID0gdC5tYXBWYWx1ZS5maWVsZHMuX19wcmV2aW91c192YWx1ZV9fO1xuICAgIHJldHVybiBSdChlKSA/IGJ0KGUpIDogZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsb2NhbCB0aW1lIGF0IHdoaWNoIHRoaXMgdGltZXN0YW1wIHdhcyBmaXJzdCBzZXQuXG4gKi8gZnVuY3Rpb24gUHQodCkge1xuICAgIGNvbnN0IGUgPSBUdCh0Lm1hcFZhbHVlLmZpZWxkcy5fX2xvY2FsX3dyaXRlX3RpbWVfXy50aW1lc3RhbXBWYWx1ZSk7XG4gICAgcmV0dXJuIG5ldyB1dChlLnNlY29uZHMsIGUubmFub3MpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjbGFzcyBWdCB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIERhdGFiYXNlSW5mbyB1c2luZyB0aGUgcHJvdmlkZWQgaG9zdCwgZGF0YWJhc2VJZCBhbmRcbiAgICAgKiBwZXJzaXN0ZW5jZUtleS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRhYmFzZUlkIC0gVGhlIGRhdGFiYXNlIHRvIHVzZS5cbiAgICAgKiBAcGFyYW0gYXBwSWQgLSBUaGUgRmlyZWJhc2UgQXBwIElkLlxuICAgICAqIEBwYXJhbSBwZXJzaXN0ZW5jZUtleSAtIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgRmlyZXN0b3JlJ3MgbG9jYWxcbiAgICAgKiBzdG9yYWdlICh1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGRhdGFiYXNlSWQpLlxuICAgICAqIEBwYXJhbSBob3N0IC0gVGhlIEZpcmVzdG9yZSBiYWNrZW5kIGhvc3QgdG8gY29ubmVjdCB0by5cbiAgICAgKiBAcGFyYW0gc3NsIC0gV2hldGhlciB0byB1c2UgU1NMIHdoZW4gY29ubmVjdGluZy5cbiAgICAgKiBAcGFyYW0gZm9yY2VMb25nUG9sbGluZyAtIFdoZXRoZXIgdG8gdXNlIHRoZSBmb3JjZUxvbmdQb2xsaW5nIG9wdGlvblxuICAgICAqIHdoZW4gdXNpbmcgV2ViQ2hhbm5lbCBhcyB0aGUgbmV0d29yayB0cmFuc3BvcnQuXG4gICAgICogQHBhcmFtIGF1dG9EZXRlY3RMb25nUG9sbGluZyAtIFdoZXRoZXIgdG8gdXNlIHRoZSBkZXRlY3RCdWZmZXJpbmdQcm94eVxuICAgICAqIG9wdGlvbiB3aGVuIHVzaW5nIFdlYkNoYW5uZWwgYXMgdGhlIG5ldHdvcmsgdHJhbnNwb3J0LlxuICAgICAqIEBwYXJhbSB1c2VGZXRjaFN0cmVhbXMgV2hldGhlciB0byB1c2UgdGhlIEZldGNoIEFQSSBpbnN0ZWFkIG9mXG4gICAgICogWE1MSFRUUFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuLCBzLCBpLCByLCBvLCBhKSB7XG4gICAgICAgIHRoaXMuZGF0YWJhc2VJZCA9IHQsIHRoaXMuYXBwSWQgPSBlLCB0aGlzLnBlcnNpc3RlbmNlS2V5ID0gbiwgdGhpcy5ob3N0ID0gcywgdGhpcy5zc2wgPSBpLCBcbiAgICAgICAgdGhpcy5mb3JjZUxvbmdQb2xsaW5nID0gciwgdGhpcy5hdXRvRGV0ZWN0TG9uZ1BvbGxpbmcgPSBvLCB0aGlzLnVzZUZldGNoU3RyZWFtcyA9IGE7XG4gICAgfVxufVxuXG4vKiogVGhlIGRlZmF1bHQgZGF0YWJhc2UgbmFtZSBmb3IgYSBwcm9qZWN0LiAqL1xuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBkYXRhYmFzZSBJRCBhIEZpcmVzdG9yZSBjbGllbnQgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICogQGludGVybmFsXG4gKi9cbmNsYXNzIHZ0IHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMucHJvamVjdElkID0gdCwgdGhpcy5kYXRhYmFzZSA9IGUgfHwgXCIoZGVmYXVsdClcIjtcbiAgICB9XG4gICAgc3RhdGljIGVtcHR5KCkge1xuICAgICAgICByZXR1cm4gbmV3IHZ0KFwiXCIsIFwiXCIpO1xuICAgIH1cbiAgICBnZXQgaXNEZWZhdWx0RGF0YWJhc2UoKSB7XG4gICAgICAgIHJldHVybiBcIihkZWZhdWx0KVwiID09PSB0aGlzLmRhdGFiYXNlO1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgaW5zdGFuY2VvZiB2dCAmJiB0LnByb2plY3RJZCA9PT0gdGhpcy5wcm9qZWN0SWQgJiYgdC5kYXRhYmFzZSA9PT0gdGhpcy5kYXRhYmFzZTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogU2VudGluZWwgdmFsdWUgdGhhdCBzb3J0cyBiZWZvcmUgYW55IE11dGF0aW9uIEJhdGNoIElELiAqL1xuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgYSB2YXJpYWJsZSBpcyBlaXRoZXIgdW5kZWZpbmVkIG9yIG51bGwuXG4gKi9cbmZ1bmN0aW9uIFN0KHQpIHtcbiAgICByZXR1cm4gbnVsbCA9PSB0O1xufVxuXG4vKiogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSByZXByZXNlbnRzIC0wLiAqLyBmdW5jdGlvbiBEdCh0KSB7XG4gICAgLy8gRGV0ZWN0IGlmIHRoZSB2YWx1ZSBpcyAtMC4wLiBCYXNlZCBvbiBwb2x5ZmlsbCBmcm9tXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzXG4gICAgcmV0dXJuIDAgPT09IHQgJiYgMSAvIHQgPT0gLTEgLyAwO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBhIHZhbHVlIGlzIGFuIGludGVnZXIgYW5kIGluIHRoZSBzYWZlIGludGVnZXIgcmFuZ2VcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB0ZXN0IGZvciBiZWluZyBhbiBpbnRlZ2VyIGFuZCBpbiB0aGUgc2FmZSByYW5nZVxuICovIGZ1bmN0aW9uIEN0KHQpIHtcbiAgICByZXR1cm4gXCJudW1iZXJcIiA9PSB0eXBlb2YgdCAmJiBOdW1iZXIuaXNJbnRlZ2VyKHQpICYmICFEdCh0KSAmJiB0IDw9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSICYmIHQgPj0gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVI7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBpbnRlcm5hbFxuICovIGNsYXNzIHh0IHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMucGF0aCA9IHQ7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tUGF0aCh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgeHQoX3QuZnJvbVN0cmluZyh0KSk7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tTmFtZSh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgeHQoX3QuZnJvbVN0cmluZyh0KS5wb3BGaXJzdCg1KSk7XG4gICAgfVxuICAgIHN0YXRpYyBlbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB4dChfdC5lbXB0eVBhdGgoKSk7XG4gICAgfVxuICAgIGdldCBjb2xsZWN0aW9uR3JvdXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhdGgucG9wTGFzdCgpLmxhc3RTZWdtZW50KCk7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRvY3VtZW50IGlzIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbklkLiAqLyAgICBoYXNDb2xsZWN0aW9uSWQodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXRoLmxlbmd0aCA+PSAyICYmIHRoaXMucGF0aC5nZXQodGhpcy5wYXRoLmxlbmd0aCAtIDIpID09PSB0O1xuICAgIH1cbiAgICAvKiogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBncm91cCAoaS5lLiB0aGUgbmFtZSBvZiB0aGUgcGFyZW50IGNvbGxlY3Rpb24pIGZvciB0aGlzIGtleS4gKi8gICAgZ2V0Q29sbGVjdGlvbkdyb3VwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXRoLmdldCh0aGlzLnBhdGgubGVuZ3RoIC0gMik7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIHRoZSBmdWxseSBxdWFsaWZpZWQgcGF0aCB0byB0aGUgcGFyZW50IGNvbGxlY3Rpb24uICovICAgIGdldENvbGxlY3Rpb25QYXRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXRoLnBvcExhc3QoKTtcbiAgICB9XG4gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIHJldHVybiBudWxsICE9PSB0ICYmIDAgPT09IF90LmNvbXBhcmF0b3IodGhpcy5wYXRoLCB0LnBhdGgpO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGF0aC50b1N0cmluZygpO1xuICAgIH1cbiAgICBzdGF0aWMgY29tcGFyYXRvcih0LCBlKSB7XG4gICAgICAgIHJldHVybiBfdC5jb21wYXJhdG9yKHQucGF0aCwgZS5wYXRoKTtcbiAgICB9XG4gICAgc3RhdGljIGlzRG9jdW1lbnRLZXkodCkge1xuICAgICAgICByZXR1cm4gdC5sZW5ndGggJSAyID09IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgZG9jdW1lbnQga2V5IHdpdGggdGhlIGdpdmVuIHNlZ21lbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNlZ21lbnRzIC0gVGhlIHNlZ21lbnRzIG9mIHRoZSBwYXRoIHRvIHRoZSBkb2N1bWVudFxuICAgICAqIEByZXR1cm5zIEEgbmV3IGluc3RhbmNlIG9mIERvY3VtZW50S2V5XG4gICAgICovICAgIHN0YXRpYyBmcm9tU2VnbWVudHModCkge1xuICAgICAgICByZXR1cm4gbmV3IHh0KG5ldyBfdCh0LnNsaWNlKCkpKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGNvbnN0IE50ID0ge1xuICAgIG1hcFZhbHVlOiB7XG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgX190eXBlX186IHtcbiAgICAgICAgICAgICAgICBzdHJpbmdWYWx1ZTogXCJfX21heF9fXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0sIGt0ID0ge1xuICAgIG51bGxWYWx1ZTogXCJOVUxMX1ZBTFVFXCJcbn07XG5cbi8qKiBFeHRyYWN0cyB0aGUgYmFja2VuZCdzIHR5cGUgb3JkZXIgZm9yIHRoZSBwcm92aWRlZCB2YWx1ZS4gKi9cbmZ1bmN0aW9uIE10KHQpIHtcbiAgICByZXR1cm4gXCJudWxsVmFsdWVcIiBpbiB0ID8gMCAvKiBOdWxsVmFsdWUgKi8gOiBcImJvb2xlYW5WYWx1ZVwiIGluIHQgPyAxIC8qIEJvb2xlYW5WYWx1ZSAqLyA6IFwiaW50ZWdlclZhbHVlXCIgaW4gdCB8fCBcImRvdWJsZVZhbHVlXCIgaW4gdCA/IDIgLyogTnVtYmVyVmFsdWUgKi8gOiBcInRpbWVzdGFtcFZhbHVlXCIgaW4gdCA/IDMgLyogVGltZXN0YW1wVmFsdWUgKi8gOiBcInN0cmluZ1ZhbHVlXCIgaW4gdCA/IDUgLyogU3RyaW5nVmFsdWUgKi8gOiBcImJ5dGVzVmFsdWVcIiBpbiB0ID8gNiAvKiBCbG9iVmFsdWUgKi8gOiBcInJlZmVyZW5jZVZhbHVlXCIgaW4gdCA/IDcgLyogUmVmVmFsdWUgKi8gOiBcImdlb1BvaW50VmFsdWVcIiBpbiB0ID8gOCAvKiBHZW9Qb2ludFZhbHVlICovIDogXCJhcnJheVZhbHVlXCIgaW4gdCA/IDkgLyogQXJyYXlWYWx1ZSAqLyA6IFwibWFwVmFsdWVcIiBpbiB0ID8gUnQodCkgPyA0IC8qIFNlcnZlclRpbWVzdGFtcFZhbHVlICovIDogSHQodCkgPyA5IC8qIEFycmF5VmFsdWUgKi8gOiAxMCAvKiBPYmplY3RWYWx1ZSAqLyA6IEwoKTtcbn1cblxuLyoqIFRlc3RzIGBsZWZ0YCBhbmQgYHJpZ2h0YCBmb3IgZXF1YWxpdHkgYmFzZWQgb24gdGhlIGJhY2tlbmQgc2VtYW50aWNzLiAqLyBmdW5jdGlvbiBPdCh0LCBlKSB7XG4gICAgaWYgKHQgPT09IGUpIHJldHVybiAhMDtcbiAgICBjb25zdCBuID0gTXQodCk7XG4gICAgaWYgKG4gIT09IE10KGUpKSByZXR1cm4gITE7XG4gICAgc3dpdGNoIChuKSB7XG4gICAgICBjYXNlIDAgLyogTnVsbFZhbHVlICovIDpcbiAgICAgIGNhc2UgOTAwNzE5OTI1NDc0MDk5MSAvKiBNYXhWYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiAhMDtcblxuICAgICAgY2FzZSAxIC8qIEJvb2xlYW5WYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiB0LmJvb2xlYW5WYWx1ZSA9PT0gZS5ib29sZWFuVmFsdWU7XG5cbiAgICAgIGNhc2UgNCAvKiBTZXJ2ZXJUaW1lc3RhbXBWYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiBQdCh0KS5pc0VxdWFsKFB0KGUpKTtcblxuICAgICAgY2FzZSAzIC8qIFRpbWVzdGFtcFZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiB0LnRpbWVzdGFtcFZhbHVlICYmIFwic3RyaW5nXCIgPT0gdHlwZW9mIGUudGltZXN0YW1wVmFsdWUgJiYgdC50aW1lc3RhbXBWYWx1ZS5sZW5ndGggPT09IGUudGltZXN0YW1wVmFsdWUubGVuZ3RoKSBcbiAgICAgICAgICAgIC8vIFVzZSBzdHJpbmcgZXF1YWxpdHkgZm9yIElTTyA4NjAxIHRpbWVzdGFtcHNcbiAgICAgICAgICAgIHJldHVybiB0LnRpbWVzdGFtcFZhbHVlID09PSBlLnRpbWVzdGFtcFZhbHVlO1xuICAgICAgICAgICAgY29uc3QgbiA9IFR0KHQudGltZXN0YW1wVmFsdWUpLCBzID0gVHQoZS50aW1lc3RhbXBWYWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gbi5zZWNvbmRzID09PSBzLnNlY29uZHMgJiYgbi5uYW5vcyA9PT0gcy5uYW5vcztcbiAgICAgICAgfSh0LCBlKTtcblxuICAgICAgY2FzZSA1IC8qIFN0cmluZ1ZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIHQuc3RyaW5nVmFsdWUgPT09IGUuc3RyaW5nVmFsdWU7XG5cbiAgICAgIGNhc2UgNiAvKiBCbG9iVmFsdWUgKi8gOlxuICAgICAgICByZXR1cm4gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgcmV0dXJuIEF0KHQuYnl0ZXNWYWx1ZSkuaXNFcXVhbChBdChlLmJ5dGVzVmFsdWUpKTtcbiAgICAgICAgfSh0LCBlKTtcblxuICAgICAgY2FzZSA3IC8qIFJlZlZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIHQucmVmZXJlbmNlVmFsdWUgPT09IGUucmVmZXJlbmNlVmFsdWU7XG5cbiAgICAgIGNhc2UgOCAvKiBHZW9Qb2ludFZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIHJldHVybiBFdCh0Lmdlb1BvaW50VmFsdWUubGF0aXR1ZGUpID09PSBFdChlLmdlb1BvaW50VmFsdWUubGF0aXR1ZGUpICYmIEV0KHQuZ2VvUG9pbnRWYWx1ZS5sb25naXR1ZGUpID09PSBFdChlLmdlb1BvaW50VmFsdWUubG9uZ2l0dWRlKTtcbiAgICAgICAgfSh0LCBlKTtcblxuICAgICAgY2FzZSAyIC8qIE51bWJlclZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGlmIChcImludGVnZXJWYWx1ZVwiIGluIHQgJiYgXCJpbnRlZ2VyVmFsdWVcIiBpbiBlKSByZXR1cm4gRXQodC5pbnRlZ2VyVmFsdWUpID09PSBFdChlLmludGVnZXJWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoXCJkb3VibGVWYWx1ZVwiIGluIHQgJiYgXCJkb3VibGVWYWx1ZVwiIGluIGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuID0gRXQodC5kb3VibGVWYWx1ZSksIHMgPSBFdChlLmRvdWJsZVZhbHVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbiA9PT0gcyA/IER0KG4pID09PSBEdChzKSA6IGlzTmFOKG4pICYmIGlzTmFOKHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICB9KHQsIGUpO1xuXG4gICAgICBjYXNlIDkgLyogQXJyYXlWYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiBvdCh0LmFycmF5VmFsdWUudmFsdWVzIHx8IFtdLCBlLmFycmF5VmFsdWUudmFsdWVzIHx8IFtdLCBPdCk7XG5cbiAgICAgIGNhc2UgMTAgLyogT2JqZWN0VmFsdWUgKi8gOlxuICAgICAgICByZXR1cm4gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHQubWFwVmFsdWUuZmllbGRzIHx8IHt9LCBzID0gZS5tYXBWYWx1ZS5maWVsZHMgfHwge307XG4gICAgICAgICAgICBpZiAoaHQobikgIT09IGh0KHMpKSByZXR1cm4gITE7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgaW4gbikgaWYgKG4uaGFzT3duUHJvcGVydHkodCkgJiYgKHZvaWQgMCA9PT0gc1t0XSB8fCAhT3Qoblt0XSwgc1t0XSkpKSByZXR1cm4gITE7XG4gICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQXJyYXlWYWx1ZSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuICovICh0LCBlKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIEwoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uICR0KHQsIGUpIHtcbiAgICByZXR1cm4gdm9pZCAwICE9PSAodC52YWx1ZXMgfHwgW10pLmZpbmQoKHQgPT4gT3QodCwgZSkpKTtcbn1cblxuZnVuY3Rpb24gRnQodCwgZSkge1xuICAgIGlmICh0ID09PSBlKSByZXR1cm4gMDtcbiAgICBjb25zdCBuID0gTXQodCksIHMgPSBNdChlKTtcbiAgICBpZiAobiAhPT0gcykgcmV0dXJuIHJ0KG4sIHMpO1xuICAgIHN3aXRjaCAobikge1xuICAgICAgY2FzZSAwIC8qIE51bGxWYWx1ZSAqLyA6XG4gICAgICBjYXNlIDkwMDcxOTkyNTQ3NDA5OTEgLyogTWF4VmFsdWUgKi8gOlxuICAgICAgICByZXR1cm4gMDtcblxuICAgICAgY2FzZSAxIC8qIEJvb2xlYW5WYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiBydCh0LmJvb2xlYW5WYWx1ZSwgZS5ib29sZWFuVmFsdWUpO1xuXG4gICAgICBjYXNlIDIgLyogTnVtYmVyVmFsdWUgKi8gOlxuICAgICAgICByZXR1cm4gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IEV0KHQuaW50ZWdlclZhbHVlIHx8IHQuZG91YmxlVmFsdWUpLCBzID0gRXQoZS5pbnRlZ2VyVmFsdWUgfHwgZS5kb3VibGVWYWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gbiA8IHMgPyAtMSA6IG4gPiBzID8gMSA6IG4gPT09IHMgPyAwIDogXG4gICAgICAgICAgICAvLyBvbmUgb3IgYm90aCBhcmUgTmFOLlxuICAgICAgICAgICAgaXNOYU4obikgPyBpc05hTihzKSA/IDAgOiAtMSA6IDE7XG4gICAgICAgIH0odCwgZSk7XG5cbiAgICAgIGNhc2UgMyAvKiBUaW1lc3RhbXBWYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiBCdCh0LnRpbWVzdGFtcFZhbHVlLCBlLnRpbWVzdGFtcFZhbHVlKTtcblxuICAgICAgY2FzZSA0IC8qIFNlcnZlclRpbWVzdGFtcFZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIEJ0KFB0KHQpLCBQdChlKSk7XG5cbiAgICAgIGNhc2UgNSAvKiBTdHJpbmdWYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiBydCh0LnN0cmluZ1ZhbHVlLCBlLnN0cmluZ1ZhbHVlKTtcblxuICAgICAgY2FzZSA2IC8qIEJsb2JWYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gQXQodCksIHMgPSBBdChlKTtcbiAgICAgICAgICAgIHJldHVybiBuLmNvbXBhcmVUbyhzKTtcbiAgICAgICAgfSh0LmJ5dGVzVmFsdWUsIGUuYnl0ZXNWYWx1ZSk7XG5cbiAgICAgIGNhc2UgNyAvKiBSZWZWYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdC5zcGxpdChcIi9cIiksIHMgPSBlLnNwbGl0KFwiL1wiKTtcbiAgICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgbi5sZW5ndGggJiYgdCA8IHMubGVuZ3RoOyB0KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gcnQoblt0XSwgc1t0XSk7XG4gICAgICAgICAgICAgICAgaWYgKDAgIT09IGUpIHJldHVybiBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJ0KG4ubGVuZ3RoLCBzLmxlbmd0aCk7XG4gICAgICAgIH0odC5yZWZlcmVuY2VWYWx1ZSwgZS5yZWZlcmVuY2VWYWx1ZSk7XG5cbiAgICAgIGNhc2UgOCAvKiBHZW9Qb2ludFZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBydChFdCh0LmxhdGl0dWRlKSwgRXQoZS5sYXRpdHVkZSkpO1xuICAgICAgICAgICAgaWYgKDAgIT09IG4pIHJldHVybiBuO1xuICAgICAgICAgICAgcmV0dXJuIHJ0KEV0KHQubG9uZ2l0dWRlKSwgRXQoZS5sb25naXR1ZGUpKTtcbiAgICAgICAgfSh0Lmdlb1BvaW50VmFsdWUsIGUuZ2VvUG9pbnRWYWx1ZSk7XG5cbiAgICAgIGNhc2UgOSAvKiBBcnJheVZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0LnZhbHVlcyB8fCBbXSwgcyA9IGUudmFsdWVzIHx8IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCBuLmxlbmd0aCAmJiB0IDwgcy5sZW5ndGg7ICsrdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBGdChuW3RdLCBzW3RdKTtcbiAgICAgICAgICAgICAgICBpZiAoZSkgcmV0dXJuIGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcnQobi5sZW5ndGgsIHMubGVuZ3RoKTtcbiAgICAgICAgfSh0LmFycmF5VmFsdWUsIGUuYXJyYXlWYWx1ZSk7XG5cbiAgICAgIGNhc2UgMTAgLyogT2JqZWN0VmFsdWUgKi8gOlxuICAgICAgICByZXR1cm4gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHQuZmllbGRzIHx8IHt9LCBzID0gT2JqZWN0LmtleXMobiksIGkgPSBlLmZpZWxkcyB8fCB7fSwgciA9IE9iamVjdC5rZXlzKGkpO1xuICAgICAgICAgICAgLy8gRXZlbiB0aG91Z2ggTWFwVmFsdWVzIGFyZSBsaWtlbHkgc29ydGVkIGNvcnJlY3RseSBiYXNlZCBvbiB0aGVpciBpbnNlcnRpb25cbiAgICAgICAgICAgIC8vIG9yZGVyIChlLmcuIHdoZW4gcmVjZWl2ZWQgZnJvbSB0aGUgYmFja2VuZCksIGxvY2FsIG1vZGlmaWNhdGlvbnMgY2FuIGJyaW5nXG4gICAgICAgICAgICAvLyBlbGVtZW50cyBvdXQgb2Ygb3JkZXIuIFdlIG5lZWQgdG8gcmUtc29ydCB0aGUgZWxlbWVudHMgdG8gZW5zdXJlIHRoYXRcbiAgICAgICAgICAgIC8vIGNhbm9uaWNhbCBJRHMgYXJlIGluZGVwZW5kZW50IG9mIGluc2VydGlvbiBvcmRlci5cbiAgICAgICAgICAgIHMuc29ydCgpLCByLnNvcnQoKTtcbiAgICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgcy5sZW5ndGggJiYgdCA8IHIubGVuZ3RoOyArK3QpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gcnQoc1t0XSwgclt0XSk7XG4gICAgICAgICAgICAgICAgaWYgKDAgIT09IGUpIHJldHVybiBlO1xuICAgICAgICAgICAgICAgIGNvbnN0IG8gPSBGdChuW3NbdF1dLCBpW3JbdF1dKTtcbiAgICAgICAgICAgICAgICBpZiAoMCAhPT0gbykgcmV0dXJuIG87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcnQocy5sZW5ndGgsIHIubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAqIEdlbmVyYXRlcyB0aGUgY2Fub25pY2FsIElEIGZvciB0aGUgcHJvdmlkZWQgZmllbGQgdmFsdWUgKGFzIHVzZWQgaW4gVGFyZ2V0XG4gKiBzZXJpYWxpemF0aW9uKS5cbiAqLyAodC5tYXBWYWx1ZSwgZS5tYXBWYWx1ZSk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IEwoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIEJ0KHQsIGUpIHtcbiAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCAmJiBcInN0cmluZ1wiID09IHR5cGVvZiBlICYmIHQubGVuZ3RoID09PSBlLmxlbmd0aCkgcmV0dXJuIHJ0KHQsIGUpO1xuICAgIGNvbnN0IG4gPSBUdCh0KSwgcyA9IFR0KGUpLCBpID0gcnQobi5zZWNvbmRzLCBzLnNlY29uZHMpO1xuICAgIHJldHVybiAwICE9PSBpID8gaSA6IHJ0KG4ubmFub3MsIHMubmFub3MpO1xufVxuXG5mdW5jdGlvbiBMdCh0KSB7XG4gICAgcmV0dXJuIHF0KHQpO1xufVxuXG5mdW5jdGlvbiBxdCh0KSB7XG4gICAgcmV0dXJuIFwibnVsbFZhbHVlXCIgaW4gdCA/IFwibnVsbFwiIDogXCJib29sZWFuVmFsdWVcIiBpbiB0ID8gXCJcIiArIHQuYm9vbGVhblZhbHVlIDogXCJpbnRlZ2VyVmFsdWVcIiBpbiB0ID8gXCJcIiArIHQuaW50ZWdlclZhbHVlIDogXCJkb3VibGVWYWx1ZVwiIGluIHQgPyBcIlwiICsgdC5kb3VibGVWYWx1ZSA6IFwidGltZXN0YW1wVmFsdWVcIiBpbiB0ID8gZnVuY3Rpb24odCkge1xuICAgICAgICBjb25zdCBlID0gVHQodCk7XG4gICAgICAgIHJldHVybiBgdGltZSgke2Uuc2Vjb25kc30sJHtlLm5hbm9zfSlgO1xuICAgIH0odC50aW1lc3RhbXBWYWx1ZSkgOiBcInN0cmluZ1ZhbHVlXCIgaW4gdCA/IHQuc3RyaW5nVmFsdWUgOiBcImJ5dGVzVmFsdWVcIiBpbiB0ID8gQXQodC5ieXRlc1ZhbHVlKS50b0Jhc2U2NCgpIDogXCJyZWZlcmVuY2VWYWx1ZVwiIGluIHQgPyAobiA9IHQucmVmZXJlbmNlVmFsdWUsIFxuICAgIHh0LmZyb21OYW1lKG4pLnRvU3RyaW5nKCkpIDogXCJnZW9Qb2ludFZhbHVlXCIgaW4gdCA/IGBnZW8oJHsoZSA9IHQuZ2VvUG9pbnRWYWx1ZSkubGF0aXR1ZGV9LCR7ZS5sb25naXR1ZGV9KWAgOiBcImFycmF5VmFsdWVcIiBpbiB0ID8gZnVuY3Rpb24odCkge1xuICAgICAgICBsZXQgZSA9IFwiW1wiLCBuID0gITA7XG4gICAgICAgIGZvciAoY29uc3QgcyBvZiB0LnZhbHVlcyB8fCBbXSkgbiA/IG4gPSAhMSA6IGUgKz0gXCIsXCIsIGUgKz0gcXQocyk7XG4gICAgICAgIHJldHVybiBlICsgXCJdXCI7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHZhbHVlIGZvciB0aGUgcHJvdmlkZWQgZGF0YWJhc2UgYW5kIGtleS4gKi8gKHQuYXJyYXlWYWx1ZSkgOiBcIm1hcFZhbHVlXCIgaW4gdCA/IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgLy8gSXRlcmF0aW9uIG9yZGVyIGluIEphdmFTY3JpcHQgaXMgbm90IGd1YXJhbnRlZWQuIFRvIGVuc3VyZSB0aGF0IHdlIGdlbmVyYXRlXG4gICAgICAgIC8vIG1hdGNoaW5nIGNhbm9uaWNhbCBJRHMgZm9yIGlkZW50aWNhbCBtYXBzLCB3ZSBuZWVkIHRvIHNvcnQgdGhlIGtleXMuXG4gICAgICAgIGNvbnN0IGUgPSBPYmplY3Qua2V5cyh0LmZpZWxkcyB8fCB7fSkuc29ydCgpO1xuICAgICAgICBsZXQgbiA9IFwie1wiLCBzID0gITA7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiBlKSBzID8gcyA9ICExIDogbiArPSBcIixcIiwgbiArPSBgJHtpfToke3F0KHQuZmllbGRzW2ldKX1gO1xuICAgICAgICByZXR1cm4gbiArIFwifVwiO1xuICAgIH0odC5tYXBWYWx1ZSkgOiBMKCk7XG4gICAgdmFyIGUsIG47XG59XG5cbmZ1bmN0aW9uIFV0KHQsIGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICByZWZlcmVuY2VWYWx1ZTogYHByb2plY3RzLyR7dC5wcm9qZWN0SWR9L2RhdGFiYXNlcy8ke3QuZGF0YWJhc2V9L2RvY3VtZW50cy8ke2UucGF0aC5jYW5vbmljYWxTdHJpbmcoKX1gXG4gICAgfTtcbn1cblxuLyoqIFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIGFuIEludGVnZXJWYWx1ZSAuICovIGZ1bmN0aW9uIEt0KHQpIHtcbiAgICByZXR1cm4gISF0ICYmIFwiaW50ZWdlclZhbHVlXCIgaW4gdDtcbn1cblxuLyoqIFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIGEgRG91YmxlVmFsdWUuICovXG4vKiogUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgYW4gQXJyYXlWYWx1ZS4gKi9cbmZ1bmN0aW9uIEd0KHQpIHtcbiAgICByZXR1cm4gISF0ICYmIFwiYXJyYXlWYWx1ZVwiIGluIHQ7XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBhIE51bGxWYWx1ZS4gKi8gZnVuY3Rpb24gUXQodCkge1xuICAgIHJldHVybiAhIXQgJiYgXCJudWxsVmFsdWVcIiBpbiB0O1xufVxuXG4vKiogUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgTmFOLiAqLyBmdW5jdGlvbiBqdCh0KSB7XG4gICAgcmV0dXJuICEhdCAmJiBcImRvdWJsZVZhbHVlXCIgaW4gdCAmJiBpc05hTihOdW1iZXIodC5kb3VibGVWYWx1ZSkpO1xufVxuXG4vKiogUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgYSBNYXBWYWx1ZS4gKi8gZnVuY3Rpb24gV3QodCkge1xuICAgIHJldHVybiAhIXQgJiYgXCJtYXBWYWx1ZVwiIGluIHQ7XG59XG5cbi8qKiBDcmVhdGVzIGEgZGVlcCBjb3B5IG9mIGBzb3VyY2VgLiAqLyBmdW5jdGlvbiB6dCh0KSB7XG4gICAgaWYgKHQuZ2VvUG9pbnRWYWx1ZSkgcmV0dXJuIHtcbiAgICAgICAgZ2VvUG9pbnRWYWx1ZTogT2JqZWN0LmFzc2lnbih7fSwgdC5nZW9Qb2ludFZhbHVlKVxuICAgIH07XG4gICAgaWYgKHQudGltZXN0YW1wVmFsdWUgJiYgXCJvYmplY3RcIiA9PSB0eXBlb2YgdC50aW1lc3RhbXBWYWx1ZSkgcmV0dXJuIHtcbiAgICAgICAgdGltZXN0YW1wVmFsdWU6IE9iamVjdC5hc3NpZ24oe30sIHQudGltZXN0YW1wVmFsdWUpXG4gICAgfTtcbiAgICBpZiAodC5tYXBWYWx1ZSkge1xuICAgICAgICBjb25zdCBlID0ge1xuICAgICAgICAgICAgbWFwVmFsdWU6IHtcbiAgICAgICAgICAgICAgICBmaWVsZHM6IHt9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBsdCh0Lm1hcFZhbHVlLmZpZWxkcywgKCh0LCBuKSA9PiBlLm1hcFZhbHVlLmZpZWxkc1t0XSA9IHp0KG4pKSksIGU7XG4gICAgfVxuICAgIGlmICh0LmFycmF5VmFsdWUpIHtcbiAgICAgICAgY29uc3QgZSA9IHtcbiAgICAgICAgICAgIGFycmF5VmFsdWU6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IFtdXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgKHQuYXJyYXlWYWx1ZS52YWx1ZXMgfHwgW10pLmxlbmd0aDsgKytuKSBlLmFycmF5VmFsdWUudmFsdWVzW25dID0genQodC5hcnJheVZhbHVlLnZhbHVlc1tuXSk7XG4gICAgICAgIHJldHVybiBlO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdCk7XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIFZhbHVlIHJlcHJlc2VudHMgdGhlIGNhbm9uaWNhbCB7QGxpbmsgI01BWF9WQUxVRX0gLiAqLyBmdW5jdGlvbiBIdCh0KSB7XG4gICAgcmV0dXJuIFwiX19tYXhfX1wiID09PSAoKCh0Lm1hcFZhbHVlIHx8IHt9KS5maWVsZHMgfHwge30pLl9fdHlwZV9fIHx8IHt9KS5zdHJpbmdWYWx1ZTtcbn1cblxuLyoqIFJldHVybnMgdGhlIGxvd2VzdCB2YWx1ZSBmb3IgdGhlIGdpdmVuIHZhbHVlIHR5cGUgKGluY2x1c2l2ZSkuICovIGZ1bmN0aW9uIEp0KHQsIGUpIHtcbiAgICByZXR1cm4gdm9pZCAwID09PSB0ID8gZSA6IHZvaWQgMCA9PT0gZSB8fCBGdCh0LCBlKSA+IDAgPyB0IDogZTtcbn1cblxuZnVuY3Rpb24gWXQodCwgZSkge1xuICAgIHJldHVybiB2b2lkIDAgPT09IHQgPyBlIDogdm9pZCAwID09PSBlIHx8IEZ0KHQsIGUpIDwgMCA/IHQgOiBlO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBbiBPYmplY3RWYWx1ZSByZXByZXNlbnRzIGEgTWFwVmFsdWUgaW4gdGhlIEZpcmVzdG9yZSBQcm90byBhbmQgb2ZmZXJzIHRoZVxuICogYWJpbGl0eSB0byBhZGQgYW5kIHJlbW92ZSBmaWVsZHMgKHZpYSB0aGUgT2JqZWN0VmFsdWVCdWlsZGVyKS5cbiAqLyBjbGFzcyBYdCB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdDtcbiAgICB9XG4gICAgc3RhdGljIGVtcHR5KCkge1xuICAgICAgICByZXR1cm4gbmV3IFh0KHtcbiAgICAgICAgICAgIG1hcFZhbHVlOiB7fVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIHBhdGggb3IgbnVsbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXRoIC0gdGhlIHBhdGggdG8gc2VhcmNoXG4gICAgICogQHJldHVybnMgVGhlIHZhbHVlIGF0IHRoZSBwYXRoIG9yIG51bGwgaWYgdGhlIHBhdGggaXMgbm90IHNldC5cbiAgICAgKi8gICAgZmllbGQodCkge1xuICAgICAgICBpZiAodC5pc0VtcHR5KCkpIHJldHVybiB0aGlzLnZhbHVlO1xuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgZSA9IHRoaXMudmFsdWU7XG4gICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHQubGVuZ3RoIC0gMTsgKytuKSBpZiAoZSA9IChlLm1hcFZhbHVlLmZpZWxkcyB8fCB7fSlbdC5nZXQobildLCBcbiAgICAgICAgICAgICFXdChlKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gZSA9IChlLm1hcFZhbHVlLmZpZWxkcyB8fCB7fSlbdC5sYXN0U2VnbWVudCgpXSwgZSB8fCBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGZpZWxkIHRvIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXRoIC0gVGhlIGZpZWxkIHBhdGggdG8gc2V0LlxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICovICAgIHNldCh0LCBlKSB7XG4gICAgICAgIHRoaXMuZ2V0RmllbGRzTWFwKHQucG9wTGFzdCgpKVt0Lmxhc3RTZWdtZW50KCldID0genQoZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHByb3ZpZGVkIGZpZWxkcyB0byB0aGUgcHJvdmlkZWQgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRhdGEgLSBBIG1hcCBvZiBmaWVsZHMgdG8gdmFsdWVzIChvciBudWxsIGZvciBkZWxldGVzKS5cbiAgICAgKi8gICAgc2V0QWxsKHQpIHtcbiAgICAgICAgbGV0IGUgPSBtdC5lbXB0eVBhdGgoKSwgbiA9IHt9LCBzID0gW107XG4gICAgICAgIHQuZm9yRWFjaCgoKHQsIGkpID0+IHtcbiAgICAgICAgICAgIGlmICghZS5pc0ltbWVkaWF0ZVBhcmVudE9mKGkpKSB7XG4gICAgICAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSBhY2N1bXVsYXRlZCBjaGFuZ2VzIGF0IHRoaXMgcGFyZW50IGxvY2F0aW9uXG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuZ2V0RmllbGRzTWFwKGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlDaGFuZ2VzKHQsIG4sIHMpLCBuID0ge30sIHMgPSBbXSwgZSA9IGkucG9wTGFzdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdCA/IG5baS5sYXN0U2VnbWVudCgpXSA9IHp0KHQpIDogcy5wdXNoKGkubGFzdFNlZ21lbnQoKSk7XG4gICAgICAgIH0pKTtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMuZ2V0RmllbGRzTWFwKGUpO1xuICAgICAgICB0aGlzLmFwcGx5Q2hhbmdlcyhpLCBuLCBzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgZmllbGQgYXQgdGhlIHNwZWNpZmllZCBwYXRoLiBJZiB0aGVyZSBpcyBubyBmaWVsZCBhdCB0aGVcbiAgICAgKiBzcGVjaWZpZWQgcGF0aCwgbm90aGluZyBpcyBjaGFuZ2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhdGggLSBUaGUgZmllbGQgcGF0aCB0byByZW1vdmUuXG4gICAgICovICAgIGRlbGV0ZSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLmZpZWxkKHQucG9wTGFzdCgpKTtcbiAgICAgICAgV3QoZSkgJiYgZS5tYXBWYWx1ZS5maWVsZHMgJiYgZGVsZXRlIGUubWFwVmFsdWUuZmllbGRzW3QubGFzdFNlZ21lbnQoKV07XG4gICAgfVxuICAgIGlzRXF1YWwodCkge1xuICAgICAgICByZXR1cm4gT3QodGhpcy52YWx1ZSwgdC52YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1hcCB0aGF0IGNvbnRhaW5zIHRoZSBsZWFmIGVsZW1lbnQgb2YgYHBhdGhgLiBJZiB0aGUgcGFyZW50XG4gICAgICogZW50cnkgZG9lcyBub3QgeWV0IGV4aXN0LCBvciBpZiBpdCBpcyBub3QgYSBtYXAsIGEgbmV3IG1hcCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAgICovICAgIGdldEZpZWxkc01hcCh0KSB7XG4gICAgICAgIGxldCBlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgZS5tYXBWYWx1ZS5maWVsZHMgfHwgKGUubWFwVmFsdWUgPSB7XG4gICAgICAgICAgICBmaWVsZHM6IHt9XG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHQubGVuZ3RoOyArK24pIHtcbiAgICAgICAgICAgIGxldCBzID0gZS5tYXBWYWx1ZS5maWVsZHNbdC5nZXQobildO1xuICAgICAgICAgICAgV3QocykgJiYgcy5tYXBWYWx1ZS5maWVsZHMgfHwgKHMgPSB7XG4gICAgICAgICAgICAgICAgbWFwVmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRzOiB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIGUubWFwVmFsdWUuZmllbGRzW3QuZ2V0KG4pXSA9IHMpLCBlID0gcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZS5tYXBWYWx1ZS5maWVsZHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1vZGlmaWVzIGBmaWVsZHNNYXBgIGJ5IGFkZGluZywgcmVwbGFjaW5nIG9yIGRlbGV0aW5nIHRoZSBzcGVjaWZpZWRcbiAgICAgKiBlbnRyaWVzLlxuICAgICAqLyAgICBhcHBseUNoYW5nZXModCwgZSwgbikge1xuICAgICAgICBsdChlLCAoKGUsIG4pID0+IHRbZV0gPSBuKSk7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiBuKSBkZWxldGUgdFtlXTtcbiAgICB9XG4gICAgY2xvbmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgWHQoenQodGhpcy52YWx1ZSkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgRmllbGRNYXNrIGJ1aWx0IGZyb20gYWxsIGZpZWxkcyBpbiBhIE1hcFZhbHVlLlxuICovIGZ1bmN0aW9uIFp0KHQpIHtcbiAgICBjb25zdCBlID0gW107XG4gICAgcmV0dXJuIGx0KHQuZmllbGRzLCAoKHQsIG4pID0+IHtcbiAgICAgICAgY29uc3QgcyA9IG5ldyBtdChbIHQgXSk7XG4gICAgICAgIGlmIChXdChuKSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IFp0KG4ubWFwVmFsdWUpLmZpZWxkcztcbiAgICAgICAgICAgIGlmICgwID09PSB0Lmxlbmd0aCkgXG4gICAgICAgICAgICAvLyBQcmVzZXJ2ZSB0aGUgZW1wdHkgbWFwIGJ5IGFkZGluZyBpdCB0byB0aGUgRmllbGRNYXNrLlxuICAgICAgICAgICAgZS5wdXNoKHMpOyBlbHNlIFxuICAgICAgICAgICAgLy8gRm9yIG5lc3RlZCBhbmQgbm9uLWVtcHR5IE9iamVjdFZhbHVlcywgYWRkIHRoZSBGaWVsZFBhdGggb2YgdGhlXG4gICAgICAgICAgICAvLyBsZWFmIG5vZGVzLlxuICAgICAgICAgICAgZm9yIChjb25zdCBuIG9mIHQpIGUucHVzaChzLmNoaWxkKG4pKTtcbiAgICAgICAgfSBlbHNlIFxuICAgICAgICAvLyBGb3IgbmVzdGVkIGFuZCBub24tZW1wdHkgT2JqZWN0VmFsdWVzLCBhZGQgdGhlIEZpZWxkUGF0aCBvZiB0aGUgbGVhZlxuICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgZS5wdXNoKHMpO1xuICAgIH0pKSwgbmV3IGd0KGUpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgZG9jdW1lbnQgaW4gRmlyZXN0b3JlIHdpdGggYSBrZXksIHZlcnNpb24sIGRhdGEgYW5kIHdoZXRoZXIgaXRcbiAqIGhhcyBsb2NhbCBtdXRhdGlvbnMgYXBwbGllZCB0byBpdC5cbiAqXG4gKiBEb2N1bWVudHMgY2FuIHRyYW5zaXRpb24gYmV0d2VlbiBzdGF0ZXMgdmlhIGBjb252ZXJ0VG9Gb3VuZERvY3VtZW50KClgLFxuICogYGNvbnZlcnRUb05vRG9jdW1lbnQoKWAgYW5kIGBjb252ZXJ0VG9Vbmtub3duRG9jdW1lbnQoKWAuIElmIGEgZG9jdW1lbnQgZG9lc1xuICogbm90IHRyYW5zaXRpb24gdG8gb25lIG9mIHRoZXNlIHN0YXRlcyBldmVuIGFmdGVyIGFsbCBtdXRhdGlvbnMgaGF2ZSBiZWVuXG4gKiBhcHBsaWVkLCBgaXNWYWxpZERvY3VtZW50KClgIHJldHVybnMgZmFsc2UgYW5kIHRoZSBkb2N1bWVudCBzaG91bGQgYmUgcmVtb3ZlZFxuICogZnJvbSBhbGwgdmlld3MuXG4gKi8gY2xhc3MgdGUge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMsIGksIHIpIHtcbiAgICAgICAgdGhpcy5rZXkgPSB0LCB0aGlzLmRvY3VtZW50VHlwZSA9IGUsIHRoaXMudmVyc2lvbiA9IG4sIHRoaXMucmVhZFRpbWUgPSBzLCB0aGlzLmRhdGEgPSBpLCBcbiAgICAgICAgdGhpcy5kb2N1bWVudFN0YXRlID0gcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGRvY3VtZW50IHdpdGggbm8ga25vd24gdmVyc2lvbiBvciBkYXRhLCBidXQgd2hpY2ggY2FuIHNlcnZlIGFzXG4gICAgICogYmFzZSBkb2N1bWVudCBmb3IgbXV0YXRpb25zLlxuICAgICAqLyAgICBzdGF0aWMgbmV3SW52YWxpZERvY3VtZW50KHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB0ZSh0LCAwIC8qIElOVkFMSUQgKi8gLCBjdC5taW4oKSwgY3QubWluKCksIFh0LmVtcHR5KCksIDAgLyogU1lOQ0VEICovKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCB0aGF0IGlzIGtub3duIHRvIGV4aXN0IHdpdGggdGhlIGdpdmVuIGRhdGEgYXQgdGhlXG4gICAgICogZ2l2ZW4gdmVyc2lvbi5cbiAgICAgKi8gICAgc3RhdGljIG5ld0ZvdW5kRG9jdW1lbnQodCwgZSwgbikge1xuICAgICAgICByZXR1cm4gbmV3IHRlKHQsIDEgLyogRk9VTkRfRE9DVU1FTlQgKi8gLCBlLCBjdC5taW4oKSwgbiwgMCAvKiBTWU5DRUQgKi8pO1xuICAgIH1cbiAgICAvKiogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCB0aGF0IGlzIGtub3duIHRvIG5vdCBleGlzdCBhdCB0aGUgZ2l2ZW4gdmVyc2lvbi4gKi8gICAgc3RhdGljIG5ld05vRG9jdW1lbnQodCwgZSkge1xuICAgICAgICByZXR1cm4gbmV3IHRlKHQsIDIgLyogTk9fRE9DVU1FTlQgKi8gLCBlLCBjdC5taW4oKSwgWHQuZW1wdHkoKSwgMCAvKiBTWU5DRUQgKi8pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IHRoYXQgaXMga25vd24gdG8gZXhpc3QgYXQgdGhlIGdpdmVuIHZlcnNpb24gYnV0XG4gICAgICogd2hvc2UgZGF0YSBpcyBub3Qga25vd24gKGUuZy4gYSBkb2N1bWVudCB0aGF0IHdhcyB1cGRhdGVkIHdpdGhvdXQgYSBrbm93blxuICAgICAqIGJhc2UgZG9jdW1lbnQpLlxuICAgICAqLyAgICBzdGF0aWMgbmV3VW5rbm93bkRvY3VtZW50KHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB0ZSh0LCAzIC8qIFVOS05PV05fRE9DVU1FTlQgKi8gLCBlLCBjdC5taW4oKSwgWHQuZW1wdHkoKSwgMiAvKiBIQVNfQ09NTUlUVEVEX01VVEFUSU9OUyAqLyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIGRvY3VtZW50IHR5cGUgdG8gaW5kaWNhdGUgdGhhdCBpdCBleGlzdHMgYW5kIHRoYXQgaXRzIHZlcnNpb25cbiAgICAgKiBhbmQgZGF0YSBhcmUga25vd24uXG4gICAgICovICAgIGNvbnZlcnRUb0ZvdW5kRG9jdW1lbnQodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy52ZXJzaW9uID0gdCwgdGhpcy5kb2N1bWVudFR5cGUgPSAxIC8qIEZPVU5EX0RPQ1VNRU5UICovICwgdGhpcy5kYXRhID0gZSwgXG4gICAgICAgIHRoaXMuZG9jdW1lbnRTdGF0ZSA9IDAgLyogU1lOQ0VEICovICwgdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyB0aGUgZG9jdW1lbnQgdHlwZSB0byBpbmRpY2F0ZSB0aGF0IGl0IGRvZXNuJ3QgZXhpc3QgYXQgdGhlIGdpdmVuXG4gICAgICogdmVyc2lvbi5cbiAgICAgKi8gICAgY29udmVydFRvTm9Eb2N1bWVudCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcnNpb24gPSB0LCB0aGlzLmRvY3VtZW50VHlwZSA9IDIgLyogTk9fRE9DVU1FTlQgKi8gLCB0aGlzLmRhdGEgPSBYdC5lbXB0eSgpLCBcbiAgICAgICAgdGhpcy5kb2N1bWVudFN0YXRlID0gMCAvKiBTWU5DRUQgKi8gLCB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIHRoZSBkb2N1bWVudCB0eXBlIHRvIGluZGljYXRlIHRoYXQgaXQgZXhpc3RzIGF0IGEgZ2l2ZW4gdmVyc2lvbiBidXRcbiAgICAgKiB0aGF0IGl0cyBkYXRhIGlzIG5vdCBrbm93biAoZS5nLiBhIGRvY3VtZW50IHRoYXQgd2FzIHVwZGF0ZWQgd2l0aG91dCBhIGtub3duXG4gICAgICogYmFzZSBkb2N1bWVudCkuXG4gICAgICovICAgIGNvbnZlcnRUb1Vua25vd25Eb2N1bWVudCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcnNpb24gPSB0LCB0aGlzLmRvY3VtZW50VHlwZSA9IDMgLyogVU5LTk9XTl9ET0NVTUVOVCAqLyAsIHRoaXMuZGF0YSA9IFh0LmVtcHR5KCksIFxuICAgICAgICB0aGlzLmRvY3VtZW50U3RhdGUgPSAyIC8qIEhBU19DT01NSVRURURfTVVUQVRJT05TICovICwgdGhpcztcbiAgICB9XG4gICAgc2V0SGFzQ29tbWl0dGVkTXV0YXRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudFN0YXRlID0gMiAvKiBIQVNfQ09NTUlUVEVEX01VVEFUSU9OUyAqLyAsIHRoaXM7XG4gICAgfVxuICAgIHNldEhhc0xvY2FsTXV0YXRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudFN0YXRlID0gMSAvKiBIQVNfTE9DQUxfTVVUQVRJT05TICovICwgdGhpcztcbiAgICB9XG4gICAgc2V0UmVhZFRpbWUodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkVGltZSA9IHQsIHRoaXM7XG4gICAgfVxuICAgIGdldCBoYXNMb2NhbE11dGF0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIDEgLyogSEFTX0xPQ0FMX01VVEFUSU9OUyAqLyA9PT0gdGhpcy5kb2N1bWVudFN0YXRlO1xuICAgIH1cbiAgICBnZXQgaGFzQ29tbWl0dGVkTXV0YXRpb25zKCkge1xuICAgICAgICByZXR1cm4gMiAvKiBIQVNfQ09NTUlUVEVEX01VVEFUSU9OUyAqLyA9PT0gdGhpcy5kb2N1bWVudFN0YXRlO1xuICAgIH1cbiAgICBnZXQgaGFzUGVuZGluZ1dyaXRlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzTG9jYWxNdXRhdGlvbnMgfHwgdGhpcy5oYXNDb21taXR0ZWRNdXRhdGlvbnM7XG4gICAgfVxuICAgIGlzVmFsaWREb2N1bWVudCgpIHtcbiAgICAgICAgcmV0dXJuIDAgLyogSU5WQUxJRCAqLyAhPT0gdGhpcy5kb2N1bWVudFR5cGU7XG4gICAgfVxuICAgIGlzRm91bmREb2N1bWVudCgpIHtcbiAgICAgICAgcmV0dXJuIDEgLyogRk9VTkRfRE9DVU1FTlQgKi8gPT09IHRoaXMuZG9jdW1lbnRUeXBlO1xuICAgIH1cbiAgICBpc05vRG9jdW1lbnQoKSB7XG4gICAgICAgIHJldHVybiAyIC8qIE5PX0RPQ1VNRU5UICovID09PSB0aGlzLmRvY3VtZW50VHlwZTtcbiAgICB9XG4gICAgaXNVbmtub3duRG9jdW1lbnQoKSB7XG4gICAgICAgIHJldHVybiAzIC8qIFVOS05PV05fRE9DVU1FTlQgKi8gPT09IHRoaXMuZG9jdW1lbnRUeXBlO1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgaW5zdGFuY2VvZiB0ZSAmJiB0aGlzLmtleS5pc0VxdWFsKHQua2V5KSAmJiB0aGlzLnZlcnNpb24uaXNFcXVhbCh0LnZlcnNpb24pICYmIHRoaXMuZG9jdW1lbnRUeXBlID09PSB0LmRvY3VtZW50VHlwZSAmJiB0aGlzLmRvY3VtZW50U3RhdGUgPT09IHQuZG9jdW1lbnRTdGF0ZSAmJiB0aGlzLmRhdGEuaXNFcXVhbCh0LmRhdGEpO1xuICAgIH1cbiAgICBtdXRhYmxlQ29weSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB0ZSh0aGlzLmtleSwgdGhpcy5kb2N1bWVudFR5cGUsIHRoaXMudmVyc2lvbiwgdGhpcy5yZWFkVGltZSwgdGhpcy5kYXRhLmNsb25lKCksIHRoaXMuZG9jdW1lbnRTdGF0ZSk7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gYERvY3VtZW50KCR7dGhpcy5rZXl9LCAke3RoaXMudmVyc2lvbn0sICR7SlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLnZhbHVlKX0sIHtkb2N1bWVudFR5cGU6ICR7dGhpcy5kb2N1bWVudFR5cGV9fSksIHtkb2N1bWVudFN0YXRlOiAke3RoaXMuZG9jdW1lbnRTdGF0ZX19KWA7XG4gICAgfVxufVxuXG4vKipcbiAqIENvbXBhcmVzIHRoZSB2YWx1ZSBmb3IgZmllbGQgYGZpZWxkYCBpbiB0aGUgcHJvdmlkZWQgZG9jdW1lbnRzLiBUaHJvd3MgaWZcbiAqIHRoZSBmaWVsZCBkb2VzIG5vdCBleGlzdCBpbiBib3RoIGRvY3VtZW50cy5cbiAqL1xuLyoqXG4gKiBBbiBpbmRleCBkZWZpbml0aW9uIGZvciBmaWVsZCBpbmRleGVzIGluIEZpcmVzdG9yZS5cbiAqXG4gKiBFdmVyeSBpbmRleCBpcyBhc3NvY2lhdGVkIHdpdGggYSBjb2xsZWN0aW9uLiBUaGUgZGVmaW5pdGlvbiBjb250YWlucyBhIGxpc3RcbiAqIG9mIGZpZWxkcyBhbmQgdGhlaXIgaW5kZXgga2luZCAod2hpY2ggY2FuIGJlIGBBU0NFTkRJTkdgLCBgREVTQ0VORElOR2Agb3JcbiAqIGBDT05UQUlOU2AgZm9yIEFycmF5Q29udGFpbnMvQXJyYXlDb250YWluc0FueSBxdWVyaWVzKS5cbiAqXG4gKiBVbmxpa2UgdGhlIGJhY2tlbmQsIHRoZSBTREsgZG9lcyBub3QgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGNvbGxlY3Rpb24gb3JcbiAqIGNvbGxlY3Rpb24gZ3JvdXAtc2NvcGVkIGluZGljZXMuIEV2ZXJ5IGluZGV4IGNhbiBiZSB1c2VkIGZvciBib3RoIHNpbmdsZVxuICogY29sbGVjdGlvbiBhbmQgY29sbGVjdGlvbiBncm91cCBxdWVyaWVzLlxuICovXG5jbGFzcyBlZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogVGhlIGluZGV4IElELiBSZXR1cm5zIC0xIGlmIHRoZSBpbmRleCBJRCBpcyBub3QgYXZhaWxhYmxlIChlLmcuIHRoZSBpbmRleFxuICAgICAqIGhhcyBub3QgeWV0IGJlZW4gcGVyc2lzdGVkKS5cbiAgICAgKi9cbiAgICB0LCBcbiAgICAvKiogVGhlIGNvbGxlY3Rpb24gSUQgdGhpcyBpbmRleCBhcHBsaWVzIHRvLiAqL1xuICAgIGUsIFxuICAgIC8qKiBUaGUgZmllbGQgc2VnbWVudHMgZm9yIHRoaXMgaW5kZXguICovXG4gICAgbiwgXG4gICAgLyoqIFNob3dzIGhvdyB1cC10by1kYXRlIHRoZSBpbmRleCBpcyBmb3IgdGhlIGN1cnJlbnQgdXNlci4gKi9cbiAgICBzKSB7XG4gICAgICAgIHRoaXMuaW5kZXhJZCA9IHQsIHRoaXMuY29sbGVjdGlvbkdyb3VwID0gZSwgdGhpcy5maWVsZHMgPSBuLCB0aGlzLmluZGV4U3RhdGUgPSBzO1xuICAgIH1cbn1cblxuLyoqIEFuIElEIGZvciBhbiBpbmRleCB0aGF0IGhhcyBub3QgeWV0IGJlZW4gYWRkZWQgdG8gcGVyc2lzdGVuY2UuICAqL1xuLyoqIFJldHVybnMgdGhlIEFycmF5Q29udGFpbnMvQXJyYXlDb250YWluc0FueSBzZWdtZW50IGZvciB0aGlzIGluZGV4LiAqL1xuZnVuY3Rpb24gbmUodCkge1xuICAgIHJldHVybiB0LmZpZWxkcy5maW5kKCh0ID0+IDIgLyogQ09OVEFJTlMgKi8gPT09IHQua2luZCkpO1xufVxuXG4vKiogUmV0dXJucyBhbGwgZGlyZWN0aW9uYWwgKGFzY2VuZGluZy9kZXNjZW5kaW5nKSBzZWdtZW50cyBmb3IgdGhpcyBpbmRleC4gKi8gZnVuY3Rpb24gc2UodCkge1xuICAgIHJldHVybiB0LmZpZWxkcy5maWx0ZXIoKHQgPT4gMiAvKiBDT05UQUlOUyAqLyAhPT0gdC5raW5kKSk7XG59XG5cbi8qKiBSZXR1cm5zIGEgZGVidWcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZpZWxkIGluZGV4ICovIGVlLlVOS05PV05fSUQgPSAtMTtcblxuLyoqIEFuIGluZGV4IGNvbXBvbmVudCBjb25zaXN0aW5nIG9mIGZpZWxkIHBhdGggYW5kIGluZGV4IHR5cGUuICAqL1xuY2xhc3MgaWUge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKiBUaGUgZmllbGQgcGF0aCBvZiB0aGUgY29tcG9uZW50LiAqL1xuICAgIHQsIFxuICAgIC8qKiBUaGUgZmllbGRzIHNvcnRpbmcgb3JkZXIuICovXG4gICAgZSkge1xuICAgICAgICB0aGlzLmZpZWxkUGF0aCA9IHQsIHRoaXMua2luZCA9IGU7XG4gICAgfVxufVxuXG4vKipcbiAqIFN0b3JlcyB0aGUgXCJoaWdoIHdhdGVyIG1hcmtcIiB0aGF0IGluZGljYXRlcyBob3cgdXBkYXRlZCB0aGUgSW5kZXggaXMgZm9yIHRoZVxuICogY3VycmVudCB1c2VyLlxuICovIGNsYXNzIHJlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hlbiB0aGUgaW5kZXggd2FzIGxhc3QgdXBkYXRlZCAocmVsYXRpdmUgdG8gb3RoZXIgaW5kZXhlcykuXG4gICAgICovXG4gICAgdCwgXG4gICAgLyoqIFRoZSB0aGUgbGF0ZXN0IGluZGV4ZWQgcmVhZCB0aW1lLCBkb2N1bWVudCBhbmQgYmF0Y2ggaWQuICovXG4gICAgZSkge1xuICAgICAgICB0aGlzLnNlcXVlbmNlTnVtYmVyID0gdCwgdGhpcy5vZmZzZXQgPSBlO1xuICAgIH1cbiAgICAvKiogVGhlIHN0YXRlIG9mIGFuIGluZGV4IHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBiYWNrZmlsbGVkLiAqLyAgICBzdGF0aWMgZW1wdHkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgcmUoMCwgb2UubWluKCkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBTdG9yZXMgdGhlIGxhdGVzdCByZWFkIHRpbWUsIGRvY3VtZW50IGFuZCBiYXRjaCBJRCB0aGF0IHdlcmUgcHJvY2Vzc2VkIGZvciBhblxuICogaW5kZXguXG4gKi8gY2xhc3Mgb2Uge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIFRoZSBsYXRlc3QgcmVhZCB0aW1lIHZlcnNpb24gdGhhdCBoYXMgYmVlbiBpbmRleGVkIGJ5IEZpcmVzdG9yZSBmb3IgdGhpc1xuICAgICAqIGZpZWxkIGluZGV4LlxuICAgICAqL1xuICAgIHQsIFxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgb2YgdGhlIGxhc3QgZG9jdW1lbnQgdGhhdCB3YXMgaW5kZXhlZCBmb3IgdGhpcyBxdWVyeS4gVXNlXG4gICAgICogYERvY3VtZW50S2V5LmVtcHR5KClgIGlmIG5vIGRvY3VtZW50IGhhcyBiZWVuIGluZGV4ZWQuXG4gICAgICovXG4gICAgZSwgXG4gICAgLypcbiAgICAgKiBUaGUgbGFyZ2VzdCBtdXRhdGlvbiBiYXRjaCBpZCB0aGF0J3MgYmVlbiBwcm9jZXNzZWQgYnkgRmlyZXN0b3JlLlxuICAgICAqL1xuICAgIG4pIHtcbiAgICAgICAgdGhpcy5yZWFkVGltZSA9IHQsIHRoaXMuZG9jdW1lbnRLZXkgPSBlLCB0aGlzLmxhcmdlc3RCYXRjaElkID0gbjtcbiAgICB9XG4gICAgLyoqIFRoZSBzdGF0ZSBvZiBhbiBpbmRleCB0aGF0IGhhcyBub3QgeWV0IGJlZW4gYmFja2ZpbGxlZC4gKi8gICAgc3RhdGljIG1pbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBvZShjdC5taW4oKSwgeHQuZW1wdHkoKSwgLTEpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8vIFZpc2libGUgZm9yIHRlc3RpbmdcbmNsYXNzIGFlIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlID0gbnVsbCwgbiA9IFtdLCBzID0gW10sIGkgPSBudWxsLCByID0gbnVsbCwgbyA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5wYXRoID0gdCwgdGhpcy5jb2xsZWN0aW9uR3JvdXAgPSBlLCB0aGlzLm9yZGVyQnkgPSBuLCB0aGlzLmZpbHRlcnMgPSBzLCB0aGlzLmxpbWl0ID0gaSwgXG4gICAgICAgIHRoaXMuc3RhcnRBdCA9IHIsIHRoaXMuZW5kQXQgPSBvLCB0aGlzLlAgPSBudWxsO1xuICAgIH1cbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyBhIFRhcmdldCB3aXRoIGEgcGF0aCBhbmQgb3B0aW9uYWwgYWRkaXRpb25hbCBxdWVyeSBjb25zdHJhaW50cy5cbiAqIFBhdGggbXVzdCBjdXJyZW50bHkgYmUgZW1wdHkgaWYgdGhpcyBpcyBhIGNvbGxlY3Rpb24gZ3JvdXAgcXVlcnkuXG4gKlxuICogTk9URTogeW91IHNob3VsZCBhbHdheXMgY29uc3RydWN0IGBUYXJnZXRgIGZyb20gYFF1ZXJ5LnRvVGFyZ2V0YCBpbnN0ZWFkIG9mXG4gKiB1c2luZyB0aGlzIGZhY3RvcnkgbWV0aG9kLCBiZWNhdXNlIGBRdWVyeWAgcHJvdmlkZXMgYW4gaW1wbGljaXQgYG9yZGVyQnlgXG4gKiBwcm9wZXJ0eS5cbiAqLyBmdW5jdGlvbiB1ZSh0LCBlID0gbnVsbCwgbiA9IFtdLCBzID0gW10sIGkgPSBudWxsLCByID0gbnVsbCwgbyA9IG51bGwpIHtcbiAgICByZXR1cm4gbmV3IGFlKHQsIGUsIG4sIHMsIGksIHIsIG8pO1xufVxuXG5mdW5jdGlvbiBjZSh0KSB7XG4gICAgY29uc3QgZSA9IEsodCk7XG4gICAgaWYgKG51bGwgPT09IGUuUCkge1xuICAgICAgICBsZXQgdCA9IGUucGF0aC5jYW5vbmljYWxTdHJpbmcoKTtcbiAgICAgICAgbnVsbCAhPT0gZS5jb2xsZWN0aW9uR3JvdXAgJiYgKHQgKz0gXCJ8Y2c6XCIgKyBlLmNvbGxlY3Rpb25Hcm91cCksIHQgKz0gXCJ8ZjpcIiwgdCArPSBlLmZpbHRlcnMubWFwKCh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoZSA9IHQpLmZpZWxkLmNhbm9uaWNhbFN0cmluZygpICsgZS5vcC50b1N0cmluZygpICsgTHQoZS52YWx1ZSk7XG4gICAgICAgICAgICB2YXIgZTtcbiAgICAgICAgfSkpLmpvaW4oXCIsXCIpLCB0ICs9IFwifG9iOlwiLCB0ICs9IGUub3JkZXJCeS5tYXAoKHQgPT4gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgLy8gVE9ETyhiLzI5MTgzMTY1KTogTWFrZSB0aGlzIGNvbGxpc2lvbiByb2J1c3QuXG4gICAgICAgICAgICByZXR1cm4gdC5maWVsZC5jYW5vbmljYWxTdHJpbmcoKSArIHQuZGlyO1xuICAgICAgICB9KHQpKSkuam9pbihcIixcIiksIFN0KGUubGltaXQpIHx8ICh0ICs9IFwifGw6XCIsIHQgKz0gZS5saW1pdCksIGUuc3RhcnRBdCAmJiAodCArPSBcInxsYjpcIiwgXG4gICAgICAgIHQgKz0gZS5zdGFydEF0LmluY2x1c2l2ZSA/IFwiYjpcIiA6IFwiYTpcIiwgdCArPSBlLnN0YXJ0QXQucG9zaXRpb24ubWFwKCh0ID0+IEx0KHQpKSkuam9pbihcIixcIikpLCBcbiAgICAgICAgZS5lbmRBdCAmJiAodCArPSBcInx1YjpcIiwgdCArPSBlLmVuZEF0LmluY2x1c2l2ZSA/IFwiYTpcIiA6IFwiYjpcIiwgdCArPSBlLmVuZEF0LnBvc2l0aW9uLm1hcCgodCA9PiBMdCh0KSkpLmpvaW4oXCIsXCIpKSwgXG4gICAgICAgIGUuUCA9IHQ7XG4gICAgfVxuICAgIHJldHVybiBlLlA7XG59XG5cbmZ1bmN0aW9uIGhlKHQpIHtcbiAgICBsZXQgZSA9IHQucGF0aC5jYW5vbmljYWxTdHJpbmcoKTtcbiAgICByZXR1cm4gbnVsbCAhPT0gdC5jb2xsZWN0aW9uR3JvdXAgJiYgKGUgKz0gXCIgY29sbGVjdGlvbkdyb3VwPVwiICsgdC5jb2xsZWN0aW9uR3JvdXApLCBcbiAgICB0LmZpbHRlcnMubGVuZ3RoID4gMCAmJiAoZSArPSBgLCBmaWx0ZXJzOiBbJHt0LmZpbHRlcnMubWFwKCh0ID0+IHtcbiAgICAgICAgcmV0dXJuIGAkeyhlID0gdCkuZmllbGQuY2Fub25pY2FsU3RyaW5nKCl9ICR7ZS5vcH0gJHtMdChlLnZhbHVlKX1gO1xuICAgICAgICAvKiogUmV0dXJucyBhIGRlYnVnIGRlc2NyaXB0aW9uIGZvciBgZmlsdGVyYC4gKi9cbiAgICAgICAgdmFyIGU7XG4gICAgICAgIC8qKiBGaWx0ZXIgdGhhdCBtYXRjaGVzIG9uIGtleSBmaWVsZHMgKGkuZS4gJ19fbmFtZV9fJykuICovICAgIH0pKS5qb2luKFwiLCBcIil9XWApLCBcbiAgICBTdCh0LmxpbWl0KSB8fCAoZSArPSBcIiwgbGltaXQ6IFwiICsgdC5saW1pdCksIHQub3JkZXJCeS5sZW5ndGggPiAwICYmIChlICs9IGAsIG9yZGVyQnk6IFske3Qub3JkZXJCeS5tYXAoKHQgPT4gZnVuY3Rpb24odCkge1xuICAgICAgICByZXR1cm4gYCR7dC5maWVsZC5jYW5vbmljYWxTdHJpbmcoKX0gKCR7dC5kaXJ9KWA7XG4gICAgfSh0KSkpLmpvaW4oXCIsIFwiKX1dYCksIHQuc3RhcnRBdCAmJiAoZSArPSBcIiwgc3RhcnRBdDogXCIsIGUgKz0gdC5zdGFydEF0LmluY2x1c2l2ZSA/IFwiYjpcIiA6IFwiYTpcIiwgXG4gICAgZSArPSB0LnN0YXJ0QXQucG9zaXRpb24ubWFwKCh0ID0+IEx0KHQpKSkuam9pbihcIixcIikpLCB0LmVuZEF0ICYmIChlICs9IFwiLCBlbmRBdDogXCIsIFxuICAgIGUgKz0gdC5lbmRBdC5pbmNsdXNpdmUgPyBcImE6XCIgOiBcImI6XCIsIGUgKz0gdC5lbmRBdC5wb3NpdGlvbi5tYXAoKHQgPT4gTHQodCkpKS5qb2luKFwiLFwiKSksIFxuICAgIGBUYXJnZXQoJHtlfSlgO1xufVxuXG5mdW5jdGlvbiBsZSh0LCBlKSB7XG4gICAgaWYgKHQubGltaXQgIT09IGUubGltaXQpIHJldHVybiAhMTtcbiAgICBpZiAodC5vcmRlckJ5Lmxlbmd0aCAhPT0gZS5vcmRlckJ5Lmxlbmd0aCkgcmV0dXJuICExO1xuICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdC5vcmRlckJ5Lmxlbmd0aDsgbisrKSBpZiAoIWJlKHQub3JkZXJCeVtuXSwgZS5vcmRlckJ5W25dKSkgcmV0dXJuICExO1xuICAgIGlmICh0LmZpbHRlcnMubGVuZ3RoICE9PSBlLmZpbHRlcnMubGVuZ3RoKSByZXR1cm4gITE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0LmZpbHRlcnMubGVuZ3RoOyBpKyspIGlmIChuID0gdC5maWx0ZXJzW2ldLCBzID0gZS5maWx0ZXJzW2ldLCBcbiAgICBuLm9wICE9PSBzLm9wIHx8ICFuLmZpZWxkLmlzRXF1YWwocy5maWVsZCkgfHwgIU90KG4udmFsdWUsIHMudmFsdWUpKSByZXR1cm4gITE7XG4gICAgdmFyIG4sIHM7XG4gICAgcmV0dXJuIHQuY29sbGVjdGlvbkdyb3VwID09PSBlLmNvbGxlY3Rpb25Hcm91cCAmJiAoISF0LnBhdGguaXNFcXVhbChlLnBhdGgpICYmICghIVZlKHQuc3RhcnRBdCwgZS5zdGFydEF0KSAmJiBWZSh0LmVuZEF0LCBlLmVuZEF0KSkpO1xufVxuXG5mdW5jdGlvbiBmZSh0KSB7XG4gICAgcmV0dXJuIHh0LmlzRG9jdW1lbnRLZXkodC5wYXRoKSAmJiBudWxsID09PSB0LmNvbGxlY3Rpb25Hcm91cCAmJiAwID09PSB0LmZpbHRlcnMubGVuZ3RoO1xufVxuXG4vKiogUmV0dXJucyB0aGUgZmllbGQgZmlsdGVycyB0aGF0IHRhcmdldCB0aGUgZ2l2ZW4gZmllbGQgcGF0aC4gKi8gZnVuY3Rpb24gZGUodCwgZSkge1xuICAgIHJldHVybiB0LmZpbHRlcnMuZmlsdGVyKCh0ID0+IHQgaW5zdGFuY2VvZiBfZSAmJiB0LmZpZWxkLmlzRXF1YWwoZSkpKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZXMgdGhhdCBhcmUgdXNlZCBpbiBBUlJBWV9DT05UQUlOUyBvciBBUlJBWV9DT05UQUlOU19BTllcbiAqIGZpbHRlcnMuIFJldHVybnMgYG51bGxgIGlmIHRoZXJlIGFyZSBubyBzdWNoIGZpbHRlcnMuXG4gKi8gY2xhc3MgX2UgZXh0ZW5kcyBjbGFzcyB7fSB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbikge1xuICAgICAgICBzdXBlcigpLCB0aGlzLmZpZWxkID0gdCwgdGhpcy5vcCA9IGUsIHRoaXMudmFsdWUgPSBuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZmlsdGVyIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAgICovICAgIHN0YXRpYyBjcmVhdGUodCwgZSwgbikge1xuICAgICAgICByZXR1cm4gdC5pc0tleUZpZWxkKCkgPyBcImluXCIgLyogSU4gKi8gPT09IGUgfHwgXCJub3QtaW5cIiAvKiBOT1RfSU4gKi8gPT09IGUgPyB0aGlzLlYodCwgZSwgbikgOiBuZXcgd2UodCwgZSwgbikgOiBcImFycmF5LWNvbnRhaW5zXCIgLyogQVJSQVlfQ09OVEFJTlMgKi8gPT09IGUgPyBuZXcgcGUodCwgbikgOiBcImluXCIgLyogSU4gKi8gPT09IGUgPyBuZXcgSWUodCwgbikgOiBcIm5vdC1pblwiIC8qIE5PVF9JTiAqLyA9PT0gZSA/IG5ldyBUZSh0LCBuKSA6IFwiYXJyYXktY29udGFpbnMtYW55XCIgLyogQVJSQVlfQ09OVEFJTlNfQU5ZICovID09PSBlID8gbmV3IEVlKHQsIG4pIDogbmV3IF9lKHQsIGUsIG4pO1xuICAgIH1cbiAgICBzdGF0aWMgVih0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiBcImluXCIgLyogSU4gKi8gPT09IGUgPyBuZXcgbWUodCwgbikgOiBuZXcgZ2UodCwgbik7XG4gICAgfVxuICAgIG1hdGNoZXModCkge1xuICAgICAgICBjb25zdCBlID0gdC5kYXRhLmZpZWxkKHRoaXMuZmllbGQpO1xuICAgICAgICAvLyBUeXBlcyBkbyBub3QgaGF2ZSB0byBtYXRjaCBpbiBOT1RfRVFVQUwgZmlsdGVycy5cbiAgICAgICAgICAgICAgICByZXR1cm4gXCIhPVwiIC8qIE5PVF9FUVVBTCAqLyA9PT0gdGhpcy5vcCA/IG51bGwgIT09IGUgJiYgdGhpcy52KEZ0KGUsIHRoaXMudmFsdWUpKSA6IG51bGwgIT09IGUgJiYgTXQodGhpcy52YWx1ZSkgPT09IE10KGUpICYmIHRoaXMudihGdChlLCB0aGlzLnZhbHVlKSk7XG4gICAgICAgIC8vIE9ubHkgY29tcGFyZSB0eXBlcyB3aXRoIG1hdGNoaW5nIGJhY2tlbmQgb3JkZXIgKHN1Y2ggYXMgZG91YmxlIGFuZCBpbnQpLlxuICAgICAgICB9XG4gICAgdih0KSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5vcCkge1xuICAgICAgICAgIGNhc2UgXCI8XCIgLyogTEVTU19USEFOICovIDpcbiAgICAgICAgICAgIHJldHVybiB0IDwgMDtcblxuICAgICAgICAgIGNhc2UgXCI8PVwiIC8qIExFU1NfVEhBTl9PUl9FUVVBTCAqLyA6XG4gICAgICAgICAgICByZXR1cm4gdCA8PSAwO1xuXG4gICAgICAgICAgY2FzZSBcIj09XCIgLyogRVFVQUwgKi8gOlxuICAgICAgICAgICAgcmV0dXJuIDAgPT09IHQ7XG5cbiAgICAgICAgICBjYXNlIFwiIT1cIiAvKiBOT1RfRVFVQUwgKi8gOlxuICAgICAgICAgICAgcmV0dXJuIDAgIT09IHQ7XG5cbiAgICAgICAgICBjYXNlIFwiPlwiIC8qIEdSRUFURVJfVEhBTiAqLyA6XG4gICAgICAgICAgICByZXR1cm4gdCA+IDA7XG5cbiAgICAgICAgICBjYXNlIFwiPj1cIiAvKiBHUkVBVEVSX1RIQU5fT1JfRVFVQUwgKi8gOlxuICAgICAgICAgICAgcmV0dXJuIHQgPj0gMDtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gTCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFMoKSB7XG4gICAgICAgIHJldHVybiBbIFwiPFwiIC8qIExFU1NfVEhBTiAqLyAsIFwiPD1cIiAvKiBMRVNTX1RIQU5fT1JfRVFVQUwgKi8gLCBcIj5cIiAvKiBHUkVBVEVSX1RIQU4gKi8gLCBcIj49XCIgLyogR1JFQVRFUl9USEFOX09SX0VRVUFMICovICwgXCIhPVwiIC8qIE5PVF9FUVVBTCAqLyAsIFwibm90LWluXCIgLyogTk9UX0lOICovIF0uaW5kZXhPZih0aGlzLm9wKSA+PSAwO1xuICAgIH1cbn1cblxuY2xhc3Mgd2UgZXh0ZW5kcyBfZSB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbikge1xuICAgICAgICBzdXBlcih0LCBlLCBuKSwgdGhpcy5rZXkgPSB4dC5mcm9tTmFtZShuLnJlZmVyZW5jZVZhbHVlKTtcbiAgICB9XG4gICAgbWF0Y2hlcyh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB4dC5jb21wYXJhdG9yKHQua2V5LCB0aGlzLmtleSk7XG4gICAgICAgIHJldHVybiB0aGlzLnYoZSk7XG4gICAgfVxufVxuXG4vKiogRmlsdGVyIHRoYXQgbWF0Y2hlcyBvbiBrZXkgZmllbGRzIHdpdGhpbiBhbiBhcnJheS4gKi8gY2xhc3MgbWUgZXh0ZW5kcyBfZSB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICBzdXBlcih0LCBcImluXCIgLyogSU4gKi8gLCBlKSwgdGhpcy5rZXlzID0geWUoXCJpblwiIC8qIElOICovICwgZSk7XG4gICAgfVxuICAgIG1hdGNoZXModCkge1xuICAgICAgICByZXR1cm4gdGhpcy5rZXlzLnNvbWUoKGUgPT4gZS5pc0VxdWFsKHQua2V5KSkpO1xuICAgIH1cbn1cblxuLyoqIEZpbHRlciB0aGF0IG1hdGNoZXMgb24ga2V5IGZpZWxkcyBub3QgcHJlc2VudCB3aXRoaW4gYW4gYXJyYXkuICovIGNsYXNzIGdlIGV4dGVuZHMgX2Uge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgc3VwZXIodCwgXCJub3QtaW5cIiAvKiBOT1RfSU4gKi8gLCBlKSwgdGhpcy5rZXlzID0geWUoXCJub3QtaW5cIiAvKiBOT1RfSU4gKi8gLCBlKTtcbiAgICB9XG4gICAgbWF0Y2hlcyh0KSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5rZXlzLnNvbWUoKGUgPT4gZS5pc0VxdWFsKHQua2V5KSkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24geWUodCwgZSkge1xuICAgIHZhciBuO1xuICAgIHJldHVybiAoKG51bGwgPT09IChuID0gZS5hcnJheVZhbHVlKSB8fCB2b2lkIDAgPT09IG4gPyB2b2lkIDAgOiBuLnZhbHVlcykgfHwgW10pLm1hcCgodCA9PiB4dC5mcm9tTmFtZSh0LnJlZmVyZW5jZVZhbHVlKSkpO1xufVxuXG4vKiogQSBGaWx0ZXIgdGhhdCBpbXBsZW1lbnRzIHRoZSBhcnJheS1jb250YWlucyBvcGVyYXRvci4gKi8gY2xhc3MgcGUgZXh0ZW5kcyBfZSB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICBzdXBlcih0LCBcImFycmF5LWNvbnRhaW5zXCIgLyogQVJSQVlfQ09OVEFJTlMgKi8gLCBlKTtcbiAgICB9XG4gICAgbWF0Y2hlcyh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0LmRhdGEuZmllbGQodGhpcy5maWVsZCk7XG4gICAgICAgIHJldHVybiBHdChlKSAmJiAkdChlLmFycmF5VmFsdWUsIHRoaXMudmFsdWUpO1xuICAgIH1cbn1cblxuLyoqIEEgRmlsdGVyIHRoYXQgaW1wbGVtZW50cyB0aGUgSU4gb3BlcmF0b3IuICovIGNsYXNzIEllIGV4dGVuZHMgX2Uge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgc3VwZXIodCwgXCJpblwiIC8qIElOICovICwgZSk7XG4gICAgfVxuICAgIG1hdGNoZXModCkge1xuICAgICAgICBjb25zdCBlID0gdC5kYXRhLmZpZWxkKHRoaXMuZmllbGQpO1xuICAgICAgICByZXR1cm4gbnVsbCAhPT0gZSAmJiAkdCh0aGlzLnZhbHVlLmFycmF5VmFsdWUsIGUpO1xuICAgIH1cbn1cblxuLyoqIEEgRmlsdGVyIHRoYXQgaW1wbGVtZW50cyB0aGUgbm90LWluIG9wZXJhdG9yLiAqLyBjbGFzcyBUZSBleHRlbmRzIF9lIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKHQsIFwibm90LWluXCIgLyogTk9UX0lOICovICwgZSk7XG4gICAgfVxuICAgIG1hdGNoZXModCkge1xuICAgICAgICBpZiAoJHQodGhpcy52YWx1ZS5hcnJheVZhbHVlLCB7XG4gICAgICAgICAgICBudWxsVmFsdWU6IFwiTlVMTF9WQUxVRVwiXG4gICAgICAgIH0pKSByZXR1cm4gITE7XG4gICAgICAgIGNvbnN0IGUgPSB0LmRhdGEuZmllbGQodGhpcy5maWVsZCk7XG4gICAgICAgIHJldHVybiBudWxsICE9PSBlICYmICEkdCh0aGlzLnZhbHVlLmFycmF5VmFsdWUsIGUpO1xuICAgIH1cbn1cblxuLyoqIEEgRmlsdGVyIHRoYXQgaW1wbGVtZW50cyB0aGUgYXJyYXktY29udGFpbnMtYW55IG9wZXJhdG9yLiAqLyBjbGFzcyBFZSBleHRlbmRzIF9lIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKHQsIFwiYXJyYXktY29udGFpbnMtYW55XCIgLyogQVJSQVlfQ09OVEFJTlNfQU5ZICovICwgZSk7XG4gICAgfVxuICAgIG1hdGNoZXModCkge1xuICAgICAgICBjb25zdCBlID0gdC5kYXRhLmZpZWxkKHRoaXMuZmllbGQpO1xuICAgICAgICByZXR1cm4gISghR3QoZSkgfHwgIWUuYXJyYXlWYWx1ZS52YWx1ZXMpICYmIGUuYXJyYXlWYWx1ZS52YWx1ZXMuc29tZSgodCA9PiAkdCh0aGlzLnZhbHVlLmFycmF5VmFsdWUsIHQpKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBib3VuZCBvZiBhIHF1ZXJ5LlxuICpcbiAqIFRoZSBib3VuZCBpcyBzcGVjaWZpZWQgd2l0aCB0aGUgZ2l2ZW4gY29tcG9uZW50cyByZXByZXNlbnRpbmcgYSBwb3NpdGlvbiBhbmRcbiAqIHdoZXRoZXIgaXQncyBqdXN0IGJlZm9yZSBvciBqdXN0IGFmdGVyIHRoZSBwb3NpdGlvbiAocmVsYXRpdmUgdG8gd2hhdGV2ZXIgdGhlXG4gKiBxdWVyeSBvcmRlciBpcykuXG4gKlxuICogVGhlIHBvc2l0aW9uIHJlcHJlc2VudHMgYSBsb2dpY2FsIGluZGV4IHBvc2l0aW9uIGZvciBhIHF1ZXJ5LiBJdCdzIGEgcHJlZml4XG4gKiBvZiB2YWx1ZXMgZm9yIHRoZSAocG90ZW50aWFsbHkgaW1wbGljaXQpIG9yZGVyIGJ5IGNsYXVzZXMgb2YgYSBxdWVyeS5cbiAqXG4gKiBCb3VuZCBwcm92aWRlcyBhIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIGEgZG9jdW1lbnQgY29tZXMgYmVmb3JlIG9yXG4gKiBhZnRlciBhIGJvdW5kLiBUaGlzIGlzIGluZmx1ZW5jZWQgYnkgd2hldGhlciB0aGUgcG9zaXRpb24gaXMganVzdCBiZWZvcmUgb3JcbiAqIGp1c3QgYWZ0ZXIgdGhlIHByb3ZpZGVkIHZhbHVlcy5cbiAqLyBjbGFzcyBBZSB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gdCwgdGhpcy5pbmNsdXNpdmUgPSBlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBbiBvcmRlcmluZyBvbiBhIGZpZWxkLCBpbiBzb21lIERpcmVjdGlvbi4gRGlyZWN0aW9uIGRlZmF1bHRzIHRvIEFTQ0VORElORy5cbiAqLyBjbGFzcyBSZSB7XG4gICAgY29uc3RydWN0b3IodCwgZSA9IFwiYXNjXCIgLyogQVNDRU5ESU5HICovKSB7XG4gICAgICAgIHRoaXMuZmllbGQgPSB0LCB0aGlzLmRpciA9IGU7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBiZSh0LCBlKSB7XG4gICAgcmV0dXJuIHQuZGlyID09PSBlLmRpciAmJiB0LmZpZWxkLmlzRXF1YWwoZS5maWVsZCk7XG59XG5cbmZ1bmN0aW9uIFBlKHQsIGUsIG4pIHtcbiAgICBsZXQgcyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0LnBvc2l0aW9uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHIgPSBlW2ldLCBvID0gdC5wb3NpdGlvbltpXTtcbiAgICAgICAgaWYgKHIuZmllbGQuaXNLZXlGaWVsZCgpKSBzID0geHQuY29tcGFyYXRvcih4dC5mcm9tTmFtZShvLnJlZmVyZW5jZVZhbHVlKSwgbi5rZXkpOyBlbHNlIHtcbiAgICAgICAgICAgIHMgPSBGdChvLCBuLmRhdGEuZmllbGQoci5maWVsZCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcImRlc2NcIiAvKiBERVNDRU5ESU5HICovID09PSByLmRpciAmJiAocyAqPSAtMSksIDAgIT09IHMpIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gcztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYSBkb2N1bWVudCBzb3J0cyBhZnRlciBhIGJvdW5kIHVzaW5nIHRoZSBwcm92aWRlZCBzb3J0XG4gKiBvcmRlci5cbiAqLyBmdW5jdGlvbiBWZSh0LCBlKSB7XG4gICAgaWYgKG51bGwgPT09IHQpIHJldHVybiBudWxsID09PSBlO1xuICAgIGlmIChudWxsID09PSBlKSByZXR1cm4gITE7XG4gICAgaWYgKHQuaW5jbHVzaXZlICE9PSBlLmluY2x1c2l2ZSB8fCB0LnBvc2l0aW9uLmxlbmd0aCAhPT0gZS5wb3NpdGlvbi5sZW5ndGgpIHJldHVybiAhMTtcbiAgICBmb3IgKGxldCBuID0gMDsgbiA8IHQucG9zaXRpb24ubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgaWYgKCFPdCh0LnBvc2l0aW9uW25dLCBlLnBvc2l0aW9uW25dKSkgcmV0dXJuICExO1xuICAgIH1cbiAgICByZXR1cm4gITA7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFF1ZXJ5IGVuY2Fwc3VsYXRlcyBhbGwgdGhlIHF1ZXJ5IGF0dHJpYnV0ZXMgd2Ugc3VwcG9ydCBpbiB0aGUgU0RLLiBJdCBjYW5cbiAqIGJlIHJ1biBhZ2FpbnN0IHRoZSBMb2NhbFN0b3JlLCBhcyB3ZWxsIGFzIGJlIGNvbnZlcnRlZCB0byBhIGBUYXJnZXRgIHRvXG4gKiBxdWVyeSB0aGUgUmVtb3RlU3RvcmUgcmVzdWx0cy5cbiAqXG4gKiBWaXNpYmxlIGZvciB0ZXN0aW5nLlxuICovIGNsYXNzIHZlIHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyBhIFF1ZXJ5IHdpdGggYSBwYXRoIGFuZCBvcHRpb25hbCBhZGRpdGlvbmFsIHF1ZXJ5IGNvbnN0cmFpbnRzLlxuICAgICAqIFBhdGggbXVzdCBjdXJyZW50bHkgYmUgZW1wdHkgaWYgdGhpcyBpcyBhIGNvbGxlY3Rpb24gZ3JvdXAgcXVlcnkuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodCwgZSA9IG51bGwsIG4gPSBbXSwgcyA9IFtdLCBpID0gbnVsbCwgciA9IFwiRlwiIC8qIEZpcnN0ICovICwgbyA9IG51bGwsIGEgPSBudWxsKSB7XG4gICAgICAgIHRoaXMucGF0aCA9IHQsIHRoaXMuY29sbGVjdGlvbkdyb3VwID0gZSwgdGhpcy5leHBsaWNpdE9yZGVyQnkgPSBuLCB0aGlzLmZpbHRlcnMgPSBzLCBcbiAgICAgICAgdGhpcy5saW1pdCA9IGksIHRoaXMubGltaXRUeXBlID0gciwgdGhpcy5zdGFydEF0ID0gbywgdGhpcy5lbmRBdCA9IGEsIHRoaXMuRCA9IG51bGwsIFxuICAgICAgICAvLyBUaGUgY29ycmVzcG9uZGluZyBgVGFyZ2V0YCBvZiB0aGlzIGBRdWVyeWAgaW5zdGFuY2UuXG4gICAgICAgIHRoaXMuQyA9IG51bGwsIHRoaXMuc3RhcnRBdCwgdGhpcy5lbmRBdDtcbiAgICB9XG59XG5cbi8qKiBDcmVhdGVzIGEgbmV3IFF1ZXJ5IGluc3RhbmNlIHdpdGggdGhlIG9wdGlvbnMgcHJvdmlkZWQuICovIGZ1bmN0aW9uIFNlKHQsIGUsIG4sIHMsIGksIHIsIG8sIGEpIHtcbiAgICByZXR1cm4gbmV3IHZlKHQsIGUsIG4sIHMsIGksIHIsIG8sIGEpO1xufVxuXG4vKiogQ3JlYXRlcyBhIG5ldyBRdWVyeSBmb3IgYSBxdWVyeSB0aGF0IG1hdGNoZXMgYWxsIGRvY3VtZW50cyBhdCBgcGF0aGAgKi8gZnVuY3Rpb24gRGUodCkge1xuICAgIHJldHVybiBuZXcgdmUodCk7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGNvbnZlcnQgYSBjb2xsZWN0aW9uIGdyb3VwIHF1ZXJ5IGludG8gYSBjb2xsZWN0aW9uIHF1ZXJ5IGF0IGFcbiAqIHNwZWNpZmljIHBhdGguIFRoaXMgaXMgdXNlZCB3aGVuIGV4ZWN1dGluZyBjb2xsZWN0aW9uIGdyb3VwIHF1ZXJpZXMsIHNpbmNlXG4gKiB3ZSBoYXZlIHRvIHNwbGl0IHRoZSBxdWVyeSBpbnRvIGEgc2V0IG9mIGNvbGxlY3Rpb24gcXVlcmllcyBhdCBtdWx0aXBsZVxuICogcGF0aHMuXG4gKi8gZnVuY3Rpb24gQ2UodCkge1xuICAgIHJldHVybiAhU3QodC5saW1pdCkgJiYgXCJGXCIgLyogRmlyc3QgKi8gPT09IHQubGltaXRUeXBlO1xufVxuXG5mdW5jdGlvbiB4ZSh0KSB7XG4gICAgcmV0dXJuICFTdCh0LmxpbWl0KSAmJiBcIkxcIiAvKiBMYXN0ICovID09PSB0LmxpbWl0VHlwZTtcbn1cblxuZnVuY3Rpb24gTmUodCkge1xuICAgIHJldHVybiB0LmV4cGxpY2l0T3JkZXJCeS5sZW5ndGggPiAwID8gdC5leHBsaWNpdE9yZGVyQnlbMF0uZmllbGQgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBrZSh0KSB7XG4gICAgZm9yIChjb25zdCBlIG9mIHQuZmlsdGVycykgaWYgKGUuUygpKSByZXR1cm4gZS5maWVsZDtcbiAgICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYW55IG9mIHRoZSBwcm92aWRlZCBPcGVyYXRvcnMgYXJlIGluY2x1ZGVkIGluIHRoZSBxdWVyeSBhbmRcbiAqIHJldHVybnMgdGhlIGZpcnN0IG9uZSB0aGF0IGlzLCBvciBudWxsIGlmIG5vbmUgYXJlLlxuICovXG4vKipcbiAqIFJldHVybnMgd2hldGhlciB0aGUgcXVlcnkgbWF0Y2hlcyBhIGNvbGxlY3Rpb24gZ3JvdXAgcmF0aGVyIHRoYW4gYSBzcGVjaWZpY1xuICogY29sbGVjdGlvbi5cbiAqL1xuZnVuY3Rpb24gTWUodCkge1xuICAgIHJldHVybiBudWxsICE9PSB0LmNvbGxlY3Rpb25Hcm91cDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbXBsaWNpdCBvcmRlciBieSBjb25zdHJhaW50IHRoYXQgaXMgdXNlZCB0byBleGVjdXRlIHRoZSBRdWVyeSxcbiAqIHdoaWNoIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkZXIgYnkgY29uc3RyYWludHMgdGhlIHVzZXIgcHJvdmlkZWQgKGUuZy5cbiAqIHRoZSBTREsgYW5kIGJhY2tlbmQgYWx3YXlzIG9yZGVycyBieSBgX19uYW1lX19gKS5cbiAqLyBmdW5jdGlvbiBPZSh0KSB7XG4gICAgY29uc3QgZSA9IEsodCk7XG4gICAgaWYgKG51bGwgPT09IGUuRCkge1xuICAgICAgICBlLkQgPSBbXTtcbiAgICAgICAgY29uc3QgdCA9IGtlKGUpLCBuID0gTmUoZSk7XG4gICAgICAgIGlmIChudWxsICE9PSB0ICYmIG51bGwgPT09IG4pIFxuICAgICAgICAvLyBJbiBvcmRlciB0byBpbXBsaWNpdGx5IGFkZCBrZXkgb3JkZXJpbmcsIHdlIG11c3QgYWxzbyBhZGQgdGhlXG4gICAgICAgIC8vIGluZXF1YWxpdHkgZmlsdGVyIGZpZWxkIGZvciBpdCB0byBiZSBhIHZhbGlkIHF1ZXJ5LlxuICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIGRlZmF1bHQgaW5lcXVhbGl0eSBmaWVsZCBhbmQga2V5IG9yZGVyaW5nIGlzIGFzY2VuZGluZy5cbiAgICAgICAgdC5pc0tleUZpZWxkKCkgfHwgZS5ELnB1c2gobmV3IFJlKHQpKSwgZS5ELnB1c2gobmV3IFJlKG10LmtleUZpZWxkKCksIFwiYXNjXCIgLyogQVNDRU5ESU5HICovKSk7IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHQgPSAhMTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbiBvZiBlLmV4cGxpY2l0T3JkZXJCeSkgZS5ELnB1c2gobiksIG4uZmllbGQuaXNLZXlGaWVsZCgpICYmICh0ID0gITApO1xuICAgICAgICAgICAgaWYgKCF0KSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIG9yZGVyIG9mIHRoZSBpbXBsaWNpdCBrZXkgb3JkZXJpbmcgYWx3YXlzIG1hdGNoZXMgdGhlIGxhc3RcbiAgICAgICAgICAgICAgICAvLyBleHBsaWNpdCBvcmRlciBieVxuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBlLmV4cGxpY2l0T3JkZXJCeS5sZW5ndGggPiAwID8gZS5leHBsaWNpdE9yZGVyQnlbZS5leHBsaWNpdE9yZGVyQnkubGVuZ3RoIC0gMV0uZGlyIDogXCJhc2NcIiAvKiBBU0NFTkRJTkcgKi87XG4gICAgICAgICAgICAgICAgZS5ELnB1c2gobmV3IFJlKG10LmtleUZpZWxkKCksIHQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZS5EO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRoaXMgYFF1ZXJ5YCBpbnN0YW5jZSB0byBpdCdzIGNvcnJlc3BvbmRpbmcgYFRhcmdldGAgcmVwcmVzZW50YXRpb24uXG4gKi8gZnVuY3Rpb24gJGUodCkge1xuICAgIGNvbnN0IGUgPSBLKHQpO1xuICAgIGlmICghZS5DKSBpZiAoXCJGXCIgLyogRmlyc3QgKi8gPT09IGUubGltaXRUeXBlKSBlLkMgPSB1ZShlLnBhdGgsIGUuY29sbGVjdGlvbkdyb3VwLCBPZShlKSwgZS5maWx0ZXJzLCBlLmxpbWl0LCBlLnN0YXJ0QXQsIGUuZW5kQXQpOyBlbHNlIHtcbiAgICAgICAgLy8gRmxpcCB0aGUgb3JkZXJCeSBkaXJlY3Rpb25zIHNpbmNlIHdlIHdhbnQgdGhlIGxhc3QgcmVzdWx0c1xuICAgICAgICBjb25zdCB0ID0gW107XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiBPZShlKSkge1xuICAgICAgICAgICAgY29uc3QgZSA9IFwiZGVzY1wiIC8qIERFU0NFTkRJTkcgKi8gPT09IG4uZGlyID8gXCJhc2NcIiAvKiBBU0NFTkRJTkcgKi8gOiBcImRlc2NcIiAvKiBERVNDRU5ESU5HICovO1xuICAgICAgICAgICAgdC5wdXNoKG5ldyBSZShuLmZpZWxkLCBlKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgbmVlZCB0byBzd2FwIHRoZSBjdXJzb3JzIHRvIG1hdGNoIHRoZSBub3ctZmxpcHBlZCBxdWVyeSBvcmRlcmluZy5cbiAgICAgICAgICAgICAgICBjb25zdCBuID0gZS5lbmRBdCA/IG5ldyBBZShlLmVuZEF0LnBvc2l0aW9uLCAhZS5lbmRBdC5pbmNsdXNpdmUpIDogbnVsbCwgcyA9IGUuc3RhcnRBdCA/IG5ldyBBZShlLnN0YXJ0QXQucG9zaXRpb24sICFlLnN0YXJ0QXQuaW5jbHVzaXZlKSA6IG51bGw7XG4gICAgICAgIC8vIE5vdyByZXR1cm4gYXMgYSBMaW1pdFR5cGUuRmlyc3QgcXVlcnkuXG4gICAgICAgIGUuQyA9IHVlKGUucGF0aCwgZS5jb2xsZWN0aW9uR3JvdXAsIHQsIGUuZmlsdGVycywgZS5saW1pdCwgbiwgcyk7XG4gICAgfVxuICAgIHJldHVybiBlLkM7XG59XG5cbmZ1bmN0aW9uIEZlKHQsIGUsIG4pIHtcbiAgICByZXR1cm4gbmV3IHZlKHQucGF0aCwgdC5jb2xsZWN0aW9uR3JvdXAsIHQuZXhwbGljaXRPcmRlckJ5LnNsaWNlKCksIHQuZmlsdGVycy5zbGljZSgpLCBlLCBuLCB0LnN0YXJ0QXQsIHQuZW5kQXQpO1xufVxuXG5mdW5jdGlvbiBCZSh0LCBlKSB7XG4gICAgcmV0dXJuIGxlKCRlKHQpLCAkZShlKSkgJiYgdC5saW1pdFR5cGUgPT09IGUubGltaXRUeXBlO1xufVxuXG4vLyBUT0RPKGIvMjkxODMxNjUpOiBUaGlzIGlzIHVzZWQgdG8gZ2V0IGEgdW5pcXVlIHN0cmluZyBmcm9tIGEgcXVlcnkgdG8sIGZvclxuLy8gZXhhbXBsZSwgdXNlIGFzIGEgZGljdGlvbmFyeSBrZXksIGJ1dCB0aGUgaW1wbGVtZW50YXRpb24gaXMgc3ViamVjdCB0b1xuLy8gY29sbGlzaW9ucy4gTWFrZSBpdCBjb2xsaXNpb24tZnJlZS5cbmZ1bmN0aW9uIExlKHQpIHtcbiAgICByZXR1cm4gYCR7Y2UoJGUodCkpfXxsdDoke3QubGltaXRUeXBlfWA7XG59XG5cbmZ1bmN0aW9uIHFlKHQpIHtcbiAgICByZXR1cm4gYFF1ZXJ5KHRhcmdldD0ke2hlKCRlKHQpKX07IGxpbWl0VHlwZT0ke3QubGltaXRUeXBlfSlgO1xufVxuXG4vKiogUmV0dXJucyB3aGV0aGVyIGBkb2NgIG1hdGNoZXMgdGhlIGNvbnN0cmFpbnRzIG9mIGBxdWVyeWAuICovIGZ1bmN0aW9uIFVlKHQsIGUpIHtcbiAgICByZXR1cm4gZS5pc0ZvdW5kRG9jdW1lbnQoKSAmJiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBlLmtleS5wYXRoO1xuICAgICAgICByZXR1cm4gbnVsbCAhPT0gdC5jb2xsZWN0aW9uR3JvdXAgPyBlLmtleS5oYXNDb2xsZWN0aW9uSWQodC5jb2xsZWN0aW9uR3JvdXApICYmIHQucGF0aC5pc1ByZWZpeE9mKG4pIDogeHQuaXNEb2N1bWVudEtleSh0LnBhdGgpID8gdC5wYXRoLmlzRXF1YWwobikgOiB0LnBhdGguaXNJbW1lZGlhdGVQYXJlbnRPZihuKTtcbiAgICB9XG4gICAgLyoqXG4gKiBBIGRvY3VtZW50IG11c3QgaGF2ZSBhIHZhbHVlIGZvciBldmVyeSBvcmRlcmluZyBjbGF1c2UgaW4gb3JkZXIgdG8gc2hvdyB1cFxuICogaW4gdGhlIHJlc3VsdHMuXG4gKi8gKHQsIGUpICYmIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgZm9yIChjb25zdCBuIG9mIHQuZXhwbGljaXRPcmRlckJ5KSBcbiAgICAgICAgLy8gb3JkZXIgYnkga2V5IGFsd2F5cyBtYXRjaGVzXG4gICAgICAgIGlmICghbi5maWVsZC5pc0tleUZpZWxkKCkgJiYgbnVsbCA9PT0gZS5kYXRhLmZpZWxkKG4uZmllbGQpKSByZXR1cm4gITE7XG4gICAgICAgIHJldHVybiAhMDtcbiAgICB9KHQsIGUpICYmIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgZm9yIChjb25zdCBuIG9mIHQuZmlsdGVycykgaWYgKCFuLm1hdGNoZXMoZSkpIHJldHVybiAhMTtcbiAgICAgICAgcmV0dXJuICEwO1xuICAgIH1cbiAgICAvKiogTWFrZXMgc3VyZSBhIGRvY3VtZW50IGlzIHdpdGhpbiB0aGUgYm91bmRzLCBpZiBwcm92aWRlZC4gKi8gKHQsIGUpICYmIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgaWYgKHQuc3RhcnRBdCAmJiAhXG4gICAgICAgIC8qKlxuICogUmV0dXJucyB0cnVlIGlmIGEgZG9jdW1lbnQgc29ydHMgYmVmb3JlIGEgYm91bmQgdXNpbmcgdGhlIHByb3ZpZGVkIHNvcnRcbiAqIG9yZGVyLlxuICovXG4gICAgICAgIGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBQZSh0LCBlLCBuKTtcbiAgICAgICAgICAgIHJldHVybiB0LmluY2x1c2l2ZSA/IHMgPD0gMCA6IHMgPCAwO1xuICAgICAgICB9KHQuc3RhcnRBdCwgT2UodCksIGUpKSByZXR1cm4gITE7XG4gICAgICAgIGlmICh0LmVuZEF0ICYmICFmdW5jdGlvbih0LCBlLCBuKSB7XG4gICAgICAgICAgICBjb25zdCBzID0gUGUodCwgZSwgbik7XG4gICAgICAgICAgICByZXR1cm4gdC5pbmNsdXNpdmUgPyBzID49IDAgOiBzID4gMDtcbiAgICAgICAgfSh0LmVuZEF0LCBPZSh0KSwgZSkpIHJldHVybiAhMTtcbiAgICAgICAgcmV0dXJuICEwO1xuICAgIH1cbiAgICAvKipcbiAqIFJldHVybnMgYSBuZXcgY29tcGFyYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbXBhcmUgdHdvIGRvY3VtZW50c1xuICogYmFzZWQgb24gdGhlIFF1ZXJ5J3Mgb3JkZXJpbmcgY29uc3RyYWludC5cbiAqLyAodCwgZSk7XG59XG5cbmZ1bmN0aW9uIEtlKHQpIHtcbiAgICByZXR1cm4gKGUsIG4pID0+IHtcbiAgICAgICAgbGV0IHMgPSAhMTtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIE9lKHQpKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gR2UoaSwgZSwgbik7XG4gICAgICAgICAgICBpZiAoMCAhPT0gdCkgcmV0dXJuIHQ7XG4gICAgICAgICAgICBzID0gcyB8fCBpLmZpZWxkLmlzS2V5RmllbGQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBHZSh0LCBlLCBuKSB7XG4gICAgY29uc3QgcyA9IHQuZmllbGQuaXNLZXlGaWVsZCgpID8geHQuY29tcGFyYXRvcihlLmtleSwgbi5rZXkpIDogZnVuY3Rpb24odCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gZS5kYXRhLmZpZWxkKHQpLCBpID0gbi5kYXRhLmZpZWxkKHQpO1xuICAgICAgICByZXR1cm4gbnVsbCAhPT0gcyAmJiBudWxsICE9PSBpID8gRnQocywgaSkgOiBMKCk7XG4gICAgfVxuICAgIC8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4gICAgLyoqXG4gKiBUaGUgaW5pdGlhbCBtdXRhdGlvbiBiYXRjaCBpZCBmb3IgZWFjaCBpbmRleC4gR2V0cyB1cGRhdGVkIGR1cmluZyBpbmRleFxuICogYmFja2ZpbGwuXG4gKi8gKHQuZmllbGQsIGUsIG4pO1xuICAgIHN3aXRjaCAodC5kaXIpIHtcbiAgICAgIGNhc2UgXCJhc2NcIiAvKiBBU0NFTkRJTkcgKi8gOlxuICAgICAgICByZXR1cm4gcztcblxuICAgICAgY2FzZSBcImRlc2NcIiAvKiBERVNDRU5ESU5HICovIDpcbiAgICAgICAgcmV0dXJuIC0xICogcztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIEwoKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFJldHVybnMgYW4gRG91YmxlVmFsdWUgZm9yIGB2YWx1ZWAgdGhhdCBpcyBlbmNvZGVkIGJhc2VkIHRoZSBzZXJpYWxpemVyJ3NcbiAqIGB1c2VQcm90bzNKc29uYCBzZXR0aW5nLlxuICovIGZ1bmN0aW9uIFFlKHQsIGUpIHtcbiAgICBpZiAodC5OKSB7XG4gICAgICAgIGlmIChpc05hTihlKSkgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvdWJsZVZhbHVlOiBcIk5hTlwiXG4gICAgICAgIH07XG4gICAgICAgIGlmIChlID09PSAxIC8gMCkgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvdWJsZVZhbHVlOiBcIkluZmluaXR5XCJcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGUgPT09IC0xIC8gMCkgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvdWJsZVZhbHVlOiBcIi1JbmZpbml0eVwiXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGRvdWJsZVZhbHVlOiBEdChlKSA/IFwiLTBcIiA6IGVcbiAgICB9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYW4gSW50ZWdlclZhbHVlIGZvciBgdmFsdWVgLlxuICovIGZ1bmN0aW9uIGplKHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbnRlZ2VyVmFsdWU6IFwiXCIgKyB0XG4gICAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgdmFsdWUgZm9yIGEgbnVtYmVyIHRoYXQncyBhcHByb3ByaWF0ZSB0byBwdXQgaW50byBhIHByb3RvLlxuICogVGhlIHJldHVybiB2YWx1ZSBpcyBhbiBJbnRlZ2VyVmFsdWUgaWYgaXQgY2FuIHNhZmVseSByZXByZXNlbnQgdGhlIHZhbHVlLFxuICogb3RoZXJ3aXNlIGEgRG91YmxlVmFsdWUgaXMgcmV0dXJuZWQuXG4gKi8gZnVuY3Rpb24gV2UodCwgZSkge1xuICAgIHJldHVybiBDdChlKSA/IGplKGUpIDogUWUodCwgZSk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogVXNlZCB0byByZXByZXNlbnQgYSBmaWVsZCB0cmFuc2Zvcm0gb24gYSBtdXRhdGlvbi4gKi8gY2xhc3MgemUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgc3RydWN0dXJhbCB0eXBlIG9mIGBUcmFuc2Zvcm1PcGVyYXRpb25gIGlzIHVuaXF1ZS5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTQ1MVxuICAgICAgICB0aGlzLl8gPSB2b2lkIDA7XG4gICAgfVxufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBsb2NhbCB0cmFuc2Zvcm0gcmVzdWx0IGFnYWluc3QgdGhlIHByb3ZpZGVkIGBwcmV2aW91c1ZhbHVlYCxcbiAqIG9wdGlvbmFsbHkgdXNpbmcgdGhlIHByb3ZpZGVkIGxvY2FsV3JpdGVUaW1lLlxuICovIGZ1bmN0aW9uIEhlKHQsIGUsIG4pIHtcbiAgICByZXR1cm4gdCBpbnN0YW5jZW9mIFhlID8gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICBjb25zdCBuID0ge1xuICAgICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICAgICAgX190eXBlX186IHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IFwic2VydmVyX3RpbWVzdGFtcFwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBfX2xvY2FsX3dyaXRlX3RpbWVfXzoge1xuICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBWYWx1ZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kczogdC5zZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFub3M6IHQubmFub3NlY29uZHNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGUgJiYgKG4uZmllbGRzLl9fcHJldmlvdXNfdmFsdWVfXyA9IGUpLCB7XG4gICAgICAgICAgICBtYXBWYWx1ZTogblxuICAgICAgICB9O1xuICAgIH0obiwgZSkgOiB0IGluc3RhbmNlb2YgWmUgPyB0bih0LCBlKSA6IHQgaW5zdGFuY2VvZiBlbiA/IG5uKHQsIGUpIDogZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAvLyBQT1JUSU5HIE5PVEU6IFNpbmNlIEphdmFTY3JpcHQncyBpbnRlZ2VyIGFyaXRobWV0aWMgaXMgbGltaXRlZCB0byA1MyBiaXRcbiAgICAgICAgLy8gcHJlY2lzaW9uIGFuZCByZXNvbHZlcyBvdmVyZmxvd3MgYnkgcmVkdWNpbmcgcHJlY2lzaW9uLCB3ZSBkbyBub3RcbiAgICAgICAgLy8gbWFudWFsbHkgY2FwIG92ZXJmbG93cyBhdCAyXjYzLlxuICAgICAgICBjb25zdCBuID0gWWUodCwgZSksIHMgPSBybihuKSArIHJuKHQuayk7XG4gICAgICAgIHJldHVybiBLdChuKSAmJiBLdCh0LmspID8gamUocykgOiBRZSh0Lk0sIHMpO1xuICAgIH0odCwgZSk7XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgYSBmaW5hbCB0cmFuc2Zvcm0gcmVzdWx0IGFmdGVyIHRoZSB0cmFuc2Zvcm0gaGFzIGJlZW4gYWNrbm93bGVkZ2VkXG4gKiBieSB0aGUgc2VydmVyLCBwb3RlbnRpYWxseSB1c2luZyB0aGUgc2VydmVyLXByb3ZpZGVkIHRyYW5zZm9ybVJlc3VsdC5cbiAqLyBmdW5jdGlvbiBKZSh0LCBlLCBuKSB7XG4gICAgLy8gVGhlIHNlcnZlciBqdXN0IHNlbmRzIG51bGwgYXMgdGhlIHRyYW5zZm9ybSByZXN1bHQgZm9yIGFycmF5IG9wZXJhdGlvbnMsXG4gICAgLy8gc28gd2UgaGF2ZSB0byBjYWxjdWxhdGUgYSByZXN1bHQgdGhlIHNhbWUgYXMgd2UgZG8gZm9yIGxvY2FsXG4gICAgLy8gYXBwbGljYXRpb25zLlxuICAgIHJldHVybiB0IGluc3RhbmNlb2YgWmUgPyB0bih0LCBlKSA6IHQgaW5zdGFuY2VvZiBlbiA/IG5uKHQsIGUpIDogbjtcbn1cblxuLyoqXG4gKiBJZiB0aGlzIHRyYW5zZm9ybSBvcGVyYXRpb24gaXMgbm90IGlkZW1wb3RlbnQsIHJldHVybnMgdGhlIGJhc2UgdmFsdWUgdG9cbiAqIHBlcnNpc3QgZm9yIHRoaXMgdHJhbnNmb3JtLiBJZiBhIGJhc2UgdmFsdWUgaXMgcmV0dXJuZWQsIHRoZSB0cmFuc2Zvcm1cbiAqIG9wZXJhdGlvbiBpcyBhbHdheXMgYXBwbGllZCB0byB0aGlzIGJhc2UgdmFsdWUsIGV2ZW4gaWYgZG9jdW1lbnQgaGFzXG4gKiBhbHJlYWR5IGJlZW4gdXBkYXRlZC5cbiAqXG4gKiBCYXNlIHZhbHVlcyBwcm92aWRlIGNvbnNpc3RlbnQgYmVoYXZpb3IgZm9yIG5vbi1pZGVtcG90ZW50IHRyYW5zZm9ybXMgYW5kXG4gKiBhbGxvdyB1cyB0byByZXR1cm4gdGhlIHNhbWUgbGF0ZW5jeS1jb21wZW5zYXRlZCB2YWx1ZSBldmVuIGlmIHRoZSBiYWNrZW5kXG4gKiBoYXMgYWxyZWFkeSBhcHBsaWVkIHRoZSB0cmFuc2Zvcm0gb3BlcmF0aW9uLiBUaGUgYmFzZSB2YWx1ZSBpcyBudWxsIGZvclxuICogaWRlbXBvdGVudCB0cmFuc2Zvcm1zLCBhcyB0aGV5IGNhbiBiZSByZS1wbGF5ZWQgZXZlbiBpZiB0aGUgYmFja2VuZCBoYXNcbiAqIGFscmVhZHkgYXBwbGllZCB0aGVtLlxuICpcbiAqIEByZXR1cm5zIGEgYmFzZSB2YWx1ZSB0byBzdG9yZSBhbG9uZyB3aXRoIHRoZSBtdXRhdGlvbiwgb3IgbnVsbCBmb3JcbiAqIGlkZW1wb3RlbnQgdHJhbnNmb3Jtcy5cbiAqLyBmdW5jdGlvbiBZZSh0LCBlKSB7XG4gICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBzbiA/IEt0KG4gPSBlKSB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIHJldHVybiAhIXQgJiYgXCJkb3VibGVWYWx1ZVwiIGluIHQ7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBlaXRoZXIgYW4gSW50ZWdlclZhbHVlIG9yIGEgRG91YmxlVmFsdWUuICovIChuKSA/IGUgOiB7XG4gICAgICAgIGludGVnZXJWYWx1ZTogMFxuICAgIH0gOiBudWxsO1xuICAgIHZhciBuO1xufVxuXG4vKiogVHJhbnNmb3JtcyBhIHZhbHVlIGludG8gYSBzZXJ2ZXItZ2VuZXJhdGVkIHRpbWVzdGFtcC4gKi9cbmNsYXNzIFhlIGV4dGVuZHMgemUge31cblxuLyoqIFRyYW5zZm9ybXMgYW4gYXJyYXkgdmFsdWUgdmlhIGEgdW5pb24gb3BlcmF0aW9uLiAqLyBjbGFzcyBaZSBleHRlbmRzIHplIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMuZWxlbWVudHMgPSB0O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdG4odCwgZSkge1xuICAgIGNvbnN0IG4gPSBvbihlKTtcbiAgICBmb3IgKGNvbnN0IGUgb2YgdC5lbGVtZW50cykgbi5zb21lKCh0ID0+IE90KHQsIGUpKSkgfHwgbi5wdXNoKGUpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGFycmF5VmFsdWU6IHtcbiAgICAgICAgICAgIHZhbHVlczogblxuICAgICAgICB9XG4gICAgfTtcbn1cblxuLyoqIFRyYW5zZm9ybXMgYW4gYXJyYXkgdmFsdWUgdmlhIGEgcmVtb3ZlIG9wZXJhdGlvbi4gKi8gY2xhc3MgZW4gZXh0ZW5kcyB6ZSB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICBzdXBlcigpLCB0aGlzLmVsZW1lbnRzID0gdDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG5uKHQsIGUpIHtcbiAgICBsZXQgbiA9IG9uKGUpO1xuICAgIGZvciAoY29uc3QgZSBvZiB0LmVsZW1lbnRzKSBuID0gbi5maWx0ZXIoKHQgPT4gIU90KHQsIGUpKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYXJyYXlWYWx1ZToge1xuICAgICAgICAgICAgdmFsdWVzOiBuXG4gICAgICAgIH1cbiAgICB9O1xufVxuXG4vKipcbiAqIEltcGxlbWVudHMgdGhlIGJhY2tlbmQgc2VtYW50aWNzIGZvciBsb2NhbGx5IGNvbXB1dGVkIE5VTUVSSUNfQUREIChpbmNyZW1lbnQpXG4gKiB0cmFuc2Zvcm1zLiBDb252ZXJ0cyBhbGwgZmllbGQgdmFsdWVzIHRvIGludGVnZXJzIG9yIGRvdWJsZXMsIGJ1dCB1bmxpa2UgdGhlXG4gKiBiYWNrZW5kIGRvZXMgbm90IGNhcCBpbnRlZ2VyIHZhbHVlcyBhdCAyXjYzLiBJbnN0ZWFkLCBKYXZhU2NyaXB0IG51bWJlclxuICogYXJpdGhtZXRpYyBpcyB1c2VkIGFuZCBwcmVjaXNpb24gbG9zcyBjYW4gb2NjdXIgZm9yIHZhbHVlcyBncmVhdGVyIHRoYW4gMl41My5cbiAqLyBjbGFzcyBzbiBleHRlbmRzIHplIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMuTSA9IHQsIHRoaXMuayA9IGU7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBybih0KSB7XG4gICAgcmV0dXJuIEV0KHQuaW50ZWdlclZhbHVlIHx8IHQuZG91YmxlVmFsdWUpO1xufVxuXG5mdW5jdGlvbiBvbih0KSB7XG4gICAgcmV0dXJuIEd0KHQpICYmIHQuYXJyYXlWYWx1ZS52YWx1ZXMgPyB0LmFycmF5VmFsdWUudmFsdWVzLnNsaWNlKCkgOiBbXTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKiBBIGZpZWxkIHBhdGggYW5kIHRoZSBUcmFuc2Zvcm1PcGVyYXRpb24gdG8gcGVyZm9ybSB1cG9uIGl0LiAqLyBjbGFzcyBhbiB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLmZpZWxkID0gdCwgdGhpcy50cmFuc2Zvcm0gPSBlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdW4odCwgZSkge1xuICAgIHJldHVybiB0LmZpZWxkLmlzRXF1YWwoZS5maWVsZCkgJiYgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICByZXR1cm4gdCBpbnN0YW5jZW9mIFplICYmIGUgaW5zdGFuY2VvZiBaZSB8fCB0IGluc3RhbmNlb2YgZW4gJiYgZSBpbnN0YW5jZW9mIGVuID8gb3QodC5lbGVtZW50cywgZS5lbGVtZW50cywgT3QpIDogdCBpbnN0YW5jZW9mIHNuICYmIGUgaW5zdGFuY2VvZiBzbiA/IE90KHQuaywgZS5rKSA6IHQgaW5zdGFuY2VvZiBYZSAmJiBlIGluc3RhbmNlb2YgWGU7XG4gICAgfSh0LnRyYW5zZm9ybSwgZS50cmFuc2Zvcm0pO1xufVxuXG4vKiogVGhlIHJlc3VsdCBvZiBzdWNjZXNzZnVsbHkgYXBwbHlpbmcgYSBtdXRhdGlvbiB0byB0aGUgYmFja2VuZC4gKi9cbmNsYXNzIGNuIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyc2lvbiBhdCB3aGljaCB0aGUgbXV0YXRpb24gd2FzIGNvbW1pdHRlZDpcbiAgICAgKlxuICAgICAqIC0gRm9yIG1vc3Qgb3BlcmF0aW9ucywgdGhpcyBpcyB0aGUgdXBkYXRlVGltZSBpbiB0aGUgV3JpdGVSZXN1bHQuXG4gICAgICogLSBGb3IgZGVsZXRlcywgdGhlIGNvbW1pdFRpbWUgb2YgdGhlIFdyaXRlUmVzcG9uc2UgKGJlY2F1c2UgZGVsZXRlcyBhcmVcbiAgICAgKiAgIG5vdCBzdG9yZWQgYW5kIGhhdmUgbm8gdXBkYXRlVGltZSkuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdGhlc2UgdmVyc2lvbnMgY2FuIGJlIGRpZmZlcmVudDogTm8tb3Agd3JpdGVzIHdpbGwgbm90IGNoYW5nZVxuICAgICAqIHRoZSB1cGRhdGVUaW1lIGV2ZW4gdGhvdWdoIHRoZSBjb21taXRUaW1lIGFkdmFuY2VzLlxuICAgICAqL1xuICAgIHQsIFxuICAgIC8qKlxuICAgICAqIFRoZSByZXN1bHRpbmcgZmllbGRzIHJldHVybmVkIGZyb20gdGhlIGJhY2tlbmQgYWZ0ZXIgYSBtdXRhdGlvblxuICAgICAqIGNvbnRhaW5pbmcgZmllbGQgdHJhbnNmb3JtcyBoYXMgYmVlbiBjb21taXR0ZWQuIENvbnRhaW5zIG9uZSBGaWVsZFZhbHVlXG4gICAgICogZm9yIGVhY2ggRmllbGRUcmFuc2Zvcm0gdGhhdCB3YXMgaW4gdGhlIG11dGF0aW9uLlxuICAgICAqXG4gICAgICogV2lsbCBiZSBlbXB0eSBpZiB0aGUgbXV0YXRpb24gZGlkIG5vdCBjb250YWluIGFueSBmaWVsZCB0cmFuc2Zvcm1zLlxuICAgICAqL1xuICAgIGUpIHtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gdCwgdGhpcy50cmFuc2Zvcm1SZXN1bHRzID0gZTtcbiAgICB9XG59XG5cbi8qKlxuICogRW5jb2RlcyBhIHByZWNvbmRpdGlvbiBmb3IgYSBtdXRhdGlvbi4gVGhpcyBmb2xsb3dzIHRoZSBtb2RlbCB0aGF0IHRoZVxuICogYmFja2VuZCBhY2NlcHRzIHdpdGggdGhlIHNwZWNpYWwgY2FzZSBvZiBhbiBleHBsaWNpdCBcImVtcHR5XCIgcHJlY29uZGl0aW9uXG4gKiAobWVhbmluZyBubyBwcmVjb25kaXRpb24pLlxuICovIGNsYXNzIGhuIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMudXBkYXRlVGltZSA9IHQsIHRoaXMuZXhpc3RzID0gZTtcbiAgICB9XG4gICAgLyoqIENyZWF0ZXMgYSBuZXcgZW1wdHkgUHJlY29uZGl0aW9uLiAqLyAgICBzdGF0aWMgbm9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBobjtcbiAgICB9XG4gICAgLyoqIENyZWF0ZXMgYSBuZXcgUHJlY29uZGl0aW9uIHdpdGggYW4gZXhpc3RzIGZsYWcuICovICAgIHN0YXRpYyBleGlzdHModCkge1xuICAgICAgICByZXR1cm4gbmV3IGhuKHZvaWQgMCwgdCk7XG4gICAgfVxuICAgIC8qKiBDcmVhdGVzIGEgbmV3IFByZWNvbmRpdGlvbiBiYXNlZCBvbiBhIHZlcnNpb24gYSBkb2N1bWVudCBleGlzdHMgYXQuICovICAgIHN0YXRpYyB1cGRhdGVUaW1lKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBobih0KTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgd2hldGhlciB0aGlzIFByZWNvbmRpdGlvbiBpcyBlbXB0eS4gKi8gICAgZ2V0IGlzTm9uZSgpIHtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gdGhpcy51cGRhdGVUaW1lICYmIHZvaWQgMCA9PT0gdGhpcy5leGlzdHM7XG4gICAgfVxuICAgIGlzRXF1YWwodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5leGlzdHMgPT09IHQuZXhpc3RzICYmICh0aGlzLnVwZGF0ZVRpbWUgPyAhIXQudXBkYXRlVGltZSAmJiB0aGlzLnVwZGF0ZVRpbWUuaXNFcXVhbCh0LnVwZGF0ZVRpbWUpIDogIXQudXBkYXRlVGltZSk7XG4gICAgfVxufVxuXG4vKiogUmV0dXJucyB0cnVlIGlmIHRoZSBwcmVjb25kaXRpb25zIGlzIHZhbGlkIGZvciB0aGUgZ2l2ZW4gZG9jdW1lbnQuICovIGZ1bmN0aW9uIGxuKHQsIGUpIHtcbiAgICByZXR1cm4gdm9pZCAwICE9PSB0LnVwZGF0ZVRpbWUgPyBlLmlzRm91bmREb2N1bWVudCgpICYmIGUudmVyc2lvbi5pc0VxdWFsKHQudXBkYXRlVGltZSkgOiB2b2lkIDAgPT09IHQuZXhpc3RzIHx8IHQuZXhpc3RzID09PSBlLmlzRm91bmREb2N1bWVudCgpO1xufVxuXG4vKipcbiAqIEEgbXV0YXRpb24gZGVzY3JpYmVzIGEgc2VsZi1jb250YWluZWQgY2hhbmdlIHRvIGEgZG9jdW1lbnQuIE11dGF0aW9ucyBjYW5cbiAqIGNyZWF0ZSwgcmVwbGFjZSwgZGVsZXRlLCBhbmQgdXBkYXRlIHN1YnNldHMgb2YgZG9jdW1lbnRzLlxuICpcbiAqIE11dGF0aW9ucyBub3Qgb25seSBhY3Qgb24gdGhlIHZhbHVlIG9mIHRoZSBkb2N1bWVudCBidXQgYWxzbyBpdHMgdmVyc2lvbi5cbiAqXG4gKiBGb3IgbG9jYWwgbXV0YXRpb25zIChtdXRhdGlvbnMgdGhhdCBoYXZlbid0IGJlZW4gY29tbWl0dGVkIHlldCksIHdlIHByZXNlcnZlXG4gKiB0aGUgZXhpc3RpbmcgdmVyc2lvbiBmb3IgU2V0IGFuZCBQYXRjaCBtdXRhdGlvbnMuIEZvciBEZWxldGUgbXV0YXRpb25zLCB3ZVxuICogcmVzZXQgdGhlIHZlcnNpb24gdG8gMC5cbiAqXG4gKiBIZXJlJ3MgdGhlIGV4cGVjdGVkIHRyYW5zaXRpb24gdGFibGUuXG4gKlxuICogTVVUQVRJT04gICAgICAgICAgIEFQUExJRUQgVE8gICAgICAgICAgICBSRVNVTFRTIElOXG4gKlxuICogU2V0TXV0YXRpb24gICAgICAgIERvY3VtZW50KHYzKSAgICAgICAgICBEb2N1bWVudCh2MylcbiAqIFNldE11dGF0aW9uICAgICAgICBOb0RvY3VtZW50KHYzKSAgICAgICAgRG9jdW1lbnQodjApXG4gKiBTZXRNdXRhdGlvbiAgICAgICAgSW52YWxpZERvY3VtZW50KHYwKSAgIERvY3VtZW50KHYwKVxuICogUGF0Y2hNdXRhdGlvbiAgICAgIERvY3VtZW50KHYzKSAgICAgICAgICBEb2N1bWVudCh2MylcbiAqIFBhdGNoTXV0YXRpb24gICAgICBOb0RvY3VtZW50KHYzKSAgICAgICAgTm9Eb2N1bWVudCh2MylcbiAqIFBhdGNoTXV0YXRpb24gICAgICBJbnZhbGlkRG9jdW1lbnQodjApICAgVW5rbm93bkRvY3VtZW50KHYzKVxuICogRGVsZXRlTXV0YXRpb24gICAgIERvY3VtZW50KHYzKSAgICAgICAgICBOb0RvY3VtZW50KHYwKVxuICogRGVsZXRlTXV0YXRpb24gICAgIE5vRG9jdW1lbnQodjMpICAgICAgICBOb0RvY3VtZW50KHYwKVxuICogRGVsZXRlTXV0YXRpb24gICAgIEludmFsaWREb2N1bWVudCh2MCkgICBOb0RvY3VtZW50KHYwKVxuICpcbiAqIEZvciBhY2tub3dsZWRnZWQgbXV0YXRpb25zLCB3ZSB1c2UgdGhlIHVwZGF0ZVRpbWUgb2YgdGhlIFdyaXRlUmVzcG9uc2UgYXNcbiAqIHRoZSByZXN1bHRpbmcgdmVyc2lvbiBmb3IgU2V0IGFuZCBQYXRjaCBtdXRhdGlvbnMuIEFzIGRlbGV0ZXMgaGF2ZSBub1xuICogZXhwbGljaXQgdXBkYXRlIHRpbWUsIHdlIHVzZSB0aGUgY29tbWl0VGltZSBvZiB0aGUgV3JpdGVSZXNwb25zZSBmb3JcbiAqIERlbGV0ZSBtdXRhdGlvbnMuXG4gKlxuICogSWYgYSBtdXRhdGlvbiBpcyBhY2tub3dsZWRnZWQgYnkgdGhlIGJhY2tlbmQgYnV0IGZhaWxzIHRoZSBwcmVjb25kaXRpb24gY2hlY2tcbiAqIGxvY2FsbHksIHdlIHRyYW5zaXRpb24gdG8gYW4gYFVua25vd25Eb2N1bWVudGAgYW5kIHJlbHkgb24gV2F0Y2ggdG8gc2VuZCB1c1xuICogdGhlIHVwZGF0ZWQgdmVyc2lvbi5cbiAqXG4gKiBGaWVsZCB0cmFuc2Zvcm1zIGFyZSB1c2VkIG9ubHkgd2l0aCBQYXRjaCBhbmQgU2V0IE11dGF0aW9ucy4gV2UgdXNlIHRoZVxuICogYHVwZGF0ZVRyYW5zZm9ybXNgIG1lc3NhZ2UgdG8gc3RvcmUgdHJhbnNmb3JtcywgcmF0aGVyIHRoYW4gdGhlIGB0cmFuc2Zvcm1zYHNcbiAqIG1lc3NhZ2VzLlxuICpcbiAqICMjIFN1YmNsYXNzaW5nIE5vdGVzXG4gKlxuICogRXZlcnkgdHlwZSBvZiBtdXRhdGlvbiBuZWVkcyB0byBpbXBsZW1lbnQgaXRzIG93biBhcHBseVRvUmVtb3RlRG9jdW1lbnQoKSBhbmRcbiAqIGFwcGx5VG9Mb2NhbFZpZXcoKSB0byBpbXBsZW1lbnQgdGhlIGFjdHVhbCBiZWhhdmlvciBvZiBhcHBseWluZyB0aGUgbXV0YXRpb25cbiAqIHRvIHNvbWUgc291cmNlIGRvY3VtZW50IChzZWUgYHNldE11dGF0aW9uQXBwbHlUb1JlbW90ZURvY3VtZW50KClgIGZvciBhblxuICogZXhhbXBsZSkuXG4gKi8gY2xhc3MgZm4ge31cblxuLyoqXG4gKiBBcHBsaWVzIHRoaXMgbXV0YXRpb24gdG8gdGhlIGdpdmVuIGRvY3VtZW50IGZvciB0aGUgcHVycG9zZXMgb2YgY29tcHV0aW5nIGFcbiAqIG5ldyByZW1vdGUgZG9jdW1lbnQuIElmIHRoZSBpbnB1dCBkb2N1bWVudCBkb2Vzbid0IG1hdGNoIHRoZSBleHBlY3RlZCBzdGF0ZVxuICogKGUuZy4gaXQgaXMgaW52YWxpZCBvciBvdXRkYXRlZCksIHRoZSBkb2N1bWVudCB0eXBlIG1heSB0cmFuc2l0aW9uIHRvXG4gKiB1bmtub3duLlxuICpcbiAqIEBwYXJhbSBtdXRhdGlvbiAtIFRoZSBtdXRhdGlvbiB0byBhcHBseS5cbiAqIEBwYXJhbSBkb2N1bWVudCAtIFRoZSBkb2N1bWVudCB0byBtdXRhdGUuIFRoZSBpbnB1dCBkb2N1bWVudCBjYW4gYmUgYW5cbiAqICAgICBpbnZhbGlkIGRvY3VtZW50IGlmIHRoZSBjbGllbnQgaGFzIG5vIGtub3dsZWRnZSBvZiB0aGUgcHJlLW11dGF0aW9uIHN0YXRlXG4gKiAgICAgb2YgdGhlIGRvY3VtZW50LlxuICogQHBhcmFtIG11dGF0aW9uUmVzdWx0IC0gVGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgbXV0YXRpb24gZnJvbSB0aGUgYmFja2VuZC5cbiAqLyBmdW5jdGlvbiBkbih0LCBlLCBuKSB7XG4gICAgdCBpbnN0YW5jZW9mIHluID8gZnVuY3Rpb24odCwgZSwgbikge1xuICAgICAgICAvLyBVbmxpa2Ugc2V0TXV0YXRpb25BcHBseVRvTG9jYWxWaWV3LCBpZiB3ZSdyZSBhcHBseWluZyBhIG11dGF0aW9uIHRvIGFcbiAgICAgICAgLy8gcmVtb3RlIGRvY3VtZW50IHRoZSBzZXJ2ZXIgaGFzIGFjY2VwdGVkIHRoZSBtdXRhdGlvbiBzbyB0aGUgcHJlY29uZGl0aW9uXG4gICAgICAgIC8vIG11c3QgaGF2ZSBoZWxkLlxuICAgICAgICBjb25zdCBzID0gdC52YWx1ZS5jbG9uZSgpLCBpID0gVG4odC5maWVsZFRyYW5zZm9ybXMsIGUsIG4udHJhbnNmb3JtUmVzdWx0cyk7XG4gICAgICAgIHMuc2V0QWxsKGkpLCBlLmNvbnZlcnRUb0ZvdW5kRG9jdW1lbnQobi52ZXJzaW9uLCBzKS5zZXRIYXNDb21taXR0ZWRNdXRhdGlvbnMoKTtcbiAgICB9KHQsIGUsIG4pIDogdCBpbnN0YW5jZW9mIHBuID8gZnVuY3Rpb24odCwgZSwgbikge1xuICAgICAgICBpZiAoIWxuKHQucHJlY29uZGl0aW9uLCBlKSkgXG4gICAgICAgIC8vIFNpbmNlIHRoZSBtdXRhdGlvbiB3YXMgbm90IHJlamVjdGVkLCB3ZSBrbm93IHRoYXQgdGhlIHByZWNvbmRpdGlvblxuICAgICAgICAvLyBtYXRjaGVkIG9uIHRoZSBiYWNrZW5kLiBXZSB0aGVyZWZvcmUgbXVzdCBub3QgaGF2ZSB0aGUgZXhwZWN0ZWQgdmVyc2lvblxuICAgICAgICAvLyBvZiB0aGUgZG9jdW1lbnQgaW4gb3VyIGNhY2hlIGFuZCBjb252ZXJ0IHRvIGFuIFVua25vd25Eb2N1bWVudCB3aXRoIGFcbiAgICAgICAgLy8ga25vd24gdXBkYXRlVGltZS5cbiAgICAgICAgcmV0dXJuIHZvaWQgZS5jb252ZXJ0VG9Vbmtub3duRG9jdW1lbnQobi52ZXJzaW9uKTtcbiAgICAgICAgY29uc3QgcyA9IFRuKHQuZmllbGRUcmFuc2Zvcm1zLCBlLCBuLnRyYW5zZm9ybVJlc3VsdHMpLCBpID0gZS5kYXRhO1xuICAgICAgICBpLnNldEFsbChJbih0KSksIGkuc2V0QWxsKHMpLCBlLmNvbnZlcnRUb0ZvdW5kRG9jdW1lbnQobi52ZXJzaW9uLCBpKS5zZXRIYXNDb21taXR0ZWRNdXRhdGlvbnMoKTtcbiAgICB9KHQsIGUsIG4pIDogZnVuY3Rpb24odCwgZSwgbikge1xuICAgICAgICAvLyBVbmxpa2UgYXBwbHlUb0xvY2FsVmlldywgaWYgd2UncmUgYXBwbHlpbmcgYSBtdXRhdGlvbiB0byBhIHJlbW90ZVxuICAgICAgICAvLyBkb2N1bWVudCB0aGUgc2VydmVyIGhhcyBhY2NlcHRlZCB0aGUgbXV0YXRpb24gc28gdGhlIHByZWNvbmRpdGlvbiBtdXN0XG4gICAgICAgIC8vIGhhdmUgaGVsZC5cbiAgICAgICAgZS5jb252ZXJ0VG9Ob0RvY3VtZW50KG4udmVyc2lvbikuc2V0SGFzQ29tbWl0dGVkTXV0YXRpb25zKCk7XG4gICAgfSgwLCBlLCBuKTtcbn1cblxuLyoqXG4gKiBBcHBsaWVzIHRoaXMgbXV0YXRpb24gdG8gdGhlIGdpdmVuIGRvY3VtZW50IGZvciB0aGUgcHVycG9zZXMgb2YgY29tcHV0aW5nXG4gKiB0aGUgbmV3IGxvY2FsIHZpZXcgb2YgYSBkb2N1bWVudC4gSWYgdGhlIGlucHV0IGRvY3VtZW50IGRvZXNuJ3QgbWF0Y2ggdGhlXG4gKiBleHBlY3RlZCBzdGF0ZSwgdGhlIGRvY3VtZW50IGlzIG5vdCBtb2RpZmllZC5cbiAqXG4gKiBAcGFyYW0gbXV0YXRpb24gLSBUaGUgbXV0YXRpb24gdG8gYXBwbHkuXG4gKiBAcGFyYW0gZG9jdW1lbnQgLSBUaGUgZG9jdW1lbnQgdG8gbXV0YXRlLiBUaGUgaW5wdXQgZG9jdW1lbnQgY2FuIGJlIGFuXG4gKiAgICAgaW52YWxpZCBkb2N1bWVudCBpZiB0aGUgY2xpZW50IGhhcyBubyBrbm93bGVkZ2Ugb2YgdGhlIHByZS1tdXRhdGlvbiBzdGF0ZVxuICogICAgIG9mIHRoZSBkb2N1bWVudC5cbiAqIEBwYXJhbSBsb2NhbFdyaXRlVGltZSAtIEEgdGltZXN0YW1wIGluZGljYXRpbmcgdGhlIGxvY2FsIHdyaXRlIHRpbWUgb2YgdGhlXG4gKiAgICAgYmF0Y2ggdGhpcyBtdXRhdGlvbiBpcyBhIHBhcnQgb2YuXG4gKi8gZnVuY3Rpb24gX24odCwgZSwgbikge1xuICAgIHQgaW5zdGFuY2VvZiB5biA/IGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgaWYgKCFsbih0LnByZWNvbmRpdGlvbiwgZSkpIFxuICAgICAgICAvLyBUaGUgbXV0YXRpb24gZmFpbGVkIHRvIGFwcGx5IChlLmcuIGEgZG9jdW1lbnQgSUQgY3JlYXRlZCB3aXRoIGFkZCgpXG4gICAgICAgIC8vIGNhdXNlZCBhIG5hbWUgY29sbGlzaW9uKS5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCBzID0gdC52YWx1ZS5jbG9uZSgpLCBpID0gRW4odC5maWVsZFRyYW5zZm9ybXMsIG4sIGUpO1xuICAgICAgICBzLnNldEFsbChpKSwgZS5jb252ZXJ0VG9Gb3VuZERvY3VtZW50KGduKGUpLCBzKS5zZXRIYXNMb2NhbE11dGF0aW9ucygpO1xuICAgIH1cbiAgICAvKipcbiAqIEEgbXV0YXRpb24gdGhhdCBtb2RpZmllcyBmaWVsZHMgb2YgdGhlIGRvY3VtZW50IGF0IHRoZSBnaXZlbiBrZXkgd2l0aCB0aGVcbiAqIGdpdmVuIHZhbHVlcy4gVGhlIHZhbHVlcyBhcmUgYXBwbGllZCB0aHJvdWdoIGEgZmllbGQgbWFzazpcbiAqXG4gKiAgKiBXaGVuIGEgZmllbGQgaXMgaW4gYm90aCB0aGUgbWFzayBhbmQgdGhlIHZhbHVlcywgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGRcbiAqICAgIGlzIHVwZGF0ZWQuXG4gKiAgKiBXaGVuIGEgZmllbGQgaXMgaW4gbmVpdGhlciB0aGUgbWFzayBub3IgdGhlIHZhbHVlcywgdGhlIGNvcnJlc3BvbmRpbmdcbiAqICAgIGZpZWxkIGlzIHVubW9kaWZpZWQuXG4gKiAgKiBXaGVuIGEgZmllbGQgaXMgaW4gdGhlIG1hc2sgYnV0IG5vdCBpbiB0aGUgdmFsdWVzLCB0aGUgY29ycmVzcG9uZGluZyBmaWVsZFxuICogICAgaXMgZGVsZXRlZC5cbiAqICAqIFdoZW4gYSBmaWVsZCBpcyBub3QgaW4gdGhlIG1hc2sgYnV0IGlzIGluIHRoZSB2YWx1ZXMsIHRoZSB2YWx1ZXMgbWFwIGlzXG4gKiAgICBpZ25vcmVkLlxuICovICh0LCBlLCBuKSA6IHQgaW5zdGFuY2VvZiBwbiA/IGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgaWYgKCFsbih0LnByZWNvbmRpdGlvbiwgZSkpIHJldHVybjtcbiAgICAgICAgY29uc3QgcyA9IEVuKHQuZmllbGRUcmFuc2Zvcm1zLCBuLCBlKSwgaSA9IGUuZGF0YTtcbiAgICAgICAgaS5zZXRBbGwoSW4odCkpLCBpLnNldEFsbChzKSwgZS5jb252ZXJ0VG9Gb3VuZERvY3VtZW50KGduKGUpLCBpKS5zZXRIYXNMb2NhbE11dGF0aW9ucygpO1xuICAgIH1cbiAgICAvKipcbiAqIFJldHVybnMgYSBGaWVsZFBhdGgvVmFsdWUgbWFwIHdpdGggdGhlIGNvbnRlbnQgb2YgdGhlIFBhdGNoTXV0YXRpb24uXG4gKi8gKHQsIGUsIG4pIDogZnVuY3Rpb24odCwgZSkge1xuICAgICAgICBsbih0LnByZWNvbmRpdGlvbiwgZSkgJiYgXG4gICAgICAgIC8vIFdlIGRvbid0IGNhbGwgYHNldEhhc0xvY2FsTXV0YXRpb25zKClgIHNpbmNlIHdlIHdhbnQgdG8gYmUgYmFja3dhcmRzXG4gICAgICAgIC8vIGNvbXBhdGlibGUgd2l0aCB0aGUgZXhpc3RpbmcgU0RLIGJlaGF2aW9yLlxuICAgICAgICBlLmNvbnZlcnRUb05vRG9jdW1lbnQoY3QubWluKCkpO1xuICAgIH1cbiAgICAvKipcbiAqIEEgbXV0YXRpb24gdGhhdCB2ZXJpZmllcyB0aGUgZXhpc3RlbmNlIG9mIHRoZSBkb2N1bWVudCBhdCB0aGUgZ2l2ZW4ga2V5IHdpdGhcbiAqIHRoZSBwcm92aWRlZCBwcmVjb25kaXRpb24uXG4gKlxuICogVGhlIGB2ZXJpZnlgIG9wZXJhdGlvbiBpcyBvbmx5IHVzZWQgaW4gVHJhbnNhY3Rpb25zLCBhbmQgdGhpcyBjbGFzcyBzZXJ2ZXNcbiAqIHByaW1hcmlseSB0byBmYWNpbGl0YXRlIHNlcmlhbGl6YXRpb24gaW50byBwcm90b3MuXG4gKi8gKHQsIGUpO1xufVxuXG4vKipcbiAqIElmIHRoaXMgbXV0YXRpb24gaXMgbm90IGlkZW1wb3RlbnQsIHJldHVybnMgdGhlIGJhc2UgdmFsdWUgdG8gcGVyc2lzdCB3aXRoXG4gKiB0aGlzIG11dGF0aW9uLiBJZiBhIGJhc2UgdmFsdWUgaXMgcmV0dXJuZWQsIHRoZSBtdXRhdGlvbiBpcyBhbHdheXMgYXBwbGllZFxuICogdG8gdGhpcyBiYXNlIHZhbHVlLCBldmVuIGlmIGRvY3VtZW50IGhhcyBhbHJlYWR5IGJlZW4gdXBkYXRlZC5cbiAqXG4gKiBUaGUgYmFzZSB2YWx1ZSBpcyBhIHNwYXJzZSBvYmplY3QgdGhhdCBjb25zaXN0cyBvZiBvbmx5IHRoZSBkb2N1bWVudFxuICogZmllbGRzIGZvciB3aGljaCB0aGlzIG11dGF0aW9uIGNvbnRhaW5zIGEgbm9uLWlkZW1wb3RlbnQgdHJhbnNmb3JtYXRpb25cbiAqIChlLmcuIGEgbnVtZXJpYyBpbmNyZW1lbnQpLiBUaGUgcHJvdmlkZWQgdmFsdWUgZ3VhcmFudGVlcyBjb25zaXN0ZW50XG4gKiBiZWhhdmlvciBmb3Igbm9uLWlkZW1wb3RlbnQgdHJhbnNmb3JtcyBhbmQgYWxsb3cgdXMgdG8gcmV0dXJuIHRoZSBzYW1lXG4gKiBsYXRlbmN5LWNvbXBlbnNhdGVkIHZhbHVlIGV2ZW4gaWYgdGhlIGJhY2tlbmQgaGFzIGFscmVhZHkgYXBwbGllZCB0aGVcbiAqIG11dGF0aW9uLiBUaGUgYmFzZSB2YWx1ZSBpcyBudWxsIGZvciBpZGVtcG90ZW50IG11dGF0aW9ucywgYXMgdGhleSBjYW4gYmVcbiAqIHJlLXBsYXllZCBldmVuIGlmIHRoZSBiYWNrZW5kIGhhcyBhbHJlYWR5IGFwcGxpZWQgdGhlbS5cbiAqXG4gKiBAcmV0dXJucyBhIGJhc2UgdmFsdWUgdG8gc3RvcmUgYWxvbmcgd2l0aCB0aGUgbXV0YXRpb24sIG9yIG51bGwgZm9yXG4gKiBpZGVtcG90ZW50IG11dGF0aW9ucy5cbiAqLyBmdW5jdGlvbiB3bih0LCBlKSB7XG4gICAgbGV0IG4gPSBudWxsO1xuICAgIGZvciAoY29uc3QgcyBvZiB0LmZpZWxkVHJhbnNmb3Jtcykge1xuICAgICAgICBjb25zdCB0ID0gZS5kYXRhLmZpZWxkKHMuZmllbGQpLCBpID0gWWUocy50cmFuc2Zvcm0sIHQgfHwgbnVsbCk7XG4gICAgICAgIG51bGwgIT0gaSAmJiAobnVsbCA9PSBuICYmIChuID0gWHQuZW1wdHkoKSksIG4uc2V0KHMuZmllbGQsIGkpKTtcbiAgICB9XG4gICAgcmV0dXJuIG4gfHwgbnVsbDtcbn1cblxuZnVuY3Rpb24gbW4odCwgZSkge1xuICAgIHJldHVybiB0LnR5cGUgPT09IGUudHlwZSAmJiAoISF0LmtleS5pc0VxdWFsKGUua2V5KSAmJiAoISF0LnByZWNvbmRpdGlvbi5pc0VxdWFsKGUucHJlY29uZGl0aW9uKSAmJiAoISFmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIHJldHVybiB2b2lkIDAgPT09IHQgJiYgdm9pZCAwID09PSBlIHx8ICEoIXQgfHwgIWUpICYmIG90KHQsIGUsICgodCwgZSkgPT4gdW4odCwgZSkpKTtcbiAgICB9KHQuZmllbGRUcmFuc2Zvcm1zLCBlLmZpZWxkVHJhbnNmb3JtcykgJiYgKDAgLyogU2V0ICovID09PSB0LnR5cGUgPyB0LnZhbHVlLmlzRXF1YWwoZS52YWx1ZSkgOiAxIC8qIFBhdGNoICovICE9PSB0LnR5cGUgfHwgdC5kYXRhLmlzRXF1YWwoZS5kYXRhKSAmJiB0LmZpZWxkTWFzay5pc0VxdWFsKGUuZmllbGRNYXNrKSkpKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdmVyc2lvbiBmcm9tIHRoZSBnaXZlbiBkb2N1bWVudCBmb3IgdXNlIGFzIHRoZSByZXN1bHQgb2YgYVxuICogbXV0YXRpb24uIE11dGF0aW9ucyBhcmUgZGVmaW5lZCB0byByZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIGJhc2UgZG9jdW1lbnRcbiAqIG9ubHkgaWYgaXQgaXMgYW4gZXhpc3RpbmcgZG9jdW1lbnQuIERlbGV0ZWQgYW5kIHVua25vd24gZG9jdW1lbnRzIGhhdmUgYVxuICogcG9zdC1tdXRhdGlvbiB2ZXJzaW9uIG9mIFNuYXBzaG90VmVyc2lvbi5taW4oKS5cbiAqLyBmdW5jdGlvbiBnbih0KSB7XG4gICAgcmV0dXJuIHQuaXNGb3VuZERvY3VtZW50KCkgPyB0LnZlcnNpb24gOiBjdC5taW4oKTtcbn1cblxuLyoqXG4gKiBBIG11dGF0aW9uIHRoYXQgY3JlYXRlcyBvciByZXBsYWNlcyB0aGUgZG9jdW1lbnQgYXQgdGhlIGdpdmVuIGtleSB3aXRoIHRoZVxuICogb2JqZWN0IHZhbHVlIGNvbnRlbnRzLlxuICovIGNsYXNzIHluIGV4dGVuZHMgZm4ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMgPSBbXSkge1xuICAgICAgICBzdXBlcigpLCB0aGlzLmtleSA9IHQsIHRoaXMudmFsdWUgPSBlLCB0aGlzLnByZWNvbmRpdGlvbiA9IG4sIHRoaXMuZmllbGRUcmFuc2Zvcm1zID0gcywgXG4gICAgICAgIHRoaXMudHlwZSA9IDAgLyogU2V0ICovO1xuICAgIH1cbn1cblxuY2xhc3MgcG4gZXh0ZW5kcyBmbiB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgcywgaSA9IFtdKSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMua2V5ID0gdCwgdGhpcy5kYXRhID0gZSwgdGhpcy5maWVsZE1hc2sgPSBuLCB0aGlzLnByZWNvbmRpdGlvbiA9IHMsIFxuICAgICAgICB0aGlzLmZpZWxkVHJhbnNmb3JtcyA9IGksIHRoaXMudHlwZSA9IDEgLyogUGF0Y2ggKi87XG4gICAgfVxufVxuXG5mdW5jdGlvbiBJbih0KSB7XG4gICAgY29uc3QgZSA9IG5ldyBNYXA7XG4gICAgcmV0dXJuIHQuZmllbGRNYXNrLmZpZWxkcy5mb3JFYWNoKChuID0+IHtcbiAgICAgICAgaWYgKCFuLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgY29uc3QgcyA9IHQuZGF0YS5maWVsZChuKTtcbiAgICAgICAgICAgIGUuc2V0KG4sIHMpO1xuICAgICAgICB9XG4gICAgfSkpLCBlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsaXN0IG9mIFwidHJhbnNmb3JtIHJlc3VsdHNcIiAoYSB0cmFuc2Zvcm0gcmVzdWx0IGlzIGEgZmllbGQgdmFsdWVcbiAqIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIGEgdHJhbnNmb3JtKSBmb3IgdXNlIGFmdGVyIGEgbXV0YXRpb25cbiAqIGNvbnRhaW5pbmcgdHJhbnNmb3JtcyBoYXMgYmVlbiBhY2tub3dsZWRnZWQgYnkgdGhlIHNlcnZlci5cbiAqXG4gKiBAcGFyYW0gZmllbGRUcmFuc2Zvcm1zIC0gVGhlIGZpZWxkIHRyYW5zZm9ybXMgdG8gYXBwbHkgdGhlIHJlc3VsdCB0by5cbiAqIEBwYXJhbSBtdXRhYmxlRG9jdW1lbnQgLSBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZG9jdW1lbnQgYWZ0ZXIgYXBwbHlpbmcgYWxsXG4gKiBwcmV2aW91cyBtdXRhdGlvbnMuXG4gKiBAcGFyYW0gc2VydmVyVHJhbnNmb3JtUmVzdWx0cyAtIFRoZSB0cmFuc2Zvcm0gcmVzdWx0cyByZWNlaXZlZCBieSB0aGUgc2VydmVyLlxuICogQHJldHVybnMgVGhlIHRyYW5zZm9ybSByZXN1bHRzIGxpc3QuXG4gKi8gZnVuY3Rpb24gVG4odCwgZSwgbikge1xuICAgIGNvbnN0IHMgPSBuZXcgTWFwO1xuICAgIHEodC5sZW5ndGggPT09IG4ubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgciA9IHRbaV0sIG8gPSByLnRyYW5zZm9ybSwgYSA9IGUuZGF0YS5maWVsZChyLmZpZWxkKTtcbiAgICAgICAgcy5zZXQoci5maWVsZCwgSmUobywgYSwgbltpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gcztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbGlzdCBvZiBcInRyYW5zZm9ybSByZXN1bHRzXCIgKGEgdHJhbnNmb3JtIHJlc3VsdCBpcyBhIGZpZWxkIHZhbHVlXG4gKiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdCBvZiBhcHBseWluZyBhIHRyYW5zZm9ybSkgZm9yIHVzZSB3aGVuIGFwcGx5aW5nIGFcbiAqIHRyYW5zZm9ybSBsb2NhbGx5LlxuICpcbiAqIEBwYXJhbSBmaWVsZFRyYW5zZm9ybXMgLSBUaGUgZmllbGQgdHJhbnNmb3JtcyB0byBhcHBseSB0aGUgcmVzdWx0IHRvLlxuICogQHBhcmFtIGxvY2FsV3JpdGVUaW1lIC0gVGhlIGxvY2FsIHRpbWUgb2YgdGhlIG11dGF0aW9uICh1c2VkIHRvXG4gKiAgICAgZ2VuZXJhdGUgU2VydmVyVGltZXN0YW1wVmFsdWVzKS5cbiAqIEBwYXJhbSBtdXRhYmxlRG9jdW1lbnQgLSBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZG9jdW1lbnQgYWZ0ZXIgYXBwbHlpbmcgYWxsXG4gKiAgICAgcHJldmlvdXMgbXV0YXRpb25zLlxuICogQHJldHVybnMgVGhlIHRyYW5zZm9ybSByZXN1bHRzIGxpc3QuXG4gKi8gZnVuY3Rpb24gRW4odCwgZSwgbikge1xuICAgIGNvbnN0IHMgPSBuZXcgTWFwO1xuICAgIGZvciAoY29uc3QgaSBvZiB0KSB7XG4gICAgICAgIGNvbnN0IHQgPSBpLnRyYW5zZm9ybSwgciA9IG4uZGF0YS5maWVsZChpLmZpZWxkKTtcbiAgICAgICAgcy5zZXQoaS5maWVsZCwgSGUodCwgciwgZSkpO1xuICAgIH1cbiAgICByZXR1cm4gcztcbn1cblxuLyoqIEEgbXV0YXRpb24gdGhhdCBkZWxldGVzIHRoZSBkb2N1bWVudCBhdCB0aGUgZ2l2ZW4ga2V5LiAqLyBjbGFzcyBBbiBleHRlbmRzIGZuIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMua2V5ID0gdCwgdGhpcy5wcmVjb25kaXRpb24gPSBlLCB0aGlzLnR5cGUgPSAyIC8qIERlbGV0ZSAqLyAsIHRoaXMuZmllbGRUcmFuc2Zvcm1zID0gW107XG4gICAgfVxufVxuXG5jbGFzcyBSbiBleHRlbmRzIGZuIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMua2V5ID0gdCwgdGhpcy5wcmVjb25kaXRpb24gPSBlLCB0aGlzLnR5cGUgPSAzIC8qIFZlcmlmeSAqLyAsIHRoaXMuZmllbGRUcmFuc2Zvcm1zID0gW107XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjbGFzcyBibiB7XG4gICAgLy8gVE9ETyhiLzMzMDc4MTYzKToganVzdCB1c2Ugc2ltcGxlc3QgZm9ybSBvZiBleGlzdGVuY2UgZmlsdGVyIGZvciBub3dcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMuY291bnQgPSB0O1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogRXJyb3IgQ29kZXMgZGVzY3JpYmluZyB0aGUgZGlmZmVyZW50IHdheXMgR1JQQyBjYW4gZmFpbC4gVGhlc2UgYXJlIGNvcGllZFxuICogZGlyZWN0bHkgZnJvbSBHUlBDJ3Mgc291cmNlcyBoZXJlOlxuICpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ncnBjL2dycGMvYmxvYi9iY2VlYzk0ZWE0ZmM1ZjAwODVkODEyMzVkOGUxYzA2Nzk4ZGMzNDFhL2luY2x1ZGUvZ3JwYyUyQiUyQi9pbXBsL2NvZGVnZW4vc3RhdHVzX2NvZGVfZW51bS5oXG4gKlxuICogSW1wb3J0YW50ISBUaGUgbmFtZXMgb2YgdGhlc2UgaWRlbnRpZmllcnMgbWF0dGVyIGJlY2F1c2UgdGhlIHN0cmluZyBmb3Jtc1xuICogYXJlIHVzZWQgZm9yIHJldmVyc2UgbG9va3VwcyBmcm9tIHRoZSB3ZWJjaGFubmVsIHN0cmVhbS4gRG8gTk9UIGNoYW5nZSB0aGVcbiAqIG5hbWVzIG9mIHRoZXNlIGlkZW50aWZpZXJzIG9yIGNoYW5nZSB0aGlzIGludG8gYSBjb25zdCBlbnVtLlxuICovIHZhciBQbiwgVm47XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGVycm9yIGNvZGUgcmVwcmVzZW50cyBhIHBlcm1hbmVudCBlcnJvciB3aGVuIHJlY2VpdmVkXG4gKiBpbiByZXNwb25zZSB0byBhIG5vbi13cml0ZSBvcGVyYXRpb24uXG4gKlxuICogU2VlIGlzUGVybWFuZW50V3JpdGVFcnJvciBmb3IgY2xhc3NpZnlpbmcgd3JpdGUgZXJyb3JzLlxuICovXG5mdW5jdGlvbiB2bih0KSB7XG4gICAgc3dpdGNoICh0KSB7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gTCgpO1xuXG4gICAgICBjYXNlIEcuQ0FOQ0VMTEVEOlxuICAgICAgY2FzZSBHLlVOS05PV046XG4gICAgICBjYXNlIEcuREVBRExJTkVfRVhDRUVERUQ6XG4gICAgICBjYXNlIEcuUkVTT1VSQ0VfRVhIQVVTVEVEOlxuICAgICAgY2FzZSBHLklOVEVSTkFMOlxuICAgICAgY2FzZSBHLlVOQVZBSUxBQkxFOlxuIC8vIFVuYXV0aGVudGljYXRlZCBtZWFucyBzb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIG91ciB0b2tlbiBhbmQgd2UgbmVlZFxuICAgICAgICAvLyB0byByZXRyeSB3aXRoIG5ldyBjcmVkZW50aWFscyB3aGljaCB3aWxsIGhhcHBlbiBhdXRvbWF0aWNhbGx5LlxuICAgICAgICAgICAgICBjYXNlIEcuVU5BVVRIRU5USUNBVEVEOlxuICAgICAgICByZXR1cm4gITE7XG5cbiAgICAgIGNhc2UgRy5JTlZBTElEX0FSR1VNRU5UOlxuICAgICAgY2FzZSBHLk5PVF9GT1VORDpcbiAgICAgIGNhc2UgRy5BTFJFQURZX0VYSVNUUzpcbiAgICAgIGNhc2UgRy5QRVJNSVNTSU9OX0RFTklFRDpcbiAgICAgIGNhc2UgRy5GQUlMRURfUFJFQ09ORElUSU9OOlxuIC8vIEFib3J0ZWQgbWlnaHQgYmUgcmV0cmllZCBpbiBzb21lIHNjZW5hcmlvcywgYnV0IHRoYXQgaXMgZGVwZW5kYW50IG9uXG4gICAgICAgIC8vIHRoZSBjb250ZXh0IGFuZCBzaG91bGQgaGFuZGxlZCBpbmRpdmlkdWFsbHkgYnkgdGhlIGNhbGxpbmcgY29kZS5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS9hcGlzL2Rlc2lnbi9lcnJvcnMuXG4gICAgICAgICAgICAgIGNhc2UgRy5BQk9SVEVEOlxuICAgICAgY2FzZSBHLk9VVF9PRl9SQU5HRTpcbiAgICAgIGNhc2UgRy5VTklNUExFTUVOVEVEOlxuICAgICAgY2FzZSBHLkRBVEFfTE9TUzpcbiAgICAgICAgcmV0dXJuICEwO1xuICAgIH1cbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gZXJyb3IgY29kZSByZXByZXNlbnRzIGEgcGVybWFuZW50IGVycm9yIHdoZW4gcmVjZWl2ZWRcbiAqIGluIHJlc3BvbnNlIHRvIGEgd3JpdGUgb3BlcmF0aW9uLlxuICpcbiAqIFdyaXRlIG9wZXJhdGlvbnMgbXVzdCBiZSBoYW5kbGVkIHNwZWNpYWxseSBiZWNhdXNlIGFzIG9mIGIvMTE5NDM3NzY0LCBBQk9SVEVEXG4gKiBlcnJvcnMgb24gdGhlIHdyaXRlIHN0cmVhbSBzaG91bGQgYmUgcmV0cmllZCB0b28gKGV2ZW4gdGhvdWdoIEFCT1JURUQgZXJyb3JzXG4gKiBhcmUgbm90IGdlbmVyYWxseSByZXRyeWFibGUpLlxuICpcbiAqIE5vdGUgdGhhdCBkdXJpbmcgdGhlIGluaXRpYWwgaGFuZHNoYWtlIG9uIHRoZSB3cml0ZSBzdHJlYW0gYW4gQUJPUlRFRCBlcnJvclxuICogc2lnbmFscyB0aGF0IHdlIHNob3VsZCBkaXNjYXJkIG91ciBzdHJlYW0gdG9rZW4gKGkuZS4gaXQgaXMgcGVybWFuZW50KS4gVGhpc1xuICogbWVhbnMgYSBoYW5kc2hha2UgZXJyb3Igc2hvdWxkIGJlIGNsYXNzaWZpZWQgd2l0aCBpc1Blcm1hbmVudEVycm9yLCBhYm92ZS5cbiAqL1xuLyoqXG4gKiBNYXBzIGFuIGVycm9yIENvZGUgZnJvbSBHUlBDIHN0YXR1cyBjb2RlIG51bWJlciwgbGlrZSAwLCAxLCBvciAxNC4gVGhlc2VcbiAqIGFyZSBub3QgdGhlIHNhbWUgYXMgSFRUUCBzdGF0dXMgY29kZXMuXG4gKlxuICogQHJldHVybnMgVGhlIENvZGUgZXF1aXZhbGVudCB0byB0aGUgZ2l2ZW4gR1JQQyBzdGF0dXMgY29kZS4gRmFpbHMgaWYgdGhlcmVcbiAqICAgICBpcyBubyBtYXRjaC5cbiAqL1xuZnVuY3Rpb24gU24odCkge1xuICAgIGlmICh2b2lkIDAgPT09IHQpIFxuICAgIC8vIFRoaXMgc2hvdWxkbid0IG5vcm1hbGx5IGhhcHBlbiwgYnV0IGluIGNlcnRhaW4gZXJyb3IgY2FzZXMgKGxpa2UgdHJ5aW5nXG4gICAgLy8gdG8gc2VuZCBpbnZhbGlkIHByb3RvIG1lc3NhZ2VzKSB3ZSBtYXkgZ2V0IGFuIGVycm9yIHdpdGggbm8gR1JQQyBjb2RlLlxuICAgIHJldHVybiAkKFwiR1JQQyBlcnJvciBoYXMgbm8gLmNvZGVcIiksIEcuVU5LTk9XTjtcbiAgICBzd2l0Y2ggKHQpIHtcbiAgICAgIGNhc2UgUG4uT0s6XG4gICAgICAgIHJldHVybiBHLk9LO1xuXG4gICAgICBjYXNlIFBuLkNBTkNFTExFRDpcbiAgICAgICAgcmV0dXJuIEcuQ0FOQ0VMTEVEO1xuXG4gICAgICBjYXNlIFBuLlVOS05PV046XG4gICAgICAgIHJldHVybiBHLlVOS05PV047XG5cbiAgICAgIGNhc2UgUG4uREVBRExJTkVfRVhDRUVERUQ6XG4gICAgICAgIHJldHVybiBHLkRFQURMSU5FX0VYQ0VFREVEO1xuXG4gICAgICBjYXNlIFBuLlJFU09VUkNFX0VYSEFVU1RFRDpcbiAgICAgICAgcmV0dXJuIEcuUkVTT1VSQ0VfRVhIQVVTVEVEO1xuXG4gICAgICBjYXNlIFBuLklOVEVSTkFMOlxuICAgICAgICByZXR1cm4gRy5JTlRFUk5BTDtcblxuICAgICAgY2FzZSBQbi5VTkFWQUlMQUJMRTpcbiAgICAgICAgcmV0dXJuIEcuVU5BVkFJTEFCTEU7XG5cbiAgICAgIGNhc2UgUG4uVU5BVVRIRU5USUNBVEVEOlxuICAgICAgICByZXR1cm4gRy5VTkFVVEhFTlRJQ0FURUQ7XG5cbiAgICAgIGNhc2UgUG4uSU5WQUxJRF9BUkdVTUVOVDpcbiAgICAgICAgcmV0dXJuIEcuSU5WQUxJRF9BUkdVTUVOVDtcblxuICAgICAgY2FzZSBQbi5OT1RfRk9VTkQ6XG4gICAgICAgIHJldHVybiBHLk5PVF9GT1VORDtcblxuICAgICAgY2FzZSBQbi5BTFJFQURZX0VYSVNUUzpcbiAgICAgICAgcmV0dXJuIEcuQUxSRUFEWV9FWElTVFM7XG5cbiAgICAgIGNhc2UgUG4uUEVSTUlTU0lPTl9ERU5JRUQ6XG4gICAgICAgIHJldHVybiBHLlBFUk1JU1NJT05fREVOSUVEO1xuXG4gICAgICBjYXNlIFBuLkZBSUxFRF9QUkVDT05ESVRJT046XG4gICAgICAgIHJldHVybiBHLkZBSUxFRF9QUkVDT05ESVRJT047XG5cbiAgICAgIGNhc2UgUG4uQUJPUlRFRDpcbiAgICAgICAgcmV0dXJuIEcuQUJPUlRFRDtcblxuICAgICAgY2FzZSBQbi5PVVRfT0ZfUkFOR0U6XG4gICAgICAgIHJldHVybiBHLk9VVF9PRl9SQU5HRTtcblxuICAgICAgY2FzZSBQbi5VTklNUExFTUVOVEVEOlxuICAgICAgICByZXR1cm4gRy5VTklNUExFTUVOVEVEO1xuXG4gICAgICBjYXNlIFBuLkRBVEFfTE9TUzpcbiAgICAgICAgcmV0dXJuIEcuREFUQV9MT1NTO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gTCgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBIVFRQIHJlc3BvbnNlJ3MgZXJyb3Igc3RhdHVzIHRvIHRoZSBlcXVpdmFsZW50IGVycm9yIGNvZGUuXG4gKlxuICogQHBhcmFtIHN0YXR1cyAtIEFuIEhUVFAgZXJyb3IgcmVzcG9uc2Ugc3RhdHVzIChcIkZBSUxFRF9QUkVDT05ESVRJT05cIixcbiAqIFwiVU5LTk9XTlwiLCBldGMuKVxuICogQHJldHVybnMgVGhlIGVxdWl2YWxlbnQgQ29kZS4gTm9uLW1hdGNoaW5nIHJlc3BvbnNlcyBhcmUgbWFwcGVkIHRvXG4gKiAgICAgQ29kZS5VTktOT1dOLlxuICovIChWbiA9IFBuIHx8IChQbiA9IHt9KSlbVm4uT0sgPSAwXSA9IFwiT0tcIiwgVm5bVm4uQ0FOQ0VMTEVEID0gMV0gPSBcIkNBTkNFTExFRFwiLCBcblZuW1ZuLlVOS05PV04gPSAyXSA9IFwiVU5LTk9XTlwiLCBWbltWbi5JTlZBTElEX0FSR1VNRU5UID0gM10gPSBcIklOVkFMSURfQVJHVU1FTlRcIiwgXG5WbltWbi5ERUFETElORV9FWENFRURFRCA9IDRdID0gXCJERUFETElORV9FWENFRURFRFwiLCBWbltWbi5OT1RfRk9VTkQgPSA1XSA9IFwiTk9UX0ZPVU5EXCIsIFxuVm5bVm4uQUxSRUFEWV9FWElTVFMgPSA2XSA9IFwiQUxSRUFEWV9FWElTVFNcIiwgVm5bVm4uUEVSTUlTU0lPTl9ERU5JRUQgPSA3XSA9IFwiUEVSTUlTU0lPTl9ERU5JRURcIiwgXG5WbltWbi5VTkFVVEhFTlRJQ0FURUQgPSAxNl0gPSBcIlVOQVVUSEVOVElDQVRFRFwiLCBWbltWbi5SRVNPVVJDRV9FWEhBVVNURUQgPSA4XSA9IFwiUkVTT1VSQ0VfRVhIQVVTVEVEXCIsIFxuVm5bVm4uRkFJTEVEX1BSRUNPTkRJVElPTiA9IDldID0gXCJGQUlMRURfUFJFQ09ORElUSU9OXCIsIFZuW1ZuLkFCT1JURUQgPSAxMF0gPSBcIkFCT1JURURcIiwgXG5WbltWbi5PVVRfT0ZfUkFOR0UgPSAxMV0gPSBcIk9VVF9PRl9SQU5HRVwiLCBWbltWbi5VTklNUExFTUVOVEVEID0gMTJdID0gXCJVTklNUExFTUVOVEVEXCIsIFxuVm5bVm4uSU5URVJOQUwgPSAxM10gPSBcIklOVEVSTkFMXCIsIFZuW1ZuLlVOQVZBSUxBQkxFID0gMTRdID0gXCJVTkFWQUlMQUJMRVwiLCBWbltWbi5EQVRBX0xPU1MgPSAxNV0gPSBcIkRBVEFfTE9TU1wiO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIG1hcCBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgb2JqZWN0cyBhcyBrZXlzLiBPYmplY3RzIG11c3QgaGF2ZSBhblxuICogYXNzb2NpYXRlZCBlcXVhbHMgZnVuY3Rpb24gYW5kIG11c3QgYmUgaW1tdXRhYmxlLiBFbnRyaWVzIGluIHRoZSBtYXAgYXJlXG4gKiBzdG9yZWQgdG9nZXRoZXIgd2l0aCB0aGUga2V5IGJlaW5nIHByb2R1Y2VkIGZyb20gdGhlIG1hcEtleUZuLiBUaGlzIG1hcFxuICogYXV0b21hdGljYWxseSBoYW5kbGVzIGNvbGxpc2lvbnMgb2Yga2V5cy5cbiAqL1xuY2xhc3MgRG4ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5tYXBLZXlGbiA9IHQsIHRoaXMuZXF1YWxzRm4gPSBlLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBpbm5lciBtYXAgZm9yIGEga2V5L3ZhbHVlIHBhaXIuIER1ZSB0byB0aGUgcG9zc2liaWxpdHkgb2YgY29sbGlzaW9ucyB3ZVxuICAgICAgICAgKiBrZWVwIGEgbGlzdCBvZiBlbnRyaWVzIHRoYXQgd2UgZG8gYSBsaW5lYXIgc2VhcmNoIHRocm91Z2ggdG8gZmluZCBhbiBhY3R1YWxcbiAgICAgICAgICogbWF0Y2guIE5vdGUgdGhhdCBjb2xsaXNpb25zIHNob3VsZCBiZSByYXJlLCBzbyB3ZSBzdGlsbCBleHBlY3QgbmVhclxuICAgICAgICAgKiBjb25zdGFudCB0aW1lIGxvb2t1cHMgaW4gcHJhY3RpY2UuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlubmVyID0ge30sIFxuICAgICAgICAvKiogVGhlIG51bWJlciBvZiBlbnRyaWVzIHN0b3JlZCBpbiB0aGUgbWFwICovXG4gICAgICAgIHRoaXMuaW5uZXJTaXplID0gMDtcbiAgICB9XG4gICAgLyoqIEdldCBhIHZhbHVlIGZvciB0aGlzIGtleSwgb3IgdW5kZWZpbmVkIGlmIGl0IGRvZXMgbm90IGV4aXN0LiAqLyAgICBnZXQodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5tYXBLZXlGbih0KSwgbiA9IHRoaXMuaW5uZXJbZV07XG4gICAgICAgIGlmICh2b2lkIDAgIT09IG4pIGZvciAoY29uc3QgW2UsIHNdIG9mIG4pIGlmICh0aGlzLmVxdWFsc0ZuKGUsIHQpKSByZXR1cm4gcztcbiAgICB9XG4gICAgaGFzKHQpIHtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gdGhpcy5nZXQodCk7XG4gICAgfVxuICAgIC8qKiBQdXQgdGhpcyBrZXkgYW5kIHZhbHVlIGluIHRoZSBtYXAuICovICAgIHNldCh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLm1hcEtleUZuKHQpLCBzID0gdGhpcy5pbm5lcltuXTtcbiAgICAgICAgaWYgKHZvaWQgMCA9PT0gcykgcmV0dXJuIHRoaXMuaW5uZXJbbl0gPSBbIFsgdCwgZSBdIF0sIHZvaWQgdGhpcy5pbm5lclNpemUrKztcbiAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBzLmxlbmd0aDsgbisrKSBpZiAodGhpcy5lcXVhbHNGbihzW25dWzBdLCB0KSkgXG4gICAgICAgIC8vIFRoaXMgaXMgdXBkYXRpbmcgYW4gZXhpc3RpbmcgZW50cnkgYW5kIGRvZXMgbm90IGluY3JlYXNlIGBpbm5lclNpemVgLlxuICAgICAgICByZXR1cm4gdm9pZCAoc1tuXSA9IFsgdCwgZSBdKTtcbiAgICAgICAgcy5wdXNoKFsgdCwgZSBdKSwgdGhpcy5pbm5lclNpemUrKztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHRoaXMga2V5IGZyb20gdGhlIG1hcC4gUmV0dXJucyBhIGJvb2xlYW4gaWYgYW55dGhpbmcgd2FzIGRlbGV0ZWQuXG4gICAgICovICAgIGRlbGV0ZSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLm1hcEtleUZuKHQpLCBuID0gdGhpcy5pbm5lcltlXTtcbiAgICAgICAgaWYgKHZvaWQgMCA9PT0gbikgcmV0dXJuICExO1xuICAgICAgICBmb3IgKGxldCBzID0gMDsgcyA8IG4ubGVuZ3RoOyBzKyspIGlmICh0aGlzLmVxdWFsc0ZuKG5bc11bMF0sIHQpKSByZXR1cm4gMSA9PT0gbi5sZW5ndGggPyBkZWxldGUgdGhpcy5pbm5lcltlXSA6IG4uc3BsaWNlKHMsIDEpLCBcbiAgICAgICAgdGhpcy5pbm5lclNpemUtLSwgITA7XG4gICAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgZm9yRWFjaCh0KSB7XG4gICAgICAgIGx0KHRoaXMuaW5uZXIsICgoZSwgbikgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbZSwgc10gb2YgbikgdChlLCBzKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gZnQodGhpcy5pbm5lcik7XG4gICAgfVxuICAgIHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlubmVyU2l6ZTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vLyBBbiBpbW11dGFibGUgc29ydGVkIG1hcCBpbXBsZW1lbnRhdGlvbiwgYmFzZWQgb24gYSBMZWZ0LWxlYW5pbmcgUmVkLUJsYWNrXG4vLyB0cmVlLlxuY2xhc3MgQ24ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5jb21wYXJhdG9yID0gdCwgdGhpcy5yb290ID0gZSB8fCBObi5FTVBUWTtcbiAgICB9XG4gICAgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIG1hcCwgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS92YWx1ZSBhZGRlZCBvciByZXBsYWNlZC5cbiAgICBpbnNlcnQodCwgZSkge1xuICAgICAgICByZXR1cm4gbmV3IENuKHRoaXMuY29tcGFyYXRvciwgdGhpcy5yb290Lmluc2VydCh0LCBlLCB0aGlzLmNvbXBhcmF0b3IpLmNvcHkobnVsbCwgbnVsbCwgTm4uQkxBQ0ssIG51bGwsIG51bGwpKTtcbiAgICB9XG4gICAgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIG1hcCwgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSByZW1vdmVkLlxuICAgIHJlbW92ZSh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgQ24odGhpcy5jb21wYXJhdG9yLCB0aGlzLnJvb3QucmVtb3ZlKHQsIHRoaXMuY29tcGFyYXRvcikuY29weShudWxsLCBudWxsLCBObi5CTEFDSywgbnVsbCwgbnVsbCkpO1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgbm9kZSB3aXRoIHRoZSBnaXZlbiBrZXksIG9yIG51bGwuXG4gICAgZ2V0KHQpIHtcbiAgICAgICAgbGV0IGUgPSB0aGlzLnJvb3Q7XG4gICAgICAgIGZvciAoOyFlLmlzRW1wdHkoKTsgKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdGhpcy5jb21wYXJhdG9yKHQsIGUua2V5KTtcbiAgICAgICAgICAgIGlmICgwID09PSBuKSByZXR1cm4gZS52YWx1ZTtcbiAgICAgICAgICAgIG4gPCAwID8gZSA9IGUubGVmdCA6IG4gPiAwICYmIChlID0gZS5yaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IGluIHRoaXMgc29ydGVkIG1hcCwgb3IgLTEgaWYgaXQgZG9lc24ndFxuICAgIC8vIGV4aXN0LlxuICAgIGluZGV4T2YodCkge1xuICAgICAgICAvLyBOdW1iZXIgb2Ygbm9kZXMgdGhhdCB3ZXJlIHBydW5lZCB3aGVuIGRlc2NlbmRpbmcgcmlnaHRcbiAgICAgICAgbGV0IGUgPSAwLCBuID0gdGhpcy5yb290O1xuICAgICAgICBmb3IgKDshbi5pc0VtcHR5KCk7ICkge1xuICAgICAgICAgICAgY29uc3QgcyA9IHRoaXMuY29tcGFyYXRvcih0LCBuLmtleSk7XG4gICAgICAgICAgICBpZiAoMCA9PT0gcykgcmV0dXJuIGUgKyBuLmxlZnQuc2l6ZTtcbiAgICAgICAgICAgIHMgPCAwID8gbiA9IG4ubGVmdCA6IChcbiAgICAgICAgICAgIC8vIENvdW50IGFsbCBub2RlcyBsZWZ0IG9mIHRoZSBub2RlIHBsdXMgdGhlIG5vZGUgaXRzZWxmXG4gICAgICAgICAgICBlICs9IG4ubGVmdC5zaXplICsgMSwgbiA9IG4ucmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vZGUgbm90IGZvdW5kXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb290LmlzRW1wdHkoKTtcbiAgICB9XG4gICAgLy8gUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBtYXAuXG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvb3Quc2l6ZTtcbiAgICB9XG4gICAgLy8gUmV0dXJucyB0aGUgbWluaW11bSBrZXkgaW4gdGhlIG1hcC5cbiAgICBtaW5LZXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvb3QubWluS2V5KCk7XG4gICAgfVxuICAgIC8vIFJldHVybnMgdGhlIG1heGltdW0ga2V5IGluIHRoZSBtYXAuXG4gICAgbWF4S2V5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb290Lm1heEtleSgpO1xuICAgIH1cbiAgICAvLyBUcmF2ZXJzZXMgdGhlIG1hcCBpbiBrZXkgb3JkZXIgYW5kIGNhbGxzIHRoZSBzcGVjaWZpZWQgYWN0aW9uIGZ1bmN0aW9uXG4gICAgLy8gZm9yIGVhY2gga2V5L3ZhbHVlIHBhaXIuIElmIGFjdGlvbiByZXR1cm5zIHRydWUsIHRyYXZlcnNhbCBpcyBhYm9ydGVkLlxuICAgIC8vIFJldHVybnMgdGhlIGZpcnN0IHRydXRoeSB2YWx1ZSByZXR1cm5lZCBieSBhY3Rpb24sIG9yIHRoZSBsYXN0IGZhbHNleVxuICAgIC8vIHZhbHVlIHJldHVybmVkIGJ5IGFjdGlvbi5cbiAgICBpbm9yZGVyVHJhdmVyc2FsKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5pbm9yZGVyVHJhdmVyc2FsKHQpO1xuICAgIH1cbiAgICBmb3JFYWNoKHQpIHtcbiAgICAgICAgdGhpcy5pbm9yZGVyVHJhdmVyc2FsKCgoZSwgbikgPT4gKHQoZSwgbiksICExKSkpO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgY29uc3QgdCA9IFtdO1xuICAgICAgICByZXR1cm4gdGhpcy5pbm9yZGVyVHJhdmVyc2FsKCgoZSwgbikgPT4gKHQucHVzaChgJHtlfToke259YCksICExKSkpLCBgeyR7dC5qb2luKFwiLCBcIil9fWA7XG4gICAgfVxuICAgIC8vIFRyYXZlcnNlcyB0aGUgbWFwIGluIHJldmVyc2Uga2V5IG9yZGVyIGFuZCBjYWxscyB0aGUgc3BlY2lmaWVkIGFjdGlvblxuICAgIC8vIGZ1bmN0aW9uIGZvciBlYWNoIGtleS92YWx1ZSBwYWlyLiBJZiBhY3Rpb24gcmV0dXJucyB0cnVlLCB0cmF2ZXJzYWwgaXNcbiAgICAvLyBhYm9ydGVkLlxuICAgIC8vIFJldHVybnMgdGhlIGZpcnN0IHRydXRoeSB2YWx1ZSByZXR1cm5lZCBieSBhY3Rpb24sIG9yIHRoZSBsYXN0IGZhbHNleVxuICAgIC8vIHZhbHVlIHJldHVybmVkIGJ5IGFjdGlvbi5cbiAgICByZXZlcnNlVHJhdmVyc2FsKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5yZXZlcnNlVHJhdmVyc2FsKHQpO1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIFNvcnRlZE1hcC5cbiAgICBnZXRJdGVyYXRvcigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB4bih0aGlzLnJvb3QsIG51bGwsIHRoaXMuY29tcGFyYXRvciwgITEpO1xuICAgIH1cbiAgICBnZXRJdGVyYXRvckZyb20odCkge1xuICAgICAgICByZXR1cm4gbmV3IHhuKHRoaXMucm9vdCwgdCwgdGhpcy5jb21wYXJhdG9yLCAhMSk7XG4gICAgfVxuICAgIGdldFJldmVyc2VJdGVyYXRvcigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB4bih0aGlzLnJvb3QsIG51bGwsIHRoaXMuY29tcGFyYXRvciwgITApO1xuICAgIH1cbiAgICBnZXRSZXZlcnNlSXRlcmF0b3JGcm9tKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB4bih0aGlzLnJvb3QsIHQsIHRoaXMuY29tcGFyYXRvciwgITApO1xuICAgIH1cbn1cblxuIC8vIGVuZCBTb3J0ZWRNYXBcbi8vIEFuIGl0ZXJhdG9yIG92ZXIgYW4gTExSQk5vZGUuXG5jbGFzcyB4biB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgcykge1xuICAgICAgICB0aGlzLmlzUmV2ZXJzZSA9IHMsIHRoaXMubm9kZVN0YWNrID0gW107XG4gICAgICAgIGxldCBpID0gMTtcbiAgICAgICAgZm9yICg7IXQuaXNFbXB0eSgpOyApIGlmIChpID0gZSA/IG4odC5rZXksIGUpIDogMSwgXG4gICAgICAgIC8vIGZsaXAgdGhlIGNvbXBhcmlzb24gaWYgd2UncmUgZ29pbmcgaW4gcmV2ZXJzZVxuICAgICAgICBlICYmIHMgJiYgKGkgKj0gLTEpLCBpIDwgMCkgXG4gICAgICAgIC8vIFRoaXMgbm9kZSBpcyBsZXNzIHRoYW4gb3VyIHN0YXJ0IGtleS4gaWdub3JlIGl0XG4gICAgICAgIHQgPSB0aGlzLmlzUmV2ZXJzZSA/IHQubGVmdCA6IHQucmlnaHQ7IGVsc2Uge1xuICAgICAgICAgICAgaWYgKDAgPT09IGkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIG5vZGUgaXMgZXhhY3RseSBlcXVhbCB0byBvdXIgc3RhcnQga2V5LiBQdXNoIGl0IG9uIHRoZSBzdGFjayxcbiAgICAgICAgICAgICAgICAvLyBidXQgc3RvcCBpdGVyYXRpbmc7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlU3RhY2sucHVzaCh0KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoaXMgbm9kZSBpcyBncmVhdGVyIHRoYW4gb3VyIHN0YXJ0IGtleSwgYWRkIGl0IHRvIHRoZSBzdGFjayBhbmQgbW92ZVxuICAgICAgICAgICAgLy8gdG8gdGhlIG5leHQgb25lXG4gICAgICAgICAgICB0aGlzLm5vZGVTdGFjay5wdXNoKHQpLCB0ID0gdGhpcy5pc1JldmVyc2UgPyB0LnJpZ2h0IDogdC5sZWZ0O1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldE5leHQoKSB7XG4gICAgICAgIGxldCB0ID0gdGhpcy5ub2RlU3RhY2sucG9wKCk7XG4gICAgICAgIGNvbnN0IGUgPSB7XG4gICAgICAgICAgICBrZXk6IHQua2V5LFxuICAgICAgICAgICAgdmFsdWU6IHQudmFsdWVcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuaXNSZXZlcnNlKSBmb3IgKHQgPSB0LmxlZnQ7ICF0LmlzRW1wdHkoKTsgKSB0aGlzLm5vZGVTdGFjay5wdXNoKHQpLCB0ID0gdC5yaWdodDsgZWxzZSBmb3IgKHQgPSB0LnJpZ2h0OyAhdC5pc0VtcHR5KCk7ICkgdGhpcy5ub2RlU3RhY2sucHVzaCh0KSwgXG4gICAgICAgIHQgPSB0LmxlZnQ7XG4gICAgICAgIHJldHVybiBlO1xuICAgIH1cbiAgICBoYXNOZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlU3RhY2subGVuZ3RoID4gMDtcbiAgICB9XG4gICAgcGVlaygpIHtcbiAgICAgICAgaWYgKDAgPT09IHRoaXMubm9kZVN0YWNrLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IHQgPSB0aGlzLm5vZGVTdGFja1t0aGlzLm5vZGVTdGFjay5sZW5ndGggLSAxXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtleTogdC5rZXksXG4gICAgICAgICAgICB2YWx1ZTogdC52YWx1ZVxuICAgICAgICB9O1xuICAgIH1cbn1cblxuIC8vIGVuZCBTb3J0ZWRNYXBJdGVyYXRvclxuLy8gUmVwcmVzZW50cyBhIG5vZGUgaW4gYSBMZWZ0LWxlYW5pbmcgUmVkLUJsYWNrIHRyZWUuXG5jbGFzcyBObiB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgcywgaSkge1xuICAgICAgICB0aGlzLmtleSA9IHQsIHRoaXMudmFsdWUgPSBlLCB0aGlzLmNvbG9yID0gbnVsbCAhPSBuID8gbiA6IE5uLlJFRCwgdGhpcy5sZWZ0ID0gbnVsbCAhPSBzID8gcyA6IE5uLkVNUFRZLCBcbiAgICAgICAgdGhpcy5yaWdodCA9IG51bGwgIT0gaSA/IGkgOiBObi5FTVBUWSwgdGhpcy5zaXplID0gdGhpcy5sZWZ0LnNpemUgKyAxICsgdGhpcy5yaWdodC5zaXplO1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgY3VycmVudCBub2RlLCBvcHRpb25hbGx5IHJlcGxhY2luZyBwaWVjZXMgb2YgaXQuXG4gICAgY29weSh0LCBlLCBuLCBzLCBpKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm4obnVsbCAhPSB0ID8gdCA6IHRoaXMua2V5LCBudWxsICE9IGUgPyBlIDogdGhpcy52YWx1ZSwgbnVsbCAhPSBuID8gbiA6IHRoaXMuY29sb3IsIG51bGwgIT0gcyA/IHMgOiB0aGlzLmxlZnQsIG51bGwgIT0gaSA/IGkgOiB0aGlzLnJpZ2h0KTtcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgICAvLyBUcmF2ZXJzZXMgdGhlIHRyZWUgaW4ga2V5IG9yZGVyIGFuZCBjYWxscyB0aGUgc3BlY2lmaWVkIGFjdGlvbiBmdW5jdGlvblxuICAgIC8vIGZvciBlYWNoIG5vZGUuIElmIGFjdGlvbiByZXR1cm5zIHRydWUsIHRyYXZlcnNhbCBpcyBhYm9ydGVkLlxuICAgIC8vIFJldHVybnMgdGhlIGZpcnN0IHRydXRoeSB2YWx1ZSByZXR1cm5lZCBieSBhY3Rpb24sIG9yIHRoZSBsYXN0IGZhbHNleVxuICAgIC8vIHZhbHVlIHJldHVybmVkIGJ5IGFjdGlvbi5cbiAgICBpbm9yZGVyVHJhdmVyc2FsKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVmdC5pbm9yZGVyVHJhdmVyc2FsKHQpIHx8IHQodGhpcy5rZXksIHRoaXMudmFsdWUpIHx8IHRoaXMucmlnaHQuaW5vcmRlclRyYXZlcnNhbCh0KTtcbiAgICB9XG4gICAgLy8gVHJhdmVyc2VzIHRoZSB0cmVlIGluIHJldmVyc2Uga2V5IG9yZGVyIGFuZCBjYWxscyB0aGUgc3BlY2lmaWVkIGFjdGlvblxuICAgIC8vIGZ1bmN0aW9uIGZvciBlYWNoIG5vZGUuIElmIGFjdGlvbiByZXR1cm5zIHRydWUsIHRyYXZlcnNhbCBpcyBhYm9ydGVkLlxuICAgIC8vIFJldHVybnMgdGhlIGZpcnN0IHRydXRoeSB2YWx1ZSByZXR1cm5lZCBieSBhY3Rpb24sIG9yIHRoZSBsYXN0IGZhbHNleVxuICAgIC8vIHZhbHVlIHJldHVybmVkIGJ5IGFjdGlvbi5cbiAgICByZXZlcnNlVHJhdmVyc2FsKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmlnaHQucmV2ZXJzZVRyYXZlcnNhbCh0KSB8fCB0KHRoaXMua2V5LCB0aGlzLnZhbHVlKSB8fCB0aGlzLmxlZnQucmV2ZXJzZVRyYXZlcnNhbCh0KTtcbiAgICB9XG4gICAgLy8gUmV0dXJucyB0aGUgbWluaW11bSBub2RlIGluIHRoZSB0cmVlLlxuICAgIG1pbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVmdC5pc0VtcHR5KCkgPyB0aGlzIDogdGhpcy5sZWZ0Lm1pbigpO1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIHRoZSBtYXhpbXVtIGtleSBpbiB0aGUgdHJlZS5cbiAgICBtaW5LZXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbigpLmtleTtcbiAgICB9XG4gICAgLy8gUmV0dXJucyB0aGUgbWF4aW11bSBrZXkgaW4gdGhlIHRyZWUuXG4gICAgbWF4S2V5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yaWdodC5pc0VtcHR5KCkgPyB0aGlzLmtleSA6IHRoaXMucmlnaHQubWF4S2V5KCk7XG4gICAgfVxuICAgIC8vIFJldHVybnMgbmV3IHRyZWUsIHdpdGggdGhlIGtleS92YWx1ZSBhZGRlZC5cbiAgICBpbnNlcnQodCwgZSwgbikge1xuICAgICAgICBsZXQgcyA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGkgPSBuKHQsIHMua2V5KTtcbiAgICAgICAgcmV0dXJuIHMgPSBpIDwgMCA/IHMuY29weShudWxsLCBudWxsLCBudWxsLCBzLmxlZnQuaW5zZXJ0KHQsIGUsIG4pLCBudWxsKSA6IDAgPT09IGkgPyBzLmNvcHkobnVsbCwgZSwgbnVsbCwgbnVsbCwgbnVsbCkgOiBzLmNvcHkobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgcy5yaWdodC5pbnNlcnQodCwgZSwgbikpLCBcbiAgICAgICAgcy5maXhVcCgpO1xuICAgIH1cbiAgICByZW1vdmVNaW4oKSB7XG4gICAgICAgIGlmICh0aGlzLmxlZnQuaXNFbXB0eSgpKSByZXR1cm4gTm4uRU1QVFk7XG4gICAgICAgIGxldCB0ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHQubGVmdC5pc1JlZCgpIHx8IHQubGVmdC5sZWZ0LmlzUmVkKCkgfHwgKHQgPSB0Lm1vdmVSZWRMZWZ0KCkpLCB0ID0gdC5jb3B5KG51bGwsIG51bGwsIG51bGwsIHQubGVmdC5yZW1vdmVNaW4oKSwgbnVsbCksIFxuICAgICAgICB0LmZpeFVwKCk7XG4gICAgfVxuICAgIC8vIFJldHVybnMgbmV3IHRyZWUsIHdpdGggdGhlIHNwZWNpZmllZCBpdGVtIHJlbW92ZWQuXG4gICAgcmVtb3ZlKHQsIGUpIHtcbiAgICAgICAgbGV0IG4sIHMgPSB0aGlzO1xuICAgICAgICBpZiAoZSh0LCBzLmtleSkgPCAwKSBzLmxlZnQuaXNFbXB0eSgpIHx8IHMubGVmdC5pc1JlZCgpIHx8IHMubGVmdC5sZWZ0LmlzUmVkKCkgfHwgKHMgPSBzLm1vdmVSZWRMZWZ0KCkpLCBcbiAgICAgICAgcyA9IHMuY29weShudWxsLCBudWxsLCBudWxsLCBzLmxlZnQucmVtb3ZlKHQsIGUpLCBudWxsKTsgZWxzZSB7XG4gICAgICAgICAgICBpZiAocy5sZWZ0LmlzUmVkKCkgJiYgKHMgPSBzLnJvdGF0ZVJpZ2h0KCkpLCBzLnJpZ2h0LmlzRW1wdHkoKSB8fCBzLnJpZ2h0LmlzUmVkKCkgfHwgcy5yaWdodC5sZWZ0LmlzUmVkKCkgfHwgKHMgPSBzLm1vdmVSZWRSaWdodCgpKSwgXG4gICAgICAgICAgICAwID09PSBlKHQsIHMua2V5KSkge1xuICAgICAgICAgICAgICAgIGlmIChzLnJpZ2h0LmlzRW1wdHkoKSkgcmV0dXJuIE5uLkVNUFRZO1xuICAgICAgICAgICAgICAgIG4gPSBzLnJpZ2h0Lm1pbigpLCBzID0gcy5jb3B5KG4ua2V5LCBuLnZhbHVlLCBudWxsLCBudWxsLCBzLnJpZ2h0LnJlbW92ZU1pbigpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHMgPSBzLmNvcHkobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgcy5yaWdodC5yZW1vdmUodCwgZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzLmZpeFVwKCk7XG4gICAgfVxuICAgIGlzUmVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2xvcjtcbiAgICB9XG4gICAgLy8gUmV0dXJucyBuZXcgdHJlZSBhZnRlciBwZXJmb3JtaW5nIGFueSBuZWVkZWQgcm90YXRpb25zLlxuICAgIGZpeFVwKCkge1xuICAgICAgICBsZXQgdCA9IHRoaXM7XG4gICAgICAgIHJldHVybiB0LnJpZ2h0LmlzUmVkKCkgJiYgIXQubGVmdC5pc1JlZCgpICYmICh0ID0gdC5yb3RhdGVMZWZ0KCkpLCB0LmxlZnQuaXNSZWQoKSAmJiB0LmxlZnQubGVmdC5pc1JlZCgpICYmICh0ID0gdC5yb3RhdGVSaWdodCgpKSwgXG4gICAgICAgIHQubGVmdC5pc1JlZCgpICYmIHQucmlnaHQuaXNSZWQoKSAmJiAodCA9IHQuY29sb3JGbGlwKCkpLCB0O1xuICAgIH1cbiAgICBtb3ZlUmVkTGVmdCgpIHtcbiAgICAgICAgbGV0IHQgPSB0aGlzLmNvbG9yRmxpcCgpO1xuICAgICAgICByZXR1cm4gdC5yaWdodC5sZWZ0LmlzUmVkKCkgJiYgKHQgPSB0LmNvcHkobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgdC5yaWdodC5yb3RhdGVSaWdodCgpKSwgXG4gICAgICAgIHQgPSB0LnJvdGF0ZUxlZnQoKSwgdCA9IHQuY29sb3JGbGlwKCkpLCB0O1xuICAgIH1cbiAgICBtb3ZlUmVkUmlnaHQoKSB7XG4gICAgICAgIGxldCB0ID0gdGhpcy5jb2xvckZsaXAoKTtcbiAgICAgICAgcmV0dXJuIHQubGVmdC5sZWZ0LmlzUmVkKCkgJiYgKHQgPSB0LnJvdGF0ZVJpZ2h0KCksIHQgPSB0LmNvbG9yRmxpcCgpKSwgdDtcbiAgICB9XG4gICAgcm90YXRlTGVmdCgpIHtcbiAgICAgICAgY29uc3QgdCA9IHRoaXMuY29weShudWxsLCBudWxsLCBObi5SRUQsIG51bGwsIHRoaXMucmlnaHQubGVmdCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJpZ2h0LmNvcHkobnVsbCwgbnVsbCwgdGhpcy5jb2xvciwgdCwgbnVsbCk7XG4gICAgfVxuICAgIHJvdGF0ZVJpZ2h0KCkge1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5jb3B5KG51bGwsIG51bGwsIE5uLlJFRCwgdGhpcy5sZWZ0LnJpZ2h0LCBudWxsKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVmdC5jb3B5KG51bGwsIG51bGwsIHRoaXMuY29sb3IsIG51bGwsIHQpO1xuICAgIH1cbiAgICBjb2xvckZsaXAoKSB7XG4gICAgICAgIGNvbnN0IHQgPSB0aGlzLmxlZnQuY29weShudWxsLCBudWxsLCAhdGhpcy5sZWZ0LmNvbG9yLCBudWxsLCBudWxsKSwgZSA9IHRoaXMucmlnaHQuY29weShudWxsLCBudWxsLCAhdGhpcy5yaWdodC5jb2xvciwgbnVsbCwgbnVsbCk7XG4gICAgICAgIHJldHVybiB0aGlzLmNvcHkobnVsbCwgbnVsbCwgIXRoaXMuY29sb3IsIHQsIGUpO1xuICAgIH1cbiAgICAvLyBGb3IgdGVzdGluZy5cbiAgICBjaGVja01heERlcHRoKCkge1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5jaGVjaygpO1xuICAgICAgICByZXR1cm4gTWF0aC5wb3coMiwgdCkgPD0gdGhpcy5zaXplICsgMTtcbiAgICB9XG4gICAgLy8gSW4gYSBiYWxhbmNlZCBSQiB0cmVlLCB0aGUgYmxhY2stZGVwdGggKG51bWJlciBvZiBibGFjayBub2RlcykgZnJvbSByb290IHRvXG4gICAgLy8gbGVhdmVzIGlzIGVxdWFsIG9uIGJvdGggc2lkZXMuICBUaGlzIGZ1bmN0aW9uIHZlcmlmaWVzIHRoYXQgb3IgYXNzZXJ0cy5cbiAgICBjaGVjaygpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNSZWQoKSAmJiB0aGlzLmxlZnQuaXNSZWQoKSkgdGhyb3cgTCgpO1xuICAgICAgICBpZiAodGhpcy5yaWdodC5pc1JlZCgpKSB0aHJvdyBMKCk7XG4gICAgICAgIGNvbnN0IHQgPSB0aGlzLmxlZnQuY2hlY2soKTtcbiAgICAgICAgaWYgKHQgIT09IHRoaXMucmlnaHQuY2hlY2soKSkgdGhyb3cgTCgpO1xuICAgICAgICByZXR1cm4gdCArICh0aGlzLmlzUmVkKCkgPyAwIDogMSk7XG4gICAgfVxufVxuXG4gLy8gZW5kIExMUkJOb2RlXG4vLyBFbXB0eSBub2RlIGlzIHNoYXJlZCBiZXR3ZWVuIGFsbCBMTFJCIHRyZWVzLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbk5uLkVNUFRZID0gbnVsbCwgTm4uUkVEID0gITAsIE5uLkJMQUNLID0gITE7XG5cbi8vIGVuZCBMTFJCRW1wdHlOb2RlXG5Obi5FTVBUWSA9IG5ldyBcbi8vIFJlcHJlc2VudHMgYW4gZW1wdHkgbm9kZSAoYSBsZWFmIG5vZGUgaW4gdGhlIFJlZC1CbGFjayBUcmVlKS5cbmNsYXNzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5zaXplID0gMDtcbiAgICB9XG4gICAgZ2V0IGtleSgpIHtcbiAgICAgICAgdGhyb3cgTCgpO1xuICAgIH1cbiAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIHRocm93IEwoKTtcbiAgICB9XG4gICAgZ2V0IGNvbG9yKCkge1xuICAgICAgICB0aHJvdyBMKCk7XG4gICAgfVxuICAgIGdldCBsZWZ0KCkge1xuICAgICAgICB0aHJvdyBMKCk7XG4gICAgfVxuICAgIGdldCByaWdodCgpIHtcbiAgICAgICAgdGhyb3cgTCgpO1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgY3VycmVudCBub2RlLlxuICAgIGNvcHkodCwgZSwgbiwgcywgaSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIHRyZWUsIHdpdGggdGhlIHNwZWNpZmllZCBrZXkvdmFsdWUgYWRkZWQuXG4gICAgaW5zZXJ0KHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBObih0LCBlKTtcbiAgICB9XG4gICAgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIHRyZWUsIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgcmVtb3ZlZC5cbiAgICByZW1vdmUodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICEwO1xuICAgIH1cbiAgICBpbm9yZGVyVHJhdmVyc2FsKHQpIHtcbiAgICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgICByZXZlcnNlVHJhdmVyc2FsKHQpIHtcbiAgICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgICBtaW5LZXkoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBtYXhLZXkoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpc1JlZCgpIHtcbiAgICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgICAvLyBGb3IgdGVzdGluZy5cbiAgICBjaGVja01heERlcHRoKCkge1xuICAgICAgICByZXR1cm4gITA7XG4gICAgfVxuICAgIGNoZWNrKCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG59O1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBTb3J0ZWRTZXQgaXMgYW4gaW1tdXRhYmxlIChjb3B5LW9uLXdyaXRlKSBjb2xsZWN0aW9uIHRoYXQgaG9sZHMgZWxlbWVudHNcbiAqIGluIG9yZGVyIHNwZWNpZmllZCBieSB0aGUgcHJvdmlkZWQgY29tcGFyYXRvci5cbiAqXG4gKiBOT1RFOiBpZiBwcm92aWRlZCBjb21wYXJhdG9yIHJldHVybnMgMCBmb3IgdHdvIGVsZW1lbnRzLCB3ZSBjb25zaWRlciB0aGVtIHRvXG4gKiBiZSBlcXVhbCFcbiAqL1xuY2xhc3Mga24ge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5jb21wYXJhdG9yID0gdCwgdGhpcy5kYXRhID0gbmV3IENuKHRoaXMuY29tcGFyYXRvcik7XG4gICAgfVxuICAgIGhhcyh0KSB7XG4gICAgICAgIHJldHVybiBudWxsICE9PSB0aGlzLmRhdGEuZ2V0KHQpO1xuICAgIH1cbiAgICBmaXJzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5taW5LZXkoKTtcbiAgICB9XG4gICAgbGFzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5tYXhLZXkoKTtcbiAgICB9XG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuc2l6ZTtcbiAgICB9XG4gICAgaW5kZXhPZih0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuaW5kZXhPZih0KTtcbiAgICB9XG4gICAgLyoqIEl0ZXJhdGVzIGVsZW1lbnRzIGluIG9yZGVyIGRlZmluZWQgYnkgXCJjb21wYXJhdG9yXCIgKi8gICAgZm9yRWFjaCh0KSB7XG4gICAgICAgIHRoaXMuZGF0YS5pbm9yZGVyVHJhdmVyc2FsKCgoZSwgbikgPT4gKHQoZSksICExKSkpO1xuICAgIH1cbiAgICAvKiogSXRlcmF0ZXMgb3ZlciBgZWxlbWBzIHN1Y2ggdGhhdDogcmFuZ2VbMF0gJmx0Oz0gZWxlbSAmbHQ7IHJhbmdlWzFdLiAqLyAgICBmb3JFYWNoSW5SYW5nZSh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLmRhdGEuZ2V0SXRlcmF0b3JGcm9tKHRbMF0pO1xuICAgICAgICBmb3IgKDtuLmhhc05leHQoKTsgKSB7XG4gICAgICAgICAgICBjb25zdCBzID0gbi5nZXROZXh0KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5jb21wYXJhdG9yKHMua2V5LCB0WzFdKSA+PSAwKSByZXR1cm47XG4gICAgICAgICAgICBlKHMua2V5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGBlbGVtYHMgc3VjaCB0aGF0OiBzdGFydCAmbHQ7PSBlbGVtIHVudGlsIGZhbHNlIGlzIHJldHVybmVkLlxuICAgICAqLyAgICBmb3JFYWNoV2hpbGUodCwgZSkge1xuICAgICAgICBsZXQgbjtcbiAgICAgICAgZm9yIChuID0gdm9pZCAwICE9PSBlID8gdGhpcy5kYXRhLmdldEl0ZXJhdG9yRnJvbShlKSA6IHRoaXMuZGF0YS5nZXRJdGVyYXRvcigpOyBuLmhhc05leHQoKTsgKSB7XG4gICAgICAgICAgICBpZiAoIXQobi5nZXROZXh0KCkua2V5KSkgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKiBGaW5kcyB0aGUgbGVhc3QgZWxlbWVudCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYGVsZW1gLiAqLyAgICBmaXJzdEFmdGVyT3JFcXVhbCh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLmRhdGEuZ2V0SXRlcmF0b3JGcm9tKHQpO1xuICAgICAgICByZXR1cm4gZS5oYXNOZXh0KCkgPyBlLmdldE5leHQoKS5rZXkgOiBudWxsO1xuICAgIH1cbiAgICBnZXRJdGVyYXRvcigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNbih0aGlzLmRhdGEuZ2V0SXRlcmF0b3IoKSk7XG4gICAgfVxuICAgIGdldEl0ZXJhdG9yRnJvbSh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgTW4odGhpcy5kYXRhLmdldEl0ZXJhdG9yRnJvbSh0KSk7XG4gICAgfVxuICAgIC8qKiBJbnNlcnRzIG9yIHVwZGF0ZXMgYW4gZWxlbWVudCAqLyAgICBhZGQodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb3B5KHRoaXMuZGF0YS5yZW1vdmUodCkuaW5zZXJ0KHQsICEwKSk7XG4gICAgfVxuICAgIC8qKiBEZWxldGVzIGFuIGVsZW1lbnQgKi8gICAgZGVsZXRlKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzKHQpID8gdGhpcy5jb3B5KHRoaXMuZGF0YS5yZW1vdmUodCkpIDogdGhpcztcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5pc0VtcHR5KCk7XG4gICAgfVxuICAgIHVuaW9uV2l0aCh0KSB7XG4gICAgICAgIGxldCBlID0gdGhpcztcbiAgICAgICAgLy8gTWFrZSBzdXJlIGByZXN1bHRgIGFsd2F5cyByZWZlcnMgdG8gdGhlIGxhcmdlciBvbmUgb2YgdGhlIHR3byBzZXRzLlxuICAgICAgICAgICAgICAgIHJldHVybiBlLnNpemUgPCB0LnNpemUgJiYgKGUgPSB0LCB0ID0gdGhpcyksIHQuZm9yRWFjaCgodCA9PiB7XG4gICAgICAgICAgICBlID0gZS5hZGQodCk7XG4gICAgICAgIH0pKSwgZTtcbiAgICB9XG4gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIGlmICghKHQgaW5zdGFuY2VvZiBrbikpIHJldHVybiAhMTtcbiAgICAgICAgaWYgKHRoaXMuc2l6ZSAhPT0gdC5zaXplKSByZXR1cm4gITE7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLmRhdGEuZ2V0SXRlcmF0b3IoKSwgbiA9IHQuZGF0YS5nZXRJdGVyYXRvcigpO1xuICAgICAgICBmb3IgKDtlLmhhc05leHQoKTsgKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZS5nZXROZXh0KCkua2V5LCBzID0gbi5nZXROZXh0KCkua2V5O1xuICAgICAgICAgICAgaWYgKDAgIT09IHRoaXMuY29tcGFyYXRvcih0LCBzKSkgcmV0dXJuICExO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhMDtcbiAgICB9XG4gICAgdG9BcnJheSgpIHtcbiAgICAgICAgY29uc3QgdCA9IFtdO1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JFYWNoKChlID0+IHtcbiAgICAgICAgICAgIHQucHVzaChlKTtcbiAgICAgICAgfSkpLCB0O1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgY29uc3QgdCA9IFtdO1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JFYWNoKChlID0+IHQucHVzaChlKSkpLCBcIlNvcnRlZFNldChcIiArIHQudG9TdHJpbmcoKSArIFwiKVwiO1xuICAgIH1cbiAgICBjb3B5KHQpIHtcbiAgICAgICAgY29uc3QgZSA9IG5ldyBrbih0aGlzLmNvbXBhcmF0b3IpO1xuICAgICAgICByZXR1cm4gZS5kYXRhID0gdCwgZTtcbiAgICB9XG59XG5cbmNsYXNzIE1uIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMuaXRlciA9IHQ7XG4gICAgfVxuICAgIGdldE5leHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZXIuZ2V0TmV4dCgpLmtleTtcbiAgICB9XG4gICAgaGFzTmV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlci5oYXNOZXh0KCk7XG4gICAgfVxufVxuXG4vKipcbiAqIENvbXBhcmVzIHR3byBzb3J0ZWQgc2V0cyBmb3IgZXF1YWxpdHkgdXNpbmcgdGhlaXIgbmF0dXJhbCBvcmRlcmluZy4gVGhlXG4gKiBtZXRob2QgY29tcHV0ZXMgdGhlIGludGVyc2VjdGlvbiBhbmQgaW52b2tlcyBgb25BZGRgIGZvciBldmVyeSBlbGVtZW50IHRoYXRcbiAqIGlzIGluIGBhZnRlcmAgYnV0IG5vdCBgYmVmb3JlYC4gYG9uUmVtb3ZlYCBpcyBpbnZva2VkIGZvciBldmVyeSBlbGVtZW50IGluXG4gKiBgYmVmb3JlYCBidXQgbWlzc2luZyBmcm9tIGBhZnRlcmAuXG4gKlxuICogVGhlIG1ldGhvZCBjcmVhdGVzIGEgY29weSBvZiBib3RoIGBiZWZvcmVgIGFuZCBgYWZ0ZXJgIGFuZCBydW5zIGluIE8obiBsb2dcbiAqIG4pLCB3aGVyZSBuIGlzIHRoZSBzaXplIG9mIHRoZSB0d28gbGlzdHMuXG4gKlxuICogQHBhcmFtIGJlZm9yZSAtIFRoZSBlbGVtZW50cyB0aGF0IGV4aXN0IGluIHRoZSBvcmlnaW5hbCBzZXQuXG4gKiBAcGFyYW0gYWZ0ZXIgLSBUaGUgZWxlbWVudHMgdG8gZGlmZiBhZ2FpbnN0IHRoZSBvcmlnaW5hbCBzZXQuXG4gKiBAcGFyYW0gY29tcGFyYXRvciAtIFRoZSBjb21wYXJhdG9yIGZvciB0aGUgZWxlbWVudHMgaW4gYmVmb3JlIGFuZCBhZnRlci5cbiAqIEBwYXJhbSBvbkFkZCAtIEEgZnVuY3Rpb24gdG8gaW52b2tlIGZvciBldmVyeSBlbGVtZW50IHRoYXQgaXMgcGFydCBvZiBgXG4gKiBhZnRlcmAgYnV0IG5vdCBgYmVmb3JlYC5cbiAqIEBwYXJhbSBvblJlbW92ZSAtIEEgZnVuY3Rpb24gdG8gaW52b2tlIGZvciBldmVyeSBlbGVtZW50IHRoYXQgaXMgcGFydCBvZlxuICogYGJlZm9yZWAgYnV0IG5vdCBgYWZ0ZXJgLlxuICovXG4vKipcbiAqIFJldHVybnMgdGhlIG5leHQgZWxlbWVudCBmcm9tIHRoZSBpdGVyYXRvciBvciBgdW5kZWZpbmVkYCBpZiBub25lIGF2YWlsYWJsZS5cbiAqL1xuZnVuY3Rpb24gT24odCkge1xuICAgIHJldHVybiB0Lmhhc05leHQoKSA/IHQuZ2V0TmV4dCgpIDogdm9pZCAwO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjb25zdCAkbiA9IG5ldyBDbih4dC5jb21wYXJhdG9yKTtcblxuZnVuY3Rpb24gRm4oKSB7XG4gICAgcmV0dXJuICRuO1xufVxuXG5jb25zdCBCbiA9IG5ldyBDbih4dC5jb21wYXJhdG9yKTtcblxuZnVuY3Rpb24gTG4oKSB7XG4gICAgcmV0dXJuIEJuO1xufVxuXG5mdW5jdGlvbiBxbigpIHtcbiAgICByZXR1cm4gbmV3IERuKCh0ID0+IHQudG9TdHJpbmcoKSksICgodCwgZSkgPT4gdC5pc0VxdWFsKGUpKSk7XG59XG5cbmNvbnN0IFVuID0gbmV3IENuKHh0LmNvbXBhcmF0b3IpO1xuXG5jb25zdCBLbiA9IG5ldyBrbih4dC5jb21wYXJhdG9yKTtcblxuZnVuY3Rpb24gR24oLi4udCkge1xuICAgIGxldCBlID0gS247XG4gICAgZm9yIChjb25zdCBuIG9mIHQpIGUgPSBlLmFkZChuKTtcbiAgICByZXR1cm4gZTtcbn1cblxuY29uc3QgUW4gPSBuZXcga24ocnQpO1xuXG5mdW5jdGlvbiBqbigpIHtcbiAgICByZXR1cm4gUW47XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEFuIGV2ZW50IGZyb20gdGhlIFJlbW90ZVN0b3JlLiBJdCBpcyBzcGxpdCBpbnRvIHRhcmdldENoYW5nZXMgKGNoYW5nZXMgdG8gdGhlXG4gKiBzdGF0ZSBvciB0aGUgc2V0IG9mIGRvY3VtZW50cyBpbiBvdXIgd2F0Y2hlZCB0YXJnZXRzKSBhbmQgZG9jdW1lbnRVcGRhdGVzXG4gKiAoY2hhbmdlcyB0byB0aGUgYWN0dWFsIGRvY3VtZW50cykuXG4gKi8gY2xhc3MgV24ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIFRoZSBzbmFwc2hvdCB2ZXJzaW9uIHRoaXMgZXZlbnQgYnJpbmdzIHVzIHVwIHRvLCBvciBNSU4gaWYgbm90IHNldC5cbiAgICAgKi9cbiAgICB0LCBcbiAgICAvKipcbiAgICAgKiBBIG1hcCBmcm9tIHRhcmdldCB0byBjaGFuZ2VzIHRvIHRoZSB0YXJnZXQuIFNlZSBUYXJnZXRDaGFuZ2UuXG4gICAgICovXG4gICAgZSwgXG4gICAgLyoqXG4gICAgICogQSBzZXQgb2YgdGFyZ2V0cyB0aGF0IGlzIGtub3duIHRvIGJlIGluY29uc2lzdGVudC4gTGlzdGVucyBmb3IgdGhlc2VcbiAgICAgKiB0YXJnZXRzIHNob3VsZCBiZSByZS1lc3RhYmxpc2hlZCB3aXRob3V0IHJlc3VtZSB0b2tlbnMuXG4gICAgICovXG4gICAgbiwgXG4gICAgLyoqXG4gICAgICogQSBzZXQgb2Ygd2hpY2ggZG9jdW1lbnRzIGhhdmUgY2hhbmdlZCBvciBiZWVuIGRlbGV0ZWQsIGFsb25nIHdpdGggdGhlXG4gICAgICogZG9jJ3MgbmV3IHZhbHVlcyAoaWYgbm90IGRlbGV0ZWQpLlxuICAgICAqL1xuICAgIHMsIFxuICAgIC8qKlxuICAgICAqIEEgc2V0IG9mIHdoaWNoIGRvY3VtZW50IHVwZGF0ZXMgYXJlIGR1ZSBvbmx5IHRvIGxpbWJvIHJlc29sdXRpb24gdGFyZ2V0cy5cbiAgICAgKi9cbiAgICBpKSB7XG4gICAgICAgIHRoaXMuc25hcHNob3RWZXJzaW9uID0gdCwgdGhpcy50YXJnZXRDaGFuZ2VzID0gZSwgdGhpcy50YXJnZXRNaXNtYXRjaGVzID0gbiwgdGhpcy5kb2N1bWVudFVwZGF0ZXMgPSBzLCBcbiAgICAgICAgdGhpcy5yZXNvbHZlZExpbWJvRG9jdW1lbnRzID0gaTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSEFDSzogVmlld3MgcmVxdWlyZSBSZW1vdGVFdmVudHMgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHZpZXcgaXNcbiAgICAgKiBDVVJSRU5ULCBidXQgc2Vjb25kYXJ5IHRhYnMgZG9uJ3QgcmVjZWl2ZSByZW1vdGUgZXZlbnRzLiBTbyB0aGlzIG1ldGhvZCBpc1xuICAgICAqIHVzZWQgdG8gY3JlYXRlIGEgc3ludGhlc2l6ZWQgUmVtb3RlRXZlbnQgdGhhdCBjYW4gYmUgdXNlZCB0byBhcHBseSBhXG4gICAgICogQ1VSUkVOVCBzdGF0dXMgY2hhbmdlIHRvIGEgVmlldywgZm9yIHF1ZXJpZXMgZXhlY3V0ZWQgaW4gYSBkaWZmZXJlbnQgdGFiLlxuICAgICAqL1xuICAgIC8vIFBPUlRJTkcgTk9URTogTXVsdGktdGFiIG9ubHlcbiAgICBzdGF0aWMgY3JlYXRlU3ludGhlc2l6ZWRSZW1vdGVFdmVudEZvckN1cnJlbnRDaGFuZ2UodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gbmV3IE1hcDtcbiAgICAgICAgcmV0dXJuIG4uc2V0KHQsIHpuLmNyZWF0ZVN5bnRoZXNpemVkVGFyZ2V0Q2hhbmdlRm9yQ3VycmVudENoYW5nZSh0LCBlKSksIG5ldyBXbihjdC5taW4oKSwgbiwgam4oKSwgRm4oKSwgR24oKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgVGFyZ2V0Q2hhbmdlIHNwZWNpZmllcyB0aGUgc2V0IG9mIGNoYW5nZXMgZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IGFzIHBhcnQgb2ZcbiAqIGEgUmVtb3RlRXZlbnQuIFRoZXNlIGNoYW5nZXMgdHJhY2sgd2hpY2ggZG9jdW1lbnRzIGFyZSBhZGRlZCwgbW9kaWZpZWQgb3JcbiAqIHJlbW92ZWQsIGFzIHdlbGwgYXMgdGhlIHRhcmdldCdzIHJlc3VtZSB0b2tlbiBhbmQgd2hldGhlciB0aGUgdGFyZ2V0IGlzXG4gKiBtYXJrZWQgQ1VSUkVOVC5cbiAqIFRoZSBhY3R1YWwgY2hhbmdlcyAqdG8qIGRvY3VtZW50cyBhcmUgbm90IHBhcnQgb2YgdGhlIFRhcmdldENoYW5nZSBzaW5jZVxuICogZG9jdW1lbnRzIG1heSBiZSBwYXJ0IG9mIG11bHRpcGxlIHRhcmdldHMuXG4gKi8gY2xhc3Mgem4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIEFuIG9wYXF1ZSwgc2VydmVyLWFzc2lnbmVkIHRva2VuIHRoYXQgYWxsb3dzIHdhdGNoaW5nIGEgcXVlcnkgdG8gYmUgcmVzdW1lZFxuICAgICAqIGFmdGVyIGRpc2Nvbm5lY3Rpbmcgd2l0aG91dCByZXRyYW5zbWl0dGluZyBhbGwgdGhlIGRhdGEgdGhhdCBtYXRjaGVzIHRoZVxuICAgICAqIHF1ZXJ5LiBUaGUgcmVzdW1lIHRva2VuIGVzc2VudGlhbGx5IGlkZW50aWZpZXMgYSBwb2ludCBpbiB0aW1lIGZyb20gd2hpY2hcbiAgICAgKiB0aGUgc2VydmVyIHNob3VsZCByZXN1bWUgc2VuZGluZyByZXN1bHRzLlxuICAgICAqL1xuICAgIHQsIFxuICAgIC8qKlxuICAgICAqIFRoZSBcImN1cnJlbnRcIiAoc3luY2VkKSBzdGF0dXMgb2YgdGhpcyB0YXJnZXQuIE5vdGUgdGhhdCBcImN1cnJlbnRcIlxuICAgICAqIGhhcyBzcGVjaWFsIG1lYW5pbmcgaW4gdGhlIFJQQyBwcm90b2NvbCB0aGF0IGltcGxpZXMgdGhhdCBhIHRhcmdldCBpc1xuICAgICAqIGJvdGggdXAtdG8tZGF0ZSBhbmQgY29uc2lzdGVudCB3aXRoIHRoZSByZXN0IG9mIHRoZSB3YXRjaCBzdHJlYW0uXG4gICAgICovXG4gICAgZSwgXG4gICAgLyoqXG4gICAgICogVGhlIHNldCBvZiBkb2N1bWVudHMgdGhhdCB3ZXJlIG5ld2x5IGFzc2lnbmVkIHRvIHRoaXMgdGFyZ2V0IGFzIHBhcnQgb2ZcbiAgICAgKiB0aGlzIHJlbW90ZSBldmVudC5cbiAgICAgKi9cbiAgICBuLCBcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIGRvY3VtZW50cyB0aGF0IHdlcmUgYWxyZWFkeSBhc3NpZ25lZCB0byB0aGlzIHRhcmdldCBidXQgcmVjZWl2ZWRcbiAgICAgKiBhbiB1cGRhdGUgZHVyaW5nIHRoaXMgcmVtb3RlIGV2ZW50LlxuICAgICAqL1xuICAgIHMsIFxuICAgIC8qKlxuICAgICAqIFRoZSBzZXQgb2YgZG9jdW1lbnRzIHRoYXQgd2VyZSByZW1vdmVkIGZyb20gdGhpcyB0YXJnZXQgYXMgcGFydCBvZiB0aGlzXG4gICAgICogcmVtb3RlIGV2ZW50LlxuICAgICAqL1xuICAgIGkpIHtcbiAgICAgICAgdGhpcy5yZXN1bWVUb2tlbiA9IHQsIHRoaXMuY3VycmVudCA9IGUsIHRoaXMuYWRkZWREb2N1bWVudHMgPSBuLCB0aGlzLm1vZGlmaWVkRG9jdW1lbnRzID0gcywgXG4gICAgICAgIHRoaXMucmVtb3ZlZERvY3VtZW50cyA9IGk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY3JlYXRlIGEgc3ludGhlc2l6ZWQgVGFyZ2V0Q2hhbmdlcyB0aGF0IGNhbiBiZSB1c2VkIHRvXG4gICAgICogYXBwbHkgYSBDVVJSRU5UIHN0YXR1cyBjaGFuZ2UgdG8gYSBWaWV3IChmb3IgcXVlcmllcyBleGVjdXRlZCBpbiBhIGRpZmZlcmVudFxuICAgICAqIHRhYikgb3IgZm9yIG5ldyBxdWVyaWVzICh0byByYWlzZSBzbmFwc2hvdHMgd2l0aCBjb3JyZWN0IENVUlJFTlQgc3RhdHVzKS5cbiAgICAgKi8gICAgc3RhdGljIGNyZWF0ZVN5bnRoZXNpemVkVGFyZ2V0Q2hhbmdlRm9yQ3VycmVudENoYW5nZSh0LCBlKSB7XG4gICAgICAgIHJldHVybiBuZXcgem4ocHQuRU1QVFlfQllURV9TVFJJTkcsIGUsIEduKCksIEduKCksIEduKCkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogUmVwcmVzZW50cyBhIGNoYW5nZWQgZG9jdW1lbnQgYW5kIGEgbGlzdCBvZiB0YXJnZXQgaWRzIHRvIHdoaWNoIHRoaXMgY2hhbmdlXG4gKiBhcHBsaWVzLlxuICpcbiAqIElmIGRvY3VtZW50IGhhcyBiZWVuIGRlbGV0ZWQgTm9Eb2N1bWVudCB3aWxsIGJlIHByb3ZpZGVkLlxuICovIGNsYXNzIEhuIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKiogVGhlIG5ldyBkb2N1bWVudCBhcHBsaWVzIHRvIGFsbCBvZiB0aGVzZSB0YXJnZXRzLiAqL1xuICAgIHQsIFxuICAgIC8qKiBUaGUgbmV3IGRvY3VtZW50IGlzIHJlbW92ZWQgZnJvbSBhbGwgb2YgdGhlc2UgdGFyZ2V0cy4gKi9cbiAgICBlLCBcbiAgICAvKiogVGhlIGtleSBvZiB0aGUgZG9jdW1lbnQgZm9yIHRoaXMgY2hhbmdlLiAqL1xuICAgIG4sIFxuICAgIC8qKlxuICAgICAqIFRoZSBuZXcgZG9jdW1lbnQgb3IgTm9Eb2N1bWVudCBpZiBpdCB3YXMgZGVsZXRlZC4gSXMgbnVsbCBpZiB0aGVcbiAgICAgKiBkb2N1bWVudCB3ZW50IG91dCBvZiB2aWV3IHdpdGhvdXQgdGhlIHNlcnZlciBzZW5kaW5nIGEgbmV3IGRvY3VtZW50LlxuICAgICAqL1xuICAgIHMpIHtcbiAgICAgICAgdGhpcy5PID0gdCwgdGhpcy5yZW1vdmVkVGFyZ2V0SWRzID0gZSwgdGhpcy5rZXkgPSBuLCB0aGlzLiQgPSBzO1xuICAgIH1cbn1cblxuY2xhc3MgSm4ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy50YXJnZXRJZCA9IHQsIHRoaXMuRiA9IGU7XG4gICAgfVxufVxuXG5jbGFzcyBZbiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqIFdoYXQga2luZCBvZiBjaGFuZ2Ugb2NjdXJyZWQgdG8gdGhlIHdhdGNoIHRhcmdldC4gKi9cbiAgICB0LCBcbiAgICAvKiogVGhlIHRhcmdldCBJRHMgdGhhdCB3ZXJlIGFkZGVkL3JlbW92ZWQvc2V0LiAqL1xuICAgIGUsIFxuICAgIC8qKlxuICAgICAqIEFuIG9wYXF1ZSwgc2VydmVyLWFzc2lnbmVkIHRva2VuIHRoYXQgYWxsb3dzIHdhdGNoaW5nIGEgdGFyZ2V0IHRvIGJlXG4gICAgICogcmVzdW1lZCBhZnRlciBkaXNjb25uZWN0aW5nIHdpdGhvdXQgcmV0cmFuc21pdHRpbmcgYWxsIHRoZSBkYXRhIHRoYXRcbiAgICAgKiBtYXRjaGVzIHRoZSB0YXJnZXQuIFRoZSByZXN1bWUgdG9rZW4gZXNzZW50aWFsbHkgaWRlbnRpZmllcyBhIHBvaW50IGluXG4gICAgICogdGltZSBmcm9tIHdoaWNoIHRoZSBzZXJ2ZXIgc2hvdWxkIHJlc3VtZSBzZW5kaW5nIHJlc3VsdHMuXG4gICAgICovXG4gICAgbiA9IHB0LkVNUFRZX0JZVEVfU1RSSU5HXG4gICAgLyoqIEFuIFJQQyBlcnJvciBpbmRpY2F0aW5nIHdoeSB0aGUgd2F0Y2ggZmFpbGVkLiAqLyAsIHMgPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB0LCB0aGlzLnRhcmdldElkcyA9IGUsIHRoaXMucmVzdW1lVG9rZW4gPSBuLCB0aGlzLmNhdXNlID0gcztcbiAgICB9XG59XG5cbi8qKiBUcmFja3MgdGhlIGludGVybmFsIHN0YXRlIG9mIGEgV2F0Y2ggdGFyZ2V0LiAqLyBjbGFzcyBYbiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgbnVtYmVyIG9mIHBlbmRpbmcgcmVzcG9uc2VzIChhZGRzIG9yIHJlbW92ZXMpIHRoYXQgd2UgYXJlIHdhaXRpbmcgb24uXG4gICAgICAgICAqIFdlIG9ubHkgY29uc2lkZXIgdGFyZ2V0cyBhY3RpdmUgdGhhdCBoYXZlIG5vIHBlbmRpbmcgcmVzcG9uc2VzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5CID0gMCwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBLZWVwcyB0cmFjayBvZiB0aGUgZG9jdW1lbnQgY2hhbmdlcyBzaW5jZSB0aGUgbGFzdCByYWlzZWQgc25hcHNob3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZXNlIGNoYW5nZXMgYXJlIGNvbnRpbnVvdXNseSB1cGRhdGVkIGFzIHdlIHJlY2VpdmUgZG9jdW1lbnQgdXBkYXRlcyBhbmRcbiAgICAgICAgICogYWx3YXlzIHJlZmxlY3QgdGhlIGN1cnJlbnQgc2V0IG9mIGNoYW5nZXMgYWdhaW5zdCB0aGUgbGFzdCBpc3N1ZWQgc25hcHNob3QuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLkwgPSBlcygpLCBcbiAgICAgICAgLyoqIFNlZSBwdWJsaWMgZ2V0dGVycyBmb3IgZXhwbGFuYXRpb25zIG9mIHRoZXNlIGZpZWxkcy4gKi9cbiAgICAgICAgdGhpcy5xID0gcHQuRU1QVFlfQllURV9TVFJJTkcsIHRoaXMuVSA9ICExLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZXRoZXIgdGhpcyB0YXJnZXQgc3RhdGUgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBuZXh0IHNuYXBzaG90LiBXZVxuICAgICAgICAgKiBpbml0aWFsaXplIHRvIHRydWUgc28gdGhhdCBuZXdseS1hZGRlZCB0YXJnZXRzIGFyZSBpbmNsdWRlZCBpbiB0aGUgbmV4dFxuICAgICAgICAgKiBSZW1vdGVFdmVudC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuSyA9ICEwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoaXMgdGFyZ2V0IGhhcyBiZWVuIG1hcmtlZCAnY3VycmVudCcuXG4gICAgICpcbiAgICAgKiAnQ3VycmVudCcgaGFzIHNwZWNpYWwgbWVhbmluZyBpbiB0aGUgUlBDIHByb3RvY29sOiBJdCBpbXBsaWVzIHRoYXQgdGhlXG4gICAgICogV2F0Y2ggYmFja2VuZCBoYXMgc2VudCB1cyBhbGwgY2hhbmdlcyB1cCB0byB0aGUgcG9pbnQgYXQgd2hpY2ggdGhlIHRhcmdldFxuICAgICAqIHdhcyBhZGRlZCBhbmQgdGhhdCB0aGUgdGFyZ2V0IGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVzdCBvZiB0aGUgd2F0Y2hcbiAgICAgKiBzdHJlYW0uXG4gICAgICovICAgIGdldCBjdXJyZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5VO1xuICAgIH1cbiAgICAvKiogVGhlIGxhc3QgcmVzdW1lIHRva2VuIHNlbnQgdG8gdXMgZm9yIHRoaXMgdGFyZ2V0LiAqLyAgICBnZXQgcmVzdW1lVG9rZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnE7XG4gICAgfVxuICAgIC8qKiBXaGV0aGVyIHRoaXMgdGFyZ2V0IGhhcyBwZW5kaW5nIHRhcmdldCBhZGRzIG9yIHRhcmdldCByZW1vdmVzLiAqLyAgICBnZXQgRygpIHtcbiAgICAgICAgcmV0dXJuIDAgIT09IHRoaXMuQjtcbiAgICB9XG4gICAgLyoqIFdoZXRoZXIgd2UgaGF2ZSBtb2RpZmllZCBhbnkgc3RhdGUgdGhhdCBzaG91bGQgdHJpZ2dlciBhIHNuYXBzaG90LiAqLyAgICBnZXQgaigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuSztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXBwbGllcyB0aGUgcmVzdW1lIHRva2VuIHRvIHRoZSBUYXJnZXRDaGFuZ2UsIGJ1dCBvbmx5IHdoZW4gaXQgaGFzIGEgbmV3XG4gICAgICogdmFsdWUuIEVtcHR5IHJlc3VtZVRva2VucyBhcmUgZGlzY2FyZGVkLlxuICAgICAqLyAgICBXKHQpIHtcbiAgICAgICAgdC5hcHByb3hpbWF0ZUJ5dGVTaXplKCkgPiAwICYmICh0aGlzLksgPSAhMCwgdGhpcy5xID0gdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB0YXJnZXQgY2hhbmdlIGZyb20gdGhlIGN1cnJlbnQgc2V0IG9mIGNoYW5nZXMuXG4gICAgICpcbiAgICAgKiBUbyByZXNldCB0aGUgZG9jdW1lbnQgY2hhbmdlcyBhZnRlciByYWlzaW5nIHRoaXMgc25hcHNob3QsIGNhbGxcbiAgICAgKiBgY2xlYXJQZW5kaW5nQ2hhbmdlcygpYC5cbiAgICAgKi8gICAgSCgpIHtcbiAgICAgICAgbGV0IHQgPSBHbigpLCBlID0gR24oKSwgbiA9IEduKCk7XG4gICAgICAgIHJldHVybiB0aGlzLkwuZm9yRWFjaCgoKHMsIGkpID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAoaSkge1xuICAgICAgICAgICAgICBjYXNlIDAgLyogQWRkZWQgKi8gOlxuICAgICAgICAgICAgICAgIHQgPSB0LmFkZChzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlIDIgLyogTW9kaWZpZWQgKi8gOlxuICAgICAgICAgICAgICAgIGUgPSBlLmFkZChzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlIDEgLyogUmVtb3ZlZCAqLyA6XG4gICAgICAgICAgICAgICAgbiA9IG4uYWRkKHMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgTCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSksIG5ldyB6bih0aGlzLnEsIHRoaXMuVSwgdCwgZSwgbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgZG9jdW1lbnQgY2hhbmdlcyBhbmQgc2V0cyBgaGFzUGVuZGluZ0NoYW5nZXNgIHRvIGZhbHNlLlxuICAgICAqLyAgICBKKCkge1xuICAgICAgICB0aGlzLksgPSAhMSwgdGhpcy5MID0gZXMoKTtcbiAgICB9XG4gICAgWSh0LCBlKSB7XG4gICAgICAgIHRoaXMuSyA9ICEwLCB0aGlzLkwgPSB0aGlzLkwuaW5zZXJ0KHQsIGUpO1xuICAgIH1cbiAgICBYKHQpIHtcbiAgICAgICAgdGhpcy5LID0gITAsIHRoaXMuTCA9IHRoaXMuTC5yZW1vdmUodCk7XG4gICAgfVxuICAgIFooKSB7XG4gICAgICAgIHRoaXMuQiArPSAxO1xuICAgIH1cbiAgICB0dCgpIHtcbiAgICAgICAgdGhpcy5CIC09IDE7XG4gICAgfVxuICAgIGV0KCkge1xuICAgICAgICB0aGlzLksgPSAhMCwgdGhpcy5VID0gITA7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgaGVscGVyIGNsYXNzIHRvIGFjY3VtdWxhdGUgd2F0Y2ggY2hhbmdlcyBpbnRvIGEgUmVtb3RlRXZlbnQuXG4gKi9cbmNsYXNzIFpuIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMubnQgPSB0LCBcbiAgICAgICAgLyoqIFRoZSBpbnRlcm5hbCBzdGF0ZSBvZiBhbGwgdHJhY2tlZCB0YXJnZXRzLiAqL1xuICAgICAgICB0aGlzLnN0ID0gbmV3IE1hcCwgXG4gICAgICAgIC8qKiBLZWVwcyB0cmFjayBvZiB0aGUgZG9jdW1lbnRzIHRvIHVwZGF0ZSBzaW5jZSB0aGUgbGFzdCByYWlzZWQgc25hcHNob3QuICovXG4gICAgICAgIHRoaXMuaXQgPSBGbigpLCBcbiAgICAgICAgLyoqIEEgbWFwcGluZyBvZiBkb2N1bWVudCBrZXlzIHRvIHRoZWlyIHNldCBvZiB0YXJnZXQgSURzLiAqL1xuICAgICAgICB0aGlzLnJ0ID0gdHMoKSwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGxpc3Qgb2YgdGFyZ2V0cyB3aXRoIGV4aXN0ZW5jZSBmaWx0ZXIgbWlzbWF0Y2hlcy4gVGhlc2UgdGFyZ2V0cyBhcmVcbiAgICAgICAgICoga25vd24gdG8gYmUgaW5jb25zaXN0ZW50IGFuZCB0aGVpciBsaXN0ZW5zIG5lZWRzIHRvIGJlIHJlLWVzdGFibGlzaGVkIGJ5XG4gICAgICAgICAqIFJlbW90ZVN0b3JlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vdCA9IG5ldyBrbihydCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBhbmQgYWRkcyB0aGUgRG9jdW1lbnRXYXRjaENoYW5nZSB0byB0aGUgY3VycmVudCBzZXQgb2YgY2hhbmdlcy5cbiAgICAgKi8gICAgYXQodCkge1xuICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdC5PKSB0LiQgJiYgdC4kLmlzRm91bmREb2N1bWVudCgpID8gdGhpcy51dChlLCB0LiQpIDogdGhpcy5jdChlLCB0LmtleSwgdC4kKTtcbiAgICAgICAgZm9yIChjb25zdCBlIG9mIHQucmVtb3ZlZFRhcmdldElkcykgdGhpcy5jdChlLCB0LmtleSwgdC4kKTtcbiAgICB9XG4gICAgLyoqIFByb2Nlc3NlcyBhbmQgYWRkcyB0aGUgV2F0Y2hUYXJnZXRDaGFuZ2UgdG8gdGhlIGN1cnJlbnQgc2V0IG9mIGNoYW5nZXMuICovICAgIGh0KHQpIHtcbiAgICAgICAgdGhpcy5mb3JFYWNoVGFyZ2V0KHQsIChlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLmx0KGUpO1xuICAgICAgICAgICAgc3dpdGNoICh0LnN0YXRlKSB7XG4gICAgICAgICAgICAgIGNhc2UgMCAvKiBOb0NoYW5nZSAqLyA6XG4gICAgICAgICAgICAgICAgdGhpcy5mdChlKSAmJiBuLlcodC5yZXN1bWVUb2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSAxIC8qIEFkZGVkICovIDpcbiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGRlY3JlbWVudCB0aGUgbnVtYmVyIG9mIHBlbmRpbmcgYWNrcyBuZWVkZWQgZnJvbSB3YXRjaFxuICAgICAgICAgICAgICAgIC8vIGZvciB0aGlzIHRhcmdldElkLlxuICAgICAgICAgICAgICAgIG4udHQoKSwgbi5HIHx8IFxuICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBmcmVzaGx5IGFkZGVkIHRhcmdldCwgc28gd2UgbmVlZCB0byByZXNldCBhbnkgc3RhdGVcbiAgICAgICAgICAgICAgICAvLyB0aGF0IHdlIGhhZCBwcmV2aW91c2x5LiBUaGlzIGNhbiBoYXBwZW4gZS5nLiB3aGVuIHJlbW92ZSBhbmQgYWRkXG4gICAgICAgICAgICAgICAgLy8gYmFjayBhIHRhcmdldCBmb3IgZXhpc3RlbmNlIGZpbHRlciBtaXNtYXRjaGVzLlxuICAgICAgICAgICAgICAgIG4uSigpLCBuLlcodC5yZXN1bWVUb2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSAyIC8qIFJlbW92ZWQgKi8gOlxuICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiByZW1vdmVkIHRhcmdldHMgdG8gd2UgY2FuIHBvc3QtZmlsdGVyIGFuZFxuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBhbnkgdGFyZ2V0IGNoYW5nZXMuXG4gICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBkZWNyZW1lbnQgdGhlIG51bWJlciBvZiBwZW5kaW5nIGFja3MgbmVlZGVkIGZyb20gd2F0Y2hcbiAgICAgICAgICAgICAgICAvLyBmb3IgdGhpcyB0YXJnZXRJZC5cbiAgICAgICAgICAgICAgICBuLnR0KCksIG4uRyB8fCB0aGlzLnJlbW92ZVRhcmdldChlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlIDMgLyogQ3VycmVudCAqLyA6XG4gICAgICAgICAgICAgICAgdGhpcy5mdChlKSAmJiAobi5ldCgpLCBuLlcodC5yZXN1bWVUb2tlbikpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgNCAvKiBSZXNldCAqLyA6XG4gICAgICAgICAgICAgICAgdGhpcy5mdChlKSAmJiAoXG4gICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHRhcmdldCBhbmQgc3ludGhlc2l6ZXMgcmVtb3ZlcyBmb3IgYWxsIGV4aXN0aW5nXG4gICAgICAgICAgICAgICAgLy8gZG9jdW1lbnRzLiBUaGUgYmFja2VuZCB3aWxsIHJlLWFkZCBhbnkgZG9jdW1lbnRzIHRoYXQgc3RpbGxcbiAgICAgICAgICAgICAgICAvLyBtYXRjaCB0aGUgdGFyZ2V0IGJlZm9yZSBpdCBzZW5kcyB0aGUgbmV4dCBnbG9iYWwgc25hcHNob3QuXG4gICAgICAgICAgICAgICAgdGhpcy5kdChlKSwgbi5XKHQucmVzdW1lVG9rZW4pKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIEwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGFsbCB0YXJnZXRJZHMgdGhhdCB0aGUgd2F0Y2ggY2hhbmdlIGFwcGxpZXMgdG86IGVpdGhlciB0aGVcbiAgICAgKiB0YXJnZXRJZHMgZXhwbGljaXRseSBsaXN0ZWQgaW4gdGhlIGNoYW5nZSBvciB0aGUgdGFyZ2V0SWRzIG9mIGFsbCBjdXJyZW50bHlcbiAgICAgKiBhY3RpdmUgdGFyZ2V0cy5cbiAgICAgKi8gICAgZm9yRWFjaFRhcmdldCh0LCBlKSB7XG4gICAgICAgIHQudGFyZ2V0SWRzLmxlbmd0aCA+IDAgPyB0LnRhcmdldElkcy5mb3JFYWNoKGUpIDogdGhpcy5zdC5mb3JFYWNoKCgodCwgbikgPT4ge1xuICAgICAgICAgICAgdGhpcy5mdChuKSAmJiBlKG4pO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgZXhpc3RlbmNlIGZpbHRlcnMgYW5kIHN5bnRoZXNpemVzIGRlbGV0ZXMgZm9yIGZpbHRlciBtaXNtYXRjaGVzLlxuICAgICAqIFRhcmdldHMgdGhhdCBhcmUgaW52YWxpZGF0ZWQgYnkgZmlsdGVyIG1pc21hdGNoZXMgYXJlIGFkZGVkIHRvXG4gICAgICogYHBlbmRpbmdUYXJnZXRSZXNldHNgLlxuICAgICAqLyAgICBfdCh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0LnRhcmdldElkLCBuID0gdC5GLmNvdW50LCBzID0gdGhpcy53dChlKTtcbiAgICAgICAgaWYgKHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBzLnRhcmdldDtcbiAgICAgICAgICAgIGlmIChmZSh0KSkgaWYgKDAgPT09IG4pIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgZXhpc3RlbmNlIGZpbHRlciB0b2xkIHVzIHRoZSBkb2N1bWVudCBkb2VzIG5vdCBleGlzdC4gV2UgZGVkdWNlXG4gICAgICAgICAgICAgICAgLy8gdGhhdCB0aGlzIGRvY3VtZW50IGRvZXMgbm90IGV4aXN0IGFuZCBhcHBseSBhIGRlbGV0ZWQgZG9jdW1lbnQgdG9cbiAgICAgICAgICAgICAgICAvLyBvdXIgdXBkYXRlcy4gV2l0aG91dCBhcHBseWluZyB0aGlzIGRlbGV0ZWQgZG9jdW1lbnQgdGhlcmUgbWlnaHQgYmVcbiAgICAgICAgICAgICAgICAvLyBhbm90aGVyIHF1ZXJ5IHRoYXQgd2lsbCByYWlzZSB0aGlzIGRvY3VtZW50IGFzIHBhcnQgb2YgYSBzbmFwc2hvdFxuICAgICAgICAgICAgICAgIC8vIHVudGlsIGl0IGlzIHJlc29sdmVkLCBlc3NlbnRpYWxseSBleHBvc2luZyBpbmNvbnNpc3RlbmN5IGJldHdlZW5cbiAgICAgICAgICAgICAgICAvLyBxdWVyaWVzLlxuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBuZXcgeHQodC5wYXRoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmN0KGUsIG4sIHRlLm5ld05vRG9jdW1lbnQobiwgY3QubWluKCkpKTtcbiAgICAgICAgICAgIH0gZWxzZSBxKDEgPT09IG4pOyBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmd0KGUpICE9PSBuICYmIChcbiAgICAgICAgICAgICAgICAvLyBFeGlzdGVuY2UgZmlsdGVyIG1pc21hdGNoOiBXZSByZXNldCB0aGUgbWFwcGluZyBhbmQgcmFpc2UgYSBuZXdcbiAgICAgICAgICAgICAgICAvLyBzbmFwc2hvdCB3aXRoIGBpc0Zyb21DYWNoZTp0cnVlYC5cbiAgICAgICAgICAgICAgICB0aGlzLmR0KGUpLCB0aGlzLm90ID0gdGhpcy5vdC5hZGQoZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBjdXJyZW50bHkgYWNjdW11bGF0ZWQgc3RhdGUgaW50byBhIHJlbW90ZSBldmVudCBhdCB0aGVcbiAgICAgKiBwcm92aWRlZCBzbmFwc2hvdCB2ZXJzaW9uLiBSZXNldHMgdGhlIGFjY3VtdWxhdGVkIGNoYW5nZXMgYmVmb3JlIHJldHVybmluZy5cbiAgICAgKi8gICAgeXQodCkge1xuICAgICAgICBjb25zdCBlID0gbmV3IE1hcDtcbiAgICAgICAgdGhpcy5zdC5mb3JFYWNoKCgobiwgcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMud3Qocyk7XG4gICAgICAgICAgICBpZiAoaSkge1xuICAgICAgICAgICAgICAgIGlmIChuLmN1cnJlbnQgJiYgZmUoaS50YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIERvY3VtZW50IHF1ZXJpZXMgZm9yIGRvY3VtZW50IHRoYXQgZG9uJ3QgZXhpc3QgY2FuIHByb2R1Y2UgYW4gZW1wdHlcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVzdWx0IHNldC4gVG8gdXBkYXRlIG91ciBsb2NhbCBjYWNoZSwgd2Ugc3ludGhlc2l6ZSBhIGRvY3VtZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBpZiB3ZSBoYXZlIG5vdCBwcmV2aW91c2x5IHJlY2VpdmVkIHRoZSBkb2N1bWVudC4gVGhpc1xuICAgICAgICAgICAgICAgICAgICAvLyByZXNvbHZlcyB0aGUgbGltYm8gc3RhdGUgb2YgdGhlIGRvY3VtZW50LCByZW1vdmluZyBpdCBmcm9tXG4gICAgICAgICAgICAgICAgICAgIC8vIGxpbWJvRG9jdW1lbnRSZWZzLlxuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGRpbW9uZCk6IElkZWFsbHkgd2Ugd291bGQgaGF2ZSBhbiBleHBsaWNpdCBsb29rdXAgdGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgcmVzdWx0aW5nIGluIGFuIGV4cGxpY2l0IGRlbGV0ZSBtZXNzYWdlIGFuZCB3ZSBjb3VsZFxuICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgdGhpcyBzcGVjaWFsIGxvZ2ljLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gbmV3IHh0KGkudGFyZ2V0LnBhdGgpO1xuICAgICAgICAgICAgICAgICAgICBudWxsICE9PSB0aGlzLml0LmdldChlKSB8fCB0aGlzLkl0KHMsIGUpIHx8IHRoaXMuY3QocywgZSwgdGUubmV3Tm9Eb2N1bWVudChlLCB0KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG4uaiAmJiAoZS5zZXQocywgbi5IKCkpLCBuLkooKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICAgICAgbGV0IG4gPSBHbigpO1xuICAgICAgICAvLyBXZSBleHRyYWN0IHRoZSBzZXQgb2YgbGltYm8tb25seSBkb2N1bWVudCB1cGRhdGVzIGFzIHRoZSBHQyBsb2dpY1xuICAgICAgICAvLyBzcGVjaWFsLWNhc2VzIGRvY3VtZW50cyB0aGF0IGRvIG5vdCBhcHBlYXIgaW4gdGhlIHRhcmdldCBjYWNoZS5cbiAgICAgICAgXG4gICAgICAgIC8vIFRPRE8oZ3NvbHRpcyk6IEV4cGFuZCBvbiB0aGlzIGNvbW1lbnQgb25jZSBHQyBpcyBhdmFpbGFibGUgaW4gdGhlIEpTXG4gICAgICAgIC8vIGNsaWVudC5cbiAgICAgICAgICAgICAgICB0aGlzLnJ0LmZvckVhY2goKCh0LCBlKSA9PiB7XG4gICAgICAgICAgICBsZXQgcyA9ICEwO1xuICAgICAgICAgICAgZS5mb3JFYWNoV2hpbGUoKHQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLnd0KHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiAhZSB8fCAyIC8qIExpbWJvUmVzb2x1dGlvbiAqLyA9PT0gZS5wdXJwb3NlIHx8IChzID0gITEsICExKTtcbiAgICAgICAgICAgIH0pKSwgcyAmJiAobiA9IG4uYWRkKHQpKTtcbiAgICAgICAgfSkpLCB0aGlzLml0LmZvckVhY2goKChlLCBuKSA9PiBuLnNldFJlYWRUaW1lKHQpKSk7XG4gICAgICAgIGNvbnN0IHMgPSBuZXcgV24odCwgZSwgdGhpcy5vdCwgdGhpcy5pdCwgbik7XG4gICAgICAgIHJldHVybiB0aGlzLml0ID0gRm4oKSwgdGhpcy5ydCA9IHRzKCksIHRoaXMub3QgPSBuZXcga24ocnQpLCBzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBwcm92aWRlZCBkb2N1bWVudCB0byB0aGUgaW50ZXJuYWwgbGlzdCBvZiBkb2N1bWVudCB1cGRhdGVzIGFuZFxuICAgICAqIGl0cyBkb2N1bWVudCBrZXkgdG8gdGhlIGdpdmVuIHRhcmdldCdzIG1hcHBpbmcuXG4gICAgICovXG4gICAgLy8gVmlzaWJsZSBmb3IgdGVzdGluZy5cbiAgICB1dCh0LCBlKSB7XG4gICAgICAgIGlmICghdGhpcy5mdCh0KSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBuID0gdGhpcy5JdCh0LCBlLmtleSkgPyAyIC8qIE1vZGlmaWVkICovIDogMCAvKiBBZGRlZCAqLztcbiAgICAgICAgdGhpcy5sdCh0KS5ZKGUua2V5LCBuKSwgdGhpcy5pdCA9IHRoaXMuaXQuaW5zZXJ0KGUua2V5LCBlKSwgdGhpcy5ydCA9IHRoaXMucnQuaW5zZXJ0KGUua2V5LCB0aGlzLlR0KGUua2V5KS5hZGQodCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBwcm92aWRlZCBkb2N1bWVudCBmcm9tIHRoZSB0YXJnZXQgbWFwcGluZy4gSWYgdGhlXG4gICAgICogZG9jdW1lbnQgbm8gbG9uZ2VyIG1hdGNoZXMgdGhlIHRhcmdldCwgYnV0IHRoZSBkb2N1bWVudCdzIHN0YXRlIGlzIHN0aWxsXG4gICAgICoga25vd24gKGUuZy4gd2Uga25vdyB0aGF0IHRoZSBkb2N1bWVudCB3YXMgZGVsZXRlZCBvciB3ZSByZWNlaXZlZCB0aGUgY2hhbmdlXG4gICAgICogdGhhdCBjYXVzZWQgdGhlIGZpbHRlciBtaXNtYXRjaCksIHRoZSBuZXcgZG9jdW1lbnQgY2FuIGJlIHByb3ZpZGVkXG4gICAgICogdG8gdXBkYXRlIHRoZSByZW1vdGUgZG9jdW1lbnQgY2FjaGUuXG4gICAgICovXG4gICAgLy8gVmlzaWJsZSBmb3IgdGVzdGluZy5cbiAgICBjdCh0LCBlLCBuKSB7XG4gICAgICAgIGlmICghdGhpcy5mdCh0KSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBzID0gdGhpcy5sdCh0KTtcbiAgICAgICAgdGhpcy5JdCh0LCBlKSA/IHMuWShlLCAxIC8qIFJlbW92ZWQgKi8pIDogXG4gICAgICAgIC8vIFRoZSBkb2N1bWVudCBtYXkgaGF2ZSBlbnRlcmVkIGFuZCBsZWZ0IHRoZSB0YXJnZXQgYmVmb3JlIHdlIHJhaXNlZCBhXG4gICAgICAgIC8vIHNuYXBzaG90LCBzbyB3ZSBjYW4ganVzdCBpZ25vcmUgdGhlIGNoYW5nZS5cbiAgICAgICAgcy5YKGUpLCB0aGlzLnJ0ID0gdGhpcy5ydC5pbnNlcnQoZSwgdGhpcy5UdChlKS5kZWxldGUodCkpLCBuICYmICh0aGlzLml0ID0gdGhpcy5pdC5pbnNlcnQoZSwgbikpO1xuICAgIH1cbiAgICByZW1vdmVUYXJnZXQodCkge1xuICAgICAgICB0aGlzLnN0LmRlbGV0ZSh0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBjb3VudCBvZiBkb2N1bWVudHMgaW4gdGhlIHRhcmdldC4gVGhpcyBpbmNsdWRlcyBib3RoXG4gICAgICogdGhlIG51bWJlciBvZiBkb2N1bWVudHMgdGhhdCB0aGUgTG9jYWxTdG9yZSBjb25zaWRlcnMgdG8gYmUgcGFydCBvZiB0aGVcbiAgICAgKiB0YXJnZXQgYXMgd2VsbCBhcyBhbnkgYWNjdW11bGF0ZWQgY2hhbmdlcy5cbiAgICAgKi8gICAgZ3QodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5sdCh0KS5IKCk7XG4gICAgICAgIHJldHVybiB0aGlzLm50LmdldFJlbW90ZUtleXNGb3JUYXJnZXQodCkuc2l6ZSArIGUuYWRkZWREb2N1bWVudHMuc2l6ZSAtIGUucmVtb3ZlZERvY3VtZW50cy5zaXplO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbmNyZW1lbnQgdGhlIG51bWJlciBvZiBhY2tzIG5lZWRlZCBmcm9tIHdhdGNoIGJlZm9yZSB3ZSBjYW4gY29uc2lkZXIgdGhlXG4gICAgICogc2VydmVyIHRvIGJlICdpbi1zeW5jJyB3aXRoIHRoZSBjbGllbnQncyBhY3RpdmUgdGFyZ2V0cy5cbiAgICAgKi8gICAgWih0KSB7XG4gICAgICAgIHRoaXMubHQodCkuWigpO1xuICAgIH1cbiAgICBsdCh0KSB7XG4gICAgICAgIGxldCBlID0gdGhpcy5zdC5nZXQodCk7XG4gICAgICAgIHJldHVybiBlIHx8IChlID0gbmV3IFhuLCB0aGlzLnN0LnNldCh0LCBlKSksIGU7XG4gICAgfVxuICAgIFR0KHQpIHtcbiAgICAgICAgbGV0IGUgPSB0aGlzLnJ0LmdldCh0KTtcbiAgICAgICAgcmV0dXJuIGUgfHwgKGUgPSBuZXcga24ocnQpLCB0aGlzLnJ0ID0gdGhpcy5ydC5pbnNlcnQodCwgZSkpLCBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBWZXJpZmllcyB0aGF0IHRoZSB1c2VyIGlzIHN0aWxsIGludGVyZXN0ZWQgaW4gdGhpcyB0YXJnZXQgKGJ5IGNhbGxpbmdcbiAgICAgKiBgZ2V0VGFyZ2V0RGF0YUZvclRhcmdldCgpYCkgYW5kIHRoYXQgd2UgYXJlIG5vdCB3YWl0aW5nIGZvciBwZW5kaW5nIEFERHNcbiAgICAgKiBmcm9tIHdhdGNoLlxuICAgICAqLyAgICBmdCh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBudWxsICE9PSB0aGlzLnd0KHQpO1xuICAgICAgICByZXR1cm4gZSB8fCBPKFwiV2F0Y2hDaGFuZ2VBZ2dyZWdhdG9yXCIsIFwiRGV0ZWN0ZWQgaW5hY3RpdmUgdGFyZ2V0XCIsIHQpLCBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBUYXJnZXREYXRhIGZvciBhbiBhY3RpdmUgdGFyZ2V0IChpLmUuIGEgdGFyZ2V0IHRoYXQgdGhlIHVzZXJcbiAgICAgKiBpcyBzdGlsbCBpbnRlcmVzdGVkIGluIHRoYXQgaGFzIG5vIG91dHN0YW5kaW5nIHRhcmdldCBjaGFuZ2UgcmVxdWVzdHMpLlxuICAgICAqLyAgICB3dCh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLnN0LmdldCh0KTtcbiAgICAgICAgcmV0dXJuIGUgJiYgZS5HID8gbnVsbCA6IHRoaXMubnQuRXQodCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgc3RhdGUgb2YgYSBXYXRjaCB0YXJnZXQgdG8gaXRzIGluaXRpYWwgc3RhdGUgKGUuZy4gc2V0c1xuICAgICAqICdjdXJyZW50JyB0byBmYWxzZSwgY2xlYXJzIHRoZSByZXN1bWUgdG9rZW4gYW5kIHJlbW92ZXMgaXRzIHRhcmdldCBtYXBwaW5nXG4gICAgICogZnJvbSBhbGwgZG9jdW1lbnRzKS5cbiAgICAgKi8gICAgZHQodCkge1xuICAgICAgICB0aGlzLnN0LnNldCh0LCBuZXcgWG4pO1xuICAgICAgICB0aGlzLm50LmdldFJlbW90ZUtleXNGb3JUYXJnZXQodCkuZm9yRWFjaCgoZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmN0KHQsIGUsIC8qdXBkYXRlZERvY3VtZW50PSovIG51bGwpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgTG9jYWxTdG9yZSBjb25zaWRlcnMgdGhlIGRvY3VtZW50IHRvIGJlIHBhcnQgb2YgdGhlXG4gICAgICogc3BlY2lmaWVkIHRhcmdldC5cbiAgICAgKi8gICAgSXQodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5udC5nZXRSZW1vdGVLZXlzRm9yVGFyZ2V0KHQpLmhhcyhlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHRzKCkge1xuICAgIHJldHVybiBuZXcgQ24oeHQuY29tcGFyYXRvcik7XG59XG5cbmZ1bmN0aW9uIGVzKCkge1xuICAgIHJldHVybiBuZXcgQ24oeHQuY29tcGFyYXRvcik7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGNvbnN0IG5zID0gKCgpID0+IHtcbiAgICBjb25zdCB0ID0ge1xuICAgICAgICBhc2M6IFwiQVNDRU5ESU5HXCIsXG4gICAgICAgIGRlc2M6IFwiREVTQ0VORElOR1wiXG4gICAgfTtcbiAgICByZXR1cm4gdDtcbn0pKCksIHNzID0gKCgpID0+IHtcbiAgICBjb25zdCB0ID0ge1xuICAgICAgICBcIjxcIjogXCJMRVNTX1RIQU5cIixcbiAgICAgICAgXCI8PVwiOiBcIkxFU1NfVEhBTl9PUl9FUVVBTFwiLFxuICAgICAgICBcIj5cIjogXCJHUkVBVEVSX1RIQU5cIixcbiAgICAgICAgXCI+PVwiOiBcIkdSRUFURVJfVEhBTl9PUl9FUVVBTFwiLFxuICAgICAgICBcIj09XCI6IFwiRVFVQUxcIixcbiAgICAgICAgXCIhPVwiOiBcIk5PVF9FUVVBTFwiLFxuICAgICAgICBcImFycmF5LWNvbnRhaW5zXCI6IFwiQVJSQVlfQ09OVEFJTlNcIixcbiAgICAgICAgaW46IFwiSU5cIixcbiAgICAgICAgXCJub3QtaW5cIjogXCJOT1RfSU5cIixcbiAgICAgICAgXCJhcnJheS1jb250YWlucy1hbnlcIjogXCJBUlJBWV9DT05UQUlOU19BTllcIlxuICAgIH07XG4gICAgcmV0dXJuIHQ7XG59KSgpO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgZ2VuZXJhdGVzIEpzb25PYmplY3QgdmFsdWVzIGZvciB0aGUgRGF0YXN0b3JlIEFQSSBzdWl0YWJsZSBmb3JcbiAqIHNlbmRpbmcgdG8gZWl0aGVyIEdSUEMgc3R1YiBtZXRob2RzIG9yIHZpYSB0aGUgSlNPTi9IVFRQIFJFU1QgQVBJLlxuICpcbiAqIFRoZSBzZXJpYWxpemVyIHN1cHBvcnRzIGJvdGggUHJvdG9idWYuanMgYW5kIFByb3RvMyBKU09OIGZvcm1hdHMuIEJ5XG4gKiBzZXR0aW5nIGB1c2VQcm90bzNKc29uYCB0byB0cnVlLCB0aGUgc2VyaWFsaXplciB3aWxsIHVzZSB0aGUgUHJvdG8zIEpTT05cbiAqIGZvcm1hdC5cbiAqXG4gKiBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgUHJvdG8zIEpTT04gZm9ybWF0IGNoZWNrXG4gKiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAqXG4gKiBUT0RPKGtsaW10KTogV2UgY2FuIHJlbW92ZSB0aGUgZGF0YWJhc2VJZCBhcmd1bWVudCBpZiB3ZSBrZWVwIHRoZSBmdWxsXG4gKiByZXNvdXJjZSBuYW1lIGluIGRvY3VtZW50cy5cbiAqL1xuY2xhc3MgaXMge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5kYXRhYmFzZUlkID0gdCwgdGhpcy5OID0gZTtcbiAgICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHZhbHVlIGZvciBhIERhdGUgdGhhdCdzIGFwcHJvcHJpYXRlIHRvIHB1dCBpbnRvIGEgcHJvdG8uXG4gKi9cbmZ1bmN0aW9uIHJzKHQsIGUpIHtcbiAgICBpZiAodC5OKSB7XG4gICAgICAgIHJldHVybiBgJHtuZXcgRGF0ZSgxZTMgKiBlLnNlY29uZHMpLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvXFwuXFxkKi8sIFwiXCIpLnJlcGxhY2UoXCJaXCIsIFwiXCIpfS4keyhcIjAwMDAwMDAwMFwiICsgZS5uYW5vc2Vjb25kcykuc2xpY2UoLTkpfVpgO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBzZWNvbmRzOiBcIlwiICsgZS5zZWNvbmRzLFxuICAgICAgICBuYW5vczogZS5uYW5vc2Vjb25kc1xuICAgIH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHZhbHVlIGZvciBieXRlcyB0aGF0J3MgYXBwcm9wcmlhdGUgdG8gcHV0IGluIGEgcHJvdG8uXG4gKlxuICogVmlzaWJsZSBmb3IgdGVzdGluZy5cbiAqL1xuZnVuY3Rpb24gb3ModCwgZSkge1xuICAgIHJldHVybiB0Lk4gPyBlLnRvQmFzZTY0KCkgOiBlLnRvVWludDhBcnJheSgpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBCeXRlU3RyaW5nIGJhc2VkIG9uIHRoZSBwcm90byBzdHJpbmcgdmFsdWUuXG4gKi8gZnVuY3Rpb24gYXModCwgZSkge1xuICAgIHJldHVybiBycyh0LCBlLnRvVGltZXN0YW1wKCkpO1xufVxuXG5mdW5jdGlvbiB1cyh0KSB7XG4gICAgcmV0dXJuIHEoISF0KSwgY3QuZnJvbVRpbWVzdGFtcChmdW5jdGlvbih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBUdCh0KTtcbiAgICAgICAgcmV0dXJuIG5ldyB1dChlLnNlY29uZHMsIGUubmFub3MpO1xuICAgIH0odCkpO1xufVxuXG5mdW5jdGlvbiBjcyh0LCBlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBfdChbIFwicHJvamVjdHNcIiwgdC5wcm9qZWN0SWQsIFwiZGF0YWJhc2VzXCIsIHQuZGF0YWJhc2UgXSk7XG4gICAgfSh0KS5jaGlsZChcImRvY3VtZW50c1wiKS5jaGlsZChlKS5jYW5vbmljYWxTdHJpbmcoKTtcbn1cblxuZnVuY3Rpb24gaHModCkge1xuICAgIGNvbnN0IGUgPSBfdC5mcm9tU3RyaW5nKHQpO1xuICAgIHJldHVybiBxKE9zKGUpKSwgZTtcbn1cblxuZnVuY3Rpb24gbHModCwgZSkge1xuICAgIHJldHVybiBjcyh0LmRhdGFiYXNlSWQsIGUucGF0aCk7XG59XG5cbmZ1bmN0aW9uIGZzKHQsIGUpIHtcbiAgICBjb25zdCBuID0gaHMoZSk7XG4gICAgaWYgKG4uZ2V0KDEpICE9PSB0LmRhdGFiYXNlSWQucHJvamVjdElkKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIFwiVHJpZWQgdG8gZGVzZXJpYWxpemUga2V5IGZyb20gZGlmZmVyZW50IHByb2plY3Q6IFwiICsgbi5nZXQoMSkgKyBcIiB2cyBcIiArIHQuZGF0YWJhc2VJZC5wcm9qZWN0SWQpO1xuICAgIGlmIChuLmdldCgzKSAhPT0gdC5kYXRhYmFzZUlkLmRhdGFiYXNlKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIFwiVHJpZWQgdG8gZGVzZXJpYWxpemUga2V5IGZyb20gZGlmZmVyZW50IGRhdGFiYXNlOiBcIiArIG4uZ2V0KDMpICsgXCIgdnMgXCIgKyB0LmRhdGFiYXNlSWQuZGF0YWJhc2UpO1xuICAgIHJldHVybiBuZXcgeHQobXMobikpO1xufVxuXG5mdW5jdGlvbiBkcyh0LCBlKSB7XG4gICAgcmV0dXJuIGNzKHQuZGF0YWJhc2VJZCwgZSk7XG59XG5cbmZ1bmN0aW9uIF9zKHQpIHtcbiAgICBjb25zdCBlID0gaHModCk7XG4gICAgLy8gSW4gdjFiZXRhMSBxdWVyaWVzIGZvciBjb2xsZWN0aW9ucyBhdCB0aGUgcm9vdCBkaWQgbm90IGhhdmUgYSB0cmFpbGluZ1xuICAgIC8vIFwiL2RvY3VtZW50c1wiLiBJbiB2MSBhbGwgcmVzb3VyY2UgcGF0aHMgY29udGFpbiBcIi9kb2N1bWVudHNcIi4gUHJlc2VydmUgdGhlXG4gICAgLy8gYWJpbGl0eSB0byByZWFkIHRoZSB2MWJldGExIGZvcm0gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBxdWVyaWVzIHBlcnNpc3RlZFxuICAgIC8vIGluIHRoZSBsb2NhbCB0YXJnZXQgY2FjaGUuXG4gICAgICAgIHJldHVybiA0ID09PSBlLmxlbmd0aCA/IF90LmVtcHR5UGF0aCgpIDogbXMoZSk7XG59XG5cbmZ1bmN0aW9uIHdzKHQpIHtcbiAgICByZXR1cm4gbmV3IF90KFsgXCJwcm9qZWN0c1wiLCB0LmRhdGFiYXNlSWQucHJvamVjdElkLCBcImRhdGFiYXNlc1wiLCB0LmRhdGFiYXNlSWQuZGF0YWJhc2UgXSkuY2Fub25pY2FsU3RyaW5nKCk7XG59XG5cbmZ1bmN0aW9uIG1zKHQpIHtcbiAgICByZXR1cm4gcSh0Lmxlbmd0aCA+IDQgJiYgXCJkb2N1bWVudHNcIiA9PT0gdC5nZXQoNCkpLCB0LnBvcEZpcnN0KDUpO1xufVxuXG4vKiogQ3JlYXRlcyBhIERvY3VtZW50IHByb3RvIGZyb20ga2V5IGFuZCBmaWVsZHMgKGJ1dCBubyBjcmVhdGUvdXBkYXRlIHRpbWUpICovIGZ1bmN0aW9uIGdzKHQsIGUsIG4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBscyh0LCBlKSxcbiAgICAgICAgZmllbGRzOiBuLnZhbHVlLm1hcFZhbHVlLmZpZWxkc1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIHlzKHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gZnModCwgZS5uYW1lKSwgaSA9IHVzKGUudXBkYXRlVGltZSksIHIgPSBuZXcgWHQoe1xuICAgICAgICBtYXBWYWx1ZToge1xuICAgICAgICAgICAgZmllbGRzOiBlLmZpZWxkc1xuICAgICAgICB9XG4gICAgfSksIG8gPSB0ZS5uZXdGb3VuZERvY3VtZW50KHMsIGksIHIpO1xuICAgIHJldHVybiBuICYmIG8uc2V0SGFzQ29tbWl0dGVkTXV0YXRpb25zKCksIG4gPyBvLnNldEhhc0NvbW1pdHRlZE11dGF0aW9ucygpIDogbztcbn1cblxuZnVuY3Rpb24gcHModCwgZSkge1xuICAgIHJldHVybiBcImZvdW5kXCIgaW4gZSA/IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgcSghIWUuZm91bmQpLCBlLmZvdW5kLm5hbWUsIGUuZm91bmQudXBkYXRlVGltZTtcbiAgICAgICAgY29uc3QgbiA9IGZzKHQsIGUuZm91bmQubmFtZSksIHMgPSB1cyhlLmZvdW5kLnVwZGF0ZVRpbWUpLCBpID0gbmV3IFh0KHtcbiAgICAgICAgICAgIG1hcFZhbHVlOiB7XG4gICAgICAgICAgICAgICAgZmllbGRzOiBlLmZvdW5kLmZpZWxkc1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRlLm5ld0ZvdW5kRG9jdW1lbnQobiwgcywgaSk7XG4gICAgfSh0LCBlKSA6IFwibWlzc2luZ1wiIGluIGUgPyBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIHEoISFlLm1pc3NpbmcpLCBxKCEhZS5yZWFkVGltZSk7XG4gICAgICAgIGNvbnN0IG4gPSBmcyh0LCBlLm1pc3NpbmcpLCBzID0gdXMoZS5yZWFkVGltZSk7XG4gICAgICAgIHJldHVybiB0ZS5uZXdOb0RvY3VtZW50KG4sIHMpO1xuICAgIH0odCwgZSkgOiBMKCk7XG59XG5cbmZ1bmN0aW9uIElzKHQsIGUpIHtcbiAgICBsZXQgbjtcbiAgICBpZiAoXCJ0YXJnZXRDaGFuZ2VcIiBpbiBlKSB7XG4gICAgICAgIGUudGFyZ2V0Q2hhbmdlO1xuICAgICAgICAvLyBwcm90bzMgZGVmYXVsdCB2YWx1ZSBpcyB1bnNldCBpbiBKU09OICh1bmRlZmluZWQpLCBzbyB1c2UgJ05PX0NIQU5HRSdcbiAgICAgICAgLy8gaWYgdW5zZXRcbiAgICAgICAgY29uc3QgcyA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHJldHVybiBcIk5PX0NIQU5HRVwiID09PSB0ID8gMCAvKiBOb0NoYW5nZSAqLyA6IFwiQUREXCIgPT09IHQgPyAxIC8qIEFkZGVkICovIDogXCJSRU1PVkVcIiA9PT0gdCA/IDIgLyogUmVtb3ZlZCAqLyA6IFwiQ1VSUkVOVFwiID09PSB0ID8gMyAvKiBDdXJyZW50ICovIDogXCJSRVNFVFwiID09PSB0ID8gNCAvKiBSZXNldCAqLyA6IEwoKTtcbiAgICAgICAgfShlLnRhcmdldENoYW5nZS50YXJnZXRDaGFuZ2VUeXBlIHx8IFwiTk9fQ0hBTkdFXCIpLCBpID0gZS50YXJnZXRDaGFuZ2UudGFyZ2V0SWRzIHx8IFtdLCByID0gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgcmV0dXJuIHQuTiA/IChxKHZvaWQgMCA9PT0gZSB8fCBcInN0cmluZ1wiID09IHR5cGVvZiBlKSwgcHQuZnJvbUJhc2U2NFN0cmluZyhlIHx8IFwiXCIpKSA6IChxKHZvaWQgMCA9PT0gZSB8fCBlIGluc3RhbmNlb2YgVWludDhBcnJheSksIFxuICAgICAgICAgICAgcHQuZnJvbVVpbnQ4QXJyYXkoZSB8fCBuZXcgVWludDhBcnJheSkpO1xuICAgICAgICB9KHQsIGUudGFyZ2V0Q2hhbmdlLnJlc3VtZVRva2VuKSwgbyA9IGUudGFyZ2V0Q2hhbmdlLmNhdXNlLCBhID0gbyAmJiBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdm9pZCAwID09PSB0LmNvZGUgPyBHLlVOS05PV04gOiBTbih0LmNvZGUpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBRKGUsIHQubWVzc2FnZSB8fCBcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAqIFJldHVybnMgYSB2YWx1ZSBmb3IgYSBudW1iZXIgKG9yIG51bGwpIHRoYXQncyBhcHByb3ByaWF0ZSB0byBwdXQgaW50b1xuICogYSBnb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZSBwcm90by5cbiAqIERPIE5PVCBVU0UgVEhJUyBGT1IgQU5ZVEhJTkcgRUxTRS5cbiAqIFRoaXMgbWV0aG9kIGNoZWF0cy4gSXQncyB0eXBlZCBhcyByZXR1cm5pbmcgXCJudW1iZXJcIiBiZWNhdXNlIHRoYXQncyB3aGF0XG4gKiBvdXIgZ2VuZXJhdGVkIHByb3RvIGludGVyZmFjZXMgc2F5IEludDMyVmFsdWUgbXVzdCBiZS4gQnV0IEdSUEMgYWN0dWFsbHlcbiAqIGV4cGVjdHMgYSB7IHZhbHVlOiA8bnVtYmVyPiB9IHN0cnVjdC5cbiAqLyAobyk7XG4gICAgICAgIG4gPSBuZXcgWW4ocywgaSwgciwgYSB8fCBudWxsKTtcbiAgICB9IGVsc2UgaWYgKFwiZG9jdW1lbnRDaGFuZ2VcIiBpbiBlKSB7XG4gICAgICAgIGUuZG9jdW1lbnRDaGFuZ2U7XG4gICAgICAgIGNvbnN0IHMgPSBlLmRvY3VtZW50Q2hhbmdlO1xuICAgICAgICBzLmRvY3VtZW50LCBzLmRvY3VtZW50Lm5hbWUsIHMuZG9jdW1lbnQudXBkYXRlVGltZTtcbiAgICAgICAgY29uc3QgaSA9IGZzKHQsIHMuZG9jdW1lbnQubmFtZSksIHIgPSB1cyhzLmRvY3VtZW50LnVwZGF0ZVRpbWUpLCBvID0gbmV3IFh0KHtcbiAgICAgICAgICAgIG1hcFZhbHVlOiB7XG4gICAgICAgICAgICAgICAgZmllbGRzOiBzLmRvY3VtZW50LmZpZWxkc1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSwgYSA9IHRlLm5ld0ZvdW5kRG9jdW1lbnQoaSwgciwgbyksIHUgPSBzLnRhcmdldElkcyB8fCBbXSwgYyA9IHMucmVtb3ZlZFRhcmdldElkcyB8fCBbXTtcbiAgICAgICAgbiA9IG5ldyBIbih1LCBjLCBhLmtleSwgYSk7XG4gICAgfSBlbHNlIGlmIChcImRvY3VtZW50RGVsZXRlXCIgaW4gZSkge1xuICAgICAgICBlLmRvY3VtZW50RGVsZXRlO1xuICAgICAgICBjb25zdCBzID0gZS5kb2N1bWVudERlbGV0ZTtcbiAgICAgICAgcy5kb2N1bWVudDtcbiAgICAgICAgY29uc3QgaSA9IGZzKHQsIHMuZG9jdW1lbnQpLCByID0gcy5yZWFkVGltZSA/IHVzKHMucmVhZFRpbWUpIDogY3QubWluKCksIG8gPSB0ZS5uZXdOb0RvY3VtZW50KGksIHIpLCBhID0gcy5yZW1vdmVkVGFyZ2V0SWRzIHx8IFtdO1xuICAgICAgICBuID0gbmV3IEhuKFtdLCBhLCBvLmtleSwgbyk7XG4gICAgfSBlbHNlIGlmIChcImRvY3VtZW50UmVtb3ZlXCIgaW4gZSkge1xuICAgICAgICBlLmRvY3VtZW50UmVtb3ZlO1xuICAgICAgICBjb25zdCBzID0gZS5kb2N1bWVudFJlbW92ZTtcbiAgICAgICAgcy5kb2N1bWVudDtcbiAgICAgICAgY29uc3QgaSA9IGZzKHQsIHMuZG9jdW1lbnQpLCByID0gcy5yZW1vdmVkVGFyZ2V0SWRzIHx8IFtdO1xuICAgICAgICBuID0gbmV3IEhuKFtdLCByLCBpLCBudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIShcImZpbHRlclwiIGluIGUpKSByZXR1cm4gTCgpO1xuICAgICAgICB7XG4gICAgICAgICAgICBlLmZpbHRlcjtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBlLmZpbHRlcjtcbiAgICAgICAgICAgIHQudGFyZ2V0SWQ7XG4gICAgICAgICAgICBjb25zdCBzID0gdC5jb3VudCB8fCAwLCBpID0gbmV3IGJuKHMpLCByID0gdC50YXJnZXRJZDtcbiAgICAgICAgICAgIG4gPSBuZXcgSm4ociwgaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG47XG59XG5cbmZ1bmN0aW9uIFRzKHQsIGUpIHtcbiAgICBsZXQgbjtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIHluKSBuID0ge1xuICAgICAgICB1cGRhdGU6IGdzKHQsIGUua2V5LCBlLnZhbHVlKVxuICAgIH07IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBBbikgbiA9IHtcbiAgICAgICAgZGVsZXRlOiBscyh0LCBlLmtleSlcbiAgICB9OyBlbHNlIGlmIChlIGluc3RhbmNlb2YgcG4pIG4gPSB7XG4gICAgICAgIHVwZGF0ZTogZ3ModCwgZS5rZXksIGUuZGF0YSksXG4gICAgICAgIHVwZGF0ZU1hc2s6IE1zKGUuZmllbGRNYXNrKVxuICAgIH07IGVsc2Uge1xuICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgUm4pKSByZXR1cm4gTCgpO1xuICAgICAgICBuID0ge1xuICAgICAgICAgICAgdmVyaWZ5OiBscyh0LCBlLmtleSlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGUuZmllbGRUcmFuc2Zvcm1zLmxlbmd0aCA+IDAgJiYgKG4udXBkYXRlVHJhbnNmb3JtcyA9IGUuZmllbGRUcmFuc2Zvcm1zLm1hcCgodCA9PiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBlLnRyYW5zZm9ybTtcbiAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBYZSkgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpZWxkUGF0aDogZS5maWVsZC5jYW5vbmljYWxTdHJpbmcoKSxcbiAgICAgICAgICAgIHNldFRvU2VydmVyVmFsdWU6IFwiUkVRVUVTVF9USU1FXCJcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBaZSkgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpZWxkUGF0aDogZS5maWVsZC5jYW5vbmljYWxTdHJpbmcoKSxcbiAgICAgICAgICAgIGFwcGVuZE1pc3NpbmdFbGVtZW50czoge1xuICAgICAgICAgICAgICAgIHZhbHVlczogbi5lbGVtZW50c1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAobiBpbnN0YW5jZW9mIGVuKSByZXR1cm4ge1xuICAgICAgICAgICAgZmllbGRQYXRoOiBlLmZpZWxkLmNhbm9uaWNhbFN0cmluZygpLFxuICAgICAgICAgICAgcmVtb3ZlQWxsRnJvbUFycmF5OiB7XG4gICAgICAgICAgICAgICAgdmFsdWVzOiBuLmVsZW1lbnRzXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGlmIChuIGluc3RhbmNlb2Ygc24pIHJldHVybiB7XG4gICAgICAgICAgICBmaWVsZFBhdGg6IGUuZmllbGQuY2Fub25pY2FsU3RyaW5nKCksXG4gICAgICAgICAgICBpbmNyZW1lbnQ6IG4ua1xuICAgICAgICB9O1xuICAgICAgICB0aHJvdyBMKCk7XG4gICAgfSgwLCB0KSkpKSwgZS5wcmVjb25kaXRpb24uaXNOb25lIHx8IChuLmN1cnJlbnREb2N1bWVudCA9IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gZS51cGRhdGVUaW1lID8ge1xuICAgICAgICAgICAgdXBkYXRlVGltZTogYXModCwgZS51cGRhdGVUaW1lKVxuICAgICAgICB9IDogdm9pZCAwICE9PSBlLmV4aXN0cyA/IHtcbiAgICAgICAgICAgIGV4aXN0czogZS5leGlzdHNcbiAgICAgICAgfSA6IEwoKTtcbiAgICB9KHQsIGUucHJlY29uZGl0aW9uKSksIG47XG59XG5cbmZ1bmN0aW9uIEVzKHQsIGUpIHtcbiAgICBjb25zdCBuID0gZS5jdXJyZW50RG9jdW1lbnQgPyBmdW5jdGlvbih0KSB7XG4gICAgICAgIHJldHVybiB2b2lkIDAgIT09IHQudXBkYXRlVGltZSA/IGhuLnVwZGF0ZVRpbWUodXModC51cGRhdGVUaW1lKSkgOiB2b2lkIDAgIT09IHQuZXhpc3RzID8gaG4uZXhpc3RzKHQuZXhpc3RzKSA6IGhuLm5vbmUoKTtcbiAgICB9KGUuY3VycmVudERvY3VtZW50KSA6IGhuLm5vbmUoKSwgcyA9IGUudXBkYXRlVHJhbnNmb3JtcyA/IGUudXBkYXRlVHJhbnNmb3Jtcy5tYXAoKGUgPT4gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICBsZXQgbiA9IG51bGw7XG4gICAgICAgIGlmIChcInNldFRvU2VydmVyVmFsdWVcIiBpbiBlKSBxKFwiUkVRVUVTVF9USU1FXCIgPT09IGUuc2V0VG9TZXJ2ZXJWYWx1ZSksIG4gPSBuZXcgWGU7IGVsc2UgaWYgKFwiYXBwZW5kTWlzc2luZ0VsZW1lbnRzXCIgaW4gZSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGUuYXBwZW5kTWlzc2luZ0VsZW1lbnRzLnZhbHVlcyB8fCBbXTtcbiAgICAgICAgICAgIG4gPSBuZXcgWmUodCk7XG4gICAgICAgIH0gZWxzZSBpZiAoXCJyZW1vdmVBbGxGcm9tQXJyYXlcIiBpbiBlKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZS5yZW1vdmVBbGxGcm9tQXJyYXkudmFsdWVzIHx8IFtdO1xuICAgICAgICAgICAgbiA9IG5ldyBlbih0KTtcbiAgICAgICAgfSBlbHNlIFwiaW5jcmVtZW50XCIgaW4gZSA/IG4gPSBuZXcgc24odCwgZS5pbmNyZW1lbnQpIDogTCgpO1xuICAgICAgICBjb25zdCBzID0gbXQuZnJvbVNlcnZlckZvcm1hdChlLmZpZWxkUGF0aCk7XG4gICAgICAgIHJldHVybiBuZXcgYW4ocywgbik7XG4gICAgfSh0LCBlKSkpIDogW107XG4gICAgaWYgKGUudXBkYXRlKSB7XG4gICAgICAgIGUudXBkYXRlLm5hbWU7XG4gICAgICAgIGNvbnN0IGkgPSBmcyh0LCBlLnVwZGF0ZS5uYW1lKSwgciA9IG5ldyBYdCh7XG4gICAgICAgICAgICBtYXBWYWx1ZToge1xuICAgICAgICAgICAgICAgIGZpZWxkczogZS51cGRhdGUuZmllbGRzXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZS51cGRhdGVNYXNrKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0LmZpZWxkUGF0aHMgfHwgW107XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBndChlLm1hcCgodCA9PiBtdC5mcm9tU2VydmVyRm9ybWF0KHQpKSkpO1xuICAgICAgICAgICAgfShlLnVwZGF0ZU1hc2spO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBwbihpLCByLCB0LCBuLCBzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IHluKGksIHIsIG4sIHMpO1xuICAgIH1cbiAgICBpZiAoZS5kZWxldGUpIHtcbiAgICAgICAgY29uc3QgcyA9IGZzKHQsIGUuZGVsZXRlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBbihzLCBuKTtcbiAgICB9XG4gICAgaWYgKGUudmVyaWZ5KSB7XG4gICAgICAgIGNvbnN0IHMgPSBmcyh0LCBlLnZlcmlmeSk7XG4gICAgICAgIHJldHVybiBuZXcgUm4ocywgbik7XG4gICAgfVxuICAgIHJldHVybiBMKCk7XG59XG5cbmZ1bmN0aW9uIEFzKHQsIGUpIHtcbiAgICByZXR1cm4gdCAmJiB0Lmxlbmd0aCA+IDAgPyAocSh2b2lkIDAgIT09IGUpLCB0Lm1hcCgodCA9PiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIC8vIE5PVEU6IERlbGV0ZXMgZG9uJ3QgaGF2ZSBhbiB1cGRhdGVUaW1lLlxuICAgICAgICBsZXQgbiA9IHQudXBkYXRlVGltZSA/IHVzKHQudXBkYXRlVGltZSkgOiB1cyhlKTtcbiAgICAgICAgcmV0dXJuIG4uaXNFcXVhbChjdC5taW4oKSkgJiYgKFxuICAgICAgICAvLyBUaGUgRmlyZXN0b3JlIEVtdWxhdG9yIGN1cnJlbnRseSByZXR1cm5zIGFuIHVwZGF0ZSB0aW1lIG9mIDAgZm9yXG4gICAgICAgIC8vIGRlbGV0ZXMgb2Ygbm9uLWV4aXN0aW5nIGRvY3VtZW50cyAocmF0aGVyIHRoYW4gbnVsbCkuIFRoaXMgYnJlYWtzIHRoZVxuICAgICAgICAvLyB0ZXN0IFwiZ2V0IGRlbGV0ZWQgZG9jIHdoaWxlIG9mZmxpbmUgd2l0aCBzb3VyY2U9Y2FjaGVcIiBhcyBOb0RvY3VtZW50c1xuICAgICAgICAvLyB3aXRoIHZlcnNpb24gMCBhcmUgZmlsdGVyZWQgYnkgSW5kZXhlZERiJ3MgUmVtb3RlRG9jdW1lbnRDYWNoZS5cbiAgICAgICAgLy8gVE9ETygjMjE0OSk6IFJlbW92ZSB0aGlzIHdoZW4gRW11bGF0b3IgaXMgZml4ZWRcbiAgICAgICAgbiA9IHVzKGUpKSwgbmV3IGNuKG4sIHQudHJhbnNmb3JtUmVzdWx0cyB8fCBbXSk7XG4gICAgfSh0LCBlKSkpKSA6IFtdO1xufVxuXG5mdW5jdGlvbiBScyh0LCBlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZG9jdW1lbnRzOiBbIGRzKHQsIGUucGF0aCkgXVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGJzKHQsIGUpIHtcbiAgICAvLyBEaXNzZWN0IHRoZSBwYXRoIGludG8gcGFyZW50LCBjb2xsZWN0aW9uSWQsIGFuZCBvcHRpb25hbCBrZXkgZmlsdGVyLlxuICAgIGNvbnN0IG4gPSB7XG4gICAgICAgIHN0cnVjdHVyZWRRdWVyeToge31cbiAgICB9LCBzID0gZS5wYXRoO1xuICAgIG51bGwgIT09IGUuY29sbGVjdGlvbkdyb3VwID8gKG4ucGFyZW50ID0gZHModCwgcyksIG4uc3RydWN0dXJlZFF1ZXJ5LmZyb20gPSBbIHtcbiAgICAgICAgY29sbGVjdGlvbklkOiBlLmNvbGxlY3Rpb25Hcm91cCxcbiAgICAgICAgYWxsRGVzY2VuZGFudHM6ICEwXG4gICAgfSBdKSA6IChuLnBhcmVudCA9IGRzKHQsIHMucG9wTGFzdCgpKSwgbi5zdHJ1Y3R1cmVkUXVlcnkuZnJvbSA9IFsge1xuICAgICAgICBjb2xsZWN0aW9uSWQ6IHMubGFzdFNlZ21lbnQoKVxuICAgIH0gXSk7XG4gICAgY29uc3QgaSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgaWYgKDAgPT09IHQubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGUgPSB0Lm1hcCgodCA9PiBcbiAgICAgICAgLy8gdmlzaWJsZSBmb3IgdGVzdGluZ1xuICAgICAgICBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBpZiAoXCI9PVwiIC8qIEVRVUFMICovID09PSB0Lm9wKSB7XG4gICAgICAgICAgICAgICAgaWYgKGp0KHQudmFsdWUpKSByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB1bmFyeUZpbHRlcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IENzKHQuZmllbGQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3A6IFwiSVNfTkFOXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKFF0KHQudmFsdWUpKSByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB1bmFyeUZpbHRlcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IENzKHQuZmllbGQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3A6IFwiSVNfTlVMTFwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcIiE9XCIgLyogTk9UX0VRVUFMICovID09PSB0Lm9wKSB7XG4gICAgICAgICAgICAgICAgaWYgKGp0KHQudmFsdWUpKSByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB1bmFyeUZpbHRlcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IENzKHQuZmllbGQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3A6IFwiSVNfTk9UX05BTlwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChRdCh0LnZhbHVlKSkgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdW5hcnlGaWx0ZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBDcyh0LmZpZWxkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wOiBcIklTX05PVF9OVUxMXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZpZWxkRmlsdGVyOiB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBDcyh0LmZpZWxkKSxcbiAgICAgICAgICAgICAgICAgICAgb3A6IERzKHQub3ApLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdC52YWx1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0odCkpKTtcbiAgICAgICAgaWYgKDEgPT09IGUubGVuZ3RoKSByZXR1cm4gZVswXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZpbHRlcjoge1xuICAgICAgICAgICAgICAgIG9wOiBcIkFORFwiLFxuICAgICAgICAgICAgICAgIGZpbHRlcnM6IGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9KGUuZmlsdGVycyk7XG4gICAgaSAmJiAobi5zdHJ1Y3R1cmVkUXVlcnkud2hlcmUgPSBpKTtcbiAgICBjb25zdCByID0gZnVuY3Rpb24odCkge1xuICAgICAgICBpZiAoMCA9PT0gdC5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgcmV0dXJuIHQubWFwKCh0ID0+IFxuICAgICAgICAvLyB2aXNpYmxlIGZvciB0ZXN0aW5nXG4gICAgICAgIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZmllbGQ6IENzKHQuZmllbGQpLFxuICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogU3ModC5kaXIpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KHQpKSk7XG4gICAgfShlLm9yZGVyQnkpO1xuICAgIHIgJiYgKG4uc3RydWN0dXJlZFF1ZXJ5Lm9yZGVyQnkgPSByKTtcbiAgICBjb25zdCBvID0gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICByZXR1cm4gdC5OIHx8IFN0KGUpID8gZSA6IHtcbiAgICAgICAgICAgIHZhbHVlOiBlXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICogUmV0dXJucyBhIG51bWJlciAob3IgbnVsbCkgZnJvbSBhIGdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlIHByb3RvLlxuICovICh0LCBlLmxpbWl0KTtcbiAgICB2YXIgYTtcbiAgICByZXR1cm4gbnVsbCAhPT0gbyAmJiAobi5zdHJ1Y3R1cmVkUXVlcnkubGltaXQgPSBvKSwgZS5zdGFydEF0ICYmIChuLnN0cnVjdHVyZWRRdWVyeS5zdGFydEF0ID0ge1xuICAgICAgICBiZWZvcmU6IChhID0gZS5zdGFydEF0KS5pbmNsdXNpdmUsXG4gICAgICAgIHZhbHVlczogYS5wb3NpdGlvblxuICAgIH0pLCBlLmVuZEF0ICYmIChuLnN0cnVjdHVyZWRRdWVyeS5lbmRBdCA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJlZm9yZTogIXQuaW5jbHVzaXZlLFxuICAgICAgICAgICAgdmFsdWVzOiB0LnBvc2l0aW9uXG4gICAgICAgIH07XG4gICAgfShlLmVuZEF0KSksIG47XG59XG5cbmZ1bmN0aW9uIFBzKHQpIHtcbiAgICBsZXQgZSA9IF9zKHQucGFyZW50KTtcbiAgICBjb25zdCBuID0gdC5zdHJ1Y3R1cmVkUXVlcnksIHMgPSBuLmZyb20gPyBuLmZyb20ubGVuZ3RoIDogMDtcbiAgICBsZXQgaSA9IG51bGw7XG4gICAgaWYgKHMgPiAwKSB7XG4gICAgICAgIHEoMSA9PT0gcyk7XG4gICAgICAgIGNvbnN0IHQgPSBuLmZyb21bMF07XG4gICAgICAgIHQuYWxsRGVzY2VuZGFudHMgPyBpID0gdC5jb2xsZWN0aW9uSWQgOiBlID0gZS5jaGlsZCh0LmNvbGxlY3Rpb25JZCk7XG4gICAgfVxuICAgIGxldCByID0gW107XG4gICAgbi53aGVyZSAmJiAociA9IHZzKG4ud2hlcmUpKTtcbiAgICBsZXQgbyA9IFtdO1xuICAgIG4ub3JkZXJCeSAmJiAobyA9IG4ub3JkZXJCeS5tYXAoKHQgPT4gZnVuY3Rpb24odCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlKHhzKHQuZmllbGQpLCBcbiAgICAgICAgLy8gdmlzaWJsZSBmb3IgdGVzdGluZ1xuICAgICAgICBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgY2FzZSBcIkFTQ0VORElOR1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcImFzY1wiIC8qIEFTQ0VORElORyAqLztcblxuICAgICAgICAgICAgICBjYXNlIFwiREVTQ0VORElOR1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcImRlc2NcIiAvKiBERVNDRU5ESU5HICovO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHZpc2libGUgZm9yIHRlc3RpbmdcbiAgICAgICAgKHQuZGlyZWN0aW9uKSk7XG4gICAgfSh0KSkpKTtcbiAgICBsZXQgYSA9IG51bGw7XG4gICAgbi5saW1pdCAmJiAoYSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgbGV0IGU7XG4gICAgICAgIHJldHVybiBlID0gXCJvYmplY3RcIiA9PSB0eXBlb2YgdCA/IHQudmFsdWUgOiB0LCBTdChlKSA/IG51bGwgOiBlO1xuICAgIH0obi5saW1pdCkpO1xuICAgIGxldCB1ID0gbnVsbDtcbiAgICBuLnN0YXJ0QXQgJiYgKHUgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSAhIXQuYmVmb3JlLCBuID0gdC52YWx1ZXMgfHwgW107XG4gICAgICAgIHJldHVybiBuZXcgQWUobiwgZSk7XG4gICAgfShuLnN0YXJ0QXQpKTtcbiAgICBsZXQgYyA9IG51bGw7XG4gICAgcmV0dXJuIG4uZW5kQXQgJiYgKGMgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSAhdC5iZWZvcmUsIG4gPSB0LnZhbHVlcyB8fCBbXTtcbiAgICAgICAgcmV0dXJuIG5ldyBBZShuLCBlKTtcbiAgICB9XG4gICAgLy8gdmlzaWJsZSBmb3IgdGVzdGluZ1xuICAgIChuLmVuZEF0KSksIFNlKGUsIGksIG8sIHIsIGEsIFwiRlwiIC8qIEZpcnN0ICovICwgdSwgYyk7XG59XG5cbmZ1bmN0aW9uIFZzKHQsIGUpIHtcbiAgICBjb25zdCBuID0gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICBzd2l0Y2ggKGUpIHtcbiAgICAgICAgICBjYXNlIDAgLyogTGlzdGVuICovIDpcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgY2FzZSAxIC8qIEV4aXN0ZW5jZUZpbHRlck1pc21hdGNoICovIDpcbiAgICAgICAgICAgIHJldHVybiBcImV4aXN0ZW5jZS1maWx0ZXItbWlzbWF0Y2hcIjtcblxuICAgICAgICAgIGNhc2UgMiAvKiBMaW1ib1Jlc29sdXRpb24gKi8gOlxuICAgICAgICAgICAgcmV0dXJuIFwibGltYm8tZG9jdW1lbnRcIjtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gTCgpO1xuICAgICAgICB9XG4gICAgfSgwLCBlLnB1cnBvc2UpO1xuICAgIHJldHVybiBudWxsID09IG4gPyBudWxsIDoge1xuICAgICAgICBcImdvb2ctbGlzdGVuLXRhZ3NcIjogblxuICAgIH07XG59XG5cbmZ1bmN0aW9uIHZzKHQpIHtcbiAgICByZXR1cm4gdCA/IHZvaWQgMCAhPT0gdC51bmFyeUZpbHRlciA/IFsga3ModCkgXSA6IHZvaWQgMCAhPT0gdC5maWVsZEZpbHRlciA/IFsgTnModCkgXSA6IHZvaWQgMCAhPT0gdC5jb21wb3NpdGVGaWx0ZXIgPyB0LmNvbXBvc2l0ZUZpbHRlci5maWx0ZXJzLm1hcCgodCA9PiB2cyh0KSkpLnJlZHVjZSgoKHQsIGUpID0+IHQuY29uY2F0KGUpKSkgOiBMKCkgOiBbXTtcbn1cblxuZnVuY3Rpb24gU3ModCkge1xuICAgIHJldHVybiBuc1t0XTtcbn1cblxuZnVuY3Rpb24gRHModCkge1xuICAgIHJldHVybiBzc1t0XTtcbn1cblxuZnVuY3Rpb24gQ3ModCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGZpZWxkUGF0aDogdC5jYW5vbmljYWxTdHJpbmcoKVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIHhzKHQpIHtcbiAgICByZXR1cm4gbXQuZnJvbVNlcnZlckZvcm1hdCh0LmZpZWxkUGF0aCk7XG59XG5cbmZ1bmN0aW9uIE5zKHQpIHtcbiAgICByZXR1cm4gX2UuY3JlYXRlKHhzKHQuZmllbGRGaWx0ZXIuZmllbGQpLCBmdW5jdGlvbih0KSB7XG4gICAgICAgIHN3aXRjaCAodCkge1xuICAgICAgICAgIGNhc2UgXCJFUVVBTFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiPT1cIiAvKiBFUVVBTCAqLztcblxuICAgICAgICAgIGNhc2UgXCJOT1RfRVFVQUxcIjpcbiAgICAgICAgICAgIHJldHVybiBcIiE9XCIgLyogTk9UX0VRVUFMICovO1xuXG4gICAgICAgICAgY2FzZSBcIkdSRUFURVJfVEhBTlwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiPlwiIC8qIEdSRUFURVJfVEhBTiAqLztcblxuICAgICAgICAgIGNhc2UgXCJHUkVBVEVSX1RIQU5fT1JfRVFVQUxcIjpcbiAgICAgICAgICAgIHJldHVybiBcIj49XCIgLyogR1JFQVRFUl9USEFOX09SX0VRVUFMICovO1xuXG4gICAgICAgICAgY2FzZSBcIkxFU1NfVEhBTlwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiPFwiIC8qIExFU1NfVEhBTiAqLztcblxuICAgICAgICAgIGNhc2UgXCJMRVNTX1RIQU5fT1JfRVFVQUxcIjpcbiAgICAgICAgICAgIHJldHVybiBcIjw9XCIgLyogTEVTU19USEFOX09SX0VRVUFMICovO1xuXG4gICAgICAgICAgY2FzZSBcIkFSUkFZX0NPTlRBSU5TXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJhcnJheS1jb250YWluc1wiIC8qIEFSUkFZX0NPTlRBSU5TICovO1xuXG4gICAgICAgICAgY2FzZSBcIklOXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJpblwiIC8qIElOICovO1xuXG4gICAgICAgICAgY2FzZSBcIk5PVF9JTlwiOlxuICAgICAgICAgICAgcmV0dXJuIFwibm90LWluXCIgLyogTk9UX0lOICovO1xuXG4gICAgICAgICAgY2FzZSBcIkFSUkFZX0NPTlRBSU5TX0FOWVwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiYXJyYXktY29udGFpbnMtYW55XCIgLyogQVJSQVlfQ09OVEFJTlNfQU5ZICovO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBMKCk7XG4gICAgICAgIH1cbiAgICB9KHQuZmllbGRGaWx0ZXIub3ApLCB0LmZpZWxkRmlsdGVyLnZhbHVlKTtcbn1cblxuZnVuY3Rpb24ga3ModCkge1xuICAgIHN3aXRjaCAodC51bmFyeUZpbHRlci5vcCkge1xuICAgICAgY2FzZSBcIklTX05BTlwiOlxuICAgICAgICBjb25zdCBlID0geHModC51bmFyeUZpbHRlci5maWVsZCk7XG4gICAgICAgIHJldHVybiBfZS5jcmVhdGUoZSwgXCI9PVwiIC8qIEVRVUFMICovICwge1xuICAgICAgICAgICAgZG91YmxlVmFsdWU6IE5hTlxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSBcIklTX05VTExcIjpcbiAgICAgICAgY29uc3QgbiA9IHhzKHQudW5hcnlGaWx0ZXIuZmllbGQpO1xuICAgICAgICByZXR1cm4gX2UuY3JlYXRlKG4sIFwiPT1cIiAvKiBFUVVBTCAqLyAsIHtcbiAgICAgICAgICAgIG51bGxWYWx1ZTogXCJOVUxMX1ZBTFVFXCJcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgXCJJU19OT1RfTkFOXCI6XG4gICAgICAgIGNvbnN0IHMgPSB4cyh0LnVuYXJ5RmlsdGVyLmZpZWxkKTtcbiAgICAgICAgcmV0dXJuIF9lLmNyZWF0ZShzLCBcIiE9XCIgLyogTk9UX0VRVUFMICovICwge1xuICAgICAgICAgICAgZG91YmxlVmFsdWU6IE5hTlxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSBcIklTX05PVF9OVUxMXCI6XG4gICAgICAgIGNvbnN0IGkgPSB4cyh0LnVuYXJ5RmlsdGVyLmZpZWxkKTtcbiAgICAgICAgcmV0dXJuIF9lLmNyZWF0ZShpLCBcIiE9XCIgLyogTk9UX0VRVUFMICovICwge1xuICAgICAgICAgICAgbnVsbFZhbHVlOiBcIk5VTExfVkFMVUVcIlxuICAgICAgICB9KTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIEwoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIE1zKHQpIHtcbiAgICBjb25zdCBlID0gW107XG4gICAgcmV0dXJuIHQuZmllbGRzLmZvckVhY2goKHQgPT4gZS5wdXNoKHQuY2Fub25pY2FsU3RyaW5nKCkpKSksIHtcbiAgICAgICAgZmllbGRQYXRoczogZVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIE9zKHQpIHtcbiAgICAvLyBSZXNvdXJjZSBuYW1lcyBoYXZlIGF0IGxlYXN0IDQgY29tcG9uZW50cyAocHJvamVjdCBJRCwgZGF0YWJhc2UgSUQpXG4gICAgcmV0dXJuIHQubGVuZ3RoID49IDQgJiYgXCJwcm9qZWN0c1wiID09PSB0LmdldCgwKSAmJiBcImRhdGFiYXNlc1wiID09PSB0LmdldCgyKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogRW5jb2RlcyBhIHJlc291cmNlIHBhdGggaW50byBhIEluZGV4ZWREYi1jb21wYXRpYmxlIHN0cmluZyBmb3JtLlxuICovXG5mdW5jdGlvbiAkcyh0KSB7XG4gICAgbGV0IGUgPSBcIlwiO1xuICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdC5sZW5ndGg7IG4rKykgZS5sZW5ndGggPiAwICYmIChlID0gQnMoZSkpLCBlID0gRnModC5nZXQobiksIGUpO1xuICAgIHJldHVybiBCcyhlKTtcbn1cblxuLyoqIEVuY29kZXMgYSBzaW5nbGUgc2VnbWVudCBvZiBhIHJlc291cmNlIHBhdGggaW50byB0aGUgZ2l2ZW4gcmVzdWx0ICovIGZ1bmN0aW9uIEZzKHQsIGUpIHtcbiAgICBsZXQgbiA9IGU7XG4gICAgY29uc3QgcyA9IHQubGVuZ3RoO1xuICAgIGZvciAobGV0IGUgPSAwOyBlIDwgczsgZSsrKSB7XG4gICAgICAgIGNvbnN0IHMgPSB0LmNoYXJBdChlKTtcbiAgICAgICAgc3dpdGNoIChzKSB7XG4gICAgICAgICAgY2FzZSBcIlxcMFwiOlxuICAgICAgICAgICAgbiArPSBcIlx1MDAwMVx1MDAxMFwiO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiXHUwMDAxXCI6XG4gICAgICAgICAgICBuICs9IFwiXHUwMDAxXHUwMDExXCI7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBuICs9IHM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG47XG59XG5cbi8qKiBFbmNvZGVzIGEgcGF0aCBzZXBhcmF0b3IgaW50byB0aGUgZ2l2ZW4gcmVzdWx0ICovIGZ1bmN0aW9uIEJzKHQpIHtcbiAgICByZXR1cm4gdCArIFwiXHUwMDAxXHUwMDAxXCI7XG59XG5cbi8qKlxuICogRGVjb2RlcyB0aGUgZ2l2ZW4gSW5kZXhlZERiLWNvbXBhdGlibGUgc3RyaW5nIGZvcm0gb2YgYSByZXNvdXJjZSBwYXRoIGludG9cbiAqIGEgUmVzb3VyY2VQYXRoIGluc3RhbmNlLiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgaXMgbm90IHN1aXRhYmxlIGZvciB1c2Ugd2l0aFxuICogZGVjb2RpbmcgcmVzb3VyY2UgbmFtZXMgZnJvbSB0aGUgc2VydmVyOyB0aG9zZSBhcmUgT25lIFBsYXRmb3JtIGZvcm1hdFxuICogc3RyaW5ncy5cbiAqLyBmdW5jdGlvbiBMcyh0KSB7XG4gICAgLy8gRXZlbnQgdGhlIGVtcHR5IHBhdGggbXVzdCBlbmNvZGUgYXMgYSBwYXRoIG9mIGF0IGxlYXN0IGxlbmd0aCAyLiBBIHBhdGhcbiAgICAvLyB3aXRoIGV4YWN0bHkgMiBtdXN0IGJlIHRoZSBlbXB0eSBwYXRoLlxuICAgIGNvbnN0IGUgPSB0Lmxlbmd0aDtcbiAgICBpZiAocShlID49IDIpLCAyID09PSBlKSByZXR1cm4gcShcIlx1MDAwMVwiID09PSB0LmNoYXJBdCgwKSAmJiBcIlx1MDAwMVwiID09PSB0LmNoYXJBdCgxKSksIF90LmVtcHR5UGF0aCgpO1xuICAgIC8vIEVzY2FwZSBjaGFyYWN0ZXJzIGNhbm5vdCBleGlzdCBwYXN0IHRoZSBzZWNvbmQtdG8tbGFzdCBwb3NpdGlvbiBpbiB0aGVcbiAgICAvLyBzb3VyY2UgdmFsdWUuXG4gICAgICAgIGNvbnN0IG4gPSBlIC0gMiwgcyA9IFtdO1xuICAgIGxldCBpID0gXCJcIjtcbiAgICBmb3IgKGxldCByID0gMDsgciA8IGU7ICkge1xuICAgICAgICAvLyBUaGUgbGFzdCB0d28gY2hhcmFjdGVycyBvZiBhIHZhbGlkIGVuY29kZWQgcGF0aCBtdXN0IGJlIGEgc2VwYXJhdG9yLCBzb1xuICAgICAgICAvLyB0aGVyZSBtdXN0IGJlIGFuIGVuZCB0byB0aGlzIHNlZ21lbnQuXG4gICAgICAgIGNvbnN0IGUgPSB0LmluZGV4T2YoXCJcdTAwMDFcIiwgcik7XG4gICAgICAgIChlIDwgMCB8fCBlID4gbikgJiYgTCgpO1xuICAgICAgICBzd2l0Y2ggKHQuY2hhckF0KGUgKyAxKSkge1xuICAgICAgICAgIGNhc2UgXCJcdTAwMDFcIjpcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0LnN1YnN0cmluZyhyLCBlKTtcbiAgICAgICAgICAgIGxldCBvO1xuICAgICAgICAgICAgMCA9PT0gaS5sZW5ndGggPyBcbiAgICAgICAgICAgIC8vIEF2b2lkIGNvcHlpbmcgZm9yIHRoZSBjb21tb24gY2FzZSBvZiBhIHNlZ21lbnQgdGhhdCBleGNsdWRlcyBcXDBcbiAgICAgICAgICAgIC8vIGFuZCBcXDAwMVxuICAgICAgICAgICAgbyA9IG4gOiAoaSArPSBuLCBvID0gaSwgaSA9IFwiXCIpLCBzLnB1c2gobyk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJcdTAwMTBcIjpcbiAgICAgICAgICAgIGkgKz0gdC5zdWJzdHJpbmcociwgZSksIGkgKz0gXCJcXDBcIjtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcIlx1MDAxMVwiOlxuICAgICAgICAgICAgLy8gVGhlIGVzY2FwZSBjaGFyYWN0ZXIgY2FuIGJlIHVzZWQgaW4gdGhlIG91dHB1dCB0byBlbmNvZGUgaXRzZWxmLlxuICAgICAgICAgICAgaSArPSB0LnN1YnN0cmluZyhyLCBlICsgMSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBMKCk7XG4gICAgICAgIH1cbiAgICAgICAgciA9IGUgKyAyO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IF90KHMpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBOYW1lIG9mIHRoZSBJbmRleGVkRGIgb2JqZWN0IHN0b3JlLlxuICpcbiAqIE5vdGUgdGhhdCB0aGUgbmFtZSAnb3duZXInIGlzIGNob3NlbiB0byBlbnN1cmUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aFxuICogb2xkZXIgY2xpZW50cyB0aGF0IG9ubHkgc3VwcG9ydGVkIHNpbmdsZSBsb2NrZWQgYWNjZXNzIHRvIHRoZSBwZXJzaXN0ZW5jZVxuICogbGF5ZXIuXG4gKi8gY29uc3QgcXMgPSBbIFwidXNlcklkXCIsIFwiYmF0Y2hJZFwiIF07XG5cbi8qKlxuICogVGhlIGtleSBzdHJpbmcgdXNlZCBmb3IgdGhlIHNpbmdsZSBvYmplY3QgdGhhdCBleGlzdHMgaW4gdGhlXG4gKiBEYlByaW1hcnlDbGllbnQgc3RvcmUuXG4gKi9cbi8qKlxuICogQ3JlYXRlcyBhIFt1c2VySWQsIGVuY29kZWRQYXRoXSBrZXkgZm9yIHVzZSBpbiB0aGUgRGJEb2N1bWVudE11dGF0aW9uc1xuICogaW5kZXggdG8gaXRlcmF0ZSBvdmVyIGFsbCBhdCBkb2N1bWVudCBtdXRhdGlvbnMgZm9yIGEgZ2l2ZW4gcGF0aCBvciBsb3dlci5cbiAqL1xuZnVuY3Rpb24gVXModCwgZSkge1xuICAgIHJldHVybiBbIHQsICRzKGUpIF07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bGwgaW5kZXgga2V5IG9mIFt1c2VySWQsIGVuY29kZWRQYXRoLCBiYXRjaElkXSBmb3IgaW5zZXJ0aW5nXG4gKiBhbmQgZGVsZXRpbmcgaW50byB0aGUgRGJEb2N1bWVudE11dGF0aW9ucyBpbmRleC5cbiAqLyBmdW5jdGlvbiBLcyh0LCBlLCBuKSB7XG4gICAgcmV0dXJuIFsgdCwgJHMoZSksIG4gXTtcbn1cblxuLyoqXG4gKiBCZWNhdXNlIHdlIHN0b3JlIGFsbCB0aGUgdXNlZnVsIGluZm9ybWF0aW9uIGZvciB0aGlzIHN0b3JlIGluIHRoZSBrZXksXG4gKiB0aGVyZSBpcyBubyB1c2VmdWwgaW5mb3JtYXRpb24gdG8gc3RvcmUgYXMgdGhlIHZhbHVlLiBUaGUgcmF3ICh1bmVuY29kZWQpXG4gKiBwYXRoIGNhbm5vdCBiZSBzdG9yZWQgYmVjYXVzZSBJbmRleGVkRGIgZG9lc24ndCBzdG9yZSBwcm90b3R5cGVcbiAqIGluZm9ybWF0aW9uLlxuICovIGNvbnN0IEdzID0ge30sIFFzID0gWyBcInBhcmVudFBhdGhcIiwgXCJyZWFkVGltZVwiIF0sIGpzID0gWyBcImNhbm9uaWNhbElkXCIsIFwidGFyZ2V0SWRcIiBdLCBXcyA9IFsgXCJ0YXJnZXRJZFwiLCBcInBhdGhcIiBdLCB6cyA9IFsgXCJwYXRoXCIsIFwidGFyZ2V0SWRcIiBdLCBIcyA9IFsgXCJjb2xsZWN0aW9uSWRcIiwgXCJwYXJlbnRcIiBdLCBKcyA9IFsgXCJpbmRleElkXCIsIFwidWlkXCIgXSwgWXMgPSBbIFwidWlkXCIsIFwic2VxdWVuY2VOdW1iZXJcIiBdLCBYcyA9IFsgXCJpbmRleElkXCIsIFwidWlkXCIsIFwiYXJyYXlWYWx1ZVwiLCBcImRpcmVjdGlvbmFsVmFsdWVcIiwgXCJkb2N1bWVudEtleVwiIF0sIFpzID0gWyBcImluZGV4SWRcIiwgXCJ1aWRcIiwgXCJkb2N1bWVudEtleVwiIF0sIHRpID0gWyBcInVzZXJJZFwiLCBcImNvbGxlY3Rpb25QYXRoXCIsIFwiZG9jdW1lbnRJZFwiIF0sIGVpID0gWyBcInVzZXJJZFwiLCBcImNvbGxlY3Rpb25QYXRoXCIsIFwibGFyZ2VzdEJhdGNoSWRcIiBdLCBuaSA9IFsgXCJ1c2VySWRcIiwgXCJjb2xsZWN0aW9uR3JvdXBcIiwgXCJsYXJnZXN0QmF0Y2hJZFwiIF0sIHNpID0gWyAuLi5bIC4uLlsgLi4uWyAuLi5bIFwibXV0YXRpb25RdWV1ZXNcIiwgXCJtdXRhdGlvbnNcIiwgXCJkb2N1bWVudE11dGF0aW9uc1wiLCBcInJlbW90ZURvY3VtZW50c1wiLCBcInRhcmdldHNcIiwgXCJvd25lclwiLCBcInRhcmdldEdsb2JhbFwiLCBcInRhcmdldERvY3VtZW50c1wiIF0sIFwiY2xpZW50TWV0YWRhdGFcIiBdLCBcInJlbW90ZURvY3VtZW50R2xvYmFsXCIgXSwgXCJjb2xsZWN0aW9uUGFyZW50c1wiIF0sIFwiYnVuZGxlc1wiLCBcIm5hbWVkUXVlcmllc1wiIF0sIGlpID0gWyAuLi5zaSwgXCJkb2N1bWVudE92ZXJsYXlzXCIgXSwgcmkgPSBbIC4uLmlpLCBcImluZGV4Q29uZmlndXJhdGlvblwiLCBcImluZGV4U3RhdGVcIiwgXCJpbmRleEVudHJpZXNcIiBdO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuY29uc3Qgb2kgPSBcIlRoZSBjdXJyZW50IHRhYiBpcyBub3QgaW4gdGhlIHJlcXVpcmVkIHN0YXRlIHRvIHBlcmZvcm0gdGhpcyBvcGVyYXRpb24uIEl0IG1pZ2h0IGJlIG5lY2Vzc2FyeSB0byByZWZyZXNoIHRoZSBicm93c2VyIHRhYi5cIjtcblxuLyoqXG4gKiBBIGJhc2UgY2xhc3MgcmVwcmVzZW50aW5nIGEgcGVyc2lzdGVuY2UgdHJhbnNhY3Rpb24sIGVuY2Fwc3VsYXRpbmcgYm90aCB0aGVcbiAqIHRyYW5zYWN0aW9uJ3Mgc2VxdWVuY2UgbnVtYmVycyBhcyB3ZWxsIGFzIGEgbGlzdCBvZiBvbkNvbW1pdHRlZCBsaXN0ZW5lcnMuXG4gKlxuICogV2hlbiB5b3UgY2FsbCBQZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbigpLCBpdCB3aWxsIGNyZWF0ZSBhIHRyYW5zYWN0aW9uIGFuZFxuICogcGFzcyBpdCB0byB5b3VyIGNhbGxiYWNrLiBZb3UgdGhlbiBwYXNzIGl0IHRvIGFueSBtZXRob2QgdGhhdCBvcGVyYXRlc1xuICogb24gcGVyc2lzdGVuY2UuXG4gKi8gY2xhc3MgYWkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm9uQ29tbWl0dGVkTGlzdGVuZXJzID0gW107XG4gICAgfVxuICAgIGFkZE9uQ29tbWl0dGVkTGlzdGVuZXIodCkge1xuICAgICAgICB0aGlzLm9uQ29tbWl0dGVkTGlzdGVuZXJzLnB1c2godCk7XG4gICAgfVxuICAgIHJhaXNlT25Db21taXR0ZWRFdmVudCgpIHtcbiAgICAgICAgdGhpcy5vbkNvbW1pdHRlZExpc3RlbmVycy5mb3JFYWNoKCh0ID0+IHQoKSkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogUGVyc2lzdGVuY2VQcm9taXNlIGlzIGVzc2VudGlhbGx5IGEgcmUtaW1wbGVtZW50YXRpb24gb2YgUHJvbWlzZSBleGNlcHRcbiAqIGl0IGhhcyBhIC5uZXh0KCkgbWV0aG9kIGluc3RlYWQgb2YgLnRoZW4oKSBhbmQgLm5leHQoKSBhbmQgLmNhdGNoKCkgY2FsbGJhY2tzXG4gKiBhcmUgZXhlY3V0ZWQgc3luY2hyb25vdXNseSB3aGVuIGEgUGVyc2lzdGVuY2VQcm9taXNlIHJlc29sdmVzIHJhdGhlciB0aGFuXG4gKiBhc3luY2hyb25vdXNseSAoUHJvbWlzZSBpbXBsZW1lbnRhdGlvbnMgdXNlIHNldEltbWVkaWF0ZSgpIG9yIHNpbWlsYXIpLlxuICpcbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGludGVyb3BlcmF0ZSB3aXRoIEluZGV4ZWREQiB3aGljaCB3aWxsIGF1dG9tYXRpY2FsbHlcbiAqIGNvbW1pdCB0cmFuc2FjdGlvbnMgaWYgY29udHJvbCBpcyByZXR1cm5lZCB0byB0aGUgZXZlbnQgbG9vcCB3aXRob3V0XG4gKiBzeW5jaHJvbm91c2x5IGluaXRpYXRpbmcgYW5vdGhlciBvcGVyYXRpb24gb24gdGhlIHRyYW5zYWN0aW9uLlxuICpcbiAqIE5PVEU6IC50aGVuKCkgYW5kIC5jYXRjaCgpIG9ubHkgYWxsb3cgYSBzaW5nbGUgY29uc3VtZXIsIHVubGlrZSBub3JtYWxcbiAqIFByb21pc2VzLlxuICovIGNsYXNzIHVpIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIC8vIE5PVEU6IG5leHQvY2F0Y2hDYWxsYmFjayB3aWxsIGFsd2F5cyBwb2ludCB0byBvdXIgb3duIHdyYXBwZXIgZnVuY3Rpb25zLFxuICAgICAgICAvLyBub3QgdGhlIHVzZXIncyByYXcgbmV4dCgpIG9yIGNhdGNoKCkgY2FsbGJhY2tzLlxuICAgICAgICB0aGlzLm5leHRDYWxsYmFjayA9IG51bGwsIHRoaXMuY2F0Y2hDYWxsYmFjayA9IG51bGwsIFxuICAgICAgICAvLyBXaGVuIHRoZSBvcGVyYXRpb24gcmVzb2x2ZXMsIHdlJ2xsIHNldCByZXN1bHQgb3IgZXJyb3IgYW5kIG1hcmsgaXNEb25lLlxuICAgICAgICB0aGlzLnJlc3VsdCA9IHZvaWQgMCwgdGhpcy5lcnJvciA9IHZvaWQgMCwgdGhpcy5pc0RvbmUgPSAhMSwgXG4gICAgICAgIC8vIFNldCB0byB0cnVlIHdoZW4gLnRoZW4oKSBvciAuY2F0Y2goKSBhcmUgY2FsbGVkIGFuZCBwcmV2ZW50cyBhZGRpdGlvbmFsXG4gICAgICAgIC8vIGNoYWluaW5nLlxuICAgICAgICB0aGlzLmNhbGxiYWNrQXR0YWNoZWQgPSAhMSwgdCgodCA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzRG9uZSA9ICEwLCB0aGlzLnJlc3VsdCA9IHQsIHRoaXMubmV4dENhbGxiYWNrICYmIFxuICAgICAgICAgICAgLy8gdmFsdWUgc2hvdWxkIGJlIGRlZmluZWQgdW5sZXNzIFQgaXMgVm9pZCwgYnV0IHdlIGNhbid0IGV4cHJlc3NcbiAgICAgICAgICAgIC8vIHRoYXQgaW4gdGhlIHR5cGUgc3lzdGVtLlxuICAgICAgICAgICAgdGhpcy5uZXh0Q2FsbGJhY2sodCk7XG4gICAgICAgIH0pLCAodCA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzRG9uZSA9ICEwLCB0aGlzLmVycm9yID0gdCwgdGhpcy5jYXRjaENhbGxiYWNrICYmIHRoaXMuY2F0Y2hDYWxsYmFjayh0KTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBjYXRjaCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHQodm9pZCAwLCB0KTtcbiAgICB9XG4gICAgbmV4dCh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxiYWNrQXR0YWNoZWQgJiYgTCgpLCB0aGlzLmNhbGxiYWNrQXR0YWNoZWQgPSAhMCwgdGhpcy5pc0RvbmUgPyB0aGlzLmVycm9yID8gdGhpcy53cmFwRmFpbHVyZShlLCB0aGlzLmVycm9yKSA6IHRoaXMud3JhcFN1Y2Nlc3ModCwgdGhpcy5yZXN1bHQpIDogbmV3IHVpKCgobiwgcykgPT4ge1xuICAgICAgICAgICAgdGhpcy5uZXh0Q2FsbGJhY2sgPSBlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLndyYXBTdWNjZXNzKHQsIGUpLm5leHQobiwgcyk7XG4gICAgICAgICAgICB9LCB0aGlzLmNhdGNoQ2FsbGJhY2sgPSB0ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLndyYXBGYWlsdXJlKGUsIHQpLm5leHQobiwgcyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIHRvUHJvbWlzZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKCgodCwgZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5uZXh0KHQsIGUpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIHdyYXBVc2VyRnVuY3Rpb24odCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZSA9IHQoKTtcbiAgICAgICAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgdWkgPyBlIDogdWkucmVzb2x2ZShlKTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgcmV0dXJuIHVpLnJlamVjdCh0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB3cmFwU3VjY2Vzcyh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0ID8gdGhpcy53cmFwVXNlckZ1bmN0aW9uKCgoKSA9PiB0KGUpKSkgOiB1aS5yZXNvbHZlKGUpO1xuICAgIH1cbiAgICB3cmFwRmFpbHVyZSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0ID8gdGhpcy53cmFwVXNlckZ1bmN0aW9uKCgoKSA9PiB0KGUpKSkgOiB1aS5yZWplY3QoZSk7XG4gICAgfVxuICAgIHN0YXRpYyByZXNvbHZlKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB1aSgoKGUsIG4pID0+IHtcbiAgICAgICAgICAgIGUodCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgc3RhdGljIHJlamVjdCh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgdWkoKChlLCBuKSA9PiB7XG4gICAgICAgICAgICBuKHQpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIHN0YXRpYyB3YWl0Rm9yKFxuICAgIC8vIEFjY2VwdCBhbGwgUHJvbWlzZSB0eXBlcyBpbiB3YWl0Rm9yKCkuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICB0KSB7XG4gICAgICAgIHJldHVybiBuZXcgdWkoKChlLCBuKSA9PiB7XG4gICAgICAgICAgICBsZXQgcyA9IDAsIGkgPSAwLCByID0gITE7XG4gICAgICAgICAgICB0LmZvckVhY2goKHQgPT4ge1xuICAgICAgICAgICAgICAgICsrcywgdC5uZXh0KCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICsraSwgciAmJiBpID09PSBzICYmIGUoKTtcbiAgICAgICAgICAgICAgICB9KSwgKHQgPT4gbih0KSkpO1xuICAgICAgICAgICAgfSkpLCByID0gITAsIGkgPT09IHMgJiYgZSgpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdpdmVuIGFuIGFycmF5IG9mIHByZWRpY2F0ZSBmdW5jdGlvbnMgdGhhdCBhc3luY2hyb25vdXNseSBldmFsdWF0ZSB0byBhXG4gICAgICogYm9vbGVhbiwgaW1wbGVtZW50cyBhIHNob3J0LWNpcmN1aXRpbmcgYG9yYCBiZXR3ZWVuIHRoZSByZXN1bHRzLiBQcmVkaWNhdGVzXG4gICAgICogd2lsbCBiZSBldmFsdWF0ZWQgdW50aWwgb25lIG9mIHRoZW0gcmV0dXJucyBgdHJ1ZWAsIHRoZW4gc3RvcC4gVGhlIGZpbmFsXG4gICAgICogcmVzdWx0IHdpbGwgYmUgd2hldGhlciBhbnkgb2YgdGhlbSByZXR1cm5lZCBgdHJ1ZWAuXG4gICAgICovICAgIHN0YXRpYyBvcih0KSB7XG4gICAgICAgIGxldCBlID0gdWkucmVzb2x2ZSghMSk7XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiB0KSBlID0gZS5uZXh0KCh0ID0+IHQgPyB1aS5yZXNvbHZlKHQpIDogbigpKSk7XG4gICAgICAgIHJldHVybiBlO1xuICAgIH1cbiAgICBzdGF0aWMgZm9yRWFjaCh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBbXTtcbiAgICAgICAgcmV0dXJuIHQuZm9yRWFjaCgoKHQsIHMpID0+IHtcbiAgICAgICAgICAgIG4ucHVzaChlLmNhbGwodGhpcywgdCwgcykpO1xuICAgICAgICB9KSksIHRoaXMud2FpdEZvcihuKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vLyBSZWZlcmVuY2VzIHRvIGB3aW5kb3dgIGFyZSBndWFyZGVkIGJ5IFNpbXBsZURiLmlzQXZhaWxhYmxlKClcbi8qIGVzbGludC1kaXNhYmxlIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscyAqL1xuLyoqXG4gKiBXcmFwcyBhbiBJREJUcmFuc2FjdGlvbiBhbmQgZXhwb3NlcyBhIHN0b3JlKCkgbWV0aG9kIHRvIGdldCBhIGhhbmRsZSB0byBhXG4gKiBzcGVjaWZpYyBvYmplY3Qgc3RvcmUuXG4gKi9cbmNsYXNzIGNpIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMuYWN0aW9uID0gdCwgdGhpcy50cmFuc2FjdGlvbiA9IGUsIHRoaXMuYWJvcnRlZCA9ICExLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgYFByb21pc2VgIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBJbmRleGVkRGIgdHJhbnNhY3Rpb24uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLkF0ID0gbmV3IGosIHRoaXMudHJhbnNhY3Rpb24ub25jb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuQXQucmVzb2x2ZSgpO1xuICAgICAgICB9LCB0aGlzLnRyYW5zYWN0aW9uLm9uYWJvcnQgPSAoKSA9PiB7XG4gICAgICAgICAgICBlLmVycm9yID8gdGhpcy5BdC5yZWplY3QobmV3IGZpKHQsIGUuZXJyb3IpKSA6IHRoaXMuQXQucmVzb2x2ZSgpO1xuICAgICAgICB9LCB0aGlzLnRyYW5zYWN0aW9uLm9uZXJyb3IgPSBlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBnaShlLnRhcmdldC5lcnJvcik7XG4gICAgICAgICAgICB0aGlzLkF0LnJlamVjdChuZXcgZmkodCwgbikpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBzdGF0aWMgb3Blbih0LCBlLCBuLCBzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGNpKGUsIHQudHJhbnNhY3Rpb24ocywgbikpO1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgZmkoZSwgdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IFJ0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5BdC5wcm9taXNlO1xuICAgIH1cbiAgICBhYm9ydCh0KSB7XG4gICAgICAgIHQgJiYgdGhpcy5BdC5yZWplY3QodCksIHRoaXMuYWJvcnRlZCB8fCAoTyhcIlNpbXBsZURiXCIsIFwiQWJvcnRpbmcgdHJhbnNhY3Rpb246XCIsIHQgPyB0Lm1lc3NhZ2UgOiBcIkNsaWVudC1pbml0aWF0ZWQgYWJvcnRcIiksIFxuICAgICAgICB0aGlzLmFib3J0ZWQgPSAhMCwgdGhpcy50cmFuc2FjdGlvbi5hYm9ydCgpKTtcbiAgICB9XG4gICAgYnQoKSB7XG4gICAgICAgIC8vIElmIHRoZSBicm93c2VyIHN1cHBvcnRzIFYzIEluZGV4ZWREQiwgd2UgaW52b2tlIGNvbW1pdCgpIGV4cGxpY2l0bHkgdG9cbiAgICAgICAgLy8gc3BlZWQgdXAgaW5kZXggREIgcHJvY2Vzc2luZyBpZiB0aGUgZXZlbnQgbG9vcCByZW1haW5zIGJsb2Nrcy5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgY29uc3QgdCA9IHRoaXMudHJhbnNhY3Rpb247XG4gICAgICAgIHRoaXMuYWJvcnRlZCB8fCBcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIHQuY29tbWl0IHx8IHQuY29tbWl0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBTaW1wbGVEYlN0b3JlPEtleVR5cGUsIFZhbHVlVHlwZT4gZm9yIHRoZSBzcGVjaWZpZWQgc3RvcmUuIEFsbFxuICAgICAqIG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSBTaW1wbGVEYlN0b3JlIGhhcHBlbiB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhpc1xuICAgICAqIHRyYW5zYWN0aW9uIGFuZCBpdCBjYW5ub3QgYmUgdXNlZCBhbnltb3JlIG9uY2UgdGhlIHRyYW5zYWN0aW9uIGlzXG4gICAgICogY29tcGxldGVkLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHdlIGNhbid0IGFjdHVhbGx5IGVuZm9yY2UgdGhhdCB0aGUgS2V5VHlwZSBhbmQgVmFsdWVUeXBlIGFyZVxuICAgICAqIGNvcnJlY3QsIGJ1dCB0aGV5IGFsbG93IHR5cGUgc2FmZXR5IHRocm91Z2ggdGhlIHJlc3Qgb2YgdGhlIGNvbnN1bWluZyBjb2RlLlxuICAgICAqLyAgICBzdG9yZSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLnRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHQpO1xuICAgICAgICByZXR1cm4gbmV3IF9pKGUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQcm92aWRlcyBhIHdyYXBwZXIgYXJvdW5kIEluZGV4ZWREYiB3aXRoIGEgc2ltcGxpZmllZCBpbnRlcmZhY2UgdGhhdCB1c2VzXG4gKiBQcm9taXNlLWxpa2UgcmV0dXJuIHZhbHVlcyB0byBjaGFpbiBvcGVyYXRpb25zLiBSZWFsIHByb21pc2VzIGNhbm5vdCBiZSB1c2VkXG4gKiBzaW5jZSAudGhlbigpIGNvbnRpbnVhdGlvbnMgYXJlIGV4ZWN1dGVkIGFzeW5jaHJvbm91c2x5IChlLmcuIHZpYVxuICogLnNldEltbWVkaWF0ZSksIHdoaWNoIHdvdWxkIGNhdXNlIEluZGV4ZWREQiB0byBlbmQgdGhlIHRyYW5zYWN0aW9uLlxuICogU2VlIFBlcnNpc3RlbmNlUHJvbWlzZSBmb3IgbW9yZSBkZXRhaWxzLlxuICovIGNsYXNzIGhpIHtcbiAgICAvKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgU2ltcGxlRGIgd3JhcHBlciBmb3IgSW5kZXhlZERiIGRhdGFiYXNlIGBuYW1lYC5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCBgdmVyc2lvbmAgbXVzdCBub3QgYmUgYSBkb3duZ3JhZGUuIEluZGV4ZWREQiBkb2VzIG5vdCBzdXBwb3J0XG4gICAgICogZG93bmdyYWRpbmcgdGhlIHNjaGVtYSB2ZXJzaW9uLiBXZSBjdXJyZW50bHkgZG8gbm90IHN1cHBvcnQgYW55IHdheSB0byBkb1xuICAgICAqIHZlcnNpb25pbmcgb3V0c2lkZSBvZiBJbmRleGVkREIncyB2ZXJzaW9uaW5nIG1lY2hhbmlzbSwgYXMgb25seVxuICAgICAqIHZlcnNpb24tdXBncmFkZSB0cmFuc2FjdGlvbnMgYXJlIGFsbG93ZWQgdG8gZG8gdGhpbmdzIGxpa2UgY3JlYXRlXG4gICAgICogb2JqZWN0c3RvcmVzLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy5uYW1lID0gdCwgdGhpcy52ZXJzaW9uID0gZSwgdGhpcy5QdCA9IG47XG4gICAgICAgIC8vIE5PVEU6IEFjY29yZGluZyB0byBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTk3MDUwLCB0aGVcbiAgICAgICAgLy8gYnVnIHdlJ3JlIGNoZWNraW5nIGZvciBzaG91bGQgZXhpc3QgaW4gaU9TID49IDEyLjIgYW5kIDwgMTMsIGJ1dCBmb3JcbiAgICAgICAgLy8gd2hhdGV2ZXIgcmVhc29uIGl0J3MgbXVjaCBoYXJkZXIgdG8gaGl0IGFmdGVyIDEyLjIgc28gd2Ugb25seSBwcm9hY3RpdmVseVxuICAgICAgICAvLyBsb2cgb24gMTIuMi5cbiAgICAgICAgMTIuMiA9PT0gaGkuVnQoZ2V0VUEoKSkgJiYgJChcIkZpcmVzdG9yZSBwZXJzaXN0ZW5jZSBzdWZmZXJzIGZyb20gYSBidWcgaW4gaU9TIDEyLjIgU2FmYXJpIHRoYXQgbWF5IGNhdXNlIHlvdXIgYXBwIHRvIHN0b3Agd29ya2luZy4gU2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcS81NjQ5NjI5Ni8xMTA5MTUgZm9yIGRldGFpbHMgYW5kIGEgcG90ZW50aWFsIHdvcmthcm91bmQuXCIpO1xuICAgIH1cbiAgICAvKiogRGVsZXRlcyB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlLiAqLyAgICBzdGF0aWMgZGVsZXRlKHQpIHtcbiAgICAgICAgcmV0dXJuIE8oXCJTaW1wbGVEYlwiLCBcIlJlbW92aW5nIGRhdGFiYXNlOlwiLCB0KSwgd2kod2luZG93LmluZGV4ZWREQi5kZWxldGVEYXRhYmFzZSh0KSkudG9Qcm9taXNlKCk7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgSW5kZXhlZERCIGlzIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudC4gKi8gICAgc3RhdGljIHZ0KCkge1xuICAgICAgICBpZiAoIWlzSW5kZXhlZERCQXZhaWxhYmxlKCkpIHJldHVybiAhMTtcbiAgICAgICAgaWYgKGhpLlN0KCkpIHJldHVybiAhMDtcbiAgICAgICAgLy8gV2UgZXh0ZW5zaXZlbHkgdXNlIGluZGV4ZWQgYXJyYXkgdmFsdWVzIGFuZCBjb21wb3VuZCBrZXlzLFxuICAgICAgICAvLyB3aGljaCBJRSBhbmQgRWRnZSBkbyBub3Qgc3VwcG9ydC4gSG93ZXZlciwgdGhleSBzdGlsbCBoYXZlIGluZGV4ZWREQlxuICAgICAgICAvLyBkZWZpbmVkIG9uIHRoZSB3aW5kb3csIHNvIHdlIG5lZWQgdG8gY2hlY2sgZm9yIHRoZW0gaGVyZSBhbmQgbWFrZSBzdXJlXG4gICAgICAgIC8vIHRvIHJldHVybiB0aGF0IHBlcnNpc3RlbmNlIGlzIG5vdCBlbmFibGVkIGZvciB0aG9zZSBicm93c2Vycy5cbiAgICAgICAgLy8gRm9yIHRyYWNraW5nIHN1cHBvcnQgb2YgdGhpcyBmZWF0dXJlLCBzZWUgaGVyZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9lbi11cy9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9zdGF0dXMvaW5kZXhlZGRiYXJyYXlzYW5kbXVsdGllbnRyeXN1cHBvcnQvXG4gICAgICAgIC8vIENoZWNrIHRoZSBVQSBzdHJpbmcgdG8gZmluZCBvdXQgdGhlIGJyb3dzZXIuXG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IGdldFVBKCksIGUgPSBoaS5WdCh0KSwgbiA9IDAgPCBlICYmIGUgPCAxMCwgcyA9IGhpLkR0KHQpLCBpID0gMCA8IHMgJiYgcyA8IDQuNTtcbiAgICAgICAgLy8gSUUgMTBcbiAgICAgICAgLy8gdWEgPSAnTW96aWxsYS81LjAgKGNvbXBhdGlibGU7IE1TSUUgMTAuMDsgV2luZG93cyBOVCA2LjI7IFRyaWRlbnQvNi4wKSc7XG4gICAgICAgIC8vIElFIDExXG4gICAgICAgIC8vIHVhID0gJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDYuMzsgVHJpZGVudC83LjA7IHJ2OjExLjApIGxpa2UgR2Vja28nO1xuICAgICAgICAvLyBFZGdlXG4gICAgICAgIC8vIHVhID0gJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdPVzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLFxuICAgICAgICAvLyBsaWtlIEdlY2tvKSBDaHJvbWUvMzkuMC4yMTcxLjcxIFNhZmFyaS81MzcuMzYgRWRnZS8xMi4wJztcbiAgICAgICAgLy8gaU9TIFNhZmFyaTogRGlzYWJsZSBmb3IgdXNlcnMgcnVubmluZyBpT1MgdmVyc2lvbiA8IDEwLlxuICAgICAgICAgICAgICAgIHJldHVybiAhKHQuaW5kZXhPZihcIk1TSUUgXCIpID4gMCB8fCB0LmluZGV4T2YoXCJUcmlkZW50L1wiKSA+IDAgfHwgdC5pbmRleE9mKFwiRWRnZS9cIikgPiAwIHx8IG4gfHwgaSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYmFja2luZyBJbmRleGVkREIgc3RvcmUgaXMgdGhlIE5vZGUgSW5kZXhlZERCU2hpbVxuICAgICAqIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL2F4ZW1jbGlvbi9JbmRleGVkREJTaGltKS5cbiAgICAgKi8gICAgc3RhdGljIFN0KCkge1xuICAgICAgICB2YXIgdDtcbiAgICAgICAgcmV0dXJuIFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIHByb2Nlc3MgJiYgXCJZRVNcIiA9PT0gKG51bGwgPT09ICh0ID0gcHJvY2Vzcy5lbnYpIHx8IHZvaWQgMCA9PT0gdCA/IHZvaWQgMCA6IHQuQ3QpO1xuICAgIH1cbiAgICAvKiogSGVscGVyIHRvIGdldCBhIHR5cGVkIFNpbXBsZURiU3RvcmUgZnJvbSBhIHRyYW5zYWN0aW9uLiAqLyAgICBzdGF0aWMgeHQodCwgZSkge1xuICAgICAgICByZXR1cm4gdC5zdG9yZShlKTtcbiAgICB9XG4gICAgLy8gdmlzaWJsZSBmb3IgdGVzdGluZ1xuICAgIC8qKiBQYXJzZSBVc2VyIEFnZW50IHRvIGRldGVybWluZSBpT1MgdmVyc2lvbi4gUmV0dXJucyAtMSBpZiBub3QgZm91bmQuICovXG4gICAgc3RhdGljIFZ0KHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQubWF0Y2goL2koPzpwaG9uZXxwYWR8cG9kKSBvcyAoW1xcZF9dKykvaSksIG4gPSBlID8gZVsxXS5zcGxpdChcIl9cIikuc2xpY2UoMCwgMikuam9pbihcIi5cIikgOiBcIi0xXCI7XG4gICAgICAgIHJldHVybiBOdW1iZXIobik7XG4gICAgfVxuICAgIC8vIHZpc2libGUgZm9yIHRlc3RpbmdcbiAgICAvKiogUGFyc2UgVXNlciBBZ2VudCB0byBkZXRlcm1pbmUgQW5kcm9pZCB2ZXJzaW9uLiBSZXR1cm5zIC0xIGlmIG5vdCBmb3VuZC4gKi9cbiAgICBzdGF0aWMgRHQodCkge1xuICAgICAgICBjb25zdCBlID0gdC5tYXRjaCgvQW5kcm9pZCAoW1xcZC5dKykvaSksIG4gPSBlID8gZVsxXS5zcGxpdChcIi5cIikuc2xpY2UoMCwgMikuam9pbihcIi5cIikgOiBcIi0xXCI7XG4gICAgICAgIHJldHVybiBOdW1iZXIobik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9wZW5zIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2UsIGNyZWF0aW5nIG9yIHVwZ3JhZGluZyBpdCBpZiBuZWNlc3NhcnkuXG4gICAgICovICAgIGFzeW5jIE50KHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGIgfHwgKE8oXCJTaW1wbGVEYlwiLCBcIk9wZW5pbmcgZGF0YWJhc2U6XCIsIHRoaXMubmFtZSksIHRoaXMuZGIgPSBhd2FpdCBuZXcgUHJvbWlzZSgoKGUsIG4pID0+IHtcbiAgICAgICAgICAgIC8vIFRPRE8obWlrZWxlaGVuKTogSW52ZXN0aWdhdGUgYnJvd3NlciBjb21wYXRpYmlsaXR5LlxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0luZGV4ZWREQl9BUEkvVXNpbmdfSW5kZXhlZERCXG4gICAgICAgICAgICAvLyBzdWdnZXN0cyBJRTkgYW5kIG9sZGVyIFdlYktpdCBicm93c2VycyBoYW5kbGUgdXBncmFkZVxuICAgICAgICAgICAgLy8gZGlmZmVyZW50bHkuIFRoZXkgZXhwZWN0IHNldFZlcnNpb24sIGFzIGRlc2NyaWJlZCBoZXJlOlxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0lEQlZlcnNpb25DaGFuZ2VSZXF1ZXN0L3NldFZlcnNpb25cbiAgICAgICAgICAgIGNvbnN0IHMgPSBpbmRleGVkREIub3Blbih0aGlzLm5hbWUsIHRoaXMudmVyc2lvbik7XG4gICAgICAgICAgICBzLm9uc3VjY2VzcyA9IHQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0LnRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgZShuKTtcbiAgICAgICAgICAgIH0sIHMub25ibG9ja2VkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIG4obmV3IGZpKHQsIFwiQ2Fubm90IHVwZ3JhZGUgSW5kZXhlZERCIHNjaGVtYSB3aGlsZSBhbm90aGVyIHRhYiBpcyBvcGVuLiBDbG9zZSBhbGwgdGFicyB0aGF0IGFjY2VzcyBGaXJlc3RvcmUgYW5kIHJlbG9hZCB0aGlzIHBhZ2UgdG8gcHJvY2VlZC5cIikpO1xuICAgICAgICAgICAgfSwgcy5vbmVycm9yID0gZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IGUudGFyZ2V0LmVycm9yO1xuICAgICAgICAgICAgICAgIFwiVmVyc2lvbkVycm9yXCIgPT09IHMubmFtZSA/IG4obmV3IFEoRy5GQUlMRURfUFJFQ09ORElUSU9OLCBcIkEgbmV3ZXIgdmVyc2lvbiBvZiB0aGUgRmlyZXN0b3JlIFNESyB3YXMgcHJldmlvdXNseSB1c2VkIGFuZCBzbyB0aGUgcGVyc2lzdGVkIGRhdGEgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiBvZiB0aGUgU0RLIHlvdSBhcmUgbm93IHVzaW5nLiBUaGUgU0RLIHdpbGwgb3BlcmF0ZSB3aXRoIHBlcnNpc3RlbmNlIGRpc2FibGVkLiBJZiB5b3UgbmVlZCBwZXJzaXN0ZW5jZSwgcGxlYXNlIHJlLXVwZ3JhZGUgdG8gYSBuZXdlciB2ZXJzaW9uIG9mIHRoZSBTREsgb3IgZWxzZSBjbGVhciB0aGUgcGVyc2lzdGVkIEluZGV4ZWREQiBkYXRhIGZvciB5b3VyIGFwcCB0byBzdGFydCBmcmVzaC5cIikpIDogXCJJbnZhbGlkU3RhdGVFcnJvclwiID09PSBzLm5hbWUgPyBuKG5ldyBRKEcuRkFJTEVEX1BSRUNPTkRJVElPTiwgXCJVbmFibGUgdG8gb3BlbiBhbiBJbmRleGVkREIgY29ubmVjdGlvbi4gVGhpcyBjb3VsZCBiZSBkdWUgdG8gcnVubmluZyBpbiBhIHByaXZhdGUgYnJvd3Npbmcgc2Vzc2lvbiBvbiBhIGJyb3dzZXIgd2hvc2UgcHJpdmF0ZSBicm93c2luZyBzZXNzaW9ucyBkbyBub3Qgc3VwcG9ydCBJbmRleGVkREI6IFwiICsgcykpIDogbihuZXcgZmkodCwgcykpO1xuICAgICAgICAgICAgfSwgcy5vbnVwZ3JhZGVuZWVkZWQgPSB0ID0+IHtcbiAgICAgICAgICAgICAgICBPKFwiU2ltcGxlRGJcIiwgJ0RhdGFiYXNlIFwiJyArIHRoaXMubmFtZSArICdcIiByZXF1aXJlcyB1cGdyYWRlIGZyb20gdmVyc2lvbjonLCB0Lm9sZFZlcnNpb24pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0LnRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgdGhpcy5QdC5rdChlLCBzLnRyYW5zYWN0aW9uLCB0Lm9sZFZlcnNpb24sIHRoaXMudmVyc2lvbikubmV4dCgoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBPKFwiU2ltcGxlRGJcIiwgXCJEYXRhYmFzZSB1cGdyYWRlIHRvIHZlcnNpb24gXCIgKyB0aGlzLnZlcnNpb24gKyBcIiBjb21wbGV0ZVwiKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSkpLCB0aGlzLk10ICYmICh0aGlzLmRiLm9udmVyc2lvbmNoYW5nZSA9IHQgPT4gdGhpcy5NdCh0KSksIHRoaXMuZGI7XG4gICAgfVxuICAgIE90KHQpIHtcbiAgICAgICAgdGhpcy5NdCA9IHQsIHRoaXMuZGIgJiYgKHRoaXMuZGIub252ZXJzaW9uY2hhbmdlID0gZSA9PiB0KGUpKTtcbiAgICB9XG4gICAgYXN5bmMgcnVuVHJhbnNhY3Rpb24odCwgZSwgbiwgcykge1xuICAgICAgICBjb25zdCBpID0gXCJyZWFkb25seVwiID09PSBlO1xuICAgICAgICBsZXQgciA9IDA7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICsrcjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYiA9IGF3YWl0IHRoaXMuTnQodCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IGNpLm9wZW4odGhpcy5kYiwgdCwgaSA/IFwicmVhZG9ubHlcIiA6IFwicmVhZHdyaXRlXCIsIG4pLCByID0gcyhlKS5uZXh0KCh0ID0+IChlLmJ0KCksIFxuICAgICAgICAgICAgICAgIHQpKSkuY2F0Y2goKHQgPT4gKFxuICAgICAgICAgICAgICAgIC8vIEFib3J0IHRoZSB0cmFuc2FjdGlvbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IuXG4gICAgICAgICAgICAgICAgZS5hYm9ydCh0KSwgdWkucmVqZWN0KHQpKSkpLnRvUHJvbWlzZSgpO1xuICAgICAgICAgICAgICAgIC8vIEFzIG5vdGVkIGFib3ZlLCBlcnJvcnMgYXJlIHByb3BhZ2F0ZWQgYnkgYWJvcnRpbmcgdGhlIHRyYW5zYWN0aW9uLiBTb1xuICAgICAgICAgICAgICAgIC8vIHdlIHN3YWxsb3cgYW55IGVycm9yIGhlcmUgdG8gYXZvaWQgdGhlIGJyb3dzZXIgbG9nZ2luZyBpdCBhcyB1bmhhbmRsZWQuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHIuY2F0Y2goKCgpID0+IHt9KSksIFxuICAgICAgICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSB0cmFuc2FjdGlvbiB0byBjb21wbGV0ZSAoaS5lLiBJbmRleGVkRGIncyBvbnN1Y2Nlc3MgZXZlbnQgdG9cbiAgICAgICAgICAgICAgICAvLyBmaXJlKSwgYnV0IHN0aWxsIHJldHVybiB0aGUgb3JpZ2luYWwgdHJhbnNhY3Rpb25GblJlc3VsdCBiYWNrIHRvIHRoZVxuICAgICAgICAgICAgICAgIC8vIGNhbGxlci5cbiAgICAgICAgICAgICAgICBhd2FpdCBlLlJ0LCByO1xuICAgICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgICAgIC8vIFRPRE8oc2NobWlkdC1zZWJhc3RpYW4pOiBXZSBjb3VsZCBwcm9iYWJseSBiZSBzbWFydGVyIGFib3V0IHRoaXMgYW5kXG4gICAgICAgICAgICAgICAgLy8gbm90IHJldHJ5IGV4Y2VwdGlvbnMgdGhhdCBhcmUgbGlrZWx5IHVucmVjb3ZlcmFibGUgKHN1Y2ggYXMgcXVvdGFcbiAgICAgICAgICAgICAgICAvLyBleGNlZWRlZCBlcnJvcnMpLlxuICAgICAgICAgICAgICAgIC8vIE5vdGU6IFdlIGNhbm5vdCB1c2UgYW4gaW5zdGFuY2VvZiBjaGVjayBmb3IgRmlyZXN0b3JlRXhjZXB0aW9uLCBzaW5jZSB0aGVcbiAgICAgICAgICAgICAgICAvLyBleGNlcHRpb24gaXMgd3JhcHBlZCBpbiBhIGdlbmVyaWMgZXJyb3IgYnkgb3VyIGFzeW5jL2F3YWl0IGhhbmRsaW5nLlxuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBcIkZpcmViYXNlRXJyb3JcIiAhPT0gdC5uYW1lICYmIHIgPCAzO1xuICAgICAgICAgICAgICAgIGlmIChPKFwiU2ltcGxlRGJcIiwgXCJUcmFuc2FjdGlvbiBmYWlsZWQgd2l0aCBlcnJvcjpcIiwgdC5tZXNzYWdlLCBcIlJldHJ5aW5nOlwiLCBlKSwgXG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpLCAhZSkgcmV0dXJuIFByb21pc2UucmVqZWN0KHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNsb3NlKCkge1xuICAgICAgICB0aGlzLmRiICYmIHRoaXMuZGIuY2xvc2UoKSwgdGhpcy5kYiA9IHZvaWQgMDtcbiAgICB9XG59XG5cbi8qKlxuICogQSBjb250cm9sbGVyIGZvciBpdGVyYXRpbmcgb3ZlciBhIGtleSByYW5nZSBvciBpbmRleC4gSXQgYWxsb3dzIGFuIGl0ZXJhdGVcbiAqIGNhbGxiYWNrIHRvIGRlbGV0ZSB0aGUgY3VycmVudGx5LXJlZmVyZW5jZWQgb2JqZWN0LCBvciBqdW1wIHRvIGEgbmV3IGtleVxuICogd2l0aGluIHRoZSBrZXkgcmFuZ2Ugb3IgaW5kZXguXG4gKi8gY2xhc3MgbGkge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy4kdCA9IHQsIHRoaXMuRnQgPSAhMSwgdGhpcy5CdCA9IG51bGw7XG4gICAgfVxuICAgIGdldCBpc0RvbmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkZ0O1xuICAgIH1cbiAgICBnZXQgTHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJ0O1xuICAgIH1cbiAgICBzZXQgY3Vyc29yKHQpIHtcbiAgICAgICAgdGhpcy4kdCA9IHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCB0byBzdG9wIGl0ZXJhdGlvbiBhdCBhbnkgcG9pbnQuXG4gICAgICovICAgIGRvbmUoKSB7XG4gICAgICAgIHRoaXMuRnQgPSAhMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIHRvIHNraXAgdG8gdGhhdCBuZXh0IGtleSwgd2hpY2ggY291bGQgYmVcbiAgICAgKiBhbiBpbmRleCBvciBhIHByaW1hcnkga2V5LlxuICAgICAqLyAgICBxdCh0KSB7XG4gICAgICAgIHRoaXMuQnQgPSB0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxldGUgdGhlIGN1cnJlbnQgY3Vyc29yIHZhbHVlIGZyb20gdGhlIG9iamVjdCBzdG9yZS5cbiAgICAgKlxuICAgICAqIE5PVEU6IFlvdSBDQU5OT1QgZG8gdGhpcyB3aXRoIGEga2V5c09ubHkgcXVlcnkuXG4gICAgICovICAgIGRlbGV0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHdpKHRoaXMuJHQuZGVsZXRlKCkpO1xuICAgIH1cbn1cblxuLyoqIEFuIGVycm9yIHRoYXQgd3JhcHMgZXhjZXB0aW9ucyB0aGF0IHRocm93biBkdXJpbmcgSW5kZXhlZERCIGV4ZWN1dGlvbi4gKi8gY2xhc3MgZmkgZXh0ZW5kcyBRIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKEcuVU5BVkFJTEFCTEUsIGBJbmRleGVkREIgdHJhbnNhY3Rpb24gJyR7dH0nIGZhaWxlZDogJHtlfWApLCB0aGlzLm5hbWUgPSBcIkluZGV4ZWREYlRyYW5zYWN0aW9uRXJyb3JcIjtcbiAgICB9XG59XG5cbi8qKiBWZXJpZmllcyB3aGV0aGVyIGBlYCBpcyBhbiBJbmRleGVkRGJUcmFuc2FjdGlvbkVycm9yLiAqLyBmdW5jdGlvbiBkaSh0KSB7XG4gICAgLy8gVXNlIG5hbWUgZXF1YWxpdHksIGFzIGluc3RhbmNlb2YgY2hlY2tzIG9uIGVycm9ycyBkb24ndCB3b3JrIHdpdGggZXJyb3JzXG4gICAgLy8gdGhhdCB3cmFwIG90aGVyIGVycm9ycy5cbiAgICByZXR1cm4gXCJJbmRleGVkRGJUcmFuc2FjdGlvbkVycm9yXCIgPT09IHQubmFtZTtcbn1cblxuLyoqXG4gKiBBIHdyYXBwZXIgYXJvdW5kIGFuIElEQk9iamVjdFN0b3JlIHByb3ZpZGluZyBhbiBBUEkgdGhhdDpcbiAqXG4gKiAxKSBIYXMgZ2VuZXJpYyBLZXlUeXBlIC8gVmFsdWVUeXBlIHBhcmFtZXRlcnMgdG8gcHJvdmlkZSBzdHJvbmdseS10eXBlZFxuICogbWV0aG9kcyBmb3IgYWN0aW5nIGFnYWluc3QgdGhlIG9iamVjdCBzdG9yZS5cbiAqIDIpIERlYWxzIHdpdGggSW5kZXhlZERCJ3Mgb25zdWNjZXNzIC8gb25lcnJvciBldmVudCBjYWxsYmFja3MsIG1ha2luZyBldmVyeVxuICogbWV0aG9kIHJldHVybiBhIFBlcnNpc3RlbmNlUHJvbWlzZSBpbnN0ZWFkLlxuICogMykgUHJvdmlkZXMgYSBoaWdoZXItbGV2ZWwgQVBJIHRvIGF2b2lkIG5lZWRpbmcgdG8gZG8gZXhjZXNzaXZlIHdyYXBwaW5nIG9mXG4gKiBpbnRlcm1lZGlhdGUgSW5kZXhlZERCIHR5cGVzIChJREJDdXJzb3JXaXRoVmFsdWUsIGV0Yy4pXG4gKi8gY2xhc3MgX2kge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5zdG9yZSA9IHQ7XG4gICAgfVxuICAgIHB1dCh0LCBlKSB7XG4gICAgICAgIGxldCBuO1xuICAgICAgICByZXR1cm4gdm9pZCAwICE9PSBlID8gKE8oXCJTaW1wbGVEYlwiLCBcIlBVVFwiLCB0aGlzLnN0b3JlLm5hbWUsIHQsIGUpLCBuID0gdGhpcy5zdG9yZS5wdXQoZSwgdCkpIDogKE8oXCJTaW1wbGVEYlwiLCBcIlBVVFwiLCB0aGlzLnN0b3JlLm5hbWUsIFwiPGF1dG8ta2V5PlwiLCB0KSwgXG4gICAgICAgIG4gPSB0aGlzLnN0b3JlLnB1dCh0KSksIHdpKG4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgbmV3IHZhbHVlIGludG8gYW4gT2JqZWN0IFN0b3JlIGFuZCByZXR1cm5zIHRoZSBuZXcga2V5LiBTaW1pbGFyIHRvXG4gICAgICogSW5kZXhlZERiJ3MgYGFkZCgpYCwgdGhpcyBtZXRob2Qgd2lsbCBmYWlsIG9uIHByaW1hcnkga2V5IGNvbGxpc2lvbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgb2JqZWN0IHRvIHdyaXRlLlxuICAgICAqIEByZXR1cm5zIFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGFkZC5cbiAgICAgKi8gICAgYWRkKHQpIHtcbiAgICAgICAgTyhcIlNpbXBsZURiXCIsIFwiQUREXCIsIHRoaXMuc3RvcmUubmFtZSwgdCwgdCk7XG4gICAgICAgIHJldHVybiB3aSh0aGlzLnN0b3JlLmFkZCh0KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhlIHNwZWNpZmllZCBzdG9yZSwgb3IgbnVsbFxuICAgICAqIGlmIG5vIG9iamVjdCBleGlzdHMgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS5cbiAgICAgKlxuICAgICAqIEBrZXkgVGhlIGtleSBvZiB0aGUgb2JqZWN0IHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyBUaGUgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBrZXkgb3IgbnVsbCBpZiBubyBvYmplY3QgZXhpc3RzLlxuICAgICAqLyAgICBnZXQodCkge1xuICAgICAgICAvLyBXZSdyZSBkb2luZyBhbiB1bnNhZmUgY2FzdCB0byBWYWx1ZVR5cGUuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHJldHVybiB3aSh0aGlzLnN0b3JlLmdldCh0KSkubmV4dCgoZSA9PiAoXG4gICAgICAgIC8vIE5vcm1hbGl6ZSBub25leGlzdGVuY2UgdG8gbnVsbC5cbiAgICAgICAgdm9pZCAwID09PSBlICYmIChlID0gbnVsbCksIE8oXCJTaW1wbGVEYlwiLCBcIkdFVFwiLCB0aGlzLnN0b3JlLm5hbWUsIHQsIGUpLCBlKSkpO1xuICAgIH1cbiAgICBkZWxldGUodCkge1xuICAgICAgICBPKFwiU2ltcGxlRGJcIiwgXCJERUxFVEVcIiwgdGhpcy5zdG9yZS5uYW1lLCB0KTtcbiAgICAgICAgcmV0dXJuIHdpKHRoaXMuc3RvcmUuZGVsZXRlKHQpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgd2UgZXZlciBuZWVkIG1vcmUgb2YgdGhlIGNvdW50IHZhcmlhbnRzLCB3ZSBjYW4gYWRkIG92ZXJsb2Fkcy4gRm9yIG5vdyxcbiAgICAgKiBhbGwgd2UgbmVlZCBpcyB0byBjb3VudCBldmVyeXRoaW5nIGluIGEgc3RvcmUuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgc3RvcmUuXG4gICAgICovICAgIGNvdW50KCkge1xuICAgICAgICBPKFwiU2ltcGxlRGJcIiwgXCJDT1VOVFwiLCB0aGlzLnN0b3JlLm5hbWUpO1xuICAgICAgICByZXR1cm4gd2kodGhpcy5zdG9yZS5jb3VudCgpKTtcbiAgICB9XG4gICAgVXQodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gdGhpcy5vcHRpb25zKHQsIGUpO1xuICAgICAgICAvLyBVc2UgYGdldEFsbCgpYCBpZiB0aGUgYnJvd3NlciBzdXBwb3J0cyBJbmRleGVkREIgdjMsIGFzIGl0IGlzIHJvdWdobHlcbiAgICAgICAgLy8gMjAlIGZhc3Rlci4gVW5mb3J0dW5hdGVseSwgZ2V0QWxsKCkgZG9lcyBub3Qgc3VwcG9ydCBjdXN0b20gaW5kaWNlcy5cbiAgICAgICAgICAgICAgICBpZiAobi5pbmRleCB8fCBcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIHRoaXMuc3RvcmUuZ2V0QWxsKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5jdXJzb3IobiksIGUgPSBbXTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLkt0KHQsICgodCwgbikgPT4ge1xuICAgICAgICAgICAgICAgIGUucHVzaChuKTtcbiAgICAgICAgICAgIH0pKS5uZXh0KCgoKSA9PiBlKSk7XG4gICAgICAgIH1cbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuc3RvcmUuZ2V0QWxsKG4ucmFuZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyB1aSgoKGUsIG4pID0+IHtcbiAgICAgICAgICAgICAgICB0Lm9uZXJyb3IgPSB0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbih0LnRhcmdldC5lcnJvcik7XG4gICAgICAgICAgICAgICAgfSwgdC5vbnN1Y2Nlc3MgPSB0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZSh0LnRhcmdldC5yZXN1bHQpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIGZpcnN0IGBjb3VudGAgZWxlbWVudHMgZnJvbSB0aGUgcHJvdmlkZWQgaW5kZXggcmFuZ2UuIExvYWRzIGFsbFxuICAgICAqIGVsZW1lbnRzIGlmIG5vIGxpbWl0IGlzIHByb3ZpZGVkLlxuICAgICAqLyAgICBHdCh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLnN0b3JlLmdldEFsbCh0LCBudWxsID09PSBlID8gdm9pZCAwIDogZSk7XG4gICAgICAgIHJldHVybiBuZXcgdWkoKCh0LCBlKSA9PiB7XG4gICAgICAgICAgICBuLm9uZXJyb3IgPSB0ID0+IHtcbiAgICAgICAgICAgICAgICBlKHQudGFyZ2V0LmVycm9yKTtcbiAgICAgICAgICAgIH0sIG4ub25zdWNjZXNzID0gZSA9PiB7XG4gICAgICAgICAgICAgICAgdChlLnRhcmdldC5yZXN1bHQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBRdCh0LCBlKSB7XG4gICAgICAgIE8oXCJTaW1wbGVEYlwiLCBcIkRFTEVURSBBTExcIiwgdGhpcy5zdG9yZS5uYW1lKTtcbiAgICAgICAgY29uc3QgbiA9IHRoaXMub3B0aW9ucyh0LCBlKTtcbiAgICAgICAgbi5qdCA9ICExO1xuICAgICAgICBjb25zdCBzID0gdGhpcy5jdXJzb3Iobik7XG4gICAgICAgIHJldHVybiB0aGlzLkt0KHMsICgodCwgZSwgbikgPT4gbi5kZWxldGUoKSkpO1xuICAgIH1cbiAgICBXdCh0LCBlKSB7XG4gICAgICAgIGxldCBuO1xuICAgICAgICBlID8gbiA9IHQgOiAobiA9IHt9LCBlID0gdCk7XG4gICAgICAgIGNvbnN0IHMgPSB0aGlzLmN1cnNvcihuKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuS3QocywgZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgYSBzdG9yZSwgYnV0IHdhaXRzIGZvciB0aGUgZ2l2ZW4gY2FsbGJhY2sgdG8gY29tcGxldGUgZm9yXG4gICAgICogZWFjaCBlbnRyeSBiZWZvcmUgaXRlcmF0aW5nIHRoZSBuZXh0IGVudHJ5LiBUaGlzIGFsbG93cyB0aGUgY2FsbGJhY2sgdG8gZG9cbiAgICAgKiBhc3luY2hyb25vdXMgd29yayB0byBkZXRlcm1pbmUgaWYgdGhpcyBpdGVyYXRpb24gc2hvdWxkIGNvbnRpbnVlLlxuICAgICAqXG4gICAgICogVGhlIHByb3ZpZGVkIGNhbGxiYWNrIHNob3VsZCByZXR1cm4gYHRydWVgIHRvIGNvbnRpbnVlIGl0ZXJhdGlvbiwgYW5kXG4gICAgICogYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICovICAgIHp0KHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMuY3Vyc29yKHt9KTtcbiAgICAgICAgcmV0dXJuIG5ldyB1aSgoKG4sIHMpID0+IHtcbiAgICAgICAgICAgIGUub25lcnJvciA9IHQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBnaSh0LnRhcmdldC5lcnJvcik7XG4gICAgICAgICAgICAgICAgcyhlKTtcbiAgICAgICAgICAgIH0sIGUub25zdWNjZXNzID0gZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICAgICAgICBzID8gdChzLnByaW1hcnlLZXksIHMudmFsdWUpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0ID8gcy5jb250aW51ZSgpIDogbigpO1xuICAgICAgICAgICAgICAgIH0pKSA6IG4oKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgS3QodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gW107XG4gICAgICAgIHJldHVybiBuZXcgdWkoKChzLCBpKSA9PiB7XG4gICAgICAgICAgICB0Lm9uZXJyb3IgPSB0ID0+IHtcbiAgICAgICAgICAgICAgICBpKHQudGFyZ2V0LmVycm9yKTtcbiAgICAgICAgICAgIH0sIHQub25zdWNjZXNzID0gdCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaSA9IHQudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoIWkpIHJldHVybiB2b2lkIHMoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByID0gbmV3IGxpKGkpLCBvID0gZShpLnByaW1hcnlLZXksIGkudmFsdWUsIHIpO1xuICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgdWkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IG8uY2F0Y2goKHQgPT4gKHIuZG9uZSgpLCB1aS5yZWplY3QodCkpKSk7XG4gICAgICAgICAgICAgICAgICAgIG4ucHVzaCh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgci5pc0RvbmUgPyBzKCkgOiBudWxsID09PSByLkx0ID8gaS5jb250aW51ZSgpIDogaS5jb250aW51ZShyLkx0KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiB1aS53YWl0Rm9yKG4pKSk7XG4gICAgfVxuICAgIG9wdGlvbnModCwgZSkge1xuICAgICAgICBsZXQgbjtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gdCAmJiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCA/IG4gPSB0IDogZSA9IHQpLCB7XG4gICAgICAgICAgICBpbmRleDogbixcbiAgICAgICAgICAgIHJhbmdlOiBlXG4gICAgICAgIH07XG4gICAgfVxuICAgIGN1cnNvcih0KSB7XG4gICAgICAgIGxldCBlID0gXCJuZXh0XCI7XG4gICAgICAgIGlmICh0LnJldmVyc2UgJiYgKGUgPSBcInByZXZcIiksIHQuaW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLnN0b3JlLmluZGV4KHQuaW5kZXgpO1xuICAgICAgICAgICAgcmV0dXJuIHQuanQgPyBuLm9wZW5LZXlDdXJzb3IodC5yYW5nZSwgZSkgOiBuLm9wZW5DdXJzb3IodC5yYW5nZSwgZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUub3BlbkN1cnNvcih0LnJhbmdlLCBlKTtcbiAgICB9XG59XG5cbi8qKlxuICogV3JhcHMgYW4gSURCUmVxdWVzdCBpbiBhIFBlcnNpc3RlbmNlUHJvbWlzZSwgdXNpbmcgdGhlIG9uc3VjY2VzcyAvIG9uZXJyb3JcbiAqIGhhbmRsZXJzIHRvIHJlc29sdmUgLyByZWplY3QgdGhlIFBlcnNpc3RlbmNlUHJvbWlzZSBhcyBhcHByb3ByaWF0ZS5cbiAqLyBmdW5jdGlvbiB3aSh0KSB7XG4gICAgcmV0dXJuIG5ldyB1aSgoKGUsIG4pID0+IHtcbiAgICAgICAgdC5vbnN1Y2Nlc3MgPSB0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0LnRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICBlKG4pO1xuICAgICAgICB9LCB0Lm9uZXJyb3IgPSB0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBnaSh0LnRhcmdldC5lcnJvcik7XG4gICAgICAgICAgICBuKGUpO1xuICAgICAgICB9O1xuICAgIH0pKTtcbn1cblxuLy8gR3VhcmQgc28gd2Ugb25seSByZXBvcnQgdGhlIGVycm9yIG9uY2UuXG5sZXQgbWkgPSAhMTtcblxuZnVuY3Rpb24gZ2kodCkge1xuICAgIGNvbnN0IGUgPSBoaS5WdChnZXRVQSgpKTtcbiAgICBpZiAoZSA+PSAxMi4yICYmIGUgPCAxMykge1xuICAgICAgICBjb25zdCBlID0gXCJBbiBpbnRlcm5hbCBlcnJvciB3YXMgZW5jb3VudGVyZWQgaW4gdGhlIEluZGV4ZWQgRGF0YWJhc2Ugc2VydmVyXCI7XG4gICAgICAgIGlmICh0Lm1lc3NhZ2UuaW5kZXhPZihlKSA+PSAwKSB7XG4gICAgICAgICAgICAvLyBXcmFwIGVycm9yIGluIGEgbW9yZSBkZXNjcmlwdGl2ZSBvbmUuXG4gICAgICAgICAgICBjb25zdCB0ID0gbmV3IFEoXCJpbnRlcm5hbFwiLCBgSU9TX0lOREVYRUREQl9CVUcxOiBJbmRleGVkRGIgaGFzIHRocm93biAnJHtlfScuIFRoaXMgaXMgbGlrZWx5IGR1ZSB0byBhbiB1bmF2b2lkYWJsZSBidWcgaW4gaU9TLiBTZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xLzU2NDk2Mjk2LzExMDkxNSBmb3IgZGV0YWlscyBhbmQgYSBwb3RlbnRpYWwgd29ya2Fyb3VuZC5gKTtcbiAgICAgICAgICAgIHJldHVybiBtaSB8fCAobWkgPSAhMCwgXG4gICAgICAgICAgICAvLyBUaHJvdyBhIGdsb2JhbCBleGNlcHRpb24gb3V0c2lkZSBvZiB0aGlzIHByb21pc2UgY2hhaW4sIGZvciB0aGUgdXNlciB0b1xuICAgICAgICAgICAgLy8gcG90ZW50aWFsbHkgY2F0Y2guXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhyb3cgdDtcbiAgICAgICAgICAgIH0pLCAwKSksIHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHQ7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGNsYXNzIHlpIGV4dGVuZHMgYWkge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgc3VwZXIoKSwgdGhpcy5IdCA9IHQsIHRoaXMuY3VycmVudFNlcXVlbmNlTnVtYmVyID0gZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHBpKHQsIGUpIHtcbiAgICBjb25zdCBuID0gSyh0KTtcbiAgICByZXR1cm4gaGkueHQobi5IdCwgZSk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEEgYmF0Y2ggb2YgbXV0YXRpb25zIHRoYXQgd2lsbCBiZSBzZW50IGFzIG9uZSB1bml0IHRvIHRoZSBiYWNrZW5kLlxuICovIGNsYXNzIElpIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYmF0Y2hJZCAtIFRoZSB1bmlxdWUgSUQgb2YgdGhpcyBtdXRhdGlvbiBiYXRjaC5cbiAgICAgKiBAcGFyYW0gbG9jYWxXcml0ZVRpbWUgLSBUaGUgb3JpZ2luYWwgd3JpdGUgdGltZSBvZiB0aGlzIG11dGF0aW9uLlxuICAgICAqIEBwYXJhbSBiYXNlTXV0YXRpb25zIC0gTXV0YXRpb25zIHRoYXQgYXJlIHVzZWQgdG8gcG9wdWxhdGUgdGhlIGJhc2VcbiAgICAgKiB2YWx1ZXMgd2hlbiB0aGlzIG11dGF0aW9uIGlzIGFwcGxpZWQgbG9jYWxseS4gVGhpcyBjYW4gYmUgdXNlZCB0byBsb2NhbGx5XG4gICAgICogb3ZlcndyaXRlIHZhbHVlcyB0aGF0IGFyZSBwZXJzaXN0ZWQgaW4gdGhlIHJlbW90ZSBkb2N1bWVudCBjYWNoZS4gQmFzZVxuICAgICAqIG11dGF0aW9ucyBhcmUgbmV2ZXIgc2VudCB0byB0aGUgYmFja2VuZC5cbiAgICAgKiBAcGFyYW0gbXV0YXRpb25zIC0gVGhlIHVzZXItcHJvdmlkZWQgbXV0YXRpb25zIGluIHRoaXMgbXV0YXRpb24gYmF0Y2guXG4gICAgICogVXNlci1wcm92aWRlZCBtdXRhdGlvbnMgYXJlIGFwcGxpZWQgYm90aCBsb2NhbGx5IGFuZCByZW1vdGVseSBvbiB0aGVcbiAgICAgKiBiYWNrZW5kLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgdGhpcy5iYXRjaElkID0gdCwgdGhpcy5sb2NhbFdyaXRlVGltZSA9IGUsIHRoaXMuYmFzZU11dGF0aW9ucyA9IG4sIHRoaXMubXV0YXRpb25zID0gcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXBwbGllcyBhbGwgdGhlIG11dGF0aW9ucyBpbiB0aGlzIE11dGF0aW9uQmF0Y2ggdG8gdGhlIHNwZWNpZmllZCBkb2N1bWVudFxuICAgICAqIHRvIGNvbXB1dGUgdGhlIHN0YXRlIG9mIHRoZSByZW1vdGUgZG9jdW1lbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBkb2N1bWVudCAtIFRoZSBkb2N1bWVudCB0byBhcHBseSBtdXRhdGlvbnMgdG8uXG4gICAgICogQHBhcmFtIGJhdGNoUmVzdWx0IC0gVGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgTXV0YXRpb25CYXRjaCB0byB0aGVcbiAgICAgKiBiYWNrZW5kLlxuICAgICAqLyAgICBhcHBseVRvUmVtb3RlRG9jdW1lbnQodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gZS5tdXRhdGlvblJlc3VsdHM7XG4gICAgICAgIGZvciAobGV0IGUgPSAwOyBlIDwgdGhpcy5tdXRhdGlvbnMubGVuZ3RoOyBlKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLm11dGF0aW9uc1tlXTtcbiAgICAgICAgICAgIGlmIChzLmtleS5pc0VxdWFsKHQua2V5KSkge1xuICAgICAgICAgICAgICAgIGRuKHMsIHQsIG5bZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBsb2NhbCB2aWV3IG9mIGEgZG9jdW1lbnQgZ2l2ZW4gYWxsIHRoZSBtdXRhdGlvbnMgaW4gdGhpc1xuICAgICAqIGJhdGNoLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRvY3VtZW50IC0gVGhlIGRvY3VtZW50IHRvIGFwcGx5IG11dGF0aW9ucyB0by5cbiAgICAgKi8gICAgYXBwbHlUb0xvY2FsVmlldyh0KSB7XG4gICAgICAgIC8vIEZpcnN0LCBhcHBseSB0aGUgYmFzZSBzdGF0ZS4gVGhpcyBhbGxvd3MgdXMgdG8gYXBwbHkgbm9uLWlkZW1wb3RlbnRcbiAgICAgICAgLy8gdHJhbnNmb3JtIGFnYWluc3QgYSBjb25zaXN0ZW50IHNldCBvZiB2YWx1ZXMuXG4gICAgICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLmJhc2VNdXRhdGlvbnMpIGUua2V5LmlzRXF1YWwodC5rZXkpICYmIF9uKGUsIHQsIHRoaXMubG9jYWxXcml0ZVRpbWUpO1xuICAgICAgICAvLyBTZWNvbmQsIGFwcGx5IGFsbCB1c2VyLXByb3ZpZGVkIG11dGF0aW9ucy5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdGhpcy5tdXRhdGlvbnMpIGUua2V5LmlzRXF1YWwodC5rZXkpICYmIF9uKGUsIHQsIHRoaXMubG9jYWxXcml0ZVRpbWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgbG9jYWwgdmlldyBmb3IgYWxsIHByb3ZpZGVkIGRvY3VtZW50cyBnaXZlbiB0aGUgbXV0YXRpb25zIGluXG4gICAgICogdGhpcyBiYXRjaC5cbiAgICAgKi8gICAgYXBwbHlUb0xvY2FsRG9jdW1lbnRTZXQodCkge1xuICAgICAgICAvLyBUT0RPKG1yc2NobWlkdCk6IFRoaXMgaW1wbGVtZW50YXRpb24gaXMgTyhuXjIpLiBJZiB3ZSBhcHBseSB0aGUgbXV0YXRpb25zXG4gICAgICAgIC8vIGRpcmVjdGx5IChhcyBkb25lIGluIGBhcHBseVRvTG9jYWxWaWV3KClgKSwgd2UgY2FuIHJlZHVjZSB0aGUgY29tcGxleGl0eVxuICAgICAgICAvLyB0byBPKG4pLlxuICAgICAgICB0aGlzLm11dGF0aW9ucy5mb3JFYWNoKChlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0LmdldChlLmtleSksIHMgPSBuO1xuICAgICAgICAgICAgLy8gVE9ETyhtdXRhYmxlZG9jdW1lbnRzKTogVGhpcyBtZXRob2Qgc2hvdWxkIHRha2UgYSBNdXRhYmxlRG9jdW1lbnRNYXBcbiAgICAgICAgICAgIC8vIGFuZCB3ZSBzaG91bGQgcmVtb3ZlIHRoaXMgY2FzdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlUb0xvY2FsVmlldyhzKSwgbi5pc1ZhbGlkRG9jdW1lbnQoKSB8fCBzLmNvbnZlcnRUb05vRG9jdW1lbnQoY3QubWluKCkpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGtleXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm11dGF0aW9ucy5yZWR1Y2UoKCh0LCBlKSA9PiB0LmFkZChlLmtleSkpLCBHbigpKTtcbiAgICB9XG4gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhdGNoSWQgPT09IHQuYmF0Y2hJZCAmJiBvdCh0aGlzLm11dGF0aW9ucywgdC5tdXRhdGlvbnMsICgodCwgZSkgPT4gbW4odCwgZSkpKSAmJiBvdCh0aGlzLmJhc2VNdXRhdGlvbnMsIHQuYmFzZU11dGF0aW9ucywgKCh0LCBlKSA9PiBtbih0LCBlKSkpO1xuICAgIH1cbn1cblxuLyoqIFRoZSByZXN1bHQgb2YgYXBwbHlpbmcgYSBtdXRhdGlvbiBiYXRjaCB0byB0aGUgYmFja2VuZC4gKi8gY2xhc3MgVGkge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIFxuICAgIC8qKlxuICAgICAqIEEgcHJlLWNvbXB1dGVkIG1hcHBpbmcgZnJvbSBlYWNoIG11dGF0ZWQgZG9jdW1lbnQgdG8gdGhlIHJlc3VsdGluZ1xuICAgICAqIHZlcnNpb24uXG4gICAgICovXG4gICAgcykge1xuICAgICAgICB0aGlzLmJhdGNoID0gdCwgdGhpcy5jb21taXRWZXJzaW9uID0gZSwgdGhpcy5tdXRhdGlvblJlc3VsdHMgPSBuLCB0aGlzLmRvY1ZlcnNpb25zID0gcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBNdXRhdGlvbkJhdGNoUmVzdWx0IGZvciB0aGUgZ2l2ZW4gYmF0Y2ggYW5kIHJlc3VsdHMuIFRoZXJlXG4gICAgICogbXVzdCBiZSBvbmUgcmVzdWx0IGZvciBlYWNoIG11dGF0aW9uIGluIHRoZSBiYXRjaC4gVGhpcyBzdGF0aWMgZmFjdG9yeVxuICAgICAqIGNhY2hlcyBhIGRvY3VtZW50PSZndDt2ZXJzaW9uIG1hcHBpbmcgKGRvY1ZlcnNpb25zKS5cbiAgICAgKi8gICAgc3RhdGljIGZyb20odCwgZSwgbikge1xuICAgICAgICBxKHQubXV0YXRpb25zLmxlbmd0aCA9PT0gbi5sZW5ndGgpO1xuICAgICAgICBsZXQgcyA9IFVuO1xuICAgICAgICBjb25zdCBpID0gdC5tdXRhdGlvbnM7XG4gICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgaS5sZW5ndGg7IHQrKykgcyA9IHMuaW5zZXJ0KGlbdF0ua2V5LCBuW3RdLnZlcnNpb24pO1xuICAgICAgICByZXR1cm4gbmV3IFRpKHQsIGUsIG4sIHMpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogUmVwcmVzZW50YXRpb24gb2YgYW4gb3ZlcmxheSBjb21wdXRlZCBieSBGaXJlc3RvcmUuXG4gKlxuICogSG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgYSBtdXRhdGlvbiBhbmQgdGhlIGxhcmdlc3QgYmF0Y2ggaWQgaW4gRmlyZXN0b3JlIHdoZW5cbiAqIHRoZSBtdXRhdGlvbiB3YXMgY3JlYXRlZC5cbiAqLyBjbGFzcyBFaSB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLmxhcmdlc3RCYXRjaElkID0gdCwgdGhpcy5tdXRhdGlvbiA9IGU7XG4gICAgfVxuICAgIGdldEtleSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXV0YXRpb24ua2V5O1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIG51bGwgIT09IHQgJiYgdGhpcy5tdXRhdGlvbiA9PT0gdC5tdXRhdGlvbjtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgT3ZlcmxheXtcXG4gICAgICBsYXJnZXN0QmF0Y2hJZDogJHt0aGlzLmxhcmdlc3RCYXRjaElkfSxcXG4gICAgICBtdXRhdGlvbjogJHt0aGlzLm11dGF0aW9uLnRvU3RyaW5nKCl9XFxuICAgIH1gO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQW4gaW1tdXRhYmxlIHNldCBvZiBtZXRhZGF0YSB0aGF0IHRoZSBsb2NhbCBzdG9yZSB0cmFja3MgZm9yIGVhY2ggdGFyZ2V0LlxuICovIGNsYXNzIEFpIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKiogVGhlIHRhcmdldCBiZWluZyBsaXN0ZW5lZCB0by4gKi9cbiAgICB0LCBcbiAgICAvKipcbiAgICAgKiBUaGUgdGFyZ2V0IElEIHRvIHdoaWNoIHRoZSB0YXJnZXQgY29ycmVzcG9uZHM7IEFzc2lnbmVkIGJ5IHRoZVxuICAgICAqIExvY2FsU3RvcmUgZm9yIHVzZXIgbGlzdGVucyBhbmQgYnkgdGhlIFN5bmNFbmdpbmUgZm9yIGxpbWJvIHdhdGNoZXMuXG4gICAgICovXG4gICAgZSwgXG4gICAgLyoqIFRoZSBwdXJwb3NlIG9mIHRoZSB0YXJnZXQuICovXG4gICAgbiwgXG4gICAgLyoqXG4gICAgICogVGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgbGFzdCB0cmFuc2FjdGlvbiBkdXJpbmcgd2hpY2ggdGhpcyB0YXJnZXQgZGF0YVxuICAgICAqIHdhcyBtb2RpZmllZC5cbiAgICAgKi9cbiAgICBzLCBcbiAgICAvKiogVGhlIGxhdGVzdCBzbmFwc2hvdCB2ZXJzaW9uIHNlZW4gZm9yIHRoaXMgdGFyZ2V0LiAqL1xuICAgIGkgPSBjdC5taW4oKVxuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIHNuYXBzaG90IHZlcnNpb24gYXQgd2hpY2ggdGhlIGFzc29jaWF0ZWQgdmlld1xuICAgICAqIGNvbnRhaW5lZCBubyBsaW1ibyBkb2N1bWVudHMuXG4gICAgICovICwgciA9IGN0Lm1pbigpXG4gICAgLyoqXG4gICAgICogQW4gb3BhcXVlLCBzZXJ2ZXItYXNzaWduZWQgdG9rZW4gdGhhdCBhbGxvd3Mgd2F0Y2hpbmcgYSB0YXJnZXQgdG8gYmVcbiAgICAgKiByZXN1bWVkIGFmdGVyIGRpc2Nvbm5lY3Rpbmcgd2l0aG91dCByZXRyYW5zbWl0dGluZyBhbGwgdGhlIGRhdGEgdGhhdFxuICAgICAqIG1hdGNoZXMgdGhlIHRhcmdldC4gVGhlIHJlc3VtZSB0b2tlbiBlc3NlbnRpYWxseSBpZGVudGlmaWVzIGEgcG9pbnQgaW5cbiAgICAgKiB0aW1lIGZyb20gd2hpY2ggdGhlIHNlcnZlciBzaG91bGQgcmVzdW1lIHNlbmRpbmcgcmVzdWx0cy5cbiAgICAgKi8gLCBvID0gcHQuRU1QVFlfQllURV9TVFJJTkcpIHtcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0LCB0aGlzLnRhcmdldElkID0gZSwgdGhpcy5wdXJwb3NlID0gbiwgdGhpcy5zZXF1ZW5jZU51bWJlciA9IHMsIHRoaXMuc25hcHNob3RWZXJzaW9uID0gaSwgXG4gICAgICAgIHRoaXMubGFzdExpbWJvRnJlZVNuYXBzaG90VmVyc2lvbiA9IHIsIHRoaXMucmVzdW1lVG9rZW4gPSBvO1xuICAgIH1cbiAgICAvKiogQ3JlYXRlcyBhIG5ldyB0YXJnZXQgZGF0YSBpbnN0YW5jZSB3aXRoIGFuIHVwZGF0ZWQgc2VxdWVuY2UgbnVtYmVyLiAqLyAgICB3aXRoU2VxdWVuY2VOdW1iZXIodCkge1xuICAgICAgICByZXR1cm4gbmV3IEFpKHRoaXMudGFyZ2V0LCB0aGlzLnRhcmdldElkLCB0aGlzLnB1cnBvc2UsIHQsIHRoaXMuc25hcHNob3RWZXJzaW9uLCB0aGlzLmxhc3RMaW1ib0ZyZWVTbmFwc2hvdFZlcnNpb24sIHRoaXMucmVzdW1lVG9rZW4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHRhcmdldCBkYXRhIGluc3RhbmNlIHdpdGggYW4gdXBkYXRlZCByZXN1bWUgdG9rZW4gYW5kXG4gICAgICogc25hcHNob3QgdmVyc2lvbi5cbiAgICAgKi8gICAgd2l0aFJlc3VtZVRva2VuKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBaSh0aGlzLnRhcmdldCwgdGhpcy50YXJnZXRJZCwgdGhpcy5wdXJwb3NlLCB0aGlzLnNlcXVlbmNlTnVtYmVyLCBlLCB0aGlzLmxhc3RMaW1ib0ZyZWVTbmFwc2hvdFZlcnNpb24sIHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHRhcmdldCBkYXRhIGluc3RhbmNlIHdpdGggYW4gdXBkYXRlZCBsYXN0IGxpbWJvIGZyZWVcbiAgICAgKiBzbmFwc2hvdCB2ZXJzaW9uIG51bWJlci5cbiAgICAgKi8gICAgd2l0aExhc3RMaW1ib0ZyZWVTbmFwc2hvdFZlcnNpb24odCkge1xuICAgICAgICByZXR1cm4gbmV3IEFpKHRoaXMudGFyZ2V0LCB0aGlzLnRhcmdldElkLCB0aGlzLnB1cnBvc2UsIHRoaXMuc2VxdWVuY2VOdW1iZXIsIHRoaXMuc25hcHNob3RWZXJzaW9uLCB0LCB0aGlzLnJlc3VtZVRva2VuKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogU2VyaWFsaXplciBmb3IgdmFsdWVzIHN0b3JlZCBpbiB0aGUgTG9jYWxTdG9yZS4gKi8gY2xhc3MgUmkge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5KdCA9IHQ7XG4gICAgfVxufVxuXG4vKiogRGVjb2RlcyBhIHJlbW90ZSBkb2N1bWVudCBmcm9tIHN0b3JhZ2UgbG9jYWxseSB0byBhIERvY3VtZW50LiAqLyBmdW5jdGlvbiBiaSh0LCBlKSB7XG4gICAgbGV0IG47XG4gICAgaWYgKGUuZG9jdW1lbnQpIG4gPSB5cyh0Lkp0LCBlLmRvY3VtZW50LCAhIWUuaGFzQ29tbWl0dGVkTXV0YXRpb25zKTsgZWxzZSBpZiAoZS5ub0RvY3VtZW50KSB7XG4gICAgICAgIGNvbnN0IHQgPSB4dC5mcm9tU2VnbWVudHMoZS5ub0RvY3VtZW50LnBhdGgpLCBzID0gRGkoZS5ub0RvY3VtZW50LnJlYWRUaW1lKTtcbiAgICAgICAgbiA9IHRlLm5ld05vRG9jdW1lbnQodCwgcyksIGUuaGFzQ29tbWl0dGVkTXV0YXRpb25zICYmIG4uc2V0SGFzQ29tbWl0dGVkTXV0YXRpb25zKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFlLnVua25vd25Eb2N1bWVudCkgcmV0dXJuIEwoKTtcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdCA9IHh0LmZyb21TZWdtZW50cyhlLnVua25vd25Eb2N1bWVudC5wYXRoKSwgcyA9IERpKGUudW5rbm93bkRvY3VtZW50LnZlcnNpb24pO1xuICAgICAgICAgICAgbiA9IHRlLm5ld1Vua25vd25Eb2N1bWVudCh0LCBzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZS5yZWFkVGltZSAmJiBuLnNldFJlYWRUaW1lKHZpKGUucmVhZFRpbWUpKSwgbjtcbn1cblxuLyoqIEVuY29kZXMgYSBkb2N1bWVudCBmb3Igc3RvcmFnZSBsb2NhbGx5LiAqLyBmdW5jdGlvbiBQaSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IGUua2V5LnBhdGgucG9wTGFzdCgpLnRvQXJyYXkoKSwgcyA9IFZpKGUucmVhZFRpbWUpO1xuICAgIGlmIChlLmlzRm91bmREb2N1bWVudCgpKSB7XG4gICAgICAgIGNvbnN0IGkgPSBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IGxzKHQsIGUua2V5KSxcbiAgICAgICAgICAgICAgICBmaWVsZHM6IGUuZGF0YS52YWx1ZS5tYXBWYWx1ZS5maWVsZHMsXG4gICAgICAgICAgICAgICAgdXBkYXRlVGltZTogcnModCwgZS52ZXJzaW9uLnRvVGltZXN0YW1wKCkpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KHQuSnQsIGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZG9jdW1lbnQ6IGksXG4gICAgICAgICAgICBoYXNDb21taXR0ZWRNdXRhdGlvbnM6IGUuaGFzQ29tbWl0dGVkTXV0YXRpb25zLFxuICAgICAgICAgICAgcmVhZFRpbWU6IHMsXG4gICAgICAgICAgICBwYXJlbnRQYXRoOiBuXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChlLmlzTm9Eb2N1bWVudCgpKSB7XG4gICAgICAgIGNvbnN0IHQgPSBlLmtleS5wYXRoLnRvQXJyYXkoKSwgaSA9IGUuaGFzQ29tbWl0dGVkTXV0YXRpb25zO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbm9Eb2N1bWVudDoge1xuICAgICAgICAgICAgICAgIHBhdGg6IHQsXG4gICAgICAgICAgICAgICAgcmVhZFRpbWU6IFNpKGUudmVyc2lvbilcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoYXNDb21taXR0ZWRNdXRhdGlvbnM6IGksXG4gICAgICAgICAgICByZWFkVGltZTogcyxcbiAgICAgICAgICAgIHBhcmVudFBhdGg6IG5cbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGUuaXNVbmtub3duRG9jdW1lbnQoKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdW5rbm93bkRvY3VtZW50OiB7XG4gICAgICAgICAgICAgICAgcGF0aDogZS5rZXkucGF0aC50b0FycmF5KCksXG4gICAgICAgICAgICAgICAgdmVyc2lvbjogU2koZS52ZXJzaW9uKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhhc0NvbW1pdHRlZE11dGF0aW9uczogITAsXG4gICAgICAgICAgICByZWFkVGltZTogcyxcbiAgICAgICAgICAgIHBhcmVudFBhdGg6IG5cbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIEwoKTtcbn1cblxuZnVuY3Rpb24gVmkodCkge1xuICAgIGNvbnN0IGUgPSB0LnRvVGltZXN0YW1wKCk7XG4gICAgcmV0dXJuIFsgZS5zZWNvbmRzLCBlLm5hbm9zZWNvbmRzIF07XG59XG5cbmZ1bmN0aW9uIHZpKHQpIHtcbiAgICBjb25zdCBlID0gbmV3IHV0KHRbMF0sIHRbMV0pO1xuICAgIHJldHVybiBjdC5mcm9tVGltZXN0YW1wKGUpO1xufVxuXG5mdW5jdGlvbiBTaSh0KSB7XG4gICAgY29uc3QgZSA9IHQudG9UaW1lc3RhbXAoKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBzZWNvbmRzOiBlLnNlY29uZHMsXG4gICAgICAgIG5hbm9zZWNvbmRzOiBlLm5hbm9zZWNvbmRzXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gRGkodCkge1xuICAgIGNvbnN0IGUgPSBuZXcgdXQodC5zZWNvbmRzLCB0Lm5hbm9zZWNvbmRzKTtcbiAgICByZXR1cm4gY3QuZnJvbVRpbWVzdGFtcChlKTtcbn1cblxuLyoqIEVuY29kZXMgYSBiYXRjaCBvZiBtdXRhdGlvbnMgaW50byBhIERiTXV0YXRpb25CYXRjaCBmb3IgbG9jYWwgc3RvcmFnZS4gKi9cbi8qKiBEZWNvZGVzIGEgRGJNdXRhdGlvbkJhdGNoIGludG8gYSBNdXRhdGlvbkJhdGNoICovXG5mdW5jdGlvbiBDaSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IChlLmJhc2VNdXRhdGlvbnMgfHwgW10pLm1hcCgoZSA9PiBFcyh0Lkp0LCBlKSkpO1xuICAgIC8vIFNxdWFzaCBvbGQgdHJhbnNmb3JtIG11dGF0aW9ucyBpbnRvIGV4aXN0aW5nIHBhdGNoIG9yIHNldCBtdXRhdGlvbnMuXG4gICAgLy8gVGhlIHJlcGxhY2VtZW50IG9mIHJlcHJlc2VudGluZyBgdHJhbnNmb3Jtc2Agd2l0aCBgdXBkYXRlX3RyYW5zZm9ybXNgXG4gICAgLy8gb24gdGhlIFNESyBtZWFucyB0aGF0IG9sZCBgdHJhbnNmb3JtYCBtdXRhdGlvbnMgc3RvcmVkIGluIEluZGV4ZWREQiBuZWVkXG4gICAgLy8gdG8gYmUgdXBkYXRlZCB0byBgdXBkYXRlX3RyYW5zZm9ybXNgLlxuICAgIC8vIFRPRE8oYi8xNzQ2MDgzNzQpOiBSZW1vdmUgdGhpcyBjb2RlIG9uY2Ugd2UgcGVyZm9ybSBhIHNjaGVtYSBtaWdyYXRpb24uXG4gICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgZS5tdXRhdGlvbnMubGVuZ3RoIC0gMTsgKyt0KSB7XG4gICAgICAgIGNvbnN0IG4gPSBlLm11dGF0aW9uc1t0XTtcbiAgICAgICAgaWYgKHQgKyAxIDwgZS5tdXRhdGlvbnMubGVuZ3RoICYmIHZvaWQgMCAhPT0gZS5tdXRhdGlvbnNbdCArIDFdLnRyYW5zZm9ybSkge1xuICAgICAgICAgICAgY29uc3QgcyA9IGUubXV0YXRpb25zW3QgKyAxXTtcbiAgICAgICAgICAgIG4udXBkYXRlVHJhbnNmb3JtcyA9IHMudHJhbnNmb3JtLmZpZWxkVHJhbnNmb3JtcywgZS5tdXRhdGlvbnMuc3BsaWNlKHQgKyAxLCAxKSwgXG4gICAgICAgICAgICArK3Q7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcyA9IGUubXV0YXRpb25zLm1hcCgoZSA9PiBFcyh0Lkp0LCBlKSkpLCBpID0gdXQuZnJvbU1pbGxpcyhlLmxvY2FsV3JpdGVUaW1lTXMpO1xuICAgIHJldHVybiBuZXcgSWkoZS5iYXRjaElkLCBpLCBuLCBzKTtcbn1cblxuLyoqIERlY29kZXMgYSBEYlRhcmdldCBpbnRvIFRhcmdldERhdGEgKi8gZnVuY3Rpb24geGkodCkge1xuICAgIGNvbnN0IGUgPSBEaSh0LnJlYWRUaW1lKSwgbiA9IHZvaWQgMCAhPT0gdC5sYXN0TGltYm9GcmVlU25hcHNob3RWZXJzaW9uID8gRGkodC5sYXN0TGltYm9GcmVlU25hcHNob3RWZXJzaW9uKSA6IGN0Lm1pbigpO1xuICAgIGxldCBzO1xuICAgIHZhciBpO1xuICAgIHJldHVybiB2b2lkIDAgIT09IHQucXVlcnkuZG9jdW1lbnRzID8gKHEoMSA9PT0gKGkgPSB0LnF1ZXJ5KS5kb2N1bWVudHMubGVuZ3RoKSwgXG4gICAgcyA9ICRlKERlKF9zKGkuZG9jdW1lbnRzWzBdKSkpKSA6IHMgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgIHJldHVybiAkZShQcyh0KSk7XG4gICAgfSh0LnF1ZXJ5KSwgbmV3IEFpKHMsIHQudGFyZ2V0SWQsIDAgLyogTGlzdGVuICovICwgdC5sYXN0TGlzdGVuU2VxdWVuY2VOdW1iZXIsIGUsIG4sIHB0LmZyb21CYXNlNjRTdHJpbmcodC5yZXN1bWVUb2tlbikpO1xufVxuXG4vKiogRW5jb2RlcyBUYXJnZXREYXRhIGludG8gYSBEYlRhcmdldCBmb3Igc3RvcmFnZSBsb2NhbGx5LiAqLyBmdW5jdGlvbiBOaSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IFNpKGUuc25hcHNob3RWZXJzaW9uKSwgcyA9IFNpKGUubGFzdExpbWJvRnJlZVNuYXBzaG90VmVyc2lvbik7XG4gICAgbGV0IGk7XG4gICAgaSA9IGZlKGUudGFyZ2V0KSA/IFJzKHQuSnQsIGUudGFyZ2V0KSA6IGJzKHQuSnQsIGUudGFyZ2V0KTtcbiAgICAvLyBXZSBjYW4ndCBzdG9yZSB0aGUgcmVzdW1lVG9rZW4gYXMgYSBCeXRlU3RyaW5nIGluIEluZGV4ZWREYiwgc28gd2VcbiAgICAvLyBjb252ZXJ0IGl0IHRvIGEgYmFzZTY0IHN0cmluZyBmb3Igc3RvcmFnZS5cbiAgICAgICAgY29uc3QgciA9IGUucmVzdW1lVG9rZW4udG9CYXNlNjQoKTtcbiAgICAvLyBsYXN0TGlzdGVuU2VxdWVuY2VOdW1iZXIgaXMgYWx3YXlzIDAgdW50aWwgd2UgZG8gcmVhbCBHQy5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0SWQ6IGUudGFyZ2V0SWQsXG4gICAgICAgIGNhbm9uaWNhbElkOiBjZShlLnRhcmdldCksXG4gICAgICAgIHJlYWRUaW1lOiBuLFxuICAgICAgICByZXN1bWVUb2tlbjogcixcbiAgICAgICAgbGFzdExpc3RlblNlcXVlbmNlTnVtYmVyOiBlLnNlcXVlbmNlTnVtYmVyLFxuICAgICAgICBsYXN0TGltYm9GcmVlU25hcHNob3RWZXJzaW9uOiBzLFxuICAgICAgICBxdWVyeTogaVxuICAgIH07XG59XG5cbi8qKlxuICogQSBoZWxwZXIgZnVuY3Rpb24gZm9yIGZpZ3VyaW5nIG91dCB3aGF0IGtpbmQgb2YgcXVlcnkgaGFzIGJlZW4gc3RvcmVkLlxuICovXG4vKipcbiAqIEVuY29kZXMgYSBgQnVuZGxlZFF1ZXJ5YCBmcm9tIGJ1bmRsZSBwcm90byB0byBhIFF1ZXJ5IG9iamVjdC5cbiAqXG4gKiBUaGlzIHJlY29uc3RydWN0cyB0aGUgb3JpZ2luYWwgcXVlcnkgdXNlZCB0byBidWlsZCB0aGUgYnVuZGxlIGJlaW5nIGxvYWRlZCxcbiAqIGluY2x1ZGluZyBmZWF0dXJlcyBleGlzdHMgb25seSBpbiBTREtzIChmb3IgZXhhbXBsZTogbGltaXQtdG8tbGFzdCkuXG4gKi9cbmZ1bmN0aW9uIGtpKHQpIHtcbiAgICBjb25zdCBlID0gUHMoe1xuICAgICAgICBwYXJlbnQ6IHQucGFyZW50LFxuICAgICAgICBzdHJ1Y3R1cmVkUXVlcnk6IHQuc3RydWN0dXJlZFF1ZXJ5XG4gICAgfSk7XG4gICAgcmV0dXJuIFwiTEFTVFwiID09PSB0LmxpbWl0VHlwZSA/IEZlKGUsIGUubGltaXQsIFwiTFwiIC8qIExhc3QgKi8pIDogZTtcbn1cblxuLyoqIEVuY29kZXMgYSBOYW1lZFF1ZXJ5IHByb3RvIG9iamVjdCB0byBhIE5hbWVkUXVlcnkgbW9kZWwgb2JqZWN0LiAqL1xuLyoqIEVuY29kZXMgYSBEYkRvY3VtZW50T3ZlcmxheSBvYmplY3QgdG8gYW4gT3ZlcmxheSBtb2RlbCBvYmplY3QuICovXG5mdW5jdGlvbiBNaSh0LCBlKSB7XG4gICAgcmV0dXJuIG5ldyBFaShlLmxhcmdlc3RCYXRjaElkLCBFcyh0Lkp0LCBlLm92ZXJsYXlNdXRhdGlvbikpO1xufVxuXG4vKiogRGVjb2RlcyBhbiBPdmVybGF5IG1vZGVsIG9iamVjdCBpbnRvIGEgRGJEb2N1bWVudE92ZXJsYXkgb2JqZWN0LiAqL1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBEYkRvY3VtZW50T3ZlcmxheUtleSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiB1c2VyIGFuZFxuICogZG9jdW1lbnQga2V5LlxuICovXG5mdW5jdGlvbiBPaSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IGUucGF0aC5sYXN0U2VnbWVudCgpO1xuICAgIHJldHVybiBbIHQsICRzKGUucGF0aC5wb3BMYXN0KCkpLCBuIF07XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5jbGFzcyAkaSB7XG4gICAgZ2V0QnVuZGxlTWV0YWRhdGEodCwgZSkge1xuICAgICAgICByZXR1cm4gRmkodCkuZ2V0KGUpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgaWYgKHQpIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaWQ6IChlID0gdCkuYnVuZGxlSWQsXG4gICAgICAgICAgICAgICAgY3JlYXRlVGltZTogRGkoZS5jcmVhdGVUaW1lKSxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiBlLnZlcnNpb25cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvKiogRW5jb2RlcyBhIERiQnVuZGxlIHRvIGEgQnVuZGxlTWV0YWRhdGEgb2JqZWN0LiAqL1xuICAgICAgICAgICAgdmFyIGU7XG4gICAgICAgICAgICAvKiogRW5jb2RlcyBhIEJ1bmRsZU1ldGFkYXRhIHRvIGEgRGJCdW5kbGUuICovICAgICAgICB9KSk7XG4gICAgfVxuICAgIHNhdmVCdW5kbGVNZXRhZGF0YSh0LCBlKSB7XG4gICAgICAgIHJldHVybiBGaSh0KS5wdXQoe1xuICAgICAgICAgICAgYnVuZGxlSWQ6IChuID0gZSkuaWQsXG4gICAgICAgICAgICBjcmVhdGVUaW1lOiBTaSh1cyhuLmNyZWF0ZVRpbWUpKSxcbiAgICAgICAgICAgIHZlcnNpb246IG4udmVyc2lvblxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIG47XG4gICAgICAgIC8qKiBFbmNvZGVzIGEgRGJOYW1lZFF1ZXJ5IHRvIGEgTmFtZWRRdWVyeS4gKi8gICAgfVxuICAgIGdldE5hbWVkUXVlcnkodCwgZSkge1xuICAgICAgICByZXR1cm4gQmkodCkuZ2V0KGUpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgaWYgKHQpIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogKGUgPSB0KS5uYW1lLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiBraShlLmJ1bmRsZWRRdWVyeSksXG4gICAgICAgICAgICAgICAgcmVhZFRpbWU6IERpKGUucmVhZFRpbWUpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIGU7XG4gICAgICAgICAgICAvKiogRW5jb2RlcyBhIE5hbWVkUXVlcnkgZnJvbSBhIGJ1bmRsZSBwcm90byB0byBhIERiTmFtZWRRdWVyeS4gKi8gICAgICAgIH0pKTtcbiAgICB9XG4gICAgc2F2ZU5hbWVkUXVlcnkodCwgZSkge1xuICAgICAgICByZXR1cm4gQmkodCkucHV0KGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogdC5uYW1lLFxuICAgICAgICAgICAgICAgIHJlYWRUaW1lOiBTaSh1cyh0LnJlYWRUaW1lKSksXG4gICAgICAgICAgICAgICAgYnVuZGxlZFF1ZXJ5OiB0LmJ1bmRsZWRRdWVyeVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfShlKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEhlbHBlciB0byBnZXQgYSB0eXBlZCBTaW1wbGVEYlN0b3JlIGZvciB0aGUgYnVuZGxlcyBvYmplY3Qgc3RvcmUuXG4gKi8gZnVuY3Rpb24gRmkodCkge1xuICAgIHJldHVybiBwaSh0LCBcImJ1bmRsZXNcIik7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGdldCBhIHR5cGVkIFNpbXBsZURiU3RvcmUgZm9yIHRoZSBuYW1lZFF1ZXJpZXMgb2JqZWN0IHN0b3JlLlxuICovIGZ1bmN0aW9uIEJpKHQpIHtcbiAgICByZXR1cm4gcGkodCwgXCJuYW1lZFF1ZXJpZXNcIik7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIERvY3VtZW50T3ZlcmxheUNhY2hlIHVzaW5nIEluZGV4ZWREYi5cbiAqLyBjbGFzcyBMaSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHNlcmlhbGl6ZXIgLSBUaGUgZG9jdW1lbnQgc2VyaWFsaXplci5cbiAgICAgKiBAcGFyYW0gdXNlcklkIC0gVGhlIHVzZXJJZCBmb3Igd2hpY2ggd2UgYXJlIGFjY2Vzc2luZyBvdmVybGF5cy5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMuTSA9IHQsIHRoaXMudXNlcklkID0gZTtcbiAgICB9XG4gICAgc3RhdGljIFl0KHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IGUudWlkIHx8IFwiXCI7XG4gICAgICAgIHJldHVybiBuZXcgTGkodCwgbik7XG4gICAgfVxuICAgIGdldE92ZXJsYXkodCwgZSkge1xuICAgICAgICByZXR1cm4gcWkodCkuZ2V0KE9pKHRoaXMudXNlcklkLCBlKSkubmV4dCgodCA9PiB0ID8gTWkodGhpcy5NLCB0KSA6IG51bGwpKTtcbiAgICB9XG4gICAgc2F2ZU92ZXJsYXlzKHQsIGUsIG4pIHtcbiAgICAgICAgY29uc3QgcyA9IFtdO1xuICAgICAgICByZXR1cm4gbi5mb3JFYWNoKCgobiwgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgciA9IG5ldyBFaShlLCBpKTtcbiAgICAgICAgICAgIHMucHVzaCh0aGlzLlh0KHQsIHIpKTtcbiAgICAgICAgfSkpLCB1aS53YWl0Rm9yKHMpO1xuICAgIH1cbiAgICByZW1vdmVPdmVybGF5c0ZvckJhdGNoSWQodCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gbmV3IFNldDtcbiAgICAgICAgLy8gR2V0IHRoZSBzZXQgb2YgdW5pcXVlIGNvbGxlY3Rpb24gcGF0aHMuXG4gICAgICAgICAgICAgICAgZS5mb3JFYWNoKCh0ID0+IHMuYWRkKCRzKHQuZ2V0Q29sbGVjdGlvblBhdGgoKSkpKSk7XG4gICAgICAgIGNvbnN0IGkgPSBbXTtcbiAgICAgICAgcmV0dXJuIHMuZm9yRWFjaCgoZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzID0gSURCS2V5UmFuZ2UuYm91bmQoWyB0aGlzLnVzZXJJZCwgZSwgbiBdLCBbIHRoaXMudXNlcklkLCBlLCBuICsgMSBdLCBcbiAgICAgICAgICAgIC8qbG93ZXJPcGVuPSovICExLCBcbiAgICAgICAgICAgIC8qdXBwZXJPcGVuPSovICEwKTtcbiAgICAgICAgICAgIGkucHVzaChxaSh0KS5RdChcImNvbGxlY3Rpb25QYXRoT3ZlcmxheUluZGV4XCIsIHMpKTtcbiAgICAgICAgfSkpLCB1aS53YWl0Rm9yKGkpO1xuICAgIH1cbiAgICBnZXRPdmVybGF5c0ZvckNvbGxlY3Rpb24odCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gcW4oKSwgaSA9ICRzKGUpLCByID0gSURCS2V5UmFuZ2UuYm91bmQoWyB0aGlzLnVzZXJJZCwgaSwgbiBdLCBbIHRoaXMudXNlcklkLCBpLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgXSwgXG4gICAgICAgIC8qbG93ZXJPcGVuPSovICEwKTtcbiAgICAgICAgcmV0dXJuIHFpKHQpLlV0KFwiY29sbGVjdGlvblBhdGhPdmVybGF5SW5kZXhcIiwgcikubmV4dCgodCA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBNaSh0aGlzLk0sIGUpO1xuICAgICAgICAgICAgICAgIHMuc2V0KHQuZ2V0S2V5KCksIHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgZ2V0T3ZlcmxheXNGb3JDb2xsZWN0aW9uR3JvdXAodCwgZSwgbiwgcykge1xuICAgICAgICBjb25zdCBpID0gcW4oKTtcbiAgICAgICAgbGV0IHI7XG4gICAgICAgIC8vIFdlIHdhbnQgYmF0Y2ggSURzIGxhcmdlciB0aGFuIGBzaW5jZUJhdGNoSWRgLCBhbmQgc28gdGhlIGxvd2VyIGJvdW5kXG4gICAgICAgIC8vIGlzIG5vdCBpbmNsdXNpdmUuXG4gICAgICAgICAgICAgICAgY29uc3QgbyA9IElEQktleVJhbmdlLmJvdW5kKFsgdGhpcy51c2VySWQsIGUsIG4gXSwgWyB0aGlzLnVzZXJJZCwgZSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIF0sIFxuICAgICAgICAvKmxvd2VyT3Blbj0qLyAhMCk7XG4gICAgICAgIHJldHVybiBxaSh0KS5XdCh7XG4gICAgICAgICAgICBpbmRleDogXCJjb2xsZWN0aW9uR3JvdXBPdmVybGF5SW5kZXhcIixcbiAgICAgICAgICAgIHJhbmdlOiBvXG4gICAgICAgIH0sICgodCwgZSwgbikgPT4ge1xuICAgICAgICAgICAgLy8gV2UgZG8gbm90IHdhbnQgdG8gcmV0dXJuIHBhcnRpYWwgYmF0Y2ggb3ZlcmxheXMsIGV2ZW4gaWYgdGhlIHNpemVcbiAgICAgICAgICAgIC8vIG9mIHRoZSByZXN1bHQgc2V0IGV4Y2VlZHMgdGhlIGdpdmVuIGBjb3VudGAgYXJndW1lbnQuIFRoZXJlZm9yZSwgd2VcbiAgICAgICAgICAgIC8vIGNvbnRpbnVlIHRvIGFnZ3JlZ2F0ZSByZXN1bHRzIGV2ZW4gYWZ0ZXIgdGhlIHJlc3VsdCBzaXplIGV4Y2VlZHNcbiAgICAgICAgICAgIC8vIGBjb3VudGAgaWYgdGhlcmUgYXJlIG1vcmUgb3ZlcmxheXMgZnJvbSB0aGUgYGN1cnJlbnRCYXRjaElkYC5cbiAgICAgICAgICAgIGNvbnN0IG8gPSBNaSh0aGlzLk0sIGUpO1xuICAgICAgICAgICAgaS5zaXplKCkgPCBzIHx8IG8ubGFyZ2VzdEJhdGNoSWQgPT09IHIgPyAoaS5zZXQoby5nZXRLZXkoKSwgbyksIHIgPSBvLmxhcmdlc3RCYXRjaElkKSA6IG4uZG9uZSgpO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4gaSkpO1xuICAgIH1cbiAgICBYdCh0LCBlKSB7XG4gICAgICAgIHJldHVybiBxaSh0KS5wdXQoZnVuY3Rpb24odCwgZSwgbikge1xuICAgICAgICAgICAgY29uc3QgW3MsIGksIHJdID0gT2koZSwgbi5tdXRhdGlvbi5rZXkpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1c2VySWQ6IGUsXG4gICAgICAgICAgICAgICAgY29sbGVjdGlvblBhdGg6IGksXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRJZDogcixcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uR3JvdXA6IG4ubXV0YXRpb24ua2V5LmdldENvbGxlY3Rpb25Hcm91cCgpLFxuICAgICAgICAgICAgICAgIGxhcmdlc3RCYXRjaElkOiBuLmxhcmdlc3RCYXRjaElkLFxuICAgICAgICAgICAgICAgIG92ZXJsYXlNdXRhdGlvbjogVHModC5KdCwgbi5tdXRhdGlvbilcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0odGhpcy5NLCB0aGlzLnVzZXJJZCwgZSkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gZ2V0IGEgdHlwZWQgU2ltcGxlRGJTdG9yZSBmb3IgdGhlIGRvY3VtZW50IG92ZXJsYXkgb2JqZWN0IHN0b3JlLlxuICovIGZ1bmN0aW9uIHFpKHQpIHtcbiAgICByZXR1cm4gcGkodCwgXCJkb2N1bWVudE92ZXJsYXlzXCIpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLy8gTm90ZTogVGhpcyBjb2RlIGlzIGNvcGllZCBmcm9tIHRoZSBiYWNrZW5kLiBDb2RlIHRoYXQgaXMgbm90IHVzZWQgYnlcbi8vIEZpcmVzdG9yZSB3YXMgcmVtb3ZlZC5cbi8qKiBGaXJlc3RvcmUgaW5kZXggdmFsdWUgd3JpdGVyLiAgKi9cbmNsYXNzIFVpIHtcbiAgICBjb25zdHJ1Y3RvcigpIHt9XG4gICAgLy8gVGhlIHdyaXRlIG1ldGhvZHMgYmVsb3cgc2hvcnQtY2lyY3VpdCB3cml0aW5nIHRlcm1pbmF0b3JzIGZvciB2YWx1ZXNcbiAgICAvLyBjb250YWluaW5nIGEgKHRlcm1pbmF0aW5nKSB0cnVuY2F0ZWQgdmFsdWUuXG4gICAgLy8gQXMgYW4gZXhhbXBsZSwgY29uc2lkZXIgdGhlIHJlc3VsdGluZyBlbmNvZGluZyBmb3I6XG4gICAgLy8gW1wiYmFyXCIsIFsyLCBcImZvb1wiXV0gLT4gKFNUUklORywgXCJiYXJcIiwgVEVSTSwgQVJSQVksIE5VTUJFUiwgMiwgU1RSSU5HLCBcImZvb1wiLCBURVJNLCBURVJNLCBURVJNKVxuICAgIC8vIFtcImJhclwiLCBbMiwgdHJ1bmNhdGVkKFwiZm9vXCIpXV0gLT4gKFNUUklORywgXCJiYXJcIiwgVEVSTSwgQVJSQVksIE5VTUJFUiwgMiwgU1RSSU5HLCBcImZvb1wiLCBUUlVOQylcbiAgICAvLyBbXCJiYXJcIiwgdHJ1bmNhdGVkKFtcImZvb1wiXSldIC0+IChTVFJJTkcsIFwiYmFyXCIsIFRFUk0sIEFSUkFZLiBTVFJJTkcsIFwiZm9vXCIsIFRFUk0sIFRSVU5DKVxuICAgIC8qKiBXcml0ZXMgYW4gaW5kZXggdmFsdWUuICAqL1xuICAgIFp0KHQsIGUpIHtcbiAgICAgICAgdGhpcy50ZSh0LCBlKSwgXG4gICAgICAgIC8vIFdyaXRlIHNlcGFyYXRvciB0byBzcGxpdCBpbmRleCB2YWx1ZXNcbiAgICAgICAgLy8gKHNlZSBnby9maXJlc3RvcmUtc3RvcmFnZS1mb3JtYXQjZW5jb2RpbmdzKS5cbiAgICAgICAgZS5lZSgpO1xuICAgIH1cbiAgICB0ZSh0LCBlKSB7XG4gICAgICAgIGlmIChcIm51bGxWYWx1ZVwiIGluIHQpIHRoaXMubmUoZSwgNSk7IGVsc2UgaWYgKFwiYm9vbGVhblZhbHVlXCIgaW4gdCkgdGhpcy5uZShlLCAxMCksIFxuICAgICAgICBlLnNlKHQuYm9vbGVhblZhbHVlID8gMSA6IDApOyBlbHNlIGlmIChcImludGVnZXJWYWx1ZVwiIGluIHQpIHRoaXMubmUoZSwgMTUpLCBlLnNlKEV0KHQuaW50ZWdlclZhbHVlKSk7IGVsc2UgaWYgKFwiZG91YmxlVmFsdWVcIiBpbiB0KSB7XG4gICAgICAgICAgICBjb25zdCBuID0gRXQodC5kb3VibGVWYWx1ZSk7XG4gICAgICAgICAgICBpc05hTihuKSA/IHRoaXMubmUoZSwgMTMpIDogKHRoaXMubmUoZSwgMTUpLCBEdChuKSA/IFxuICAgICAgICAgICAgLy8gLTAuMCwgMCBhbmQgMC4wIGFyZSBhbGwgY29uc2lkZXJlZCB0aGUgc2FtZVxuICAgICAgICAgICAgZS5zZSgwKSA6IGUuc2UobikpO1xuICAgICAgICB9IGVsc2UgaWYgKFwidGltZXN0YW1wVmFsdWVcIiBpbiB0KSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdC50aW1lc3RhbXBWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMubmUoZSwgMjApLCBcInN0cmluZ1wiID09IHR5cGVvZiBuID8gZS5pZShuKSA6IChlLmllKGAke24uc2Vjb25kcyB8fCBcIlwifWApLCBlLnNlKG4ubmFub3MgfHwgMCkpO1xuICAgICAgICB9IGVsc2UgaWYgKFwic3RyaW5nVmFsdWVcIiBpbiB0KSB0aGlzLnJlKHQuc3RyaW5nVmFsdWUsIGUpLCB0aGlzLm9lKGUpOyBlbHNlIGlmIChcImJ5dGVzVmFsdWVcIiBpbiB0KSB0aGlzLm5lKGUsIDMwKSwgXG4gICAgICAgIGUuYWUoQXQodC5ieXRlc1ZhbHVlKSksIHRoaXMub2UoZSk7IGVsc2UgaWYgKFwicmVmZXJlbmNlVmFsdWVcIiBpbiB0KSB0aGlzLnVlKHQucmVmZXJlbmNlVmFsdWUsIGUpOyBlbHNlIGlmIChcImdlb1BvaW50VmFsdWVcIiBpbiB0KSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdC5nZW9Qb2ludFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5uZShlLCA0NSksIGUuc2Uobi5sYXRpdHVkZSB8fCAwKSwgZS5zZShuLmxvbmdpdHVkZSB8fCAwKTtcbiAgICAgICAgfSBlbHNlIFwibWFwVmFsdWVcIiBpbiB0ID8gSHQodCkgPyB0aGlzLm5lKGUsIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSA6ICh0aGlzLmNlKHQubWFwVmFsdWUsIGUpLCBcbiAgICAgICAgdGhpcy5vZShlKSkgOiBcImFycmF5VmFsdWVcIiBpbiB0ID8gKHRoaXMuaGUodC5hcnJheVZhbHVlLCBlKSwgdGhpcy5vZShlKSkgOiBMKCk7XG4gICAgfVxuICAgIHJlKHQsIGUpIHtcbiAgICAgICAgdGhpcy5uZShlLCAyNSksIHRoaXMubGUodCwgZSk7XG4gICAgfVxuICAgIGxlKHQsIGUpIHtcbiAgICAgICAgZS5pZSh0KTtcbiAgICB9XG4gICAgY2UodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gdC5maWVsZHMgfHwge307XG4gICAgICAgIHRoaXMubmUoZSwgNTUpO1xuICAgICAgICBmb3IgKGNvbnN0IHQgb2YgT2JqZWN0LmtleXMobikpIHRoaXMucmUodCwgZSksIHRoaXMudGUoblt0XSwgZSk7XG4gICAgfVxuICAgIGhlKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IHQudmFsdWVzIHx8IFtdO1xuICAgICAgICB0aGlzLm5lKGUsIDUwKTtcbiAgICAgICAgZm9yIChjb25zdCB0IG9mIG4pIHRoaXMudGUodCwgZSk7XG4gICAgfVxuICAgIHVlKHQsIGUpIHtcbiAgICAgICAgdGhpcy5uZShlLCAzNyk7XG4gICAgICAgIHh0LmZyb21OYW1lKHQpLnBhdGguZm9yRWFjaCgodCA9PiB7XG4gICAgICAgICAgICB0aGlzLm5lKGUsIDYwKSwgdGhpcy5sZSh0LCBlKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBuZSh0LCBlKSB7XG4gICAgICAgIHQuc2UoZSk7XG4gICAgfVxuICAgIG9lKHQpIHtcbiAgICAgICAgLy8gV2hpbGUgdGhlIFNESyBkb2VzIG5vdCBpbXBsZW1lbnQgdHJ1bmNhdGlvbiwgdGhlIHRydW5jYXRpb24gbWFya2VyIGlzXG4gICAgICAgIC8vIHVzZWQgdG8gdGVybWluYXRlIGFsbCB2YXJpYWJsZSBsZW5ndGggdmFsdWVzICh3aGljaCBhcmUgc3RyaW5ncywgYnl0ZXMsXG4gICAgICAgIC8vIHJlZmVyZW5jZXMsIGFycmF5cyBhbmQgbWFwcykuXG4gICAgICAgIHQuc2UoMik7XG4gICAgfVxufVxuXG5VaS5mZSA9IG5ldyBVaTtcblxuLyoqXG4gKiBDb3VudHMgdGhlIG51bWJlciBvZiB6ZXJvcyBpbiBhIGJ5dGUuXG4gKlxuICogVmlzaWJsZSBmb3IgdGVzdGluZy5cbiAqL1xuZnVuY3Rpb24gS2kodCkge1xuICAgIGlmICgwID09PSB0KSByZXR1cm4gODtcbiAgICBsZXQgZSA9IDA7XG4gICAgcmV0dXJuIHQgPj4gNCA9PSAwICYmIChcbiAgICAvLyBUZXN0IGlmIHRoZSBmaXJzdCBmb3VyIGJpdHMgYXJlIHplcm8uXG4gICAgZSArPSA0LCB0IDw8PSA0KSwgdCA+PiA2ID09IDAgJiYgKFxuICAgIC8vIFRlc3QgaWYgdGhlIGZpcnN0IHR3byAob3IgbmV4dCB0d28pIGJpdHMgYXJlIHplcm8uXG4gICAgZSArPSAyLCB0IDw8PSAyKSwgdCA+PiA3ID09IDAgJiYgKFxuICAgIC8vIFRlc3QgaWYgdGhlIHJlbWFpbmluZyBiaXQgaXMgemVyby5cbiAgICBlICs9IDEpLCBlO1xufVxuXG4vKiogQ291bnRzIHRoZSBudW1iZXIgb2YgbGVhZGluZyB6ZXJvcyBpbiB0aGUgZ2l2ZW4gYnl0ZSBhcnJheS4gKi9cbi8qKlxuICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIHN0b3JlIFwidmFsdWVcIi4gTGVhZGluZyB6ZXJvIGJ5dGVzXG4gKiBhcmUgc2tpcHBlZC5cbiAqL1xuZnVuY3Rpb24gR2kodCkge1xuICAgIC8vIFRoaXMgaXMganVzdCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGZvciB0aGUgdW5zaWduZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIG51bWJlci5cbiAgICBjb25zdCBlID0gNjQgLSBmdW5jdGlvbih0KSB7XG4gICAgICAgIGxldCBlID0gMDtcbiAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCA4OyArK24pIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBLaSgyNTUgJiB0W25dKTtcbiAgICAgICAgICAgIGlmIChlICs9IHMsIDggIT09IHMpIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlO1xuICAgIH0odCk7XG4gICAgcmV0dXJuIE1hdGguY2VpbChlIC8gOCk7XG59XG5cbi8qKlxuICogT3JkZXJlZENvZGVXcml0ZXIgaXMgYSBtaW5pbWFsLWFsbG9jYXRpb24gaW1wbGVtZW50YXRpb24gb2YgdGhlIHdyaXRpbmdcbiAqIGJlaGF2aW9yIGRlZmluZWQgYnkgdGhlIGJhY2tlbmQuXG4gKlxuICogVGhlIGNvZGUgaXMgcG9ydGVkIGZyb20gaXRzIEphdmEgY291bnRlcnBhcnQuXG4gKi8gY2xhc3MgUWkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDEwMjQpLCB0aGlzLnBvc2l0aW9uID0gMDtcbiAgICB9XG4gICAgZGUodCkge1xuICAgICAgICBjb25zdCBlID0gdFtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICAgIGxldCBuID0gZS5uZXh0KCk7XG4gICAgICAgIGZvciAoOyFuLmRvbmU7ICkgdGhpcy5fZShuLnZhbHVlKSwgbiA9IGUubmV4dCgpO1xuICAgICAgICB0aGlzLndlKCk7XG4gICAgfVxuICAgIG1lKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHRbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgICBsZXQgbiA9IGUubmV4dCgpO1xuICAgICAgICBmb3IgKDshbi5kb25lOyApIHRoaXMuZ2Uobi52YWx1ZSksIG4gPSBlLm5leHQoKTtcbiAgICAgICAgdGhpcy55ZSgpO1xuICAgIH1cbiAgICAvKiogV3JpdGVzIHV0ZjggYnl0ZXMgaW50byB0aGlzIGJ5dGUgc2VxdWVuY2UsIGFzY2VuZGluZy4gKi8gICAgcGUodCkge1xuICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdCkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGUuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICAgIGlmICh0IDwgMTI4KSB0aGlzLl9lKHQpOyBlbHNlIGlmICh0IDwgMjA0OCkgdGhpcy5fZSg5NjAgfCB0ID4+PiA2KSwgdGhpcy5fZSgxMjggfCA2MyAmIHQpOyBlbHNlIGlmIChlIDwgXCJcXHVkODAwXCIgfHwgXCJcXHVkYmZmXCIgPCBlKSB0aGlzLl9lKDQ4MCB8IHQgPj4+IDEyKSwgXG4gICAgICAgICAgICB0aGlzLl9lKDEyOCB8IDYzICYgdCA+Pj4gNiksIHRoaXMuX2UoMTI4IHwgNjMgJiB0KTsgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IGUuY29kZVBvaW50QXQoMCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZSgyNDAgfCB0ID4+PiAxOCksIHRoaXMuX2UoMTI4IHwgNjMgJiB0ID4+PiAxMiksIHRoaXMuX2UoMTI4IHwgNjMgJiB0ID4+PiA2KSwgXG4gICAgICAgICAgICAgICAgdGhpcy5fZSgxMjggfCA2MyAmIHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMud2UoKTtcbiAgICB9XG4gICAgLyoqIFdyaXRlcyB1dGY4IGJ5dGVzIGludG8gdGhpcyBieXRlIHNlcXVlbmNlLCBkZXNjZW5kaW5nICovICAgIEllKHQpIHtcbiAgICAgICAgZm9yIChjb25zdCBlIG9mIHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBlLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICBpZiAodCA8IDEyOCkgdGhpcy5nZSh0KTsgZWxzZSBpZiAodCA8IDIwNDgpIHRoaXMuZ2UoOTYwIHwgdCA+Pj4gNiksIHRoaXMuZ2UoMTI4IHwgNjMgJiB0KTsgZWxzZSBpZiAoZSA8IFwiXFx1ZDgwMFwiIHx8IFwiXFx1ZGJmZlwiIDwgZSkgdGhpcy5nZSg0ODAgfCB0ID4+PiAxMiksIFxuICAgICAgICAgICAgdGhpcy5nZSgxMjggfCA2MyAmIHQgPj4+IDYpLCB0aGlzLmdlKDEyOCB8IDYzICYgdCk7IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBlLmNvZGVQb2ludEF0KDApO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2UoMjQwIHwgdCA+Pj4gMTgpLCB0aGlzLmdlKDEyOCB8IDYzICYgdCA+Pj4gMTIpLCB0aGlzLmdlKDEyOCB8IDYzICYgdCA+Pj4gNiksIFxuICAgICAgICAgICAgICAgIHRoaXMuZ2UoMTI4IHwgNjMgJiB0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnllKCk7XG4gICAgfVxuICAgIFRlKHQpIHtcbiAgICAgICAgLy8gVmFsdWVzIGFyZSBlbmNvZGVkIHdpdGggYSBzaW5nbGUgYnl0ZSBsZW5ndGggcHJlZml4LCBmb2xsb3dlZCBieSB0aGVcbiAgICAgICAgLy8gYWN0dWFsIHZhbHVlIGluIGJpZy1lbmRpYW4gZm9ybWF0IHdpdGggbGVhZGluZyAwIGJ5dGVzIGRyb3BwZWQuXG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLkVlKHQpLCBuID0gR2koZSk7XG4gICAgICAgIHRoaXMuQWUoMSArIG4pLCB0aGlzLmJ1ZmZlclt0aGlzLnBvc2l0aW9uKytdID0gMjU1ICYgbjtcbiAgICAgICAgLy8gV3JpdGUgdGhlIGxlbmd0aFxuICAgICAgICBmb3IgKGxldCB0ID0gZS5sZW5ndGggLSBuOyB0IDwgZS5sZW5ndGg7ICsrdCkgdGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbisrXSA9IDI1NSAmIGVbdF07XG4gICAgfVxuICAgIFJlKHQpIHtcbiAgICAgICAgLy8gVmFsdWVzIGFyZSBlbmNvZGVkIHdpdGggYSBzaW5nbGUgYnl0ZSBsZW5ndGggcHJlZml4LCBmb2xsb3dlZCBieSB0aGVcbiAgICAgICAgLy8gaW52ZXJ0ZWQgdmFsdWUgaW4gYmlnLWVuZGlhbiBmb3JtYXQgd2l0aCBsZWFkaW5nIDAgYnl0ZXMgZHJvcHBlZC5cbiAgICAgICAgY29uc3QgZSA9IHRoaXMuRWUodCksIG4gPSBHaShlKTtcbiAgICAgICAgdGhpcy5BZSgxICsgbiksIHRoaXMuYnVmZmVyW3RoaXMucG9zaXRpb24rK10gPSB+KDI1NSAmIG4pO1xuICAgICAgICAvLyBXcml0ZSB0aGUgbGVuZ3RoXG4gICAgICAgIGZvciAobGV0IHQgPSBlLmxlbmd0aCAtIG47IHQgPCBlLmxlbmd0aDsgKyt0KSB0aGlzLmJ1ZmZlclt0aGlzLnBvc2l0aW9uKytdID0gfigyNTUgJiBlW3RdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIHRoZSBcImluZmluaXR5XCIgYnl0ZSBzZXF1ZW5jZSB0aGF0IHNvcnRzIGFmdGVyIGFsbCBvdGhlciBieXRlXG4gICAgICogc2VxdWVuY2VzIHdyaXR0ZW4gaW4gYXNjZW5kaW5nIG9yZGVyLlxuICAgICAqLyAgICBiZSgpIHtcbiAgICAgICAgdGhpcy5QZSgyNTUpLCB0aGlzLlBlKDI1NSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyB0aGUgXCJpbmZpbml0eVwiIGJ5dGUgc2VxdWVuY2UgdGhhdCBzb3J0cyBiZWZvcmUgYWxsIG90aGVyIGJ5dGVcbiAgICAgKiBzZXF1ZW5jZXMgd3JpdHRlbiBpbiBkZXNjZW5kaW5nIG9yZGVyLlxuICAgICAqLyAgICBWZSgpIHtcbiAgICAgICAgdGhpcy52ZSgyNTUpLCB0aGlzLnZlKDI1NSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgYnVmZmVyIHN1Y2ggdGhhdCBpdCBpcyB0aGUgc2FtZSBhcyB3aGVuIGl0IHdhcyBuZXdseVxuICAgICAqIGNvbnN0cnVjdGVkLlxuICAgICAqLyAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IDA7XG4gICAgfVxuICAgIHNlZWQodCkge1xuICAgICAgICB0aGlzLkFlKHQubGVuZ3RoKSwgdGhpcy5idWZmZXIuc2V0KHQsIHRoaXMucG9zaXRpb24pLCB0aGlzLnBvc2l0aW9uICs9IHQubGVuZ3RoO1xuICAgIH1cbiAgICAvKiogTWFrZXMgYSBjb3B5IG9mIHRoZSBlbmNvZGVkIGJ5dGVzIGluIHRoaXMgYnVmZmVyLiAgKi8gICAgU2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5zbGljZSgwLCB0aGlzLnBvc2l0aW9uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5jb2RlcyBgdmFsYCBpbnRvIGFuIGVuY29kaW5nIHNvIHRoYXQgdGhlIG9yZGVyIG1hdGNoZXMgdGhlIElFRUUgNzU0XG4gICAgICogZmxvYXRpbmctcG9pbnQgY29tcGFyaXNvbiByZXN1bHRzIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb25zOlxuICAgICAqICAgLTAuMCA8IDAuMFxuICAgICAqICAgYWxsIG5vbi1OYU4gPCBOYU5cbiAgICAgKiAgIE5hTiA9IE5hTlxuICAgICAqLyAgICBFZSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBcbiAgICAgICAgLyoqIENvbnZlcnRzIGEgSmF2YVNjcmlwdCBudW1iZXIgdG8gYSBieXRlIGFycmF5ICh1c2luZyBiaWcgZW5kaWFuIGVuY29kaW5nKS4gKi9cbiAgICAgICAgZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoOCkpO1xuICAgICAgICAgICAgcmV0dXJuIGUuc2V0RmxvYXQ2NCgwLCB0LCAvKiBsaXR0bGVFbmRpYW49ICovICExKSwgbmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIpO1xuICAgICAgICB9KHQpLCBuID0gMCAhPSAoMTI4ICYgZVswXSk7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBmaXJzdCBiaXQgaXMgc2V0LiBXZSB1c2UgYSBiaXQgbWFzayBzaW5jZSB2YWx1ZVswXSBpc1xuICAgICAgICAvLyBlbmNvZGVkIGFzIGEgbnVtYmVyIGZyb20gMCB0byAyNTUuXG4gICAgICAgICAgICAgICAgLy8gUmV2ZXJ0IHRoZSB0d28gY29tcGxlbWVudCB0byBnZXQgbmF0dXJhbCBvcmRlcmluZ1xuICAgICAgICBlWzBdIF49IG4gPyAyNTUgOiAxMjg7XG4gICAgICAgIGZvciAobGV0IHQgPSAxOyB0IDwgZS5sZW5ndGg7ICsrdCkgZVt0XSBePSBuID8gMjU1IDogMDtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgfVxuICAgIC8qKiBXcml0ZXMgYSBzaW5nbGUgYnl0ZSBhc2NlbmRpbmcgdG8gdGhlIGJ1ZmZlci4gKi8gICAgX2UodCkge1xuICAgICAgICBjb25zdCBlID0gMjU1ICYgdDtcbiAgICAgICAgMCA9PT0gZSA/ICh0aGlzLlBlKDApLCB0aGlzLlBlKDI1NSkpIDogMjU1ID09PSBlID8gKHRoaXMuUGUoMjU1KSwgdGhpcy5QZSgwKSkgOiB0aGlzLlBlKGUpO1xuICAgIH1cbiAgICAvKiogV3JpdGVzIGEgc2luZ2xlIGJ5dGUgZGVzY2VuZGluZyB0byB0aGUgYnVmZmVyLiAgKi8gICAgZ2UodCkge1xuICAgICAgICBjb25zdCBlID0gMjU1ICYgdDtcbiAgICAgICAgMCA9PT0gZSA/ICh0aGlzLnZlKDApLCB0aGlzLnZlKDI1NSkpIDogMjU1ID09PSBlID8gKHRoaXMudmUoMjU1KSwgdGhpcy52ZSgwKSkgOiB0aGlzLnZlKHQpO1xuICAgIH1cbiAgICB3ZSgpIHtcbiAgICAgICAgdGhpcy5QZSgwKSwgdGhpcy5QZSgxKTtcbiAgICB9XG4gICAgeWUoKSB7XG4gICAgICAgIHRoaXMudmUoMCksIHRoaXMudmUoMSk7XG4gICAgfVxuICAgIFBlKHQpIHtcbiAgICAgICAgdGhpcy5BZSgxKSwgdGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbisrXSA9IHQ7XG4gICAgfVxuICAgIHZlKHQpIHtcbiAgICAgICAgdGhpcy5BZSgxKSwgdGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbisrXSA9IH50O1xuICAgIH1cbiAgICBBZSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0ICsgdGhpcy5wb3NpdGlvbjtcbiAgICAgICAgaWYgKGUgPD0gdGhpcy5idWZmZXIubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIC8vIFRyeSBkb3VibGluZy5cbiAgICAgICAgICAgICAgICBsZXQgbiA9IDIgKiB0aGlzLmJ1ZmZlci5sZW5ndGg7XG4gICAgICAgIC8vIFN0aWxsIG5vdCBiaWcgZW5vdWdoPyBKdXN0IGFsbG9jYXRlIHRoZSByaWdodCBzaXplLlxuICAgICAgICAgICAgICAgIG4gPCBlICYmIChuID0gZSk7XG4gICAgICAgIC8vIENyZWF0ZSB0aGUgbmV3IGJ1ZmZlci5cbiAgICAgICAgICAgICAgICBjb25zdCBzID0gbmV3IFVpbnQ4QXJyYXkobik7XG4gICAgICAgIHMuc2V0KHRoaXMuYnVmZmVyKSwgLy8gY29weSBvbGQgZGF0YVxuICAgICAgICB0aGlzLmJ1ZmZlciA9IHM7XG4gICAgfVxufVxuXG5jbGFzcyBqaSB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLkRlID0gdDtcbiAgICB9XG4gICAgYWUodCkge1xuICAgICAgICB0aGlzLkRlLmRlKHQpO1xuICAgIH1cbiAgICBpZSh0KSB7XG4gICAgICAgIHRoaXMuRGUucGUodCk7XG4gICAgfVxuICAgIHNlKHQpIHtcbiAgICAgICAgdGhpcy5EZS5UZSh0KTtcbiAgICB9XG4gICAgZWUoKSB7XG4gICAgICAgIHRoaXMuRGUuYmUoKTtcbiAgICB9XG59XG5cbmNsYXNzIFdpIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMuRGUgPSB0O1xuICAgIH1cbiAgICBhZSh0KSB7XG4gICAgICAgIHRoaXMuRGUubWUodCk7XG4gICAgfVxuICAgIGllKHQpIHtcbiAgICAgICAgdGhpcy5EZS5JZSh0KTtcbiAgICB9XG4gICAgc2UodCkge1xuICAgICAgICB0aGlzLkRlLlJlKHQpO1xuICAgIH1cbiAgICBlZSgpIHtcbiAgICAgICAgdGhpcy5EZS5WZSgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIGBEaXJlY3Rpb25hbEluZGV4Qnl0ZUVuY29kZXJgIHVzaW5nIGBPcmRlcmVkQ29kZVdyaXRlcmAgZm9yIHRoZVxuICogYWN0dWFsIGVuY29kaW5nLlxuICovIGNsYXNzIHppIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5EZSA9IG5ldyBRaSwgdGhpcy5DZSA9IG5ldyBqaSh0aGlzLkRlKSwgdGhpcy54ZSA9IG5ldyBXaSh0aGlzLkRlKTtcbiAgICB9XG4gICAgc2VlZCh0KSB7XG4gICAgICAgIHRoaXMuRGUuc2VlZCh0KTtcbiAgICB9XG4gICAgTmUodCkge1xuICAgICAgICByZXR1cm4gMCAvKiBBU0NFTkRJTkcgKi8gPT09IHQgPyB0aGlzLkNlIDogdGhpcy54ZTtcbiAgICB9XG4gICAgU2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkRlLlNlKCk7XG4gICAgfVxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLkRlLnJlc2V0KCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqIFJlcHJlc2VudHMgYW4gaW5kZXggZW50cnkgc2F2ZWQgYnkgdGhlIFNESyBpbiBwZXJzaXN0ZWQgc3RvcmFnZS4gKi8gY2xhc3MgSGkge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgdGhpcy5pbmRleElkID0gdCwgdGhpcy5kb2N1bWVudEtleSA9IGUsIHRoaXMuYXJyYXlWYWx1ZSA9IG4sIHRoaXMuZGlyZWN0aW9uYWxWYWx1ZSA9IHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gSW5kZXhFbnRyeSBlbnRyeSB0aGF0IHNvcnRzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjdXJyZW50XG4gICAgICogZGlyZWN0aW9uYWwgdmFsdWUuXG4gICAgICovICAgIGtlKCkge1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5kaXJlY3Rpb25hbFZhbHVlLmxlbmd0aCwgZSA9IDAgPT09IHQgfHwgMjU1ID09PSB0aGlzLmRpcmVjdGlvbmFsVmFsdWVbdCAtIDFdID8gdCArIDEgOiB0LCBuID0gbmV3IFVpbnQ4QXJyYXkoZSk7XG4gICAgICAgIHJldHVybiBuLnNldCh0aGlzLmRpcmVjdGlvbmFsVmFsdWUsIDApLCBlICE9PSB0ID8gbi5zZXQoWyAwIF0sIHRoaXMuZGlyZWN0aW9uYWxWYWx1ZS5sZW5ndGgpIDogKytuW24ubGVuZ3RoIC0gMV0sIFxuICAgICAgICBuZXcgSGkodGhpcy5pbmRleElkLCB0aGlzLmRvY3VtZW50S2V5LCB0aGlzLmFycmF5VmFsdWUsIG4pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gSmkodCwgZSkge1xuICAgIGxldCBuID0gdC5pbmRleElkIC0gZS5pbmRleElkO1xuICAgIHJldHVybiAwICE9PSBuID8gbiA6IChuID0gWWkodC5hcnJheVZhbHVlLCBlLmFycmF5VmFsdWUpLCAwICE9PSBuID8gbiA6IChuID0gWWkodC5kaXJlY3Rpb25hbFZhbHVlLCBlLmRpcmVjdGlvbmFsVmFsdWUpLCBcbiAgICAwICE9PSBuID8gbiA6IHh0LmNvbXBhcmF0b3IodC5kb2N1bWVudEtleSwgZS5kb2N1bWVudEtleSkpKTtcbn1cblxuZnVuY3Rpb24gWWkodCwgZSkge1xuICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdC5sZW5ndGggJiYgbiA8IGUubGVuZ3RoOyArK24pIHtcbiAgICAgICAgY29uc3QgcyA9IHRbbl0gLSBlW25dO1xuICAgICAgICBpZiAoMCAhPT0gcykgcmV0dXJuIHM7XG4gICAgfVxuICAgIHJldHVybiB0Lmxlbmd0aCAtIGUubGVuZ3RoO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIGxpZ2h0IHF1ZXJ5IHBsYW5uZXIgZm9yIEZpcmVzdG9yZS5cbiAqXG4gKiBUaGlzIGNsYXNzIG1hdGNoZXMgYSBgRmllbGRJbmRleGAgYWdhaW5zdCBhIEZpcmVzdG9yZSBRdWVyeSBgVGFyZ2V0YC4gSXRcbiAqIGRldGVybWluZXMgd2hldGhlciBhIGdpdmVuIGluZGV4IGNhbiBiZSB1c2VkIHRvIHNlcnZlIHRoZSBzcGVjaWZpZWQgdGFyZ2V0LlxuICpcbiAqIFRoZSBmb2xsb3dpbmcgdGFibGUgc2hvd2Nhc2VzIHNvbWUgcG9zc2libGUgaW5kZXggY29uZmlndXJhdGlvbnM6XG4gKlxuICogUXVlcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSW5kZXhcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiB3aGVyZSgnYScsICc9PScsICdhJykud2hlcmUoJ2InLCAnPT0nLCAnYicpICAgICAgICAgfCBhIEFTQywgYiBERVNDXG4gKiB3aGVyZSgnYScsICc9PScsICdhJykud2hlcmUoJ2InLCAnPT0nLCAnYicpICAgICAgICAgfCBhIEFTQ1xuICogd2hlcmUoJ2EnLCAnPT0nLCAnYScpLndoZXJlKCdiJywgJz09JywgJ2InKSAgICAgICAgIHwgYiBERVNDXG4gKiB3aGVyZSgnYScsICc+PScsICdhJykub3JkZXJCeSgnYScpICAgICAgICAgICAgICAgICAgfCBhIEFTQ1xuICogd2hlcmUoJ2EnLCAnPj0nLCAnYScpLm9yZGVyQnkoJ2EnLCAnZGVzYycpICAgICAgICAgIHwgYSBERVNDXG4gKiB3aGVyZSgnYScsICc+PScsICdhJykub3JkZXJCeSgnYScpLm9yZGVyQnkoJ2InKSAgICAgfCBhIEFTQywgYiBBU0NcbiAqIHdoZXJlKCdhJywgJz49JywgJ2EnKS5vcmRlckJ5KCdhJykub3JkZXJCeSgnYicpICAgICB8IGEgQVNDXG4gKiB3aGVyZSgnYScsICdhcnJheS1jb250YWlucycsICdhJykub3JkZXJCeSgnYicpICAgICAgfCBhIENPTlRBSU5TLCBiIEFTQ0VORElOR1xuICogd2hlcmUoJ2EnLCAnYXJyYXktY29udGFpbnMnLCAnYScpLm9yZGVyQnkoJ2InKSAgICAgIHwgYSBDT05UQUlOU1xuICovIGNsYXNzIFhpIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMuY29sbGVjdGlvbklkID0gbnVsbCAhPSB0LmNvbGxlY3Rpb25Hcm91cCA/IHQuY29sbGVjdGlvbkdyb3VwIDogdC5wYXRoLmxhc3RTZWdtZW50KCksIFxuICAgICAgICB0aGlzLk1lID0gdC5vcmRlckJ5LCB0aGlzLk9lID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiB0LmZpbHRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBlO1xuICAgICAgICAgICAgdC5TKCkgPyB0aGlzLiRlID0gdCA6IHRoaXMuT2UucHVzaCh0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGluZGV4IGNhbiBiZSB1c2VkIHRvIHNlcnZlIHRoZSBUYXJnZXRJbmRleE1hdGNoZXInc1xuICAgICAqIHRhcmdldC5cbiAgICAgKlxuICAgICAqIEFuIGluZGV4IGlzIGNvbnNpZGVyZWQgY2FwYWJsZSBvZiBzZXJ2aW5nIHRoZSB0YXJnZXQgd2hlbjpcbiAgICAgKiAtIFRoZSB0YXJnZXQgdXNlcyBhbGwgaW5kZXggc2VnbWVudHMgZm9yIGl0cyBmaWx0ZXJzIGFuZCBvcmRlckJ5IGNsYXVzZXMuXG4gICAgICogICBUaGUgdGFyZ2V0IGNhbiBoYXZlIGFkZGl0aW9uYWwgZmlsdGVyIGFuZCBvcmRlckJ5IGNsYXVzZXMsIGJ1dCBub3RcbiAgICAgKiAgIGZld2VyLlxuICAgICAqIC0gSWYgYW4gQXJyYXlDb250YWlucy9BcnJheUNvbnRhaW5zQW55ZmlsdGVyIGlzIHVzZWQsIHRoZSBpbmRleCBtdXN0IGFsc29cbiAgICAgKiAgIGhhdmUgYSBjb3JyZXNwb25kaW5nIGBDT05UQUlOU2Agc2VnbWVudC5cbiAgICAgKiAtIEFsbCBkaXJlY3Rpb25hbCBpbmRleCBzZWdtZW50cyBjYW4gYmUgbWFwcGVkIHRvIHRoZSB0YXJnZXQgYXMgYSBzZXJpZXMgb2ZcbiAgICAgKiAgIGVxdWFsaXR5IGZpbHRlcnMsIGEgc2luZ2xlIGluZXF1YWxpdHkgZmlsdGVyIGFuZCBhIHNlcmllcyBvZiBvcmRlckJ5XG4gICAgICogICBjbGF1c2VzLlxuICAgICAqIC0gVGhlIHNlZ21lbnRzIHRoYXQgcmVwcmVzZW50IHRoZSBlcXVhbGl0eSBmaWx0ZXJzIG1heSBhcHBlYXIgb3V0IG9mIG9yZGVyLlxuICAgICAqIC0gVGhlIG9wdGlvbmFsIHNlZ21lbnQgZm9yIHRoZSBpbmVxdWFsaXR5IGZpbHRlciBtdXN0IGFwcGVhciBhZnRlciBhbGxcbiAgICAgKiAgIGVxdWFsaXR5IHNlZ21lbnRzLlxuICAgICAqIC0gVGhlIHNlZ21lbnRzIHRoYXQgcmVwcmVzZW50IHRoYXQgb3JkZXJCeSBjbGF1c2Ugb2YgdGhlIHRhcmdldCBtdXN0IGFwcGVhclxuICAgICAqICAgaW4gb3JkZXIgYWZ0ZXIgYWxsIGVxdWFsaXR5IGFuZCBpbmVxdWFsaXR5IHNlZ21lbnRzLiBTaW5nbGUgb3JkZXJCeVxuICAgICAqICAgY2xhdXNlcyBjYW5ub3QgYmUgc2tpcHBlZCwgYnV0IGEgY29udGludW91cyBvcmRlckJ5IHN1ZmZpeCBtYXkgYmVcbiAgICAgKiAgIG9taXR0ZWQuXG4gICAgICovICAgIEZlKHQpIHtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgYW4gYXJyYXkgZWxlbWVudCwgZmluZCBhIG1hdGNoaW5nIGZpbHRlci5cbiAgICAgICAgY29uc3QgZSA9IG5lKHQpO1xuICAgICAgICBpZiAodm9pZCAwICE9PSBlICYmICF0aGlzLkJlKGUpKSByZXR1cm4gITE7XG4gICAgICAgIGNvbnN0IG4gPSBzZSh0KTtcbiAgICAgICAgbGV0IHMgPSAwLCBpID0gMDtcbiAgICAgICAgLy8gUHJvY2VzcyBhbGwgZXF1YWxpdGllcyBmaXJzdC4gRXF1YWxpdGllcyBjYW4gYXBwZWFyIG91dCBvZiBvcmRlci5cbiAgICAgICAgZm9yICg7cyA8IG4ubGVuZ3RoICYmIHRoaXMuQmUobltzXSk7ICsrcykgO1xuICAgICAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgcHJvY2Vzc2VkIGFsbCBzZWdtZW50cywgYWxsIHNlZ21lbnRzIGFyZSB1c2VkIHRvIHNlcnZlXG4gICAgICAgIC8vIHRoZSBlcXVhbGl0eSBmaWx0ZXJzIGFuZCB3ZSBkbyBub3QgbmVlZCB0byBtYXAgYW55IHNlZ21lbnRzIHRvIHRoZVxuICAgICAgICAvLyB0YXJnZXQncyBpbmVxdWFsaXR5IGFuZCBvcmRlckJ5IGNsYXVzZXMuXG4gICAgICAgICAgICAgICAgaWYgKHMgPT09IG4ubGVuZ3RoKSByZXR1cm4gITA7XG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGFuIGluZXF1YWxpdHkgZmlsdGVyLCB0aGUgbmV4dCBzZWdtZW50IG11c3QgbWF0Y2ggYm90aCB0aGVcbiAgICAgICAgLy8gZmlsdGVyIGFuZCB0aGUgZmlyc3Qgb3JkZXJCeSBjbGF1c2UuXG4gICAgICAgICAgICAgICAgaWYgKHZvaWQgMCAhPT0gdGhpcy4kZSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IG5bc107XG4gICAgICAgICAgICBpZiAoIXRoaXMuTGUodGhpcy4kZSwgdCkgfHwgIXRoaXMucWUodGhpcy5NZVtpKytdLCB0KSkgcmV0dXJuICExO1xuICAgICAgICAgICAgKytzO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFsbCByZW1haW5pbmcgc2VnbWVudHMgbmVlZCB0byByZXByZXNlbnQgdGhlIHByZWZpeCBvZiB0aGUgdGFyZ2V0J3NcbiAgICAgICAgLy8gb3JkZXJCeS5cbiAgICAgICAgICAgICAgICBmb3IgKDtzIDwgbi5sZW5ndGg7ICsrcykge1xuICAgICAgICAgICAgY29uc3QgdCA9IG5bc107XG4gICAgICAgICAgICBpZiAoaSA+PSB0aGlzLk1lLmxlbmd0aCB8fCAhdGhpcy5xZSh0aGlzLk1lW2krK10sIHQpKSByZXR1cm4gITE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICEwO1xuICAgIH1cbiAgICBCZSh0KSB7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLk9lKSBpZiAodGhpcy5MZShlLCB0KSkgcmV0dXJuICEwO1xuICAgICAgICByZXR1cm4gITE7XG4gICAgfVxuICAgIExlKHQsIGUpIHtcbiAgICAgICAgaWYgKHZvaWQgMCA9PT0gdCB8fCAhdC5maWVsZC5pc0VxdWFsKGUuZmllbGRQYXRoKSkgcmV0dXJuICExO1xuICAgICAgICBjb25zdCBuID0gXCJhcnJheS1jb250YWluc1wiIC8qIEFSUkFZX0NPTlRBSU5TICovID09PSB0Lm9wIHx8IFwiYXJyYXktY29udGFpbnMtYW55XCIgLyogQVJSQVlfQ09OVEFJTlNfQU5ZICovID09PSB0Lm9wO1xuICAgICAgICByZXR1cm4gMiAvKiBDT05UQUlOUyAqLyA9PT0gZS5raW5kID09PSBuO1xuICAgIH1cbiAgICBxZSh0LCBlKSB7XG4gICAgICAgIHJldHVybiAhIXQuZmllbGQuaXNFcXVhbChlLmZpZWxkUGF0aCkgJiYgKDAgLyogQVNDRU5ESU5HICovID09PSBlLmtpbmQgJiYgXCJhc2NcIiAvKiBBU0NFTkRJTkcgKi8gPT09IHQuZGlyIHx8IDEgLyogREVTQ0VORElORyAqLyA9PT0gZS5raW5kICYmIFwiZGVzY1wiIC8qIERFU0NFTkRJTkcgKi8gPT09IHQuZGlyKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEFuIGluLW1lbW9yeSBpbXBsZW1lbnRhdGlvbiBvZiBJbmRleE1hbmFnZXIuXG4gKi8gY2xhc3MgWmkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLlVlID0gbmV3IHRyO1xuICAgIH1cbiAgICBhZGRUb0NvbGxlY3Rpb25QYXJlbnRJbmRleCh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLlVlLmFkZChlKSwgdWkucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBnZXRDb2xsZWN0aW9uUGFyZW50cyh0LCBlKSB7XG4gICAgICAgIHJldHVybiB1aS5yZXNvbHZlKHRoaXMuVWUuZ2V0RW50cmllcyhlKSk7XG4gICAgfVxuICAgIGFkZEZpZWxkSW5kZXgodCwgZSkge1xuICAgICAgICAvLyBGaWVsZCBpbmRpY2VzIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggbWVtb3J5IHBlcnNpc3RlbmNlLlxuICAgICAgICByZXR1cm4gdWkucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBkZWxldGVGaWVsZEluZGV4KHQsIGUpIHtcbiAgICAgICAgLy8gRmllbGQgaW5kaWNlcyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIG1lbW9yeSBwZXJzaXN0ZW5jZS5cbiAgICAgICAgcmV0dXJuIHVpLnJlc29sdmUoKTtcbiAgICB9XG4gICAgZ2V0RG9jdW1lbnRzTWF0Y2hpbmdUYXJnZXQodCwgZSkge1xuICAgICAgICAvLyBGaWVsZCBpbmRpY2VzIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggbWVtb3J5IHBlcnNpc3RlbmNlLlxuICAgICAgICByZXR1cm4gdWkucmVzb2x2ZShudWxsKTtcbiAgICB9XG4gICAgZ2V0RmllbGRJbmRleCh0LCBlKSB7XG4gICAgICAgIC8vIEZpZWxkIGluZGljZXMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBtZW1vcnkgcGVyc2lzdGVuY2UuXG4gICAgICAgIHJldHVybiB1aS5yZXNvbHZlKG51bGwpO1xuICAgIH1cbiAgICBnZXRGaWVsZEluZGV4ZXModCwgZSkge1xuICAgICAgICAvLyBGaWVsZCBpbmRpY2VzIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggbWVtb3J5IHBlcnNpc3RlbmNlLlxuICAgICAgICByZXR1cm4gdWkucmVzb2x2ZShbXSk7XG4gICAgfVxuICAgIGdldE5leHRDb2xsZWN0aW9uR3JvdXBUb1VwZGF0ZSh0KSB7XG4gICAgICAgIC8vIEZpZWxkIGluZGljZXMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBtZW1vcnkgcGVyc2lzdGVuY2UuXG4gICAgICAgIHJldHVybiB1aS5yZXNvbHZlKG51bGwpO1xuICAgIH1cbiAgICB1cGRhdGVDb2xsZWN0aW9uR3JvdXAodCwgZSwgbikge1xuICAgICAgICAvLyBGaWVsZCBpbmRpY2VzIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggbWVtb3J5IHBlcnNpc3RlbmNlLlxuICAgICAgICByZXR1cm4gdWkucmVzb2x2ZSgpO1xuICAgIH1cbiAgICB1cGRhdGVJbmRleEVudHJpZXModCwgZSkge1xuICAgICAgICAvLyBGaWVsZCBpbmRpY2VzIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggbWVtb3J5IHBlcnNpc3RlbmNlLlxuICAgICAgICByZXR1cm4gdWkucmVzb2x2ZSgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29sbGVjdGlvbi1wYXJlbnQgaW5kZXggZXhwb3NlZCBieSBNZW1vcnlJbmRleE1hbmFnZXIuXG4gKiBBbHNvIHVzZWQgZm9yIGluLW1lbW9yeSBjYWNoaW5nIGJ5IEluZGV4ZWREYkluZGV4TWFuYWdlciBhbmQgaW5pdGlhbCBpbmRleCBwb3B1bGF0aW9uXG4gKiBpbiBpbmRleGVkZGJfc2NoZW1hLnRzXG4gKi8gY2xhc3MgdHIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmluZGV4ID0ge307XG4gICAgfVxuICAgIC8vIFJldHVybnMgZmFsc2UgaWYgdGhlIGVudHJ5IGFscmVhZHkgZXhpc3RlZC5cbiAgICBhZGQodCkge1xuICAgICAgICBjb25zdCBlID0gdC5sYXN0U2VnbWVudCgpLCBuID0gdC5wb3BMYXN0KCksIHMgPSB0aGlzLmluZGV4W2VdIHx8IG5ldyBrbihfdC5jb21wYXJhdG9yKSwgaSA9ICFzLmhhcyhuKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXhbZV0gPSBzLmFkZChuKSwgaTtcbiAgICB9XG4gICAgaGFzKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQubGFzdFNlZ21lbnQoKSwgbiA9IHQucG9wTGFzdCgpLCBzID0gdGhpcy5pbmRleFtlXTtcbiAgICAgICAgcmV0dXJuIHMgJiYgcy5oYXMobik7XG4gICAgfVxuICAgIGdldEVudHJpZXModCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuaW5kZXhbdF0gfHwgbmV3IGtuKF90LmNvbXBhcmF0b3IpKS50b0FycmF5KCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjb25zdCBlciA9IG5ldyBVaW50OEFycmF5KDApO1xuXG4vKipcbiAqIEEgcGVyc2lzdGVkIGltcGxlbWVudGF0aW9uIG9mIEluZGV4TWFuYWdlci5cbiAqXG4gKiBQT1JUSU5HIE5PVEU6IFVubGlrZSBpT1MgYW5kIEFuZHJvaWQsIHRoZSBXZWIgU0RLIGRvZXMgbm90IG1lbW9pemUgaW5kZXhcbiAqIGRhdGEgYXMgaXQgc3VwcG9ydHMgbXVsdGktdGFiIGFjY2Vzcy5cbiAqL1xuY2xhc3MgbnIge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy51c2VyID0gdCwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBpbi1tZW1vcnkgY29weSBvZiB0aGUgaW5kZXggZW50cmllcyB3ZSd2ZSBhbHJlYWR5IHdyaXR0ZW4gc2luY2UgdGhlIFNES1xuICAgICAgICAgKiBsYXVuY2hlZC4gVXNlZCB0byBhdm9pZCByZS13cml0aW5nIHRoZSBzYW1lIGVudHJ5IHJlcGVhdGVkbHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgaXMgKk5PVCogYSBjb21wbGV0ZSBjYWNoZSBvZiB3aGF0J3MgaW4gcGVyc2lzdGVuY2UgYW5kIHNvIGNhbiBuZXZlciBiZVxuICAgICAgICAgKiB1c2VkIHRvIHNhdGlzZnkgcmVhZHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLktlID0gbmV3IHRyLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1hcHMgZnJvbSBhIHRhcmdldCB0byBpdHMgZXF1aXZhbGVudCBsaXN0IG9mIHN1Yi10YXJnZXRzLiBFYWNoIHN1Yi10YXJnZXRcbiAgICAgICAgICogY29udGFpbnMgb25seSBvbmUgdGVybSBmcm9tIHRoZSB0YXJnZXQncyBkaXNqdW5jdGl2ZSBub3JtYWwgZm9ybSAoRE5GKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuR2UgPSBuZXcgRG4oKHQgPT4gY2UodCkpLCAoKHQsIGUpID0+IGxlKHQsIGUpKSksIHRoaXMudWlkID0gdC51aWQgfHwgXCJcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIG5ldyBlbnRyeSB0byB0aGUgY29sbGVjdGlvbiBwYXJlbnQgaW5kZXguXG4gICAgICpcbiAgICAgKiBSZXBlYXRlZCBjYWxscyBmb3IgdGhlIHNhbWUgY29sbGVjdGlvblBhdGggc2hvdWxkIGJlIGF2b2lkZWQgd2l0aGluIGFcbiAgICAgKiB0cmFuc2FjdGlvbiBhcyBJbmRleGVkRGJJbmRleE1hbmFnZXIgb25seSBjYWNoZXMgd3JpdGVzIG9uY2UgYSB0cmFuc2FjdGlvblxuICAgICAqIGhhcyBiZWVuIGNvbW1pdHRlZC5cbiAgICAgKi8gICAgYWRkVG9Db2xsZWN0aW9uUGFyZW50SW5kZXgodCwgZSkge1xuICAgICAgICBpZiAoIXRoaXMuS2UuaGFzKGUpKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gZS5sYXN0U2VnbWVudCgpLCBzID0gZS5wb3BMYXN0KCk7XG4gICAgICAgICAgICB0LmFkZE9uQ29tbWl0dGVkTGlzdGVuZXIoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGNvbGxlY3Rpb24gdG8gdGhlIGluIG1lbW9yeSBjYWNoZSBvbmx5IGlmIHRoZSB0cmFuc2FjdGlvbiB3YXNcbiAgICAgICAgICAgICAgICAvLyBzdWNjZXNzZnVsbHkgY29tbWl0dGVkLlxuICAgICAgICAgICAgICAgIHRoaXMuS2UuYWRkKGUpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgY29uc3QgaSA9IHtcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uSWQ6IG4sXG4gICAgICAgICAgICAgICAgcGFyZW50OiAkcyhzKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBzcih0KS5wdXQoaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVpLnJlc29sdmUoKTtcbiAgICB9XG4gICAgZ2V0Q29sbGVjdGlvblBhcmVudHModCwgZSkge1xuICAgICAgICBjb25zdCBuID0gW10sIHMgPSBJREJLZXlSYW5nZS5ib3VuZChbIGUsIFwiXCIgXSwgWyBhdChlKSwgXCJcIiBdLCBcbiAgICAgICAgLypsb3dlck9wZW49Ki8gITEsIFxuICAgICAgICAvKnVwcGVyT3Blbj0qLyAhMCk7XG4gICAgICAgIHJldHVybiBzcih0KS5VdChzKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcyBvZiB0KSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBjb2xsZWN0aW9uSWQgZ3VhcmQgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSAoYW5kIGlzbid0IGFzIGxvbmdcbiAgICAgICAgICAgICAgICAvLyBhcyB3ZSdyZSBydW5uaW5nIGluIGEgcmVhbCBicm93c2VyKSwgYnV0IHRoZXJlJ3MgYSBidWcgaW5cbiAgICAgICAgICAgICAgICAvLyBpbmRleGVkZGJzaGltIHRoYXQgYnJlYWtzIG91ciByYW5nZSBpbiBvdXIgdGVzdHMgcnVubmluZyBpbiBub2RlOlxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9heGVtY2xpb24vSW5kZXhlZERCU2hpbS9pc3N1ZXMvMzM0XG4gICAgICAgICAgICAgICAgaWYgKHMuY29sbGVjdGlvbklkICE9PSBlKSBicmVhaztcbiAgICAgICAgICAgICAgICBuLnB1c2goTHMocy5wYXJlbnQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGFkZEZpZWxkSW5kZXgodCwgZSkge1xuICAgICAgICAvLyBUT0RPKGluZGV4aW5nKTogVmVyaWZ5IHRoYXQgdGhlIGF1dG8taW5jcmVtZW50aW5nIGluZGV4IElEIHdvcmtzIGluXG4gICAgICAgIC8vIFNhZmFyaSAmIEZpcmVmb3guXG4gICAgICAgIGNvbnN0IG4gPSBycih0KSwgcyA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaW5kZXhJZDogdC5pbmRleElkLFxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25Hcm91cDogdC5jb2xsZWN0aW9uR3JvdXAsXG4gICAgICAgICAgICAgICAgZmllbGRzOiB0LmZpZWxkcy5tYXAoKHQgPT4gWyB0LmZpZWxkUGF0aC5jYW5vbmljYWxTdHJpbmcoKSwgdC5raW5kIF0pKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfShlKTtcbiAgICAgICAgLy8gYGluZGV4SWRgIGlzIGF1dG8tcG9wdWxhdGVkIGJ5IEluZGV4ZWREYlxuICAgICAgICByZXR1cm4gZGVsZXRlIHMuaW5kZXhJZCwgbi5hZGQocykubmV4dCgpO1xuICAgIH1cbiAgICBkZWxldGVGaWVsZEluZGV4KHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IHJyKHQpLCBzID0gb3IodCksIGkgPSBpcih0KTtcbiAgICAgICAgcmV0dXJuIG4uZGVsZXRlKGUuaW5kZXhJZCkubmV4dCgoKCkgPT4gcy5kZWxldGUoSURCS2V5UmFuZ2UuYm91bmQoWyBlLmluZGV4SWQgXSwgWyBlLmluZGV4SWQgKyAxIF0sIFxuICAgICAgICAvKmxvd2VyT3Blbj0qLyAhMSwgXG4gICAgICAgIC8qdXBwZXJPcGVuPSovICEwKSkpKS5uZXh0KCgoKSA9PiBpLmRlbGV0ZShJREJLZXlSYW5nZS5ib3VuZChbIGUuaW5kZXhJZCBdLCBbIGUuaW5kZXhJZCArIDEgXSwgXG4gICAgICAgIC8qbG93ZXJPcGVuPSovICExLCBcbiAgICAgICAgLyp1cHBlck9wZW49Ki8gITApKSkpO1xuICAgIH1cbiAgICBnZXREb2N1bWVudHNNYXRjaGluZ1RhcmdldCh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBpcih0KTtcbiAgICAgICAgbGV0IHMgPSAhMDtcbiAgICAgICAgY29uc3QgaSA9IG5ldyBNYXA7XG4gICAgICAgIHJldHVybiB1aS5mb3JFYWNoKHRoaXMuUWUoZSksIChlID0+IHRoaXMuZ2V0RmllbGRJbmRleCh0LCBlKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgIHMgJiYgKHMgPSAhIXQpLCBpLnNldChlLCB0KTtcbiAgICAgICAgfSkpKSkubmV4dCgoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgdCA9IEduKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVpLmZvckVhY2goaSwgKChzLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByO1xuICAgICAgICAgICAgICAgICAgICBPKFwiSW5kZXhlZERiSW5kZXhNYW5hZ2VyXCIsIGBVc2luZyBpbmRleCAke3IgPSBzLCBgaWQ9JHtyLmluZGV4SWR9fGNnPSR7ci5jb2xsZWN0aW9uR3JvdXB9fGY9JHtyLmZpZWxkcy5tYXAoKHQgPT4gYCR7dC5maWVsZFBhdGh9OiR7dC5raW5kfWApKS5qb2luKFwiLFwiKX1gfSB0byBleGVjdXRlICR7Y2UoZSl9YCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG8gPSBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gbmUoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSBuKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBkZSh0LCBuLmZpZWxkUGF0aCkpIHN3aXRjaCAoZS5vcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYXJyYXktY29udGFpbnMtYW55XCIgLyogQVJSQVlfQ09OVEFJTlNfQU5ZICovIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS52YWx1ZS5hcnJheVZhbHVlLnZhbHVlcyB8fCBbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYXJyYXktY29udGFpbnNcIiAvKiBBUlJBWV9DT05UQUlOUyAqLyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgZS52YWx1ZSBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbWFpbmluZyBmaWx0ZXJzIGFyZSBub3QgYXJyYXkgZmlsdGVycy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICogUmV0dXJucyB0aGUgbGlzdCBvZiB2YWx1ZXMgdGhhdCBhcmUgdXNlZCBpbiAhPSBvciBOT1RfSU4gZmlsdGVycy4gUmV0dXJuc1xuICogYG51bGxgIGlmIHRoZXJlIGFyZSBubyBzdWNoIGZpbHRlcnMuXG4gKi8gKGksIHMpLCBhID0gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IG5ldyBNYXA7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHMgb2Ygc2UoZSkpIGZvciAoY29uc3QgZSBvZiBkZSh0LCBzLmZpZWxkUGF0aCkpIHN3aXRjaCAoZS5vcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiPT1cIiAvKiBFUVVBTCAqLyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpblwiIC8qIElOICovIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbmNvZGUgZXF1YWxpdHkgcHJlZml4LCB3aGljaCBpcyBlbmNvZGVkIGluIHRoZSBpbmRleCB2YWx1ZSBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5lcXVhbGl0eSAoZS5nLiBgYSA9PSAnYScgJiYgYiAhPSAnYidgIGlzIGVuY29kZWQgdG9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgdmFsdWUgIT0gJ2FiJ2ApLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uc2V0KHMuZmllbGRQYXRoLmNhbm9uaWNhbFN0cmluZygpLCBlLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwibm90LWluXCIgLyogTk9UX0lOICovIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIiE9XCIgLyogTk9UX0VRVUFMICovIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RJbi9Ob3RFcXVhbCBpcyBhbHdheXMgYSBzdWZmaXguIFRoZXJlIGNhbm5vdCBiZSBhbnkgcmVtYWluaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VnbWVudHMgYW5kIGhlbmNlIHdlIGNhbiByZXR1cm4gZWFybHkgaGVyZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5zZXQocy5maWVsZFBhdGguY2Fub25pY2FsU3RyaW5nKCksIGUudmFsdWUpLCBBcnJheS5mcm9tKG4udmFsdWVzKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbWFpbmluZyBmaWx0ZXJzIGNhbm5vdCBiZSB1c2VkIGFzIG5vdEluIGJvdW5kcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICogUmV0dXJucyBhIGxvd2VyIGJvdW5kIG9mIGZpZWxkIHZhbHVlcyB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgc3RhcnRpbmcgcG9pbnQgdG9cbiAqIHNjYW4gdGhlIGluZGV4IGRlZmluZWQgYnkgYGZpZWxkSW5kZXhgLiBSZXR1cm5zIGBudWxsYCBpZiBubyBsb3dlciBib3VuZFxuICogZXhpc3RzLlxuICovIChpLCBzKSwgdSA9IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzID0gITA7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZWFjaCBzZWdtZW50LCByZXRyaWV2ZSBhIGxvd2VyIGJvdW5kIGlmIHRoZXJlIGlzIGEgc3VpdGFibGUgZmlsdGVyIG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydEF0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCByIG9mIHNlKGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGUsIG8gPSAhMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGFsbCBmaWx0ZXJzIHRvIGZpbmQgYSB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgZmllbGQgc2VnbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbiBvZiBkZSh0LCByLmZpZWxkUGF0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHQsIHMgPSAhMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChuLm9wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIjxcIiAvKiBMRVNTX1RIQU4gKi8gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCI8PVwiIC8qIExFU1NfVEhBTl9PUl9FUVVBTCAqLyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gXCJudWxsVmFsdWVcIiBpbiAoaSA9IG4udmFsdWUpID8ga3QgOiBcImJvb2xlYW5WYWx1ZVwiIGluIGkgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhblZhbHVlOiAhMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IFwiaW50ZWdlclZhbHVlXCIgaW4gaSB8fCBcImRvdWJsZVZhbHVlXCIgaW4gaSA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGVWYWx1ZTogTmFOXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogXCJ0aW1lc3RhbXBWYWx1ZVwiIGluIGkgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wVmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kczogTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogXCJzdHJpbmdWYWx1ZVwiIGluIGkgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOiBcImJ5dGVzVmFsdWVcIiBpbiBpID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzVmFsdWU6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOiBcInJlZmVyZW5jZVZhbHVlXCIgaW4gaSA/IFV0KHZ0LmVtcHR5KCksIHh0LmVtcHR5KCkpIDogXCJnZW9Qb2ludFZhbHVlXCIgaW4gaSA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9Qb2ludFZhbHVlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlOiAtOTAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdpdHVkZTogLTE4MFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOiBcImFycmF5VmFsdWVcIiBpbiBpID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5VmFsdWU6IHt9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogXCJtYXBWYWx1ZVwiIGluIGkgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwVmFsdWU6IHt9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogTCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiPT1cIiAvKiBFUVVBTCAqLyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImluXCIgLyogSU4gKi8gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCI+PVwiIC8qIEdSRUFURVJfVEhBTl9PUl9FUVVBTCAqLyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gbi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIj5cIiAvKiBHUkVBVEVSX1RIQU4gKi8gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IG4udmFsdWUsIHMgPSAhMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIiE9XCIgLyogTk9UX0VRVUFMICovIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwibm90LWluXCIgLyogTk9UX0lOICovIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBrdDtcbiAvLyBSZW1haW5pbmcgZmlsdGVycyBjYW5ub3QgYmUgdXNlZCBhcyBsb3dlciBib3VuZHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKdChlLCB0KSA9PT0gdCAmJiAoZSA9IHQsIG8gPSBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBzdGFydEF0IGJvdW5kLCBjb21wYXJlIHRoZSB2YWx1ZXMgYWdhaW5zdCB0aGUgZXhpc3RpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3VuZGFyeSB0byBzZWUgaWYgd2UgY2FuIG5hcnJvdyB0aGUgc2NvcGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSB0LnN0YXJ0QXQpIGZvciAobGV0IG4gPSAwOyBuIDwgdC5vcmRlckJ5Lmxlbmd0aDsgKytuKSBpZiAodC5vcmRlckJ5W25dLmZpZWxkLmlzRXF1YWwoci5maWVsZFBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB0LnN0YXJ0QXQucG9zaXRpb25bbl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEp0KGUsIHMpID09PSBzICYmIChlID0gcywgbyA9IHQuc3RhcnRBdC5pbmNsdXNpdmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gZSkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gbG93ZXIgYm91bmQgZXhpc3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5wdXNoKGUpLCBzICYmIChzID0gbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBSZXR1cm5zIHRoZSBsYXJnZXN0IHZhbHVlIGZvciB0aGUgZ2l2ZW4gdmFsdWUgdHlwZSAoZXhjbHVzaXZlKS4gKi8gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFlKG4sIHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICogUmV0dXJucyBhbiB1cHBlciBib3VuZCBvZiBmaWVsZCB2YWx1ZXMgdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBlbmRpbmcgcG9pbnRcbiAqIHdoZW4gc2Nhbm5pbmcgdGhlIGluZGV4IGRlZmluZWQgYnkgYGZpZWxkSW5kZXhgLiBSZXR1cm5zIGBudWxsYCBpZiBub1xuICogdXBwZXIgYm91bmQgZXhpc3RzLlxuICovIChpLCBzKSwgYyA9IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzID0gITA7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZWFjaCBzZWdtZW50LCByZXRyaWV2ZSBhbiB1cHBlciBib3VuZCBpZiB0aGVyZSBpcyBhIHN1aXRhYmxlIGZpbHRlciBvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5kQXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHIgb2Ygc2UoZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZSwgbyA9ICEwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgYWxsIGZpbHRlcnMgdG8gZmluZCBhIHZhbHVlIGZvciB0aGUgY3VycmVudCBmaWVsZCBzZWdtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBuIG9mIGRlKHQsIHIuZmllbGRQYXRoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdCwgcyA9ICEwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG4ub3ApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiPj1cIiAvKiBHUkVBVEVSX1RIQU5fT1JfRVFVQUwgKi8gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCI+XCIgLyogR1JFQVRFUl9USEFOICovIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBcIm51bGxWYWx1ZVwiIGluIChpID0gbi52YWx1ZSkgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhblZhbHVlOiAhMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IFwiYm9vbGVhblZhbHVlXCIgaW4gaSA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGVWYWx1ZTogTmFOXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogXCJpbnRlZ2VyVmFsdWVcIiBpbiBpIHx8IFwiZG91YmxlVmFsdWVcIiBpbiBpID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcFZhbHVlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHM6IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IFwidGltZXN0YW1wVmFsdWVcIiBpbiBpID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBcIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogXCJzdHJpbmdWYWx1ZVwiIGluIGkgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNWYWx1ZTogXCJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IFwiYnl0ZXNWYWx1ZVwiIGluIGkgPyBVdCh2dC5lbXB0eSgpLCB4dC5lbXB0eSgpKSA6IFwicmVmZXJlbmNlVmFsdWVcIiBpbiBpID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb1BvaW50VmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0aXR1ZGU6IC05MCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ2l0dWRlOiAtMTgwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IFwiZ2VvUG9pbnRWYWx1ZVwiIGluIGkgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlWYWx1ZToge31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOiBcImFycmF5VmFsdWVcIiBpbiBpID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcFZhbHVlOiB7fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IFwibWFwVmFsdWVcIiBpbiBpID8gTnQgOiBMKCksIHMgPSAhMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIj09XCIgLyogRVFVQUwgKi8gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpblwiIC8qIElOICovIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiPD1cIiAvKiBMRVNTX1RIQU5fT1JfRVFVQUwgKi8gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IG4udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCI8XCIgLyogTEVTU19USEFOICovIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBuLnZhbHVlLCBzID0gITE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCIhPVwiIC8qIE5PVF9FUVVBTCAqLyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm5vdC1pblwiIC8qIE5PVF9JTiAqLyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gTnQ7XG4gLy8gUmVtYWluaW5nIGZpbHRlcnMgY2Fubm90IGJlIHVzZWQgYXMgdXBwZXIgYm91bmRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWXQoZSwgdCkgPT09IHQgJiYgKGUgPSB0LCBvID0gcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgZW5kQXQgYm91bmQsIGNvbXBhcmUgdGhlIHZhbHVlcyBhZ2FpbnN0IHRoZSBleGlzdGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdW5kYXJ5IHRvIHNlZSBpZiB3ZSBjYW4gbmFycm93IHRoZSBzY29wZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IHQuZW5kQXQpIGZvciAobGV0IG4gPSAwOyBuIDwgdC5vcmRlckJ5Lmxlbmd0aDsgKytuKSBpZiAodC5vcmRlckJ5W25dLmZpZWxkLmlzRXF1YWwoci5maWVsZFBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB0LmVuZEF0LnBvc2l0aW9uW25dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZdChlLCBzKSA9PT0gcyAmJiAoZSA9IHMsIG8gPSB0LmVuZEF0LmluY2x1c2l2ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSBlKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyB1cHBlciBib3VuZCBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnB1c2goZSksIHMgJiYgKHMgPSBvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBZShuLCBzKTtcbiAgICAgICAgICAgICAgICAgICAgfShpLCBzKSwgaCA9IHRoaXMuamUocywgaSwgdSksIGwgPSB0aGlzLmplKHMsIGksIGMpLCBmID0gdGhpcy5XZShzLCBpLCBhKSwgZCA9IHRoaXMuemUocy5pbmRleElkLCBvLCBoLCAhIXUgJiYgdS5pbmNsdXNpdmUsIGwsICEhYyAmJiBjLmluY2x1c2l2ZSwgZik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1aS5mb3JFYWNoKGQsIChzID0+IG4uR3QocywgZS5saW1pdCkubmV4dCgoZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLmZvckVhY2goKGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0LmFkZChuZXcgeHQoTHMoZS5kb2N1bWVudEtleSkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgfSkpKSk7XG4gICAgICAgICAgICAgICAgfSkpLm5leHQoKCgpID0+IHQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1aS5yZXNvbHZlKG51bGwpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIFFlKHQpIHtcbiAgICAgICAgbGV0IGUgPSB0aGlzLkdlLmdldCh0KTtcbiAgICAgICAgcmV0dXJuIGUgfHwgKFxuICAgICAgICAvLyBUT0RPKG9ycXVlcnkpOiBJbXBsZW1lbnQgRE5GIHRyYW5zZm9ybVxuICAgICAgICBlID0gWyB0IF0sIHRoaXMuR2Uuc2V0KHQsIGUpLCBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIGtleSByYW5nZSBxdWVyeSBvbiBgRGJJbmRleEVudHJ5U3RvcmVgIHRoYXQgdW5pb25zIGFsbFxuICAgICAqIGJvdW5kcy5cbiAgICAgKi8gICAgemUodCwgZSwgbiwgcywgaSwgciwgbykge1xuICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIHRvdGFsIGluZGV4IHNjYW5zIHdlIHVuaW9uIHRvZ2V0aGVyLiBUaGlzIGlzIHNpbWlsYXIgdG8gYVxuICAgICAgICAvLyBkaXN0cmlidXRlZCBub3JtYWwgZm9ybSwgYnV0IGFkYXB0ZWQgZm9yIGFycmF5IHZhbHVlcy4gV2UgY3JlYXRlIGEgc2luZ2xlXG4gICAgICAgIC8vIGluZGV4IHJhbmdlIHBlciB2YWx1ZSBpbiBhbiBBUlJBWV9DT05UQUlOUyBvciBBUlJBWV9DT05UQUlOU19BTlkgZmlsdGVyXG4gICAgICAgIC8vIGNvbWJpbmVkIHdpdGggdGhlIHZhbHVlcyBmcm9tIHRoZSBxdWVyeSBib3VuZHMuXG4gICAgICAgIGNvbnN0IGEgPSAobnVsbCAhPSBlID8gZS5sZW5ndGggOiAxKSAqIE1hdGgubWF4KG51bGwgIT0gbiA/IG4ubGVuZ3RoIDogMSwgbnVsbCAhPSBpID8gaS5sZW5ndGggOiAxKSwgdSA9IGEgLyAobnVsbCAhPSBlID8gZS5sZW5ndGggOiAxKSwgYyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBoID0gMDsgaCA8IGE7ICsraCkge1xuICAgICAgICAgICAgY29uc3QgYSA9IGUgPyB0aGlzLkhlKGVbaCAvIHVdKSA6IGVyLCBsID0gbiA/IHRoaXMuSmUodCwgYSwgbltoICUgdV0sIHMpIDogdGhpcy5ZZSh0KSwgZiA9IGkgPyB0aGlzLlhlKHQsIGEsIGlbaCAlIHVdLCByKSA6IHRoaXMuWWUodCArIDEpO1xuICAgICAgICAgICAgYy5wdXNoKC4uLnRoaXMuY3JlYXRlUmFuZ2UobCwgZiwgby5tYXAoKGUgPT4gdGhpcy5KZSh0LCBhLCBlLCBcbiAgICAgICAgICAgIC8qIGluY2x1c2l2ZT0gKi8gITApKSkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYztcbiAgICB9XG4gICAgLyoqIEdlbmVyYXRlcyB0aGUgbG93ZXIgYm91bmQgZm9yIGBhcnJheVZhbHVlYCBhbmQgYGRpcmVjdGlvbmFsVmFsdWVgLiAqLyAgICBKZSh0LCBlLCBuLCBzKSB7XG4gICAgICAgIGNvbnN0IGkgPSBuZXcgSGkodCwgeHQuZW1wdHkoKSwgZSwgbik7XG4gICAgICAgIHJldHVybiBzID8gaSA6IGkua2UoKTtcbiAgICB9XG4gICAgLyoqIEdlbmVyYXRlcyB0aGUgdXBwZXIgYm91bmQgZm9yIGBhcnJheVZhbHVlYCBhbmQgYGRpcmVjdGlvbmFsVmFsdWVgLiAqLyAgICBYZSh0LCBlLCBuLCBzKSB7XG4gICAgICAgIGNvbnN0IGkgPSBuZXcgSGkodCwgeHQuZW1wdHkoKSwgZSwgbik7XG4gICAgICAgIHJldHVybiBzID8gaS5rZSgpIDogaTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIGFuIGVtcHR5IGJvdW5kIHRoYXQgc2NvcGVzIHRoZSBpbmRleCBzY2FuIHRvIHRoZSBjdXJyZW50IGluZGV4XG4gICAgICogYW5kIHVzZXIuXG4gICAgICovICAgIFllKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBIaSh0LCB4dC5lbXB0eSgpLCBlciwgZXIpO1xuICAgIH1cbiAgICBnZXRGaWVsZEluZGV4KHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IG5ldyBYaShlKSwgcyA9IG51bGwgIT0gZS5jb2xsZWN0aW9uR3JvdXAgPyBlLmNvbGxlY3Rpb25Hcm91cCA6IGUucGF0aC5sYXN0U2VnbWVudCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRGaWVsZEluZGV4ZXModCwgcykubmV4dCgodCA9PiB7XG4gICAgICAgICAgICBjb25zdCBlID0gdC5maWx0ZXIoKHQgPT4gbi5GZSh0KSkpO1xuICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBpbmRleCB0aGF0IG1hdGNoZXMgdGhlIG1vc3QgbnVtYmVyIG9mIHNlZ21lbnRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc29ydCgoKHQsIGUpID0+IGUuZmllbGRzLmxlbmd0aCAtIHQuZmllbGRzLmxlbmd0aCkpLCBlLmxlbmd0aCA+IDAgPyBlWzBdIDogbnVsbDtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBieXRlIGVuY29kZWQgZm9ybSBvZiB0aGUgZGlyZWN0aW9uYWwgdmFsdWVzIGluIHRoZSBmaWVsZCBpbmRleC5cbiAgICAgKiBSZXR1cm5zIGBudWxsYCBpZiB0aGUgZG9jdW1lbnQgZG9lcyBub3QgaGF2ZSBhbGwgZmllbGRzIHNwZWNpZmllZCBpbiB0aGVcbiAgICAgKiBpbmRleC5cbiAgICAgKi8gICAgWmUodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gbmV3IHppO1xuICAgICAgICBmb3IgKGNvbnN0IHMgb2Ygc2UodCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBlLmRhdGEuZmllbGQocy5maWVsZFBhdGgpO1xuICAgICAgICAgICAgaWYgKG51bGwgPT0gdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBpID0gbi5OZShzLmtpbmQpO1xuICAgICAgICAgICAgVWkuZmUuWnQodCwgaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG4uU2UoKTtcbiAgICB9XG4gICAgLyoqIEVuY29kZXMgYSBzaW5nbGUgdmFsdWUgdG8gdGhlIGFzY2VuZGluZyBpbmRleCBmb3JtYXQuICovICAgIEhlKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IG5ldyB6aTtcbiAgICAgICAgcmV0dXJuIFVpLmZlLlp0KHQsIGUuTmUoMCAvKiBBU0NFTkRJTkcgKi8pKSwgZS5TZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmNvZGVzIHRoZSBnaXZlbiBmaWVsZCB2YWx1ZXMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uIGluIGB0YXJnZXRgLlxuICAgICAqIEZvciBJTiBxdWVyaWVzLCBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzIGlzIHJldHVybmVkLlxuICAgICAqLyAgICBXZSh0LCBlLCBuKSB7XG4gICAgICAgIGlmIChudWxsID09PSBuKSByZXR1cm4gW107XG4gICAgICAgIGxldCBzID0gW107XG4gICAgICAgIHMucHVzaChuZXcgemkpO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgciBvZiBzZSh0KSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IG5baSsrXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbiBvZiBzKSBpZiAodGhpcy50bihlLCByLmZpZWxkUGF0aCkgJiYgR3QodCkpIHMgPSB0aGlzLmVuKHMsIHIsIHQpOyBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gbi5OZShyLmtpbmQpO1xuICAgICAgICAgICAgICAgIFVpLmZlLlp0KHQsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm5uKHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmNvZGVzIHRoZSBnaXZlbiBib3VuZHMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uIGluIGB0YXJnZXRgLiBGb3IgSU5cbiAgICAgKiBxdWVyaWVzLCBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzIGlzIHJldHVybmVkLlxuICAgICAqLyAgICBqZSh0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiBudWxsID09IG4gPyBudWxsIDogdGhpcy5XZSh0LCBlLCBuLnBvc2l0aW9uKTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgdGhlIGJ5dGUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBwcm92aWRlZCBlbmNvZGVycy4gKi8gICAgbm4odCkge1xuICAgICAgICBjb25zdCBlID0gW107XG4gICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdC5sZW5ndGg7ICsrbikgZVtuXSA9IHRbbl0uU2UoKTtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzZXBhcmF0ZSBlbmNvZGVyIGZvciBlYWNoIGVsZW1lbnQgb2YgYW4gYXJyYXkuXG4gICAgICpcbiAgICAgKiBUaGUgbWV0aG9kIGFwcGVuZHMgZWFjaCB2YWx1ZSB0byBhbGwgZXhpc3RpbmcgZW5jb2RlcnMgKGUuZy4gZmlsdGVyKFwiYVwiLFxuICAgICAqIFwiPT1cIiwgXCJhMVwiKS5maWx0ZXIoXCJiXCIsIFwiaW5cIiwgW1wiYjFcIiwgXCJiMlwiXSkgYmVjb21lcyBbXCJhMSxiMVwiLCBcImExLGIyXCJdKS4gQVxuICAgICAqIGxpc3Qgb2YgbmV3IGVuY29kZXJzIGlzIHJldHVybmVkLlxuICAgICAqLyAgICBlbih0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSBbIC4uLnQgXSwgaSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHQgb2Ygbi5hcnJheVZhbHVlLnZhbHVlcyB8fCBbXSkgZm9yIChjb25zdCBuIG9mIHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBuZXcgemk7XG4gICAgICAgICAgICBzLnNlZWQobi5TZSgpKSwgVWkuZmUuWnQodCwgcy5OZShlLmtpbmQpKSwgaS5wdXNoKHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgICB0bih0LCBlKSB7XG4gICAgICAgIHJldHVybiAhIXQuZmlsdGVycy5maW5kKCh0ID0+IHQgaW5zdGFuY2VvZiBfZSAmJiB0LmZpZWxkLmlzRXF1YWwoZSkgJiYgKFwiaW5cIiAvKiBJTiAqLyA9PT0gdC5vcCB8fCBcIm5vdC1pblwiIC8qIE5PVF9JTiAqLyA9PT0gdC5vcCkpKTtcbiAgICB9XG4gICAgZ2V0RmllbGRJbmRleGVzKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IHJyKHQpLCBzID0gb3IodCk7XG4gICAgICAgIHJldHVybiAoZSA/IG4uVXQoXCJjb2xsZWN0aW9uR3JvdXBJbmRleFwiLCBJREJLZXlSYW5nZS5ib3VuZChlLCBlKSkgOiBuLlV0KCkpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgY29uc3QgZSA9IFtdO1xuICAgICAgICAgICAgcmV0dXJuIHVpLmZvckVhY2godCwgKHQgPT4gcy5nZXQoWyB0LmluZGV4SWQsIHRoaXMudWlkIF0pLm5leHQoKG4gPT4ge1xuICAgICAgICAgICAgICAgIGUucHVzaChmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBlID8gbmV3IHJlKGUuc2VxdWVuY2VOdW1iZXIsIG5ldyBvZShEaShlLnJlYWRUaW1lKSwgbmV3IHh0KExzKGUuZG9jdW1lbnRLZXkpKSwgZS5sYXJnZXN0QmF0Y2hJZCkpIDogcmUuZW1wdHkoKSwgcyA9IHQuZmllbGRzLm1hcCgoKFt0LCBlXSkgPT4gbmV3IGllKG10LmZyb21TZXJ2ZXJGb3JtYXQodCksIGUpKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgZWUodC5pbmRleElkLCB0LmNvbGxlY3Rpb25Hcm91cCwgcywgbik7XG4gICAgICAgICAgICAgICAgfSh0LCBuKSk7XG4gICAgICAgICAgICB9KSkpKS5uZXh0KCgoKSA9PiBlKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgZ2V0TmV4dENvbGxlY3Rpb25Hcm91cFRvVXBkYXRlKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmllbGRJbmRleGVzKHQpLm5leHQoKHQgPT4gMCA9PT0gdC5sZW5ndGggPyBudWxsIDogKHQuc29ydCgoKHQsIGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0LmluZGV4U3RhdGUuc2VxdWVuY2VOdW1iZXIgLSBlLmluZGV4U3RhdGUuc2VxdWVuY2VOdW1iZXI7XG4gICAgICAgICAgICByZXR1cm4gMCAhPT0gbiA/IG4gOiBydCh0LmNvbGxlY3Rpb25Hcm91cCwgZS5jb2xsZWN0aW9uR3JvdXApO1xuICAgICAgICB9KSksIHRbMF0uY29sbGVjdGlvbkdyb3VwKSkpO1xuICAgIH1cbiAgICB1cGRhdGVDb2xsZWN0aW9uR3JvdXAodCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gcnIodCksIGkgPSBvcih0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc24odCkubmV4dCgodCA9PiBzLlV0KFwiY29sbGVjdGlvbkdyb3VwSW5kZXhcIiwgSURCS2V5UmFuZ2UuYm91bmQoZSwgZSkpLm5leHQoKGUgPT4gdWkuZm9yRWFjaChlLCAoZSA9PiBpLnB1dChmdW5jdGlvbih0LCBlLCBuLCBzKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGluZGV4SWQ6IHQsXG4gICAgICAgICAgICAgICAgdWlkOiBlLnVpZCB8fCBcIlwiLFxuICAgICAgICAgICAgICAgIHNlcXVlbmNlTnVtYmVyOiBuLFxuICAgICAgICAgICAgICAgIHJlYWRUaW1lOiBTaShzLnJlYWRUaW1lKSxcbiAgICAgICAgICAgICAgICBkb2N1bWVudEtleTogJHMocy5kb2N1bWVudEtleS5wYXRoKSxcbiAgICAgICAgICAgICAgICBsYXJnZXN0QmF0Y2hJZDogcy5sYXJnZXN0QmF0Y2hJZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfShlLmluZGV4SWQsIHRoaXMudXNlciwgdCwgbikpKSkpKSkpO1xuICAgIH1cbiAgICB1cGRhdGVJbmRleEVudHJpZXModCwgZSkge1xuICAgICAgICAvLyBQb3J0aW5nIE5vdGU6IGBnZXRGaWVsZEluZGV4ZXMoKWAgb24gV2ViIGRvZXMgbm90IGNhY2hlIGluZGV4IGxvb2t1cHMgYXNcbiAgICAgICAgLy8gaXQgY291bGQgYmUgdXNlZCBhY3Jvc3MgZGlmZmVyZW50IEluZGV4ZWREQiB0cmFuc2FjdGlvbnMuIEFzIGFueSBjYWNoZWRcbiAgICAgICAgLy8gZGF0YSBtaWdodCBiZSBpbnZhbGlkYXRlZCBieSBvdGhlciBtdWx0aS10YWIgY2xpZW50cywgd2UgY2FuIG9ubHkgdHJ1c3RcbiAgICAgICAgLy8gZGF0YSB3aXRoaW4gYSBzaW5nbGUgSW5kZXhlZERCIHRyYW5zYWN0aW9uLiBXZSB0aGVyZWZvcmUgYWRkIGEgY2FjaGVcbiAgICAgICAgLy8gaGVyZS5cbiAgICAgICAgY29uc3QgbiA9IG5ldyBNYXA7XG4gICAgICAgIHJldHVybiB1aS5mb3JFYWNoKGUsICgoZSwgcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgaSA9IG4uZ2V0KGUuY29sbGVjdGlvbkdyb3VwKTtcbiAgICAgICAgICAgIHJldHVybiAoaSA/IHVpLnJlc29sdmUoaSkgOiB0aGlzLmdldEZpZWxkSW5kZXhlcyh0LCBlLmNvbGxlY3Rpb25Hcm91cCkpLm5leHQoKGkgPT4gKG4uc2V0KGUuY29sbGVjdGlvbkdyb3VwLCBpKSwgXG4gICAgICAgICAgICB1aS5mb3JFYWNoKGksIChuID0+IHRoaXMucm4odCwgZSwgbikubmV4dCgoZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMub24ocywgbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaXNFcXVhbChpKSA/IHVpLnJlc29sdmUoKSA6IHRoaXMuYW4odCwgcywgZSwgaSk7XG4gICAgICAgICAgICB9KSkpKSkpKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICB1bih0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiBpcih0KS5wdXQoe1xuICAgICAgICAgICAgaW5kZXhJZDogbi5pbmRleElkLFxuICAgICAgICAgICAgdWlkOiB0aGlzLnVpZCxcbiAgICAgICAgICAgIGFycmF5VmFsdWU6IG4uYXJyYXlWYWx1ZSxcbiAgICAgICAgICAgIGRpcmVjdGlvbmFsVmFsdWU6IG4uZGlyZWN0aW9uYWxWYWx1ZSxcbiAgICAgICAgICAgIGRvY3VtZW50S2V5OiAkcyhlLmtleS5wYXRoKVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY24odCwgZSwgbikge1xuICAgICAgICByZXR1cm4gaXIodCkuZGVsZXRlKFsgbi5pbmRleElkLCB0aGlzLnVpZCwgbi5hcnJheVZhbHVlLCBuLmRpcmVjdGlvbmFsVmFsdWUsICRzKGUua2V5LnBhdGgpIF0pO1xuICAgIH1cbiAgICBybih0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSBpcih0KTtcbiAgICAgICAgbGV0IGkgPSBuZXcga24oSmkpO1xuICAgICAgICByZXR1cm4gcy5XdCh7XG4gICAgICAgICAgICBpbmRleDogXCJkb2N1bWVudEtleUluZGV4XCIsXG4gICAgICAgICAgICByYW5nZTogSURCS2V5UmFuZ2Uub25seShbIG4uaW5kZXhJZCwgdGhpcy51aWQsICRzKGUucGF0aCkgXSlcbiAgICAgICAgfSwgKCh0LCBzKSA9PiB7XG4gICAgICAgICAgICBpID0gaS5hZGQobmV3IEhpKG4uaW5kZXhJZCwgZSwgcy5hcnJheVZhbHVlLCBzLmRpcmVjdGlvbmFsVmFsdWUpKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IGkpKTtcbiAgICB9XG4gICAgLyoqIENyZWF0ZXMgdGhlIGluZGV4IGVudHJpZXMgZm9yIHRoZSBnaXZlbiBkb2N1bWVudC4gKi8gICAgb24odCwgZSkge1xuICAgICAgICBsZXQgbiA9IG5ldyBrbihKaSk7XG4gICAgICAgIGNvbnN0IHMgPSB0aGlzLlplKGUsIHQpO1xuICAgICAgICBpZiAobnVsbCA9PSBzKSByZXR1cm4gbjtcbiAgICAgICAgY29uc3QgaSA9IG5lKGUpO1xuICAgICAgICBpZiAobnVsbCAhPSBpKSB7XG4gICAgICAgICAgICBjb25zdCByID0gdC5kYXRhLmZpZWxkKGkuZmllbGRQYXRoKTtcbiAgICAgICAgICAgIGlmIChHdChyKSkgZm9yIChjb25zdCBpIG9mIHIuYXJyYXlWYWx1ZS52YWx1ZXMgfHwgW10pIG4gPSBuLmFkZChuZXcgSGkoZS5pbmRleElkLCB0LmtleSwgdGhpcy5IZShpKSwgcykpO1xuICAgICAgICB9IGVsc2UgbiA9IG4uYWRkKG5ldyBIaShlLmluZGV4SWQsIHQua2V5LCBlciwgcykpO1xuICAgICAgICByZXR1cm4gbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgaW5kZXggZW50cmllcyBmb3IgdGhlIHByb3ZpZGVkIGRvY3VtZW50IGJ5IGRlbGV0aW5nIGVudHJpZXNcbiAgICAgKiB0aGF0IGFyZSBubyBsb25nZXIgcmVmZXJlbmNlZCBpbiBgbmV3RW50cmllc2AgYW5kIGFkZGluZyBhbGwgbmV3bHkgYWRkZWRcbiAgICAgKiBlbnRyaWVzLlxuICAgICAqLyAgICBhbih0LCBlLCBuLCBzKSB7XG4gICAgICAgIE8oXCJJbmRleGVkRGJJbmRleE1hbmFnZXJcIiwgXCJVcGRhdGluZyBpbmRleCBlbnRyaWVzIGZvciBkb2N1bWVudCAnJXMnXCIsIGUua2V5KTtcbiAgICAgICAgY29uc3QgaSA9IFtdO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24odCwgZSwgbiwgcywgaSkge1xuICAgICAgICAgICAgY29uc3QgciA9IHQuZ2V0SXRlcmF0b3IoKSwgbyA9IGUuZ2V0SXRlcmF0b3IoKTtcbiAgICAgICAgICAgIGxldCBhID0gT24ociksIHUgPSBPbihvKTtcbiAgICAgICAgICAgIC8vIFdhbGsgdGhyb3VnaCB0aGUgdHdvIHNldHMgYXQgdGhlIHNhbWUgdGltZSwgdXNpbmcgdGhlIG9yZGVyaW5nIGRlZmluZWQgYnlcbiAgICAgICAgICAgIC8vIGBjb21wYXJhdG9yYC5cbiAgICAgICAgICAgIGZvciAoO2EgfHwgdTsgKSB7XG4gICAgICAgICAgICAgICAgbGV0IHQgPSAhMSwgZSA9ICExO1xuICAgICAgICAgICAgICAgIGlmIChhICYmIHUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IG4oYSwgdSk7XG4gICAgICAgICAgICAgICAgICAgIHMgPCAwID8gXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBlbGVtZW50IHdhcyByZW1vdmVkIGlmIHRoZSBuZXh0IGVsZW1lbnQgaW4gb3VyIG9yZGVyZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gd2Fsa3Rocm91Z2ggaXMgb25seSBpbiBgYmVmb3JlYC5cbiAgICAgICAgICAgICAgICAgICAgZSA9ICEwIDogcyA+IDAgJiYgKFxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZWxlbWVudCB3YXMgYWRkZWQgaWYgdGhlIG5leHQgZWxlbWVudCBpbiBvdXIgb3JkZXJlZCB3YWxrdGhyb3VnaFxuICAgICAgICAgICAgICAgICAgICAvLyBpcyBvbmx5IGluIGBhZnRlcmAuXG4gICAgICAgICAgICAgICAgICAgIHQgPSAhMCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIG51bGwgIT0gYSA/IGUgPSAhMCA6IHQgPSAhMDtcbiAgICAgICAgICAgICAgICB0ID8gKHModSksIHUgPSBPbihvKSkgOiBlID8gKGkoYSksIGEgPSBPbihyKSkgOiAoYSA9IE9uKHIpLCB1ID0gT24obykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KG4sIHMsIEppLCAoXG4gICAgICAgIC8qIG9uQWRkPSAqLyBuID0+IHtcbiAgICAgICAgICAgIGkucHVzaCh0aGlzLnVuKHQsIGUsIG4pKTtcbiAgICAgICAgfSksIChcbiAgICAgICAgLyogb25SZW1vdmU9ICovIG4gPT4ge1xuICAgICAgICAgICAgaS5wdXNoKHRoaXMuY24odCwgZSwgbikpO1xuICAgICAgICB9KSksIHVpLndhaXRGb3IoaSk7XG4gICAgfVxuICAgIHNuKHQpIHtcbiAgICAgICAgbGV0IGUgPSAxO1xuICAgICAgICByZXR1cm4gb3IodCkuV3Qoe1xuICAgICAgICAgICAgaW5kZXg6IFwic2VxdWVuY2VOdW1iZXJJbmRleFwiLFxuICAgICAgICAgICAgcmV2ZXJzZTogITAsXG4gICAgICAgICAgICByYW5nZTogSURCS2V5UmFuZ2UudXBwZXJCb3VuZChbIHRoaXMudWlkLCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiBdKVxuICAgICAgICB9LCAoKHQsIG4sIHMpID0+IHtcbiAgICAgICAgICAgIHMuZG9uZSgpLCBlID0gbi5zZXF1ZW5jZU51bWJlciArIDE7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiBlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBuZXcgc2V0IG9mIElEQiByYW5nZXMgdGhhdCBzcGxpdHMgdGhlIGV4aXN0aW5nIHJhbmdlIGFuZCBleGNsdWRlc1xuICAgICAqIGFueSB2YWx1ZXMgdGhhdCBtYXRjaCB0aGUgYG5vdEluVmFsdWVgIGZyb20gdGhlc2UgcmFuZ2VzLiBBcyBhbiBleGFtcGxlLFxuICAgICAqICdbZm9vID4gMiAmJiBmb28gIT0gM11gIGJlY29tZXMgIGBbZm9vID4gMiAmJiA8IDMsIGZvbyA+IDNdYC5cbiAgICAgKi8gICAgY3JlYXRlUmFuZ2UodCwgZSwgbikge1xuICAgICAgICAvLyBUaGUgbm90SWIgdmFsdWVzIG5lZWQgdG8gYmUgc29ydGVkIGFuZCB1bmlxdWUgc28gdGhhdCB3ZSBjYW4gcmV0dXJuIGFcbiAgICAgICAgLy8gc29ydGVkIHNldCBvZiBub24tb3ZlcmxhcHBpbmcgcmFuZ2VzLlxuICAgICAgICBuID0gbi5zb3J0KCgodCwgZSkgPT4gSmkodCwgZSkpKS5maWx0ZXIoKCh0LCBlLCBuKSA9PiAhZSB8fCAwICE9PSBKaSh0LCBuW2UgLSAxXSkpKTtcbiAgICAgICAgY29uc3QgcyA9IFtdO1xuICAgICAgICBzLnB1c2godCk7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiBuKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gSmkoaSwgdCksIHIgPSBKaShpLCBlKTtcbiAgICAgICAgICAgIGlmICgwID09PSBuKSBcbiAgICAgICAgICAgIC8vIGBub3RJblZhbHVlYCBpcyB0aGUgbG93ZXIgYm91bmQuIFdlIHRoZXJlZm9yZSBuZWVkIHRvIHJhaXNlIHRoZSBib3VuZFxuICAgICAgICAgICAgLy8gdG8gdGhlIG5leHQgdmFsdWUuXG4gICAgICAgICAgICBzWzBdID0gdC5rZSgpOyBlbHNlIGlmIChuID4gMCAmJiByIDwgMCkgXG4gICAgICAgICAgICAvLyBgbm90SW5WYWx1ZWAgaXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgcmFuZ2VcbiAgICAgICAgICAgIHMucHVzaChpKSwgcy5wdXNoKGkua2UoKSk7IGVsc2UgaWYgKHIgPiAwKSBcbiAgICAgICAgICAgIC8vIGBub3RJblZhbHVlYCAoYW5kIGFsbCBmb2xsb3dpbmcgdmFsdWVzKSBhcmUgb3V0IG9mIHRoZSByYW5nZVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcy5wdXNoKGUpO1xuICAgICAgICBjb25zdCBpID0gW107XG4gICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgcy5sZW5ndGg7IHQgKz0gMikgaS5wdXNoKElEQktleVJhbmdlLmJvdW5kKFsgc1t0XS5pbmRleElkLCB0aGlzLnVpZCwgc1t0XS5hcnJheVZhbHVlLCBzW3RdLmRpcmVjdGlvbmFsVmFsdWUsIFwiXCIgXSwgWyBzW3QgKyAxXS5pbmRleElkLCB0aGlzLnVpZCwgc1t0ICsgMV0uYXJyYXlWYWx1ZSwgc1t0ICsgMV0uZGlyZWN0aW9uYWxWYWx1ZSwgXCJcIiBdKSk7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gZ2V0IGEgdHlwZWQgU2ltcGxlRGJTdG9yZSBmb3IgdGhlIGNvbGxlY3Rpb25QYXJlbnRzXG4gKiBkb2N1bWVudCBzdG9yZS5cbiAqLyBmdW5jdGlvbiBzcih0KSB7XG4gICAgcmV0dXJuIHBpKHQsIFwiY29sbGVjdGlvblBhcmVudHNcIik7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGdldCBhIHR5cGVkIFNpbXBsZURiU3RvcmUgZm9yIHRoZSBpbmRleCBlbnRyeSBvYmplY3Qgc3RvcmUuXG4gKi8gZnVuY3Rpb24gaXIodCkge1xuICAgIHJldHVybiBwaSh0LCBcImluZGV4RW50cmllc1wiKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gZ2V0IGEgdHlwZWQgU2ltcGxlRGJTdG9yZSBmb3IgdGhlIGluZGV4IGNvbmZpZ3VyYXRpb24gb2JqZWN0IHN0b3JlLlxuICovIGZ1bmN0aW9uIHJyKHQpIHtcbiAgICByZXR1cm4gcGkodCwgXCJpbmRleENvbmZpZ3VyYXRpb25cIik7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGdldCBhIHR5cGVkIFNpbXBsZURiU3RvcmUgZm9yIHRoZSBpbmRleCBzdGF0ZSBvYmplY3Qgc3RvcmUuXG4gKi8gZnVuY3Rpb24gb3IodCkge1xuICAgIHJldHVybiBwaSh0LCBcImluZGV4U3RhdGVcIik7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGNvbnN0IGFyID0ge1xuICAgIGRpZFJ1bjogITEsXG4gICAgc2VxdWVuY2VOdW1iZXJzQ29sbGVjdGVkOiAwLFxuICAgIHRhcmdldHNSZW1vdmVkOiAwLFxuICAgIGRvY3VtZW50c1JlbW92ZWQ6IDBcbn07XG5cbmNsYXNzIHVyIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvLyBXaGVuIHdlIGF0dGVtcHQgdG8gY29sbGVjdCwgd2Ugd2lsbCBvbmx5IGRvIHNvIGlmIHRoZSBjYWNoZSBzaXplIGlzIGdyZWF0ZXIgdGhhbiB0aGlzXG4gICAgLy8gdGhyZXNob2xkLiBQYXNzaW5nIGBDT0xMRUNUSU9OX0RJU0FCTEVEYCBoZXJlIHdpbGwgY2F1c2UgY29sbGVjdGlvbiB0byBhbHdheXMgYmUgc2tpcHBlZC5cbiAgICB0LCBcbiAgICAvLyBUaGUgcGVyY2VudGFnZSBvZiBzZXF1ZW5jZSBudW1iZXJzIHRoYXQgd2Ugd2lsbCBhdHRlbXB0IHRvIGNvbGxlY3RcbiAgICBlLCBcbiAgICAvLyBBIGNhcCBvbiB0aGUgdG90YWwgbnVtYmVyIG9mIHNlcXVlbmNlIG51bWJlcnMgdGhhdCB3aWxsIGJlIGNvbGxlY3RlZC4gVGhpcyBwcmV2ZW50c1xuICAgIC8vIHVzIGZyb20gY29sbGVjdGluZyBhIGh1Z2UgbnVtYmVyIG9mIHNlcXVlbmNlIG51bWJlcnMgaWYgdGhlIGNhY2hlIGhhcyBncm93biB2ZXJ5IGxhcmdlLlxuICAgIG4pIHtcbiAgICAgICAgdGhpcy5jYWNoZVNpemVDb2xsZWN0aW9uVGhyZXNob2xkID0gdCwgdGhpcy5wZXJjZW50aWxlVG9Db2xsZWN0ID0gZSwgdGhpcy5tYXhpbXVtU2VxdWVuY2VOdW1iZXJzVG9Db2xsZWN0ID0gbjtcbiAgICB9XG4gICAgc3RhdGljIHdpdGhDYWNoZVNpemUodCkge1xuICAgICAgICByZXR1cm4gbmV3IHVyKHQsIHVyLkRFRkFVTFRfQ09MTEVDVElPTl9QRVJDRU5USUxFLCB1ci5ERUZBVUxUX01BWF9TRVFVRU5DRV9OVU1CRVJTX1RPX0NPTExFQ1QpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogRGVsZXRlIGEgbXV0YXRpb24gYmF0Y2ggYW5kIHRoZSBhc3NvY2lhdGVkIGRvY3VtZW50IG11dGF0aW9ucy5cbiAqIEByZXR1cm5zIEEgUGVyc2lzdGVuY2VQcm9taXNlIG9mIHRoZSBkb2N1bWVudCBtdXRhdGlvbnMgdGhhdCB3ZXJlIHJlbW92ZWQuXG4gKi9cbmZ1bmN0aW9uIGNyKHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gdC5zdG9yZShcIm11dGF0aW9uc1wiKSwgaSA9IHQuc3RvcmUoXCJkb2N1bWVudE11dGF0aW9uc1wiKSwgciA9IFtdLCBvID0gSURCS2V5UmFuZ2Uub25seShuLmJhdGNoSWQpO1xuICAgIGxldCBhID0gMDtcbiAgICBjb25zdCB1ID0gcy5XdCh7XG4gICAgICAgIHJhbmdlOiBvXG4gICAgfSwgKCh0LCBlLCBuKSA9PiAoYSsrLCBuLmRlbGV0ZSgpKSkpO1xuICAgIHIucHVzaCh1Lm5leHQoKCgpID0+IHtcbiAgICAgICAgcSgxID09PSBhKTtcbiAgICB9KSkpO1xuICAgIGNvbnN0IGMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHQgb2Ygbi5tdXRhdGlvbnMpIHtcbiAgICAgICAgY29uc3QgcyA9IEtzKGUsIHQua2V5LnBhdGgsIG4uYmF0Y2hJZCk7XG4gICAgICAgIHIucHVzaChpLmRlbGV0ZShzKSksIGMucHVzaCh0LmtleSk7XG4gICAgfVxuICAgIHJldHVybiB1aS53YWl0Rm9yKHIpLm5leHQoKCgpID0+IGMpKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFwcHJveGltYXRlIHNpemUgZm9yIHRoZSBnaXZlbiBkb2N1bWVudC5cbiAqLyBmdW5jdGlvbiBocih0KSB7XG4gICAgaWYgKCF0KSByZXR1cm4gMDtcbiAgICBsZXQgZTtcbiAgICBpZiAodC5kb2N1bWVudCkgZSA9IHQuZG9jdW1lbnQ7IGVsc2UgaWYgKHQudW5rbm93bkRvY3VtZW50KSBlID0gdC51bmtub3duRG9jdW1lbnQ7IGVsc2Uge1xuICAgICAgICBpZiAoIXQubm9Eb2N1bWVudCkgdGhyb3cgTCgpO1xuICAgICAgICBlID0gdC5ub0RvY3VtZW50O1xuICAgIH1cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSkubGVuZ3RoO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqIEEgbXV0YXRpb24gcXVldWUgZm9yIGEgc3BlY2lmaWMgdXNlciwgYmFja2VkIGJ5IEluZGV4ZWREQi4gKi8gdXIuREVGQVVMVF9DT0xMRUNUSU9OX1BFUkNFTlRJTEUgPSAxMCwgXG51ci5ERUZBVUxUX01BWF9TRVFVRU5DRV9OVU1CRVJTX1RPX0NPTExFQ1QgPSAxZTMsIHVyLkRFRkFVTFQgPSBuZXcgdXIoNDE5NDMwNDAsIHVyLkRFRkFVTFRfQ09MTEVDVElPTl9QRVJDRU5USUxFLCB1ci5ERUZBVUxUX01BWF9TRVFVRU5DRV9OVU1CRVJTX1RPX0NPTExFQ1QpLCBcbnVyLkRJU0FCTEVEID0gbmV3IHVyKC0xLCAwLCAwKTtcblxuY2xhc3MgbHIge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIFRoZSBub3JtYWxpemVkIHVzZXJJZCAoZS5nLiBudWxsIFVJRCA9PiBcIlwiIHVzZXJJZCkgdXNlZCB0byBzdG9yZSAvXG4gICAgICogcmV0cmlldmUgbXV0YXRpb25zLlxuICAgICAqL1xuICAgIHQsIGUsIG4sIHMpIHtcbiAgICAgICAgdGhpcy51c2VySWQgPSB0LCB0aGlzLk0gPSBlLCB0aGlzLmluZGV4TWFuYWdlciA9IG4sIHRoaXMucmVmZXJlbmNlRGVsZWdhdGUgPSBzLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhY2hlcyB0aGUgZG9jdW1lbnQga2V5cyBmb3IgcGVuZGluZyBtdXRhdGlvbiBiYXRjaGVzLiBJZiB0aGUgbXV0YXRpb25cbiAgICAgICAgICogaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIEluZGV4ZWREYiwgdGhlIGNhY2hlZCB2YWx1ZSBtYXkgY29udGludWUgdG9cbiAgICAgICAgICogYmUgdXNlZCB0byByZXRyaWV2ZSB0aGUgYmF0Y2gncyBkb2N1bWVudCBrZXlzLiBUbyByZW1vdmUgYSBjYWNoZWQgdmFsdWVcbiAgICAgICAgICogbG9jYWxseSwgYHJlbW92ZUNhY2hlZE11dGF0aW9uS2V5cygpYCBzaG91bGQgYmUgaW52b2tlZCBlaXRoZXIgZGlyZWN0bHlcbiAgICAgICAgICogb3IgdGhyb3VnaCBgcmVtb3ZlTXV0YXRpb25CYXRjaGVzKClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBXaXRoIG11bHRpLXRhYiwgd2hlbiB0aGUgcHJpbWFyeSBjbGllbnQgYWNrbm93bGVkZ2VzIG9yIHJlamVjdHMgYSBtdXRhdGlvbixcbiAgICAgICAgICogdGhpcyBjYWNoZSBpcyB1c2VkIGJ5IHNlY29uZGFyeSBjbGllbnRzIHRvIGludmFsaWRhdGUgdGhlIGxvY2FsXG4gICAgICAgICAqIHZpZXcgb2YgdGhlIGRvY3VtZW50cyB0aGF0IHdlcmUgcHJldmlvdXNseSBhZmZlY3RlZCBieSB0aGUgbXV0YXRpb24uXG4gICAgICAgICAqL1xuICAgICAgICAvLyBQT1JUSU5HIE5PVEU6IE11bHRpLXRhYiBvbmx5LlxuICAgICAgICB0aGlzLmhuID0ge307XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgbXV0YXRpb24gcXVldWUgZm9yIHRoZSBnaXZlbiB1c2VyLlxuICAgICAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIgZm9yIHdoaWNoIHRvIGNyZWF0ZSBhIG11dGF0aW9uIHF1ZXVlLlxuICAgICAqIEBwYXJhbSBzZXJpYWxpemVyIC0gVGhlIHNlcmlhbGl6ZXIgdG8gdXNlIHdoZW4gcGVyc2lzdGluZyB0byBJbmRleGVkRGIuXG4gICAgICovICAgIHN0YXRpYyBZdCh0LCBlLCBuLCBzKSB7XG4gICAgICAgIC8vIFRPRE8obWNnKTogRmlndXJlIG91dCB3aGF0IGNvbnN0cmFpbnRzIHRoZXJlIGFyZSBvbiB1c2VySURzXG4gICAgICAgIC8vIEluIHBhcnRpY3VsYXIsIGFyZSB0aGVyZSBhbnkgcmVzZXJ2ZWQgY2hhcmFjdGVycz8gYXJlIGVtcHR5IGlkcyBhbGxvd2VkP1xuICAgICAgICAvLyBGb3IgdGhlIG1vbWVudCBzdG9yZSB0aGVzZSB0b2dldGhlciBpbiB0aGUgc2FtZSBtdXRhdGlvbnMgdGFibGUgYXNzdW1pbmdcbiAgICAgICAgLy8gdGhhdCBlbXB0eSB1c2VySURzIGFyZW4ndCBhbGxvd2VkLlxuICAgICAgICBxKFwiXCIgIT09IHQudWlkKTtcbiAgICAgICAgY29uc3QgaSA9IHQuaXNBdXRoZW50aWNhdGVkKCkgPyB0LnVpZCA6IFwiXCI7XG4gICAgICAgIHJldHVybiBuZXcgbHIoaSwgZSwgbiwgcyk7XG4gICAgfVxuICAgIGNoZWNrRW1wdHkodCkge1xuICAgICAgICBsZXQgZSA9ICEwO1xuICAgICAgICBjb25zdCBuID0gSURCS2V5UmFuZ2UuYm91bmQoWyB0aGlzLnVzZXJJZCwgTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZIF0sIFsgdGhpcy51c2VySWQsIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSBdKTtcbiAgICAgICAgcmV0dXJuIGRyKHQpLld0KHtcbiAgICAgICAgICAgIGluZGV4OiBcInVzZXJNdXRhdGlvbnNJbmRleFwiLFxuICAgICAgICAgICAgcmFuZ2U6IG5cbiAgICAgICAgfSwgKCh0LCBuLCBzKSA9PiB7XG4gICAgICAgICAgICBlID0gITEsIHMuZG9uZSgpO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4gZSkpO1xuICAgIH1cbiAgICBhZGRNdXRhdGlvbkJhdGNoKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgY29uc3QgaSA9IF9yKHQpLCByID0gZHIodCk7XG4gICAgICAgIC8vIFRoZSBJbmRleGVkRGIgaW1wbGVtZW50YXRpb24gaW4gQ2hyb21lIChhbmQgRmlyZWZveCkgZG9lcyBub3QgaGFuZGxlXG4gICAgICAgIC8vIGNvbXBvdW5kIGluZGljZXMgdGhhdCBpbmNsdWRlIGF1dG8tZ2VuZXJhdGVkIGtleXMgY29ycmVjdGx5LiBUbyBlbnN1cmVcbiAgICAgICAgLy8gdGhhdCB0aGUgaW5kZXggZW50cnkgaXMgYWRkZWQgY29ycmVjdGx5IGluIGFsbCBicm93c2Vycywgd2UgcGVyZm9ybSB0d29cbiAgICAgICAgLy8gd3JpdGVzOiBUaGUgZmlyc3Qgd3JpdGUgaXMgdXNlZCB0byByZXRyaWV2ZSB0aGUgbmV4dCBhdXRvLWdlbmVyYXRlZCBCYXRjaFxuICAgICAgICAvLyBJRCwgYW5kIHRoZSBzZWNvbmQgd3JpdGUgcG9wdWxhdGVzIHRoZSBpbmRleCBhbmQgc3RvcmVzIHRoZSBhY3R1YWxcbiAgICAgICAgLy8gbXV0YXRpb24gYmF0Y2guXG4gICAgICAgIC8vIFNlZTogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NzAxOTcyXG4gICAgICAgIC8vIFdlIHdyaXRlIGFuIGVtcHR5IG9iamVjdCB0byBvYnRhaW4ga2V5XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHJldHVybiByLmFkZCh7fSkubmV4dCgobyA9PiB7XG4gICAgICAgICAgICBxKFwibnVtYmVyXCIgPT0gdHlwZW9mIG8pO1xuICAgICAgICAgICAgY29uc3QgYSA9IG5ldyBJaShvLCBlLCBuLCBzKSwgdSA9IGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzID0gbi5iYXNlTXV0YXRpb25zLm1hcCgoZSA9PiBUcyh0Lkp0LCBlKSkpLCBpID0gbi5tdXRhdGlvbnMubWFwKChlID0+IFRzKHQuSnQsIGUpKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdXNlcklkOiBlLFxuICAgICAgICAgICAgICAgICAgICBiYXRjaElkOiBuLmJhdGNoSWQsXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsV3JpdGVUaW1lTXM6IG4ubG9jYWxXcml0ZVRpbWUudG9NaWxsaXMoKSxcbiAgICAgICAgICAgICAgICAgICAgYmFzZU11dGF0aW9uczogcyxcbiAgICAgICAgICAgICAgICAgICAgbXV0YXRpb25zOiBpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0odGhpcy5NLCB0aGlzLnVzZXJJZCwgYSksIGMgPSBbXTtcbiAgICAgICAgICAgIGxldCBoID0gbmV3IGtuKCgodCwgZSkgPT4gcnQodC5jYW5vbmljYWxTdHJpbmcoKSwgZS5jYW5vbmljYWxTdHJpbmcoKSkpKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IEtzKHRoaXMudXNlcklkLCB0LmtleS5wYXRoLCBvKTtcbiAgICAgICAgICAgICAgICBoID0gaC5hZGQodC5rZXkucGF0aC5wb3BMYXN0KCkpLCBjLnB1c2goci5wdXQodSkpLCBjLnB1c2goaS5wdXQoZSwgR3MpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBoLmZvckVhY2goKGUgPT4ge1xuICAgICAgICAgICAgICAgIGMucHVzaCh0aGlzLmluZGV4TWFuYWdlci5hZGRUb0NvbGxlY3Rpb25QYXJlbnRJbmRleCh0LCBlKSk7XG4gICAgICAgICAgICB9KSksIHQuYWRkT25Db21taXR0ZWRMaXN0ZW5lcigoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaG5bb10gPSBhLmtleXMoKTtcbiAgICAgICAgICAgIH0pKSwgdWkud2FpdEZvcihjKS5uZXh0KCgoKSA9PiBhKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgbG9va3VwTXV0YXRpb25CYXRjaCh0LCBlKSB7XG4gICAgICAgIHJldHVybiBkcih0KS5nZXQoZSkubmV4dCgodCA9PiB0ID8gKHEodC51c2VySWQgPT09IHRoaXMudXNlcklkKSwgQ2kodGhpcy5NLCB0KSkgOiBudWxsKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRvY3VtZW50IGtleXMgZm9yIHRoZSBtdXRhdGlvbiBiYXRjaCB3aXRoIHRoZSBnaXZlbiBiYXRjaElkLlxuICAgICAqIEZvciBwcmltYXJ5IGNsaWVudHMsIHRoaXMgbWV0aG9kIHJldHVybnMgYG51bGxgIGFmdGVyXG4gICAgICogYHJlbW92ZU11dGF0aW9uQmF0Y2hlcygpYCBoYXMgYmVlbiBjYWxsZWQuIFNlY29uZGFyeSBjbGllbnRzIHJldHVybiBhXG4gICAgICogY2FjaGVkIHJlc3VsdCB1bnRpbCBgcmVtb3ZlQ2FjaGVkTXV0YXRpb25LZXlzKClgIGlzIGludm9rZWQuXG4gICAgICovXG4gICAgLy8gUE9SVElORyBOT1RFOiBNdWx0aS10YWIgb25seS5cbiAgICBsbih0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhuW2VdID8gdWkucmVzb2x2ZSh0aGlzLmhuW2VdKSA6IHRoaXMubG9va3VwTXV0YXRpb25CYXRjaCh0LCBlKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgIGlmICh0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbiA9IHQua2V5cygpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhuW2VdID0gbiwgbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGdldE5leHRNdXRhdGlvbkJhdGNoQWZ0ZXJCYXRjaElkKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IGUgKyAxLCBzID0gSURCS2V5UmFuZ2UubG93ZXJCb3VuZChbIHRoaXMudXNlcklkLCBuIF0pO1xuICAgICAgICBsZXQgaSA9IG51bGw7XG4gICAgICAgIHJldHVybiBkcih0KS5XdCh7XG4gICAgICAgICAgICBpbmRleDogXCJ1c2VyTXV0YXRpb25zSW5kZXhcIixcbiAgICAgICAgICAgIHJhbmdlOiBzXG4gICAgICAgIH0sICgodCwgZSwgcykgPT4ge1xuICAgICAgICAgICAgZS51c2VySWQgPT09IHRoaXMudXNlcklkICYmIChxKGUuYmF0Y2hJZCA+PSBuKSwgaSA9IENpKHRoaXMuTSwgZSkpLCBzLmRvbmUoKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IGkpKTtcbiAgICB9XG4gICAgZ2V0SGlnaGVzdFVuYWNrbm93bGVkZ2VkQmF0Y2hJZCh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBJREJLZXlSYW5nZS51cHBlckJvdW5kKFsgdGhpcy51c2VySWQsIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSBdKTtcbiAgICAgICAgbGV0IG4gPSAtMTtcbiAgICAgICAgcmV0dXJuIGRyKHQpLld0KHtcbiAgICAgICAgICAgIGluZGV4OiBcInVzZXJNdXRhdGlvbnNJbmRleFwiLFxuICAgICAgICAgICAgcmFuZ2U6IGUsXG4gICAgICAgICAgICByZXZlcnNlOiAhMFxuICAgICAgICB9LCAoKHQsIGUsIHMpID0+IHtcbiAgICAgICAgICAgIG4gPSBlLmJhdGNoSWQsIHMuZG9uZSgpO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4gbikpO1xuICAgIH1cbiAgICBnZXRBbGxNdXRhdGlvbkJhdGNoZXModCkge1xuICAgICAgICBjb25zdCBlID0gSURCS2V5UmFuZ2UuYm91bmQoWyB0aGlzLnVzZXJJZCwgLTEgXSwgWyB0aGlzLnVzZXJJZCwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIF0pO1xuICAgICAgICByZXR1cm4gZHIodCkuVXQoXCJ1c2VyTXV0YXRpb25zSW5kZXhcIiwgZSkubmV4dCgodCA9PiB0Lm1hcCgodCA9PiBDaSh0aGlzLk0sIHQpKSkpKTtcbiAgICB9XG4gICAgZ2V0QWxsTXV0YXRpb25CYXRjaGVzQWZmZWN0aW5nRG9jdW1lbnRLZXkodCwgZSkge1xuICAgICAgICAvLyBTY2FuIHRoZSBkb2N1bWVudC1tdXRhdGlvbiBpbmRleCBzdGFydGluZyB3aXRoIGEgcHJlZml4IHN0YXJ0aW5nIHdpdGhcbiAgICAgICAgLy8gdGhlIGdpdmVuIGRvY3VtZW50S2V5LlxuICAgICAgICBjb25zdCBuID0gVXModGhpcy51c2VySWQsIGUucGF0aCksIHMgPSBJREJLZXlSYW5nZS5sb3dlckJvdW5kKG4pLCBpID0gW107XG4gICAgICAgIHJldHVybiBfcih0KS5XdCh7XG4gICAgICAgICAgICByYW5nZTogc1xuICAgICAgICB9LCAoKG4sIHMsIHIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFtvLCBhLCB1XSA9IG4sIGMgPSBMcyhhKTtcbiAgICAgICAgICAgIC8vIE9ubHkgY29uc2lkZXIgcm93cyBtYXRjaGluZyBleGFjdGx5IHRoZSBzcGVjaWZpYyBrZXkgb2ZcbiAgICAgICAgICAgIC8vIGludGVyZXN0LiBOb3RlIHRoYXQgYmVjYXVzZSB3ZSBvcmRlciBieSBwYXRoIGZpcnN0LCBhbmQgd2VcbiAgICAgICAgICAgIC8vIG9yZGVyIHRlcm1pbmF0b3JzIGJlZm9yZSBwYXRoIHNlcGFyYXRvcnMsIHdlJ2xsIGVuY291bnRlciBhbGxcbiAgICAgICAgICAgIC8vIHRoZSBpbmRleCByb3dzIGZvciBkb2N1bWVudEtleSBjb250aWd1b3VzbHkuIEluIHBhcnRpY3VsYXIsIGFsbFxuICAgICAgICAgICAgLy8gdGhlIHJvd3MgZm9yIGRvY3VtZW50S2V5IHdpbGwgb2NjdXIgYmVmb3JlIGFueSByb3dzIGZvclxuICAgICAgICAgICAgLy8gZG9jdW1lbnRzIG5lc3RlZCBpbiBhIHN1YmNvbGxlY3Rpb24gYmVuZWF0aCBkb2N1bWVudEtleSBzbyB3ZVxuICAgICAgICAgICAgLy8gY2FuIHN0b3AgYXMgc29vbiBhcyB3ZSBoaXQgYW55IHN1Y2ggcm93LlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gPT09IHRoaXMudXNlcklkICYmIGUucGF0aC5pc0VxdWFsKGMpKSBcbiAgICAgICAgICAgIC8vIExvb2sgdXAgdGhlIG11dGF0aW9uIGJhdGNoIGluIHRoZSBzdG9yZS5cbiAgICAgICAgICAgIHJldHVybiBkcih0KS5nZXQodSkubmV4dCgodCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0KSB0aHJvdyBMKCk7XG4gICAgICAgICAgICAgICAgcSh0LnVzZXJJZCA9PT0gdGhpcy51c2VySWQpLCBpLnB1c2goQ2kodGhpcy5NLCB0KSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByLmRvbmUoKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IGkpKTtcbiAgICB9XG4gICAgZ2V0QWxsTXV0YXRpb25CYXRjaGVzQWZmZWN0aW5nRG9jdW1lbnRLZXlzKHQsIGUpIHtcbiAgICAgICAgbGV0IG4gPSBuZXcga24ocnQpO1xuICAgICAgICBjb25zdCBzID0gW107XG4gICAgICAgIHJldHVybiBlLmZvckVhY2goKGUgPT4ge1xuICAgICAgICAgICAgY29uc3QgaSA9IFVzKHRoaXMudXNlcklkLCBlLnBhdGgpLCByID0gSURCS2V5UmFuZ2UubG93ZXJCb3VuZChpKSwgbyA9IF9yKHQpLld0KHtcbiAgICAgICAgICAgICAgICByYW5nZTogclxuICAgICAgICAgICAgfSwgKCh0LCBzLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW3IsIG8sIGFdID0gdCwgdSA9IExzKG8pO1xuICAgICAgICAgICAgICAgIC8vIE9ubHkgY29uc2lkZXIgcm93cyBtYXRjaGluZyBleGFjdGx5IHRoZSBzcGVjaWZpYyBrZXkgb2ZcbiAgICAgICAgICAgICAgICAvLyBpbnRlcmVzdC4gTm90ZSB0aGF0IGJlY2F1c2Ugd2Ugb3JkZXIgYnkgcGF0aCBmaXJzdCwgYW5kIHdlXG4gICAgICAgICAgICAgICAgLy8gb3JkZXIgdGVybWluYXRvcnMgYmVmb3JlIHBhdGggc2VwYXJhdG9ycywgd2UnbGwgZW5jb3VudGVyIGFsbFxuICAgICAgICAgICAgICAgIC8vIHRoZSBpbmRleCByb3dzIGZvciBkb2N1bWVudEtleSBjb250aWd1b3VzbHkuIEluIHBhcnRpY3VsYXIsIGFsbFxuICAgICAgICAgICAgICAgIC8vIHRoZSByb3dzIGZvciBkb2N1bWVudEtleSB3aWxsIG9jY3VyIGJlZm9yZSBhbnkgcm93cyBmb3JcbiAgICAgICAgICAgICAgICAvLyBkb2N1bWVudHMgbmVzdGVkIGluIGEgc3ViY29sbGVjdGlvbiBiZW5lYXRoIGRvY3VtZW50S2V5IHNvIHdlXG4gICAgICAgICAgICAgICAgLy8gY2FuIHN0b3AgYXMgc29vbiBhcyB3ZSBoaXQgYW55IHN1Y2ggcm93LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID09PSB0aGlzLnVzZXJJZCAmJiBlLnBhdGguaXNFcXVhbCh1KSA/IG4gPSBuLmFkZChhKSA6IGkuZG9uZSgpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcy5wdXNoKG8pO1xuICAgICAgICB9KSksIHVpLndhaXRGb3IocykubmV4dCgoKCkgPT4gdGhpcy5mbih0LCBuKSkpO1xuICAgIH1cbiAgICBnZXRBbGxNdXRhdGlvbkJhdGNoZXNBZmZlY3RpbmdRdWVyeSh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBlLnBhdGgsIHMgPSBuLmxlbmd0aCArIDEsIGkgPSBVcyh0aGlzLnVzZXJJZCwgbiksIHIgPSBJREJLZXlSYW5nZS5sb3dlckJvdW5kKGkpO1xuICAgICAgICAvLyBDb2xsZWN0IHVwIHVuaXF1ZSBiYXRjaElEcyBlbmNvdW50ZXJlZCBkdXJpbmcgYSBzY2FuIG9mIHRoZSBpbmRleC4gVXNlIGFcbiAgICAgICAgLy8gU29ydGVkU2V0IHRvIGFjY3VtdWxhdGUgYmF0Y2ggSURzIHNvIHRoZXkgY2FuIGJlIHRyYXZlcnNlZCBpbiBvcmRlciBpbiBhXG4gICAgICAgIC8vIHNjYW4gb2YgdGhlIG1haW4gdGFibGUuXG4gICAgICAgIGxldCBvID0gbmV3IGtuKHJ0KTtcbiAgICAgICAgcmV0dXJuIF9yKHQpLld0KHtcbiAgICAgICAgICAgIHJhbmdlOiByXG4gICAgICAgIH0sICgodCwgZSwgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgW3IsIGEsIHVdID0gdCwgYyA9IExzKGEpO1xuICAgICAgICAgICAgciA9PT0gdGhpcy51c2VySWQgJiYgbi5pc1ByZWZpeE9mKGMpID8gXG4gICAgICAgICAgICAvLyBSb3dzIHdpdGggZG9jdW1lbnQga2V5cyBtb3JlIHRoYW4gb25lIHNlZ21lbnQgbG9uZ2VyIHRoYW4gdGhlXG4gICAgICAgICAgICAvLyBxdWVyeSBwYXRoIGNhbid0IGJlIG1hdGNoZXMuIEZvciBleGFtcGxlLCBhIHF1ZXJ5IG9uICdyb29tcydcbiAgICAgICAgICAgIC8vIGNhbid0IG1hdGNoIHRoZSBkb2N1bWVudCAvcm9vbXMvYWJjL21lc3NhZ2VzL3h5eC5cbiAgICAgICAgICAgIC8vIFRPRE8obWNnKTogd2UnbGwgbmVlZCBhIGRpZmZlcmVudCBzY2FubmVyIHdoZW4gd2UgaW1wbGVtZW50XG4gICAgICAgICAgICAvLyBhbmNlc3RvciBxdWVyaWVzLlxuICAgICAgICAgICAgYy5sZW5ndGggPT09IHMgJiYgKG8gPSBvLmFkZCh1KSkgOiBpLmRvbmUoKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IHRoaXMuZm4odCwgbykpKTtcbiAgICB9XG4gICAgZm4odCwgZSkge1xuICAgICAgICBjb25zdCBuID0gW10sIHMgPSBbXTtcbiAgICAgICAgLy8gVE9ETyhyb2Nrd29vZCk6IEltcGxlbWVudCB0aGlzIHVzaW5nIGl0ZXJhdGUuXG4gICAgICAgIHJldHVybiBlLmZvckVhY2goKGUgPT4ge1xuICAgICAgICAgICAgcy5wdXNoKGRyKHQpLmdldChlKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gdCkgdGhyb3cgTCgpO1xuICAgICAgICAgICAgICAgIHEodC51c2VySWQgPT09IHRoaXMudXNlcklkKSwgbi5wdXNoKENpKHRoaXMuTSwgdCkpO1xuICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgfSkpLCB1aS53YWl0Rm9yKHMpLm5leHQoKCgpID0+IG4pKTtcbiAgICB9XG4gICAgcmVtb3ZlTXV0YXRpb25CYXRjaCh0LCBlKSB7XG4gICAgICAgIHJldHVybiBjcih0Lkh0LCB0aGlzLnVzZXJJZCwgZSkubmV4dCgobiA9PiAodC5hZGRPbkNvbW1pdHRlZExpc3RlbmVyKCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRuKGUuYmF0Y2hJZCk7XG4gICAgICAgIH0pKSwgdWkuZm9yRWFjaChuLCAoZSA9PiB0aGlzLnJlZmVyZW5jZURlbGVnYXRlLm1hcmtQb3RlbnRpYWxseU9ycGhhbmVkKHQsIGUpKSkpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgY2FjaGVkIGtleXMgZm9yIGEgbXV0YXRpb24gYmF0Y2guIFRoaXMgbWV0aG9kIHNob3VsZCBiZVxuICAgICAqIGNhbGxlZCBieSBzZWNvbmRhcnkgY2xpZW50cyBhZnRlciB0aGV5IHByb2Nlc3MgbXV0YXRpb24gdXBkYXRlcy5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBkb2VzIG5vdCBoYXZlIHRvIGJlIGNhbGxlZCBmcm9tIHByaW1hcnkgY2xpZW50cyBhc1xuICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIGNhY2hlIGVudHJpZXMgYXJlIGNsZWFyZWQgd2hlbiBhbiBhY2tub3dsZWRnZWQgb3JcbiAgICAgKiByZWplY3RlZCBiYXRjaCBpcyByZW1vdmVkIGZyb20gdGhlIG11dGF0aW9uIHF1ZXVlLlxuICAgICAqL1xuICAgIC8vIFBPUlRJTkcgTk9URTogTXVsdGktdGFiIG9ubHlcbiAgICBkbih0KSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmhuW3RdO1xuICAgIH1cbiAgICBwZXJmb3JtQ29uc2lzdGVuY3lDaGVjayh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoZWNrRW1wdHkodCkubmV4dCgoZSA9PiB7XG4gICAgICAgICAgICBpZiAoIWUpIHJldHVybiB1aS5yZXNvbHZlKCk7XG4gICAgICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGVyZSBhcmUgbm8gZW50cmllcyBpbiB0aGUgZG9jdW1lbnRNdXRhdGlvbnMgaW5kZXggaWZcbiAgICAgICAgICAgIC8vIHRoZSBxdWV1ZSBpcyBlbXB0eS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBJREJLZXlSYW5nZS5sb3dlckJvdW5kKFsgdGhpcy51c2VySWQgXSk7XG4gICAgICAgICAgICBjb25zdCBzID0gW107XG4gICAgICAgICAgICByZXR1cm4gX3IodCkuV3Qoe1xuICAgICAgICAgICAgICAgIHJhbmdlOiBuXG4gICAgICAgICAgICB9LCAoKHQsIGUsIG4pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodFswXSA9PT0gdGhpcy51c2VySWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IExzKHRbMV0pO1xuICAgICAgICAgICAgICAgICAgICBzLnB1c2goZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIG4uZG9uZSgpO1xuICAgICAgICAgICAgfSkpLm5leHQoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBxKDAgPT09IHMubGVuZ3RoKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBjb250YWluc0tleSh0LCBlKSB7XG4gICAgICAgIHJldHVybiBmcih0LCB0aGlzLnVzZXJJZCwgZSk7XG4gICAgfVxuICAgIC8vIFBPUlRJTkcgTk9URTogTXVsdGktdGFiIG9ubHkgKHN0YXRlIGlzIGhlbGQgaW4gbWVtb3J5IGluIG90aGVyIGNsaWVudHMpLlxuICAgIC8qKiBSZXR1cm5zIHRoZSBtdXRhdGlvbiBxdWV1ZSdzIG1ldGFkYXRhIGZyb20gSW5kZXhlZERiLiAqL1xuICAgIF9uKHQpIHtcbiAgICAgICAgcmV0dXJuIHdyKHQpLmdldCh0aGlzLnVzZXJJZCkubmV4dCgodCA9PiB0IHx8IHtcbiAgICAgICAgICAgIHVzZXJJZDogdGhpcy51c2VySWQsXG4gICAgICAgICAgICBsYXN0QWNrbm93bGVkZ2VkQmF0Y2hJZDogLTEsXG4gICAgICAgICAgICBsYXN0U3RyZWFtVG9rZW46IFwiXCJcbiAgICAgICAgfSkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBtdXRhdGlvbiBxdWV1ZSBmb3IgdGhlIGdpdmVuIHVzZXIgY29udGFpbnMgYSBwZW5kaW5nXG4gKiAgICAgICAgIG11dGF0aW9uIGZvciB0aGUgZ2l2ZW4ga2V5LlxuICovIGZ1bmN0aW9uIGZyKHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gVXMoZSwgbi5wYXRoKSwgaSA9IHNbMV0sIHIgPSBJREJLZXlSYW5nZS5sb3dlckJvdW5kKHMpO1xuICAgIGxldCBvID0gITE7XG4gICAgcmV0dXJuIF9yKHQpLld0KHtcbiAgICAgICAgcmFuZ2U6IHIsXG4gICAgICAgIGp0OiAhMFxuICAgIH0sICgodCwgbiwgcykgPT4ge1xuICAgICAgICBjb25zdCBbciwgYSwgLypiYXRjaElEKi8gdV0gPSB0O1xuICAgICAgICByID09PSBlICYmIGEgPT09IGkgJiYgKG8gPSAhMCksIHMuZG9uZSgpO1xuICAgIH0pKS5uZXh0KCgoKSA9PiBvKSk7XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgYW55IG11dGF0aW9uIHF1ZXVlIGNvbnRhaW5zIHRoZSBnaXZlbiBkb2N1bWVudC4gKi9cbi8qKlxuICogSGVscGVyIHRvIGdldCBhIHR5cGVkIFNpbXBsZURiU3RvcmUgZm9yIHRoZSBtdXRhdGlvbnMgb2JqZWN0IHN0b3JlLlxuICovXG5mdW5jdGlvbiBkcih0KSB7XG4gICAgcmV0dXJuIHBpKHQsIFwibXV0YXRpb25zXCIpO1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBnZXQgYSB0eXBlZCBTaW1wbGVEYlN0b3JlIGZvciB0aGUgbXV0YXRpb25RdWV1ZXMgb2JqZWN0IHN0b3JlLlxuICovIGZ1bmN0aW9uIF9yKHQpIHtcbiAgICByZXR1cm4gcGkodCwgXCJkb2N1bWVudE11dGF0aW9uc1wiKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gZ2V0IGEgdHlwZWQgU2ltcGxlRGJTdG9yZSBmb3IgdGhlIG11dGF0aW9uUXVldWVzIG9iamVjdCBzdG9yZS5cbiAqLyBmdW5jdGlvbiB3cih0KSB7XG4gICAgcmV0dXJuIHBpKHQsIFwibXV0YXRpb25RdWV1ZXNcIik7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogT2Zmc2V0IHRvIGVuc3VyZSBub24tb3ZlcmxhcHBpbmcgdGFyZ2V0IGlkcy4gKi9cbi8qKlxuICogR2VuZXJhdGVzIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyB0YXJnZXQgSURzIGZvciBzZW5kaW5nIHRhcmdldHMgdG8gdGhlXG4gKiB3YXRjaCBzdHJlYW0uXG4gKlxuICogVGhlIGNsaWVudCBjb25zdHJ1Y3RzIHR3byBnZW5lcmF0b3JzLCBvbmUgZm9yIHRoZSB0YXJnZXQgY2FjaGUsIGFuZCBvbmUgZm9yXG4gKiBmb3IgdGhlIHN5bmMgZW5naW5lICh0byBnZW5lcmF0ZSBsaW1ibyBkb2N1bWVudHMgdGFyZ2V0cykuIFRoZXNlXG4gKiBnZW5lcmF0b3JzIHByb2R1Y2Ugbm9uLW92ZXJsYXBwaW5nIElEcyAoYnkgdXNpbmcgZXZlbiBhbmQgb2RkIElEc1xuICogcmVzcGVjdGl2ZWx5KS5cbiAqXG4gKiBCeSBzZXBhcmF0aW5nIHRoZSB0YXJnZXQgSUQgc3BhY2UsIHRoZSBxdWVyeSBjYWNoZSBjYW4gZ2VuZXJhdGUgdGFyZ2V0IElEc1xuICogdGhhdCBwZXJzaXN0IGFjcm9zcyBjbGllbnQgcmVzdGFydHMsIHdoaWxlIHN5bmMgZW5naW5lIGNhbiBpbmRlcGVuZGVudGx5XG4gKiBnZW5lcmF0ZSBpbi1tZW1vcnkgdGFyZ2V0IElEcyB0aGF0IGFyZSB0cmFuc2llbnQgYW5kIGNhbiBiZSByZXVzZWQgYWZ0ZXIgYVxuICogcmVzdGFydC5cbiAqL1xuY2xhc3MgbXIge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy53biA9IHQ7XG4gICAgfVxuICAgIG5leHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnduICs9IDIsIHRoaXMud247XG4gICAgfVxuICAgIHN0YXRpYyBtbigpIHtcbiAgICAgICAgLy8gVGhlIHRhcmdldCBjYWNoZSBnZW5lcmF0b3IgbXVzdCByZXR1cm4gJzInIGluIGl0cyBmaXJzdCBjYWxsIHRvIGBuZXh0KClgXG4gICAgICAgIC8vIGFzIHRoZXJlIGlzIG5vIGRpZmZlcmVudGlhdGlvbiBpbiB0aGUgcHJvdG9jb2wgbGF5ZXIgYmV0d2VlbiBhbiB1bnNldFxuICAgICAgICAvLyBudW1iZXIgYW5kIHRoZSBudW1iZXIgJzAnLiBJZiB3ZSB3ZXJlIHRvIHNlbnQgYSB0YXJnZXQgd2l0aCB0YXJnZXQgSURcbiAgICAgICAgLy8gJzAnLCB0aGUgYmFja2VuZCB3b3VsZCBjb25zaWRlciBpdCB1bnNldCBhbmQgcmVwbGFjZSBpdCB3aXRoIGl0cyBvd24gSUQuXG4gICAgICAgIHJldHVybiBuZXcgbXIoMCk7XG4gICAgfVxuICAgIHN0YXRpYyBnbigpIHtcbiAgICAgICAgLy8gU3luYyBlbmdpbmUgYXNzaWducyB0YXJnZXQgSURzIGZvciBsaW1ibyBkb2N1bWVudCBkZXRlY3Rpb24uXG4gICAgICAgIHJldHVybiBuZXcgbXIoLTEpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gY2xhc3MgZ3Ige1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5yZWZlcmVuY2VEZWxlZ2F0ZSA9IHQsIHRoaXMuTSA9IGU7XG4gICAgfVxuICAgIC8vIFBPUlRJTkcgTk9URTogV2UgZG9uJ3QgY2FjaGUgZ2xvYmFsIG1ldGFkYXRhIGZvciB0aGUgdGFyZ2V0IGNhY2hlLCBzaW5jZVxuICAgIC8vIHNvbWUgb2YgaXQgKGluIHBhcnRpY3VsYXIgYGhpZ2hlc3RUYXJnZXRJZGApIGNhbiBiZSBtb2RpZmllZCBieSBzZWNvbmRhcnlcbiAgICAvLyB0YWJzLiBXZSBjb3VsZCBwZXJoYXBzIGJlIG1vcmUgZ3JhbnVsYXIgKGFuZCBlLmcuIHN0aWxsIGNhY2hlXG4gICAgLy8gYGxhc3RSZW1vdGVTbmFwc2hvdFZlcnNpb25gIGluIG1lbW9yeSkgYnV0IGZvciBzaW1wbGljaXR5IHdlIGN1cnJlbnRseSBnb1xuICAgIC8vIHRvIEluZGV4ZWREYiB3aGVuZXZlciB3ZSBuZWVkIHRvIHJlYWQgbWV0YWRhdGEuIFdlIGNhbiByZXZpc2l0IGlmIGl0IHR1cm5zXG4gICAgLy8gb3V0IHRvIGhhdmUgYSBtZWFuaW5nZnVsIHBlcmZvcm1hbmNlIGltcGFjdC5cbiAgICBhbGxvY2F0ZVRhcmdldElkKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueW4odCkubmV4dCgoZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuID0gbmV3IG1yKGUuaGlnaGVzdFRhcmdldElkKTtcbiAgICAgICAgICAgIHJldHVybiBlLmhpZ2hlc3RUYXJnZXRJZCA9IG4ubmV4dCgpLCB0aGlzLnBuKHQsIGUpLm5leHQoKCgpID0+IGUuaGlnaGVzdFRhcmdldElkKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgZ2V0TGFzdFJlbW90ZVNuYXBzaG90VmVyc2lvbih0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnluKHQpLm5leHQoKHQgPT4gY3QuZnJvbVRpbWVzdGFtcChuZXcgdXQodC5sYXN0UmVtb3RlU25hcHNob3RWZXJzaW9uLnNlY29uZHMsIHQubGFzdFJlbW90ZVNuYXBzaG90VmVyc2lvbi5uYW5vc2Vjb25kcykpKSk7XG4gICAgfVxuICAgIGdldEhpZ2hlc3RTZXF1ZW5jZU51bWJlcih0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnluKHQpLm5leHQoKHQgPT4gdC5oaWdoZXN0TGlzdGVuU2VxdWVuY2VOdW1iZXIpKTtcbiAgICB9XG4gICAgc2V0VGFyZ2V0c01ldGFkYXRhKHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueW4odCkubmV4dCgocyA9PiAocy5oaWdoZXN0TGlzdGVuU2VxdWVuY2VOdW1iZXIgPSBlLCBuICYmIChzLmxhc3RSZW1vdGVTbmFwc2hvdFZlcnNpb24gPSBuLnRvVGltZXN0YW1wKCkpLCBcbiAgICAgICAgZSA+IHMuaGlnaGVzdExpc3RlblNlcXVlbmNlTnVtYmVyICYmIChzLmhpZ2hlc3RMaXN0ZW5TZXF1ZW5jZU51bWJlciA9IGUpLCB0aGlzLnBuKHQsIHMpKSkpO1xuICAgIH1cbiAgICBhZGRUYXJnZXREYXRhKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuSW4odCwgZSkubmV4dCgoKCkgPT4gdGhpcy55bih0KS5uZXh0KChuID0+IChuLnRhcmdldENvdW50ICs9IDEsIHRoaXMuVG4oZSwgbiksIFxuICAgICAgICB0aGlzLnBuKHQsIG4pKSkpKSk7XG4gICAgfVxuICAgIHVwZGF0ZVRhcmdldERhdGEodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5Jbih0LCBlKTtcbiAgICB9XG4gICAgcmVtb3ZlVGFyZ2V0RGF0YSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbW92ZU1hdGNoaW5nS2V5c0ZvclRhcmdldElkKHQsIGUudGFyZ2V0SWQpLm5leHQoKCgpID0+IHlyKHQpLmRlbGV0ZShlLnRhcmdldElkKSkpLm5leHQoKCgpID0+IHRoaXMueW4odCkpKS5uZXh0KChlID0+IChxKGUudGFyZ2V0Q291bnQgPiAwKSwgXG4gICAgICAgIGUudGFyZ2V0Q291bnQgLT0gMSwgdGhpcy5wbih0LCBlKSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRHJvcHMgYW55IHRhcmdldHMgd2l0aCBzZXF1ZW5jZSBudW1iZXIgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSB1cHBlciBib3VuZCwgZXhjZXB0aW5nIHRob3NlXG4gICAgICogcHJlc2VudCBpbiBgYWN0aXZlVGFyZ2V0SWRzYC4gRG9jdW1lbnQgYXNzb2NpYXRpb25zIGZvciB0aGUgcmVtb3ZlZCB0YXJnZXRzIGFyZSBhbHNvIHJlbW92ZWQuXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRhcmdldHMgcmVtb3ZlZC5cbiAgICAgKi8gICAgcmVtb3ZlVGFyZ2V0cyh0LCBlLCBuKSB7XG4gICAgICAgIGxldCBzID0gMDtcbiAgICAgICAgY29uc3QgaSA9IFtdO1xuICAgICAgICByZXR1cm4geXIodCkuV3QoKChyLCBvKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0geGkobyk7XG4gICAgICAgICAgICBhLnNlcXVlbmNlTnVtYmVyIDw9IGUgJiYgbnVsbCA9PT0gbi5nZXQoYS50YXJnZXRJZCkgJiYgKHMrKywgaS5wdXNoKHRoaXMucmVtb3ZlVGFyZ2V0RGF0YSh0LCBhKSkpO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4gdWkud2FpdEZvcihpKSkpLm5leHQoKCgpID0+IHMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbCBwcm92aWRlZCBmdW5jdGlvbiB3aXRoIGVhY2ggYFRhcmdldERhdGFgIHRoYXQgd2UgaGF2ZSBjYWNoZWQuXG4gICAgICovICAgIGZvckVhY2hUYXJnZXQodCwgZSkge1xuICAgICAgICByZXR1cm4geXIodCkuV3QoKCh0LCBuKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzID0geGkobik7XG4gICAgICAgICAgICBlKHMpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIHluKHQpIHtcbiAgICAgICAgcmV0dXJuIHByKHQpLmdldChcInRhcmdldEdsb2JhbEtleVwiKS5uZXh0KCh0ID0+IChxKG51bGwgIT09IHQpLCB0KSkpO1xuICAgIH1cbiAgICBwbih0LCBlKSB7XG4gICAgICAgIHJldHVybiBwcih0KS5wdXQoXCJ0YXJnZXRHbG9iYWxLZXlcIiwgZSk7XG4gICAgfVxuICAgIEluKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHlyKHQpLnB1dChOaSh0aGlzLk0sIGUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW4tcGxhY2UgdXBkYXRlcyB0aGUgcHJvdmlkZWQgbWV0YWRhdGEgdG8gYWNjb3VudCBmb3IgdmFsdWVzIGluIHRoZSBnaXZlblxuICAgICAqIFRhcmdldERhdGEuIFNhdmluZyBpcyBkb25lIHNlcGFyYXRlbHkuIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSB3ZXJlIGFueVxuICAgICAqIGNoYW5nZXMgdG8gdGhlIG1ldGFkYXRhLlxuICAgICAqLyAgICBUbih0LCBlKSB7XG4gICAgICAgIGxldCBuID0gITE7XG4gICAgICAgIHJldHVybiB0LnRhcmdldElkID4gZS5oaWdoZXN0VGFyZ2V0SWQgJiYgKGUuaGlnaGVzdFRhcmdldElkID0gdC50YXJnZXRJZCwgbiA9ICEwKSwgXG4gICAgICAgIHQuc2VxdWVuY2VOdW1iZXIgPiBlLmhpZ2hlc3RMaXN0ZW5TZXF1ZW5jZU51bWJlciAmJiAoZS5oaWdoZXN0TGlzdGVuU2VxdWVuY2VOdW1iZXIgPSB0LnNlcXVlbmNlTnVtYmVyLCBcbiAgICAgICAgbiA9ICEwKSwgbjtcbiAgICB9XG4gICAgZ2V0VGFyZ2V0Q291bnQodCkge1xuICAgICAgICByZXR1cm4gdGhpcy55bih0KS5uZXh0KCh0ID0+IHQudGFyZ2V0Q291bnQpKTtcbiAgICB9XG4gICAgZ2V0VGFyZ2V0RGF0YSh0LCBlKSB7XG4gICAgICAgIC8vIEl0ZXJhdGluZyBieSB0aGUgY2Fub25pY2FsSWQgbWF5IHlpZWxkIG1vcmUgdGhhbiBvbmUgcmVzdWx0IGJlY2F1c2VcbiAgICAgICAgLy8gY2Fub25pY2FsSWQgdmFsdWVzIGFyZSBub3QgcmVxdWlyZWQgdG8gYmUgdW5pcXVlIHBlciB0YXJnZXQuIFRoaXMgcXVlcnlcbiAgICAgICAgLy8gZGVwZW5kcyBvbiB0aGUgcXVlcnlUYXJnZXRzIGluZGV4IHRvIGJlIGVmZmljaWVudC5cbiAgICAgICAgY29uc3QgbiA9IGNlKGUpLCBzID0gSURCS2V5UmFuZ2UuYm91bmQoWyBuLCBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgXSwgWyBuLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgXSk7XG4gICAgICAgIGxldCBpID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHlyKHQpLld0KHtcbiAgICAgICAgICAgIHJhbmdlOiBzLFxuICAgICAgICAgICAgaW5kZXg6IFwicXVlcnlUYXJnZXRzSW5kZXhcIlxuICAgICAgICB9LCAoKHQsIG4sIHMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHIgPSB4aShuKTtcbiAgICAgICAgICAgIC8vIEFmdGVyIGZpbmRpbmcgYSBwb3RlbnRpYWwgbWF0Y2gsIGNoZWNrIHRoYXQgdGhlIHRhcmdldCBpc1xuICAgICAgICAgICAgLy8gYWN0dWFsbHkgZXF1YWwgdG8gdGhlIHJlcXVlc3RlZCB0YXJnZXQuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZShlLCByLnRhcmdldCkgJiYgKGkgPSByLCBzLmRvbmUoKSk7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiBpKSk7XG4gICAgfVxuICAgIGFkZE1hdGNoaW5nS2V5cyh0LCBlLCBuKSB7XG4gICAgICAgIC8vIFBPUlRJTkcgTk9URTogVGhlIHJldmVyc2UgaW5kZXggKGRvY3VtZW50c1RhcmdldHMpIGlzIG1haW50YWluZWQgYnlcbiAgICAgICAgLy8gSW5kZXhlZERiLlxuICAgICAgICBjb25zdCBzID0gW10sIGkgPSBJcih0KTtcbiAgICAgICAgcmV0dXJuIGUuZm9yRWFjaCgoZSA9PiB7XG4gICAgICAgICAgICBjb25zdCByID0gJHMoZS5wYXRoKTtcbiAgICAgICAgICAgIHMucHVzaChpLnB1dCh7XG4gICAgICAgICAgICAgICAgdGFyZ2V0SWQ6IG4sXG4gICAgICAgICAgICAgICAgcGF0aDogclxuICAgICAgICAgICAgfSkpLCBzLnB1c2godGhpcy5yZWZlcmVuY2VEZWxlZ2F0ZS5hZGRSZWZlcmVuY2UodCwgbiwgZSkpO1xuICAgICAgICB9KSksIHVpLndhaXRGb3Iocyk7XG4gICAgfVxuICAgIHJlbW92ZU1hdGNoaW5nS2V5cyh0LCBlLCBuKSB7XG4gICAgICAgIC8vIFBPUlRJTkcgTk9URTogVGhlIHJldmVyc2UgaW5kZXggKGRvY3VtZW50c1RhcmdldHMpIGlzIG1haW50YWluZWQgYnlcbiAgICAgICAgLy8gSW5kZXhlZERiLlxuICAgICAgICBjb25zdCBzID0gSXIodCk7XG4gICAgICAgIHJldHVybiB1aS5mb3JFYWNoKGUsIChlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSAkcyhlLnBhdGgpO1xuICAgICAgICAgICAgcmV0dXJuIHVpLndhaXRGb3IoWyBzLmRlbGV0ZShbIG4sIGkgXSksIHRoaXMucmVmZXJlbmNlRGVsZWdhdGUucmVtb3ZlUmVmZXJlbmNlKHQsIG4sIGUpIF0pO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIHJlbW92ZU1hdGNoaW5nS2V5c0ZvclRhcmdldElkKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IElyKHQpLCBzID0gSURCS2V5UmFuZ2UuYm91bmQoWyBlIF0sIFsgZSArIDEgXSwgXG4gICAgICAgIC8qbG93ZXJPcGVuPSovICExLCBcbiAgICAgICAgLyp1cHBlck9wZW49Ki8gITApO1xuICAgICAgICByZXR1cm4gbi5kZWxldGUocyk7XG4gICAgfVxuICAgIGdldE1hdGNoaW5nS2V5c0ZvclRhcmdldElkKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IElEQktleVJhbmdlLmJvdW5kKFsgZSBdLCBbIGUgKyAxIF0sIFxuICAgICAgICAvKmxvd2VyT3Blbj0qLyAhMSwgXG4gICAgICAgIC8qdXBwZXJPcGVuPSovICEwKSwgcyA9IElyKHQpO1xuICAgICAgICBsZXQgaSA9IEduKCk7XG4gICAgICAgIHJldHVybiBzLld0KHtcbiAgICAgICAgICAgIHJhbmdlOiBuLFxuICAgICAgICAgICAganQ6ICEwXG4gICAgICAgIH0sICgodCwgZSwgbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgcyA9IExzKHRbMV0pLCByID0gbmV3IHh0KHMpO1xuICAgICAgICAgICAgaSA9IGkuYWRkKHIpO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4gaSkpO1xuICAgIH1cbiAgICBjb250YWluc0tleSh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSAkcyhlLnBhdGgpLCBzID0gSURCS2V5UmFuZ2UuYm91bmQoWyBuIF0sIFsgYXQobikgXSwgXG4gICAgICAgIC8qbG93ZXJPcGVuPSovICExLCBcbiAgICAgICAgLyp1cHBlck9wZW49Ki8gITApO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIHJldHVybiBJcih0KS5XdCh7XG4gICAgICAgICAgICBpbmRleDogXCJkb2N1bWVudFRhcmdldHNJbmRleFwiLFxuICAgICAgICAgICAganQ6ICEwLFxuICAgICAgICAgICAgcmFuZ2U6IHNcbiAgICAgICAgfSwgKChbdCwgZV0sIG4sIHMpID0+IHtcbiAgICAgICAgICAgIC8vIEhhdmluZyBhIHNlbnRpbmVsIHJvdyBmb3IgYSBkb2N1bWVudCBkb2VzIG5vdCBjb3VudCBhcyBjb250YWluaW5nIHRoYXQgZG9jdW1lbnQ7XG4gICAgICAgICAgICAvLyBGb3IgdGhlIHRhcmdldCBjYWNoZSwgY29udGFpbmluZyB0aGUgZG9jdW1lbnQgbWVhbnMgdGhlIGRvY3VtZW50IGlzIHBhcnQgb2Ygc29tZVxuICAgICAgICAgICAgLy8gdGFyZ2V0LlxuICAgICAgICAgICAgMCAhPT0gdCAmJiAoaSsrLCBzLmRvbmUoKSk7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiBpID4gMCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb29rcyB1cCBhIFRhcmdldERhdGEgZW50cnkgYnkgdGFyZ2V0IElELlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhcmdldElkIC0gVGhlIHRhcmdldCBJRCBvZiB0aGUgVGFyZ2V0RGF0YSBlbnRyeSB0byBsb29rIHVwLlxuICAgICAqIEByZXR1cm5zIFRoZSBjYWNoZWQgVGFyZ2V0RGF0YSBlbnRyeSwgb3IgbnVsbCBpZiB0aGUgY2FjaGUgaGFzIG5vIGVudHJ5IGZvclxuICAgICAqIHRoZSB0YXJnZXQuXG4gICAgICovXG4gICAgLy8gUE9SVElORyBOT1RFOiBNdWx0aS10YWIgb25seS5cbiAgICBFdCh0LCBlKSB7XG4gICAgICAgIHJldHVybiB5cih0KS5nZXQoZSkubmV4dCgodCA9PiB0ID8geGkodCkgOiBudWxsKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEhlbHBlciB0byBnZXQgYSB0eXBlZCBTaW1wbGVEYlN0b3JlIGZvciB0aGUgcXVlcmllcyBvYmplY3Qgc3RvcmUuXG4gKi8gZnVuY3Rpb24geXIodCkge1xuICAgIHJldHVybiBwaSh0LCBcInRhcmdldHNcIik7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGdldCBhIHR5cGVkIFNpbXBsZURiU3RvcmUgZm9yIHRoZSB0YXJnZXQgZ2xvYmFscyBvYmplY3Qgc3RvcmUuXG4gKi8gZnVuY3Rpb24gcHIodCkge1xuICAgIHJldHVybiBwaSh0LCBcInRhcmdldEdsb2JhbFwiKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gZ2V0IGEgdHlwZWQgU2ltcGxlRGJTdG9yZSBmb3IgdGhlIGRvY3VtZW50IHRhcmdldCBvYmplY3Qgc3RvcmUuXG4gKi8gZnVuY3Rpb24gSXIodCkge1xuICAgIHJldHVybiBwaSh0LCBcInRhcmdldERvY3VtZW50c1wiKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogVmVyaWZpZXMgdGhlIGVycm9yIHRocm93biBieSBhIExvY2FsU3RvcmUgb3BlcmF0aW9uLiBJZiBhIExvY2FsU3RvcmVcbiAqIG9wZXJhdGlvbiBmYWlscyBiZWNhdXNlIHRoZSBwcmltYXJ5IGxlYXNlIGhhcyBiZWVuIHRha2VuIGJ5IGFub3RoZXIgY2xpZW50LFxuICogd2UgaWdub3JlIHRoZSBlcnJvciAodGhlIHBlcnNpc3RlbmNlIGxheWVyIHdpbGwgaW1tZWRpYXRlbHkgY2FsbFxuICogYGFwcGx5UHJpbWFyeUxlYXNlYCB0byBwcm9wYWdhdGUgdGhlIHByaW1hcnkgc3RhdGUgY2hhbmdlKS4gQWxsIG90aGVyIGVycm9yc1xuICogYXJlIHJlLXRocm93bi5cbiAqXG4gKiBAcGFyYW0gZXJyIC0gQW4gZXJyb3IgcmV0dXJuZWQgYnkgYSBMb2NhbFN0b3JlIG9wZXJhdGlvbi5cbiAqIEByZXR1cm5zIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHdlIHJlY292ZXJlZCwgb3IgdGhlIG9yaWdpbmFsIGVycm9yLlxuICovIGFzeW5jIGZ1bmN0aW9uIFRyKHQpIHtcbiAgICBpZiAodC5jb2RlICE9PSBHLkZBSUxFRF9QUkVDT05ESVRJT04gfHwgdC5tZXNzYWdlICE9PSBvaSkgdGhyb3cgdDtcbiAgICBPKFwiTG9jYWxTdG9yZVwiLCBcIlVuZXhwZWN0ZWRseSBsb3N0IHByaW1hcnkgbGVhc2VcIik7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGZ1bmN0aW9uIEVyKFt0LCBlXSwgW24sIHNdKSB7XG4gICAgY29uc3QgaSA9IHJ0KHQsIG4pO1xuICAgIHJldHVybiAwID09PSBpID8gcnQoZSwgcykgOiBpO1xufVxuXG4vKipcbiAqIFVzZWQgdG8gY2FsY3VsYXRlIHRoZSBudGggc2VxdWVuY2UgbnVtYmVyLiBLZWVwcyBhIHJvbGxpbmcgYnVmZmVyIG9mIHRoZVxuICogbG93ZXN0IG4gdmFsdWVzIHBhc3NlZCB0byBgYWRkRWxlbWVudGAsIGFuZCBmaW5hbGx5IHJlcG9ydHMgdGhlIGxhcmdlc3Qgb2ZcbiAqIHRoZW0gaW4gYG1heFZhbHVlYC5cbiAqLyBjbGFzcyBBciB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLkVuID0gdCwgdGhpcy5idWZmZXIgPSBuZXcga24oRXIpLCB0aGlzLkFuID0gMDtcbiAgICB9XG4gICAgUm4oKSB7XG4gICAgICAgIHJldHVybiArK3RoaXMuQW47XG4gICAgfVxuICAgIGJuKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IFsgdCwgdGhpcy5SbigpIF07XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlci5zaXplIDwgdGhpcy5FbikgdGhpcy5idWZmZXIgPSB0aGlzLmJ1ZmZlci5hZGQoZSk7IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuYnVmZmVyLmxhc3QoKTtcbiAgICAgICAgICAgIEVyKGUsIHQpIDwgMCAmJiAodGhpcy5idWZmZXIgPSB0aGlzLmJ1ZmZlci5kZWxldGUodCkuYWRkKGUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgbWF4VmFsdWUoKSB7XG4gICAgICAgIC8vIEd1YXJhbnRlZWQgdG8gYmUgbm9uLWVtcHR5LiBJZiB3ZSBkZWNpZGUgd2UgYXJlIG5vdCBjb2xsZWN0aW5nIGFueVxuICAgICAgICAvLyBzZXF1ZW5jZSBudW1iZXJzLCBudGhTZXF1ZW5jZU51bWJlciBiZWxvdyBzaG9ydC1jaXJjdWl0cy4gSWYgd2UgaGF2ZVxuICAgICAgICAvLyBkZWNpZGVkIHRoYXQgd2UgYXJlIGNvbGxlY3RpbmcgbiBzZXF1ZW5jZSBudW1iZXJzLCBpdCdzIGJlY2F1c2UgbiBpcyBzb21lXG4gICAgICAgIC8vIHBlcmNlbnRhZ2Ugb2YgdGhlIGV4aXN0aW5nIHNlcXVlbmNlIG51bWJlcnMuIFRoYXQgbWVhbnMgd2Ugc2hvdWxkIG5ldmVyXG4gICAgICAgIC8vIGJlIGluIGEgc2l0dWF0aW9uIHdoZXJlIHdlIGFyZSBjb2xsZWN0aW5nIHNlcXVlbmNlIG51bWJlcnMgYnV0IGRvbid0XG4gICAgICAgIC8vIGFjdHVhbGx5IGhhdmUgYW55LlxuICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIubGFzdCgpWzBdO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgc2NoZWR1bGluZyBvZiBMUlUgZ2FyYmFnZSBjb2xsZWN0aW9uLiBJdCBoYW5kbGVzIGNoZWNraW5nXG4gKiB3aGV0aGVyIG9yIG5vdCBHQyBpcyBlbmFibGVkLCBhcyB3ZWxsIGFzIHdoaWNoIGRlbGF5IHRvIHVzZSBiZWZvcmUgdGhlIG5leHQgcnVuLlxuICovIGNsYXNzIFJyIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMuZ2FyYmFnZUNvbGxlY3RvciA9IHQsIHRoaXMuYXN5bmNRdWV1ZSA9IGUsIHRoaXMuUG4gPSAhMSwgdGhpcy5WbiA9IG51bGw7XG4gICAgfVxuICAgIHN0YXJ0KHQpIHtcbiAgICAgICAgLTEgIT09IHRoaXMuZ2FyYmFnZUNvbGxlY3Rvci5wYXJhbXMuY2FjaGVTaXplQ29sbGVjdGlvblRocmVzaG9sZCAmJiB0aGlzLnZuKHQpO1xuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICB0aGlzLlZuICYmICh0aGlzLlZuLmNhbmNlbCgpLCB0aGlzLlZuID0gbnVsbCk7XG4gICAgfVxuICAgIGdldCBzdGFydGVkKCkge1xuICAgICAgICByZXR1cm4gbnVsbCAhPT0gdGhpcy5WbjtcbiAgICB9XG4gICAgdm4odCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5QbiA/IDNlNSA6IDZlNDtcbiAgICAgICAgTyhcIkxydUdhcmJhZ2VDb2xsZWN0b3JcIiwgYEdhcmJhZ2UgY29sbGVjdGlvbiBzY2hlZHVsZWQgaW4gJHtlfW1zYCksIHRoaXMuVm4gPSB0aGlzLmFzeW5jUXVldWUuZW5xdWV1ZUFmdGVyRGVsYXkoXCJscnVfZ2FyYmFnZV9jb2xsZWN0aW9uXCIgLyogTHJ1R2FyYmFnZUNvbGxlY3Rpb24gKi8gLCBlLCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5WbiA9IG51bGwsIHRoaXMuUG4gPSAhMDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdC5jb2xsZWN0R2FyYmFnZSh0aGlzLmdhcmJhZ2VDb2xsZWN0b3IpO1xuICAgICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgICAgIGRpKHQpID8gTyhcIkxydUdhcmJhZ2VDb2xsZWN0b3JcIiwgXCJJZ25vcmluZyBJbmRleGVkREIgZXJyb3IgZHVyaW5nIGdhcmJhZ2UgY29sbGVjdGlvbjogXCIsIHQpIDogYXdhaXQgVHIodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnZuKHQpO1xuICAgICAgICB9KSk7XG4gICAgfVxufVxuXG4vKiogSW1wbGVtZW50cyB0aGUgc3RlcHMgZm9yIExSVSBnYXJiYWdlIGNvbGxlY3Rpb24uICovIGNsYXNzIGJyIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMuU24gPSB0LCB0aGlzLnBhcmFtcyA9IGU7XG4gICAgfVxuICAgIGNhbGN1bGF0ZVRhcmdldENvdW50KHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuU24uRG4odCkubmV4dCgodCA9PiBNYXRoLmZsb29yKGUgLyAxMDAgKiB0KSkpO1xuICAgIH1cbiAgICBudGhTZXF1ZW5jZU51bWJlcih0LCBlKSB7XG4gICAgICAgIGlmICgwID09PSBlKSByZXR1cm4gdWkucmVzb2x2ZShudC5BKTtcbiAgICAgICAgY29uc3QgbiA9IG5ldyBBcihlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuU24uZm9yRWFjaFRhcmdldCh0LCAodCA9PiBuLmJuKHQuc2VxdWVuY2VOdW1iZXIpKSkubmV4dCgoKCkgPT4gdGhpcy5Tbi5Dbih0LCAodCA9PiBuLmJuKHQpKSkpKS5uZXh0KCgoKSA9PiBuLm1heFZhbHVlKSk7XG4gICAgfVxuICAgIHJlbW92ZVRhcmdldHModCwgZSwgbikge1xuICAgICAgICByZXR1cm4gdGhpcy5Tbi5yZW1vdmVUYXJnZXRzKHQsIGUsIG4pO1xuICAgIH1cbiAgICByZW1vdmVPcnBoYW5lZERvY3VtZW50cyh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLlNuLnJlbW92ZU9ycGhhbmVkRG9jdW1lbnRzKHQsIGUpO1xuICAgIH1cbiAgICBjb2xsZWN0KHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIC0xID09PSB0aGlzLnBhcmFtcy5jYWNoZVNpemVDb2xsZWN0aW9uVGhyZXNob2xkID8gKE8oXCJMcnVHYXJiYWdlQ29sbGVjdG9yXCIsIFwiR2FyYmFnZSBjb2xsZWN0aW9uIHNraXBwZWQ7IGRpc2FibGVkXCIpLCBcbiAgICAgICAgdWkucmVzb2x2ZShhcikpIDogdGhpcy5nZXRDYWNoZVNpemUodCkubmV4dCgobiA9PiBuIDwgdGhpcy5wYXJhbXMuY2FjaGVTaXplQ29sbGVjdGlvblRocmVzaG9sZCA/IChPKFwiTHJ1R2FyYmFnZUNvbGxlY3RvclwiLCBgR2FyYmFnZSBjb2xsZWN0aW9uIHNraXBwZWQ7IENhY2hlIHNpemUgJHtufSBpcyBsb3dlciB0aGFuIHRocmVzaG9sZCAke3RoaXMucGFyYW1zLmNhY2hlU2l6ZUNvbGxlY3Rpb25UaHJlc2hvbGR9YCksIFxuICAgICAgICBhcikgOiB0aGlzLnhuKHQsIGUpKSk7XG4gICAgfVxuICAgIGdldENhY2hlU2l6ZSh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLlNuLmdldENhY2hlU2l6ZSh0KTtcbiAgICB9XG4gICAgeG4odCwgZSkge1xuICAgICAgICBsZXQgbiwgcywgaSwgciwgbywgdSwgYztcbiAgICAgICAgY29uc3QgaCA9IERhdGUubm93KCk7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZVRhcmdldENvdW50KHQsIHRoaXMucGFyYW1zLnBlcmNlbnRpbGVUb0NvbGxlY3QpLm5leHQoKGUgPT4gKFxuICAgICAgICAvLyBDYXAgYXQgdGhlIGNvbmZpZ3VyZWQgbWF4XG4gICAgICAgIGUgPiB0aGlzLnBhcmFtcy5tYXhpbXVtU2VxdWVuY2VOdW1iZXJzVG9Db2xsZWN0ID8gKE8oXCJMcnVHYXJiYWdlQ29sbGVjdG9yXCIsIGBDYXBwaW5nIHNlcXVlbmNlIG51bWJlcnMgdG8gY29sbGVjdCBkb3duIHRvIHRoZSBtYXhpbXVtIG9mICR7dGhpcy5wYXJhbXMubWF4aW11bVNlcXVlbmNlTnVtYmVyc1RvQ29sbGVjdH0gZnJvbSAke2V9YCksIFxuICAgICAgICBzID0gdGhpcy5wYXJhbXMubWF4aW11bVNlcXVlbmNlTnVtYmVyc1RvQ29sbGVjdCkgOiBzID0gZSwgciA9IERhdGUubm93KCksIHRoaXMubnRoU2VxdWVuY2VOdW1iZXIodCwgcykpKSkubmV4dCgocyA9PiAobiA9IHMsIFxuICAgICAgICBvID0gRGF0ZS5ub3coKSwgdGhpcy5yZW1vdmVUYXJnZXRzKHQsIG4sIGUpKSkpLm5leHQoKGUgPT4gKGkgPSBlLCB1ID0gRGF0ZS5ub3coKSwgXG4gICAgICAgIHRoaXMucmVtb3ZlT3JwaGFuZWREb2N1bWVudHModCwgbikpKSkubmV4dCgodCA9PiB7XG4gICAgICAgICAgICBpZiAoYyA9IERhdGUubm93KCksIGsoKSA8PSBMb2dMZXZlbC5ERUJVRykge1xuICAgICAgICAgICAgICAgIE8oXCJMcnVHYXJiYWdlQ29sbGVjdG9yXCIsIGBMUlUgR2FyYmFnZSBDb2xsZWN0aW9uXFxuXFx0Q291bnRlZCB0YXJnZXRzIGluICR7ciAtIGh9bXNcXG5cXHREZXRlcm1pbmVkIGxlYXN0IHJlY2VudGx5IHVzZWQgJHtzfSBpbiBgICsgKG8gLSByKSArIFwibXNcXG5cIiArIGBcXHRSZW1vdmVkICR7aX0gdGFyZ2V0cyBpbiBgICsgKHUgLSBvKSArIFwibXNcXG5cIiArIGBcXHRSZW1vdmVkICR7dH0gZG9jdW1lbnRzIGluIGAgKyAoYyAtIHUpICsgXCJtc1xcblwiICsgYFRvdGFsIER1cmF0aW9uOiAke2MgLSBofW1zYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdWkucmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgZGlkUnVuOiAhMCxcbiAgICAgICAgICAgICAgICBzZXF1ZW5jZU51bWJlcnNDb2xsZWN0ZWQ6IHMsXG4gICAgICAgICAgICAgICAgdGFyZ2V0c1JlbW92ZWQ6IGksXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRzUmVtb3ZlZDogdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogUHJvdmlkZXMgTFJVIGZ1bmN0aW9uYWxpdHkgZm9yIEluZGV4ZWREQiBwZXJzaXN0ZW5jZS4gKi9cbmNsYXNzIFByIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMuZGIgPSB0LCB0aGlzLmdhcmJhZ2VDb2xsZWN0b3IgPSBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGJyKHQsIGUpO1xuICAgICAgICB9KHRoaXMsIGUpO1xuICAgIH1cbiAgICBEbih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLk5uKHQpO1xuICAgICAgICByZXR1cm4gdGhpcy5kYi5nZXRUYXJnZXRDYWNoZSgpLmdldFRhcmdldENvdW50KHQpLm5leHQoKHQgPT4gZS5uZXh0KChlID0+IHQgKyBlKSkpKTtcbiAgICB9XG4gICAgTm4odCkge1xuICAgICAgICBsZXQgZSA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzLkNuKHQsICh0ID0+IHtcbiAgICAgICAgICAgIGUrKztcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IGUpKTtcbiAgICB9XG4gICAgZm9yRWFjaFRhcmdldCh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRiLmdldFRhcmdldENhY2hlKCkuZm9yRWFjaFRhcmdldCh0LCBlKTtcbiAgICB9XG4gICAgQ24odCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5rbih0LCAoKHQsIG4pID0+IGUobikpKTtcbiAgICB9XG4gICAgYWRkUmVmZXJlbmNlKHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIFZyKHQsIG4pO1xuICAgIH1cbiAgICByZW1vdmVSZWZlcmVuY2UodCwgZSwgbikge1xuICAgICAgICByZXR1cm4gVnIodCwgbik7XG4gICAgfVxuICAgIHJlbW92ZVRhcmdldHModCwgZSwgbikge1xuICAgICAgICByZXR1cm4gdGhpcy5kYi5nZXRUYXJnZXRDYWNoZSgpLnJlbW92ZVRhcmdldHModCwgZSwgbik7XG4gICAgfVxuICAgIG1hcmtQb3RlbnRpYWxseU9ycGhhbmVkKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIFZyKHQsIGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgYW55dGhpbmcgd291bGQgcHJldmVudCB0aGlzIGRvY3VtZW50IGZyb20gYmVpbmcgZ2FyYmFnZVxuICAgICAqIGNvbGxlY3RlZCwgZ2l2ZW4gdGhhdCB0aGUgZG9jdW1lbnQgaW4gcXVlc3Rpb24gaXMgbm90IHByZXNlbnQgaW4gYW55XG4gICAgICogdGFyZ2V0cyBhbmQgaGFzIGEgc2VxdWVuY2UgbnVtYmVyIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgdXBwZXIgYm91bmQgZm9yXG4gICAgICogdGhlIGNvbGxlY3Rpb24gcnVuLlxuICAgICAqLyAgICBNbih0LCBlKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBsZXQgbiA9ICExO1xuICAgICAgICAgICAgcmV0dXJuIHdyKHQpLnp0KChzID0+IGZyKHQsIHMsIGUpLm5leHQoKHQgPT4gKHQgJiYgKG4gPSAhMCksIHVpLnJlc29sdmUoIXQpKSkpKSkubmV4dCgoKCkgPT4gbikpO1xuICAgICAgICB9KHQsIGUpO1xuICAgIH1cbiAgICByZW1vdmVPcnBoYW5lZERvY3VtZW50cyh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLmRiLmdldFJlbW90ZURvY3VtZW50Q2FjaGUoKS5uZXdDaGFuZ2VCdWZmZXIoKSwgcyA9IFtdO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzLmtuKHQsICgociwgbykgPT4ge1xuICAgICAgICAgICAgaWYgKG8gPD0gZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLk1uKHQsIHIpLm5leHQoKGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWUpIFxuICAgICAgICAgICAgICAgICAgICAvLyBPdXIgc2l6ZSBhY2NvdW50aW5nIHJlcXVpcmVzIHVzIHRvIHJlYWQgYWxsIGRvY3VtZW50cyBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZpbmcgdGhlbS5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkrKywgbi5nZXRFbnRyeSh0LCByKS5uZXh0KCgoKSA9PiAobi5yZW1vdmVFbnRyeShyLCBjdC5taW4oKSksIElyKHQpLmRlbGV0ZShbIDAsICRzKHIucGF0aCkgXSkpKSk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIHMucHVzaChlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpLm5leHQoKCgpID0+IHVpLndhaXRGb3IocykpKS5uZXh0KCgoKSA9PiBuLmFwcGx5KHQpKSkubmV4dCgoKCkgPT4gaSkpO1xuICAgIH1cbiAgICByZW1vdmVUYXJnZXQodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gZS53aXRoU2VxdWVuY2VOdW1iZXIodC5jdXJyZW50U2VxdWVuY2VOdW1iZXIpO1xuICAgICAgICByZXR1cm4gdGhpcy5kYi5nZXRUYXJnZXRDYWNoZSgpLnVwZGF0ZVRhcmdldERhdGEodCwgbik7XG4gICAgfVxuICAgIHVwZGF0ZUxpbWJvRG9jdW1lbnQodCwgZSkge1xuICAgICAgICByZXR1cm4gVnIodCwgZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGwgcHJvdmlkZWQgZnVuY3Rpb24gZm9yIGVhY2ggZG9jdW1lbnQgaW4gdGhlIGNhY2hlIHRoYXQgaXMgJ29ycGhhbmVkJy4gT3JwaGFuZWRcbiAgICAgKiBtZWFucyBub3QgYSBwYXJ0IG9mIGFueSB0YXJnZXQsIHNvIHRoZSBvbmx5IGVudHJ5IGluIHRoZSB0YXJnZXQtZG9jdW1lbnQgaW5kZXggZm9yXG4gICAgICogdGhhdCBkb2N1bWVudCB3aWxsIGJlIHRoZSBzZW50aW5lbCByb3cgKHRhcmdldElkIDApLCB3aGljaCB3aWxsIGFsc28gaGF2ZSB0aGUgc2VxdWVuY2VcbiAgICAgKiBudW1iZXIgZm9yIHRoZSBsYXN0IHRpbWUgdGhlIGRvY3VtZW50IHdhcyBhY2Nlc3NlZC5cbiAgICAgKi8gICAga24odCwgZSkge1xuICAgICAgICBjb25zdCBuID0gSXIodCk7XG4gICAgICAgIGxldCBzLCBpID0gbnQuQTtcbiAgICAgICAgcmV0dXJuIG4uV3Qoe1xuICAgICAgICAgICAgaW5kZXg6IFwiZG9jdW1lbnRUYXJnZXRzSW5kZXhcIlxuICAgICAgICB9LCAoKFt0LCBuXSwge3BhdGg6IHIsIHNlcXVlbmNlTnVtYmVyOiBvfSkgPT4ge1xuICAgICAgICAgICAgMCA9PT0gdCA/IChcbiAgICAgICAgICAgIC8vIGlmIG5leHRUb1JlcG9ydCBpcyB2YWxpZCwgcmVwb3J0IGl0LCB0aGlzIGlzIGEgbmV3IGtleSBzbyB0aGVcbiAgICAgICAgICAgIC8vIGxhc3Qgb25lIG11c3Qgbm90IGJlIGEgbWVtYmVyIG9mIGFueSB0YXJnZXRzLlxuICAgICAgICAgICAgaSAhPT0gbnQuQSAmJiBlKG5ldyB4dChMcyhzKSksIGkpLCBcbiAgICAgICAgICAgIC8vIHNldCBuZXh0VG9SZXBvcnQgdG8gYmUgdGhpcyBzZXF1ZW5jZSBudW1iZXIuIEl0J3MgdGhlIG5leHQgb25lIHdlXG4gICAgICAgICAgICAvLyBtaWdodCByZXBvcnQsIGlmIHdlIGRvbid0IGZpbmQgYW55IHRhcmdldHMgZm9yIHRoaXMgZG9jdW1lbnQuXG4gICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIHNlcXVlbmNlIG51bWJlciBtdXN0IGJlIGRlZmluZWQgd2hlbiB0aGUgdGFyZ2V0SWRcbiAgICAgICAgICAgIC8vIGlzIDAuXG4gICAgICAgICAgICBpID0gbywgcyA9IHIpIDogXG4gICAgICAgICAgICAvLyBzZXQgbmV4dFRvUmVwb3J0IHRvIGJlIGludmFsaWQsIHdlIGtub3cgd2UgZG9uJ3QgbmVlZCB0byByZXBvcnRcbiAgICAgICAgICAgIC8vIHRoaXMgb25lIHNpbmNlIHdlIGZvdW5kIGEgdGFyZ2V0IGZvciBpdC5cbiAgICAgICAgICAgIGkgPSBudC5BO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4ge1xuICAgICAgICAgICAgLy8gU2luY2Ugd2UgcmVwb3J0IHNlcXVlbmNlIG51bWJlcnMgYWZ0ZXIgZ2V0dGluZyB0byB0aGUgbmV4dCBrZXksIHdlXG4gICAgICAgICAgICAvLyBuZWVkIHRvIGNoZWNrIGlmIHRoZSBsYXN0IGtleSB3ZSBpdGVyYXRlZCBvdmVyIHdhcyBhbiBvcnBoYW5lZFxuICAgICAgICAgICAgLy8gZG9jdW1lbnQgYW5kIHJlcG9ydCBpdC5cbiAgICAgICAgICAgIGkgIT09IG50LkEgJiYgZShuZXcgeHQoTHMocykpLCBpKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBnZXRDYWNoZVNpemUodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYi5nZXRSZW1vdGVEb2N1bWVudENhY2hlKCkuZ2V0U2l6ZSh0KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIFZyKHQsIGUpIHtcbiAgICByZXR1cm4gSXIodCkucHV0KFxuICAgIC8qKlxuICogQHJldHVybnMgQSB2YWx1ZSBzdWl0YWJsZSBmb3Igd3JpdGluZyBhIHNlbnRpbmVsIHJvdyBpbiB0aGUgdGFyZ2V0LWRvY3VtZW50XG4gKiBzdG9yZS5cbiAqL1xuICAgIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRhcmdldElkOiAwLFxuICAgICAgICAgICAgcGF0aDogJHModC5wYXRoKSxcbiAgICAgICAgICAgIHNlcXVlbmNlTnVtYmVyOiBlXG4gICAgICAgIH07XG4gICAgfShlLCB0LmN1cnJlbnRTZXF1ZW5jZU51bWJlcikpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBbiBpbi1tZW1vcnkgYnVmZmVyIG9mIGVudHJpZXMgdG8gYmUgd3JpdHRlbiB0byBhIFJlbW90ZURvY3VtZW50Q2FjaGUuXG4gKiBJdCBjYW4gYmUgdXNlZCB0byBiYXRjaCB1cCBhIHNldCBvZiBjaGFuZ2VzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGNhY2hlLCBidXRcbiAqIGFkZGl0aW9uYWxseSBzdXBwb3J0cyByZWFkaW5nIGVudHJpZXMgYmFjayB3aXRoIHRoZSBgZ2V0RW50cnkoKWAgbWV0aG9kLFxuICogZmFsbGluZyBiYWNrIHRvIHRoZSB1bmRlcmx5aW5nIFJlbW90ZURvY3VtZW50Q2FjaGUgaWYgbm8gZW50cnkgaXNcbiAqIGJ1ZmZlcmVkLlxuICpcbiAqIEVudHJpZXMgYWRkZWQgdG8gdGhlIGNhY2hlICptdXN0KiBiZSByZWFkIGZpcnN0LiBUaGlzIGlzIHRvIGZhY2lsaXRhdGVcbiAqIGNhbGN1bGF0aW5nIHRoZSBzaXplIGRlbHRhIG9mIHRoZSBwZW5kaW5nIGNoYW5nZXMuXG4gKlxuICogUE9SVElORyBOT1RFOiBUaGlzIGNsYXNzIHdhcyBpbXBsZW1lbnRlZCB0aGVuIHJlbW92ZWQgZnJvbSBvdGhlciBwbGF0Zm9ybXMuXG4gKiBJZiBieXRlLWNvdW50aW5nIGVuZHMgdXAgYmVpbmcgbmVlZGVkIG9uIHRoZSBvdGhlciBwbGF0Zm9ybXMsIGNvbnNpZGVyXG4gKiBwb3J0aW5nIHRoaXMgY2xhc3MgYXMgcGFydCBvZiB0aGF0IGltcGxlbWVudGF0aW9uIHdvcmsuXG4gKi8gY2xhc3MgdnIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBBIG1hcHBpbmcgb2YgZG9jdW1lbnQga2V5IHRvIHRoZSBuZXcgY2FjaGUgZW50cnkgdGhhdCBzaG91bGQgYmUgd3JpdHRlbi5cbiAgICAgICAgdGhpcy5jaGFuZ2VzID0gbmV3IERuKCh0ID0+IHQudG9TdHJpbmcoKSksICgodCwgZSkgPT4gdC5pc0VxdWFsKGUpKSksIHRoaXMuY2hhbmdlc0FwcGxpZWQgPSAhMTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQnVmZmVycyBhIGBSZW1vdGVEb2N1bWVudENhY2hlLmFkZEVudHJ5KClgIGNhbGwuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIG9ubHkgbW9kaWZ5IGRvY3VtZW50cyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHJldHJpZXZlZCB2aWFcbiAgICAgKiBgZ2V0RW50cnkoKS9nZXRFbnRyaWVzKClgIChlbmZvcmNlZCB2aWEgSW5kZXhlZERicyBgYXBwbHkoKWApLlxuICAgICAqLyAgICBhZGRFbnRyeSh0KSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QXBwbGllZCgpLCB0aGlzLmNoYW5nZXMuc2V0KHQua2V5LCB0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQnVmZmVycyBhIGBSZW1vdGVEb2N1bWVudENhY2hlLnJlbW92ZUVudHJ5KClgIGNhbGwuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIG9ubHkgcmVtb3ZlIGRvY3VtZW50cyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHJldHJpZXZlZCB2aWFcbiAgICAgKiBgZ2V0RW50cnkoKS9nZXRFbnRyaWVzKClgIChlbmZvcmNlZCB2aWEgSW5kZXhlZERicyBgYXBwbHkoKWApLlxuICAgICAqLyAgICByZW1vdmVFbnRyeSh0LCBlKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QXBwbGllZCgpLCB0aGlzLmNoYW5nZXMuc2V0KHQsIHRlLm5ld0ludmFsaWREb2N1bWVudCh0KS5zZXRSZWFkVGltZShlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvb2tzIHVwIGFuIGVudHJ5IGluIHRoZSBjYWNoZS4gVGhlIGJ1ZmZlcmVkIGNoYW5nZXMgd2lsbCBmaXJzdCBiZSBjaGVja2VkLFxuICAgICAqIGFuZCBpZiBubyBidWZmZXJlZCBjaGFuZ2UgYXBwbGllcywgdGhpcyB3aWxsIGZvcndhcmQgdG9cbiAgICAgKiBgUmVtb3RlRG9jdW1lbnRDYWNoZS5nZXRFbnRyeSgpYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbiAtIFRoZSB0cmFuc2FjdGlvbiBpbiB3aGljaCB0byBwZXJmb3JtIGFueSBwZXJzaXN0ZW5jZVxuICAgICAqICAgICBvcGVyYXRpb25zLlxuICAgICAqIEBwYXJhbSBkb2N1bWVudEtleSAtIFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGxvb2sgdXAuXG4gICAgICogQHJldHVybnMgVGhlIGNhY2hlZCBkb2N1bWVudCBvciBhbiBpbnZhbGlkIGRvY3VtZW50IGlmIHdlIGhhdmUgbm90aGluZ1xuICAgICAqIGNhY2hlZC5cbiAgICAgKi8gICAgZ2V0RW50cnkodCwgZSkge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEFwcGxpZWQoKTtcbiAgICAgICAgY29uc3QgbiA9IHRoaXMuY2hhbmdlcy5nZXQoZSk7XG4gICAgICAgIHJldHVybiB2b2lkIDAgIT09IG4gPyB1aS5yZXNvbHZlKG4pIDogdGhpcy5nZXRGcm9tQ2FjaGUodCwgZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvb2tzIHVwIHNldmVyYWwgZW50cmllcyBpbiB0aGUgY2FjaGUsIGZvcndhcmRpbmcgdG9cbiAgICAgKiBgUmVtb3RlRG9jdW1lbnRDYWNoZS5nZXRFbnRyeSgpYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbiAtIFRoZSB0cmFuc2FjdGlvbiBpbiB3aGljaCB0byBwZXJmb3JtIGFueSBwZXJzaXN0ZW5jZVxuICAgICAqICAgICBvcGVyYXRpb25zLlxuICAgICAqIEBwYXJhbSBkb2N1bWVudEtleXMgLSBUaGUga2V5cyBvZiB0aGUgZW50cmllcyB0byBsb29rIHVwLlxuICAgICAqIEByZXR1cm5zIEEgbWFwIG9mIGNhY2hlZCBkb2N1bWVudHMsIGluZGV4ZWQgYnkga2V5LiBJZiBhbiBlbnRyeSBjYW5ub3QgYmVcbiAgICAgKiAgICAgZm91bmQsIHRoZSBjb3JyZXNwb25kaW5nIGtleSB3aWxsIGJlIG1hcHBlZCB0byBhbiBpbnZhbGlkIGRvY3VtZW50LlxuICAgICAqLyAgICBnZXRFbnRyaWVzKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWxsRnJvbUNhY2hlKHQsIGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIGJ1ZmZlcmVkIGNoYW5nZXMgdG8gdGhlIHVuZGVybHlpbmcgUmVtb3RlRG9jdW1lbnRDYWNoZSwgdXNpbmdcbiAgICAgKiB0aGUgcHJvdmlkZWQgdHJhbnNhY3Rpb24uXG4gICAgICovICAgIGFwcGx5KHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXNzZXJ0Tm90QXBwbGllZCgpLCB0aGlzLmNoYW5nZXNBcHBsaWVkID0gITAsIHRoaXMuYXBwbHlDaGFuZ2VzKHQpO1xuICAgIH1cbiAgICAvKiogSGVscGVyIHRvIGFzc2VydCB0aGlzLmNoYW5nZXMgaXMgbm90IG51bGwgICovICAgIGFzc2VydE5vdEFwcGxpZWQoKSB7fVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBUaGUgUmVtb3RlRG9jdW1lbnRDYWNoZSBmb3IgSW5kZXhlZERiLiBUbyBjb25zdHJ1Y3QsIGludm9rZVxuICogYG5ld0luZGV4ZWREYlJlbW90ZURvY3VtZW50Q2FjaGUoKWAuXG4gKi8gY2xhc3MgU3Ige1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5NID0gdDtcbiAgICB9XG4gICAgc2V0SW5kZXhNYW5hZ2VyKHQpIHtcbiAgICAgICAgdGhpcy5pbmRleE1hbmFnZXIgPSB0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBzdXBwbGllZCBlbnRyaWVzIHRvIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEFsbCBjYWxscyBvZiBgYWRkRW50cnlgIGFyZSByZXF1aXJlZCB0byBnbyB0aHJvdWdoIHRoZSBSZW1vdGVEb2N1bWVudENoYW5nZUJ1ZmZlclxuICAgICAqIHJldHVybmVkIGJ5IGBuZXdDaGFuZ2VCdWZmZXIoKWAgdG8gZW5zdXJlIHByb3BlciBhY2NvdW50aW5nIG9mIG1ldGFkYXRhLlxuICAgICAqLyAgICBhZGRFbnRyeSh0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiB4cih0KS5wdXQoTnIoZSksIG4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgZG9jdW1lbnQgZnJvbSB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBBbGwgY2FsbHMgb2YgYHJlbW92ZUVudHJ5YCAgYXJlIHJlcXVpcmVkIHRvIGdvIHRocm91Z2ggdGhlIFJlbW90ZURvY3VtZW50Q2hhbmdlQnVmZmVyXG4gICAgICogcmV0dXJuZWQgYnkgYG5ld0NoYW5nZUJ1ZmZlcigpYCB0byBlbnN1cmUgcHJvcGVyIGFjY291bnRpbmcgb2YgbWV0YWRhdGEuXG4gICAgICovICAgIHJlbW92ZUVudHJ5KHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IHhyKHQpLCBzID0gTnIoZSk7XG4gICAgICAgIHJldHVybiBuLmRlbGV0ZShzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgY3VycmVudCBjYWNoZSBzaXplLlxuICAgICAqXG4gICAgICogQ2FsbGVycyB0byBgYWRkRW50cnkoKWAgYW5kIGByZW1vdmVFbnRyeSgpYCAqbXVzdCogY2FsbCB0aGlzIGFmdGVyd2FyZHMgdG8gdXBkYXRlIHRoZVxuICAgICAqIGNhY2hlJ3MgbWV0YWRhdGEuXG4gICAgICovICAgIHVwZGF0ZU1ldGFkYXRhKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWV0YWRhdGEodCkubmV4dCgobiA9PiAobi5ieXRlU2l6ZSArPSBlLCB0aGlzLk9uKHQsIG4pKSkpO1xuICAgIH1cbiAgICBnZXRFbnRyeSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB4cih0KS5nZXQoTnIoZSkpLm5leHQoKHQgPT4gdGhpcy4kbihlLCB0KSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb29rcyB1cCBhbiBlbnRyeSBpbiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZG9jdW1lbnRLZXkgLSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBsb29rIHVwLlxuICAgICAqIEByZXR1cm5zIFRoZSBjYWNoZWQgZG9jdW1lbnQgZW50cnkgYW5kIGl0cyBzaXplLlxuICAgICAqLyAgICBGbih0LCBlKSB7XG4gICAgICAgIHJldHVybiB4cih0KS5nZXQoTnIoZSkpLm5leHQoKHQgPT4gKHtcbiAgICAgICAgICAgIGRvY3VtZW50OiB0aGlzLiRuKGUsIHQpLFxuICAgICAgICAgICAgc2l6ZTogaHIodClcbiAgICAgICAgfSkpKTtcbiAgICB9XG4gICAgZ2V0RW50cmllcyh0LCBlKSB7XG4gICAgICAgIGxldCBuID0gRm4oKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuQm4odCwgZSwgKCh0LCBlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzID0gdGhpcy4kbih0LCBlKTtcbiAgICAgICAgICAgIG4gPSBuLmluc2VydCh0LCBzKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IG4pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9va3MgdXAgc2V2ZXJhbCBlbnRyaWVzIGluIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkb2N1bWVudEtleXMgLSBUaGUgc2V0IG9mIGtleXMgZW50cmllcyB0byBsb29rIHVwLlxuICAgICAqIEByZXR1cm5zIEEgbWFwIG9mIGRvY3VtZW50cyBpbmRleGVkIGJ5IGtleSBhbmQgYSBtYXAgb2Ygc2l6ZXMgaW5kZXhlZCBieVxuICAgICAqICAgICBrZXkgKHplcm8gaWYgdGhlIGRvY3VtZW50IGRvZXMgbm90IGV4aXN0KS5cbiAgICAgKi8gICAgTG4odCwgZSkge1xuICAgICAgICBsZXQgbiA9IEZuKCksIHMgPSBuZXcgQ24oeHQuY29tcGFyYXRvcik7XG4gICAgICAgIHJldHVybiB0aGlzLkJuKHQsIGUsICgodCwgZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuJG4odCwgZSk7XG4gICAgICAgICAgICBuID0gbi5pbnNlcnQodCwgaSksIHMgPSBzLmluc2VydCh0LCBocihlKSk7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiAoe1xuICAgICAgICAgICAgZG9jdW1lbnRzOiBuLFxuICAgICAgICAgICAgcW46IHNcbiAgICAgICAgfSkpKTtcbiAgICB9XG4gICAgQm4odCwgZSwgbikge1xuICAgICAgICBpZiAoZS5pc0VtcHR5KCkpIHJldHVybiB1aS5yZXNvbHZlKCk7XG4gICAgICAgIGNvbnN0IHMgPSBJREJLZXlSYW5nZS5ib3VuZChlLmZpcnN0KCkucGF0aC50b0FycmF5KCksIGUubGFzdCgpLnBhdGgudG9BcnJheSgpKSwgaSA9IGUuZ2V0SXRlcmF0b3IoKTtcbiAgICAgICAgbGV0IHIgPSBpLmdldE5leHQoKTtcbiAgICAgICAgcmV0dXJuIHhyKHQpLld0KHtcbiAgICAgICAgICAgIHJhbmdlOiBzXG4gICAgICAgIH0sICgodCwgZSwgcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbyA9IHh0LmZyb21TZWdtZW50cyh0KTtcbiAgICAgICAgICAgIC8vIEdvIHRocm91Z2gga2V5cyBub3QgZm91bmQgaW4gY2FjaGUuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDtyICYmIHh0LmNvbXBhcmF0b3IociwgbykgPCAwOyApIG4ociwgbnVsbCksIHIgPSBpLmdldE5leHQoKTtcbiAgICAgICAgICAgIHIgJiYgci5pc0VxdWFsKG8pICYmIChcbiAgICAgICAgICAgIC8vIEtleSBmb3VuZCBpbiBjYWNoZS5cbiAgICAgICAgICAgIG4ociwgZSksIHIgPSBpLmhhc05leHQoKSA/IGkuZ2V0TmV4dCgpIDogbnVsbCksIFxuICAgICAgICAgICAgLy8gU2tpcCB0byB0aGUgbmV4dCBrZXkgKGlmIHRoZXJlIGlzIG9uZSkuXG4gICAgICAgICAgICByID8gcy5xdChyLnBhdGgudG9BcnJheSgpKSA6IHMuZG9uZSgpO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4ge1xuICAgICAgICAgICAgLy8gVGhlIHJlc3Qgb2YgdGhlIGtleXMgYXJlIG5vdCBpbiB0aGUgY2FjaGUuIE9uZSBjYXNlIHdoZXJlIGBpdGVyYXRlYFxuICAgICAgICAgICAgLy8gYWJvdmUgd29uJ3QgZ28gdGhyb3VnaCB0aGVtIGlzIHdoZW4gdGhlIGNhY2hlIGlzIGVtcHR5LlxuICAgICAgICAgICAgZm9yICg7cjsgKSBuKHIsIG51bGwpLCByID0gaS5oYXNOZXh0KCkgPyBpLmdldE5leHQoKSA6IG51bGw7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgZ2V0QWxsKHQsIGUsIG4pIHtcbiAgICAgICAgbGV0IHMgPSBGbigpO1xuICAgICAgICBjb25zdCBpID0gZS5sZW5ndGggKyAxLCByID0ge307XG4gICAgICAgIGlmIChuLmlzRXF1YWwoY3QubWluKCkpKSB7XG4gICAgICAgICAgICAvLyBEb2N1bWVudHMgYXJlIG9yZGVyZWQgYnkga2V5LCBzbyB3ZSBjYW4gdXNlIGEgcHJlZml4IHNjYW4gdG8gbmFycm93XG4gICAgICAgICAgICAvLyBkb3duIHRoZSBkb2N1bWVudHMgd2UgbmVlZCB0byBtYXRjaCB0aGUgcXVlcnkgYWdhaW5zdC5cbiAgICAgICAgICAgIGNvbnN0IHQgPSBlLnRvQXJyYXkoKTtcbiAgICAgICAgICAgIHIucmFuZ2UgPSBJREJLZXlSYW5nZS5sb3dlckJvdW5kKHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRXhlY3V0ZSBhbiBpbmRleC1mcmVlIHF1ZXJ5IGFuZCBmaWx0ZXIgYnkgcmVhZCB0aW1lLiBUaGlzIGlzIHNhZmVcbiAgICAgICAgICAgIC8vIHNpbmNlIGFsbCBkb2N1bWVudCBjaGFuZ2VzIHRvIHF1ZXJpZXMgdGhhdCBoYXZlIGFcbiAgICAgICAgICAgIC8vIGxhc3RMaW1ib0ZyZWVTbmFwc2hvdFZlcnNpb24gKGBzaW5jZVJlYWRUaW1lYCkgaGF2ZSBhIHJlYWQgdGltZSBzZXQuXG4gICAgICAgICAgICBjb25zdCB0ID0gZS50b0FycmF5KCksIHMgPSBWaShuKTtcbiAgICAgICAgICAgIHIucmFuZ2UgPSBJREJLZXlSYW5nZS5sb3dlckJvdW5kKFsgdCwgcyBdLCBcbiAgICAgICAgICAgIC8qIG9wZW49ICovICEwKSwgci5pbmRleCA9IFwiY29sbGVjdGlvblJlYWRUaW1lSW5kZXhcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geHIodCkuV3QociwgKCh0LCBuLCByKSA9PiB7XG4gICAgICAgICAgICAvLyBUaGUgcXVlcnkgaXMgYWN0dWFsbHkgcmV0dXJuaW5nIGFueSBwYXRoIHRoYXQgc3RhcnRzIHdpdGggdGhlIHF1ZXJ5XG4gICAgICAgICAgICAvLyBwYXRoIHByZWZpeCB3aGljaCBtYXkgaW5jbHVkZSBkb2N1bWVudHMgaW4gc3ViY29sbGVjdGlvbnMuIEZvclxuICAgICAgICAgICAgLy8gZXhhbXBsZSwgYSBxdWVyeSBvbiAncm9vbXMnIHdpbGwgcmV0dXJuIHJvb21zL2FiYy9tZXNzYWdlcy94eXggYnV0IHdlXG4gICAgICAgICAgICAvLyBzaG91bGRuJ3QgbWF0Y2ggaXQuIEZpeCB0aGlzIGJ5IGRpc2NhcmRpbmcgcm93cyB3aXRoIGRvY3VtZW50IGtleXNcbiAgICAgICAgICAgIC8vIG1vcmUgdGhhbiBvbmUgc2VnbWVudCBsb25nZXIgdGhhbiB0aGUgcXVlcnkgcGF0aC5cbiAgICAgICAgICAgIGlmICh0Lmxlbmd0aCAhPT0gaSkgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgbyA9IHRoaXMuJG4oeHQuZnJvbVNlZ21lbnRzKHQpLCBuKTtcbiAgICAgICAgICAgIGUuaXNQcmVmaXhPZihvLmtleS5wYXRoKSA/IHMgPSBzLmluc2VydChvLmtleSwgbykgOiByLmRvbmUoKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IHMpKTtcbiAgICB9XG4gICAgbmV3Q2hhbmdlQnVmZmVyKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEcih0aGlzLCAhIXQgJiYgdC50cmFja1JlbW92YWxzKTtcbiAgICB9XG4gICAgZ2V0U2l6ZSh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE1ldGFkYXRhKHQpLm5leHQoKHQgPT4gdC5ieXRlU2l6ZSkpO1xuICAgIH1cbiAgICBnZXRNZXRhZGF0YSh0KSB7XG4gICAgICAgIHJldHVybiBDcih0KS5nZXQoXCJyZW1vdGVEb2N1bWVudEdsb2JhbEtleVwiKS5uZXh0KCh0ID0+IChxKCEhdCksIHQpKSk7XG4gICAgfVxuICAgIE9uKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIENyKHQpLnB1dChcInJlbW90ZURvY3VtZW50R2xvYmFsS2V5XCIsIGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWNvZGVzIGBkYlJlbW90ZURvY2AgYW5kIHJldHVybnMgdGhlIGRvY3VtZW50IChvciBhbiBpbnZhbGlkIGRvY3VtZW50IGlmXG4gICAgICogdGhlIGRvY3VtZW50IGNvcnJlc3BvbmRzIHRvIHRoZSBmb3JtYXQgdXNlZCBmb3Igc2VudGluZWwgZGVsZXRlcykuXG4gICAgICovICAgICRuKHQsIGUpIHtcbiAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBiaSh0aGlzLk0sIGUpO1xuICAgICAgICAgICAgLy8gV2hldGhlciB0aGUgZG9jdW1lbnQgaXMgYSBzZW50aW5lbCByZW1vdmFsIGFuZCBzaG91bGQgb25seSBiZSB1c2VkIGluIHRoZVxuICAgICAgICAgICAgLy8gYGdldE5ld0RvY3VtZW50Q2hhbmdlcygpYFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodC5pc05vRG9jdW1lbnQoKSAmJiB0LnZlcnNpb24uaXNFcXVhbChjdC5taW4oKSkpKSByZXR1cm4gdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGUubmV3SW52YWxpZERvY3VtZW50KHQpO1xuICAgIH1cbn1cblxuLyoqIENyZWF0ZXMgYSBuZXcgSW5kZXhlZERiUmVtb3RlRG9jdW1lbnRDYWNoZS4gKi9cbi8qKlxuICogSGFuZGxlcyB0aGUgZGV0YWlscyBvZiBhZGRpbmcgYW5kIHVwZGF0aW5nIGRvY3VtZW50cyBpbiB0aGUgSW5kZXhlZERiUmVtb3RlRG9jdW1lbnRDYWNoZS5cbiAqXG4gKiBVbmxpa2UgdGhlIE1lbW9yeVJlbW90ZURvY3VtZW50Q2hhbmdlQnVmZmVyLCB0aGUgSW5kZXhlZERiIGltcGxlbWVudGF0aW9uIGNvbXB1dGVzIHRoZSBzaXplXG4gKiBkZWx0YSBmb3IgYWxsIHN1Ym1pdHRlZCBjaGFuZ2VzLiBUaGlzIGF2b2lkcyBoYXZpbmcgdG8gcmUtcmVhZCBhbGwgZG9jdW1lbnRzIGZyb20gSW5kZXhlZERiXG4gKiB3aGVuIHdlIGFwcGx5IHRoZSBjaGFuZ2VzLlxuICovXG5jbGFzcyBEciBleHRlbmRzIHZyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZG9jdW1lbnRDYWNoZSAtIFRoZSBJbmRleGVkRGJSZW1vdGVEb2N1bWVudENhY2hlIHRvIGFwcGx5IHRoZSBjaGFuZ2VzIHRvLlxuICAgICAqIEBwYXJhbSB0cmFja1JlbW92YWxzIC0gV2hldGhlciB0byBjcmVhdGUgc2VudGluZWwgZGVsZXRlcyB0aGF0IGNhbiBiZSB0cmFja2VkIGJ5XG4gICAgICogYGdldE5ld0RvY3VtZW50Q2hhbmdlcygpYC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMuVW4gPSB0LCB0aGlzLnRyYWNrUmVtb3ZhbHMgPSBlLCBcbiAgICAgICAgLy8gQSBtYXAgb2YgZG9jdW1lbnQgc2l6ZXMgcHJpb3IgdG8gYXBwbHlpbmcgdGhlIGNoYW5nZXMgaW4gdGhpcyBidWZmZXIuXG4gICAgICAgIHRoaXMuS24gPSBuZXcgRG4oKHQgPT4gdC50b1N0cmluZygpKSwgKCh0LCBlKSA9PiB0LmlzRXF1YWwoZSkpKTtcbiAgICB9XG4gICAgYXBwbHlDaGFuZ2VzKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IFtdO1xuICAgICAgICBsZXQgbiA9IDAsIHMgPSBuZXcga24oKCh0LCBlKSA9PiBydCh0LmNhbm9uaWNhbFN0cmluZygpLCBlLmNhbm9uaWNhbFN0cmluZygpKSkpO1xuICAgICAgICByZXR1cm4gdGhpcy5jaGFuZ2VzLmZvckVhY2goKChpLCByKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvID0gdGhpcy5Lbi5nZXQoaSk7XG4gICAgICAgICAgICBpZiAoci5pc1ZhbGlkRG9jdW1lbnQoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGEgPSBQaSh0aGlzLlVuLk0sIHIpO1xuICAgICAgICAgICAgICAgIHMgPSBzLmFkZChpLnBhdGgucG9wTGFzdCgpKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1ID0gaHIoYSk7XG4gICAgICAgICAgICAgICAgbiArPSB1IC0gbywgZS5wdXNoKHRoaXMuVW4uYWRkRW50cnkodCwgaSwgYSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChuIC09IG8sIHRoaXMudHJhY2tSZW1vdmFscykge1xuICAgICAgICAgICAgICAgIC8vIEluIG9yZGVyIHRvIHRyYWNrIHJlbW92YWxzLCB3ZSBzdG9yZSBhIFwic2VudGluZWwgZGVsZXRlXCIgaW4gdGhlXG4gICAgICAgICAgICAgICAgLy8gUmVtb3RlRG9jdW1lbnRDYWNoZS4gVGhpcyBlbnRyeSBpcyByZXByZXNlbnRlZCBieSBhIE5vRG9jdW1lbnRcbiAgICAgICAgICAgICAgICAvLyB3aXRoIGEgdmVyc2lvbiBvZiAwIGFuZCBpZ25vcmVkIGJ5IGBtYXliZURlY29kZURvY3VtZW50KClgIGJ1dFxuICAgICAgICAgICAgICAgIC8vIHByZXNlcnZlZCBpbiBgZ2V0TmV3RG9jdW1lbnRDaGFuZ2VzKClgLlxuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBQaSh0aGlzLlVuLk0sIHIuY29udmVydFRvTm9Eb2N1bWVudChjdC5taW4oKSkpO1xuICAgICAgICAgICAgICAgIGUucHVzaCh0aGlzLlVuLmFkZEVudHJ5KHQsIGksIG4pKTtcbiAgICAgICAgICAgIH0gZWxzZSBlLnB1c2godGhpcy5Vbi5yZW1vdmVFbnRyeSh0LCBpKSk7XG4gICAgICAgIH0pKSwgcy5mb3JFYWNoKChuID0+IHtcbiAgICAgICAgICAgIGUucHVzaCh0aGlzLlVuLmluZGV4TWFuYWdlci5hZGRUb0NvbGxlY3Rpb25QYXJlbnRJbmRleCh0LCBuKSk7XG4gICAgICAgIH0pKSwgZS5wdXNoKHRoaXMuVW4udXBkYXRlTWV0YWRhdGEodCwgbikpLCB1aS53YWl0Rm9yKGUpO1xuICAgIH1cbiAgICBnZXRGcm9tQ2FjaGUodCwgZSkge1xuICAgICAgICAvLyBSZWNvcmQgdGhlIHNpemUgb2YgZXZlcnl0aGluZyB3ZSBsb2FkIGZyb20gdGhlIGNhY2hlIHNvIHdlIGNhbiBjb21wdXRlIGEgZGVsdGEgbGF0ZXIuXG4gICAgICAgIHJldHVybiB0aGlzLlVuLkZuKHQsIGUpLm5leHQoKHQgPT4gKHRoaXMuS24uc2V0KGUsIHQuc2l6ZSksIHQuZG9jdW1lbnQpKSk7XG4gICAgfVxuICAgIGdldEFsbEZyb21DYWNoZSh0LCBlKSB7XG4gICAgICAgIC8vIFJlY29yZCB0aGUgc2l6ZSBvZiBldmVyeXRoaW5nIHdlIGxvYWQgZnJvbSB0aGUgY2FjaGUgc28gd2UgY2FuIGNvbXB1dGVcbiAgICAgICAgLy8gYSBkZWx0YSBsYXRlci5cbiAgICAgICAgcmV0dXJuIHRoaXMuVW4uTG4odCwgZSkubmV4dCgoKHtkb2N1bWVudHM6IHQsIHFuOiBlfSkgPT4gKFxuICAgICAgICAvLyBOb3RlOiBgZ2V0QWxsRnJvbUNhY2hlYCByZXR1cm5zIHR3byBtYXBzIGluc3RlYWQgb2YgYSBzaW5nbGUgbWFwIGZyb21cbiAgICAgICAgLy8ga2V5cyB0byBgRG9jdW1lbnRTaXplRW50cnlgcy4gVGhpcyBpcyB0byBhbGxvdyByZXR1cm5pbmcgdGhlXG4gICAgICAgIC8vIGBNdXRhYmxlRG9jdW1lbnRNYXBgIGRpcmVjdGx5LCB3aXRob3V0IGEgY29udmVyc2lvbi5cbiAgICAgICAgZS5mb3JFYWNoKCgodCwgZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5Lbi5zZXQodCwgZSk7XG4gICAgICAgIH0pKSwgdCkpKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIENyKHQpIHtcbiAgICByZXR1cm4gcGkodCwgXCJyZW1vdGVEb2N1bWVudEdsb2JhbFwiKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gZ2V0IGEgdHlwZWQgU2ltcGxlRGJTdG9yZSBmb3IgdGhlIHJlbW90ZURvY3VtZW50cyBvYmplY3Qgc3RvcmUuXG4gKi8gZnVuY3Rpb24geHIodCkge1xuICAgIHJldHVybiBwaSh0LCBcInJlbW90ZURvY3VtZW50c1wiKTtcbn1cblxuZnVuY3Rpb24gTnIodCkge1xuICAgIHJldHVybiB0LnBhdGgudG9BcnJheSgpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLy8gVE9ETyhpbmRleGluZyk6IFJlbW92ZSB0aGlzIGNvbnN0YW50XG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqIFBlcmZvcm1zIGRhdGFiYXNlIGNyZWF0aW9uIGFuZCBzY2hlbWEgdXBncmFkZXMuICovXG5jbGFzcyBrciB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLk0gPSB0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBkYXRhYmFzZSBjcmVhdGlvbiBhbmQgc2NoZW1hIHVwZ3JhZGVzLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IGluIHByb2R1Y3Rpb24sIHRoaXMgbWV0aG9kIGlzIG9ubHkgZXZlciB1c2VkIHRvIHVwZ3JhZGUgdGhlIHNjaGVtYVxuICAgICAqIHRvIFNDSEVNQV9WRVJTSU9OLiBEaWZmZXJlbnQgdmFsdWVzIG9mIHRvVmVyc2lvbiBhcmUgb25seSB1c2VkIGZvciB0ZXN0aW5nXG4gICAgICogYW5kIGxvY2FsIGZlYXR1cmUgZGV2ZWxvcG1lbnQuXG4gICAgICovICAgIGt0KHQsIGUsIG4sIHMpIHtcbiAgICAgICAgY29uc3QgaSA9IG5ldyBjaShcImNyZWF0ZU9yVXBncmFkZVwiLCBlKTtcbiAgICAgICAgbiA8IDEgJiYgcyA+PSAxICYmIChmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICB0LmNyZWF0ZU9iamVjdFN0b3JlKFwib3duZXJcIik7XG4gICAgICAgIH0odCksIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHQuY3JlYXRlT2JqZWN0U3RvcmUoXCJtdXRhdGlvblF1ZXVlc1wiLCB7XG4gICAgICAgICAgICAgICAga2V5UGF0aDogXCJ1c2VySWRcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0LmNyZWF0ZU9iamVjdFN0b3JlKFwibXV0YXRpb25zXCIsIHtcbiAgICAgICAgICAgICAgICBrZXlQYXRoOiBcImJhdGNoSWRcIixcbiAgICAgICAgICAgICAgICBhdXRvSW5jcmVtZW50OiAhMFxuICAgICAgICAgICAgfSkuY3JlYXRlSW5kZXgoXCJ1c2VyTXV0YXRpb25zSW5kZXhcIiwgcXMsIHtcbiAgICAgICAgICAgICAgICB1bmlxdWU6ICEwXG4gICAgICAgICAgICB9KSwgdC5jcmVhdGVPYmplY3RTdG9yZShcImRvY3VtZW50TXV0YXRpb25zXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICogVXBncmFkZSBmdW5jdGlvbiB0byBtaWdyYXRlIHRoZSAnbXV0YXRpb25zJyBzdG9yZSBmcm9tIFYxIHRvIFYzLiBMb2Fkc1xuICogYW5kIHJld3JpdGVzIGFsbCBkYXRhLlxuICovICh0KSwgTXIodCksIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHQuY3JlYXRlT2JqZWN0U3RvcmUoXCJyZW1vdGVEb2N1bWVudHNcIik7XG4gICAgICAgIH0odCkpO1xuICAgICAgICAvLyBNaWdyYXRpb24gMiB0byBwb3B1bGF0ZSB0aGUgdGFyZ2V0R2xvYmFsIG9iamVjdCBubyBsb25nZXIgbmVlZGVkIHNpbmNlXG4gICAgICAgIC8vIG1pZ3JhdGlvbiAzIHVuY29uZGl0aW9uYWxseSBjbGVhcnMgaXQuXG4gICAgICAgICAgICAgICAgbGV0IHIgPSB1aS5yZXNvbHZlKCk7XG4gICAgICAgIHJldHVybiBuIDwgMyAmJiBzID49IDMgJiYgKFxuICAgICAgICAvLyBCcmFuZCBuZXcgY2xpZW50cyBkb24ndCBuZWVkIHRvIGRyb3AgYW5kIHJlY3JlYXRlLS1vbmx5IGNsaWVudHMgdGhhdFxuICAgICAgICAvLyBwb3RlbnRpYWxseSBoYXZlIGNvcnJ1cHQgZGF0YS5cbiAgICAgICAgMCAhPT0gbiAmJiAoIWZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHQuZGVsZXRlT2JqZWN0U3RvcmUoXCJ0YXJnZXREb2N1bWVudHNcIiksIHQuZGVsZXRlT2JqZWN0U3RvcmUoXCJ0YXJnZXRzXCIpLCB0LmRlbGV0ZU9iamVjdFN0b3JlKFwidGFyZ2V0R2xvYmFsXCIpO1xuICAgICAgICB9KHQpLCBNcih0KSksIHIgPSByLm5leHQoKCgpID0+IFxuICAgICAgICAvKipcbiAqIENyZWF0ZXMgdGhlIHRhcmdldCBnbG9iYWwgc2luZ2xldG9uIHJvdy5cbiAqXG4gKiBAcGFyYW0gdHhuIC0gVGhlIHZlcnNpb24gdXBncmFkZSB0cmFuc2FjdGlvbiBmb3IgaW5kZXhlZGRiXG4gKi9cbiAgICAgICAgZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IHQuc3RvcmUoXCJ0YXJnZXRHbG9iYWxcIiksIG4gPSB7XG4gICAgICAgICAgICAgICAgaGlnaGVzdFRhcmdldElkOiAwLFxuICAgICAgICAgICAgICAgIGhpZ2hlc3RMaXN0ZW5TZXF1ZW5jZU51bWJlcjogMCxcbiAgICAgICAgICAgICAgICBsYXN0UmVtb3RlU25hcHNob3RWZXJzaW9uOiBjdC5taW4oKS50b1RpbWVzdGFtcCgpLFxuICAgICAgICAgICAgICAgIHRhcmdldENvdW50OiAwXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGUucHV0KFwidGFyZ2V0R2xvYmFsS2V5XCIsIG4pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICogQ3JlYXRlcyBpbmRpY2VzIG9uIHRoZSBSZW1vdGVEb2N1bWVudHMgc3RvcmUgdXNlZCBmb3IgYm90aCBtdWx0aS10YWJcbiAqIGFuZCBJbmRleC1GcmVlIHF1ZXJpZXMuXG4gKi8gKGkpKSkpLCBuIDwgNCAmJiBzID49IDQgJiYgKDAgIT09IG4gJiYgKFxuICAgICAgICAvLyBTY2hlbWEgdmVyc2lvbiAzIHVzZXMgYXV0by1nZW5lcmF0ZWQga2V5cyB0byBnZW5lcmF0ZSBnbG9iYWxseSB1bmlxdWVcbiAgICAgICAgLy8gbXV0YXRpb24gYmF0Y2ggSURzICh0aGlzIHdhcyBwcmV2aW91c2x5IGVuc3VyZWQgaW50ZXJuYWxseSBieSB0aGVcbiAgICAgICAgLy8gY2xpZW50KS4gVG8gbWlncmF0ZSB0byB0aGUgbmV3IHNjaGVtYSwgd2UgaGF2ZSB0byByZWFkIGFsbCBtdXRhdGlvbnNcbiAgICAgICAgLy8gYW5kIHdyaXRlIHRoZW0gYmFjayBvdXQuIFdlIHByZXNlcnZlIHRoZSBleGlzdGluZyBiYXRjaCBJRHMgdG8gZ3VhcmFudGVlXG4gICAgICAgIC8vIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIgb2JqZWN0IHN0b3Jlcy4gQW55IGZ1cnRoZXIgbXV0YXRpb24gYmF0Y2ggSURzIHdpbGxcbiAgICAgICAgLy8gYmUgYXV0by1nZW5lcmF0ZWQuXG4gICAgICAgIHIgPSByLm5leHQoKCgpID0+IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIHJldHVybiBlLnN0b3JlKFwibXV0YXRpb25zXCIpLlV0KCkubmV4dCgobiA9PiB7XG4gICAgICAgICAgICAgICAgdC5kZWxldGVPYmplY3RTdG9yZShcIm11dGF0aW9uc1wiKTtcbiAgICAgICAgICAgICAgICB0LmNyZWF0ZU9iamVjdFN0b3JlKFwibXV0YXRpb25zXCIsIHtcbiAgICAgICAgICAgICAgICAgICAga2V5UGF0aDogXCJiYXRjaElkXCIsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9JbmNyZW1lbnQ6ICEwXG4gICAgICAgICAgICAgICAgfSkuY3JlYXRlSW5kZXgoXCJ1c2VyTXV0YXRpb25zSW5kZXhcIiwgcXMsIHtcbiAgICAgICAgICAgICAgICAgICAgdW5pcXVlOiAhMFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBlLnN0b3JlKFwibXV0YXRpb25zXCIpLCBpID0gbi5tYXAoKHQgPT4gcy5wdXQodCkpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdWkud2FpdEZvcihpKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSh0LCBpKSkpKSwgciA9IHIubmV4dCgoKCkgPT4ge1xuICAgICAgICAgICAgIWZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICB0LmNyZWF0ZU9iamVjdFN0b3JlKFwiY2xpZW50TWV0YWRhdGFcIiwge1xuICAgICAgICAgICAgICAgICAgICBrZXlQYXRoOiBcImNsaWVudElkXCJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0odCk7XG4gICAgICAgIH0pKSksIG4gPCA1ICYmIHMgPj0gNSAmJiAociA9IHIubmV4dCgoKCkgPT4gdGhpcy5HbihpKSkpKSwgbiA8IDYgJiYgcyA+PSA2ICYmIChyID0gci5uZXh0KCgoKSA9PiAoZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgdC5jcmVhdGVPYmplY3RTdG9yZShcInJlbW90ZURvY3VtZW50R2xvYmFsXCIpO1xuICAgICAgICB9KHQpLCB0aGlzLlFuKGkpKSkpKSwgbiA8IDcgJiYgcyA+PSA3ICYmIChyID0gci5uZXh0KCgoKSA9PiB0aGlzLmpuKGkpKSkpLCBuIDwgOCAmJiBzID49IDggJiYgKHIgPSByLm5leHQoKCgpID0+IHRoaXMuV24odCwgaSkpKSksIFxuICAgICAgICBuIDwgOSAmJiBzID49IDkgJiYgKHIgPSByLm5leHQoKCgpID0+IHtcbiAgICAgICAgICAgIC8vIE11bHRpLVRhYiB1c2VkIHRvIG1hbmFnZSBpdHMgb3duIGNoYW5nZWxvZywgYnV0IHRoaXMgaGFzIGJlZW4gbW92ZWRcbiAgICAgICAgICAgIC8vIHRvIHRoZSBEYlJlbW90ZURvY3VtZW50IG9iamVjdCBzdG9yZSBpdHNlbGYuIFNpbmNlIHRoZSBwcmV2aW91cyBjaGFuZ2VcbiAgICAgICAgICAgIC8vIGxvZyBvbmx5IGNvbnRhaW5lZCB0cmFuc2llbnQgZGF0YSwgd2UgY2FuIGRyb3AgaXRzIG9iamVjdCBzdG9yZS5cbiAgICAgICAgICAgICFmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgdC5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKFwicmVtb3RlRG9jdW1lbnRDaGFuZ2VzXCIpICYmIHQuZGVsZXRlT2JqZWN0U3RvcmUoXCJyZW1vdGVEb2N1bWVudENoYW5nZXNcIik7XG4gICAgICAgICAgICB9KHQpLCBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IHQub2JqZWN0U3RvcmUoXCJyZW1vdGVEb2N1bWVudHNcIik7XG4gICAgICAgICAgICAgICAgZS5jcmVhdGVJbmRleChcInJlYWRUaW1lSW5kZXhcIiwgXCJyZWFkVGltZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHVuaXF1ZTogITFcbiAgICAgICAgICAgICAgICB9KSwgZS5jcmVhdGVJbmRleChcImNvbGxlY3Rpb25SZWFkVGltZUluZGV4XCIsIFFzLCB7XG4gICAgICAgICAgICAgICAgICAgIHVuaXF1ZTogITFcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0oZSk7XG4gICAgICAgIH0pKSksIG4gPCAxMCAmJiBzID49IDEwICYmIChyID0gci5uZXh0KCgoKSA9PiB0aGlzLnpuKGkpKSkpLCBuIDwgMTEgJiYgcyA+PSAxMSAmJiAociA9IHIubmV4dCgoKCkgPT4ge1xuICAgICAgICAgICAgIWZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICB0LmNyZWF0ZU9iamVjdFN0b3JlKFwiYnVuZGxlc1wiLCB7XG4gICAgICAgICAgICAgICAgICAgIGtleVBhdGg6IFwiYnVuZGxlSWRcIlxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSh0KSwgZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIHQuY3JlYXRlT2JqZWN0U3RvcmUoXCJuYW1lZFF1ZXJpZXNcIiwge1xuICAgICAgICAgICAgICAgICAgICBrZXlQYXRoOiBcIm5hbWVcIlxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSh0KTtcbiAgICAgICAgfSkpKSwgbiA8IDEyICYmIHMgPj0gMTIgJiYgKHIgPSByLm5leHQoKCgpID0+IHtcbiAgICAgICAgICAgICFmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IHQuY3JlYXRlT2JqZWN0U3RvcmUoXCJkb2N1bWVudE92ZXJsYXlzXCIsIHtcbiAgICAgICAgICAgICAgICAgICAga2V5UGF0aDogdGlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBlLmNyZWF0ZUluZGV4KFwiY29sbGVjdGlvblBhdGhPdmVybGF5SW5kZXhcIiwgZWksIHtcbiAgICAgICAgICAgICAgICAgICAgdW5pcXVlOiAhMVxuICAgICAgICAgICAgICAgIH0pLCBlLmNyZWF0ZUluZGV4KFwiY29sbGVjdGlvbkdyb3VwT3ZlcmxheUluZGV4XCIsIG5pLCB7XG4gICAgICAgICAgICAgICAgICAgIHVuaXF1ZTogITFcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovICh0KTtcbiAgICAgICAgfSkpKSwgbiA8IDEzICYmIHMgPj0gMTMgJiYgKHIgPSByLm5leHQoKCgpID0+IHtcbiAgICAgICAgICAgICFmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgdC5jcmVhdGVPYmplY3RTdG9yZShcImluZGV4Q29uZmlndXJhdGlvblwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGtleVBhdGg6IFwiaW5kZXhJZFwiLFxuICAgICAgICAgICAgICAgICAgICBhdXRvSW5jcmVtZW50OiAhMFxuICAgICAgICAgICAgICAgIH0pLmNyZWF0ZUluZGV4KFwiY29sbGVjdGlvbkdyb3VwSW5kZXhcIiwgXCJjb2xsZWN0aW9uR3JvdXBcIiwge1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWU6ICExXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdC5jcmVhdGVPYmplY3RTdG9yZShcImluZGV4U3RhdGVcIiwge1xuICAgICAgICAgICAgICAgICAgICBrZXlQYXRoOiBKc1xuICAgICAgICAgICAgICAgIH0pLmNyZWF0ZUluZGV4KFwic2VxdWVuY2VOdW1iZXJJbmRleFwiLCBZcywge1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWU6ICExXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdC5jcmVhdGVPYmplY3RTdG9yZShcImluZGV4RW50cmllc1wiLCB7XG4gICAgICAgICAgICAgICAgICAgIGtleVBhdGg6IFhzXG4gICAgICAgICAgICAgICAgfSkuY3JlYXRlSW5kZXgoXCJkb2N1bWVudEtleUluZGV4XCIsIFpzLCB7XG4gICAgICAgICAgICAgICAgICAgIHVuaXF1ZTogITFcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0odCk7XG4gICAgICAgIH0pKSksIHI7XG4gICAgfVxuICAgIFFuKHQpIHtcbiAgICAgICAgbGV0IGUgPSAwO1xuICAgICAgICByZXR1cm4gdC5zdG9yZShcInJlbW90ZURvY3VtZW50c1wiKS5XdCgoKHQsIG4pID0+IHtcbiAgICAgICAgICAgIGUgKz0gaHIobik7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuID0ge1xuICAgICAgICAgICAgICAgIGJ5dGVTaXplOiBlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHQuc3RvcmUoXCJyZW1vdGVEb2N1bWVudEdsb2JhbFwiKS5wdXQoXCJyZW1vdGVEb2N1bWVudEdsb2JhbEtleVwiLCBuKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBHbih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0LnN0b3JlKFwibXV0YXRpb25RdWV1ZXNcIiksIG4gPSB0LnN0b3JlKFwibXV0YXRpb25zXCIpO1xuICAgICAgICByZXR1cm4gZS5VdCgpLm5leHQoKGUgPT4gdWkuZm9yRWFjaChlLCAoZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzID0gSURCS2V5UmFuZ2UuYm91bmQoWyBlLnVzZXJJZCwgLTEgXSwgWyBlLnVzZXJJZCwgZS5sYXN0QWNrbm93bGVkZ2VkQmF0Y2hJZCBdKTtcbiAgICAgICAgICAgIHJldHVybiBuLlV0KFwidXNlck11dGF0aW9uc0luZGV4XCIsIHMpLm5leHQoKG4gPT4gdWkuZm9yRWFjaChuLCAobiA9PiB7XG4gICAgICAgICAgICAgICAgcShuLnVzZXJJZCA9PT0gZS51c2VySWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBDaSh0aGlzLk0sIG4pO1xuICAgICAgICAgICAgICAgIHJldHVybiBjcih0LCBlLnVzZXJJZCwgcykubmV4dCgoKCkgPT4ge30pKTtcbiAgICAgICAgICAgIH0pKSkpO1xuICAgICAgICB9KSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5zdXJlcyB0aGF0IGV2ZXJ5IGRvY3VtZW50IGluIHRoZSByZW1vdGUgZG9jdW1lbnQgY2FjaGUgaGFzIGEgY29ycmVzcG9uZGluZyBzZW50aW5lbCByb3dcbiAgICAgKiB3aXRoIGEgc2VxdWVuY2UgbnVtYmVyLiBNaXNzaW5nIHJvd3MgYXJlIGdpdmVuIHRoZSBtb3N0IHJlY2VudGx5IHVzZWQgc2VxdWVuY2UgbnVtYmVyLlxuICAgICAqLyAgICBqbih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0LnN0b3JlKFwidGFyZ2V0RG9jdW1lbnRzXCIpLCBuID0gdC5zdG9yZShcInJlbW90ZURvY3VtZW50c1wiKTtcbiAgICAgICAgcmV0dXJuIHQuc3RvcmUoXCJ0YXJnZXRHbG9iYWxcIikuZ2V0KFwidGFyZ2V0R2xvYmFsS2V5XCIpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgY29uc3QgcyA9IFtdO1xuICAgICAgICAgICAgcmV0dXJuIG4uV3QoKChuLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgciA9IG5ldyBfdChuKSwgbyA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgMCwgJHModCkgXTtcbiAgICAgICAgICAgICAgICB9KHIpO1xuICAgICAgICAgICAgICAgIHMucHVzaChlLmdldChvKS5uZXh0KChuID0+IG4gPyB1aS5yZXNvbHZlKCkgOiAobiA9PiBlLnB1dCh7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldElkOiAwLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiAkcyhuKSxcbiAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VOdW1iZXI6IHQuaGlnaGVzdExpc3RlblNlcXVlbmNlTnVtYmVyXG4gICAgICAgICAgICAgICAgfSkpKHIpKSkpO1xuICAgICAgICAgICAgfSkpLm5leHQoKCgpID0+IHVpLndhaXRGb3IocykpKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBXbih0LCBlKSB7XG4gICAgICAgIC8vIENyZWF0ZSB0aGUgaW5kZXguXG4gICAgICAgIHQuY3JlYXRlT2JqZWN0U3RvcmUoXCJjb2xsZWN0aW9uUGFyZW50c1wiLCB7XG4gICAgICAgICAgICBrZXlQYXRoOiBIc1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgbiA9IGUuc3RvcmUoXCJjb2xsZWN0aW9uUGFyZW50c1wiKSwgcyA9IG5ldyB0ciwgaSA9IHQgPT4ge1xuICAgICAgICAgICAgaWYgKHMuYWRkKHQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IHQubGFzdFNlZ21lbnQoKSwgcyA9IHQucG9wTGFzdCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuLnB1dCh7XG4gICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25JZDogZSxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiAkcyhzKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBIZWxwZXIgdG8gYWRkIGFuIGluZGV4IGVudHJ5IGlmZiB3ZSBoYXZlbid0IGFscmVhZHkgd3JpdHRlbiBpdC5cbiAgICAgICAgICAgICAgICAvLyBJbmRleCBleGlzdGluZyByZW1vdGUgZG9jdW1lbnRzLlxuICAgICAgICByZXR1cm4gZS5zdG9yZShcInJlbW90ZURvY3VtZW50c1wiKS5XdCh7XG4gICAgICAgICAgICBqdDogITBcbiAgICAgICAgfSwgKCh0LCBlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuID0gbmV3IF90KHQpO1xuICAgICAgICAgICAgcmV0dXJuIGkobi5wb3BMYXN0KCkpO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4gZS5zdG9yZShcImRvY3VtZW50TXV0YXRpb25zXCIpLld0KHtcbiAgICAgICAgICAgIGp0OiAhMFxuICAgICAgICB9LCAoKFt0LCBlLCBuXSwgcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgciA9IExzKGUpO1xuICAgICAgICAgICAgcmV0dXJuIGkoci5wb3BMYXN0KCkpO1xuICAgICAgICB9KSkpKTtcbiAgICB9XG4gICAgem4odCkge1xuICAgICAgICBjb25zdCBlID0gdC5zdG9yZShcInRhcmdldHNcIik7XG4gICAgICAgIHJldHVybiBlLld0KCgodCwgbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgcyA9IHhpKG4pLCBpID0gTmkodGhpcy5NLCBzKTtcbiAgICAgICAgICAgIHJldHVybiBlLnB1dChpKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gTXIodCkge1xuICAgIHQuY3JlYXRlT2JqZWN0U3RvcmUoXCJ0YXJnZXREb2N1bWVudHNcIiwge1xuICAgICAgICBrZXlQYXRoOiBXc1xuICAgIH0pLmNyZWF0ZUluZGV4KFwiZG9jdW1lbnRUYXJnZXRzSW5kZXhcIiwgenMsIHtcbiAgICAgICAgdW5pcXVlOiAhMFxuICAgIH0pO1xuICAgIC8vIE5PVEU6IFRoaXMgaXMgdW5pcXVlIG9ubHkgYmVjYXVzZSB0aGUgVGFyZ2V0SWQgaXMgdGhlIHN1ZmZpeC5cbiAgICB0LmNyZWF0ZU9iamVjdFN0b3JlKFwidGFyZ2V0c1wiLCB7XG4gICAgICAgIGtleVBhdGg6IFwidGFyZ2V0SWRcIlxuICAgIH0pLmNyZWF0ZUluZGV4KFwicXVlcnlUYXJnZXRzSW5kZXhcIiwganMsIHtcbiAgICAgICAgdW5pcXVlOiAhMFxuICAgIH0pLCB0LmNyZWF0ZU9iamVjdFN0b3JlKFwidGFyZ2V0R2xvYmFsXCIpO1xufVxuXG5jb25zdCBPciA9IFwiRmFpbGVkIHRvIG9idGFpbiBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSBwZXJzaXN0ZW5jZSBsYXllci4gVG8gYWxsb3cgc2hhcmVkIGFjY2VzcywgbXVsdGktdGFiIHN5bmNocm9uaXphdGlvbiBoYXMgdG8gYmUgZW5hYmxlZCBpbiBhbGwgdGFicy4gSWYgeW91IGFyZSB1c2luZyBgZXhwZXJpbWVudGFsRm9yY2VPd25pbmdUYWI6dHJ1ZWAsIG1ha2Ugc3VyZSB0aGF0IG9ubHkgb25lIHRhYiBoYXMgcGVyc2lzdGVuY2UgZW5hYmxlZCBhdCBhbnkgZ2l2ZW4gdGltZS5cIjtcblxuLyoqXG4gKiBPbGRlc3QgYWNjZXB0YWJsZSBhZ2UgaW4gbWlsbGlzZWNvbmRzIGZvciBjbGllbnQgbWV0YWRhdGEgYmVmb3JlIHRoZSBjbGllbnRcbiAqIGlzIGNvbnNpZGVyZWQgaW5hY3RpdmUgYW5kIGl0cyBhc3NvY2lhdGVkIGRhdGEgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuXG4gKi9cbi8qKlxuICogQW4gSW5kZXhlZERCLWJhY2tlZCBpbnN0YW5jZSBvZiBQZXJzaXN0ZW5jZS4gRGF0YSBpcyBzdG9yZWQgcGVyc2lzdGVudGx5XG4gKiBhY3Jvc3Mgc2Vzc2lvbnMuXG4gKlxuICogT24gV2ViIG9ubHksIHRoZSBGaXJlc3RvcmUgU0RLcyBzdXBwb3J0IHNoYXJlZCBhY2Nlc3MgdG8gaXRzIHBlcnNpc3RlbmNlXG4gKiBsYXllci4gVGhpcyBhbGxvd3MgbXVsdGlwbGUgYnJvd3NlciB0YWJzIHRvIHJlYWQgYW5kIHdyaXRlIHRvIEluZGV4ZWREYiBhbmRcbiAqIHRvIHN5bmNocm9uaXplIHN0YXRlIGV2ZW4gd2l0aG91dCBuZXR3b3JrIGNvbm5lY3Rpdml0eS4gU2hhcmVkIGFjY2VzcyBpc1xuICogY3VycmVudGx5IG9wdGlvbmFsIGFuZCBub3QgZW5hYmxlZCB1bmxlc3MgYWxsIGNsaWVudHMgaW52b2tlXG4gKiBgZW5hYmxlUGVyc2lzdGVuY2UoKWAgd2l0aCBge3N5bmNocm9uaXplVGFiczp0cnVlfWAuXG4gKlxuICogSW4gbXVsdGktdGFiIG1vZGUsIGlmIG11bHRpcGxlIGNsaWVudHMgYXJlIGFjdGl2ZSBhdCB0aGUgc2FtZSB0aW1lLCB0aGUgU0RLXG4gKiB3aWxsIGRlc2lnbmF0ZSBvbmUgY2xpZW50IGFzIHRoZSDigJxwcmltYXJ5IGNsaWVudOKAnS4gQW4gZWZmb3J0IGlzIG1hZGUgdG8gcGlja1xuICogYSB2aXNpYmxlLCBuZXR3b3JrLWNvbm5lY3RlZCBhbmQgYWN0aXZlIGNsaWVudCwgYW5kIHRoaXMgY2xpZW50IGlzXG4gKiByZXNwb25zaWJsZSBmb3IgbGV0dGluZyBvdGhlciBjbGllbnRzIGtub3cgYWJvdXQgaXRzIHByZXNlbmNlLiBUaGUgcHJpbWFyeVxuICogY2xpZW50IHdyaXRlcyBhIHVuaXF1ZSBjbGllbnQtZ2VuZXJhdGVkIGlkZW50aWZpZXIgKHRoZSBjbGllbnQgSUQpIHRvXG4gKiBJbmRleGVkRGLigJlzIOKAnG93bmVy4oCdIHN0b3JlIGV2ZXJ5IDQgc2Vjb25kcy4gSWYgdGhlIHByaW1hcnkgY2xpZW50IGZhaWxzIHRvXG4gKiB1cGRhdGUgdGhpcyBlbnRyeSwgYW5vdGhlciBjbGllbnQgY2FuIGFjcXVpcmUgdGhlIGxlYXNlIGFuZCB0YWtlIG92ZXIgYXNcbiAqIHByaW1hcnkuXG4gKlxuICogU29tZSBwZXJzaXN0ZW5jZSBvcGVyYXRpb25zIGluIHRoZSBTREsgYXJlIGRlc2lnbmF0ZWQgYXMgcHJpbWFyeS1jbGllbnQgb25seVxuICogb3BlcmF0aW9ucy4gVGhpcyBpbmNsdWRlcyB0aGUgYWNrbm93bGVkZ21lbnQgb2YgbXV0YXRpb25zIGFuZCBhbGwgdXBkYXRlcyBvZlxuICogcmVtb3RlIGRvY3VtZW50cy4gVGhlIGVmZmVjdHMgb2YgdGhlc2Ugb3BlcmF0aW9ucyBhcmUgd3JpdHRlbiB0byBwZXJzaXN0ZW5jZVxuICogYW5kIHRoZW4gYnJvYWRjYXN0IHRvIG90aGVyIHRhYnMgdmlhIExvY2FsU3RvcmFnZSAoc2VlXG4gKiBgV2ViU3RvcmFnZVNoYXJlZENsaWVudFN0YXRlYCksIHdoaWNoIHRoZW4gcmVmcmVzaCB0aGVpciBzdGF0ZSBmcm9tXG4gKiBwZXJzaXN0ZW5jZS5cbiAqXG4gKiBTaW1pbGFybHksIHRoZSBwcmltYXJ5IGNsaWVudCBsaXN0ZW5zIHRvIG5vdGlmaWNhdGlvbnMgc2VudCBieSBzZWNvbmRhcnlcbiAqIGNsaWVudHMgdG8gZGlzY292ZXIgcGVyc2lzdGVuY2UgY2hhbmdlcyB3cml0dGVuIGJ5IHNlY29uZGFyeSBjbGllbnRzLCBzdWNoIGFzXG4gKiB0aGUgYWRkaXRpb24gb2YgbmV3IG11dGF0aW9ucyBhbmQgcXVlcnkgdGFyZ2V0cy5cbiAqXG4gKiBJZiBtdWx0aS10YWIgaXMgbm90IGVuYWJsZWQgYW5kIGFub3RoZXIgdGFiIGFscmVhZHkgb2J0YWluZWQgdGhlIHByaW1hcnlcbiAqIGxlYXNlLCBJbmRleGVkRGJQZXJzaXN0ZW5jZSBlbnRlcnMgYSBmYWlsZWQgc3RhdGUgYW5kIGFsbCBzdWJzZXF1ZW50XG4gKiBvcGVyYXRpb25zIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLlxuICpcbiAqIEFkZGl0aW9uYWxseSwgdGhlcmUgaXMgYW4gb3B0aW1pemF0aW9uIHNvIHRoYXQgd2hlbiBhIHRhYiBpcyBjbG9zZWQsIHRoZVxuICogcHJpbWFyeSBsZWFzZSBpcyByZWxlYXNlZCBpbW1lZGlhdGVseSAodGhpcyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudCB0byBtYWtlXG4gKiBzdXJlIHRoYXQgYSByZWZyZXNoZWQgdGFiIGlzIGFibGUgdG8gaW1tZWRpYXRlbHkgcmUtYWNxdWlyZSB0aGUgcHJpbWFyeVxuICogbGVhc2UpLiBVbmZvcnR1bmF0ZWx5LCBJbmRleGVkREIgY2Fubm90IGJlIHJlbGlhYmx5IHVzZWQgaW4gd2luZG93LnVubG9hZFxuICogc2luY2UgaXQgaXMgYW4gYXN5bmNocm9ub3VzIEFQSS4gU28gaW4gYWRkaXRpb24gdG8gYXR0ZW1wdGluZyB0byBnaXZlIHVwIHRoZVxuICogbGVhc2UsIHRoZSBsZWFzZWhvbGRlciB3cml0ZXMgaXRzIGNsaWVudCBJRCB0byBhIFwiem9tYmllZENsaWVudFwiIGVudHJ5IGluXG4gKiBMb2NhbFN0b3JhZ2Ugd2hpY2ggYWN0cyBhcyBhbiBpbmRpY2F0b3IgdGhhdCBhbm90aGVyIHRhYiBzaG91bGQgZ28gYWhlYWQgYW5kXG4gKiB0YWtlIHRoZSBwcmltYXJ5IGxlYXNlIGltbWVkaWF0ZWx5IHJlZ2FyZGxlc3Mgb2YgdGhlIGN1cnJlbnQgbGVhc2UgdGltZXN0YW1wLlxuICpcbiAqIFRPRE8oYi8xMTQyMjYyMzQpOiBSZW1vdmUgYHN5bmNocm9uaXplVGFic2Agc2VjdGlvbiB3aGVuIG11bHRpLXRhYiBpcyBub1xuICogbG9uZ2VyIG9wdGlvbmFsLlxuICovXG5jbGFzcyAkciB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBzeW5jaHJvbml6ZSB0aGUgaW4tbWVtb3J5IHN0YXRlIG9mIG11bHRpcGxlIHRhYnMgYW5kIHNoYXJlXG4gICAgICogYWNjZXNzIHRvIGxvY2FsIHBlcnNpc3RlbmNlLlxuICAgICAqL1xuICAgIHQsIGUsIG4sIHMsIGksIHIsIG8sIGEsIHUsIFxuICAgIC8qKlxuICAgICAqIElmIHNldCB0byB0cnVlLCBmb3JjZWZ1bGx5IG9idGFpbnMgZGF0YWJhc2UgYWNjZXNzLiBFeGlzdGluZyB0YWJzIHdpbGxcbiAgICAgKiBubyBsb25nZXIgYmUgYWJsZSB0byBhY2Nlc3MgSW5kZXhlZERCLlxuICAgICAqL1xuICAgIGMsIGggPSAxMikge1xuICAgICAgICBpZiAodGhpcy5hbGxvd1RhYlN5bmNocm9uaXphdGlvbiA9IHQsIHRoaXMucGVyc2lzdGVuY2VLZXkgPSBlLCB0aGlzLmNsaWVudElkID0gbiwgXG4gICAgICAgIHRoaXMuSG4gPSBpLCB0aGlzLndpbmRvdyA9IHIsIHRoaXMuZG9jdW1lbnQgPSBvLCB0aGlzLkpuID0gdSwgdGhpcy5ZbiA9IGMsIHRoaXMuWG4gPSBoLCBcbiAgICAgICAgdGhpcy5abiA9IG51bGwsIHRoaXMudHMgPSAhMSwgdGhpcy5pc1ByaW1hcnkgPSAhMSwgdGhpcy5uZXR3b3JrRW5hYmxlZCA9ICEwLCBcbiAgICAgICAgLyoqIE91ciB3aW5kb3cudW5sb2FkIGhhbmRsZXIsIGlmIHJlZ2lzdGVyZWQuICovXG4gICAgICAgIHRoaXMuZXMgPSBudWxsLCB0aGlzLmluRm9yZWdyb3VuZCA9ICExLCBcbiAgICAgICAgLyoqIE91ciAndmlzaWJpbGl0eWNoYW5nZScgbGlzdGVuZXIgaWYgcmVnaXN0ZXJlZC4gKi9cbiAgICAgICAgdGhpcy5ucyA9IG51bGwsIFxuICAgICAgICAvKiogVGhlIGNsaWVudCBtZXRhZGF0YSByZWZyZXNoIHRhc2suICovXG4gICAgICAgIHRoaXMuc3MgPSBudWxsLCBcbiAgICAgICAgLyoqIFRoZSBsYXN0IHRpbWUgd2UgZ2FyYmFnZSBjb2xsZWN0ZWQgdGhlIGNsaWVudCBtZXRhZGF0YSBvYmplY3Qgc3RvcmUuICovXG4gICAgICAgIHRoaXMucnMgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksIFxuICAgICAgICAvKiogQSBsaXN0ZW5lciB0byBub3RpZnkgb24gcHJpbWFyeSBzdGF0ZSBjaGFuZ2VzLiAqL1xuICAgICAgICB0aGlzLm9zID0gdCA9PiBQcm9taXNlLnJlc29sdmUoKSwgISRyLnZ0KCkpIHRocm93IG5ldyBRKEcuVU5JTVBMRU1FTlRFRCwgXCJUaGlzIHBsYXRmb3JtIGlzIGVpdGhlciBtaXNzaW5nIEluZGV4ZWREQiBvciBpcyBrbm93biB0byBoYXZlIGFuIGluY29tcGxldGUgaW1wbGVtZW50YXRpb24uIE9mZmxpbmUgcGVyc2lzdGVuY2UgaGFzIGJlZW4gZGlzYWJsZWQuXCIpO1xuICAgICAgICB0aGlzLnJlZmVyZW5jZURlbGVnYXRlID0gbmV3IFByKHRoaXMsIHMpLCB0aGlzLnVzID0gZSArIFwibWFpblwiLCB0aGlzLk0gPSBuZXcgUmkoYSksIFxuICAgICAgICB0aGlzLmNzID0gbmV3IGhpKHRoaXMudXMsIHRoaXMuWG4sIG5ldyBrcih0aGlzLk0pKSwgdGhpcy5ocyA9IG5ldyBncih0aGlzLnJlZmVyZW5jZURlbGVnYXRlLCB0aGlzLk0pLCBcbiAgICAgICAgdGhpcy5scyA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU3IodCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gKiBSZXR1cm5zIHRoZSBzZXQgb2YgZG9jdW1lbnRzIHRoYXQgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBzcGVjaWZpZWQgcmVhZFxuICogdGltZS5cbiAqL1xuICAgICAgICAvLyBQT1JUSU5HIE5PVEU6IFRoaXMgaXMgb25seSB1c2VkIGZvciBtdWx0aS10YWIgc3luY2hyb25pemF0aW9uLlxuICAgICAgICAodGhpcy5NKSwgdGhpcy5mcyA9IG5ldyAkaSwgdGhpcy53aW5kb3cgJiYgdGhpcy53aW5kb3cubG9jYWxTdG9yYWdlID8gdGhpcy5kcyA9IHRoaXMud2luZG93LmxvY2FsU3RvcmFnZSA6ICh0aGlzLmRzID0gbnVsbCwgXG4gICAgICAgICExID09PSBjICYmICQoXCJJbmRleGVkRGJQZXJzaXN0ZW5jZVwiLCBcIkxvY2FsU3RvcmFnZSBpcyB1bmF2YWlsYWJsZS4gQXMgYSByZXN1bHQsIHBlcnNpc3RlbmNlIG1heSBub3Qgd29yayByZWxpYWJseS4gSW4gcGFydGljdWxhciBlbmFibGVQZXJzaXN0ZW5jZSgpIGNvdWxkIGZhaWwgaW1tZWRpYXRlbHkgYWZ0ZXIgcmVmcmVzaGluZyB0aGUgcGFnZS5cIikpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBdHRlbXB0IHRvIHN0YXJ0IEluZGV4ZWREYiBwZXJzaXN0ZW5jZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgcGVyc2lzdGVuY2Ugd2FzIGVuYWJsZWQuXG4gICAgICovICAgIHN0YXJ0KCkge1xuICAgICAgICAvLyBOT1RFOiBUaGlzIGlzIGV4cGVjdGVkIHRvIGZhaWwgc29tZXRpbWVzIChpbiB0aGUgY2FzZSBvZiBhbm90aGVyIHRhYlxuICAgICAgICAvLyBhbHJlYWR5IGhhdmluZyB0aGUgcGVyc2lzdGVuY2UgbG9jayksIHNvIGl0J3MgdGhlIGZpcnN0IHRoaW5nIHdlIHNob3VsZFxuICAgICAgICAvLyBkby5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3MoKS50aGVuKCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNQcmltYXJ5ICYmICF0aGlzLmFsbG93VGFiU3luY2hyb25pemF0aW9uKSBcbiAgICAgICAgICAgIC8vIEZhaWwgYHN0YXJ0KClgIGlmIGBzeW5jaHJvbml6ZVRhYnNgIGlzIGRpc2FibGVkIGFuZCB3ZSBjYW5ub3RcbiAgICAgICAgICAgIC8vIG9idGFpbiB0aGUgcHJpbWFyeSBsZWFzZS5cbiAgICAgICAgICAgIHRocm93IG5ldyBRKEcuRkFJTEVEX1BSRUNPTkRJVElPTiwgT3IpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMud3MoKSwgdGhpcy5ncygpLCB0aGlzLnlzKCksIHRoaXMucnVuVHJhbnNhY3Rpb24oXCJnZXRIaWdoZXN0TGlzdGVuU2VxdWVuY2VOdW1iZXJcIiwgXCJyZWFkb25seVwiLCAodCA9PiB0aGlzLmhzLmdldEhpZ2hlc3RTZXF1ZW5jZU51bWJlcih0KSkpO1xuICAgICAgICB9KSkudGhlbigodCA9PiB7XG4gICAgICAgICAgICB0aGlzLlpuID0gbmV3IG50KHQsIHRoaXMuSm4pO1xuICAgICAgICB9KSkudGhlbigoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50cyA9ICEwO1xuICAgICAgICB9KSkuY2F0Y2goKHQgPT4gKHRoaXMuY3MgJiYgdGhpcy5jcy5jbG9zZSgpLCBQcm9taXNlLnJlamVjdCh0KSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGEgbGlzdGVuZXIgdGhhdCBnZXRzIGNhbGxlZCB3aGVuIHRoZSBwcmltYXJ5IHN0YXRlIG9mIHRoZVxuICAgICAqIGluc3RhbmNlIGNoYW5nZXMuIFVwb24gcmVnaXN0ZXJpbmcsIHRoaXMgbGlzdGVuZXIgaXMgaW52b2tlZCBpbW1lZGlhdGVseVxuICAgICAqIHdpdGggdGhlIGN1cnJlbnQgcHJpbWFyeSBzdGF0ZS5cbiAgICAgKlxuICAgICAqIFBPUlRJTkcgTk9URTogVGhpcyBpcyBvbmx5IHVzZWQgZm9yIFdlYiBtdWx0aS10YWIuXG4gICAgICovICAgIHBzKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3MgPSBhc3luYyBlID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXJ0ZWQpIHJldHVybiB0KGUpO1xuICAgICAgICB9LCB0KHRoaXMuaXNQcmltYXJ5KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGEgbGlzdGVuZXIgdGhhdCBnZXRzIGNhbGxlZCB3aGVuIHRoZSBkYXRhYmFzZSByZWNlaXZlcyBhXG4gICAgICogdmVyc2lvbiBjaGFuZ2UgZXZlbnQgaW5kaWNhdGluZyB0aGF0IGl0IGhhcyBkZWxldGVkLlxuICAgICAqXG4gICAgICogUE9SVElORyBOT1RFOiBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgV2ViIG11bHRpLXRhYi5cbiAgICAgKi8gICAgc2V0RGF0YWJhc2VEZWxldGVkTGlzdGVuZXIodCkge1xuICAgICAgICB0aGlzLmNzLk90KChhc3luYyBlID0+IHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBkZWxldGUgSW5kZXhlZERCLlxuICAgICAgICAgICAgbnVsbCA9PT0gZS5uZXdWZXJzaW9uICYmIGF3YWl0IHQoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGp1c3RzIHRoZSBjdXJyZW50IG5ldHdvcmsgc3RhdGUgaW4gdGhlIGNsaWVudCdzIG1ldGFkYXRhLCBwb3RlbnRpYWxseVxuICAgICAqIGFmZmVjdGluZyB0aGUgcHJpbWFyeSBsZWFzZS5cbiAgICAgKlxuICAgICAqIFBPUlRJTkcgTk9URTogVGhpcyBpcyBvbmx5IHVzZWQgZm9yIFdlYiBtdWx0aS10YWIuXG4gICAgICovICAgIHNldE5ldHdvcmtFbmFibGVkKHQpIHtcbiAgICAgICAgdGhpcy5uZXR3b3JrRW5hYmxlZCAhPT0gdCAmJiAodGhpcy5uZXR3b3JrRW5hYmxlZCA9IHQsIFxuICAgICAgICAvLyBTY2hlZHVsZSBhIHByaW1hcnkgbGVhc2UgcmVmcmVzaCBmb3IgaW1tZWRpYXRlIGV4ZWN1dGlvbi4gVGhlIGV2ZW50dWFsXG4gICAgICAgIC8vIGxlYXNlIHVwZGF0ZSB3aWxsIGJlIHByb3BhZ2F0ZWQgdmlhIGBwcmltYXJ5U3RhdGVMaXN0ZW5lcmAuXG4gICAgICAgIHRoaXMuSG4uZW5xdWV1ZUFuZEZvcmdldCgoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdGFydGVkICYmIGF3YWl0IHRoaXMuX3MoKTtcbiAgICAgICAgfSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgY2xpZW50IG1ldGFkYXRhIGluIEluZGV4ZWREYiBhbmQgYXR0ZW1wdHMgdG8gZWl0aGVyIG9idGFpbiBvclxuICAgICAqIGV4dGVuZCB0aGUgcHJpbWFyeSBsZWFzZSBmb3IgdGhlIGxvY2FsIGNsaWVudC4gQXN5bmNocm9ub3VzbHkgbm90aWZpZXMgdGhlXG4gICAgICogcHJpbWFyeSBzdGF0ZSBsaXN0ZW5lciBpZiB0aGUgY2xpZW50IGVpdGhlciBuZXdseSBvYnRhaW5lZCBvciByZWxlYXNlZCBpdHNcbiAgICAgKiBwcmltYXJ5IGxlYXNlLlxuICAgICAqLyAgICBfcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVuVHJhbnNhY3Rpb24oXCJ1cGRhdGVDbGllbnRNZXRhZGF0YUFuZFRyeUJlY29tZVByaW1hcnlcIiwgXCJyZWFkd3JpdGVcIiwgKHQgPT4gQnIodCkucHV0KHtcbiAgICAgICAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxuICAgICAgICAgICAgdXBkYXRlVGltZU1zOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgbmV0d29ya0VuYWJsZWQ6IHRoaXMubmV0d29ya0VuYWJsZWQsXG4gICAgICAgICAgICBpbkZvcmVncm91bmQ6IHRoaXMuaW5Gb3JlZ3JvdW5kXG4gICAgICAgIH0pLm5leHQoKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzUHJpbWFyeSkgcmV0dXJuIHRoaXMuSXModCkubmV4dCgodCA9PiB7XG4gICAgICAgICAgICAgICAgdCB8fCAodGhpcy5pc1ByaW1hcnkgPSAhMSwgdGhpcy5Ibi5lbnF1ZXVlUmV0cnlhYmxlKCgoKSA9PiB0aGlzLm9zKCExKSkpKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IHRoaXMuVHModCkpKS5uZXh0KChlID0+IHRoaXMuaXNQcmltYXJ5ICYmICFlID8gdGhpcy5Fcyh0KS5uZXh0KCgoKSA9PiAhMSkpIDogISFlICYmIHRoaXMuQXModCkubmV4dCgoKCkgPT4gITApKSkpKSkuY2F0Y2goKHQgPT4ge1xuICAgICAgICAgICAgaWYgKGRpKHQpKSBcbiAgICAgICAgICAgIC8vIFByb2NlZWQgd2l0aCB0aGUgZXhpc3Rpbmcgc3RhdGUuIEFueSBzdWJzZXF1ZW50IGFjY2VzcyB0b1xuICAgICAgICAgICAgLy8gSW5kZXhlZERCIHdpbGwgdmVyaWZ5IHRoZSBsZWFzZS5cbiAgICAgICAgICAgIHJldHVybiBPKFwiSW5kZXhlZERiUGVyc2lzdGVuY2VcIiwgXCJGYWlsZWQgdG8gZXh0ZW5kIG93bmVyIGxlYXNlOiBcIiwgdCksIHRoaXMuaXNQcmltYXJ5O1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFsbG93VGFiU3luY2hyb25pemF0aW9uKSB0aHJvdyB0O1xuICAgICAgICAgICAgcmV0dXJuIE8oXCJJbmRleGVkRGJQZXJzaXN0ZW5jZVwiLCBcIlJlbGVhc2luZyBvd25lciBsZWFzZSBhZnRlciBlcnJvciBkdXJpbmcgbGVhc2UgcmVmcmVzaFwiLCB0KSwgXG4gICAgICAgICAgICAvKiBpc1ByaW1hcnk9ICovICExO1xuICAgICAgICB9KSkudGhlbigodCA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzUHJpbWFyeSAhPT0gdCAmJiB0aGlzLkhuLmVucXVldWVSZXRyeWFibGUoKCgpID0+IHRoaXMub3ModCkpKSwgdGhpcy5pc1ByaW1hcnkgPSB0O1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIElzKHQpIHtcbiAgICAgICAgcmV0dXJuIEZyKHQpLmdldChcIm93bmVyXCIpLm5leHQoKHQgPT4gdWkucmVzb2x2ZSh0aGlzLlJzKHQpKSkpO1xuICAgIH1cbiAgICBicyh0KSB7XG4gICAgICAgIHJldHVybiBCcih0KS5kZWxldGUodGhpcy5jbGllbnRJZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIHRoZSBnYXJiYWdlIGNvbGxlY3Rpb24gdGhyZXNob2xkIGhhcyBwYXNzZWQsIHBydW5lcyB0aGVcbiAgICAgKiBSZW1vdGVEb2N1bWVudENoYW5nZXMgYW5kIHRoZSBDbGllbnRNZXRhZGF0YSBzdG9yZSBiYXNlZCBvbiB0aGUgbGFzdCB1cGRhdGVcbiAgICAgKiB0aW1lIG9mIGFsbCBjbGllbnRzLlxuICAgICAqLyAgICBhc3luYyBQcygpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNQcmltYXJ5ICYmICF0aGlzLlZzKHRoaXMucnMsIDE4ZTUpKSB7XG4gICAgICAgICAgICB0aGlzLnJzID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBhd2FpdCB0aGlzLnJ1blRyYW5zYWN0aW9uKFwibWF5YmVHYXJiYWdlQ29sbGVjdE11bHRpQ2xpZW50U3RhdGVcIiwgXCJyZWFkd3JpdGUtcHJpbWFyeVwiLCAodCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IHBpKHQsIFwiY2xpZW50TWV0YWRhdGFcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuVXQoKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IHRoaXMudnModCwgMThlNSksIHMgPSB0LmZpbHRlcigodCA9PiAtMSA9PT0gbi5pbmRleE9mKHQpKSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIERlbGV0ZSBtZXRhZGF0YSBmb3IgY2xpZW50cyB0aGF0IGFyZSBubyBsb25nZXIgY29uc2lkZXJlZCBhY3RpdmUuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1aS5mb3JFYWNoKHMsICh0ID0+IGUuZGVsZXRlKHQuY2xpZW50SWQpKSkubmV4dCgoKCkgPT4gcykpO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH0pKS5jYXRjaCgoKCkgPT4gW10pKTtcbiAgICAgICAgICAgIC8vIERlbGV0ZSBwb3RlbnRpYWwgbGVmdG92ZXIgZW50cmllcyB0aGF0IG1heSBjb250aW51ZSB0byBtYXJrIHRoZVxuICAgICAgICAgICAgLy8gaW5hY3RpdmUgY2xpZW50cyBhcyB6b21iaWVkIGluIExvY2FsU3RvcmFnZS5cbiAgICAgICAgICAgIC8vIElkZWFsbHkgd2UnZCBkZWxldGUgdGhlIEluZGV4ZWREYiBhbmQgTG9jYWxTdG9yYWdlIHpvbWJpZSBlbnRyaWVzIGZvclxuICAgICAgICAgICAgLy8gdGhlIGNsaWVudCBhdG9taWNhbGx5LCBidXQgd2UgY2FuJ3QuIFNvIHdlIG9wdCB0byBkZWxldGUgdGhlIEluZGV4ZWREYlxuICAgICAgICAgICAgLy8gZW50cmllcyBmaXJzdCB0byBhdm9pZCBwb3RlbnRpYWxseSByZXZpdmluZyBhIHpvbWJpZWQgY2xpZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZHMpIGZvciAoY29uc3QgZSBvZiB0KSB0aGlzLmRzLnJlbW92ZUl0ZW0odGhpcy5TcyhlLmNsaWVudElkKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2NoZWR1bGVzIGEgcmVjdXJyaW5nIHRpbWVyIHRvIHVwZGF0ZSB0aGUgY2xpZW50IG1ldGFkYXRhIGFuZCB0byBlaXRoZXJcbiAgICAgKiBleHRlbmQgb3IgYWNxdWlyZSB0aGUgcHJpbWFyeSBsZWFzZSBpZiB0aGUgY2xpZW50IGlzIGVsaWdpYmxlLlxuICAgICAqLyAgICB5cygpIHtcbiAgICAgICAgdGhpcy5zcyA9IHRoaXMuSG4uZW5xdWV1ZUFmdGVyRGVsYXkoXCJjbGllbnRfbWV0YWRhdGFfcmVmcmVzaFwiIC8qIENsaWVudE1ldGFkYXRhUmVmcmVzaCAqLyAsIDRlMywgKCgpID0+IHRoaXMuX3MoKS50aGVuKCgoKSA9PiB0aGlzLlBzKCkpKS50aGVuKCgoKSA9PiB0aGlzLnlzKCkpKSkpO1xuICAgIH1cbiAgICAvKiogQ2hlY2tzIHdoZXRoZXIgYGNsaWVudGAgaXMgdGhlIGxvY2FsIGNsaWVudC4gKi8gICAgUnModCkge1xuICAgICAgICByZXR1cm4gISF0ICYmIHQub3duZXJJZCA9PT0gdGhpcy5jbGllbnRJZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXZhbHVhdGUgdGhlIHN0YXRlIG9mIGFsbCBhY3RpdmUgY2xpZW50cyBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGxvY2FsXG4gICAgICogY2xpZW50IGlzIG9yIGNhbiBhY3QgYXMgdGhlIGhvbGRlciBvZiB0aGUgcHJpbWFyeSBsZWFzZS4gUmV0dXJucyB3aGV0aGVyXG4gICAgICogdGhlIGNsaWVudCBpcyBlbGlnaWJsZSBmb3IgdGhlIGxlYXNlLCBidXQgZG9lcyBub3QgYWN0dWFsbHkgYWNxdWlyZSBpdC5cbiAgICAgKiBNYXkgcmV0dXJuICdmYWxzZScgZXZlbiBpZiB0aGVyZSBpcyBubyBhY3RpdmUgbGVhc2Vob2xkZXIgYW5kIGFub3RoZXJcbiAgICAgKiAoZm9yZWdyb3VuZCkgY2xpZW50IHNob3VsZCBiZWNvbWUgbGVhc2Vob2xkZXIgaW5zdGVhZC5cbiAgICAgKi8gICAgVHModCkge1xuICAgICAgICBpZiAodGhpcy5ZbikgcmV0dXJuIHVpLnJlc29sdmUoITApO1xuICAgICAgICByZXR1cm4gRnIodCkuZ2V0KFwib3duZXJcIikubmV4dCgoZSA9PiB7XG4gICAgICAgICAgICAvLyBBIGNsaWVudCBpcyBlbGlnaWJsZSBmb3IgdGhlIHByaW1hcnkgbGVhc2UgaWY6XG4gICAgICAgICAgICAvLyAtIGl0cyBuZXR3b3JrIGlzIGVuYWJsZWQgYW5kIHRoZSBjbGllbnQncyB0YWIgaXMgaW4gdGhlIGZvcmVncm91bmQuXG4gICAgICAgICAgICAvLyAtIGl0cyBuZXR3b3JrIGlzIGVuYWJsZWQgYW5kIG5vIG90aGVyIGNsaWVudCdzIHRhYiBpcyBpbiB0aGVcbiAgICAgICAgICAgIC8vICAgZm9yZWdyb3VuZC5cbiAgICAgICAgICAgIC8vIC0gZXZlcnkgY2xpZW50cyBuZXR3b3JrIGlzIGRpc2FibGVkIGFuZCB0aGUgY2xpZW50J3MgdGFiIGlzIGluIHRoZVxuICAgICAgICAgICAgLy8gICBmb3JlZ3JvdW5kLlxuICAgICAgICAgICAgLy8gLSBldmVyeSBjbGllbnRzIG5ldHdvcmsgaXMgZGlzYWJsZWQgYW5kIG5vIG90aGVyIGNsaWVudCdzIHRhYiBpcyBpblxuICAgICAgICAgICAgLy8gICB0aGUgZm9yZWdyb3VuZC5cbiAgICAgICAgICAgIC8vIC0gdGhlIGBmb3JjZU93bmluZ1RhYmAgc2V0dGluZyB3YXMgcGFzc2VkIGluLlxuICAgICAgICAgICAgaWYgKG51bGwgIT09IGUgJiYgdGhpcy5WcyhlLmxlYXNlVGltZXN0YW1wTXMsIDVlMykgJiYgIXRoaXMuRHMoZS5vd25lcklkKSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLlJzKGUpICYmIHRoaXMubmV0d29ya0VuYWJsZWQpIHJldHVybiAhMDtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuUnMoZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlLmFsbG93VGFiU3luY2hyb25pemF0aW9uKSBcbiAgICAgICAgICAgICAgICAgICAgLy8gRmFpbCB0aGUgYGNhbkFjdEFzUHJpbWFyeWAgY2hlY2sgaWYgdGhlIGN1cnJlbnQgbGVhc2Vob2xkZXIgaGFzXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vdCBvcHRlZCBpbnRvIG11bHRpLXRhYiBzeW5jaHJvbml6YXRpb24uIElmIHRoaXMgaGFwcGVucyBhdFxuICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgc3RhcnR1cCwgd2UgcmVqZWN0IHRoZSBQcm9taXNlIHJldHVybmVkIGJ5XG4gICAgICAgICAgICAgICAgICAgIC8vIGBlbmFibGVQZXJzaXN0ZW5jZSgpYCBhbmQgdGhlIHVzZXIgY2FuIGNvbnRpbnVlIHRvIHVzZSBGaXJlc3RvcmVcbiAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBpbi1tZW1vcnkgcGVyc2lzdGVuY2UuXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgZmFpbHMgZHVyaW5nIGEgbGVhc2UgcmVmcmVzaCwgd2Ugd2lsbCBpbnN0ZWFkIGJsb2NrIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBBc3luY1F1ZXVlIGZyb20gZXhlY3V0aW5nIGZ1cnRoZXIgb3BlcmF0aW9ucy4gTm90ZSB0aGF0IHRoaXMgaXNcbiAgICAgICAgICAgICAgICAgICAgLy8gYWNjZXB0YWJsZSBzaW5jZSBtaXhpbmcgJiBtYXRjaGluZyBkaWZmZXJlbnQgYHN5bmNocm9uaXplVGFic2BcbiAgICAgICAgICAgICAgICAgICAgLy8gc2V0dGluZ3MgaXMgbm90IHN1cHBvcnRlZC5cbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhiLzExNDIyNjIzNCk6IFJlbW92ZSB0aGlzIGNoZWNrIHdoZW4gYHN5bmNocm9uaXplVGFic2AgY2FuXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vIGxvbmdlciBiZSB0dXJuZWQgb2ZmLlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUShHLkZBSUxFRF9QUkVDT05ESVRJT04sIE9yKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAhKCF0aGlzLm5ldHdvcmtFbmFibGVkIHx8ICF0aGlzLmluRm9yZWdyb3VuZCkgfHwgQnIodCkuVXQoKS5uZXh0KCh0ID0+IHZvaWQgMCA9PT0gdGhpcy52cyh0LCA1ZTMpLmZpbmQoKHQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNsaWVudElkICE9PSB0LmNsaWVudElkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSAhdGhpcy5uZXR3b3JrRW5hYmxlZCAmJiB0Lm5ldHdvcmtFbmFibGVkLCBuID0gIXRoaXMuaW5Gb3JlZ3JvdW5kICYmIHQuaW5Gb3JlZ3JvdW5kLCBzID0gdGhpcy5uZXR3b3JrRW5hYmxlZCA9PT0gdC5uZXR3b3JrRW5hYmxlZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUgfHwgbiAmJiBzKSByZXR1cm4gITA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgICAgIH0pKSkpO1xuICAgICAgICB9KSkubmV4dCgodCA9PiAodGhpcy5pc1ByaW1hcnkgIT09IHQgJiYgTyhcIkluZGV4ZWREYlBlcnNpc3RlbmNlXCIsIGBDbGllbnQgJHt0ID8gXCJpc1wiIDogXCJpcyBub3RcIn0gZWxpZ2libGUgZm9yIGEgcHJpbWFyeSBsZWFzZS5gKSwgXG4gICAgICAgIHQpKSk7XG4gICAgfVxuICAgIGFzeW5jIHNodXRkb3duKCkge1xuICAgICAgICAvLyBUaGUgc2h1dGRvd24oKSBvcGVyYXRpb25zIGFyZSBpZGVtcG90ZW50IGFuZCBjYW4gYmUgY2FsbGVkIGV2ZW4gd2hlblxuICAgICAgICAvLyBzdGFydCgpIGFib3J0ZWQgKGUuZy4gYmVjYXVzZSBpdCBjb3VsZG4ndCBhY3F1aXJlIHRoZSBwZXJzaXN0ZW5jZSBsZWFzZSkuXG4gICAgICAgIHRoaXMudHMgPSAhMSwgdGhpcy5DcygpLCB0aGlzLnNzICYmICh0aGlzLnNzLmNhbmNlbCgpLCB0aGlzLnNzID0gbnVsbCksIHRoaXMueHMoKSwgXG4gICAgICAgIHRoaXMuTnMoKSwgXG4gICAgICAgIC8vIFVzZSBgU2ltcGxlRGIucnVuVHJhbnNhY3Rpb25gIGRpcmVjdGx5IHRvIGF2b2lkIGZhaWxpbmcgaWYgYW5vdGhlciB0YWJcbiAgICAgICAgLy8gaGFzIG9idGFpbmVkIHRoZSBwcmltYXJ5IGxlYXNlLlxuICAgICAgICBhd2FpdCB0aGlzLmNzLnJ1blRyYW5zYWN0aW9uKFwic2h1dGRvd25cIiwgXCJyZWFkd3JpdGVcIiwgWyBcIm93bmVyXCIsIFwiY2xpZW50TWV0YWRhdGFcIiBdLCAodCA9PiB7XG4gICAgICAgICAgICBjb25zdCBlID0gbmV3IHlpKHQsIG50LkEpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuRXMoZSkubmV4dCgoKCkgPT4gdGhpcy5icyhlKSkpO1xuICAgICAgICB9KSksIHRoaXMuY3MuY2xvc2UoKSwgXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgZW50cnkgbWFya2luZyB0aGUgY2xpZW50IGFzIHpvbWJpZWQgZnJvbSBMb2NhbFN0b3JhZ2Ugc2luY2VcbiAgICAgICAgLy8gd2Ugc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgaXRzIG1ldGFkYXRhIGZyb20gSW5kZXhlZERiLlxuICAgICAgICB0aGlzLmtzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgY2xpZW50cyB0aGF0IGFyZSBub3Qgem9tYmllZCBhbmQgaGF2ZSBhbiB1cGRhdGVUaW1lIHdpdGhpbiB0aGVcbiAgICAgKiBwcm92aWRlZCB0aHJlc2hvbGQuXG4gICAgICovICAgIHZzKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHQuZmlsdGVyKCh0ID0+IHRoaXMuVnModC51cGRhdGVUaW1lTXMsIGUpICYmICF0aGlzLkRzKHQuY2xpZW50SWQpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIElEcyBvZiB0aGUgY2xpZW50cyB0aGF0IGFyZSBjdXJyZW50bHkgYWN0aXZlLiBJZiBtdWx0aS10YWJcbiAgICAgKiBpcyBub3Qgc3VwcG9ydGVkLCByZXR1cm5zIGFuIGFycmF5IHRoYXQgb25seSBjb250YWlucyB0aGUgbG9jYWwgY2xpZW50J3NcbiAgICAgKiBJRC5cbiAgICAgKlxuICAgICAqIFBPUlRJTkcgTk9URTogVGhpcyBpcyBvbmx5IHVzZWQgZm9yIFdlYiBtdWx0aS10YWIuXG4gICAgICovICAgIE1zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ydW5UcmFuc2FjdGlvbihcImdldEFjdGl2ZUNsaWVudHNcIiwgXCJyZWFkb25seVwiLCAodCA9PiBCcih0KS5VdCgpLm5leHQoKHQgPT4gdGhpcy52cyh0LCAxOGU1KS5tYXAoKHQgPT4gdC5jbGllbnRJZCkpKSkpKTtcbiAgICB9XG4gICAgZ2V0IHN0YXJ0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRzO1xuICAgIH1cbiAgICBnZXRNdXRhdGlvblF1ZXVlKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIGxyLll0KHQsIHRoaXMuTSwgZSwgdGhpcy5yZWZlcmVuY2VEZWxlZ2F0ZSk7XG4gICAgfVxuICAgIGdldFRhcmdldENhY2hlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ocztcbiAgICB9XG4gICAgZ2V0UmVtb3RlRG9jdW1lbnRDYWNoZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubHM7XG4gICAgfVxuICAgIGdldEluZGV4TWFuYWdlcih0KSB7XG4gICAgICAgIHJldHVybiBuZXcgbnIodCk7XG4gICAgfVxuICAgIGdldERvY3VtZW50T3ZlcmxheUNhY2hlKHQpIHtcbiAgICAgICAgcmV0dXJuIExpLll0KHRoaXMuTSwgdCk7XG4gICAgfVxuICAgIGdldEJ1bmRsZUNhY2hlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mcztcbiAgICB9XG4gICAgcnVuVHJhbnNhY3Rpb24odCwgZSwgbikge1xuICAgICAgICBPKFwiSW5kZXhlZERiUGVyc2lzdGVuY2VcIiwgXCJTdGFydGluZyB0cmFuc2FjdGlvbjpcIiwgdCk7XG4gICAgICAgIGNvbnN0IHMgPSBcInJlYWRvbmx5XCIgPT09IGUgPyBcInJlYWRvbmx5XCIgOiBcInJlYWR3cml0ZVwiLCBpID0gMTMgPT09IChyID0gdGhpcy5YbikgPyByaSA6IDEyID09PSByID8gaWkgOiAxMSA9PT0gciA/IHNpIDogdm9pZCBMKCk7XG4gICAgICAgIC8qKiBSZXR1cm5zIHRoZSBvYmplY3Qgc3RvcmVzIGZvciB0aGUgcHJvdmlkZWQgc2NoZW1hLiAqL1xuICAgICAgICB2YXIgcjtcbiAgICAgICAgbGV0IG87XG4gICAgICAgIC8vIERvIGFsbCB0cmFuc2FjdGlvbnMgYXMgcmVhZHdyaXRlIGFnYWluc3QgYWxsIG9iamVjdCBzdG9yZXMsIHNpbmNlIHdlXG4gICAgICAgIC8vIGFyZSB0aGUgb25seSByZWFkZXIvd3JpdGVyLlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNzLnJ1blRyYW5zYWN0aW9uKHQsIHMsIGksIChzID0+IChvID0gbmV3IHlpKHMsIHRoaXMuWm4gPyB0aGlzLlpuLm5leHQoKSA6IG50LkEpLCBcbiAgICAgICAgXCJyZWFkd3JpdGUtcHJpbWFyeVwiID09PSBlID8gdGhpcy5JcyhvKS5uZXh0KCh0ID0+ICEhdCB8fCB0aGlzLlRzKG8pKSkubmV4dCgoZSA9PiB7XG4gICAgICAgICAgICBpZiAoIWUpIHRocm93ICQoYEZhaWxlZCB0byBvYnRhaW4gcHJpbWFyeSBsZWFzZSBmb3IgYWN0aW9uICcke3R9Jy5gKSwgdGhpcy5pc1ByaW1hcnkgPSAhMSwgXG4gICAgICAgICAgICB0aGlzLkhuLmVucXVldWVSZXRyeWFibGUoKCgpID0+IHRoaXMub3MoITEpKSksIG5ldyBRKEcuRkFJTEVEX1BSRUNPTkRJVElPTiwgb2kpO1xuICAgICAgICAgICAgcmV0dXJuIG4obyk7XG4gICAgICAgIH0pKS5uZXh0KCh0ID0+IHRoaXMuQXMobykubmV4dCgoKCkgPT4gdCkpKSkgOiB0aGlzLk9zKG8pLm5leHQoKCgpID0+IG4obykpKSkpKS50aGVuKCh0ID0+IChvLnJhaXNlT25Db21taXR0ZWRFdmVudCgpLCBcbiAgICAgICAgdCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVmVyaWZpZXMgdGhhdCB0aGUgY3VycmVudCB0YWIgaXMgdGhlIHByaW1hcnkgbGVhc2Vob2xkZXIgb3IgYWx0ZXJuYXRpdmVseVxuICAgICAqIHRoYXQgdGhlIGxlYXNlaG9sZGVyIGhhcyBvcHRlZCBpbnRvIG11bHRpLXRhYiBzeW5jaHJvbml6YXRpb24uXG4gICAgICovXG4gICAgLy8gVE9ETyhiLzExNDIyNjIzNCk6IFJlbW92ZSB0aGlzIGNoZWNrIHdoZW4gYHN5bmNocm9uaXplVGFic2AgY2FuIG5vIGxvbmdlclxuICAgIC8vIGJlIHR1cm5lZCBvZmYuXG4gICAgT3ModCkge1xuICAgICAgICByZXR1cm4gRnIodCkuZ2V0KFwib3duZXJcIikubmV4dCgodCA9PiB7XG4gICAgICAgICAgICBpZiAobnVsbCAhPT0gdCAmJiB0aGlzLlZzKHQubGVhc2VUaW1lc3RhbXBNcywgNWUzKSAmJiAhdGhpcy5Ecyh0Lm93bmVySWQpICYmICF0aGlzLlJzKHQpICYmICEodGhpcy5ZbiB8fCB0aGlzLmFsbG93VGFiU3luY2hyb25pemF0aW9uICYmIHQuYWxsb3dUYWJTeW5jaHJvbml6YXRpb24pKSB0aHJvdyBuZXcgUShHLkZBSUxFRF9QUkVDT05ESVRJT04sIE9yKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPYnRhaW5zIG9yIGV4dGVuZHMgdGhlIG5ldyBwcmltYXJ5IGxlYXNlIGZvciB0aGUgbG9jYWwgY2xpZW50LiBUaGlzXG4gICAgICogbWV0aG9kIGRvZXMgbm90IHZlcmlmeSB0aGF0IHRoZSBjbGllbnQgaXMgZWxpZ2libGUgZm9yIHRoaXMgbGVhc2UuXG4gICAgICovICAgIEFzKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHtcbiAgICAgICAgICAgIG93bmVySWQ6IHRoaXMuY2xpZW50SWQsXG4gICAgICAgICAgICBhbGxvd1RhYlN5bmNocm9uaXphdGlvbjogdGhpcy5hbGxvd1RhYlN5bmNocm9uaXphdGlvbixcbiAgICAgICAgICAgIGxlYXNlVGltZXN0YW1wTXM6IERhdGUubm93KClcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIEZyKHQpLnB1dChcIm93bmVyXCIsIGUpO1xuICAgIH1cbiAgICBzdGF0aWMgdnQoKSB7XG4gICAgICAgIHJldHVybiBoaS52dCgpO1xuICAgIH1cbiAgICAvKiogQ2hlY2tzIHRoZSBwcmltYXJ5IGxlYXNlIGFuZCByZW1vdmVzIGl0IGlmIHdlIGFyZSB0aGUgY3VycmVudCBwcmltYXJ5LiAqLyAgICBFcyh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBGcih0KTtcbiAgICAgICAgcmV0dXJuIGUuZ2V0KFwib3duZXJcIikubmV4dCgodCA9PiB0aGlzLlJzKHQpID8gKE8oXCJJbmRleGVkRGJQZXJzaXN0ZW5jZVwiLCBcIlJlbGVhc2luZyBwcmltYXJ5IGxlYXNlLlwiKSwgXG4gICAgICAgIGUuZGVsZXRlKFwib3duZXJcIikpIDogdWkucmVzb2x2ZSgpKSk7XG4gICAgfVxuICAgIC8qKiBWZXJpZmllcyB0aGF0IGB1cGRhdGVUaW1lTXNgIGlzIHdpdGhpbiBgbWF4QWdlTXNgLiAqLyAgICBWcyh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBEYXRlLm5vdygpO1xuICAgICAgICByZXR1cm4gISh0IDwgbiAtIGUpICYmICghKHQgPiBuKSB8fCAoJChgRGV0ZWN0ZWQgYW4gdXBkYXRlIHRpbWUgdGhhdCBpcyBpbiB0aGUgZnV0dXJlOiAke3R9ID4gJHtufWApLCBcbiAgICAgICAgITEpKTtcbiAgICB9XG4gICAgd3MoKSB7XG4gICAgICAgIG51bGwgIT09IHRoaXMuZG9jdW1lbnQgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiB0aGlzLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgJiYgKHRoaXMubnMgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLkhuLmVucXVldWVBbmRGb3JnZXQoKCgpID0+ICh0aGlzLmluRm9yZWdyb3VuZCA9IFwidmlzaWJsZVwiID09PSB0aGlzLmRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSwgXG4gICAgICAgICAgICB0aGlzLl9zKCkpKSk7XG4gICAgICAgIH0sIHRoaXMuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInZpc2liaWxpdHljaGFuZ2VcIiwgdGhpcy5ucyksIHRoaXMuaW5Gb3JlZ3JvdW5kID0gXCJ2aXNpYmxlXCIgPT09IHRoaXMuZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlKTtcbiAgICB9XG4gICAgeHMoKSB7XG4gICAgICAgIHRoaXMubnMgJiYgKHRoaXMuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInZpc2liaWxpdHljaGFuZ2VcIiwgdGhpcy5ucyksIHRoaXMubnMgPSBudWxsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXR0YWNoZXMgYSB3aW5kb3cudW5sb2FkIGhhbmRsZXIgdGhhdCB3aWxsIHN5bmNocm9ub3VzbHkgd3JpdGUgb3VyXG4gICAgICogY2xpZW50SWQgdG8gYSBcInpvbWJpZSBjbGllbnQgaWRcIiBsb2NhdGlvbiBpbiBMb2NhbFN0b3JhZ2UuIFRoaXMgY2FuIGJlIHVzZWRcbiAgICAgKiBieSB0YWJzIHRyeWluZyB0byBhY3F1aXJlIHRoZSBwcmltYXJ5IGxlYXNlIHRvIGRldGVybWluZSB0aGF0IHRoZSBsZWFzZVxuICAgICAqIGlzIG5vIGxvbmdlciB2YWxpZCBldmVuIGlmIHRoZSB0aW1lc3RhbXAgaXMgcmVjZW50LiBUaGlzIGlzIHBhcnRpY3VsYXJseVxuICAgICAqIGltcG9ydGFudCBmb3IgdGhlIHJlZnJlc2ggY2FzZSAoc28gdGhlIHRhYiBjb3JyZWN0bHkgcmUtYWNxdWlyZXMgdGhlXG4gICAgICogcHJpbWFyeSBsZWFzZSkuIExvY2FsU3RvcmFnZSBpcyB1c2VkIGZvciB0aGlzIHJhdGhlciB0aGFuIEluZGV4ZWREYiBiZWNhdXNlXG4gICAgICogaXQgaXMgYSBzeW5jaHJvbm91cyBBUEkgYW5kIHNvIGNhbiBiZSB1c2VkIHJlbGlhYmx5IGZyb20gIGFuIHVubG9hZFxuICAgICAqIGhhbmRsZXIuXG4gICAgICovICAgIGdzKCkge1xuICAgICAgICB2YXIgdDtcbiAgICAgICAgXCJmdW5jdGlvblwiID09IHR5cGVvZiAobnVsbCA9PT0gKHQgPSB0aGlzLndpbmRvdykgfHwgdm9pZCAwID09PSB0ID8gdm9pZCAwIDogdC5hZGRFdmVudExpc3RlbmVyKSAmJiAodGhpcy5lcyA9ICgpID0+IHtcbiAgICAgICAgICAgIC8vIE5vdGU6IEluIHRoZW9yeSwgdGhpcyBzaG91bGQgYmUgc2NoZWR1bGVkIG9uIHRoZSBBc3luY1F1ZXVlIHNpbmNlIGl0XG4gICAgICAgICAgICAvLyBhY2Nlc3NlcyBpbnRlcm5hbCBzdGF0ZS4gV2UgZXhlY3V0ZSB0aGlzIGNvZGUgZGlyZWN0bHkgZHVyaW5nIHNodXRkb3duXG4gICAgICAgICAgICAvLyB0byBtYWtlIHN1cmUgaXQgZ2V0cyBhIGNoYW5jZSB0byBydW4uXG4gICAgICAgICAgICB0aGlzLkNzKCksIGlzU2FmYXJpKCkgJiYgbmF2aWdhdG9yLmFwcFZlcnNpb24ubWF0Y2goL1ZlcnNpb25cXC8xWzQ1XS8pICYmIFxuICAgICAgICAgICAgLy8gT24gU2FmYXJpIDE0IGFuZCAxNSwgd2UgZG8gbm90IHJ1biBhbnkgY2xlYW51cCBhY3Rpb25zIGFzIGl0IG1pZ2h0XG4gICAgICAgICAgICAvLyB0cmlnZ2VyIGEgYnVnIHRoYXQgcHJldmVudHMgU2FmYXJpIGZyb20gcmUtb3BlbmluZyBJbmRleGVkREIgZHVyaW5nXG4gICAgICAgICAgICAvLyB0aGUgbmV4dCBwYWdlIGxvYWQuXG4gICAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIyNjU0N1xuICAgICAgICAgICAgdGhpcy5Ibi5lbnRlclJlc3RyaWN0ZWRNb2RlKC8qIHB1cmdlRXhpc3RpbmdUYXNrcz0gKi8gITApLCB0aGlzLkhuLmVucXVldWVBbmRGb3JnZXQoKCgpID0+IHRoaXMuc2h1dGRvd24oKSkpO1xuICAgICAgICB9LCB0aGlzLndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGFnZWhpZGVcIiwgdGhpcy5lcykpO1xuICAgIH1cbiAgICBOcygpIHtcbiAgICAgICAgdGhpcy5lcyAmJiAodGhpcy53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBhZ2VoaWRlXCIsIHRoaXMuZXMpLCB0aGlzLmVzID0gbnVsbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciBhIGNsaWVudCBpcyBcInpvbWJpZWRcIiBiYXNlZCBvbiBpdHMgTG9jYWxTdG9yYWdlIGVudHJ5LlxuICAgICAqIENsaWVudHMgYmVjb21lIHpvbWJpZWQgd2hlbiB0aGVpciB0YWIgY2xvc2VzIHdpdGhvdXQgcnVubmluZyBhbGwgb2YgdGhlXG4gICAgICogY2xlYW51cCBsb2dpYyBpbiBgc2h1dGRvd24oKWAuXG4gICAgICovICAgIERzKHQpIHtcbiAgICAgICAgdmFyIGU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBuID0gbnVsbCAhPT0gKG51bGwgPT09IChlID0gdGhpcy5kcykgfHwgdm9pZCAwID09PSBlID8gdm9pZCAwIDogZS5nZXRJdGVtKHRoaXMuU3ModCkpKTtcbiAgICAgICAgICAgIHJldHVybiBPKFwiSW5kZXhlZERiUGVyc2lzdGVuY2VcIiwgYENsaWVudCAnJHt0fScgJHtuID8gXCJpc1wiIDogXCJpcyBub3RcIn0gem9tYmllZCBpbiBMb2NhbFN0b3JhZ2VgKSwgXG4gICAgICAgICAgICBuO1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICAvLyBHcmFjZWZ1bGx5IGhhbmRsZSBpZiBMb2NhbFN0b3JhZ2UgaXNuJ3Qgd29ya2luZy5cbiAgICAgICAgICAgIHJldHVybiAkKFwiSW5kZXhlZERiUGVyc2lzdGVuY2VcIiwgXCJGYWlsZWQgdG8gZ2V0IHpvbWJpZWQgY2xpZW50IGlkLlwiLCB0KSwgITE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVjb3JkIGNsaWVudCBhcyB6b21iaWVkIChhIGNsaWVudCB0aGF0IGhhZCBpdHMgdGFiIGNsb3NlZCkuIFpvbWJpZWRcbiAgICAgKiBjbGllbnRzIGFyZSBpZ25vcmVkIGR1cmluZyBwcmltYXJ5IHRhYiBzZWxlY3Rpb24uXG4gICAgICovICAgIENzKCkge1xuICAgICAgICBpZiAodGhpcy5kcykgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuZHMuc2V0SXRlbSh0aGlzLlNzKHRoaXMuY2xpZW50SWQpLCBTdHJpbmcoRGF0ZS5ub3coKSkpO1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICAvLyBHcmFjZWZ1bGx5IGhhbmRsZSBpZiBMb2NhbFN0b3JhZ2UgaXNuJ3QgYXZhaWxhYmxlIC8gd29ya2luZy5cbiAgICAgICAgICAgICQoXCJGYWlsZWQgdG8gc2V0IHpvbWJpZSBjbGllbnQgaWQuXCIsIHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKiBSZW1vdmVzIHRoZSB6b21iaWVkIGNsaWVudCBlbnRyeSBpZiBpdCBleGlzdHMuICovICAgIGtzKCkge1xuICAgICAgICBpZiAodGhpcy5kcykgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuZHMucmVtb3ZlSXRlbSh0aGlzLlNzKHRoaXMuY2xpZW50SWQpKTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgLy8gSWdub3JlXG4gICAgICAgIH1cbiAgICB9XG4gICAgU3ModCkge1xuICAgICAgICByZXR1cm4gYGZpcmVzdG9yZV96b21iaWVfJHt0aGlzLnBlcnNpc3RlbmNlS2V5fV8ke3R9YDtcbiAgICB9XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGdldCBhIHR5cGVkIFNpbXBsZURiU3RvcmUgZm9yIHRoZSBwcmltYXJ5IGNsaWVudCBvYmplY3Qgc3RvcmUuXG4gKi8gZnVuY3Rpb24gRnIodCkge1xuICAgIHJldHVybiBwaSh0LCBcIm93bmVyXCIpO1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBnZXQgYSB0eXBlZCBTaW1wbGVEYlN0b3JlIGZvciB0aGUgY2xpZW50IG1ldGFkYXRhIG9iamVjdCBzdG9yZS5cbiAqLyBmdW5jdGlvbiBCcih0KSB7XG4gICAgcmV0dXJuIHBpKHQsIFwiY2xpZW50TWV0YWRhdGFcIik7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgc3RyaW5nIHVzZWQgYXMgYSBwcmVmaXggd2hlbiBzdG9yaW5nIGRhdGEgaW4gSW5kZXhlZERCIGFuZFxuICogTG9jYWxTdG9yYWdlLlxuICovIGZ1bmN0aW9uIExyKHQsIGUpIHtcbiAgICAvLyBVc2UgdHdvIGRpZmZlcmVudCBwcmVmaXggZm9ybWF0czpcbiAgICAvLyAgICogZmlyZXN0b3JlIC8gcGVyc2lzdGVuY2VLZXkgLyBwcm9qZWN0SUQgLiBkYXRhYmFzZUlEIC8gLi4uXG4gICAgLy8gICAqIGZpcmVzdG9yZSAvIHBlcnNpc3RlbmNlS2V5IC8gcHJvamVjdElEIC8gLi4uXG4gICAgLy8gcHJvamVjdElEcyBhcmUgRE5TLWNvbXBhdGlibGUgbmFtZXMgYW5kIGNhbm5vdCBjb250YWluIGRvdHNcbiAgICAvLyBzbyB0aGVyZSdzIG5vIGRhbmdlciBvZiBjb2xsaXNpb25zLlxuICAgIGxldCBuID0gdC5wcm9qZWN0SWQ7XG4gICAgcmV0dXJuIHQuaXNEZWZhdWx0RGF0YWJhc2UgfHwgKG4gKz0gXCIuXCIgKyB0LmRhdGFiYXNlKSwgXCJmaXJlc3RvcmUvXCIgKyBlICsgXCIvXCIgKyBuICsgXCIvXCI7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5jbGFzcyBxciB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLnByb2dyZXNzID0gdCwgdGhpcy4kcyA9IGU7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIHJlYWRvbmx5IHZpZXcgb2YgdGhlIGxvY2FsIHN0YXRlIG9mIGFsbCBkb2N1bWVudHMgd2UncmUgdHJhY2tpbmcgKGkuZS4gd2VcbiAqIGhhdmUgYSBjYWNoZWQgdmVyc2lvbiBpbiByZW1vdGVEb2N1bWVudENhY2hlIG9yIGxvY2FsIG11dGF0aW9ucyBmb3IgdGhlXG4gKiBkb2N1bWVudCkuIFRoZSB2aWV3IGlzIGNvbXB1dGVkIGJ5IGFwcGx5aW5nIHRoZSBtdXRhdGlvbnMgaW4gdGhlXG4gKiBNdXRhdGlvblF1ZXVlIHRvIHRoZSBSZW1vdGVEb2N1bWVudENhY2hlLlxuICovIGNsYXNzIFVyIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgIHRoaXMubHMgPSB0LCB0aGlzLkZzID0gZSwgdGhpcy5pbmRleE1hbmFnZXIgPSBuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGxvY2FsIHZpZXcgb2YgdGhlIGRvY3VtZW50IGlkZW50aWZpZWQgYnkgYGtleWAuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBMb2NhbCB2aWV3IG9mIHRoZSBkb2N1bWVudCBvciBudWxsIGlmIHdlIGRvbid0IGhhdmUgYW55IGNhY2hlZFxuICAgICAqIHN0YXRlIGZvciBpdC5cbiAgICAgKi8gICAgQnModCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5Gcy5nZXRBbGxNdXRhdGlvbkJhdGNoZXNBZmZlY3RpbmdEb2N1bWVudEtleSh0LCBlKS5uZXh0KChuID0+IHRoaXMuTHModCwgZSwgbikpKTtcbiAgICB9XG4gICAgLyoqIEludGVybmFsIHZlcnNpb24gb2YgYGdldERvY3VtZW50YCB0aGF0IGFsbG93cyByZXVzaW5nIGJhdGNoZXMuICovICAgIExzKHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubHMuZ2V0RW50cnkodCwgZSkubmV4dCgodCA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgbikgZS5hcHBseVRvTG9jYWxWaWV3KHQpO1xuICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLy8gUmV0dXJucyB0aGUgdmlldyBvZiB0aGUgZ2l2ZW4gYGRvY3NgIGFzIHRoZXkgd291bGQgYXBwZWFyIGFmdGVyIGFwcGx5aW5nXG4gICAgLy8gYWxsIG11dGF0aW9ucyBpbiB0aGUgZ2l2ZW4gYGJhdGNoZXNgLlxuICAgIHFzKHQsIGUpIHtcbiAgICAgICAgdC5mb3JFYWNoKCgodCwgbikgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIGUpIHQuYXBwbHlUb0xvY2FsVmlldyhuKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsb2NhbCB2aWV3IG9mIHRoZSBkb2N1bWVudHMgaWRlbnRpZmllZCBieSBga2V5c2AuXG4gICAgICpcbiAgICAgKiBJZiB3ZSBkb24ndCBoYXZlIGNhY2hlZCBzdGF0ZSBmb3IgYSBkb2N1bWVudCBpbiBga2V5c2AsIGEgTm9Eb2N1bWVudCB3aWxsXG4gICAgICogYmUgc3RvcmVkIGZvciB0aGF0IGtleSBpbiB0aGUgcmVzdWx0aW5nIHNldC5cbiAgICAgKi8gICAgVXModCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5scy5nZXRFbnRyaWVzKHQsIGUpLm5leHQoKGUgPT4gdGhpcy5Lcyh0LCBlKS5uZXh0KCgoKSA9PiBlKSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXBwbGllcyB0aGUgbG9jYWwgdmlldyB0aGUgZ2l2ZW4gYGJhc2VEb2NzYCB3aXRob3V0IHJldHJpZXZpbmcgZG9jdW1lbnRzXG4gICAgICogZnJvbSB0aGUgbG9jYWwgc3RvcmUuXG4gICAgICovICAgIEtzKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuRnMuZ2V0QWxsTXV0YXRpb25CYXRjaGVzQWZmZWN0aW5nRG9jdW1lbnRLZXlzKHQsIGUpLm5leHQoKHQgPT4gdGhpcy5xcyhlLCB0KSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhIHF1ZXJ5IGFnYWluc3QgdGhlIGxvY2FsIHZpZXcgb2YgYWxsIGRvY3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbiAtIFRoZSBwZXJzaXN0ZW5jZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAcGFyYW0gcXVlcnkgLSBUaGUgcXVlcnkgdG8gbWF0Y2ggZG9jdW1lbnRzIGFnYWluc3QuXG4gICAgICogQHBhcmFtIHNpbmNlUmVhZFRpbWUgLSBJZiBub3Qgc2V0IHRvIFNuYXBzaG90VmVyc2lvbi5taW4oKSwgcmV0dXJuIG9ubHlcbiAgICAgKiAgICAgZG9jdW1lbnRzIHRoYXQgaGF2ZSBiZWVuIHJlYWQgc2luY2UgdGhpcyBzbmFwc2hvdCB2ZXJzaW9uIChleGNsdXNpdmUpLlxuICAgICAqLyAgICBHcyh0LCBlLCBuKSB7XG4gICAgICAgIC8qKlxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBxdWVyeSBtYXRjaGVzIGEgc2luZ2xlIGRvY3VtZW50IGJ5IHBhdGggKHJhdGhlciB0aGFuIGFcbiAqIGNvbGxlY3Rpb24pLlxuICovXG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICByZXR1cm4geHQuaXNEb2N1bWVudEtleSh0LnBhdGgpICYmIG51bGwgPT09IHQuY29sbGVjdGlvbkdyb3VwICYmIDAgPT09IHQuZmlsdGVycy5sZW5ndGg7XG4gICAgICAgIH0oZSkgPyB0aGlzLlFzKHQsIGUucGF0aCkgOiBNZShlKSA/IHRoaXMuanModCwgZSwgbikgOiB0aGlzLldzKHQsIGUsIG4pO1xuICAgIH1cbiAgICBRcyh0LCBlKSB7XG4gICAgICAgIC8vIEp1c3QgZG8gYSBzaW1wbGUgZG9jdW1lbnQgbG9va3VwLlxuICAgICAgICByZXR1cm4gdGhpcy5Ccyh0LCBuZXcgeHQoZSkpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgbGV0IGUgPSBMbigpO1xuICAgICAgICAgICAgcmV0dXJuIHQuaXNGb3VuZERvY3VtZW50KCkgJiYgKGUgPSBlLmluc2VydCh0LmtleSwgdCkpLCBlO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGpzKHQsIGUsIG4pIHtcbiAgICAgICAgY29uc3QgcyA9IGUuY29sbGVjdGlvbkdyb3VwO1xuICAgICAgICBsZXQgaSA9IExuKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4TWFuYWdlci5nZXRDb2xsZWN0aW9uUGFyZW50cyh0LCBzKS5uZXh0KChyID0+IHVpLmZvckVhY2gociwgKHIgPT4ge1xuICAgICAgICAgICAgY29uc3QgbyA9IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHZlKGUsIFxuICAgICAgICAgICAgICAgIC8qY29sbGVjdGlvbkdyb3VwPSovIG51bGwsIHQuZXhwbGljaXRPcmRlckJ5LnNsaWNlKCksIHQuZmlsdGVycy5zbGljZSgpLCB0LmxpbWl0LCB0LmxpbWl0VHlwZSwgdC5zdGFydEF0LCB0LmVuZEF0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcXVlcnkgZG9lcyBub3Qgc3BlY2lmeSBhbnkgcXVlcnkgY29uc3RyYWludHMgdGhhdFxuICogY291bGQgcmVtb3ZlIHJlc3VsdHMuXG4gKi8gKGUsIHIuY2hpbGQocykpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuV3ModCwgbywgbikubmV4dCgodCA9PiB7XG4gICAgICAgICAgICAgICAgdC5mb3JFYWNoKCgodCwgZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpID0gaS5pbnNlcnQodCwgZSk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4gaSkpKSk7XG4gICAgfVxuICAgIFdzKHQsIGUsIG4pIHtcbiAgICAgICAgLy8gUXVlcnkgdGhlIHJlbW90ZSBkb2N1bWVudHMgYW5kIG92ZXJsYXkgbXV0YXRpb25zLlxuICAgICAgICBsZXQgcztcbiAgICAgICAgcmV0dXJuIHRoaXMubHMuZ2V0QWxsKHQsIGUucGF0aCwgbikubmV4dCgobiA9PiAocyA9IG4sIHRoaXMuRnMuZ2V0QWxsTXV0YXRpb25CYXRjaGVzQWZmZWN0aW5nUXVlcnkodCwgZSkpKSkubmV4dCgodCA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdCkgZm9yIChjb25zdCB0IG9mIGUubXV0YXRpb25zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbiA9IHQua2V5O1xuICAgICAgICAgICAgICAgIGxldCBpID0gcy5nZXQobik7XG4gICAgICAgICAgICAgICAgbnVsbCA9PSBpICYmIChcbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgaW52YWxpZCBkb2N1bWVudCB0byBhcHBseSBtdXRhdGlvbnMgb24gdG9wIG9mXG4gICAgICAgICAgICAgICAgaSA9IHRlLm5ld0ludmFsaWREb2N1bWVudChuKSwgcyA9IHMuaW5zZXJ0KG4sIGkpKSwgX24odCwgaSwgZS5sb2NhbFdyaXRlVGltZSksIGkuaXNGb3VuZERvY3VtZW50KCkgfHwgKHMgPSBzLnJlbW92ZShuKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiAoXG4gICAgICAgIC8vIEZpbmFsbHksIGZpbHRlciBvdXQgYW55IGRvY3VtZW50cyB0aGF0IGRvbid0IGFjdHVhbGx5IG1hdGNoXG4gICAgICAgIC8vIHRoZSBxdWVyeS5cbiAgICAgICAgcy5mb3JFYWNoKCgodCwgbikgPT4ge1xuICAgICAgICAgICAgVWUoZSwgbikgfHwgKHMgPSBzLnJlbW92ZSh0KSk7XG4gICAgICAgIH0pKSwgcykpKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEEgc2V0IG9mIGNoYW5nZXMgdG8gd2hhdCBkb2N1bWVudHMgYXJlIGN1cnJlbnRseSBpbiB2aWV3IGFuZCBvdXQgb2YgdmlldyBmb3JcbiAqIGEgZ2l2ZW4gcXVlcnkuIFRoZXNlIGNoYW5nZXMgYXJlIHNlbnQgdG8gdGhlIExvY2FsU3RvcmUgYnkgdGhlIFZpZXcgKHZpYVxuICogdGhlIFN5bmNFbmdpbmUpIGFuZCBhcmUgdXNlZCB0byBwaW4gLyB1bnBpbiBkb2N1bWVudHMgYXMgYXBwcm9wcmlhdGUuXG4gKi8gY2xhc3MgS3Ige1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgdGhpcy50YXJnZXRJZCA9IHQsIHRoaXMuZnJvbUNhY2hlID0gZSwgdGhpcy56cyA9IG4sIHRoaXMuSHMgPSBzO1xuICAgIH1cbiAgICBzdGF0aWMgSnModCwgZSkge1xuICAgICAgICBsZXQgbiA9IEduKCksIHMgPSBHbigpO1xuICAgICAgICBmb3IgKGNvbnN0IHQgb2YgZS5kb2NDaGFuZ2VzKSBzd2l0Y2ggKHQudHlwZSkge1xuICAgICAgICAgIGNhc2UgMCAvKiBBZGRlZCAqLyA6XG4gICAgICAgICAgICBuID0gbi5hZGQodC5kb2Mua2V5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAxIC8qIFJlbW92ZWQgKi8gOlxuICAgICAgICAgICAgcyA9IHMuYWRkKHQuZG9jLmtleSk7XG4gLy8gZG8gbm90aGluZ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBLcih0LCBlLmZyb21DYWNoZSwgbiwgcyk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIHF1ZXJ5IGVuZ2luZSB0aGF0IHRha2VzIGFkdmFudGFnZSBvZiB0aGUgdGFyZ2V0IGRvY3VtZW50IG1hcHBpbmcgaW4gdGhlXG4gKiBRdWVyeUNhY2hlLiBRdWVyeSBleGVjdXRpb24gaXMgb3B0aW1pemVkIGJ5IG9ubHkgcmVhZGluZyB0aGUgZG9jdW1lbnRzIHRoYXRcbiAqIHByZXZpb3VzbHkgbWF0Y2hlZCBhIHF1ZXJ5IHBsdXMgYW55IGRvY3VtZW50cyB0aGF0IHdlcmUgZWRpdGVkIGFmdGVyIHRoZVxuICogcXVlcnkgd2FzIGxhc3QgbGlzdGVuZWQgdG8uXG4gKlxuICogVGhlcmUgYXJlIHNvbWUgY2FzZXMgd2hlbiB0aGlzIG9wdGltaXphdGlvbiBpcyBub3QgZ3VhcmFudGVlZCB0byBwcm9kdWNlXG4gKiB0aGUgc2FtZSByZXN1bHRzIGFzIGZ1bGwgY29sbGVjdGlvbiBzY2Fucy4gSW4gdGhlc2UgY2FzZXMsIHF1ZXJ5XG4gKiBwcm9jZXNzaW5nIGZhbGxzIGJhY2sgdG8gZnVsbCBzY2Fucy4gVGhlc2UgY2FzZXMgYXJlOlxuICpcbiAqIC0gTGltaXQgcXVlcmllcyB3aGVyZSBhIGRvY3VtZW50IHRoYXQgbWF0Y2hlZCB0aGUgcXVlcnkgcHJldmlvdXNseSBubyBsb25nZXJcbiAqICAgbWF0Y2hlcyB0aGUgcXVlcnkuXG4gKlxuICogLSBMaW1pdCBxdWVyaWVzIHdoZXJlIGEgZG9jdW1lbnQgZWRpdCBtYXkgY2F1c2UgdGhlIGRvY3VtZW50IHRvIHNvcnQgYmVsb3dcbiAqICAgYW5vdGhlciBkb2N1bWVudCB0aGF0IGlzIGluIHRoZSBsb2NhbCBjYWNoZS5cbiAqXG4gKiAtIFF1ZXJpZXMgdGhhdCBoYXZlIG5ldmVyIGJlZW4gQ1VSUkVOVCBvciBmcmVlIG9mIGxpbWJvIGRvY3VtZW50cy5cbiAqLyBjbGFzcyBHciB7XG4gICAgLyoqIFNldHMgdGhlIGRvY3VtZW50IHZpZXcgdG8gcXVlcnkgYWdhaW5zdC4gKi9cbiAgICBZcyh0KSB7XG4gICAgICAgIHRoaXMuWHMgPSB0O1xuICAgIH1cbiAgICAvKiogUmV0dXJucyBhbGwgbG9jYWwgZG9jdW1lbnRzIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgcXVlcnkuICovICAgIEdzKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgLy8gUXVlcmllcyB0aGF0IG1hdGNoIGFsbCBkb2N1bWVudHMgZG9uJ3QgYmVuZWZpdCBmcm9tIHVzaW5nXG4gICAgICAgIC8vIGtleS1iYXNlZCBsb29rdXBzLiBJdCBpcyBtb3JlIGVmZmljaWVudCB0byBzY2FuIGFsbCBkb2N1bWVudHMgaW4gYVxuICAgICAgICAvLyBjb2xsZWN0aW9uLCByYXRoZXIgdGhhbiB0byBwZXJmb3JtIGluZGl2aWR1YWwgbG9va3Vwcy5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHJldHVybiAwID09PSB0LmZpbHRlcnMubGVuZ3RoICYmIG51bGwgPT09IHQubGltaXQgJiYgbnVsbCA9PSB0LnN0YXJ0QXQgJiYgbnVsbCA9PSB0LmVuZEF0ICYmICgwID09PSB0LmV4cGxpY2l0T3JkZXJCeS5sZW5ndGggfHwgMSA9PT0gdC5leHBsaWNpdE9yZGVyQnkubGVuZ3RoICYmIHQuZXhwbGljaXRPcmRlckJ5WzBdLmZpZWxkLmlzS2V5RmllbGQoKSk7XG4gICAgICAgIH0oZSkgfHwgbi5pc0VxdWFsKGN0Lm1pbigpKSA/IHRoaXMuWnModCwgZSkgOiB0aGlzLlhzLlVzKHQsIHMpLm5leHQoKGkgPT4ge1xuICAgICAgICAgICAgY29uc3QgciA9IHRoaXMudGkoZSwgaSk7XG4gICAgICAgICAgICByZXR1cm4gKENlKGUpIHx8IHhlKGUpKSAmJiB0aGlzLmVpKGUubGltaXRUeXBlLCByLCBzLCBuKSA/IHRoaXMuWnModCwgZSkgOiAoaygpIDw9IExvZ0xldmVsLkRFQlVHICYmIE8oXCJRdWVyeUVuZ2luZVwiLCBcIlJlLXVzaW5nIHByZXZpb3VzIHJlc3VsdCBmcm9tICVzIHRvIGV4ZWN1dGUgcXVlcnk6ICVzXCIsIG4udG9TdHJpbmcoKSwgcWUoZSkpLCBcbiAgICAgICAgICAgIHRoaXMuWHMuR3ModCwgZSwgbikubmV4dCgodCA9PiAoXG4gICAgICAgICAgICAvLyBXZSBtZXJnZSBgcHJldmlvdXNSZXN1bHRzYCBpbnRvIGB1cGRhdGVSZXN1bHRzYCwgc2luY2VcbiAgICAgICAgICAgIC8vIGB1cGRhdGVSZXN1bHRzYCBpcyBhbHJlYWR5IGEgRG9jdW1lbnRNYXAuIElmIGEgZG9jdW1lbnQgaXNcbiAgICAgICAgICAgIC8vIGNvbnRhaW5lZCBpbiBib3RoIGxpc3RzLCB0aGVuIGl0cyBjb250ZW50cyBhcmUgdGhlIHNhbWUuXG4gICAgICAgICAgICByLmZvckVhY2goKGUgPT4ge1xuICAgICAgICAgICAgICAgIHQgPSB0Lmluc2VydChlLmtleSwgZSk7XG4gICAgICAgICAgICB9KSksIHQpKSkpO1xuICAgICAgICB9KSk7XG4gICAgICAgIC8vIFF1ZXJpZXMgdGhhdCBoYXZlIG5ldmVyIHNlZW4gYSBzbmFwc2hvdCB3aXRob3V0IGxpbWJvIGZyZWUgZG9jdW1lbnRzXG4gICAgICAgIC8vIHNob3VsZCBhbHNvIGJlIHJ1biBhcyBhIGZ1bGwgY29sbGVjdGlvbiBzY2FuLlxuICAgICAgICB9XG4gICAgLyoqIEFwcGxpZXMgdGhlIHF1ZXJ5IGZpbHRlciBhbmQgc29ydGluZyB0byB0aGUgcHJvdmlkZWQgZG9jdW1lbnRzLiAgKi8gICAgdGkodCwgZSkge1xuICAgICAgICAvLyBTb3J0IHRoZSBkb2N1bWVudHMgYW5kIHJlLWFwcGx5IHRoZSBxdWVyeSBmaWx0ZXIgc2luY2UgcHJldmlvdXNseVxuICAgICAgICAvLyBtYXRjaGluZyBkb2N1bWVudHMgZG8gbm90IG5lY2Vzc2FyaWx5IHN0aWxsIG1hdGNoIHRoZSBxdWVyeS5cbiAgICAgICAgbGV0IG4gPSBuZXcga24oS2UodCkpO1xuICAgICAgICByZXR1cm4gZS5mb3JFYWNoKCgoZSwgcykgPT4ge1xuICAgICAgICAgICAgVWUodCwgcykgJiYgKG4gPSBuLmFkZChzKSk7XG4gICAgICAgIH0pKSwgbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiBhIGxpbWl0IHF1ZXJ5IG5lZWRzIHRvIGJlIHJlZmlsbGVkIGZyb20gY2FjaGUsIG1ha2luZyBpdFxuICAgICAqIGluZWxpZ2libGUgZm9yIGluZGV4LWZyZWUgZXhlY3V0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNvcnRlZFByZXZpb3VzUmVzdWx0cyAtIFRoZSBkb2N1bWVudHMgdGhhdCBtYXRjaGVkIHRoZSBxdWVyeSB3aGVuIGl0XG4gICAgICogd2FzIGxhc3Qgc3luY2hyb25pemVkLCBzb3J0ZWQgYnkgdGhlIHF1ZXJ5J3MgY29tcGFyYXRvci5cbiAgICAgKiBAcGFyYW0gcmVtb3RlS2V5cyAtIFRoZSBkb2N1bWVudCBrZXlzIHRoYXQgbWF0Y2hlZCB0aGUgcXVlcnkgYXQgdGhlIGxhc3RcbiAgICAgKiBzbmFwc2hvdC5cbiAgICAgKiBAcGFyYW0gbGltYm9GcmVlU25hcHNob3RWZXJzaW9uIC0gVGhlIHZlcnNpb24gb2YgdGhlIHNuYXBzaG90IHdoZW4gdGhlXG4gICAgICogcXVlcnkgd2FzIGxhc3Qgc3luY2hyb25pemVkLlxuICAgICAqLyAgICBlaSh0LCBlLCBuLCBzKSB7XG4gICAgICAgIC8vIFRoZSBxdWVyeSBuZWVkcyB0byBiZSByZWZpbGxlZCBpZiBhIHByZXZpb3VzbHkgbWF0Y2hpbmcgZG9jdW1lbnQgbm9cbiAgICAgICAgLy8gbG9uZ2VyIG1hdGNoZXMuXG4gICAgICAgIGlmIChuLnNpemUgIT09IGUuc2l6ZSkgcmV0dXJuICEwO1xuICAgICAgICAvLyBMaW1pdCBxdWVyaWVzIGFyZSBub3QgZWxpZ2libGUgZm9yIGluZGV4LWZyZWUgcXVlcnkgZXhlY3V0aW9uIGlmIHRoZXJlIGlzXG4gICAgICAgIC8vIGEgcG90ZW50aWFsIHRoYXQgYW4gb2xkZXIgZG9jdW1lbnQgZnJvbSBjYWNoZSBub3cgc29ydHMgYmVmb3JlIGEgZG9jdW1lbnRcbiAgICAgICAgLy8gdGhhdCB3YXMgcHJldmlvdXNseSBwYXJ0IG9mIHRoZSBsaW1pdC4gVGhpcywgaG93ZXZlciwgY2FuIG9ubHkgaGFwcGVuIGlmXG4gICAgICAgIC8vIHRoZSBkb2N1bWVudCBhdCB0aGUgZWRnZSBvZiB0aGUgbGltaXQgZ29lcyBvdXQgb2YgbGltaXQuXG4gICAgICAgIC8vIElmIGEgZG9jdW1lbnQgdGhhdCBpcyBub3QgdGhlIGxpbWl0IGJvdW5kYXJ5IHNvcnRzIGRpZmZlcmVudGx5LFxuICAgICAgICAvLyB0aGUgYm91bmRhcnkgb2YgdGhlIGxpbWl0IGl0c2VsZiBkaWQgbm90IGNoYW5nZSBhbmQgZG9jdW1lbnRzIGZyb20gY2FjaGVcbiAgICAgICAgLy8gd2lsbCBjb250aW51ZSB0byBiZSBcInJlamVjdGVkXCIgYnkgdGhpcyBib3VuZGFyeS4gVGhlcmVmb3JlLCB3ZSBjYW4gaWdub3JlXG4gICAgICAgIC8vIGFueSBtb2RpZmljYXRpb25zIHRoYXQgZG9uJ3QgYWZmZWN0IHRoZSBsYXN0IGRvY3VtZW50LlxuICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBcIkZcIiAvKiBGaXJzdCAqLyA9PT0gdCA/IGUubGFzdCgpIDogZS5maXJzdCgpO1xuICAgICAgICByZXR1cm4gISFpICYmIChpLmhhc1BlbmRpbmdXcml0ZXMgfHwgaS52ZXJzaW9uLmNvbXBhcmVUbyhzKSA+IDApO1xuICAgIH1cbiAgICBacyh0LCBlKSB7XG4gICAgICAgIHJldHVybiBrKCkgPD0gTG9nTGV2ZWwuREVCVUcgJiYgTyhcIlF1ZXJ5RW5naW5lXCIsIFwiVXNpbmcgZnVsbCBjb2xsZWN0aW9uIHNjYW4gdG8gZXhlY3V0ZSBxdWVyeTpcIiwgcWUoZSkpLCBcbiAgICAgICAgdGhpcy5Ycy5Hcyh0LCBlLCBjdC5taW4oKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBJbXBsZW1lbnRzIGBMb2NhbFN0b3JlYCBpbnRlcmZhY2UuXG4gKlxuICogTm90ZTogc29tZSBmaWVsZCBkZWZpbmVkIGluIHRoaXMgY2xhc3MgbWlnaHQgaGF2ZSBwdWJsaWMgYWNjZXNzIGxldmVsLCBidXRcbiAqIHRoZSBjbGFzcyBpcyBub3QgZXhwb3J0ZWQgc28gdGhleSBhcmUgb25seSBhY2Nlc3NpYmxlIGZyb20gdGhpcyBtb2R1bGUuXG4gKiBUaGlzIGlzIHVzZWZ1bCB0byBpbXBsZW1lbnQgb3B0aW9uYWwgZmVhdHVyZXMgKGxpa2UgYnVuZGxlcykgaW4gZnJlZVxuICogZnVuY3Rpb25zLCBzdWNoIHRoYXQgdGhleSBhcmUgdHJlZS1zaGFrZWFibGUuXG4gKi9cbmNsYXNzIFFyIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKiogTWFuYWdlcyBvdXIgaW4tbWVtb3J5IG9yIGR1cmFibGUgcGVyc2lzdGVuY2UuICovXG4gICAgdCwgZSwgbiwgcykge1xuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlID0gdCwgdGhpcy5uaSA9IGUsIHRoaXMuTSA9IHMsIFxuICAgICAgICAvKipcbiAgICAgICAgICogTWFwcyBhIHRhcmdldElEIHRvIGRhdGEgYWJvdXQgaXRzIHRhcmdldC5cbiAgICAgICAgICpcbiAgICAgICAgICogUE9SVElORyBOT1RFOiBXZSBhcmUgdXNpbmcgYW4gaW1tdXRhYmxlIGRhdGEgc3RydWN0dXJlIG9uIFdlYiB0byBtYWtlIHJlLXJ1bnNcbiAgICAgICAgICogb2YgYGFwcGx5UmVtb3RlRXZlbnQoKWAgaWRlbXBvdGVudC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2kgPSBuZXcgQ24ocnQpLCBcbiAgICAgICAgLyoqIE1hcHMgYSB0YXJnZXQgdG8gaXRzIHRhcmdldElELiAqL1xuICAgICAgICAvLyBUT0RPKHd1YW5keSk6IEV2YWx1YXRlIGlmIFRhcmdldElkIGNhbiBiZSBwYXJ0IG9mIFRhcmdldC5cbiAgICAgICAgdGhpcy5paSA9IG5ldyBEbigodCA9PiBjZSh0KSksIGxlKSwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcmVhZCB0aW1lIG9mIHRoZSBsYXN0IGVudHJ5IHByb2Nlc3NlZCBieSBgZ2V0TmV3RG9jdW1lbnRDaGFuZ2VzKClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBQT1JUSU5HIE5PVEU6IFRoaXMgaXMgb25seSB1c2VkIGZvciBtdWx0aS10YWIgc3luY2hyb25pemF0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yaSA9IGN0Lm1pbigpLCB0aGlzLm9pID0gdC5nZXRSZW1vdGVEb2N1bWVudENhY2hlKCksIHRoaXMuaHMgPSB0LmdldFRhcmdldENhY2hlKCksIFxuICAgICAgICB0aGlzLmZzID0gdC5nZXRCdW5kbGVDYWNoZSgpLCB0aGlzLmFpKG4pO1xuICAgIH1cbiAgICBhaSh0KSB7XG4gICAgICAgIC8vIFRPRE8oaW5kZXhpbmcpOiBBZGQgc3BlYyB0ZXN0cyB0aGF0IHRlc3QgdGhlc2UgY29tcG9uZW50cyBjaGFuZ2UgYWZ0ZXIgYVxuICAgICAgICAvLyB1c2VyIGNoYW5nZVxuICAgICAgICB0aGlzLmluZGV4TWFuYWdlciA9IHRoaXMucGVyc2lzdGVuY2UuZ2V0SW5kZXhNYW5hZ2VyKHQpLCB0aGlzLkZzID0gdGhpcy5wZXJzaXN0ZW5jZS5nZXRNdXRhdGlvblF1ZXVlKHQsIHRoaXMuaW5kZXhNYW5hZ2VyKSwgXG4gICAgICAgIHRoaXMudWkgPSBuZXcgVXIodGhpcy5vaSwgdGhpcy5GcywgdGhpcy5pbmRleE1hbmFnZXIpLCB0aGlzLm9pLnNldEluZGV4TWFuYWdlcih0aGlzLmluZGV4TWFuYWdlciksIFxuICAgICAgICB0aGlzLm5pLllzKHRoaXMudWkpO1xuICAgIH1cbiAgICBjb2xsZWN0R2FyYmFnZSh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlLnJ1blRyYW5zYWN0aW9uKFwiQ29sbGVjdCBnYXJiYWdlXCIsIFwicmVhZHdyaXRlLXByaW1hcnlcIiwgKGUgPT4gdC5jb2xsZWN0KGUsIHRoaXMuc2kpKSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBqcihcbi8qKiBNYW5hZ2VzIG91ciBpbi1tZW1vcnkgb3IgZHVyYWJsZSBwZXJzaXN0ZW5jZS4gKi9cbnQsIGUsIG4sIHMpIHtcbiAgICByZXR1cm4gbmV3IFFyKHQsIGUsIG4sIHMpO1xufVxuXG4vKipcbiAqIFRlbGxzIHRoZSBMb2NhbFN0b3JlIHRoYXQgdGhlIGN1cnJlbnRseSBhdXRoZW50aWNhdGVkIHVzZXIgaGFzIGNoYW5nZWQuXG4gKlxuICogSW4gcmVzcG9uc2UgdGhlIGxvY2FsIHN0b3JlIHN3aXRjaGVzIHRoZSBtdXRhdGlvbiBxdWV1ZSB0byB0aGUgbmV3IHVzZXIgYW5kXG4gKiByZXR1cm5zIGFueSByZXN1bHRpbmcgZG9jdW1lbnQgY2hhbmdlcy5cbiAqL1xuLy8gUE9SVElORyBOT1RFOiBBbmRyb2lkIGFuZCBpT1Mgb25seSByZXR1cm4gdGhlIGRvY3VtZW50cyBhZmZlY3RlZCBieSB0aGVcbi8vIGNoYW5nZS5cbmFzeW5jIGZ1bmN0aW9uIFdyKHQsIGUpIHtcbiAgICBjb25zdCBuID0gSyh0KTtcbiAgICByZXR1cm4gYXdhaXQgbi5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIkhhbmRsZSB1c2VyIGNoYW5nZVwiLCBcInJlYWRvbmx5XCIsICh0ID0+IHtcbiAgICAgICAgLy8gU3dhcCBvdXQgdGhlIG11dGF0aW9uIHF1ZXVlLCBncmFiYmluZyB0aGUgcGVuZGluZyBtdXRhdGlvbiBiYXRjaGVzXG4gICAgICAgIC8vIGJlZm9yZSBhbmQgYWZ0ZXIuXG4gICAgICAgIGxldCBzO1xuICAgICAgICByZXR1cm4gbi5Gcy5nZXRBbGxNdXRhdGlvbkJhdGNoZXModCkubmV4dCgoaSA9PiAocyA9IGksIG4uYWkoZSksIG4uRnMuZ2V0QWxsTXV0YXRpb25CYXRjaGVzKHQpKSkpLm5leHQoKGUgPT4ge1xuICAgICAgICAgICAgY29uc3QgaSA9IFtdLCByID0gW107XG4gICAgICAgICAgICAvLyBVbmlvbiB0aGUgb2xkL25ldyBjaGFuZ2VkIGtleXMuXG4gICAgICAgICAgICBsZXQgbyA9IEduKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2Ygcykge1xuICAgICAgICAgICAgICAgIGkucHVzaCh0LmJhdGNoSWQpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0Lm11dGF0aW9ucykgbyA9IG8uYWRkKGUua2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBlKSB7XG4gICAgICAgICAgICAgICAgci5wdXNoKHQuYmF0Y2hJZCk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIHQubXV0YXRpb25zKSBvID0gby5hZGQoZS5rZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBzZXQgb2YgYWxsIChwb3RlbnRpYWxseSkgY2hhbmdlZCBkb2N1bWVudHMgYW5kIHRoZSBsaXN0XG4gICAgICAgICAgICAvLyBvZiBtdXRhdGlvbiBiYXRjaCBJRHMgdGhhdCB3ZXJlIGFmZmVjdGVkIGJ5IGNoYW5nZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLnVpLlVzKHQsIG8pLm5leHQoKHQgPT4gKHtcbiAgICAgICAgICAgICAgICBjaTogdCxcbiAgICAgICAgICAgICAgICByZW1vdmVkQmF0Y2hJZHM6IGksXG4gICAgICAgICAgICAgICAgYWRkZWRCYXRjaElkczogclxuICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgfSkpO1xuICAgIH0pKTtcbn1cblxuLyogQWNjZXB0cyBsb2NhbGx5IGdlbmVyYXRlZCBNdXRhdGlvbnMgYW5kIGNvbW1pdCB0aGVtIHRvIHN0b3JhZ2UuICovXG4vKipcbiAqIEFja25vd2xlZGdlcyB0aGUgZ2l2ZW4gYmF0Y2guXG4gKlxuICogT24gdGhlIGhhcHB5IHBhdGggd2hlbiBhIGJhdGNoIGlzIGFja25vd2xlZGdlZCwgdGhlIGxvY2FsIHN0b3JlIHdpbGxcbiAqXG4gKiAgKyByZW1vdmUgdGhlIGJhdGNoIGZyb20gdGhlIG11dGF0aW9uIHF1ZXVlO1xuICogICsgYXBwbHkgdGhlIGNoYW5nZXMgdG8gdGhlIHJlbW90ZSBkb2N1bWVudCBjYWNoZTtcbiAqICArIHJlY2FsY3VsYXRlIHRoZSBsYXRlbmN5IGNvbXBlbnNhdGVkIHZpZXcgaW1wbGllZCBieSB0aG9zZSBjaGFuZ2VzICh0aGVyZVxuICogICAgbWF5IGJlIG11dGF0aW9ucyBpbiB0aGUgcXVldWUgdGhhdCBhZmZlY3QgdGhlIGRvY3VtZW50cyBidXQgaGF2ZW4ndCBiZWVuXG4gKiAgICBhY2tub3dsZWRnZWQgeWV0KTsgYW5kXG4gKiAgKyBnaXZlIHRoZSBjaGFuZ2VkIGRvY3VtZW50cyBiYWNrIHRoZSBzeW5jIGVuZ2luZVxuICpcbiAqIEByZXR1cm5zIFRoZSByZXN1bHRpbmcgKG1vZGlmaWVkKSBkb2N1bWVudHMuXG4gKi9cbmZ1bmN0aW9uIHpyKHQsIGUpIHtcbiAgICBjb25zdCBuID0gSyh0KTtcbiAgICByZXR1cm4gbi5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIkFja25vd2xlZGdlIGJhdGNoXCIsIFwicmVhZHdyaXRlLXByaW1hcnlcIiwgKHQgPT4ge1xuICAgICAgICBjb25zdCBzID0gZS5iYXRjaC5rZXlzKCksIGkgPSBuLm9pLm5ld0NoYW5nZUJ1ZmZlcih7XG4gICAgICAgICAgICB0cmFja1JlbW92YWxzOiAhMFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBuLmJhdGNoLCByID0gaS5rZXlzKCk7XG4gICAgICAgICAgICBsZXQgbyA9IHVpLnJlc29sdmUoKTtcbiAgICAgICAgICAgIHJldHVybiByLmZvckVhY2goKHQgPT4ge1xuICAgICAgICAgICAgICAgIG8gPSBvLm5leHQoKCgpID0+IHMuZ2V0RW50cnkoZSwgdCkpKS5uZXh0KChlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgciA9IG4uZG9jVmVyc2lvbnMuZ2V0KHQpO1xuICAgICAgICAgICAgICAgICAgICBxKG51bGwgIT09IHIpLCBlLnZlcnNpb24uY29tcGFyZVRvKHIpIDwgMCAmJiAoaS5hcHBseVRvUmVtb3RlRG9jdW1lbnQoZSwgbiksIGUuaXNWYWxpZERvY3VtZW50KCkgJiYgKFxuICAgICAgICAgICAgICAgICAgICAvLyBXZSB1c2UgdGhlIGNvbW1pdFZlcnNpb24gYXMgdGhlIHJlYWRUaW1lIHJhdGhlciB0aGFuIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBkb2N1bWVudCdzIHVwZGF0ZVRpbWUgc2luY2UgdGhlIHVwZGF0ZVRpbWUgaXMgbm90IGFkdmFuY2VkXG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciB1cGRhdGVzIHRoYXQgZG8gbm90IG1vZGlmeSB0aGUgdW5kZXJseWluZyBkb2N1bWVudC5cbiAgICAgICAgICAgICAgICAgICAgZS5zZXRSZWFkVGltZShuLmNvbW1pdFZlcnNpb24pLCBzLmFkZEVudHJ5KGUpKSk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSkpLCBvLm5leHQoKCgpID0+IHQuRnMucmVtb3ZlTXV0YXRpb25CYXRjaChlLCBpKSkpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBSZXR1cm5zIHRoZSBsb2NhbCB2aWV3IG9mIHRoZSBkb2N1bWVudHMgYWZmZWN0ZWQgYnkgYSBtdXRhdGlvbiBiYXRjaC4gKi9cbiAgICAgICAgLy8gUE9SVElORyBOT1RFOiBNdWx0aS1UYWIgb25seS5cbiAgICAgICAgKG4sIHQsIGUsIGkpLm5leHQoKCgpID0+IGkuYXBwbHkodCkpKS5uZXh0KCgoKSA9PiBuLkZzLnBlcmZvcm1Db25zaXN0ZW5jeUNoZWNrKHQpKSkubmV4dCgoKCkgPT4gbi51aS5Vcyh0LCBzKSkpO1xuICAgIH0pKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIG11dGF0aW9ucyBmcm9tIHRoZSBNdXRhdGlvblF1ZXVlIGZvciB0aGUgc3BlY2lmaWVkIGJhdGNoO1xuICogTG9jYWxEb2N1bWVudHMgd2lsbCBiZSByZWNhbGN1bGF0ZWQuXG4gKlxuICogQHJldHVybnMgVGhlIHJlc3VsdGluZyBtb2RpZmllZCBkb2N1bWVudHMuXG4gKi9cbi8qKlxuICogUmV0dXJucyB0aGUgbGFzdCBjb25zaXN0ZW50IHNuYXBzaG90IHByb2Nlc3NlZCAodXNlZCBieSB0aGUgUmVtb3RlU3RvcmUgdG9cbiAqIGRldGVybWluZSB3aGV0aGVyIHRvIGJ1ZmZlciBpbmNvbWluZyBzbmFwc2hvdHMgZnJvbSB0aGUgYmFja2VuZCkuXG4gKi9cbmZ1bmN0aW9uIEhyKHQpIHtcbiAgICBjb25zdCBlID0gSyh0KTtcbiAgICByZXR1cm4gZS5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIkdldCBsYXN0IHJlbW90ZSBzbmFwc2hvdCB2ZXJzaW9uXCIsIFwicmVhZG9ubHlcIiwgKHQgPT4gZS5ocy5nZXRMYXN0UmVtb3RlU25hcHNob3RWZXJzaW9uKHQpKSk7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgXCJncm91bmQtc3RhdGVcIiAocmVtb3RlKSBkb2N1bWVudHMuIFdlIGFzc3VtZSB0aGF0IHRoZSByZW1vdGVcbiAqIGV2ZW50IHJlZmxlY3RzIGFueSB3cml0ZSBiYXRjaGVzIHRoYXQgaGF2ZSBiZWVuIGFja25vd2xlZGdlZCBvciByZWplY3RlZFxuICogKGkuZS4gd2UgZG8gbm90IHJlLWFwcGx5IGxvY2FsIG11dGF0aW9ucyB0byB1cGRhdGVzIGZyb20gdGhpcyBldmVudCkuXG4gKlxuICogTG9jYWxEb2N1bWVudHMgYXJlIHJlLWNhbGN1bGF0ZWQgaWYgdGhlcmUgYXJlIHJlbWFpbmluZyBtdXRhdGlvbnMgaW4gdGhlXG4gKiBxdWV1ZS5cbiAqLyBmdW5jdGlvbiBKcih0LCBlKSB7XG4gICAgY29uc3QgbiA9IEsodCksIHMgPSBlLnNuYXBzaG90VmVyc2lvbjtcbiAgICBsZXQgaSA9IG4uc2k7XG4gICAgcmV0dXJuIG4ucGVyc2lzdGVuY2UucnVuVHJhbnNhY3Rpb24oXCJBcHBseSByZW1vdGUgZXZlbnRcIiwgXCJyZWFkd3JpdGUtcHJpbWFyeVwiLCAodCA9PiB7XG4gICAgICAgIGNvbnN0IHIgPSBuLm9pLm5ld0NoYW5nZUJ1ZmZlcih7XG4gICAgICAgICAgICB0cmFja1JlbW92YWxzOiAhMFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gUmVzZXQgbmV3VGFyZ2V0RGF0YUJ5VGFyZ2V0TWFwIGluIGNhc2UgdGhpcyB0cmFuc2FjdGlvbiBnZXRzIHJlLXJ1bi5cbiAgICAgICAgICAgICAgICBpID0gbi5zaTtcbiAgICAgICAgY29uc3QgbyA9IFtdO1xuICAgICAgICBlLnRhcmdldENoYW5nZXMuZm9yRWFjaCgoKHIsIGEpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHUgPSBpLmdldChhKTtcbiAgICAgICAgICAgIGlmICghdSkgcmV0dXJuO1xuICAgICAgICAgICAgLy8gT25seSB1cGRhdGUgdGhlIHJlbW90ZSBrZXlzIGlmIHRoZSB0YXJnZXQgaXMgc3RpbGwgYWN0aXZlLiBUaGlzXG4gICAgICAgICAgICAvLyBlbnN1cmVzIHRoYXQgd2UgY2FuIHBlcnNpc3QgdGhlIHVwZGF0ZWQgdGFyZ2V0IGRhdGEgYWxvbmcgd2l0aFxuICAgICAgICAgICAgLy8gdGhlIHVwZGF0ZWQgYXNzaWdubWVudC5cbiAgICAgICAgICAgICAgICAgICAgICAgIG8ucHVzaChuLmhzLnJlbW92ZU1hdGNoaW5nS2V5cyh0LCByLnJlbW92ZWREb2N1bWVudHMsIGEpLm5leHQoKCgpID0+IG4uaHMuYWRkTWF0Y2hpbmdLZXlzKHQsIHIuYWRkZWREb2N1bWVudHMsIGEpKSkpO1xuICAgICAgICAgICAgbGV0IGMgPSB1LndpdGhTZXF1ZW5jZU51bWJlcih0LmN1cnJlbnRTZXF1ZW5jZU51bWJlcik7XG4gICAgICAgICAgICBlLnRhcmdldE1pc21hdGNoZXMuaGFzKGEpID8gYyA9IGMud2l0aFJlc3VtZVRva2VuKHB0LkVNUFRZX0JZVEVfU1RSSU5HLCBjdC5taW4oKSkud2l0aExhc3RMaW1ib0ZyZWVTbmFwc2hvdFZlcnNpb24oY3QubWluKCkpIDogci5yZXN1bWVUb2tlbi5hcHByb3hpbWF0ZUJ5dGVTaXplKCkgPiAwICYmIChjID0gYy53aXRoUmVzdW1lVG9rZW4oci5yZXN1bWVUb2tlbiwgcykpLCBcbiAgICAgICAgICAgIGkgPSBpLmluc2VydChhLCBjKSwgXG4gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHRhcmdldCBkYXRhIGlmIHRoZXJlIGFyZSB0YXJnZXQgY2hhbmdlcyAob3IgaWZcbiAgICAgICAgICAgIC8vIHN1ZmZpY2llbnQgdGltZSBoYXMgcGFzc2VkIHNpbmNlIHRoZSBsYXN0IHVwZGF0ZSkuXG4gICAgICAgICAgICAvKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbmV3VGFyZ2V0RGF0YSBzaG91bGQgYmUgcGVyc2lzdGVkIGR1cmluZyBhbiB1cGRhdGUgb2ZcbiAqIGFuIGFjdGl2ZSB0YXJnZXQuIFRhcmdldERhdGEgc2hvdWxkIGFsd2F5cyBiZSBwZXJzaXN0ZWQgd2hlbiBhIHRhcmdldCBpc1xuICogYmVpbmcgcmVsZWFzZWQgYW5kIHNob3VsZCBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLlxuICpcbiAqIFdoaWxlIHRoZSB0YXJnZXQgaXMgYWN0aXZlLCBUYXJnZXREYXRhIHVwZGF0ZXMgY2FuIGJlIG9taXR0ZWQgd2hlbiBub3RoaW5nXG4gKiBhYm91dCB0aGUgdGFyZ2V0IGhhcyBjaGFuZ2VkIGV4Y2VwdCBtZXRhZGF0YSBsaWtlIHRoZSByZXN1bWUgdG9rZW4gb3JcbiAqIHNuYXBzaG90IHZlcnNpb24uIE9jY2FzaW9uYWxseSBpdCdzIHdvcnRoIHRoZSBleHRyYSB3cml0ZSB0byBwcmV2ZW50IHRoZXNlXG4gKiB2YWx1ZXMgZnJvbSBnZXR0aW5nIHRvbyBzdGFsZSBhZnRlciBhIGNyYXNoLCBidXQgdGhpcyBkb2Vzbid0IGhhdmUgdG8gYmVcbiAqIHRvbyBmcmVxdWVudC5cbiAqL1xuICAgICAgICAgICAgZnVuY3Rpb24odCwgZSwgbikge1xuICAgICAgICAgICAgICAgIC8vIEFsd2F5cyBwZXJzaXN0IHRhcmdldCBkYXRhIGlmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBhIHJlc3VtZSB0b2tlbi5cbiAgICAgICAgICAgICAgICBpZiAoMCA9PT0gdC5yZXN1bWVUb2tlbi5hcHByb3hpbWF0ZUJ5dGVTaXplKCkpIHJldHVybiAhMDtcbiAgICAgICAgICAgICAgICAvLyBEb24ndCBhbGxvdyByZXN1bWUgdG9rZW4gY2hhbmdlcyB0byBiZSBidWZmZXJlZCBpbmRlZmluaXRlbHkuIFRoaXNcbiAgICAgICAgICAgICAgICAvLyBhbGxvd3MgdXMgdG8gYmUgcmVhc29uYWJseSB1cC10by1kYXRlIGFmdGVyIGEgY3Jhc2ggYW5kIGF2b2lkcyBuZWVkaW5nXG4gICAgICAgICAgICAgICAgLy8gdG8gbG9vcCBvdmVyIGFsbCBhY3RpdmUgcXVlcmllcyBvbiBzaHV0ZG93bi4gRXNwZWNpYWxseSBpbiB0aGUgYnJvd3NlclxuICAgICAgICAgICAgICAgIC8vIHdlIG1heSBub3QgZ2V0IHRpbWUgdG8gZG8gYW55dGhpbmcgaW50ZXJlc3Rpbmcgd2hpbGUgdGhlIGN1cnJlbnQgdGFiIGlzXG4gICAgICAgICAgICAgICAgLy8gY2xvc2luZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuc25hcHNob3RWZXJzaW9uLnRvTWljcm9zZWNvbmRzKCkgLSB0LnNuYXBzaG90VmVyc2lvbi50b01pY3Jvc2Vjb25kcygpID49IDNlOCkgcmV0dXJuICEwO1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBpZiB0aGUgb25seSB0aGluZyB0aGF0IGhhcyBjaGFuZ2VkIGFib3V0IGEgdGFyZ2V0IGlzIGl0cyByZXN1bWVcbiAgICAgICAgICAgICAgICAvLyB0b2tlbiBpdCdzIG5vdCB3b3J0aCBwZXJzaXN0aW5nLiBOb3RlIHRoYXQgdGhlIFJlbW90ZVN0b3JlIGtlZXBzIGFuXG4gICAgICAgICAgICAgICAgLy8gaW4tbWVtb3J5IHZpZXcgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgdGFyZ2V0cyB3aGljaCBpbmNsdWRlcyB0aGUgY3VycmVudFxuICAgICAgICAgICAgICAgIC8vIHJlc3VtZSB0b2tlbiwgc28gc3RyZWFtIGZhaWx1cmUgb3IgdXNlciBjaGFuZ2VzIHdpbGwgc3RpbGwgdXNlIGFuXG4gICAgICAgICAgICAgICAgLy8gdXAtdG8tZGF0ZSByZXN1bWUgdG9rZW4gcmVnYXJkbGVzcyBvZiB3aGF0IHdlIGRvIGhlcmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmFkZGVkRG9jdW1lbnRzLnNpemUgKyBuLm1vZGlmaWVkRG9jdW1lbnRzLnNpemUgKyBuLnJlbW92ZWREb2N1bWVudHMuc2l6ZSA+IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKipcbiAqIE5vdGlmaWVzIGxvY2FsIHN0b3JlIG9mIHRoZSBjaGFuZ2VkIHZpZXdzIHRvIGxvY2FsbHkgcGluIGRvY3VtZW50cy5cbiAqLyAodSwgYywgcikgJiYgby5wdXNoKG4uaHMudXBkYXRlVGFyZ2V0RGF0YSh0LCBjKSk7XG4gICAgICAgIH0pKTtcbiAgICAgICAgbGV0IGEgPSBGbigpO1xuICAgICAgICAvLyBIQUNLOiBUaGUgb25seSByZWFzb24gd2UgYWxsb3cgYSBudWxsIHNuYXBzaG90IHZlcnNpb24gaXMgc28gdGhhdCB3ZVxuICAgICAgICAvLyBjYW4gc3ludGhlc2l6ZSByZW1vdGUgZXZlbnRzIHdoZW4gd2UgZ2V0IHBlcm1pc3Npb24gZGVuaWVkIGVycm9ycyB3aGlsZVxuICAgICAgICAvLyB0cnlpbmcgdG8gcmVzb2x2ZSB0aGUgc3RhdGUgb2YgYSBsb2NhbGx5IGNhY2hlZCBkb2N1bWVudCB0aGF0IGlzIGluXG4gICAgICAgIC8vIGxpbWJvLlxuICAgICAgICBpZiAoZS5kb2N1bWVudFVwZGF0ZXMuZm9yRWFjaCgocyA9PiB7XG4gICAgICAgICAgICBlLnJlc29sdmVkTGltYm9Eb2N1bWVudHMuaGFzKHMpICYmIG8ucHVzaChuLnBlcnNpc3RlbmNlLnJlZmVyZW5jZURlbGVnYXRlLnVwZGF0ZUxpbWJvRG9jdW1lbnQodCwgcykpO1xuICAgICAgICB9KSksIFxuICAgICAgICAvLyBFYWNoIGxvb3AgaXRlcmF0aW9uIG9ubHkgYWZmZWN0cyBpdHMgXCJvd25cIiBkb2MsIHNvIGl0J3Mgc2FmZSB0byBnZXQgYWxsIHRoZSByZW1vdGVcbiAgICAgICAgLy8gZG9jdW1lbnRzIGluIGFkdmFuY2UgaW4gYSBzaW5nbGUgY2FsbC5cbiAgICAgICAgby5wdXNoKFlyKHQsIHIsIGUuZG9jdW1lbnRVcGRhdGVzKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgIGEgPSB0O1xuICAgICAgICB9KSkpLCAhcy5pc0VxdWFsKGN0Lm1pbigpKSkge1xuICAgICAgICAgICAgY29uc3QgZSA9IG4uaHMuZ2V0TGFzdFJlbW90ZVNuYXBzaG90VmVyc2lvbih0KS5uZXh0KChlID0+IG4uaHMuc2V0VGFyZ2V0c01ldGFkYXRhKHQsIHQuY3VycmVudFNlcXVlbmNlTnVtYmVyLCBzKSkpO1xuICAgICAgICAgICAgby5wdXNoKGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1aS53YWl0Rm9yKG8pLm5leHQoKCgpID0+IHIuYXBwbHkodCkpKS5uZXh0KCgoKSA9PiBuLnVpLktzKHQsIGEpKSkubmV4dCgoKCkgPT4gYSkpO1xuICAgIH0pKS50aGVuKCh0ID0+IChuLnNpID0gaSwgdCkpKTtcbn1cblxuLyoqXG4gKiBQb3B1bGF0ZXMgZG9jdW1lbnQgY2hhbmdlIGJ1ZmZlciB3aXRoIGRvY3VtZW50cyBmcm9tIGJhY2tlbmQgb3IgYSBidW5kbGUuXG4gKiBSZXR1cm5zIHRoZSBkb2N1bWVudCBjaGFuZ2VzIHJlc3VsdGluZyBmcm9tIGFwcGx5aW5nIHRob3NlIGRvY3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gdHhuIC0gVHJhbnNhY3Rpb24gdG8gdXNlIHRvIHJlYWQgZXhpc3RpbmcgZG9jdW1lbnRzIGZyb20gc3RvcmFnZS5cbiAqIEBwYXJhbSBkb2N1bWVudEJ1ZmZlciAtIERvY3VtZW50IGJ1ZmZlciB0byBjb2xsZWN0IHRoZSByZXN1bHRlZCBjaGFuZ2VzIHRvIGJlXG4gKiAgICAgICAgYXBwbGllZCB0byBzdG9yYWdlLlxuICogQHBhcmFtIGRvY3VtZW50cyAtIERvY3VtZW50cyB0byBiZSBhcHBsaWVkLlxuICogQHBhcmFtIGdsb2JhbFZlcnNpb24gLSBBIGBTbmFwc2hvdFZlcnNpb25gIHJlcHJlc2VudGluZyB0aGUgcmVhZCB0aW1lIGlmIGFsbFxuICogICAgICAgIGRvY3VtZW50cyBoYXZlIHRoZSBzYW1lIHJlYWQgdGltZS5cbiAqIEBwYXJhbSBkb2N1bWVudFZlcnNpb25zIC0gQSBEb2N1bWVudEtleS10by1TbmFwc2hvdFZlcnNpb24gbWFwIGlmIGRvY3VtZW50c1xuICogICAgICAgIGhhdmUgdGhlaXIgb3duIHJlYWQgdGltZS5cbiAqXG4gKiBOb3RlOiB0aGlzIGZ1bmN0aW9uIHdpbGwgdXNlIGBkb2N1bWVudFZlcnNpb25zYCBpZiBpdCBpcyBkZWZpbmVkO1xuICogd2hlbiBpdCBpcyBub3QgZGVmaW5lZCwgcmVzb3J0cyB0byBgZ2xvYmFsVmVyc2lvbmAuXG4gKi8gZnVuY3Rpb24gWXIodCwgZSwgbikge1xuICAgIGxldCBzID0gR24oKTtcbiAgICByZXR1cm4gbi5mb3JFYWNoKCh0ID0+IHMgPSBzLmFkZCh0KSkpLCBlLmdldEVudHJpZXModCwgcykubmV4dCgodCA9PiB7XG4gICAgICAgIGxldCBzID0gRm4oKTtcbiAgICAgICAgcmV0dXJuIG4uZm9yRWFjaCgoKG4sIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHIgPSB0LmdldChuKTtcbiAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBvcmRlciBvZiB0aGUgc3RlcHMgYmVsb3cgaXMgaW1wb3J0YW50LCBzaW5jZSB3ZSB3YW50XG4gICAgICAgICAgICAvLyB0byBlbnN1cmUgdGhhdCByZWplY3RlZCBsaW1ibyByZXNvbHV0aW9ucyAod2hpY2ggZmFicmljYXRlXG4gICAgICAgICAgICAvLyBOb0RvY3VtZW50cyB3aXRoIFNuYXBzaG90VmVyc2lvbi5taW4oKSkgbmV2ZXIgYWRkIGRvY3VtZW50cyB0b1xuICAgICAgICAgICAgLy8gY2FjaGUuXG4gICAgICAgICAgICAgICAgICAgICAgICBpLmlzTm9Eb2N1bWVudCgpICYmIGkudmVyc2lvbi5pc0VxdWFsKGN0Lm1pbigpKSA/IChcbiAgICAgICAgICAgIC8vIE5vRG9jdW1lbnRzIHdpdGggU25hcHNob3RWZXJzaW9uLm1pbigpIGFyZSB1c2VkIGluIG1hbnVmYWN0dXJlZFxuICAgICAgICAgICAgLy8gZXZlbnRzLiBXZSByZW1vdmUgdGhlc2UgZG9jdW1lbnRzIGZyb20gY2FjaGUgc2luY2Ugd2UgbG9zdFxuICAgICAgICAgICAgLy8gYWNjZXNzLlxuICAgICAgICAgICAgZS5yZW1vdmVFbnRyeShuLCBpLnJlYWRUaW1lKSwgcyA9IHMuaW5zZXJ0KG4sIGkpKSA6ICFyLmlzVmFsaWREb2N1bWVudCgpIHx8IGkudmVyc2lvbi5jb21wYXJlVG8oci52ZXJzaW9uKSA+IDAgfHwgMCA9PT0gaS52ZXJzaW9uLmNvbXBhcmVUbyhyLnZlcnNpb24pICYmIHIuaGFzUGVuZGluZ1dyaXRlcyA/IChlLmFkZEVudHJ5KGkpLCBcbiAgICAgICAgICAgIHMgPSBzLmluc2VydChuLCBpKSkgOiBPKFwiTG9jYWxTdG9yZVwiLCBcIklnbm9yaW5nIG91dGRhdGVkIHdhdGNoIHVwZGF0ZSBmb3IgXCIsIG4sIFwiLiBDdXJyZW50IHZlcnNpb246XCIsIHIudmVyc2lvbiwgXCIgV2F0Y2ggdmVyc2lvbjpcIiwgaS52ZXJzaW9uKTtcbiAgICAgICAgfSkpLCBzO1xuICAgIH0pKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBtdXRhdGlvbiBiYXRjaCBhZnRlciB0aGUgcGFzc2VkIGluIGJhdGNoSWQgaW4gdGhlIG11dGF0aW9uIHF1ZXVlXG4gKiBvciBudWxsIGlmIGVtcHR5LlxuICogQHBhcmFtIGFmdGVyQmF0Y2hJZCAtIElmIHByb3ZpZGVkLCB0aGUgYmF0Y2ggdG8gc2VhcmNoIGFmdGVyLlxuICogQHJldHVybnMgVGhlIG5leHQgbXV0YXRpb24gb3IgbnVsbCBpZiB0aGVyZSB3YXNuJ3Qgb25lLlxuICovXG5mdW5jdGlvbiBYcih0LCBlKSB7XG4gICAgY29uc3QgbiA9IEsodCk7XG4gICAgcmV0dXJuIG4ucGVyc2lzdGVuY2UucnVuVHJhbnNhY3Rpb24oXCJHZXQgbmV4dCBtdXRhdGlvbiBiYXRjaFwiLCBcInJlYWRvbmx5XCIsICh0ID0+ICh2b2lkIDAgPT09IGUgJiYgKGUgPSAtMSksIFxuICAgIG4uRnMuZ2V0TmV4dE11dGF0aW9uQmF0Y2hBZnRlckJhdGNoSWQodCwgZSkpKSk7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgYSBEb2N1bWVudCB3aXRoIGEgZ2l2ZW4ga2V5IG9yIG51bGwgaWYgbm90XG4gKiBmb3VuZCAtIHVzZWQgZm9yIHRlc3RpbmcuXG4gKi9cbi8qKlxuICogQXNzaWducyB0aGUgZ2l2ZW4gdGFyZ2V0IGFuIGludGVybmFsIElEIHNvIHRoYXQgaXRzIHJlc3VsdHMgY2FuIGJlIHBpbm5lZCBzb1xuICogdGhleSBkb24ndCBnZXQgR0MnZC4gQSB0YXJnZXQgbXVzdCBiZSBhbGxvY2F0ZWQgaW4gdGhlIGxvY2FsIHN0b3JlIGJlZm9yZVxuICogdGhlIHN0b3JlIGNhbiBiZSB1c2VkIHRvIG1hbmFnZSBpdHMgdmlldy5cbiAqXG4gKiBBbGxvY2F0aW5nIGFuIGFscmVhZHkgYWxsb2NhdGVkIGBUYXJnZXRgIHdpbGwgcmV0dXJuIHRoZSBleGlzdGluZyBgVGFyZ2V0RGF0YWBcbiAqIGZvciB0aGF0IGBUYXJnZXRgLlxuICovXG5mdW5jdGlvbiBacih0LCBlKSB7XG4gICAgY29uc3QgbiA9IEsodCk7XG4gICAgcmV0dXJuIG4ucGVyc2lzdGVuY2UucnVuVHJhbnNhY3Rpb24oXCJBbGxvY2F0ZSB0YXJnZXRcIiwgXCJyZWFkd3JpdGVcIiwgKHQgPT4ge1xuICAgICAgICBsZXQgcztcbiAgICAgICAgcmV0dXJuIG4uaHMuZ2V0VGFyZ2V0RGF0YSh0LCBlKS5uZXh0KChpID0+IGkgPyAoXG4gICAgICAgIC8vIFRoaXMgdGFyZ2V0IGhhcyBiZWVuIGxpc3RlbmVkIHRvIHByZXZpb3VzbHksIHNvIHJldXNlIHRoZVxuICAgICAgICAvLyBwcmV2aW91cyB0YXJnZXRJRC5cbiAgICAgICAgLy8gVE9ETyhtY2cpOiBmcmVzaGVuIGxhc3QgYWNjZXNzZWQgZGF0ZT9cbiAgICAgICAgcyA9IGksIHVpLnJlc29sdmUocykpIDogbi5ocy5hbGxvY2F0ZVRhcmdldElkKHQpLm5leHQoKGkgPT4gKHMgPSBuZXcgQWkoZSwgaSwgMCAvKiBMaXN0ZW4gKi8gLCB0LmN1cnJlbnRTZXF1ZW5jZU51bWJlciksIFxuICAgICAgICBuLmhzLmFkZFRhcmdldERhdGEodCwgcykubmV4dCgoKCkgPT4gcykpKSkpKSk7XG4gICAgfSkpLnRoZW4oKHQgPT4ge1xuICAgICAgICAvLyBJZiBNdWx0aS1UYWIgaXMgZW5hYmxlZCwgdGhlIGV4aXN0aW5nIHRhcmdldCBkYXRhIG1heSBiZSBuZXdlciB0aGFuXG4gICAgICAgIC8vIHRoZSBpbi1tZW1vcnkgZGF0YVxuICAgICAgICBjb25zdCBzID0gbi5zaS5nZXQodC50YXJnZXRJZCk7XG4gICAgICAgIHJldHVybiAobnVsbCA9PT0gcyB8fCB0LnNuYXBzaG90VmVyc2lvbi5jb21wYXJlVG8ocy5zbmFwc2hvdFZlcnNpb24pID4gMCkgJiYgKG4uc2kgPSBuLnNpLmluc2VydCh0LnRhcmdldElkLCB0KSwgXG4gICAgICAgIG4uaWkuc2V0KGUsIHQudGFyZ2V0SWQpKSwgdDtcbiAgICB9KSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgVGFyZ2V0RGF0YSBhcyBzZWVuIGJ5IHRoZSBMb2NhbFN0b3JlLCBpbmNsdWRpbmcgdXBkYXRlcyB0aGF0IG1heVxuICogaGF2ZSBub3QgeWV0IGJlZW4gcGVyc2lzdGVkIHRvIHRoZSBUYXJnZXRDYWNoZS5cbiAqL1xuLy8gVmlzaWJsZSBmb3IgdGVzdGluZy5cbi8qKlxuICogVW5waW5zIGFsbCB0aGUgZG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gdGFyZ2V0LiBJZlxuICogYGtlZXBQZXJzaXN0ZWRUYXJnZXREYXRhYCBpcyBzZXQgdG8gZmFsc2UgYW5kIEVhZ2VyIEdDIGVuYWJsZWQsIHRoZSBtZXRob2RcbiAqIGRpcmVjdGx5IHJlbW92ZXMgdGhlIGFzc29jaWF0ZWQgdGFyZ2V0IGRhdGEgZnJvbSB0aGUgdGFyZ2V0IGNhY2hlLlxuICpcbiAqIFJlbGVhc2luZyBhIG5vbi1leGlzdGluZyBgVGFyZ2V0YCBpcyBhIG5vLW9wLlxuICovXG4vLyBQT1JUSU5HIE5PVEU6IGBrZWVwUGVyc2lzdGVkVGFyZ2V0RGF0YWAgaXMgbXVsdGktdGFiIG9ubHkuXG5hc3luYyBmdW5jdGlvbiB0byh0LCBlLCBuKSB7XG4gICAgY29uc3QgcyA9IEsodCksIGkgPSBzLnNpLmdldChlKSwgciA9IG4gPyBcInJlYWR3cml0ZVwiIDogXCJyZWFkd3JpdGUtcHJpbWFyeVwiO1xuICAgIHRyeSB7XG4gICAgICAgIG4gfHwgYXdhaXQgcy5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIlJlbGVhc2UgdGFyZ2V0XCIsIHIsICh0ID0+IHMucGVyc2lzdGVuY2UucmVmZXJlbmNlRGVsZWdhdGUucmVtb3ZlVGFyZ2V0KHQsIGkpKSk7XG4gICAgfSBjYXRjaCAodCkge1xuICAgICAgICBpZiAoIWRpKHQpKSB0aHJvdyB0O1xuICAgICAgICAvLyBBbGwgYHJlbGVhc2VUYXJnZXRgIGRvZXMgaXMgcmVjb3JkIHRoZSBmaW5hbCBtZXRhZGF0YSBzdGF0ZSBmb3IgdGhlXG4gICAgICAgIC8vIHRhcmdldCwgYnV0IHdlJ3ZlIGJlZW4gcmVjb3JkaW5nIHRoaXMgcGVyaW9kaWNhbGx5IGR1cmluZyB0YXJnZXRcbiAgICAgICAgLy8gYWN0aXZpdHkuIElmIHdlIGxvc2UgdGhpcyB3cml0ZSB0aGlzIGNvdWxkIGNhdXNlIGEgdmVyeSBzbGlnaHRcbiAgICAgICAgLy8gZGlmZmVyZW5jZSBpbiB0aGUgb3JkZXIgb2YgdGFyZ2V0IGRlbGV0aW9uIGR1cmluZyBHQywgYnV0IHdlXG4gICAgICAgIC8vIGRvbid0IGRlZmluZSBleGFjdCBMUlUgc2VtYW50aWNzIHNvIHRoaXMgaXMgYWNjZXB0YWJsZS5cbiAgICAgICAgTyhcIkxvY2FsU3RvcmVcIiwgYEZhaWxlZCB0byB1cGRhdGUgc2VxdWVuY2UgbnVtYmVycyBmb3IgdGFyZ2V0ICR7ZX06ICR7dH1gKTtcbiAgICB9XG4gICAgcy5zaSA9IHMuc2kucmVtb3ZlKGUpLCBzLmlpLmRlbGV0ZShpLnRhcmdldCk7XG59XG5cbi8qKlxuICogUnVucyB0aGUgc3BlY2lmaWVkIHF1ZXJ5IGFnYWluc3QgdGhlIGxvY2FsIHN0b3JlIGFuZCByZXR1cm5zIHRoZSByZXN1bHRzLFxuICogcG90ZW50aWFsbHkgdGFraW5nIGFkdmFudGFnZSBvZiBxdWVyeSBkYXRhIGZyb20gcHJldmlvdXMgZXhlY3V0aW9ucyAoc3VjaFxuICogYXMgdGhlIHNldCBvZiByZW1vdGUga2V5cykuXG4gKlxuICogQHBhcmFtIHVzZVByZXZpb3VzUmVzdWx0cyAtIFdoZXRoZXIgcmVzdWx0cyBmcm9tIHByZXZpb3VzIGV4ZWN1dGlvbnMgY2FuXG4gKiBiZSB1c2VkIHRvIG9wdGltaXplIHRoaXMgcXVlcnkgZXhlY3V0aW9uLlxuICovIGZ1bmN0aW9uIGVvKHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gSyh0KTtcbiAgICBsZXQgaSA9IGN0Lm1pbigpLCByID0gR24oKTtcbiAgICByZXR1cm4gcy5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIkV4ZWN1dGUgcXVlcnlcIiwgXCJyZWFkb25seVwiLCAodCA9PiBmdW5jdGlvbih0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSBLKHQpLCBpID0gcy5paS5nZXQobik7XG4gICAgICAgIHJldHVybiB2b2lkIDAgIT09IGkgPyB1aS5yZXNvbHZlKHMuc2kuZ2V0KGkpKSA6IHMuaHMuZ2V0VGFyZ2V0RGF0YShlLCBuKTtcbiAgICB9KHMsIHQsICRlKGUpKS5uZXh0KChlID0+IHtcbiAgICAgICAgaWYgKGUpIHJldHVybiBpID0gZS5sYXN0TGltYm9GcmVlU25hcHNob3RWZXJzaW9uLCBzLmhzLmdldE1hdGNoaW5nS2V5c0ZvclRhcmdldElkKHQsIGUudGFyZ2V0SWQpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgciA9IHQ7XG4gICAgICAgIH0pKTtcbiAgICB9KSkubmV4dCgoKCkgPT4gcy5uaS5Hcyh0LCBlLCBuID8gaSA6IGN0Lm1pbigpLCBuID8gciA6IEduKCkpKSkubmV4dCgodCA9PiAoe1xuICAgICAgICBkb2N1bWVudHM6IHQsXG4gICAgICAgIGhpOiByXG4gICAgfSkpKSkpO1xufVxuXG4vLyBQT1JUSU5HIE5PVEU6IE11bHRpLVRhYiBvbmx5LlxuZnVuY3Rpb24gbm8odCwgZSkge1xuICAgIGNvbnN0IG4gPSBLKHQpLCBzID0gSyhuLmhzKSwgaSA9IG4uc2kuZ2V0KGUpO1xuICAgIHJldHVybiBpID8gUHJvbWlzZS5yZXNvbHZlKGkudGFyZ2V0KSA6IG4ucGVyc2lzdGVuY2UucnVuVHJhbnNhY3Rpb24oXCJHZXQgdGFyZ2V0IGRhdGFcIiwgXCJyZWFkb25seVwiLCAodCA9PiBzLkV0KHQsIGUpLm5leHQoKHQgPT4gdCA/IHQudGFyZ2V0IDogbnVsbCkpKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc2V0IG9mIGRvY3VtZW50cyB0aGF0IGhhdmUgYmVlbiB1cGRhdGVkIHNpbmNlIHRoZSBsYXN0IGNhbGwuXG4gKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsLCByZXR1cm5zIHRoZSBzZXQgb2YgY2hhbmdlcyBzaW5jZSBjbGllbnRcbiAqIGluaXRpYWxpemF0aW9uLiBGdXJ0aGVyIGludm9jYXRpb25zIHdpbGwgcmV0dXJuIGRvY3VtZW50IHRoYXQgaGF2ZSBjaGFuZ2VkXG4gKiBzaW5jZSB0aGUgcHJpb3IgY2FsbC5cbiAqL1xuLy8gUE9SVElORyBOT1RFOiBNdWx0aS1UYWIgb25seS5cbmZ1bmN0aW9uIHNvKHQpIHtcbiAgICBjb25zdCBlID0gSyh0KTtcbiAgICByZXR1cm4gZS5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIkdldCBuZXcgZG9jdW1lbnQgY2hhbmdlc1wiLCBcInJlYWRvbmx5XCIsICh0ID0+IGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgY29uc3QgcyA9IEsodCk7XG4gICAgICAgIGxldCBpID0gRm4oKSwgciA9IFZpKG4pO1xuICAgICAgICBjb25zdCBvID0geHIoZSksIGEgPSBJREJLZXlSYW5nZS5sb3dlckJvdW5kKHIsICEwKTtcbiAgICAgICAgcmV0dXJuIG8uV3Qoe1xuICAgICAgICAgICAgaW5kZXg6IFwicmVhZFRpbWVJbmRleFwiLFxuICAgICAgICAgICAgcmFuZ2U6IGFcbiAgICAgICAgfSwgKCh0LCBlKSA9PiB7XG4gICAgICAgICAgICAvLyBVbmxpa2UgYGdldEVudHJ5KClgIGFuZCBvdGhlcnMsIGBnZXROZXdEb2N1bWVudENoYW5nZXMoKWAgcGFyc2VzXG4gICAgICAgICAgICAvLyB0aGUgZG9jdW1lbnRzIGRpcmVjdGx5IHNpbmNlIHdlIHdhbnQgdG8ga2VlcCBzZW50aW5lbCBkZWxldGVzLlxuICAgICAgICAgICAgY29uc3QgbiA9IGJpKHMuTSwgZSk7XG4gICAgICAgICAgICBpID0gaS5pbnNlcnQobi5rZXksIG4pLCByID0gZS5yZWFkVGltZTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+ICh7XG4gICAgICAgICAgICAkczogaSxcbiAgICAgICAgICAgIHJlYWRUaW1lOiB2aShyKVxuICAgICAgICB9KSkpO1xuICAgIH1cbiAgICAvKipcbiAqIFJldHVybnMgdGhlIHJlYWQgdGltZSBvZiB0aGUgbW9zdCByZWNlbnRseSByZWFkIGRvY3VtZW50IGluIHRoZSBjYWNoZSwgb3JcbiAqIFNuYXBzaG90VmVyc2lvbi5taW4oKSBpZiBub3QgYXZhaWxhYmxlLlxuICovXG4gICAgLy8gUE9SVElORyBOT1RFOiBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgbXVsdGktdGFiIHN5bmNocm9uaXphdGlvbi5cbiAgICAoZS5vaSwgdCwgZS5yaSkpKS50aGVuKCgoeyRzOiB0LCByZWFkVGltZTogbn0pID0+IChlLnJpID0gbiwgdCkpKTtcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgbmV3ZXN0IGRvY3VtZW50IGNoYW5nZSBmcm9tIHBlcnNpc3RlbmNlIGFuZCBtb3ZlcyB0aGUgaW50ZXJuYWxcbiAqIHN5bmNocm9uaXphdGlvbiBtYXJrZXIgZm9yd2FyZCBzbyB0aGF0IGNhbGxzIHRvIGBnZXROZXdEb2N1bWVudENoYW5nZXMoKWBcbiAqIG9ubHkgcmV0dXJuIGNoYW5nZXMgdGhhdCBoYXBwZW5lZCBhZnRlciBjbGllbnQgaW5pdGlhbGl6YXRpb24uXG4gKi9cbi8vIFBPUlRJTkcgTk9URTogTXVsdGktVGFiIG9ubHkuXG5hc3luYyBmdW5jdGlvbiBpbyh0KSB7XG4gICAgY29uc3QgZSA9IEsodCk7XG4gICAgcmV0dXJuIGUucGVyc2lzdGVuY2UucnVuVHJhbnNhY3Rpb24oXCJTeW5jaHJvbml6ZSBsYXN0IGRvY3VtZW50IGNoYW5nZSByZWFkIHRpbWVcIiwgXCJyZWFkb25seVwiLCAodCA9PiBmdW5jdGlvbih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB4cih0KTtcbiAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGV4aXN0aW5nIGVudHJpZXMsIHdlIHJldHVybiBTbmFwc2hvdFZlcnNpb24ubWluKCkuXG4gICAgICAgICAgICAgICAgbGV0IG4gPSBjdC5taW4oKTtcbiAgICAgICAgcmV0dXJuIGUuV3Qoe1xuICAgICAgICAgICAgaW5kZXg6IFwicmVhZFRpbWVJbmRleFwiLFxuICAgICAgICAgICAgcmV2ZXJzZTogITBcbiAgICAgICAgfSwgKCh0LCBlLCBzKSA9PiB7XG4gICAgICAgICAgICBlLnJlYWRUaW1lICYmIChuID0gdmkoZS5yZWFkVGltZSkpLCBzLmRvbmUoKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IG4pKTtcbiAgICB9KHQpKSkudGhlbigodCA9PiB7XG4gICAgICAgIGUucmkgPSB0O1xuICAgIH0pKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHRhcmdldCB1c2luZyB0aGUgZ2l2ZW4gYnVuZGxlIG5hbWUsIHdoaWNoIHdpbGwgYmUgdXNlZCB0b1xuICogaG9sZCB0aGUga2V5cyBvZiBhbGwgZG9jdW1lbnRzIGZyb20gdGhlIGJ1bmRsZSBpbiBxdWVyeS1kb2N1bWVudCBtYXBwaW5ncy5cbiAqIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBsb2FkZWQgZG9jdW1lbnRzIGRvIG5vdCBnZXQgZ2FyYmFnZSBjb2xsZWN0ZWRcbiAqIHJpZ2h0IGF3YXkuXG4gKi9cbi8qKlxuICogQXBwbGllcyB0aGUgZG9jdW1lbnRzIGZyb20gYSBidW5kbGUgdG8gdGhlIFwiZ3JvdW5kLXN0YXRlXCIgKHJlbW90ZSlcbiAqIGRvY3VtZW50cy5cbiAqXG4gKiBMb2NhbERvY3VtZW50cyBhcmUgcmUtY2FsY3VsYXRlZCBpZiB0aGVyZSBhcmUgcmVtYWluaW5nIG11dGF0aW9ucyBpbiB0aGVcbiAqIHF1ZXVlLlxuICovXG5hc3luYyBmdW5jdGlvbiBybyh0LCBlLCBuLCBzKSB7XG4gICAgY29uc3QgaSA9IEsodCk7XG4gICAgbGV0IHIgPSBHbigpLCBvID0gRm4oKTtcbiAgICBmb3IgKGNvbnN0IHQgb2Ygbikge1xuICAgICAgICBjb25zdCBuID0gZS5saSh0Lm1ldGFkYXRhLm5hbWUpO1xuICAgICAgICB0LmRvY3VtZW50ICYmIChyID0gci5hZGQobikpO1xuICAgICAgICBjb25zdCBzID0gZS5maSh0KTtcbiAgICAgICAgcy5zZXRSZWFkVGltZShlLmRpKHQubWV0YWRhdGEucmVhZFRpbWUpKSwgbyA9IG8uaW5zZXJ0KG4sIHMpO1xuICAgIH1cbiAgICBjb25zdCBhID0gaS5vaS5uZXdDaGFuZ2VCdWZmZXIoe1xuICAgICAgICB0cmFja1JlbW92YWxzOiAhMFxuICAgIH0pLCB1ID0gYXdhaXQgWnIoaSwgZnVuY3Rpb24odCkge1xuICAgICAgICAvLyBJdCBpcyBPSyB0aGF0IHRoZSBwYXRoIHVzZWQgZm9yIHRoZSBxdWVyeSBpcyBub3QgdmFsaWQsIGJlY2F1c2UgdGhpcyB3aWxsXG4gICAgICAgIC8vIG5vdCBiZSByZWFkIGFuZCBxdWVyaWVkLlxuICAgICAgICByZXR1cm4gJGUoRGUoX3QuZnJvbVN0cmluZyhgX19idW5kbGVfXy9kb2NzLyR7dH1gKSkpO1xuICAgIH0ocykpO1xuICAgIC8vIEFsbG9jYXRlcyBhIHRhcmdldCB0byBob2xkIGFsbCBkb2N1bWVudCBrZXlzIGZyb20gdGhlIGJ1bmRsZSwgc3VjaCB0aGF0XG4gICAgLy8gdGhleSB3aWxsIG5vdCBnZXQgZ2FyYmFnZSBjb2xsZWN0ZWQgcmlnaHQgYXdheS5cbiAgICAgICAgcmV0dXJuIGkucGVyc2lzdGVuY2UucnVuVHJhbnNhY3Rpb24oXCJBcHBseSBidW5kbGUgZG9jdW1lbnRzXCIsIFwicmVhZHdyaXRlXCIsICh0ID0+IFlyKHQsIGEsIG8pLm5leHQoKGUgPT4gKGEuYXBwbHkodCksIFxuICAgIGUpKSkubmV4dCgoZSA9PiBpLmhzLnJlbW92ZU1hdGNoaW5nS2V5c0ZvclRhcmdldElkKHQsIHUudGFyZ2V0SWQpLm5leHQoKCgpID0+IGkuaHMuYWRkTWF0Y2hpbmdLZXlzKHQsIHIsIHUudGFyZ2V0SWQpKSkubmV4dCgoKCkgPT4gaS51aS5Lcyh0LCBlKSkpLm5leHQoKCgpID0+IGUpKSkpKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHByb21pc2Ugb2YgYSBib29sZWFuIHRvIGluZGljYXRlIGlmIHRoZSBnaXZlbiBidW5kbGUgaGFzIGFscmVhZHlcbiAqIGJlZW4gbG9hZGVkIGFuZCB0aGUgY3JlYXRlIHRpbWUgaXMgbmV3ZXIgdGhhbiB0aGUgY3VycmVudCBsb2FkaW5nIGJ1bmRsZS5cbiAqL1xuLyoqXG4gKiBTYXZlcyB0aGUgZ2l2ZW4gYE5hbWVkUXVlcnlgIHRvIGxvY2FsIHBlcnNpc3RlbmNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBvbyh0LCBlLCBuID0gR24oKSkge1xuICAgIC8vIEFsbG9jYXRlIGEgdGFyZ2V0IGZvciB0aGUgbmFtZWQgcXVlcnkgc3VjaCB0aGF0IGl0IGNhbiBiZSByZXN1bWVkXG4gICAgLy8gZnJvbSBhc3NvY2lhdGVkIHJlYWQgdGltZSBpZiB1c2VycyB1c2UgaXQgdG8gbGlzdGVuLlxuICAgIC8vIE5PVEU6IHRoaXMgYWxzbyBtZWFucyBpZiBubyBjb3JyZXNwb25kaW5nIHRhcmdldCBleGlzdHMsIHRoZSBuZXcgdGFyZ2V0XG4gICAgLy8gd2lsbCByZW1haW4gYWN0aXZlIGFuZCB3aWxsIG5vdCBnZXQgY29sbGVjdGVkLCB1bmxlc3MgdXNlcnMgaGFwcGVuIHRvXG4gICAgLy8gdW5saXN0ZW4gdGhlIHF1ZXJ5IHNvbWVob3cuXG4gICAgY29uc3QgcyA9IGF3YWl0IFpyKHQsICRlKGtpKGUuYnVuZGxlZFF1ZXJ5KSkpLCBpID0gSyh0KTtcbiAgICByZXR1cm4gaS5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIlNhdmUgbmFtZWQgcXVlcnlcIiwgXCJyZWFkd3JpdGVcIiwgKHQgPT4ge1xuICAgICAgICBjb25zdCByID0gdXMoZS5yZWFkVGltZSk7XG4gICAgICAgIC8vIFNpbXBseSBzYXZlIHRoZSBxdWVyeSBpdHNlbGYgaWYgaXQgaXMgb2xkZXIgdGhhbiB3aGF0IHRoZSBTREsgYWxyZWFkeVxuICAgICAgICAvLyBoYXMuXG4gICAgICAgICAgICAgICAgaWYgKHMuc25hcHNob3RWZXJzaW9uLmNvbXBhcmVUbyhyKSA+PSAwKSByZXR1cm4gaS5mcy5zYXZlTmFtZWRRdWVyeSh0LCBlKTtcbiAgICAgICAgLy8gVXBkYXRlIGV4aXN0aW5nIHRhcmdldCBkYXRhIGJlY2F1c2UgdGhlIHF1ZXJ5IGZyb20gdGhlIGJ1bmRsZSBpcyBuZXdlci5cbiAgICAgICAgICAgICAgICBjb25zdCBvID0gcy53aXRoUmVzdW1lVG9rZW4ocHQuRU1QVFlfQllURV9TVFJJTkcsIHIpO1xuICAgICAgICByZXR1cm4gaS5zaSA9IGkuc2kuaW5zZXJ0KG8udGFyZ2V0SWQsIG8pLCBpLmhzLnVwZGF0ZVRhcmdldERhdGEodCwgbykubmV4dCgoKCkgPT4gaS5ocy5yZW1vdmVNYXRjaGluZ0tleXNGb3JUYXJnZXRJZCh0LCBzLnRhcmdldElkKSkpLm5leHQoKCgpID0+IGkuaHMuYWRkTWF0Y2hpbmdLZXlzKHQsIG4sIHMudGFyZ2V0SWQpKSkubmV4dCgoKCkgPT4gaS5mcy5zYXZlTmFtZWRRdWVyeSh0LCBlKSkpO1xuICAgIH0pKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gY2xhc3MgYW8ge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5NID0gdCwgdGhpcy5faSA9IG5ldyBNYXAsIHRoaXMud2kgPSBuZXcgTWFwO1xuICAgIH1cbiAgICBnZXRCdW5kbGVNZXRhZGF0YSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB1aS5yZXNvbHZlKHRoaXMuX2kuZ2V0KGUpKTtcbiAgICB9XG4gICAgc2F2ZUJ1bmRsZU1ldGFkYXRhKHQsIGUpIHtcbiAgICAgICAgLyoqIERlY29kZXMgYSBCdW5kbGVNZXRhZGF0YSBwcm90byBpbnRvIGEgQnVuZGxlTWV0YWRhdGEgb2JqZWN0LiAqL1xuICAgICAgICB2YXIgbjtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2kuc2V0KGUuaWQsIHtcbiAgICAgICAgICAgIGlkOiAobiA9IGUpLmlkLFxuICAgICAgICAgICAgdmVyc2lvbjogbi52ZXJzaW9uLFxuICAgICAgICAgICAgY3JlYXRlVGltZTogdXMobi5jcmVhdGVUaW1lKVxuICAgICAgICB9KSwgdWkucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBnZXROYW1lZFF1ZXJ5KHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHVpLnJlc29sdmUodGhpcy53aS5nZXQoZSkpO1xuICAgIH1cbiAgICBzYXZlTmFtZWRRdWVyeSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndpLnNldChlLm5hbWUsIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogdC5uYW1lLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiBraSh0LmJ1bmRsZWRRdWVyeSksXG4gICAgICAgICAgICAgICAgcmVhZFRpbWU6IHVzKHQucmVhZFRpbWUpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KGUpKSwgdWkucmVzb2x2ZSgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQW4gaW4tbWVtb3J5IGltcGxlbWVudGF0aW9uIG9mIERvY3VtZW50T3ZlcmxheUNhY2hlLlxuICovIGNsYXNzIHVvIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy8gQSBtYXAgc29ydGVkIGJ5IERvY3VtZW50S2V5LCB3aG9zZSB2YWx1ZSBpcyBhIHBhaXIgb2YgdGhlIGxhcmdlc3QgYmF0Y2ggaWRcbiAgICAgICAgLy8gZm9yIHRoZSBvdmVybGF5IGFuZCB0aGUgb3ZlcmxheSBpdHNlbGYuXG4gICAgICAgIHRoaXMub3ZlcmxheXMgPSBuZXcgQ24oeHQuY29tcGFyYXRvciksIHRoaXMubWkgPSBuZXcgTWFwO1xuICAgIH1cbiAgICBnZXRPdmVybGF5KHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHVpLnJlc29sdmUodGhpcy5vdmVybGF5cy5nZXQoZSkpO1xuICAgIH1cbiAgICBzYXZlT3ZlcmxheXModCwgZSwgbikge1xuICAgICAgICByZXR1cm4gbi5mb3JFYWNoKCgobiwgcykgPT4ge1xuICAgICAgICAgICAgdGhpcy5YdCh0LCBlLCBzKTtcbiAgICAgICAgfSkpLCB1aS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIHJlbW92ZU92ZXJsYXlzRm9yQmF0Y2hJZCh0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSB0aGlzLm1pLmdldChuKTtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gcyAmJiAocy5mb3JFYWNoKCh0ID0+IHRoaXMub3ZlcmxheXMgPSB0aGlzLm92ZXJsYXlzLnJlbW92ZSh0KSkpLCBcbiAgICAgICAgdGhpcy5taS5kZWxldGUobikpLCB1aS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGdldE92ZXJsYXlzRm9yQ29sbGVjdGlvbih0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSBxbigpLCBpID0gZS5sZW5ndGggKyAxLCByID0gbmV3IHh0KGUuY2hpbGQoXCJcIikpLCBvID0gdGhpcy5vdmVybGF5cy5nZXRJdGVyYXRvckZyb20ocik7XG4gICAgICAgIGZvciAoO28uaGFzTmV4dCgpOyApIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBvLmdldE5leHQoKS52YWx1ZSwgciA9IHQuZ2V0S2V5KCk7XG4gICAgICAgICAgICBpZiAoIWUuaXNQcmVmaXhPZihyLnBhdGgpKSBicmVhaztcbiAgICAgICAgICAgIC8vIERvY3VtZW50cyBmcm9tIHN1Yi1jb2xsZWN0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgci5wYXRoLmxlbmd0aCA9PT0gaSAmJiAodC5sYXJnZXN0QmF0Y2hJZCA+IG4gJiYgcy5zZXQodC5nZXRLZXkoKSwgdCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1aS5yZXNvbHZlKHMpO1xuICAgIH1cbiAgICBnZXRPdmVybGF5c0ZvckNvbGxlY3Rpb25Hcm91cCh0LCBlLCBuLCBzKSB7XG4gICAgICAgIGxldCBpID0gbmV3IENuKCgodCwgZSkgPT4gdCAtIGUpKTtcbiAgICAgICAgY29uc3QgciA9IHRoaXMub3ZlcmxheXMuZ2V0SXRlcmF0b3IoKTtcbiAgICAgICAgZm9yICg7ci5oYXNOZXh0KCk7ICkge1xuICAgICAgICAgICAgY29uc3QgdCA9IHIuZ2V0TmV4dCgpLnZhbHVlO1xuICAgICAgICAgICAgaWYgKHQuZ2V0S2V5KCkuZ2V0Q29sbGVjdGlvbkdyb3VwKCkgPT09IGUgJiYgdC5sYXJnZXN0QmF0Y2hJZCA+IG4pIHtcbiAgICAgICAgICAgICAgICBsZXQgZSA9IGkuZ2V0KHQubGFyZ2VzdEJhdGNoSWQpO1xuICAgICAgICAgICAgICAgIG51bGwgPT09IGUgJiYgKGUgPSBxbigpLCBpID0gaS5pbnNlcnQodC5sYXJnZXN0QmF0Y2hJZCwgZSkpLCBlLnNldCh0LmdldEtleSgpLCB0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvID0gcW4oKSwgYSA9IGkuZ2V0SXRlcmF0b3IoKTtcbiAgICAgICAgZm9yICg7YS5oYXNOZXh0KCk7ICkge1xuICAgICAgICAgICAgaWYgKGEuZ2V0TmV4dCgpLnZhbHVlLmZvckVhY2goKCh0LCBlKSA9PiBvLnNldCh0LCBlKSkpLCBvLnNpemUoKSA+PSBzKSBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdWkucmVzb2x2ZShvKTtcbiAgICB9XG4gICAgWHQodCwgZSwgbikge1xuICAgICAgICBpZiAobnVsbCA9PT0gbikgcmV0dXJuO1xuICAgICAgICAvLyBSZW1vdmUgdGhlIGFzc29jaWF0aW9uIG9mIHRoZSBvdmVybGF5IHRvIGl0cyBiYXRjaCBpZC5cbiAgICAgICAgICAgICAgICBjb25zdCBzID0gdGhpcy5vdmVybGF5cy5nZXQobi5rZXkpO1xuICAgICAgICBpZiAobnVsbCAhPT0gcykge1xuICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMubWkuZ2V0KHMubGFyZ2VzdEJhdGNoSWQpLmRlbGV0ZShuLmtleSk7XG4gICAgICAgICAgICB0aGlzLm1pLnNldChzLmxhcmdlc3RCYXRjaElkLCB0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm92ZXJsYXlzID0gdGhpcy5vdmVybGF5cy5pbnNlcnQobi5rZXksIG5ldyBFaShlLCBuKSk7XG4gICAgICAgIC8vIENyZWF0ZSB0aGUgYXNzb2NpYXRpb24gb2YgdGhpcyBvdmVybGF5IHRvIHRoZSBnaXZlbiBsYXJnZXN0QmF0Y2hJZC5cbiAgICAgICAgbGV0IGkgPSB0aGlzLm1pLmdldChlKTtcbiAgICAgICAgdm9pZCAwID09PSBpICYmIChpID0gR24oKSwgdGhpcy5taS5zZXQoZSwgaSkpLCB0aGlzLm1pLnNldChlLCBpLmFkZChuLmtleSkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHJlZmVyZW5jZXMgdG8gYSBkb2N1bWVudCBmcm9tIHNvbWUga2luZCBvZiBudW1iZXJlZCBlbnRpdHlcbiAqIChlaXRoZXIgYSB0YXJnZXQgSUQgb3IgYmF0Y2ggSUQpLiBBcyByZWZlcmVuY2VzIGFyZSBhZGRlZCB0byBvciByZW1vdmVkIGZyb21cbiAqIHRoZSBzZXQgY29ycmVzcG9uZGluZyBldmVudHMgYXJlIGVtaXR0ZWQgdG8gYSByZWdpc3RlcmVkIGdhcmJhZ2UgY29sbGVjdG9yLlxuICpcbiAqIEVhY2ggcmVmZXJlbmNlIGlzIHJlcHJlc2VudGVkIGJ5IGEgRG9jdW1lbnRSZWZlcmVuY2Ugb2JqZWN0LiBFYWNoIG9mIHRoZW1cbiAqIGNvbnRhaW5zIGVub3VnaCBpbmZvcm1hdGlvbiB0byB1bmlxdWVseSBpZGVudGlmeSB0aGUgcmVmZXJlbmNlLiBUaGV5IGFyZSBhbGxcbiAqIHN0b3JlZCBwcmltYXJpbHkgaW4gYSBzZXQgc29ydGVkIGJ5IGtleS4gQSBkb2N1bWVudCBpcyBjb25zaWRlcmVkIGdhcmJhZ2UgaWZcbiAqIHRoZXJlJ3Mgbm8gcmVmZXJlbmNlcyBpbiB0aGF0IHNldCAodGhpcyBjYW4gYmUgZWZmaWNpZW50bHkgY2hlY2tlZCB0aGFua3MgdG9cbiAqIHNvcnRpbmcgYnkga2V5KS5cbiAqXG4gKiBSZWZlcmVuY2VTZXQgYWxzbyBrZWVwcyBhIHNlY29uZGFyeSBzZXQgdGhhdCBjb250YWlucyByZWZlcmVuY2VzIHNvcnRlZCBieVxuICogSURzLiBUaGlzIG9uZSBpcyB1c2VkIHRvIGVmZmljaWVudGx5IGltcGxlbWVudCByZW1vdmFsIG9mIGFsbCByZWZlcmVuY2VzIGJ5XG4gKiBzb21lIHRhcmdldCBJRC5cbiAqLyBjbGFzcyBjbyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vIEEgc2V0IG9mIG91dHN0YW5kaW5nIHJlZmVyZW5jZXMgdG8gYSBkb2N1bWVudCBzb3J0ZWQgYnkga2V5LlxuICAgICAgICB0aGlzLmdpID0gbmV3IGtuKGhvLnlpKSwgXG4gICAgICAgIC8vIEEgc2V0IG9mIG91dHN0YW5kaW5nIHJlZmVyZW5jZXMgdG8gYSBkb2N1bWVudCBzb3J0ZWQgYnkgdGFyZ2V0IGlkLlxuICAgICAgICB0aGlzLnBpID0gbmV3IGtuKGhvLklpKTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVmZXJlbmNlIHNldCBjb250YWlucyBubyByZWZlcmVuY2VzLiAqLyAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5naS5pc0VtcHR5KCk7XG4gICAgfVxuICAgIC8qKiBBZGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBnaXZlbiBkb2N1bWVudCBrZXkgZm9yIHRoZSBnaXZlbiBJRC4gKi8gICAgYWRkUmVmZXJlbmNlKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IG5ldyBobyh0LCBlKTtcbiAgICAgICAgdGhpcy5naSA9IHRoaXMuZ2kuYWRkKG4pLCB0aGlzLnBpID0gdGhpcy5waS5hZGQobik7XG4gICAgfVxuICAgIC8qKiBBZGQgcmVmZXJlbmNlcyB0byB0aGUgZ2l2ZW4gZG9jdW1lbnQga2V5cyBmb3IgdGhlIGdpdmVuIElELiAqLyAgICBUaSh0LCBlKSB7XG4gICAgICAgIHQuZm9yRWFjaCgodCA9PiB0aGlzLmFkZFJlZmVyZW5jZSh0LCBlKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgcmVmZXJlbmNlIHRvIHRoZSBnaXZlbiBkb2N1bWVudCBrZXkgZm9yIHRoZSBnaXZlblxuICAgICAqIElELlxuICAgICAqLyAgICByZW1vdmVSZWZlcmVuY2UodCwgZSkge1xuICAgICAgICB0aGlzLkVpKG5ldyBobyh0LCBlKSk7XG4gICAgfVxuICAgIEFpKHQsIGUpIHtcbiAgICAgICAgdC5mb3JFYWNoKCh0ID0+IHRoaXMucmVtb3ZlUmVmZXJlbmNlKHQsIGUpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFycyBhbGwgcmVmZXJlbmNlcyB3aXRoIGEgZ2l2ZW4gSUQuIENhbGxzIHJlbW92ZVJlZigpIGZvciBlYWNoIGtleVxuICAgICAqIHJlbW92ZWQuXG4gICAgICovICAgIFJpKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IG5ldyB4dChuZXcgX3QoW10pKSwgbiA9IG5ldyBobyhlLCB0KSwgcyA9IG5ldyBobyhlLCB0ICsgMSksIGkgPSBbXTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGkuZm9yRWFjaEluUmFuZ2UoWyBuLCBzIF0sICh0ID0+IHtcbiAgICAgICAgICAgIHRoaXMuRWkodCksIGkucHVzaCh0LmtleSk7XG4gICAgICAgIH0pKSwgaTtcbiAgICB9XG4gICAgYmkoKSB7XG4gICAgICAgIHRoaXMuZ2kuZm9yRWFjaCgodCA9PiB0aGlzLkVpKHQpKSk7XG4gICAgfVxuICAgIEVpKHQpIHtcbiAgICAgICAgdGhpcy5naSA9IHRoaXMuZ2kuZGVsZXRlKHQpLCB0aGlzLnBpID0gdGhpcy5waS5kZWxldGUodCk7XG4gICAgfVxuICAgIFBpKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IG5ldyB4dChuZXcgX3QoW10pKSwgbiA9IG5ldyBobyhlLCB0KSwgcyA9IG5ldyBobyhlLCB0ICsgMSk7XG4gICAgICAgIGxldCBpID0gR24oKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGkuZm9yRWFjaEluUmFuZ2UoWyBuLCBzIF0sICh0ID0+IHtcbiAgICAgICAgICAgIGkgPSBpLmFkZCh0LmtleSk7XG4gICAgICAgIH0pKSwgaTtcbiAgICB9XG4gICAgY29udGFpbnNLZXkodCkge1xuICAgICAgICBjb25zdCBlID0gbmV3IGhvKHQsIDApLCBuID0gdGhpcy5naS5maXJzdEFmdGVyT3JFcXVhbChlKTtcbiAgICAgICAgcmV0dXJuIG51bGwgIT09IG4gJiYgdC5pc0VxdWFsKG4ua2V5KTtcbiAgICB9XG59XG5cbmNsYXNzIGhvIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMua2V5ID0gdCwgdGhpcy5WaSA9IGU7XG4gICAgfVxuICAgIC8qKiBDb21wYXJlIGJ5IGtleSB0aGVuIGJ5IElEICovICAgIHN0YXRpYyB5aSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB4dC5jb21wYXJhdG9yKHQua2V5LCBlLmtleSkgfHwgcnQodC5WaSwgZS5WaSk7XG4gICAgfVxuICAgIC8qKiBDb21wYXJlIGJ5IElEIHRoZW4gYnkga2V5ICovICAgIHN0YXRpYyBJaSh0LCBlKSB7XG4gICAgICAgIHJldHVybiBydCh0LlZpLCBlLlZpKSB8fCB4dC5jb21wYXJhdG9yKHQua2V5LCBlLmtleSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjbGFzcyBsbyB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLmluZGV4TWFuYWdlciA9IHQsIHRoaXMucmVmZXJlbmNlRGVsZWdhdGUgPSBlLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBzZXQgb2YgYWxsIG11dGF0aW9ucyB0aGF0IGhhdmUgYmVlbiBzZW50IGJ1dCBub3QgeWV0IGJlZW4gYXBwbGllZCB0b1xuICAgICAgICAgKiB0aGUgYmFja2VuZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuRnMgPSBbXSwgXG4gICAgICAgIC8qKiBOZXh0IHZhbHVlIHRvIHVzZSB3aGVuIGFzc2lnbmluZyBzZXF1ZW50aWFsIElEcyB0byBlYWNoIG11dGF0aW9uIGJhdGNoLiAqL1xuICAgICAgICB0aGlzLnZpID0gMSwgXG4gICAgICAgIC8qKiBBbiBvcmRlcmVkIG1hcHBpbmcgYmV0d2VlbiBkb2N1bWVudHMgYW5kIHRoZSBtdXRhdGlvbnMgYmF0Y2ggSURzLiAqL1xuICAgICAgICB0aGlzLlNpID0gbmV3IGtuKGhvLnlpKTtcbiAgICB9XG4gICAgY2hlY2tFbXB0eSh0KSB7XG4gICAgICAgIHJldHVybiB1aS5yZXNvbHZlKDAgPT09IHRoaXMuRnMubGVuZ3RoKTtcbiAgICB9XG4gICAgYWRkTXV0YXRpb25CYXRjaCh0LCBlLCBuLCBzKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLnZpO1xuICAgICAgICB0aGlzLnZpKyssIHRoaXMuRnMubGVuZ3RoID4gMCAmJiB0aGlzLkZzW3RoaXMuRnMubGVuZ3RoIC0gMV07XG4gICAgICAgIGNvbnN0IHIgPSBuZXcgSWkoaSwgZSwgbiwgcyk7XG4gICAgICAgIHRoaXMuRnMucHVzaChyKTtcbiAgICAgICAgLy8gVHJhY2sgcmVmZXJlbmNlcyBieSBkb2N1bWVudCBrZXkgYW5kIGluZGV4IGNvbGxlY3Rpb24gcGFyZW50cy5cbiAgICAgICAgZm9yIChjb25zdCBlIG9mIHMpIHRoaXMuU2kgPSB0aGlzLlNpLmFkZChuZXcgaG8oZS5rZXksIGkpKSwgdGhpcy5pbmRleE1hbmFnZXIuYWRkVG9Db2xsZWN0aW9uUGFyZW50SW5kZXgodCwgZS5rZXkucGF0aC5wb3BMYXN0KCkpO1xuICAgICAgICByZXR1cm4gdWkucmVzb2x2ZShyKTtcbiAgICB9XG4gICAgbG9va3VwTXV0YXRpb25CYXRjaCh0LCBlKSB7XG4gICAgICAgIHJldHVybiB1aS5yZXNvbHZlKHRoaXMuRGkoZSkpO1xuICAgIH1cbiAgICBnZXROZXh0TXV0YXRpb25CYXRjaEFmdGVyQmF0Y2hJZCh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBlICsgMSwgcyA9IHRoaXMuQ2kobiksIGkgPSBzIDwgMCA/IDAgOiBzO1xuICAgICAgICAvLyBUaGUgcmVxdWVzdGVkIGJhdGNoSWQgbWF5IHN0aWxsIGJlIG91dCBvZiByYW5nZSBzbyBub3JtYWxpemUgaXQgdG8gdGhlXG4gICAgICAgIC8vIHN0YXJ0IG9mIHRoZSBxdWV1ZS5cbiAgICAgICAgICAgICAgICByZXR1cm4gdWkucmVzb2x2ZSh0aGlzLkZzLmxlbmd0aCA+IGkgPyB0aGlzLkZzW2ldIDogbnVsbCk7XG4gICAgfVxuICAgIGdldEhpZ2hlc3RVbmFja25vd2xlZGdlZEJhdGNoSWQoKSB7XG4gICAgICAgIHJldHVybiB1aS5yZXNvbHZlKDAgPT09IHRoaXMuRnMubGVuZ3RoID8gLTEgOiB0aGlzLnZpIC0gMSk7XG4gICAgfVxuICAgIGdldEFsbE11dGF0aW9uQmF0Y2hlcyh0KSB7XG4gICAgICAgIHJldHVybiB1aS5yZXNvbHZlKHRoaXMuRnMuc2xpY2UoKSk7XG4gICAgfVxuICAgIGdldEFsbE11dGF0aW9uQmF0Y2hlc0FmZmVjdGluZ0RvY3VtZW50S2V5KHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IG5ldyBobyhlLCAwKSwgcyA9IG5ldyBobyhlLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpLCBpID0gW107XG4gICAgICAgIHJldHVybiB0aGlzLlNpLmZvckVhY2hJblJhbmdlKFsgbiwgcyBdLCAodCA9PiB7XG4gICAgICAgICAgICBjb25zdCBlID0gdGhpcy5EaSh0LlZpKTtcbiAgICAgICAgICAgIGkucHVzaChlKTtcbiAgICAgICAgfSkpLCB1aS5yZXNvbHZlKGkpO1xuICAgIH1cbiAgICBnZXRBbGxNdXRhdGlvbkJhdGNoZXNBZmZlY3RpbmdEb2N1bWVudEtleXModCwgZSkge1xuICAgICAgICBsZXQgbiA9IG5ldyBrbihydCk7XG4gICAgICAgIHJldHVybiBlLmZvckVhY2goKHQgPT4ge1xuICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBobyh0LCAwKSwgcyA9IG5ldyBobyh0LCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuICAgICAgICAgICAgdGhpcy5TaS5mb3JFYWNoSW5SYW5nZShbIGUsIHMgXSwgKHQgPT4ge1xuICAgICAgICAgICAgICAgIG4gPSBuLmFkZCh0LlZpKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSkpLCB1aS5yZXNvbHZlKHRoaXMueGkobikpO1xuICAgIH1cbiAgICBnZXRBbGxNdXRhdGlvbkJhdGNoZXNBZmZlY3RpbmdRdWVyeSh0LCBlKSB7XG4gICAgICAgIC8vIFVzZSB0aGUgcXVlcnkgcGF0aCBhcyBhIHByZWZpeCBmb3IgdGVzdGluZyBpZiBhIGRvY3VtZW50IG1hdGNoZXMgdGhlXG4gICAgICAgIC8vIHF1ZXJ5LlxuICAgICAgICBjb25zdCBuID0gZS5wYXRoLCBzID0gbi5sZW5ndGggKyAxO1xuICAgICAgICAvLyBDb25zdHJ1Y3QgYSBkb2N1bWVudCByZWZlcmVuY2UgZm9yIGFjdHVhbGx5IHNjYW5uaW5nIHRoZSBpbmRleC4gVW5saWtlXG4gICAgICAgIC8vIHRoZSBwcmVmaXggdGhlIGRvY3VtZW50IGtleSBpbiB0aGlzIHJlZmVyZW5jZSBtdXN0IGhhdmUgYW4gZXZlbiBudW1iZXIgb2ZcbiAgICAgICAgLy8gc2VnbWVudHMuIFRoZSBlbXB0eSBzZWdtZW50IGNhbiBiZSB1c2VkIGEgc3VmZml4IG9mIHRoZSBxdWVyeSBwYXRoXG4gICAgICAgIC8vIGJlY2F1c2UgaXQgcHJlY2VkZXMgYWxsIG90aGVyIHNlZ21lbnRzIGluIGFuIG9yZGVyZWQgdHJhdmVyc2FsLlxuICAgICAgICBsZXQgaSA9IG47XG4gICAgICAgIHh0LmlzRG9jdW1lbnRLZXkoaSkgfHwgKGkgPSBpLmNoaWxkKFwiXCIpKTtcbiAgICAgICAgY29uc3QgciA9IG5ldyBobyhuZXcgeHQoaSksIDApO1xuICAgICAgICAvLyBGaW5kIHVuaXF1ZSBiYXRjaElEcyByZWZlcmVuY2VkIGJ5IGFsbCBkb2N1bWVudHMgcG90ZW50aWFsbHkgbWF0Y2hpbmcgdGhlXG4gICAgICAgIC8vIHF1ZXJ5LlxuICAgICAgICAgICAgICAgIGxldCBvID0gbmV3IGtuKHJ0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuU2kuZm9yRWFjaFdoaWxlKCh0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0LmtleS5wYXRoO1xuICAgICAgICAgICAgcmV0dXJuICEhbi5pc1ByZWZpeE9mKGUpICYmIChcbiAgICAgICAgICAgIC8vIFJvd3Mgd2l0aCBkb2N1bWVudCBrZXlzIG1vcmUgdGhhbiBvbmUgc2VnbWVudCBsb25nZXIgdGhhbiB0aGUgcXVlcnlcbiAgICAgICAgICAgIC8vIHBhdGggY2FuJ3QgYmUgbWF0Y2hlcy4gRm9yIGV4YW1wbGUsIGEgcXVlcnkgb24gJ3Jvb21zJyBjYW4ndCBtYXRjaFxuICAgICAgICAgICAgLy8gdGhlIGRvY3VtZW50IC9yb29tcy9hYmMvbWVzc2FnZXMveHl4LlxuICAgICAgICAgICAgLy8gVE9ETyhtY2cpOiB3ZSdsbCBuZWVkIGEgZGlmZmVyZW50IHNjYW5uZXIgd2hlbiB3ZSBpbXBsZW1lbnRcbiAgICAgICAgICAgIC8vIGFuY2VzdG9yIHF1ZXJpZXMuXG4gICAgICAgICAgICBlLmxlbmd0aCA9PT0gcyAmJiAobyA9IG8uYWRkKHQuVmkpKSwgITApO1xuICAgICAgICB9KSwgciksIHVpLnJlc29sdmUodGhpcy54aShvKSk7XG4gICAgfVxuICAgIHhpKHQpIHtcbiAgICAgICAgLy8gQ29uc3RydWN0IGFuIGFycmF5IG9mIG1hdGNoaW5nIGJhdGNoZXMsIHNvcnRlZCBieSBiYXRjaElEIHRvIGVuc3VyZSB0aGF0XG4gICAgICAgIC8vIG11bHRpcGxlIG11dGF0aW9ucyBhZmZlY3RpbmcgdGhlIHNhbWUgZG9jdW1lbnQga2V5IGFyZSBhcHBsaWVkIGluIG9yZGVyLlxuICAgICAgICBjb25zdCBlID0gW107XG4gICAgICAgIHJldHVybiB0LmZvckVhY2goKHQgPT4ge1xuICAgICAgICAgICAgY29uc3QgbiA9IHRoaXMuRGkodCk7XG4gICAgICAgICAgICBudWxsICE9PSBuICYmIGUucHVzaChuKTtcbiAgICAgICAgfSkpLCBlO1xuICAgIH1cbiAgICByZW1vdmVNdXRhdGlvbkJhdGNoKHQsIGUpIHtcbiAgICAgICAgcSgwID09PSB0aGlzLk5pKGUuYmF0Y2hJZCwgXCJyZW1vdmVkXCIpKSwgdGhpcy5Gcy5zaGlmdCgpO1xuICAgICAgICBsZXQgbiA9IHRoaXMuU2k7XG4gICAgICAgIHJldHVybiB1aS5mb3JFYWNoKGUubXV0YXRpb25zLCAocyA9PiB7XG4gICAgICAgICAgICBjb25zdCBpID0gbmV3IGhvKHMua2V5LCBlLmJhdGNoSWQpO1xuICAgICAgICAgICAgcmV0dXJuIG4gPSBuLmRlbGV0ZShpKSwgdGhpcy5yZWZlcmVuY2VEZWxlZ2F0ZS5tYXJrUG90ZW50aWFsbHlPcnBoYW5lZCh0LCBzLmtleSk7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLlNpID0gbjtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBkbih0KSB7XG4gICAgICAgIC8vIE5vLW9wIHNpbmNlIHRoZSBtZW1vcnkgbXV0YXRpb24gcXVldWUgZG9lcyBub3QgbWFpbnRhaW4gYSBzZXBhcmF0ZSBjYWNoZS5cbiAgICB9XG4gICAgY29udGFpbnNLZXkodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gbmV3IGhvKGUsIDApLCBzID0gdGhpcy5TaS5maXJzdEFmdGVyT3JFcXVhbChuKTtcbiAgICAgICAgcmV0dXJuIHVpLnJlc29sdmUoZS5pc0VxdWFsKHMgJiYgcy5rZXkpKTtcbiAgICB9XG4gICAgcGVyZm9ybUNvbnNpc3RlbmN5Q2hlY2sodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5Gcy5sZW5ndGgsIHVpLnJlc29sdmUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBiYXRjaElkIGluIHRoZSBtdXRhdGlvbiBxdWV1ZSBhbmQgYXNzZXJ0cyB0aGF0XG4gICAgICogdGhlIHJlc3VsdGluZyBpbmRleCBpcyB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGUgcXVldWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYmF0Y2hJZCAtIFRoZSBiYXRjaElkIHRvIHNlYXJjaCBmb3JcbiAgICAgKiBAcGFyYW0gYWN0aW9uIC0gQSBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoZSBjYWxsZXIgaXMgZG9pbmcsIHBocmFzZWQgaW4gcGFzc2l2ZVxuICAgICAqIGZvcm0gKGUuZy4gXCJhY2tub3dsZWRnZWRcIiBpbiBhIHJvdXRpbmUgdGhhdCBhY2tub3dsZWRnZXMgYmF0Y2hlcykuXG4gICAgICovICAgIE5pKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQ2kodCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSBpbmRleCBvZiB0aGUgZ2l2ZW4gYmF0Y2hJZCBpbiB0aGUgbXV0YXRpb24gcXVldWUuIFRoaXMgb3BlcmF0aW9uXG4gICAgICogaXMgTygxKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBjb21wdXRlZCBpbmRleCBvZiB0aGUgYmF0Y2ggd2l0aCB0aGUgZ2l2ZW4gYmF0Y2hJZCwgYmFzZWQgb25cbiAgICAgKiB0aGUgc3RhdGUgb2YgdGhlIHF1ZXVlLiBOb3RlIHRoaXMgaW5kZXggY2FuIGJlIG5lZ2F0aXZlIGlmIHRoZSByZXF1ZXN0ZWRcbiAgICAgKiBiYXRjaElkIGhhcyBhbHJlYWR5IGJlZW4gcmVtdm9lZCBmcm9tIHRoZSBxdWV1ZSBvciBwYXN0IHRoZSBlbmQgb2YgdGhlXG4gICAgICogcXVldWUgaWYgdGhlIGJhdGNoSWQgaXMgbGFyZ2VyIHRoYW4gdGhlIGxhc3QgYWRkZWQgYmF0Y2guXG4gICAgICovICAgIENpKHQpIHtcbiAgICAgICAgaWYgKDAgPT09IHRoaXMuRnMubGVuZ3RoKSBcbiAgICAgICAgLy8gQXMgYW4gaW5kZXggdGhpcyBpcyBwYXN0IHRoZSBlbmQgb2YgdGhlIHF1ZXVlXG4gICAgICAgIHJldHVybiAwO1xuICAgICAgICAvLyBFeGFtaW5lIHRoZSBmcm9udCBvZiB0aGUgcXVldWUgdG8gZmlndXJlIG91dCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZVxuICAgICAgICAvLyBiYXRjaElkIGFuZCBpbmRleGVzIGluIHRoZSBhcnJheS4gTm90ZSB0aGF0IHNpbmNlIHRoZSBxdWV1ZSBpcyBvcmRlcmVkXG4gICAgICAgIC8vIGJ5IGJhdGNoSWQsIGlmIHRoZSBmaXJzdCBiYXRjaCBoYXMgYSBsYXJnZXIgYmF0Y2hJZCB0aGVuIHRoZSByZXF1ZXN0ZWRcbiAgICAgICAgLy8gYmF0Y2hJZCBkb2Vzbid0IGV4aXN0IGluIHRoZSBxdWV1ZS5cbiAgICAgICAgICAgICAgICByZXR1cm4gdCAtIHRoaXMuRnNbMF0uYmF0Y2hJZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSB2ZXJzaW9uIG9mIGxvb2t1cE11dGF0aW9uQmF0Y2ggdGhhdCBkb2Vzbid0IHJldHVybiBhIHByb21pc2UsIHRoaXMgbWFrZXNcbiAgICAgKiBvdGhlciBmdW5jdGlvbnMgdGhhdCB1c2VzIHRoaXMgY29kZSBlYXNpZXIgdG8gcmVhZCBhbmQgbW9yZSBlZmZpY2VudC5cbiAgICAgKi8gICAgRGkodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5DaSh0KTtcbiAgICAgICAgaWYgKGUgPCAwIHx8IGUgPj0gdGhpcy5Gcy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy5Gc1tlXTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFRoZSBtZW1vcnktb25seSBSZW1vdGVEb2N1bWVudENhY2hlIGZvciBJbmRleGVkRGIuIFRvIGNvbnN0cnVjdCwgaW52b2tlXG4gKiBgbmV3TWVtb3J5UmVtb3RlRG9jdW1lbnRDYWNoZSgpYC5cbiAqL1xuY2xhc3MgZm8ge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBzaXplciAtIFVzZWQgdG8gYXNzZXNzIHRoZSBzaXplIG9mIGEgZG9jdW1lbnQuIEZvciBlYWdlciBHQywgdGhpcyBpc1xuICAgICAqIGV4cGVjdGVkIHRvIGp1c3QgcmV0dXJuIDAgdG8gYXZvaWQgdW5uZWNlc3NhcmlseSBkb2luZyB0aGUgd29yayBvZlxuICAgICAqIGNhbGN1bGF0aW5nIHRoZSBzaXplLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5raSA9IHQsIFxuICAgICAgICAvKiogVW5kZXJseWluZyBjYWNoZSBvZiBkb2N1bWVudHMgYW5kIHRoZWlyIHJlYWQgdGltZXMuICovXG4gICAgICAgIHRoaXMuZG9jcyA9IG5ldyBDbih4dC5jb21wYXJhdG9yKSwgXG4gICAgICAgIC8qKiBTaXplIG9mIGFsbCBjYWNoZWQgZG9jdW1lbnRzLiAqL1xuICAgICAgICB0aGlzLnNpemUgPSAwO1xuICAgIH1cbiAgICBzZXRJbmRleE1hbmFnZXIodCkge1xuICAgICAgICB0aGlzLmluZGV4TWFuYWdlciA9IHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIHN1cHBsaWVkIGVudHJ5IHRvIHRoZSBjYWNoZSBhbmQgdXBkYXRlcyB0aGUgY2FjaGUgc2l6ZSBhcyBhcHByb3ByaWF0ZS5cbiAgICAgKlxuICAgICAqIEFsbCBjYWxscyBvZiBgYWRkRW50cnlgICBhcmUgcmVxdWlyZWQgdG8gZ28gdGhyb3VnaCB0aGUgUmVtb3RlRG9jdW1lbnRDaGFuZ2VCdWZmZXJcbiAgICAgKiByZXR1cm5lZCBieSBgbmV3Q2hhbmdlQnVmZmVyKClgLlxuICAgICAqLyAgICBhZGRFbnRyeSh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBlLmtleSwgcyA9IHRoaXMuZG9jcy5nZXQobiksIGkgPSBzID8gcy5zaXplIDogMCwgciA9IHRoaXMua2koZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmRvY3MgPSB0aGlzLmRvY3MuaW5zZXJ0KG4sIHtcbiAgICAgICAgICAgIGRvY3VtZW50OiBlLm11dGFibGVDb3B5KCksXG4gICAgICAgICAgICBzaXplOiByXG4gICAgICAgIH0pLCB0aGlzLnNpemUgKz0gciAtIGksIHRoaXMuaW5kZXhNYW5hZ2VyLmFkZFRvQ29sbGVjdGlvblBhcmVudEluZGV4KHQsIG4ucGF0aC5wb3BMYXN0KCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgZW50cnkgZnJvbSB0aGUgY2FjaGUgYW5kIHVwZGF0ZXMgdGhlIGNhY2hlIHNpemUgYXMgYXBwcm9wcmlhdGUuXG4gICAgICpcbiAgICAgKiBBbGwgY2FsbHMgb2YgYHJlbW92ZUVudHJ5YCBhcmUgcmVxdWlyZWQgdG8gZ28gdGhyb3VnaCB0aGUgUmVtb3RlRG9jdW1lbnRDaGFuZ2VCdWZmZXJcbiAgICAgKiByZXR1cm5lZCBieSBgbmV3Q2hhbmdlQnVmZmVyKClgLlxuICAgICAqLyAgICByZW1vdmVFbnRyeSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLmRvY3MuZ2V0KHQpO1xuICAgICAgICBlICYmICh0aGlzLmRvY3MgPSB0aGlzLmRvY3MucmVtb3ZlKHQpLCB0aGlzLnNpemUgLT0gZS5zaXplKTtcbiAgICB9XG4gICAgZ2V0RW50cnkodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gdGhpcy5kb2NzLmdldChlKTtcbiAgICAgICAgcmV0dXJuIHVpLnJlc29sdmUobiA/IG4uZG9jdW1lbnQubXV0YWJsZUNvcHkoKSA6IHRlLm5ld0ludmFsaWREb2N1bWVudChlKSk7XG4gICAgfVxuICAgIGdldEVudHJpZXModCwgZSkge1xuICAgICAgICBsZXQgbiA9IEZuKCk7XG4gICAgICAgIHJldHVybiBlLmZvckVhY2goKHQgPT4ge1xuICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMuZG9jcy5nZXQodCk7XG4gICAgICAgICAgICBuID0gbi5pbnNlcnQodCwgZSA/IGUuZG9jdW1lbnQubXV0YWJsZUNvcHkoKSA6IHRlLm5ld0ludmFsaWREb2N1bWVudCh0KSk7XG4gICAgICAgIH0pKSwgdWkucmVzb2x2ZShuKTtcbiAgICB9XG4gICAgZ2V0QWxsKHQsIGUsIG4pIHtcbiAgICAgICAgbGV0IHMgPSBGbigpO1xuICAgICAgICAvLyBEb2N1bWVudHMgYXJlIG9yZGVyZWQgYnkga2V5LCBzbyB3ZSBjYW4gdXNlIGEgcHJlZml4IHNjYW4gdG8gbmFycm93IGRvd25cbiAgICAgICAgLy8gdGhlIGRvY3VtZW50cyB3ZSBuZWVkIHRvIG1hdGNoIHRoZSBxdWVyeSBhZ2FpbnN0LlxuICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBuZXcgeHQoZS5jaGlsZChcIlwiKSksIHIgPSB0aGlzLmRvY3MuZ2V0SXRlcmF0b3JGcm9tKGkpO1xuICAgICAgICBmb3IgKDtyLmhhc05leHQoKTsgKSB7XG4gICAgICAgICAgICBjb25zdCB7a2V5OiB0LCB2YWx1ZToge2RvY3VtZW50OiBpfX0gPSByLmdldE5leHQoKTtcbiAgICAgICAgICAgIGlmICghZS5pc1ByZWZpeE9mKHQucGF0aCkpIGJyZWFrO1xuICAgICAgICAgICAgdC5wYXRoLmxlbmd0aCA+IGUubGVuZ3RoICsgMSB8fCAoaS5yZWFkVGltZS5jb21wYXJlVG8obikgPD0gMCB8fCAocyA9IHMuaW5zZXJ0KGkua2V5LCBpLm11dGFibGVDb3B5KCkpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVpLnJlc29sdmUocyk7XG4gICAgfVxuICAgIE1pKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHVpLmZvckVhY2godGhpcy5kb2NzLCAodCA9PiBlKHQpKSk7XG4gICAgfVxuICAgIG5ld0NoYW5nZUJ1ZmZlcih0KSB7XG4gICAgICAgIC8vIGB0cmFja1JlbW92YWxzYCBpcyBpZ25vcmVzIHNpbmNlIHRoZSBNZW1vcnlSZW1vdGVEb2N1bWVudENhY2hlIGtlZXBzXG4gICAgICAgIC8vIGEgc2VwYXJhdGUgY2hhbmdlbG9nIGFuZCBkb2VzIG5vdCBuZWVkIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHJlbW92YWxzLlxuICAgICAgICByZXR1cm4gbmV3IF9vKHRoaXMpO1xuICAgIH1cbiAgICBnZXRTaXplKHQpIHtcbiAgICAgICAgcmV0dXJuIHVpLnJlc29sdmUodGhpcy5zaXplKTtcbiAgICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBtZW1vcnktb25seSBSZW1vdGVEb2N1bWVudENhY2hlLlxuICpcbiAqIEBwYXJhbSBzaXplciAtIFVzZWQgdG8gYXNzZXNzIHRoZSBzaXplIG9mIGEgZG9jdW1lbnQuIEZvciBlYWdlciBHQywgdGhpcyBpc1xuICogZXhwZWN0ZWQgdG8ganVzdCByZXR1cm4gMCB0byBhdm9pZCB1bm5lY2Vzc2FyaWx5IGRvaW5nIHRoZSB3b3JrIG9mXG4gKiBjYWxjdWxhdGluZyB0aGUgc2l6ZS5cbiAqL1xuLyoqXG4gKiBIYW5kbGVzIHRoZSBkZXRhaWxzIG9mIGFkZGluZyBhbmQgdXBkYXRpbmcgZG9jdW1lbnRzIGluIHRoZSBNZW1vcnlSZW1vdGVEb2N1bWVudENhY2hlLlxuICovXG5jbGFzcyBfbyBleHRlbmRzIHZyIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMuVW4gPSB0O1xuICAgIH1cbiAgICBhcHBseUNoYW5nZXModCkge1xuICAgICAgICBjb25zdCBlID0gW107XG4gICAgICAgIHJldHVybiB0aGlzLmNoYW5nZXMuZm9yRWFjaCgoKG4sIHMpID0+IHtcbiAgICAgICAgICAgIHMuaXNWYWxpZERvY3VtZW50KCkgPyBlLnB1c2godGhpcy5Vbi5hZGRFbnRyeSh0LCBzKSkgOiB0aGlzLlVuLnJlbW92ZUVudHJ5KG4pO1xuICAgICAgICB9KSksIHVpLndhaXRGb3IoZSk7XG4gICAgfVxuICAgIGdldEZyb21DYWNoZSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLlVuLmdldEVudHJ5KHQsIGUpO1xuICAgIH1cbiAgICBnZXRBbGxGcm9tQ2FjaGUodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5Vbi5nZXRFbnRyaWVzKHQsIGUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gY2xhc3Mgd28ge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5wZXJzaXN0ZW5jZSA9IHQsIFxuICAgICAgICAvKipcbiAgICAgICAgICogTWFwcyBhIHRhcmdldCB0byB0aGUgZGF0YSBhYm91dCB0aGF0IHRhcmdldFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5PaSA9IG5ldyBEbigodCA9PiBjZSh0KSksIGxlKSwgXG4gICAgICAgIC8qKiBUaGUgbGFzdCByZWNlaXZlZCBzbmFwc2hvdCB2ZXJzaW9uLiAqL1xuICAgICAgICB0aGlzLmxhc3RSZW1vdGVTbmFwc2hvdFZlcnNpb24gPSBjdC5taW4oKSwgXG4gICAgICAgIC8qKiBUaGUgaGlnaGVzdCBudW1iZXJlZCB0YXJnZXQgSUQgZW5jb3VudGVyZWQuICovXG4gICAgICAgIHRoaXMuaGlnaGVzdFRhcmdldElkID0gMCwgXG4gICAgICAgIC8qKiBUaGUgaGlnaGVzdCBzZXF1ZW5jZSBudW1iZXIgZW5jb3VudGVyZWQuICovXG4gICAgICAgIHRoaXMuJGkgPSAwLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgb3JkZXJlZCBiaWRpcmVjdGlvbmFsIG1hcHBpbmcgYmV0d2VlbiBkb2N1bWVudHMgYW5kIHRoZSByZW1vdGUgdGFyZ2V0XG4gICAgICAgICAqIElEcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuRmkgPSBuZXcgY28sIHRoaXMudGFyZ2V0Q291bnQgPSAwLCB0aGlzLkJpID0gbXIubW4oKTtcbiAgICB9XG4gICAgZm9yRWFjaFRhcmdldCh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLk9pLmZvckVhY2goKCh0LCBuKSA9PiBlKG4pKSksIHVpLnJlc29sdmUoKTtcbiAgICB9XG4gICAgZ2V0TGFzdFJlbW90ZVNuYXBzaG90VmVyc2lvbih0KSB7XG4gICAgICAgIHJldHVybiB1aS5yZXNvbHZlKHRoaXMubGFzdFJlbW90ZVNuYXBzaG90VmVyc2lvbik7XG4gICAgfVxuICAgIGdldEhpZ2hlc3RTZXF1ZW5jZU51bWJlcih0KSB7XG4gICAgICAgIHJldHVybiB1aS5yZXNvbHZlKHRoaXMuJGkpO1xuICAgIH1cbiAgICBhbGxvY2F0ZVRhcmdldElkKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGlnaGVzdFRhcmdldElkID0gdGhpcy5CaS5uZXh0KCksIHVpLnJlc29sdmUodGhpcy5oaWdoZXN0VGFyZ2V0SWQpO1xuICAgIH1cbiAgICBzZXRUYXJnZXRzTWV0YWRhdGEodCwgZSwgbikge1xuICAgICAgICByZXR1cm4gbiAmJiAodGhpcy5sYXN0UmVtb3RlU25hcHNob3RWZXJzaW9uID0gbiksIGUgPiB0aGlzLiRpICYmICh0aGlzLiRpID0gZSksIFxuICAgICAgICB1aS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIEluKHQpIHtcbiAgICAgICAgdGhpcy5PaS5zZXQodC50YXJnZXQsIHQpO1xuICAgICAgICBjb25zdCBlID0gdC50YXJnZXRJZDtcbiAgICAgICAgZSA+IHRoaXMuaGlnaGVzdFRhcmdldElkICYmICh0aGlzLkJpID0gbmV3IG1yKGUpLCB0aGlzLmhpZ2hlc3RUYXJnZXRJZCA9IGUpLCB0LnNlcXVlbmNlTnVtYmVyID4gdGhpcy4kaSAmJiAodGhpcy4kaSA9IHQuc2VxdWVuY2VOdW1iZXIpO1xuICAgIH1cbiAgICBhZGRUYXJnZXREYXRhKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuSW4oZSksIHRoaXMudGFyZ2V0Q291bnQgKz0gMSwgdWkucmVzb2x2ZSgpO1xuICAgIH1cbiAgICB1cGRhdGVUYXJnZXREYXRhKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuSW4oZSksIHVpLnJlc29sdmUoKTtcbiAgICB9XG4gICAgcmVtb3ZlVGFyZ2V0RGF0YSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLk9pLmRlbGV0ZShlLnRhcmdldCksIHRoaXMuRmkuUmkoZS50YXJnZXRJZCksIHRoaXMudGFyZ2V0Q291bnQgLT0gMSwgXG4gICAgICAgIHVpLnJlc29sdmUoKTtcbiAgICB9XG4gICAgcmVtb3ZlVGFyZ2V0cyh0LCBlLCBuKSB7XG4gICAgICAgIGxldCBzID0gMDtcbiAgICAgICAgY29uc3QgaSA9IFtdO1xuICAgICAgICByZXR1cm4gdGhpcy5PaS5mb3JFYWNoKCgociwgbykgPT4ge1xuICAgICAgICAgICAgby5zZXF1ZW5jZU51bWJlciA8PSBlICYmIG51bGwgPT09IG4uZ2V0KG8udGFyZ2V0SWQpICYmICh0aGlzLk9pLmRlbGV0ZShyKSwgaS5wdXNoKHRoaXMucmVtb3ZlTWF0Y2hpbmdLZXlzRm9yVGFyZ2V0SWQodCwgby50YXJnZXRJZCkpLCBcbiAgICAgICAgICAgIHMrKyk7XG4gICAgICAgIH0pKSwgdWkud2FpdEZvcihpKS5uZXh0KCgoKSA9PiBzKSk7XG4gICAgfVxuICAgIGdldFRhcmdldENvdW50KHQpIHtcbiAgICAgICAgcmV0dXJuIHVpLnJlc29sdmUodGhpcy50YXJnZXRDb3VudCk7XG4gICAgfVxuICAgIGdldFRhcmdldERhdGEodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gdGhpcy5PaS5nZXQoZSkgfHwgbnVsbDtcbiAgICAgICAgcmV0dXJuIHVpLnJlc29sdmUobik7XG4gICAgfVxuICAgIGFkZE1hdGNoaW5nS2V5cyh0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkZpLlRpKGUsIG4pLCB1aS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIHJlbW92ZU1hdGNoaW5nS2V5cyh0LCBlLCBuKSB7XG4gICAgICAgIHRoaXMuRmkuQWkoZSwgbik7XG4gICAgICAgIGNvbnN0IHMgPSB0aGlzLnBlcnNpc3RlbmNlLnJlZmVyZW5jZURlbGVnYXRlLCBpID0gW107XG4gICAgICAgIHJldHVybiBzICYmIGUuZm9yRWFjaCgoZSA9PiB7XG4gICAgICAgICAgICBpLnB1c2gocy5tYXJrUG90ZW50aWFsbHlPcnBoYW5lZCh0LCBlKSk7XG4gICAgICAgIH0pKSwgdWkud2FpdEZvcihpKTtcbiAgICB9XG4gICAgcmVtb3ZlTWF0Y2hpbmdLZXlzRm9yVGFyZ2V0SWQodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5GaS5SaShlKSwgdWkucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBnZXRNYXRjaGluZ0tleXNGb3JUYXJnZXRJZCh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLkZpLlBpKGUpO1xuICAgICAgICByZXR1cm4gdWkucmVzb2x2ZShuKTtcbiAgICB9XG4gICAgY29udGFpbnNLZXkodCwgZSkge1xuICAgICAgICByZXR1cm4gdWkucmVzb2x2ZSh0aGlzLkZpLmNvbnRhaW5zS2V5KGUpKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEEgbWVtb3J5LWJhY2tlZCBpbnN0YW5jZSBvZiBQZXJzaXN0ZW5jZS4gRGF0YSBpcyBzdG9yZWQgb25seSBpbiBSQU0gYW5kXG4gKiBub3QgcGVyc2lzdGVkIGFjcm9zcyBzZXNzaW9ucy5cbiAqL1xuY2xhc3MgbW8ge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIGEgZmFjdG9yeSBmb3IgY3JlYXRpbmcgYSByZWZlcmVuY2UgZGVsZWdhdGUuIFRoaXNcbiAgICAgKiBhbGxvd3MgYm90aCB0aGUgZGVsZWdhdGUgYW5kIHRoaXMgaW5zdGFuY2UgdG8gaGF2ZSBzdHJvbmcgcmVmZXJlbmNlcyB0b1xuICAgICAqIGVhY2ggb3RoZXIgd2l0aG91dCBoYXZpbmcgbnVsbGFibGUgZmllbGRzIHRoYXQgd291bGQgdGhlbiBuZWVkIHRvIGJlXG4gICAgICogY2hlY2tlZCBvciBhc3NlcnRlZCBvbiBldmVyeSBhY2Nlc3MuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLkxpID0ge30sIHRoaXMub3ZlcmxheXMgPSB7fSwgdGhpcy5abiA9IG5ldyBudCgwKSwgdGhpcy50cyA9ICExLCB0aGlzLnRzID0gITAsIFxuICAgICAgICB0aGlzLnJlZmVyZW5jZURlbGVnYXRlID0gdCh0aGlzKSwgdGhpcy5ocyA9IG5ldyB3byh0aGlzKTtcbiAgICAgICAgdGhpcy5pbmRleE1hbmFnZXIgPSBuZXcgWmksIHRoaXMubHMgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGZvKHQpO1xuICAgICAgICB9KCh0ID0+IHRoaXMucmVmZXJlbmNlRGVsZWdhdGUucWkodCkpKSwgdGhpcy5NID0gbmV3IFJpKGUpLCB0aGlzLmZzID0gbmV3IGFvKHRoaXMuTSk7XG4gICAgfVxuICAgIHN0YXJ0KCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIHNodXRkb3duKCkge1xuICAgICAgICAvLyBObyBkdXJhYmxlIHN0YXRlIHRvIGVuc3VyZSBpcyBjbG9zZWQgb24gc2h1dGRvd24uXG4gICAgICAgIHJldHVybiB0aGlzLnRzID0gITEsIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBnZXQgc3RhcnRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHM7XG4gICAgfVxuICAgIHNldERhdGFiYXNlRGVsZXRlZExpc3RlbmVyKCkge1xuICAgICAgICAvLyBObyBvcC5cbiAgICB9XG4gICAgc2V0TmV0d29ya0VuYWJsZWQoKSB7XG4gICAgICAgIC8vIE5vIG9wLlxuICAgIH1cbiAgICBnZXRJbmRleE1hbmFnZXIodCkge1xuICAgICAgICAvLyBXZSBkbyBub3QgY3VycmVudGx5IHN1cHBvcnQgaW5kaWNlcyBmb3IgbWVtb3J5IHBlcnNpc3RlbmNlLCBzbyB3ZSBjYW5cbiAgICAgICAgLy8gcmV0dXJuIHRoZSBzYW1lIHNoYXJlZCBpbnN0YW5jZSBvZiB0aGUgbWVtb3J5IGluZGV4IG1hbmFnZXIuXG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4TWFuYWdlcjtcbiAgICB9XG4gICAgZ2V0RG9jdW1lbnRPdmVybGF5Q2FjaGUodCkge1xuICAgICAgICBsZXQgZSA9IHRoaXMub3ZlcmxheXNbdC50b0tleSgpXTtcbiAgICAgICAgcmV0dXJuIGUgfHwgKGUgPSBuZXcgdW8sIHRoaXMub3ZlcmxheXNbdC50b0tleSgpXSA9IGUpLCBlO1xuICAgIH1cbiAgICBnZXRNdXRhdGlvblF1ZXVlKHQsIGUpIHtcbiAgICAgICAgbGV0IG4gPSB0aGlzLkxpW3QudG9LZXkoKV07XG4gICAgICAgIHJldHVybiBuIHx8IChuID0gbmV3IGxvKGUsIHRoaXMucmVmZXJlbmNlRGVsZWdhdGUpLCB0aGlzLkxpW3QudG9LZXkoKV0gPSBuKSwgbjtcbiAgICB9XG4gICAgZ2V0VGFyZ2V0Q2FjaGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhzO1xuICAgIH1cbiAgICBnZXRSZW1vdGVEb2N1bWVudENhY2hlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5scztcbiAgICB9XG4gICAgZ2V0QnVuZGxlQ2FjaGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZzO1xuICAgIH1cbiAgICBydW5UcmFuc2FjdGlvbih0LCBlLCBuKSB7XG4gICAgICAgIE8oXCJNZW1vcnlQZXJzaXN0ZW5jZVwiLCBcIlN0YXJ0aW5nIHRyYW5zYWN0aW9uOlwiLCB0KTtcbiAgICAgICAgY29uc3QgcyA9IG5ldyBnbyh0aGlzLlpuLm5leHQoKSk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZURlbGVnYXRlLlVpKCksIG4ocykubmV4dCgodCA9PiB0aGlzLnJlZmVyZW5jZURlbGVnYXRlLktpKHMpLm5leHQoKCgpID0+IHQpKSkpLnRvUHJvbWlzZSgpLnRoZW4oKHQgPT4gKHMucmFpc2VPbkNvbW1pdHRlZEV2ZW50KCksIFxuICAgICAgICB0KSkpO1xuICAgIH1cbiAgICBHaSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB1aS5vcihPYmplY3QudmFsdWVzKHRoaXMuTGkpLm1hcCgobiA9PiAoKSA9PiBuLmNvbnRhaW5zS2V5KHQsIGUpKSkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBNZW1vcnkgcGVyc2lzdGVuY2UgaXMgbm90IGFjdHVhbGx5IHRyYW5zYWN0aW9uYWwsIGJ1dCBmdXR1cmUgaW1wbGVtZW50YXRpb25zXG4gKiBtYXkgaGF2ZSB0cmFuc2FjdGlvbi1zY29wZWQgc3RhdGUuXG4gKi8gY2xhc3MgZ28gZXh0ZW5kcyBhaSB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICBzdXBlcigpLCB0aGlzLmN1cnJlbnRTZXF1ZW5jZU51bWJlciA9IHQ7XG4gICAgfVxufVxuXG5jbGFzcyB5byB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlID0gdCwgXG4gICAgICAgIC8qKiBUcmFja3MgYWxsIGRvY3VtZW50cyB0aGF0IGFyZSBhY3RpdmUgaW4gUXVlcnkgdmlld3MuICovXG4gICAgICAgIHRoaXMuUWkgPSBuZXcgY28sIFxuICAgICAgICAvKiogVGhlIGxpc3Qgb2YgZG9jdW1lbnRzIHRoYXQgYXJlIHBvdGVudGlhbGx5IEdDZWQgYWZ0ZXIgZWFjaCB0cmFuc2FjdGlvbi4gKi9cbiAgICAgICAgdGhpcy5qaSA9IG51bGw7XG4gICAgfVxuICAgIHN0YXRpYyBXaSh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgeW8odCk7XG4gICAgfVxuICAgIGdldCB6aSgpIHtcbiAgICAgICAgaWYgKHRoaXMuamkpIHJldHVybiB0aGlzLmppO1xuICAgICAgICB0aHJvdyBMKCk7XG4gICAgfVxuICAgIGFkZFJlZmVyZW5jZSh0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLlFpLmFkZFJlZmVyZW5jZShuLCBlKSwgdGhpcy56aS5kZWxldGUobi50b1N0cmluZygpKSwgdWkucmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZW1vdmVSZWZlcmVuY2UodCwgZSwgbikge1xuICAgICAgICByZXR1cm4gdGhpcy5RaS5yZW1vdmVSZWZlcmVuY2UobiwgZSksIHRoaXMuemkuYWRkKG4udG9TdHJpbmcoKSksIHVpLnJlc29sdmUoKTtcbiAgICB9XG4gICAgbWFya1BvdGVudGlhbGx5T3JwaGFuZWQodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy56aS5hZGQoZS50b1N0cmluZygpKSwgdWkucmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZW1vdmVUYXJnZXQodCwgZSkge1xuICAgICAgICB0aGlzLlFpLlJpKGUudGFyZ2V0SWQpLmZvckVhY2goKHQgPT4gdGhpcy56aS5hZGQodC50b1N0cmluZygpKSkpO1xuICAgICAgICBjb25zdCBuID0gdGhpcy5wZXJzaXN0ZW5jZS5nZXRUYXJnZXRDYWNoZSgpO1xuICAgICAgICByZXR1cm4gbi5nZXRNYXRjaGluZ0tleXNGb3JUYXJnZXRJZCh0LCBlLnRhcmdldElkKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgIHQuZm9yRWFjaCgodCA9PiB0aGlzLnppLmFkZCh0LnRvU3RyaW5nKCkpKSk7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiBuLnJlbW92ZVRhcmdldERhdGEodCwgZSkpKTtcbiAgICB9XG4gICAgVWkoKSB7XG4gICAgICAgIHRoaXMuamkgPSBuZXcgU2V0O1xuICAgIH1cbiAgICBLaSh0KSB7XG4gICAgICAgIC8vIFJlbW92ZSBuZXdseSBvcnBoYW5lZCBkb2N1bWVudHMuXG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLnBlcnNpc3RlbmNlLmdldFJlbW90ZURvY3VtZW50Q2FjaGUoKS5uZXdDaGFuZ2VCdWZmZXIoKTtcbiAgICAgICAgcmV0dXJuIHVpLmZvckVhY2godGhpcy56aSwgKG4gPT4ge1xuICAgICAgICAgICAgY29uc3QgcyA9IHh0LmZyb21QYXRoKG4pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuSGkodCwgcykubmV4dCgodCA9PiB7XG4gICAgICAgICAgICAgICAgdCB8fCBlLnJlbW92ZUVudHJ5KHMsIGN0Lm1pbigpKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+ICh0aGlzLmppID0gbnVsbCwgZS5hcHBseSh0KSkpKTtcbiAgICB9XG4gICAgdXBkYXRlTGltYm9Eb2N1bWVudCh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkhpKHQsIGUpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgdCA/IHRoaXMuemkuZGVsZXRlKGUudG9TdHJpbmcoKSkgOiB0aGlzLnppLmFkZChlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIHFpKHQpIHtcbiAgICAgICAgLy8gRm9yIGVhZ2VyIEdDLCB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSBkb2N1bWVudCBzaXplLCB0aGVyZSBhcmUgbm8gc2l6ZSB0aHJlc2hvbGRzLlxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgSGkodCwgZSkge1xuICAgICAgICByZXR1cm4gdWkub3IoWyAoKSA9PiB1aS5yZXNvbHZlKHRoaXMuUWkuY29udGFpbnNLZXkoZSkpLCAoKSA9PiB0aGlzLnBlcnNpc3RlbmNlLmdldFRhcmdldENhY2hlKCkuY29udGFpbnNLZXkodCwgZSksICgpID0+IHRoaXMucGVyc2lzdGVuY2UuR2kodCwgZSkgXSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLy8gVGhlIGZvcm1hdCBvZiB0aGUgTG9jYWxTdG9yYWdlIGtleSB0aGF0IHN0b3JlcyB0aGUgY2xpZW50IHN0YXRlIGlzOlxuLy8gICAgIGZpcmVzdG9yZV9jbGllbnRzXzxwZXJzaXN0ZW5jZV9wcmVmaXg+XzxpbnN0YW5jZV9rZXk+XG4vKiogQXNzZW1ibGVzIHRoZSBrZXkgZm9yIGEgY2xpZW50IHN0YXRlIGluIFdlYlN0b3JhZ2UgKi9cbmZ1bmN0aW9uIHBvKHQsIGUpIHtcbiAgICByZXR1cm4gYGZpcmVzdG9yZV9jbGllbnRzXyR7dH1fJHtlfWA7XG59XG5cbi8vIFRoZSBmb3JtYXQgb2YgdGhlIFdlYlN0b3JhZ2Uga2V5IHRoYXQgc3RvcmVzIHRoZSBtdXRhdGlvbiBzdGF0ZSBpczpcbi8vICAgICBmaXJlc3RvcmVfbXV0YXRpb25zXzxwZXJzaXN0ZW5jZV9wcmVmaXg+XzxiYXRjaF9pZD5cbi8vICAgICAoZm9yIHVuYXV0aGVudGljYXRlZCB1c2Vycylcbi8vIG9yOiBmaXJlc3RvcmVfbXV0YXRpb25zXzxwZXJzaXN0ZW5jZV9wcmVmaXg+XzxiYXRjaF9pZD5fPHVzZXJfdWlkPlxuXG4vLyAndXNlcl91aWQnIGlzIGxhc3QgdG8gYXZvaWQgbmVlZGluZyB0byBlc2NhcGUgJ18nIGNoYXJhY3RlcnMgdGhhdCBpdCBtaWdodFxuLy8gY29udGFpbi5cbi8qKiBBc3NlbWJsZXMgdGhlIGtleSBmb3IgYSBtdXRhdGlvbiBiYXRjaCBpbiBXZWJTdG9yYWdlICovXG5mdW5jdGlvbiBJbyh0LCBlLCBuKSB7XG4gICAgbGV0IHMgPSBgZmlyZXN0b3JlX211dGF0aW9uc18ke3R9XyR7bn1gO1xuICAgIHJldHVybiBlLmlzQXV0aGVudGljYXRlZCgpICYmIChzICs9IGBfJHtlLnVpZH1gKSwgcztcbn1cblxuLy8gVGhlIGZvcm1hdCBvZiB0aGUgV2ViU3RvcmFnZSBrZXkgdGhhdCBzdG9yZXMgYSBxdWVyeSB0YXJnZXQncyBtZXRhZGF0YSBpczpcbi8vICAgICBmaXJlc3RvcmVfdGFyZ2V0c188cGVyc2lzdGVuY2VfcHJlZml4Pl88dGFyZ2V0X2lkPlxuLyoqIEFzc2VtYmxlcyB0aGUga2V5IGZvciBhIHF1ZXJ5IHN0YXRlIGluIFdlYlN0b3JhZ2UgKi9cbmZ1bmN0aW9uIFRvKHQsIGUpIHtcbiAgICByZXR1cm4gYGZpcmVzdG9yZV90YXJnZXRzXyR7dH1fJHtlfWA7XG59XG5cbi8vIFRoZSBXZWJTdG9yYWdlIHByZWZpeCB0aGF0IHN0b3JlcyB0aGUgcHJpbWFyeSB0YWIncyBvbmxpbmUgc3RhdGUuIFRoZVxuLy8gZm9ybWF0IG9mIHRoZSBrZXkgaXM6XG4vLyAgICAgZmlyZXN0b3JlX29ubGluZV9zdGF0ZV88cGVyc2lzdGVuY2VfcHJlZml4PlxuLyoqXG4gKiBIb2xkcyB0aGUgc3RhdGUgb2YgYSBtdXRhdGlvbiBiYXRjaCwgaW5jbHVkaW5nIGl0cyB1c2VyIElELCBiYXRjaCBJRCBhbmRcbiAqIHdoZXRoZXIgdGhlIGJhdGNoIGlzICdwZW5kaW5nJywgJ2Fja25vd2xlZGdlZCcgb3IgJ3JlamVjdGVkJy5cbiAqL1xuLy8gVmlzaWJsZSBmb3IgdGVzdGluZ1xuY2xhc3MgRW8ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgdGhpcy51c2VyID0gdCwgdGhpcy5iYXRjaElkID0gZSwgdGhpcy5zdGF0ZSA9IG4sIHRoaXMuZXJyb3IgPSBzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSBNdXRhdGlvbk1ldGFkYXRhIGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24gaW4gV2ViU3RvcmFnZS5cbiAgICAgKiBMb2dzIGEgd2FybmluZyBhbmQgcmV0dXJucyBudWxsIGlmIHRoZSBmb3JtYXQgb2YgdGhlIGRhdGEgaXMgbm90IHZhbGlkLlxuICAgICAqLyAgICBzdGF0aWMgSmkodCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gSlNPTi5wYXJzZShuKTtcbiAgICAgICAgbGV0IGksIHIgPSBcIm9iamVjdFwiID09IHR5cGVvZiBzICYmIC0xICE9PSBbIFwicGVuZGluZ1wiLCBcImFja25vd2xlZGdlZFwiLCBcInJlamVjdGVkXCIgXS5pbmRleE9mKHMuc3RhdGUpICYmICh2b2lkIDAgPT09IHMuZXJyb3IgfHwgXCJvYmplY3RcIiA9PSB0eXBlb2Ygcy5lcnJvcik7XG4gICAgICAgIHJldHVybiByICYmIHMuZXJyb3IgJiYgKHIgPSBcInN0cmluZ1wiID09IHR5cGVvZiBzLmVycm9yLm1lc3NhZ2UgJiYgXCJzdHJpbmdcIiA9PSB0eXBlb2Ygcy5lcnJvci5jb2RlLCBcbiAgICAgICAgciAmJiAoaSA9IG5ldyBRKHMuZXJyb3IuY29kZSwgcy5lcnJvci5tZXNzYWdlKSkpLCByID8gbmV3IEVvKHQsIGUsIHMuc3RhdGUsIGkpIDogKCQoXCJTaGFyZWRDbGllbnRTdGF0ZVwiLCBgRmFpbGVkIHRvIHBhcnNlIG11dGF0aW9uIHN0YXRlIGZvciBJRCAnJHtlfSc6ICR7bn1gKSwgXG4gICAgICAgIG51bGwpO1xuICAgIH1cbiAgICBZaSgpIHtcbiAgICAgICAgY29uc3QgdCA9IHtcbiAgICAgICAgICAgIHN0YXRlOiB0aGlzLnN0YXRlLFxuICAgICAgICAgICAgdXBkYXRlVGltZU1zOiBEYXRlLm5vdygpXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yICYmICh0LmVycm9yID0ge1xuICAgICAgICAgICAgY29kZTogdGhpcy5lcnJvci5jb2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5lcnJvci5tZXNzYWdlXG4gICAgICAgIH0pLCBKU09OLnN0cmluZ2lmeSh0KTtcbiAgICB9XG59XG5cbi8qKlxuICogSG9sZHMgdGhlIHN0YXRlIG9mIGEgcXVlcnkgdGFyZ2V0LCBpbmNsdWRpbmcgaXRzIHRhcmdldCBJRCBhbmQgd2hldGhlciB0aGVcbiAqIHRhcmdldCBpcyAnbm90LWN1cnJlbnQnLCAnY3VycmVudCcgb3IgJ3JlamVjdGVkJy5cbiAqL1xuLy8gVmlzaWJsZSBmb3IgdGVzdGluZ1xuY2xhc3MgQW8ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy50YXJnZXRJZCA9IHQsIHRoaXMuc3RhdGUgPSBlLCB0aGlzLmVycm9yID0gbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2VzIGEgUXVlcnlUYXJnZXRNZXRhZGF0YSBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uIGluIFdlYlN0b3JhZ2UuXG4gICAgICogTG9ncyBhIHdhcm5pbmcgYW5kIHJldHVybnMgbnVsbCBpZiB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhIGlzIG5vdCB2YWxpZC5cbiAgICAgKi8gICAgc3RhdGljIEppKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IEpTT04ucGFyc2UoZSk7XG4gICAgICAgIGxldCBzLCBpID0gXCJvYmplY3RcIiA9PSB0eXBlb2YgbiAmJiAtMSAhPT0gWyBcIm5vdC1jdXJyZW50XCIsIFwiY3VycmVudFwiLCBcInJlamVjdGVkXCIgXS5pbmRleE9mKG4uc3RhdGUpICYmICh2b2lkIDAgPT09IG4uZXJyb3IgfHwgXCJvYmplY3RcIiA9PSB0eXBlb2Ygbi5lcnJvcik7XG4gICAgICAgIHJldHVybiBpICYmIG4uZXJyb3IgJiYgKGkgPSBcInN0cmluZ1wiID09IHR5cGVvZiBuLmVycm9yLm1lc3NhZ2UgJiYgXCJzdHJpbmdcIiA9PSB0eXBlb2Ygbi5lcnJvci5jb2RlLCBcbiAgICAgICAgaSAmJiAocyA9IG5ldyBRKG4uZXJyb3IuY29kZSwgbi5lcnJvci5tZXNzYWdlKSkpLCBpID8gbmV3IEFvKHQsIG4uc3RhdGUsIHMpIDogKCQoXCJTaGFyZWRDbGllbnRTdGF0ZVwiLCBgRmFpbGVkIHRvIHBhcnNlIHRhcmdldCBzdGF0ZSBmb3IgSUQgJyR7dH0nOiAke2V9YCksIFxuICAgICAgICBudWxsKTtcbiAgICB9XG4gICAgWWkoKSB7XG4gICAgICAgIGNvbnN0IHQgPSB7XG4gICAgICAgICAgICBzdGF0ZTogdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIHVwZGF0ZVRpbWVNczogRGF0ZS5ub3coKVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvciAmJiAodC5lcnJvciA9IHtcbiAgICAgICAgICAgIGNvZGU6IHRoaXMuZXJyb3IuY29kZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMuZXJyb3IubWVzc2FnZVxuICAgICAgICB9KSwgSlNPTi5zdHJpbmdpZnkodCk7XG4gICAgfVxufVxuXG4vKipcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgaW1tdXRhYmxlIENsaWVudFN0YXRlIGZvciBhIGNsaWVudCByZWFkIGZyb21cbiAqIFdlYlN0b3JhZ2UsIGNvbnRhaW5pbmcgdGhlIGxpc3Qgb2YgYWN0aXZlIHF1ZXJ5IHRhcmdldHMuXG4gKi8gY2xhc3MgUm8ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5jbGllbnRJZCA9IHQsIHRoaXMuYWN0aXZlVGFyZ2V0SWRzID0gZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2VzIGEgUmVtb3RlQ2xpZW50U3RhdGUgZnJvbSB0aGUgSlNPTiByZXByZXNlbnRhdGlvbiBpbiBXZWJTdG9yYWdlLlxuICAgICAqIExvZ3MgYSB3YXJuaW5nIGFuZCByZXR1cm5zIG51bGwgaWYgdGhlIGZvcm1hdCBvZiB0aGUgZGF0YSBpcyBub3QgdmFsaWQuXG4gICAgICovICAgIHN0YXRpYyBKaSh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBKU09OLnBhcnNlKGUpO1xuICAgICAgICBsZXQgcyA9IFwib2JqZWN0XCIgPT0gdHlwZW9mIG4gJiYgbi5hY3RpdmVUYXJnZXRJZHMgaW5zdGFuY2VvZiBBcnJheSwgaSA9IGpuKCk7XG4gICAgICAgIGZvciAobGV0IHQgPSAwOyBzICYmIHQgPCBuLmFjdGl2ZVRhcmdldElkcy5sZW5ndGg7ICsrdCkgcyA9IEN0KG4uYWN0aXZlVGFyZ2V0SWRzW3RdKSwgXG4gICAgICAgIGkgPSBpLmFkZChuLmFjdGl2ZVRhcmdldElkc1t0XSk7XG4gICAgICAgIHJldHVybiBzID8gbmV3IFJvKHQsIGkpIDogKCQoXCJTaGFyZWRDbGllbnRTdGF0ZVwiLCBgRmFpbGVkIHRvIHBhcnNlIGNsaWVudCBkYXRhIGZvciBpbnN0YW5jZSAnJHt0fSc6ICR7ZX1gKSwgXG4gICAgICAgIG51bGwpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG9ubGluZSBzdGF0ZSBmb3IgYWxsIGNsaWVudHMgcGFydGljaXBhdGluZyBpblxuICogbXVsdGktdGFiLiBUaGUgb25saW5lIHN0YXRlIGlzIG9ubHkgd3JpdHRlbiB0byBieSB0aGUgcHJpbWFyeSBjbGllbnQsIGFuZFxuICogdXNlZCBpbiBzZWNvbmRhcnkgY2xpZW50cyB0byB1cGRhdGUgdGhlaXIgcXVlcnkgdmlld3MuXG4gKi8gY2xhc3MgYm8ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5jbGllbnRJZCA9IHQsIHRoaXMub25saW5lU3RhdGUgPSBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSBTaGFyZWRPbmxpbmVTdGF0ZSBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uIGluIFdlYlN0b3JhZ2UuXG4gICAgICogTG9ncyBhIHdhcm5pbmcgYW5kIHJldHVybnMgbnVsbCBpZiB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhIGlzIG5vdCB2YWxpZC5cbiAgICAgKi8gICAgc3RhdGljIEppKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IEpTT04ucGFyc2UodCk7XG4gICAgICAgIHJldHVybiBcIm9iamVjdFwiID09IHR5cGVvZiBlICYmIC0xICE9PSBbIFwiVW5rbm93blwiLCBcIk9ubGluZVwiLCBcIk9mZmxpbmVcIiBdLmluZGV4T2YoZS5vbmxpbmVTdGF0ZSkgJiYgXCJzdHJpbmdcIiA9PSB0eXBlb2YgZS5jbGllbnRJZCA/IG5ldyBibyhlLmNsaWVudElkLCBlLm9ubGluZVN0YXRlKSA6ICgkKFwiU2hhcmVkQ2xpZW50U3RhdGVcIiwgYEZhaWxlZCB0byBwYXJzZSBvbmxpbmUgc3RhdGU6ICR7dH1gKSwgXG4gICAgICAgIG51bGwpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBNZXRhZGF0YSBzdGF0ZSBvZiB0aGUgbG9jYWwgY2xpZW50LiBVbmxpa2UgYFJlbW90ZUNsaWVudFN0YXRlYCwgdGhpcyBjbGFzcyBpc1xuICogbXV0YWJsZSBhbmQga2VlcHMgdHJhY2sgb2YgYWxsIHBlbmRpbmcgbXV0YXRpb25zLCB3aGljaCBhbGxvd3MgdXMgdG9cbiAqIHVwZGF0ZSB0aGUgcmFuZ2Ugb2YgcGVuZGluZyBtdXRhdGlvbiBiYXRjaCBJRHMgYXMgbmV3IG11dGF0aW9ucyBhcmUgYWRkZWQgb3JcbiAqIHJlbW92ZWQuXG4gKlxuICogVGhlIGRhdGEgaW4gYExvY2FsQ2xpZW50U3RhdGVgIGlzIG5vdCByZWFkIGZyb20gV2ViU3RvcmFnZSBhbmQgaW5zdGVhZFxuICogdXBkYXRlZCB2aWEgaXRzIGluc3RhbmNlIG1ldGhvZHMuIFRoZSB1cGRhdGVkIHN0YXRlIGNhbiBiZSBzZXJpYWxpemVkIHZpYVxuICogYHRvV2ViU3RvcmFnZUpTT04oKWAuXG4gKi9cbi8vIFZpc2libGUgZm9yIHRlc3RpbmcuXG5jbGFzcyBQbyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlVGFyZ2V0SWRzID0gam4oKTtcbiAgICB9XG4gICAgWGkodCkge1xuICAgICAgICB0aGlzLmFjdGl2ZVRhcmdldElkcyA9IHRoaXMuYWN0aXZlVGFyZ2V0SWRzLmFkZCh0KTtcbiAgICB9XG4gICAgWmkodCkge1xuICAgICAgICB0aGlzLmFjdGl2ZVRhcmdldElkcyA9IHRoaXMuYWN0aXZlVGFyZ2V0SWRzLmRlbGV0ZSh0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhpcyBlbnRyeSBpbnRvIGEgSlNPTi1lbmNvZGVkIGZvcm1hdCB3ZSBjYW4gdXNlIGZvciBXZWJTdG9yYWdlLlxuICAgICAqIERvZXMgbm90IGVuY29kZSBgY2xpZW50SWRgIGFzIGl0IGlzIHBhcnQgb2YgdGhlIGtleSBpbiBXZWJTdG9yYWdlLlxuICAgICAqLyAgICBZaSgpIHtcbiAgICAgICAgY29uc3QgdCA9IHtcbiAgICAgICAgICAgIGFjdGl2ZVRhcmdldElkczogdGhpcy5hY3RpdmVUYXJnZXRJZHMudG9BcnJheSgpLFxuICAgICAgICAgICAgdXBkYXRlVGltZU1zOiBEYXRlLm5vdygpXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0KTtcbiAgICB9XG59XG5cbi8qKlxuICogYFdlYlN0b3JhZ2VTaGFyZWRDbGllbnRTdGF0ZWAgdXNlcyBXZWJTdG9yYWdlICh3aW5kb3cubG9jYWxTdG9yYWdlKSBhcyB0aGVcbiAqIGJhY2tpbmcgc3RvcmUgZm9yIHRoZSBTaGFyZWRDbGllbnRTdGF0ZS4gSXQga2VlcHMgdHJhY2sgb2YgYWxsIGFjdGl2ZVxuICogY2xpZW50cyBhbmQgc3VwcG9ydHMgbW9kaWZpY2F0aW9ucyBvZiB0aGUgbG9jYWwgY2xpZW50J3MgZGF0YS5cbiAqLyBjbGFzcyBWbyB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgcywgaSkge1xuICAgICAgICB0aGlzLndpbmRvdyA9IHQsIHRoaXMuSG4gPSBlLCB0aGlzLnBlcnNpc3RlbmNlS2V5ID0gbiwgdGhpcy50ciA9IHMsIHRoaXMuc3luY0VuZ2luZSA9IG51bGwsIFxuICAgICAgICB0aGlzLm9ubGluZVN0YXRlSGFuZGxlciA9IG51bGwsIHRoaXMuc2VxdWVuY2VOdW1iZXJIYW5kbGVyID0gbnVsbCwgdGhpcy5lciA9IHRoaXMubnIuYmluZCh0aGlzKSwgXG4gICAgICAgIHRoaXMuc3IgPSBuZXcgQ24ocnQpLCB0aGlzLnN0YXJ0ZWQgPSAhMSwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYXB0dXJlcyBXZWJTdG9yYWdlIGV2ZW50cyB0aGF0IG9jY3VyIGJlZm9yZSBgc3RhcnQoKWAgaXMgY2FsbGVkLiBUaGVzZVxuICAgICAgICAgKiBldmVudHMgYXJlIHJlcGxheWVkIG9uY2UgYFdlYlN0b3JhZ2VTaGFyZWRDbGllbnRTdGF0ZWAgaXMgc3RhcnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXIgPSBbXTtcbiAgICAgICAgLy8gRXNjYXBlIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMgbWVudGlvbmVkIGhlcmU6XG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvR3VpZGUvUmVndWxhcl9FeHByZXNzaW9uc1xuICAgICAgICBjb25zdCByID0gbi5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIik7XG4gICAgICAgIHRoaXMuc3RvcmFnZSA9IHRoaXMud2luZG93LmxvY2FsU3RvcmFnZSwgdGhpcy5jdXJyZW50VXNlciA9IGksIHRoaXMucnIgPSBwbyh0aGlzLnBlcnNpc3RlbmNlS2V5LCB0aGlzLnRyKSwgXG4gICAgICAgIHRoaXMuYXIgPSBcbiAgICAgICAgLyoqIEFzc2VtYmxlcyB0aGUga2V5IGZvciB0aGUgY3VycmVudCBzZXF1ZW5jZSBudW1iZXIuICovXG4gICAgICAgIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHJldHVybiBgZmlyZXN0b3JlX3NlcXVlbmNlX251bWJlcl8ke3R9YDtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyAodGhpcy5wZXJzaXN0ZW5jZUtleSksIHRoaXMuc3IgPSB0aGlzLnNyLmluc2VydCh0aGlzLnRyLCBuZXcgUG8pLCB0aGlzLnVyID0gbmV3IFJlZ0V4cChgXmZpcmVzdG9yZV9jbGllbnRzXyR7cn1fKFteX10qKSRgKSwgXG4gICAgICAgIHRoaXMuY3IgPSBuZXcgUmVnRXhwKGBeZmlyZXN0b3JlX211dGF0aW9uc18ke3J9XyhcXFxcZCspKD86XyguKikpPyRgKSwgdGhpcy5ociA9IG5ldyBSZWdFeHAoYF5maXJlc3RvcmVfdGFyZ2V0c18ke3J9XyhcXFxcZCspJGApLCBcbiAgICAgICAgdGhpcy5sciA9IFxuICAgICAgICAvKiogQXNzZW1ibGVzIHRoZSBrZXkgZm9yIHRoZSBvbmxpbmUgc3RhdGUgb2YgdGhlIHByaW1hcnkgdGFiLiAqL1xuICAgICAgICBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICByZXR1cm4gYGZpcmVzdG9yZV9vbmxpbmVfc3RhdGVfJHt0fWA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIFdlYlN0b3JhZ2UgcHJlZml4IHRoYXQgcGxheXMgYXMgYSBldmVudCB0byBpbmRpY2F0ZSB0aGUgcmVtb3RlIGRvY3VtZW50c1xuICAgICAgICAvLyBtaWdodCBoYXZlIGNoYW5nZWQgZHVlIHRvIHNvbWUgc2Vjb25kYXJ5IHRhYnMgbG9hZGluZyBhIGJ1bmRsZS5cbiAgICAgICAgLy8gZm9ybWF0IG9mIHRoZSBrZXkgaXM6XG4gICAgICAgIC8vICAgICBmaXJlc3RvcmVfYnVuZGxlX2xvYWRlZF88cGVyc2lzdGVuY2VLZXk+XG4gICAgICAgICh0aGlzLnBlcnNpc3RlbmNlS2V5KSwgdGhpcy5kciA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHJldHVybiBgZmlyZXN0b3JlX2J1bmRsZV9sb2FkZWRfJHt0fWA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIFdlYlN0b3JhZ2Uga2V5IHByZWZpeCBmb3IgdGhlIGtleSB0aGF0IHN0b3JlcyB0aGUgbGFzdCBzZXF1ZW5jZSBudW1iZXIgYWxsb2NhdGVkLiBUaGUga2V5XG4gICAgICAgIC8vIGxvb2tzIGxpa2UgJ2ZpcmVzdG9yZV9zZXF1ZW5jZV9udW1iZXJfPHBlcnNpc3RlbmNlX3ByZWZpeD4nLlxuICAgICAgICAodGhpcy5wZXJzaXN0ZW5jZUtleSksIFxuICAgICAgICAvLyBSYXRoZXIgdGhhbiBhZGRpbmcgdGhlIHN0b3JhZ2Ugb2JzZXJ2ZXIgZHVyaW5nIHN0YXJ0KCksIHdlIGFkZCB0aGVcbiAgICAgICAgLy8gc3RvcmFnZSBvYnNlcnZlciBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIFRoaXMgZW5zdXJlcyB0aGF0IHdlIGNvbGxlY3RcbiAgICAgICAgLy8gZXZlbnRzIGJlZm9yZSBvdGhlciBjb21wb25lbnRzIHBvcHVsYXRlIHRoZWlyIGluaXRpYWwgc3RhdGUgKGR1cmluZyB0aGVpclxuICAgICAgICAvLyByZXNwZWN0aXZlIHN0YXJ0KCkgY2FsbHMpLiBPdGhlcndpc2UsIHdlIG1pZ2h0IGZvciBleGFtcGxlIG1pc3MgYVxuICAgICAgICAvLyBtdXRhdGlvbiB0aGF0IGlzIGFkZGVkIGFmdGVyIExvY2FsU3RvcmUncyBzdGFydCgpIHByb2Nlc3NlZCB0aGUgZXhpc3RpbmdcbiAgICAgICAgLy8gbXV0YXRpb25zIGJ1dCBiZWZvcmUgd2Ugb2JzZXJ2ZSBXZWJTdG9yYWdlIGV2ZW50cy5cbiAgICAgICAgdGhpcy53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInN0b3JhZ2VcIiwgdGhpcy5lcik7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zICd0cnVlJyBpZiBXZWJTdG9yYWdlIGlzIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudC4gKi8gICAgc3RhdGljIHZ0KHQpIHtcbiAgICAgICAgcmV0dXJuICEoIXQgfHwgIXQubG9jYWxTdG9yYWdlKTtcbiAgICB9XG4gICAgYXN5bmMgc3RhcnQoKSB7XG4gICAgICAgIC8vIFJldHJpZXZlIHRoZSBsaXN0IG9mIGV4aXN0aW5nIGNsaWVudHMgdG8gYmFja2ZpbGwgdGhlIGRhdGEgaW5cbiAgICAgICAgLy8gU2hhcmVkQ2xpZW50U3RhdGUuXG4gICAgICAgIGNvbnN0IHQgPSBhd2FpdCB0aGlzLnN5bmNFbmdpbmUuTXMoKTtcbiAgICAgICAgZm9yIChjb25zdCBlIG9mIHQpIHtcbiAgICAgICAgICAgIGlmIChlID09PSB0aGlzLnRyKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmdldEl0ZW0ocG8odGhpcy5wZXJzaXN0ZW5jZUtleSwgZSkpO1xuICAgICAgICAgICAgaWYgKHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuID0gUm8uSmkoZSwgdCk7XG4gICAgICAgICAgICAgICAgbiAmJiAodGhpcy5zciA9IHRoaXMuc3IuaW5zZXJ0KG4uY2xpZW50SWQsIG4pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yKCk7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIG9ubGluZSBzdGF0ZSBhbmQgY2FsbCB0aGUgY2FsbGJhY2sgaGFuZGxlclxuICAgICAgICAvLyBpZiBhcHBsaWNhYmxlLlxuICAgICAgICBjb25zdCBlID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0odGhpcy5scik7XG4gICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy53cihlKTtcbiAgICAgICAgICAgIHQgJiYgdGhpcy5tcih0KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5pcikgdGhpcy5ucih0KTtcbiAgICAgICAgdGhpcy5pciA9IFtdLCBcbiAgICAgICAgLy8gUmVnaXN0ZXIgYSB3aW5kb3cgdW5sb2FkIGhvb2sgdG8gcmVtb3ZlIHRoZSBjbGllbnQgbWV0YWRhdGEgZW50cnkgZnJvbVxuICAgICAgICAvLyBXZWJTdG9yYWdlIGV2ZW4gaWYgYHNodXRkb3duKClgIHdhcyBub3QgY2FsbGVkLlxuICAgICAgICB0aGlzLndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGFnZWhpZGVcIiwgKCgpID0+IHRoaXMuc2h1dGRvd24oKSkpLCB0aGlzLnN0YXJ0ZWQgPSAhMDtcbiAgICB9XG4gICAgd3JpdGVTZXF1ZW5jZU51bWJlcih0KSB7XG4gICAgICAgIHRoaXMuc2V0SXRlbSh0aGlzLmFyLCBKU09OLnN0cmluZ2lmeSh0KSk7XG4gICAgfVxuICAgIGdldEFsbEFjdGl2ZVF1ZXJ5VGFyZ2V0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3IodGhpcy5zcik7XG4gICAgfVxuICAgIGlzQWN0aXZlUXVlcnlUYXJnZXQodCkge1xuICAgICAgICBsZXQgZSA9ICExO1xuICAgICAgICByZXR1cm4gdGhpcy5zci5mb3JFYWNoKCgobiwgcykgPT4ge1xuICAgICAgICAgICAgcy5hY3RpdmVUYXJnZXRJZHMuaGFzKHQpICYmIChlID0gITApO1xuICAgICAgICB9KSksIGU7XG4gICAgfVxuICAgIGFkZFBlbmRpbmdNdXRhdGlvbih0KSB7XG4gICAgICAgIHRoaXMueXIodCwgXCJwZW5kaW5nXCIpO1xuICAgIH1cbiAgICB1cGRhdGVNdXRhdGlvblN0YXRlKHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy55cih0LCBlLCBuKSwgXG4gICAgICAgIC8vIE9uY2UgYSBmaW5hbCBtdXRhdGlvbiByZXN1bHQgaXMgb2JzZXJ2ZWQgYnkgb3RoZXIgY2xpZW50cywgdGhleSBubyBsb25nZXJcbiAgICAgICAgLy8gYWNjZXNzIHRoZSBtdXRhdGlvbidzIG1ldGFkYXRhIGVudHJ5LiBTaW5jZSBXZWJTdG9yYWdlIHJlcGxheXMgZXZlbnRzXG4gICAgICAgIC8vIGluIG9yZGVyLCBpdCBpcyBzYWZlIHRvIGRlbGV0ZSB0aGUgZW50cnkgcmlnaHQgYWZ0ZXIgdXBkYXRpbmcgaXQuXG4gICAgICAgIHRoaXMucHIodCk7XG4gICAgfVxuICAgIGFkZExvY2FsUXVlcnlUYXJnZXQodCkge1xuICAgICAgICBsZXQgZSA9IFwibm90LWN1cnJlbnRcIjtcbiAgICAgICAgLy8gTG9va3VwIGFuIGV4aXN0aW5nIHF1ZXJ5IHN0YXRlIGlmIHRoZSB0YXJnZXQgSUQgd2FzIGFscmVhZHkgcmVnaXN0ZXJlZFxuICAgICAgICAvLyBieSBhbm90aGVyIHRhYlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQWN0aXZlUXVlcnlUYXJnZXQodCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLnN0b3JhZ2UuZ2V0SXRlbShUbyh0aGlzLnBlcnNpc3RlbmNlS2V5LCB0KSk7XG4gICAgICAgICAgICBpZiAobikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBBby5KaSh0LCBuKTtcbiAgICAgICAgICAgICAgICBzICYmIChlID0gcy5zdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuSXIuWGkodCksIHRoaXMuX3IoKSwgZTtcbiAgICB9XG4gICAgcmVtb3ZlTG9jYWxRdWVyeVRhcmdldCh0KSB7XG4gICAgICAgIHRoaXMuSXIuWmkodCksIHRoaXMuX3IoKTtcbiAgICB9XG4gICAgaXNMb2NhbFF1ZXJ5VGFyZ2V0KHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuSXIuYWN0aXZlVGFyZ2V0SWRzLmhhcyh0KTtcbiAgICB9XG4gICAgY2xlYXJRdWVyeVN0YXRlKHQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVJdGVtKFRvKHRoaXMucGVyc2lzdGVuY2VLZXksIHQpKTtcbiAgICB9XG4gICAgdXBkYXRlUXVlcnlTdGF0ZSh0LCBlLCBuKSB7XG4gICAgICAgIHRoaXMuVHIodCwgZSwgbik7XG4gICAgfVxuICAgIGhhbmRsZVVzZXJDaGFuZ2UodCwgZSwgbikge1xuICAgICAgICBlLmZvckVhY2goKHQgPT4ge1xuICAgICAgICAgICAgdGhpcy5wcih0KTtcbiAgICAgICAgfSkpLCB0aGlzLmN1cnJlbnRVc2VyID0gdCwgbi5mb3JFYWNoKCh0ID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWRkUGVuZGluZ011dGF0aW9uKHQpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIHNldE9ubGluZVN0YXRlKHQpIHtcbiAgICAgICAgdGhpcy5Fcih0KTtcbiAgICB9XG4gICAgbm90aWZ5QnVuZGxlTG9hZGVkKCkge1xuICAgICAgICB0aGlzLkFyKCk7XG4gICAgfVxuICAgIHNodXRkb3duKCkge1xuICAgICAgICB0aGlzLnN0YXJ0ZWQgJiYgKHRoaXMud2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzdG9yYWdlXCIsIHRoaXMuZXIpLCB0aGlzLnJlbW92ZUl0ZW0odGhpcy5yciksIFxuICAgICAgICB0aGlzLnN0YXJ0ZWQgPSAhMSk7XG4gICAgfVxuICAgIGdldEl0ZW0odCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0odCk7XG4gICAgICAgIHJldHVybiBPKFwiU2hhcmVkQ2xpZW50U3RhdGVcIiwgXCJSRUFEXCIsIHQsIGUpLCBlO1xuICAgIH1cbiAgICBzZXRJdGVtKHQsIGUpIHtcbiAgICAgICAgTyhcIlNoYXJlZENsaWVudFN0YXRlXCIsIFwiU0VUXCIsIHQsIGUpLCB0aGlzLnN0b3JhZ2Uuc2V0SXRlbSh0LCBlKTtcbiAgICB9XG4gICAgcmVtb3ZlSXRlbSh0KSB7XG4gICAgICAgIE8oXCJTaGFyZWRDbGllbnRTdGF0ZVwiLCBcIlJFTU9WRVwiLCB0KSwgdGhpcy5zdG9yYWdlLnJlbW92ZUl0ZW0odCk7XG4gICAgfVxuICAgIG5yKHQpIHtcbiAgICAgICAgLy8gTm90ZTogVGhlIGZ1bmN0aW9uIGlzIHR5cGVkIHRvIHRha2UgRXZlbnQgdG8gYmUgaW50ZXJmYWNlLWNvbXBhdGlibGUgd2l0aFxuICAgICAgICAvLyBgV2luZG93LmFkZEV2ZW50TGlzdGVuZXJgLlxuICAgICAgICBjb25zdCBlID0gdDtcbiAgICAgICAgaWYgKGUuc3RvcmFnZUFyZWEgPT09IHRoaXMuc3RvcmFnZSkge1xuICAgICAgICAgICAgaWYgKE8oXCJTaGFyZWRDbGllbnRTdGF0ZVwiLCBcIkVWRU5UXCIsIGUua2V5LCBlLm5ld1ZhbHVlKSwgZS5rZXkgPT09IHRoaXMucnIpIHJldHVybiB2b2lkICQoXCJSZWNlaXZlZCBXZWJTdG9yYWdlIG5vdGlmaWNhdGlvbiBmb3IgbG9jYWwgY2hhbmdlLiBBbm90aGVyIGNsaWVudCBtaWdodCBoYXZlIGdhcmJhZ2UtY29sbGVjdGVkIG91ciBzdGF0ZVwiKTtcbiAgICAgICAgICAgIHRoaXMuSG4uZW5xdWV1ZVJldHJ5YWJsZSgoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IGUua2V5KSBpZiAodGhpcy51ci50ZXN0KGUua2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gZS5uZXdWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLlJyKGUua2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5icih0LCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5QcihlLmtleSwgZS5uZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHJldHVybiB0aGlzLmJyKHQuY2xpZW50SWQsIHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY3IudGVzdChlLmtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSBlLm5ld1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuVnIoZS5rZXksIGUubmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KSByZXR1cm4gdGhpcy52cih0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmhyLnRlc3QoZS5rZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gZS5uZXdWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLlNyKGUua2V5LCBlLm5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkgcmV0dXJuIHRoaXMuRHIodCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IHRoaXMubHIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSBlLm5ld1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMud3IoZS5uZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHJldHVybiB0aGlzLm1yKHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSB0aGlzLmFyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlID0gbnQuQTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSB0KSB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gSlNPTi5wYXJzZSh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcShcIm51bWJlclwiID09IHR5cGVvZiBuKSwgZSA9IG47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKFwiU2hhcmVkQ2xpZW50U3RhdGVcIiwgXCJGYWlsZWQgdG8gcmVhZCBzZXF1ZW5jZSBudW1iZXIgZnJvbSBXZWJTdG9yYWdlXCIsIHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8qKlxuICogYE1lbW9yeVNoYXJlZENsaWVudFN0YXRlYCBpcyBhIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBTaGFyZWRDbGllbnRTdGF0ZSBmb3JcbiAqIGNsaWVudHMgdXNpbmcgbWVtb3J5IHBlcnNpc3RlbmNlLiBUaGUgc3RhdGUgaW4gdGhpcyBjbGFzcyByZW1haW5zIGZ1bGx5XG4gKiBpc29sYXRlZCBhbmQgbm8gc3luY2hyb25pemF0aW9uIGlzIHBlcmZvcm1lZC5cbiAqLyAoZS5uZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ICE9PSBudC5BICYmIHRoaXMuc2VxdWVuY2VOdW1iZXJIYW5kbGVyKHQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSB0aGlzLmRyKSByZXR1cm4gdGhpcy5zeW5jRW5naW5lLkNyKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHRoaXMuaXIucHVzaChlKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgSXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNyLmdldCh0aGlzLnRyKTtcbiAgICB9XG4gICAgX3IoKSB7XG4gICAgICAgIHRoaXMuc2V0SXRlbSh0aGlzLnJyLCB0aGlzLklyLllpKCkpO1xuICAgIH1cbiAgICB5cih0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSBuZXcgRW8odGhpcy5jdXJyZW50VXNlciwgdCwgZSwgbiksIGkgPSBJbyh0aGlzLnBlcnNpc3RlbmNlS2V5LCB0aGlzLmN1cnJlbnRVc2VyLCB0KTtcbiAgICAgICAgdGhpcy5zZXRJdGVtKGksIHMuWWkoKSk7XG4gICAgfVxuICAgIHByKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IElvKHRoaXMucGVyc2lzdGVuY2VLZXksIHRoaXMuY3VycmVudFVzZXIsIHQpO1xuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oZSk7XG4gICAgfVxuICAgIEVyKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHtcbiAgICAgICAgICAgIGNsaWVudElkOiB0aGlzLnRyLFxuICAgICAgICAgICAgb25saW5lU3RhdGU6IHRcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldEl0ZW0odGhpcy5sciwgSlNPTi5zdHJpbmdpZnkoZSkpO1xuICAgIH1cbiAgICBUcih0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSBUbyh0aGlzLnBlcnNpc3RlbmNlS2V5LCB0KSwgaSA9IG5ldyBBbyh0LCBlLCBuKTtcbiAgICAgICAgdGhpcy5zZXRJdGVtKHMsIGkuWWkoKSk7XG4gICAgfVxuICAgIEFyKCkge1xuICAgICAgICB0aGlzLnNldEl0ZW0odGhpcy5kciwgXCJ2YWx1ZS1ub3QtdXNlZFwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2VzIGEgY2xpZW50IHN0YXRlIGtleSBpbiBXZWJTdG9yYWdlLiBSZXR1cm5zIG51bGwgaWYgdGhlIGtleSBkb2VzIG5vdFxuICAgICAqIG1hdGNoIHRoZSBleHBlY3RlZCBrZXkgZm9ybWF0LlxuICAgICAqLyAgICBScih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLnVyLmV4ZWModCk7XG4gICAgICAgIHJldHVybiBlID8gZVsxXSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIGNsaWVudCBzdGF0ZSBpbiBXZWJTdG9yYWdlLiBSZXR1cm5zICdudWxsJyBpZiB0aGUgdmFsdWUgY291bGQgbm90XG4gICAgICogYmUgcGFyc2VkLlxuICAgICAqLyAgICBQcih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLlJyKHQpO1xuICAgICAgICByZXR1cm4gUm8uSmkobiwgZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIG11dGF0aW9uIGJhdGNoIHN0YXRlIGluIFdlYlN0b3JhZ2UuIFJldHVybnMgJ251bGwnIGlmIHRoZSB2YWx1ZVxuICAgICAqIGNvdWxkIG5vdCBiZSBwYXJzZWQuXG4gICAgICovICAgIFZyKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IHRoaXMuY3IuZXhlYyh0KSwgcyA9IE51bWJlcihuWzFdKSwgaSA9IHZvaWQgMCAhPT0gblsyXSA/IG5bMl0gOiBudWxsO1xuICAgICAgICByZXR1cm4gRW8uSmkobmV3IEMoaSksIHMsIGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSBxdWVyeSB0YXJnZXQgc3RhdGUgZnJvbSBXZWJTdG9yYWdlLiBSZXR1cm5zICdudWxsJyBpZiB0aGUgdmFsdWVcbiAgICAgKiBjb3VsZCBub3QgYmUgcGFyc2VkLlxuICAgICAqLyAgICBTcih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLmhyLmV4ZWModCksIHMgPSBOdW1iZXIoblsxXSk7XG4gICAgICAgIHJldHVybiBBby5KaShzLCBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2VzIGFuIG9ubGluZSBzdGF0ZSBmcm9tIFdlYlN0b3JhZ2UuIFJldHVybnMgJ251bGwnIGlmIHRoZSB2YWx1ZVxuICAgICAqIGNvdWxkIG5vdCBiZSBwYXJzZWQuXG4gICAgICovICAgIHdyKHQpIHtcbiAgICAgICAgcmV0dXJuIGJvLkppKHQpO1xuICAgIH1cbiAgICBhc3luYyB2cih0KSB7XG4gICAgICAgIGlmICh0LnVzZXIudWlkID09PSB0aGlzLmN1cnJlbnRVc2VyLnVpZCkgcmV0dXJuIHRoaXMuc3luY0VuZ2luZS5Ocih0LmJhdGNoSWQsIHQuc3RhdGUsIHQuZXJyb3IpO1xuICAgICAgICBPKFwiU2hhcmVkQ2xpZW50U3RhdGVcIiwgYElnbm9yaW5nIG11dGF0aW9uIGZvciBub24tYWN0aXZlIHVzZXIgJHt0LnVzZXIudWlkfWApO1xuICAgIH1cbiAgICBEcih0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmNFbmdpbmUua3IodC50YXJnZXRJZCwgdC5zdGF0ZSwgdC5lcnJvcik7XG4gICAgfVxuICAgIGJyKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IGUgPyB0aGlzLnNyLmluc2VydCh0LCBlKSA6IHRoaXMuc3IucmVtb3ZlKHQpLCBzID0gdGhpcy5ncih0aGlzLnNyKSwgaSA9IHRoaXMuZ3IobiksIHIgPSBbXSwgbyA9IFtdO1xuICAgICAgICByZXR1cm4gaS5mb3JFYWNoKCh0ID0+IHtcbiAgICAgICAgICAgIHMuaGFzKHQpIHx8IHIucHVzaCh0KTtcbiAgICAgICAgfSkpLCBzLmZvckVhY2goKHQgPT4ge1xuICAgICAgICAgICAgaS5oYXModCkgfHwgby5wdXNoKHQpO1xuICAgICAgICB9KSksIHRoaXMuc3luY0VuZ2luZS5NcihyLCBvKS50aGVuKCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNyID0gbjtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBtcih0KSB7XG4gICAgICAgIC8vIFdlIGNoZWNrIHdoZXRoZXIgdGhlIGNsaWVudCB0aGF0IHdyb3RlIHRoaXMgb25saW5lIHN0YXRlIGlzIHN0aWxsIGFjdGl2ZVxuICAgICAgICAvLyBieSBjb21wYXJpbmcgaXRzIGNsaWVudCBJRCB0byB0aGUgbGlzdCBvZiBjbGllbnRzIGtlcHQgYWN0aXZlIGluXG4gICAgICAgIC8vIEluZGV4ZWREYi4gSWYgYSBjbGllbnQgZG9lcyBub3QgdXBkYXRlIHRoZWlyIEluZGV4ZWREYiBjbGllbnQgc3RhdGVcbiAgICAgICAgLy8gd2l0aGluIDUgc2Vjb25kcywgaXQgaXMgY29uc2lkZXJlZCBpbmFjdGl2ZSBhbmQgd2UgZG9uJ3QgZW1pdCBhbiBvbmxpbmVcbiAgICAgICAgLy8gc3RhdGUgZXZlbnQuXG4gICAgICAgIHRoaXMuc3IuZ2V0KHQuY2xpZW50SWQpICYmIHRoaXMub25saW5lU3RhdGVIYW5kbGVyKHQub25saW5lU3RhdGUpO1xuICAgIH1cbiAgICBncih0KSB7XG4gICAgICAgIGxldCBlID0gam4oKTtcbiAgICAgICAgcmV0dXJuIHQuZm9yRWFjaCgoKHQsIG4pID0+IHtcbiAgICAgICAgICAgIGUgPSBlLnVuaW9uV2l0aChuLmFjdGl2ZVRhcmdldElkcyk7XG4gICAgICAgIH0pKSwgZTtcbiAgICB9XG59XG5cbmNsYXNzIHZvIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5PciA9IG5ldyBQbywgdGhpcy4kciA9IHt9LCB0aGlzLm9ubGluZVN0YXRlSGFuZGxlciA9IG51bGwsIHRoaXMuc2VxdWVuY2VOdW1iZXJIYW5kbGVyID0gbnVsbDtcbiAgICB9XG4gICAgYWRkUGVuZGluZ011dGF0aW9uKHQpIHtcbiAgICAgICAgLy8gTm8gb3AuXG4gICAgfVxuICAgIHVwZGF0ZU11dGF0aW9uU3RhdGUodCwgZSwgbikge1xuICAgICAgICAvLyBObyBvcC5cbiAgICB9XG4gICAgYWRkTG9jYWxRdWVyeVRhcmdldCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLk9yLlhpKHQpLCB0aGlzLiRyW3RdIHx8IFwibm90LWN1cnJlbnRcIjtcbiAgICB9XG4gICAgdXBkYXRlUXVlcnlTdGF0ZSh0LCBlLCBuKSB7XG4gICAgICAgIHRoaXMuJHJbdF0gPSBlO1xuICAgIH1cbiAgICByZW1vdmVMb2NhbFF1ZXJ5VGFyZ2V0KHQpIHtcbiAgICAgICAgdGhpcy5Pci5aaSh0KTtcbiAgICB9XG4gICAgaXNMb2NhbFF1ZXJ5VGFyZ2V0KHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuT3IuYWN0aXZlVGFyZ2V0SWRzLmhhcyh0KTtcbiAgICB9XG4gICAgY2xlYXJRdWVyeVN0YXRlKHQpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuJHJbdF07XG4gICAgfVxuICAgIGdldEFsbEFjdGl2ZVF1ZXJ5VGFyZ2V0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuT3IuYWN0aXZlVGFyZ2V0SWRzO1xuICAgIH1cbiAgICBpc0FjdGl2ZVF1ZXJ5VGFyZ2V0KHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuT3IuYWN0aXZlVGFyZ2V0SWRzLmhhcyh0KTtcbiAgICB9XG4gICAgc3RhcnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLk9yID0gbmV3IFBvLCBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgaGFuZGxlVXNlckNoYW5nZSh0LCBlLCBuKSB7XG4gICAgICAgIC8vIE5vIG9wLlxuICAgIH1cbiAgICBzZXRPbmxpbmVTdGF0ZSh0KSB7XG4gICAgICAgIC8vIE5vIG9wLlxuICAgIH1cbiAgICBzaHV0ZG93bigpIHt9XG4gICAgd3JpdGVTZXF1ZW5jZU51bWJlcih0KSB7fVxuICAgIG5vdGlmeUJ1bmRsZUxvYWRlZCgpIHtcbiAgICAgICAgLy8gTm8gb3AuXG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjbGFzcyBTbyB7XG4gICAgRnIodCkge1xuICAgICAgICAvLyBOby1vcC5cbiAgICB9XG4gICAgc2h1dGRvd24oKSB7XG4gICAgICAgIC8vIE5vLW9wLlxuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8vIFJlZmVyZW5jZXMgdG8gYHdpbmRvd2AgYXJlIGd1YXJkZWQgYnkgQnJvd3NlckNvbm5lY3Rpdml0eU1vbml0b3IuaXNBdmFpbGFibGUoKVxuLyogZXNsaW50LWRpc2FibGUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzICovXG4vKipcbiAqIEJyb3dzZXIgaW1wbGVtZW50YXRpb24gb2YgQ29ubmVjdGl2aXR5TW9uaXRvci5cbiAqL1xuY2xhc3MgRG8ge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLkJyID0gKCkgPT4gdGhpcy5McigpLCB0aGlzLnFyID0gKCkgPT4gdGhpcy5VcigpLCB0aGlzLktyID0gW10sIHRoaXMuR3IoKTtcbiAgICB9XG4gICAgRnIodCkge1xuICAgICAgICB0aGlzLktyLnB1c2godCk7XG4gICAgfVxuICAgIHNodXRkb3duKCkge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm9ubGluZVwiLCB0aGlzLkJyKSwgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJvZmZsaW5lXCIsIHRoaXMucXIpO1xuICAgIH1cbiAgICBHcigpIHtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJvbmxpbmVcIiwgdGhpcy5CciksIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwib2ZmbGluZVwiLCB0aGlzLnFyKTtcbiAgICB9XG4gICAgTHIoKSB7XG4gICAgICAgIE8oXCJDb25uZWN0aXZpdHlNb25pdG9yXCIsIFwiTmV0d29yayBjb25uZWN0aXZpdHkgY2hhbmdlZDogQVZBSUxBQkxFXCIpO1xuICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5LcikgdCgwIC8qIEFWQUlMQUJMRSAqLyk7XG4gICAgfVxuICAgIFVyKCkge1xuICAgICAgICBPKFwiQ29ubmVjdGl2aXR5TW9uaXRvclwiLCBcIk5ldHdvcmsgY29ubmVjdGl2aXR5IGNoYW5nZWQ6IFVOQVZBSUxBQkxFXCIpO1xuICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5LcikgdCgxIC8qIFVOQVZBSUxBQkxFICovKTtcbiAgICB9XG4gICAgLy8gVE9ETyhjaGVuYnJpYW4pOiBDb25zaWRlciBwYXNzaW5nIGluIHdpbmRvdyBlaXRoZXIgaW50byB0aGlzIGNvbXBvbmVudCBvclxuICAgIC8vIGhlcmUgZm9yIHRlc3RpbmcgdmlhIEZha2VXaW5kb3cuXG4gICAgLyoqIENoZWNrcyB0aGF0IGFsbCB1c2VkIGF0dHJpYnV0ZXMgb2Ygd2luZG93IGFyZSBhdmFpbGFibGUuICovXG4gICAgc3RhdGljIHZ0KCkge1xuICAgICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2Ygd2luZG93ICYmIHZvaWQgMCAhPT0gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIgJiYgdm9pZCAwICE9PSB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcjtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGNvbnN0IENvID0ge1xuICAgIEJhdGNoR2V0RG9jdW1lbnRzOiBcImJhdGNoR2V0XCIsXG4gICAgQ29tbWl0OiBcImNvbW1pdFwiLFxuICAgIFJ1blF1ZXJ5OiBcInJ1blF1ZXJ5XCJcbn07XG5cbi8qKlxuICogTWFwcyBSUEMgbmFtZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgUkVTVCBlbmRwb2ludCBuYW1lLlxuICpcbiAqIFdlIHVzZSBhcnJheSBub3RhdGlvbiB0byBhdm9pZCBtYW5nbGluZy5cbiAqL1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogUHJvdmlkZXMgYSBzaW1wbGUgaGVscGVyIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgU3RyZWFtIGludGVyZmFjZSB0b1xuICogYnJpZGdlIHRvIG90aGVyIGltcGxlbWVudGF0aW9ucyB0aGF0IGFyZSBzdHJlYW1zIGJ1dCBkbyBub3QgaW1wbGVtZW50IHRoZVxuICogaW50ZXJmYWNlLiBUaGUgc3RyZWFtIGNhbGxiYWNrcyBhcmUgaW52b2tlZCB3aXRoIHRoZSBjYWxsT24uLi4gbWV0aG9kcy5cbiAqL1xuY2xhc3MgeG8ge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5RciA9IHQuUXIsIHRoaXMuanIgPSB0LmpyO1xuICAgIH1cbiAgICBXcih0KSB7XG4gICAgICAgIHRoaXMuenIgPSB0O1xuICAgIH1cbiAgICBIcih0KSB7XG4gICAgICAgIHRoaXMuSnIgPSB0O1xuICAgIH1cbiAgICBvbk1lc3NhZ2UodCkge1xuICAgICAgICB0aGlzLllyID0gdDtcbiAgICB9XG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMuanIoKTtcbiAgICB9XG4gICAgc2VuZCh0KSB7XG4gICAgICAgIHRoaXMuUXIodCk7XG4gICAgfVxuICAgIFhyKCkge1xuICAgICAgICB0aGlzLnpyKCk7XG4gICAgfVxuICAgIFpyKHQpIHtcbiAgICAgICAgdGhpcy5Kcih0KTtcbiAgICB9XG4gICAgZW8odCkge1xuICAgICAgICB0aGlzLllyKHQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gY2xhc3MgTm8gZXh0ZW5kcyBcbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgYWxsIFJlc3QtYmFzZWQgY29ubmVjdGlvbnMgdG8gdGhlIGJhY2tlbmQgKFdlYkNoYW5uZWwgYW5kXG4gKiBIVFRQKS5cbiAqL1xuY2xhc3Mge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5kYXRhYmFzZUluZm8gPSB0LCB0aGlzLmRhdGFiYXNlSWQgPSB0LmRhdGFiYXNlSWQ7XG4gICAgICAgIGNvbnN0IGUgPSB0LnNzbCA/IFwiaHR0cHNcIiA6IFwiaHR0cFwiO1xuICAgICAgICB0aGlzLm5vID0gZSArIFwiOi8vXCIgKyB0Lmhvc3QsIHRoaXMuc28gPSBcInByb2plY3RzL1wiICsgdGhpcy5kYXRhYmFzZUlkLnByb2plY3RJZCArIFwiL2RhdGFiYXNlcy9cIiArIHRoaXMuZGF0YWJhc2VJZC5kYXRhYmFzZSArIFwiL2RvY3VtZW50c1wiO1xuICAgIH1cbiAgICBpbyh0LCBlLCBuLCBzLCBpKSB7XG4gICAgICAgIGNvbnN0IHIgPSB0aGlzLnJvKHQsIGUpO1xuICAgICAgICBPKFwiUmVzdENvbm5lY3Rpb25cIiwgXCJTZW5kaW5nOiBcIiwgciwgbik7XG4gICAgICAgIGNvbnN0IG8gPSB7fTtcbiAgICAgICAgcmV0dXJuIHRoaXMub28obywgcywgaSksIHRoaXMuYW8odCwgciwgbywgbikudGhlbigodCA9PiAoTyhcIlJlc3RDb25uZWN0aW9uXCIsIFwiUmVjZWl2ZWQ6IFwiLCB0KSwgXG4gICAgICAgIHQpKSwgKGUgPT4ge1xuICAgICAgICAgICAgdGhyb3cgRihcIlJlc3RDb25uZWN0aW9uXCIsIGAke3R9IGZhaWxlZCB3aXRoIGVycm9yOiBgLCBlLCBcInVybDogXCIsIHIsIFwicmVxdWVzdDpcIiwgbiksIFxuICAgICAgICAgICAgZTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICB1byh0LCBlLCBuLCBzLCBpKSB7XG4gICAgICAgIC8vIFRoZSBSRVNUIEFQSSBhdXRvbWF0aWNhbGx5IGFnZ3JlZ2F0ZXMgYWxsIG9mIHRoZSBzdHJlYW1lZCByZXN1bHRzLCBzbyB3ZVxuICAgICAgICAvLyBjYW4ganVzdCB1c2UgdGhlIG5vcm1hbCBpbnZva2UoKSBtZXRob2QuXG4gICAgICAgIHJldHVybiB0aGlzLmlvKHQsIGUsIG4sIHMsIGkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNb2RpZmllcyB0aGUgaGVhZGVycyBmb3IgYSByZXF1ZXN0LCBhZGRpbmcgYW55IGF1dGhvcml6YXRpb24gdG9rZW4gaWZcbiAgICAgKiBwcmVzZW50IGFuZCBhbnkgYWRkaXRpb25hbCBoZWFkZXJzIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKi8gICAgb28odCwgZSwgbikge1xuICAgICAgICB0W1wiWC1Hb29nLUFwaS1DbGllbnRcIl0gPSBcImdsLWpzLyBmaXJlL1wiICsgeCwgXG4gICAgICAgIC8vIENvbnRlbnQtVHlwZTogdGV4dC9wbGFpbiB3aWxsIGF2b2lkIHByZWZsaWdodCByZXF1ZXN0cyB3aGljaCBtaWdodFxuICAgICAgICAvLyBtZXNzIHdpdGggQ09SUyBhbmQgcmVkaXJlY3RzIGJ5IHByb3hpZXMuIElmIHdlIGFkZCBjdXN0b20gaGVhZGVyc1xuICAgICAgICAvLyB3ZSB3aWxsIG5lZWQgdG8gY2hhbmdlIHRoaXMgY29kZSB0byBwb3RlbnRpYWxseSB1c2UgdGhlICRodHRwT3ZlcndyaXRlXG4gICAgICAgIC8vIHBhcmFtZXRlciBzdXBwb3J0ZWQgYnkgRVNGIHRvIGF2b2lkIHRyaWdnZXJpbmcgcHJlZmxpZ2h0IHJlcXVlc3RzLlxuICAgICAgICB0W1wiQ29udGVudC1UeXBlXCJdID0gXCJ0ZXh0L3BsYWluXCIsIHRoaXMuZGF0YWJhc2VJbmZvLmFwcElkICYmICh0W1wiWC1GaXJlYmFzZS1HTVBJRFwiXSA9IHRoaXMuZGF0YWJhc2VJbmZvLmFwcElkKSwgXG4gICAgICAgIGUgJiYgZS5oZWFkZXJzLmZvckVhY2goKChlLCBuKSA9PiB0W25dID0gZSkpLCBuICYmIG4uaGVhZGVycy5mb3JFYWNoKCgoZSwgbikgPT4gdFtuXSA9IGUpKTtcbiAgICB9XG4gICAgcm8odCwgZSkge1xuICAgICAgICBjb25zdCBuID0gQ29bdF07XG4gICAgICAgIHJldHVybiBgJHt0aGlzLm5vfS92MS8ke2V9OiR7bn1gO1xuICAgIH1cbn0ge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgc3VwZXIodCksIHRoaXMuZm9yY2VMb25nUG9sbGluZyA9IHQuZm9yY2VMb25nUG9sbGluZywgdGhpcy5hdXRvRGV0ZWN0TG9uZ1BvbGxpbmcgPSB0LmF1dG9EZXRlY3RMb25nUG9sbGluZywgXG4gICAgICAgIHRoaXMudXNlRmV0Y2hTdHJlYW1zID0gdC51c2VGZXRjaFN0cmVhbXM7XG4gICAgfVxuICAgIGFvKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKCgoaSwgcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgbyA9IG5ldyBYaHJJbztcbiAgICAgICAgICAgIG8ubGlzdGVuT25jZShFdmVudFR5cGUuQ09NUExFVEUsICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvLmdldExhc3RFcnJvckNvZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2RlLk5PX0VSUk9SOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IG8uZ2V0UmVzcG9uc2VKc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBPKFwiQ29ubmVjdGlvblwiLCBcIlhIUiByZWNlaXZlZDpcIiwgSlNPTi5zdHJpbmdpZnkoZSkpLCBpKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIEVycm9yQ29kZS5USU1FT1VUOlxuICAgICAgICAgICAgICAgICAgICAgICAgTyhcIkNvbm5lY3Rpb25cIiwgJ1JQQyBcIicgKyB0ICsgJ1wiIHRpbWVkIG91dCcpLCByKG5ldyBRKEcuREVBRExJTkVfRVhDRUVERUQsIFwiUmVxdWVzdCB0aW1lIG91dFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2RlLkhUVFBfRVJST1I6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gby5nZXRTdGF0dXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPKFwiQ29ubmVjdGlvblwiLCAnUlBDIFwiJyArIHQgKyAnXCIgZmFpbGVkIHdpdGggc3RhdHVzOicsIG4sIFwicmVzcG9uc2UgdGV4dDpcIiwgby5nZXRSZXNwb25zZVRleHQoKSksIFxuICAgICAgICAgICAgICAgICAgICAgICAgbiA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gby5nZXRSZXNwb25zZUpzb24oKS5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiB0LnN0YXR1cyAmJiB0Lm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXy9nLCBcIi1cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhHKS5pbmRleE9mKGUpID49IDAgPyBlIDogRy5VTktOT1dOO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHQuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcihuZXcgUShlLCB0Lm1lc3NhZ2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgcihuZXcgUShHLlVOS05PV04sIFwiU2VydmVyIHJlc3BvbmRlZCB3aXRoIHN0YXR1cyBcIiArIG8uZ2V0U3RhdHVzKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIHJlY2VpdmVkIGFuIEhUVFBfRVJST1IgYnV0IHRoZXJlJ3Mgbm8gc3RhdHVzIGNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIG1vc3QgcHJvYmFibHkgYSBjb25uZWN0aW9uIGlzc3VlXG4gICAgICAgICAgICAgICAgICAgICAgICByKG5ldyBRKEcuVU5BVkFJTEFCTEUsIFwiQ29ubmVjdGlvbiBmYWlsZWQuXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIEwoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIE8oXCJDb25uZWN0aW9uXCIsICdSUEMgXCInICsgdCArICdcIiBjb21wbGV0ZWQuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgY29uc3QgYSA9IEpTT04uc3RyaW5naWZ5KHMpO1xuICAgICAgICAgICAgby5zZW5kKGUsIFwiUE9TVFwiLCBhLCBuLCAxNSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgY28odCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gWyB0aGlzLm5vLCBcIi9cIiwgXCJnb29nbGUuZmlyZXN0b3JlLnYxLkZpcmVzdG9yZVwiLCBcIi9cIiwgdCwgXCIvY2hhbm5lbFwiIF0sIGkgPSBjcmVhdGVXZWJDaGFubmVsVHJhbnNwb3J0KCksIHIgPSBnZXRTdGF0RXZlbnRUYXJnZXQoKSwgbyA9IHtcbiAgICAgICAgICAgIC8vIFJlcXVpcmVkIGZvciBiYWNrZW5kIHN0aWNraW5lc3MsIHJvdXRpbmcgYmVoYXZpb3IgaXMgYmFzZWQgb24gdGhpc1xuICAgICAgICAgICAgLy8gcGFyYW1ldGVyLlxuICAgICAgICAgICAgaHR0cFNlc3Npb25JZFBhcmFtOiBcImdzZXNzaW9uaWRcIixcbiAgICAgICAgICAgIGluaXRNZXNzYWdlSGVhZGVyczoge30sXG4gICAgICAgICAgICBtZXNzYWdlVXJsUGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBwYXJhbSBpcyB1c2VkIHRvIGltcHJvdmUgcm91dGluZyBhbmQgcHJvamVjdCBpc29sYXRpb24gYnkgdGhlXG4gICAgICAgICAgICAgICAgLy8gYmFja2VuZCBhbmQgbXVzdCBiZSBpbmNsdWRlZCBpbiBldmVyeSByZXF1ZXN0LlxuICAgICAgICAgICAgICAgIGRhdGFiYXNlOiBgcHJvamVjdHMvJHt0aGlzLmRhdGFiYXNlSWQucHJvamVjdElkfS9kYXRhYmFzZXMvJHt0aGlzLmRhdGFiYXNlSWQuZGF0YWJhc2V9YFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlbmRSYXdKc29uOiAhMCxcbiAgICAgICAgICAgIHN1cHBvcnRzQ3Jvc3NEb21haW5YaHI6ICEwLFxuICAgICAgICAgICAgaW50ZXJuYWxDaGFubmVsUGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgLy8gT3ZlcnJpZGUgdGhlIGRlZmF1bHQgdGltZW91dCAocmFuZG9taXplZCBiZXR3ZWVuIDEwLTIwIHNlY29uZHMpIHNpbmNlXG4gICAgICAgICAgICAgICAgLy8gYSBsYXJnZSB3cml0ZSBiYXRjaCBvbiBhIHNsb3cgaW50ZXJuZXQgY29ubmVjdGlvbiBtYXkgdGFrZSBhIGxvbmdcbiAgICAgICAgICAgICAgICAvLyB0aW1lIHRvIHNlbmQgdG8gdGhlIGJhY2tlbmQuIFJhdGhlciB0aGFuIGhhdmUgV2ViQ2hhbm5lbCBpbXBvc2UgYVxuICAgICAgICAgICAgICAgIC8vIHRpZ2h0IHRpbWVvdXQgd2hpY2ggY291bGQgbGVhZCB0byBpbmZpbml0ZSB0aW1lb3V0cyBhbmQgcmV0cmllcywgd2VcbiAgICAgICAgICAgICAgICAvLyBzZXQgaXQgdmVyeSBsYXJnZSAoNS0xMCBtaW51dGVzKSBhbmQgcmVseSBvbiB0aGUgYnJvd3NlcidzIGJ1aWx0aW5cbiAgICAgICAgICAgICAgICAvLyB0aW1lb3V0cyB0byBraWNrIGluIGlmIHRoZSByZXF1ZXN0IGlzbid0IHdvcmtpbmcuXG4gICAgICAgICAgICAgICAgZm9yd2FyZENoYW5uZWxSZXF1ZXN0VGltZW91dE1zOiA2ZTVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmb3JjZUxvbmdQb2xsaW5nOiB0aGlzLmZvcmNlTG9uZ1BvbGxpbmcsXG4gICAgICAgICAgICBkZXRlY3RCdWZmZXJpbmdQcm94eTogdGhpcy5hdXRvRGV0ZWN0TG9uZ1BvbGxpbmdcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy51c2VGZXRjaFN0cmVhbXMgJiYgKG8ueG1sSHR0cEZhY3RvcnkgPSBuZXcgRmV0Y2hYbWxIdHRwRmFjdG9yeSh7fSkpLCB0aGlzLm9vKG8uaW5pdE1lc3NhZ2VIZWFkZXJzLCBlLCBuKSwgXG4gICAgICAgIC8vIFNlbmRpbmcgdGhlIGN1c3RvbSBoZWFkZXJzIHdlIGp1c3QgYWRkZWQgdG8gcmVxdWVzdC5pbml0TWVzc2FnZUhlYWRlcnNcbiAgICAgICAgLy8gKEF1dGhvcml6YXRpb24sIGV0Yy4pIHdpbGwgdHJpZ2dlciB0aGUgYnJvd3NlciB0byBtYWtlIGEgQ09SUyBwcmVmbGlnaHRcbiAgICAgICAgLy8gcmVxdWVzdCBiZWNhdXNlIHRoZSBYSFIgd2lsbCBubyBsb25nZXIgbWVldCB0aGUgY3JpdGVyaWEgZm9yIGEgXCJzaW1wbGVcIlxuICAgICAgICAvLyBDT1JTIHJlcXVlc3Q6XG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvQ09SUyNTaW1wbGVfcmVxdWVzdHNcbiAgICAgICAgLy8gVGhlcmVmb3JlIHRvIGF2b2lkIHRoZSBDT1JTIHByZWZsaWdodCByZXF1ZXN0IChhbiBleHRyYSBuZXR3b3JrXG4gICAgICAgIC8vIHJvdW5kdHJpcCksIHdlIHVzZSB0aGUgaHR0cEhlYWRlcnNPdmVyd3JpdGVQYXJhbSBvcHRpb24gdG8gc3BlY2lmeSB0aGF0XG4gICAgICAgIC8vIHRoZSBoZWFkZXJzIHNob3VsZCBpbnN0ZWFkIGJlIGVuY29kZWQgaW50byBhIHNwZWNpYWwgXCIkaHR0cEhlYWRlcnNcIiBxdWVyeVxuICAgICAgICAvLyBwYXJhbWV0ZXIsIHdoaWNoIGlzIHJlY29nbml6ZWQgYnkgdGhlIHdlYmNoYW5uZWwgYmFja2VuZC4gVGhpcyBpc1xuICAgICAgICAvLyBmb3JtYWxseSBkZWZpbmVkIGhlcmU6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1saWJyYXJ5L2Jsb2IvYjBlMTgxNWIxM2ZiOTJhNDZkN2M5YjNjMzBkZTVkNmEzOTZhMzI0NS9jbG9zdXJlL2dvb2cvbmV0L3JwYy9odHRwY29ycy5qcyNMMzJcbiAgICAgICAgLy8gVE9ETyhiLzE0NTYyNDc1Nik6IFRoZXJlIGlzIGEgYmFja2VuZCBidWcgd2hlcmUgJGh0dHBIZWFkZXJzIGlzbid0IHJlc3BlY3RlZCBpZiB0aGUgcmVxdWVzdFxuICAgICAgICAvLyBkb2Vzbid0IGhhdmUgYW4gT3JpZ2luIGhlYWRlci4gU28gd2UgaGF2ZSB0byBleGNsdWRlIGEgZmV3IGJyb3dzZXIgZW52aXJvbm1lbnRzIHRoYXQgYXJlXG4gICAgICAgIC8vIGtub3duIHRvIChzb21ldGltZXMpIG5vdCBpbmNsdWRlIGFuIE9yaWdpbi4gU2VlXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9maXJlYmFzZS9maXJlYmFzZS1qcy1zZGsvaXNzdWVzLzE0OTEuXG4gICAgICAgIGlzTW9iaWxlQ29yZG92YSgpIHx8IGlzUmVhY3ROYXRpdmUoKSB8fCBpc0VsZWN0cm9uKCkgfHwgaXNJRSgpIHx8IGlzVVdQKCkgfHwgaXNCcm93c2VyRXh0ZW5zaW9uKCkgfHwgKG8uaHR0cEhlYWRlcnNPdmVyd3JpdGVQYXJhbSA9IFwiJGh0dHBIZWFkZXJzXCIpO1xuICAgICAgICBjb25zdCBhID0gcy5qb2luKFwiXCIpO1xuICAgICAgICBPKFwiQ29ubmVjdGlvblwiLCBcIkNyZWF0aW5nIFdlYkNoYW5uZWw6IFwiICsgYSwgbyk7XG4gICAgICAgIGNvbnN0IHUgPSBpLmNyZWF0ZVdlYkNoYW5uZWwoYSwgbyk7XG4gICAgICAgIC8vIFdlYkNoYW5uZWwgc3VwcG9ydHMgc2VuZGluZyB0aGUgZmlyc3QgbWVzc2FnZSB3aXRoIHRoZSBoYW5kc2hha2UgLSBzYXZpbmdcbiAgICAgICAgLy8gYSBuZXR3b3JrIHJvdW5kIHRyaXAuIEhvd2V2ZXIsIGl0IHdpbGwgaGF2ZSB0byBjYWxsIHNlbmQgaW4gdGhlIHNhbWVcbiAgICAgICAgLy8gSlMgZXZlbnQgbG9vcCBhcyBvcGVuLiBJbiBvcmRlciB0byBlbmZvcmNlIHRoaXMsIHdlIGRlbGF5IGFjdHVhbGx5XG4gICAgICAgIC8vIG9wZW5pbmcgdGhlIFdlYkNoYW5uZWwgdW50aWwgc2VuZCBpcyBjYWxsZWQuIFdoZXRoZXIgd2UgaGF2ZSBjYWxsZWRcbiAgICAgICAgLy8gb3BlbiBpcyB0cmFja2VkIHdpdGggdGhpcyB2YXJpYWJsZS5cbiAgICAgICAgICAgICAgICBsZXQgYyA9ICExLCBoID0gITE7XG4gICAgICAgIC8vIEEgZmxhZyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgc3RyZWFtIHdhcyBjbG9zZWQgKGJ5IHVzIG9yIHRocm91Z2ggYW5cbiAgICAgICAgLy8gZXJyb3IvY2xvc2UgZXZlbnQpIHRvIGF2b2lkIGRlbGl2ZXJpbmcgbXVsdGlwbGUgY2xvc2UgZXZlbnRzIG9yIHNlbmRpbmdcbiAgICAgICAgLy8gb24gYSBjbG9zZWQgc3RyZWFtXG4gICAgICAgICAgICAgICAgY29uc3QgbCA9IG5ldyB4byh7XG4gICAgICAgICAgICBRcjogdCA9PiB7XG4gICAgICAgICAgICAgICAgaCA/IE8oXCJDb25uZWN0aW9uXCIsIFwiTm90IHNlbmRpbmcgYmVjYXVzZSBXZWJDaGFubmVsIGlzIGNsb3NlZDpcIiwgdCkgOiAoYyB8fCAoTyhcIkNvbm5lY3Rpb25cIiwgXCJPcGVuaW5nIFdlYkNoYW5uZWwgdHJhbnNwb3J0LlwiKSwgXG4gICAgICAgICAgICAgICAgdS5vcGVuKCksIGMgPSAhMCksIE8oXCJDb25uZWN0aW9uXCIsIFwiV2ViQ2hhbm5lbCBzZW5kaW5nOlwiLCB0KSwgdS5zZW5kKHQpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBqcjogKCkgPT4gdS5jbG9zZSgpXG4gICAgICAgIH0pLCB5ID0gKHQsIGUsIG4pID0+IHtcbiAgICAgICAgICAgIC8vIFRPRE8oZGltb25kKTogY2xvc3VyZSB0eXBpbmcgc2VlbXMgYnJva2VuIGJlY2F1c2UgV2ViQ2hhbm5lbCBkb2VzXG4gICAgICAgICAgICAvLyBub3QgaW1wbGVtZW50IGdvb2cuZXZlbnRzLkxpc3RlbmFibGVcbiAgICAgICAgICAgIHQubGlzdGVuKGUsICh0ID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBuKHQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdDtcbiAgICAgICAgICAgICAgICAgICAgfSksIDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gQ2xvc3VyZSBldmVudHMgYXJlIGd1YXJkZWQgYW5kIGV4Y2VwdGlvbnMgYXJlIHN3YWxsb3dlZCwgc28gY2F0Y2ggYW55XG4gICAgICAgIC8vIGV4Y2VwdGlvbiBhbmQgcmV0aHJvdyB1c2luZyBhIHNldFRpbWVvdXQgc28gdGhleSBiZWNvbWUgdmlzaWJsZSBhZ2Fpbi5cbiAgICAgICAgLy8gTm90ZSB0aGF0IGV2ZW50dWFsbHkgdGhpcyBmdW5jdGlvbiBjb3VsZCBnbyBhd2F5IGlmIHdlIGFyZSBjb25maWRlbnRcbiAgICAgICAgLy8gZW5vdWdoIHRoZSBjb2RlIGlzIGV4Y2VwdGlvbiBmcmVlLlxuICAgICAgICAgICAgICAgIHJldHVybiB5KHUsIFdlYkNoYW5uZWwuRXZlbnRUeXBlLk9QRU4sICgoKSA9PiB7XG4gICAgICAgICAgICBoIHx8IE8oXCJDb25uZWN0aW9uXCIsIFwiV2ViQ2hhbm5lbCB0cmFuc3BvcnQgb3BlbmVkLlwiKTtcbiAgICAgICAgfSkpLCB5KHUsIFdlYkNoYW5uZWwuRXZlbnRUeXBlLkNMT1NFLCAoKCkgPT4ge1xuICAgICAgICAgICAgaCB8fCAoaCA9ICEwLCBPKFwiQ29ubmVjdGlvblwiLCBcIldlYkNoYW5uZWwgdHJhbnNwb3J0IGNsb3NlZFwiKSwgbC5acigpKTtcbiAgICAgICAgfSkpLCB5KHUsIFdlYkNoYW5uZWwuRXZlbnRUeXBlLkVSUk9SLCAodCA9PiB7XG4gICAgICAgICAgICBoIHx8IChoID0gITAsIEYoXCJDb25uZWN0aW9uXCIsIFwiV2ViQ2hhbm5lbCB0cmFuc3BvcnQgZXJyb3JlZDpcIiwgdCksIGwuWnIobmV3IFEoRy5VTkFWQUlMQUJMRSwgXCJUaGUgb3BlcmF0aW9uIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWRcIikpKTtcbiAgICAgICAgfSkpLCB5KHUsIFdlYkNoYW5uZWwuRXZlbnRUeXBlLk1FU1NBR0UsICh0ID0+IHtcbiAgICAgICAgICAgIHZhciBlO1xuICAgICAgICAgICAgaWYgKCFoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbiA9IHQuZGF0YVswXTtcbiAgICAgICAgICAgICAgICBxKCEhbik7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyhiLzM1MTQzODkxKTogVGhlcmUgaXMgYSBidWcgaW4gT25lIFBsYXRmb3JtIHRoYXQgY2F1c2VkIGVycm9yc1xuICAgICAgICAgICAgICAgIC8vIChhbmQgb25seSBlcnJvcnMpIHRvIGJlIHdyYXBwZWQgaW4gYW4gZXh0cmEgYXJyYXkuIFRvIGJlIGZvcndhcmRcbiAgICAgICAgICAgICAgICAvLyBjb21wYXRpYmxlIHdpdGggdGhlIGJ1ZyB3ZSBuZWVkIHRvIGNoZWNrIGVpdGhlciBjb25kaXRpb24uIFRoZSBsYXR0ZXJcbiAgICAgICAgICAgICAgICAvLyBjYW4gYmUgcmVtb3ZlZCBvbmNlIHRoZSBmaXggaGFzIGJlZW4gcm9sbGVkIG91dC5cbiAgICAgICAgICAgICAgICAvLyBVc2UgYW55IGJlY2F1c2UgbXNnRGF0YS5lcnJvciBpcyBub3QgdHlwZWQuXG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IG4sIGkgPSBzLmVycm9yIHx8IChudWxsID09PSAoZSA9IHNbMF0pIHx8IHZvaWQgMCA9PT0gZSA/IHZvaWQgMCA6IGUuZXJyb3IpO1xuICAgICAgICAgICAgICAgIGlmIChpKSB7XG4gICAgICAgICAgICAgICAgICAgIE8oXCJDb25uZWN0aW9uXCIsIFwiV2ViQ2hhbm5lbCByZWNlaXZlZCBlcnJvcjpcIiwgaSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVycm9yLnN0YXR1cyB3aWxsIGJlIGEgc3RyaW5nIGxpa2UgJ09LJyBvciAnTk9UX0ZPVU5EJy5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGkuc3RhdHVzO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZSA9IFxuICAgICAgICAgICAgICAgICAgICAvKipcbiAqIE1hcHMgYW4gZXJyb3IgQ29kZSBmcm9tIGEgR1JQQyBzdGF0dXMgaWRlbnRpZmllciBsaWtlICdOT1RfRk9VTkQnLlxuICpcbiAqIEByZXR1cm5zIFRoZSBDb2RlIGVxdWl2YWxlbnQgdG8gdGhlIGdpdmVuIHN0YXR1cyBzdHJpbmcgb3IgdW5kZWZpbmVkIGlmXG4gKiAgICAgdGhlcmUgaXMgbm8gbWF0Y2guXG4gKi9cbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9va3VwIGJ5IHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBQblt0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgIT09IGUpIHJldHVybiBTbihlKTtcbiAgICAgICAgICAgICAgICAgICAgfSh0KSwgbiA9IGkubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgdm9pZCAwID09PSBlICYmIChlID0gRy5JTlRFUk5BTCwgbiA9IFwiVW5rbm93biBlcnJvciBzdGF0dXM6IFwiICsgdCArIFwiIHdpdGggbWVzc2FnZSBcIiArIGkubWVzc2FnZSksIFxuICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIGNsb3NlZCBzbyBubyBmdXJ0aGVyIGV2ZW50cyBhcmUgcHJvcGFnYXRlZFxuICAgICAgICAgICAgICAgICAgICBoID0gITAsIGwuWnIobmV3IFEoZSwgbikpLCB1LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIE8oXCJDb25uZWN0aW9uXCIsIFwiV2ViQ2hhbm5lbCByZWNlaXZlZDpcIiwgbiksIGwuZW8obik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKSwgeShyLCBFdmVudC5TVEFUX0VWRU5ULCAodCA9PiB7XG4gICAgICAgICAgICB0LnN0YXQgPT09IFN0YXQuUFJPWFkgPyBPKFwiQ29ubmVjdGlvblwiLCBcIkRldGVjdGVkIGJ1ZmZlcmluZyBwcm94eVwiKSA6IHQuc3RhdCA9PT0gU3RhdC5OT1BST1hZICYmIE8oXCJDb25uZWN0aW9uXCIsIFwiRGV0ZWN0ZWQgbm8gYnVmZmVyaW5nIHByb3h5XCIpO1xuICAgICAgICB9KSksIHNldFRpbWVvdXQoKCgpID0+IHtcbiAgICAgICAgICAgIC8vIFRlY2huaWNhbGx5IHdlIGNvdWxkL3Nob3VsZCB3YWl0IGZvciB0aGUgV2ViQ2hhbm5lbCBvcGVuZWQgZXZlbnQsXG4gICAgICAgICAgICAvLyBidXQgYmVjYXVzZSB3ZSB3YW50IHRvIHNlbmQgdGhlIGZpcnN0IG1lc3NhZ2Ugd2l0aCB0aGUgV2ViQ2hhbm5lbFxuICAgICAgICAgICAgLy8gaGFuZHNoYWtlIHdlIHByZXRlbmQgdGhlIGNoYW5uZWwgb3BlbmVkIGhlcmUgKGFzeW5jaHJvbm91c2x5KSwgYW5kXG4gICAgICAgICAgICAvLyB0aGVuIGRlbGF5IHRoZSBhY3R1YWwgb3BlbiB1bnRpbCB0aGUgZmlyc3QgbWVzc2FnZSBpcyBzZW50LlxuICAgICAgICAgICAgbC5YcigpO1xuICAgICAgICB9KSwgMCksIGw7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqIEluaXRpYWxpemVzIHRoZSBXZWJDaGFubmVsQ29ubmVjdGlvbiBmb3IgdGhlIGJyb3dzZXIuICovXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqIFRoZSBQbGF0Zm9ybSdzICd3aW5kb3cnIGltcGxlbWVudGF0aW9uIG9yIG51bGwgaWYgbm90IGF2YWlsYWJsZS4gKi9cbmZ1bmN0aW9uIGtvKCkge1xuICAgIC8vIGB3aW5kb3dgIGlzIG5vdCBhbHdheXMgYXZhaWxhYmxlLCBlLmcuIGluIFJlYWN0TmF0aXZlIGFuZCBXZWJXb3JrZXJzLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHNcbiAgICByZXR1cm4gXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2Ygd2luZG93ID8gd2luZG93IDogbnVsbDtcbn1cblxuLyoqIFRoZSBQbGF0Zm9ybSdzICdkb2N1bWVudCcgaW1wbGVtZW50YXRpb24gb3IgbnVsbCBpZiBub3QgYXZhaWxhYmxlLiAqLyBmdW5jdGlvbiBNbygpIHtcbiAgICAvLyBgZG9jdW1lbnRgIGlzIG5vdCBhbHdheXMgYXZhaWxhYmxlLCBlLmcuIGluIFJlYWN0TmF0aXZlIGFuZCBXZWJXb3JrZXJzLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHNcbiAgICByZXR1cm4gXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgZG9jdW1lbnQgPyBkb2N1bWVudCA6IG51bGw7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGZ1bmN0aW9uIE9vKHQpIHtcbiAgICByZXR1cm4gbmV3IGlzKHQsIC8qIHVzZVByb3RvM0pzb249ICovICEwKTtcbn1cblxuLyoqXG4gKiBBbiBpbnN0YW5jZSBvZiB0aGUgUGxhdGZvcm0ncyAnVGV4dEVuY29kZXInIGltcGxlbWVudGF0aW9uLlxuICovXG4vKipcbiAqIEEgaGVscGVyIGZvciBydW5uaW5nIGRlbGF5ZWQgdGFza3MgZm9sbG93aW5nIGFuIGV4cG9uZW50aWFsIGJhY2tvZmYgY3VydmVcbiAqIGJldHdlZW4gYXR0ZW1wdHMuXG4gKlxuICogRWFjaCBkZWxheSBpcyBtYWRlIHVwIG9mIGEgXCJiYXNlXCIgZGVsYXkgd2hpY2ggZm9sbG93cyB0aGUgZXhwb25lbnRpYWxcbiAqIGJhY2tvZmYgY3VydmUsIGFuZCBhICsvLSA1MCUgXCJqaXR0ZXJcIiB0aGF0IGlzIGNhbGN1bGF0ZWQgYW5kIGFkZGVkIHRvIHRoZVxuICogYmFzZSBkZWxheS4gVGhpcyBwcmV2ZW50cyBjbGllbnRzIGZyb20gYWNjaWRlbnRhbGx5IHN5bmNocm9uaXppbmcgdGhlaXJcbiAqIGRlbGF5cyBjYXVzaW5nIHNwaWtlcyBvZiBsb2FkIHRvIHRoZSBiYWNrZW5kLlxuICovXG5jbGFzcyAkbyB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogVGhlIEFzeW5jUXVldWUgdG8gcnVuIGJhY2tvZmYgb3BlcmF0aW9ucyBvbi5cbiAgICAgKi9cbiAgICB0LCBcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgdG8gdXNlIHdoZW4gc2NoZWR1bGluZyBiYWNrb2ZmIG9wZXJhdGlvbnMgb24gdGhlIEFzeW5jUXVldWUuXG4gICAgICovXG4gICAgZSwgXG4gICAgLyoqXG4gICAgICogVGhlIGluaXRpYWwgZGVsYXkgKHVzZWQgYXMgdGhlIGJhc2UgZGVsYXkgb24gdGhlIGZpcnN0IHJldHJ5IGF0dGVtcHQpLlxuICAgICAqIE5vdGUgdGhhdCBqaXR0ZXIgd2lsbCBzdGlsbCBiZSBhcHBsaWVkLCBzbyB0aGUgYWN0dWFsIGRlbGF5IGNvdWxkIGJlIGFzXG4gICAgICogbGl0dGxlIGFzIDAuNSppbml0aWFsRGVsYXlNcy5cbiAgICAgKi9cbiAgICBuID0gMWUzXG4gICAgLyoqXG4gICAgICogVGhlIG11bHRpcGxpZXIgdG8gdXNlIHRvIGRldGVybWluZSB0aGUgZXh0ZW5kZWQgYmFzZSBkZWxheSBhZnRlciBlYWNoXG4gICAgICogYXR0ZW1wdC5cbiAgICAgKi8gLCBzID0gMS41XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gYmFzZSBkZWxheSBhZnRlciB3aGljaCBubyBmdXJ0aGVyIGJhY2tvZmYgaXMgcGVyZm9ybWVkLlxuICAgICAqIE5vdGUgdGhhdCBqaXR0ZXIgd2lsbCBzdGlsbCBiZSBhcHBsaWVkLCBzbyB0aGUgYWN0dWFsIGRlbGF5IGNvdWxkIGJlIGFzXG4gICAgICogbXVjaCBhcyAxLjUqbWF4RGVsYXlNcy5cbiAgICAgKi8gLCBpID0gNmU0KSB7XG4gICAgICAgIHRoaXMuSG4gPSB0LCB0aGlzLnRpbWVySWQgPSBlLCB0aGlzLmhvID0gbiwgdGhpcy5sbyA9IHMsIHRoaXMuZm8gPSBpLCB0aGlzLl9vID0gMCwgXG4gICAgICAgIHRoaXMud28gPSBudWxsLCBcbiAgICAgICAgLyoqIFRoZSBsYXN0IGJhY2tvZmYgYXR0ZW1wdCwgYXMgZXBvY2ggbWlsbGlzZWNvbmRzLiAqL1xuICAgICAgICB0aGlzLm1vID0gRGF0ZS5ub3coKSwgdGhpcy5yZXNldCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIGJhY2tvZmYgZGVsYXkuXG4gICAgICpcbiAgICAgKiBUaGUgdmVyeSBuZXh0IGJhY2tvZmZBbmRXYWl0KCkgd2lsbCBoYXZlIG5vIGRlbGF5LiBJZiBpdCBpcyBjYWxsZWQgYWdhaW5cbiAgICAgKiAoaS5lLiBkdWUgdG8gYW4gZXJyb3IpLCBpbml0aWFsRGVsYXlNcyAocGx1cyBqaXR0ZXIpIHdpbGwgYmUgdXNlZCwgYW5kXG4gICAgICogc3Vic2VxdWVudCBvbmVzIHdpbGwgaW5jcmVhc2UgYWNjb3JkaW5nIHRvIHRoZSBiYWNrb2ZmRmFjdG9yLlxuICAgICAqLyAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5fbyA9IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgYmFja29mZiBkZWxheSB0byB0aGUgbWF4aW11bSBkZWxheSAoZS5nLiBmb3IgdXNlIGFmdGVyIGFcbiAgICAgKiBSRVNPVVJDRV9FWEhBVVNURUQgZXJyb3IpLlxuICAgICAqLyAgICB5bygpIHtcbiAgICAgICAgdGhpcy5fbyA9IHRoaXMuZm87XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgY3VycmVudERlbGF5TXMsIGFuZCBpbmNyZWFzZXMgdGhlXG4gICAgICogZGVsYXkgZm9yIGFueSBzdWJzZXF1ZW50IGF0dGVtcHRzLiBJZiB0aGVyZSB3YXMgYSBwZW5kaW5nIGJhY2tvZmYgb3BlcmF0aW9uXG4gICAgICogYWxyZWFkeSwgaXQgd2lsbCBiZSBjYW5jZWxlZC5cbiAgICAgKi8gICAgcG8odCkge1xuICAgICAgICAvLyBDYW5jZWwgYW55IHBlbmRpbmcgYmFja29mZiBvcGVyYXRpb24uXG4gICAgICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgICAgIC8vIEZpcnN0IHNjaGVkdWxlIHVzaW5nIHRoZSBjdXJyZW50IGJhc2UgKHdoaWNoIG1heSBiZSAwIGFuZCBzaG91bGQgYmVcbiAgICAgICAgLy8gaG9ub3JlZCBhcyBzdWNoKS5cbiAgICAgICAgY29uc3QgZSA9IE1hdGguZmxvb3IodGhpcy5fbyArIHRoaXMuSW8oKSksIG4gPSBNYXRoLm1heCgwLCBEYXRlLm5vdygpIC0gdGhpcy5tbyksIHMgPSBNYXRoLm1heCgwLCBlIC0gbik7XG4gICAgICAgIC8vIEd1YXJkIGFnYWluc3QgbGFzdEF0dGVtcHRUaW1lIGJlaW5nIGluIHRoZSBmdXR1cmUgZHVlIHRvIGEgY2xvY2sgY2hhbmdlLlxuICAgICAgICAgICAgICAgIHMgPiAwICYmIE8oXCJFeHBvbmVudGlhbEJhY2tvZmZcIiwgYEJhY2tpbmcgb2ZmIGZvciAke3N9IG1zIChiYXNlIGRlbGF5OiAke3RoaXMuX299IG1zLCBkZWxheSB3aXRoIGppdHRlcjogJHtlfSBtcywgbGFzdCBhdHRlbXB0OiAke259IG1zIGFnbylgKSwgXG4gICAgICAgIHRoaXMud28gPSB0aGlzLkhuLmVucXVldWVBZnRlckRlbGF5KHRoaXMudGltZXJJZCwgcywgKCgpID0+ICh0aGlzLm1vID0gRGF0ZS5ub3coKSwgXG4gICAgICAgIHQoKSkpKSwgXG4gICAgICAgIC8vIEFwcGx5IGJhY2tvZmYgZmFjdG9yIHRvIGRldGVybWluZSBuZXh0IGRlbGF5IGFuZCBlbnN1cmUgaXQgaXMgd2l0aGluXG4gICAgICAgIC8vIGJvdW5kcy5cbiAgICAgICAgdGhpcy5fbyAqPSB0aGlzLmxvLCB0aGlzLl9vIDwgdGhpcy5obyAmJiAodGhpcy5fbyA9IHRoaXMuaG8pLCB0aGlzLl9vID4gdGhpcy5mbyAmJiAodGhpcy5fbyA9IHRoaXMuZm8pO1xuICAgIH1cbiAgICBUbygpIHtcbiAgICAgICAgbnVsbCAhPT0gdGhpcy53byAmJiAodGhpcy53by5za2lwRGVsYXkoKSwgdGhpcy53byA9IG51bGwpO1xuICAgIH1cbiAgICBjYW5jZWwoKSB7XG4gICAgICAgIG51bGwgIT09IHRoaXMud28gJiYgKHRoaXMud28uY2FuY2VsKCksIHRoaXMud28gPSBudWxsKTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgYSByYW5kb20gdmFsdWUgaW4gdGhlIHJhbmdlIFstY3VycmVudEJhc2VNcy8yLCBjdXJyZW50QmFzZU1zLzJdICovICAgIElvKCkge1xuICAgICAgICByZXR1cm4gKE1hdGgucmFuZG9tKCkgLSAuNSkgKiB0aGlzLl9vO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQSBQZXJzaXN0ZW50U3RyZWFtIGlzIGFuIGFic3RyYWN0IGJhc2UgY2xhc3MgdGhhdCByZXByZXNlbnRzIGEgc3RyZWFtaW5nIFJQQ1xuICogdG8gdGhlIEZpcmVzdG9yZSBiYWNrZW5kLiBJdCdzIGJ1aWx0IG9uIHRvcCBvZiB0aGUgY29ubmVjdGlvbnMgb3duIHN1cHBvcnRcbiAqIGZvciBzdHJlYW1pbmcgUlBDcywgYW5kIGFkZHMgc2V2ZXJhbCBjcml0aWNhbCBmZWF0dXJlcyBmb3Igb3VyIGNsaWVudHM6XG4gKlxuICogICAtIEV4cG9uZW50aWFsIGJhY2tvZmYgb24gZmFpbHVyZVxuICogICAtIEF1dGhlbnRpY2F0aW9uIHZpYSBDcmVkZW50aWFsc1Byb3ZpZGVyXG4gKiAgIC0gRGlzcGF0Y2hpbmcgYWxsIGNhbGxiYWNrcyBpbnRvIHRoZSBzaGFyZWQgd29ya2VyIHF1ZXVlXG4gKiAgIC0gQ2xvc2luZyBpZGxlIHN0cmVhbXMgYWZ0ZXIgNjAgc2Vjb25kcyBvZiBpbmFjdGl2aXR5XG4gKlxuICogU3ViY2xhc3NlcyBvZiBQZXJzaXN0ZW50U3RyZWFtIGltcGxlbWVudCBzZXJpYWxpemF0aW9uIG9mIG1vZGVscyB0byBhbmRcbiAqIGZyb20gdGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb3RvY29sIGJ1ZmZlcnMgZm9yIGEgc3BlY2lmaWNcbiAqIHN0cmVhbWluZyBSUEMuXG4gKlxuICogIyMgU3RhcnRpbmcgYW5kIFN0b3BwaW5nXG4gKlxuICogU3RyZWFtaW5nIFJQQ3MgYXJlIHN0YXRlZnVsIGFuZCBuZWVkIHRvIGJlIHN0YXJ0KCllZCBiZWZvcmUgbWVzc2FnZXMgY2FuXG4gKiBiZSBzZW50IGFuZCByZWNlaXZlZC4gVGhlIFBlcnNpc3RlbnRTdHJlYW0gd2lsbCBjYWxsIHRoZSBvbk9wZW4oKSBmdW5jdGlvblxuICogb2YgdGhlIGxpc3RlbmVyIG9uY2UgdGhlIHN0cmVhbSBpcyByZWFkeSB0byBhY2NlcHQgcmVxdWVzdHMuXG4gKlxuICogU2hvdWxkIGEgc3RhcnQoKSBmYWlsLCBQZXJzaXN0ZW50U3RyZWFtIHdpbGwgY2FsbCB0aGUgcmVnaXN0ZXJlZCBvbkNsb3NlKClcbiAqIGxpc3RlbmVyIHdpdGggYSBGaXJlc3RvcmVFcnJvciBpbmRpY2F0aW5nIHdoYXQgd2VudCB3cm9uZy5cbiAqXG4gKiBBIFBlcnNpc3RlbnRTdHJlYW0gY2FuIGJlIHN0YXJ0ZWQgYW5kIHN0b3BwZWQgcmVwZWF0ZWRseS5cbiAqXG4gKiBHZW5lcmljIHR5cGVzOlxuICogIFNlbmRUeXBlOiBUaGUgdHlwZSBvZiB0aGUgb3V0Z29pbmcgbWVzc2FnZSBvZiB0aGUgdW5kZXJseWluZ1xuICogICAgY29ubmVjdGlvbiBzdHJlYW1cbiAqICBSZWNlaXZlVHlwZTogVGhlIHR5cGUgb2YgdGhlIGluY29taW5nIG1lc3NhZ2Ugb2YgdGhlIHVuZGVybHlpbmdcbiAqICAgIGNvbm5lY3Rpb24gc3RyZWFtXG4gKiAgTGlzdGVuZXJUeXBlOiBUaGUgdHlwZSBvZiB0aGUgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIGNhbGxiYWNrc1xuICovXG5jbGFzcyBGbyB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgcywgaSwgciwgbywgYSkge1xuICAgICAgICB0aGlzLkhuID0gdCwgdGhpcy5FbyA9IG4sIHRoaXMuQW8gPSBzLCB0aGlzLlJvID0gaSwgdGhpcy5hdXRoQ3JlZGVudGlhbHNQcm92aWRlciA9IHIsIFxuICAgICAgICB0aGlzLmFwcENoZWNrQ3JlZGVudGlhbHNQcm92aWRlciA9IG8sIHRoaXMubGlzdGVuZXIgPSBhLCB0aGlzLnN0YXRlID0gMCAvKiBJbml0aWFsICovICwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGNsb3NlIGNvdW50IHRoYXQncyBpbmNyZW1lbnRlZCBldmVyeSB0aW1lIHRoZSBzdHJlYW0gaXMgY2xvc2VkOyB1c2VkIGJ5XG4gICAgICAgICAqIGdldENsb3NlR3VhcmRlZERpc3BhdGNoZXIoKSB0byBpbnZhbGlkYXRlIGNhbGxiYWNrcyB0aGF0IGhhcHBlbiBhZnRlclxuICAgICAgICAgKiBjbG9zZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYm8gPSAwLCB0aGlzLlBvID0gbnVsbCwgdGhpcy5WbyA9IG51bGwsIHRoaXMuc3RyZWFtID0gbnVsbCwgdGhpcy52byA9IG5ldyAkbyh0LCBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHN0YXJ0KCkgaGFzIGJlZW4gY2FsbGVkIGFuZCBubyBlcnJvciBoYXMgb2NjdXJyZWQuIFRydWVcbiAgICAgKiBpbmRpY2F0ZXMgdGhlIHN0cmVhbSBpcyBvcGVuIG9yIGluIHRoZSBwcm9jZXNzIG9mIG9wZW5pbmcgKHdoaWNoXG4gICAgICogZW5jb21wYXNzZXMgcmVzcGVjdGluZyBiYWNrb2ZmLCBnZXR0aW5nIGF1dGggdG9rZW5zLCBhbmQgc3RhcnRpbmcgdGhlXG4gICAgICogYWN0dWFsIFJQQykuIFVzZSBpc09wZW4oKSB0byBkZXRlcm1pbmUgaWYgdGhlIHN0cmVhbSBpcyBvcGVuIGFuZCByZWFkeSBmb3JcbiAgICAgKiBvdXRib3VuZCByZXF1ZXN0cy5cbiAgICAgKi8gICAgU28oKSB7XG4gICAgICAgIHJldHVybiAxIC8qIFN0YXJ0aW5nICovID09PSB0aGlzLnN0YXRlIHx8IDUgLyogQmFja29mZiAqLyA9PT0gdGhpcy5zdGF0ZSB8fCB0aGlzLkRvKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdW5kZXJseWluZyBSUEMgaXMgb3BlbiAodGhlIG9uT3BlbigpIGxpc3RlbmVyIGhhcyBiZWVuXG4gICAgICogY2FsbGVkKSBhbmQgdGhlIHN0cmVhbSBpcyByZWFkeSBmb3Igb3V0Ym91bmQgcmVxdWVzdHMuXG4gICAgICovICAgIERvKCkge1xuICAgICAgICByZXR1cm4gMiAvKiBPcGVuICovID09PSB0aGlzLnN0YXRlIHx8IDMgLyogSGVhbHRoeSAqLyA9PT0gdGhpcy5zdGF0ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnRzIHRoZSBSUEMuIE9ubHkgYWxsb3dlZCBpZiBpc1N0YXJ0ZWQoKSByZXR1cm5zIGZhbHNlLiBUaGUgc3RyZWFtIGlzXG4gICAgICogbm90IGltbWVkaWF0ZWx5IHJlYWR5IGZvciB1c2U6IG9uT3BlbigpIHdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSBSUEMgaXNcbiAgICAgKiByZWFkeSBmb3Igb3V0Ym91bmQgcmVxdWVzdHMsIGF0IHdoaWNoIHBvaW50IGlzT3BlbigpIHdpbGwgcmV0dXJuIHRydWUuXG4gICAgICpcbiAgICAgKiBXaGVuIHN0YXJ0IHJldHVybnMsIGlzU3RhcnRlZCgpIHdpbGwgcmV0dXJuIHRydWUuXG4gICAgICovICAgIHN0YXJ0KCkge1xuICAgICAgICA0IC8qIEVycm9yICovICE9PSB0aGlzLnN0YXRlID8gdGhpcy5hdXRoKCkgOiB0aGlzLkNvKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0b3BzIHRoZSBSUEMuIFRoaXMgY2FsbCBpcyBpZGVtcG90ZW50IGFuZCBhbGxvd2VkIHJlZ2FyZGxlc3Mgb2YgdGhlXG4gICAgICogY3VycmVudCBpc1N0YXJ0ZWQoKSBzdGF0ZS5cbiAgICAgKlxuICAgICAqIFdoZW4gc3RvcCByZXR1cm5zLCBpc1N0YXJ0ZWQoKSBhbmQgaXNPcGVuKCkgd2lsbCBib3RoIHJldHVybiBmYWxzZS5cbiAgICAgKi8gICAgYXN5bmMgc3RvcCgpIHtcbiAgICAgICAgdGhpcy5TbygpICYmIGF3YWl0IHRoaXMuY2xvc2UoMCAvKiBJbml0aWFsICovKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWZ0ZXIgYW4gZXJyb3IgdGhlIHN0cmVhbSB3aWxsIHVzdWFsbHkgYmFjayBvZmYgb24gdGhlIG5leHQgYXR0ZW1wdCB0b1xuICAgICAqIHN0YXJ0IGl0LiBJZiB0aGUgZXJyb3Igd2FycmFudHMgYW4gaW1tZWRpYXRlIHJlc3RhcnQgb2YgdGhlIHN0cmVhbSwgdGhlXG4gICAgICogc2VuZGVyIGNhbiB1c2UgdGhpcyB0byBpbmRpY2F0ZSB0aGF0IHRoZSByZWNlaXZlciBzaG91bGQgbm90IGJhY2sgb2ZmLlxuICAgICAqXG4gICAgICogRWFjaCBlcnJvciB3aWxsIGNhbGwgdGhlIG9uQ2xvc2UoKSBsaXN0ZW5lci4gVGhhdCBmdW5jdGlvbiBjYW4gZGVjaWRlIHRvXG4gICAgICogaW5oaWJpdCBiYWNrb2ZmIGlmIHJlcXVpcmVkLlxuICAgICAqLyAgICB4bygpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IDAgLyogSW5pdGlhbCAqLyAsIHRoaXMudm8ucmVzZXQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFya3MgdGhpcyBzdHJlYW0gYXMgaWRsZS4gSWYgbm8gZnVydGhlciBhY3Rpb25zIGFyZSBwZXJmb3JtZWQgb24gdGhlXG4gICAgICogc3RyZWFtIGZvciBvbmUgbWludXRlLCB0aGUgc3RyZWFtIHdpbGwgYXV0b21hdGljYWxseSBjbG9zZSBpdHNlbGYgYW5kXG4gICAgICogbm90aWZ5IHRoZSBzdHJlYW0ncyBvbkNsb3NlKCkgaGFuZGxlciB3aXRoIFN0YXR1cy5PSy4gVGhlIHN0cmVhbSB3aWxsIHRoZW5cbiAgICAgKiBiZSBpbiBhICFpc1N0YXJ0ZWQoKSBzdGF0ZSwgcmVxdWlyaW5nIHRoZSBjYWxsZXIgdG8gc3RhcnQgdGhlIHN0cmVhbSBhZ2FpblxuICAgICAqIGJlZm9yZSBmdXJ0aGVyIHVzZS5cbiAgICAgKlxuICAgICAqIE9ubHkgc3RyZWFtcyB0aGF0IGFyZSBpbiBzdGF0ZSAnT3BlbicgY2FuIGJlIG1hcmtlZCBpZGxlLCBhcyBhbGwgb3RoZXJcbiAgICAgKiBzdGF0ZXMgaW1wbHkgcGVuZGluZyBuZXR3b3JrIG9wZXJhdGlvbnMuXG4gICAgICovICAgIE5vKCkge1xuICAgICAgICAvLyBTdGFydHMgdGhlIGlkbGUgdGltZSBpZiB3ZSBhcmUgaW4gc3RhdGUgJ09wZW4nIGFuZCBhcmUgbm90IHlldCBhbHJlYWR5XG4gICAgICAgIC8vIHJ1bm5pbmcgYSB0aW1lciAoaW4gd2hpY2ggY2FzZSB0aGUgcHJldmlvdXMgaWRsZSB0aW1lb3V0IHN0aWxsIGFwcGxpZXMpLlxuICAgICAgICB0aGlzLkRvKCkgJiYgbnVsbCA9PT0gdGhpcy5QbyAmJiAodGhpcy5QbyA9IHRoaXMuSG4uZW5xdWV1ZUFmdGVyRGVsYXkodGhpcy5FbywgNmU0LCAoKCkgPT4gdGhpcy5rbygpKSkpO1xuICAgIH1cbiAgICAvKiogU2VuZHMgYSBtZXNzYWdlIHRvIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4gKi8gICAgTW8odCkge1xuICAgICAgICB0aGlzLk9vKCksIHRoaXMuc3RyZWFtLnNlbmQodCk7XG4gICAgfVxuICAgIC8qKiBDYWxsZWQgYnkgdGhlIGlkbGUgdGltZXIgd2hlbiB0aGUgc3RyZWFtIHNob3VsZCBjbG9zZSBkdWUgdG8gaW5hY3Rpdml0eS4gKi8gICAgYXN5bmMga28oKSB7XG4gICAgICAgIGlmICh0aGlzLkRvKCkpIFxuICAgICAgICAvLyBXaGVuIHRpbWluZyBvdXQgYW4gaWRsZSBzdHJlYW0gdGhlcmUncyBubyByZWFzb24gdG8gZm9yY2UgdGhlIHN0cmVhbSBpbnRvIGJhY2tvZmYgd2hlblxuICAgICAgICAvLyBpdCByZXN0YXJ0cyBzbyBzZXQgdGhlIHN0cmVhbSBzdGF0ZSB0byBJbml0aWFsIGluc3RlYWQgb2YgRXJyb3IuXG4gICAgICAgIHJldHVybiB0aGlzLmNsb3NlKDAgLyogSW5pdGlhbCAqLyk7XG4gICAgfVxuICAgIC8qKiBNYXJrcyB0aGUgc3RyZWFtIGFzIGFjdGl2ZSBhZ2Fpbi4gKi8gICAgT28oKSB7XG4gICAgICAgIHRoaXMuUG8gJiYgKHRoaXMuUG8uY2FuY2VsKCksIHRoaXMuUG8gPSBudWxsKTtcbiAgICB9XG4gICAgLyoqIENhbmNlbHMgdGhlIGhlYWx0aCBjaGVjayBkZWxheWVkIG9wZXJhdGlvbi4gKi8gICAgJG8oKSB7XG4gICAgICAgIHRoaXMuVm8gJiYgKHRoaXMuVm8uY2FuY2VsKCksIHRoaXMuVm8gPSBudWxsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBzdHJlYW0gYW5kIGNsZWFucyB1cCBhcyBuZWNlc3Nhcnk6XG4gICAgICpcbiAgICAgKiAqIGNsb3NlcyB0aGUgdW5kZXJseWluZyBHUlBDIHN0cmVhbTtcbiAgICAgKiAqIGNhbGxzIHRoZSBvbkNsb3NlIGhhbmRsZXIgd2l0aCB0aGUgZ2l2ZW4gJ2Vycm9yJztcbiAgICAgKiAqIHNldHMgaW50ZXJuYWwgc3RyZWFtIHN0YXRlIHRvICdmaW5hbFN0YXRlJztcbiAgICAgKiAqIGFkanVzdHMgdGhlIGJhY2tvZmYgdGltZXIgYmFzZWQgb24gdGhlIGVycm9yXG4gICAgICpcbiAgICAgKiBBIG5ldyBzdHJlYW0gY2FuIGJlIG9wZW5lZCBieSBjYWxsaW5nIHN0YXJ0KCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmluYWxTdGF0ZSAtIHRoZSBpbnRlbmRlZCBzdGF0ZSBvZiB0aGUgc3RyZWFtIGFmdGVyIGNsb3NpbmcuXG4gICAgICogQHBhcmFtIGVycm9yIC0gdGhlIGVycm9yIHRoZSBjb25uZWN0aW9uIHdhcyBjbG9zZWQgd2l0aC5cbiAgICAgKi8gICAgYXN5bmMgY2xvc2UodCwgZSkge1xuICAgICAgICAvLyBDYW5jZWwgYW55IG91dHN0YW5kaW5nIHRpbWVycyAodGhleSdyZSBndWFyYW50ZWVkIG5vdCB0byBleGVjdXRlKS5cbiAgICAgICAgdGhpcy5PbygpLCB0aGlzLiRvKCksIHRoaXMudm8uY2FuY2VsKCksIFxuICAgICAgICAvLyBJbnZhbGlkYXRlcyBhbnkgc3RyZWFtLXJlbGF0ZWQgY2FsbGJhY2tzIChlLmcuIGZyb20gYXV0aCBvciB0aGVcbiAgICAgICAgLy8gdW5kZXJseWluZyBzdHJlYW0pLCBndWFyYW50ZWVpbmcgdGhleSB3b24ndCBleGVjdXRlLlxuICAgICAgICB0aGlzLmJvKyssIDQgLyogRXJyb3IgKi8gIT09IHQgPyBcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiBpbnRlbnRpb25hbCBjbG9zZSBlbnN1cmUgd2UgZG9uJ3QgZGVsYXkgb3VyIG5leHQgY29ubmVjdGlvbiBhdHRlbXB0LlxuICAgICAgICB0aGlzLnZvLnJlc2V0KCkgOiBlICYmIGUuY29kZSA9PT0gRy5SRVNPVVJDRV9FWEhBVVNURUQgPyAoXG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3IuIChQcm9iYWJseSBlaXRoZXIgJ3F1b3RhIGV4Y2VlZGVkJyBvciAnbWF4IHF1ZXVlIGxlbmd0aCByZWFjaGVkJy4pXG4gICAgICAgICQoZS50b1N0cmluZygpKSwgJChcIlVzaW5nIG1heGltdW0gYmFja29mZiBkZWxheSB0byBwcmV2ZW50IG92ZXJsb2FkaW5nIHRoZSBiYWNrZW5kLlwiKSwgXG4gICAgICAgIHRoaXMudm8ueW8oKSkgOiBlICYmIGUuY29kZSA9PT0gRy5VTkFVVEhFTlRJQ0FURUQgJiYgMyAvKiBIZWFsdGh5ICovICE9PSB0aGlzLnN0YXRlICYmIChcbiAgICAgICAgLy8gXCJ1bmF1dGhlbnRpY2F0ZWRcIiBlcnJvciBtZWFucyB0aGUgdG9rZW4gd2FzIHJlamVjdGVkLiBUaGlzIHNob3VsZCByYXJlbHlcbiAgICAgICAgLy8gaGFwcGVuIHNpbmNlIGJvdGggQXV0aCBhbmQgQXBwQ2hlY2sgZW5zdXJlIGEgc3VmZmljaWVudCBUVEwgd2hlbiB3ZVxuICAgICAgICAvLyByZXF1ZXN0IGEgdG9rZW4uIElmIGEgdXNlciBtYW51YWxseSByZXNldHMgdGhlaXIgc3lzdGVtIGNsb2NrIHRoaXMgY2FuXG4gICAgICAgIC8vIGZhaWwsIGhvd2V2ZXIuIEluIHRoaXMgY2FzZSwgd2Ugc2hvdWxkIGdldCBhIENvZGUuVU5BVVRIRU5USUNBVEVEIGVycm9yXG4gICAgICAgIC8vIGJlZm9yZSB3ZSByZWNlaXZlZCB0aGUgZmlyc3QgbWVzc2FnZSBhbmQgd2UgbmVlZCB0byBpbnZhbGlkYXRlIHRoZSB0b2tlblxuICAgICAgICAvLyB0byBlbnN1cmUgdGhhdCB3ZSBmZXRjaCBhIG5ldyB0b2tlbi5cbiAgICAgICAgdGhpcy5hdXRoQ3JlZGVudGlhbHNQcm92aWRlci5pbnZhbGlkYXRlVG9rZW4oKSwgdGhpcy5hcHBDaGVja0NyZWRlbnRpYWxzUHJvdmlkZXIuaW52YWxpZGF0ZVRva2VuKCkpLCBcbiAgICAgICAgLy8gQ2xlYW4gdXAgdGhlIHVuZGVybHlpbmcgc3RyZWFtIGJlY2F1c2Ugd2UgYXJlIG5vIGxvbmdlciBpbnRlcmVzdGVkIGluIGV2ZW50cy5cbiAgICAgICAgbnVsbCAhPT0gdGhpcy5zdHJlYW0gJiYgKHRoaXMuRm8oKSwgdGhpcy5zdHJlYW0uY2xvc2UoKSwgdGhpcy5zdHJlYW0gPSBudWxsKSwgXG4gICAgICAgIC8vIFRoaXMgc3RhdGUgbXVzdCBiZSBhc3NpZ25lZCBiZWZvcmUgY2FsbGluZyBvbkNsb3NlKCkgdG8gYWxsb3cgdGhlIGNhbGxiYWNrIHRvXG4gICAgICAgIC8vIGluaGliaXQgYmFja29mZiBvciBvdGhlcndpc2UgbWFuaXB1bGF0ZSB0aGUgc3RhdGUgaW4gaXRzIG5vbi1zdGFydGVkIHN0YXRlLlxuICAgICAgICB0aGlzLnN0YXRlID0gdCwgXG4gICAgICAgIC8vIE5vdGlmeSB0aGUgbGlzdGVuZXIgdGhhdCB0aGUgc3RyZWFtIGNsb3NlZC5cbiAgICAgICAgYXdhaXQgdGhpcy5saXN0ZW5lci5IcihlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FuIGJlIG92ZXJyaWRkZW4gdG8gcGVyZm9ybSBhZGRpdGlvbmFsIGNsZWFudXAgYmVmb3JlIHRoZSBzdHJlYW0gaXMgY2xvc2VkLlxuICAgICAqIENhbGxpbmcgc3VwZXIudGVhckRvd24oKSBpcyBub3QgcmVxdWlyZWQuXG4gICAgICovICAgIEZvKCkge31cbiAgICBhdXRoKCkge1xuICAgICAgICB0aGlzLnN0YXRlID0gMSAvKiBTdGFydGluZyAqLztcbiAgICAgICAgY29uc3QgdCA9IHRoaXMuQm8odGhpcy5ibyksIGUgPSB0aGlzLmJvO1xuICAgICAgICAvLyBUT0RPKG1pa2VsZWhlbik6IEp1c3QgdXNlIGRpc3BhdGNoSWZOb3RDbG9zZWQsIGJ1dCBzZWUgVE9ETyBiZWxvdy5cbiAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChbIHRoaXMuYXV0aENyZWRlbnRpYWxzUHJvdmlkZXIuZ2V0VG9rZW4oKSwgdGhpcy5hcHBDaGVja0NyZWRlbnRpYWxzUHJvdmlkZXIuZ2V0VG9rZW4oKSBdKS50aGVuKCgoW3QsIG5dKSA9PiB7XG4gICAgICAgICAgICAvLyBTdHJlYW0gY2FuIGJlIHN0b3BwZWQgd2hpbGUgd2FpdGluZyBmb3IgYXV0aGVudGljYXRpb24uXG4gICAgICAgICAgICAvLyBUT0RPKG1pa2VsZWhlbik6IFdlIHJlYWxseSBzaG91bGQganVzdCB1c2UgZGlzcGF0Y2hJZk5vdENsb3NlZFxuICAgICAgICAgICAgLy8gYW5kIGxldCB0aGlzIGRpc3BhdGNoIG9udG8gdGhlIHF1ZXVlLCBidXQgdGhhdCBvcGVuZWQgYSBzcGVjIHRlc3QgY2FuXG4gICAgICAgICAgICAvLyBvZiB3b3JtcyB0aGF0IEkgZG9uJ3Qgd2FudCB0byBkZWFsIHdpdGggaW4gdGhpcyBQUi5cbiAgICAgICAgICAgIHRoaXMuYm8gPT09IGUgJiYgXG4gICAgICAgICAgICAvLyBOb3JtYWxseSB3ZSdkIGhhdmUgdG8gc2NoZWR1bGUgdGhlIGNhbGxiYWNrIG9uIHRoZSBBc3luY1F1ZXVlLlxuICAgICAgICAgICAgLy8gSG93ZXZlciwgdGhlIGZvbGxvd2luZyBjYWxscyBhcmUgc2FmZSB0byBiZSBjYWxsZWQgb3V0c2lkZSB0aGVcbiAgICAgICAgICAgIC8vIEFzeW5jUXVldWUgc2luY2UgdGhleSBkb24ndCBjaGFpbiBhc3luY2hyb25vdXMgY2FsbHNcbiAgICAgICAgICAgIHRoaXMuTG8odCwgbik7XG4gICAgICAgIH0pLCAoZSA9PiB7XG4gICAgICAgICAgICB0KCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IG5ldyBRKEcuVU5LTk9XTiwgXCJGZXRjaGluZyBhdXRoIHRva2VuIGZhaWxlZDogXCIgKyBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnFvKHQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIExvKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IHRoaXMuQm8odGhpcy5ibyk7XG4gICAgICAgIHRoaXMuc3RyZWFtID0gdGhpcy5Vbyh0LCBlKSwgdGhpcy5zdHJlYW0uV3IoKCgpID0+IHtcbiAgICAgICAgICAgIG4oKCgpID0+ICh0aGlzLnN0YXRlID0gMiAvKiBPcGVuICovICwgdGhpcy5WbyA9IHRoaXMuSG4uZW5xdWV1ZUFmdGVyRGVsYXkodGhpcy5BbywgMWU0LCAoKCkgPT4gKHRoaXMuRG8oKSAmJiAodGhpcy5zdGF0ZSA9IDMgLyogSGVhbHRoeSAqLyksIFxuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkpKSksIHRoaXMubGlzdGVuZXIuV3IoKSkpKTtcbiAgICAgICAgfSkpLCB0aGlzLnN0cmVhbS5IcigodCA9PiB7XG4gICAgICAgICAgICBuKCgoKSA9PiB0aGlzLnFvKHQpKSk7XG4gICAgICAgIH0pKSwgdGhpcy5zdHJlYW0ub25NZXNzYWdlKCh0ID0+IHtcbiAgICAgICAgICAgIG4oKCgpID0+IHRoaXMub25NZXNzYWdlKHQpKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgQ28oKSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSA1IC8qIEJhY2tvZmYgKi8gLCB0aGlzLnZvLnBvKChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gMCAvKiBJbml0aWFsICovICwgdGhpcy5zdGFydCgpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8vIFZpc2libGUgZm9yIHRlc3RzXG4gICAgcW8odCkge1xuICAgICAgICAvLyBJbiB0aGVvcnkgdGhlIHN0cmVhbSBjb3VsZCBjbG9zZSBjbGVhbmx5LCBob3dldmVyLCBpbiBvdXIgY3VycmVudCBtb2RlbFxuICAgICAgICAvLyB3ZSBuZXZlciBleHBlY3QgdGhpcyB0byBoYXBwZW4gYmVjYXVzZSBpZiB3ZSBzdG9wIGEgc3RyZWFtIG91cnNlbHZlcyxcbiAgICAgICAgLy8gdGhpcyBjYWxsYmFjayB3aWxsIG5ldmVyIGJlIGNhbGxlZC4gVG8gcHJldmVudCBjYXNlcyB3aGVyZSB3ZSByZXRyeVxuICAgICAgICAvLyB3aXRob3V0IGEgYmFja29mZiBhY2NpZGVudGFsbHksIHdlIHNldCB0aGUgc3RyZWFtIHRvIGVycm9yIGluIGFsbCBjYXNlcy5cbiAgICAgICAgcmV0dXJuIE8oXCJQZXJzaXN0ZW50U3RyZWFtXCIsIGBjbG9zZSB3aXRoIGVycm9yOiAke3R9YCksIHRoaXMuc3RyZWFtID0gbnVsbCwgdGhpcy5jbG9zZSg0IC8qIEVycm9yICovICwgdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBcImRpc3BhdGNoZXJcIiBmdW5jdGlvbiB0aGF0IGRpc3BhdGNoZXMgb3BlcmF0aW9ucyBvbnRvIHRoZVxuICAgICAqIEFzeW5jUXVldWUgYnV0IG9ubHkgcnVucyB0aGVtIGlmIGNsb3NlQ291bnQgcmVtYWlucyB1bmNoYW5nZWQuIFRoaXMgYWxsb3dzXG4gICAgICogdXMgdG8gdHVybiBhdXRoIC8gc3RyZWFtIGNhbGxiYWNrcyBpbnRvIG5vLW9wcyBpZiB0aGUgc3RyZWFtIGlzIGNsb3NlZCAvXG4gICAgICogcmUtb3BlbmVkLCBldGMuXG4gICAgICovICAgIEJvKHQpIHtcbiAgICAgICAgcmV0dXJuIGUgPT4ge1xuICAgICAgICAgICAgdGhpcy5Ibi5lbnF1ZXVlQW5kRm9yZ2V0KCgoKSA9PiB0aGlzLmJvID09PSB0ID8gZSgpIDogKE8oXCJQZXJzaXN0ZW50U3RyZWFtXCIsIFwic3RyZWFtIGNhbGxiYWNrIHNraXBwZWQgYnkgZ2V0Q2xvc2VHdWFyZGVkRGlzcGF0Y2hlci5cIiksIFxuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkpKSk7XG4gICAgICAgIH07XG4gICAgfVxufVxuXG4vKipcbiAqIEEgUGVyc2lzdGVudFN0cmVhbSB0aGF0IGltcGxlbWVudHMgdGhlIExpc3RlbiBSUEMuXG4gKlxuICogT25jZSB0aGUgTGlzdGVuIHN0cmVhbSBoYXMgY2FsbGVkIHRoZSBvbk9wZW4oKSBsaXN0ZW5lciwgYW55IG51bWJlciBvZlxuICogbGlzdGVuKCkgYW5kIHVubGlzdGVuKCkgY2FsbHMgY2FuIGJlIG1hZGUgdG8gY29udHJvbCB3aGF0IGNoYW5nZXMgd2lsbCBiZVxuICogc2VudCBmcm9tIHRoZSBzZXJ2ZXIgZm9yIExpc3RlblJlc3BvbnNlcy5cbiAqLyBjbGFzcyBCbyBleHRlbmRzIEZvIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuLCBzLCBpLCByKSB7XG4gICAgICAgIHN1cGVyKHQsIFwibGlzdGVuX3N0cmVhbV9jb25uZWN0aW9uX2JhY2tvZmZcIiAvKiBMaXN0ZW5TdHJlYW1Db25uZWN0aW9uQmFja29mZiAqLyAsIFwibGlzdGVuX3N0cmVhbV9pZGxlXCIgLyogTGlzdGVuU3RyZWFtSWRsZSAqLyAsIFwiaGVhbHRoX2NoZWNrX3RpbWVvdXRcIiAvKiBIZWFsdGhDaGVja1RpbWVvdXQgKi8gLCBlLCBuLCBzLCByKSwgXG4gICAgICAgIHRoaXMuTSA9IGk7XG4gICAgfVxuICAgIFVvKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuUm8uY28oXCJMaXN0ZW5cIiwgdCwgZSk7XG4gICAgfVxuICAgIG9uTWVzc2FnZSh0KSB7XG4gICAgICAgIC8vIEEgc3VjY2Vzc2Z1bCByZXNwb25zZSBtZWFucyB0aGUgc3RyZWFtIGlzIGhlYWx0aHlcbiAgICAgICAgdGhpcy52by5yZXNldCgpO1xuICAgICAgICBjb25zdCBlID0gSXModGhpcy5NLCB0KSwgbiA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIC8vIFdlIGhhdmUgb25seSByZWFjaGVkIGEgY29uc2lzdGVudCBzbmFwc2hvdCBmb3IgdGhlIGVudGlyZSBzdHJlYW0gaWYgdGhlcmVcbiAgICAgICAgICAgIC8vIGlzIGEgcmVhZF90aW1lIHNldCBhbmQgaXQgYXBwbGllcyB0byBhbGwgdGFyZ2V0cyAoaS5lLiB0aGUgbGlzdCBvZlxuICAgICAgICAgICAgLy8gdGFyZ2V0cyBpcyBlbXB0eSkuIFRoZSBiYWNrZW5kIGlzIGd1YXJhbnRlZWQgdG8gc2VuZCBzdWNoIHJlc3BvbnNlcy5cbiAgICAgICAgICAgIGlmICghKFwidGFyZ2V0Q2hhbmdlXCIgaW4gdCkpIHJldHVybiBjdC5taW4oKTtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0LnRhcmdldENoYW5nZTtcbiAgICAgICAgICAgIHJldHVybiBlLnRhcmdldElkcyAmJiBlLnRhcmdldElkcy5sZW5ndGggPyBjdC5taW4oKSA6IGUucmVhZFRpbWUgPyB1cyhlLnJlYWRUaW1lKSA6IGN0Lm1pbigpO1xuICAgICAgICB9KHQpO1xuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5LbyhlLCBuKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGludGVyZXN0IGluIHRoZSByZXN1bHRzIG9mIHRoZSBnaXZlbiB0YXJnZXQuIElmIHRoZSB0YXJnZXRcbiAgICAgKiBpbmNsdWRlcyBhIHJlc3VtZVRva2VuIGl0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHJlcXVlc3QuIFJlc3VsdHMgdGhhdFxuICAgICAqIGFmZmVjdCB0aGUgdGFyZ2V0IHdpbGwgYmUgc3RyZWFtZWQgYmFjayBhcyBXYXRjaENoYW5nZSBtZXNzYWdlcyB0aGF0XG4gICAgICogcmVmZXJlbmNlIHRoZSB0YXJnZXRJZC5cbiAgICAgKi8gICAgR28odCkge1xuICAgICAgICBjb25zdCBlID0ge307XG4gICAgICAgIGUuZGF0YWJhc2UgPSB3cyh0aGlzLk0pLCBlLmFkZFRhcmdldCA9IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGxldCBuO1xuICAgICAgICAgICAgY29uc3QgcyA9IGUudGFyZ2V0O1xuICAgICAgICAgICAgcmV0dXJuIG4gPSBmZShzKSA/IHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudHM6IFJzKHQsIHMpXG4gICAgICAgICAgICB9IDoge1xuICAgICAgICAgICAgICAgIHF1ZXJ5OiBicyh0LCBzKVxuICAgICAgICAgICAgfSwgbi50YXJnZXRJZCA9IGUudGFyZ2V0SWQsIGUucmVzdW1lVG9rZW4uYXBwcm94aW1hdGVCeXRlU2l6ZSgpID4gMCA/IG4ucmVzdW1lVG9rZW4gPSBvcyh0LCBlLnJlc3VtZVRva2VuKSA6IGUuc25hcHNob3RWZXJzaW9uLmNvbXBhcmVUbyhjdC5taW4oKSkgPiAwICYmIChcbiAgICAgICAgICAgIC8vIFRPRE8od3VhbmR5KTogQ29uc2lkZXIgcmVtb3ZpbmcgYWJvdmUgY2hlY2sgYmVjYXVzZSBpdCBpcyBtb3N0IGxpa2VseSB0cnVlLlxuICAgICAgICAgICAgLy8gUmlnaHQgbm93LCBtYW55IHRlc3RzIGRlcGVuZCBvbiB0aGlzIGJlaGF2aW91ciB0aG91Z2ggKGxlYXZpbmcgbWluKCkgb3V0XG4gICAgICAgICAgICAvLyBvZiBzZXJpYWxpemF0aW9uKS5cbiAgICAgICAgICAgIG4ucmVhZFRpbWUgPSBycyh0LCBlLnNuYXBzaG90VmVyc2lvbi50b1RpbWVzdGFtcCgpKSksIG47XG4gICAgICAgIH0odGhpcy5NLCB0KTtcbiAgICAgICAgY29uc3QgbiA9IFZzKHRoaXMuTSwgdCk7XG4gICAgICAgIG4gJiYgKGUubGFiZWxzID0gbiksIHRoaXMuTW8oZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVucmVnaXN0ZXJzIGludGVyZXN0IGluIHRoZSByZXN1bHRzIG9mIHRoZSB0YXJnZXQgYXNzb2NpYXRlZCB3aXRoIHRoZVxuICAgICAqIGdpdmVuIHRhcmdldElkLlxuICAgICAqLyAgICBRbyh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB7fTtcbiAgICAgICAgZS5kYXRhYmFzZSA9IHdzKHRoaXMuTSksIGUucmVtb3ZlVGFyZ2V0ID0gdCwgdGhpcy5NbyhlKTtcbiAgICB9XG59XG5cbi8qKlxuICogQSBTdHJlYW0gdGhhdCBpbXBsZW1lbnRzIHRoZSBXcml0ZSBSUEMuXG4gKlxuICogVGhlIFdyaXRlIFJQQyByZXF1aXJlcyB0aGUgY2FsbGVyIHRvIG1haW50YWluIHNwZWNpYWwgc3RyZWFtVG9rZW5cbiAqIHN0YXRlIGluIGJldHdlZW4gY2FsbHMsIHRvIGhlbHAgdGhlIHNlcnZlciB1bmRlcnN0YW5kIHdoaWNoIHJlc3BvbnNlcyB0aGVcbiAqIGNsaWVudCBoYXMgcHJvY2Vzc2VkIGJ5IHRoZSB0aW1lIHRoZSBuZXh0IHJlcXVlc3QgaXMgbWFkZS4gRXZlcnkgcmVzcG9uc2VcbiAqIHdpbGwgY29udGFpbiBhIHN0cmVhbVRva2VuOyB0aGlzIHZhbHVlIG11c3QgYmUgcGFzc2VkIHRvIHRoZSBuZXh0XG4gKiByZXF1ZXN0LlxuICpcbiAqIEFmdGVyIGNhbGxpbmcgc3RhcnQoKSBvbiB0aGlzIHN0cmVhbSwgdGhlIG5leHQgcmVxdWVzdCBtdXN0IGJlIGEgaGFuZHNoYWtlLFxuICogY29udGFpbmluZyB3aGF0ZXZlciBzdHJlYW1Ub2tlbiBpcyBvbiBoYW5kLiBPbmNlIGEgcmVzcG9uc2UgdG8gdGhpc1xuICogcmVxdWVzdCBpcyByZWNlaXZlZCwgYWxsIHBlbmRpbmcgbXV0YXRpb25zIG1heSBiZSBzdWJtaXR0ZWQuIFdoZW5cbiAqIHN1Ym1pdHRpbmcgbXVsdGlwbGUgYmF0Y2hlcyBvZiBtdXRhdGlvbnMgYXQgdGhlIHNhbWUgdGltZSwgaXQnc1xuICogb2theSB0byB1c2UgdGhlIHNhbWUgc3RyZWFtVG9rZW4gZm9yIHRoZSBjYWxscyB0byB3cml0ZU11dGF0aW9ucy5cbiAqXG4gKiBUT0RPKGIvMzMyNzEyMzUpOiBVc2UgcHJvdG8gdHlwZXNcbiAqLyBjbGFzcyBMbyBleHRlbmRzIEZvIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuLCBzLCBpLCByKSB7XG4gICAgICAgIHN1cGVyKHQsIFwid3JpdGVfc3RyZWFtX2Nvbm5lY3Rpb25fYmFja29mZlwiIC8qIFdyaXRlU3RyZWFtQ29ubmVjdGlvbkJhY2tvZmYgKi8gLCBcIndyaXRlX3N0cmVhbV9pZGxlXCIgLyogV3JpdGVTdHJlYW1JZGxlICovICwgXCJoZWFsdGhfY2hlY2tfdGltZW91dFwiIC8qIEhlYWx0aENoZWNrVGltZW91dCAqLyAsIGUsIG4sIHMsIHIpLCBcbiAgICAgICAgdGhpcy5NID0gaSwgdGhpcy5qbyA9ICExO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcmFja3Mgd2hldGhlciBvciBub3QgYSBoYW5kc2hha2UgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGV4Y2hhbmdlZCBhbmRcbiAgICAgKiB0aGUgc3RyZWFtIGlzIHJlYWR5IHRvIGFjY2VwdCBtdXRhdGlvbnMuXG4gICAgICovICAgIGdldCBXbygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam87XG4gICAgfVxuICAgIC8vIE92ZXJyaWRlIG9mIFBlcnNpc3RlbnRTdHJlYW0uc3RhcnRcbiAgICBzdGFydCgpIHtcbiAgICAgICAgdGhpcy5qbyA9ICExLCB0aGlzLmxhc3RTdHJlYW1Ub2tlbiA9IHZvaWQgMCwgc3VwZXIuc3RhcnQoKTtcbiAgICB9XG4gICAgRm8oKSB7XG4gICAgICAgIHRoaXMuam8gJiYgdGhpcy56byhbXSk7XG4gICAgfVxuICAgIFVvKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuUm8uY28oXCJXcml0ZVwiLCB0LCBlKTtcbiAgICB9XG4gICAgb25NZXNzYWdlKHQpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAvLyBBbHdheXMgY2FwdHVyZSB0aGUgbGFzdCBzdHJlYW0gdG9rZW4uXG4gICAgICAgIHEoISF0LnN0cmVhbVRva2VuKSwgdGhpcy5sYXN0U3RyZWFtVG9rZW4gPSB0LnN0cmVhbVRva2VuLCB0aGlzLmpvKSB7XG4gICAgICAgICAgICAvLyBBIHN1Y2Nlc3NmdWwgZmlyc3Qgd3JpdGUgcmVzcG9uc2UgbWVhbnMgdGhlIHN0cmVhbSBpcyBoZWFsdGh5LFxuICAgICAgICAgICAgLy8gTm90ZSwgdGhhdCB3ZSBjb3VsZCBjb25zaWRlciBhIHN1Y2Nlc3NmdWwgaGFuZHNoYWtlIGhlYWx0aHksIGhvd2V2ZXIsXG4gICAgICAgICAgICAvLyB0aGUgd3JpdGUgaXRzZWxmIG1pZ2h0IGJlIGNhdXNpbmcgYW4gZXJyb3Igd2Ugd2FudCB0byBiYWNrIG9mZiBmcm9tLlxuICAgICAgICAgICAgdGhpcy52by5yZXNldCgpO1xuICAgICAgICAgICAgY29uc3QgZSA9IEFzKHQud3JpdGVSZXN1bHRzLCB0LmNvbW1pdFRpbWUpLCBuID0gdXModC5jb21taXRUaW1lKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyLkhvKG4sIGUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBmaXJzdCByZXNwb25zZSBpcyBhbHdheXMgdGhlIGhhbmRzaGFrZSByZXNwb25zZVxuICAgICAgICByZXR1cm4gcSghdC53cml0ZVJlc3VsdHMgfHwgMCA9PT0gdC53cml0ZVJlc3VsdHMubGVuZ3RoKSwgdGhpcy5qbyA9ICEwLCB0aGlzLmxpc3RlbmVyLkpvKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGFuIGluaXRpYWwgc3RyZWFtVG9rZW4gdG8gdGhlIHNlcnZlciwgcGVyZm9ybWluZyB0aGUgaGFuZHNoYWtlXG4gICAgICogcmVxdWlyZWQgdG8gbWFrZSB0aGUgU3RyZWFtaW5nV3JpdGUgUlBDIHdvcmsuIFN1YnNlcXVlbnRcbiAgICAgKiBjYWxscyBzaG91bGQgd2FpdCB1bnRpbCBvbkhhbmRzaGFrZUNvbXBsZXRlIHdhcyBjYWxsZWQuXG4gICAgICovICAgIFlvKCkge1xuICAgICAgICAvLyBUT0RPKGRpbW9uZCk6IFN1cHBvcnQgc3RyZWFtIHJlc3VtcHRpb24uIFdlIGludGVudGlvbmFsbHkgZG8gbm90IHNldCB0aGVcbiAgICAgICAgLy8gc3RyZWFtIHRva2VuIG9uIHRoZSBoYW5kc2hha2UsIGlnbm9yaW5nIGFueSBzdHJlYW0gdG9rZW4gd2UgbWlnaHQgaGF2ZS5cbiAgICAgICAgY29uc3QgdCA9IHt9O1xuICAgICAgICB0LmRhdGFiYXNlID0gd3ModGhpcy5NKSwgdGhpcy5Nbyh0KTtcbiAgICB9XG4gICAgLyoqIFNlbmRzIGEgZ3JvdXAgb2YgbXV0YXRpb25zIHRvIHRoZSBGaXJlc3RvcmUgYmFja2VuZCB0byBhcHBseS4gKi8gICAgem8odCkge1xuICAgICAgICBjb25zdCBlID0ge1xuICAgICAgICAgICAgc3RyZWFtVG9rZW46IHRoaXMubGFzdFN0cmVhbVRva2VuLFxuICAgICAgICAgICAgd3JpdGVzOiB0Lm1hcCgodCA9PiBUcyh0aGlzLk0sIHQpKSlcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5NbyhlKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIERhdGFzdG9yZSBhbmQgaXRzIHJlbGF0ZWQgbWV0aG9kcyBhcmUgYSB3cmFwcGVyIGFyb3VuZCB0aGUgZXh0ZXJuYWwgR29vZ2xlXG4gKiBDbG91ZCBEYXRhc3RvcmUgZ3JwYyBBUEksIHdoaWNoIHByb3ZpZGVzIGFuIGludGVyZmFjZSB0aGF0IGlzIG1vcmUgY29udmVuaWVudFxuICogZm9yIHRoZSByZXN0IG9mIHRoZSBjbGllbnQgU0RLIGFyY2hpdGVjdHVyZSB0byBjb25zdW1lLlxuICovXG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIERhdGFzdG9yZSB0aGF0IGV4cG9zZXMgYWRkaXRpb25hbCBzdGF0ZSBmb3IgaW50ZXJuYWxcbiAqIGNvbnN1bXB0aW9uLlxuICovXG5jbGFzcyBxbyBleHRlbmRzIGNsYXNzIHt9IHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuLCBzKSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMuYXV0aENyZWRlbnRpYWxzID0gdCwgdGhpcy5hcHBDaGVja0NyZWRlbnRpYWxzID0gZSwgdGhpcy5SbyA9IG4sIHRoaXMuTSA9IHMsIFxuICAgICAgICB0aGlzLlhvID0gITE7XG4gICAgfVxuICAgIFpvKCkge1xuICAgICAgICBpZiAodGhpcy5YbykgdGhyb3cgbmV3IFEoRy5GQUlMRURfUFJFQ09ORElUSU9OLCBcIlRoZSBjbGllbnQgaGFzIGFscmVhZHkgYmVlbiB0ZXJtaW5hdGVkLlwiKTtcbiAgICB9XG4gICAgLyoqIEludm9rZXMgdGhlIHByb3ZpZGVkIFJQQyB3aXRoIGF1dGggYW5kIEFwcENoZWNrIHRva2Vucy4gKi8gICAgaW8odCwgZSwgbikge1xuICAgICAgICByZXR1cm4gdGhpcy5abygpLCBQcm9taXNlLmFsbChbIHRoaXMuYXV0aENyZWRlbnRpYWxzLmdldFRva2VuKCksIHRoaXMuYXBwQ2hlY2tDcmVkZW50aWFscy5nZXRUb2tlbigpIF0pLnRoZW4oKChbcywgaV0pID0+IHRoaXMuUm8uaW8odCwgZSwgbiwgcywgaSkpKS5jYXRjaCgodCA9PiB7XG4gICAgICAgICAgICB0aHJvdyBcIkZpcmViYXNlRXJyb3JcIiA9PT0gdC5uYW1lID8gKHQuY29kZSA9PT0gRy5VTkFVVEhFTlRJQ0FURUQgJiYgKHRoaXMuYXV0aENyZWRlbnRpYWxzLmludmFsaWRhdGVUb2tlbigpLCBcbiAgICAgICAgICAgIHRoaXMuYXBwQ2hlY2tDcmVkZW50aWFscy5pbnZhbGlkYXRlVG9rZW4oKSksIHQpIDogbmV3IFEoRy5VTktOT1dOLCB0LnRvU3RyaW5nKCkpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKiBJbnZva2VzIHRoZSBwcm92aWRlZCBSUEMgd2l0aCBzdHJlYW1lZCByZXN1bHRzIHdpdGggYXV0aCBhbmQgQXBwQ2hlY2sgdG9rZW5zLiAqLyAgICB1byh0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLlpvKCksIFByb21pc2UuYWxsKFsgdGhpcy5hdXRoQ3JlZGVudGlhbHMuZ2V0VG9rZW4oKSwgdGhpcy5hcHBDaGVja0NyZWRlbnRpYWxzLmdldFRva2VuKCkgXSkudGhlbigoKFtzLCBpXSkgPT4gdGhpcy5Sby51byh0LCBlLCBuLCBzLCBpKSkpLmNhdGNoKCh0ID0+IHtcbiAgICAgICAgICAgIHRocm93IFwiRmlyZWJhc2VFcnJvclwiID09PSB0Lm5hbWUgPyAodC5jb2RlID09PSBHLlVOQVVUSEVOVElDQVRFRCAmJiAodGhpcy5hdXRoQ3JlZGVudGlhbHMuaW52YWxpZGF0ZVRva2VuKCksIFxuICAgICAgICAgICAgdGhpcy5hcHBDaGVja0NyZWRlbnRpYWxzLmludmFsaWRhdGVUb2tlbigpKSwgdCkgOiBuZXcgUShHLlVOS05PV04sIHQudG9TdHJpbmcoKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgdGVybWluYXRlKCkge1xuICAgICAgICB0aGlzLlhvID0gITA7XG4gICAgfVxufVxuXG4vLyBUT0RPKGZpcmVzdG9yZXhwKTogTWFrZSBzdXJlIHRoZXJlIGlzIG9ubHkgb25lIERhdGFzdG9yZSBpbnN0YW5jZSBwZXJcbi8vIGZpcmVzdG9yZS1leHAgY2xpZW50LlxuLyoqXG4gKiBBIGNvbXBvbmVudCB1c2VkIGJ5IHRoZSBSZW1vdGVTdG9yZSB0byB0cmFjayB0aGUgT25saW5lU3RhdGUgKHRoYXQgaXMsXG4gKiB3aGV0aGVyIG9yIG5vdCB0aGUgY2xpZW50IGFzIGEgd2hvbGUgc2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gYmUgb25saW5lIG9yXG4gKiBvZmZsaW5lKSwgaW1wbGVtZW50aW5nIHRoZSBhcHByb3ByaWF0ZSBoZXVyaXN0aWNzLlxuICpcbiAqIEluIHBhcnRpY3VsYXIsIHdoZW4gdGhlIGNsaWVudCBpcyB0cnlpbmcgdG8gY29ubmVjdCB0byB0aGUgYmFja2VuZCwgd2VcbiAqIGFsbG93IHVwIHRvIE1BWF9XQVRDSF9TVFJFQU1fRkFJTFVSRVMgd2l0aGluIE9OTElORV9TVEFURV9USU1FT1VUX01TIGZvclxuICogYSBjb25uZWN0aW9uIHRvIHN1Y2NlZWQuIElmIHdlIGhhdmUgdG9vIG1hbnkgZmFpbHVyZXMgb3IgdGhlIHRpbWVvdXQgZWxhcHNlcyxcbiAqIHRoZW4gd2Ugc2V0IHRoZSBPbmxpbmVTdGF0ZSB0byBPZmZsaW5lLCBhbmQgdGhlIGNsaWVudCB3aWxsIGJlaGF2ZSBhcyBpZlxuICogaXQgaXMgb2ZmbGluZSAoZ2V0KClzIHdpbGwgcmV0dXJuIGNhY2hlZCBkYXRhLCBldGMuKS5cbiAqL1xuY2xhc3MgVW8ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5hc3luY1F1ZXVlID0gdCwgdGhpcy5vbmxpbmVTdGF0ZUhhbmRsZXIgPSBlLCBcbiAgICAgICAgLyoqIFRoZSBjdXJyZW50IE9ubGluZVN0YXRlLiAqL1xuICAgICAgICB0aGlzLnN0YXRlID0gXCJVbmtub3duXCIgLyogVW5rbm93biAqLyAsIFxuICAgICAgICAvKipcbiAgICAgICAgICogQSBjb3VudCBvZiBjb25zZWN1dGl2ZSBmYWlsdXJlcyB0byBvcGVuIHRoZSBzdHJlYW0uIElmIGl0IHJlYWNoZXMgdGhlXG4gICAgICAgICAqIG1heGltdW0gZGVmaW5lZCBieSBNQVhfV0FUQ0hfU1RSRUFNX0ZBSUxVUkVTLCB3ZSdsbCBzZXQgdGhlIE9ubGluZVN0YXRlIHRvXG4gICAgICAgICAqIE9mZmxpbmUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRhID0gMCwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHRpbWVyIHRoYXQgZWxhcHNlcyBhZnRlciBPTkxJTkVfU1RBVEVfVElNRU9VVF9NUywgYXQgd2hpY2ggcG9pbnQgd2VcbiAgICAgICAgICogdHJhbnNpdGlvbiBmcm9tIE9ubGluZVN0YXRlLlVua25vd24gdG8gT25saW5lU3RhdGUuT2ZmbGluZSB3aXRob3V0IHdhaXRpbmdcbiAgICAgICAgICogZm9yIHRoZSBzdHJlYW0gdG8gYWN0dWFsbHkgZmFpbCAoTUFYX1dBVENIX1NUUkVBTV9GQUlMVVJFUyB0aW1lcykuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmVhID0gbnVsbCwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGV0aGVyIHRoZSBjbGllbnQgc2hvdWxkIGxvZyBhIHdhcm5pbmcgbWVzc2FnZSBpZiBpdCBmYWlscyB0byBjb25uZWN0IHRvXG4gICAgICAgICAqIHRoZSBiYWNrZW5kIChpbml0aWFsbHkgdHJ1ZSwgY2xlYXJlZCBhZnRlciBhIHN1Y2Nlc3NmdWwgc3RyZWFtLCBvciBpZiB3ZSd2ZVxuICAgICAgICAgKiBsb2dnZWQgdGhlIG1lc3NhZ2UgYWxyZWFkeSkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm5hID0gITA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCBieSBSZW1vdGVTdG9yZSB3aGVuIGEgd2F0Y2ggc3RyZWFtIGlzIHN0YXJ0ZWQgKGluY2x1ZGluZyBvbiBlYWNoXG4gICAgICogYmFja29mZiBhdHRlbXB0KS5cbiAgICAgKlxuICAgICAqIElmIHRoaXMgaXMgdGhlIGZpcnN0IGF0dGVtcHQsIGl0IHNldHMgdGhlIE9ubGluZVN0YXRlIHRvIFVua25vd24gYW5kIHN0YXJ0c1xuICAgICAqIHRoZSBvbmxpbmVTdGF0ZVRpbWVyLlxuICAgICAqLyAgICBzYSgpIHtcbiAgICAgICAgMCA9PT0gdGhpcy50YSAmJiAodGhpcy5pYShcIlVua25vd25cIiAvKiBVbmtub3duICovKSwgdGhpcy5lYSA9IHRoaXMuYXN5bmNRdWV1ZS5lbnF1ZXVlQWZ0ZXJEZWxheShcIm9ubGluZV9zdGF0ZV90aW1lb3V0XCIgLyogT25saW5lU3RhdGVUaW1lb3V0ICovICwgMWU0LCAoKCkgPT4gKHRoaXMuZWEgPSBudWxsLCBcbiAgICAgICAgdGhpcy5yYShcIkJhY2tlbmQgZGlkbid0IHJlc3BvbmQgd2l0aGluIDEwIHNlY29uZHMuXCIpLCB0aGlzLmlhKFwiT2ZmbGluZVwiIC8qIE9mZmxpbmUgKi8pLCBcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkpKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIG91ciBPbmxpbmVTdGF0ZSBhcyBhcHByb3ByaWF0ZSBhZnRlciB0aGUgd2F0Y2ggc3RyZWFtIHJlcG9ydHMgYVxuICAgICAqIGZhaWx1cmUuIFRoZSBmaXJzdCBmYWlsdXJlIG1vdmVzIHVzIHRvIHRoZSAnVW5rbm93bicgc3RhdGUuIFdlIHRoZW4gbWF5XG4gICAgICogYWxsb3cgbXVsdGlwbGUgZmFpbHVyZXMgKGJhc2VkIG9uIE1BWF9XQVRDSF9TVFJFQU1fRkFJTFVSRVMpIGJlZm9yZSB3ZVxuICAgICAqIGFjdHVhbGx5IHRyYW5zaXRpb24gdG8gdGhlICdPZmZsaW5lJyBzdGF0ZS5cbiAgICAgKi8gICAgb2EodCkge1xuICAgICAgICBcIk9ubGluZVwiIC8qIE9ubGluZSAqLyA9PT0gdGhpcy5zdGF0ZSA/IHRoaXMuaWEoXCJVbmtub3duXCIgLyogVW5rbm93biAqLykgOiAodGhpcy50YSsrLCBcbiAgICAgICAgdGhpcy50YSA+PSAxICYmICh0aGlzLmFhKCksIHRoaXMucmEoYENvbm5lY3Rpb24gZmFpbGVkIDEgdGltZXMuIE1vc3QgcmVjZW50IGVycm9yOiAke3QudG9TdHJpbmcoKX1gKSwgXG4gICAgICAgIHRoaXMuaWEoXCJPZmZsaW5lXCIgLyogT2ZmbGluZSAqLykpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhwbGljaXRseSBzZXRzIHRoZSBPbmxpbmVTdGF0ZSB0byB0aGUgc3BlY2lmaWVkIHN0YXRlLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHRoaXMgcmVzZXRzIG91ciB0aW1lcnMgLyBmYWlsdXJlIGNvdW50ZXJzLCBldGMuIHVzZWQgYnkgb3VyXG4gICAgICogT2ZmbGluZSBoZXVyaXN0aWNzLCBzbyBtdXN0IG5vdCBiZSB1c2VkIGluIHBsYWNlIG9mXG4gICAgICogaGFuZGxlV2F0Y2hTdHJlYW1TdGFydCgpIGFuZCBoYW5kbGVXYXRjaFN0cmVhbUZhaWx1cmUoKS5cbiAgICAgKi8gICAgc2V0KHQpIHtcbiAgICAgICAgdGhpcy5hYSgpLCB0aGlzLnRhID0gMCwgXCJPbmxpbmVcIiAvKiBPbmxpbmUgKi8gPT09IHQgJiYgKFxuICAgICAgICAvLyBXZSd2ZSBjb25uZWN0ZWQgdG8gd2F0Y2ggYXQgbGVhc3Qgb25jZS4gRG9uJ3Qgd2FybiB0aGUgZGV2ZWxvcGVyXG4gICAgICAgIC8vIGFib3V0IGJlaW5nIG9mZmxpbmUgZ29pbmcgZm9yd2FyZC5cbiAgICAgICAgdGhpcy5uYSA9ICExKSwgdGhpcy5pYSh0KTtcbiAgICB9XG4gICAgaWEodCkge1xuICAgICAgICB0ICE9PSB0aGlzLnN0YXRlICYmICh0aGlzLnN0YXRlID0gdCwgdGhpcy5vbmxpbmVTdGF0ZUhhbmRsZXIodCkpO1xuICAgIH1cbiAgICByYSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBgQ291bGQgbm90IHJlYWNoIENsb3VkIEZpcmVzdG9yZSBiYWNrZW5kLiAke3R9XFxuVGhpcyB0eXBpY2FsbHkgaW5kaWNhdGVzIHRoYXQgeW91ciBkZXZpY2UgZG9lcyBub3QgaGF2ZSBhIGhlYWx0aHkgSW50ZXJuZXQgY29ubmVjdGlvbiBhdCB0aGUgbW9tZW50LiBUaGUgY2xpZW50IHdpbGwgb3BlcmF0ZSBpbiBvZmZsaW5lIG1vZGUgdW50aWwgaXQgaXMgYWJsZSB0byBzdWNjZXNzZnVsbHkgY29ubmVjdCB0byB0aGUgYmFja2VuZC5gO1xuICAgICAgICB0aGlzLm5hID8gKCQoZSksIHRoaXMubmEgPSAhMSkgOiBPKFwiT25saW5lU3RhdGVUcmFja2VyXCIsIGUpO1xuICAgIH1cbiAgICBhYSgpIHtcbiAgICAgICAgbnVsbCAhPT0gdGhpcy5lYSAmJiAodGhpcy5lYS5jYW5jZWwoKSwgdGhpcy5lYSA9IG51bGwpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gY2xhc3MgS28ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIFRoZSBsb2NhbCBzdG9yZSwgdXNlZCB0byBmaWxsIHRoZSB3cml0ZSBwaXBlbGluZSB3aXRoIG91dGJvdW5kIG11dGF0aW9ucy5cbiAgICAgKi9cbiAgICB0LCBcbiAgICAvKiogVGhlIGNsaWVudC1zaWRlIHByb3h5IGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBiYWNrZW5kLiAqL1xuICAgIGUsIG4sIHMsIGkpIHtcbiAgICAgICAgdGhpcy5sb2NhbFN0b3JlID0gdCwgdGhpcy5kYXRhc3RvcmUgPSBlLCB0aGlzLmFzeW5jUXVldWUgPSBuLCB0aGlzLnJlbW90ZVN5bmNlciA9IHt9LCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgbGlzdCBvZiB1cCB0byBNQVhfUEVORElOR19XUklURVMgd3JpdGVzIHRoYXQgd2UgaGF2ZSBmZXRjaGVkIGZyb20gdGhlXG4gICAgICAgICAqIExvY2FsU3RvcmUgdmlhIGZpbGxXcml0ZVBpcGVsaW5lKCkgYW5kIGhhdmUgb3Igd2lsbCBzZW5kIHRvIHRoZSB3cml0ZVxuICAgICAgICAgKiBzdHJlYW0uXG4gICAgICAgICAqXG4gICAgICAgICAqIFdoZW5ldmVyIHdyaXRlUGlwZWxpbmUubGVuZ3RoID4gMCB0aGUgUmVtb3RlU3RvcmUgd2lsbCBhdHRlbXB0IHRvIHN0YXJ0IG9yXG4gICAgICAgICAqIHJlc3RhcnQgdGhlIHdyaXRlIHN0cmVhbS4gV2hlbiB0aGUgc3RyZWFtIGlzIGVzdGFibGlzaGVkIHRoZSB3cml0ZXMgaW4gdGhlXG4gICAgICAgICAqIHBpcGVsaW5lIHdpbGwgYmUgc2VudCBpbiBvcmRlci5cbiAgICAgICAgICpcbiAgICAgICAgICogV3JpdGVzIHJlbWFpbiBpbiB3cml0ZVBpcGVsaW5lIHVudGlsIHRoZXkgYXJlIGFja25vd2xlZGdlZCBieSB0aGUgYmFja2VuZFxuICAgICAgICAgKiBhbmQgdGh1cyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgcmUtc2VudCBpZiB0aGUgc3RyZWFtIGlzIGludGVycnVwdGVkIC9cbiAgICAgICAgICogcmVzdGFydGVkIGJlZm9yZSB0aGV5J3JlIGFja25vd2xlZGdlZC5cbiAgICAgICAgICpcbiAgICAgICAgICogV3JpdGUgcmVzcG9uc2VzIGZyb20gdGhlIGJhY2tlbmQgYXJlIGxpbmtlZCB0byB0aGVpciBvcmlnaW5hdGluZyByZXF1ZXN0XG4gICAgICAgICAqIHB1cmVseSBiYXNlZCBvbiBvcmRlciwgYW5kIHNvIHdlIGNhbiBqdXN0IHNoaWZ0KCkgd3JpdGVzIGZyb20gdGhlIGZyb250IG9mXG4gICAgICAgICAqIHRoZSB3cml0ZVBpcGVsaW5lIGFzIHdlIHJlY2VpdmUgcmVzcG9uc2VzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy51YSA9IFtdLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgbWFwcGluZyBvZiB3YXRjaGVkIHRhcmdldHMgdGhhdCB0aGUgY2xpZW50IGNhcmVzIGFib3V0IHRyYWNraW5nIGFuZCB0aGVcbiAgICAgICAgICogdXNlciBoYXMgZXhwbGljaXRseSBjYWxsZWQgYSAnbGlzdGVuJyBmb3IgdGhpcyB0YXJnZXQuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZXNlIHRhcmdldHMgbWF5IG9yIG1heSBub3QgaGF2ZSBiZWVuIHNlbnQgdG8gb3IgYWNrbm93bGVkZ2VkIGJ5IHRoZVxuICAgICAgICAgKiBzZXJ2ZXIuIE9uIHJlLWVzdGFibGlzaGluZyB0aGUgbGlzdGVuIHN0cmVhbSwgdGhlc2UgdGFyZ2V0cyBzaG91bGQgYmUgc2VudFxuICAgICAgICAgKiB0byB0aGUgc2VydmVyLiBUaGUgdGFyZ2V0cyByZW1vdmVkIHdpdGggdW5saXN0ZW5zIGFyZSByZW1vdmVkIGVhZ2VybHlcbiAgICAgICAgICogd2l0aG91dCB3YWl0aW5nIGZvciBjb25maXJtYXRpb24gZnJvbSB0aGUgbGlzdGVuIHN0cmVhbS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2EgPSBuZXcgTWFwLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgc2V0IG9mIHJlYXNvbnMgZm9yIHdoeSB0aGUgUmVtb3RlU3RvcmUgbWF5IGJlIG9mZmxpbmUuIElmIGVtcHR5LCB0aGVcbiAgICAgICAgICogUmVtb3RlU3RvcmUgbWF5IHN0YXJ0IGl0cyBuZXR3b3JrIGNvbm5lY3Rpb25zLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5oYSA9IG5ldyBTZXQsIFxuICAgICAgICAvKipcbiAgICAgICAgICogRXZlbnQgaGFuZGxlcnMgdGhhdCBnZXQgY2FsbGVkIHdoZW4gdGhlIG5ldHdvcmsgaXMgZGlzYWJsZWQgb3IgZW5hYmxlZC5cbiAgICAgICAgICpcbiAgICAgICAgICogUE9SVElORyBOT1RFOiBUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgb24gdGhlIFdlYiBjbGllbnQgdG8gY3JlYXRlIHRoZVxuICAgICAgICAgKiB1bmRlcmx5aW5nIHN0cmVhbXMgKHRvIHN1cHBvcnQgdHJlZS1zaGFrZWFibGUgc3RyZWFtcykuIE9uIEFuZHJvaWQgYW5kIGlPUyxcbiAgICAgICAgICogdGhlIHN0cmVhbXMgYXJlIGNyZWF0ZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiBvZiBSZW1vdGVTdG9yZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubGEgPSBbXSwgdGhpcy5mYSA9IGksIHRoaXMuZmEuRnIoKHQgPT4ge1xuICAgICAgICAgICAgbi5lbnF1ZXVlQW5kRm9yZ2V0KChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gUG9ydGluZyBOb3RlOiBVbmxpa2UgaU9TLCBgcmVzdGFydE5ldHdvcmsoKWAgaXMgY2FsbGVkIGV2ZW4gd2hlbiB0aGVcbiAgICAgICAgICAgICAgICAvLyBuZXR3b3JrIGJlY29tZXMgdW5yZWFjaGFibGUgYXMgd2UgZG9uJ3QgaGF2ZSBhbnkgb3RoZXIgd2F5IHRvIHRlYXJcbiAgICAgICAgICAgICAgICAvLyBkb3duIG91ciBzdHJlYW1zLlxuICAgICAgICAgICAgICAgIFhvKHRoaXMpICYmIChPKFwiUmVtb3RlU3RvcmVcIiwgXCJSZXN0YXJ0aW5nIHN0cmVhbXMgZm9yIG5ldHdvcmsgcmVhY2hhYmlsaXR5IGNoYW5nZS5cIiksIFxuICAgICAgICAgICAgICAgIGF3YWl0IGFzeW5jIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IEsodCk7XG4gICAgICAgICAgICAgICAgICAgIGUuaGEuYWRkKDQgLyogQ29ubmVjdGl2aXR5Q2hhbmdlICovKSwgYXdhaXQgUW8oZSksIGUuZGEuc2V0KFwiVW5rbm93blwiIC8qIFVua25vd24gKi8pLCBcbiAgICAgICAgICAgICAgICAgICAgZS5oYS5kZWxldGUoNCAvKiBDb25uZWN0aXZpdHlDaGFuZ2UgKi8pLCBhd2FpdCBHbyhlKTtcbiAgICAgICAgICAgICAgICB9KHRoaXMpKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSkpLCB0aGlzLmRhID0gbmV3IFVvKG4sIHMpO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gR28odCkge1xuICAgIGlmIChYbyh0KSkgZm9yIChjb25zdCBlIG9mIHQubGEpIGF3YWl0IGUoLyogZW5hYmxlZD0gKi8gITApO1xufVxuXG4vKipcbiAqIFRlbXBvcmFyaWx5IGRpc2FibGVzIHRoZSBuZXR3b3JrLiBUaGUgbmV0d29yayBjYW4gYmUgcmUtZW5hYmxlZCB1c2luZ1xuICogZW5hYmxlTmV0d29yaygpLlxuICovIGFzeW5jIGZ1bmN0aW9uIFFvKHQpIHtcbiAgICBmb3IgKGNvbnN0IGUgb2YgdC5sYSkgYXdhaXQgZSgvKiBlbmFibGVkPSAqLyAhMSk7XG59XG5cbi8qKlxuICogU3RhcnRzIG5ldyBsaXN0ZW4gZm9yIHRoZSBnaXZlbiB0YXJnZXQuIFVzZXMgcmVzdW1lIHRva2VuIGlmIHByb3ZpZGVkLiBJdFxuICogaXMgYSBuby1vcCBpZiB0aGUgdGFyZ2V0IG9mIGdpdmVuIGBUYXJnZXREYXRhYCBpcyBhbHJlYWR5IGJlaW5nIGxpc3RlbmVkIHRvLlxuICovXG5mdW5jdGlvbiBqbyh0LCBlKSB7XG4gICAgY29uc3QgbiA9IEsodCk7XG4gICAgbi5jYS5oYXMoZS50YXJnZXRJZCkgfHwgKFxuICAgIC8vIE1hcmsgdGhpcyBhcyBzb21ldGhpbmcgdGhlIGNsaWVudCBpcyBjdXJyZW50bHkgbGlzdGVuaW5nIGZvci5cbiAgICBuLmNhLnNldChlLnRhcmdldElkLCBlKSwgWW8obikgPyBcbiAgICAvLyBUaGUgbGlzdGVuIHdpbGwgYmUgc2VudCBpbiBvbldhdGNoU3RyZWFtT3BlblxuICAgIEpvKG4pIDogbWEobikuRG8oKSAmJiB6byhuLCBlKSk7XG59XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgbGlzdGVuIGZyb20gc2VydmVyLiBJdCBpcyBhIG5vLW9wIGlmIHRoZSBnaXZlbiB0YXJnZXQgaWQgaXNcbiAqIG5vdCBiZWluZyBsaXN0ZW5lZCB0by5cbiAqLyBmdW5jdGlvbiBXbyh0LCBlKSB7XG4gICAgY29uc3QgbiA9IEsodCksIHMgPSBtYShuKTtcbiAgICBuLmNhLmRlbGV0ZShlKSwgcy5EbygpICYmIEhvKG4sIGUpLCAwID09PSBuLmNhLnNpemUgJiYgKHMuRG8oKSA/IHMuTm8oKSA6IFhvKG4pICYmIFxuICAgIC8vIFJldmVydCB0byBPbmxpbmVTdGF0ZS5Vbmtub3duIGlmIHRoZSB3YXRjaCBzdHJlYW0gaXMgbm90IG9wZW4gYW5kIHdlXG4gICAgLy8gaGF2ZSBubyBsaXN0ZW5lcnMsIHNpbmNlIHdpdGhvdXQgYW55IGxpc3RlbnMgdG8gc2VuZCB3ZSBjYW5ub3RcbiAgICAvLyBjb25maXJtIGlmIHRoZSBzdHJlYW0gaXMgaGVhbHRoeSBhbmQgdXBncmFkZSB0byBPbmxpbmVTdGF0ZS5PbmxpbmUuXG4gICAgbi5kYS5zZXQoXCJVbmtub3duXCIgLyogVW5rbm93biAqLykpO1xufVxuXG4vKipcbiAqIFdlIG5lZWQgdG8gaW5jcmVtZW50IHRoZSB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIHBlbmRpbmcgcmVzcG9uc2VzIHdlJ3JlIGR1ZVxuICogZnJvbSB3YXRjaCBzbyB3ZSB3YWl0IGZvciB0aGUgYWNrIHRvIHByb2Nlc3MgYW55IG1lc3NhZ2VzIGZyb20gdGhpcyB0YXJnZXQuXG4gKi8gZnVuY3Rpb24gem8odCwgZSkge1xuICAgIHQuX2EuWihlLnRhcmdldElkKSwgbWEodCkuR28oZSk7XG59XG5cbi8qKlxuICogV2UgbmVlZCB0byBpbmNyZW1lbnQgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBwZW5kaW5nIHJlc3BvbnNlcyB3ZSdyZSBkdWVcbiAqIGZyb20gd2F0Y2ggc28gd2Ugd2FpdCBmb3IgdGhlIHJlbW92YWwgb24gdGhlIHNlcnZlciBiZWZvcmUgd2UgcHJvY2VzcyBhbnlcbiAqIG1lc3NhZ2VzIGZyb20gdGhpcyB0YXJnZXQuXG4gKi8gZnVuY3Rpb24gSG8odCwgZSkge1xuICAgIHQuX2EuWihlKSwgbWEodCkuUW8oZSk7XG59XG5cbmZ1bmN0aW9uIEpvKHQpIHtcbiAgICB0Ll9hID0gbmV3IFpuKHtcbiAgICAgICAgZ2V0UmVtb3RlS2V5c0ZvclRhcmdldDogZSA9PiB0LnJlbW90ZVN5bmNlci5nZXRSZW1vdGVLZXlzRm9yVGFyZ2V0KGUpLFxuICAgICAgICBFdDogZSA9PiB0LmNhLmdldChlKSB8fCBudWxsXG4gICAgfSksIG1hKHQpLnN0YXJ0KCksIHQuZGEuc2EoKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHdhdGNoIHN0cmVhbSBzaG91bGQgYmUgc3RhcnRlZCBiZWNhdXNlIGl0J3MgbmVjZXNzYXJ5XG4gKiBhbmQgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkLlxuICovIGZ1bmN0aW9uIFlvKHQpIHtcbiAgICByZXR1cm4gWG8odCkgJiYgIW1hKHQpLlNvKCkgJiYgdC5jYS5zaXplID4gMDtcbn1cblxuZnVuY3Rpb24gWG8odCkge1xuICAgIHJldHVybiAwID09PSBLKHQpLmhhLnNpemU7XG59XG5cbmZ1bmN0aW9uIFpvKHQpIHtcbiAgICB0Ll9hID0gdm9pZCAwO1xufVxuXG5hc3luYyBmdW5jdGlvbiB0YSh0KSB7XG4gICAgdC5jYS5mb3JFYWNoKCgoZSwgbikgPT4ge1xuICAgICAgICB6byh0LCBlKTtcbiAgICB9KSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGVhKHQsIGUpIHtcbiAgICBabyh0KSwgXG4gICAgLy8gSWYgd2Ugc3RpbGwgbmVlZCB0aGUgd2F0Y2ggc3RyZWFtLCByZXRyeSB0aGUgY29ubmVjdGlvbi5cbiAgICBZbyh0KSA/ICh0LmRhLm9hKGUpLCBKbyh0KSkgOiBcbiAgICAvLyBObyBuZWVkIHRvIHJlc3RhcnQgd2F0Y2ggc3RyZWFtIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGFjdGl2ZSB0YXJnZXRzLlxuICAgIC8vIFRoZSBvbmxpbmUgc3RhdGUgaXMgc2V0IHRvIHVua25vd24gYmVjYXVzZSB0aGVyZSBpcyBubyBhY3RpdmUgYXR0ZW1wdFxuICAgIC8vIGF0IGVzdGFibGlzaGluZyBhIGNvbm5lY3Rpb25cbiAgICB0LmRhLnNldChcIlVua25vd25cIiAvKiBVbmtub3duICovKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbmEodCwgZSwgbikge1xuICAgIGlmIChcbiAgICAvLyBNYXJrIHRoZSBjbGllbnQgYXMgb25saW5lIHNpbmNlIHdlIGdvdCBhIG1lc3NhZ2UgZnJvbSB0aGUgc2VydmVyXG4gICAgdC5kYS5zZXQoXCJPbmxpbmVcIiAvKiBPbmxpbmUgKi8pLCBlIGluc3RhbmNlb2YgWW4gJiYgMiAvKiBSZW1vdmVkICovID09PSBlLnN0YXRlICYmIGUuY2F1c2UpIFxuICAgIC8vIFRoZXJlIHdhcyBhbiBlcnJvciBvbiBhIHRhcmdldCwgZG9uJ3Qgd2FpdCBmb3IgYSBjb25zaXN0ZW50IHNuYXBzaG90XG4gICAgLy8gdG8gcmFpc2UgZXZlbnRzXG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgXG4gICAgICAgIC8qKiBIYW5kbGVzIGFuIGVycm9yIG9uIGEgdGFyZ2V0ICovXG4gICAgICAgIGFzeW5jIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBlLmNhdXNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzIG9mIGUudGFyZ2V0SWRzKSBcbiAgICAgICAgICAgIC8vIEEgd2F0Y2hlZCB0YXJnZXQgbWlnaHQgaGF2ZSBiZWVuIHJlbW92ZWQgYWxyZWFkeS5cbiAgICAgICAgICAgIHQuY2EuaGFzKHMpICYmIChhd2FpdCB0LnJlbW90ZVN5bmNlci5yZWplY3RMaXN0ZW4ocywgbiksIHQuY2EuZGVsZXRlKHMpLCB0Ll9hLnJlbW92ZVRhcmdldChzKSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gKiBBdHRlbXB0cyB0byBmaWxsIG91ciB3cml0ZSBwaXBlbGluZSB3aXRoIHdyaXRlcyBmcm9tIHRoZSBMb2NhbFN0b3JlLlxuICpcbiAqIENhbGxlZCBpbnRlcm5hbGx5IHRvIGJvb3RzdHJhcCBvciByZWZpbGwgdGhlIHdyaXRlIHBpcGVsaW5lIGFuZCBieVxuICogU3luY0VuZ2luZSB3aGVuZXZlciB0aGVyZSBhcmUgbmV3IG11dGF0aW9ucyB0byBwcm9jZXNzLlxuICpcbiAqIFN0YXJ0cyB0aGUgd3JpdGUgc3RyZWFtIGlmIG5lY2Vzc2FyeS5cbiAqLyAodCwgZSk7XG4gICAgfSBjYXRjaCAobikge1xuICAgICAgICBPKFwiUmVtb3RlU3RvcmVcIiwgXCJGYWlsZWQgdG8gcmVtb3ZlIHRhcmdldHMgJXM6ICVzIFwiLCBlLnRhcmdldElkcy5qb2luKFwiLFwiKSwgbiksIFxuICAgICAgICBhd2FpdCBzYSh0LCBuKTtcbiAgICB9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBIbiA/IHQuX2EuYXQoZSkgOiBlIGluc3RhbmNlb2YgSm4gPyB0Ll9hLl90KGUpIDogdC5fYS5odChlKSwgXG4gICAgIW4uaXNFcXVhbChjdC5taW4oKSkpIHRyeSB7XG4gICAgICAgIGNvbnN0IGUgPSBhd2FpdCBIcih0LmxvY2FsU3RvcmUpO1xuICAgICAgICBuLmNvbXBhcmVUbyhlKSA+PSAwICYmIFxuICAgICAgICAvLyBXZSBoYXZlIHJlY2VpdmVkIGEgdGFyZ2V0IGNoYW5nZSB3aXRoIGEgZ2xvYmFsIHNuYXBzaG90IGlmIHRoZSBzbmFwc2hvdFxuICAgICAgICAvLyB2ZXJzaW9uIGlzIG5vdCBlcXVhbCB0byBTbmFwc2hvdFZlcnNpb24ubWluKCkuXG4gICAgICAgIGF3YWl0IFxuICAgICAgICAvKipcbiAqIFRha2VzIGEgYmF0Y2ggb2YgY2hhbmdlcyBmcm9tIHRoZSBEYXRhc3RvcmUsIHJlcGFja2FnZXMgdGhlbSBhcyBhXG4gKiBSZW1vdGVFdmVudCwgYW5kIHBhc3NlcyB0aGF0IG9uIHRvIHRoZSBsaXN0ZW5lciwgd2hpY2ggaXMgdHlwaWNhbGx5IHRoZVxuICogU3luY0VuZ2luZS5cbiAqL1xuICAgICAgICBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdC5fYS55dChlKTtcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBpbi1tZW1vcnkgcmVzdW1lIHRva2Vucy4gTG9jYWxTdG9yZSB3aWxsIHVwZGF0ZSB0aGVcbiAgICAgICAgICAgIC8vIHBlcnNpc3RlbnQgdmlldyBvZiB0aGVzZSB3aGVuIGFwcGx5aW5nIHRoZSBjb21wbGV0ZWQgUmVtb3RlRXZlbnQuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi50YXJnZXRDaGFuZ2VzLmZvckVhY2goKChuLCBzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG4ucmVzdW1lVG9rZW4uYXBwcm94aW1hdGVCeXRlU2l6ZSgpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdC5jYS5nZXQocyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEEgd2F0Y2hlZCB0YXJnZXQgbWlnaHQgaGF2ZSBiZWVuIHJlbW92ZWQgYWxyZWFkeS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICYmIHQuY2Euc2V0KHMsIGkud2l0aFJlc3VtZVRva2VuKG4ucmVzdW1lVG9rZW4sIGUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSksIFxuICAgICAgICAgICAgLy8gUmUtZXN0YWJsaXNoIGxpc3RlbnMgZm9yIHRoZSB0YXJnZXRzIHRoYXQgaGF2ZSBiZWVuIGludmFsaWRhdGVkIGJ5XG4gICAgICAgICAgICAvLyBleGlzdGVuY2UgZmlsdGVyIG1pc21hdGNoZXMuXG4gICAgICAgICAgICBuLnRhcmdldE1pc21hdGNoZXMuZm9yRWFjaCgoZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbiA9IHQuY2EuZ2V0KGUpO1xuICAgICAgICAgICAgICAgIGlmICghbikgXG4gICAgICAgICAgICAgICAgLy8gQSB3YXRjaGVkIHRhcmdldCBtaWdodCBoYXZlIGJlZW4gcmVtb3ZlZCBhbHJlYWR5LlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgcmVzdW1lIHRva2VuIGZvciB0aGUgdGFyZ2V0LCBzaW5jZSB3ZSdyZSBpbiBhIGtub3duIG1pc21hdGNoXG4gICAgICAgICAgICAgICAgLy8gc3RhdGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuY2Euc2V0KGUsIG4ud2l0aFJlc3VtZVRva2VuKHB0LkVNUFRZX0JZVEVfU1RSSU5HLCBuLnNuYXBzaG90VmVyc2lvbikpLCBcbiAgICAgICAgICAgICAgICAvLyBDYXVzZSBhIGhhcmQgcmVzZXQgYnkgdW53YXRjaGluZyBhbmQgcmV3YXRjaGluZyBpbW1lZGlhdGVseSwgYnV0XG4gICAgICAgICAgICAgICAgLy8gZGVsaWJlcmF0ZWx5IGRvbid0IHNlbmQgYSByZXN1bWUgdG9rZW4gc28gdGhhdCB3ZSBnZXQgYSBmdWxsIHVwZGF0ZS5cbiAgICAgICAgICAgICAgICBIbyh0LCBlKTtcbiAgICAgICAgICAgICAgICAvLyBNYXJrIHRoZSB0YXJnZXQgd2Ugc2VuZCBhcyBiZWluZyBvbiBiZWhhbGYgb2YgYW4gZXhpc3RlbmNlIGZpbHRlclxuICAgICAgICAgICAgICAgIC8vIG1pc21hdGNoLCBidXQgZG9uJ3QgYWN0dWFsbHkgcmV0YWluIHRoYXQgaW4gbGlzdGVuVGFyZ2V0cy4gVGhpcyBlbnN1cmVzXG4gICAgICAgICAgICAgICAgLy8gdGhhdCB3ZSBmbGFnIHRoZSBmaXJzdCByZS1saXN0ZW4gdGhpcyB3YXkgd2l0aG91dCBpbXBhY3RpbmcgZnV0dXJlXG4gICAgICAgICAgICAgICAgLy8gbGlzdGVucyBvZiB0aGlzIHRhcmdldCAodGhhdCBtaWdodCBoYXBwZW4gZS5nLiBvbiByZWNvbm5lY3QpLlxuICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBuZXcgQWkobi50YXJnZXQsIGUsIDEgLyogRXhpc3RlbmNlRmlsdGVyTWlzbWF0Y2ggKi8gLCBuLnNlcXVlbmNlTnVtYmVyKTtcbiAgICAgICAgICAgICAgICB6byh0LCBzKTtcbiAgICAgICAgICAgIH0pKSwgdC5yZW1vdGVTeW5jZXIuYXBwbHlSZW1vdGVFdmVudChuKTtcbiAgICAgICAgfSh0LCBuKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIE8oXCJSZW1vdGVTdG9yZVwiLCBcIkZhaWxlZCB0byByYWlzZSBzbmFwc2hvdDpcIiwgZSksIGF3YWl0IHNhKHQsIGUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZWNvdmVyeSBsb2dpYyBmb3IgSW5kZXhlZERCIGVycm9ycyB0aGF0IHRha2VzIHRoZSBuZXR3b3JrIG9mZmxpbmUgdW50aWxcbiAqIGBvcGAgc3VjY2VlZHMuIFJldHJpZXMgYXJlIHNjaGVkdWxlZCB3aXRoIGJhY2tvZmYgdXNpbmdcbiAqIGBlbnF1ZXVlUmV0cnlhYmxlKClgLiBJZiBgb3AoKWAgaXMgbm90IHByb3ZpZGVkLCBJbmRleGVkREIgYWNjZXNzIGlzXG4gKiB2YWxpZGF0ZWQgdmlhIGEgZ2VuZXJpYyBvcGVyYXRpb24uXG4gKlxuICogVGhlIHJldHVybmVkIFByb21pc2UgaXMgcmVzb2x2ZWQgb25jZSB0aGUgbmV0d29yayBpcyBkaXNhYmxlZCBhbmQgYmVmb3JlXG4gKiBhbnkgcmV0cnkgYXR0ZW1wdC5cbiAqLyBhc3luYyBmdW5jdGlvbiBzYSh0LCBlLCBuKSB7XG4gICAgaWYgKCFkaShlKSkgdGhyb3cgZTtcbiAgICB0LmhhLmFkZCgxIC8qIEluZGV4ZWREYkZhaWxlZCAqLyksIFxuICAgIC8vIERpc2FibGUgbmV0d29yayBhbmQgcmFpc2Ugb2ZmbGluZSBzbmFwc2hvdHNcbiAgICBhd2FpdCBRbyh0KSwgdC5kYS5zZXQoXCJPZmZsaW5lXCIgLyogT2ZmbGluZSAqLyksIG4gfHwgKFxuICAgIC8vIFVzZSBhIHNpbXBsZSByZWFkIG9wZXJhdGlvbiB0byBkZXRlcm1pbmUgaWYgSW5kZXhlZERCIHJlY292ZXJlZC5cbiAgICAvLyBJZGVhbGx5LCB3ZSB3b3VsZCBleHBvc2UgYSBoZWFsdGggY2hlY2sgZGlyZWN0bHkgb24gU2ltcGxlRGIsIGJ1dFxuICAgIC8vIFJlbW90ZVN0b3JlIG9ubHkgaGFzIGFjY2VzcyB0byBwZXJzaXN0ZW5jZSB0aHJvdWdoIExvY2FsU3RvcmUuXG4gICAgbiA9ICgpID0+IEhyKHQubG9jYWxTdG9yZSkpLCBcbiAgICAvLyBQcm9iZSBJbmRleGVkREIgcGVyaW9kaWNhbGx5IGFuZCByZS1lbmFibGUgbmV0d29ya1xuICAgIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlUmV0cnlhYmxlKChhc3luYyAoKSA9PiB7XG4gICAgICAgIE8oXCJSZW1vdGVTdG9yZVwiLCBcIlJldHJ5aW5nIEluZGV4ZWREQiBhY2Nlc3NcIiksIGF3YWl0IG4oKSwgdC5oYS5kZWxldGUoMSAvKiBJbmRleGVkRGJGYWlsZWQgKi8pLCBcbiAgICAgICAgYXdhaXQgR28odCk7XG4gICAgfSkpO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIGBvcGAuIElmIGBvcGAgZmFpbHMsIHRha2VzIHRoZSBuZXR3b3JrIG9mZmxpbmUgdW50aWwgYG9wYFxuICogc3VjY2VlZHMuIFJldHVybnMgYWZ0ZXIgdGhlIGZpcnN0IGF0dGVtcHQuXG4gKi8gZnVuY3Rpb24gaWEodCwgZSkge1xuICAgIHJldHVybiBlKCkuY2F0Y2goKG4gPT4gc2EodCwgbiwgZSkpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmEodCkge1xuICAgIGNvbnN0IGUgPSBLKHQpLCBuID0gZ2EoZSk7XG4gICAgbGV0IHMgPSBlLnVhLmxlbmd0aCA+IDAgPyBlLnVhW2UudWEubGVuZ3RoIC0gMV0uYmF0Y2hJZCA6IC0xO1xuICAgIGZvciAoO29hKGUpOyApIHRyeSB7XG4gICAgICAgIGNvbnN0IHQgPSBhd2FpdCBYcihlLmxvY2FsU3RvcmUsIHMpO1xuICAgICAgICBpZiAobnVsbCA9PT0gdCkge1xuICAgICAgICAgICAgMCA9PT0gZS51YS5sZW5ndGggJiYgbi5ObygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcyA9IHQuYmF0Y2hJZCwgYWEoZSwgdCk7XG4gICAgfSBjYXRjaCAodCkge1xuICAgICAgICBhd2FpdCBzYShlLCB0KTtcbiAgICB9XG4gICAgdWEoZSkgJiYgY2EoZSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHdlIGNhbiBhZGQgdG8gdGhlIHdyaXRlIHBpcGVsaW5lIChpLmUuIHRoZSBuZXR3b3JrIGlzXG4gKiBlbmFibGVkIGFuZCB0aGUgd3JpdGUgcGlwZWxpbmUgaXMgbm90IGZ1bGwpLlxuICovIGZ1bmN0aW9uIG9hKHQpIHtcbiAgICByZXR1cm4gWG8odCkgJiYgdC51YS5sZW5ndGggPCAxMDtcbn1cblxuLyoqXG4gKiBRdWV1ZXMgYWRkaXRpb25hbCB3cml0ZXMgdG8gYmUgc2VudCB0byB0aGUgd3JpdGUgc3RyZWFtLCBzZW5kaW5nIHRoZW1cbiAqIGltbWVkaWF0ZWx5IGlmIHRoZSB3cml0ZSBzdHJlYW0gaXMgZXN0YWJsaXNoZWQuXG4gKi8gZnVuY3Rpb24gYWEodCwgZSkge1xuICAgIHQudWEucHVzaChlKTtcbiAgICBjb25zdCBuID0gZ2EodCk7XG4gICAgbi5EbygpICYmIG4uV28gJiYgbi56byhlLm11dGF0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIHVhKHQpIHtcbiAgICByZXR1cm4gWG8odCkgJiYgIWdhKHQpLlNvKCkgJiYgdC51YS5sZW5ndGggPiAwO1xufVxuXG5mdW5jdGlvbiBjYSh0KSB7XG4gICAgZ2EodCkuc3RhcnQoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGEodCkge1xuICAgIGdhKHQpLllvKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxhKHQpIHtcbiAgICBjb25zdCBlID0gZ2EodCk7XG4gICAgLy8gU2VuZCB0aGUgd3JpdGUgcGlwZWxpbmUgbm93IHRoYXQgdGhlIHN0cmVhbSBpcyBlc3RhYmxpc2hlZC5cbiAgICAgICAgZm9yIChjb25zdCBuIG9mIHQudWEpIGUuem8obi5tdXRhdGlvbnMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmYSh0LCBlLCBuKSB7XG4gICAgY29uc3QgcyA9IHQudWEuc2hpZnQoKSwgaSA9IFRpLmZyb20ocywgZSwgbik7XG4gICAgYXdhaXQgaWEodCwgKCgpID0+IHQucmVtb3RlU3luY2VyLmFwcGx5U3VjY2Vzc2Z1bFdyaXRlKGkpKSksIFxuICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3aXRoIHRoZSBjb21wbGV0aW9uIG9mIHRoaXMgbXV0YXRpb24gYW5vdGhlclxuICAgIC8vIHNsb3QgaGFzIGZyZWVkIHVwLlxuICAgIGF3YWl0IHJhKHQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkYSh0LCBlKSB7XG4gICAgLy8gSWYgdGhlIHdyaXRlIHN0cmVhbSBjbG9zZWQgYWZ0ZXIgdGhlIHdyaXRlIGhhbmRzaGFrZSBjb21wbGV0ZXMsIGEgd3JpdGVcbiAgICAvLyBvcGVyYXRpb24gZmFpbGVkIGFuZCB3ZSBmYWlsIHRoZSBwZW5kaW5nIG9wZXJhdGlvbi5cbiAgICBlICYmIGdhKHQpLldvICYmIFxuICAgIC8vIFRoaXMgZXJyb3IgYWZmZWN0cyB0aGUgYWN0dWFsIHdyaXRlLlxuICAgIGF3YWl0IGFzeW5jIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgLy8gT25seSBoYW5kbGUgcGVybWFuZW50IGVycm9ycyBoZXJlLiBJZiBpdCdzIHRyYW5zaWVudCwganVzdCBsZXQgdGhlIHJldHJ5XG4gICAgICAgIC8vIGxvZ2ljIGtpY2sgaW4uXG4gICAgICAgIGlmIChuID0gZS5jb2RlLCB2bihuKSAmJiBuICE9PSBHLkFCT1JURUQpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgd2FzIGEgcGVybWFuZW50IGVycm9yLCB0aGUgcmVxdWVzdCBpdHNlbGYgd2FzIHRoZSBwcm9ibGVtXG4gICAgICAgICAgICAvLyBzbyBpdCdzIG5vdCBnb2luZyB0byBzdWNjZWVkIGlmIHdlIHJlc2VuZCBpdC5cbiAgICAgICAgICAgIGNvbnN0IG4gPSB0LnVhLnNoaWZ0KCk7XG4gICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UgaXQncyBhbHNvIHVubGlrZWx5IHRoYXQgdGhlIHNlcnZlciBpdHNlbGYgaXMgbWVsdGluZ1xuICAgICAgICAgICAgLy8gZG93biAtLSB0aGlzIHdhcyBqdXN0IGEgYmFkIHJlcXVlc3Qgc28gaW5oaWJpdCBiYWNrb2ZmIG9uIHRoZSBuZXh0XG4gICAgICAgICAgICAvLyByZXN0YXJ0LlxuICAgICAgICAgICAgICAgICAgICAgICAgZ2EodCkueG8oKSwgYXdhaXQgaWEodCwgKCgpID0+IHQucmVtb3RlU3luY2VyLnJlamVjdEZhaWxlZFdyaXRlKG4uYmF0Y2hJZCwgZSkpKSwgXG4gICAgICAgICAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgd2l0aCB0aGUgY29tcGxldGlvbiBvZiB0aGlzIG11dGF0aW9uXG4gICAgICAgICAgICAvLyBhbm90aGVyIHNsb3QgaGFzIGZyZWVkIHVwLlxuICAgICAgICAgICAgYXdhaXQgcmEodCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG47XG4gICAgfSh0LCBlKSwgXG4gICAgLy8gVGhlIHdyaXRlIHN0cmVhbSBtaWdodCBoYXZlIGJlZW4gc3RhcnRlZCBieSByZWZpbGxpbmcgdGhlIHdyaXRlXG4gICAgLy8gcGlwZWxpbmUgZm9yIGZhaWxlZCB3cml0ZXNcbiAgICB1YSh0KSAmJiBjYSh0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX2EodCwgZSkge1xuICAgIGNvbnN0IG4gPSBLKHQpO1xuICAgIG4uYXN5bmNRdWV1ZS52ZXJpZnlPcGVyYXRpb25JblByb2dyZXNzKCksIE8oXCJSZW1vdGVTdG9yZVwiLCBcIlJlbW90ZVN0b3JlIHJlY2VpdmVkIG5ldyBjcmVkZW50aWFsc1wiKTtcbiAgICBjb25zdCBzID0gWG8obik7XG4gICAgLy8gVGVhciBkb3duIGFuZCByZS1jcmVhdGUgb3VyIG5ldHdvcmsgc3RyZWFtcy4gVGhpcyB3aWxsIGVuc3VyZSB3ZSBnZXQgYVxuICAgIC8vIGZyZXNoIGF1dGggdG9rZW4gZm9yIHRoZSBuZXcgdXNlciBhbmQgcmUtZmlsbCB0aGUgd3JpdGUgcGlwZWxpbmUgd2l0aFxuICAgIC8vIG5ldyBtdXRhdGlvbnMgZnJvbSB0aGUgTG9jYWxTdG9yZSAoc2luY2UgbXV0YXRpb25zIGFyZSBwZXItdXNlcikuXG4gICAgICAgIG4uaGEuYWRkKDMgLyogQ3JlZGVudGlhbENoYW5nZSAqLyksIGF3YWl0IFFvKG4pLCBzICYmIFxuICAgIC8vIERvbid0IHNldCB0aGUgbmV0d29yayBzdGF0dXMgdG8gVW5rbm93biBpZiB3ZSBhcmUgb2ZmbGluZS5cbiAgICBuLmRhLnNldChcIlVua25vd25cIiAvKiBVbmtub3duICovKSwgYXdhaXQgbi5yZW1vdGVTeW5jZXIuaGFuZGxlQ3JlZGVudGlhbENoYW5nZShlKSwgXG4gICAgbi5oYS5kZWxldGUoMyAvKiBDcmVkZW50aWFsQ2hhbmdlICovKSwgYXdhaXQgR28obik7XG59XG5cbi8qKlxuICogVG9nZ2xlcyB0aGUgbmV0d29yayBzdGF0ZSB3aGVuIHRoZSBjbGllbnQgZ2FpbnMgb3IgbG9zZXMgaXRzIHByaW1hcnkgbGVhc2UuXG4gKi8gYXN5bmMgZnVuY3Rpb24gd2EodCwgZSkge1xuICAgIGNvbnN0IG4gPSBLKHQpO1xuICAgIGUgPyAobi5oYS5kZWxldGUoMiAvKiBJc1NlY29uZGFyeSAqLyksIGF3YWl0IEdvKG4pKSA6IGUgfHwgKG4uaGEuYWRkKDIgLyogSXNTZWNvbmRhcnkgKi8pLCBcbiAgICBhd2FpdCBRbyhuKSwgbi5kYS5zZXQoXCJVbmtub3duXCIgLyogVW5rbm93biAqLykpO1xufVxuXG4vKipcbiAqIElmIG5vdCB5ZXQgaW5pdGlhbGl6ZWQsIHJlZ2lzdGVycyB0aGUgV2F0Y2hTdHJlYW0gYW5kIGl0cyBuZXR3b3JrIHN0YXRlXG4gKiBjYWxsYmFjayB3aXRoIGByZW1vdGVTdG9yZUltcGxgLiBSZXR1cm5zIHRoZSBleGlzdGluZyBzdHJlYW0gaWYgb25lIGlzXG4gKiBhbHJlYWR5IGF2YWlsYWJsZS5cbiAqXG4gKiBQT1JUSU5HIE5PVEU6IE9uIGlPUyBhbmQgQW5kcm9pZCwgdGhlIFdhdGNoU3RyZWFtIGdldHMgcmVnaXN0ZXJlZCBvbiBzdGFydHVwLlxuICogVGhpcyBpcyBub3QgZG9uZSBvbiBXZWIgdG8gYWxsb3cgaXQgdG8gYmUgdHJlZS1zaGFrZW4uXG4gKi8gZnVuY3Rpb24gbWEodCkge1xuICAgIHJldHVybiB0LndhIHx8IChcbiAgICAvLyBDcmVhdGUgc3RyZWFtIChidXQgbm90ZSB0aGF0IGl0IGlzIG5vdCBzdGFydGVkIHlldCkuXG4gICAgdC53YSA9IGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgY29uc3QgcyA9IEsodCk7XG4gICAgICAgIHJldHVybiBzLlpvKCksIG5ldyBCbyhlLCBzLlJvLCBzLmF1dGhDcmVkZW50aWFscywgcy5hcHBDaGVja0NyZWRlbnRpYWxzLCBzLk0sIG4pO1xuICAgIH1cbiAgICAvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyAodC5kYXRhc3RvcmUsIHQuYXN5bmNRdWV1ZSwge1xuICAgICAgICBXcjogdGEuYmluZChudWxsLCB0KSxcbiAgICAgICAgSHI6IGVhLmJpbmQobnVsbCwgdCksXG4gICAgICAgIEtvOiBuYS5iaW5kKG51bGwsIHQpXG4gICAgfSksIHQubGEucHVzaCgoYXN5bmMgZSA9PiB7XG4gICAgICAgIGUgPyAodC53YS54bygpLCBZbyh0KSA/IEpvKHQpIDogdC5kYS5zZXQoXCJVbmtub3duXCIgLyogVW5rbm93biAqLykpIDogKGF3YWl0IHQud2Euc3RvcCgpLCBcbiAgICAgICAgWm8odCkpO1xuICAgIH0pKSksIHQud2E7XG59XG5cbi8qKlxuICogSWYgbm90IHlldCBpbml0aWFsaXplZCwgcmVnaXN0ZXJzIHRoZSBXcml0ZVN0cmVhbSBhbmQgaXRzIG5ldHdvcmsgc3RhdGVcbiAqIGNhbGxiYWNrIHdpdGggYHJlbW90ZVN0b3JlSW1wbGAuIFJldHVybnMgdGhlIGV4aXN0aW5nIHN0cmVhbSBpZiBvbmUgaXNcbiAqIGFscmVhZHkgYXZhaWxhYmxlLlxuICpcbiAqIFBPUlRJTkcgTk9URTogT24gaU9TIGFuZCBBbmRyb2lkLCB0aGUgV3JpdGVTdHJlYW0gZ2V0cyByZWdpc3RlcmVkIG9uIHN0YXJ0dXAuXG4gKiBUaGlzIGlzIG5vdCBkb25lIG9uIFdlYiB0byBhbGxvdyBpdCB0byBiZSB0cmVlLXNoYWtlbi5cbiAqLyBmdW5jdGlvbiBnYSh0KSB7XG4gICAgcmV0dXJuIHQubWEgfHwgKFxuICAgIC8vIENyZWF0ZSBzdHJlYW0gKGJ1dCBub3RlIHRoYXQgaXQgaXMgbm90IHN0YXJ0ZWQgeWV0KS5cbiAgICB0Lm1hID0gZnVuY3Rpb24odCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gSyh0KTtcbiAgICAgICAgcmV0dXJuIHMuWm8oKSwgbmV3IExvKGUsIHMuUm8sIHMuYXV0aENyZWRlbnRpYWxzLCBzLmFwcENoZWNrQ3JlZGVudGlhbHMsIHMuTSwgbik7XG4gICAgfSh0LmRhdGFzdG9yZSwgdC5hc3luY1F1ZXVlLCB7XG4gICAgICAgIFdyOiBoYS5iaW5kKG51bGwsIHQpLFxuICAgICAgICBIcjogZGEuYmluZChudWxsLCB0KSxcbiAgICAgICAgSm86IGxhLmJpbmQobnVsbCwgdCksXG4gICAgICAgIEhvOiBmYS5iaW5kKG51bGwsIHQpXG4gICAgfSksIHQubGEucHVzaCgoYXN5bmMgZSA9PiB7XG4gICAgICAgIGUgPyAodC5tYS54bygpLCBcbiAgICAgICAgLy8gVGhpcyB3aWxsIHN0YXJ0IHRoZSB3cml0ZSBzdHJlYW0gaWYgbmVjZXNzYXJ5LlxuICAgICAgICBhd2FpdCByYSh0KSkgOiAoYXdhaXQgdC5tYS5zdG9wKCksIHQudWEubGVuZ3RoID4gMCAmJiAoTyhcIlJlbW90ZVN0b3JlXCIsIGBTdG9wcGluZyB3cml0ZSBzdHJlYW0gd2l0aCAke3QudWEubGVuZ3RofSBwZW5kaW5nIHdyaXRlc2ApLCBcbiAgICAgICAgdC51YSA9IFtdKSk7XG4gICAgfSkpKSwgdC5tYTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogUmVwcmVzZW50cyBhbiBvcGVyYXRpb24gc2NoZWR1bGVkIHRvIGJlIHJ1biBpbiB0aGUgZnV0dXJlIG9uIGFuIEFzeW5jUXVldWUuXG4gKlxuICogSXQgaXMgY3JlYXRlZCB2aWEgRGVsYXllZE9wZXJhdGlvbi5jcmVhdGVBbmRTY2hlZHVsZSgpLlxuICpcbiAqIFN1cHBvcnRzIGNhbmNlbGxhdGlvbiAodmlhIGNhbmNlbCgpKSBhbmQgZWFybHkgZXhlY3V0aW9uICh2aWEgc2tpcERlbGF5KCkpLlxuICpcbiAqIE5vdGU6IFdlIGltcGxlbWVudCBgUHJvbWlzZUxpa2VgIGluc3RlYWQgb2YgYFByb21pc2VgLCBhcyB0aGUgYFByb21pc2VgIHR5cGVcbiAqIGluIG5ld2VyIHZlcnNpb25zIG9mIFR5cGVTY3JpcHQgZGVmaW5lcyBgZmluYWxseWAsIHdoaWNoIGlzIG5vdCBhdmFpbGFibGUgaW5cbiAqIElFLlxuICovXG5jbGFzcyB5YSB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgcywgaSkge1xuICAgICAgICB0aGlzLmFzeW5jUXVldWUgPSB0LCB0aGlzLnRpbWVySWQgPSBlLCB0aGlzLnRhcmdldFRpbWVNcyA9IG4sIHRoaXMub3AgPSBzLCB0aGlzLnJlbW92YWxDYWxsYmFjayA9IGksIFxuICAgICAgICB0aGlzLmRlZmVycmVkID0gbmV3IGosIHRoaXMudGhlbiA9IHRoaXMuZGVmZXJyZWQucHJvbWlzZS50aGVuLmJpbmQodGhpcy5kZWZlcnJlZC5wcm9taXNlKSwgXG4gICAgICAgIC8vIEl0J3Mgbm9ybWFsIGZvciB0aGUgZGVmZXJyZWQgcHJvbWlzZSB0byBiZSBjYW5jZWxlZCAoZHVlIHRvIGNhbmNlbGxhdGlvbilcbiAgICAgICAgLy8gYW5kIHNvIHdlIGF0dGFjaCBhIGR1bW15IGNhdGNoIGNhbGxiYWNrIHRvIGF2b2lkXG4gICAgICAgIC8vICdVbmhhbmRsZWRQcm9taXNlUmVqZWN0aW9uV2FybmluZycgbG9nIHNwYW0uXG4gICAgICAgIHRoaXMuZGVmZXJyZWQucHJvbWlzZS5jYXRjaCgodCA9PiB7fSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgRGVsYXllZE9wZXJhdGlvbiB0aGF0IGhhcyBiZWVuIHNjaGVkdWxlZCB0byBiZVxuICAgICAqIGV4ZWN1dGVkIG9uIHRoZSBwcm92aWRlZCBhc3luY1F1ZXVlIGFmdGVyIHRoZSBwcm92aWRlZCBkZWxheU1zLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFzeW5jUXVldWUgLSBUaGUgcXVldWUgdG8gc2NoZWR1bGUgdGhlIG9wZXJhdGlvbiBvbi5cbiAgICAgKiBAcGFyYW0gaWQgLSBBIFRpbWVyIElEIGlkZW50aWZ5aW5nIHRoZSB0eXBlIG9mIG9wZXJhdGlvbiB0aGlzIGlzLlxuICAgICAqIEBwYXJhbSBkZWxheU1zIC0gVGhlIGRlbGF5IChtcykgYmVmb3JlIHRoZSBvcGVyYXRpb24gc2hvdWxkIGJlIHNjaGVkdWxlZC5cbiAgICAgKiBAcGFyYW0gb3AgLSBUaGUgb3BlcmF0aW9uIHRvIHJ1bi5cbiAgICAgKiBAcGFyYW0gcmVtb3ZhbENhbGxiYWNrIC0gQSBjYWxsYmFjayB0byBiZSBjYWxsZWQgc3luY2hyb25vdXNseSBvbmNlIHRoZVxuICAgICAqICAgb3BlcmF0aW9uIGlzIGV4ZWN1dGVkIG9yIGNhbmNlbGVkLCBub3RpZnlpbmcgdGhlIEFzeW5jUXVldWUgdG8gcmVtb3ZlIGl0XG4gICAgICogICBmcm9tIGl0cyBkZWxheWVkT3BlcmF0aW9ucyBsaXN0LlxuICAgICAqICAgUE9SVElORyBOT1RFOiBUaGlzIGV4aXN0cyB0byBwcmV2ZW50IG1ha2luZyByZW1vdmVEZWxheWVkT3BlcmF0aW9uKCkgYW5kXG4gICAgICogICB0aGUgRGVsYXllZE9wZXJhdGlvbiBjbGFzcyBwdWJsaWMuXG4gICAgICovICAgIHN0YXRpYyBjcmVhdGVBbmRTY2hlZHVsZSh0LCBlLCBuLCBzLCBpKSB7XG4gICAgICAgIGNvbnN0IHIgPSBEYXRlLm5vdygpICsgbiwgbyA9IG5ldyB5YSh0LCBlLCByLCBzLCBpKTtcbiAgICAgICAgcmV0dXJuIG8uc3RhcnQobiksIG87XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXJ0cyB0aGUgdGltZXIuIFRoaXMgaXMgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGNvbnN0cnVjdGlvbiBieVxuICAgICAqIGNyZWF0ZUFuZFNjaGVkdWxlKCkuXG4gICAgICovICAgIHN0YXJ0KHQpIHtcbiAgICAgICAgdGhpcy50aW1lckhhbmRsZSA9IHNldFRpbWVvdXQoKCgpID0+IHRoaXMuaGFuZGxlRGVsYXlFbGFwc2VkKCkpLCB0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUXVldWVzIHRoZSBvcGVyYXRpb24gdG8gcnVuIGltbWVkaWF0ZWx5IChpZiBpdCBoYXNuJ3QgYWxyZWFkeSBiZWVuIHJ1biBvclxuICAgICAqIGNhbmNlbGVkKS5cbiAgICAgKi8gICAgc2tpcERlbGF5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVEZWxheUVsYXBzZWQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FuY2VscyB0aGUgb3BlcmF0aW9uIGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgb3IgY2FuY2VsZWQuIFRoZVxuICAgICAqIHByb21pc2Ugd2lsbCBiZSByZWplY3RlZC5cbiAgICAgKlxuICAgICAqIEFzIGxvbmcgYXMgdGhlIG9wZXJhdGlvbiBoYXMgbm90IHlldCBiZWVuIHJ1biwgY2FsbGluZyBjYW5jZWwoKSBwcm92aWRlcyBhXG4gICAgICogZ3VhcmFudGVlIHRoYXQgdGhlIG9wZXJhdGlvbiB3aWxsIG5vdCBiZSBydW4uXG4gICAgICovICAgIGNhbmNlbCh0KSB7XG4gICAgICAgIG51bGwgIT09IHRoaXMudGltZXJIYW5kbGUgJiYgKHRoaXMuY2xlYXJUaW1lb3V0KCksIHRoaXMuZGVmZXJyZWQucmVqZWN0KG5ldyBRKEcuQ0FOQ0VMTEVELCBcIk9wZXJhdGlvbiBjYW5jZWxsZWRcIiArICh0ID8gXCI6IFwiICsgdCA6IFwiXCIpKSkpO1xuICAgIH1cbiAgICBoYW5kbGVEZWxheUVsYXBzZWQoKSB7XG4gICAgICAgIHRoaXMuYXN5bmNRdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0KCgoKSA9PiBudWxsICE9PSB0aGlzLnRpbWVySGFuZGxlID8gKHRoaXMuY2xlYXJUaW1lb3V0KCksIFxuICAgICAgICB0aGlzLm9wKCkudGhlbigodCA9PiB0aGlzLmRlZmVycmVkLnJlc29sdmUodCkpKSkgOiBQcm9taXNlLnJlc29sdmUoKSkpO1xuICAgIH1cbiAgICBjbGVhclRpbWVvdXQoKSB7XG4gICAgICAgIG51bGwgIT09IHRoaXMudGltZXJIYW5kbGUgJiYgKHRoaXMucmVtb3ZhbENhbGxiYWNrKHRoaXMpLCBjbGVhclRpbWVvdXQodGhpcy50aW1lckhhbmRsZSksIFxuICAgICAgICB0aGlzLnRpbWVySGFuZGxlID0gbnVsbCk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBGaXJlc3RvcmVFcnJvciB0aGF0IGNhbiBiZSBzdXJmYWNlZCB0byB0aGUgdXNlciBpZiB0aGUgcHJvdmlkZWRcbiAqIGVycm9yIGlzIGFuIEluZGV4ZWREYlRyYW5zYWN0aW9uRXJyb3IuIFJlLXRocm93cyB0aGUgZXJyb3Igb3RoZXJ3aXNlLlxuICovIGZ1bmN0aW9uIHBhKHQsIGUpIHtcbiAgICBpZiAoJChcIkFzeW5jUXVldWVcIiwgYCR7ZX06ICR7dH1gKSwgZGkodCkpIHJldHVybiBuZXcgUShHLlVOQVZBSUxBQkxFLCBgJHtlfTogJHt0fWApO1xuICAgIHRocm93IHQ7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIERvY3VtZW50U2V0IGlzIGFuIGltbXV0YWJsZSAoY29weS1vbi13cml0ZSkgY29sbGVjdGlvbiB0aGF0IGhvbGRzIGRvY3VtZW50c1xuICogaW4gb3JkZXIgc3BlY2lmaWVkIGJ5IHRoZSBwcm92aWRlZCBjb21wYXJhdG9yLiBXZSBhbHdheXMgYWRkIGEgZG9jdW1lbnQga2V5XG4gKiBjb21wYXJhdG9yIG9uIHRvcCBvZiB3aGF0IGlzIHByb3ZpZGVkIHRvIGd1YXJhbnRlZSBkb2N1bWVudCBlcXVhbGl0eSBiYXNlZCBvblxuICogdGhlIGtleS5cbiAqLyBjbGFzcyBJYSB7XG4gICAgLyoqIFRoZSBkZWZhdWx0IG9yZGVyaW5nIGlzIGJ5IGtleSBpZiB0aGUgY29tcGFyYXRvciBpcyBvbWl0dGVkICovXG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAvLyBXZSBhcmUgYWRkaW5nIGRvY3VtZW50IGtleSBjb21wYXJhdG9yIHRvIHRoZSBlbmQgYXMgaXQncyB0aGUgb25seVxuICAgICAgICAvLyBndWFyYW50ZWVkIHVuaXF1ZSBwcm9wZXJ0eSBvZiBhIGRvY3VtZW50LlxuICAgICAgICB0aGlzLmNvbXBhcmF0b3IgPSB0ID8gKGUsIG4pID0+IHQoZSwgbikgfHwgeHQuY29tcGFyYXRvcihlLmtleSwgbi5rZXkpIDogKHQsIGUpID0+IHh0LmNvbXBhcmF0b3IodC5rZXksIGUua2V5KSwgXG4gICAgICAgIHRoaXMua2V5ZWRNYXAgPSBMbigpLCB0aGlzLnNvcnRlZFNldCA9IG5ldyBDbih0aGlzLmNvbXBhcmF0b3IpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IGNvcHkgb2YgdGhlIGV4aXN0aW5nIERvY3VtZW50U2V0LCB1c2luZyB0aGUgc2FtZVxuICAgICAqIGNvbXBhcmF0b3IuXG4gICAgICovICAgIHN0YXRpYyBlbXB0eVNldCh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgSWEodC5jb21wYXJhdG9yKTtcbiAgICB9XG4gICAgaGFzKHQpIHtcbiAgICAgICAgcmV0dXJuIG51bGwgIT0gdGhpcy5rZXllZE1hcC5nZXQodCk7XG4gICAgfVxuICAgIGdldCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmtleWVkTWFwLmdldCh0KTtcbiAgICB9XG4gICAgZmlyc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvcnRlZFNldC5taW5LZXkoKTtcbiAgICB9XG4gICAgbGFzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc29ydGVkU2V0Lm1heEtleSgpO1xuICAgIH1cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3J0ZWRTZXQuaXNFbXB0eSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgcHJvdmlkZWQga2V5IGluIHRoZSBkb2N1bWVudCBzZXQsIG9yIC0xIGlmIHRoZVxuICAgICAqIGRvY3VtZW50IGtleSBpcyBub3QgcHJlc2VudCBpbiB0aGUgc2V0O1xuICAgICAqLyAgICBpbmRleE9mKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMua2V5ZWRNYXAuZ2V0KHQpO1xuICAgICAgICByZXR1cm4gZSA/IHRoaXMuc29ydGVkU2V0LmluZGV4T2YoZSkgOiAtMTtcbiAgICB9XG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvcnRlZFNldC5zaXplO1xuICAgIH1cbiAgICAvKiogSXRlcmF0ZXMgZG9jdW1lbnRzIGluIG9yZGVyIGRlZmluZWQgYnkgXCJjb21wYXJhdG9yXCIgKi8gICAgZm9yRWFjaCh0KSB7XG4gICAgICAgIHRoaXMuc29ydGVkU2V0Lmlub3JkZXJUcmF2ZXJzYWwoKChlLCBuKSA9PiAodChlKSwgITEpKSk7XG4gICAgfVxuICAgIC8qKiBJbnNlcnRzIG9yIHVwZGF0ZXMgYSBkb2N1bWVudCB3aXRoIHRoZSBzYW1lIGtleSAqLyAgICBhZGQodCkge1xuICAgICAgICAvLyBGaXJzdCByZW1vdmUgdGhlIGVsZW1lbnQgaWYgd2UgaGF2ZSBpdC5cbiAgICAgICAgY29uc3QgZSA9IHRoaXMuZGVsZXRlKHQua2V5KTtcbiAgICAgICAgcmV0dXJuIGUuY29weShlLmtleWVkTWFwLmluc2VydCh0LmtleSwgdCksIGUuc29ydGVkU2V0Lmluc2VydCh0LCBudWxsKSk7XG4gICAgfVxuICAgIC8qKiBEZWxldGVzIGEgZG9jdW1lbnQgd2l0aCBhIGdpdmVuIGtleSAqLyAgICBkZWxldGUodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5nZXQodCk7XG4gICAgICAgIHJldHVybiBlID8gdGhpcy5jb3B5KHRoaXMua2V5ZWRNYXAucmVtb3ZlKHQpLCB0aGlzLnNvcnRlZFNldC5yZW1vdmUoZSkpIDogdGhpcztcbiAgICB9XG4gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIGlmICghKHQgaW5zdGFuY2VvZiBJYSkpIHJldHVybiAhMTtcbiAgICAgICAgaWYgKHRoaXMuc2l6ZSAhPT0gdC5zaXplKSByZXR1cm4gITE7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLnNvcnRlZFNldC5nZXRJdGVyYXRvcigpLCBuID0gdC5zb3J0ZWRTZXQuZ2V0SXRlcmF0b3IoKTtcbiAgICAgICAgZm9yICg7ZS5oYXNOZXh0KCk7ICkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGUuZ2V0TmV4dCgpLmtleSwgcyA9IG4uZ2V0TmV4dCgpLmtleTtcbiAgICAgICAgICAgIGlmICghdC5pc0VxdWFsKHMpKSByZXR1cm4gITE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICEwO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgY29uc3QgdCA9IFtdO1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JFYWNoKChlID0+IHtcbiAgICAgICAgICAgIHQucHVzaChlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9KSksIDAgPT09IHQubGVuZ3RoID8gXCJEb2N1bWVudFNldCAoKVwiIDogXCJEb2N1bWVudFNldCAoXFxuICBcIiArIHQuam9pbihcIiAgXFxuXCIpICsgXCJcXG4pXCI7XG4gICAgfVxuICAgIGNvcHkodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gbmV3IElhO1xuICAgICAgICByZXR1cm4gbi5jb21wYXJhdG9yID0gdGhpcy5jb21wYXJhdG9yLCBuLmtleWVkTWFwID0gdCwgbi5zb3J0ZWRTZXQgPSBlLCBuO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogRG9jdW1lbnRDaGFuZ2VTZXQga2VlcHMgdHJhY2sgb2YgYSBzZXQgb2YgY2hhbmdlcyB0byBkb2NzIGluIGEgcXVlcnksIG1lcmdpbmdcbiAqIGR1cGxpY2F0ZSBldmVudHMgZm9yIHRoZSBzYW1lIGRvYy5cbiAqLyBjbGFzcyBUYSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZ2EgPSBuZXcgQ24oeHQuY29tcGFyYXRvcik7XG4gICAgfVxuICAgIHRyYWNrKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQuZG9jLmtleSwgbiA9IHRoaXMuZ2EuZ2V0KGUpO1xuICAgICAgICBuID8gXG4gICAgICAgIC8vIE1lcmdlIHRoZSBuZXcgY2hhbmdlIHdpdGggdGhlIGV4aXN0aW5nIGNoYW5nZS5cbiAgICAgICAgMCAvKiBBZGRlZCAqLyAhPT0gdC50eXBlICYmIDMgLyogTWV0YWRhdGEgKi8gPT09IG4udHlwZSA/IHRoaXMuZ2EgPSB0aGlzLmdhLmluc2VydChlLCB0KSA6IDMgLyogTWV0YWRhdGEgKi8gPT09IHQudHlwZSAmJiAxIC8qIFJlbW92ZWQgKi8gIT09IG4udHlwZSA/IHRoaXMuZ2EgPSB0aGlzLmdhLmluc2VydChlLCB7XG4gICAgICAgICAgICB0eXBlOiBuLnR5cGUsXG4gICAgICAgICAgICBkb2M6IHQuZG9jXG4gICAgICAgIH0pIDogMiAvKiBNb2RpZmllZCAqLyA9PT0gdC50eXBlICYmIDIgLyogTW9kaWZpZWQgKi8gPT09IG4udHlwZSA/IHRoaXMuZ2EgPSB0aGlzLmdhLmluc2VydChlLCB7XG4gICAgICAgICAgICB0eXBlOiAyIC8qIE1vZGlmaWVkICovICxcbiAgICAgICAgICAgIGRvYzogdC5kb2NcbiAgICAgICAgfSkgOiAyIC8qIE1vZGlmaWVkICovID09PSB0LnR5cGUgJiYgMCAvKiBBZGRlZCAqLyA9PT0gbi50eXBlID8gdGhpcy5nYSA9IHRoaXMuZ2EuaW5zZXJ0KGUsIHtcbiAgICAgICAgICAgIHR5cGU6IDAgLyogQWRkZWQgKi8gLFxuICAgICAgICAgICAgZG9jOiB0LmRvY1xuICAgICAgICB9KSA6IDEgLyogUmVtb3ZlZCAqLyA9PT0gdC50eXBlICYmIDAgLyogQWRkZWQgKi8gPT09IG4udHlwZSA/IHRoaXMuZ2EgPSB0aGlzLmdhLnJlbW92ZShlKSA6IDEgLyogUmVtb3ZlZCAqLyA9PT0gdC50eXBlICYmIDIgLyogTW9kaWZpZWQgKi8gPT09IG4udHlwZSA/IHRoaXMuZ2EgPSB0aGlzLmdhLmluc2VydChlLCB7XG4gICAgICAgICAgICB0eXBlOiAxIC8qIFJlbW92ZWQgKi8gLFxuICAgICAgICAgICAgZG9jOiBuLmRvY1xuICAgICAgICB9KSA6IDAgLyogQWRkZWQgKi8gPT09IHQudHlwZSAmJiAxIC8qIFJlbW92ZWQgKi8gPT09IG4udHlwZSA/IHRoaXMuZ2EgPSB0aGlzLmdhLmluc2VydChlLCB7XG4gICAgICAgICAgICB0eXBlOiAyIC8qIE1vZGlmaWVkICovICxcbiAgICAgICAgICAgIGRvYzogdC5kb2NcbiAgICAgICAgfSkgOiBcbiAgICAgICAgLy8gVGhpcyBpbmNsdWRlcyB0aGVzZSBjYXNlcywgd2hpY2ggZG9uJ3QgbWFrZSBzZW5zZTpcbiAgICAgICAgLy8gQWRkZWQtPkFkZGVkXG4gICAgICAgIC8vIFJlbW92ZWQtPlJlbW92ZWRcbiAgICAgICAgLy8gTW9kaWZpZWQtPkFkZGVkXG4gICAgICAgIC8vIFJlbW92ZWQtPk1vZGlmaWVkXG4gICAgICAgIC8vIE1ldGFkYXRhLT5BZGRlZFxuICAgICAgICAvLyBSZW1vdmVkLT5NZXRhZGF0YVxuICAgICAgICBMKCkgOiB0aGlzLmdhID0gdGhpcy5nYS5pbnNlcnQoZSwgdCk7XG4gICAgfVxuICAgIHlhKCkge1xuICAgICAgICBjb25zdCB0ID0gW107XG4gICAgICAgIHJldHVybiB0aGlzLmdhLmlub3JkZXJUcmF2ZXJzYWwoKChlLCBuKSA9PiB7XG4gICAgICAgICAgICB0LnB1c2gobik7XG4gICAgICAgIH0pKSwgdDtcbiAgICB9XG59XG5cbmNsYXNzIEVhIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuLCBzLCBpLCByLCBvLCBhKSB7XG4gICAgICAgIHRoaXMucXVlcnkgPSB0LCB0aGlzLmRvY3MgPSBlLCB0aGlzLm9sZERvY3MgPSBuLCB0aGlzLmRvY0NoYW5nZXMgPSBzLCB0aGlzLm11dGF0ZWRLZXlzID0gaSwgXG4gICAgICAgIHRoaXMuZnJvbUNhY2hlID0gciwgdGhpcy5zeW5jU3RhdGVDaGFuZ2VkID0gbywgdGhpcy5leGNsdWRlc01ldGFkYXRhQ2hhbmdlcyA9IGE7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIGEgdmlldyBzbmFwc2hvdCBhcyBpZiBhbGwgZG9jdW1lbnRzIGluIHRoZSBzbmFwc2hvdCB3ZXJlIGFkZGVkLiAqLyAgICBzdGF0aWMgZnJvbUluaXRpYWxEb2N1bWVudHModCwgZSwgbiwgcykge1xuICAgICAgICBjb25zdCBpID0gW107XG4gICAgICAgIHJldHVybiBlLmZvckVhY2goKHQgPT4ge1xuICAgICAgICAgICAgaS5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAwIC8qIEFkZGVkICovICxcbiAgICAgICAgICAgICAgICBkb2M6IHRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KSksIG5ldyBFYSh0LCBlLCBJYS5lbXB0eVNldChlKSwgaSwgbiwgcywgXG4gICAgICAgIC8qIHN5bmNTdGF0ZUNoYW5nZWQ9ICovICEwLCBcbiAgICAgICAgLyogZXhjbHVkZXNNZXRhZGF0YUNoYW5nZXM9ICovICExKTtcbiAgICB9XG4gICAgZ2V0IGhhc1BlbmRpbmdXcml0ZXMoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5tdXRhdGVkS2V5cy5pc0VtcHR5KCk7XG4gICAgfVxuICAgIGlzRXF1YWwodCkge1xuICAgICAgICBpZiAoISh0aGlzLmZyb21DYWNoZSA9PT0gdC5mcm9tQ2FjaGUgJiYgdGhpcy5zeW5jU3RhdGVDaGFuZ2VkID09PSB0LnN5bmNTdGF0ZUNoYW5nZWQgJiYgdGhpcy5tdXRhdGVkS2V5cy5pc0VxdWFsKHQubXV0YXRlZEtleXMpICYmIEJlKHRoaXMucXVlcnksIHQucXVlcnkpICYmIHRoaXMuZG9jcy5pc0VxdWFsKHQuZG9jcykgJiYgdGhpcy5vbGREb2NzLmlzRXF1YWwodC5vbGREb2NzKSkpIHJldHVybiAhMTtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMuZG9jQ2hhbmdlcywgbiA9IHQuZG9jQ2hhbmdlcztcbiAgICAgICAgaWYgKGUubGVuZ3RoICE9PSBuLmxlbmd0aCkgcmV0dXJuICExO1xuICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IGUubGVuZ3RoOyB0KyspIGlmIChlW3RdLnR5cGUgIT09IG5bdF0udHlwZSB8fCAhZVt0XS5kb2MuaXNFcXVhbChuW3RdLmRvYykpIHJldHVybiAhMTtcbiAgICAgICAgcmV0dXJuICEwO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogSG9sZHMgdGhlIGxpc3RlbmVycyBhbmQgdGhlIGxhc3QgcmVjZWl2ZWQgVmlld1NuYXBzaG90IGZvciBhIHF1ZXJ5IGJlaW5nXG4gKiB0cmFja2VkIGJ5IEV2ZW50TWFuYWdlci5cbiAqLyBjbGFzcyBBYSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucGEgPSB2b2lkIDAsIHRoaXMubGlzdGVuZXJzID0gW107XG4gICAgfVxufVxuXG5jbGFzcyBSYSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucXVlcmllcyA9IG5ldyBEbigodCA9PiBMZSh0KSksIEJlKSwgdGhpcy5vbmxpbmVTdGF0ZSA9IFwiVW5rbm93blwiIC8qIFVua25vd24gKi8gLCBcbiAgICAgICAgdGhpcy5JYSA9IG5ldyBTZXQ7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBiYSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IEsodCksIHMgPSBlLnF1ZXJ5O1xuICAgIGxldCBpID0gITEsIHIgPSBuLnF1ZXJpZXMuZ2V0KHMpO1xuICAgIGlmIChyIHx8IChpID0gITAsIHIgPSBuZXcgQWEpLCBpKSB0cnkge1xuICAgICAgICByLnBhID0gYXdhaXQgbi5vbkxpc3RlbihzKTtcbiAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgIGNvbnN0IG4gPSBwYSh0LCBgSW5pdGlhbGl6YXRpb24gb2YgcXVlcnkgJyR7cWUoZS5xdWVyeSl9JyBmYWlsZWRgKTtcbiAgICAgICAgcmV0dXJuIHZvaWQgZS5vbkVycm9yKG4pO1xuICAgIH1cbiAgICBpZiAobi5xdWVyaWVzLnNldChzLCByKSwgci5saXN0ZW5lcnMucHVzaChlKSwgXG4gICAgLy8gUnVuIGdsb2JhbCBzbmFwc2hvdCBsaXN0ZW5lcnMgaWYgYSBjb25zaXN0ZW50IHNuYXBzaG90IGhhcyBiZWVuIGVtaXR0ZWQuXG4gICAgZS5UYShuLm9ubGluZVN0YXRlKSwgci5wYSkge1xuICAgICAgICBlLkVhKHIucGEpICYmIFNhKG4pO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gUGEodCwgZSkge1xuICAgIGNvbnN0IG4gPSBLKHQpLCBzID0gZS5xdWVyeTtcbiAgICBsZXQgaSA9ICExO1xuICAgIGNvbnN0IHIgPSBuLnF1ZXJpZXMuZ2V0KHMpO1xuICAgIGlmIChyKSB7XG4gICAgICAgIGNvbnN0IHQgPSByLmxpc3RlbmVycy5pbmRleE9mKGUpO1xuICAgICAgICB0ID49IDAgJiYgKHIubGlzdGVuZXJzLnNwbGljZSh0LCAxKSwgaSA9IDAgPT09IHIubGlzdGVuZXJzLmxlbmd0aCk7XG4gICAgfVxuICAgIGlmIChpKSByZXR1cm4gbi5xdWVyaWVzLmRlbGV0ZShzKSwgbi5vblVubGlzdGVuKHMpO1xufVxuXG5mdW5jdGlvbiBWYSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IEsodCk7XG4gICAgbGV0IHMgPSAhMTtcbiAgICBmb3IgKGNvbnN0IHQgb2YgZSkge1xuICAgICAgICBjb25zdCBlID0gdC5xdWVyeSwgaSA9IG4ucXVlcmllcy5nZXQoZSk7XG4gICAgICAgIGlmIChpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgaS5saXN0ZW5lcnMpIGUuRWEodCkgJiYgKHMgPSAhMCk7XG4gICAgICAgICAgICBpLnBhID0gdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzICYmIFNhKG4pO1xufVxuXG5mdW5jdGlvbiB2YSh0LCBlLCBuKSB7XG4gICAgY29uc3QgcyA9IEsodCksIGkgPSBzLnF1ZXJpZXMuZ2V0KGUpO1xuICAgIGlmIChpKSBmb3IgKGNvbnN0IHQgb2YgaS5saXN0ZW5lcnMpIHQub25FcnJvcihuKTtcbiAgICAvLyBSZW1vdmUgYWxsIGxpc3RlbmVycy4gTk9URTogV2UgZG9uJ3QgbmVlZCB0byBjYWxsIHN5bmNFbmdpbmUudW5saXN0ZW4oKVxuICAgIC8vIGFmdGVyIGFuIGVycm9yLlxuICAgICAgICBzLnF1ZXJpZXMuZGVsZXRlKGUpO1xufVxuXG4vLyBDYWxsIGFsbCBnbG9iYWwgc25hcHNob3QgbGlzdGVuZXJzIHRoYXQgaGF2ZSBiZWVuIHNldC5cbmZ1bmN0aW9uIFNhKHQpIHtcbiAgICB0LklhLmZvckVhY2goKHQgPT4ge1xuICAgICAgICB0Lm5leHQoKTtcbiAgICB9KSk7XG59XG5cbi8qKlxuICogUXVlcnlMaXN0ZW5lciB0YWtlcyBhIHNlcmllcyBvZiBpbnRlcm5hbCB2aWV3IHNuYXBzaG90cyBhbmQgZGV0ZXJtaW5lc1xuICogd2hlbiB0byByYWlzZSB0aGUgZXZlbnQuXG4gKlxuICogSXQgdXNlcyBhbiBPYnNlcnZlciB0byBkaXNwYXRjaCBldmVudHMuXG4gKi8gY2xhc3MgRGEge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy5xdWVyeSA9IHQsIHRoaXMuQWEgPSBlLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluaXRpYWwgc25hcHNob3RzIChlLmcuIGZyb20gY2FjaGUpIG1heSBub3QgYmUgcHJvcGFnYXRlZCB0byB0aGUgd3JhcHBlZFxuICAgICAgICAgKiBvYnNlcnZlci4gVGhpcyBmbGFnIGlzIHNldCB0byB0cnVlIG9uY2Ugd2UndmUgYWN0dWFsbHkgcmFpc2VkIGFuIGV2ZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5SYSA9ICExLCB0aGlzLmJhID0gbnVsbCwgdGhpcy5vbmxpbmVTdGF0ZSA9IFwiVW5rbm93blwiIC8qIFVua25vd24gKi8gLCB0aGlzLm9wdGlvbnMgPSBuIHx8IHt9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIHRoZSBuZXcgVmlld1NuYXBzaG90IHRvIHRoaXMgbGlzdGVuZXIsIHJhaXNpbmcgYSB1c2VyLWZhY2luZyBldmVudFxuICAgICAqIGlmIGFwcGxpY2FibGUgKGRlcGVuZGluZyBvbiB3aGF0IGNoYW5nZWQsIHdoZXRoZXIgdGhlIHVzZXIgaGFzIG9wdGVkIGludG9cbiAgICAgKiBtZXRhZGF0YS1vbmx5IGNoYW5nZXMsIGV0Yy4pLiBSZXR1cm5zIHRydWUgaWYgYSB1c2VyLWZhY2luZyBldmVudCB3YXNcbiAgICAgKiBpbmRlZWQgcmFpc2VkLlxuICAgICAqLyAgICBFYSh0KSB7XG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLmluY2x1ZGVNZXRhZGF0YUNoYW5nZXMpIHtcbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgbWV0YWRhdGEgb25seSBjaGFuZ2VzLlxuICAgICAgICAgICAgY29uc3QgZSA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBuIG9mIHQuZG9jQ2hhbmdlcykgMyAvKiBNZXRhZGF0YSAqLyAhPT0gbi50eXBlICYmIGUucHVzaChuKTtcbiAgICAgICAgICAgIHQgPSBuZXcgRWEodC5xdWVyeSwgdC5kb2NzLCB0Lm9sZERvY3MsIGUsIHQubXV0YXRlZEtleXMsIHQuZnJvbUNhY2hlLCB0LnN5bmNTdGF0ZUNoYW5nZWQsIFxuICAgICAgICAgICAgLyogZXhjbHVkZXNNZXRhZGF0YUNoYW5nZXM9ICovICEwKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZSA9ICExO1xuICAgICAgICByZXR1cm4gdGhpcy5SYSA/IHRoaXMuUGEodCkgJiYgKHRoaXMuQWEubmV4dCh0KSwgZSA9ICEwKSA6IHRoaXMuVmEodCwgdGhpcy5vbmxpbmVTdGF0ZSkgJiYgKHRoaXMudmEodCksIFxuICAgICAgICBlID0gITApLCB0aGlzLmJhID0gdCwgZTtcbiAgICB9XG4gICAgb25FcnJvcih0KSB7XG4gICAgICAgIHRoaXMuQWEuZXJyb3IodCk7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgYSBzbmFwc2hvdCB3YXMgcmFpc2VkLiAqLyAgICBUYSh0KSB7XG4gICAgICAgIHRoaXMub25saW5lU3RhdGUgPSB0O1xuICAgICAgICBsZXQgZSA9ICExO1xuICAgICAgICByZXR1cm4gdGhpcy5iYSAmJiAhdGhpcy5SYSAmJiB0aGlzLlZhKHRoaXMuYmEsIHQpICYmICh0aGlzLnZhKHRoaXMuYmEpLCBlID0gITApLCBcbiAgICAgICAgZTtcbiAgICB9XG4gICAgVmEodCwgZSkge1xuICAgICAgICAvLyBBbHdheXMgcmFpc2UgdGhlIGZpcnN0IGV2ZW50IHdoZW4gd2UncmUgc3luY2VkXG4gICAgICAgIGlmICghdC5mcm9tQ2FjaGUpIHJldHVybiAhMDtcbiAgICAgICAgLy8gTk9URTogV2UgY29uc2lkZXIgT25saW5lU3RhdGUuVW5rbm93biBhcyBvbmxpbmUgKGl0IHNob3VsZCBiZWNvbWUgT2ZmbGluZVxuICAgICAgICAvLyBvciBPbmxpbmUgaWYgd2Ugd2FpdCBsb25nIGVub3VnaCkuXG4gICAgICAgICAgICAgICAgY29uc3QgbiA9IFwiT2ZmbGluZVwiIC8qIE9mZmxpbmUgKi8gIT09IGU7XG4gICAgICAgIC8vIERvbid0IHJhaXNlIHRoZSBldmVudCBpZiB3ZSdyZSBvbmxpbmUsIGFyZW4ndCBzeW5jZWQgeWV0IChjaGVja2VkXG4gICAgICAgIC8vIGFib3ZlKSBhbmQgYXJlIHdhaXRpbmcgZm9yIGEgc3luYy5cbiAgICAgICAgICAgICAgICByZXR1cm4gKCF0aGlzLm9wdGlvbnMuU2EgfHwgIW4pICYmICghdC5kb2NzLmlzRW1wdHkoKSB8fCBcIk9mZmxpbmVcIiAvKiBPZmZsaW5lICovID09PSBlKTtcbiAgICAgICAgLy8gUmFpc2UgZGF0YSBmcm9tIGNhY2hlIGlmIHdlIGhhdmUgYW55IGRvY3VtZW50cyBvciB3ZSBhcmUgb2ZmbGluZVxuICAgICAgICB9XG4gICAgUGEodCkge1xuICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGhhbmRsZSBpbmNsdWRlRG9jdW1lbnRNZXRhZGF0YUNoYW5nZXMgaGVyZSBiZWNhdXNlXG4gICAgICAgIC8vIHRoZSBNZXRhZGF0YSBvbmx5IGNoYW5nZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc3RyaXBwZWQgb3V0IGlmIG5lZWRlZC5cbiAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgb25seSBjaGFuZ2VzIHdlIHdpbGwgc2VlIGFyZSB0aGUgb25lcyB3ZSBzaG91bGRcbiAgICAgICAgLy8gcHJvcGFnYXRlLlxuICAgICAgICBpZiAodC5kb2NDaGFuZ2VzLmxlbmd0aCA+IDApIHJldHVybiAhMDtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMuYmEgJiYgdGhpcy5iYS5oYXNQZW5kaW5nV3JpdGVzICE9PSB0Lmhhc1BlbmRpbmdXcml0ZXM7XG4gICAgICAgIHJldHVybiAhKCF0LnN5bmNTdGF0ZUNoYW5nZWQgJiYgIWUpICYmICEwID09PSB0aGlzLm9wdGlvbnMuaW5jbHVkZU1ldGFkYXRhQ2hhbmdlcztcbiAgICAgICAgLy8gR2VuZXJhbGx5IHdlIHNob3VsZCBoYXZlIGhpdCBvbmUgb2YgdGhlIGNhc2VzIGFib3ZlLCBidXQgaXQncyBwb3NzaWJsZVxuICAgICAgICAvLyB0byBnZXQgaGVyZSBpZiB0aGVyZSB3ZXJlIG9ubHkgbWV0YWRhdGEgZG9jQ2hhbmdlcyBhbmQgdGhleSBnb3RcbiAgICAgICAgLy8gc3RyaXBwZWQgb3V0LlxuICAgICAgICB9XG4gICAgdmEodCkge1xuICAgICAgICB0ID0gRWEuZnJvbUluaXRpYWxEb2N1bWVudHModC5xdWVyeSwgdC5kb2NzLCB0Lm11dGF0ZWRLZXlzLCB0LmZyb21DYWNoZSksIHRoaXMuUmEgPSAhMCwgXG4gICAgICAgIHRoaXMuQWEubmV4dCh0KTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEEgY29tcGxldGUgZWxlbWVudCBpbiB0aGUgYnVuZGxlIHN0cmVhbSwgdG9nZXRoZXIgd2l0aCB0aGUgYnl0ZSBsZW5ndGggaXRcbiAqIG9jY3VwaWVzIGluIHRoZSBzdHJlYW0uXG4gKi8gY2xhc3MgQ2Ege1xuICAgIGNvbnN0cnVjdG9yKHQsIFxuICAgIC8vIEhvdyBtYW55IGJ5dGVzIHRoaXMgZWxlbWVudCB0YWtlcyB0byBzdG9yZSBpbiB0aGUgYnVuZGxlLlxuICAgIGUpIHtcbiAgICAgICAgdGhpcy5wYXlsb2FkID0gdCwgdGhpcy5ieXRlTGVuZ3RoID0gZTtcbiAgICB9XG4gICAgRGEoKSB7XG4gICAgICAgIHJldHVybiBcIm1ldGFkYXRhXCIgaW4gdGhpcy5wYXlsb2FkO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogSGVscGVyIHRvIGNvbnZlcnQgb2JqZWN0cyBmcm9tIGJ1bmRsZXMgdG8gbW9kZWwgb2JqZWN0cyBpbiB0aGUgU0RLLlxuICovIGNsYXNzIHhhIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMuTSA9IHQ7XG4gICAgfVxuICAgIGxpKHQpIHtcbiAgICAgICAgcmV0dXJuIGZzKHRoaXMuTSwgdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEgQnVuZGxlRG9jdW1lbnQgdG8gYSBNdXRhYmxlRG9jdW1lbnQuXG4gICAgICovICAgIGZpKHQpIHtcbiAgICAgICAgcmV0dXJuIHQubWV0YWRhdGEuZXhpc3RzID8geXModGhpcy5NLCB0LmRvY3VtZW50LCAhMSkgOiB0ZS5uZXdOb0RvY3VtZW50KHRoaXMubGkodC5tZXRhZGF0YS5uYW1lKSwgdGhpcy5kaSh0Lm1ldGFkYXRhLnJlYWRUaW1lKSk7XG4gICAgfVxuICAgIGRpKHQpIHtcbiAgICAgICAgcmV0dXJuIHVzKHQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBIGNsYXNzIHRvIHByb2Nlc3MgdGhlIGVsZW1lbnRzIGZyb20gYSBidW5kbGUsIGxvYWQgdGhlbSBpbnRvIGxvY2FsXG4gKiBzdG9yYWdlIGFuZCBwcm92aWRlIHByb2dyZXNzIHVwZGF0ZSB3aGlsZSBsb2FkaW5nLlxuICovIGNsYXNzIE5hIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgIHRoaXMuQ2EgPSB0LCB0aGlzLmxvY2FsU3RvcmUgPSBlLCB0aGlzLk0gPSBuLCBcbiAgICAgICAgLyoqIEJhdGNoZWQgcXVlcmllcyB0byBiZSBzYXZlZCBpbnRvIHN0b3JhZ2UgKi9cbiAgICAgICAgdGhpcy5xdWVyaWVzID0gW10sIFxuICAgICAgICAvKiogQmF0Y2hlZCBkb2N1bWVudHMgdG8gYmUgc2F2ZWQgaW50byBzdG9yYWdlICovXG4gICAgICAgIHRoaXMuZG9jdW1lbnRzID0gW10sIHRoaXMucHJvZ3Jlc3MgPSBrYSh0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBlbGVtZW50IGZyb20gdGhlIGJ1bmRsZSB0byB0aGUgbG9hZGVyLlxuICAgICAqXG4gICAgICogUmV0dXJucyBhIG5ldyBwcm9ncmVzcyBpZiBhZGRpbmcgdGhlIGVsZW1lbnQgbGVhZHMgdG8gYSBuZXcgcHJvZ3Jlc3MsXG4gICAgICogb3RoZXJ3aXNlIHJldHVybnMgbnVsbC5cbiAgICAgKi8gICAgeGEodCkge1xuICAgICAgICB0aGlzLnByb2dyZXNzLmJ5dGVzTG9hZGVkICs9IHQuYnl0ZUxlbmd0aDtcbiAgICAgICAgbGV0IGUgPSB0aGlzLnByb2dyZXNzLmRvY3VtZW50c0xvYWRlZDtcbiAgICAgICAgcmV0dXJuIHQucGF5bG9hZC5uYW1lZFF1ZXJ5ID8gdGhpcy5xdWVyaWVzLnB1c2godC5wYXlsb2FkLm5hbWVkUXVlcnkpIDogdC5wYXlsb2FkLmRvY3VtZW50TWV0YWRhdGEgPyAodGhpcy5kb2N1bWVudHMucHVzaCh7XG4gICAgICAgICAgICBtZXRhZGF0YTogdC5wYXlsb2FkLmRvY3VtZW50TWV0YWRhdGFcbiAgICAgICAgfSksIHQucGF5bG9hZC5kb2N1bWVudE1ldGFkYXRhLmV4aXN0cyB8fCArK2UpIDogdC5wYXlsb2FkLmRvY3VtZW50ICYmICh0aGlzLmRvY3VtZW50c1t0aGlzLmRvY3VtZW50cy5sZW5ndGggLSAxXS5kb2N1bWVudCA9IHQucGF5bG9hZC5kb2N1bWVudCwgXG4gICAgICAgICsrZSksIGUgIT09IHRoaXMucHJvZ3Jlc3MuZG9jdW1lbnRzTG9hZGVkID8gKHRoaXMucHJvZ3Jlc3MuZG9jdW1lbnRzTG9hZGVkID0gZSwgXG4gICAgICAgIE9iamVjdC5hc3NpZ24oe30sIHRoaXMucHJvZ3Jlc3MpKSA6IG51bGw7XG4gICAgfVxuICAgIE5hKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IG5ldyBNYXAsIG4gPSBuZXcgeGEodGhpcy5NKTtcbiAgICAgICAgZm9yIChjb25zdCBzIG9mIHQpIGlmIChzLm1ldGFkYXRhLnF1ZXJpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBuLmxpKHMubWV0YWRhdGEubmFtZSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG4gb2Ygcy5tZXRhZGF0YS5xdWVyaWVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IChlLmdldChuKSB8fCBHbigpKS5hZGQodCk7XG4gICAgICAgICAgICAgICAgZS5zZXQobiwgcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgcHJvZ3Jlc3MgdG8gJ1N1Y2Nlc3MnIGFuZCByZXR1cm4gdGhlIHVwZGF0ZWQgcHJvZ3Jlc3MuXG4gICAgICovICAgIGFzeW5jIGNvbXBsZXRlKCkge1xuICAgICAgICBjb25zdCB0ID0gYXdhaXQgcm8odGhpcy5sb2NhbFN0b3JlLCBuZXcgeGEodGhpcy5NKSwgdGhpcy5kb2N1bWVudHMsIHRoaXMuQ2EuaWQpLCBlID0gdGhpcy5OYSh0aGlzLmRvY3VtZW50cyk7XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLnF1ZXJpZXMpIGF3YWl0IG9vKHRoaXMubG9jYWxTdG9yZSwgdCwgZS5nZXQodC5uYW1lKSk7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2dyZXNzLnRhc2tTdGF0ZSA9IFwiU3VjY2Vzc1wiLCBuZXcgcXIoT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wcm9ncmVzcyksIHQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgYExvYWRCdW5kbGVUYXNrUHJvZ3Jlc3NgIHJlcHJlc2VudGluZyB0aGUgaW5pdGlhbCBwcm9ncmVzcyBvZlxuICogbG9hZGluZyBhIGJ1bmRsZS5cbiAqLyBmdW5jdGlvbiBrYSh0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdGFza1N0YXRlOiBcIlJ1bm5pbmdcIixcbiAgICAgICAgZG9jdW1lbnRzTG9hZGVkOiAwLFxuICAgICAgICBieXRlc0xvYWRlZDogMCxcbiAgICAgICAgdG90YWxEb2N1bWVudHM6IHQudG90YWxEb2N1bWVudHMsXG4gICAgICAgIHRvdGFsQnl0ZXM6IHQudG90YWxCeXRlc1xuICAgIH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGBMb2FkQnVuZGxlVGFza1Byb2dyZXNzYCByZXByZXNlbnRpbmcgdGhlIHByb2dyZXNzIHRoYXQgdGhlIGxvYWRpbmdcbiAqIGhhcyBzdWNjZWVkZWQuXG4gKi9cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5jbGFzcyBNYSB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLmtleSA9IHQ7XG4gICAgfVxufVxuXG5jbGFzcyBPYSB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLmtleSA9IHQ7XG4gICAgfVxufVxuXG4vKipcbiAqIFZpZXcgaXMgcmVzcG9uc2libGUgZm9yIGNvbXB1dGluZyB0aGUgZmluYWwgbWVyZ2VkIHRydXRoIG9mIHdoYXQgZG9jcyBhcmUgaW5cbiAqIGEgcXVlcnkuIEl0IGdldHMgbm90aWZpZWQgb2YgbG9jYWwgYW5kIHJlbW90ZSBjaGFuZ2VzIHRvIGRvY3MsIGFuZCBhcHBsaWVzXG4gKiB0aGUgcXVlcnkgZmlsdGVycyBhbmQgbGltaXRzIHRvIGRldGVybWluZSB0aGUgbW9zdCBjb3JyZWN0IHBvc3NpYmxlIHJlc3VsdHMuXG4gKi8gY2xhc3MgJGEge1xuICAgIGNvbnN0cnVjdG9yKHQsIFxuICAgIC8qKiBEb2N1bWVudHMgaW5jbHVkZWQgaW4gdGhlIHJlbW90ZSB0YXJnZXQgKi9cbiAgICBlKSB7XG4gICAgICAgIHRoaXMucXVlcnkgPSB0LCB0aGlzLmthID0gZSwgdGhpcy5NYSA9IG51bGwsIFxuICAgICAgICAvKipcbiAgICAgICAgICogQSBmbGFnIHdoZXRoZXIgdGhlIHZpZXcgaXMgY3VycmVudCB3aXRoIHRoZSBiYWNrZW5kLiBBIHZpZXcgaXMgY29uc2lkZXJlZFxuICAgICAgICAgKiBjdXJyZW50IGFmdGVyIGl0IGhhcyBzZWVuIHRoZSBjdXJyZW50IGZsYWcgZnJvbSB0aGUgYmFja2VuZCBhbmQgZGlkIG5vdFxuICAgICAgICAgKiBsb3NlIGNvbnNpc3RlbmN5IHdpdGhpbiB0aGUgd2F0Y2ggc3RyZWFtIChlLmcuIGJlY2F1c2Ugb2YgYW4gZXhpc3RlbmNlXG4gICAgICAgICAqIGZpbHRlciBtaXNtYXRjaCkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSAhMSwgXG4gICAgICAgIC8qKiBEb2N1bWVudHMgaW4gdGhlIHZpZXcgYnV0IG5vdCBpbiB0aGUgcmVtb3RlIHRhcmdldCAqL1xuICAgICAgICB0aGlzLk9hID0gR24oKSwgXG4gICAgICAgIC8qKiBEb2N1bWVudCBLZXlzIHRoYXQgaGF2ZSBsb2NhbCBjaGFuZ2VzICovXG4gICAgICAgIHRoaXMubXV0YXRlZEtleXMgPSBHbigpLCB0aGlzLiRhID0gS2UodCksIHRoaXMuRmEgPSBuZXcgSWEodGhpcy4kYSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBzZXQgb2YgcmVtb3RlIGRvY3VtZW50cyB0aGF0IHRoZSBzZXJ2ZXIgaGFzIHRvbGQgdXMgYmVsb25ncyB0byB0aGUgdGFyZ2V0IGFzc29jaWF0ZWQgd2l0aFxuICAgICAqIHRoaXMgdmlldy5cbiAgICAgKi8gICAgZ2V0IEJhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5rYTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBhIHNldCBvZiBkb2MgY2hhbmdlcywgYXBwbGllcyB0aGUgcXVlcnkgbGltaXQsIGFuZCBjb21wdXRlc1xuICAgICAqIHdoYXQgdGhlIG5ldyByZXN1bHRzIHNob3VsZCBiZSwgd2hhdCB0aGUgY2hhbmdlcyB3ZXJlLCBhbmQgd2hldGhlciB3ZSBtYXlcbiAgICAgKiBuZWVkIHRvIGdvIGJhY2sgdG8gdGhlIGxvY2FsIGNhY2hlIGZvciBtb3JlIHJlc3VsdHMuIERvZXMgbm90IG1ha2UgYW55XG4gICAgICogY2hhbmdlcyB0byB0aGUgdmlldy5cbiAgICAgKiBAcGFyYW0gZG9jQ2hhbmdlcyAtIFRoZSBkb2MgY2hhbmdlcyB0byBhcHBseSB0byB0aGlzIHZpZXcuXG4gICAgICogQHBhcmFtIHByZXZpb3VzQ2hhbmdlcyAtIElmIHRoaXMgaXMgYmVpbmcgY2FsbGVkIHdpdGggYSByZWZpbGwsIHRoZW4gc3RhcnRcbiAgICAgKiAgICAgICAgd2l0aCB0aGlzIHNldCBvZiBkb2NzIGFuZCBjaGFuZ2VzIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgdmlldy5cbiAgICAgKiBAcmV0dXJucyBhIG5ldyBzZXQgb2YgZG9jcywgY2hhbmdlcywgYW5kIHJlZmlsbCBmbGFnLlxuICAgICAqLyAgICBMYSh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBlID8gZS5xYSA6IG5ldyBUYSwgcyA9IGUgPyBlLkZhIDogdGhpcy5GYTtcbiAgICAgICAgbGV0IGkgPSBlID8gZS5tdXRhdGVkS2V5cyA6IHRoaXMubXV0YXRlZEtleXMsIHIgPSBzLCBvID0gITE7XG4gICAgICAgIC8vIFRyYWNrIHRoZSBsYXN0IGRvYyBpbiBhIChmdWxsKSBsaW1pdC4gVGhpcyBpcyBuZWNlc3NhcnksIGJlY2F1c2Ugc29tZVxuICAgICAgICAvLyB1cGRhdGUgKGEgZGVsZXRlLCBvciBhbiB1cGRhdGUgbW92aW5nIGEgZG9jIHBhc3QgdGhlIG9sZCBsaW1pdCkgbWlnaHRcbiAgICAgICAgLy8gbWVhbiB0aGVyZSBpcyBzb21lIG90aGVyIGRvY3VtZW50IGluIHRoZSBsb2NhbCBjYWNoZSB0aGF0IGVpdGhlciBzaG91bGRcbiAgICAgICAgLy8gY29tZSAoMSkgYmV0d2VlbiB0aGUgb2xkIGxhc3QgbGltaXQgZG9jIGFuZCB0aGUgbmV3IGxhc3QgZG9jdW1lbnQsIGluIHRoZVxuICAgICAgICAvLyBjYXNlIG9mIHVwZGF0ZXMsIG9yICgyKSBhZnRlciB0aGUgbmV3IGxhc3QgZG9jdW1lbnQsIGluIHRoZSBjYXNlIG9mXG4gICAgICAgIC8vIGRlbGV0ZXMuIFNvIHdlIGtlZXAgdGhpcyBkb2MgYXQgdGhlIG9sZCBsaW1pdCB0byBjb21wYXJlIHRoZSB1cGRhdGVzIHRvLlxuICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBzaG91bGQgbmV2ZXIgZ2V0IHVzZWQgaW4gYSByZWZpbGwgKHdoZW4gcHJldmlvdXNDaGFuZ2VzIGlzXG4gICAgICAgIC8vIHNldCksIGJlY2F1c2UgdGhlcmUgd2lsbCBvbmx5IGJlIGFkZHMgLS0gbm8gZGVsZXRlcyBvciB1cGRhdGVzLlxuICAgICAgICBjb25zdCBhID0gQ2UodGhpcy5xdWVyeSkgJiYgcy5zaXplID09PSB0aGlzLnF1ZXJ5LmxpbWl0ID8gcy5sYXN0KCkgOiBudWxsLCB1ID0geGUodGhpcy5xdWVyeSkgJiYgcy5zaXplID09PSB0aGlzLnF1ZXJ5LmxpbWl0ID8gcy5maXJzdCgpIDogbnVsbDtcbiAgICAgICAgLy8gRHJvcCBkb2N1bWVudHMgb3V0IHRvIG1lZXQgbGltaXQvbGltaXRUb0xhc3QgcmVxdWlyZW1lbnQuXG4gICAgICAgIGlmICh0Lmlub3JkZXJUcmF2ZXJzYWwoKCh0LCBlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjID0gcy5nZXQodCksIGggPSBVZSh0aGlzLnF1ZXJ5LCBlKSA/IGUgOiBudWxsLCBsID0gISFjICYmIHRoaXMubXV0YXRlZEtleXMuaGFzKGMua2V5KSwgZiA9ICEhaCAmJiAoaC5oYXNMb2NhbE11dGF0aW9ucyB8fCBcbiAgICAgICAgICAgIC8vIFdlIG9ubHkgY29uc2lkZXIgY29tbWl0dGVkIG11dGF0aW9ucyBmb3IgZG9jdW1lbnRzIHRoYXQgd2VyZVxuICAgICAgICAgICAgLy8gbXV0YXRlZCBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoZSB2aWV3LlxuICAgICAgICAgICAgdGhpcy5tdXRhdGVkS2V5cy5oYXMoaC5rZXkpICYmIGguaGFzQ29tbWl0dGVkTXV0YXRpb25zKTtcbiAgICAgICAgICAgIGxldCBkID0gITE7XG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgY2hhbmdlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAmJiBoKSB7XG4gICAgICAgICAgICAgICAgYy5kYXRhLmlzRXF1YWwoaC5kYXRhKSA/IGwgIT09IGYgJiYgKG4udHJhY2soe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAzIC8qIE1ldGFkYXRhICovICxcbiAgICAgICAgICAgICAgICAgICAgZG9jOiBoXG4gICAgICAgICAgICAgICAgfSksIGQgPSAhMCkgOiB0aGlzLlVhKGMsIGgpIHx8IChuLnRyYWNrKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogMiAvKiBNb2RpZmllZCAqLyAsXG4gICAgICAgICAgICAgICAgICAgIGRvYzogaFxuICAgICAgICAgICAgICAgIH0pLCBkID0gITAsIChhICYmIHRoaXMuJGEoaCwgYSkgPiAwIHx8IHUgJiYgdGhpcy4kYShoLCB1KSA8IDApICYmIChcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGRvYyBtb3ZlZCBmcm9tIGluc2lkZSB0aGUgbGltaXQgdG8gb3V0c2lkZSB0aGUgbGltaXQuXG4gICAgICAgICAgICAgICAgLy8gVGhhdCBtZWFucyB0aGVyZSBtYXkgYmUgc29tZSBvdGhlciBkb2MgaW4gdGhlIGxvY2FsIGNhY2hlXG4gICAgICAgICAgICAgICAgLy8gdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW5zdGVhZC5cbiAgICAgICAgICAgICAgICBvID0gITApKTtcbiAgICAgICAgICAgIH0gZWxzZSAhYyAmJiBoID8gKG4udHJhY2soe1xuICAgICAgICAgICAgICAgIHR5cGU6IDAgLyogQWRkZWQgKi8gLFxuICAgICAgICAgICAgICAgIGRvYzogaFxuICAgICAgICAgICAgfSksIGQgPSAhMCkgOiBjICYmICFoICYmIChuLnRyYWNrKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAxIC8qIFJlbW92ZWQgKi8gLFxuICAgICAgICAgICAgICAgIGRvYzogY1xuICAgICAgICAgICAgfSksIGQgPSAhMCwgKGEgfHwgdSkgJiYgKFxuICAgICAgICAgICAgLy8gQSBkb2Mgd2FzIHJlbW92ZWQgZnJvbSBhIGZ1bGwgbGltaXQgcXVlcnkuIFdlJ2xsIG5lZWQgdG9cbiAgICAgICAgICAgIC8vIHJlcXVlcnkgZnJvbSB0aGUgbG9jYWwgY2FjaGUgdG8gc2VlIGlmIHdlIGtub3cgYWJvdXQgc29tZSBvdGhlclxuICAgICAgICAgICAgLy8gZG9jIHRoYXQgc2hvdWxkIGJlIGluIHRoZSByZXN1bHRzLlxuICAgICAgICAgICAgbyA9ICEwKSk7XG4gICAgICAgICAgICBkICYmIChoID8gKHIgPSByLmFkZChoKSwgaSA9IGYgPyBpLmFkZCh0KSA6IGkuZGVsZXRlKHQpKSA6IChyID0gci5kZWxldGUodCksIGkgPSBpLmRlbGV0ZSh0KSkpO1xuICAgICAgICB9KSksIENlKHRoaXMucXVlcnkpIHx8IHhlKHRoaXMucXVlcnkpKSBmb3IgKDtyLnNpemUgPiB0aGlzLnF1ZXJ5LmxpbWl0OyApIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBDZSh0aGlzLnF1ZXJ5KSA/IHIubGFzdCgpIDogci5maXJzdCgpO1xuICAgICAgICAgICAgciA9IHIuZGVsZXRlKHQua2V5KSwgaSA9IGkuZGVsZXRlKHQua2V5KSwgbi50cmFjayh7XG4gICAgICAgICAgICAgICAgdHlwZTogMSAvKiBSZW1vdmVkICovICxcbiAgICAgICAgICAgICAgICBkb2M6IHRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBGYTogcixcbiAgICAgICAgICAgIHFhOiBuLFxuICAgICAgICAgICAgZWk6IG8sXG4gICAgICAgICAgICBtdXRhdGVkS2V5czogaVxuICAgICAgICB9O1xuICAgIH1cbiAgICBVYSh0LCBlKSB7XG4gICAgICAgIC8vIFdlIHN1cHByZXNzIHRoZSBpbml0aWFsIGNoYW5nZSBldmVudCBmb3IgZG9jdW1lbnRzIHRoYXQgd2VyZSBtb2RpZmllZCBhc1xuICAgICAgICAvLyBwYXJ0IG9mIGEgd3JpdGUgYWNrbm93bGVkZ21lbnQgKGUuZy4gd2hlbiB0aGUgdmFsdWUgb2YgYSBzZXJ2ZXIgdHJhbnNmb3JtXG4gICAgICAgIC8vIGlzIGFwcGxpZWQpIGFzIFdhdGNoIHdpbGwgc2VuZCB1cyB0aGUgc2FtZSBkb2N1bWVudCBhZ2Fpbi5cbiAgICAgICAgLy8gQnkgc3VwcHJlc3NpbmcgdGhlIGV2ZW50LCB3ZSBvbmx5IHJhaXNlIHR3byB1c2VyIHZpc2libGUgZXZlbnRzIChvbmUgd2l0aFxuICAgICAgICAvLyBgaGFzUGVuZGluZ1dyaXRlc2AgYW5kIHRoZSBmaW5hbCBzdGF0ZSBvZiB0aGUgZG9jdW1lbnQpIGluc3RlYWQgb2YgdGhyZWVcbiAgICAgICAgLy8gKG9uZSB3aXRoIGBoYXNQZW5kaW5nV3JpdGVzYCwgdGhlIG1vZGlmaWVkIGRvY3VtZW50IHdpdGhcbiAgICAgICAgLy8gYGhhc1BlbmRpbmdXcml0ZXNgIGFuZCB0aGUgZmluYWwgc3RhdGUgb2YgdGhlIGRvY3VtZW50KS5cbiAgICAgICAgcmV0dXJuIHQuaGFzTG9jYWxNdXRhdGlvbnMgJiYgZS5oYXNDb21taXR0ZWRNdXRhdGlvbnMgJiYgIWUuaGFzTG9jYWxNdXRhdGlvbnM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIHZpZXcgd2l0aCB0aGUgZ2l2ZW4gVmlld0RvY3VtZW50Q2hhbmdlcyBhbmQgb3B0aW9uYWxseSB1cGRhdGVzXG4gICAgICogbGltYm8gZG9jcyBhbmQgc3luYyBzdGF0ZSBmcm9tIHRoZSBwcm92aWRlZCB0YXJnZXQgY2hhbmdlLlxuICAgICAqIEBwYXJhbSBkb2NDaGFuZ2VzIC0gVGhlIHNldCBvZiBjaGFuZ2VzIHRvIG1ha2UgdG8gdGhlIHZpZXcncyBkb2NzLlxuICAgICAqIEBwYXJhbSB1cGRhdGVMaW1ib0RvY3VtZW50cyAtIFdoZXRoZXIgdG8gdXBkYXRlIGxpbWJvIGRvY3VtZW50cyBiYXNlZCBvblxuICAgICAqICAgICAgICB0aGlzIGNoYW5nZS5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0Q2hhbmdlIC0gQSB0YXJnZXQgY2hhbmdlIHRvIGFwcGx5IGZvciBjb21wdXRpbmcgbGltYm8gZG9jcyBhbmRcbiAgICAgKiAgICAgICAgc3luYyBzdGF0ZS5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBWaWV3Q2hhbmdlIHdpdGggdGhlIGdpdmVuIGRvY3MsIGNoYW5nZXMsIGFuZCBzeW5jIHN0YXRlLlxuICAgICAqL1xuICAgIC8vIFBPUlRJTkcgTk9URTogVGhlIGlPUy9BbmRyb2lkIGNsaWVudHMgYWx3YXlzIGNvbXB1dGUgbGltYm8gZG9jdW1lbnQgY2hhbmdlcy5cbiAgICBhcHBseUNoYW5nZXModCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gdGhpcy5GYTtcbiAgICAgICAgdGhpcy5GYSA9IHQuRmEsIHRoaXMubXV0YXRlZEtleXMgPSB0Lm11dGF0ZWRLZXlzO1xuICAgICAgICAvLyBTb3J0IGNoYW5nZXMgYmFzZWQgb24gdHlwZSBhbmQgcXVlcnkgY29tcGFyYXRvclxuICAgICAgICBjb25zdCBpID0gdC5xYS55YSgpO1xuICAgICAgICBpLnNvcnQoKCh0LCBlKSA9PiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdCA9PiB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0KSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIDAgLyogQWRkZWQgKi8gOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTtcblxuICAgICAgICAgICAgICAgICAgY2FzZSAyIC8qIE1vZGlmaWVkICovIDpcbiAgICAgICAgICAgICAgICAgIGNhc2UgMyAvKiBNZXRhZGF0YSAqLyA6XG4gICAgICAgICAgICAgICAgICAgIC8vIEEgbWV0YWRhdGEgY2hhbmdlIGlzIGNvbnZlcnRlZCB0byBhIG1vZGlmaWVkIGNoYW5nZSBhdCB0aGUgcHVibGljXG4gICAgICAgICAgICAgICAgICAgIC8vIGFwaSBsYXllci4gIFNpbmNlIHdlIHNvcnQgYnkgZG9jdW1lbnQga2V5IGFuZCB0aGVuIGNoYW5nZSB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAvLyBtZXRhZGF0YSBhbmQgbW9kaWZpZWQgY2hhbmdlcyBtdXN0IGJlIHNvcnRlZCBlcXVpdmFsZW50bHkuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAyO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIDEgLyogUmVtb3ZlZCAqLyA6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuXG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gTCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gbih0KSAtIG4oZSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gKHQudHlwZSwgZS50eXBlKSB8fCB0aGlzLiRhKHQuZG9jLCBlLmRvYykpKSwgdGhpcy5LYShuKTtcbiAgICAgICAgY29uc3QgciA9IGUgPyB0aGlzLkdhKCkgOiBbXSwgbyA9IDAgPT09IHRoaXMuT2Euc2l6ZSAmJiB0aGlzLmN1cnJlbnQgPyAxIC8qIFN5bmNlZCAqLyA6IDAgLyogTG9jYWwgKi8gLCBhID0gbyAhPT0gdGhpcy5NYTtcbiAgICAgICAgaWYgKHRoaXMuTWEgPSBvLCAwICE9PSBpLmxlbmd0aCB8fCBhKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHNuYXBzaG90OiBuZXcgRWEodGhpcy5xdWVyeSwgdC5GYSwgcywgaSwgdC5tdXRhdGVkS2V5cywgMCAvKiBMb2NhbCAqLyA9PT0gbywgYSwgXG4gICAgICAgICAgICAgICAgLyogZXhjbHVkZXNNZXRhZGF0YUNoYW5nZXM9ICovICExKSxcbiAgICAgICAgICAgICAgICBRYTogclxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBubyBjaGFuZ2VzXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBRYTogclxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIGFuIE9ubGluZVN0YXRlIGNoYW5nZSB0byB0aGUgdmlldywgcG90ZW50aWFsbHkgZ2VuZXJhdGluZyBhXG4gICAgICogVmlld0NoYW5nZSBpZiB0aGUgdmlldydzIHN5bmNTdGF0ZSBjaGFuZ2VzIGFzIGEgcmVzdWx0LlxuICAgICAqLyAgICBUYSh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQgJiYgXCJPZmZsaW5lXCIgLyogT2ZmbGluZSAqLyA9PT0gdCA/IChcbiAgICAgICAgLy8gSWYgd2UncmUgb2ZmbGluZSwgc2V0IGBjdXJyZW50YCB0byBmYWxzZSBhbmQgdGhlbiBjYWxsIGFwcGx5Q2hhbmdlcygpXG4gICAgICAgIC8vIHRvIHJlZnJlc2ggb3VyIHN5bmNTdGF0ZSBhbmQgZ2VuZXJhdGUgYSBWaWV3Q2hhbmdlIGFzIGFwcHJvcHJpYXRlLiBXZVxuICAgICAgICAvLyBhcmUgZ3VhcmFudGVlZCB0byBnZXQgYSBuZXcgVGFyZ2V0Q2hhbmdlIHRoYXQgc2V0cyBgY3VycmVudGAgYmFjayB0b1xuICAgICAgICAvLyB0cnVlIG9uY2UgdGhlIGNsaWVudCBpcyBiYWNrIG9ubGluZS5cbiAgICAgICAgdGhpcy5jdXJyZW50ID0gITEsIHRoaXMuYXBwbHlDaGFuZ2VzKHtcbiAgICAgICAgICAgIEZhOiB0aGlzLkZhLFxuICAgICAgICAgICAgcWE6IG5ldyBUYSxcbiAgICAgICAgICAgIG11dGF0ZWRLZXlzOiB0aGlzLm11dGF0ZWRLZXlzLFxuICAgICAgICAgICAgZWk6ICExXG4gICAgICAgIH0sIFxuICAgICAgICAvKiB1cGRhdGVMaW1ib0RvY3VtZW50cz0gKi8gITEpKSA6IHtcbiAgICAgICAgICAgIFFhOiBbXVxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGRvYyBmb3IgdGhlIGdpdmVuIGtleSBzaG91bGQgYmUgaW4gbGltYm8uXG4gICAgICovICAgIGphKHQpIHtcbiAgICAgICAgLy8gSWYgdGhlIHJlbW90ZSBlbmQgc2F5cyBpdCdzIHBhcnQgb2YgdGhpcyBxdWVyeSwgaXQncyBub3QgaW4gbGltYm8uXG4gICAgICAgIHJldHVybiAhdGhpcy5rYS5oYXModCkgJiYgKFxuICAgICAgICAvLyBUaGUgbG9jYWwgc3RvcmUgZG9lc24ndCB0aGluayBpdCdzIGEgcmVzdWx0LCBzbyBpdCBzaG91bGRuJ3QgYmUgaW4gbGltYm8uXG4gICAgICAgICEhdGhpcy5GYS5oYXModCkgJiYgIXRoaXMuRmEuZ2V0KHQpLmhhc0xvY2FsTXV0YXRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBzeW5jZWREb2N1bWVudHMsIGN1cnJlbnQsIGFuZCBsaW1ibyBkb2NzIGJhc2VkIG9uIHRoZSBnaXZlbiBjaGFuZ2UuXG4gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBjaGFuZ2VzIHRvIHdoaWNoIGRvY3MgYXJlIGluIGxpbWJvLlxuICAgICAqLyAgICBLYSh0KSB7XG4gICAgICAgIHQgJiYgKHQuYWRkZWREb2N1bWVudHMuZm9yRWFjaCgodCA9PiB0aGlzLmthID0gdGhpcy5rYS5hZGQodCkpKSwgdC5tb2RpZmllZERvY3VtZW50cy5mb3JFYWNoKCh0ID0+IHt9KSksIFxuICAgICAgICB0LnJlbW92ZWREb2N1bWVudHMuZm9yRWFjaCgodCA9PiB0aGlzLmthID0gdGhpcy5rYS5kZWxldGUodCkpKSwgdGhpcy5jdXJyZW50ID0gdC5jdXJyZW50KTtcbiAgICB9XG4gICAgR2EoKSB7XG4gICAgICAgIC8vIFdlIGNhbiBvbmx5IGRldGVybWluZSBsaW1ibyBkb2N1bWVudHMgd2hlbiB3ZSdyZSBpbi1zeW5jIHdpdGggdGhlIHNlcnZlci5cbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnQpIHJldHVybiBbXTtcbiAgICAgICAgLy8gVE9ETyhrbGltdCk6IERvIHRoaXMgaW5jcmVtZW50YWxseSBzbyB0aGF0IGl0J3Mgbm90IHF1YWRyYXRpYyB3aGVuXG4gICAgICAgIC8vIHVwZGF0aW5nIG1hbnkgZG9jdW1lbnRzLlxuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLk9hO1xuICAgICAgICB0aGlzLk9hID0gR24oKSwgdGhpcy5GYS5mb3JFYWNoKCh0ID0+IHtcbiAgICAgICAgICAgIHRoaXMuamEodC5rZXkpICYmICh0aGlzLk9hID0gdGhpcy5PYS5hZGQodC5rZXkpKTtcbiAgICAgICAgfSkpO1xuICAgICAgICAvLyBEaWZmIHRoZSBuZXcgbGltYm8gZG9jcyB3aXRoIHRoZSBvbGQgbGltYm8gZG9jcy5cbiAgICAgICAgY29uc3QgZSA9IFtdO1xuICAgICAgICByZXR1cm4gdC5mb3JFYWNoKCh0ID0+IHtcbiAgICAgICAgICAgIHRoaXMuT2EuaGFzKHQpIHx8IGUucHVzaChuZXcgT2EodCkpO1xuICAgICAgICB9KSksIHRoaXMuT2EuZm9yRWFjaCgobiA9PiB7XG4gICAgICAgICAgICB0LmhhcyhuKSB8fCBlLnB1c2gobmV3IE1hKG4pKTtcbiAgICAgICAgfSkpLCBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGluLW1lbW9yeSBzdGF0ZSBvZiB0aGUgY3VycmVudCB2aWV3IHdpdGggdGhlIHN0YXRlIHJlYWQgZnJvbVxuICAgICAqIHBlcnNpc3RlbmNlLlxuICAgICAqXG4gICAgICogV2UgdXBkYXRlIHRoZSBxdWVyeSB2aWV3IHdoZW5ldmVyIGEgY2xpZW50J3MgcHJpbWFyeSBzdGF0dXMgY2hhbmdlczpcbiAgICAgKiAtIFdoZW4gYSBjbGllbnQgdHJhbnNpdGlvbnMgZnJvbSBwcmltYXJ5IHRvIHNlY29uZGFyeSwgaXQgY2FuIG1pc3NcbiAgICAgKiAgIExvY2FsU3RvcmFnZSB1cGRhdGVzIGFuZCBpdHMgcXVlcnkgdmlld3MgbWF5IHRlbXBvcmFyaWx5IG5vdCBiZVxuICAgICAqICAgc3luY2hyb25pemVkIHdpdGggdGhlIHN0YXRlIG9uIGRpc2suXG4gICAgICogLSBGb3Igc2Vjb25kYXJ5IHRvIHByaW1hcnkgdHJhbnNpdGlvbnMsIHRoZSBjbGllbnQgbmVlZHMgdG8gdXBkYXRlIHRoZSBsaXN0XG4gICAgICogICBvZiBgc3luY2VkRG9jdW1lbnRzYCBzaW5jZSBzZWNvbmRhcnkgY2xpZW50cyB1cGRhdGUgdGhlaXIgcXVlcnkgdmlld3NcbiAgICAgKiAgIGJhc2VkIHB1cmVseSBvbiBzeW50aGVzaXplZCBSZW1vdGVFdmVudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcXVlcnlSZXN1bHQuZG9jdW1lbnRzIC0gVGhlIGRvY3VtZW50cyB0aGF0IG1hdGNoIHRoZSBxdWVyeSBhY2NvcmRpbmdcbiAgICAgKiB0byB0aGUgTG9jYWxTdG9yZS5cbiAgICAgKiBAcGFyYW0gcXVlcnlSZXN1bHQucmVtb3RlS2V5cyAtIFRoZSBrZXlzIG9mIHRoZSBkb2N1bWVudHMgdGhhdCBtYXRjaCB0aGVcbiAgICAgKiBxdWVyeSBhY2NvcmRpbmcgdG8gdGhlIGJhY2tlbmQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgVmlld0NoYW5nZSB0aGF0IHJlc3VsdGVkIGZyb20gdGhpcyBzeW5jaHJvbml6YXRpb24uXG4gICAgICovXG4gICAgLy8gUE9SVElORyBOT1RFOiBNdWx0aS10YWIgb25seS5cbiAgICBXYSh0KSB7XG4gICAgICAgIHRoaXMua2EgPSB0LmhpLCB0aGlzLk9hID0gR24oKTtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMuTGEodC5kb2N1bWVudHMpO1xuICAgICAgICByZXR1cm4gdGhpcy5hcHBseUNoYW5nZXMoZSwgLyp1cGRhdGVMaW1ib0RvY3VtZW50cz0qLyAhMCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB2aWV3IHNuYXBzaG90IGFzIGlmIHRoaXMgcXVlcnkgd2FzIGp1c3QgbGlzdGVuZWQgdG8uIENvbnRhaW5zXG4gICAgICogYSBkb2N1bWVudCBhZGQgZm9yIGV2ZXJ5IGV4aXN0aW5nIGRvY3VtZW50IGFuZCB0aGUgYGZyb21DYWNoZWAgYW5kXG4gICAgICogYGhhc1BlbmRpbmdXcml0ZXNgIHN0YXR1cyBvZiB0aGUgYWxyZWFkeSBlc3RhYmxpc2hlZCB2aWV3LlxuICAgICAqL1xuICAgIC8vIFBPUlRJTkcgTk9URTogTXVsdGktdGFiIG9ubHkuXG4gICAgemEoKSB7XG4gICAgICAgIHJldHVybiBFYS5mcm9tSW5pdGlhbERvY3VtZW50cyh0aGlzLnF1ZXJ5LCB0aGlzLkZhLCB0aGlzLm11dGF0ZWRLZXlzLCAwIC8qIExvY2FsICovID09PSB0aGlzLk1hKTtcbiAgICB9XG59XG5cbi8qKlxuICogUXVlcnlWaWV3IGNvbnRhaW5zIGFsbCBvZiB0aGUgZGF0YSB0aGF0IFN5bmNFbmdpbmUgbmVlZHMgdG8ga2VlcCB0cmFjayBvZiBmb3JcbiAqIGEgcGFydGljdWxhciBxdWVyeS5cbiAqL1xuY2xhc3MgRmEge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIFRoZSBxdWVyeSBpdHNlbGYuXG4gICAgICovXG4gICAgdCwgXG4gICAgLyoqXG4gICAgICogVGhlIHRhcmdldCBudW1iZXIgY3JlYXRlZCBieSB0aGUgY2xpZW50IHRoYXQgaXMgdXNlZCBpbiB0aGUgd2F0Y2hcbiAgICAgKiBzdHJlYW0gdG8gaWRlbnRpZnkgdGhpcyBxdWVyeS5cbiAgICAgKi9cbiAgICBlLCBcbiAgICAvKipcbiAgICAgKiBUaGUgdmlldyBpcyByZXNwb25zaWJsZSBmb3IgY29tcHV0aW5nIHRoZSBmaW5hbCBtZXJnZWQgdHJ1dGggb2Ygd2hhdFxuICAgICAqIGRvY3MgYXJlIGluIHRoZSBxdWVyeS4gSXQgZ2V0cyBub3RpZmllZCBvZiBsb2NhbCBhbmQgcmVtb3RlIGNoYW5nZXMsXG4gICAgICogYW5kIGFwcGxpZXMgdGhlIHF1ZXJ5IGZpbHRlcnMgYW5kIGxpbWl0cyB0byBkZXRlcm1pbmUgdGhlIG1vc3QgY29ycmVjdFxuICAgICAqIHBvc3NpYmxlIHJlc3VsdHMuXG4gICAgICovXG4gICAgbikge1xuICAgICAgICB0aGlzLnF1ZXJ5ID0gdCwgdGhpcy50YXJnZXRJZCA9IGUsIHRoaXMudmlldyA9IG47XG4gICAgfVxufVxuXG4vKiogVHJhY2tzIGEgbGltYm8gcmVzb2x1dGlvbi4gKi8gY2xhc3MgQmEge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5rZXkgPSB0LCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldCB0byB0cnVlIG9uY2Ugd2UndmUgcmVjZWl2ZWQgYSBkb2N1bWVudC4gVGhpcyBpcyB1c2VkIGluXG4gICAgICAgICAqIGdldFJlbW90ZUtleXNGb3JUYXJnZXQoKSBhbmQgdWx0aW1hdGVseSB1c2VkIGJ5IFdhdGNoQ2hhbmdlQWdncmVnYXRvciB0b1xuICAgICAgICAgKiBkZWNpZGUgd2hldGhlciBpdCBuZWVkcyB0byBtYW51ZmFjdHVyZSBhIGRlbGV0ZSBldmVudCBmb3IgdGhlIHRhcmdldCBvbmNlXG4gICAgICAgICAqIHRoZSB0YXJnZXQgaXMgQ1VSUkVOVC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuSGEgPSAhMTtcbiAgICB9XG59XG5cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgYFN5bmNFbmdpbmVgIGNvb3JkaW5hdGluZyB3aXRoIG90aGVyIHBhcnRzIG9mIFNESy5cbiAqXG4gKiBUaGUgcGFydHMgb2YgU3luY0VuZ2luZSB0aGF0IGFjdCBhcyBhIGNhbGxiYWNrIHRvIFJlbW90ZVN0b3JlIG5lZWQgdG8gYmVcbiAqIHJlZ2lzdGVyZWQgaW5kaXZpZHVhbGx5LiBUaGlzIGlzIGRvbmUgaW4gYHN5bmNFbmdpbmVXcml0ZSgpYCBhbmRcbiAqIGBzeW5jRW5naW5lTGlzdGVuKClgIChhcyB3ZWxsIGFzIGBhcHBseVByaW1hcnlTdGF0ZSgpYCkgYXMgdGhlc2UgbWV0aG9kc1xuICogc2VydmUgYXMgZW50cnkgcG9pbnRzIHRvIFJlbW90ZVN0b3JlJ3MgZnVuY3Rpb25hbGl0eS5cbiAqXG4gKiBOb3RlOiBzb21lIGZpZWxkIGRlZmluZWQgaW4gdGhpcyBjbGFzcyBtaWdodCBoYXZlIHB1YmxpYyBhY2Nlc3MgbGV2ZWwsIGJ1dFxuICogdGhlIGNsYXNzIGlzIG5vdCBleHBvcnRlZCBzbyB0aGV5IGFyZSBvbmx5IGFjY2Vzc2libGUgZnJvbSB0aGlzIG1vZHVsZS5cbiAqIFRoaXMgaXMgdXNlZnVsIHRvIGltcGxlbWVudCBvcHRpb25hbCBmZWF0dXJlcyAobGlrZSBidW5kbGVzKSBpbiBmcmVlXG4gKiBmdW5jdGlvbnMsIHN1Y2ggdGhhdCB0aGV5IGFyZSB0cmVlLXNoYWtlYWJsZS5cbiAqLyBjbGFzcyBMYSB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgXG4gICAgLy8gUE9SVElORyBOT1RFOiBNYW5hZ2VzIHN0YXRlIHN5bmNocm9uaXphdGlvbiBpbiBtdWx0aS10YWIgZW52aXJvbm1lbnRzLlxuICAgIHMsIGksIHIpIHtcbiAgICAgICAgdGhpcy5sb2NhbFN0b3JlID0gdCwgdGhpcy5yZW1vdGVTdG9yZSA9IGUsIHRoaXMuZXZlbnRNYW5hZ2VyID0gbiwgdGhpcy5zaGFyZWRDbGllbnRTdGF0ZSA9IHMsIFxuICAgICAgICB0aGlzLmN1cnJlbnRVc2VyID0gaSwgdGhpcy5tYXhDb25jdXJyZW50TGltYm9SZXNvbHV0aW9ucyA9IHIsIHRoaXMuSmEgPSB7fSwgdGhpcy5ZYSA9IG5ldyBEbigodCA9PiBMZSh0KSksIEJlKSwgXG4gICAgICAgIHRoaXMuWGEgPSBuZXcgTWFwLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBrZXlzIG9mIGRvY3VtZW50cyB0aGF0IGFyZSBpbiBsaW1ibyBmb3Igd2hpY2ggd2UgaGF2ZW4ndCB5ZXQgc3RhcnRlZCBhXG4gICAgICAgICAqIGxpbWJvIHJlc29sdXRpb24gcXVlcnkuIFRoZSBzdHJpbmdzIGluIHRoaXMgc2V0IGFyZSB0aGUgcmVzdWx0IG9mIGNhbGxpbmdcbiAgICAgICAgICogYGtleS5wYXRoLmNhbm9uaWNhbFN0cmluZygpYCB3aGVyZSBga2V5YCBpcyBhIGBEb2N1bWVudEtleWAgb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgYFNldGAgdHlwZSB3YXMgY2hvc2VuIGJlY2F1c2UgaXQgcHJvdmlkZXMgZWZmaWNpZW50IGxvb2t1cCBhbmQgcmVtb3ZhbFxuICAgICAgICAgKiBvZiBhcmJpdHJhcnkgZWxlbWVudHMgYW5kIGl0IGFsc28gbWFpbnRhaW5zIGluc2VydGlvbiBvcmRlciwgcHJvdmlkaW5nIHRoZVxuICAgICAgICAgKiBkZXNpcmVkIHF1ZXVlLWxpa2UgRklGTyBzZW1hbnRpY3MuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLlphID0gbmV3IFNldCwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBLZWVwcyB0cmFjayBvZiB0aGUgdGFyZ2V0IElEIGZvciBlYWNoIGRvY3VtZW50IHRoYXQgaXMgaW4gbGltYm8gd2l0aCBhblxuICAgICAgICAgKiBhY3RpdmUgdGFyZ2V0LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50dSA9IG5ldyBDbih4dC5jb21wYXJhdG9yKSwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBLZWVwcyB0cmFjayBvZiB0aGUgaW5mb3JtYXRpb24gYWJvdXQgYW4gYWN0aXZlIGxpbWJvIHJlc29sdXRpb24gZm9yIGVhY2hcbiAgICAgICAgICogYWN0aXZlIHRhcmdldCBJRCB0aGF0IHdhcyBzdGFydGVkIGZvciB0aGUgcHVycG9zZSBvZiBsaW1ibyByZXNvbHV0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5ldSA9IG5ldyBNYXAsIHRoaXMubnUgPSBuZXcgY28sIFxuICAgICAgICAvKiogU3RvcmVzIHVzZXIgY29tcGxldGlvbiBoYW5kbGVycywgaW5kZXhlZCBieSBVc2VyIGFuZCBCYXRjaElkLiAqL1xuICAgICAgICB0aGlzLnN1ID0ge30sIFxuICAgICAgICAvKiogU3RvcmVzIHVzZXIgY2FsbGJhY2tzIHdhaXRpbmcgZm9yIGFsbCBwZW5kaW5nIHdyaXRlcyB0byBiZSBhY2tub3dsZWRnZWQuICovXG4gICAgICAgIHRoaXMuaXUgPSBuZXcgTWFwLCB0aGlzLnJ1ID0gbXIuZ24oKSwgdGhpcy5vbmxpbmVTdGF0ZSA9IFwiVW5rbm93blwiIC8qIFVua25vd24gKi8gLCBcbiAgICAgICAgLy8gVGhlIHByaW1hcnkgc3RhdGUgaXMgc2V0IHRvIGB0cnVlYCBvciBgZmFsc2VgIGltbWVkaWF0ZWx5IGFmdGVyIEZpcmVzdG9yZVxuICAgICAgICAvLyBzdGFydHVwLiBJbiB0aGUgaW50ZXJpbSwgYSBjbGllbnQgc2hvdWxkIG9ubHkgYmUgY29uc2lkZXJlZCBwcmltYXJ5IGlmXG4gICAgICAgIC8vIGBpc1ByaW1hcnlgIGlzIHRydWUuXG4gICAgICAgIHRoaXMub3UgPSB2b2lkIDA7XG4gICAgfVxuICAgIGdldCBpc1ByaW1hcnlDbGllbnQoKSB7XG4gICAgICAgIHJldHVybiAhMCA9PT0gdGhpcy5vdTtcbiAgICB9XG59XG5cbi8qKlxuICogSW5pdGlhdGVzIHRoZSBuZXcgbGlzdGVuLCByZXNvbHZlcyBwcm9taXNlIHdoZW4gbGlzdGVuIGVucXVldWVkIHRvIHRoZVxuICogc2VydmVyLiBBbGwgdGhlIHN1YnNlcXVlbnQgdmlldyBzbmFwc2hvdHMgb3IgZXJyb3JzIGFyZSBzZW50IHRvIHRoZVxuICogc3Vic2NyaWJlZCBoYW5kbGVycy4gUmV0dXJucyB0aGUgaW5pdGlhbCBzbmFwc2hvdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcWEodCwgZSkge1xuICAgIGNvbnN0IG4gPSBtdSh0KTtcbiAgICBsZXQgcywgaTtcbiAgICBjb25zdCByID0gbi5ZYS5nZXQoZSk7XG4gICAgaWYgKHIpIFxuICAgIC8vIFBPUlRJTkcgTk9URTogV2l0aCBNdWx0aS1UYWIgV2ViLCBpdCBpcyBwb3NzaWJsZSB0aGF0IGEgcXVlcnkgdmlld1xuICAgIC8vIGFscmVhZHkgZXhpc3RzIHdoZW4gRXZlbnRNYW5hZ2VyIGNhbGxzIHVzIGZvciB0aGUgZmlyc3QgdGltZS4gVGhpc1xuICAgIC8vIGhhcHBlbnMgd2hlbiB0aGUgcHJpbWFyeSB0YWIgaXMgYWxyZWFkeSBsaXN0ZW5pbmcgdG8gdGhpcyBxdWVyeSBvblxuICAgIC8vIGJlaGFsZiBvZiBhbm90aGVyIHRhYiBhbmQgdGhlIHVzZXIgb2YgdGhlIHByaW1hcnkgYWxzbyBzdGFydHMgbGlzdGVuaW5nXG4gICAgLy8gdG8gdGhlIHF1ZXJ5LiBFdmVudE1hbmFnZXIgd2lsbCBub3QgaGF2ZSBhbiBhc3NpZ25lZCB0YXJnZXQgSUQgaW4gdGhpc1xuICAgIC8vIGNhc2UgYW5kIGNhbGxzIGBsaXN0ZW5gIHRvIG9idGFpbiB0aGlzIElELlxuICAgIHMgPSByLnRhcmdldElkLCBuLnNoYXJlZENsaWVudFN0YXRlLmFkZExvY2FsUXVlcnlUYXJnZXQocyksIGkgPSByLnZpZXcuemEoKTsgZWxzZSB7XG4gICAgICAgIGNvbnN0IHQgPSBhd2FpdCBacihuLmxvY2FsU3RvcmUsICRlKGUpKTtcbiAgICAgICAgbi5pc1ByaW1hcnlDbGllbnQgJiYgam8obi5yZW1vdGVTdG9yZSwgdCk7XG4gICAgICAgIGNvbnN0IHIgPSBuLnNoYXJlZENsaWVudFN0YXRlLmFkZExvY2FsUXVlcnlUYXJnZXQodC50YXJnZXRJZCk7XG4gICAgICAgIHMgPSB0LnRhcmdldElkLCBpID0gYXdhaXQgVWEobiwgZSwgcywgXCJjdXJyZW50XCIgPT09IHIpO1xuICAgIH1cbiAgICByZXR1cm4gaTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSB2aWV3IGZvciBhIHByZXZpb3VzbHkgdW5rbm93biBxdWVyeSBhbmQgY29tcHV0ZXMgaXRzIGluaXRpYWxcbiAqIHNuYXBzaG90LlxuICovIGFzeW5jIGZ1bmN0aW9uIFVhKHQsIGUsIG4sIHMpIHtcbiAgICAvLyBQT1JUSU5HIE5PVEU6IE9uIFdlYiBvbmx5LCB3ZSBpbmplY3QgdGhlIGNvZGUgdGhhdCByZWdpc3RlcnMgbmV3IExpbWJvXG4gICAgLy8gdGFyZ2V0cyBiYXNlZCBvbiB2aWV3IGNoYW5nZXMuIFRoaXMgYWxsb3dzIHVzIHRvIG9ubHkgZGVwZW5kIG9uIExpbWJvXG4gICAgLy8gY2hhbmdlcyB3aGVuIHVzZXIgY29kZSBpbmNsdWRlcyBxdWVyaWVzLlxuICAgIHQuYXUgPSAoZSwgbiwgcykgPT4gYXN5bmMgZnVuY3Rpb24odCwgZSwgbiwgcykge1xuICAgICAgICBsZXQgaSA9IGUudmlldy5MYShuKTtcbiAgICAgICAgaS5laSAmJiAoXG4gICAgICAgIC8vIFRoZSBxdWVyeSBoYXMgYSBsaW1pdCBhbmQgc29tZSBkb2NzIHdlcmUgcmVtb3ZlZCwgc28gd2UgbmVlZFxuICAgICAgICAvLyB0byByZS1ydW4gdGhlIHF1ZXJ5IGFnYWluc3QgdGhlIGxvY2FsIHN0b3JlIHRvIG1ha2Ugc3VyZSB3ZVxuICAgICAgICAvLyBkaWRuJ3QgbG9zZSBhbnkgZ29vZCBkb2NzIHRoYXQgaGFkIGJlZW4gcGFzdCB0aGUgbGltaXQuXG4gICAgICAgIGkgPSBhd2FpdCBlbyh0LmxvY2FsU3RvcmUsIGUucXVlcnksIFxuICAgICAgICAvKiB1c2VQcmV2aW91c1Jlc3VsdHM9ICovICExKS50aGVuKCgoe2RvY3VtZW50czogdH0pID0+IGUudmlldy5MYSh0LCBpKSkpKTtcbiAgICAgICAgY29uc3QgciA9IHMgJiYgcy50YXJnZXRDaGFuZ2VzLmdldChlLnRhcmdldElkKSwgbyA9IGUudmlldy5hcHBseUNoYW5nZXMoaSwgXG4gICAgICAgIC8qIHVwZGF0ZUxpbWJvRG9jdW1lbnRzPSAqLyB0LmlzUHJpbWFyeUNsaWVudCwgcik7XG4gICAgICAgIHJldHVybiBldSh0LCBlLnRhcmdldElkLCBvLlFhKSwgby5zbmFwc2hvdDtcbiAgICB9KHQsIGUsIG4sIHMpO1xuICAgIGNvbnN0IGkgPSBhd2FpdCBlbyh0LmxvY2FsU3RvcmUsIGUsIFxuICAgIC8qIHVzZVByZXZpb3VzUmVzdWx0cz0gKi8gITApLCByID0gbmV3ICRhKGUsIGkuaGkpLCBvID0gci5MYShpLmRvY3VtZW50cyksIGEgPSB6bi5jcmVhdGVTeW50aGVzaXplZFRhcmdldENoYW5nZUZvckN1cnJlbnRDaGFuZ2UobiwgcyAmJiBcIk9mZmxpbmVcIiAvKiBPZmZsaW5lICovICE9PSB0Lm9ubGluZVN0YXRlKSwgdSA9IHIuYXBwbHlDaGFuZ2VzKG8sIFxuICAgIC8qIHVwZGF0ZUxpbWJvRG9jdW1lbnRzPSAqLyB0LmlzUHJpbWFyeUNsaWVudCwgYSk7XG4gICAgZXUodCwgbiwgdS5RYSk7XG4gICAgY29uc3QgYyA9IG5ldyBGYShlLCBuLCByKTtcbiAgICByZXR1cm4gdC5ZYS5zZXQoZSwgYyksIHQuWGEuaGFzKG4pID8gdC5YYS5nZXQobikucHVzaChlKSA6IHQuWGEuc2V0KG4sIFsgZSBdKSwgdS5zbmFwc2hvdDtcbn1cblxuLyoqIFN0b3BzIGxpc3RlbmluZyB0byB0aGUgcXVlcnkuICovIGFzeW5jIGZ1bmN0aW9uIEthKHQsIGUpIHtcbiAgICBjb25zdCBuID0gSyh0KSwgcyA9IG4uWWEuZ2V0KGUpLCBpID0gbi5YYS5nZXQocy50YXJnZXRJZCk7XG4gICAgaWYgKGkubGVuZ3RoID4gMSkgcmV0dXJuIG4uWGEuc2V0KHMudGFyZ2V0SWQsIGkuZmlsdGVyKCh0ID0+ICFCZSh0LCBlKSkpKSwgdm9pZCBuLllhLmRlbGV0ZShlKTtcbiAgICAvLyBObyBvdGhlciBxdWVyaWVzIGFyZSBtYXBwZWQgdG8gdGhlIHRhcmdldCwgY2xlYW4gdXAgdGhlIHF1ZXJ5IGFuZCB0aGUgdGFyZ2V0LlxuICAgICAgICBpZiAobi5pc1ByaW1hcnlDbGllbnQpIHtcbiAgICAgICAgLy8gV2UgbmVlZCB0byByZW1vdmUgdGhlIGxvY2FsIHF1ZXJ5IHRhcmdldCBmaXJzdCB0byBhbGxvdyB1cyB0byB2ZXJpZnlcbiAgICAgICAgLy8gd2hldGhlciBhbnkgb3RoZXIgY2xpZW50IGlzIHN0aWxsIGludGVyZXN0ZWQgaW4gdGhpcyB0YXJnZXQuXG4gICAgICAgIG4uc2hhcmVkQ2xpZW50U3RhdGUucmVtb3ZlTG9jYWxRdWVyeVRhcmdldChzLnRhcmdldElkKTtcbiAgICAgICAgbi5zaGFyZWRDbGllbnRTdGF0ZS5pc0FjdGl2ZVF1ZXJ5VGFyZ2V0KHMudGFyZ2V0SWQpIHx8IGF3YWl0IHRvKG4ubG9jYWxTdG9yZSwgcy50YXJnZXRJZCwgXG4gICAgICAgIC8qa2VlcFBlcnNpc3RlZFRhcmdldERhdGE9Ki8gITEpLnRoZW4oKCgpID0+IHtcbiAgICAgICAgICAgIG4uc2hhcmVkQ2xpZW50U3RhdGUuY2xlYXJRdWVyeVN0YXRlKHMudGFyZ2V0SWQpLCBXbyhuLnJlbW90ZVN0b3JlLCBzLnRhcmdldElkKSwgXG4gICAgICAgICAgICBaYShuLCBzLnRhcmdldElkKTtcbiAgICAgICAgfSkpLmNhdGNoKFRyKTtcbiAgICB9IGVsc2UgWmEobiwgcy50YXJnZXRJZCksIGF3YWl0IHRvKG4ubG9jYWxTdG9yZSwgcy50YXJnZXRJZCwgXG4gICAgLyprZWVwUGVyc2lzdGVkVGFyZ2V0RGF0YT0qLyAhMCk7XG59XG5cbi8qKlxuICogSW5pdGlhdGVzIHRoZSB3cml0ZSBvZiBsb2NhbCBtdXRhdGlvbiBiYXRjaCB3aGljaCBpbnZvbHZlcyBhZGRpbmcgdGhlXG4gKiB3cml0ZXMgdG8gdGhlIG11dGF0aW9uIHF1ZXVlLCBub3RpZnlpbmcgdGhlIHJlbW90ZSBzdG9yZSBhYm91dCBuZXdcbiAqIG11dGF0aW9ucyBhbmQgcmFpc2luZyBldmVudHMgZm9yIGFueSBjaGFuZ2VzIHRoaXMgd3JpdGUgY2F1c2VkLlxuICpcbiAqIFRoZSBwcm9taXNlIHJldHVybmVkIGJ5IHRoaXMgY2FsbCBpcyByZXNvbHZlZCB3aGVuIHRoZSBhYm92ZSBzdGVwc1xuICogaGF2ZSBjb21wbGV0ZWQsICpub3QqIHdoZW4gdGhlIHdyaXRlIHdhcyBhY2tlZCBieSB0aGUgYmFja2VuZC4gVGhlXG4gKiB1c2VyQ2FsbGJhY2sgaXMgcmVzb2x2ZWQgb25jZSB0aGUgd3JpdGUgd2FzIGFja2VkL3JlamVjdGVkIGJ5IHRoZVxuICogYmFja2VuZCAob3IgZmFpbGVkIGxvY2FsbHkgZm9yIGFueSBvdGhlciByZWFzb24pLlxuICovIGFzeW5jIGZ1bmN0aW9uIEdhKHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gZ3UodCk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdCA9IGF3YWl0IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBLKHQpLCBzID0gdXQubm93KCksIGkgPSBlLnJlZHVjZSgoKHQsIGUpID0+IHQuYWRkKGUua2V5KSksIEduKCkpO1xuICAgICAgICAgICAgbGV0IHI7XG4gICAgICAgICAgICByZXR1cm4gbi5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIkxvY2FsbHkgd3JpdGUgbXV0YXRpb25zXCIsIFwicmVhZHdyaXRlXCIsICh0ID0+IG4udWkuVXModCwgaSkubmV4dCgoaSA9PiB7XG4gICAgICAgICAgICAgICAgciA9IGk7XG4gICAgICAgICAgICAgICAgLy8gRm9yIG5vbi1pZGVtcG90ZW50IG11dGF0aW9ucyAoc3VjaCBhcyBgRmllbGRWYWx1ZS5pbmNyZW1lbnQoKWApLFxuICAgICAgICAgICAgICAgIC8vIHdlIHJlY29yZCB0aGUgYmFzZSBzdGF0ZSBpbiBhIHNlcGFyYXRlIHBhdGNoIG11dGF0aW9uLiBUaGlzIGlzXG4gICAgICAgICAgICAgICAgLy8gbGF0ZXIgdXNlZCB0byBndWFyYW50ZWUgY29uc2lzdGVudCB2YWx1ZXMgYW5kIHByZXZlbnRzIGZsaWNrZXJcbiAgICAgICAgICAgICAgICAvLyBldmVuIGlmIHRoZSBiYWNrZW5kIHNlbmRzIHVzIGFuIHVwZGF0ZSB0aGF0IGFscmVhZHkgaW5jbHVkZXMgb3VyXG4gICAgICAgICAgICAgICAgLy8gdHJhbnNmb3JtLlxuICAgICAgICAgICAgICAgIGNvbnN0IG8gPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gd24odCwgci5nZXQodC5rZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSBlICYmIFxuICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBUaGUgYmFzZSBzdGF0ZSBzaG91bGQgb25seSBiZSBhcHBsaWVkIGlmIHRoZXJlJ3Mgc29tZVxuICAgICAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBkb2N1bWVudCB0byBvdmVycmlkZSwgc28gdXNlIGEgUHJlY29uZGl0aW9uIG9mXG4gICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0cz10cnVlXG4gICAgICAgICAgICAgICAgICAgIG8ucHVzaChuZXcgcG4odC5rZXksIGUsIFp0KGUudmFsdWUubWFwVmFsdWUpLCBobi5leGlzdHMoITApKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuLkZzLmFkZE11dGF0aW9uQmF0Y2godCwgcywgbywgZSk7XG4gICAgICAgICAgICB9KSkpKS50aGVuKCh0ID0+ICh0LmFwcGx5VG9Mb2NhbERvY3VtZW50U2V0KHIpLCB7XG4gICAgICAgICAgICAgICAgYmF0Y2hJZDogdC5iYXRjaElkLFxuICAgICAgICAgICAgICAgIGNoYW5nZXM6IHJcbiAgICAgICAgICAgIH0pKSk7XG4gICAgICAgIH0ocy5sb2NhbFN0b3JlLCBlKTtcbiAgICAgICAgcy5zaGFyZWRDbGllbnRTdGF0ZS5hZGRQZW5kaW5nTXV0YXRpb24odC5iYXRjaElkKSwgZnVuY3Rpb24odCwgZSwgbikge1xuICAgICAgICAgICAgbGV0IHMgPSB0LnN1W3QuY3VycmVudFVzZXIudG9LZXkoKV07XG4gICAgICAgICAgICBzIHx8IChzID0gbmV3IENuKHJ0KSk7XG4gICAgICAgICAgICBzID0gcy5pbnNlcnQoZSwgbiksIHQuc3VbdC5jdXJyZW50VXNlci50b0tleSgpXSA9IHM7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gKiBSZXNvbHZlcyBvciByZWplY3RzIHRoZSB1c2VyIGNhbGxiYWNrIGZvciB0aGUgZ2l2ZW4gYmF0Y2ggYW5kIHRoZW4gZGlzY2FyZHNcbiAqIGl0LlxuICovIChzLCB0LmJhdGNoSWQsIG4pLCBhd2FpdCBpdShzLCB0LmNoYW5nZXMpLCBhd2FpdCByYShzLnJlbW90ZVN0b3JlKTtcbiAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgIC8vIElmIHdlIGNhbid0IHBlcnNpc3QgdGhlIG11dGF0aW9uLCB3ZSByZWplY3QgdGhlIHVzZXIgY2FsbGJhY2sgYW5kXG4gICAgICAgIC8vIGRvbid0IHNlbmQgdGhlIG11dGF0aW9uLiBUaGUgdXNlciBjYW4gdGhlbiByZXRyeSB0aGUgd3JpdGUuXG4gICAgICAgIGNvbnN0IGUgPSBwYSh0LCBcIkZhaWxlZCB0byBwZXJzaXN0IHdyaXRlXCIpO1xuICAgICAgICBuLnJlamVjdChlKTtcbiAgICB9XG59XG5cbi8qKlxuICogQXBwbGllcyBvbmUgcmVtb3RlIGV2ZW50IHRvIHRoZSBzeW5jIGVuZ2luZSwgbm90aWZ5aW5nIGFueSB2aWV3cyBvZiB0aGVcbiAqIGNoYW5nZXMsIGFuZCByZWxlYXNpbmcgYW55IHBlbmRpbmcgbXV0YXRpb24gYmF0Y2hlcyB0aGF0IHdvdWxkIGJlY29tZVxuICogdmlzaWJsZSBiZWNhdXNlIG9mIHRoZSBzbmFwc2hvdCB2ZXJzaW9uIHRoZSByZW1vdGUgZXZlbnQgY29udGFpbnMuXG4gKi8gYXN5bmMgZnVuY3Rpb24gUWEodCwgZSkge1xuICAgIGNvbnN0IG4gPSBLKHQpO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHQgPSBhd2FpdCBKcihuLmxvY2FsU3RvcmUsIGUpO1xuICAgICAgICAvLyBVcGRhdGUgYHJlY2VpdmVkRG9jdW1lbnRgIGFzIGFwcHJvcHJpYXRlIGZvciBhbnkgbGltYm8gdGFyZ2V0cy5cbiAgICAgICAgICAgICAgICBlLnRhcmdldENoYW5nZXMuZm9yRWFjaCgoKHQsIGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBuLmV1LmdldChlKTtcbiAgICAgICAgICAgIHMgJiYgKFxuICAgICAgICAgICAgLy8gU2luY2UgdGhpcyBpcyBhIGxpbWJvIHJlc29sdXRpb24gbG9va3VwLCBpdCdzIGZvciBhIHNpbmdsZSBkb2N1bWVudFxuICAgICAgICAgICAgLy8gYW5kIGl0IGNvdWxkIGJlIGFkZGVkLCBtb2RpZmllZCwgb3IgcmVtb3ZlZCwgYnV0IG5vdCBhIGNvbWJpbmF0aW9uLlxuICAgICAgICAgICAgcSh0LmFkZGVkRG9jdW1lbnRzLnNpemUgKyB0Lm1vZGlmaWVkRG9jdW1lbnRzLnNpemUgKyB0LnJlbW92ZWREb2N1bWVudHMuc2l6ZSA8PSAxKSwgXG4gICAgICAgICAgICB0LmFkZGVkRG9jdW1lbnRzLnNpemUgPiAwID8gcy5IYSA9ICEwIDogdC5tb2RpZmllZERvY3VtZW50cy5zaXplID4gMCA/IHEocy5IYSkgOiB0LnJlbW92ZWREb2N1bWVudHMuc2l6ZSA+IDAgJiYgKHEocy5IYSksIFxuICAgICAgICAgICAgcy5IYSA9ICExKSk7XG4gICAgICAgIH0pKSwgYXdhaXQgaXUobiwgdCwgZSk7XG4gICAgfSBjYXRjaCAodCkge1xuICAgICAgICBhd2FpdCBUcih0KTtcbiAgICB9XG59XG5cbi8qKlxuICogQXBwbGllcyBhbiBPbmxpbmVTdGF0ZSBjaGFuZ2UgdG8gdGhlIHN5bmMgZW5naW5lIGFuZCBub3RpZmllcyBhbnkgdmlld3Mgb2ZcbiAqIHRoZSBjaGFuZ2UuXG4gKi8gZnVuY3Rpb24gamEodCwgZSwgbikge1xuICAgIGNvbnN0IHMgPSBLKHQpO1xuICAgIC8vIElmIHdlIGFyZSB0aGUgc2Vjb25kYXJ5IGNsaWVudCwgd2UgZXhwbGljaXRseSBpZ25vcmUgdGhlIHJlbW90ZSBzdG9yZSdzXG4gICAgLy8gb25saW5lIHN0YXRlICh0aGUgbG9jYWwgY2xpZW50IG1heSBnbyBvZmZsaW5lLCBldmVuIHRob3VnaCB0aGUgcHJpbWFyeVxuICAgIC8vIHRhYiByZW1haW5zIG9ubGluZSkgYW5kIG9ubHkgYXBwbHkgdGhlIHByaW1hcnkgdGFiJ3Mgb25saW5lIHN0YXRlIGZyb21cbiAgICAvLyBTaGFyZWRDbGllbnRTdGF0ZS5cbiAgICAgICAgaWYgKHMuaXNQcmltYXJ5Q2xpZW50ICYmIDAgLyogUmVtb3RlU3RvcmUgKi8gPT09IG4gfHwgIXMuaXNQcmltYXJ5Q2xpZW50ICYmIDEgLyogU2hhcmVkQ2xpZW50U3RhdGUgKi8gPT09IG4pIHtcbiAgICAgICAgY29uc3QgdCA9IFtdO1xuICAgICAgICBzLllhLmZvckVhY2goKChuLCBzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpID0gcy52aWV3LlRhKGUpO1xuICAgICAgICAgICAgaS5zbmFwc2hvdCAmJiB0LnB1c2goaS5zbmFwc2hvdCk7XG4gICAgICAgIH0pKSwgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IEsodCk7XG4gICAgICAgICAgICBuLm9ubGluZVN0YXRlID0gZTtcbiAgICAgICAgICAgIGxldCBzID0gITE7XG4gICAgICAgICAgICBuLnF1ZXJpZXMuZm9yRWFjaCgoKHQsIG4pID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2Ygbi5saXN0ZW5lcnMpIFxuICAgICAgICAgICAgICAgIC8vIFJ1biBnbG9iYWwgc25hcHNob3QgbGlzdGVuZXJzIGlmIGEgY29uc2lzdGVudCBzbmFwc2hvdCBoYXMgYmVlbiBlbWl0dGVkLlxuICAgICAgICAgICAgICAgIHQuVGEoZSkgJiYgKHMgPSAhMCk7XG4gICAgICAgICAgICB9KSksIHMgJiYgU2Eobik7XG4gICAgICAgIH0ocy5ldmVudE1hbmFnZXIsIGUpLCB0Lmxlbmd0aCAmJiBzLkphLktvKHQpLCBzLm9ubGluZVN0YXRlID0gZSwgcy5pc1ByaW1hcnlDbGllbnQgJiYgcy5zaGFyZWRDbGllbnRTdGF0ZS5zZXRPbmxpbmVTdGF0ZShlKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmVqZWN0cyB0aGUgbGlzdGVuIGZvciB0aGUgZ2l2ZW4gdGFyZ2V0SUQuIFRoaXMgY2FuIGJlIHRyaWdnZXJlZCBieSB0aGVcbiAqIGJhY2tlbmQgZm9yIGFueSBhY3RpdmUgdGFyZ2V0LlxuICpcbiAqIEBwYXJhbSBzeW5jRW5naW5lIC0gVGhlIHN5bmMgZW5naW5lIGltcGxlbWVudGF0aW9uLlxuICogQHBhcmFtIHRhcmdldElkIC0gVGhlIHRhcmdldElEIGNvcnJlc3BvbmRzIHRvIG9uZSBwcmV2aW91c2x5IGluaXRpYXRlZCBieSB0aGVcbiAqIHVzZXIgYXMgcGFydCBvZiBUYXJnZXREYXRhIHBhc3NlZCB0byBsaXN0ZW4oKSBvbiBSZW1vdGVTdG9yZS5cbiAqIEBwYXJhbSBlcnIgLSBBIGRlc2NyaXB0aW9uIG9mIHRoZSBjb25kaXRpb24gdGhhdCBoYXMgZm9yY2VkIHRoZSByZWplY3Rpb24uXG4gKiBOZWFybHkgYWx3YXlzIHRoaXMgd2lsbCBiZSBhbiBpbmRpY2F0aW9uIHRoYXQgdGhlIHVzZXIgaXMgbm8gbG9uZ2VyXG4gKiBhdXRob3JpemVkIHRvIHNlZSB0aGUgZGF0YSBtYXRjaGluZyB0aGUgdGFyZ2V0LlxuICovIGFzeW5jIGZ1bmN0aW9uIFdhKHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gSyh0KTtcbiAgICAvLyBQT1JUSU5HIE5PVEU6IE11bHRpLXRhYiBvbmx5LlxuICAgICAgICBzLnNoYXJlZENsaWVudFN0YXRlLnVwZGF0ZVF1ZXJ5U3RhdGUoZSwgXCJyZWplY3RlZFwiLCBuKTtcbiAgICBjb25zdCBpID0gcy5ldS5nZXQoZSksIHIgPSBpICYmIGkua2V5O1xuICAgIGlmIChyKSB7XG4gICAgICAgIC8vIFRPRE8oa2xpbXQpOiBXZSByZWFsbHkgb25seSBzaG91bGQgZG8gdGhlIGZvbGxvd2luZyBvbiBwZXJtaXNzaW9uXG4gICAgICAgIC8vIGRlbmllZCBlcnJvcnMsIGJ1dCB3ZSBkb24ndCBoYXZlIHRoZSBjYXVzZSBjb2RlIGhlcmUuXG4gICAgICAgIC8vIEl0J3MgYSBsaW1ibyBkb2MuIENyZWF0ZSBhIHN5bnRoZXRpYyBldmVudCBzYXlpbmcgaXQgd2FzIGRlbGV0ZWQuXG4gICAgICAgIC8vIFRoaXMgaXMga2luZCBvZiBhIGhhY2suIElkZWFsbHksIHdlIHdvdWxkIGhhdmUgYSBtZXRob2QgaW4gdGhlIGxvY2FsXG4gICAgICAgIC8vIHN0b3JlIHRvIHB1cmdlIGEgZG9jdW1lbnQuIEhvd2V2ZXIsIGl0IHdvdWxkIGJlIHRyaWNreSB0byBrZWVwIGFsbCBvZlxuICAgICAgICAvLyB0aGUgbG9jYWwgc3RvcmUncyBpbnZhcmlhbnRzIHdpdGggYW5vdGhlciBtZXRob2QuXG4gICAgICAgIGxldCB0ID0gbmV3IENuKHh0LmNvbXBhcmF0b3IpO1xuICAgICAgICAvLyBUT0RPKGIvMjE3MTg5MjE2KTogVGhpcyBsaW1ibyBkb2N1bWVudCBzaG91bGQgaWRlYWxseSBoYXZlIGEgcmVhZCB0aW1lLFxuICAgICAgICAvLyBzbyB0aGF0IGl0IGlzIHBpY2tlZCB1cCBieSBhbnkgcmVhZC10aW1lIGJhc2VkIHNjYW5zLiBUaGUgYmFja2VuZCxcbiAgICAgICAgLy8gaG93ZXZlciwgZG9lcyBub3Qgc2VuZCBhIHJlYWQgdGltZSBmb3IgdGFyZ2V0IHJlbW92YWxzLlxuICAgICAgICAgICAgICAgIHQgPSB0Lmluc2VydChyLCB0ZS5uZXdOb0RvY3VtZW50KHIsIGN0Lm1pbigpKSk7XG4gICAgICAgIGNvbnN0IG4gPSBHbigpLmFkZChyKSwgaSA9IG5ldyBXbihjdC5taW4oKSwgXG4gICAgICAgIC8qIHRhcmdldENoYW5nZXM9ICovIG5ldyBNYXAsIFxuICAgICAgICAvKiB0YXJnZXRNaXNtYXRjaGVzPSAqLyBuZXcga24ocnQpLCB0LCBuKTtcbiAgICAgICAgYXdhaXQgUWEocywgaSksIFxuICAgICAgICAvLyBTaW5jZSB0aGlzIHF1ZXJ5IGZhaWxlZCwgd2Ugd29uJ3Qgd2FudCB0byBtYW51YWxseSB1bmxpc3RlbiB0byBpdC5cbiAgICAgICAgLy8gV2Ugb25seSByZW1vdmUgaXQgZnJvbSBib29ra2VlcGluZyBhZnRlciB3ZSBzdWNjZXNzZnVsbHkgYXBwbGllZCB0aGVcbiAgICAgICAgLy8gUmVtb3RlRXZlbnQuIElmIGBhcHBseVJlbW90ZUV2ZW50KClgIHRocm93cywgd2Ugd2FudCB0byByZS1saXN0ZW4gdG9cbiAgICAgICAgLy8gdGhpcyBxdWVyeSB3aGVuIHRoZSBSZW1vdGVTdG9yZSByZXN0YXJ0cyB0aGUgV2F0Y2ggc3RyZWFtLCB3aGljaCBzaG91bGRcbiAgICAgICAgLy8gcmUtdHJpZ2dlciB0aGUgdGFyZ2V0IGZhaWx1cmUuXG4gICAgICAgIHMudHUgPSBzLnR1LnJlbW92ZShyKSwgcy5ldS5kZWxldGUoZSksIHN1KHMpO1xuICAgIH0gZWxzZSBhd2FpdCB0byhzLmxvY2FsU3RvcmUsIGUsIFxuICAgIC8qIGtlZXBQZXJzaXN0ZWRUYXJnZXREYXRhICovICExKS50aGVuKCgoKSA9PiBaYShzLCBlLCBuKSkpLmNhdGNoKFRyKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gemEodCwgZSkge1xuICAgIGNvbnN0IG4gPSBLKHQpLCBzID0gZS5iYXRjaC5iYXRjaElkO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHQgPSBhd2FpdCB6cihuLmxvY2FsU3RvcmUsIGUpO1xuICAgICAgICAvLyBUaGUgbG9jYWwgc3RvcmUgbWF5IG9yIG1heSBub3QgYmUgYWJsZSB0byBhcHBseSB0aGUgd3JpdGUgcmVzdWx0IGFuZFxuICAgICAgICAvLyByYWlzZSBldmVudHMgaW1tZWRpYXRlbHkgKGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSB3YXRjaGVyIGlzIGNhdWdodFxuICAgICAgICAvLyB1cCksIHNvIHdlIHJhaXNlIHVzZXIgY2FsbGJhY2tzIGZpcnN0IHNvIHRoYXQgdGhleSBjb25zaXN0ZW50bHkgaGFwcGVuXG4gICAgICAgIC8vIGJlZm9yZSBsaXN0ZW4gZXZlbnRzLlxuICAgICAgICAgICAgICAgIFhhKG4sIHMsIC8qZXJyb3I9Ki8gbnVsbCksIFlhKG4sIHMpLCBuLnNoYXJlZENsaWVudFN0YXRlLnVwZGF0ZU11dGF0aW9uU3RhdGUocywgXCJhY2tub3dsZWRnZWRcIiksIFxuICAgICAgICBhd2FpdCBpdShuLCB0KTtcbiAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgIGF3YWl0IFRyKHQpO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gSGEodCwgZSwgbikge1xuICAgIGNvbnN0IHMgPSBLKHQpO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHQgPSBhd2FpdCBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gSyh0KTtcbiAgICAgICAgICAgIHJldHVybiBuLnBlcnNpc3RlbmNlLnJ1blRyYW5zYWN0aW9uKFwiUmVqZWN0IGJhdGNoXCIsIFwicmVhZHdyaXRlLXByaW1hcnlcIiwgKHQgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBzO1xuICAgICAgICAgICAgICAgIHJldHVybiBuLkZzLmxvb2t1cE11dGF0aW9uQmF0Y2godCwgZSkubmV4dCgoZSA9PiAocShudWxsICE9PSBlKSwgcyA9IGUua2V5cygpLCBuLkZzLnJlbW92ZU11dGF0aW9uQmF0Y2godCwgZSkpKSkubmV4dCgoKCkgPT4gbi5Gcy5wZXJmb3JtQ29uc2lzdGVuY3lDaGVjayh0KSkpLm5leHQoKCgpID0+IG4udWkuVXModCwgcykpKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAqIFJldHVybnMgdGhlIGxhcmdlc3QgKGxhdGVzdCkgYmF0Y2ggaWQgaW4gbXV0YXRpb24gcXVldWUgdGhhdCBpcyBwZW5kaW5nXG4gKiBzZXJ2ZXIgcmVzcG9uc2UuXG4gKlxuICogUmV0dXJucyBgQkFUQ0hJRF9VTktOT1dOYCBpZiB0aGUgcXVldWUgaXMgZW1wdHkuXG4gKi8gKHMubG9jYWxTdG9yZSwgZSk7XG4gICAgICAgIC8vIFRoZSBsb2NhbCBzdG9yZSBtYXkgb3IgbWF5IG5vdCBiZSBhYmxlIHRvIGFwcGx5IHRoZSB3cml0ZSByZXN1bHQgYW5kXG4gICAgICAgIC8vIHJhaXNlIGV2ZW50cyBpbW1lZGlhdGVseSAoZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHdhdGNoZXIgaXMgY2F1Z2h0IHVwKSxcbiAgICAgICAgLy8gc28gd2UgcmFpc2UgdXNlciBjYWxsYmFja3MgZmlyc3Qgc28gdGhhdCB0aGV5IGNvbnNpc3RlbnRseSBoYXBwZW4gYmVmb3JlXG4gICAgICAgIC8vIGxpc3RlbiBldmVudHMuXG4gICAgICAgICAgICAgICAgWGEocywgZSwgbiksIFlhKHMsIGUpLCBzLnNoYXJlZENsaWVudFN0YXRlLnVwZGF0ZU11dGF0aW9uU3RhdGUoZSwgXCJyZWplY3RlZFwiLCBuKSwgXG4gICAgICAgIGF3YWl0IGl1KHMsIHQpO1xuICAgIH0gY2F0Y2ggKG4pIHtcbiAgICAgICAgYXdhaXQgVHIobik7XG4gICAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhIHVzZXIgY2FsbGJhY2sgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBwZW5kaW5nIG11dGF0aW9ucyBhdCB0aGUgbW9tZW50IG9mIGNhbGxpbmdcbiAqIGFyZSBhY2tub3dsZWRnZWQgLlxuICovIGFzeW5jIGZ1bmN0aW9uIEphKHQsIGUpIHtcbiAgICBjb25zdCBuID0gSyh0KTtcbiAgICBYbyhuLnJlbW90ZVN0b3JlKSB8fCBPKFwiU3luY0VuZ2luZVwiLCBcIlRoZSBuZXR3b3JrIGlzIGRpc2FibGVkLiBUaGUgdGFzayByZXR1cm5lZCBieSAnYXdhaXRQZW5kaW5nV3JpdGVzKCknIHdpbGwgbm90IGNvbXBsZXRlIHVudGlsIHRoZSBuZXR3b3JrIGlzIGVuYWJsZWQuXCIpO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHQgPSBhd2FpdCBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBjb25zdCBlID0gSyh0KTtcbiAgICAgICAgICAgIHJldHVybiBlLnBlcnNpc3RlbmNlLnJ1blRyYW5zYWN0aW9uKFwiR2V0IGhpZ2hlc3QgdW5hY2tub3dsZWRnZWQgYmF0Y2ggaWRcIiwgXCJyZWFkb25seVwiLCAodCA9PiBlLkZzLmdldEhpZ2hlc3RVbmFja25vd2xlZGdlZEJhdGNoSWQodCkpKTtcbiAgICAgICAgfShuLmxvY2FsU3RvcmUpO1xuICAgICAgICBpZiAoLTEgPT09IHQpIFxuICAgICAgICAvLyBUcmlnZ2VyIHRoZSBjYWxsYmFjayByaWdodCBhd2F5IGlmIHRoZXJlIGlzIG5vIHBlbmRpbmcgd3JpdGVzIGF0IHRoZSBtb21lbnQuXG4gICAgICAgIHJldHVybiB2b2lkIGUucmVzb2x2ZSgpO1xuICAgICAgICBjb25zdCBzID0gbi5pdS5nZXQodCkgfHwgW107XG4gICAgICAgIHMucHVzaChlKSwgbi5pdS5zZXQodCwgcyk7XG4gICAgfSBjYXRjaCAodCkge1xuICAgICAgICBjb25zdCBuID0gcGEodCwgXCJJbml0aWFsaXphdGlvbiBvZiB3YWl0Rm9yUGVuZGluZ1dyaXRlcygpIG9wZXJhdGlvbiBmYWlsZWRcIik7XG4gICAgICAgIGUucmVqZWN0KG4pO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUcmlnZ2VycyB0aGUgY2FsbGJhY2tzIHRoYXQgYXJlIHdhaXRpbmcgZm9yIHRoaXMgYmF0Y2ggaWQgdG8gZ2V0IGFja25vd2xlZGdlZCBieSBzZXJ2ZXIsXG4gKiBpZiB0aGVyZSBhcmUgYW55LlxuICovIGZ1bmN0aW9uIFlhKHQsIGUpIHtcbiAgICAodC5pdS5nZXQoZSkgfHwgW10pLmZvckVhY2goKHQgPT4ge1xuICAgICAgICB0LnJlc29sdmUoKTtcbiAgICB9KSksIHQuaXUuZGVsZXRlKGUpO1xufVxuXG4vKiogUmVqZWN0IGFsbCBvdXRzdGFuZGluZyBjYWxsYmFja3Mgd2FpdGluZyBmb3IgcGVuZGluZyB3cml0ZXMgdG8gY29tcGxldGUuICovIGZ1bmN0aW9uIFhhKHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gSyh0KTtcbiAgICBsZXQgaSA9IHMuc3Vbcy5jdXJyZW50VXNlci50b0tleSgpXTtcbiAgICAvLyBOT1RFOiBNdXRhdGlvbnMgcmVzdG9yZWQgZnJvbSBwZXJzaXN0ZW5jZSB3b24ndCBoYXZlIGNhbGxiYWNrcywgc28gaXQnc1xuICAgIC8vIG9rYXkgZm9yIHRoZXJlIHRvIGJlIG5vIGNhbGxiYWNrIGZvciB0aGlzIElELlxuICAgICAgICBpZiAoaSkge1xuICAgICAgICBjb25zdCB0ID0gaS5nZXQoZSk7XG4gICAgICAgIHQgJiYgKG4gPyB0LnJlamVjdChuKSA6IHQucmVzb2x2ZSgpLCBpID0gaS5yZW1vdmUoZSkpLCBzLnN1W3MuY3VycmVudFVzZXIudG9LZXkoKV0gPSBpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gWmEodCwgZSwgbiA9IG51bGwpIHtcbiAgICB0LnNoYXJlZENsaWVudFN0YXRlLnJlbW92ZUxvY2FsUXVlcnlUYXJnZXQoZSk7XG4gICAgZm9yIChjb25zdCBzIG9mIHQuWGEuZ2V0KGUpKSB0LllhLmRlbGV0ZShzKSwgbiAmJiB0LkphLnV1KHMsIG4pO1xuICAgIGlmICh0LlhhLmRlbGV0ZShlKSwgdC5pc1ByaW1hcnlDbGllbnQpIHtcbiAgICAgICAgdC5udS5SaShlKS5mb3JFYWNoKChlID0+IHtcbiAgICAgICAgICAgIHQubnUuY29udGFpbnNLZXkoZSkgfHwgXG4gICAgICAgICAgICAvLyBXZSByZW1vdmVkIHRoZSBsYXN0IHJlZmVyZW5jZSBmb3IgdGhpcyBrZXlcbiAgICAgICAgICAgIHR1KHQsIGUpO1xuICAgICAgICB9KSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB0dSh0LCBlKSB7XG4gICAgdC5aYS5kZWxldGUoZS5wYXRoLmNhbm9uaWNhbFN0cmluZygpKTtcbiAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHRhcmdldCBhbHJlYWR5IGdvdCByZW1vdmVkIGJlY2F1c2UgdGhlIHF1ZXJ5IGZhaWxlZC4gSW4gdGhhdCBjYXNlLFxuICAgIC8vIHRoZSBrZXkgd29uJ3QgZXhpc3QgaW4gYGxpbWJvVGFyZ2V0c0J5S2V5YC4gT25seSBkbyB0aGUgY2xlYW51cCBpZiB3ZSBzdGlsbCBoYXZlIHRoZSB0YXJnZXQuXG4gICAgY29uc3QgbiA9IHQudHUuZ2V0KGUpO1xuICAgIG51bGwgIT09IG4gJiYgKFdvKHQucmVtb3RlU3RvcmUsIG4pLCB0LnR1ID0gdC50dS5yZW1vdmUoZSksIHQuZXUuZGVsZXRlKG4pLCBzdSh0KSk7XG59XG5cbmZ1bmN0aW9uIGV1KHQsIGUsIG4pIHtcbiAgICBmb3IgKGNvbnN0IHMgb2YgbikgaWYgKHMgaW5zdGFuY2VvZiBNYSkgdC5udS5hZGRSZWZlcmVuY2Uocy5rZXksIGUpLCBudSh0LCBzKTsgZWxzZSBpZiAocyBpbnN0YW5jZW9mIE9hKSB7XG4gICAgICAgIE8oXCJTeW5jRW5naW5lXCIsIFwiRG9jdW1lbnQgbm8gbG9uZ2VyIGluIGxpbWJvOiBcIiArIHMua2V5KSwgdC5udS5yZW1vdmVSZWZlcmVuY2Uocy5rZXksIGUpO1xuICAgICAgICB0Lm51LmNvbnRhaW5zS2V5KHMua2V5KSB8fCBcbiAgICAgICAgLy8gV2UgcmVtb3ZlZCB0aGUgbGFzdCByZWZlcmVuY2UgZm9yIHRoaXMga2V5XG4gICAgICAgIHR1KHQsIHMua2V5KTtcbiAgICB9IGVsc2UgTCgpO1xufVxuXG5mdW5jdGlvbiBudSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IGUua2V5LCBzID0gbi5wYXRoLmNhbm9uaWNhbFN0cmluZygpO1xuICAgIHQudHUuZ2V0KG4pIHx8IHQuWmEuaGFzKHMpIHx8IChPKFwiU3luY0VuZ2luZVwiLCBcIk5ldyBkb2N1bWVudCBpbiBsaW1ibzogXCIgKyBuKSwgdC5aYS5hZGQocyksIFxuICAgIHN1KHQpKTtcbn1cblxuLyoqXG4gKiBTdGFydHMgbGlzdGVucyBmb3IgZG9jdW1lbnRzIGluIGxpbWJvIHRoYXQgYXJlIGVucXVldWVkIGZvciByZXNvbHV0aW9uLFxuICogc3ViamVjdCB0byBhIG1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnQgcmVzb2x1dGlvbnMuXG4gKlxuICogV2l0aG91dCBib3VuZGluZyB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgcmVzb2x1dGlvbnMsIHRoZSBzZXJ2ZXIgY2FuIGZhaWxcbiAqIHdpdGggXCJyZXNvdXJjZSBleGhhdXN0ZWRcIiBlcnJvcnMgd2hpY2ggY2FuIGxlYWQgdG8gcGF0aG9sb2dpY2FsIGNsaWVudFxuICogYmVoYXZpb3IgYXMgc2VlbiBpbiBodHRwczovL2dpdGh1Yi5jb20vZmlyZWJhc2UvZmlyZWJhc2UtanMtc2RrL2lzc3Vlcy8yNjgzLlxuICovIGZ1bmN0aW9uIHN1KHQpIHtcbiAgICBmb3IgKDt0LlphLnNpemUgPiAwICYmIHQudHUuc2l6ZSA8IHQubWF4Q29uY3VycmVudExpbWJvUmVzb2x1dGlvbnM7ICkge1xuICAgICAgICBjb25zdCBlID0gdC5aYS52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICAgIHQuWmEuZGVsZXRlKGUpO1xuICAgICAgICBjb25zdCBuID0gbmV3IHh0KF90LmZyb21TdHJpbmcoZSkpLCBzID0gdC5ydS5uZXh0KCk7XG4gICAgICAgIHQuZXUuc2V0KHMsIG5ldyBCYShuKSksIHQudHUgPSB0LnR1Lmluc2VydChuLCBzKSwgam8odC5yZW1vdGVTdG9yZSwgbmV3IEFpKCRlKERlKG4ucGF0aCkpLCBzLCAyIC8qIExpbWJvUmVzb2x1dGlvbiAqLyAsIG50LkEpKTtcbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGl1KHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gSyh0KSwgaSA9IFtdLCByID0gW10sIG8gPSBbXTtcbiAgICBzLllhLmlzRW1wdHkoKSB8fCAocy5ZYS5mb3JFYWNoKCgodCwgYSkgPT4ge1xuICAgICAgICBvLnB1c2gocy5hdShhLCBlLCBuKS50aGVuKCh0ID0+IHtcbiAgICAgICAgICAgIGlmICh0KSB7XG4gICAgICAgICAgICAgICAgcy5pc1ByaW1hcnlDbGllbnQgJiYgcy5zaGFyZWRDbGllbnRTdGF0ZS51cGRhdGVRdWVyeVN0YXRlKGEudGFyZ2V0SWQsIHQuZnJvbUNhY2hlID8gXCJub3QtY3VycmVudFwiIDogXCJjdXJyZW50XCIpLCBcbiAgICAgICAgICAgICAgICBpLnB1c2godCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IEtyLkpzKGEudGFyZ2V0SWQsIHQpO1xuICAgICAgICAgICAgICAgIHIucHVzaChlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpKTtcbiAgICB9KSksIGF3YWl0IFByb21pc2UuYWxsKG8pLCBzLkphLktvKGkpLCBhd2FpdCBhc3luYyBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBLKHQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgbi5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIm5vdGlmeUxvY2FsVmlld0NoYW5nZXNcIiwgXCJyZWFkd3JpdGVcIiwgKHQgPT4gdWkuZm9yRWFjaChlLCAoZSA9PiB1aS5mb3JFYWNoKGUuenMsIChzID0+IG4ucGVyc2lzdGVuY2UucmVmZXJlbmNlRGVsZWdhdGUuYWRkUmVmZXJlbmNlKHQsIGUudGFyZ2V0SWQsIHMpKSkubmV4dCgoKCkgPT4gdWkuZm9yRWFjaChlLkhzLCAocyA9PiBuLnBlcnNpc3RlbmNlLnJlZmVyZW5jZURlbGVnYXRlLnJlbW92ZVJlZmVyZW5jZSh0LCBlLnRhcmdldElkLCBzKSkpKSkpKSkpO1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICBpZiAoIWRpKHQpKSB0aHJvdyB0O1xuICAgICAgICAgICAgLy8gSWYgYG5vdGlmeUxvY2FsVmlld0NoYW5nZXNgIGZhaWxzLCB3ZSBkaWQgbm90IGFkdmFuY2UgdGhlIHNlcXVlbmNlXG4gICAgICAgICAgICAvLyBudW1iZXIgZm9yIHRoZSBkb2N1bWVudHMgdGhhdCB3ZXJlIGluY2x1ZGVkIGluIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgICAgICAgICAvLyBUaGlzIG1pZ2h0IHRyaWdnZXIgdGhlbSB0byBiZSBkZWxldGVkIGVhcmxpZXIgdGhhbiB0aGV5IG90aGVyd2lzZVxuICAgICAgICAgICAgLy8gd291bGQgaGF2ZSwgYnV0IGl0IHNob3VsZCBub3QgaW52YWxpZGF0ZSB0aGUgaW50ZWdyaXR5IG9mIHRoZSBkYXRhLlxuICAgICAgICAgICAgTyhcIkxvY2FsU3RvcmVcIiwgXCJGYWlsZWQgdG8gdXBkYXRlIHNlcXVlbmNlIG51bWJlcnM6IFwiICsgdCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB0IG9mIGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0LnRhcmdldElkO1xuICAgICAgICAgICAgaWYgKCF0LmZyb21DYWNoZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBuLnNpLmdldChlKSwgcyA9IHQuc25hcHNob3RWZXJzaW9uLCBpID0gdC53aXRoTGFzdExpbWJvRnJlZVNuYXBzaG90VmVyc2lvbihzKTtcbiAgICAgICAgICAgICAgICAvLyBBZHZhbmNlIHRoZSBsYXN0IGxpbWJvIGZyZWUgc25hcHNob3QgdmVyc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnNpID0gbi5zaS5pbnNlcnQoZSwgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KHMubG9jYWxTdG9yZSwgcikpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IEsodCk7XG4gICAgaWYgKCFuLmN1cnJlbnRVc2VyLmlzRXF1YWwoZSkpIHtcbiAgICAgICAgTyhcIlN5bmNFbmdpbmVcIiwgXCJVc2VyIGNoYW5nZS4gTmV3IHVzZXI6XCIsIGUudG9LZXkoKSk7XG4gICAgICAgIGNvbnN0IHQgPSBhd2FpdCBXcihuLmxvY2FsU3RvcmUsIGUpO1xuICAgICAgICBuLmN1cnJlbnRVc2VyID0gZSwgXG4gICAgICAgIC8vIEZhaWxzIHRhc2tzIHdhaXRpbmcgZm9yIHBlbmRpbmcgd3JpdGVzIHJlcXVlc3RlZCBieSBwcmV2aW91cyB1c2VyLlxuICAgICAgICBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICB0Lml1LmZvckVhY2goKHQgPT4ge1xuICAgICAgICAgICAgICAgIHQuZm9yRWFjaCgodCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHQucmVqZWN0KG5ldyBRKEcuQ0FOQ0VMTEVELCBlKSk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSkpLCB0Lml1LmNsZWFyKCk7XG4gICAgICAgIH0obiwgXCInd2FpdEZvclBlbmRpbmdXcml0ZXMnIHByb21pc2UgaXMgcmVqZWN0ZWQgZHVlIHRvIGEgdXNlciBjaGFuZ2UuXCIpLCBcbiAgICAgICAgLy8gVE9ETyhiLzExNDIyNjQxNyk6IENvbnNpZGVyIGNhbGxpbmcgdGhpcyBvbmx5IGluIHRoZSBwcmltYXJ5IHRhYi5cbiAgICAgICAgbi5zaGFyZWRDbGllbnRTdGF0ZS5oYW5kbGVVc2VyQ2hhbmdlKGUsIHQucmVtb3ZlZEJhdGNoSWRzLCB0LmFkZGVkQmF0Y2hJZHMpLCBhd2FpdCBpdShuLCB0LmNpKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG91KHQsIGUpIHtcbiAgICBjb25zdCBuID0gSyh0KSwgcyA9IG4uZXUuZ2V0KGUpO1xuICAgIGlmIChzICYmIHMuSGEpIHJldHVybiBHbigpLmFkZChzLmtleSk7XG4gICAge1xuICAgICAgICBsZXQgdCA9IEduKCk7XG4gICAgICAgIGNvbnN0IHMgPSBuLlhhLmdldChlKTtcbiAgICAgICAgaWYgKCFzKSByZXR1cm4gdDtcbiAgICAgICAgZm9yIChjb25zdCBlIG9mIHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBuLllhLmdldChlKTtcbiAgICAgICAgICAgIHQgPSB0LnVuaW9uV2l0aChzLnZpZXcuQmEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZWNvbmNpbGUgdGhlIGxpc3Qgb2Ygc3luY2VkIGRvY3VtZW50cyBpbiBhbiBleGlzdGluZyB2aWV3IHdpdGggdGhvc2VcbiAqIGZyb20gcGVyc2lzdGVuY2UuXG4gKi8gYXN5bmMgZnVuY3Rpb24gYXUodCwgZSkge1xuICAgIGNvbnN0IG4gPSBLKHQpLCBzID0gYXdhaXQgZW8obi5sb2NhbFN0b3JlLCBlLnF1ZXJ5LCBcbiAgICAvKiB1c2VQcmV2aW91c1Jlc3VsdHM9ICovICEwKSwgaSA9IGUudmlldy5XYShzKTtcbiAgICByZXR1cm4gbi5pc1ByaW1hcnlDbGllbnQgJiYgZXUobiwgZS50YXJnZXRJZCwgaS5RYSksIGk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIG5ld2x5IGNoYW5nZWQgZG9jdW1lbnRzIGZyb20gcmVtb3RlIGRvY3VtZW50IGNhY2hlIGFuZCByYWlzZXNcbiAqIHNuYXBzaG90cyBpZiBuZWVkZWQuXG4gKi9cbi8vIFBPUlRJTkcgTk9URTogTXVsdGktVGFiIG9ubHkuXG5hc3luYyBmdW5jdGlvbiB1dSh0KSB7XG4gICAgY29uc3QgZSA9IEsodCk7XG4gICAgcmV0dXJuIHNvKGUubG9jYWxTdG9yZSkudGhlbigodCA9PiBpdShlLCB0KSkpO1xufVxuXG4vKiogQXBwbGllcyBhIG11dGF0aW9uIHN0YXRlIHRvIGFuIGV4aXN0aW5nIGJhdGNoLiAgKi9cbi8vIFBPUlRJTkcgTk9URTogTXVsdGktVGFiIG9ubHkuXG5hc3luYyBmdW5jdGlvbiBjdSh0LCBlLCBuLCBzKSB7XG4gICAgY29uc3QgaSA9IEsodCksIHIgPSBhd2FpdCBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBLKHQpLCBzID0gSyhuLkZzKTtcbiAgICAgICAgcmV0dXJuIG4ucGVyc2lzdGVuY2UucnVuVHJhbnNhY3Rpb24oXCJMb29rdXAgbXV0YXRpb24gZG9jdW1lbnRzXCIsIFwicmVhZG9ubHlcIiwgKHQgPT4gcy5sbih0LCBlKS5uZXh0KChlID0+IGUgPyBuLnVpLlVzKHQsIGUpIDogdWkucmVzb2x2ZShudWxsKSkpKSk7XG4gICAgfVxuICAgIC8vIFBPUlRJTkcgTk9URTogTXVsdGktVGFiIG9ubHkuXG4gICAgKGkubG9jYWxTdG9yZSwgZSk7XG4gICAgbnVsbCAhPT0gciA/IChcInBlbmRpbmdcIiA9PT0gbiA/IFxuICAgIC8vIElmIHdlIGFyZSB0aGUgcHJpbWFyeSBjbGllbnQsIHdlIG5lZWQgdG8gc2VuZCB0aGlzIHdyaXRlIHRvIHRoZVxuICAgIC8vIGJhY2tlbmQuIFNlY29uZGFyeSBjbGllbnRzIHdpbGwgaWdub3JlIHRoZXNlIHdyaXRlcyBzaW5jZSB0aGVpciByZW1vdGVcbiAgICAvLyBjb25uZWN0aW9uIGlzIGRpc2FibGVkLlxuICAgIGF3YWl0IHJhKGkucmVtb3RlU3RvcmUpIDogXCJhY2tub3dsZWRnZWRcIiA9PT0gbiB8fCBcInJlamVjdGVkXCIgPT09IG4gPyAoXG4gICAgLy8gTk9URTogQm90aCB0aGVzZSBtZXRob2RzIGFyZSBuby1vcHMgZm9yIGJhdGNoZXMgdGhhdCBvcmlnaW5hdGVkIGZyb21cbiAgICAvLyBvdGhlciBjbGllbnRzLlxuICAgIFhhKGksIGUsIHMgfHwgbnVsbCksIFlhKGksIGUpLCBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIEsoSyh0KS5GcykuZG4oZSk7XG4gICAgfVxuICAgIC8vIFBPUlRJTkcgTk9URTogTXVsdGktVGFiIG9ubHkuXG4gICAgKGkubG9jYWxTdG9yZSwgZSkpIDogTCgpLCBhd2FpdCBpdShpLCByKSkgOiBcbiAgICAvLyBBIHRocm90dGxlZCB0YWIgbWF5IG5vdCBoYXZlIHNlZW4gdGhlIG11dGF0aW9uIGJlZm9yZSBpdCB3YXMgY29tcGxldGVkXG4gICAgLy8gYW5kIHJlbW92ZWQgZnJvbSB0aGUgbXV0YXRpb24gcXVldWUsIGluIHdoaWNoIGNhc2Ugd2Ugd29uJ3QgaGF2ZSBjYWNoZWRcbiAgICAvLyB0aGUgYWZmZWN0ZWQgZG9jdW1lbnRzLiBJbiB0aGlzIGNhc2Ugd2UgY2FuIHNhZmVseSBpZ25vcmUgdGhlIHVwZGF0ZVxuICAgIC8vIHNpbmNlIHRoYXQgbWVhbnMgd2UgZGlkbid0IGFwcGx5IHRoZSBtdXRhdGlvbiBsb2NhbGx5IGF0IGFsbCAoaWYgd2VcbiAgICAvLyBoYWQsIHdlIHdvdWxkIGhhdmUgY2FjaGVkIHRoZSBhZmZlY3RlZCBkb2N1bWVudHMpLCBhbmQgc28gd2Ugd2lsbCBqdXN0XG4gICAgLy8gc2VlIGFueSByZXN1bHRpbmcgZG9jdW1lbnQgY2hhbmdlcyB2aWEgbm9ybWFsIHJlbW90ZSBkb2N1bWVudCB1cGRhdGVzXG4gICAgLy8gYXMgYXBwbGljYWJsZS5cbiAgICBPKFwiU3luY0VuZ2luZVwiLCBcIkNhbm5vdCBhcHBseSBtdXRhdGlvbiBiYXRjaCB3aXRoIGlkOiBcIiArIGUpO1xufVxuXG4vKiogQXBwbGllcyBhIHF1ZXJ5IHRhcmdldCBjaGFuZ2UgZnJvbSBhIGRpZmZlcmVudCB0YWIuICovXG4vLyBQT1JUSU5HIE5PVEU6IE11bHRpLVRhYiBvbmx5LlxuYXN5bmMgZnVuY3Rpb24gaHUodCwgZSkge1xuICAgIGNvbnN0IG4gPSBLKHQpO1xuICAgIGlmIChtdShuKSwgZ3UobiksICEwID09PSBlICYmICEwICE9PSBuLm91KSB7XG4gICAgICAgIC8vIFNlY29uZGFyeSB0YWJzIG9ubHkgbWFpbnRhaW4gVmlld3MgZm9yIHRoZWlyIGxvY2FsIGxpc3RlbmVycyBhbmQgdGhlXG4gICAgICAgIC8vIFZpZXdzIGludGVybmFsIHN0YXRlIG1heSBub3QgYmUgMTAwJSBwb3B1bGF0ZWQgKGluIHBhcnRpY3VsYXJcbiAgICAgICAgLy8gc2Vjb25kYXJ5IHRhYnMgZG9uJ3QgdHJhY2sgc3luY2VkRG9jdW1lbnRzLCB0aGUgc2V0IG9mIGRvY3VtZW50cyB0aGVcbiAgICAgICAgLy8gc2VydmVyIGNvbnNpZGVycyB0byBiZSBpbiB0aGUgdGFyZ2V0KS4gU28gd2hlbiBhIHNlY29uZGFyeSBiZWNvbWVzXG4gICAgICAgIC8vIHByaW1hcnksIHdlIG5lZWQgdG8gbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBhbGwgdmlld3MgZm9yIGFsbCB0YXJnZXRzXG4gICAgICAgIC8vIG1hdGNoIHRoZSBzdGF0ZSBvbiBkaXNrLlxuICAgICAgICBjb25zdCB0ID0gbi5zaGFyZWRDbGllbnRTdGF0ZS5nZXRBbGxBY3RpdmVRdWVyeVRhcmdldHMoKSwgZSA9IGF3YWl0IGx1KG4sIHQudG9BcnJheSgpKTtcbiAgICAgICAgbi5vdSA9ICEwLCBhd2FpdCB3YShuLnJlbW90ZVN0b3JlLCAhMCk7XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiBlKSBqbyhuLnJlbW90ZVN0b3JlLCB0KTtcbiAgICB9IGVsc2UgaWYgKCExID09PSBlICYmICExICE9PSBuLm91KSB7XG4gICAgICAgIGNvbnN0IHQgPSBbXTtcbiAgICAgICAgbGV0IGUgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgbi5YYS5mb3JFYWNoKCgocywgaSkgPT4ge1xuICAgICAgICAgICAgbi5zaGFyZWRDbGllbnRTdGF0ZS5pc0xvY2FsUXVlcnlUYXJnZXQoaSkgPyB0LnB1c2goaSkgOiBlID0gZS50aGVuKCgoKSA9PiAoWmEobiwgaSksIFxuICAgICAgICAgICAgdG8obi5sb2NhbFN0b3JlLCBpLCBcbiAgICAgICAgICAgIC8qa2VlcFBlcnNpc3RlZFRhcmdldERhdGE9Ki8gITApKSkpLCBXbyhuLnJlbW90ZVN0b3JlLCBpKTtcbiAgICAgICAgfSkpLCBhd2FpdCBlLCBhd2FpdCBsdShuLCB0KSwgXG4gICAgICAgIC8vIFBPUlRJTkcgTk9URTogTXVsdGktVGFiIG9ubHkuXG4gICAgICAgIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBLKHQpO1xuICAgICAgICAgICAgZS5ldS5mb3JFYWNoKCgodCwgbikgPT4ge1xuICAgICAgICAgICAgICAgIFdvKGUucmVtb3RlU3RvcmUsIG4pO1xuICAgICAgICAgICAgfSkpLCBlLm51LmJpKCksIGUuZXUgPSBuZXcgTWFwLCBlLnR1ID0gbmV3IENuKHh0LmNvbXBhcmF0b3IpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICogUmVjb25jaWxlIHRoZSBxdWVyeSB2aWV3cyBvZiB0aGUgcHJvdmlkZWQgcXVlcnkgdGFyZ2V0cyB3aXRoIHRoZSBzdGF0ZSBmcm9tXG4gKiBwZXJzaXN0ZW5jZS4gUmFpc2VzIHNuYXBzaG90cyBmb3IgYW55IGNoYW5nZXMgdGhhdCBhZmZlY3QgdGhlIGxvY2FsXG4gKiBjbGllbnQgYW5kIHJldHVybnMgdGhlIHVwZGF0ZWQgc3RhdGUgb2YgYWxsIHRhcmdldCdzIHF1ZXJ5IGRhdGEuXG4gKlxuICogQHBhcmFtIHN5bmNFbmdpbmUgLSBUaGUgc3luYyBlbmdpbmUgaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSB0YXJnZXRzIC0gdGhlIGxpc3Qgb2YgdGFyZ2V0cyB3aXRoIHZpZXdzIHRoYXQgbmVlZCB0byBiZSByZWNvbXB1dGVkXG4gKiBAcGFyYW0gdHJhbnNpdGlvblRvUHJpbWFyeSAtIGB0cnVlYCBpZmYgdGhlIHRhYiB0cmFuc2l0aW9ucyBmcm9tIGEgc2Vjb25kYXJ5XG4gKiB0YWIgdG8gYSBwcmltYXJ5IHRhYlxuICovXG4gICAgICAgIC8vIFBPUlRJTkcgTk9URTogTXVsdGktVGFiIG9ubHkuXG4gICAgICAgIChuKSwgbi5vdSA9ICExLCBhd2FpdCB3YShuLnJlbW90ZVN0b3JlLCAhMSk7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBsdSh0LCBlLCBuKSB7XG4gICAgY29uc3QgcyA9IEsodCksIGkgPSBbXSwgciA9IFtdO1xuICAgIGZvciAoY29uc3QgdCBvZiBlKSB7XG4gICAgICAgIGxldCBlO1xuICAgICAgICBjb25zdCBuID0gcy5YYS5nZXQodCk7XG4gICAgICAgIGlmIChuICYmIDAgIT09IG4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBGb3IgcXVlcmllcyB0aGF0IGhhdmUgYSBsb2NhbCBWaWV3LCB3ZSBmZXRjaCB0aGVpciBjdXJyZW50IHN0YXRlXG4gICAgICAgICAgICAvLyBmcm9tIExvY2FsU3RvcmUgKGFzIHRoZSByZXN1bWUgdG9rZW4gYW5kIHRoZSBzbmFwc2hvdCB2ZXJzaW9uXG4gICAgICAgICAgICAvLyBtaWdodCBoYXZlIGNoYW5nZWQpIGFuZCByZWNvbmNpbGUgdGhlaXIgdmlld3Mgd2l0aCB0aGUgcGVyc2lzdGVkXG4gICAgICAgICAgICAvLyBzdGF0ZSAodGhlIGxpc3Qgb2Ygc3luY2VkRG9jdW1lbnRzIG1heSBoYXZlIGdvdHRlbiBvdXQgb2Ygc3luYykuXG4gICAgICAgICAgICBlID0gYXdhaXQgWnIocy5sb2NhbFN0b3JlLCAkZShuWzBdKSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2Ygbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBzLllhLmdldCh0KSwgbiA9IGF3YWl0IGF1KHMsIGUpO1xuICAgICAgICAgICAgICAgIG4uc25hcHNob3QgJiYgci5wdXNoKG4uc25hcHNob3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRm9yIHF1ZXJpZXMgdGhhdCBuZXZlciBleGVjdXRlZCBvbiB0aGlzIGNsaWVudCwgd2UgbmVlZCB0b1xuICAgICAgICAgICAgLy8gYWxsb2NhdGUgdGhlIHRhcmdldCBpbiBMb2NhbFN0b3JlIGFuZCBpbml0aWFsaXplIGEgbmV3IFZpZXcuXG4gICAgICAgICAgICBjb25zdCBuID0gYXdhaXQgbm8ocy5sb2NhbFN0b3JlLCB0KTtcbiAgICAgICAgICAgIGUgPSBhd2FpdCBacihzLmxvY2FsU3RvcmUsIG4pLCBhd2FpdCBVYShzLCBmdShuKSwgdCwgXG4gICAgICAgICAgICAvKmN1cnJlbnQ9Ki8gITEpO1xuICAgICAgICB9XG4gICAgICAgIGkucHVzaChlKTtcbiAgICB9XG4gICAgcmV0dXJuIHMuSmEuS28ociksIGk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGBRdWVyeWAgb2JqZWN0IGZyb20gdGhlIHNwZWNpZmllZCBgVGFyZ2V0YC4gVGhlcmUgaXMgbm8gd2F5IHRvXG4gKiBvYnRhaW4gdGhlIG9yaWdpbmFsIGBRdWVyeWAsIHNvIHdlIHN5bnRoZXNpemUgYSBgUXVlcnlgIGZyb20gdGhlIGBUYXJnZXRgXG4gKiBvYmplY3QuXG4gKlxuICogVGhlIHN5bnRoZXNpemVkIHJlc3VsdCBtaWdodCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgYFF1ZXJ5YCwgYnV0XG4gKiBzaW5jZSB0aGUgc3ludGhlc2l6ZWQgYFF1ZXJ5YCBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlXG4gKiBvcmlnaW5hbCBvbmUgKG9ubHkgdGhlIHByZXNlbnRhdGlvbiBvZiByZXN1bHRzIG1pZ2h0IGRpZmZlciksIHRoZSBwb3RlbnRpYWxcbiAqIGRpZmZlcmVuY2Ugd2lsbCBub3QgY2F1c2UgaXNzdWVzLlxuICovXG4vLyBQT1JUSU5HIE5PVEU6IE11bHRpLVRhYiBvbmx5LlxuZnVuY3Rpb24gZnUodCkge1xuICAgIHJldHVybiBTZSh0LnBhdGgsIHQuY29sbGVjdGlvbkdyb3VwLCB0Lm9yZGVyQnksIHQuZmlsdGVycywgdC5saW1pdCwgXCJGXCIgLyogRmlyc3QgKi8gLCB0LnN0YXJ0QXQsIHQuZW5kQXQpO1xufVxuXG4vKiogUmV0dXJucyB0aGUgSURzIG9mIHRoZSBjbGllbnRzIHRoYXQgYXJlIGN1cnJlbnRseSBhY3RpdmUuICovXG4vLyBQT1JUSU5HIE5PVEU6IE11bHRpLVRhYiBvbmx5LlxuZnVuY3Rpb24gZHUodCkge1xuICAgIGNvbnN0IGUgPSBLKHQpO1xuICAgIHJldHVybiBLKEsoZS5sb2NhbFN0b3JlKS5wZXJzaXN0ZW5jZSkuTXMoKTtcbn1cblxuLyoqIEFwcGxpZXMgYSBxdWVyeSB0YXJnZXQgY2hhbmdlIGZyb20gYSBkaWZmZXJlbnQgdGFiLiAqL1xuLy8gUE9SVElORyBOT1RFOiBNdWx0aS1UYWIgb25seS5cbmFzeW5jIGZ1bmN0aW9uIF91KHQsIGUsIG4sIHMpIHtcbiAgICBjb25zdCBpID0gSyh0KTtcbiAgICBpZiAoaS5vdSkgXG4gICAgLy8gSWYgd2UgcmVjZWl2ZSBhIHRhcmdldCBzdGF0ZSBub3RpZmljYXRpb24gdmlhIFdlYlN0b3JhZ2UsIHdlIGFyZVxuICAgIC8vIGVpdGhlciBhbHJlYWR5IHNlY29uZGFyeSBvciBhbm90aGVyIHRhYiBoYXMgdGFrZW4gdGhlIHByaW1hcnkgbGVhc2UuXG4gICAgTyhcIlN5bmNFbmdpbmVcIiwgXCJJZ25vcmluZyB1bmV4cGVjdGVkIHF1ZXJ5IHN0YXRlIG5vdGlmaWNhdGlvbi5cIik7IGVsc2UgaWYgKGkuWGEuaGFzKGUpKSBzd2l0Y2ggKG4pIHtcbiAgICAgIGNhc2UgXCJjdXJyZW50XCI6XG4gICAgICBjYXNlIFwibm90LWN1cnJlbnRcIjpcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdCA9IGF3YWl0IHNvKGkubG9jYWxTdG9yZSksIHMgPSBXbi5jcmVhdGVTeW50aGVzaXplZFJlbW90ZUV2ZW50Rm9yQ3VycmVudENoYW5nZShlLCBcImN1cnJlbnRcIiA9PT0gbik7XG4gICAgICAgICAgICBhd2FpdCBpdShpLCB0LCBzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJyZWplY3RlZFwiOlxuICAgICAgICBhd2FpdCB0byhpLmxvY2FsU3RvcmUsIGUsIFxuICAgICAgICAvKiBrZWVwUGVyc2lzdGVkVGFyZ2V0RGF0YSAqLyAhMCksIFphKGksIGUsIHMpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgTCgpO1xuICAgIH1cbn1cblxuLyoqIEFkZHMgb3IgcmVtb3ZlcyBXYXRjaCB0YXJnZXRzIGZvciBxdWVyaWVzIGZyb20gZGlmZmVyZW50IHRhYnMuICovIGFzeW5jIGZ1bmN0aW9uIHd1KHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gbXUodCk7XG4gICAgaWYgKHMub3UpIHtcbiAgICAgICAgZm9yIChjb25zdCB0IG9mIGUpIHtcbiAgICAgICAgICAgIGlmIChzLlhhLmhhcyh0KSkge1xuICAgICAgICAgICAgICAgIC8vIEEgdGFyZ2V0IG1pZ2h0IGhhdmUgYmVlbiBhZGRlZCBpbiBhIHByZXZpb3VzIGF0dGVtcHRcbiAgICAgICAgICAgICAgICBPKFwiU3luY0VuZ2luZVwiLCBcIkFkZGluZyBhbiBhbHJlYWR5IGFjdGl2ZSB0YXJnZXQgXCIgKyB0KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGUgPSBhd2FpdCBubyhzLmxvY2FsU3RvcmUsIHQpLCBuID0gYXdhaXQgWnIocy5sb2NhbFN0b3JlLCBlKTtcbiAgICAgICAgICAgIGF3YWl0IFVhKHMsIGZ1KGUpLCBuLnRhcmdldElkLCBcbiAgICAgICAgICAgIC8qY3VycmVudD0qLyAhMSksIGpvKHMucmVtb3RlU3RvcmUsIG4pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiBuKSBcbiAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgdGFyZ2V0IGlzIHN0aWxsIGFjdGl2ZSBzaW5jZSB0aGUgdGFyZ2V0IG1pZ2h0IGhhdmUgYmVlblxuICAgICAgICAvLyByZW1vdmVkIGlmIGl0IGhhcyBiZWVuIHJlamVjdGVkIGJ5IHRoZSBiYWNrZW5kLlxuICAgICAgICBzLlhhLmhhcyh0KSAmJiBcbiAgICAgICAgLy8gUmVsZWFzZSBxdWVyaWVzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZS5cbiAgICAgICAgYXdhaXQgdG8ocy5sb2NhbFN0b3JlLCB0LCBcbiAgICAgICAgLyoga2VlcFBlcnNpc3RlZFRhcmdldERhdGEgKi8gITEpLnRoZW4oKCgpID0+IHtcbiAgICAgICAgICAgIFdvKHMucmVtb3RlU3RvcmUsIHQpLCBaYShzLCB0KTtcbiAgICAgICAgfSkpLmNhdGNoKFRyKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG11KHQpIHtcbiAgICBjb25zdCBlID0gSyh0KTtcbiAgICByZXR1cm4gZS5yZW1vdGVTdG9yZS5yZW1vdGVTeW5jZXIuYXBwbHlSZW1vdGVFdmVudCA9IFFhLmJpbmQobnVsbCwgZSksIGUucmVtb3RlU3RvcmUucmVtb3RlU3luY2VyLmdldFJlbW90ZUtleXNGb3JUYXJnZXQgPSBvdS5iaW5kKG51bGwsIGUpLCBcbiAgICBlLnJlbW90ZVN0b3JlLnJlbW90ZVN5bmNlci5yZWplY3RMaXN0ZW4gPSBXYS5iaW5kKG51bGwsIGUpLCBlLkphLktvID0gVmEuYmluZChudWxsLCBlLmV2ZW50TWFuYWdlciksIFxuICAgIGUuSmEudXUgPSB2YS5iaW5kKG51bGwsIGUuZXZlbnRNYW5hZ2VyKSwgZTtcbn1cblxuZnVuY3Rpb24gZ3UodCkge1xuICAgIGNvbnN0IGUgPSBLKHQpO1xuICAgIHJldHVybiBlLnJlbW90ZVN0b3JlLnJlbW90ZVN5bmNlci5hcHBseVN1Y2Nlc3NmdWxXcml0ZSA9IHphLmJpbmQobnVsbCwgZSksIGUucmVtb3RlU3RvcmUucmVtb3RlU3luY2VyLnJlamVjdEZhaWxlZFdyaXRlID0gSGEuYmluZChudWxsLCBlKSwgXG4gICAgZTtcbn1cblxuLyoqXG4gKiBMb2FkcyBhIEZpcmVzdG9yZSBidW5kbGUgaW50byB0aGUgU0RLLiBUaGUgcmV0dXJuZWQgcHJvbWlzZSByZXNvbHZlcyB3aGVuXG4gKiB0aGUgYnVuZGxlIGZpbmlzaGVkIGxvYWRpbmcuXG4gKlxuICogQHBhcmFtIHN5bmNFbmdpbmUgLSBTeW5jRW5naW5lIHRvIHVzZS5cbiAqIEBwYXJhbSBidW5kbGVSZWFkZXIgLSBCdW5kbGUgdG8gbG9hZCBpbnRvIHRoZSBTREsuXG4gKiBAcGFyYW0gdGFzayAtIExvYWRCdW5kbGVUYXNrIHVzZWQgdG8gdXBkYXRlIHRoZSBsb2FkaW5nIHByb2dyZXNzIHRvIHB1YmxpYyBBUEkuXG4gKi8gZnVuY3Rpb24geXUodCwgZSwgbikge1xuICAgIGNvbnN0IHMgPSBLKHQpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgICAgKGFzeW5jIGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBhd2FpdCBlLmdldE1ldGFkYXRhKCk7XG4gICAgICAgICAgICBpZiAoYXdhaXQgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBLKHQpLCBzID0gdXMoZS5jcmVhdGVUaW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbi5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcImhhc05ld2VyQnVuZGxlXCIsIFwicmVhZG9ubHlcIiwgKHQgPT4gbi5mcy5nZXRCdW5kbGVNZXRhZGF0YSh0LCBlLmlkKSkpLnRoZW4oKHQgPT4gISF0ICYmIHQuY3JlYXRlVGltZS5jb21wYXJlVG8ocykgPj0gMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyoqXG4gKiBTYXZlcyB0aGUgZ2l2ZW4gYEJ1bmRsZU1ldGFkYXRhYCB0byBsb2NhbCBwZXJzaXN0ZW5jZS5cbiAqLyAodC5sb2NhbFN0b3JlLCBzKSkgcmV0dXJuIGF3YWl0IGUuY2xvc2UoKSwgdm9pZCBuLl9jb21wbGV0ZVdpdGgoZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHRhc2tTdGF0ZTogXCJTdWNjZXNzXCIsXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50c0xvYWRlZDogdC50b3RhbERvY3VtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgYnl0ZXNMb2FkZWQ6IHQudG90YWxCeXRlcyxcbiAgICAgICAgICAgICAgICAgICAgdG90YWxEb2N1bWVudHM6IHQudG90YWxEb2N1bWVudHMsXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXM6IHQudG90YWxCeXRlc1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KHMpKTtcbiAgICAgICAgICAgIG4uX3VwZGF0ZVByb2dyZXNzKGthKHMpKTtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBuZXcgTmEocywgdC5sb2NhbFN0b3JlLCBlLk0pO1xuICAgICAgICAgICAgbGV0IHIgPSBhd2FpdCBlLmN1KCk7XG4gICAgICAgICAgICBmb3IgKDtyOyApIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ID0gYXdhaXQgaS54YShyKTtcbiAgICAgICAgICAgICAgICB0ICYmIG4uX3VwZGF0ZVByb2dyZXNzKHQpLCByID0gYXdhaXQgZS5jdSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbyA9IGF3YWl0IGkuY29tcGxldGUoKTtcbiAgICAgICAgICAgIC8vIFRPRE8oYi8xNjA4NzY0NDMpOiBUaGlzIGN1cnJlbnRseSByYWlzZXMgc25hcHNob3RzIHdpdGhcbiAgICAgICAgICAgIC8vIGBmcm9tQ2FjaGU9ZmFsc2VgIGlmIHVzZXJzIGFscmVhZHkgbGlzdGVuIHRvIHNvbWUgcXVlcmllcyBhbmQgYnVuZGxlc1xuICAgICAgICAgICAgLy8gaGFzIG5ld2VyIHZlcnNpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBpdSh0LCBvLiRzLCBcbiAgICAgICAgICAgIC8qIHJlbW90ZUV2ZW50ICovIHZvaWQgMCksIFxuICAgICAgICAgICAgLy8gU2F2ZSBtZXRhZGF0YSwgc28gbG9hZGluZyB0aGUgc2FtZSBidW5kbGUgd2lsbCBza2lwLlxuICAgICAgICAgICAgYXdhaXQgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBLKHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuLnBlcnNpc3RlbmNlLnJ1blRyYW5zYWN0aW9uKFwiU2F2ZSBidW5kbGVcIiwgXCJyZWFkd3JpdGVcIiwgKHQgPT4gbi5mcy5zYXZlQnVuZGxlTWV0YWRhdGEodCwgZSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICogUmV0dXJucyBhIHByb21pc2Ugb2YgYSBgTmFtZWRRdWVyeWAgYXNzb2NpYXRlZCB3aXRoIGdpdmVuIHF1ZXJ5IG5hbWUuIFByb21pc2VcbiAqIHJlc29sdmVzIHRvIHVuZGVmaW5lZCBpZiBubyBwZXJzaXN0ZWQgZGF0YSBjYW4gYmUgZm91bmQuXG4gKi8gKHQubG9jYWxTdG9yZSwgcyksIG4uX2NvbXBsZXRlV2l0aChvLnByb2dyZXNzKTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgRihcIlN5bmNFbmdpbmVcIiwgYExvYWRpbmcgYnVuZGxlIGZhaWxlZCB3aXRoICR7dH1gKSwgbi5fZmFpbFdpdGgodCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbiAgICAvKipcbiAqIFByb3ZpZGVzIGFsbCBjb21wb25lbnRzIG5lZWRlZCBmb3IgRmlyZXN0b3JlIHdpdGggaW4tbWVtb3J5IHBlcnNpc3RlbmNlLlxuICogVXNlcyBFYWdlckdDIGdhcmJhZ2UgY29sbGVjdGlvbi5cbiAqLykocywgZSwgbikudGhlbigoKCkgPT4ge1xuICAgICAgICBzLnNoYXJlZENsaWVudFN0YXRlLm5vdGlmeUJ1bmRsZUxvYWRlZCgpO1xuICAgIH0pKTtcbn1cblxuY2xhc3MgcHUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnN5bmNocm9uaXplVGFicyA9ICExO1xuICAgIH1cbiAgICBhc3luYyBpbml0aWFsaXplKHQpIHtcbiAgICAgICAgdGhpcy5NID0gT28odC5kYXRhYmFzZUluZm8uZGF0YWJhc2VJZCksIHRoaXMuc2hhcmVkQ2xpZW50U3RhdGUgPSB0aGlzLmh1KHQpLCB0aGlzLnBlcnNpc3RlbmNlID0gdGhpcy5sdSh0KSwgXG4gICAgICAgIGF3YWl0IHRoaXMucGVyc2lzdGVuY2Uuc3RhcnQoKSwgdGhpcy5nY1NjaGVkdWxlciA9IHRoaXMuZnUodCksIHRoaXMubG9jYWxTdG9yZSA9IHRoaXMuZHUodCk7XG4gICAgfVxuICAgIGZ1KHQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGR1KHQpIHtcbiAgICAgICAgcmV0dXJuIGpyKHRoaXMucGVyc2lzdGVuY2UsIG5ldyBHciwgdC5pbml0aWFsVXNlciwgdGhpcy5NKTtcbiAgICB9XG4gICAgbHUodCkge1xuICAgICAgICByZXR1cm4gbmV3IG1vKHlvLldpLCB0aGlzLk0pO1xuICAgIH1cbiAgICBodSh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgdm87XG4gICAgfVxuICAgIGFzeW5jIHRlcm1pbmF0ZSgpIHtcbiAgICAgICAgdGhpcy5nY1NjaGVkdWxlciAmJiB0aGlzLmdjU2NoZWR1bGVyLnN0b3AoKSwgYXdhaXQgdGhpcy5zaGFyZWRDbGllbnRTdGF0ZS5zaHV0ZG93bigpLCBcbiAgICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZS5zaHV0ZG93bigpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQcm92aWRlcyBhbGwgY29tcG9uZW50cyBuZWVkZWQgZm9yIEZpcmVzdG9yZSB3aXRoIEluZGV4ZWREQiBwZXJzaXN0ZW5jZS5cbiAqLyBjbGFzcyBJdSBleHRlbmRzIHB1IHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMuX3UgPSB0LCB0aGlzLmNhY2hlU2l6ZUJ5dGVzID0gZSwgdGhpcy5mb3JjZU93bmVyc2hpcCA9IG4sIHRoaXMuc3luY2hyb25pemVUYWJzID0gITE7XG4gICAgfVxuICAgIGFzeW5jIGluaXRpYWxpemUodCkge1xuICAgICAgICBhd2FpdCBzdXBlci5pbml0aWFsaXplKHQpLCBhd2FpdCBpbyh0aGlzLmxvY2FsU3RvcmUpLCBhd2FpdCB0aGlzLl91LmluaXRpYWxpemUodGhpcywgdCksIFxuICAgICAgICAvLyBFbnF1ZXVlIHdyaXRlcyBmcm9tIGEgcHJldmlvdXMgc2Vzc2lvblxuICAgICAgICBhd2FpdCBndSh0aGlzLl91LnN5bmNFbmdpbmUpLCBhd2FpdCByYSh0aGlzLl91LnJlbW90ZVN0b3JlKSwgXG4gICAgICAgIC8vIE5PVEU6IFRoaXMgd2lsbCBpbW1lZGlhdGVseSBjYWxsIHRoZSBsaXN0ZW5lciwgc28gd2UgbWFrZSBzdXJlIHRvXG4gICAgICAgIC8vIHNldCBpdCBhZnRlciBsb2NhbFN0b3JlIC8gcmVtb3RlU3RvcmUgYXJlIHN0YXJ0ZWQuXG4gICAgICAgIGF3YWl0IHRoaXMucGVyc2lzdGVuY2UucHMoKCgpID0+ICh0aGlzLmdjU2NoZWR1bGVyICYmICF0aGlzLmdjU2NoZWR1bGVyLnN0YXJ0ZWQgJiYgdGhpcy5nY1NjaGVkdWxlci5zdGFydCh0aGlzLmxvY2FsU3RvcmUpLCBcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkpKSk7XG4gICAgfVxuICAgIGR1KHQpIHtcbiAgICAgICAgcmV0dXJuIGpyKHRoaXMucGVyc2lzdGVuY2UsIG5ldyBHciwgdC5pbml0aWFsVXNlciwgdGhpcy5NKTtcbiAgICB9XG4gICAgZnUodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5wZXJzaXN0ZW5jZS5yZWZlcmVuY2VEZWxlZ2F0ZS5nYXJiYWdlQ29sbGVjdG9yO1xuICAgICAgICByZXR1cm4gbmV3IFJyKGUsIHQuYXN5bmNRdWV1ZSk7XG4gICAgfVxuICAgIGx1KHQpIHtcbiAgICAgICAgY29uc3QgZSA9IExyKHQuZGF0YWJhc2VJbmZvLmRhdGFiYXNlSWQsIHQuZGF0YWJhc2VJbmZvLnBlcnNpc3RlbmNlS2V5KSwgbiA9IHZvaWQgMCAhPT0gdGhpcy5jYWNoZVNpemVCeXRlcyA/IHVyLndpdGhDYWNoZVNpemUodGhpcy5jYWNoZVNpemVCeXRlcykgOiB1ci5ERUZBVUxUO1xuICAgICAgICByZXR1cm4gbmV3ICRyKHRoaXMuc3luY2hyb25pemVUYWJzLCBlLCB0LmNsaWVudElkLCBuLCB0LmFzeW5jUXVldWUsIGtvKCksIE1vKCksIHRoaXMuTSwgdGhpcy5zaGFyZWRDbGllbnRTdGF0ZSwgISF0aGlzLmZvcmNlT3duZXJzaGlwKTtcbiAgICB9XG4gICAgaHUodCkge1xuICAgICAgICByZXR1cm4gbmV3IHZvO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQcm92aWRlcyBhbGwgY29tcG9uZW50cyBuZWVkZWQgZm9yIEZpcmVzdG9yZSB3aXRoIG11bHRpLXRhYiBJbmRleGVkREJcbiAqIHBlcnNpc3RlbmNlLlxuICpcbiAqIEluIHRoZSBsZWdhY3kgY2xpZW50LCB0aGlzIHByb3ZpZGVyIGlzIHVzZWQgdG8gcHJvdmlkZSBib3RoIG11bHRpLXRhYiBhbmRcbiAqIG5vbi1tdWx0aS10YWIgcGVyc2lzdGVuY2Ugc2luY2Ugd2UgY2Fubm90IHRlbGwgYXQgYnVpbGQgdGltZSB3aGV0aGVyXG4gKiBgc3luY2hyb25pemVUYWJzYCB3aWxsIGJlIGVuYWJsZWQuXG4gKi8gY2xhc3MgVHUgZXh0ZW5kcyBJdSB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICBzdXBlcih0LCBlLCAvKiBmb3JjZU93bmVyc2hpcD0gKi8gITEpLCB0aGlzLl91ID0gdCwgdGhpcy5jYWNoZVNpemVCeXRlcyA9IGUsIHRoaXMuc3luY2hyb25pemVUYWJzID0gITA7XG4gICAgfVxuICAgIGFzeW5jIGluaXRpYWxpemUodCkge1xuICAgICAgICBhd2FpdCBzdXBlci5pbml0aWFsaXplKHQpO1xuICAgICAgICBjb25zdCBlID0gdGhpcy5fdS5zeW5jRW5naW5lO1xuICAgICAgICB0aGlzLnNoYXJlZENsaWVudFN0YXRlIGluc3RhbmNlb2YgVm8gJiYgKHRoaXMuc2hhcmVkQ2xpZW50U3RhdGUuc3luY0VuZ2luZSA9IHtcbiAgICAgICAgICAgIE5yOiBjdS5iaW5kKG51bGwsIGUpLFxuICAgICAgICAgICAga3I6IF91LmJpbmQobnVsbCwgZSksXG4gICAgICAgICAgICBNcjogd3UuYmluZChudWxsLCBlKSxcbiAgICAgICAgICAgIE1zOiBkdS5iaW5kKG51bGwsIGUpLFxuICAgICAgICAgICAgQ3I6IHV1LmJpbmQobnVsbCwgZSlcbiAgICAgICAgfSwgYXdhaXQgdGhpcy5zaGFyZWRDbGllbnRTdGF0ZS5zdGFydCgpKSwgXG4gICAgICAgIC8vIE5PVEU6IFRoaXMgd2lsbCBpbW1lZGlhdGVseSBjYWxsIHRoZSBsaXN0ZW5lciwgc28gd2UgbWFrZSBzdXJlIHRvXG4gICAgICAgIC8vIHNldCBpdCBhZnRlciBsb2NhbFN0b3JlIC8gcmVtb3RlU3RvcmUgYXJlIHN0YXJ0ZWQuXG4gICAgICAgIGF3YWl0IHRoaXMucGVyc2lzdGVuY2UucHMoKGFzeW5jIHQgPT4ge1xuICAgICAgICAgICAgYXdhaXQgaHUodGhpcy5fdS5zeW5jRW5naW5lLCB0KSwgdGhpcy5nY1NjaGVkdWxlciAmJiAodCAmJiAhdGhpcy5nY1NjaGVkdWxlci5zdGFydGVkID8gdGhpcy5nY1NjaGVkdWxlci5zdGFydCh0aGlzLmxvY2FsU3RvcmUpIDogdCB8fCB0aGlzLmdjU2NoZWR1bGVyLnN0b3AoKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgaHUodCkge1xuICAgICAgICBjb25zdCBlID0ga28oKTtcbiAgICAgICAgaWYgKCFWby52dChlKSkgdGhyb3cgbmV3IFEoRy5VTklNUExFTUVOVEVELCBcIkluZGV4ZWREQiBwZXJzaXN0ZW5jZSBpcyBvbmx5IGF2YWlsYWJsZSBvbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IExvY2FsU3RvcmFnZS5cIik7XG4gICAgICAgIGNvbnN0IG4gPSBMcih0LmRhdGFiYXNlSW5mby5kYXRhYmFzZUlkLCB0LmRhdGFiYXNlSW5mby5wZXJzaXN0ZW5jZUtleSk7XG4gICAgICAgIHJldHVybiBuZXcgVm8oZSwgdC5hc3luY1F1ZXVlLCBuLCB0LmNsaWVudElkLCB0LmluaXRpYWxVc2VyKTtcbiAgICB9XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgYW5kIHdpcmVzIHRoZSBjb21wb25lbnRzIHRoYXQgYXJlIG5lZWRlZCB0byBpbnRlcmZhY2Ugd2l0aCB0aGVcbiAqIG5ldHdvcmsuXG4gKi8gY2xhc3MgRXUge1xuICAgIGFzeW5jIGluaXRpYWxpemUodCwgZSkge1xuICAgICAgICB0aGlzLmxvY2FsU3RvcmUgfHwgKHRoaXMubG9jYWxTdG9yZSA9IHQubG9jYWxTdG9yZSwgdGhpcy5zaGFyZWRDbGllbnRTdGF0ZSA9IHQuc2hhcmVkQ2xpZW50U3RhdGUsIFxuICAgICAgICB0aGlzLmRhdGFzdG9yZSA9IHRoaXMuY3JlYXRlRGF0YXN0b3JlKGUpLCB0aGlzLnJlbW90ZVN0b3JlID0gdGhpcy5jcmVhdGVSZW1vdGVTdG9yZShlKSwgXG4gICAgICAgIHRoaXMuZXZlbnRNYW5hZ2VyID0gdGhpcy5jcmVhdGVFdmVudE1hbmFnZXIoZSksIHRoaXMuc3luY0VuZ2luZSA9IHRoaXMuY3JlYXRlU3luY0VuZ2luZShlLCBcbiAgICAgICAgLyogc3RhcnRBc1ByaW1hcnk9Ki8gIXQuc3luY2hyb25pemVUYWJzKSwgdGhpcy5zaGFyZWRDbGllbnRTdGF0ZS5vbmxpbmVTdGF0ZUhhbmRsZXIgPSB0ID0+IGphKHRoaXMuc3luY0VuZ2luZSwgdCwgMSAvKiBTaGFyZWRDbGllbnRTdGF0ZSAqLyksIFxuICAgICAgICB0aGlzLnJlbW90ZVN0b3JlLnJlbW90ZVN5bmNlci5oYW5kbGVDcmVkZW50aWFsQ2hhbmdlID0gcnUuYmluZChudWxsLCB0aGlzLnN5bmNFbmdpbmUpLCBcbiAgICAgICAgYXdhaXQgd2EodGhpcy5yZW1vdGVTdG9yZSwgdGhpcy5zeW5jRW5naW5lLmlzUHJpbWFyeUNsaWVudCkpO1xuICAgIH1cbiAgICBjcmVhdGVFdmVudE1hbmFnZXIodCkge1xuICAgICAgICByZXR1cm4gbmV3IFJhO1xuICAgIH1cbiAgICBjcmVhdGVEYXRhc3RvcmUodCkge1xuICAgICAgICBjb25zdCBlID0gT28odC5kYXRhYmFzZUluZm8uZGF0YWJhc2VJZCksIG4gPSAocyA9IHQuZGF0YWJhc2VJbmZvLCBuZXcgTm8ocykpO1xuICAgICAgICB2YXIgcztcbiAgICAgICAgLyoqIFJldHVybiB0aGUgUGxhdGZvcm0tc3BlY2lmaWMgY29ubmVjdGl2aXR5IG1vbml0b3IuICovICAgICAgICByZXR1cm4gZnVuY3Rpb24odCwgZSwgbiwgcykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBxbyh0LCBlLCBuLCBzKTtcbiAgICAgICAgfSh0LmF1dGhDcmVkZW50aWFscywgdC5hcHBDaGVja0NyZWRlbnRpYWxzLCBuLCBlKTtcbiAgICB9XG4gICAgY3JlYXRlUmVtb3RlU3RvcmUodCkge1xuICAgICAgICByZXR1cm4gZSA9IHRoaXMubG9jYWxTdG9yZSwgbiA9IHRoaXMuZGF0YXN0b3JlLCBzID0gdC5hc3luY1F1ZXVlLCBpID0gdCA9PiBqYSh0aGlzLnN5bmNFbmdpbmUsIHQsIDAgLyogUmVtb3RlU3RvcmUgKi8pLCBcbiAgICAgICAgciA9IERvLnZ0KCkgPyBuZXcgRG8gOiBuZXcgU28sIG5ldyBLbyhlLCBuLCBzLCBpLCByKTtcbiAgICAgICAgdmFyIGUsIG4sIHMsIGksIHI7XG4gICAgICAgIC8qKiBSZS1lbmFibGVzIHRoZSBuZXR3b3JrLiBJZGVtcG90ZW50LiAqLyAgICB9XG4gICAgY3JlYXRlU3luY0VuZ2luZSh0LCBlKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlLCBuLCBcbiAgICAgICAgLy8gUE9SVElORyBOT1RFOiBNYW5hZ2VzIHN0YXRlIHN5bmNocm9uaXphdGlvbiBpbiBtdWx0aS10YWIgZW52aXJvbm1lbnRzLlxuICAgICAgICBzLCBpLCByLCBvKSB7XG4gICAgICAgICAgICBjb25zdCBhID0gbmV3IExhKHQsIGUsIG4sIHMsIGksIHIpO1xuICAgICAgICAgICAgcmV0dXJuIG8gJiYgKGEub3UgPSAhMCksIGE7XG4gICAgICAgIH0odGhpcy5sb2NhbFN0b3JlLCB0aGlzLnJlbW90ZVN0b3JlLCB0aGlzLmV2ZW50TWFuYWdlciwgdGhpcy5zaGFyZWRDbGllbnRTdGF0ZSwgdC5pbml0aWFsVXNlciwgdC5tYXhDb25jdXJyZW50TGltYm9SZXNvbHV0aW9ucywgZSk7XG4gICAgfVxuICAgIHRlcm1pbmF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBLKHQpO1xuICAgICAgICAgICAgTyhcIlJlbW90ZVN0b3JlXCIsIFwiUmVtb3RlU3RvcmUgc2h1dHRpbmcgZG93bi5cIiksIGUuaGEuYWRkKDUgLyogU2h1dGRvd24gKi8pLCBhd2FpdCBRbyhlKSwgXG4gICAgICAgICAgICBlLmZhLnNodXRkb3duKCksIFxuICAgICAgICAgICAgLy8gU2V0IHRoZSBPbmxpbmVTdGF0ZSB0byBVbmtub3duIChyYXRoZXIgdGhhbiBPZmZsaW5lKSB0byBhdm9pZCBwb3RlbnRpYWxseVxuICAgICAgICAgICAgLy8gdHJpZ2dlcmluZyBzcHVyaW91cyBsaXN0ZW5lciBldmVudHMgd2l0aCBjYWNoZWQgZGF0YSwgZXRjLlxuICAgICAgICAgICAgZS5kYS5zZXQoXCJVbmtub3duXCIgLyogVW5rbm93biAqLyk7XG4gICAgICAgIH0odGhpcy5yZW1vdGVTdG9yZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBIb3cgbWFueSBieXRlcyB0byByZWFkIGVhY2ggdGltZSB3aGVuIGBSZWFkYWJsZVN0cmVhbVJlYWRlci5yZWFkKClgIGlzXG4gKiBjYWxsZWQuIE9ubHkgYXBwbGljYWJsZSBmb3IgYnl0ZSBzdHJlYW1zIHRoYXQgd2UgY29udHJvbCAoZS5nLiB0aG9zZSBiYWNrZWRcbiAqIGJ5IGFuIFVJbnQ4QXJyYXkpLlxuICovXG4vKipcbiAqIEJ1aWxkcyBhIGBCeXRlU3RyZWFtUmVhZGVyYCBmcm9tIGEgVUludDhBcnJheS5cbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgZGF0YSBzb3VyY2UgdG8gdXNlLlxuICogQHBhcmFtIGJ5dGVzUGVyUmVhZCAtIEhvdyBtYW55IGJ5dGVzIGVhY2ggYHJlYWQoKWAgZnJvbSB0aGUgcmV0dXJuZWQgcmVhZGVyXG4gKiAgICAgICAgd2lsbCByZWFkLlxuICovXG5mdW5jdGlvbiBBdSh0LCBlID0gMTAyNDApIHtcbiAgICBsZXQgbiA9IDA7XG4gICAgLy8gVGhlIFR5cGVTY3JpcHQgZGVmaW5pdGlvbiBmb3IgUmVhZGFibGVTdHJlYW1SZWFkZXIgY2hhbmdlZC4gV2UgdXNlXG4gICAgLy8gYGFueWAgaGVyZSB0byBhbGxvdyB0aGlzIGNvZGUgdG8gY29tcGlsZSB3aXRoIGRpZmZlcmVudCB2ZXJzaW9ucy5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy80Mjk3MFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGFzeW5jIHJlYWQoKSB7XG4gICAgICAgICAgICBpZiAobiA8IHQuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0LnNsaWNlKG4sIG4gKyBlKSxcbiAgICAgICAgICAgICAgICAgICAgZG9uZTogITFcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBuICs9IGUsIHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRvbmU6ICEwXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyBjYW5jZWwoKSB7fSxcbiAgICAgICAgcmVsZWFzZUxvY2soKSB7fSxcbiAgICAgICAgY2xvc2VkOiBQcm9taXNlLnJlamVjdChcInVuaW1wbGVtZW50ZWRcIilcbiAgICB9O1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBPbiB3ZWIsIGEgYFJlYWRhYmxlU3RyZWFtYCBpcyB3cmFwcGVkIGFyb3VuZCBieSBhIGBCeXRlU3RyZWFtUmVhZGVyYC5cbiAqL1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qXG4gKiBBIHdyYXBwZXIgaW1wbGVtZW50YXRpb24gb2YgT2JzZXJ2ZXI8VD4gdGhhdCB3aWxsIGRpc3BhdGNoIGV2ZW50c1xuICogYXN5bmNocm9ub3VzbHkuIFRvIGFsbG93IGltbWVkaWF0ZSBzaWxlbmNpbmcsIGEgbXV0ZSBjYWxsIGlzIGFkZGVkIHdoaWNoXG4gKiBjYXVzZXMgZXZlbnRzIHNjaGVkdWxlZCB0byBubyBsb25nZXIgYmUgcmFpc2VkLlxuICovXG5jbGFzcyBSdSB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLm9ic2VydmVyID0gdCwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGVuIHNldCB0byB0cnVlLCB3aWxsIG5vdCByYWlzZSBmdXR1cmUgZXZlbnRzLiBOZWNlc3NhcnkgdG8gZGVhbCB3aXRoXG4gICAgICAgICAqIGFzeW5jIGRldGFjaG1lbnQgb2YgbGlzdGVuZXIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm11dGVkID0gITE7XG4gICAgfVxuICAgIG5leHQodCkge1xuICAgICAgICB0aGlzLm9ic2VydmVyLm5leHQgJiYgdGhpcy53dSh0aGlzLm9ic2VydmVyLm5leHQsIHQpO1xuICAgIH1cbiAgICBlcnJvcih0KSB7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIuZXJyb3IgPyB0aGlzLnd1KHRoaXMub2JzZXJ2ZXIuZXJyb3IsIHQpIDogY29uc29sZS5lcnJvcihcIlVuY2F1Z2h0IEVycm9yIGluIHNuYXBzaG90IGxpc3RlbmVyOlwiLCB0KTtcbiAgICB9XG4gICAgbXUoKSB7XG4gICAgICAgIHRoaXMubXV0ZWQgPSAhMDtcbiAgICB9XG4gICAgd3UodCwgZSkge1xuICAgICAgICB0aGlzLm11dGVkIHx8IHNldFRpbWVvdXQoKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubXV0ZWQgfHwgdChlKTtcbiAgICAgICAgfSksIDApO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQSBjbGFzcyByZXByZXNlbnRpbmcgYSBidW5kbGUuXG4gKlxuICogVGFrZXMgYSBidW5kbGUgc3RyZWFtIG9yIGJ1ZmZlciwgYW5kIHByZXNlbnRzIGFic3RyYWN0aW9ucyB0byByZWFkIGJ1bmRsZWRcbiAqIGVsZW1lbnRzIG91dCBvZiB0aGUgdW5kZXJseWluZyBjb250ZW50LlxuICovIGNsYXNzIGJ1IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKiogVGhlIHJlYWRlciB0byByZWFkIGZyb20gdW5kZXJseWluZyBiaW5hcnkgYnVuZGxlIGRhdGEgc291cmNlLiAqL1xuICAgIHQsIGUpIHtcbiAgICAgICAgdGhpcy5ndSA9IHQsIHRoaXMuTSA9IGUsIFxuICAgICAgICAvKiogQ2FjaGVkIGJ1bmRsZSBtZXRhZGF0YS4gKi9cbiAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG5ldyBqLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEludGVybmFsIGJ1ZmZlciB0byBob2xkIGJ1bmRsZSBjb250ZW50LCBhY2N1bXVsYXRpbmcgaW5jb21wbGV0ZSBlbGVtZW50XG4gICAgICAgICAqIGNvbnRlbnQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBVaW50OEFycmF5LCB0aGlzLnl1ID0gbmV3IFRleHREZWNvZGVyKFwidXRmLThcIiksIFxuICAgICAgICAvLyBSZWFkIHRoZSBtZXRhZGF0YSAod2hpY2ggaXMgdGhlIGZpcnN0IGVsZW1lbnQpLlxuICAgICAgICB0aGlzLnB1KCkudGhlbigodCA9PiB7XG4gICAgICAgICAgICB0ICYmIHQuRGEoKSA/IHRoaXMubWV0YWRhdGEucmVzb2x2ZSh0LnBheWxvYWQubWV0YWRhdGEpIDogdGhpcy5tZXRhZGF0YS5yZWplY3QobmV3IEVycm9yKGBUaGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgYnVuZGxlIGlzIG5vdCBhIG1ldGFkYXRhLCBpdCBpc1xcbiAgICAgICAgICAgICAke0pTT04uc3RyaW5naWZ5KG51bGwgPT0gdCA/IHZvaWQgMCA6IHQucGF5bG9hZCl9YCkpO1xuICAgICAgICB9KSwgKHQgPT4gdGhpcy5tZXRhZGF0YS5yZWplY3QodCkpKTtcbiAgICB9XG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmd1LmNhbmNlbCgpO1xuICAgIH1cbiAgICBhc3luYyBnZXRNZXRhZGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0YWRhdGEucHJvbWlzZTtcbiAgICB9XG4gICAgYXN5bmMgY3UoKSB7XG4gICAgICAgIC8vIE1ha2VzIHN1cmUgbWV0YWRhdGEgaXMgcmVhZCBiZWZvcmUgcHJvY2VlZGluZy5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0TWV0YWRhdGEoKSwgdGhpcy5wdSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBmcm9tIHRoZSBoZWFkIG9mIGludGVybmFsIGJ1ZmZlciwgYW5kIHB1bGxpbmcgbW9yZSBkYXRhIGZyb21cbiAgICAgKiB1bmRlcmx5aW5nIHN0cmVhbSBpZiBhIGNvbXBsZXRlIGVsZW1lbnQgY2Fubm90IGJlIGZvdW5kLCB1bnRpbCBhblxuICAgICAqIGVsZW1lbnQoaW5jbHVkaW5nIHRoZSBwcmVmaXhlZCBsZW5ndGggYW5kIHRoZSBKU09OIHN0cmluZykgaXMgZm91bmQuXG4gICAgICpcbiAgICAgKiBPbmNlIGEgY29tcGxldGUgZWxlbWVudCBpcyByZWFkLCBpdCBpcyBkcm9wcGVkIGZyb20gaW50ZXJuYWwgYnVmZmVyLlxuICAgICAqXG4gICAgICogUmV0dXJucyBlaXRoZXIgdGhlIGJ1bmRsZWQgZWxlbWVudCwgb3IgbnVsbCBpZiB3ZSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZlxuICAgICAqIHRoZSBzdHJlYW0uXG4gICAgICovICAgIGFzeW5jIHB1KCkge1xuICAgICAgICBjb25zdCB0ID0gYXdhaXQgdGhpcy5JdSgpO1xuICAgICAgICBpZiAobnVsbCA9PT0gdCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLnl1LmRlY29kZSh0KSwgbiA9IE51bWJlcihlKTtcbiAgICAgICAgaXNOYU4obikgJiYgdGhpcy5UdShgbGVuZ3RoIHN0cmluZyAoJHtlfSkgaXMgbm90IHZhbGlkIG51bWJlcmApO1xuICAgICAgICBjb25zdCBzID0gYXdhaXQgdGhpcy5FdShuKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDYShKU09OLnBhcnNlKHMpLCB0Lmxlbmd0aCArIG4pO1xuICAgIH1cbiAgICAvKiogRmlyc3QgaW5kZXggb2YgJ3snIGZyb20gdGhlIHVuZGVybHlpbmcgYnVmZmVyLiAqLyAgICBBdSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLmZpbmRJbmRleCgodCA9PiB0ID09PSBcIntcIi5jaGFyQ29kZUF0KDApKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW50ZXJuYWwgYnVmZmVyLCB1bnRpbCB0aGUgZmlyc3QgJ3snLCBhbmRcbiAgICAgKiByZXR1cm4gdGhlIGNvbnRlbnQuXG4gICAgICpcbiAgICAgKiBJZiByZWFjaGVkIGVuZCBvZiB0aGUgc3RyZWFtLCByZXR1cm5zIGEgbnVsbC5cbiAgICAgKi8gICAgYXN5bmMgSXUoKSB7XG4gICAgICAgIGZvciAoO3RoaXMuQXUoKSA8IDA7ICkge1xuICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuUnUoKSkgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQnJva2Ugb3V0IG9mIHRoZSBsb29wIGJlY2F1c2UgdW5kZXJseWluZyBzdHJlYW0gaXMgY2xvc2VkLCBhbmQgdGhlcmVcbiAgICAgICAgLy8gaGFwcGVucyB0byBiZSBubyBtb3JlIGRhdGEgdG8gcHJvY2Vzcy5cbiAgICAgICAgICAgICAgICBpZiAoMCA9PT0gdGhpcy5idWZmZXIubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgdCA9IHRoaXMuQXUoKTtcbiAgICAgICAgLy8gQnJva2Ugb3V0IG9mIHRoZSBsb29wIGJlY2F1c2UgdW5kZXJseWluZyBzdHJlYW0gaXMgY2xvc2VkLCBidXQgc3RpbGxcbiAgICAgICAgLy8gY2Fubm90IGZpbmQgYW4gb3BlbiBicmFja2V0LlxuICAgICAgICAgICAgICAgIHQgPCAwICYmIHRoaXMuVHUoXCJSZWFjaGVkIHRoZSBlbmQgb2YgYnVuZGxlIHdoZW4gYSBsZW5ndGggc3RyaW5nIGlzIGV4cGVjdGVkLlwiKTtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMuYnVmZmVyLnNsaWNlKDAsIHQpO1xuICAgICAgICAvLyBVcGRhdGUgdGhlIGludGVybmFsIGJ1ZmZlciB0byBkcm9wIHRoZSByZWFkIGxlbmd0aC5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIgPSB0aGlzLmJ1ZmZlci5zbGljZSh0KSwgZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgZnJvbSBhIHNwZWNpZmllZCBwb3NpdGlvbiBmcm9tIHRoZSBpbnRlcm5hbCBidWZmZXIsIGZvciBhIHNwZWNpZmllZFxuICAgICAqIG51bWJlciBvZiBieXRlcywgcHVsbGluZyBtb3JlIGRhdGEgZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0gaWYgbmVlZGVkLlxuICAgICAqXG4gICAgICogUmV0dXJucyBhIHN0cmluZyBkZWNvZGVkIGZyb20gdGhlIHJlYWQgYnl0ZXMuXG4gICAgICovICAgIGFzeW5jIEV1KHQpIHtcbiAgICAgICAgZm9yICg7dGhpcy5idWZmZXIubGVuZ3RoIDwgdDsgKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLlJ1KCkgJiYgdGhpcy5UdShcIlJlYWNoZWQgdGhlIGVuZCBvZiBidW5kbGUgd2hlbiBtb3JlIGlzIGV4cGVjdGVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlID0gdGhpcy55dS5kZWNvZGUodGhpcy5idWZmZXIuc2xpY2UoMCwgdCkpO1xuICAgICAgICAvLyBVcGRhdGUgdGhlIGludGVybmFsIGJ1ZmZlciB0byBkcm9wIHRoZSByZWFkIGpzb24gc3RyaW5nLlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlciA9IHRoaXMuYnVmZmVyLnNsaWNlKHQpLCBlO1xuICAgIH1cbiAgICBUdSh0KSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgICAgdGhyb3cgdGhpcy5ndS5jYW5jZWwoKSwgbmV3IEVycm9yKGBJbnZhbGlkIGJ1bmRsZSBmb3JtYXQ6ICR7dH1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHVsbHMgbW9yZSBkYXRhIGZyb20gdW5kZXJseWluZyBzdHJlYW0gdG8gaW50ZXJuYWwgYnVmZmVyLlxuICAgICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgc3RyZWFtIGlzIGZpbmlzaGVkLlxuICAgICAqLyAgICBhc3luYyBSdSgpIHtcbiAgICAgICAgY29uc3QgdCA9IGF3YWl0IHRoaXMuZ3UucmVhZCgpO1xuICAgICAgICBpZiAoIXQuZG9uZSkge1xuICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBVaW50OEFycmF5KHRoaXMuYnVmZmVyLmxlbmd0aCArIHQudmFsdWUubGVuZ3RoKTtcbiAgICAgICAgICAgIGUuc2V0KHRoaXMuYnVmZmVyKSwgZS5zZXQodC52YWx1ZSwgdGhpcy5idWZmZXIubGVuZ3RoKSwgdGhpcy5idWZmZXIgPSBlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0LmRvbmU7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBJbnRlcm5hbCB0cmFuc2FjdGlvbiBvYmplY3QgcmVzcG9uc2libGUgZm9yIGFjY3VtdWxhdGluZyB0aGUgbXV0YXRpb25zIHRvXG4gKiBwZXJmb3JtIGFuZCB0aGUgYmFzZSB2ZXJzaW9ucyBmb3IgYW55IGRvY3VtZW50cyByZWFkLlxuICovXG5jbGFzcyBQdSB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLmRhdGFzdG9yZSA9IHQsIFxuICAgICAgICAvLyBUaGUgdmVyc2lvbiBvZiBlYWNoIGRvY3VtZW50IHRoYXQgd2FzIHJlYWQgZHVyaW5nIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgICAgIHRoaXMucmVhZFZlcnNpb25zID0gbmV3IE1hcCwgdGhpcy5tdXRhdGlvbnMgPSBbXSwgdGhpcy5jb21taXR0ZWQgPSAhMSwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGRlZmVycmVkIHVzYWdlIGVycm9yIHRoYXQgb2NjdXJyZWQgcHJldmlvdXNseSBpbiB0aGlzIHRyYW5zYWN0aW9uIHRoYXRcbiAgICAgICAgICogd2lsbCBjYXVzZSB0aGUgdHJhbnNhY3Rpb24gdG8gZmFpbCBvbmNlIGl0IGFjdHVhbGx5IGNvbW1pdHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmxhc3RXcml0ZUVycm9yID0gbnVsbCwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZXQgb2YgZG9jdW1lbnRzIHRoYXQgaGF2ZSBiZWVuIHdyaXR0ZW4gaW4gdGhlIHRyYW5zYWN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBXaGVuIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZSB3cml0ZSB0byB0aGUgc2FtZSBrZXkgaW4gYSB0cmFuc2FjdGlvbiwgYW55XG4gICAgICAgICAqIHdyaXRlcyBhZnRlciB0aGUgZmlyc3QgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLndyaXR0ZW5Eb2NzID0gbmV3IFNldDtcbiAgICB9XG4gICAgYXN5bmMgbG9va3VwKHQpIHtcbiAgICAgICAgaWYgKHRoaXMuZW5zdXJlQ29tbWl0Tm90Q2FsbGVkKCksIHRoaXMubXV0YXRpb25zLmxlbmd0aCA+IDApIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgXCJGaXJlc3RvcmUgdHJhbnNhY3Rpb25zIHJlcXVpcmUgYWxsIHJlYWRzIHRvIGJlIGV4ZWN1dGVkIGJlZm9yZSBhbGwgd3JpdGVzLlwiKTtcbiAgICAgICAgY29uc3QgZSA9IGF3YWl0IGFzeW5jIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBLKHQpLCBzID0gd3Mobi5NKSArIFwiL2RvY3VtZW50c1wiLCBpID0ge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50czogZS5tYXAoKHQgPT4gbHMobi5NLCB0KSkpXG4gICAgICAgICAgICB9LCByID0gYXdhaXQgbi51byhcIkJhdGNoR2V0RG9jdW1lbnRzXCIsIHMsIGkpLCBvID0gbmV3IE1hcDtcbiAgICAgICAgICAgIHIuZm9yRWFjaCgodCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IHBzKG4uTSwgdCk7XG4gICAgICAgICAgICAgICAgby5zZXQoZS5rZXkudG9TdHJpbmcoKSwgZSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBjb25zdCBhID0gW107XG4gICAgICAgICAgICByZXR1cm4gZS5mb3JFYWNoKCh0ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gby5nZXQodC50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICBxKCEhZSksIGEucHVzaChlKTtcbiAgICAgICAgICAgIH0pKSwgYTtcbiAgICAgICAgfSh0aGlzLmRhdGFzdG9yZSwgdCk7XG4gICAgICAgIHJldHVybiBlLmZvckVhY2goKHQgPT4gdGhpcy5yZWNvcmRWZXJzaW9uKHQpKSksIGU7XG4gICAgfVxuICAgIHNldCh0LCBlKSB7XG4gICAgICAgIHRoaXMud3JpdGUoZS50b011dGF0aW9uKHQsIHRoaXMucHJlY29uZGl0aW9uKHQpKSksIHRoaXMud3JpdHRlbkRvY3MuYWRkKHQudG9TdHJpbmcoKSk7XG4gICAgfVxuICAgIHVwZGF0ZSh0LCBlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlKGUudG9NdXRhdGlvbih0LCB0aGlzLnByZWNvbmRpdGlvbkZvclVwZGF0ZSh0KSkpO1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RXcml0ZUVycm9yID0gdDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndyaXR0ZW5Eb2NzLmFkZCh0LnRvU3RyaW5nKCkpO1xuICAgIH1cbiAgICBkZWxldGUodCkge1xuICAgICAgICB0aGlzLndyaXRlKG5ldyBBbih0LCB0aGlzLnByZWNvbmRpdGlvbih0KSkpLCB0aGlzLndyaXR0ZW5Eb2NzLmFkZCh0LnRvU3RyaW5nKCkpO1xuICAgIH1cbiAgICBhc3luYyBjb21taXQoKSB7XG4gICAgICAgIGlmICh0aGlzLmVuc3VyZUNvbW1pdE5vdENhbGxlZCgpLCB0aGlzLmxhc3RXcml0ZUVycm9yKSB0aHJvdyB0aGlzLmxhc3RXcml0ZUVycm9yO1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5yZWFkVmVyc2lvbnM7XG4gICAgICAgIC8vIEZvciBlYWNoIG11dGF0aW9uLCBub3RlIHRoYXQgdGhlIGRvYyB3YXMgd3JpdHRlbi5cbiAgICAgICAgICAgICAgICB0aGlzLm11dGF0aW9ucy5mb3JFYWNoKChlID0+IHtcbiAgICAgICAgICAgIHQuZGVsZXRlKGUua2V5LnRvU3RyaW5nKCkpO1xuICAgICAgICB9KSksIFxuICAgICAgICAvLyBGb3IgZWFjaCBkb2N1bWVudCB0aGF0IHdhcyByZWFkIGJ1dCBub3Qgd3JpdHRlbiB0bywgd2Ugd2FudCB0byBwZXJmb3JtXG4gICAgICAgIC8vIGEgYHZlcmlmeWAgb3BlcmF0aW9uLlxuICAgICAgICB0LmZvckVhY2goKCh0LCBlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuID0geHQuZnJvbVBhdGgoZSk7XG4gICAgICAgICAgICB0aGlzLm11dGF0aW9ucy5wdXNoKG5ldyBSbihuLCB0aGlzLnByZWNvbmRpdGlvbihuKSkpO1xuICAgICAgICB9KSksIGF3YWl0IGFzeW5jIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBLKHQpLCBzID0gd3Mobi5NKSArIFwiL2RvY3VtZW50c1wiLCBpID0ge1xuICAgICAgICAgICAgICAgIHdyaXRlczogZS5tYXAoKHQgPT4gVHMobi5NLCB0KSkpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXdhaXQgbi5pbyhcIkNvbW1pdFwiLCBzLCBpKTtcbiAgICAgICAgfSh0aGlzLmRhdGFzdG9yZSwgdGhpcy5tdXRhdGlvbnMpLCB0aGlzLmNvbW1pdHRlZCA9ICEwO1xuICAgIH1cbiAgICByZWNvcmRWZXJzaW9uKHQpIHtcbiAgICAgICAgbGV0IGU7XG4gICAgICAgIGlmICh0LmlzRm91bmREb2N1bWVudCgpKSBlID0gdC52ZXJzaW9uOyBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdC5pc05vRG9jdW1lbnQoKSkgdGhyb3cgTCgpO1xuICAgICAgICAgICAgLy8gRm9yIGRlbGV0ZWQgZG9jcywgd2UgbXVzdCB1c2UgYmFzZVZlcnNpb24gMCB3aGVuIHdlIG92ZXJ3cml0ZSB0aGVtLlxuICAgICAgICAgICAgZSA9IGN0Lm1pbigpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLnJlYWRWZXJzaW9ucy5nZXQodC5rZXkudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChuKSB7XG4gICAgICAgICAgICBpZiAoIWUuaXNFcXVhbChuKSkgXG4gICAgICAgICAgICAvLyBUaGlzIHRyYW5zYWN0aW9uIHdpbGwgZmFpbCBubyBtYXR0ZXIgd2hhdC5cbiAgICAgICAgICAgIHRocm93IG5ldyBRKEcuQUJPUlRFRCwgXCJEb2N1bWVudCB2ZXJzaW9uIGNoYW5nZWQgYmV0d2VlbiB0d28gcmVhZHMuXCIpO1xuICAgICAgICB9IGVsc2UgdGhpcy5yZWFkVmVyc2lvbnMuc2V0KHQua2V5LnRvU3RyaW5nKCksIGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQgd2hlbiBpdCB3YXMgcmVhZCBpbiB0aGlzIHRyYW5zYWN0aW9uLFxuICAgICAqIGFzIGEgcHJlY29uZGl0aW9uLCBvciBubyBwcmVjb25kaXRpb24gaWYgaXQgd2FzIG5vdCByZWFkLlxuICAgICAqLyAgICBwcmVjb25kaXRpb24odCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5yZWFkVmVyc2lvbnMuZ2V0KHQudG9TdHJpbmcoKSk7XG4gICAgICAgIHJldHVybiAhdGhpcy53cml0dGVuRG9jcy5oYXModC50b1N0cmluZygpKSAmJiBlID8gaG4udXBkYXRlVGltZShlKSA6IGhuLm5vbmUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcHJlY29uZGl0aW9uIGZvciBhIGRvY3VtZW50IGlmIHRoZSBvcGVyYXRpb24gaXMgYW4gdXBkYXRlLlxuICAgICAqLyAgICBwcmVjb25kaXRpb25Gb3JVcGRhdGUodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5yZWFkVmVyc2lvbnMuZ2V0KHQudG9TdHJpbmcoKSk7XG4gICAgICAgIC8vIFRoZSBmaXJzdCB0aW1lIGEgZG9jdW1lbnQgaXMgd3JpdHRlbiwgd2Ugd2FudCB0byB0YWtlIGludG8gYWNjb3VudCB0aGVcbiAgICAgICAgLy8gcmVhZCB0aW1lIGFuZCBleGlzdGVuY2VcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMud3JpdHRlbkRvY3MuaGFzKHQudG9TdHJpbmcoKSkgJiYgZSkge1xuICAgICAgICAgICAgaWYgKGUuaXNFcXVhbChjdC5taW4oKSkpIFxuICAgICAgICAgICAgLy8gVGhlIGRvY3VtZW50IGRvZXNuJ3QgZXhpc3QsIHNvIGZhaWwgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAgICAgICAgLy8gVGhpcyBoYXMgdG8gYmUgdmFsaWRhdGVkIGxvY2FsbHkgYmVjYXVzZSB5b3UgY2FuJ3Qgc2VuZCBhXG4gICAgICAgICAgICAvLyBwcmVjb25kaXRpb24gdGhhdCBhIGRvY3VtZW50IGRvZXMgbm90IGV4aXN0IHdpdGhvdXQgY2hhbmdpbmcgdGhlXG4gICAgICAgICAgICAvLyBzZW1hbnRpY3Mgb2YgdGhlIGJhY2tlbmQgd3JpdGUgdG8gYmUgYW4gaW5zZXJ0LiBUaGlzIGlzIHRoZSByZXZlcnNlXG4gICAgICAgICAgICAvLyBvZiB3aGF0IHdlIHdhbnQsIHNpbmNlIHdlIHdhbnQgdG8gYXNzZXJ0IHRoYXQgdGhlIGRvY3VtZW50IGRvZXNuJ3RcbiAgICAgICAgICAgIC8vIGV4aXN0IGJ1dCB0aGVuIHNlbmQgdGhlIHVwZGF0ZSBhbmQgaGF2ZSBpdCBmYWlsLiBTaW5jZSB3ZSBjYW4ndFxuICAgICAgICAgICAgLy8gZXhwcmVzcyB0aGF0IHRvIHRoZSBiYWNrZW5kLCB3ZSBoYXZlIHRvIHZhbGlkYXRlIGxvY2FsbHkuXG4gICAgICAgICAgICAvLyBOb3RlOiB0aGlzIGNhbiBjaGFuZ2Ugb25jZSB3ZSBjYW4gc2VuZCBzZXBhcmF0ZSB2ZXJpZnkgd3JpdGVzIGluIHRoZVxuICAgICAgICAgICAgLy8gdHJhbnNhY3Rpb24uXG4gICAgICAgICAgICB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIFwiQ2FuJ3QgdXBkYXRlIGEgZG9jdW1lbnQgdGhhdCBkb2Vzbid0IGV4aXN0LlwiKTtcbiAgICAgICAgICAgIC8vIERvY3VtZW50IGV4aXN0cywgYmFzZSBwcmVjb25kaXRpb24gb24gZG9jdW1lbnQgdXBkYXRlIHRpbWUuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaG4udXBkYXRlVGltZShlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBEb2N1bWVudCB3YXMgbm90IHJlYWQsIHNvIHdlIGp1c3QgdXNlIHRoZSBwcmVjb25kaXRpb25zIGZvciBhIGJsaW5kXG4gICAgICAgIC8vIHVwZGF0ZS5cbiAgICAgICAgcmV0dXJuIGhuLmV4aXN0cyghMCk7XG4gICAgfVxuICAgIHdyaXRlKHQpIHtcbiAgICAgICAgdGhpcy5lbnN1cmVDb21taXROb3RDYWxsZWQoKSwgdGhpcy5tdXRhdGlvbnMucHVzaCh0KTtcbiAgICB9XG4gICAgZW5zdXJlQ29tbWl0Tm90Q2FsbGVkKCkge31cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogVHJhbnNhY3Rpb25SdW5uZXIgZW5jYXBzdWxhdGVzIHRoZSBsb2dpYyBuZWVkZWQgdG8gcnVuIGFuZCByZXRyeSB0cmFuc2FjdGlvbnNcbiAqIHdpdGggYmFja29mZi5cbiAqL1xuY2xhc3MgVnUge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgdGhpcy5hc3luY1F1ZXVlID0gdCwgdGhpcy5kYXRhc3RvcmUgPSBlLCB0aGlzLnVwZGF0ZUZ1bmN0aW9uID0gbiwgdGhpcy5kZWZlcnJlZCA9IHMsIFxuICAgICAgICB0aGlzLmJ1ID0gNSwgdGhpcy52byA9IG5ldyAkbyh0aGlzLmFzeW5jUXVldWUsIFwidHJhbnNhY3Rpb25fcmV0cnlcIiAvKiBUcmFuc2FjdGlvblJldHJ5ICovKTtcbiAgICB9XG4gICAgLyoqIFJ1bnMgdGhlIHRyYW5zYWN0aW9uIGFuZCBzZXRzIHRoZSByZXN1bHQgb24gZGVmZXJyZWQuICovICAgIHJ1bigpIHtcbiAgICAgICAgdGhpcy5idSAtPSAxLCB0aGlzLlB1KCk7XG4gICAgfVxuICAgIFB1KCkge1xuICAgICAgICB0aGlzLnZvLnBvKChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0ID0gbmV3IFB1KHRoaXMuZGF0YXN0b3JlKSwgZSA9IHRoaXMuVnUodCk7XG4gICAgICAgICAgICBlICYmIGUudGhlbigoZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hc3luY1F1ZXVlLmVucXVldWVBbmRGb3JnZXQoKCgpID0+IHQuY29tbWl0KCkudGhlbigoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmVycmVkLnJlc29sdmUoZSk7XG4gICAgICAgICAgICAgICAgfSkpLmNhdGNoKCh0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52dSh0KTtcbiAgICAgICAgICAgICAgICB9KSkpKTtcbiAgICAgICAgICAgIH0pKS5jYXRjaCgodCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy52dSh0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBWdSh0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdGhpcy51cGRhdGVGdW5jdGlvbih0KTtcbiAgICAgICAgICAgIHJldHVybiAhU3QoZSkgJiYgZS5jYXRjaCAmJiBlLnRoZW4gPyBlIDogKHRoaXMuZGVmZXJyZWQucmVqZWN0KEVycm9yKFwiVHJhbnNhY3Rpb24gY2FsbGJhY2sgbXVzdCByZXR1cm4gYSBQcm9taXNlXCIpKSwgXG4gICAgICAgICAgICBudWxsKTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgLy8gRG8gbm90IHJldHJ5IGVycm9ycyB0aHJvd24gYnkgdXNlciBwcm92aWRlZCB1cGRhdGVGdW5jdGlvbi5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmVycmVkLnJlamVjdCh0KSwgbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2dSh0KSB7XG4gICAgICAgIHRoaXMuYnUgPiAwICYmIHRoaXMuU3UodCkgPyAodGhpcy5idSAtPSAxLCB0aGlzLmFzeW5jUXVldWUuZW5xdWV1ZUFuZEZvcmdldCgoKCkgPT4gKHRoaXMuUHUoKSwgXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpKSkpKSA6IHRoaXMuZGVmZXJyZWQucmVqZWN0KHQpO1xuICAgIH1cbiAgICBTdSh0KSB7XG4gICAgICAgIGlmIChcIkZpcmViYXNlRXJyb3JcIiA9PT0gdC5uYW1lKSB7XG4gICAgICAgICAgICAvLyBJbiB0cmFuc2FjdGlvbnMsIHRoZSBiYWNrZW5kIHdpbGwgZmFpbCBvdXRkYXRlZCByZWFkcyB3aXRoIEZBSUxFRF9QUkVDT05ESVRJT04gYW5kXG4gICAgICAgICAgICAvLyBub24tbWF0Y2hpbmcgZG9jdW1lbnQgdmVyc2lvbnMgd2l0aCBBQk9SVEVELiBUaGVzZSBlcnJvcnMgc2hvdWxkIGJlIHJldHJpZWQuXG4gICAgICAgICAgICBjb25zdCBlID0gdC5jb2RlO1xuICAgICAgICAgICAgcmV0dXJuIFwiYWJvcnRlZFwiID09PSBlIHx8IFwiZmFpbGVkLXByZWNvbmRpdGlvblwiID09PSBlIHx8ICF2bihlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gITE7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBGaXJlc3RvcmVDbGllbnQgaXMgYSB0b3AtbGV2ZWwgY2xhc3MgdGhhdCBjb25zdHJ1Y3RzIGFuZCBvd25zIGFsbCBvZiB0aGVcbiAqIHBpZWNlcyBvZiB0aGUgY2xpZW50IFNESyBhcmNoaXRlY3R1cmUuIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGVcbiAqIGFzeW5jIHF1ZXVlIHRoYXQgaXMgc2hhcmVkIGJ5IGFsbCBvZiB0aGUgb3RoZXIgY29tcG9uZW50cyBpbiB0aGUgc3lzdGVtLlxuICovXG5jbGFzcyB2dSB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgXG4gICAgLyoqXG4gICAgICogQXN5bmNocm9ub3VzIHF1ZXVlIHJlc3BvbnNpYmxlIGZvciBhbGwgb2Ygb3VyIGludGVybmFsIHByb2Nlc3NpbmcuIFdoZW5cbiAgICAgKiB3ZSBnZXQgaW5jb21pbmcgd29yayBmcm9tIHRoZSB1c2VyICh2aWEgcHVibGljIEFQSSkgb3IgdGhlIG5ldHdvcmtcbiAgICAgKiAoaW5jb21pbmcgR1JQQyBtZXNzYWdlcyksIHdlIHNob3VsZCBhbHdheXMgc2NoZWR1bGUgb250byB0aGlzIHF1ZXVlLlxuICAgICAqIFRoaXMgZW5zdXJlcyBhbGwgb2Ygb3VyIHdvcmsgaXMgcHJvcGVybHkgc2VyaWFsaXplZCAoZS5nLiB3ZSBkb24ndFxuICAgICAqIHN0YXJ0IHByb2Nlc3NpbmcgYSBuZXcgb3BlcmF0aW9uIHdoaWxlIHRoZSBwcmV2aW91cyBvbmUgaXMgd2FpdGluZyBmb3JcbiAgICAgKiBhbiBhc3luYyBJL08gdG8gY29tcGxldGUpLlxuICAgICAqL1xuICAgIG4sIHMpIHtcbiAgICAgICAgdGhpcy5hdXRoQ3JlZGVudGlhbHMgPSB0LCB0aGlzLmFwcENoZWNrQ3JlZGVudGlhbHMgPSBlLCB0aGlzLmFzeW5jUXVldWUgPSBuLCB0aGlzLmRhdGFiYXNlSW5mbyA9IHMsIFxuICAgICAgICB0aGlzLnVzZXIgPSBDLlVOQVVUSEVOVElDQVRFRCwgdGhpcy5jbGllbnRJZCA9IGl0LlIoKSwgdGhpcy5hdXRoQ3JlZGVudGlhbExpc3RlbmVyID0gKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCksIFxuICAgICAgICB0aGlzLmFwcENoZWNrQ3JlZGVudGlhbExpc3RlbmVyID0gKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCksIHRoaXMuYXV0aENyZWRlbnRpYWxzLnN0YXJ0KG4sIChhc3luYyB0ID0+IHtcbiAgICAgICAgICAgIE8oXCJGaXJlc3RvcmVDbGllbnRcIiwgXCJSZWNlaXZlZCB1c2VyPVwiLCB0LnVpZCksIGF3YWl0IHRoaXMuYXV0aENyZWRlbnRpYWxMaXN0ZW5lcih0KSwgXG4gICAgICAgICAgICB0aGlzLnVzZXIgPSB0O1xuICAgICAgICB9KSksIHRoaXMuYXBwQ2hlY2tDcmVkZW50aWFscy5zdGFydChuLCAodCA9PiAoTyhcIkZpcmVzdG9yZUNsaWVudFwiLCBcIlJlY2VpdmVkIG5ldyBhcHAgY2hlY2sgdG9rZW49XCIsIHQpLCBcbiAgICAgICAgdGhpcy5hcHBDaGVja0NyZWRlbnRpYWxMaXN0ZW5lcih0LCB0aGlzLnVzZXIpKSkpO1xuICAgIH1cbiAgICBhc3luYyBnZXRDb25maWd1cmF0aW9uKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYXN5bmNRdWV1ZTogdGhpcy5hc3luY1F1ZXVlLFxuICAgICAgICAgICAgZGF0YWJhc2VJbmZvOiB0aGlzLmRhdGFiYXNlSW5mbyxcbiAgICAgICAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxuICAgICAgICAgICAgYXV0aENyZWRlbnRpYWxzOiB0aGlzLmF1dGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgIGFwcENoZWNrQ3JlZGVudGlhbHM6IHRoaXMuYXBwQ2hlY2tDcmVkZW50aWFscyxcbiAgICAgICAgICAgIGluaXRpYWxVc2VyOiB0aGlzLnVzZXIsXG4gICAgICAgICAgICBtYXhDb25jdXJyZW50TGltYm9SZXNvbHV0aW9uczogMTAwXG4gICAgICAgIH07XG4gICAgfVxuICAgIHNldENyZWRlbnRpYWxDaGFuZ2VMaXN0ZW5lcih0KSB7XG4gICAgICAgIHRoaXMuYXV0aENyZWRlbnRpYWxMaXN0ZW5lciA9IHQ7XG4gICAgfVxuICAgIHNldEFwcENoZWNrVG9rZW5DaGFuZ2VMaXN0ZW5lcih0KSB7XG4gICAgICAgIHRoaXMuYXBwQ2hlY2tDcmVkZW50aWFsTGlzdGVuZXIgPSB0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgdGhhdCB0aGUgY2xpZW50IGhhcyBub3QgYmVlbiB0ZXJtaW5hdGVkLiBFbnN1cmVzIHRoYXQgb3RoZXIgbWV0aG9kcyBvblxuICAgICAqIHRoaXMgY2xhc3MgY2Fubm90IGJlIGNhbGxlZCBhZnRlciB0aGUgY2xpZW50IGlzIHRlcm1pbmF0ZWQuXG4gICAgICovICAgIHZlcmlmeU5vdFRlcm1pbmF0ZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLmFzeW5jUXVldWUuaXNTaHV0dGluZ0Rvd24pIHRocm93IG5ldyBRKEcuRkFJTEVEX1BSRUNPTkRJVElPTiwgXCJUaGUgY2xpZW50IGhhcyBhbHJlYWR5IGJlZW4gdGVybWluYXRlZC5cIik7XG4gICAgfVxuICAgIHRlcm1pbmF0ZSgpIHtcbiAgICAgICAgdGhpcy5hc3luY1F1ZXVlLmVudGVyUmVzdHJpY3RlZE1vZGUoKTtcbiAgICAgICAgY29uc3QgdCA9IG5ldyBqO1xuICAgICAgICByZXR1cm4gdGhpcy5hc3luY1F1ZXVlLmVucXVldWVBbmRGb3JnZXRFdmVuV2hpbGVSZXN0cmljdGVkKChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMub25saW5lQ29tcG9uZW50cyAmJiBhd2FpdCB0aGlzLm9ubGluZUNvbXBvbmVudHMudGVybWluYXRlKCksIHRoaXMub2ZmbGluZUNvbXBvbmVudHMgJiYgYXdhaXQgdGhpcy5vZmZsaW5lQ29tcG9uZW50cy50ZXJtaW5hdGUoKSwgXG4gICAgICAgICAgICAgICAgLy8gVGhlIGNyZWRlbnRpYWxzIHByb3ZpZGVyIG11c3QgYmUgdGVybWluYXRlZCBhZnRlciBzaHV0dGluZyBkb3duIHRoZVxuICAgICAgICAgICAgICAgIC8vIFJlbW90ZVN0b3JlIGFzIGl0IHdpbGwgcHJldmVudCB0aGUgUmVtb3RlU3RvcmUgZnJvbSByZXRyaWV2aW5nIGF1dGhcbiAgICAgICAgICAgICAgICAvLyB0b2tlbnMuXG4gICAgICAgICAgICAgICAgdGhpcy5hdXRoQ3JlZGVudGlhbHMuc2h1dGRvd24oKSwgdGhpcy5hcHBDaGVja0NyZWRlbnRpYWxzLnNodXRkb3duKCksIHQucmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBwYShlLCBcIkZhaWxlZCB0byBzaHV0ZG93biBwZXJzaXN0ZW5jZVwiKTtcbiAgICAgICAgICAgICAgICB0LnJlamVjdChuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpLCB0LnByb21pc2U7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBTdSh0LCBlKSB7XG4gICAgdC5hc3luY1F1ZXVlLnZlcmlmeU9wZXJhdGlvbkluUHJvZ3Jlc3MoKSwgTyhcIkZpcmVzdG9yZUNsaWVudFwiLCBcIkluaXRpYWxpemluZyBPZmZsaW5lQ29tcG9uZW50UHJvdmlkZXJcIik7XG4gICAgY29uc3QgbiA9IGF3YWl0IHQuZ2V0Q29uZmlndXJhdGlvbigpO1xuICAgIGF3YWl0IGUuaW5pdGlhbGl6ZShuKTtcbiAgICBsZXQgcyA9IG4uaW5pdGlhbFVzZXI7XG4gICAgdC5zZXRDcmVkZW50aWFsQ2hhbmdlTGlzdGVuZXIoKGFzeW5jIHQgPT4ge1xuICAgICAgICBzLmlzRXF1YWwodCkgfHwgKGF3YWl0IFdyKGUubG9jYWxTdG9yZSwgdCksIHMgPSB0KTtcbiAgICB9KSksIFxuICAgIC8vIFdoZW4gYSB1c2VyIGNhbGxzIGNsZWFyUGVyc2lzdGVuY2UoKSBpbiBvbmUgY2xpZW50LCBhbGwgb3RoZXIgY2xpZW50c1xuICAgIC8vIG5lZWQgdG8gYmUgdGVybWluYXRlZCB0byBhbGxvdyB0aGUgZGVsZXRlIHRvIHN1Y2NlZWQuXG4gICAgZS5wZXJzaXN0ZW5jZS5zZXREYXRhYmFzZURlbGV0ZWRMaXN0ZW5lcigoKCkgPT4gdC50ZXJtaW5hdGUoKSkpLCB0Lm9mZmxpbmVDb21wb25lbnRzID0gZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gRHUodCwgZSkge1xuICAgIHQuYXN5bmNRdWV1ZS52ZXJpZnlPcGVyYXRpb25JblByb2dyZXNzKCk7XG4gICAgY29uc3QgbiA9IGF3YWl0IEN1KHQpO1xuICAgIE8oXCJGaXJlc3RvcmVDbGllbnRcIiwgXCJJbml0aWFsaXppbmcgT25saW5lQ29tcG9uZW50UHJvdmlkZXJcIik7XG4gICAgY29uc3QgcyA9IGF3YWl0IHQuZ2V0Q29uZmlndXJhdGlvbigpO1xuICAgIGF3YWl0IGUuaW5pdGlhbGl6ZShuLCBzKSwgXG4gICAgLy8gVGhlIENyZWRlbnRpYWxDaGFuZ2VMaXN0ZW5lciBvZiB0aGUgb25saW5lIGNvbXBvbmVudCBwcm92aWRlciB0YWtlc1xuICAgIC8vIHByZWNlZGVuY2Ugb3ZlciB0aGUgb2ZmbGluZSBjb21wb25lbnQgcHJvdmlkZXIuXG4gICAgdC5zZXRDcmVkZW50aWFsQ2hhbmdlTGlzdGVuZXIoKHQgPT4gX2EoZS5yZW1vdGVTdG9yZSwgdCkpKSwgdC5zZXRBcHBDaGVja1Rva2VuQ2hhbmdlTGlzdGVuZXIoKCh0LCBuKSA9PiBfYShlLnJlbW90ZVN0b3JlLCBuKSkpLCBcbiAgICB0Lm9ubGluZUNvbXBvbmVudHMgPSBlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBDdSh0KSB7XG4gICAgcmV0dXJuIHQub2ZmbGluZUNvbXBvbmVudHMgfHwgKE8oXCJGaXJlc3RvcmVDbGllbnRcIiwgXCJVc2luZyBkZWZhdWx0IE9mZmxpbmVDb21wb25lbnRQcm92aWRlclwiKSwgXG4gICAgYXdhaXQgU3UodCwgbmV3IHB1KSksIHQub2ZmbGluZUNvbXBvbmVudHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHh1KHQpIHtcbiAgICByZXR1cm4gdC5vbmxpbmVDb21wb25lbnRzIHx8IChPKFwiRmlyZXN0b3JlQ2xpZW50XCIsIFwiVXNpbmcgZGVmYXVsdCBPbmxpbmVDb21wb25lbnRQcm92aWRlclwiKSwgXG4gICAgYXdhaXQgRHUodCwgbmV3IEV1KSksIHQub25saW5lQ29tcG9uZW50cztcbn1cblxuZnVuY3Rpb24gTnUodCkge1xuICAgIHJldHVybiBDdSh0KS50aGVuKCh0ID0+IHQucGVyc2lzdGVuY2UpKTtcbn1cblxuZnVuY3Rpb24ga3UodCkge1xuICAgIHJldHVybiBDdSh0KS50aGVuKCh0ID0+IHQubG9jYWxTdG9yZSkpO1xufVxuXG5mdW5jdGlvbiBNdSh0KSB7XG4gICAgcmV0dXJuIHh1KHQpLnRoZW4oKHQgPT4gdC5yZW1vdGVTdG9yZSkpO1xufVxuXG5mdW5jdGlvbiBPdSh0KSB7XG4gICAgcmV0dXJuIHh1KHQpLnRoZW4oKHQgPT4gdC5zeW5jRW5naW5lKSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uICR1KHQpIHtcbiAgICBjb25zdCBlID0gYXdhaXQgeHUodCksIG4gPSBlLmV2ZW50TWFuYWdlcjtcbiAgICByZXR1cm4gbi5vbkxpc3RlbiA9IHFhLmJpbmQobnVsbCwgZS5zeW5jRW5naW5lKSwgbi5vblVubGlzdGVuID0gS2EuYmluZChudWxsLCBlLnN5bmNFbmdpbmUpLCBcbiAgICBuO1xufVxuXG4vKiogRW5hYmxlcyB0aGUgbmV0d29yayBjb25uZWN0aW9uIGFuZCByZS1lbnF1ZXVlcyBhbGwgcGVuZGluZyBvcGVyYXRpb25zLiAqLyBmdW5jdGlvbiBGdSh0KSB7XG4gICAgcmV0dXJuIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlKChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGUgPSBhd2FpdCBOdSh0KSwgbiA9IGF3YWl0IE11KHQpO1xuICAgICAgICByZXR1cm4gZS5zZXROZXR3b3JrRW5hYmxlZCghMCksIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBLKHQpO1xuICAgICAgICAgICAgcmV0dXJuIGUuaGEuZGVsZXRlKDAgLyogVXNlckRpc2FibGVkICovKSwgR28oZSk7XG4gICAgICAgIH0obik7XG4gICAgfSkpO1xufVxuXG4vKiogRGlzYWJsZXMgdGhlIG5ldHdvcmsgY29ubmVjdGlvbi4gUGVuZGluZyBvcGVyYXRpb25zIHdpbGwgbm90IGNvbXBsZXRlLiAqLyBmdW5jdGlvbiBCdSh0KSB7XG4gICAgcmV0dXJuIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlKChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGUgPSBhd2FpdCBOdSh0KSwgbiA9IGF3YWl0IE11KHQpO1xuICAgICAgICByZXR1cm4gZS5zZXROZXR3b3JrRW5hYmxlZCghMSksIGFzeW5jIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBLKHQpO1xuICAgICAgICAgICAgZS5oYS5hZGQoMCAvKiBVc2VyRGlzYWJsZWQgKi8pLCBhd2FpdCBRbyhlKSwgXG4gICAgICAgICAgICAvLyBTZXQgdGhlIE9ubGluZVN0YXRlIHRvIE9mZmxpbmUgc28gZ2V0KClzIHJldHVybiBmcm9tIGNhY2hlLCBldGMuXG4gICAgICAgICAgICBlLmRhLnNldChcIk9mZmxpbmVcIiAvKiBPZmZsaW5lICovKTtcbiAgICAgICAgfShuKTtcbiAgICB9KSk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCB3cml0ZXMgdGhhdCB3ZXJlIHBlbmRpbmcgYXQgdGhlIHRpbWVcbiAqIHRoaXMgbWV0aG9kIHdhcyBjYWxsZWQgcmVjZWl2ZWQgc2VydmVyIGFja25vd2xlZGdlbWVudC4gQW4gYWNrbm93bGVkZ2VtZW50XG4gKiBjYW4gYmUgZWl0aGVyIGFjY2VwdGFuY2Ugb3IgcmVqZWN0aW9uLlxuICovIGZ1bmN0aW9uIEx1KHQsIGUpIHtcbiAgICBjb25zdCBuID0gbmV3IGo7XG4gICAgcmV0dXJuIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0KChhc3luYyAoKSA9PiBhc3luYyBmdW5jdGlvbih0LCBlLCBuKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzID0gYXdhaXQgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBLKHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuLnBlcnNpc3RlbmNlLnJ1blRyYW5zYWN0aW9uKFwicmVhZCBkb2N1bWVudFwiLCBcInJlYWRvbmx5XCIsICh0ID0+IG4udWkuQnModCwgZSkpKTtcbiAgICAgICAgICAgIH0odCwgZSk7XG4gICAgICAgICAgICBzLmlzRm91bmREb2N1bWVudCgpID8gbi5yZXNvbHZlKHMpIDogcy5pc05vRG9jdW1lbnQoKSA/IG4ucmVzb2x2ZShudWxsKSA6IG4ucmVqZWN0KG5ldyBRKEcuVU5BVkFJTEFCTEUsIFwiRmFpbGVkIHRvIGdldCBkb2N1bWVudCBmcm9tIGNhY2hlLiAoSG93ZXZlciwgdGhpcyBkb2N1bWVudCBtYXkgZXhpc3Qgb24gdGhlIHNlcnZlci4gUnVuIGFnYWluIHdpdGhvdXQgc2V0dGluZyAnc291cmNlJyBpbiB0aGUgR2V0T3B0aW9ucyB0byBhdHRlbXB0IHRvIHJldHJpZXZlIHRoZSBkb2N1bWVudCBmcm9tIHRoZSBzZXJ2ZXIuKVwiKSk7XG4gICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBwYSh0LCBgRmFpbGVkIHRvIGdldCBkb2N1bWVudCAnJHtlfSBmcm9tIGNhY2hlYCk7XG4gICAgICAgICAgICBuLnJlamVjdChzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAqIFJldHJpZXZlcyBhIGxhdGVuY3ktY29tcGVuc2F0ZWQgZG9jdW1lbnQgZnJvbSB0aGUgYmFja2VuZCB2aWEgYVxuICogU25hcHNob3RMaXN0ZW5lci5cbiAqLyAoYXdhaXQga3UodCksIGUsIG4pKSksIG4ucHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gcXUodCwgZSwgbiA9IHt9KSB7XG4gICAgY29uc3QgcyA9IG5ldyBqO1xuICAgIHJldHVybiB0LmFzeW5jUXVldWUuZW5xdWV1ZUFuZEZvcmdldCgoYXN5bmMgKCkgPT4gZnVuY3Rpb24odCwgZSwgbiwgcywgaSkge1xuICAgICAgICBjb25zdCByID0gbmV3IFJ1KHtcbiAgICAgICAgICAgIG5leHQ6IHIgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBxdWVyeSBmaXJzdCBiZWZvcmUgcGFzc2luZyBldmVudCB0byB1c2VyIHRvIGF2b2lkXG4gICAgICAgICAgICAgICAgLy8gdXNlciBhY3Rpb25zIGFmZmVjdGluZyB0aGUgbm93IHN0YWxlIHF1ZXJ5LlxuICAgICAgICAgICAgICAgIGUuZW5xdWV1ZUFuZEZvcmdldCgoKCkgPT4gUGEodCwgbykpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhID0gci5kb2NzLmhhcyhuKTtcbiAgICAgICAgICAgICAgICAhYSAmJiByLmZyb21DYWNoZSA/IFxuICAgICAgICAgICAgICAgIC8vIFRPRE8oZGltb25kKTogSWYgd2UncmUgb25saW5lIGFuZCB0aGUgZG9jdW1lbnQgZG9lc24ndFxuICAgICAgICAgICAgICAgIC8vIGV4aXN0IHRoZW4gd2UgcmVzb2x2ZSB3aXRoIGEgZG9jLmV4aXN0cyBzZXQgdG8gZmFsc2UuIElmXG4gICAgICAgICAgICAgICAgLy8gd2UncmUgb2ZmbGluZSBob3dldmVyLCB3ZSByZWplY3QgdGhlIFByb21pc2UgaW4gdGhpc1xuICAgICAgICAgICAgICAgIC8vIGNhc2UuIFR3byBvcHRpb25zOiAxKSBDYWNoZSB0aGUgbmVnYXRpdmUgcmVzcG9uc2UgZnJvbVxuICAgICAgICAgICAgICAgIC8vIHRoZSBzZXJ2ZXIgc28gd2UgY2FuIGRlbGl2ZXIgdGhhdCBldmVuIHdoZW4geW91J3JlXG4gICAgICAgICAgICAgICAgLy8gb2ZmbGluZSAyKSBBY3R1YWxseSByZWplY3QgdGhlIFByb21pc2UgaW4gdGhlIG9ubGluZSBjYXNlXG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIGRvY3VtZW50IGRvZXNuJ3QgZXhpc3QuXG4gICAgICAgICAgICAgICAgaS5yZWplY3QobmV3IFEoRy5VTkFWQUlMQUJMRSwgXCJGYWlsZWQgdG8gZ2V0IGRvY3VtZW50IGJlY2F1c2UgdGhlIGNsaWVudCBpcyBvZmZsaW5lLlwiKSkgOiBhICYmIHIuZnJvbUNhY2hlICYmIHMgJiYgXCJzZXJ2ZXJcIiA9PT0gcy5zb3VyY2UgPyBpLnJlamVjdChuZXcgUShHLlVOQVZBSUxBQkxFLCAnRmFpbGVkIHRvIGdldCBkb2N1bWVudCBmcm9tIHNlcnZlci4gKEhvd2V2ZXIsIHRoaXMgZG9jdW1lbnQgZG9lcyBleGlzdCBpbiB0aGUgbG9jYWwgY2FjaGUuIFJ1biBhZ2FpbiB3aXRob3V0IHNldHRpbmcgc291cmNlIHRvIFwic2VydmVyXCIgdG8gcmV0cmlldmUgdGhlIGNhY2hlZCBkb2N1bWVudC4pJykpIDogaS5yZXNvbHZlKHIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiB0ID0+IGkucmVqZWN0KHQpXG4gICAgICAgIH0pLCBvID0gbmV3IERhKERlKG4ucGF0aCksIHIsIHtcbiAgICAgICAgICAgIGluY2x1ZGVNZXRhZGF0YUNoYW5nZXM6ICEwLFxuICAgICAgICAgICAgU2E6ICEwXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYmEodCwgbyk7XG4gICAgfShhd2FpdCAkdSh0KSwgdC5hc3luY1F1ZXVlLCBlLCBuLCBzKSkpLCBzLnByb21pc2U7XG59XG5cbmZ1bmN0aW9uIFV1KHQsIGUpIHtcbiAgICBjb25zdCBuID0gbmV3IGo7XG4gICAgcmV0dXJuIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0KChhc3luYyAoKSA9PiBhc3luYyBmdW5jdGlvbih0LCBlLCBuKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzID0gYXdhaXQgZW8odCwgZSwgXG4gICAgICAgICAgICAvKiB1c2VQcmV2aW91c1Jlc3VsdHM9ICovICEwKSwgaSA9IG5ldyAkYShlLCBzLmhpKSwgciA9IGkuTGEocy5kb2N1bWVudHMpLCBvID0gaS5hcHBseUNoYW5nZXMociwgXG4gICAgICAgICAgICAvKiB1cGRhdGVMaW1ib0RvY3VtZW50cz0gKi8gITEpO1xuICAgICAgICAgICAgbi5yZXNvbHZlKG8uc25hcHNob3QpO1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICBjb25zdCBzID0gcGEodCwgYEZhaWxlZCB0byBleGVjdXRlIHF1ZXJ5ICcke2V9IGFnYWluc3QgY2FjaGVgKTtcbiAgICAgICAgICAgIG4ucmVqZWN0KHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICogUmV0cmlldmVzIGEgbGF0ZW5jeS1jb21wZW5zYXRlZCBxdWVyeSBzbmFwc2hvdCBmcm9tIHRoZSBiYWNrZW5kIHZpYSBhXG4gKiBTbmFwc2hvdExpc3RlbmVyLlxuICovIChhd2FpdCBrdSh0KSwgZSwgbikpKSwgbi5wcm9taXNlO1xufVxuXG5mdW5jdGlvbiBLdSh0LCBlLCBuID0ge30pIHtcbiAgICBjb25zdCBzID0gbmV3IGo7XG4gICAgcmV0dXJuIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0KChhc3luYyAoKSA9PiBmdW5jdGlvbih0LCBlLCBuLCBzLCBpKSB7XG4gICAgICAgIGNvbnN0IHIgPSBuZXcgUnUoe1xuICAgICAgICAgICAgbmV4dDogbiA9PiB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHF1ZXJ5IGZpcnN0IGJlZm9yZSBwYXNzaW5nIGV2ZW50IHRvIHVzZXIgdG8gYXZvaWRcbiAgICAgICAgICAgICAgICAvLyB1c2VyIGFjdGlvbnMgYWZmZWN0aW5nIHRoZSBub3cgc3RhbGUgcXVlcnkuXG4gICAgICAgICAgICAgICAgZS5lbnF1ZXVlQW5kRm9yZ2V0KCgoKSA9PiBQYSh0LCBvKSkpLCBuLmZyb21DYWNoZSAmJiBcInNlcnZlclwiID09PSBzLnNvdXJjZSA/IGkucmVqZWN0KG5ldyBRKEcuVU5BVkFJTEFCTEUsICdGYWlsZWQgdG8gZ2V0IGRvY3VtZW50cyBmcm9tIHNlcnZlci4gKEhvd2V2ZXIsIHRoZXNlIGRvY3VtZW50cyBtYXkgZXhpc3QgaW4gdGhlIGxvY2FsIGNhY2hlLiBSdW4gYWdhaW4gd2l0aG91dCBzZXR0aW5nIHNvdXJjZSB0byBcInNlcnZlclwiIHRvIHJldHJpZXZlIHRoZSBjYWNoZWQgZG9jdW1lbnRzLiknKSkgOiBpLnJlc29sdmUobik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6IHQgPT4gaS5yZWplY3QodClcbiAgICAgICAgfSksIG8gPSBuZXcgRGEobiwgciwge1xuICAgICAgICAgICAgaW5jbHVkZU1ldGFkYXRhQ2hhbmdlczogITAsXG4gICAgICAgICAgICBTYTogITBcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBiYSh0LCBvKTtcbiAgICB9KGF3YWl0ICR1KHQpLCB0LmFzeW5jUXVldWUsIGUsIG4sIHMpKSksIHMucHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gR3UodCwgZSkge1xuICAgIGNvbnN0IG4gPSBuZXcgUnUoZSk7XG4gICAgcmV0dXJuIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0KChhc3luYyAoKSA9PiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIEsodCkuSWEuYWRkKGUpLCBcbiAgICAgICAgLy8gSW1tZWRpYXRlbHkgZmlyZSBhbiBpbml0aWFsIGV2ZW50LCBpbmRpY2F0aW5nIGFsbCBleGlzdGluZyBsaXN0ZW5lcnNcbiAgICAgICAgLy8gYXJlIGluLXN5bmMuXG4gICAgICAgIGUubmV4dCgpO1xuICAgIH0oYXdhaXQgJHUodCksIG4pKSksICgpID0+IHtcbiAgICAgICAgbi5tdSgpLCB0LmFzeW5jUXVldWUuZW5xdWV1ZUFuZEZvcmdldCgoYXN5bmMgKCkgPT4gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgSyh0KS5JYS5kZWxldGUoZSk7XG4gICAgICAgIH0oYXdhaXQgJHUodCksIG4pKSk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBUYWtlcyBhbiB1cGRhdGVGdW5jdGlvbiBpbiB3aGljaCBhIHNldCBvZiByZWFkcyBhbmQgd3JpdGVzIGNhbiBiZSBwZXJmb3JtZWRcbiAqIGF0b21pY2FsbHkuIEluIHRoZSB1cGRhdGVGdW5jdGlvbiwgdGhlIGNsaWVudCBjYW4gcmVhZCBhbmQgd3JpdGUgdmFsdWVzXG4gKiB1c2luZyB0aGUgc3VwcGxpZWQgdHJhbnNhY3Rpb24gb2JqZWN0LiBBZnRlciB0aGUgdXBkYXRlRnVuY3Rpb24sIGFsbFxuICogY2hhbmdlcyB3aWxsIGJlIGNvbW1pdHRlZC4gSWYgYSByZXRyeWFibGUgZXJyb3Igb2NjdXJzIChleDogc29tZSBvdGhlclxuICogY2xpZW50IGhhcyBjaGFuZ2VkIGFueSBvZiB0aGUgZGF0YSByZWZlcmVuY2VkKSwgdGhlbiB0aGUgdXBkYXRlRnVuY3Rpb25cbiAqIHdpbGwgYmUgY2FsbGVkIGFnYWluIGFmdGVyIGEgYmFja29mZi4gSWYgdGhlIHVwZGF0ZUZ1bmN0aW9uIHN0aWxsIGZhaWxzXG4gKiBhZnRlciBhbGwgcmV0cmllcywgdGhlbiB0aGUgdHJhbnNhY3Rpb24gd2lsbCBiZSByZWplY3RlZC5cbiAqXG4gKiBUaGUgdHJhbnNhY3Rpb24gb2JqZWN0IHBhc3NlZCB0byB0aGUgdXBkYXRlRnVuY3Rpb24gY29udGFpbnMgbWV0aG9kcyBmb3JcbiAqIGFjY2Vzc2luZyBkb2N1bWVudHMgYW5kIGNvbGxlY3Rpb25zLiBVbmxpa2Ugb3RoZXIgZGF0YXN0b3JlIGFjY2VzcywgZGF0YVxuICogYWNjZXNzZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24gd2lsbCBub3QgcmVmbGVjdCBsb2NhbCBjaGFuZ2VzIHRoYXQgaGF2ZSBub3RcbiAqIGJlZW4gY29tbWl0dGVkLiBGb3IgdGhpcyByZWFzb24sIGl0IGlzIHJlcXVpcmVkIHRoYXQgYWxsIHJlYWRzIGFyZVxuICogcGVyZm9ybWVkIGJlZm9yZSBhbnkgd3JpdGVzLiBUcmFuc2FjdGlvbnMgbXVzdCBiZSBwZXJmb3JtZWQgd2hpbGUgb25saW5lLlxuICovIGZ1bmN0aW9uIFF1KHQsIGUpIHtcbiAgICBjb25zdCBuID0gbmV3IGo7XG4gICAgcmV0dXJuIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0KChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHMgPSBhd2FpdCBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICByZXR1cm4geHUodCkudGhlbigodCA9PiB0LmRhdGFzdG9yZSkpO1xuICAgICAgICB9KHQpO1xuICAgICAgICBuZXcgVnUodC5hc3luY1F1ZXVlLCBzLCBlLCBuKS5ydW4oKTtcbiAgICB9KSksIG4ucHJvbWlzZTtcbn1cblxuZnVuY3Rpb24ganUodCwgZSwgbiwgcykge1xuICAgIGNvbnN0IGkgPSBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIGxldCBuO1xuICAgICAgICBuID0gXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCA/IChuZXcgVGV4dEVuY29kZXIpLmVuY29kZSh0KSA6IHQ7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGJ1KHQsIGUpO1xuICAgICAgICB9KGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgVWludDhBcnJheSkgcmV0dXJuIEF1KHQsIGUpO1xuICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgcmV0dXJuIEF1KG5ldyBVaW50OEFycmF5KHQpLCBlKTtcbiAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgUmVhZGFibGVTdHJlYW0pIHJldHVybiB0LmdldFJlYWRlcigpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU291cmNlIG9mIGB0b0J5dGVTdHJlYW1SZWFkZXJgIGhhcyB0byBiZSBhIEFycmF5QnVmZmVyIG9yIFJlYWRhYmxlU3RyZWFtXCIpO1xuICAgICAgICB9KG4pLCBlKTtcbiAgICB9XG4gICAgLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gKG4sIE9vKGUpKTtcbiAgICB0LmFzeW5jUXVldWUuZW5xdWV1ZUFuZEZvcmdldCgoYXN5bmMgKCkgPT4ge1xuICAgICAgICB5dShhd2FpdCBPdSh0KSwgaSwgcyk7XG4gICAgfSkpO1xufVxuXG5mdW5jdGlvbiBXdSh0LCBlKSB7XG4gICAgcmV0dXJuIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlKChhc3luYyAoKSA9PiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBLKHQpO1xuICAgICAgICByZXR1cm4gbi5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIkdldCBuYW1lZCBxdWVyeVwiLCBcInJlYWRvbmx5XCIsICh0ID0+IG4uZnMuZ2V0TmFtZWRRdWVyeSh0LCBlKSkpO1xuICAgIH0oYXdhaXQga3UodCksIGUpKSk7XG59XG5cbmNvbnN0IHp1ID0gbmV3IE1hcDtcblxuLyoqXG4gKiBBbiBpbnN0YW5jZSBtYXAgdGhhdCBlbnN1cmVzIG9ubHkgb25lIERhdGFzdG9yZSBleGlzdHMgcGVyIEZpcmVzdG9yZVxuICogaW5zdGFuY2UuXG4gKi9cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5mdW5jdGlvbiBIdSh0LCBlLCBuKSB7XG4gICAgaWYgKCFuKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIGBGdW5jdGlvbiAke3R9KCkgY2Fubm90IGJlIGNhbGxlZCB3aXRoIGFuIGVtcHR5ICR7ZX0uYCk7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoYXQgdHdvIGJvb2xlYW4gb3B0aW9ucyBhcmUgbm90IHNldCBhdCB0aGUgc2FtZSB0aW1lLlxuICogQGludGVybmFsXG4gKi8gZnVuY3Rpb24gSnUodCwgZSwgbiwgcykge1xuICAgIGlmICghMCA9PT0gZSAmJiAhMCA9PT0gcykgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBgJHt0fSBhbmQgJHtufSBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci5gKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhhdCBgcGF0aGAgcmVmZXJzIHRvIGEgZG9jdW1lbnQgKGluZGljYXRlZCBieSB0aGUgZmFjdCBpdCBjb250YWluc1xuICogYW4gZXZlbiBudW1iZXJzIG9mIHNlZ21lbnRzKS5cbiAqLyBmdW5jdGlvbiBZdSh0KSB7XG4gICAgaWYgKCF4dC5pc0RvY3VtZW50S2V5KHQpKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIGBJbnZhbGlkIGRvY3VtZW50IHJlZmVyZW5jZS4gRG9jdW1lbnQgcmVmZXJlbmNlcyBtdXN0IGhhdmUgYW4gZXZlbiBudW1iZXIgb2Ygc2VnbWVudHMsIGJ1dCAke3R9IGhhcyAke3QubGVuZ3RofS5gKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhhdCBgcGF0aGAgcmVmZXJzIHRvIGEgY29sbGVjdGlvbiAoaW5kaWNhdGVkIGJ5IHRoZSBmYWN0IGl0XG4gKiBjb250YWlucyBhbiBvZGQgbnVtYmVycyBvZiBzZWdtZW50cykuXG4gKi8gZnVuY3Rpb24gWHUodCkge1xuICAgIGlmICh4dC5pc0RvY3VtZW50S2V5KHQpKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIGBJbnZhbGlkIGNvbGxlY3Rpb24gcmVmZXJlbmNlLiBDb2xsZWN0aW9uIHJlZmVyZW5jZXMgbXVzdCBoYXZlIGFuIG9kZCBudW1iZXIgb2Ygc2VnbWVudHMsIGJ1dCAke3R9IGhhcyAke3QubGVuZ3RofS5gKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgaXQncyBhIG5vbi1udWxsIG9iamVjdCB3aXRob3V0IGEgY3VzdG9tIHByb3RvdHlwZVxuICogKGkuZS4gZXhjbHVkZXMgQXJyYXksIERhdGUsIGV0Yy4pLlxuICovXG4vKiogUmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSB0eXBlIC8gdmFsdWUgb2YgdGhlIHByb3ZpZGVkIGlucHV0LiAqL1xuZnVuY3Rpb24gWnUodCkge1xuICAgIGlmICh2b2lkIDAgPT09IHQpIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICAgIGlmIChudWxsID09PSB0KSByZXR1cm4gXCJudWxsXCI7XG4gICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIHQpIHJldHVybiB0Lmxlbmd0aCA+IDIwICYmICh0ID0gYCR7dC5zdWJzdHJpbmcoMCwgMjApfS4uLmApLCBcbiAgICBKU09OLnN0cmluZ2lmeSh0KTtcbiAgICBpZiAoXCJudW1iZXJcIiA9PSB0eXBlb2YgdCB8fCBcImJvb2xlYW5cIiA9PSB0eXBlb2YgdCkgcmV0dXJuIFwiXCIgKyB0O1xuICAgIGlmIChcIm9iamVjdFwiID09IHR5cGVvZiB0KSB7XG4gICAgICAgIGlmICh0IGluc3RhbmNlb2YgQXJyYXkpIHJldHVybiBcImFuIGFycmF5XCI7XG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBcbiAgICAgICAgICAgIC8qKiB0cnkgdG8gZ2V0IHRoZSBjb25zdHJ1Y3RvciBuYW1lIGZvciBhbiBvYmplY3QuICovXG4gICAgICAgICAgICBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHQuY29uc3RydWN0b3IpIHJldHVybiB0LmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKipcbiAqIENhc3RzIGBvYmpgIHRvIGBUYCwgb3B0aW9uYWxseSB1bndyYXBwaW5nIENvbXBhdCB0eXBlcyB0byBleHBvc2UgdGhlXG4gKiB1bmRlcmx5aW5nIGluc3RhbmNlLiBUaHJvd3MgaWYgIGBvYmpgIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBgVGAuXG4gKlxuICogVGhpcyBjYXN0IGlzIHVzZWQgaW4gdGhlIExpdGUgYW5kIEZ1bGwgU0RLIHRvIHZlcmlmeSBpbnN0YW5jZSB0eXBlcyBmb3JcbiAqIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIHB1YmxpYyBBUEkuXG4gKiBAaW50ZXJuYWxcbiAqLyAodCk7XG4gICAgICAgICAgICByZXR1cm4gZSA/IGBhIGN1c3RvbSAke2V9IG9iamVjdGAgOiBcImFuIG9iamVjdFwiO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIHQgPyBcImEgZnVuY3Rpb25cIiA6IEwoKTtcbn1cblxuZnVuY3Rpb24gdGModCwgXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZSkge1xuICAgIGlmIChcIl9kZWxlZ2F0ZVwiIGluIHQgJiYgKFxuICAgIC8vIFVud3JhcCBDb21wYXQgdHlwZXNcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHQgPSB0Ll9kZWxlZ2F0ZSksICEodCBpbnN0YW5jZW9mIGUpKSB7XG4gICAgICAgIGlmIChlLm5hbWUgPT09IHQuY29uc3RydWN0b3IubmFtZSkgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBcIlR5cGUgZG9lcyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkIGluc3RhbmNlLiBEaWQgeW91IHBhc3MgYSByZWZlcmVuY2UgZnJvbSBhIGRpZmZlcmVudCBGaXJlc3RvcmUgU0RLP1wiKTtcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgbiA9IFp1KHQpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBgRXhwZWN0ZWQgdHlwZSAnJHtlLm5hbWV9JywgYnV0IGl0IHdhczogJHtufWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0O1xufVxuXG5mdW5jdGlvbiBlYyh0LCBlKSB7XG4gICAgaWYgKGUgPD0gMCkgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBgRnVuY3Rpb24gJHt0fSgpIHJlcXVpcmVzIGEgcG9zaXRpdmUgbnVtYmVyLCBidXQgaXQgd2FzOiAke2V9LmApO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLy8gc2V0dGluZ3MoKSBkZWZhdWx0czpcbi8qKlxuICogQSBjb25jcmV0ZSB0eXBlIGRlc2NyaWJpbmcgYWxsIHRoZSB2YWx1ZXMgdGhhdCBjYW4gYmUgYXBwbGllZCB2aWEgYVxuICogdXNlci1zdXBwbGllZCBgRmlyZXN0b3JlU2V0dGluZ3NgIG9iamVjdC4gVGhpcyBpcyBhIHNlcGFyYXRlIHR5cGUgc28gdGhhdFxuICogZGVmYXVsdHMgY2FuIGJlIHN1cHBsaWVkIGFuZCB0aGUgdmFsdWUgY2FuIGJlIGNoZWNrZWQgZm9yIGVxdWFsaXR5LlxuICovXG5jbGFzcyBuYyB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB2YXIgZTtcbiAgICAgICAgaWYgKHZvaWQgMCA9PT0gdC5ob3N0KSB7XG4gICAgICAgICAgICBpZiAodm9pZCAwICE9PSB0LnNzbCkgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBcIkNhbid0IHByb3ZpZGUgc3NsIG9wdGlvbiBpZiBob3N0IG9wdGlvbiBpcyBub3Qgc2V0XCIpO1xuICAgICAgICAgICAgdGhpcy5ob3N0ID0gXCJmaXJlc3RvcmUuZ29vZ2xlYXBpcy5jb21cIiwgdGhpcy5zc2wgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgdGhpcy5ob3N0ID0gdC5ob3N0LCB0aGlzLnNzbCA9IG51bGwgPT09IChlID0gdC5zc2wpIHx8IHZvaWQgMCA9PT0gZSB8fCBlO1xuICAgICAgICBpZiAodGhpcy5jcmVkZW50aWFscyA9IHQuY3JlZGVudGlhbHMsIHRoaXMuaWdub3JlVW5kZWZpbmVkUHJvcGVydGllcyA9ICEhdC5pZ25vcmVVbmRlZmluZWRQcm9wZXJ0aWVzLCBcbiAgICAgICAgdm9pZCAwID09PSB0LmNhY2hlU2l6ZUJ5dGVzKSB0aGlzLmNhY2hlU2l6ZUJ5dGVzID0gNDE5NDMwNDA7IGVsc2Uge1xuICAgICAgICAgICAgaWYgKC0xICE9PSB0LmNhY2hlU2l6ZUJ5dGVzICYmIHQuY2FjaGVTaXplQnl0ZXMgPCAxMDQ4NTc2KSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIFwiY2FjaGVTaXplQnl0ZXMgbXVzdCBiZSBhdCBsZWFzdCAxMDQ4NTc2XCIpO1xuICAgICAgICAgICAgdGhpcy5jYWNoZVNpemVCeXRlcyA9IHQuY2FjaGVTaXplQnl0ZXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5leHBlcmltZW50YWxGb3JjZUxvbmdQb2xsaW5nID0gISF0LmV4cGVyaW1lbnRhbEZvcmNlTG9uZ1BvbGxpbmcsIHRoaXMuZXhwZXJpbWVudGFsQXV0b0RldGVjdExvbmdQb2xsaW5nID0gISF0LmV4cGVyaW1lbnRhbEF1dG9EZXRlY3RMb25nUG9sbGluZywgXG4gICAgICAgIHRoaXMudXNlRmV0Y2hTdHJlYW1zID0gISF0LnVzZUZldGNoU3RyZWFtcywgSnUoXCJleHBlcmltZW50YWxGb3JjZUxvbmdQb2xsaW5nXCIsIHQuZXhwZXJpbWVudGFsRm9yY2VMb25nUG9sbGluZywgXCJleHBlcmltZW50YWxBdXRvRGV0ZWN0TG9uZ1BvbGxpbmdcIiwgdC5leHBlcmltZW50YWxBdXRvRGV0ZWN0TG9uZ1BvbGxpbmcpO1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9zdCA9PT0gdC5ob3N0ICYmIHRoaXMuc3NsID09PSB0LnNzbCAmJiB0aGlzLmNyZWRlbnRpYWxzID09PSB0LmNyZWRlbnRpYWxzICYmIHRoaXMuY2FjaGVTaXplQnl0ZXMgPT09IHQuY2FjaGVTaXplQnl0ZXMgJiYgdGhpcy5leHBlcmltZW50YWxGb3JjZUxvbmdQb2xsaW5nID09PSB0LmV4cGVyaW1lbnRhbEZvcmNlTG9uZ1BvbGxpbmcgJiYgdGhpcy5leHBlcmltZW50YWxBdXRvRGV0ZWN0TG9uZ1BvbGxpbmcgPT09IHQuZXhwZXJpbWVudGFsQXV0b0RldGVjdExvbmdQb2xsaW5nICYmIHRoaXMuaWdub3JlVW5kZWZpbmVkUHJvcGVydGllcyA9PT0gdC5pZ25vcmVVbmRlZmluZWRQcm9wZXJ0aWVzICYmIHRoaXMudXNlRmV0Y2hTdHJlYW1zID09PSB0LnVzZUZldGNoU3RyZWFtcztcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFRoZSBDbG91ZCBGaXJlc3RvcmUgc2VydmljZSBpbnRlcmZhY2UuXG4gKlxuICogRG8gbm90IGNhbGwgdGhpcyBjb25zdHJ1Y3RvciBkaXJlY3RseS4gSW5zdGVhZCwgdXNlIHtAbGluayBnZXRGaXJlc3RvcmV9LlxuICovIGNsYXNzIHNjIHtcbiAgICAvKiogQGhpZGVjb25zdHJ1Y3RvciAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy5fYXV0aENyZWRlbnRpYWxzID0gZSwgdGhpcy5fYXBwQ2hlY2tDcmVkZW50aWFscyA9IG4sIFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hldGhlciBpdCdzIGEgRmlyZXN0b3JlIG9yIEZpcmVzdG9yZSBMaXRlIGluc3RhbmNlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50eXBlID0gXCJmaXJlc3RvcmUtbGl0ZVwiLCB0aGlzLl9wZXJzaXN0ZW5jZUtleSA9IFwiKGxpdGUpXCIsIHRoaXMuX3NldHRpbmdzID0gbmV3IG5jKHt9KSwgXG4gICAgICAgIHRoaXMuX3NldHRpbmdzRnJvemVuID0gITEsIHQgaW5zdGFuY2VvZiB2dCA/IHRoaXMuX2RhdGFiYXNlSWQgPSB0IDogKHRoaXMuX2FwcCA9IHQsIFxuICAgICAgICB0aGlzLl9kYXRhYmFzZUlkID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmFwcGx5KHQub3B0aW9ucywgWyBcInByb2plY3RJZFwiIF0pKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsICdcInByb2plY3RJZFwiIG5vdCBwcm92aWRlZCBpbiBmaXJlYmFzZS5pbml0aWFsaXplQXBwLicpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyB2dCh0Lm9wdGlvbnMucHJvamVjdElkKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAqIE1vZGlmeSB0aGlzIGluc3RhbmNlIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIENsb3VkIEZpcmVzdG9yZSBlbXVsYXRvci5cbiAqXG4gKiBOb3RlOiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGlzIGluc3RhbmNlIGhhcyBiZWVuIHVzZWQgdG8gZG8gYW55XG4gKiBvcGVyYXRpb25zLlxuICpcbiAqIEBwYXJhbSBmaXJlc3RvcmUgLSBUaGUgYEZpcmVzdG9yZWAgaW5zdGFuY2UgdG8gY29uZmlndXJlIHRvIGNvbm5lY3QgdG8gdGhlXG4gKiBlbXVsYXRvci5cbiAqIEBwYXJhbSBob3N0IC0gdGhlIGVtdWxhdG9yIGhvc3QgKGV4OiBsb2NhbGhvc3QpLlxuICogQHBhcmFtIHBvcnQgLSB0aGUgZW11bGF0b3IgcG9ydCAoZXg6IDkwMDApLlxuICogQHBhcmFtIG9wdGlvbnMubW9ja1VzZXJUb2tlbiAtIHRoZSBtb2NrIGF1dGggdG9rZW4gdG8gdXNlIGZvciB1bml0IHRlc3RpbmdcbiAqIFNlY3VyaXR5IFJ1bGVzLlxuICovICh0KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSB7QGxpbmsgQGZpcmViYXNlL2FwcCNGaXJlYmFzZUFwcH0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgYEZpcmVzdG9yZWAgc2VydmljZVxuICAgICAqIGluc3RhbmNlLlxuICAgICAqLyAgICBnZXQgYXBwKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2FwcCkgdGhyb3cgbmV3IFEoRy5GQUlMRURfUFJFQ09ORElUSU9OLCBcIkZpcmVzdG9yZSB3YXMgbm90IGluaXRpYWxpemVkIHVzaW5nIHRoZSBGaXJlYmFzZSBTREsuICdhcHAnIGlzIG5vdCBhdmFpbGFibGVcIik7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcHA7XG4gICAgfVxuICAgIGdldCBfaW5pdGlhbGl6ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc0Zyb3plbjtcbiAgICB9XG4gICAgZ2V0IF90ZXJtaW5hdGVkKCkge1xuICAgICAgICByZXR1cm4gdm9pZCAwICE9PSB0aGlzLl90ZXJtaW5hdGVUYXNrO1xuICAgIH1cbiAgICBfc2V0U2V0dGluZ3ModCkge1xuICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3NGcm96ZW4pIHRocm93IG5ldyBRKEcuRkFJTEVEX1BSRUNPTkRJVElPTiwgXCJGaXJlc3RvcmUgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkIGFuZCBpdHMgc2V0dGluZ3MgY2FuIG5vIGxvbmdlciBiZSBjaGFuZ2VkLiBZb3UgY2FuIG9ubHkgbW9kaWZ5IHNldHRpbmdzIGJlZm9yZSBjYWxsaW5nIGFueSBvdGhlciBtZXRob2RzIG9uIGEgRmlyZXN0b3JlIG9iamVjdC5cIik7XG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gbmV3IG5jKHQpLCB2b2lkIDAgIT09IHQuY3JlZGVudGlhbHMgJiYgKHRoaXMuX2F1dGhDcmVkZW50aWFscyA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIGlmICghdCkgcmV0dXJuIG5ldyB6O1xuICAgICAgICAgICAgc3dpdGNoICh0LnR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBcImdhcGlcIjpcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gdC5jbGllbnQ7XG4gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoaXMgcmVhbGx5IGlzIGEgR2FwaSBjbGllbnQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBxKCEoXCJvYmplY3RcIiAhPSB0eXBlb2YgZSB8fCBudWxsID09PSBlIHx8ICFlLmF1dGggfHwgIWUuYXV0aC5nZXRBdXRoSGVhZGVyVmFsdWVGb3JGaXJzdFBhcnR5KSksIFxuICAgICAgICAgICAgICAgIG5ldyBYKGUsIHQuc2Vzc2lvbkluZGV4IHx8IFwiMFwiLCB0LmlhbVRva2VuIHx8IG51bGwpO1xuXG4gICAgICAgICAgICAgIGNhc2UgXCJwcm92aWRlclwiOlxuICAgICAgICAgICAgICAgIHJldHVybiB0LmNsaWVudDtcblxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgXCJtYWtlQXV0aENyZWRlbnRpYWxzUHJvdmlkZXIgZmFpbGVkIGR1ZSB0byBpbnZhbGlkIGNyZWRlbnRpYWwgdHlwZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSh0LmNyZWRlbnRpYWxzKSk7XG4gICAgfVxuICAgIF9nZXRTZXR0aW5ncygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzO1xuICAgIH1cbiAgICBfZnJlZXplU2V0dGluZ3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc0Zyb3plbiA9ICEwLCB0aGlzLl9zZXR0aW5ncztcbiAgICB9XG4gICAgX2RlbGV0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Rlcm1pbmF0ZVRhc2sgfHwgKHRoaXMuX3Rlcm1pbmF0ZVRhc2sgPSB0aGlzLl90ZXJtaW5hdGUoKSksIHRoaXMuX3Rlcm1pbmF0ZVRhc2s7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIGEgSlNPTi1zZXJpYWxpemFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBgRmlyZXN0b3JlYCBpbnN0YW5jZS4gKi8gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYXBwOiB0aGlzLl9hcHAsXG4gICAgICAgICAgICBkYXRhYmFzZUlkOiB0aGlzLl9kYXRhYmFzZUlkLFxuICAgICAgICAgICAgc2V0dGluZ3M6IHRoaXMuX3NldHRpbmdzXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRlcm1pbmF0ZXMgYWxsIGNvbXBvbmVudHMgdXNlZCBieSB0aGlzIGNsaWVudC4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGVcbiAgICAgKiB0aGlzIG1ldGhvZCB0byBjbGVhbiB1cCB0aGVpciBvd24gZGVwZW5kZW5jaWVzLCBidXQgbXVzdCBhbHNvIGNhbGwgdGhpc1xuICAgICAqIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIE9ubHkgZXZlciBjYWxsZWQgb25jZS5cbiAgICAgKi8gICAgX3Rlcm1pbmF0ZSgpIHtcbiAgICAgICAgLyoqXG4gKiBSZW1vdmVzIGFsbCBjb21wb25lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgaW5zdGFuY2UuIE11c3QgYmUgY2FsbGVkXG4gKiB3aGVuIHRoZSBgRmlyZXN0b3JlYCBpbnN0YW5jZSBpcyB0ZXJtaW5hdGVkLlxuICovXG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBjb25zdCBlID0genUuZ2V0KHQpO1xuICAgICAgICAgICAgZSAmJiAoTyhcIkNvbXBvbmVudFByb3ZpZGVyXCIsIFwiUmVtb3ZpbmcgRGF0YXN0b3JlXCIpLCB6dS5kZWxldGUodCksIGUudGVybWluYXRlKCkpO1xuICAgICAgICB9KHRoaXMpLCBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGljKHQsIGUsIG4sIHMgPSB7fSkge1xuICAgIHZhciBpO1xuICAgIGNvbnN0IHIgPSAodCA9IHRjKHQsIHNjKSkuX2dldFNldHRpbmdzKCk7XG4gICAgaWYgKFwiZmlyZXN0b3JlLmdvb2dsZWFwaXMuY29tXCIgIT09IHIuaG9zdCAmJiByLmhvc3QgIT09IGUgJiYgRihcIkhvc3QgaGFzIGJlZW4gc2V0IGluIGJvdGggc2V0dGluZ3MoKSBhbmQgdXNlRW11bGF0b3IoKSwgZW11bGF0b3IgaG9zdCB3aWxsIGJlIHVzZWRcIiksIFxuICAgIHQuX3NldFNldHRpbmdzKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgciksIHtcbiAgICAgICAgaG9zdDogYCR7ZX06JHtufWAsXG4gICAgICAgIHNzbDogITFcbiAgICB9KSksIHMubW9ja1VzZXJUb2tlbikge1xuICAgICAgICBsZXQgZSwgbjtcbiAgICAgICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIHMubW9ja1VzZXJUb2tlbikgZSA9IHMubW9ja1VzZXJUb2tlbiwgbiA9IEMuTU9DS19VU0VSOyBlbHNlIHtcbiAgICAgICAgICAgIC8vIExldCBjcmVhdGVNb2NrVXNlclRva2VuIHZhbGlkYXRlIGZpcnN0IChjYXRjaGVzIGNvbW1vbiBtaXN0YWtlcyBsaWtlXG4gICAgICAgICAgICAvLyBpbnZhbGlkIGZpZWxkIFwidWlkXCIgYW5kIG1pc3NpbmcgZmllbGQgXCJzdWJcIiAvIFwidXNlcl9pZFwiLilcbiAgICAgICAgICAgIGUgPSBjcmVhdGVNb2NrVXNlclRva2VuKHMubW9ja1VzZXJUb2tlbiwgbnVsbCA9PT0gKGkgPSB0Ll9hcHApIHx8IHZvaWQgMCA9PT0gaSA/IHZvaWQgMCA6IGkub3B0aW9ucy5wcm9qZWN0SWQpO1xuICAgICAgICAgICAgY29uc3QgciA9IHMubW9ja1VzZXJUb2tlbi5zdWIgfHwgcy5tb2NrVXNlclRva2VuLnVzZXJfaWQ7XG4gICAgICAgICAgICBpZiAoIXIpIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgXCJtb2NrVXNlclRva2VuIG11c3QgY29udGFpbiAnc3ViJyBvciAndXNlcl9pZCcgZmllbGQhXCIpO1xuICAgICAgICAgICAgbiA9IG5ldyBDKHIpO1xuICAgICAgICB9XG4gICAgICAgIHQuX2F1dGhDcmVkZW50aWFscyA9IG5ldyBIKG5ldyBXKGUsIG4pKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEEgYERvY3VtZW50UmVmZXJlbmNlYCByZWZlcnMgdG8gYSBkb2N1bWVudCBsb2NhdGlvbiBpbiBhIEZpcmVzdG9yZSBkYXRhYmFzZVxuICogYW5kIGNhbiBiZSB1c2VkIHRvIHdyaXRlLCByZWFkLCBvciBsaXN0ZW4gdG8gdGhlIGxvY2F0aW9uLiBUaGUgZG9jdW1lbnQgYXRcbiAqIHRoZSByZWZlcmVuY2VkIGxvY2F0aW9uIG1heSBvciBtYXkgbm90IGV4aXN0LlxuICovIGNsYXNzIHJjIHtcbiAgICAvKiogQGhpZGVjb25zdHJ1Y3RvciAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIFxuICAgIC8qKlxuICAgICAqIElmIHByb3ZpZGVkLCB0aGUgYEZpcmVzdG9yZURhdGFDb252ZXJ0ZXJgIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGUsIG4pIHtcbiAgICAgICAgdGhpcy5jb252ZXJ0ZXIgPSBlLCB0aGlzLl9rZXkgPSBuLCBcbiAgICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoaXMgRmlyZXN0b3JlIHJlZmVyZW5jZS4gKi9cbiAgICAgICAgdGhpcy50eXBlID0gXCJkb2N1bWVudFwiLCB0aGlzLmZpcmVzdG9yZSA9IHQ7XG4gICAgfVxuICAgIGdldCBfcGF0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2tleS5wYXRoO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZG9jdW1lbnQncyBpZGVudGlmaWVyIHdpdGhpbiBpdHMgY29sbGVjdGlvbi5cbiAgICAgKi8gICAgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fa2V5LnBhdGgubGFzdFNlZ21lbnQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXRoIG9mIHRoZSByZWZlcmVuY2VkIGRvY3VtZW50IChyZWxhdGl2ZVxuICAgICAqIHRvIHRoZSByb290IG9mIHRoZSBkYXRhYmFzZSkuXG4gICAgICovICAgIGdldCBwYXRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fa2V5LnBhdGguY2Fub25pY2FsU3RyaW5nKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBjb2xsZWN0aW9uIHRoaXMgYERvY3VtZW50UmVmZXJlbmNlYCBiZWxvbmdzIHRvLlxuICAgICAqLyAgICBnZXQgcGFyZW50KCkge1xuICAgICAgICByZXR1cm4gbmV3IGFjKHRoaXMuZmlyZXN0b3JlLCB0aGlzLmNvbnZlcnRlciwgdGhpcy5fa2V5LnBhdGgucG9wTGFzdCgpKTtcbiAgICB9XG4gICAgd2l0aENvbnZlcnRlcih0KSB7XG4gICAgICAgIHJldHVybiBuZXcgcmModGhpcy5maXJlc3RvcmUsIHQsIHRoaXMuX2tleSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgYFF1ZXJ5YCByZWZlcnMgdG8gYSBxdWVyeSB3aGljaCB5b3UgY2FuIHJlYWQgb3IgbGlzdGVuIHRvLiBZb3UgY2FuIGFsc29cbiAqIGNvbnN0cnVjdCByZWZpbmVkIGBRdWVyeWAgb2JqZWN0cyBieSBhZGRpbmcgZmlsdGVycyBhbmQgb3JkZXJpbmcuXG4gKi8gY2xhc3Mgb2Mge1xuICAgIC8vIFRoaXMgaXMgdGhlIGxpdGUgdmVyc2lvbiBvZiB0aGUgUXVlcnkgY2xhc3MgaW4gdGhlIG1haW4gU0RLLlxuICAgIC8qKiBAaGlkZWNvbnN0cnVjdG9yIHByb3RlY3RlZCAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIFxuICAgIC8qKlxuICAgICAqIElmIHByb3ZpZGVkLCB0aGUgYEZpcmVzdG9yZURhdGFDb252ZXJ0ZXJgIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGUsIG4pIHtcbiAgICAgICAgdGhpcy5jb252ZXJ0ZXIgPSBlLCB0aGlzLl9xdWVyeSA9IG4sIFxuICAgICAgICAvKiogVGhlIHR5cGUgb2YgdGhpcyBGaXJlc3RvcmUgcmVmZXJlbmNlLiAqL1xuICAgICAgICB0aGlzLnR5cGUgPSBcInF1ZXJ5XCIsIHRoaXMuZmlyZXN0b3JlID0gdDtcbiAgICB9XG4gICAgd2l0aENvbnZlcnRlcih0KSB7XG4gICAgICAgIHJldHVybiBuZXcgb2ModGhpcy5maXJlc3RvcmUsIHQsIHRoaXMuX3F1ZXJ5KTtcbiAgICB9XG59XG5cbi8qKlxuICogQSBgQ29sbGVjdGlvblJlZmVyZW5jZWAgb2JqZWN0IGNhbiBiZSB1c2VkIGZvciBhZGRpbmcgZG9jdW1lbnRzLCBnZXR0aW5nXG4gKiBkb2N1bWVudCByZWZlcmVuY2VzLCBhbmQgcXVlcnlpbmcgZm9yIGRvY3VtZW50cyAodXNpbmcge0BsaW5rIHF1ZXJ5fSkuXG4gKi8gY2xhc3MgYWMgZXh0ZW5kcyBvYyB7XG4gICAgLyoqIEBoaWRlY29uc3RydWN0b3IgKi9cbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgIHN1cGVyKHQsIGUsIERlKG4pKSwgdGhpcy5fcGF0aCA9IG4sIFxuICAgICAgICAvKiogVGhlIHR5cGUgb2YgdGhpcyBGaXJlc3RvcmUgcmVmZXJlbmNlLiAqL1xuICAgICAgICB0aGlzLnR5cGUgPSBcImNvbGxlY3Rpb25cIjtcbiAgICB9XG4gICAgLyoqIFRoZSBjb2xsZWN0aW9uJ3MgaWRlbnRpZmllci4gKi8gICAgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcXVlcnkucGF0aC5sYXN0U2VnbWVudCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBhdGggb2YgdGhlIHJlZmVyZW5jZWQgY29sbGVjdGlvbiAocmVsYXRpdmVcbiAgICAgKiB0byB0aGUgcm9vdCBvZiB0aGUgZGF0YWJhc2UpLlxuICAgICAqLyAgICBnZXQgcGF0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3F1ZXJ5LnBhdGguY2Fub25pY2FsU3RyaW5nKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBjb250YWluaW5nIGBEb2N1bWVudFJlZmVyZW5jZWAgaWYgdGhpcyBpcyBhXG4gICAgICogc3ViY29sbGVjdGlvbi4gSWYgdGhpcyBpc24ndCBhIHN1YmNvbGxlY3Rpb24sIHRoZSByZWZlcmVuY2UgaXMgbnVsbC5cbiAgICAgKi8gICAgZ2V0IHBhcmVudCgpIHtcbiAgICAgICAgY29uc3QgdCA9IHRoaXMuX3BhdGgucG9wTGFzdCgpO1xuICAgICAgICByZXR1cm4gdC5pc0VtcHR5KCkgPyBudWxsIDogbmV3IHJjKHRoaXMuZmlyZXN0b3JlLCBcbiAgICAgICAgLyogY29udmVydGVyPSAqLyBudWxsLCBuZXcgeHQodCkpO1xuICAgIH1cbiAgICB3aXRoQ29udmVydGVyKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBhYyh0aGlzLmZpcmVzdG9yZSwgdCwgdGhpcy5fcGF0aCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB1Yyh0LCBlLCAuLi5uKSB7XG4gICAgaWYgKHQgPSBnZXRNb2R1bGFySW5zdGFuY2UodCksIEh1KFwiY29sbGVjdGlvblwiLCBcInBhdGhcIiwgZSksIHQgaW5zdGFuY2VvZiBzYykge1xuICAgICAgICBjb25zdCBzID0gX3QuZnJvbVN0cmluZyhlLCAuLi5uKTtcbiAgICAgICAgcmV0dXJuIFh1KHMpLCBuZXcgYWModCwgLyogY29udmVydGVyPSAqLyBudWxsLCBzKTtcbiAgICB9XG4gICAge1xuICAgICAgICBpZiAoISh0IGluc3RhbmNlb2YgcmMgfHwgdCBpbnN0YW5jZW9mIGFjKSkgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBcIkV4cGVjdGVkIGZpcnN0IGFyZ3VtZW50IHRvIGNvbGxlY3Rpb24oKSB0byBiZSBhIENvbGxlY3Rpb25SZWZlcmVuY2UsIGEgRG9jdW1lbnRSZWZlcmVuY2Ugb3IgRmlyZWJhc2VGaXJlc3RvcmVcIik7XG4gICAgICAgIGNvbnN0IHMgPSB0Ll9wYXRoLmNoaWxkKF90LmZyb21TdHJpbmcoZSwgLi4ubikpO1xuICAgICAgICByZXR1cm4gWHUocyksIG5ldyBhYyh0LmZpcmVzdG9yZSwgXG4gICAgICAgIC8qIGNvbnZlcnRlcj0gKi8gbnVsbCwgcyk7XG4gICAgfVxufVxuXG4vLyBUT0RPKGZpcmVzdG9yZWxpdGUpOiBDb25zaWRlciB1c2luZyBFcnJvckZhY3RvcnkgLVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZpcmViYXNlL2ZpcmViYXNlLWpzLXNkay9ibG9iLzAxMzFlMWYvcGFja2FnZXMvdXRpbC9zcmMvZXJyb3JzLnRzI0wxMDZcbi8qKlxuICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBgUXVlcnlgIGluc3RhbmNlIHRoYXQgaW5jbHVkZXMgYWxsIGRvY3VtZW50cyBpbiB0aGVcbiAqIGRhdGFiYXNlIHRoYXQgYXJlIGNvbnRhaW5lZCBpbiBhIGNvbGxlY3Rpb24gb3Igc3ViY29sbGVjdGlvbiB3aXRoIHRoZVxuICogZ2l2ZW4gYGNvbGxlY3Rpb25JZGAuXG4gKlxuICogQHBhcmFtIGZpcmVzdG9yZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSByb290IGBGaXJlc3RvcmVgIGluc3RhbmNlLlxuICogQHBhcmFtIGNvbGxlY3Rpb25JZCAtIElkZW50aWZpZXMgdGhlIGNvbGxlY3Rpb25zIHRvIHF1ZXJ5IG92ZXIuIEV2ZXJ5XG4gKiBjb2xsZWN0aW9uIG9yIHN1YmNvbGxlY3Rpb24gd2l0aCB0aGlzIElEIGFzIHRoZSBsYXN0IHNlZ21lbnQgb2YgaXRzIHBhdGhcbiAqIHdpbGwgYmUgaW5jbHVkZWQuIENhbm5vdCBjb250YWluIGEgc2xhc2guXG4gKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBgUXVlcnlgLlxuICovIGZ1bmN0aW9uIGNjKHQsIGUpIHtcbiAgICBpZiAodCA9IHRjKHQsIHNjKSwgSHUoXCJjb2xsZWN0aW9uR3JvdXBcIiwgXCJjb2xsZWN0aW9uIGlkXCIsIGUpLCBlLmluZGV4T2YoXCIvXCIpID49IDApIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgYEludmFsaWQgY29sbGVjdGlvbiBJRCAnJHtlfScgcGFzc2VkIHRvIGZ1bmN0aW9uIGNvbGxlY3Rpb25Hcm91cCgpLiBDb2xsZWN0aW9uIElEcyBtdXN0IG5vdCBjb250YWluICcvJy5gKTtcbiAgICByZXR1cm4gbmV3IG9jKHQsIFxuICAgIC8qIGNvbnZlcnRlcj0gKi8gbnVsbCwgXG4gICAgLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFF1ZXJ5IGZvciBhIGNvbGxlY3Rpb24gZ3JvdXAgcXVlcnkgdGhhdCBtYXRjaGVzIGFsbCBkb2N1bWVudHNcbiAqIHdpdGhpbiB0aGUgcHJvdmlkZWQgY29sbGVjdGlvbiBncm91cC5cbiAqL1xuICAgIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB2ZShfdC5lbXB0eVBhdGgoKSwgdCk7XG4gICAgfShlKSk7XG59XG5cbmZ1bmN0aW9uIGhjKHQsIGUsIC4uLm4pIHtcbiAgICBpZiAodCA9IGdldE1vZHVsYXJJbnN0YW5jZSh0KSwgXG4gICAgLy8gV2UgYWxsb3cgb21pc3Npb24gb2YgJ3BhdGhTdHJpbmcnIGJ1dCBleHBsaWNpdGx5IHByb2hpYml0IHBhc3NpbmcgaW4gYm90aFxuICAgIC8vICd1bmRlZmluZWQnIGFuZCAnbnVsbCcuXG4gICAgMSA9PT0gYXJndW1lbnRzLmxlbmd0aCAmJiAoZSA9IGl0LlIoKSksIEh1KFwiZG9jXCIsIFwicGF0aFwiLCBlKSwgdCBpbnN0YW5jZW9mIHNjKSB7XG4gICAgICAgIGNvbnN0IHMgPSBfdC5mcm9tU3RyaW5nKGUsIC4uLm4pO1xuICAgICAgICByZXR1cm4gWXUocyksIG5ldyByYyh0LCBcbiAgICAgICAgLyogY29udmVydGVyPSAqLyBudWxsLCBuZXcgeHQocykpO1xuICAgIH1cbiAgICB7XG4gICAgICAgIGlmICghKHQgaW5zdGFuY2VvZiByYyB8fCB0IGluc3RhbmNlb2YgYWMpKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIFwiRXhwZWN0ZWQgZmlyc3QgYXJndW1lbnQgdG8gY29sbGVjdGlvbigpIHRvIGJlIGEgQ29sbGVjdGlvblJlZmVyZW5jZSwgYSBEb2N1bWVudFJlZmVyZW5jZSBvciBGaXJlYmFzZUZpcmVzdG9yZVwiKTtcbiAgICAgICAgY29uc3QgcyA9IHQuX3BhdGguY2hpbGQoX3QuZnJvbVN0cmluZyhlLCAuLi5uKSk7XG4gICAgICAgIHJldHVybiBZdShzKSwgbmV3IHJjKHQuZmlyZXN0b3JlLCB0IGluc3RhbmNlb2YgYWMgPyB0LmNvbnZlcnRlciA6IG51bGwsIG5ldyB4dChzKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvdmlkZWQgcmVmZXJlbmNlcyBhcmUgZXF1YWwuXG4gKlxuICogQHBhcmFtIGxlZnQgLSBBIHJlZmVyZW5jZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHJpZ2h0IC0gQSByZWZlcmVuY2UgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHJlZmVyZW5jZXMgcG9pbnQgdG8gdGhlIHNhbWUgbG9jYXRpb24gaW4gdGhlIHNhbWVcbiAqIEZpcmVzdG9yZSBkYXRhYmFzZS5cbiAqLyBmdW5jdGlvbiBsYyh0LCBlKSB7XG4gICAgcmV0dXJuIHQgPSBnZXRNb2R1bGFySW5zdGFuY2UodCksIGUgPSBnZXRNb2R1bGFySW5zdGFuY2UoZSksICh0IGluc3RhbmNlb2YgcmMgfHwgdCBpbnN0YW5jZW9mIGFjKSAmJiAoZSBpbnN0YW5jZW9mIHJjIHx8IGUgaW5zdGFuY2VvZiBhYykgJiYgKHQuZmlyZXN0b3JlID09PSBlLmZpcmVzdG9yZSAmJiB0LnBhdGggPT09IGUucGF0aCAmJiB0LmNvbnZlcnRlciA9PT0gZS5jb252ZXJ0ZXIpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvdmlkZWQgcXVlcmllcyBwb2ludCB0byB0aGUgc2FtZSBjb2xsZWN0aW9uIGFuZCBhcHBseVxuICogdGhlIHNhbWUgY29uc3RyYWludHMuXG4gKlxuICogQHBhcmFtIGxlZnQgLSBBIGBRdWVyeWAgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSByaWdodCAtIEEgYFF1ZXJ5YCB0byBjb21wYXJlLlxuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgcmVmZXJlbmNlcyBwb2ludCB0byB0aGUgc2FtZSBsb2NhdGlvbiBpbiB0aGUgc2FtZVxuICogRmlyZXN0b3JlIGRhdGFiYXNlLlxuICovIGZ1bmN0aW9uIGZjKHQsIGUpIHtcbiAgICByZXR1cm4gdCA9IGdldE1vZHVsYXJJbnN0YW5jZSh0KSwgZSA9IGdldE1vZHVsYXJJbnN0YW5jZShlKSwgdCBpbnN0YW5jZW9mIG9jICYmIGUgaW5zdGFuY2VvZiBvYyAmJiAodC5maXJlc3RvcmUgPT09IGUuZmlyZXN0b3JlICYmIEJlKHQuX3F1ZXJ5LCBlLl9xdWVyeSkgJiYgdC5jb252ZXJ0ZXIgPT09IGUuY29udmVydGVyKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gY2xhc3MgZGMge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBUaGUgbGFzdCBwcm9taXNlIGluIHRoZSBxdWV1ZS5cbiAgICAgICAgdGhpcy5EdSA9IFByb21pc2UucmVzb2x2ZSgpLCBcbiAgICAgICAgLy8gQSBsaXN0IG9mIHJldHJ5YWJsZSBvcGVyYXRpb25zLiBSZXRyeWFibGUgb3BlcmF0aW9ucyBhcmUgcnVuIGluIG9yZGVyIGFuZFxuICAgICAgICAvLyByZXRyaWVkIHdpdGggYmFja29mZi5cbiAgICAgICAgdGhpcy5DdSA9IFtdLCBcbiAgICAgICAgLy8gSXMgdGhpcyBBc3luY1F1ZXVlIGJlaW5nIHNodXQgZG93bj8gT25jZSBpdCBpcyBzZXQgdG8gdHJ1ZSwgaXQgd2lsbCBub3RcbiAgICAgICAgLy8gYmUgY2hhbmdlZCBhZ2Fpbi5cbiAgICAgICAgdGhpcy54dSA9ICExLCBcbiAgICAgICAgLy8gT3BlcmF0aW9ucyBzY2hlZHVsZWQgdG8gYmUgcXVldWVkIGluIHRoZSBmdXR1cmUuIE9wZXJhdGlvbnMgYXJlXG4gICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBhZnRlciB0aGV5IGFyZSBydW4gb3IgY2FuY2VsZWQuXG4gICAgICAgIHRoaXMuTnUgPSBbXSwgXG4gICAgICAgIC8vIHZpc2libGUgZm9yIHRlc3RpbmdcbiAgICAgICAgdGhpcy5rdSA9IG51bGwsIFxuICAgICAgICAvLyBGbGFnIHNldCB3aGlsZSB0aGVyZSdzIGFuIG91dHN0YW5kaW5nIEFzeW5jUXVldWUgb3BlcmF0aW9uLCB1c2VkIGZvclxuICAgICAgICAvLyBhc3NlcnRpb24gc2FuaXR5LWNoZWNrcy5cbiAgICAgICAgdGhpcy5NdSA9ICExLCBcbiAgICAgICAgLy8gRW5hYmxlZCBkdXJpbmcgc2h1dGRvd24gb24gU2FmYXJpIHRvIHByZXZlbnQgZnV0dXJlIGFjY2VzcyB0byBJbmRleGVkREIuXG4gICAgICAgIHRoaXMuT3UgPSAhMSwgXG4gICAgICAgIC8vIExpc3Qgb2YgVGltZXJJZHMgdG8gZmFzdC1mb3J3YXJkIGRlbGF5cyBmb3IuXG4gICAgICAgIHRoaXMuJHUgPSBbXSwgXG4gICAgICAgIC8vIEJhY2tvZmYgdGltZXIgdXNlZCB0byBzY2hlZHVsZSByZXRyaWVzIGZvciByZXRyeWFibGUgb3BlcmF0aW9uc1xuICAgICAgICB0aGlzLnZvID0gbmV3ICRvKHRoaXMsIFwiYXN5bmNfcXVldWVfcmV0cnlcIiAvKiBBc3luY1F1ZXVlUmV0cnkgKi8pLCBcbiAgICAgICAgLy8gVmlzaWJpbGl0eSBoYW5kbGVyIHRoYXQgdHJpZ2dlcnMgYW4gaW1tZWRpYXRlIHJldHJ5IG9mIGFsbCByZXRyeWFibGVcbiAgICAgICAgLy8gb3BlcmF0aW9ucy4gTWVhbnQgdG8gc3BlZWQgdXAgcmVjb3Zlcnkgd2hlbiB3ZSByZWdhaW4gZmlsZSBzeXN0ZW0gYWNjZXNzXG4gICAgICAgIC8vIGFmdGVyIHBhZ2UgY29tZXMgaW50byBmb3JlZ3JvdW5kLlxuICAgICAgICB0aGlzLkZ1ID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdCA9IE1vKCk7XG4gICAgICAgICAgICB0ICYmIE8oXCJBc3luY1F1ZXVlXCIsIFwiVmlzaWJpbGl0eSBzdGF0ZSBjaGFuZ2VkIHRvIFwiICsgdC52aXNpYmlsaXR5U3RhdGUpLCB0aGlzLnZvLlRvKCk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHQgPSBNbygpO1xuICAgICAgICB0ICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgdC5hZGRFdmVudExpc3RlbmVyICYmIHQuYWRkRXZlbnRMaXN0ZW5lcihcInZpc2liaWxpdHljaGFuZ2VcIiwgdGhpcy5GdSk7XG4gICAgfVxuICAgIGdldCBpc1NodXR0aW5nRG93bigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueHU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBuZXcgb3BlcmF0aW9uIHRvIHRoZSBxdWV1ZSB3aXRob3V0IHdhaXRpbmcgZm9yIGl0IHRvIGNvbXBsZXRlIChpLmUuXG4gICAgICogd2UgaWdub3JlIHRoZSBQcm9taXNlIHJlc3VsdCkuXG4gICAgICovICAgIGVucXVldWVBbmRGb3JnZXQodCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICAgIHRoaXMuZW5xdWV1ZSh0KTtcbiAgICB9XG4gICAgZW5xdWV1ZUFuZEZvcmdldEV2ZW5XaGlsZVJlc3RyaWN0ZWQodCkge1xuICAgICAgICB0aGlzLkJ1KCksIFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICAgIHRoaXMuTHUodCk7XG4gICAgfVxuICAgIGVudGVyUmVzdHJpY3RlZE1vZGUodCkge1xuICAgICAgICBpZiAoIXRoaXMueHUpIHtcbiAgICAgICAgICAgIHRoaXMueHUgPSAhMCwgdGhpcy5PdSA9IHQgfHwgITE7XG4gICAgICAgICAgICBjb25zdCBlID0gTW8oKTtcbiAgICAgICAgICAgIGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBlLnJlbW92ZUV2ZW50TGlzdGVuZXIgJiYgZS5yZW1vdmVFdmVudExpc3RlbmVyKFwidmlzaWJpbGl0eWNoYW5nZVwiLCB0aGlzLkZ1KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbnF1ZXVlKHQpIHtcbiAgICAgICAgaWYgKHRoaXMuQnUoKSwgdGhpcy54dSkgXG4gICAgICAgIC8vIFJldHVybiBhIFByb21pc2Ugd2hpY2ggbmV2ZXIgcmVzb2x2ZXMuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoKCkgPT4ge30pKTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgZGVmZXJyZWQgUHJvbWlzZSB0aGF0IHdlIGNhbiByZXR1cm4gdG8gdGhlIGNhbGxlZS4gVGhpc1xuICAgICAgICAvLyBhbGxvd3MgdXMgdG8gcmV0dXJuIGEgXCJoYW5naW5nIFByb21pc2VcIiBvbmx5IHRvIHRoZSBjYWxsZWUgYW5kIHN0aWxsXG4gICAgICAgIC8vIGFkdmFuY2UgdGhlIHF1ZXVlIGV2ZW4gd2hlbiB0aGUgb3BlcmF0aW9uIGlzIG5vdCBydW4uXG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBqO1xuICAgICAgICByZXR1cm4gdGhpcy5MdSgoKCkgPT4gdGhpcy54dSAmJiB0aGlzLk91ID8gUHJvbWlzZS5yZXNvbHZlKCkgOiAodCgpLnRoZW4oZS5yZXNvbHZlLCBlLnJlamVjdCksIFxuICAgICAgICBlLnByb21pc2UpKSkudGhlbigoKCkgPT4gZS5wcm9taXNlKSk7XG4gICAgfVxuICAgIGVucXVldWVSZXRyeWFibGUodCkge1xuICAgICAgICB0aGlzLmVucXVldWVBbmRGb3JnZXQoKCgpID0+ICh0aGlzLkN1LnB1c2godCksIHRoaXMucXUoKSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUnVucyB0aGUgbmV4dCBvcGVyYXRpb24gZnJvbSB0aGUgcmV0cnlhYmxlIHF1ZXVlLiBJZiB0aGUgb3BlcmF0aW9uIGZhaWxzLFxuICAgICAqIHJlc2NoZWR1bGVzIHdpdGggYmFja29mZi5cbiAgICAgKi8gICAgYXN5bmMgcXUoKSB7XG4gICAgICAgIGlmICgwICE9PSB0aGlzLkN1Lmxlbmd0aCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLkN1WzBdKCksIHRoaXMuQ3Uuc2hpZnQoKSwgdGhpcy52by5yZXNldCgpO1xuICAgICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgICAgIGlmICghZGkodCkpIHRocm93IHQ7XG4gLy8gRmFpbHVyZSB3aWxsIGJlIGhhbmRsZWQgYnkgQXN5bmNRdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPKFwiQXN5bmNRdWV1ZVwiLCBcIk9wZXJhdGlvbiBmYWlsZWQgd2l0aCByZXRyeWFibGUgZXJyb3I6IFwiICsgdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLkN1Lmxlbmd0aCA+IDAgJiYgXG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgYWRkaXRpb25hbCBvcGVyYXRpb25zLCB3ZSByZS1zY2hlZHVsZSBgcmV0cnlOZXh0T3AoKWAuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSB0byBydW4gcmV0cnlhYmxlIG9wZXJhdGlvbnMgdGhhdCBmYWlsZWQgZHVyaW5nXG4gICAgICAgICAgICAvLyB0aGVpciBpbml0aWFsIGF0dGVtcHQgc2luY2Ugd2UgZG9uJ3Qga25vdyB3aGV0aGVyIHRoZXkgYXJlIGFscmVhZHlcbiAgICAgICAgICAgIC8vIGVucXVldWVkLiBJZiwgZm9yIGV4YW1wbGUsIGBvcDFgLCBgb3AyYCwgYG9wM2AgYXJlIGVucXVldWVkIGFuZCBgb3AxYFxuICAgICAgICAgICAgLy8gbmVlZHMgdG8gIGJlIHJlLXJ1biwgd2Ugd2lsbCBydW4gYG9wMWAsIGBvcDFgLCBgb3AyYCB1c2luZyB0aGVcbiAgICAgICAgICAgIC8vIGFscmVhZHkgZW5xdWV1ZWQgY2FsbHMgdG8gYHJldHJ5TmV4dE9wKClgLiBgb3AzKClgIHdpbGwgdGhlbiBydW4gaW4gdGhlXG4gICAgICAgICAgICAvLyBjYWxsIHNjaGVkdWxlZCBoZXJlLlxuICAgICAgICAgICAgLy8gU2luY2UgYGJhY2tvZmZBbmRSdW4oKWAgY2FuY2VscyBhbiBleGlzdGluZyBiYWNrb2ZmIGFuZCBzY2hlZHVsZXMgYVxuICAgICAgICAgICAgLy8gbmV3IGJhY2tvZmYgb24gZXZlcnkgY2FsbCwgdGhlcmUgaXMgb25seSBldmVyIGEgc2luZ2xlIGFkZGl0aW9uYWxcbiAgICAgICAgICAgIC8vIG9wZXJhdGlvbiBpbiB0aGUgcXVldWUuXG4gICAgICAgICAgICB0aGlzLnZvLnBvKCgoKSA9PiB0aGlzLnF1KCkpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBMdSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLkR1LnRoZW4oKCgpID0+ICh0aGlzLk11ID0gITAsIHQoKS5jYXRjaCgodCA9PiB7XG4gICAgICAgICAgICB0aGlzLmt1ID0gdCwgdGhpcy5NdSA9ICExO1xuICAgICAgICAgICAgY29uc3QgZSA9IFxuICAgICAgICAgICAgLyoqXG4gKiBDaHJvbWUgaW5jbHVkZXMgRXJyb3IubWVzc2FnZSBpbiBFcnJvci5zdGFjay4gT3RoZXIgYnJvd3NlcnMgZG8gbm90LlxuICogVGhpcyByZXR1cm5zIGV4cGVjdGVkIG91dHB1dCBvZiBtZXNzYWdlICsgc3RhY2sgd2hlbiBhdmFpbGFibGUuXG4gKiBAcGFyYW0gZXJyb3IgLSBFcnJvciBvciBGaXJlc3RvcmVFcnJvclxuICovXG4gICAgICAgICAgICBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGUgPSB0Lm1lc3NhZ2UgfHwgXCJcIjtcbiAgICAgICAgICAgICAgICB0LnN0YWNrICYmIChlID0gdC5zdGFjay5pbmNsdWRlcyh0Lm1lc3NhZ2UpID8gdC5zdGFjayA6IHQubWVzc2FnZSArIFwiXFxuXCIgKyB0LnN0YWNrKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovICh0KTtcbiAgICAgICAgICAgIC8vIFJlLXRocm93IHRoZSBlcnJvciBzbyB0aGF0IHRoaXMudGFpbCBiZWNvbWVzIGEgcmVqZWN0ZWQgUHJvbWlzZSBhbmRcbiAgICAgICAgICAgIC8vIGFsbCBmdXJ0aGVyIGF0dGVtcHRzIHRvIGNoYWluICh2aWEgLnRoZW4pIHdpbGwganVzdCBzaG9ydC1jaXJjdWl0XG4gICAgICAgICAgICAvLyBhbmQgcmV0dXJuIHRoZSByZWplY3RlZCBQcm9taXNlLlxuICAgICAgICAgICAgdGhyb3cgJChcIklOVEVSTkFMIFVOSEFORExFRCBFUlJPUjogXCIsIGUpLCB0O1xuICAgICAgICB9KSkudGhlbigodCA9PiAodGhpcy5NdSA9ICExLCB0KSkpKSkpO1xuICAgICAgICByZXR1cm4gdGhpcy5EdSA9IGUsIGU7XG4gICAgfVxuICAgIGVucXVldWVBZnRlckRlbGF5KHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy5CdSgpLCBcbiAgICAgICAgLy8gRmFzdC1mb3J3YXJkIGRlbGF5cyBmb3IgdGltZXJJZHMgdGhhdCBoYXZlIGJlZW4gb3ZlcnJpZGVuLlxuICAgICAgICB0aGlzLiR1LmluZGV4T2YodCkgPiAtMSAmJiAoZSA9IDApO1xuICAgICAgICBjb25zdCBzID0geWEuY3JlYXRlQW5kU2NoZWR1bGUodGhpcywgdCwgZSwgbiwgKHQgPT4gdGhpcy5VdSh0KSkpO1xuICAgICAgICByZXR1cm4gdGhpcy5OdS5wdXNoKHMpLCBzO1xuICAgIH1cbiAgICBCdSgpIHtcbiAgICAgICAgdGhpcy5rdSAmJiBMKCk7XG4gICAgfVxuICAgIHZlcmlmeU9wZXJhdGlvbkluUHJvZ3Jlc3MoKSB7fVxuICAgIC8qKlxuICAgICAqIFdhaXRzIHVudGlsIGFsbCBjdXJyZW50bHkgcXVldWVkIHRhc2tzIGFyZSBmaW5pc2hlZCBleGVjdXRpbmcuIERlbGF5ZWRcbiAgICAgKiBvcGVyYXRpb25zIGFyZSBub3QgcnVuLlxuICAgICAqLyAgICBhc3luYyBLdSgpIHtcbiAgICAgICAgLy8gT3BlcmF0aW9ucyBpbiB0aGUgcXVldWUgcHJpb3IgdG8gZHJhaW5pbmcgbWF5IGhhdmUgZW5xdWV1ZWQgYWRkaXRpb25hbFxuICAgICAgICAvLyBvcGVyYXRpb25zLiBLZWVwIGRyYWluaW5nIHRoZSBxdWV1ZSB1bnRpbCB0aGUgdGFpbCBpcyBubyBsb25nZXIgYWR2YW5jZWQsXG4gICAgICAgIC8vIHdoaWNoIGluZGljYXRlcyB0aGF0IG5vIG1vcmUgbmV3IG9wZXJhdGlvbnMgd2VyZSBlbnF1ZXVlZCBhbmQgdGhhdCBhbGxcbiAgICAgICAgLy8gb3BlcmF0aW9ucyB3ZXJlIGV4ZWN1dGVkLlxuICAgICAgICBsZXQgdDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgdCA9IHRoaXMuRHUsIGF3YWl0IHQ7XG4gICAgICAgIH0gd2hpbGUgKHQgIT09IHRoaXMuRHUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgVGVzdHM6IERldGVybWluZSBpZiBhIGRlbGF5ZWQgb3BlcmF0aW9uIHdpdGggYSBwYXJ0aWN1bGFyIFRpbWVySWRcbiAgICAgKiBleGlzdHMuXG4gICAgICovICAgIEd1KHQpIHtcbiAgICAgICAgZm9yIChjb25zdCBlIG9mIHRoaXMuTnUpIGlmIChlLnRpbWVySWQgPT09IHQpIHJldHVybiAhMDtcbiAgICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgVGVzdHM6IFJ1bnMgc29tZSBvciBhbGwgZGVsYXllZCBvcGVyYXRpb25zIGVhcmx5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGxhc3RUaW1lcklkIC0gRGVsYXllZCBvcGVyYXRpb25zIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhpcyBUaW1lcklkXG4gICAgICogd2lsbCBiZSBkcmFpbmVkLiBQYXNzIFRpbWVySWQuQWxsIHRvIHJ1biBhbGwgZGVsYXllZCBvcGVyYXRpb25zLlxuICAgICAqIEByZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIG9uY2UgYWxsIG9wZXJhdGlvbnMgaGF2ZSBiZWVuIHJ1bi5cbiAgICAgKi8gICAgUXUodCkge1xuICAgICAgICAvLyBOb3RlIHRoYXQgZHJhaW5pbmcgbWF5IGdlbmVyYXRlIG1vcmUgZGVsYXllZCBvcHMsIHNvIHdlIGRvIHRoYXQgZmlyc3QuXG4gICAgICAgIHJldHVybiB0aGlzLkt1KCkudGhlbigoKCkgPT4ge1xuICAgICAgICAgICAgLy8gUnVuIG9wcyBpbiB0aGUgc2FtZSBvcmRlciB0aGV5J2QgcnVuIGlmIHRoZXkgcmFuIG5hdHVyYWxseS5cbiAgICAgICAgICAgIHRoaXMuTnUuc29ydCgoKHQsIGUpID0+IHQudGFyZ2V0VGltZU1zIC0gZS50YXJnZXRUaW1lTXMpKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLk51KSBpZiAoZS5za2lwRGVsYXkoKSwgXCJhbGxcIiAvKiBBbGwgKi8gIT09IHQgJiYgZS50aW1lcklkID09PSB0KSBicmVhaztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLkt1KCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRm9yIFRlc3RzOiBTa2lwIGFsbCBzdWJzZXF1ZW50IGRlbGF5cyBmb3IgYSB0aW1lciBpZC5cbiAgICAgKi8gICAganUodCkge1xuICAgICAgICB0aGlzLiR1LnB1c2godCk7XG4gICAgfVxuICAgIC8qKiBDYWxsZWQgb25jZSBhIERlbGF5ZWRPcGVyYXRpb24gaXMgcnVuIG9yIGNhbmNlbGVkLiAqLyAgICBVdSh0KSB7XG4gICAgICAgIC8vIE5PVEU6IGluZGV4T2YgLyBzbGljZSBhcmUgTyhuKSwgYnV0IGRlbGF5ZWRPcGVyYXRpb25zIGlzIGV4cGVjdGVkIHRvIGJlIHNtYWxsLlxuICAgICAgICBjb25zdCBlID0gdGhpcy5OdS5pbmRleE9mKHQpO1xuICAgICAgICB0aGlzLk51LnNwbGljZShlLCAxKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIF9jKHQpIHtcbiAgICAvKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBvYmogaXMgYW4gb2JqZWN0IGFuZCBjb250YWlucyBhdCBsZWFzdCBvbmUgb2YgdGhlIHNwZWNpZmllZFxuICogbWV0aG9kcy5cbiAqL1xuICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIGlmIChcIm9iamVjdFwiICE9IHR5cGVvZiB0IHx8IG51bGwgPT09IHQpIHJldHVybiAhMTtcbiAgICAgICAgY29uc3QgbiA9IHQ7XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiBlKSBpZiAodCBpbiBuICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2Ygblt0XSkgcmV0dXJuICEwO1xuICAgICAgICByZXR1cm4gITE7XG4gICAgfVxuICAgIC8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4gICAgLyoqXG4gKiBSZXByZXNlbnRzIHRoZSB0YXNrIG9mIGxvYWRpbmcgYSBGaXJlc3RvcmUgYnVuZGxlLiBJdCBwcm92aWRlcyBwcm9ncmVzcyBvZiBidW5kbGVcbiAqIGxvYWRpbmcsIGFzIHdlbGwgYXMgdGFzayBjb21wbGV0aW9uIGFuZCBlcnJvciBldmVudHMuXG4gKlxuICogVGhlIEFQSSBpcyBjb21wYXRpYmxlIHdpdGggYFByb21pc2U8TG9hZEJ1bmRsZVRhc2tQcm9ncmVzcz5gLlxuICovICh0LCBbIFwibmV4dFwiLCBcImVycm9yXCIsIFwiY29tcGxldGVcIiBdKTtcbn1cblxuY2xhc3Mgd2Mge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl9wcm9ncmVzc09ic2VydmVyID0ge30sIHRoaXMuX3Rhc2tDb21wbGV0aW9uUmVzb2x2ZXIgPSBuZXcgaiwgdGhpcy5fbGFzdFByb2dyZXNzID0ge1xuICAgICAgICAgICAgdGFza1N0YXRlOiBcIlJ1bm5pbmdcIixcbiAgICAgICAgICAgIHRvdGFsQnl0ZXM6IDAsXG4gICAgICAgICAgICB0b3RhbERvY3VtZW50czogMCxcbiAgICAgICAgICAgIGJ5dGVzTG9hZGVkOiAwLFxuICAgICAgICAgICAgZG9jdW1lbnRzTG9hZGVkOiAwXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVycyBmdW5jdGlvbnMgdG8gbGlzdGVuIHRvIGJ1bmRsZSBsb2FkaW5nIHByb2dyZXNzIGV2ZW50cy5cbiAgICAgKiBAcGFyYW0gbmV4dCAtIENhbGxlZCB3aGVuIHRoZXJlIGlzIGEgcHJvZ3Jlc3MgdXBkYXRlIGZyb20gYnVuZGxlIGxvYWRpbmcuIFR5cGljYWxseSBgbmV4dGAgY2FsbHMgb2NjdXJcbiAgICAgKiAgIGVhY2ggdGltZSBhIEZpcmVzdG9yZSBkb2N1bWVudCBpcyBsb2FkZWQgZnJvbSB0aGUgYnVuZGxlLlxuICAgICAqIEBwYXJhbSBlcnJvciAtIENhbGxlZCB3aGVuIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgYnVuZGxlIGxvYWRpbmcuIFRoZSB0YXNrIGFib3J0cyBhZnRlciByZXBvcnRpbmcgdGhlXG4gICAgICogICBlcnJvciwgYW5kIHRoZXJlIHNob3VsZCBiZSBubyBtb3JlIHVwZGF0ZXMgYWZ0ZXIgdGhpcy5cbiAgICAgKiBAcGFyYW0gY29tcGxldGUgLSBDYWxsZWQgd2hlbiB0aGUgbG9hZGluZyB0YXNrIGlzIGNvbXBsZXRlLlxuICAgICAqLyAgICBvblByb2dyZXNzKHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy5fcHJvZ3Jlc3NPYnNlcnZlciA9IHtcbiAgICAgICAgICAgIG5leHQ6IHQsXG4gICAgICAgICAgICBlcnJvcjogZSxcbiAgICAgICAgICAgIGNvbXBsZXRlOiBuXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEltcGxlbWVudHMgdGhlIGBQcm9taXNlPExvYWRCdW5kbGVUYXNrUHJvZ3Jlc3M+LmNhdGNoYCBpbnRlcmZhY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb25SZWplY3RlZCAtIENhbGxlZCB3aGVuIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgYnVuZGxlIGxvYWRpbmcuXG4gICAgICovICAgIGNhdGNoKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Rhc2tDb21wbGV0aW9uUmVzb2x2ZXIucHJvbWlzZS5jYXRjaCh0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW1wbGVtZW50cyB0aGUgYFByb21pc2U8TG9hZEJ1bmRsZVRhc2tQcm9ncmVzcz4udGhlbmAgaW50ZXJmYWNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9uRnVsZmlsbGVkIC0gQ2FsbGVkIG9uIHRoZSBjb21wbGV0aW9uIG9mIHRoZSBsb2FkaW5nIHRhc2sgd2l0aCBhIGZpbmFsIGBMb2FkQnVuZGxlVGFza1Byb2dyZXNzYCB1cGRhdGUuXG4gICAgICogICBUaGUgdXBkYXRlIHdpbGwgYWx3YXlzIGhhdmUgaXRzIGB0YXNrU3RhdGVgIHNldCB0byBgXCJTdWNjZXNzXCJgLlxuICAgICAqIEBwYXJhbSBvblJlamVjdGVkIC0gQ2FsbGVkIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBidW5kbGUgbG9hZGluZy5cbiAgICAgKi8gICAgdGhlbih0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YXNrQ29tcGxldGlvblJlc29sdmVyLnByb21pc2UudGhlbih0LCBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTm90aWZpZXMgYWxsIG9ic2VydmVycyB0aGF0IGJ1bmRsZSBsb2FkaW5nIGhhcyBjb21wbGV0ZWQsIHdpdGggYSBwcm92aWRlZFxuICAgICAqIGBMb2FkQnVuZGxlVGFza1Byb2dyZXNzYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqLyAgICBfY29tcGxldGVXaXRoKHQpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlUHJvZ3Jlc3ModCksIHRoaXMuX3Byb2dyZXNzT2JzZXJ2ZXIuY29tcGxldGUgJiYgdGhpcy5fcHJvZ3Jlc3NPYnNlcnZlci5jb21wbGV0ZSgpLCBcbiAgICAgICAgdGhpcy5fdGFza0NvbXBsZXRpb25SZXNvbHZlci5yZXNvbHZlKHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOb3RpZmllcyBhbGwgb2JzZXJ2ZXJzIHRoYXQgYnVuZGxlIGxvYWRpbmcgaGFzIGZhaWxlZCwgd2l0aCBhIHByb3ZpZGVkXG4gICAgICogYEVycm9yYCBhcyB0aGUgcmVhc29uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi8gICAgX2ZhaWxXaXRoKHQpIHtcbiAgICAgICAgdGhpcy5fbGFzdFByb2dyZXNzLnRhc2tTdGF0ZSA9IFwiRXJyb3JcIiwgdGhpcy5fcHJvZ3Jlc3NPYnNlcnZlci5uZXh0ICYmIHRoaXMuX3Byb2dyZXNzT2JzZXJ2ZXIubmV4dCh0aGlzLl9sYXN0UHJvZ3Jlc3MpLCBcbiAgICAgICAgdGhpcy5fcHJvZ3Jlc3NPYnNlcnZlci5lcnJvciAmJiB0aGlzLl9wcm9ncmVzc09ic2VydmVyLmVycm9yKHQpLCB0aGlzLl90YXNrQ29tcGxldGlvblJlc29sdmVyLnJlamVjdCh0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTm90aWZpZXMgYSBwcm9ncmVzcyB1cGRhdGUgb2YgbG9hZGluZyBhIGJ1bmRsZS5cbiAgICAgKiBAcGFyYW0gcHJvZ3Jlc3MgLSBUaGUgbmV3IHByb2dyZXNzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi8gICAgX3VwZGF0ZVByb2dyZXNzKHQpIHtcbiAgICAgICAgdGhpcy5fbGFzdFByb2dyZXNzID0gdCwgdGhpcy5fcHJvZ3Jlc3NPYnNlcnZlci5uZXh0ICYmIHRoaXMuX3Byb2dyZXNzT2JzZXJ2ZXIubmV4dCh0KTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogRE9NRXhjZXB0aW9uIGVycm9yIGNvZGUgY29uc3RhbnRzLiAqLyBjb25zdCBtYyA9IC0xO1xuXG4vKipcbiAqIFRoZSBDbG91ZCBGaXJlc3RvcmUgc2VydmljZSBpbnRlcmZhY2UuXG4gKlxuICogRG8gbm90IGNhbGwgdGhpcyBjb25zdHJ1Y3RvciBkaXJlY3RseS4gSW5zdGVhZCwgdXNlIHtAbGluayBnZXRGaXJlc3RvcmV9LlxuICovXG5jbGFzcyBnYyBleHRlbmRzIHNjIHtcbiAgICAvKiogQGhpZGVjb25zdHJ1Y3RvciAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgc3VwZXIodCwgZSwgbiksIFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hldGhlciBpdCdzIGEge0BsaW5rIEZpcmVzdG9yZX0gb3IgRmlyZXN0b3JlIExpdGUgaW5zdGFuY2UuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnR5cGUgPSBcImZpcmVzdG9yZVwiLCB0aGlzLl9xdWV1ZSA9IG5ldyBkYywgdGhpcy5fcGVyc2lzdGVuY2VLZXkgPSBcIm5hbWVcIiBpbiB0ID8gdC5uYW1lIDogXCJbREVGQVVMVF1cIjtcbiAgICB9XG4gICAgX3Rlcm1pbmF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpcmVzdG9yZUNsaWVudCB8fCBcbiAgICAgICAgLy8gVGhlIGNsaWVudCBtdXN0IGJlIGluaXRpYWxpemVkIHRvIGVuc3VyZSB0aGF0IGFsbCBzdWJzZXF1ZW50IEFQSVxuICAgICAgICAvLyB1c2FnZSB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuICAgICAgICBUYyh0aGlzKSwgdGhpcy5fZmlyZXN0b3JlQ2xpZW50LnRlcm1pbmF0ZSgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgRmlyZXN0b3JlfSB3aXRoIHRoZSBwcm92aWRlZCBzZXR0aW5ncy5cbiAqIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIGZ1bmN0aW9uLCBpbmNsdWRpbmdcbiAqIHtAbGluayBnZXRGaXJlc3RvcmV9LiBJZiB0aGUgY3VzdG9tIHNldHRpbmdzIGFyZSBlbXB0eSwgdGhpcyBmdW5jdGlvbiBpc1xuICogZXF1aXZhbGVudCB0byBjYWxsaW5nIHtAbGluayBnZXRGaXJlc3RvcmV9LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUge0BsaW5rIEBmaXJlYmFzZS9hcHAjRmlyZWJhc2VBcHB9IHdpdGggd2hpY2ggdGhlIHtAbGluayBGaXJlc3RvcmV9IGluc3RhbmNlIHdpbGxcbiAqIGJlIGFzc29jaWF0ZWQuXG4gKiBAcGFyYW0gc2V0dGluZ3MgLSBBIHNldHRpbmdzIG9iamVjdCB0byBjb25maWd1cmUgdGhlIHtAbGluayBGaXJlc3RvcmV9IGluc3RhbmNlLlxuICogQHJldHVybnMgQSBuZXdseSBpbml0aWFsaXplZCB7QGxpbmsgRmlyZXN0b3JlfSBpbnN0YW5jZS5cbiAqLyBmdW5jdGlvbiB5Yyh0LCBlKSB7XG4gICAgY29uc3QgbiA9IF9nZXRQcm92aWRlcih0LCBcImZpcmVzdG9yZVwiKTtcbiAgICBpZiAobi5pc0luaXRpYWxpemVkKCkpIHtcbiAgICAgICAgY29uc3QgdCA9IG4uZ2V0SW1tZWRpYXRlKCksIHMgPSBuLmdldE9wdGlvbnMoKTtcbiAgICAgICAgaWYgKGRlZXBFcXVhbChzLCBlKSkgcmV0dXJuIHQ7XG4gICAgICAgIHRocm93IG5ldyBRKEcuRkFJTEVEX1BSRUNPTkRJVElPTiwgXCJpbml0aWFsaXplRmlyZXN0b3JlKCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgd2l0aCBkaWZmZXJlbnQgb3B0aW9ucy4gVG8gYXZvaWQgdGhpcyBlcnJvciwgY2FsbCBpbml0aWFsaXplRmlyZXN0b3JlKCkgd2l0aCB0aGUgc2FtZSBvcHRpb25zIGFzIHdoZW4gaXQgd2FzIG9yaWdpbmFsbHkgY2FsbGVkLCBvciBjYWxsIGdldEZpcmVzdG9yZSgpIHRvIHJldHVybiB0aGUgYWxyZWFkeSBpbml0aWFsaXplZCBpbnN0YW5jZS5cIik7XG4gICAgfVxuICAgIGlmICh2b2lkIDAgIT09IGUuY2FjaGVTaXplQnl0ZXMgJiYgLTEgIT09IGUuY2FjaGVTaXplQnl0ZXMgJiYgZS5jYWNoZVNpemVCeXRlcyA8IDEwNDg1NzYpIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgXCJjYWNoZVNpemVCeXRlcyBtdXN0IGJlIGF0IGxlYXN0IDEwNDg1NzZcIik7XG4gICAgcmV0dXJuIG4uaW5pdGlhbGl6ZSh7XG4gICAgICAgIG9wdGlvbnM6IGVcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBleGlzdGluZyB7QGxpbmsgRmlyZXN0b3JlfSBpbnN0YW5jZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGVcbiAqIHByb3ZpZGVkIHtAbGluayBAZmlyZWJhc2UvYXBwI0ZpcmViYXNlQXBwfS4gSWYgbm8gaW5zdGFuY2UgZXhpc3RzLCBpbml0aWFsaXplcyBhIG5ld1xuICogaW5zdGFuY2Ugd2l0aCBkZWZhdWx0IHNldHRpbmdzLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUge0BsaW5rIEBmaXJlYmFzZS9hcHAjRmlyZWJhc2VBcHB9IGluc3RhbmNlIHRoYXQgdGhlIHJldHVybmVkIHtAbGluayBGaXJlc3RvcmV9XG4gKiBpbnN0YW5jZSBpcyBhc3NvY2lhdGVkIHdpdGguXG4gKiBAcmV0dXJucyBUaGUge0BsaW5rIEZpcmVzdG9yZX0gaW5zdGFuY2Ugb2YgdGhlIHByb3ZpZGVkIGFwcC5cbiAqLyBmdW5jdGlvbiBwYyhlID0gZ2V0QXBwKCkpIHtcbiAgICByZXR1cm4gX2dldFByb3ZpZGVyKGUsIFwiZmlyZXN0b3JlXCIpLmdldEltbWVkaWF0ZSgpO1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovIGZ1bmN0aW9uIEljKHQpIHtcbiAgICByZXR1cm4gdC5fZmlyZXN0b3JlQ2xpZW50IHx8IFRjKHQpLCB0Ll9maXJlc3RvcmVDbGllbnQudmVyaWZ5Tm90VGVybWluYXRlZCgpLCB0Ll9maXJlc3RvcmVDbGllbnQ7XG59XG5cbmZ1bmN0aW9uIFRjKHQpIHtcbiAgICB2YXIgZTtcbiAgICBjb25zdCBuID0gdC5fZnJlZXplU2V0dGluZ3MoKSwgcyA9IGZ1bmN0aW9uKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWdCh0LCBlLCBuLCBzLmhvc3QsIHMuc3NsLCBzLmV4cGVyaW1lbnRhbEZvcmNlTG9uZ1BvbGxpbmcsIHMuZXhwZXJpbWVudGFsQXV0b0RldGVjdExvbmdQb2xsaW5nLCBzLnVzZUZldGNoU3RyZWFtcyk7XG4gICAgfSh0Ll9kYXRhYmFzZUlkLCAobnVsbCA9PT0gKGUgPSB0Ll9hcHApIHx8IHZvaWQgMCA9PT0gZSA/IHZvaWQgMCA6IGUub3B0aW9ucy5hcHBJZCkgfHwgXCJcIiwgdC5fcGVyc2lzdGVuY2VLZXksIG4pO1xuICAgIHQuX2ZpcmVzdG9yZUNsaWVudCA9IG5ldyB2dSh0Ll9hdXRoQ3JlZGVudGlhbHMsIHQuX2FwcENoZWNrQ3JlZGVudGlhbHMsIHQuX3F1ZXVlLCBzKTtcbn1cblxuLyoqXG4gKiBBdHRlbXB0cyB0byBlbmFibGUgcGVyc2lzdGVudCBzdG9yYWdlLCBpZiBwb3NzaWJsZS5cbiAqXG4gKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIGZ1bmN0aW9ucyAob3RoZXIgdGhhblxuICoge0BsaW5rIGluaXRpYWxpemVGaXJlc3RvcmV9LCB7QGxpbmsgZ2V0RmlyZXN0b3JlfSBvclxuICoge0BsaW5rIGNsZWFySW5kZXhlZERiUGVyc2lzdGVuY2V9LlxuICpcbiAqIElmIHRoaXMgZmFpbHMsIGBlbmFibGVJbmRleGVkRGJQZXJzaXN0ZW5jZSgpYCB3aWxsIHJlamVjdCB0aGUgcHJvbWlzZSBpdFxuICogcmV0dXJucy4gTm90ZSB0aGF0IGV2ZW4gYWZ0ZXIgdGhpcyBmYWlsdXJlLCB0aGUge0BsaW5rIEZpcmVzdG9yZX0gaW5zdGFuY2Ugd2lsbFxuICogcmVtYWluIHVzYWJsZSwgaG93ZXZlciBvZmZsaW5lIHBlcnNpc3RlbmNlIHdpbGwgYmUgZGlzYWJsZWQuXG4gKlxuICogVGhlcmUgYXJlIHNldmVyYWwgcmVhc29ucyB3aHkgdGhpcyBjYW4gZmFpbCwgd2hpY2ggY2FuIGJlIGlkZW50aWZpZWQgYnlcbiAqIHRoZSBgY29kZWAgb24gdGhlIGVycm9yLlxuICpcbiAqICAgKiBmYWlsZWQtcHJlY29uZGl0aW9uOiBUaGUgYXBwIGlzIGFscmVhZHkgb3BlbiBpbiBhbm90aGVyIGJyb3dzZXIgdGFiLlxuICogICAqIHVuaW1wbGVtZW50ZWQ6IFRoZSBicm93c2VyIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBvZmZsaW5lXG4gKiAgICAgcGVyc2lzdGVuY2UgaW1wbGVtZW50YXRpb24uXG4gKlxuICogQHBhcmFtIGZpcmVzdG9yZSAtIFRoZSB7QGxpbmsgRmlyZXN0b3JlfSBpbnN0YW5jZSB0byBlbmFibGUgcGVyc2lzdGVuY2UgZm9yLlxuICogQHBhcmFtIHBlcnNpc3RlbmNlU2V0dGluZ3MgLSBPcHRpb25hbCBzZXR0aW5ncyBvYmplY3QgdG8gY29uZmlndXJlXG4gKiBwZXJzaXN0ZW5jZS5cbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIHRoYXQgcmVwcmVzZW50cyBzdWNjZXNzZnVsbHkgZW5hYmxpbmcgcGVyc2lzdGVudCBzdG9yYWdlLlxuICovIGZ1bmN0aW9uIEVjKHQsIGUpIHtcbiAgICB4Yyh0ID0gdGModCwgZ2MpKTtcbiAgICBjb25zdCBuID0gSWModCksIHMgPSB0Ll9mcmVlemVTZXR0aW5ncygpLCBpID0gbmV3IEV1O1xuICAgIHJldHVybiBSYyhuLCBpLCBuZXcgSXUoaSwgcy5jYWNoZVNpemVCeXRlcywgbnVsbCA9PSBlID8gdm9pZCAwIDogZS5mb3JjZU93bmVyc2hpcCkpO1xufVxuXG4vKipcbiAqIEF0dGVtcHRzIHRvIGVuYWJsZSBtdWx0aS10YWIgcGVyc2lzdGVudCBzdG9yYWdlLCBpZiBwb3NzaWJsZS4gSWYgZW5hYmxlZFxuICogYWNyb3NzIGFsbCB0YWJzLCBhbGwgb3BlcmF0aW9ucyBzaGFyZSBhY2Nlc3MgdG8gbG9jYWwgcGVyc2lzdGVuY2UsIGluY2x1ZGluZ1xuICogc2hhcmVkIGV4ZWN1dGlvbiBvZiBxdWVyaWVzIGFuZCBsYXRlbmN5LWNvbXBlbnNhdGVkIGxvY2FsIGRvY3VtZW50IHVwZGF0ZXNcbiAqIGFjcm9zcyBhbGwgY29ubmVjdGVkIGluc3RhbmNlcy5cbiAqXG4gKiBJZiB0aGlzIGZhaWxzLCBgZW5hYmxlTXVsdGlUYWJJbmRleGVkRGJQZXJzaXN0ZW5jZSgpYCB3aWxsIHJlamVjdCB0aGUgcHJvbWlzZVxuICogaXQgcmV0dXJucy4gTm90ZSB0aGF0IGV2ZW4gYWZ0ZXIgdGhpcyBmYWlsdXJlLCB0aGUge0BsaW5rIEZpcmVzdG9yZX0gaW5zdGFuY2Ugd2lsbFxuICogcmVtYWluIHVzYWJsZSwgaG93ZXZlciBvZmZsaW5lIHBlcnNpc3RlbmNlIHdpbGwgYmUgZGlzYWJsZWQuXG4gKlxuICogVGhlcmUgYXJlIHNldmVyYWwgcmVhc29ucyB3aHkgdGhpcyBjYW4gZmFpbCwgd2hpY2ggY2FuIGJlIGlkZW50aWZpZWQgYnlcbiAqIHRoZSBgY29kZWAgb24gdGhlIGVycm9yLlxuICpcbiAqICAgKiBmYWlsZWQtcHJlY29uZGl0aW9uOiBUaGUgYXBwIGlzIGFscmVhZHkgb3BlbiBpbiBhbm90aGVyIGJyb3dzZXIgdGFiIGFuZFxuICogICAgIG11bHRpLXRhYiBpcyBub3QgZW5hYmxlZC5cbiAqICAgKiB1bmltcGxlbWVudGVkOiBUaGUgYnJvd3NlciBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgb2ZmbGluZVxuICogICAgIHBlcnNpc3RlbmNlIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEBwYXJhbSBmaXJlc3RvcmUgLSBUaGUge0BsaW5rIEZpcmVzdG9yZX0gaW5zdGFuY2UgdG8gZW5hYmxlIHBlcnNpc3RlbmNlIGZvci5cbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIHRoYXQgcmVwcmVzZW50cyBzdWNjZXNzZnVsbHkgZW5hYmxpbmcgcGVyc2lzdGVudFxuICogc3RvcmFnZS5cbiAqLyBmdW5jdGlvbiBBYyh0KSB7XG4gICAgeGModCA9IHRjKHQsIGdjKSk7XG4gICAgY29uc3QgZSA9IEljKHQpLCBuID0gdC5fZnJlZXplU2V0dGluZ3MoKSwgcyA9IG5ldyBFdTtcbiAgICByZXR1cm4gUmMoZSwgcywgbmV3IFR1KHMsIG4uY2FjaGVTaXplQnl0ZXMpKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYm90aCB0aGUgYE9mZmxpbmVDb21wb25lbnRQcm92aWRlcmAgYW5kIGBPbmxpbmVDb21wb25lbnRQcm92aWRlcmAuXG4gKiBJZiB0aGUgb3BlcmF0aW9uIGZhaWxzIHdpdGggYSByZWNvdmVyYWJsZSBlcnJvciAoc2VlXG4gKiBgY2FuUmVjb3ZlckZyb21JbmRleGVkRGJFcnJvcigpYCBiZWxvdyksIHRoZSByZXR1cm5lZCBQcm9taXNlIGlzIHJlamVjdGVkXG4gKiBidXQgdGhlIGNsaWVudCByZW1haW5zIHVzYWJsZS5cbiAqLyBmdW5jdGlvbiBSYyh0LCBlLCBuKSB7XG4gICAgY29uc3QgcyA9IG5ldyBqO1xuICAgIHJldHVybiB0LmFzeW5jUXVldWUuZW5xdWV1ZSgoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgU3UodCwgbiksIGF3YWl0IER1KHQsIGUpLCBzLnJlc29sdmUoKTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgaWYgKCFcbiAgICAgICAgICAgIC8qKlxuICogRGVjaWRlcyB3aGV0aGVyIHRoZSBwcm92aWRlZCBlcnJvciBhbGxvd3MgdXMgdG8gZ3JhY2VmdWxseSBkaXNhYmxlXG4gKiBwZXJzaXN0ZW5jZSAoYXMgb3Bwb3NlZCB0byBjcmFzaGluZyB0aGUgY2xpZW50KS5cbiAqL1xuICAgICAgICAgICAgZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIGlmIChcIkZpcmViYXNlRXJyb3JcIiA9PT0gdC5uYW1lKSByZXR1cm4gdC5jb2RlID09PSBHLkZBSUxFRF9QUkVDT05ESVRJT04gfHwgdC5jb2RlID09PSBHLlVOSU1QTEVNRU5URUQ7XG4gICAgICAgICAgICAgICAgaWYgKFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIERPTUV4Y2VwdGlvbiAmJiB0IGluc3RhbmNlb2YgRE9NRXhjZXB0aW9uKSBcbiAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgYSBmZXcga25vd24gY2lyY3Vtc3RhbmNlcyB3aGVyZSB3ZSBjYW4gb3BlbiBJbmRleGVkRGIgYnV0XG4gICAgICAgICAgICAgICAgLy8gdHJ5aW5nIHRvIHJlYWQvd3JpdGUgd2lsbCBmYWlsIChlLmcuIHF1b3RhIGV4Y2VlZGVkKS4gRm9yXG4gICAgICAgICAgICAgICAgLy8gd2VsbC11bmRlcnN0b29kIGNhc2VzLCB3ZSBhdHRlbXB0IHRvIGRldGVjdCB0aGVzZSBhbmQgdGhlbiBncmFjZWZ1bGx5XG4gICAgICAgICAgICAgICAgLy8gZmFsbCBiYWNrIHRvIG1lbW9yeSBwZXJzaXN0ZW5jZS5cbiAgICAgICAgICAgICAgICAvLyBOT1RFOiBSYXRoZXIgdGhhbiBjb250aW51ZSB0byBhZGQgdG8gdGhpcyBsaXN0LCB3ZSBjb3VsZCBkZWNpZGUgdG9cbiAgICAgICAgICAgICAgICAvLyBhbHdheXMgZmFsbCBiYWNrLCB3aXRoIHRoZSByaXNrIHRoYXQgd2UgbWlnaHQgYWNjaWRlbnRhbGx5IGhpZGUgZXJyb3JzXG4gICAgICAgICAgICAgICAgLy8gcmVwcmVzZW50aW5nIGFjdHVhbCBTREsgYnVncy5cbiAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBicm93c2VyIGlzIG91dCBvZiBxdW90YSB3ZSBjb3VsZCBnZXQgZWl0aGVyIHF1b3RhIGV4Y2VlZGVkXG4gICAgICAgICAgICAgICAgLy8gb3IgYW4gYWJvcnRlZCBlcnJvciBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgZXJyb3IgaGFwcGVuZWQgZHVyaW5nXG4gICAgICAgICAgICAgICAgLy8gc2NoZW1hIG1pZ3JhdGlvbi5cbiAgICAgICAgICAgICAgICByZXR1cm4gMjIgPT09IHQuY29kZSB8fCAyMCA9PT0gdC5jb2RlIHx8IFxuICAgICAgICAgICAgICAgIC8vIEZpcmVmb3ggUHJpdmF0ZSBCcm93c2luZyBtb2RlIGRpc2FibGVzIEluZGV4ZWREYiBhbmQgcmV0dXJuc1xuICAgICAgICAgICAgICAgIC8vIElOVkFMSURfU1RBVEUgZm9yIGFueSB1c2FnZS5cbiAgICAgICAgICAgICAgICAxMSA9PT0gdC5jb2RlO1xuICAgICAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICogQ2xlYXJzIHRoZSBwZXJzaXN0ZW50IHN0b3JhZ2UuIFRoaXMgaW5jbHVkZXMgcGVuZGluZyB3cml0ZXMgYW5kIGNhY2hlZFxuICogZG9jdW1lbnRzLlxuICpcbiAqIE11c3QgYmUgY2FsbGVkIHdoaWxlIHRoZSB7QGxpbmsgRmlyZXN0b3JlfSBpbnN0YW5jZSBpcyBub3Qgc3RhcnRlZCAoYWZ0ZXIgdGhlIGFwcCBpc1xuICogdGVybWluYXRlZCBvciB3aGVuIHRoZSBhcHAgaXMgZmlyc3QgaW5pdGlhbGl6ZWQpLiBPbiBzdGFydHVwLCB0aGlzIGZ1bmN0aW9uXG4gKiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgb3RoZXIgZnVuY3Rpb25zIChvdGhlciB0aGFuIHtAbGlua1xuICogaW5pdGlhbGl6ZUZpcmVzdG9yZX0gb3Ige0BsaW5rIGdldEZpcmVzdG9yZX0pKS4gSWYgdGhlIHtAbGluayBGaXJlc3RvcmV9XG4gKiBpbnN0YW5jZSBpcyBzdGlsbCBydW5uaW5nLCB0aGUgcHJvbWlzZSB3aWxsIGJlIHJlamVjdGVkIHdpdGggdGhlIGVycm9yIGNvZGVcbiAqIG9mIGBmYWlsZWQtcHJlY29uZGl0aW9uYC5cbiAqXG4gKiBOb3RlOiBgY2xlYXJJbmRleGVkRGJQZXJzaXN0ZW5jZSgpYCBpcyBwcmltYXJpbHkgaW50ZW5kZWQgdG8gaGVscCB3cml0ZVxuICogcmVsaWFibGUgdGVzdHMgdGhhdCB1c2UgQ2xvdWQgRmlyZXN0b3JlLiBJdCB1c2VzIGFuIGVmZmljaWVudCBtZWNoYW5pc20gZm9yXG4gKiBkcm9wcGluZyBleGlzdGluZyBkYXRhIGJ1dCBkb2VzIG5vdCBhdHRlbXB0IHRvIHNlY3VyZWx5IG92ZXJ3cml0ZSBvclxuICogb3RoZXJ3aXNlIG1ha2UgY2FjaGVkIGRhdGEgdW5yZWNvdmVyYWJsZS4gRm9yIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBzZW5zaXRpdmVcbiAqIHRvIHRoZSBkaXNjbG9zdXJlIG9mIGNhY2hlZCBkYXRhIGluIGJldHdlZW4gdXNlciBzZXNzaW9ucywgd2Ugc3Ryb25nbHlcbiAqIHJlY29tbWVuZCBub3QgZW5hYmxpbmcgcGVyc2lzdGVuY2UgYXQgYWxsLlxuICpcbiAqIEBwYXJhbSBmaXJlc3RvcmUgLSBUaGUge0BsaW5rIEZpcmVzdG9yZX0gaW5zdGFuY2UgdG8gY2xlYXIgcGVyc2lzdGVuY2UgZm9yLlxuICogQHJldHVybnMgQSBgUHJvbWlzZWAgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSBwZXJzaXN0ZW50IHN0b3JhZ2UgaXNcbiAqIGNsZWFyZWQuIE90aGVyd2lzZSwgdGhlIHByb21pc2UgaXMgcmVqZWN0ZWQgd2l0aCBhbiBlcnJvci5cbiAqLyAodCkpIHRocm93IHQ7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJFcnJvciBlbmFibGluZyBvZmZsaW5lIHBlcnNpc3RlbmNlLiBGYWxsaW5nIGJhY2sgdG8gcGVyc2lzdGVuY2UgZGlzYWJsZWQ6IFwiICsgdCksIFxuICAgICAgICAgICAgcy5yZWplY3QodCk7XG4gICAgICAgIH1cbiAgICB9KSkudGhlbigoKCkgPT4gcy5wcm9taXNlKSk7XG59XG5cbmZ1bmN0aW9uIGJjKHQpIHtcbiAgICBpZiAodC5faW5pdGlhbGl6ZWQgJiYgIXQuX3Rlcm1pbmF0ZWQpIHRocm93IG5ldyBRKEcuRkFJTEVEX1BSRUNPTkRJVElPTiwgXCJQZXJzaXN0ZW5jZSBjYW4gb25seSBiZSBjbGVhcmVkIGJlZm9yZSBhIEZpcmVzdG9yZSBpbnN0YW5jZSBpcyBpbml0aWFsaXplZCBvciBhZnRlciBpdCBpcyB0ZXJtaW5hdGVkLlwiKTtcbiAgICBjb25zdCBlID0gbmV3IGo7XG4gICAgcmV0dXJuIHQuX3F1ZXVlLmVucXVldWVBbmRGb3JnZXRFdmVuV2hpbGVSZXN0cmljdGVkKChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBhc3luYyBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFoaS52dCgpKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IHQgKyBcIm1haW5cIjtcbiAgICAgICAgICAgICAgICBhd2FpdCBoaS5kZWxldGUoZSk7XG4gICAgICAgICAgICB9KExyKHQuX2RhdGFiYXNlSWQsIHQuX3BlcnNpc3RlbmNlS2V5KSksIGUucmVzb2x2ZSgpO1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICBlLnJlamVjdCh0KTtcbiAgICAgICAgfVxuICAgIH0pKSwgZS5wcm9taXNlO1xufVxuXG4vKipcbiAqIFdhaXRzIHVudGlsIGFsbCBjdXJyZW50bHkgcGVuZGluZyB3cml0ZXMgZm9yIHRoZSBhY3RpdmUgdXNlciBoYXZlIGJlZW5cbiAqIGFja25vd2xlZGdlZCBieSB0aGUgYmFja2VuZC5cbiAqXG4gKiBUaGUgcmV0dXJuZWQgcHJvbWlzZSByZXNvbHZlcyBpbW1lZGlhdGVseSBpZiB0aGVyZSBhcmUgbm8gb3V0c3RhbmRpbmcgd3JpdGVzLlxuICogT3RoZXJ3aXNlLCB0aGUgcHJvbWlzZSB3YWl0cyBmb3IgYWxsIHByZXZpb3VzbHkgaXNzdWVkIHdyaXRlcyAoaW5jbHVkaW5nXG4gKiB0aG9zZSB3cml0dGVuIGluIGEgcHJldmlvdXMgYXBwIHNlc3Npb24pLCBidXQgaXQgZG9lcyBub3Qgd2FpdCBmb3Igd3JpdGVzXG4gKiB0aGF0IHdlcmUgYWRkZWQgYWZ0ZXIgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4gSWYgeW91IHdhbnQgdG8gd2FpdCBmb3JcbiAqIGFkZGl0aW9uYWwgd3JpdGVzLCBjYWxsIGB3YWl0Rm9yUGVuZGluZ1dyaXRlcygpYCBhZ2Fpbi5cbiAqXG4gKiBBbnkgb3V0c3RhbmRpbmcgYHdhaXRGb3JQZW5kaW5nV3JpdGVzKClgIHByb21pc2VzIGFyZSByZWplY3RlZCBkdXJpbmcgdXNlclxuICogY2hhbmdlcy5cbiAqXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCB3aGljaCByZXNvbHZlcyB3aGVuIGFsbCBjdXJyZW50bHkgcGVuZGluZyB3cml0ZXMgaGF2ZSBiZWVuXG4gKiBhY2tub3dsZWRnZWQgYnkgdGhlIGJhY2tlbmQuXG4gKi8gZnVuY3Rpb24gUGModCkge1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBuZXcgajtcbiAgICAgICAgcmV0dXJuIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0KChhc3luYyAoKSA9PiBKYShhd2FpdCBPdSh0KSwgZSkpKSwgZS5wcm9taXNlO1xuICAgIH0oSWModCA9IHRjKHQsIGdjKSkpO1xufVxuXG4vKipcbiAqIFJlLWVuYWJsZXMgdXNlIG9mIHRoZSBuZXR3b3JrIGZvciB0aGlzIHtAbGluayBGaXJlc3RvcmV9IGluc3RhbmNlIGFmdGVyIGEgcHJpb3JcbiAqIGNhbGwgdG8ge0BsaW5rIGRpc2FibGVOZXR3b3JrfS5cbiAqXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCB0aGF0IGlzIHJlc29sdmVkIG9uY2UgdGhlIG5ldHdvcmsgaGFzIGJlZW4gZW5hYmxlZC5cbiAqLyBmdW5jdGlvbiBWYyh0KSB7XG4gICAgcmV0dXJuIEZ1KEljKHQgPSB0Yyh0LCBnYykpKTtcbn1cblxuLyoqXG4gKiBEaXNhYmxlcyBuZXR3b3JrIHVzYWdlIGZvciB0aGlzIGluc3RhbmNlLiBJdCBjYW4gYmUgcmUtZW5hYmxlZCB2aWEge0BsaW5rXG4gKiBlbmFibGVOZXR3b3JrfS4gV2hpbGUgdGhlIG5ldHdvcmsgaXMgZGlzYWJsZWQsIGFueSBzbmFwc2hvdCBsaXN0ZW5lcnMsXG4gKiBgZ2V0RG9jKClgIG9yIGBnZXREb2NzKClgIGNhbGxzIHdpbGwgcmV0dXJuIHJlc3VsdHMgZnJvbSBjYWNoZSwgYW5kIGFueSB3cml0ZVxuICogb3BlcmF0aW9ucyB3aWxsIGJlIHF1ZXVlZCB1bnRpbCB0aGUgbmV0d29yayBpcyByZXN0b3JlZC5cbiAqXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCB0aGF0IGlzIHJlc29sdmVkIG9uY2UgdGhlIG5ldHdvcmsgaGFzIGJlZW4gZGlzYWJsZWQuXG4gKi8gZnVuY3Rpb24gdmModCkge1xuICAgIHJldHVybiBCdShJYyh0ID0gdGModCwgZ2MpKSk7XG59XG5cbi8qKlxuICogVGVybWluYXRlcyB0aGUgcHJvdmlkZWQge0BsaW5rIEZpcmVzdG9yZX0gaW5zdGFuY2UuXG4gKlxuICogQWZ0ZXIgY2FsbGluZyBgdGVybWluYXRlKClgIG9ubHkgdGhlIGBjbGVhckluZGV4ZWREYlBlcnNpc3RlbmNlKClgIGZ1bmN0aW9uXG4gKiBtYXkgYmUgdXNlZC4gQW55IG90aGVyIGZ1bmN0aW9uIHdpbGwgdGhyb3cgYSBgRmlyZXN0b3JlRXJyb3JgLlxuICpcbiAqIFRvIHJlc3RhcnQgYWZ0ZXIgdGVybWluYXRpb24sIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBGaXJlYmFzZUZpcmVzdG9yZSB3aXRoXG4gKiB7QGxpbmsgZ2V0RmlyZXN0b3JlfS5cbiAqXG4gKiBUZXJtaW5hdGlvbiBkb2VzIG5vdCBjYW5jZWwgYW55IHBlbmRpbmcgd3JpdGVzLCBhbmQgYW55IHByb21pc2VzIHRoYXQgYXJlXG4gKiBhd2FpdGluZyBhIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciB3aWxsIG5vdCBiZSByZXNvbHZlZC4gSWYgeW91IGhhdmVcbiAqIHBlcnNpc3RlbmNlIGVuYWJsZWQsIHRoZSBuZXh0IHRpbWUgeW91IHN0YXJ0IHRoaXMgaW5zdGFuY2UsIGl0IHdpbGwgcmVzdW1lXG4gKiBzZW5kaW5nIHRoZXNlIHdyaXRlcyB0byB0aGUgc2VydmVyLlxuICpcbiAqIE5vdGU6IFVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLCBjYWxsaW5nIGB0ZXJtaW5hdGUoKWAgaXMgbm90IHJlcXVpcmVkLiBUaGlzXG4gKiBmdW5jdGlvbiBpcyB1c2VmdWwgb25seSB3aGVuIHlvdSB3YW50IHRvIGZvcmNlIHRoaXMgaW5zdGFuY2UgdG8gcmVsZWFzZSBhbGxcbiAqIG9mIGl0cyByZXNvdXJjZXMgb3IgaW4gY29tYmluYXRpb24gd2l0aCBgY2xlYXJJbmRleGVkRGJQZXJzaXN0ZW5jZSgpYCB0b1xuICogZW5zdXJlIHRoYXQgYWxsIGxvY2FsIHN0YXRlIGlzIGRlc3Ryb3llZCBiZXR3ZWVuIHRlc3QgcnVucy5cbiAqXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIGluc3RhbmNlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseVxuICogdGVybWluYXRlZC5cbiAqLyBmdW5jdGlvbiBTYyh0KSB7XG4gICAgcmV0dXJuIF9yZW1vdmVTZXJ2aWNlSW5zdGFuY2UodC5hcHAsIFwiZmlyZXN0b3JlXCIpLCB0Ll9kZWxldGUoKTtcbn1cblxuLyoqXG4gKiBMb2FkcyBhIEZpcmVzdG9yZSBidW5kbGUgaW50byB0aGUgbG9jYWwgY2FjaGUuXG4gKlxuICogQHBhcmFtIGZpcmVzdG9yZSAtIFRoZSB7QGxpbmsgRmlyZXN0b3JlfSBpbnN0YW5jZSB0byBsb2FkIGJ1bmRsZXMgZm9yLlxuICogQHBhcmFtIGJ1bmRsZURhdGEgLSBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBidW5kbGUgdG8gYmUgbG9hZGVkLiBWYWxpZFxuICogb2JqZWN0cyBhcmUgYEFycmF5QnVmZmVyYCwgYFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+YCBvciBgc3RyaW5nYC5cbiAqXG4gKiBAcmV0dXJucyBBIGBMb2FkQnVuZGxlVGFza2Agb2JqZWN0LCB3aGljaCBub3RpZmllcyBjYWxsZXJzIHdpdGggcHJvZ3Jlc3NcbiAqIHVwZGF0ZXMsIGFuZCBjb21wbGV0aW9uIG9yIGVycm9yIGV2ZW50cy4gSXQgY2FuIGJlIHVzZWQgYXMgYVxuICogYFByb21pc2U8TG9hZEJ1bmRsZVRhc2tQcm9ncmVzcz5gLlxuICovIGZ1bmN0aW9uIERjKHQsIGUpIHtcbiAgICBjb25zdCBuID0gSWModCA9IHRjKHQsIGdjKSksIHMgPSBuZXcgd2M7XG4gICAgcmV0dXJuIGp1KG4sIHQuX2RhdGFiYXNlSWQsIGUsIHMpLCBzO1xufVxuXG4vKipcbiAqIFJlYWRzIGEgRmlyZXN0b3JlIHtAbGluayBRdWVyeX0gZnJvbSBsb2NhbCBjYWNoZSwgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW5cbiAqIG5hbWUuXG4gKlxuICogVGhlIG5hbWVkIHF1ZXJpZXMgYXJlIHBhY2thZ2VkICBpbnRvIGJ1bmRsZXMgb24gdGhlIHNlcnZlciBzaWRlIChhbG9uZ1xuICogd2l0aCByZXN1bHRpbmcgZG9jdW1lbnRzKSwgYW5kIGxvYWRlZCB0byBsb2NhbCBjYWNoZSB1c2luZyBgbG9hZEJ1bmRsZWAuIE9uY2VcbiAqIGluIGxvY2FsIGNhY2hlLCB1c2UgdGhpcyBtZXRob2QgdG8gZXh0cmFjdCBhIHtAbGluayBRdWVyeX0gYnkgbmFtZS5cbiAqXG4gKiBAcGFyYW0gZmlyZXN0b3JlIC0gVGhlIHtAbGluayBGaXJlc3RvcmV9IGluc3RhbmNlIHRvIHJlYWQgdGhlIHF1ZXJ5IGZyb20uXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBxdWVyeS5cbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgUXVlcnkgb3IgYG51bGxgLlxuICovIGZ1bmN0aW9uIENjKHQsIGUpIHtcbiAgICByZXR1cm4gV3UoSWModCA9IHRjKHQsIGdjKSksIGUpLnRoZW4oKGUgPT4gZSA/IG5ldyBvYyh0LCBudWxsLCBlLnF1ZXJ5KSA6IG51bGwpKTtcbn1cblxuZnVuY3Rpb24geGModCkge1xuICAgIGlmICh0Ll9pbml0aWFsaXplZCB8fCB0Ll90ZXJtaW5hdGVkKSB0aHJvdyBuZXcgUShHLkZBSUxFRF9QUkVDT05ESVRJT04sIFwiRmlyZXN0b3JlIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZCBhbmQgcGVyc2lzdGVuY2UgY2FuIG5vIGxvbmdlciBiZSBlbmFibGVkLiBZb3UgY2FuIG9ubHkgZW5hYmxlIHBlcnNpc3RlbmNlIGJlZm9yZSBjYWxsaW5nIGFueSBvdGhlciBtZXRob2RzIG9uIGEgRmlyZXN0b3JlIG9iamVjdC5cIik7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIGBGaWVsZFBhdGhgIHJlZmVycyB0byBhIGZpZWxkIGluIGEgZG9jdW1lbnQuIFRoZSBwYXRoIG1heSBjb25zaXN0IG9mIGFcbiAqIHNpbmdsZSBmaWVsZCBuYW1lIChyZWZlcnJpbmcgdG8gYSB0b3AtbGV2ZWwgZmllbGQgaW4gdGhlIGRvY3VtZW50KSwgb3IgYVxuICogbGlzdCBvZiBmaWVsZCBuYW1lcyAocmVmZXJyaW5nIHRvIGEgbmVzdGVkIGZpZWxkIGluIHRoZSBkb2N1bWVudCkuXG4gKlxuICogQ3JlYXRlIGEgYEZpZWxkUGF0aGAgYnkgcHJvdmlkaW5nIGZpZWxkIG5hbWVzLiBJZiBtb3JlIHRoYW4gb25lIGZpZWxkXG4gKiBuYW1lIGlzIHByb3ZpZGVkLCB0aGUgcGF0aCB3aWxsIHBvaW50IHRvIGEgbmVzdGVkIGZpZWxkIGluIGEgZG9jdW1lbnQuXG4gKi9cbmNsYXNzIE5jIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYEZpZWxkUGF0aGAgZnJvbSB0aGUgcHJvdmlkZWQgZmllbGQgbmFtZXMuIElmIG1vcmUgdGhhbiBvbmUgZmllbGRcbiAgICAgKiBuYW1lIGlzIHByb3ZpZGVkLCB0aGUgcGF0aCB3aWxsIHBvaW50IHRvIGEgbmVzdGVkIGZpZWxkIGluIGEgZG9jdW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmllbGROYW1lcyAtIEEgbGlzdCBvZiBmaWVsZCBuYW1lcy5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciguLi50KSB7XG4gICAgICAgIGZvciAobGV0IGUgPSAwOyBlIDwgdC5sZW5ndGg7ICsrZSkgaWYgKDAgPT09IHRbZV0ubGVuZ3RoKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIFwiSW52YWxpZCBmaWVsZCBuYW1lIGF0IGFyZ3VtZW50ICQoaSArIDEpLiBGaWVsZCBuYW1lcyBtdXN0IG5vdCBiZSBlbXB0eS5cIik7XG4gICAgICAgIHRoaXMuX2ludGVybmFsUGF0aCA9IG5ldyBtdCh0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgYEZpZWxkUGF0aGAgaXMgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIG9uZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvdGhlciAtIFRoZSBgRmllbGRQYXRoYCB0byBjb21wYXJlIGFnYWluc3QuXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGlzIGBGaWVsZFBhdGhgIGlzIGVxdWFsIHRvIHRoZSBwcm92aWRlZCBvbmUuXG4gICAgICovICAgIGlzRXF1YWwodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW50ZXJuYWxQYXRoLmlzRXF1YWwodC5faW50ZXJuYWxQYXRoKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHNwZWNpYWwgc2VudGluZWwgYEZpZWxkUGF0aGAgdG8gcmVmZXIgdG8gdGhlIElEIG9mIGEgZG9jdW1lbnQuXG4gKiBJdCBjYW4gYmUgdXNlZCBpbiBxdWVyaWVzIHRvIHNvcnQgb3IgZmlsdGVyIGJ5IHRoZSBkb2N1bWVudCBJRC5cbiAqLyBmdW5jdGlvbiBrYygpIHtcbiAgICByZXR1cm4gbmV3IE5jKFwiX19uYW1lX19cIik7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEFuIGltbXV0YWJsZSBvYmplY3QgcmVwcmVzZW50aW5nIGFuIGFycmF5IG9mIGJ5dGVzLlxuICovIGNsYXNzIE1jIHtcbiAgICAvKiogQGhpZGVjb25zdHJ1Y3RvciAqL1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5fYnl0ZVN0cmluZyA9IHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYEJ5dGVzYCBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gQmFzZTY0IHN0cmluZywgY29udmVydGluZyBpdCB0b1xuICAgICAqIGJ5dGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGJhc2U2NCAtIFRoZSBCYXNlNjQgc3RyaW5nIHVzZWQgdG8gY3JlYXRlIHRoZSBgQnl0ZXNgIG9iamVjdC5cbiAgICAgKi8gICAgc3RhdGljIGZyb21CYXNlNjRTdHJpbmcodCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNYyhwdC5mcm9tQmFzZTY0U3RyaW5nKHQpKTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBcIkZhaWxlZCB0byBjb25zdHJ1Y3QgZGF0YSBmcm9tIEJhc2U2NCBzdHJpbmc6IFwiICsgdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBgQnl0ZXNgIG9iamVjdCBmcm9tIHRoZSBnaXZlbiBVaW50OEFycmF5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGFycmF5IC0gVGhlIFVpbnQ4QXJyYXkgdXNlZCB0byBjcmVhdGUgdGhlIGBCeXRlc2Agb2JqZWN0LlxuICAgICAqLyAgICBzdGF0aWMgZnJvbVVpbnQ4QXJyYXkodCkge1xuICAgICAgICByZXR1cm4gbmV3IE1jKHB0LmZyb21VaW50OEFycmF5KHQpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyBieXRlcyBhcyBhIEJhc2U2NC1lbmNvZGVkIHN0cmluZy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBCYXNlNjQtZW5jb2RlZCBzdHJpbmcgY3JlYXRlZCBmcm9tIHRoZSBgQnl0ZXNgIG9iamVjdC5cbiAgICAgKi8gICAgdG9CYXNlNjQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ieXRlU3RyaW5nLnRvQmFzZTY0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgYnl0ZXMgaW4gYSBuZXcgYFVpbnQ4QXJyYXlgLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIFVpbnQ4QXJyYXkgY3JlYXRlZCBmcm9tIHRoZSBgQnl0ZXNgIG9iamVjdC5cbiAgICAgKi8gICAgdG9VaW50OEFycmF5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYnl0ZVN0cmluZy50b1VpbnQ4QXJyYXkoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYEJ5dGVzYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYEJ5dGVzYCBvYmplY3QuXG4gICAgICovICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gXCJCeXRlcyhiYXNlNjQ6IFwiICsgdGhpcy50b0Jhc2U2NCgpICsgXCIpXCI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGBCeXRlc2Agb2JqZWN0IGlzIGVxdWFsIHRvIHRoZSBwcm92aWRlZCBvbmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3RoZXIgLSBUaGUgYEJ5dGVzYCBvYmplY3QgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhpcyBgQnl0ZXNgIG9iamVjdCBpcyBlcXVhbCB0byB0aGUgcHJvdmlkZWQgb25lLlxuICAgICAqLyAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2J5dGVTdHJpbmcuaXNFcXVhbCh0Ll9ieXRlU3RyaW5nKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFNlbnRpbmVsIHZhbHVlcyB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gd3JpdGluZyBkb2N1bWVudCBmaWVsZHMgd2l0aCBgc2V0KClgXG4gKiBvciBgdXBkYXRlKClgLlxuICovIGNsYXNzIE9jIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gX21ldGhvZE5hbWUgLSBUaGUgcHVibGljIEFQSSBlbmRwb2ludCB0aGF0IHJldHVybnMgdGhpcyBjbGFzcy5cbiAgICAgKiBAaGlkZWNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLl9tZXRob2ROYW1lID0gdDtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEFuIGltbXV0YWJsZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgZ2VvZ3JhcGhpYyBsb2NhdGlvbiBpbiBGaXJlc3RvcmUuIFRoZVxuICogbG9jYXRpb24gaXMgcmVwcmVzZW50ZWQgYXMgbGF0aXR1ZGUvbG9uZ2l0dWRlIHBhaXIuXG4gKlxuICogTGF0aXR1ZGUgdmFsdWVzIGFyZSBpbiB0aGUgcmFuZ2Ugb2YgWy05MCwgOTBdLlxuICogTG9uZ2l0dWRlIHZhbHVlcyBhcmUgaW4gdGhlIHJhbmdlIG9mIFstMTgwLCAxODBdLlxuICovIGNsYXNzICRjIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGltbXV0YWJsZSBgR2VvUG9pbnRgIG9iamVjdCB3aXRoIHRoZSBwcm92aWRlZCBsYXRpdHVkZSBhbmRcbiAgICAgKiBsb25naXR1ZGUgdmFsdWVzLlxuICAgICAqIEBwYXJhbSBsYXRpdHVkZSAtIFRoZSBsYXRpdHVkZSBhcyBudW1iZXIgYmV0d2VlbiAtOTAgYW5kIDkwLlxuICAgICAqIEBwYXJhbSBsb25naXR1ZGUgLSBUaGUgbG9uZ2l0dWRlIGFzIG51bWJlciBiZXR3ZWVuIC0xODAgYW5kIDE4MC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIGlmICghaXNGaW5pdGUodCkgfHwgdCA8IC05MCB8fCB0ID4gOTApIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgXCJMYXRpdHVkZSBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gLTkwIGFuZCA5MCwgYnV0IHdhczogXCIgKyB0KTtcbiAgICAgICAgaWYgKCFpc0Zpbml0ZShlKSB8fCBlIDwgLTE4MCB8fCBlID4gMTgwKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIFwiTG9uZ2l0dWRlIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAtMTgwIGFuZCAxODAsIGJ1dCB3YXM6IFwiICsgZSk7XG4gICAgICAgIHRoaXMuX2xhdCA9IHQsIHRoaXMuX2xvbmcgPSBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbGF0aXR1ZGUgb2YgdGhpcyBgR2VvUG9pbnRgIGluc3RhbmNlLlxuICAgICAqLyAgICBnZXQgbGF0aXR1ZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBsb25naXR1ZGUgb2YgdGhpcyBgR2VvUG9pbnRgIGluc3RhbmNlLlxuICAgICAqLyAgICBnZXQgbG9uZ2l0dWRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9uZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgYEdlb1BvaW50YCBpcyBlcXVhbCB0byB0aGUgcHJvdmlkZWQgb25lLlxuICAgICAqXG4gICAgICogQHBhcmFtIG90aGVyIC0gVGhlIGBHZW9Qb2ludGAgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhpcyBgR2VvUG9pbnRgIGlzIGVxdWFsIHRvIHRoZSBwcm92aWRlZCBvbmUuXG4gICAgICovICAgIGlzRXF1YWwodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGF0ID09PSB0Ll9sYXQgJiYgdGhpcy5fbG9uZyA9PT0gdC5fbG9uZztcbiAgICB9XG4gICAgLyoqIFJldHVybnMgYSBKU09OLXNlcmlhbGl6YWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEdlb1BvaW50LiAqLyAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsYXRpdHVkZTogdGhpcy5fbGF0LFxuICAgICAgICAgICAgbG9uZ2l0dWRlOiB0aGlzLl9sb25nXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFjdHVhbGx5IHByaXZhdGUgdG8gSlMgY29uc3VtZXJzIG9mIG91ciBBUEksIHNvIHRoaXMgZnVuY3Rpb24gaXMgcHJlZml4ZWRcbiAgICAgKiB3aXRoIGFuIHVuZGVyc2NvcmUuXG4gICAgICovICAgIF9jb21wYXJlVG8odCkge1xuICAgICAgICByZXR1cm4gcnQodGhpcy5fbGF0LCB0Ll9sYXQpIHx8IHJ0KHRoaXMuX2xvbmcsIHQuX2xvbmcpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gY29uc3QgRmMgPSAvXl9fLipfXyQvO1xuXG4vKiogVGhlIHJlc3VsdCBvZiBwYXJzaW5nIGRvY3VtZW50IGRhdGEgKGUuZy4gZm9yIGEgc2V0RGF0YSBjYWxsKS4gKi8gY2xhc3MgQmMge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy5kYXRhID0gdCwgdGhpcy5maWVsZE1hc2sgPSBlLCB0aGlzLmZpZWxkVHJhbnNmb3JtcyA9IG47XG4gICAgfVxuICAgIHRvTXV0YXRpb24odCwgZSkge1xuICAgICAgICByZXR1cm4gbnVsbCAhPT0gdGhpcy5maWVsZE1hc2sgPyBuZXcgcG4odCwgdGhpcy5kYXRhLCB0aGlzLmZpZWxkTWFzaywgZSwgdGhpcy5maWVsZFRyYW5zZm9ybXMpIDogbmV3IHluKHQsIHRoaXMuZGF0YSwgZSwgdGhpcy5maWVsZFRyYW5zZm9ybXMpO1xuICAgIH1cbn1cblxuLyoqIFRoZSByZXN1bHQgb2YgcGFyc2luZyBcInVwZGF0ZVwiIGRhdGEgKGkuZS4gZm9yIGFuIHVwZGF0ZURhdGEgY2FsbCkuICovIGNsYXNzIExjIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBcbiAgICAvLyBUaGUgZmllbGRNYXNrIGRvZXMgbm90IGluY2x1ZGUgZG9jdW1lbnQgdHJhbnNmb3Jtcy5cbiAgICBlLCBuKSB7XG4gICAgICAgIHRoaXMuZGF0YSA9IHQsIHRoaXMuZmllbGRNYXNrID0gZSwgdGhpcy5maWVsZFRyYW5zZm9ybXMgPSBuO1xuICAgIH1cbiAgICB0b011dGF0aW9uKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBwbih0LCB0aGlzLmRhdGEsIHRoaXMuZmllbGRNYXNrLCBlLCB0aGlzLmZpZWxkVHJhbnNmb3Jtcyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBxYyh0KSB7XG4gICAgc3dpdGNoICh0KSB7XG4gICAgICBjYXNlIDAgLyogU2V0ICovIDpcbiAvLyBmYWxsIHRocm91Z2hcbiAgICAgICAgICAgICAgY2FzZSAyIC8qIE1lcmdlU2V0ICovIDpcbiAvLyBmYWxsIHRocm91Z2hcbiAgICAgICAgICAgICAgY2FzZSAxIC8qIFVwZGF0ZSAqLyA6XG4gICAgICAgIHJldHVybiAhMDtcblxuICAgICAgY2FzZSAzIC8qIEFyZ3VtZW50ICovIDpcbiAgICAgIGNhc2UgNCAvKiBBcnJheUFyZ3VtZW50ICovIDpcbiAgICAgICAgcmV0dXJuICExO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBMKCk7XG4gICAgfVxufVxuXG4vKiogQSBcImNvbnRleHRcIiBvYmplY3QgcGFzc2VkIGFyb3VuZCB3aGlsZSBwYXJzaW5nIHVzZXIgZGF0YS4gKi8gY2xhc3MgVWMge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIGEgUGFyc2VDb250ZXh0IHdpdGggdGhlIGdpdmVuIHNvdXJjZSBhbmQgcGF0aC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBzZXR0aW5ncyBmb3IgdGhlIHBhcnNlci5cbiAgICAgKiBAcGFyYW0gZGF0YWJhc2VJZCAtIFRoZSBkYXRhYmFzZSBJRCBvZiB0aGUgRmlyZXN0b3JlIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBzZXJpYWxpemVyIC0gVGhlIHNlcmlhbGl6ZXIgdG8gdXNlIHRvIGdlbmVyYXRlIHRoZSBWYWx1ZSBwcm90by5cbiAgICAgKiBAcGFyYW0gaWdub3JlVW5kZWZpbmVkUHJvcGVydGllcyAtIFdoZXRoZXIgdG8gaWdub3JlIHVuZGVmaW5lZCBwcm9wZXJ0aWVzXG4gICAgICogcmF0aGVyIHRoYW4gdGhyb3cuXG4gICAgICogQHBhcmFtIGZpZWxkVHJhbnNmb3JtcyAtIEEgbXV0YWJsZSBsaXN0IG9mIGZpZWxkIHRyYW5zZm9ybXMgZW5jb3VudGVyZWRcbiAgICAgKiB3aGlsZSBwYXJzaW5nIHRoZSBkYXRhLlxuICAgICAqIEBwYXJhbSBmaWVsZE1hc2sgLSBBIG11dGFibGUgbGlzdCBvZiBmaWVsZCBwYXRocyBlbmNvdW50ZXJlZCB3aGlsZSBwYXJzaW5nXG4gICAgICogdGhlIGRhdGEuXG4gICAgICpcbiAgICAgKiBUT0RPKGIvMzQ4NzExMzEpOiBXZSBkb24ndCBzdXBwb3J0IGFycmF5IHBhdGhzIHJpZ2h0IG5vdywgc28gcGF0aCBjYW4gYmVcbiAgICAgKiBudWxsIHRvIGluZGljYXRlIHRoZSBjb250ZXh0IHJlcHJlc2VudHMgYW55IGxvY2F0aW9uIHdpdGhpbiBhbiBhcnJheSAoaW5cbiAgICAgKiB3aGljaCBjYXNlIGNlcnRhaW4gZmVhdHVyZXMgd2lsbCBub3Qgd29yayBhbmQgZXJyb3JzIHdpbGwgYmUgc29tZXdoYXRcbiAgICAgKiBjb21wcm9taXNlZCkuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgcywgaSwgcikge1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gdCwgdGhpcy5kYXRhYmFzZUlkID0gZSwgdGhpcy5NID0gbiwgdGhpcy5pZ25vcmVVbmRlZmluZWRQcm9wZXJ0aWVzID0gcywgXG4gICAgICAgIC8vIE1pbm9yIGhhY2s6IElmIGZpZWxkVHJhbnNmb3JtcyBpcyB1bmRlZmluZWQsIHdlIGFzc3VtZSB0aGlzIGlzIGFuXG4gICAgICAgIC8vIGV4dGVybmFsIGNhbGwgYW5kIHdlIG5lZWQgdG8gdmFsaWRhdGUgdGhlIGVudGlyZSBwYXRoLlxuICAgICAgICB2b2lkIDAgPT09IGkgJiYgdGhpcy5XdSgpLCB0aGlzLmZpZWxkVHJhbnNmb3JtcyA9IGkgfHwgW10sIHRoaXMuZmllbGRNYXNrID0gciB8fCBbXTtcbiAgICB9XG4gICAgZ2V0IHBhdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLnBhdGg7XG4gICAgfVxuICAgIGdldCB6dSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MuenU7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIGEgbmV3IGNvbnRleHQgd2l0aCB0aGUgc3BlY2lmaWVkIHNldHRpbmdzIG92ZXJ3cml0dGVuLiAqLyAgICBIdSh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgVWMoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0aGlzLnNldHRpbmdzKSwgdCksIHRoaXMuZGF0YWJhc2VJZCwgdGhpcy5NLCB0aGlzLmlnbm9yZVVuZGVmaW5lZFByb3BlcnRpZXMsIHRoaXMuZmllbGRUcmFuc2Zvcm1zLCB0aGlzLmZpZWxkTWFzayk7XG4gICAgfVxuICAgIEp1KHQpIHtcbiAgICAgICAgdmFyIGU7XG4gICAgICAgIGNvbnN0IG4gPSBudWxsID09PSAoZSA9IHRoaXMucGF0aCkgfHwgdm9pZCAwID09PSBlID8gdm9pZCAwIDogZS5jaGlsZCh0KSwgcyA9IHRoaXMuSHUoe1xuICAgICAgICAgICAgcGF0aDogbixcbiAgICAgICAgICAgIFl1OiAhMVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHMuWHUodCksIHM7XG4gICAgfVxuICAgIFp1KHQpIHtcbiAgICAgICAgdmFyIGU7XG4gICAgICAgIGNvbnN0IG4gPSBudWxsID09PSAoZSA9IHRoaXMucGF0aCkgfHwgdm9pZCAwID09PSBlID8gdm9pZCAwIDogZS5jaGlsZCh0KSwgcyA9IHRoaXMuSHUoe1xuICAgICAgICAgICAgcGF0aDogbixcbiAgICAgICAgICAgIFl1OiAhMVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHMuV3UoKSwgcztcbiAgICB9XG4gICAgdGModCkge1xuICAgICAgICAvLyBUT0RPKGIvMzQ4NzExMzEpOiBXZSBkb24ndCBzdXBwb3J0IGFycmF5IHBhdGhzIHJpZ2h0IG5vdzsgc28gbWFrZSBwYXRoXG4gICAgICAgIC8vIHVuZGVmaW5lZC5cbiAgICAgICAgcmV0dXJuIHRoaXMuSHUoe1xuICAgICAgICAgICAgcGF0aDogdm9pZCAwLFxuICAgICAgICAgICAgWXU6ICEwXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlYyh0KSB7XG4gICAgICAgIHJldHVybiB1aCh0LCB0aGlzLnNldHRpbmdzLm1ldGhvZE5hbWUsIHRoaXMuc2V0dGluZ3MubmMgfHwgITEsIHRoaXMucGF0aCwgdGhpcy5zZXR0aW5ncy5zYyk7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zICd0cnVlJyBpZiAnZmllbGRQYXRoJyB3YXMgdHJhdmVyc2VkIHdoZW4gY3JlYXRpbmcgdGhpcyBjb250ZXh0LiAqLyAgICBjb250YWlucyh0KSB7XG4gICAgICAgIHJldHVybiB2b2lkIDAgIT09IHRoaXMuZmllbGRNYXNrLmZpbmQoKGUgPT4gdC5pc1ByZWZpeE9mKGUpKSkgfHwgdm9pZCAwICE9PSB0aGlzLmZpZWxkVHJhbnNmb3Jtcy5maW5kKChlID0+IHQuaXNQcmVmaXhPZihlLmZpZWxkKSkpO1xuICAgIH1cbiAgICBXdSgpIHtcbiAgICAgICAgLy8gVE9ETyhiLzM0ODcxMTMxKTogUmVtb3ZlIG51bGwgY2hlY2sgb25jZSB3ZSBoYXZlIHByb3BlciBwYXRocyBmb3IgZmllbGRzXG4gICAgICAgIC8vIHdpdGhpbiBhcnJheXMuXG4gICAgICAgIGlmICh0aGlzLnBhdGgpIGZvciAobGV0IHQgPSAwOyB0IDwgdGhpcy5wYXRoLmxlbmd0aDsgdCsrKSB0aGlzLlh1KHRoaXMucGF0aC5nZXQodCkpO1xuICAgIH1cbiAgICBYdSh0KSB7XG4gICAgICAgIGlmICgwID09PSB0Lmxlbmd0aCkgdGhyb3cgdGhpcy5lYyhcIkRvY3VtZW50IGZpZWxkcyBtdXN0IG5vdCBiZSBlbXB0eVwiKTtcbiAgICAgICAgaWYgKHFjKHRoaXMuenUpICYmIEZjLnRlc3QodCkpIHRocm93IHRoaXMuZWMoJ0RvY3VtZW50IGZpZWxkcyBjYW5ub3QgYmVnaW4gYW5kIGVuZCB3aXRoIFwiX19cIicpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZm9yIHBhcnNpbmcgcmF3IHVzZXIgaW5wdXQgKHByb3ZpZGVkIHZpYSB0aGUgQVBJKSBpbnRvIGludGVybmFsIG1vZGVsXG4gKiBjbGFzc2VzLlxuICovIGNsYXNzIEtjIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgIHRoaXMuZGF0YWJhc2VJZCA9IHQsIHRoaXMuaWdub3JlVW5kZWZpbmVkUHJvcGVydGllcyA9IGUsIHRoaXMuTSA9IG4gfHwgT28odCk7XG4gICAgfVxuICAgIC8qKiBDcmVhdGVzIGEgbmV3IHRvcC1sZXZlbCBwYXJzZSBjb250ZXh0LiAqLyAgICBpYyh0LCBlLCBuLCBzID0gITEpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVYyh7XG4gICAgICAgICAgICB6dTogdCxcbiAgICAgICAgICAgIG1ldGhvZE5hbWU6IGUsXG4gICAgICAgICAgICBzYzogbixcbiAgICAgICAgICAgIHBhdGg6IG10LmVtcHR5UGF0aCgpLFxuICAgICAgICAgICAgWXU6ICExLFxuICAgICAgICAgICAgbmM6IHNcbiAgICAgICAgfSwgdGhpcy5kYXRhYmFzZUlkLCB0aGlzLk0sIHRoaXMuaWdub3JlVW5kZWZpbmVkUHJvcGVydGllcyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBHYyh0KSB7XG4gICAgY29uc3QgZSA9IHQuX2ZyZWV6ZVNldHRpbmdzKCksIG4gPSBPbyh0Ll9kYXRhYmFzZUlkKTtcbiAgICByZXR1cm4gbmV3IEtjKHQuX2RhdGFiYXNlSWQsICEhZS5pZ25vcmVVbmRlZmluZWRQcm9wZXJ0aWVzLCBuKTtcbn1cblxuLyoqIFBhcnNlIGRvY3VtZW50IGRhdGEgZnJvbSBhIHNldCgpIGNhbGwuICovIGZ1bmN0aW9uIFFjKHQsIGUsIG4sIHMsIGksIHIgPSB7fSkge1xuICAgIGNvbnN0IG8gPSB0LmljKHIubWVyZ2UgfHwgci5tZXJnZUZpZWxkcyA/IDIgLyogTWVyZ2VTZXQgKi8gOiAwIC8qIFNldCAqLyAsIGUsIG4sIGkpO1xuICAgIGloKFwiRGF0YSBtdXN0IGJlIGFuIG9iamVjdCwgYnV0IGl0IHdhczpcIiwgbywgcyk7XG4gICAgY29uc3QgYSA9IG5oKHMsIG8pO1xuICAgIGxldCB1LCBjO1xuICAgIGlmIChyLm1lcmdlKSB1ID0gbmV3IGd0KG8uZmllbGRNYXNrKSwgYyA9IG8uZmllbGRUcmFuc2Zvcm1zOyBlbHNlIGlmIChyLm1lcmdlRmllbGRzKSB7XG4gICAgICAgIGNvbnN0IHQgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBzIG9mIHIubWVyZ2VGaWVsZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSByaChlLCBzLCBuKTtcbiAgICAgICAgICAgIGlmICghby5jb250YWlucyhpKSkgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBgRmllbGQgJyR7aX0nIGlzIHNwZWNpZmllZCBpbiB5b3VyIGZpZWxkIG1hc2sgYnV0IG1pc3NpbmcgZnJvbSB5b3VyIGlucHV0IGRhdGEuYCk7XG4gICAgICAgICAgICBjaCh0LCBpKSB8fCB0LnB1c2goaSk7XG4gICAgICAgIH1cbiAgICAgICAgdSA9IG5ldyBndCh0KSwgYyA9IG8uZmllbGRUcmFuc2Zvcm1zLmZpbHRlcigodCA9PiB1LmNvdmVycyh0LmZpZWxkKSkpO1xuICAgIH0gZWxzZSB1ID0gbnVsbCwgYyA9IG8uZmllbGRUcmFuc2Zvcm1zO1xuICAgIHJldHVybiBuZXcgQmMobmV3IFh0KGEpLCB1LCBjKTtcbn1cblxuY2xhc3MgamMgZXh0ZW5kcyBPYyB7XG4gICAgX3RvRmllbGRUcmFuc2Zvcm0odCkge1xuICAgICAgICBpZiAoMiAvKiBNZXJnZVNldCAqLyAhPT0gdC56dSkgdGhyb3cgMSAvKiBVcGRhdGUgKi8gPT09IHQuenUgPyB0LmVjKGAke3RoaXMuX21ldGhvZE5hbWV9KCkgY2FuIG9ubHkgYXBwZWFyIGF0IHRoZSB0b3AgbGV2ZWwgb2YgeW91ciB1cGRhdGUgZGF0YWApIDogdC5lYyhgJHt0aGlzLl9tZXRob2ROYW1lfSgpIGNhbm5vdCBiZSB1c2VkIHdpdGggc2V0KCkgdW5sZXNzIHlvdSBwYXNzIHttZXJnZTp0cnVlfWApO1xuICAgICAgICAvLyBObyB0cmFuc2Zvcm0gdG8gYWRkIGZvciBhIGRlbGV0ZSwgYnV0IHdlIG5lZWQgdG8gYWRkIGl0IHRvIG91clxuICAgICAgICAvLyBmaWVsZE1hc2sgc28gaXQgZ2V0cyBkZWxldGVkLlxuICAgICAgICByZXR1cm4gdC5maWVsZE1hc2sucHVzaCh0LnBhdGgpLCBudWxsO1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBqYztcbiAgICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNoaWxkIGNvbnRleHQgZm9yIHBhcnNpbmcgU2VyaWFsaXphYmxlRmllbGRWYWx1ZXMuXG4gKlxuICogVGhpcyBpcyBkaWZmZXJlbnQgdGhhbiBjYWxsaW5nIGBQYXJzZUNvbnRleHQuY29udGV4dFdpdGhgIGJlY2F1c2UgaXQga2VlcHNcbiAqIHRoZSBmaWVsZFRyYW5zZm9ybXMgYW5kIGZpZWxkTWFzayBzZXBhcmF0ZS5cbiAqXG4gKiBUaGUgY3JlYXRlZCBjb250ZXh0IGhhcyBpdHMgYGRhdGFTb3VyY2VgIHNldCB0byBgVXNlckRhdGFTb3VyY2UuQXJndW1lbnRgLlxuICogQWx0aG91Z2ggdGhlc2UgdmFsdWVzIGFyZSB1c2VkIHdpdGggd3JpdGVzLCBhbnkgZWxlbWVudHMgaW4gdGhlc2UgRmllbGRWYWx1ZXNcbiAqIGFyZSBub3QgY29uc2lkZXJlZCB3cml0ZXMgc2luY2UgdGhleSBjYW5ub3QgY29udGFpbiBhbnkgRmllbGRWYWx1ZSBzZW50aW5lbHMsXG4gKiBldGMuXG4gKlxuICogQHBhcmFtIGZpZWxkVmFsdWUgLSBUaGUgc2VudGluZWwgRmllbGRWYWx1ZSBmb3Igd2hpY2ggdG8gY3JlYXRlIGEgY2hpbGRcbiAqICAgICBjb250ZXh0LlxuICogQHBhcmFtIGNvbnRleHQgLSBUaGUgcGFyZW50IGNvbnRleHQuXG4gKiBAcGFyYW0gYXJyYXlFbGVtZW50IC0gV2hldGhlciBvciBub3QgdGhlIEZpZWxkVmFsdWUgaGFzIGFuIGFycmF5LlxuICovIGZ1bmN0aW9uIFdjKHQsIGUsIG4pIHtcbiAgICByZXR1cm4gbmV3IFVjKHtcbiAgICAgICAgenU6IDMgLyogQXJndW1lbnQgKi8gLFxuICAgICAgICBzYzogZS5zZXR0aW5ncy5zYyxcbiAgICAgICAgbWV0aG9kTmFtZTogdC5fbWV0aG9kTmFtZSxcbiAgICAgICAgWXU6IG5cbiAgICB9LCBlLmRhdGFiYXNlSWQsIGUuTSwgZS5pZ25vcmVVbmRlZmluZWRQcm9wZXJ0aWVzKTtcbn1cblxuY2xhc3MgemMgZXh0ZW5kcyBPYyB7XG4gICAgX3RvRmllbGRUcmFuc2Zvcm0odCkge1xuICAgICAgICByZXR1cm4gbmV3IGFuKHQucGF0aCwgbmV3IFhlKTtcbiAgICB9XG4gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIHJldHVybiB0IGluc3RhbmNlb2YgemM7XG4gICAgfVxufVxuXG5jbGFzcyBIYyBleHRlbmRzIE9jIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKHQpLCB0aGlzLnJjID0gZTtcbiAgICB9XG4gICAgX3RvRmllbGRUcmFuc2Zvcm0odCkge1xuICAgICAgICBjb25zdCBlID0gV2ModGhpcywgdCwgXG4gICAgICAgIC8qYXJyYXk9Ki8gITApLCBuID0gdGhpcy5yYy5tYXAoKHQgPT4gZWgodCwgZSkpKSwgcyA9IG5ldyBaZShuKTtcbiAgICAgICAgcmV0dXJuIG5ldyBhbih0LnBhdGgsIHMpO1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgLy8gVE9ETyhtcnNjaG1pZHQpOiBJbXBsZW1lbnQgaXNFcXVhbHNcbiAgICAgICAgcmV0dXJuIHRoaXMgPT09IHQ7XG4gICAgfVxufVxuXG5jbGFzcyBKYyBleHRlbmRzIE9jIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKHQpLCB0aGlzLnJjID0gZTtcbiAgICB9XG4gICAgX3RvRmllbGRUcmFuc2Zvcm0odCkge1xuICAgICAgICBjb25zdCBlID0gV2ModGhpcywgdCwgXG4gICAgICAgIC8qYXJyYXk9Ki8gITApLCBuID0gdGhpcy5yYy5tYXAoKHQgPT4gZWgodCwgZSkpKSwgcyA9IG5ldyBlbihuKTtcbiAgICAgICAgcmV0dXJuIG5ldyBhbih0LnBhdGgsIHMpO1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgLy8gVE9ETyhtcnNjaG1pZHQpOiBJbXBsZW1lbnQgaXNFcXVhbHNcbiAgICAgICAgcmV0dXJuIHRoaXMgPT09IHQ7XG4gICAgfVxufVxuXG5jbGFzcyBZYyBleHRlbmRzIE9jIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKHQpLCB0aGlzLm9jID0gZTtcbiAgICB9XG4gICAgX3RvRmllbGRUcmFuc2Zvcm0odCkge1xuICAgICAgICBjb25zdCBlID0gbmV3IHNuKHQuTSwgV2UodC5NLCB0aGlzLm9jKSk7XG4gICAgICAgIHJldHVybiBuZXcgYW4odC5wYXRoLCBlKTtcbiAgICB9XG4gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIC8vIFRPRE8obXJzY2htaWR0KTogSW1wbGVtZW50IGlzRXF1YWxzXG4gICAgICAgIHJldHVybiB0aGlzID09PSB0O1xuICAgIH1cbn1cblxuLyoqIFBhcnNlIHVwZGF0ZSBkYXRhIGZyb20gYW4gdXBkYXRlKCkgY2FsbC4gKi8gZnVuY3Rpb24gWGModCwgZSwgbiwgcykge1xuICAgIGNvbnN0IGkgPSB0LmljKDEgLyogVXBkYXRlICovICwgZSwgbik7XG4gICAgaWgoXCJEYXRhIG11c3QgYmUgYW4gb2JqZWN0LCBidXQgaXQgd2FzOlwiLCBpLCBzKTtcbiAgICBjb25zdCByID0gW10sIG8gPSBYdC5lbXB0eSgpO1xuICAgIGx0KHMsICgodCwgcykgPT4ge1xuICAgICAgICBjb25zdCBhID0gYWgoZSwgdCwgbik7XG4gICAgICAgIC8vIEZvciBDb21wYXQgdHlwZXMsIHdlIGhhdmUgdG8gXCJleHRyYWN0XCIgdGhlIHVuZGVybHlpbmcgdHlwZXMgYmVmb3JlXG4gICAgICAgIC8vIHBlcmZvcm1pbmcgdmFsaWRhdGlvbi5cbiAgICAgICAgICAgICAgICBzID0gZ2V0TW9kdWxhckluc3RhbmNlKHMpO1xuICAgICAgICBjb25zdCB1ID0gaS5adShhKTtcbiAgICAgICAgaWYgKHMgaW5zdGFuY2VvZiBqYykgXG4gICAgICAgIC8vIEFkZCBpdCB0byB0aGUgZmllbGQgbWFzaywgYnV0IGRvbid0IGFkZCBhbnl0aGluZyB0byB1cGRhdGVEYXRhLlxuICAgICAgICByLnB1c2goYSk7IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdCA9IGVoKHMsIHUpO1xuICAgICAgICAgICAgbnVsbCAhPSB0ICYmIChyLnB1c2goYSksIG8uc2V0KGEsIHQpKTtcbiAgICAgICAgfVxuICAgIH0pKTtcbiAgICBjb25zdCBhID0gbmV3IGd0KHIpO1xuICAgIHJldHVybiBuZXcgTGMobywgYSwgaS5maWVsZFRyYW5zZm9ybXMpO1xufVxuXG4vKiogUGFyc2UgdXBkYXRlIGRhdGEgZnJvbSBhIGxpc3Qgb2YgZmllbGQvdmFsdWUgYXJndW1lbnRzLiAqLyBmdW5jdGlvbiBaYyh0LCBlLCBuLCBzLCBpLCByKSB7XG4gICAgY29uc3QgbyA9IHQuaWMoMSAvKiBVcGRhdGUgKi8gLCBlLCBuKSwgYSA9IFsgcmgoZSwgcywgbikgXSwgdSA9IFsgaSBdO1xuICAgIGlmIChyLmxlbmd0aCAlIDIgIT0gMCkgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBgRnVuY3Rpb24gJHtlfSgpIG5lZWRzIHRvIGJlIGNhbGxlZCB3aXRoIGFuIGV2ZW4gbnVtYmVyIG9mIGFyZ3VtZW50cyB0aGF0IGFsdGVybmF0ZSBiZXR3ZWVuIGZpZWxkIG5hbWVzIGFuZCB2YWx1ZXMuYCk7XG4gICAgZm9yIChsZXQgdCA9IDA7IHQgPCByLmxlbmd0aDsgdCArPSAyKSBhLnB1c2gocmgoZSwgclt0XSkpLCB1LnB1c2goclt0ICsgMV0pO1xuICAgIGNvbnN0IGMgPSBbXSwgaCA9IFh0LmVtcHR5KCk7XG4gICAgLy8gV2UgaXRlcmF0ZSBpbiByZXZlcnNlIG9yZGVyIHRvIHBpY2sgdGhlIGxhc3QgdmFsdWUgZm9yIGEgZmllbGQgaWYgdGhlXG4gICAgLy8gdXNlciBzcGVjaWZpZWQgdGhlIGZpZWxkIG11bHRpcGxlIHRpbWVzLlxuICAgIGZvciAobGV0IHQgPSBhLmxlbmd0aCAtIDE7IHQgPj0gMDsgLS10KSBpZiAoIWNoKGMsIGFbdF0pKSB7XG4gICAgICAgIGNvbnN0IGUgPSBhW3RdO1xuICAgICAgICBsZXQgbiA9IHVbdF07XG4gICAgICAgIC8vIEZvciBDb21wYXQgdHlwZXMsIHdlIGhhdmUgdG8gXCJleHRyYWN0XCIgdGhlIHVuZGVybHlpbmcgdHlwZXMgYmVmb3JlXG4gICAgICAgIC8vIHBlcmZvcm1pbmcgdmFsaWRhdGlvbi5cbiAgICAgICAgICAgICAgICBuID0gZ2V0TW9kdWxhckluc3RhbmNlKG4pO1xuICAgICAgICBjb25zdCBzID0gby5adShlKTtcbiAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBqYykgXG4gICAgICAgIC8vIEFkZCBpdCB0byB0aGUgZmllbGQgbWFzaywgYnV0IGRvbid0IGFkZCBhbnl0aGluZyB0byB1cGRhdGVEYXRhLlxuICAgICAgICBjLnB1c2goZSk7IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdCA9IGVoKG4sIHMpO1xuICAgICAgICAgICAgbnVsbCAhPSB0ICYmIChjLnB1c2goZSksIGguc2V0KGUsIHQpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBsID0gbmV3IGd0KGMpO1xuICAgIHJldHVybiBuZXcgTGMoaCwgbCwgby5maWVsZFRyYW5zZm9ybXMpO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgXCJxdWVyeSB2YWx1ZVwiIChlLmcuIHZhbHVlIGluIGEgd2hlcmUgZmlsdGVyIG9yIGEgdmFsdWUgaW4gYSBjdXJzb3JcbiAqIGJvdW5kKS5cbiAqXG4gKiBAcGFyYW0gYWxsb3dBcnJheXMgLSBXaGV0aGVyIHRoZSBxdWVyeSB2YWx1ZSBpcyBhbiBhcnJheSB0aGF0IG1heSBkaXJlY3RseVxuICogY29udGFpbiBhZGRpdGlvbmFsIGFycmF5cyAoZS5nLiB0aGUgb3BlcmFuZCBvZiBhbiBgaW5gIHF1ZXJ5KS5cbiAqLyBmdW5jdGlvbiB0aCh0LCBlLCBuLCBzID0gITEpIHtcbiAgICByZXR1cm4gZWgobiwgdC5pYyhzID8gNCAvKiBBcnJheUFyZ3VtZW50ICovIDogMyAvKiBBcmd1bWVudCAqLyAsIGUpKTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgdXNlciBkYXRhIHRvIFByb3RvYnVmIFZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gaW5wdXQgLSBEYXRhIHRvIGJlIHBhcnNlZC5cbiAqIEBwYXJhbSBjb250ZXh0IC0gQSBjb250ZXh0IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgcGF0aCBiZWluZyBwYXJzZWQsXG4gKiB0aGUgc291cmNlIG9mIHRoZSBkYXRhIGJlaW5nIHBhcnNlZCwgZXRjLlxuICogQHJldHVybnMgVGhlIHBhcnNlZCB2YWx1ZSwgb3IgbnVsbCBpZiB0aGUgdmFsdWUgd2FzIGEgRmllbGRWYWx1ZSBzZW50aW5lbFxuICogdGhhdCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgcGFyc2VkIGRhdGEuXG4gKi8gZnVuY3Rpb24gZWgodCwgZSkge1xuICAgIGlmIChzaChcbiAgICAvLyBVbndyYXAgdGhlIEFQSSB0eXBlIGZyb20gdGhlIENvbXBhdCBTREsuIFRoaXMgd2lsbCByZXR1cm4gdGhlIEFQSSB0eXBlXG4gICAgLy8gZnJvbSBmaXJlc3RvcmUtZXhwLlxuICAgIHQgPSBnZXRNb2R1bGFySW5zdGFuY2UodCkpKSByZXR1cm4gaWgoXCJVbnN1cHBvcnRlZCBmaWVsZCB2YWx1ZTpcIiwgZSwgdCksIG5oKHQsIGUpO1xuICAgIGlmICh0IGluc3RhbmNlb2YgT2MpIFxuICAgIC8vIEZpZWxkVmFsdWVzIHVzdWFsbHkgcGFyc2UgaW50byB0cmFuc2Zvcm1zIChleGNlcHQgZGVsZXRlRmllbGQoKSlcbiAgICAvLyBpbiB3aGljaCBjYXNlIHdlIGRvIG5vdCB3YW50IHRvIGluY2x1ZGUgdGhpcyBmaWVsZCBpbiBvdXIgcGFyc2VkIGRhdGFcbiAgICAvLyAoYXMgZG9pbmcgc28gd2lsbCBvdmVyd3JpdGUgdGhlIGZpZWxkIGRpcmVjdGx5IHByaW9yIHRvIHRoZSB0cmFuc2Zvcm1cbiAgICAvLyB0cnlpbmcgdG8gdHJhbnNmb3JtIGl0KS4gU28gd2UgZG9uJ3QgYWRkIHRoaXMgbG9jYXRpb24gdG9cbiAgICAvLyBjb250ZXh0LmZpZWxkTWFzayBhbmQgd2UgcmV0dXJuIG51bGwgYXMgb3VyIHBhcnNpbmcgcmVzdWx0LlxuICAgIC8qKlxuICogXCJQYXJzZXNcIiB0aGUgcHJvdmlkZWQgRmllbGRWYWx1ZUltcGwsIGFkZGluZyBhbnkgbmVjZXNzYXJ5IHRyYW5zZm9ybXMgdG9cbiAqIGNvbnRleHQuZmllbGRUcmFuc2Zvcm1zLlxuICovXG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgLy8gU2VudGluZWxzIGFyZSBvbmx5IHN1cHBvcnRlZCB3aXRoIHdyaXRlcywgYW5kIG5vdCB3aXRoaW4gYXJyYXlzLlxuICAgICAgICBpZiAoIXFjKGUuenUpKSB0aHJvdyBlLmVjKGAke3QuX21ldGhvZE5hbWV9KCkgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIHVwZGF0ZSgpIGFuZCBzZXQoKWApO1xuICAgICAgICBpZiAoIWUucGF0aCkgdGhyb3cgZS5lYyhgJHt0Ll9tZXRob2ROYW1lfSgpIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluc2lkZSBhcnJheXNgKTtcbiAgICAgICAgY29uc3QgbiA9IHQuX3RvRmllbGRUcmFuc2Zvcm0oZSk7XG4gICAgICAgIG4gJiYgZS5maWVsZFRyYW5zZm9ybXMucHVzaChuKTtcbiAgICB9XG4gICAgLyoqXG4gKiBIZWxwZXIgdG8gcGFyc2UgYSBzY2FsYXIgdmFsdWUgKGkuZS4gbm90IGFuIE9iamVjdCwgQXJyYXksIG9yIEZpZWxkVmFsdWUpXG4gKlxuICogQHJldHVybnMgVGhlIHBhcnNlZCB2YWx1ZVxuICovICh0LCBlKSwgbnVsbDtcbiAgICBpZiAodm9pZCAwID09PSB0ICYmIGUuaWdub3JlVW5kZWZpbmVkUHJvcGVydGllcykgXG4gICAgLy8gSWYgdGhlIGlucHV0IGlzIHVuZGVmaW5lZCBpdCBjYW4gbmV2ZXIgcGFydGljaXBhdGUgaW4gdGhlIGZpZWxkTWFzaywgc29cbiAgICAvLyBkb24ndCBoYW5kbGUgdGhpcyBiZWxvdy4gSWYgYGlnbm9yZVVuZGVmaW5lZFByb3BlcnRpZXNgIGlzIGZhbHNlLFxuICAgIC8vIGBwYXJzZVNjYWxhclZhbHVlYCB3aWxsIHJlamVjdCBhbiB1bmRlZmluZWQgdmFsdWUuXG4gICAgcmV0dXJuIG51bGw7XG4gICAgaWYgKFxuICAgIC8vIElmIGNvbnRleHQucGF0aCBpcyBudWxsIHdlIGFyZSBpbnNpZGUgYW4gYXJyYXkgYW5kIHdlIGRvbid0IHN1cHBvcnRcbiAgICAvLyBmaWVsZCBtYXNrIHBhdGhzIG1vcmUgZ3JhbnVsYXIgdGhhbiB0aGUgdG9wLWxldmVsIGFycmF5LlxuICAgIGUucGF0aCAmJiBlLmZpZWxkTWFzay5wdXNoKGUucGF0aCksIHQgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAvLyBUT0RPKGIvMzQ4NzExMzEpOiBJbmNsdWRlIHRoZSBwYXRoIGNvbnRhaW5pbmcgdGhlIGFycmF5IGluIHRoZSBlcnJvclxuICAgICAgICAvLyBtZXNzYWdlLlxuICAgICAgICAvLyBJbiB0aGUgY2FzZSBvZiBJTiBxdWVyaWVzLCB0aGUgcGFyc2VkIGRhdGEgaXMgYW4gYXJyYXkgKHJlcHJlc2VudGluZ1xuICAgICAgICAvLyB0aGUgc2V0IG9mIHZhbHVlcyB0byBiZSBpbmNsdWRlZCBmb3IgdGhlIElOIHF1ZXJ5KSB0aGF0IG1heSBkaXJlY3RseVxuICAgICAgICAvLyBjb250YWluIGFkZGl0aW9uYWwgYXJyYXlzIChlYWNoIHJlcHJlc2VudGluZyBhbiBpbmRpdmlkdWFsIGZpZWxkXG4gICAgICAgIC8vIHZhbHVlKSwgc28gd2UgZGlzYWJsZSB0aGlzIHZhbGlkYXRpb24uXG4gICAgICAgIGlmIChlLnNldHRpbmdzLll1ICYmIDQgLyogQXJyYXlBcmd1bWVudCAqLyAhPT0gZS56dSkgdGhyb3cgZS5lYyhcIk5lc3RlZCBhcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gW107XG4gICAgICAgICAgICBsZXQgcyA9IDA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdCkge1xuICAgICAgICAgICAgICAgIGxldCB0ID0gZWgoaSwgZS50YyhzKSk7XG4gICAgICAgICAgICAgICAgbnVsbCA9PSB0ICYmIChcbiAgICAgICAgICAgICAgICAvLyBKdXN0IGluY2x1ZGUgbnVsbHMgaW4gdGhlIGFycmF5IGZvciBmaWVsZHMgYmVpbmcgcmVwbGFjZWQgd2l0aCBhXG4gICAgICAgICAgICAgICAgLy8gc2VudGluZWwuXG4gICAgICAgICAgICAgICAgdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgbnVsbFZhbHVlOiBcIk5VTExfVkFMVUVcIlxuICAgICAgICAgICAgICAgIH0pLCBuLnB1c2godCksIHMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYXJyYXlWYWx1ZToge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KHQsIGUpO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICBpZiAobnVsbCA9PT0gKHQgPSBnZXRNb2R1bGFySW5zdGFuY2UodCkpKSByZXR1cm4ge1xuICAgICAgICAgICAgbnVsbFZhbHVlOiBcIk5VTExfVkFMVUVcIlxuICAgICAgICB9O1xuICAgICAgICBpZiAoXCJudW1iZXJcIiA9PSB0eXBlb2YgdCkgcmV0dXJuIFdlKGUuTSwgdCk7XG4gICAgICAgIGlmIChcImJvb2xlYW5cIiA9PSB0eXBlb2YgdCkgcmV0dXJuIHtcbiAgICAgICAgICAgIGJvb2xlYW5WYWx1ZTogdFxuICAgICAgICB9O1xuICAgICAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCkgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiB0XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0IGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHV0LmZyb21EYXRlKHQpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXBWYWx1ZTogcnMoZS5NLCBuKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodCBpbnN0YW5jZW9mIHV0KSB7XG4gICAgICAgICAgICAvLyBGaXJlc3RvcmUgYmFja2VuZCB0cnVuY2F0ZXMgcHJlY2lzaW9uIGRvd24gdG8gbWljcm9zZWNvbmRzLiBUbyBlbnN1cmVcbiAgICAgICAgICAgIC8vIG9mZmxpbmUgbW9kZSB3b3JrcyB0aGUgc2FtZSB3aXRoIHJlZ2FyZHMgdG8gdHJ1bmNhdGlvbiwgcGVyZm9ybSB0aGVcbiAgICAgICAgICAgIC8vIHRydW5jYXRpb24gaW1tZWRpYXRlbHkgd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgYmFja2VuZCB0byBkbyB0aGF0LlxuICAgICAgICAgICAgY29uc3QgbiA9IG5ldyB1dCh0LnNlY29uZHMsIDFlMyAqIE1hdGguZmxvb3IodC5uYW5vc2Vjb25kcyAvIDFlMykpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXBWYWx1ZTogcnMoZS5NLCBuKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodCBpbnN0YW5jZW9mICRjKSByZXR1cm4ge1xuICAgICAgICAgICAgZ2VvUG9pbnRWYWx1ZToge1xuICAgICAgICAgICAgICAgIGxhdGl0dWRlOiB0LmxhdGl0dWRlLFxuICAgICAgICAgICAgICAgIGxvbmdpdHVkZTogdC5sb25naXR1ZGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBNYykgcmV0dXJuIHtcbiAgICAgICAgICAgIGJ5dGVzVmFsdWU6IG9zKGUuTSwgdC5fYnl0ZVN0cmluZylcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiByYykge1xuICAgICAgICAgICAgY29uc3QgbiA9IGUuZGF0YWJhc2VJZCwgcyA9IHQuZmlyZXN0b3JlLl9kYXRhYmFzZUlkO1xuICAgICAgICAgICAgaWYgKCFzLmlzRXF1YWwobikpIHRocm93IGUuZWMoYERvY3VtZW50IHJlZmVyZW5jZSBpcyBmb3IgZGF0YWJhc2UgJHtzLnByb2plY3RJZH0vJHtzLmRhdGFiYXNlfSBidXQgc2hvdWxkIGJlIGZvciBkYXRhYmFzZSAke24ucHJvamVjdElkfS8ke24uZGF0YWJhc2V9YCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZVZhbHVlOiBjcyh0LmZpcmVzdG9yZS5fZGF0YWJhc2VJZCB8fCBlLmRhdGFiYXNlSWQsIHQuX2tleS5wYXRoKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlLmVjKGBVbnN1cHBvcnRlZCBmaWVsZCB2YWx1ZTogJHtadSh0KX1gKTtcbiAgICB9XG4gICAgLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhbiBvYmplY3QgbG9va3MgbGlrZSBhIEpTT04gb2JqZWN0IHRoYXQgc2hvdWxkIGJlIGNvbnZlcnRlZFxuICogaW50byBhIHN0cnVjdC4gTm9ybWFsIGNsYXNzL3Byb3RvdHlwZSBpbnN0YW5jZXMgYXJlIGNvbnNpZGVyZWQgdG8gbG9vayBsaWtlXG4gKiBKU09OIG9iamVjdHMgc2luY2UgdGhleSBzaG91bGQgYmUgY29udmVydGVkIHRvIGEgc3RydWN0IHZhbHVlLiBBcnJheXMsIERhdGVzLFxuICogR2VvUG9pbnRzLCBldGMuIGFyZSBub3QgY29uc2lkZXJlZCB0byBsb29rIGxpa2UgSlNPTiBvYmplY3RzIHNpbmNlIHRoZXkgbWFwXG4gKiB0byBzcGVjaWZpYyBGaWVsZFZhbHVlIHR5cGVzIG90aGVyIHRoYW4gT2JqZWN0VmFsdWUuXG4gKi8gKHQsIGUpO1xufVxuXG5mdW5jdGlvbiBuaCh0LCBlKSB7XG4gICAgY29uc3QgbiA9IHt9O1xuICAgIHJldHVybiBmdCh0KSA/IFxuICAgIC8vIElmIHdlIGVuY291bnRlciBhbiBlbXB0eSBvYmplY3QsIHdlIGV4cGxpY2l0bHkgYWRkIGl0IHRvIHRoZSB1cGRhdGVcbiAgICAvLyBtYXNrIHRvIGVuc3VyZSB0aGF0IHRoZSBzZXJ2ZXIgY3JlYXRlcyBhIG1hcCBlbnRyeS5cbiAgICBlLnBhdGggJiYgZS5wYXRoLmxlbmd0aCA+IDAgJiYgZS5maWVsZE1hc2sucHVzaChlLnBhdGgpIDogbHQodCwgKCh0LCBzKSA9PiB7XG4gICAgICAgIGNvbnN0IGkgPSBlaChzLCBlLkp1KHQpKTtcbiAgICAgICAgbnVsbCAhPSBpICYmIChuW3RdID0gaSk7XG4gICAgfSkpLCB7XG4gICAgICAgIG1hcFZhbHVlOiB7XG4gICAgICAgICAgICBmaWVsZHM6IG5cbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIHNoKHQpIHtcbiAgICByZXR1cm4gIShcIm9iamVjdFwiICE9IHR5cGVvZiB0IHx8IG51bGwgPT09IHQgfHwgdCBpbnN0YW5jZW9mIEFycmF5IHx8IHQgaW5zdGFuY2VvZiBEYXRlIHx8IHQgaW5zdGFuY2VvZiB1dCB8fCB0IGluc3RhbmNlb2YgJGMgfHwgdCBpbnN0YW5jZW9mIE1jIHx8IHQgaW5zdGFuY2VvZiByYyB8fCB0IGluc3RhbmNlb2YgT2MpO1xufVxuXG5mdW5jdGlvbiBpaCh0LCBlLCBuKSB7XG4gICAgaWYgKCFzaChuKSB8fCAhZnVuY3Rpb24odCkge1xuICAgICAgICByZXR1cm4gXCJvYmplY3RcIiA9PSB0eXBlb2YgdCAmJiBudWxsICE9PSB0ICYmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkgPT09IE9iamVjdC5wcm90b3R5cGUgfHwgbnVsbCA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKTtcbiAgICB9KG4pKSB7XG4gICAgICAgIGNvbnN0IHMgPSBadShuKTtcbiAgICAgICAgdGhyb3cgXCJhbiBvYmplY3RcIiA9PT0gcyA/IGUuZWModCArIFwiIGEgY3VzdG9tIG9iamVjdFwiKSA6IGUuZWModCArIFwiIFwiICsgcyk7XG4gICAgfVxufVxuXG4vKipcbiAqIEhlbHBlciB0aGF0IGNhbGxzIGZyb21Eb3RTZXBhcmF0ZWRTdHJpbmcoKSBidXQgd3JhcHMgYW55IGVycm9yIHRocm93bi5cbiAqLyBmdW5jdGlvbiByaCh0LCBlLCBuKSB7XG4gICAgaWYgKChcbiAgICAvLyBJZiByZXF1aXJlZCwgcmVwbGFjZSB0aGUgRmllbGRQYXRoIENvbXBhdCBjbGFzcyB3aXRoIHdpdGggdGhlIGZpcmVzdG9yZS1leHBcbiAgICAvLyBGaWVsZFBhdGguXG4gICAgZSA9IGdldE1vZHVsYXJJbnN0YW5jZShlKSkgaW5zdGFuY2VvZiBOYykgcmV0dXJuIGUuX2ludGVybmFsUGF0aDtcbiAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgZSkgcmV0dXJuIGFoKHQsIGUpO1xuICAgIHRocm93IHVoKFwiRmllbGQgcGF0aCBhcmd1bWVudHMgbXVzdCBiZSBvZiB0eXBlIHN0cmluZyBvciBcIiwgdCwgXG4gICAgLyogaGFzQ29udmVydGVyPSAqLyAhMSwgXG4gICAgLyogcGF0aD0gKi8gdm9pZCAwLCBuKTtcbn1cblxuLyoqXG4gKiBNYXRjaGVzIGFueSBjaGFyYWN0ZXJzIGluIGEgZmllbGQgcGF0aCBzdHJpbmcgdGhhdCBhcmUgcmVzZXJ2ZWQuXG4gKi8gY29uc3Qgb2ggPSBuZXcgUmVnRXhwKFwiW35cXFxcKi9cXFxcW1xcXFxdXVwiKTtcblxuLyoqXG4gKiBXcmFwcyBmcm9tRG90U2VwYXJhdGVkU3RyaW5nIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBhYm91dCB0aGUgbWV0aG9kIHRoYXRcbiAqIHdhcyB0aHJvd24uXG4gKiBAcGFyYW0gbWV0aG9kTmFtZSAtIFRoZSBwdWJsaWNseSB2aXNpYmxlIG1ldGhvZCBuYW1lXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBkb3Qtc2VwYXJhdGVkIHN0cmluZyBmb3JtIG9mIGEgZmllbGQgcGF0aCB3aGljaCB3aWxsIGJlXG4gKiBzcGxpdCBvbiBkb3RzLlxuICogQHBhcmFtIHRhcmdldERvYyAtIFRoZSBkb2N1bWVudCBhZ2FpbnN0IHdoaWNoIHRoZSBmaWVsZCBwYXRoIHdpbGwgYmVcbiAqIGV2YWx1YXRlZC5cbiAqLyBmdW5jdGlvbiBhaCh0LCBlLCBuKSB7XG4gICAgaWYgKGUuc2VhcmNoKG9oKSA+PSAwKSB0aHJvdyB1aChgSW52YWxpZCBmaWVsZCBwYXRoICgke2V9KS4gUGF0aHMgbXVzdCBub3QgY29udGFpbiAnficsICcqJywgJy8nLCAnWycsIG9yICddJ2AsIHQsIFxuICAgIC8qIGhhc0NvbnZlcnRlcj0gKi8gITEsIFxuICAgIC8qIHBhdGg9ICovIHZvaWQgMCwgbik7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG5ldyBOYyguLi5lLnNwbGl0KFwiLlwiKSkuX2ludGVybmFsUGF0aDtcbiAgICB9IGNhdGNoIChzKSB7XG4gICAgICAgIHRocm93IHVoKGBJbnZhbGlkIGZpZWxkIHBhdGggKCR7ZX0pLiBQYXRocyBtdXN0IG5vdCBiZSBlbXB0eSwgYmVnaW4gd2l0aCAnLicsIGVuZCB3aXRoICcuJywgb3IgY29udGFpbiAnLi4nYCwgdCwgXG4gICAgICAgIC8qIGhhc0NvbnZlcnRlcj0gKi8gITEsIFxuICAgICAgICAvKiBwYXRoPSAqLyB2b2lkIDAsIG4pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdWgodCwgZSwgbiwgcywgaSkge1xuICAgIGNvbnN0IHIgPSBzICYmICFzLmlzRW1wdHkoKSwgbyA9IHZvaWQgMCAhPT0gaTtcbiAgICBsZXQgYSA9IGBGdW5jdGlvbiAke2V9KCkgY2FsbGVkIHdpdGggaW52YWxpZCBkYXRhYDtcbiAgICBuICYmIChhICs9IFwiICh2aWEgYHRvRmlyZXN0b3JlKClgKVwiKSwgYSArPSBcIi4gXCI7XG4gICAgbGV0IHUgPSBcIlwiO1xuICAgIHJldHVybiAociB8fCBvKSAmJiAodSArPSBcIiAoZm91bmRcIiwgciAmJiAodSArPSBgIGluIGZpZWxkICR7c31gKSwgbyAmJiAodSArPSBgIGluIGRvY3VtZW50ICR7aX1gKSwgXG4gICAgdSArPSBcIilcIiksIG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgYSArIHQgKyB1KTtcbn1cblxuLyoqIENoZWNrcyBgaGF5c3RhY2tgIGlmIEZpZWxkUGF0aCBgbmVlZGxlYCBpcyBwcmVzZW50LiBSdW5zIGluIE8obikuICovIGZ1bmN0aW9uIGNoKHQsIGUpIHtcbiAgICByZXR1cm4gdC5zb21lKCh0ID0+IHQuaXNFcXVhbChlKSkpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIGBEb2N1bWVudFNuYXBzaG90YCBjb250YWlucyBkYXRhIHJlYWQgZnJvbSBhIGRvY3VtZW50IGluIHlvdXIgRmlyZXN0b3JlXG4gKiBkYXRhYmFzZS4gVGhlIGRhdGEgY2FuIGJlIGV4dHJhY3RlZCB3aXRoIGAuZGF0YSgpYCBvciBgLmdldCg8ZmllbGQ+KWAgdG9cbiAqIGdldCBhIHNwZWNpZmljIGZpZWxkLlxuICpcbiAqIEZvciBhIGBEb2N1bWVudFNuYXBzaG90YCB0aGF0IHBvaW50cyB0byBhIG5vbi1leGlzdGluZyBkb2N1bWVudCwgYW55IGRhdGFcbiAqIGFjY2VzcyB3aWxsIHJldHVybiAndW5kZWZpbmVkJy4gWW91IGNhbiB1c2UgdGhlIGBleGlzdHMoKWAgbWV0aG9kIHRvXG4gKiBleHBsaWNpdGx5IHZlcmlmeSBhIGRvY3VtZW50J3MgZXhpc3RlbmNlLlxuICovIGNsYXNzIGhoIHtcbiAgICAvLyBOb3RlOiBUaGlzIGNsYXNzIGlzIHN0cmlwcGVkIGRvd24gdmVyc2lvbiBvZiB0aGUgRG9jdW1lbnRTbmFwc2hvdCBpblxuICAgIC8vIHRoZSBsZWdhY3kgU0RLLiBUaGUgY2hhbmdlcyBhcmU6XG4gICAgLy8gLSBObyBzdXBwb3J0IGZvciBTbmFwc2hvdE1ldGFkYXRhLlxuICAgIC8vIC0gTm8gc3VwcG9ydCBmb3IgU25hcHNob3RPcHRpb25zLlxuICAgIC8qKiBAaGlkZWNvbnN0cnVjdG9yIHByb3RlY3RlZCAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMsIGkpIHtcbiAgICAgICAgdGhpcy5fZmlyZXN0b3JlID0gdCwgdGhpcy5fdXNlckRhdGFXcml0ZXIgPSBlLCB0aGlzLl9rZXkgPSBuLCB0aGlzLl9kb2N1bWVudCA9IHMsIFxuICAgICAgICB0aGlzLl9jb252ZXJ0ZXIgPSBpO1xuICAgIH1cbiAgICAvKiogUHJvcGVydHkgb2YgdGhlIGBEb2N1bWVudFNuYXBzaG90YCB0aGF0IHByb3ZpZGVzIHRoZSBkb2N1bWVudCdzIElELiAqLyAgICBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9rZXkucGF0aC5sYXN0U2VnbWVudCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgYERvY3VtZW50UmVmZXJlbmNlYCBmb3IgdGhlIGRvY3VtZW50IGluY2x1ZGVkIGluIHRoZSBgRG9jdW1lbnRTbmFwc2hvdGAuXG4gICAgICovICAgIGdldCByZWYoKSB7XG4gICAgICAgIHJldHVybiBuZXcgcmModGhpcy5fZmlyZXN0b3JlLCB0aGlzLl9jb252ZXJ0ZXIsIHRoaXMuX2tleSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpZ25hbHMgd2hldGhlciBvciBub3QgdGhlIGRvY3VtZW50IGF0IHRoZSBzbmFwc2hvdCdzIGxvY2F0aW9uIGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGRvY3VtZW50IGV4aXN0cy5cbiAgICAgKi8gICAgZXhpc3RzKCkge1xuICAgICAgICByZXR1cm4gbnVsbCAhPT0gdGhpcy5fZG9jdW1lbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyBhbGwgZmllbGRzIGluIHRoZSBkb2N1bWVudCBhcyBhbiBgT2JqZWN0YC4gUmV0dXJucyBgdW5kZWZpbmVkYCBpZlxuICAgICAqIHRoZSBkb2N1bWVudCBkb2Vzbid0IGV4aXN0LlxuICAgICAqXG4gICAgICogQHJldHVybnMgQW4gYE9iamVjdGAgY29udGFpbmluZyBhbGwgZmllbGRzIGluIHRoZSBkb2N1bWVudCBvciBgdW5kZWZpbmVkYFxuICAgICAqIGlmIHRoZSBkb2N1bWVudCBkb2Vzbid0IGV4aXN0LlxuICAgICAqLyAgICBkYXRhKCkge1xuICAgICAgICBpZiAodGhpcy5fZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jb252ZXJ0ZXIpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBvbmx5IHdhbnQgdG8gdXNlIHRoZSBjb252ZXJ0ZXIgYW5kIGNyZWF0ZSBhIG5ldyBEb2N1bWVudFNuYXBzaG90XG4gICAgICAgICAgICAgICAgLy8gaWYgYSBjb252ZXJ0ZXIgaGFzIGJlZW4gcHJvdmlkZWQuXG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IG5ldyBsaCh0aGlzLl9maXJlc3RvcmUsIHRoaXMuX3VzZXJEYXRhV3JpdGVyLCB0aGlzLl9rZXksIHRoaXMuX2RvY3VtZW50LCBcbiAgICAgICAgICAgICAgICAvKiBjb252ZXJ0ZXI9ICovIG51bGwpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0ZXIuZnJvbUZpcmVzdG9yZSh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91c2VyRGF0YVdyaXRlci5jb252ZXJ0VmFsdWUodGhpcy5fZG9jdW1lbnQuZGF0YS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBmaWVsZCBzcGVjaWZpZWQgYnkgYGZpZWxkUGF0aGAuIFJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhlXG4gICAgICogZG9jdW1lbnQgb3IgZmllbGQgZG9lc24ndCBleGlzdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWVsZFBhdGggLSBUaGUgcGF0aCAoZm9yIGV4YW1wbGUgJ2Zvbycgb3IgJ2Zvby5iYXInKSB0byBhIHNwZWNpZmljXG4gICAgICogZmllbGQuXG4gICAgICogQHJldHVybnMgVGhlIGRhdGEgYXQgdGhlIHNwZWNpZmllZCBmaWVsZCBsb2NhdGlvbiBvciB1bmRlZmluZWQgaWYgbm8gc3VjaFxuICAgICAqIGZpZWxkIGV4aXN0cyBpbiB0aGUgZG9jdW1lbnQuXG4gICAgICovXG4gICAgLy8gV2UgYXJlIHVzaW5nIGBhbnlgIGhlcmUgdG8gYXZvaWQgYW4gZXhwbGljaXQgY2FzdCBieSBvdXIgdXNlcnMuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBnZXQodCkge1xuICAgICAgICBpZiAodGhpcy5fZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLl9kb2N1bWVudC5kYXRhLmZpZWxkKGZoKFwiRG9jdW1lbnRTbmFwc2hvdC5nZXRcIiwgdCkpO1xuICAgICAgICAgICAgaWYgKG51bGwgIT09IGUpIHJldHVybiB0aGlzLl91c2VyRGF0YVdyaXRlci5jb252ZXJ0VmFsdWUoZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQSBgUXVlcnlEb2N1bWVudFNuYXBzaG90YCBjb250YWlucyBkYXRhIHJlYWQgZnJvbSBhIGRvY3VtZW50IGluIHlvdXJcbiAqIEZpcmVzdG9yZSBkYXRhYmFzZSBhcyBwYXJ0IG9mIGEgcXVlcnkuIFRoZSBkb2N1bWVudCBpcyBndWFyYW50ZWVkIHRvIGV4aXN0XG4gKiBhbmQgaXRzIGRhdGEgY2FuIGJlIGV4dHJhY3RlZCB3aXRoIGAuZGF0YSgpYCBvciBgLmdldCg8ZmllbGQ+KWAgdG8gZ2V0IGFcbiAqIHNwZWNpZmljIGZpZWxkLlxuICpcbiAqIEEgYFF1ZXJ5RG9jdW1lbnRTbmFwc2hvdGAgb2ZmZXJzIHRoZSBzYW1lIEFQSSBzdXJmYWNlIGFzIGFcbiAqIGBEb2N1bWVudFNuYXBzaG90YC4gU2luY2UgcXVlcnkgcmVzdWx0cyBjb250YWluIG9ubHkgZXhpc3RpbmcgZG9jdW1lbnRzLCB0aGVcbiAqIGBleGlzdHNgIHByb3BlcnR5IHdpbGwgYWx3YXlzIGJlIHRydWUgYW5kIGBkYXRhKClgIHdpbGwgbmV2ZXIgcmV0dXJuXG4gKiAndW5kZWZpbmVkJy5cbiAqLyBjbGFzcyBsaCBleHRlbmRzIGhoIHtcbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgYWxsIGZpZWxkcyBpbiB0aGUgZG9jdW1lbnQgYXMgYW4gYE9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKiBAcmV0dXJucyBBbiBgT2JqZWN0YCBjb250YWluaW5nIGFsbCBmaWVsZHMgaW4gdGhlIGRvY3VtZW50LlxuICAgICAqL1xuICAgIGRhdGEoKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5kYXRhKCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEhlbHBlciB0aGF0IGNhbGxzIGBmcm9tRG90U2VwYXJhdGVkU3RyaW5nKClgIGJ1dCB3cmFwcyBhbnkgZXJyb3IgdGhyb3duLlxuICovIGZ1bmN0aW9uIGZoKHQsIGUpIHtcbiAgICByZXR1cm4gXCJzdHJpbmdcIiA9PSB0eXBlb2YgZSA/IGFoKHQsIGUpIDogZSBpbnN0YW5jZW9mIE5jID8gZS5faW50ZXJuYWxQYXRoIDogZS5fZGVsZWdhdGUuX2ludGVybmFsUGF0aDtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogTWV0YWRhdGEgYWJvdXQgYSBzbmFwc2hvdCwgZGVzY3JpYmluZyB0aGUgc3RhdGUgb2YgdGhlIHNuYXBzaG90LlxuICovIGNsYXNzIGRoIHtcbiAgICAvKiogQGhpZGVjb25zdHJ1Y3RvciAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5oYXNQZW5kaW5nV3JpdGVzID0gdCwgdGhpcy5mcm9tQ2FjaGUgPSBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBgU25hcHNob3RNZXRhZGF0YWAgaXMgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIG9uZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvdGhlciAtIFRoZSBgU25hcHNob3RNZXRhZGF0YWAgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhpcyBgU25hcHNob3RNZXRhZGF0YWAgaXMgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIG9uZS5cbiAgICAgKi8gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc1BlbmRpbmdXcml0ZXMgPT09IHQuaGFzUGVuZGluZ1dyaXRlcyAmJiB0aGlzLmZyb21DYWNoZSA9PT0gdC5mcm9tQ2FjaGU7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgYERvY3VtZW50U25hcHNob3RgIGNvbnRhaW5zIGRhdGEgcmVhZCBmcm9tIGEgZG9jdW1lbnQgaW4geW91ciBGaXJlc3RvcmVcbiAqIGRhdGFiYXNlLiBUaGUgZGF0YSBjYW4gYmUgZXh0cmFjdGVkIHdpdGggYC5kYXRhKClgIG9yIGAuZ2V0KDxmaWVsZD4pYCB0b1xuICogZ2V0IGEgc3BlY2lmaWMgZmllbGQuXG4gKlxuICogRm9yIGEgYERvY3VtZW50U25hcHNob3RgIHRoYXQgcG9pbnRzIHRvIGEgbm9uLWV4aXN0aW5nIGRvY3VtZW50LCBhbnkgZGF0YVxuICogYWNjZXNzIHdpbGwgcmV0dXJuICd1bmRlZmluZWQnLiBZb3UgY2FuIHVzZSB0aGUgYGV4aXN0cygpYCBtZXRob2QgdG9cbiAqIGV4cGxpY2l0bHkgdmVyaWZ5IGEgZG9jdW1lbnQncyBleGlzdGVuY2UuXG4gKi8gY2xhc3MgX2ggZXh0ZW5kcyBoaCB7XG4gICAgLyoqIEBoaWRlY29uc3RydWN0b3IgcHJvdGVjdGVkICovXG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgcywgaSwgcikge1xuICAgICAgICBzdXBlcih0LCBlLCBuLCBzLCByKSwgdGhpcy5fZmlyZXN0b3JlID0gdCwgdGhpcy5fZmlyZXN0b3JlSW1wbCA9IHQsIHRoaXMubWV0YWRhdGEgPSBpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBkYXRhIGV4aXN0cy4gVHJ1ZSBpZiB0aGUgZG9jdW1lbnQgZXhpc3RzLlxuICAgICAqLyAgICBleGlzdHMoKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5leGlzdHMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIGFsbCBmaWVsZHMgaW4gdGhlIGRvY3VtZW50IGFzIGFuIGBPYmplY3RgLiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmXG4gICAgICogdGhlIGRvY3VtZW50IGRvZXNuJ3QgZXhpc3QuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0LCBgc2VydmVyVGltZXN0YW1wKClgIHZhbHVlcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuXG4gICAgICogc2V0IHRvIHRoZWlyIGZpbmFsIHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQgYXMgYG51bGxgLiBZb3UgY2FuIG92ZXJyaWRlXG4gICAgICogdGhpcyBieSBwYXNzaW5nIGFuIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvcHRpb25zIG9iamVjdCB0byBjb25maWd1cmUgaG93IGRhdGEgaXMgcmV0cmlldmVkIGZyb21cbiAgICAgKiB0aGUgc25hcHNob3QgKGZvciBleGFtcGxlIHRoZSBkZXNpcmVkIGJlaGF2aW9yIGZvciBzZXJ2ZXIgdGltZXN0YW1wcyB0aGF0XG4gICAgICogaGF2ZSBub3QgeWV0IGJlZW4gc2V0IHRvIHRoZWlyIGZpbmFsIHZhbHVlKS5cbiAgICAgKiBAcmV0dXJucyBBbiBgT2JqZWN0YCBjb250YWluaW5nIGFsbCBmaWVsZHMgaW4gdGhlIGRvY3VtZW50IG9yIGB1bmRlZmluZWRgIGlmXG4gICAgICogdGhlIGRvY3VtZW50IGRvZXNuJ3QgZXhpc3QuXG4gICAgICovICAgIGRhdGEodCA9IHt9KSB7XG4gICAgICAgIGlmICh0aGlzLl9kb2N1bWVudCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnZlcnRlcikge1xuICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgd2FudCB0byB1c2UgdGhlIGNvbnZlcnRlciBhbmQgY3JlYXRlIGEgbmV3IERvY3VtZW50U25hcHNob3RcbiAgICAgICAgICAgICAgICAvLyBpZiBhIGNvbnZlcnRlciBoYXMgYmVlbiBwcm92aWRlZC5cbiAgICAgICAgICAgICAgICBjb25zdCBlID0gbmV3IHdoKHRoaXMuX2ZpcmVzdG9yZSwgdGhpcy5fdXNlckRhdGFXcml0ZXIsIHRoaXMuX2tleSwgdGhpcy5fZG9jdW1lbnQsIHRoaXMubWV0YWRhdGEsIFxuICAgICAgICAgICAgICAgIC8qIGNvbnZlcnRlcj0gKi8gbnVsbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRlci5mcm9tRmlyZXN0b3JlKGUsIHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJEYXRhV3JpdGVyLmNvbnZlcnRWYWx1ZSh0aGlzLl9kb2N1bWVudC5kYXRhLnZhbHVlLCB0LnNlcnZlclRpbWVzdGFtcHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgZmllbGQgc3BlY2lmaWVkIGJ5IGBmaWVsZFBhdGhgLiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZVxuICAgICAqIGRvY3VtZW50IG9yIGZpZWxkIGRvZXNuJ3QgZXhpc3QuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0LCBhIGBzZXJ2ZXJUaW1lc3RhbXAoKWAgdGhhdCBoYXMgbm90IHlldCBiZWVuIHNldCB0b1xuICAgICAqIGl0cyBmaW5hbCB2YWx1ZSB3aWxsIGJlIHJldHVybmVkIGFzIGBudWxsYC4gWW91IGNhbiBvdmVycmlkZSB0aGlzIGJ5XG4gICAgICogcGFzc2luZyBhbiBvcHRpb25zIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWVsZFBhdGggLSBUaGUgcGF0aCAoZm9yIGV4YW1wbGUgJ2Zvbycgb3IgJ2Zvby5iYXInKSB0byBhIHNwZWNpZmljXG4gICAgICogZmllbGQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvcHRpb25zIG9iamVjdCB0byBjb25maWd1cmUgaG93IHRoZSBmaWVsZCBpcyByZXRyaWV2ZWRcbiAgICAgKiBmcm9tIHRoZSBzbmFwc2hvdCAoZm9yIGV4YW1wbGUgdGhlIGRlc2lyZWQgYmVoYXZpb3IgZm9yIHNlcnZlciB0aW1lc3RhbXBzXG4gICAgICogdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBzZXQgdG8gdGhlaXIgZmluYWwgdmFsdWUpLlxuICAgICAqIEByZXR1cm5zIFRoZSBkYXRhIGF0IHRoZSBzcGVjaWZpZWQgZmllbGQgbG9jYXRpb24gb3IgdW5kZWZpbmVkIGlmIG5vIHN1Y2hcbiAgICAgKiBmaWVsZCBleGlzdHMgaW4gdGhlIGRvY3VtZW50LlxuICAgICAqL1xuICAgIC8vIFdlIGFyZSB1c2luZyBgYW55YCBoZXJlIHRvIGF2b2lkIGFuIGV4cGxpY2l0IGNhc3QgYnkgb3VyIHVzZXJzLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgZ2V0KHQsIGUgPSB7fSkge1xuICAgICAgICBpZiAodGhpcy5fZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLl9kb2N1bWVudC5kYXRhLmZpZWxkKGZoKFwiRG9jdW1lbnRTbmFwc2hvdC5nZXRcIiwgdCkpO1xuICAgICAgICAgICAgaWYgKG51bGwgIT09IG4pIHJldHVybiB0aGlzLl91c2VyRGF0YVdyaXRlci5jb252ZXJ0VmFsdWUobiwgZS5zZXJ2ZXJUaW1lc3RhbXBzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBBIGBRdWVyeURvY3VtZW50U25hcHNob3RgIGNvbnRhaW5zIGRhdGEgcmVhZCBmcm9tIGEgZG9jdW1lbnQgaW4geW91clxuICogRmlyZXN0b3JlIGRhdGFiYXNlIGFzIHBhcnQgb2YgYSBxdWVyeS4gVGhlIGRvY3VtZW50IGlzIGd1YXJhbnRlZWQgdG8gZXhpc3RcbiAqIGFuZCBpdHMgZGF0YSBjYW4gYmUgZXh0cmFjdGVkIHdpdGggYC5kYXRhKClgIG9yIGAuZ2V0KDxmaWVsZD4pYCB0byBnZXQgYVxuICogc3BlY2lmaWMgZmllbGQuXG4gKlxuICogQSBgUXVlcnlEb2N1bWVudFNuYXBzaG90YCBvZmZlcnMgdGhlIHNhbWUgQVBJIHN1cmZhY2UgYXMgYVxuICogYERvY3VtZW50U25hcHNob3RgLiBTaW5jZSBxdWVyeSByZXN1bHRzIGNvbnRhaW4gb25seSBleGlzdGluZyBkb2N1bWVudHMsIHRoZVxuICogYGV4aXN0c2AgcHJvcGVydHkgd2lsbCBhbHdheXMgYmUgdHJ1ZSBhbmQgYGRhdGEoKWAgd2lsbCBuZXZlciByZXR1cm5cbiAqICd1bmRlZmluZWQnLlxuICovIGNsYXNzIHdoIGV4dGVuZHMgX2gge1xuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyBhbGwgZmllbGRzIGluIHRoZSBkb2N1bWVudCBhcyBhbiBgT2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEJ5IGRlZmF1bHQsIGBzZXJ2ZXJUaW1lc3RhbXAoKWAgdmFsdWVzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW5cbiAgICAgKiBzZXQgdG8gdGhlaXIgZmluYWwgdmFsdWUgd2lsbCBiZSByZXR1cm5lZCBhcyBgbnVsbGAuIFlvdSBjYW4gb3ZlcnJpZGVcbiAgICAgKiB0aGlzIGJ5IHBhc3NpbmcgYW4gb3B0aW9ucyBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9wdGlvbnMgb2JqZWN0IHRvIGNvbmZpZ3VyZSBob3cgZGF0YSBpcyByZXRyaWV2ZWQgZnJvbVxuICAgICAqIHRoZSBzbmFwc2hvdCAoZm9yIGV4YW1wbGUgdGhlIGRlc2lyZWQgYmVoYXZpb3IgZm9yIHNlcnZlciB0aW1lc3RhbXBzIHRoYXRcbiAgICAgKiBoYXZlIG5vdCB5ZXQgYmVlbiBzZXQgdG8gdGhlaXIgZmluYWwgdmFsdWUpLlxuICAgICAqIEByZXR1cm5zIEFuIGBPYmplY3RgIGNvbnRhaW5pbmcgYWxsIGZpZWxkcyBpbiB0aGUgZG9jdW1lbnQuXG4gICAgICovXG4gICAgZGF0YSh0ID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmRhdGEodCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgYFF1ZXJ5U25hcHNob3RgIGNvbnRhaW5zIHplcm8gb3IgbW9yZSBgRG9jdW1lbnRTbmFwc2hvdGAgb2JqZWN0c1xuICogcmVwcmVzZW50aW5nIHRoZSByZXN1bHRzIG9mIGEgcXVlcnkuIFRoZSBkb2N1bWVudHMgY2FuIGJlIGFjY2Vzc2VkIGFzIGFuXG4gKiBhcnJheSB2aWEgdGhlIGBkb2NzYCBwcm9wZXJ0eSBvciBlbnVtZXJhdGVkIHVzaW5nIHRoZSBgZm9yRWFjaGAgbWV0aG9kLiBUaGVcbiAqIG51bWJlciBvZiBkb2N1bWVudHMgY2FuIGJlIGRldGVybWluZWQgdmlhIHRoZSBgZW1wdHlgIGFuZCBgc2l6ZWBcbiAqIHByb3BlcnRpZXMuXG4gKi8gY2xhc3MgbWgge1xuICAgIC8qKiBAaGlkZWNvbnN0cnVjdG9yICovXG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgcykge1xuICAgICAgICB0aGlzLl9maXJlc3RvcmUgPSB0LCB0aGlzLl91c2VyRGF0YVdyaXRlciA9IGUsIHRoaXMuX3NuYXBzaG90ID0gcywgdGhpcy5tZXRhZGF0YSA9IG5ldyBkaChzLmhhc1BlbmRpbmdXcml0ZXMsIHMuZnJvbUNhY2hlKSwgXG4gICAgICAgIHRoaXMucXVlcnkgPSBuO1xuICAgIH1cbiAgICAvKiogQW4gYXJyYXkgb2YgYWxsIHRoZSBkb2N1bWVudHMgaW4gdGhlIGBRdWVyeVNuYXBzaG90YC4gKi8gICAgZ2V0IGRvY3MoKSB7XG4gICAgICAgIGNvbnN0IHQgPSBbXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9yRWFjaCgoZSA9PiB0LnB1c2goZSkpKSwgdDtcbiAgICB9XG4gICAgLyoqIFRoZSBudW1iZXIgb2YgZG9jdW1lbnRzIGluIHRoZSBgUXVlcnlTbmFwc2hvdGAuICovICAgIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc25hcHNob3QuZG9jcy5zaXplO1xuICAgIH1cbiAgICAvKiogVHJ1ZSBpZiB0aGVyZSBhcmUgbm8gZG9jdW1lbnRzIGluIHRoZSBgUXVlcnlTbmFwc2hvdGAuICovICAgIGdldCBlbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIDAgPT09IHRoaXMuc2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW51bWVyYXRlcyBhbGwgb2YgdGhlIGRvY3VtZW50cyBpbiB0aGUgYFF1ZXJ5U25hcHNob3RgLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNhbGxiYWNrIC0gQSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2l0aCBhIGBRdWVyeURvY3VtZW50U25hcHNob3RgIGZvclxuICAgICAqIGVhY2ggZG9jdW1lbnQgaW4gdGhlIHNuYXBzaG90LlxuICAgICAqIEBwYXJhbSB0aGlzQXJnIC0gVGhlIGB0aGlzYCBiaW5kaW5nIGZvciB0aGUgY2FsbGJhY2suXG4gICAgICovICAgIGZvckVhY2godCwgZSkge1xuICAgICAgICB0aGlzLl9zbmFwc2hvdC5kb2NzLmZvckVhY2goKG4gPT4ge1xuICAgICAgICAgICAgdC5jYWxsKGUsIG5ldyB3aCh0aGlzLl9maXJlc3RvcmUsIHRoaXMuX3VzZXJEYXRhV3JpdGVyLCBuLmtleSwgbiwgbmV3IGRoKHRoaXMuX3NuYXBzaG90Lm11dGF0ZWRLZXlzLmhhcyhuLmtleSksIHRoaXMuX3NuYXBzaG90LmZyb21DYWNoZSksIHRoaXMucXVlcnkuY29udmVydGVyKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgZG9jdW1lbnRzIGNoYW5nZXMgc2luY2UgdGhlIGxhc3Qgc25hcHNob3QuIElmIHRoaXNcbiAgICAgKiBpcyB0aGUgZmlyc3Qgc25hcHNob3QsIGFsbCBkb2N1bWVudHMgd2lsbCBiZSBpbiB0aGUgbGlzdCBhcyAnYWRkZWQnXG4gICAgICogY2hhbmdlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gYFNuYXBzaG90TGlzdGVuT3B0aW9uc2AgdGhhdCBjb250cm9sIHdoZXRoZXIgbWV0YWRhdGEtb25seVxuICAgICAqIGNoYW5nZXMgKGkuZS4gb25seSBgRG9jdW1lbnRTbmFwc2hvdC5tZXRhZGF0YWAgY2hhbmdlZCkgc2hvdWxkIHRyaWdnZXJcbiAgICAgKiBzbmFwc2hvdCBldmVudHMuXG4gICAgICovICAgIGRvY0NoYW5nZXModCA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGUgPSAhIXQuaW5jbHVkZU1ldGFkYXRhQ2hhbmdlcztcbiAgICAgICAgaWYgKGUgJiYgdGhpcy5fc25hcHNob3QuZXhjbHVkZXNNZXRhZGF0YUNoYW5nZXMpIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgXCJUbyBpbmNsdWRlIG1ldGFkYXRhIGNoYW5nZXMgd2l0aCB5b3VyIGRvY3VtZW50IGNoYW5nZXMsIHlvdSBtdXN0IGFsc28gcGFzcyB7IGluY2x1ZGVNZXRhZGF0YUNoYW5nZXM6dHJ1ZSB9IHRvIG9uU25hcHNob3QoKS5cIik7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWNoZWRDaGFuZ2VzICYmIHRoaXMuX2NhY2hlZENoYW5nZXNJbmNsdWRlTWV0YWRhdGFDaGFuZ2VzID09PSBlIHx8ICh0aGlzLl9jYWNoZWRDaGFuZ2VzID0gXG4gICAgICAgIC8qKiBDYWxjdWxhdGVzIHRoZSBhcnJheSBvZiBgRG9jdW1lbnRDaGFuZ2VgcyBmb3IgYSBnaXZlbiBgVmlld1NuYXBzaG90YC4gKi9cbiAgICAgICAgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgaWYgKHQuX3NuYXBzaG90Lm9sZERvY3MuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGUgPSAwO1xuICAgICAgICAgICAgICAgIHJldHVybiB0Ll9zbmFwc2hvdC5kb2NDaGFuZ2VzLm1hcCgobiA9PiAoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImFkZGVkXCIsXG4gICAgICAgICAgICAgICAgICAgIGRvYzogbmV3IHdoKHQuX2ZpcmVzdG9yZSwgdC5fdXNlckRhdGFXcml0ZXIsIG4uZG9jLmtleSwgbi5kb2MsIG5ldyBkaCh0Ll9zbmFwc2hvdC5tdXRhdGVkS2V5cy5oYXMobi5kb2Mua2V5KSwgdC5fc25hcHNob3QuZnJvbUNhY2hlKSwgdC5xdWVyeS5jb252ZXJ0ZXIpLFxuICAgICAgICAgICAgICAgICAgICBvbGRJbmRleDogLTEsXG4gICAgICAgICAgICAgICAgICAgIG5ld0luZGV4OiBlKytcbiAgICAgICAgICAgICAgICB9KSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIEEgYERvY3VtZW50U2V0YCB0aGF0IGlzIHVwZGF0ZWQgaW5jcmVtZW50YWxseSBhcyBjaGFuZ2VzIGFyZSBhcHBsaWVkIHRvIHVzZVxuICAgICAgICAgICAgICAgIC8vIHRvIGxvb2t1cCB0aGUgaW5kZXggb2YgYSBkb2N1bWVudC5cbiAgICAgICAgICAgICAgICBsZXQgbiA9IHQuX3NuYXBzaG90Lm9sZERvY3M7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQuX3NuYXBzaG90LmRvY0NoYW5nZXMuZmlsdGVyKCh0ID0+IGUgfHwgMyAvKiBNZXRhZGF0YSAqLyAhPT0gdC50eXBlKSkubWFwKChlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IG5ldyB3aCh0Ll9maXJlc3RvcmUsIHQuX3VzZXJEYXRhV3JpdGVyLCBlLmRvYy5rZXksIGUuZG9jLCBuZXcgZGgodC5fc25hcHNob3QubXV0YXRlZEtleXMuaGFzKGUuZG9jLmtleSksIHQuX3NuYXBzaG90LmZyb21DYWNoZSksIHQucXVlcnkuY29udmVydGVyKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSAtMSwgciA9IC0xO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBBZGRlZCAqLyAhPT0gZS50eXBlICYmIChpID0gbi5pbmRleE9mKGUuZG9jLmtleSksIG4gPSBuLmRlbGV0ZShlLmRvYy5rZXkpKSwgXG4gICAgICAgICAgICAgICAgICAgIDEgLyogUmVtb3ZlZCAqLyAhPT0gZS50eXBlICYmIChuID0gbi5hZGQoZS5kb2MpLCByID0gbi5pbmRleE9mKGUuZG9jLmtleSkpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBnaChlLnR5cGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jOiBzLFxuICAgICAgICAgICAgICAgICAgICAgICAgb2xkSW5kZXg6IGksXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdJbmRleDogclxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSh0aGlzLCBlKSwgdGhpcy5fY2FjaGVkQ2hhbmdlc0luY2x1ZGVNZXRhZGF0YUNoYW5nZXMgPSBlKSwgdGhpcy5fY2FjaGVkQ2hhbmdlcztcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdoKHQpIHtcbiAgICBzd2l0Y2ggKHQpIHtcbiAgICAgIGNhc2UgMCAvKiBBZGRlZCAqLyA6XG4gICAgICAgIHJldHVybiBcImFkZGVkXCI7XG5cbiAgICAgIGNhc2UgMiAvKiBNb2RpZmllZCAqLyA6XG4gICAgICBjYXNlIDMgLyogTWV0YWRhdGEgKi8gOlxuICAgICAgICByZXR1cm4gXCJtb2RpZmllZFwiO1xuXG4gICAgICBjYXNlIDEgLyogUmVtb3ZlZCAqLyA6XG4gICAgICAgIHJldHVybiBcInJlbW92ZWRcIjtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIEwoKTtcbiAgICB9XG59XG5cbi8vIFRPRE8oZmlyZXN0b3JlZXhwKTogQWRkIHRlc3RzIGZvciBzbmFwc2hvdEVxdWFsIHdpdGggZGlmZmVyZW50IHNuYXBzaG90XG4vLyBtZXRhZGF0YVxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3ZpZGVkIHNuYXBzaG90cyBhcmUgZXF1YWwuXG4gKlxuICogQHBhcmFtIGxlZnQgLSBBIHNuYXBzaG90IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0gcmlnaHQgLSBBIHNuYXBzaG90IHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBzbmFwc2hvdHMgYXJlIGVxdWFsLlxuICovIGZ1bmN0aW9uIHloKHQsIGUpIHtcbiAgICByZXR1cm4gdCBpbnN0YW5jZW9mIF9oICYmIGUgaW5zdGFuY2VvZiBfaCA/IHQuX2ZpcmVzdG9yZSA9PT0gZS5fZmlyZXN0b3JlICYmIHQuX2tleS5pc0VxdWFsKGUuX2tleSkgJiYgKG51bGwgPT09IHQuX2RvY3VtZW50ID8gbnVsbCA9PT0gZS5fZG9jdW1lbnQgOiB0Ll9kb2N1bWVudC5pc0VxdWFsKGUuX2RvY3VtZW50KSkgJiYgdC5fY29udmVydGVyID09PSBlLl9jb252ZXJ0ZXIgOiB0IGluc3RhbmNlb2YgbWggJiYgZSBpbnN0YW5jZW9mIG1oICYmICh0Ll9maXJlc3RvcmUgPT09IGUuX2ZpcmVzdG9yZSAmJiBmYyh0LnF1ZXJ5LCBlLnF1ZXJ5KSAmJiB0Lm1ldGFkYXRhLmlzRXF1YWwoZS5tZXRhZGF0YSkgJiYgdC5fc25hcHNob3QuaXNFcXVhbChlLl9zbmFwc2hvdCkpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBmdW5jdGlvbiBwaCh0KSB7XG4gICAgaWYgKHhlKHQpICYmIDAgPT09IHQuZXhwbGljaXRPcmRlckJ5Lmxlbmd0aCkgdGhyb3cgbmV3IFEoRy5VTklNUExFTUVOVEVELCBcImxpbWl0VG9MYXN0KCkgcXVlcmllcyByZXF1aXJlIHNwZWNpZnlpbmcgYXQgbGVhc3Qgb25lIG9yZGVyQnkoKSBjbGF1c2VcIik7XG59XG5cbi8qKlxuICogQSBgUXVlcnlDb25zdHJhaW50YCBpcyB1c2VkIHRvIG5hcnJvdyB0aGUgc2V0IG9mIGRvY3VtZW50cyByZXR1cm5lZCBieSBhXG4gKiBGaXJlc3RvcmUgcXVlcnkuIGBRdWVyeUNvbnN0cmFpbnRgcyBhcmUgY3JlYXRlZCBieSBpbnZva2luZyB7QGxpbmsgd2hlcmV9LFxuICoge0BsaW5rIG9yZGVyQnl9LCB7QGxpbmsgKHN0YXJ0QXQ6MSl9LCB7QGxpbmsgKHN0YXJ0QWZ0ZXI6MSl9LCB7QGxpbmtcbiAqIGVuZEJlZm9yZToxfSwge0BsaW5rIChlbmRBdDoxKX0sIHtAbGluayBsaW1pdH0gb3Ige0BsaW5rIGxpbWl0VG9MYXN0fSBhbmRcbiAqIGNhbiB0aGVuIGJlIHBhc3NlZCB0byB7QGxpbmsgcXVlcnl9IHRvIGNyZWF0ZSBhIG5ldyBxdWVyeSBpbnN0YW5jZSB0aGF0XG4gKiBhbHNvIGNvbnRhaW5zIHRoaXMgYFF1ZXJ5Q29uc3RyYWludGAuXG4gKi8gY2xhc3MgSWgge31cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGltbXV0YWJsZSBpbnN0YW5jZSBvZiB7QGxpbmsgUXVlcnl9IHRoYXQgaXMgZXh0ZW5kZWQgdG8gYWxzbyBpbmNsdWRlXG4gKiBhZGRpdGlvbmFsIHF1ZXJ5IGNvbnN0cmFpbnRzLlxuICpcbiAqIEBwYXJhbSBxdWVyeSAtIFRoZSB7QGxpbmsgUXVlcnl9IGluc3RhbmNlIHRvIHVzZSBhcyBhIGJhc2UgZm9yIHRoZSBuZXcgY29uc3RyYWludHMuXG4gKiBAcGFyYW0gcXVlcnlDb25zdHJhaW50cyAtIFRoZSBsaXN0IG9mIHtAbGluayBRdWVyeUNvbnN0cmFpbnR9cyB0byBhcHBseS5cbiAqIEB0aHJvd3MgaWYgYW55IG9mIHRoZSBwcm92aWRlZCBxdWVyeSBjb25zdHJhaW50cyBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCB0aGVcbiAqIGV4aXN0aW5nIG9yIG5ldyBjb25zdHJhaW50cy5cbiAqLyBmdW5jdGlvbiBUaCh0LCAuLi5lKSB7XG4gICAgZm9yIChjb25zdCBuIG9mIGUpIHQgPSBuLl9hcHBseSh0KTtcbiAgICByZXR1cm4gdDtcbn1cblxuY2xhc3MgRWggZXh0ZW5kcyBJaCB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbikge1xuICAgICAgICBzdXBlcigpLCB0aGlzLmFjID0gdCwgdGhpcy51YyA9IGUsIHRoaXMuY2MgPSBuLCB0aGlzLnR5cGUgPSBcIndoZXJlXCI7XG4gICAgfVxuICAgIF9hcHBseSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBHYyh0LmZpcmVzdG9yZSksIG4gPSBmdW5jdGlvbih0LCBlLCBuLCBzLCBpLCByLCBvKSB7XG4gICAgICAgICAgICBsZXQgYTtcbiAgICAgICAgICAgIGlmIChpLmlzS2V5RmllbGQoKSkge1xuICAgICAgICAgICAgICAgIGlmIChcImFycmF5LWNvbnRhaW5zXCIgLyogQVJSQVlfQ09OVEFJTlMgKi8gPT09IHIgfHwgXCJhcnJheS1jb250YWlucy1hbnlcIiAvKiBBUlJBWV9DT05UQUlOU19BTlkgKi8gPT09IHIpIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgYEludmFsaWQgUXVlcnkuIFlvdSBjYW4ndCBwZXJmb3JtICcke3J9JyBxdWVyaWVzIG9uIGRvY3VtZW50SWQoKS5gKTtcbiAgICAgICAgICAgICAgICBpZiAoXCJpblwiIC8qIElOICovID09PSByIHx8IFwibm90LWluXCIgLyogTk9UX0lOICovID09PSByKSB7XG4gICAgICAgICAgICAgICAgICAgICRoKG8sIHIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbiBvZiBvKSBlLnB1c2goT2gocywgdCwgbikpO1xuICAgICAgICAgICAgICAgICAgICBhID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlWYWx1ZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBhID0gT2gocywgdCwgbyk7XG4gICAgICAgICAgICB9IGVsc2UgXCJpblwiIC8qIElOICovICE9PSByICYmIFwibm90LWluXCIgLyogTk9UX0lOICovICE9PSByICYmIFwiYXJyYXktY29udGFpbnMtYW55XCIgLyogQVJSQVlfQ09OVEFJTlNfQU5ZICovICE9PSByIHx8ICRoKG8sIHIpLCBcbiAgICAgICAgICAgIGEgPSB0aChuLCBlLCBvLCBcbiAgICAgICAgICAgIC8qIGFsbG93QXJyYXlzPSAqLyBcImluXCIgLyogSU4gKi8gPT09IHIgfHwgXCJub3QtaW5cIiAvKiBOT1RfSU4gKi8gPT09IHIpO1xuICAgICAgICAgICAgY29uc3QgdSA9IF9lLmNyZWF0ZShpLCByLCBhKTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuUygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBrZSh0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IG4gJiYgIW4uaXNFcXVhbChlLmZpZWxkKSkgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBgSW52YWxpZCBxdWVyeS4gQWxsIHdoZXJlIGZpbHRlcnMgd2l0aCBhbiBpbmVxdWFsaXR5ICg8LCA8PSwgIT0sIG5vdC1pbiwgPiwgb3IgPj0pIG11c3QgYmUgb24gdGhlIHNhbWUgZmllbGQuIEJ1dCB5b3UgaGF2ZSBpbmVxdWFsaXR5IGZpbHRlcnMgb24gJyR7bi50b1N0cmluZygpfScgYW5kICcke2UuZmllbGQudG9TdHJpbmcoKX0nYCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBOZSh0KTtcbiAgICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gcyAmJiBGaCh0LCBlLmZpZWxkLCBzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbiA9IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBuIG9mIHQuZmlsdGVycykgaWYgKGUuaW5kZXhPZihuLm9wKSA+PSAwKSByZXR1cm4gbi5vcDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfSh0LCBcbiAgICAgICAgICAgICAgICAvKipcbiAqIEdpdmVuIGFuIG9wZXJhdG9yLCByZXR1cm5zIHRoZSBzZXQgb2Ygb3BlcmF0b3JzIHRoYXQgY2Fubm90IGJlIHVzZWQgd2l0aCBpdC5cbiAqXG4gKiBPcGVyYXRvcnMgaW4gYSBxdWVyeSBtdXN0IGFkaGVyZSB0byB0aGUgZm9sbG93aW5nIHNldCBvZiBydWxlczpcbiAqIDEuIE9ubHkgb25lIGFycmF5IG9wZXJhdG9yIGlzIGFsbG93ZWQuXG4gKiAyLiBPbmx5IG9uZSBkaXNqdW5jdGl2ZSBvcGVyYXRvciBpcyBhbGxvd2VkLlxuICogMy4gYE5PVF9FUVVBTGAgY2Fubm90IGJlIHVzZWQgd2l0aCBhbm90aGVyIGBOT1RfRVFVQUxgIG9wZXJhdG9yLlxuICogNC4gYE5PVF9JTmAgY2Fubm90IGJlIHVzZWQgd2l0aCBhcnJheSwgZGlzanVuY3RpdmUsIG9yIGBOT1RfRVFVQUxgIG9wZXJhdG9ycy5cbiAqXG4gKiBBcnJheSBvcGVyYXRvcnM6IGBBUlJBWV9DT05UQUlOU2AsIGBBUlJBWV9DT05UQUlOU19BTllgXG4gKiBEaXNqdW5jdGl2ZSBvcGVyYXRvcnM6IGBJTmAsIGBBUlJBWV9DT05UQUlOU19BTllgLCBgTk9UX0lOYFxuICovXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiIT1cIiAvKiBOT1RfRVFVQUwgKi8gOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgXCIhPVwiIC8qIE5PVF9FUVVBTCAqLyAsIFwibm90LWluXCIgLyogTk9UX0lOICovIF07XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYXJyYXktY29udGFpbnNcIiAvKiBBUlJBWV9DT05UQUlOUyAqLyA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWyBcImFycmF5LWNvbnRhaW5zXCIgLyogQVJSQVlfQ09OVEFJTlMgKi8gLCBcImFycmF5LWNvbnRhaW5zLWFueVwiIC8qIEFSUkFZX0NPTlRBSU5TX0FOWSAqLyAsIFwibm90LWluXCIgLyogTk9UX0lOICovIF07XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiaW5cIiAvKiBJTiAqLyA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWyBcImFycmF5LWNvbnRhaW5zLWFueVwiIC8qIEFSUkFZX0NPTlRBSU5TX0FOWSAqLyAsIFwiaW5cIiAvKiBJTiAqLyAsIFwibm90LWluXCIgLyogTk9UX0lOICovIF07XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYXJyYXktY29udGFpbnMtYW55XCIgLyogQVJSQVlfQ09OVEFJTlNfQU5ZICovIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbIFwiYXJyYXktY29udGFpbnNcIiAvKiBBUlJBWV9DT05UQUlOUyAqLyAsIFwiYXJyYXktY29udGFpbnMtYW55XCIgLyogQVJSQVlfQ09OVEFJTlNfQU5ZICovICwgXCJpblwiIC8qIElOICovICwgXCJub3QtaW5cIiAvKiBOT1RfSU4gKi8gXTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJub3QtaW5cIiAvKiBOT1RfSU4gKi8gOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgXCJhcnJheS1jb250YWluc1wiIC8qIEFSUkFZX0NPTlRBSU5TICovICwgXCJhcnJheS1jb250YWlucy1hbnlcIiAvKiBBUlJBWV9DT05UQUlOU19BTlkgKi8gLCBcImluXCIgLyogSU4gKi8gLCBcIm5vdC1pblwiIC8qIE5PVF9JTiAqLyAsIFwiIT1cIiAvKiBOT1RfRVFVQUwgKi8gXTtcblxuICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KGUub3ApKTtcbiAgICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gbikgXG4gICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIHdoZW4gaXQncyBhIGR1cGxpY2F0ZSBvcCB0byBnaXZlIGEgc2xpZ2h0bHkgY2xlYXJlciBlcnJvciBtZXNzYWdlLlxuICAgICAgICAgICAgICAgIHRocm93IG4gPT09IGUub3AgPyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIGBJbnZhbGlkIHF1ZXJ5LiBZb3UgY2Fubm90IHVzZSBtb3JlIHRoYW4gb25lICcke2Uub3AudG9TdHJpbmcoKX0nIGZpbHRlci5gKSA6IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgYEludmFsaWQgcXVlcnkuIFlvdSBjYW5ub3QgdXNlICcke2Uub3AudG9TdHJpbmcoKX0nIGZpbHRlcnMgd2l0aCAnJHtuLnRvU3RyaW5nKCl9JyBmaWx0ZXJzLmApO1xuICAgICAgICAgICAgfSh0LCB1KSwgdTtcbiAgICAgICAgfSh0Ll9xdWVyeSwgXCJ3aGVyZVwiLCBlLCB0LmZpcmVzdG9yZS5fZGF0YWJhc2VJZCwgdGhpcy5hYywgdGhpcy51YywgdGhpcy5jYyk7XG4gICAgICAgIHJldHVybiBuZXcgb2ModC5maXJlc3RvcmUsIHQuY29udmVydGVyLCBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdC5maWx0ZXJzLmNvbmNhdChbIGUgXSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHZlKHQucGF0aCwgdC5jb2xsZWN0aW9uR3JvdXAsIHQuZXhwbGljaXRPcmRlckJ5LnNsaWNlKCksIG4sIHQubGltaXQsIHQubGltaXRUeXBlLCB0LnN0YXJ0QXQsIHQuZW5kQXQpO1xuICAgICAgICB9KHQuX3F1ZXJ5LCBuKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgUXVlcnlDb25zdHJhaW50fSB0aGF0IGVuZm9yY2VzIHRoYXQgZG9jdW1lbnRzIG11c3QgY29udGFpbiB0aGVcbiAqIHNwZWNpZmllZCBmaWVsZCBhbmQgdGhhdCB0aGUgdmFsdWUgc2hvdWxkIHNhdGlzZnkgdGhlIHJlbGF0aW9uIGNvbnN0cmFpbnRcbiAqIHByb3ZpZGVkLlxuICpcbiAqIEBwYXJhbSBmaWVsZFBhdGggLSBUaGUgcGF0aCB0byBjb21wYXJlXG4gKiBAcGFyYW0gb3BTdHIgLSBUaGUgb3BlcmF0aW9uIHN0cmluZyAoZS5nIFwiJmx0O1wiLCBcIiZsdDs9XCIsIFwiPT1cIiwgXCImbHQ7XCIsXG4gKiAgIFwiJmx0Oz1cIiwgXCIhPVwiKS5cbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSBmb3IgY29tcGFyaXNvblxuICogQHJldHVybnMgVGhlIGNyZWF0ZWQge0BsaW5rIFF1ZXJ5fS5cbiAqLyBmdW5jdGlvbiBBaCh0LCBlLCBuKSB7XG4gICAgY29uc3QgcyA9IGUsIGkgPSBmaChcIndoZXJlXCIsIHQpO1xuICAgIHJldHVybiBuZXcgRWgoaSwgcywgbik7XG59XG5cbmNsYXNzIFJoIGV4dGVuZHMgSWgge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgc3VwZXIoKSwgdGhpcy5hYyA9IHQsIHRoaXMuaGMgPSBlLCB0aGlzLnR5cGUgPSBcIm9yZGVyQnlcIjtcbiAgICB9XG4gICAgX2FwcGx5KHQpIHtcbiAgICAgICAgY29uc3QgZSA9IGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgICAgIGlmIChudWxsICE9PSB0LnN0YXJ0QXQpIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgXCJJbnZhbGlkIHF1ZXJ5LiBZb3UgbXVzdCBub3QgY2FsbCBzdGFydEF0KCkgb3Igc3RhcnRBZnRlcigpIGJlZm9yZSBjYWxsaW5nIG9yZGVyQnkoKS5cIik7XG4gICAgICAgICAgICBpZiAobnVsbCAhPT0gdC5lbmRBdCkgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBcIkludmFsaWQgcXVlcnkuIFlvdSBtdXN0IG5vdCBjYWxsIGVuZEF0KCkgb3IgZW5kQmVmb3JlKCkgYmVmb3JlIGNhbGxpbmcgb3JkZXJCeSgpLlwiKTtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBuZXcgUmUoZSwgbik7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgICAgIGlmIChudWxsID09PSBOZSh0KSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBvcmRlciBieS4gSXQgbXVzdCBtYXRjaCBhbnkgaW5lcXVhbGl0eS5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IGtlKHQpO1xuICAgICAgICAgICAgICAgICAgICBudWxsICE9PSBuICYmIEZoKHQsIG4sIGUuZmllbGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0odCwgcyksIHM7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gKiBDcmVhdGUgYSBgQm91bmRgIGZyb20gYSBxdWVyeSBhbmQgYSBkb2N1bWVudC5cbiAqXG4gKiBOb3RlIHRoYXQgdGhlIGBCb3VuZGAgd2lsbCBhbHdheXMgaW5jbHVkZSB0aGUga2V5IG9mIHRoZSBkb2N1bWVudFxuICogYW5kIHNvIG9ubHkgdGhlIHByb3ZpZGVkIGRvY3VtZW50IHdpbGwgY29tcGFyZSBlcXVhbCB0byB0aGUgcmV0dXJuZWRcbiAqIHBvc2l0aW9uLlxuICpcbiAqIFdpbGwgdGhyb3cgaWYgdGhlIGRvY3VtZW50IGRvZXMgbm90IGNvbnRhaW4gYWxsIGZpZWxkcyBvZiB0aGUgb3JkZXIgYnlcbiAqIG9mIHRoZSBxdWVyeSBvciBpZiBhbnkgb2YgdGhlIGZpZWxkcyBpbiB0aGUgb3JkZXIgYnkgYXJlIGFuIHVuY29tbWl0dGVkXG4gKiBzZXJ2ZXIgdGltZXN0YW1wLlxuICovICh0Ll9xdWVyeSwgdGhpcy5hYywgdGhpcy5oYyk7XG4gICAgICAgIHJldHVybiBuZXcgb2ModC5maXJlc3RvcmUsIHQuY29udmVydGVyLCBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICAvLyBUT0RPKGRpbW9uZCk6IHZhbGlkYXRlIHRoYXQgb3JkZXJCeSBkb2VzIG5vdCBsaXN0IHRoZSBzYW1lIGtleSB0d2ljZS5cbiAgICAgICAgICAgIGNvbnN0IG4gPSB0LmV4cGxpY2l0T3JkZXJCeS5jb25jYXQoWyBlIF0pO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyB2ZSh0LnBhdGgsIHQuY29sbGVjdGlvbkdyb3VwLCBuLCB0LmZpbHRlcnMuc2xpY2UoKSwgdC5saW1pdCwgdC5saW1pdFR5cGUsIHQuc3RhcnRBdCwgdC5lbmRBdCk7XG4gICAgICAgIH0odC5fcXVlcnksIGUpKTtcbiAgICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHtAbGluayBRdWVyeUNvbnN0cmFpbnR9IHRoYXQgc29ydHMgdGhlIHF1ZXJ5IHJlc3VsdCBieSB0aGVcbiAqIHNwZWNpZmllZCBmaWVsZCwgb3B0aW9uYWxseSBpbiBkZXNjZW5kaW5nIG9yZGVyIGluc3RlYWQgb2YgYXNjZW5kaW5nLlxuICpcbiAqIEBwYXJhbSBmaWVsZFBhdGggLSBUaGUgZmllbGQgdG8gc29ydCBieS5cbiAqIEBwYXJhbSBkaXJlY3Rpb25TdHIgLSBPcHRpb25hbCBkaXJlY3Rpb24gdG8gc29ydCBieSAoJ2FzYycgb3IgJ2Rlc2MnKS4gSWZcbiAqIG5vdCBzcGVjaWZpZWQsIG9yZGVyIHdpbGwgYmUgYXNjZW5kaW5nLlxuICogQHJldHVybnMgVGhlIGNyZWF0ZWQge0BsaW5rIFF1ZXJ5fS5cbiAqLyBmdW5jdGlvbiBiaCh0LCBlID0gXCJhc2NcIikge1xuICAgIGNvbnN0IG4gPSBlLCBzID0gZmgoXCJvcmRlckJ5XCIsIHQpO1xuICAgIHJldHVybiBuZXcgUmgocywgbik7XG59XG5cbmNsYXNzIFBoIGV4dGVuZHMgSWgge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgc3VwZXIoKSwgdGhpcy50eXBlID0gdCwgdGhpcy5sYyA9IGUsIHRoaXMuZmMgPSBuO1xuICAgIH1cbiAgICBfYXBwbHkodCkge1xuICAgICAgICByZXR1cm4gbmV3IG9jKHQuZmlyZXN0b3JlLCB0LmNvbnZlcnRlciwgRmUodC5fcXVlcnksIHRoaXMubGMsIHRoaXMuZmMpKTtcbiAgICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHtAbGluayBRdWVyeUNvbnN0cmFpbnR9IHRoYXQgb25seSByZXR1cm5zIHRoZSBmaXJzdCBtYXRjaGluZyBkb2N1bWVudHMuXG4gKlxuICogQHBhcmFtIGxpbWl0IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRvIHJldHVybi5cbiAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIHtAbGluayBRdWVyeX0uXG4gKi8gZnVuY3Rpb24gVmgodCkge1xuICAgIHJldHVybiBlYyhcImxpbWl0XCIsIHQpLCBuZXcgUGgoXCJsaW1pdFwiLCB0LCBcIkZcIiAvKiBGaXJzdCAqLyk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHtAbGluayBRdWVyeUNvbnN0cmFpbnR9IHRoYXQgb25seSByZXR1cm5zIHRoZSBsYXN0IG1hdGNoaW5nIGRvY3VtZW50cy5cbiAqXG4gKiBZb3UgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBgb3JkZXJCeWAgY2xhdXNlIGZvciBgbGltaXRUb0xhc3RgIHF1ZXJpZXMsXG4gKiBvdGhlcndpc2UgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGR1cmluZyBleGVjdXRpb24uXG4gKlxuICogQHBhcmFtIGxpbWl0IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRvIHJldHVybi5cbiAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIHtAbGluayBRdWVyeX0uXG4gKi8gZnVuY3Rpb24gdmgodCkge1xuICAgIHJldHVybiBlYyhcImxpbWl0VG9MYXN0XCIsIHQpLCBuZXcgUGgoXCJsaW1pdFRvTGFzdFwiLCB0LCBcIkxcIiAvKiBMYXN0ICovKTtcbn1cblxuY2xhc3MgU2ggZXh0ZW5kcyBJaCB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbikge1xuICAgICAgICBzdXBlcigpLCB0aGlzLnR5cGUgPSB0LCB0aGlzLmRjID0gZSwgdGhpcy5fYyA9IG47XG4gICAgfVxuICAgIF9hcHBseSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBNaCh0LCB0aGlzLnR5cGUsIHRoaXMuZGMsIHRoaXMuX2MpO1xuICAgICAgICByZXR1cm4gbmV3IG9jKHQuZmlyZXN0b3JlLCB0LmNvbnZlcnRlciwgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyB2ZSh0LnBhdGgsIHQuY29sbGVjdGlvbkdyb3VwLCB0LmV4cGxpY2l0T3JkZXJCeS5zbGljZSgpLCB0LmZpbHRlcnMuc2xpY2UoKSwgdC5saW1pdCwgdC5saW1pdFR5cGUsIGUsIHQuZW5kQXQpO1xuICAgICAgICB9KHQuX3F1ZXJ5LCBlKSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBEaCguLi50KSB7XG4gICAgcmV0dXJuIG5ldyBTaChcInN0YXJ0QXRcIiwgdCwgXG4gICAgLyppbmNsdXNpdmU9Ki8gITApO1xufVxuXG5mdW5jdGlvbiBDaCguLi50KSB7XG4gICAgcmV0dXJuIG5ldyBTaChcInN0YXJ0QWZ0ZXJcIiwgdCwgXG4gICAgLyppbmNsdXNpdmU9Ki8gITEpO1xufVxuXG5jbGFzcyB4aCBleHRlbmRzIEloIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMudHlwZSA9IHQsIHRoaXMuZGMgPSBlLCB0aGlzLl9jID0gbjtcbiAgICB9XG4gICAgX2FwcGx5KHQpIHtcbiAgICAgICAgY29uc3QgZSA9IE1oKHQsIHRoaXMudHlwZSwgdGhpcy5kYywgdGhpcy5fYyk7XG4gICAgICAgIHJldHVybiBuZXcgb2ModC5maXJlc3RvcmUsIHQuY29udmVydGVyLCBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHZlKHQucGF0aCwgdC5jb2xsZWN0aW9uR3JvdXAsIHQuZXhwbGljaXRPcmRlckJ5LnNsaWNlKCksIHQuZmlsdGVycy5zbGljZSgpLCB0LmxpbWl0LCB0LmxpbWl0VHlwZSwgdC5zdGFydEF0LCBlKTtcbiAgICAgICAgfSh0Ll9xdWVyeSwgZSkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gTmgoLi4udCkge1xuICAgIHJldHVybiBuZXcgeGgoXCJlbmRCZWZvcmVcIiwgdCwgXG4gICAgLyppbmNsdXNpdmU9Ki8gITEpO1xufVxuXG5mdW5jdGlvbiBraCguLi50KSB7XG4gICAgcmV0dXJuIG5ldyB4aChcImVuZEF0XCIsIHQsIC8qaW5jbHVzaXZlPSovICEwKTtcbn1cblxuLyoqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBib3VuZCBmcm9tIGEgZG9jdW1lbnQgb3IgZmllbGRzICovIGZ1bmN0aW9uIE1oKHQsIGUsIG4sIHMpIHtcbiAgICBpZiAoblswXSA9IGdldE1vZHVsYXJJbnN0YW5jZShuWzBdKSwgblswXSBpbnN0YW5jZW9mIGhoKSByZXR1cm4gZnVuY3Rpb24odCwgZSwgbiwgcywgaSkge1xuICAgICAgICBpZiAoIXMpIHRocm93IG5ldyBRKEcuTk9UX0ZPVU5ELCBgQ2FuJ3QgdXNlIGEgRG9jdW1lbnRTbmFwc2hvdCB0aGF0IGRvZXNuJ3QgZXhpc3QgZm9yICR7bn0oKS5gKTtcbiAgICAgICAgY29uc3QgciA9IFtdO1xuICAgICAgICAvLyBCZWNhdXNlIHBlb3BsZSBleHBlY3QgdG8gY29udGludWUvZW5kIGEgcXVlcnkgYXQgdGhlIGV4YWN0IGRvY3VtZW50XG4gICAgICAgIC8vIHByb3ZpZGVkLCB3ZSBuZWVkIHRvIHVzZSB0aGUgaW1wbGljaXQgc29ydCBvcmRlciByYXRoZXIgdGhhbiB0aGUgZXhwbGljaXRcbiAgICAgICAgLy8gc29ydCBvcmRlciwgYmVjYXVzZSBpdCdzIGd1YXJhbnRlZWQgdG8gY29udGFpbiB0aGUgZG9jdW1lbnQga2V5LiBUaGF0IHdheVxuICAgICAgICAvLyB0aGUgcG9zaXRpb24gYmVjb21lcyB1bmFtYmlndW91cyBhbmQgdGhlIHF1ZXJ5IGNvbnRpbnVlcy9lbmRzIGV4YWN0bHkgYXRcbiAgICAgICAgLy8gdGhlIHByb3ZpZGVkIGRvY3VtZW50LiBXaXRob3V0IHRoZSBrZXkgKGJ5IHVzaW5nIHRoZSBleHBsaWNpdCBzb3J0XG4gICAgICAgIC8vIG9yZGVycyksIG11bHRpcGxlIGRvY3VtZW50cyBjb3VsZCBtYXRjaCB0aGUgcG9zaXRpb24sIHlpZWxkaW5nIGR1cGxpY2F0ZVxuICAgICAgICAvLyByZXN1bHRzLlxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbiBvZiBPZSh0KSkgaWYgKG4uZmllbGQuaXNLZXlGaWVsZCgpKSByLnB1c2goVXQoZSwgcy5rZXkpKTsgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gcy5kYXRhLmZpZWxkKG4uZmllbGQpO1xuICAgICAgICAgICAgaWYgKFJ0KHQpKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsICdJbnZhbGlkIHF1ZXJ5LiBZb3UgYXJlIHRyeWluZyB0byBzdGFydCBvciBlbmQgYSBxdWVyeSB1c2luZyBhIGRvY3VtZW50IGZvciB3aGljaCB0aGUgZmllbGQgXCInICsgbi5maWVsZCArICdcIiBpcyBhbiB1bmNvbW1pdHRlZCBzZXJ2ZXIgdGltZXN0YW1wLiAoU2luY2UgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgaXMgdW5rbm93biwgeW91IGNhbm5vdCBzdGFydC9lbmQgYSBxdWVyeSB3aXRoIGl0LiknKTtcbiAgICAgICAgICAgIGlmIChudWxsID09PSB0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IG4uZmllbGQuY2Fub25pY2FsU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBgSW52YWxpZCBxdWVyeS4gWW91IGFyZSB0cnlpbmcgdG8gc3RhcnQgb3IgZW5kIGEgcXVlcnkgdXNpbmcgYSBkb2N1bWVudCBmb3Igd2hpY2ggdGhlIGZpZWxkICcke3R9JyAodXNlZCBhcyB0aGUgb3JkZXJCeSkgZG9lcyBub3QgZXhpc3QuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByLnB1c2godCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBBZShyLCBpKTtcbiAgICB9XG4gICAgLyoqXG4gKiBDb252ZXJ0cyBhIGxpc3Qgb2YgZmllbGQgdmFsdWVzIHRvIGEgYEJvdW5kYCBmb3IgdGhlIGdpdmVuIHF1ZXJ5LlxuICovICh0Ll9xdWVyeSwgdC5maXJlc3RvcmUuX2RhdGFiYXNlSWQsIGUsIG5bMF0uX2RvY3VtZW50LCBzKTtcbiAgICB7XG4gICAgICAgIGNvbnN0IGkgPSBHYyh0LmZpcmVzdG9yZSk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlLCBuLCBzLCBpLCByKSB7XG4gICAgICAgICAgICAvLyBVc2UgZXhwbGljaXQgb3JkZXIgYnkncyBiZWNhdXNlIGl0IGhhcyB0byBtYXRjaCB0aGUgcXVlcnkgdGhlIHVzZXIgbWFkZVxuICAgICAgICAgICAgY29uc3QgbyA9IHQuZXhwbGljaXRPcmRlckJ5O1xuICAgICAgICAgICAgaWYgKGkubGVuZ3RoID4gby5sZW5ndGgpIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgYFRvbyBtYW55IGFyZ3VtZW50cyBwcm92aWRlZCB0byAke3N9KCkuIFRoZSBudW1iZXIgb2YgYXJndW1lbnRzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2Ygb3JkZXJCeSgpIGNsYXVzZXNgKTtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IHIgPSAwOyByIDwgaS5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHUgPSBpW3JdO1xuICAgICAgICAgICAgICAgIGlmIChvW3JdLmZpZWxkLmlzS2V5RmllbGQoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXCJzdHJpbmdcIiAhPSB0eXBlb2YgdSkgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBgSW52YWxpZCBxdWVyeS4gRXhwZWN0ZWQgYSBzdHJpbmcgZm9yIGRvY3VtZW50IElEIGluICR7c30oKSwgYnV0IGdvdCBhICR7dHlwZW9mIHV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghTWUodCkgJiYgLTEgIT09IHUuaW5kZXhPZihcIi9cIikpIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgYEludmFsaWQgcXVlcnkuIFdoZW4gcXVlcnlpbmcgYSBjb2xsZWN0aW9uIGFuZCBvcmRlcmluZyBieSBkb2N1bWVudElkKCksIHRoZSB2YWx1ZSBwYXNzZWQgdG8gJHtzfSgpIG11c3QgYmUgYSBwbGFpbiBkb2N1bWVudCBJRCwgYnV0ICcke3V9JyBjb250YWlucyBhIHNsYXNoLmApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gdC5wYXRoLmNoaWxkKF90LmZyb21TdHJpbmcodSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXh0LmlzRG9jdW1lbnRLZXkobikpIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgYEludmFsaWQgcXVlcnkuIFdoZW4gcXVlcnlpbmcgYSBjb2xsZWN0aW9uIGdyb3VwIGFuZCBvcmRlcmluZyBieSBkb2N1bWVudElkKCksIHRoZSB2YWx1ZSBwYXNzZWQgdG8gJHtzfSgpIG11c3QgcmVzdWx0IGluIGEgdmFsaWQgZG9jdW1lbnQgcGF0aCwgYnV0ICcke259JyBpcyBub3QgYmVjYXVzZSBpdCBjb250YWlucyBhbiBvZGQgbnVtYmVyIG9mIHNlZ21lbnRzLmApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gbmV3IHh0KG4pO1xuICAgICAgICAgICAgICAgICAgICBhLnB1c2goVXQoZSwgaSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aChuLCBzLCB1KTtcbiAgICAgICAgICAgICAgICAgICAgYS5wdXNoKHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgQWUoYSwgcik7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gKiBQYXJzZXMgdGhlIGdpdmVuIGBkb2N1bWVudElkVmFsdWVgIGludG8gYSBgUmVmZXJlbmNlVmFsdWVgLCB0aHJvd2luZ1xuICogYXBwcm9wcmlhdGUgZXJyb3JzIGlmIHRoZSB2YWx1ZSBpcyBhbnl0aGluZyBvdGhlciB0aGFuIGEgYERvY3VtZW50UmVmZXJlbmNlYFxuICogb3IgYHN0cmluZ2AsIG9yIGlmIHRoZSBzdHJpbmcgaXMgbWFsZm9ybWVkLlxuICovICh0Ll9xdWVyeSwgdC5maXJlc3RvcmUuX2RhdGFiYXNlSWQsIGksIGUsIG4sIHMpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gT2godCwgZSwgbikge1xuICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiAobiA9IGdldE1vZHVsYXJJbnN0YW5jZShuKSkpIHtcbiAgICAgICAgaWYgKFwiXCIgPT09IG4pIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgXCJJbnZhbGlkIHF1ZXJ5LiBXaGVuIHF1ZXJ5aW5nIHdpdGggZG9jdW1lbnRJZCgpLCB5b3UgbXVzdCBwcm92aWRlIGEgdmFsaWQgZG9jdW1lbnQgSUQsIGJ1dCBpdCB3YXMgYW4gZW1wdHkgc3RyaW5nLlwiKTtcbiAgICAgICAgaWYgKCFNZShlKSAmJiAtMSAhPT0gbi5pbmRleE9mKFwiL1wiKSkgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBgSW52YWxpZCBxdWVyeS4gV2hlbiBxdWVyeWluZyBhIGNvbGxlY3Rpb24gYnkgZG9jdW1lbnRJZCgpLCB5b3UgbXVzdCBwcm92aWRlIGEgcGxhaW4gZG9jdW1lbnQgSUQsIGJ1dCAnJHtufScgY29udGFpbnMgYSAnLycgY2hhcmFjdGVyLmApO1xuICAgICAgICBjb25zdCBzID0gZS5wYXRoLmNoaWxkKF90LmZyb21TdHJpbmcobikpO1xuICAgICAgICBpZiAoIXh0LmlzRG9jdW1lbnRLZXkocykpIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgYEludmFsaWQgcXVlcnkuIFdoZW4gcXVlcnlpbmcgYSBjb2xsZWN0aW9uIGdyb3VwIGJ5IGRvY3VtZW50SWQoKSwgdGhlIHZhbHVlIHByb3ZpZGVkIG11c3QgcmVzdWx0IGluIGEgdmFsaWQgZG9jdW1lbnQgcGF0aCwgYnV0ICcke3N9JyBpcyBub3QgYmVjYXVzZSBpdCBoYXMgYW4gb2RkIG51bWJlciBvZiBzZWdtZW50cyAoJHtzLmxlbmd0aH0pLmApO1xuICAgICAgICByZXR1cm4gVXQodCwgbmV3IHh0KHMpKTtcbiAgICB9XG4gICAgaWYgKG4gaW5zdGFuY2VvZiByYykgcmV0dXJuIFV0KHQsIG4uX2tleSk7XG4gICAgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBgSW52YWxpZCBxdWVyeS4gV2hlbiBxdWVyeWluZyB3aXRoIGRvY3VtZW50SWQoKSwgeW91IG11c3QgcHJvdmlkZSBhIHZhbGlkIHN0cmluZyBvciBhIERvY3VtZW50UmVmZXJlbmNlLCBidXQgaXQgd2FzOiAke1p1KG4pfS5gKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhhdCB0aGUgdmFsdWUgcGFzc2VkIGludG8gYSBkaXNqdW5jdGl2ZSBmaWx0ZXIgc2F0aXNmaWVzIGFsbFxuICogYXJyYXkgcmVxdWlyZW1lbnRzLlxuICovIGZ1bmN0aW9uICRoKHQsIGUpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodCkgfHwgMCA9PT0gdC5sZW5ndGgpIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgYEludmFsaWQgUXVlcnkuIEEgbm9uLWVtcHR5IGFycmF5IGlzIHJlcXVpcmVkIGZvciAnJHtlLnRvU3RyaW5nKCl9JyBmaWx0ZXJzLmApO1xuICAgIGlmICh0Lmxlbmd0aCA+IDEwKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIGBJbnZhbGlkIFF1ZXJ5LiAnJHtlLnRvU3RyaW5nKCl9JyBmaWx0ZXJzIHN1cHBvcnQgYSBtYXhpbXVtIG9mIDEwIGVsZW1lbnRzIGluIHRoZSB2YWx1ZSBhcnJheS5gKTtcbn1cblxuZnVuY3Rpb24gRmgodCwgZSwgbikge1xuICAgIGlmICghbi5pc0VxdWFsKGUpKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIGBJbnZhbGlkIHF1ZXJ5LiBZb3UgaGF2ZSBhIHdoZXJlIGZpbHRlciB3aXRoIGFuIGluZXF1YWxpdHkgKDwsIDw9LCAhPSwgbm90LWluLCA+LCBvciA+PSkgb24gZmllbGQgJyR7ZS50b1N0cmluZygpfScgYW5kIHNvIHlvdSBtdXN0IGFsc28gdXNlICcke2UudG9TdHJpbmcoKX0nIGFzIHlvdXIgZmlyc3QgYXJndW1lbnQgdG8gb3JkZXJCeSgpLCBidXQgeW91ciBmaXJzdCBvcmRlckJ5KCkgaXMgb24gZmllbGQgJyR7bi50b1N0cmluZygpfScgaW5zdGVhZC5gKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQ29udmVydHMgRmlyZXN0b3JlJ3MgaW50ZXJuYWwgdHlwZXMgdG8gdGhlIEphdmFTY3JpcHQgdHlwZXMgdGhhdCB3ZSBleHBvc2VcbiAqIHRvIHRoZSB1c2VyLlxuICpcbiAqIEBpbnRlcm5hbFxuICovIGNsYXNzIEJoIHtcbiAgICBjb252ZXJ0VmFsdWUodCwgZSA9IFwibm9uZVwiKSB7XG4gICAgICAgIHN3aXRjaCAoTXQodCkpIHtcbiAgICAgICAgICBjYXNlIDAgLyogTnVsbFZhbHVlICovIDpcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgY2FzZSAxIC8qIEJvb2xlYW5WYWx1ZSAqLyA6XG4gICAgICAgICAgICByZXR1cm4gdC5ib29sZWFuVmFsdWU7XG5cbiAgICAgICAgICBjYXNlIDIgLyogTnVtYmVyVmFsdWUgKi8gOlxuICAgICAgICAgICAgcmV0dXJuIEV0KHQuaW50ZWdlclZhbHVlIHx8IHQuZG91YmxlVmFsdWUpO1xuXG4gICAgICAgICAgY2FzZSAzIC8qIFRpbWVzdGFtcFZhbHVlICovIDpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRUaW1lc3RhbXAodC50aW1lc3RhbXBWYWx1ZSk7XG5cbiAgICAgICAgICBjYXNlIDQgLyogU2VydmVyVGltZXN0YW1wVmFsdWUgKi8gOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydFNlcnZlclRpbWVzdGFtcCh0LCBlKTtcblxuICAgICAgICAgIGNhc2UgNSAvKiBTdHJpbmdWYWx1ZSAqLyA6XG4gICAgICAgICAgICByZXR1cm4gdC5zdHJpbmdWYWx1ZTtcblxuICAgICAgICAgIGNhc2UgNiAvKiBCbG9iVmFsdWUgKi8gOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydEJ5dGVzKEF0KHQuYnl0ZXNWYWx1ZSkpO1xuXG4gICAgICAgICAgY2FzZSA3IC8qIFJlZlZhbHVlICovIDpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRSZWZlcmVuY2UodC5yZWZlcmVuY2VWYWx1ZSk7XG5cbiAgICAgICAgICBjYXNlIDggLyogR2VvUG9pbnRWYWx1ZSAqLyA6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0R2VvUG9pbnQodC5nZW9Qb2ludFZhbHVlKTtcblxuICAgICAgICAgIGNhc2UgOSAvKiBBcnJheVZhbHVlICovIDpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRBcnJheSh0LmFycmF5VmFsdWUsIGUpO1xuXG4gICAgICAgICAgY2FzZSAxMCAvKiBPYmplY3RWYWx1ZSAqLyA6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0T2JqZWN0KHQubWFwVmFsdWUsIGUpO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IEwoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb252ZXJ0T2JqZWN0KHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IHt9O1xuICAgICAgICByZXR1cm4gbHQodC5maWVsZHMsICgodCwgcykgPT4ge1xuICAgICAgICAgICAgblt0XSA9IHRoaXMuY29udmVydFZhbHVlKHMsIGUpO1xuICAgICAgICB9KSksIG47XG4gICAgfVxuICAgIGNvbnZlcnRHZW9Qb2ludCh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgJGMoRXQodC5sYXRpdHVkZSksIEV0KHQubG9uZ2l0dWRlKSk7XG4gICAgfVxuICAgIGNvbnZlcnRBcnJheSh0LCBlKSB7XG4gICAgICAgIHJldHVybiAodC52YWx1ZXMgfHwgW10pLm1hcCgodCA9PiB0aGlzLmNvbnZlcnRWYWx1ZSh0LCBlKSkpO1xuICAgIH1cbiAgICBjb252ZXJ0U2VydmVyVGltZXN0YW1wKHQsIGUpIHtcbiAgICAgICAgc3dpdGNoIChlKSB7XG4gICAgICAgICAgY2FzZSBcInByZXZpb3VzXCI6XG4gICAgICAgICAgICBjb25zdCBuID0gYnQodCk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbCA9PSBuID8gbnVsbCA6IHRoaXMuY29udmVydFZhbHVlKG4sIGUpO1xuXG4gICAgICAgICAgY2FzZSBcImVzdGltYXRlXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0VGltZXN0YW1wKFB0KHQpKTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb252ZXJ0VGltZXN0YW1wKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IFR0KHQpO1xuICAgICAgICByZXR1cm4gbmV3IHV0KGUuc2Vjb25kcywgZS5uYW5vcyk7XG4gICAgfVxuICAgIGNvbnZlcnREb2N1bWVudEtleSh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBfdC5mcm9tU3RyaW5nKHQpO1xuICAgICAgICBxKE9zKG4pKTtcbiAgICAgICAgY29uc3QgcyA9IG5ldyB2dChuLmdldCgxKSwgbi5nZXQoMykpLCBpID0gbmV3IHh0KG4ucG9wRmlyc3QoNSkpO1xuICAgICAgICByZXR1cm4gcy5pc0VxdWFsKGUpIHx8IFxuICAgICAgICAvLyBUT0RPKGIvNjQxMzAyMDIpOiBTb21laG93IHN1cHBvcnQgZm9yZWlnbiByZWZlcmVuY2VzLlxuICAgICAgICAkKGBEb2N1bWVudCAke2l9IGNvbnRhaW5zIGEgZG9jdW1lbnQgcmVmZXJlbmNlIHdpdGhpbiBhIGRpZmZlcmVudCBkYXRhYmFzZSAoJHtzLnByb2plY3RJZH0vJHtzLmRhdGFiYXNlfSkgd2hpY2ggaXMgbm90IHN1cHBvcnRlZC4gSXQgd2lsbCBiZSB0cmVhdGVkIGFzIGEgcmVmZXJlbmNlIGluIHRoZSBjdXJyZW50IGRhdGFiYXNlICgke2UucHJvamVjdElkfS8ke2UuZGF0YWJhc2V9KSBpbnN0ZWFkLmApLCBcbiAgICAgICAgaTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIENvbnZlcnRzIGN1c3RvbSBtb2RlbCBvYmplY3Qgb2YgdHlwZSBUIGludG8gYERvY3VtZW50RGF0YWAgYnkgYXBwbHlpbmcgdGhlXG4gKiBjb252ZXJ0ZXIgaWYgaXQgZXhpc3RzLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIGNvbnZlcnRpbmcgdXNlciBvYmplY3RzIHRvIGBEb2N1bWVudERhdGFgXG4gKiBiZWNhdXNlIHdlIHdhbnQgdG8gcHJvdmlkZSB0aGUgdXNlciB3aXRoIGEgbW9yZSBzcGVjaWZpYyBlcnJvciBtZXNzYWdlIGlmXG4gKiB0aGVpciBgc2V0KClgIG9yIGZhaWxzIGR1ZSB0byBpbnZhbGlkIGRhdGEgb3JpZ2luYXRpbmcgZnJvbSBhIGB0b0ZpcmVzdG9yZSgpYFxuICogY2FsbC5cbiAqLyBmdW5jdGlvbiBMaCh0LCBlLCBuKSB7XG4gICAgbGV0IHM7XG4gICAgLy8gQ2FzdCB0byBgYW55YCBpbiBvcmRlciB0byBzYXRpc2Z5IHRoZSB1bmlvbiB0eXBlIGNvbnN0cmFpbnQgb25cbiAgICAvLyB0b0ZpcmVzdG9yZSgpLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcmV0dXJuIHMgPSB0ID8gbiAmJiAobi5tZXJnZSB8fCBuLm1lcmdlRmllbGRzKSA/IHQudG9GaXJlc3RvcmUoZSwgbikgOiB0LnRvRmlyZXN0b3JlKGUpIDogZSwgXG4gICAgcztcbn1cblxuY2xhc3MgcWggZXh0ZW5kcyBCaCB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICBzdXBlcigpLCB0aGlzLmZpcmVzdG9yZSA9IHQ7XG4gICAgfVxuICAgIGNvbnZlcnRCeXRlcyh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgTWModCk7XG4gICAgfVxuICAgIGNvbnZlcnRSZWZlcmVuY2UodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5jb252ZXJ0RG9jdW1lbnRLZXkodCwgdGhpcy5maXJlc3RvcmUuX2RhdGFiYXNlSWQpO1xuICAgICAgICByZXR1cm4gbmV3IHJjKHRoaXMuZmlyZXN0b3JlLCAvKiBjb252ZXJ0ZXI9ICovIG51bGwsIGUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQSB3cml0ZSBiYXRjaCwgdXNlZCB0byBwZXJmb3JtIG11bHRpcGxlIHdyaXRlcyBhcyBhIHNpbmdsZSBhdG9taWMgdW5pdC5cbiAqXG4gKiBBIGBXcml0ZUJhdGNoYCBvYmplY3QgY2FuIGJlIGFjcXVpcmVkIGJ5IGNhbGxpbmcge0BsaW5rIHdyaXRlQmF0Y2h9LiBJdFxuICogcHJvdmlkZXMgbWV0aG9kcyBmb3IgYWRkaW5nIHdyaXRlcyB0byB0aGUgd3JpdGUgYmF0Y2guIE5vbmUgb2YgdGhlIHdyaXRlc1xuICogd2lsbCBiZSBjb21taXR0ZWQgKG9yIHZpc2libGUgbG9jYWxseSkgdW50aWwge0BsaW5rIFdyaXRlQmF0Y2guY29tbWl0fSBpc1xuICogY2FsbGVkLlxuICovIGNsYXNzIFVoIHtcbiAgICAvKiogQGhpZGVjb25zdHJ1Y3RvciAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5fZmlyZXN0b3JlID0gdCwgdGhpcy5fY29tbWl0SGFuZGxlciA9IGUsIHRoaXMuX211dGF0aW9ucyA9IFtdLCB0aGlzLl9jb21taXR0ZWQgPSAhMSwgXG4gICAgICAgIHRoaXMuX2RhdGFSZWFkZXIgPSBHYyh0KTtcbiAgICB9XG4gICAgc2V0KHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy5fdmVyaWZ5Tm90Q29tbWl0dGVkKCk7XG4gICAgICAgIGNvbnN0IHMgPSBLaCh0LCB0aGlzLl9maXJlc3RvcmUpLCBpID0gTGgocy5jb252ZXJ0ZXIsIGUsIG4pLCByID0gUWModGhpcy5fZGF0YVJlYWRlciwgXCJXcml0ZUJhdGNoLnNldFwiLCBzLl9rZXksIGksIG51bGwgIT09IHMuY29udmVydGVyLCBuKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX211dGF0aW9ucy5wdXNoKHIudG9NdXRhdGlvbihzLl9rZXksIGhuLm5vbmUoKSkpLCB0aGlzO1xuICAgIH1cbiAgICB1cGRhdGUodCwgZSwgbiwgLi4ucykge1xuICAgICAgICB0aGlzLl92ZXJpZnlOb3RDb21taXR0ZWQoKTtcbiAgICAgICAgY29uc3QgaSA9IEtoKHQsIHRoaXMuX2ZpcmVzdG9yZSk7XG4gICAgICAgIC8vIEZvciBDb21wYXQgdHlwZXMsIHdlIGhhdmUgdG8gXCJleHRyYWN0XCIgdGhlIHVuZGVybHlpbmcgdHlwZXMgYmVmb3JlXG4gICAgICAgIC8vIHBlcmZvcm1pbmcgdmFsaWRhdGlvbi5cbiAgICAgICAgICAgICAgICBsZXQgcjtcbiAgICAgICAgcmV0dXJuIHIgPSBcInN0cmluZ1wiID09IHR5cGVvZiAoZSA9IGdldE1vZHVsYXJJbnN0YW5jZShlKSkgfHwgZSBpbnN0YW5jZW9mIE5jID8gWmModGhpcy5fZGF0YVJlYWRlciwgXCJXcml0ZUJhdGNoLnVwZGF0ZVwiLCBpLl9rZXksIGUsIG4sIHMpIDogWGModGhpcy5fZGF0YVJlYWRlciwgXCJXcml0ZUJhdGNoLnVwZGF0ZVwiLCBpLl9rZXksIGUpLCBcbiAgICAgICAgdGhpcy5fbXV0YXRpb25zLnB1c2goci50b011dGF0aW9uKGkuX2tleSwgaG4uZXhpc3RzKCEwKSkpLCB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxldGVzIHRoZSBkb2N1bWVudCByZWZlcnJlZCB0byBieSB0aGUgcHJvdmlkZWQge0BsaW5rIERvY3VtZW50UmVmZXJlbmNlfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkb2N1bWVudFJlZiAtIEEgcmVmZXJlbmNlIHRvIHRoZSBkb2N1bWVudCB0byBiZSBkZWxldGVkLlxuICAgICAqIEByZXR1cm5zIFRoaXMgYFdyaXRlQmF0Y2hgIGluc3RhbmNlLiBVc2VkIGZvciBjaGFpbmluZyBtZXRob2QgY2FsbHMuXG4gICAgICovICAgIGRlbGV0ZSh0KSB7XG4gICAgICAgIHRoaXMuX3ZlcmlmeU5vdENvbW1pdHRlZCgpO1xuICAgICAgICBjb25zdCBlID0gS2godCwgdGhpcy5fZmlyZXN0b3JlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX211dGF0aW9ucyA9IHRoaXMuX211dGF0aW9ucy5jb25jYXQobmV3IEFuKGUuX2tleSwgaG4ubm9uZSgpKSksIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbW1pdHMgYWxsIG9mIHRoZSB3cml0ZXMgaW4gdGhpcyB3cml0ZSBiYXRjaCBhcyBhIHNpbmdsZSBhdG9taWMgdW5pdC5cbiAgICAgKlxuICAgICAqIFRoZSByZXN1bHQgb2YgdGhlc2Ugd3JpdGVzIHdpbGwgb25seSBiZSByZWZsZWN0ZWQgaW4gZG9jdW1lbnQgcmVhZHMgdGhhdFxuICAgICAqIG9jY3VyIGFmdGVyIHRoZSByZXR1cm5lZCBwcm9taXNlIHJlc29sdmVzLiBJZiB0aGUgY2xpZW50IGlzIG9mZmxpbmUsIHRoZVxuICAgICAqIHdyaXRlIGZhaWxzLiBJZiB5b3Ugd291bGQgbGlrZSB0byBzZWUgbG9jYWwgbW9kaWZpY2F0aW9ucyBvciBidWZmZXIgd3JpdGVzXG4gICAgICogdW50aWwgdGhlIGNsaWVudCBpcyBvbmxpbmUsIHVzZSB0aGUgZnVsbCBGaXJlc3RvcmUgU0RLLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBgUHJvbWlzZWAgcmVzb2x2ZWQgb25jZSBhbGwgb2YgdGhlIHdyaXRlcyBpbiB0aGUgYmF0Y2ggaGF2ZSBiZWVuXG4gICAgICogc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4gdG8gdGhlIGJhY2tlbmQgYXMgYW4gYXRvbWljIHVuaXQgKG5vdGUgdGhhdCBpdCB3b24ndFxuICAgICAqIHJlc29sdmUgd2hpbGUgeW91J3JlIG9mZmxpbmUpLlxuICAgICAqLyAgICBjb21taXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92ZXJpZnlOb3RDb21taXR0ZWQoKSwgdGhpcy5fY29tbWl0dGVkID0gITAsIHRoaXMuX211dGF0aW9ucy5sZW5ndGggPiAwID8gdGhpcy5fY29tbWl0SGFuZGxlcih0aGlzLl9tdXRhdGlvbnMpIDogUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIF92ZXJpZnlOb3RDb21taXR0ZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jb21taXR0ZWQpIHRocm93IG5ldyBRKEcuRkFJTEVEX1BSRUNPTkRJVElPTiwgXCJBIHdyaXRlIGJhdGNoIGNhbiBubyBsb25nZXIgYmUgdXNlZCBhZnRlciBjb21taXQoKSBoYXMgYmVlbiBjYWxsZWQuXCIpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gS2godCwgZSkge1xuICAgIGlmICgodCA9IGdldE1vZHVsYXJJbnN0YW5jZSh0KSkuZmlyZXN0b3JlICE9PSBlKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIFwiUHJvdmlkZWQgZG9jdW1lbnQgcmVmZXJlbmNlIGlzIGZyb20gYSBkaWZmZXJlbnQgRmlyZXN0b3JlIGluc3RhbmNlLlwiKTtcbiAgICByZXR1cm4gdDtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8vIFRPRE8obXJzY2htaWR0KSBDb25zaWRlciB1c2luZyBgQmFzZVRyYW5zYWN0aW9uYCBhcyB0aGUgYmFzZSBjbGFzcyBpbiB0aGVcbi8vIGxlZ2FjeSBTREsuXG4vKipcbiAqIEEgcmVmZXJlbmNlIHRvIGEgdHJhbnNhY3Rpb24uXG4gKlxuICogVGhlIGBUcmFuc2FjdGlvbmAgb2JqZWN0IHBhc3NlZCB0byBhIHRyYW5zYWN0aW9uJ3MgYHVwZGF0ZUZ1bmN0aW9uYCBwcm92aWRlc1xuICogdGhlIG1ldGhvZHMgdG8gcmVhZCBhbmQgd3JpdGUgZGF0YSB3aXRoaW4gdGhlIHRyYW5zYWN0aW9uIGNvbnRleHQuIFNlZVxuICoge0BsaW5rIHJ1blRyYW5zYWN0aW9ufS5cbiAqL1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogUmVhZHMgdGhlIGRvY3VtZW50IHJlZmVycmVkIHRvIGJ5IHRoaXMgYERvY3VtZW50UmVmZXJlbmNlYC5cbiAqXG4gKiBOb3RlOiBgZ2V0RG9jKClgIGF0dGVtcHRzIHRvIHByb3ZpZGUgdXAtdG8tZGF0ZSBkYXRhIHdoZW4gcG9zc2libGUgYnkgd2FpdGluZ1xuICogZm9yIGRhdGEgZnJvbSB0aGUgc2VydmVyLCBidXQgaXQgbWF5IHJldHVybiBjYWNoZWQgZGF0YSBvciBmYWlsIGlmIHlvdSBhcmVcbiAqIG9mZmxpbmUgYW5kIHRoZSBzZXJ2ZXIgY2Fubm90IGJlIHJlYWNoZWQuIFRvIHNwZWNpZnkgdGhpcyBiZWhhdmlvciwgaW52b2tlXG4gKiB7QGxpbmsgZ2V0RG9jRnJvbUNhY2hlfSBvciB7QGxpbmsgZ2V0RG9jRnJvbVNlcnZlcn0uXG4gKlxuICogQHBhcmFtIHJlZmVyZW5jZSAtIFRoZSByZWZlcmVuY2Ugb2YgdGhlIGRvY3VtZW50IHRvIGZldGNoLlxuICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmVkIHdpdGggYSBgRG9jdW1lbnRTbmFwc2hvdGAgY29udGFpbmluZyB0aGVcbiAqIGN1cnJlbnQgZG9jdW1lbnQgY29udGVudHMuXG4gKi9cbmZ1bmN0aW9uIEdoKHQpIHtcbiAgICB0ID0gdGModCwgcmMpO1xuICAgIGNvbnN0IGUgPSB0Yyh0LmZpcmVzdG9yZSwgZ2MpO1xuICAgIHJldHVybiBxdShJYyhlKSwgdC5fa2V5KS50aGVuKChuID0+IGlsKGUsIHQsIG4pKSk7XG59XG5cbmNsYXNzIFFoIGV4dGVuZHMgQmgge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgc3VwZXIoKSwgdGhpcy5maXJlc3RvcmUgPSB0O1xuICAgIH1cbiAgICBjb252ZXJ0Qnl0ZXModCkge1xuICAgICAgICByZXR1cm4gbmV3IE1jKHQpO1xuICAgIH1cbiAgICBjb252ZXJ0UmVmZXJlbmNlKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMuY29udmVydERvY3VtZW50S2V5KHQsIHRoaXMuZmlyZXN0b3JlLl9kYXRhYmFzZUlkKTtcbiAgICAgICAgcmV0dXJuIG5ldyByYyh0aGlzLmZpcmVzdG9yZSwgLyogY29udmVydGVyPSAqLyBudWxsLCBlKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGRvY3VtZW50IHJlZmVycmVkIHRvIGJ5IHRoaXMgYERvY3VtZW50UmVmZXJlbmNlYCBmcm9tIGNhY2hlLlxuICogUmV0dXJucyBhbiBlcnJvciBpZiB0aGUgZG9jdW1lbnQgaXMgbm90IGN1cnJlbnRseSBjYWNoZWQuXG4gKlxuICogQHJldHVybnMgQSBgUHJvbWlzZWAgcmVzb2x2ZWQgd2l0aCBhIGBEb2N1bWVudFNuYXBzaG90YCBjb250YWluaW5nIHRoZVxuICogY3VycmVudCBkb2N1bWVudCBjb250ZW50cy5cbiAqLyBmdW5jdGlvbiBqaCh0KSB7XG4gICAgdCA9IHRjKHQsIHJjKTtcbiAgICBjb25zdCBlID0gdGModC5maXJlc3RvcmUsIGdjKSwgbiA9IEljKGUpLCBzID0gbmV3IFFoKGUpO1xuICAgIHJldHVybiBMdShuLCB0Ll9rZXkpLnRoZW4oKG4gPT4gbmV3IF9oKGUsIHMsIHQuX2tleSwgbiwgbmV3IGRoKG51bGwgIT09IG4gJiYgbi5oYXNMb2NhbE11dGF0aW9ucywgXG4gICAgLyogZnJvbUNhY2hlPSAqLyAhMCksIHQuY29udmVydGVyKSkpO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBkb2N1bWVudCByZWZlcnJlZCB0byBieSB0aGlzIGBEb2N1bWVudFJlZmVyZW5jZWAgZnJvbSB0aGUgc2VydmVyLlxuICogUmV0dXJucyBhbiBlcnJvciBpZiB0aGUgbmV0d29yayBpcyBub3QgYXZhaWxhYmxlLlxuICpcbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIHJlc29sdmVkIHdpdGggYSBgRG9jdW1lbnRTbmFwc2hvdGAgY29udGFpbmluZyB0aGVcbiAqIGN1cnJlbnQgZG9jdW1lbnQgY29udGVudHMuXG4gKi8gZnVuY3Rpb24gV2godCkge1xuICAgIHQgPSB0Yyh0LCByYyk7XG4gICAgY29uc3QgZSA9IHRjKHQuZmlyZXN0b3JlLCBnYyk7XG4gICAgcmV0dXJuIHF1KEljKGUpLCB0Ll9rZXksIHtcbiAgICAgICAgc291cmNlOiBcInNlcnZlclwiXG4gICAgfSkudGhlbigobiA9PiBpbChlLCB0LCBuKSkpO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0cyBhcyBhIGBRdWVyeVNuYXBzaG90YC5cbiAqXG4gKiBOb3RlOiBgZ2V0RG9jcygpYCBhdHRlbXB0cyB0byBwcm92aWRlIHVwLXRvLWRhdGUgZGF0YSB3aGVuIHBvc3NpYmxlIGJ5XG4gKiB3YWl0aW5nIGZvciBkYXRhIGZyb20gdGhlIHNlcnZlciwgYnV0IGl0IG1heSByZXR1cm4gY2FjaGVkIGRhdGEgb3IgZmFpbCBpZlxuICogeW91IGFyZSBvZmZsaW5lIGFuZCB0aGUgc2VydmVyIGNhbm5vdCBiZSByZWFjaGVkLiBUbyBzcGVjaWZ5IHRoaXMgYmVoYXZpb3IsXG4gKiBpbnZva2Uge0BsaW5rIGdldERvY3NGcm9tQ2FjaGV9IG9yIHtAbGluayBnZXREb2NzRnJvbVNlcnZlcn0uXG4gKlxuICogQHJldHVybnMgQSBgUHJvbWlzZWAgdGhhdCB3aWxsIGJlIHJlc29sdmVkIHdpdGggdGhlIHJlc3VsdHMgb2YgdGhlIHF1ZXJ5LlxuICovIGZ1bmN0aW9uIHpoKHQpIHtcbiAgICB0ID0gdGModCwgb2MpO1xuICAgIGNvbnN0IGUgPSB0Yyh0LmZpcmVzdG9yZSwgZ2MpLCBuID0gSWMoZSksIHMgPSBuZXcgUWgoZSk7XG4gICAgcmV0dXJuIHBoKHQuX3F1ZXJ5KSwgS3UobiwgdC5fcXVlcnkpLnRoZW4oKG4gPT4gbmV3IG1oKGUsIHMsIHQsIG4pKSk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSByZXN1bHRzIGFzIGEgYFF1ZXJ5U25hcHNob3RgIGZyb20gY2FjaGUuXG4gKiBSZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBkb2N1bWVudCBpcyBub3QgY3VycmVudGx5IGNhY2hlZC5cbiAqXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0cyBvZiB0aGUgcXVlcnkuXG4gKi8gZnVuY3Rpb24gSGgodCkge1xuICAgIHQgPSB0Yyh0LCBvYyk7XG4gICAgY29uc3QgZSA9IHRjKHQuZmlyZXN0b3JlLCBnYyksIG4gPSBJYyhlKSwgcyA9IG5ldyBRaChlKTtcbiAgICByZXR1cm4gVXUobiwgdC5fcXVlcnkpLnRoZW4oKG4gPT4gbmV3IG1oKGUsIHMsIHQsIG4pKSk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSByZXN1bHRzIGFzIGEgYFF1ZXJ5U25hcHNob3RgIGZyb20gdGhlXG4gKiBzZXJ2ZXIuIFJldHVybnMgYW4gZXJyb3IgaWYgdGhlIG5ldHdvcmsgaXMgbm90IGF2YWlsYWJsZS5cbiAqXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0cyBvZiB0aGUgcXVlcnkuXG4gKi8gZnVuY3Rpb24gSmgodCkge1xuICAgIHQgPSB0Yyh0LCBvYyk7XG4gICAgY29uc3QgZSA9IHRjKHQuZmlyZXN0b3JlLCBnYyksIG4gPSBJYyhlKSwgcyA9IG5ldyBRaChlKTtcbiAgICByZXR1cm4gS3UobiwgdC5fcXVlcnksIHtcbiAgICAgICAgc291cmNlOiBcInNlcnZlclwiXG4gICAgfSkudGhlbigobiA9PiBuZXcgbWgoZSwgcywgdCwgbikpKTtcbn1cblxuZnVuY3Rpb24gWWgodCwgZSwgbikge1xuICAgIHQgPSB0Yyh0LCByYyk7XG4gICAgY29uc3QgcyA9IHRjKHQuZmlyZXN0b3JlLCBnYyksIGkgPSBMaCh0LmNvbnZlcnRlciwgZSwgbik7XG4gICAgcmV0dXJuIHNsKHMsIFsgUWMoR2MocyksIFwic2V0RG9jXCIsIHQuX2tleSwgaSwgbnVsbCAhPT0gdC5jb252ZXJ0ZXIsIG4pLnRvTXV0YXRpb24odC5fa2V5LCBobi5ub25lKCkpIF0pO1xufVxuXG5mdW5jdGlvbiBYaCh0LCBlLCBuLCAuLi5zKSB7XG4gICAgdCA9IHRjKHQsIHJjKTtcbiAgICBjb25zdCBpID0gdGModC5maXJlc3RvcmUsIGdjKSwgciA9IEdjKGkpO1xuICAgIGxldCBvO1xuICAgIG8gPSBcInN0cmluZ1wiID09IHR5cGVvZiAoXG4gICAgLy8gRm9yIENvbXBhdCB0eXBlcywgd2UgaGF2ZSB0byBcImV4dHJhY3RcIiB0aGUgdW5kZXJseWluZyB0eXBlcyBiZWZvcmVcbiAgICAvLyBwZXJmb3JtaW5nIHZhbGlkYXRpb24uXG4gICAgZSA9IGdldE1vZHVsYXJJbnN0YW5jZShlKSkgfHwgZSBpbnN0YW5jZW9mIE5jID8gWmMociwgXCJ1cGRhdGVEb2NcIiwgdC5fa2V5LCBlLCBuLCBzKSA6IFhjKHIsIFwidXBkYXRlRG9jXCIsIHQuX2tleSwgZSk7XG4gICAgcmV0dXJuIHNsKGksIFsgby50b011dGF0aW9uKHQuX2tleSwgaG4uZXhpc3RzKCEwKSkgXSk7XG59XG5cbi8qKlxuICogRGVsZXRlcyB0aGUgZG9jdW1lbnQgcmVmZXJyZWQgdG8gYnkgdGhlIHNwZWNpZmllZCBgRG9jdW1lbnRSZWZlcmVuY2VgLlxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2UgLSBBIHJlZmVyZW5jZSB0byB0aGUgZG9jdW1lbnQgdG8gZGVsZXRlLlxuICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGRvY3VtZW50IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseVxuICogZGVsZXRlZCBmcm9tIHRoZSBiYWNrZW5kIChub3RlIHRoYXQgaXQgd29uJ3QgcmVzb2x2ZSB3aGlsZSB5b3UncmUgb2ZmbGluZSkuXG4gKi8gZnVuY3Rpb24gWmgodCkge1xuICAgIHJldHVybiBzbCh0Yyh0LmZpcmVzdG9yZSwgZ2MpLCBbIG5ldyBBbih0Ll9rZXksIGhuLm5vbmUoKSkgXSk7XG59XG5cbi8qKlxuICogQWRkIGEgbmV3IGRvY3VtZW50IHRvIHNwZWNpZmllZCBgQ29sbGVjdGlvblJlZmVyZW5jZWAgd2l0aCB0aGUgZ2l2ZW4gZGF0YSxcbiAqIGFzc2lnbmluZyBpdCBhIGRvY3VtZW50IElEIGF1dG9tYXRpY2FsbHkuXG4gKlxuICogQHBhcmFtIHJlZmVyZW5jZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjb2xsZWN0aW9uIHRvIGFkZCB0aGlzIGRvY3VtZW50IHRvLlxuICogQHBhcmFtIGRhdGEgLSBBbiBPYmplY3QgY29udGFpbmluZyB0aGUgZGF0YSBmb3IgdGhlIG5ldyBkb2N1bWVudC5cbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIHJlc29sdmVkIHdpdGggYSBgRG9jdW1lbnRSZWZlcmVuY2VgIHBvaW50aW5nIHRvIHRoZVxuICogbmV3bHkgY3JlYXRlZCBkb2N1bWVudCBhZnRlciBpdCBoYXMgYmVlbiB3cml0dGVuIHRvIHRoZSBiYWNrZW5kIChOb3RlIHRoYXQgaXRcbiAqIHdvbid0IHJlc29sdmUgd2hpbGUgeW91J3JlIG9mZmxpbmUpLlxuICovIGZ1bmN0aW9uIHRsKHQsIGUpIHtcbiAgICBjb25zdCBuID0gdGModC5maXJlc3RvcmUsIGdjKSwgcyA9IGhjKHQpLCBpID0gTGgodC5jb252ZXJ0ZXIsIGUpO1xuICAgIHJldHVybiBzbChuLCBbIFFjKEdjKHQuZmlyZXN0b3JlKSwgXCJhZGREb2NcIiwgcy5fa2V5LCBpLCBudWxsICE9PSB0LmNvbnZlcnRlciwge30pLnRvTXV0YXRpb24ocy5fa2V5LCBobi5leGlzdHMoITEpKSBdKS50aGVuKCgoKSA9PiBzKSk7XG59XG5cbmZ1bmN0aW9uIGVsKHQsIC4uLmUpIHtcbiAgICB2YXIgbiwgcywgaTtcbiAgICB0ID0gZ2V0TW9kdWxhckluc3RhbmNlKHQpO1xuICAgIGxldCByID0ge1xuICAgICAgICBpbmNsdWRlTWV0YWRhdGFDaGFuZ2VzOiAhMVxuICAgIH0sIG8gPSAwO1xuICAgIFwib2JqZWN0XCIgIT0gdHlwZW9mIGVbb10gfHwgX2MoZVtvXSkgfHwgKHIgPSBlW29dLCBvKyspO1xuICAgIGNvbnN0IGEgPSB7XG4gICAgICAgIGluY2x1ZGVNZXRhZGF0YUNoYW5nZXM6IHIuaW5jbHVkZU1ldGFkYXRhQ2hhbmdlc1xuICAgIH07XG4gICAgaWYgKF9jKGVbb10pKSB7XG4gICAgICAgIGNvbnN0IHQgPSBlW29dO1xuICAgICAgICBlW29dID0gbnVsbCA9PT0gKG4gPSB0Lm5leHQpIHx8IHZvaWQgMCA9PT0gbiA/IHZvaWQgMCA6IG4uYmluZCh0KSwgZVtvICsgMV0gPSBudWxsID09PSAocyA9IHQuZXJyb3IpIHx8IHZvaWQgMCA9PT0gcyA/IHZvaWQgMCA6IHMuYmluZCh0KSwgXG4gICAgICAgIGVbbyArIDJdID0gbnVsbCA9PT0gKGkgPSB0LmNvbXBsZXRlKSB8fCB2b2lkIDAgPT09IGkgPyB2b2lkIDAgOiBpLmJpbmQodCk7XG4gICAgfVxuICAgIGxldCB1LCBjLCBoO1xuICAgIGlmICh0IGluc3RhbmNlb2YgcmMpIGMgPSB0Yyh0LmZpcmVzdG9yZSwgZ2MpLCBoID0gRGUodC5fa2V5LnBhdGgpLCB1ID0ge1xuICAgICAgICBuZXh0OiBuID0+IHtcbiAgICAgICAgICAgIGVbb10gJiYgZVtvXShpbChjLCB0LCBuKSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBlW28gKyAxXSxcbiAgICAgICAgY29tcGxldGU6IGVbbyArIDJdXG4gICAgfTsgZWxzZSB7XG4gICAgICAgIGNvbnN0IG4gPSB0Yyh0LCBvYyk7XG4gICAgICAgIGMgPSB0YyhuLmZpcmVzdG9yZSwgZ2MpLCBoID0gbi5fcXVlcnk7XG4gICAgICAgIGNvbnN0IHMgPSBuZXcgUWgoYyk7XG4gICAgICAgIHUgPSB7XG4gICAgICAgICAgICBuZXh0OiB0ID0+IHtcbiAgICAgICAgICAgICAgICBlW29dICYmIGVbb10obmV3IG1oKGMsIHMsIG4sIHQpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogZVtvICsgMV0sXG4gICAgICAgICAgICBjb21wbGV0ZTogZVtvICsgMl1cbiAgICAgICAgfSwgcGgodC5fcXVlcnkpO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24odCwgZSwgbiwgcykge1xuICAgICAgICBjb25zdCBpID0gbmV3IFJ1KHMpLCByID0gbmV3IERhKGUsIGksIG4pO1xuICAgICAgICByZXR1cm4gdC5hc3luY1F1ZXVlLmVucXVldWVBbmRGb3JnZXQoKGFzeW5jICgpID0+IGJhKGF3YWl0ICR1KHQpLCByKSkpLCAoKSA9PiB7XG4gICAgICAgICAgICBpLm11KCksIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0KChhc3luYyAoKSA9PiBQYShhd2FpdCAkdSh0KSwgcikpKTtcbiAgICAgICAgfTtcbiAgICB9KEljKGMpLCBoLCBhLCB1KTtcbn1cblxuZnVuY3Rpb24gbmwodCwgZSkge1xuICAgIHJldHVybiBHdShJYyh0ID0gdGModCwgZ2MpKSwgX2MoZSkgPyBlIDoge1xuICAgICAgICBuZXh0OiBlXG4gICAgfSk7XG59XG5cbi8qKlxuICogTG9jYWxseSB3cml0ZXMgYG11dGF0aW9uc2Agb24gdGhlIGFzeW5jIHF1ZXVlLlxuICogQGludGVybmFsXG4gKi8gZnVuY3Rpb24gc2wodCwgZSkge1xuICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBuZXcgajtcbiAgICAgICAgcmV0dXJuIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0KChhc3luYyAoKSA9PiBHYShhd2FpdCBPdSh0KSwgZSwgbikpKSwgbi5wcm9taXNlO1xuICAgIH0oSWModCksIGUpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEge0BsaW5rIFZpZXdTbmFwc2hvdH0gdGhhdCBjb250YWlucyB0aGUgc2luZ2xlIGRvY3VtZW50IHNwZWNpZmllZCBieSBgcmVmYFxuICogdG8gYSB7QGxpbmsgRG9jdW1lbnRTbmFwc2hvdH0uXG4gKi8gZnVuY3Rpb24gaWwodCwgZSwgbikge1xuICAgIGNvbnN0IHMgPSBuLmRvY3MuZ2V0KGUuX2tleSksIGkgPSBuZXcgUWgodCk7XG4gICAgcmV0dXJuIG5ldyBfaCh0LCBpLCBlLl9rZXksIHMsIG5ldyBkaChuLmhhc1BlbmRpbmdXcml0ZXMsIG4uZnJvbUNhY2hlKSwgZS5jb252ZXJ0ZXIpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIHJlZmVyZW5jZSB0byBhIHRyYW5zYWN0aW9uLlxuICpcbiAqIFRoZSBgVHJhbnNhY3Rpb25gIG9iamVjdCBwYXNzZWQgdG8gYSB0cmFuc2FjdGlvbidzIGB1cGRhdGVGdW5jdGlvbmAgcHJvdmlkZXNcbiAqIHRoZSBtZXRob2RzIHRvIHJlYWQgYW5kIHdyaXRlIGRhdGEgd2l0aGluIHRoZSB0cmFuc2FjdGlvbiBjb250ZXh0LiBTZWVcbiAqIHtAbGluayBydW5UcmFuc2FjdGlvbn0uXG4gKi8gY2xhc3MgcmwgZXh0ZW5kcyBjbGFzcyB7XG4gICAgLyoqIEBoaWRlY29uc3RydWN0b3IgKi9cbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMuX2ZpcmVzdG9yZSA9IHQsIHRoaXMuX3RyYW5zYWN0aW9uID0gZSwgdGhpcy5fZGF0YVJlYWRlciA9IEdjKHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgcHJvdmlkZWQge0BsaW5rIERvY3VtZW50UmVmZXJlbmNlfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkb2N1bWVudFJlZiAtIEEgcmVmZXJlbmNlIHRvIHRoZSBkb2N1bWVudCB0byBiZSByZWFkLlxuICAgICAqIEByZXR1cm5zIEEgYERvY3VtZW50U25hcHNob3RgIHdpdGggdGhlIHJlYWQgZGF0YS5cbiAgICAgKi8gICAgZ2V0KHQpIHtcbiAgICAgICAgY29uc3QgZSA9IEtoKHQsIHRoaXMuX2ZpcmVzdG9yZSksIG4gPSBuZXcgcWgodGhpcy5fZmlyZXN0b3JlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uLmxvb2t1cChbIGUuX2tleSBdKS50aGVuKCh0ID0+IHtcbiAgICAgICAgICAgIGlmICghdCB8fCAxICE9PSB0Lmxlbmd0aCkgcmV0dXJuIEwoKTtcbiAgICAgICAgICAgIGNvbnN0IHMgPSB0WzBdO1xuICAgICAgICAgICAgaWYgKHMuaXNGb3VuZERvY3VtZW50KCkpIHJldHVybiBuZXcgaGgodGhpcy5fZmlyZXN0b3JlLCBuLCBzLmtleSwgcywgZS5jb252ZXJ0ZXIpO1xuICAgICAgICAgICAgaWYgKHMuaXNOb0RvY3VtZW50KCkpIHJldHVybiBuZXcgaGgodGhpcy5fZmlyZXN0b3JlLCBuLCBlLl9rZXksIG51bGwsIGUuY29udmVydGVyKTtcbiAgICAgICAgICAgIHRocm93IEwoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBzZXQodCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gS2godCwgdGhpcy5fZmlyZXN0b3JlKSwgaSA9IExoKHMuY29udmVydGVyLCBlLCBuKSwgciA9IFFjKHRoaXMuX2RhdGFSZWFkZXIsIFwiVHJhbnNhY3Rpb24uc2V0XCIsIHMuX2tleSwgaSwgbnVsbCAhPT0gcy5jb252ZXJ0ZXIsIG4pO1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb24uc2V0KHMuX2tleSwgciksIHRoaXM7XG4gICAgfVxuICAgIHVwZGF0ZSh0LCBlLCBuLCAuLi5zKSB7XG4gICAgICAgIGNvbnN0IGkgPSBLaCh0LCB0aGlzLl9maXJlc3RvcmUpO1xuICAgICAgICAvLyBGb3IgQ29tcGF0IHR5cGVzLCB3ZSBoYXZlIHRvIFwiZXh0cmFjdFwiIHRoZSB1bmRlcmx5aW5nIHR5cGVzIGJlZm9yZVxuICAgICAgICAvLyBwZXJmb3JtaW5nIHZhbGlkYXRpb24uXG4gICAgICAgICAgICAgICAgbGV0IHI7XG4gICAgICAgIHJldHVybiByID0gXCJzdHJpbmdcIiA9PSB0eXBlb2YgKGUgPSBnZXRNb2R1bGFySW5zdGFuY2UoZSkpIHx8IGUgaW5zdGFuY2VvZiBOYyA/IFpjKHRoaXMuX2RhdGFSZWFkZXIsIFwiVHJhbnNhY3Rpb24udXBkYXRlXCIsIGkuX2tleSwgZSwgbiwgcykgOiBYYyh0aGlzLl9kYXRhUmVhZGVyLCBcIlRyYW5zYWN0aW9uLnVwZGF0ZVwiLCBpLl9rZXksIGUpLCBcbiAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb24udXBkYXRlKGkuX2tleSwgciksIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlbGV0ZXMgdGhlIGRvY3VtZW50IHJlZmVycmVkIHRvIGJ5IHRoZSBwcm92aWRlZCB7QGxpbmsgRG9jdW1lbnRSZWZlcmVuY2V9LlxuICAgICAqXG4gICAgICogQHBhcmFtIGRvY3VtZW50UmVmIC0gQSByZWZlcmVuY2UgdG8gdGhlIGRvY3VtZW50IHRvIGJlIGRlbGV0ZWQuXG4gICAgICogQHJldHVybnMgVGhpcyBgVHJhbnNhY3Rpb25gIGluc3RhbmNlLiBVc2VkIGZvciBjaGFpbmluZyBtZXRob2QgY2FsbHMuXG4gICAgICovICAgIGRlbGV0ZSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBLaCh0LCB0aGlzLl9maXJlc3RvcmUpO1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb24uZGVsZXRlKGUuX2tleSksIHRoaXM7XG4gICAgfVxufSB7XG4gICAgLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBzYW1lIGxvZ2ljIGFzIHRoZSBUcmFuc2FjdGlvbiBBUEkgaW4gdGhlIExpdGUgU0RLXG4gICAgLy8gYnV0IGlzIHN1YmNsYXNzZWQgaW4gb3JkZXIgdG8gcmV0dXJuIGl0cyBvd24gRG9jdW1lbnRTbmFwc2hvdCB0eXBlcy5cbiAgICAvKiogQGhpZGVjb25zdHJ1Y3RvciAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgc3VwZXIodCwgZSksIHRoaXMuX2ZpcmVzdG9yZSA9IHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIHRoZSBkb2N1bWVudCByZWZlcmVuY2VkIGJ5IHRoZSBwcm92aWRlZCB7QGxpbmsgRG9jdW1lbnRSZWZlcmVuY2V9LlxuICAgICAqXG4gICAgICogQHBhcmFtIGRvY3VtZW50UmVmIC0gQSByZWZlcmVuY2UgdG8gdGhlIGRvY3VtZW50IHRvIGJlIHJlYWQuXG4gICAgICogQHJldHVybnMgQSBgRG9jdW1lbnRTbmFwc2hvdGAgd2l0aCB0aGUgcmVhZCBkYXRhLlxuICAgICAqLyAgICBnZXQodCkge1xuICAgICAgICBjb25zdCBlID0gS2godCwgdGhpcy5fZmlyZXN0b3JlKSwgbiA9IG5ldyBRaCh0aGlzLl9maXJlc3RvcmUpO1xuICAgICAgICByZXR1cm4gc3VwZXIuZ2V0KHQpLnRoZW4oKHQgPT4gbmV3IF9oKHRoaXMuX2ZpcmVzdG9yZSwgbiwgZS5fa2V5LCB0Ll9kb2N1bWVudCwgbmV3IGRoKFxuICAgICAgICAvKiBoYXNQZW5kaW5nV3JpdGVzPSAqLyAhMSwgXG4gICAgICAgIC8qIGZyb21DYWNoZT0gKi8gITEpLCBlLmNvbnZlcnRlcikpKTtcbiAgICB9XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgdGhlIGdpdmVuIGB1cGRhdGVGdW5jdGlvbmAgYW5kIHRoZW4gYXR0ZW1wdHMgdG8gY29tbWl0IHRoZSBjaGFuZ2VzXG4gKiBhcHBsaWVkIHdpdGhpbiB0aGUgdHJhbnNhY3Rpb24uIElmIGFueSBkb2N1bWVudCByZWFkIHdpdGhpbiB0aGUgdHJhbnNhY3Rpb25cbiAqIGhhcyBjaGFuZ2VkLCBDbG91ZCBGaXJlc3RvcmUgcmV0cmllcyB0aGUgYHVwZGF0ZUZ1bmN0aW9uYC4gSWYgaXQgZmFpbHMgdG9cbiAqIGNvbW1pdCBhZnRlciA1IGF0dGVtcHRzLCB0aGUgdHJhbnNhY3Rpb24gZmFpbHMuXG4gKlxuICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHdyaXRlcyBhbGxvd2VkIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uIGlzIDUwMC5cbiAqXG4gKiBAcGFyYW0gZmlyZXN0b3JlIC0gQSByZWZlcmVuY2UgdG8gdGhlIEZpcmVzdG9yZSBkYXRhYmFzZSB0byBydW4gdGhpc1xuICogdHJhbnNhY3Rpb24gYWdhaW5zdC5cbiAqIEBwYXJhbSB1cGRhdGVGdW5jdGlvbiAtIFRoZSBmdW5jdGlvbiB0byBleGVjdXRlIHdpdGhpbiB0aGUgdHJhbnNhY3Rpb25cbiAqIGNvbnRleHQuXG4gKiBAcmV0dXJucyBJZiB0aGUgdHJhbnNhY3Rpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBvciB3YXMgZXhwbGljaXRseSBhYm9ydGVkXG4gKiAodGhlIGB1cGRhdGVGdW5jdGlvbmAgcmV0dXJuZWQgYSBmYWlsZWQgcHJvbWlzZSksIHRoZSBwcm9taXNlIHJldHVybmVkIGJ5IHRoZVxuICogYHVwZGF0ZUZ1bmN0aW9uIGBpcyByZXR1cm5lZCBoZXJlLiBPdGhlcndpc2UsIGlmIHRoZSB0cmFuc2FjdGlvbiBmYWlsZWQsIGFcbiAqIHJlamVjdGVkIHByb21pc2Ugd2l0aCB0aGUgY29ycmVzcG9uZGluZyBmYWlsdXJlIGVycm9yIGlzIHJldHVybmVkLlxuICovIGZ1bmN0aW9uIG9sKHQsIGUpIHtcbiAgICByZXR1cm4gUXUoSWModCA9IHRjKHQsIGdjKSksIChuID0+IGUobmV3IHJsKHQsIG4pKSkpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBSZXR1cm5zIGEgc2VudGluZWwgZm9yIHVzZSB3aXRoIHtAbGluayBAZmlyZWJhc2UvZmlyZXN0b3JlL2xpdGUjKHVwZGF0ZURvYzoxKX0gb3JcbiAqIHtAbGluayBAZmlyZWJhc2UvZmlyZXN0b3JlL2xpdGUjKHNldERvYzoxKX0gd2l0aCBge21lcmdlOiB0cnVlfWAgdG8gbWFyayBhIGZpZWxkIGZvciBkZWxldGlvbi5cbiAqLyBmdW5jdGlvbiBhbCgpIHtcbiAgICByZXR1cm4gbmV3IGpjKFwiZGVsZXRlRmllbGRcIik7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHNlbnRpbmVsIHVzZWQgd2l0aCB7QGxpbmsgQGZpcmViYXNlL2ZpcmVzdG9yZS9saXRlIyhzZXREb2M6MSl9IG9yIHtAbGluayBAZmlyZWJhc2UvZmlyZXN0b3JlL2xpdGUjKHVwZGF0ZURvYzoxKX0gdG9cbiAqIGluY2x1ZGUgYSBzZXJ2ZXItZ2VuZXJhdGVkIHRpbWVzdGFtcCBpbiB0aGUgd3JpdHRlbiBkYXRhLlxuICovIGZ1bmN0aW9uIHVsKCkge1xuICAgIHJldHVybiBuZXcgemMoXCJzZXJ2ZXJUaW1lc3RhbXBcIik7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHNwZWNpYWwgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIHtAbGluayBAZmlyZWJhc2UvZmlyZXN0b3JlL2xpdGUjKHNldERvYzoxKX0gb3Ige0BsaW5rXG4gKiBAZmlyZWJhc2UvZmlyZXN0b3JlL2xpdGUjKHVwZGF0ZURvYzoxKX0gdGhhdCB0ZWxscyB0aGUgc2VydmVyIHRvIHVuaW9uIHRoZSBnaXZlbiBlbGVtZW50cyB3aXRoIGFueSBhcnJheVxuICogdmFsdWUgdGhhdCBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgc2VydmVyLiBFYWNoIHNwZWNpZmllZCBlbGVtZW50IHRoYXQgZG9lc24ndFxuICogYWxyZWFkeSBleGlzdCBpbiB0aGUgYXJyYXkgd2lsbCBiZSBhZGRlZCB0byB0aGUgZW5kLiBJZiB0aGUgZmllbGQgYmVpbmdcbiAqIG1vZGlmaWVkIGlzIG5vdCBhbHJlYWR5IGFuIGFycmF5IGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2l0aCBhbiBhcnJheVxuICogY29udGFpbmluZyBleGFjdGx5IHRoZSBzcGVjaWZpZWQgZWxlbWVudHMuXG4gKlxuICogQHBhcmFtIGVsZW1lbnRzIC0gVGhlIGVsZW1lbnRzIHRvIHVuaW9uIGludG8gdGhlIGFycmF5LlxuICogQHJldHVybnMgVGhlIGBGaWVsZFZhbHVlYCBzZW50aW5lbCBmb3IgdXNlIGluIGEgY2FsbCB0byBgc2V0RG9jKClgIG9yXG4gKiBgdXBkYXRlRG9jKClgLlxuICovIGZ1bmN0aW9uIGNsKC4uLnQpIHtcbiAgICAvLyBOT1RFOiBXZSBkb24ndCBhY3R1YWxseSBwYXJzZSB0aGUgZGF0YSB1bnRpbCBpdCdzIHVzZWQgaW4gc2V0KCkgb3JcbiAgICAvLyB1cGRhdGUoKSBzaW5jZSB3ZSdkIG5lZWQgdGhlIEZpcmVzdG9yZSBpbnN0YW5jZSB0byBkbyB0aGlzLlxuICAgIHJldHVybiBuZXcgSGMoXCJhcnJheVVuaW9uXCIsIHQpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBzcGVjaWFsIHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCB7QGxpbmsgKHNldERvYzoxKX0gb3Ige0BsaW5rXG4gKiB1cGRhdGVEb2M6MX0gdGhhdCB0ZWxscyB0aGUgc2VydmVyIHRvIHJlbW92ZSB0aGUgZ2l2ZW4gZWxlbWVudHMgZnJvbSBhbnlcbiAqIGFycmF5IHZhbHVlIHRoYXQgYWxyZWFkeSBleGlzdHMgb24gdGhlIHNlcnZlci4gQWxsIGluc3RhbmNlcyBvZiBlYWNoIGVsZW1lbnRcbiAqIHNwZWNpZmllZCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgYXJyYXkuIElmIHRoZSBmaWVsZCBiZWluZyBtb2RpZmllZCBpcyBub3RcbiAqIGFscmVhZHkgYW4gYXJyYXkgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIGFuIGVtcHR5IGFycmF5LlxuICpcbiAqIEBwYXJhbSBlbGVtZW50cyAtIFRoZSBlbGVtZW50cyB0byByZW1vdmUgZnJvbSB0aGUgYXJyYXkuXG4gKiBAcmV0dXJucyBUaGUgYEZpZWxkVmFsdWVgIHNlbnRpbmVsIGZvciB1c2UgaW4gYSBjYWxsIHRvIGBzZXREb2MoKWAgb3JcbiAqIGB1cGRhdGVEb2MoKWBcbiAqLyBmdW5jdGlvbiBobCguLi50KSB7XG4gICAgLy8gTk9URTogV2UgZG9uJ3QgYWN0dWFsbHkgcGFyc2UgdGhlIGRhdGEgdW50aWwgaXQncyB1c2VkIGluIHNldCgpIG9yXG4gICAgLy8gdXBkYXRlKCkgc2luY2Ugd2UnZCBuZWVkIHRoZSBGaXJlc3RvcmUgaW5zdGFuY2UgdG8gZG8gdGhpcy5cbiAgICByZXR1cm4gbmV3IEpjKFwiYXJyYXlSZW1vdmVcIiwgdCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHNwZWNpYWwgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIHtAbGluayBAZmlyZWJhc2UvZmlyZXN0b3JlL2xpdGUjKHNldERvYzoxKX0gb3Ige0BsaW5rXG4gKiBAZmlyZWJhc2UvZmlyZXN0b3JlL2xpdGUjKHVwZGF0ZURvYzoxKX0gdGhhdCB0ZWxscyB0aGUgc2VydmVyIHRvIGluY3JlbWVudCB0aGUgZmllbGQncyBjdXJyZW50IHZhbHVlIGJ5XG4gKiB0aGUgZ2l2ZW4gdmFsdWUuXG4gKlxuICogSWYgZWl0aGVyIHRoZSBvcGVyYW5kIG9yIHRoZSBjdXJyZW50IGZpZWxkIHZhbHVlIHVzZXMgZmxvYXRpbmcgcG9pbnRcbiAqIHByZWNpc2lvbiwgYWxsIGFyaXRobWV0aWMgZm9sbG93cyBJRUVFIDc1NCBzZW1hbnRpY3MuIElmIGJvdGggdmFsdWVzIGFyZVxuICogaW50ZWdlcnMsIHZhbHVlcyBvdXRzaWRlIG9mIEphdmFTY3JpcHQncyBzYWZlIG51bWJlciByYW5nZVxuICogKGBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUmAgdG8gYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYCkgYXJlIGFsc28gc3ViamVjdCB0b1xuICogcHJlY2lzaW9uIGxvc3MuIEZ1cnRoZXJtb3JlLCBvbmNlIHByb2Nlc3NlZCBieSB0aGUgRmlyZXN0b3JlIGJhY2tlbmQsIGFsbFxuICogaW50ZWdlciBvcGVyYXRpb25zIGFyZSBjYXBwZWQgYmV0d2VlbiAtMl42MyBhbmQgMl42My0xLlxuICpcbiAqIElmIHRoZSBjdXJyZW50IGZpZWxkIHZhbHVlIGlzIG5vdCBvZiB0eXBlIGBudW1iZXJgLCBvciBpZiB0aGUgZmllbGQgZG9lcyBub3RcbiAqIHlldCBleGlzdCwgdGhlIHRyYW5zZm9ybWF0aW9uIHNldHMgdGhlIGZpZWxkIHRvIHRoZSBnaXZlbiB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gbiAtIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgYnkuXG4gKiBAcmV0dXJucyBUaGUgYEZpZWxkVmFsdWVgIHNlbnRpbmVsIGZvciB1c2UgaW4gYSBjYWxsIHRvIGBzZXREb2MoKWAgb3JcbiAqIGB1cGRhdGVEb2MoKWBcbiAqLyBmdW5jdGlvbiBsbCh0KSB7XG4gICAgcmV0dXJuIG5ldyBZYyhcImluY3JlbWVudFwiLCB0KTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQ3JlYXRlcyBhIHdyaXRlIGJhdGNoLCB1c2VkIGZvciBwZXJmb3JtaW5nIG11bHRpcGxlIHdyaXRlcyBhcyBhIHNpbmdsZVxuICogYXRvbWljIG9wZXJhdGlvbi4gVGhlIG1heGltdW0gbnVtYmVyIG9mIHdyaXRlcyBhbGxvd2VkIGluIGEgc2luZ2xlIHtAbGluayBXcml0ZUJhdGNofVxuICogaXMgNTAwLlxuICpcbiAqIFVubGlrZSB0cmFuc2FjdGlvbnMsIHdyaXRlIGJhdGNoZXMgYXJlIHBlcnNpc3RlZCBvZmZsaW5lIGFuZCB0aGVyZWZvcmUgYXJlXG4gKiBwcmVmZXJhYmxlIHdoZW4geW91IGRvbid0IG5lZWQgdG8gY29uZGl0aW9uIHlvdXIgd3JpdGVzIG9uIHJlYWQgZGF0YS5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBXcml0ZUJhdGNofSB0aGF0IGNhbiBiZSB1c2VkIHRvIGF0b21pY2FsbHkgZXhlY3V0ZSBtdWx0aXBsZVxuICogd3JpdGVzLlxuICovIGZ1bmN0aW9uIGZsKHQpIHtcbiAgICByZXR1cm4gSWModCA9IHRjKHQsIGdjKSksIG5ldyBVaCh0LCAoZSA9PiBzbCh0LCBlKSkpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBmdW5jdGlvbiBkbCh0LCBlKSB7XG4gICAgSWModCA9IHRjKHQsIGdjKSk7XG4gICAgY29uc3QgbiA9IFwic3RyaW5nXCIgPT0gdHlwZW9mIGUgPyBmdW5jdGlvbih0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0KTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBcIkZhaWxlZCB0byBwYXJzZSBKU09OOlwiICsgdC5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH0oZSkgOiBlLCBzID0gW107XG4gICAgLy8gUE9SVElORyBOT1RFOiBXZSBkb24ndCByZXR1cm4gYW4gZXJyb3IgaWYgdGhlIHVzZXIgaGFzIG5vdCBlbmFibGVkXG4gICAgLy8gcGVyc2lzdGVuY2Ugc2luY2UgYGVuYWJsZUluZGV4ZWRkYlBlcnNpc3RlbmNlKClgIGNhbiBmYWlsIG9uIHRoZSBXZWIuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobi5pbmRleGVzKSkgZm9yIChjb25zdCB0IG9mIG4uaW5kZXhlcykge1xuICAgICAgICBjb25zdCBlID0gX2wodCwgXCJjb2xsZWN0aW9uR3JvdXBcIiksIG4gPSBbXTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodC5maWVsZHMpKSBmb3IgKGNvbnN0IGUgb2YgdC5maWVsZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBhaChcInNldEluZGV4Q29uZmlndXJhdGlvblwiLCBfbChlLCBcImZpZWxkUGF0aFwiKSk7XG4gICAgICAgICAgICBcIkNPTlRBSU5TXCIgPT09IGUuYXJyYXlDb25maWcgPyBuLnB1c2gobmV3IGllKHQsIDIgLyogQ09OVEFJTlMgKi8pKSA6IFwiQVNDRU5ESU5HXCIgPT09IGUub3JkZXIgPyBuLnB1c2gobmV3IGllKHQsIDAgLyogQVNDRU5ESU5HICovKSkgOiBcIkRFU0NFTkRJTkdcIiA9PT0gZS5vcmRlciAmJiBuLnB1c2gobmV3IGllKHQsIDEgLyogREVTQ0VORElORyAqLykpO1xuICAgICAgICB9XG4gICAgICAgIHMucHVzaChuZXcgZWUoZWUuVU5LTk9XTl9JRCwgZSwgbiwgcmUuZW1wdHkoKSkpO1xuICAgIH1cbiAgICAvLyBUT0RPKGluZGV4aW5nKTogQ29uZmlndXJlIGluZGV4ZXNcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufVxuXG5mdW5jdGlvbiBfbCh0LCBlKSB7XG4gICAgaWYgKFwic3RyaW5nXCIgIT0gdHlwZW9mIHRbZV0pIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgXCJNaXNzaW5nIHN0cmluZyB2YWx1ZSBmb3I6IFwiICsgZSk7XG4gICAgcmV0dXJuIHRbZV07XG59XG5cbi8qKlxuICogQ2xvdWQgRmlyZXN0b3JlXG4gKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKi8gIWZ1bmN0aW9uKHQsIGUgPSAhMCkge1xuICAgICFmdW5jdGlvbih0KSB7XG4gICAgICAgIHggPSB0O1xuICAgIH0oU0RLX1ZFUlNJT04pLCBfcmVnaXN0ZXJDb21wb25lbnQobmV3IENvbXBvbmVudChcImZpcmVzdG9yZVwiLCAoKHQsIHtvcHRpb25zOiBufSkgPT4ge1xuICAgICAgICBjb25zdCBzID0gdC5nZXRQcm92aWRlcihcImFwcFwiKS5nZXRJbW1lZGlhdGUoKSwgaSA9IG5ldyBnYyhzLCBuZXcgSih0LmdldFByb3ZpZGVyKFwiYXV0aC1pbnRlcm5hbFwiKSksIG5ldyB0dCh0LmdldFByb3ZpZGVyKFwiYXBwLWNoZWNrLWludGVybmFsXCIpKSk7XG4gICAgICAgIHJldHVybiBuID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICB1c2VGZXRjaFN0cmVhbXM6IGVcbiAgICAgICAgfSwgbiksIGkuX3NldFNldHRpbmdzKG4pLCBpO1xuICAgIH0pLCBcIlBVQkxJQ1wiKSksIHJlZ2lzdGVyVmVyc2lvbihELCBcIjMuNC42XCIsIHQpLCBcbiAgICAvLyBCVUlMRF9UQVJHRVQgd2lsbCBiZSByZXBsYWNlZCBieSB2YWx1ZXMgbGlrZSBlc201LCBlc20yMDE3LCBjanM1LCBldGMgZHVyaW5nIHRoZSBjb21waWxhdGlvblxuICAgIHJlZ2lzdGVyVmVyc2lvbihELCBcIjMuNC42XCIsIFwiZXNtMjAxN1wiKTtcbn0oKTtcblxuZXhwb3J0IHsgQmggYXMgQWJzdHJhY3RVc2VyRGF0YVdyaXRlciwgTWMgYXMgQnl0ZXMsIG1jIGFzIENBQ0hFX1NJWkVfVU5MSU1JVEVELCBhYyBhcyBDb2xsZWN0aW9uUmVmZXJlbmNlLCByYyBhcyBEb2N1bWVudFJlZmVyZW5jZSwgX2ggYXMgRG9jdW1lbnRTbmFwc2hvdCwgTmMgYXMgRmllbGRQYXRoLCBPYyBhcyBGaWVsZFZhbHVlLCBnYyBhcyBGaXJlc3RvcmUsIFEgYXMgRmlyZXN0b3JlRXJyb3IsICRjIGFzIEdlb1BvaW50LCB3YyBhcyBMb2FkQnVuZGxlVGFzaywgb2MgYXMgUXVlcnksIEloIGFzIFF1ZXJ5Q29uc3RyYWludCwgd2ggYXMgUXVlcnlEb2N1bWVudFNuYXBzaG90LCBtaCBhcyBRdWVyeVNuYXBzaG90LCBkaCBhcyBTbmFwc2hvdE1ldGFkYXRhLCB1dCBhcyBUaW1lc3RhbXAsIHJsIGFzIFRyYW5zYWN0aW9uLCBVaCBhcyBXcml0ZUJhdGNoLCB2dCBhcyBfRGF0YWJhc2VJZCwgeHQgYXMgX0RvY3VtZW50S2V5LCBldCBhcyBfRW1wdHlBcHBDaGVja1Rva2VuUHJvdmlkZXIsIHogYXMgX0VtcHR5QXV0aENyZWRlbnRpYWxzUHJvdmlkZXIsIG10IGFzIF9GaWVsZFBhdGgsIHRjIGFzIF9jYXN0LCBVIGFzIF9kZWJ1Z0Fzc2VydCwgeXQgYXMgX2lzQmFzZTY0QXZhaWxhYmxlLCBGIGFzIF9sb2dXYXJuLCBkbCBhcyBfc2V0SW5kZXhDb25maWd1cmF0aW9uLCBKdSBhcyBfdmFsaWRhdGVJc05vdFVzZWRUb2dldGhlciwgdGwgYXMgYWRkRG9jLCBobCBhcyBhcnJheVJlbW92ZSwgY2wgYXMgYXJyYXlVbmlvbiwgYmMgYXMgY2xlYXJJbmRleGVkRGJQZXJzaXN0ZW5jZSwgdWMgYXMgY29sbGVjdGlvbiwgY2MgYXMgY29sbGVjdGlvbkdyb3VwLCBpYyBhcyBjb25uZWN0RmlyZXN0b3JlRW11bGF0b3IsIFpoIGFzIGRlbGV0ZURvYywgYWwgYXMgZGVsZXRlRmllbGQsIHZjIGFzIGRpc2FibGVOZXR3b3JrLCBoYyBhcyBkb2MsIGtjIGFzIGRvY3VtZW50SWQsIEVjIGFzIGVuYWJsZUluZGV4ZWREYlBlcnNpc3RlbmNlLCBBYyBhcyBlbmFibGVNdWx0aVRhYkluZGV4ZWREYlBlcnNpc3RlbmNlLCBWYyBhcyBlbmFibGVOZXR3b3JrLCBraCBhcyBlbmRBdCwgTmggYXMgZW5kQmVmb3JlLCBJYyBhcyBlbnN1cmVGaXJlc3RvcmVDb25maWd1cmVkLCBzbCBhcyBleGVjdXRlV3JpdGUsIEdoIGFzIGdldERvYywgamggYXMgZ2V0RG9jRnJvbUNhY2hlLCBXaCBhcyBnZXREb2NGcm9tU2VydmVyLCB6aCBhcyBnZXREb2NzLCBIaCBhcyBnZXREb2NzRnJvbUNhY2hlLCBKaCBhcyBnZXREb2NzRnJvbVNlcnZlciwgcGMgYXMgZ2V0RmlyZXN0b3JlLCBsbCBhcyBpbmNyZW1lbnQsIHljIGFzIGluaXRpYWxpemVGaXJlc3RvcmUsIFZoIGFzIGxpbWl0LCB2aCBhcyBsaW1pdFRvTGFzdCwgRGMgYXMgbG9hZEJ1bmRsZSwgQ2MgYXMgbmFtZWRRdWVyeSwgZWwgYXMgb25TbmFwc2hvdCwgbmwgYXMgb25TbmFwc2hvdHNJblN5bmMsIGJoIGFzIG9yZGVyQnksIFRoIGFzIHF1ZXJ5LCBmYyBhcyBxdWVyeUVxdWFsLCBsYyBhcyByZWZFcXVhbCwgb2wgYXMgcnVuVHJhbnNhY3Rpb24sIHVsIGFzIHNlcnZlclRpbWVzdGFtcCwgWWggYXMgc2V0RG9jLCBNIGFzIHNldExvZ0xldmVsLCB5aCBhcyBzbmFwc2hvdEVxdWFsLCBDaCBhcyBzdGFydEFmdGVyLCBEaCBhcyBzdGFydEF0LCBTYyBhcyB0ZXJtaW5hdGUsIFhoIGFzIHVwZGF0ZURvYywgUGMgYXMgd2FpdEZvclBlbmRpbmdXcml0ZXMsIEFoIGFzIHdoZXJlLCBmbCBhcyB3cml0ZUJhdGNoIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5lc20yMDE3LmpzLm1hcFxuIiwiLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIEBmaWxlb3ZlcnZpZXcgRmlyZWJhc2UgY29uc3RhbnRzLiAgU29tZSBvZiB0aGVzZSAoQGRlZmluZXMpIGNhbiBiZSBvdmVycmlkZGVuIGF0IGNvbXBpbGUtdGltZS5cclxuICovXHJcbmNvbnN0IENPTlNUQU5UUyA9IHtcclxuICAgIC8qKlxyXG4gICAgICogQGRlZmluZSB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIGlzIHRoZSBjbGllbnQgTm9kZS5qcyBTREsuXHJcbiAgICAgKi9cclxuICAgIE5PREVfQ0xJRU5UOiBmYWxzZSxcclxuICAgIC8qKlxyXG4gICAgICogQGRlZmluZSB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIGlzIHRoZSBBZG1pbiBOb2RlLmpzIFNESy5cclxuICAgICAqL1xyXG4gICAgTk9ERV9BRE1JTjogZmFsc2UsXHJcbiAgICAvKipcclxuICAgICAqIEZpcmViYXNlIFNESyBWZXJzaW9uXHJcbiAgICAgKi9cclxuICAgIFNES19WRVJTSU9OOiAnJHtKU0NPUkVfVkVSU0lPTn0nXHJcbn07XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHByb3ZpZGVkIGFzc2VydGlvbiBpcyBmYWxzeVxyXG4gKi9cclxuY29uc3QgYXNzZXJ0ID0gZnVuY3Rpb24gKGFzc2VydGlvbiwgbWVzc2FnZSkge1xyXG4gICAgaWYgKCFhc3NlcnRpb24pIHtcclxuICAgICAgICB0aHJvdyBhc3NlcnRpb25FcnJvcihtZXNzYWdlKTtcclxuICAgIH1cclxufTtcclxuLyoqXHJcbiAqIFJldHVybnMgYW4gRXJyb3Igb2JqZWN0IHN1aXRhYmxlIGZvciB0aHJvd2luZy5cclxuICovXHJcbmNvbnN0IGFzc2VydGlvbkVycm9yID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcclxuICAgIHJldHVybiBuZXcgRXJyb3IoJ0ZpcmViYXNlIERhdGFiYXNlICgnICtcclxuICAgICAgICBDT05TVEFOVFMuU0RLX1ZFUlNJT04gK1xyXG4gICAgICAgICcpIElOVEVSTkFMIEFTU0VSVCBGQUlMRUQ6ICcgK1xyXG4gICAgICAgIG1lc3NhZ2UpO1xyXG59O1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBzdHJpbmdUb0J5dGVBcnJheSQxID0gZnVuY3Rpb24gKHN0cikge1xyXG4gICAgLy8gVE9ETyh1c2VyKTogVXNlIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbnMgaWYvd2hlbiBhdmFpbGFibGVcclxuICAgIGNvbnN0IG91dCA9IFtdO1xyXG4gICAgbGV0IHAgPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgYyA9IHN0ci5jaGFyQ29kZUF0KGkpO1xyXG4gICAgICAgIGlmIChjIDwgMTI4KSB7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gYztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYyA8IDIwNDgpIHtcclxuICAgICAgICAgICAgb3V0W3ArK10gPSAoYyA+PiA2KSB8IDE5MjtcclxuICAgICAgICAgICAgb3V0W3ArK10gPSAoYyAmIDYzKSB8IDEyODtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoKGMgJiAweGZjMDApID09PSAweGQ4MDAgJiZcclxuICAgICAgICAgICAgaSArIDEgPCBzdHIubGVuZ3RoICYmXHJcbiAgICAgICAgICAgIChzdHIuY2hhckNvZGVBdChpICsgMSkgJiAweGZjMDApID09PSAweGRjMDApIHtcclxuICAgICAgICAgICAgLy8gU3Vycm9nYXRlIFBhaXJcclxuICAgICAgICAgICAgYyA9IDB4MTAwMDAgKyAoKGMgJiAweDAzZmYpIDw8IDEwKSArIChzdHIuY2hhckNvZGVBdCgrK2kpICYgMHgwM2ZmKTtcclxuICAgICAgICAgICAgb3V0W3ArK10gPSAoYyA+PiAxOCkgfCAyNDA7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gKChjID4+IDEyKSAmIDYzKSB8IDEyODtcclxuICAgICAgICAgICAgb3V0W3ArK10gPSAoKGMgPj4gNikgJiA2MykgfCAxMjg7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gKGMgJiA2MykgfCAxMjg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvdXRbcCsrXSA9IChjID4+IDEyKSB8IDIyNDtcclxuICAgICAgICAgICAgb3V0W3ArK10gPSAoKGMgPj4gNikgJiA2MykgfCAxMjg7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gKGMgJiA2MykgfCAxMjg7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG91dDtcclxufTtcclxuLyoqXHJcbiAqIFR1cm5zIGFuIGFycmF5IG9mIG51bWJlcnMgaW50byB0aGUgc3RyaW5nIGdpdmVuIGJ5IHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZVxyXG4gKiBjaGFyYWN0ZXJzIHRvIHdoaWNoIHRoZSBudW1iZXJzIGNvcnJlc3BvbmQuXHJcbiAqIEBwYXJhbSBieXRlcyBBcnJheSBvZiBudW1iZXJzIHJlcHJlc2VudGluZyBjaGFyYWN0ZXJzLlxyXG4gKiBAcmV0dXJuIFN0cmluZ2lmaWNhdGlvbiBvZiB0aGUgYXJyYXkuXHJcbiAqL1xyXG5jb25zdCBieXRlQXJyYXlUb1N0cmluZyA9IGZ1bmN0aW9uIChieXRlcykge1xyXG4gICAgLy8gVE9ETyh1c2VyKTogVXNlIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbnMgaWYvd2hlbiBhdmFpbGFibGVcclxuICAgIGNvbnN0IG91dCA9IFtdO1xyXG4gICAgbGV0IHBvcyA9IDAsIGMgPSAwO1xyXG4gICAgd2hpbGUgKHBvcyA8IGJ5dGVzLmxlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IGMxID0gYnl0ZXNbcG9zKytdO1xyXG4gICAgICAgIGlmIChjMSA8IDEyOCkge1xyXG4gICAgICAgICAgICBvdXRbYysrXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoYzEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjMSA+IDE5MSAmJiBjMSA8IDIyNCkge1xyXG4gICAgICAgICAgICBjb25zdCBjMiA9IGJ5dGVzW3BvcysrXTtcclxuICAgICAgICAgICAgb3V0W2MrK10gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCgoYzEgJiAzMSkgPDwgNikgfCAoYzIgJiA2MykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjMSA+IDIzOSAmJiBjMSA8IDM2NSkge1xyXG4gICAgICAgICAgICAvLyBTdXJyb2dhdGUgUGFpclxyXG4gICAgICAgICAgICBjb25zdCBjMiA9IGJ5dGVzW3BvcysrXTtcclxuICAgICAgICAgICAgY29uc3QgYzMgPSBieXRlc1twb3MrK107XHJcbiAgICAgICAgICAgIGNvbnN0IGM0ID0gYnl0ZXNbcG9zKytdO1xyXG4gICAgICAgICAgICBjb25zdCB1ID0gKCgoYzEgJiA3KSA8PCAxOCkgfCAoKGMyICYgNjMpIDw8IDEyKSB8ICgoYzMgJiA2MykgPDwgNikgfCAoYzQgJiA2MykpIC1cclxuICAgICAgICAgICAgICAgIDB4MTAwMDA7XHJcbiAgICAgICAgICAgIG91dFtjKytdID0gU3RyaW5nLmZyb21DaGFyQ29kZSgweGQ4MDAgKyAodSA+PiAxMCkpO1xyXG4gICAgICAgICAgICBvdXRbYysrXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhkYzAwICsgKHUgJiAxMDIzKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBjMiA9IGJ5dGVzW3BvcysrXTtcclxuICAgICAgICAgICAgY29uc3QgYzMgPSBieXRlc1twb3MrK107XHJcbiAgICAgICAgICAgIG91dFtjKytdID0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMxICYgMTUpIDw8IDEyKSB8ICgoYzIgJiA2MykgPDwgNikgfCAoYzMgJiA2MykpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBvdXQuam9pbignJyk7XHJcbn07XHJcbi8vIFdlIGRlZmluZSBpdCBhcyBhbiBvYmplY3QgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgY2xhc3MgYmVjYXVzZSBhIGNsYXNzIGNvbXBpbGVkIGRvd24gdG8gZXM1IGNhbid0XHJcbi8vIGJlIHRyZWVzaGFrZWQuIGh0dHBzOi8vZ2l0aHViLmNvbS9yb2xsdXAvcm9sbHVwL2lzc3Vlcy8xNjkxXHJcbi8vIFN0YXRpYyBsb29rdXAgbWFwcywgbGF6aWx5IHBvcHVsYXRlZCBieSBpbml0XygpXHJcbmNvbnN0IGJhc2U2NCA9IHtcclxuICAgIC8qKlxyXG4gICAgICogTWFwcyBieXRlcyB0byBjaGFyYWN0ZXJzLlxyXG4gICAgICovXHJcbiAgICBieXRlVG9DaGFyTWFwXzogbnVsbCxcclxuICAgIC8qKlxyXG4gICAgICogTWFwcyBjaGFyYWN0ZXJzIHRvIGJ5dGVzLlxyXG4gICAgICovXHJcbiAgICBjaGFyVG9CeXRlTWFwXzogbnVsbCxcclxuICAgIC8qKlxyXG4gICAgICogTWFwcyBieXRlcyB0byB3ZWJzYWZlIGNoYXJhY3RlcnMuXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBieXRlVG9DaGFyTWFwV2ViU2FmZV86IG51bGwsXHJcbiAgICAvKipcclxuICAgICAqIE1hcHMgd2Vic2FmZSBjaGFyYWN0ZXJzIHRvIGJ5dGVzLlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgY2hhclRvQnl0ZU1hcFdlYlNhZmVfOiBudWxsLFxyXG4gICAgLyoqXHJcbiAgICAgKiBPdXIgZGVmYXVsdCBhbHBoYWJldCwgc2hhcmVkIGJldHdlZW5cclxuICAgICAqIEVOQ09ERURfVkFMUyBhbmQgRU5DT0RFRF9WQUxTX1dFQlNBRkVcclxuICAgICAqL1xyXG4gICAgRU5DT0RFRF9WQUxTX0JBU0U6ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgKyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICsgJzAxMjM0NTY3ODknLFxyXG4gICAgLyoqXHJcbiAgICAgKiBPdXIgZGVmYXVsdCBhbHBoYWJldC4gVmFsdWUgNjQgKD0pIGlzIHNwZWNpYWw7IGl0IG1lYW5zIFwibm90aGluZy5cIlxyXG4gICAgICovXHJcbiAgICBnZXQgRU5DT0RFRF9WQUxTKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLkVOQ09ERURfVkFMU19CQVNFICsgJysvPSc7XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiBPdXIgd2Vic2FmZSBhbHBoYWJldC5cclxuICAgICAqL1xyXG4gICAgZ2V0IEVOQ09ERURfVkFMU19XRUJTQUZFKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLkVOQ09ERURfVkFMU19CQVNFICsgJy1fLic7XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIHRoaXMgYnJvd3NlciBzdXBwb3J0cyB0aGUgYXRvYiBhbmQgYnRvYSBmdW5jdGlvbnMuIFRoaXMgZXh0ZW5zaW9uXHJcbiAgICAgKiBzdGFydGVkIGF0IE1vemlsbGEgYnV0IGlzIG5vdyBpbXBsZW1lbnRlZCBieSBtYW55IGJyb3dzZXJzLiBXZSB1c2UgdGhlXHJcbiAgICAgKiBBU1NVTUVfKiB2YXJpYWJsZXMgdG8gYXZvaWQgcHVsbGluZyBpbiB0aGUgZnVsbCB1c2VyYWdlbnQgZGV0ZWN0aW9uIGxpYnJhcnlcclxuICAgICAqIGJ1dCBzdGlsbCBhbGxvd2luZyB0aGUgc3RhbmRhcmQgcGVyLWJyb3dzZXIgY29tcGlsYXRpb25zLlxyXG4gICAgICpcclxuICAgICAqL1xyXG4gICAgSEFTX05BVElWRV9TVVBQT1JUOiB0eXBlb2YgYXRvYiA9PT0gJ2Z1bmN0aW9uJyxcclxuICAgIC8qKlxyXG4gICAgICogQmFzZTY0LWVuY29kZSBhbiBhcnJheSBvZiBieXRlcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaW5wdXQgQW4gYXJyYXkgb2YgYnl0ZXMgKG51bWJlcnMgd2l0aFxyXG4gICAgICogICAgIHZhbHVlIGluIFswLCAyNTVdKSB0byBlbmNvZGUuXHJcbiAgICAgKiBAcGFyYW0gd2ViU2FmZSBCb29sZWFuIGluZGljYXRpbmcgd2Ugc2hvdWxkIHVzZSB0aGVcclxuICAgICAqICAgICBhbHRlcm5hdGl2ZSBhbHBoYWJldC5cclxuICAgICAqIEByZXR1cm4gVGhlIGJhc2U2NCBlbmNvZGVkIHN0cmluZy5cclxuICAgICAqL1xyXG4gICAgZW5jb2RlQnl0ZUFycmF5KGlucHV0LCB3ZWJTYWZlKSB7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0KSkge1xyXG4gICAgICAgICAgICB0aHJvdyBFcnJvcignZW5jb2RlQnl0ZUFycmF5IHRha2VzIGFuIGFycmF5IGFzIGEgcGFyYW1ldGVyJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaW5pdF8oKTtcclxuICAgICAgICBjb25zdCBieXRlVG9DaGFyTWFwID0gd2ViU2FmZVxyXG4gICAgICAgICAgICA/IHRoaXMuYnl0ZVRvQ2hhck1hcFdlYlNhZmVfXHJcbiAgICAgICAgICAgIDogdGhpcy5ieXRlVG9DaGFyTWFwXztcclxuICAgICAgICBjb25zdCBvdXRwdXQgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSArPSAzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ5dGUxID0gaW5wdXRbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IGhhdmVCeXRlMiA9IGkgKyAxIDwgaW5wdXQubGVuZ3RoO1xyXG4gICAgICAgICAgICBjb25zdCBieXRlMiA9IGhhdmVCeXRlMiA/IGlucHV0W2kgKyAxXSA6IDA7XHJcbiAgICAgICAgICAgIGNvbnN0IGhhdmVCeXRlMyA9IGkgKyAyIDwgaW5wdXQubGVuZ3RoO1xyXG4gICAgICAgICAgICBjb25zdCBieXRlMyA9IGhhdmVCeXRlMyA/IGlucHV0W2kgKyAyXSA6IDA7XHJcbiAgICAgICAgICAgIGNvbnN0IG91dEJ5dGUxID0gYnl0ZTEgPj4gMjtcclxuICAgICAgICAgICAgY29uc3Qgb3V0Qnl0ZTIgPSAoKGJ5dGUxICYgMHgwMykgPDwgNCkgfCAoYnl0ZTIgPj4gNCk7XHJcbiAgICAgICAgICAgIGxldCBvdXRCeXRlMyA9ICgoYnl0ZTIgJiAweDBmKSA8PCAyKSB8IChieXRlMyA+PiA2KTtcclxuICAgICAgICAgICAgbGV0IG91dEJ5dGU0ID0gYnl0ZTMgJiAweDNmO1xyXG4gICAgICAgICAgICBpZiAoIWhhdmVCeXRlMykge1xyXG4gICAgICAgICAgICAgICAgb3V0Qnl0ZTQgPSA2NDtcclxuICAgICAgICAgICAgICAgIGlmICghaGF2ZUJ5dGUyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3V0Qnl0ZTMgPSA2NDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvdXRwdXQucHVzaChieXRlVG9DaGFyTWFwW291dEJ5dGUxXSwgYnl0ZVRvQ2hhck1hcFtvdXRCeXRlMl0sIGJ5dGVUb0NoYXJNYXBbb3V0Qnl0ZTNdLCBieXRlVG9DaGFyTWFwW291dEJ5dGU0XSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvdXRwdXQuam9pbignJyk7XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiBCYXNlNjQtZW5jb2RlIGEgc3RyaW5nLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBpbnB1dCBBIHN0cmluZyB0byBlbmNvZGUuXHJcbiAgICAgKiBAcGFyYW0gd2ViU2FmZSBJZiB0cnVlLCB3ZSBzaG91bGQgdXNlIHRoZVxyXG4gICAgICogICAgIGFsdGVybmF0aXZlIGFscGhhYmV0LlxyXG4gICAgICogQHJldHVybiBUaGUgYmFzZTY0IGVuY29kZWQgc3RyaW5nLlxyXG4gICAgICovXHJcbiAgICBlbmNvZGVTdHJpbmcoaW5wdXQsIHdlYlNhZmUpIHtcclxuICAgICAgICAvLyBTaG9ydGN1dCBmb3IgTW96aWxsYSBicm93c2VycyB0aGF0IGltcGxlbWVudFxyXG4gICAgICAgIC8vIGEgbmF0aXZlIGJhc2U2NCBlbmNvZGVyIGluIHRoZSBmb3JtIG9mIFwiYnRvYS9hdG9iXCJcclxuICAgICAgICBpZiAodGhpcy5IQVNfTkFUSVZFX1NVUFBPUlQgJiYgIXdlYlNhZmUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGJ0b2EoaW5wdXQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGVCeXRlQXJyYXkoc3RyaW5nVG9CeXRlQXJyYXkkMShpbnB1dCksIHdlYlNhZmUpO1xyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICogQmFzZTY0LWRlY29kZSBhIHN0cmluZy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaW5wdXQgdG8gZGVjb2RlLlxyXG4gICAgICogQHBhcmFtIHdlYlNhZmUgVHJ1ZSBpZiB3ZSBzaG91bGQgdXNlIHRoZVxyXG4gICAgICogICAgIGFsdGVybmF0aXZlIGFscGhhYmV0LlxyXG4gICAgICogQHJldHVybiBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkZWNvZGVkIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBkZWNvZGVTdHJpbmcoaW5wdXQsIHdlYlNhZmUpIHtcclxuICAgICAgICAvLyBTaG9ydGN1dCBmb3IgTW96aWxsYSBicm93c2VycyB0aGF0IGltcGxlbWVudFxyXG4gICAgICAgIC8vIGEgbmF0aXZlIGJhc2U2NCBlbmNvZGVyIGluIHRoZSBmb3JtIG9mIFwiYnRvYS9hdG9iXCJcclxuICAgICAgICBpZiAodGhpcy5IQVNfTkFUSVZFX1NVUFBPUlQgJiYgIXdlYlNhZmUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGF0b2IoaW5wdXQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYnl0ZUFycmF5VG9TdHJpbmcodGhpcy5kZWNvZGVTdHJpbmdUb0J5dGVBcnJheShpbnB1dCwgd2ViU2FmZSkpO1xyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICogQmFzZTY0LWRlY29kZSBhIHN0cmluZy5cclxuICAgICAqXHJcbiAgICAgKiBJbiBiYXNlLTY0IGRlY29kaW5nLCBncm91cHMgb2YgZm91ciBjaGFyYWN0ZXJzIGFyZSBjb252ZXJ0ZWQgaW50byB0aHJlZVxyXG4gICAgICogYnl0ZXMuICBJZiB0aGUgZW5jb2RlciBkaWQgbm90IGFwcGx5IHBhZGRpbmcsIHRoZSBpbnB1dCBsZW5ndGggbWF5IG5vdFxyXG4gICAgICogYmUgYSBtdWx0aXBsZSBvZiA0LlxyXG4gICAgICpcclxuICAgICAqIEluIHRoaXMgY2FzZSwgdGhlIGxhc3QgZ3JvdXAgd2lsbCBoYXZlIGZld2VyIHRoYW4gNCBjaGFyYWN0ZXJzLCBhbmRcclxuICAgICAqIHBhZGRpbmcgd2lsbCBiZSBpbmZlcnJlZC4gIElmIHRoZSBncm91cCBoYXMgb25lIG9yIHR3byBjaGFyYWN0ZXJzLCBpdCBkZWNvZGVzXHJcbiAgICAgKiB0byBvbmUgYnl0ZS4gIElmIHRoZSBncm91cCBoYXMgdGhyZWUgY2hhcmFjdGVycywgaXQgZGVjb2RlcyB0byB0d28gYnl0ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGlucHV0IElucHV0IHRvIGRlY29kZS5cclxuICAgICAqIEBwYXJhbSB3ZWJTYWZlIFRydWUgaWYgd2Ugc2hvdWxkIHVzZSB0aGUgd2ViLXNhZmUgYWxwaGFiZXQuXHJcbiAgICAgKiBAcmV0dXJuIGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgZGVjb2RlZCB2YWx1ZS5cclxuICAgICAqL1xyXG4gICAgZGVjb2RlU3RyaW5nVG9CeXRlQXJyYXkoaW5wdXQsIHdlYlNhZmUpIHtcclxuICAgICAgICB0aGlzLmluaXRfKCk7XHJcbiAgICAgICAgY29uc3QgY2hhclRvQnl0ZU1hcCA9IHdlYlNhZmVcclxuICAgICAgICAgICAgPyB0aGlzLmNoYXJUb0J5dGVNYXBXZWJTYWZlX1xyXG4gICAgICAgICAgICA6IHRoaXMuY2hhclRvQnl0ZU1hcF87XHJcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ5dGUxID0gY2hhclRvQnl0ZU1hcFtpbnB1dC5jaGFyQXQoaSsrKV07XHJcbiAgICAgICAgICAgIGNvbnN0IGhhdmVCeXRlMiA9IGkgPCBpbnB1dC5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ5dGUyID0gaGF2ZUJ5dGUyID8gY2hhclRvQnl0ZU1hcFtpbnB1dC5jaGFyQXQoaSldIDogMDtcclxuICAgICAgICAgICAgKytpO1xyXG4gICAgICAgICAgICBjb25zdCBoYXZlQnl0ZTMgPSBpIDwgaW5wdXQubGVuZ3RoO1xyXG4gICAgICAgICAgICBjb25zdCBieXRlMyA9IGhhdmVCeXRlMyA/IGNoYXJUb0J5dGVNYXBbaW5wdXQuY2hhckF0KGkpXSA6IDY0O1xyXG4gICAgICAgICAgICArK2k7XHJcbiAgICAgICAgICAgIGNvbnN0IGhhdmVCeXRlNCA9IGkgPCBpbnB1dC5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ5dGU0ID0gaGF2ZUJ5dGU0ID8gY2hhclRvQnl0ZU1hcFtpbnB1dC5jaGFyQXQoaSldIDogNjQ7XHJcbiAgICAgICAgICAgICsraTtcclxuICAgICAgICAgICAgaWYgKGJ5dGUxID09IG51bGwgfHwgYnl0ZTIgPT0gbnVsbCB8fCBieXRlMyA9PSBudWxsIHx8IGJ5dGU0ID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3Qgb3V0Qnl0ZTEgPSAoYnl0ZTEgPDwgMikgfCAoYnl0ZTIgPj4gNCk7XHJcbiAgICAgICAgICAgIG91dHB1dC5wdXNoKG91dEJ5dGUxKTtcclxuICAgICAgICAgICAgaWYgKGJ5dGUzICE9PSA2NCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0Qnl0ZTIgPSAoKGJ5dGUyIDw8IDQpICYgMHhmMCkgfCAoYnl0ZTMgPj4gMik7XHJcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChvdXRCeXRlMik7XHJcbiAgICAgICAgICAgICAgICBpZiAoYnl0ZTQgIT09IDY0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0Qnl0ZTMgPSAoKGJ5dGUzIDw8IDYpICYgMHhjMCkgfCBieXRlNDtcclxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChvdXRCeXRlMyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIExhenkgc3RhdGljIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLiBDYWxsZWQgYmVmb3JlXHJcbiAgICAgKiBhY2Nlc3NpbmcgYW55IG9mIHRoZSBzdGF0aWMgbWFwIHZhcmlhYmxlcy5cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIGluaXRfKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5ieXRlVG9DaGFyTWFwXykge1xyXG4gICAgICAgICAgICB0aGlzLmJ5dGVUb0NoYXJNYXBfID0ge307XHJcbiAgICAgICAgICAgIHRoaXMuY2hhclRvQnl0ZU1hcF8gPSB7fTtcclxuICAgICAgICAgICAgdGhpcy5ieXRlVG9DaGFyTWFwV2ViU2FmZV8gPSB7fTtcclxuICAgICAgICAgICAgdGhpcy5jaGFyVG9CeXRlTWFwV2ViU2FmZV8gPSB7fTtcclxuICAgICAgICAgICAgLy8gV2Ugd2FudCBxdWljayBtYXBwaW5ncyBiYWNrIGFuZCBmb3J0aCwgc28gd2UgcHJlY29tcHV0ZSB0d28gbWFwcy5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLkVOQ09ERURfVkFMUy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ieXRlVG9DaGFyTWFwX1tpXSA9IHRoaXMuRU5DT0RFRF9WQUxTLmNoYXJBdChpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhclRvQnl0ZU1hcF9bdGhpcy5ieXRlVG9DaGFyTWFwX1tpXV0gPSBpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ieXRlVG9DaGFyTWFwV2ViU2FmZV9baV0gPSB0aGlzLkVOQ09ERURfVkFMU19XRUJTQUZFLmNoYXJBdChpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhclRvQnl0ZU1hcFdlYlNhZmVfW3RoaXMuYnl0ZVRvQ2hhck1hcFdlYlNhZmVfW2ldXSA9IGk7XHJcbiAgICAgICAgICAgICAgICAvLyBCZSBmb3JnaXZpbmcgd2hlbiBkZWNvZGluZyBhbmQgY29ycmVjdGx5IGRlY29kZSBib3RoIGVuY29kaW5ncy5cclxuICAgICAgICAgICAgICAgIGlmIChpID49IHRoaXMuRU5DT0RFRF9WQUxTX0JBU0UubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFyVG9CeXRlTWFwX1t0aGlzLkVOQ09ERURfVkFMU19XRUJTQUZFLmNoYXJBdChpKV0gPSBpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhclRvQnl0ZU1hcFdlYlNhZmVfW3RoaXMuRU5DT0RFRF9WQUxTLmNoYXJBdChpKV0gPSBpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG4vKipcclxuICogVVJMLXNhZmUgYmFzZTY0IGVuY29kaW5nXHJcbiAqL1xyXG5jb25zdCBiYXNlNjRFbmNvZGUgPSBmdW5jdGlvbiAoc3RyKSB7XHJcbiAgICBjb25zdCB1dGY4Qnl0ZXMgPSBzdHJpbmdUb0J5dGVBcnJheSQxKHN0cik7XHJcbiAgICByZXR1cm4gYmFzZTY0LmVuY29kZUJ5dGVBcnJheSh1dGY4Qnl0ZXMsIHRydWUpO1xyXG59O1xyXG4vKipcclxuICogVVJMLXNhZmUgYmFzZTY0IGVuY29kaW5nICh3aXRob3V0IFwiLlwiIHBhZGRpbmcgaW4gdGhlIGVuZCkuXHJcbiAqIGUuZy4gVXNlZCBpbiBKU09OIFdlYiBUb2tlbiAoSldUKSBwYXJ0cy5cclxuICovXHJcbmNvbnN0IGJhc2U2NHVybEVuY29kZVdpdGhvdXRQYWRkaW5nID0gZnVuY3Rpb24gKHN0cikge1xyXG4gICAgLy8gVXNlIGJhc2U2NHVybCBlbmNvZGluZyBhbmQgcmVtb3ZlIHBhZGRpbmcgaW4gdGhlIGVuZCAoZG90IGNoYXJhY3RlcnMpLlxyXG4gICAgcmV0dXJuIGJhc2U2NEVuY29kZShzdHIpLnJlcGxhY2UoL1xcLi9nLCAnJyk7XHJcbn07XHJcbi8qKlxyXG4gKiBVUkwtc2FmZSBiYXNlNjQgZGVjb2RpbmdcclxuICpcclxuICogTk9URTogRE8gTk9UIHVzZSB0aGUgZ2xvYmFsIGF0b2IoKSBmdW5jdGlvbiAtIGl0IGRvZXMgTk9UIHN1cHBvcnQgdGhlXHJcbiAqIGJhc2U2NFVybCB2YXJpYW50IGVuY29kaW5nLlxyXG4gKlxyXG4gKiBAcGFyYW0gc3RyIFRvIGJlIGRlY29kZWRcclxuICogQHJldHVybiBEZWNvZGVkIHJlc3VsdCwgaWYgcG9zc2libGVcclxuICovXHJcbmNvbnN0IGJhc2U2NERlY29kZSA9IGZ1bmN0aW9uIChzdHIpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgcmV0dXJuIGJhc2U2NC5kZWNvZGVTdHJpbmcoc3RyLCB0cnVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignYmFzZTY0RGVjb2RlIGZhaWxlZDogJywgZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxufTtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIERvIGEgZGVlcC1jb3B5IG9mIGJhc2ljIEphdmFTY3JpcHQgT2JqZWN0cyBvciBBcnJheXMuXHJcbiAqL1xyXG5mdW5jdGlvbiBkZWVwQ29weSh2YWx1ZSkge1xyXG4gICAgcmV0dXJuIGRlZXBFeHRlbmQodW5kZWZpbmVkLCB2YWx1ZSk7XHJcbn1cclxuLyoqXHJcbiAqIENvcHkgcHJvcGVydGllcyBmcm9tIHNvdXJjZSB0byB0YXJnZXQgKHJlY3Vyc2l2ZWx5IGFsbG93cyBleHRlbnNpb25cclxuICogb2YgT2JqZWN0cyBhbmQgQXJyYXlzKS4gIFNjYWxhciB2YWx1ZXMgaW4gdGhlIHRhcmdldCBhcmUgb3Zlci13cml0dGVuLlxyXG4gKiBJZiB0YXJnZXQgaXMgdW5kZWZpbmVkLCBhbiBvYmplY3Qgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUgd2lsbCBiZSBjcmVhdGVkXHJcbiAqIChhbmQgcmV0dXJuZWQpLlxyXG4gKlxyXG4gKiBXZSByZWN1cnNpdmVseSBjb3B5IGFsbCBjaGlsZCBwcm9wZXJ0aWVzIG9mIHBsYWluIE9iamVjdHMgaW4gdGhlIHNvdXJjZS0gc29cclxuICogdGhhdCBuYW1lc3BhY2UtIGxpa2UgZGljdGlvbmFyaWVzIGFyZSBtZXJnZWQuXHJcbiAqXHJcbiAqIE5vdGUgdGhhdCB0aGUgdGFyZ2V0IGNhbiBiZSBhIGZ1bmN0aW9uLCBpbiB3aGljaCBjYXNlIHRoZSBwcm9wZXJ0aWVzIGluXHJcbiAqIHRoZSBzb3VyY2UgT2JqZWN0IGFyZSBjb3BpZWQgb250byBpdCBhcyBzdGF0aWMgcHJvcGVydGllcyBvZiB0aGUgRnVuY3Rpb24uXHJcbiAqXHJcbiAqIE5vdGU6IHdlIGRvbid0IG1lcmdlIF9fcHJvdG9fXyB0byBwcmV2ZW50IHByb3RvdHlwZSBwb2xsdXRpb25cclxuICovXHJcbmZ1bmN0aW9uIGRlZXBFeHRlbmQodGFyZ2V0LCBzb3VyY2UpIHtcclxuICAgIGlmICghKHNvdXJjZSBpbnN0YW5jZW9mIE9iamVjdCkpIHtcclxuICAgICAgICByZXR1cm4gc291cmNlO1xyXG4gICAgfVxyXG4gICAgc3dpdGNoIChzb3VyY2UuY29uc3RydWN0b3IpIHtcclxuICAgICAgICBjYXNlIERhdGU6XHJcbiAgICAgICAgICAgIC8vIFRyZWF0IERhdGVzIGxpa2Ugc2NhbGFyczsgaWYgdGhlIHRhcmdldCBkYXRlIG9iamVjdCBoYWQgYW55IGNoaWxkXHJcbiAgICAgICAgICAgIC8vIHByb3BlcnRpZXMgLSB0aGV5IHdpbGwgYmUgbG9zdCFcclxuICAgICAgICAgICAgY29uc3QgZGF0ZVZhbHVlID0gc291cmNlO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoZGF0ZVZhbHVlLmdldFRpbWUoKSk7XHJcbiAgICAgICAgY2FzZSBPYmplY3Q6XHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0ge307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBBcnJheTpcclxuICAgICAgICAgICAgLy8gQWx3YXlzIGNvcHkgdGhlIGFycmF5IHNvdXJjZSBhbmQgb3ZlcndyaXRlIHRoZSB0YXJnZXQuXHJcbiAgICAgICAgICAgIHRhcmdldCA9IFtdO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAvLyBOb3QgYSBwbGFpbiBPYmplY3QgLSB0cmVhdCBpdCBhcyBhIHNjYWxhci5cclxuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZTtcclxuICAgIH1cclxuICAgIGZvciAoY29uc3QgcHJvcCBpbiBzb3VyY2UpIHtcclxuICAgICAgICAvLyB1c2UgaXNWYWxpZEtleSB0byBndWFyZCBhZ2FpbnN0IHByb3RvdHlwZSBwb2xsdXRpb24uIFNlZSBodHRwczovL3NueWsuaW8vdnVsbi9TTllLLUpTLUxPREFTSC00NTAyMDJcclxuICAgICAgICBpZiAoIXNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSB8fCAhaXNWYWxpZEtleShwcm9wKSkge1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGFyZ2V0W3Byb3BdID0gZGVlcEV4dGVuZCh0YXJnZXRbcHJvcF0sIHNvdXJjZVtwcm9wXSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGFyZ2V0O1xyXG59XHJcbmZ1bmN0aW9uIGlzVmFsaWRLZXkoa2V5KSB7XHJcbiAgICByZXR1cm4ga2V5ICE9PSAnX19wcm90b19fJztcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jbGFzcyBEZWZlcnJlZCB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLnJlamVjdCA9ICgpID0+IHsgfTtcclxuICAgICAgICB0aGlzLnJlc29sdmUgPSAoKSA9PiB7IH07XHJcbiAgICAgICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlO1xyXG4gICAgICAgICAgICB0aGlzLnJlamVjdCA9IHJlamVjdDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogT3VyIEFQSSBpbnRlcm5hbHMgYXJlIG5vdCBwcm9taXNlaWZpZWQgYW5kIGNhbm5vdCBiZWNhdXNlIG91ciBjYWxsYmFjayBBUElzIGhhdmUgc3VidGxlIGV4cGVjdGF0aW9ucyBhcm91bmRcclxuICAgICAqIGludm9raW5nIHByb21pc2VzIGlubGluZSwgd2hpY2ggUHJvbWlzZXMgYXJlIGZvcmJpZGRlbiB0byBkby4gVGhpcyBtZXRob2QgYWNjZXB0cyBhbiBvcHRpb25hbCBub2RlLXN0eWxlIGNhbGxiYWNrXHJcbiAgICAgKiBhbmQgcmV0dXJucyBhIG5vZGUtc3R5bGUgY2FsbGJhY2sgd2hpY2ggd2lsbCByZXNvbHZlIG9yIHJlamVjdCB0aGUgRGVmZXJyZWQncyBwcm9taXNlLlxyXG4gICAgICovXHJcbiAgICB3cmFwQ2FsbGJhY2soY2FsbGJhY2spIHtcclxuICAgICAgICByZXR1cm4gKGVycm9yLCB2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgLy8gQXR0YWNoaW5nIG5vb3AgaGFuZGxlciBqdXN0IGluIGNhc2UgZGV2ZWxvcGVyIHdhc24ndCBleHBlY3RpbmdcclxuICAgICAgICAgICAgICAgIC8vIHByb21pc2VzXHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuY2F0Y2goKCkgPT4geyB9KTtcclxuICAgICAgICAgICAgICAgIC8vIFNvbWUgb2Ygb3VyIGNhbGxiYWNrcyBkb24ndCBleHBlY3QgYSB2YWx1ZSBhbmQgb3VyIG93biB0ZXN0c1xyXG4gICAgICAgICAgICAgICAgLy8gYXNzZXJ0IHRoYXQgdGhlIHBhcmFtZXRlciBsZW5ndGggaXMgMVxyXG4gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycm9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycm9yLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIGNyZWF0ZU1vY2tVc2VyVG9rZW4odG9rZW4sIHByb2plY3RJZCkge1xyXG4gICAgaWYgKHRva2VuLnVpZCkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIFwidWlkXCIgZmllbGQgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBieSBtb2NrVXNlclRva2VuLiBQbGVhc2UgdXNlIFwic3ViXCIgaW5zdGVhZCBmb3IgRmlyZWJhc2UgQXV0aCBVc2VyIElELicpO1xyXG4gICAgfVxyXG4gICAgLy8gVW5zZWN1cmVkIEpXVHMgdXNlIFwibm9uZVwiIGFzIHRoZSBhbGdvcml0aG0uXHJcbiAgICBjb25zdCBoZWFkZXIgPSB7XHJcbiAgICAgICAgYWxnOiAnbm9uZScsXHJcbiAgICAgICAgdHlwZTogJ0pXVCdcclxuICAgIH07XHJcbiAgICBjb25zdCBwcm9qZWN0ID0gcHJvamVjdElkIHx8ICdkZW1vLXByb2plY3QnO1xyXG4gICAgY29uc3QgaWF0ID0gdG9rZW4uaWF0IHx8IDA7XHJcbiAgICBjb25zdCBzdWIgPSB0b2tlbi5zdWIgfHwgdG9rZW4udXNlcl9pZDtcclxuICAgIGlmICghc3ViKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibW9ja1VzZXJUb2tlbiBtdXN0IGNvbnRhaW4gJ3N1Yicgb3IgJ3VzZXJfaWQnIGZpZWxkIVwiKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHBheWxvYWQgPSBPYmplY3QuYXNzaWduKHsgXHJcbiAgICAgICAgLy8gU2V0IGFsbCByZXF1aXJlZCBmaWVsZHMgdG8gZGVjZW50IGRlZmF1bHRzXHJcbiAgICAgICAgaXNzOiBgaHR0cHM6Ly9zZWN1cmV0b2tlbi5nb29nbGUuY29tLyR7cHJvamVjdH1gLCBhdWQ6IHByb2plY3QsIGlhdCwgZXhwOiBpYXQgKyAzNjAwLCBhdXRoX3RpbWU6IGlhdCwgc3ViLCB1c2VyX2lkOiBzdWIsIGZpcmViYXNlOiB7XHJcbiAgICAgICAgICAgIHNpZ25faW5fcHJvdmlkZXI6ICdjdXN0b20nLFxyXG4gICAgICAgICAgICBpZGVudGl0aWVzOiB7fVxyXG4gICAgICAgIH0gfSwgdG9rZW4pO1xyXG4gICAgLy8gVW5zZWN1cmVkIEpXVHMgdXNlIHRoZSBlbXB0eSBzdHJpbmcgYXMgYSBzaWduYXR1cmUuXHJcbiAgICBjb25zdCBzaWduYXR1cmUgPSAnJztcclxuICAgIHJldHVybiBbXHJcbiAgICAgICAgYmFzZTY0dXJsRW5jb2RlV2l0aG91dFBhZGRpbmcoSlNPTi5zdHJpbmdpZnkoaGVhZGVyKSksXHJcbiAgICAgICAgYmFzZTY0dXJsRW5jb2RlV2l0aG91dFBhZGRpbmcoSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpLFxyXG4gICAgICAgIHNpZ25hdHVyZVxyXG4gICAgXS5qb2luKCcuJyk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFJldHVybnMgbmF2aWdhdG9yLnVzZXJBZ2VudCBzdHJpbmcgb3IgJycgaWYgaXQncyBub3QgZGVmaW5lZC5cclxuICogQHJldHVybiB1c2VyIGFnZW50IHN0cmluZ1xyXG4gKi9cclxuZnVuY3Rpb24gZ2V0VUEoKSB7XHJcbiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiZcclxuICAgICAgICB0eXBlb2YgbmF2aWdhdG9yWyd1c2VyQWdlbnQnXSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICByZXR1cm4gbmF2aWdhdG9yWyd1c2VyQWdlbnQnXTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxufVxyXG4vKipcclxuICogRGV0ZWN0IENvcmRvdmEgLyBQaG9uZUdhcCAvIElvbmljIGZyYW1ld29ya3Mgb24gYSBtb2JpbGUgZGV2aWNlLlxyXG4gKlxyXG4gKiBEZWxpYmVyYXRlbHkgZG9lcyBub3QgcmVseSBvbiBjaGVja2luZyBgZmlsZTovL2AgVVJMcyAoYXMgdGhpcyBmYWlscyBQaG9uZUdhcFxyXG4gKiBpbiB0aGUgUmlwcGxlIGVtdWxhdG9yKSBub3IgQ29yZG92YSBgb25EZXZpY2VSZWFkeWAsIHdoaWNoIHdvdWxkIG5vcm1hbGx5XHJcbiAqIHdhaXQgZm9yIGEgY2FsbGJhY2suXHJcbiAqL1xyXG5mdW5jdGlvbiBpc01vYmlsZUNvcmRvdmEoKSB7XHJcbiAgICByZXR1cm4gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBTZXR0aW5nIHVwIGFuIGJyb2FkbHkgYXBwbGljYWJsZSBpbmRleCBzaWduYXR1cmUgZm9yIFdpbmRvd1xyXG4gICAgICAgIC8vIGp1c3QgdG8gZGVhbCB3aXRoIHRoaXMgY2FzZSB3b3VsZCBwcm9iYWJseSBiZSBhIGJhZCBpZGVhLlxyXG4gICAgICAgICEhKHdpbmRvd1snY29yZG92YSddIHx8IHdpbmRvd1sncGhvbmVnYXAnXSB8fCB3aW5kb3dbJ1Bob25lR2FwJ10pICYmXHJcbiAgICAgICAgL2lvc3xpcGhvbmV8aXBvZHxpcGFkfGFuZHJvaWR8YmxhY2tiZXJyeXxpZW1vYmlsZS9pLnRlc3QoZ2V0VUEoKSkpO1xyXG59XHJcbi8qKlxyXG4gKiBEZXRlY3QgTm9kZS5qcy5cclxuICpcclxuICogQHJldHVybiB0cnVlIGlmIE5vZGUuanMgZW52aXJvbm1lbnQgaXMgZGV0ZWN0ZWQuXHJcbiAqL1xyXG4vLyBOb2RlIGRldGVjdGlvbiBsb2dpYyBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vaWxpYWthbi9kZXRlY3Qtbm9kZS9cclxuZnVuY3Rpb24gaXNOb2RlKCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChnbG9iYWwucHJvY2VzcykgPT09ICdbb2JqZWN0IHByb2Nlc3NdJyk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogRGV0ZWN0IEJyb3dzZXIgRW52aXJvbm1lbnRcclxuICovXHJcbmZ1bmN0aW9uIGlzQnJvd3NlcigpIHtcclxuICAgIHJldHVybiB0eXBlb2Ygc2VsZiA9PT0gJ29iamVjdCcgJiYgc2VsZi5zZWxmID09PSBzZWxmO1xyXG59XHJcbmZ1bmN0aW9uIGlzQnJvd3NlckV4dGVuc2lvbigpIHtcclxuICAgIGNvbnN0IHJ1bnRpbWUgPSB0eXBlb2YgY2hyb21lID09PSAnb2JqZWN0J1xyXG4gICAgICAgID8gY2hyb21lLnJ1bnRpbWVcclxuICAgICAgICA6IHR5cGVvZiBicm93c2VyID09PSAnb2JqZWN0J1xyXG4gICAgICAgICAgICA/IGJyb3dzZXIucnVudGltZVxyXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcclxuICAgIHJldHVybiB0eXBlb2YgcnVudGltZSA9PT0gJ29iamVjdCcgJiYgcnVudGltZS5pZCAhPT0gdW5kZWZpbmVkO1xyXG59XHJcbi8qKlxyXG4gKiBEZXRlY3QgUmVhY3QgTmF0aXZlLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHRydWUgaWYgUmVhY3ROYXRpdmUgZW52aXJvbm1lbnQgaXMgZGV0ZWN0ZWQuXHJcbiAqL1xyXG5mdW5jdGlvbiBpc1JlYWN0TmF0aXZlKCkge1xyXG4gICAgcmV0dXJuICh0eXBlb2YgbmF2aWdhdG9yID09PSAnb2JqZWN0JyAmJiBuYXZpZ2F0b3JbJ3Byb2R1Y3QnXSA9PT0gJ1JlYWN0TmF0aXZlJyk7XHJcbn1cclxuLyoqIERldGVjdHMgRWxlY3Ryb24gYXBwcy4gKi9cclxuZnVuY3Rpb24gaXNFbGVjdHJvbigpIHtcclxuICAgIHJldHVybiBnZXRVQSgpLmluZGV4T2YoJ0VsZWN0cm9uLycpID49IDA7XHJcbn1cclxuLyoqIERldGVjdHMgSW50ZXJuZXQgRXhwbG9yZXIuICovXHJcbmZ1bmN0aW9uIGlzSUUoKSB7XHJcbiAgICBjb25zdCB1YSA9IGdldFVBKCk7XHJcbiAgICByZXR1cm4gdWEuaW5kZXhPZignTVNJRSAnKSA+PSAwIHx8IHVhLmluZGV4T2YoJ1RyaWRlbnQvJykgPj0gMDtcclxufVxyXG4vKiogRGV0ZWN0cyBVbml2ZXJzYWwgV2luZG93cyBQbGF0Zm9ybSBhcHBzLiAqL1xyXG5mdW5jdGlvbiBpc1VXUCgpIHtcclxuICAgIHJldHVybiBnZXRVQSgpLmluZGV4T2YoJ01TQXBwSG9zdC8nKSA+PSAwO1xyXG59XHJcbi8qKlxyXG4gKiBEZXRlY3Qgd2hldGhlciB0aGUgY3VycmVudCBTREsgYnVpbGQgaXMgdGhlIE5vZGUgdmVyc2lvbi5cclxuICpcclxuICogQHJldHVybiB0cnVlIGlmIGl0J3MgdGhlIE5vZGUgU0RLIGJ1aWxkLlxyXG4gKi9cclxuZnVuY3Rpb24gaXNOb2RlU2RrKCkge1xyXG4gICAgcmV0dXJuIENPTlNUQU5UUy5OT0RFX0NMSUVOVCA9PT0gdHJ1ZSB8fCBDT05TVEFOVFMuTk9ERV9BRE1JTiA9PT0gdHJ1ZTtcclxufVxyXG4vKiogUmV0dXJucyB0cnVlIGlmIHdlIGFyZSBydW5uaW5nIGluIFNhZmFyaS4gKi9cclxuZnVuY3Rpb24gaXNTYWZhcmkoKSB7XHJcbiAgICByZXR1cm4gKCFpc05vZGUoKSAmJlxyXG4gICAgICAgIG5hdmlnYXRvci51c2VyQWdlbnQuaW5jbHVkZXMoJ1NhZmFyaScpICYmXHJcbiAgICAgICAgIW5hdmlnYXRvci51c2VyQWdlbnQuaW5jbHVkZXMoJ0Nocm9tZScpKTtcclxufVxyXG4vKipcclxuICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIGluZGV4ZWREQiBpcyBzdXBwb3J0ZWQgYnkgY3VycmVudCBicm93c2VyL3NlcnZpY2Ugd29ya2VyIGNvbnRleHRcclxuICogQHJldHVybiB0cnVlIGlmIGluZGV4ZWREQiBpcyBzdXBwb3J0ZWQgYnkgY3VycmVudCBicm93c2VyL3NlcnZpY2Ugd29ya2VyIGNvbnRleHRcclxuICovXHJcbmZ1bmN0aW9uIGlzSW5kZXhlZERCQXZhaWxhYmxlKCkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiBpbmRleGVkREIgPT09ICdvYmplY3QnO1xyXG59XHJcbi8qKlxyXG4gKiBUaGlzIG1ldGhvZCB2YWxpZGF0ZXMgYnJvd3Nlci9zdyBjb250ZXh0IGZvciBpbmRleGVkREIgYnkgb3BlbmluZyBhIGR1bW15IGluZGV4ZWREQiBkYXRhYmFzZSBhbmQgcmVqZWN0XHJcbiAqIGlmIGVycm9ycyBvY2N1ciBkdXJpbmcgdGhlIGRhdGFiYXNlIG9wZW4gb3BlcmF0aW9uLlxyXG4gKlxyXG4gKiBAdGhyb3dzIGV4Y2VwdGlvbiBpZiBjdXJyZW50IGJyb3dzZXIvc3cgY29udGV4dCBjYW4ndCBydW4gaWRiLm9wZW4gKGV4OiBTYWZhcmkgaWZyYW1lLCBGaXJlZm94XHJcbiAqIHByaXZhdGUgYnJvd3NpbmcpXHJcbiAqL1xyXG5mdW5jdGlvbiB2YWxpZGF0ZUluZGV4ZWREQk9wZW5hYmxlKCkge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgcHJlRXhpc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICBjb25zdCBEQl9DSEVDS19OQU1FID0gJ3ZhbGlkYXRlLWJyb3dzZXItY29udGV4dC1mb3ItaW5kZXhlZGRiLWFuYWx5dGljcy1tb2R1bGUnO1xyXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gc2VsZi5pbmRleGVkREIub3BlbihEQl9DSEVDS19OQU1FKTtcclxuICAgICAgICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0LnJlc3VsdC5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgLy8gZGVsZXRlIGRhdGFiYXNlIG9ubHkgd2hlbiBpdCBkb2Vzbid0IHByZS1leGlzdFxyXG4gICAgICAgICAgICAgICAgaWYgKCFwcmVFeGlzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuaW5kZXhlZERCLmRlbGV0ZURhdGFiYXNlKERCX0NIRUNLX05BTUUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBwcmVFeGlzdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoKChfYSA9IHJlcXVlc3QuZXJyb3IpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tZXNzYWdlKSB8fCAnJyk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59XHJcbi8qKlxyXG4gKlxyXG4gKiBUaGlzIG1ldGhvZCBjaGVja3Mgd2hldGhlciBjb29raWUgaXMgZW5hYmxlZCB3aXRoaW4gY3VycmVudCBicm93c2VyXHJcbiAqIEByZXR1cm4gdHJ1ZSBpZiBjb29raWUgaXMgZW5hYmxlZCB3aXRoaW4gY3VycmVudCBicm93c2VyXHJcbiAqL1xyXG5mdW5jdGlvbiBhcmVDb29raWVzRW5hYmxlZCgpIHtcclxuICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSAndW5kZWZpbmVkJyB8fCAhbmF2aWdhdG9yLmNvb2tpZUVuYWJsZWQpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG4vKipcclxuICogUG9seWZpbGwgZm9yIGBnbG9iYWxUaGlzYCBvYmplY3QuXHJcbiAqIEByZXR1cm5zIHRoZSBgZ2xvYmFsVGhpc2Agb2JqZWN0IGZvciB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRHbG9iYWwoKSB7XHJcbiAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgcmV0dXJuIHNlbGY7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICByZXR1cm4gd2luZG93O1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgcmV0dXJuIGdsb2JhbDtcclxuICAgIH1cclxuICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGxvY2F0ZSBnbG9iYWwgb2JqZWN0LicpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBAZmlsZW92ZXJ2aWV3IFN0YW5kYXJkaXplZCBGaXJlYmFzZSBFcnJvci5cclxuICpcclxuICogVXNhZ2U6XHJcbiAqXHJcbiAqICAgLy8gVHlwZXNjcmlwdCBzdHJpbmcgbGl0ZXJhbHMgZm9yIHR5cGUtc2FmZSBjb2Rlc1xyXG4gKiAgIHR5cGUgRXJyID1cclxuICogICAgICd1bmtub3duJyB8XHJcbiAqICAgICAnb2JqZWN0LW5vdC1mb3VuZCdcclxuICogICAgIDtcclxuICpcclxuICogICAvLyBDbG9zdXJlIGVudW0gZm9yIHR5cGUtc2FmZSBlcnJvciBjb2Rlc1xyXG4gKiAgIC8vIGF0LWVudW0ge3N0cmluZ31cclxuICogICB2YXIgRXJyID0ge1xyXG4gKiAgICAgVU5LTk9XTjogJ3Vua25vd24nLFxyXG4gKiAgICAgT0JKRUNUX05PVF9GT1VORDogJ29iamVjdC1ub3QtZm91bmQnLFxyXG4gKiAgIH1cclxuICpcclxuICogICBsZXQgZXJyb3JzOiBNYXA8RXJyLCBzdHJpbmc+ID0ge1xyXG4gKiAgICAgJ2dlbmVyaWMtZXJyb3InOiBcIlVua25vd24gZXJyb3JcIixcclxuICogICAgICdmaWxlLW5vdC1mb3VuZCc6IFwiQ291bGQgbm90IGZpbmQgZmlsZTogeyRmaWxlfVwiLFxyXG4gKiAgIH07XHJcbiAqXHJcbiAqICAgLy8gVHlwZS1zYWZlIGZ1bmN0aW9uIC0gbXVzdCBwYXNzIGEgdmFsaWQgZXJyb3IgY29kZSBhcyBwYXJhbS5cclxuICogICBsZXQgZXJyb3IgPSBuZXcgRXJyb3JGYWN0b3J5PEVycj4oJ3NlcnZpY2UnLCAnU2VydmljZScsIGVycm9ycyk7XHJcbiAqXHJcbiAqICAgLi4uXHJcbiAqICAgdGhyb3cgZXJyb3IuY3JlYXRlKEVyci5HRU5FUklDKTtcclxuICogICAuLi5cclxuICogICB0aHJvdyBlcnJvci5jcmVhdGUoRXJyLkZJTEVfTk9UX0ZPVU5ELCB7J2ZpbGUnOiBmaWxlTmFtZX0pO1xyXG4gKiAgIC4uLlxyXG4gKiAgIC8vIFNlcnZpY2U6IENvdWxkIG5vdCBmaWxlIGZpbGU6IGZvby50eHQgKHNlcnZpY2UvZmlsZS1ub3QtZm91bmQpLlxyXG4gKlxyXG4gKiAgIGNhdGNoIChlKSB7XHJcbiAqICAgICBhc3NlcnQoZS5tZXNzYWdlID09PSBcIkNvdWxkIG5vdCBmaW5kIGZpbGU6IGZvby50eHQuXCIpO1xyXG4gKiAgICAgaWYgKGUuY29kZSA9PT0gJ3NlcnZpY2UvZmlsZS1ub3QtZm91bmQnKSB7XHJcbiAqICAgICAgIGNvbnNvbGUubG9nKFwiQ291bGQgbm90IHJlYWQgZmlsZTogXCIgKyBlWydmaWxlJ10pO1xyXG4gKiAgICAgfVxyXG4gKiAgIH1cclxuICovXHJcbmNvbnN0IEVSUk9SX05BTUUgPSAnRmlyZWJhc2VFcnJvcic7XHJcbi8vIEJhc2VkIG9uIGNvZGUgZnJvbTpcclxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRXJyb3IjQ3VzdG9tX0Vycm9yX1R5cGVzXHJcbmNsYXNzIEZpcmViYXNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgIC8qKiBUaGUgZXJyb3IgY29kZSBmb3IgdGhpcyBlcnJvci4gKi9cclxuICAgIGNvZGUsIG1lc3NhZ2UsIFxyXG4gICAgLyoqIEN1c3RvbSBkYXRhIGZvciB0aGlzIGVycm9yLiAqL1xyXG4gICAgY3VzdG9tRGF0YSkge1xyXG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xyXG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XHJcbiAgICAgICAgdGhpcy5jdXN0b21EYXRhID0gY3VzdG9tRGF0YTtcclxuICAgICAgICAvKiogVGhlIGN1c3RvbSBuYW1lIGZvciBhbGwgRmlyZWJhc2VFcnJvcnMuICovXHJcbiAgICAgICAgdGhpcy5uYW1lID0gRVJST1JfTkFNRTtcclxuICAgICAgICAvLyBGaXggRm9yIEVTNVxyXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC13aWtpL2Jsb2IvbWFzdGVyL0JyZWFraW5nLUNoYW5nZXMubWQjZXh0ZW5kaW5nLWJ1aWx0LWlucy1saWtlLWVycm9yLWFycmF5LWFuZC1tYXAtbWF5LW5vLWxvbmdlci13b3JrXHJcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIEZpcmViYXNlRXJyb3IucHJvdG90eXBlKTtcclxuICAgICAgICAvLyBNYWludGFpbnMgcHJvcGVyIHN0YWNrIHRyYWNlIGZvciB3aGVyZSBvdXIgZXJyb3Igd2FzIHRocm93bi5cclxuICAgICAgICAvLyBPbmx5IGF2YWlsYWJsZSBvbiBWOC5cclxuICAgICAgICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcclxuICAgICAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgRXJyb3JGYWN0b3J5LnByb3RvdHlwZS5jcmVhdGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5jbGFzcyBFcnJvckZhY3Rvcnkge1xyXG4gICAgY29uc3RydWN0b3Ioc2VydmljZSwgc2VydmljZU5hbWUsIGVycm9ycykge1xyXG4gICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lO1xyXG4gICAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xyXG4gICAgfVxyXG4gICAgY3JlYXRlKGNvZGUsIC4uLmRhdGEpIHtcclxuICAgICAgICBjb25zdCBjdXN0b21EYXRhID0gZGF0YVswXSB8fCB7fTtcclxuICAgICAgICBjb25zdCBmdWxsQ29kZSA9IGAke3RoaXMuc2VydmljZX0vJHtjb2RlfWA7XHJcbiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSB0aGlzLmVycm9yc1tjb2RlXTtcclxuICAgICAgICBjb25zdCBtZXNzYWdlID0gdGVtcGxhdGUgPyByZXBsYWNlVGVtcGxhdGUodGVtcGxhdGUsIGN1c3RvbURhdGEpIDogJ0Vycm9yJztcclxuICAgICAgICAvLyBTZXJ2aWNlIE5hbWU6IEVycm9yIG1lc3NhZ2UgKHNlcnZpY2UvY29kZSkuXHJcbiAgICAgICAgY29uc3QgZnVsbE1lc3NhZ2UgPSBgJHt0aGlzLnNlcnZpY2VOYW1lfTogJHttZXNzYWdlfSAoJHtmdWxsQ29kZX0pLmA7XHJcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRmlyZWJhc2VFcnJvcihmdWxsQ29kZSwgZnVsbE1lc3NhZ2UsIGN1c3RvbURhdGEpO1xyXG4gICAgICAgIHJldHVybiBlcnJvcjtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiByZXBsYWNlVGVtcGxhdGUodGVtcGxhdGUsIGRhdGEpIHtcclxuICAgIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKFBBVFRFUk4sIChfLCBrZXkpID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGFba2V5XTtcclxuICAgICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCA/IFN0cmluZyh2YWx1ZSkgOiBgPCR7a2V5fT8+YDtcclxuICAgIH0pO1xyXG59XHJcbmNvbnN0IFBBVFRFUk4gPSAvXFx7XFwkKFtefV0rKX0vZztcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIEV2YWx1YXRlcyBhIEpTT04gc3RyaW5nIGludG8gYSBqYXZhc2NyaXB0IG9iamVjdC5cclxuICpcclxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciBBIHN0cmluZyBjb250YWluaW5nIEpTT04uXHJcbiAqIEByZXR1cm4geyp9IFRoZSBqYXZhc2NyaXB0IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNwZWNpZmllZCBKU09OLlxyXG4gKi9cclxuZnVuY3Rpb24ganNvbkV2YWwoc3RyKSB7XHJcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzdHIpO1xyXG59XHJcbi8qKlxyXG4gKiBSZXR1cm5zIEpTT04gcmVwcmVzZW50aW5nIGEgamF2YXNjcmlwdCBvYmplY3QuXHJcbiAqIEBwYXJhbSB7Kn0gZGF0YSBKYXZhc2NyaXB0IG9iamVjdCB0byBiZSBzdHJpbmdpZmllZC5cclxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgSlNPTiBjb250ZW50cyBvZiB0aGUgb2JqZWN0LlxyXG4gKi9cclxuZnVuY3Rpb24gc3RyaW5naWZ5KGRhdGEpIHtcclxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogRGVjb2RlcyBhIEZpcmViYXNlIGF1dGguIHRva2VuIGludG8gY29uc3RpdHVlbnQgcGFydHMuXHJcbiAqXHJcbiAqIE5vdGVzOlxyXG4gKiAtIE1heSByZXR1cm4gd2l0aCBpbnZhbGlkIC8gaW5jb21wbGV0ZSBjbGFpbXMgaWYgdGhlcmUncyBubyBuYXRpdmUgYmFzZTY0IGRlY29kaW5nIHN1cHBvcnQuXHJcbiAqIC0gRG9lc24ndCBjaGVjayBpZiB0aGUgdG9rZW4gaXMgYWN0dWFsbHkgdmFsaWQuXHJcbiAqL1xyXG5jb25zdCBkZWNvZGUgPSBmdW5jdGlvbiAodG9rZW4pIHtcclxuICAgIGxldCBoZWFkZXIgPSB7fSwgY2xhaW1zID0ge30sIGRhdGEgPSB7fSwgc2lnbmF0dXJlID0gJyc7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHBhcnRzID0gdG9rZW4uc3BsaXQoJy4nKTtcclxuICAgICAgICBoZWFkZXIgPSBqc29uRXZhbChiYXNlNjREZWNvZGUocGFydHNbMF0pIHx8ICcnKTtcclxuICAgICAgICBjbGFpbXMgPSBqc29uRXZhbChiYXNlNjREZWNvZGUocGFydHNbMV0pIHx8ICcnKTtcclxuICAgICAgICBzaWduYXR1cmUgPSBwYXJ0c1syXTtcclxuICAgICAgICBkYXRhID0gY2xhaW1zWydkJ10gfHwge307XHJcbiAgICAgICAgZGVsZXRlIGNsYWltc1snZCddO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHsgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBoZWFkZXIsXHJcbiAgICAgICAgY2xhaW1zLFxyXG4gICAgICAgIGRhdGEsXHJcbiAgICAgICAgc2lnbmF0dXJlXHJcbiAgICB9O1xyXG59O1xyXG4vKipcclxuICogRGVjb2RlcyBhIEZpcmViYXNlIGF1dGguIHRva2VuIGFuZCBjaGVja3MgdGhlIHZhbGlkaXR5IG9mIGl0cyB0aW1lLWJhc2VkIGNsYWltcy4gV2lsbCByZXR1cm4gdHJ1ZSBpZiB0aGVcclxuICogdG9rZW4gaXMgd2l0aGluIHRoZSB0aW1lIHdpbmRvdyBhdXRob3JpemVkIGJ5IHRoZSAnbmJmJyAobm90LWJlZm9yZSkgYW5kICdpYXQnIChpc3N1ZWQtYXQpIGNsYWltcy5cclxuICpcclxuICogTm90ZXM6XHJcbiAqIC0gTWF5IHJldHVybiBhIGZhbHNlIG5lZ2F0aXZlIGlmIHRoZXJlJ3Mgbm8gbmF0aXZlIGJhc2U2NCBkZWNvZGluZyBzdXBwb3J0LlxyXG4gKiAtIERvZXNuJ3QgY2hlY2sgaWYgdGhlIHRva2VuIGlzIGFjdHVhbGx5IHZhbGlkLlxyXG4gKi9cclxuY29uc3QgaXNWYWxpZFRpbWVzdGFtcCA9IGZ1bmN0aW9uICh0b2tlbikge1xyXG4gICAgY29uc3QgY2xhaW1zID0gZGVjb2RlKHRva2VuKS5jbGFpbXM7XHJcbiAgICBjb25zdCBub3cgPSBNYXRoLmZsb29yKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMCk7XHJcbiAgICBsZXQgdmFsaWRTaW5jZSA9IDAsIHZhbGlkVW50aWwgPSAwO1xyXG4gICAgaWYgKHR5cGVvZiBjbGFpbXMgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgaWYgKGNsYWltcy5oYXNPd25Qcm9wZXJ0eSgnbmJmJykpIHtcclxuICAgICAgICAgICAgdmFsaWRTaW5jZSA9IGNsYWltc1snbmJmJ107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNsYWltcy5oYXNPd25Qcm9wZXJ0eSgnaWF0JykpIHtcclxuICAgICAgICAgICAgdmFsaWRTaW5jZSA9IGNsYWltc1snaWF0J107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjbGFpbXMuaGFzT3duUHJvcGVydHkoJ2V4cCcpKSB7XHJcbiAgICAgICAgICAgIHZhbGlkVW50aWwgPSBjbGFpbXNbJ2V4cCddO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gdG9rZW4gd2lsbCBleHBpcmUgYWZ0ZXIgMjRoIGJ5IGRlZmF1bHRcclxuICAgICAgICAgICAgdmFsaWRVbnRpbCA9IHZhbGlkU2luY2UgKyA4NjQwMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gKCEhbm93ICYmXHJcbiAgICAgICAgISF2YWxpZFNpbmNlICYmXHJcbiAgICAgICAgISF2YWxpZFVudGlsICYmXHJcbiAgICAgICAgbm93ID49IHZhbGlkU2luY2UgJiZcclxuICAgICAgICBub3cgPD0gdmFsaWRVbnRpbCk7XHJcbn07XHJcbi8qKlxyXG4gKiBEZWNvZGVzIGEgRmlyZWJhc2UgYXV0aC4gdG9rZW4gYW5kIHJldHVybnMgaXRzIGlzc3VlZCBhdCB0aW1lIGlmIHZhbGlkLCBudWxsIG90aGVyd2lzZS5cclxuICpcclxuICogTm90ZXM6XHJcbiAqIC0gTWF5IHJldHVybiBudWxsIGlmIHRoZXJlJ3Mgbm8gbmF0aXZlIGJhc2U2NCBkZWNvZGluZyBzdXBwb3J0LlxyXG4gKiAtIERvZXNuJ3QgY2hlY2sgaWYgdGhlIHRva2VuIGlzIGFjdHVhbGx5IHZhbGlkLlxyXG4gKi9cclxuY29uc3QgaXNzdWVkQXRUaW1lID0gZnVuY3Rpb24gKHRva2VuKSB7XHJcbiAgICBjb25zdCBjbGFpbXMgPSBkZWNvZGUodG9rZW4pLmNsYWltcztcclxuICAgIGlmICh0eXBlb2YgY2xhaW1zID09PSAnb2JqZWN0JyAmJiBjbGFpbXMuaGFzT3duUHJvcGVydHkoJ2lhdCcpKSB7XHJcbiAgICAgICAgcmV0dXJuIGNsYWltc1snaWF0J107XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxufTtcclxuLyoqXHJcbiAqIERlY29kZXMgYSBGaXJlYmFzZSBhdXRoLiB0b2tlbiBhbmQgY2hlY2tzIHRoZSB2YWxpZGl0eSBvZiBpdHMgZm9ybWF0LiBFeHBlY3RzIGEgdmFsaWQgaXNzdWVkLWF0IHRpbWUuXHJcbiAqXHJcbiAqIE5vdGVzOlxyXG4gKiAtIE1heSByZXR1cm4gYSBmYWxzZSBuZWdhdGl2ZSBpZiB0aGVyZSdzIG5vIG5hdGl2ZSBiYXNlNjQgZGVjb2Rpbmcgc3VwcG9ydC5cclxuICogLSBEb2Vzbid0IGNoZWNrIGlmIHRoZSB0b2tlbiBpcyBhY3R1YWxseSB2YWxpZC5cclxuICovXHJcbmNvbnN0IGlzVmFsaWRGb3JtYXQgPSBmdW5jdGlvbiAodG9rZW4pIHtcclxuICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGUodG9rZW4pLCBjbGFpbXMgPSBkZWNvZGVkLmNsYWltcztcclxuICAgIHJldHVybiAhIWNsYWltcyAmJiB0eXBlb2YgY2xhaW1zID09PSAnb2JqZWN0JyAmJiBjbGFpbXMuaGFzT3duUHJvcGVydHkoJ2lhdCcpO1xyXG59O1xyXG4vKipcclxuICogQXR0ZW1wdHMgdG8gcGVlciBpbnRvIGFuIGF1dGggdG9rZW4gYW5kIGRldGVybWluZSBpZiBpdCdzIGFuIGFkbWluIGF1dGggdG9rZW4gYnkgbG9va2luZyBhdCB0aGUgY2xhaW1zIHBvcnRpb24uXHJcbiAqXHJcbiAqIE5vdGVzOlxyXG4gKiAtIE1heSByZXR1cm4gYSBmYWxzZSBuZWdhdGl2ZSBpZiB0aGVyZSdzIG5vIG5hdGl2ZSBiYXNlNjQgZGVjb2Rpbmcgc3VwcG9ydC5cclxuICogLSBEb2Vzbid0IGNoZWNrIGlmIHRoZSB0b2tlbiBpcyBhY3R1YWxseSB2YWxpZC5cclxuICovXHJcbmNvbnN0IGlzQWRtaW4gPSBmdW5jdGlvbiAodG9rZW4pIHtcclxuICAgIGNvbnN0IGNsYWltcyA9IGRlY29kZSh0b2tlbikuY2xhaW1zO1xyXG4gICAgcmV0dXJuIHR5cGVvZiBjbGFpbXMgPT09ICdvYmplY3QnICYmIGNsYWltc1snYWRtaW4nXSA9PT0gdHJ1ZTtcclxufTtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gY29udGFpbnMob2JqLCBrZXkpIHtcclxuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpO1xyXG59XHJcbmZ1bmN0aW9uIHNhZmVHZXQob2JqLCBrZXkpIHtcclxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XHJcbiAgICAgICAgcmV0dXJuIG9ialtrZXldO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBpc0VtcHR5KG9iaikge1xyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XHJcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcbmZ1bmN0aW9uIG1hcChvYmosIGZuLCBjb250ZXh0T2JqKSB7XHJcbiAgICBjb25zdCByZXMgPSB7fTtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xyXG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XHJcbiAgICAgICAgICAgIHJlc1trZXldID0gZm4uY2FsbChjb250ZXh0T2JqLCBvYmpba2V5XSwga2V5LCBvYmopO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbn1cclxuLyoqXHJcbiAqIERlZXAgZXF1YWwgdHdvIG9iamVjdHMuIFN1cHBvcnQgQXJyYXlzIGFuZCBPYmplY3RzLlxyXG4gKi9cclxuZnVuY3Rpb24gZGVlcEVxdWFsKGEsIGIpIHtcclxuICAgIGlmIChhID09PSBiKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBjb25zdCBhS2V5cyA9IE9iamVjdC5rZXlzKGEpO1xyXG4gICAgY29uc3QgYktleXMgPSBPYmplY3Qua2V5cyhiKTtcclxuICAgIGZvciAoY29uc3QgayBvZiBhS2V5cykge1xyXG4gICAgICAgIGlmICghYktleXMuaW5jbHVkZXMoaykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBhUHJvcCA9IGFba107XHJcbiAgICAgICAgY29uc3QgYlByb3AgPSBiW2tdO1xyXG4gICAgICAgIGlmIChpc09iamVjdChhUHJvcCkgJiYgaXNPYmplY3QoYlByb3ApKSB7XHJcbiAgICAgICAgICAgIGlmICghZGVlcEVxdWFsKGFQcm9wLCBiUHJvcCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChhUHJvcCAhPT0gYlByb3ApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZvciAoY29uc3QgayBvZiBiS2V5cykge1xyXG4gICAgICAgIGlmICghYUtleXMuaW5jbHVkZXMoaykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcbmZ1bmN0aW9uIGlzT2JqZWN0KHRoaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpbmcgIT09IG51bGwgJiYgdHlwZW9mIHRoaW5nID09PSAnb2JqZWN0JztcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogUmV0dXJucyBhIHF1ZXJ5c3RyaW5nLWZvcm1hdHRlZCBzdHJpbmcgKGUuZy4gJmFyZz12YWwmYXJnMj12YWwyKSBmcm9tIGFcclxuICogcGFyYW1zIG9iamVjdCAoZS5nLiB7YXJnOiAndmFsJywgYXJnMjogJ3ZhbDInfSlcclxuICogTm90ZTogWW91IG11c3QgcHJlcGVuZCBpdCB3aXRoID8gd2hlbiBhZGRpbmcgaXQgdG8gYSBVUkwuXHJcbiAqL1xyXG5mdW5jdGlvbiBxdWVyeXN0cmluZyhxdWVyeXN0cmluZ1BhcmFtcykge1xyXG4gICAgY29uc3QgcGFyYW1zID0gW107XHJcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhxdWVyeXN0cmluZ1BhcmFtcykpIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgdmFsdWUuZm9yRWFjaChhcnJheVZhbCA9PiB7XHJcbiAgICAgICAgICAgICAgICBwYXJhbXMucHVzaChlbmNvZGVVUklDb21wb25lbnQoa2V5KSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChhcnJheVZhbCkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHBhcmFtcy5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBhcmFtcy5sZW5ndGggPyAnJicgKyBwYXJhbXMuam9pbignJicpIDogJyc7XHJcbn1cclxuLyoqXHJcbiAqIERlY29kZXMgYSBxdWVyeXN0cmluZyAoZS5nLiA/YXJnPXZhbCZhcmcyPXZhbDIpIGludG8gYSBwYXJhbXMgb2JqZWN0XHJcbiAqIChlLmcuIHthcmc6ICd2YWwnLCBhcmcyOiAndmFsMid9KVxyXG4gKi9cclxuZnVuY3Rpb24gcXVlcnlzdHJpbmdEZWNvZGUocXVlcnlzdHJpbmcpIHtcclxuICAgIGNvbnN0IG9iaiA9IHt9O1xyXG4gICAgY29uc3QgdG9rZW5zID0gcXVlcnlzdHJpbmcucmVwbGFjZSgvXlxcPy8sICcnKS5zcGxpdCgnJicpO1xyXG4gICAgdG9rZW5zLmZvckVhY2godG9rZW4gPT4ge1xyXG4gICAgICAgIGlmICh0b2tlbikge1xyXG4gICAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSB0b2tlbi5zcGxpdCgnPScpO1xyXG4gICAgICAgICAgICBvYmpbZGVjb2RlVVJJQ29tcG9uZW50KGtleSldID0gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBvYmo7XHJcbn1cclxuLyoqXHJcbiAqIEV4dHJhY3QgdGhlIHF1ZXJ5IHN0cmluZyBwYXJ0IG9mIGEgVVJMLCBpbmNsdWRpbmcgdGhlIGxlYWRpbmcgcXVlc3Rpb24gbWFyayAoaWYgcHJlc2VudCkuXHJcbiAqL1xyXG5mdW5jdGlvbiBleHRyYWN0UXVlcnlzdHJpbmcodXJsKSB7XHJcbiAgICBjb25zdCBxdWVyeVN0YXJ0ID0gdXJsLmluZGV4T2YoJz8nKTtcclxuICAgIGlmICghcXVlcnlTdGFydCkge1xyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuICAgIGNvbnN0IGZyYWdtZW50U3RhcnQgPSB1cmwuaW5kZXhPZignIycsIHF1ZXJ5U3RhcnQpO1xyXG4gICAgcmV0dXJuIHVybC5zdWJzdHJpbmcocXVlcnlTdGFydCwgZnJhZ21lbnRTdGFydCA+IDAgPyBmcmFnbWVudFN0YXJ0IDogdW5kZWZpbmVkKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogQGZpbGVvdmVydmlldyBTSEEtMSBjcnlwdG9ncmFwaGljIGhhc2guXHJcbiAqIFZhcmlhYmxlIG5hbWVzIGZvbGxvdyB0aGUgbm90YXRpb24gaW4gRklQUyBQVUIgMTgwLTM6XHJcbiAqIGh0dHA6Ly9jc3JjLm5pc3QuZ292L3B1YmxpY2F0aW9ucy9maXBzL2ZpcHMxODAtMy9maXBzMTgwLTNfZmluYWwucGRmLlxyXG4gKlxyXG4gKiBVc2FnZTpcclxuICogICB2YXIgc2hhMSA9IG5ldyBzaGExKCk7XHJcbiAqICAgc2hhMS51cGRhdGUoYnl0ZXMpO1xyXG4gKiAgIHZhciBoYXNoID0gc2hhMS5kaWdlc3QoKTtcclxuICpcclxuICogUGVyZm9ybWFuY2U6XHJcbiAqICAgQ2hyb21lIDIzOiAgIH40MDAgTWJpdC9zXHJcbiAqICAgRmlyZWZveCAxNjogIH4yNTAgTWJpdC9zXHJcbiAqXHJcbiAqL1xyXG4vKipcclxuICogU0hBLTEgY3J5cHRvZ3JhcGhpYyBoYXNoIGNvbnN0cnVjdG9yLlxyXG4gKlxyXG4gKiBUaGUgcHJvcGVydGllcyBkZWNsYXJlZCBoZXJlIGFyZSBkaXNjdXNzZWQgaW4gdGhlIGFib3ZlIGFsZ29yaXRobSBkb2N1bWVudC5cclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBmaW5hbFxyXG4gKiBAc3RydWN0XHJcbiAqL1xyXG5jbGFzcyBTaGExIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEhvbGRzIHRoZSBwcmV2aW91cyB2YWx1ZXMgb2YgYWNjdW11bGF0ZWQgdmFyaWFibGVzIGEtZSBpbiB0aGUgY29tcHJlc3NfXHJcbiAgICAgICAgICogZnVuY3Rpb24uXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNoYWluXyA9IFtdO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgYnVmZmVyIGhvbGRpbmcgdGhlIHBhcnRpYWxseSBjb21wdXRlZCBoYXNoIHJlc3VsdC5cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYnVmXyA9IFtdO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGFycmF5IG9mIDgwIGJ5dGVzLCBlYWNoIGEgcGFydCBvZiB0aGUgbWVzc2FnZSB0byBiZSBoYXNoZWQuICBSZWZlcnJlZCB0b1xyXG4gICAgICAgICAqIGFzIHRoZSBtZXNzYWdlIHNjaGVkdWxlIGluIHRoZSBkb2NzLlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5XXyA9IFtdO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIENvbnRhaW5zIGRhdGEgbmVlZGVkIHRvIHBhZCBtZXNzYWdlcyBsZXNzIHRoYW4gNjQgYnl0ZXMuXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBhZF8gPSBbXTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHJpdmF0ZSB7bnVtYmVyfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaW5idWZfID0gMDtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHJpdmF0ZSB7bnVtYmVyfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudG90YWxfID0gMDtcclxuICAgICAgICB0aGlzLmJsb2NrU2l6ZSA9IDUxMiAvIDg7XHJcbiAgICAgICAgdGhpcy5wYWRfWzBdID0gMTI4O1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5ibG9ja1NpemU7ICsraSkge1xyXG4gICAgICAgICAgICB0aGlzLnBhZF9baV0gPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJlc2V0KCk7XHJcbiAgICB9XHJcbiAgICByZXNldCgpIHtcclxuICAgICAgICB0aGlzLmNoYWluX1swXSA9IDB4Njc0NTIzMDE7XHJcbiAgICAgICAgdGhpcy5jaGFpbl9bMV0gPSAweGVmY2RhYjg5O1xyXG4gICAgICAgIHRoaXMuY2hhaW5fWzJdID0gMHg5OGJhZGNmZTtcclxuICAgICAgICB0aGlzLmNoYWluX1szXSA9IDB4MTAzMjU0NzY7XHJcbiAgICAgICAgdGhpcy5jaGFpbl9bNF0gPSAweGMzZDJlMWYwO1xyXG4gICAgICAgIHRoaXMuaW5idWZfID0gMDtcclxuICAgICAgICB0aGlzLnRvdGFsXyA9IDA7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIGNvbXByZXNzIGhlbHBlciBmdW5jdGlvbi5cclxuICAgICAqIEBwYXJhbSBidWYgQmxvY2sgdG8gY29tcHJlc3MuXHJcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IE9mZnNldCBvZiB0aGUgYmxvY2sgaW4gdGhlIGJ1ZmZlci5cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIGNvbXByZXNzXyhidWYsIG9mZnNldCkge1xyXG4gICAgICAgIGlmICghb2Zmc2V0KSB7XHJcbiAgICAgICAgICAgIG9mZnNldCA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IFcgPSB0aGlzLldfO1xyXG4gICAgICAgIC8vIGdldCAxNiBiaWcgZW5kaWFuIHdvcmRzXHJcbiAgICAgICAgaWYgKHR5cGVvZiBidWYgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgLy8gVE9ETyh1c2VyKTogW2J1ZyA4MTQwMTIyXSBSZWNlbnQgdmVyc2lvbnMgb2YgU2FmYXJpIGZvciBNYWMgT1MgYW5kIGlPU1xyXG4gICAgICAgICAgICAgICAgLy8gaGF2ZSBhIGJ1ZyB0aGF0IHR1cm5zIHRoZSBwb3N0LWluY3JlbWVudCArKyBvcGVyYXRvciBpbnRvIHByZS1pbmNyZW1lbnRcclxuICAgICAgICAgICAgICAgIC8vIGR1cmluZyBKSVQgY29tcGlsYXRpb24uICBXZSBoYXZlIGNvZGUgdGhhdCBkZXBlbmRzIGhlYXZpbHkgb24gU0hBLTEgZm9yXHJcbiAgICAgICAgICAgICAgICAvLyBjb3JyZWN0bmVzcyBhbmQgd2hpY2ggaXMgYWZmZWN0ZWQgYnkgdGhpcyBidWcsIHNvIEkndmUgcmVtb3ZlZCBhbGwgdXNlc1xyXG4gICAgICAgICAgICAgICAgLy8gb2YgcG9zdC1pbmNyZW1lbnQgKysgaW4gd2hpY2ggdGhlIHJlc3VsdCB2YWx1ZSBpcyB1c2VkLiAgV2UgY2FuIHJldmVydFxyXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBjaGFuZ2Ugb25jZSB0aGUgU2FmYXJpIGJ1Z1xyXG4gICAgICAgICAgICAgICAgLy8gKGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMDkwMzYpIGhhcyBiZWVuIGZpeGVkIGFuZFxyXG4gICAgICAgICAgICAgICAgLy8gbW9zdCBjbGllbnRzIGhhdmUgYmVlbiB1cGRhdGVkLlxyXG4gICAgICAgICAgICAgICAgV1tpXSA9XHJcbiAgICAgICAgICAgICAgICAgICAgKGJ1Zi5jaGFyQ29kZUF0KG9mZnNldCkgPDwgMjQpIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGJ1Zi5jaGFyQ29kZUF0KG9mZnNldCArIDEpIDw8IDE2KSB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChidWYuY2hhckNvZGVBdChvZmZzZXQgKyAyKSA8PCA4KSB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5jaGFyQ29kZUF0KG9mZnNldCArIDMpO1xyXG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgV1tpXSA9XHJcbiAgICAgICAgICAgICAgICAgICAgKGJ1ZltvZmZzZXRdIDw8IDI0KSB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChidWZbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZltvZmZzZXQgKyAyXSA8PCA4KSB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZltvZmZzZXQgKyAzXTtcclxuICAgICAgICAgICAgICAgIG9mZnNldCArPSA0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGV4cGFuZCB0byA4MCB3b3Jkc1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAxNjsgaSA8IDgwOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgdCA9IFdbaSAtIDNdIF4gV1tpIC0gOF0gXiBXW2kgLSAxNF0gXiBXW2kgLSAxNl07XHJcbiAgICAgICAgICAgIFdbaV0gPSAoKHQgPDwgMSkgfCAodCA+Pj4gMzEpKSAmIDB4ZmZmZmZmZmY7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBhID0gdGhpcy5jaGFpbl9bMF07XHJcbiAgICAgICAgbGV0IGIgPSB0aGlzLmNoYWluX1sxXTtcclxuICAgICAgICBsZXQgYyA9IHRoaXMuY2hhaW5fWzJdO1xyXG4gICAgICAgIGxldCBkID0gdGhpcy5jaGFpbl9bM107XHJcbiAgICAgICAgbGV0IGUgPSB0aGlzLmNoYWluX1s0XTtcclxuICAgICAgICBsZXQgZiwgaztcclxuICAgICAgICAvLyBUT0RPKHVzZXIpOiBUcnkgdG8gdW5yb2xsIHRoaXMgbG9vcCB0byBzcGVlZCB1cCB0aGUgY29tcHV0YXRpb24uXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA4MDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChpIDwgNDApIHtcclxuICAgICAgICAgICAgICAgIGlmIChpIDwgMjApIHtcclxuICAgICAgICAgICAgICAgICAgICBmID0gZCBeIChiICYgKGMgXiBkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgayA9IDB4NWE4Mjc5OTk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBmID0gYiBeIGMgXiBkO1xyXG4gICAgICAgICAgICAgICAgICAgIGsgPSAweDZlZDllYmExO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGkgPCA2MCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGYgPSAoYiAmIGMpIHwgKGQgJiAoYiB8IGMpKTtcclxuICAgICAgICAgICAgICAgICAgICBrID0gMHg4ZjFiYmNkYztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGYgPSBiIF4gYyBeIGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgayA9IDB4Y2E2MmMxZDY7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgdCA9ICgoKGEgPDwgNSkgfCAoYSA+Pj4gMjcpKSArIGYgKyBlICsgayArIFdbaV0pICYgMHhmZmZmZmZmZjtcclxuICAgICAgICAgICAgZSA9IGQ7XHJcbiAgICAgICAgICAgIGQgPSBjO1xyXG4gICAgICAgICAgICBjID0gKChiIDw8IDMwKSB8IChiID4+PiAyKSkgJiAweGZmZmZmZmZmO1xyXG4gICAgICAgICAgICBiID0gYTtcclxuICAgICAgICAgICAgYSA9IHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2hhaW5fWzBdID0gKHRoaXMuY2hhaW5fWzBdICsgYSkgJiAweGZmZmZmZmZmO1xyXG4gICAgICAgIHRoaXMuY2hhaW5fWzFdID0gKHRoaXMuY2hhaW5fWzFdICsgYikgJiAweGZmZmZmZmZmO1xyXG4gICAgICAgIHRoaXMuY2hhaW5fWzJdID0gKHRoaXMuY2hhaW5fWzJdICsgYykgJiAweGZmZmZmZmZmO1xyXG4gICAgICAgIHRoaXMuY2hhaW5fWzNdID0gKHRoaXMuY2hhaW5fWzNdICsgZCkgJiAweGZmZmZmZmZmO1xyXG4gICAgICAgIHRoaXMuY2hhaW5fWzRdID0gKHRoaXMuY2hhaW5fWzRdICsgZSkgJiAweGZmZmZmZmZmO1xyXG4gICAgfVxyXG4gICAgdXBkYXRlKGJ5dGVzLCBsZW5ndGgpIHtcclxuICAgICAgICAvLyBUT0RPKGpvaG5sZW56KTogdGlnaHRlbiB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlIGFuZCByZW1vdmUgdGhpcyBjaGVja1xyXG4gICAgICAgIGlmIChieXRlcyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGxlbmd0aCA9IGJ5dGVzLmxlbmd0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoTWludXNCbG9jayA9IGxlbmd0aCAtIHRoaXMuYmxvY2tTaXplO1xyXG4gICAgICAgIGxldCBuID0gMDtcclxuICAgICAgICAvLyBVc2luZyBsb2NhbCBpbnN0ZWFkIG9mIG1lbWJlciB2YXJpYWJsZXMgZ2l2ZXMgfjUlIHNwZWVkdXAgb24gRmlyZWZveCAxNi5cclxuICAgICAgICBjb25zdCBidWYgPSB0aGlzLmJ1Zl87XHJcbiAgICAgICAgbGV0IGluYnVmID0gdGhpcy5pbmJ1Zl87XHJcbiAgICAgICAgLy8gVGhlIG91dGVyIHdoaWxlIGxvb3Agc2hvdWxkIGV4ZWN1dGUgYXQgbW9zdCB0d2ljZS5cclxuICAgICAgICB3aGlsZSAobiA8IGxlbmd0aCkge1xyXG4gICAgICAgICAgICAvLyBXaGVuIHdlIGhhdmUgbm8gZGF0YSBpbiB0aGUgYmxvY2sgdG8gdG9wIHVwLCB3ZSBjYW4gZGlyZWN0bHkgcHJvY2VzcyB0aGVcclxuICAgICAgICAgICAgLy8gaW5wdXQgYnVmZmVyIChhc3N1bWluZyBpdCBjb250YWlucyBzdWZmaWNpZW50IGRhdGEpLiBUaGlzIGdpdmVzIH4yNSVcclxuICAgICAgICAgICAgLy8gc3BlZWR1cCBvbiBDaHJvbWUgMjMgYW5kIH4xNSUgc3BlZWR1cCBvbiBGaXJlZm94IDE2LCBidXQgcmVxdWlyZXMgdGhhdFxyXG4gICAgICAgICAgICAvLyB0aGUgZGF0YSBpcyBwcm92aWRlZCBpbiBsYXJnZSBjaHVua3MgKG9yIGluIG11bHRpcGxlcyBvZiA2NCBieXRlcykuXHJcbiAgICAgICAgICAgIGlmIChpbmJ1ZiA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKG4gPD0gbGVuZ3RoTWludXNCbG9jaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcHJlc3NfKGJ5dGVzLCBuKTtcclxuICAgICAgICAgICAgICAgICAgICBuICs9IHRoaXMuYmxvY2tTaXplO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAobiA8IGxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJ1ZltpbmJ1Zl0gPSBieXRlcy5jaGFyQ29kZUF0KG4pO1xyXG4gICAgICAgICAgICAgICAgICAgICsraW5idWY7XHJcbiAgICAgICAgICAgICAgICAgICAgKytuO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmJ1ZiA9PT0gdGhpcy5ibG9ja1NpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wcmVzc18oYnVmKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5idWYgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBKdW1wIHRvIHRoZSBvdXRlciBsb29wIHNvIHdlIHVzZSB0aGUgZnVsbC1ibG9jayBvcHRpbWl6YXRpb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChuIDwgbGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnVmW2luYnVmXSA9IGJ5dGVzW25dO1xyXG4gICAgICAgICAgICAgICAgICAgICsraW5idWY7XHJcbiAgICAgICAgICAgICAgICAgICAgKytuO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmJ1ZiA9PT0gdGhpcy5ibG9ja1NpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wcmVzc18oYnVmKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5idWYgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBKdW1wIHRvIHRoZSBvdXRlciBsb29wIHNvIHdlIHVzZSB0aGUgZnVsbC1ibG9jayBvcHRpbWl6YXRpb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmluYnVmXyA9IGluYnVmO1xyXG4gICAgICAgIHRoaXMudG90YWxfICs9IGxlbmd0aDtcclxuICAgIH1cclxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cclxuICAgIGRpZ2VzdCgpIHtcclxuICAgICAgICBjb25zdCBkaWdlc3QgPSBbXTtcclxuICAgICAgICBsZXQgdG90YWxCaXRzID0gdGhpcy50b3RhbF8gKiA4O1xyXG4gICAgICAgIC8vIEFkZCBwYWQgMHg4MCAweDAwKi5cclxuICAgICAgICBpZiAodGhpcy5pbmJ1Zl8gPCA1Nikge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSh0aGlzLnBhZF8sIDU2IC0gdGhpcy5pbmJ1Zl8pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGUodGhpcy5wYWRfLCB0aGlzLmJsb2NrU2l6ZSAtICh0aGlzLmluYnVmXyAtIDU2KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEFkZCAjIGJpdHMuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuYmxvY2tTaXplIC0gMTsgaSA+PSA1NjsgaS0tKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYnVmX1tpXSA9IHRvdGFsQml0cyAmIDI1NTtcclxuICAgICAgICAgICAgdG90YWxCaXRzIC89IDI1NjsgLy8gRG9uJ3QgdXNlIGJpdC1zaGlmdGluZyBoZXJlIVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNvbXByZXNzXyh0aGlzLmJ1Zl8pO1xyXG4gICAgICAgIGxldCBuID0gMDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDU7IGkrKykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMjQ7IGogPj0gMDsgaiAtPSA4KSB7XHJcbiAgICAgICAgICAgICAgICBkaWdlc3Rbbl0gPSAodGhpcy5jaGFpbl9baV0gPj4gaikgJiAyNTU7XHJcbiAgICAgICAgICAgICAgICArK247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRpZ2VzdDtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogSGVscGVyIHRvIG1ha2UgYSBTdWJzY3JpYmUgZnVuY3Rpb24gKGp1c3QgbGlrZSBQcm9taXNlIGhlbHBzIG1ha2UgYVxyXG4gKiBUaGVuYWJsZSkuXHJcbiAqXHJcbiAqIEBwYXJhbSBleGVjdXRvciBGdW5jdGlvbiB3aGljaCBjYW4gbWFrZSBjYWxscyB0byBhIHNpbmdsZSBPYnNlcnZlclxyXG4gKiAgICAgYXMgYSBwcm94eS5cclxuICogQHBhcmFtIG9uTm9PYnNlcnZlcnMgQ2FsbGJhY2sgd2hlbiBjb3VudCBvZiBPYnNlcnZlcnMgZ29lcyB0byB6ZXJvLlxyXG4gKi9cclxuZnVuY3Rpb24gY3JlYXRlU3Vic2NyaWJlKGV4ZWN1dG9yLCBvbk5vT2JzZXJ2ZXJzKSB7XHJcbiAgICBjb25zdCBwcm94eSA9IG5ldyBPYnNlcnZlclByb3h5KGV4ZWN1dG9yLCBvbk5vT2JzZXJ2ZXJzKTtcclxuICAgIHJldHVybiBwcm94eS5zdWJzY3JpYmUuYmluZChwcm94eSk7XHJcbn1cclxuLyoqXHJcbiAqIEltcGxlbWVudCBmYW4tb3V0IGZvciBhbnkgbnVtYmVyIG9mIE9ic2VydmVycyBhdHRhY2hlZCB2aWEgYSBzdWJzY3JpYmVcclxuICogZnVuY3Rpb24uXHJcbiAqL1xyXG5jbGFzcyBPYnNlcnZlclByb3h5IHtcclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIGV4ZWN1dG9yIEZ1bmN0aW9uIHdoaWNoIGNhbiBtYWtlIGNhbGxzIHRvIGEgc2luZ2xlIE9ic2VydmVyXHJcbiAgICAgKiAgICAgYXMgYSBwcm94eS5cclxuICAgICAqIEBwYXJhbSBvbk5vT2JzZXJ2ZXJzIENhbGxiYWNrIHdoZW4gY291bnQgb2YgT2JzZXJ2ZXJzIGdvZXMgdG8gemVyby5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoZXhlY3V0b3IsIG9uTm9PYnNlcnZlcnMpIHtcclxuICAgICAgICB0aGlzLm9ic2VydmVycyA9IFtdO1xyXG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmVzID0gW107XHJcbiAgICAgICAgdGhpcy5vYnNlcnZlckNvdW50ID0gMDtcclxuICAgICAgICAvLyBNaWNyby10YXNrIHNjaGVkdWxpbmcgYnkgY2FsbGluZyB0YXNrLnRoZW4oKS5cclxuICAgICAgICB0aGlzLnRhc2sgPSBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICB0aGlzLmZpbmFsaXplZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMub25Ob09ic2VydmVycyA9IG9uTm9PYnNlcnZlcnM7XHJcbiAgICAgICAgLy8gQ2FsbCB0aGUgZXhlY3V0b3IgYXN5bmNocm9ub3VzbHkgc28gc3Vic2NyaWJlcnMgdGhhdCBhcmUgY2FsbGVkXHJcbiAgICAgICAgLy8gc3luY2hyb25vdXNseSBhZnRlciB0aGUgY3JlYXRpb24gb2YgdGhlIHN1YnNjcmliZSBmdW5jdGlvblxyXG4gICAgICAgIC8vIGNhbiBzdGlsbCByZWNlaXZlIHRoZSB2ZXJ5IGZpcnN0IHZhbHVlIGdlbmVyYXRlZCBpbiB0aGUgZXhlY3V0b3IuXHJcbiAgICAgICAgdGhpcy50YXNrXHJcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgZXhlY3V0b3IodGhpcyk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAgICAgLmNhdGNoKGUgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yKGUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgbmV4dCh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuZm9yRWFjaE9ic2VydmVyKChvYnNlcnZlcikgPT4ge1xyXG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KHZhbHVlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGVycm9yKGVycm9yKSB7XHJcbiAgICAgICAgdGhpcy5mb3JFYWNoT2JzZXJ2ZXIoKG9ic2VydmVyKSA9PiB7XHJcbiAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGVycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmNsb3NlKGVycm9yKTtcclxuICAgIH1cclxuICAgIGNvbXBsZXRlKCkge1xyXG4gICAgICAgIHRoaXMuZm9yRWFjaE9ic2VydmVyKChvYnNlcnZlcikgPT4ge1xyXG4gICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU3Vic2NyaWJlIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gYWRkIGFuIE9ic2VydmVyIHRvIHRoZSBmYW4tb3V0IGxpc3QuXHJcbiAgICAgKlxyXG4gICAgICogLSBXZSByZXF1aXJlIHRoYXQgbm8gZXZlbnQgaXMgc2VudCB0byBhIHN1YnNjcmliZXIgc3ljaHJvbm91c2x5IHRvIHRoZWlyXHJcbiAgICAgKiAgIGNhbGwgdG8gc3Vic2NyaWJlKCkuXHJcbiAgICAgKi9cclxuICAgIHN1YnNjcmliZShuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlKSB7XHJcbiAgICAgICAgbGV0IG9ic2VydmVyO1xyXG4gICAgICAgIGlmIChuZXh0T3JPYnNlcnZlciA9PT0gdW5kZWZpbmVkICYmXHJcbiAgICAgICAgICAgIGVycm9yID09PSB1bmRlZmluZWQgJiZcclxuICAgICAgICAgICAgY29tcGxldGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgT2JzZXJ2ZXIuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEFzc2VtYmxlIGFuIE9ic2VydmVyIG9iamVjdCB3aGVuIHBhc3NlZCBhcyBjYWxsYmFjayBmdW5jdGlvbnMuXHJcbiAgICAgICAgaWYgKGltcGxlbWVudHNBbnlNZXRob2RzKG5leHRPck9ic2VydmVyLCBbXHJcbiAgICAgICAgICAgICduZXh0JyxcclxuICAgICAgICAgICAgJ2Vycm9yJyxcclxuICAgICAgICAgICAgJ2NvbXBsZXRlJ1xyXG4gICAgICAgIF0pKSB7XHJcbiAgICAgICAgICAgIG9ic2VydmVyID0gbmV4dE9yT2JzZXJ2ZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvYnNlcnZlciA9IHtcclxuICAgICAgICAgICAgICAgIG5leHQ6IG5leHRPck9ic2VydmVyLFxyXG4gICAgICAgICAgICAgICAgZXJyb3IsXHJcbiAgICAgICAgICAgICAgICBjb21wbGV0ZVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob2JzZXJ2ZXIubmV4dCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQgPSBub29wO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob2JzZXJ2ZXIuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBvYnNlcnZlci5lcnJvciA9IG5vb3A7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvYnNlcnZlci5jb21wbGV0ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlID0gbm9vcDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdW5zdWIgPSB0aGlzLnVuc3Vic2NyaWJlT25lLmJpbmQodGhpcywgdGhpcy5vYnNlcnZlcnMubGVuZ3RoKTtcclxuICAgICAgICAvLyBBdHRlbXB0IHRvIHN1YnNjcmliZSB0byBhIHRlcm1pbmF0ZWQgT2JzZXJ2YWJsZSAtIHdlXHJcbiAgICAgICAgLy8ganVzdCByZXNwb25kIHRvIHRoZSBPYnNlcnZlciB3aXRoIHRoZSBmaW5hbCBlcnJvciBvciBjb21wbGV0ZVxyXG4gICAgICAgIC8vIGV2ZW50LlxyXG4gICAgICAgIGlmICh0aGlzLmZpbmFsaXplZCkge1xyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXHJcbiAgICAgICAgICAgIHRoaXMudGFzay50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmluYWxFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcih0aGlzLmZpbmFsRXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmdcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2gob2JzZXJ2ZXIpO1xyXG4gICAgICAgIHJldHVybiB1bnN1YjtcclxuICAgIH1cclxuICAgIC8vIFVuc3Vic2NyaWJlIGlzIHN5bmNocm9ub3VzIC0gd2UgZ3VhcmFudGVlIHRoYXQgbm8gZXZlbnRzIGFyZSBzZW50IHRvXHJcbiAgICAvLyBhbnkgdW5zdWJzY3JpYmVkIE9ic2VydmVyLlxyXG4gICAgdW5zdWJzY3JpYmVPbmUoaSkge1xyXG4gICAgICAgIGlmICh0aGlzLm9ic2VydmVycyA9PT0gdW5kZWZpbmVkIHx8IHRoaXMub2JzZXJ2ZXJzW2ldID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkZWxldGUgdGhpcy5vYnNlcnZlcnNbaV07XHJcbiAgICAgICAgdGhpcy5vYnNlcnZlckNvdW50IC09IDE7XHJcbiAgICAgICAgaWYgKHRoaXMub2JzZXJ2ZXJDb3VudCA9PT0gMCAmJiB0aGlzLm9uTm9PYnNlcnZlcnMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm9uTm9PYnNlcnZlcnModGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZm9yRWFjaE9ic2VydmVyKGZuKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZmluYWxpemVkKSB7XHJcbiAgICAgICAgICAgIC8vIEFscmVhZHkgY2xvc2VkIGJ5IHByZXZpb3VzIGV2ZW50Li4uLmp1c3QgZWF0IHRoZSBhZGRpdGlvbmFsIHZhbHVlcy5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBTaW5jZSBzZW5kT25lIGNhbGxzIGFzeW5jaHJvbm91c2x5IC0gdGhlcmUgaXMgbm8gY2hhbmNlIHRoYXRcclxuICAgICAgICAvLyB0aGlzLm9ic2VydmVycyB3aWxsIGJlY29tZSB1bmRlZmluZWQuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9ic2VydmVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLnNlbmRPbmUoaSwgZm4pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIENhbGwgdGhlIE9ic2VydmVyIHZpYSBvbmUgb2YgaXQncyBjYWxsYmFjayBmdW5jdGlvbi4gV2UgYXJlIGNhcmVmdWwgdG9cclxuICAgIC8vIGNvbmZpcm0gdGhhdCB0aGUgb2JzZXJ2ZSBoYXMgbm90IGJlZW4gdW5zdWJzY3JpYmVkIHNpbmNlIHRoaXMgYXN5bmNocm9ub3VzXHJcbiAgICAvLyBmdW5jdGlvbiBoYWQgYmVlbiBxdWV1ZWQuXHJcbiAgICBzZW5kT25lKGksIGZuKSB7XHJcbiAgICAgICAgLy8gRXhlY3V0ZSB0aGUgY2FsbGJhY2sgYXN5bmNocm9ub3VzbHlcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXHJcbiAgICAgICAgdGhpcy50YXNrLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vYnNlcnZlcnMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLm9ic2VydmVyc1tpXSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZuKHRoaXMub2JzZXJ2ZXJzW2ldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGV4Y2VwdGlvbnMgcmFpc2VkIGluIE9ic2VydmVycyBvciBtaXNzaW5nIG1ldGhvZHMgb2YgYW5cclxuICAgICAgICAgICAgICAgICAgICAvLyBPYnNlcnZlci5cclxuICAgICAgICAgICAgICAgICAgICAvLyBMb2cgZXJyb3IgdG8gY29uc29sZS4gYi8zMTQwNDgwNlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgY29uc29sZS5lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgY2xvc2UoZXJyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZmluYWxpemVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5maW5hbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChlcnIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmZpbmFsRXJyb3IgPSBlcnI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFByb3h5IGlzIG5vIGxvbmdlciBuZWVkZWQgLSBnYXJiYWdlIGNvbGxlY3QgcmVmZXJlbmNlc1xyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcclxuICAgICAgICB0aGlzLnRhc2sudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXJzID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB0aGlzLm9uTm9PYnNlcnZlcnMgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuLyoqIFR1cm4gc3luY2hyb25vdXMgZnVuY3Rpb24gaW50byBvbmUgY2FsbGVkIGFzeW5jaHJvbm91c2x5LiAqL1xyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xyXG5mdW5jdGlvbiBhc3luYyhmbiwgb25FcnJvcikge1xyXG4gICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XHJcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHRydWUpXHJcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgZm4oLi4uYXJncyk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICBpZiAob25FcnJvcikge1xyXG4gICAgICAgICAgICAgICAgb25FcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH07XHJcbn1cclxuLyoqXHJcbiAqIFJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgcGFzc2VkIGluIGltcGxlbWVudHMgYW55IG9mIHRoZSBuYW1lZCBtZXRob2RzLlxyXG4gKi9cclxuZnVuY3Rpb24gaW1wbGVtZW50c0FueU1ldGhvZHMob2JqLCBtZXRob2RzKSB7XHJcbiAgICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgb2JqID09PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCBtZXRob2Qgb2YgbWV0aG9kcykge1xyXG4gICAgICAgIGlmIChtZXRob2QgaW4gb2JqICYmIHR5cGVvZiBvYmpbbWV0aG9kXSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn1cclxuZnVuY3Rpb24gbm9vcCgpIHtcclxuICAgIC8vIGRvIG5vdGhpbmdcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgYXJndW1lbnRzIGFyZSBwcm92aWRlZCBmb3IgYSBwdWJsaWMgZnVuY3Rpb24uXHJcbiAqIFRocm93cyBhbiBlcnJvciBpZiBpdCBmYWlscy5cclxuICpcclxuICogQHBhcmFtIGZuTmFtZSBUaGUgZnVuY3Rpb24gbmFtZVxyXG4gKiBAcGFyYW0gbWluQ291bnQgVGhlIG1pbmltdW0gbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBhbGxvdyBmb3IgdGhlIGZ1bmN0aW9uIGNhbGxcclxuICogQHBhcmFtIG1heENvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiBhcmd1bWVudCB0byBhbGxvdyBmb3IgdGhlIGZ1bmN0aW9uIGNhbGxcclxuICogQHBhcmFtIGFyZ0NvdW50IFRoZSBhY3R1YWwgbnVtYmVyIG9mIGFyZ3VtZW50cyBwcm92aWRlZC5cclxuICovXHJcbmNvbnN0IHZhbGlkYXRlQXJnQ291bnQgPSBmdW5jdGlvbiAoZm5OYW1lLCBtaW5Db3VudCwgbWF4Q291bnQsIGFyZ0NvdW50KSB7XHJcbiAgICBsZXQgYXJnRXJyb3I7XHJcbiAgICBpZiAoYXJnQ291bnQgPCBtaW5Db3VudCkge1xyXG4gICAgICAgIGFyZ0Vycm9yID0gJ2F0IGxlYXN0ICcgKyBtaW5Db3VudDtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGFyZ0NvdW50ID4gbWF4Q291bnQpIHtcclxuICAgICAgICBhcmdFcnJvciA9IG1heENvdW50ID09PSAwID8gJ25vbmUnIDogJ25vIG1vcmUgdGhhbiAnICsgbWF4Q291bnQ7XHJcbiAgICB9XHJcbiAgICBpZiAoYXJnRXJyb3IpIHtcclxuICAgICAgICBjb25zdCBlcnJvciA9IGZuTmFtZSArXHJcbiAgICAgICAgICAgICcgZmFpbGVkOiBXYXMgY2FsbGVkIHdpdGggJyArXHJcbiAgICAgICAgICAgIGFyZ0NvdW50ICtcclxuICAgICAgICAgICAgKGFyZ0NvdW50ID09PSAxID8gJyBhcmd1bWVudC4nIDogJyBhcmd1bWVudHMuJykgK1xyXG4gICAgICAgICAgICAnIEV4cGVjdHMgJyArXHJcbiAgICAgICAgICAgIGFyZ0Vycm9yICtcclxuICAgICAgICAgICAgJy4nO1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbn07XHJcbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSBzdHJpbmcgdG8gcHJlZml4IGFuIGVycm9yIG1lc3NhZ2UgYWJvdXQgZmFpbGVkIGFyZ3VtZW50IHZhbGlkYXRpb25cclxuICpcclxuICogQHBhcmFtIGZuTmFtZSBUaGUgZnVuY3Rpb24gbmFtZVxyXG4gKiBAcGFyYW0gYXJnTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXJndW1lbnRcclxuICogQHJldHVybiBUaGUgcHJlZml4IHRvIGFkZCB0byB0aGUgZXJyb3IgdGhyb3duIGZvciB2YWxpZGF0aW9uLlxyXG4gKi9cclxuZnVuY3Rpb24gZXJyb3JQcmVmaXgoZm5OYW1lLCBhcmdOYW1lKSB7XHJcbiAgICByZXR1cm4gYCR7Zm5OYW1lfSBmYWlsZWQ6ICR7YXJnTmFtZX0gYXJndW1lbnQgYDtcclxufVxyXG4vKipcclxuICogQHBhcmFtIGZuTmFtZVxyXG4gKiBAcGFyYW0gYXJndW1lbnROdW1iZXJcclxuICogQHBhcmFtIG5hbWVzcGFjZVxyXG4gKiBAcGFyYW0gb3B0aW9uYWxcclxuICovXHJcbmZ1bmN0aW9uIHZhbGlkYXRlTmFtZXNwYWNlKGZuTmFtZSwgbmFtZXNwYWNlLCBvcHRpb25hbCkge1xyXG4gICAgaWYgKG9wdGlvbmFsICYmICFuYW1lc3BhY2UpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIG5hbWVzcGFjZSAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAvL1RPRE86IEkgc2hvdWxkIGRvIG1vcmUgdmFsaWRhdGlvbiBoZXJlLiBXZSBvbmx5IGFsbG93IGNlcnRhaW4gY2hhcnMgaW4gbmFtZXNwYWNlcy5cclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JQcmVmaXgoZm5OYW1lLCAnbmFtZXNwYWNlJykgKyAnbXVzdCBiZSBhIHZhbGlkIGZpcmViYXNlIG5hbWVzcGFjZS4nKTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiB2YWxpZGF0ZUNhbGxiYWNrKGZuTmFtZSwgYXJndW1lbnROYW1lLCBcclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcclxuY2FsbGJhY2ssIG9wdGlvbmFsKSB7XHJcbiAgICBpZiAob3B0aW9uYWwgJiYgIWNhbGxiYWNrKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvclByZWZpeChmbk5hbWUsIGFyZ3VtZW50TmFtZSkgKyAnbXVzdCBiZSBhIHZhbGlkIGZ1bmN0aW9uLicpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHZhbGlkYXRlQ29udGV4dE9iamVjdChmbk5hbWUsIGFyZ3VtZW50TmFtZSwgY29udGV4dCwgb3B0aW9uYWwpIHtcclxuICAgIGlmIChvcHRpb25hbCAmJiAhY29udGV4dCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgY29udGV4dCAhPT0gJ29iamVjdCcgfHwgY29udGV4dCA9PT0gbnVsbCkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvclByZWZpeChmbk5hbWUsIGFyZ3VtZW50TmFtZSkgKyAnbXVzdCBiZSBhIHZhbGlkIGNvbnRleHQgb2JqZWN0LicpO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8vIENvZGUgb3JpZ2luYWxseSBjYW1lIGZyb20gZ29vZy5jcnlwdC5zdHJpbmdUb1V0ZjhCeXRlQXJyYXksIGJ1dCBmb3Igc29tZSByZWFzb24gdGhleVxyXG4vLyBhdXRvbWF0aWNhbGx5IHJlcGxhY2VkICdcXHJcXG4nIHdpdGggJ1xcbicsIGFuZCB0aGV5IGRpZG4ndCBoYW5kbGUgc3Vycm9nYXRlIHBhaXJzLFxyXG4vLyBzbyBpdCdzIGJlZW4gbW9kaWZpZWQuXHJcbi8vIE5vdGUgdGhhdCBub3QgYWxsIFVuaWNvZGUgY2hhcmFjdGVycyBhcHBlYXIgYXMgc2luZ2xlIGNoYXJhY3RlcnMgaW4gSmF2YVNjcmlwdCBzdHJpbmdzLlxyXG4vLyBmcm9tQ2hhckNvZGUgcmV0dXJucyB0aGUgVVRGLTE2IGVuY29kaW5nIG9mIGEgY2hhcmFjdGVyIC0gc28gc29tZSBVbmljb2RlIGNoYXJhY3RlcnNcclxuLy8gdXNlIDIgY2hhcmFjdGVycyBpbiBKYXZhc2NyaXB0LiAgQWxsIDQtYnl0ZSBVVEYtOCBjaGFyYWN0ZXJzIGJlZ2luIHdpdGggYSBmaXJzdFxyXG4vLyBjaGFyYWN0ZXIgaW4gdGhlIHJhbmdlIDB4RDgwMCAtIDB4REJGRiAodGhlIGZpcnN0IGNoYXJhY3RlciBvZiBhIHNvLWNhbGxlZCBzdXJyb2dhdGVcclxuLy8gcGFpcikuXHJcbi8vIFNlZSBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtMTUuMS4zXHJcbi8qKlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXHJcbiAqIEByZXR1cm4ge0FycmF5fVxyXG4gKi9cclxuY29uc3Qgc3RyaW5nVG9CeXRlQXJyYXkgPSBmdW5jdGlvbiAoc3RyKSB7XHJcbiAgICBjb25zdCBvdXQgPSBbXTtcclxuICAgIGxldCBwID0gMDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGMgPSBzdHIuY2hhckNvZGVBdChpKTtcclxuICAgICAgICAvLyBJcyB0aGlzIHRoZSBsZWFkIHN1cnJvZ2F0ZSBpbiBhIHN1cnJvZ2F0ZSBwYWlyP1xyXG4gICAgICAgIGlmIChjID49IDB4ZDgwMCAmJiBjIDw9IDB4ZGJmZikge1xyXG4gICAgICAgICAgICBjb25zdCBoaWdoID0gYyAtIDB4ZDgwMDsgLy8gdGhlIGhpZ2ggMTAgYml0cy5cclxuICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICBhc3NlcnQoaSA8IHN0ci5sZW5ndGgsICdTdXJyb2dhdGUgcGFpciBtaXNzaW5nIHRyYWlsIHN1cnJvZ2F0ZS4nKTtcclxuICAgICAgICAgICAgY29uc3QgbG93ID0gc3RyLmNoYXJDb2RlQXQoaSkgLSAweGRjMDA7IC8vIHRoZSBsb3cgMTAgYml0cy5cclxuICAgICAgICAgICAgYyA9IDB4MTAwMDAgKyAoaGlnaCA8PCAxMCkgKyBsb3c7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjIDwgMTI4KSB7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gYztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYyA8IDIwNDgpIHtcclxuICAgICAgICAgICAgb3V0W3ArK10gPSAoYyA+PiA2KSB8IDE5MjtcclxuICAgICAgICAgICAgb3V0W3ArK10gPSAoYyAmIDYzKSB8IDEyODtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYyA8IDY1NTM2KSB7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gKGMgPj4gMTIpIHwgMjI0O1xyXG4gICAgICAgICAgICBvdXRbcCsrXSA9ICgoYyA+PiA2KSAmIDYzKSB8IDEyODtcclxuICAgICAgICAgICAgb3V0W3ArK10gPSAoYyAmIDYzKSB8IDEyODtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gKGMgPj4gMTgpIHwgMjQwO1xyXG4gICAgICAgICAgICBvdXRbcCsrXSA9ICgoYyA+PiAxMikgJiA2MykgfCAxMjg7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gKChjID4+IDYpICYgNjMpIHwgMTI4O1xyXG4gICAgICAgICAgICBvdXRbcCsrXSA9IChjICYgNjMpIHwgMTI4O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBvdXQ7XHJcbn07XHJcbi8qKlxyXG4gKiBDYWxjdWxhdGUgbGVuZ3RoIHdpdGhvdXQgYWN0dWFsbHkgY29udmVydGluZzsgdXNlZnVsIGZvciBkb2luZyBjaGVhcGVyIHZhbGlkYXRpb24uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcclxuICogQHJldHVybiB7bnVtYmVyfVxyXG4gKi9cclxuY29uc3Qgc3RyaW5nTGVuZ3RoID0gZnVuY3Rpb24gKHN0cikge1xyXG4gICAgbGV0IHAgPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBjID0gc3RyLmNoYXJDb2RlQXQoaSk7XHJcbiAgICAgICAgaWYgKGMgPCAxMjgpIHtcclxuICAgICAgICAgICAgcCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjIDwgMjA0OCkge1xyXG4gICAgICAgICAgICBwICs9IDI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGMgPj0gMHhkODAwICYmIGMgPD0gMHhkYmZmKSB7XHJcbiAgICAgICAgICAgIC8vIExlYWQgc3Vycm9nYXRlIG9mIGEgc3Vycm9nYXRlIHBhaXIuICBUaGUgcGFpciB0b2dldGhlciB3aWxsIHRha2UgNCBieXRlcyB0byByZXByZXNlbnQuXHJcbiAgICAgICAgICAgIHAgKz0gNDtcclxuICAgICAgICAgICAgaSsrOyAvLyBza2lwIHRyYWlsIHN1cnJvZ2F0ZS5cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHAgKz0gMztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcDtcclxufTtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFRoZSBhbW91bnQgb2YgbWlsbGlzZWNvbmRzIHRvIGV4cG9uZW50aWFsbHkgaW5jcmVhc2UuXHJcbiAqL1xyXG5jb25zdCBERUZBVUxUX0lOVEVSVkFMX01JTExJUyA9IDEwMDA7XHJcbi8qKlxyXG4gKiBUaGUgZmFjdG9yIHRvIGJhY2tvZmYgYnkuXHJcbiAqIFNob3VsZCBiZSBhIG51bWJlciBncmVhdGVyIHRoYW4gMS5cclxuICovXHJcbmNvbnN0IERFRkFVTFRfQkFDS09GRl9GQUNUT1IgPSAyO1xyXG4vKipcclxuICogVGhlIG1heGltdW0gbWlsbGlzZWNvbmRzIHRvIGluY3JlYXNlIHRvLlxyXG4gKlxyXG4gKiA8cD5WaXNpYmxlIGZvciB0ZXN0aW5nXHJcbiAqL1xyXG5jb25zdCBNQVhfVkFMVUVfTUlMTElTID0gNCAqIDYwICogNjAgKiAxMDAwOyAvLyBGb3VyIGhvdXJzLCBsaWtlIGlPUyBhbmQgQW5kcm9pZC5cclxuLyoqXHJcbiAqIFRoZSBwZXJjZW50YWdlIG9mIGJhY2tvZmYgdGltZSB0byByYW5kb21pemUgYnkuXHJcbiAqIFNlZVxyXG4gKiBodHRwOi8vZ28vc2FmZS1jbGllbnQtYmVoYXZpb3Ijc3RlcC0xLWRldGVybWluZS10aGUtYXBwcm9wcmlhdGUtcmV0cnktaW50ZXJ2YWwtdG8taGFuZGxlLXNwaWtlLXRyYWZmaWNcclxuICogZm9yIGNvbnRleHQuXHJcbiAqXHJcbiAqIDxwPlZpc2libGUgZm9yIHRlc3RpbmdcclxuICovXHJcbmNvbnN0IFJBTkRPTV9GQUNUT1IgPSAwLjU7XHJcbi8qKlxyXG4gKiBCYXNlZCBvbiB0aGUgYmFja29mZiBtZXRob2QgZnJvbVxyXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtbGlicmFyeS9ibG9iL21hc3Rlci9jbG9zdXJlL2dvb2cvbWF0aC9leHBvbmVudGlhbGJhY2tvZmYuanMuXHJcbiAqIEV4dHJhY3RlZCBoZXJlIHNvIHdlIGRvbid0IG5lZWQgdG8gcGFzcyBtZXRhZGF0YSBhbmQgYSBzdGF0ZWZ1bCBFeHBvbmVudGlhbEJhY2tvZmYgb2JqZWN0IGFyb3VuZC5cclxuICovXHJcbmZ1bmN0aW9uIGNhbGN1bGF0ZUJhY2tvZmZNaWxsaXMoYmFja29mZkNvdW50LCBpbnRlcnZhbE1pbGxpcyA9IERFRkFVTFRfSU5URVJWQUxfTUlMTElTLCBiYWNrb2ZmRmFjdG9yID0gREVGQVVMVF9CQUNLT0ZGX0ZBQ1RPUikge1xyXG4gICAgLy8gQ2FsY3VsYXRlcyBhbiBleHBvbmVudGlhbGx5IGluY3JlYXNpbmcgdmFsdWUuXHJcbiAgICAvLyBEZXZpYXRpb246IGNhbGN1bGF0ZXMgdmFsdWUgZnJvbSBjb3VudCBhbmQgYSBjb25zdGFudCBpbnRlcnZhbCwgc28gd2Ugb25seSBuZWVkIHRvIHNhdmUgdmFsdWVcclxuICAgIC8vIGFuZCBjb3VudCB0byByZXN0b3JlIHN0YXRlLlxyXG4gICAgY29uc3QgY3VyckJhc2VWYWx1ZSA9IGludGVydmFsTWlsbGlzICogTWF0aC5wb3coYmFja29mZkZhY3RvciwgYmFja29mZkNvdW50KTtcclxuICAgIC8vIEEgcmFuZG9tIFwiZnV6elwiIHRvIGF2b2lkIHdhdmVzIG9mIHJldHJpZXMuXHJcbiAgICAvLyBEZXZpYXRpb246IHJhbmRvbUZhY3RvciBpcyByZXF1aXJlZC5cclxuICAgIGNvbnN0IHJhbmRvbVdhaXQgPSBNYXRoLnJvdW5kKFxyXG4gICAgLy8gQSBmcmFjdGlvbiBvZiB0aGUgYmFja29mZiB2YWx1ZSB0byBhZGQvc3VidHJhY3QuXHJcbiAgICAvLyBEZXZpYXRpb246IGNoYW5nZXMgbXVsdGlwbGljYXRpb24gb3JkZXIgdG8gaW1wcm92ZSByZWFkYWJpbGl0eS5cclxuICAgIFJBTkRPTV9GQUNUT1IgKlxyXG4gICAgICAgIGN1cnJCYXNlVmFsdWUgKlxyXG4gICAgICAgIC8vIEEgcmFuZG9tIGZsb2F0IChyb3VuZGVkIHRvIGludCBieSBNYXRoLnJvdW5kIGFib3ZlKSBpbiB0aGUgcmFuZ2UgWy0xLCAxXS4gRGV0ZXJtaW5lc1xyXG4gICAgICAgIC8vIGlmIHdlIGFkZCBvciBzdWJ0cmFjdC5cclxuICAgICAgICAoTWF0aC5yYW5kb20oKSAtIDAuNSkgKlxyXG4gICAgICAgIDIpO1xyXG4gICAgLy8gTGltaXRzIGJhY2tvZmYgdG8gbWF4IHRvIGF2b2lkIGVmZmVjdGl2ZWx5IHBlcm1hbmVudCBiYWNrb2ZmLlxyXG4gICAgcmV0dXJuIE1hdGgubWluKE1BWF9WQUxVRV9NSUxMSVMsIGN1cnJCYXNlVmFsdWUgKyByYW5kb21XYWl0KTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogUHJvdmlkZSBFbmdsaXNoIG9yZGluYWwgbGV0dGVycyBhZnRlciBhIG51bWJlclxyXG4gKi9cclxuZnVuY3Rpb24gb3JkaW5hbChpKSB7XHJcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShpKSkge1xyXG4gICAgICAgIHJldHVybiBgJHtpfWA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaSArIGluZGljYXRvcihpKTtcclxufVxyXG5mdW5jdGlvbiBpbmRpY2F0b3IoaSkge1xyXG4gICAgaSA9IE1hdGguYWJzKGkpO1xyXG4gICAgY29uc3QgY2VudCA9IGkgJSAxMDA7XHJcbiAgICBpZiAoY2VudCA+PSAxMCAmJiBjZW50IDw9IDIwKSB7XHJcbiAgICAgICAgcmV0dXJuICd0aCc7XHJcbiAgICB9XHJcbiAgICBjb25zdCBkZWMgPSBpICUgMTA7XHJcbiAgICBpZiAoZGVjID09PSAxKSB7XHJcbiAgICAgICAgcmV0dXJuICdzdCc7XHJcbiAgICB9XHJcbiAgICBpZiAoZGVjID09PSAyKSB7XHJcbiAgICAgICAgcmV0dXJuICduZCc7XHJcbiAgICB9XHJcbiAgICBpZiAoZGVjID09PSAzKSB7XHJcbiAgICAgICAgcmV0dXJuICdyZCc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJ3RoJztcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRNb2R1bGFySW5zdGFuY2Uoc2VydmljZSkge1xyXG4gICAgaWYgKHNlcnZpY2UgJiYgc2VydmljZS5fZGVsZWdhdGUpIHtcclxuICAgICAgICByZXR1cm4gc2VydmljZS5fZGVsZWdhdGU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gc2VydmljZTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9taXNpZnlSZXF1ZXN0KHJlcXVlc3QsIGVycm9yTWVzc2FnZSkge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9IGV2ZW50ID0+IHtcclxuICAgICAgICAgICAgcmVzb2x2ZShldmVudC50YXJnZXQucmVzdWx0KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlcXVlc3Qub25lcnJvciA9IGV2ZW50ID0+IHtcclxuICAgICAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgICAgICByZWplY3QoYCR7ZXJyb3JNZXNzYWdlfTogJHsoX2EgPSBldmVudC50YXJnZXQuZXJyb3IpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tZXNzYWdlfWApO1xyXG4gICAgICAgIH07XHJcbiAgICB9KTtcclxufVxyXG5jbGFzcyBEQldyYXBwZXIge1xyXG4gICAgY29uc3RydWN0b3IoX2RiKSB7XHJcbiAgICAgICAgdGhpcy5fZGIgPSBfZGI7XHJcbiAgICAgICAgdGhpcy5vYmplY3RTdG9yZU5hbWVzID0gdGhpcy5fZGIub2JqZWN0U3RvcmVOYW1lcztcclxuICAgIH1cclxuICAgIHRyYW5zYWN0aW9uKHN0b3JlTmFtZXMsIG1vZGUpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uV3JhcHBlcih0aGlzLl9kYi50cmFuc2FjdGlvbi5jYWxsKHRoaXMuX2RiLCBzdG9yZU5hbWVzLCBtb2RlKSk7XHJcbiAgICB9XHJcbiAgICBjcmVhdGVPYmplY3RTdG9yZShzdG9yZU5hbWUsIG9wdGlvbnMpIHtcclxuICAgICAgICByZXR1cm4gbmV3IE9iamVjdFN0b3JlV3JhcHBlcih0aGlzLl9kYi5jcmVhdGVPYmplY3RTdG9yZShzdG9yZU5hbWUsIG9wdGlvbnMpKTtcclxuICAgIH1cclxuICAgIGNsb3NlKCkge1xyXG4gICAgICAgIHRoaXMuX2RiLmNsb3NlKCk7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgVHJhbnNhY3Rpb25XcmFwcGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKF90cmFuc2FjdGlvbikge1xyXG4gICAgICAgIHRoaXMuX3RyYW5zYWN0aW9uID0gX3RyYW5zYWN0aW9uO1xyXG4gICAgICAgIHRoaXMuY29tcGxldGUgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zYWN0aW9uLm9uY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zYWN0aW9uLm9uZXJyb3IgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QodGhpcy5fdHJhbnNhY3Rpb24uZXJyb3IpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLl90cmFuc2FjdGlvbi5vbmFib3J0ID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KHRoaXMuX3RyYW5zYWN0aW9uLmVycm9yKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIG9iamVjdFN0b3JlKHN0b3JlTmFtZSkge1xyXG4gICAgICAgIHJldHVybiBuZXcgT2JqZWN0U3RvcmVXcmFwcGVyKHRoaXMuX3RyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHN0b3JlTmFtZSkpO1xyXG4gICAgfVxyXG59XHJcbmNsYXNzIE9iamVjdFN0b3JlV3JhcHBlciB7XHJcbiAgICBjb25zdHJ1Y3Rvcihfc3RvcmUpIHtcclxuICAgICAgICB0aGlzLl9zdG9yZSA9IF9zdG9yZTtcclxuICAgIH1cclxuICAgIGluZGV4KG5hbWUpIHtcclxuICAgICAgICByZXR1cm4gbmV3IEluZGV4V3JhcHBlcih0aGlzLl9zdG9yZS5pbmRleChuYW1lKSk7XHJcbiAgICB9XHJcbiAgICBjcmVhdGVJbmRleChuYW1lLCBrZXlwYXRoLCBvcHRpb25zKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBJbmRleFdyYXBwZXIodGhpcy5fc3RvcmUuY3JlYXRlSW5kZXgobmFtZSwga2V5cGF0aCwgb3B0aW9ucykpO1xyXG4gICAgfVxyXG4gICAgZ2V0KGtleSkge1xyXG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLl9zdG9yZS5nZXQoa2V5KTtcclxuICAgICAgICByZXR1cm4gcHJvbWlzaWZ5UmVxdWVzdChyZXF1ZXN0LCAnRXJyb3IgcmVhZGluZyBmcm9tIEluZGV4ZWREQicpO1xyXG4gICAgfVxyXG4gICAgcHV0KHZhbHVlLCBrZXkpIHtcclxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5fc3RvcmUucHV0KHZhbHVlLCBrZXkpO1xyXG4gICAgICAgIHJldHVybiBwcm9taXNpZnlSZXF1ZXN0KHJlcXVlc3QsICdFcnJvciB3cml0aW5nIHRvIEluZGV4ZWREQicpO1xyXG4gICAgfVxyXG4gICAgZGVsZXRlKGtleSkge1xyXG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLl9zdG9yZS5kZWxldGUoa2V5KTtcclxuICAgICAgICByZXR1cm4gcHJvbWlzaWZ5UmVxdWVzdChyZXF1ZXN0LCAnRXJyb3IgZGVsZXRpbmcgZnJvbSBJbmRleGVkREInKTtcclxuICAgIH1cclxuICAgIGNsZWFyKCkge1xyXG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLl9zdG9yZS5jbGVhcigpO1xyXG4gICAgICAgIHJldHVybiBwcm9taXNpZnlSZXF1ZXN0KHJlcXVlc3QsICdFcnJvciBjbGVhcmluZyBJbmRleGVkREIgb2JqZWN0IHN0b3JlJyk7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgSW5kZXhXcmFwcGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKF9pbmRleCkge1xyXG4gICAgICAgIHRoaXMuX2luZGV4ID0gX2luZGV4O1xyXG4gICAgfVxyXG4gICAgZ2V0KGtleSkge1xyXG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLl9pbmRleC5nZXQoa2V5KTtcclxuICAgICAgICByZXR1cm4gcHJvbWlzaWZ5UmVxdWVzdChyZXF1ZXN0LCAnRXJyb3IgcmVhZGluZyBmcm9tIEluZGV4ZWREQicpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIG9wZW5EQihkYk5hbWUsIGRiVmVyc2lvbiwgdXBncmFkZUNhbGxiYWNrKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihkYk5hbWUsIGRiVmVyc2lvbik7XHJcbiAgICAgICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgREJXcmFwcGVyKGV2ZW50LnRhcmdldC5yZXN1bHQpKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGBFcnJvciBvcGVuaW5nIGluZGV4ZWREQjogJHsoX2EgPSBldmVudC50YXJnZXQuZXJyb3IpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tZXNzYWdlfWApO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IGV2ZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIHVwZ3JhZGVDYWxsYmFjayhuZXcgREJXcmFwcGVyKHJlcXVlc3QucmVzdWx0KSwgZXZlbnQub2xkVmVyc2lvbiwgZXZlbnQubmV3VmVyc2lvbiwgbmV3IFRyYW5zYWN0aW9uV3JhcHBlcihyZXF1ZXN0LnRyYW5zYWN0aW9uKSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHJlamVjdChgRXJyb3Igb3BlbmluZyBpbmRleGVkREI6ICR7ZS5tZXNzYWdlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZURCKGRiTmFtZSkge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLmRlbGV0ZURhdGFiYXNlKGRiTmFtZSk7XHJcbiAgICAgICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSBldmVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoYEVycm9yIGRlbGV0aW5nIGluZGV4ZWREQiBkYXRhYmFzZSBcIiR7ZGJOYW1lfVwiOiAkeyhfYSA9IGV2ZW50LnRhcmdldC5lcnJvcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm1lc3NhZ2V9YCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHJlamVjdChgRXJyb3IgZGVsZXRpbmcgaW5kZXhlZERCIGRhdGFiYXNlIFwiJHtkYk5hbWV9XCI6ICR7ZS5tZXNzYWdlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59XG5cbmV4cG9ydCB7IENPTlNUQU5UUywgREJXcmFwcGVyLCBEZWZlcnJlZCwgRXJyb3JGYWN0b3J5LCBGaXJlYmFzZUVycm9yLCBNQVhfVkFMVUVfTUlMTElTLCBSQU5ET01fRkFDVE9SLCBTaGExLCBhcmVDb29raWVzRW5hYmxlZCwgYXNzZXJ0LCBhc3NlcnRpb25FcnJvciwgYXN5bmMsIGJhc2U2NCwgYmFzZTY0RGVjb2RlLCBiYXNlNjRFbmNvZGUsIGJhc2U2NHVybEVuY29kZVdpdGhvdXRQYWRkaW5nLCBjYWxjdWxhdGVCYWNrb2ZmTWlsbGlzLCBjb250YWlucywgY3JlYXRlTW9ja1VzZXJUb2tlbiwgY3JlYXRlU3Vic2NyaWJlLCBkZWNvZGUsIGRlZXBDb3B5LCBkZWVwRXF1YWwsIGRlZXBFeHRlbmQsIGRlbGV0ZURCLCBlcnJvclByZWZpeCwgZXh0cmFjdFF1ZXJ5c3RyaW5nLCBnZXRHbG9iYWwsIGdldE1vZHVsYXJJbnN0YW5jZSwgZ2V0VUEsIGlzQWRtaW4sIGlzQnJvd3NlciwgaXNCcm93c2VyRXh0ZW5zaW9uLCBpc0VsZWN0cm9uLCBpc0VtcHR5LCBpc0lFLCBpc0luZGV4ZWREQkF2YWlsYWJsZSwgaXNNb2JpbGVDb3Jkb3ZhLCBpc05vZGUsIGlzTm9kZVNkaywgaXNSZWFjdE5hdGl2ZSwgaXNTYWZhcmksIGlzVVdQLCBpc1ZhbGlkRm9ybWF0LCBpc1ZhbGlkVGltZXN0YW1wLCBpc3N1ZWRBdFRpbWUsIGpzb25FdmFsLCBtYXAsIG9wZW5EQiwgb3JkaW5hbCwgcXVlcnlzdHJpbmcsIHF1ZXJ5c3RyaW5nRGVjb2RlLCBzYWZlR2V0LCBzdHJpbmdMZW5ndGgsIHN0cmluZ1RvQnl0ZUFycmF5LCBzdHJpbmdpZnksIHZhbGlkYXRlQXJnQ291bnQsIHZhbGlkYXRlQ2FsbGJhY2ssIHZhbGlkYXRlQ29udGV4dE9iamVjdCwgdmFsaWRhdGVJbmRleGVkREJPcGVuYWJsZSwgdmFsaWRhdGVOYW1lc3BhY2UgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmVzbTIwMTcuanMubWFwXG4iLCJ2YXIgY29tbW9uanNHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fTtcblxudmFyIGVzbSA9IHt9O1xuXG4vKlxuXG4gQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy5cbiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuKi9cbnZhciBrLGdvb2c9Z29vZ3x8e30sbD1jb21tb25qc0dsb2JhbHx8c2VsZjtmdW5jdGlvbiBhYSgpe31mdW5jdGlvbiBiYShhKXt2YXIgYj10eXBlb2YgYTtiPVwib2JqZWN0XCIhPWI/YjphP0FycmF5LmlzQXJyYXkoYSk/XCJhcnJheVwiOmI6XCJudWxsXCI7cmV0dXJuIFwiYXJyYXlcIj09Ynx8XCJvYmplY3RcIj09YiYmXCJudW1iZXJcIj09dHlwZW9mIGEubGVuZ3RofWZ1bmN0aW9uIHAoYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIFwib2JqZWN0XCI9PWImJm51bGwhPWF8fFwiZnVuY3Rpb25cIj09Yn1mdW5jdGlvbiBkYShhKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsZWEpJiZhW2VhXXx8KGFbZWFdPSsrZmEpfXZhciBlYT1cImNsb3N1cmVfdWlkX1wiKygxRTkqTWF0aC5yYW5kb20oKT4+PjApLGZhPTA7ZnVuY3Rpb24gaGEoYSxiLGMpe3JldHVybiBhLmNhbGwuYXBwbHkoYS5iaW5kLGFyZ3VtZW50cyl9XG5mdW5jdGlvbiBpYShhLGIsYyl7aWYoIWEpdGhyb3cgRXJyb3IoKTtpZigyPGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBkPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywyKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO0FycmF5LnByb3RvdHlwZS51bnNoaWZ0LmFwcGx5KGUsZCk7cmV0dXJuIGEuYXBwbHkoYixlKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkoYixhcmd1bWVudHMpfX1mdW5jdGlvbiBxKGEsYixjKXtGdW5jdGlvbi5wcm90b3R5cGUuYmluZCYmLTEhPUZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLnRvU3RyaW5nKCkuaW5kZXhPZihcIm5hdGl2ZSBjb2RlXCIpP3E9aGE6cT1pYTtyZXR1cm4gcS5hcHBseShudWxsLGFyZ3VtZW50cyl9XG5mdW5jdGlvbiBqYShhLGIpe3ZhciBjPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD1jLnNsaWNlKCk7ZC5wdXNoLmFwcGx5KGQsYXJndW1lbnRzKTtyZXR1cm4gYS5hcHBseSh0aGlzLGQpfX1mdW5jdGlvbiB0KGEsYil7ZnVuY3Rpb24gYygpe31jLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLlo9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGM7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YTthLlZiPWZ1bmN0aW9uKGQsZSxmKXtmb3IodmFyIGg9QXJyYXkoYXJndW1lbnRzLmxlbmd0aC0yKSxuPTI7bjxhcmd1bWVudHMubGVuZ3RoO24rKyloW24tMl09YXJndW1lbnRzW25dO3JldHVybiBiLnByb3RvdHlwZVtlXS5hcHBseShkLGgpfTt9ZnVuY3Rpb24gdigpe3RoaXMucz10aGlzLnM7dGhpcy5vPXRoaXMubzt9dmFyIGthPTAsbGE9e307di5wcm90b3R5cGUucz0hMTt2LnByb3RvdHlwZS5uYT1mdW5jdGlvbigpe2lmKCF0aGlzLnMmJih0aGlzLnM9ITAsdGhpcy5NKCksMCE9a2EpKXt2YXIgYT1kYSh0aGlzKTtkZWxldGUgbGFbYV07fX07di5wcm90b3R5cGUuTT1mdW5jdGlvbigpe2lmKHRoaXMubylmb3IoO3RoaXMuby5sZW5ndGg7KXRoaXMuby5zaGlmdCgpKCk7fTtjb25zdCBtYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKFwic3RyaW5nXCI9PT10eXBlb2YgYSlyZXR1cm4gXCJzdHJpbmdcIiE9PXR5cGVvZiBifHwxIT1iLmxlbmd0aD8tMTphLmluZGV4T2YoYiwwKTtmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKylpZihjIGluIGEmJmFbY109PT1iKXJldHVybiBjO3JldHVybiAtMX0sbmE9QXJyYXkucHJvdG90eXBlLmZvckVhY2g/ZnVuY3Rpb24oYSxiLGMpe0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYSxiLGMpO306ZnVuY3Rpb24oYSxiLGMpe2NvbnN0IGQ9YS5sZW5ndGgsZT1cInN0cmluZ1wiPT09dHlwZW9mIGE/YS5zcGxpdChcIlwiKTphO2ZvcihsZXQgZj0wO2Y8ZDtmKyspZiBpbiBlJiZiLmNhbGwoYyxlW2ZdLGYsYSk7fTtcbmZ1bmN0aW9uIG9hKGEpe2E6e3ZhciBiPXBhO2NvbnN0IGM9YS5sZW5ndGgsZD1cInN0cmluZ1wiPT09dHlwZW9mIGE/YS5zcGxpdChcIlwiKTphO2ZvcihsZXQgZT0wO2U8YztlKyspaWYoZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKSl7Yj1lO2JyZWFrIGF9Yj0tMTt9cmV0dXJuIDA+Yj9udWxsOlwic3RyaW5nXCI9PT10eXBlb2YgYT9hLmNoYXJBdChiKTphW2JdfWZ1bmN0aW9uIHFhKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGFyZ3VtZW50cyl9ZnVuY3Rpb24gcmEoYSl7Y29uc3QgYj1hLmxlbmd0aDtpZigwPGIpe2NvbnN0IGM9QXJyYXkoYik7Zm9yKGxldCBkPTA7ZDxiO2QrKyljW2RdPWFbZF07cmV0dXJuIGN9cmV0dXJuIFtdfWZ1bmN0aW9uIHNhKGEpe3JldHVybiAvXltcXHNcXHhhMF0qJC8udGVzdChhKX12YXIgdGE9U3RyaW5nLnByb3RvdHlwZS50cmltP2Z1bmN0aW9uKGEpe3JldHVybiBhLnRyaW0oKX06ZnVuY3Rpb24oYSl7cmV0dXJuIC9eW1xcc1xceGEwXSooW1xcc1xcU10qPylbXFxzXFx4YTBdKiQvLmV4ZWMoYSlbMV19O2Z1bmN0aW9uIHcoYSxiKXtyZXR1cm4gLTEhPWEuaW5kZXhPZihiKX1mdW5jdGlvbiB1YShhLGIpe3JldHVybiBhPGI/LTE6YT5iPzE6MH12YXIgeDthOnt2YXIgdmE9bC5uYXZpZ2F0b3I7aWYodmEpe3ZhciB3YT12YS51c2VyQWdlbnQ7aWYod2Epe3g9d2E7YnJlYWsgYX19eD1cIlwiO31mdW5jdGlvbiB4YShhLGIsYyl7Zm9yKGNvbnN0IGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSk7fWZ1bmN0aW9uIHlhKGEpe2NvbnN0IGI9e307Zm9yKGNvbnN0IGMgaW4gYSliW2NdPWFbY107cmV0dXJuIGJ9dmFyIHphPVwiY29uc3RydWN0b3IgaGFzT3duUHJvcGVydHkgaXNQcm90b3R5cGVPZiBwcm9wZXJ0eUlzRW51bWVyYWJsZSB0b0xvY2FsZVN0cmluZyB0b1N0cmluZyB2YWx1ZU9mXCIuc3BsaXQoXCIgXCIpO2Z1bmN0aW9uIEFhKGEsYil7bGV0IGMsZDtmb3IobGV0IGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXtkPWFyZ3VtZW50c1tlXTtmb3IoYyBpbiBkKWFbY109ZFtjXTtmb3IobGV0IGY9MDtmPHphLmxlbmd0aDtmKyspYz16YVtmXSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCxjKSYmKGFbY109ZFtjXSk7fX1mdW5jdGlvbiBDYShhKXtDYVtcIiBcIl0oYSk7cmV0dXJuIGF9Q2FbXCIgXCJdPWFhO2Z1bmN0aW9uIEZhKGEpe3ZhciBiPUdhO3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiw5KT9iWzldOmJbOV09YSg5KX12YXIgSGE9dyh4LFwiT3BlcmFcIikseT13KHgsXCJUcmlkZW50XCIpfHx3KHgsXCJNU0lFXCIpLElhPXcoeCxcIkVkZ2VcIiksSmE9SWF8fHksS2E9dyh4LFwiR2Vja29cIikmJiEodyh4LnRvTG93ZXJDYXNlKCksXCJ3ZWJraXRcIikmJiF3KHgsXCJFZGdlXCIpKSYmISh3KHgsXCJUcmlkZW50XCIpfHx3KHgsXCJNU0lFXCIpKSYmIXcoeCxcIkVkZ2VcIiksTGE9dyh4LnRvTG93ZXJDYXNlKCksXCJ3ZWJraXRcIikmJiF3KHgsXCJFZGdlXCIpO2Z1bmN0aW9uIE1hKCl7dmFyIGE9bC5kb2N1bWVudDtyZXR1cm4gYT9hLmRvY3VtZW50TW9kZTp2b2lkIDB9dmFyIE5hO1xuYTp7dmFyIE9hPVwiXCIsUGE9ZnVuY3Rpb24oKXt2YXIgYT14O2lmKEthKXJldHVybiAvcnY6KFteXFwpO10rKShcXCl8OykvLmV4ZWMoYSk7aWYoSWEpcmV0dXJuIC9FZGdlXFwvKFtcXGRcXC5dKykvLmV4ZWMoYSk7aWYoeSlyZXR1cm4gL1xcYig/Ok1TSUV8cnYpWzogXShbXlxcKTtdKykoXFwpfDspLy5leGVjKGEpO2lmKExhKXJldHVybiAvV2ViS2l0XFwvKFxcUyspLy5leGVjKGEpO2lmKEhhKXJldHVybiAvKD86VmVyc2lvbilbIFxcL10/KFxcUyspLy5leGVjKGEpfSgpO1BhJiYoT2E9UGE/UGFbMV06XCJcIik7aWYoeSl7dmFyIFFhPU1hKCk7aWYobnVsbCE9UWEmJlFhPnBhcnNlRmxvYXQoT2EpKXtOYT1TdHJpbmcoUWEpO2JyZWFrIGF9fU5hPU9hO312YXIgR2E9e307XG5mdW5jdGlvbiBSYSgpe3JldHVybiBGYShmdW5jdGlvbigpe2xldCBhPTA7Y29uc3QgYj10YShTdHJpbmcoTmEpKS5zcGxpdChcIi5cIiksYz10YShcIjlcIikuc3BsaXQoXCIuXCIpLGQ9TWF0aC5tYXgoYi5sZW5ndGgsYy5sZW5ndGgpO2ZvcihsZXQgaD0wOzA9PWEmJmg8ZDtoKyspe3ZhciBlPWJbaF18fFwiXCIsZj1jW2hdfHxcIlwiO2Rve2U9LyhcXGQqKShcXEQqKSguKikvLmV4ZWMoZSl8fFtcIlwiLFwiXCIsXCJcIixcIlwiXTtmPS8oXFxkKikoXFxEKikoLiopLy5leGVjKGYpfHxbXCJcIixcIlwiLFwiXCIsXCJcIl07aWYoMD09ZVswXS5sZW5ndGgmJjA9PWZbMF0ubGVuZ3RoKWJyZWFrO2E9dWEoMD09ZVsxXS5sZW5ndGg/MDpwYXJzZUludChlWzFdLDEwKSwwPT1mWzFdLmxlbmd0aD8wOnBhcnNlSW50KGZbMV0sMTApKXx8dWEoMD09ZVsyXS5sZW5ndGgsMD09ZlsyXS5sZW5ndGgpfHx1YShlWzJdLGZbMl0pO2U9ZVszXTtmPWZbM107fXdoaWxlKDA9PWEpfXJldHVybiAwPD1hfSl9dmFyIFNhO1xuaWYobC5kb2N1bWVudCYmeSl7dmFyIFRhPU1hKCk7U2E9VGE/VGE6cGFyc2VJbnQoTmEsMTApfHx2b2lkIDA7fWVsc2UgU2E9dm9pZCAwO3ZhciBVYT1TYTt2YXIgVmE9ZnVuY3Rpb24oKXtpZighbC5hZGRFdmVudExpc3RlbmVyfHwhT2JqZWN0LmRlZmluZVByb3BlcnR5KXJldHVybiAhMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSxcInBhc3NpdmVcIix7Z2V0OmZ1bmN0aW9uKCl7YT0hMDt9fSk7dHJ5e2wuYWRkRXZlbnRMaXN0ZW5lcihcInRlc3RcIixhYSxiKSxsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0ZXN0XCIsYWEsYik7fWNhdGNoKGMpe31yZXR1cm4gYX0oKTtmdW5jdGlvbiB6KGEsYil7dGhpcy50eXBlPWE7dGhpcy5nPXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPSExO316LnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7dGhpcy5kZWZhdWx0UHJldmVudGVkPSEwO307ZnVuY3Rpb24gQShhLGIpe3ouY2FsbCh0aGlzLGE/YS50eXBlOlwiXCIpO3RoaXMucmVsYXRlZFRhcmdldD10aGlzLmc9dGhpcy50YXJnZXQ9bnVsbDt0aGlzLmJ1dHRvbj10aGlzLnNjcmVlblk9dGhpcy5zY3JlZW5YPXRoaXMuY2xpZW50WT10aGlzLmNsaWVudFg9MDt0aGlzLmtleT1cIlwiO3RoaXMubWV0YUtleT10aGlzLnNoaWZ0S2V5PXRoaXMuYWx0S2V5PXRoaXMuY3RybEtleT0hMTt0aGlzLnN0YXRlPW51bGw7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPVwiXCI7dGhpcy5pPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMuZz1iO2lmKGI9YS5yZWxhdGVkVGFyZ2V0KXtpZihLYSl7YTp7dHJ5e0NhKGIubm9kZU5hbWUpO3ZhciBlPSEwO2JyZWFrIGF9Y2F0Y2goZil7fWU9XG4hMTt9ZXx8KGI9bnVsbCk7fX1lbHNlIFwibW91c2VvdmVyXCI9PWM/Yj1hLmZyb21FbGVtZW50OlwibW91c2VvdXRcIj09YyYmKGI9YS50b0VsZW1lbnQpO3RoaXMucmVsYXRlZFRhcmdldD1iO2Q/KHRoaXMuY2xpZW50WD12b2lkIDAhPT1kLmNsaWVudFg/ZC5jbGllbnRYOmQucGFnZVgsdGhpcy5jbGllbnRZPXZvaWQgMCE9PWQuY2xpZW50WT9kLmNsaWVudFk6ZC5wYWdlWSx0aGlzLnNjcmVlblg9ZC5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1kLnNjcmVlbll8fDApOih0aGlzLmNsaWVudFg9dm9pZCAwIT09YS5jbGllbnRYP2EuY2xpZW50WDphLnBhZ2VYLHRoaXMuY2xpZW50WT12b2lkIDAhPT1hLmNsaWVudFk/YS5jbGllbnRZOmEucGFnZVksdGhpcy5zY3JlZW5YPWEuc2NyZWVuWHx8MCx0aGlzLnNjcmVlblk9YS5zY3JlZW5ZfHwwKTt0aGlzLmJ1dHRvbj1hLmJ1dHRvbjt0aGlzLmtleT1hLmtleXx8XCJcIjt0aGlzLmN0cmxLZXk9YS5jdHJsS2V5O3RoaXMuYWx0S2V5PWEuYWx0S2V5O3RoaXMuc2hpZnRLZXk9XG5hLnNoaWZ0S2V5O3RoaXMubWV0YUtleT1hLm1ldGFLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1cInN0cmluZ1wiPT09dHlwZW9mIGEucG9pbnRlclR5cGU/YS5wb2ludGVyVHlwZTpXYVthLnBvaW50ZXJUeXBlXXx8XCJcIjt0aGlzLnN0YXRlPWEuc3RhdGU7dGhpcy5pPWE7YS5kZWZhdWx0UHJldmVudGVkJiZBLlouaC5jYWxsKHRoaXMpO319dChBLHopO3ZhciBXYT17MjpcInRvdWNoXCIsMzpcInBlblwiLDQ6XCJtb3VzZVwifTtBLnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7QS5aLmguY2FsbCh0aGlzKTt2YXIgYT10aGlzLmk7YS5wcmV2ZW50RGVmYXVsdD9hLnByZXZlbnREZWZhdWx0KCk6YS5yZXR1cm5WYWx1ZT0hMTt9O3ZhciBCPVwiY2xvc3VyZV9saXN0ZW5hYmxlX1wiKygxRTYqTWF0aC5yYW5kb20oKXwwKTt2YXIgWGE9MDtmdW5jdGlvbiBZYShhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMuaWE9ZTt0aGlzLmtleT0rK1hhO3RoaXMuY2E9dGhpcy5mYT0hMTt9ZnVuY3Rpb24gWmEoYSl7YS5jYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5pYT1udWxsO31mdW5jdGlvbiAkYShhKXt0aGlzLnNyYz1hO3RoaXMuZz17fTt0aGlzLmg9MDt9JGEucHJvdG90eXBlLmFkZD1mdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWEudG9TdHJpbmcoKTthPXRoaXMuZ1tmXTthfHwoYT10aGlzLmdbZl09W10sdGhpcy5oKyspO3ZhciBoPWFiKGEsYixkLGUpOy0xPGg/KGI9YVtoXSxjfHwoYi5mYT0hMSkpOihiPW5ldyBZYShiLHRoaXMuc3JjLGYsISFkLGUpLGIuZmE9YyxhLnB1c2goYikpO3JldHVybiBifTtmdW5jdGlvbiBiYihhLGIpe3ZhciBjPWIudHlwZTtpZihjIGluIGEuZyl7dmFyIGQ9YS5nW2NdLGU9bWEoZCxiKSxmOyhmPTA8PWUpJiZBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoZCxlLDEpO2YmJihaYShiKSwwPT1hLmdbY10ubGVuZ3RoJiYoZGVsZXRlIGEuZ1tjXSxhLmgtLSkpO319XG5mdW5jdGlvbiBhYihhLGIsYyxkKXtmb3IodmFyIGU9MDtlPGEubGVuZ3RoOysrZSl7dmFyIGY9YVtlXTtpZighZi5jYSYmZi5saXN0ZW5lcj09YiYmZi5jYXB0dXJlPT0hIWMmJmYuaWE9PWQpcmV0dXJuIGV9cmV0dXJuIC0xfXZhciBjYj1cImNsb3N1cmVfbG1fXCIrKDFFNipNYXRoLnJhbmRvbSgpfDApLGRiPXt9O2Z1bmN0aW9uIGZiKGEsYixjLGQsZSl7aWYoZCYmZC5vbmNlKXJldHVybiBnYihhLGIsYyxkLGUpO2lmKEFycmF5LmlzQXJyYXkoYikpe2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWZiKGEsYltmXSxjLGQsZSk7cmV0dXJuIG51bGx9Yz1oYihjKTtyZXR1cm4gYSYmYVtCXT9hLk4oYixjLHAoZCk/ISFkLmNhcHR1cmU6ISFkLGUpOmliKGEsYixjLCExLGQsZSl9XG5mdW5jdGlvbiBpYihhLGIsYyxkLGUsZil7aWYoIWIpdGhyb3cgRXJyb3IoXCJJbnZhbGlkIGV2ZW50IHR5cGVcIik7dmFyIGg9cChlKT8hIWUuY2FwdHVyZTohIWUsbj1qYihhKTtufHwoYVtjYl09bj1uZXcgJGEoYSkpO2M9bi5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9a2IoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKVZhfHwoZT1oKSx2b2lkIDA9PT1lJiYoZT0hMSksYS5hZGRFdmVudExpc3RlbmVyKGIudG9TdHJpbmcoKSxkLGUpO2Vsc2UgaWYoYS5hdHRhY2hFdmVudClhLmF0dGFjaEV2ZW50KGxiKGIudG9TdHJpbmcoKSksZCk7ZWxzZSBpZihhLmFkZExpc3RlbmVyJiZhLnJlbW92ZUxpc3RlbmVyKWEuYWRkTGlzdGVuZXIoZCk7ZWxzZSB0aHJvdyBFcnJvcihcImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS5cIik7cmV0dXJuIGN9XG5mdW5jdGlvbiBrYigpe2Z1bmN0aW9uIGEoYyl7cmV0dXJuIGIuY2FsbChhLnNyYyxhLmxpc3RlbmVyLGMpfXZhciBiPW1iO3JldHVybiBhfWZ1bmN0aW9uIGdiKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSl7Zm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspZ2IoYSxiW2ZdLGMsZCxlKTtyZXR1cm4gbnVsbH1jPWhiKGMpO3JldHVybiBhJiZhW0JdP2EuTyhiLGMscChkKT8hIWQuY2FwdHVyZTohIWQsZSk6aWIoYSxiLGMsITAsZCxlKX1cbmZ1bmN0aW9uIG5iKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyluYihhLGJbZl0sYyxkLGUpO2Vsc2UgKGQ9cChkKT8hIWQuY2FwdHVyZTohIWQsYz1oYihjKSxhJiZhW0JdKT8oYT1hLmksYj1TdHJpbmcoYikudG9TdHJpbmcoKSxiIGluIGEuZyYmKGY9YS5nW2JdLGM9YWIoZixjLGQsZSksLTE8YyYmKFphKGZbY10pLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChmLGMsMSksMD09Zi5sZW5ndGgmJihkZWxldGUgYS5nW2JdLGEuaC0tKSkpKTphJiYoYT1qYihhKSkmJihiPWEuZ1tiLnRvU3RyaW5nKCldLGE9LTEsYiYmKGE9YWIoYixjLGQsZSkpLChjPS0xPGE/YlthXTpudWxsKSYmb2IoYykpO31cbmZ1bmN0aW9uIG9iKGEpe2lmKFwibnVtYmVyXCIhPT10eXBlb2YgYSYmYSYmIWEuY2Epe3ZhciBiPWEuc3JjO2lmKGImJmJbQl0pYmIoYi5pLGEpO2Vsc2Uge3ZhciBjPWEudHlwZSxkPWEucHJveHk7Yi5yZW1vdmVFdmVudExpc3RlbmVyP2IucmVtb3ZlRXZlbnRMaXN0ZW5lcihjLGQsYS5jYXB0dXJlKTpiLmRldGFjaEV2ZW50P2IuZGV0YWNoRXZlbnQobGIoYyksZCk6Yi5hZGRMaXN0ZW5lciYmYi5yZW1vdmVMaXN0ZW5lciYmYi5yZW1vdmVMaXN0ZW5lcihkKTsoYz1qYihiKSk/KGJiKGMsYSksMD09Yy5oJiYoYy5zcmM9bnVsbCxiW2NiXT1udWxsKSk6WmEoYSk7fX19ZnVuY3Rpb24gbGIoYSl7cmV0dXJuIGEgaW4gZGI/ZGJbYV06ZGJbYV09XCJvblwiK2F9ZnVuY3Rpb24gbWIoYSxiKXtpZihhLmNhKWE9ITA7ZWxzZSB7Yj1uZXcgQShiLHRoaXMpO3ZhciBjPWEubGlzdGVuZXIsZD1hLmlhfHxhLnNyYzthLmZhJiZvYihhKTthPWMuY2FsbChkLGIpO31yZXR1cm4gYX1cbmZ1bmN0aW9uIGpiKGEpe2E9YVtjYl07cmV0dXJuIGEgaW5zdGFuY2VvZiAkYT9hOm51bGx9dmFyIHBiPVwiX19jbG9zdXJlX2V2ZW50c19mbl9cIisoMUU5Kk1hdGgucmFuZG9tKCk+Pj4wKTtmdW5jdGlvbiBoYihhKXtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYSlyZXR1cm4gYTthW3BiXXx8KGFbcGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbcGJdfWZ1bmN0aW9uIEMoKXt2LmNhbGwodGhpcyk7dGhpcy5pPW5ldyAkYSh0aGlzKTt0aGlzLlA9dGhpczt0aGlzLkk9bnVsbDt9dChDLHYpO0MucHJvdG90eXBlW0JdPSEwO0MucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7bmIodGhpcyxhLGIsYyxkKTt9O1xuZnVuY3Rpb24gRChhLGIpe3ZhciBjLGQ9YS5JO2lmKGQpZm9yKGM9W107ZDtkPWQuSSljLnB1c2goZCk7YT1hLlA7ZD1iLnR5cGV8fGI7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBiKWI9bmV3IHooYixhKTtlbHNlIGlmKGIgaW5zdGFuY2VvZiB6KWIudGFyZ2V0PWIudGFyZ2V0fHxhO2Vsc2Uge3ZhciBlPWI7Yj1uZXcgeihkLGEpO0FhKGIsZSk7fWU9ITA7aWYoYylmb3IodmFyIGY9Yy5sZW5ndGgtMTswPD1mO2YtLSl7dmFyIGg9Yi5nPWNbZl07ZT1xYihoLGQsITAsYikmJmU7fWg9Yi5nPWE7ZT1xYihoLGQsITAsYikmJmU7ZT1xYihoLGQsITEsYikmJmU7aWYoYylmb3IoZj0wO2Y8Yy5sZW5ndGg7ZisrKWg9Yi5nPWNbZl0sZT1xYihoLGQsITEsYikmJmU7fVxuQy5wcm90b3R5cGUuTT1mdW5jdGlvbigpe0MuWi5NLmNhbGwodGhpcyk7aWYodGhpcy5pKXt2YXIgYT10aGlzLmksYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKVphKGRbZV0pO2RlbGV0ZSBhLmdbY107YS5oLS07fX10aGlzLkk9bnVsbDt9O0MucHJvdG90eXBlLk49ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMuaS5hZGQoU3RyaW5nKGEpLGIsITEsYyxkKX07Qy5wcm90b3R5cGUuTz1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5pLmFkZChTdHJpbmcoYSksYiwhMCxjLGQpfTtcbmZ1bmN0aW9uIHFiKGEsYixjLGQpe2I9YS5pLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4gITA7Yj1iLmNvbmNhdCgpO2Zvcih2YXIgZT0hMCxmPTA7ZjxiLmxlbmd0aDsrK2Ype3ZhciBoPWJbZl07aWYoaCYmIWguY2EmJmguY2FwdHVyZT09Yyl7dmFyIG49aC5saXN0ZW5lcix1PWguaWF8fGguc3JjO2guZmEmJmJiKGEuaSxoKTtlPSExIT09bi5jYWxsKHUsZCkmJmU7fX1yZXR1cm4gZSYmIWQuZGVmYXVsdFByZXZlbnRlZH12YXIgcmI9bC5KU09OLnN0cmluZ2lmeTtmdW5jdGlvbiBzYigpe3ZhciBhPXRiO2xldCBiPW51bGw7YS5nJiYoYj1hLmcsYS5nPWEuZy5uZXh0LGEuZ3x8KGEuaD1udWxsKSxiLm5leHQ9bnVsbCk7cmV0dXJuIGJ9Y2xhc3MgdWJ7Y29uc3RydWN0b3IoKXt0aGlzLmg9dGhpcy5nPW51bGw7fWFkZChhLGIpe2NvbnN0IGM9dmIuZ2V0KCk7Yy5zZXQoYSxiKTt0aGlzLmg/dGhpcy5oLm5leHQ9Yzp0aGlzLmc9Yzt0aGlzLmg9Yzt9fXZhciB2Yj1uZXcgY2xhc3N7Y29uc3RydWN0b3IoYSxiKXt0aGlzLmk9YTt0aGlzLmo9Yjt0aGlzLmg9MDt0aGlzLmc9bnVsbDt9Z2V0KCl7bGV0IGE7MDx0aGlzLmg/KHRoaXMuaC0tLGE9dGhpcy5nLHRoaXMuZz1hLm5leHQsYS5uZXh0PW51bGwpOmE9dGhpcy5pKCk7cmV0dXJuIGF9fSgoKT0+bmV3IHdiLGE9PmEucmVzZXQoKSk7XG5jbGFzcyB3Yntjb25zdHJ1Y3Rvcigpe3RoaXMubmV4dD10aGlzLmc9dGhpcy5oPW51bGw7fXNldChhLGIpe3RoaXMuaD1hO3RoaXMuZz1iO3RoaXMubmV4dD1udWxsO31yZXNldCgpe3RoaXMubmV4dD10aGlzLmc9dGhpcy5oPW51bGw7fX1mdW5jdGlvbiB5YihhKXtsLnNldFRpbWVvdXQoKCk9Pnt0aHJvdyBhO30sMCk7fWZ1bmN0aW9uIHpiKGEsYil7QWJ8fEJiKCk7Q2J8fChBYigpLENiPSEwKTt0Yi5hZGQoYSxiKTt9dmFyIEFiO2Z1bmN0aW9uIEJiKCl7dmFyIGE9bC5Qcm9taXNlLnJlc29sdmUodm9pZCAwKTtBYj1mdW5jdGlvbigpe2EudGhlbihEYik7fTt9dmFyIENiPSExLHRiPW5ldyB1YjtmdW5jdGlvbiBEYigpe2Zvcih2YXIgYTthPXNiKCk7KXt0cnl7YS5oLmNhbGwoYS5nKTt9Y2F0Y2goYyl7eWIoYyk7fXZhciBiPXZiO2IuaihhKTsxMDA+Yi5oJiYoYi5oKyssYS5uZXh0PWIuZyxiLmc9YSk7fUNiPSExO31mdW5jdGlvbiBFYihhLGIpe0MuY2FsbCh0aGlzKTt0aGlzLmg9YXx8MTt0aGlzLmc9Ynx8bDt0aGlzLmo9cSh0aGlzLmtiLHRoaXMpO3RoaXMubD1EYXRlLm5vdygpO310KEViLEMpO2s9RWIucHJvdG90eXBlO2suZGE9ITE7ay5TPW51bGw7ay5rYj1mdW5jdGlvbigpe2lmKHRoaXMuZGEpe3ZhciBhPURhdGUubm93KCktdGhpcy5sOzA8YSYmYTwuOCp0aGlzLmg/dGhpcy5TPXRoaXMuZy5zZXRUaW1lb3V0KHRoaXMuaix0aGlzLmgtYSk6KHRoaXMuUyYmKHRoaXMuZy5jbGVhclRpbWVvdXQodGhpcy5TKSx0aGlzLlM9bnVsbCksRCh0aGlzLFwidGlja1wiKSx0aGlzLmRhJiYoRmIodGhpcyksdGhpcy5zdGFydCgpKSk7fX07ay5zdGFydD1mdW5jdGlvbigpe3RoaXMuZGE9ITA7dGhpcy5TfHwodGhpcy5TPXRoaXMuZy5zZXRUaW1lb3V0KHRoaXMuaix0aGlzLmgpLHRoaXMubD1EYXRlLm5vdygpKTt9O1xuZnVuY3Rpb24gRmIoYSl7YS5kYT0hMTthLlMmJihhLmcuY2xlYXJUaW1lb3V0KGEuUyksYS5TPW51bGwpO31rLk09ZnVuY3Rpb24oKXtFYi5aLk0uY2FsbCh0aGlzKTtGYih0aGlzKTtkZWxldGUgdGhpcy5nO307ZnVuY3Rpb24gR2IoYSxiLGMpe2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBhKWMmJihhPXEoYSxjKSk7ZWxzZSBpZihhJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBhLmhhbmRsZUV2ZW50KWE9cShhLmhhbmRsZUV2ZW50LGEpO2Vsc2UgdGhyb3cgRXJyb3IoXCJJbnZhbGlkIGxpc3RlbmVyIGFyZ3VtZW50XCIpO3JldHVybiAyMTQ3NDgzNjQ3PE51bWJlcihiKT8tMTpsLnNldFRpbWVvdXQoYSxifHwwKX1mdW5jdGlvbiBIYihhKXthLmc9R2IoKCk9PnthLmc9bnVsbDthLmkmJihhLmk9ITEsSGIoYSkpO30sYS5qKTtjb25zdCBiPWEuaDthLmg9bnVsbDthLm0uYXBwbHkobnVsbCxiKTt9Y2xhc3MgSWIgZXh0ZW5kcyB2e2NvbnN0cnVjdG9yKGEsYil7c3VwZXIoKTt0aGlzLm09YTt0aGlzLmo9Yjt0aGlzLmg9bnVsbDt0aGlzLmk9ITE7dGhpcy5nPW51bGw7fWwoYSl7dGhpcy5oPWFyZ3VtZW50czt0aGlzLmc/dGhpcy5pPSEwOkhiKHRoaXMpO31NKCl7c3VwZXIuTSgpO3RoaXMuZyYmKGwuY2xlYXJUaW1lb3V0KHRoaXMuZyksdGhpcy5nPW51bGwsdGhpcy5pPSExLHRoaXMuaD1udWxsKTt9fWZ1bmN0aW9uIEUoYSl7di5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fTt9dChFLHYpO3ZhciBKYj1bXTtmdW5jdGlvbiBLYihhLGIsYyxkKXtBcnJheS5pc0FycmF5KGMpfHwoYyYmKEpiWzBdPWMudG9TdHJpbmcoKSksYz1KYik7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWZiKGIsY1tlXSxkfHxhLmhhbmRsZUV2ZW50LCExLGEuaHx8YSk7aWYoIWYpYnJlYWs7YS5nW2Yua2V5XT1mO319ZnVuY3Rpb24gTGIoYSl7eGEoYS5nLGZ1bmN0aW9uKGIsYyl7dGhpcy5nLmhhc093blByb3BlcnR5KGMpJiZvYihiKTt9LGEpO2EuZz17fTt9RS5wcm90b3R5cGUuTT1mdW5jdGlvbigpe0UuWi5NLmNhbGwodGhpcyk7TGIodGhpcyk7fTtFLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKFwiRXZlbnRIYW5kbGVyLmhhbmRsZUV2ZW50IG5vdCBpbXBsZW1lbnRlZFwiKTt9O2Z1bmN0aW9uIE1iKCl7dGhpcy5nPSEwO31NYi5wcm90b3R5cGUuQWE9ZnVuY3Rpb24oKXt0aGlzLmc9ITE7fTtmdW5jdGlvbiBOYihhLGIsYyxkLGUsZil7YS5pbmZvKGZ1bmN0aW9uKCl7aWYoYS5nKWlmKGYpe3ZhciBoPVwiXCI7Zm9yKHZhciBuPWYuc3BsaXQoXCImXCIpLHU9MDt1PG4ubGVuZ3RoO3UrKyl7dmFyIG09blt1XS5zcGxpdChcIj1cIik7aWYoMTxtLmxlbmd0aCl7dmFyIHI9bVswXTttPW1bMV07dmFyIEc9ci5zcGxpdChcIl9cIik7aD0yPD1HLmxlbmd0aCYmXCJ0eXBlXCI9PUdbMV0/aCsocitcIj1cIittK1wiJlwiKTpoKyhyK1wiPXJlZGFjdGVkJlwiKTt9fX1lbHNlIGg9bnVsbDtlbHNlIGg9ZjtyZXR1cm4gXCJYTUxIVFRQIFJFUSAoXCIrZCtcIikgW2F0dGVtcHQgXCIrZStcIl06IFwiK2IrXCJcXG5cIitjK1wiXFxuXCIraH0pO31cbmZ1bmN0aW9uIE9iKGEsYixjLGQsZSxmLGgpe2EuaW5mbyhmdW5jdGlvbigpe3JldHVybiBcIlhNTEhUVFAgUkVTUCAoXCIrZCtcIikgWyBhdHRlbXB0IFwiK2UrXCJdOiBcIitiK1wiXFxuXCIrYytcIlxcblwiK2YrXCIgXCIraH0pO31mdW5jdGlvbiBGKGEsYixjLGQpe2EuaW5mbyhmdW5jdGlvbigpe3JldHVybiBcIlhNTEhUVFAgVEVYVCAoXCIrYitcIik6IFwiK1BiKGEsYykrKGQ/XCIgXCIrZDpcIlwiKX0pO31mdW5jdGlvbiBRYihhLGIpe2EuaW5mbyhmdW5jdGlvbigpe3JldHVybiBcIlRJTUVPVVQ6IFwiK2J9KTt9TWIucHJvdG90eXBlLmluZm89ZnVuY3Rpb24oKXt9O1xuZnVuY3Rpb24gUGIoYSxiKXtpZighYS5nKXJldHVybiBiO2lmKCFiKXJldHVybiBudWxsO3RyeXt2YXIgYz1KU09OLnBhcnNlKGIpO2lmKGMpZm9yKGE9MDthPGMubGVuZ3RoO2ErKylpZihBcnJheS5pc0FycmF5KGNbYV0pKXt2YXIgZD1jW2FdO2lmKCEoMj5kLmxlbmd0aCkpe3ZhciBlPWRbMV07aWYoQXJyYXkuaXNBcnJheShlKSYmISgxPmUubGVuZ3RoKSl7dmFyIGY9ZVswXTtpZihcIm5vb3BcIiE9ZiYmXCJzdG9wXCIhPWYmJlwiY2xvc2VcIiE9Zilmb3IodmFyIGg9MTtoPGUubGVuZ3RoO2grKyllW2hdPVwiXCI7fX19cmV0dXJuIHJiKGMpfWNhdGNoKG4pe3JldHVybiBifX12YXIgSD17fSxSYj1udWxsO2Z1bmN0aW9uIFNiKCl7cmV0dXJuIFJiPVJifHxuZXcgQ31ILk1hPVwic2VydmVycmVhY2hhYmlsaXR5XCI7ZnVuY3Rpb24gVGIoYSl7ei5jYWxsKHRoaXMsSC5NYSxhKTt9dChUYix6KTtmdW5jdGlvbiBJKGEpe2NvbnN0IGI9U2IoKTtEKGIsbmV3IFRiKGIsYSkpO31ILlNUQVRfRVZFTlQ9XCJzdGF0ZXZlbnRcIjtmdW5jdGlvbiBVYihhLGIpe3ouY2FsbCh0aGlzLEguU1RBVF9FVkVOVCxhKTt0aGlzLnN0YXQ9Yjt9dChVYix6KTtmdW5jdGlvbiBKKGEpe2NvbnN0IGI9U2IoKTtEKGIsbmV3IFViKGIsYSkpO31ILk5hPVwidGltaW5nZXZlbnRcIjtmdW5jdGlvbiBWYihhLGIpe3ouY2FsbCh0aGlzLEguTmEsYSk7dGhpcy5zaXplPWI7fXQoVmIseik7XG5mdW5jdGlvbiBLKGEsYil7aWYoXCJmdW5jdGlvblwiIT09dHlwZW9mIGEpdGhyb3cgRXJyb3IoXCJGbiBtdXN0IG5vdCBiZSBudWxsIGFuZCBtdXN0IGJlIGEgZnVuY3Rpb25cIik7cmV0dXJuIGwuc2V0VGltZW91dChmdW5jdGlvbigpe2EoKTt9LGIpfXZhciBXYj17Tk9fRVJST1I6MCxsYjoxLHliOjIseGI6MyxzYjo0LHdiOjUsemI6NixKYTo3LFRJTUVPVVQ6OCxDYjo5fTt2YXIgWGI9e3FiOlwiY29tcGxldGVcIixNYjpcInN1Y2Nlc3NcIixLYTpcImVycm9yXCIsSmE6XCJhYm9ydFwiLEViOlwicmVhZHlcIixGYjpcInJlYWR5c3RhdGVjaGFuZ2VcIixUSU1FT1VUOlwidGltZW91dFwiLEFiOlwiaW5jcmVtZW50YWxkYXRhXCIsRGI6XCJwcm9ncmVzc1wiLHRiOlwiZG93bmxvYWRwcm9ncmVzc1wiLFViOlwidXBsb2FkcHJvZ3Jlc3NcIn07ZnVuY3Rpb24gWWIoKXt9WWIucHJvdG90eXBlLmg9bnVsbDtmdW5jdGlvbiBaYihhKXtyZXR1cm4gYS5ofHwoYS5oPWEuaSgpKX1mdW5jdGlvbiAkYigpe312YXIgTD17T1BFTjpcImFcIixwYjpcImJcIixLYTpcImNcIixCYjpcImRcIn07ZnVuY3Rpb24gYWMoKXt6LmNhbGwodGhpcyxcImRcIik7fXQoYWMseik7ZnVuY3Rpb24gYmMoKXt6LmNhbGwodGhpcyxcImNcIik7fXQoYmMseik7dmFyIGNjO2Z1bmN0aW9uIGRjKCl7fXQoZGMsWWIpO2RjLnByb3RvdHlwZS5nPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdH07ZGMucHJvdG90eXBlLmk9ZnVuY3Rpb24oKXtyZXR1cm4ge319O2NjPW5ldyBkYztmdW5jdGlvbiBNKGEsYixjLGQpe3RoaXMubD1hO3RoaXMuaj1iO3RoaXMubT1jO3RoaXMuWD1kfHwxO3RoaXMuVj1uZXcgRSh0aGlzKTt0aGlzLlA9ZWM7YT1KYT8xMjU6dm9pZCAwO3RoaXMuVz1uZXcgRWIoYSk7dGhpcy5IPW51bGw7dGhpcy5pPSExO3RoaXMucz10aGlzLkE9dGhpcy52PXRoaXMuSz10aGlzLkY9dGhpcy5ZPXRoaXMuQj1udWxsO3RoaXMuRD1bXTt0aGlzLmc9bnVsbDt0aGlzLkM9MDt0aGlzLm89dGhpcy51PW51bGw7dGhpcy5OPS0xO3RoaXMuST0hMTt0aGlzLk89MDt0aGlzLkw9bnVsbDt0aGlzLmFhPXRoaXMuSj10aGlzLiQ9dGhpcy5VPSExO3RoaXMuaD1uZXcgZmM7fWZ1bmN0aW9uIGZjKCl7dGhpcy5pPW51bGw7dGhpcy5nPVwiXCI7dGhpcy5oPSExO312YXIgZWM9NDVFMyxnYz17fSxoYz17fTtrPU0ucHJvdG90eXBlO2suc2V0VGltZW91dD1mdW5jdGlvbihhKXt0aGlzLlA9YTt9O1xuZnVuY3Rpb24gaWMoYSxiLGMpe2EuSz0xO2Eudj1qYyhOKGIpKTthLnM9YzthLlU9ITA7a2MoYSxudWxsKTt9ZnVuY3Rpb24ga2MoYSxiKXthLkY9RGF0ZS5ub3coKTtsYyhhKTthLkE9TihhLnYpO3ZhciBjPWEuQSxkPWEuWDtBcnJheS5pc0FycmF5KGQpfHwoZD1bU3RyaW5nKGQpXSk7bWMoYy5oLFwidFwiLGQpO2EuQz0wO2M9YS5sLkg7YS5oPW5ldyBmYzthLmc9bmMoYS5sLGM/YjpudWxsLCFhLnMpOzA8YS5PJiYoYS5MPW5ldyBJYihxKGEuSWEsYSxhLmcpLGEuTykpO0tiKGEuVixhLmcsXCJyZWFkeXN0YXRlY2hhbmdlXCIsYS5nYik7Yj1hLkg/eWEoYS5IKTp7fTthLnM/KGEudXx8KGEudT1cIlBPU1RcIiksYltcIkNvbnRlbnQtVHlwZVwiXT1cImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiLGEuZy5lYShhLkEsYS51LGEucyxiKSk6KGEudT1cIkdFVFwiLGEuZy5lYShhLkEsYS51LG51bGwsYikpO0koMSk7TmIoYS5qLGEudSxhLkEsYS5tLGEuWCxhLnMpO31cbmsuZ2I9ZnVuY3Rpb24oYSl7YT1hLnRhcmdldDtjb25zdCBiPXRoaXMuTDtiJiYzPT1PKGEpP2IubCgpOnRoaXMuSWEoYSk7fTtcbmsuSWE9ZnVuY3Rpb24oYSl7dHJ5e2lmKGE9PXRoaXMuZylhOntjb25zdCByPU8odGhpcy5nKTt2YXIgYj10aGlzLmcuRGEoKTtjb25zdCBHPXRoaXMuZy5iYSgpO2lmKCEoMz5yKSYmKDMhPXJ8fEphfHx0aGlzLmcmJih0aGlzLmguaHx8dGhpcy5nLmdhKCl8fG9jKHRoaXMuZykpKSl7dGhpcy5JfHw0IT1yfHw3PT1ifHwoOD09Ynx8MD49Rz9JKDMpOkkoMikpO3BjKHRoaXMpO3ZhciBjPXRoaXMuZy5iYSgpO3RoaXMuTj1jO2I6aWYocWModGhpcykpe3ZhciBkPW9jKHRoaXMuZyk7YT1cIlwiO3ZhciBlPWQubGVuZ3RoLGY9ND09Tyh0aGlzLmcpO2lmKCF0aGlzLmguaSl7aWYoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiBUZXh0RGVjb2Rlcil7UCh0aGlzKTtyYyh0aGlzKTt2YXIgaD1cIlwiO2JyZWFrIGJ9dGhpcy5oLmk9bmV3IGwuVGV4dERlY29kZXI7fWZvcihiPTA7YjxlO2IrKyl0aGlzLmguaD0hMCxhKz10aGlzLmguaS5kZWNvZGUoZFtiXSx7c3RyZWFtOmYmJmI9PWUtMX0pO2Quc3BsaWNlKDAsXG5lKTt0aGlzLmguZys9YTt0aGlzLkM9MDtoPXRoaXMuaC5nO31lbHNlIGg9dGhpcy5nLmdhKCk7dGhpcy5pPTIwMD09YztPYih0aGlzLmosdGhpcy51LHRoaXMuQSx0aGlzLm0sdGhpcy5YLHIsYyk7aWYodGhpcy5pKXtpZih0aGlzLiQmJiF0aGlzLkope2I6e2lmKHRoaXMuZyl7dmFyIG4sdT10aGlzLmc7aWYoKG49dS5nP3UuZy5nZXRSZXNwb25zZUhlYWRlcihcIlgtSFRUUC1Jbml0aWFsLVJlc3BvbnNlXCIpOm51bGwpJiYhc2Eobikpe3ZhciBtPW47YnJlYWsgYn19bT1udWxsO31pZihjPW0pRih0aGlzLmosdGhpcy5tLGMsXCJJbml0aWFsIGhhbmRzaGFrZSByZXNwb25zZSB2aWEgWC1IVFRQLUluaXRpYWwtUmVzcG9uc2VcIiksdGhpcy5KPSEwLHNjKHRoaXMsYyk7ZWxzZSB7dGhpcy5pPSExO3RoaXMubz0zO0ooMTIpO1AodGhpcyk7cmModGhpcyk7YnJlYWsgYX19dGhpcy5VPyh0Yyh0aGlzLHIsaCksSmEmJnRoaXMuaSYmMz09ciYmKEtiKHRoaXMuVix0aGlzLlcsXCJ0aWNrXCIsdGhpcy5mYiksXG50aGlzLlcuc3RhcnQoKSkpOihGKHRoaXMuaix0aGlzLm0saCxudWxsKSxzYyh0aGlzLGgpKTs0PT1yJiZQKHRoaXMpO3RoaXMuaSYmIXRoaXMuSSYmKDQ9PXI/dWModGhpcy5sLHRoaXMpOih0aGlzLmk9ITEsbGModGhpcykpKTt9ZWxzZSA0MDA9PWMmJjA8aC5pbmRleE9mKFwiVW5rbm93biBTSURcIik/KHRoaXMubz0zLEooMTIpKToodGhpcy5vPTAsSigxMykpLFAodGhpcykscmModGhpcyk7fX19Y2F0Y2gocil7fWZpbmFsbHl7fX07ZnVuY3Rpb24gcWMoYSl7cmV0dXJuIGEuZz9cIkdFVFwiPT1hLnUmJjIhPWEuSyYmYS5sLkJhOiExfVxuZnVuY3Rpb24gdGMoYSxiLGMpe2xldCBkPSEwLGU7Zm9yKDshYS5JJiZhLkM8Yy5sZW5ndGg7KWlmKGU9dmMoYSxjKSxlPT1oYyl7ND09YiYmKGEubz00LEooMTQpLGQ9ITEpO0YoYS5qLGEubSxudWxsLFwiW0luY29tcGxldGUgUmVzcG9uc2VdXCIpO2JyZWFrfWVsc2UgaWYoZT09Z2Mpe2Eubz00O0ooMTUpO0YoYS5qLGEubSxjLFwiW0ludmFsaWQgQ2h1bmtdXCIpO2Q9ITE7YnJlYWt9ZWxzZSBGKGEuaixhLm0sZSxudWxsKSxzYyhhLGUpO3FjKGEpJiZlIT1oYyYmZSE9Z2MmJihhLmguZz1cIlwiLGEuQz0wKTs0IT1ifHwwIT1jLmxlbmd0aHx8YS5oLmh8fChhLm89MSxKKDE2KSxkPSExKTthLmk9YS5pJiZkO2Q/MDxjLmxlbmd0aCYmIWEuYWEmJihhLmFhPSEwLGI9YS5sLGIuZz09YSYmYi4kJiYhYi5MJiYoYi5oLmluZm8oXCJHcmVhdCwgbm8gYnVmZmVyaW5nIHByb3h5IGRldGVjdGVkLiBCeXRlcyByZWNlaXZlZDogXCIrYy5sZW5ndGgpLHdjKGIpLGIuTD0hMCxKKDExKSkpOihGKGEuaixhLm0sXG5jLFwiW0ludmFsaWQgQ2h1bmtlZCBSZXNwb25zZV1cIiksUChhKSxyYyhhKSk7fWsuZmI9ZnVuY3Rpb24oKXtpZih0aGlzLmcpe3ZhciBhPU8odGhpcy5nKSxiPXRoaXMuZy5nYSgpO3RoaXMuQzxiLmxlbmd0aCYmKHBjKHRoaXMpLHRjKHRoaXMsYSxiKSx0aGlzLmkmJjQhPWEmJmxjKHRoaXMpKTt9fTtmdW5jdGlvbiB2YyhhLGIpe3ZhciBjPWEuQyxkPWIuaW5kZXhPZihcIlxcblwiLGMpO2lmKC0xPT1kKXJldHVybiBoYztjPU51bWJlcihiLnN1YnN0cmluZyhjLGQpKTtpZihpc05hTihjKSlyZXR1cm4gZ2M7ZCs9MTtpZihkK2M+Yi5sZW5ndGgpcmV0dXJuIGhjO2I9Yi5zdWJzdHIoZCxjKTthLkM9ZCtjO3JldHVybiBifWsuY2FuY2VsPWZ1bmN0aW9uKCl7dGhpcy5JPSEwO1AodGhpcyk7fTtmdW5jdGlvbiBsYyhhKXthLlk9RGF0ZS5ub3coKSthLlA7eGMoYSxhLlApO31cbmZ1bmN0aW9uIHhjKGEsYil7aWYobnVsbCE9YS5CKXRocm93IEVycm9yKFwiV2F0Y2hEb2cgdGltZXIgbm90IG51bGxcIik7YS5CPUsocShhLmViLGEpLGIpO31mdW5jdGlvbiBwYyhhKXthLkImJihsLmNsZWFyVGltZW91dChhLkIpLGEuQj1udWxsKTt9ay5lYj1mdW5jdGlvbigpe3RoaXMuQj1udWxsO2NvbnN0IGE9RGF0ZS5ub3coKTswPD1hLXRoaXMuWT8oUWIodGhpcy5qLHRoaXMuQSksMiE9dGhpcy5LJiYoSSgzKSxKKDE3KSksUCh0aGlzKSx0aGlzLm89MixyYyh0aGlzKSk6eGModGhpcyx0aGlzLlktYSk7fTtmdW5jdGlvbiByYyhhKXswPT1hLmwuR3x8YS5JfHx1YyhhLmwsYSk7fWZ1bmN0aW9uIFAoYSl7cGMoYSk7dmFyIGI9YS5MO2ImJlwiZnVuY3Rpb25cIj09dHlwZW9mIGIubmEmJmIubmEoKTthLkw9bnVsbDtGYihhLlcpO0xiKGEuVik7YS5nJiYoYj1hLmcsYS5nPW51bGwsYi5hYm9ydCgpLGIubmEoKSk7fVxuZnVuY3Rpb24gc2MoYSxiKXt0cnl7dmFyIGM9YS5sO2lmKDAhPWMuRyYmKGMuZz09YXx8eWMoYy5pLGEpKSlpZihjLkk9YS5OLCFhLkomJnljKGMuaSxhKSYmMz09Yy5HKXt0cnl7dmFyIGQ9Yy5DYS5nLnBhcnNlKGIpO31jYXRjaChtKXtkPW51bGw7fWlmKEFycmF5LmlzQXJyYXkoZCkmJjM9PWQubGVuZ3RoKXt2YXIgZT1kO2lmKDA9PWVbMF0pYTp7aWYoIWMudSl7aWYoYy5nKWlmKGMuZy5GKzNFMzxhLkYpemMoYyksQWMoYyk7ZWxzZSBicmVhayBhO0JjKGMpO0ooMTgpO319ZWxzZSBjLnRhPWVbMV0sMDxjLnRhLWMuVSYmMzc1MDA+ZVsyXSYmYy5OJiYwPT1jLkEmJiFjLnYmJihjLnY9SyhxKGMuYWIsYyksNkUzKSk7aWYoMT49Q2MoYy5pKSYmYy5rYSl7dHJ5e2Mua2EoKTt9Y2F0Y2gobSl7fWMua2E9dm9pZCAwO319ZWxzZSBRKGMsMTEpO31lbHNlIGlmKChhLkp8fGMuZz09YSkmJnpjKGMpLCFzYShiKSlmb3IoZT1jLkNhLmcucGFyc2UoYiksYj0wO2I8ZS5sZW5ndGg7YisrKXtsZXQgbT1lW2JdO1xuYy5VPW1bMF07bT1tWzFdO2lmKDI9PWMuRylpZihcImNcIj09bVswXSl7Yy5KPW1bMV07Yy5sYT1tWzJdO2NvbnN0IHI9bVszXTtudWxsIT1yJiYoYy5tYT1yLGMuaC5pbmZvKFwiVkVSPVwiK2MubWEpKTtjb25zdCBHPW1bNF07bnVsbCE9RyYmKGMuemE9RyxjLmguaW5mbyhcIlNWRVI9XCIrYy56YSkpO2NvbnN0IERhPW1bNV07bnVsbCE9RGEmJlwibnVtYmVyXCI9PT10eXBlb2YgRGEmJjA8RGEmJihkPTEuNSpEYSxjLks9ZCxjLmguaW5mbyhcImJhY2tDaGFubmVsUmVxdWVzdFRpbWVvdXRNc189XCIrZCkpO2Q9Yztjb25zdCBjYT1hLmc7aWYoY2Epe2NvbnN0IEVhPWNhLmc/Y2EuZy5nZXRSZXNwb25zZUhlYWRlcihcIlgtQ2xpZW50LVdpcmUtUHJvdG9jb2xcIik6bnVsbDtpZihFYSl7dmFyIGY9ZC5pOyFmLmcmJih3KEVhLFwic3BkeVwiKXx8dyhFYSxcInF1aWNcIil8fHcoRWEsXCJoMlwiKSkmJihmLmo9Zi5sLGYuZz1uZXcgU2V0LGYuaCYmKERjKGYsZi5oKSxmLmg9bnVsbCkpO31pZihkLkQpe2NvbnN0IHhiPVxuY2EuZz9jYS5nLmdldFJlc3BvbnNlSGVhZGVyKFwiWC1IVFRQLVNlc3Npb24tSWRcIik6bnVsbDt4YiYmKGQuc2E9eGIsUihkLkYsZC5ELHhiKSk7fX1jLkc9MztjLmomJmMuai54YSgpO2MuJCYmKGMuTz1EYXRlLm5vdygpLWEuRixjLmguaW5mbyhcIkhhbmRzaGFrZSBSVFQ6IFwiK2MuTytcIm1zXCIpKTtkPWM7dmFyIGg9YTtkLm9hPUVjKGQsZC5IP2QubGE6bnVsbCxkLlcpO2lmKGguSil7RmMoZC5pLGgpO3ZhciBuPWgsdT1kLks7dSYmbi5zZXRUaW1lb3V0KHUpO24uQiYmKHBjKG4pLGxjKG4pKTtkLmc9aDt9ZWxzZSBHYyhkKTswPGMubC5sZW5ndGgmJkhjKGMpO31lbHNlIFwic3RvcFwiIT1tWzBdJiZcImNsb3NlXCIhPW1bMF18fFEoYyw3KTtlbHNlIDM9PWMuRyYmKFwic3RvcFwiPT1tWzBdfHxcImNsb3NlXCI9PW1bMF0/XCJzdG9wXCI9PW1bMF0/UShjLDcpOkljKGMpOlwibm9vcFwiIT1tWzBdJiZjLmomJmMuai53YShtKSxjLkE9MCk7fUkoNCk7fWNhdGNoKG0pe319ZnVuY3Rpb24gSmMoYSl7aWYoYS5SJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBhLlIpcmV0dXJuIGEuUigpO2lmKFwic3RyaW5nXCI9PT10eXBlb2YgYSlyZXR1cm4gYS5zcGxpdChcIlwiKTtpZihiYShhKSl7Zm9yKHZhciBiPVtdLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspYi5wdXNoKGFbZF0pO3JldHVybiBifWI9W107Yz0wO2ZvcihkIGluIGEpYltjKytdPWFbZF07cmV0dXJuIGJ9XG5mdW5jdGlvbiBLYyhhLGIpe2lmKGEuZm9yRWFjaCYmXCJmdW5jdGlvblwiPT10eXBlb2YgYS5mb3JFYWNoKWEuZm9yRWFjaChiLHZvaWQgMCk7ZWxzZSBpZihiYShhKXx8XCJzdHJpbmdcIj09PXR5cGVvZiBhKW5hKGEsYix2b2lkIDApO2Vsc2Uge2lmKGEuVCYmXCJmdW5jdGlvblwiPT10eXBlb2YgYS5UKXZhciBjPWEuVCgpO2Vsc2UgaWYoYS5SJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBhLlIpYz12b2lkIDA7ZWxzZSBpZihiYShhKXx8XCJzdHJpbmdcIj09PXR5cGVvZiBhKXtjPVtdO2Zvcih2YXIgZD1hLmxlbmd0aCxlPTA7ZTxkO2UrKyljLnB1c2goZSk7fWVsc2UgZm9yKGUgaW4gYz1bXSxkPTAsYSljW2QrK109ZTtkPUpjKGEpO2U9ZC5sZW5ndGg7Zm9yKHZhciBmPTA7ZjxlO2YrKyliLmNhbGwodm9pZCAwLGRbZl0sYyYmY1tmXSxhKTt9fWZ1bmN0aW9uIFMoYSxiKXt0aGlzLmg9e307dGhpcy5nPVtdO3RoaXMuaT0wO3ZhciBjPWFyZ3VtZW50cy5sZW5ndGg7aWYoMTxjKXtpZihjJTIpdGhyb3cgRXJyb3IoXCJVbmV2ZW4gbnVtYmVyIG9mIGFyZ3VtZW50c1wiKTtmb3IodmFyIGQ9MDtkPGM7ZCs9Mil0aGlzLnNldChhcmd1bWVudHNbZF0sYXJndW1lbnRzW2QrMV0pO31lbHNlIGlmKGEpaWYoYSBpbnN0YW5jZW9mIFMpZm9yKGM9YS5UKCksZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMuc2V0KGNbZF0sYS5nZXQoY1tkXSkpO2Vsc2UgZm9yKGQgaW4gYSl0aGlzLnNldChkLGFbZF0pO31rPVMucHJvdG90eXBlO2suUj1mdW5jdGlvbigpe0xjKHRoaXMpO2Zvcih2YXIgYT1bXSxiPTA7Yjx0aGlzLmcubGVuZ3RoO2IrKylhLnB1c2godGhpcy5oW3RoaXMuZ1tiXV0pO3JldHVybiBhfTtrLlQ9ZnVuY3Rpb24oKXtMYyh0aGlzKTtyZXR1cm4gdGhpcy5nLmNvbmNhdCgpfTtcbmZ1bmN0aW9uIExjKGEpe2lmKGEuaSE9YS5nLmxlbmd0aCl7Zm9yKHZhciBiPTAsYz0wO2I8YS5nLmxlbmd0aDspe3ZhciBkPWEuZ1tiXTtUKGEuaCxkKSYmKGEuZ1tjKytdPWQpO2IrKzt9YS5nLmxlbmd0aD1jO31pZihhLmkhPWEuZy5sZW5ndGgpe3ZhciBlPXt9O2ZvcihjPWI9MDtiPGEuZy5sZW5ndGg7KWQ9YS5nW2JdLFQoZSxkKXx8KGEuZ1tjKytdPWQsZVtkXT0xKSxiKys7YS5nLmxlbmd0aD1jO319ay5nZXQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVCh0aGlzLmgsYSk/dGhpcy5oW2FdOmJ9O2suc2V0PWZ1bmN0aW9uKGEsYil7VCh0aGlzLmgsYSl8fCh0aGlzLmkrKyx0aGlzLmcucHVzaChhKSk7dGhpcy5oW2FdPWI7fTtrLmZvckVhY2g9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9dGhpcy5UKCksZD0wO2Q8Yy5sZW5ndGg7ZCsrKXt2YXIgZT1jW2RdLGY9dGhpcy5nZXQoZSk7YS5jYWxsKGIsZixlLHRoaXMpO319O1xuZnVuY3Rpb24gVChhLGIpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxiKX12YXIgTWM9L14oPzooW146Lz8jLl0rKTopPyg/OlxcL1xcLyg/OihbXlxcXFwvPyNdKilAKT8oW15cXFxcLz8jXSo/KSg/OjooWzAtOV0rKSk/KD89W1xcXFwvPyNdfCQpKT8oW14/I10rKT8oPzpcXD8oW14jXSopKT8oPzojKFtcXHNcXFNdKikpPyQvO2Z1bmN0aW9uIE5jKGEsYil7aWYoYSl7YT1hLnNwbGl0KFwiJlwiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXS5pbmRleE9mKFwiPVwiKSxlPW51bGw7aWYoMDw9ZCl7dmFyIGY9YVtjXS5zdWJzdHJpbmcoMCxkKTtlPWFbY10uc3Vic3RyaW5nKGQrMSk7fWVsc2UgZj1hW2NdO2IoZixlP2RlY29kZVVSSUNvbXBvbmVudChlLnJlcGxhY2UoL1xcKy9nLFwiIFwiKSk6XCJcIik7fX19ZnVuY3Rpb24gVShhLGIpe3RoaXMuaT10aGlzLnM9dGhpcy5qPVwiXCI7dGhpcy5tPW51bGw7dGhpcy5vPXRoaXMubD1cIlwiO3RoaXMuZz0hMTtpZihhIGluc3RhbmNlb2YgVSl7dGhpcy5nPXZvaWQgMCE9PWI/YjphLmc7T2ModGhpcyxhLmopO3RoaXMucz1hLnM7UGModGhpcyxhLmkpO1FjKHRoaXMsYS5tKTt0aGlzLmw9YS5sO2I9YS5oO3ZhciBjPW5ldyBSYztjLmk9Yi5pO2IuZyYmKGMuZz1uZXcgUyhiLmcpLGMuaD1iLmgpO1NjKHRoaXMsYyk7dGhpcy5vPWEubzt9ZWxzZSBhJiYoYz1TdHJpbmcoYSkubWF0Y2goTWMpKT8odGhpcy5nPSEhYixPYyh0aGlzLGNbMV18fFwiXCIsITApLHRoaXMucz1UYyhjWzJdfHxcIlwiKSxQYyh0aGlzLGNbM118fFwiXCIsITApLFFjKHRoaXMsY1s0XSksdGhpcy5sPVRjKGNbNV18fFwiXCIsITApLFNjKHRoaXMsY1s2XXx8XCJcIiwhMCksdGhpcy5vPVRjKGNbN118fFwiXCIpKToodGhpcy5nPSEhYix0aGlzLmg9bmV3IFJjKG51bGwsdGhpcy5nKSk7fVxuVS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgYT1bXSxiPXRoaXMuajtiJiZhLnB1c2goVWMoYixWYywhMCksXCI6XCIpO3ZhciBjPXRoaXMuaTtpZihjfHxcImZpbGVcIj09YilhLnB1c2goXCIvL1wiKSwoYj10aGlzLnMpJiZhLnB1c2goVWMoYixWYywhMCksXCJAXCIpLGEucHVzaChlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGMpKS5yZXBsYWNlKC8lMjUoWzAtOWEtZkEtRl17Mn0pL2csXCIlJDFcIikpLGM9dGhpcy5tLG51bGwhPWMmJmEucHVzaChcIjpcIixTdHJpbmcoYykpO2lmKGM9dGhpcy5sKXRoaXMuaSYmXCIvXCIhPWMuY2hhckF0KDApJiZhLnB1c2goXCIvXCIpLGEucHVzaChVYyhjLFwiL1wiPT1jLmNoYXJBdCgwKT9XYzpYYywhMCkpOyhjPXRoaXMuaC50b1N0cmluZygpKSYmYS5wdXNoKFwiP1wiLGMpOyhjPXRoaXMubykmJmEucHVzaChcIiNcIixVYyhjLFljKSk7cmV0dXJuIGEuam9pbihcIlwiKX07ZnVuY3Rpb24gTihhKXtyZXR1cm4gbmV3IFUoYSl9XG5mdW5jdGlvbiBPYyhhLGIsYyl7YS5qPWM/VGMoYiwhMCk6YjthLmomJihhLmo9YS5qLnJlcGxhY2UoLzokLyxcIlwiKSk7fWZ1bmN0aW9uIFBjKGEsYixjKXthLmk9Yz9UYyhiLCEwKTpiO31mdW5jdGlvbiBRYyhhLGIpe2lmKGIpe2I9TnVtYmVyKGIpO2lmKGlzTmFOKGIpfHwwPmIpdGhyb3cgRXJyb3IoXCJCYWQgcG9ydCBudW1iZXIgXCIrYik7YS5tPWI7fWVsc2UgYS5tPW51bGw7fWZ1bmN0aW9uIFNjKGEsYixjKXtiIGluc3RhbmNlb2YgUmM/KGEuaD1iLFpjKGEuaCxhLmcpKTooY3x8KGI9VWMoYiwkYykpLGEuaD1uZXcgUmMoYixhLmcpKTt9ZnVuY3Rpb24gUihhLGIsYyl7YS5oLnNldChiLGMpO31mdW5jdGlvbiBqYyhhKXtSKGEsXCJ6eFwiLE1hdGguZmxvb3IoMjE0NzQ4MzY0OCpNYXRoLnJhbmRvbSgpKS50b1N0cmluZygzNikrTWF0aC5hYnMoTWF0aC5mbG9vcigyMTQ3NDgzNjQ4Kk1hdGgucmFuZG9tKCkpXkRhdGUubm93KCkpLnRvU3RyaW5nKDM2KSk7cmV0dXJuIGF9XG5mdW5jdGlvbiBhZChhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFU/TihhKTpuZXcgVShhLHZvaWQgMCl9ZnVuY3Rpb24gYmQoYSxiLGMsZCl7dmFyIGU9bmV3IFUobnVsbCx2b2lkIDApO2EmJk9jKGUsYSk7YiYmUGMoZSxiKTtjJiZRYyhlLGMpO2QmJihlLmw9ZCk7cmV0dXJuIGV9ZnVuY3Rpb24gVGMoYSxiKXtyZXR1cm4gYT9iP2RlY29kZVVSSShhLnJlcGxhY2UoLyUyNS9nLFwiJTI1MjVcIikpOmRlY29kZVVSSUNvbXBvbmVudChhKTpcIlwifWZ1bmN0aW9uIFVjKGEsYixjKXtyZXR1cm4gXCJzdHJpbmdcIj09PXR5cGVvZiBhPyhhPWVuY29kZVVSSShhKS5yZXBsYWNlKGIsY2QpLGMmJihhPWEucmVwbGFjZSgvJTI1KFswLTlhLWZBLUZdezJ9KS9nLFwiJSQxXCIpKSxhKTpudWxsfWZ1bmN0aW9uIGNkKGEpe2E9YS5jaGFyQ29kZUF0KDApO3JldHVybiBcIiVcIisoYT4+NCYxNSkudG9TdHJpbmcoMTYpKyhhJjE1KS50b1N0cmluZygxNil9XG52YXIgVmM9L1sjXFwvXFw/QF0vZyxYYz0vWyNcXD86XS9nLFdjPS9bI1xcP10vZywkYz0vWyNcXD9AXS9nLFljPS8jL2c7ZnVuY3Rpb24gUmMoYSxiKXt0aGlzLmg9dGhpcy5nPW51bGw7dGhpcy5pPWF8fG51bGw7dGhpcy5qPSEhYjt9ZnVuY3Rpb24gVihhKXthLmd8fChhLmc9bmV3IFMsYS5oPTAsYS5pJiZOYyhhLmksZnVuY3Rpb24oYixjKXthLmFkZChkZWNvZGVVUklDb21wb25lbnQoYi5yZXBsYWNlKC9cXCsvZyxcIiBcIikpLGMpO30pKTt9az1SYy5wcm90b3R5cGU7ay5hZGQ9ZnVuY3Rpb24oYSxiKXtWKHRoaXMpO3RoaXMuaT1udWxsO2E9Vyh0aGlzLGEpO3ZhciBjPXRoaXMuZy5nZXQoYSk7Y3x8dGhpcy5nLnNldChhLGM9W10pO2MucHVzaChiKTt0aGlzLmgrPTE7cmV0dXJuIHRoaXN9O1xuZnVuY3Rpb24gZGQoYSxiKXtWKGEpO2I9VyhhLGIpO1QoYS5nLmgsYikmJihhLmk9bnVsbCxhLmgtPWEuZy5nZXQoYikubGVuZ3RoLGE9YS5nLFQoYS5oLGIpJiYoZGVsZXRlIGEuaFtiXSxhLmktLSxhLmcubGVuZ3RoPjIqYS5pJiZMYyhhKSkpO31mdW5jdGlvbiBlZChhLGIpe1YoYSk7Yj1XKGEsYik7cmV0dXJuIFQoYS5nLmgsYil9ay5mb3JFYWNoPWZ1bmN0aW9uKGEsYil7Vih0aGlzKTt0aGlzLmcuZm9yRWFjaChmdW5jdGlvbihjLGQpe25hKGMsZnVuY3Rpb24oZSl7YS5jYWxsKGIsZSxkLHRoaXMpO30sdGhpcyk7fSx0aGlzKTt9O2suVD1mdW5jdGlvbigpe1YodGhpcyk7Zm9yKHZhciBhPXRoaXMuZy5SKCksYj10aGlzLmcuVCgpLGM9W10sZD0wO2Q8Yi5sZW5ndGg7ZCsrKWZvcih2YXIgZT1hW2RdLGY9MDtmPGUubGVuZ3RoO2YrKyljLnB1c2goYltkXSk7cmV0dXJuIGN9O1xuay5SPWZ1bmN0aW9uKGEpe1YodGhpcyk7dmFyIGI9W107aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKWVkKHRoaXMsYSkmJihiPXFhKGIsdGhpcy5nLmdldChXKHRoaXMsYSkpKSk7ZWxzZSB7YT10aGlzLmcuUigpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9cWEoYixhW2NdKTt9cmV0dXJuIGJ9O2suc2V0PWZ1bmN0aW9uKGEsYil7Vih0aGlzKTt0aGlzLmk9bnVsbDthPVcodGhpcyxhKTtlZCh0aGlzLGEpJiYodGhpcy5oLT10aGlzLmcuZ2V0KGEpLmxlbmd0aCk7dGhpcy5nLnNldChhLFtiXSk7dGhpcy5oKz0xO3JldHVybiB0aGlzfTtrLmdldD1mdW5jdGlvbihhLGIpe2lmKCFhKXJldHVybiBiO2E9dGhpcy5SKGEpO3JldHVybiAwPGEubGVuZ3RoP1N0cmluZyhhWzBdKTpifTtmdW5jdGlvbiBtYyhhLGIsYyl7ZGQoYSxiKTswPGMubGVuZ3RoJiYoYS5pPW51bGwsYS5nLnNldChXKGEsYikscmEoYykpLGEuaCs9Yy5sZW5ndGgpO31cbmsudG9TdHJpbmc9ZnVuY3Rpb24oKXtpZih0aGlzLmkpcmV0dXJuIHRoaXMuaTtpZighdGhpcy5nKXJldHVybiBcIlwiO2Zvcih2YXIgYT1bXSxiPXRoaXMuZy5UKCksYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD1iW2NdLGU9ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhkKSk7ZD10aGlzLlIoZCk7Zm9yKHZhciBmPTA7ZjxkLmxlbmd0aDtmKyspe3ZhciBoPWU7XCJcIiE9PWRbZl0mJihoKz1cIj1cIitlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGRbZl0pKSk7YS5wdXNoKGgpO319cmV0dXJuIHRoaXMuaT1hLmpvaW4oXCImXCIpfTtmdW5jdGlvbiBXKGEsYil7Yj1TdHJpbmcoYik7YS5qJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBifWZ1bmN0aW9uIFpjKGEsYil7YiYmIWEuaiYmKFYoYSksYS5pPW51bGwsYS5nLmZvckVhY2goZnVuY3Rpb24oYyxkKXt2YXIgZT1kLnRvTG93ZXJDYXNlKCk7ZCE9ZSYmKGRkKHRoaXMsZCksbWModGhpcyxlLGMpKTt9LGEpKTthLmo9Yjt9dmFyIGZkPWNsYXNze2NvbnN0cnVjdG9yKGEsYil7dGhpcy5oPWE7dGhpcy5nPWI7fX07ZnVuY3Rpb24gZ2QoYSl7dGhpcy5sPWF8fGhkO2wuUGVyZm9ybWFuY2VOYXZpZ2F0aW9uVGltaW5nPyhhPWwucGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5VHlwZShcIm5hdmlnYXRpb25cIiksYT0wPGEubGVuZ3RoJiYoXCJocVwiPT1hWzBdLm5leHRIb3BQcm90b2NvbHx8XCJoMlwiPT1hWzBdLm5leHRIb3BQcm90b2NvbCkpOmE9ISEobC5nJiZsLmcuRWEmJmwuZy5FYSgpJiZsLmcuRWEoKS5aYik7dGhpcy5qPWE/dGhpcy5sOjE7dGhpcy5nPW51bGw7MTx0aGlzLmomJih0aGlzLmc9bmV3IFNldCk7dGhpcy5oPW51bGw7dGhpcy5pPVtdO312YXIgaGQ9MTA7ZnVuY3Rpb24gaWQoYSl7cmV0dXJuIGEuaD8hMDphLmc/YS5nLnNpemU+PWEuajohMX1mdW5jdGlvbiBDYyhhKXtyZXR1cm4gYS5oPzE6YS5nP2EuZy5zaXplOjB9ZnVuY3Rpb24geWMoYSxiKXtyZXR1cm4gYS5oP2EuaD09YjphLmc/YS5nLmhhcyhiKTohMX1mdW5jdGlvbiBEYyhhLGIpe2EuZz9hLmcuYWRkKGIpOmEuaD1iO31cbmZ1bmN0aW9uIEZjKGEsYil7YS5oJiZhLmg9PWI/YS5oPW51bGw6YS5nJiZhLmcuaGFzKGIpJiZhLmcuZGVsZXRlKGIpO31nZC5wcm90b3R5cGUuY2FuY2VsPWZ1bmN0aW9uKCl7dGhpcy5pPWpkKHRoaXMpO2lmKHRoaXMuaCl0aGlzLmguY2FuY2VsKCksdGhpcy5oPW51bGw7ZWxzZSBpZih0aGlzLmcmJjAhPT10aGlzLmcuc2l6ZSl7Zm9yKGNvbnN0IGEgb2YgdGhpcy5nLnZhbHVlcygpKWEuY2FuY2VsKCk7dGhpcy5nLmNsZWFyKCk7fX07ZnVuY3Rpb24gamQoYSl7aWYobnVsbCE9YS5oKXJldHVybiBhLmkuY29uY2F0KGEuaC5EKTtpZihudWxsIT1hLmcmJjAhPT1hLmcuc2l6ZSl7bGV0IGI9YS5pO2Zvcihjb25zdCBjIG9mIGEuZy52YWx1ZXMoKSliPWIuY29uY2F0KGMuRCk7cmV0dXJuIGJ9cmV0dXJuIHJhKGEuaSl9ZnVuY3Rpb24ga2QoKXt9a2QucHJvdG90eXBlLnN0cmluZ2lmeT1mdW5jdGlvbihhKXtyZXR1cm4gbC5KU09OLnN0cmluZ2lmeShhLHZvaWQgMCl9O2tkLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihhKXtyZXR1cm4gbC5KU09OLnBhcnNlKGEsdm9pZCAwKX07ZnVuY3Rpb24gbGQoKXt0aGlzLmc9bmV3IGtkO31mdW5jdGlvbiBtZChhLGIsYyl7Y29uc3QgZD1jfHxcIlwiO3RyeXtLYyhhLGZ1bmN0aW9uKGUsZil7bGV0IGg9ZTtwKGUpJiYoaD1yYihlKSk7Yi5wdXNoKGQrZitcIj1cIitlbmNvZGVVUklDb21wb25lbnQoaCkpO30pO31jYXRjaChlKXt0aHJvdyBiLnB1c2goZCtcInR5cGU9XCIrZW5jb2RlVVJJQ29tcG9uZW50KFwiX2JhZG1hcFwiKSksZTt9fWZ1bmN0aW9uIG5kKGEsYil7Y29uc3QgYz1uZXcgTWI7aWYobC5JbWFnZSl7Y29uc3QgZD1uZXcgSW1hZ2U7ZC5vbmxvYWQ9amEob2QsYyxkLFwiVGVzdExvYWRJbWFnZTogbG9hZGVkXCIsITAsYik7ZC5vbmVycm9yPWphKG9kLGMsZCxcIlRlc3RMb2FkSW1hZ2U6IGVycm9yXCIsITEsYik7ZC5vbmFib3J0PWphKG9kLGMsZCxcIlRlc3RMb2FkSW1hZ2U6IGFib3J0XCIsITEsYik7ZC5vbnRpbWVvdXQ9amEob2QsYyxkLFwiVGVzdExvYWRJbWFnZTogdGltZW91dFwiLCExLGIpO2wuc2V0VGltZW91dChmdW5jdGlvbigpe2lmKGQub250aW1lb3V0KWQub250aW1lb3V0KCk7fSwxRTQpO2Quc3JjPWE7fWVsc2UgYighMSk7fWZ1bmN0aW9uIG9kKGEsYixjLGQsZSl7dHJ5e2Iub25sb2FkPW51bGwsYi5vbmVycm9yPW51bGwsYi5vbmFib3J0PW51bGwsYi5vbnRpbWVvdXQ9bnVsbCxlKGQpO31jYXRjaChmKXt9fWZ1bmN0aW9uIHBkKGEpe3RoaXMubD1hLiRifHxudWxsO3RoaXMuaj1hLmlifHwhMTt9dChwZCxZYik7cGQucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHFkKHRoaXMubCx0aGlzLmopfTtwZC5wcm90b3R5cGUuaT1mdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYX19KHt9KTtmdW5jdGlvbiBxZChhLGIpe0MuY2FsbCh0aGlzKTt0aGlzLkQ9YTt0aGlzLnU9Yjt0aGlzLm09dm9pZCAwO3RoaXMucmVhZHlTdGF0ZT1yZDt0aGlzLnN0YXR1cz0wO3RoaXMucmVzcG9uc2VUeXBlPXRoaXMucmVzcG9uc2VUZXh0PXRoaXMucmVzcG9uc2U9dGhpcy5zdGF0dXNUZXh0PVwiXCI7dGhpcy5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbDt0aGlzLnY9bmV3IEhlYWRlcnM7dGhpcy5oPW51bGw7dGhpcy5DPVwiR0VUXCI7dGhpcy5CPVwiXCI7dGhpcy5nPSExO3RoaXMuQT10aGlzLmo9dGhpcy5sPW51bGw7fXQocWQsQyk7dmFyIHJkPTA7az1xZC5wcm90b3R5cGU7XG5rLm9wZW49ZnVuY3Rpb24oYSxiKXtpZih0aGlzLnJlYWR5U3RhdGUhPXJkKXRocm93IHRoaXMuYWJvcnQoKSxFcnJvcihcIkVycm9yIHJlb3BlbmluZyBhIGNvbm5lY3Rpb25cIik7dGhpcy5DPWE7dGhpcy5CPWI7dGhpcy5yZWFkeVN0YXRlPTE7c2QodGhpcyk7fTtrLnNlbmQ9ZnVuY3Rpb24oYSl7aWYoMSE9dGhpcy5yZWFkeVN0YXRlKXRocm93IHRoaXMuYWJvcnQoKSxFcnJvcihcIm5lZWQgdG8gY2FsbCBvcGVuKCkgZmlyc3QuIFwiKTt0aGlzLmc9ITA7Y29uc3QgYj17aGVhZGVyczp0aGlzLnYsbWV0aG9kOnRoaXMuQyxjcmVkZW50aWFsczp0aGlzLm0sY2FjaGU6dm9pZCAwfTthJiYoYi5ib2R5PWEpOyh0aGlzLkR8fGwpLmZldGNoKG5ldyBSZXF1ZXN0KHRoaXMuQixiKSkudGhlbih0aGlzLlZhLmJpbmQodGhpcyksdGhpcy5oYS5iaW5kKHRoaXMpKTt9O1xuay5hYm9ydD1mdW5jdGlvbigpe3RoaXMucmVzcG9uc2U9dGhpcy5yZXNwb25zZVRleHQ9XCJcIjt0aGlzLnY9bmV3IEhlYWRlcnM7dGhpcy5zdGF0dXM9MDt0aGlzLmomJnRoaXMuai5jYW5jZWwoXCJSZXF1ZXN0IHdhcyBhYm9ydGVkLlwiKTsxPD10aGlzLnJlYWR5U3RhdGUmJnRoaXMuZyYmNCE9dGhpcy5yZWFkeVN0YXRlJiYodGhpcy5nPSExLHRkKHRoaXMpKTt0aGlzLnJlYWR5U3RhdGU9cmQ7fTtcbmsuVmE9ZnVuY3Rpb24oYSl7aWYodGhpcy5nJiYodGhpcy5sPWEsdGhpcy5ofHwodGhpcy5zdGF0dXM9dGhpcy5sLnN0YXR1cyx0aGlzLnN0YXR1c1RleHQ9dGhpcy5sLnN0YXR1c1RleHQsdGhpcy5oPWEuaGVhZGVycyx0aGlzLnJlYWR5U3RhdGU9MixzZCh0aGlzKSksdGhpcy5nJiYodGhpcy5yZWFkeVN0YXRlPTMsc2QodGhpcyksdGhpcy5nKSkpaWYoXCJhcnJheWJ1ZmZlclwiPT09dGhpcy5yZXNwb25zZVR5cGUpYS5hcnJheUJ1ZmZlcigpLnRoZW4odGhpcy5UYS5iaW5kKHRoaXMpLHRoaXMuaGEuYmluZCh0aGlzKSk7ZWxzZSBpZihcInVuZGVmaW5lZFwiIT09dHlwZW9mIGwuUmVhZGFibGVTdHJlYW0mJlwiYm9keVwiaW4gYSl7dGhpcy5qPWEuYm9keS5nZXRSZWFkZXIoKTtpZih0aGlzLnUpe2lmKHRoaXMucmVzcG9uc2VUeXBlKXRocm93IEVycm9yKCdyZXNwb25zZVR5cGUgbXVzdCBiZSBlbXB0eSBmb3IgXCJzdHJlYW1CaW5hcnlDaHVua3NcIiBtb2RlIHJlc3BvbnNlcy4nKTt0aGlzLnJlc3BvbnNlPVxuW107fWVsc2UgdGhpcy5yZXNwb25zZT10aGlzLnJlc3BvbnNlVGV4dD1cIlwiLHRoaXMuQT1uZXcgVGV4dERlY29kZXI7dWQodGhpcyk7fWVsc2UgYS50ZXh0KCkudGhlbih0aGlzLlVhLmJpbmQodGhpcyksdGhpcy5oYS5iaW5kKHRoaXMpKTt9O2Z1bmN0aW9uIHVkKGEpe2Euai5yZWFkKCkudGhlbihhLlNhLmJpbmQoYSkpLmNhdGNoKGEuaGEuYmluZChhKSk7fWsuU2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5nKXtpZih0aGlzLnUmJmEudmFsdWUpdGhpcy5yZXNwb25zZS5wdXNoKGEudmFsdWUpO2Vsc2UgaWYoIXRoaXMudSl7dmFyIGI9YS52YWx1ZT9hLnZhbHVlOm5ldyBVaW50OEFycmF5KDApO2lmKGI9dGhpcy5BLmRlY29kZShiLHtzdHJlYW06IWEuZG9uZX0pKXRoaXMucmVzcG9uc2U9dGhpcy5yZXNwb25zZVRleHQrPWI7fWEuZG9uZT90ZCh0aGlzKTpzZCh0aGlzKTszPT10aGlzLnJlYWR5U3RhdGUmJnVkKHRoaXMpO319O1xuay5VYT1mdW5jdGlvbihhKXt0aGlzLmcmJih0aGlzLnJlc3BvbnNlPXRoaXMucmVzcG9uc2VUZXh0PWEsdGQodGhpcykpO307ay5UYT1mdW5jdGlvbihhKXt0aGlzLmcmJih0aGlzLnJlc3BvbnNlPWEsdGQodGhpcykpO307ay5oYT1mdW5jdGlvbigpe3RoaXMuZyYmdGQodGhpcyk7fTtmdW5jdGlvbiB0ZChhKXthLnJlYWR5U3RhdGU9NDthLmw9bnVsbDthLmo9bnVsbDthLkE9bnVsbDtzZChhKTt9ay5zZXRSZXF1ZXN0SGVhZGVyPWZ1bmN0aW9uKGEsYil7dGhpcy52LmFwcGVuZChhLGIpO307ay5nZXRSZXNwb25zZUhlYWRlcj1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5oP3RoaXMuaC5nZXQoYS50b0xvd2VyQ2FzZSgpKXx8XCJcIjpcIlwifTtcbmsuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzPWZ1bmN0aW9uKCl7aWYoIXRoaXMuaClyZXR1cm4gXCJcIjtjb25zdCBhPVtdLGI9dGhpcy5oLmVudHJpZXMoKTtmb3IodmFyIGM9Yi5uZXh0KCk7IWMuZG9uZTspYz1jLnZhbHVlLGEucHVzaChjWzBdK1wiOiBcIitjWzFdKSxjPWIubmV4dCgpO3JldHVybiBhLmpvaW4oXCJcXHJcXG5cIil9O2Z1bmN0aW9uIHNkKGEpe2Eub25yZWFkeXN0YXRlY2hhbmdlJiZhLm9ucmVhZHlzdGF0ZWNoYW5nZS5jYWxsKGEpO31PYmplY3QuZGVmaW5lUHJvcGVydHkocWQucHJvdG90eXBlLFwid2l0aENyZWRlbnRpYWxzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBcImluY2x1ZGVcIj09PXRoaXMubX0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubT1hP1wiaW5jbHVkZVwiOlwic2FtZS1vcmlnaW5cIjt9fSk7dmFyIHZkPWwuSlNPTi5wYXJzZTtmdW5jdGlvbiBYKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmhlYWRlcnM9bmV3IFM7dGhpcy51PWF8fG51bGw7dGhpcy5oPSExO3RoaXMuQz10aGlzLmc9bnVsbDt0aGlzLkg9XCJcIjt0aGlzLm09MDt0aGlzLmo9XCJcIjt0aGlzLmw9dGhpcy5GPXRoaXMudj10aGlzLkQ9ITE7dGhpcy5CPTA7dGhpcy5BPW51bGw7dGhpcy5KPXdkO3RoaXMuSz10aGlzLkw9ITE7fXQoWCxDKTt2YXIgd2Q9XCJcIix4ZD0vXmh0dHBzPyQvaSx5ZD1bXCJQT1NUXCIsXCJQVVRcIl07az1YLnByb3RvdHlwZTtcbmsuZWE9ZnVuY3Rpb24oYSxiLGMsZCl7aWYodGhpcy5nKXRocm93IEVycm9yKFwiW2dvb2cubmV0LlhocklvXSBPYmplY3QgaXMgYWN0aXZlIHdpdGggYW5vdGhlciByZXF1ZXN0PVwiK3RoaXMuSCtcIjsgbmV3VXJpPVwiK2EpO2I9Yj9iLnRvVXBwZXJDYXNlKCk6XCJHRVRcIjt0aGlzLkg9YTt0aGlzLmo9XCJcIjt0aGlzLm09MDt0aGlzLkQ9ITE7dGhpcy5oPSEwO3RoaXMuZz10aGlzLnU/dGhpcy51LmcoKTpjYy5nKCk7dGhpcy5DPXRoaXMudT9aYih0aGlzLnUpOlpiKGNjKTt0aGlzLmcub25yZWFkeXN0YXRlY2hhbmdlPXEodGhpcy5GYSx0aGlzKTt0cnl7dGhpcy5GPSEwLHRoaXMuZy5vcGVuKGIsU3RyaW5nKGEpLCEwKSx0aGlzLkY9ITE7fWNhdGNoKGYpe3pkKHRoaXMsZik7cmV0dXJufWE9Y3x8XCJcIjtjb25zdCBlPW5ldyBTKHRoaXMuaGVhZGVycyk7ZCYmS2MoZCxmdW5jdGlvbihmLGgpe2Uuc2V0KGgsZik7fSk7ZD1vYShlLlQoKSk7Yz1sLkZvcm1EYXRhJiZhIGluc3RhbmNlb2YgbC5Gb3JtRGF0YTtcbiEoMDw9bWEoeWQsYikpfHxkfHxjfHxlLnNldChcIkNvbnRlbnQtVHlwZVwiLFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLThcIik7ZS5mb3JFYWNoKGZ1bmN0aW9uKGYsaCl7dGhpcy5nLnNldFJlcXVlc3RIZWFkZXIoaCxmKTt9LHRoaXMpO3RoaXMuSiYmKHRoaXMuZy5yZXNwb25zZVR5cGU9dGhpcy5KKTtcIndpdGhDcmVkZW50aWFsc1wiaW4gdGhpcy5nJiZ0aGlzLmcud2l0aENyZWRlbnRpYWxzIT09dGhpcy5MJiYodGhpcy5nLndpdGhDcmVkZW50aWFscz10aGlzLkwpO3RyeXtBZCh0aGlzKSwwPHRoaXMuQiYmKCh0aGlzLks9QmQodGhpcy5nKSk/KHRoaXMuZy50aW1lb3V0PXRoaXMuQix0aGlzLmcub250aW1lb3V0PXEodGhpcy5wYSx0aGlzKSk6dGhpcy5BPUdiKHRoaXMucGEsdGhpcy5CLHRoaXMpKSx0aGlzLnY9ITAsdGhpcy5nLnNlbmQoYSksdGhpcy52PSExO31jYXRjaChmKXt6ZCh0aGlzLGYpO319O1xuZnVuY3Rpb24gQmQoYSl7cmV0dXJuIHkmJlJhKCkmJlwibnVtYmVyXCI9PT10eXBlb2YgYS50aW1lb3V0JiZ2b2lkIDAhPT1hLm9udGltZW91dH1mdW5jdGlvbiBwYShhKXtyZXR1cm4gXCJjb250ZW50LXR5cGVcIj09YS50b0xvd2VyQ2FzZSgpfWsucGE9ZnVuY3Rpb24oKXtcInVuZGVmaW5lZFwiIT10eXBlb2YgZ29vZyYmdGhpcy5nJiYodGhpcy5qPVwiVGltZWQgb3V0IGFmdGVyIFwiK3RoaXMuQitcIm1zLCBhYm9ydGluZ1wiLHRoaXMubT04LEQodGhpcyxcInRpbWVvdXRcIiksdGhpcy5hYm9ydCg4KSk7fTtmdW5jdGlvbiB6ZChhLGIpe2EuaD0hMTthLmcmJihhLmw9ITAsYS5nLmFib3J0KCksYS5sPSExKTthLmo9YjthLm09NTtDZChhKTtEZChhKTt9ZnVuY3Rpb24gQ2QoYSl7YS5EfHwoYS5EPSEwLEQoYSxcImNvbXBsZXRlXCIpLEQoYSxcImVycm9yXCIpKTt9XG5rLmFib3J0PWZ1bmN0aW9uKGEpe3RoaXMuZyYmdGhpcy5oJiYodGhpcy5oPSExLHRoaXMubD0hMCx0aGlzLmcuYWJvcnQoKSx0aGlzLmw9ITEsdGhpcy5tPWF8fDcsRCh0aGlzLFwiY29tcGxldGVcIiksRCh0aGlzLFwiYWJvcnRcIiksRGQodGhpcykpO307ay5NPWZ1bmN0aW9uKCl7dGhpcy5nJiYodGhpcy5oJiYodGhpcy5oPSExLHRoaXMubD0hMCx0aGlzLmcuYWJvcnQoKSx0aGlzLmw9ITEpLERkKHRoaXMsITApKTtYLlouTS5jYWxsKHRoaXMpO307ay5GYT1mdW5jdGlvbigpe3RoaXMuc3x8KHRoaXMuRnx8dGhpcy52fHx0aGlzLmw/RWQodGhpcyk6dGhpcy5jYigpKTt9O2suY2I9ZnVuY3Rpb24oKXtFZCh0aGlzKTt9O1xuZnVuY3Rpb24gRWQoYSl7aWYoYS5oJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgZ29vZyYmKCFhLkNbMV18fDQhPU8oYSl8fDIhPWEuYmEoKSkpaWYoYS52JiY0PT1PKGEpKUdiKGEuRmEsMCxhKTtlbHNlIGlmKEQoYSxcInJlYWR5c3RhdGVjaGFuZ2VcIiksND09TyhhKSl7YS5oPSExO3RyeXtjb25zdCBuPWEuYmEoKTthOnN3aXRjaChuKXtjYXNlIDIwMDpjYXNlIDIwMTpjYXNlIDIwMjpjYXNlIDIwNDpjYXNlIDIwNjpjYXNlIDMwNDpjYXNlIDEyMjM6dmFyIGI9ITA7YnJlYWsgYTtkZWZhdWx0OmI9ITE7fXZhciBjO2lmKCEoYz1iKSl7dmFyIGQ7aWYoZD0wPT09bil7dmFyIGU9U3RyaW5nKGEuSCkubWF0Y2goTWMpWzFdfHxudWxsO2lmKCFlJiZsLnNlbGYmJmwuc2VsZi5sb2NhdGlvbil7dmFyIGY9bC5zZWxmLmxvY2F0aW9uLnByb3RvY29sO2U9Zi5zdWJzdHIoMCxmLmxlbmd0aC0xKTt9ZD0heGQudGVzdChlP2UudG9Mb3dlckNhc2UoKTpcIlwiKTt9Yz1kO31pZihjKUQoYSxcImNvbXBsZXRlXCIpLEQoYSxcblwic3VjY2Vzc1wiKTtlbHNlIHthLm09Njt0cnl7dmFyIGg9MjxPKGEpP2EuZy5zdGF0dXNUZXh0OlwiXCI7fWNhdGNoKHUpe2g9XCJcIjt9YS5qPWgrXCIgW1wiK2EuYmEoKStcIl1cIjtDZChhKTt9fWZpbmFsbHl7RGQoYSk7fX19ZnVuY3Rpb24gRGQoYSxiKXtpZihhLmcpe0FkKGEpO2NvbnN0IGM9YS5nLGQ9YS5DWzBdP2FhOm51bGw7YS5nPW51bGw7YS5DPW51bGw7Ynx8RChhLFwicmVhZHlcIik7dHJ5e2Mub25yZWFkeXN0YXRlY2hhbmdlPWQ7fWNhdGNoKGUpe319fWZ1bmN0aW9uIEFkKGEpe2EuZyYmYS5LJiYoYS5nLm9udGltZW91dD1udWxsKTthLkEmJihsLmNsZWFyVGltZW91dChhLkEpLGEuQT1udWxsKTt9ZnVuY3Rpb24gTyhhKXtyZXR1cm4gYS5nP2EuZy5yZWFkeVN0YXRlOjB9ay5iYT1mdW5jdGlvbigpe3RyeXtyZXR1cm4gMjxPKHRoaXMpP3RoaXMuZy5zdGF0dXM6LTF9Y2F0Y2goYSl7cmV0dXJuIC0xfX07XG5rLmdhPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiB0aGlzLmc/dGhpcy5nLnJlc3BvbnNlVGV4dDpcIlwifWNhdGNoKGEpe3JldHVybiBcIlwifX07ay5RYT1mdW5jdGlvbihhKXtpZih0aGlzLmcpe3ZhciBiPXRoaXMuZy5yZXNwb25zZVRleHQ7YSYmMD09Yi5pbmRleE9mKGEpJiYoYj1iLnN1YnN0cmluZyhhLmxlbmd0aCkpO3JldHVybiB2ZChiKX19O2Z1bmN0aW9uIG9jKGEpe3RyeXtpZighYS5nKXJldHVybiBudWxsO2lmKFwicmVzcG9uc2VcImluIGEuZylyZXR1cm4gYS5nLnJlc3BvbnNlO3N3aXRjaChhLkope2Nhc2Ugd2Q6Y2FzZSBcInRleHRcIjpyZXR1cm4gYS5nLnJlc3BvbnNlVGV4dDtjYXNlIFwiYXJyYXlidWZmZXJcIjppZihcIm1velJlc3BvbnNlQXJyYXlCdWZmZXJcImluIGEuZylyZXR1cm4gYS5nLm1velJlc3BvbnNlQXJyYXlCdWZmZXJ9cmV0dXJuIG51bGx9Y2F0Y2goYil7cmV0dXJuIG51bGx9fWsuRGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tfTtcbmsuTGE9ZnVuY3Rpb24oKXtyZXR1cm4gXCJzdHJpbmdcIj09PXR5cGVvZiB0aGlzLmo/dGhpcy5qOlN0cmluZyh0aGlzLmopfTtmdW5jdGlvbiBGZChhKXtsZXQgYj1cIlwiO3hhKGEsZnVuY3Rpb24oYyxkKXtiKz1kO2IrPVwiOlwiO2IrPWM7Yis9XCJcXHJcXG5cIjt9KTtyZXR1cm4gYn1mdW5jdGlvbiBHZChhLGIsYyl7YTp7Zm9yKGQgaW4gYyl7dmFyIGQ9ITE7YnJlYWsgYX1kPSEwO31kfHwoYz1GZChjKSxcInN0cmluZ1wiPT09dHlwZW9mIGE/KG51bGwhPWMmJmVuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoYykpKTpSKGEsYixjKSk7fWZ1bmN0aW9uIEhkKGEsYixjKXtyZXR1cm4gYyYmYy5pbnRlcm5hbENoYW5uZWxQYXJhbXM/Yy5pbnRlcm5hbENoYW5uZWxQYXJhbXNbYV18fGI6Yn1cbmZ1bmN0aW9uIElkKGEpe3RoaXMuemE9MDt0aGlzLmw9W107dGhpcy5oPW5ldyBNYjt0aGlzLmxhPXRoaXMub2E9dGhpcy5GPXRoaXMuVz10aGlzLmc9dGhpcy5zYT10aGlzLkQ9dGhpcy5hYT10aGlzLm89dGhpcy5QPXRoaXMucz1udWxsO3RoaXMuWmE9dGhpcy5WPTA7dGhpcy5YYT1IZChcImZhaWxGYXN0XCIsITEsYSk7dGhpcy5OPXRoaXMudj10aGlzLnU9dGhpcy5tPXRoaXMuaj1udWxsO3RoaXMuWD0hMDt0aGlzLkk9dGhpcy50YT10aGlzLlU9LTE7dGhpcy5ZPXRoaXMuQT10aGlzLkM9MDt0aGlzLlBhPUhkKFwiYmFzZVJldHJ5RGVsYXlNc1wiLDVFMyxhKTt0aGlzLiRhPUhkKFwicmV0cnlEZWxheVNlZWRNc1wiLDFFNCxhKTt0aGlzLllhPUhkKFwiZm9yd2FyZENoYW5uZWxNYXhSZXRyaWVzXCIsMixhKTt0aGlzLnJhPUhkKFwiZm9yd2FyZENoYW5uZWxSZXF1ZXN0VGltZW91dE1zXCIsMkU0LGEpO3RoaXMucWE9YSYmYS54bWxIdHRwRmFjdG9yeXx8dm9pZCAwO3RoaXMuQmE9YSYmYS5ZYnx8ITE7XG50aGlzLks9dm9pZCAwO3RoaXMuSD1hJiZhLnN1cHBvcnRzQ3Jvc3NEb21haW5YaHJ8fCExO3RoaXMuSj1cIlwiO3RoaXMuaT1uZXcgZ2QoYSYmYS5jb25jdXJyZW50UmVxdWVzdExpbWl0KTt0aGlzLkNhPW5ldyBsZDt0aGlzLmphPWEmJmEuZmFzdEhhbmRzaGFrZXx8ITE7dGhpcy5SYT1hJiZhLldifHwhMTthJiZhLkFhJiZ0aGlzLmguQWEoKTthJiZhLmZvcmNlTG9uZ1BvbGxpbmcmJih0aGlzLlg9ITEpO3RoaXMuJD0hdGhpcy5qYSYmdGhpcy5YJiZhJiZhLmRldGVjdEJ1ZmZlcmluZ1Byb3h5fHwhMTt0aGlzLmthPXZvaWQgMDt0aGlzLk89MDt0aGlzLkw9ITE7dGhpcy5CPW51bGw7dGhpcy5XYT0hYXx8ITEhPT1hLlhiO31rPUlkLnByb3RvdHlwZTtrLm1hPTg7ay5HPTE7XG5mdW5jdGlvbiBJYyhhKXtKZChhKTtpZigzPT1hLkcpe3ZhciBiPWEuVisrLGM9TihhLkYpO1IoYyxcIlNJRFwiLGEuSik7UihjLFwiUklEXCIsYik7UihjLFwiVFlQRVwiLFwidGVybWluYXRlXCIpO0tkKGEsYyk7Yj1uZXcgTShhLGEuaCxiLHZvaWQgMCk7Yi5LPTI7Yi52PWpjKE4oYykpO2M9ITE7bC5uYXZpZ2F0b3ImJmwubmF2aWdhdG9yLnNlbmRCZWFjb24mJihjPWwubmF2aWdhdG9yLnNlbmRCZWFjb24oYi52LnRvU3RyaW5nKCksXCJcIikpOyFjJiZsLkltYWdlJiYoKG5ldyBJbWFnZSkuc3JjPWIudixjPSEwKTtjfHwoYi5nPW5jKGIubCxudWxsKSxiLmcuZWEoYi52KSk7Yi5GPURhdGUubm93KCk7bGMoYik7fUxkKGEpO31rLmhiPWZ1bmN0aW9uKGEpe3RyeXt0aGlzLmguaW5mbyhcIk9yaWdpbiBUcmlhbHMgaW52b2tlZDogXCIrYSk7fWNhdGNoKGIpe319O2Z1bmN0aW9uIEFjKGEpe2EuZyYmKHdjKGEpLGEuZy5jYW5jZWwoKSxhLmc9bnVsbCk7fVxuZnVuY3Rpb24gSmQoYSl7QWMoYSk7YS51JiYobC5jbGVhclRpbWVvdXQoYS51KSxhLnU9bnVsbCk7emMoYSk7YS5pLmNhbmNlbCgpO2EubSYmKFwibnVtYmVyXCI9PT10eXBlb2YgYS5tJiZsLmNsZWFyVGltZW91dChhLm0pLGEubT1udWxsKTt9ZnVuY3Rpb24gTWQoYSxiKXthLmwucHVzaChuZXcgZmQoYS5aYSsrLGIpKTszPT1hLkcmJkhjKGEpO31mdW5jdGlvbiBIYyhhKXtpZChhLmkpfHxhLm18fChhLm09ITAsemIoYS5IYSxhKSxhLkM9MCk7fWZ1bmN0aW9uIE5kKGEsYil7aWYoQ2MoYS5pKT49YS5pLmotKGEubT8xOjApKXJldHVybiAhMTtpZihhLm0pcmV0dXJuIGEubD1iLkQuY29uY2F0KGEubCksITA7aWYoMT09YS5HfHwyPT1hLkd8fGEuQz49KGEuWGE/MDphLllhKSlyZXR1cm4gITE7YS5tPUsocShhLkhhLGEsYiksT2QoYSxhLkMpKTthLkMrKztyZXR1cm4gITB9XG5rLkhhPWZ1bmN0aW9uKGEpe2lmKHRoaXMubSlpZih0aGlzLm09bnVsbCwxPT10aGlzLkcpe2lmKCFhKXt0aGlzLlY9TWF0aC5mbG9vcigxRTUqTWF0aC5yYW5kb20oKSk7YT10aGlzLlYrKztjb25zdCBlPW5ldyBNKHRoaXMsdGhpcy5oLGEsdm9pZCAwKTtsZXQgZj10aGlzLnM7dGhpcy5QJiYoZj8oZj15YShmKSxBYShmLHRoaXMuUCkpOmY9dGhpcy5QKTtudWxsPT09dGhpcy5vJiYoZS5IPWYpO2lmKHRoaXMuamEpYTp7dmFyIGI9MDtmb3IodmFyIGM9MDtjPHRoaXMubC5sZW5ndGg7YysrKXtiOnt2YXIgZD10aGlzLmxbY107aWYoXCJfX2RhdGFfX1wiaW4gZC5nJiYoZD1kLmcuX19kYXRhX18sXCJzdHJpbmdcIj09PXR5cGVvZiBkKSl7ZD1kLmxlbmd0aDticmVhayBifWQ9dm9pZCAwO31pZih2b2lkIDA9PT1kKWJyZWFrO2IrPWQ7aWYoNDA5NjxiKXtiPWM7YnJlYWsgYX1pZig0MDk2PT09Ynx8Yz09PXRoaXMubC5sZW5ndGgtMSl7Yj1jKzE7YnJlYWsgYX19Yj0xRTM7fWVsc2UgYj0xRTM7Yj1cblBkKHRoaXMsZSxiKTtjPU4odGhpcy5GKTtSKGMsXCJSSURcIixhKTtSKGMsXCJDVkVSXCIsMjIpO3RoaXMuRCYmUihjLFwiWC1IVFRQLVNlc3Npb24tSWRcIix0aGlzLkQpO0tkKHRoaXMsYyk7dGhpcy5vJiZmJiZHZChjLHRoaXMubyxmKTtEYyh0aGlzLmksZSk7dGhpcy5SYSYmUihjLFwiVFlQRVwiLFwiaW5pdFwiKTt0aGlzLmphPyhSKGMsXCIkcmVxXCIsYiksUihjLFwiU0lEXCIsXCJudWxsXCIpLGUuJD0hMCxpYyhlLGMsbnVsbCkpOmljKGUsYyxiKTt0aGlzLkc9Mjt9fWVsc2UgMz09dGhpcy5HJiYoYT9RZCh0aGlzLGEpOjA9PXRoaXMubC5sZW5ndGh8fGlkKHRoaXMuaSl8fFFkKHRoaXMpKTt9O1xuZnVuY3Rpb24gUWQoYSxiKXt2YXIgYztiP2M9Yi5tOmM9YS5WKys7Y29uc3QgZD1OKGEuRik7UihkLFwiU0lEXCIsYS5KKTtSKGQsXCJSSURcIixjKTtSKGQsXCJBSURcIixhLlUpO0tkKGEsZCk7YS5vJiZhLnMmJkdkKGQsYS5vLGEucyk7Yz1uZXcgTShhLGEuaCxjLGEuQysxKTtudWxsPT09YS5vJiYoYy5IPWEucyk7YiYmKGEubD1iLkQuY29uY2F0KGEubCkpO2I9UGQoYSxjLDFFMyk7Yy5zZXRUaW1lb3V0KE1hdGgucm91bmQoLjUqYS5yYSkrTWF0aC5yb3VuZCguNSphLnJhKk1hdGgucmFuZG9tKCkpKTtEYyhhLmksYyk7aWMoYyxkLGIpO31mdW5jdGlvbiBLZChhLGIpe2EuaiYmS2Moe30sZnVuY3Rpb24oYyxkKXtSKGIsZCxjKTt9KTt9XG5mdW5jdGlvbiBQZChhLGIsYyl7Yz1NYXRoLm1pbihhLmwubGVuZ3RoLGMpO3ZhciBkPWEuaj9xKGEuai5PYSxhLmosYSk6bnVsbDthOnt2YXIgZT1hLmw7bGV0IGY9LTE7Zm9yKDs7KXtjb25zdCBoPVtcImNvdW50PVwiK2NdOy0xPT1mPzA8Yz8oZj1lWzBdLmgsaC5wdXNoKFwib2ZzPVwiK2YpKTpmPTA6aC5wdXNoKFwib2ZzPVwiK2YpO2xldCBuPSEwO2ZvcihsZXQgdT0wO3U8Yzt1Kyspe2xldCBtPWVbdV0uaDtjb25zdCByPWVbdV0uZzttLT1mO2lmKDA+bSlmPU1hdGgubWF4KDAsZVt1XS5oLTEwMCksbj0hMTtlbHNlIHRyeXttZChyLGgsXCJyZXFcIittK1wiX1wiKTt9Y2F0Y2goRyl7ZCYmZChyKTt9fWlmKG4pe2Q9aC5qb2luKFwiJlwiKTticmVhayBhfX19YT1hLmwuc3BsaWNlKDAsYyk7Yi5EPWE7cmV0dXJuIGR9ZnVuY3Rpb24gR2MoYSl7YS5nfHxhLnV8fChhLlk9MSx6YihhLkdhLGEpLGEuQT0wKTt9XG5mdW5jdGlvbiBCYyhhKXtpZihhLmd8fGEudXx8Mzw9YS5BKXJldHVybiAhMTthLlkrKzthLnU9SyhxKGEuR2EsYSksT2QoYSxhLkEpKTthLkErKztyZXR1cm4gITB9ay5HYT1mdW5jdGlvbigpe3RoaXMudT1udWxsO1JkKHRoaXMpO2lmKHRoaXMuJCYmISh0aGlzLkx8fG51bGw9PXRoaXMuZ3x8MD49dGhpcy5PKSl7dmFyIGE9Mip0aGlzLk87dGhpcy5oLmluZm8oXCJCUCBkZXRlY3Rpb24gdGltZXIgZW5hYmxlZDogXCIrYSk7dGhpcy5CPUsocSh0aGlzLmJiLHRoaXMpLGEpO319O2suYmI9ZnVuY3Rpb24oKXt0aGlzLkImJih0aGlzLkI9bnVsbCx0aGlzLmguaW5mbyhcIkJQIGRldGVjdGlvbiB0aW1lb3V0IHJlYWNoZWQuXCIpLHRoaXMuaC5pbmZvKFwiQnVmZmVyaW5nIHByb3h5IGRldGVjdGVkIGFuZCBzd2l0Y2ggdG8gbG9uZy1wb2xsaW5nIVwiKSx0aGlzLk49ITEsdGhpcy5MPSEwLEooMTApLEFjKHRoaXMpLFJkKHRoaXMpKTt9O1xuZnVuY3Rpb24gd2MoYSl7bnVsbCE9YS5CJiYobC5jbGVhclRpbWVvdXQoYS5CKSxhLkI9bnVsbCk7fWZ1bmN0aW9uIFJkKGEpe2EuZz1uZXcgTShhLGEuaCxcInJwY1wiLGEuWSk7bnVsbD09PWEubyYmKGEuZy5IPWEucyk7YS5nLk89MDt2YXIgYj1OKGEub2EpO1IoYixcIlJJRFwiLFwicnBjXCIpO1IoYixcIlNJRFwiLGEuSik7UihiLFwiQ0lcIixhLk4/XCIwXCI6XCIxXCIpO1IoYixcIkFJRFwiLGEuVSk7S2QoYSxiKTtSKGIsXCJUWVBFXCIsXCJ4bWxodHRwXCIpO2EubyYmYS5zJiZHZChiLGEubyxhLnMpO2EuSyYmYS5nLnNldFRpbWVvdXQoYS5LKTt2YXIgYz1hLmc7YT1hLmxhO2MuSz0xO2Mudj1qYyhOKGIpKTtjLnM9bnVsbDtjLlU9ITA7a2MoYyxhKTt9ay5hYj1mdW5jdGlvbigpe251bGwhPXRoaXMudiYmKHRoaXMudj1udWxsLEFjKHRoaXMpLEJjKHRoaXMpLEooMTkpKTt9O2Z1bmN0aW9uIHpjKGEpe251bGwhPWEudiYmKGwuY2xlYXJUaW1lb3V0KGEudiksYS52PW51bGwpO31cbmZ1bmN0aW9uIHVjKGEsYil7dmFyIGM9bnVsbDtpZihhLmc9PWIpe3pjKGEpO3djKGEpO2EuZz1udWxsO3ZhciBkPTI7fWVsc2UgaWYoeWMoYS5pLGIpKWM9Yi5ELEZjKGEuaSxiKSxkPTE7ZWxzZSByZXR1cm47YS5JPWIuTjtpZigwIT1hLkcpaWYoYi5pKWlmKDE9PWQpe2M9Yi5zP2Iucy5sZW5ndGg6MDtiPURhdGUubm93KCktYi5GO3ZhciBlPWEuQztkPVNiKCk7RChkLG5ldyBWYihkLGMsYixlKSk7SGMoYSk7fWVsc2UgR2MoYSk7ZWxzZSBpZihlPWIubywzPT1lfHwwPT1lJiYwPGEuSXx8ISgxPT1kJiZOZChhLGIpfHwyPT1kJiZCYyhhKSkpc3dpdGNoKGMmJjA8Yy5sZW5ndGgmJihiPWEuaSxiLmk9Yi5pLmNvbmNhdChjKSksZSl7Y2FzZSAxOlEoYSw1KTticmVhaztjYXNlIDQ6UShhLDEwKTticmVhaztjYXNlIDM6UShhLDYpO2JyZWFrO2RlZmF1bHQ6UShhLDIpO319XG5mdW5jdGlvbiBPZChhLGIpe2xldCBjPWEuUGErTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmEuJGEpO2Euanx8KGMqPTIpO3JldHVybiBjKmJ9ZnVuY3Rpb24gUShhLGIpe2EuaC5pbmZvKFwiRXJyb3IgY29kZSBcIitiKTtpZigyPT1iKXt2YXIgYz1udWxsO2EuaiYmKGM9bnVsbCk7dmFyIGQ9cShhLmpiLGEpO2N8fChjPW5ldyBVKFwiLy93d3cuZ29vZ2xlLmNvbS9pbWFnZXMvY2xlYXJkb3QuZ2lmXCIpLGwubG9jYXRpb24mJlwiaHR0cFwiPT1sLmxvY2F0aW9uLnByb3RvY29sfHxPYyhjLFwiaHR0cHNcIiksamMoYykpO25kKGMudG9TdHJpbmcoKSxkKTt9ZWxzZSBKKDIpO2EuRz0wO2EuaiYmYS5qLnZhKGIpO0xkKGEpO0pkKGEpO31rLmpiPWZ1bmN0aW9uKGEpe2E/KHRoaXMuaC5pbmZvKFwiU3VjY2Vzc2Z1bGx5IHBpbmdlZCBnb29nbGUuY29tXCIpLEooMikpOih0aGlzLmguaW5mbyhcIkZhaWxlZCB0byBwaW5nIGdvb2dsZS5jb21cIiksSigxKSk7fTtcbmZ1bmN0aW9uIExkKGEpe2EuRz0wO2EuST0tMTtpZihhLmope2lmKDAhPWpkKGEuaSkubGVuZ3RofHwwIT1hLmwubGVuZ3RoKWEuaS5pLmxlbmd0aD0wLHJhKGEubCksYS5sLmxlbmd0aD0wO2Euai51YSgpO319ZnVuY3Rpb24gRWMoYSxiLGMpe2xldCBkPWFkKGMpO2lmKFwiXCIhPWQuaSliJiZQYyhkLGIrXCIuXCIrZC5pKSxRYyhkLGQubSk7ZWxzZSB7Y29uc3QgZT1sLmxvY2F0aW9uO2Q9YmQoZS5wcm90b2NvbCxiP2IrXCIuXCIrZS5ob3N0bmFtZTplLmhvc3RuYW1lLCtlLnBvcnQsYyk7fWEuYWEmJnhhKGEuYWEsZnVuY3Rpb24oZSxmKXtSKGQsZixlKTt9KTtiPWEuRDtjPWEuc2E7YiYmYyYmUihkLGIsYyk7UihkLFwiVkVSXCIsYS5tYSk7S2QoYSxkKTtyZXR1cm4gZH1cbmZ1bmN0aW9uIG5jKGEsYixjKXtpZihiJiYhYS5IKXRocm93IEVycm9yKFwiQ2FuJ3QgY3JlYXRlIHNlY29uZGFyeSBkb21haW4gY2FwYWJsZSBYaHJJbyBvYmplY3QuXCIpO2I9YyYmYS5CYSYmIWEucWE/bmV3IFgobmV3IHBkKHtpYjohMH0pKTpuZXcgWChhLnFhKTtiLkw9YS5IO3JldHVybiBifWZ1bmN0aW9uIFNkKCl7fWs9U2QucHJvdG90eXBlO2sueGE9ZnVuY3Rpb24oKXt9O2sud2E9ZnVuY3Rpb24oKXt9O2sudmE9ZnVuY3Rpb24oKXt9O2sudWE9ZnVuY3Rpb24oKXt9O2suT2E9ZnVuY3Rpb24oKXt9O2Z1bmN0aW9uIFRkKCl7aWYoeSYmISgxMDw9TnVtYmVyKFVhKSkpdGhyb3cgRXJyb3IoXCJFbnZpcm9ubWVudGFsIGVycm9yOiBubyBhdmFpbGFibGUgdHJhbnNwb3J0LlwiKTt9VGQucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IFkoYSxiKX07XG5mdW5jdGlvbiBZKGEsYil7Qy5jYWxsKHRoaXMpO3RoaXMuZz1uZXcgSWQoYik7dGhpcy5sPWE7dGhpcy5oPWImJmIubWVzc2FnZVVybFBhcmFtc3x8bnVsbDthPWImJmIubWVzc2FnZUhlYWRlcnN8fG51bGw7YiYmYi5jbGllbnRQcm90b2NvbEhlYWRlclJlcXVpcmVkJiYoYT9hW1wiWC1DbGllbnQtUHJvdG9jb2xcIl09XCJ3ZWJjaGFubmVsXCI6YT17XCJYLUNsaWVudC1Qcm90b2NvbFwiOlwid2ViY2hhbm5lbFwifSk7dGhpcy5nLnM9YTthPWImJmIuaW5pdE1lc3NhZ2VIZWFkZXJzfHxudWxsO2ImJmIubWVzc2FnZUNvbnRlbnRUeXBlJiYoYT9hW1wiWC1XZWJDaGFubmVsLUNvbnRlbnQtVHlwZVwiXT1iLm1lc3NhZ2VDb250ZW50VHlwZTphPXtcIlgtV2ViQ2hhbm5lbC1Db250ZW50LVR5cGVcIjpiLm1lc3NhZ2VDb250ZW50VHlwZX0pO2ImJmIueWEmJihhP2FbXCJYLVdlYkNoYW5uZWwtQ2xpZW50LVByb2ZpbGVcIl09Yi55YTphPXtcIlgtV2ViQ2hhbm5lbC1DbGllbnQtUHJvZmlsZVwiOmIueWF9KTt0aGlzLmcuUD1cbmE7KGE9YiYmYi5odHRwSGVhZGVyc092ZXJ3cml0ZVBhcmFtKSYmIXNhKGEpJiYodGhpcy5nLm89YSk7dGhpcy5BPWImJmIuc3VwcG9ydHNDcm9zc0RvbWFpblhocnx8ITE7dGhpcy52PWImJmIuc2VuZFJhd0pzb258fCExOyhiPWImJmIuaHR0cFNlc3Npb25JZFBhcmFtKSYmIXNhKGIpJiYodGhpcy5nLkQ9YixhPXRoaXMuaCxudWxsIT09YSYmYiBpbiBhJiYoYT10aGlzLmgsYiBpbiBhJiZkZWxldGUgYVtiXSkpO3RoaXMuaj1uZXcgWih0aGlzKTt9dChZLEMpO1kucHJvdG90eXBlLm09ZnVuY3Rpb24oKXt0aGlzLmcuaj10aGlzLmo7dGhpcy5BJiYodGhpcy5nLkg9ITApO3ZhciBhPXRoaXMuZyxiPXRoaXMubCxjPXRoaXMuaHx8dm9pZCAwO2EuV2EmJihhLmguaW5mbyhcIk9yaWdpbiBUcmlhbHMgZW5hYmxlZC5cIiksemIocShhLmhiLGEsYikpKTtKKDApO2EuVz1iO2EuYWE9Y3x8e307YS5OPWEuWDthLkY9RWMoYSxudWxsLGEuVyk7SGMoYSk7fTtZLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe0ljKHRoaXMuZyk7fTtcblkucHJvdG90eXBlLnU9ZnVuY3Rpb24oYSl7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKXt2YXIgYj17fTtiLl9fZGF0YV9fPWE7TWQodGhpcy5nLGIpO31lbHNlIHRoaXMudj8oYj17fSxiLl9fZGF0YV9fPXJiKGEpLE1kKHRoaXMuZyxiKSk6TWQodGhpcy5nLGEpO307WS5wcm90b3R5cGUuTT1mdW5jdGlvbigpe3RoaXMuZy5qPW51bGw7ZGVsZXRlIHRoaXMuajtJYyh0aGlzLmcpO2RlbGV0ZSB0aGlzLmc7WS5aLk0uY2FsbCh0aGlzKTt9O2Z1bmN0aW9uIFVkKGEpe2FjLmNhbGwodGhpcyk7dmFyIGI9YS5fX3NtX187aWYoYil7YTp7Zm9yKGNvbnN0IGMgaW4gYil7YT1jO2JyZWFrIGF9YT12b2lkIDA7fWlmKHRoaXMuaT1hKWE9dGhpcy5pLGI9bnVsbCE9PWImJmEgaW4gYj9iW2FdOnZvaWQgMDt0aGlzLmRhdGE9Yjt9ZWxzZSB0aGlzLmRhdGE9YTt9dChVZCxhYyk7ZnVuY3Rpb24gVmQoKXtiYy5jYWxsKHRoaXMpO3RoaXMuc3RhdHVzPTE7fXQoVmQsYmMpO2Z1bmN0aW9uIFooYSl7dGhpcy5nPWE7fVxudChaLFNkKTtaLnByb3RvdHlwZS54YT1mdW5jdGlvbigpe0QodGhpcy5nLFwiYVwiKTt9O1oucHJvdG90eXBlLndhPWZ1bmN0aW9uKGEpe0QodGhpcy5nLG5ldyBVZChhKSk7fTtaLnByb3RvdHlwZS52YT1mdW5jdGlvbihhKXtEKHRoaXMuZyxuZXcgVmQoYSkpO307Wi5wcm90b3R5cGUudWE9ZnVuY3Rpb24oKXtEKHRoaXMuZyxcImJcIik7fTsvKlxuXG4gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuXG4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuVGQucHJvdG90eXBlLmNyZWF0ZVdlYkNoYW5uZWw9VGQucHJvdG90eXBlLmc7WS5wcm90b3R5cGUuc2VuZD1ZLnByb3RvdHlwZS51O1kucHJvdG90eXBlLm9wZW49WS5wcm90b3R5cGUubTtZLnByb3RvdHlwZS5jbG9zZT1ZLnByb3RvdHlwZS5jbG9zZTtXYi5OT19FUlJPUj0wO1diLlRJTUVPVVQ9ODtXYi5IVFRQX0VSUk9SPTY7WGIuQ09NUExFVEU9XCJjb21wbGV0ZVwiOyRiLkV2ZW50VHlwZT1MO0wuT1BFTj1cImFcIjtMLkNMT1NFPVwiYlwiO0wuRVJST1I9XCJjXCI7TC5NRVNTQUdFPVwiZFwiO0MucHJvdG90eXBlLmxpc3Rlbj1DLnByb3RvdHlwZS5OO1gucHJvdG90eXBlLmxpc3Rlbk9uY2U9WC5wcm90b3R5cGUuTztYLnByb3RvdHlwZS5nZXRMYXN0RXJyb3I9WC5wcm90b3R5cGUuTGE7WC5wcm90b3R5cGUuZ2V0TGFzdEVycm9yQ29kZT1YLnByb3RvdHlwZS5EYTtYLnByb3RvdHlwZS5nZXRTdGF0dXM9WC5wcm90b3R5cGUuYmE7WC5wcm90b3R5cGUuZ2V0UmVzcG9uc2VKc29uPVgucHJvdG90eXBlLlFhO1xuWC5wcm90b3R5cGUuZ2V0UmVzcG9uc2VUZXh0PVgucHJvdG90eXBlLmdhO1gucHJvdG90eXBlLnNlbmQ9WC5wcm90b3R5cGUuZWE7dmFyIGNyZWF0ZVdlYkNoYW5uZWxUcmFuc3BvcnQgPSBlc20uY3JlYXRlV2ViQ2hhbm5lbFRyYW5zcG9ydD1mdW5jdGlvbigpe3JldHVybiBuZXcgVGR9O3ZhciBnZXRTdGF0RXZlbnRUYXJnZXQgPSBlc20uZ2V0U3RhdEV2ZW50VGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIFNiKCl9O3ZhciBFcnJvckNvZGUgPSBlc20uRXJyb3JDb2RlPVdiO3ZhciBFdmVudFR5cGUgPSBlc20uRXZlbnRUeXBlPVhiO3ZhciBFdmVudCA9IGVzbS5FdmVudD1IO3ZhciBTdGF0ID0gZXNtLlN0YXQ9e3JiOjAsdWI6MSx2YjoyLE9iOjMsVGI6NCxRYjo1LFJiOjYsUGI6NyxOYjo4LFNiOjksUFJPWFk6MTAsTk9QUk9YWToxMSxMYjoxMixIYjoxMyxJYjoxNCxHYjoxNSxKYjoxNixLYjoxNyxuYjoxOCxtYjoxOSxvYjoyMH07dmFyIEZldGNoWG1sSHR0cEZhY3RvcnkgPSBlc20uRmV0Y2hYbWxIdHRwRmFjdG9yeT1wZDt2YXIgV2ViQ2hhbm5lbCA9IGVzbS5XZWJDaGFubmVsPSRiO1xudmFyIFhocklvID0gZXNtLlhocklvPVg7XG5cbmV4cG9ydCB7IEVycm9yQ29kZSwgRXZlbnQsIEV2ZW50VHlwZSwgRmV0Y2hYbWxIdHRwRmFjdG9yeSwgU3RhdCwgV2ViQ2hhbm5lbCwgWGhySW8sIGNyZWF0ZVdlYkNoYW5uZWxUcmFuc3BvcnQsIGVzbSBhcyBkZWZhdWx0LCBnZXRTdGF0RXZlbnRUYXJnZXQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmVzbTIwMTcuanMubWFwXG4iLCJpbXBvcnQgeyByZWdpc3RlclZlcnNpb24gfSBmcm9tICdAZmlyZWJhc2UvYXBwJztcbmV4cG9ydCAqIGZyb20gJ0BmaXJlYmFzZS9hcHAnO1xuXG52YXIgbmFtZSA9IFwiZmlyZWJhc2VcIjtcbnZhciB2ZXJzaW9uID0gXCI5LjYuOVwiO1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5yZWdpc3RlclZlcnNpb24obmFtZSwgdmVyc2lvbiwgJ2FwcCcpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguZXNtLmpzLm1hcFxuIiwiZXhwb3J0ICogZnJvbSAnQGZpcmViYXNlL2ZpcmVzdG9yZSc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5lc20uanMubWFwXG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIENvbXBvbmVudENvbnRhaW5lciB9IGZyb20gJ0BmaXJlYmFzZS9jb21wb25lbnQnO1xuaW1wb3J0IHsgTG9nZ2VyLCBzZXRVc2VyTG9nSGFuZGxlciwgc2V0TG9nTGV2ZWwgYXMgc2V0TG9nTGV2ZWwkMSB9IGZyb20gJ0BmaXJlYmFzZS9sb2dnZXInO1xuaW1wb3J0IHsgRXJyb3JGYWN0b3J5LCBkZWVwRXF1YWwsIG9wZW5EQiwgYmFzZTY0dXJsRW5jb2RlV2l0aG91dFBhZGRpbmcsIGlzSW5kZXhlZERCQXZhaWxhYmxlLCB2YWxpZGF0ZUluZGV4ZWREQk9wZW5hYmxlIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuZXhwb3J0IHsgRmlyZWJhc2VFcnJvciB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgUGxhdGZvcm1Mb2dnZXJTZXJ2aWNlSW1wbCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihjb250YWluZXIpIHtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcclxuICAgIH1cclxuICAgIC8vIEluIGluaXRpYWwgaW1wbGVtZW50YXRpb24sIHRoaXMgd2lsbCBiZSBjYWxsZWQgYnkgaW5zdGFsbGF0aW9ucyBvblxyXG4gICAgLy8gYXV0aCB0b2tlbiByZWZyZXNoLCBhbmQgaW5zdGFsbGF0aW9ucyB3aWxsIHNlbmQgdGhpcyBzdHJpbmcuXHJcbiAgICBnZXRQbGF0Zm9ybUluZm9TdHJpbmcoKSB7XHJcbiAgICAgICAgY29uc3QgcHJvdmlkZXJzID0gdGhpcy5jb250YWluZXIuZ2V0UHJvdmlkZXJzKCk7XHJcbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHByb3ZpZGVycyBhbmQgZ2V0IGxpYnJhcnkvdmVyc2lvbiBwYWlycyBmcm9tIGFueSB0aGF0IGFyZVxyXG4gICAgICAgIC8vIHZlcnNpb24gY29tcG9uZW50cy5cclxuICAgICAgICByZXR1cm4gcHJvdmlkZXJzXHJcbiAgICAgICAgICAgIC5tYXAocHJvdmlkZXIgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaXNWZXJzaW9uU2VydmljZVByb3ZpZGVyKHByb3ZpZGVyKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VydmljZSA9IHByb3ZpZGVyLmdldEltbWVkaWF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3NlcnZpY2UubGlicmFyeX0vJHtzZXJ2aWNlLnZlcnNpb259YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICAgICAgLmZpbHRlcihsb2dTdHJpbmcgPT4gbG9nU3RyaW5nKVxyXG4gICAgICAgICAgICAuam9pbignICcpO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKlxyXG4gKiBAcGFyYW0gcHJvdmlkZXIgY2hlY2sgaWYgdGhpcyBwcm92aWRlciBwcm92aWRlcyBhIFZlcnNpb25TZXJ2aWNlXHJcbiAqXHJcbiAqIE5PVEU6IFVzaW5nIFByb3ZpZGVyPCdhcHAtdmVyc2lvbic+IGlzIGEgaGFjayB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwcm92aWRlclxyXG4gKiBwcm92aWRlcyBWZXJzaW9uU2VydmljZS4gVGhlIHByb3ZpZGVyIGlzIG5vdCBuZWNlc3NhcmlseSBhICdhcHAtdmVyc2lvbidcclxuICogcHJvdmlkZXIuXHJcbiAqL1xyXG5mdW5jdGlvbiBpc1ZlcnNpb25TZXJ2aWNlUHJvdmlkZXIocHJvdmlkZXIpIHtcclxuICAgIGNvbnN0IGNvbXBvbmVudCA9IHByb3ZpZGVyLmdldENvbXBvbmVudCgpO1xyXG4gICAgcmV0dXJuIChjb21wb25lbnQgPT09IG51bGwgfHwgY29tcG9uZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb21wb25lbnQudHlwZSkgPT09IFwiVkVSU0lPTlwiIC8qIFZFUlNJT04gKi87XHJcbn1cblxuY29uc3QgbmFtZSRvID0gXCJAZmlyZWJhc2UvYXBwXCI7XG5jb25zdCB2ZXJzaW9uJDEgPSBcIjAuNy4xOVwiO1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCdAZmlyZWJhc2UvYXBwJyk7XG5cbmNvbnN0IG5hbWUkbiA9IFwiQGZpcmViYXNlL2FwcC1jb21wYXRcIjtcblxuY29uc3QgbmFtZSRtID0gXCJAZmlyZWJhc2UvYW5hbHl0aWNzLWNvbXBhdFwiO1xuXG5jb25zdCBuYW1lJGwgPSBcIkBmaXJlYmFzZS9hbmFseXRpY3NcIjtcblxuY29uc3QgbmFtZSRrID0gXCJAZmlyZWJhc2UvYXBwLWNoZWNrLWNvbXBhdFwiO1xuXG5jb25zdCBuYW1lJGogPSBcIkBmaXJlYmFzZS9hcHAtY2hlY2tcIjtcblxuY29uc3QgbmFtZSRpID0gXCJAZmlyZWJhc2UvYXV0aFwiO1xuXG5jb25zdCBuYW1lJGggPSBcIkBmaXJlYmFzZS9hdXRoLWNvbXBhdFwiO1xuXG5jb25zdCBuYW1lJGcgPSBcIkBmaXJlYmFzZS9kYXRhYmFzZVwiO1xuXG5jb25zdCBuYW1lJGYgPSBcIkBmaXJlYmFzZS9kYXRhYmFzZS1jb21wYXRcIjtcblxuY29uc3QgbmFtZSRlID0gXCJAZmlyZWJhc2UvZnVuY3Rpb25zXCI7XG5cbmNvbnN0IG5hbWUkZCA9IFwiQGZpcmViYXNlL2Z1bmN0aW9ucy1jb21wYXRcIjtcblxuY29uc3QgbmFtZSRjID0gXCJAZmlyZWJhc2UvaW5zdGFsbGF0aW9uc1wiO1xuXG5jb25zdCBuYW1lJGIgPSBcIkBmaXJlYmFzZS9pbnN0YWxsYXRpb25zLWNvbXBhdFwiO1xuXG5jb25zdCBuYW1lJGEgPSBcIkBmaXJlYmFzZS9tZXNzYWdpbmdcIjtcblxuY29uc3QgbmFtZSQ5ID0gXCJAZmlyZWJhc2UvbWVzc2FnaW5nLWNvbXBhdFwiO1xuXG5jb25zdCBuYW1lJDggPSBcIkBmaXJlYmFzZS9wZXJmb3JtYW5jZVwiO1xuXG5jb25zdCBuYW1lJDcgPSBcIkBmaXJlYmFzZS9wZXJmb3JtYW5jZS1jb21wYXRcIjtcblxuY29uc3QgbmFtZSQ2ID0gXCJAZmlyZWJhc2UvcmVtb3RlLWNvbmZpZ1wiO1xuXG5jb25zdCBuYW1lJDUgPSBcIkBmaXJlYmFzZS9yZW1vdGUtY29uZmlnLWNvbXBhdFwiO1xuXG5jb25zdCBuYW1lJDQgPSBcIkBmaXJlYmFzZS9zdG9yYWdlXCI7XG5cbmNvbnN0IG5hbWUkMyA9IFwiQGZpcmViYXNlL3N0b3JhZ2UtY29tcGF0XCI7XG5cbmNvbnN0IG5hbWUkMiA9IFwiQGZpcmViYXNlL2ZpcmVzdG9yZVwiO1xuXG5jb25zdCBuYW1lJDEgPSBcIkBmaXJlYmFzZS9maXJlc3RvcmUtY29tcGF0XCI7XG5cbmNvbnN0IG5hbWUgPSBcImZpcmViYXNlXCI7XG5jb25zdCB2ZXJzaW9uID0gXCI5LjYuOVwiO1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogVGhlIGRlZmF1bHQgYXBwIG5hbWVcclxuICpcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5jb25zdCBERUZBVUxUX0VOVFJZX05BTUUgPSAnW0RFRkFVTFRdJztcclxuY29uc3QgUExBVEZPUk1fTE9HX1NUUklORyA9IHtcclxuICAgIFtuYW1lJG9dOiAnZmlyZS1jb3JlJyxcclxuICAgIFtuYW1lJG5dOiAnZmlyZS1jb3JlLWNvbXBhdCcsXHJcbiAgICBbbmFtZSRsXTogJ2ZpcmUtYW5hbHl0aWNzJyxcclxuICAgIFtuYW1lJG1dOiAnZmlyZS1hbmFseXRpY3MtY29tcGF0JyxcclxuICAgIFtuYW1lJGpdOiAnZmlyZS1hcHAtY2hlY2snLFxyXG4gICAgW25hbWUka106ICdmaXJlLWFwcC1jaGVjay1jb21wYXQnLFxyXG4gICAgW25hbWUkaV06ICdmaXJlLWF1dGgnLFxyXG4gICAgW25hbWUkaF06ICdmaXJlLWF1dGgtY29tcGF0JyxcclxuICAgIFtuYW1lJGddOiAnZmlyZS1ydGRiJyxcclxuICAgIFtuYW1lJGZdOiAnZmlyZS1ydGRiLWNvbXBhdCcsXHJcbiAgICBbbmFtZSRlXTogJ2ZpcmUtZm4nLFxyXG4gICAgW25hbWUkZF06ICdmaXJlLWZuLWNvbXBhdCcsXHJcbiAgICBbbmFtZSRjXTogJ2ZpcmUtaWlkJyxcclxuICAgIFtuYW1lJGJdOiAnZmlyZS1paWQtY29tcGF0JyxcclxuICAgIFtuYW1lJGFdOiAnZmlyZS1mY20nLFxyXG4gICAgW25hbWUkOV06ICdmaXJlLWZjbS1jb21wYXQnLFxyXG4gICAgW25hbWUkOF06ICdmaXJlLXBlcmYnLFxyXG4gICAgW25hbWUkN106ICdmaXJlLXBlcmYtY29tcGF0JyxcclxuICAgIFtuYW1lJDZdOiAnZmlyZS1yYycsXHJcbiAgICBbbmFtZSQ1XTogJ2ZpcmUtcmMtY29tcGF0JyxcclxuICAgIFtuYW1lJDRdOiAnZmlyZS1nY3MnLFxyXG4gICAgW25hbWUkM106ICdmaXJlLWdjcy1jb21wYXQnLFxyXG4gICAgW25hbWUkMl06ICdmaXJlLWZzdCcsXHJcbiAgICBbbmFtZSQxXTogJ2ZpcmUtZnN0LWNvbXBhdCcsXHJcbiAgICAnZmlyZS1qcyc6ICdmaXJlLWpzJyxcclxuICAgIFtuYW1lXTogJ2ZpcmUtanMtYWxsJ1xyXG59O1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5jb25zdCBfYXBwcyA9IG5ldyBNYXAoKTtcclxuLyoqXHJcbiAqIFJlZ2lzdGVyZWQgY29tcG9uZW50cy5cclxuICpcclxuICogQGludGVybmFsXHJcbiAqL1xyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG5jb25zdCBfY29tcG9uZW50cyA9IG5ldyBNYXAoKTtcclxuLyoqXHJcbiAqIEBwYXJhbSBjb21wb25lbnQgLSB0aGUgY29tcG9uZW50IGJlaW5nIGFkZGVkIHRvIHRoaXMgYXBwJ3MgY29udGFpbmVyXHJcbiAqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZnVuY3Rpb24gX2FkZENvbXBvbmVudChhcHAsIGNvbXBvbmVudCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBhcHAuY29udGFpbmVyLmFkZENvbXBvbmVudChjb21wb25lbnQpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICBsb2dnZXIuZGVidWcoYENvbXBvbmVudCAke2NvbXBvbmVudC5uYW1lfSBmYWlsZWQgdG8gcmVnaXN0ZXIgd2l0aCBGaXJlYmFzZUFwcCAke2FwcC5uYW1lfWAsIGUpO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmZ1bmN0aW9uIF9hZGRPck92ZXJ3cml0ZUNvbXBvbmVudChhcHAsIGNvbXBvbmVudCkge1xyXG4gICAgYXBwLmNvbnRhaW5lci5hZGRPck92ZXJ3cml0ZUNvbXBvbmVudChjb21wb25lbnQpO1xyXG59XHJcbi8qKlxyXG4gKlxyXG4gKiBAcGFyYW0gY29tcG9uZW50IC0gdGhlIGNvbXBvbmVudCB0byByZWdpc3RlclxyXG4gKiBAcmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgY29tcG9uZW50IGlzIHJlZ2lzdGVyZWQgc3VjY2Vzc2Z1bGx5XHJcbiAqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZnVuY3Rpb24gX3JlZ2lzdGVyQ29tcG9uZW50KGNvbXBvbmVudCkge1xyXG4gICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudC5uYW1lO1xyXG4gICAgaWYgKF9jb21wb25lbnRzLmhhcyhjb21wb25lbnROYW1lKSkge1xyXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgVGhlcmUgd2VyZSBtdWx0aXBsZSBhdHRlbXB0cyB0byByZWdpc3RlciBjb21wb25lbnQgJHtjb21wb25lbnROYW1lfS5gKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBfY29tcG9uZW50cy5zZXQoY29tcG9uZW50TmFtZSwgY29tcG9uZW50KTtcclxuICAgIC8vIGFkZCB0aGUgY29tcG9uZW50IHRvIGV4aXN0aW5nIGFwcCBpbnN0YW5jZXNcclxuICAgIGZvciAoY29uc3QgYXBwIG9mIF9hcHBzLnZhbHVlcygpKSB7XHJcbiAgICAgICAgX2FkZENvbXBvbmVudChhcHAsIGNvbXBvbmVudCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG4vKipcclxuICpcclxuICogQHBhcmFtIGFwcCAtIEZpcmViYXNlQXBwIGluc3RhbmNlXHJcbiAqIEBwYXJhbSBuYW1lIC0gc2VydmljZSBuYW1lXHJcbiAqXHJcbiAqIEByZXR1cm5zIHRoZSBwcm92aWRlciBmb3IgdGhlIHNlcnZpY2Ugd2l0aCB0aGUgbWF0Y2hpbmcgbmFtZVxyXG4gKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmZ1bmN0aW9uIF9nZXRQcm92aWRlcihhcHAsIG5hbWUpIHtcclxuICAgIGNvbnN0IGhlYXJ0YmVhdENvbnRyb2xsZXIgPSBhcHAuY29udGFpbmVyXHJcbiAgICAgICAgLmdldFByb3ZpZGVyKCdoZWFydGJlYXQnKVxyXG4gICAgICAgIC5nZXRJbW1lZGlhdGUoeyBvcHRpb25hbDogdHJ1ZSB9KTtcclxuICAgIGlmIChoZWFydGJlYXRDb250cm9sbGVyKSB7XHJcbiAgICAgICAgdm9pZCBoZWFydGJlYXRDb250cm9sbGVyLnRyaWdnZXJIZWFydGJlYXQoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBhcHAuY29udGFpbmVyLmdldFByb3ZpZGVyKG5hbWUpO1xyXG59XHJcbi8qKlxyXG4gKlxyXG4gKiBAcGFyYW0gYXBwIC0gRmlyZWJhc2VBcHAgaW5zdGFuY2VcclxuICogQHBhcmFtIG5hbWUgLSBzZXJ2aWNlIG5hbWVcclxuICogQHBhcmFtIGluc3RhbmNlSWRlbnRpZmllciAtIHNlcnZpY2UgaW5zdGFuY2UgaWRlbnRpZmllciBpbiBjYXNlIHRoZSBzZXJ2aWNlIHN1cHBvcnRzIG11bHRpcGxlIGluc3RhbmNlc1xyXG4gKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmZ1bmN0aW9uIF9yZW1vdmVTZXJ2aWNlSW5zdGFuY2UoYXBwLCBuYW1lLCBpbnN0YW5jZUlkZW50aWZpZXIgPSBERUZBVUxUX0VOVFJZX05BTUUpIHtcclxuICAgIF9nZXRQcm92aWRlcihhcHAsIG5hbWUpLmNsZWFySW5zdGFuY2UoaW5zdGFuY2VJZGVudGlmaWVyKTtcclxufVxyXG4vKipcclxuICogVGVzdCBvbmx5XHJcbiAqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZnVuY3Rpb24gX2NsZWFyQ29tcG9uZW50cygpIHtcclxuICAgIF9jb21wb25lbnRzLmNsZWFyKCk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgRVJST1JTID0ge1xyXG4gICAgW1wibm8tYXBwXCIgLyogTk9fQVBQICovXTogXCJObyBGaXJlYmFzZSBBcHAgJ3skYXBwTmFtZX0nIGhhcyBiZWVuIGNyZWF0ZWQgLSBcIiArXHJcbiAgICAgICAgJ2NhbGwgRmlyZWJhc2UgQXBwLmluaXRpYWxpemVBcHAoKScsXHJcbiAgICBbXCJiYWQtYXBwLW5hbWVcIiAvKiBCQURfQVBQX05BTUUgKi9dOiBcIklsbGVnYWwgQXBwIG5hbWU6ICd7JGFwcE5hbWV9XCIsXHJcbiAgICBbXCJkdXBsaWNhdGUtYXBwXCIgLyogRFVQTElDQVRFX0FQUCAqL106IFwiRmlyZWJhc2UgQXBwIG5hbWVkICd7JGFwcE5hbWV9JyBhbHJlYWR5IGV4aXN0cyB3aXRoIGRpZmZlcmVudCBvcHRpb25zIG9yIGNvbmZpZ1wiLFxyXG4gICAgW1wiYXBwLWRlbGV0ZWRcIiAvKiBBUFBfREVMRVRFRCAqL106IFwiRmlyZWJhc2UgQXBwIG5hbWVkICd7JGFwcE5hbWV9JyBhbHJlYWR5IGRlbGV0ZWRcIixcclxuICAgIFtcImludmFsaWQtYXBwLWFyZ3VtZW50XCIgLyogSU5WQUxJRF9BUFBfQVJHVU1FTlQgKi9dOiAnZmlyZWJhc2UueyRhcHBOYW1lfSgpIHRha2VzIGVpdGhlciBubyBhcmd1bWVudCBvciBhICcgK1xyXG4gICAgICAgICdGaXJlYmFzZSBBcHAgaW5zdGFuY2UuJyxcclxuICAgIFtcImludmFsaWQtbG9nLWFyZ3VtZW50XCIgLyogSU5WQUxJRF9MT0dfQVJHVU1FTlQgKi9dOiAnRmlyc3QgYXJndW1lbnQgdG8gYG9uTG9nYCBtdXN0IGJlIG51bGwgb3IgYSBmdW5jdGlvbi4nLFxyXG4gICAgW1wic3RvcmFnZS1vcGVuXCIgLyogU1RPUkFHRV9PUEVOICovXTogJ0Vycm9yIHRocm93biB3aGVuIG9wZW5pbmcgc3RvcmFnZS4gT3JpZ2luYWwgZXJyb3I6IHskb3JpZ2luYWxFcnJvck1lc3NhZ2V9LicsXHJcbiAgICBbXCJzdG9yYWdlLWdldFwiIC8qIFNUT1JBR0VfR0VUICovXTogJ0Vycm9yIHRocm93biB3aGVuIHJlYWRpbmcgZnJvbSBzdG9yYWdlLiBPcmlnaW5hbCBlcnJvcjogeyRvcmlnaW5hbEVycm9yTWVzc2FnZX0uJyxcclxuICAgIFtcInN0b3JhZ2Utc2V0XCIgLyogU1RPUkFHRV9XUklURSAqL106ICdFcnJvciB0aHJvd24gd2hlbiB3cml0aW5nIHRvIHN0b3JhZ2UuIE9yaWdpbmFsIGVycm9yOiB7JG9yaWdpbmFsRXJyb3JNZXNzYWdlfS4nLFxyXG4gICAgW1wic3RvcmFnZS1kZWxldGVcIiAvKiBTVE9SQUdFX0RFTEVURSAqL106ICdFcnJvciB0aHJvd24gd2hlbiBkZWxldGluZyBmcm9tIHN0b3JhZ2UuIE9yaWdpbmFsIGVycm9yOiB7JG9yaWdpbmFsRXJyb3JNZXNzYWdlfS4nXHJcbn07XHJcbmNvbnN0IEVSUk9SX0ZBQ1RPUlkgPSBuZXcgRXJyb3JGYWN0b3J5KCdhcHAnLCAnRmlyZWJhc2UnLCBFUlJPUlMpO1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jbGFzcyBGaXJlYmFzZUFwcEltcGwge1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucywgY29uZmlnLCBjb250YWluZXIpIHtcclxuICAgICAgICB0aGlzLl9pc0RlbGV0ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5fY29uZmlnID0gT2JqZWN0LmFzc2lnbih7fSwgY29uZmlnKTtcclxuICAgICAgICB0aGlzLl9uYW1lID0gY29uZmlnLm5hbWU7XHJcbiAgICAgICAgdGhpcy5fYXV0b21hdGljRGF0YUNvbGxlY3Rpb25FbmFibGVkID1cclxuICAgICAgICAgICAgY29uZmlnLmF1dG9tYXRpY0RhdGFDb2xsZWN0aW9uRW5hYmxlZDtcclxuICAgICAgICB0aGlzLl9jb250YWluZXIgPSBjb250YWluZXI7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ29tcG9uZW50KG5ldyBDb21wb25lbnQoJ2FwcCcsICgpID0+IHRoaXMsIFwiUFVCTElDXCIgLyogUFVCTElDICovKSk7XHJcbiAgICB9XHJcbiAgICBnZXQgYXV0b21hdGljRGF0YUNvbGxlY3Rpb25FbmFibGVkKCkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tEZXN0cm95ZWQoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYXV0b21hdGljRGF0YUNvbGxlY3Rpb25FbmFibGVkO1xyXG4gICAgfVxyXG4gICAgc2V0IGF1dG9tYXRpY0RhdGFDb2xsZWN0aW9uRW5hYmxlZCh2YWwpIHtcclxuICAgICAgICB0aGlzLmNoZWNrRGVzdHJveWVkKCk7XHJcbiAgICAgICAgdGhpcy5fYXV0b21hdGljRGF0YUNvbGxlY3Rpb25FbmFibGVkID0gdmFsO1xyXG4gICAgfVxyXG4gICAgZ2V0IG5hbWUoKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0Rlc3Ryb3llZCgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9uYW1lO1xyXG4gICAgfVxyXG4gICAgZ2V0IG9wdGlvbnMoKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0Rlc3Ryb3llZCgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9vcHRpb25zO1xyXG4gICAgfVxyXG4gICAgZ2V0IGNvbmZpZygpIHtcclxuICAgICAgICB0aGlzLmNoZWNrRGVzdHJveWVkKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcclxuICAgIH1cclxuICAgIGdldCBjb250YWluZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lcjtcclxuICAgIH1cclxuICAgIGdldCBpc0RlbGV0ZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRGVsZXRlZDtcclxuICAgIH1cclxuICAgIHNldCBpc0RlbGV0ZWQodmFsKSB7XHJcbiAgICAgICAgdGhpcy5faXNEZWxldGVkID0gdmFsO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGhyb3cgYW4gRXJyb3IgaWYgdGhlIEFwcCBoYXMgYWxyZWFkeSBiZWVuIGRlbGV0ZWQgLVxyXG4gICAgICogdXNlIGJlZm9yZSBwZXJmb3JtaW5nIEFQSSBhY3Rpb25zIG9uIHRoZSBBcHAuXHJcbiAgICAgKi9cclxuICAgIGNoZWNrRGVzdHJveWVkKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzRGVsZXRlZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBFUlJPUl9GQUNUT1JZLmNyZWF0ZShcImFwcC1kZWxldGVkXCIgLyogQVBQX0RFTEVURUQgKi8sIHsgYXBwTmFtZTogdGhpcy5fbmFtZSB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFRoZSBjdXJyZW50IFNESyB2ZXJzaW9uLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jb25zdCBTREtfVkVSU0lPTiA9IHZlcnNpb247XHJcbmZ1bmN0aW9uIGluaXRpYWxpemVBcHAob3B0aW9ucywgcmF3Q29uZmlnID0ge30pIHtcclxuICAgIGlmICh0eXBlb2YgcmF3Q29uZmlnICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICAgIGNvbnN0IG5hbWUgPSByYXdDb25maWc7XHJcbiAgICAgICAgcmF3Q29uZmlnID0geyBuYW1lIH07XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb25maWcgPSBPYmplY3QuYXNzaWduKHsgbmFtZTogREVGQVVMVF9FTlRSWV9OQU1FLCBhdXRvbWF0aWNEYXRhQ29sbGVjdGlvbkVuYWJsZWQ6IGZhbHNlIH0sIHJhd0NvbmZpZyk7XHJcbiAgICBjb25zdCBuYW1lID0gY29uZmlnLm5hbWU7XHJcbiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnIHx8ICFuYW1lKSB7XHJcbiAgICAgICAgdGhyb3cgRVJST1JfRkFDVE9SWS5jcmVhdGUoXCJiYWQtYXBwLW5hbWVcIiAvKiBCQURfQVBQX05BTUUgKi8sIHtcclxuICAgICAgICAgICAgYXBwTmFtZTogU3RyaW5nKG5hbWUpXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBleGlzdGluZ0FwcCA9IF9hcHBzLmdldChuYW1lKTtcclxuICAgIGlmIChleGlzdGluZ0FwcCkge1xyXG4gICAgICAgIC8vIHJldHVybiB0aGUgZXhpc3RpbmcgYXBwIGlmIG9wdGlvbnMgYW5kIGNvbmZpZyBkZWVwIGVxdWFsIHRoZSBvbmVzIGluIHRoZSBleGlzdGluZyBhcHAuXHJcbiAgICAgICAgaWYgKGRlZXBFcXVhbChvcHRpb25zLCBleGlzdGluZ0FwcC5vcHRpb25zKSAmJlxyXG4gICAgICAgICAgICBkZWVwRXF1YWwoY29uZmlnLCBleGlzdGluZ0FwcC5jb25maWcpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0FwcDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRocm93IEVSUk9SX0ZBQ1RPUlkuY3JlYXRlKFwiZHVwbGljYXRlLWFwcFwiIC8qIERVUExJQ0FURV9BUFAgKi8sIHsgYXBwTmFtZTogbmFtZSB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb250YWluZXIgPSBuZXcgQ29tcG9uZW50Q29udGFpbmVyKG5hbWUpO1xyXG4gICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgX2NvbXBvbmVudHMudmFsdWVzKCkpIHtcclxuICAgICAgICBjb250YWluZXIuYWRkQ29tcG9uZW50KGNvbXBvbmVudCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBuZXdBcHAgPSBuZXcgRmlyZWJhc2VBcHBJbXBsKG9wdGlvbnMsIGNvbmZpZywgY29udGFpbmVyKTtcclxuICAgIF9hcHBzLnNldChuYW1lLCBuZXdBcHApO1xyXG4gICAgcmV0dXJuIG5ld0FwcDtcclxufVxyXG4vKipcclxuICogUmV0cmlldmVzIGEge0BsaW5rIEBmaXJlYmFzZS9hcHAjRmlyZWJhc2VBcHB9IGluc3RhbmNlLlxyXG4gKlxyXG4gKiBXaGVuIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cywgdGhlIGRlZmF1bHQgYXBwIGlzIHJldHVybmVkLiBXaGVuIGFuIGFwcCBuYW1lXHJcbiAqIGlzIHByb3ZpZGVkLCB0aGUgYXBwIGNvcnJlc3BvbmRpbmcgdG8gdGhhdCBuYW1lIGlzIHJldHVybmVkLlxyXG4gKlxyXG4gKiBBbiBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBhcHAgYmVpbmcgcmV0cmlldmVkIGhhcyBub3QgeWV0IGJlZW5cclxuICogaW5pdGlhbGl6ZWQuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogLy8gUmV0dXJuIHRoZSBkZWZhdWx0IGFwcFxyXG4gKiBjb25zdCBhcHAgPSBnZXRBcHAoKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogLy8gUmV0dXJuIGEgbmFtZWQgYXBwXHJcbiAqIGNvbnN0IG90aGVyQXBwID0gZ2V0QXBwKFwib3RoZXJBcHBcIik7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAcGFyYW0gbmFtZSAtIE9wdGlvbmFsIG5hbWUgb2YgdGhlIGFwcCB0byByZXR1cm4uIElmIG5vIG5hbWUgaXNcclxuICogICBwcm92aWRlZCwgdGhlIGRlZmF1bHQgaXMgYFwiW0RFRkFVTFRdXCJgLlxyXG4gKlxyXG4gKiBAcmV0dXJucyBUaGUgYXBwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3ZpZGVkIGFwcCBuYW1lLlxyXG4gKiAgIElmIG5vIGFwcCBuYW1lIGlzIHByb3ZpZGVkLCB0aGUgZGVmYXVsdCBhcHAgaXMgcmV0dXJuZWQuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmZ1bmN0aW9uIGdldEFwcChuYW1lID0gREVGQVVMVF9FTlRSWV9OQU1FKSB7XHJcbiAgICBjb25zdCBhcHAgPSBfYXBwcy5nZXQobmFtZSk7XHJcbiAgICBpZiAoIWFwcCkge1xyXG4gICAgICAgIHRocm93IEVSUk9SX0ZBQ1RPUlkuY3JlYXRlKFwibm8tYXBwXCIgLyogTk9fQVBQICovLCB7IGFwcE5hbWU6IG5hbWUgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXBwO1xyXG59XHJcbi8qKlxyXG4gKiBBIChyZWFkLW9ubHkpIGFycmF5IG9mIGFsbCBpbml0aWFsaXplZCBhcHBzLlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRBcHBzKCkge1xyXG4gICAgcmV0dXJuIEFycmF5LmZyb20oX2FwcHMudmFsdWVzKCkpO1xyXG59XHJcbi8qKlxyXG4gKiBSZW5kZXJzIHRoaXMgYXBwIHVudXNhYmxlIGFuZCBmcmVlcyB0aGUgcmVzb3VyY2VzIG9mIGFsbCBhc3NvY2lhdGVkXHJcbiAqIHNlcnZpY2VzLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIGRlbGV0ZUFwcChhcHApXHJcbiAqICAgLnRoZW4oZnVuY3Rpb24oKSB7XHJcbiAqICAgICBjb25zb2xlLmxvZyhcIkFwcCBkZWxldGVkIHN1Y2Nlc3NmdWxseVwiKTtcclxuICogICB9KVxyXG4gKiAgIC5jYXRjaChmdW5jdGlvbihlcnJvcikge1xyXG4gKiAgICAgY29uc29sZS5sb2coXCJFcnJvciBkZWxldGluZyBhcHA6XCIsIGVycm9yKTtcclxuICogICB9KTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUFwcChhcHApIHtcclxuICAgIGNvbnN0IG5hbWUgPSBhcHAubmFtZTtcclxuICAgIGlmIChfYXBwcy5oYXMobmFtZSkpIHtcclxuICAgICAgICBfYXBwcy5kZWxldGUobmFtZSk7XHJcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoYXBwLmNvbnRhaW5lclxyXG4gICAgICAgICAgICAuZ2V0UHJvdmlkZXJzKClcclxuICAgICAgICAgICAgLm1hcChwcm92aWRlciA9PiBwcm92aWRlci5kZWxldGUoKSkpO1xyXG4gICAgICAgIGFwcC5pc0RlbGV0ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBSZWdpc3RlcnMgYSBsaWJyYXJ5J3MgbmFtZSBhbmQgdmVyc2lvbiBmb3IgcGxhdGZvcm0gbG9nZ2luZyBwdXJwb3Nlcy5cclxuICogQHBhcmFtIGxpYnJhcnkgLSBOYW1lIG9mIDFwIG9yIDNwIGxpYnJhcnkgKGUuZy4gZmlyZXN0b3JlLCBhbmd1bGFyZmlyZSlcclxuICogQHBhcmFtIHZlcnNpb24gLSBDdXJyZW50IHZlcnNpb24gb2YgdGhhdCBsaWJyYXJ5LlxyXG4gKiBAcGFyYW0gdmFyaWFudCAtIEJ1bmRsZSB2YXJpYW50LCBlLmcuLCBub2RlLCBybiwgZXRjLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiByZWdpc3RlclZlcnNpb24obGlicmFyeUtleU9yTmFtZSwgdmVyc2lvbiwgdmFyaWFudCkge1xyXG4gICAgdmFyIF9hO1xyXG4gICAgLy8gVE9ETzogV2UgY2FuIHVzZSB0aGlzIGNoZWNrIHRvIHdoaXRlbGlzdCBzdHJpbmdzIHdoZW4vaWYgd2Ugc2V0IHVwXHJcbiAgICAvLyBhIGdvb2Qgd2hpdGVsaXN0IHN5c3RlbS5cclxuICAgIGxldCBsaWJyYXJ5ID0gKF9hID0gUExBVEZPUk1fTE9HX1NUUklOR1tsaWJyYXJ5S2V5T3JOYW1lXSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogbGlicmFyeUtleU9yTmFtZTtcclxuICAgIGlmICh2YXJpYW50KSB7XHJcbiAgICAgICAgbGlicmFyeSArPSBgLSR7dmFyaWFudH1gO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbGlicmFyeU1pc21hdGNoID0gbGlicmFyeS5tYXRjaCgvXFxzfFxcLy8pO1xyXG4gICAgY29uc3QgdmVyc2lvbk1pc21hdGNoID0gdmVyc2lvbi5tYXRjaCgvXFxzfFxcLy8pO1xyXG4gICAgaWYgKGxpYnJhcnlNaXNtYXRjaCB8fCB2ZXJzaW9uTWlzbWF0Y2gpIHtcclxuICAgICAgICBjb25zdCB3YXJuaW5nID0gW1xyXG4gICAgICAgICAgICBgVW5hYmxlIHRvIHJlZ2lzdGVyIGxpYnJhcnkgXCIke2xpYnJhcnl9XCIgd2l0aCB2ZXJzaW9uIFwiJHt2ZXJzaW9ufVwiOmBcclxuICAgICAgICBdO1xyXG4gICAgICAgIGlmIChsaWJyYXJ5TWlzbWF0Y2gpIHtcclxuICAgICAgICAgICAgd2FybmluZy5wdXNoKGBsaWJyYXJ5IG5hbWUgXCIke2xpYnJhcnl9XCIgY29udGFpbnMgaWxsZWdhbCBjaGFyYWN0ZXJzICh3aGl0ZXNwYWNlIG9yIFwiL1wiKWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobGlicmFyeU1pc21hdGNoICYmIHZlcnNpb25NaXNtYXRjaCkge1xyXG4gICAgICAgICAgICB3YXJuaW5nLnB1c2goJ2FuZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmVyc2lvbk1pc21hdGNoKSB7XHJcbiAgICAgICAgICAgIHdhcm5pbmcucHVzaChgdmVyc2lvbiBuYW1lIFwiJHt2ZXJzaW9ufVwiIGNvbnRhaW5zIGlsbGVnYWwgY2hhcmFjdGVycyAod2hpdGVzcGFjZSBvciBcIi9cIilgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbG9nZ2VyLndhcm4od2FybmluZy5qb2luKCcgJykpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIF9yZWdpc3RlckNvbXBvbmVudChuZXcgQ29tcG9uZW50KGAke2xpYnJhcnl9LXZlcnNpb25gLCAoKSA9PiAoeyBsaWJyYXJ5LCB2ZXJzaW9uIH0pLCBcIlZFUlNJT05cIiAvKiBWRVJTSU9OICovKSk7XHJcbn1cclxuLyoqXHJcbiAqIFNldHMgbG9nIGhhbmRsZXIgZm9yIGFsbCBGaXJlYmFzZSBTREtzLlxyXG4gKiBAcGFyYW0gbG9nQ2FsbGJhY2sgLSBBbiBvcHRpb25hbCBjdXN0b20gbG9nIGhhbmRsZXIgdGhhdCBleGVjdXRlcyB1c2VyIGNvZGUgd2hlbmV2ZXJcclxuICogdGhlIEZpcmViYXNlIFNESyBtYWtlcyBhIGxvZ2dpbmcgY2FsbC5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gb25Mb2cobG9nQ2FsbGJhY2ssIG9wdGlvbnMpIHtcclxuICAgIGlmIChsb2dDYWxsYmFjayAhPT0gbnVsbCAmJiB0eXBlb2YgbG9nQ2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICB0aHJvdyBFUlJPUl9GQUNUT1JZLmNyZWF0ZShcImludmFsaWQtbG9nLWFyZ3VtZW50XCIgLyogSU5WQUxJRF9MT0dfQVJHVU1FTlQgKi8pO1xyXG4gICAgfVxyXG4gICAgc2V0VXNlckxvZ0hhbmRsZXIobG9nQ2FsbGJhY2ssIG9wdGlvbnMpO1xyXG59XHJcbi8qKlxyXG4gKiBTZXRzIGxvZyBsZXZlbCBmb3IgYWxsIEZpcmViYXNlIFNES3MuXHJcbiAqXHJcbiAqIEFsbCBvZiB0aGUgbG9nIHR5cGVzIGFib3ZlIHRoZSBjdXJyZW50IGxvZyBsZXZlbCBhcmUgY2FwdHVyZWQgKGkuZS4gaWZcclxuICogeW91IHNldCB0aGUgbG9nIGxldmVsIHRvIGBpbmZvYCwgZXJyb3JzIGFyZSBsb2dnZWQsIGJ1dCBgZGVidWdgIGFuZFxyXG4gKiBgdmVyYm9zZWAgbG9ncyBhcmUgbm90KS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gc2V0TG9nTGV2ZWwobG9nTGV2ZWwpIHtcclxuICAgIHNldExvZ0xldmVsJDEobG9nTGV2ZWwpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IERCX05BTUUgPSAnZmlyZWJhc2UtaGVhcnRiZWF0LWRhdGFiYXNlJztcclxuY29uc3QgREJfVkVSU0lPTiA9IDE7XHJcbmNvbnN0IFNUT1JFX05BTUUgPSAnZmlyZWJhc2UtaGVhcnRiZWF0LXN0b3JlJztcclxubGV0IGRiUHJvbWlzZSA9IG51bGw7XHJcbmZ1bmN0aW9uIGdldERiUHJvbWlzZSgpIHtcclxuICAgIGlmICghZGJQcm9taXNlKSB7XHJcbiAgICAgICAgZGJQcm9taXNlID0gb3BlbkRCKERCX05BTUUsIERCX1ZFUlNJT04sIChkYiwgb2xkVmVyc2lvbikgPT4ge1xyXG4gICAgICAgICAgICAvLyBXZSBkb24ndCB1c2UgJ2JyZWFrJyBpbiB0aGlzIHN3aXRjaCBzdGF0ZW1lbnQsIHRoZSBmYWxsLXRocm91Z2hcclxuICAgICAgICAgICAgLy8gYmVoYXZpb3IgaXMgd2hhdCB3ZSB3YW50LCBiZWNhdXNlIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSB2ZXJzaW9ucyBiZXR3ZWVuXHJcbiAgICAgICAgICAgIC8vIHRoZSBvbGQgdmVyc2lvbiBhbmQgdGhlIGN1cnJlbnQgdmVyc2lvbiwgd2Ugd2FudCBBTEwgdGhlIG1pZ3JhdGlvbnNcclxuICAgICAgICAgICAgLy8gdGhhdCBjb3JyZXNwb25kIHRvIHRob3NlIHZlcnNpb25zIHRvIHJ1biwgbm90IG9ubHkgdGhlIGxhc3Qgb25lLlxyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVmYXVsdC1jYXNlXHJcbiAgICAgICAgICAgIHN3aXRjaCAob2xkVmVyc2lvbikge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICAgICAgICAgIGRiLmNyZWF0ZU9iamVjdFN0b3JlKFNUT1JFX05BTUUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkuY2F0Y2goZSA9PiB7XHJcbiAgICAgICAgICAgIHRocm93IEVSUk9SX0ZBQ1RPUlkuY3JlYXRlKFwic3RvcmFnZS1vcGVuXCIgLyogU1RPUkFHRV9PUEVOICovLCB7XHJcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEVycm9yTWVzc2FnZTogZS5tZXNzYWdlXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRiUHJvbWlzZTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiByZWFkSGVhcnRiZWF0c0Zyb21JbmRleGVkREIoYXBwKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IGRiID0gYXdhaXQgZ2V0RGJQcm9taXNlKCk7XHJcbiAgICAgICAgcmV0dXJuIGRiXHJcbiAgICAgICAgICAgIC50cmFuc2FjdGlvbihTVE9SRV9OQU1FKVxyXG4gICAgICAgICAgICAub2JqZWN0U3RvcmUoU1RPUkVfTkFNRSlcclxuICAgICAgICAgICAgLmdldChjb21wdXRlS2V5KGFwcCkpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICB0aHJvdyBFUlJPUl9GQUNUT1JZLmNyZWF0ZShcInN0b3JhZ2UtZ2V0XCIgLyogU1RPUkFHRV9HRVQgKi8sIHtcclxuICAgICAgICAgICAgb3JpZ2luYWxFcnJvck1lc3NhZ2U6IGUubWVzc2FnZVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIHdyaXRlSGVhcnRiZWF0c1RvSW5kZXhlZERCKGFwcCwgaGVhcnRiZWF0T2JqZWN0KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IGRiID0gYXdhaXQgZ2V0RGJQcm9taXNlKCk7XHJcbiAgICAgICAgY29uc3QgdHggPSBkYi50cmFuc2FjdGlvbihTVE9SRV9OQU1FLCAncmVhZHdyaXRlJyk7XHJcbiAgICAgICAgY29uc3Qgb2JqZWN0U3RvcmUgPSB0eC5vYmplY3RTdG9yZShTVE9SRV9OQU1FKTtcclxuICAgICAgICBhd2FpdCBvYmplY3RTdG9yZS5wdXQoaGVhcnRiZWF0T2JqZWN0LCBjb21wdXRlS2V5KGFwcCkpO1xyXG4gICAgICAgIHJldHVybiB0eC5jb21wbGV0ZTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgdGhyb3cgRVJST1JfRkFDVE9SWS5jcmVhdGUoXCJzdG9yYWdlLXNldFwiIC8qIFNUT1JBR0VfV1JJVEUgKi8sIHtcclxuICAgICAgICAgICAgb3JpZ2luYWxFcnJvck1lc3NhZ2U6IGUubWVzc2FnZVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGNvbXB1dGVLZXkoYXBwKSB7XHJcbiAgICByZXR1cm4gYCR7YXBwLm5hbWV9ISR7YXBwLm9wdGlvbnMuYXBwSWR9YDtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBNQVhfSEVBREVSX0JZVEVTID0gMTAyNDtcclxuLy8gMzAgZGF5c1xyXG5jb25zdCBTVE9SRURfSEVBUlRCRUFUX1JFVEVOVElPTl9NQVhfTUlMTElTID0gMzAgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xyXG5jbGFzcyBIZWFydGJlYXRTZXJ2aWNlSW1wbCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihjb250YWluZXIpIHtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbi1tZW1vcnkgY2FjaGUgZm9yIGhlYXJ0YmVhdHMsIHVzZWQgYnkgZ2V0SGVhcnRiZWF0c0hlYWRlcigpIHRvIGdlbmVyYXRlXHJcbiAgICAgICAgICogdGhlIGhlYWRlciBzdHJpbmcuXHJcbiAgICAgICAgICogU3RvcmVzIG9uZSByZWNvcmQgcGVyIGRhdGUuIFRoaXMgd2lsbCBiZSBjb25zb2xpZGF0ZWQgaW50byB0aGUgc3RhbmRhcmRcclxuICAgICAgICAgKiBmb3JtYXQgb2Ygb25lIHJlY29yZCBwZXIgdXNlciBhZ2VudCBzdHJpbmcgYmVmb3JlIGJlaW5nIHNlbnQgYXMgYSBoZWFkZXIuXHJcbiAgICAgICAgICogUG9wdWxhdGVkIGZyb20gaW5kZXhlZERCIHdoZW4gdGhlIGNvbnRyb2xsZXIgaXMgaW5zdGFudGlhdGVkIGFuZCBzaG91bGRcclxuICAgICAgICAgKiBiZSBrZXB0IGluIHN5bmMgd2l0aCBpbmRleGVkREIuXHJcbiAgICAgICAgICogTGVhdmUgcHVibGljIGZvciBlYXNpZXIgdGVzdGluZy5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9oZWFydGJlYXRzQ2FjaGUgPSBudWxsO1xyXG4gICAgICAgIGNvbnN0IGFwcCA9IHRoaXMuY29udGFpbmVyLmdldFByb3ZpZGVyKCdhcHAnKS5nZXRJbW1lZGlhdGUoKTtcclxuICAgICAgICB0aGlzLl9zdG9yYWdlID0gbmV3IEhlYXJ0YmVhdFN0b3JhZ2VJbXBsKGFwcCk7XHJcbiAgICAgICAgdGhpcy5faGVhcnRiZWF0c0NhY2hlUHJvbWlzZSA9IHRoaXMuX3N0b3JhZ2UucmVhZCgpLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgdGhpcy5faGVhcnRiZWF0c0NhY2hlID0gcmVzdWx0O1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgdG8gcmVwb3J0IGEgaGVhcnRiZWF0LiBUaGUgZnVuY3Rpb24gd2lsbCBnZW5lcmF0ZVxyXG4gICAgICogYSBIZWFydGJlYXRzQnlVc2VyQWdlbnQgb2JqZWN0LCB1cGRhdGUgaGVhcnRiZWF0c0NhY2hlLCBhbmQgcGVyc2lzdCBpdFxyXG4gICAgICogdG8gSW5kZXhlZERCLlxyXG4gICAgICogTm90ZSB0aGF0IHdlIG9ubHkgc3RvcmUgb25lIGhlYXJ0YmVhdCBwZXIgZGF5LiBTbyBpZiBhIGhlYXJ0YmVhdCBmb3IgdG9kYXkgaXNcclxuICAgICAqIGFscmVhZHkgbG9nZ2VkLCBzdWJzZXF1ZW50IGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gaW4gdGhlIHNhbWUgZGF5IHdpbGwgYmUgaWdub3JlZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgdHJpZ2dlckhlYXJ0YmVhdCgpIHtcclxuICAgICAgICBjb25zdCBwbGF0Zm9ybUxvZ2dlciA9IHRoaXMuY29udGFpbmVyXHJcbiAgICAgICAgICAgIC5nZXRQcm92aWRlcigncGxhdGZvcm0tbG9nZ2VyJylcclxuICAgICAgICAgICAgLmdldEltbWVkaWF0ZSgpO1xyXG4gICAgICAgIC8vIFRoaXMgaXMgdGhlIFwiRmlyZWJhc2UgdXNlciBhZ2VudFwiIHN0cmluZyBmcm9tIHRoZSBwbGF0Zm9ybSBsb2dnZXJcclxuICAgICAgICAvLyBzZXJ2aWNlLCBub3QgdGhlIGJyb3dzZXIgdXNlciBhZ2VudC5cclxuICAgICAgICBjb25zdCBhZ2VudCA9IHBsYXRmb3JtTG9nZ2VyLmdldFBsYXRmb3JtSW5mb1N0cmluZygpO1xyXG4gICAgICAgIGNvbnN0IGRhdGUgPSBnZXRVVENEYXRlU3RyaW5nKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuX2hlYXJ0YmVhdHNDYWNoZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLl9oZWFydGJlYXRzQ2FjaGUgPSBhd2FpdCB0aGlzLl9oZWFydGJlYXRzQ2FjaGVQcm9taXNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBEbyBub3Qgc3RvcmUgYSBoZWFydGJlYXQgaWYgb25lIGlzIGFscmVhZHkgc3RvcmVkIGZvciB0aGlzIGRheVxyXG4gICAgICAgIC8vIG9yIGlmIGEgaGVhZGVyIGhhcyBhbHJlYWR5IGJlZW4gc2VudCB0b2RheS5cclxuICAgICAgICBpZiAodGhpcy5faGVhcnRiZWF0c0NhY2hlLmxhc3RTZW50SGVhcnRiZWF0RGF0ZSA9PT0gZGF0ZSB8fFxyXG4gICAgICAgICAgICB0aGlzLl9oZWFydGJlYXRzQ2FjaGUuaGVhcnRiZWF0cy5zb21lKHNpbmdsZURhdGVIZWFydGJlYXQgPT4gc2luZ2xlRGF0ZUhlYXJ0YmVhdC5kYXRlID09PSBkYXRlKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBlbnRyeSBmb3IgdGhpcyBkYXRlLiBDcmVhdGUgb25lLlxyXG4gICAgICAgICAgICB0aGlzLl9oZWFydGJlYXRzQ2FjaGUuaGVhcnRiZWF0cy5wdXNoKHsgZGF0ZSwgYWdlbnQgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFJlbW92ZSBlbnRyaWVzIG9sZGVyIHRoYW4gMzAgZGF5cy5cclxuICAgICAgICB0aGlzLl9oZWFydGJlYXRzQ2FjaGUuaGVhcnRiZWF0cyA9IHRoaXMuX2hlYXJ0YmVhdHNDYWNoZS5oZWFydGJlYXRzLmZpbHRlcihzaW5nbGVEYXRlSGVhcnRiZWF0ID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaGJUaW1lc3RhbXAgPSBuZXcgRGF0ZShzaW5nbGVEYXRlSGVhcnRiZWF0LmRhdGUpLnZhbHVlT2YoKTtcclxuICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICAgICAgcmV0dXJuIG5vdyAtIGhiVGltZXN0YW1wIDw9IFNUT1JFRF9IRUFSVEJFQVRfUkVURU5USU9OX01BWF9NSUxMSVM7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0b3JhZ2Uub3ZlcndyaXRlKHRoaXMuX2hlYXJ0YmVhdHNDYWNoZSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcgd2hpY2ggY2FuIGJlIGF0dGFjaGVkIHRvIHRoZSBoZWFydGJlYXQtc3BlY2lmaWMgaGVhZGVyIGRpcmVjdGx5LlxyXG4gICAgICogSXQgYWxzbyBjbGVhcnMgYWxsIGhlYXJ0YmVhdHMgZnJvbSBtZW1vcnkgYXMgd2VsbCBhcyBpbiBJbmRleGVkREIuXHJcbiAgICAgKlxyXG4gICAgICogTk9URTogQ29uc3VtaW5nIHByb2R1Y3QgU0RLcyBzaG91bGQgbm90IHNlbmQgdGhlIGhlYWRlciBpZiB0aGlzIG1ldGhvZFxyXG4gICAgICogcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdldEhlYXJ0YmVhdHNIZWFkZXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2hlYXJ0YmVhdHNDYWNoZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9oZWFydGJlYXRzQ2FjaGVQcm9taXNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBJZiBpdCdzIHN0aWxsIG51bGwgb3IgdGhlIGFycmF5IGlzIGVtcHR5LCB0aGVyZSBpcyBubyBkYXRhIHRvIHNlbmQuXHJcbiAgICAgICAgaWYgKHRoaXMuX2hlYXJ0YmVhdHNDYWNoZSA9PT0gbnVsbCB8fFxyXG4gICAgICAgICAgICB0aGlzLl9oZWFydGJlYXRzQ2FjaGUuaGVhcnRiZWF0cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkYXRlID0gZ2V0VVRDRGF0ZVN0cmluZygpO1xyXG4gICAgICAgIC8vIEV4dHJhY3QgYXMgbWFueSBoZWFydGJlYXRzIGZyb20gdGhlIGNhY2hlIGFzIHdpbGwgZml0IHVuZGVyIHRoZSBzaXplIGxpbWl0LlxyXG4gICAgICAgIGNvbnN0IHsgaGVhcnRiZWF0c1RvU2VuZCwgdW5zZW50RW50cmllcyB9ID0gZXh0cmFjdEhlYXJ0YmVhdHNGb3JIZWFkZXIodGhpcy5faGVhcnRiZWF0c0NhY2hlLmhlYXJ0YmVhdHMpO1xyXG4gICAgICAgIGNvbnN0IGhlYWRlclN0cmluZyA9IGJhc2U2NHVybEVuY29kZVdpdGhvdXRQYWRkaW5nKEpTT04uc3RyaW5naWZ5KHsgdmVyc2lvbjogMiwgaGVhcnRiZWF0czogaGVhcnRiZWF0c1RvU2VuZCB9KSk7XHJcbiAgICAgICAgLy8gU3RvcmUgbGFzdCBzZW50IGRhdGUgdG8gcHJldmVudCBhbm90aGVyIGJlaW5nIGxvZ2dlZC9zZW50IGZvciB0aGUgc2FtZSBkYXkuXHJcbiAgICAgICAgdGhpcy5faGVhcnRiZWF0c0NhY2hlLmxhc3RTZW50SGVhcnRiZWF0RGF0ZSA9IGRhdGU7XHJcbiAgICAgICAgaWYgKHVuc2VudEVudHJpZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAvLyBTdG9yZSBhbnkgdW5zZW50IGVudHJpZXMgaWYgdGhleSBleGlzdC5cclxuICAgICAgICAgICAgdGhpcy5faGVhcnRiZWF0c0NhY2hlLmhlYXJ0YmVhdHMgPSB1bnNlbnRFbnRyaWVzO1xyXG4gICAgICAgICAgICAvLyBUaGlzIHNlZW1zIG1vcmUgbGlrZWx5IHRoYW4gZW1wdHlpbmcgdGhlIGFycmF5IChiZWxvdykgdG8gbGVhZCB0byBzb21lIG9kZCBzdGF0ZVxyXG4gICAgICAgICAgICAvLyBzaW5jZSB0aGUgY2FjaGUgaXNuJ3QgZW1wdHkgYW5kIHRoaXMgd2lsbCBiZSBjYWxsZWQgYWdhaW4gb24gdGhlIG5leHQgcmVxdWVzdCxcclxuICAgICAgICAgICAgLy8gYW5kIGlzIHByb2JhYmx5IHNhZmVzdCBpZiB3ZSBhd2FpdCBpdC5cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fc3RvcmFnZS5vdmVyd3JpdGUodGhpcy5faGVhcnRiZWF0c0NhY2hlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2hlYXJ0YmVhdHNDYWNoZS5oZWFydGJlYXRzID0gW107XHJcbiAgICAgICAgICAgIC8vIERvIG5vdCB3YWl0IGZvciB0aGlzLCB0byByZWR1Y2UgbGF0ZW5jeS5cclxuICAgICAgICAgICAgdm9pZCB0aGlzLl9zdG9yYWdlLm92ZXJ3cml0ZSh0aGlzLl9oZWFydGJlYXRzQ2FjaGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaGVhZGVyU3RyaW5nO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGdldFVUQ0RhdGVTdHJpbmcoKSB7XHJcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XHJcbiAgICAvLyBSZXR1cm5zIGRhdGUgZm9ybWF0ICdZWVlZLU1NLUREJ1xyXG4gICAgcmV0dXJuIHRvZGF5LnRvSVNPU3RyaW5nKCkuc3Vic3RyaW5nKDAsIDEwKTtcclxufVxyXG5mdW5jdGlvbiBleHRyYWN0SGVhcnRiZWF0c0ZvckhlYWRlcihoZWFydGJlYXRzQ2FjaGUsIG1heFNpemUgPSBNQVhfSEVBREVSX0JZVEVTKSB7XHJcbiAgICAvLyBIZWFydGJlYXRzIGdyb3VwZWQgYnkgdXNlciBhZ2VudCBpbiB0aGUgc3RhbmRhcmQgZm9ybWF0IHRvIGJlIHNlbnQgaW5cclxuICAgIC8vIHRoZSBoZWFkZXIuXHJcbiAgICBjb25zdCBoZWFydGJlYXRzVG9TZW5kID0gW107XHJcbiAgICAvLyBTaW5nbGUgZGF0ZSBmb3JtYXQgaGVhcnRiZWF0cyB0aGF0IGFyZSBub3Qgc2VudC5cclxuICAgIGxldCB1bnNlbnRFbnRyaWVzID0gaGVhcnRiZWF0c0NhY2hlLnNsaWNlKCk7XHJcbiAgICBmb3IgKGNvbnN0IHNpbmdsZURhdGVIZWFydGJlYXQgb2YgaGVhcnRiZWF0c0NhY2hlKSB7XHJcbiAgICAgICAgLy8gTG9vayBmb3IgYW4gZXhpc3RpbmcgZW50cnkgd2l0aCB0aGUgc2FtZSB1c2VyIGFnZW50LlxyXG4gICAgICAgIGNvbnN0IGhlYXJ0YmVhdEVudHJ5ID0gaGVhcnRiZWF0c1RvU2VuZC5maW5kKGhiID0+IGhiLmFnZW50ID09PSBzaW5nbGVEYXRlSGVhcnRiZWF0LmFnZW50KTtcclxuICAgICAgICBpZiAoIWhlYXJ0YmVhdEVudHJ5KSB7XHJcbiAgICAgICAgICAgIC8vIElmIG5vIGVudHJ5IGZvciB0aGlzIHVzZXIgYWdlbnQgZXhpc3RzLCBjcmVhdGUgb25lLlxyXG4gICAgICAgICAgICBoZWFydGJlYXRzVG9TZW5kLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgYWdlbnQ6IHNpbmdsZURhdGVIZWFydGJlYXQuYWdlbnQsXHJcbiAgICAgICAgICAgICAgICBkYXRlczogW3NpbmdsZURhdGVIZWFydGJlYXQuZGF0ZV1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChjb3VudEJ5dGVzKGhlYXJ0YmVhdHNUb1NlbmQpID4gbWF4U2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGhlYWRlciB3b3VsZCBleGNlZWQgbWF4IHNpemUsIHJlbW92ZSB0aGUgYWRkZWQgaGVhcnRiZWF0XHJcbiAgICAgICAgICAgICAgICAvLyBlbnRyeSBhbmQgc3RvcCBhZGRpbmcgdG8gdGhlIGhlYWRlci5cclxuICAgICAgICAgICAgICAgIGhlYXJ0YmVhdHNUb1NlbmQucG9wKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaGVhcnRiZWF0RW50cnkuZGF0ZXMucHVzaChzaW5nbGVEYXRlSGVhcnRiZWF0LmRhdGUpO1xyXG4gICAgICAgICAgICAvLyBJZiB0aGUgaGVhZGVyIHdvdWxkIGV4Y2VlZCBtYXggc2l6ZSwgcmVtb3ZlIHRoZSBhZGRlZCBkYXRlXHJcbiAgICAgICAgICAgIC8vIGFuZCBzdG9wIGFkZGluZyB0byB0aGUgaGVhZGVyLlxyXG4gICAgICAgICAgICBpZiAoY291bnRCeXRlcyhoZWFydGJlYXRzVG9TZW5kKSA+IG1heFNpemUpIHtcclxuICAgICAgICAgICAgICAgIGhlYXJ0YmVhdEVudHJ5LmRhdGVzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUG9wIHVuc2VudCBlbnRyeSBmcm9tIHF1ZXVlLiAoU2tpcHBlZCBpZiBhZGRpbmcgdGhlIGVudHJ5IGV4Y2VlZGVkXHJcbiAgICAgICAgLy8gcXVvdGEgYW5kIHRoZSBsb29wIGJyZWFrcyBlYXJseS4pXHJcbiAgICAgICAgdW5zZW50RW50cmllcyA9IHVuc2VudEVudHJpZXMuc2xpY2UoMSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGhlYXJ0YmVhdHNUb1NlbmQsXHJcbiAgICAgICAgdW5zZW50RW50cmllc1xyXG4gICAgfTtcclxufVxyXG5jbGFzcyBIZWFydGJlYXRTdG9yYWdlSW1wbCB7XHJcbiAgICBjb25zdHJ1Y3RvcihhcHApIHtcclxuICAgICAgICB0aGlzLmFwcCA9IGFwcDtcclxuICAgICAgICB0aGlzLl9jYW5Vc2VJbmRleGVkREJQcm9taXNlID0gdGhpcy5ydW5JbmRleGVkREJFbnZpcm9ubWVudENoZWNrKCk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBydW5JbmRleGVkREJFbnZpcm9ubWVudENoZWNrKCkge1xyXG4gICAgICAgIGlmICghaXNJbmRleGVkREJBdmFpbGFibGUoKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVJbmRleGVkREJPcGVuYWJsZSgpXHJcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB0cnVlKVxyXG4gICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlYWQgYWxsIGhlYXJ0YmVhdHMuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHJlYWQoKSB7XHJcbiAgICAgICAgY29uc3QgY2FuVXNlSW5kZXhlZERCID0gYXdhaXQgdGhpcy5fY2FuVXNlSW5kZXhlZERCUHJvbWlzZTtcclxuICAgICAgICBpZiAoIWNhblVzZUluZGV4ZWREQikge1xyXG4gICAgICAgICAgICByZXR1cm4geyBoZWFydGJlYXRzOiBbXSB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgaWRiSGVhcnRiZWF0T2JqZWN0ID0gYXdhaXQgcmVhZEhlYXJ0YmVhdHNGcm9tSW5kZXhlZERCKHRoaXMuYXBwKTtcclxuICAgICAgICAgICAgcmV0dXJuIGlkYkhlYXJ0YmVhdE9iamVjdCB8fCB7IGhlYXJ0YmVhdHM6IFtdIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gb3ZlcndyaXRlIHRoZSBzdG9yYWdlIHdpdGggdGhlIHByb3ZpZGVkIGhlYXJ0YmVhdHNcclxuICAgIGFzeW5jIG92ZXJ3cml0ZShoZWFydGJlYXRzT2JqZWN0KSB7XHJcbiAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgIGNvbnN0IGNhblVzZUluZGV4ZWREQiA9IGF3YWl0IHRoaXMuX2NhblVzZUluZGV4ZWREQlByb21pc2U7XHJcbiAgICAgICAgaWYgKCFjYW5Vc2VJbmRleGVkREIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdIZWFydGJlYXRzT2JqZWN0ID0gYXdhaXQgdGhpcy5yZWFkKCk7XHJcbiAgICAgICAgICAgIHJldHVybiB3cml0ZUhlYXJ0YmVhdHNUb0luZGV4ZWREQih0aGlzLmFwcCwge1xyXG4gICAgICAgICAgICAgICAgbGFzdFNlbnRIZWFydGJlYXREYXRlOiAoX2EgPSBoZWFydGJlYXRzT2JqZWN0Lmxhc3RTZW50SGVhcnRiZWF0RGF0ZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZXhpc3RpbmdIZWFydGJlYXRzT2JqZWN0Lmxhc3RTZW50SGVhcnRiZWF0RGF0ZSxcclxuICAgICAgICAgICAgICAgIGhlYXJ0YmVhdHM6IGhlYXJ0YmVhdHNPYmplY3QuaGVhcnRiZWF0c1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBhZGQgaGVhcnRiZWF0c1xyXG4gICAgYXN5bmMgYWRkKGhlYXJ0YmVhdHNPYmplY3QpIHtcclxuICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgY29uc3QgY2FuVXNlSW5kZXhlZERCID0gYXdhaXQgdGhpcy5fY2FuVXNlSW5kZXhlZERCUHJvbWlzZTtcclxuICAgICAgICBpZiAoIWNhblVzZUluZGV4ZWREQikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ0hlYXJ0YmVhdHNPYmplY3QgPSBhd2FpdCB0aGlzLnJlYWQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHdyaXRlSGVhcnRiZWF0c1RvSW5kZXhlZERCKHRoaXMuYXBwLCB7XHJcbiAgICAgICAgICAgICAgICBsYXN0U2VudEhlYXJ0YmVhdERhdGU6IChfYSA9IGhlYXJ0YmVhdHNPYmplY3QubGFzdFNlbnRIZWFydGJlYXREYXRlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBleGlzdGluZ0hlYXJ0YmVhdHNPYmplY3QubGFzdFNlbnRIZWFydGJlYXREYXRlLFxyXG4gICAgICAgICAgICAgICAgaGVhcnRiZWF0czogW1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLmV4aXN0aW5nSGVhcnRiZWF0c09iamVjdC5oZWFydGJlYXRzLFxyXG4gICAgICAgICAgICAgICAgICAgIC4uLmhlYXJ0YmVhdHNPYmplY3QuaGVhcnRiZWF0c1xyXG4gICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIENhbGN1bGF0ZSBieXRlcyBvZiBhIEhlYXJ0YmVhdHNCeVVzZXJBZ2VudCBhcnJheSBhZnRlciBiZWluZyB3cmFwcGVkXHJcbiAqIGluIGEgcGxhdGZvcm0gbG9nZ2luZyBoZWFkZXIgSlNPTiBvYmplY3QsIHN0cmluZ2lmaWVkLCBhbmQgY29udmVydGVkXHJcbiAqIHRvIGJhc2UgNjQuXHJcbiAqL1xyXG5mdW5jdGlvbiBjb3VudEJ5dGVzKGhlYXJ0YmVhdHNDYWNoZSkge1xyXG4gICAgLy8gYmFzZTY0IGhhcyBhIHJlc3RyaWN0ZWQgc2V0IG9mIGNoYXJhY3RlcnMsIGFsbCBvZiB3aGljaCBzaG91bGQgYmUgMSBieXRlLlxyXG4gICAgcmV0dXJuIGJhc2U2NHVybEVuY29kZVdpdGhvdXRQYWRkaW5nKFxyXG4gICAgLy8gaGVhcnRiZWF0c0NhY2hlIHdyYXBwZXIgcHJvcGVydGllc1xyXG4gICAgSlNPTi5zdHJpbmdpZnkoeyB2ZXJzaW9uOiAyLCBoZWFydGJlYXRzOiBoZWFydGJlYXRzQ2FjaGUgfSkpLmxlbmd0aDtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiByZWdpc3RlckNvcmVDb21wb25lbnRzKHZhcmlhbnQpIHtcclxuICAgIF9yZWdpc3RlckNvbXBvbmVudChuZXcgQ29tcG9uZW50KCdwbGF0Zm9ybS1sb2dnZXInLCBjb250YWluZXIgPT4gbmV3IFBsYXRmb3JtTG9nZ2VyU2VydmljZUltcGwoY29udGFpbmVyKSwgXCJQUklWQVRFXCIgLyogUFJJVkFURSAqLykpO1xyXG4gICAgX3JlZ2lzdGVyQ29tcG9uZW50KG5ldyBDb21wb25lbnQoJ2hlYXJ0YmVhdCcsIGNvbnRhaW5lciA9PiBuZXcgSGVhcnRiZWF0U2VydmljZUltcGwoY29udGFpbmVyKSwgXCJQUklWQVRFXCIgLyogUFJJVkFURSAqLykpO1xyXG4gICAgLy8gUmVnaXN0ZXIgYGFwcGAgcGFja2FnZS5cclxuICAgIHJlZ2lzdGVyVmVyc2lvbihuYW1lJG8sIHZlcnNpb24kMSwgdmFyaWFudCk7XHJcbiAgICAvLyBCVUlMRF9UQVJHRVQgd2lsbCBiZSByZXBsYWNlZCBieSB2YWx1ZXMgbGlrZSBlc201LCBlc20yMDE3LCBjanM1LCBldGMgZHVyaW5nIHRoZSBjb21waWxhdGlvblxyXG4gICAgcmVnaXN0ZXJWZXJzaW9uKG5hbWUkbywgdmVyc2lvbiQxLCAnZXNtMjAxNycpO1xyXG4gICAgLy8gUmVnaXN0ZXIgcGxhdGZvcm0gU0RLIGlkZW50aWZpZXIgKG5vIHZlcnNpb24pLlxyXG4gICAgcmVnaXN0ZXJWZXJzaW9uKCdmaXJlLWpzJywgJycpO1xyXG59XG5cbi8qKlxyXG4gKiBGaXJlYmFzZSBBcHBcclxuICpcclxuICogQHJlbWFya3MgVGhpcyBwYWNrYWdlIGNvb3JkaW5hdGVzIHRoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIGRpZmZlcmVudCBGaXJlYmFzZSBjb21wb25lbnRzXHJcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxyXG4gKi9cclxucmVnaXN0ZXJDb3JlQ29tcG9uZW50cygnJyk7XG5cbmV4cG9ydCB7IFNES19WRVJTSU9OLCBERUZBVUxUX0VOVFJZX05BTUUgYXMgX0RFRkFVTFRfRU5UUllfTkFNRSwgX2FkZENvbXBvbmVudCwgX2FkZE9yT3ZlcndyaXRlQ29tcG9uZW50LCBfYXBwcywgX2NsZWFyQ29tcG9uZW50cywgX2NvbXBvbmVudHMsIF9nZXRQcm92aWRlciwgX3JlZ2lzdGVyQ29tcG9uZW50LCBfcmVtb3ZlU2VydmljZUluc3RhbmNlLCBkZWxldGVBcHAsIGdldEFwcCwgZ2V0QXBwcywgaW5pdGlhbGl6ZUFwcCwgb25Mb2csIHJlZ2lzdGVyVmVyc2lvbiwgc2V0TG9nTGV2ZWwgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmVzbTIwMTcuanMubWFwXG4iLCJpbXBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuLyoqXHJcbiAqIENvbXBvbmVudCBmb3Igc2VydmljZSBuYW1lIFQsIGUuZy4gYGF1dGhgLCBgYXV0aC1pbnRlcm5hbGBcclxuICovXHJcbmNsYXNzIENvbXBvbmVudCB7XHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgcHVibGljIHNlcnZpY2UgbmFtZSwgZS5nLiBhcHAsIGF1dGgsIGZpcmVzdG9yZSwgZGF0YWJhc2VcclxuICAgICAqIEBwYXJhbSBpbnN0YW5jZUZhY3RvcnkgU2VydmljZSBmYWN0b3J5IHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUgcHVibGljIGludGVyZmFjZVxyXG4gICAgICogQHBhcmFtIHR5cGUgd2hldGhlciB0aGUgc2VydmljZSBwcm92aWRlZCBieSB0aGUgY29tcG9uZW50IGlzIHB1YmxpYyBvciBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKG5hbWUsIGluc3RhbmNlRmFjdG9yeSwgdHlwZSkge1xyXG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICAgICAgdGhpcy5pbnN0YW5jZUZhY3RvcnkgPSBpbnN0YW5jZUZhY3Rvcnk7XHJcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcclxuICAgICAgICB0aGlzLm11bHRpcGxlSW5zdGFuY2VzID0gZmFsc2U7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUHJvcGVydGllcyB0byBiZSBhZGRlZCB0byB0aGUgc2VydmljZSBuYW1lc3BhY2VcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNlcnZpY2VQcm9wcyA9IHt9O1xyXG4gICAgICAgIHRoaXMuaW5zdGFudGlhdGlvbk1vZGUgPSBcIkxBWllcIiAvKiBMQVpZICovO1xyXG4gICAgICAgIHRoaXMub25JbnN0YW5jZUNyZWF0ZWQgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgc2V0SW5zdGFudGlhdGlvbk1vZGUobW9kZSkge1xyXG4gICAgICAgIHRoaXMuaW5zdGFudGlhdGlvbk1vZGUgPSBtb2RlO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgc2V0TXVsdGlwbGVJbnN0YW5jZXMobXVsdGlwbGVJbnN0YW5jZXMpIHtcclxuICAgICAgICB0aGlzLm11bHRpcGxlSW5zdGFuY2VzID0gbXVsdGlwbGVJbnN0YW5jZXM7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICBzZXRTZXJ2aWNlUHJvcHMocHJvcHMpIHtcclxuICAgICAgICB0aGlzLnNlcnZpY2VQcm9wcyA9IHByb3BzO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgc2V0SW5zdGFuY2VDcmVhdGVkQ2FsbGJhY2soY2FsbGJhY2spIHtcclxuICAgICAgICB0aGlzLm9uSW5zdGFuY2VDcmVhdGVkID0gY2FsbGJhY2s7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgREVGQVVMVF9FTlRSWV9OQU1FID0gJ1tERUZBVUxUXSc7XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBQcm92aWRlciBmb3IgaW5zdGFuY2UgZm9yIHNlcnZpY2UgbmFtZSBULCBlLmcuICdhdXRoJywgJ2F1dGgtaW50ZXJuYWwnXHJcbiAqIE5hbWVTZXJ2aWNlTWFwcGluZ1tUXSBpcyBhbiBhbGlhcyBmb3IgdGhlIHR5cGUgb2YgdGhlIGluc3RhbmNlXHJcbiAqL1xyXG5jbGFzcyBQcm92aWRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lLCBjb250YWluZXIpIHtcclxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xyXG4gICAgICAgIHRoaXMuY29tcG9uZW50ID0gbnVsbDtcclxuICAgICAgICB0aGlzLmluc3RhbmNlcyA9IG5ldyBNYXAoKTtcclxuICAgICAgICB0aGlzLmluc3RhbmNlc0RlZmVycmVkID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIHRoaXMuaW5zdGFuY2VzT3B0aW9ucyA9IG5ldyBNYXAoKTtcclxuICAgICAgICB0aGlzLm9uSW5pdENhbGxiYWNrcyA9IG5ldyBNYXAoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIGlkZW50aWZpZXIgQSBwcm92aWRlciBjYW4gcHJvdmlkZSBtdWxpdHBsZSBpbnN0YW5jZXMgb2YgYSBzZXJ2aWNlXHJcbiAgICAgKiBpZiB0aGlzLmNvbXBvbmVudC5tdWx0aXBsZUluc3RhbmNlcyBpcyB0cnVlLlxyXG4gICAgICovXHJcbiAgICBnZXQoaWRlbnRpZmllcikge1xyXG4gICAgICAgIC8vIGlmIG11bHRpcGxlSW5zdGFuY2VzIGlzIG5vdCBzdXBwb3J0ZWQsIHVzZSB0aGUgZGVmYXVsdCBuYW1lXHJcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZElkZW50aWZpZXIgPSB0aGlzLm5vcm1hbGl6ZUluc3RhbmNlSWRlbnRpZmllcihpZGVudGlmaWVyKTtcclxuICAgICAgICBpZiAoIXRoaXMuaW5zdGFuY2VzRGVmZXJyZWQuaGFzKG5vcm1hbGl6ZWRJZGVudGlmaWVyKSkge1xyXG4gICAgICAgICAgICBjb25zdCBkZWZlcnJlZCA9IG5ldyBEZWZlcnJlZCgpO1xyXG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlc0RlZmVycmVkLnNldChub3JtYWxpemVkSWRlbnRpZmllciwgZGVmZXJyZWQpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKG5vcm1hbGl6ZWRJZGVudGlmaWVyKSB8fFxyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG91bGRBdXRvSW5pdGlhbGl6ZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBzZXJ2aWNlIGlmIGl0IGNhbiBiZSBhdXRvLWluaXRpYWxpemVkXHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5nZXRPckluaXRpYWxpemVTZXJ2aWNlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBub3JtYWxpemVkSWRlbnRpZmllclxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKGluc3RhbmNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGluc3RhbmNlIGZhY3RvcnkgdGhyb3dzIGFuIGV4Y2VwdGlvbiBkdXJpbmcgZ2V0KCksIGl0IHNob3VsZCBub3QgY2F1c2VcclxuICAgICAgICAgICAgICAgICAgICAvLyBhIGZhdGFsIGVycm9yLiBXZSBqdXN0IHJldHVybiB0aGUgdW5yZXNvbHZlZCBwcm9taXNlIGluIHRoaXMgY2FzZS5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZXNEZWZlcnJlZC5nZXQobm9ybWFsaXplZElkZW50aWZpZXIpLnByb21pc2U7XHJcbiAgICB9XHJcbiAgICBnZXRJbW1lZGlhdGUob3B0aW9ucykge1xyXG4gICAgICAgIHZhciBfYTtcclxuICAgICAgICAvLyBpZiBtdWx0aXBsZUluc3RhbmNlcyBpcyBub3Qgc3VwcG9ydGVkLCB1c2UgdGhlIGRlZmF1bHQgbmFtZVxyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZGVudGlmaWVyID0gdGhpcy5ub3JtYWxpemVJbnN0YW5jZUlkZW50aWZpZXIob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmlkZW50aWZpZXIpO1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbmFsID0gKF9hID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm9wdGlvbmFsKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKG5vcm1hbGl6ZWRJZGVudGlmaWVyKSB8fFxyXG4gICAgICAgICAgICB0aGlzLnNob3VsZEF1dG9Jbml0aWFsaXplKCkpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldE9ySW5pdGlhbGl6ZVNlcnZpY2Uoe1xyXG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlSWRlbnRpZmllcjogbm9ybWFsaXplZElkZW50aWZpZXJcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9uYWwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIEluIGNhc2UgYSBjb21wb25lbnQgaXMgbm90IGluaXRpYWxpemVkIGFuZCBzaG91bGQvY2FuIG5vdCBiZSBhdXRvLWluaXRpYWxpemVkIGF0IHRoZSBtb21lbnQsIHJldHVybiBudWxsIGlmIHRoZSBvcHRpb25hbCBmbGFnIGlzIHNldCwgb3IgdGhyb3dcclxuICAgICAgICAgICAgaWYgKG9wdGlvbmFsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBTZXJ2aWNlICR7dGhpcy5uYW1lfSBpcyBub3QgYXZhaWxhYmxlYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXRDb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50O1xyXG4gICAgfVxyXG4gICAgc2V0Q29tcG9uZW50KGNvbXBvbmVudCkge1xyXG4gICAgICAgIGlmIChjb21wb25lbnQubmFtZSAhPT0gdGhpcy5uYW1lKSB7XHJcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBNaXNtYXRjaGluZyBDb21wb25lbnQgJHtjb21wb25lbnQubmFtZX0gZm9yIFByb3ZpZGVyICR7dGhpcy5uYW1lfS5gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBDb21wb25lbnQgZm9yICR7dGhpcy5uYW1lfSBoYXMgYWxyZWFkeSBiZWVuIHByb3ZpZGVkYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50O1xyXG4gICAgICAgIC8vIHJldHVybiBlYXJseSB3aXRob3V0IGF0dGVtcHRpbmcgdG8gaW5pdGlhbGl6ZSB0aGUgY29tcG9uZW50IGlmIHRoZSBjb21wb25lbnQgcmVxdWlyZXMgZXhwbGljaXQgaW5pdGlhbGl6YXRpb24gKGNhbGxpbmcgYFByb3ZpZGVyLmluaXRpYWxpemUoKWApXHJcbiAgICAgICAgaWYgKCF0aGlzLnNob3VsZEF1dG9Jbml0aWFsaXplKCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZiB0aGUgc2VydmljZSBpcyBlYWdlciwgaW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBpbnN0YW5jZVxyXG4gICAgICAgIGlmIChpc0NvbXBvbmVudEVhZ2VyKGNvbXBvbmVudCkpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0T3JJbml0aWFsaXplU2VydmljZSh7IGluc3RhbmNlSWRlbnRpZmllcjogREVGQVVMVF9FTlRSWV9OQU1FIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBpbnN0YW5jZSBmYWN0b3J5IGZvciBhbiBlYWdlciBDb21wb25lbnQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBkdXJpbmcgdGhlIGVhZ2VyXHJcbiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXphdGlvbiwgaXQgc2hvdWxkIG5vdCBjYXVzZSBhIGZhdGFsIGVycm9yLlxyXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogSW52ZXN0aWdhdGUgaWYgd2UgbmVlZCB0byBtYWtlIGl0IGNvbmZpZ3VyYWJsZSwgYmVjYXVzZSBzb21lIGNvbXBvbmVudCBtYXkgd2FudCB0byBjYXVzZVxyXG4gICAgICAgICAgICAgICAgLy8gYSBmYXRhbCBlcnJvciBpbiB0aGlzIGNhc2U/XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQ3JlYXRlIHNlcnZpY2UgaW5zdGFuY2VzIGZvciB0aGUgcGVuZGluZyBwcm9taXNlcyBhbmQgcmVzb2x2ZSB0aGVtXHJcbiAgICAgICAgLy8gTk9URTogaWYgdGhpcy5tdWx0aXBsZUluc3RhbmNlcyBpcyBmYWxzZSwgb25seSB0aGUgZGVmYXVsdCBpbnN0YW5jZSB3aWxsIGJlIGNyZWF0ZWRcclxuICAgICAgICAvLyBhbmQgYWxsIHByb21pc2VzIHdpdGggcmVzb2x2ZSB3aXRoIGl0IHJlZ2FyZGxlc3Mgb2YgdGhlIGlkZW50aWZpZXIuXHJcbiAgICAgICAgZm9yIChjb25zdCBbaW5zdGFuY2VJZGVudGlmaWVyLCBpbnN0YW5jZURlZmVycmVkXSBvZiB0aGlzLmluc3RhbmNlc0RlZmVycmVkLmVudHJpZXMoKSkge1xyXG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkSWRlbnRpZmllciA9IHRoaXMubm9ybWFsaXplSW5zdGFuY2VJZGVudGlmaWVyKGluc3RhbmNlSWRlbnRpZmllcik7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAvLyBgZ2V0T3JJbml0aWFsaXplU2VydmljZSgpYCBzaG91bGQgYWx3YXlzIHJldHVybiBhIHZhbGlkIGluc3RhbmNlIHNpbmNlIGEgY29tcG9uZW50IGlzIGd1YXJhbnRlZWQuIHVzZSAhIHRvIG1ha2UgdHlwZXNjcmlwdCBoYXBweS5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5nZXRPckluaXRpYWxpemVTZXJ2aWNlKHtcclxuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUlkZW50aWZpZXI6IG5vcm1hbGl6ZWRJZGVudGlmaWVyXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGluc3RhbmNlRGVmZXJyZWQucmVzb2x2ZShpbnN0YW5jZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGluc3RhbmNlIGZhY3RvcnkgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgaXQgc2hvdWxkIG5vdCBjYXVzZVxyXG4gICAgICAgICAgICAgICAgLy8gYSBmYXRhbCBlcnJvci4gV2UganVzdCBsZWF2ZSB0aGUgcHJvbWlzZSB1bnJlc29sdmVkLlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2xlYXJJbnN0YW5jZShpZGVudGlmaWVyID0gREVGQVVMVF9FTlRSWV9OQU1FKSB7XHJcbiAgICAgICAgdGhpcy5pbnN0YW5jZXNEZWZlcnJlZC5kZWxldGUoaWRlbnRpZmllcik7XHJcbiAgICAgICAgdGhpcy5pbnN0YW5jZXNPcHRpb25zLmRlbGV0ZShpZGVudGlmaWVyKTtcclxuICAgICAgICB0aGlzLmluc3RhbmNlcy5kZWxldGUoaWRlbnRpZmllcik7XHJcbiAgICB9XHJcbiAgICAvLyBhcHAuZGVsZXRlKCkgd2lsbCBjYWxsIHRoaXMgbWV0aG9kIG9uIGV2ZXJ5IHByb3ZpZGVyIHRvIGRlbGV0ZSB0aGUgc2VydmljZXNcclxuICAgIC8vIFRPRE86IHNob3VsZCB3ZSBtYXJrIHRoZSBwcm92aWRlciBhcyBkZWxldGVkP1xyXG4gICAgYXN5bmMgZGVsZXRlKCkge1xyXG4gICAgICAgIGNvbnN0IHNlcnZpY2VzID0gQXJyYXkuZnJvbSh0aGlzLmluc3RhbmNlcy52YWx1ZXMoKSk7XHJcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xyXG4gICAgICAgICAgICAuLi5zZXJ2aWNlc1xyXG4gICAgICAgICAgICAgICAgLmZpbHRlcihzZXJ2aWNlID0+ICdJTlRFUk5BTCcgaW4gc2VydmljZSkgLy8gbGVnYWN5IHNlcnZpY2VzXHJcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgICAgICAgICAgLm1hcChzZXJ2aWNlID0+IHNlcnZpY2UuSU5URVJOQUwuZGVsZXRlKCkpLFxyXG4gICAgICAgICAgICAuLi5zZXJ2aWNlc1xyXG4gICAgICAgICAgICAgICAgLmZpbHRlcihzZXJ2aWNlID0+ICdfZGVsZXRlJyBpbiBzZXJ2aWNlKSAvLyBtb2R1bGFyaXplZCBzZXJ2aWNlc1xyXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICAgICAgICAgIC5tYXAoc2VydmljZSA9PiBzZXJ2aWNlLl9kZWxldGUoKSlcclxuICAgICAgICBdKTtcclxuICAgIH1cclxuICAgIGlzQ29tcG9uZW50U2V0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudCAhPSBudWxsO1xyXG4gICAgfVxyXG4gICAgaXNJbml0aWFsaXplZChpZGVudGlmaWVyID0gREVGQVVMVF9FTlRSWV9OQU1FKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2VzLmhhcyhpZGVudGlmaWVyKTtcclxuICAgIH1cclxuICAgIGdldE9wdGlvbnMoaWRlbnRpZmllciA9IERFRkFVTFRfRU5UUllfTkFNRSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlc09wdGlvbnMuZ2V0KGlkZW50aWZpZXIpIHx8IHt9O1xyXG4gICAgfVxyXG4gICAgaW5pdGlhbGl6ZShvcHRzID0ge30pIHtcclxuICAgICAgICBjb25zdCB7IG9wdGlvbnMgPSB7fSB9ID0gb3B0cztcclxuICAgICAgICBjb25zdCBub3JtYWxpemVkSWRlbnRpZmllciA9IHRoaXMubm9ybWFsaXplSW5zdGFuY2VJZGVudGlmaWVyKG9wdHMuaW5zdGFuY2VJZGVudGlmaWVyKTtcclxuICAgICAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKG5vcm1hbGl6ZWRJZGVudGlmaWVyKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgJHt0aGlzLm5hbWV9KCR7bm9ybWFsaXplZElkZW50aWZpZXJ9KSBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5pc0NvbXBvbmVudFNldCgpKSB7XHJcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBDb21wb25lbnQgJHt0aGlzLm5hbWV9IGhhcyBub3QgYmVlbiByZWdpc3RlcmVkIHlldGApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuZ2V0T3JJbml0aWFsaXplU2VydmljZSh7XHJcbiAgICAgICAgICAgIGluc3RhbmNlSWRlbnRpZmllcjogbm9ybWFsaXplZElkZW50aWZpZXIsXHJcbiAgICAgICAgICAgIG9wdGlvbnNcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyByZXNvbHZlIGFueSBwZW5kaW5nIHByb21pc2Ugd2FpdGluZyBmb3IgdGhlIHNlcnZpY2UgaW5zdGFuY2VcclxuICAgICAgICBmb3IgKGNvbnN0IFtpbnN0YW5jZUlkZW50aWZpZXIsIGluc3RhbmNlRGVmZXJyZWRdIG9mIHRoaXMuaW5zdGFuY2VzRGVmZXJyZWQuZW50cmllcygpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWREZWZlcnJlZElkZW50aWZpZXIgPSB0aGlzLm5vcm1hbGl6ZUluc3RhbmNlSWRlbnRpZmllcihpbnN0YW5jZUlkZW50aWZpZXIpO1xyXG4gICAgICAgICAgICBpZiAobm9ybWFsaXplZElkZW50aWZpZXIgPT09IG5vcm1hbGl6ZWREZWZlcnJlZElkZW50aWZpZXIpIHtcclxuICAgICAgICAgICAgICAgIGluc3RhbmNlRGVmZXJyZWQucmVzb2x2ZShpbnN0YW5jZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrIC0gYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgaW52b2tlZCAgYWZ0ZXIgdGhlIHByb3ZpZGVyIGhhcyBiZWVuIGluaXRpYWxpemVkIGJ5IGNhbGxpbmcgcHJvdmlkZXIuaW5pdGlhbGl6ZSgpLlxyXG4gICAgICogVGhlIGZ1bmN0aW9uIGlzIGludm9rZWQgU1lOQ0hST05PVVNMWSwgc28gaXQgc2hvdWxkIG5vdCBleGVjdXRlIGFueSBsb25ncnVubmluZyB0YXNrcyBpbiBvcmRlciB0byBub3QgYmxvY2sgdGhlIHByb2dyYW0uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGlkZW50aWZpZXIgQW4gb3B0aW9uYWwgaW5zdGFuY2UgaWRlbnRpZmllclxyXG4gICAgICogQHJldHVybnMgYSBmdW5jdGlvbiB0byB1bnJlZ2lzdGVyIHRoZSBjYWxsYmFja1xyXG4gICAgICovXHJcbiAgICBvbkluaXQoY2FsbGJhY2ssIGlkZW50aWZpZXIpIHtcclxuICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZElkZW50aWZpZXIgPSB0aGlzLm5vcm1hbGl6ZUluc3RhbmNlSWRlbnRpZmllcihpZGVudGlmaWVyKTtcclxuICAgICAgICBjb25zdCBleGlzdGluZ0NhbGxiYWNrcyA9IChfYSA9IHRoaXMub25Jbml0Q2FsbGJhY2tzLmdldChub3JtYWxpemVkSWRlbnRpZmllcikpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IG5ldyBTZXQoKTtcclxuICAgICAgICBleGlzdGluZ0NhbGxiYWNrcy5hZGQoY2FsbGJhY2spO1xyXG4gICAgICAgIHRoaXMub25Jbml0Q2FsbGJhY2tzLnNldChub3JtYWxpemVkSWRlbnRpZmllciwgZXhpc3RpbmdDYWxsYmFja3MpO1xyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nSW5zdGFuY2UgPSB0aGlzLmluc3RhbmNlcy5nZXQobm9ybWFsaXplZElkZW50aWZpZXIpO1xyXG4gICAgICAgIGlmIChleGlzdGluZ0luc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKGV4aXN0aW5nSW5zdGFuY2UsIG5vcm1hbGl6ZWRJZGVudGlmaWVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgZXhpc3RpbmdDYWxsYmFja3MuZGVsZXRlKGNhbGxiYWNrKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZva2Ugb25Jbml0IGNhbGxiYWNrcyBzeW5jaHJvbm91c2x5XHJcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgdGhlIHNlcnZpY2UgaW5zdGFuY2VgXHJcbiAgICAgKi9cclxuICAgIGludm9rZU9uSW5pdENhbGxiYWNrcyhpbnN0YW5jZSwgaWRlbnRpZmllcikge1xyXG4gICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IHRoaXMub25Jbml0Q2FsbGJhY2tzLmdldChpZGVudGlmaWVyKTtcclxuICAgICAgICBpZiAoIWNhbGxiYWNrcykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgY2FsbGJhY2tzKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhpbnN0YW5jZSwgaWRlbnRpZmllcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzIGluIHRoZSBvbkluaXQgY2FsbGJhY2tcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldE9ySW5pdGlhbGl6ZVNlcnZpY2UoeyBpbnN0YW5jZUlkZW50aWZpZXIsIG9wdGlvbnMgPSB7fSB9KSB7XHJcbiAgICAgICAgbGV0IGluc3RhbmNlID0gdGhpcy5pbnN0YW5jZXMuZ2V0KGluc3RhbmNlSWRlbnRpZmllcik7XHJcbiAgICAgICAgaWYgKCFpbnN0YW5jZSAmJiB0aGlzLmNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICBpbnN0YW5jZSA9IHRoaXMuY29tcG9uZW50Lmluc3RhbmNlRmFjdG9yeSh0aGlzLmNvbnRhaW5lciwge1xyXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBub3JtYWxpemVJZGVudGlmaWVyRm9yRmFjdG9yeShpbnN0YW5jZUlkZW50aWZpZXIpLFxyXG4gICAgICAgICAgICAgICAgb3B0aW9uc1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZXMuc2V0KGluc3RhbmNlSWRlbnRpZmllciwgaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlc09wdGlvbnMuc2V0KGluc3RhbmNlSWRlbnRpZmllciwgb3B0aW9ucyk7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBJbnZva2Ugb25Jbml0IGxpc3RlbmVycy5cclxuICAgICAgICAgICAgICogTm90ZSB0aGlzLmNvbXBvbmVudC5vbkluc3RhbmNlQ3JlYXRlZCBpcyBkaWZmZXJlbnQsIHdoaWNoIGlzIHVzZWQgYnkgdGhlIGNvbXBvbmVudCBjcmVhdG9yLFxyXG4gICAgICAgICAgICAgKiB3aGlsZSBvbkluaXQgbGlzdGVuZXJzIGFyZSByZWdpc3RlcmVkIGJ5IGNvbnN1bWVycyBvZiB0aGUgcHJvdmlkZXIuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICB0aGlzLmludm9rZU9uSW5pdENhbGxiYWNrcyhpbnN0YW5jZSwgaW5zdGFuY2VJZGVudGlmaWVyKTtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIE9yZGVyIGlzIGltcG9ydGFudFxyXG4gICAgICAgICAgICAgKiBvbkluc3RhbmNlQ3JlYXRlZCgpIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgdGhpcy5pbnN0YW5jZXMuc2V0KGluc3RhbmNlSWRlbnRpZmllciwgaW5zdGFuY2UpOyB3aGljaFxyXG4gICAgICAgICAgICAgKiBtYWtlcyBgaXNJbml0aWFsaXplZCgpYCByZXR1cm4gdHJ1ZS5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBvbmVudC5vbkluc3RhbmNlQ3JlYXRlZCkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudC5vbkluc3RhbmNlQ3JlYXRlZCh0aGlzLmNvbnRhaW5lciwgaW5zdGFuY2VJZGVudGlmaWVyLCBpbnN0YW5jZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzIGluIHRoZSBvbkluc3RhbmNlQ3JlYXRlZENhbGxiYWNrXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlIHx8IG51bGw7XHJcbiAgICB9XHJcbiAgICBub3JtYWxpemVJbnN0YW5jZUlkZW50aWZpZXIoaWRlbnRpZmllciA9IERFRkFVTFRfRU5UUllfTkFNRSkge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wb25lbnQubXVsdGlwbGVJbnN0YW5jZXMgPyBpZGVudGlmaWVyIDogREVGQVVMVF9FTlRSWV9OQU1FO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGlkZW50aWZpZXI7IC8vIGFzc3VtZSBtdWx0aXBsZSBpbnN0YW5jZXMgYXJlIHN1cHBvcnRlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBpcyBwcm92aWRlZC5cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzaG91bGRBdXRvSW5pdGlhbGl6ZSgpIHtcclxuICAgICAgICByZXR1cm4gKCEhdGhpcy5jb21wb25lbnQgJiZcclxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnQuaW5zdGFudGlhdGlvbk1vZGUgIT09IFwiRVhQTElDSVRcIiAvKiBFWFBMSUNJVCAqLyk7XHJcbiAgICB9XHJcbn1cclxuLy8gdW5kZWZpbmVkIHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIHNlcnZpY2UgZmFjdG9yeSBmb3IgdGhlIGRlZmF1bHQgaW5zdGFuY2VcclxuZnVuY3Rpb24gbm9ybWFsaXplSWRlbnRpZmllckZvckZhY3RvcnkoaWRlbnRpZmllcikge1xyXG4gICAgcmV0dXJuIGlkZW50aWZpZXIgPT09IERFRkFVTFRfRU5UUllfTkFNRSA/IHVuZGVmaW5lZCA6IGlkZW50aWZpZXI7XHJcbn1cclxuZnVuY3Rpb24gaXNDb21wb25lbnRFYWdlcihjb21wb25lbnQpIHtcclxuICAgIHJldHVybiBjb21wb25lbnQuaW5zdGFudGlhdGlvbk1vZGUgPT09IFwiRUFHRVJcIiAvKiBFQUdFUiAqLztcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogQ29tcG9uZW50Q29udGFpbmVyIHRoYXQgcHJvdmlkZXMgUHJvdmlkZXJzIGZvciBzZXJ2aWNlIG5hbWUgVCwgZS5nLiBgYXV0aGAsIGBhdXRoLWludGVybmFsYFxyXG4gKi9cclxuY2xhc3MgQ29tcG9uZW50Q29udGFpbmVyIHtcclxuICAgIGNvbnN0cnVjdG9yKG5hbWUpIHtcclxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xyXG4gICAgICAgIHRoaXMucHJvdmlkZXJzID0gbmV3IE1hcCgpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNvbXBvbmVudCBDb21wb25lbnQgYmVpbmcgYWRkZWRcclxuICAgICAqIEBwYXJhbSBvdmVyd3JpdGUgV2hlbiBhIGNvbXBvbmVudCB3aXRoIHRoZSBzYW1lIG5hbWUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkLFxyXG4gICAgICogaWYgb3ZlcndyaXRlIGlzIHRydWU6IG92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgY29tcG9uZW50IHdpdGggdGhlIG5ldyBjb21wb25lbnQgYW5kIGNyZWF0ZSBhIG5ld1xyXG4gICAgICogcHJvdmlkZXIgd2l0aCB0aGUgbmV3IGNvbXBvbmVudC4gSXQgY2FuIGJlIHVzZWZ1bCBpbiB0ZXN0cyB3aGVyZSB5b3Ugd2FudCB0byB1c2UgZGlmZmVyZW50IG1vY2tzXHJcbiAgICAgKiBmb3IgZGlmZmVyZW50IHRlc3RzLlxyXG4gICAgICogaWYgb3ZlcndyaXRlIGlzIGZhbHNlOiB0aHJvdyBhbiBleGNlcHRpb25cclxuICAgICAqL1xyXG4gICAgYWRkQ29tcG9uZW50KGNvbXBvbmVudCkge1xyXG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5nZXRQcm92aWRlcihjb21wb25lbnQubmFtZSk7XHJcbiAgICAgICAgaWYgKHByb3ZpZGVyLmlzQ29tcG9uZW50U2V0KCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb21wb25lbnQgJHtjb21wb25lbnQubmFtZX0gaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIHdpdGggJHt0aGlzLm5hbWV9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHByb3ZpZGVyLnNldENvbXBvbmVudChjb21wb25lbnQpO1xyXG4gICAgfVxyXG4gICAgYWRkT3JPdmVyd3JpdGVDb21wb25lbnQoY29tcG9uZW50KSB7XHJcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLmdldFByb3ZpZGVyKGNvbXBvbmVudC5uYW1lKTtcclxuICAgICAgICBpZiAocHJvdmlkZXIuaXNDb21wb25lbnRTZXQoKSkge1xyXG4gICAgICAgICAgICAvLyBkZWxldGUgdGhlIGV4aXN0aW5nIHByb3ZpZGVyIGZyb20gdGhlIGNvbnRhaW5lciwgc28gd2UgY2FuIHJlZ2lzdGVyIHRoZSBuZXcgY29tcG9uZW50XHJcbiAgICAgICAgICAgIHRoaXMucHJvdmlkZXJzLmRlbGV0ZShjb21wb25lbnQubmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWRkQ29tcG9uZW50KGNvbXBvbmVudCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGdldFByb3ZpZGVyIHByb3ZpZGVzIGEgdHlwZSBzYWZlIGludGVyZmFjZSB3aGVyZSBpdCBjYW4gb25seSBiZSBjYWxsZWQgd2l0aCBhIGZpZWxkIG5hbWVcclxuICAgICAqIHByZXNlbnQgaW4gTmFtZVNlcnZpY2VNYXBwaW5nIGludGVyZmFjZS5cclxuICAgICAqXHJcbiAgICAgKiBGaXJlYmFzZSBTREtzIHByb3ZpZGluZyBzZXJ2aWNlcyBzaG91bGQgZXh0ZW5kIE5hbWVTZXJ2aWNlTWFwcGluZyBpbnRlcmZhY2UgdG8gcmVnaXN0ZXJcclxuICAgICAqIHRoZW1zZWx2ZXMuXHJcbiAgICAgKi9cclxuICAgIGdldFByb3ZpZGVyKG5hbWUpIHtcclxuICAgICAgICBpZiAodGhpcy5wcm92aWRlcnMuaGFzKG5hbWUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3ZpZGVycy5nZXQobmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNyZWF0ZSBhIFByb3ZpZGVyIGZvciBhIHNlcnZpY2UgdGhhdCBoYXNuJ3QgcmVnaXN0ZXJlZCB3aXRoIEZpcmViYXNlXHJcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgUHJvdmlkZXIobmFtZSwgdGhpcyk7XHJcbiAgICAgICAgdGhpcy5wcm92aWRlcnMuc2V0KG5hbWUsIHByb3ZpZGVyKTtcclxuICAgICAgICByZXR1cm4gcHJvdmlkZXI7XHJcbiAgICB9XHJcbiAgICBnZXRQcm92aWRlcnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5wcm92aWRlcnMudmFsdWVzKCkpO1xyXG4gICAgfVxyXG59XG5cbmV4cG9ydCB7IENvbXBvbmVudCwgQ29tcG9uZW50Q29udGFpbmVyLCBQcm92aWRlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguZXNtMjAxNy5qcy5tYXBcbiIsIi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBBIGNvbnRhaW5lciBmb3IgYWxsIG9mIHRoZSBMb2dnZXIgaW5zdGFuY2VzXHJcbiAqL1xyXG5jb25zdCBpbnN0YW5jZXMgPSBbXTtcclxuLyoqXHJcbiAqIFRoZSBKUyBTREsgc3VwcG9ydHMgNSBsb2cgbGV2ZWxzIGFuZCBhbHNvIGFsbG93cyBhIHVzZXIgdGhlIGFiaWxpdHkgdG9cclxuICogc2lsZW5jZSB0aGUgbG9ncyBhbHRvZ2V0aGVyLlxyXG4gKlxyXG4gKiBUaGUgb3JkZXIgaXMgYSBmb2xsb3dzOlxyXG4gKiBERUJVRyA8IFZFUkJPU0UgPCBJTkZPIDwgV0FSTiA8IEVSUk9SXHJcbiAqXHJcbiAqIEFsbCBvZiB0aGUgbG9nIHR5cGVzIGFib3ZlIHRoZSBjdXJyZW50IGxvZyBsZXZlbCB3aWxsIGJlIGNhcHR1cmVkIChpLmUuIGlmXHJcbiAqIHlvdSBzZXQgdGhlIGxvZyBsZXZlbCB0byBgSU5GT2AsIGVycm9ycyB3aWxsIHN0aWxsIGJlIGxvZ2dlZCwgYnV0IGBERUJVR2AgYW5kXHJcbiAqIGBWRVJCT1NFYCBsb2dzIHdpbGwgbm90KVxyXG4gKi9cclxudmFyIExvZ0xldmVsO1xyXG4oZnVuY3Rpb24gKExvZ0xldmVsKSB7XHJcbiAgICBMb2dMZXZlbFtMb2dMZXZlbFtcIkRFQlVHXCJdID0gMF0gPSBcIkRFQlVHXCI7XHJcbiAgICBMb2dMZXZlbFtMb2dMZXZlbFtcIlZFUkJPU0VcIl0gPSAxXSA9IFwiVkVSQk9TRVwiO1xyXG4gICAgTG9nTGV2ZWxbTG9nTGV2ZWxbXCJJTkZPXCJdID0gMl0gPSBcIklORk9cIjtcclxuICAgIExvZ0xldmVsW0xvZ0xldmVsW1wiV0FSTlwiXSA9IDNdID0gXCJXQVJOXCI7XHJcbiAgICBMb2dMZXZlbFtMb2dMZXZlbFtcIkVSUk9SXCJdID0gNF0gPSBcIkVSUk9SXCI7XHJcbiAgICBMb2dMZXZlbFtMb2dMZXZlbFtcIlNJTEVOVFwiXSA9IDVdID0gXCJTSUxFTlRcIjtcclxufSkoTG9nTGV2ZWwgfHwgKExvZ0xldmVsID0ge30pKTtcclxuY29uc3QgbGV2ZWxTdHJpbmdUb0VudW0gPSB7XHJcbiAgICAnZGVidWcnOiBMb2dMZXZlbC5ERUJVRyxcclxuICAgICd2ZXJib3NlJzogTG9nTGV2ZWwuVkVSQk9TRSxcclxuICAgICdpbmZvJzogTG9nTGV2ZWwuSU5GTyxcclxuICAgICd3YXJuJzogTG9nTGV2ZWwuV0FSTixcclxuICAgICdlcnJvcic6IExvZ0xldmVsLkVSUk9SLFxyXG4gICAgJ3NpbGVudCc6IExvZ0xldmVsLlNJTEVOVFxyXG59O1xyXG4vKipcclxuICogVGhlIGRlZmF1bHQgbG9nIGxldmVsXHJcbiAqL1xyXG5jb25zdCBkZWZhdWx0TG9nTGV2ZWwgPSBMb2dMZXZlbC5JTkZPO1xyXG4vKipcclxuICogQnkgZGVmYXVsdCwgYGNvbnNvbGUuZGVidWdgIGlzIG5vdCBkaXNwbGF5ZWQgaW4gdGhlIGRldmVsb3BlciBjb25zb2xlIChpblxyXG4gKiBjaHJvbWUpLiBUbyBhdm9pZCBmb3JjaW5nIHVzZXJzIHRvIGhhdmUgdG8gb3B0LWluIHRvIHRoZXNlIGxvZ3MgdHdpY2VcclxuICogKGkuZS4gb25jZSBmb3IgZmlyZWJhc2UsIGFuZCBvbmNlIGluIHRoZSBjb25zb2xlKSwgd2UgYXJlIHNlbmRpbmcgYERFQlVHYFxyXG4gKiBsb2dzIHRvIHRoZSBgY29uc29sZS5sb2dgIGZ1bmN0aW9uLlxyXG4gKi9cclxuY29uc3QgQ29uc29sZU1ldGhvZCA9IHtcclxuICAgIFtMb2dMZXZlbC5ERUJVR106ICdsb2cnLFxyXG4gICAgW0xvZ0xldmVsLlZFUkJPU0VdOiAnbG9nJyxcclxuICAgIFtMb2dMZXZlbC5JTkZPXTogJ2luZm8nLFxyXG4gICAgW0xvZ0xldmVsLldBUk5dOiAnd2FybicsXHJcbiAgICBbTG9nTGV2ZWwuRVJST1JdOiAnZXJyb3InXHJcbn07XHJcbi8qKlxyXG4gKiBUaGUgZGVmYXVsdCBsb2cgaGFuZGxlciB3aWxsIGZvcndhcmQgREVCVUcsIFZFUkJPU0UsIElORk8sIFdBUk4sIGFuZCBFUlJPUlxyXG4gKiBtZXNzYWdlcyBvbiB0byB0aGVpciBjb3JyZXNwb25kaW5nIGNvbnNvbGUgY291bnRlcnBhcnRzIChpZiB0aGUgbG9nIG1ldGhvZFxyXG4gKiBpcyBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgbG9nIGxldmVsKVxyXG4gKi9cclxuY29uc3QgZGVmYXVsdExvZ0hhbmRsZXIgPSAoaW5zdGFuY2UsIGxvZ1R5cGUsIC4uLmFyZ3MpID0+IHtcclxuICAgIGlmIChsb2dUeXBlIDwgaW5zdGFuY2UubG9nTGV2ZWwpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XHJcbiAgICBjb25zdCBtZXRob2QgPSBDb25zb2xlTWV0aG9kW2xvZ1R5cGVdO1xyXG4gICAgaWYgKG1ldGhvZCkge1xyXG4gICAgICAgIGNvbnNvbGVbbWV0aG9kXShgWyR7bm93fV0gICR7aW5zdGFuY2UubmFtZX06YCwgLi4uYXJncyk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEF0dGVtcHRlZCB0byBsb2cgYSBtZXNzYWdlIHdpdGggYW4gaW52YWxpZCBsb2dUeXBlICh2YWx1ZTogJHtsb2dUeXBlfSlgKTtcclxuICAgIH1cclxufTtcclxuY2xhc3MgTG9nZ2VyIHtcclxuICAgIC8qKlxyXG4gICAgICogR2l2ZXMgeW91IGFuIGluc3RhbmNlIG9mIGEgTG9nZ2VyIHRvIGNhcHR1cmUgbWVzc2FnZXMgYWNjb3JkaW5nIHRvXHJcbiAgICAgKiBGaXJlYmFzZSdzIGxvZ2dpbmcgc2NoZW1lLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRoYXQgdGhlIGxvZ3Mgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGhcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IobmFtZSkge1xyXG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGxvZyBsZXZlbCBvZiB0aGUgZ2l2ZW4gTG9nZ2VyIGluc3RhbmNlLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2xvZ0xldmVsID0gZGVmYXVsdExvZ0xldmVsO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBtYWluIChpbnRlcm5hbCkgbG9nIGhhbmRsZXIgZm9yIHRoZSBMb2dnZXIgaW5zdGFuY2UuXHJcbiAgICAgICAgICogQ2FuIGJlIHNldCB0byBhIG5ldyBmdW5jdGlvbiBpbiBpbnRlcm5hbCBwYWNrYWdlIGNvZGUgYnV0IG5vdCBieSB1c2VyLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2xvZ0hhbmRsZXIgPSBkZWZhdWx0TG9nSGFuZGxlcjtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgb3B0aW9uYWwsIGFkZGl0aW9uYWwsIHVzZXItZGVmaW5lZCBsb2cgaGFuZGxlciBmb3IgdGhlIExvZ2dlciBpbnN0YW5jZS5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl91c2VyTG9nSGFuZGxlciA9IG51bGw7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ2FwdHVyZSB0aGUgY3VycmVudCBpbnN0YW5jZSBmb3IgbGF0ZXIgdXNlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaW5zdGFuY2VzLnB1c2godGhpcyk7XHJcbiAgICB9XHJcbiAgICBnZXQgbG9nTGV2ZWwoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvZ0xldmVsO1xyXG4gICAgfVxyXG4gICAgc2V0IGxvZ0xldmVsKHZhbCkge1xyXG4gICAgICAgIGlmICghKHZhbCBpbiBMb2dMZXZlbCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCB2YWx1ZSBcIiR7dmFsfVwiIGFzc2lnbmVkIHRvIFxcYGxvZ0xldmVsXFxgYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2xvZ0xldmVsID0gdmFsO1xyXG4gICAgfVxyXG4gICAgLy8gV29ya2Fyb3VuZCBmb3Igc2V0dGVyL2dldHRlciBoYXZpbmcgdG8gYmUgdGhlIHNhbWUgdHlwZS5cclxuICAgIHNldExvZ0xldmVsKHZhbCkge1xyXG4gICAgICAgIHRoaXMuX2xvZ0xldmVsID0gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgPyBsZXZlbFN0cmluZ1RvRW51bVt2YWxdIDogdmFsO1xyXG4gICAgfVxyXG4gICAgZ2V0IGxvZ0hhbmRsZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvZ0hhbmRsZXI7XHJcbiAgICB9XHJcbiAgICBzZXQgbG9nSGFuZGxlcih2YWwpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHZhbCAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdWYWx1ZSBhc3NpZ25lZCB0byBgbG9nSGFuZGxlcmAgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2xvZ0hhbmRsZXIgPSB2YWw7XHJcbiAgICB9XHJcbiAgICBnZXQgdXNlckxvZ0hhbmRsZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJMb2dIYW5kbGVyO1xyXG4gICAgfVxyXG4gICAgc2V0IHVzZXJMb2dIYW5kbGVyKHZhbCkge1xyXG4gICAgICAgIHRoaXMuX3VzZXJMb2dIYW5kbGVyID0gdmFsO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZnVuY3Rpb25zIGJlbG93IGFyZSBhbGwgYmFzZWQgb24gdGhlIGBjb25zb2xlYCBpbnRlcmZhY2VcclxuICAgICAqL1xyXG4gICAgZGVidWcoLi4uYXJncykge1xyXG4gICAgICAgIHRoaXMuX3VzZXJMb2dIYW5kbGVyICYmIHRoaXMuX3VzZXJMb2dIYW5kbGVyKHRoaXMsIExvZ0xldmVsLkRFQlVHLCAuLi5hcmdzKTtcclxuICAgICAgICB0aGlzLl9sb2dIYW5kbGVyKHRoaXMsIExvZ0xldmVsLkRFQlVHLCAuLi5hcmdzKTtcclxuICAgIH1cclxuICAgIGxvZyguLi5hcmdzKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlckxvZ0hhbmRsZXIgJiZcclxuICAgICAgICAgICAgdGhpcy5fdXNlckxvZ0hhbmRsZXIodGhpcywgTG9nTGV2ZWwuVkVSQk9TRSwgLi4uYXJncyk7XHJcbiAgICAgICAgdGhpcy5fbG9nSGFuZGxlcih0aGlzLCBMb2dMZXZlbC5WRVJCT1NFLCAuLi5hcmdzKTtcclxuICAgIH1cclxuICAgIGluZm8oLi4uYXJncykge1xyXG4gICAgICAgIHRoaXMuX3VzZXJMb2dIYW5kbGVyICYmIHRoaXMuX3VzZXJMb2dIYW5kbGVyKHRoaXMsIExvZ0xldmVsLklORk8sIC4uLmFyZ3MpO1xyXG4gICAgICAgIHRoaXMuX2xvZ0hhbmRsZXIodGhpcywgTG9nTGV2ZWwuSU5GTywgLi4uYXJncyk7XHJcbiAgICB9XHJcbiAgICB3YXJuKC4uLmFyZ3MpIHtcclxuICAgICAgICB0aGlzLl91c2VyTG9nSGFuZGxlciAmJiB0aGlzLl91c2VyTG9nSGFuZGxlcih0aGlzLCBMb2dMZXZlbC5XQVJOLCAuLi5hcmdzKTtcclxuICAgICAgICB0aGlzLl9sb2dIYW5kbGVyKHRoaXMsIExvZ0xldmVsLldBUk4sIC4uLmFyZ3MpO1xyXG4gICAgfVxyXG4gICAgZXJyb3IoLi4uYXJncykge1xyXG4gICAgICAgIHRoaXMuX3VzZXJMb2dIYW5kbGVyICYmIHRoaXMuX3VzZXJMb2dIYW5kbGVyKHRoaXMsIExvZ0xldmVsLkVSUk9SLCAuLi5hcmdzKTtcclxuICAgICAgICB0aGlzLl9sb2dIYW5kbGVyKHRoaXMsIExvZ0xldmVsLkVSUk9SLCAuLi5hcmdzKTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBzZXRMb2dMZXZlbChsZXZlbCkge1xyXG4gICAgaW5zdGFuY2VzLmZvckVhY2goaW5zdCA9PiB7XHJcbiAgICAgICAgaW5zdC5zZXRMb2dMZXZlbChsZXZlbCk7XHJcbiAgICB9KTtcclxufVxyXG5mdW5jdGlvbiBzZXRVc2VyTG9nSGFuZGxlcihsb2dDYWxsYmFjaywgb3B0aW9ucykge1xyXG4gICAgZm9yIChjb25zdCBpbnN0YW5jZSBvZiBpbnN0YW5jZXMpIHtcclxuICAgICAgICBsZXQgY3VzdG9tTG9nTGV2ZWwgPSBudWxsO1xyXG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMubGV2ZWwpIHtcclxuICAgICAgICAgICAgY3VzdG9tTG9nTGV2ZWwgPSBsZXZlbFN0cmluZ1RvRW51bVtvcHRpb25zLmxldmVsXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGxvZ0NhbGxiYWNrID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGluc3RhbmNlLnVzZXJMb2dIYW5kbGVyID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGluc3RhbmNlLnVzZXJMb2dIYW5kbGVyID0gKGluc3RhbmNlLCBsZXZlbCwgLi4uYXJncykgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGFyZ3NcclxuICAgICAgICAgICAgICAgICAgICAubWFwKGFyZyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJnO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFyZy50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJnLm1lc3NhZ2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFyZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGlnbm9yZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGFyZyA9PiBhcmcpXHJcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oJyAnKTtcclxuICAgICAgICAgICAgICAgIGlmIChsZXZlbCA+PSAoY3VzdG9tTG9nTGV2ZWwgIT09IG51bGwgJiYgY3VzdG9tTG9nTGV2ZWwgIT09IHZvaWQgMCA/IGN1c3RvbUxvZ0xldmVsIDogaW5zdGFuY2UubG9nTGV2ZWwpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nQ2FsbGJhY2soe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogTG9nTGV2ZWxbbGV2ZWxdLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGluc3RhbmNlLm5hbWVcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgTG9nTGV2ZWwsIExvZ2dlciwgc2V0TG9nTGV2ZWwsIHNldFVzZXJMb2dIYW5kbGVyIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5lc20yMDE3LmpzLm1hcFxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHtcblx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuIGdsb2JhbFRoaXM7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7XG5cdH1cbn0pKCk7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9wcmVmZXItZGVmYXVsdC1leHBvcnQgKi9cbmltcG9ydCB7IGluaXRpYWxpemVBcHAgfSBmcm9tICdmaXJlYmFzZS9hcHAnO1xuaW1wb3J0IHsgZ2V0RmlyZXN0b3JlLCBkb2MgfSBmcm9tICdmaXJlYmFzZS9maXJlc3RvcmUnO1xuXG5jb25zdCBmaXJlYmFzZUNvbmZpZyA9IHtcbiAgYXBpS2V5OiAnQUl6YVN5Q1g5V1Itajl5djFnaVllRnNNcGJqajJHM3A3ak5IeElVJyxcbiAgYXV0aERvbWFpbjogJ2dzZS15ZWF0bWFubGFiLmZpcmViYXNlYXBwLmNvbScsXG4gIHByb2plY3RJZDogJ2dzZS15ZWF0bWFubGFiJyxcbiAgc3RvcmFnZUJ1Y2tldDogJ2dzZS15ZWF0bWFubGFiLmFwcHNwb3QuY29tJyxcbiAgbWVzc2FnaW5nU2VuZGVySWQ6ICcyOTIzMzEwMDA0MjYnLFxuICBhcHBJZDogJzE6MjkyMzMxMDAwNDI2OndlYjo5MWEwNDIyMDk5MWUzNDA1NzM3MDEzJyxcbiAgbWVhc3VyZW1lbnRJZDogJ0ctMFRCVE1EUzk5MycsXG59O1xuXG5jb25zdCBmaXJlYmFzZUFwcCA9IGluaXRpYWxpemVBcHAoZmlyZWJhc2VDb25maWcpO1xuY29uc3QgZGIgPSBnZXRGaXJlc3RvcmUoZmlyZWJhc2VBcHApO1xuZXhwb3J0IGNvbnN0IHJvb3REb2MgPSBkb2MoZGIsICdkZXYnLCAncmljaGZvcmQtMjAyMjAyMTcnKTtcbiJdLCJuYW1lcyI6WyJpbml0aWFsaXplQXBwIiwiZ2V0RmlyZXN0b3JlIiwiZG9jIiwiZmlyZWJhc2VDb25maWciLCJhcGlLZXkiLCJhdXRoRG9tYWluIiwicHJvamVjdElkIiwic3RvcmFnZUJ1Y2tldCIsIm1lc3NhZ2luZ1NlbmRlcklkIiwiYXBwSWQiLCJtZWFzdXJlbWVudElkIiwiZmlyZWJhc2VBcHAiLCJkYiIsInJvb3REb2MiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/index.bundle.js b/index.bundle.js deleted file mode 100644 index 1b69efc..0000000 --- a/index.bundle.js +++ /dev/null @@ -1,43988 +0,0 @@ -/******/ (() => { // webpackBootstrap -/******/ var __webpack_modules__ = ({ - -/***/ "./node_modules/@bdelab/roar-firekit/lib/auth.js": -/*!*******************************************************!*\ - !*** ./node_modules/@bdelab/roar-firekit/lib/auth.js ***! - \*******************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -"use strict"; - -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.firebaseSignOut = exports.firebaseSignIn = exports.roarPassword = exports.roarEmail = void 0; -var auth_1 = __webpack_require__(/*! firebase/auth */ "./node_modules/firebase/auth/dist/index.esm.js"); -var uuid_1 = __webpack_require__(/*! uuid */ "./node_modules/uuid/dist/esm-browser/index.js"); -/** - * Return a unique, reproducible, and disposable email address for the - * user. - * - * We create an email/password combination for each roar UID. This - * function uses dispostable.com to create a disposable email address for - * authentication. On dispostable.com, unread emails are deleted after 2 - * days and read messages are deleted after 2 months. These messages are - * viewable by anyone who knows the email address, so this email is not - * intended to receive secure messages. - * - * @function - * @param {string} roarUid - The ROAR user ID - * @returns {string} - The email address - */ -var roarEmail = function (roarUid) { - return "".concat(roarUid, "@dispostable.com"); -}; -exports.roarEmail = roarEmail; -var roarUuidv5Namespace = (0, uuid_1.v5)('https://reading.stanford.edu/', uuid_1.v5.URL); -/** - * Return a unique and reproducible password for the user. - * - * We create an email/password combination for each roar UID. This - * computed property returns a UUID V5 hash of the roar UID using the ROAR - * UUID namespace, which itself is a UUID V5 hash of the the - * https://reading.stanford.edu/ URL using the UUID V5 URL namespace. - * - * @function - * @param {string} roarUid - The ROAR user ID - * @returns {string} - The password - */ -var roarPassword = function (roarUid) { - return (0, uuid_1.v5)(roarUid, roarUuidv5Namespace).replace(/-/g, ''); -}; -exports.roarPassword = roarPassword; -var firebaseSignIn = function (roarUid) { return __awaiter(void 0, void 0, void 0, function () { - var auth, userCredential; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - auth = (0, auth_1.getAuth)(); - return [4 /*yield*/, (0, auth_1.createUserWithEmailAndPassword)(auth, (0, exports.roarEmail)(roarUid), (0, exports.roarPassword)(roarUid)).catch(function (error) { - if (error.code === 'auth/email-already-in-use') { - // console.log('Email already in use'); - return (0, auth_1.signInWithEmailAndPassword)(auth, (0, exports.roarEmail)(roarUid), (0, exports.roarPassword)(roarUid)); - } - else { - throw error; - } - })]; - case 1: - userCredential = _a.sent(); - // console.log(`Signed in as ${userCredential.user.email}`); - // console.log(`Firebase UID: ${userCredential.user.uid}`); - return [2 /*return*/, auth]; - } - }); -}); }; -exports.firebaseSignIn = firebaseSignIn; -var firebaseSignOut = function () { return __awaiter(void 0, void 0, void 0, function () { - var auth; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - auth = (0, auth_1.getAuth)(); - return [4 /*yield*/, (0, auth_1.signOut)(auth)]; - case 1: - _a.sent(); - return [2 /*return*/, auth]; - } - }); -}); }; -exports.firebaseSignOut = firebaseSignOut; - - -/***/ }), - -/***/ "./node_modules/@bdelab/roar-firekit/lib/firestore/firekit.js": -/*!********************************************************************!*\ - !*** ./node_modules/@bdelab/roar-firekit/lib/firestore/firekit.js ***! - \********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -"use strict"; - -var __assign = (this && this.__assign) || function () { - __assign = Object.assign || function(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); -}; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.RoarFirekit = void 0; -var user_1 = __webpack_require__(/*! ./user */ "./node_modules/@bdelab/roar-firekit/lib/firestore/user.js"); -var task_1 = __webpack_require__(/*! ./task */ "./node_modules/@bdelab/roar-firekit/lib/firestore/task.js"); -var run_1 = __webpack_require__(/*! ./run */ "./node_modules/@bdelab/roar-firekit/lib/firestore/run.js"); -var auth_1 = __webpack_require__(/*! ../auth */ "./node_modules/@bdelab/roar-firekit/lib/auth.js"); -/** - * The RoarFirekit class is the main entry point for the ROAR Firestore API. - * It represents multiple linked Firestore documents and provides methods - * for interacting with them. - */ -var RoarFirekit = /** @class */ (function () { - /** - * Create a RoarFirekit. This expects an object with keys `rootDoc`, - * `userInfo`, and `taskInfo`, where `rootDoc` is a [[DocumentReference | - * Firestore document reference]] pointing to the document under which all - * ROAR data will be stored, `userInfo` is a [[UserData]] object, and - * `taskInfo` is a [[TaskVariantInput]] object. - * @param {{rootDoc: DocumentReference, userInfo: UserData, taskInfo: TaskVariantInput}=} destructuredParam - * rootDoc: The Firestore root document reference - * userInfo: The user input object - * taskInfo: The task input object - */ - function RoarFirekit(_a) { - var rootDoc = _a.rootDoc, userInfo = _a.userInfo, taskInfo = _a.taskInfo; - this.rootDoc = rootDoc; - this.userInfo = userInfo; - this.taskInfo = taskInfo; - this.user = undefined; - this.task = undefined; - this.run = undefined; - } - /** - * Start the ROAR run. Push the task, user, and run info to Firestore - * Call this method before starting the jsPsych experiment. - * @method - * @async - */ - RoarFirekit.prototype.startRun = function () { - return __awaiter(this, void 0, void 0, function () { - var auth; - var _this = this; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, (0, auth_1.firebaseSignIn)(this.userInfo.id)]; - case 1: - auth = _a.sent(); - this.user = new user_1.RoarUser(__assign(__assign({}, this.userInfo), { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - firebaseUid: auth.currentUser.uid })); - this.user.setRefs(this.rootDoc); - this.task = new task_1.RoarTaskVariant(this.taskInfo); - this.task.setRefs(this.rootDoc); - this.run = new run_1.RoarRun({ user: this.user, task: this.task }); - return [2 /*return*/, (this.task - .toFirestore() - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - .then(function () { return _this.user.toFirestore(); }) - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - .then(function () { return _this.run.startRun(); }))]; - } - }); - }); - }; - /** - * Finish the ROAR run by marking it as finished in Firestore. - * Call this method after the jsPsych experiment finishes. For example: - * - * ```javascript - * jsPsych.init({ - * timeline: exp, - * on_finish: function(data) { - * firekit.finishRun(); - * } - * }); - * ``` - * @method - * @async - */ - RoarFirekit.prototype.finishRun = function () { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - if (this.run) { - return [2 /*return*/, this.run.finishRun().then(function () { return (0, auth_1.firebaseSignOut)(); })]; - } - else { - throw new Error('Run is undefined. Use the startRun method first.'); - } - return [2 /*return*/]; - }); - }); - }; - /** - * Add new trial data to this run on Firestore. - * - * This method can be added to individual jsPsych trials by calling it from - * the `on_finish` function, like so: - * - * ```javascript - * var trial = { - * type: 'image-keyboard-response', - * stimulus: 'imgA.png', - * on_finish: function(data) { - * firekit.addTrialData(data); - * } - * }; - * ``` - * - * Or you can call it from all trials in a jsPsych - * timeline by calling it from the `on_data_update` callback. In the latter - * case, you can avoid saving extraneous trials by conditionally calling - * this method based on the data. For example: - * - * ```javascript - * const timeline = [ - * // A fixation trial; don't save to Firestore - * { - * type: htmlKeyboardResponse, - * stimulus: '

+
', - * choices: "NO_KEYS", - * trial_duration: 500, - * }, - * // A stimulus and response trial; save to Firestore - * { - * type: imageKeyboardResponse, - * stimulus: 'imgA.png', - * data: { saveToFirestore: true }, - * } - * ] - * jsPsych.init({ - * timeline: timeline, - * on_data_update: function(data) { - * if (data.saveToFirestore) { - * firekit.addTrialData(data); - * } - * } - * }); - * ``` - * - * @method - * @async - * @param {*} trialData - An object containing trial data. - */ - RoarFirekit.prototype.writeTrial = function (trialData) { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - if (this.run) { - return [2 /*return*/, this.run.writeTrial(trialData)]; - } - else { - throw new Error('Run is undefined. Use the startRun method first.'); - } - return [2 /*return*/]; - }); - }); - }; - return RoarFirekit; -}()); -exports.RoarFirekit = RoarFirekit; - - -/***/ }), - -/***/ "./node_modules/@bdelab/roar-firekit/lib/firestore/run.js": -/*!****************************************************************!*\ - !*** ./node_modules/@bdelab/roar-firekit/lib/firestore/run.js ***! - \****************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -"use strict"; - -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.RoarRun = exports.convertTrialToFirestore = void 0; -var firestore_1 = __webpack_require__(/*! firebase/firestore */ "./node_modules/firebase/firestore/dist/index.esm.js"); -/** - * Convert a trial data to allow storage on Cloud Firestore. - * - * This function leaves all other trial data intact but converts - * any URL object to a string. - * - * @function - * @param {Object} trialData - Trial data to convert - * @returns {Object} Converted trial data - */ -var convertTrialToFirestore = function (trialData) { - return Object.fromEntries(Object.entries(trialData).map(function (_a) { - var key = _a[0], value = _a[1]; - if (value instanceof URL) { - return [key, value.toString()]; - } - else if (typeof value === 'object' && value !== null) { - return [key, (0, exports.convertTrialToFirestore)(value)]; - } - else { - return [key, value]; - } - })); -}; -exports.convertTrialToFirestore = convertTrialToFirestore; -/** - * Class representing a ROAR run. - * - * A run is a globally unique collection of successive trials that constitute - * one user "running" through a single task one time. - */ -var RoarRun = /** @class */ (function () { - /** Create a ROAR run - * @param {RoarUser} user - The user running the task - * @param {RoarTaskVariant} task - The task variant being run - */ - function RoarRun(_a) { - var user = _a.user, task = _a.task; - if (!(user.userCategory === 'student')) { - throw new Error('Only students can start a run.'); - } - this.user = user; - this.task = task; - if (this.user.userRef) { - this.runRef = (0, firestore_1.doc)((0, firestore_1.collection)(this.user.userRef, 'runs')); - } - else { - throw new Error('User refs not set. Please use the user.setRefs method first.'); - } - if (!this.task.taskRef) { - throw new Error('Task refs not set. Please use the task.setRefs method first.'); - } - this.started = false; - } - /** - * Create a new run on Firestore - * @method - * @async - */ - RoarRun.prototype.startRun = function () { - return __awaiter(this, void 0, void 0, function () { - var runData; - var _this = this; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - if (!!this.user.isPushedToFirestore) return [3 /*break*/, 2]; - return [4 /*yield*/, this.user.toFirestore()]; - case 1: - _a.sent(); - _a.label = 2; - case 2: - if (!(this.task.variantRef === undefined)) return [3 /*break*/, 4]; - return [4 /*yield*/, this.task.toFirestore()]; - case 3: - _a.sent(); - _a.label = 4; - case 4: - runData = { - districtId: this.user.districtId, - schoolId: this.user.schoolId, - classId: this.user.classId, - studyId: this.user.studyId, - taskId: this.task.taskId, - variantId: this.task.variantId, - taskRef: this.task.taskRef, - variantRef: this.task.variantRef, - completed: false, - timeStarted: (0, firestore_1.serverTimestamp)(), - timeFinished: null, - }; - return [4 /*yield*/, (0, firestore_1.setDoc)(this.runRef, runData) - .then(function () { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return (0, firestore_1.updateDoc)(_this.user.userRef, { - tasks: (0, firestore_1.arrayUnion)(_this.task.taskId), - variants: (0, firestore_1.arrayUnion)(_this.task.variantId), - taskRefs: (0, firestore_1.arrayUnion)(_this.task.taskRef), - variantRefs: (0, firestore_1.arrayUnion)(_this.task.variantRef), - }); - }) - .then(function () { return _this.user.updateFirestoreTimestamp(); })]; - case 5: - _a.sent(); - this.started = true; - return [2 /*return*/]; - } - }); - }); - }; - /** - * Mark this run as complete on Firestore - * @method - * @async - */ - RoarRun.prototype.finishRun = function () { - return __awaiter(this, void 0, void 0, function () { - var _this = this; - return __generator(this, function (_a) { - if (!this.started) { - throw new Error('Run has not been started yet. Use the startRun method first.'); - } - return [2 /*return*/, (0, firestore_1.updateDoc)(this.runRef, { - completed: true, - timeFinished: (0, firestore_1.serverTimestamp)(), - }).then(function () { - return _this.user.updateFirestoreTimestamp(); - })]; - }); - }); - }; - /** - * Add a new trial to this run on Firestore - * @method - * @async - * @param {*} trialData - An object containing trial data. - */ - RoarRun.prototype.writeTrial = function (trialData) { - return __awaiter(this, void 0, void 0, function () { - var trialRef; - var _this = this; - return __generator(this, function (_a) { - if (!this.started) { - throw new Error('Run has not been started yet. Use the startRun method first.'); - } - trialRef = (0, firestore_1.doc)((0, firestore_1.collection)(this.runRef, 'trials')); - return [2 /*return*/, (0, firestore_1.setDoc)(trialRef, (0, exports.convertTrialToFirestore)(trialData)).then(function () { - _this.user.updateFirestoreTimestamp(); - })]; - }); - }); - }; - return RoarRun; -}()); -exports.RoarRun = RoarRun; - - -/***/ }), - -/***/ "./node_modules/@bdelab/roar-firekit/lib/firestore/task.js": -/*!*****************************************************************!*\ - !*** ./node_modules/@bdelab/roar-firekit/lib/firestore/task.js ***! - \*****************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -"use strict"; - -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.RoarTaskVariant = void 0; -var firestore_1 = __webpack_require__(/*! firebase/firestore */ "./node_modules/firebase/firestore/dist/index.esm.js"); -var util_1 = __webpack_require__(/*! ./util */ "./node_modules/@bdelab/roar-firekit/lib/firestore/util.js"); -/** Class representing a ROAR task - * @param {string} taskId - The ID of the parent task. Should be a short initialism, e.g. "swr" or "srf" - * @param {string} taskName - The name of the parent task - * @param {string} taskDescription - The description of the task - * @param {string} variantName - The name of the task variant - * @param {string} variantDescription - The description of the variant - * @param {Array} blocks - The blocks of this task variant - */ -var RoarTaskVariant = /** @class */ (function () { - function RoarTaskVariant(_a) { - var taskId = _a.taskId, taskName = _a.taskName, variantName = _a.variantName, _b = _a.taskDescription, taskDescription = _b === void 0 ? null : _b, _c = _a.variantDescription, variantDescription = _c === void 0 ? null : _c, _d = _a.blocks, blocks = _d === void 0 ? [] : _d; - this.taskId = taskId; - this.taskName = taskName; - this.taskDescription = taskDescription; - this.variantName = variantName; - this.variantDescription = variantDescription; - this.blocks = blocks; - this.taskRef = undefined; - this.variantsCollectionRef = undefined; - this.variantId = undefined; - this.variantRef = undefined; - } - /** Set Firestore doc and collection references - * @param {DocumentReference} rootDoc - The root document reference - */ - RoarTaskVariant.prototype.setRefs = function (rootDoc) { - this.taskRef = (0, firestore_1.doc)(rootDoc, 'tasks', this.taskId); - this.variantsCollectionRef = (0, firestore_1.collection)(this.taskRef, 'variants'); - }; - /** Add a block to this experiment - * @method - * @param {number} blockNumber - The block index - * @param {string} trialMethod - The trial sampling method - * @param {string} corpus - The corpus from which stimuli are drawn - */ - RoarTaskVariant.prototype.addBlock = function (_a) { - var _b = _a.blockNumber, blockNumber = _b === void 0 ? 0 : _b, _c = _a.trialMethod, trialMethod = _c === void 0 ? 'practice' : _c, _d = _a.corpus, corpus = _d === void 0 ? 'practiceCorpusId' : _d; - this.blocks.push({ - blockNumber: blockNumber, - trialMethod: trialMethod, - corpus: corpus, - }); - }; - /** - * Push the trial and trial variant to Firestore - * @method - * @async - */ - RoarTaskVariant.prototype.toFirestore = function () { - return __awaiter(this, void 0, void 0, function () { - var taskData, emptyVariantRef, q, querySnapshot, variantData; - var _this = this; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - if (!(this.taskRef === undefined || this.variantsCollectionRef === undefined)) return [3 /*break*/, 1]; - throw new Error('Task refs not set. Please use the setRefs method first.'); - case 1: - taskData = { - id: this.taskId, - name: this.taskName, - description: this.taskDescription, - lastUpdated: (0, firestore_1.serverTimestamp)(), - }; - return [4 /*yield*/, (0, firestore_1.setDoc)(this.taskRef, taskData)]; - case 2: - _a.sent(); - emptyVariantRef = (0, firestore_1.doc)(this.taskRef, 'variants', 'empty'); - return [4 /*yield*/, (0, firestore_1.setDoc)(emptyVariantRef, { - name: 'empty', - blocksString: 'empty', - })]; - case 3: - _a.sent(); - q = (0, firestore_1.query)(this.variantsCollectionRef, (0, firestore_1.where)('name', '==', this.variantName), (0, firestore_1.where)('blocksString', '==', JSON.stringify(this.blocks)), (0, firestore_1.orderBy)('lastPlayed', 'desc'), (0, firestore_1.limit)(1)); - return [4 /*yield*/, (0, firestore_1.getDocs)(q)]; - case 4: - querySnapshot = _a.sent(); - // If so use the Firestore generated id for the variant and update timestamp. - querySnapshot.forEach(function (docRef) { - _this.variantId = docRef.id; - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - _this.variantRef = (0, firestore_1.doc)(_this.variantsCollectionRef, _this.variantId); - (0, firestore_1.updateDoc)(_this.variantRef, (0, util_1.removeNull)({ - description: _this.variantDescription, - lastPlayed: (0, firestore_1.serverTimestamp)(), - })); - }); - if (!(this.variantId === undefined)) return [3 /*break*/, 6]; - variantData = { - name: this.variantName, - description: this.variantDescription, - blocks: this.blocks, - blocksString: JSON.stringify(this.blocks), - lastPlayed: (0, firestore_1.serverTimestamp)(), - }; - this.variantRef = (0, firestore_1.doc)(this.variantsCollectionRef); - return [4 /*yield*/, (0, firestore_1.setDoc)(this.variantRef, variantData)]; - case 5: - _a.sent(); - this.variantId = this.variantRef.id; - _a.label = 6; - case 6: return [2 /*return*/]; - } - }); - }); - }; - return RoarTaskVariant; -}()); -exports.RoarTaskVariant = RoarTaskVariant; - - -/***/ }), - -/***/ "./node_modules/@bdelab/roar-firekit/lib/firestore/user.js": -/*!*****************************************************************!*\ - !*** ./node_modules/@bdelab/roar-firekit/lib/firestore/user.js ***! - \*****************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -"use strict"; - -var __assign = (this && this.__assign) || function () { - __assign = Object.assign || function(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); -}; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.RoarUser = void 0; -var firestore_1 = __webpack_require__(/*! firebase/firestore */ "./node_modules/firebase/firestore/dist/index.esm.js"); -var util_1 = __webpack_require__(/*! ./util */ "./node_modules/@bdelab/roar-firekit/lib/firestore/util.js"); -/** Class representing a ROAR user */ -var RoarUser = /** @class */ (function () { - function RoarUser(_a) { - var id = _a.id, firebaseUid = _a.firebaseUid, _b = _a.birthMonth, birthMonth = _b === void 0 ? null : _b, _c = _a.birthYear, birthYear = _c === void 0 ? null : _c, _d = _a.classId, classId = _d === void 0 ? null : _d, _e = _a.schoolId, schoolId = _e === void 0 ? null : _e, _f = _a.districtId, districtId = _f === void 0 ? null : _f, _g = _a.studyId, studyId = _g === void 0 ? null : _g, _h = _a.userCategory, userCategory = _h === void 0 ? 'student' : _h; - var allowedUserCategories = ['student', 'educator', 'researcher']; - if (!allowedUserCategories.includes(userCategory)) { - throw new Error("User category must be one of ".concat(allowedUserCategories.join(', '), ".")); - } - this.id = id; - this.firebaseUid = firebaseUid; - this.birthMonth = birthMonth; - this.birthYear = birthYear; - this.classId = classId; - this.schoolId = schoolId; - this.districtId = districtId; - this.studyId = studyId; - this.userCategory = userCategory; - this.userRef = undefined; - this.isPushedToFirestore = false; - } - /** Set Firestore doc references - * @param {DocumentReference} rootDoc - The root document reference - */ - RoarUser.prototype.setRefs = function (rootDoc) { - this.userRef = (0, firestore_1.doc)(rootDoc, 'users', this.id); - }; - /** - * Push the user to Firestore - * @method - * @async - */ - RoarUser.prototype.toFirestore = function () { - return __awaiter(this, void 0, void 0, function () { - var userData_1; - var _this = this; - return __generator(this, function (_a) { - if (this.userRef === undefined) { - throw new Error('User refs not set. Please use the setRefs method first.'); - } - else { - userData_1 = { - id: this.id, - firebaseUid: this.firebaseUid, - birthMonth: this.birthMonth, - birthYear: this.birthYear, - classId: this.classId, - schoolId: this.schoolId, - districtId: this.districtId, - studyId: this.studyId, - userCategory: this.userCategory, - lastUpdated: (0, firestore_1.serverTimestamp)(), - }; - // If the study, district, school, or class is provided, also add it to the - // list of all studies, districts, schools, or classes. - // Likewise for task and variant. - if (this.studyId) - userData_1.studies = (0, firestore_1.arrayUnion)(this.studyId); - if (this.districtId) - userData_1.districts = (0, firestore_1.arrayUnion)(this.districtId); - if (this.schoolId) - userData_1.schools = (0, firestore_1.arrayUnion)(this.schoolId); - if (this.classId) - userData_1.classes = (0, firestore_1.arrayUnion)(this.classId); - return [2 /*return*/, (0, firestore_1.updateDoc)(this.userRef, (0, util_1.removeNull)(userData_1)) - .catch(function (error) { - var errorCode = error.code; - if (errorCode === 'permission-denied') { - // The ROAR Firestore rules are written such that if we get here, the - // user does not currently exist in Firestore. So create them. - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return (0, firestore_1.setDoc)(_this.userRef, __assign(__assign({}, userData_1), { createdAt: (0, firestore_1.serverTimestamp)() })); - } - else { - throw error; - } - }) - .then(function () { - _this.isPushedToFirestore = true; - })]; - } - return [2 /*return*/]; - }); - }); - }; - /** - * Update the user's "lastUpdated" timestamp - * @method - * @async - */ - RoarUser.prototype.updateFirestoreTimestamp = function () { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - if (this.userRef === undefined) { - throw new Error('User refs not set. Please use the setRefs method first.'); - } - else { - (0, firestore_1.updateDoc)(this.userRef, { - lastUpdated: (0, firestore_1.serverTimestamp)(), - }); - } - return [2 /*return*/]; - }); - }); - }; - return RoarUser; -}()); -exports.RoarUser = RoarUser; - - -/***/ }), - -/***/ "./node_modules/@bdelab/roar-firekit/lib/firestore/util.js": -/*!*****************************************************************!*\ - !*** ./node_modules/@bdelab/roar-firekit/lib/firestore/util.js ***! - \*****************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.removeNull = void 0; -/** Remove null attributes from an object - * @function - * @param {Object} obj - Object to remove null attributes from - * @returns {Object} Object with null attributes removed - */ -var removeNull = function (obj) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - return Object.fromEntries(Object.entries(obj).filter(function (_a) { - var _ = _a[0], v = _a[1]; - return v != null; - })); -}; -exports.removeNull = removeNull; - - -/***/ }), - -/***/ "./node_modules/@bdelab/roar-firekit/lib/index.js": -/*!********************************************************!*\ - !*** ./node_modules/@bdelab/roar-firekit/lib/index.js ***! - \********************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.RoarFirekit = void 0; -var firekit_1 = __webpack_require__(/*! ./firestore/firekit */ "./node_modules/@bdelab/roar-firekit/lib/firestore/firekit.js"); -Object.defineProperty(exports, "RoarFirekit", ({ enumerable: true, get: function () { return firekit_1.RoarFirekit; } })); - - -/***/ }), - -/***/ "./node_modules/@firebase/auth/dist/esm2017/index-f69a28d8.js": -/*!********************************************************************!*\ - !*** ./node_modules/@firebase/auth/dist/esm2017/index-f69a28d8.js ***! - \********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "$": () => (/* binding */ sendPasswordResetEmail), -/* harmony export */ "A": () => (/* binding */ ActionCodeOperation), -/* harmony export */ "B": () => (/* binding */ prodErrorMap), -/* harmony export */ "C": () => (/* binding */ AUTH_ERROR_CODES_MAP_DO_NOT_USE_INTERNALLY), -/* harmony export */ "D": () => (/* binding */ initializeAuth), -/* harmony export */ "E": () => (/* binding */ connectAuthEmulator), -/* harmony export */ "F": () => (/* binding */ FactorId), -/* harmony export */ "G": () => (/* binding */ AuthCredential), -/* harmony export */ "H": () => (/* binding */ EmailAuthCredential), -/* harmony export */ "I": () => (/* binding */ OAuthCredential), -/* harmony export */ "J": () => (/* binding */ PhoneAuthCredential), -/* harmony export */ "K": () => (/* binding */ inMemoryPersistence), -/* harmony export */ "L": () => (/* binding */ EmailAuthProvider), -/* harmony export */ "M": () => (/* binding */ FacebookAuthProvider), -/* harmony export */ "N": () => (/* binding */ GoogleAuthProvider), -/* harmony export */ "O": () => (/* binding */ OperationType), -/* harmony export */ "P": () => (/* binding */ PhoneAuthProvider), -/* harmony export */ "Q": () => (/* binding */ GithubAuthProvider), -/* harmony export */ "R": () => (/* binding */ RecaptchaVerifier), -/* harmony export */ "S": () => (/* binding */ SignInMethod), -/* harmony export */ "T": () => (/* binding */ OAuthProvider), -/* harmony export */ "U": () => (/* binding */ SAMLAuthProvider), -/* harmony export */ "V": () => (/* binding */ TwitterAuthProvider), -/* harmony export */ "W": () => (/* binding */ signInAnonymously), -/* harmony export */ "X": () => (/* binding */ signInWithCredential), -/* harmony export */ "Y": () => (/* binding */ linkWithCredential), -/* harmony export */ "Z": () => (/* binding */ reauthenticateWithCredential), -/* harmony export */ "_": () => (/* binding */ signInWithCustomToken), -/* harmony export */ "a": () => (/* binding */ browserSessionPersistence), -/* harmony export */ "a0": () => (/* binding */ confirmPasswordReset), -/* harmony export */ "a1": () => (/* binding */ applyActionCode), -/* harmony export */ "a2": () => (/* binding */ checkActionCode), -/* harmony export */ "a3": () => (/* binding */ verifyPasswordResetCode), -/* harmony export */ "a4": () => (/* binding */ createUserWithEmailAndPassword), -/* harmony export */ "a5": () => (/* binding */ signInWithEmailAndPassword), -/* harmony export */ "a6": () => (/* binding */ sendSignInLinkToEmail), -/* harmony export */ "a7": () => (/* binding */ isSignInWithEmailLink), -/* harmony export */ "a8": () => (/* binding */ signInWithEmailLink), -/* harmony export */ "a9": () => (/* binding */ fetchSignInMethodsForEmail), -/* harmony export */ "aA": () => (/* binding */ _getRedirectResult), -/* harmony export */ "aB": () => (/* binding */ _clearRedirectOutcomes), -/* harmony export */ "aC": () => (/* binding */ _castAuth), -/* harmony export */ "aD": () => (/* binding */ UserImpl), -/* harmony export */ "aE": () => (/* binding */ AuthImpl), -/* harmony export */ "aF": () => (/* binding */ _getClientVersion), -/* harmony export */ "aG": () => (/* binding */ _generateEventId), -/* harmony export */ "aH": () => (/* binding */ AuthPopup), -/* harmony export */ "aI": () => (/* binding */ FetchProvider), -/* harmony export */ "aJ": () => (/* binding */ SAMLAuthCredential), -/* harmony export */ "aa": () => (/* binding */ sendEmailVerification), -/* harmony export */ "ab": () => (/* binding */ verifyBeforeUpdateEmail), -/* harmony export */ "ac": () => (/* binding */ ActionCodeURL), -/* harmony export */ "ad": () => (/* binding */ parseActionCodeURL), -/* harmony export */ "ae": () => (/* binding */ updateProfile), -/* harmony export */ "af": () => (/* binding */ updateEmail), -/* harmony export */ "ag": () => (/* binding */ updatePassword), -/* harmony export */ "ah": () => (/* binding */ getIdToken), -/* harmony export */ "ai": () => (/* binding */ getIdTokenResult), -/* harmony export */ "aj": () => (/* binding */ unlink), -/* harmony export */ "ak": () => (/* binding */ getAdditionalUserInfo), -/* harmony export */ "al": () => (/* binding */ reload), -/* harmony export */ "am": () => (/* binding */ getMultiFactorResolver), -/* harmony export */ "an": () => (/* binding */ multiFactor), -/* harmony export */ "ao": () => (/* binding */ _isIOS7Or8), -/* harmony export */ "ap": () => (/* binding */ debugAssert), -/* harmony export */ "aq": () => (/* binding */ _isIOS), -/* harmony export */ "ar": () => (/* binding */ _isAndroid), -/* harmony export */ "as": () => (/* binding */ _fail), -/* harmony export */ "at": () => (/* binding */ _getRedirectUrl), -/* harmony export */ "au": () => (/* binding */ _getProjectConfig), -/* harmony export */ "av": () => (/* binding */ _createError), -/* harmony export */ "aw": () => (/* binding */ _assert), -/* harmony export */ "ax": () => (/* binding */ _getInstance), -/* harmony export */ "ay": () => (/* binding */ _persistenceKeyName), -/* harmony export */ "az": () => (/* binding */ AuthEventManager), -/* harmony export */ "b": () => (/* binding */ browserLocalPersistence), -/* harmony export */ "c": () => (/* binding */ signInWithPopup), -/* harmony export */ "d": () => (/* binding */ linkWithPopup), -/* harmony export */ "e": () => (/* binding */ reauthenticateWithPopup), -/* harmony export */ "f": () => (/* binding */ signInWithRedirect), -/* harmony export */ "g": () => (/* binding */ linkWithRedirect), -/* harmony export */ "h": () => (/* binding */ reauthenticateWithRedirect), -/* harmony export */ "i": () => (/* binding */ indexedDBLocalPersistence), -/* harmony export */ "j": () => (/* binding */ getRedirectResult), -/* harmony export */ "k": () => (/* binding */ browserPopupRedirectResolver), -/* harmony export */ "l": () => (/* binding */ linkWithPhoneNumber), -/* harmony export */ "m": () => (/* binding */ PhoneMultiFactorGenerator), -/* harmony export */ "n": () => (/* binding */ getAuth), -/* harmony export */ "o": () => (/* binding */ ProviderId), -/* harmony export */ "p": () => (/* binding */ setPersistence), -/* harmony export */ "q": () => (/* binding */ onIdTokenChanged), -/* harmony export */ "r": () => (/* binding */ reauthenticateWithPhoneNumber), -/* harmony export */ "s": () => (/* binding */ signInWithPhoneNumber), -/* harmony export */ "t": () => (/* binding */ onAuthStateChanged), -/* harmony export */ "u": () => (/* binding */ updatePhoneNumber), -/* harmony export */ "v": () => (/* binding */ useDeviceLanguage), -/* harmony export */ "w": () => (/* binding */ updateCurrentUser), -/* harmony export */ "x": () => (/* binding */ signOut), -/* harmony export */ "y": () => (/* binding */ deleteUser), -/* harmony export */ "z": () => (/* binding */ debugErrorMap) -/* harmony export */ }); -/* harmony import */ var _firebase_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @firebase/util */ "./node_modules/@firebase/util/dist/index.esm2017.js"); -/* harmony import */ var _firebase_app__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @firebase/app */ "./node_modules/@firebase/app/dist/esm/index.esm2017.js"); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js"); -/* harmony import */ var _firebase_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @firebase/logger */ "./node_modules/@firebase/logger/dist/esm/index.esm2017.js"); -/* harmony import */ var _firebase_component__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @firebase/component */ "./node_modules/@firebase/component/dist/esm/index.esm2017.js"); - - - - - - -/** - * @license - * Copyright 2021 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * An enum of factors that may be used for multifactor authentication. - * - * @public - */ -const FactorId = { - /** Phone as second factor */ - PHONE: 'phone' -}; -/** - * Enumeration of supported providers. - * - * @public - */ -const ProviderId = { - /** Facebook provider ID */ - FACEBOOK: 'facebook.com', - /** GitHub provider ID */ - GITHUB: 'github.com', - /** Google provider ID */ - GOOGLE: 'google.com', - /** Password provider */ - PASSWORD: 'password', - /** Phone provider */ - PHONE: 'phone', - /** Twitter provider ID */ - TWITTER: 'twitter.com' -}; -/** - * Enumeration of supported sign-in methods. - * - * @public - */ -const SignInMethod = { - /** Email link sign in method */ - EMAIL_LINK: 'emailLink', - /** Email/password sign in method */ - EMAIL_PASSWORD: 'password', - /** Facebook sign in method */ - FACEBOOK: 'facebook.com', - /** GitHub sign in method */ - GITHUB: 'github.com', - /** Google sign in method */ - GOOGLE: 'google.com', - /** Phone sign in method */ - PHONE: 'phone', - /** Twitter sign in method */ - TWITTER: 'twitter.com' -}; -/** - * Enumeration of supported operation types. - * - * @public - */ -const OperationType = { - /** Operation involving linking an additional provider to an already signed-in user. */ - LINK: 'link', - /** Operation involving using a provider to reauthenticate an already signed-in user. */ - REAUTHENTICATE: 'reauthenticate', - /** Operation involving signing in a user. */ - SIGN_IN: 'signIn' -}; -/** - * An enumeration of the possible email action types. - * - * @public - */ -const ActionCodeOperation = { - /** The email link sign-in action. */ - EMAIL_SIGNIN: 'EMAIL_SIGNIN', - /** The password reset action. */ - PASSWORD_RESET: 'PASSWORD_RESET', - /** The email revocation action. */ - RECOVER_EMAIL: 'RECOVER_EMAIL', - /** The revert second factor addition email action. */ - REVERT_SECOND_FACTOR_ADDITION: 'REVERT_SECOND_FACTOR_ADDITION', - /** The revert second factor addition email action. */ - VERIFY_AND_CHANGE_EMAIL: 'VERIFY_AND_CHANGE_EMAIL', - /** The email verification action. */ - VERIFY_EMAIL: 'VERIFY_EMAIL' -}; - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function _debugErrorMap() { - return { - ["admin-restricted-operation" /* ADMIN_ONLY_OPERATION */]: 'This operation is restricted to administrators only.', - ["argument-error" /* ARGUMENT_ERROR */]: '', - ["app-not-authorized" /* APP_NOT_AUTHORIZED */]: "This app, identified by the domain where it's hosted, is not " + - 'authorized to use Firebase Authentication with the provided API key. ' + - 'Review your key configuration in the Google API console.', - ["app-not-installed" /* APP_NOT_INSTALLED */]: 'The requested mobile application corresponding to the identifier (' + - 'Android package name or iOS bundle ID) provided is not installed on ' + - 'this device.', - ["captcha-check-failed" /* CAPTCHA_CHECK_FAILED */]: 'The reCAPTCHA response token provided is either invalid, expired, ' + - 'already used or the domain associated with it does not match the list ' + - 'of whitelisted domains.', - ["code-expired" /* CODE_EXPIRED */]: 'The SMS code has expired. Please re-send the verification code to try ' + - 'again.', - ["cordova-not-ready" /* CORDOVA_NOT_READY */]: 'Cordova framework is not ready.', - ["cors-unsupported" /* CORS_UNSUPPORTED */]: 'This browser is not supported.', - ["credential-already-in-use" /* CREDENTIAL_ALREADY_IN_USE */]: 'This credential is already associated with a different user account.', - ["custom-token-mismatch" /* CREDENTIAL_MISMATCH */]: 'The custom token corresponds to a different audience.', - ["requires-recent-login" /* CREDENTIAL_TOO_OLD_LOGIN_AGAIN */]: 'This operation is sensitive and requires recent authentication. Log in ' + - 'again before retrying this request.', - ["dependent-sdk-initialized-before-auth" /* DEPENDENT_SDK_INIT_BEFORE_AUTH */]: 'Another Firebase SDK was initialized and is trying to use Auth before Auth is ' + - 'initialized. Please be sure to call `initializeAuth` or `getAuth` before ' + - 'starting any other Firebase SDK.', - ["dynamic-link-not-activated" /* DYNAMIC_LINK_NOT_ACTIVATED */]: 'Please activate Dynamic Links in the Firebase Console and agree to the terms and ' + - 'conditions.', - ["email-change-needs-verification" /* EMAIL_CHANGE_NEEDS_VERIFICATION */]: 'Multi-factor users must always have a verified email.', - ["email-already-in-use" /* EMAIL_EXISTS */]: 'The email address is already in use by another account.', - ["emulator-config-failed" /* EMULATOR_CONFIG_FAILED */]: 'Auth instance has already been used to make a network call. Auth can ' + - 'no longer be configured to use the emulator. Try calling ' + - '"connectAuthEmulator()" sooner.', - ["expired-action-code" /* EXPIRED_OOB_CODE */]: 'The action code has expired.', - ["cancelled-popup-request" /* EXPIRED_POPUP_REQUEST */]: 'This operation has been cancelled due to another conflicting popup being opened.', - ["internal-error" /* INTERNAL_ERROR */]: 'An internal AuthError has occurred.', - ["invalid-app-credential" /* INVALID_APP_CREDENTIAL */]: 'The phone verification request contains an invalid application verifier.' + - ' The reCAPTCHA token response is either invalid or expired.', - ["invalid-app-id" /* INVALID_APP_ID */]: 'The mobile app identifier is not registed for the current project.', - ["invalid-user-token" /* INVALID_AUTH */]: "This user's credential isn't valid for this project. This can happen " + - "if the user's token has been tampered with, or if the user isn't for " + - 'the project associated with this API key.', - ["invalid-auth-event" /* INVALID_AUTH_EVENT */]: 'An internal AuthError has occurred.', - ["invalid-verification-code" /* INVALID_CODE */]: 'The SMS verification code used to create the phone auth credential is ' + - 'invalid. Please resend the verification code sms and be sure to use the ' + - 'verification code provided by the user.', - ["invalid-continue-uri" /* INVALID_CONTINUE_URI */]: 'The continue URL provided in the request is invalid.', - ["invalid-cordova-configuration" /* INVALID_CORDOVA_CONFIGURATION */]: 'The following Cordova plugins must be installed to enable OAuth sign-in: ' + - 'cordova-plugin-buildinfo, cordova-universal-links-plugin, ' + - 'cordova-plugin-browsertab, cordova-plugin-inappbrowser and ' + - 'cordova-plugin-customurlscheme.', - ["invalid-custom-token" /* INVALID_CUSTOM_TOKEN */]: 'The custom token format is incorrect. Please check the documentation.', - ["invalid-dynamic-link-domain" /* INVALID_DYNAMIC_LINK_DOMAIN */]: 'The provided dynamic link domain is not configured or authorized for the current project.', - ["invalid-email" /* INVALID_EMAIL */]: 'The email address is badly formatted.', - ["invalid-emulator-scheme" /* INVALID_EMULATOR_SCHEME */]: 'Emulator URL must start with a valid scheme (http:// or https://).', - ["invalid-api-key" /* INVALID_API_KEY */]: 'Your API key is invalid, please check you have copied it correctly.', - ["invalid-cert-hash" /* INVALID_CERT_HASH */]: 'The SHA-1 certificate hash provided is invalid.', - ["invalid-credential" /* INVALID_IDP_RESPONSE */]: 'The supplied auth credential is malformed or has expired.', - ["invalid-message-payload" /* INVALID_MESSAGE_PAYLOAD */]: 'The email template corresponding to this action contains invalid characters in its message. ' + - 'Please fix by going to the Auth email templates section in the Firebase Console.', - ["invalid-multi-factor-session" /* INVALID_MFA_SESSION */]: 'The request does not contain a valid proof of first factor successful sign-in.', - ["invalid-oauth-provider" /* INVALID_OAUTH_PROVIDER */]: 'EmailAuthProvider is not supported for this operation. This operation ' + - 'only supports OAuth providers.', - ["invalid-oauth-client-id" /* INVALID_OAUTH_CLIENT_ID */]: 'The OAuth client ID provided is either invalid or does not match the ' + - 'specified API key.', - ["unauthorized-domain" /* INVALID_ORIGIN */]: 'This domain is not authorized for OAuth operations for your Firebase ' + - 'project. Edit the list of authorized domains from the Firebase console.', - ["invalid-action-code" /* INVALID_OOB_CODE */]: 'The action code is invalid. This can happen if the code is malformed, ' + - 'expired, or has already been used.', - ["wrong-password" /* INVALID_PASSWORD */]: 'The password is invalid or the user does not have a password.', - ["invalid-persistence-type" /* INVALID_PERSISTENCE */]: 'The specified persistence type is invalid. It can only be local, session or none.', - ["invalid-phone-number" /* INVALID_PHONE_NUMBER */]: 'The format of the phone number provided is incorrect. Please enter the ' + - 'phone number in a format that can be parsed into E.164 format. E.164 ' + - 'phone numbers are written in the format [+][country code][subscriber ' + - 'number including area code].', - ["invalid-provider-id" /* INVALID_PROVIDER_ID */]: 'The specified provider ID is invalid.', - ["invalid-recipient-email" /* INVALID_RECIPIENT_EMAIL */]: 'The email corresponding to this action failed to send as the provided ' + - 'recipient email address is invalid.', - ["invalid-sender" /* INVALID_SENDER */]: 'The email template corresponding to this action contains an invalid sender email or name. ' + - 'Please fix by going to the Auth email templates section in the Firebase Console.', - ["invalid-verification-id" /* INVALID_SESSION_INFO */]: 'The verification ID used to create the phone auth credential is invalid.', - ["invalid-tenant-id" /* INVALID_TENANT_ID */]: "The Auth instance's tenant ID is invalid.", - ["missing-android-pkg-name" /* MISSING_ANDROID_PACKAGE_NAME */]: 'An Android Package Name must be provided if the Android App is required to be installed.', - ["auth-domain-config-required" /* MISSING_AUTH_DOMAIN */]: 'Be sure to include authDomain when calling firebase.initializeApp(), ' + - 'by following the instructions in the Firebase console.', - ["missing-app-credential" /* MISSING_APP_CREDENTIAL */]: 'The phone verification request is missing an application verifier ' + - 'assertion. A reCAPTCHA response token needs to be provided.', - ["missing-verification-code" /* MISSING_CODE */]: 'The phone auth credential was created with an empty SMS verification code.', - ["missing-continue-uri" /* MISSING_CONTINUE_URI */]: 'A continue URL must be provided in the request.', - ["missing-iframe-start" /* MISSING_IFRAME_START */]: 'An internal AuthError has occurred.', - ["missing-ios-bundle-id" /* MISSING_IOS_BUNDLE_ID */]: 'An iOS Bundle ID must be provided if an App Store ID is provided.', - ["missing-or-invalid-nonce" /* MISSING_OR_INVALID_NONCE */]: 'The request does not contain a valid nonce. This can occur if the ' + - 'SHA-256 hash of the provided raw nonce does not match the hashed nonce ' + - 'in the ID token payload.', - ["missing-multi-factor-info" /* MISSING_MFA_INFO */]: 'No second factor identifier is provided.', - ["missing-multi-factor-session" /* MISSING_MFA_SESSION */]: 'The request is missing proof of first factor successful sign-in.', - ["missing-phone-number" /* MISSING_PHONE_NUMBER */]: 'To send verification codes, provide a phone number for the recipient.', - ["missing-verification-id" /* MISSING_SESSION_INFO */]: 'The phone auth credential was created with an empty verification ID.', - ["app-deleted" /* MODULE_DESTROYED */]: 'This instance of FirebaseApp has been deleted.', - ["multi-factor-info-not-found" /* MFA_INFO_NOT_FOUND */]: 'The user does not have a second factor matching the identifier provided.', - ["multi-factor-auth-required" /* MFA_REQUIRED */]: 'Proof of ownership of a second factor is required to complete sign-in.', - ["account-exists-with-different-credential" /* NEED_CONFIRMATION */]: 'An account already exists with the same email address but different ' + - 'sign-in credentials. Sign in using a provider associated with this ' + - 'email address.', - ["network-request-failed" /* NETWORK_REQUEST_FAILED */]: 'A network AuthError (such as timeout, interrupted connection or unreachable host) has occurred.', - ["no-auth-event" /* NO_AUTH_EVENT */]: 'An internal AuthError has occurred.', - ["no-such-provider" /* NO_SUCH_PROVIDER */]: 'User was not linked to an account with the given provider.', - ["null-user" /* NULL_USER */]: 'A null user object was provided as the argument for an operation which ' + - 'requires a non-null user object.', - ["operation-not-allowed" /* OPERATION_NOT_ALLOWED */]: 'The given sign-in provider is disabled for this Firebase project. ' + - 'Enable it in the Firebase console, under the sign-in method tab of the ' + - 'Auth section.', - ["operation-not-supported-in-this-environment" /* OPERATION_NOT_SUPPORTED */]: 'This operation is not supported in the environment this application is ' + - 'running on. "location.protocol" must be http, https or chrome-extension' + - ' and web storage must be enabled.', - ["popup-blocked" /* POPUP_BLOCKED */]: 'Unable to establish a connection with the popup. It may have been blocked by the browser.', - ["popup-closed-by-user" /* POPUP_CLOSED_BY_USER */]: 'The popup has been closed by the user before finalizing the operation.', - ["provider-already-linked" /* PROVIDER_ALREADY_LINKED */]: 'User can only be linked to one identity for the given provider.', - ["quota-exceeded" /* QUOTA_EXCEEDED */]: "The project's quota for this operation has been exceeded.", - ["redirect-cancelled-by-user" /* REDIRECT_CANCELLED_BY_USER */]: 'The redirect operation has been cancelled by the user before finalizing.', - ["redirect-operation-pending" /* REDIRECT_OPERATION_PENDING */]: 'A redirect sign-in operation is already pending.', - ["rejected-credential" /* REJECTED_CREDENTIAL */]: 'The request contains malformed or mismatching credentials.', - ["second-factor-already-in-use" /* SECOND_FACTOR_ALREADY_ENROLLED */]: 'The second factor is already enrolled on this account.', - ["maximum-second-factor-count-exceeded" /* SECOND_FACTOR_LIMIT_EXCEEDED */]: 'The maximum allowed number of second factors on a user has been exceeded.', - ["tenant-id-mismatch" /* TENANT_ID_MISMATCH */]: "The provided tenant ID does not match the Auth instance's tenant ID", - ["timeout" /* TIMEOUT */]: 'The operation has timed out.', - ["user-token-expired" /* TOKEN_EXPIRED */]: "The user's credential is no longer valid. The user must sign in again.", - ["too-many-requests" /* TOO_MANY_ATTEMPTS_TRY_LATER */]: 'We have blocked all requests from this device due to unusual activity. ' + - 'Try again later.', - ["unauthorized-continue-uri" /* UNAUTHORIZED_DOMAIN */]: 'The domain of the continue URL is not whitelisted. Please whitelist ' + - 'the domain in the Firebase console.', - ["unsupported-first-factor" /* UNSUPPORTED_FIRST_FACTOR */]: 'Enrolling a second factor or signing in with a multi-factor account requires sign-in with a supported first factor.', - ["unsupported-persistence-type" /* UNSUPPORTED_PERSISTENCE */]: 'The current environment does not support the specified persistence type.', - ["unsupported-tenant-operation" /* UNSUPPORTED_TENANT_OPERATION */]: 'This operation is not supported in a multi-tenant context.', - ["unverified-email" /* UNVERIFIED_EMAIL */]: 'The operation requires a verified email.', - ["user-cancelled" /* USER_CANCELLED */]: 'The user did not grant your application the permissions it requested.', - ["user-not-found" /* USER_DELETED */]: 'There is no user record corresponding to this identifier. The user may ' + - 'have been deleted.', - ["user-disabled" /* USER_DISABLED */]: 'The user account has been disabled by an administrator.', - ["user-mismatch" /* USER_MISMATCH */]: 'The supplied credentials do not correspond to the previously signed in user.', - ["user-signed-out" /* USER_SIGNED_OUT */]: '', - ["weak-password" /* WEAK_PASSWORD */]: 'The password must be 6 characters long or more.', - ["web-storage-unsupported" /* WEB_STORAGE_UNSUPPORTED */]: 'This browser is not supported or 3rd party cookies and data may be disabled.', - ["already-initialized" /* ALREADY_INITIALIZED */]: 'initializeAuth() has already been called with ' + - 'different options. To avoid this error, call initializeAuth() with the ' + - 'same options as when it was originally called, or call getAuth() to return the' + - ' already initialized instance.' - }; -} -function _prodErrorMap() { - // We will include this one message in the prod error map since by the very - // nature of this error, developers will never be able to see the message - // using the debugErrorMap (which is installed during auth initialization). - return { - ["dependent-sdk-initialized-before-auth" /* DEPENDENT_SDK_INIT_BEFORE_AUTH */]: 'Another Firebase SDK was initialized and is trying to use Auth before Auth is ' + - 'initialized. Please be sure to call `initializeAuth` or `getAuth` before ' + - 'starting any other Firebase SDK.' - }; -} -/** - * A verbose error map with detailed descriptions for most error codes. - * - * See discussion at {@link AuthErrorMap} - * - * @public - */ -const debugErrorMap = _debugErrorMap; -/** - * A minimal error map with all verbose error messages stripped. - * - * See discussion at {@link AuthErrorMap} - * - * @public - */ -const prodErrorMap = _prodErrorMap; -const _DEFAULT_AUTH_ERROR_FACTORY = new _firebase_util__WEBPACK_IMPORTED_MODULE_0__.ErrorFactory('auth', 'Firebase', _prodErrorMap()); -/** - * A map of potential `Auth` error codes, for easier comparison with errors - * thrown by the SDK. - * - * @remarks - * Note that you can't tree-shake individual keys - * in the map, so by using the map you might substantially increase your - * bundle size. - * - * @public - */ -const AUTH_ERROR_CODES_MAP_DO_NOT_USE_INTERNALLY = { - ADMIN_ONLY_OPERATION: 'auth/admin-restricted-operation', - ARGUMENT_ERROR: 'auth/argument-error', - APP_NOT_AUTHORIZED: 'auth/app-not-authorized', - APP_NOT_INSTALLED: 'auth/app-not-installed', - CAPTCHA_CHECK_FAILED: 'auth/captcha-check-failed', - CODE_EXPIRED: 'auth/code-expired', - CORDOVA_NOT_READY: 'auth/cordova-not-ready', - CORS_UNSUPPORTED: 'auth/cors-unsupported', - CREDENTIAL_ALREADY_IN_USE: 'auth/credential-already-in-use', - CREDENTIAL_MISMATCH: 'auth/custom-token-mismatch', - CREDENTIAL_TOO_OLD_LOGIN_AGAIN: 'auth/requires-recent-login', - DEPENDENT_SDK_INIT_BEFORE_AUTH: 'auth/dependent-sdk-initialized-before-auth', - DYNAMIC_LINK_NOT_ACTIVATED: 'auth/dynamic-link-not-activated', - EMAIL_CHANGE_NEEDS_VERIFICATION: 'auth/email-change-needs-verification', - EMAIL_EXISTS: 'auth/email-already-in-use', - EMULATOR_CONFIG_FAILED: 'auth/emulator-config-failed', - EXPIRED_OOB_CODE: 'auth/expired-action-code', - EXPIRED_POPUP_REQUEST: 'auth/cancelled-popup-request', - INTERNAL_ERROR: 'auth/internal-error', - INVALID_API_KEY: 'auth/invalid-api-key', - INVALID_APP_CREDENTIAL: 'auth/invalid-app-credential', - INVALID_APP_ID: 'auth/invalid-app-id', - INVALID_AUTH: 'auth/invalid-user-token', - INVALID_AUTH_EVENT: 'auth/invalid-auth-event', - INVALID_CERT_HASH: 'auth/invalid-cert-hash', - INVALID_CODE: 'auth/invalid-verification-code', - INVALID_CONTINUE_URI: 'auth/invalid-continue-uri', - INVALID_CORDOVA_CONFIGURATION: 'auth/invalid-cordova-configuration', - INVALID_CUSTOM_TOKEN: 'auth/invalid-custom-token', - INVALID_DYNAMIC_LINK_DOMAIN: 'auth/invalid-dynamic-link-domain', - INVALID_EMAIL: 'auth/invalid-email', - INVALID_EMULATOR_SCHEME: 'auth/invalid-emulator-scheme', - INVALID_IDP_RESPONSE: 'auth/invalid-credential', - INVALID_MESSAGE_PAYLOAD: 'auth/invalid-message-payload', - INVALID_MFA_SESSION: 'auth/invalid-multi-factor-session', - INVALID_OAUTH_CLIENT_ID: 'auth/invalid-oauth-client-id', - INVALID_OAUTH_PROVIDER: 'auth/invalid-oauth-provider', - INVALID_OOB_CODE: 'auth/invalid-action-code', - INVALID_ORIGIN: 'auth/unauthorized-domain', - INVALID_PASSWORD: 'auth/wrong-password', - INVALID_PERSISTENCE: 'auth/invalid-persistence-type', - INVALID_PHONE_NUMBER: 'auth/invalid-phone-number', - INVALID_PROVIDER_ID: 'auth/invalid-provider-id', - INVALID_RECIPIENT_EMAIL: 'auth/invalid-recipient-email', - INVALID_SENDER: 'auth/invalid-sender', - INVALID_SESSION_INFO: 'auth/invalid-verification-id', - INVALID_TENANT_ID: 'auth/invalid-tenant-id', - MFA_INFO_NOT_FOUND: 'auth/multi-factor-info-not-found', - MFA_REQUIRED: 'auth/multi-factor-auth-required', - MISSING_ANDROID_PACKAGE_NAME: 'auth/missing-android-pkg-name', - MISSING_APP_CREDENTIAL: 'auth/missing-app-credential', - MISSING_AUTH_DOMAIN: 'auth/auth-domain-config-required', - MISSING_CODE: 'auth/missing-verification-code', - MISSING_CONTINUE_URI: 'auth/missing-continue-uri', - MISSING_IFRAME_START: 'auth/missing-iframe-start', - MISSING_IOS_BUNDLE_ID: 'auth/missing-ios-bundle-id', - MISSING_OR_INVALID_NONCE: 'auth/missing-or-invalid-nonce', - MISSING_MFA_INFO: 'auth/missing-multi-factor-info', - MISSING_MFA_SESSION: 'auth/missing-multi-factor-session', - MISSING_PHONE_NUMBER: 'auth/missing-phone-number', - MISSING_SESSION_INFO: 'auth/missing-verification-id', - MODULE_DESTROYED: 'auth/app-deleted', - NEED_CONFIRMATION: 'auth/account-exists-with-different-credential', - NETWORK_REQUEST_FAILED: 'auth/network-request-failed', - NULL_USER: 'auth/null-user', - NO_AUTH_EVENT: 'auth/no-auth-event', - NO_SUCH_PROVIDER: 'auth/no-such-provider', - OPERATION_NOT_ALLOWED: 'auth/operation-not-allowed', - OPERATION_NOT_SUPPORTED: 'auth/operation-not-supported-in-this-environment', - POPUP_BLOCKED: 'auth/popup-blocked', - POPUP_CLOSED_BY_USER: 'auth/popup-closed-by-user', - PROVIDER_ALREADY_LINKED: 'auth/provider-already-linked', - QUOTA_EXCEEDED: 'auth/quota-exceeded', - REDIRECT_CANCELLED_BY_USER: 'auth/redirect-cancelled-by-user', - REDIRECT_OPERATION_PENDING: 'auth/redirect-operation-pending', - REJECTED_CREDENTIAL: 'auth/rejected-credential', - SECOND_FACTOR_ALREADY_ENROLLED: 'auth/second-factor-already-in-use', - SECOND_FACTOR_LIMIT_EXCEEDED: 'auth/maximum-second-factor-count-exceeded', - TENANT_ID_MISMATCH: 'auth/tenant-id-mismatch', - TIMEOUT: 'auth/timeout', - TOKEN_EXPIRED: 'auth/user-token-expired', - TOO_MANY_ATTEMPTS_TRY_LATER: 'auth/too-many-requests', - UNAUTHORIZED_DOMAIN: 'auth/unauthorized-continue-uri', - UNSUPPORTED_FIRST_FACTOR: 'auth/unsupported-first-factor', - UNSUPPORTED_PERSISTENCE: 'auth/unsupported-persistence-type', - UNSUPPORTED_TENANT_OPERATION: 'auth/unsupported-tenant-operation', - UNVERIFIED_EMAIL: 'auth/unverified-email', - USER_CANCELLED: 'auth/user-cancelled', - USER_DELETED: 'auth/user-not-found', - USER_DISABLED: 'auth/user-disabled', - USER_MISMATCH: 'auth/user-mismatch', - USER_SIGNED_OUT: 'auth/user-signed-out', - WEAK_PASSWORD: 'auth/weak-password', - WEB_STORAGE_UNSUPPORTED: 'auth/web-storage-unsupported', - ALREADY_INITIALIZED: 'auth/already-initialized' -}; - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const logClient = new _firebase_logger__WEBPACK_IMPORTED_MODULE_2__.Logger('@firebase/auth'); -function _logError(msg, ...args) { - if (logClient.logLevel <= _firebase_logger__WEBPACK_IMPORTED_MODULE_2__.LogLevel.ERROR) { - logClient.error(`Auth (${_firebase_app__WEBPACK_IMPORTED_MODULE_1__.SDK_VERSION}): ${msg}`, ...args); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function _fail(authOrCode, ...rest) { - throw createErrorInternal(authOrCode, ...rest); -} -function _createError(authOrCode, ...rest) { - return createErrorInternal(authOrCode, ...rest); -} -function _errorWithCustomMessage(auth, code, message) { - const errorMap = Object.assign(Object.assign({}, prodErrorMap()), { [code]: message }); - const factory = new _firebase_util__WEBPACK_IMPORTED_MODULE_0__.ErrorFactory('auth', 'Firebase', errorMap); - return factory.create(code, { - appName: auth.name, - }); -} -function _assertInstanceOf(auth, object, instance) { - const constructorInstance = instance; - if (!(object instanceof constructorInstance)) { - if (constructorInstance.name !== object.constructor.name) { - _fail(auth, "argument-error" /* ARGUMENT_ERROR */); - } - throw _errorWithCustomMessage(auth, "argument-error" /* ARGUMENT_ERROR */, `Type of ${object.constructor.name} does not match expected instance.` + - `Did you pass a reference from a different Auth SDK?`); - } -} -function createErrorInternal(authOrCode, ...rest) { - if (typeof authOrCode !== 'string') { - const code = rest[0]; - const fullParams = [...rest.slice(1)]; - if (fullParams[0]) { - fullParams[0].appName = authOrCode.name; - } - return authOrCode._errorFactory.create(code, ...fullParams); - } - return _DEFAULT_AUTH_ERROR_FACTORY.create(authOrCode, ...rest); -} -function _assert(assertion, authOrCode, ...rest) { - if (!assertion) { - throw createErrorInternal(authOrCode, ...rest); - } -} -/** - * Unconditionally fails, throwing an internal error with the given message. - * - * @param failure type of failure encountered - * @throws Error - */ -function debugFail(failure) { - // Log the failure in addition to throw an exception, just in case the - // exception is swallowed. - const message = `INTERNAL ASSERTION FAILED: ` + failure; - _logError(message); - // NOTE: We don't use FirebaseError here because these are internal failures - // that cannot be handled by the user. (Also it would create a circular - // dependency between the error and assert modules which doesn't work.) - throw new Error(message); -} -/** - * Fails if the given assertion condition is false, throwing an Error with the - * given message if it did. - * - * @param assertion - * @param message - */ -function debugAssert(assertion, message) { - if (!assertion) { - debugFail(message); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const instanceCache = new Map(); -function _getInstance(cls) { - debugAssert(cls instanceof Function, 'Expected a class definition'); - let instance = instanceCache.get(cls); - if (instance) { - debugAssert(instance instanceof cls, 'Instance stored in cache mismatched with class'); - return instance; - } - instance = new cls(); - instanceCache.set(cls, instance); - return instance; -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Initializes an {@link Auth} instance with fine-grained control over - * {@link Dependencies}. - * - * @remarks - * - * This function allows more control over the {@link Auth} instance than - * {@link getAuth}. `getAuth` uses platform-specific defaults to supply - * the {@link Dependencies}. In general, `getAuth` is the easiest way to - * initialize Auth and works for most use cases. Use `initializeAuth` if you - * need control over which persistence layer is used, or to minimize bundle - * size if you're not using either `signInWithPopup` or `signInWithRedirect`. - * - * For example, if your app only uses anonymous accounts and you only want - * accounts saved for the current session, initialize `Auth` with: - * - * ```js - * const auth = initializeAuth(app, { - * persistence: browserSessionPersistence, - * popupRedirectResolver: undefined, - * }); - * ``` - * - * @public - */ -function initializeAuth(app, deps) { - const provider = (0,_firebase_app__WEBPACK_IMPORTED_MODULE_1__._getProvider)(app, 'auth'); - if (provider.isInitialized()) { - const auth = provider.getImmediate(); - const initialOptions = provider.getOptions(); - if ((0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.deepEqual)(initialOptions, deps !== null && deps !== void 0 ? deps : {})) { - return auth; - } - else { - _fail(auth, "already-initialized" /* ALREADY_INITIALIZED */); - } - } - const auth = provider.initialize({ options: deps }); - return auth; -} -function _initializeAuthInstance(auth, deps) { - const persistence = (deps === null || deps === void 0 ? void 0 : deps.persistence) || []; - const hierarchy = (Array.isArray(persistence) ? persistence : [persistence]).map(_getInstance); - if (deps === null || deps === void 0 ? void 0 : deps.errorMap) { - auth._updateErrorMap(deps.errorMap); - } - // This promise is intended to float; auth initialization happens in the - // background, meanwhile the auth object may be used by the app. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - auth._initializeWithPersistence(hierarchy, deps === null || deps === void 0 ? void 0 : deps.popupRedirectResolver); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function _getCurrentUrl() { - var _a; - return (typeof self !== 'undefined' && ((_a = self.location) === null || _a === void 0 ? void 0 : _a.href)) || ''; -} -function _isHttpOrHttps() { - return _getCurrentScheme() === 'http:' || _getCurrentScheme() === 'https:'; -} -function _getCurrentScheme() { - var _a; - return (typeof self !== 'undefined' && ((_a = self.location) === null || _a === void 0 ? void 0 : _a.protocol)) || null; -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Determine whether the browser is working online - */ -function _isOnline() { - if (typeof navigator !== 'undefined' && - navigator && - 'onLine' in navigator && - typeof navigator.onLine === 'boolean' && - // Apply only for traditional web apps and Chrome extensions. - // This is especially true for Cordova apps which have unreliable - // navigator.onLine behavior unless cordova-plugin-network-information is - // installed which overwrites the native navigator.onLine value and - // defines navigator.connection. - (_isHttpOrHttps() || (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.isBrowserExtension)() || 'connection' in navigator)) { - return navigator.onLine; - } - // If we can't determine the state, assume it is online. - return true; -} -function _getUserLanguage() { - if (typeof navigator === 'undefined') { - return null; - } - const navigatorLanguage = navigator; - return ( - // Most reliable, but only supported in Chrome/Firefox. - (navigatorLanguage.languages && navigatorLanguage.languages[0]) || - // Supported in most browsers, but returns the language of the browser - // UI, not the language set in browser settings. - navigatorLanguage.language || - // Couldn't determine language. - null); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A structure to help pick between a range of long and short delay durations - * depending on the current environment. In general, the long delay is used for - * mobile environments whereas short delays are used for desktop environments. - */ -class Delay { - constructor(shortDelay, longDelay) { - this.shortDelay = shortDelay; - this.longDelay = longDelay; - // Internal error when improperly initialized. - debugAssert(longDelay > shortDelay, 'Short delay should be less than long delay!'); - this.isMobile = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.isMobileCordova)() || (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.isReactNative)(); - } - get() { - if (!_isOnline()) { - // Pick the shorter timeout. - return Math.min(5000 /* OFFLINE */, this.shortDelay); - } - // If running in a mobile environment, return the long delay, otherwise - // return the short delay. - // This could be improved in the future to dynamically change based on other - // variables instead of just reading the current environment. - return this.isMobile ? this.longDelay : this.shortDelay; - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function _emulatorUrl(config, path) { - debugAssert(config.emulator, 'Emulator should always be set here'); - const { url } = config.emulator; - if (!path) { - return url; - } - return `${url}${path.startsWith('/') ? path.slice(1) : path}`; -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -class FetchProvider { - static initialize(fetchImpl, headersImpl, responseImpl) { - this.fetchImpl = fetchImpl; - if (headersImpl) { - this.headersImpl = headersImpl; - } - if (responseImpl) { - this.responseImpl = responseImpl; - } - } - static fetch() { - if (this.fetchImpl) { - return this.fetchImpl; - } - if (typeof self !== 'undefined' && 'fetch' in self) { - return self.fetch; - } - debugFail('Could not find fetch implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill'); - } - static headers() { - if (this.headersImpl) { - return this.headersImpl; - } - if (typeof self !== 'undefined' && 'Headers' in self) { - return self.Headers; - } - debugFail('Could not find Headers implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill'); - } - static response() { - if (this.responseImpl) { - return this.responseImpl; - } - if (typeof self !== 'undefined' && 'Response' in self) { - return self.Response; - } - debugFail('Could not find Response implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill'); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Map from errors returned by the server to errors to developer visible errors - */ -const SERVER_ERROR_MAP = { - // Custom token errors. - ["CREDENTIAL_MISMATCH" /* CREDENTIAL_MISMATCH */]: "custom-token-mismatch" /* CREDENTIAL_MISMATCH */, - // This can only happen if the SDK sends a bad request. - ["MISSING_CUSTOM_TOKEN" /* MISSING_CUSTOM_TOKEN */]: "internal-error" /* INTERNAL_ERROR */, - // Create Auth URI errors. - ["INVALID_IDENTIFIER" /* INVALID_IDENTIFIER */]: "invalid-email" /* INVALID_EMAIL */, - // This can only happen if the SDK sends a bad request. - ["MISSING_CONTINUE_URI" /* MISSING_CONTINUE_URI */]: "internal-error" /* INTERNAL_ERROR */, - // Sign in with email and password errors (some apply to sign up too). - ["INVALID_PASSWORD" /* INVALID_PASSWORD */]: "wrong-password" /* INVALID_PASSWORD */, - // This can only happen if the SDK sends a bad request. - ["MISSING_PASSWORD" /* MISSING_PASSWORD */]: "internal-error" /* INTERNAL_ERROR */, - // Sign up with email and password errors. - ["EMAIL_EXISTS" /* EMAIL_EXISTS */]: "email-already-in-use" /* EMAIL_EXISTS */, - ["PASSWORD_LOGIN_DISABLED" /* PASSWORD_LOGIN_DISABLED */]: "operation-not-allowed" /* OPERATION_NOT_ALLOWED */, - // Verify assertion for sign in with credential errors: - ["INVALID_IDP_RESPONSE" /* INVALID_IDP_RESPONSE */]: "invalid-credential" /* INVALID_IDP_RESPONSE */, - ["INVALID_PENDING_TOKEN" /* INVALID_PENDING_TOKEN */]: "invalid-credential" /* INVALID_IDP_RESPONSE */, - ["FEDERATED_USER_ID_ALREADY_LINKED" /* FEDERATED_USER_ID_ALREADY_LINKED */]: "credential-already-in-use" /* CREDENTIAL_ALREADY_IN_USE */, - // This can only happen if the SDK sends a bad request. - ["MISSING_REQ_TYPE" /* MISSING_REQ_TYPE */]: "internal-error" /* INTERNAL_ERROR */, - // Send Password reset email errors: - ["EMAIL_NOT_FOUND" /* EMAIL_NOT_FOUND */]: "user-not-found" /* USER_DELETED */, - ["RESET_PASSWORD_EXCEED_LIMIT" /* RESET_PASSWORD_EXCEED_LIMIT */]: "too-many-requests" /* TOO_MANY_ATTEMPTS_TRY_LATER */, - ["EXPIRED_OOB_CODE" /* EXPIRED_OOB_CODE */]: "expired-action-code" /* EXPIRED_OOB_CODE */, - ["INVALID_OOB_CODE" /* INVALID_OOB_CODE */]: "invalid-action-code" /* INVALID_OOB_CODE */, - // This can only happen if the SDK sends a bad request. - ["MISSING_OOB_CODE" /* MISSING_OOB_CODE */]: "internal-error" /* INTERNAL_ERROR */, - // Operations that require ID token in request: - ["CREDENTIAL_TOO_OLD_LOGIN_AGAIN" /* CREDENTIAL_TOO_OLD_LOGIN_AGAIN */]: "requires-recent-login" /* CREDENTIAL_TOO_OLD_LOGIN_AGAIN */, - ["INVALID_ID_TOKEN" /* INVALID_ID_TOKEN */]: "invalid-user-token" /* INVALID_AUTH */, - ["TOKEN_EXPIRED" /* TOKEN_EXPIRED */]: "user-token-expired" /* TOKEN_EXPIRED */, - ["USER_NOT_FOUND" /* USER_NOT_FOUND */]: "user-token-expired" /* TOKEN_EXPIRED */, - // Other errors. - ["TOO_MANY_ATTEMPTS_TRY_LATER" /* TOO_MANY_ATTEMPTS_TRY_LATER */]: "too-many-requests" /* TOO_MANY_ATTEMPTS_TRY_LATER */, - // Phone Auth related errors. - ["INVALID_CODE" /* INVALID_CODE */]: "invalid-verification-code" /* INVALID_CODE */, - ["INVALID_SESSION_INFO" /* INVALID_SESSION_INFO */]: "invalid-verification-id" /* INVALID_SESSION_INFO */, - ["INVALID_TEMPORARY_PROOF" /* INVALID_TEMPORARY_PROOF */]: "invalid-credential" /* INVALID_IDP_RESPONSE */, - ["MISSING_SESSION_INFO" /* MISSING_SESSION_INFO */]: "missing-verification-id" /* MISSING_SESSION_INFO */, - ["SESSION_EXPIRED" /* SESSION_EXPIRED */]: "code-expired" /* CODE_EXPIRED */, - // Other action code errors when additional settings passed. - // MISSING_CONTINUE_URI is getting mapped to INTERNAL_ERROR above. - // This is OK as this error will be caught by client side validation. - ["MISSING_ANDROID_PACKAGE_NAME" /* MISSING_ANDROID_PACKAGE_NAME */]: "missing-android-pkg-name" /* MISSING_ANDROID_PACKAGE_NAME */, - ["UNAUTHORIZED_DOMAIN" /* UNAUTHORIZED_DOMAIN */]: "unauthorized-continue-uri" /* UNAUTHORIZED_DOMAIN */, - // getProjectConfig errors when clientId is passed. - ["INVALID_OAUTH_CLIENT_ID" /* INVALID_OAUTH_CLIENT_ID */]: "invalid-oauth-client-id" /* INVALID_OAUTH_CLIENT_ID */, - // User actions (sign-up or deletion) disabled errors. - ["ADMIN_ONLY_OPERATION" /* ADMIN_ONLY_OPERATION */]: "admin-restricted-operation" /* ADMIN_ONLY_OPERATION */, - // Multi factor related errors. - ["INVALID_MFA_PENDING_CREDENTIAL" /* INVALID_MFA_PENDING_CREDENTIAL */]: "invalid-multi-factor-session" /* INVALID_MFA_SESSION */, - ["MFA_ENROLLMENT_NOT_FOUND" /* MFA_ENROLLMENT_NOT_FOUND */]: "multi-factor-info-not-found" /* MFA_INFO_NOT_FOUND */, - ["MISSING_MFA_ENROLLMENT_ID" /* MISSING_MFA_ENROLLMENT_ID */]: "missing-multi-factor-info" /* MISSING_MFA_INFO */, - ["MISSING_MFA_PENDING_CREDENTIAL" /* MISSING_MFA_PENDING_CREDENTIAL */]: "missing-multi-factor-session" /* MISSING_MFA_SESSION */, - ["SECOND_FACTOR_EXISTS" /* SECOND_FACTOR_EXISTS */]: "second-factor-already-in-use" /* SECOND_FACTOR_ALREADY_ENROLLED */, - ["SECOND_FACTOR_LIMIT_EXCEEDED" /* SECOND_FACTOR_LIMIT_EXCEEDED */]: "maximum-second-factor-count-exceeded" /* SECOND_FACTOR_LIMIT_EXCEEDED */, - // Blocking functions related errors. - ["BLOCKING_FUNCTION_ERROR_RESPONSE" /* BLOCKING_FUNCTION_ERROR_RESPONSE */]: "internal-error" /* INTERNAL_ERROR */, -}; - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const DEFAULT_API_TIMEOUT_MS = new Delay(30000, 60000); -function _addTidIfNecessary(auth, request) { - if (auth.tenantId && !request.tenantId) { - return Object.assign(Object.assign({}, request), { tenantId: auth.tenantId }); - } - return request; -} -async function _performApiRequest(auth, method, path, request, customErrorMap = {}) { - return _performFetchWithErrorHandling(auth, customErrorMap, async () => { - let body = {}; - let params = {}; - if (request) { - if (method === "GET" /* GET */) { - params = request; - } - else { - body = { - body: JSON.stringify(request) - }; - } - } - const query = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.querystring)(Object.assign({ key: auth.config.apiKey }, params)).slice(1); - const headers = await auth._getAdditionalHeaders(); - headers["Content-Type" /* CONTENT_TYPE */] = 'application/json'; - if (auth.languageCode) { - headers["X-Firebase-Locale" /* X_FIREBASE_LOCALE */] = auth.languageCode; - } - return FetchProvider.fetch()(_getFinalTarget(auth, auth.config.apiHost, path, query), Object.assign({ method, - headers, referrerPolicy: 'no-referrer' }, body)); - }); -} -async function _performFetchWithErrorHandling(auth, customErrorMap, fetchFn) { - auth._canInitEmulator = false; - const errorMap = Object.assign(Object.assign({}, SERVER_ERROR_MAP), customErrorMap); - try { - const networkTimeout = new NetworkTimeout(auth); - const response = await Promise.race([ - fetchFn(), - networkTimeout.promise - ]); - // If we've reached this point, the fetch succeeded and the networkTimeout - // didn't throw; clear the network timeout delay so that Node won't hang - networkTimeout.clearNetworkTimeout(); - const json = await response.json(); - if ('needConfirmation' in json) { - throw _makeTaggedError(auth, "account-exists-with-different-credential" /* NEED_CONFIRMATION */, json); - } - if (response.ok && !('errorMessage' in json)) { - return json; - } - else { - const errorMessage = response.ok ? json.errorMessage : json.error.message; - const [serverErrorCode, serverErrorMessage] = errorMessage.split(' : '); - if (serverErrorCode === "FEDERATED_USER_ID_ALREADY_LINKED" /* FEDERATED_USER_ID_ALREADY_LINKED */) { - throw _makeTaggedError(auth, "credential-already-in-use" /* CREDENTIAL_ALREADY_IN_USE */, json); - } - else if (serverErrorCode === "EMAIL_EXISTS" /* EMAIL_EXISTS */) { - throw _makeTaggedError(auth, "email-already-in-use" /* EMAIL_EXISTS */, json); - } - const authError = errorMap[serverErrorCode] || - serverErrorCode - .toLowerCase() - .replace(/[_\s]+/g, '-'); - if (serverErrorMessage) { - throw _errorWithCustomMessage(auth, authError, serverErrorMessage); - } - else { - _fail(auth, authError); - } - } - } - catch (e) { - if (e instanceof _firebase_util__WEBPACK_IMPORTED_MODULE_0__.FirebaseError) { - throw e; - } - _fail(auth, "network-request-failed" /* NETWORK_REQUEST_FAILED */); - } -} -async function _performSignInRequest(auth, method, path, request, customErrorMap = {}) { - const serverResponse = (await _performApiRequest(auth, method, path, request, customErrorMap)); - if ('mfaPendingCredential' in serverResponse) { - _fail(auth, "multi-factor-auth-required" /* MFA_REQUIRED */, { - _serverResponse: serverResponse - }); - } - return serverResponse; -} -function _getFinalTarget(auth, host, path, query) { - const base = `${host}${path}?${query}`; - if (!auth.config.emulator) { - return `${auth.config.apiScheme}://${base}`; - } - return _emulatorUrl(auth.config, base); -} -class NetworkTimeout { - constructor(auth) { - this.auth = auth; - // Node timers and browser timers are fundamentally incompatible, but we - // don't care about the value here - // eslint-disable-next-line @typescript-eslint/no-explicit-any - this.timer = null; - this.promise = new Promise((_, reject) => { - this.timer = setTimeout(() => { - return reject(_createError(this.auth, "network-request-failed" /* NETWORK_REQUEST_FAILED */)); - }, DEFAULT_API_TIMEOUT_MS.get()); - }); - } - clearNetworkTimeout() { - clearTimeout(this.timer); - } -} -function _makeTaggedError(auth, code, response) { - const errorParams = { - appName: auth.name - }; - if (response.email) { - errorParams.email = response.email; - } - if (response.phoneNumber) { - errorParams.phoneNumber = response.phoneNumber; - } - const error = _createError(auth, code, errorParams); - // We know customData is defined on error because errorParams is defined - error.customData._tokenResponse = response; - return error; -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -async function deleteAccount(auth, request) { - return _performApiRequest(auth, "POST" /* POST */, "/v1/accounts:delete" /* DELETE_ACCOUNT */, request); -} -async function deleteLinkedAccounts(auth, request) { - return _performApiRequest(auth, "POST" /* POST */, "/v1/accounts:update" /* SET_ACCOUNT_INFO */, request); -} -async function getAccountInfo(auth, request) { - return _performApiRequest(auth, "POST" /* POST */, "/v1/accounts:lookup" /* GET_ACCOUNT_INFO */, request); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function utcTimestampToDateString(utcTimestamp) { - if (!utcTimestamp) { - return undefined; - } - try { - // Convert to date object. - const date = new Date(Number(utcTimestamp)); - // Test date is valid. - if (!isNaN(date.getTime())) { - // Convert to UTC date string. - return date.toUTCString(); - } - } - catch (e) { - // Do nothing. undefined will be returned. - } - return undefined; -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Returns a JSON Web Token (JWT) used to identify the user to a Firebase service. - * - * @remarks - * Returns the current token if it has not expired or if it will not expire in the next five - * minutes. Otherwise, this will refresh the token and return a new one. - * - * @param user - The user. - * @param forceRefresh - Force refresh regardless of token expiration. - * - * @public - */ -function getIdToken(user, forceRefresh = false) { - return (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(user).getIdToken(forceRefresh); -} -/** - * Returns a deserialized JSON Web Token (JWT) used to identitfy the user to a Firebase service. - * - * @remarks - * Returns the current token if it has not expired or if it will not expire in the next five - * minutes. Otherwise, this will refresh the token and return a new one. - * - * @param user - The user. - * @param forceRefresh - Force refresh regardless of token expiration. - * - * @public - */ -async function getIdTokenResult(user, forceRefresh = false) { - const userInternal = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(user); - const token = await userInternal.getIdToken(forceRefresh); - const claims = _parseToken(token); - _assert(claims && claims.exp && claims.auth_time && claims.iat, userInternal.auth, "internal-error" /* INTERNAL_ERROR */); - const firebase = typeof claims.firebase === 'object' ? claims.firebase : undefined; - const signInProvider = firebase === null || firebase === void 0 ? void 0 : firebase['sign_in_provider']; - return { - claims, - token, - authTime: utcTimestampToDateString(secondsStringToMilliseconds(claims.auth_time)), - issuedAtTime: utcTimestampToDateString(secondsStringToMilliseconds(claims.iat)), - expirationTime: utcTimestampToDateString(secondsStringToMilliseconds(claims.exp)), - signInProvider: signInProvider || null, - signInSecondFactor: (firebase === null || firebase === void 0 ? void 0 : firebase['sign_in_second_factor']) || null - }; -} -function secondsStringToMilliseconds(seconds) { - return Number(seconds) * 1000; -} -function _parseToken(token) { - const [algorithm, payload, signature] = token.split('.'); - if (algorithm === undefined || - payload === undefined || - signature === undefined) { - _logError('JWT malformed, contained fewer than 3 sections'); - return null; - } - try { - const decoded = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.base64Decode)(payload); - if (!decoded) { - _logError('Failed to decode base64 JWT payload'); - return null; - } - return JSON.parse(decoded); - } - catch (e) { - _logError('Caught error parsing JWT payload as JSON', e); - return null; - } -} -/** - * Extract expiresIn TTL from a token by subtracting the expiration from the issuance. - */ -function _tokenExpiresIn(token) { - const parsedToken = _parseToken(token); - _assert(parsedToken, "internal-error" /* INTERNAL_ERROR */); - _assert(typeof parsedToken.exp !== 'undefined', "internal-error" /* INTERNAL_ERROR */); - _assert(typeof parsedToken.iat !== 'undefined', "internal-error" /* INTERNAL_ERROR */); - return Number(parsedToken.exp) - Number(parsedToken.iat); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -async function _logoutIfInvalidated(user, promise, bypassAuthState = false) { - if (bypassAuthState) { - return promise; - } - try { - return await promise; - } - catch (e) { - if (e instanceof _firebase_util__WEBPACK_IMPORTED_MODULE_0__.FirebaseError && isUserInvalidated(e)) { - if (user.auth.currentUser === user) { - await user.auth.signOut(); - } - } - throw e; - } -} -function isUserInvalidated({ code }) { - return (code === `auth/${"user-disabled" /* USER_DISABLED */}` || - code === `auth/${"user-token-expired" /* TOKEN_EXPIRED */}`); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -class ProactiveRefresh { - constructor(user) { - this.user = user; - this.isRunning = false; - // Node timers and browser timers return fundamentally different types. - // We don't actually care what the value is but TS won't accept unknown and - // we can't cast properly in both environments. - // eslint-disable-next-line @typescript-eslint/no-explicit-any - this.timerId = null; - this.errorBackoff = 30000 /* RETRY_BACKOFF_MIN */; - } - _start() { - if (this.isRunning) { - return; - } - this.isRunning = true; - this.schedule(); - } - _stop() { - if (!this.isRunning) { - return; - } - this.isRunning = false; - if (this.timerId !== null) { - clearTimeout(this.timerId); - } - } - getInterval(wasError) { - var _a; - if (wasError) { - const interval = this.errorBackoff; - this.errorBackoff = Math.min(this.errorBackoff * 2, 960000 /* RETRY_BACKOFF_MAX */); - return interval; - } - else { - // Reset the error backoff - this.errorBackoff = 30000 /* RETRY_BACKOFF_MIN */; - const expTime = (_a = this.user.stsTokenManager.expirationTime) !== null && _a !== void 0 ? _a : 0; - const interval = expTime - Date.now() - 300000 /* OFFSET */; - return Math.max(0, interval); - } - } - schedule(wasError = false) { - if (!this.isRunning) { - // Just in case... - return; - } - const interval = this.getInterval(wasError); - this.timerId = setTimeout(async () => { - await this.iteration(); - }, interval); - } - async iteration() { - try { - await this.user.getIdToken(true); - } - catch (e) { - // Only retry on network errors - if (e.code === `auth/${"network-request-failed" /* NETWORK_REQUEST_FAILED */}`) { - this.schedule(/* wasError */ true); - } - return; - } - this.schedule(); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -class UserMetadata { - constructor(createdAt, lastLoginAt) { - this.createdAt = createdAt; - this.lastLoginAt = lastLoginAt; - this._initializeTime(); - } - _initializeTime() { - this.lastSignInTime = utcTimestampToDateString(this.lastLoginAt); - this.creationTime = utcTimestampToDateString(this.createdAt); - } - _copy(metadata) { - this.createdAt = metadata.createdAt; - this.lastLoginAt = metadata.lastLoginAt; - this._initializeTime(); - } - toJSON() { - return { - createdAt: this.createdAt, - lastLoginAt: this.lastLoginAt - }; - } -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -async function _reloadWithoutSaving(user) { - var _a; - const auth = user.auth; - const idToken = await user.getIdToken(); - const response = await _logoutIfInvalidated(user, getAccountInfo(auth, { idToken })); - _assert(response === null || response === void 0 ? void 0 : response.users.length, auth, "internal-error" /* INTERNAL_ERROR */); - const coreAccount = response.users[0]; - user._notifyReloadListener(coreAccount); - const newProviderData = ((_a = coreAccount.providerUserInfo) === null || _a === void 0 ? void 0 : _a.length) - ? extractProviderData(coreAccount.providerUserInfo) - : []; - const providerData = mergeProviderData(user.providerData, newProviderData); - // Preserves the non-nonymous status of the stored user, even if no more - // credentials (federated or email/password) are linked to the user. If - // the user was previously anonymous, then use provider data to update. - // On the other hand, if it was not anonymous before, it should never be - // considered anonymous now. - const oldIsAnonymous = user.isAnonymous; - const newIsAnonymous = !(user.email && coreAccount.passwordHash) && !(providerData === null || providerData === void 0 ? void 0 : providerData.length); - const isAnonymous = !oldIsAnonymous ? false : newIsAnonymous; - const updates = { - uid: coreAccount.localId, - displayName: coreAccount.displayName || null, - photoURL: coreAccount.photoUrl || null, - email: coreAccount.email || null, - emailVerified: coreAccount.emailVerified || false, - phoneNumber: coreAccount.phoneNumber || null, - tenantId: coreAccount.tenantId || null, - providerData, - metadata: new UserMetadata(coreAccount.createdAt, coreAccount.lastLoginAt), - isAnonymous - }; - Object.assign(user, updates); -} -/** - * Reloads user account data, if signed in. - * - * @param user - The user. - * - * @public - */ -async function reload(user) { - const userInternal = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(user); - await _reloadWithoutSaving(userInternal); - // Even though the current user hasn't changed, update - // current user will trigger a persistence update w/ the - // new info. - await userInternal.auth._persistUserIfCurrent(userInternal); - userInternal.auth._notifyListenersIfCurrent(userInternal); -} -function mergeProviderData(original, newData) { - const deduped = original.filter(o => !newData.some(n => n.providerId === o.providerId)); - return [...deduped, ...newData]; -} -function extractProviderData(providers) { - return providers.map((_a) => { - var { providerId } = _a, provider = (0,tslib__WEBPACK_IMPORTED_MODULE_4__.__rest)(_a, ["providerId"]); - return { - providerId, - uid: provider.rawId || '', - displayName: provider.displayName || null, - email: provider.email || null, - phoneNumber: provider.phoneNumber || null, - photoURL: provider.photoUrl || null - }; - }); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -async function requestStsToken(auth, refreshToken) { - const response = await _performFetchWithErrorHandling(auth, {}, async () => { - const body = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.querystring)({ - 'grant_type': 'refresh_token', - 'refresh_token': refreshToken - }).slice(1); - const { tokenApiHost, apiKey } = auth.config; - const url = _getFinalTarget(auth, tokenApiHost, "/v1/token" /* TOKEN */, `key=${apiKey}`); - const headers = await auth._getAdditionalHeaders(); - headers["Content-Type" /* CONTENT_TYPE */] = 'application/x-www-form-urlencoded'; - return FetchProvider.fetch()(url, { - method: "POST" /* POST */, - headers, - body - }); - }); - // The response comes back in snake_case. Convert to camel: - return { - accessToken: response.access_token, - expiresIn: response.expires_in, - refreshToken: response.refresh_token - }; -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * We need to mark this class as internal explicitly to exclude it in the public typings, because - * it references AuthInternal which has a circular dependency with UserInternal. - * - * @internal - */ -class StsTokenManager { - constructor() { - this.refreshToken = null; - this.accessToken = null; - this.expirationTime = null; - } - get isExpired() { - return (!this.expirationTime || - Date.now() > this.expirationTime - 30000 /* TOKEN_REFRESH */); - } - updateFromServerResponse(response) { - _assert(response.idToken, "internal-error" /* INTERNAL_ERROR */); - _assert(typeof response.idToken !== 'undefined', "internal-error" /* INTERNAL_ERROR */); - _assert(typeof response.refreshToken !== 'undefined', "internal-error" /* INTERNAL_ERROR */); - const expiresIn = 'expiresIn' in response && typeof response.expiresIn !== 'undefined' - ? Number(response.expiresIn) - : _tokenExpiresIn(response.idToken); - this.updateTokensAndExpiration(response.idToken, response.refreshToken, expiresIn); - } - async getToken(auth, forceRefresh = false) { - _assert(!this.accessToken || this.refreshToken, auth, "user-token-expired" /* TOKEN_EXPIRED */); - if (!forceRefresh && this.accessToken && !this.isExpired) { - return this.accessToken; - } - if (this.refreshToken) { - await this.refresh(auth, this.refreshToken); - return this.accessToken; - } - return null; - } - clearRefreshToken() { - this.refreshToken = null; - } - async refresh(auth, oldToken) { - const { accessToken, refreshToken, expiresIn } = await requestStsToken(auth, oldToken); - this.updateTokensAndExpiration(accessToken, refreshToken, Number(expiresIn)); - } - updateTokensAndExpiration(accessToken, refreshToken, expiresInSec) { - this.refreshToken = refreshToken || null; - this.accessToken = accessToken || null; - this.expirationTime = Date.now() + expiresInSec * 1000; - } - static fromJSON(appName, object) { - const { refreshToken, accessToken, expirationTime } = object; - const manager = new StsTokenManager(); - if (refreshToken) { - _assert(typeof refreshToken === 'string', "internal-error" /* INTERNAL_ERROR */, { - appName - }); - manager.refreshToken = refreshToken; - } - if (accessToken) { - _assert(typeof accessToken === 'string', "internal-error" /* INTERNAL_ERROR */, { - appName - }); - manager.accessToken = accessToken; - } - if (expirationTime) { - _assert(typeof expirationTime === 'number', "internal-error" /* INTERNAL_ERROR */, { - appName - }); - manager.expirationTime = expirationTime; - } - return manager; - } - toJSON() { - return { - refreshToken: this.refreshToken, - accessToken: this.accessToken, - expirationTime: this.expirationTime - }; - } - _assign(stsTokenManager) { - this.accessToken = stsTokenManager.accessToken; - this.refreshToken = stsTokenManager.refreshToken; - this.expirationTime = stsTokenManager.expirationTime; - } - _clone() { - return Object.assign(new StsTokenManager(), this.toJSON()); - } - _performRefresh() { - return debugFail('not implemented'); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function assertStringOrUndefined(assertion, appName) { - _assert(typeof assertion === 'string' || typeof assertion === 'undefined', "internal-error" /* INTERNAL_ERROR */, { appName }); -} -class UserImpl { - constructor(_a) { - var { uid, auth, stsTokenManager } = _a, opt = (0,tslib__WEBPACK_IMPORTED_MODULE_4__.__rest)(_a, ["uid", "auth", "stsTokenManager"]); - // For the user object, provider is always Firebase. - this.providerId = "firebase" /* FIREBASE */; - this.proactiveRefresh = new ProactiveRefresh(this); - this.reloadUserInfo = null; - this.reloadListener = null; - this.uid = uid; - this.auth = auth; - this.stsTokenManager = stsTokenManager; - this.accessToken = stsTokenManager.accessToken; - this.displayName = opt.displayName || null; - this.email = opt.email || null; - this.emailVerified = opt.emailVerified || false; - this.phoneNumber = opt.phoneNumber || null; - this.photoURL = opt.photoURL || null; - this.isAnonymous = opt.isAnonymous || false; - this.tenantId = opt.tenantId || null; - this.providerData = opt.providerData ? [...opt.providerData] : []; - this.metadata = new UserMetadata(opt.createdAt || undefined, opt.lastLoginAt || undefined); - } - async getIdToken(forceRefresh) { - const accessToken = await _logoutIfInvalidated(this, this.stsTokenManager.getToken(this.auth, forceRefresh)); - _assert(accessToken, this.auth, "internal-error" /* INTERNAL_ERROR */); - if (this.accessToken !== accessToken) { - this.accessToken = accessToken; - await this.auth._persistUserIfCurrent(this); - this.auth._notifyListenersIfCurrent(this); - } - return accessToken; - } - getIdTokenResult(forceRefresh) { - return getIdTokenResult(this, forceRefresh); - } - reload() { - return reload(this); - } - _assign(user) { - if (this === user) { - return; - } - _assert(this.uid === user.uid, this.auth, "internal-error" /* INTERNAL_ERROR */); - this.displayName = user.displayName; - this.photoURL = user.photoURL; - this.email = user.email; - this.emailVerified = user.emailVerified; - this.phoneNumber = user.phoneNumber; - this.isAnonymous = user.isAnonymous; - this.tenantId = user.tenantId; - this.providerData = user.providerData.map(userInfo => (Object.assign({}, userInfo))); - this.metadata._copy(user.metadata); - this.stsTokenManager._assign(user.stsTokenManager); - } - _clone(auth) { - return new UserImpl(Object.assign(Object.assign({}, this), { auth, stsTokenManager: this.stsTokenManager._clone() })); - } - _onReload(callback) { - // There should only ever be one listener, and that is a single instance of MultiFactorUser - _assert(!this.reloadListener, this.auth, "internal-error" /* INTERNAL_ERROR */); - this.reloadListener = callback; - if (this.reloadUserInfo) { - this._notifyReloadListener(this.reloadUserInfo); - this.reloadUserInfo = null; - } - } - _notifyReloadListener(userInfo) { - if (this.reloadListener) { - this.reloadListener(userInfo); - } - else { - // If no listener is subscribed yet, save the result so it's available when they do subscribe - this.reloadUserInfo = userInfo; - } - } - _startProactiveRefresh() { - this.proactiveRefresh._start(); - } - _stopProactiveRefresh() { - this.proactiveRefresh._stop(); - } - async _updateTokensIfNecessary(response, reload = false) { - let tokensRefreshed = false; - if (response.idToken && - response.idToken !== this.stsTokenManager.accessToken) { - this.stsTokenManager.updateFromServerResponse(response); - tokensRefreshed = true; - } - if (reload) { - await _reloadWithoutSaving(this); - } - await this.auth._persistUserIfCurrent(this); - if (tokensRefreshed) { - this.auth._notifyListenersIfCurrent(this); - } - } - async delete() { - const idToken = await this.getIdToken(); - await _logoutIfInvalidated(this, deleteAccount(this.auth, { idToken })); - this.stsTokenManager.clearRefreshToken(); - // TODO: Determine if cancellable-promises are necessary to use in this class so that delete() - // cancels pending actions... - return this.auth.signOut(); - } - toJSON() { - return Object.assign(Object.assign({ uid: this.uid, email: this.email || undefined, emailVerified: this.emailVerified, displayName: this.displayName || undefined, isAnonymous: this.isAnonymous, photoURL: this.photoURL || undefined, phoneNumber: this.phoneNumber || undefined, tenantId: this.tenantId || undefined, providerData: this.providerData.map(userInfo => (Object.assign({}, userInfo))), stsTokenManager: this.stsTokenManager.toJSON(), - // Redirect event ID must be maintained in case there is a pending - // redirect event. - _redirectEventId: this._redirectEventId }, this.metadata.toJSON()), { - // Required for compatibility with the legacy SDK (go/firebase-auth-sdk-persistence-parsing): - apiKey: this.auth.config.apiKey, appName: this.auth.name }); - } - get refreshToken() { - return this.stsTokenManager.refreshToken || ''; - } - static _fromJSON(auth, object) { - var _a, _b, _c, _d, _e, _f, _g, _h; - const displayName = (_a = object.displayName) !== null && _a !== void 0 ? _a : undefined; - const email = (_b = object.email) !== null && _b !== void 0 ? _b : undefined; - const phoneNumber = (_c = object.phoneNumber) !== null && _c !== void 0 ? _c : undefined; - const photoURL = (_d = object.photoURL) !== null && _d !== void 0 ? _d : undefined; - const tenantId = (_e = object.tenantId) !== null && _e !== void 0 ? _e : undefined; - const _redirectEventId = (_f = object._redirectEventId) !== null && _f !== void 0 ? _f : undefined; - const createdAt = (_g = object.createdAt) !== null && _g !== void 0 ? _g : undefined; - const lastLoginAt = (_h = object.lastLoginAt) !== null && _h !== void 0 ? _h : undefined; - const { uid, emailVerified, isAnonymous, providerData, stsTokenManager: plainObjectTokenManager } = object; - _assert(uid && plainObjectTokenManager, auth, "internal-error" /* INTERNAL_ERROR */); - const stsTokenManager = StsTokenManager.fromJSON(this.name, plainObjectTokenManager); - _assert(typeof uid === 'string', auth, "internal-error" /* INTERNAL_ERROR */); - assertStringOrUndefined(displayName, auth.name); - assertStringOrUndefined(email, auth.name); - _assert(typeof emailVerified === 'boolean', auth, "internal-error" /* INTERNAL_ERROR */); - _assert(typeof isAnonymous === 'boolean', auth, "internal-error" /* INTERNAL_ERROR */); - assertStringOrUndefined(phoneNumber, auth.name); - assertStringOrUndefined(photoURL, auth.name); - assertStringOrUndefined(tenantId, auth.name); - assertStringOrUndefined(_redirectEventId, auth.name); - assertStringOrUndefined(createdAt, auth.name); - assertStringOrUndefined(lastLoginAt, auth.name); - const user = new UserImpl({ - uid, - auth, - email, - emailVerified, - displayName, - isAnonymous, - photoURL, - phoneNumber, - tenantId, - stsTokenManager, - createdAt, - lastLoginAt - }); - if (providerData && Array.isArray(providerData)) { - user.providerData = providerData.map(userInfo => (Object.assign({}, userInfo))); - } - if (_redirectEventId) { - user._redirectEventId = _redirectEventId; - } - return user; - } - /** - * Initialize a User from an idToken server response - * @param auth - * @param idTokenResponse - */ - static async _fromIdTokenResponse(auth, idTokenResponse, isAnonymous = false) { - const stsTokenManager = new StsTokenManager(); - stsTokenManager.updateFromServerResponse(idTokenResponse); - // Initialize the Firebase Auth user. - const user = new UserImpl({ - uid: idTokenResponse.localId, - auth, - stsTokenManager, - isAnonymous - }); - // Updates the user info and data and resolves with a user instance. - await _reloadWithoutSaving(user); - return user; - } -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -class InMemoryPersistence { - constructor() { - this.type = "NONE" /* NONE */; - this.storage = {}; - } - async _isAvailable() { - return true; - } - async _set(key, value) { - this.storage[key] = value; - } - async _get(key) { - const value = this.storage[key]; - return value === undefined ? null : value; - } - async _remove(key) { - delete this.storage[key]; - } - _addListener(_key, _listener) { - // Listeners are not supported for in-memory storage since it cannot be shared across windows/workers - return; - } - _removeListener(_key, _listener) { - // Listeners are not supported for in-memory storage since it cannot be shared across windows/workers - return; - } -} -InMemoryPersistence.type = 'NONE'; -/** - * An implementation of {@link Persistence} of type 'NONE'. - * - * @public - */ -const inMemoryPersistence = InMemoryPersistence; - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function _persistenceKeyName(key, apiKey, appName) { - return `${"firebase" /* PERSISTENCE */}:${key}:${apiKey}:${appName}`; -} -class PersistenceUserManager { - constructor(persistence, auth, userKey) { - this.persistence = persistence; - this.auth = auth; - this.userKey = userKey; - const { config, name } = this.auth; - this.fullUserKey = _persistenceKeyName(this.userKey, config.apiKey, name); - this.fullPersistenceKey = _persistenceKeyName("persistence" /* PERSISTENCE_USER */, config.apiKey, name); - this.boundEventHandler = auth._onStorageEvent.bind(auth); - this.persistence._addListener(this.fullUserKey, this.boundEventHandler); - } - setCurrentUser(user) { - return this.persistence._set(this.fullUserKey, user.toJSON()); - } - async getCurrentUser() { - const blob = await this.persistence._get(this.fullUserKey); - return blob ? UserImpl._fromJSON(this.auth, blob) : null; - } - removeCurrentUser() { - return this.persistence._remove(this.fullUserKey); - } - savePersistenceForRedirect() { - return this.persistence._set(this.fullPersistenceKey, this.persistence.type); - } - async setPersistence(newPersistence) { - if (this.persistence === newPersistence) { - return; - } - const currentUser = await this.getCurrentUser(); - await this.removeCurrentUser(); - this.persistence = newPersistence; - if (currentUser) { - return this.setCurrentUser(currentUser); - } - } - delete() { - this.persistence._removeListener(this.fullUserKey, this.boundEventHandler); - } - static async create(auth, persistenceHierarchy, userKey = "authUser" /* AUTH_USER */) { - if (!persistenceHierarchy.length) { - return new PersistenceUserManager(_getInstance(inMemoryPersistence), auth, userKey); - } - // Eliminate any persistences that are not available - const availablePersistences = (await Promise.all(persistenceHierarchy.map(async (persistence) => { - if (await persistence._isAvailable()) { - return persistence; - } - return undefined; - }))).filter(persistence => persistence); - // Fall back to the first persistence listed, or in memory if none available - let selectedPersistence = availablePersistences[0] || - _getInstance(inMemoryPersistence); - const key = _persistenceKeyName(userKey, auth.config.apiKey, auth.name); - // Pull out the existing user, setting the chosen persistence to that - // persistence if the user exists. - let userToMigrate = null; - // Note, here we check for a user in _all_ persistences, not just the - // ones deemed available. If we can migrate a user out of a broken - // persistence, we will (but only if that persistence supports migration). - for (const persistence of persistenceHierarchy) { - try { - const blob = await persistence._get(key); - if (blob) { - const user = UserImpl._fromJSON(auth, blob); // throws for unparsable blob (wrong format) - if (persistence !== selectedPersistence) { - userToMigrate = user; - } - selectedPersistence = persistence; - break; - } - } - catch (_a) { } - } - // If we find the user in a persistence that does support migration, use - // that migration path (of only persistences that support migration) - const migrationHierarchy = availablePersistences.filter(p => p._shouldAllowMigration); - // If the persistence does _not_ allow migration, just finish off here - if (!selectedPersistence._shouldAllowMigration || - !migrationHierarchy.length) { - return new PersistenceUserManager(selectedPersistence, auth, userKey); - } - selectedPersistence = migrationHierarchy[0]; - if (userToMigrate) { - // This normally shouldn't throw since chosenPersistence.isAvailable() is true, but if it does - // we'll just let it bubble to surface the error. - await selectedPersistence._set(key, userToMigrate.toJSON()); - } - // Attempt to clear the key in other persistences but ignore errors. This helps prevent issues - // such as users getting stuck with a previous account after signing out and refreshing the tab. - await Promise.all(persistenceHierarchy.map(async (persistence) => { - if (persistence !== selectedPersistence) { - try { - await persistence._remove(key); - } - catch (_a) { } - } - })); - return new PersistenceUserManager(selectedPersistence, auth, userKey); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Determine the browser for the purposes of reporting usage to the API - */ -function _getBrowserName(userAgent) { - const ua = userAgent.toLowerCase(); - if (ua.includes('opera/') || ua.includes('opr/') || ua.includes('opios/')) { - return "Opera" /* OPERA */; - } - else if (_isIEMobile(ua)) { - // Windows phone IEMobile browser. - return "IEMobile" /* IEMOBILE */; - } - else if (ua.includes('msie') || ua.includes('trident/')) { - return "IE" /* IE */; - } - else if (ua.includes('edge/')) { - return "Edge" /* EDGE */; - } - else if (_isFirefox(ua)) { - return "Firefox" /* FIREFOX */; - } - else if (ua.includes('silk/')) { - return "Silk" /* SILK */; - } - else if (_isBlackBerry(ua)) { - // Blackberry browser. - return "Blackberry" /* BLACKBERRY */; - } - else if (_isWebOS(ua)) { - // WebOS default browser. - return "Webos" /* WEBOS */; - } - else if (_isSafari(ua)) { - return "Safari" /* SAFARI */; - } - else if ((ua.includes('chrome/') || _isChromeIOS(ua)) && - !ua.includes('edge/')) { - return "Chrome" /* CHROME */; - } - else if (_isAndroid(ua)) { - // Android stock browser. - return "Android" /* ANDROID */; - } - else { - // Most modern browsers have name/version at end of user agent string. - const re = /([a-zA-Z\d\.]+)\/[a-zA-Z\d\.]*$/; - const matches = userAgent.match(re); - if ((matches === null || matches === void 0 ? void 0 : matches.length) === 2) { - return matches[1]; - } - } - return "Other" /* OTHER */; -} -function _isFirefox(ua = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getUA)()) { - return /firefox\//i.test(ua); -} -function _isSafari(userAgent = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getUA)()) { - const ua = userAgent.toLowerCase(); - return (ua.includes('safari/') && - !ua.includes('chrome/') && - !ua.includes('crios/') && - !ua.includes('android')); -} -function _isChromeIOS(ua = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getUA)()) { - return /crios\//i.test(ua); -} -function _isIEMobile(ua = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getUA)()) { - return /iemobile/i.test(ua); -} -function _isAndroid(ua = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getUA)()) { - return /android/i.test(ua); -} -function _isBlackBerry(ua = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getUA)()) { - return /blackberry/i.test(ua); -} -function _isWebOS(ua = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getUA)()) { - return /webos/i.test(ua); -} -function _isIOS(ua = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getUA)()) { - return /iphone|ipad|ipod/i.test(ua); -} -function _isIOS7Or8(ua = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getUA)()) { - return (/(iPad|iPhone|iPod).*OS 7_\d/i.test(ua) || - /(iPad|iPhone|iPod).*OS 8_\d/i.test(ua)); -} -function _isIOSStandalone(ua = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getUA)()) { - var _a; - return _isIOS(ua) && !!((_a = window.navigator) === null || _a === void 0 ? void 0 : _a.standalone); -} -function _isIE10() { - return (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.isIE)() && document.documentMode === 10; -} -function _isMobileBrowser(ua = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getUA)()) { - // TODO: implement getBrowserName equivalent for OS. - return (_isIOS(ua) || - _isAndroid(ua) || - _isWebOS(ua) || - _isBlackBerry(ua) || - /windows phone/i.test(ua) || - _isIEMobile(ua)); -} -function _isIframe() { - try { - // Check that the current window is not the top window. - // If so, return true. - return !!(window && window !== window.top); - } - catch (e) { - return false; - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/* - * Determine the SDK version string - */ -function _getClientVersion(clientPlatform, frameworks = []) { - let reportedPlatform; - switch (clientPlatform) { - case "Browser" /* BROWSER */: - // In a browser environment, report the browser name. - reportedPlatform = _getBrowserName((0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getUA)()); - break; - case "Worker" /* WORKER */: - // Technically a worker runs from a browser but we need to differentiate a - // worker from a browser. - // For example: Chrome-Worker/JsCore/4.9.1/FirebaseCore-web. - reportedPlatform = `${_getBrowserName((0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getUA)())}-${clientPlatform}`; - break; - default: - reportedPlatform = clientPlatform; - } - const reportedFrameworks = frameworks.length - ? frameworks.join(',') - : 'FirebaseCore-web'; /* default value if no other framework is used */ - return `${reportedPlatform}/${"JsCore" /* CORE */}/${_firebase_app__WEBPACK_IMPORTED_MODULE_1__.SDK_VERSION}/${reportedFrameworks}`; -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -class AuthImpl { - constructor(app, heartbeatServiceProvider, config) { - this.app = app; - this.heartbeatServiceProvider = heartbeatServiceProvider; - this.config = config; - this.currentUser = null; - this.emulatorConfig = null; - this.operations = Promise.resolve(); - this.authStateSubscription = new Subscription(this); - this.idTokenSubscription = new Subscription(this); - this.redirectUser = null; - this.isProactiveRefreshEnabled = false; - // Any network calls will set this to true and prevent subsequent emulator - // initialization - this._canInitEmulator = true; - this._isInitialized = false; - this._deleted = false; - this._initializationPromise = null; - this._popupRedirectResolver = null; - this._errorFactory = _DEFAULT_AUTH_ERROR_FACTORY; - // Tracks the last notified UID for state change listeners to prevent - // repeated calls to the callbacks. Undefined means it's never been - // called, whereas null means it's been called with a signed out user - this.lastNotifiedUid = undefined; - this.languageCode = null; - this.tenantId = null; - this.settings = { appVerificationDisabledForTesting: false }; - this.frameworks = []; - this.name = app.name; - this.clientVersion = config.sdkClientVersion; - } - _initializeWithPersistence(persistenceHierarchy, popupRedirectResolver) { - if (popupRedirectResolver) { - this._popupRedirectResolver = _getInstance(popupRedirectResolver); - } - // Have to check for app deletion throughout initialization (after each - // promise resolution) - this._initializationPromise = this.queue(async () => { - var _a, _b; - if (this._deleted) { - return; - } - this.persistenceManager = await PersistenceUserManager.create(this, persistenceHierarchy); - if (this._deleted) { - return; - } - // Initialize the resolver early if necessary (only applicable to web: - // this will cause the iframe to load immediately in certain cases) - if ((_a = this._popupRedirectResolver) === null || _a === void 0 ? void 0 : _a._shouldInitProactively) { - // If this fails, don't halt auth loading - try { - await this._popupRedirectResolver._initialize(this); - } - catch (e) { /* Ignore the error */ } - } - await this.initializeCurrentUser(popupRedirectResolver); - this.lastNotifiedUid = ((_b = this.currentUser) === null || _b === void 0 ? void 0 : _b.uid) || null; - if (this._deleted) { - return; - } - this._isInitialized = true; - }); - return this._initializationPromise; - } - /** - * If the persistence is changed in another window, the user manager will let us know - */ - async _onStorageEvent() { - if (this._deleted) { - return; - } - const user = await this.assertedPersistence.getCurrentUser(); - if (!this.currentUser && !user) { - // No change, do nothing (was signed out and remained signed out). - return; - } - // If the same user is to be synchronized. - if (this.currentUser && user && this.currentUser.uid === user.uid) { - // Data update, simply copy data changes. - this._currentUser._assign(user); - // If tokens changed from previous user tokens, this will trigger - // notifyAuthListeners_. - await this.currentUser.getIdToken(); - return; - } - // Update current Auth state. Either a new login or logout. - await this._updateCurrentUser(user); - } - async initializeCurrentUser(popupRedirectResolver) { - var _a; - // First check to see if we have a pending redirect event. - let storedUser = (await this.assertedPersistence.getCurrentUser()); - if (popupRedirectResolver && this.config.authDomain) { - await this.getOrInitRedirectPersistenceManager(); - const redirectUserEventId = (_a = this.redirectUser) === null || _a === void 0 ? void 0 : _a._redirectEventId; - const storedUserEventId = storedUser === null || storedUser === void 0 ? void 0 : storedUser._redirectEventId; - const result = await this.tryRedirectSignIn(popupRedirectResolver); - // If the stored user (i.e. the old "currentUser") has a redirectId that - // matches the redirect user, then we want to initially sign in with the - // new user object from result. - // TODO(samgho): More thoroughly test all of this - if ((!redirectUserEventId || redirectUserEventId === storedUserEventId) && - (result === null || result === void 0 ? void 0 : result.user)) { - storedUser = result.user; - } - } - // If no user in persistence, there is no current user. Set to null. - if (!storedUser) { - return this.directlySetCurrentUser(null); - } - if (!storedUser._redirectEventId) { - // This isn't a redirect user, we can reload and bail - // This will also catch the redirected user, if available, as that method - // strips the _redirectEventId - return this.reloadAndSetCurrentUserOrClear(storedUser); - } - _assert(this._popupRedirectResolver, this, "argument-error" /* ARGUMENT_ERROR */); - await this.getOrInitRedirectPersistenceManager(); - // If the redirect user's event ID matches the current user's event ID, - // DO NOT reload the current user, otherwise they'll be cleared from storage. - // This is important for the reauthenticateWithRedirect() flow. - if (this.redirectUser && - this.redirectUser._redirectEventId === storedUser._redirectEventId) { - return this.directlySetCurrentUser(storedUser); - } - return this.reloadAndSetCurrentUserOrClear(storedUser); - } - async tryRedirectSignIn(redirectResolver) { - // The redirect user needs to be checked (and signed in if available) - // during auth initialization. All of the normal sign in and link/reauth - // flows call back into auth and push things onto the promise queue. We - // need to await the result of the redirect sign in *inside the promise - // queue*. This presents a problem: we run into deadlock. See: - // ┌> [Initialization] ─────┐ - // ┌> [] │ - // └─ [getRedirectResult] <─┘ - // where [] are tasks on the queue and arrows denote awaits - // Initialization will never complete because it's waiting on something - // that's waiting for initialization to complete! - // - // Instead, this method calls getRedirectResult() (stored in - // _completeRedirectFn) with an optional parameter that instructs all of - // the underlying auth operations to skip anything that mutates auth state. - let result = null; - try { - // We know this._popupRedirectResolver is set since redirectResolver - // is passed in. The _completeRedirectFn expects the unwrapped extern. - result = await this._popupRedirectResolver._completeRedirectFn(this, redirectResolver, true); - } - catch (e) { - // Swallow any errors here; the code can retrieve them in - // getRedirectResult(). - await this._setRedirectUser(null); - } - return result; - } - async reloadAndSetCurrentUserOrClear(user) { - try { - await _reloadWithoutSaving(user); - } - catch (e) { - if (e.code !== `auth/${"network-request-failed" /* NETWORK_REQUEST_FAILED */}`) { - // Something's wrong with the user's token. Log them out and remove - // them from storage - return this.directlySetCurrentUser(null); - } - } - return this.directlySetCurrentUser(user); - } - useDeviceLanguage() { - this.languageCode = _getUserLanguage(); - } - async _delete() { - this._deleted = true; - } - async updateCurrentUser(userExtern) { - // The public updateCurrentUser method needs to make a copy of the user, - // and also check that the project matches - const user = userExtern - ? (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(userExtern) - : null; - if (user) { - _assert(user.auth.config.apiKey === this.config.apiKey, this, "invalid-user-token" /* INVALID_AUTH */); - } - return this._updateCurrentUser(user && user._clone(this)); - } - async _updateCurrentUser(user) { - if (this._deleted) { - return; - } - if (user) { - _assert(this.tenantId === user.tenantId, this, "tenant-id-mismatch" /* TENANT_ID_MISMATCH */); - } - return this.queue(async () => { - await this.directlySetCurrentUser(user); - this.notifyAuthListeners(); - }); - } - async signOut() { - // Clear the redirect user when signOut is called - if (this.redirectPersistenceManager || this._popupRedirectResolver) { - await this._setRedirectUser(null); - } - return this._updateCurrentUser(null); - } - setPersistence(persistence) { - return this.queue(async () => { - await this.assertedPersistence.setPersistence(_getInstance(persistence)); - }); - } - _getPersistence() { - return this.assertedPersistence.persistence.type; - } - _updateErrorMap(errorMap) { - this._errorFactory = new _firebase_util__WEBPACK_IMPORTED_MODULE_0__.ErrorFactory('auth', 'Firebase', errorMap()); - } - onAuthStateChanged(nextOrObserver, error, completed) { - return this.registerStateListener(this.authStateSubscription, nextOrObserver, error, completed); - } - onIdTokenChanged(nextOrObserver, error, completed) { - return this.registerStateListener(this.idTokenSubscription, nextOrObserver, error, completed); - } - toJSON() { - var _a; - return { - apiKey: this.config.apiKey, - authDomain: this.config.authDomain, - appName: this.name, - currentUser: (_a = this._currentUser) === null || _a === void 0 ? void 0 : _a.toJSON() - }; - } - async _setRedirectUser(user, popupRedirectResolver) { - const redirectManager = await this.getOrInitRedirectPersistenceManager(popupRedirectResolver); - return user === null - ? redirectManager.removeCurrentUser() - : redirectManager.setCurrentUser(user); - } - async getOrInitRedirectPersistenceManager(popupRedirectResolver) { - if (!this.redirectPersistenceManager) { - const resolver = (popupRedirectResolver && _getInstance(popupRedirectResolver)) || - this._popupRedirectResolver; - _assert(resolver, this, "argument-error" /* ARGUMENT_ERROR */); - this.redirectPersistenceManager = await PersistenceUserManager.create(this, [_getInstance(resolver._redirectPersistence)], "redirectUser" /* REDIRECT_USER */); - this.redirectUser = - await this.redirectPersistenceManager.getCurrentUser(); - } - return this.redirectPersistenceManager; - } - async _redirectUserForId(id) { - var _a, _b; - // Make sure we've cleared any pending persistence actions if we're not in - // the initializer - if (this._isInitialized) { - await this.queue(async () => { }); - } - if (((_a = this._currentUser) === null || _a === void 0 ? void 0 : _a._redirectEventId) === id) { - return this._currentUser; - } - if (((_b = this.redirectUser) === null || _b === void 0 ? void 0 : _b._redirectEventId) === id) { - return this.redirectUser; - } - return null; - } - async _persistUserIfCurrent(user) { - if (user === this.currentUser) { - return this.queue(async () => this.directlySetCurrentUser(user)); - } - } - /** Notifies listeners only if the user is current */ - _notifyListenersIfCurrent(user) { - if (user === this.currentUser) { - this.notifyAuthListeners(); - } - } - _key() { - return `${this.config.authDomain}:${this.config.apiKey}:${this.name}`; - } - _startProactiveRefresh() { - this.isProactiveRefreshEnabled = true; - if (this.currentUser) { - this._currentUser._startProactiveRefresh(); - } - } - _stopProactiveRefresh() { - this.isProactiveRefreshEnabled = false; - if (this.currentUser) { - this._currentUser._stopProactiveRefresh(); - } - } - /** Returns the current user cast as the internal type */ - get _currentUser() { - return this.currentUser; - } - notifyAuthListeners() { - var _a, _b; - if (!this._isInitialized) { - return; - } - this.idTokenSubscription.next(this.currentUser); - const currentUid = (_b = (_a = this.currentUser) === null || _a === void 0 ? void 0 : _a.uid) !== null && _b !== void 0 ? _b : null; - if (this.lastNotifiedUid !== currentUid) { - this.lastNotifiedUid = currentUid; - this.authStateSubscription.next(this.currentUser); - } - } - registerStateListener(subscription, nextOrObserver, error, completed) { - if (this._deleted) { - return () => { }; - } - const cb = typeof nextOrObserver === 'function' - ? nextOrObserver - : nextOrObserver.next.bind(nextOrObserver); - const promise = this._isInitialized - ? Promise.resolve() - : this._initializationPromise; - _assert(promise, this, "internal-error" /* INTERNAL_ERROR */); - // The callback needs to be called asynchronously per the spec. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - promise.then(() => cb(this.currentUser)); - if (typeof nextOrObserver === 'function') { - return subscription.addObserver(nextOrObserver, error, completed); - } - else { - return subscription.addObserver(nextOrObserver); - } - } - /** - * Unprotected (from race conditions) method to set the current user. This - * should only be called from within a queued callback. This is necessary - * because the queue shouldn't rely on another queued callback. - */ - async directlySetCurrentUser(user) { - if (this.currentUser && this.currentUser !== user) { - this._currentUser._stopProactiveRefresh(); - if (user && this.isProactiveRefreshEnabled) { - user._startProactiveRefresh(); - } - } - this.currentUser = user; - if (user) { - await this.assertedPersistence.setCurrentUser(user); - } - else { - await this.assertedPersistence.removeCurrentUser(); - } - } - queue(action) { - // In case something errors, the callback still should be called in order - // to keep the promise chain alive - this.operations = this.operations.then(action, action); - return this.operations; - } - get assertedPersistence() { - _assert(this.persistenceManager, this, "internal-error" /* INTERNAL_ERROR */); - return this.persistenceManager; - } - _logFramework(framework) { - if (!framework || this.frameworks.includes(framework)) { - return; - } - this.frameworks.push(framework); - // Sort alphabetically so that "FirebaseCore-web,FirebaseUI-web" and - // "FirebaseUI-web,FirebaseCore-web" aren't viewed as different. - this.frameworks.sort(); - this.clientVersion = _getClientVersion(this.config.clientPlatform, this._getFrameworks()); - } - _getFrameworks() { - return this.frameworks; - } - async _getAdditionalHeaders() { - var _a; - // Additional headers on every request - const headers = { - ["X-Client-Version" /* X_CLIENT_VERSION */]: this.clientVersion, - }; - if (this.app.options.appId) { - headers["X-Firebase-gmpid" /* X_FIREBASE_GMPID */] = this.app.options.appId; - } - // If the heartbeat service exists, add the heartbeat string - const heartbeatsHeader = await ((_a = this.heartbeatServiceProvider.getImmediate({ - optional: true, - })) === null || _a === void 0 ? void 0 : _a.getHeartbeatsHeader()); - if (heartbeatsHeader) { - headers["X-Firebase-Client" /* X_FIREBASE_CLIENT */] = heartbeatsHeader; - } - return headers; - } -} -/** - * Method to be used to cast down to our private implmentation of Auth. - * It will also handle unwrapping from the compat type if necessary - * - * @param auth Auth object passed in from developer - */ -function _castAuth(auth) { - return (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(auth); -} -/** Helper class to wrap subscriber logic */ -class Subscription { - constructor(auth) { - this.auth = auth; - this.observer = null; - this.addObserver = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.createSubscribe)(observer => (this.observer = observer)); - } - get next() { - _assert(this.observer, this.auth, "internal-error" /* INTERNAL_ERROR */); - return this.observer.next.bind(this.observer); - } -} - -/** - * Changes the {@link Auth} instance to communicate with the Firebase Auth Emulator, instead of production - * Firebase Auth services. - * - * @remarks - * This must be called synchronously immediately following the first call to - * {@link initializeAuth}. Do not use with production credentials as emulator - * traffic is not encrypted. - * - * - * @example - * ```javascript - * connectAuthEmulator(auth, 'http://127.0.0.1:9099', { disableWarnings: true }); - * ``` - * - * @param auth - The {@link Auth} instance. - * @param url - The URL at which the emulator is running (eg, 'http://localhost:9099'). - * @param options - Optional. `options.disableWarnings` defaults to `false`. Set it to - * `true` to disable the warning banner attached to the DOM. - * - * @public - */ -function connectAuthEmulator(auth, url, options) { - const authInternal = _castAuth(auth); - _assert(authInternal._canInitEmulator, authInternal, "emulator-config-failed" /* EMULATOR_CONFIG_FAILED */); - _assert(/^https?:\/\//.test(url), authInternal, "invalid-emulator-scheme" /* INVALID_EMULATOR_SCHEME */); - const disableWarnings = !!(options === null || options === void 0 ? void 0 : options.disableWarnings); - const protocol = extractProtocol(url); - const { host, port } = extractHostAndPort(url); - const portStr = port === null ? '' : `:${port}`; - // Always replace path with "/" (even if input url had no path at all, or had a different one). - authInternal.config.emulator = { url: `${protocol}//${host}${portStr}/` }; - authInternal.settings.appVerificationDisabledForTesting = true; - authInternal.emulatorConfig = Object.freeze({ - host, - port, - protocol: protocol.replace(':', ''), - options: Object.freeze({ disableWarnings }) - }); - if (!disableWarnings) { - emitEmulatorWarning(); - } -} -function extractProtocol(url) { - const protocolEnd = url.indexOf(':'); - return protocolEnd < 0 ? '' : url.substr(0, protocolEnd + 1); -} -function extractHostAndPort(url) { - const protocol = extractProtocol(url); - const authority = /(\/\/)?([^?#/]+)/.exec(url.substr(protocol.length)); // Between // and /, ? or #. - if (!authority) { - return { host: '', port: null }; - } - const hostAndPort = authority[2].split('@').pop() || ''; // Strip out "username:password@". - const bracketedIPv6 = /^(\[[^\]]+\])(:|$)/.exec(hostAndPort); - if (bracketedIPv6) { - const host = bracketedIPv6[1]; - return { host, port: parsePort(hostAndPort.substr(host.length + 1)) }; - } - else { - const [host, port] = hostAndPort.split(':'); - return { host, port: parsePort(port) }; - } -} -function parsePort(portStr) { - if (!portStr) { - return null; - } - const port = Number(portStr); - if (isNaN(port)) { - return null; - } - return port; -} -function emitEmulatorWarning() { - function attachBanner() { - const el = document.createElement('p'); - const sty = el.style; - el.innerText = - 'Running in emulator mode. Do not use with production credentials.'; - sty.position = 'fixed'; - sty.width = '100%'; - sty.backgroundColor = '#ffffff'; - sty.border = '.1em solid #000000'; - sty.color = '#b50000'; - sty.bottom = '0px'; - sty.left = '0px'; - sty.margin = '0px'; - sty.zIndex = '10000'; - sty.textAlign = 'center'; - el.classList.add('firebase-emulator-warning'); - document.body.appendChild(el); - } - if (typeof console !== 'undefined' && typeof console.info === 'function') { - console.info('WARNING: You are using the Auth Emulator,' + - ' which is intended for local testing only. Do not use with' + - ' production credentials.'); - } - if (typeof window !== 'undefined' && - typeof document !== 'undefined') { - if (document.readyState === 'loading') { - window.addEventListener('DOMContentLoaded', attachBanner); - } - else { - attachBanner(); - } - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Interface that represents the credentials returned by an {@link AuthProvider}. - * - * @remarks - * Implementations specify the details about each auth provider's credential requirements. - * - * @public - */ -class AuthCredential { - /** @internal */ - constructor( - /** - * The authentication provider ID for the credential. - * - * @remarks - * For example, 'facebook.com', or 'google.com'. - */ - providerId, - /** - * The authentication sign in method for the credential. - * - * @remarks - * For example, {@link SignInMethod}.EMAIL_PASSWORD, or - * {@link SignInMethod}.EMAIL_LINK. This corresponds to the sign-in method - * identifier as returned in {@link fetchSignInMethodsForEmail}. - */ - signInMethod) { - this.providerId = providerId; - this.signInMethod = signInMethod; - } - /** - * Returns a JSON-serializable representation of this object. - * - * @returns a JSON-serializable representation of this object. - */ - toJSON() { - return debugFail('not implemented'); - } - /** @internal */ - _getIdTokenResponse(_auth) { - return debugFail('not implemented'); - } - /** @internal */ - _linkToIdToken(_auth, _idToken) { - return debugFail('not implemented'); - } - /** @internal */ - _getReauthenticationResolver(_auth) { - return debugFail('not implemented'); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -async function resetPassword(auth, request) { - return _performApiRequest(auth, "POST" /* POST */, "/v1/accounts:resetPassword" /* RESET_PASSWORD */, _addTidIfNecessary(auth, request)); -} -async function updateEmailPassword(auth, request) { - return _performApiRequest(auth, "POST" /* POST */, "/v1/accounts:update" /* SET_ACCOUNT_INFO */, request); -} -async function applyActionCode$1(auth, request) { - return _performApiRequest(auth, "POST" /* POST */, "/v1/accounts:update" /* SET_ACCOUNT_INFO */, _addTidIfNecessary(auth, request)); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -async function signInWithPassword(auth, request) { - return _performSignInRequest(auth, "POST" /* POST */, "/v1/accounts:signInWithPassword" /* SIGN_IN_WITH_PASSWORD */, _addTidIfNecessary(auth, request)); -} -async function sendOobCode(auth, request) { - return _performApiRequest(auth, "POST" /* POST */, "/v1/accounts:sendOobCode" /* SEND_OOB_CODE */, _addTidIfNecessary(auth, request)); -} -async function sendEmailVerification$1(auth, request) { - return sendOobCode(auth, request); -} -async function sendPasswordResetEmail$1(auth, request) { - return sendOobCode(auth, request); -} -async function sendSignInLinkToEmail$1(auth, request) { - return sendOobCode(auth, request); -} -async function verifyAndChangeEmail(auth, request) { - return sendOobCode(auth, request); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -async function signInWithEmailLink$1(auth, request) { - return _performSignInRequest(auth, "POST" /* POST */, "/v1/accounts:signInWithEmailLink" /* SIGN_IN_WITH_EMAIL_LINK */, _addTidIfNecessary(auth, request)); -} -async function signInWithEmailLinkForLinking(auth, request) { - return _performSignInRequest(auth, "POST" /* POST */, "/v1/accounts:signInWithEmailLink" /* SIGN_IN_WITH_EMAIL_LINK */, _addTidIfNecessary(auth, request)); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Interface that represents the credentials returned by {@link EmailAuthProvider} for - * {@link ProviderId}.PASSWORD - * - * @remarks - * Covers both {@link SignInMethod}.EMAIL_PASSWORD and - * {@link SignInMethod}.EMAIL_LINK. - * - * @public - */ -class EmailAuthCredential extends AuthCredential { - /** @internal */ - constructor( - /** @internal */ - _email, - /** @internal */ - _password, signInMethod, - /** @internal */ - _tenantId = null) { - super("password" /* PASSWORD */, signInMethod); - this._email = _email; - this._password = _password; - this._tenantId = _tenantId; - } - /** @internal */ - static _fromEmailAndPassword(email, password) { - return new EmailAuthCredential(email, password, "password" /* EMAIL_PASSWORD */); - } - /** @internal */ - static _fromEmailAndCode(email, oobCode, tenantId = null) { - return new EmailAuthCredential(email, oobCode, "emailLink" /* EMAIL_LINK */, tenantId); - } - /** {@inheritdoc AuthCredential.toJSON} */ - toJSON() { - return { - email: this._email, - password: this._password, - signInMethod: this.signInMethod, - tenantId: this._tenantId - }; - } - /** - * Static method to deserialize a JSON representation of an object into an {@link AuthCredential}. - * - * @param json - Either `object` or the stringified representation of the object. When string is - * provided, `JSON.parse` would be called first. - * - * @returns If the JSON input does not represent an {@link AuthCredential}, null is returned. - */ - static fromJSON(json) { - const obj = typeof json === 'string' ? JSON.parse(json) : json; - if ((obj === null || obj === void 0 ? void 0 : obj.email) && (obj === null || obj === void 0 ? void 0 : obj.password)) { - if (obj.signInMethod === "password" /* EMAIL_PASSWORD */) { - return this._fromEmailAndPassword(obj.email, obj.password); - } - else if (obj.signInMethod === "emailLink" /* EMAIL_LINK */) { - return this._fromEmailAndCode(obj.email, obj.password, obj.tenantId); - } - } - return null; - } - /** @internal */ - async _getIdTokenResponse(auth) { - switch (this.signInMethod) { - case "password" /* EMAIL_PASSWORD */: - return signInWithPassword(auth, { - returnSecureToken: true, - email: this._email, - password: this._password - }); - case "emailLink" /* EMAIL_LINK */: - return signInWithEmailLink$1(auth, { - email: this._email, - oobCode: this._password - }); - default: - _fail(auth, "internal-error" /* INTERNAL_ERROR */); - } - } - /** @internal */ - async _linkToIdToken(auth, idToken) { - switch (this.signInMethod) { - case "password" /* EMAIL_PASSWORD */: - return updateEmailPassword(auth, { - idToken, - returnSecureToken: true, - email: this._email, - password: this._password - }); - case "emailLink" /* EMAIL_LINK */: - return signInWithEmailLinkForLinking(auth, { - idToken, - email: this._email, - oobCode: this._password - }); - default: - _fail(auth, "internal-error" /* INTERNAL_ERROR */); - } - } - /** @internal */ - _getReauthenticationResolver(auth) { - return this._getIdTokenResponse(auth); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -async function signInWithIdp(auth, request) { - return _performSignInRequest(auth, "POST" /* POST */, "/v1/accounts:signInWithIdp" /* SIGN_IN_WITH_IDP */, _addTidIfNecessary(auth, request)); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const IDP_REQUEST_URI$1 = 'http://localhost'; -/** - * Represents the OAuth credentials returned by an {@link OAuthProvider}. - * - * @remarks - * Implementations specify the details about each auth provider's credential requirements. - * - * @public - */ -class OAuthCredential extends AuthCredential { - constructor() { - super(...arguments); - this.pendingToken = null; - } - /** @internal */ - static _fromParams(params) { - const cred = new OAuthCredential(params.providerId, params.signInMethod); - if (params.idToken || params.accessToken) { - // OAuth 2 and either ID token or access token. - if (params.idToken) { - cred.idToken = params.idToken; - } - if (params.accessToken) { - cred.accessToken = params.accessToken; - } - // Add nonce if available and no pendingToken is present. - if (params.nonce && !params.pendingToken) { - cred.nonce = params.nonce; - } - if (params.pendingToken) { - cred.pendingToken = params.pendingToken; - } - } - else if (params.oauthToken && params.oauthTokenSecret) { - // OAuth 1 and OAuth token with token secret - cred.accessToken = params.oauthToken; - cred.secret = params.oauthTokenSecret; - } - else { - _fail("argument-error" /* ARGUMENT_ERROR */); - } - return cred; - } - /** {@inheritdoc AuthCredential.toJSON} */ - toJSON() { - return { - idToken: this.idToken, - accessToken: this.accessToken, - secret: this.secret, - nonce: this.nonce, - pendingToken: this.pendingToken, - providerId: this.providerId, - signInMethod: this.signInMethod - }; - } - /** - * Static method to deserialize a JSON representation of an object into an - * {@link AuthCredential}. - * - * @param json - Input can be either Object or the stringified representation of the object. - * When string is provided, JSON.parse would be called first. - * - * @returns If the JSON input does not represent an {@link AuthCredential}, null is returned. - */ - static fromJSON(json) { - const obj = typeof json === 'string' ? JSON.parse(json) : json; - const { providerId, signInMethod } = obj, rest = (0,tslib__WEBPACK_IMPORTED_MODULE_4__.__rest)(obj, ["providerId", "signInMethod"]); - if (!providerId || !signInMethod) { - return null; - } - const cred = new OAuthCredential(providerId, signInMethod); - cred.idToken = rest.idToken || undefined; - cred.accessToken = rest.accessToken || undefined; - cred.secret = rest.secret; - cred.nonce = rest.nonce; - cred.pendingToken = rest.pendingToken || null; - return cred; - } - /** @internal */ - _getIdTokenResponse(auth) { - const request = this.buildRequest(); - return signInWithIdp(auth, request); - } - /** @internal */ - _linkToIdToken(auth, idToken) { - const request = this.buildRequest(); - request.idToken = idToken; - return signInWithIdp(auth, request); - } - /** @internal */ - _getReauthenticationResolver(auth) { - const request = this.buildRequest(); - request.autoCreate = false; - return signInWithIdp(auth, request); - } - buildRequest() { - const request = { - requestUri: IDP_REQUEST_URI$1, - returnSecureToken: true - }; - if (this.pendingToken) { - request.pendingToken = this.pendingToken; - } - else { - const postBody = {}; - if (this.idToken) { - postBody['id_token'] = this.idToken; - } - if (this.accessToken) { - postBody['access_token'] = this.accessToken; - } - if (this.secret) { - postBody['oauth_token_secret'] = this.secret; - } - postBody['providerId'] = this.providerId; - if (this.nonce && !this.pendingToken) { - postBody['nonce'] = this.nonce; - } - request.postBody = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.querystring)(postBody); - } - return request; - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -async function sendPhoneVerificationCode(auth, request) { - return _performApiRequest(auth, "POST" /* POST */, "/v1/accounts:sendVerificationCode" /* SEND_VERIFICATION_CODE */, _addTidIfNecessary(auth, request)); -} -async function signInWithPhoneNumber$1(auth, request) { - return _performSignInRequest(auth, "POST" /* POST */, "/v1/accounts:signInWithPhoneNumber" /* SIGN_IN_WITH_PHONE_NUMBER */, _addTidIfNecessary(auth, request)); -} -async function linkWithPhoneNumber$1(auth, request) { - const response = await _performSignInRequest(auth, "POST" /* POST */, "/v1/accounts:signInWithPhoneNumber" /* SIGN_IN_WITH_PHONE_NUMBER */, _addTidIfNecessary(auth, request)); - if (response.temporaryProof) { - throw _makeTaggedError(auth, "account-exists-with-different-credential" /* NEED_CONFIRMATION */, response); - } - return response; -} -const VERIFY_PHONE_NUMBER_FOR_EXISTING_ERROR_MAP_ = { - ["USER_NOT_FOUND" /* USER_NOT_FOUND */]: "user-not-found" /* USER_DELETED */ -}; -async function verifyPhoneNumberForExisting(auth, request) { - const apiRequest = Object.assign(Object.assign({}, request), { operation: 'REAUTH' }); - return _performSignInRequest(auth, "POST" /* POST */, "/v1/accounts:signInWithPhoneNumber" /* SIGN_IN_WITH_PHONE_NUMBER */, _addTidIfNecessary(auth, apiRequest), VERIFY_PHONE_NUMBER_FOR_EXISTING_ERROR_MAP_); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Represents the credentials returned by {@link PhoneAuthProvider}. - * - * @public - */ -class PhoneAuthCredential extends AuthCredential { - constructor(params) { - super("phone" /* PHONE */, "phone" /* PHONE */); - this.params = params; - } - /** @internal */ - static _fromVerification(verificationId, verificationCode) { - return new PhoneAuthCredential({ verificationId, verificationCode }); - } - /** @internal */ - static _fromTokenResponse(phoneNumber, temporaryProof) { - return new PhoneAuthCredential({ phoneNumber, temporaryProof }); - } - /** @internal */ - _getIdTokenResponse(auth) { - return signInWithPhoneNumber$1(auth, this._makeVerificationRequest()); - } - /** @internal */ - _linkToIdToken(auth, idToken) { - return linkWithPhoneNumber$1(auth, Object.assign({ idToken }, this._makeVerificationRequest())); - } - /** @internal */ - _getReauthenticationResolver(auth) { - return verifyPhoneNumberForExisting(auth, this._makeVerificationRequest()); - } - /** @internal */ - _makeVerificationRequest() { - const { temporaryProof, phoneNumber, verificationId, verificationCode } = this.params; - if (temporaryProof && phoneNumber) { - return { temporaryProof, phoneNumber }; - } - return { - sessionInfo: verificationId, - code: verificationCode - }; - } - /** {@inheritdoc AuthCredential.toJSON} */ - toJSON() { - const obj = { - providerId: this.providerId - }; - if (this.params.phoneNumber) { - obj.phoneNumber = this.params.phoneNumber; - } - if (this.params.temporaryProof) { - obj.temporaryProof = this.params.temporaryProof; - } - if (this.params.verificationCode) { - obj.verificationCode = this.params.verificationCode; - } - if (this.params.verificationId) { - obj.verificationId = this.params.verificationId; - } - return obj; - } - /** Generates a phone credential based on a plain object or a JSON string. */ - static fromJSON(json) { - if (typeof json === 'string') { - json = JSON.parse(json); - } - const { verificationId, verificationCode, phoneNumber, temporaryProof } = json; - if (!verificationCode && - !verificationId && - !phoneNumber && - !temporaryProof) { - return null; - } - return new PhoneAuthCredential({ - verificationId, - verificationCode, - phoneNumber, - temporaryProof - }); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Maps the mode string in action code URL to Action Code Info operation. - * - * @param mode - */ -function parseMode(mode) { - switch (mode) { - case 'recoverEmail': - return "RECOVER_EMAIL" /* RECOVER_EMAIL */; - case 'resetPassword': - return "PASSWORD_RESET" /* PASSWORD_RESET */; - case 'signIn': - return "EMAIL_SIGNIN" /* EMAIL_SIGNIN */; - case 'verifyEmail': - return "VERIFY_EMAIL" /* VERIFY_EMAIL */; - case 'verifyAndChangeEmail': - return "VERIFY_AND_CHANGE_EMAIL" /* VERIFY_AND_CHANGE_EMAIL */; - case 'revertSecondFactorAddition': - return "REVERT_SECOND_FACTOR_ADDITION" /* REVERT_SECOND_FACTOR_ADDITION */; - default: - return null; - } -} -/** - * Helper to parse FDL links - * - * @param url - */ -function parseDeepLink(url) { - const link = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.querystringDecode)((0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.extractQuerystring)(url))['link']; - // Double link case (automatic redirect). - const doubleDeepLink = link - ? (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.querystringDecode)((0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.extractQuerystring)(link))['deep_link_id'] - : null; - // iOS custom scheme links. - const iOSDeepLink = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.querystringDecode)((0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.extractQuerystring)(url))['deep_link_id']; - const iOSDoubleDeepLink = iOSDeepLink - ? (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.querystringDecode)((0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.extractQuerystring)(iOSDeepLink))['link'] - : null; - return iOSDoubleDeepLink || iOSDeepLink || doubleDeepLink || link || url; -} -/** - * A utility class to parse email action URLs such as password reset, email verification, - * email link sign in, etc. - * - * @public - */ -class ActionCodeURL { - /** - * @param actionLink - The link from which to extract the URL. - * @returns The {@link ActionCodeURL} object, or null if the link is invalid. - * - * @internal - */ - constructor(actionLink) { - var _a, _b, _c, _d, _e, _f; - const searchParams = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.querystringDecode)((0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.extractQuerystring)(actionLink)); - const apiKey = (_a = searchParams["apiKey" /* API_KEY */]) !== null && _a !== void 0 ? _a : null; - const code = (_b = searchParams["oobCode" /* CODE */]) !== null && _b !== void 0 ? _b : null; - const operation = parseMode((_c = searchParams["mode" /* MODE */]) !== null && _c !== void 0 ? _c : null); - // Validate API key, code and mode. - _assert(apiKey && code && operation, "argument-error" /* ARGUMENT_ERROR */); - this.apiKey = apiKey; - this.operation = operation; - this.code = code; - this.continueUrl = (_d = searchParams["continueUrl" /* CONTINUE_URL */]) !== null && _d !== void 0 ? _d : null; - this.languageCode = (_e = searchParams["languageCode" /* LANGUAGE_CODE */]) !== null && _e !== void 0 ? _e : null; - this.tenantId = (_f = searchParams["tenantId" /* TENANT_ID */]) !== null && _f !== void 0 ? _f : null; - } - /** - * Parses the email action link string and returns an {@link ActionCodeURL} if the link is valid, - * otherwise returns null. - * - * @param link - The email action link string. - * @returns The {@link ActionCodeURL} object, or null if the link is invalid. - * - * @public - */ - static parseLink(link) { - const actionLink = parseDeepLink(link); - try { - return new ActionCodeURL(actionLink); - } - catch (_a) { - return null; - } - } -} -/** - * Parses the email action link string and returns an {@link ActionCodeURL} if - * the link is valid, otherwise returns null. - * - * @public - */ -function parseActionCodeURL(link) { - return ActionCodeURL.parseLink(link); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Provider for generating {@link EmailAuthCredential}. - * - * @public - */ -class EmailAuthProvider { - constructor() { - /** - * Always set to {@link ProviderId}.PASSWORD, even for email link. - */ - this.providerId = EmailAuthProvider.PROVIDER_ID; - } - /** - * Initialize an {@link AuthCredential} using an email and password. - * - * @example - * ```javascript - * const authCredential = EmailAuthProvider.credential(email, password); - * const userCredential = await signInWithCredential(auth, authCredential); - * ``` - * - * @example - * ```javascript - * const userCredential = await signInWithEmailAndPassword(auth, email, password); - * ``` - * - * @param email - Email address. - * @param password - User account password. - * @returns The auth provider credential. - */ - static credential(email, password) { - return EmailAuthCredential._fromEmailAndPassword(email, password); - } - /** - * Initialize an {@link AuthCredential} using an email and an email link after a sign in with - * email link operation. - * - * @example - * ```javascript - * const authCredential = EmailAuthProvider.credentialWithLink(auth, email, emailLink); - * const userCredential = await signInWithCredential(auth, authCredential); - * ``` - * - * @example - * ```javascript - * await sendSignInLinkToEmail(auth, email); - * // Obtain emailLink from user. - * const userCredential = await signInWithEmailLink(auth, email, emailLink); - * ``` - * - * @param auth - The {@link Auth} instance used to verify the link. - * @param email - Email address. - * @param emailLink - Sign-in email link. - * @returns - The auth provider credential. - */ - static credentialWithLink(email, emailLink) { - const actionCodeUrl = ActionCodeURL.parseLink(emailLink); - _assert(actionCodeUrl, "argument-error" /* ARGUMENT_ERROR */); - return EmailAuthCredential._fromEmailAndCode(email, actionCodeUrl.code, actionCodeUrl.tenantId); - } -} -/** - * Always set to {@link ProviderId}.PASSWORD, even for email link. - */ -EmailAuthProvider.PROVIDER_ID = "password" /* PASSWORD */; -/** - * Always set to {@link SignInMethod}.EMAIL_PASSWORD. - */ -EmailAuthProvider.EMAIL_PASSWORD_SIGN_IN_METHOD = "password" /* EMAIL_PASSWORD */; -/** - * Always set to {@link SignInMethod}.EMAIL_LINK. - */ -EmailAuthProvider.EMAIL_LINK_SIGN_IN_METHOD = "emailLink" /* EMAIL_LINK */; - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * The base class for all Federated providers (OAuth (including OIDC), SAML). - * - * This class is not meant to be instantiated directly. - * - * @public - */ -class FederatedAuthProvider { - /** - * Constructor for generic OAuth providers. - * - * @param providerId - Provider for which credentials should be generated. - */ - constructor(providerId) { - this.providerId = providerId; - /** @internal */ - this.defaultLanguageCode = null; - /** @internal */ - this.customParameters = {}; - } - /** - * Set the language gode. - * - * @param languageCode - language code - */ - setDefaultLanguage(languageCode) { - this.defaultLanguageCode = languageCode; - } - /** - * Sets the OAuth custom parameters to pass in an OAuth request for popup and redirect sign-in - * operations. - * - * @remarks - * For a detailed list, check the reserved required OAuth 2.0 parameters such as `client_id`, - * `redirect_uri`, `scope`, `response_type`, and `state` are not allowed and will be ignored. - * - * @param customOAuthParameters - The custom OAuth parameters to pass in the OAuth request. - */ - setCustomParameters(customOAuthParameters) { - this.customParameters = customOAuthParameters; - return this; - } - /** - * Retrieve the current list of {@link CustomParameters}. - */ - getCustomParameters() { - return this.customParameters; - } -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Common code to all OAuth providers. This is separate from the - * {@link OAuthProvider} so that child providers (like - * {@link GoogleAuthProvider}) don't inherit the `credential` instance method. - * Instead, they rely on a static `credential` method. - */ -class BaseOAuthProvider extends FederatedAuthProvider { - constructor() { - super(...arguments); - /** @internal */ - this.scopes = []; - } - /** - * Add an OAuth scope to the credential. - * - * @param scope - Provider OAuth scope to add. - */ - addScope(scope) { - // If not already added, add scope to list. - if (!this.scopes.includes(scope)) { - this.scopes.push(scope); - } - return this; - } - /** - * Retrieve the current list of OAuth scopes. - */ - getScopes() { - return [...this.scopes]; - } -} -/** - * Provider for generating generic {@link OAuthCredential}. - * - * @example - * ```javascript - * // Sign in using a redirect. - * const provider = new OAuthProvider('google.com'); - * // Start a sign in process for an unauthenticated user. - * provider.addScope('profile'); - * provider.addScope('email'); - * await signInWithRedirect(auth, provider); - * // This will trigger a full page redirect away from your app - * - * // After returning from the redirect when your app initializes you can obtain the result - * const result = await getRedirectResult(auth); - * if (result) { - * // This is the signed-in user - * const user = result.user; - * // This gives you a OAuth Access Token for the provider. - * const credential = provider.credentialFromResult(auth, result); - * const token = credential.accessToken; - * } - * ``` - * - * @example - * ```javascript - * // Sign in using a popup. - * const provider = new OAuthProvider('google.com'); - * provider.addScope('profile'); - * provider.addScope('email'); - * const result = await signInWithPopup(auth, provider); - * - * // The signed-in user info. - * const user = result.user; - * // This gives you a OAuth Access Token for the provider. - * const credential = provider.credentialFromResult(auth, result); - * const token = credential.accessToken; - * ``` - * @public - */ -class OAuthProvider extends BaseOAuthProvider { - /** - * Creates an {@link OAuthCredential} from a JSON string or a plain object. - * @param json - A plain object or a JSON string - */ - static credentialFromJSON(json) { - const obj = typeof json === 'string' ? JSON.parse(json) : json; - _assert('providerId' in obj && 'signInMethod' in obj, "argument-error" /* ARGUMENT_ERROR */); - return OAuthCredential._fromParams(obj); - } - /** - * Creates a {@link OAuthCredential} from a generic OAuth provider's access token or ID token. - * - * @remarks - * The raw nonce is required when an ID token with a nonce field is provided. The SHA-256 hash of - * the raw nonce must match the nonce field in the ID token. - * - * @example - * ```javascript - * // `googleUser` from the onsuccess Google Sign In callback. - * // Initialize a generate OAuth provider with a `google.com` providerId. - * const provider = new OAuthProvider('google.com'); - * const credential = provider.credential({ - * idToken: googleUser.getAuthResponse().id_token, - * }); - * const result = await signInWithCredential(credential); - * ``` - * - * @param params - Either the options object containing the ID token, access token and raw nonce - * or the ID token string. - */ - credential(params) { - return this._credential(Object.assign(Object.assign({}, params), { nonce: params.rawNonce })); - } - /** An internal credential method that accepts more permissive options */ - _credential(params) { - _assert(params.idToken || params.accessToken, "argument-error" /* ARGUMENT_ERROR */); - // For OAuthCredential, sign in method is same as providerId. - return OAuthCredential._fromParams(Object.assign(Object.assign({}, params), { providerId: this.providerId, signInMethod: this.providerId })); - } - /** - * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}. - * - * @param userCredential - The user credential. - */ - static credentialFromResult(userCredential) { - return OAuthProvider.oauthCredentialFromTaggedObject(userCredential); - } - /** - * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was - * thrown during a sign-in, link, or reauthenticate operation. - * - * @param userCredential - The user credential. - */ - static credentialFromError(error) { - return OAuthProvider.oauthCredentialFromTaggedObject((error.customData || {})); - } - static oauthCredentialFromTaggedObject({ _tokenResponse: tokenResponse }) { - if (!tokenResponse) { - return null; - } - const { oauthIdToken, oauthAccessToken, oauthTokenSecret, pendingToken, nonce, providerId } = tokenResponse; - if (!oauthAccessToken && - !oauthTokenSecret && - !oauthIdToken && - !pendingToken) { - return null; - } - if (!providerId) { - return null; - } - try { - return new OAuthProvider(providerId)._credential({ - idToken: oauthIdToken, - accessToken: oauthAccessToken, - nonce, - pendingToken - }); - } - catch (e) { - return null; - } - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Provider for generating an {@link OAuthCredential} for {@link ProviderId}.FACEBOOK. - * - * @example - * ```javascript - * // Sign in using a redirect. - * const provider = new FacebookAuthProvider(); - * // Start a sign in process for an unauthenticated user. - * provider.addScope('user_birthday'); - * await signInWithRedirect(auth, provider); - * // This will trigger a full page redirect away from your app - * - * // After returning from the redirect when your app initializes you can obtain the result - * const result = await getRedirectResult(auth); - * if (result) { - * // This is the signed-in user - * const user = result.user; - * // This gives you a Facebook Access Token. - * const credential = FacebookAuthProvider.credentialFromResult(result); - * const token = credential.accessToken; - * } - * ``` - * - * @example - * ```javascript - * // Sign in using a popup. - * const provider = new FacebookAuthProvider(); - * provider.addScope('user_birthday'); - * const result = await signInWithPopup(auth, provider); - * - * // The signed-in user info. - * const user = result.user; - * // This gives you a Facebook Access Token. - * const credential = FacebookAuthProvider.credentialFromResult(result); - * const token = credential.accessToken; - * ``` - * - * @public - */ -class FacebookAuthProvider extends BaseOAuthProvider { - constructor() { - super("facebook.com" /* FACEBOOK */); - } - /** - * Creates a credential for Facebook. - * - * @example - * ```javascript - * // `event` from the Facebook auth.authResponseChange callback. - * const credential = FacebookAuthProvider.credential(event.authResponse.accessToken); - * const result = await signInWithCredential(credential); - * ``` - * - * @param accessToken - Facebook access token. - */ - static credential(accessToken) { - return OAuthCredential._fromParams({ - providerId: FacebookAuthProvider.PROVIDER_ID, - signInMethod: FacebookAuthProvider.FACEBOOK_SIGN_IN_METHOD, - accessToken - }); - } - /** - * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}. - * - * @param userCredential - The user credential. - */ - static credentialFromResult(userCredential) { - return FacebookAuthProvider.credentialFromTaggedObject(userCredential); - } - /** - * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was - * thrown during a sign-in, link, or reauthenticate operation. - * - * @param userCredential - The user credential. - */ - static credentialFromError(error) { - return FacebookAuthProvider.credentialFromTaggedObject((error.customData || {})); - } - static credentialFromTaggedObject({ _tokenResponse: tokenResponse }) { - if (!tokenResponse || !('oauthAccessToken' in tokenResponse)) { - return null; - } - if (!tokenResponse.oauthAccessToken) { - return null; - } - try { - return FacebookAuthProvider.credential(tokenResponse.oauthAccessToken); - } - catch (_a) { - return null; - } - } -} -/** Always set to {@link SignInMethod}.FACEBOOK. */ -FacebookAuthProvider.FACEBOOK_SIGN_IN_METHOD = "facebook.com" /* FACEBOOK */; -/** Always set to {@link ProviderId}.FACEBOOK. */ -FacebookAuthProvider.PROVIDER_ID = "facebook.com" /* FACEBOOK */; - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Provider for generating an an {@link OAuthCredential} for {@link ProviderId}.GOOGLE. - * - * @example - * ```javascript - * // Sign in using a redirect. - * const provider = new GoogleAuthProvider(); - * // Start a sign in process for an unauthenticated user. - * provider.addScope('profile'); - * provider.addScope('email'); - * await signInWithRedirect(auth, provider); - * // This will trigger a full page redirect away from your app - * - * // After returning from the redirect when your app initializes you can obtain the result - * const result = await getRedirectResult(auth); - * if (result) { - * // This is the signed-in user - * const user = result.user; - * // This gives you a Google Access Token. - * const credential = GoogleAuthProvider.credentialFromResult(result); - * const token = credential.accessToken; - * } - * ``` - * - * @example - * ```javascript - * // Sign in using a popup. - * const provider = new GoogleAuthProvider(); - * provider.addScope('profile'); - * provider.addScope('email'); - * const result = await signInWithPopup(auth, provider); - * - * // The signed-in user info. - * const user = result.user; - * // This gives you a Google Access Token. - * const credential = GoogleAuthProvider.credentialFromResult(result); - * const token = credential.accessToken; - * ``` - * - * @public - */ -class GoogleAuthProvider extends BaseOAuthProvider { - constructor() { - super("google.com" /* GOOGLE */); - this.addScope('profile'); - } - /** - * Creates a credential for Google. At least one of ID token and access token is required. - * - * @example - * ```javascript - * // \`googleUser\` from the onsuccess Google Sign In callback. - * const credential = GoogleAuthProvider.credential(googleUser.getAuthResponse().id_token); - * const result = await signInWithCredential(credential); - * ``` - * - * @param idToken - Google ID token. - * @param accessToken - Google access token. - */ - static credential(idToken, accessToken) { - return OAuthCredential._fromParams({ - providerId: GoogleAuthProvider.PROVIDER_ID, - signInMethod: GoogleAuthProvider.GOOGLE_SIGN_IN_METHOD, - idToken, - accessToken - }); - } - /** - * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}. - * - * @param userCredential - The user credential. - */ - static credentialFromResult(userCredential) { - return GoogleAuthProvider.credentialFromTaggedObject(userCredential); - } - /** - * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was - * thrown during a sign-in, link, or reauthenticate operation. - * - * @param userCredential - The user credential. - */ - static credentialFromError(error) { - return GoogleAuthProvider.credentialFromTaggedObject((error.customData || {})); - } - static credentialFromTaggedObject({ _tokenResponse: tokenResponse }) { - if (!tokenResponse) { - return null; - } - const { oauthIdToken, oauthAccessToken } = tokenResponse; - if (!oauthIdToken && !oauthAccessToken) { - // This could be an oauth 1 credential or a phone credential - return null; - } - try { - return GoogleAuthProvider.credential(oauthIdToken, oauthAccessToken); - } - catch (_a) { - return null; - } - } -} -/** Always set to {@link SignInMethod}.GOOGLE. */ -GoogleAuthProvider.GOOGLE_SIGN_IN_METHOD = "google.com" /* GOOGLE */; -/** Always set to {@link ProviderId}.GOOGLE. */ -GoogleAuthProvider.PROVIDER_ID = "google.com" /* GOOGLE */; - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Provider for generating an {@link OAuthCredential} for {@link ProviderId}.GITHUB. - * - * @remarks - * GitHub requires an OAuth 2.0 redirect, so you can either handle the redirect directly, or use - * the {@link signInWithPopup} handler: - * - * @example - * ```javascript - * // Sign in using a redirect. - * const provider = new GithubAuthProvider(); - * // Start a sign in process for an unauthenticated user. - * provider.addScope('repo'); - * await signInWithRedirect(auth, provider); - * // This will trigger a full page redirect away from your app - * - * // After returning from the redirect when your app initializes you can obtain the result - * const result = await getRedirectResult(auth); - * if (result) { - * // This is the signed-in user - * const user = result.user; - * // This gives you a Github Access Token. - * const credential = GithubAuthProvider.credentialFromResult(result); - * const token = credential.accessToken; - * } - * ``` - * - * @example - * ```javascript - * // Sign in using a popup. - * const provider = new GithubAuthProvider(); - * provider.addScope('repo'); - * const result = await signInWithPopup(auth, provider); - * - * // The signed-in user info. - * const user = result.user; - * // This gives you a Github Access Token. - * const credential = GithubAuthProvider.credentialFromResult(result); - * const token = credential.accessToken; - * ``` - * @public - */ -class GithubAuthProvider extends BaseOAuthProvider { - constructor() { - super("github.com" /* GITHUB */); - } - /** - * Creates a credential for Github. - * - * @param accessToken - Github access token. - */ - static credential(accessToken) { - return OAuthCredential._fromParams({ - providerId: GithubAuthProvider.PROVIDER_ID, - signInMethod: GithubAuthProvider.GITHUB_SIGN_IN_METHOD, - accessToken - }); - } - /** - * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}. - * - * @param userCredential - The user credential. - */ - static credentialFromResult(userCredential) { - return GithubAuthProvider.credentialFromTaggedObject(userCredential); - } - /** - * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was - * thrown during a sign-in, link, or reauthenticate operation. - * - * @param userCredential - The user credential. - */ - static credentialFromError(error) { - return GithubAuthProvider.credentialFromTaggedObject((error.customData || {})); - } - static credentialFromTaggedObject({ _tokenResponse: tokenResponse }) { - if (!tokenResponse || !('oauthAccessToken' in tokenResponse)) { - return null; - } - if (!tokenResponse.oauthAccessToken) { - return null; - } - try { - return GithubAuthProvider.credential(tokenResponse.oauthAccessToken); - } - catch (_a) { - return null; - } - } -} -/** Always set to {@link SignInMethod}.GITHUB. */ -GithubAuthProvider.GITHUB_SIGN_IN_METHOD = "github.com" /* GITHUB */; -/** Always set to {@link ProviderId}.GITHUB. */ -GithubAuthProvider.PROVIDER_ID = "github.com" /* GITHUB */; - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const IDP_REQUEST_URI = 'http://localhost'; -/** - * @public - */ -class SAMLAuthCredential extends AuthCredential { - /** @internal */ - constructor(providerId, pendingToken) { - super(providerId, providerId); - this.pendingToken = pendingToken; - } - /** @internal */ - _getIdTokenResponse(auth) { - const request = this.buildRequest(); - return signInWithIdp(auth, request); - } - /** @internal */ - _linkToIdToken(auth, idToken) { - const request = this.buildRequest(); - request.idToken = idToken; - return signInWithIdp(auth, request); - } - /** @internal */ - _getReauthenticationResolver(auth) { - const request = this.buildRequest(); - request.autoCreate = false; - return signInWithIdp(auth, request); - } - /** {@inheritdoc AuthCredential.toJSON} */ - toJSON() { - return { - signInMethod: this.signInMethod, - providerId: this.providerId, - pendingToken: this.pendingToken - }; - } - /** - * Static method to deserialize a JSON representation of an object into an - * {@link AuthCredential}. - * - * @param json - Input can be either Object or the stringified representation of the object. - * When string is provided, JSON.parse would be called first. - * - * @returns If the JSON input does not represent an {@link AuthCredential}, null is returned. - */ - static fromJSON(json) { - const obj = typeof json === 'string' ? JSON.parse(json) : json; - const { providerId, signInMethod, pendingToken } = obj; - if (!providerId || - !signInMethod || - !pendingToken || - providerId !== signInMethod) { - return null; - } - return new SAMLAuthCredential(providerId, pendingToken); - } - /** - * Helper static method to avoid exposing the constructor to end users. - * - * @internal - */ - static _create(providerId, pendingToken) { - return new SAMLAuthCredential(providerId, pendingToken); - } - buildRequest() { - return { - requestUri: IDP_REQUEST_URI, - returnSecureToken: true, - pendingToken: this.pendingToken - }; - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const SAML_PROVIDER_PREFIX = 'saml.'; -/** - * An {@link AuthProvider} for SAML. - * - * @public - */ -class SAMLAuthProvider extends FederatedAuthProvider { - /** - * Constructor. The providerId must start with "saml." - * @param providerId - SAML provider ID. - */ - constructor(providerId) { - _assert(providerId.startsWith(SAML_PROVIDER_PREFIX), "argument-error" /* ARGUMENT_ERROR */); - super(providerId); - } - /** - * Generates an {@link AuthCredential} from a {@link UserCredential} after a - * successful SAML flow completes. - * - * @remarks - * - * For example, to get an {@link AuthCredential}, you could write the - * following code: - * - * ```js - * const userCredential = await signInWithPopup(auth, samlProvider); - * const credential = SAMLAuthProvider.credentialFromResult(userCredential); - * ``` - * - * @param userCredential - The user credential. - */ - static credentialFromResult(userCredential) { - return SAMLAuthProvider.samlCredentialFromTaggedObject(userCredential); - } - /** - * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was - * thrown during a sign-in, link, or reauthenticate operation. - * - * @param userCredential - The user credential. - */ - static credentialFromError(error) { - return SAMLAuthProvider.samlCredentialFromTaggedObject((error.customData || {})); - } - /** - * Creates an {@link AuthCredential} from a JSON string or a plain object. - * @param json - A plain object or a JSON string - */ - static credentialFromJSON(json) { - const credential = SAMLAuthCredential.fromJSON(json); - _assert(credential, "argument-error" /* ARGUMENT_ERROR */); - return credential; - } - static samlCredentialFromTaggedObject({ _tokenResponse: tokenResponse }) { - if (!tokenResponse) { - return null; - } - const { pendingToken, providerId } = tokenResponse; - if (!pendingToken || !providerId) { - return null; - } - try { - return SAMLAuthCredential._create(providerId, pendingToken); - } - catch (e) { - return null; - } - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Provider for generating an {@link OAuthCredential} for {@link ProviderId}.TWITTER. - * - * @example - * ```javascript - * // Sign in using a redirect. - * const provider = new TwitterAuthProvider(); - * // Start a sign in process for an unauthenticated user. - * await signInWithRedirect(auth, provider); - * // This will trigger a full page redirect away from your app - * - * // After returning from the redirect when your app initializes you can obtain the result - * const result = await getRedirectResult(auth); - * if (result) { - * // This is the signed-in user - * const user = result.user; - * // This gives you a Twitter Access Token and Secret. - * const credential = TwitterAuthProvider.credentialFromResult(result); - * const token = credential.accessToken; - * const secret = credential.secret; - * } - * ``` - * - * @example - * ```javascript - * // Sign in using a popup. - * const provider = new TwitterAuthProvider(); - * const result = await signInWithPopup(auth, provider); - * - * // The signed-in user info. - * const user = result.user; - * // This gives you a Twitter Access Token and Secret. - * const credential = TwitterAuthProvider.credentialFromResult(result); - * const token = credential.accessToken; - * const secret = credential.secret; - * ``` - * - * @public - */ -class TwitterAuthProvider extends BaseOAuthProvider { - constructor() { - super("twitter.com" /* TWITTER */); - } - /** - * Creates a credential for Twitter. - * - * @param token - Twitter access token. - * @param secret - Twitter secret. - */ - static credential(token, secret) { - return OAuthCredential._fromParams({ - providerId: TwitterAuthProvider.PROVIDER_ID, - signInMethod: TwitterAuthProvider.TWITTER_SIGN_IN_METHOD, - oauthToken: token, - oauthTokenSecret: secret - }); - } - /** - * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}. - * - * @param userCredential - The user credential. - */ - static credentialFromResult(userCredential) { - return TwitterAuthProvider.credentialFromTaggedObject(userCredential); - } - /** - * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was - * thrown during a sign-in, link, or reauthenticate operation. - * - * @param userCredential - The user credential. - */ - static credentialFromError(error) { - return TwitterAuthProvider.credentialFromTaggedObject((error.customData || {})); - } - static credentialFromTaggedObject({ _tokenResponse: tokenResponse }) { - if (!tokenResponse) { - return null; - } - const { oauthAccessToken, oauthTokenSecret } = tokenResponse; - if (!oauthAccessToken || !oauthTokenSecret) { - return null; - } - try { - return TwitterAuthProvider.credential(oauthAccessToken, oauthTokenSecret); - } - catch (_a) { - return null; - } - } -} -/** Always set to {@link SignInMethod}.TWITTER. */ -TwitterAuthProvider.TWITTER_SIGN_IN_METHOD = "twitter.com" /* TWITTER */; -/** Always set to {@link ProviderId}.TWITTER. */ -TwitterAuthProvider.PROVIDER_ID = "twitter.com" /* TWITTER */; - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -async function signUp(auth, request) { - return _performSignInRequest(auth, "POST" /* POST */, "/v1/accounts:signUp" /* SIGN_UP */, _addTidIfNecessary(auth, request)); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -class UserCredentialImpl { - constructor(params) { - this.user = params.user; - this.providerId = params.providerId; - this._tokenResponse = params._tokenResponse; - this.operationType = params.operationType; - } - static async _fromIdTokenResponse(auth, operationType, idTokenResponse, isAnonymous = false) { - const user = await UserImpl._fromIdTokenResponse(auth, idTokenResponse, isAnonymous); - const providerId = providerIdForResponse(idTokenResponse); - const userCred = new UserCredentialImpl({ - user, - providerId, - _tokenResponse: idTokenResponse, - operationType - }); - return userCred; - } - static async _forOperation(user, operationType, response) { - await user._updateTokensIfNecessary(response, /* reload */ true); - const providerId = providerIdForResponse(response); - return new UserCredentialImpl({ - user, - providerId, - _tokenResponse: response, - operationType - }); - } -} -function providerIdForResponse(response) { - if (response.providerId) { - return response.providerId; - } - if ('phoneNumber' in response) { - return "phone" /* PHONE */; - } - return null; -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Asynchronously signs in as an anonymous user. - * - * @remarks - * If there is already an anonymous user signed in, that user will be returned; otherwise, a - * new anonymous user identity will be created and returned. - * - * @param auth - The {@link Auth} instance. - * - * @public - */ -async function signInAnonymously(auth) { - var _a; - const authInternal = _castAuth(auth); - await authInternal._initializationPromise; - if ((_a = authInternal.currentUser) === null || _a === void 0 ? void 0 : _a.isAnonymous) { - // If an anonymous user is already signed in, no need to sign them in again. - return new UserCredentialImpl({ - user: authInternal.currentUser, - providerId: null, - operationType: "signIn" /* SIGN_IN */ - }); - } - const response = await signUp(authInternal, { - returnSecureToken: true - }); - const userCredential = await UserCredentialImpl._fromIdTokenResponse(authInternal, "signIn" /* SIGN_IN */, response, true); - await authInternal._updateCurrentUser(userCredential.user); - return userCredential; -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -class MultiFactorError extends _firebase_util__WEBPACK_IMPORTED_MODULE_0__.FirebaseError { - constructor(auth, error, operationType, user) { - var _a; - super(error.code, error.message); - this.operationType = operationType; - this.user = user; - // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work - Object.setPrototypeOf(this, MultiFactorError.prototype); - this.customData = { - appName: auth.name, - tenantId: (_a = auth.tenantId) !== null && _a !== void 0 ? _a : undefined, - _serverResponse: error.customData._serverResponse, - operationType, - }; - } - static _fromErrorAndOperation(auth, error, operationType, user) { - return new MultiFactorError(auth, error, operationType, user); - } -} -function _processCredentialSavingMfaContextIfNecessary(auth, operationType, credential, user) { - const idTokenProvider = operationType === "reauthenticate" /* REAUTHENTICATE */ - ? credential._getReauthenticationResolver(auth) - : credential._getIdTokenResponse(auth); - return idTokenProvider.catch(error => { - if (error.code === `auth/${"multi-factor-auth-required" /* MFA_REQUIRED */}`) { - throw MultiFactorError._fromErrorAndOperation(auth, error, operationType, user); - } - throw error; - }); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Takes a set of UserInfo provider data and converts it to a set of names - */ -function providerDataAsNames(providerData) { - return new Set(providerData - .map(({ providerId }) => providerId) - .filter(pid => !!pid)); -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Unlinks a provider from a user account. - * - * @param user - The user. - * @param providerId - The provider to unlink. - * - * @public - */ -async function unlink(user, providerId) { - const userInternal = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(user); - await _assertLinkedStatus(true, userInternal, providerId); - const { providerUserInfo } = await deleteLinkedAccounts(userInternal.auth, { - idToken: await userInternal.getIdToken(), - deleteProvider: [providerId] - }); - const providersLeft = providerDataAsNames(providerUserInfo || []); - userInternal.providerData = userInternal.providerData.filter(pd => providersLeft.has(pd.providerId)); - if (!providersLeft.has("phone" /* PHONE */)) { - userInternal.phoneNumber = null; - } - await userInternal.auth._persistUserIfCurrent(userInternal); - return userInternal; -} -async function _link$1(user, credential, bypassAuthState = false) { - const response = await _logoutIfInvalidated(user, credential._linkToIdToken(user.auth, await user.getIdToken()), bypassAuthState); - return UserCredentialImpl._forOperation(user, "link" /* LINK */, response); -} -async function _assertLinkedStatus(expected, user, provider) { - await _reloadWithoutSaving(user); - const providerIds = providerDataAsNames(user.providerData); - const code = expected === false - ? "provider-already-linked" /* PROVIDER_ALREADY_LINKED */ - : "no-such-provider" /* NO_SUCH_PROVIDER */; - _assert(providerIds.has(provider) === expected, user.auth, code); -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -async function _reauthenticate(user, credential, bypassAuthState = false) { - const { auth } = user; - const operationType = "reauthenticate" /* REAUTHENTICATE */; - try { - const response = await _logoutIfInvalidated(user, _processCredentialSavingMfaContextIfNecessary(auth, operationType, credential, user), bypassAuthState); - _assert(response.idToken, auth, "internal-error" /* INTERNAL_ERROR */); - const parsed = _parseToken(response.idToken); - _assert(parsed, auth, "internal-error" /* INTERNAL_ERROR */); - const { sub: localId } = parsed; - _assert(user.uid === localId, auth, "user-mismatch" /* USER_MISMATCH */); - return UserCredentialImpl._forOperation(user, operationType, response); - } - catch (e) { - // Convert user deleted error into user mismatch - if ((e === null || e === void 0 ? void 0 : e.code) === `auth/${"user-not-found" /* USER_DELETED */}`) { - _fail(auth, "user-mismatch" /* USER_MISMATCH */); - } - throw e; - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -async function _signInWithCredential(auth, credential, bypassAuthState = false) { - const operationType = "signIn" /* SIGN_IN */; - const response = await _processCredentialSavingMfaContextIfNecessary(auth, operationType, credential); - const userCredential = await UserCredentialImpl._fromIdTokenResponse(auth, operationType, response); - if (!bypassAuthState) { - await auth._updateCurrentUser(userCredential.user); - } - return userCredential; -} -/** - * Asynchronously signs in with the given credentials. - * - * @remarks - * An {@link AuthProvider} can be used to generate the credential. - * - * @param auth - The {@link Auth} instance. - * @param credential - The auth credential. - * - * @public - */ -async function signInWithCredential(auth, credential) { - return _signInWithCredential(_castAuth(auth), credential); -} -/** - * Links the user account with the given credentials. - * - * @remarks - * An {@link AuthProvider} can be used to generate the credential. - * - * @param user - The user. - * @param credential - The auth credential. - * - * @public - */ -async function linkWithCredential(user, credential) { - const userInternal = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(user); - await _assertLinkedStatus(false, userInternal, credential.providerId); - return _link$1(userInternal, credential); -} -/** - * Re-authenticates a user using a fresh credential. - * - * @remarks - * Use before operations such as {@link updatePassword} that require tokens from recent sign-in - * attempts. This method can be used to recover from a `CREDENTIAL_TOO_OLD_LOGIN_AGAIN` error. - * - * @param user - The user. - * @param credential - The auth credential. - * - * @public - */ -async function reauthenticateWithCredential(user, credential) { - return _reauthenticate((0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(user), credential); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -async function signInWithCustomToken$1(auth, request) { - return _performSignInRequest(auth, "POST" /* POST */, "/v1/accounts:signInWithCustomToken" /* SIGN_IN_WITH_CUSTOM_TOKEN */, _addTidIfNecessary(auth, request)); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Asynchronously signs in using a custom token. - * - * @remarks - * Custom tokens are used to integrate Firebase Auth with existing auth systems, and must - * be generated by an auth backend using the - * {@link https://firebase.google.com/docs/reference/admin/node/admin.auth.Auth#createcustomtoken | createCustomToken} - * method in the {@link https://firebase.google.com/docs/auth/admin | Admin SDK} . - * - * Fails with an error if the token is invalid, expired, or not accepted by the Firebase Auth service. - * - * @param auth - The {@link Auth} instance. - * @param customToken - The custom token to sign in with. - * - * @public - */ -async function signInWithCustomToken(auth, customToken) { - const authInternal = _castAuth(auth); - const response = await signInWithCustomToken$1(authInternal, { - token: customToken, - returnSecureToken: true - }); - const cred = await UserCredentialImpl._fromIdTokenResponse(authInternal, "signIn" /* SIGN_IN */, response); - await authInternal._updateCurrentUser(cred.user); - return cred; -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -class MultiFactorInfoImpl { - constructor(factorId, response) { - this.factorId = factorId; - this.uid = response.mfaEnrollmentId; - this.enrollmentTime = new Date(response.enrolledAt).toUTCString(); - this.displayName = response.displayName; - } - static _fromServerResponse(auth, enrollment) { - if ('phoneInfo' in enrollment) { - return PhoneMultiFactorInfoImpl._fromServerResponse(auth, enrollment); - } - return _fail(auth, "internal-error" /* INTERNAL_ERROR */); - } -} -class PhoneMultiFactorInfoImpl extends MultiFactorInfoImpl { - constructor(response) { - super("phone" /* PHONE */, response); - this.phoneNumber = response.phoneInfo; - } - static _fromServerResponse(_auth, enrollment) { - return new PhoneMultiFactorInfoImpl(enrollment); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function _setActionCodeSettingsOnRequest(auth, request, actionCodeSettings) { - var _a; - _assert(((_a = actionCodeSettings.url) === null || _a === void 0 ? void 0 : _a.length) > 0, auth, "invalid-continue-uri" /* INVALID_CONTINUE_URI */); - _assert(typeof actionCodeSettings.dynamicLinkDomain === 'undefined' || - actionCodeSettings.dynamicLinkDomain.length > 0, auth, "invalid-dynamic-link-domain" /* INVALID_DYNAMIC_LINK_DOMAIN */); - request.continueUrl = actionCodeSettings.url; - request.dynamicLinkDomain = actionCodeSettings.dynamicLinkDomain; - request.canHandleCodeInApp = actionCodeSettings.handleCodeInApp; - if (actionCodeSettings.iOS) { - _assert(actionCodeSettings.iOS.bundleId.length > 0, auth, "missing-ios-bundle-id" /* MISSING_IOS_BUNDLE_ID */); - request.iOSBundleId = actionCodeSettings.iOS.bundleId; - } - if (actionCodeSettings.android) { - _assert(actionCodeSettings.android.packageName.length > 0, auth, "missing-android-pkg-name" /* MISSING_ANDROID_PACKAGE_NAME */); - request.androidInstallApp = actionCodeSettings.android.installApp; - request.androidMinimumVersionCode = - actionCodeSettings.android.minimumVersion; - request.androidPackageName = actionCodeSettings.android.packageName; - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Sends a password reset email to the given email address. - * - * @remarks - * To complete the password reset, call {@link confirmPasswordReset} with the code supplied in - * the email sent to the user, along with the new password specified by the user. - * - * @example - * ```javascript - * const actionCodeSettings = { - * url: 'https://www.example.com/?email=user@example.com', - * iOS: { - * bundleId: 'com.example.ios' - * }, - * android: { - * packageName: 'com.example.android', - * installApp: true, - * minimumVersion: '12' - * }, - * handleCodeInApp: true - * }; - * await sendPasswordResetEmail(auth, 'user@example.com', actionCodeSettings); - * // Obtain code from user. - * await confirmPasswordReset('user@example.com', code); - * ``` - * - * @param auth - The {@link Auth} instance. - * @param email - The user's email address. - * @param actionCodeSettings - The {@link ActionCodeSettings}. - * - * @public - */ -async function sendPasswordResetEmail(auth, email, actionCodeSettings) { - const authModular = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(auth); - const request = { - requestType: "PASSWORD_RESET" /* PASSWORD_RESET */, - email - }; - if (actionCodeSettings) { - _setActionCodeSettingsOnRequest(authModular, request, actionCodeSettings); - } - await sendPasswordResetEmail$1(authModular, request); -} -/** - * Completes the password reset process, given a confirmation code and new password. - * - * @param auth - The {@link Auth} instance. - * @param oobCode - A confirmation code sent to the user. - * @param newPassword - The new password. - * - * @public - */ -async function confirmPasswordReset(auth, oobCode, newPassword) { - await resetPassword((0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(auth), { - oobCode, - newPassword - }); - // Do not return the email. -} -/** - * Applies a verification code sent to the user by email or other out-of-band mechanism. - * - * @param auth - The {@link Auth} instance. - * @param oobCode - A verification code sent to the user. - * - * @public - */ -async function applyActionCode(auth, oobCode) { - await applyActionCode$1((0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(auth), { oobCode }); -} -/** - * Checks a verification code sent to the user by email or other out-of-band mechanism. - * - * @returns metadata about the code. - * - * @param auth - The {@link Auth} instance. - * @param oobCode - A verification code sent to the user. - * - * @public - */ -async function checkActionCode(auth, oobCode) { - const authModular = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(auth); - const response = await resetPassword(authModular, { oobCode }); - // Email could be empty only if the request type is EMAIL_SIGNIN or - // VERIFY_AND_CHANGE_EMAIL. - // New email should not be empty if the request type is - // VERIFY_AND_CHANGE_EMAIL. - // Multi-factor info could not be empty if the request type is - // REVERT_SECOND_FACTOR_ADDITION. - const operation = response.requestType; - _assert(operation, authModular, "internal-error" /* INTERNAL_ERROR */); - switch (operation) { - case "EMAIL_SIGNIN" /* EMAIL_SIGNIN */: - break; - case "VERIFY_AND_CHANGE_EMAIL" /* VERIFY_AND_CHANGE_EMAIL */: - _assert(response.newEmail, authModular, "internal-error" /* INTERNAL_ERROR */); - break; - case "REVERT_SECOND_FACTOR_ADDITION" /* REVERT_SECOND_FACTOR_ADDITION */: - _assert(response.mfaInfo, authModular, "internal-error" /* INTERNAL_ERROR */); - // fall through - default: - _assert(response.email, authModular, "internal-error" /* INTERNAL_ERROR */); - } - // The multi-factor info for revert second factor addition - let multiFactorInfo = null; - if (response.mfaInfo) { - multiFactorInfo = MultiFactorInfoImpl._fromServerResponse(_castAuth(authModular), response.mfaInfo); - } - return { - data: { - email: (response.requestType === "VERIFY_AND_CHANGE_EMAIL" /* VERIFY_AND_CHANGE_EMAIL */ - ? response.newEmail - : response.email) || null, - previousEmail: (response.requestType === "VERIFY_AND_CHANGE_EMAIL" /* VERIFY_AND_CHANGE_EMAIL */ - ? response.email - : response.newEmail) || null, - multiFactorInfo - }, - operation - }; -} -/** - * Checks a password reset code sent to the user by email or other out-of-band mechanism. - * - * @returns the user's email address if valid. - * - * @param auth - The {@link Auth} instance. - * @param code - A verification code sent to the user. - * - * @public - */ -async function verifyPasswordResetCode(auth, code) { - const { data } = await checkActionCode((0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(auth), code); - // Email should always be present since a code was sent to it - return data.email; -} -/** - * Creates a new user account associated with the specified email address and password. - * - * @remarks - * On successful creation of the user account, this user will also be signed in to your application. - * - * User account creation can fail if the account already exists or the password is invalid. - * - * Note: The email address acts as a unique identifier for the user and enables an email-based - * password reset. This function will create a new user account and set the initial user password. - * - * @param auth - The {@link Auth} instance. - * @param email - The user's email address. - * @param password - The user's chosen password. - * - * @public - */ -async function createUserWithEmailAndPassword(auth, email, password) { - const authInternal = _castAuth(auth); - const response = await signUp(authInternal, { - returnSecureToken: true, - email, - password - }); - const userCredential = await UserCredentialImpl._fromIdTokenResponse(authInternal, "signIn" /* SIGN_IN */, response); - await authInternal._updateCurrentUser(userCredential.user); - return userCredential; -} -/** - * Asynchronously signs in using an email and password. - * - * @remarks - * Fails with an error if the email address and password do not match. - * - * Note: The user's password is NOT the password used to access the user's email account. The - * email address serves as a unique identifier for the user, and the password is used to access - * the user's account in your Firebase project. See also: {@link createUserWithEmailAndPassword}. - * - * @param auth - The {@link Auth} instance. - * @param email - The users email address. - * @param password - The users password. - * - * @public - */ -function signInWithEmailAndPassword(auth, email, password) { - return signInWithCredential((0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(auth), EmailAuthProvider.credential(email, password)); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Sends a sign-in email link to the user with the specified email. - * - * @remarks - * The sign-in operation has to always be completed in the app unlike other out of band email - * actions (password reset and email verifications). This is because, at the end of the flow, - * the user is expected to be signed in and their Auth state persisted within the app. - * - * To complete sign in with the email link, call {@link signInWithEmailLink} with the email - * address and the email link supplied in the email sent to the user. - * - * @example - * ```javascript - * const actionCodeSettings = { - * url: 'https://www.example.com/?email=user@example.com', - * iOS: { - * bundleId: 'com.example.ios' - * }, - * android: { - * packageName: 'com.example.android', - * installApp: true, - * minimumVersion: '12' - * }, - * handleCodeInApp: true - * }; - * await sendSignInLinkToEmail(auth, 'user@example.com', actionCodeSettings); - * // Obtain emailLink from the user. - * if(isSignInWithEmailLink(auth, emailLink)) { - * await signInWithEmailLink(auth, 'user@example.com', emailLink); - * } - * ``` - * - * @param authInternal - The {@link Auth} instance. - * @param email - The user's email address. - * @param actionCodeSettings - The {@link ActionCodeSettings}. - * - * @public - */ -async function sendSignInLinkToEmail(auth, email, actionCodeSettings) { - const authModular = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(auth); - const request = { - requestType: "EMAIL_SIGNIN" /* EMAIL_SIGNIN */, - email - }; - _assert(actionCodeSettings.handleCodeInApp, authModular, "argument-error" /* ARGUMENT_ERROR */); - if (actionCodeSettings) { - _setActionCodeSettingsOnRequest(authModular, request, actionCodeSettings); - } - await sendSignInLinkToEmail$1(authModular, request); -} -/** - * Checks if an incoming link is a sign-in with email link suitable for {@link signInWithEmailLink}. - * - * @param auth - The {@link Auth} instance. - * @param emailLink - The link sent to the user's email address. - * - * @public - */ -function isSignInWithEmailLink(auth, emailLink) { - const actionCodeUrl = ActionCodeURL.parseLink(emailLink); - return (actionCodeUrl === null || actionCodeUrl === void 0 ? void 0 : actionCodeUrl.operation) === "EMAIL_SIGNIN" /* EMAIL_SIGNIN */; -} -/** - * Asynchronously signs in using an email and sign-in email link. - * - * @remarks - * If no link is passed, the link is inferred from the current URL. - * - * Fails with an error if the email address is invalid or OTP in email link expires. - * - * Note: Confirm the link is a sign-in email link before calling this method firebase.auth.Auth.isSignInWithEmailLink. - * - * @example - * ```javascript - * const actionCodeSettings = { - * url: 'https://www.example.com/?email=user@example.com', - * iOS: { - * bundleId: 'com.example.ios' - * }, - * android: { - * packageName: 'com.example.android', - * installApp: true, - * minimumVersion: '12' - * }, - * handleCodeInApp: true - * }; - * await sendSignInLinkToEmail(auth, 'user@example.com', actionCodeSettings); - * // Obtain emailLink from the user. - * if(isSignInWithEmailLink(auth, emailLink)) { - * await signInWithEmailLink(auth, 'user@example.com', emailLink); - * } - * ``` - * - * @param auth - The {@link Auth} instance. - * @param email - The user's email address. - * @param emailLink - The link sent to the user's email address. - * - * @public - */ -async function signInWithEmailLink(auth, email, emailLink) { - const authModular = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(auth); - const credential = EmailAuthProvider.credentialWithLink(email, emailLink || _getCurrentUrl()); - // Check if the tenant ID in the email link matches the tenant ID on Auth - // instance. - _assert(credential._tenantId === (authModular.tenantId || null), authModular, "tenant-id-mismatch" /* TENANT_ID_MISMATCH */); - return signInWithCredential(authModular, credential); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -async function createAuthUri(auth, request) { - return _performApiRequest(auth, "POST" /* POST */, "/v1/accounts:createAuthUri" /* CREATE_AUTH_URI */, _addTidIfNecessary(auth, request)); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Gets the list of possible sign in methods for the given email address. - * - * @remarks - * This is useful to differentiate methods of sign-in for the same provider, eg. - * {@link EmailAuthProvider} which has 2 methods of sign-in, - * {@link SignInMethod}.EMAIL_PASSWORD and - * {@link SignInMethod}.EMAIL_LINK. - * - * @param auth - The {@link Auth} instance. - * @param email - The user's email address. - * - * @public - */ -async function fetchSignInMethodsForEmail(auth, email) { - // createAuthUri returns an error if continue URI is not http or https. - // For environments like Cordova, Chrome extensions, native frameworks, file - // systems, etc, use http://localhost as continue URL. - const continueUri = _isHttpOrHttps() ? _getCurrentUrl() : 'http://localhost'; - const request = { - identifier: email, - continueUri - }; - const { signinMethods } = await createAuthUri((0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(auth), request); - return signinMethods || []; -} -/** - * Sends a verification email to a user. - * - * @remarks - * The verification process is completed by calling {@link applyActionCode}. - * - * @example - * ```javascript - * const actionCodeSettings = { - * url: 'https://www.example.com/?email=user@example.com', - * iOS: { - * bundleId: 'com.example.ios' - * }, - * android: { - * packageName: 'com.example.android', - * installApp: true, - * minimumVersion: '12' - * }, - * handleCodeInApp: true - * }; - * await sendEmailVerification(user, actionCodeSettings); - * // Obtain code from the user. - * await applyActionCode(auth, code); - * ``` - * - * @param user - The user. - * @param actionCodeSettings - The {@link ActionCodeSettings}. - * - * @public - */ -async function sendEmailVerification(user, actionCodeSettings) { - const userInternal = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(user); - const idToken = await user.getIdToken(); - const request = { - requestType: "VERIFY_EMAIL" /* VERIFY_EMAIL */, - idToken - }; - if (actionCodeSettings) { - _setActionCodeSettingsOnRequest(userInternal.auth, request, actionCodeSettings); - } - const { email } = await sendEmailVerification$1(userInternal.auth, request); - if (email !== user.email) { - await user.reload(); - } -} -/** - * Sends a verification email to a new email address. - * - * @remarks - * The user's email will be updated to the new one after being verified. - * - * If you have a custom email action handler, you can complete the verification process by calling - * {@link applyActionCode}. - * - * @example - * ```javascript - * const actionCodeSettings = { - * url: 'https://www.example.com/?email=user@example.com', - * iOS: { - * bundleId: 'com.example.ios' - * }, - * android: { - * packageName: 'com.example.android', - * installApp: true, - * minimumVersion: '12' - * }, - * handleCodeInApp: true - * }; - * await verifyBeforeUpdateEmail(user, 'newemail@example.com', actionCodeSettings); - * // Obtain code from the user. - * await applyActionCode(auth, code); - * ``` - * - * @param user - The user. - * @param newEmail - The new email address to be verified before update. - * @param actionCodeSettings - The {@link ActionCodeSettings}. - * - * @public - */ -async function verifyBeforeUpdateEmail(user, newEmail, actionCodeSettings) { - const userInternal = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(user); - const idToken = await user.getIdToken(); - const request = { - requestType: "VERIFY_AND_CHANGE_EMAIL" /* VERIFY_AND_CHANGE_EMAIL */, - idToken, - newEmail - }; - if (actionCodeSettings) { - _setActionCodeSettingsOnRequest(userInternal.auth, request, actionCodeSettings); - } - const { email } = await verifyAndChangeEmail(userInternal.auth, request); - if (email !== user.email) { - // If the local copy of the email on user is outdated, reload the - // user. - await user.reload(); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -async function updateProfile$1(auth, request) { - return _performApiRequest(auth, "POST" /* POST */, "/v1/accounts:update" /* SET_ACCOUNT_INFO */, request); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Updates a user's profile data. - * - * @param user - The user. - * @param profile - The profile's `displayName` and `photoURL` to update. - * - * @public - */ -async function updateProfile(user, { displayName, photoURL: photoUrl }) { - if (displayName === undefined && photoUrl === undefined) { - return; - } - const userInternal = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(user); - const idToken = await userInternal.getIdToken(); - const profileRequest = { - idToken, - displayName, - photoUrl, - returnSecureToken: true - }; - const response = await _logoutIfInvalidated(userInternal, updateProfile$1(userInternal.auth, profileRequest)); - userInternal.displayName = response.displayName || null; - userInternal.photoURL = response.photoUrl || null; - // Update the password provider as well - const passwordProvider = userInternal.providerData.find(({ providerId }) => providerId === "password" /* PASSWORD */); - if (passwordProvider) { - passwordProvider.displayName = userInternal.displayName; - passwordProvider.photoURL = userInternal.photoURL; - } - await userInternal._updateTokensIfNecessary(response); -} -/** - * Updates the user's email address. - * - * @remarks - * An email will be sent to the original email address (if it was set) that allows to revoke the - * email address change, in order to protect them from account hijacking. - * - * Important: this is a security sensitive operation that requires the user to have recently signed - * in. If this requirement isn't met, ask the user to authenticate again and then call - * {@link reauthenticateWithCredential}. - * - * @param user - The user. - * @param newEmail - The new email address. - * - * @public - */ -function updateEmail(user, newEmail) { - return updateEmailOrPassword((0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(user), newEmail, null); -} -/** - * Updates the user's password. - * - * @remarks - * Important: this is a security sensitive operation that requires the user to have recently signed - * in. If this requirement isn't met, ask the user to authenticate again and then call - * {@link reauthenticateWithCredential}. - * - * @param user - The user. - * @param newPassword - The new password. - * - * @public - */ -function updatePassword(user, newPassword) { - return updateEmailOrPassword((0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(user), null, newPassword); -} -async function updateEmailOrPassword(user, email, password) { - const { auth } = user; - const idToken = await user.getIdToken(); - const request = { - idToken, - returnSecureToken: true - }; - if (email) { - request.email = email; - } - if (password) { - request.password = password; - } - const response = await _logoutIfInvalidated(user, updateEmailPassword(auth, request)); - await user._updateTokensIfNecessary(response, /* reload */ true); -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Parse the `AdditionalUserInfo` from the ID token response. - * - */ -function _fromIdTokenResponse(idTokenResponse) { - var _a, _b; - if (!idTokenResponse) { - return null; - } - const { providerId } = idTokenResponse; - const profile = idTokenResponse.rawUserInfo - ? JSON.parse(idTokenResponse.rawUserInfo) - : {}; - const isNewUser = idTokenResponse.isNewUser || - idTokenResponse.kind === "identitytoolkit#SignupNewUserResponse" /* SignupNewUser */; - if (!providerId && (idTokenResponse === null || idTokenResponse === void 0 ? void 0 : idTokenResponse.idToken)) { - const signInProvider = (_b = (_a = _parseToken(idTokenResponse.idToken)) === null || _a === void 0 ? void 0 : _a.firebase) === null || _b === void 0 ? void 0 : _b['sign_in_provider']; - if (signInProvider) { - const filteredProviderId = signInProvider !== "anonymous" /* ANONYMOUS */ && - signInProvider !== "custom" /* CUSTOM */ - ? signInProvider - : null; - // Uses generic class in accordance with the legacy SDK. - return new GenericAdditionalUserInfo(isNewUser, filteredProviderId); - } - } - if (!providerId) { - return null; - } - switch (providerId) { - case "facebook.com" /* FACEBOOK */: - return new FacebookAdditionalUserInfo(isNewUser, profile); - case "github.com" /* GITHUB */: - return new GithubAdditionalUserInfo(isNewUser, profile); - case "google.com" /* GOOGLE */: - return new GoogleAdditionalUserInfo(isNewUser, profile); - case "twitter.com" /* TWITTER */: - return new TwitterAdditionalUserInfo(isNewUser, profile, idTokenResponse.screenName || null); - case "custom" /* CUSTOM */: - case "anonymous" /* ANONYMOUS */: - return new GenericAdditionalUserInfo(isNewUser, null); - default: - return new GenericAdditionalUserInfo(isNewUser, providerId, profile); - } -} -class GenericAdditionalUserInfo { - constructor(isNewUser, providerId, profile = {}) { - this.isNewUser = isNewUser; - this.providerId = providerId; - this.profile = profile; - } -} -class FederatedAdditionalUserInfoWithUsername extends GenericAdditionalUserInfo { - constructor(isNewUser, providerId, profile, username) { - super(isNewUser, providerId, profile); - this.username = username; - } -} -class FacebookAdditionalUserInfo extends GenericAdditionalUserInfo { - constructor(isNewUser, profile) { - super(isNewUser, "facebook.com" /* FACEBOOK */, profile); - } -} -class GithubAdditionalUserInfo extends FederatedAdditionalUserInfoWithUsername { - constructor(isNewUser, profile) { - super(isNewUser, "github.com" /* GITHUB */, profile, typeof (profile === null || profile === void 0 ? void 0 : profile.login) === 'string' ? profile === null || profile === void 0 ? void 0 : profile.login : null); - } -} -class GoogleAdditionalUserInfo extends GenericAdditionalUserInfo { - constructor(isNewUser, profile) { - super(isNewUser, "google.com" /* GOOGLE */, profile); - } -} -class TwitterAdditionalUserInfo extends FederatedAdditionalUserInfoWithUsername { - constructor(isNewUser, profile, screenName) { - super(isNewUser, "twitter.com" /* TWITTER */, profile, screenName); - } -} -/** - * Extracts provider specific {@link AdditionalUserInfo} for the given credential. - * - * @param userCredential - The user credential. - * - * @public - */ -function getAdditionalUserInfo(userCredential) { - const { user, _tokenResponse } = userCredential; - if (user.isAnonymous && !_tokenResponse) { - // Handle the special case where signInAnonymously() gets called twice. - // No network call is made so there's nothing to actually fill this in - return { - providerId: null, - isNewUser: false, - profile: null - }; - } - return _fromIdTokenResponse(_tokenResponse); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -// Non-optional auth methods. -/** - * Changes the type of persistence on the {@link Auth} instance for the currently saved - * `Auth` session and applies this type of persistence for future sign-in requests, including - * sign-in with redirect requests. - * - * @remarks - * This makes it easy for a user signing in to specify whether their session should be - * remembered or not. It also makes it easier to never persist the `Auth` state for applications - * that are shared by other users or have sensitive data. - * - * @example - * ```javascript - * setPersistence(auth, browserSessionPersistence); - * ``` - * - * @param auth - The {@link Auth} instance. - * @param persistence - The {@link Persistence} to use. - * @returns A `Promise` that resolves once the persistence change has completed - * - * @public - */ -function setPersistence(auth, persistence) { - return (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(auth).setPersistence(persistence); -} -/** - * Adds an observer for changes to the signed-in user's ID token, which includes sign-in, - * sign-out, and token refresh events. - * - * @param auth - The {@link Auth} instance. - * @param nextOrObserver - callback triggered on change. - * @param error - callback triggered on error. - * @param completed - callback triggered when observer is removed. - * - * @public - */ -function onIdTokenChanged(auth, nextOrObserver, error, completed) { - return (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(auth).onIdTokenChanged(nextOrObserver, error, completed); -} -/** - * Adds an observer for changes to the user's sign-in state. - * - * @remarks - * To keep the old behavior, see {@link onIdTokenChanged}. - * - * @param auth - The {@link Auth} instance. - * @param nextOrObserver - callback triggered on change. - * @param error - callback triggered on error. - * @param completed - callback triggered when observer is removed. - * - * @public - */ -function onAuthStateChanged(auth, nextOrObserver, error, completed) { - return (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(auth).onAuthStateChanged(nextOrObserver, error, completed); -} -/** - * Sets the current language to the default device/browser preference. - * - * @param auth - The {@link Auth} instance. - * - * @public - */ -function useDeviceLanguage(auth) { - (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(auth).useDeviceLanguage(); -} -/** - * Asynchronously sets the provided user as {@link Auth.currentUser} on the - * {@link Auth} instance. - * - * @remarks - * A new instance copy of the user provided will be made and set as currentUser. - * - * This will trigger {@link onAuthStateChanged} and {@link onIdTokenChanged} listeners - * like other sign in methods. - * - * The operation fails with an error if the user to be updated belongs to a different Firebase - * project. - * - * @param auth - The {@link Auth} instance. - * @param user - The new {@link User}. - * - * @public - */ -function updateCurrentUser(auth, user) { - return (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(auth).updateCurrentUser(user); -} -/** - * Signs out the current user. - * - * @param auth - The {@link Auth} instance. - * - * @public - */ -function signOut(auth) { - return (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(auth).signOut(); -} -/** - * Deletes and signs out the user. - * - * @remarks - * Important: this is a security-sensitive operation that requires the user to have recently - * signed in. If this requirement isn't met, ask the user to authenticate again and then call - * {@link reauthenticateWithCredential}. - * - * @param user - The user. - * - * @public - */ -async function deleteUser(user) { - return (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(user).delete(); -} - -class MultiFactorSessionImpl { - constructor(type, credential) { - this.type = type; - this.credential = credential; - } - static _fromIdtoken(idToken) { - return new MultiFactorSessionImpl("enroll" /* ENROLL */, idToken); - } - static _fromMfaPendingCredential(mfaPendingCredential) { - return new MultiFactorSessionImpl("signin" /* SIGN_IN */, mfaPendingCredential); - } - toJSON() { - const key = this.type === "enroll" /* ENROLL */ - ? 'idToken' - : 'pendingCredential'; - return { - multiFactorSession: { - [key]: this.credential - } - }; - } - static fromJSON(obj) { - var _a, _b; - if (obj === null || obj === void 0 ? void 0 : obj.multiFactorSession) { - if ((_a = obj.multiFactorSession) === null || _a === void 0 ? void 0 : _a.pendingCredential) { - return MultiFactorSessionImpl._fromMfaPendingCredential(obj.multiFactorSession.pendingCredential); - } - else if ((_b = obj.multiFactorSession) === null || _b === void 0 ? void 0 : _b.idToken) { - return MultiFactorSessionImpl._fromIdtoken(obj.multiFactorSession.idToken); - } - } - return null; - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -class MultiFactorResolverImpl { - constructor(session, hints, signInResolver) { - this.session = session; - this.hints = hints; - this.signInResolver = signInResolver; - } - /** @internal */ - static _fromError(authExtern, error) { - const auth = _castAuth(authExtern); - const serverResponse = error.customData._serverResponse; - const hints = (serverResponse.mfaInfo || []).map(enrollment => MultiFactorInfoImpl._fromServerResponse(auth, enrollment)); - _assert(serverResponse.mfaPendingCredential, auth, "internal-error" /* INTERNAL_ERROR */); - const session = MultiFactorSessionImpl._fromMfaPendingCredential(serverResponse.mfaPendingCredential); - return new MultiFactorResolverImpl(session, hints, async (assertion) => { - const mfaResponse = await assertion._process(auth, session); - // Clear out the unneeded fields from the old login response - delete serverResponse.mfaInfo; - delete serverResponse.mfaPendingCredential; - // Use in the new token & refresh token in the old response - const idTokenResponse = Object.assign(Object.assign({}, serverResponse), { idToken: mfaResponse.idToken, refreshToken: mfaResponse.refreshToken }); - // TODO: we should collapse this switch statement into UserCredentialImpl._forOperation and have it support the SIGN_IN case - switch (error.operationType) { - case "signIn" /* SIGN_IN */: - const userCredential = await UserCredentialImpl._fromIdTokenResponse(auth, error.operationType, idTokenResponse); - await auth._updateCurrentUser(userCredential.user); - return userCredential; - case "reauthenticate" /* REAUTHENTICATE */: - _assert(error.user, auth, "internal-error" /* INTERNAL_ERROR */); - return UserCredentialImpl._forOperation(error.user, error.operationType, idTokenResponse); - default: - _fail(auth, "internal-error" /* INTERNAL_ERROR */); - } - }); - } - async resolveSignIn(assertionExtern) { - const assertion = assertionExtern; - return this.signInResolver(assertion); - } -} -/** - * Provides a {@link MultiFactorResolver} suitable for completion of a - * multi-factor flow. - * - * @param auth - The {@link Auth} instance. - * @param error - The {@link MultiFactorError} raised during a sign-in, or - * reauthentication operation. - * - * @public - */ -function getMultiFactorResolver(auth, error) { - var _a; - const authModular = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(auth); - const errorInternal = error; - _assert(error.customData.operationType, authModular, "argument-error" /* ARGUMENT_ERROR */); - _assert((_a = errorInternal.customData._serverResponse) === null || _a === void 0 ? void 0 : _a.mfaPendingCredential, authModular, "argument-error" /* ARGUMENT_ERROR */); - return MultiFactorResolverImpl._fromError(authModular, errorInternal); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function startEnrollPhoneMfa(auth, request) { - return _performApiRequest(auth, "POST" /* POST */, "/v2/accounts/mfaEnrollment:start" /* START_PHONE_MFA_ENROLLMENT */, _addTidIfNecessary(auth, request)); -} -function finalizeEnrollPhoneMfa(auth, request) { - return _performApiRequest(auth, "POST" /* POST */, "/v2/accounts/mfaEnrollment:finalize" /* FINALIZE_PHONE_MFA_ENROLLMENT */, _addTidIfNecessary(auth, request)); -} -function withdrawMfa(auth, request) { - return _performApiRequest(auth, "POST" /* POST */, "/v2/accounts/mfaEnrollment:withdraw" /* WITHDRAW_MFA */, _addTidIfNecessary(auth, request)); -} - -class MultiFactorUserImpl { - constructor(user) { - this.user = user; - this.enrolledFactors = []; - user._onReload(userInfo => { - if (userInfo.mfaInfo) { - this.enrolledFactors = userInfo.mfaInfo.map(enrollment => MultiFactorInfoImpl._fromServerResponse(user.auth, enrollment)); - } - }); - } - static _fromUser(user) { - return new MultiFactorUserImpl(user); - } - async getSession() { - return MultiFactorSessionImpl._fromIdtoken(await this.user.getIdToken()); - } - async enroll(assertionExtern, displayName) { - const assertion = assertionExtern; - const session = (await this.getSession()); - const finalizeMfaResponse = await _logoutIfInvalidated(this.user, assertion._process(this.user.auth, session, displayName)); - // New tokens will be issued after enrollment of the new second factors. - // They need to be updated on the user. - await this.user._updateTokensIfNecessary(finalizeMfaResponse); - // The user needs to be reloaded to get the new multi-factor information - // from server. USER_RELOADED event will be triggered and `enrolledFactors` - // will be updated. - return this.user.reload(); - } - async unenroll(infoOrUid) { - const mfaEnrollmentId = typeof infoOrUid === 'string' ? infoOrUid : infoOrUid.uid; - const idToken = await this.user.getIdToken(); - const idTokenResponse = await _logoutIfInvalidated(this.user, withdrawMfa(this.user.auth, { - idToken, - mfaEnrollmentId - })); - // Remove the second factor from the user's list. - this.enrolledFactors = this.enrolledFactors.filter(({ uid }) => uid !== mfaEnrollmentId); - // Depending on whether the backend decided to revoke the user's session, - // the tokenResponse may be empty. If the tokens were not updated (and they - // are now invalid), reloading the user will discover this and invalidate - // the user's state accordingly. - await this.user._updateTokensIfNecessary(idTokenResponse); - try { - await this.user.reload(); - } - catch (e) { - if (e.code !== `auth/${"user-token-expired" /* TOKEN_EXPIRED */}`) { - throw e; - } - } - } -} -const multiFactorUserCache = new WeakMap(); -/** - * The {@link MultiFactorUser} corresponding to the user. - * - * @remarks - * This is used to access all multi-factor properties and operations related to the user. - * - * @param user - The user. - * - * @public - */ -function multiFactor(user) { - const userModular = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(user); - if (!multiFactorUserCache.has(userModular)) { - multiFactorUserCache.set(userModular, MultiFactorUserImpl._fromUser(userModular)); - } - return multiFactorUserCache.get(userModular); -} - -const STORAGE_AVAILABLE_KEY = '__sak'; - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -// There are two different browser persistence types: local and session. -// Both have the same implementation but use a different underlying storage -// object. -class BrowserPersistenceClass { - constructor(storageRetriever, type) { - this.storageRetriever = storageRetriever; - this.type = type; - } - _isAvailable() { - try { - if (!this.storage) { - return Promise.resolve(false); - } - this.storage.setItem(STORAGE_AVAILABLE_KEY, '1'); - this.storage.removeItem(STORAGE_AVAILABLE_KEY); - return Promise.resolve(true); - } - catch (_a) { - return Promise.resolve(false); - } - } - _set(key, value) { - this.storage.setItem(key, JSON.stringify(value)); - return Promise.resolve(); - } - _get(key) { - const json = this.storage.getItem(key); - return Promise.resolve(json ? JSON.parse(json) : null); - } - _remove(key) { - this.storage.removeItem(key); - return Promise.resolve(); - } - get storage() { - return this.storageRetriever(); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function _iframeCannotSyncWebStorage() { - const ua = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getUA)(); - return _isSafari(ua) || _isIOS(ua); -} -// The polling period in case events are not supported -const _POLLING_INTERVAL_MS$1 = 1000; -// The IE 10 localStorage cross tab synchronization delay in milliseconds -const IE10_LOCAL_STORAGE_SYNC_DELAY = 10; -class BrowserLocalPersistence extends BrowserPersistenceClass { - constructor() { - super(() => window.localStorage, "LOCAL" /* LOCAL */); - this.boundEventHandler = (event, poll) => this.onStorageEvent(event, poll); - this.listeners = {}; - this.localCache = {}; - // setTimeout return value is platform specific - // eslint-disable-next-line @typescript-eslint/no-explicit-any - this.pollTimer = null; - // Safari or iOS browser and embedded in an iframe. - this.safariLocalStorageNotSynced = _iframeCannotSyncWebStorage() && _isIframe(); - // Whether to use polling instead of depending on window events - this.fallbackToPolling = _isMobileBrowser(); - this._shouldAllowMigration = true; - } - forAllChangedKeys(cb) { - // Check all keys with listeners on them. - for (const key of Object.keys(this.listeners)) { - // Get value from localStorage. - const newValue = this.storage.getItem(key); - const oldValue = this.localCache[key]; - // If local map value does not match, trigger listener with storage event. - // Differentiate this simulated event from the real storage event. - if (newValue !== oldValue) { - cb(key, oldValue, newValue); - } - } - } - onStorageEvent(event, poll = false) { - // Key would be null in some situations, like when localStorage is cleared - if (!event.key) { - this.forAllChangedKeys((key, _oldValue, newValue) => { - this.notifyListeners(key, newValue); - }); - return; - } - const key = event.key; - // Check the mechanism how this event was detected. - // The first event will dictate the mechanism to be used. - if (poll) { - // Environment detects storage changes via polling. - // Remove storage event listener to prevent possible event duplication. - this.detachListener(); - } - else { - // Environment detects storage changes via storage event listener. - // Remove polling listener to prevent possible event duplication. - this.stopPolling(); - } - // Safari embedded iframe. Storage event will trigger with the delta - // changes but no changes will be applied to the iframe localStorage. - if (this.safariLocalStorageNotSynced) { - // Get current iframe page value. - const storedValue = this.storage.getItem(key); - // Value not synchronized, synchronize manually. - if (event.newValue !== storedValue) { - if (event.newValue !== null) { - // Value changed from current value. - this.storage.setItem(key, event.newValue); - } - else { - // Current value deleted. - this.storage.removeItem(key); - } - } - else if (this.localCache[key] === event.newValue && !poll) { - // Already detected and processed, do not trigger listeners again. - return; - } - } - const triggerListeners = () => { - // Keep local map up to date in case storage event is triggered before - // poll. - const storedValue = this.storage.getItem(key); - if (!poll && this.localCache[key] === storedValue) { - // Real storage event which has already been detected, do nothing. - // This seems to trigger in some IE browsers for some reason. - return; - } - this.notifyListeners(key, storedValue); - }; - const storedValue = this.storage.getItem(key); - if (_isIE10() && - storedValue !== event.newValue && - event.newValue !== event.oldValue) { - // IE 10 has this weird bug where a storage event would trigger with the - // correct key, oldValue and newValue but localStorage.getItem(key) does - // not yield the updated value until a few milliseconds. This ensures - // this recovers from that situation. - setTimeout(triggerListeners, IE10_LOCAL_STORAGE_SYNC_DELAY); - } - else { - triggerListeners(); - } - } - notifyListeners(key, value) { - this.localCache[key] = value; - const listeners = this.listeners[key]; - if (listeners) { - for (const listener of Array.from(listeners)) { - listener(value ? JSON.parse(value) : value); - } - } - } - startPolling() { - this.stopPolling(); - this.pollTimer = setInterval(() => { - this.forAllChangedKeys((key, oldValue, newValue) => { - this.onStorageEvent(new StorageEvent('storage', { - key, - oldValue, - newValue - }), - /* poll */ true); - }); - }, _POLLING_INTERVAL_MS$1); - } - stopPolling() { - if (this.pollTimer) { - clearInterval(this.pollTimer); - this.pollTimer = null; - } - } - attachListener() { - window.addEventListener('storage', this.boundEventHandler); - } - detachListener() { - window.removeEventListener('storage', this.boundEventHandler); - } - _addListener(key, listener) { - if (Object.keys(this.listeners).length === 0) { - // Whether browser can detect storage event when it had already been pushed to the background. - // This may happen in some mobile browsers. A localStorage change in the foreground window - // will not be detected in the background window via the storage event. - // This was detected in iOS 7.x mobile browsers - if (this.fallbackToPolling) { - this.startPolling(); - } - else { - this.attachListener(); - } - } - if (!this.listeners[key]) { - this.listeners[key] = new Set(); - // Populate the cache to avoid spuriously triggering on first poll. - this.localCache[key] = this.storage.getItem(key); - } - this.listeners[key].add(listener); - } - _removeListener(key, listener) { - if (this.listeners[key]) { - this.listeners[key].delete(listener); - if (this.listeners[key].size === 0) { - delete this.listeners[key]; - } - } - if (Object.keys(this.listeners).length === 0) { - this.detachListener(); - this.stopPolling(); - } - } - // Update local cache on base operations: - async _set(key, value) { - await super._set(key, value); - this.localCache[key] = JSON.stringify(value); - } - async _get(key) { - const value = await super._get(key); - this.localCache[key] = JSON.stringify(value); - return value; - } - async _remove(key) { - await super._remove(key); - delete this.localCache[key]; - } -} -BrowserLocalPersistence.type = 'LOCAL'; -/** - * An implementation of {@link Persistence} of type `LOCAL` using `localStorage` - * for the underlying storage. - * - * @public - */ -const browserLocalPersistence = BrowserLocalPersistence; - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -class BrowserSessionPersistence extends BrowserPersistenceClass { - constructor() { - super(() => window.sessionStorage, "SESSION" /* SESSION */); - } - _addListener(_key, _listener) { - // Listeners are not supported for session storage since it cannot be shared across windows - return; - } - _removeListener(_key, _listener) { - // Listeners are not supported for session storage since it cannot be shared across windows - return; - } -} -BrowserSessionPersistence.type = 'SESSION'; -/** - * An implementation of {@link Persistence} of `SESSION` using `sessionStorage` - * for the underlying storage. - * - * @public - */ -const browserSessionPersistence = BrowserSessionPersistence; - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Shim for Promise.allSettled, note the slightly different format of `fulfilled` vs `status`. - * - * @param promises - Array of promises to wait on. - */ -function _allSettled(promises) { - return Promise.all(promises.map(async (promise) => { - try { - const value = await promise; - return { - fulfilled: true, - value - }; - } - catch (reason) { - return { - fulfilled: false, - reason - }; - } - })); -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Interface class for receiving messages. - * - */ -class Receiver { - constructor(eventTarget) { - this.eventTarget = eventTarget; - this.handlersMap = {}; - this.boundEventHandler = this.handleEvent.bind(this); - } - /** - * Obtain an instance of a Receiver for a given event target, if none exists it will be created. - * - * @param eventTarget - An event target (such as window or self) through which the underlying - * messages will be received. - */ - static _getInstance(eventTarget) { - // The results are stored in an array since objects can't be keys for other - // objects. In addition, setting a unique property on an event target as a - // hash map key may not be allowed due to CORS restrictions. - const existingInstance = this.receivers.find(receiver => receiver.isListeningto(eventTarget)); - if (existingInstance) { - return existingInstance; - } - const newInstance = new Receiver(eventTarget); - this.receivers.push(newInstance); - return newInstance; - } - isListeningto(eventTarget) { - return this.eventTarget === eventTarget; - } - /** - * Fans out a MessageEvent to the appropriate listeners. - * - * @remarks - * Sends an {@link Status.ACK} upon receipt and a {@link Status.DONE} once all handlers have - * finished processing. - * - * @param event - The MessageEvent. - * - */ - async handleEvent(event) { - const messageEvent = event; - const { eventId, eventType, data } = messageEvent.data; - const handlers = this.handlersMap[eventType]; - if (!(handlers === null || handlers === void 0 ? void 0 : handlers.size)) { - return; - } - messageEvent.ports[0].postMessage({ - status: "ack" /* ACK */, - eventId, - eventType - }); - const promises = Array.from(handlers).map(async (handler) => handler(messageEvent.origin, data)); - const response = await _allSettled(promises); - messageEvent.ports[0].postMessage({ - status: "done" /* DONE */, - eventId, - eventType, - response - }); - } - /** - * Subscribe an event handler for a particular event. - * - * @param eventType - Event name to subscribe to. - * @param eventHandler - The event handler which should receive the events. - * - */ - _subscribe(eventType, eventHandler) { - if (Object.keys(this.handlersMap).length === 0) { - this.eventTarget.addEventListener('message', this.boundEventHandler); - } - if (!this.handlersMap[eventType]) { - this.handlersMap[eventType] = new Set(); - } - this.handlersMap[eventType].add(eventHandler); - } - /** - * Unsubscribe an event handler from a particular event. - * - * @param eventType - Event name to unsubscribe from. - * @param eventHandler - Optinoal event handler, if none provided, unsubscribe all handlers on this event. - * - */ - _unsubscribe(eventType, eventHandler) { - if (this.handlersMap[eventType] && eventHandler) { - this.handlersMap[eventType].delete(eventHandler); - } - if (!eventHandler || this.handlersMap[eventType].size === 0) { - delete this.handlersMap[eventType]; - } - if (Object.keys(this.handlersMap).length === 0) { - this.eventTarget.removeEventListener('message', this.boundEventHandler); - } - } -} -Receiver.receivers = []; - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function _generateEventId(prefix = '', digits = 10) { - let random = ''; - for (let i = 0; i < digits; i++) { - random += Math.floor(Math.random() * 10); - } - return prefix + random; -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Interface for sending messages and waiting for a completion response. - * - */ -class Sender { - constructor(target) { - this.target = target; - this.handlers = new Set(); - } - /** - * Unsubscribe the handler and remove it from our tracking Set. - * - * @param handler - The handler to unsubscribe. - */ - removeMessageHandler(handler) { - if (handler.messageChannel) { - handler.messageChannel.port1.removeEventListener('message', handler.onMessage); - handler.messageChannel.port1.close(); - } - this.handlers.delete(handler); - } - /** - * Send a message to the Receiver located at {@link target}. - * - * @remarks - * We'll first wait a bit for an ACK , if we get one we will wait significantly longer until the - * receiver has had a chance to fully process the event. - * - * @param eventType - Type of event to send. - * @param data - The payload of the event. - * @param timeout - Timeout for waiting on an ACK from the receiver. - * - * @returns An array of settled promises from all the handlers that were listening on the receiver. - */ - async _send(eventType, data, timeout = 50 /* ACK */) { - const messageChannel = typeof MessageChannel !== 'undefined' ? new MessageChannel() : null; - if (!messageChannel) { - throw new Error("connection_unavailable" /* CONNECTION_UNAVAILABLE */); - } - // Node timers and browser timers return fundamentally different types. - // We don't actually care what the value is but TS won't accept unknown and - // we can't cast properly in both environments. - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let completionTimer; - let handler; - return new Promise((resolve, reject) => { - const eventId = _generateEventId('', 20); - messageChannel.port1.start(); - const ackTimer = setTimeout(() => { - reject(new Error("unsupported_event" /* UNSUPPORTED_EVENT */)); - }, timeout); - handler = { - messageChannel, - onMessage(event) { - const messageEvent = event; - if (messageEvent.data.eventId !== eventId) { - return; - } - switch (messageEvent.data.status) { - case "ack" /* ACK */: - // The receiver should ACK first. - clearTimeout(ackTimer); - completionTimer = setTimeout(() => { - reject(new Error("timeout" /* TIMEOUT */)); - }, 3000 /* COMPLETION */); - break; - case "done" /* DONE */: - // Once the receiver's handlers are finished we will get the results. - clearTimeout(completionTimer); - resolve(messageEvent.data.response); - break; - default: - clearTimeout(ackTimer); - clearTimeout(completionTimer); - reject(new Error("invalid_response" /* INVALID_RESPONSE */)); - break; - } - } - }; - this.handlers.add(handler); - messageChannel.port1.addEventListener('message', handler.onMessage); - this.target.postMessage({ - eventType, - eventId, - data - }, [messageChannel.port2]); - }).finally(() => { - if (handler) { - this.removeMessageHandler(handler); - } - }); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Lazy accessor for window, since the compat layer won't tree shake this out, - * we need to make sure not to mess with window unless we have to - */ -function _window() { - return window; -} -function _setWindowLocation(url) { - _window().location.href = url; -} - -/** - * @license - * Copyright 2020 Google LLC. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function _isWorker() { - return (typeof _window()['WorkerGlobalScope'] !== 'undefined' && - typeof _window()['importScripts'] === 'function'); -} -async function _getActiveServiceWorker() { - if (!(navigator === null || navigator === void 0 ? void 0 : navigator.serviceWorker)) { - return null; - } - try { - const registration = await navigator.serviceWorker.ready; - return registration.active; - } - catch (_a) { - return null; - } -} -function _getServiceWorkerController() { - var _a; - return ((_a = navigator === null || navigator === void 0 ? void 0 : navigator.serviceWorker) === null || _a === void 0 ? void 0 : _a.controller) || null; -} -function _getWorkerGlobalScope() { - return _isWorker() ? self : null; -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const DB_NAME = 'firebaseLocalStorageDb'; -const DB_VERSION = 1; -const DB_OBJECTSTORE_NAME = 'firebaseLocalStorage'; -const DB_DATA_KEYPATH = 'fbase_key'; -/** - * Promise wrapper for IDBRequest - * - * Unfortunately we can't cleanly extend Promise since promises are not callable in ES6 - * - */ -class DBPromise { - constructor(request) { - this.request = request; - } - toPromise() { - return new Promise((resolve, reject) => { - this.request.addEventListener('success', () => { - resolve(this.request.result); - }); - this.request.addEventListener('error', () => { - reject(this.request.error); - }); - }); - } -} -function getObjectStore(db, isReadWrite) { - return db - .transaction([DB_OBJECTSTORE_NAME], isReadWrite ? 'readwrite' : 'readonly') - .objectStore(DB_OBJECTSTORE_NAME); -} -function _deleteDatabase() { - const request = indexedDB.deleteDatabase(DB_NAME); - return new DBPromise(request).toPromise(); -} -function _openDatabase() { - const request = indexedDB.open(DB_NAME, DB_VERSION); - return new Promise((resolve, reject) => { - request.addEventListener('error', () => { - reject(request.error); - }); - request.addEventListener('upgradeneeded', () => { - const db = request.result; - try { - db.createObjectStore(DB_OBJECTSTORE_NAME, { keyPath: DB_DATA_KEYPATH }); - } - catch (e) { - reject(e); - } - }); - request.addEventListener('success', async () => { - const db = request.result; - // Strange bug that occurs in Firefox when multiple tabs are opened at the - // same time. The only way to recover seems to be deleting the database - // and re-initializing it. - // https://github.com/firebase/firebase-js-sdk/issues/634 - if (!db.objectStoreNames.contains(DB_OBJECTSTORE_NAME)) { - // Need to close the database or else you get a `blocked` event - db.close(); - await _deleteDatabase(); - resolve(await _openDatabase()); - } - else { - resolve(db); - } - }); - }); -} -async function _putObject(db, key, value) { - const request = getObjectStore(db, true).put({ - [DB_DATA_KEYPATH]: key, - value - }); - return new DBPromise(request).toPromise(); -} -async function getObject(db, key) { - const request = getObjectStore(db, false).get(key); - const data = await new DBPromise(request).toPromise(); - return data === undefined ? null : data.value; -} -function _deleteObject(db, key) { - const request = getObjectStore(db, true).delete(key); - return new DBPromise(request).toPromise(); -} -const _POLLING_INTERVAL_MS = 800; -const _TRANSACTION_RETRY_COUNT = 3; -class IndexedDBLocalPersistence { - constructor() { - this.type = "LOCAL" /* LOCAL */; - this._shouldAllowMigration = true; - this.listeners = {}; - this.localCache = {}; - // setTimeout return value is platform specific - // eslint-disable-next-line @typescript-eslint/no-explicit-any - this.pollTimer = null; - this.pendingWrites = 0; - this.receiver = null; - this.sender = null; - this.serviceWorkerReceiverAvailable = false; - this.activeServiceWorker = null; - // Fire & forget the service worker registration as it may never resolve - this._workerInitializationPromise = - this.initializeServiceWorkerMessaging().then(() => { }, () => { }); - } - async _openDb() { - if (this.db) { - return this.db; - } - this.db = await _openDatabase(); - return this.db; - } - async _withRetries(op) { - let numAttempts = 0; - while (true) { - try { - const db = await this._openDb(); - return await op(db); - } - catch (e) { - if (numAttempts++ > _TRANSACTION_RETRY_COUNT) { - throw e; - } - if (this.db) { - this.db.close(); - this.db = undefined; - } - // TODO: consider adding exponential backoff - } - } - } - /** - * IndexedDB events do not propagate from the main window to the worker context. We rely on a - * postMessage interface to send these events to the worker ourselves. - */ - async initializeServiceWorkerMessaging() { - return _isWorker() ? this.initializeReceiver() : this.initializeSender(); - } - /** - * As the worker we should listen to events from the main window. - */ - async initializeReceiver() { - this.receiver = Receiver._getInstance(_getWorkerGlobalScope()); - // Refresh from persistence if we receive a KeyChanged message. - this.receiver._subscribe("keyChanged" /* KEY_CHANGED */, async (_origin, data) => { - const keys = await this._poll(); - return { - keyProcessed: keys.includes(data.key) - }; - }); - // Let the sender know that we are listening so they give us more timeout. - this.receiver._subscribe("ping" /* PING */, async (_origin, _data) => { - return ["keyChanged" /* KEY_CHANGED */]; - }); - } - /** - * As the main window, we should let the worker know when keys change (set and remove). - * - * @remarks - * {@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/ready | ServiceWorkerContainer.ready} - * may not resolve. - */ - async initializeSender() { - var _a, _b; - // Check to see if there's an active service worker. - this.activeServiceWorker = await _getActiveServiceWorker(); - if (!this.activeServiceWorker) { - return; - } - this.sender = new Sender(this.activeServiceWorker); - // Ping the service worker to check what events they can handle. - const results = await this.sender._send("ping" /* PING */, {}, 800 /* LONG_ACK */); - if (!results) { - return; - } - if (((_a = results[0]) === null || _a === void 0 ? void 0 : _a.fulfilled) && - ((_b = results[0]) === null || _b === void 0 ? void 0 : _b.value.includes("keyChanged" /* KEY_CHANGED */))) { - this.serviceWorkerReceiverAvailable = true; - } - } - /** - * Let the worker know about a changed key, the exact key doesn't technically matter since the - * worker will just trigger a full sync anyway. - * - * @remarks - * For now, we only support one service worker per page. - * - * @param key - Storage key which changed. - */ - async notifyServiceWorker(key) { - if (!this.sender || - !this.activeServiceWorker || - _getServiceWorkerController() !== this.activeServiceWorker) { - return; - } - try { - await this.sender._send("keyChanged" /* KEY_CHANGED */, { key }, - // Use long timeout if receiver has previously responded to a ping from us. - this.serviceWorkerReceiverAvailable - ? 800 /* LONG_ACK */ - : 50 /* ACK */); - } - catch (_a) { - // This is a best effort approach. Ignore errors. - } - } - async _isAvailable() { - try { - if (!indexedDB) { - return false; - } - const db = await _openDatabase(); - await _putObject(db, STORAGE_AVAILABLE_KEY, '1'); - await _deleteObject(db, STORAGE_AVAILABLE_KEY); - return true; - } - catch (_a) { } - return false; - } - async _withPendingWrite(write) { - this.pendingWrites++; - try { - await write(); - } - finally { - this.pendingWrites--; - } - } - async _set(key, value) { - return this._withPendingWrite(async () => { - await this._withRetries((db) => _putObject(db, key, value)); - this.localCache[key] = value; - return this.notifyServiceWorker(key); - }); - } - async _get(key) { - const obj = (await this._withRetries((db) => getObject(db, key))); - this.localCache[key] = obj; - return obj; - } - async _remove(key) { - return this._withPendingWrite(async () => { - await this._withRetries((db) => _deleteObject(db, key)); - delete this.localCache[key]; - return this.notifyServiceWorker(key); - }); - } - async _poll() { - // TODO: check if we need to fallback if getAll is not supported - const result = await this._withRetries((db) => { - const getAllRequest = getObjectStore(db, false).getAll(); - return new DBPromise(getAllRequest).toPromise(); - }); - if (!result) { - return []; - } - // If we have pending writes in progress abort, we'll get picked up on the next poll - if (this.pendingWrites !== 0) { - return []; - } - const keys = []; - const keysInResult = new Set(); - for (const { fbase_key: key, value } of result) { - keysInResult.add(key); - if (JSON.stringify(this.localCache[key]) !== JSON.stringify(value)) { - this.notifyListeners(key, value); - keys.push(key); - } - } - for (const localKey of Object.keys(this.localCache)) { - if (this.localCache[localKey] && !keysInResult.has(localKey)) { - // Deleted - this.notifyListeners(localKey, null); - keys.push(localKey); - } - } - return keys; - } - notifyListeners(key, newValue) { - this.localCache[key] = newValue; - const listeners = this.listeners[key]; - if (listeners) { - for (const listener of Array.from(listeners)) { - listener(newValue); - } - } - } - startPolling() { - this.stopPolling(); - this.pollTimer = setInterval(async () => this._poll(), _POLLING_INTERVAL_MS); - } - stopPolling() { - if (this.pollTimer) { - clearInterval(this.pollTimer); - this.pollTimer = null; - } - } - _addListener(key, listener) { - if (Object.keys(this.listeners).length === 0) { - this.startPolling(); - } - if (!this.listeners[key]) { - this.listeners[key] = new Set(); - // Populate the cache to avoid spuriously triggering on first poll. - void this._get(key); // This can happen in the background async and we can return immediately. - } - this.listeners[key].add(listener); - } - _removeListener(key, listener) { - if (this.listeners[key]) { - this.listeners[key].delete(listener); - if (this.listeners[key].size === 0) { - delete this.listeners[key]; - } - } - if (Object.keys(this.listeners).length === 0) { - this.stopPolling(); - } - } -} -IndexedDBLocalPersistence.type = 'LOCAL'; -/** - * An implementation of {@link Persistence} of type `LOCAL` using `indexedDB` - * for the underlying storage. - * - * @public - */ -const indexedDBLocalPersistence = IndexedDBLocalPersistence; - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function startSignInPhoneMfa(auth, request) { - return _performApiRequest(auth, "POST" /* POST */, "/v2/accounts/mfaSignIn:start" /* START_PHONE_MFA_SIGN_IN */, _addTidIfNecessary(auth, request)); -} -function finalizeSignInPhoneMfa(auth, request) { - return _performApiRequest(auth, "POST" /* POST */, "/v2/accounts/mfaSignIn:finalize" /* FINALIZE_PHONE_MFA_SIGN_IN */, _addTidIfNecessary(auth, request)); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -async function getRecaptchaParams(auth) { - return ((await _performApiRequest(auth, "GET" /* GET */, "/v1/recaptchaParams" /* GET_RECAPTCHA_PARAM */)).recaptchaSiteKey || ''); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function getScriptParentElement() { - var _a, _b; - return (_b = (_a = document.getElementsByTagName('head')) === null || _a === void 0 ? void 0 : _a[0]) !== null && _b !== void 0 ? _b : document; -} -function _loadJS(url) { - // TODO: consider adding timeout support & cancellation - return new Promise((resolve, reject) => { - const el = document.createElement('script'); - el.setAttribute('src', url); - el.onload = resolve; - el.onerror = e => { - const error = _createError("internal-error" /* INTERNAL_ERROR */); - error.customData = e; - reject(error); - }; - el.type = 'text/javascript'; - el.charset = 'UTF-8'; - getScriptParentElement().appendChild(el); - }); -} -function _generateCallbackName(prefix) { - return `__${prefix}${Math.floor(Math.random() * 1000000)}`; -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const _SOLVE_TIME_MS = 500; -const _EXPIRATION_TIME_MS = 60000; -const _WIDGET_ID_START = 1000000000000; -class MockReCaptcha { - constructor(auth) { - this.auth = auth; - this.counter = _WIDGET_ID_START; - this._widgets = new Map(); - } - render(container, parameters) { - const id = this.counter; - this._widgets.set(id, new MockWidget(container, this.auth.name, parameters || {})); - this.counter++; - return id; - } - reset(optWidgetId) { - var _a; - const id = optWidgetId || _WIDGET_ID_START; - void ((_a = this._widgets.get(id)) === null || _a === void 0 ? void 0 : _a.delete()); - this._widgets.delete(id); - } - getResponse(optWidgetId) { - var _a; - const id = optWidgetId || _WIDGET_ID_START; - return ((_a = this._widgets.get(id)) === null || _a === void 0 ? void 0 : _a.getResponse()) || ''; - } - async execute(optWidgetId) { - var _a; - const id = optWidgetId || _WIDGET_ID_START; - void ((_a = this._widgets.get(id)) === null || _a === void 0 ? void 0 : _a.execute()); - return ''; - } -} -class MockWidget { - constructor(containerOrId, appName, params) { - this.params = params; - this.timerId = null; - this.deleted = false; - this.responseToken = null; - this.clickHandler = () => { - this.execute(); - }; - const container = typeof containerOrId === 'string' - ? document.getElementById(containerOrId) - : containerOrId; - _assert(container, "argument-error" /* ARGUMENT_ERROR */, { appName }); - this.container = container; - this.isVisible = this.params.size !== 'invisible'; - if (this.isVisible) { - this.execute(); - } - else { - this.container.addEventListener('click', this.clickHandler); - } - } - getResponse() { - this.checkIfDeleted(); - return this.responseToken; - } - delete() { - this.checkIfDeleted(); - this.deleted = true; - if (this.timerId) { - clearTimeout(this.timerId); - this.timerId = null; - } - this.container.removeEventListener('click', this.clickHandler); - } - execute() { - this.checkIfDeleted(); - if (this.timerId) { - return; - } - this.timerId = window.setTimeout(() => { - this.responseToken = generateRandomAlphaNumericString(50); - const { callback, 'expired-callback': expiredCallback } = this.params; - if (callback) { - try { - callback(this.responseToken); - } - catch (e) { } - } - this.timerId = window.setTimeout(() => { - this.timerId = null; - this.responseToken = null; - if (expiredCallback) { - try { - expiredCallback(); - } - catch (e) { } - } - if (this.isVisible) { - this.execute(); - } - }, _EXPIRATION_TIME_MS); - }, _SOLVE_TIME_MS); - } - checkIfDeleted() { - if (this.deleted) { - throw new Error('reCAPTCHA mock was already deleted!'); - } - } -} -function generateRandomAlphaNumericString(len) { - const chars = []; - const allowedChars = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; - for (let i = 0; i < len; i++) { - chars.push(allowedChars.charAt(Math.floor(Math.random() * allowedChars.length))); - } - return chars.join(''); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -// ReCaptcha will load using the same callback, so the callback function needs -// to be kept around -const _JSLOAD_CALLBACK = _generateCallbackName('rcb'); -const NETWORK_TIMEOUT_DELAY = new Delay(30000, 60000); -const RECAPTCHA_BASE = 'https://www.google.com/recaptcha/api.js?'; -/** - * Loader for the GReCaptcha library. There should only ever be one of this. - */ -class ReCaptchaLoaderImpl { - constructor() { - this.hostLanguage = ''; - this.counter = 0; - this.librarySeparatelyLoaded = !!_window().grecaptcha; - } - load(auth, hl = '') { - _assert(isHostLanguageValid(hl), auth, "argument-error" /* ARGUMENT_ERROR */); - if (this.shouldResolveImmediately(hl)) { - return Promise.resolve(_window().grecaptcha); - } - return new Promise((resolve, reject) => { - const networkTimeout = _window().setTimeout(() => { - reject(_createError(auth, "network-request-failed" /* NETWORK_REQUEST_FAILED */)); - }, NETWORK_TIMEOUT_DELAY.get()); - _window()[_JSLOAD_CALLBACK] = () => { - _window().clearTimeout(networkTimeout); - delete _window()[_JSLOAD_CALLBACK]; - const recaptcha = _window().grecaptcha; - if (!recaptcha) { - reject(_createError(auth, "internal-error" /* INTERNAL_ERROR */)); - return; - } - // Wrap the greptcha render function so that we know if the developer has - // called it separately - const render = recaptcha.render; - recaptcha.render = (container, params) => { - const widgetId = render(container, params); - this.counter++; - return widgetId; - }; - this.hostLanguage = hl; - resolve(recaptcha); - }; - const url = `${RECAPTCHA_BASE}?${(0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.querystring)({ - onload: _JSLOAD_CALLBACK, - render: 'explicit', - hl - })}`; - _loadJS(url).catch(() => { - clearTimeout(networkTimeout); - reject(_createError(auth, "internal-error" /* INTERNAL_ERROR */)); - }); - }); - } - clearedOneInstance() { - this.counter--; - } - shouldResolveImmediately(hl) { - // We can resolve immediately if: - // • grecaptcha is already defined AND ( - // 1. the requested language codes are the same OR - // 2. there exists already a ReCaptcha on the page - // 3. the library was already loaded by the app - // In cases (2) and (3), we _can't_ reload as it would break the recaptchas - // that are already in the page - return (!!_window().grecaptcha && - (hl === this.hostLanguage || - this.counter > 0 || - this.librarySeparatelyLoaded)); - } -} -function isHostLanguageValid(hl) { - return hl.length <= 6 && /^\s*[a-zA-Z0-9\-]*\s*$/.test(hl); -} -class MockReCaptchaLoaderImpl { - async load(auth) { - return new MockReCaptcha(auth); - } - clearedOneInstance() { } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const RECAPTCHA_VERIFIER_TYPE = 'recaptcha'; -const DEFAULT_PARAMS = { - theme: 'light', - type: 'image' -}; -/** - * An {@link https://www.google.com/recaptcha/ | reCAPTCHA}-based application verifier. - * - * @public - */ -class RecaptchaVerifier { - /** - * - * @param containerOrId - The reCAPTCHA container parameter. - * - * @remarks - * This has different meaning depending on whether the reCAPTCHA is hidden or visible. For a - * visible reCAPTCHA the container must be empty. If a string is used, it has to correspond to - * an element ID. The corresponding element must also must be in the DOM at the time of - * initialization. - * - * @param parameters - The optional reCAPTCHA parameters. - * - * @remarks - * Check the reCAPTCHA docs for a comprehensive list. All parameters are accepted except for - * the sitekey. Firebase Auth backend provisions a reCAPTCHA for each project and will - * configure this upon rendering. For an invisible reCAPTCHA, a size key must have the value - * 'invisible'. - * - * @param authExtern - The corresponding Firebase {@link Auth} instance. - * - * @remarks - * If none is provided, the default Firebase {@link Auth} instance is used. A Firebase {@link Auth} instance - * must be initialized with an API key, otherwise an error will be thrown. - */ - constructor(containerOrId, parameters = Object.assign({}, DEFAULT_PARAMS), authExtern) { - this.parameters = parameters; - /** - * The application verifier type. - * - * @remarks - * For a reCAPTCHA verifier, this is 'recaptcha'. - */ - this.type = RECAPTCHA_VERIFIER_TYPE; - this.destroyed = false; - this.widgetId = null; - this.tokenChangeListeners = new Set(); - this.renderPromise = null; - this.recaptcha = null; - this.auth = _castAuth(authExtern); - this.isInvisible = this.parameters.size === 'invisible'; - _assert(typeof document !== 'undefined', this.auth, "operation-not-supported-in-this-environment" /* OPERATION_NOT_SUPPORTED */); - const container = typeof containerOrId === 'string' - ? document.getElementById(containerOrId) - : containerOrId; - _assert(container, this.auth, "argument-error" /* ARGUMENT_ERROR */); - this.container = container; - this.parameters.callback = this.makeTokenCallback(this.parameters.callback); - this._recaptchaLoader = this.auth.settings.appVerificationDisabledForTesting - ? new MockReCaptchaLoaderImpl() - : new ReCaptchaLoaderImpl(); - this.validateStartingState(); - // TODO: Figure out if sdk version is needed - } - /** - * Waits for the user to solve the reCAPTCHA and resolves with the reCAPTCHA token. - * - * @returns A Promise for the reCAPTCHA token. - */ - async verify() { - this.assertNotDestroyed(); - const id = await this.render(); - const recaptcha = this.getAssertedRecaptcha(); - const response = recaptcha.getResponse(id); - if (response) { - return response; - } - return new Promise(resolve => { - const tokenChange = (token) => { - if (!token) { - return; // Ignore token expirations. - } - this.tokenChangeListeners.delete(tokenChange); - resolve(token); - }; - this.tokenChangeListeners.add(tokenChange); - if (this.isInvisible) { - recaptcha.execute(id); - } - }); - } - /** - * Renders the reCAPTCHA widget on the page. - * - * @returns A Promise that resolves with the reCAPTCHA widget ID. - */ - render() { - try { - this.assertNotDestroyed(); - } - catch (e) { - // This method returns a promise. Since it's not async (we want to return the - // _same_ promise if rendering is still occurring), the API surface should - // reject with the error rather than just throw - return Promise.reject(e); - } - if (this.renderPromise) { - return this.renderPromise; - } - this.renderPromise = this.makeRenderPromise().catch(e => { - this.renderPromise = null; - throw e; - }); - return this.renderPromise; - } - /** @internal */ - _reset() { - this.assertNotDestroyed(); - if (this.widgetId !== null) { - this.getAssertedRecaptcha().reset(this.widgetId); - } - } - /** - * Clears the reCAPTCHA widget from the page and destroys the instance. - */ - clear() { - this.assertNotDestroyed(); - this.destroyed = true; - this._recaptchaLoader.clearedOneInstance(); - if (!this.isInvisible) { - this.container.childNodes.forEach(node => { - this.container.removeChild(node); - }); - } - } - validateStartingState() { - _assert(!this.parameters.sitekey, this.auth, "argument-error" /* ARGUMENT_ERROR */); - _assert(this.isInvisible || !this.container.hasChildNodes(), this.auth, "argument-error" /* ARGUMENT_ERROR */); - _assert(typeof document !== 'undefined', this.auth, "operation-not-supported-in-this-environment" /* OPERATION_NOT_SUPPORTED */); - } - makeTokenCallback(existing) { - return token => { - this.tokenChangeListeners.forEach(listener => listener(token)); - if (typeof existing === 'function') { - existing(token); - } - else if (typeof existing === 'string') { - const globalFunc = _window()[existing]; - if (typeof globalFunc === 'function') { - globalFunc(token); - } - } - }; - } - assertNotDestroyed() { - _assert(!this.destroyed, this.auth, "internal-error" /* INTERNAL_ERROR */); - } - async makeRenderPromise() { - await this.init(); - if (!this.widgetId) { - let container = this.container; - if (!this.isInvisible) { - const guaranteedEmpty = document.createElement('div'); - container.appendChild(guaranteedEmpty); - container = guaranteedEmpty; - } - this.widgetId = this.getAssertedRecaptcha().render(container, this.parameters); - } - return this.widgetId; - } - async init() { - _assert(_isHttpOrHttps() && !_isWorker(), this.auth, "internal-error" /* INTERNAL_ERROR */); - await domReady(); - this.recaptcha = await this._recaptchaLoader.load(this.auth, this.auth.languageCode || undefined); - const siteKey = await getRecaptchaParams(this.auth); - _assert(siteKey, this.auth, "internal-error" /* INTERNAL_ERROR */); - this.parameters.sitekey = siteKey; - } - getAssertedRecaptcha() { - _assert(this.recaptcha, this.auth, "internal-error" /* INTERNAL_ERROR */); - return this.recaptcha; - } -} -function domReady() { - let resolver = null; - return new Promise(resolve => { - if (document.readyState === 'complete') { - resolve(); - return; - } - // Document not ready, wait for load before resolving. - // Save resolver, so we can remove listener in case it was externally - // cancelled. - resolver = () => resolve(); - window.addEventListener('load', resolver); - }).catch(e => { - if (resolver) { - window.removeEventListener('load', resolver); - } - throw e; - }); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -class ConfirmationResultImpl { - constructor(verificationId, onConfirmation) { - this.verificationId = verificationId; - this.onConfirmation = onConfirmation; - } - confirm(verificationCode) { - const authCredential = PhoneAuthCredential._fromVerification(this.verificationId, verificationCode); - return this.onConfirmation(authCredential); - } -} -/** - * Asynchronously signs in using a phone number. - * - * @remarks - * This method sends a code via SMS to the given - * phone number, and returns a {@link ConfirmationResult}. After the user - * provides the code sent to their phone, call {@link ConfirmationResult.confirm} - * with the code to sign the user in. - * - * For abuse prevention, this method also requires a {@link ApplicationVerifier}. - * This SDK includes a reCAPTCHA-based implementation, {@link RecaptchaVerifier}. - * This function can work on other platforms that do not support the - * {@link RecaptchaVerifier} (like React Native), but you need to use a - * third-party {@link ApplicationVerifier} implementation. - * - * @example - * ```javascript - * // 'recaptcha-container' is the ID of an element in the DOM. - * const applicationVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container'); - * const confirmationResult = await signInWithPhoneNumber(auth, phoneNumber, applicationVerifier); - * // Obtain a verificationCode from the user. - * const credential = await confirmationResult.confirm(verificationCode); - * ``` - * - * @param auth - The {@link Auth} instance. - * @param phoneNumber - The user's phone number in E.164 format (e.g. +16505550101). - * @param appVerifier - The {@link ApplicationVerifier}. - * - * @public - */ -async function signInWithPhoneNumber(auth, phoneNumber, appVerifier) { - const authInternal = _castAuth(auth); - const verificationId = await _verifyPhoneNumber(authInternal, phoneNumber, (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(appVerifier)); - return new ConfirmationResultImpl(verificationId, cred => signInWithCredential(authInternal, cred)); -} -/** - * Links the user account with the given phone number. - * - * @param user - The user. - * @param phoneNumber - The user's phone number in E.164 format (e.g. +16505550101). - * @param appVerifier - The {@link ApplicationVerifier}. - * - * @public - */ -async function linkWithPhoneNumber(user, phoneNumber, appVerifier) { - const userInternal = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(user); - await _assertLinkedStatus(false, userInternal, "phone" /* PHONE */); - const verificationId = await _verifyPhoneNumber(userInternal.auth, phoneNumber, (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(appVerifier)); - return new ConfirmationResultImpl(verificationId, cred => linkWithCredential(userInternal, cred)); -} -/** - * Re-authenticates a user using a fresh phone credential. - * - * @remarks Use before operations such as {@link updatePassword} that require tokens from recent sign-in attempts. - * - * @param user - The user. - * @param phoneNumber - The user's phone number in E.164 format (e.g. +16505550101). - * @param appVerifier - The {@link ApplicationVerifier}. - * - * @public - */ -async function reauthenticateWithPhoneNumber(user, phoneNumber, appVerifier) { - const userInternal = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(user); - const verificationId = await _verifyPhoneNumber(userInternal.auth, phoneNumber, (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(appVerifier)); - return new ConfirmationResultImpl(verificationId, cred => reauthenticateWithCredential(userInternal, cred)); -} -/** - * Returns a verification ID to be used in conjunction with the SMS code that is sent. - * - */ -async function _verifyPhoneNumber(auth, options, verifier) { - var _a; - const recaptchaToken = await verifier.verify(); - try { - _assert(typeof recaptchaToken === 'string', auth, "argument-error" /* ARGUMENT_ERROR */); - _assert(verifier.type === RECAPTCHA_VERIFIER_TYPE, auth, "argument-error" /* ARGUMENT_ERROR */); - let phoneInfoOptions; - if (typeof options === 'string') { - phoneInfoOptions = { - phoneNumber: options - }; - } - else { - phoneInfoOptions = options; - } - if ('session' in phoneInfoOptions) { - const session = phoneInfoOptions.session; - if ('phoneNumber' in phoneInfoOptions) { - _assert(session.type === "enroll" /* ENROLL */, auth, "internal-error" /* INTERNAL_ERROR */); - const response = await startEnrollPhoneMfa(auth, { - idToken: session.credential, - phoneEnrollmentInfo: { - phoneNumber: phoneInfoOptions.phoneNumber, - recaptchaToken - } - }); - return response.phoneSessionInfo.sessionInfo; - } - else { - _assert(session.type === "signin" /* SIGN_IN */, auth, "internal-error" /* INTERNAL_ERROR */); - const mfaEnrollmentId = ((_a = phoneInfoOptions.multiFactorHint) === null || _a === void 0 ? void 0 : _a.uid) || - phoneInfoOptions.multiFactorUid; - _assert(mfaEnrollmentId, auth, "missing-multi-factor-info" /* MISSING_MFA_INFO */); - const response = await startSignInPhoneMfa(auth, { - mfaPendingCredential: session.credential, - mfaEnrollmentId, - phoneSignInInfo: { - recaptchaToken - } - }); - return response.phoneResponseInfo.sessionInfo; - } - } - else { - const { sessionInfo } = await sendPhoneVerificationCode(auth, { - phoneNumber: phoneInfoOptions.phoneNumber, - recaptchaToken - }); - return sessionInfo; - } - } - finally { - verifier._reset(); - } -} -/** - * Updates the user's phone number. - * - * @example - * ``` - * // 'recaptcha-container' is the ID of an element in the DOM. - * const applicationVerifier = new RecaptchaVerifier('recaptcha-container'); - * const provider = new PhoneAuthProvider(auth); - * const verificationId = await provider.verifyPhoneNumber('+16505550101', applicationVerifier); - * // Obtain the verificationCode from the user. - * const phoneCredential = PhoneAuthProvider.credential(verificationId, verificationCode); - * await updatePhoneNumber(user, phoneCredential); - * ``` - * - * @param user - The user. - * @param credential - A credential authenticating the new phone number. - * - * @public - */ -async function updatePhoneNumber(user, credential) { - await _link$1((0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(user), credential); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Provider for generating an {@link PhoneAuthCredential}. - * - * @example - * ```javascript - * // 'recaptcha-container' is the ID of an element in the DOM. - * const applicationVerifier = new RecaptchaVerifier('recaptcha-container'); - * const provider = new PhoneAuthProvider(auth); - * const verificationId = await provider.verifyPhoneNumber('+16505550101', applicationVerifier); - * // Obtain the verificationCode from the user. - * const phoneCredential = PhoneAuthProvider.credential(verificationId, verificationCode); - * const userCredential = await signInWithCredential(auth, phoneCredential); - * ``` - * - * @public - */ -class PhoneAuthProvider { - /** - * @param auth - The Firebase {@link Auth} instance in which sign-ins should occur. - * - */ - constructor(auth) { - /** Always set to {@link ProviderId}.PHONE. */ - this.providerId = PhoneAuthProvider.PROVIDER_ID; - this.auth = _castAuth(auth); - } - /** - * - * Starts a phone number authentication flow by sending a verification code to the given phone - * number. - * - * @example - * ```javascript - * const provider = new PhoneAuthProvider(auth); - * const verificationId = await provider.verifyPhoneNumber(phoneNumber, applicationVerifier); - * // Obtain verificationCode from the user. - * const authCredential = PhoneAuthProvider.credential(verificationId, verificationCode); - * const userCredential = await signInWithCredential(auth, authCredential); - * ``` - * - * @example - * An alternative flow is provided using the `signInWithPhoneNumber` method. - * ```javascript - * const confirmationResult = signInWithPhoneNumber(auth, phoneNumber, applicationVerifier); - * // Obtain verificationCode from the user. - * const userCredential = confirmationResult.confirm(verificationCode); - * ``` - * - * @param phoneInfoOptions - The user's {@link PhoneInfoOptions}. The phone number should be in - * E.164 format (e.g. +16505550101). - * @param applicationVerifier - For abuse prevention, this method also requires a - * {@link ApplicationVerifier}. This SDK includes a reCAPTCHA-based implementation, - * {@link RecaptchaVerifier}. - * - * @returns A Promise for a verification ID that can be passed to - * {@link PhoneAuthProvider.credential} to identify this flow.. - */ - verifyPhoneNumber(phoneOptions, applicationVerifier) { - return _verifyPhoneNumber(this.auth, phoneOptions, (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(applicationVerifier)); - } - /** - * Creates a phone auth credential, given the verification ID from - * {@link PhoneAuthProvider.verifyPhoneNumber} and the code that was sent to the user's - * mobile device. - * - * @example - * ```javascript - * const provider = new PhoneAuthProvider(auth); - * const verificationId = provider.verifyPhoneNumber(phoneNumber, applicationVerifier); - * // Obtain verificationCode from the user. - * const authCredential = PhoneAuthProvider.credential(verificationId, verificationCode); - * const userCredential = signInWithCredential(auth, authCredential); - * ``` - * - * @example - * An alternative flow is provided using the `signInWithPhoneNumber` method. - * ```javascript - * const confirmationResult = await signInWithPhoneNumber(auth, phoneNumber, applicationVerifier); - * // Obtain verificationCode from the user. - * const userCredential = await confirmationResult.confirm(verificationCode); - * ``` - * - * @param verificationId - The verification ID returned from {@link PhoneAuthProvider.verifyPhoneNumber}. - * @param verificationCode - The verification code sent to the user's mobile device. - * - * @returns The auth provider credential. - */ - static credential(verificationId, verificationCode) { - return PhoneAuthCredential._fromVerification(verificationId, verificationCode); - } - /** - * Generates an {@link AuthCredential} from a {@link UserCredential}. - * @param userCredential - The user credential. - */ - static credentialFromResult(userCredential) { - const credential = userCredential; - return PhoneAuthProvider.credentialFromTaggedObject(credential); - } - /** - * Returns an {@link AuthCredential} when passed an error. - * - * @remarks - * - * This method works for errors like - * `auth/account-exists-with-different-credentials`. This is useful for - * recovering when attempting to set a user's phone number but the number - * in question is already tied to another account. For example, the following - * code tries to update the current user's phone number, and if that - * fails, links the user with the account associated with that number: - * - * ```js - * const provider = new PhoneAuthProvider(auth); - * const verificationId = await provider.verifyPhoneNumber(number, verifier); - * try { - * const code = ''; // Prompt the user for the verification code - * await updatePhoneNumber( - * auth.currentUser, - * PhoneAuthProvider.credential(verificationId, code)); - * } catch (e) { - * if (e.code === 'auth/account-exists-with-different-credential') { - * const cred = PhoneAuthProvider.credentialFromError(e); - * await linkWithCredential(auth.currentUser, cred); - * } - * } - * - * // At this point, auth.currentUser.phoneNumber === number. - * ``` - * - * @param error - The error to generate a credential from. - */ - static credentialFromError(error) { - return PhoneAuthProvider.credentialFromTaggedObject((error.customData || {})); - } - static credentialFromTaggedObject({ _tokenResponse: tokenResponse }) { - if (!tokenResponse) { - return null; - } - const { phoneNumber, temporaryProof } = tokenResponse; - if (phoneNumber && temporaryProof) { - return PhoneAuthCredential._fromTokenResponse(phoneNumber, temporaryProof); - } - return null; - } -} -/** Always set to {@link ProviderId}.PHONE. */ -PhoneAuthProvider.PROVIDER_ID = "phone" /* PHONE */; -/** Always set to {@link SignInMethod}.PHONE. */ -PhoneAuthProvider.PHONE_SIGN_IN_METHOD = "phone" /* PHONE */; - -/** - * @license - * Copyright 2021 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Chooses a popup/redirect resolver to use. This prefers the override (which - * is directly passed in), and falls back to the property set on the auth - * object. If neither are available, this function errors w/ an argument error. - */ -function _withDefaultResolver(auth, resolverOverride) { - if (resolverOverride) { - return _getInstance(resolverOverride); - } - _assert(auth._popupRedirectResolver, auth, "argument-error" /* ARGUMENT_ERROR */); - return auth._popupRedirectResolver; -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -class IdpCredential extends AuthCredential { - constructor(params) { - super("custom" /* CUSTOM */, "custom" /* CUSTOM */); - this.params = params; - } - _getIdTokenResponse(auth) { - return signInWithIdp(auth, this._buildIdpRequest()); - } - _linkToIdToken(auth, idToken) { - return signInWithIdp(auth, this._buildIdpRequest(idToken)); - } - _getReauthenticationResolver(auth) { - return signInWithIdp(auth, this._buildIdpRequest()); - } - _buildIdpRequest(idToken) { - const request = { - requestUri: this.params.requestUri, - sessionId: this.params.sessionId, - postBody: this.params.postBody, - tenantId: this.params.tenantId, - pendingToken: this.params.pendingToken, - returnSecureToken: true, - returnIdpCredential: true - }; - if (idToken) { - request.idToken = idToken; - } - return request; - } -} -function _signIn(params) { - return _signInWithCredential(params.auth, new IdpCredential(params), params.bypassAuthState); -} -function _reauth(params) { - const { auth, user } = params; - _assert(user, auth, "internal-error" /* INTERNAL_ERROR */); - return _reauthenticate(user, new IdpCredential(params), params.bypassAuthState); -} -async function _link(params) { - const { auth, user } = params; - _assert(user, auth, "internal-error" /* INTERNAL_ERROR */); - return _link$1(user, new IdpCredential(params), params.bypassAuthState); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Popup event manager. Handles the popup's entire lifecycle; listens to auth - * events - */ -class AbstractPopupRedirectOperation { - constructor(auth, filter, resolver, user, bypassAuthState = false) { - this.auth = auth; - this.resolver = resolver; - this.user = user; - this.bypassAuthState = bypassAuthState; - this.pendingPromise = null; - this.eventManager = null; - this.filter = Array.isArray(filter) ? filter : [filter]; - } - execute() { - return new Promise(async (resolve, reject) => { - this.pendingPromise = { resolve, reject }; - try { - this.eventManager = await this.resolver._initialize(this.auth); - await this.onExecution(); - this.eventManager.registerConsumer(this); - } - catch (e) { - this.reject(e); - } - }); - } - async onAuthEvent(event) { - const { urlResponse, sessionId, postBody, tenantId, error, type } = event; - if (error) { - this.reject(error); - return; - } - const params = { - auth: this.auth, - requestUri: urlResponse, - sessionId: sessionId, - tenantId: tenantId || undefined, - postBody: postBody || undefined, - user: this.user, - bypassAuthState: this.bypassAuthState - }; - try { - this.resolve(await this.getIdpTask(type)(params)); - } - catch (e) { - this.reject(e); - } - } - onError(error) { - this.reject(error); - } - getIdpTask(type) { - switch (type) { - case "signInViaPopup" /* SIGN_IN_VIA_POPUP */: - case "signInViaRedirect" /* SIGN_IN_VIA_REDIRECT */: - return _signIn; - case "linkViaPopup" /* LINK_VIA_POPUP */: - case "linkViaRedirect" /* LINK_VIA_REDIRECT */: - return _link; - case "reauthViaPopup" /* REAUTH_VIA_POPUP */: - case "reauthViaRedirect" /* REAUTH_VIA_REDIRECT */: - return _reauth; - default: - _fail(this.auth, "internal-error" /* INTERNAL_ERROR */); - } - } - resolve(cred) { - debugAssert(this.pendingPromise, 'Pending promise was never set'); - this.pendingPromise.resolve(cred); - this.unregisterAndCleanUp(); - } - reject(error) { - debugAssert(this.pendingPromise, 'Pending promise was never set'); - this.pendingPromise.reject(error); - this.unregisterAndCleanUp(); - } - unregisterAndCleanUp() { - if (this.eventManager) { - this.eventManager.unregisterConsumer(this); - } - this.pendingPromise = null; - this.cleanUp(); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const _POLL_WINDOW_CLOSE_TIMEOUT = new Delay(2000, 10000); -/** - * Authenticates a Firebase client using a popup-based OAuth authentication flow. - * - * @remarks - * If succeeds, returns the signed in user along with the provider's credential. If sign in was - * unsuccessful, returns an error object containing additional information about the error. - * - * @example - * ```javascript - * // Sign in using a popup. - * const provider = new FacebookAuthProvider(); - * const result = await signInWithPopup(auth, provider); - * - * // The signed-in user info. - * const user = result.user; - * // This gives you a Facebook Access Token. - * const credential = provider.credentialFromResult(auth, result); - * const token = credential.accessToken; - * ``` - * - * @param auth - The {@link Auth} instance. - * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}. - * Non-OAuth providers like {@link EmailAuthProvider} will throw an error. - * @param resolver - An instance of {@link PopupRedirectResolver}, optional - * if already supplied to {@link initializeAuth} or provided by {@link getAuth}. - * - * - * @public - */ -async function signInWithPopup(auth, provider, resolver) { - const authInternal = _castAuth(auth); - _assertInstanceOf(auth, provider, FederatedAuthProvider); - const resolverInternal = _withDefaultResolver(authInternal, resolver); - const action = new PopupOperation(authInternal, "signInViaPopup" /* SIGN_IN_VIA_POPUP */, provider, resolverInternal); - return action.executeNotNull(); -} -/** - * Reauthenticates the current user with the specified {@link OAuthProvider} using a pop-up based - * OAuth flow. - * - * @remarks - * If the reauthentication is successful, the returned result will contain the user and the - * provider's credential. - * - * @example - * ```javascript - * // Sign in using a popup. - * const provider = new FacebookAuthProvider(); - * const result = await signInWithPopup(auth, provider); - * // Reauthenticate using a popup. - * await reauthenticateWithPopup(result.user, provider); - * ``` - * - * @param user - The user. - * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}. - * Non-OAuth providers like {@link EmailAuthProvider} will throw an error. - * @param resolver - An instance of {@link PopupRedirectResolver}, optional - * if already supplied to {@link initializeAuth} or provided by {@link getAuth}. - * - * @public - */ -async function reauthenticateWithPopup(user, provider, resolver) { - const userInternal = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(user); - _assertInstanceOf(userInternal.auth, provider, FederatedAuthProvider); - const resolverInternal = _withDefaultResolver(userInternal.auth, resolver); - const action = new PopupOperation(userInternal.auth, "reauthViaPopup" /* REAUTH_VIA_POPUP */, provider, resolverInternal, userInternal); - return action.executeNotNull(); -} -/** - * Links the authenticated provider to the user account using a pop-up based OAuth flow. - * - * @remarks - * If the linking is successful, the returned result will contain the user and the provider's credential. - * - * - * @example - * ```javascript - * // Sign in using some other provider. - * const result = await signInWithEmailAndPassword(auth, email, password); - * // Link using a popup. - * const provider = new FacebookAuthProvider(); - * await linkWithPopup(result.user, provider); - * ``` - * - * @param user - The user. - * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}. - * Non-OAuth providers like {@link EmailAuthProvider} will throw an error. - * @param resolver - An instance of {@link PopupRedirectResolver}, optional - * if already supplied to {@link initializeAuth} or provided by {@link getAuth}. - * - * @public - */ -async function linkWithPopup(user, provider, resolver) { - const userInternal = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(user); - _assertInstanceOf(userInternal.auth, provider, FederatedAuthProvider); - const resolverInternal = _withDefaultResolver(userInternal.auth, resolver); - const action = new PopupOperation(userInternal.auth, "linkViaPopup" /* LINK_VIA_POPUP */, provider, resolverInternal, userInternal); - return action.executeNotNull(); -} -/** - * Popup event manager. Handles the popup's entire lifecycle; listens to auth - * events - * - */ -class PopupOperation extends AbstractPopupRedirectOperation { - constructor(auth, filter, provider, resolver, user) { - super(auth, filter, resolver, user); - this.provider = provider; - this.authWindow = null; - this.pollId = null; - if (PopupOperation.currentPopupAction) { - PopupOperation.currentPopupAction.cancel(); - } - PopupOperation.currentPopupAction = this; - } - async executeNotNull() { - const result = await this.execute(); - _assert(result, this.auth, "internal-error" /* INTERNAL_ERROR */); - return result; - } - async onExecution() { - debugAssert(this.filter.length === 1, 'Popup operations only handle one event'); - const eventId = _generateEventId(); - this.authWindow = await this.resolver._openPopup(this.auth, this.provider, this.filter[0], // There's always one, see constructor - eventId); - this.authWindow.associatedEvent = eventId; - // Check for web storage support and origin validation _after_ the popup is - // loaded. These operations are slow (~1 second or so) Rather than - // waiting on them before opening the window, optimistically open the popup - // and check for storage support at the same time. If storage support is - // not available, this will cause the whole thing to reject properly. It - // will also close the popup, but since the promise has already rejected, - // the popup closed by user poll will reject into the void. - this.resolver._originValidation(this.auth).catch(e => { - this.reject(e); - }); - this.resolver._isIframeWebStorageSupported(this.auth, isSupported => { - if (!isSupported) { - this.reject(_createError(this.auth, "web-storage-unsupported" /* WEB_STORAGE_UNSUPPORTED */)); - } - }); - // Handle user closure. Notice this does *not* use await - this.pollUserCancellation(); - } - get eventId() { - var _a; - return ((_a = this.authWindow) === null || _a === void 0 ? void 0 : _a.associatedEvent) || null; - } - cancel() { - this.reject(_createError(this.auth, "cancelled-popup-request" /* EXPIRED_POPUP_REQUEST */)); - } - cleanUp() { - if (this.authWindow) { - this.authWindow.close(); - } - if (this.pollId) { - window.clearTimeout(this.pollId); - } - this.authWindow = null; - this.pollId = null; - PopupOperation.currentPopupAction = null; - } - pollUserCancellation() { - const poll = () => { - var _a, _b; - if ((_b = (_a = this.authWindow) === null || _a === void 0 ? void 0 : _a.window) === null || _b === void 0 ? void 0 : _b.closed) { - // Make sure that there is sufficient time for whatever action to - // complete. The window could have closed but the sign in network - // call could still be in flight. - this.pollId = window.setTimeout(() => { - this.pollId = null; - this.reject(_createError(this.auth, "popup-closed-by-user" /* POPUP_CLOSED_BY_USER */)); - }, 2000 /* AUTH_EVENT */); - return; - } - this.pollId = window.setTimeout(poll, _POLL_WINDOW_CLOSE_TIMEOUT.get()); - }; - poll(); - } -} -// Only one popup is ever shown at once. The lifecycle of the current popup -// can be managed / cancelled by the constructor. -PopupOperation.currentPopupAction = null; - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const PENDING_REDIRECT_KEY = 'pendingRedirect'; -// We only get one redirect outcome for any one auth, so just store it -// in here. -const redirectOutcomeMap = new Map(); -class RedirectAction extends AbstractPopupRedirectOperation { - constructor(auth, resolver, bypassAuthState = false) { - super(auth, [ - "signInViaRedirect" /* SIGN_IN_VIA_REDIRECT */, - "linkViaRedirect" /* LINK_VIA_REDIRECT */, - "reauthViaRedirect" /* REAUTH_VIA_REDIRECT */, - "unknown" /* UNKNOWN */ - ], resolver, undefined, bypassAuthState); - this.eventId = null; - } - /** - * Override the execute function; if we already have a redirect result, then - * just return it. - */ - async execute() { - let readyOutcome = redirectOutcomeMap.get(this.auth._key()); - if (!readyOutcome) { - try { - const hasPendingRedirect = await _getAndClearPendingRedirectStatus(this.resolver, this.auth); - const result = hasPendingRedirect ? await super.execute() : null; - readyOutcome = () => Promise.resolve(result); - } - catch (e) { - readyOutcome = () => Promise.reject(e); - } - redirectOutcomeMap.set(this.auth._key(), readyOutcome); - } - // If we're not bypassing auth state, the ready outcome should be set to - // null. - if (!this.bypassAuthState) { - redirectOutcomeMap.set(this.auth._key(), () => Promise.resolve(null)); - } - return readyOutcome(); - } - async onAuthEvent(event) { - if (event.type === "signInViaRedirect" /* SIGN_IN_VIA_REDIRECT */) { - return super.onAuthEvent(event); - } - else if (event.type === "unknown" /* UNKNOWN */) { - // This is a sentinel value indicating there's no pending redirect - this.resolve(null); - return; - } - if (event.eventId) { - const user = await this.auth._redirectUserForId(event.eventId); - if (user) { - this.user = user; - return super.onAuthEvent(event); - } - else { - this.resolve(null); - } - } - } - async onExecution() { } - cleanUp() { } -} -async function _getAndClearPendingRedirectStatus(resolver, auth) { - const key = pendingRedirectKey(auth); - const persistence = resolverPersistence(resolver); - if (!(await persistence._isAvailable())) { - return false; - } - const hasPendingRedirect = (await persistence._get(key)) === 'true'; - await persistence._remove(key); - return hasPendingRedirect; -} -async function _setPendingRedirectStatus(resolver, auth) { - return resolverPersistence(resolver)._set(pendingRedirectKey(auth), 'true'); -} -function _clearRedirectOutcomes() { - redirectOutcomeMap.clear(); -} -function resolverPersistence(resolver) { - return _getInstance(resolver._redirectPersistence); -} -function pendingRedirectKey(auth) { - return _persistenceKeyName(PENDING_REDIRECT_KEY, auth.config.apiKey, auth.name); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Authenticates a Firebase client using a full-page redirect flow. - * - * @remarks - * To handle the results and errors for this operation, refer to {@link getRedirectResult}. - * - * @example - * ```javascript - * // Sign in using a redirect. - * const provider = new FacebookAuthProvider(); - * // You can add additional scopes to the provider: - * provider.addScope('user_birthday'); - * // Start a sign in process for an unauthenticated user. - * await signInWithRedirect(auth, provider); - * // This will trigger a full page redirect away from your app - * - * // After returning from the redirect when your app initializes you can obtain the result - * const result = await getRedirectResult(auth); - * if (result) { - * // This is the signed-in user - * const user = result.user; - * // This gives you a Facebook Access Token. - * const credential = provider.credentialFromResult(auth, result); - * const token = credential.accessToken; - * } - * // As this API can be used for sign-in, linking and reauthentication, - * // check the operationType to determine what triggered this redirect - * // operation. - * const operationType = result.operationType; - * ``` - * - * @param auth - The {@link Auth} instance. - * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}. - * Non-OAuth providers like {@link EmailAuthProvider} will throw an error. - * @param resolver - An instance of {@link PopupRedirectResolver}, optional - * if already supplied to {@link initializeAuth} or provided by {@link getAuth}. - * - * @public - */ -function signInWithRedirect(auth, provider, resolver) { - return _signInWithRedirect(auth, provider, resolver); -} -async function _signInWithRedirect(auth, provider, resolver) { - const authInternal = _castAuth(auth); - _assertInstanceOf(auth, provider, FederatedAuthProvider); - const resolverInternal = _withDefaultResolver(authInternal, resolver); - await _setPendingRedirectStatus(resolverInternal, authInternal); - return resolverInternal._openRedirect(authInternal, provider, "signInViaRedirect" /* SIGN_IN_VIA_REDIRECT */); -} -/** - * Reauthenticates the current user with the specified {@link OAuthProvider} using a full-page redirect flow. - * - * @example - * ```javascript - * // Sign in using a redirect. - * const provider = new FacebookAuthProvider(); - * const result = await signInWithRedirect(auth, provider); - * // This will trigger a full page redirect away from your app - * - * // After returning from the redirect when your app initializes you can obtain the result - * const result = await getRedirectResult(auth); - * // Link using a redirect. - * await linkWithRedirect(result.user, provider); - * // This will again trigger a full page redirect away from your app - * - * // After returning from the redirect when your app initializes you can obtain the result - * const result = await getRedirectResult(auth); - * ``` - * - * @param user - The user. - * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}. - * Non-OAuth providers like {@link EmailAuthProvider} will throw an error. - * @param resolver - An instance of {@link PopupRedirectResolver}, optional - * if already supplied to {@link initializeAuth} or provided by {@link getAuth}. - * - * @public - */ -function reauthenticateWithRedirect(user, provider, resolver) { - return _reauthenticateWithRedirect(user, provider, resolver); -} -async function _reauthenticateWithRedirect(user, provider, resolver) { - const userInternal = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(user); - _assertInstanceOf(userInternal.auth, provider, FederatedAuthProvider); - // Allow the resolver to error before persisting the redirect user - const resolverInternal = _withDefaultResolver(userInternal.auth, resolver); - await _setPendingRedirectStatus(resolverInternal, userInternal.auth); - const eventId = await prepareUserForRedirect(userInternal); - return resolverInternal._openRedirect(userInternal.auth, provider, "reauthViaRedirect" /* REAUTH_VIA_REDIRECT */, eventId); -} -/** - * Links the {@link OAuthProvider} to the user account using a full-page redirect flow. - * - * @example - * ```javascript - * // Sign in using some other provider. - * const result = await signInWithEmailAndPassword(auth, email, password); - * // Link using a redirect. - * const provider = new FacebookAuthProvider(); - * await linkWithRedirect(result.user, provider); - * // This will trigger a full page redirect away from your app - * - * // After returning from the redirect when your app initializes you can obtain the result - * const result = await getRedirectResult(auth); - * ``` - * - * @param user - The user. - * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}. - * Non-OAuth providers like {@link EmailAuthProvider} will throw an error. - * @param resolver - An instance of {@link PopupRedirectResolver}, optional - * if already supplied to {@link initializeAuth} or provided by {@link getAuth}. - * - * - * @public - */ -function linkWithRedirect(user, provider, resolver) { - return _linkWithRedirect(user, provider, resolver); -} -async function _linkWithRedirect(user, provider, resolver) { - const userInternal = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getModularInstance)(user); - _assertInstanceOf(userInternal.auth, provider, FederatedAuthProvider); - // Allow the resolver to error before persisting the redirect user - const resolverInternal = _withDefaultResolver(userInternal.auth, resolver); - await _assertLinkedStatus(false, userInternal, provider.providerId); - await _setPendingRedirectStatus(resolverInternal, userInternal.auth); - const eventId = await prepareUserForRedirect(userInternal); - return resolverInternal._openRedirect(userInternal.auth, provider, "linkViaRedirect" /* LINK_VIA_REDIRECT */, eventId); -} -/** - * Returns a {@link UserCredential} from the redirect-based sign-in flow. - * - * @remarks - * If sign-in succeeded, returns the signed in user. If sign-in was unsuccessful, fails with an - * error. If no redirect operation was called, returns a {@link UserCredential} - * with a null `user`. - * - * @example - * ```javascript - * // Sign in using a redirect. - * const provider = new FacebookAuthProvider(); - * // You can add additional scopes to the provider: - * provider.addScope('user_birthday'); - * // Start a sign in process for an unauthenticated user. - * await signInWithRedirect(auth, provider); - * // This will trigger a full page redirect away from your app - * - * // After returning from the redirect when your app initializes you can obtain the result - * const result = await getRedirectResult(auth); - * if (result) { - * // This is the signed-in user - * const user = result.user; - * // This gives you a Facebook Access Token. - * const credential = provider.credentialFromResult(auth, result); - * const token = credential.accessToken; - * } - * // As this API can be used for sign-in, linking and reauthentication, - * // check the operationType to determine what triggered this redirect - * // operation. - * const operationType = result.operationType; - * ``` - * - * @param auth - The {@link Auth} instance. - * @param resolver - An instance of {@link PopupRedirectResolver}, optional - * if already supplied to {@link initializeAuth} or provided by {@link getAuth}. - * - * @public - */ -async function getRedirectResult(auth, resolver) { - await _castAuth(auth)._initializationPromise; - return _getRedirectResult(auth, resolver, false); -} -async function _getRedirectResult(auth, resolverExtern, bypassAuthState = false) { - const authInternal = _castAuth(auth); - const resolver = _withDefaultResolver(authInternal, resolverExtern); - const action = new RedirectAction(authInternal, resolver, bypassAuthState); - const result = await action.execute(); - if (result && !bypassAuthState) { - delete result.user._redirectEventId; - await authInternal._persistUserIfCurrent(result.user); - await authInternal._setRedirectUser(null, resolverExtern); - } - return result; -} -async function prepareUserForRedirect(user) { - const eventId = _generateEventId(`${user.uid}:::`); - user._redirectEventId = eventId; - await user.auth._setRedirectUser(user); - await user.auth._persistUserIfCurrent(user); - return eventId; -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -// The amount of time to store the UIDs of seen events; this is -// set to 10 min by default -const EVENT_DUPLICATION_CACHE_DURATION_MS = 10 * 60 * 1000; -class AuthEventManager { - constructor(auth) { - this.auth = auth; - this.cachedEventUids = new Set(); - this.consumers = new Set(); - this.queuedRedirectEvent = null; - this.hasHandledPotentialRedirect = false; - this.lastProcessedEventTime = Date.now(); - } - registerConsumer(authEventConsumer) { - this.consumers.add(authEventConsumer); - if (this.queuedRedirectEvent && - this.isEventForConsumer(this.queuedRedirectEvent, authEventConsumer)) { - this.sendToConsumer(this.queuedRedirectEvent, authEventConsumer); - this.saveEventToCache(this.queuedRedirectEvent); - this.queuedRedirectEvent = null; - } - } - unregisterConsumer(authEventConsumer) { - this.consumers.delete(authEventConsumer); - } - onEvent(event) { - // Check if the event has already been handled - if (this.hasEventBeenHandled(event)) { - return false; - } - let handled = false; - this.consumers.forEach(consumer => { - if (this.isEventForConsumer(event, consumer)) { - handled = true; - this.sendToConsumer(event, consumer); - this.saveEventToCache(event); - } - }); - if (this.hasHandledPotentialRedirect || !isRedirectEvent(event)) { - // If we've already seen a redirect before, or this is a popup event, - // bail now - return handled; - } - this.hasHandledPotentialRedirect = true; - // If the redirect wasn't handled, hang on to it - if (!handled) { - this.queuedRedirectEvent = event; - handled = true; - } - return handled; - } - sendToConsumer(event, consumer) { - var _a; - if (event.error && !isNullRedirectEvent(event)) { - const code = ((_a = event.error.code) === null || _a === void 0 ? void 0 : _a.split('auth/')[1]) || - "internal-error" /* INTERNAL_ERROR */; - consumer.onError(_createError(this.auth, code)); - } - else { - consumer.onAuthEvent(event); - } - } - isEventForConsumer(event, consumer) { - const eventIdMatches = consumer.eventId === null || - (!!event.eventId && event.eventId === consumer.eventId); - return consumer.filter.includes(event.type) && eventIdMatches; - } - hasEventBeenHandled(event) { - if (Date.now() - this.lastProcessedEventTime >= - EVENT_DUPLICATION_CACHE_DURATION_MS) { - this.cachedEventUids.clear(); - } - return this.cachedEventUids.has(eventUid(event)); - } - saveEventToCache(event) { - this.cachedEventUids.add(eventUid(event)); - this.lastProcessedEventTime = Date.now(); - } -} -function eventUid(e) { - return [e.type, e.eventId, e.sessionId, e.tenantId].filter(v => v).join('-'); -} -function isNullRedirectEvent({ type, error }) { - return (type === "unknown" /* UNKNOWN */ && - (error === null || error === void 0 ? void 0 : error.code) === `auth/${"no-auth-event" /* NO_AUTH_EVENT */}`); -} -function isRedirectEvent(event) { - switch (event.type) { - case "signInViaRedirect" /* SIGN_IN_VIA_REDIRECT */: - case "linkViaRedirect" /* LINK_VIA_REDIRECT */: - case "reauthViaRedirect" /* REAUTH_VIA_REDIRECT */: - return true; - case "unknown" /* UNKNOWN */: - return isNullRedirectEvent(event); - default: - return false; - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -async function _getProjectConfig(auth, request = {}) { - return _performApiRequest(auth, "GET" /* GET */, "/v1/projects" /* GET_PROJECT_CONFIG */, request); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const IP_ADDRESS_REGEX = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/; -const HTTP_REGEX = /^https?/; -async function _validateOrigin(auth) { - // Skip origin validation if we are in an emulated environment - if (auth.config.emulator) { - return; - } - const { authorizedDomains } = await _getProjectConfig(auth); - for (const domain of authorizedDomains) { - try { - if (matchDomain(domain)) { - return; - } - } - catch (_a) { - // Do nothing if there's a URL error; just continue searching - } - } - // In the old SDK, this error also provides helpful messages. - _fail(auth, "unauthorized-domain" /* INVALID_ORIGIN */); -} -function matchDomain(expected) { - const currentUrl = _getCurrentUrl(); - const { protocol, hostname } = new URL(currentUrl); - if (expected.startsWith('chrome-extension://')) { - const ceUrl = new URL(expected); - if (ceUrl.hostname === '' && hostname === '') { - // For some reason we're not parsing chrome URLs properly - return (protocol === 'chrome-extension:' && - expected.replace('chrome-extension://', '') === - currentUrl.replace('chrome-extension://', '')); - } - return protocol === 'chrome-extension:' && ceUrl.hostname === hostname; - } - if (!HTTP_REGEX.test(protocol)) { - return false; - } - if (IP_ADDRESS_REGEX.test(expected)) { - // The domain has to be exactly equal to the pattern, as an IP domain will - // only contain the IP, no extra character. - return hostname === expected; - } - // Dots in pattern should be escaped. - const escapedDomainPattern = expected.replace(/\./g, '\\.'); - // Non ip address domains. - // domain.com = *.domain.com OR domain.com - const re = new RegExp('^(.+\\.' + escapedDomainPattern + '|' + escapedDomainPattern + ')$', 'i'); - return re.test(hostname); -} - -/** - * @license - * Copyright 2020 Google LLC. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const NETWORK_TIMEOUT = new Delay(30000, 60000); -/** - * Reset unlaoded GApi modules. If gapi.load fails due to a network error, - * it will stop working after a retrial. This is a hack to fix this issue. - */ -function resetUnloadedGapiModules() { - // Clear last failed gapi.load state to force next gapi.load to first - // load the failed gapi.iframes module. - // Get gapix.beacon context. - const beacon = _window().___jsl; - // Get current hint. - if (beacon === null || beacon === void 0 ? void 0 : beacon.H) { - // Get gapi hint. - for (const hint of Object.keys(beacon.H)) { - // Requested modules. - beacon.H[hint].r = beacon.H[hint].r || []; - // Loaded modules. - beacon.H[hint].L = beacon.H[hint].L || []; - // Set requested modules to a copy of the loaded modules. - beacon.H[hint].r = [...beacon.H[hint].L]; - // Clear pending callbacks. - if (beacon.CP) { - for (let i = 0; i < beacon.CP.length; i++) { - // Remove all failed pending callbacks. - beacon.CP[i] = null; - } - } - } - } -} -function loadGapi(auth) { - return new Promise((resolve, reject) => { - var _a, _b, _c; - // Function to run when gapi.load is ready. - function loadGapiIframe() { - // The developer may have tried to previously run gapi.load and failed. - // Run this to fix that. - resetUnloadedGapiModules(); - gapi.load('gapi.iframes', { - callback: () => { - resolve(gapi.iframes.getContext()); - }, - ontimeout: () => { - // The above reset may be sufficient, but having this reset after - // failure ensures that if the developer calls gapi.load after the - // connection is re-established and before another attempt to embed - // the iframe, it would work and would not be broken because of our - // failed attempt. - // Timeout when gapi.iframes.Iframe not loaded. - resetUnloadedGapiModules(); - reject(_createError(auth, "network-request-failed" /* NETWORK_REQUEST_FAILED */)); - }, - timeout: NETWORK_TIMEOUT.get() - }); - } - if ((_b = (_a = _window().gapi) === null || _a === void 0 ? void 0 : _a.iframes) === null || _b === void 0 ? void 0 : _b.Iframe) { - // If gapi.iframes.Iframe available, resolve. - resolve(gapi.iframes.getContext()); - } - else if (!!((_c = _window().gapi) === null || _c === void 0 ? void 0 : _c.load)) { - // Gapi loader ready, load gapi.iframes. - loadGapiIframe(); - } - else { - // Create a new iframe callback when this is called so as not to overwrite - // any previous defined callback. This happens if this method is called - // multiple times in parallel and could result in the later callback - // overwriting the previous one. This would end up with a iframe - // timeout. - const cbName = _generateCallbackName('iframefcb'); - // GApi loader not available, dynamically load platform.js. - _window()[cbName] = () => { - // GApi loader should be ready. - if (!!gapi.load) { - loadGapiIframe(); - } - else { - // Gapi loader failed, throw error. - reject(_createError(auth, "network-request-failed" /* NETWORK_REQUEST_FAILED */)); - } - }; - // Load GApi loader. - return _loadJS(`https://apis.google.com/js/api.js?onload=${cbName}`).catch(e => reject(e)); - } - }).catch(error => { - // Reset cached promise to allow for retrial. - cachedGApiLoader = null; - throw error; - }); -} -let cachedGApiLoader = null; -function _loadGapi(auth) { - cachedGApiLoader = cachedGApiLoader || loadGapi(auth); - return cachedGApiLoader; -} - -/** - * @license - * Copyright 2020 Google LLC. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const PING_TIMEOUT = new Delay(5000, 15000); -const IFRAME_PATH = '__/auth/iframe'; -const EMULATED_IFRAME_PATH = 'emulator/auth/iframe'; -const IFRAME_ATTRIBUTES = { - style: { - position: 'absolute', - top: '-100px', - width: '1px', - height: '1px' - }, - 'aria-hidden': 'true', - tabindex: '-1' -}; -// Map from apiHost to endpoint ID for passing into iframe. In current SDK, apiHost can be set to -// anything (not from a list of endpoints with IDs as in legacy), so this is the closest we can get. -const EID_FROM_APIHOST = new Map([ - ["identitytoolkit.googleapis.com" /* API_HOST */, 'p'], - ['staging-identitytoolkit.sandbox.googleapis.com', 's'], - ['test-identitytoolkit.sandbox.googleapis.com', 't'] // test -]); -function getIframeUrl(auth) { - const config = auth.config; - _assert(config.authDomain, auth, "auth-domain-config-required" /* MISSING_AUTH_DOMAIN */); - const url = config.emulator - ? _emulatorUrl(config, EMULATED_IFRAME_PATH) - : `https://${auth.config.authDomain}/${IFRAME_PATH}`; - const params = { - apiKey: config.apiKey, - appName: auth.name, - v: _firebase_app__WEBPACK_IMPORTED_MODULE_1__.SDK_VERSION - }; - const eid = EID_FROM_APIHOST.get(auth.config.apiHost); - if (eid) { - params.eid = eid; - } - const frameworks = auth._getFrameworks(); - if (frameworks.length) { - params.fw = frameworks.join(','); - } - return `${url}?${(0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.querystring)(params).slice(1)}`; -} -async function _openIframe(auth) { - const context = await _loadGapi(auth); - const gapi = _window().gapi; - _assert(gapi, auth, "internal-error" /* INTERNAL_ERROR */); - return context.open({ - where: document.body, - url: getIframeUrl(auth), - messageHandlersFilter: gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER, - attributes: IFRAME_ATTRIBUTES, - dontclear: true - }, (iframe) => new Promise(async (resolve, reject) => { - await iframe.restyle({ - // Prevent iframe from closing on mouse out. - setHideOnLeave: false - }); - const networkError = _createError(auth, "network-request-failed" /* NETWORK_REQUEST_FAILED */); - // Confirm iframe is correctly loaded. - // To fallback on failure, set a timeout. - const networkErrorTimer = _window().setTimeout(() => { - reject(networkError); - }, PING_TIMEOUT.get()); - // Clear timer and resolve pending iframe ready promise. - function clearTimerAndResolve() { - _window().clearTimeout(networkErrorTimer); - resolve(iframe); - } - // This returns an IThenable. However the reject part does not call - // when the iframe is not loaded. - iframe.ping(clearTimerAndResolve).then(clearTimerAndResolve, () => { - reject(networkError); - }); - })); -} - -/** - * @license - * Copyright 2020 Google LLC. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const BASE_POPUP_OPTIONS = { - location: 'yes', - resizable: 'yes', - statusbar: 'yes', - toolbar: 'no' -}; -const DEFAULT_WIDTH = 500; -const DEFAULT_HEIGHT = 600; -const TARGET_BLANK = '_blank'; -const FIREFOX_EMPTY_URL = 'http://localhost'; -class AuthPopup { - constructor(window) { - this.window = window; - this.associatedEvent = null; - } - close() { - if (this.window) { - try { - this.window.close(); - } - catch (e) { } - } - } -} -function _open(auth, url, name, width = DEFAULT_WIDTH, height = DEFAULT_HEIGHT) { - const top = Math.max((window.screen.availHeight - height) / 2, 0).toString(); - const left = Math.max((window.screen.availWidth - width) / 2, 0).toString(); - let target = ''; - const options = Object.assign(Object.assign({}, BASE_POPUP_OPTIONS), { width: width.toString(), height: height.toString(), top, - left }); - // Chrome iOS 7 and 8 is returning an undefined popup win when target is - // specified, even though the popup is not necessarily blocked. - const ua = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.getUA)().toLowerCase(); - if (name) { - target = _isChromeIOS(ua) ? TARGET_BLANK : name; - } - if (_isFirefox(ua)) { - // Firefox complains when invalid URLs are popped out. Hacky way to bypass. - url = url || FIREFOX_EMPTY_URL; - // Firefox disables by default scrolling on popup windows, which can create - // issues when the user has many Google accounts, for instance. - options.scrollbars = 'yes'; - } - const optionsString = Object.entries(options).reduce((accum, [key, value]) => `${accum}${key}=${value},`, ''); - if (_isIOSStandalone(ua) && target !== '_self') { - openAsNewWindowIOS(url || '', target); - return new AuthPopup(null); - } - // about:blank getting sanitized causing browsers like IE/Edge to display - // brief error message before redirecting to handler. - const newWin = window.open(url || '', target, optionsString); - _assert(newWin, auth, "popup-blocked" /* POPUP_BLOCKED */); - // Flaky on IE edge, encapsulate with a try and catch. - try { - newWin.focus(); - } - catch (e) { } - return new AuthPopup(newWin); -} -function openAsNewWindowIOS(url, target) { - const el = document.createElement('a'); - el.href = url; - el.target = target; - const click = document.createEvent('MouseEvent'); - click.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 1, null); - el.dispatchEvent(click); -} - -/** - * @license - * Copyright 2021 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * URL for Authentication widget which will initiate the OAuth handshake - * - * @internal - */ -const WIDGET_PATH = '__/auth/handler'; -/** - * URL for emulated environment - * - * @internal - */ -const EMULATOR_WIDGET_PATH = 'emulator/auth/handler'; -function _getRedirectUrl(auth, provider, authType, redirectUrl, eventId, additionalParams) { - _assert(auth.config.authDomain, auth, "auth-domain-config-required" /* MISSING_AUTH_DOMAIN */); - _assert(auth.config.apiKey, auth, "invalid-api-key" /* INVALID_API_KEY */); - const params = { - apiKey: auth.config.apiKey, - appName: auth.name, - authType, - redirectUrl, - v: _firebase_app__WEBPACK_IMPORTED_MODULE_1__.SDK_VERSION, - eventId - }; - if (provider instanceof FederatedAuthProvider) { - provider.setDefaultLanguage(auth.languageCode); - params.providerId = provider.providerId || ''; - if (!(0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(provider.getCustomParameters())) { - params.customParameters = JSON.stringify(provider.getCustomParameters()); - } - // TODO set additionalParams from the provider as well? - for (const [key, value] of Object.entries(additionalParams || {})) { - params[key] = value; - } - } - if (provider instanceof BaseOAuthProvider) { - const scopes = provider.getScopes().filter(scope => scope !== ''); - if (scopes.length > 0) { - params.scopes = scopes.join(','); - } - } - if (auth.tenantId) { - params.tid = auth.tenantId; - } - // TODO: maybe set eid as endipointId - // TODO: maybe set fw as Frameworks.join(",") - const paramsDict = params; - for (const key of Object.keys(paramsDict)) { - if (paramsDict[key] === undefined) { - delete paramsDict[key]; - } - } - return `${getHandlerBase(auth)}?${(0,_firebase_util__WEBPACK_IMPORTED_MODULE_0__.querystring)(paramsDict).slice(1)}`; -} -function getHandlerBase({ config }) { - if (!config.emulator) { - return `https://${config.authDomain}/${WIDGET_PATH}`; - } - return _emulatorUrl(config, EMULATOR_WIDGET_PATH); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * The special web storage event - * - */ -const WEB_STORAGE_SUPPORT_KEY = 'webStorageSupport'; -class BrowserPopupRedirectResolver { - constructor() { - this.eventManagers = {}; - this.iframes = {}; - this.originValidationPromises = {}; - this._redirectPersistence = browserSessionPersistence; - this._completeRedirectFn = _getRedirectResult; - } - // Wrapping in async even though we don't await anywhere in order - // to make sure errors are raised as promise rejections - async _openPopup(auth, provider, authType, eventId) { - var _a; - debugAssert((_a = this.eventManagers[auth._key()]) === null || _a === void 0 ? void 0 : _a.manager, '_initialize() not called before _openPopup()'); - const url = _getRedirectUrl(auth, provider, authType, _getCurrentUrl(), eventId); - return _open(auth, url, _generateEventId()); - } - async _openRedirect(auth, provider, authType, eventId) { - await this._originValidation(auth); - _setWindowLocation(_getRedirectUrl(auth, provider, authType, _getCurrentUrl(), eventId)); - return new Promise(() => { }); - } - _initialize(auth) { - const key = auth._key(); - if (this.eventManagers[key]) { - const { manager, promise } = this.eventManagers[key]; - if (manager) { - return Promise.resolve(manager); - } - else { - debugAssert(promise, 'If manager is not set, promise should be'); - return promise; - } - } - const promise = this.initAndGetManager(auth); - this.eventManagers[key] = { promise }; - // If the promise is rejected, the key should be removed so that the - // operation can be retried later. - promise.catch(() => { - delete this.eventManagers[key]; - }); - return promise; - } - async initAndGetManager(auth) { - const iframe = await _openIframe(auth); - const manager = new AuthEventManager(auth); - iframe.register('authEvent', (iframeEvent) => { - _assert(iframeEvent === null || iframeEvent === void 0 ? void 0 : iframeEvent.authEvent, auth, "invalid-auth-event" /* INVALID_AUTH_EVENT */); - // TODO: Consider splitting redirect and popup events earlier on - const handled = manager.onEvent(iframeEvent.authEvent); - return { status: handled ? "ACK" /* ACK */ : "ERROR" /* ERROR */ }; - }, gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER); - this.eventManagers[auth._key()] = { manager }; - this.iframes[auth._key()] = iframe; - return manager; - } - _isIframeWebStorageSupported(auth, cb) { - const iframe = this.iframes[auth._key()]; - iframe.send(WEB_STORAGE_SUPPORT_KEY, { type: WEB_STORAGE_SUPPORT_KEY }, result => { - var _a; - const isSupported = (_a = result === null || result === void 0 ? void 0 : result[0]) === null || _a === void 0 ? void 0 : _a[WEB_STORAGE_SUPPORT_KEY]; - if (isSupported !== undefined) { - cb(!!isSupported); - } - _fail(auth, "internal-error" /* INTERNAL_ERROR */); - }, gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER); - } - _originValidation(auth) { - const key = auth._key(); - if (!this.originValidationPromises[key]) { - this.originValidationPromises[key] = _validateOrigin(auth); - } - return this.originValidationPromises[key]; - } - get _shouldInitProactively() { - // Mobile browsers and Safari need to optimistically initialize - return _isMobileBrowser() || _isSafari() || _isIOS(); - } -} -/** - * An implementation of {@link PopupRedirectResolver} suitable for browser - * based applications. - * - * @public - */ -const browserPopupRedirectResolver = BrowserPopupRedirectResolver; - -class MultiFactorAssertionImpl { - constructor(factorId) { - this.factorId = factorId; - } - _process(auth, session, displayName) { - switch (session.type) { - case "enroll" /* ENROLL */: - return this._finalizeEnroll(auth, session.credential, displayName); - case "signin" /* SIGN_IN */: - return this._finalizeSignIn(auth, session.credential); - default: - return debugFail('unexpected MultiFactorSessionType'); - } - } -} - -/** - * {@inheritdoc PhoneMultiFactorAssertion} - * - * @public - */ -class PhoneMultiFactorAssertionImpl extends MultiFactorAssertionImpl { - constructor(credential) { - super("phone" /* PHONE */); - this.credential = credential; - } - /** @internal */ - static _fromCredential(credential) { - return new PhoneMultiFactorAssertionImpl(credential); - } - /** @internal */ - _finalizeEnroll(auth, idToken, displayName) { - return finalizeEnrollPhoneMfa(auth, { - idToken, - displayName, - phoneVerificationInfo: this.credential._makeVerificationRequest() - }); - } - /** @internal */ - _finalizeSignIn(auth, mfaPendingCredential) { - return finalizeSignInPhoneMfa(auth, { - mfaPendingCredential, - phoneVerificationInfo: this.credential._makeVerificationRequest() - }); - } -} -/** - * Provider for generating a {@link PhoneMultiFactorAssertion}. - * - * @public - */ -class PhoneMultiFactorGenerator { - constructor() { } - /** - * Provides a {@link PhoneMultiFactorAssertion} to confirm ownership of the phone second factor. - * - * @param phoneAuthCredential - A credential provided by {@link PhoneAuthProvider.credential}. - * @returns A {@link PhoneMultiFactorAssertion} which can be used with - * {@link MultiFactorResolver.resolveSignIn} - */ - static assertion(credential) { - return PhoneMultiFactorAssertionImpl._fromCredential(credential); - } -} -/** - * The identifier of the phone second factor: `phone`. - */ -PhoneMultiFactorGenerator.FACTOR_ID = 'phone'; - -var name = "@firebase/auth"; -var version = "0.19.10"; - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -class AuthInterop { - constructor(auth) { - this.auth = auth; - this.internalListeners = new Map(); - } - getUid() { - var _a; - this.assertAuthConfigured(); - return ((_a = this.auth.currentUser) === null || _a === void 0 ? void 0 : _a.uid) || null; - } - async getToken(forceRefresh) { - this.assertAuthConfigured(); - await this.auth._initializationPromise; - if (!this.auth.currentUser) { - return null; - } - const accessToken = await this.auth.currentUser.getIdToken(forceRefresh); - return { accessToken }; - } - addAuthTokenListener(listener) { - this.assertAuthConfigured(); - if (this.internalListeners.has(listener)) { - return; - } - const unsubscribe = this.auth.onIdTokenChanged(user => { - var _a; - listener(((_a = user) === null || _a === void 0 ? void 0 : _a.stsTokenManager.accessToken) || null); - }); - this.internalListeners.set(listener, unsubscribe); - this.updateProactiveRefresh(); - } - removeAuthTokenListener(listener) { - this.assertAuthConfigured(); - const unsubscribe = this.internalListeners.get(listener); - if (!unsubscribe) { - return; - } - this.internalListeners.delete(listener); - unsubscribe(); - this.updateProactiveRefresh(); - } - assertAuthConfigured() { - _assert(this.auth._initializationPromise, "dependent-sdk-initialized-before-auth" /* DEPENDENT_SDK_INIT_BEFORE_AUTH */); - } - updateProactiveRefresh() { - if (this.internalListeners.size > 0) { - this.auth._startProactiveRefresh(); - } - else { - this.auth._stopProactiveRefresh(); - } - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function getVersionForPlatform(clientPlatform) { - switch (clientPlatform) { - case "Node" /* NODE */: - return 'node'; - case "ReactNative" /* REACT_NATIVE */: - return 'rn'; - case "Worker" /* WORKER */: - return 'webworker'; - case "Cordova" /* CORDOVA */: - return 'cordova'; - default: - return undefined; - } -} -/** @internal */ -function registerAuth(clientPlatform) { - (0,_firebase_app__WEBPACK_IMPORTED_MODULE_1__._registerComponent)(new _firebase_component__WEBPACK_IMPORTED_MODULE_3__.Component("auth" /* AUTH */, (container, { options: deps }) => { - const app = container.getProvider('app').getImmediate(); - const heartbeatServiceProvider = container.getProvider('heartbeat'); - const { apiKey, authDomain } = app.options; - return ((app, heartbeatServiceProvider) => { - _assert(apiKey && !apiKey.includes(':'), "invalid-api-key" /* INVALID_API_KEY */, { appName: app.name }); - // Auth domain is optional if IdP sign in isn't being used - _assert(!(authDomain === null || authDomain === void 0 ? void 0 : authDomain.includes(':')), "argument-error" /* ARGUMENT_ERROR */, { - appName: app.name - }); - const config = { - apiKey, - authDomain, - clientPlatform, - apiHost: "identitytoolkit.googleapis.com" /* API_HOST */, - tokenApiHost: "securetoken.googleapis.com" /* TOKEN_API_HOST */, - apiScheme: "https" /* API_SCHEME */, - sdkClientVersion: _getClientVersion(clientPlatform) - }; - const authInstance = new AuthImpl(app, heartbeatServiceProvider, config); - _initializeAuthInstance(authInstance, deps); - return authInstance; - })(app, heartbeatServiceProvider); - }, "PUBLIC" /* PUBLIC */) - /** - * Auth can only be initialized by explicitly calling getAuth() or initializeAuth() - * For why we do this, See go/firebase-next-auth-init - */ - .setInstantiationMode("EXPLICIT" /* EXPLICIT */) - /** - * Because all firebase products that depend on auth depend on auth-internal directly, - * we need to initialize auth-internal after auth is initialized to make it available to other firebase products. - */ - .setInstanceCreatedCallback((container, _instanceIdentifier, _instance) => { - const authInternalProvider = container.getProvider("auth-internal" /* AUTH_INTERNAL */); - authInternalProvider.initialize(); - })); - (0,_firebase_app__WEBPACK_IMPORTED_MODULE_1__._registerComponent)(new _firebase_component__WEBPACK_IMPORTED_MODULE_3__.Component("auth-internal" /* AUTH_INTERNAL */, container => { - const auth = _castAuth(container.getProvider("auth" /* AUTH */).getImmediate()); - return (auth => new AuthInterop(auth))(auth); - }, "PRIVATE" /* PRIVATE */).setInstantiationMode("EXPLICIT" /* EXPLICIT */)); - (0,_firebase_app__WEBPACK_IMPORTED_MODULE_1__.registerVersion)(name, version, getVersionForPlatform(clientPlatform)); - // BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation - (0,_firebase_app__WEBPACK_IMPORTED_MODULE_1__.registerVersion)(name, version, 'esm2017'); -} - -/** - * @license - * Copyright 2021 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Returns the Auth instance associated with the provided {@link @firebase/app#FirebaseApp}. - * If no instance exists, initializes an Auth instance with platform-specific default dependencies. - * - * @param app - The Firebase App. - * - * @public - */ -function getAuth(app = (0,_firebase_app__WEBPACK_IMPORTED_MODULE_1__.getApp)()) { - const provider = (0,_firebase_app__WEBPACK_IMPORTED_MODULE_1__._getProvider)(app, 'auth'); - if (provider.isInitialized()) { - return provider.getImmediate(); - } - return initializeAuth(app, { - popupRedirectResolver: browserPopupRedirectResolver, - persistence: [ - indexedDBLocalPersistence, - browserLocalPersistence, - browserSessionPersistence - ] - }); -} -registerAuth("Browser" /* BROWSER */); - - -//# sourceMappingURL=index-f69a28d8.js.map - - -/***/ }), - -/***/ "./node_modules/@firebase/auth/dist/esm2017/index.js": -/*!***********************************************************!*\ - !*** ./node_modules/@firebase/auth/dist/esm2017/index.js ***! - \***********************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "ActionCodeOperation": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.A), -/* harmony export */ "ActionCodeURL": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.ac), -/* harmony export */ "AuthCredential": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.G), -/* harmony export */ "AuthErrorCodes": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.C), -/* harmony export */ "EmailAuthCredential": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.H), -/* harmony export */ "EmailAuthProvider": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.L), -/* harmony export */ "FacebookAuthProvider": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.M), -/* harmony export */ "FactorId": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.F), -/* harmony export */ "GithubAuthProvider": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.Q), -/* harmony export */ "GoogleAuthProvider": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.N), -/* harmony export */ "OAuthCredential": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.I), -/* harmony export */ "OAuthProvider": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.T), -/* harmony export */ "OperationType": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.O), -/* harmony export */ "PhoneAuthCredential": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.J), -/* harmony export */ "PhoneAuthProvider": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.P), -/* harmony export */ "PhoneMultiFactorGenerator": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.m), -/* harmony export */ "ProviderId": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.o), -/* harmony export */ "RecaptchaVerifier": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.R), -/* harmony export */ "SAMLAuthProvider": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.U), -/* harmony export */ "SignInMethod": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.S), -/* harmony export */ "TwitterAuthProvider": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.V), -/* harmony export */ "applyActionCode": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.a1), -/* harmony export */ "browserLocalPersistence": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.b), -/* harmony export */ "browserPopupRedirectResolver": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.k), -/* harmony export */ "browserSessionPersistence": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.a), -/* harmony export */ "checkActionCode": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.a2), -/* harmony export */ "confirmPasswordReset": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.a0), -/* harmony export */ "connectAuthEmulator": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.E), -/* harmony export */ "createUserWithEmailAndPassword": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.a4), -/* harmony export */ "debugErrorMap": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.z), -/* harmony export */ "deleteUser": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.y), -/* harmony export */ "fetchSignInMethodsForEmail": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.a9), -/* harmony export */ "getAdditionalUserInfo": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.ak), -/* harmony export */ "getAuth": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.n), -/* harmony export */ "getIdToken": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.ah), -/* harmony export */ "getIdTokenResult": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.ai), -/* harmony export */ "getMultiFactorResolver": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.am), -/* harmony export */ "getRedirectResult": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.j), -/* harmony export */ "inMemoryPersistence": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.K), -/* harmony export */ "indexedDBLocalPersistence": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.i), -/* harmony export */ "initializeAuth": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.D), -/* harmony export */ "isSignInWithEmailLink": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.a7), -/* harmony export */ "linkWithCredential": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.Y), -/* harmony export */ "linkWithPhoneNumber": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.l), -/* harmony export */ "linkWithPopup": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.d), -/* harmony export */ "linkWithRedirect": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.g), -/* harmony export */ "multiFactor": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.an), -/* harmony export */ "onAuthStateChanged": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.t), -/* harmony export */ "onIdTokenChanged": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.q), -/* harmony export */ "parseActionCodeURL": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.ad), -/* harmony export */ "prodErrorMap": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.B), -/* harmony export */ "reauthenticateWithCredential": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.Z), -/* harmony export */ "reauthenticateWithPhoneNumber": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.r), -/* harmony export */ "reauthenticateWithPopup": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.e), -/* harmony export */ "reauthenticateWithRedirect": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.h), -/* harmony export */ "reload": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.al), -/* harmony export */ "sendEmailVerification": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.aa), -/* harmony export */ "sendPasswordResetEmail": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.$), -/* harmony export */ "sendSignInLinkToEmail": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.a6), -/* harmony export */ "setPersistence": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.p), -/* harmony export */ "signInAnonymously": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.W), -/* harmony export */ "signInWithCredential": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.X), -/* harmony export */ "signInWithCustomToken": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__._), -/* harmony export */ "signInWithEmailAndPassword": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.a5), -/* harmony export */ "signInWithEmailLink": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.a8), -/* harmony export */ "signInWithPhoneNumber": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.s), -/* harmony export */ "signInWithPopup": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.c), -/* harmony export */ "signInWithRedirect": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.f), -/* harmony export */ "signOut": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.x), -/* harmony export */ "unlink": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.aj), -/* harmony export */ "updateCurrentUser": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.w), -/* harmony export */ "updateEmail": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.af), -/* harmony export */ "updatePassword": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.ag), -/* harmony export */ "updatePhoneNumber": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.u), -/* harmony export */ "updateProfile": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.ae), -/* harmony export */ "useDeviceLanguage": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.v), -/* harmony export */ "verifyBeforeUpdateEmail": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.ab), -/* harmony export */ "verifyPasswordResetCode": () => (/* reexport safe */ _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__.a3) -/* harmony export */ }); -/* harmony import */ var _index_f69a28d8_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index-f69a28d8.js */ "./node_modules/@firebase/auth/dist/esm2017/index-f69a28d8.js"); -/* harmony import */ var _firebase_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @firebase/util */ "./node_modules/@firebase/util/dist/index.esm2017.js"); -/* harmony import */ var _firebase_app__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @firebase/app */ "./node_modules/@firebase/app/dist/esm/index.esm2017.js"); -/* harmony import */ var _firebase_logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @firebase/logger */ "./node_modules/@firebase/logger/dist/esm/index.esm2017.js"); -/* harmony import */ var _firebase_component__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @firebase/component */ "./node_modules/@firebase/component/dist/esm/index.esm2017.js"); - - - - - - -//# sourceMappingURL=index.js.map - - -/***/ }), - -/***/ "./node_modules/@firebase/firestore/dist/index.esm2017.js": -/*!****************************************************************!*\ - !*** ./node_modules/@firebase/firestore/dist/index.esm2017.js ***! - \****************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "AbstractUserDataWriter": () => (/* binding */ Bh), -/* harmony export */ "Bytes": () => (/* binding */ Mc), -/* harmony export */ "CACHE_SIZE_UNLIMITED": () => (/* binding */ mc), -/* harmony export */ "CollectionReference": () => (/* binding */ ac), -/* harmony export */ "DocumentReference": () => (/* binding */ rc), -/* harmony export */ "DocumentSnapshot": () => (/* binding */ _h), -/* harmony export */ "FieldPath": () => (/* binding */ Nc), -/* harmony export */ "FieldValue": () => (/* binding */ Oc), -/* harmony export */ "Firestore": () => (/* binding */ gc), -/* harmony export */ "FirestoreError": () => (/* binding */ Q), -/* harmony export */ "GeoPoint": () => (/* binding */ $c), -/* harmony export */ "LoadBundleTask": () => (/* binding */ wc), -/* harmony export */ "Query": () => (/* binding */ oc), -/* harmony export */ "QueryConstraint": () => (/* binding */ Ih), -/* harmony export */ "QueryDocumentSnapshot": () => (/* binding */ wh), -/* harmony export */ "QuerySnapshot": () => (/* binding */ mh), -/* harmony export */ "SnapshotMetadata": () => (/* binding */ dh), -/* harmony export */ "Timestamp": () => (/* binding */ ut), -/* harmony export */ "Transaction": () => (/* binding */ rl), -/* harmony export */ "WriteBatch": () => (/* binding */ Uh), -/* harmony export */ "_DatabaseId": () => (/* binding */ vt), -/* harmony export */ "_DocumentKey": () => (/* binding */ xt), -/* harmony export */ "_EmptyAppCheckTokenProvider": () => (/* binding */ et), -/* harmony export */ "_EmptyAuthCredentialsProvider": () => (/* binding */ z), -/* harmony export */ "_FieldPath": () => (/* binding */ mt), -/* harmony export */ "_cast": () => (/* binding */ tc), -/* harmony export */ "_debugAssert": () => (/* binding */ U), -/* harmony export */ "_isBase64Available": () => (/* binding */ yt), -/* harmony export */ "_logWarn": () => (/* binding */ F), -/* harmony export */ "_setIndexConfiguration": () => (/* binding */ dl), -/* harmony export */ "_validateIsNotUsedTogether": () => (/* binding */ Ju), -/* harmony export */ "addDoc": () => (/* binding */ tl), -/* harmony export */ "arrayRemove": () => (/* binding */ hl), -/* harmony export */ "arrayUnion": () => (/* binding */ cl), -/* harmony export */ "clearIndexedDbPersistence": () => (/* binding */ bc), -/* harmony export */ "collection": () => (/* binding */ uc), -/* harmony export */ "collectionGroup": () => (/* binding */ cc), -/* harmony export */ "connectFirestoreEmulator": () => (/* binding */ ic), -/* harmony export */ "deleteDoc": () => (/* binding */ Zh), -/* harmony export */ "deleteField": () => (/* binding */ al), -/* harmony export */ "disableNetwork": () => (/* binding */ vc), -/* harmony export */ "doc": () => (/* binding */ hc), -/* harmony export */ "documentId": () => (/* binding */ kc), -/* harmony export */ "enableIndexedDbPersistence": () => (/* binding */ Ec), -/* harmony export */ "enableMultiTabIndexedDbPersistence": () => (/* binding */ Ac), -/* harmony export */ "enableNetwork": () => (/* binding */ Vc), -/* harmony export */ "endAt": () => (/* binding */ kh), -/* harmony export */ "endBefore": () => (/* binding */ Nh), -/* harmony export */ "ensureFirestoreConfigured": () => (/* binding */ Ic), -/* harmony export */ "executeWrite": () => (/* binding */ sl), -/* harmony export */ "getDoc": () => (/* binding */ Gh), -/* harmony export */ "getDocFromCache": () => (/* binding */ jh), -/* harmony export */ "getDocFromServer": () => (/* binding */ Wh), -/* harmony export */ "getDocs": () => (/* binding */ zh), -/* harmony export */ "getDocsFromCache": () => (/* binding */ Hh), -/* harmony export */ "getDocsFromServer": () => (/* binding */ Jh), -/* harmony export */ "getFirestore": () => (/* binding */ pc), -/* harmony export */ "increment": () => (/* binding */ ll), -/* harmony export */ "initializeFirestore": () => (/* binding */ yc), -/* harmony export */ "limit": () => (/* binding */ Vh), -/* harmony export */ "limitToLast": () => (/* binding */ vh), -/* harmony export */ "loadBundle": () => (/* binding */ Dc), -/* harmony export */ "namedQuery": () => (/* binding */ Cc), -/* harmony export */ "onSnapshot": () => (/* binding */ el), -/* harmony export */ "onSnapshotsInSync": () => (/* binding */ nl), -/* harmony export */ "orderBy": () => (/* binding */ bh), -/* harmony export */ "query": () => (/* binding */ Th), -/* harmony export */ "queryEqual": () => (/* binding */ fc), -/* harmony export */ "refEqual": () => (/* binding */ lc), -/* harmony export */ "runTransaction": () => (/* binding */ ol), -/* harmony export */ "serverTimestamp": () => (/* binding */ ul), -/* harmony export */ "setDoc": () => (/* binding */ Yh), -/* harmony export */ "setLogLevel": () => (/* binding */ M), -/* harmony export */ "snapshotEqual": () => (/* binding */ yh), -/* harmony export */ "startAfter": () => (/* binding */ Ch), -/* harmony export */ "startAt": () => (/* binding */ Dh), -/* harmony export */ "terminate": () => (/* binding */ Sc), -/* harmony export */ "updateDoc": () => (/* binding */ Xh), -/* harmony export */ "waitForPendingWrites": () => (/* binding */ Pc), -/* harmony export */ "where": () => (/* binding */ Ah), -/* harmony export */ "writeBatch": () => (/* binding */ fl) -/* harmony export */ }); -/* harmony import */ var _firebase_app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @firebase/app */ "./node_modules/@firebase/app/dist/esm/index.esm2017.js"); -/* harmony import */ var _firebase_component__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @firebase/component */ "./node_modules/@firebase/component/dist/esm/index.esm2017.js"); -/* harmony import */ var _firebase_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @firebase/logger */ "./node_modules/@firebase/logger/dist/esm/index.esm2017.js"); -/* harmony import */ var _firebase_util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @firebase/util */ "./node_modules/@firebase/util/dist/index.esm2017.js"); -/* harmony import */ var _firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @firebase/webchannel-wrapper */ "./node_modules/@firebase/webchannel-wrapper/dist/index.esm2017.js"); - - - - - - -const D = "@firebase/firestore"; - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Simple wrapper around a nullable UID. Mostly exists to make code more - * readable. - */ -class C { - constructor(t) { - this.uid = t; - } - isAuthenticated() { - return null != this.uid; - } - /** - * Returns a key representing this user, suitable for inclusion in a - * dictionary. - */ toKey() { - return this.isAuthenticated() ? "uid:" + this.uid : "anonymous-user"; - } - isEqual(t) { - return t.uid === this.uid; - } -} - -/** A user with a null UID. */ C.UNAUTHENTICATED = new C(null), -// TODO(mikelehen): Look into getting a proper uid-equivalent for -// non-FirebaseAuth providers. -C.GOOGLE_CREDENTIALS = new C("google-credentials-uid"), C.FIRST_PARTY = new C("first-party-uid"), -C.MOCK_USER = new C("mock-user"); - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -let x = "9.6.9"; - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const N = new _firebase_logger__WEBPACK_IMPORTED_MODULE_2__.Logger("@firebase/firestore"); - -// Helper methods are needed because variables can't be exported as read/write -function k() { - return N.logLevel; -} - -/** - * Sets the verbosity of Cloud Firestore logs (debug, error, or silent). - * - * @param logLevel - The verbosity you set for activity and error logging. Can - * be any of the following values: - * - *
    - *
  • `debug` for the most verbose logging level, primarily for - * debugging.
  • - *
  • `error` to log errors only.
  • - *
  • `silent` to turn off logging.
  • - *
- */ function M(t) { - N.setLogLevel(t); -} - -function O(t, ...e) { - if (N.logLevel <= _firebase_logger__WEBPACK_IMPORTED_MODULE_2__.LogLevel.DEBUG) { - const n = e.map(B); - N.debug(`Firestore (${x}): ${t}`, ...n); - } -} - -function $(t, ...e) { - if (N.logLevel <= _firebase_logger__WEBPACK_IMPORTED_MODULE_2__.LogLevel.ERROR) { - const n = e.map(B); - N.error(`Firestore (${x}): ${t}`, ...n); - } -} - -/** - * @internal - */ function F(t, ...e) { - if (N.logLevel <= _firebase_logger__WEBPACK_IMPORTED_MODULE_2__.LogLevel.WARN) { - const n = e.map(B); - N.warn(`Firestore (${x}): ${t}`, ...n); - } -} - -/** - * Converts an additional log parameter to a string representation. - */ function B(t) { - if ("string" == typeof t) return t; - try { - return e = t, JSON.stringify(e); - } catch (e) { - // Converting to JSON failed, just log the object directly - return t; - } - /** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** Formats an object as a JSON string, suitable for logging. */ - var e; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Unconditionally fails, throwing an Error with the given message. - * Messages are stripped in production builds. - * - * Returns `never` and can be used in expressions: - * @example - * let futureVar = fail('not implemented yet'); - */ function L(t = "Unexpected state") { - // Log the failure in addition to throw an exception, just in case the - // exception is swallowed. - const e = `FIRESTORE (${x}) INTERNAL ASSERTION FAILED: ` + t; - // NOTE: We don't use FirestoreError here because these are internal failures - // that cannot be handled by the user. (Also it would create a circular - // dependency between the error and assert modules which doesn't work.) - throw $(e), new Error(e); -} - -/** - * Fails if the given assertion condition is false, throwing an Error with the - * given message if it did. - * - * Messages are stripped in production builds. - */ function q(t, e) { - t || L(); -} - -/** - * Fails if the given assertion condition is false, throwing an Error with the - * given message if it did. - * - * The code of callsites invoking this function are stripped out in production - * builds. Any side-effects of code within the debugAssert() invocation will not - * happen in this case. - * - * @internal - */ function U(t, e) { - t || L(); -} - -/** - * Casts `obj` to `T`. In non-production builds, verifies that `obj` is an - * instance of `T` before casting. - */ function K(t, -// eslint-disable-next-line @typescript-eslint/no-explicit-any -e) { - return t; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ const G = { - // Causes are copied from: - // https://github.com/grpc/grpc/blob/bceec94ea4fc5f0085d81235d8e1c06798dc341a/include/grpc%2B%2B/impl/codegen/status_code_enum.h - /** Not an error; returned on success. */ - OK: "ok", - /** The operation was cancelled (typically by the caller). */ - CANCELLED: "cancelled", - /** Unknown error or an error from a different error domain. */ - UNKNOWN: "unknown", - /** - * Client specified an invalid argument. Note that this differs from - * FAILED_PRECONDITION. INVALID_ARGUMENT indicates arguments that are - * problematic regardless of the state of the system (e.g., a malformed file - * name). - */ - INVALID_ARGUMENT: "invalid-argument", - /** - * Deadline expired before operation could complete. For operations that - * change the state of the system, this error may be returned even if the - * operation has completed successfully. For example, a successful response - * from a server could have been delayed long enough for the deadline to - * expire. - */ - DEADLINE_EXCEEDED: "deadline-exceeded", - /** Some requested entity (e.g., file or directory) was not found. */ - NOT_FOUND: "not-found", - /** - * Some entity that we attempted to create (e.g., file or directory) already - * exists. - */ - ALREADY_EXISTS: "already-exists", - /** - * The caller does not have permission to execute the specified operation. - * PERMISSION_DENIED must not be used for rejections caused by exhausting - * some resource (use RESOURCE_EXHAUSTED instead for those errors). - * PERMISSION_DENIED must not be used if the caller can not be identified - * (use UNAUTHENTICATED instead for those errors). - */ - PERMISSION_DENIED: "permission-denied", - /** - * The request does not have valid authentication credentials for the - * operation. - */ - UNAUTHENTICATED: "unauthenticated", - /** - * Some resource has been exhausted, perhaps a per-user quota, or perhaps the - * entire file system is out of space. - */ - RESOURCE_EXHAUSTED: "resource-exhausted", - /** - * Operation was rejected because the system is not in a state required for - * the operation's execution. For example, directory to be deleted may be - * non-empty, an rmdir operation is applied to a non-directory, etc. - * - * A litmus test that may help a service implementor in deciding - * between FAILED_PRECONDITION, ABORTED, and UNAVAILABLE: - * (a) Use UNAVAILABLE if the client can retry just the failing call. - * (b) Use ABORTED if the client should retry at a higher-level - * (e.g., restarting a read-modify-write sequence). - * (c) Use FAILED_PRECONDITION if the client should not retry until - * the system state has been explicitly fixed. E.g., if an "rmdir" - * fails because the directory is non-empty, FAILED_PRECONDITION - * should be returned since the client should not retry unless - * they have first fixed up the directory by deleting files from it. - * (d) Use FAILED_PRECONDITION if the client performs conditional - * REST Get/Update/Delete on a resource and the resource on the - * server does not match the condition. E.g., conflicting - * read-modify-write on the same resource. - */ - FAILED_PRECONDITION: "failed-precondition", - /** - * The operation was aborted, typically due to a concurrency issue like - * sequencer check failures, transaction aborts, etc. - * - * See litmus test above for deciding between FAILED_PRECONDITION, ABORTED, - * and UNAVAILABLE. - */ - ABORTED: "aborted", - /** - * Operation was attempted past the valid range. E.g., seeking or reading - * past end of file. - * - * Unlike INVALID_ARGUMENT, this error indicates a problem that may be fixed - * if the system state changes. For example, a 32-bit file system will - * generate INVALID_ARGUMENT if asked to read at an offset that is not in the - * range [0,2^32-1], but it will generate OUT_OF_RANGE if asked to read from - * an offset past the current file size. - * - * There is a fair bit of overlap between FAILED_PRECONDITION and - * OUT_OF_RANGE. We recommend using OUT_OF_RANGE (the more specific error) - * when it applies so that callers who are iterating through a space can - * easily look for an OUT_OF_RANGE error to detect when they are done. - */ - OUT_OF_RANGE: "out-of-range", - /** Operation is not implemented or not supported/enabled in this service. */ - UNIMPLEMENTED: "unimplemented", - /** - * Internal errors. Means some invariants expected by underlying System has - * been broken. If you see one of these errors, Something is very broken. - */ - INTERNAL: "internal", - /** - * The service is currently unavailable. This is a most likely a transient - * condition and may be corrected by retrying with a backoff. - * - * See litmus test above for deciding between FAILED_PRECONDITION, ABORTED, - * and UNAVAILABLE. - */ - UNAVAILABLE: "unavailable", - /** Unrecoverable data loss or corruption. */ - DATA_LOSS: "data-loss" -}; - -/** An error returned by a Firestore operation. */ class Q extends _firebase_util__WEBPACK_IMPORTED_MODULE_3__.FirebaseError { - /** @hideconstructor */ - constructor( - /** - * The backend error code associated with this error. - */ - t, - /** - * A custom error description. - */ - e) { - super(t, e), this.code = t, this.message = e, - // HACK: We write a toString property directly because Error is not a real - // class and so inheritance does not work correctly. We could alternatively - // do the same "back-door inheritance" trick that FirebaseError does. - this.toString = () => `${this.name}: [code=${this.code}]: ${this.message}`; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ class j { - constructor() { - this.promise = new Promise(((t, e) => { - this.resolve = t, this.reject = e; - })); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ class W { - constructor(t, e) { - this.user = e, this.type = "OAuth", this.headers = new Map, this.headers.set("Authorization", `Bearer ${t}`); - } -} - -/** - * A CredentialsProvider that always yields an empty token. - * @internal - */ class z { - getToken() { - return Promise.resolve(null); - } - invalidateToken() {} - start(t, e) { - // Fire with initial user. - t.enqueueRetryable((() => e(C.UNAUTHENTICATED))); - } - shutdown() {} -} - -/** - * A CredentialsProvider that always returns a constant token. Used for - * emulator token mocking. - */ class H { - constructor(t) { - this.token = t, - /** - * Stores the listener registered with setChangeListener() - * This isn't actually necessary since the UID never changes, but we use this - * to verify the listen contract is adhered to in tests. - */ - this.changeListener = null; - } - getToken() { - return Promise.resolve(this.token); - } - invalidateToken() {} - start(t, e) { - this.changeListener = e, - // Fire with initial user. - t.enqueueRetryable((() => e(this.token.user))); - } - shutdown() { - this.changeListener = null; - } -} - -class J { - constructor(t) { - this.t = t, - /** Tracks the current User. */ - this.currentUser = C.UNAUTHENTICATED, - /** - * Counter used to detect if the token changed while a getToken request was - * outstanding. - */ - this.i = 0, this.forceRefresh = !1, this.auth = null; - } - start(t, e) { - let n = this.i; - // A change listener that prevents double-firing for the same token change. - const s = t => this.i !== n ? (n = this.i, e(t)) : Promise.resolve(); - // A promise that can be waited on to block on the next token change. - // This promise is re-created after each change. - let i = new j; - this.o = () => { - this.i++, this.currentUser = this.u(), i.resolve(), i = new j, t.enqueueRetryable((() => s(this.currentUser))); - }; - const r = () => { - const e = i; - t.enqueueRetryable((async () => { - await e.promise, await s(this.currentUser); - })); - }, o = t => { - O("FirebaseAuthCredentialsProvider", "Auth detected"), this.auth = t, this.auth.addAuthTokenListener(this.o), - r(); - }; - this.t.onInit((t => o(t))), - // Our users can initialize Auth right after Firestore, so we give it - // a chance to register itself with the component framework before we - // determine whether to start up in unauthenticated mode. - setTimeout((() => { - if (!this.auth) { - const t = this.t.getImmediate({ - optional: !0 - }); - t ? o(t) : ( - // If auth is still not available, proceed with `null` user - O("FirebaseAuthCredentialsProvider", "Auth not yet detected"), i.resolve(), i = new j); - } - }), 0), r(); - } - getToken() { - // Take note of the current value of the tokenCounter so that this method - // can fail (with an ABORTED error) if there is a token change while the - // request is outstanding. - const t = this.i, e = this.forceRefresh; - return this.forceRefresh = !1, this.auth ? this.auth.getToken(e).then((e => - // Cancel the request since the token changed while the request was - // outstanding so the response is potentially for a previous user (which - // user, we can't be sure). - this.i !== t ? (O("FirebaseAuthCredentialsProvider", "getToken aborted due to token change."), - this.getToken()) : e ? (q("string" == typeof e.accessToken), new W(e.accessToken, this.currentUser)) : null)) : Promise.resolve(null); - } - invalidateToken() { - this.forceRefresh = !0; - } - shutdown() { - this.auth && this.auth.removeAuthTokenListener(this.o); - } - // Auth.getUid() can return null even with a user logged in. It is because - // getUid() is synchronous, but the auth code populating Uid is asynchronous. - // This method should only be called in the AuthTokenListener callback - // to guarantee to get the actual user. - u() { - const t = this.auth && this.auth.getUid(); - return q(null === t || "string" == typeof t), new C(t); - } -} - -/* - * FirstPartyToken provides a fresh token each time its value - * is requested, because if the token is too old, requests will be rejected. - * Technically this may no longer be necessary since the SDK should gracefully - * recover from unauthenticated errors (see b/33147818 for context), but it's - * safer to keep the implementation as-is. - */ class Y { - constructor(t, e, n) { - this.type = "FirstParty", this.user = C.FIRST_PARTY, this.headers = new Map, this.headers.set("X-Goog-AuthUser", e); - const s = t.auth.getAuthHeaderValueForFirstParty([]); - s && this.headers.set("Authorization", s), n && this.headers.set("X-Goog-Iam-Authorization-Token", n); - } -} - -/* - * Provides user credentials required for the Firestore JavaScript SDK - * to authenticate the user, using technique that is only available - * to applications hosted by Google. - */ class X { - constructor(t, e, n) { - this.h = t, this.l = e, this.m = n; - } - getToken() { - return Promise.resolve(new Y(this.h, this.l, this.m)); - } - start(t, e) { - // Fire with initial uid. - t.enqueueRetryable((() => e(C.FIRST_PARTY))); - } - shutdown() {} - invalidateToken() {} -} - -class Z { - constructor(t) { - this.value = t, this.type = "AppCheck", this.headers = new Map, t && t.length > 0 && this.headers.set("x-firebase-appcheck", this.value); - } -} - -class tt { - constructor(t) { - this.g = t, this.forceRefresh = !1, this.appCheck = null, this.p = null; - } - start(t, e) { - const n = t => { - null != t.error && O("FirebaseAppCheckTokenProvider", `Error getting App Check token; using placeholder token instead. Error: ${t.error.message}`); - const n = t.token !== this.p; - return this.p = t.token, O("FirebaseAppCheckTokenProvider", `Received ${n ? "new" : "existing"} token.`), - n ? e(t.token) : Promise.resolve(); - }; - this.o = e => { - t.enqueueRetryable((() => n(e))); - }; - const s = t => { - O("FirebaseAppCheckTokenProvider", "AppCheck detected"), this.appCheck = t, this.appCheck.addTokenListener(this.o); - }; - this.g.onInit((t => s(t))), - // Our users can initialize AppCheck after Firestore, so we give it - // a chance to register itself with the component framework. - setTimeout((() => { - if (!this.appCheck) { - const t = this.g.getImmediate({ - optional: !0 - }); - t ? s(t) : - // If AppCheck is still not available, proceed without it. - O("FirebaseAppCheckTokenProvider", "AppCheck not yet detected"); - } - }), 0); - } - getToken() { - const t = this.forceRefresh; - return this.forceRefresh = !1, this.appCheck ? this.appCheck.getToken(t).then((t => t ? (q("string" == typeof t.token), - this.p = t.token, new Z(t.token)) : null)) : Promise.resolve(null); - } - invalidateToken() { - this.forceRefresh = !0; - } - shutdown() { - this.appCheck && this.appCheck.removeTokenListener(this.o); - } -} - -/** - * An AppCheck token provider that always yields an empty token. - * @internal - */ class et { - getToken() { - return Promise.resolve(new Z("")); - } - invalidateToken() {} - start(t, e) {} - shutdown() {} -} - -/** - * Builds a CredentialsProvider depending on the type of - * the credentials passed in. - */ -/** - * @license - * Copyright 2018 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * `ListenSequence` is a monotonic sequence. It is initialized with a minimum value to - * exceed. All subsequent calls to next will return increasing values. If provided with a - * `SequenceNumberSyncer`, it will additionally bump its next value when told of a new value, as - * well as write out sequence numbers that it produces via `next()`. - */ -class nt { - constructor(t, e) { - this.previousValue = t, e && (e.sequenceNumberHandler = t => this.I(t), this.T = t => e.writeSequenceNumber(t)); - } - I(t) { - return this.previousValue = Math.max(t, this.previousValue), this.previousValue; - } - next() { - const t = ++this.previousValue; - return this.T && this.T(t), t; - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Generates `nBytes` of random bytes. - * - * If `nBytes < 0` , an error will be thrown. - */ -function st(t) { - // Polyfills for IE and WebWorker by using `self` and `msCrypto` when `crypto` is not available. - const e = - // eslint-disable-next-line @typescript-eslint/no-explicit-any - "undefined" != typeof self && (self.crypto || self.msCrypto), n = new Uint8Array(t); - if (e && "function" == typeof e.getRandomValues) e.getRandomValues(n); else - // Falls back to Math.random - for (let e = 0; e < t; e++) n[e] = Math.floor(256 * Math.random()); - return n; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ nt.A = -1; - -class it { - static R() { - // Alphanumeric characters - const t = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", e = Math.floor(256 / t.length) * t.length; - // The largest byte value that is a multiple of `char.length`. - let n = ""; - for (;n.length < 20; ) { - const s = st(40); - for (let i = 0; i < s.length; ++i) - // Only accept values that are [0, maxMultiple), this ensures they can - // be evenly mapped to indices of `chars` via a modulo operation. - n.length < 20 && s[i] < e && (n += t.charAt(s[i] % t.length)); - } - return n; - } -} - -function rt(t, e) { - return t < e ? -1 : t > e ? 1 : 0; -} - -/** Helper to compare arrays using isEqual(). */ function ot(t, e, n) { - return t.length === e.length && t.every(((t, s) => n(t, e[s]))); -} - -/** - * Returns the immediate lexicographically-following string. This is useful to - * construct an inclusive range for indexeddb iterators. - */ function at(t) { - // Return the input string, with an additional NUL byte appended. - return t + "\0"; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -// The earliest date supported by Firestore timestamps (0001-01-01T00:00:00Z). -/** - * A `Timestamp` represents a point in time independent of any time zone or - * calendar, represented as seconds and fractions of seconds at nanosecond - * resolution in UTC Epoch time. - * - * It is encoded using the Proleptic Gregorian Calendar which extends the - * Gregorian calendar backwards to year one. It is encoded assuming all minutes - * are 60 seconds long, i.e. leap seconds are "smeared" so that no leap second - * table is needed for interpretation. Range is from 0001-01-01T00:00:00Z to - * 9999-12-31T23:59:59.999999999Z. - * - * For examples and further specifications, refer to the - * {@link https://github.com/google/protobuf/blob/master/src/google/protobuf/timestamp.proto | Timestamp definition}. - */ -class ut { - /** - * Creates a new timestamp. - * - * @param seconds - The number of seconds of UTC time since Unix epoch - * 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to - * 9999-12-31T23:59:59Z inclusive. - * @param nanoseconds - The non-negative fractions of a second at nanosecond - * resolution. Negative second values with fractions must still have - * non-negative nanoseconds values that count forward in time. Must be - * from 0 to 999,999,999 inclusive. - */ - constructor( - /** - * The number of seconds of UTC time since Unix epoch 1970-01-01T00:00:00Z. - */ - t, - /** - * The fractions of a second at nanosecond resolution.* - */ - e) { - if (this.seconds = t, this.nanoseconds = e, e < 0) throw new Q(G.INVALID_ARGUMENT, "Timestamp nanoseconds out of range: " + e); - if (e >= 1e9) throw new Q(G.INVALID_ARGUMENT, "Timestamp nanoseconds out of range: " + e); - if (t < -62135596800) throw new Q(G.INVALID_ARGUMENT, "Timestamp seconds out of range: " + t); - // This will break in the year 10,000. - if (t >= 253402300800) throw new Q(G.INVALID_ARGUMENT, "Timestamp seconds out of range: " + t); - } - /** - * Creates a new timestamp with the current date, with millisecond precision. - * - * @returns a new timestamp representing the current date. - */ static now() { - return ut.fromMillis(Date.now()); - } - /** - * Creates a new timestamp from the given date. - * - * @param date - The date to initialize the `Timestamp` from. - * @returns A new `Timestamp` representing the same point in time as the given - * date. - */ static fromDate(t) { - return ut.fromMillis(t.getTime()); - } - /** - * Creates a new timestamp from the given number of milliseconds. - * - * @param milliseconds - Number of milliseconds since Unix epoch - * 1970-01-01T00:00:00Z. - * @returns A new `Timestamp` representing the same point in time as the given - * number of milliseconds. - */ static fromMillis(t) { - const e = Math.floor(t / 1e3), n = Math.floor(1e6 * (t - 1e3 * e)); - return new ut(e, n); - } - /** - * Converts a `Timestamp` to a JavaScript `Date` object. This conversion - * causes a loss of precision since `Date` objects only support millisecond - * precision. - * - * @returns JavaScript `Date` object representing the same point in time as - * this `Timestamp`, with millisecond precision. - */ toDate() { - return new Date(this.toMillis()); - } - /** - * Converts a `Timestamp` to a numeric timestamp (in milliseconds since - * epoch). This operation causes a loss of precision. - * - * @returns The point in time corresponding to this timestamp, represented as - * the number of milliseconds since Unix epoch 1970-01-01T00:00:00Z. - */ toMillis() { - return 1e3 * this.seconds + this.nanoseconds / 1e6; - } - _compareTo(t) { - return this.seconds === t.seconds ? rt(this.nanoseconds, t.nanoseconds) : rt(this.seconds, t.seconds); - } - /** - * Returns true if this `Timestamp` is equal to the provided one. - * - * @param other - The `Timestamp` to compare against. - * @returns true if this `Timestamp` is equal to the provided one. - */ isEqual(t) { - return t.seconds === this.seconds && t.nanoseconds === this.nanoseconds; - } - /** Returns a textual representation of this `Timestamp`. */ toString() { - return "Timestamp(seconds=" + this.seconds + ", nanoseconds=" + this.nanoseconds + ")"; - } - /** Returns a JSON-serializable representation of this `Timestamp`. */ toJSON() { - return { - seconds: this.seconds, - nanoseconds: this.nanoseconds - }; - } - /** - * Converts this object to a primitive string, which allows `Timestamp` objects - * to be compared using the `>`, `<=`, `>=` and `>` operators. - */ valueOf() { - // This method returns a string of the form . where - // is translated to have a non-negative value and both - // and are left-padded with zeroes to be a consistent length. - // Strings with this format then have a lexiographical ordering that matches - // the expected ordering. The translation is done to avoid having - // a leading negative sign (i.e. a leading '-' character) in its string - // representation, which would affect its lexiographical ordering. - const t = this.seconds - -62135596800; - // Note: Up to 12 decimal digits are required to represent all valid - // 'seconds' values. - return String(t).padStart(12, "0") + "." + String(this.nanoseconds).padStart(9, "0"); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A version of a document in Firestore. This corresponds to the version - * timestamp, such as update_time or read_time. - */ class ct { - constructor(t) { - this.timestamp = t; - } - static fromTimestamp(t) { - return new ct(t); - } - static min() { - return new ct(new ut(0, 0)); - } - compareTo(t) { - return this.timestamp._compareTo(t.timestamp); - } - isEqual(t) { - return this.timestamp.isEqual(t.timestamp); - } - /** Returns a number representation of the version for use in spec tests. */ toMicroseconds() { - // Convert to microseconds. - return 1e6 * this.timestamp.seconds + this.timestamp.nanoseconds / 1e3; - } - toString() { - return "SnapshotVersion(" + this.timestamp.toString() + ")"; - } - toTimestamp() { - return this.timestamp; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ function ht(t) { - let e = 0; - for (const n in t) Object.prototype.hasOwnProperty.call(t, n) && e++; - return e; -} - -function lt(t, e) { - for (const n in t) Object.prototype.hasOwnProperty.call(t, n) && e(n, t[n]); -} - -function ft(t) { - for (const e in t) if (Object.prototype.hasOwnProperty.call(t, e)) return !1; - return !0; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Path represents an ordered sequence of string segments. - */ -class dt { - constructor(t, e, n) { - void 0 === e ? e = 0 : e > t.length && L(), void 0 === n ? n = t.length - e : n > t.length - e && L(), - this.segments = t, this.offset = e, this.len = n; - } - get length() { - return this.len; - } - isEqual(t) { - return 0 === dt.comparator(this, t); - } - child(t) { - const e = this.segments.slice(this.offset, this.limit()); - return t instanceof dt ? t.forEach((t => { - e.push(t); - })) : e.push(t), this.construct(e); - } - /** The index of one past the last segment of the path. */ limit() { - return this.offset + this.length; - } - popFirst(t) { - return t = void 0 === t ? 1 : t, this.construct(this.segments, this.offset + t, this.length - t); - } - popLast() { - return this.construct(this.segments, this.offset, this.length - 1); - } - firstSegment() { - return this.segments[this.offset]; - } - lastSegment() { - return this.get(this.length - 1); - } - get(t) { - return this.segments[this.offset + t]; - } - isEmpty() { - return 0 === this.length; - } - isPrefixOf(t) { - if (t.length < this.length) return !1; - for (let e = 0; e < this.length; e++) if (this.get(e) !== t.get(e)) return !1; - return !0; - } - isImmediateParentOf(t) { - if (this.length + 1 !== t.length) return !1; - for (let e = 0; e < this.length; e++) if (this.get(e) !== t.get(e)) return !1; - return !0; - } - forEach(t) { - for (let e = this.offset, n = this.limit(); e < n; e++) t(this.segments[e]); - } - toArray() { - return this.segments.slice(this.offset, this.limit()); - } - static comparator(t, e) { - const n = Math.min(t.length, e.length); - for (let s = 0; s < n; s++) { - const n = t.get(s), i = e.get(s); - if (n < i) return -1; - if (n > i) return 1; - } - return t.length < e.length ? -1 : t.length > e.length ? 1 : 0; - } -} - -/** - * A slash-separated path for navigating resources (documents and collections) - * within Firestore. - * - * @internal - */ class _t extends dt { - construct(t, e, n) { - return new _t(t, e, n); - } - canonicalString() { - // NOTE: The client is ignorant of any path segments containing escape - // sequences (e.g. __id123__) and just passes them through raw (they exist - // for legacy reasons and should not be used frequently). - return this.toArray().join("/"); - } - toString() { - return this.canonicalString(); - } - /** - * Creates a resource path from the given slash-delimited string. If multiple - * arguments are provided, all components are combined. Leading and trailing - * slashes from all components are ignored. - */ static fromString(...t) { - // NOTE: The client is ignorant of any path segments containing escape - // sequences (e.g. __id123__) and just passes them through raw (they exist - // for legacy reasons and should not be used frequently). - const e = []; - for (const n of t) { - if (n.indexOf("//") >= 0) throw new Q(G.INVALID_ARGUMENT, `Invalid segment (${n}). Paths must not contain // in them.`); - // Strip leading and traling slashed. - e.push(...n.split("/").filter((t => t.length > 0))); - } - return new _t(e); - } - static emptyPath() { - return new _t([]); - } -} - -const wt = /^[_a-zA-Z][_a-zA-Z0-9]*$/; - -/** - * A dot-separated path for navigating sub-objects within a document. - * @internal - */ class mt extends dt { - construct(t, e, n) { - return new mt(t, e, n); - } - /** - * Returns true if the string could be used as a segment in a field path - * without escaping. - */ static isValidIdentifier(t) { - return wt.test(t); - } - canonicalString() { - return this.toArray().map((t => (t = t.replace(/\\/g, "\\\\").replace(/`/g, "\\`"), - mt.isValidIdentifier(t) || (t = "`" + t + "`"), t))).join("."); - } - toString() { - return this.canonicalString(); - } - /** - * Returns true if this field references the key of a document. - */ isKeyField() { - return 1 === this.length && "__name__" === this.get(0); - } - /** - * The field designating the key of a document. - */ static keyField() { - return new mt([ "__name__" ]); - } - /** - * Parses a field string from the given server-formatted string. - * - * - Splitting the empty string is not allowed (for now at least). - * - Empty segments within the string (e.g. if there are two consecutive - * separators) are not allowed. - * - * TODO(b/37244157): we should make this more strict. Right now, it allows - * non-identifier path components, even if they aren't escaped. - */ static fromServerFormat(t) { - const e = []; - let n = "", s = 0; - const i = () => { - if (0 === n.length) throw new Q(G.INVALID_ARGUMENT, `Invalid field path (${t}). Paths must not be empty, begin with '.', end with '.', or contain '..'`); - e.push(n), n = ""; - }; - let r = !1; - for (;s < t.length; ) { - const e = t[s]; - if ("\\" === e) { - if (s + 1 === t.length) throw new Q(G.INVALID_ARGUMENT, "Path has trailing escape character: " + t); - const e = t[s + 1]; - if ("\\" !== e && "." !== e && "`" !== e) throw new Q(G.INVALID_ARGUMENT, "Path has invalid escape sequence: " + t); - n += e, s += 2; - } else "`" === e ? (r = !r, s++) : "." !== e || r ? (n += e, s++) : (i(), s++); - } - if (i(), r) throw new Q(G.INVALID_ARGUMENT, "Unterminated ` in path: " + t); - return new mt(e); - } - static emptyPath() { - return new mt([]); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Provides a set of fields that can be used to partially patch a document. - * FieldMask is used in conjunction with ObjectValue. - * Examples: - * foo - Overwrites foo entirely with the provided value. If foo is not - * present in the companion ObjectValue, the field is deleted. - * foo.bar - Overwrites only the field bar of the object foo. - * If foo is not an object, foo is replaced with an object - * containing foo - */ class gt { - constructor(t) { - this.fields = t, - // TODO(dimond): validation of FieldMask - // Sort the field mask to support `FieldMask.isEqual()` and assert below. - t.sort(mt.comparator); - } - /** - * Verifies that `fieldPath` is included by at least one field in this field - * mask. - * - * This is an O(n) operation, where `n` is the size of the field mask. - */ covers(t) { - for (const e of this.fields) if (e.isPrefixOf(t)) return !0; - return !1; - } - isEqual(t) { - return ot(this.fields, t.fields, ((t, e) => t.isEqual(e))); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** Converts a Base64 encoded string to a binary string. */ -/** True if and only if the Base64 conversion functions are available. */ -function yt() { - return "undefined" != typeof atob; -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Immutable class that represents a "proto" byte string. - * - * Proto byte strings can either be Base64-encoded strings or Uint8Arrays when - * sent on the wire. This class abstracts away this differentiation by holding - * the proto byte string in a common class that must be converted into a string - * before being sent as a proto. - * @internal - */ class pt { - constructor(t) { - this.binaryString = t; - } - static fromBase64String(t) { - const e = atob(t); - return new pt(e); - } - static fromUint8Array(t) { - // TODO(indexing); Remove the copy of the byte string here as this method - // is frequently called during indexing. - const e = - /** - * Helper function to convert an Uint8array to a binary string. - */ - function(t) { - let e = ""; - for (let n = 0; n < t.length; ++n) e += String.fromCharCode(t[n]); - return e; - } - /** - * Helper function to convert a binary string to an Uint8Array. - */ (t); - return new pt(e); - } - [Symbol.iterator]() { - let t = 0; - return { - next: () => t < this.binaryString.length ? { - value: this.binaryString.charCodeAt(t++), - done: !1 - } : { - value: void 0, - done: !0 - } - }; - } - toBase64() { - return t = this.binaryString, btoa(t); - /** Converts a binary string to a Base64 encoded string. */ - var t; - } - toUint8Array() { - return function(t) { - const e = new Uint8Array(t.length); - for (let n = 0; n < t.length; n++) e[n] = t.charCodeAt(n); - return e; - } - /** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - // A RegExp matching ISO 8601 UTC timestamps with optional fraction. - (this.binaryString); - } - approximateByteSize() { - return 2 * this.binaryString.length; - } - compareTo(t) { - return rt(this.binaryString, t.binaryString); - } - isEqual(t) { - return this.binaryString === t.binaryString; - } -} - -pt.EMPTY_BYTE_STRING = new pt(""); - -const It = new RegExp(/^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d(?:\.(\d+))?Z$/); - -/** - * Converts the possible Proto values for a timestamp value into a "seconds and - * nanos" representation. - */ function Tt(t) { - // The json interface (for the browser) will return an iso timestamp string, - // while the proto js library (for node) will return a - // google.protobuf.Timestamp instance. - if (q(!!t), "string" == typeof t) { - // The date string can have higher precision (nanos) than the Date class - // (millis), so we do some custom parsing here. - // Parse the nanos right out of the string. - let e = 0; - const n = It.exec(t); - if (q(!!n), n[1]) { - // Pad the fraction out to 9 digits (nanos). - let t = n[1]; - t = (t + "000000000").substr(0, 9), e = Number(t); - } - // Parse the date to get the seconds. - const s = new Date(t); - return { - seconds: Math.floor(s.getTime() / 1e3), - nanos: e - }; - } - return { - seconds: Et(t.seconds), - nanos: Et(t.nanos) - }; -} - -/** - * Converts the possible Proto types for numbers into a JavaScript number. - * Returns 0 if the value is not numeric. - */ function Et(t) { - // TODO(bjornick): Handle int64 greater than 53 bits. - return "number" == typeof t ? t : "string" == typeof t ? Number(t) : 0; -} - -/** Converts the possible Proto types for Blobs into a ByteString. */ function At(t) { - return "string" == typeof t ? pt.fromBase64String(t) : pt.fromUint8Array(t); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Represents a locally-applied ServerTimestamp. - * - * Server Timestamps are backed by MapValues that contain an internal field - * `__type__` with a value of `server_timestamp`. The previous value and local - * write time are stored in its `__previous_value__` and `__local_write_time__` - * fields respectively. - * - * Notes: - * - ServerTimestampValue instances are created as the result of applying a - * transform. They can only exist in the local view of a document. Therefore - * they do not need to be parsed or serialized. - * - When evaluated locally (e.g. for snapshot.data()), they by default - * evaluate to `null`. This behavior can be configured by passing custom - * FieldValueOptions to value(). - * - With respect to other ServerTimestampValues, they sort by their - * localWriteTime. - */ function Rt(t) { - var e, n; - return "server_timestamp" === (null === (n = ((null === (e = null == t ? void 0 : t.mapValue) || void 0 === e ? void 0 : e.fields) || {}).__type__) || void 0 === n ? void 0 : n.stringValue); -} - -/** - * Creates a new ServerTimestamp proto value (using the internal format). - */ -/** - * Returns the value of the field before this ServerTimestamp was set. - * - * Preserving the previous values allows the user to display the last resoled - * value until the backend responds with the timestamp. - */ -function bt(t) { - const e = t.mapValue.fields.__previous_value__; - return Rt(e) ? bt(e) : e; -} - -/** - * Returns the local time at which this timestamp was first set. - */ function Pt(t) { - const e = Tt(t.mapValue.fields.__local_write_time__.timestampValue); - return new ut(e.seconds, e.nanos); -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ class Vt { - /** - * Constructs a DatabaseInfo using the provided host, databaseId and - * persistenceKey. - * - * @param databaseId - The database to use. - * @param appId - The Firebase App Id. - * @param persistenceKey - A unique identifier for this Firestore's local - * storage (used in conjunction with the databaseId). - * @param host - The Firestore backend host to connect to. - * @param ssl - Whether to use SSL when connecting. - * @param forceLongPolling - Whether to use the forceLongPolling option - * when using WebChannel as the network transport. - * @param autoDetectLongPolling - Whether to use the detectBufferingProxy - * option when using WebChannel as the network transport. - * @param useFetchStreams Whether to use the Fetch API instead of - * XMLHTTPRequest - */ - constructor(t, e, n, s, i, r, o, a) { - this.databaseId = t, this.appId = e, this.persistenceKey = n, this.host = s, this.ssl = i, - this.forceLongPolling = r, this.autoDetectLongPolling = o, this.useFetchStreams = a; - } -} - -/** The default database name for a project. */ -/** - * Represents the database ID a Firestore client is associated with. - * @internal - */ -class vt { - constructor(t, e) { - this.projectId = t, this.database = e || "(default)"; - } - static empty() { - return new vt("", ""); - } - get isDefaultDatabase() { - return "(default)" === this.database; - } - isEqual(t) { - return t instanceof vt && t.projectId === this.projectId && t.database === this.database; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** Sentinel value that sorts before any Mutation Batch ID. */ -/** - * Returns whether a variable is either undefined or null. - */ -function St(t) { - return null == t; -} - -/** Returns whether the value represents -0. */ function Dt(t) { - // Detect if the value is -0.0. Based on polyfill from - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is - return 0 === t && 1 / t == -1 / 0; -} - -/** - * Returns whether a value is an integer and in the safe integer range - * @param value - The value to test for being an integer and in the safe range - */ function Ct(t) { - return "number" == typeof t && Number.isInteger(t) && !Dt(t) && t <= Number.MAX_SAFE_INTEGER && t >= Number.MIN_SAFE_INTEGER; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @internal - */ class xt { - constructor(t) { - this.path = t; - } - static fromPath(t) { - return new xt(_t.fromString(t)); - } - static fromName(t) { - return new xt(_t.fromString(t).popFirst(5)); - } - static empty() { - return new xt(_t.emptyPath()); - } - get collectionGroup() { - return this.path.popLast().lastSegment(); - } - /** Returns true if the document is in the specified collectionId. */ hasCollectionId(t) { - return this.path.length >= 2 && this.path.get(this.path.length - 2) === t; - } - /** Returns the collection group (i.e. the name of the parent collection) for this key. */ getCollectionGroup() { - return this.path.get(this.path.length - 2); - } - /** Returns the fully qualified path to the parent collection. */ getCollectionPath() { - return this.path.popLast(); - } - isEqual(t) { - return null !== t && 0 === _t.comparator(this.path, t.path); - } - toString() { - return this.path.toString(); - } - static comparator(t, e) { - return _t.comparator(t.path, e.path); - } - static isDocumentKey(t) { - return t.length % 2 == 0; - } - /** - * Creates and returns a new document key with the given segments. - * - * @param segments - The segments of the path to the document - * @returns A new instance of DocumentKey - */ static fromSegments(t) { - return new xt(new _t(t.slice())); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ const Nt = { - mapValue: { - fields: { - __type__: { - stringValue: "__max__" - } - } - } -}, kt = { - nullValue: "NULL_VALUE" -}; - -/** Extracts the backend's type order for the provided value. */ -function Mt(t) { - return "nullValue" in t ? 0 /* NullValue */ : "booleanValue" in t ? 1 /* BooleanValue */ : "integerValue" in t || "doubleValue" in t ? 2 /* NumberValue */ : "timestampValue" in t ? 3 /* TimestampValue */ : "stringValue" in t ? 5 /* StringValue */ : "bytesValue" in t ? 6 /* BlobValue */ : "referenceValue" in t ? 7 /* RefValue */ : "geoPointValue" in t ? 8 /* GeoPointValue */ : "arrayValue" in t ? 9 /* ArrayValue */ : "mapValue" in t ? Rt(t) ? 4 /* ServerTimestampValue */ : Ht(t) ? 9 /* ArrayValue */ : 10 /* ObjectValue */ : L(); -} - -/** Tests `left` and `right` for equality based on the backend semantics. */ function Ot(t, e) { - if (t === e) return !0; - const n = Mt(t); - if (n !== Mt(e)) return !1; - switch (n) { - case 0 /* NullValue */ : - case 9007199254740991 /* MaxValue */ : - return !0; - - case 1 /* BooleanValue */ : - return t.booleanValue === e.booleanValue; - - case 4 /* ServerTimestampValue */ : - return Pt(t).isEqual(Pt(e)); - - case 3 /* TimestampValue */ : - return function(t, e) { - if ("string" == typeof t.timestampValue && "string" == typeof e.timestampValue && t.timestampValue.length === e.timestampValue.length) - // Use string equality for ISO 8601 timestamps - return t.timestampValue === e.timestampValue; - const n = Tt(t.timestampValue), s = Tt(e.timestampValue); - return n.seconds === s.seconds && n.nanos === s.nanos; - }(t, e); - - case 5 /* StringValue */ : - return t.stringValue === e.stringValue; - - case 6 /* BlobValue */ : - return function(t, e) { - return At(t.bytesValue).isEqual(At(e.bytesValue)); - }(t, e); - - case 7 /* RefValue */ : - return t.referenceValue === e.referenceValue; - - case 8 /* GeoPointValue */ : - return function(t, e) { - return Et(t.geoPointValue.latitude) === Et(e.geoPointValue.latitude) && Et(t.geoPointValue.longitude) === Et(e.geoPointValue.longitude); - }(t, e); - - case 2 /* NumberValue */ : - return function(t, e) { - if ("integerValue" in t && "integerValue" in e) return Et(t.integerValue) === Et(e.integerValue); - if ("doubleValue" in t && "doubleValue" in e) { - const n = Et(t.doubleValue), s = Et(e.doubleValue); - return n === s ? Dt(n) === Dt(s) : isNaN(n) && isNaN(s); - } - return !1; - }(t, e); - - case 9 /* ArrayValue */ : - return ot(t.arrayValue.values || [], e.arrayValue.values || [], Ot); - - case 10 /* ObjectValue */ : - return function(t, e) { - const n = t.mapValue.fields || {}, s = e.mapValue.fields || {}; - if (ht(n) !== ht(s)) return !1; - for (const t in n) if (n.hasOwnProperty(t) && (void 0 === s[t] || !Ot(n[t], s[t]))) return !1; - return !0; - } - /** Returns true if the ArrayValue contains the specified element. */ (t, e); - - default: - return L(); - } -} - -function $t(t, e) { - return void 0 !== (t.values || []).find((t => Ot(t, e))); -} - -function Ft(t, e) { - if (t === e) return 0; - const n = Mt(t), s = Mt(e); - if (n !== s) return rt(n, s); - switch (n) { - case 0 /* NullValue */ : - case 9007199254740991 /* MaxValue */ : - return 0; - - case 1 /* BooleanValue */ : - return rt(t.booleanValue, e.booleanValue); - - case 2 /* NumberValue */ : - return function(t, e) { - const n = Et(t.integerValue || t.doubleValue), s = Et(e.integerValue || e.doubleValue); - return n < s ? -1 : n > s ? 1 : n === s ? 0 : - // one or both are NaN. - isNaN(n) ? isNaN(s) ? 0 : -1 : 1; - }(t, e); - - case 3 /* TimestampValue */ : - return Bt(t.timestampValue, e.timestampValue); - - case 4 /* ServerTimestampValue */ : - return Bt(Pt(t), Pt(e)); - - case 5 /* StringValue */ : - return rt(t.stringValue, e.stringValue); - - case 6 /* BlobValue */ : - return function(t, e) { - const n = At(t), s = At(e); - return n.compareTo(s); - }(t.bytesValue, e.bytesValue); - - case 7 /* RefValue */ : - return function(t, e) { - const n = t.split("/"), s = e.split("/"); - for (let t = 0; t < n.length && t < s.length; t++) { - const e = rt(n[t], s[t]); - if (0 !== e) return e; - } - return rt(n.length, s.length); - }(t.referenceValue, e.referenceValue); - - case 8 /* GeoPointValue */ : - return function(t, e) { - const n = rt(Et(t.latitude), Et(e.latitude)); - if (0 !== n) return n; - return rt(Et(t.longitude), Et(e.longitude)); - }(t.geoPointValue, e.geoPointValue); - - case 9 /* ArrayValue */ : - return function(t, e) { - const n = t.values || [], s = e.values || []; - for (let t = 0; t < n.length && t < s.length; ++t) { - const e = Ft(n[t], s[t]); - if (e) return e; - } - return rt(n.length, s.length); - }(t.arrayValue, e.arrayValue); - - case 10 /* ObjectValue */ : - return function(t, e) { - const n = t.fields || {}, s = Object.keys(n), i = e.fields || {}, r = Object.keys(i); - // Even though MapValues are likely sorted correctly based on their insertion - // order (e.g. when received from the backend), local modifications can bring - // elements out of order. We need to re-sort the elements to ensure that - // canonical IDs are independent of insertion order. - s.sort(), r.sort(); - for (let t = 0; t < s.length && t < r.length; ++t) { - const e = rt(s[t], r[t]); - if (0 !== e) return e; - const o = Ft(n[s[t]], i[r[t]]); - if (0 !== o) return o; - } - return rt(s.length, r.length); - } - /** - * Generates the canonical ID for the provided field value (as used in Target - * serialization). - */ (t.mapValue, e.mapValue); - - default: - throw L(); - } -} - -function Bt(t, e) { - if ("string" == typeof t && "string" == typeof e && t.length === e.length) return rt(t, e); - const n = Tt(t), s = Tt(e), i = rt(n.seconds, s.seconds); - return 0 !== i ? i : rt(n.nanos, s.nanos); -} - -function Lt(t) { - return qt(t); -} - -function qt(t) { - return "nullValue" in t ? "null" : "booleanValue" in t ? "" + t.booleanValue : "integerValue" in t ? "" + t.integerValue : "doubleValue" in t ? "" + t.doubleValue : "timestampValue" in t ? function(t) { - const e = Tt(t); - return `time(${e.seconds},${e.nanos})`; - }(t.timestampValue) : "stringValue" in t ? t.stringValue : "bytesValue" in t ? At(t.bytesValue).toBase64() : "referenceValue" in t ? (n = t.referenceValue, - xt.fromName(n).toString()) : "geoPointValue" in t ? `geo(${(e = t.geoPointValue).latitude},${e.longitude})` : "arrayValue" in t ? function(t) { - let e = "[", n = !0; - for (const s of t.values || []) n ? n = !1 : e += ",", e += qt(s); - return e + "]"; - } - /** Returns a reference value for the provided database and key. */ (t.arrayValue) : "mapValue" in t ? function(t) { - // Iteration order in JavaScript is not guaranteed. To ensure that we generate - // matching canonical IDs for identical maps, we need to sort the keys. - const e = Object.keys(t.fields || {}).sort(); - let n = "{", s = !0; - for (const i of e) s ? s = !1 : n += ",", n += `${i}:${qt(t.fields[i])}`; - return n + "}"; - }(t.mapValue) : L(); - var e, n; -} - -function Ut(t, e) { - return { - referenceValue: `projects/${t.projectId}/databases/${t.database}/documents/${e.path.canonicalString()}` - }; -} - -/** Returns true if `value` is an IntegerValue . */ function Kt(t) { - return !!t && "integerValue" in t; -} - -/** Returns true if `value` is a DoubleValue. */ -/** Returns true if `value` is an ArrayValue. */ -function Gt(t) { - return !!t && "arrayValue" in t; -} - -/** Returns true if `value` is a NullValue. */ function Qt(t) { - return !!t && "nullValue" in t; -} - -/** Returns true if `value` is NaN. */ function jt(t) { - return !!t && "doubleValue" in t && isNaN(Number(t.doubleValue)); -} - -/** Returns true if `value` is a MapValue. */ function Wt(t) { - return !!t && "mapValue" in t; -} - -/** Creates a deep copy of `source`. */ function zt(t) { - if (t.geoPointValue) return { - geoPointValue: Object.assign({}, t.geoPointValue) - }; - if (t.timestampValue && "object" == typeof t.timestampValue) return { - timestampValue: Object.assign({}, t.timestampValue) - }; - if (t.mapValue) { - const e = { - mapValue: { - fields: {} - } - }; - return lt(t.mapValue.fields, ((t, n) => e.mapValue.fields[t] = zt(n))), e; - } - if (t.arrayValue) { - const e = { - arrayValue: { - values: [] - } - }; - for (let n = 0; n < (t.arrayValue.values || []).length; ++n) e.arrayValue.values[n] = zt(t.arrayValue.values[n]); - return e; - } - return Object.assign({}, t); -} - -/** Returns true if the Value represents the canonical {@link #MAX_VALUE} . */ function Ht(t) { - return "__max__" === (((t.mapValue || {}).fields || {}).__type__ || {}).stringValue; -} - -/** Returns the lowest value for the given value type (inclusive). */ function Jt(t, e) { - return void 0 === t ? e : void 0 === e || Ft(t, e) > 0 ? t : e; -} - -function Yt(t, e) { - return void 0 === t ? e : void 0 === e || Ft(t, e) < 0 ? t : e; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * An ObjectValue represents a MapValue in the Firestore Proto and offers the - * ability to add and remove fields (via the ObjectValueBuilder). - */ class Xt { - constructor(t) { - this.value = t; - } - static empty() { - return new Xt({ - mapValue: {} - }); - } - /** - * Returns the value at the given path or null. - * - * @param path - the path to search - * @returns The value at the path or null if the path is not set. - */ field(t) { - if (t.isEmpty()) return this.value; - { - let e = this.value; - for (let n = 0; n < t.length - 1; ++n) if (e = (e.mapValue.fields || {})[t.get(n)], - !Wt(e)) return null; - return e = (e.mapValue.fields || {})[t.lastSegment()], e || null; - } - } - /** - * Sets the field to the provided value. - * - * @param path - The field path to set. - * @param value - The value to set. - */ set(t, e) { - this.getFieldsMap(t.popLast())[t.lastSegment()] = zt(e); - } - /** - * Sets the provided fields to the provided values. - * - * @param data - A map of fields to values (or null for deletes). - */ setAll(t) { - let e = mt.emptyPath(), n = {}, s = []; - t.forEach(((t, i) => { - if (!e.isImmediateParentOf(i)) { - // Insert the accumulated changes at this parent location - const t = this.getFieldsMap(e); - this.applyChanges(t, n, s), n = {}, s = [], e = i.popLast(); - } - t ? n[i.lastSegment()] = zt(t) : s.push(i.lastSegment()); - })); - const i = this.getFieldsMap(e); - this.applyChanges(i, n, s); - } - /** - * Removes the field at the specified path. If there is no field at the - * specified path, nothing is changed. - * - * @param path - The field path to remove. - */ delete(t) { - const e = this.field(t.popLast()); - Wt(e) && e.mapValue.fields && delete e.mapValue.fields[t.lastSegment()]; - } - isEqual(t) { - return Ot(this.value, t.value); - } - /** - * Returns the map that contains the leaf element of `path`. If the parent - * entry does not yet exist, or if it is not a map, a new map will be created. - */ getFieldsMap(t) { - let e = this.value; - e.mapValue.fields || (e.mapValue = { - fields: {} - }); - for (let n = 0; n < t.length; ++n) { - let s = e.mapValue.fields[t.get(n)]; - Wt(s) && s.mapValue.fields || (s = { - mapValue: { - fields: {} - } - }, e.mapValue.fields[t.get(n)] = s), e = s; - } - return e.mapValue.fields; - } - /** - * Modifies `fieldsMap` by adding, replacing or deleting the specified - * entries. - */ applyChanges(t, e, n) { - lt(e, ((e, n) => t[e] = n)); - for (const e of n) delete t[e]; - } - clone() { - return new Xt(zt(this.value)); - } -} - -/** - * Returns a FieldMask built from all fields in a MapValue. - */ function Zt(t) { - const e = []; - return lt(t.fields, ((t, n) => { - const s = new mt([ t ]); - if (Wt(n)) { - const t = Zt(n.mapValue).fields; - if (0 === t.length) - // Preserve the empty map by adding it to the FieldMask. - e.push(s); else - // For nested and non-empty ObjectValues, add the FieldPath of the - // leaf nodes. - for (const n of t) e.push(s.child(n)); - } else - // For nested and non-empty ObjectValues, add the FieldPath of the leaf - // nodes. - e.push(s); - })), new gt(e); -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Represents a document in Firestore with a key, version, data and whether it - * has local mutations applied to it. - * - * Documents can transition between states via `convertToFoundDocument()`, - * `convertToNoDocument()` and `convertToUnknownDocument()`. If a document does - * not transition to one of these states even after all mutations have been - * applied, `isValidDocument()` returns false and the document should be removed - * from all views. - */ class te { - constructor(t, e, n, s, i, r) { - this.key = t, this.documentType = e, this.version = n, this.readTime = s, this.data = i, - this.documentState = r; - } - /** - * Creates a document with no known version or data, but which can serve as - * base document for mutations. - */ static newInvalidDocument(t) { - return new te(t, 0 /* INVALID */ , ct.min(), ct.min(), Xt.empty(), 0 /* SYNCED */); - } - /** - * Creates a new document that is known to exist with the given data at the - * given version. - */ static newFoundDocument(t, e, n) { - return new te(t, 1 /* FOUND_DOCUMENT */ , e, ct.min(), n, 0 /* SYNCED */); - } - /** Creates a new document that is known to not exist at the given version. */ static newNoDocument(t, e) { - return new te(t, 2 /* NO_DOCUMENT */ , e, ct.min(), Xt.empty(), 0 /* SYNCED */); - } - /** - * Creates a new document that is known to exist at the given version but - * whose data is not known (e.g. a document that was updated without a known - * base document). - */ static newUnknownDocument(t, e) { - return new te(t, 3 /* UNKNOWN_DOCUMENT */ , e, ct.min(), Xt.empty(), 2 /* HAS_COMMITTED_MUTATIONS */); - } - /** - * Changes the document type to indicate that it exists and that its version - * and data are known. - */ convertToFoundDocument(t, e) { - return this.version = t, this.documentType = 1 /* FOUND_DOCUMENT */ , this.data = e, - this.documentState = 0 /* SYNCED */ , this; - } - /** - * Changes the document type to indicate that it doesn't exist at the given - * version. - */ convertToNoDocument(t) { - return this.version = t, this.documentType = 2 /* NO_DOCUMENT */ , this.data = Xt.empty(), - this.documentState = 0 /* SYNCED */ , this; - } - /** - * Changes the document type to indicate that it exists at a given version but - * that its data is not known (e.g. a document that was updated without a known - * base document). - */ convertToUnknownDocument(t) { - return this.version = t, this.documentType = 3 /* UNKNOWN_DOCUMENT */ , this.data = Xt.empty(), - this.documentState = 2 /* HAS_COMMITTED_MUTATIONS */ , this; - } - setHasCommittedMutations() { - return this.documentState = 2 /* HAS_COMMITTED_MUTATIONS */ , this; - } - setHasLocalMutations() { - return this.documentState = 1 /* HAS_LOCAL_MUTATIONS */ , this; - } - setReadTime(t) { - return this.readTime = t, this; - } - get hasLocalMutations() { - return 1 /* HAS_LOCAL_MUTATIONS */ === this.documentState; - } - get hasCommittedMutations() { - return 2 /* HAS_COMMITTED_MUTATIONS */ === this.documentState; - } - get hasPendingWrites() { - return this.hasLocalMutations || this.hasCommittedMutations; - } - isValidDocument() { - return 0 /* INVALID */ !== this.documentType; - } - isFoundDocument() { - return 1 /* FOUND_DOCUMENT */ === this.documentType; - } - isNoDocument() { - return 2 /* NO_DOCUMENT */ === this.documentType; - } - isUnknownDocument() { - return 3 /* UNKNOWN_DOCUMENT */ === this.documentType; - } - isEqual(t) { - return t instanceof te && this.key.isEqual(t.key) && this.version.isEqual(t.version) && this.documentType === t.documentType && this.documentState === t.documentState && this.data.isEqual(t.data); - } - mutableCopy() { - return new te(this.key, this.documentType, this.version, this.readTime, this.data.clone(), this.documentState); - } - toString() { - return `Document(${this.key}, ${this.version}, ${JSON.stringify(this.data.value)}, {documentType: ${this.documentType}}), {documentState: ${this.documentState}})`; - } -} - -/** - * Compares the value for field `field` in the provided documents. Throws if - * the field does not exist in both documents. - */ -/** - * An index definition for field indexes in Firestore. - * - * Every index is associated with a collection. The definition contains a list - * of fields and their index kind (which can be `ASCENDING`, `DESCENDING` or - * `CONTAINS` for ArrayContains/ArrayContainsAny queries). - * - * Unlike the backend, the SDK does not differentiate between collection or - * collection group-scoped indices. Every index can be used for both single - * collection and collection group queries. - */ -class ee { - constructor( - /** - * The index ID. Returns -1 if the index ID is not available (e.g. the index - * has not yet been persisted). - */ - t, - /** The collection ID this index applies to. */ - e, - /** The field segments for this index. */ - n, - /** Shows how up-to-date the index is for the current user. */ - s) { - this.indexId = t, this.collectionGroup = e, this.fields = n, this.indexState = s; - } -} - -/** An ID for an index that has not yet been added to persistence. */ -/** Returns the ArrayContains/ArrayContainsAny segment for this index. */ -function ne(t) { - return t.fields.find((t => 2 /* CONTAINS */ === t.kind)); -} - -/** Returns all directional (ascending/descending) segments for this index. */ function se(t) { - return t.fields.filter((t => 2 /* CONTAINS */ !== t.kind)); -} - -/** Returns a debug representation of the field index */ ee.UNKNOWN_ID = -1; - -/** An index component consisting of field path and index type. */ -class ie { - constructor( - /** The field path of the component. */ - t, - /** The fields sorting order. */ - e) { - this.fieldPath = t, this.kind = e; - } -} - -/** - * Stores the "high water mark" that indicates how updated the Index is for the - * current user. - */ class re { - constructor( - /** - * Indicates when the index was last updated (relative to other indexes). - */ - t, - /** The the latest indexed read time, document and batch id. */ - e) { - this.sequenceNumber = t, this.offset = e; - } - /** The state of an index that has not yet been backfilled. */ static empty() { - return new re(0, oe.min()); - } -} - -/** - * Stores the latest read time, document and batch ID that were processed for an - * index. - */ class oe { - constructor( - /** - * The latest read time version that has been indexed by Firestore for this - * field index. - */ - t, - /** - * The key of the last document that was indexed for this query. Use - * `DocumentKey.empty()` if no document has been indexed. - */ - e, - /* - * The largest mutation batch id that's been processed by Firestore. - */ - n) { - this.readTime = t, this.documentKey = e, this.largestBatchId = n; - } - /** The state of an index that has not yet been backfilled. */ static min() { - return new oe(ct.min(), xt.empty(), -1); - } -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -// Visible for testing -class ae { - constructor(t, e = null, n = [], s = [], i = null, r = null, o = null) { - this.path = t, this.collectionGroup = e, this.orderBy = n, this.filters = s, this.limit = i, - this.startAt = r, this.endAt = o, this.P = null; - } -} - -/** - * Initializes a Target with a path and optional additional query constraints. - * Path must currently be empty if this is a collection group query. - * - * NOTE: you should always construct `Target` from `Query.toTarget` instead of - * using this factory method, because `Query` provides an implicit `orderBy` - * property. - */ function ue(t, e = null, n = [], s = [], i = null, r = null, o = null) { - return new ae(t, e, n, s, i, r, o); -} - -function ce(t) { - const e = K(t); - if (null === e.P) { - let t = e.path.canonicalString(); - null !== e.collectionGroup && (t += "|cg:" + e.collectionGroup), t += "|f:", t += e.filters.map((t => { - return (e = t).field.canonicalString() + e.op.toString() + Lt(e.value); - var e; - })).join(","), t += "|ob:", t += e.orderBy.map((t => function(t) { - // TODO(b/29183165): Make this collision robust. - return t.field.canonicalString() + t.dir; - }(t))).join(","), St(e.limit) || (t += "|l:", t += e.limit), e.startAt && (t += "|lb:", - t += e.startAt.inclusive ? "b:" : "a:", t += e.startAt.position.map((t => Lt(t))).join(",")), - e.endAt && (t += "|ub:", t += e.endAt.inclusive ? "a:" : "b:", t += e.endAt.position.map((t => Lt(t))).join(",")), - e.P = t; - } - return e.P; -} - -function he(t) { - let e = t.path.canonicalString(); - return null !== t.collectionGroup && (e += " collectionGroup=" + t.collectionGroup), - t.filters.length > 0 && (e += `, filters: [${t.filters.map((t => { - return `${(e = t).field.canonicalString()} ${e.op} ${Lt(e.value)}`; - /** Returns a debug description for `filter`. */ - var e; - /** Filter that matches on key fields (i.e. '__name__'). */ })).join(", ")}]`), - St(t.limit) || (e += ", limit: " + t.limit), t.orderBy.length > 0 && (e += `, orderBy: [${t.orderBy.map((t => function(t) { - return `${t.field.canonicalString()} (${t.dir})`; - }(t))).join(", ")}]`), t.startAt && (e += ", startAt: ", e += t.startAt.inclusive ? "b:" : "a:", - e += t.startAt.position.map((t => Lt(t))).join(",")), t.endAt && (e += ", endAt: ", - e += t.endAt.inclusive ? "a:" : "b:", e += t.endAt.position.map((t => Lt(t))).join(",")), - `Target(${e})`; -} - -function le(t, e) { - if (t.limit !== e.limit) return !1; - if (t.orderBy.length !== e.orderBy.length) return !1; - for (let n = 0; n < t.orderBy.length; n++) if (!be(t.orderBy[n], e.orderBy[n])) return !1; - if (t.filters.length !== e.filters.length) return !1; - for (let i = 0; i < t.filters.length; i++) if (n = t.filters[i], s = e.filters[i], - n.op !== s.op || !n.field.isEqual(s.field) || !Ot(n.value, s.value)) return !1; - var n, s; - return t.collectionGroup === e.collectionGroup && (!!t.path.isEqual(e.path) && (!!Ve(t.startAt, e.startAt) && Ve(t.endAt, e.endAt))); -} - -function fe(t) { - return xt.isDocumentKey(t.path) && null === t.collectionGroup && 0 === t.filters.length; -} - -/** Returns the field filters that target the given field path. */ function de(t, e) { - return t.filters.filter((t => t instanceof _e && t.field.isEqual(e))); -} - -/** - * Returns the values that are used in ARRAY_CONTAINS or ARRAY_CONTAINS_ANY - * filters. Returns `null` if there are no such filters. - */ class _e extends class {} { - constructor(t, e, n) { - super(), this.field = t, this.op = e, this.value = n; - } - /** - * Creates a filter based on the provided arguments. - */ static create(t, e, n) { - return t.isKeyField() ? "in" /* IN */ === e || "not-in" /* NOT_IN */ === e ? this.V(t, e, n) : new we(t, e, n) : "array-contains" /* ARRAY_CONTAINS */ === e ? new pe(t, n) : "in" /* IN */ === e ? new Ie(t, n) : "not-in" /* NOT_IN */ === e ? new Te(t, n) : "array-contains-any" /* ARRAY_CONTAINS_ANY */ === e ? new Ee(t, n) : new _e(t, e, n); - } - static V(t, e, n) { - return "in" /* IN */ === e ? new me(t, n) : new ge(t, n); - } - matches(t) { - const e = t.data.field(this.field); - // Types do not have to match in NOT_EQUAL filters. - return "!=" /* NOT_EQUAL */ === this.op ? null !== e && this.v(Ft(e, this.value)) : null !== e && Mt(this.value) === Mt(e) && this.v(Ft(e, this.value)); - // Only compare types with matching backend order (such as double and int). - } - v(t) { - switch (this.op) { - case "<" /* LESS_THAN */ : - return t < 0; - - case "<=" /* LESS_THAN_OR_EQUAL */ : - return t <= 0; - - case "==" /* EQUAL */ : - return 0 === t; - - case "!=" /* NOT_EQUAL */ : - return 0 !== t; - - case ">" /* GREATER_THAN */ : - return t > 0; - - case ">=" /* GREATER_THAN_OR_EQUAL */ : - return t >= 0; - - default: - return L(); - } - } - S() { - return [ "<" /* LESS_THAN */ , "<=" /* LESS_THAN_OR_EQUAL */ , ">" /* GREATER_THAN */ , ">=" /* GREATER_THAN_OR_EQUAL */ , "!=" /* NOT_EQUAL */ , "not-in" /* NOT_IN */ ].indexOf(this.op) >= 0; - } -} - -class we extends _e { - constructor(t, e, n) { - super(t, e, n), this.key = xt.fromName(n.referenceValue); - } - matches(t) { - const e = xt.comparator(t.key, this.key); - return this.v(e); - } -} - -/** Filter that matches on key fields within an array. */ class me extends _e { - constructor(t, e) { - super(t, "in" /* IN */ , e), this.keys = ye("in" /* IN */ , e); - } - matches(t) { - return this.keys.some((e => e.isEqual(t.key))); - } -} - -/** Filter that matches on key fields not present within an array. */ class ge extends _e { - constructor(t, e) { - super(t, "not-in" /* NOT_IN */ , e), this.keys = ye("not-in" /* NOT_IN */ , e); - } - matches(t) { - return !this.keys.some((e => e.isEqual(t.key))); - } -} - -function ye(t, e) { - var n; - return ((null === (n = e.arrayValue) || void 0 === n ? void 0 : n.values) || []).map((t => xt.fromName(t.referenceValue))); -} - -/** A Filter that implements the array-contains operator. */ class pe extends _e { - constructor(t, e) { - super(t, "array-contains" /* ARRAY_CONTAINS */ , e); - } - matches(t) { - const e = t.data.field(this.field); - return Gt(e) && $t(e.arrayValue, this.value); - } -} - -/** A Filter that implements the IN operator. */ class Ie extends _e { - constructor(t, e) { - super(t, "in" /* IN */ , e); - } - matches(t) { - const e = t.data.field(this.field); - return null !== e && $t(this.value.arrayValue, e); - } -} - -/** A Filter that implements the not-in operator. */ class Te extends _e { - constructor(t, e) { - super(t, "not-in" /* NOT_IN */ , e); - } - matches(t) { - if ($t(this.value.arrayValue, { - nullValue: "NULL_VALUE" - })) return !1; - const e = t.data.field(this.field); - return null !== e && !$t(this.value.arrayValue, e); - } -} - -/** A Filter that implements the array-contains-any operator. */ class Ee extends _e { - constructor(t, e) { - super(t, "array-contains-any" /* ARRAY_CONTAINS_ANY */ , e); - } - matches(t) { - const e = t.data.field(this.field); - return !(!Gt(e) || !e.arrayValue.values) && e.arrayValue.values.some((t => $t(this.value.arrayValue, t))); - } -} - -/** - * Represents a bound of a query. - * - * The bound is specified with the given components representing a position and - * whether it's just before or just after the position (relative to whatever the - * query order is). - * - * The position represents a logical index position for a query. It's a prefix - * of values for the (potentially implicit) order by clauses of a query. - * - * Bound provides a function to determine whether a document comes before or - * after a bound. This is influenced by whether the position is just before or - * just after the provided values. - */ class Ae { - constructor(t, e) { - this.position = t, this.inclusive = e; - } -} - -/** - * An ordering on a field, in some Direction. Direction defaults to ASCENDING. - */ class Re { - constructor(t, e = "asc" /* ASCENDING */) { - this.field = t, this.dir = e; - } -} - -function be(t, e) { - return t.dir === e.dir && t.field.isEqual(e.field); -} - -function Pe(t, e, n) { - let s = 0; - for (let i = 0; i < t.position.length; i++) { - const r = e[i], o = t.position[i]; - if (r.field.isKeyField()) s = xt.comparator(xt.fromName(o.referenceValue), n.key); else { - s = Ft(o, n.data.field(r.field)); - } - if ("desc" /* DESCENDING */ === r.dir && (s *= -1), 0 !== s) break; - } - return s; -} - -/** - * Returns true if a document sorts after a bound using the provided sort - * order. - */ function Ve(t, e) { - if (null === t) return null === e; - if (null === e) return !1; - if (t.inclusive !== e.inclusive || t.position.length !== e.position.length) return !1; - for (let n = 0; n < t.position.length; n++) { - if (!Ot(t.position[n], e.position[n])) return !1; - } - return !0; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Query encapsulates all the query attributes we support in the SDK. It can - * be run against the LocalStore, as well as be converted to a `Target` to - * query the RemoteStore results. - * - * Visible for testing. - */ class ve { - /** - * Initializes a Query with a path and optional additional query constraints. - * Path must currently be empty if this is a collection group query. - */ - constructor(t, e = null, n = [], s = [], i = null, r = "F" /* First */ , o = null, a = null) { - this.path = t, this.collectionGroup = e, this.explicitOrderBy = n, this.filters = s, - this.limit = i, this.limitType = r, this.startAt = o, this.endAt = a, this.D = null, - // The corresponding `Target` of this `Query` instance. - this.C = null, this.startAt, this.endAt; - } -} - -/** Creates a new Query instance with the options provided. */ function Se(t, e, n, s, i, r, o, a) { - return new ve(t, e, n, s, i, r, o, a); -} - -/** Creates a new Query for a query that matches all documents at `path` */ function De(t) { - return new ve(t); -} - -/** - * Helper to convert a collection group query into a collection query at a - * specific path. This is used when executing collection group queries, since - * we have to split the query into a set of collection queries at multiple - * paths. - */ function Ce(t) { - return !St(t.limit) && "F" /* First */ === t.limitType; -} - -function xe(t) { - return !St(t.limit) && "L" /* Last */ === t.limitType; -} - -function Ne(t) { - return t.explicitOrderBy.length > 0 ? t.explicitOrderBy[0].field : null; -} - -function ke(t) { - for (const e of t.filters) if (e.S()) return e.field; - return null; -} - -/** - * Checks if any of the provided Operators are included in the query and - * returns the first one that is, or null if none are. - */ -/** - * Returns whether the query matches a collection group rather than a specific - * collection. - */ -function Me(t) { - return null !== t.collectionGroup; -} - -/** - * Returns the implicit order by constraint that is used to execute the Query, - * which can be different from the order by constraints the user provided (e.g. - * the SDK and backend always orders by `__name__`). - */ function Oe(t) { - const e = K(t); - if (null === e.D) { - e.D = []; - const t = ke(e), n = Ne(e); - if (null !== t && null === n) - // In order to implicitly add key ordering, we must also add the - // inequality filter field for it to be a valid query. - // Note that the default inequality field and key ordering is ascending. - t.isKeyField() || e.D.push(new Re(t)), e.D.push(new Re(mt.keyField(), "asc" /* ASCENDING */)); else { - let t = !1; - for (const n of e.explicitOrderBy) e.D.push(n), n.field.isKeyField() && (t = !0); - if (!t) { - // The order of the implicit key ordering always matches the last - // explicit order by - const t = e.explicitOrderBy.length > 0 ? e.explicitOrderBy[e.explicitOrderBy.length - 1].dir : "asc" /* ASCENDING */; - e.D.push(new Re(mt.keyField(), t)); - } - } - } - return e.D; -} - -/** - * Converts this `Query` instance to it's corresponding `Target` representation. - */ function $e(t) { - const e = K(t); - if (!e.C) if ("F" /* First */ === e.limitType) e.C = ue(e.path, e.collectionGroup, Oe(e), e.filters, e.limit, e.startAt, e.endAt); else { - // Flip the orderBy directions since we want the last results - const t = []; - for (const n of Oe(e)) { - const e = "desc" /* DESCENDING */ === n.dir ? "asc" /* ASCENDING */ : "desc" /* DESCENDING */; - t.push(new Re(n.field, e)); - } - // We need to swap the cursors to match the now-flipped query ordering. - const n = e.endAt ? new Ae(e.endAt.position, !e.endAt.inclusive) : null, s = e.startAt ? new Ae(e.startAt.position, !e.startAt.inclusive) : null; - // Now return as a LimitType.First query. - e.C = ue(e.path, e.collectionGroup, t, e.filters, e.limit, n, s); - } - return e.C; -} - -function Fe(t, e, n) { - return new ve(t.path, t.collectionGroup, t.explicitOrderBy.slice(), t.filters.slice(), e, n, t.startAt, t.endAt); -} - -function Be(t, e) { - return le($e(t), $e(e)) && t.limitType === e.limitType; -} - -// TODO(b/29183165): This is used to get a unique string from a query to, for -// example, use as a dictionary key, but the implementation is subject to -// collisions. Make it collision-free. -function Le(t) { - return `${ce($e(t))}|lt:${t.limitType}`; -} - -function qe(t) { - return `Query(target=${he($e(t))}; limitType=${t.limitType})`; -} - -/** Returns whether `doc` matches the constraints of `query`. */ function Ue(t, e) { - return e.isFoundDocument() && function(t, e) { - const n = e.key.path; - return null !== t.collectionGroup ? e.key.hasCollectionId(t.collectionGroup) && t.path.isPrefixOf(n) : xt.isDocumentKey(t.path) ? t.path.isEqual(n) : t.path.isImmediateParentOf(n); - } - /** - * A document must have a value for every ordering clause in order to show up - * in the results. - */ (t, e) && function(t, e) { - for (const n of t.explicitOrderBy) - // order by key always matches - if (!n.field.isKeyField() && null === e.data.field(n.field)) return !1; - return !0; - }(t, e) && function(t, e) { - for (const n of t.filters) if (!n.matches(e)) return !1; - return !0; - } - /** Makes sure a document is within the bounds, if provided. */ (t, e) && function(t, e) { - if (t.startAt && ! - /** - * Returns true if a document sorts before a bound using the provided sort - * order. - */ - function(t, e, n) { - const s = Pe(t, e, n); - return t.inclusive ? s <= 0 : s < 0; - }(t.startAt, Oe(t), e)) return !1; - if (t.endAt && !function(t, e, n) { - const s = Pe(t, e, n); - return t.inclusive ? s >= 0 : s > 0; - }(t.endAt, Oe(t), e)) return !1; - return !0; - } - /** - * Returns a new comparator function that can be used to compare two documents - * based on the Query's ordering constraint. - */ (t, e); -} - -function Ke(t) { - return (e, n) => { - let s = !1; - for (const i of Oe(t)) { - const t = Ge(i, e, n); - if (0 !== t) return t; - s = s || i.field.isKeyField(); - } - return 0; - }; -} - -function Ge(t, e, n) { - const s = t.field.isKeyField() ? xt.comparator(e.key, n.key) : function(t, e, n) { - const s = e.data.field(t), i = n.data.field(t); - return null !== s && null !== i ? Ft(s, i) : L(); - } - /** - * @license - * Copyright 2021 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * The initial mutation batch id for each index. Gets updated during index - * backfill. - */ (t.field, e, n); - switch (t.dir) { - case "asc" /* ASCENDING */ : - return s; - - case "desc" /* DESCENDING */ : - return -1 * s; - - default: - return L(); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Returns an DoubleValue for `value` that is encoded based the serializer's - * `useProto3Json` setting. - */ function Qe(t, e) { - if (t.N) { - if (isNaN(e)) return { - doubleValue: "NaN" - }; - if (e === 1 / 0) return { - doubleValue: "Infinity" - }; - if (e === -1 / 0) return { - doubleValue: "-Infinity" - }; - } - return { - doubleValue: Dt(e) ? "-0" : e - }; -} - -/** - * Returns an IntegerValue for `value`. - */ function je(t) { - return { - integerValue: "" + t - }; -} - -/** - * Returns a value for a number that's appropriate to put into a proto. - * The return value is an IntegerValue if it can safely represent the value, - * otherwise a DoubleValue is returned. - */ function We(t, e) { - return Ct(e) ? je(e) : Qe(t, e); -} - -/** - * @license - * Copyright 2018 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** Used to represent a field transform on a mutation. */ class ze { - constructor() { - // Make sure that the structural type of `TransformOperation` is unique. - // See https://github.com/microsoft/TypeScript/issues/5451 - this._ = void 0; - } -} - -/** - * Computes the local transform result against the provided `previousValue`, - * optionally using the provided localWriteTime. - */ function He(t, e, n) { - return t instanceof Xe ? function(t, e) { - const n = { - fields: { - __type__: { - stringValue: "server_timestamp" - }, - __local_write_time__: { - timestampValue: { - seconds: t.seconds, - nanos: t.nanoseconds - } - } - } - }; - return e && (n.fields.__previous_value__ = e), { - mapValue: n - }; - }(n, e) : t instanceof Ze ? tn(t, e) : t instanceof en ? nn(t, e) : function(t, e) { - // PORTING NOTE: Since JavaScript's integer arithmetic is limited to 53 bit - // precision and resolves overflows by reducing precision, we do not - // manually cap overflows at 2^63. - const n = Ye(t, e), s = rn(n) + rn(t.k); - return Kt(n) && Kt(t.k) ? je(s) : Qe(t.M, s); - }(t, e); -} - -/** - * Computes a final transform result after the transform has been acknowledged - * by the server, potentially using the server-provided transformResult. - */ function Je(t, e, n) { - // The server just sends null as the transform result for array operations, - // so we have to calculate a result the same as we do for local - // applications. - return t instanceof Ze ? tn(t, e) : t instanceof en ? nn(t, e) : n; -} - -/** - * If this transform operation is not idempotent, returns the base value to - * persist for this transform. If a base value is returned, the transform - * operation is always applied to this base value, even if document has - * already been updated. - * - * Base values provide consistent behavior for non-idempotent transforms and - * allow us to return the same latency-compensated value even if the backend - * has already applied the transform operation. The base value is null for - * idempotent transforms, as they can be re-played even if the backend has - * already applied them. - * - * @returns a base value to store along with the mutation, or null for - * idempotent transforms. - */ function Ye(t, e) { - return t instanceof sn ? Kt(n = e) || function(t) { - return !!t && "doubleValue" in t; - } - /** Returns true if `value` is either an IntegerValue or a DoubleValue. */ (n) ? e : { - integerValue: 0 - } : null; - var n; -} - -/** Transforms a value into a server-generated timestamp. */ -class Xe extends ze {} - -/** Transforms an array value via a union operation. */ class Ze extends ze { - constructor(t) { - super(), this.elements = t; - } -} - -function tn(t, e) { - const n = on(e); - for (const e of t.elements) n.some((t => Ot(t, e))) || n.push(e); - return { - arrayValue: { - values: n - } - }; -} - -/** Transforms an array value via a remove operation. */ class en extends ze { - constructor(t) { - super(), this.elements = t; - } -} - -function nn(t, e) { - let n = on(e); - for (const e of t.elements) n = n.filter((t => !Ot(t, e))); - return { - arrayValue: { - values: n - } - }; -} - -/** - * Implements the backend semantics for locally computed NUMERIC_ADD (increment) - * transforms. Converts all field values to integers or doubles, but unlike the - * backend does not cap integer values at 2^63. Instead, JavaScript number - * arithmetic is used and precision loss can occur for values greater than 2^53. - */ class sn extends ze { - constructor(t, e) { - super(), this.M = t, this.k = e; - } -} - -function rn(t) { - return Et(t.integerValue || t.doubleValue); -} - -function on(t) { - return Gt(t) && t.arrayValue.values ? t.arrayValue.values.slice() : []; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** A field path and the TransformOperation to perform upon it. */ class an { - constructor(t, e) { - this.field = t, this.transform = e; - } -} - -function un(t, e) { - return t.field.isEqual(e.field) && function(t, e) { - return t instanceof Ze && e instanceof Ze || t instanceof en && e instanceof en ? ot(t.elements, e.elements, Ot) : t instanceof sn && e instanceof sn ? Ot(t.k, e.k) : t instanceof Xe && e instanceof Xe; - }(t.transform, e.transform); -} - -/** The result of successfully applying a mutation to the backend. */ -class cn { - constructor( - /** - * The version at which the mutation was committed: - * - * - For most operations, this is the updateTime in the WriteResult. - * - For deletes, the commitTime of the WriteResponse (because deletes are - * not stored and have no updateTime). - * - * Note that these versions can be different: No-op writes will not change - * the updateTime even though the commitTime advances. - */ - t, - /** - * The resulting fields returned from the backend after a mutation - * containing field transforms has been committed. Contains one FieldValue - * for each FieldTransform that was in the mutation. - * - * Will be empty if the mutation did not contain any field transforms. - */ - e) { - this.version = t, this.transformResults = e; - } -} - -/** - * Encodes a precondition for a mutation. This follows the model that the - * backend accepts with the special case of an explicit "empty" precondition - * (meaning no precondition). - */ class hn { - constructor(t, e) { - this.updateTime = t, this.exists = e; - } - /** Creates a new empty Precondition. */ static none() { - return new hn; - } - /** Creates a new Precondition with an exists flag. */ static exists(t) { - return new hn(void 0, t); - } - /** Creates a new Precondition based on a version a document exists at. */ static updateTime(t) { - return new hn(t); - } - /** Returns whether this Precondition is empty. */ get isNone() { - return void 0 === this.updateTime && void 0 === this.exists; - } - isEqual(t) { - return this.exists === t.exists && (this.updateTime ? !!t.updateTime && this.updateTime.isEqual(t.updateTime) : !t.updateTime); - } -} - -/** Returns true if the preconditions is valid for the given document. */ function ln(t, e) { - return void 0 !== t.updateTime ? e.isFoundDocument() && e.version.isEqual(t.updateTime) : void 0 === t.exists || t.exists === e.isFoundDocument(); -} - -/** - * A mutation describes a self-contained change to a document. Mutations can - * create, replace, delete, and update subsets of documents. - * - * Mutations not only act on the value of the document but also its version. - * - * For local mutations (mutations that haven't been committed yet), we preserve - * the existing version for Set and Patch mutations. For Delete mutations, we - * reset the version to 0. - * - * Here's the expected transition table. - * - * MUTATION APPLIED TO RESULTS IN - * - * SetMutation Document(v3) Document(v3) - * SetMutation NoDocument(v3) Document(v0) - * SetMutation InvalidDocument(v0) Document(v0) - * PatchMutation Document(v3) Document(v3) - * PatchMutation NoDocument(v3) NoDocument(v3) - * PatchMutation InvalidDocument(v0) UnknownDocument(v3) - * DeleteMutation Document(v3) NoDocument(v0) - * DeleteMutation NoDocument(v3) NoDocument(v0) - * DeleteMutation InvalidDocument(v0) NoDocument(v0) - * - * For acknowledged mutations, we use the updateTime of the WriteResponse as - * the resulting version for Set and Patch mutations. As deletes have no - * explicit update time, we use the commitTime of the WriteResponse for - * Delete mutations. - * - * If a mutation is acknowledged by the backend but fails the precondition check - * locally, we transition to an `UnknownDocument` and rely on Watch to send us - * the updated version. - * - * Field transforms are used only with Patch and Set Mutations. We use the - * `updateTransforms` message to store transforms, rather than the `transforms`s - * messages. - * - * ## Subclassing Notes - * - * Every type of mutation needs to implement its own applyToRemoteDocument() and - * applyToLocalView() to implement the actual behavior of applying the mutation - * to some source document (see `setMutationApplyToRemoteDocument()` for an - * example). - */ class fn {} - -/** - * Applies this mutation to the given document for the purposes of computing a - * new remote document. If the input document doesn't match the expected state - * (e.g. it is invalid or outdated), the document type may transition to - * unknown. - * - * @param mutation - The mutation to apply. - * @param document - The document to mutate. The input document can be an - * invalid document if the client has no knowledge of the pre-mutation state - * of the document. - * @param mutationResult - The result of applying the mutation from the backend. - */ function dn(t, e, n) { - t instanceof yn ? function(t, e, n) { - // Unlike setMutationApplyToLocalView, if we're applying a mutation to a - // remote document the server has accepted the mutation so the precondition - // must have held. - const s = t.value.clone(), i = Tn(t.fieldTransforms, e, n.transformResults); - s.setAll(i), e.convertToFoundDocument(n.version, s).setHasCommittedMutations(); - }(t, e, n) : t instanceof pn ? function(t, e, n) { - if (!ln(t.precondition, e)) - // Since the mutation was not rejected, we know that the precondition - // matched on the backend. We therefore must not have the expected version - // of the document in our cache and convert to an UnknownDocument with a - // known updateTime. - return void e.convertToUnknownDocument(n.version); - const s = Tn(t.fieldTransforms, e, n.transformResults), i = e.data; - i.setAll(In(t)), i.setAll(s), e.convertToFoundDocument(n.version, i).setHasCommittedMutations(); - }(t, e, n) : function(t, e, n) { - // Unlike applyToLocalView, if we're applying a mutation to a remote - // document the server has accepted the mutation so the precondition must - // have held. - e.convertToNoDocument(n.version).setHasCommittedMutations(); - }(0, e, n); -} - -/** - * Applies this mutation to the given document for the purposes of computing - * the new local view of a document. If the input document doesn't match the - * expected state, the document is not modified. - * - * @param mutation - The mutation to apply. - * @param document - The document to mutate. The input document can be an - * invalid document if the client has no knowledge of the pre-mutation state - * of the document. - * @param localWriteTime - A timestamp indicating the local write time of the - * batch this mutation is a part of. - */ function _n(t, e, n) { - t instanceof yn ? function(t, e, n) { - if (!ln(t.precondition, e)) - // The mutation failed to apply (e.g. a document ID created with add() - // caused a name collision). - return; - const s = t.value.clone(), i = En(t.fieldTransforms, n, e); - s.setAll(i), e.convertToFoundDocument(gn(e), s).setHasLocalMutations(); - } - /** - * A mutation that modifies fields of the document at the given key with the - * given values. The values are applied through a field mask: - * - * * When a field is in both the mask and the values, the corresponding field - * is updated. - * * When a field is in neither the mask nor the values, the corresponding - * field is unmodified. - * * When a field is in the mask but not in the values, the corresponding field - * is deleted. - * * When a field is not in the mask but is in the values, the values map is - * ignored. - */ (t, e, n) : t instanceof pn ? function(t, e, n) { - if (!ln(t.precondition, e)) return; - const s = En(t.fieldTransforms, n, e), i = e.data; - i.setAll(In(t)), i.setAll(s), e.convertToFoundDocument(gn(e), i).setHasLocalMutations(); - } - /** - * Returns a FieldPath/Value map with the content of the PatchMutation. - */ (t, e, n) : function(t, e) { - ln(t.precondition, e) && - // We don't call `setHasLocalMutations()` since we want to be backwards - // compatible with the existing SDK behavior. - e.convertToNoDocument(ct.min()); - } - /** - * A mutation that verifies the existence of the document at the given key with - * the provided precondition. - * - * The `verify` operation is only used in Transactions, and this class serves - * primarily to facilitate serialization into protos. - */ (t, e); -} - -/** - * If this mutation is not idempotent, returns the base value to persist with - * this mutation. If a base value is returned, the mutation is always applied - * to this base value, even if document has already been updated. - * - * The base value is a sparse object that consists of only the document - * fields for which this mutation contains a non-idempotent transformation - * (e.g. a numeric increment). The provided value guarantees consistent - * behavior for non-idempotent transforms and allow us to return the same - * latency-compensated value even if the backend has already applied the - * mutation. The base value is null for idempotent mutations, as they can be - * re-played even if the backend has already applied them. - * - * @returns a base value to store along with the mutation, or null for - * idempotent mutations. - */ function wn(t, e) { - let n = null; - for (const s of t.fieldTransforms) { - const t = e.data.field(s.field), i = Ye(s.transform, t || null); - null != i && (null == n && (n = Xt.empty()), n.set(s.field, i)); - } - return n || null; -} - -function mn(t, e) { - return t.type === e.type && (!!t.key.isEqual(e.key) && (!!t.precondition.isEqual(e.precondition) && (!!function(t, e) { - return void 0 === t && void 0 === e || !(!t || !e) && ot(t, e, ((t, e) => un(t, e))); - }(t.fieldTransforms, e.fieldTransforms) && (0 /* Set */ === t.type ? t.value.isEqual(e.value) : 1 /* Patch */ !== t.type || t.data.isEqual(e.data) && t.fieldMask.isEqual(e.fieldMask))))); -} - -/** - * Returns the version from the given document for use as the result of a - * mutation. Mutations are defined to return the version of the base document - * only if it is an existing document. Deleted and unknown documents have a - * post-mutation version of SnapshotVersion.min(). - */ function gn(t) { - return t.isFoundDocument() ? t.version : ct.min(); -} - -/** - * A mutation that creates or replaces the document at the given key with the - * object value contents. - */ class yn extends fn { - constructor(t, e, n, s = []) { - super(), this.key = t, this.value = e, this.precondition = n, this.fieldTransforms = s, - this.type = 0 /* Set */; - } -} - -class pn extends fn { - constructor(t, e, n, s, i = []) { - super(), this.key = t, this.data = e, this.fieldMask = n, this.precondition = s, - this.fieldTransforms = i, this.type = 1 /* Patch */; - } -} - -function In(t) { - const e = new Map; - return t.fieldMask.fields.forEach((n => { - if (!n.isEmpty()) { - const s = t.data.field(n); - e.set(n, s); - } - })), e; -} - -/** - * Creates a list of "transform results" (a transform result is a field value - * representing the result of applying a transform) for use after a mutation - * containing transforms has been acknowledged by the server. - * - * @param fieldTransforms - The field transforms to apply the result to. - * @param mutableDocument - The current state of the document after applying all - * previous mutations. - * @param serverTransformResults - The transform results received by the server. - * @returns The transform results list. - */ function Tn(t, e, n) { - const s = new Map; - q(t.length === n.length); - for (let i = 0; i < n.length; i++) { - const r = t[i], o = r.transform, a = e.data.field(r.field); - s.set(r.field, Je(o, a, n[i])); - } - return s; -} - -/** - * Creates a list of "transform results" (a transform result is a field value - * representing the result of applying a transform) for use when applying a - * transform locally. - * - * @param fieldTransforms - The field transforms to apply the result to. - * @param localWriteTime - The local time of the mutation (used to - * generate ServerTimestampValues). - * @param mutableDocument - The current state of the document after applying all - * previous mutations. - * @returns The transform results list. - */ function En(t, e, n) { - const s = new Map; - for (const i of t) { - const t = i.transform, r = n.data.field(i.field); - s.set(i.field, He(t, r, e)); - } - return s; -} - -/** A mutation that deletes the document at the given key. */ class An extends fn { - constructor(t, e) { - super(), this.key = t, this.precondition = e, this.type = 2 /* Delete */ , this.fieldTransforms = []; - } -} - -class Rn extends fn { - constructor(t, e) { - super(), this.key = t, this.precondition = e, this.type = 3 /* Verify */ , this.fieldTransforms = []; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ class bn { - // TODO(b/33078163): just use simplest form of existence filter for now - constructor(t) { - this.count = t; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Error Codes describing the different ways GRPC can fail. These are copied - * directly from GRPC's sources here: - * - * https://github.com/grpc/grpc/blob/bceec94ea4fc5f0085d81235d8e1c06798dc341a/include/grpc%2B%2B/impl/codegen/status_code_enum.h - * - * Important! The names of these identifiers matter because the string forms - * are used for reverse lookups from the webchannel stream. Do NOT change the - * names of these identifiers or change this into a const enum. - */ var Pn, Vn; - -/** - * Determines whether an error code represents a permanent error when received - * in response to a non-write operation. - * - * See isPermanentWriteError for classifying write errors. - */ -function vn(t) { - switch (t) { - default: - return L(); - - case G.CANCELLED: - case G.UNKNOWN: - case G.DEADLINE_EXCEEDED: - case G.RESOURCE_EXHAUSTED: - case G.INTERNAL: - case G.UNAVAILABLE: - // Unauthenticated means something went wrong with our token and we need - // to retry with new credentials which will happen automatically. - case G.UNAUTHENTICATED: - return !1; - - case G.INVALID_ARGUMENT: - case G.NOT_FOUND: - case G.ALREADY_EXISTS: - case G.PERMISSION_DENIED: - case G.FAILED_PRECONDITION: - // Aborted might be retried in some scenarios, but that is dependant on - // the context and should handled individually by the calling code. - // See https://cloud.google.com/apis/design/errors. - case G.ABORTED: - case G.OUT_OF_RANGE: - case G.UNIMPLEMENTED: - case G.DATA_LOSS: - return !0; - } -} - -/** - * Determines whether an error code represents a permanent error when received - * in response to a write operation. - * - * Write operations must be handled specially because as of b/119437764, ABORTED - * errors on the write stream should be retried too (even though ABORTED errors - * are not generally retryable). - * - * Note that during the initial handshake on the write stream an ABORTED error - * signals that we should discard our stream token (i.e. it is permanent). This - * means a handshake error should be classified with isPermanentError, above. - */ -/** - * Maps an error Code from GRPC status code number, like 0, 1, or 14. These - * are not the same as HTTP status codes. - * - * @returns The Code equivalent to the given GRPC status code. Fails if there - * is no match. - */ -function Sn(t) { - if (void 0 === t) - // This shouldn't normally happen, but in certain error cases (like trying - // to send invalid proto messages) we may get an error with no GRPC code. - return $("GRPC error has no .code"), G.UNKNOWN; - switch (t) { - case Pn.OK: - return G.OK; - - case Pn.CANCELLED: - return G.CANCELLED; - - case Pn.UNKNOWN: - return G.UNKNOWN; - - case Pn.DEADLINE_EXCEEDED: - return G.DEADLINE_EXCEEDED; - - case Pn.RESOURCE_EXHAUSTED: - return G.RESOURCE_EXHAUSTED; - - case Pn.INTERNAL: - return G.INTERNAL; - - case Pn.UNAVAILABLE: - return G.UNAVAILABLE; - - case Pn.UNAUTHENTICATED: - return G.UNAUTHENTICATED; - - case Pn.INVALID_ARGUMENT: - return G.INVALID_ARGUMENT; - - case Pn.NOT_FOUND: - return G.NOT_FOUND; - - case Pn.ALREADY_EXISTS: - return G.ALREADY_EXISTS; - - case Pn.PERMISSION_DENIED: - return G.PERMISSION_DENIED; - - case Pn.FAILED_PRECONDITION: - return G.FAILED_PRECONDITION; - - case Pn.ABORTED: - return G.ABORTED; - - case Pn.OUT_OF_RANGE: - return G.OUT_OF_RANGE; - - case Pn.UNIMPLEMENTED: - return G.UNIMPLEMENTED; - - case Pn.DATA_LOSS: - return G.DATA_LOSS; - - default: - return L(); - } -} - -/** - * Converts an HTTP response's error status to the equivalent error code. - * - * @param status - An HTTP error response status ("FAILED_PRECONDITION", - * "UNKNOWN", etc.) - * @returns The equivalent Code. Non-matching responses are mapped to - * Code.UNKNOWN. - */ (Vn = Pn || (Pn = {}))[Vn.OK = 0] = "OK", Vn[Vn.CANCELLED = 1] = "CANCELLED", -Vn[Vn.UNKNOWN = 2] = "UNKNOWN", Vn[Vn.INVALID_ARGUMENT = 3] = "INVALID_ARGUMENT", -Vn[Vn.DEADLINE_EXCEEDED = 4] = "DEADLINE_EXCEEDED", Vn[Vn.NOT_FOUND = 5] = "NOT_FOUND", -Vn[Vn.ALREADY_EXISTS = 6] = "ALREADY_EXISTS", Vn[Vn.PERMISSION_DENIED = 7] = "PERMISSION_DENIED", -Vn[Vn.UNAUTHENTICATED = 16] = "UNAUTHENTICATED", Vn[Vn.RESOURCE_EXHAUSTED = 8] = "RESOURCE_EXHAUSTED", -Vn[Vn.FAILED_PRECONDITION = 9] = "FAILED_PRECONDITION", Vn[Vn.ABORTED = 10] = "ABORTED", -Vn[Vn.OUT_OF_RANGE = 11] = "OUT_OF_RANGE", Vn[Vn.UNIMPLEMENTED = 12] = "UNIMPLEMENTED", -Vn[Vn.INTERNAL = 13] = "INTERNAL", Vn[Vn.UNAVAILABLE = 14] = "UNAVAILABLE", Vn[Vn.DATA_LOSS = 15] = "DATA_LOSS"; - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A map implementation that uses objects as keys. Objects must have an - * associated equals function and must be immutable. Entries in the map are - * stored together with the key being produced from the mapKeyFn. This map - * automatically handles collisions of keys. - */ -class Dn { - constructor(t, e) { - this.mapKeyFn = t, this.equalsFn = e, - /** - * The inner map for a key/value pair. Due to the possibility of collisions we - * keep a list of entries that we do a linear search through to find an actual - * match. Note that collisions should be rare, so we still expect near - * constant time lookups in practice. - */ - this.inner = {}, - /** The number of entries stored in the map */ - this.innerSize = 0; - } - /** Get a value for this key, or undefined if it does not exist. */ get(t) { - const e = this.mapKeyFn(t), n = this.inner[e]; - if (void 0 !== n) for (const [e, s] of n) if (this.equalsFn(e, t)) return s; - } - has(t) { - return void 0 !== this.get(t); - } - /** Put this key and value in the map. */ set(t, e) { - const n = this.mapKeyFn(t), s = this.inner[n]; - if (void 0 === s) return this.inner[n] = [ [ t, e ] ], void this.innerSize++; - for (let n = 0; n < s.length; n++) if (this.equalsFn(s[n][0], t)) - // This is updating an existing entry and does not increase `innerSize`. - return void (s[n] = [ t, e ]); - s.push([ t, e ]), this.innerSize++; - } - /** - * Remove this key from the map. Returns a boolean if anything was deleted. - */ delete(t) { - const e = this.mapKeyFn(t), n = this.inner[e]; - if (void 0 === n) return !1; - for (let s = 0; s < n.length; s++) if (this.equalsFn(n[s][0], t)) return 1 === n.length ? delete this.inner[e] : n.splice(s, 1), - this.innerSize--, !0; - return !1; - } - forEach(t) { - lt(this.inner, ((e, n) => { - for (const [e, s] of n) t(e, s); - })); - } - isEmpty() { - return ft(this.inner); - } - size() { - return this.innerSize; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -// An immutable sorted map implementation, based on a Left-leaning Red-Black -// tree. -class Cn { - constructor(t, e) { - this.comparator = t, this.root = e || Nn.EMPTY; - } - // Returns a copy of the map, with the specified key/value added or replaced. - insert(t, e) { - return new Cn(this.comparator, this.root.insert(t, e, this.comparator).copy(null, null, Nn.BLACK, null, null)); - } - // Returns a copy of the map, with the specified key removed. - remove(t) { - return new Cn(this.comparator, this.root.remove(t, this.comparator).copy(null, null, Nn.BLACK, null, null)); - } - // Returns the value of the node with the given key, or null. - get(t) { - let e = this.root; - for (;!e.isEmpty(); ) { - const n = this.comparator(t, e.key); - if (0 === n) return e.value; - n < 0 ? e = e.left : n > 0 && (e = e.right); - } - return null; - } - // Returns the index of the element in this sorted map, or -1 if it doesn't - // exist. - indexOf(t) { - // Number of nodes that were pruned when descending right - let e = 0, n = this.root; - for (;!n.isEmpty(); ) { - const s = this.comparator(t, n.key); - if (0 === s) return e + n.left.size; - s < 0 ? n = n.left : ( - // Count all nodes left of the node plus the node itself - e += n.left.size + 1, n = n.right); - } - // Node not found - return -1; - } - isEmpty() { - return this.root.isEmpty(); - } - // Returns the total number of nodes in the map. - get size() { - return this.root.size; - } - // Returns the minimum key in the map. - minKey() { - return this.root.minKey(); - } - // Returns the maximum key in the map. - maxKey() { - return this.root.maxKey(); - } - // Traverses the map in key order and calls the specified action function - // for each key/value pair. If action returns true, traversal is aborted. - // Returns the first truthy value returned by action, or the last falsey - // value returned by action. - inorderTraversal(t) { - return this.root.inorderTraversal(t); - } - forEach(t) { - this.inorderTraversal(((e, n) => (t(e, n), !1))); - } - toString() { - const t = []; - return this.inorderTraversal(((e, n) => (t.push(`${e}:${n}`), !1))), `{${t.join(", ")}}`; - } - // Traverses the map in reverse key order and calls the specified action - // function for each key/value pair. If action returns true, traversal is - // aborted. - // Returns the first truthy value returned by action, or the last falsey - // value returned by action. - reverseTraversal(t) { - return this.root.reverseTraversal(t); - } - // Returns an iterator over the SortedMap. - getIterator() { - return new xn(this.root, null, this.comparator, !1); - } - getIteratorFrom(t) { - return new xn(this.root, t, this.comparator, !1); - } - getReverseIterator() { - return new xn(this.root, null, this.comparator, !0); - } - getReverseIteratorFrom(t) { - return new xn(this.root, t, this.comparator, !0); - } -} - - // end SortedMap -// An iterator over an LLRBNode. -class xn { - constructor(t, e, n, s) { - this.isReverse = s, this.nodeStack = []; - let i = 1; - for (;!t.isEmpty(); ) if (i = e ? n(t.key, e) : 1, - // flip the comparison if we're going in reverse - e && s && (i *= -1), i < 0) - // This node is less than our start key. ignore it - t = this.isReverse ? t.left : t.right; else { - if (0 === i) { - // This node is exactly equal to our start key. Push it on the stack, - // but stop iterating; - this.nodeStack.push(t); - break; - } - // This node is greater than our start key, add it to the stack and move - // to the next one - this.nodeStack.push(t), t = this.isReverse ? t.right : t.left; - } - } - getNext() { - let t = this.nodeStack.pop(); - const e = { - key: t.key, - value: t.value - }; - if (this.isReverse) for (t = t.left; !t.isEmpty(); ) this.nodeStack.push(t), t = t.right; else for (t = t.right; !t.isEmpty(); ) this.nodeStack.push(t), - t = t.left; - return e; - } - hasNext() { - return this.nodeStack.length > 0; - } - peek() { - if (0 === this.nodeStack.length) return null; - const t = this.nodeStack[this.nodeStack.length - 1]; - return { - key: t.key, - value: t.value - }; - } -} - - // end SortedMapIterator -// Represents a node in a Left-leaning Red-Black tree. -class Nn { - constructor(t, e, n, s, i) { - this.key = t, this.value = e, this.color = null != n ? n : Nn.RED, this.left = null != s ? s : Nn.EMPTY, - this.right = null != i ? i : Nn.EMPTY, this.size = this.left.size + 1 + this.right.size; - } - // Returns a copy of the current node, optionally replacing pieces of it. - copy(t, e, n, s, i) { - return new Nn(null != t ? t : this.key, null != e ? e : this.value, null != n ? n : this.color, null != s ? s : this.left, null != i ? i : this.right); - } - isEmpty() { - return !1; - } - // Traverses the tree in key order and calls the specified action function - // for each node. If action returns true, traversal is aborted. - // Returns the first truthy value returned by action, or the last falsey - // value returned by action. - inorderTraversal(t) { - return this.left.inorderTraversal(t) || t(this.key, this.value) || this.right.inorderTraversal(t); - } - // Traverses the tree in reverse key order and calls the specified action - // function for each node. If action returns true, traversal is aborted. - // Returns the first truthy value returned by action, or the last falsey - // value returned by action. - reverseTraversal(t) { - return this.right.reverseTraversal(t) || t(this.key, this.value) || this.left.reverseTraversal(t); - } - // Returns the minimum node in the tree. - min() { - return this.left.isEmpty() ? this : this.left.min(); - } - // Returns the maximum key in the tree. - minKey() { - return this.min().key; - } - // Returns the maximum key in the tree. - maxKey() { - return this.right.isEmpty() ? this.key : this.right.maxKey(); - } - // Returns new tree, with the key/value added. - insert(t, e, n) { - let s = this; - const i = n(t, s.key); - return s = i < 0 ? s.copy(null, null, null, s.left.insert(t, e, n), null) : 0 === i ? s.copy(null, e, null, null, null) : s.copy(null, null, null, null, s.right.insert(t, e, n)), - s.fixUp(); - } - removeMin() { - if (this.left.isEmpty()) return Nn.EMPTY; - let t = this; - return t.left.isRed() || t.left.left.isRed() || (t = t.moveRedLeft()), t = t.copy(null, null, null, t.left.removeMin(), null), - t.fixUp(); - } - // Returns new tree, with the specified item removed. - remove(t, e) { - let n, s = this; - if (e(t, s.key) < 0) s.left.isEmpty() || s.left.isRed() || s.left.left.isRed() || (s = s.moveRedLeft()), - s = s.copy(null, null, null, s.left.remove(t, e), null); else { - if (s.left.isRed() && (s = s.rotateRight()), s.right.isEmpty() || s.right.isRed() || s.right.left.isRed() || (s = s.moveRedRight()), - 0 === e(t, s.key)) { - if (s.right.isEmpty()) return Nn.EMPTY; - n = s.right.min(), s = s.copy(n.key, n.value, null, null, s.right.removeMin()); - } - s = s.copy(null, null, null, null, s.right.remove(t, e)); - } - return s.fixUp(); - } - isRed() { - return this.color; - } - // Returns new tree after performing any needed rotations. - fixUp() { - let t = this; - return t.right.isRed() && !t.left.isRed() && (t = t.rotateLeft()), t.left.isRed() && t.left.left.isRed() && (t = t.rotateRight()), - t.left.isRed() && t.right.isRed() && (t = t.colorFlip()), t; - } - moveRedLeft() { - let t = this.colorFlip(); - return t.right.left.isRed() && (t = t.copy(null, null, null, null, t.right.rotateRight()), - t = t.rotateLeft(), t = t.colorFlip()), t; - } - moveRedRight() { - let t = this.colorFlip(); - return t.left.left.isRed() && (t = t.rotateRight(), t = t.colorFlip()), t; - } - rotateLeft() { - const t = this.copy(null, null, Nn.RED, null, this.right.left); - return this.right.copy(null, null, this.color, t, null); - } - rotateRight() { - const t = this.copy(null, null, Nn.RED, this.left.right, null); - return this.left.copy(null, null, this.color, null, t); - } - colorFlip() { - const t = this.left.copy(null, null, !this.left.color, null, null), e = this.right.copy(null, null, !this.right.color, null, null); - return this.copy(null, null, !this.color, t, e); - } - // For testing. - checkMaxDepth() { - const t = this.check(); - return Math.pow(2, t) <= this.size + 1; - } - // In a balanced RB tree, the black-depth (number of black nodes) from root to - // leaves is equal on both sides. This function verifies that or asserts. - check() { - if (this.isRed() && this.left.isRed()) throw L(); - if (this.right.isRed()) throw L(); - const t = this.left.check(); - if (t !== this.right.check()) throw L(); - return t + (this.isRed() ? 0 : 1); - } -} - - // end LLRBNode -// Empty node is shared between all LLRB trees. -// eslint-disable-next-line @typescript-eslint/no-explicit-any -Nn.EMPTY = null, Nn.RED = !0, Nn.BLACK = !1; - -// end LLRBEmptyNode -Nn.EMPTY = new -// Represents an empty node (a leaf node in the Red-Black Tree). -class { - constructor() { - this.size = 0; - } - get key() { - throw L(); - } - get value() { - throw L(); - } - get color() { - throw L(); - } - get left() { - throw L(); - } - get right() { - throw L(); - } - // Returns a copy of the current node. - copy(t, e, n, s, i) { - return this; - } - // Returns a copy of the tree, with the specified key/value added. - insert(t, e, n) { - return new Nn(t, e); - } - // Returns a copy of the tree, with the specified key removed. - remove(t, e) { - return this; - } - isEmpty() { - return !0; - } - inorderTraversal(t) { - return !1; - } - reverseTraversal(t) { - return !1; - } - minKey() { - return null; - } - maxKey() { - return null; - } - isRed() { - return !1; - } - // For testing. - checkMaxDepth() { - return !0; - } - check() { - return 0; - } -}; - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * SortedSet is an immutable (copy-on-write) collection that holds elements - * in order specified by the provided comparator. - * - * NOTE: if provided comparator returns 0 for two elements, we consider them to - * be equal! - */ -class kn { - constructor(t) { - this.comparator = t, this.data = new Cn(this.comparator); - } - has(t) { - return null !== this.data.get(t); - } - first() { - return this.data.minKey(); - } - last() { - return this.data.maxKey(); - } - get size() { - return this.data.size; - } - indexOf(t) { - return this.data.indexOf(t); - } - /** Iterates elements in order defined by "comparator" */ forEach(t) { - this.data.inorderTraversal(((e, n) => (t(e), !1))); - } - /** Iterates over `elem`s such that: range[0] <= elem < range[1]. */ forEachInRange(t, e) { - const n = this.data.getIteratorFrom(t[0]); - for (;n.hasNext(); ) { - const s = n.getNext(); - if (this.comparator(s.key, t[1]) >= 0) return; - e(s.key); - } - } - /** - * Iterates over `elem`s such that: start <= elem until false is returned. - */ forEachWhile(t, e) { - let n; - for (n = void 0 !== e ? this.data.getIteratorFrom(e) : this.data.getIterator(); n.hasNext(); ) { - if (!t(n.getNext().key)) return; - } - } - /** Finds the least element greater than or equal to `elem`. */ firstAfterOrEqual(t) { - const e = this.data.getIteratorFrom(t); - return e.hasNext() ? e.getNext().key : null; - } - getIterator() { - return new Mn(this.data.getIterator()); - } - getIteratorFrom(t) { - return new Mn(this.data.getIteratorFrom(t)); - } - /** Inserts or updates an element */ add(t) { - return this.copy(this.data.remove(t).insert(t, !0)); - } - /** Deletes an element */ delete(t) { - return this.has(t) ? this.copy(this.data.remove(t)) : this; - } - isEmpty() { - return this.data.isEmpty(); - } - unionWith(t) { - let e = this; - // Make sure `result` always refers to the larger one of the two sets. - return e.size < t.size && (e = t, t = this), t.forEach((t => { - e = e.add(t); - })), e; - } - isEqual(t) { - if (!(t instanceof kn)) return !1; - if (this.size !== t.size) return !1; - const e = this.data.getIterator(), n = t.data.getIterator(); - for (;e.hasNext(); ) { - const t = e.getNext().key, s = n.getNext().key; - if (0 !== this.comparator(t, s)) return !1; - } - return !0; - } - toArray() { - const t = []; - return this.forEach((e => { - t.push(e); - })), t; - } - toString() { - const t = []; - return this.forEach((e => t.push(e))), "SortedSet(" + t.toString() + ")"; - } - copy(t) { - const e = new kn(this.comparator); - return e.data = t, e; - } -} - -class Mn { - constructor(t) { - this.iter = t; - } - getNext() { - return this.iter.getNext().key; - } - hasNext() { - return this.iter.hasNext(); - } -} - -/** - * Compares two sorted sets for equality using their natural ordering. The - * method computes the intersection and invokes `onAdd` for every element that - * is in `after` but not `before`. `onRemove` is invoked for every element in - * `before` but missing from `after`. - * - * The method creates a copy of both `before` and `after` and runs in O(n log - * n), where n is the size of the two lists. - * - * @param before - The elements that exist in the original set. - * @param after - The elements to diff against the original set. - * @param comparator - The comparator for the elements in before and after. - * @param onAdd - A function to invoke for every element that is part of ` - * after` but not `before`. - * @param onRemove - A function to invoke for every element that is part of - * `before` but not `after`. - */ -/** - * Returns the next element from the iterator or `undefined` if none available. - */ -function On(t) { - return t.hasNext() ? t.getNext() : void 0; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ const $n = new Cn(xt.comparator); - -function Fn() { - return $n; -} - -const Bn = new Cn(xt.comparator); - -function Ln() { - return Bn; -} - -function qn() { - return new Dn((t => t.toString()), ((t, e) => t.isEqual(e))); -} - -const Un = new Cn(xt.comparator); - -const Kn = new kn(xt.comparator); - -function Gn(...t) { - let e = Kn; - for (const n of t) e = e.add(n); - return e; -} - -const Qn = new kn(rt); - -function jn() { - return Qn; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * An event from the RemoteStore. It is split into targetChanges (changes to the - * state or the set of documents in our watched targets) and documentUpdates - * (changes to the actual documents). - */ class Wn { - constructor( - /** - * The snapshot version this event brings us up to, or MIN if not set. - */ - t, - /** - * A map from target to changes to the target. See TargetChange. - */ - e, - /** - * A set of targets that is known to be inconsistent. Listens for these - * targets should be re-established without resume tokens. - */ - n, - /** - * A set of which documents have changed or been deleted, along with the - * doc's new values (if not deleted). - */ - s, - /** - * A set of which document updates are due only to limbo resolution targets. - */ - i) { - this.snapshotVersion = t, this.targetChanges = e, this.targetMismatches = n, this.documentUpdates = s, - this.resolvedLimboDocuments = i; - } - /** - * HACK: Views require RemoteEvents in order to determine whether the view is - * CURRENT, but secondary tabs don't receive remote events. So this method is - * used to create a synthesized RemoteEvent that can be used to apply a - * CURRENT status change to a View, for queries executed in a different tab. - */ - // PORTING NOTE: Multi-tab only - static createSynthesizedRemoteEventForCurrentChange(t, e) { - const n = new Map; - return n.set(t, zn.createSynthesizedTargetChangeForCurrentChange(t, e)), new Wn(ct.min(), n, jn(), Fn(), Gn()); - } -} - -/** - * A TargetChange specifies the set of changes for a specific target as part of - * a RemoteEvent. These changes track which documents are added, modified or - * removed, as well as the target's resume token and whether the target is - * marked CURRENT. - * The actual changes *to* documents are not part of the TargetChange since - * documents may be part of multiple targets. - */ class zn { - constructor( - /** - * An opaque, server-assigned token that allows watching a query to be resumed - * after disconnecting without retransmitting all the data that matches the - * query. The resume token essentially identifies a point in time from which - * the server should resume sending results. - */ - t, - /** - * The "current" (synced) status of this target. Note that "current" - * has special meaning in the RPC protocol that implies that a target is - * both up-to-date and consistent with the rest of the watch stream. - */ - e, - /** - * The set of documents that were newly assigned to this target as part of - * this remote event. - */ - n, - /** - * The set of documents that were already assigned to this target but received - * an update during this remote event. - */ - s, - /** - * The set of documents that were removed from this target as part of this - * remote event. - */ - i) { - this.resumeToken = t, this.current = e, this.addedDocuments = n, this.modifiedDocuments = s, - this.removedDocuments = i; - } - /** - * This method is used to create a synthesized TargetChanges that can be used to - * apply a CURRENT status change to a View (for queries executed in a different - * tab) or for new queries (to raise snapshots with correct CURRENT status). - */ static createSynthesizedTargetChangeForCurrentChange(t, e) { - return new zn(pt.EMPTY_BYTE_STRING, e, Gn(), Gn(), Gn()); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Represents a changed document and a list of target ids to which this change - * applies. - * - * If document has been deleted NoDocument will be provided. - */ class Hn { - constructor( - /** The new document applies to all of these targets. */ - t, - /** The new document is removed from all of these targets. */ - e, - /** The key of the document for this change. */ - n, - /** - * The new document or NoDocument if it was deleted. Is null if the - * document went out of view without the server sending a new document. - */ - s) { - this.O = t, this.removedTargetIds = e, this.key = n, this.$ = s; - } -} - -class Jn { - constructor(t, e) { - this.targetId = t, this.F = e; - } -} - -class Yn { - constructor( - /** What kind of change occurred to the watch target. */ - t, - /** The target IDs that were added/removed/set. */ - e, - /** - * An opaque, server-assigned token that allows watching a target to be - * resumed after disconnecting without retransmitting all the data that - * matches the target. The resume token essentially identifies a point in - * time from which the server should resume sending results. - */ - n = pt.EMPTY_BYTE_STRING - /** An RPC error indicating why the watch failed. */ , s = null) { - this.state = t, this.targetIds = e, this.resumeToken = n, this.cause = s; - } -} - -/** Tracks the internal state of a Watch target. */ class Xn { - constructor() { - /** - * The number of pending responses (adds or removes) that we are waiting on. - * We only consider targets active that have no pending responses. - */ - this.B = 0, - /** - * Keeps track of the document changes since the last raised snapshot. - * - * These changes are continuously updated as we receive document updates and - * always reflect the current set of changes against the last issued snapshot. - */ - this.L = es(), - /** See public getters for explanations of these fields. */ - this.q = pt.EMPTY_BYTE_STRING, this.U = !1, - /** - * Whether this target state should be included in the next snapshot. We - * initialize to true so that newly-added targets are included in the next - * RemoteEvent. - */ - this.K = !0; - } - /** - * Whether this target has been marked 'current'. - * - * 'Current' has special meaning in the RPC protocol: It implies that the - * Watch backend has sent us all changes up to the point at which the target - * was added and that the target is consistent with the rest of the watch - * stream. - */ get current() { - return this.U; - } - /** The last resume token sent to us for this target. */ get resumeToken() { - return this.q; - } - /** Whether this target has pending target adds or target removes. */ get G() { - return 0 !== this.B; - } - /** Whether we have modified any state that should trigger a snapshot. */ get j() { - return this.K; - } - /** - * Applies the resume token to the TargetChange, but only when it has a new - * value. Empty resumeTokens are discarded. - */ W(t) { - t.approximateByteSize() > 0 && (this.K = !0, this.q = t); - } - /** - * Creates a target change from the current set of changes. - * - * To reset the document changes after raising this snapshot, call - * `clearPendingChanges()`. - */ H() { - let t = Gn(), e = Gn(), n = Gn(); - return this.L.forEach(((s, i) => { - switch (i) { - case 0 /* Added */ : - t = t.add(s); - break; - - case 2 /* Modified */ : - e = e.add(s); - break; - - case 1 /* Removed */ : - n = n.add(s); - break; - - default: - L(); - } - })), new zn(this.q, this.U, t, e, n); - } - /** - * Resets the document changes and sets `hasPendingChanges` to false. - */ J() { - this.K = !1, this.L = es(); - } - Y(t, e) { - this.K = !0, this.L = this.L.insert(t, e); - } - X(t) { - this.K = !0, this.L = this.L.remove(t); - } - Z() { - this.B += 1; - } - tt() { - this.B -= 1; - } - et() { - this.K = !0, this.U = !0; - } -} - -/** - * A helper class to accumulate watch changes into a RemoteEvent. - */ -class Zn { - constructor(t) { - this.nt = t, - /** The internal state of all tracked targets. */ - this.st = new Map, - /** Keeps track of the documents to update since the last raised snapshot. */ - this.it = Fn(), - /** A mapping of document keys to their set of target IDs. */ - this.rt = ts(), - /** - * A list of targets with existence filter mismatches. These targets are - * known to be inconsistent and their listens needs to be re-established by - * RemoteStore. - */ - this.ot = new kn(rt); - } - /** - * Processes and adds the DocumentWatchChange to the current set of changes. - */ at(t) { - for (const e of t.O) t.$ && t.$.isFoundDocument() ? this.ut(e, t.$) : this.ct(e, t.key, t.$); - for (const e of t.removedTargetIds) this.ct(e, t.key, t.$); - } - /** Processes and adds the WatchTargetChange to the current set of changes. */ ht(t) { - this.forEachTarget(t, (e => { - const n = this.lt(e); - switch (t.state) { - case 0 /* NoChange */ : - this.ft(e) && n.W(t.resumeToken); - break; - - case 1 /* Added */ : - // We need to decrement the number of pending acks needed from watch - // for this targetId. - n.tt(), n.G || - // We have a freshly added target, so we need to reset any state - // that we had previously. This can happen e.g. when remove and add - // back a target for existence filter mismatches. - n.J(), n.W(t.resumeToken); - break; - - case 2 /* Removed */ : - // We need to keep track of removed targets to we can post-filter and - // remove any target changes. - // We need to decrement the number of pending acks needed from watch - // for this targetId. - n.tt(), n.G || this.removeTarget(e); - break; - - case 3 /* Current */ : - this.ft(e) && (n.et(), n.W(t.resumeToken)); - break; - - case 4 /* Reset */ : - this.ft(e) && ( - // Reset the target and synthesizes removes for all existing - // documents. The backend will re-add any documents that still - // match the target before it sends the next global snapshot. - this.dt(e), n.W(t.resumeToken)); - break; - - default: - L(); - } - })); - } - /** - * Iterates over all targetIds that the watch change applies to: either the - * targetIds explicitly listed in the change or the targetIds of all currently - * active targets. - */ forEachTarget(t, e) { - t.targetIds.length > 0 ? t.targetIds.forEach(e) : this.st.forEach(((t, n) => { - this.ft(n) && e(n); - })); - } - /** - * Handles existence filters and synthesizes deletes for filter mismatches. - * Targets that are invalidated by filter mismatches are added to - * `pendingTargetResets`. - */ _t(t) { - const e = t.targetId, n = t.F.count, s = this.wt(e); - if (s) { - const t = s.target; - if (fe(t)) if (0 === n) { - // The existence filter told us the document does not exist. We deduce - // that this document does not exist and apply a deleted document to - // our updates. Without applying this deleted document there might be - // another query that will raise this document as part of a snapshot - // until it is resolved, essentially exposing inconsistency between - // queries. - const n = new xt(t.path); - this.ct(e, n, te.newNoDocument(n, ct.min())); - } else q(1 === n); else { - this.gt(e) !== n && ( - // Existence filter mismatch: We reset the mapping and raise a new - // snapshot with `isFromCache:true`. - this.dt(e), this.ot = this.ot.add(e)); - } - } - } - /** - * Converts the currently accumulated state into a remote event at the - * provided snapshot version. Resets the accumulated changes before returning. - */ yt(t) { - const e = new Map; - this.st.forEach(((n, s) => { - const i = this.wt(s); - if (i) { - if (n.current && fe(i.target)) { - // Document queries for document that don't exist can produce an empty - // result set. To update our local cache, we synthesize a document - // delete if we have not previously received the document. This - // resolves the limbo state of the document, removing it from - // limboDocumentRefs. - // TODO(dimond): Ideally we would have an explicit lookup target - // instead resulting in an explicit delete message and we could - // remove this special logic. - const e = new xt(i.target.path); - null !== this.it.get(e) || this.It(s, e) || this.ct(s, e, te.newNoDocument(e, t)); - } - n.j && (e.set(s, n.H()), n.J()); - } - })); - let n = Gn(); - // We extract the set of limbo-only document updates as the GC logic - // special-cases documents that do not appear in the target cache. - - // TODO(gsoltis): Expand on this comment once GC is available in the JS - // client. - this.rt.forEach(((t, e) => { - let s = !0; - e.forEachWhile((t => { - const e = this.wt(t); - return !e || 2 /* LimboResolution */ === e.purpose || (s = !1, !1); - })), s && (n = n.add(t)); - })), this.it.forEach(((e, n) => n.setReadTime(t))); - const s = new Wn(t, e, this.ot, this.it, n); - return this.it = Fn(), this.rt = ts(), this.ot = new kn(rt), s; - } - /** - * Adds the provided document to the internal list of document updates and - * its document key to the given target's mapping. - */ - // Visible for testing. - ut(t, e) { - if (!this.ft(t)) return; - const n = this.It(t, e.key) ? 2 /* Modified */ : 0 /* Added */; - this.lt(t).Y(e.key, n), this.it = this.it.insert(e.key, e), this.rt = this.rt.insert(e.key, this.Tt(e.key).add(t)); - } - /** - * Removes the provided document from the target mapping. If the - * document no longer matches the target, but the document's state is still - * known (e.g. we know that the document was deleted or we received the change - * that caused the filter mismatch), the new document can be provided - * to update the remote document cache. - */ - // Visible for testing. - ct(t, e, n) { - if (!this.ft(t)) return; - const s = this.lt(t); - this.It(t, e) ? s.Y(e, 1 /* Removed */) : - // The document may have entered and left the target before we raised a - // snapshot, so we can just ignore the change. - s.X(e), this.rt = this.rt.insert(e, this.Tt(e).delete(t)), n && (this.it = this.it.insert(e, n)); - } - removeTarget(t) { - this.st.delete(t); - } - /** - * Returns the current count of documents in the target. This includes both - * the number of documents that the LocalStore considers to be part of the - * target as well as any accumulated changes. - */ gt(t) { - const e = this.lt(t).H(); - return this.nt.getRemoteKeysForTarget(t).size + e.addedDocuments.size - e.removedDocuments.size; - } - /** - * Increment the number of acks needed from watch before we can consider the - * server to be 'in-sync' with the client's active targets. - */ Z(t) { - this.lt(t).Z(); - } - lt(t) { - let e = this.st.get(t); - return e || (e = new Xn, this.st.set(t, e)), e; - } - Tt(t) { - let e = this.rt.get(t); - return e || (e = new kn(rt), this.rt = this.rt.insert(t, e)), e; - } - /** - * Verifies that the user is still interested in this target (by calling - * `getTargetDataForTarget()`) and that we are not waiting for pending ADDs - * from watch. - */ ft(t) { - const e = null !== this.wt(t); - return e || O("WatchChangeAggregator", "Detected inactive target", t), e; - } - /** - * Returns the TargetData for an active target (i.e. a target that the user - * is still interested in that has no outstanding target change requests). - */ wt(t) { - const e = this.st.get(t); - return e && e.G ? null : this.nt.Et(t); - } - /** - * Resets the state of a Watch target to its initial state (e.g. sets - * 'current' to false, clears the resume token and removes its target mapping - * from all documents). - */ dt(t) { - this.st.set(t, new Xn); - this.nt.getRemoteKeysForTarget(t).forEach((e => { - this.ct(t, e, /*updatedDocument=*/ null); - })); - } - /** - * Returns whether the LocalStore considers the document to be part of the - * specified target. - */ It(t, e) { - return this.nt.getRemoteKeysForTarget(t).has(e); - } -} - -function ts() { - return new Cn(xt.comparator); -} - -function es() { - return new Cn(xt.comparator); -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ const ns = (() => { - const t = { - asc: "ASCENDING", - desc: "DESCENDING" - }; - return t; -})(), ss = (() => { - const t = { - "<": "LESS_THAN", - "<=": "LESS_THAN_OR_EQUAL", - ">": "GREATER_THAN", - ">=": "GREATER_THAN_OR_EQUAL", - "==": "EQUAL", - "!=": "NOT_EQUAL", - "array-contains": "ARRAY_CONTAINS", - in: "IN", - "not-in": "NOT_IN", - "array-contains-any": "ARRAY_CONTAINS_ANY" - }; - return t; -})(); - -/** - * This class generates JsonObject values for the Datastore API suitable for - * sending to either GRPC stub methods or via the JSON/HTTP REST API. - * - * The serializer supports both Protobuf.js and Proto3 JSON formats. By - * setting `useProto3Json` to true, the serializer will use the Proto3 JSON - * format. - * - * For a description of the Proto3 JSON format check - * https://developers.google.com/protocol-buffers/docs/proto3#json - * - * TODO(klimt): We can remove the databaseId argument if we keep the full - * resource name in documents. - */ -class is { - constructor(t, e) { - this.databaseId = t, this.N = e; - } -} - -/** - * Returns a value for a Date that's appropriate to put into a proto. - */ -function rs(t, e) { - if (t.N) { - return `${new Date(1e3 * e.seconds).toISOString().replace(/\.\d*/, "").replace("Z", "")}.${("000000000" + e.nanoseconds).slice(-9)}Z`; - } - return { - seconds: "" + e.seconds, - nanos: e.nanoseconds - }; -} - -/** - * Returns a value for bytes that's appropriate to put in a proto. - * - * Visible for testing. - */ -function os(t, e) { - return t.N ? e.toBase64() : e.toUint8Array(); -} - -/** - * Returns a ByteString based on the proto string value. - */ function as(t, e) { - return rs(t, e.toTimestamp()); -} - -function us(t) { - return q(!!t), ct.fromTimestamp(function(t) { - const e = Tt(t); - return new ut(e.seconds, e.nanos); - }(t)); -} - -function cs(t, e) { - return function(t) { - return new _t([ "projects", t.projectId, "databases", t.database ]); - }(t).child("documents").child(e).canonicalString(); -} - -function hs(t) { - const e = _t.fromString(t); - return q(Os(e)), e; -} - -function ls(t, e) { - return cs(t.databaseId, e.path); -} - -function fs(t, e) { - const n = hs(e); - if (n.get(1) !== t.databaseId.projectId) throw new Q(G.INVALID_ARGUMENT, "Tried to deserialize key from different project: " + n.get(1) + " vs " + t.databaseId.projectId); - if (n.get(3) !== t.databaseId.database) throw new Q(G.INVALID_ARGUMENT, "Tried to deserialize key from different database: " + n.get(3) + " vs " + t.databaseId.database); - return new xt(ms(n)); -} - -function ds(t, e) { - return cs(t.databaseId, e); -} - -function _s(t) { - const e = hs(t); - // In v1beta1 queries for collections at the root did not have a trailing - // "/documents". In v1 all resource paths contain "/documents". Preserve the - // ability to read the v1beta1 form for compatibility with queries persisted - // in the local target cache. - return 4 === e.length ? _t.emptyPath() : ms(e); -} - -function ws(t) { - return new _t([ "projects", t.databaseId.projectId, "databases", t.databaseId.database ]).canonicalString(); -} - -function ms(t) { - return q(t.length > 4 && "documents" === t.get(4)), t.popFirst(5); -} - -/** Creates a Document proto from key and fields (but no create/update time) */ function gs(t, e, n) { - return { - name: ls(t, e), - fields: n.value.mapValue.fields - }; -} - -function ys(t, e, n) { - const s = fs(t, e.name), i = us(e.updateTime), r = new Xt({ - mapValue: { - fields: e.fields - } - }), o = te.newFoundDocument(s, i, r); - return n && o.setHasCommittedMutations(), n ? o.setHasCommittedMutations() : o; -} - -function ps(t, e) { - return "found" in e ? function(t, e) { - q(!!e.found), e.found.name, e.found.updateTime; - const n = fs(t, e.found.name), s = us(e.found.updateTime), i = new Xt({ - mapValue: { - fields: e.found.fields - } - }); - return te.newFoundDocument(n, s, i); - }(t, e) : "missing" in e ? function(t, e) { - q(!!e.missing), q(!!e.readTime); - const n = fs(t, e.missing), s = us(e.readTime); - return te.newNoDocument(n, s); - }(t, e) : L(); -} - -function Is(t, e) { - let n; - if ("targetChange" in e) { - e.targetChange; - // proto3 default value is unset in JSON (undefined), so use 'NO_CHANGE' - // if unset - const s = function(t) { - return "NO_CHANGE" === t ? 0 /* NoChange */ : "ADD" === t ? 1 /* Added */ : "REMOVE" === t ? 2 /* Removed */ : "CURRENT" === t ? 3 /* Current */ : "RESET" === t ? 4 /* Reset */ : L(); - }(e.targetChange.targetChangeType || "NO_CHANGE"), i = e.targetChange.targetIds || [], r = function(t, e) { - return t.N ? (q(void 0 === e || "string" == typeof e), pt.fromBase64String(e || "")) : (q(void 0 === e || e instanceof Uint8Array), - pt.fromUint8Array(e || new Uint8Array)); - }(t, e.targetChange.resumeToken), o = e.targetChange.cause, a = o && function(t) { - const e = void 0 === t.code ? G.UNKNOWN : Sn(t.code); - return new Q(e, t.message || ""); - } - /** - * Returns a value for a number (or null) that's appropriate to put into - * a google.protobuf.Int32Value proto. - * DO NOT USE THIS FOR ANYTHING ELSE. - * This method cheats. It's typed as returning "number" because that's what - * our generated proto interfaces say Int32Value must be. But GRPC actually - * expects a { value: } struct. - */ (o); - n = new Yn(s, i, r, a || null); - } else if ("documentChange" in e) { - e.documentChange; - const s = e.documentChange; - s.document, s.document.name, s.document.updateTime; - const i = fs(t, s.document.name), r = us(s.document.updateTime), o = new Xt({ - mapValue: { - fields: s.document.fields - } - }), a = te.newFoundDocument(i, r, o), u = s.targetIds || [], c = s.removedTargetIds || []; - n = new Hn(u, c, a.key, a); - } else if ("documentDelete" in e) { - e.documentDelete; - const s = e.documentDelete; - s.document; - const i = fs(t, s.document), r = s.readTime ? us(s.readTime) : ct.min(), o = te.newNoDocument(i, r), a = s.removedTargetIds || []; - n = new Hn([], a, o.key, o); - } else if ("documentRemove" in e) { - e.documentRemove; - const s = e.documentRemove; - s.document; - const i = fs(t, s.document), r = s.removedTargetIds || []; - n = new Hn([], r, i, null); - } else { - if (!("filter" in e)) return L(); - { - e.filter; - const t = e.filter; - t.targetId; - const s = t.count || 0, i = new bn(s), r = t.targetId; - n = new Jn(r, i); - } - } - return n; -} - -function Ts(t, e) { - let n; - if (e instanceof yn) n = { - update: gs(t, e.key, e.value) - }; else if (e instanceof An) n = { - delete: ls(t, e.key) - }; else if (e instanceof pn) n = { - update: gs(t, e.key, e.data), - updateMask: Ms(e.fieldMask) - }; else { - if (!(e instanceof Rn)) return L(); - n = { - verify: ls(t, e.key) - }; - } - return e.fieldTransforms.length > 0 && (n.updateTransforms = e.fieldTransforms.map((t => function(t, e) { - const n = e.transform; - if (n instanceof Xe) return { - fieldPath: e.field.canonicalString(), - setToServerValue: "REQUEST_TIME" - }; - if (n instanceof Ze) return { - fieldPath: e.field.canonicalString(), - appendMissingElements: { - values: n.elements - } - }; - if (n instanceof en) return { - fieldPath: e.field.canonicalString(), - removeAllFromArray: { - values: n.elements - } - }; - if (n instanceof sn) return { - fieldPath: e.field.canonicalString(), - increment: n.k - }; - throw L(); - }(0, t)))), e.precondition.isNone || (n.currentDocument = function(t, e) { - return void 0 !== e.updateTime ? { - updateTime: as(t, e.updateTime) - } : void 0 !== e.exists ? { - exists: e.exists - } : L(); - }(t, e.precondition)), n; -} - -function Es(t, e) { - const n = e.currentDocument ? function(t) { - return void 0 !== t.updateTime ? hn.updateTime(us(t.updateTime)) : void 0 !== t.exists ? hn.exists(t.exists) : hn.none(); - }(e.currentDocument) : hn.none(), s = e.updateTransforms ? e.updateTransforms.map((e => function(t, e) { - let n = null; - if ("setToServerValue" in e) q("REQUEST_TIME" === e.setToServerValue), n = new Xe; else if ("appendMissingElements" in e) { - const t = e.appendMissingElements.values || []; - n = new Ze(t); - } else if ("removeAllFromArray" in e) { - const t = e.removeAllFromArray.values || []; - n = new en(t); - } else "increment" in e ? n = new sn(t, e.increment) : L(); - const s = mt.fromServerFormat(e.fieldPath); - return new an(s, n); - }(t, e))) : []; - if (e.update) { - e.update.name; - const i = fs(t, e.update.name), r = new Xt({ - mapValue: { - fields: e.update.fields - } - }); - if (e.updateMask) { - const t = function(t) { - const e = t.fieldPaths || []; - return new gt(e.map((t => mt.fromServerFormat(t)))); - }(e.updateMask); - return new pn(i, r, t, n, s); - } - return new yn(i, r, n, s); - } - if (e.delete) { - const s = fs(t, e.delete); - return new An(s, n); - } - if (e.verify) { - const s = fs(t, e.verify); - return new Rn(s, n); - } - return L(); -} - -function As(t, e) { - return t && t.length > 0 ? (q(void 0 !== e), t.map((t => function(t, e) { - // NOTE: Deletes don't have an updateTime. - let n = t.updateTime ? us(t.updateTime) : us(e); - return n.isEqual(ct.min()) && ( - // The Firestore Emulator currently returns an update time of 0 for - // deletes of non-existing documents (rather than null). This breaks the - // test "get deleted doc while offline with source=cache" as NoDocuments - // with version 0 are filtered by IndexedDb's RemoteDocumentCache. - // TODO(#2149): Remove this when Emulator is fixed - n = us(e)), new cn(n, t.transformResults || []); - }(t, e)))) : []; -} - -function Rs(t, e) { - return { - documents: [ ds(t, e.path) ] - }; -} - -function bs(t, e) { - // Dissect the path into parent, collectionId, and optional key filter. - const n = { - structuredQuery: {} - }, s = e.path; - null !== e.collectionGroup ? (n.parent = ds(t, s), n.structuredQuery.from = [ { - collectionId: e.collectionGroup, - allDescendants: !0 - } ]) : (n.parent = ds(t, s.popLast()), n.structuredQuery.from = [ { - collectionId: s.lastSegment() - } ]); - const i = function(t) { - if (0 === t.length) return; - const e = t.map((t => - // visible for testing - function(t) { - if ("==" /* EQUAL */ === t.op) { - if (jt(t.value)) return { - unaryFilter: { - field: Cs(t.field), - op: "IS_NAN" - } - }; - if (Qt(t.value)) return { - unaryFilter: { - field: Cs(t.field), - op: "IS_NULL" - } - }; - } else if ("!=" /* NOT_EQUAL */ === t.op) { - if (jt(t.value)) return { - unaryFilter: { - field: Cs(t.field), - op: "IS_NOT_NAN" - } - }; - if (Qt(t.value)) return { - unaryFilter: { - field: Cs(t.field), - op: "IS_NOT_NULL" - } - }; - } - return { - fieldFilter: { - field: Cs(t.field), - op: Ds(t.op), - value: t.value - } - }; - }(t))); - if (1 === e.length) return e[0]; - return { - compositeFilter: { - op: "AND", - filters: e - } - }; - }(e.filters); - i && (n.structuredQuery.where = i); - const r = function(t) { - if (0 === t.length) return; - return t.map((t => - // visible for testing - function(t) { - return { - field: Cs(t.field), - direction: Ss(t.dir) - }; - }(t))); - }(e.orderBy); - r && (n.structuredQuery.orderBy = r); - const o = function(t, e) { - return t.N || St(e) ? e : { - value: e - }; - } - /** - * Returns a number (or null) from a google.protobuf.Int32Value proto. - */ (t, e.limit); - var a; - return null !== o && (n.structuredQuery.limit = o), e.startAt && (n.structuredQuery.startAt = { - before: (a = e.startAt).inclusive, - values: a.position - }), e.endAt && (n.structuredQuery.endAt = function(t) { - return { - before: !t.inclusive, - values: t.position - }; - }(e.endAt)), n; -} - -function Ps(t) { - let e = _s(t.parent); - const n = t.structuredQuery, s = n.from ? n.from.length : 0; - let i = null; - if (s > 0) { - q(1 === s); - const t = n.from[0]; - t.allDescendants ? i = t.collectionId : e = e.child(t.collectionId); - } - let r = []; - n.where && (r = vs(n.where)); - let o = []; - n.orderBy && (o = n.orderBy.map((t => function(t) { - return new Re(xs(t.field), - // visible for testing - function(t) { - switch (t) { - case "ASCENDING": - return "asc" /* ASCENDING */; - - case "DESCENDING": - return "desc" /* DESCENDING */; - - default: - return; - } - } - // visible for testing - (t.direction)); - }(t)))); - let a = null; - n.limit && (a = function(t) { - let e; - return e = "object" == typeof t ? t.value : t, St(e) ? null : e; - }(n.limit)); - let u = null; - n.startAt && (u = function(t) { - const e = !!t.before, n = t.values || []; - return new Ae(n, e); - }(n.startAt)); - let c = null; - return n.endAt && (c = function(t) { - const e = !t.before, n = t.values || []; - return new Ae(n, e); - } - // visible for testing - (n.endAt)), Se(e, i, o, r, a, "F" /* First */ , u, c); -} - -function Vs(t, e) { - const n = function(t, e) { - switch (e) { - case 0 /* Listen */ : - return null; - - case 1 /* ExistenceFilterMismatch */ : - return "existence-filter-mismatch"; - - case 2 /* LimboResolution */ : - return "limbo-document"; - - default: - return L(); - } - }(0, e.purpose); - return null == n ? null : { - "goog-listen-tags": n - }; -} - -function vs(t) { - return t ? void 0 !== t.unaryFilter ? [ ks(t) ] : void 0 !== t.fieldFilter ? [ Ns(t) ] : void 0 !== t.compositeFilter ? t.compositeFilter.filters.map((t => vs(t))).reduce(((t, e) => t.concat(e))) : L() : []; -} - -function Ss(t) { - return ns[t]; -} - -function Ds(t) { - return ss[t]; -} - -function Cs(t) { - return { - fieldPath: t.canonicalString() - }; -} - -function xs(t) { - return mt.fromServerFormat(t.fieldPath); -} - -function Ns(t) { - return _e.create(xs(t.fieldFilter.field), function(t) { - switch (t) { - case "EQUAL": - return "==" /* EQUAL */; - - case "NOT_EQUAL": - return "!=" /* NOT_EQUAL */; - - case "GREATER_THAN": - return ">" /* GREATER_THAN */; - - case "GREATER_THAN_OR_EQUAL": - return ">=" /* GREATER_THAN_OR_EQUAL */; - - case "LESS_THAN": - return "<" /* LESS_THAN */; - - case "LESS_THAN_OR_EQUAL": - return "<=" /* LESS_THAN_OR_EQUAL */; - - case "ARRAY_CONTAINS": - return "array-contains" /* ARRAY_CONTAINS */; - - case "IN": - return "in" /* IN */; - - case "NOT_IN": - return "not-in" /* NOT_IN */; - - case "ARRAY_CONTAINS_ANY": - return "array-contains-any" /* ARRAY_CONTAINS_ANY */; - - default: - return L(); - } - }(t.fieldFilter.op), t.fieldFilter.value); -} - -function ks(t) { - switch (t.unaryFilter.op) { - case "IS_NAN": - const e = xs(t.unaryFilter.field); - return _e.create(e, "==" /* EQUAL */ , { - doubleValue: NaN - }); - - case "IS_NULL": - const n = xs(t.unaryFilter.field); - return _e.create(n, "==" /* EQUAL */ , { - nullValue: "NULL_VALUE" - }); - - case "IS_NOT_NAN": - const s = xs(t.unaryFilter.field); - return _e.create(s, "!=" /* NOT_EQUAL */ , { - doubleValue: NaN - }); - - case "IS_NOT_NULL": - const i = xs(t.unaryFilter.field); - return _e.create(i, "!=" /* NOT_EQUAL */ , { - nullValue: "NULL_VALUE" - }); - - default: - return L(); - } -} - -function Ms(t) { - const e = []; - return t.fields.forEach((t => e.push(t.canonicalString()))), { - fieldPaths: e - }; -} - -function Os(t) { - // Resource names have at least 4 components (project ID, database ID) - return t.length >= 4 && "projects" === t.get(0) && "databases" === t.get(2); -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Encodes a resource path into a IndexedDb-compatible string form. - */ -function $s(t) { - let e = ""; - for (let n = 0; n < t.length; n++) e.length > 0 && (e = Bs(e)), e = Fs(t.get(n), e); - return Bs(e); -} - -/** Encodes a single segment of a resource path into the given result */ function Fs(t, e) { - let n = e; - const s = t.length; - for (let e = 0; e < s; e++) { - const s = t.charAt(e); - switch (s) { - case "\0": - n += ""; - break; - - case "": - n += ""; - break; - - default: - n += s; - } - } - return n; -} - -/** Encodes a path separator into the given result */ function Bs(t) { - return t + ""; -} - -/** - * Decodes the given IndexedDb-compatible string form of a resource path into - * a ResourcePath instance. Note that this method is not suitable for use with - * decoding resource names from the server; those are One Platform format - * strings. - */ function Ls(t) { - // Event the empty path must encode as a path of at least length 2. A path - // with exactly 2 must be the empty path. - const e = t.length; - if (q(e >= 2), 2 === e) return q("" === t.charAt(0) && "" === t.charAt(1)), _t.emptyPath(); - // Escape characters cannot exist past the second-to-last position in the - // source value. - const n = e - 2, s = []; - let i = ""; - for (let r = 0; r < e; ) { - // The last two characters of a valid encoded path must be a separator, so - // there must be an end to this segment. - const e = t.indexOf("", r); - (e < 0 || e > n) && L(); - switch (t.charAt(e + 1)) { - case "": - const n = t.substring(r, e); - let o; - 0 === i.length ? - // Avoid copying for the common case of a segment that excludes \0 - // and \001 - o = n : (i += n, o = i, i = ""), s.push(o); - break; - - case "": - i += t.substring(r, e), i += "\0"; - break; - - case "": - // The escape character can be used in the output to encode itself. - i += t.substring(r, e + 1); - break; - - default: - L(); - } - r = e + 2; - } - return new _t(s); -} - -/** - * @license - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Name of the IndexedDb object store. - * - * Note that the name 'owner' is chosen to ensure backwards compatibility with - * older clients that only supported single locked access to the persistence - * layer. - */ const qs = [ "userId", "batchId" ]; - -/** - * The key string used for the single object that exists in the - * DbPrimaryClient store. - */ -/** - * Creates a [userId, encodedPath] key for use in the DbDocumentMutations - * index to iterate over all at document mutations for a given path or lower. - */ -function Us(t, e) { - return [ t, $s(e) ]; -} - -/** - * Creates a full index key of [userId, encodedPath, batchId] for inserting - * and deleting into the DbDocumentMutations index. - */ function Ks(t, e, n) { - return [ t, $s(e), n ]; -} - -/** - * Because we store all the useful information for this store in the key, - * there is no useful information to store as the value. The raw (unencoded) - * path cannot be stored because IndexedDb doesn't store prototype - * information. - */ const Gs = {}, Qs = [ "parentPath", "readTime" ], js = [ "canonicalId", "targetId" ], Ws = [ "targetId", "path" ], zs = [ "path", "targetId" ], Hs = [ "collectionId", "parent" ], Js = [ "indexId", "uid" ], Ys = [ "uid", "sequenceNumber" ], Xs = [ "indexId", "uid", "arrayValue", "directionalValue", "documentKey" ], Zs = [ "indexId", "uid", "documentKey" ], ti = [ "userId", "collectionPath", "documentId" ], ei = [ "userId", "collectionPath", "largestBatchId" ], ni = [ "userId", "collectionGroup", "largestBatchId" ], si = [ ...[ ...[ ...[ ...[ "mutationQueues", "mutations", "documentMutations", "remoteDocuments", "targets", "owner", "targetGlobal", "targetDocuments" ], "clientMetadata" ], "remoteDocumentGlobal" ], "collectionParents" ], "bundles", "namedQueries" ], ii = [ ...si, "documentOverlays" ], ri = [ ...ii, "indexConfiguration", "indexState", "indexEntries" ]; - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const oi = "The current tab is not in the required state to perform this operation. It might be necessary to refresh the browser tab."; - -/** - * A base class representing a persistence transaction, encapsulating both the - * transaction's sequence numbers as well as a list of onCommitted listeners. - * - * When you call Persistence.runTransaction(), it will create a transaction and - * pass it to your callback. You then pass it to any method that operates - * on persistence. - */ class ai { - constructor() { - this.onCommittedListeners = []; - } - addOnCommittedListener(t) { - this.onCommittedListeners.push(t); - } - raiseOnCommittedEvent() { - this.onCommittedListeners.forEach((t => t())); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * PersistencePromise is essentially a re-implementation of Promise except - * it has a .next() method instead of .then() and .next() and .catch() callbacks - * are executed synchronously when a PersistencePromise resolves rather than - * asynchronously (Promise implementations use setImmediate() or similar). - * - * This is necessary to interoperate with IndexedDB which will automatically - * commit transactions if control is returned to the event loop without - * synchronously initiating another operation on the transaction. - * - * NOTE: .then() and .catch() only allow a single consumer, unlike normal - * Promises. - */ class ui { - constructor(t) { - // NOTE: next/catchCallback will always point to our own wrapper functions, - // not the user's raw next() or catch() callbacks. - this.nextCallback = null, this.catchCallback = null, - // When the operation resolves, we'll set result or error and mark isDone. - this.result = void 0, this.error = void 0, this.isDone = !1, - // Set to true when .then() or .catch() are called and prevents additional - // chaining. - this.callbackAttached = !1, t((t => { - this.isDone = !0, this.result = t, this.nextCallback && - // value should be defined unless T is Void, but we can't express - // that in the type system. - this.nextCallback(t); - }), (t => { - this.isDone = !0, this.error = t, this.catchCallback && this.catchCallback(t); - })); - } - catch(t) { - return this.next(void 0, t); - } - next(t, e) { - return this.callbackAttached && L(), this.callbackAttached = !0, this.isDone ? this.error ? this.wrapFailure(e, this.error) : this.wrapSuccess(t, this.result) : new ui(((n, s) => { - this.nextCallback = e => { - this.wrapSuccess(t, e).next(n, s); - }, this.catchCallback = t => { - this.wrapFailure(e, t).next(n, s); - }; - })); - } - toPromise() { - return new Promise(((t, e) => { - this.next(t, e); - })); - } - wrapUserFunction(t) { - try { - const e = t(); - return e instanceof ui ? e : ui.resolve(e); - } catch (t) { - return ui.reject(t); - } - } - wrapSuccess(t, e) { - return t ? this.wrapUserFunction((() => t(e))) : ui.resolve(e); - } - wrapFailure(t, e) { - return t ? this.wrapUserFunction((() => t(e))) : ui.reject(e); - } - static resolve(t) { - return new ui(((e, n) => { - e(t); - })); - } - static reject(t) { - return new ui(((e, n) => { - n(t); - })); - } - static waitFor( - // Accept all Promise types in waitFor(). - // eslint-disable-next-line @typescript-eslint/no-explicit-any - t) { - return new ui(((e, n) => { - let s = 0, i = 0, r = !1; - t.forEach((t => { - ++s, t.next((() => { - ++i, r && i === s && e(); - }), (t => n(t))); - })), r = !0, i === s && e(); - })); - } - /** - * Given an array of predicate functions that asynchronously evaluate to a - * boolean, implements a short-circuiting `or` between the results. Predicates - * will be evaluated until one of them returns `true`, then stop. The final - * result will be whether any of them returned `true`. - */ static or(t) { - let e = ui.resolve(!1); - for (const n of t) e = e.next((t => t ? ui.resolve(t) : n())); - return e; - } - static forEach(t, e) { - const n = []; - return t.forEach(((t, s) => { - n.push(e.call(this, t, s)); - })), this.waitFor(n); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -// References to `window` are guarded by SimpleDb.isAvailable() -/* eslint-disable no-restricted-globals */ -/** - * Wraps an IDBTransaction and exposes a store() method to get a handle to a - * specific object store. - */ -class ci { - constructor(t, e) { - this.action = t, this.transaction = e, this.aborted = !1, - /** - * A `Promise` that resolves with the result of the IndexedDb transaction. - */ - this.At = new j, this.transaction.oncomplete = () => { - this.At.resolve(); - }, this.transaction.onabort = () => { - e.error ? this.At.reject(new fi(t, e.error)) : this.At.resolve(); - }, this.transaction.onerror = e => { - const n = gi(e.target.error); - this.At.reject(new fi(t, n)); - }; - } - static open(t, e, n, s) { - try { - return new ci(e, t.transaction(s, n)); - } catch (t) { - throw new fi(e, t); - } - } - get Rt() { - return this.At.promise; - } - abort(t) { - t && this.At.reject(t), this.aborted || (O("SimpleDb", "Aborting transaction:", t ? t.message : "Client-initiated abort"), - this.aborted = !0, this.transaction.abort()); - } - bt() { - // If the browser supports V3 IndexedDB, we invoke commit() explicitly to - // speed up index DB processing if the event loop remains blocks. - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const t = this.transaction; - this.aborted || "function" != typeof t.commit || t.commit(); - } - /** - * Returns a SimpleDbStore for the specified store. All - * operations performed on the SimpleDbStore happen within the context of this - * transaction and it cannot be used anymore once the transaction is - * completed. - * - * Note that we can't actually enforce that the KeyType and ValueType are - * correct, but they allow type safety through the rest of the consuming code. - */ store(t) { - const e = this.transaction.objectStore(t); - return new _i(e); - } -} - -/** - * Provides a wrapper around IndexedDb with a simplified interface that uses - * Promise-like return values to chain operations. Real promises cannot be used - * since .then() continuations are executed asynchronously (e.g. via - * .setImmediate), which would cause IndexedDB to end the transaction. - * See PersistencePromise for more details. - */ class hi { - /* - * Creates a new SimpleDb wrapper for IndexedDb database `name`. - * - * Note that `version` must not be a downgrade. IndexedDB does not support - * downgrading the schema version. We currently do not support any way to do - * versioning outside of IndexedDB's versioning mechanism, as only - * version-upgrade transactions are allowed to do things like create - * objectstores. - */ - constructor(t, e, n) { - this.name = t, this.version = e, this.Pt = n; - // NOTE: According to https://bugs.webkit.org/show_bug.cgi?id=197050, the - // bug we're checking for should exist in iOS >= 12.2 and < 13, but for - // whatever reason it's much harder to hit after 12.2 so we only proactively - // log on 12.2. - 12.2 === hi.Vt((0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getUA)()) && $("Firestore persistence suffers from a bug in iOS 12.2 Safari that may cause your app to stop working. See https://stackoverflow.com/q/56496296/110915 for details and a potential workaround."); - } - /** Deletes the specified database. */ static delete(t) { - return O("SimpleDb", "Removing database:", t), wi(window.indexedDB.deleteDatabase(t)).toPromise(); - } - /** Returns true if IndexedDB is available in the current environment. */ static vt() { - if (!(0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.isIndexedDBAvailable)()) return !1; - if (hi.St()) return !0; - // We extensively use indexed array values and compound keys, - // which IE and Edge do not support. However, they still have indexedDB - // defined on the window, so we need to check for them here and make sure - // to return that persistence is not enabled for those browsers. - // For tracking support of this feature, see here: - // https://developer.microsoft.com/en-us/microsoft-edge/platform/status/indexeddbarraysandmultientrysupport/ - // Check the UA string to find out the browser. - const t = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getUA)(), e = hi.Vt(t), n = 0 < e && e < 10, s = hi.Dt(t), i = 0 < s && s < 4.5; - // IE 10 - // ua = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)'; - // IE 11 - // ua = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko'; - // Edge - // ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, - // like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0'; - // iOS Safari: Disable for users running iOS version < 10. - return !(t.indexOf("MSIE ") > 0 || t.indexOf("Trident/") > 0 || t.indexOf("Edge/") > 0 || n || i); - } - /** - * Returns true if the backing IndexedDB store is the Node IndexedDBShim - * (see https://github.com/axemclion/IndexedDBShim). - */ static St() { - var t; - return "undefined" != typeof process && "YES" === (null === (t = process.env) || void 0 === t ? void 0 : t.Ct); - } - /** Helper to get a typed SimpleDbStore from a transaction. */ static xt(t, e) { - return t.store(e); - } - // visible for testing - /** Parse User Agent to determine iOS version. Returns -1 if not found. */ - static Vt(t) { - const e = t.match(/i(?:phone|pad|pod) os ([\d_]+)/i), n = e ? e[1].split("_").slice(0, 2).join(".") : "-1"; - return Number(n); - } - // visible for testing - /** Parse User Agent to determine Android version. Returns -1 if not found. */ - static Dt(t) { - const e = t.match(/Android ([\d.]+)/i), n = e ? e[1].split(".").slice(0, 2).join(".") : "-1"; - return Number(n); - } - /** - * Opens the specified database, creating or upgrading it if necessary. - */ async Nt(t) { - return this.db || (O("SimpleDb", "Opening database:", this.name), this.db = await new Promise(((e, n) => { - // TODO(mikelehen): Investigate browser compatibility. - // https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Using_IndexedDB - // suggests IE9 and older WebKit browsers handle upgrade - // differently. They expect setVersion, as described here: - // https://developer.mozilla.org/en-US/docs/Web/API/IDBVersionChangeRequest/setVersion - const s = indexedDB.open(this.name, this.version); - s.onsuccess = t => { - const n = t.target.result; - e(n); - }, s.onblocked = () => { - n(new fi(t, "Cannot upgrade IndexedDB schema while another tab is open. Close all tabs that access Firestore and reload this page to proceed.")); - }, s.onerror = e => { - const s = e.target.error; - "VersionError" === s.name ? n(new Q(G.FAILED_PRECONDITION, "A newer version of the Firestore SDK was previously used and so the persisted data is not compatible with the version of the SDK you are now using. The SDK will operate with persistence disabled. If you need persistence, please re-upgrade to a newer version of the SDK or else clear the persisted IndexedDB data for your app to start fresh.")) : "InvalidStateError" === s.name ? n(new Q(G.FAILED_PRECONDITION, "Unable to open an IndexedDB connection. This could be due to running in a private browsing session on a browser whose private browsing sessions do not support IndexedDB: " + s)) : n(new fi(t, s)); - }, s.onupgradeneeded = t => { - O("SimpleDb", 'Database "' + this.name + '" requires upgrade from version:', t.oldVersion); - const e = t.target.result; - this.Pt.kt(e, s.transaction, t.oldVersion, this.version).next((() => { - O("SimpleDb", "Database upgrade to version " + this.version + " complete"); - })); - }; - }))), this.Mt && (this.db.onversionchange = t => this.Mt(t)), this.db; - } - Ot(t) { - this.Mt = t, this.db && (this.db.onversionchange = e => t(e)); - } - async runTransaction(t, e, n, s) { - const i = "readonly" === e; - let r = 0; - for (;;) { - ++r; - try { - this.db = await this.Nt(t); - const e = ci.open(this.db, t, i ? "readonly" : "readwrite", n), r = s(e).next((t => (e.bt(), - t))).catch((t => ( - // Abort the transaction if there was an error. - e.abort(t), ui.reject(t)))).toPromise(); - // As noted above, errors are propagated by aborting the transaction. So - // we swallow any error here to avoid the browser logging it as unhandled. - return r.catch((() => {})), - // Wait for the transaction to complete (i.e. IndexedDb's onsuccess event to - // fire), but still return the original transactionFnResult back to the - // caller. - await e.Rt, r; - } catch (t) { - // TODO(schmidt-sebastian): We could probably be smarter about this and - // not retry exceptions that are likely unrecoverable (such as quota - // exceeded errors). - // Note: We cannot use an instanceof check for FirestoreException, since the - // exception is wrapped in a generic error by our async/await handling. - const e = "FirebaseError" !== t.name && r < 3; - if (O("SimpleDb", "Transaction failed with error:", t.message, "Retrying:", e), - this.close(), !e) return Promise.reject(t); - } - } - } - close() { - this.db && this.db.close(), this.db = void 0; - } -} - -/** - * A controller for iterating over a key range or index. It allows an iterate - * callback to delete the currently-referenced object, or jump to a new key - * within the key range or index. - */ class li { - constructor(t) { - this.$t = t, this.Ft = !1, this.Bt = null; - } - get isDone() { - return this.Ft; - } - get Lt() { - return this.Bt; - } - set cursor(t) { - this.$t = t; - } - /** - * This function can be called to stop iteration at any point. - */ done() { - this.Ft = !0; - } - /** - * This function can be called to skip to that next key, which could be - * an index or a primary key. - */ qt(t) { - this.Bt = t; - } - /** - * Delete the current cursor value from the object store. - * - * NOTE: You CANNOT do this with a keysOnly query. - */ delete() { - return wi(this.$t.delete()); - } -} - -/** An error that wraps exceptions that thrown during IndexedDB execution. */ class fi extends Q { - constructor(t, e) { - super(G.UNAVAILABLE, `IndexedDB transaction '${t}' failed: ${e}`), this.name = "IndexedDbTransactionError"; - } -} - -/** Verifies whether `e` is an IndexedDbTransactionError. */ function di(t) { - // Use name equality, as instanceof checks on errors don't work with errors - // that wrap other errors. - return "IndexedDbTransactionError" === t.name; -} - -/** - * A wrapper around an IDBObjectStore providing an API that: - * - * 1) Has generic KeyType / ValueType parameters to provide strongly-typed - * methods for acting against the object store. - * 2) Deals with IndexedDB's onsuccess / onerror event callbacks, making every - * method return a PersistencePromise instead. - * 3) Provides a higher-level API to avoid needing to do excessive wrapping of - * intermediate IndexedDB types (IDBCursorWithValue, etc.) - */ class _i { - constructor(t) { - this.store = t; - } - put(t, e) { - let n; - return void 0 !== e ? (O("SimpleDb", "PUT", this.store.name, t, e), n = this.store.put(e, t)) : (O("SimpleDb", "PUT", this.store.name, "", t), - n = this.store.put(t)), wi(n); - } - /** - * Adds a new value into an Object Store and returns the new key. Similar to - * IndexedDb's `add()`, this method will fail on primary key collisions. - * - * @param value - The object to write. - * @returns The key of the value to add. - */ add(t) { - O("SimpleDb", "ADD", this.store.name, t, t); - return wi(this.store.add(t)); - } - /** - * Gets the object with the specified key from the specified store, or null - * if no object exists with the specified key. - * - * @key The key of the object to get. - * @returns The object with the specified key or null if no object exists. - */ get(t) { - // We're doing an unsafe cast to ValueType. - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return wi(this.store.get(t)).next((e => ( - // Normalize nonexistence to null. - void 0 === e && (e = null), O("SimpleDb", "GET", this.store.name, t, e), e))); - } - delete(t) { - O("SimpleDb", "DELETE", this.store.name, t); - return wi(this.store.delete(t)); - } - /** - * If we ever need more of the count variants, we can add overloads. For now, - * all we need is to count everything in a store. - * - * Returns the number of rows in the store. - */ count() { - O("SimpleDb", "COUNT", this.store.name); - return wi(this.store.count()); - } - Ut(t, e) { - const n = this.options(t, e); - // Use `getAll()` if the browser supports IndexedDB v3, as it is roughly - // 20% faster. Unfortunately, getAll() does not support custom indices. - if (n.index || "function" != typeof this.store.getAll) { - const t = this.cursor(n), e = []; - return this.Kt(t, ((t, n) => { - e.push(n); - })).next((() => e)); - } - { - const t = this.store.getAll(n.range); - return new ui(((e, n) => { - t.onerror = t => { - n(t.target.error); - }, t.onsuccess = t => { - e(t.target.result); - }; - })); - } - } - /** - * Loads the first `count` elements from the provided index range. Loads all - * elements if no limit is provided. - */ Gt(t, e) { - const n = this.store.getAll(t, null === e ? void 0 : e); - return new ui(((t, e) => { - n.onerror = t => { - e(t.target.error); - }, n.onsuccess = e => { - t(e.target.result); - }; - })); - } - Qt(t, e) { - O("SimpleDb", "DELETE ALL", this.store.name); - const n = this.options(t, e); - n.jt = !1; - const s = this.cursor(n); - return this.Kt(s, ((t, e, n) => n.delete())); - } - Wt(t, e) { - let n; - e ? n = t : (n = {}, e = t); - const s = this.cursor(n); - return this.Kt(s, e); - } - /** - * Iterates over a store, but waits for the given callback to complete for - * each entry before iterating the next entry. This allows the callback to do - * asynchronous work to determine if this iteration should continue. - * - * The provided callback should return `true` to continue iteration, and - * `false` otherwise. - */ zt(t) { - const e = this.cursor({}); - return new ui(((n, s) => { - e.onerror = t => { - const e = gi(t.target.error); - s(e); - }, e.onsuccess = e => { - const s = e.target.result; - s ? t(s.primaryKey, s.value).next((t => { - t ? s.continue() : n(); - })) : n(); - }; - })); - } - Kt(t, e) { - const n = []; - return new ui(((s, i) => { - t.onerror = t => { - i(t.target.error); - }, t.onsuccess = t => { - const i = t.target.result; - if (!i) return void s(); - const r = new li(i), o = e(i.primaryKey, i.value, r); - if (o instanceof ui) { - const t = o.catch((t => (r.done(), ui.reject(t)))); - n.push(t); - } - r.isDone ? s() : null === r.Lt ? i.continue() : i.continue(r.Lt); - }; - })).next((() => ui.waitFor(n))); - } - options(t, e) { - let n; - return void 0 !== t && ("string" == typeof t ? n = t : e = t), { - index: n, - range: e - }; - } - cursor(t) { - let e = "next"; - if (t.reverse && (e = "prev"), t.index) { - const n = this.store.index(t.index); - return t.jt ? n.openKeyCursor(t.range, e) : n.openCursor(t.range, e); - } - return this.store.openCursor(t.range, e); - } -} - -/** - * Wraps an IDBRequest in a PersistencePromise, using the onsuccess / onerror - * handlers to resolve / reject the PersistencePromise as appropriate. - */ function wi(t) { - return new ui(((e, n) => { - t.onsuccess = t => { - const n = t.target.result; - e(n); - }, t.onerror = t => { - const e = gi(t.target.error); - n(e); - }; - })); -} - -// Guard so we only report the error once. -let mi = !1; - -function gi(t) { - const e = hi.Vt((0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getUA)()); - if (e >= 12.2 && e < 13) { - const e = "An internal error was encountered in the Indexed Database server"; - if (t.message.indexOf(e) >= 0) { - // Wrap error in a more descriptive one. - const t = new Q("internal", `IOS_INDEXEDDB_BUG1: IndexedDb has thrown '${e}'. This is likely due to an unavoidable bug in iOS. See https://stackoverflow.com/q/56496296/110915 for details and a potential workaround.`); - return mi || (mi = !0, - // Throw a global exception outside of this promise chain, for the user to - // potentially catch. - setTimeout((() => { - throw t; - }), 0)), t; - } - } - return t; -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ class yi extends ai { - constructor(t, e) { - super(), this.Ht = t, this.currentSequenceNumber = e; - } -} - -function pi(t, e) { - const n = K(t); - return hi.xt(n.Ht, e); -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A batch of mutations that will be sent as one unit to the backend. - */ class Ii { - /** - * @param batchId - The unique ID of this mutation batch. - * @param localWriteTime - The original write time of this mutation. - * @param baseMutations - Mutations that are used to populate the base - * values when this mutation is applied locally. This can be used to locally - * overwrite values that are persisted in the remote document cache. Base - * mutations are never sent to the backend. - * @param mutations - The user-provided mutations in this mutation batch. - * User-provided mutations are applied both locally and remotely on the - * backend. - */ - constructor(t, e, n, s) { - this.batchId = t, this.localWriteTime = e, this.baseMutations = n, this.mutations = s; - } - /** - * Applies all the mutations in this MutationBatch to the specified document - * to compute the state of the remote document - * - * @param document - The document to apply mutations to. - * @param batchResult - The result of applying the MutationBatch to the - * backend. - */ applyToRemoteDocument(t, e) { - const n = e.mutationResults; - for (let e = 0; e < this.mutations.length; e++) { - const s = this.mutations[e]; - if (s.key.isEqual(t.key)) { - dn(s, t, n[e]); - } - } - } - /** - * Computes the local view of a document given all the mutations in this - * batch. - * - * @param document - The document to apply mutations to. - */ applyToLocalView(t) { - // First, apply the base state. This allows us to apply non-idempotent - // transform against a consistent set of values. - for (const e of this.baseMutations) e.key.isEqual(t.key) && _n(e, t, this.localWriteTime); - // Second, apply all user-provided mutations. - for (const e of this.mutations) e.key.isEqual(t.key) && _n(e, t, this.localWriteTime); - } - /** - * Computes the local view for all provided documents given the mutations in - * this batch. - */ applyToLocalDocumentSet(t) { - // TODO(mrschmidt): This implementation is O(n^2). If we apply the mutations - // directly (as done in `applyToLocalView()`), we can reduce the complexity - // to O(n). - this.mutations.forEach((e => { - const n = t.get(e.key), s = n; - // TODO(mutabledocuments): This method should take a MutableDocumentMap - // and we should remove this cast. - this.applyToLocalView(s), n.isValidDocument() || s.convertToNoDocument(ct.min()); - })); - } - keys() { - return this.mutations.reduce(((t, e) => t.add(e.key)), Gn()); - } - isEqual(t) { - return this.batchId === t.batchId && ot(this.mutations, t.mutations, ((t, e) => mn(t, e))) && ot(this.baseMutations, t.baseMutations, ((t, e) => mn(t, e))); - } -} - -/** The result of applying a mutation batch to the backend. */ class Ti { - constructor(t, e, n, - /** - * A pre-computed mapping from each mutated document to the resulting - * version. - */ - s) { - this.batch = t, this.commitVersion = e, this.mutationResults = n, this.docVersions = s; - } - /** - * Creates a new MutationBatchResult for the given batch and results. There - * must be one result for each mutation in the batch. This static factory - * caches a document=>version mapping (docVersions). - */ static from(t, e, n) { - q(t.mutations.length === n.length); - let s = Un; - const i = t.mutations; - for (let t = 0; t < i.length; t++) s = s.insert(i[t].key, n[t].version); - return new Ti(t, e, n, s); - } -} - -/** - * @license - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Representation of an overlay computed by Firestore. - * - * Holds information about a mutation and the largest batch id in Firestore when - * the mutation was created. - */ class Ei { - constructor(t, e) { - this.largestBatchId = t, this.mutation = e; - } - getKey() { - return this.mutation.key; - } - isEqual(t) { - return null !== t && this.mutation === t.mutation; - } - toString() { - return `Overlay{\n largestBatchId: ${this.largestBatchId},\n mutation: ${this.mutation.toString()}\n }`; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * An immutable set of metadata that the local store tracks for each target. - */ class Ai { - constructor( - /** The target being listened to. */ - t, - /** - * The target ID to which the target corresponds; Assigned by the - * LocalStore for user listens and by the SyncEngine for limbo watches. - */ - e, - /** The purpose of the target. */ - n, - /** - * The sequence number of the last transaction during which this target data - * was modified. - */ - s, - /** The latest snapshot version seen for this target. */ - i = ct.min() - /** - * The maximum snapshot version at which the associated view - * contained no limbo documents. - */ , r = ct.min() - /** - * An opaque, server-assigned token that allows watching a target to be - * resumed after disconnecting without retransmitting all the data that - * matches the target. The resume token essentially identifies a point in - * time from which the server should resume sending results. - */ , o = pt.EMPTY_BYTE_STRING) { - this.target = t, this.targetId = e, this.purpose = n, this.sequenceNumber = s, this.snapshotVersion = i, - this.lastLimboFreeSnapshotVersion = r, this.resumeToken = o; - } - /** Creates a new target data instance with an updated sequence number. */ withSequenceNumber(t) { - return new Ai(this.target, this.targetId, this.purpose, t, this.snapshotVersion, this.lastLimboFreeSnapshotVersion, this.resumeToken); - } - /** - * Creates a new target data instance with an updated resume token and - * snapshot version. - */ withResumeToken(t, e) { - return new Ai(this.target, this.targetId, this.purpose, this.sequenceNumber, e, this.lastLimboFreeSnapshotVersion, t); - } - /** - * Creates a new target data instance with an updated last limbo free - * snapshot version number. - */ withLastLimboFreeSnapshotVersion(t) { - return new Ai(this.target, this.targetId, this.purpose, this.sequenceNumber, this.snapshotVersion, t, this.resumeToken); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** Serializer for values stored in the LocalStore. */ class Ri { - constructor(t) { - this.Jt = t; - } -} - -/** Decodes a remote document from storage locally to a Document. */ function bi(t, e) { - let n; - if (e.document) n = ys(t.Jt, e.document, !!e.hasCommittedMutations); else if (e.noDocument) { - const t = xt.fromSegments(e.noDocument.path), s = Di(e.noDocument.readTime); - n = te.newNoDocument(t, s), e.hasCommittedMutations && n.setHasCommittedMutations(); - } else { - if (!e.unknownDocument) return L(); - { - const t = xt.fromSegments(e.unknownDocument.path), s = Di(e.unknownDocument.version); - n = te.newUnknownDocument(t, s); - } - } - return e.readTime && n.setReadTime(vi(e.readTime)), n; -} - -/** Encodes a document for storage locally. */ function Pi(t, e) { - const n = e.key.path.popLast().toArray(), s = Vi(e.readTime); - if (e.isFoundDocument()) { - const i = function(t, e) { - return { - name: ls(t, e.key), - fields: e.data.value.mapValue.fields, - updateTime: rs(t, e.version.toTimestamp()) - }; - }(t.Jt, e); - return { - document: i, - hasCommittedMutations: e.hasCommittedMutations, - readTime: s, - parentPath: n - }; - } - if (e.isNoDocument()) { - const t = e.key.path.toArray(), i = e.hasCommittedMutations; - return { - noDocument: { - path: t, - readTime: Si(e.version) - }, - hasCommittedMutations: i, - readTime: s, - parentPath: n - }; - } - if (e.isUnknownDocument()) { - return { - unknownDocument: { - path: e.key.path.toArray(), - version: Si(e.version) - }, - hasCommittedMutations: !0, - readTime: s, - parentPath: n - }; - } - return L(); -} - -function Vi(t) { - const e = t.toTimestamp(); - return [ e.seconds, e.nanoseconds ]; -} - -function vi(t) { - const e = new ut(t[0], t[1]); - return ct.fromTimestamp(e); -} - -function Si(t) { - const e = t.toTimestamp(); - return { - seconds: e.seconds, - nanoseconds: e.nanoseconds - }; -} - -function Di(t) { - const e = new ut(t.seconds, t.nanoseconds); - return ct.fromTimestamp(e); -} - -/** Encodes a batch of mutations into a DbMutationBatch for local storage. */ -/** Decodes a DbMutationBatch into a MutationBatch */ -function Ci(t, e) { - const n = (e.baseMutations || []).map((e => Es(t.Jt, e))); - // Squash old transform mutations into existing patch or set mutations. - // The replacement of representing `transforms` with `update_transforms` - // on the SDK means that old `transform` mutations stored in IndexedDB need - // to be updated to `update_transforms`. - // TODO(b/174608374): Remove this code once we perform a schema migration. - for (let t = 0; t < e.mutations.length - 1; ++t) { - const n = e.mutations[t]; - if (t + 1 < e.mutations.length && void 0 !== e.mutations[t + 1].transform) { - const s = e.mutations[t + 1]; - n.updateTransforms = s.transform.fieldTransforms, e.mutations.splice(t + 1, 1), - ++t; - } - } - const s = e.mutations.map((e => Es(t.Jt, e))), i = ut.fromMillis(e.localWriteTimeMs); - return new Ii(e.batchId, i, n, s); -} - -/** Decodes a DbTarget into TargetData */ function xi(t) { - const e = Di(t.readTime), n = void 0 !== t.lastLimboFreeSnapshotVersion ? Di(t.lastLimboFreeSnapshotVersion) : ct.min(); - let s; - var i; - return void 0 !== t.query.documents ? (q(1 === (i = t.query).documents.length), - s = $e(De(_s(i.documents[0])))) : s = function(t) { - return $e(Ps(t)); - }(t.query), new Ai(s, t.targetId, 0 /* Listen */ , t.lastListenSequenceNumber, e, n, pt.fromBase64String(t.resumeToken)); -} - -/** Encodes TargetData into a DbTarget for storage locally. */ function Ni(t, e) { - const n = Si(e.snapshotVersion), s = Si(e.lastLimboFreeSnapshotVersion); - let i; - i = fe(e.target) ? Rs(t.Jt, e.target) : bs(t.Jt, e.target); - // We can't store the resumeToken as a ByteString in IndexedDb, so we - // convert it to a base64 string for storage. - const r = e.resumeToken.toBase64(); - // lastListenSequenceNumber is always 0 until we do real GC. - return { - targetId: e.targetId, - canonicalId: ce(e.target), - readTime: n, - resumeToken: r, - lastListenSequenceNumber: e.sequenceNumber, - lastLimboFreeSnapshotVersion: s, - query: i - }; -} - -/** - * A helper function for figuring out what kind of query has been stored. - */ -/** - * Encodes a `BundledQuery` from bundle proto to a Query object. - * - * This reconstructs the original query used to build the bundle being loaded, - * including features exists only in SDKs (for example: limit-to-last). - */ -function ki(t) { - const e = Ps({ - parent: t.parent, - structuredQuery: t.structuredQuery - }); - return "LAST" === t.limitType ? Fe(e, e.limit, "L" /* Last */) : e; -} - -/** Encodes a NamedQuery proto object to a NamedQuery model object. */ -/** Encodes a DbDocumentOverlay object to an Overlay model object. */ -function Mi(t, e) { - return new Ei(e.largestBatchId, Es(t.Jt, e.overlayMutation)); -} - -/** Decodes an Overlay model object into a DbDocumentOverlay object. */ -/** - * Returns the DbDocumentOverlayKey corresponding to the given user and - * document key. - */ -function Oi(t, e) { - const n = e.path.lastSegment(); - return [ t, $s(e.path.popLast()), n ]; -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -class $i { - getBundleMetadata(t, e) { - return Fi(t).get(e).next((t => { - if (t) return { - id: (e = t).bundleId, - createTime: Di(e.createTime), - version: e.version - }; - /** Encodes a DbBundle to a BundleMetadata object. */ - var e; - /** Encodes a BundleMetadata to a DbBundle. */ })); - } - saveBundleMetadata(t, e) { - return Fi(t).put({ - bundleId: (n = e).id, - createTime: Si(us(n.createTime)), - version: n.version - }); - var n; - /** Encodes a DbNamedQuery to a NamedQuery. */ } - getNamedQuery(t, e) { - return Bi(t).get(e).next((t => { - if (t) return { - name: (e = t).name, - query: ki(e.bundledQuery), - readTime: Di(e.readTime) - }; - var e; - /** Encodes a NamedQuery from a bundle proto to a DbNamedQuery. */ })); - } - saveNamedQuery(t, e) { - return Bi(t).put(function(t) { - return { - name: t.name, - readTime: Si(us(t.readTime)), - bundledQuery: t.bundledQuery - }; - }(e)); - } -} - -/** - * Helper to get a typed SimpleDbStore for the bundles object store. - */ function Fi(t) { - return pi(t, "bundles"); -} - -/** - * Helper to get a typed SimpleDbStore for the namedQueries object store. - */ function Bi(t) { - return pi(t, "namedQueries"); -} - -/** - * @license - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Implementation of DocumentOverlayCache using IndexedDb. - */ class Li { - /** - * @param serializer - The document serializer. - * @param userId - The userId for which we are accessing overlays. - */ - constructor(t, e) { - this.M = t, this.userId = e; - } - static Yt(t, e) { - const n = e.uid || ""; - return new Li(t, n); - } - getOverlay(t, e) { - return qi(t).get(Oi(this.userId, e)).next((t => t ? Mi(this.M, t) : null)); - } - saveOverlays(t, e, n) { - const s = []; - return n.forEach(((n, i) => { - const r = new Ei(e, i); - s.push(this.Xt(t, r)); - })), ui.waitFor(s); - } - removeOverlaysForBatchId(t, e, n) { - const s = new Set; - // Get the set of unique collection paths. - e.forEach((t => s.add($s(t.getCollectionPath())))); - const i = []; - return s.forEach((e => { - const s = IDBKeyRange.bound([ this.userId, e, n ], [ this.userId, e, n + 1 ], - /*lowerOpen=*/ !1, - /*upperOpen=*/ !0); - i.push(qi(t).Qt("collectionPathOverlayIndex", s)); - })), ui.waitFor(i); - } - getOverlaysForCollection(t, e, n) { - const s = qn(), i = $s(e), r = IDBKeyRange.bound([ this.userId, i, n ], [ this.userId, i, Number.POSITIVE_INFINITY ], - /*lowerOpen=*/ !0); - return qi(t).Ut("collectionPathOverlayIndex", r).next((t => { - for (const e of t) { - const t = Mi(this.M, e); - s.set(t.getKey(), t); - } - return s; - })); - } - getOverlaysForCollectionGroup(t, e, n, s) { - const i = qn(); - let r; - // We want batch IDs larger than `sinceBatchId`, and so the lower bound - // is not inclusive. - const o = IDBKeyRange.bound([ this.userId, e, n ], [ this.userId, e, Number.POSITIVE_INFINITY ], - /*lowerOpen=*/ !0); - return qi(t).Wt({ - index: "collectionGroupOverlayIndex", - range: o - }, ((t, e, n) => { - // We do not want to return partial batch overlays, even if the size - // of the result set exceeds the given `count` argument. Therefore, we - // continue to aggregate results even after the result size exceeds - // `count` if there are more overlays from the `currentBatchId`. - const o = Mi(this.M, e); - i.size() < s || o.largestBatchId === r ? (i.set(o.getKey(), o), r = o.largestBatchId) : n.done(); - })).next((() => i)); - } - Xt(t, e) { - return qi(t).put(function(t, e, n) { - const [s, i, r] = Oi(e, n.mutation.key); - return { - userId: e, - collectionPath: i, - documentId: r, - collectionGroup: n.mutation.key.getCollectionGroup(), - largestBatchId: n.largestBatchId, - overlayMutation: Ts(t.Jt, n.mutation) - }; - }(this.M, this.userId, e)); - } -} - -/** - * Helper to get a typed SimpleDbStore for the document overlay object store. - */ function qi(t) { - return pi(t, "documentOverlays"); -} - -/** - * @license - * Copyright 2021 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -// Note: This code is copied from the backend. Code that is not used by -// Firestore was removed. -/** Firestore index value writer. */ -class Ui { - constructor() {} - // The write methods below short-circuit writing terminators for values - // containing a (terminating) truncated value. - // As an example, consider the resulting encoding for: - // ["bar", [2, "foo"]] -> (STRING, "bar", TERM, ARRAY, NUMBER, 2, STRING, "foo", TERM, TERM, TERM) - // ["bar", [2, truncated("foo")]] -> (STRING, "bar", TERM, ARRAY, NUMBER, 2, STRING, "foo", TRUNC) - // ["bar", truncated(["foo"])] -> (STRING, "bar", TERM, ARRAY. STRING, "foo", TERM, TRUNC) - /** Writes an index value. */ - Zt(t, e) { - this.te(t, e), - // Write separator to split index values - // (see go/firestore-storage-format#encodings). - e.ee(); - } - te(t, e) { - if ("nullValue" in t) this.ne(e, 5); else if ("booleanValue" in t) this.ne(e, 10), - e.se(t.booleanValue ? 1 : 0); else if ("integerValue" in t) this.ne(e, 15), e.se(Et(t.integerValue)); else if ("doubleValue" in t) { - const n = Et(t.doubleValue); - isNaN(n) ? this.ne(e, 13) : (this.ne(e, 15), Dt(n) ? - // -0.0, 0 and 0.0 are all considered the same - e.se(0) : e.se(n)); - } else if ("timestampValue" in t) { - const n = t.timestampValue; - this.ne(e, 20), "string" == typeof n ? e.ie(n) : (e.ie(`${n.seconds || ""}`), e.se(n.nanos || 0)); - } else if ("stringValue" in t) this.re(t.stringValue, e), this.oe(e); else if ("bytesValue" in t) this.ne(e, 30), - e.ae(At(t.bytesValue)), this.oe(e); else if ("referenceValue" in t) this.ue(t.referenceValue, e); else if ("geoPointValue" in t) { - const n = t.geoPointValue; - this.ne(e, 45), e.se(n.latitude || 0), e.se(n.longitude || 0); - } else "mapValue" in t ? Ht(t) ? this.ne(e, Number.MAX_SAFE_INTEGER) : (this.ce(t.mapValue, e), - this.oe(e)) : "arrayValue" in t ? (this.he(t.arrayValue, e), this.oe(e)) : L(); - } - re(t, e) { - this.ne(e, 25), this.le(t, e); - } - le(t, e) { - e.ie(t); - } - ce(t, e) { - const n = t.fields || {}; - this.ne(e, 55); - for (const t of Object.keys(n)) this.re(t, e), this.te(n[t], e); - } - he(t, e) { - const n = t.values || []; - this.ne(e, 50); - for (const t of n) this.te(t, e); - } - ue(t, e) { - this.ne(e, 37); - xt.fromName(t).path.forEach((t => { - this.ne(e, 60), this.le(t, e); - })); - } - ne(t, e) { - t.se(e); - } - oe(t) { - // While the SDK does not implement truncation, the truncation marker is - // used to terminate all variable length values (which are strings, bytes, - // references, arrays and maps). - t.se(2); - } -} - -Ui.fe = new Ui; - -/** - * Counts the number of zeros in a byte. - * - * Visible for testing. - */ -function Ki(t) { - if (0 === t) return 8; - let e = 0; - return t >> 4 == 0 && ( - // Test if the first four bits are zero. - e += 4, t <<= 4), t >> 6 == 0 && ( - // Test if the first two (or next two) bits are zero. - e += 2, t <<= 2), t >> 7 == 0 && ( - // Test if the remaining bit is zero. - e += 1), e; -} - -/** Counts the number of leading zeros in the given byte array. */ -/** - * Returns the number of bytes required to store "value". Leading zero bytes - * are skipped. - */ -function Gi(t) { - // This is just the number of bytes for the unsigned representation of the number. - const e = 64 - function(t) { - let e = 0; - for (let n = 0; n < 8; ++n) { - const s = Ki(255 & t[n]); - if (e += s, 8 !== s) break; - } - return e; - }(t); - return Math.ceil(e / 8); -} - -/** - * OrderedCodeWriter is a minimal-allocation implementation of the writing - * behavior defined by the backend. - * - * The code is ported from its Java counterpart. - */ class Qi { - constructor() { - this.buffer = new Uint8Array(1024), this.position = 0; - } - de(t) { - const e = t[Symbol.iterator](); - let n = e.next(); - for (;!n.done; ) this._e(n.value), n = e.next(); - this.we(); - } - me(t) { - const e = t[Symbol.iterator](); - let n = e.next(); - for (;!n.done; ) this.ge(n.value), n = e.next(); - this.ye(); - } - /** Writes utf8 bytes into this byte sequence, ascending. */ pe(t) { - for (const e of t) { - const t = e.charCodeAt(0); - if (t < 128) this._e(t); else if (t < 2048) this._e(960 | t >>> 6), this._e(128 | 63 & t); else if (e < "\ud800" || "\udbff" < e) this._e(480 | t >>> 12), - this._e(128 | 63 & t >>> 6), this._e(128 | 63 & t); else { - const t = e.codePointAt(0); - this._e(240 | t >>> 18), this._e(128 | 63 & t >>> 12), this._e(128 | 63 & t >>> 6), - this._e(128 | 63 & t); - } - } - this.we(); - } - /** Writes utf8 bytes into this byte sequence, descending */ Ie(t) { - for (const e of t) { - const t = e.charCodeAt(0); - if (t < 128) this.ge(t); else if (t < 2048) this.ge(960 | t >>> 6), this.ge(128 | 63 & t); else if (e < "\ud800" || "\udbff" < e) this.ge(480 | t >>> 12), - this.ge(128 | 63 & t >>> 6), this.ge(128 | 63 & t); else { - const t = e.codePointAt(0); - this.ge(240 | t >>> 18), this.ge(128 | 63 & t >>> 12), this.ge(128 | 63 & t >>> 6), - this.ge(128 | 63 & t); - } - } - this.ye(); - } - Te(t) { - // Values are encoded with a single byte length prefix, followed by the - // actual value in big-endian format with leading 0 bytes dropped. - const e = this.Ee(t), n = Gi(e); - this.Ae(1 + n), this.buffer[this.position++] = 255 & n; - // Write the length - for (let t = e.length - n; t < e.length; ++t) this.buffer[this.position++] = 255 & e[t]; - } - Re(t) { - // Values are encoded with a single byte length prefix, followed by the - // inverted value in big-endian format with leading 0 bytes dropped. - const e = this.Ee(t), n = Gi(e); - this.Ae(1 + n), this.buffer[this.position++] = ~(255 & n); - // Write the length - for (let t = e.length - n; t < e.length; ++t) this.buffer[this.position++] = ~(255 & e[t]); - } - /** - * Writes the "infinity" byte sequence that sorts after all other byte - * sequences written in ascending order. - */ be() { - this.Pe(255), this.Pe(255); - } - /** - * Writes the "infinity" byte sequence that sorts before all other byte - * sequences written in descending order. - */ Ve() { - this.ve(255), this.ve(255); - } - /** - * Resets the buffer such that it is the same as when it was newly - * constructed. - */ reset() { - this.position = 0; - } - seed(t) { - this.Ae(t.length), this.buffer.set(t, this.position), this.position += t.length; - } - /** Makes a copy of the encoded bytes in this buffer. */ Se() { - return this.buffer.slice(0, this.position); - } - /** - * Encodes `val` into an encoding so that the order matches the IEEE 754 - * floating-point comparison results with the following exceptions: - * -0.0 < 0.0 - * all non-NaN < NaN - * NaN = NaN - */ Ee(t) { - const e = - /** Converts a JavaScript number to a byte array (using big endian encoding). */ - function(t) { - const e = new DataView(new ArrayBuffer(8)); - return e.setFloat64(0, t, /* littleEndian= */ !1), new Uint8Array(e.buffer); - }(t), n = 0 != (128 & e[0]); - // Check if the first bit is set. We use a bit mask since value[0] is - // encoded as a number from 0 to 255. - // Revert the two complement to get natural ordering - e[0] ^= n ? 255 : 128; - for (let t = 1; t < e.length; ++t) e[t] ^= n ? 255 : 0; - return e; - } - /** Writes a single byte ascending to the buffer. */ _e(t) { - const e = 255 & t; - 0 === e ? (this.Pe(0), this.Pe(255)) : 255 === e ? (this.Pe(255), this.Pe(0)) : this.Pe(e); - } - /** Writes a single byte descending to the buffer. */ ge(t) { - const e = 255 & t; - 0 === e ? (this.ve(0), this.ve(255)) : 255 === e ? (this.ve(255), this.ve(0)) : this.ve(t); - } - we() { - this.Pe(0), this.Pe(1); - } - ye() { - this.ve(0), this.ve(1); - } - Pe(t) { - this.Ae(1), this.buffer[this.position++] = t; - } - ve(t) { - this.Ae(1), this.buffer[this.position++] = ~t; - } - Ae(t) { - const e = t + this.position; - if (e <= this.buffer.length) return; - // Try doubling. - let n = 2 * this.buffer.length; - // Still not big enough? Just allocate the right size. - n < e && (n = e); - // Create the new buffer. - const s = new Uint8Array(n); - s.set(this.buffer), // copy old data - this.buffer = s; - } -} - -class ji { - constructor(t) { - this.De = t; - } - ae(t) { - this.De.de(t); - } - ie(t) { - this.De.pe(t); - } - se(t) { - this.De.Te(t); - } - ee() { - this.De.be(); - } -} - -class Wi { - constructor(t) { - this.De = t; - } - ae(t) { - this.De.me(t); - } - ie(t) { - this.De.Ie(t); - } - se(t) { - this.De.Re(t); - } - ee() { - this.De.Ve(); - } -} - -/** - * Implements `DirectionalIndexByteEncoder` using `OrderedCodeWriter` for the - * actual encoding. - */ class zi { - constructor() { - this.De = new Qi, this.Ce = new ji(this.De), this.xe = new Wi(this.De); - } - seed(t) { - this.De.seed(t); - } - Ne(t) { - return 0 /* ASCENDING */ === t ? this.Ce : this.xe; - } - Se() { - return this.De.Se(); - } - reset() { - this.De.reset(); - } -} - -/** - * @license - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** Represents an index entry saved by the SDK in persisted storage. */ class Hi { - constructor(t, e, n, s) { - this.indexId = t, this.documentKey = e, this.arrayValue = n, this.directionalValue = s; - } - /** - * Returns an IndexEntry entry that sorts immediately after the current - * directional value. - */ ke() { - const t = this.directionalValue.length, e = 0 === t || 255 === this.directionalValue[t - 1] ? t + 1 : t, n = new Uint8Array(e); - return n.set(this.directionalValue, 0), e !== t ? n.set([ 0 ], this.directionalValue.length) : ++n[n.length - 1], - new Hi(this.indexId, this.documentKey, this.arrayValue, n); - } -} - -function Ji(t, e) { - let n = t.indexId - e.indexId; - return 0 !== n ? n : (n = Yi(t.arrayValue, e.arrayValue), 0 !== n ? n : (n = Yi(t.directionalValue, e.directionalValue), - 0 !== n ? n : xt.comparator(t.documentKey, e.documentKey))); -} - -function Yi(t, e) { - for (let n = 0; n < t.length && n < e.length; ++n) { - const s = t[n] - e[n]; - if (0 !== s) return s; - } - return t.length - e.length; -} - -/** - * @license - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A light query planner for Firestore. - * - * This class matches a `FieldIndex` against a Firestore Query `Target`. It - * determines whether a given index can be used to serve the specified target. - * - * The following table showcases some possible index configurations: - * - * Query | Index - * ----------------------------------------------------------------------------- - * where('a', '==', 'a').where('b', '==', 'b') | a ASC, b DESC - * where('a', '==', 'a').where('b', '==', 'b') | a ASC - * where('a', '==', 'a').where('b', '==', 'b') | b DESC - * where('a', '>=', 'a').orderBy('a') | a ASC - * where('a', '>=', 'a').orderBy('a', 'desc') | a DESC - * where('a', '>=', 'a').orderBy('a').orderBy('b') | a ASC, b ASC - * where('a', '>=', 'a').orderBy('a').orderBy('b') | a ASC - * where('a', 'array-contains', 'a').orderBy('b') | a CONTAINS, b ASCENDING - * where('a', 'array-contains', 'a').orderBy('b') | a CONTAINS - */ class Xi { - constructor(t) { - this.collectionId = null != t.collectionGroup ? t.collectionGroup : t.path.lastSegment(), - this.Me = t.orderBy, this.Oe = []; - for (const e of t.filters) { - const t = e; - t.S() ? this.$e = t : this.Oe.push(t); - } - } - /** - * Returns whether the index can be used to serve the TargetIndexMatcher's - * target. - * - * An index is considered capable of serving the target when: - * - The target uses all index segments for its filters and orderBy clauses. - * The target can have additional filter and orderBy clauses, but not - * fewer. - * - If an ArrayContains/ArrayContainsAnyfilter is used, the index must also - * have a corresponding `CONTAINS` segment. - * - All directional index segments can be mapped to the target as a series of - * equality filters, a single inequality filter and a series of orderBy - * clauses. - * - The segments that represent the equality filters may appear out of order. - * - The optional segment for the inequality filter must appear after all - * equality segments. - * - The segments that represent that orderBy clause of the target must appear - * in order after all equality and inequality segments. Single orderBy - * clauses cannot be skipped, but a continuous orderBy suffix may be - * omitted. - */ Fe(t) { - // If there is an array element, find a matching filter. - const e = ne(t); - if (void 0 !== e && !this.Be(e)) return !1; - const n = se(t); - let s = 0, i = 0; - // Process all equalities first. Equalities can appear out of order. - for (;s < n.length && this.Be(n[s]); ++s) ; - // If we already have processed all segments, all segments are used to serve - // the equality filters and we do not need to map any segments to the - // target's inequality and orderBy clauses. - if (s === n.length) return !0; - // If there is an inequality filter, the next segment must match both the - // filter and the first orderBy clause. - if (void 0 !== this.$e) { - const t = n[s]; - if (!this.Le(this.$e, t) || !this.qe(this.Me[i++], t)) return !1; - ++s; - } - // All remaining segments need to represent the prefix of the target's - // orderBy. - for (;s < n.length; ++s) { - const t = n[s]; - if (i >= this.Me.length || !this.qe(this.Me[i++], t)) return !1; - } - return !0; - } - Be(t) { - for (const e of this.Oe) if (this.Le(e, t)) return !0; - return !1; - } - Le(t, e) { - if (void 0 === t || !t.field.isEqual(e.fieldPath)) return !1; - const n = "array-contains" /* ARRAY_CONTAINS */ === t.op || "array-contains-any" /* ARRAY_CONTAINS_ANY */ === t.op; - return 2 /* CONTAINS */ === e.kind === n; - } - qe(t, e) { - return !!t.field.isEqual(e.fieldPath) && (0 /* ASCENDING */ === e.kind && "asc" /* ASCENDING */ === t.dir || 1 /* DESCENDING */ === e.kind && "desc" /* DESCENDING */ === t.dir); - } -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * An in-memory implementation of IndexManager. - */ class Zi { - constructor() { - this.Ue = new tr; - } - addToCollectionParentIndex(t, e) { - return this.Ue.add(e), ui.resolve(); - } - getCollectionParents(t, e) { - return ui.resolve(this.Ue.getEntries(e)); - } - addFieldIndex(t, e) { - // Field indices are not supported with memory persistence. - return ui.resolve(); - } - deleteFieldIndex(t, e) { - // Field indices are not supported with memory persistence. - return ui.resolve(); - } - getDocumentsMatchingTarget(t, e) { - // Field indices are not supported with memory persistence. - return ui.resolve(null); - } - getFieldIndex(t, e) { - // Field indices are not supported with memory persistence. - return ui.resolve(null); - } - getFieldIndexes(t, e) { - // Field indices are not supported with memory persistence. - return ui.resolve([]); - } - getNextCollectionGroupToUpdate(t) { - // Field indices are not supported with memory persistence. - return ui.resolve(null); - } - updateCollectionGroup(t, e, n) { - // Field indices are not supported with memory persistence. - return ui.resolve(); - } - updateIndexEntries(t, e) { - // Field indices are not supported with memory persistence. - return ui.resolve(); - } -} - -/** - * Internal implementation of the collection-parent index exposed by MemoryIndexManager. - * Also used for in-memory caching by IndexedDbIndexManager and initial index population - * in indexeddb_schema.ts - */ class tr { - constructor() { - this.index = {}; - } - // Returns false if the entry already existed. - add(t) { - const e = t.lastSegment(), n = t.popLast(), s = this.index[e] || new kn(_t.comparator), i = !s.has(n); - return this.index[e] = s.add(n), i; - } - has(t) { - const e = t.lastSegment(), n = t.popLast(), s = this.index[e]; - return s && s.has(n); - } - getEntries(t) { - return (this.index[t] || new kn(_t.comparator)).toArray(); - } -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ const er = new Uint8Array(0); - -/** - * A persisted implementation of IndexManager. - * - * PORTING NOTE: Unlike iOS and Android, the Web SDK does not memoize index - * data as it supports multi-tab access. - */ -class nr { - constructor(t) { - this.user = t, - /** - * An in-memory copy of the index entries we've already written since the SDK - * launched. Used to avoid re-writing the same entry repeatedly. - * - * This is *NOT* a complete cache of what's in persistence and so can never be - * used to satisfy reads. - */ - this.Ke = new tr, - /** - * Maps from a target to its equivalent list of sub-targets. Each sub-target - * contains only one term from the target's disjunctive normal form (DNF). - */ - this.Ge = new Dn((t => ce(t)), ((t, e) => le(t, e))), this.uid = t.uid || ""; - } - /** - * Adds a new entry to the collection parent index. - * - * Repeated calls for the same collectionPath should be avoided within a - * transaction as IndexedDbIndexManager only caches writes once a transaction - * has been committed. - */ addToCollectionParentIndex(t, e) { - if (!this.Ke.has(e)) { - const n = e.lastSegment(), s = e.popLast(); - t.addOnCommittedListener((() => { - // Add the collection to the in memory cache only if the transaction was - // successfully committed. - this.Ke.add(e); - })); - const i = { - collectionId: n, - parent: $s(s) - }; - return sr(t).put(i); - } - return ui.resolve(); - } - getCollectionParents(t, e) { - const n = [], s = IDBKeyRange.bound([ e, "" ], [ at(e), "" ], - /*lowerOpen=*/ !1, - /*upperOpen=*/ !0); - return sr(t).Ut(s).next((t => { - for (const s of t) { - // This collectionId guard shouldn't be necessary (and isn't as long - // as we're running in a real browser), but there's a bug in - // indexeddbshim that breaks our range in our tests running in node: - // https://github.com/axemclion/IndexedDBShim/issues/334 - if (s.collectionId !== e) break; - n.push(Ls(s.parent)); - } - return n; - })); - } - addFieldIndex(t, e) { - // TODO(indexing): Verify that the auto-incrementing index ID works in - // Safari & Firefox. - const n = rr(t), s = function(t) { - return { - indexId: t.indexId, - collectionGroup: t.collectionGroup, - fields: t.fields.map((t => [ t.fieldPath.canonicalString(), t.kind ])) - }; - }(e); - // `indexId` is auto-populated by IndexedDb - return delete s.indexId, n.add(s).next(); - } - deleteFieldIndex(t, e) { - const n = rr(t), s = or(t), i = ir(t); - return n.delete(e.indexId).next((() => s.delete(IDBKeyRange.bound([ e.indexId ], [ e.indexId + 1 ], - /*lowerOpen=*/ !1, - /*upperOpen=*/ !0)))).next((() => i.delete(IDBKeyRange.bound([ e.indexId ], [ e.indexId + 1 ], - /*lowerOpen=*/ !1, - /*upperOpen=*/ !0)))); - } - getDocumentsMatchingTarget(t, e) { - const n = ir(t); - let s = !0; - const i = new Map; - return ui.forEach(this.Qe(e), (e => this.getFieldIndex(t, e).next((t => { - s && (s = !!t), i.set(e, t); - })))).next((() => { - if (s) { - let t = Gn(); - return ui.forEach(i, ((s, i) => { - var r; - O("IndexedDbIndexManager", `Using index ${r = s, `id=${r.indexId}|cg=${r.collectionGroup}|f=${r.fields.map((t => `${t.fieldPath}:${t.kind}`)).join(",")}`} to execute ${ce(e)}`); - const o = function(t, e) { - const n = ne(e); - if (void 0 === n) return null; - for (const e of de(t, n.fieldPath)) switch (e.op) { - case "array-contains-any" /* ARRAY_CONTAINS_ANY */ : - return e.value.arrayValue.values || []; - - case "array-contains" /* ARRAY_CONTAINS */ : - return [ e.value ]; - // Remaining filters are not array filters. - } - return null; - } - /** - * Returns the list of values that are used in != or NOT_IN filters. Returns - * `null` if there are no such filters. - */ (i, s), a = function(t, e) { - const n = new Map; - for (const s of se(e)) for (const e of de(t, s.fieldPath)) switch (e.op) { - case "==" /* EQUAL */ : - case "in" /* IN */ : - // Encode equality prefix, which is encoded in the index value before - // the inequality (e.g. `a == 'a' && b != 'b'` is encoded to - // `value != 'ab'`). - n.set(s.fieldPath.canonicalString(), e.value); - break; - - case "not-in" /* NOT_IN */ : - case "!=" /* NOT_EQUAL */ : - // NotIn/NotEqual is always a suffix. There cannot be any remaining - // segments and hence we can return early here. - return n.set(s.fieldPath.canonicalString(), e.value), Array.from(n.values()); - // Remaining filters cannot be used as notIn bounds. - } - return null; - } - /** - * Returns a lower bound of field values that can be used as a starting point to - * scan the index defined by `fieldIndex`. Returns `null` if no lower bound - * exists. - */ (i, s), u = function(t, e) { - const n = []; - let s = !0; - // For each segment, retrieve a lower bound if there is a suitable filter or - // startAt. - for (const r of se(e)) { - let e, o = !0; - // Process all filters to find a value for the current field segment - for (const n of de(t, r.fieldPath)) { - let t, s = !0; - switch (n.op) { - case "<" /* LESS_THAN */ : - case "<=" /* LESS_THAN_OR_EQUAL */ : - t = "nullValue" in (i = n.value) ? kt : "booleanValue" in i ? { - booleanValue: !1 - } : "integerValue" in i || "doubleValue" in i ? { - doubleValue: NaN - } : "timestampValue" in i ? { - timestampValue: { - seconds: Number.MIN_SAFE_INTEGER - } - } : "stringValue" in i ? { - stringValue: "" - } : "bytesValue" in i ? { - bytesValue: "" - } : "referenceValue" in i ? Ut(vt.empty(), xt.empty()) : "geoPointValue" in i ? { - geoPointValue: { - latitude: -90, - longitude: -180 - } - } : "arrayValue" in i ? { - arrayValue: {} - } : "mapValue" in i ? { - mapValue: {} - } : L(); - break; - - case "==" /* EQUAL */ : - case "in" /* IN */ : - case ">=" /* GREATER_THAN_OR_EQUAL */ : - t = n.value; - break; - - case ">" /* GREATER_THAN */ : - t = n.value, s = !1; - break; - - case "!=" /* NOT_EQUAL */ : - case "not-in" /* NOT_IN */ : - t = kt; - // Remaining filters cannot be used as lower bounds. - } - Jt(e, t) === t && (e = t, o = s); - } - // If there is a startAt bound, compare the values against the existing - // boundary to see if we can narrow the scope. - if (null !== t.startAt) for (let n = 0; n < t.orderBy.length; ++n) if (t.orderBy[n].field.isEqual(r.fieldPath)) { - const s = t.startAt.position[n]; - Jt(e, s) === s && (e = s, o = t.startAt.inclusive); - break; - } - if (void 0 === e) - // No lower bound exists - return null; - n.push(e), s && (s = o); - } - var i; - /** Returns the largest value for the given value type (exclusive). */ return new Ae(n, s); - } - /** - * Returns an upper bound of field values that can be used as an ending point - * when scanning the index defined by `fieldIndex`. Returns `null` if no - * upper bound exists. - */ (i, s), c = function(t, e) { - const n = []; - let s = !0; - // For each segment, retrieve an upper bound if there is a suitable filter or - // endAt. - for (const r of se(e)) { - let e, o = !0; - // Process all filters to find a value for the current field segment - for (const n of de(t, r.fieldPath)) { - let t, s = !0; - switch (n.op) { - case ">=" /* GREATER_THAN_OR_EQUAL */ : - case ">" /* GREATER_THAN */ : - t = "nullValue" in (i = n.value) ? { - booleanValue: !1 - } : "booleanValue" in i ? { - doubleValue: NaN - } : "integerValue" in i || "doubleValue" in i ? { - timestampValue: { - seconds: Number.MIN_SAFE_INTEGER - } - } : "timestampValue" in i ? { - stringValue: "" - } : "stringValue" in i ? { - bytesValue: "" - } : "bytesValue" in i ? Ut(vt.empty(), xt.empty()) : "referenceValue" in i ? { - geoPointValue: { - latitude: -90, - longitude: -180 - } - } : "geoPointValue" in i ? { - arrayValue: {} - } : "arrayValue" in i ? { - mapValue: {} - } : "mapValue" in i ? Nt : L(), s = !1; - break; - - case "==" /* EQUAL */ : - case "in" /* IN */ : - case "<=" /* LESS_THAN_OR_EQUAL */ : - t = n.value; - break; - - case "<" /* LESS_THAN */ : - t = n.value, s = !1; - break; - - case "!=" /* NOT_EQUAL */ : - case "not-in" /* NOT_IN */ : - t = Nt; - // Remaining filters cannot be used as upper bounds. - } - Yt(e, t) === t && (e = t, o = s); - } - // If there is a endAt bound, compare the values against the existing - // boundary to see if we can narrow the scope. - if (null !== t.endAt) for (let n = 0; n < t.orderBy.length; ++n) if (t.orderBy[n].field.isEqual(r.fieldPath)) { - const s = t.endAt.position[n]; - Yt(e, s) === s && (e = s, o = t.endAt.inclusive); - break; - } - if (void 0 === e) - // No upper bound exists - return null; - n.push(e), s && (s = o); - } - var i; - return new Ae(n, s); - }(i, s), h = this.je(s, i, u), l = this.je(s, i, c), f = this.We(s, i, a), d = this.ze(s.indexId, o, h, !!u && u.inclusive, l, !!c && c.inclusive, f); - return ui.forEach(d, (s => n.Gt(s, e.limit).next((e => { - e.forEach((e => { - t = t.add(new xt(Ls(e.documentKey))); - })); - })))); - })).next((() => t)); - } - return ui.resolve(null); - })); - } - Qe(t) { - let e = this.Ge.get(t); - return e || ( - // TODO(orquery): Implement DNF transform - e = [ t ], this.Ge.set(t, e), e); - } - /** - * Constructs a key range query on `DbIndexEntryStore` that unions all - * bounds. - */ ze(t, e, n, s, i, r, o) { - // The number of total index scans we union together. This is similar to a - // distributed normal form, but adapted for array values. We create a single - // index range per value in an ARRAY_CONTAINS or ARRAY_CONTAINS_ANY filter - // combined with the values from the query bounds. - const a = (null != e ? e.length : 1) * Math.max(null != n ? n.length : 1, null != i ? i.length : 1), u = a / (null != e ? e.length : 1), c = []; - for (let h = 0; h < a; ++h) { - const a = e ? this.He(e[h / u]) : er, l = n ? this.Je(t, a, n[h % u], s) : this.Ye(t), f = i ? this.Xe(t, a, i[h % u], r) : this.Ye(t + 1); - c.push(...this.createRange(l, f, o.map((e => this.Je(t, a, e, - /* inclusive= */ !0))))); - } - return c; - } - /** Generates the lower bound for `arrayValue` and `directionalValue`. */ Je(t, e, n, s) { - const i = new Hi(t, xt.empty(), e, n); - return s ? i : i.ke(); - } - /** Generates the upper bound for `arrayValue` and `directionalValue`. */ Xe(t, e, n, s) { - const i = new Hi(t, xt.empty(), e, n); - return s ? i.ke() : i; - } - /** - * Generates an empty bound that scopes the index scan to the current index - * and user. - */ Ye(t) { - return new Hi(t, xt.empty(), er, er); - } - getFieldIndex(t, e) { - const n = new Xi(e), s = null != e.collectionGroup ? e.collectionGroup : e.path.lastSegment(); - return this.getFieldIndexes(t, s).next((t => { - const e = t.filter((t => n.Fe(t))); - // Return the index that matches the most number of segments. - return e.sort(((t, e) => e.fields.length - t.fields.length)), e.length > 0 ? e[0] : null; - })); - } - /** - * Returns the byte encoded form of the directional values in the field index. - * Returns `null` if the document does not have all fields specified in the - * index. - */ Ze(t, e) { - const n = new zi; - for (const s of se(t)) { - const t = e.data.field(s.fieldPath); - if (null == t) return null; - const i = n.Ne(s.kind); - Ui.fe.Zt(t, i); - } - return n.Se(); - } - /** Encodes a single value to the ascending index format. */ He(t) { - const e = new zi; - return Ui.fe.Zt(t, e.Ne(0 /* ASCENDING */)), e.Se(); - } - /** - * Encodes the given field values according to the specification in `target`. - * For IN queries, a list of possible values is returned. - */ We(t, e, n) { - if (null === n) return []; - let s = []; - s.push(new zi); - let i = 0; - for (const r of se(t)) { - const t = n[i++]; - for (const n of s) if (this.tn(e, r.fieldPath) && Gt(t)) s = this.en(s, r, t); else { - const e = n.Ne(r.kind); - Ui.fe.Zt(t, e); - } - } - return this.nn(s); - } - /** - * Encodes the given bounds according to the specification in `target`. For IN - * queries, a list of possible values is returned. - */ je(t, e, n) { - return null == n ? null : this.We(t, e, n.position); - } - /** Returns the byte representation for the provided encoders. */ nn(t) { - const e = []; - for (let n = 0; n < t.length; ++n) e[n] = t[n].Se(); - return e; - } - /** - * Creates a separate encoder for each element of an array. - * - * The method appends each value to all existing encoders (e.g. filter("a", - * "==", "a1").filter("b", "in", ["b1", "b2"]) becomes ["a1,b1", "a1,b2"]). A - * list of new encoders is returned. - */ en(t, e, n) { - const s = [ ...t ], i = []; - for (const t of n.arrayValue.values || []) for (const n of s) { - const s = new zi; - s.seed(n.Se()), Ui.fe.Zt(t, s.Ne(e.kind)), i.push(s); - } - return i; - } - tn(t, e) { - return !!t.filters.find((t => t instanceof _e && t.field.isEqual(e) && ("in" /* IN */ === t.op || "not-in" /* NOT_IN */ === t.op))); - } - getFieldIndexes(t, e) { - const n = rr(t), s = or(t); - return (e ? n.Ut("collectionGroupIndex", IDBKeyRange.bound(e, e)) : n.Ut()).next((t => { - const e = []; - return ui.forEach(t, (t => s.get([ t.indexId, this.uid ]).next((n => { - e.push(function(t, e) { - const n = e ? new re(e.sequenceNumber, new oe(Di(e.readTime), new xt(Ls(e.documentKey)), e.largestBatchId)) : re.empty(), s = t.fields.map((([t, e]) => new ie(mt.fromServerFormat(t), e))); - return new ee(t.indexId, t.collectionGroup, s, n); - }(t, n)); - })))).next((() => e)); - })); - } - getNextCollectionGroupToUpdate(t) { - return this.getFieldIndexes(t).next((t => 0 === t.length ? null : (t.sort(((t, e) => { - const n = t.indexState.sequenceNumber - e.indexState.sequenceNumber; - return 0 !== n ? n : rt(t.collectionGroup, e.collectionGroup); - })), t[0].collectionGroup))); - } - updateCollectionGroup(t, e, n) { - const s = rr(t), i = or(t); - return this.sn(t).next((t => s.Ut("collectionGroupIndex", IDBKeyRange.bound(e, e)).next((e => ui.forEach(e, (e => i.put(function(t, e, n, s) { - return { - indexId: t, - uid: e.uid || "", - sequenceNumber: n, - readTime: Si(s.readTime), - documentKey: $s(s.documentKey.path), - largestBatchId: s.largestBatchId - }; - }(e.indexId, this.user, t, n)))))))); - } - updateIndexEntries(t, e) { - // Porting Note: `getFieldIndexes()` on Web does not cache index lookups as - // it could be used across different IndexedDB transactions. As any cached - // data might be invalidated by other multi-tab clients, we can only trust - // data within a single IndexedDB transaction. We therefore add a cache - // here. - const n = new Map; - return ui.forEach(e, ((e, s) => { - const i = n.get(e.collectionGroup); - return (i ? ui.resolve(i) : this.getFieldIndexes(t, e.collectionGroup)).next((i => (n.set(e.collectionGroup, i), - ui.forEach(i, (n => this.rn(t, e, n).next((e => { - const i = this.on(s, n); - return e.isEqual(i) ? ui.resolve() : this.an(t, s, e, i); - }))))))); - })); - } - un(t, e, n) { - return ir(t).put({ - indexId: n.indexId, - uid: this.uid, - arrayValue: n.arrayValue, - directionalValue: n.directionalValue, - documentKey: $s(e.key.path) - }); - } - cn(t, e, n) { - return ir(t).delete([ n.indexId, this.uid, n.arrayValue, n.directionalValue, $s(e.key.path) ]); - } - rn(t, e, n) { - const s = ir(t); - let i = new kn(Ji); - return s.Wt({ - index: "documentKeyIndex", - range: IDBKeyRange.only([ n.indexId, this.uid, $s(e.path) ]) - }, ((t, s) => { - i = i.add(new Hi(n.indexId, e, s.arrayValue, s.directionalValue)); - })).next((() => i)); - } - /** Creates the index entries for the given document. */ on(t, e) { - let n = new kn(Ji); - const s = this.Ze(e, t); - if (null == s) return n; - const i = ne(e); - if (null != i) { - const r = t.data.field(i.fieldPath); - if (Gt(r)) for (const i of r.arrayValue.values || []) n = n.add(new Hi(e.indexId, t.key, this.He(i), s)); - } else n = n.add(new Hi(e.indexId, t.key, er, s)); - return n; - } - /** - * Updates the index entries for the provided document by deleting entries - * that are no longer referenced in `newEntries` and adding all newly added - * entries. - */ an(t, e, n, s) { - O("IndexedDbIndexManager", "Updating index entries for document '%s'", e.key); - const i = []; - return function(t, e, n, s, i) { - const r = t.getIterator(), o = e.getIterator(); - let a = On(r), u = On(o); - // Walk through the two sets at the same time, using the ordering defined by - // `comparator`. - for (;a || u; ) { - let t = !1, e = !1; - if (a && u) { - const s = n(a, u); - s < 0 ? - // The element was removed if the next element in our ordered - // walkthrough is only in `before`. - e = !0 : s > 0 && ( - // The element was added if the next element in our ordered walkthrough - // is only in `after`. - t = !0); - } else null != a ? e = !0 : t = !0; - t ? (s(u), u = On(o)) : e ? (i(a), a = On(r)) : (a = On(r), u = On(o)); - } - }(n, s, Ji, ( - /* onAdd= */ n => { - i.push(this.un(t, e, n)); - }), ( - /* onRemove= */ n => { - i.push(this.cn(t, e, n)); - })), ui.waitFor(i); - } - sn(t) { - let e = 1; - return or(t).Wt({ - index: "sequenceNumberIndex", - reverse: !0, - range: IDBKeyRange.upperBound([ this.uid, Number.MAX_SAFE_INTEGER ]) - }, ((t, n, s) => { - s.done(), e = n.sequenceNumber + 1; - })).next((() => e)); - } - /** - * Returns a new set of IDB ranges that splits the existing range and excludes - * any values that match the `notInValue` from these ranges. As an example, - * '[foo > 2 && foo != 3]` becomes `[foo > 2 && < 3, foo > 3]`. - */ createRange(t, e, n) { - // The notIb values need to be sorted and unique so that we can return a - // sorted set of non-overlapping ranges. - n = n.sort(((t, e) => Ji(t, e))).filter(((t, e, n) => !e || 0 !== Ji(t, n[e - 1]))); - const s = []; - s.push(t); - for (const i of n) { - const n = Ji(i, t), r = Ji(i, e); - if (0 === n) - // `notInValue` is the lower bound. We therefore need to raise the bound - // to the next value. - s[0] = t.ke(); else if (n > 0 && r < 0) - // `notInValue` is in the middle of the range - s.push(i), s.push(i.ke()); else if (r > 0) - // `notInValue` (and all following values) are out of the range - break; - } - s.push(e); - const i = []; - for (let t = 0; t < s.length; t += 2) i.push(IDBKeyRange.bound([ s[t].indexId, this.uid, s[t].arrayValue, s[t].directionalValue, "" ], [ s[t + 1].indexId, this.uid, s[t + 1].arrayValue, s[t + 1].directionalValue, "" ])); - return i; - } -} - -/** - * Helper to get a typed SimpleDbStore for the collectionParents - * document store. - */ function sr(t) { - return pi(t, "collectionParents"); -} - -/** - * Helper to get a typed SimpleDbStore for the index entry object store. - */ function ir(t) { - return pi(t, "indexEntries"); -} - -/** - * Helper to get a typed SimpleDbStore for the index configuration object store. - */ function rr(t) { - return pi(t, "indexConfiguration"); -} - -/** - * Helper to get a typed SimpleDbStore for the index state object store. - */ function or(t) { - return pi(t, "indexState"); -} - -/** - * @license - * Copyright 2018 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ const ar = { - didRun: !1, - sequenceNumbersCollected: 0, - targetsRemoved: 0, - documentsRemoved: 0 -}; - -class ur { - constructor( - // When we attempt to collect, we will only do so if the cache size is greater than this - // threshold. Passing `COLLECTION_DISABLED` here will cause collection to always be skipped. - t, - // The percentage of sequence numbers that we will attempt to collect - e, - // A cap on the total number of sequence numbers that will be collected. This prevents - // us from collecting a huge number of sequence numbers if the cache has grown very large. - n) { - this.cacheSizeCollectionThreshold = t, this.percentileToCollect = e, this.maximumSequenceNumbersToCollect = n; - } - static withCacheSize(t) { - return new ur(t, ur.DEFAULT_COLLECTION_PERCENTILE, ur.DEFAULT_MAX_SEQUENCE_NUMBERS_TO_COLLECT); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Delete a mutation batch and the associated document mutations. - * @returns A PersistencePromise of the document mutations that were removed. - */ -function cr(t, e, n) { - const s = t.store("mutations"), i = t.store("documentMutations"), r = [], o = IDBKeyRange.only(n.batchId); - let a = 0; - const u = s.Wt({ - range: o - }, ((t, e, n) => (a++, n.delete()))); - r.push(u.next((() => { - q(1 === a); - }))); - const c = []; - for (const t of n.mutations) { - const s = Ks(e, t.key.path, n.batchId); - r.push(i.delete(s)), c.push(t.key); - } - return ui.waitFor(r).next((() => c)); -} - -/** - * Returns an approximate size for the given document. - */ function hr(t) { - if (!t) return 0; - let e; - if (t.document) e = t.document; else if (t.unknownDocument) e = t.unknownDocument; else { - if (!t.noDocument) throw L(); - e = t.noDocument; - } - return JSON.stringify(e).length; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** A mutation queue for a specific user, backed by IndexedDB. */ ur.DEFAULT_COLLECTION_PERCENTILE = 10, -ur.DEFAULT_MAX_SEQUENCE_NUMBERS_TO_COLLECT = 1e3, ur.DEFAULT = new ur(41943040, ur.DEFAULT_COLLECTION_PERCENTILE, ur.DEFAULT_MAX_SEQUENCE_NUMBERS_TO_COLLECT), -ur.DISABLED = new ur(-1, 0, 0); - -class lr { - constructor( - /** - * The normalized userId (e.g. null UID => "" userId) used to store / - * retrieve mutations. - */ - t, e, n, s) { - this.userId = t, this.M = e, this.indexManager = n, this.referenceDelegate = s, - /** - * Caches the document keys for pending mutation batches. If the mutation - * has been removed from IndexedDb, the cached value may continue to - * be used to retrieve the batch's document keys. To remove a cached value - * locally, `removeCachedMutationKeys()` should be invoked either directly - * or through `removeMutationBatches()`. - * - * With multi-tab, when the primary client acknowledges or rejects a mutation, - * this cache is used by secondary clients to invalidate the local - * view of the documents that were previously affected by the mutation. - */ - // PORTING NOTE: Multi-tab only. - this.hn = {}; - } - /** - * Creates a new mutation queue for the given user. - * @param user - The user for which to create a mutation queue. - * @param serializer - The serializer to use when persisting to IndexedDb. - */ static Yt(t, e, n, s) { - // TODO(mcg): Figure out what constraints there are on userIDs - // In particular, are there any reserved characters? are empty ids allowed? - // For the moment store these together in the same mutations table assuming - // that empty userIDs aren't allowed. - q("" !== t.uid); - const i = t.isAuthenticated() ? t.uid : ""; - return new lr(i, e, n, s); - } - checkEmpty(t) { - let e = !0; - const n = IDBKeyRange.bound([ this.userId, Number.NEGATIVE_INFINITY ], [ this.userId, Number.POSITIVE_INFINITY ]); - return dr(t).Wt({ - index: "userMutationsIndex", - range: n - }, ((t, n, s) => { - e = !1, s.done(); - })).next((() => e)); - } - addMutationBatch(t, e, n, s) { - const i = _r(t), r = dr(t); - // The IndexedDb implementation in Chrome (and Firefox) does not handle - // compound indices that include auto-generated keys correctly. To ensure - // that the index entry is added correctly in all browsers, we perform two - // writes: The first write is used to retrieve the next auto-generated Batch - // ID, and the second write populates the index and stores the actual - // mutation batch. - // See: https://bugs.chromium.org/p/chromium/issues/detail?id=701972 - // We write an empty object to obtain key - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return r.add({}).next((o => { - q("number" == typeof o); - const a = new Ii(o, e, n, s), u = function(t, e, n) { - const s = n.baseMutations.map((e => Ts(t.Jt, e))), i = n.mutations.map((e => Ts(t.Jt, e))); - return { - userId: e, - batchId: n.batchId, - localWriteTimeMs: n.localWriteTime.toMillis(), - baseMutations: s, - mutations: i - }; - }(this.M, this.userId, a), c = []; - let h = new kn(((t, e) => rt(t.canonicalString(), e.canonicalString()))); - for (const t of s) { - const e = Ks(this.userId, t.key.path, o); - h = h.add(t.key.path.popLast()), c.push(r.put(u)), c.push(i.put(e, Gs)); - } - return h.forEach((e => { - c.push(this.indexManager.addToCollectionParentIndex(t, e)); - })), t.addOnCommittedListener((() => { - this.hn[o] = a.keys(); - })), ui.waitFor(c).next((() => a)); - })); - } - lookupMutationBatch(t, e) { - return dr(t).get(e).next((t => t ? (q(t.userId === this.userId), Ci(this.M, t)) : null)); - } - /** - * Returns the document keys for the mutation batch with the given batchId. - * For primary clients, this method returns `null` after - * `removeMutationBatches()` has been called. Secondary clients return a - * cached result until `removeCachedMutationKeys()` is invoked. - */ - // PORTING NOTE: Multi-tab only. - ln(t, e) { - return this.hn[e] ? ui.resolve(this.hn[e]) : this.lookupMutationBatch(t, e).next((t => { - if (t) { - const n = t.keys(); - return this.hn[e] = n, n; - } - return null; - })); - } - getNextMutationBatchAfterBatchId(t, e) { - const n = e + 1, s = IDBKeyRange.lowerBound([ this.userId, n ]); - let i = null; - return dr(t).Wt({ - index: "userMutationsIndex", - range: s - }, ((t, e, s) => { - e.userId === this.userId && (q(e.batchId >= n), i = Ci(this.M, e)), s.done(); - })).next((() => i)); - } - getHighestUnacknowledgedBatchId(t) { - const e = IDBKeyRange.upperBound([ this.userId, Number.POSITIVE_INFINITY ]); - let n = -1; - return dr(t).Wt({ - index: "userMutationsIndex", - range: e, - reverse: !0 - }, ((t, e, s) => { - n = e.batchId, s.done(); - })).next((() => n)); - } - getAllMutationBatches(t) { - const e = IDBKeyRange.bound([ this.userId, -1 ], [ this.userId, Number.POSITIVE_INFINITY ]); - return dr(t).Ut("userMutationsIndex", e).next((t => t.map((t => Ci(this.M, t))))); - } - getAllMutationBatchesAffectingDocumentKey(t, e) { - // Scan the document-mutation index starting with a prefix starting with - // the given documentKey. - const n = Us(this.userId, e.path), s = IDBKeyRange.lowerBound(n), i = []; - return _r(t).Wt({ - range: s - }, ((n, s, r) => { - const [o, a, u] = n, c = Ls(a); - // Only consider rows matching exactly the specific key of - // interest. Note that because we order by path first, and we - // order terminators before path separators, we'll encounter all - // the index rows for documentKey contiguously. In particular, all - // the rows for documentKey will occur before any rows for - // documents nested in a subcollection beneath documentKey so we - // can stop as soon as we hit any such row. - if (o === this.userId && e.path.isEqual(c)) - // Look up the mutation batch in the store. - return dr(t).get(u).next((t => { - if (!t) throw L(); - q(t.userId === this.userId), i.push(Ci(this.M, t)); - })); - r.done(); - })).next((() => i)); - } - getAllMutationBatchesAffectingDocumentKeys(t, e) { - let n = new kn(rt); - const s = []; - return e.forEach((e => { - const i = Us(this.userId, e.path), r = IDBKeyRange.lowerBound(i), o = _r(t).Wt({ - range: r - }, ((t, s, i) => { - const [r, o, a] = t, u = Ls(o); - // Only consider rows matching exactly the specific key of - // interest. Note that because we order by path first, and we - // order terminators before path separators, we'll encounter all - // the index rows for documentKey contiguously. In particular, all - // the rows for documentKey will occur before any rows for - // documents nested in a subcollection beneath documentKey so we - // can stop as soon as we hit any such row. - r === this.userId && e.path.isEqual(u) ? n = n.add(a) : i.done(); - })); - s.push(o); - })), ui.waitFor(s).next((() => this.fn(t, n))); - } - getAllMutationBatchesAffectingQuery(t, e) { - const n = e.path, s = n.length + 1, i = Us(this.userId, n), r = IDBKeyRange.lowerBound(i); - // Collect up unique batchIDs encountered during a scan of the index. Use a - // SortedSet to accumulate batch IDs so they can be traversed in order in a - // scan of the main table. - let o = new kn(rt); - return _r(t).Wt({ - range: r - }, ((t, e, i) => { - const [r, a, u] = t, c = Ls(a); - r === this.userId && n.isPrefixOf(c) ? - // Rows with document keys more than one segment longer than the - // query path can't be matches. For example, a query on 'rooms' - // can't match the document /rooms/abc/messages/xyx. - // TODO(mcg): we'll need a different scanner when we implement - // ancestor queries. - c.length === s && (o = o.add(u)) : i.done(); - })).next((() => this.fn(t, o))); - } - fn(t, e) { - const n = [], s = []; - // TODO(rockwood): Implement this using iterate. - return e.forEach((e => { - s.push(dr(t).get(e).next((t => { - if (null === t) throw L(); - q(t.userId === this.userId), n.push(Ci(this.M, t)); - }))); - })), ui.waitFor(s).next((() => n)); - } - removeMutationBatch(t, e) { - return cr(t.Ht, this.userId, e).next((n => (t.addOnCommittedListener((() => { - this.dn(e.batchId); - })), ui.forEach(n, (e => this.referenceDelegate.markPotentiallyOrphaned(t, e)))))); - } - /** - * Clears the cached keys for a mutation batch. This method should be - * called by secondary clients after they process mutation updates. - * - * Note that this method does not have to be called from primary clients as - * the corresponding cache entries are cleared when an acknowledged or - * rejected batch is removed from the mutation queue. - */ - // PORTING NOTE: Multi-tab only - dn(t) { - delete this.hn[t]; - } - performConsistencyCheck(t) { - return this.checkEmpty(t).next((e => { - if (!e) return ui.resolve(); - // Verify that there are no entries in the documentMutations index if - // the queue is empty. - const n = IDBKeyRange.lowerBound([ this.userId ]); - const s = []; - return _r(t).Wt({ - range: n - }, ((t, e, n) => { - if (t[0] === this.userId) { - const e = Ls(t[1]); - s.push(e); - } else n.done(); - })).next((() => { - q(0 === s.length); - })); - })); - } - containsKey(t, e) { - return fr(t, this.userId, e); - } - // PORTING NOTE: Multi-tab only (state is held in memory in other clients). - /** Returns the mutation queue's metadata from IndexedDb. */ - _n(t) { - return wr(t).get(this.userId).next((t => t || { - userId: this.userId, - lastAcknowledgedBatchId: -1, - lastStreamToken: "" - })); - } -} - -/** - * @returns true if the mutation queue for the given user contains a pending - * mutation for the given key. - */ function fr(t, e, n) { - const s = Us(e, n.path), i = s[1], r = IDBKeyRange.lowerBound(s); - let o = !1; - return _r(t).Wt({ - range: r, - jt: !0 - }, ((t, n, s) => { - const [r, a, /*batchID*/ u] = t; - r === e && a === i && (o = !0), s.done(); - })).next((() => o)); -} - -/** Returns true if any mutation queue contains the given document. */ -/** - * Helper to get a typed SimpleDbStore for the mutations object store. - */ -function dr(t) { - return pi(t, "mutations"); -} - -/** - * Helper to get a typed SimpleDbStore for the mutationQueues object store. - */ function _r(t) { - return pi(t, "documentMutations"); -} - -/** - * Helper to get a typed SimpleDbStore for the mutationQueues object store. - */ function wr(t) { - return pi(t, "mutationQueues"); -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** Offset to ensure non-overlapping target ids. */ -/** - * Generates monotonically increasing target IDs for sending targets to the - * watch stream. - * - * The client constructs two generators, one for the target cache, and one for - * for the sync engine (to generate limbo documents targets). These - * generators produce non-overlapping IDs (by using even and odd IDs - * respectively). - * - * By separating the target ID space, the query cache can generate target IDs - * that persist across client restarts, while sync engine can independently - * generate in-memory target IDs that are transient and can be reused after a - * restart. - */ -class mr { - constructor(t) { - this.wn = t; - } - next() { - return this.wn += 2, this.wn; - } - static mn() { - // The target cache generator must return '2' in its first call to `next()` - // as there is no differentiation in the protocol layer between an unset - // number and the number '0'. If we were to sent a target with target ID - // '0', the backend would consider it unset and replace it with its own ID. - return new mr(0); - } - static gn() { - // Sync engine assigns target IDs for limbo document detection. - return new mr(-1); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ class gr { - constructor(t, e) { - this.referenceDelegate = t, this.M = e; - } - // PORTING NOTE: We don't cache global metadata for the target cache, since - // some of it (in particular `highestTargetId`) can be modified by secondary - // tabs. We could perhaps be more granular (and e.g. still cache - // `lastRemoteSnapshotVersion` in memory) but for simplicity we currently go - // to IndexedDb whenever we need to read metadata. We can revisit if it turns - // out to have a meaningful performance impact. - allocateTargetId(t) { - return this.yn(t).next((e => { - const n = new mr(e.highestTargetId); - return e.highestTargetId = n.next(), this.pn(t, e).next((() => e.highestTargetId)); - })); - } - getLastRemoteSnapshotVersion(t) { - return this.yn(t).next((t => ct.fromTimestamp(new ut(t.lastRemoteSnapshotVersion.seconds, t.lastRemoteSnapshotVersion.nanoseconds)))); - } - getHighestSequenceNumber(t) { - return this.yn(t).next((t => t.highestListenSequenceNumber)); - } - setTargetsMetadata(t, e, n) { - return this.yn(t).next((s => (s.highestListenSequenceNumber = e, n && (s.lastRemoteSnapshotVersion = n.toTimestamp()), - e > s.highestListenSequenceNumber && (s.highestListenSequenceNumber = e), this.pn(t, s)))); - } - addTargetData(t, e) { - return this.In(t, e).next((() => this.yn(t).next((n => (n.targetCount += 1, this.Tn(e, n), - this.pn(t, n)))))); - } - updateTargetData(t, e) { - return this.In(t, e); - } - removeTargetData(t, e) { - return this.removeMatchingKeysForTargetId(t, e.targetId).next((() => yr(t).delete(e.targetId))).next((() => this.yn(t))).next((e => (q(e.targetCount > 0), - e.targetCount -= 1, this.pn(t, e)))); - } - /** - * Drops any targets with sequence number less than or equal to the upper bound, excepting those - * present in `activeTargetIds`. Document associations for the removed targets are also removed. - * Returns the number of targets removed. - */ removeTargets(t, e, n) { - let s = 0; - const i = []; - return yr(t).Wt(((r, o) => { - const a = xi(o); - a.sequenceNumber <= e && null === n.get(a.targetId) && (s++, i.push(this.removeTargetData(t, a))); - })).next((() => ui.waitFor(i))).next((() => s)); - } - /** - * Call provided function with each `TargetData` that we have cached. - */ forEachTarget(t, e) { - return yr(t).Wt(((t, n) => { - const s = xi(n); - e(s); - })); - } - yn(t) { - return pr(t).get("targetGlobalKey").next((t => (q(null !== t), t))); - } - pn(t, e) { - return pr(t).put("targetGlobalKey", e); - } - In(t, e) { - return yr(t).put(Ni(this.M, e)); - } - /** - * In-place updates the provided metadata to account for values in the given - * TargetData. Saving is done separately. Returns true if there were any - * changes to the metadata. - */ Tn(t, e) { - let n = !1; - return t.targetId > e.highestTargetId && (e.highestTargetId = t.targetId, n = !0), - t.sequenceNumber > e.highestListenSequenceNumber && (e.highestListenSequenceNumber = t.sequenceNumber, - n = !0), n; - } - getTargetCount(t) { - return this.yn(t).next((t => t.targetCount)); - } - getTargetData(t, e) { - // Iterating by the canonicalId may yield more than one result because - // canonicalId values are not required to be unique per target. This query - // depends on the queryTargets index to be efficient. - const n = ce(e), s = IDBKeyRange.bound([ n, Number.NEGATIVE_INFINITY ], [ n, Number.POSITIVE_INFINITY ]); - let i = null; - return yr(t).Wt({ - range: s, - index: "queryTargetsIndex" - }, ((t, n, s) => { - const r = xi(n); - // After finding a potential match, check that the target is - // actually equal to the requested target. - le(e, r.target) && (i = r, s.done()); - })).next((() => i)); - } - addMatchingKeys(t, e, n) { - // PORTING NOTE: The reverse index (documentsTargets) is maintained by - // IndexedDb. - const s = [], i = Ir(t); - return e.forEach((e => { - const r = $s(e.path); - s.push(i.put({ - targetId: n, - path: r - })), s.push(this.referenceDelegate.addReference(t, n, e)); - })), ui.waitFor(s); - } - removeMatchingKeys(t, e, n) { - // PORTING NOTE: The reverse index (documentsTargets) is maintained by - // IndexedDb. - const s = Ir(t); - return ui.forEach(e, (e => { - const i = $s(e.path); - return ui.waitFor([ s.delete([ n, i ]), this.referenceDelegate.removeReference(t, n, e) ]); - })); - } - removeMatchingKeysForTargetId(t, e) { - const n = Ir(t), s = IDBKeyRange.bound([ e ], [ e + 1 ], - /*lowerOpen=*/ !1, - /*upperOpen=*/ !0); - return n.delete(s); - } - getMatchingKeysForTargetId(t, e) { - const n = IDBKeyRange.bound([ e ], [ e + 1 ], - /*lowerOpen=*/ !1, - /*upperOpen=*/ !0), s = Ir(t); - let i = Gn(); - return s.Wt({ - range: n, - jt: !0 - }, ((t, e, n) => { - const s = Ls(t[1]), r = new xt(s); - i = i.add(r); - })).next((() => i)); - } - containsKey(t, e) { - const n = $s(e.path), s = IDBKeyRange.bound([ n ], [ at(n) ], - /*lowerOpen=*/ !1, - /*upperOpen=*/ !0); - let i = 0; - return Ir(t).Wt({ - index: "documentTargetsIndex", - jt: !0, - range: s - }, (([t, e], n, s) => { - // Having a sentinel row for a document does not count as containing that document; - // For the target cache, containing the document means the document is part of some - // target. - 0 !== t && (i++, s.done()); - })).next((() => i > 0)); - } - /** - * Looks up a TargetData entry by target ID. - * - * @param targetId - The target ID of the TargetData entry to look up. - * @returns The cached TargetData entry, or null if the cache has no entry for - * the target. - */ - // PORTING NOTE: Multi-tab only. - Et(t, e) { - return yr(t).get(e).next((t => t ? xi(t) : null)); - } -} - -/** - * Helper to get a typed SimpleDbStore for the queries object store. - */ function yr(t) { - return pi(t, "targets"); -} - -/** - * Helper to get a typed SimpleDbStore for the target globals object store. - */ function pr(t) { - return pi(t, "targetGlobal"); -} - -/** - * Helper to get a typed SimpleDbStore for the document target object store. - */ function Ir(t) { - return pi(t, "targetDocuments"); -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Verifies the error thrown by a LocalStore operation. If a LocalStore - * operation fails because the primary lease has been taken by another client, - * we ignore the error (the persistence layer will immediately call - * `applyPrimaryLease` to propagate the primary state change). All other errors - * are re-thrown. - * - * @param err - An error returned by a LocalStore operation. - * @returns A Promise that resolves after we recovered, or the original error. - */ async function Tr(t) { - if (t.code !== G.FAILED_PRECONDITION || t.message !== oi) throw t; - O("LocalStore", "Unexpectedly lost primary lease"); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ function Er([t, e], [n, s]) { - const i = rt(t, n); - return 0 === i ? rt(e, s) : i; -} - -/** - * Used to calculate the nth sequence number. Keeps a rolling buffer of the - * lowest n values passed to `addElement`, and finally reports the largest of - * them in `maxValue`. - */ class Ar { - constructor(t) { - this.En = t, this.buffer = new kn(Er), this.An = 0; - } - Rn() { - return ++this.An; - } - bn(t) { - const e = [ t, this.Rn() ]; - if (this.buffer.size < this.En) this.buffer = this.buffer.add(e); else { - const t = this.buffer.last(); - Er(e, t) < 0 && (this.buffer = this.buffer.delete(t).add(e)); - } - } - get maxValue() { - // Guaranteed to be non-empty. If we decide we are not collecting any - // sequence numbers, nthSequenceNumber below short-circuits. If we have - // decided that we are collecting n sequence numbers, it's because n is some - // percentage of the existing sequence numbers. That means we should never - // be in a situation where we are collecting sequence numbers but don't - // actually have any. - return this.buffer.last()[0]; - } -} - -/** - * This class is responsible for the scheduling of LRU garbage collection. It handles checking - * whether or not GC is enabled, as well as which delay to use before the next run. - */ class Rr { - constructor(t, e) { - this.garbageCollector = t, this.asyncQueue = e, this.Pn = !1, this.Vn = null; - } - start(t) { - -1 !== this.garbageCollector.params.cacheSizeCollectionThreshold && this.vn(t); - } - stop() { - this.Vn && (this.Vn.cancel(), this.Vn = null); - } - get started() { - return null !== this.Vn; - } - vn(t) { - const e = this.Pn ? 3e5 : 6e4; - O("LruGarbageCollector", `Garbage collection scheduled in ${e}ms`), this.Vn = this.asyncQueue.enqueueAfterDelay("lru_garbage_collection" /* LruGarbageCollection */ , e, (async () => { - this.Vn = null, this.Pn = !0; - try { - await t.collectGarbage(this.garbageCollector); - } catch (t) { - di(t) ? O("LruGarbageCollector", "Ignoring IndexedDB error during garbage collection: ", t) : await Tr(t); - } - await this.vn(t); - })); - } -} - -/** Implements the steps for LRU garbage collection. */ class br { - constructor(t, e) { - this.Sn = t, this.params = e; - } - calculateTargetCount(t, e) { - return this.Sn.Dn(t).next((t => Math.floor(e / 100 * t))); - } - nthSequenceNumber(t, e) { - if (0 === e) return ui.resolve(nt.A); - const n = new Ar(e); - return this.Sn.forEachTarget(t, (t => n.bn(t.sequenceNumber))).next((() => this.Sn.Cn(t, (t => n.bn(t))))).next((() => n.maxValue)); - } - removeTargets(t, e, n) { - return this.Sn.removeTargets(t, e, n); - } - removeOrphanedDocuments(t, e) { - return this.Sn.removeOrphanedDocuments(t, e); - } - collect(t, e) { - return -1 === this.params.cacheSizeCollectionThreshold ? (O("LruGarbageCollector", "Garbage collection skipped; disabled"), - ui.resolve(ar)) : this.getCacheSize(t).next((n => n < this.params.cacheSizeCollectionThreshold ? (O("LruGarbageCollector", `Garbage collection skipped; Cache size ${n} is lower than threshold ${this.params.cacheSizeCollectionThreshold}`), - ar) : this.xn(t, e))); - } - getCacheSize(t) { - return this.Sn.getCacheSize(t); - } - xn(t, e) { - let n, s, i, r, o, u, c; - const h = Date.now(); - return this.calculateTargetCount(t, this.params.percentileToCollect).next((e => ( - // Cap at the configured max - e > this.params.maximumSequenceNumbersToCollect ? (O("LruGarbageCollector", `Capping sequence numbers to collect down to the maximum of ${this.params.maximumSequenceNumbersToCollect} from ${e}`), - s = this.params.maximumSequenceNumbersToCollect) : s = e, r = Date.now(), this.nthSequenceNumber(t, s)))).next((s => (n = s, - o = Date.now(), this.removeTargets(t, n, e)))).next((e => (i = e, u = Date.now(), - this.removeOrphanedDocuments(t, n)))).next((t => { - if (c = Date.now(), k() <= _firebase_logger__WEBPACK_IMPORTED_MODULE_2__.LogLevel.DEBUG) { - O("LruGarbageCollector", `LRU Garbage Collection\n\tCounted targets in ${r - h}ms\n\tDetermined least recently used ${s} in ` + (o - r) + "ms\n" + `\tRemoved ${i} targets in ` + (u - o) + "ms\n" + `\tRemoved ${t} documents in ` + (c - u) + "ms\n" + `Total Duration: ${c - h}ms`); - } - return ui.resolve({ - didRun: !0, - sequenceNumbersCollected: s, - targetsRemoved: i, - documentsRemoved: t - }); - })); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** Provides LRU functionality for IndexedDB persistence. */ -class Pr { - constructor(t, e) { - this.db = t, this.garbageCollector = function(t, e) { - return new br(t, e); - }(this, e); - } - Dn(t) { - const e = this.Nn(t); - return this.db.getTargetCache().getTargetCount(t).next((t => e.next((e => t + e)))); - } - Nn(t) { - let e = 0; - return this.Cn(t, (t => { - e++; - })).next((() => e)); - } - forEachTarget(t, e) { - return this.db.getTargetCache().forEachTarget(t, e); - } - Cn(t, e) { - return this.kn(t, ((t, n) => e(n))); - } - addReference(t, e, n) { - return Vr(t, n); - } - removeReference(t, e, n) { - return Vr(t, n); - } - removeTargets(t, e, n) { - return this.db.getTargetCache().removeTargets(t, e, n); - } - markPotentiallyOrphaned(t, e) { - return Vr(t, e); - } - /** - * Returns true if anything would prevent this document from being garbage - * collected, given that the document in question is not present in any - * targets and has a sequence number less than or equal to the upper bound for - * the collection run. - */ Mn(t, e) { - return function(t, e) { - let n = !1; - return wr(t).zt((s => fr(t, s, e).next((t => (t && (n = !0), ui.resolve(!t)))))).next((() => n)); - }(t, e); - } - removeOrphanedDocuments(t, e) { - const n = this.db.getRemoteDocumentCache().newChangeBuffer(), s = []; - let i = 0; - return this.kn(t, ((r, o) => { - if (o <= e) { - const e = this.Mn(t, r).next((e => { - if (!e) - // Our size accounting requires us to read all documents before - // removing them. - return i++, n.getEntry(t, r).next((() => (n.removeEntry(r, ct.min()), Ir(t).delete([ 0, $s(r.path) ])))); - })); - s.push(e); - } - })).next((() => ui.waitFor(s))).next((() => n.apply(t))).next((() => i)); - } - removeTarget(t, e) { - const n = e.withSequenceNumber(t.currentSequenceNumber); - return this.db.getTargetCache().updateTargetData(t, n); - } - updateLimboDocument(t, e) { - return Vr(t, e); - } - /** - * Call provided function for each document in the cache that is 'orphaned'. Orphaned - * means not a part of any target, so the only entry in the target-document index for - * that document will be the sentinel row (targetId 0), which will also have the sequence - * number for the last time the document was accessed. - */ kn(t, e) { - const n = Ir(t); - let s, i = nt.A; - return n.Wt({ - index: "documentTargetsIndex" - }, (([t, n], {path: r, sequenceNumber: o}) => { - 0 === t ? ( - // if nextToReport is valid, report it, this is a new key so the - // last one must not be a member of any targets. - i !== nt.A && e(new xt(Ls(s)), i), - // set nextToReport to be this sequence number. It's the next one we - // might report, if we don't find any targets for this document. - // Note that the sequence number must be defined when the targetId - // is 0. - i = o, s = r) : - // set nextToReport to be invalid, we know we don't need to report - // this one since we found a target for it. - i = nt.A; - })).next((() => { - // Since we report sequence numbers after getting to the next key, we - // need to check if the last key we iterated over was an orphaned - // document and report it. - i !== nt.A && e(new xt(Ls(s)), i); - })); - } - getCacheSize(t) { - return this.db.getRemoteDocumentCache().getSize(t); - } -} - -function Vr(t, e) { - return Ir(t).put( - /** - * @returns A value suitable for writing a sentinel row in the target-document - * store. - */ - function(t, e) { - return { - targetId: 0, - path: $s(t.path), - sequenceNumber: e - }; - }(e, t.currentSequenceNumber)); -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * An in-memory buffer of entries to be written to a RemoteDocumentCache. - * It can be used to batch up a set of changes to be written to the cache, but - * additionally supports reading entries back with the `getEntry()` method, - * falling back to the underlying RemoteDocumentCache if no entry is - * buffered. - * - * Entries added to the cache *must* be read first. This is to facilitate - * calculating the size delta of the pending changes. - * - * PORTING NOTE: This class was implemented then removed from other platforms. - * If byte-counting ends up being needed on the other platforms, consider - * porting this class as part of that implementation work. - */ class vr { - constructor() { - // A mapping of document key to the new cache entry that should be written. - this.changes = new Dn((t => t.toString()), ((t, e) => t.isEqual(e))), this.changesApplied = !1; - } - /** - * Buffers a `RemoteDocumentCache.addEntry()` call. - * - * You can only modify documents that have already been retrieved via - * `getEntry()/getEntries()` (enforced via IndexedDbs `apply()`). - */ addEntry(t) { - this.assertNotApplied(), this.changes.set(t.key, t); - } - /** - * Buffers a `RemoteDocumentCache.removeEntry()` call. - * - * You can only remove documents that have already been retrieved via - * `getEntry()/getEntries()` (enforced via IndexedDbs `apply()`). - */ removeEntry(t, e) { - this.assertNotApplied(), this.changes.set(t, te.newInvalidDocument(t).setReadTime(e)); - } - /** - * Looks up an entry in the cache. The buffered changes will first be checked, - * and if no buffered change applies, this will forward to - * `RemoteDocumentCache.getEntry()`. - * - * @param transaction - The transaction in which to perform any persistence - * operations. - * @param documentKey - The key of the entry to look up. - * @returns The cached document or an invalid document if we have nothing - * cached. - */ getEntry(t, e) { - this.assertNotApplied(); - const n = this.changes.get(e); - return void 0 !== n ? ui.resolve(n) : this.getFromCache(t, e); - } - /** - * Looks up several entries in the cache, forwarding to - * `RemoteDocumentCache.getEntry()`. - * - * @param transaction - The transaction in which to perform any persistence - * operations. - * @param documentKeys - The keys of the entries to look up. - * @returns A map of cached documents, indexed by key. If an entry cannot be - * found, the corresponding key will be mapped to an invalid document. - */ getEntries(t, e) { - return this.getAllFromCache(t, e); - } - /** - * Applies buffered changes to the underlying RemoteDocumentCache, using - * the provided transaction. - */ apply(t) { - return this.assertNotApplied(), this.changesApplied = !0, this.applyChanges(t); - } - /** Helper to assert this.changes is not null */ assertNotApplied() {} -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * The RemoteDocumentCache for IndexedDb. To construct, invoke - * `newIndexedDbRemoteDocumentCache()`. - */ class Sr { - constructor(t) { - this.M = t; - } - setIndexManager(t) { - this.indexManager = t; - } - /** - * Adds the supplied entries to the cache. - * - * All calls of `addEntry` are required to go through the RemoteDocumentChangeBuffer - * returned by `newChangeBuffer()` to ensure proper accounting of metadata. - */ addEntry(t, e, n) { - return xr(t).put(Nr(e), n); - } - /** - * Removes a document from the cache. - * - * All calls of `removeEntry` are required to go through the RemoteDocumentChangeBuffer - * returned by `newChangeBuffer()` to ensure proper accounting of metadata. - */ removeEntry(t, e) { - const n = xr(t), s = Nr(e); - return n.delete(s); - } - /** - * Updates the current cache size. - * - * Callers to `addEntry()` and `removeEntry()` *must* call this afterwards to update the - * cache's metadata. - */ updateMetadata(t, e) { - return this.getMetadata(t).next((n => (n.byteSize += e, this.On(t, n)))); - } - getEntry(t, e) { - return xr(t).get(Nr(e)).next((t => this.$n(e, t))); - } - /** - * Looks up an entry in the cache. - * - * @param documentKey - The key of the entry to look up. - * @returns The cached document entry and its size. - */ Fn(t, e) { - return xr(t).get(Nr(e)).next((t => ({ - document: this.$n(e, t), - size: hr(t) - }))); - } - getEntries(t, e) { - let n = Fn(); - return this.Bn(t, e, ((t, e) => { - const s = this.$n(t, e); - n = n.insert(t, s); - })).next((() => n)); - } - /** - * Looks up several entries in the cache. - * - * @param documentKeys - The set of keys entries to look up. - * @returns A map of documents indexed by key and a map of sizes indexed by - * key (zero if the document does not exist). - */ Ln(t, e) { - let n = Fn(), s = new Cn(xt.comparator); - return this.Bn(t, e, ((t, e) => { - const i = this.$n(t, e); - n = n.insert(t, i), s = s.insert(t, hr(e)); - })).next((() => ({ - documents: n, - qn: s - }))); - } - Bn(t, e, n) { - if (e.isEmpty()) return ui.resolve(); - const s = IDBKeyRange.bound(e.first().path.toArray(), e.last().path.toArray()), i = e.getIterator(); - let r = i.getNext(); - return xr(t).Wt({ - range: s - }, ((t, e, s) => { - const o = xt.fromSegments(t); - // Go through keys not found in cache. - for (;r && xt.comparator(r, o) < 0; ) n(r, null), r = i.getNext(); - r && r.isEqual(o) && ( - // Key found in cache. - n(r, e), r = i.hasNext() ? i.getNext() : null), - // Skip to the next key (if there is one). - r ? s.qt(r.path.toArray()) : s.done(); - })).next((() => { - // The rest of the keys are not in the cache. One case where `iterate` - // above won't go through them is when the cache is empty. - for (;r; ) n(r, null), r = i.hasNext() ? i.getNext() : null; - })); - } - getAll(t, e, n) { - let s = Fn(); - const i = e.length + 1, r = {}; - if (n.isEqual(ct.min())) { - // Documents are ordered by key, so we can use a prefix scan to narrow - // down the documents we need to match the query against. - const t = e.toArray(); - r.range = IDBKeyRange.lowerBound(t); - } else { - // Execute an index-free query and filter by read time. This is safe - // since all document changes to queries that have a - // lastLimboFreeSnapshotVersion (`sinceReadTime`) have a read time set. - const t = e.toArray(), s = Vi(n); - r.range = IDBKeyRange.lowerBound([ t, s ], - /* open= */ !0), r.index = "collectionReadTimeIndex"; - } - return xr(t).Wt(r, ((t, n, r) => { - // The query is actually returning any path that starts with the query - // path prefix which may include documents in subcollections. For - // example, a query on 'rooms' will return rooms/abc/messages/xyx but we - // shouldn't match it. Fix this by discarding rows with document keys - // more than one segment longer than the query path. - if (t.length !== i) return; - const o = this.$n(xt.fromSegments(t), n); - e.isPrefixOf(o.key.path) ? s = s.insert(o.key, o) : r.done(); - })).next((() => s)); - } - newChangeBuffer(t) { - return new Dr(this, !!t && t.trackRemovals); - } - getSize(t) { - return this.getMetadata(t).next((t => t.byteSize)); - } - getMetadata(t) { - return Cr(t).get("remoteDocumentGlobalKey").next((t => (q(!!t), t))); - } - On(t, e) { - return Cr(t).put("remoteDocumentGlobalKey", e); - } - /** - * Decodes `dbRemoteDoc` and returns the document (or an invalid document if - * the document corresponds to the format used for sentinel deletes). - */ $n(t, e) { - if (e) { - const t = bi(this.M, e); - // Whether the document is a sentinel removal and should only be used in the - // `getNewDocumentChanges()` - if (!(t.isNoDocument() && t.version.isEqual(ct.min()))) return t; - } - return te.newInvalidDocument(t); - } -} - -/** Creates a new IndexedDbRemoteDocumentCache. */ -/** - * Handles the details of adding and updating documents in the IndexedDbRemoteDocumentCache. - * - * Unlike the MemoryRemoteDocumentChangeBuffer, the IndexedDb implementation computes the size - * delta for all submitted changes. This avoids having to re-read all documents from IndexedDb - * when we apply the changes. - */ -class Dr extends vr { - /** - * @param documentCache - The IndexedDbRemoteDocumentCache to apply the changes to. - * @param trackRemovals - Whether to create sentinel deletes that can be tracked by - * `getNewDocumentChanges()`. - */ - constructor(t, e) { - super(), this.Un = t, this.trackRemovals = e, - // A map of document sizes prior to applying the changes in this buffer. - this.Kn = new Dn((t => t.toString()), ((t, e) => t.isEqual(e))); - } - applyChanges(t) { - const e = []; - let n = 0, s = new kn(((t, e) => rt(t.canonicalString(), e.canonicalString()))); - return this.changes.forEach(((i, r) => { - const o = this.Kn.get(i); - if (r.isValidDocument()) { - const a = Pi(this.Un.M, r); - s = s.add(i.path.popLast()); - const u = hr(a); - n += u - o, e.push(this.Un.addEntry(t, i, a)); - } else if (n -= o, this.trackRemovals) { - // In order to track removals, we store a "sentinel delete" in the - // RemoteDocumentCache. This entry is represented by a NoDocument - // with a version of 0 and ignored by `maybeDecodeDocument()` but - // preserved in `getNewDocumentChanges()`. - const n = Pi(this.Un.M, r.convertToNoDocument(ct.min())); - e.push(this.Un.addEntry(t, i, n)); - } else e.push(this.Un.removeEntry(t, i)); - })), s.forEach((n => { - e.push(this.Un.indexManager.addToCollectionParentIndex(t, n)); - })), e.push(this.Un.updateMetadata(t, n)), ui.waitFor(e); - } - getFromCache(t, e) { - // Record the size of everything we load from the cache so we can compute a delta later. - return this.Un.Fn(t, e).next((t => (this.Kn.set(e, t.size), t.document))); - } - getAllFromCache(t, e) { - // Record the size of everything we load from the cache so we can compute - // a delta later. - return this.Un.Ln(t, e).next((({documents: t, qn: e}) => ( - // Note: `getAllFromCache` returns two maps instead of a single map from - // keys to `DocumentSizeEntry`s. This is to allow returning the - // `MutableDocumentMap` directly, without a conversion. - e.forEach(((t, e) => { - this.Kn.set(t, e); - })), t))); - } -} - -function Cr(t) { - return pi(t, "remoteDocumentGlobal"); -} - -/** - * Helper to get a typed SimpleDbStore for the remoteDocuments object store. - */ function xr(t) { - return pi(t, "remoteDocuments"); -} - -function Nr(t) { - return t.path.toArray(); -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -// TODO(indexing): Remove this constant -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** Performs database creation and schema upgrades. */ -class kr { - constructor(t) { - this.M = t; - } - /** - * Performs database creation and schema upgrades. - * - * Note that in production, this method is only ever used to upgrade the schema - * to SCHEMA_VERSION. Different values of toVersion are only used for testing - * and local feature development. - */ kt(t, e, n, s) { - const i = new ci("createOrUpgrade", e); - n < 1 && s >= 1 && (function(t) { - t.createObjectStore("owner"); - }(t), function(t) { - t.createObjectStore("mutationQueues", { - keyPath: "userId" - }); - t.createObjectStore("mutations", { - keyPath: "batchId", - autoIncrement: !0 - }).createIndex("userMutationsIndex", qs, { - unique: !0 - }), t.createObjectStore("documentMutations"); - } - /** - * Upgrade function to migrate the 'mutations' store from V1 to V3. Loads - * and rewrites all data. - */ (t), Mr(t), function(t) { - t.createObjectStore("remoteDocuments"); - }(t)); - // Migration 2 to populate the targetGlobal object no longer needed since - // migration 3 unconditionally clears it. - let r = ui.resolve(); - return n < 3 && s >= 3 && ( - // Brand new clients don't need to drop and recreate--only clients that - // potentially have corrupt data. - 0 !== n && (!function(t) { - t.deleteObjectStore("targetDocuments"), t.deleteObjectStore("targets"), t.deleteObjectStore("targetGlobal"); - }(t), Mr(t)), r = r.next((() => - /** - * Creates the target global singleton row. - * - * @param txn - The version upgrade transaction for indexeddb - */ - function(t) { - const e = t.store("targetGlobal"), n = { - highestTargetId: 0, - highestListenSequenceNumber: 0, - lastRemoteSnapshotVersion: ct.min().toTimestamp(), - targetCount: 0 - }; - return e.put("targetGlobalKey", n); - } - /** - * Creates indices on the RemoteDocuments store used for both multi-tab - * and Index-Free queries. - */ (i)))), n < 4 && s >= 4 && (0 !== n && ( - // Schema version 3 uses auto-generated keys to generate globally unique - // mutation batch IDs (this was previously ensured internally by the - // client). To migrate to the new schema, we have to read all mutations - // and write them back out. We preserve the existing batch IDs to guarantee - // consistency with other object stores. Any further mutation batch IDs will - // be auto-generated. - r = r.next((() => function(t, e) { - return e.store("mutations").Ut().next((n => { - t.deleteObjectStore("mutations"); - t.createObjectStore("mutations", { - keyPath: "batchId", - autoIncrement: !0 - }).createIndex("userMutationsIndex", qs, { - unique: !0 - }); - const s = e.store("mutations"), i = n.map((t => s.put(t))); - return ui.waitFor(i); - })); - }(t, i)))), r = r.next((() => { - !function(t) { - t.createObjectStore("clientMetadata", { - keyPath: "clientId" - }); - }(t); - }))), n < 5 && s >= 5 && (r = r.next((() => this.Gn(i)))), n < 6 && s >= 6 && (r = r.next((() => (function(t) { - t.createObjectStore("remoteDocumentGlobal"); - }(t), this.Qn(i))))), n < 7 && s >= 7 && (r = r.next((() => this.jn(i)))), n < 8 && s >= 8 && (r = r.next((() => this.Wn(t, i)))), - n < 9 && s >= 9 && (r = r.next((() => { - // Multi-Tab used to manage its own changelog, but this has been moved - // to the DbRemoteDocument object store itself. Since the previous change - // log only contained transient data, we can drop its object store. - !function(t) { - t.objectStoreNames.contains("remoteDocumentChanges") && t.deleteObjectStore("remoteDocumentChanges"); - }(t), function(t) { - const e = t.objectStore("remoteDocuments"); - e.createIndex("readTimeIndex", "readTime", { - unique: !1 - }), e.createIndex("collectionReadTimeIndex", Qs, { - unique: !1 - }); - }(e); - }))), n < 10 && s >= 10 && (r = r.next((() => this.zn(i)))), n < 11 && s >= 11 && (r = r.next((() => { - !function(t) { - t.createObjectStore("bundles", { - keyPath: "bundleId" - }); - }(t), function(t) { - t.createObjectStore("namedQueries", { - keyPath: "name" - }); - }(t); - }))), n < 12 && s >= 12 && (r = r.next((() => { - !function(t) { - const e = t.createObjectStore("documentOverlays", { - keyPath: ti - }); - e.createIndex("collectionPathOverlayIndex", ei, { - unique: !1 - }), e.createIndex("collectionGroupOverlayIndex", ni, { - unique: !1 - }); - } - /** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ (t); - }))), n < 13 && s >= 13 && (r = r.next((() => { - !function(t) { - t.createObjectStore("indexConfiguration", { - keyPath: "indexId", - autoIncrement: !0 - }).createIndex("collectionGroupIndex", "collectionGroup", { - unique: !1 - }); - t.createObjectStore("indexState", { - keyPath: Js - }).createIndex("sequenceNumberIndex", Ys, { - unique: !1 - }); - t.createObjectStore("indexEntries", { - keyPath: Xs - }).createIndex("documentKeyIndex", Zs, { - unique: !1 - }); - }(t); - }))), r; - } - Qn(t) { - let e = 0; - return t.store("remoteDocuments").Wt(((t, n) => { - e += hr(n); - })).next((() => { - const n = { - byteSize: e - }; - return t.store("remoteDocumentGlobal").put("remoteDocumentGlobalKey", n); - })); - } - Gn(t) { - const e = t.store("mutationQueues"), n = t.store("mutations"); - return e.Ut().next((e => ui.forEach(e, (e => { - const s = IDBKeyRange.bound([ e.userId, -1 ], [ e.userId, e.lastAcknowledgedBatchId ]); - return n.Ut("userMutationsIndex", s).next((n => ui.forEach(n, (n => { - q(n.userId === e.userId); - const s = Ci(this.M, n); - return cr(t, e.userId, s).next((() => {})); - })))); - })))); - } - /** - * Ensures that every document in the remote document cache has a corresponding sentinel row - * with a sequence number. Missing rows are given the most recently used sequence number. - */ jn(t) { - const e = t.store("targetDocuments"), n = t.store("remoteDocuments"); - return t.store("targetGlobal").get("targetGlobalKey").next((t => { - const s = []; - return n.Wt(((n, i) => { - const r = new _t(n), o = function(t) { - return [ 0, $s(t) ]; - }(r); - s.push(e.get(o).next((n => n ? ui.resolve() : (n => e.put({ - targetId: 0, - path: $s(n), - sequenceNumber: t.highestListenSequenceNumber - }))(r)))); - })).next((() => ui.waitFor(s))); - })); - } - Wn(t, e) { - // Create the index. - t.createObjectStore("collectionParents", { - keyPath: Hs - }); - const n = e.store("collectionParents"), s = new tr, i = t => { - if (s.add(t)) { - const e = t.lastSegment(), s = t.popLast(); - return n.put({ - collectionId: e, - parent: $s(s) - }); - } - }; - // Helper to add an index entry iff we haven't already written it. - // Index existing remote documents. - return e.store("remoteDocuments").Wt({ - jt: !0 - }, ((t, e) => { - const n = new _t(t); - return i(n.popLast()); - })).next((() => e.store("documentMutations").Wt({ - jt: !0 - }, (([t, e, n], s) => { - const r = Ls(e); - return i(r.popLast()); - })))); - } - zn(t) { - const e = t.store("targets"); - return e.Wt(((t, n) => { - const s = xi(n), i = Ni(this.M, s); - return e.put(i); - })); - } -} - -function Mr(t) { - t.createObjectStore("targetDocuments", { - keyPath: Ws - }).createIndex("documentTargetsIndex", zs, { - unique: !0 - }); - // NOTE: This is unique only because the TargetId is the suffix. - t.createObjectStore("targets", { - keyPath: "targetId" - }).createIndex("queryTargetsIndex", js, { - unique: !0 - }), t.createObjectStore("targetGlobal"); -} - -const Or = "Failed to obtain exclusive access to the persistence layer. To allow shared access, multi-tab synchronization has to be enabled in all tabs. If you are using `experimentalForceOwningTab:true`, make sure that only one tab has persistence enabled at any given time."; - -/** - * Oldest acceptable age in milliseconds for client metadata before the client - * is considered inactive and its associated data is garbage collected. - */ -/** - * An IndexedDB-backed instance of Persistence. Data is stored persistently - * across sessions. - * - * On Web only, the Firestore SDKs support shared access to its persistence - * layer. This allows multiple browser tabs to read and write to IndexedDb and - * to synchronize state even without network connectivity. Shared access is - * currently optional and not enabled unless all clients invoke - * `enablePersistence()` with `{synchronizeTabs:true}`. - * - * In multi-tab mode, if multiple clients are active at the same time, the SDK - * will designate one client as the “primary client”. An effort is made to pick - * a visible, network-connected and active client, and this client is - * responsible for letting other clients know about its presence. The primary - * client writes a unique client-generated identifier (the client ID) to - * IndexedDb’s “owner” store every 4 seconds. If the primary client fails to - * update this entry, another client can acquire the lease and take over as - * primary. - * - * Some persistence operations in the SDK are designated as primary-client only - * operations. This includes the acknowledgment of mutations and all updates of - * remote documents. The effects of these operations are written to persistence - * and then broadcast to other tabs via LocalStorage (see - * `WebStorageSharedClientState`), which then refresh their state from - * persistence. - * - * Similarly, the primary client listens to notifications sent by secondary - * clients to discover persistence changes written by secondary clients, such as - * the addition of new mutations and query targets. - * - * If multi-tab is not enabled and another tab already obtained the primary - * lease, IndexedDbPersistence enters a failed state and all subsequent - * operations will automatically fail. - * - * Additionally, there is an optimization so that when a tab is closed, the - * primary lease is released immediately (this is especially important to make - * sure that a refreshed tab is able to immediately re-acquire the primary - * lease). Unfortunately, IndexedDB cannot be reliably used in window.unload - * since it is an asynchronous API. So in addition to attempting to give up the - * lease, the leaseholder writes its client ID to a "zombiedClient" entry in - * LocalStorage which acts as an indicator that another tab should go ahead and - * take the primary lease immediately regardless of the current lease timestamp. - * - * TODO(b/114226234): Remove `synchronizeTabs` section when multi-tab is no - * longer optional. - */ -class $r { - constructor( - /** - * Whether to synchronize the in-memory state of multiple tabs and share - * access to local persistence. - */ - t, e, n, s, i, r, o, a, u, - /** - * If set to true, forcefully obtains database access. Existing tabs will - * no longer be able to access IndexedDB. - */ - c, h = 12) { - if (this.allowTabSynchronization = t, this.persistenceKey = e, this.clientId = n, - this.Hn = i, this.window = r, this.document = o, this.Jn = u, this.Yn = c, this.Xn = h, - this.Zn = null, this.ts = !1, this.isPrimary = !1, this.networkEnabled = !0, - /** Our window.unload handler, if registered. */ - this.es = null, this.inForeground = !1, - /** Our 'visibilitychange' listener if registered. */ - this.ns = null, - /** The client metadata refresh task. */ - this.ss = null, - /** The last time we garbage collected the client metadata object store. */ - this.rs = Number.NEGATIVE_INFINITY, - /** A listener to notify on primary state changes. */ - this.os = t => Promise.resolve(), !$r.vt()) throw new Q(G.UNIMPLEMENTED, "This platform is either missing IndexedDB or is known to have an incomplete implementation. Offline persistence has been disabled."); - this.referenceDelegate = new Pr(this, s), this.us = e + "main", this.M = new Ri(a), - this.cs = new hi(this.us, this.Xn, new kr(this.M)), this.hs = new gr(this.referenceDelegate, this.M), - this.ls = function(t) { - return new Sr(t); - } - /** - * Returns the set of documents that have changed since the specified read - * time. - */ - // PORTING NOTE: This is only used for multi-tab synchronization. - (this.M), this.fs = new $i, this.window && this.window.localStorage ? this.ds = this.window.localStorage : (this.ds = null, - !1 === c && $("IndexedDbPersistence", "LocalStorage is unavailable. As a result, persistence may not work reliably. In particular enablePersistence() could fail immediately after refreshing the page.")); - } - /** - * Attempt to start IndexedDb persistence. - * - * @returns Whether persistence was enabled. - */ start() { - // NOTE: This is expected to fail sometimes (in the case of another tab - // already having the persistence lock), so it's the first thing we should - // do. - return this._s().then((() => { - if (!this.isPrimary && !this.allowTabSynchronization) - // Fail `start()` if `synchronizeTabs` is disabled and we cannot - // obtain the primary lease. - throw new Q(G.FAILED_PRECONDITION, Or); - return this.ws(), this.gs(), this.ys(), this.runTransaction("getHighestListenSequenceNumber", "readonly", (t => this.hs.getHighestSequenceNumber(t))); - })).then((t => { - this.Zn = new nt(t, this.Jn); - })).then((() => { - this.ts = !0; - })).catch((t => (this.cs && this.cs.close(), Promise.reject(t)))); - } - /** - * Registers a listener that gets called when the primary state of the - * instance changes. Upon registering, this listener is invoked immediately - * with the current primary state. - * - * PORTING NOTE: This is only used for Web multi-tab. - */ ps(t) { - return this.os = async e => { - if (this.started) return t(e); - }, t(this.isPrimary); - } - /** - * Registers a listener that gets called when the database receives a - * version change event indicating that it has deleted. - * - * PORTING NOTE: This is only used for Web multi-tab. - */ setDatabaseDeletedListener(t) { - this.cs.Ot((async e => { - // Check if an attempt is made to delete IndexedDB. - null === e.newVersion && await t(); - })); - } - /** - * Adjusts the current network state in the client's metadata, potentially - * affecting the primary lease. - * - * PORTING NOTE: This is only used for Web multi-tab. - */ setNetworkEnabled(t) { - this.networkEnabled !== t && (this.networkEnabled = t, - // Schedule a primary lease refresh for immediate execution. The eventual - // lease update will be propagated via `primaryStateListener`. - this.Hn.enqueueAndForget((async () => { - this.started && await this._s(); - }))); - } - /** - * Updates the client metadata in IndexedDb and attempts to either obtain or - * extend the primary lease for the local client. Asynchronously notifies the - * primary state listener if the client either newly obtained or released its - * primary lease. - */ _s() { - return this.runTransaction("updateClientMetadataAndTryBecomePrimary", "readwrite", (t => Br(t).put({ - clientId: this.clientId, - updateTimeMs: Date.now(), - networkEnabled: this.networkEnabled, - inForeground: this.inForeground - }).next((() => { - if (this.isPrimary) return this.Is(t).next((t => { - t || (this.isPrimary = !1, this.Hn.enqueueRetryable((() => this.os(!1)))); - })); - })).next((() => this.Ts(t))).next((e => this.isPrimary && !e ? this.Es(t).next((() => !1)) : !!e && this.As(t).next((() => !0)))))).catch((t => { - if (di(t)) - // Proceed with the existing state. Any subsequent access to - // IndexedDB will verify the lease. - return O("IndexedDbPersistence", "Failed to extend owner lease: ", t), this.isPrimary; - if (!this.allowTabSynchronization) throw t; - return O("IndexedDbPersistence", "Releasing owner lease after error during lease refresh", t), - /* isPrimary= */ !1; - })).then((t => { - this.isPrimary !== t && this.Hn.enqueueRetryable((() => this.os(t))), this.isPrimary = t; - })); - } - Is(t) { - return Fr(t).get("owner").next((t => ui.resolve(this.Rs(t)))); - } - bs(t) { - return Br(t).delete(this.clientId); - } - /** - * If the garbage collection threshold has passed, prunes the - * RemoteDocumentChanges and the ClientMetadata store based on the last update - * time of all clients. - */ async Ps() { - if (this.isPrimary && !this.Vs(this.rs, 18e5)) { - this.rs = Date.now(); - const t = await this.runTransaction("maybeGarbageCollectMultiClientState", "readwrite-primary", (t => { - const e = pi(t, "clientMetadata"); - return e.Ut().next((t => { - const n = this.vs(t, 18e5), s = t.filter((t => -1 === n.indexOf(t))); - // Delete metadata for clients that are no longer considered active. - return ui.forEach(s, (t => e.delete(t.clientId))).next((() => s)); - })); - })).catch((() => [])); - // Delete potential leftover entries that may continue to mark the - // inactive clients as zombied in LocalStorage. - // Ideally we'd delete the IndexedDb and LocalStorage zombie entries for - // the client atomically, but we can't. So we opt to delete the IndexedDb - // entries first to avoid potentially reviving a zombied client. - if (this.ds) for (const e of t) this.ds.removeItem(this.Ss(e.clientId)); - } - } - /** - * Schedules a recurring timer to update the client metadata and to either - * extend or acquire the primary lease if the client is eligible. - */ ys() { - this.ss = this.Hn.enqueueAfterDelay("client_metadata_refresh" /* ClientMetadataRefresh */ , 4e3, (() => this._s().then((() => this.Ps())).then((() => this.ys())))); - } - /** Checks whether `client` is the local client. */ Rs(t) { - return !!t && t.ownerId === this.clientId; - } - /** - * Evaluate the state of all active clients and determine whether the local - * client is or can act as the holder of the primary lease. Returns whether - * the client is eligible for the lease, but does not actually acquire it. - * May return 'false' even if there is no active leaseholder and another - * (foreground) client should become leaseholder instead. - */ Ts(t) { - if (this.Yn) return ui.resolve(!0); - return Fr(t).get("owner").next((e => { - // A client is eligible for the primary lease if: - // - its network is enabled and the client's tab is in the foreground. - // - its network is enabled and no other client's tab is in the - // foreground. - // - every clients network is disabled and the client's tab is in the - // foreground. - // - every clients network is disabled and no other client's tab is in - // the foreground. - // - the `forceOwningTab` setting was passed in. - if (null !== e && this.Vs(e.leaseTimestampMs, 5e3) && !this.Ds(e.ownerId)) { - if (this.Rs(e) && this.networkEnabled) return !0; - if (!this.Rs(e)) { - if (!e.allowTabSynchronization) - // Fail the `canActAsPrimary` check if the current leaseholder has - // not opted into multi-tab synchronization. If this happens at - // client startup, we reject the Promise returned by - // `enablePersistence()` and the user can continue to use Firestore - // with in-memory persistence. - // If this fails during a lease refresh, we will instead block the - // AsyncQueue from executing further operations. Note that this is - // acceptable since mixing & matching different `synchronizeTabs` - // settings is not supported. - // TODO(b/114226234): Remove this check when `synchronizeTabs` can - // no longer be turned off. - throw new Q(G.FAILED_PRECONDITION, Or); - return !1; - } - } - return !(!this.networkEnabled || !this.inForeground) || Br(t).Ut().next((t => void 0 === this.vs(t, 5e3).find((t => { - if (this.clientId !== t.clientId) { - const e = !this.networkEnabled && t.networkEnabled, n = !this.inForeground && t.inForeground, s = this.networkEnabled === t.networkEnabled; - if (e || n && s) return !0; - } - return !1; - })))); - })).next((t => (this.isPrimary !== t && O("IndexedDbPersistence", `Client ${t ? "is" : "is not"} eligible for a primary lease.`), - t))); - } - async shutdown() { - // The shutdown() operations are idempotent and can be called even when - // start() aborted (e.g. because it couldn't acquire the persistence lease). - this.ts = !1, this.Cs(), this.ss && (this.ss.cancel(), this.ss = null), this.xs(), - this.Ns(), - // Use `SimpleDb.runTransaction` directly to avoid failing if another tab - // has obtained the primary lease. - await this.cs.runTransaction("shutdown", "readwrite", [ "owner", "clientMetadata" ], (t => { - const e = new yi(t, nt.A); - return this.Es(e).next((() => this.bs(e))); - })), this.cs.close(), - // Remove the entry marking the client as zombied from LocalStorage since - // we successfully deleted its metadata from IndexedDb. - this.ks(); - } - /** - * Returns clients that are not zombied and have an updateTime within the - * provided threshold. - */ vs(t, e) { - return t.filter((t => this.Vs(t.updateTimeMs, e) && !this.Ds(t.clientId))); - } - /** - * Returns the IDs of the clients that are currently active. If multi-tab - * is not supported, returns an array that only contains the local client's - * ID. - * - * PORTING NOTE: This is only used for Web multi-tab. - */ Ms() { - return this.runTransaction("getActiveClients", "readonly", (t => Br(t).Ut().next((t => this.vs(t, 18e5).map((t => t.clientId)))))); - } - get started() { - return this.ts; - } - getMutationQueue(t, e) { - return lr.Yt(t, this.M, e, this.referenceDelegate); - } - getTargetCache() { - return this.hs; - } - getRemoteDocumentCache() { - return this.ls; - } - getIndexManager(t) { - return new nr(t); - } - getDocumentOverlayCache(t) { - return Li.Yt(this.M, t); - } - getBundleCache() { - return this.fs; - } - runTransaction(t, e, n) { - O("IndexedDbPersistence", "Starting transaction:", t); - const s = "readonly" === e ? "readonly" : "readwrite", i = 13 === (r = this.Xn) ? ri : 12 === r ? ii : 11 === r ? si : void L(); - /** Returns the object stores for the provided schema. */ - var r; - let o; - // Do all transactions as readwrite against all object stores, since we - // are the only reader/writer. - return this.cs.runTransaction(t, s, i, (s => (o = new yi(s, this.Zn ? this.Zn.next() : nt.A), - "readwrite-primary" === e ? this.Is(o).next((t => !!t || this.Ts(o))).next((e => { - if (!e) throw $(`Failed to obtain primary lease for action '${t}'.`), this.isPrimary = !1, - this.Hn.enqueueRetryable((() => this.os(!1))), new Q(G.FAILED_PRECONDITION, oi); - return n(o); - })).next((t => this.As(o).next((() => t)))) : this.Os(o).next((() => n(o)))))).then((t => (o.raiseOnCommittedEvent(), - t))); - } - /** - * Verifies that the current tab is the primary leaseholder or alternatively - * that the leaseholder has opted into multi-tab synchronization. - */ - // TODO(b/114226234): Remove this check when `synchronizeTabs` can no longer - // be turned off. - Os(t) { - return Fr(t).get("owner").next((t => { - if (null !== t && this.Vs(t.leaseTimestampMs, 5e3) && !this.Ds(t.ownerId) && !this.Rs(t) && !(this.Yn || this.allowTabSynchronization && t.allowTabSynchronization)) throw new Q(G.FAILED_PRECONDITION, Or); - })); - } - /** - * Obtains or extends the new primary lease for the local client. This - * method does not verify that the client is eligible for this lease. - */ As(t) { - const e = { - ownerId: this.clientId, - allowTabSynchronization: this.allowTabSynchronization, - leaseTimestampMs: Date.now() - }; - return Fr(t).put("owner", e); - } - static vt() { - return hi.vt(); - } - /** Checks the primary lease and removes it if we are the current primary. */ Es(t) { - const e = Fr(t); - return e.get("owner").next((t => this.Rs(t) ? (O("IndexedDbPersistence", "Releasing primary lease."), - e.delete("owner")) : ui.resolve())); - } - /** Verifies that `updateTimeMs` is within `maxAgeMs`. */ Vs(t, e) { - const n = Date.now(); - return !(t < n - e) && (!(t > n) || ($(`Detected an update time that is in the future: ${t} > ${n}`), - !1)); - } - ws() { - null !== this.document && "function" == typeof this.document.addEventListener && (this.ns = () => { - this.Hn.enqueueAndForget((() => (this.inForeground = "visible" === this.document.visibilityState, - this._s()))); - }, this.document.addEventListener("visibilitychange", this.ns), this.inForeground = "visible" === this.document.visibilityState); - } - xs() { - this.ns && (this.document.removeEventListener("visibilitychange", this.ns), this.ns = null); - } - /** - * Attaches a window.unload handler that will synchronously write our - * clientId to a "zombie client id" location in LocalStorage. This can be used - * by tabs trying to acquire the primary lease to determine that the lease - * is no longer valid even if the timestamp is recent. This is particularly - * important for the refresh case (so the tab correctly re-acquires the - * primary lease). LocalStorage is used for this rather than IndexedDb because - * it is a synchronous API and so can be used reliably from an unload - * handler. - */ gs() { - var t; - "function" == typeof (null === (t = this.window) || void 0 === t ? void 0 : t.addEventListener) && (this.es = () => { - // Note: In theory, this should be scheduled on the AsyncQueue since it - // accesses internal state. We execute this code directly during shutdown - // to make sure it gets a chance to run. - this.Cs(), (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.isSafari)() && navigator.appVersion.match(/Version\/1[45]/) && - // On Safari 14 and 15, we do not run any cleanup actions as it might - // trigger a bug that prevents Safari from re-opening IndexedDB during - // the next page load. - // See https://bugs.webkit.org/show_bug.cgi?id=226547 - this.Hn.enterRestrictedMode(/* purgeExistingTasks= */ !0), this.Hn.enqueueAndForget((() => this.shutdown())); - }, this.window.addEventListener("pagehide", this.es)); - } - Ns() { - this.es && (this.window.removeEventListener("pagehide", this.es), this.es = null); - } - /** - * Returns whether a client is "zombied" based on its LocalStorage entry. - * Clients become zombied when their tab closes without running all of the - * cleanup logic in `shutdown()`. - */ Ds(t) { - var e; - try { - const n = null !== (null === (e = this.ds) || void 0 === e ? void 0 : e.getItem(this.Ss(t))); - return O("IndexedDbPersistence", `Client '${t}' ${n ? "is" : "is not"} zombied in LocalStorage`), - n; - } catch (t) { - // Gracefully handle if LocalStorage isn't working. - return $("IndexedDbPersistence", "Failed to get zombied client id.", t), !1; - } - } - /** - * Record client as zombied (a client that had its tab closed). Zombied - * clients are ignored during primary tab selection. - */ Cs() { - if (this.ds) try { - this.ds.setItem(this.Ss(this.clientId), String(Date.now())); - } catch (t) { - // Gracefully handle if LocalStorage isn't available / working. - $("Failed to set zombie client id.", t); - } - } - /** Removes the zombied client entry if it exists. */ ks() { - if (this.ds) try { - this.ds.removeItem(this.Ss(this.clientId)); - } catch (t) { - // Ignore - } - } - Ss(t) { - return `firestore_zombie_${this.persistenceKey}_${t}`; - } -} - -/** - * Helper to get a typed SimpleDbStore for the primary client object store. - */ function Fr(t) { - return pi(t, "owner"); -} - -/** - * Helper to get a typed SimpleDbStore for the client metadata object store. - */ function Br(t) { - return pi(t, "clientMetadata"); -} - -/** - * Generates a string used as a prefix when storing data in IndexedDB and - * LocalStorage. - */ function Lr(t, e) { - // Use two different prefix formats: - // * firestore / persistenceKey / projectID . databaseID / ... - // * firestore / persistenceKey / projectID / ... - // projectIDs are DNS-compatible names and cannot contain dots - // so there's no danger of collisions. - let n = t.projectId; - return t.isDefaultDatabase || (n += "." + t.database), "firestore/" + e + "/" + n + "/"; -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -class qr { - constructor(t, e) { - this.progress = t, this.$s = e; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A readonly view of the local state of all documents we're tracking (i.e. we - * have a cached version in remoteDocumentCache or local mutations for the - * document). The view is computed by applying the mutations in the - * MutationQueue to the RemoteDocumentCache. - */ class Ur { - constructor(t, e, n) { - this.ls = t, this.Fs = e, this.indexManager = n; - } - /** - * Get the local view of the document identified by `key`. - * - * @returns Local view of the document or null if we don't have any cached - * state for it. - */ Bs(t, e) { - return this.Fs.getAllMutationBatchesAffectingDocumentKey(t, e).next((n => this.Ls(t, e, n))); - } - /** Internal version of `getDocument` that allows reusing batches. */ Ls(t, e, n) { - return this.ls.getEntry(t, e).next((t => { - for (const e of n) e.applyToLocalView(t); - return t; - })); - } - // Returns the view of the given `docs` as they would appear after applying - // all mutations in the given `batches`. - qs(t, e) { - t.forEach(((t, n) => { - for (const t of e) t.applyToLocalView(n); - })); - } - /** - * Gets the local view of the documents identified by `keys`. - * - * If we don't have cached state for a document in `keys`, a NoDocument will - * be stored for that key in the resulting set. - */ Us(t, e) { - return this.ls.getEntries(t, e).next((e => this.Ks(t, e).next((() => e)))); - } - /** - * Applies the local view the given `baseDocs` without retrieving documents - * from the local store. - */ Ks(t, e) { - return this.Fs.getAllMutationBatchesAffectingDocumentKeys(t, e).next((t => this.qs(e, t))); - } - /** - * Performs a query against the local view of all documents. - * - * @param transaction - The persistence transaction. - * @param query - The query to match documents against. - * @param sinceReadTime - If not set to SnapshotVersion.min(), return only - * documents that have been read since this snapshot version (exclusive). - */ Gs(t, e, n) { - /** - * Returns whether the query matches a single document by path (rather than a - * collection). - */ - return function(t) { - return xt.isDocumentKey(t.path) && null === t.collectionGroup && 0 === t.filters.length; - }(e) ? this.Qs(t, e.path) : Me(e) ? this.js(t, e, n) : this.Ws(t, e, n); - } - Qs(t, e) { - // Just do a simple document lookup. - return this.Bs(t, new xt(e)).next((t => { - let e = Ln(); - return t.isFoundDocument() && (e = e.insert(t.key, t)), e; - })); - } - js(t, e, n) { - const s = e.collectionGroup; - let i = Ln(); - return this.indexManager.getCollectionParents(t, s).next((r => ui.forEach(r, (r => { - const o = function(t, e) { - return new ve(e, - /*collectionGroup=*/ null, t.explicitOrderBy.slice(), t.filters.slice(), t.limit, t.limitType, t.startAt, t.endAt); - } - /** - * Returns true if this query does not specify any query constraints that - * could remove results. - */ (e, r.child(s)); - return this.Ws(t, o, n).next((t => { - t.forEach(((t, e) => { - i = i.insert(t, e); - })); - })); - })).next((() => i)))); - } - Ws(t, e, n) { - // Query the remote documents and overlay mutations. - let s; - return this.ls.getAll(t, e.path, n).next((n => (s = n, this.Fs.getAllMutationBatchesAffectingQuery(t, e)))).next((t => { - for (const e of t) for (const t of e.mutations) { - const n = t.key; - let i = s.get(n); - null == i && ( - // Create invalid document to apply mutations on top of - i = te.newInvalidDocument(n), s = s.insert(n, i)), _n(t, i, e.localWriteTime), i.isFoundDocument() || (s = s.remove(n)); - } - })).next((() => ( - // Finally, filter out any documents that don't actually match - // the query. - s.forEach(((t, n) => { - Ue(e, n) || (s = s.remove(t)); - })), s))); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A set of changes to what documents are currently in view and out of view for - * a given query. These changes are sent to the LocalStore by the View (via - * the SyncEngine) and are used to pin / unpin documents as appropriate. - */ class Kr { - constructor(t, e, n, s) { - this.targetId = t, this.fromCache = e, this.zs = n, this.Hs = s; - } - static Js(t, e) { - let n = Gn(), s = Gn(); - for (const t of e.docChanges) switch (t.type) { - case 0 /* Added */ : - n = n.add(t.doc.key); - break; - - case 1 /* Removed */ : - s = s.add(t.doc.key); - // do nothing - } - return new Kr(t, e.fromCache, n, s); - } -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A query engine that takes advantage of the target document mapping in the - * QueryCache. Query execution is optimized by only reading the documents that - * previously matched a query plus any documents that were edited after the - * query was last listened to. - * - * There are some cases when this optimization is not guaranteed to produce - * the same results as full collection scans. In these cases, query - * processing falls back to full scans. These cases are: - * - * - Limit queries where a document that matched the query previously no longer - * matches the query. - * - * - Limit queries where a document edit may cause the document to sort below - * another document that is in the local cache. - * - * - Queries that have never been CURRENT or free of limbo documents. - */ class Gr { - /** Sets the document view to query against. */ - Ys(t) { - this.Xs = t; - } - /** Returns all local documents matching the specified query. */ Gs(t, e, n, s) { - // Queries that match all documents don't benefit from using - // key-based lookups. It is more efficient to scan all documents in a - // collection, rather than to perform individual lookups. - return function(t) { - return 0 === t.filters.length && null === t.limit && null == t.startAt && null == t.endAt && (0 === t.explicitOrderBy.length || 1 === t.explicitOrderBy.length && t.explicitOrderBy[0].field.isKeyField()); - }(e) || n.isEqual(ct.min()) ? this.Zs(t, e) : this.Xs.Us(t, s).next((i => { - const r = this.ti(e, i); - return (Ce(e) || xe(e)) && this.ei(e.limitType, r, s, n) ? this.Zs(t, e) : (k() <= _firebase_logger__WEBPACK_IMPORTED_MODULE_2__.LogLevel.DEBUG && O("QueryEngine", "Re-using previous result from %s to execute query: %s", n.toString(), qe(e)), - this.Xs.Gs(t, e, n).next((t => ( - // We merge `previousResults` into `updateResults`, since - // `updateResults` is already a DocumentMap. If a document is - // contained in both lists, then its contents are the same. - r.forEach((e => { - t = t.insert(e.key, e); - })), t)))); - })); - // Queries that have never seen a snapshot without limbo free documents - // should also be run as a full collection scan. - } - /** Applies the query filter and sorting to the provided documents. */ ti(t, e) { - // Sort the documents and re-apply the query filter since previously - // matching documents do not necessarily still match the query. - let n = new kn(Ke(t)); - return e.forEach(((e, s) => { - Ue(t, s) && (n = n.add(s)); - })), n; - } - /** - * Determines if a limit query needs to be refilled from cache, making it - * ineligible for index-free execution. - * - * @param sortedPreviousResults - The documents that matched the query when it - * was last synchronized, sorted by the query's comparator. - * @param remoteKeys - The document keys that matched the query at the last - * snapshot. - * @param limboFreeSnapshotVersion - The version of the snapshot when the - * query was last synchronized. - */ ei(t, e, n, s) { - // The query needs to be refilled if a previously matching document no - // longer matches. - if (n.size !== e.size) return !0; - // Limit queries are not eligible for index-free query execution if there is - // a potential that an older document from cache now sorts before a document - // that was previously part of the limit. This, however, can only happen if - // the document at the edge of the limit goes out of limit. - // If a document that is not the limit boundary sorts differently, - // the boundary of the limit itself did not change and documents from cache - // will continue to be "rejected" by this boundary. Therefore, we can ignore - // any modifications that don't affect the last document. - const i = "F" /* First */ === t ? e.last() : e.first(); - return !!i && (i.hasPendingWrites || i.version.compareTo(s) > 0); - } - Zs(t, e) { - return k() <= _firebase_logger__WEBPACK_IMPORTED_MODULE_2__.LogLevel.DEBUG && O("QueryEngine", "Using full collection scan to execute query:", qe(e)), - this.Xs.Gs(t, e, ct.min()); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Implements `LocalStore` interface. - * - * Note: some field defined in this class might have public access level, but - * the class is not exported so they are only accessible from this module. - * This is useful to implement optional features (like bundles) in free - * functions, such that they are tree-shakeable. - */ -class Qr { - constructor( - /** Manages our in-memory or durable persistence. */ - t, e, n, s) { - this.persistence = t, this.ni = e, this.M = s, - /** - * Maps a targetID to data about its target. - * - * PORTING NOTE: We are using an immutable data structure on Web to make re-runs - * of `applyRemoteEvent()` idempotent. - */ - this.si = new Cn(rt), - /** Maps a target to its targetID. */ - // TODO(wuandy): Evaluate if TargetId can be part of Target. - this.ii = new Dn((t => ce(t)), le), - /** - * The read time of the last entry processed by `getNewDocumentChanges()`. - * - * PORTING NOTE: This is only used for multi-tab synchronization. - */ - this.ri = ct.min(), this.oi = t.getRemoteDocumentCache(), this.hs = t.getTargetCache(), - this.fs = t.getBundleCache(), this.ai(n); - } - ai(t) { - // TODO(indexing): Add spec tests that test these components change after a - // user change - this.indexManager = this.persistence.getIndexManager(t), this.Fs = this.persistence.getMutationQueue(t, this.indexManager), - this.ui = new Ur(this.oi, this.Fs, this.indexManager), this.oi.setIndexManager(this.indexManager), - this.ni.Ys(this.ui); - } - collectGarbage(t) { - return this.persistence.runTransaction("Collect garbage", "readwrite-primary", (e => t.collect(e, this.si))); - } -} - -function jr( -/** Manages our in-memory or durable persistence. */ -t, e, n, s) { - return new Qr(t, e, n, s); -} - -/** - * Tells the LocalStore that the currently authenticated user has changed. - * - * In response the local store switches the mutation queue to the new user and - * returns any resulting document changes. - */ -// PORTING NOTE: Android and iOS only return the documents affected by the -// change. -async function Wr(t, e) { - const n = K(t); - return await n.persistence.runTransaction("Handle user change", "readonly", (t => { - // Swap out the mutation queue, grabbing the pending mutation batches - // before and after. - let s; - return n.Fs.getAllMutationBatches(t).next((i => (s = i, n.ai(e), n.Fs.getAllMutationBatches(t)))).next((e => { - const i = [], r = []; - // Union the old/new changed keys. - let o = Gn(); - for (const t of s) { - i.push(t.batchId); - for (const e of t.mutations) o = o.add(e.key); - } - for (const t of e) { - r.push(t.batchId); - for (const e of t.mutations) o = o.add(e.key); - } - // Return the set of all (potentially) changed documents and the list - // of mutation batch IDs that were affected by change. - return n.ui.Us(t, o).next((t => ({ - ci: t, - removedBatchIds: i, - addedBatchIds: r - }))); - })); - })); -} - -/* Accepts locally generated Mutations and commit them to storage. */ -/** - * Acknowledges the given batch. - * - * On the happy path when a batch is acknowledged, the local store will - * - * + remove the batch from the mutation queue; - * + apply the changes to the remote document cache; - * + recalculate the latency compensated view implied by those changes (there - * may be mutations in the queue that affect the documents but haven't been - * acknowledged yet); and - * + give the changed documents back the sync engine - * - * @returns The resulting (modified) documents. - */ -function zr(t, e) { - const n = K(t); - return n.persistence.runTransaction("Acknowledge batch", "readwrite-primary", (t => { - const s = e.batch.keys(), i = n.oi.newChangeBuffer({ - trackRemovals: !0 - }); - return function(t, e, n, s) { - const i = n.batch, r = i.keys(); - let o = ui.resolve(); - return r.forEach((t => { - o = o.next((() => s.getEntry(e, t))).next((e => { - const r = n.docVersions.get(t); - q(null !== r), e.version.compareTo(r) < 0 && (i.applyToRemoteDocument(e, n), e.isValidDocument() && ( - // We use the commitVersion as the readTime rather than the - // document's updateTime since the updateTime is not advanced - // for updates that do not modify the underlying document. - e.setReadTime(n.commitVersion), s.addEntry(e))); - })); - })), o.next((() => t.Fs.removeMutationBatch(e, i))); - } - /** Returns the local view of the documents affected by a mutation batch. */ - // PORTING NOTE: Multi-Tab only. - (n, t, e, i).next((() => i.apply(t))).next((() => n.Fs.performConsistencyCheck(t))).next((() => n.ui.Us(t, s))); - })); -} - -/** - * Removes mutations from the MutationQueue for the specified batch; - * LocalDocuments will be recalculated. - * - * @returns The resulting modified documents. - */ -/** - * Returns the last consistent snapshot processed (used by the RemoteStore to - * determine whether to buffer incoming snapshots from the backend). - */ -function Hr(t) { - const e = K(t); - return e.persistence.runTransaction("Get last remote snapshot version", "readonly", (t => e.hs.getLastRemoteSnapshotVersion(t))); -} - -/** - * Updates the "ground-state" (remote) documents. We assume that the remote - * event reflects any write batches that have been acknowledged or rejected - * (i.e. we do not re-apply local mutations to updates from this event). - * - * LocalDocuments are re-calculated if there are remaining mutations in the - * queue. - */ function Jr(t, e) { - const n = K(t), s = e.snapshotVersion; - let i = n.si; - return n.persistence.runTransaction("Apply remote event", "readwrite-primary", (t => { - const r = n.oi.newChangeBuffer({ - trackRemovals: !0 - }); - // Reset newTargetDataByTargetMap in case this transaction gets re-run. - i = n.si; - const o = []; - e.targetChanges.forEach(((r, a) => { - const u = i.get(a); - if (!u) return; - // Only update the remote keys if the target is still active. This - // ensures that we can persist the updated target data along with - // the updated assignment. - o.push(n.hs.removeMatchingKeys(t, r.removedDocuments, a).next((() => n.hs.addMatchingKeys(t, r.addedDocuments, a)))); - let c = u.withSequenceNumber(t.currentSequenceNumber); - e.targetMismatches.has(a) ? c = c.withResumeToken(pt.EMPTY_BYTE_STRING, ct.min()).withLastLimboFreeSnapshotVersion(ct.min()) : r.resumeToken.approximateByteSize() > 0 && (c = c.withResumeToken(r.resumeToken, s)), - i = i.insert(a, c), - // Update the target data if there are target changes (or if - // sufficient time has passed since the last update). - /** - * Returns true if the newTargetData should be persisted during an update of - * an active target. TargetData should always be persisted when a target is - * being released and should not call this function. - * - * While the target is active, TargetData updates can be omitted when nothing - * about the target has changed except metadata like the resume token or - * snapshot version. Occasionally it's worth the extra write to prevent these - * values from getting too stale after a crash, but this doesn't have to be - * too frequent. - */ - function(t, e, n) { - // Always persist target data if we don't already have a resume token. - if (0 === t.resumeToken.approximateByteSize()) return !0; - // Don't allow resume token changes to be buffered indefinitely. This - // allows us to be reasonably up-to-date after a crash and avoids needing - // to loop over all active queries on shutdown. Especially in the browser - // we may not get time to do anything interesting while the current tab is - // closing. - if (e.snapshotVersion.toMicroseconds() - t.snapshotVersion.toMicroseconds() >= 3e8) return !0; - // Otherwise if the only thing that has changed about a target is its resume - // token it's not worth persisting. Note that the RemoteStore keeps an - // in-memory view of the currently active targets which includes the current - // resume token, so stream failure or user changes will still use an - // up-to-date resume token regardless of what we do here. - return n.addedDocuments.size + n.modifiedDocuments.size + n.removedDocuments.size > 0; - } - /** - * Notifies local store of the changed views to locally pin documents. - */ (u, c, r) && o.push(n.hs.updateTargetData(t, c)); - })); - let a = Fn(); - // HACK: The only reason we allow a null snapshot version is so that we - // can synthesize remote events when we get permission denied errors while - // trying to resolve the state of a locally cached document that is in - // limbo. - if (e.documentUpdates.forEach((s => { - e.resolvedLimboDocuments.has(s) && o.push(n.persistence.referenceDelegate.updateLimboDocument(t, s)); - })), - // Each loop iteration only affects its "own" doc, so it's safe to get all the remote - // documents in advance in a single call. - o.push(Yr(t, r, e.documentUpdates).next((t => { - a = t; - }))), !s.isEqual(ct.min())) { - const e = n.hs.getLastRemoteSnapshotVersion(t).next((e => n.hs.setTargetsMetadata(t, t.currentSequenceNumber, s))); - o.push(e); - } - return ui.waitFor(o).next((() => r.apply(t))).next((() => n.ui.Ks(t, a))).next((() => a)); - })).then((t => (n.si = i, t))); -} - -/** - * Populates document change buffer with documents from backend or a bundle. - * Returns the document changes resulting from applying those documents. - * - * @param txn - Transaction to use to read existing documents from storage. - * @param documentBuffer - Document buffer to collect the resulted changes to be - * applied to storage. - * @param documents - Documents to be applied. - * @param globalVersion - A `SnapshotVersion` representing the read time if all - * documents have the same read time. - * @param documentVersions - A DocumentKey-to-SnapshotVersion map if documents - * have their own read time. - * - * Note: this function will use `documentVersions` if it is defined; - * when it is not defined, resorts to `globalVersion`. - */ function Yr(t, e, n) { - let s = Gn(); - return n.forEach((t => s = s.add(t))), e.getEntries(t, s).next((t => { - let s = Fn(); - return n.forEach(((n, i) => { - const r = t.get(n); - // Note: The order of the steps below is important, since we want - // to ensure that rejected limbo resolutions (which fabricate - // NoDocuments with SnapshotVersion.min()) never add documents to - // cache. - i.isNoDocument() && i.version.isEqual(ct.min()) ? ( - // NoDocuments with SnapshotVersion.min() are used in manufactured - // events. We remove these documents from cache since we lost - // access. - e.removeEntry(n, i.readTime), s = s.insert(n, i)) : !r.isValidDocument() || i.version.compareTo(r.version) > 0 || 0 === i.version.compareTo(r.version) && r.hasPendingWrites ? (e.addEntry(i), - s = s.insert(n, i)) : O("LocalStore", "Ignoring outdated watch update for ", n, ". Current version:", r.version, " Watch version:", i.version); - })), s; - })); -} - -/** - * Gets the mutation batch after the passed in batchId in the mutation queue - * or null if empty. - * @param afterBatchId - If provided, the batch to search after. - * @returns The next mutation or null if there wasn't one. - */ -function Xr(t, e) { - const n = K(t); - return n.persistence.runTransaction("Get next mutation batch", "readonly", (t => (void 0 === e && (e = -1), - n.Fs.getNextMutationBatchAfterBatchId(t, e)))); -} - -/** - * Reads the current value of a Document with a given key or null if not - * found - used for testing. - */ -/** - * Assigns the given target an internal ID so that its results can be pinned so - * they don't get GC'd. A target must be allocated in the local store before - * the store can be used to manage its view. - * - * Allocating an already allocated `Target` will return the existing `TargetData` - * for that `Target`. - */ -function Zr(t, e) { - const n = K(t); - return n.persistence.runTransaction("Allocate target", "readwrite", (t => { - let s; - return n.hs.getTargetData(t, e).next((i => i ? ( - // This target has been listened to previously, so reuse the - // previous targetID. - // TODO(mcg): freshen last accessed date? - s = i, ui.resolve(s)) : n.hs.allocateTargetId(t).next((i => (s = new Ai(e, i, 0 /* Listen */ , t.currentSequenceNumber), - n.hs.addTargetData(t, s).next((() => s))))))); - })).then((t => { - // If Multi-Tab is enabled, the existing target data may be newer than - // the in-memory data - const s = n.si.get(t.targetId); - return (null === s || t.snapshotVersion.compareTo(s.snapshotVersion) > 0) && (n.si = n.si.insert(t.targetId, t), - n.ii.set(e, t.targetId)), t; - })); -} - -/** - * Returns the TargetData as seen by the LocalStore, including updates that may - * have not yet been persisted to the TargetCache. - */ -// Visible for testing. -/** - * Unpins all the documents associated with the given target. If - * `keepPersistedTargetData` is set to false and Eager GC enabled, the method - * directly removes the associated target data from the target cache. - * - * Releasing a non-existing `Target` is a no-op. - */ -// PORTING NOTE: `keepPersistedTargetData` is multi-tab only. -async function to(t, e, n) { - const s = K(t), i = s.si.get(e), r = n ? "readwrite" : "readwrite-primary"; - try { - n || await s.persistence.runTransaction("Release target", r, (t => s.persistence.referenceDelegate.removeTarget(t, i))); - } catch (t) { - if (!di(t)) throw t; - // All `releaseTarget` does is record the final metadata state for the - // target, but we've been recording this periodically during target - // activity. If we lose this write this could cause a very slight - // difference in the order of target deletion during GC, but we - // don't define exact LRU semantics so this is acceptable. - O("LocalStore", `Failed to update sequence numbers for target ${e}: ${t}`); - } - s.si = s.si.remove(e), s.ii.delete(i.target); -} - -/** - * Runs the specified query against the local store and returns the results, - * potentially taking advantage of query data from previous executions (such - * as the set of remote keys). - * - * @param usePreviousResults - Whether results from previous executions can - * be used to optimize this query execution. - */ function eo(t, e, n) { - const s = K(t); - let i = ct.min(), r = Gn(); - return s.persistence.runTransaction("Execute query", "readonly", (t => function(t, e, n) { - const s = K(t), i = s.ii.get(n); - return void 0 !== i ? ui.resolve(s.si.get(i)) : s.hs.getTargetData(e, n); - }(s, t, $e(e)).next((e => { - if (e) return i = e.lastLimboFreeSnapshotVersion, s.hs.getMatchingKeysForTargetId(t, e.targetId).next((t => { - r = t; - })); - })).next((() => s.ni.Gs(t, e, n ? i : ct.min(), n ? r : Gn()))).next((t => ({ - documents: t, - hi: r - }))))); -} - -// PORTING NOTE: Multi-Tab only. -function no(t, e) { - const n = K(t), s = K(n.hs), i = n.si.get(e); - return i ? Promise.resolve(i.target) : n.persistence.runTransaction("Get target data", "readonly", (t => s.Et(t, e).next((t => t ? t.target : null)))); -} - -/** - * Returns the set of documents that have been updated since the last call. - * If this is the first call, returns the set of changes since client - * initialization. Further invocations will return document that have changed - * since the prior call. - */ -// PORTING NOTE: Multi-Tab only. -function so(t) { - const e = K(t); - return e.persistence.runTransaction("Get new document changes", "readonly", (t => function(t, e, n) { - const s = K(t); - let i = Fn(), r = Vi(n); - const o = xr(e), a = IDBKeyRange.lowerBound(r, !0); - return o.Wt({ - index: "readTimeIndex", - range: a - }, ((t, e) => { - // Unlike `getEntry()` and others, `getNewDocumentChanges()` parses - // the documents directly since we want to keep sentinel deletes. - const n = bi(s.M, e); - i = i.insert(n.key, n), r = e.readTime; - })).next((() => ({ - $s: i, - readTime: vi(r) - }))); - } - /** - * Returns the read time of the most recently read document in the cache, or - * SnapshotVersion.min() if not available. - */ - // PORTING NOTE: This is only used for multi-tab synchronization. - (e.oi, t, e.ri))).then((({$s: t, readTime: n}) => (e.ri = n, t))); -} - -/** - * Reads the newest document change from persistence and moves the internal - * synchronization marker forward so that calls to `getNewDocumentChanges()` - * only return changes that happened after client initialization. - */ -// PORTING NOTE: Multi-Tab only. -async function io(t) { - const e = K(t); - return e.persistence.runTransaction("Synchronize last document change read time", "readonly", (t => function(t) { - const e = xr(t); - // If there are no existing entries, we return SnapshotVersion.min(). - let n = ct.min(); - return e.Wt({ - index: "readTimeIndex", - reverse: !0 - }, ((t, e, s) => { - e.readTime && (n = vi(e.readTime)), s.done(); - })).next((() => n)); - }(t))).then((t => { - e.ri = t; - })); -} - -/** - * Creates a new target using the given bundle name, which will be used to - * hold the keys of all documents from the bundle in query-document mappings. - * This ensures that the loaded documents do not get garbage collected - * right away. - */ -/** - * Applies the documents from a bundle to the "ground-state" (remote) - * documents. - * - * LocalDocuments are re-calculated if there are remaining mutations in the - * queue. - */ -async function ro(t, e, n, s) { - const i = K(t); - let r = Gn(), o = Fn(); - for (const t of n) { - const n = e.li(t.metadata.name); - t.document && (r = r.add(n)); - const s = e.fi(t); - s.setReadTime(e.di(t.metadata.readTime)), o = o.insert(n, s); - } - const a = i.oi.newChangeBuffer({ - trackRemovals: !0 - }), u = await Zr(i, function(t) { - // It is OK that the path used for the query is not valid, because this will - // not be read and queried. - return $e(De(_t.fromString(`__bundle__/docs/${t}`))); - }(s)); - // Allocates a target to hold all document keys from the bundle, such that - // they will not get garbage collected right away. - return i.persistence.runTransaction("Apply bundle documents", "readwrite", (t => Yr(t, a, o).next((e => (a.apply(t), - e))).next((e => i.hs.removeMatchingKeysForTargetId(t, u.targetId).next((() => i.hs.addMatchingKeys(t, r, u.targetId))).next((() => i.ui.Ks(t, e))).next((() => e)))))); -} - -/** - * Returns a promise of a boolean to indicate if the given bundle has already - * been loaded and the create time is newer than the current loading bundle. - */ -/** - * Saves the given `NamedQuery` to local persistence. - */ -async function oo(t, e, n = Gn()) { - // Allocate a target for the named query such that it can be resumed - // from associated read time if users use it to listen. - // NOTE: this also means if no corresponding target exists, the new target - // will remain active and will not get collected, unless users happen to - // unlisten the query somehow. - const s = await Zr(t, $e(ki(e.bundledQuery))), i = K(t); - return i.persistence.runTransaction("Save named query", "readwrite", (t => { - const r = us(e.readTime); - // Simply save the query itself if it is older than what the SDK already - // has. - if (s.snapshotVersion.compareTo(r) >= 0) return i.fs.saveNamedQuery(t, e); - // Update existing target data because the query from the bundle is newer. - const o = s.withResumeToken(pt.EMPTY_BYTE_STRING, r); - return i.si = i.si.insert(o.targetId, o), i.hs.updateTargetData(t, o).next((() => i.hs.removeMatchingKeysForTargetId(t, s.targetId))).next((() => i.hs.addMatchingKeys(t, n, s.targetId))).next((() => i.fs.saveNamedQuery(t, e))); - })); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ class ao { - constructor(t) { - this.M = t, this._i = new Map, this.wi = new Map; - } - getBundleMetadata(t, e) { - return ui.resolve(this._i.get(e)); - } - saveBundleMetadata(t, e) { - /** Decodes a BundleMetadata proto into a BundleMetadata object. */ - var n; - return this._i.set(e.id, { - id: (n = e).id, - version: n.version, - createTime: us(n.createTime) - }), ui.resolve(); - } - getNamedQuery(t, e) { - return ui.resolve(this.wi.get(e)); - } - saveNamedQuery(t, e) { - return this.wi.set(e.name, function(t) { - return { - name: t.name, - query: ki(t.bundledQuery), - readTime: us(t.readTime) - }; - }(e)), ui.resolve(); - } -} - -/** - * @license - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * An in-memory implementation of DocumentOverlayCache. - */ class uo { - constructor() { - // A map sorted by DocumentKey, whose value is a pair of the largest batch id - // for the overlay and the overlay itself. - this.overlays = new Cn(xt.comparator), this.mi = new Map; - } - getOverlay(t, e) { - return ui.resolve(this.overlays.get(e)); - } - saveOverlays(t, e, n) { - return n.forEach(((n, s) => { - this.Xt(t, e, s); - })), ui.resolve(); - } - removeOverlaysForBatchId(t, e, n) { - const s = this.mi.get(n); - return void 0 !== s && (s.forEach((t => this.overlays = this.overlays.remove(t))), - this.mi.delete(n)), ui.resolve(); - } - getOverlaysForCollection(t, e, n) { - const s = qn(), i = e.length + 1, r = new xt(e.child("")), o = this.overlays.getIteratorFrom(r); - for (;o.hasNext(); ) { - const t = o.getNext().value, r = t.getKey(); - if (!e.isPrefixOf(r.path)) break; - // Documents from sub-collections - r.path.length === i && (t.largestBatchId > n && s.set(t.getKey(), t)); - } - return ui.resolve(s); - } - getOverlaysForCollectionGroup(t, e, n, s) { - let i = new Cn(((t, e) => t - e)); - const r = this.overlays.getIterator(); - for (;r.hasNext(); ) { - const t = r.getNext().value; - if (t.getKey().getCollectionGroup() === e && t.largestBatchId > n) { - let e = i.get(t.largestBatchId); - null === e && (e = qn(), i = i.insert(t.largestBatchId, e)), e.set(t.getKey(), t); - } - } - const o = qn(), a = i.getIterator(); - for (;a.hasNext(); ) { - if (a.getNext().value.forEach(((t, e) => o.set(t, e))), o.size() >= s) break; - } - return ui.resolve(o); - } - Xt(t, e, n) { - if (null === n) return; - // Remove the association of the overlay to its batch id. - const s = this.overlays.get(n.key); - if (null !== s) { - const t = this.mi.get(s.largestBatchId).delete(n.key); - this.mi.set(s.largestBatchId, t); - } - this.overlays = this.overlays.insert(n.key, new Ei(e, n)); - // Create the association of this overlay to the given largestBatchId. - let i = this.mi.get(e); - void 0 === i && (i = Gn(), this.mi.set(e, i)), this.mi.set(e, i.add(n.key)); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A collection of references to a document from some kind of numbered entity - * (either a target ID or batch ID). As references are added to or removed from - * the set corresponding events are emitted to a registered garbage collector. - * - * Each reference is represented by a DocumentReference object. Each of them - * contains enough information to uniquely identify the reference. They are all - * stored primarily in a set sorted by key. A document is considered garbage if - * there's no references in that set (this can be efficiently checked thanks to - * sorting by key). - * - * ReferenceSet also keeps a secondary set that contains references sorted by - * IDs. This one is used to efficiently implement removal of all references by - * some target ID. - */ class co { - constructor() { - // A set of outstanding references to a document sorted by key. - this.gi = new kn(ho.yi), - // A set of outstanding references to a document sorted by target id. - this.pi = new kn(ho.Ii); - } - /** Returns true if the reference set contains no references. */ isEmpty() { - return this.gi.isEmpty(); - } - /** Adds a reference to the given document key for the given ID. */ addReference(t, e) { - const n = new ho(t, e); - this.gi = this.gi.add(n), this.pi = this.pi.add(n); - } - /** Add references to the given document keys for the given ID. */ Ti(t, e) { - t.forEach((t => this.addReference(t, e))); - } - /** - * Removes a reference to the given document key for the given - * ID. - */ removeReference(t, e) { - this.Ei(new ho(t, e)); - } - Ai(t, e) { - t.forEach((t => this.removeReference(t, e))); - } - /** - * Clears all references with a given ID. Calls removeRef() for each key - * removed. - */ Ri(t) { - const e = new xt(new _t([])), n = new ho(e, t), s = new ho(e, t + 1), i = []; - return this.pi.forEachInRange([ n, s ], (t => { - this.Ei(t), i.push(t.key); - })), i; - } - bi() { - this.gi.forEach((t => this.Ei(t))); - } - Ei(t) { - this.gi = this.gi.delete(t), this.pi = this.pi.delete(t); - } - Pi(t) { - const e = new xt(new _t([])), n = new ho(e, t), s = new ho(e, t + 1); - let i = Gn(); - return this.pi.forEachInRange([ n, s ], (t => { - i = i.add(t.key); - })), i; - } - containsKey(t) { - const e = new ho(t, 0), n = this.gi.firstAfterOrEqual(e); - return null !== n && t.isEqual(n.key); - } -} - -class ho { - constructor(t, e) { - this.key = t, this.Vi = e; - } - /** Compare by key then by ID */ static yi(t, e) { - return xt.comparator(t.key, e.key) || rt(t.Vi, e.Vi); - } - /** Compare by ID then by key */ static Ii(t, e) { - return rt(t.Vi, e.Vi) || xt.comparator(t.key, e.key); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ class lo { - constructor(t, e) { - this.indexManager = t, this.referenceDelegate = e, - /** - * The set of all mutations that have been sent but not yet been applied to - * the backend. - */ - this.Fs = [], - /** Next value to use when assigning sequential IDs to each mutation batch. */ - this.vi = 1, - /** An ordered mapping between documents and the mutations batch IDs. */ - this.Si = new kn(ho.yi); - } - checkEmpty(t) { - return ui.resolve(0 === this.Fs.length); - } - addMutationBatch(t, e, n, s) { - const i = this.vi; - this.vi++, this.Fs.length > 0 && this.Fs[this.Fs.length - 1]; - const r = new Ii(i, e, n, s); - this.Fs.push(r); - // Track references by document key and index collection parents. - for (const e of s) this.Si = this.Si.add(new ho(e.key, i)), this.indexManager.addToCollectionParentIndex(t, e.key.path.popLast()); - return ui.resolve(r); - } - lookupMutationBatch(t, e) { - return ui.resolve(this.Di(e)); - } - getNextMutationBatchAfterBatchId(t, e) { - const n = e + 1, s = this.Ci(n), i = s < 0 ? 0 : s; - // The requested batchId may still be out of range so normalize it to the - // start of the queue. - return ui.resolve(this.Fs.length > i ? this.Fs[i] : null); - } - getHighestUnacknowledgedBatchId() { - return ui.resolve(0 === this.Fs.length ? -1 : this.vi - 1); - } - getAllMutationBatches(t) { - return ui.resolve(this.Fs.slice()); - } - getAllMutationBatchesAffectingDocumentKey(t, e) { - const n = new ho(e, 0), s = new ho(e, Number.POSITIVE_INFINITY), i = []; - return this.Si.forEachInRange([ n, s ], (t => { - const e = this.Di(t.Vi); - i.push(e); - })), ui.resolve(i); - } - getAllMutationBatchesAffectingDocumentKeys(t, e) { - let n = new kn(rt); - return e.forEach((t => { - const e = new ho(t, 0), s = new ho(t, Number.POSITIVE_INFINITY); - this.Si.forEachInRange([ e, s ], (t => { - n = n.add(t.Vi); - })); - })), ui.resolve(this.xi(n)); - } - getAllMutationBatchesAffectingQuery(t, e) { - // Use the query path as a prefix for testing if a document matches the - // query. - const n = e.path, s = n.length + 1; - // Construct a document reference for actually scanning the index. Unlike - // the prefix the document key in this reference must have an even number of - // segments. The empty segment can be used a suffix of the query path - // because it precedes all other segments in an ordered traversal. - let i = n; - xt.isDocumentKey(i) || (i = i.child("")); - const r = new ho(new xt(i), 0); - // Find unique batchIDs referenced by all documents potentially matching the - // query. - let o = new kn(rt); - return this.Si.forEachWhile((t => { - const e = t.key.path; - return !!n.isPrefixOf(e) && ( - // Rows with document keys more than one segment longer than the query - // path can't be matches. For example, a query on 'rooms' can't match - // the document /rooms/abc/messages/xyx. - // TODO(mcg): we'll need a different scanner when we implement - // ancestor queries. - e.length === s && (o = o.add(t.Vi)), !0); - }), r), ui.resolve(this.xi(o)); - } - xi(t) { - // Construct an array of matching batches, sorted by batchID to ensure that - // multiple mutations affecting the same document key are applied in order. - const e = []; - return t.forEach((t => { - const n = this.Di(t); - null !== n && e.push(n); - })), e; - } - removeMutationBatch(t, e) { - q(0 === this.Ni(e.batchId, "removed")), this.Fs.shift(); - let n = this.Si; - return ui.forEach(e.mutations, (s => { - const i = new ho(s.key, e.batchId); - return n = n.delete(i), this.referenceDelegate.markPotentiallyOrphaned(t, s.key); - })).next((() => { - this.Si = n; - })); - } - dn(t) { - // No-op since the memory mutation queue does not maintain a separate cache. - } - containsKey(t, e) { - const n = new ho(e, 0), s = this.Si.firstAfterOrEqual(n); - return ui.resolve(e.isEqual(s && s.key)); - } - performConsistencyCheck(t) { - return this.Fs.length, ui.resolve(); - } - /** - * Finds the index of the given batchId in the mutation queue and asserts that - * the resulting index is within the bounds of the queue. - * - * @param batchId - The batchId to search for - * @param action - A description of what the caller is doing, phrased in passive - * form (e.g. "acknowledged" in a routine that acknowledges batches). - */ Ni(t, e) { - return this.Ci(t); - } - /** - * Finds the index of the given batchId in the mutation queue. This operation - * is O(1). - * - * @returns The computed index of the batch with the given batchId, based on - * the state of the queue. Note this index can be negative if the requested - * batchId has already been remvoed from the queue or past the end of the - * queue if the batchId is larger than the last added batch. - */ Ci(t) { - if (0 === this.Fs.length) - // As an index this is past the end of the queue - return 0; - // Examine the front of the queue to figure out the difference between the - // batchId and indexes in the array. Note that since the queue is ordered - // by batchId, if the first batch has a larger batchId then the requested - // batchId doesn't exist in the queue. - return t - this.Fs[0].batchId; - } - /** - * A version of lookupMutationBatch that doesn't return a promise, this makes - * other functions that uses this code easier to read and more efficent. - */ Di(t) { - const e = this.Ci(t); - if (e < 0 || e >= this.Fs.length) return null; - return this.Fs[e]; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * The memory-only RemoteDocumentCache for IndexedDb. To construct, invoke - * `newMemoryRemoteDocumentCache()`. - */ -class fo { - /** - * @param sizer - Used to assess the size of a document. For eager GC, this is - * expected to just return 0 to avoid unnecessarily doing the work of - * calculating the size. - */ - constructor(t) { - this.ki = t, - /** Underlying cache of documents and their read times. */ - this.docs = new Cn(xt.comparator), - /** Size of all cached documents. */ - this.size = 0; - } - setIndexManager(t) { - this.indexManager = t; - } - /** - * Adds the supplied entry to the cache and updates the cache size as appropriate. - * - * All calls of `addEntry` are required to go through the RemoteDocumentChangeBuffer - * returned by `newChangeBuffer()`. - */ addEntry(t, e) { - const n = e.key, s = this.docs.get(n), i = s ? s.size : 0, r = this.ki(e); - return this.docs = this.docs.insert(n, { - document: e.mutableCopy(), - size: r - }), this.size += r - i, this.indexManager.addToCollectionParentIndex(t, n.path.popLast()); - } - /** - * Removes the specified entry from the cache and updates the cache size as appropriate. - * - * All calls of `removeEntry` are required to go through the RemoteDocumentChangeBuffer - * returned by `newChangeBuffer()`. - */ removeEntry(t) { - const e = this.docs.get(t); - e && (this.docs = this.docs.remove(t), this.size -= e.size); - } - getEntry(t, e) { - const n = this.docs.get(e); - return ui.resolve(n ? n.document.mutableCopy() : te.newInvalidDocument(e)); - } - getEntries(t, e) { - let n = Fn(); - return e.forEach((t => { - const e = this.docs.get(t); - n = n.insert(t, e ? e.document.mutableCopy() : te.newInvalidDocument(t)); - })), ui.resolve(n); - } - getAll(t, e, n) { - let s = Fn(); - // Documents are ordered by key, so we can use a prefix scan to narrow down - // the documents we need to match the query against. - const i = new xt(e.child("")), r = this.docs.getIteratorFrom(i); - for (;r.hasNext(); ) { - const {key: t, value: {document: i}} = r.getNext(); - if (!e.isPrefixOf(t.path)) break; - t.path.length > e.length + 1 || (i.readTime.compareTo(n) <= 0 || (s = s.insert(i.key, i.mutableCopy()))); - } - return ui.resolve(s); - } - Mi(t, e) { - return ui.forEach(this.docs, (t => e(t))); - } - newChangeBuffer(t) { - // `trackRemovals` is ignores since the MemoryRemoteDocumentCache keeps - // a separate changelog and does not need special handling for removals. - return new _o(this); - } - getSize(t) { - return ui.resolve(this.size); - } -} - -/** - * Creates a new memory-only RemoteDocumentCache. - * - * @param sizer - Used to assess the size of a document. For eager GC, this is - * expected to just return 0 to avoid unnecessarily doing the work of - * calculating the size. - */ -/** - * Handles the details of adding and updating documents in the MemoryRemoteDocumentCache. - */ -class _o extends vr { - constructor(t) { - super(), this.Un = t; - } - applyChanges(t) { - const e = []; - return this.changes.forEach(((n, s) => { - s.isValidDocument() ? e.push(this.Un.addEntry(t, s)) : this.Un.removeEntry(n); - })), ui.waitFor(e); - } - getFromCache(t, e) { - return this.Un.getEntry(t, e); - } - getAllFromCache(t, e) { - return this.Un.getEntries(t, e); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ class wo { - constructor(t) { - this.persistence = t, - /** - * Maps a target to the data about that target - */ - this.Oi = new Dn((t => ce(t)), le), - /** The last received snapshot version. */ - this.lastRemoteSnapshotVersion = ct.min(), - /** The highest numbered target ID encountered. */ - this.highestTargetId = 0, - /** The highest sequence number encountered. */ - this.$i = 0, - /** - * A ordered bidirectional mapping between documents and the remote target - * IDs. - */ - this.Fi = new co, this.targetCount = 0, this.Bi = mr.mn(); - } - forEachTarget(t, e) { - return this.Oi.forEach(((t, n) => e(n))), ui.resolve(); - } - getLastRemoteSnapshotVersion(t) { - return ui.resolve(this.lastRemoteSnapshotVersion); - } - getHighestSequenceNumber(t) { - return ui.resolve(this.$i); - } - allocateTargetId(t) { - return this.highestTargetId = this.Bi.next(), ui.resolve(this.highestTargetId); - } - setTargetsMetadata(t, e, n) { - return n && (this.lastRemoteSnapshotVersion = n), e > this.$i && (this.$i = e), - ui.resolve(); - } - In(t) { - this.Oi.set(t.target, t); - const e = t.targetId; - e > this.highestTargetId && (this.Bi = new mr(e), this.highestTargetId = e), t.sequenceNumber > this.$i && (this.$i = t.sequenceNumber); - } - addTargetData(t, e) { - return this.In(e), this.targetCount += 1, ui.resolve(); - } - updateTargetData(t, e) { - return this.In(e), ui.resolve(); - } - removeTargetData(t, e) { - return this.Oi.delete(e.target), this.Fi.Ri(e.targetId), this.targetCount -= 1, - ui.resolve(); - } - removeTargets(t, e, n) { - let s = 0; - const i = []; - return this.Oi.forEach(((r, o) => { - o.sequenceNumber <= e && null === n.get(o.targetId) && (this.Oi.delete(r), i.push(this.removeMatchingKeysForTargetId(t, o.targetId)), - s++); - })), ui.waitFor(i).next((() => s)); - } - getTargetCount(t) { - return ui.resolve(this.targetCount); - } - getTargetData(t, e) { - const n = this.Oi.get(e) || null; - return ui.resolve(n); - } - addMatchingKeys(t, e, n) { - return this.Fi.Ti(e, n), ui.resolve(); - } - removeMatchingKeys(t, e, n) { - this.Fi.Ai(e, n); - const s = this.persistence.referenceDelegate, i = []; - return s && e.forEach((e => { - i.push(s.markPotentiallyOrphaned(t, e)); - })), ui.waitFor(i); - } - removeMatchingKeysForTargetId(t, e) { - return this.Fi.Ri(e), ui.resolve(); - } - getMatchingKeysForTargetId(t, e) { - const n = this.Fi.Pi(e); - return ui.resolve(n); - } - containsKey(t, e) { - return ui.resolve(this.Fi.containsKey(e)); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A memory-backed instance of Persistence. Data is stored only in RAM and - * not persisted across sessions. - */ -class mo { - /** - * The constructor accepts a factory for creating a reference delegate. This - * allows both the delegate and this instance to have strong references to - * each other without having nullable fields that would then need to be - * checked or asserted on every access. - */ - constructor(t, e) { - this.Li = {}, this.overlays = {}, this.Zn = new nt(0), this.ts = !1, this.ts = !0, - this.referenceDelegate = t(this), this.hs = new wo(this); - this.indexManager = new Zi, this.ls = function(t) { - return new fo(t); - }((t => this.referenceDelegate.qi(t))), this.M = new Ri(e), this.fs = new ao(this.M); - } - start() { - return Promise.resolve(); - } - shutdown() { - // No durable state to ensure is closed on shutdown. - return this.ts = !1, Promise.resolve(); - } - get started() { - return this.ts; - } - setDatabaseDeletedListener() { - // No op. - } - setNetworkEnabled() { - // No op. - } - getIndexManager(t) { - // We do not currently support indices for memory persistence, so we can - // return the same shared instance of the memory index manager. - return this.indexManager; - } - getDocumentOverlayCache(t) { - let e = this.overlays[t.toKey()]; - return e || (e = new uo, this.overlays[t.toKey()] = e), e; - } - getMutationQueue(t, e) { - let n = this.Li[t.toKey()]; - return n || (n = new lo(e, this.referenceDelegate), this.Li[t.toKey()] = n), n; - } - getTargetCache() { - return this.hs; - } - getRemoteDocumentCache() { - return this.ls; - } - getBundleCache() { - return this.fs; - } - runTransaction(t, e, n) { - O("MemoryPersistence", "Starting transaction:", t); - const s = new go(this.Zn.next()); - return this.referenceDelegate.Ui(), n(s).next((t => this.referenceDelegate.Ki(s).next((() => t)))).toPromise().then((t => (s.raiseOnCommittedEvent(), - t))); - } - Gi(t, e) { - return ui.or(Object.values(this.Li).map((n => () => n.containsKey(t, e)))); - } -} - -/** - * Memory persistence is not actually transactional, but future implementations - * may have transaction-scoped state. - */ class go extends ai { - constructor(t) { - super(), this.currentSequenceNumber = t; - } -} - -class yo { - constructor(t) { - this.persistence = t, - /** Tracks all documents that are active in Query views. */ - this.Qi = new co, - /** The list of documents that are potentially GCed after each transaction. */ - this.ji = null; - } - static Wi(t) { - return new yo(t); - } - get zi() { - if (this.ji) return this.ji; - throw L(); - } - addReference(t, e, n) { - return this.Qi.addReference(n, e), this.zi.delete(n.toString()), ui.resolve(); - } - removeReference(t, e, n) { - return this.Qi.removeReference(n, e), this.zi.add(n.toString()), ui.resolve(); - } - markPotentiallyOrphaned(t, e) { - return this.zi.add(e.toString()), ui.resolve(); - } - removeTarget(t, e) { - this.Qi.Ri(e.targetId).forEach((t => this.zi.add(t.toString()))); - const n = this.persistence.getTargetCache(); - return n.getMatchingKeysForTargetId(t, e.targetId).next((t => { - t.forEach((t => this.zi.add(t.toString()))); - })).next((() => n.removeTargetData(t, e))); - } - Ui() { - this.ji = new Set; - } - Ki(t) { - // Remove newly orphaned documents. - const e = this.persistence.getRemoteDocumentCache().newChangeBuffer(); - return ui.forEach(this.zi, (n => { - const s = xt.fromPath(n); - return this.Hi(t, s).next((t => { - t || e.removeEntry(s, ct.min()); - })); - })).next((() => (this.ji = null, e.apply(t)))); - } - updateLimboDocument(t, e) { - return this.Hi(t, e).next((t => { - t ? this.zi.delete(e.toString()) : this.zi.add(e.toString()); - })); - } - qi(t) { - // For eager GC, we don't care about the document size, there are no size thresholds. - return 0; - } - Hi(t, e) { - return ui.or([ () => ui.resolve(this.Qi.containsKey(e)), () => this.persistence.getTargetCache().containsKey(t, e), () => this.persistence.Gi(t, e) ]); - } -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -// The format of the LocalStorage key that stores the client state is: -// firestore_clients__ -/** Assembles the key for a client state in WebStorage */ -function po(t, e) { - return `firestore_clients_${t}_${e}`; -} - -// The format of the WebStorage key that stores the mutation state is: -// firestore_mutations__ -// (for unauthenticated users) -// or: firestore_mutations___ - -// 'user_uid' is last to avoid needing to escape '_' characters that it might -// contain. -/** Assembles the key for a mutation batch in WebStorage */ -function Io(t, e, n) { - let s = `firestore_mutations_${t}_${n}`; - return e.isAuthenticated() && (s += `_${e.uid}`), s; -} - -// The format of the WebStorage key that stores a query target's metadata is: -// firestore_targets__ -/** Assembles the key for a query state in WebStorage */ -function To(t, e) { - return `firestore_targets_${t}_${e}`; -} - -// The WebStorage prefix that stores the primary tab's online state. The -// format of the key is: -// firestore_online_state_ -/** - * Holds the state of a mutation batch, including its user ID, batch ID and - * whether the batch is 'pending', 'acknowledged' or 'rejected'. - */ -// Visible for testing -class Eo { - constructor(t, e, n, s) { - this.user = t, this.batchId = e, this.state = n, this.error = s; - } - /** - * Parses a MutationMetadata from its JSON representation in WebStorage. - * Logs a warning and returns null if the format of the data is not valid. - */ static Ji(t, e, n) { - const s = JSON.parse(n); - let i, r = "object" == typeof s && -1 !== [ "pending", "acknowledged", "rejected" ].indexOf(s.state) && (void 0 === s.error || "object" == typeof s.error); - return r && s.error && (r = "string" == typeof s.error.message && "string" == typeof s.error.code, - r && (i = new Q(s.error.code, s.error.message))), r ? new Eo(t, e, s.state, i) : ($("SharedClientState", `Failed to parse mutation state for ID '${e}': ${n}`), - null); - } - Yi() { - const t = { - state: this.state, - updateTimeMs: Date.now() - }; - return this.error && (t.error = { - code: this.error.code, - message: this.error.message - }), JSON.stringify(t); - } -} - -/** - * Holds the state of a query target, including its target ID and whether the - * target is 'not-current', 'current' or 'rejected'. - */ -// Visible for testing -class Ao { - constructor(t, e, n) { - this.targetId = t, this.state = e, this.error = n; - } - /** - * Parses a QueryTargetMetadata from its JSON representation in WebStorage. - * Logs a warning and returns null if the format of the data is not valid. - */ static Ji(t, e) { - const n = JSON.parse(e); - let s, i = "object" == typeof n && -1 !== [ "not-current", "current", "rejected" ].indexOf(n.state) && (void 0 === n.error || "object" == typeof n.error); - return i && n.error && (i = "string" == typeof n.error.message && "string" == typeof n.error.code, - i && (s = new Q(n.error.code, n.error.message))), i ? new Ao(t, n.state, s) : ($("SharedClientState", `Failed to parse target state for ID '${t}': ${e}`), - null); - } - Yi() { - const t = { - state: this.state, - updateTimeMs: Date.now() - }; - return this.error && (t.error = { - code: this.error.code, - message: this.error.message - }), JSON.stringify(t); - } -} - -/** - * This class represents the immutable ClientState for a client read from - * WebStorage, containing the list of active query targets. - */ class Ro { - constructor(t, e) { - this.clientId = t, this.activeTargetIds = e; - } - /** - * Parses a RemoteClientState from the JSON representation in WebStorage. - * Logs a warning and returns null if the format of the data is not valid. - */ static Ji(t, e) { - const n = JSON.parse(e); - let s = "object" == typeof n && n.activeTargetIds instanceof Array, i = jn(); - for (let t = 0; s && t < n.activeTargetIds.length; ++t) s = Ct(n.activeTargetIds[t]), - i = i.add(n.activeTargetIds[t]); - return s ? new Ro(t, i) : ($("SharedClientState", `Failed to parse client data for instance '${t}': ${e}`), - null); - } -} - -/** - * This class represents the online state for all clients participating in - * multi-tab. The online state is only written to by the primary client, and - * used in secondary clients to update their query views. - */ class bo { - constructor(t, e) { - this.clientId = t, this.onlineState = e; - } - /** - * Parses a SharedOnlineState from its JSON representation in WebStorage. - * Logs a warning and returns null if the format of the data is not valid. - */ static Ji(t) { - const e = JSON.parse(t); - return "object" == typeof e && -1 !== [ "Unknown", "Online", "Offline" ].indexOf(e.onlineState) && "string" == typeof e.clientId ? new bo(e.clientId, e.onlineState) : ($("SharedClientState", `Failed to parse online state: ${t}`), - null); - } -} - -/** - * Metadata state of the local client. Unlike `RemoteClientState`, this class is - * mutable and keeps track of all pending mutations, which allows us to - * update the range of pending mutation batch IDs as new mutations are added or - * removed. - * - * The data in `LocalClientState` is not read from WebStorage and instead - * updated via its instance methods. The updated state can be serialized via - * `toWebStorageJSON()`. - */ -// Visible for testing. -class Po { - constructor() { - this.activeTargetIds = jn(); - } - Xi(t) { - this.activeTargetIds = this.activeTargetIds.add(t); - } - Zi(t) { - this.activeTargetIds = this.activeTargetIds.delete(t); - } - /** - * Converts this entry into a JSON-encoded format we can use for WebStorage. - * Does not encode `clientId` as it is part of the key in WebStorage. - */ Yi() { - const t = { - activeTargetIds: this.activeTargetIds.toArray(), - updateTimeMs: Date.now() - }; - return JSON.stringify(t); - } -} - -/** - * `WebStorageSharedClientState` uses WebStorage (window.localStorage) as the - * backing store for the SharedClientState. It keeps track of all active - * clients and supports modifications of the local client's data. - */ class Vo { - constructor(t, e, n, s, i) { - this.window = t, this.Hn = e, this.persistenceKey = n, this.tr = s, this.syncEngine = null, - this.onlineStateHandler = null, this.sequenceNumberHandler = null, this.er = this.nr.bind(this), - this.sr = new Cn(rt), this.started = !1, - /** - * Captures WebStorage events that occur before `start()` is called. These - * events are replayed once `WebStorageSharedClientState` is started. - */ - this.ir = []; - // Escape the special characters mentioned here: - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions - const r = n.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - this.storage = this.window.localStorage, this.currentUser = i, this.rr = po(this.persistenceKey, this.tr), - this.ar = - /** Assembles the key for the current sequence number. */ - function(t) { - return `firestore_sequence_number_${t}`; - } - /** - * @license - * Copyright 2018 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ (this.persistenceKey), this.sr = this.sr.insert(this.tr, new Po), this.ur = new RegExp(`^firestore_clients_${r}_([^_]*)$`), - this.cr = new RegExp(`^firestore_mutations_${r}_(\\d+)(?:_(.*))?$`), this.hr = new RegExp(`^firestore_targets_${r}_(\\d+)$`), - this.lr = - /** Assembles the key for the online state of the primary tab. */ - function(t) { - return `firestore_online_state_${t}`; - } - // The WebStorage prefix that plays as a event to indicate the remote documents - // might have changed due to some secondary tabs loading a bundle. - // format of the key is: - // firestore_bundle_loaded_ - (this.persistenceKey), this.dr = function(t) { - return `firestore_bundle_loaded_${t}`; - } - // The WebStorage key prefix for the key that stores the last sequence number allocated. The key - // looks like 'firestore_sequence_number_'. - (this.persistenceKey), - // Rather than adding the storage observer during start(), we add the - // storage observer during initialization. This ensures that we collect - // events before other components populate their initial state (during their - // respective start() calls). Otherwise, we might for example miss a - // mutation that is added after LocalStore's start() processed the existing - // mutations but before we observe WebStorage events. - this.window.addEventListener("storage", this.er); - } - /** Returns 'true' if WebStorage is available in the current environment. */ static vt(t) { - return !(!t || !t.localStorage); - } - async start() { - // Retrieve the list of existing clients to backfill the data in - // SharedClientState. - const t = await this.syncEngine.Ms(); - for (const e of t) { - if (e === this.tr) continue; - const t = this.getItem(po(this.persistenceKey, e)); - if (t) { - const n = Ro.Ji(e, t); - n && (this.sr = this.sr.insert(n.clientId, n)); - } - } - this._r(); - // Check if there is an existing online state and call the callback handler - // if applicable. - const e = this.storage.getItem(this.lr); - if (e) { - const t = this.wr(e); - t && this.mr(t); - } - for (const t of this.ir) this.nr(t); - this.ir = [], - // Register a window unload hook to remove the client metadata entry from - // WebStorage even if `shutdown()` was not called. - this.window.addEventListener("pagehide", (() => this.shutdown())), this.started = !0; - } - writeSequenceNumber(t) { - this.setItem(this.ar, JSON.stringify(t)); - } - getAllActiveQueryTargets() { - return this.gr(this.sr); - } - isActiveQueryTarget(t) { - let e = !1; - return this.sr.forEach(((n, s) => { - s.activeTargetIds.has(t) && (e = !0); - })), e; - } - addPendingMutation(t) { - this.yr(t, "pending"); - } - updateMutationState(t, e, n) { - this.yr(t, e, n), - // Once a final mutation result is observed by other clients, they no longer - // access the mutation's metadata entry. Since WebStorage replays events - // in order, it is safe to delete the entry right after updating it. - this.pr(t); - } - addLocalQueryTarget(t) { - let e = "not-current"; - // Lookup an existing query state if the target ID was already registered - // by another tab - if (this.isActiveQueryTarget(t)) { - const n = this.storage.getItem(To(this.persistenceKey, t)); - if (n) { - const s = Ao.Ji(t, n); - s && (e = s.state); - } - } - return this.Ir.Xi(t), this._r(), e; - } - removeLocalQueryTarget(t) { - this.Ir.Zi(t), this._r(); - } - isLocalQueryTarget(t) { - return this.Ir.activeTargetIds.has(t); - } - clearQueryState(t) { - this.removeItem(To(this.persistenceKey, t)); - } - updateQueryState(t, e, n) { - this.Tr(t, e, n); - } - handleUserChange(t, e, n) { - e.forEach((t => { - this.pr(t); - })), this.currentUser = t, n.forEach((t => { - this.addPendingMutation(t); - })); - } - setOnlineState(t) { - this.Er(t); - } - notifyBundleLoaded() { - this.Ar(); - } - shutdown() { - this.started && (this.window.removeEventListener("storage", this.er), this.removeItem(this.rr), - this.started = !1); - } - getItem(t) { - const e = this.storage.getItem(t); - return O("SharedClientState", "READ", t, e), e; - } - setItem(t, e) { - O("SharedClientState", "SET", t, e), this.storage.setItem(t, e); - } - removeItem(t) { - O("SharedClientState", "REMOVE", t), this.storage.removeItem(t); - } - nr(t) { - // Note: The function is typed to take Event to be interface-compatible with - // `Window.addEventListener`. - const e = t; - if (e.storageArea === this.storage) { - if (O("SharedClientState", "EVENT", e.key, e.newValue), e.key === this.rr) return void $("Received WebStorage notification for local change. Another client might have garbage-collected our state"); - this.Hn.enqueueRetryable((async () => { - if (this.started) { - if (null !== e.key) if (this.ur.test(e.key)) { - if (null == e.newValue) { - const t = this.Rr(e.key); - return this.br(t, null); - } - { - const t = this.Pr(e.key, e.newValue); - if (t) return this.br(t.clientId, t); - } - } else if (this.cr.test(e.key)) { - if (null !== e.newValue) { - const t = this.Vr(e.key, e.newValue); - if (t) return this.vr(t); - } - } else if (this.hr.test(e.key)) { - if (null !== e.newValue) { - const t = this.Sr(e.key, e.newValue); - if (t) return this.Dr(t); - } - } else if (e.key === this.lr) { - if (null !== e.newValue) { - const t = this.wr(e.newValue); - if (t) return this.mr(t); - } - } else if (e.key === this.ar) { - const t = function(t) { - let e = nt.A; - if (null != t) try { - const n = JSON.parse(t); - q("number" == typeof n), e = n; - } catch (t) { - $("SharedClientState", "Failed to read sequence number from WebStorage", t); - } - return e; - } - /** - * `MemorySharedClientState` is a simple implementation of SharedClientState for - * clients using memory persistence. The state in this class remains fully - * isolated and no synchronization is performed. - */ (e.newValue); - t !== nt.A && this.sequenceNumberHandler(t); - } else if (e.key === this.dr) return this.syncEngine.Cr(); - } else this.ir.push(e); - })); - } - } - get Ir() { - return this.sr.get(this.tr); - } - _r() { - this.setItem(this.rr, this.Ir.Yi()); - } - yr(t, e, n) { - const s = new Eo(this.currentUser, t, e, n), i = Io(this.persistenceKey, this.currentUser, t); - this.setItem(i, s.Yi()); - } - pr(t) { - const e = Io(this.persistenceKey, this.currentUser, t); - this.removeItem(e); - } - Er(t) { - const e = { - clientId: this.tr, - onlineState: t - }; - this.storage.setItem(this.lr, JSON.stringify(e)); - } - Tr(t, e, n) { - const s = To(this.persistenceKey, t), i = new Ao(t, e, n); - this.setItem(s, i.Yi()); - } - Ar() { - this.setItem(this.dr, "value-not-used"); - } - /** - * Parses a client state key in WebStorage. Returns null if the key does not - * match the expected key format. - */ Rr(t) { - const e = this.ur.exec(t); - return e ? e[1] : null; - } - /** - * Parses a client state in WebStorage. Returns 'null' if the value could not - * be parsed. - */ Pr(t, e) { - const n = this.Rr(t); - return Ro.Ji(n, e); - } - /** - * Parses a mutation batch state in WebStorage. Returns 'null' if the value - * could not be parsed. - */ Vr(t, e) { - const n = this.cr.exec(t), s = Number(n[1]), i = void 0 !== n[2] ? n[2] : null; - return Eo.Ji(new C(i), s, e); - } - /** - * Parses a query target state from WebStorage. Returns 'null' if the value - * could not be parsed. - */ Sr(t, e) { - const n = this.hr.exec(t), s = Number(n[1]); - return Ao.Ji(s, e); - } - /** - * Parses an online state from WebStorage. Returns 'null' if the value - * could not be parsed. - */ wr(t) { - return bo.Ji(t); - } - async vr(t) { - if (t.user.uid === this.currentUser.uid) return this.syncEngine.Nr(t.batchId, t.state, t.error); - O("SharedClientState", `Ignoring mutation for non-active user ${t.user.uid}`); - } - Dr(t) { - return this.syncEngine.kr(t.targetId, t.state, t.error); - } - br(t, e) { - const n = e ? this.sr.insert(t, e) : this.sr.remove(t), s = this.gr(this.sr), i = this.gr(n), r = [], o = []; - return i.forEach((t => { - s.has(t) || r.push(t); - })), s.forEach((t => { - i.has(t) || o.push(t); - })), this.syncEngine.Mr(r, o).then((() => { - this.sr = n; - })); - } - mr(t) { - // We check whether the client that wrote this online state is still active - // by comparing its client ID to the list of clients kept active in - // IndexedDb. If a client does not update their IndexedDb client state - // within 5 seconds, it is considered inactive and we don't emit an online - // state event. - this.sr.get(t.clientId) && this.onlineStateHandler(t.onlineState); - } - gr(t) { - let e = jn(); - return t.forEach(((t, n) => { - e = e.unionWith(n.activeTargetIds); - })), e; - } -} - -class vo { - constructor() { - this.Or = new Po, this.$r = {}, this.onlineStateHandler = null, this.sequenceNumberHandler = null; - } - addPendingMutation(t) { - // No op. - } - updateMutationState(t, e, n) { - // No op. - } - addLocalQueryTarget(t) { - return this.Or.Xi(t), this.$r[t] || "not-current"; - } - updateQueryState(t, e, n) { - this.$r[t] = e; - } - removeLocalQueryTarget(t) { - this.Or.Zi(t); - } - isLocalQueryTarget(t) { - return this.Or.activeTargetIds.has(t); - } - clearQueryState(t) { - delete this.$r[t]; - } - getAllActiveQueryTargets() { - return this.Or.activeTargetIds; - } - isActiveQueryTarget(t) { - return this.Or.activeTargetIds.has(t); - } - start() { - return this.Or = new Po, Promise.resolve(); - } - handleUserChange(t, e, n) { - // No op. - } - setOnlineState(t) { - // No op. - } - shutdown() {} - writeSequenceNumber(t) {} - notifyBundleLoaded() { - // No op. - } -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ class So { - Fr(t) { - // No-op. - } - shutdown() { - // No-op. - } -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -// References to `window` are guarded by BrowserConnectivityMonitor.isAvailable() -/* eslint-disable no-restricted-globals */ -/** - * Browser implementation of ConnectivityMonitor. - */ -class Do { - constructor() { - this.Br = () => this.Lr(), this.qr = () => this.Ur(), this.Kr = [], this.Gr(); - } - Fr(t) { - this.Kr.push(t); - } - shutdown() { - window.removeEventListener("online", this.Br), window.removeEventListener("offline", this.qr); - } - Gr() { - window.addEventListener("online", this.Br), window.addEventListener("offline", this.qr); - } - Lr() { - O("ConnectivityMonitor", "Network connectivity changed: AVAILABLE"); - for (const t of this.Kr) t(0 /* AVAILABLE */); - } - Ur() { - O("ConnectivityMonitor", "Network connectivity changed: UNAVAILABLE"); - for (const t of this.Kr) t(1 /* UNAVAILABLE */); - } - // TODO(chenbrian): Consider passing in window either into this component or - // here for testing via FakeWindow. - /** Checks that all used attributes of window are available. */ - static vt() { - return "undefined" != typeof window && void 0 !== window.addEventListener && void 0 !== window.removeEventListener; - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ const Co = { - BatchGetDocuments: "batchGet", - Commit: "commit", - RunQuery: "runQuery" -}; - -/** - * Maps RPC names to the corresponding REST endpoint name. - * - * We use array notation to avoid mangling. - */ -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Provides a simple helper class that implements the Stream interface to - * bridge to other implementations that are streams but do not implement the - * interface. The stream callbacks are invoked with the callOn... methods. - */ -class xo { - constructor(t) { - this.Qr = t.Qr, this.jr = t.jr; - } - Wr(t) { - this.zr = t; - } - Hr(t) { - this.Jr = t; - } - onMessage(t) { - this.Yr = t; - } - close() { - this.jr(); - } - send(t) { - this.Qr(t); - } - Xr() { - this.zr(); - } - Zr(t) { - this.Jr(t); - } - eo(t) { - this.Yr(t); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ class No extends -/** - * Base class for all Rest-based connections to the backend (WebChannel and - * HTTP). - */ -class { - constructor(t) { - this.databaseInfo = t, this.databaseId = t.databaseId; - const e = t.ssl ? "https" : "http"; - this.no = e + "://" + t.host, this.so = "projects/" + this.databaseId.projectId + "/databases/" + this.databaseId.database + "/documents"; - } - io(t, e, n, s, i) { - const r = this.ro(t, e); - O("RestConnection", "Sending: ", r, n); - const o = {}; - return this.oo(o, s, i), this.ao(t, r, o, n).then((t => (O("RestConnection", "Received: ", t), - t)), (e => { - throw F("RestConnection", `${t} failed with error: `, e, "url: ", r, "request:", n), - e; - })); - } - uo(t, e, n, s, i) { - // The REST API automatically aggregates all of the streamed results, so we - // can just use the normal invoke() method. - return this.io(t, e, n, s, i); - } - /** - * Modifies the headers for a request, adding any authorization token if - * present and any additional headers for the request. - */ oo(t, e, n) { - t["X-Goog-Api-Client"] = "gl-js/ fire/" + x, - // Content-Type: text/plain will avoid preflight requests which might - // mess with CORS and redirects by proxies. If we add custom headers - // we will need to change this code to potentially use the $httpOverwrite - // parameter supported by ESF to avoid triggering preflight requests. - t["Content-Type"] = "text/plain", this.databaseInfo.appId && (t["X-Firebase-GMPID"] = this.databaseInfo.appId), - e && e.headers.forEach(((e, n) => t[n] = e)), n && n.headers.forEach(((e, n) => t[n] = e)); - } - ro(t, e) { - const n = Co[t]; - return `${this.no}/v1/${e}:${n}`; - } -} { - constructor(t) { - super(t), this.forceLongPolling = t.forceLongPolling, this.autoDetectLongPolling = t.autoDetectLongPolling, - this.useFetchStreams = t.useFetchStreams; - } - ao(t, e, n, s) { - return new Promise(((i, r) => { - const o = new _firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.XhrIo; - o.listenOnce(_firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.EventType.COMPLETE, (() => { - try { - switch (o.getLastErrorCode()) { - case _firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.ErrorCode.NO_ERROR: - const e = o.getResponseJson(); - O("Connection", "XHR received:", JSON.stringify(e)), i(e); - break; - - case _firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.ErrorCode.TIMEOUT: - O("Connection", 'RPC "' + t + '" timed out'), r(new Q(G.DEADLINE_EXCEEDED, "Request time out")); - break; - - case _firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.ErrorCode.HTTP_ERROR: - const n = o.getStatus(); - if (O("Connection", 'RPC "' + t + '" failed with status:', n, "response text:", o.getResponseText()), - n > 0) { - const t = o.getResponseJson().error; - if (t && t.status && t.message) { - const e = function(t) { - const e = t.toLowerCase().replace(/_/g, "-"); - return Object.values(G).indexOf(e) >= 0 ? e : G.UNKNOWN; - }(t.status); - r(new Q(e, t.message)); - } else r(new Q(G.UNKNOWN, "Server responded with status " + o.getStatus())); - } else - // If we received an HTTP_ERROR but there's no status code, - // it's most probably a connection issue - r(new Q(G.UNAVAILABLE, "Connection failed.")); - break; - - default: - L(); - } - } finally { - O("Connection", 'RPC "' + t + '" completed.'); - } - })); - const a = JSON.stringify(s); - o.send(e, "POST", a, n, 15); - })); - } - co(t, e, n) { - const s = [ this.no, "/", "google.firestore.v1.Firestore", "/", t, "/channel" ], i = (0,_firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.createWebChannelTransport)(), r = (0,_firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.getStatEventTarget)(), o = { - // Required for backend stickiness, routing behavior is based on this - // parameter. - httpSessionIdParam: "gsessionid", - initMessageHeaders: {}, - messageUrlParams: { - // This param is used to improve routing and project isolation by the - // backend and must be included in every request. - database: `projects/${this.databaseId.projectId}/databases/${this.databaseId.database}` - }, - sendRawJson: !0, - supportsCrossDomainXhr: !0, - internalChannelParams: { - // Override the default timeout (randomized between 10-20 seconds) since - // a large write batch on a slow internet connection may take a long - // time to send to the backend. Rather than have WebChannel impose a - // tight timeout which could lead to infinite timeouts and retries, we - // set it very large (5-10 minutes) and rely on the browser's builtin - // timeouts to kick in if the request isn't working. - forwardChannelRequestTimeoutMs: 6e5 - }, - forceLongPolling: this.forceLongPolling, - detectBufferingProxy: this.autoDetectLongPolling - }; - this.useFetchStreams && (o.xmlHttpFactory = new _firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.FetchXmlHttpFactory({})), this.oo(o.initMessageHeaders, e, n), - // Sending the custom headers we just added to request.initMessageHeaders - // (Authorization, etc.) will trigger the browser to make a CORS preflight - // request because the XHR will no longer meet the criteria for a "simple" - // CORS request: - // https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Simple_requests - // Therefore to avoid the CORS preflight request (an extra network - // roundtrip), we use the httpHeadersOverwriteParam option to specify that - // the headers should instead be encoded into a special "$httpHeaders" query - // parameter, which is recognized by the webchannel backend. This is - // formally defined here: - // https://github.com/google/closure-library/blob/b0e1815b13fb92a46d7c9b3c30de5d6a396a3245/closure/goog/net/rpc/httpcors.js#L32 - // TODO(b/145624756): There is a backend bug where $httpHeaders isn't respected if the request - // doesn't have an Origin header. So we have to exclude a few browser environments that are - // known to (sometimes) not include an Origin. See - // https://github.com/firebase/firebase-js-sdk/issues/1491. - (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.isMobileCordova)() || (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.isReactNative)() || (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.isElectron)() || (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.isIE)() || (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.isUWP)() || (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.isBrowserExtension)() || (o.httpHeadersOverwriteParam = "$httpHeaders"); - const a = s.join(""); - O("Connection", "Creating WebChannel: " + a, o); - const u = i.createWebChannel(a, o); - // WebChannel supports sending the first message with the handshake - saving - // a network round trip. However, it will have to call send in the same - // JS event loop as open. In order to enforce this, we delay actually - // opening the WebChannel until send is called. Whether we have called - // open is tracked with this variable. - let c = !1, h = !1; - // A flag to determine whether the stream was closed (by us or through an - // error/close event) to avoid delivering multiple close events or sending - // on a closed stream - const l = new xo({ - Qr: t => { - h ? O("Connection", "Not sending because WebChannel is closed:", t) : (c || (O("Connection", "Opening WebChannel transport."), - u.open(), c = !0), O("Connection", "WebChannel sending:", t), u.send(t)); - }, - jr: () => u.close() - }), y = (t, e, n) => { - // TODO(dimond): closure typing seems broken because WebChannel does - // not implement goog.events.Listenable - t.listen(e, (t => { - try { - n(t); - } catch (t) { - setTimeout((() => { - throw t; - }), 0); - } - })); - }; - // Closure events are guarded and exceptions are swallowed, so catch any - // exception and rethrow using a setTimeout so they become visible again. - // Note that eventually this function could go away if we are confident - // enough the code is exception free. - return y(u, _firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.WebChannel.EventType.OPEN, (() => { - h || O("Connection", "WebChannel transport opened."); - })), y(u, _firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.WebChannel.EventType.CLOSE, (() => { - h || (h = !0, O("Connection", "WebChannel transport closed"), l.Zr()); - })), y(u, _firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.WebChannel.EventType.ERROR, (t => { - h || (h = !0, F("Connection", "WebChannel transport errored:", t), l.Zr(new Q(G.UNAVAILABLE, "The operation could not be completed"))); - })), y(u, _firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.WebChannel.EventType.MESSAGE, (t => { - var e; - if (!h) { - const n = t.data[0]; - q(!!n); - // TODO(b/35143891): There is a bug in One Platform that caused errors - // (and only errors) to be wrapped in an extra array. To be forward - // compatible with the bug we need to check either condition. The latter - // can be removed once the fix has been rolled out. - // Use any because msgData.error is not typed. - const s = n, i = s.error || (null === (e = s[0]) || void 0 === e ? void 0 : e.error); - if (i) { - O("Connection", "WebChannel received error:", i); - // error.status will be a string like 'OK' or 'NOT_FOUND'. - const t = i.status; - let e = - /** - * Maps an error Code from a GRPC status identifier like 'NOT_FOUND'. - * - * @returns The Code equivalent to the given status string or undefined if - * there is no match. - */ - function(t) { - // lookup by string - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const e = Pn[t]; - if (void 0 !== e) return Sn(e); - }(t), n = i.message; - void 0 === e && (e = G.INTERNAL, n = "Unknown error status: " + t + " with message " + i.message), - // Mark closed so no further events are propagated - h = !0, l.Zr(new Q(e, n)), u.close(); - } else O("Connection", "WebChannel received:", n), l.eo(n); - } - })), y(r, _firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.Event.STAT_EVENT, (t => { - t.stat === _firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.Stat.PROXY ? O("Connection", "Detected buffering proxy") : t.stat === _firebase_webchannel_wrapper__WEBPACK_IMPORTED_MODULE_4__.Stat.NOPROXY && O("Connection", "Detected no buffering proxy"); - })), setTimeout((() => { - // Technically we could/should wait for the WebChannel opened event, - // but because we want to send the first message with the WebChannel - // handshake we pretend the channel opened here (asynchronously), and - // then delay the actual open until the first message is sent. - l.Xr(); - }), 0), l; - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** Initializes the WebChannelConnection for the browser. */ -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** The Platform's 'window' implementation or null if not available. */ -function ko() { - // `window` is not always available, e.g. in ReactNative and WebWorkers. - // eslint-disable-next-line no-restricted-globals - return "undefined" != typeof window ? window : null; -} - -/** The Platform's 'document' implementation or null if not available. */ function Mo() { - // `document` is not always available, e.g. in ReactNative and WebWorkers. - // eslint-disable-next-line no-restricted-globals - return "undefined" != typeof document ? document : null; -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ function Oo(t) { - return new is(t, /* useProto3Json= */ !0); -} - -/** - * An instance of the Platform's 'TextEncoder' implementation. - */ -/** - * A helper for running delayed tasks following an exponential backoff curve - * between attempts. - * - * Each delay is made up of a "base" delay which follows the exponential - * backoff curve, and a +/- 50% "jitter" that is calculated and added to the - * base delay. This prevents clients from accidentally synchronizing their - * delays causing spikes of load to the backend. - */ -class $o { - constructor( - /** - * The AsyncQueue to run backoff operations on. - */ - t, - /** - * The ID to use when scheduling backoff operations on the AsyncQueue. - */ - e, - /** - * The initial delay (used as the base delay on the first retry attempt). - * Note that jitter will still be applied, so the actual delay could be as - * little as 0.5*initialDelayMs. - */ - n = 1e3 - /** - * The multiplier to use to determine the extended base delay after each - * attempt. - */ , s = 1.5 - /** - * The maximum base delay after which no further backoff is performed. - * Note that jitter will still be applied, so the actual delay could be as - * much as 1.5*maxDelayMs. - */ , i = 6e4) { - this.Hn = t, this.timerId = e, this.ho = n, this.lo = s, this.fo = i, this._o = 0, - this.wo = null, - /** The last backoff attempt, as epoch milliseconds. */ - this.mo = Date.now(), this.reset(); - } - /** - * Resets the backoff delay. - * - * The very next backoffAndWait() will have no delay. If it is called again - * (i.e. due to an error), initialDelayMs (plus jitter) will be used, and - * subsequent ones will increase according to the backoffFactor. - */ reset() { - this._o = 0; - } - /** - * Resets the backoff delay to the maximum delay (e.g. for use after a - * RESOURCE_EXHAUSTED error). - */ yo() { - this._o = this.fo; - } - /** - * Returns a promise that resolves after currentDelayMs, and increases the - * delay for any subsequent attempts. If there was a pending backoff operation - * already, it will be canceled. - */ po(t) { - // Cancel any pending backoff operation. - this.cancel(); - // First schedule using the current base (which may be 0 and should be - // honored as such). - const e = Math.floor(this._o + this.Io()), n = Math.max(0, Date.now() - this.mo), s = Math.max(0, e - n); - // Guard against lastAttemptTime being in the future due to a clock change. - s > 0 && O("ExponentialBackoff", `Backing off for ${s} ms (base delay: ${this._o} ms, delay with jitter: ${e} ms, last attempt: ${n} ms ago)`), - this.wo = this.Hn.enqueueAfterDelay(this.timerId, s, (() => (this.mo = Date.now(), - t()))), - // Apply backoff factor to determine next delay and ensure it is within - // bounds. - this._o *= this.lo, this._o < this.ho && (this._o = this.ho), this._o > this.fo && (this._o = this.fo); - } - To() { - null !== this.wo && (this.wo.skipDelay(), this.wo = null); - } - cancel() { - null !== this.wo && (this.wo.cancel(), this.wo = null); - } - /** Returns a random value in the range [-currentBaseMs/2, currentBaseMs/2] */ Io() { - return (Math.random() - .5) * this._o; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A PersistentStream is an abstract base class that represents a streaming RPC - * to the Firestore backend. It's built on top of the connections own support - * for streaming RPCs, and adds several critical features for our clients: - * - * - Exponential backoff on failure - * - Authentication via CredentialsProvider - * - Dispatching all callbacks into the shared worker queue - * - Closing idle streams after 60 seconds of inactivity - * - * Subclasses of PersistentStream implement serialization of models to and - * from the JSON representation of the protocol buffers for a specific - * streaming RPC. - * - * ## Starting and Stopping - * - * Streaming RPCs are stateful and need to be start()ed before messages can - * be sent and received. The PersistentStream will call the onOpen() function - * of the listener once the stream is ready to accept requests. - * - * Should a start() fail, PersistentStream will call the registered onClose() - * listener with a FirestoreError indicating what went wrong. - * - * A PersistentStream can be started and stopped repeatedly. - * - * Generic types: - * SendType: The type of the outgoing message of the underlying - * connection stream - * ReceiveType: The type of the incoming message of the underlying - * connection stream - * ListenerType: The type of the listener that will be used for callbacks - */ -class Fo { - constructor(t, e, n, s, i, r, o, a) { - this.Hn = t, this.Eo = n, this.Ao = s, this.Ro = i, this.authCredentialsProvider = r, - this.appCheckCredentialsProvider = o, this.listener = a, this.state = 0 /* Initial */ , - /** - * A close count that's incremented every time the stream is closed; used by - * getCloseGuardedDispatcher() to invalidate callbacks that happen after - * close. - */ - this.bo = 0, this.Po = null, this.Vo = null, this.stream = null, this.vo = new $o(t, e); - } - /** - * Returns true if start() has been called and no error has occurred. True - * indicates the stream is open or in the process of opening (which - * encompasses respecting backoff, getting auth tokens, and starting the - * actual RPC). Use isOpen() to determine if the stream is open and ready for - * outbound requests. - */ So() { - return 1 /* Starting */ === this.state || 5 /* Backoff */ === this.state || this.Do(); - } - /** - * Returns true if the underlying RPC is open (the onOpen() listener has been - * called) and the stream is ready for outbound requests. - */ Do() { - return 2 /* Open */ === this.state || 3 /* Healthy */ === this.state; - } - /** - * Starts the RPC. Only allowed if isStarted() returns false. The stream is - * not immediately ready for use: onOpen() will be invoked when the RPC is - * ready for outbound requests, at which point isOpen() will return true. - * - * When start returns, isStarted() will return true. - */ start() { - 4 /* Error */ !== this.state ? this.auth() : this.Co(); - } - /** - * Stops the RPC. This call is idempotent and allowed regardless of the - * current isStarted() state. - * - * When stop returns, isStarted() and isOpen() will both return false. - */ async stop() { - this.So() && await this.close(0 /* Initial */); - } - /** - * After an error the stream will usually back off on the next attempt to - * start it. If the error warrants an immediate restart of the stream, the - * sender can use this to indicate that the receiver should not back off. - * - * Each error will call the onClose() listener. That function can decide to - * inhibit backoff if required. - */ xo() { - this.state = 0 /* Initial */ , this.vo.reset(); - } - /** - * Marks this stream as idle. If no further actions are performed on the - * stream for one minute, the stream will automatically close itself and - * notify the stream's onClose() handler with Status.OK. The stream will then - * be in a !isStarted() state, requiring the caller to start the stream again - * before further use. - * - * Only streams that are in state 'Open' can be marked idle, as all other - * states imply pending network operations. - */ No() { - // Starts the idle time if we are in state 'Open' and are not yet already - // running a timer (in which case the previous idle timeout still applies). - this.Do() && null === this.Po && (this.Po = this.Hn.enqueueAfterDelay(this.Eo, 6e4, (() => this.ko()))); - } - /** Sends a message to the underlying stream. */ Mo(t) { - this.Oo(), this.stream.send(t); - } - /** Called by the idle timer when the stream should close due to inactivity. */ async ko() { - if (this.Do()) - // When timing out an idle stream there's no reason to force the stream into backoff when - // it restarts so set the stream state to Initial instead of Error. - return this.close(0 /* Initial */); - } - /** Marks the stream as active again. */ Oo() { - this.Po && (this.Po.cancel(), this.Po = null); - } - /** Cancels the health check delayed operation. */ $o() { - this.Vo && (this.Vo.cancel(), this.Vo = null); - } - /** - * Closes the stream and cleans up as necessary: - * - * * closes the underlying GRPC stream; - * * calls the onClose handler with the given 'error'; - * * sets internal stream state to 'finalState'; - * * adjusts the backoff timer based on the error - * - * A new stream can be opened by calling start(). - * - * @param finalState - the intended state of the stream after closing. - * @param error - the error the connection was closed with. - */ async close(t, e) { - // Cancel any outstanding timers (they're guaranteed not to execute). - this.Oo(), this.$o(), this.vo.cancel(), - // Invalidates any stream-related callbacks (e.g. from auth or the - // underlying stream), guaranteeing they won't execute. - this.bo++, 4 /* Error */ !== t ? - // If this is an intentional close ensure we don't delay our next connection attempt. - this.vo.reset() : e && e.code === G.RESOURCE_EXHAUSTED ? ( - // Log the error. (Probably either 'quota exceeded' or 'max queue length reached'.) - $(e.toString()), $("Using maximum backoff delay to prevent overloading the backend."), - this.vo.yo()) : e && e.code === G.UNAUTHENTICATED && 3 /* Healthy */ !== this.state && ( - // "unauthenticated" error means the token was rejected. This should rarely - // happen since both Auth and AppCheck ensure a sufficient TTL when we - // request a token. If a user manually resets their system clock this can - // fail, however. In this case, we should get a Code.UNAUTHENTICATED error - // before we received the first message and we need to invalidate the token - // to ensure that we fetch a new token. - this.authCredentialsProvider.invalidateToken(), this.appCheckCredentialsProvider.invalidateToken()), - // Clean up the underlying stream because we are no longer interested in events. - null !== this.stream && (this.Fo(), this.stream.close(), this.stream = null), - // This state must be assigned before calling onClose() to allow the callback to - // inhibit backoff or otherwise manipulate the state in its non-started state. - this.state = t, - // Notify the listener that the stream closed. - await this.listener.Hr(e); - } - /** - * Can be overridden to perform additional cleanup before the stream is closed. - * Calling super.tearDown() is not required. - */ Fo() {} - auth() { - this.state = 1 /* Starting */; - const t = this.Bo(this.bo), e = this.bo; - // TODO(mikelehen): Just use dispatchIfNotClosed, but see TODO below. - Promise.all([ this.authCredentialsProvider.getToken(), this.appCheckCredentialsProvider.getToken() ]).then((([t, n]) => { - // Stream can be stopped while waiting for authentication. - // TODO(mikelehen): We really should just use dispatchIfNotClosed - // and let this dispatch onto the queue, but that opened a spec test can - // of worms that I don't want to deal with in this PR. - this.bo === e && - // Normally we'd have to schedule the callback on the AsyncQueue. - // However, the following calls are safe to be called outside the - // AsyncQueue since they don't chain asynchronous calls - this.Lo(t, n); - }), (e => { - t((() => { - const t = new Q(G.UNKNOWN, "Fetching auth token failed: " + e.message); - return this.qo(t); - })); - })); - } - Lo(t, e) { - const n = this.Bo(this.bo); - this.stream = this.Uo(t, e), this.stream.Wr((() => { - n((() => (this.state = 2 /* Open */ , this.Vo = this.Hn.enqueueAfterDelay(this.Ao, 1e4, (() => (this.Do() && (this.state = 3 /* Healthy */), - Promise.resolve()))), this.listener.Wr()))); - })), this.stream.Hr((t => { - n((() => this.qo(t))); - })), this.stream.onMessage((t => { - n((() => this.onMessage(t))); - })); - } - Co() { - this.state = 5 /* Backoff */ , this.vo.po((async () => { - this.state = 0 /* Initial */ , this.start(); - })); - } - // Visible for tests - qo(t) { - // In theory the stream could close cleanly, however, in our current model - // we never expect this to happen because if we stop a stream ourselves, - // this callback will never be called. To prevent cases where we retry - // without a backoff accidentally, we set the stream to error in all cases. - return O("PersistentStream", `close with error: ${t}`), this.stream = null, this.close(4 /* Error */ , t); - } - /** - * Returns a "dispatcher" function that dispatches operations onto the - * AsyncQueue but only runs them if closeCount remains unchanged. This allows - * us to turn auth / stream callbacks into no-ops if the stream is closed / - * re-opened, etc. - */ Bo(t) { - return e => { - this.Hn.enqueueAndForget((() => this.bo === t ? e() : (O("PersistentStream", "stream callback skipped by getCloseGuardedDispatcher."), - Promise.resolve()))); - }; - } -} - -/** - * A PersistentStream that implements the Listen RPC. - * - * Once the Listen stream has called the onOpen() listener, any number of - * listen() and unlisten() calls can be made to control what changes will be - * sent from the server for ListenResponses. - */ class Bo extends Fo { - constructor(t, e, n, s, i, r) { - super(t, "listen_stream_connection_backoff" /* ListenStreamConnectionBackoff */ , "listen_stream_idle" /* ListenStreamIdle */ , "health_check_timeout" /* HealthCheckTimeout */ , e, n, s, r), - this.M = i; - } - Uo(t, e) { - return this.Ro.co("Listen", t, e); - } - onMessage(t) { - // A successful response means the stream is healthy - this.vo.reset(); - const e = Is(this.M, t), n = function(t) { - // We have only reached a consistent snapshot for the entire stream if there - // is a read_time set and it applies to all targets (i.e. the list of - // targets is empty). The backend is guaranteed to send such responses. - if (!("targetChange" in t)) return ct.min(); - const e = t.targetChange; - return e.targetIds && e.targetIds.length ? ct.min() : e.readTime ? us(e.readTime) : ct.min(); - }(t); - return this.listener.Ko(e, n); - } - /** - * Registers interest in the results of the given target. If the target - * includes a resumeToken it will be included in the request. Results that - * affect the target will be streamed back as WatchChange messages that - * reference the targetId. - */ Go(t) { - const e = {}; - e.database = ws(this.M), e.addTarget = function(t, e) { - let n; - const s = e.target; - return n = fe(s) ? { - documents: Rs(t, s) - } : { - query: bs(t, s) - }, n.targetId = e.targetId, e.resumeToken.approximateByteSize() > 0 ? n.resumeToken = os(t, e.resumeToken) : e.snapshotVersion.compareTo(ct.min()) > 0 && ( - // TODO(wuandy): Consider removing above check because it is most likely true. - // Right now, many tests depend on this behaviour though (leaving min() out - // of serialization). - n.readTime = rs(t, e.snapshotVersion.toTimestamp())), n; - }(this.M, t); - const n = Vs(this.M, t); - n && (e.labels = n), this.Mo(e); - } - /** - * Unregisters interest in the results of the target associated with the - * given targetId. - */ Qo(t) { - const e = {}; - e.database = ws(this.M), e.removeTarget = t, this.Mo(e); - } -} - -/** - * A Stream that implements the Write RPC. - * - * The Write RPC requires the caller to maintain special streamToken - * state in between calls, to help the server understand which responses the - * client has processed by the time the next request is made. Every response - * will contain a streamToken; this value must be passed to the next - * request. - * - * After calling start() on this stream, the next request must be a handshake, - * containing whatever streamToken is on hand. Once a response to this - * request is received, all pending mutations may be submitted. When - * submitting multiple batches of mutations at the same time, it's - * okay to use the same streamToken for the calls to writeMutations. - * - * TODO(b/33271235): Use proto types - */ class Lo extends Fo { - constructor(t, e, n, s, i, r) { - super(t, "write_stream_connection_backoff" /* WriteStreamConnectionBackoff */ , "write_stream_idle" /* WriteStreamIdle */ , "health_check_timeout" /* HealthCheckTimeout */ , e, n, s, r), - this.M = i, this.jo = !1; - } - /** - * Tracks whether or not a handshake has been successfully exchanged and - * the stream is ready to accept mutations. - */ get Wo() { - return this.jo; - } - // Override of PersistentStream.start - start() { - this.jo = !1, this.lastStreamToken = void 0, super.start(); - } - Fo() { - this.jo && this.zo([]); - } - Uo(t, e) { - return this.Ro.co("Write", t, e); - } - onMessage(t) { - if ( - // Always capture the last stream token. - q(!!t.streamToken), this.lastStreamToken = t.streamToken, this.jo) { - // A successful first write response means the stream is healthy, - // Note, that we could consider a successful handshake healthy, however, - // the write itself might be causing an error we want to back off from. - this.vo.reset(); - const e = As(t.writeResults, t.commitTime), n = us(t.commitTime); - return this.listener.Ho(n, e); - } - // The first response is always the handshake response - return q(!t.writeResults || 0 === t.writeResults.length), this.jo = !0, this.listener.Jo(); - } - /** - * Sends an initial streamToken to the server, performing the handshake - * required to make the StreamingWrite RPC work. Subsequent - * calls should wait until onHandshakeComplete was called. - */ Yo() { - // TODO(dimond): Support stream resumption. We intentionally do not set the - // stream token on the handshake, ignoring any stream token we might have. - const t = {}; - t.database = ws(this.M), this.Mo(t); - } - /** Sends a group of mutations to the Firestore backend to apply. */ zo(t) { - const e = { - streamToken: this.lastStreamToken, - writes: t.map((t => Ts(this.M, t))) - }; - this.Mo(e); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Datastore and its related methods are a wrapper around the external Google - * Cloud Datastore grpc API, which provides an interface that is more convenient - * for the rest of the client SDK architecture to consume. - */ -/** - * An implementation of Datastore that exposes additional state for internal - * consumption. - */ -class qo extends class {} { - constructor(t, e, n, s) { - super(), this.authCredentials = t, this.appCheckCredentials = e, this.Ro = n, this.M = s, - this.Xo = !1; - } - Zo() { - if (this.Xo) throw new Q(G.FAILED_PRECONDITION, "The client has already been terminated."); - } - /** Invokes the provided RPC with auth and AppCheck tokens. */ io(t, e, n) { - return this.Zo(), Promise.all([ this.authCredentials.getToken(), this.appCheckCredentials.getToken() ]).then((([s, i]) => this.Ro.io(t, e, n, s, i))).catch((t => { - throw "FirebaseError" === t.name ? (t.code === G.UNAUTHENTICATED && (this.authCredentials.invalidateToken(), - this.appCheckCredentials.invalidateToken()), t) : new Q(G.UNKNOWN, t.toString()); - })); - } - /** Invokes the provided RPC with streamed results with auth and AppCheck tokens. */ uo(t, e, n) { - return this.Zo(), Promise.all([ this.authCredentials.getToken(), this.appCheckCredentials.getToken() ]).then((([s, i]) => this.Ro.uo(t, e, n, s, i))).catch((t => { - throw "FirebaseError" === t.name ? (t.code === G.UNAUTHENTICATED && (this.authCredentials.invalidateToken(), - this.appCheckCredentials.invalidateToken()), t) : new Q(G.UNKNOWN, t.toString()); - })); - } - terminate() { - this.Xo = !0; - } -} - -// TODO(firestorexp): Make sure there is only one Datastore instance per -// firestore-exp client. -/** - * A component used by the RemoteStore to track the OnlineState (that is, - * whether or not the client as a whole should be considered to be online or - * offline), implementing the appropriate heuristics. - * - * In particular, when the client is trying to connect to the backend, we - * allow up to MAX_WATCH_STREAM_FAILURES within ONLINE_STATE_TIMEOUT_MS for - * a connection to succeed. If we have too many failures or the timeout elapses, - * then we set the OnlineState to Offline, and the client will behave as if - * it is offline (get()s will return cached data, etc.). - */ -class Uo { - constructor(t, e) { - this.asyncQueue = t, this.onlineStateHandler = e, - /** The current OnlineState. */ - this.state = "Unknown" /* Unknown */ , - /** - * A count of consecutive failures to open the stream. If it reaches the - * maximum defined by MAX_WATCH_STREAM_FAILURES, we'll set the OnlineState to - * Offline. - */ - this.ta = 0, - /** - * A timer that elapses after ONLINE_STATE_TIMEOUT_MS, at which point we - * transition from OnlineState.Unknown to OnlineState.Offline without waiting - * for the stream to actually fail (MAX_WATCH_STREAM_FAILURES times). - */ - this.ea = null, - /** - * Whether the client should log a warning message if it fails to connect to - * the backend (initially true, cleared after a successful stream, or if we've - * logged the message already). - */ - this.na = !0; - } - /** - * Called by RemoteStore when a watch stream is started (including on each - * backoff attempt). - * - * If this is the first attempt, it sets the OnlineState to Unknown and starts - * the onlineStateTimer. - */ sa() { - 0 === this.ta && (this.ia("Unknown" /* Unknown */), this.ea = this.asyncQueue.enqueueAfterDelay("online_state_timeout" /* OnlineStateTimeout */ , 1e4, (() => (this.ea = null, - this.ra("Backend didn't respond within 10 seconds."), this.ia("Offline" /* Offline */), - Promise.resolve())))); - } - /** - * Updates our OnlineState as appropriate after the watch stream reports a - * failure. The first failure moves us to the 'Unknown' state. We then may - * allow multiple failures (based on MAX_WATCH_STREAM_FAILURES) before we - * actually transition to the 'Offline' state. - */ oa(t) { - "Online" /* Online */ === this.state ? this.ia("Unknown" /* Unknown */) : (this.ta++, - this.ta >= 1 && (this.aa(), this.ra(`Connection failed 1 times. Most recent error: ${t.toString()}`), - this.ia("Offline" /* Offline */))); - } - /** - * Explicitly sets the OnlineState to the specified state. - * - * Note that this resets our timers / failure counters, etc. used by our - * Offline heuristics, so must not be used in place of - * handleWatchStreamStart() and handleWatchStreamFailure(). - */ set(t) { - this.aa(), this.ta = 0, "Online" /* Online */ === t && ( - // We've connected to watch at least once. Don't warn the developer - // about being offline going forward. - this.na = !1), this.ia(t); - } - ia(t) { - t !== this.state && (this.state = t, this.onlineStateHandler(t)); - } - ra(t) { - const e = `Could not reach Cloud Firestore backend. ${t}\nThis typically indicates that your device does not have a healthy Internet connection at the moment. The client will operate in offline mode until it is able to successfully connect to the backend.`; - this.na ? ($(e), this.na = !1) : O("OnlineStateTracker", e); - } - aa() { - null !== this.ea && (this.ea.cancel(), this.ea = null); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ class Ko { - constructor( - /** - * The local store, used to fill the write pipeline with outbound mutations. - */ - t, - /** The client-side proxy for interacting with the backend. */ - e, n, s, i) { - this.localStore = t, this.datastore = e, this.asyncQueue = n, this.remoteSyncer = {}, - /** - * A list of up to MAX_PENDING_WRITES writes that we have fetched from the - * LocalStore via fillWritePipeline() and have or will send to the write - * stream. - * - * Whenever writePipeline.length > 0 the RemoteStore will attempt to start or - * restart the write stream. When the stream is established the writes in the - * pipeline will be sent in order. - * - * Writes remain in writePipeline until they are acknowledged by the backend - * and thus will automatically be re-sent if the stream is interrupted / - * restarted before they're acknowledged. - * - * Write responses from the backend are linked to their originating request - * purely based on order, and so we can just shift() writes from the front of - * the writePipeline as we receive responses. - */ - this.ua = [], - /** - * A mapping of watched targets that the client cares about tracking and the - * user has explicitly called a 'listen' for this target. - * - * These targets may or may not have been sent to or acknowledged by the - * server. On re-establishing the listen stream, these targets should be sent - * to the server. The targets removed with unlistens are removed eagerly - * without waiting for confirmation from the listen stream. - */ - this.ca = new Map, - /** - * A set of reasons for why the RemoteStore may be offline. If empty, the - * RemoteStore may start its network connections. - */ - this.ha = new Set, - /** - * Event handlers that get called when the network is disabled or enabled. - * - * PORTING NOTE: These functions are used on the Web client to create the - * underlying streams (to support tree-shakeable streams). On Android and iOS, - * the streams are created during construction of RemoteStore. - */ - this.la = [], this.fa = i, this.fa.Fr((t => { - n.enqueueAndForget((async () => { - // Porting Note: Unlike iOS, `restartNetwork()` is called even when the - // network becomes unreachable as we don't have any other way to tear - // down our streams. - Xo(this) && (O("RemoteStore", "Restarting streams for network reachability change."), - await async function(t) { - const e = K(t); - e.ha.add(4 /* ConnectivityChange */), await Qo(e), e.da.set("Unknown" /* Unknown */), - e.ha.delete(4 /* ConnectivityChange */), await Go(e); - }(this)); - })); - })), this.da = new Uo(n, s); - } -} - -async function Go(t) { - if (Xo(t)) for (const e of t.la) await e(/* enabled= */ !0); -} - -/** - * Temporarily disables the network. The network can be re-enabled using - * enableNetwork(). - */ async function Qo(t) { - for (const e of t.la) await e(/* enabled= */ !1); -} - -/** - * Starts new listen for the given target. Uses resume token if provided. It - * is a no-op if the target of given `TargetData` is already being listened to. - */ -function jo(t, e) { - const n = K(t); - n.ca.has(e.targetId) || ( - // Mark this as something the client is currently listening for. - n.ca.set(e.targetId, e), Yo(n) ? - // The listen will be sent in onWatchStreamOpen - Jo(n) : ma(n).Do() && zo(n, e)); -} - -/** - * Removes the listen from server. It is a no-op if the given target id is - * not being listened to. - */ function Wo(t, e) { - const n = K(t), s = ma(n); - n.ca.delete(e), s.Do() && Ho(n, e), 0 === n.ca.size && (s.Do() ? s.No() : Xo(n) && - // Revert to OnlineState.Unknown if the watch stream is not open and we - // have no listeners, since without any listens to send we cannot - // confirm if the stream is healthy and upgrade to OnlineState.Online. - n.da.set("Unknown" /* Unknown */)); -} - -/** - * We need to increment the the expected number of pending responses we're due - * from watch so we wait for the ack to process any messages from this target. - */ function zo(t, e) { - t._a.Z(e.targetId), ma(t).Go(e); -} - -/** - * We need to increment the expected number of pending responses we're due - * from watch so we wait for the removal on the server before we process any - * messages from this target. - */ function Ho(t, e) { - t._a.Z(e), ma(t).Qo(e); -} - -function Jo(t) { - t._a = new Zn({ - getRemoteKeysForTarget: e => t.remoteSyncer.getRemoteKeysForTarget(e), - Et: e => t.ca.get(e) || null - }), ma(t).start(), t.da.sa(); -} - -/** - * Returns whether the watch stream should be started because it's necessary - * and has not yet been started. - */ function Yo(t) { - return Xo(t) && !ma(t).So() && t.ca.size > 0; -} - -function Xo(t) { - return 0 === K(t).ha.size; -} - -function Zo(t) { - t._a = void 0; -} - -async function ta(t) { - t.ca.forEach(((e, n) => { - zo(t, e); - })); -} - -async function ea(t, e) { - Zo(t), - // If we still need the watch stream, retry the connection. - Yo(t) ? (t.da.oa(e), Jo(t)) : - // No need to restart watch stream because there are no active targets. - // The online state is set to unknown because there is no active attempt - // at establishing a connection - t.da.set("Unknown" /* Unknown */); -} - -async function na(t, e, n) { - if ( - // Mark the client as online since we got a message from the server - t.da.set("Online" /* Online */), e instanceof Yn && 2 /* Removed */ === e.state && e.cause) - // There was an error on a target, don't wait for a consistent snapshot - // to raise events - try { - await - /** Handles an error on a target */ - async function(t, e) { - const n = e.cause; - for (const s of e.targetIds) - // A watched target might have been removed already. - t.ca.has(s) && (await t.remoteSyncer.rejectListen(s, n), t.ca.delete(s), t._a.removeTarget(s)); - } - /** - * Attempts to fill our write pipeline with writes from the LocalStore. - * - * Called internally to bootstrap or refill the write pipeline and by - * SyncEngine whenever there are new mutations to process. - * - * Starts the write stream if necessary. - */ (t, e); - } catch (n) { - O("RemoteStore", "Failed to remove targets %s: %s ", e.targetIds.join(","), n), - await sa(t, n); - } else if (e instanceof Hn ? t._a.at(e) : e instanceof Jn ? t._a._t(e) : t._a.ht(e), - !n.isEqual(ct.min())) try { - const e = await Hr(t.localStore); - n.compareTo(e) >= 0 && - // We have received a target change with a global snapshot if the snapshot - // version is not equal to SnapshotVersion.min(). - await - /** - * Takes a batch of changes from the Datastore, repackages them as a - * RemoteEvent, and passes that on to the listener, which is typically the - * SyncEngine. - */ - function(t, e) { - const n = t._a.yt(e); - // Update in-memory resume tokens. LocalStore will update the - // persistent view of these when applying the completed RemoteEvent. - return n.targetChanges.forEach(((n, s) => { - if (n.resumeToken.approximateByteSize() > 0) { - const i = t.ca.get(s); - // A watched target might have been removed already. - i && t.ca.set(s, i.withResumeToken(n.resumeToken, e)); - } - })), - // Re-establish listens for the targets that have been invalidated by - // existence filter mismatches. - n.targetMismatches.forEach((e => { - const n = t.ca.get(e); - if (!n) - // A watched target might have been removed already. - return; - // Clear the resume token for the target, since we're in a known mismatch - // state. - t.ca.set(e, n.withResumeToken(pt.EMPTY_BYTE_STRING, n.snapshotVersion)), - // Cause a hard reset by unwatching and rewatching immediately, but - // deliberately don't send a resume token so that we get a full update. - Ho(t, e); - // Mark the target we send as being on behalf of an existence filter - // mismatch, but don't actually retain that in listenTargets. This ensures - // that we flag the first re-listen this way without impacting future - // listens of this target (that might happen e.g. on reconnect). - const s = new Ai(n.target, e, 1 /* ExistenceFilterMismatch */ , n.sequenceNumber); - zo(t, s); - })), t.remoteSyncer.applyRemoteEvent(n); - }(t, n); - } catch (e) { - O("RemoteStore", "Failed to raise snapshot:", e), await sa(t, e); - } -} - -/** - * Recovery logic for IndexedDB errors that takes the network offline until - * `op` succeeds. Retries are scheduled with backoff using - * `enqueueRetryable()`. If `op()` is not provided, IndexedDB access is - * validated via a generic operation. - * - * The returned Promise is resolved once the network is disabled and before - * any retry attempt. - */ async function sa(t, e, n) { - if (!di(e)) throw e; - t.ha.add(1 /* IndexedDbFailed */), - // Disable network and raise offline snapshots - await Qo(t), t.da.set("Offline" /* Offline */), n || ( - // Use a simple read operation to determine if IndexedDB recovered. - // Ideally, we would expose a health check directly on SimpleDb, but - // RemoteStore only has access to persistence through LocalStore. - n = () => Hr(t.localStore)), - // Probe IndexedDB periodically and re-enable network - t.asyncQueue.enqueueRetryable((async () => { - O("RemoteStore", "Retrying IndexedDB access"), await n(), t.ha.delete(1 /* IndexedDbFailed */), - await Go(t); - })); -} - -/** - * Executes `op`. If `op` fails, takes the network offline until `op` - * succeeds. Returns after the first attempt. - */ function ia(t, e) { - return e().catch((n => sa(t, n, e))); -} - -async function ra(t) { - const e = K(t), n = ga(e); - let s = e.ua.length > 0 ? e.ua[e.ua.length - 1].batchId : -1; - for (;oa(e); ) try { - const t = await Xr(e.localStore, s); - if (null === t) { - 0 === e.ua.length && n.No(); - break; - } - s = t.batchId, aa(e, t); - } catch (t) { - await sa(e, t); - } - ua(e) && ca(e); -} - -/** - * Returns true if we can add to the write pipeline (i.e. the network is - * enabled and the write pipeline is not full). - */ function oa(t) { - return Xo(t) && t.ua.length < 10; -} - -/** - * Queues additional writes to be sent to the write stream, sending them - * immediately if the write stream is established. - */ function aa(t, e) { - t.ua.push(e); - const n = ga(t); - n.Do() && n.Wo && n.zo(e.mutations); -} - -function ua(t) { - return Xo(t) && !ga(t).So() && t.ua.length > 0; -} - -function ca(t) { - ga(t).start(); -} - -async function ha(t) { - ga(t).Yo(); -} - -async function la(t) { - const e = ga(t); - // Send the write pipeline now that the stream is established. - for (const n of t.ua) e.zo(n.mutations); -} - -async function fa(t, e, n) { - const s = t.ua.shift(), i = Ti.from(s, e, n); - await ia(t, (() => t.remoteSyncer.applySuccessfulWrite(i))), - // It's possible that with the completion of this mutation another - // slot has freed up. - await ra(t); -} - -async function da(t, e) { - // If the write stream closed after the write handshake completes, a write - // operation failed and we fail the pending operation. - e && ga(t).Wo && - // This error affects the actual write. - await async function(t, e) { - // Only handle permanent errors here. If it's transient, just let the retry - // logic kick in. - if (n = e.code, vn(n) && n !== G.ABORTED) { - // This was a permanent error, the request itself was the problem - // so it's not going to succeed if we resend it. - const n = t.ua.shift(); - // In this case it's also unlikely that the server itself is melting - // down -- this was just a bad request so inhibit backoff on the next - // restart. - ga(t).xo(), await ia(t, (() => t.remoteSyncer.rejectFailedWrite(n.batchId, e))), - // It's possible that with the completion of this mutation - // another slot has freed up. - await ra(t); - } - var n; - }(t, e), - // The write stream might have been started by refilling the write - // pipeline for failed writes - ua(t) && ca(t); -} - -async function _a(t, e) { - const n = K(t); - n.asyncQueue.verifyOperationInProgress(), O("RemoteStore", "RemoteStore received new credentials"); - const s = Xo(n); - // Tear down and re-create our network streams. This will ensure we get a - // fresh auth token for the new user and re-fill the write pipeline with - // new mutations from the LocalStore (since mutations are per-user). - n.ha.add(3 /* CredentialChange */), await Qo(n), s && - // Don't set the network status to Unknown if we are offline. - n.da.set("Unknown" /* Unknown */), await n.remoteSyncer.handleCredentialChange(e), - n.ha.delete(3 /* CredentialChange */), await Go(n); -} - -/** - * Toggles the network state when the client gains or loses its primary lease. - */ async function wa(t, e) { - const n = K(t); - e ? (n.ha.delete(2 /* IsSecondary */), await Go(n)) : e || (n.ha.add(2 /* IsSecondary */), - await Qo(n), n.da.set("Unknown" /* Unknown */)); -} - -/** - * If not yet initialized, registers the WatchStream and its network state - * callback with `remoteStoreImpl`. Returns the existing stream if one is - * already available. - * - * PORTING NOTE: On iOS and Android, the WatchStream gets registered on startup. - * This is not done on Web to allow it to be tree-shaken. - */ function ma(t) { - return t.wa || ( - // Create stream (but note that it is not started yet). - t.wa = function(t, e, n) { - const s = K(t); - return s.Zo(), new Bo(e, s.Ro, s.authCredentials, s.appCheckCredentials, s.M, n); - } - /** - * @license - * Copyright 2018 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ (t.datastore, t.asyncQueue, { - Wr: ta.bind(null, t), - Hr: ea.bind(null, t), - Ko: na.bind(null, t) - }), t.la.push((async e => { - e ? (t.wa.xo(), Yo(t) ? Jo(t) : t.da.set("Unknown" /* Unknown */)) : (await t.wa.stop(), - Zo(t)); - }))), t.wa; -} - -/** - * If not yet initialized, registers the WriteStream and its network state - * callback with `remoteStoreImpl`. Returns the existing stream if one is - * already available. - * - * PORTING NOTE: On iOS and Android, the WriteStream gets registered on startup. - * This is not done on Web to allow it to be tree-shaken. - */ function ga(t) { - return t.ma || ( - // Create stream (but note that it is not started yet). - t.ma = function(t, e, n) { - const s = K(t); - return s.Zo(), new Lo(e, s.Ro, s.authCredentials, s.appCheckCredentials, s.M, n); - }(t.datastore, t.asyncQueue, { - Wr: ha.bind(null, t), - Hr: da.bind(null, t), - Jo: la.bind(null, t), - Ho: fa.bind(null, t) - }), t.la.push((async e => { - e ? (t.ma.xo(), - // This will start the write stream if necessary. - await ra(t)) : (await t.ma.stop(), t.ua.length > 0 && (O("RemoteStore", `Stopping write stream with ${t.ua.length} pending writes`), - t.ua = [])); - }))), t.ma; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Represents an operation scheduled to be run in the future on an AsyncQueue. - * - * It is created via DelayedOperation.createAndSchedule(). - * - * Supports cancellation (via cancel()) and early execution (via skipDelay()). - * - * Note: We implement `PromiseLike` instead of `Promise`, as the `Promise` type - * in newer versions of TypeScript defines `finally`, which is not available in - * IE. - */ -class ya { - constructor(t, e, n, s, i) { - this.asyncQueue = t, this.timerId = e, this.targetTimeMs = n, this.op = s, this.removalCallback = i, - this.deferred = new j, this.then = this.deferred.promise.then.bind(this.deferred.promise), - // It's normal for the deferred promise to be canceled (due to cancellation) - // and so we attach a dummy catch callback to avoid - // 'UnhandledPromiseRejectionWarning' log spam. - this.deferred.promise.catch((t => {})); - } - /** - * Creates and returns a DelayedOperation that has been scheduled to be - * executed on the provided asyncQueue after the provided delayMs. - * - * @param asyncQueue - The queue to schedule the operation on. - * @param id - A Timer ID identifying the type of operation this is. - * @param delayMs - The delay (ms) before the operation should be scheduled. - * @param op - The operation to run. - * @param removalCallback - A callback to be called synchronously once the - * operation is executed or canceled, notifying the AsyncQueue to remove it - * from its delayedOperations list. - * PORTING NOTE: This exists to prevent making removeDelayedOperation() and - * the DelayedOperation class public. - */ static createAndSchedule(t, e, n, s, i) { - const r = Date.now() + n, o = new ya(t, e, r, s, i); - return o.start(n), o; - } - /** - * Starts the timer. This is called immediately after construction by - * createAndSchedule(). - */ start(t) { - this.timerHandle = setTimeout((() => this.handleDelayElapsed()), t); - } - /** - * Queues the operation to run immediately (if it hasn't already been run or - * canceled). - */ skipDelay() { - return this.handleDelayElapsed(); - } - /** - * Cancels the operation if it hasn't already been executed or canceled. The - * promise will be rejected. - * - * As long as the operation has not yet been run, calling cancel() provides a - * guarantee that the operation will not be run. - */ cancel(t) { - null !== this.timerHandle && (this.clearTimeout(), this.deferred.reject(new Q(G.CANCELLED, "Operation cancelled" + (t ? ": " + t : "")))); - } - handleDelayElapsed() { - this.asyncQueue.enqueueAndForget((() => null !== this.timerHandle ? (this.clearTimeout(), - this.op().then((t => this.deferred.resolve(t)))) : Promise.resolve())); - } - clearTimeout() { - null !== this.timerHandle && (this.removalCallback(this), clearTimeout(this.timerHandle), - this.timerHandle = null); - } -} - -/** - * Returns a FirestoreError that can be surfaced to the user if the provided - * error is an IndexedDbTransactionError. Re-throws the error otherwise. - */ function pa(t, e) { - if ($("AsyncQueue", `${e}: ${t}`), di(t)) return new Q(G.UNAVAILABLE, `${e}: ${t}`); - throw t; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * DocumentSet is an immutable (copy-on-write) collection that holds documents - * in order specified by the provided comparator. We always add a document key - * comparator on top of what is provided to guarantee document equality based on - * the key. - */ class Ia { - /** The default ordering is by key if the comparator is omitted */ - constructor(t) { - // We are adding document key comparator to the end as it's the only - // guaranteed unique property of a document. - this.comparator = t ? (e, n) => t(e, n) || xt.comparator(e.key, n.key) : (t, e) => xt.comparator(t.key, e.key), - this.keyedMap = Ln(), this.sortedSet = new Cn(this.comparator); - } - /** - * Returns an empty copy of the existing DocumentSet, using the same - * comparator. - */ static emptySet(t) { - return new Ia(t.comparator); - } - has(t) { - return null != this.keyedMap.get(t); - } - get(t) { - return this.keyedMap.get(t); - } - first() { - return this.sortedSet.minKey(); - } - last() { - return this.sortedSet.maxKey(); - } - isEmpty() { - return this.sortedSet.isEmpty(); - } - /** - * Returns the index of the provided key in the document set, or -1 if the - * document key is not present in the set; - */ indexOf(t) { - const e = this.keyedMap.get(t); - return e ? this.sortedSet.indexOf(e) : -1; - } - get size() { - return this.sortedSet.size; - } - /** Iterates documents in order defined by "comparator" */ forEach(t) { - this.sortedSet.inorderTraversal(((e, n) => (t(e), !1))); - } - /** Inserts or updates a document with the same key */ add(t) { - // First remove the element if we have it. - const e = this.delete(t.key); - return e.copy(e.keyedMap.insert(t.key, t), e.sortedSet.insert(t, null)); - } - /** Deletes a document with a given key */ delete(t) { - const e = this.get(t); - return e ? this.copy(this.keyedMap.remove(t), this.sortedSet.remove(e)) : this; - } - isEqual(t) { - if (!(t instanceof Ia)) return !1; - if (this.size !== t.size) return !1; - const e = this.sortedSet.getIterator(), n = t.sortedSet.getIterator(); - for (;e.hasNext(); ) { - const t = e.getNext().key, s = n.getNext().key; - if (!t.isEqual(s)) return !1; - } - return !0; - } - toString() { - const t = []; - return this.forEach((e => { - t.push(e.toString()); - })), 0 === t.length ? "DocumentSet ()" : "DocumentSet (\n " + t.join(" \n") + "\n)"; - } - copy(t, e) { - const n = new Ia; - return n.comparator = this.comparator, n.keyedMap = t, n.sortedSet = e, n; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * DocumentChangeSet keeps track of a set of changes to docs in a query, merging - * duplicate events for the same doc. - */ class Ta { - constructor() { - this.ga = new Cn(xt.comparator); - } - track(t) { - const e = t.doc.key, n = this.ga.get(e); - n ? - // Merge the new change with the existing change. - 0 /* Added */ !== t.type && 3 /* Metadata */ === n.type ? this.ga = this.ga.insert(e, t) : 3 /* Metadata */ === t.type && 1 /* Removed */ !== n.type ? this.ga = this.ga.insert(e, { - type: n.type, - doc: t.doc - }) : 2 /* Modified */ === t.type && 2 /* Modified */ === n.type ? this.ga = this.ga.insert(e, { - type: 2 /* Modified */ , - doc: t.doc - }) : 2 /* Modified */ === t.type && 0 /* Added */ === n.type ? this.ga = this.ga.insert(e, { - type: 0 /* Added */ , - doc: t.doc - }) : 1 /* Removed */ === t.type && 0 /* Added */ === n.type ? this.ga = this.ga.remove(e) : 1 /* Removed */ === t.type && 2 /* Modified */ === n.type ? this.ga = this.ga.insert(e, { - type: 1 /* Removed */ , - doc: n.doc - }) : 0 /* Added */ === t.type && 1 /* Removed */ === n.type ? this.ga = this.ga.insert(e, { - type: 2 /* Modified */ , - doc: t.doc - }) : - // This includes these cases, which don't make sense: - // Added->Added - // Removed->Removed - // Modified->Added - // Removed->Modified - // Metadata->Added - // Removed->Metadata - L() : this.ga = this.ga.insert(e, t); - } - ya() { - const t = []; - return this.ga.inorderTraversal(((e, n) => { - t.push(n); - })), t; - } -} - -class Ea { - constructor(t, e, n, s, i, r, o, a) { - this.query = t, this.docs = e, this.oldDocs = n, this.docChanges = s, this.mutatedKeys = i, - this.fromCache = r, this.syncStateChanged = o, this.excludesMetadataChanges = a; - } - /** Returns a view snapshot as if all documents in the snapshot were added. */ static fromInitialDocuments(t, e, n, s) { - const i = []; - return e.forEach((t => { - i.push({ - type: 0 /* Added */ , - doc: t - }); - })), new Ea(t, e, Ia.emptySet(e), i, n, s, - /* syncStateChanged= */ !0, - /* excludesMetadataChanges= */ !1); - } - get hasPendingWrites() { - return !this.mutatedKeys.isEmpty(); - } - isEqual(t) { - if (!(this.fromCache === t.fromCache && this.syncStateChanged === t.syncStateChanged && this.mutatedKeys.isEqual(t.mutatedKeys) && Be(this.query, t.query) && this.docs.isEqual(t.docs) && this.oldDocs.isEqual(t.oldDocs))) return !1; - const e = this.docChanges, n = t.docChanges; - if (e.length !== n.length) return !1; - for (let t = 0; t < e.length; t++) if (e[t].type !== n[t].type || !e[t].doc.isEqual(n[t].doc)) return !1; - return !0; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Holds the listeners and the last received ViewSnapshot for a query being - * tracked by EventManager. - */ class Aa { - constructor() { - this.pa = void 0, this.listeners = []; - } -} - -class Ra { - constructor() { - this.queries = new Dn((t => Le(t)), Be), this.onlineState = "Unknown" /* Unknown */ , - this.Ia = new Set; - } -} - -async function ba(t, e) { - const n = K(t), s = e.query; - let i = !1, r = n.queries.get(s); - if (r || (i = !0, r = new Aa), i) try { - r.pa = await n.onListen(s); - } catch (t) { - const n = pa(t, `Initialization of query '${qe(e.query)}' failed`); - return void e.onError(n); - } - if (n.queries.set(s, r), r.listeners.push(e), - // Run global snapshot listeners if a consistent snapshot has been emitted. - e.Ta(n.onlineState), r.pa) { - e.Ea(r.pa) && Sa(n); - } -} - -async function Pa(t, e) { - const n = K(t), s = e.query; - let i = !1; - const r = n.queries.get(s); - if (r) { - const t = r.listeners.indexOf(e); - t >= 0 && (r.listeners.splice(t, 1), i = 0 === r.listeners.length); - } - if (i) return n.queries.delete(s), n.onUnlisten(s); -} - -function Va(t, e) { - const n = K(t); - let s = !1; - for (const t of e) { - const e = t.query, i = n.queries.get(e); - if (i) { - for (const e of i.listeners) e.Ea(t) && (s = !0); - i.pa = t; - } - } - s && Sa(n); -} - -function va(t, e, n) { - const s = K(t), i = s.queries.get(e); - if (i) for (const t of i.listeners) t.onError(n); - // Remove all listeners. NOTE: We don't need to call syncEngine.unlisten() - // after an error. - s.queries.delete(e); -} - -// Call all global snapshot listeners that have been set. -function Sa(t) { - t.Ia.forEach((t => { - t.next(); - })); -} - -/** - * QueryListener takes a series of internal view snapshots and determines - * when to raise the event. - * - * It uses an Observer to dispatch events. - */ class Da { - constructor(t, e, n) { - this.query = t, this.Aa = e, - /** - * Initial snapshots (e.g. from cache) may not be propagated to the wrapped - * observer. This flag is set to true once we've actually raised an event. - */ - this.Ra = !1, this.ba = null, this.onlineState = "Unknown" /* Unknown */ , this.options = n || {}; - } - /** - * Applies the new ViewSnapshot to this listener, raising a user-facing event - * if applicable (depending on what changed, whether the user has opted into - * metadata-only changes, etc.). Returns true if a user-facing event was - * indeed raised. - */ Ea(t) { - if (!this.options.includeMetadataChanges) { - // Remove the metadata only changes. - const e = []; - for (const n of t.docChanges) 3 /* Metadata */ !== n.type && e.push(n); - t = new Ea(t.query, t.docs, t.oldDocs, e, t.mutatedKeys, t.fromCache, t.syncStateChanged, - /* excludesMetadataChanges= */ !0); - } - let e = !1; - return this.Ra ? this.Pa(t) && (this.Aa.next(t), e = !0) : this.Va(t, this.onlineState) && (this.va(t), - e = !0), this.ba = t, e; - } - onError(t) { - this.Aa.error(t); - } - /** Returns whether a snapshot was raised. */ Ta(t) { - this.onlineState = t; - let e = !1; - return this.ba && !this.Ra && this.Va(this.ba, t) && (this.va(this.ba), e = !0), - e; - } - Va(t, e) { - // Always raise the first event when we're synced - if (!t.fromCache) return !0; - // NOTE: We consider OnlineState.Unknown as online (it should become Offline - // or Online if we wait long enough). - const n = "Offline" /* Offline */ !== e; - // Don't raise the event if we're online, aren't synced yet (checked - // above) and are waiting for a sync. - return (!this.options.Sa || !n) && (!t.docs.isEmpty() || "Offline" /* Offline */ === e); - // Raise data from cache if we have any documents or we are offline - } - Pa(t) { - // We don't need to handle includeDocumentMetadataChanges here because - // the Metadata only changes have already been stripped out if needed. - // At this point the only changes we will see are the ones we should - // propagate. - if (t.docChanges.length > 0) return !0; - const e = this.ba && this.ba.hasPendingWrites !== t.hasPendingWrites; - return !(!t.syncStateChanged && !e) && !0 === this.options.includeMetadataChanges; - // Generally we should have hit one of the cases above, but it's possible - // to get here if there were only metadata docChanges and they got - // stripped out. - } - va(t) { - t = Ea.fromInitialDocuments(t.query, t.docs, t.mutatedKeys, t.fromCache), this.Ra = !0, - this.Aa.next(t); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A complete element in the bundle stream, together with the byte length it - * occupies in the stream. - */ class Ca { - constructor(t, - // How many bytes this element takes to store in the bundle. - e) { - this.payload = t, this.byteLength = e; - } - Da() { - return "metadata" in this.payload; - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Helper to convert objects from bundles to model objects in the SDK. - */ class xa { - constructor(t) { - this.M = t; - } - li(t) { - return fs(this.M, t); - } - /** - * Converts a BundleDocument to a MutableDocument. - */ fi(t) { - return t.metadata.exists ? ys(this.M, t.document, !1) : te.newNoDocument(this.li(t.metadata.name), this.di(t.metadata.readTime)); - } - di(t) { - return us(t); - } -} - -/** - * A class to process the elements from a bundle, load them into local - * storage and provide progress update while loading. - */ class Na { - constructor(t, e, n) { - this.Ca = t, this.localStore = e, this.M = n, - /** Batched queries to be saved into storage */ - this.queries = [], - /** Batched documents to be saved into storage */ - this.documents = [], this.progress = ka(t); - } - /** - * Adds an element from the bundle to the loader. - * - * Returns a new progress if adding the element leads to a new progress, - * otherwise returns null. - */ xa(t) { - this.progress.bytesLoaded += t.byteLength; - let e = this.progress.documentsLoaded; - return t.payload.namedQuery ? this.queries.push(t.payload.namedQuery) : t.payload.documentMetadata ? (this.documents.push({ - metadata: t.payload.documentMetadata - }), t.payload.documentMetadata.exists || ++e) : t.payload.document && (this.documents[this.documents.length - 1].document = t.payload.document, - ++e), e !== this.progress.documentsLoaded ? (this.progress.documentsLoaded = e, - Object.assign({}, this.progress)) : null; - } - Na(t) { - const e = new Map, n = new xa(this.M); - for (const s of t) if (s.metadata.queries) { - const t = n.li(s.metadata.name); - for (const n of s.metadata.queries) { - const s = (e.get(n) || Gn()).add(t); - e.set(n, s); - } - } - return e; - } - /** - * Update the progress to 'Success' and return the updated progress. - */ async complete() { - const t = await ro(this.localStore, new xa(this.M), this.documents, this.Ca.id), e = this.Na(this.documents); - for (const t of this.queries) await oo(this.localStore, t, e.get(t.name)); - return this.progress.taskState = "Success", new qr(Object.assign({}, this.progress), t); - } -} - -/** - * Returns a `LoadBundleTaskProgress` representing the initial progress of - * loading a bundle. - */ function ka(t) { - return { - taskState: "Running", - documentsLoaded: 0, - bytesLoaded: 0, - totalDocuments: t.totalDocuments, - totalBytes: t.totalBytes - }; -} - -/** - * Returns a `LoadBundleTaskProgress` representing the progress that the loading - * has succeeded. - */ -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -class Ma { - constructor(t) { - this.key = t; - } -} - -class Oa { - constructor(t) { - this.key = t; - } -} - -/** - * View is responsible for computing the final merged truth of what docs are in - * a query. It gets notified of local and remote changes to docs, and applies - * the query filters and limits to determine the most correct possible results. - */ class $a { - constructor(t, - /** Documents included in the remote target */ - e) { - this.query = t, this.ka = e, this.Ma = null, - /** - * A flag whether the view is current with the backend. A view is considered - * current after it has seen the current flag from the backend and did not - * lose consistency within the watch stream (e.g. because of an existence - * filter mismatch). - */ - this.current = !1, - /** Documents in the view but not in the remote target */ - this.Oa = Gn(), - /** Document Keys that have local changes */ - this.mutatedKeys = Gn(), this.$a = Ke(t), this.Fa = new Ia(this.$a); - } - /** - * The set of remote documents that the server has told us belongs to the target associated with - * this view. - */ get Ba() { - return this.ka; - } - /** - * Iterates over a set of doc changes, applies the query limit, and computes - * what the new results should be, what the changes were, and whether we may - * need to go back to the local cache for more results. Does not make any - * changes to the view. - * @param docChanges - The doc changes to apply to this view. - * @param previousChanges - If this is being called with a refill, then start - * with this set of docs and changes instead of the current view. - * @returns a new set of docs, changes, and refill flag. - */ La(t, e) { - const n = e ? e.qa : new Ta, s = e ? e.Fa : this.Fa; - let i = e ? e.mutatedKeys : this.mutatedKeys, r = s, o = !1; - // Track the last doc in a (full) limit. This is necessary, because some - // update (a delete, or an update moving a doc past the old limit) might - // mean there is some other document in the local cache that either should - // come (1) between the old last limit doc and the new last document, in the - // case of updates, or (2) after the new last document, in the case of - // deletes. So we keep this doc at the old limit to compare the updates to. - // Note that this should never get used in a refill (when previousChanges is - // set), because there will only be adds -- no deletes or updates. - const a = Ce(this.query) && s.size === this.query.limit ? s.last() : null, u = xe(this.query) && s.size === this.query.limit ? s.first() : null; - // Drop documents out to meet limit/limitToLast requirement. - if (t.inorderTraversal(((t, e) => { - const c = s.get(t), h = Ue(this.query, e) ? e : null, l = !!c && this.mutatedKeys.has(c.key), f = !!h && (h.hasLocalMutations || - // We only consider committed mutations for documents that were - // mutated during the lifetime of the view. - this.mutatedKeys.has(h.key) && h.hasCommittedMutations); - let d = !1; - // Calculate change - if (c && h) { - c.data.isEqual(h.data) ? l !== f && (n.track({ - type: 3 /* Metadata */ , - doc: h - }), d = !0) : this.Ua(c, h) || (n.track({ - type: 2 /* Modified */ , - doc: h - }), d = !0, (a && this.$a(h, a) > 0 || u && this.$a(h, u) < 0) && ( - // This doc moved from inside the limit to outside the limit. - // That means there may be some other doc in the local cache - // that should be included instead. - o = !0)); - } else !c && h ? (n.track({ - type: 0 /* Added */ , - doc: h - }), d = !0) : c && !h && (n.track({ - type: 1 /* Removed */ , - doc: c - }), d = !0, (a || u) && ( - // A doc was removed from a full limit query. We'll need to - // requery from the local cache to see if we know about some other - // doc that should be in the results. - o = !0)); - d && (h ? (r = r.add(h), i = f ? i.add(t) : i.delete(t)) : (r = r.delete(t), i = i.delete(t))); - })), Ce(this.query) || xe(this.query)) for (;r.size > this.query.limit; ) { - const t = Ce(this.query) ? r.last() : r.first(); - r = r.delete(t.key), i = i.delete(t.key), n.track({ - type: 1 /* Removed */ , - doc: t - }); - } - return { - Fa: r, - qa: n, - ei: o, - mutatedKeys: i - }; - } - Ua(t, e) { - // We suppress the initial change event for documents that were modified as - // part of a write acknowledgment (e.g. when the value of a server transform - // is applied) as Watch will send us the same document again. - // By suppressing the event, we only raise two user visible events (one with - // `hasPendingWrites` and the final state of the document) instead of three - // (one with `hasPendingWrites`, the modified document with - // `hasPendingWrites` and the final state of the document). - return t.hasLocalMutations && e.hasCommittedMutations && !e.hasLocalMutations; - } - /** - * Updates the view with the given ViewDocumentChanges and optionally updates - * limbo docs and sync state from the provided target change. - * @param docChanges - The set of changes to make to the view's docs. - * @param updateLimboDocuments - Whether to update limbo documents based on - * this change. - * @param targetChange - A target change to apply for computing limbo docs and - * sync state. - * @returns A new ViewChange with the given docs, changes, and sync state. - */ - // PORTING NOTE: The iOS/Android clients always compute limbo document changes. - applyChanges(t, e, n) { - const s = this.Fa; - this.Fa = t.Fa, this.mutatedKeys = t.mutatedKeys; - // Sort changes based on type and query comparator - const i = t.qa.ya(); - i.sort(((t, e) => function(t, e) { - const n = t => { - switch (t) { - case 0 /* Added */ : - return 1; - - case 2 /* Modified */ : - case 3 /* Metadata */ : - // A metadata change is converted to a modified change at the public - // api layer. Since we sort by document key and then change type, - // metadata and modified changes must be sorted equivalently. - return 2; - - case 1 /* Removed */ : - return 0; - - default: - return L(); - } - }; - return n(t) - n(e); - } - /** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ (t.type, e.type) || this.$a(t.doc, e.doc))), this.Ka(n); - const r = e ? this.Ga() : [], o = 0 === this.Oa.size && this.current ? 1 /* Synced */ : 0 /* Local */ , a = o !== this.Ma; - if (this.Ma = o, 0 !== i.length || a) { - return { - snapshot: new Ea(this.query, t.Fa, s, i, t.mutatedKeys, 0 /* Local */ === o, a, - /* excludesMetadataChanges= */ !1), - Qa: r - }; - } - // no changes - return { - Qa: r - }; - } - /** - * Applies an OnlineState change to the view, potentially generating a - * ViewChange if the view's syncState changes as a result. - */ Ta(t) { - return this.current && "Offline" /* Offline */ === t ? ( - // If we're offline, set `current` to false and then call applyChanges() - // to refresh our syncState and generate a ViewChange as appropriate. We - // are guaranteed to get a new TargetChange that sets `current` back to - // true once the client is back online. - this.current = !1, this.applyChanges({ - Fa: this.Fa, - qa: new Ta, - mutatedKeys: this.mutatedKeys, - ei: !1 - }, - /* updateLimboDocuments= */ !1)) : { - Qa: [] - }; - } - /** - * Returns whether the doc for the given key should be in limbo. - */ ja(t) { - // If the remote end says it's part of this query, it's not in limbo. - return !this.ka.has(t) && ( - // The local store doesn't think it's a result, so it shouldn't be in limbo. - !!this.Fa.has(t) && !this.Fa.get(t).hasLocalMutations); - } - /** - * Updates syncedDocuments, current, and limbo docs based on the given change. - * Returns the list of changes to which docs are in limbo. - */ Ka(t) { - t && (t.addedDocuments.forEach((t => this.ka = this.ka.add(t))), t.modifiedDocuments.forEach((t => {})), - t.removedDocuments.forEach((t => this.ka = this.ka.delete(t))), this.current = t.current); - } - Ga() { - // We can only determine limbo documents when we're in-sync with the server. - if (!this.current) return []; - // TODO(klimt): Do this incrementally so that it's not quadratic when - // updating many documents. - const t = this.Oa; - this.Oa = Gn(), this.Fa.forEach((t => { - this.ja(t.key) && (this.Oa = this.Oa.add(t.key)); - })); - // Diff the new limbo docs with the old limbo docs. - const e = []; - return t.forEach((t => { - this.Oa.has(t) || e.push(new Oa(t)); - })), this.Oa.forEach((n => { - t.has(n) || e.push(new Ma(n)); - })), e; - } - /** - * Update the in-memory state of the current view with the state read from - * persistence. - * - * We update the query view whenever a client's primary status changes: - * - When a client transitions from primary to secondary, it can miss - * LocalStorage updates and its query views may temporarily not be - * synchronized with the state on disk. - * - For secondary to primary transitions, the client needs to update the list - * of `syncedDocuments` since secondary clients update their query views - * based purely on synthesized RemoteEvents. - * - * @param queryResult.documents - The documents that match the query according - * to the LocalStore. - * @param queryResult.remoteKeys - The keys of the documents that match the - * query according to the backend. - * - * @returns The ViewChange that resulted from this synchronization. - */ - // PORTING NOTE: Multi-tab only. - Wa(t) { - this.ka = t.hi, this.Oa = Gn(); - const e = this.La(t.documents); - return this.applyChanges(e, /*updateLimboDocuments=*/ !0); - } - /** - * Returns a view snapshot as if this query was just listened to. Contains - * a document add for every existing document and the `fromCache` and - * `hasPendingWrites` status of the already established view. - */ - // PORTING NOTE: Multi-tab only. - za() { - return Ea.fromInitialDocuments(this.query, this.Fa, this.mutatedKeys, 0 /* Local */ === this.Ma); - } -} - -/** - * QueryView contains all of the data that SyncEngine needs to keep track of for - * a particular query. - */ -class Fa { - constructor( - /** - * The query itself. - */ - t, - /** - * The target number created by the client that is used in the watch - * stream to identify this query. - */ - e, - /** - * The view is responsible for computing the final merged truth of what - * docs are in the query. It gets notified of local and remote changes, - * and applies the query filters and limits to determine the most correct - * possible results. - */ - n) { - this.query = t, this.targetId = e, this.view = n; - } -} - -/** Tracks a limbo resolution. */ class Ba { - constructor(t) { - this.key = t, - /** - * Set to true once we've received a document. This is used in - * getRemoteKeysForTarget() and ultimately used by WatchChangeAggregator to - * decide whether it needs to manufacture a delete event for the target once - * the target is CURRENT. - */ - this.Ha = !1; - } -} - -/** - * An implementation of `SyncEngine` coordinating with other parts of SDK. - * - * The parts of SyncEngine that act as a callback to RemoteStore need to be - * registered individually. This is done in `syncEngineWrite()` and - * `syncEngineListen()` (as well as `applyPrimaryState()`) as these methods - * serve as entry points to RemoteStore's functionality. - * - * Note: some field defined in this class might have public access level, but - * the class is not exported so they are only accessible from this module. - * This is useful to implement optional features (like bundles) in free - * functions, such that they are tree-shakeable. - */ class La { - constructor(t, e, n, - // PORTING NOTE: Manages state synchronization in multi-tab environments. - s, i, r) { - this.localStore = t, this.remoteStore = e, this.eventManager = n, this.sharedClientState = s, - this.currentUser = i, this.maxConcurrentLimboResolutions = r, this.Ja = {}, this.Ya = new Dn((t => Le(t)), Be), - this.Xa = new Map, - /** - * The keys of documents that are in limbo for which we haven't yet started a - * limbo resolution query. The strings in this set are the result of calling - * `key.path.canonicalString()` where `key` is a `DocumentKey` object. - * - * The `Set` type was chosen because it provides efficient lookup and removal - * of arbitrary elements and it also maintains insertion order, providing the - * desired queue-like FIFO semantics. - */ - this.Za = new Set, - /** - * Keeps track of the target ID for each document that is in limbo with an - * active target. - */ - this.tu = new Cn(xt.comparator), - /** - * Keeps track of the information about an active limbo resolution for each - * active target ID that was started for the purpose of limbo resolution. - */ - this.eu = new Map, this.nu = new co, - /** Stores user completion handlers, indexed by User and BatchId. */ - this.su = {}, - /** Stores user callbacks waiting for all pending writes to be acknowledged. */ - this.iu = new Map, this.ru = mr.gn(), this.onlineState = "Unknown" /* Unknown */ , - // The primary state is set to `true` or `false` immediately after Firestore - // startup. In the interim, a client should only be considered primary if - // `isPrimary` is true. - this.ou = void 0; - } - get isPrimaryClient() { - return !0 === this.ou; - } -} - -/** - * Initiates the new listen, resolves promise when listen enqueued to the - * server. All the subsequent view snapshots or errors are sent to the - * subscribed handlers. Returns the initial snapshot. - */ -async function qa(t, e) { - const n = mu(t); - let s, i; - const r = n.Ya.get(e); - if (r) - // PORTING NOTE: With Multi-Tab Web, it is possible that a query view - // already exists when EventManager calls us for the first time. This - // happens when the primary tab is already listening to this query on - // behalf of another tab and the user of the primary also starts listening - // to the query. EventManager will not have an assigned target ID in this - // case and calls `listen` to obtain this ID. - s = r.targetId, n.sharedClientState.addLocalQueryTarget(s), i = r.view.za(); else { - const t = await Zr(n.localStore, $e(e)); - n.isPrimaryClient && jo(n.remoteStore, t); - const r = n.sharedClientState.addLocalQueryTarget(t.targetId); - s = t.targetId, i = await Ua(n, e, s, "current" === r); - } - return i; -} - -/** - * Registers a view for a previously unknown query and computes its initial - * snapshot. - */ async function Ua(t, e, n, s) { - // PORTING NOTE: On Web only, we inject the code that registers new Limbo - // targets based on view changes. This allows us to only depend on Limbo - // changes when user code includes queries. - t.au = (e, n, s) => async function(t, e, n, s) { - let i = e.view.La(n); - i.ei && ( - // The query has a limit and some docs were removed, so we need - // to re-run the query against the local store to make sure we - // didn't lose any good docs that had been past the limit. - i = await eo(t.localStore, e.query, - /* usePreviousResults= */ !1).then((({documents: t}) => e.view.La(t, i)))); - const r = s && s.targetChanges.get(e.targetId), o = e.view.applyChanges(i, - /* updateLimboDocuments= */ t.isPrimaryClient, r); - return eu(t, e.targetId, o.Qa), o.snapshot; - }(t, e, n, s); - const i = await eo(t.localStore, e, - /* usePreviousResults= */ !0), r = new $a(e, i.hi), o = r.La(i.documents), a = zn.createSynthesizedTargetChangeForCurrentChange(n, s && "Offline" /* Offline */ !== t.onlineState), u = r.applyChanges(o, - /* updateLimboDocuments= */ t.isPrimaryClient, a); - eu(t, n, u.Qa); - const c = new Fa(e, n, r); - return t.Ya.set(e, c), t.Xa.has(n) ? t.Xa.get(n).push(e) : t.Xa.set(n, [ e ]), u.snapshot; -} - -/** Stops listening to the query. */ async function Ka(t, e) { - const n = K(t), s = n.Ya.get(e), i = n.Xa.get(s.targetId); - if (i.length > 1) return n.Xa.set(s.targetId, i.filter((t => !Be(t, e)))), void n.Ya.delete(e); - // No other queries are mapped to the target, clean up the query and the target. - if (n.isPrimaryClient) { - // We need to remove the local query target first to allow us to verify - // whether any other client is still interested in this target. - n.sharedClientState.removeLocalQueryTarget(s.targetId); - n.sharedClientState.isActiveQueryTarget(s.targetId) || await to(n.localStore, s.targetId, - /*keepPersistedTargetData=*/ !1).then((() => { - n.sharedClientState.clearQueryState(s.targetId), Wo(n.remoteStore, s.targetId), - Za(n, s.targetId); - })).catch(Tr); - } else Za(n, s.targetId), await to(n.localStore, s.targetId, - /*keepPersistedTargetData=*/ !0); -} - -/** - * Initiates the write of local mutation batch which involves adding the - * writes to the mutation queue, notifying the remote store about new - * mutations and raising events for any changes this write caused. - * - * The promise returned by this call is resolved when the above steps - * have completed, *not* when the write was acked by the backend. The - * userCallback is resolved once the write was acked/rejected by the - * backend (or failed locally for any other reason). - */ async function Ga(t, e, n) { - const s = gu(t); - try { - const t = await function(t, e) { - const n = K(t), s = ut.now(), i = e.reduce(((t, e) => t.add(e.key)), Gn()); - let r; - return n.persistence.runTransaction("Locally write mutations", "readwrite", (t => n.ui.Us(t, i).next((i => { - r = i; - // For non-idempotent mutations (such as `FieldValue.increment()`), - // we record the base state in a separate patch mutation. This is - // later used to guarantee consistent values and prevents flicker - // even if the backend sends us an update that already includes our - // transform. - const o = []; - for (const t of e) { - const e = wn(t, r.get(t.key)); - null != e && - // NOTE: The base state should only be applied if there's some - // existing document to override, so use a Precondition of - // exists=true - o.push(new pn(t.key, e, Zt(e.value.mapValue), hn.exists(!0))); - } - return n.Fs.addMutationBatch(t, s, o, e); - })))).then((t => (t.applyToLocalDocumentSet(r), { - batchId: t.batchId, - changes: r - }))); - }(s.localStore, e); - s.sharedClientState.addPendingMutation(t.batchId), function(t, e, n) { - let s = t.su[t.currentUser.toKey()]; - s || (s = new Cn(rt)); - s = s.insert(e, n), t.su[t.currentUser.toKey()] = s; - } - /** - * Resolves or rejects the user callback for the given batch and then discards - * it. - */ (s, t.batchId, n), await iu(s, t.changes), await ra(s.remoteStore); - } catch (t) { - // If we can't persist the mutation, we reject the user callback and - // don't send the mutation. The user can then retry the write. - const e = pa(t, "Failed to persist write"); - n.reject(e); - } -} - -/** - * Applies one remote event to the sync engine, notifying any views of the - * changes, and releasing any pending mutation batches that would become - * visible because of the snapshot version the remote event contains. - */ async function Qa(t, e) { - const n = K(t); - try { - const t = await Jr(n.localStore, e); - // Update `receivedDocument` as appropriate for any limbo targets. - e.targetChanges.forEach(((t, e) => { - const s = n.eu.get(e); - s && ( - // Since this is a limbo resolution lookup, it's for a single document - // and it could be added, modified, or removed, but not a combination. - q(t.addedDocuments.size + t.modifiedDocuments.size + t.removedDocuments.size <= 1), - t.addedDocuments.size > 0 ? s.Ha = !0 : t.modifiedDocuments.size > 0 ? q(s.Ha) : t.removedDocuments.size > 0 && (q(s.Ha), - s.Ha = !1)); - })), await iu(n, t, e); - } catch (t) { - await Tr(t); - } -} - -/** - * Applies an OnlineState change to the sync engine and notifies any views of - * the change. - */ function ja(t, e, n) { - const s = K(t); - // If we are the secondary client, we explicitly ignore the remote store's - // online state (the local client may go offline, even though the primary - // tab remains online) and only apply the primary tab's online state from - // SharedClientState. - if (s.isPrimaryClient && 0 /* RemoteStore */ === n || !s.isPrimaryClient && 1 /* SharedClientState */ === n) { - const t = []; - s.Ya.forEach(((n, s) => { - const i = s.view.Ta(e); - i.snapshot && t.push(i.snapshot); - })), function(t, e) { - const n = K(t); - n.onlineState = e; - let s = !1; - n.queries.forEach(((t, n) => { - for (const t of n.listeners) - // Run global snapshot listeners if a consistent snapshot has been emitted. - t.Ta(e) && (s = !0); - })), s && Sa(n); - }(s.eventManager, e), t.length && s.Ja.Ko(t), s.onlineState = e, s.isPrimaryClient && s.sharedClientState.setOnlineState(e); - } -} - -/** - * Rejects the listen for the given targetID. This can be triggered by the - * backend for any active target. - * - * @param syncEngine - The sync engine implementation. - * @param targetId - The targetID corresponds to one previously initiated by the - * user as part of TargetData passed to listen() on RemoteStore. - * @param err - A description of the condition that has forced the rejection. - * Nearly always this will be an indication that the user is no longer - * authorized to see the data matching the target. - */ async function Wa(t, e, n) { - const s = K(t); - // PORTING NOTE: Multi-tab only. - s.sharedClientState.updateQueryState(e, "rejected", n); - const i = s.eu.get(e), r = i && i.key; - if (r) { - // TODO(klimt): We really only should do the following on permission - // denied errors, but we don't have the cause code here. - // It's a limbo doc. Create a synthetic event saying it was deleted. - // This is kind of a hack. Ideally, we would have a method in the local - // store to purge a document. However, it would be tricky to keep all of - // the local store's invariants with another method. - let t = new Cn(xt.comparator); - // TODO(b/217189216): This limbo document should ideally have a read time, - // so that it is picked up by any read-time based scans. The backend, - // however, does not send a read time for target removals. - t = t.insert(r, te.newNoDocument(r, ct.min())); - const n = Gn().add(r), i = new Wn(ct.min(), - /* targetChanges= */ new Map, - /* targetMismatches= */ new kn(rt), t, n); - await Qa(s, i), - // Since this query failed, we won't want to manually unlisten to it. - // We only remove it from bookkeeping after we successfully applied the - // RemoteEvent. If `applyRemoteEvent()` throws, we want to re-listen to - // this query when the RemoteStore restarts the Watch stream, which should - // re-trigger the target failure. - s.tu = s.tu.remove(r), s.eu.delete(e), su(s); - } else await to(s.localStore, e, - /* keepPersistedTargetData */ !1).then((() => Za(s, e, n))).catch(Tr); -} - -async function za(t, e) { - const n = K(t), s = e.batch.batchId; - try { - const t = await zr(n.localStore, e); - // The local store may or may not be able to apply the write result and - // raise events immediately (depending on whether the watcher is caught - // up), so we raise user callbacks first so that they consistently happen - // before listen events. - Xa(n, s, /*error=*/ null), Ya(n, s), n.sharedClientState.updateMutationState(s, "acknowledged"), - await iu(n, t); - } catch (t) { - await Tr(t); - } -} - -async function Ha(t, e, n) { - const s = K(t); - try { - const t = await function(t, e) { - const n = K(t); - return n.persistence.runTransaction("Reject batch", "readwrite-primary", (t => { - let s; - return n.Fs.lookupMutationBatch(t, e).next((e => (q(null !== e), s = e.keys(), n.Fs.removeMutationBatch(t, e)))).next((() => n.Fs.performConsistencyCheck(t))).next((() => n.ui.Us(t, s))); - })); - } - /** - * Returns the largest (latest) batch id in mutation queue that is pending - * server response. - * - * Returns `BATCHID_UNKNOWN` if the queue is empty. - */ (s.localStore, e); - // The local store may or may not be able to apply the write result and - // raise events immediately (depending on whether the watcher is caught up), - // so we raise user callbacks first so that they consistently happen before - // listen events. - Xa(s, e, n), Ya(s, e), s.sharedClientState.updateMutationState(e, "rejected", n), - await iu(s, t); - } catch (n) { - await Tr(n); - } -} - -/** - * Registers a user callback that resolves when all pending mutations at the moment of calling - * are acknowledged . - */ async function Ja(t, e) { - const n = K(t); - Xo(n.remoteStore) || O("SyncEngine", "The network is disabled. The task returned by 'awaitPendingWrites()' will not complete until the network is enabled."); - try { - const t = await function(t) { - const e = K(t); - return e.persistence.runTransaction("Get highest unacknowledged batch id", "readonly", (t => e.Fs.getHighestUnacknowledgedBatchId(t))); - }(n.localStore); - if (-1 === t) - // Trigger the callback right away if there is no pending writes at the moment. - return void e.resolve(); - const s = n.iu.get(t) || []; - s.push(e), n.iu.set(t, s); - } catch (t) { - const n = pa(t, "Initialization of waitForPendingWrites() operation failed"); - e.reject(n); - } -} - -/** - * Triggers the callbacks that are waiting for this batch id to get acknowledged by server, - * if there are any. - */ function Ya(t, e) { - (t.iu.get(e) || []).forEach((t => { - t.resolve(); - })), t.iu.delete(e); -} - -/** Reject all outstanding callbacks waiting for pending writes to complete. */ function Xa(t, e, n) { - const s = K(t); - let i = s.su[s.currentUser.toKey()]; - // NOTE: Mutations restored from persistence won't have callbacks, so it's - // okay for there to be no callback for this ID. - if (i) { - const t = i.get(e); - t && (n ? t.reject(n) : t.resolve(), i = i.remove(e)), s.su[s.currentUser.toKey()] = i; - } -} - -function Za(t, e, n = null) { - t.sharedClientState.removeLocalQueryTarget(e); - for (const s of t.Xa.get(e)) t.Ya.delete(s), n && t.Ja.uu(s, n); - if (t.Xa.delete(e), t.isPrimaryClient) { - t.nu.Ri(e).forEach((e => { - t.nu.containsKey(e) || - // We removed the last reference for this key - tu(t, e); - })); - } -} - -function tu(t, e) { - t.Za.delete(e.path.canonicalString()); - // It's possible that the target already got removed because the query failed. In that case, - // the key won't exist in `limboTargetsByKey`. Only do the cleanup if we still have the target. - const n = t.tu.get(e); - null !== n && (Wo(t.remoteStore, n), t.tu = t.tu.remove(e), t.eu.delete(n), su(t)); -} - -function eu(t, e, n) { - for (const s of n) if (s instanceof Ma) t.nu.addReference(s.key, e), nu(t, s); else if (s instanceof Oa) { - O("SyncEngine", "Document no longer in limbo: " + s.key), t.nu.removeReference(s.key, e); - t.nu.containsKey(s.key) || - // We removed the last reference for this key - tu(t, s.key); - } else L(); -} - -function nu(t, e) { - const n = e.key, s = n.path.canonicalString(); - t.tu.get(n) || t.Za.has(s) || (O("SyncEngine", "New document in limbo: " + n), t.Za.add(s), - su(t)); -} - -/** - * Starts listens for documents in limbo that are enqueued for resolution, - * subject to a maximum number of concurrent resolutions. - * - * Without bounding the number of concurrent resolutions, the server can fail - * with "resource exhausted" errors which can lead to pathological client - * behavior as seen in https://github.com/firebase/firebase-js-sdk/issues/2683. - */ function su(t) { - for (;t.Za.size > 0 && t.tu.size < t.maxConcurrentLimboResolutions; ) { - const e = t.Za.values().next().value; - t.Za.delete(e); - const n = new xt(_t.fromString(e)), s = t.ru.next(); - t.eu.set(s, new Ba(n)), t.tu = t.tu.insert(n, s), jo(t.remoteStore, new Ai($e(De(n.path)), s, 2 /* LimboResolution */ , nt.A)); - } -} - -async function iu(t, e, n) { - const s = K(t), i = [], r = [], o = []; - s.Ya.isEmpty() || (s.Ya.forEach(((t, a) => { - o.push(s.au(a, e, n).then((t => { - if (t) { - s.isPrimaryClient && s.sharedClientState.updateQueryState(a.targetId, t.fromCache ? "not-current" : "current"), - i.push(t); - const e = Kr.Js(a.targetId, t); - r.push(e); - } - }))); - })), await Promise.all(o), s.Ja.Ko(i), await async function(t, e) { - const n = K(t); - try { - await n.persistence.runTransaction("notifyLocalViewChanges", "readwrite", (t => ui.forEach(e, (e => ui.forEach(e.zs, (s => n.persistence.referenceDelegate.addReference(t, e.targetId, s))).next((() => ui.forEach(e.Hs, (s => n.persistence.referenceDelegate.removeReference(t, e.targetId, s))))))))); - } catch (t) { - if (!di(t)) throw t; - // If `notifyLocalViewChanges` fails, we did not advance the sequence - // number for the documents that were included in this transaction. - // This might trigger them to be deleted earlier than they otherwise - // would have, but it should not invalidate the integrity of the data. - O("LocalStore", "Failed to update sequence numbers: " + t); - } - for (const t of e) { - const e = t.targetId; - if (!t.fromCache) { - const t = n.si.get(e), s = t.snapshotVersion, i = t.withLastLimboFreeSnapshotVersion(s); - // Advance the last limbo free snapshot version - n.si = n.si.insert(e, i); - } - } - }(s.localStore, r)); -} - -async function ru(t, e) { - const n = K(t); - if (!n.currentUser.isEqual(e)) { - O("SyncEngine", "User change. New user:", e.toKey()); - const t = await Wr(n.localStore, e); - n.currentUser = e, - // Fails tasks waiting for pending writes requested by previous user. - function(t, e) { - t.iu.forEach((t => { - t.forEach((t => { - t.reject(new Q(G.CANCELLED, e)); - })); - })), t.iu.clear(); - }(n, "'waitForPendingWrites' promise is rejected due to a user change."), - // TODO(b/114226417): Consider calling this only in the primary tab. - n.sharedClientState.handleUserChange(e, t.removedBatchIds, t.addedBatchIds), await iu(n, t.ci); - } -} - -function ou(t, e) { - const n = K(t), s = n.eu.get(e); - if (s && s.Ha) return Gn().add(s.key); - { - let t = Gn(); - const s = n.Xa.get(e); - if (!s) return t; - for (const e of s) { - const s = n.Ya.get(e); - t = t.unionWith(s.view.Ba); - } - return t; - } -} - -/** - * Reconcile the list of synced documents in an existing view with those - * from persistence. - */ async function au(t, e) { - const n = K(t), s = await eo(n.localStore, e.query, - /* usePreviousResults= */ !0), i = e.view.Wa(s); - return n.isPrimaryClient && eu(n, e.targetId, i.Qa), i; -} - -/** - * Retrieves newly changed documents from remote document cache and raises - * snapshots if needed. - */ -// PORTING NOTE: Multi-Tab only. -async function uu(t) { - const e = K(t); - return so(e.localStore).then((t => iu(e, t))); -} - -/** Applies a mutation state to an existing batch. */ -// PORTING NOTE: Multi-Tab only. -async function cu(t, e, n, s) { - const i = K(t), r = await function(t, e) { - const n = K(t), s = K(n.Fs); - return n.persistence.runTransaction("Lookup mutation documents", "readonly", (t => s.ln(t, e).next((e => e ? n.ui.Us(t, e) : ui.resolve(null))))); - } - // PORTING NOTE: Multi-Tab only. - (i.localStore, e); - null !== r ? ("pending" === n ? - // If we are the primary client, we need to send this write to the - // backend. Secondary clients will ignore these writes since their remote - // connection is disabled. - await ra(i.remoteStore) : "acknowledged" === n || "rejected" === n ? ( - // NOTE: Both these methods are no-ops for batches that originated from - // other clients. - Xa(i, e, s || null), Ya(i, e), function(t, e) { - K(K(t).Fs).dn(e); - } - // PORTING NOTE: Multi-Tab only. - (i.localStore, e)) : L(), await iu(i, r)) : - // A throttled tab may not have seen the mutation before it was completed - // and removed from the mutation queue, in which case we won't have cached - // the affected documents. In this case we can safely ignore the update - // since that means we didn't apply the mutation locally at all (if we - // had, we would have cached the affected documents), and so we will just - // see any resulting document changes via normal remote document updates - // as applicable. - O("SyncEngine", "Cannot apply mutation batch with id: " + e); -} - -/** Applies a query target change from a different tab. */ -// PORTING NOTE: Multi-Tab only. -async function hu(t, e) { - const n = K(t); - if (mu(n), gu(n), !0 === e && !0 !== n.ou) { - // Secondary tabs only maintain Views for their local listeners and the - // Views internal state may not be 100% populated (in particular - // secondary tabs don't track syncedDocuments, the set of documents the - // server considers to be in the target). So when a secondary becomes - // primary, we need to need to make sure that all views for all targets - // match the state on disk. - const t = n.sharedClientState.getAllActiveQueryTargets(), e = await lu(n, t.toArray()); - n.ou = !0, await wa(n.remoteStore, !0); - for (const t of e) jo(n.remoteStore, t); - } else if (!1 === e && !1 !== n.ou) { - const t = []; - let e = Promise.resolve(); - n.Xa.forEach(((s, i) => { - n.sharedClientState.isLocalQueryTarget(i) ? t.push(i) : e = e.then((() => (Za(n, i), - to(n.localStore, i, - /*keepPersistedTargetData=*/ !0)))), Wo(n.remoteStore, i); - })), await e, await lu(n, t), - // PORTING NOTE: Multi-Tab only. - function(t) { - const e = K(t); - e.eu.forEach(((t, n) => { - Wo(e.remoteStore, n); - })), e.nu.bi(), e.eu = new Map, e.tu = new Cn(xt.comparator); - } - /** - * Reconcile the query views of the provided query targets with the state from - * persistence. Raises snapshots for any changes that affect the local - * client and returns the updated state of all target's query data. - * - * @param syncEngine - The sync engine implementation - * @param targets - the list of targets with views that need to be recomputed - * @param transitionToPrimary - `true` iff the tab transitions from a secondary - * tab to a primary tab - */ - // PORTING NOTE: Multi-Tab only. - (n), n.ou = !1, await wa(n.remoteStore, !1); - } -} - -async function lu(t, e, n) { - const s = K(t), i = [], r = []; - for (const t of e) { - let e; - const n = s.Xa.get(t); - if (n && 0 !== n.length) { - // For queries that have a local View, we fetch their current state - // from LocalStore (as the resume token and the snapshot version - // might have changed) and reconcile their views with the persisted - // state (the list of syncedDocuments may have gotten out of sync). - e = await Zr(s.localStore, $e(n[0])); - for (const t of n) { - const e = s.Ya.get(t), n = await au(s, e); - n.snapshot && r.push(n.snapshot); - } - } else { - // For queries that never executed on this client, we need to - // allocate the target in LocalStore and initialize a new View. - const n = await no(s.localStore, t); - e = await Zr(s.localStore, n), await Ua(s, fu(n), t, - /*current=*/ !1); - } - i.push(e); - } - return s.Ja.Ko(r), i; -} - -/** - * Creates a `Query` object from the specified `Target`. There is no way to - * obtain the original `Query`, so we synthesize a `Query` from the `Target` - * object. - * - * The synthesized result might be different from the original `Query`, but - * since the synthesized `Query` should return the same results as the - * original one (only the presentation of results might differ), the potential - * difference will not cause issues. - */ -// PORTING NOTE: Multi-Tab only. -function fu(t) { - return Se(t.path, t.collectionGroup, t.orderBy, t.filters, t.limit, "F" /* First */ , t.startAt, t.endAt); -} - -/** Returns the IDs of the clients that are currently active. */ -// PORTING NOTE: Multi-Tab only. -function du(t) { - const e = K(t); - return K(K(e.localStore).persistence).Ms(); -} - -/** Applies a query target change from a different tab. */ -// PORTING NOTE: Multi-Tab only. -async function _u(t, e, n, s) { - const i = K(t); - if (i.ou) - // If we receive a target state notification via WebStorage, we are - // either already secondary or another tab has taken the primary lease. - O("SyncEngine", "Ignoring unexpected query state notification."); else if (i.Xa.has(e)) switch (n) { - case "current": - case "not-current": - { - const t = await so(i.localStore), s = Wn.createSynthesizedRemoteEventForCurrentChange(e, "current" === n); - await iu(i, t, s); - break; - } - - case "rejected": - await to(i.localStore, e, - /* keepPersistedTargetData */ !0), Za(i, e, s); - break; - - default: - L(); - } -} - -/** Adds or removes Watch targets for queries from different tabs. */ async function wu(t, e, n) { - const s = mu(t); - if (s.ou) { - for (const t of e) { - if (s.Xa.has(t)) { - // A target might have been added in a previous attempt - O("SyncEngine", "Adding an already active target " + t); - continue; - } - const e = await no(s.localStore, t), n = await Zr(s.localStore, e); - await Ua(s, fu(e), n.targetId, - /*current=*/ !1), jo(s.remoteStore, n); - } - for (const t of n) - // Check that the target is still active since the target might have been - // removed if it has been rejected by the backend. - s.Xa.has(t) && - // Release queries that are still active. - await to(s.localStore, t, - /* keepPersistedTargetData */ !1).then((() => { - Wo(s.remoteStore, t), Za(s, t); - })).catch(Tr); - } -} - -function mu(t) { - const e = K(t); - return e.remoteStore.remoteSyncer.applyRemoteEvent = Qa.bind(null, e), e.remoteStore.remoteSyncer.getRemoteKeysForTarget = ou.bind(null, e), - e.remoteStore.remoteSyncer.rejectListen = Wa.bind(null, e), e.Ja.Ko = Va.bind(null, e.eventManager), - e.Ja.uu = va.bind(null, e.eventManager), e; -} - -function gu(t) { - const e = K(t); - return e.remoteStore.remoteSyncer.applySuccessfulWrite = za.bind(null, e), e.remoteStore.remoteSyncer.rejectFailedWrite = Ha.bind(null, e), - e; -} - -/** - * Loads a Firestore bundle into the SDK. The returned promise resolves when - * the bundle finished loading. - * - * @param syncEngine - SyncEngine to use. - * @param bundleReader - Bundle to load into the SDK. - * @param task - LoadBundleTask used to update the loading progress to public API. - */ function yu(t, e, n) { - const s = K(t); - // eslint-disable-next-line @typescript-eslint/no-floating-promises - (async function(t, e, n) { - try { - const s = await e.getMetadata(); - if (await function(t, e) { - const n = K(t), s = us(e.createTime); - return n.persistence.runTransaction("hasNewerBundle", "readonly", (t => n.fs.getBundleMetadata(t, e.id))).then((t => !!t && t.createTime.compareTo(s) >= 0)); - } - /** - * Saves the given `BundleMetadata` to local persistence. - */ (t.localStore, s)) return await e.close(), void n._completeWith(function(t) { - return { - taskState: "Success", - documentsLoaded: t.totalDocuments, - bytesLoaded: t.totalBytes, - totalDocuments: t.totalDocuments, - totalBytes: t.totalBytes - }; - }(s)); - n._updateProgress(ka(s)); - const i = new Na(s, t.localStore, e.M); - let r = await e.cu(); - for (;r; ) { - const t = await i.xa(r); - t && n._updateProgress(t), r = await e.cu(); - } - const o = await i.complete(); - // TODO(b/160876443): This currently raises snapshots with - // `fromCache=false` if users already listen to some queries and bundles - // has newer version. - await iu(t, o.$s, - /* remoteEvent */ void 0), - // Save metadata, so loading the same bundle will skip. - await function(t, e) { - const n = K(t); - return n.persistence.runTransaction("Save bundle", "readwrite", (t => n.fs.saveBundleMetadata(t, e))); - } - /** - * Returns a promise of a `NamedQuery` associated with given query name. Promise - * resolves to undefined if no persisted data can be found. - */ (t.localStore, s), n._completeWith(o.progress); - } catch (t) { - F("SyncEngine", `Loading bundle failed with ${t}`), n._failWith(t); - } - } - /** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * Provides all components needed for Firestore with in-memory persistence. - * Uses EagerGC garbage collection. - */)(s, e, n).then((() => { - s.sharedClientState.notifyBundleLoaded(); - })); -} - -class pu { - constructor() { - this.synchronizeTabs = !1; - } - async initialize(t) { - this.M = Oo(t.databaseInfo.databaseId), this.sharedClientState = this.hu(t), this.persistence = this.lu(t), - await this.persistence.start(), this.gcScheduler = this.fu(t), this.localStore = this.du(t); - } - fu(t) { - return null; - } - du(t) { - return jr(this.persistence, new Gr, t.initialUser, this.M); - } - lu(t) { - return new mo(yo.Wi, this.M); - } - hu(t) { - return new vo; - } - async terminate() { - this.gcScheduler && this.gcScheduler.stop(), await this.sharedClientState.shutdown(), - await this.persistence.shutdown(); - } -} - -/** - * Provides all components needed for Firestore with IndexedDB persistence. - */ class Iu extends pu { - constructor(t, e, n) { - super(), this._u = t, this.cacheSizeBytes = e, this.forceOwnership = n, this.synchronizeTabs = !1; - } - async initialize(t) { - await super.initialize(t), await io(this.localStore), await this._u.initialize(this, t), - // Enqueue writes from a previous session - await gu(this._u.syncEngine), await ra(this._u.remoteStore), - // NOTE: This will immediately call the listener, so we make sure to - // set it after localStore / remoteStore are started. - await this.persistence.ps((() => (this.gcScheduler && !this.gcScheduler.started && this.gcScheduler.start(this.localStore), - Promise.resolve()))); - } - du(t) { - return jr(this.persistence, new Gr, t.initialUser, this.M); - } - fu(t) { - const e = this.persistence.referenceDelegate.garbageCollector; - return new Rr(e, t.asyncQueue); - } - lu(t) { - const e = Lr(t.databaseInfo.databaseId, t.databaseInfo.persistenceKey), n = void 0 !== this.cacheSizeBytes ? ur.withCacheSize(this.cacheSizeBytes) : ur.DEFAULT; - return new $r(this.synchronizeTabs, e, t.clientId, n, t.asyncQueue, ko(), Mo(), this.M, this.sharedClientState, !!this.forceOwnership); - } - hu(t) { - return new vo; - } -} - -/** - * Provides all components needed for Firestore with multi-tab IndexedDB - * persistence. - * - * In the legacy client, this provider is used to provide both multi-tab and - * non-multi-tab persistence since we cannot tell at build time whether - * `synchronizeTabs` will be enabled. - */ class Tu extends Iu { - constructor(t, e) { - super(t, e, /* forceOwnership= */ !1), this._u = t, this.cacheSizeBytes = e, this.synchronizeTabs = !0; - } - async initialize(t) { - await super.initialize(t); - const e = this._u.syncEngine; - this.sharedClientState instanceof Vo && (this.sharedClientState.syncEngine = { - Nr: cu.bind(null, e), - kr: _u.bind(null, e), - Mr: wu.bind(null, e), - Ms: du.bind(null, e), - Cr: uu.bind(null, e) - }, await this.sharedClientState.start()), - // NOTE: This will immediately call the listener, so we make sure to - // set it after localStore / remoteStore are started. - await this.persistence.ps((async t => { - await hu(this._u.syncEngine, t), this.gcScheduler && (t && !this.gcScheduler.started ? this.gcScheduler.start(this.localStore) : t || this.gcScheduler.stop()); - })); - } - hu(t) { - const e = ko(); - if (!Vo.vt(e)) throw new Q(G.UNIMPLEMENTED, "IndexedDB persistence is only available on platforms that support LocalStorage."); - const n = Lr(t.databaseInfo.databaseId, t.databaseInfo.persistenceKey); - return new Vo(e, t.asyncQueue, n, t.clientId, t.initialUser); - } -} - -/** - * Initializes and wires the components that are needed to interface with the - * network. - */ class Eu { - async initialize(t, e) { - this.localStore || (this.localStore = t.localStore, this.sharedClientState = t.sharedClientState, - this.datastore = this.createDatastore(e), this.remoteStore = this.createRemoteStore(e), - this.eventManager = this.createEventManager(e), this.syncEngine = this.createSyncEngine(e, - /* startAsPrimary=*/ !t.synchronizeTabs), this.sharedClientState.onlineStateHandler = t => ja(this.syncEngine, t, 1 /* SharedClientState */), - this.remoteStore.remoteSyncer.handleCredentialChange = ru.bind(null, this.syncEngine), - await wa(this.remoteStore, this.syncEngine.isPrimaryClient)); - } - createEventManager(t) { - return new Ra; - } - createDatastore(t) { - const e = Oo(t.databaseInfo.databaseId), n = (s = t.databaseInfo, new No(s)); - var s; - /** Return the Platform-specific connectivity monitor. */ return function(t, e, n, s) { - return new qo(t, e, n, s); - }(t.authCredentials, t.appCheckCredentials, n, e); - } - createRemoteStore(t) { - return e = this.localStore, n = this.datastore, s = t.asyncQueue, i = t => ja(this.syncEngine, t, 0 /* RemoteStore */), - r = Do.vt() ? new Do : new So, new Ko(e, n, s, i, r); - var e, n, s, i, r; - /** Re-enables the network. Idempotent. */ } - createSyncEngine(t, e) { - return function(t, e, n, - // PORTING NOTE: Manages state synchronization in multi-tab environments. - s, i, r, o) { - const a = new La(t, e, n, s, i, r); - return o && (a.ou = !0), a; - }(this.localStore, this.remoteStore, this.eventManager, this.sharedClientState, t.initialUser, t.maxConcurrentLimboResolutions, e); - } - terminate() { - return async function(t) { - const e = K(t); - O("RemoteStore", "RemoteStore shutting down."), e.ha.add(5 /* Shutdown */), await Qo(e), - e.fa.shutdown(), - // Set the OnlineState to Unknown (rather than Offline) to avoid potentially - // triggering spurious listener events with cached data, etc. - e.da.set("Unknown" /* Unknown */); - }(this.remoteStore); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * How many bytes to read each time when `ReadableStreamReader.read()` is - * called. Only applicable for byte streams that we control (e.g. those backed - * by an UInt8Array). - */ -/** - * Builds a `ByteStreamReader` from a UInt8Array. - * @param source - The data source to use. - * @param bytesPerRead - How many bytes each `read()` from the returned reader - * will read. - */ -function Au(t, e = 10240) { - let n = 0; - // The TypeScript definition for ReadableStreamReader changed. We use - // `any` here to allow this code to compile with different versions. - // See https://github.com/microsoft/TypeScript/issues/42970 - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async read() { - if (n < t.byteLength) { - const s = { - value: t.slice(n, n + e), - done: !1 - }; - return n += e, s; - } - return { - done: !0 - }; - }, - async cancel() {}, - releaseLock() {}, - closed: Promise.reject("unimplemented") - }; -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * On web, a `ReadableStream` is wrapped around by a `ByteStreamReader`. - */ -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/* - * A wrapper implementation of Observer that will dispatch events - * asynchronously. To allow immediate silencing, a mute call is added which - * causes events scheduled to no longer be raised. - */ -class Ru { - constructor(t) { - this.observer = t, - /** - * When set to true, will not raise future events. Necessary to deal with - * async detachment of listener. - */ - this.muted = !1; - } - next(t) { - this.observer.next && this.wu(this.observer.next, t); - } - error(t) { - this.observer.error ? this.wu(this.observer.error, t) : console.error("Uncaught Error in snapshot listener:", t); - } - mu() { - this.muted = !0; - } - wu(t, e) { - this.muted || setTimeout((() => { - this.muted || t(e); - }), 0); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A class representing a bundle. - * - * Takes a bundle stream or buffer, and presents abstractions to read bundled - * elements out of the underlying content. - */ class bu { - constructor( - /** The reader to read from underlying binary bundle data source. */ - t, e) { - this.gu = t, this.M = e, - /** Cached bundle metadata. */ - this.metadata = new j, - /** - * Internal buffer to hold bundle content, accumulating incomplete element - * content. - */ - this.buffer = new Uint8Array, this.yu = new TextDecoder("utf-8"), - // Read the metadata (which is the first element). - this.pu().then((t => { - t && t.Da() ? this.metadata.resolve(t.payload.metadata) : this.metadata.reject(new Error(`The first element of the bundle is not a metadata, it is\n ${JSON.stringify(null == t ? void 0 : t.payload)}`)); - }), (t => this.metadata.reject(t))); - } - close() { - return this.gu.cancel(); - } - async getMetadata() { - return this.metadata.promise; - } - async cu() { - // Makes sure metadata is read before proceeding. - return await this.getMetadata(), this.pu(); - } - /** - * Reads from the head of internal buffer, and pulling more data from - * underlying stream if a complete element cannot be found, until an - * element(including the prefixed length and the JSON string) is found. - * - * Once a complete element is read, it is dropped from internal buffer. - * - * Returns either the bundled element, or null if we have reached the end of - * the stream. - */ async pu() { - const t = await this.Iu(); - if (null === t) return null; - const e = this.yu.decode(t), n = Number(e); - isNaN(n) && this.Tu(`length string (${e}) is not valid number`); - const s = await this.Eu(n); - return new Ca(JSON.parse(s), t.length + n); - } - /** First index of '{' from the underlying buffer. */ Au() { - return this.buffer.findIndex((t => t === "{".charCodeAt(0))); - } - /** - * Reads from the beginning of the internal buffer, until the first '{', and - * return the content. - * - * If reached end of the stream, returns a null. - */ async Iu() { - for (;this.Au() < 0; ) { - if (await this.Ru()) break; - } - // Broke out of the loop because underlying stream is closed, and there - // happens to be no more data to process. - if (0 === this.buffer.length) return null; - const t = this.Au(); - // Broke out of the loop because underlying stream is closed, but still - // cannot find an open bracket. - t < 0 && this.Tu("Reached the end of bundle when a length string is expected."); - const e = this.buffer.slice(0, t); - // Update the internal buffer to drop the read length. - return this.buffer = this.buffer.slice(t), e; - } - /** - * Reads from a specified position from the internal buffer, for a specified - * number of bytes, pulling more data from the underlying stream if needed. - * - * Returns a string decoded from the read bytes. - */ async Eu(t) { - for (;this.buffer.length < t; ) { - await this.Ru() && this.Tu("Reached the end of bundle when more is expected."); - } - const e = this.yu.decode(this.buffer.slice(0, t)); - // Update the internal buffer to drop the read json string. - return this.buffer = this.buffer.slice(t), e; - } - Tu(t) { - // eslint-disable-next-line @typescript-eslint/no-floating-promises - throw this.gu.cancel(), new Error(`Invalid bundle format: ${t}`); - } - /** - * Pulls more data from underlying stream to internal buffer. - * Returns a boolean indicating whether the stream is finished. - */ async Ru() { - const t = await this.gu.read(); - if (!t.done) { - const e = new Uint8Array(this.buffer.length + t.value.length); - e.set(this.buffer), e.set(t.value, this.buffer.length), this.buffer = e; - } - return t.done; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Internal transaction object responsible for accumulating the mutations to - * perform and the base versions for any documents read. - */ -class Pu { - constructor(t) { - this.datastore = t, - // The version of each document that was read during this transaction. - this.readVersions = new Map, this.mutations = [], this.committed = !1, - /** - * A deferred usage error that occurred previously in this transaction that - * will cause the transaction to fail once it actually commits. - */ - this.lastWriteError = null, - /** - * Set of documents that have been written in the transaction. - * - * When there's more than one write to the same key in a transaction, any - * writes after the first are handled differently. - */ - this.writtenDocs = new Set; - } - async lookup(t) { - if (this.ensureCommitNotCalled(), this.mutations.length > 0) throw new Q(G.INVALID_ARGUMENT, "Firestore transactions require all reads to be executed before all writes."); - const e = await async function(t, e) { - const n = K(t), s = ws(n.M) + "/documents", i = { - documents: e.map((t => ls(n.M, t))) - }, r = await n.uo("BatchGetDocuments", s, i), o = new Map; - r.forEach((t => { - const e = ps(n.M, t); - o.set(e.key.toString(), e); - })); - const a = []; - return e.forEach((t => { - const e = o.get(t.toString()); - q(!!e), a.push(e); - })), a; - }(this.datastore, t); - return e.forEach((t => this.recordVersion(t))), e; - } - set(t, e) { - this.write(e.toMutation(t, this.precondition(t))), this.writtenDocs.add(t.toString()); - } - update(t, e) { - try { - this.write(e.toMutation(t, this.preconditionForUpdate(t))); - } catch (t) { - this.lastWriteError = t; - } - this.writtenDocs.add(t.toString()); - } - delete(t) { - this.write(new An(t, this.precondition(t))), this.writtenDocs.add(t.toString()); - } - async commit() { - if (this.ensureCommitNotCalled(), this.lastWriteError) throw this.lastWriteError; - const t = this.readVersions; - // For each mutation, note that the doc was written. - this.mutations.forEach((e => { - t.delete(e.key.toString()); - })), - // For each document that was read but not written to, we want to perform - // a `verify` operation. - t.forEach(((t, e) => { - const n = xt.fromPath(e); - this.mutations.push(new Rn(n, this.precondition(n))); - })), await async function(t, e) { - const n = K(t), s = ws(n.M) + "/documents", i = { - writes: e.map((t => Ts(n.M, t))) - }; - await n.io("Commit", s, i); - }(this.datastore, this.mutations), this.committed = !0; - } - recordVersion(t) { - let e; - if (t.isFoundDocument()) e = t.version; else { - if (!t.isNoDocument()) throw L(); - // For deleted docs, we must use baseVersion 0 when we overwrite them. - e = ct.min(); - } - const n = this.readVersions.get(t.key.toString()); - if (n) { - if (!e.isEqual(n)) - // This transaction will fail no matter what. - throw new Q(G.ABORTED, "Document version changed between two reads."); - } else this.readVersions.set(t.key.toString(), e); - } - /** - * Returns the version of this document when it was read in this transaction, - * as a precondition, or no precondition if it was not read. - */ precondition(t) { - const e = this.readVersions.get(t.toString()); - return !this.writtenDocs.has(t.toString()) && e ? hn.updateTime(e) : hn.none(); - } - /** - * Returns the precondition for a document if the operation is an update. - */ preconditionForUpdate(t) { - const e = this.readVersions.get(t.toString()); - // The first time a document is written, we want to take into account the - // read time and existence - if (!this.writtenDocs.has(t.toString()) && e) { - if (e.isEqual(ct.min())) - // The document doesn't exist, so fail the transaction. - // This has to be validated locally because you can't send a - // precondition that a document does not exist without changing the - // semantics of the backend write to be an insert. This is the reverse - // of what we want, since we want to assert that the document doesn't - // exist but then send the update and have it fail. Since we can't - // express that to the backend, we have to validate locally. - // Note: this can change once we can send separate verify writes in the - // transaction. - throw new Q(G.INVALID_ARGUMENT, "Can't update a document that doesn't exist."); - // Document exists, base precondition on document update time. - return hn.updateTime(e); - } - // Document was not read, so we just use the preconditions for a blind - // update. - return hn.exists(!0); - } - write(t) { - this.ensureCommitNotCalled(), this.mutations.push(t); - } - ensureCommitNotCalled() {} -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * TransactionRunner encapsulates the logic needed to run and retry transactions - * with backoff. - */ -class Vu { - constructor(t, e, n, s) { - this.asyncQueue = t, this.datastore = e, this.updateFunction = n, this.deferred = s, - this.bu = 5, this.vo = new $o(this.asyncQueue, "transaction_retry" /* TransactionRetry */); - } - /** Runs the transaction and sets the result on deferred. */ run() { - this.bu -= 1, this.Pu(); - } - Pu() { - this.vo.po((async () => { - const t = new Pu(this.datastore), e = this.Vu(t); - e && e.then((e => { - this.asyncQueue.enqueueAndForget((() => t.commit().then((() => { - this.deferred.resolve(e); - })).catch((t => { - this.vu(t); - })))); - })).catch((t => { - this.vu(t); - })); - })); - } - Vu(t) { - try { - const e = this.updateFunction(t); - return !St(e) && e.catch && e.then ? e : (this.deferred.reject(Error("Transaction callback must return a Promise")), - null); - } catch (t) { - // Do not retry errors thrown by user provided updateFunction. - return this.deferred.reject(t), null; - } - } - vu(t) { - this.bu > 0 && this.Su(t) ? (this.bu -= 1, this.asyncQueue.enqueueAndForget((() => (this.Pu(), - Promise.resolve())))) : this.deferred.reject(t); - } - Su(t) { - if ("FirebaseError" === t.name) { - // In transactions, the backend will fail outdated reads with FAILED_PRECONDITION and - // non-matching document versions with ABORTED. These errors should be retried. - const e = t.code; - return "aborted" === e || "failed-precondition" === e || !vn(e); - } - return !1; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * FirestoreClient is a top-level class that constructs and owns all of the - * pieces of the client SDK architecture. It is responsible for creating the - * async queue that is shared by all of the other components in the system. - */ -class vu { - constructor(t, e, - /** - * Asynchronous queue responsible for all of our internal processing. When - * we get incoming work from the user (via public API) or the network - * (incoming GRPC messages), we should always schedule onto this queue. - * This ensures all of our work is properly serialized (e.g. we don't - * start processing a new operation while the previous one is waiting for - * an async I/O to complete). - */ - n, s) { - this.authCredentials = t, this.appCheckCredentials = e, this.asyncQueue = n, this.databaseInfo = s, - this.user = C.UNAUTHENTICATED, this.clientId = it.R(), this.authCredentialListener = () => Promise.resolve(), - this.appCheckCredentialListener = () => Promise.resolve(), this.authCredentials.start(n, (async t => { - O("FirestoreClient", "Received user=", t.uid), await this.authCredentialListener(t), - this.user = t; - })), this.appCheckCredentials.start(n, (t => (O("FirestoreClient", "Received new app check token=", t), - this.appCheckCredentialListener(t, this.user)))); - } - async getConfiguration() { - return { - asyncQueue: this.asyncQueue, - databaseInfo: this.databaseInfo, - clientId: this.clientId, - authCredentials: this.authCredentials, - appCheckCredentials: this.appCheckCredentials, - initialUser: this.user, - maxConcurrentLimboResolutions: 100 - }; - } - setCredentialChangeListener(t) { - this.authCredentialListener = t; - } - setAppCheckTokenChangeListener(t) { - this.appCheckCredentialListener = t; - } - /** - * Checks that the client has not been terminated. Ensures that other methods on - * this class cannot be called after the client is terminated. - */ verifyNotTerminated() { - if (this.asyncQueue.isShuttingDown) throw new Q(G.FAILED_PRECONDITION, "The client has already been terminated."); - } - terminate() { - this.asyncQueue.enterRestrictedMode(); - const t = new j; - return this.asyncQueue.enqueueAndForgetEvenWhileRestricted((async () => { - try { - this.onlineComponents && await this.onlineComponents.terminate(), this.offlineComponents && await this.offlineComponents.terminate(), - // The credentials provider must be terminated after shutting down the - // RemoteStore as it will prevent the RemoteStore from retrieving auth - // tokens. - this.authCredentials.shutdown(), this.appCheckCredentials.shutdown(), t.resolve(); - } catch (e) { - const n = pa(e, "Failed to shutdown persistence"); - t.reject(n); - } - })), t.promise; - } -} - -async function Su(t, e) { - t.asyncQueue.verifyOperationInProgress(), O("FirestoreClient", "Initializing OfflineComponentProvider"); - const n = await t.getConfiguration(); - await e.initialize(n); - let s = n.initialUser; - t.setCredentialChangeListener((async t => { - s.isEqual(t) || (await Wr(e.localStore, t), s = t); - })), - // When a user calls clearPersistence() in one client, all other clients - // need to be terminated to allow the delete to succeed. - e.persistence.setDatabaseDeletedListener((() => t.terminate())), t.offlineComponents = e; -} - -async function Du(t, e) { - t.asyncQueue.verifyOperationInProgress(); - const n = await Cu(t); - O("FirestoreClient", "Initializing OnlineComponentProvider"); - const s = await t.getConfiguration(); - await e.initialize(n, s), - // The CredentialChangeListener of the online component provider takes - // precedence over the offline component provider. - t.setCredentialChangeListener((t => _a(e.remoteStore, t))), t.setAppCheckTokenChangeListener(((t, n) => _a(e.remoteStore, n))), - t.onlineComponents = e; -} - -async function Cu(t) { - return t.offlineComponents || (O("FirestoreClient", "Using default OfflineComponentProvider"), - await Su(t, new pu)), t.offlineComponents; -} - -async function xu(t) { - return t.onlineComponents || (O("FirestoreClient", "Using default OnlineComponentProvider"), - await Du(t, new Eu)), t.onlineComponents; -} - -function Nu(t) { - return Cu(t).then((t => t.persistence)); -} - -function ku(t) { - return Cu(t).then((t => t.localStore)); -} - -function Mu(t) { - return xu(t).then((t => t.remoteStore)); -} - -function Ou(t) { - return xu(t).then((t => t.syncEngine)); -} - -async function $u(t) { - const e = await xu(t), n = e.eventManager; - return n.onListen = qa.bind(null, e.syncEngine), n.onUnlisten = Ka.bind(null, e.syncEngine), - n; -} - -/** Enables the network connection and re-enqueues all pending operations. */ function Fu(t) { - return t.asyncQueue.enqueue((async () => { - const e = await Nu(t), n = await Mu(t); - return e.setNetworkEnabled(!0), function(t) { - const e = K(t); - return e.ha.delete(0 /* UserDisabled */), Go(e); - }(n); - })); -} - -/** Disables the network connection. Pending operations will not complete. */ function Bu(t) { - return t.asyncQueue.enqueue((async () => { - const e = await Nu(t), n = await Mu(t); - return e.setNetworkEnabled(!1), async function(t) { - const e = K(t); - e.ha.add(0 /* UserDisabled */), await Qo(e), - // Set the OnlineState to Offline so get()s return from cache, etc. - e.da.set("Offline" /* Offline */); - }(n); - })); -} - -/** - * Returns a Promise that resolves when all writes that were pending at the time - * this method was called received server acknowledgement. An acknowledgement - * can be either acceptance or rejection. - */ function Lu(t, e) { - const n = new j; - return t.asyncQueue.enqueueAndForget((async () => async function(t, e, n) { - try { - const s = await function(t, e) { - const n = K(t); - return n.persistence.runTransaction("read document", "readonly", (t => n.ui.Bs(t, e))); - }(t, e); - s.isFoundDocument() ? n.resolve(s) : s.isNoDocument() ? n.resolve(null) : n.reject(new Q(G.UNAVAILABLE, "Failed to get document from cache. (However, this document may exist on the server. Run again without setting 'source' in the GetOptions to attempt to retrieve the document from the server.)")); - } catch (t) { - const s = pa(t, `Failed to get document '${e} from cache`); - n.reject(s); - } - } - /** - * Retrieves a latency-compensated document from the backend via a - * SnapshotListener. - */ (await ku(t), e, n))), n.promise; -} - -function qu(t, e, n = {}) { - const s = new j; - return t.asyncQueue.enqueueAndForget((async () => function(t, e, n, s, i) { - const r = new Ru({ - next: r => { - // Remove query first before passing event to user to avoid - // user actions affecting the now stale query. - e.enqueueAndForget((() => Pa(t, o))); - const a = r.docs.has(n); - !a && r.fromCache ? - // TODO(dimond): If we're online and the document doesn't - // exist then we resolve with a doc.exists set to false. If - // we're offline however, we reject the Promise in this - // case. Two options: 1) Cache the negative response from - // the server so we can deliver that even when you're - // offline 2) Actually reject the Promise in the online case - // if the document doesn't exist. - i.reject(new Q(G.UNAVAILABLE, "Failed to get document because the client is offline.")) : a && r.fromCache && s && "server" === s.source ? i.reject(new Q(G.UNAVAILABLE, 'Failed to get document from server. (However, this document does exist in the local cache. Run again without setting source to "server" to retrieve the cached document.)')) : i.resolve(r); - }, - error: t => i.reject(t) - }), o = new Da(De(n.path), r, { - includeMetadataChanges: !0, - Sa: !0 - }); - return ba(t, o); - }(await $u(t), t.asyncQueue, e, n, s))), s.promise; -} - -function Uu(t, e) { - const n = new j; - return t.asyncQueue.enqueueAndForget((async () => async function(t, e, n) { - try { - const s = await eo(t, e, - /* usePreviousResults= */ !0), i = new $a(e, s.hi), r = i.La(s.documents), o = i.applyChanges(r, - /* updateLimboDocuments= */ !1); - n.resolve(o.snapshot); - } catch (t) { - const s = pa(t, `Failed to execute query '${e} against cache`); - n.reject(s); - } - } - /** - * Retrieves a latency-compensated query snapshot from the backend via a - * SnapshotListener. - */ (await ku(t), e, n))), n.promise; -} - -function Ku(t, e, n = {}) { - const s = new j; - return t.asyncQueue.enqueueAndForget((async () => function(t, e, n, s, i) { - const r = new Ru({ - next: n => { - // Remove query first before passing event to user to avoid - // user actions affecting the now stale query. - e.enqueueAndForget((() => Pa(t, o))), n.fromCache && "server" === s.source ? i.reject(new Q(G.UNAVAILABLE, 'Failed to get documents from server. (However, these documents may exist in the local cache. Run again without setting source to "server" to retrieve the cached documents.)')) : i.resolve(n); - }, - error: t => i.reject(t) - }), o = new Da(n, r, { - includeMetadataChanges: !0, - Sa: !0 - }); - return ba(t, o); - }(await $u(t), t.asyncQueue, e, n, s))), s.promise; -} - -function Gu(t, e) { - const n = new Ru(e); - return t.asyncQueue.enqueueAndForget((async () => function(t, e) { - K(t).Ia.add(e), - // Immediately fire an initial event, indicating all existing listeners - // are in-sync. - e.next(); - }(await $u(t), n))), () => { - n.mu(), t.asyncQueue.enqueueAndForget((async () => function(t, e) { - K(t).Ia.delete(e); - }(await $u(t), n))); - }; -} - -/** - * Takes an updateFunction in which a set of reads and writes can be performed - * atomically. In the updateFunction, the client can read and write values - * using the supplied transaction object. After the updateFunction, all - * changes will be committed. If a retryable error occurs (ex: some other - * client has changed any of the data referenced), then the updateFunction - * will be called again after a backoff. If the updateFunction still fails - * after all retries, then the transaction will be rejected. - * - * The transaction object passed to the updateFunction contains methods for - * accessing documents and collections. Unlike other datastore access, data - * accessed with the transaction will not reflect local changes that have not - * been committed. For this reason, it is required that all reads are - * performed before any writes. Transactions must be performed while online. - */ function Qu(t, e) { - const n = new j; - return t.asyncQueue.enqueueAndForget((async () => { - const s = await function(t) { - return xu(t).then((t => t.datastore)); - }(t); - new Vu(t.asyncQueue, s, e, n).run(); - })), n.promise; -} - -function ju(t, e, n, s) { - const i = function(t, e) { - let n; - n = "string" == typeof t ? (new TextEncoder).encode(t) : t; - return function(t, e) { - return new bu(t, e); - }(function(t, e) { - if (t instanceof Uint8Array) return Au(t, e); - if (t instanceof ArrayBuffer) return Au(new Uint8Array(t), e); - if (t instanceof ReadableStream) return t.getReader(); - throw new Error("Source of `toByteStreamReader` has to be a ArrayBuffer or ReadableStream"); - }(n), e); - } - /** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ (n, Oo(e)); - t.asyncQueue.enqueueAndForget((async () => { - yu(await Ou(t), i, s); - })); -} - -function Wu(t, e) { - return t.asyncQueue.enqueue((async () => function(t, e) { - const n = K(t); - return n.persistence.runTransaction("Get named query", "readonly", (t => n.fs.getNamedQuery(t, e))); - }(await ku(t), e))); -} - -const zu = new Map; - -/** - * An instance map that ensures only one Datastore exists per Firestore - * instance. - */ -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function Hu(t, e, n) { - if (!n) throw new Q(G.INVALID_ARGUMENT, `Function ${t}() cannot be called with an empty ${e}.`); -} - -/** - * Validates that two boolean options are not set at the same time. - * @internal - */ function Ju(t, e, n, s) { - if (!0 === e && !0 === s) throw new Q(G.INVALID_ARGUMENT, `${t} and ${n} cannot be used together.`); -} - -/** - * Validates that `path` refers to a document (indicated by the fact it contains - * an even numbers of segments). - */ function Yu(t) { - if (!xt.isDocumentKey(t)) throw new Q(G.INVALID_ARGUMENT, `Invalid document reference. Document references must have an even number of segments, but ${t} has ${t.length}.`); -} - -/** - * Validates that `path` refers to a collection (indicated by the fact it - * contains an odd numbers of segments). - */ function Xu(t) { - if (xt.isDocumentKey(t)) throw new Q(G.INVALID_ARGUMENT, `Invalid collection reference. Collection references must have an odd number of segments, but ${t} has ${t.length}.`); -} - -/** - * Returns true if it's a non-null object without a custom prototype - * (i.e. excludes Array, Date, etc.). - */ -/** Returns a string describing the type / value of the provided input. */ -function Zu(t) { - if (void 0 === t) return "undefined"; - if (null === t) return "null"; - if ("string" == typeof t) return t.length > 20 && (t = `${t.substring(0, 20)}...`), - JSON.stringify(t); - if ("number" == typeof t || "boolean" == typeof t) return "" + t; - if ("object" == typeof t) { - if (t instanceof Array) return "an array"; - { - const e = - /** try to get the constructor name for an object. */ - function(t) { - if (t.constructor) return t.constructor.name; - return null; - } - /** - * Casts `obj` to `T`, optionally unwrapping Compat types to expose the - * underlying instance. Throws if `obj` is not an instance of `T`. - * - * This cast is used in the Lite and Full SDK to verify instance types for - * arguments passed to the public API. - * @internal - */ (t); - return e ? `a custom ${e} object` : "an object"; - } - } - return "function" == typeof t ? "a function" : L(); -} - -function tc(t, -// eslint-disable-next-line @typescript-eslint/no-explicit-any -e) { - if ("_delegate" in t && ( - // Unwrap Compat types - // eslint-disable-next-line @typescript-eslint/no-explicit-any - t = t._delegate), !(t instanceof e)) { - if (e.name === t.constructor.name) throw new Q(G.INVALID_ARGUMENT, "Type does not match the expected instance. Did you pass a reference from a different Firestore SDK?"); - { - const n = Zu(t); - throw new Q(G.INVALID_ARGUMENT, `Expected type '${e.name}', but it was: ${n}`); - } - } - return t; -} - -function ec(t, e) { - if (e <= 0) throw new Q(G.INVALID_ARGUMENT, `Function ${t}() requires a positive number, but it was: ${e}.`); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -// settings() defaults: -/** - * A concrete type describing all the values that can be applied via a - * user-supplied `FirestoreSettings` object. This is a separate type so that - * defaults can be supplied and the value can be checked for equality. - */ -class nc { - constructor(t) { - var e; - if (void 0 === t.host) { - if (void 0 !== t.ssl) throw new Q(G.INVALID_ARGUMENT, "Can't provide ssl option if host option is not set"); - this.host = "firestore.googleapis.com", this.ssl = true; - } else this.host = t.host, this.ssl = null === (e = t.ssl) || void 0 === e || e; - if (this.credentials = t.credentials, this.ignoreUndefinedProperties = !!t.ignoreUndefinedProperties, - void 0 === t.cacheSizeBytes) this.cacheSizeBytes = 41943040; else { - if (-1 !== t.cacheSizeBytes && t.cacheSizeBytes < 1048576) throw new Q(G.INVALID_ARGUMENT, "cacheSizeBytes must be at least 1048576"); - this.cacheSizeBytes = t.cacheSizeBytes; - } - this.experimentalForceLongPolling = !!t.experimentalForceLongPolling, this.experimentalAutoDetectLongPolling = !!t.experimentalAutoDetectLongPolling, - this.useFetchStreams = !!t.useFetchStreams, Ju("experimentalForceLongPolling", t.experimentalForceLongPolling, "experimentalAutoDetectLongPolling", t.experimentalAutoDetectLongPolling); - } - isEqual(t) { - return this.host === t.host && this.ssl === t.ssl && this.credentials === t.credentials && this.cacheSizeBytes === t.cacheSizeBytes && this.experimentalForceLongPolling === t.experimentalForceLongPolling && this.experimentalAutoDetectLongPolling === t.experimentalAutoDetectLongPolling && this.ignoreUndefinedProperties === t.ignoreUndefinedProperties && this.useFetchStreams === t.useFetchStreams; - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * The Cloud Firestore service interface. - * - * Do not call this constructor directly. Instead, use {@link getFirestore}. - */ class sc { - /** @hideconstructor */ - constructor(t, e, n) { - this._authCredentials = e, this._appCheckCredentials = n, - /** - * Whether it's a Firestore or Firestore Lite instance. - */ - this.type = "firestore-lite", this._persistenceKey = "(lite)", this._settings = new nc({}), - this._settingsFrozen = !1, t instanceof vt ? this._databaseId = t : (this._app = t, - this._databaseId = function(t) { - if (!Object.prototype.hasOwnProperty.apply(t.options, [ "projectId" ])) throw new Q(G.INVALID_ARGUMENT, '"projectId" not provided in firebase.initializeApp.'); - return new vt(t.options.projectId); - } - /** - * Modify this instance to communicate with the Cloud Firestore emulator. - * - * Note: This must be called before this instance has been used to do any - * operations. - * - * @param firestore - The `Firestore` instance to configure to connect to the - * emulator. - * @param host - the emulator host (ex: localhost). - * @param port - the emulator port (ex: 9000). - * @param options.mockUserToken - the mock auth token to use for unit testing - * Security Rules. - */ (t)); - } - /** - * The {@link @firebase/app#FirebaseApp} associated with this `Firestore` service - * instance. - */ get app() { - if (!this._app) throw new Q(G.FAILED_PRECONDITION, "Firestore was not initialized using the Firebase SDK. 'app' is not available"); - return this._app; - } - get _initialized() { - return this._settingsFrozen; - } - get _terminated() { - return void 0 !== this._terminateTask; - } - _setSettings(t) { - if (this._settingsFrozen) throw new Q(G.FAILED_PRECONDITION, "Firestore has already been started and its settings can no longer be changed. You can only modify settings before calling any other methods on a Firestore object."); - this._settings = new nc(t), void 0 !== t.credentials && (this._authCredentials = function(t) { - if (!t) return new z; - switch (t.type) { - case "gapi": - const e = t.client; - // Make sure this really is a Gapi client. - return q(!("object" != typeof e || null === e || !e.auth || !e.auth.getAuthHeaderValueForFirstParty)), - new X(e, t.sessionIndex || "0", t.iamToken || null); - - case "provider": - return t.client; - - default: - throw new Q(G.INVALID_ARGUMENT, "makeAuthCredentialsProvider failed due to invalid credential type"); - } - }(t.credentials)); - } - _getSettings() { - return this._settings; - } - _freezeSettings() { - return this._settingsFrozen = !0, this._settings; - } - _delete() { - return this._terminateTask || (this._terminateTask = this._terminate()), this._terminateTask; - } - /** Returns a JSON-serializable representation of this `Firestore` instance. */ toJSON() { - return { - app: this._app, - databaseId: this._databaseId, - settings: this._settings - }; - } - /** - * Terminates all components used by this client. Subclasses can override - * this method to clean up their own dependencies, but must also call this - * method. - * - * Only ever called once. - */ _terminate() { - /** - * Removes all components associated with the provided instance. Must be called - * when the `Firestore` instance is terminated. - */ - return function(t) { - const e = zu.get(t); - e && (O("ComponentProvider", "Removing Datastore"), zu.delete(t), e.terminate()); - }(this), Promise.resolve(); - } -} - -function ic(t, e, n, s = {}) { - var i; - const r = (t = tc(t, sc))._getSettings(); - if ("firestore.googleapis.com" !== r.host && r.host !== e && F("Host has been set in both settings() and useEmulator(), emulator host will be used"), - t._setSettings(Object.assign(Object.assign({}, r), { - host: `${e}:${n}`, - ssl: !1 - })), s.mockUserToken) { - let e, n; - if ("string" == typeof s.mockUserToken) e = s.mockUserToken, n = C.MOCK_USER; else { - // Let createMockUserToken validate first (catches common mistakes like - // invalid field "uid" and missing field "sub" / "user_id".) - e = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.createMockUserToken)(s.mockUserToken, null === (i = t._app) || void 0 === i ? void 0 : i.options.projectId); - const r = s.mockUserToken.sub || s.mockUserToken.user_id; - if (!r) throw new Q(G.INVALID_ARGUMENT, "mockUserToken must contain 'sub' or 'user_id' field!"); - n = new C(r); - } - t._authCredentials = new H(new W(e, n)); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A `DocumentReference` refers to a document location in a Firestore database - * and can be used to write, read, or listen to the location. The document at - * the referenced location may or may not exist. - */ class rc { - /** @hideconstructor */ - constructor(t, - /** - * If provided, the `FirestoreDataConverter` associated with this instance. - */ - e, n) { - this.converter = e, this._key = n, - /** The type of this Firestore reference. */ - this.type = "document", this.firestore = t; - } - get _path() { - return this._key.path; - } - /** - * The document's identifier within its collection. - */ get id() { - return this._key.path.lastSegment(); - } - /** - * A string representing the path of the referenced document (relative - * to the root of the database). - */ get path() { - return this._key.path.canonicalString(); - } - /** - * The collection this `DocumentReference` belongs to. - */ get parent() { - return new ac(this.firestore, this.converter, this._key.path.popLast()); - } - withConverter(t) { - return new rc(this.firestore, t, this._key); - } -} - -/** - * A `Query` refers to a query which you can read or listen to. You can also - * construct refined `Query` objects by adding filters and ordering. - */ class oc { - // This is the lite version of the Query class in the main SDK. - /** @hideconstructor protected */ - constructor(t, - /** - * If provided, the `FirestoreDataConverter` associated with this instance. - */ - e, n) { - this.converter = e, this._query = n, - /** The type of this Firestore reference. */ - this.type = "query", this.firestore = t; - } - withConverter(t) { - return new oc(this.firestore, t, this._query); - } -} - -/** - * A `CollectionReference` object can be used for adding documents, getting - * document references, and querying for documents (using {@link query}). - */ class ac extends oc { - /** @hideconstructor */ - constructor(t, e, n) { - super(t, e, De(n)), this._path = n, - /** The type of this Firestore reference. */ - this.type = "collection"; - } - /** The collection's identifier. */ get id() { - return this._query.path.lastSegment(); - } - /** - * A string representing the path of the referenced collection (relative - * to the root of the database). - */ get path() { - return this._query.path.canonicalString(); - } - /** - * A reference to the containing `DocumentReference` if this is a - * subcollection. If this isn't a subcollection, the reference is null. - */ get parent() { - const t = this._path.popLast(); - return t.isEmpty() ? null : new rc(this.firestore, - /* converter= */ null, new xt(t)); - } - withConverter(t) { - return new ac(this.firestore, t, this._path); - } -} - -function uc(t, e, ...n) { - if (t = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(t), Hu("collection", "path", e), t instanceof sc) { - const s = _t.fromString(e, ...n); - return Xu(s), new ac(t, /* converter= */ null, s); - } - { - if (!(t instanceof rc || t instanceof ac)) throw new Q(G.INVALID_ARGUMENT, "Expected first argument to collection() to be a CollectionReference, a DocumentReference or FirebaseFirestore"); - const s = t._path.child(_t.fromString(e, ...n)); - return Xu(s), new ac(t.firestore, - /* converter= */ null, s); - } -} - -// TODO(firestorelite): Consider using ErrorFactory - -// https://github.com/firebase/firebase-js-sdk/blob/0131e1f/packages/util/src/errors.ts#L106 -/** - * Creates and returns a new `Query` instance that includes all documents in the - * database that are contained in a collection or subcollection with the - * given `collectionId`. - * - * @param firestore - A reference to the root `Firestore` instance. - * @param collectionId - Identifies the collections to query over. Every - * collection or subcollection with this ID as the last segment of its path - * will be included. Cannot contain a slash. - * @returns The created `Query`. - */ function cc(t, e) { - if (t = tc(t, sc), Hu("collectionGroup", "collection id", e), e.indexOf("/") >= 0) throw new Q(G.INVALID_ARGUMENT, `Invalid collection ID '${e}' passed to function collectionGroup(). Collection IDs must not contain '/'.`); - return new oc(t, - /* converter= */ null, - /** - * Creates a new Query for a collection group query that matches all documents - * within the provided collection group. - */ - function(t) { - return new ve(_t.emptyPath(), t); - }(e)); -} - -function hc(t, e, ...n) { - if (t = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(t), - // We allow omission of 'pathString' but explicitly prohibit passing in both - // 'undefined' and 'null'. - 1 === arguments.length && (e = it.R()), Hu("doc", "path", e), t instanceof sc) { - const s = _t.fromString(e, ...n); - return Yu(s), new rc(t, - /* converter= */ null, new xt(s)); - } - { - if (!(t instanceof rc || t instanceof ac)) throw new Q(G.INVALID_ARGUMENT, "Expected first argument to collection() to be a CollectionReference, a DocumentReference or FirebaseFirestore"); - const s = t._path.child(_t.fromString(e, ...n)); - return Yu(s), new rc(t.firestore, t instanceof ac ? t.converter : null, new xt(s)); - } -} - -/** - * Returns true if the provided references are equal. - * - * @param left - A reference to compare. - * @param right - A reference to compare. - * @returns true if the references point to the same location in the same - * Firestore database. - */ function lc(t, e) { - return t = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(t), e = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(e), (t instanceof rc || t instanceof ac) && (e instanceof rc || e instanceof ac) && (t.firestore === e.firestore && t.path === e.path && t.converter === e.converter); -} - -/** - * Returns true if the provided queries point to the same collection and apply - * the same constraints. - * - * @param left - A `Query` to compare. - * @param right - A `Query` to compare. - * @returns true if the references point to the same location in the same - * Firestore database. - */ function fc(t, e) { - return t = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(t), e = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(e), t instanceof oc && e instanceof oc && (t.firestore === e.firestore && Be(t._query, e._query) && t.converter === e.converter); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ class dc { - constructor() { - // The last promise in the queue. - this.Du = Promise.resolve(), - // A list of retryable operations. Retryable operations are run in order and - // retried with backoff. - this.Cu = [], - // Is this AsyncQueue being shut down? Once it is set to true, it will not - // be changed again. - this.xu = !1, - // Operations scheduled to be queued in the future. Operations are - // automatically removed after they are run or canceled. - this.Nu = [], - // visible for testing - this.ku = null, - // Flag set while there's an outstanding AsyncQueue operation, used for - // assertion sanity-checks. - this.Mu = !1, - // Enabled during shutdown on Safari to prevent future access to IndexedDB. - this.Ou = !1, - // List of TimerIds to fast-forward delays for. - this.$u = [], - // Backoff timer used to schedule retries for retryable operations - this.vo = new $o(this, "async_queue_retry" /* AsyncQueueRetry */), - // Visibility handler that triggers an immediate retry of all retryable - // operations. Meant to speed up recovery when we regain file system access - // after page comes into foreground. - this.Fu = () => { - const t = Mo(); - t && O("AsyncQueue", "Visibility state changed to " + t.visibilityState), this.vo.To(); - }; - const t = Mo(); - t && "function" == typeof t.addEventListener && t.addEventListener("visibilitychange", this.Fu); - } - get isShuttingDown() { - return this.xu; - } - /** - * Adds a new operation to the queue without waiting for it to complete (i.e. - * we ignore the Promise result). - */ enqueueAndForget(t) { - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.enqueue(t); - } - enqueueAndForgetEvenWhileRestricted(t) { - this.Bu(), - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.Lu(t); - } - enterRestrictedMode(t) { - if (!this.xu) { - this.xu = !0, this.Ou = t || !1; - const e = Mo(); - e && "function" == typeof e.removeEventListener && e.removeEventListener("visibilitychange", this.Fu); - } - } - enqueue(t) { - if (this.Bu(), this.xu) - // Return a Promise which never resolves. - return new Promise((() => {})); - // Create a deferred Promise that we can return to the callee. This - // allows us to return a "hanging Promise" only to the callee and still - // advance the queue even when the operation is not run. - const e = new j; - return this.Lu((() => this.xu && this.Ou ? Promise.resolve() : (t().then(e.resolve, e.reject), - e.promise))).then((() => e.promise)); - } - enqueueRetryable(t) { - this.enqueueAndForget((() => (this.Cu.push(t), this.qu()))); - } - /** - * Runs the next operation from the retryable queue. If the operation fails, - * reschedules with backoff. - */ async qu() { - if (0 !== this.Cu.length) { - try { - await this.Cu[0](), this.Cu.shift(), this.vo.reset(); - } catch (t) { - if (!di(t)) throw t; - // Failure will be handled by AsyncQueue - O("AsyncQueue", "Operation failed with retryable error: " + t); - } - this.Cu.length > 0 && - // If there are additional operations, we re-schedule `retryNextOp()`. - // This is necessary to run retryable operations that failed during - // their initial attempt since we don't know whether they are already - // enqueued. If, for example, `op1`, `op2`, `op3` are enqueued and `op1` - // needs to be re-run, we will run `op1`, `op1`, `op2` using the - // already enqueued calls to `retryNextOp()`. `op3()` will then run in the - // call scheduled here. - // Since `backoffAndRun()` cancels an existing backoff and schedules a - // new backoff on every call, there is only ever a single additional - // operation in the queue. - this.vo.po((() => this.qu())); - } - } - Lu(t) { - const e = this.Du.then((() => (this.Mu = !0, t().catch((t => { - this.ku = t, this.Mu = !1; - const e = - /** - * Chrome includes Error.message in Error.stack. Other browsers do not. - * This returns expected output of message + stack when available. - * @param error - Error or FirestoreError - */ - function(t) { - let e = t.message || ""; - t.stack && (e = t.stack.includes(t.message) ? t.stack : t.message + "\n" + t.stack); - return e; - } - /** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ (t); - // Re-throw the error so that this.tail becomes a rejected Promise and - // all further attempts to chain (via .then) will just short-circuit - // and return the rejected Promise. - throw $("INTERNAL UNHANDLED ERROR: ", e), t; - })).then((t => (this.Mu = !1, t)))))); - return this.Du = e, e; - } - enqueueAfterDelay(t, e, n) { - this.Bu(), - // Fast-forward delays for timerIds that have been overriden. - this.$u.indexOf(t) > -1 && (e = 0); - const s = ya.createAndSchedule(this, t, e, n, (t => this.Uu(t))); - return this.Nu.push(s), s; - } - Bu() { - this.ku && L(); - } - verifyOperationInProgress() {} - /** - * Waits until all currently queued tasks are finished executing. Delayed - * operations are not run. - */ async Ku() { - // Operations in the queue prior to draining may have enqueued additional - // operations. Keep draining the queue until the tail is no longer advanced, - // which indicates that no more new operations were enqueued and that all - // operations were executed. - let t; - do { - t = this.Du, await t; - } while (t !== this.Du); - } - /** - * For Tests: Determine if a delayed operation with a particular TimerId - * exists. - */ Gu(t) { - for (const e of this.Nu) if (e.timerId === t) return !0; - return !1; - } - /** - * For Tests: Runs some or all delayed operations early. - * - * @param lastTimerId - Delayed operations up to and including this TimerId - * will be drained. Pass TimerId.All to run all delayed operations. - * @returns a Promise that resolves once all operations have been run. - */ Qu(t) { - // Note that draining may generate more delayed ops, so we do that first. - return this.Ku().then((() => { - // Run ops in the same order they'd run if they ran naturally. - this.Nu.sort(((t, e) => t.targetTimeMs - e.targetTimeMs)); - for (const e of this.Nu) if (e.skipDelay(), "all" /* All */ !== t && e.timerId === t) break; - return this.Ku(); - })); - } - /** - * For Tests: Skip all subsequent delays for a timer id. - */ ju(t) { - this.$u.push(t); - } - /** Called once a DelayedOperation is run or canceled. */ Uu(t) { - // NOTE: indexOf / slice are O(n), but delayedOperations is expected to be small. - const e = this.Nu.indexOf(t); - this.Nu.splice(e, 1); - } -} - -function _c(t) { - /** - * Returns true if obj is an object and contains at least one of the specified - * methods. - */ - return function(t, e) { - if ("object" != typeof t || null === t) return !1; - const n = t; - for (const t of e) if (t in n && "function" == typeof n[t]) return !0; - return !1; - } - /** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - /** - * Represents the task of loading a Firestore bundle. It provides progress of bundle - * loading, as well as task completion and error events. - * - * The API is compatible with `Promise`. - */ (t, [ "next", "error", "complete" ]); -} - -class wc { - constructor() { - this._progressObserver = {}, this._taskCompletionResolver = new j, this._lastProgress = { - taskState: "Running", - totalBytes: 0, - totalDocuments: 0, - bytesLoaded: 0, - documentsLoaded: 0 - }; - } - /** - * Registers functions to listen to bundle loading progress events. - * @param next - Called when there is a progress update from bundle loading. Typically `next` calls occur - * each time a Firestore document is loaded from the bundle. - * @param error - Called when an error occurs during bundle loading. The task aborts after reporting the - * error, and there should be no more updates after this. - * @param complete - Called when the loading task is complete. - */ onProgress(t, e, n) { - this._progressObserver = { - next: t, - error: e, - complete: n - }; - } - /** - * Implements the `Promise.catch` interface. - * - * @param onRejected - Called when an error occurs during bundle loading. - */ catch(t) { - return this._taskCompletionResolver.promise.catch(t); - } - /** - * Implements the `Promise.then` interface. - * - * @param onFulfilled - Called on the completion of the loading task with a final `LoadBundleTaskProgress` update. - * The update will always have its `taskState` set to `"Success"`. - * @param onRejected - Called when an error occurs during bundle loading. - */ then(t, e) { - return this._taskCompletionResolver.promise.then(t, e); - } - /** - * Notifies all observers that bundle loading has completed, with a provided - * `LoadBundleTaskProgress` object. - * - * @private - */ _completeWith(t) { - this._updateProgress(t), this._progressObserver.complete && this._progressObserver.complete(), - this._taskCompletionResolver.resolve(t); - } - /** - * Notifies all observers that bundle loading has failed, with a provided - * `Error` as the reason. - * - * @private - */ _failWith(t) { - this._lastProgress.taskState = "Error", this._progressObserver.next && this._progressObserver.next(this._lastProgress), - this._progressObserver.error && this._progressObserver.error(t), this._taskCompletionResolver.reject(t); - } - /** - * Notifies a progress update of loading a bundle. - * @param progress - The new progress. - * - * @private - */ _updateProgress(t) { - this._lastProgress = t, this._progressObserver.next && this._progressObserver.next(t); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** DOMException error code constants. */ const mc = -1; - -/** - * The Cloud Firestore service interface. - * - * Do not call this constructor directly. Instead, use {@link getFirestore}. - */ -class gc extends sc { - /** @hideconstructor */ - constructor(t, e, n) { - super(t, e, n), - /** - * Whether it's a {@link Firestore} or Firestore Lite instance. - */ - this.type = "firestore", this._queue = new dc, this._persistenceKey = "name" in t ? t.name : "[DEFAULT]"; - } - _terminate() { - return this._firestoreClient || - // The client must be initialized to ensure that all subsequent API - // usage throws an exception. - Tc(this), this._firestoreClient.terminate(); - } -} - -/** - * Initializes a new instance of {@link Firestore} with the provided settings. - * Can only be called before any other function, including - * {@link getFirestore}. If the custom settings are empty, this function is - * equivalent to calling {@link getFirestore}. - * - * @param app - The {@link @firebase/app#FirebaseApp} with which the {@link Firestore} instance will - * be associated. - * @param settings - A settings object to configure the {@link Firestore} instance. - * @returns A newly initialized {@link Firestore} instance. - */ function yc(t, e) { - const n = (0,_firebase_app__WEBPACK_IMPORTED_MODULE_0__._getProvider)(t, "firestore"); - if (n.isInitialized()) { - const t = n.getImmediate(), s = n.getOptions(); - if ((0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.deepEqual)(s, e)) return t; - throw new Q(G.FAILED_PRECONDITION, "initializeFirestore() has already been called with different options. To avoid this error, call initializeFirestore() with the same options as when it was originally called, or call getFirestore() to return the already initialized instance."); - } - if (void 0 !== e.cacheSizeBytes && -1 !== e.cacheSizeBytes && e.cacheSizeBytes < 1048576) throw new Q(G.INVALID_ARGUMENT, "cacheSizeBytes must be at least 1048576"); - return n.initialize({ - options: e - }); -} - -/** - * Returns the existing {@link Firestore} instance that is associated with the - * provided {@link @firebase/app#FirebaseApp}. If no instance exists, initializes a new - * instance with default settings. - * - * @param app - The {@link @firebase/app#FirebaseApp} instance that the returned {@link Firestore} - * instance is associated with. - * @returns The {@link Firestore} instance of the provided app. - */ function pc(e = (0,_firebase_app__WEBPACK_IMPORTED_MODULE_0__.getApp)()) { - return (0,_firebase_app__WEBPACK_IMPORTED_MODULE_0__._getProvider)(e, "firestore").getImmediate(); -} - -/** - * @internal - */ function Ic(t) { - return t._firestoreClient || Tc(t), t._firestoreClient.verifyNotTerminated(), t._firestoreClient; -} - -function Tc(t) { - var e; - const n = t._freezeSettings(), s = function(t, e, n, s) { - return new Vt(t, e, n, s.host, s.ssl, s.experimentalForceLongPolling, s.experimentalAutoDetectLongPolling, s.useFetchStreams); - }(t._databaseId, (null === (e = t._app) || void 0 === e ? void 0 : e.options.appId) || "", t._persistenceKey, n); - t._firestoreClient = new vu(t._authCredentials, t._appCheckCredentials, t._queue, s); -} - -/** - * Attempts to enable persistent storage, if possible. - * - * Must be called before any other functions (other than - * {@link initializeFirestore}, {@link getFirestore} or - * {@link clearIndexedDbPersistence}. - * - * If this fails, `enableIndexedDbPersistence()` will reject the promise it - * returns. Note that even after this failure, the {@link Firestore} instance will - * remain usable, however offline persistence will be disabled. - * - * There are several reasons why this can fail, which can be identified by - * the `code` on the error. - * - * * failed-precondition: The app is already open in another browser tab. - * * unimplemented: The browser is incompatible with the offline - * persistence implementation. - * - * @param firestore - The {@link Firestore} instance to enable persistence for. - * @param persistenceSettings - Optional settings object to configure - * persistence. - * @returns A `Promise` that represents successfully enabling persistent storage. - */ function Ec(t, e) { - xc(t = tc(t, gc)); - const n = Ic(t), s = t._freezeSettings(), i = new Eu; - return Rc(n, i, new Iu(i, s.cacheSizeBytes, null == e ? void 0 : e.forceOwnership)); -} - -/** - * Attempts to enable multi-tab persistent storage, if possible. If enabled - * across all tabs, all operations share access to local persistence, including - * shared execution of queries and latency-compensated local document updates - * across all connected instances. - * - * If this fails, `enableMultiTabIndexedDbPersistence()` will reject the promise - * it returns. Note that even after this failure, the {@link Firestore} instance will - * remain usable, however offline persistence will be disabled. - * - * There are several reasons why this can fail, which can be identified by - * the `code` on the error. - * - * * failed-precondition: The app is already open in another browser tab and - * multi-tab is not enabled. - * * unimplemented: The browser is incompatible with the offline - * persistence implementation. - * - * @param firestore - The {@link Firestore} instance to enable persistence for. - * @returns A `Promise` that represents successfully enabling persistent - * storage. - */ function Ac(t) { - xc(t = tc(t, gc)); - const e = Ic(t), n = t._freezeSettings(), s = new Eu; - return Rc(e, s, new Tu(s, n.cacheSizeBytes)); -} - -/** - * Registers both the `OfflineComponentProvider` and `OnlineComponentProvider`. - * If the operation fails with a recoverable error (see - * `canRecoverFromIndexedDbError()` below), the returned Promise is rejected - * but the client remains usable. - */ function Rc(t, e, n) { - const s = new j; - return t.asyncQueue.enqueue((async () => { - try { - await Su(t, n), await Du(t, e), s.resolve(); - } catch (t) { - if (! - /** - * Decides whether the provided error allows us to gracefully disable - * persistence (as opposed to crashing the client). - */ - function(t) { - if ("FirebaseError" === t.name) return t.code === G.FAILED_PRECONDITION || t.code === G.UNIMPLEMENTED; - if ("undefined" != typeof DOMException && t instanceof DOMException) - // There are a few known circumstances where we can open IndexedDb but - // trying to read/write will fail (e.g. quota exceeded). For - // well-understood cases, we attempt to detect these and then gracefully - // fall back to memory persistence. - // NOTE: Rather than continue to add to this list, we could decide to - // always fall back, with the risk that we might accidentally hide errors - // representing actual SDK bugs. - // When the browser is out of quota we could get either quota exceeded - // or an aborted error depending on whether the error happened during - // schema migration. - return 22 === t.code || 20 === t.code || - // Firefox Private Browsing mode disables IndexedDb and returns - // INVALID_STATE for any usage. - 11 === t.code; - return !0; - } - /** - * Clears the persistent storage. This includes pending writes and cached - * documents. - * - * Must be called while the {@link Firestore} instance is not started (after the app is - * terminated or when the app is first initialized). On startup, this function - * must be called before other functions (other than {@link - * initializeFirestore} or {@link getFirestore})). If the {@link Firestore} - * instance is still running, the promise will be rejected with the error code - * of `failed-precondition`. - * - * Note: `clearIndexedDbPersistence()` is primarily intended to help write - * reliable tests that use Cloud Firestore. It uses an efficient mechanism for - * dropping existing data but does not attempt to securely overwrite or - * otherwise make cached data unrecoverable. For applications that are sensitive - * to the disclosure of cached data in between user sessions, we strongly - * recommend not enabling persistence at all. - * - * @param firestore - The {@link Firestore} instance to clear persistence for. - * @returns A `Promise` that is resolved when the persistent storage is - * cleared. Otherwise, the promise is rejected with an error. - */ (t)) throw t; - console.warn("Error enabling offline persistence. Falling back to persistence disabled: " + t), - s.reject(t); - } - })).then((() => s.promise)); -} - -function bc(t) { - if (t._initialized && !t._terminated) throw new Q(G.FAILED_PRECONDITION, "Persistence can only be cleared before a Firestore instance is initialized or after it is terminated."); - const e = new j; - return t._queue.enqueueAndForgetEvenWhileRestricted((async () => { - try { - await async function(t) { - if (!hi.vt()) return Promise.resolve(); - const e = t + "main"; - await hi.delete(e); - }(Lr(t._databaseId, t._persistenceKey)), e.resolve(); - } catch (t) { - e.reject(t); - } - })), e.promise; -} - -/** - * Waits until all currently pending writes for the active user have been - * acknowledged by the backend. - * - * The returned promise resolves immediately if there are no outstanding writes. - * Otherwise, the promise waits for all previously issued writes (including - * those written in a previous app session), but it does not wait for writes - * that were added after the function is called. If you want to wait for - * additional writes, call `waitForPendingWrites()` again. - * - * Any outstanding `waitForPendingWrites()` promises are rejected during user - * changes. - * - * @returns A `Promise` which resolves when all currently pending writes have been - * acknowledged by the backend. - */ function Pc(t) { - return function(t) { - const e = new j; - return t.asyncQueue.enqueueAndForget((async () => Ja(await Ou(t), e))), e.promise; - }(Ic(t = tc(t, gc))); -} - -/** - * Re-enables use of the network for this {@link Firestore} instance after a prior - * call to {@link disableNetwork}. - * - * @returns A `Promise` that is resolved once the network has been enabled. - */ function Vc(t) { - return Fu(Ic(t = tc(t, gc))); -} - -/** - * Disables network usage for this instance. It can be re-enabled via {@link - * enableNetwork}. While the network is disabled, any snapshot listeners, - * `getDoc()` or `getDocs()` calls will return results from cache, and any write - * operations will be queued until the network is restored. - * - * @returns A `Promise` that is resolved once the network has been disabled. - */ function vc(t) { - return Bu(Ic(t = tc(t, gc))); -} - -/** - * Terminates the provided {@link Firestore} instance. - * - * After calling `terminate()` only the `clearIndexedDbPersistence()` function - * may be used. Any other function will throw a `FirestoreError`. - * - * To restart after termination, create a new instance of FirebaseFirestore with - * {@link getFirestore}. - * - * Termination does not cancel any pending writes, and any promises that are - * awaiting a response from the server will not be resolved. If you have - * persistence enabled, the next time you start this instance, it will resume - * sending these writes to the server. - * - * Note: Under normal circumstances, calling `terminate()` is not required. This - * function is useful only when you want to force this instance to release all - * of its resources or in combination with `clearIndexedDbPersistence()` to - * ensure that all local state is destroyed between test runs. - * - * @returns A `Promise` that is resolved when the instance has been successfully - * terminated. - */ function Sc(t) { - return (0,_firebase_app__WEBPACK_IMPORTED_MODULE_0__._removeServiceInstance)(t.app, "firestore"), t._delete(); -} - -/** - * Loads a Firestore bundle into the local cache. - * - * @param firestore - The {@link Firestore} instance to load bundles for. - * @param bundleData - An object representing the bundle to be loaded. Valid - * objects are `ArrayBuffer`, `ReadableStream` or `string`. - * - * @returns A `LoadBundleTask` object, which notifies callers with progress - * updates, and completion or error events. It can be used as a - * `Promise`. - */ function Dc(t, e) { - const n = Ic(t = tc(t, gc)), s = new wc; - return ju(n, t._databaseId, e, s), s; -} - -/** - * Reads a Firestore {@link Query} from local cache, identified by the given - * name. - * - * The named queries are packaged into bundles on the server side (along - * with resulting documents), and loaded to local cache using `loadBundle`. Once - * in local cache, use this method to extract a {@link Query} by name. - * - * @param firestore - The {@link Firestore} instance to read the query from. - * @param name - The name of the query. - * @returns A `Promise` that is resolved with the Query or `null`. - */ function Cc(t, e) { - return Wu(Ic(t = tc(t, gc)), e).then((e => e ? new oc(t, null, e.query) : null)); -} - -function xc(t) { - if (t._initialized || t._terminated) throw new Q(G.FAILED_PRECONDITION, "Firestore has already been started and persistence can no longer be enabled. You can only enable persistence before calling any other methods on a Firestore object."); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A `FieldPath` refers to a field in a document. The path may consist of a - * single field name (referring to a top-level field in the document), or a - * list of field names (referring to a nested field in the document). - * - * Create a `FieldPath` by providing field names. If more than one field - * name is provided, the path will point to a nested field in a document. - */ -class Nc { - /** - * Creates a `FieldPath` from the provided field names. If more than one field - * name is provided, the path will point to a nested field in a document. - * - * @param fieldNames - A list of field names. - */ - constructor(...t) { - for (let e = 0; e < t.length; ++e) if (0 === t[e].length) throw new Q(G.INVALID_ARGUMENT, "Invalid field name at argument $(i + 1). Field names must not be empty."); - this._internalPath = new mt(t); - } - /** - * Returns true if this `FieldPath` is equal to the provided one. - * - * @param other - The `FieldPath` to compare against. - * @returns true if this `FieldPath` is equal to the provided one. - */ isEqual(t) { - return this._internalPath.isEqual(t._internalPath); - } -} - -/** - * Returns a special sentinel `FieldPath` to refer to the ID of a document. - * It can be used in queries to sort or filter by the document ID. - */ function kc() { - return new Nc("__name__"); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * An immutable object representing an array of bytes. - */ class Mc { - /** @hideconstructor */ - constructor(t) { - this._byteString = t; - } - /** - * Creates a new `Bytes` object from the given Base64 string, converting it to - * bytes. - * - * @param base64 - The Base64 string used to create the `Bytes` object. - */ static fromBase64String(t) { - try { - return new Mc(pt.fromBase64String(t)); - } catch (t) { - throw new Q(G.INVALID_ARGUMENT, "Failed to construct data from Base64 string: " + t); - } - } - /** - * Creates a new `Bytes` object from the given Uint8Array. - * - * @param array - The Uint8Array used to create the `Bytes` object. - */ static fromUint8Array(t) { - return new Mc(pt.fromUint8Array(t)); - } - /** - * Returns the underlying bytes as a Base64-encoded string. - * - * @returns The Base64-encoded string created from the `Bytes` object. - */ toBase64() { - return this._byteString.toBase64(); - } - /** - * Returns the underlying bytes in a new `Uint8Array`. - * - * @returns The Uint8Array created from the `Bytes` object. - */ toUint8Array() { - return this._byteString.toUint8Array(); - } - /** - * Returns a string representation of the `Bytes` object. - * - * @returns A string representation of the `Bytes` object. - */ toString() { - return "Bytes(base64: " + this.toBase64() + ")"; - } - /** - * Returns true if this `Bytes` object is equal to the provided one. - * - * @param other - The `Bytes` object to compare against. - * @returns true if this `Bytes` object is equal to the provided one. - */ isEqual(t) { - return this._byteString.isEqual(t._byteString); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Sentinel values that can be used when writing document fields with `set()` - * or `update()`. - */ class Oc { - /** - * @param _methodName - The public API endpoint that returns this class. - * @hideconstructor - */ - constructor(t) { - this._methodName = t; - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * An immutable object representing a geographic location in Firestore. The - * location is represented as latitude/longitude pair. - * - * Latitude values are in the range of [-90, 90]. - * Longitude values are in the range of [-180, 180]. - */ class $c { - /** - * Creates a new immutable `GeoPoint` object with the provided latitude and - * longitude values. - * @param latitude - The latitude as number between -90 and 90. - * @param longitude - The longitude as number between -180 and 180. - */ - constructor(t, e) { - if (!isFinite(t) || t < -90 || t > 90) throw new Q(G.INVALID_ARGUMENT, "Latitude must be a number between -90 and 90, but was: " + t); - if (!isFinite(e) || e < -180 || e > 180) throw new Q(G.INVALID_ARGUMENT, "Longitude must be a number between -180 and 180, but was: " + e); - this._lat = t, this._long = e; - } - /** - * The latitude of this `GeoPoint` instance. - */ get latitude() { - return this._lat; - } - /** - * The longitude of this `GeoPoint` instance. - */ get longitude() { - return this._long; - } - /** - * Returns true if this `GeoPoint` is equal to the provided one. - * - * @param other - The `GeoPoint` to compare against. - * @returns true if this `GeoPoint` is equal to the provided one. - */ isEqual(t) { - return this._lat === t._lat && this._long === t._long; - } - /** Returns a JSON-serializable representation of this GeoPoint. */ toJSON() { - return { - latitude: this._lat, - longitude: this._long - }; - } - /** - * Actually private to JS consumers of our API, so this function is prefixed - * with an underscore. - */ _compareTo(t) { - return rt(this._lat, t._lat) || rt(this._long, t._long); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ const Fc = /^__.*__$/; - -/** The result of parsing document data (e.g. for a setData call). */ class Bc { - constructor(t, e, n) { - this.data = t, this.fieldMask = e, this.fieldTransforms = n; - } - toMutation(t, e) { - return null !== this.fieldMask ? new pn(t, this.data, this.fieldMask, e, this.fieldTransforms) : new yn(t, this.data, e, this.fieldTransforms); - } -} - -/** The result of parsing "update" data (i.e. for an updateData call). */ class Lc { - constructor(t, - // The fieldMask does not include document transforms. - e, n) { - this.data = t, this.fieldMask = e, this.fieldTransforms = n; - } - toMutation(t, e) { - return new pn(t, this.data, this.fieldMask, e, this.fieldTransforms); - } -} - -function qc(t) { - switch (t) { - case 0 /* Set */ : - // fall through - case 2 /* MergeSet */ : - // fall through - case 1 /* Update */ : - return !0; - - case 3 /* Argument */ : - case 4 /* ArrayArgument */ : - return !1; - - default: - throw L(); - } -} - -/** A "context" object passed around while parsing user data. */ class Uc { - /** - * Initializes a ParseContext with the given source and path. - * - * @param settings - The settings for the parser. - * @param databaseId - The database ID of the Firestore instance. - * @param serializer - The serializer to use to generate the Value proto. - * @param ignoreUndefinedProperties - Whether to ignore undefined properties - * rather than throw. - * @param fieldTransforms - A mutable list of field transforms encountered - * while parsing the data. - * @param fieldMask - A mutable list of field paths encountered while parsing - * the data. - * - * TODO(b/34871131): We don't support array paths right now, so path can be - * null to indicate the context represents any location within an array (in - * which case certain features will not work and errors will be somewhat - * compromised). - */ - constructor(t, e, n, s, i, r) { - this.settings = t, this.databaseId = e, this.M = n, this.ignoreUndefinedProperties = s, - // Minor hack: If fieldTransforms is undefined, we assume this is an - // external call and we need to validate the entire path. - void 0 === i && this.Wu(), this.fieldTransforms = i || [], this.fieldMask = r || []; - } - get path() { - return this.settings.path; - } - get zu() { - return this.settings.zu; - } - /** Returns a new context with the specified settings overwritten. */ Hu(t) { - return new Uc(Object.assign(Object.assign({}, this.settings), t), this.databaseId, this.M, this.ignoreUndefinedProperties, this.fieldTransforms, this.fieldMask); - } - Ju(t) { - var e; - const n = null === (e = this.path) || void 0 === e ? void 0 : e.child(t), s = this.Hu({ - path: n, - Yu: !1 - }); - return s.Xu(t), s; - } - Zu(t) { - var e; - const n = null === (e = this.path) || void 0 === e ? void 0 : e.child(t), s = this.Hu({ - path: n, - Yu: !1 - }); - return s.Wu(), s; - } - tc(t) { - // TODO(b/34871131): We don't support array paths right now; so make path - // undefined. - return this.Hu({ - path: void 0, - Yu: !0 - }); - } - ec(t) { - return uh(t, this.settings.methodName, this.settings.nc || !1, this.path, this.settings.sc); - } - /** Returns 'true' if 'fieldPath' was traversed when creating this context. */ contains(t) { - return void 0 !== this.fieldMask.find((e => t.isPrefixOf(e))) || void 0 !== this.fieldTransforms.find((e => t.isPrefixOf(e.field))); - } - Wu() { - // TODO(b/34871131): Remove null check once we have proper paths for fields - // within arrays. - if (this.path) for (let t = 0; t < this.path.length; t++) this.Xu(this.path.get(t)); - } - Xu(t) { - if (0 === t.length) throw this.ec("Document fields must not be empty"); - if (qc(this.zu) && Fc.test(t)) throw this.ec('Document fields cannot begin and end with "__"'); - } -} - -/** - * Helper for parsing raw user input (provided via the API) into internal model - * classes. - */ class Kc { - constructor(t, e, n) { - this.databaseId = t, this.ignoreUndefinedProperties = e, this.M = n || Oo(t); - } - /** Creates a new top-level parse context. */ ic(t, e, n, s = !1) { - return new Uc({ - zu: t, - methodName: e, - sc: n, - path: mt.emptyPath(), - Yu: !1, - nc: s - }, this.databaseId, this.M, this.ignoreUndefinedProperties); - } -} - -function Gc(t) { - const e = t._freezeSettings(), n = Oo(t._databaseId); - return new Kc(t._databaseId, !!e.ignoreUndefinedProperties, n); -} - -/** Parse document data from a set() call. */ function Qc(t, e, n, s, i, r = {}) { - const o = t.ic(r.merge || r.mergeFields ? 2 /* MergeSet */ : 0 /* Set */ , e, n, i); - ih("Data must be an object, but it was:", o, s); - const a = nh(s, o); - let u, c; - if (r.merge) u = new gt(o.fieldMask), c = o.fieldTransforms; else if (r.mergeFields) { - const t = []; - for (const s of r.mergeFields) { - const i = rh(e, s, n); - if (!o.contains(i)) throw new Q(G.INVALID_ARGUMENT, `Field '${i}' is specified in your field mask but missing from your input data.`); - ch(t, i) || t.push(i); - } - u = new gt(t), c = o.fieldTransforms.filter((t => u.covers(t.field))); - } else u = null, c = o.fieldTransforms; - return new Bc(new Xt(a), u, c); -} - -class jc extends Oc { - _toFieldTransform(t) { - if (2 /* MergeSet */ !== t.zu) throw 1 /* Update */ === t.zu ? t.ec(`${this._methodName}() can only appear at the top level of your update data`) : t.ec(`${this._methodName}() cannot be used with set() unless you pass {merge:true}`); - // No transform to add for a delete, but we need to add it to our - // fieldMask so it gets deleted. - return t.fieldMask.push(t.path), null; - } - isEqual(t) { - return t instanceof jc; - } -} - -/** - * Creates a child context for parsing SerializableFieldValues. - * - * This is different than calling `ParseContext.contextWith` because it keeps - * the fieldTransforms and fieldMask separate. - * - * The created context has its `dataSource` set to `UserDataSource.Argument`. - * Although these values are used with writes, any elements in these FieldValues - * are not considered writes since they cannot contain any FieldValue sentinels, - * etc. - * - * @param fieldValue - The sentinel FieldValue for which to create a child - * context. - * @param context - The parent context. - * @param arrayElement - Whether or not the FieldValue has an array. - */ function Wc(t, e, n) { - return new Uc({ - zu: 3 /* Argument */ , - sc: e.settings.sc, - methodName: t._methodName, - Yu: n - }, e.databaseId, e.M, e.ignoreUndefinedProperties); -} - -class zc extends Oc { - _toFieldTransform(t) { - return new an(t.path, new Xe); - } - isEqual(t) { - return t instanceof zc; - } -} - -class Hc extends Oc { - constructor(t, e) { - super(t), this.rc = e; - } - _toFieldTransform(t) { - const e = Wc(this, t, - /*array=*/ !0), n = this.rc.map((t => eh(t, e))), s = new Ze(n); - return new an(t.path, s); - } - isEqual(t) { - // TODO(mrschmidt): Implement isEquals - return this === t; - } -} - -class Jc extends Oc { - constructor(t, e) { - super(t), this.rc = e; - } - _toFieldTransform(t) { - const e = Wc(this, t, - /*array=*/ !0), n = this.rc.map((t => eh(t, e))), s = new en(n); - return new an(t.path, s); - } - isEqual(t) { - // TODO(mrschmidt): Implement isEquals - return this === t; - } -} - -class Yc extends Oc { - constructor(t, e) { - super(t), this.oc = e; - } - _toFieldTransform(t) { - const e = new sn(t.M, We(t.M, this.oc)); - return new an(t.path, e); - } - isEqual(t) { - // TODO(mrschmidt): Implement isEquals - return this === t; - } -} - -/** Parse update data from an update() call. */ function Xc(t, e, n, s) { - const i = t.ic(1 /* Update */ , e, n); - ih("Data must be an object, but it was:", i, s); - const r = [], o = Xt.empty(); - lt(s, ((t, s) => { - const a = ah(e, t, n); - // For Compat types, we have to "extract" the underlying types before - // performing validation. - s = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(s); - const u = i.Zu(a); - if (s instanceof jc) - // Add it to the field mask, but don't add anything to updateData. - r.push(a); else { - const t = eh(s, u); - null != t && (r.push(a), o.set(a, t)); - } - })); - const a = new gt(r); - return new Lc(o, a, i.fieldTransforms); -} - -/** Parse update data from a list of field/value arguments. */ function Zc(t, e, n, s, i, r) { - const o = t.ic(1 /* Update */ , e, n), a = [ rh(e, s, n) ], u = [ i ]; - if (r.length % 2 != 0) throw new Q(G.INVALID_ARGUMENT, `Function ${e}() needs to be called with an even number of arguments that alternate between field names and values.`); - for (let t = 0; t < r.length; t += 2) a.push(rh(e, r[t])), u.push(r[t + 1]); - const c = [], h = Xt.empty(); - // We iterate in reverse order to pick the last value for a field if the - // user specified the field multiple times. - for (let t = a.length - 1; t >= 0; --t) if (!ch(c, a[t])) { - const e = a[t]; - let n = u[t]; - // For Compat types, we have to "extract" the underlying types before - // performing validation. - n = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(n); - const s = o.Zu(e); - if (n instanceof jc) - // Add it to the field mask, but don't add anything to updateData. - c.push(e); else { - const t = eh(n, s); - null != t && (c.push(e), h.set(e, t)); - } - } - const l = new gt(c); - return new Lc(h, l, o.fieldTransforms); -} - -/** - * Parse a "query value" (e.g. value in a where filter or a value in a cursor - * bound). - * - * @param allowArrays - Whether the query value is an array that may directly - * contain additional arrays (e.g. the operand of an `in` query). - */ function th(t, e, n, s = !1) { - return eh(n, t.ic(s ? 4 /* ArrayArgument */ : 3 /* Argument */ , e)); -} - -/** - * Parses user data to Protobuf Values. - * - * @param input - Data to be parsed. - * @param context - A context object representing the current path being parsed, - * the source of the data being parsed, etc. - * @returns The parsed value, or null if the value was a FieldValue sentinel - * that should not be included in the resulting parsed data. - */ function eh(t, e) { - if (sh( - // Unwrap the API type from the Compat SDK. This will return the API type - // from firestore-exp. - t = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(t))) return ih("Unsupported field value:", e, t), nh(t, e); - if (t instanceof Oc) - // FieldValues usually parse into transforms (except deleteField()) - // in which case we do not want to include this field in our parsed data - // (as doing so will overwrite the field directly prior to the transform - // trying to transform it). So we don't add this location to - // context.fieldMask and we return null as our parsing result. - /** - * "Parses" the provided FieldValueImpl, adding any necessary transforms to - * context.fieldTransforms. - */ - return function(t, e) { - // Sentinels are only supported with writes, and not within arrays. - if (!qc(e.zu)) throw e.ec(`${t._methodName}() can only be used with update() and set()`); - if (!e.path) throw e.ec(`${t._methodName}() is not currently supported inside arrays`); - const n = t._toFieldTransform(e); - n && e.fieldTransforms.push(n); - } - /** - * Helper to parse a scalar value (i.e. not an Object, Array, or FieldValue) - * - * @returns The parsed value - */ (t, e), null; - if (void 0 === t && e.ignoreUndefinedProperties) - // If the input is undefined it can never participate in the fieldMask, so - // don't handle this below. If `ignoreUndefinedProperties` is false, - // `parseScalarValue` will reject an undefined value. - return null; - if ( - // If context.path is null we are inside an array and we don't support - // field mask paths more granular than the top-level array. - e.path && e.fieldMask.push(e.path), t instanceof Array) { - // TODO(b/34871131): Include the path containing the array in the error - // message. - // In the case of IN queries, the parsed data is an array (representing - // the set of values to be included for the IN query) that may directly - // contain additional arrays (each representing an individual field - // value), so we disable this validation. - if (e.settings.Yu && 4 /* ArrayArgument */ !== e.zu) throw e.ec("Nested arrays are not supported"); - return function(t, e) { - const n = []; - let s = 0; - for (const i of t) { - let t = eh(i, e.tc(s)); - null == t && ( - // Just include nulls in the array for fields being replaced with a - // sentinel. - t = { - nullValue: "NULL_VALUE" - }), n.push(t), s++; - } - return { - arrayValue: { - values: n - } - }; - }(t, e); - } - return function(t, e) { - if (null === (t = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(t))) return { - nullValue: "NULL_VALUE" - }; - if ("number" == typeof t) return We(e.M, t); - if ("boolean" == typeof t) return { - booleanValue: t - }; - if ("string" == typeof t) return { - stringValue: t - }; - if (t instanceof Date) { - const n = ut.fromDate(t); - return { - timestampValue: rs(e.M, n) - }; - } - if (t instanceof ut) { - // Firestore backend truncates precision down to microseconds. To ensure - // offline mode works the same with regards to truncation, perform the - // truncation immediately without waiting for the backend to do that. - const n = new ut(t.seconds, 1e3 * Math.floor(t.nanoseconds / 1e3)); - return { - timestampValue: rs(e.M, n) - }; - } - if (t instanceof $c) return { - geoPointValue: { - latitude: t.latitude, - longitude: t.longitude - } - }; - if (t instanceof Mc) return { - bytesValue: os(e.M, t._byteString) - }; - if (t instanceof rc) { - const n = e.databaseId, s = t.firestore._databaseId; - if (!s.isEqual(n)) throw e.ec(`Document reference is for database ${s.projectId}/${s.database} but should be for database ${n.projectId}/${n.database}`); - return { - referenceValue: cs(t.firestore._databaseId || e.databaseId, t._key.path) - }; - } - throw e.ec(`Unsupported field value: ${Zu(t)}`); - } - /** - * Checks whether an object looks like a JSON object that should be converted - * into a struct. Normal class/prototype instances are considered to look like - * JSON objects since they should be converted to a struct value. Arrays, Dates, - * GeoPoints, etc. are not considered to look like JSON objects since they map - * to specific FieldValue types other than ObjectValue. - */ (t, e); -} - -function nh(t, e) { - const n = {}; - return ft(t) ? - // If we encounter an empty object, we explicitly add it to the update - // mask to ensure that the server creates a map entry. - e.path && e.path.length > 0 && e.fieldMask.push(e.path) : lt(t, ((t, s) => { - const i = eh(s, e.Ju(t)); - null != i && (n[t] = i); - })), { - mapValue: { - fields: n - } - }; -} - -function sh(t) { - return !("object" != typeof t || null === t || t instanceof Array || t instanceof Date || t instanceof ut || t instanceof $c || t instanceof Mc || t instanceof rc || t instanceof Oc); -} - -function ih(t, e, n) { - if (!sh(n) || !function(t) { - return "object" == typeof t && null !== t && (Object.getPrototypeOf(t) === Object.prototype || null === Object.getPrototypeOf(t)); - }(n)) { - const s = Zu(n); - throw "an object" === s ? e.ec(t + " a custom object") : e.ec(t + " " + s); - } -} - -/** - * Helper that calls fromDotSeparatedString() but wraps any error thrown. - */ function rh(t, e, n) { - if (( - // If required, replace the FieldPath Compat class with with the firestore-exp - // FieldPath. - e = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(e)) instanceof Nc) return e._internalPath; - if ("string" == typeof e) return ah(t, e); - throw uh("Field path arguments must be of type string or ", t, - /* hasConverter= */ !1, - /* path= */ void 0, n); -} - -/** - * Matches any characters in a field path string that are reserved. - */ const oh = new RegExp("[~\\*/\\[\\]]"); - -/** - * Wraps fromDotSeparatedString with an error message about the method that - * was thrown. - * @param methodName - The publicly visible method name - * @param path - The dot-separated string form of a field path which will be - * split on dots. - * @param targetDoc - The document against which the field path will be - * evaluated. - */ function ah(t, e, n) { - if (e.search(oh) >= 0) throw uh(`Invalid field path (${e}). Paths must not contain '~', '*', '/', '[', or ']'`, t, - /* hasConverter= */ !1, - /* path= */ void 0, n); - try { - return new Nc(...e.split("."))._internalPath; - } catch (s) { - throw uh(`Invalid field path (${e}). Paths must not be empty, begin with '.', end with '.', or contain '..'`, t, - /* hasConverter= */ !1, - /* path= */ void 0, n); - } -} - -function uh(t, e, n, s, i) { - const r = s && !s.isEmpty(), o = void 0 !== i; - let a = `Function ${e}() called with invalid data`; - n && (a += " (via `toFirestore()`)"), a += ". "; - let u = ""; - return (r || o) && (u += " (found", r && (u += ` in field ${s}`), o && (u += ` in document ${i}`), - u += ")"), new Q(G.INVALID_ARGUMENT, a + t + u); -} - -/** Checks `haystack` if FieldPath `needle` is present. Runs in O(n). */ function ch(t, e) { - return t.some((t => t.isEqual(e))); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A `DocumentSnapshot` contains data read from a document in your Firestore - * database. The data can be extracted with `.data()` or `.get()` to - * get a specific field. - * - * For a `DocumentSnapshot` that points to a non-existing document, any data - * access will return 'undefined'. You can use the `exists()` method to - * explicitly verify a document's existence. - */ class hh { - // Note: This class is stripped down version of the DocumentSnapshot in - // the legacy SDK. The changes are: - // - No support for SnapshotMetadata. - // - No support for SnapshotOptions. - /** @hideconstructor protected */ - constructor(t, e, n, s, i) { - this._firestore = t, this._userDataWriter = e, this._key = n, this._document = s, - this._converter = i; - } - /** Property of the `DocumentSnapshot` that provides the document's ID. */ get id() { - return this._key.path.lastSegment(); - } - /** - * The `DocumentReference` for the document included in the `DocumentSnapshot`. - */ get ref() { - return new rc(this._firestore, this._converter, this._key); - } - /** - * Signals whether or not the document at the snapshot's location exists. - * - * @returns true if the document exists. - */ exists() { - return null !== this._document; - } - /** - * Retrieves all fields in the document as an `Object`. Returns `undefined` if - * the document doesn't exist. - * - * @returns An `Object` containing all fields in the document or `undefined` - * if the document doesn't exist. - */ data() { - if (this._document) { - if (this._converter) { - // We only want to use the converter and create a new DocumentSnapshot - // if a converter has been provided. - const t = new lh(this._firestore, this._userDataWriter, this._key, this._document, - /* converter= */ null); - return this._converter.fromFirestore(t); - } - return this._userDataWriter.convertValue(this._document.data.value); - } - } - /** - * Retrieves the field specified by `fieldPath`. Returns `undefined` if the - * document or field doesn't exist. - * - * @param fieldPath - The path (for example 'foo' or 'foo.bar') to a specific - * field. - * @returns The data at the specified field location or undefined if no such - * field exists in the document. - */ - // We are using `any` here to avoid an explicit cast by our users. - // eslint-disable-next-line @typescript-eslint/no-explicit-any - get(t) { - if (this._document) { - const e = this._document.data.field(fh("DocumentSnapshot.get", t)); - if (null !== e) return this._userDataWriter.convertValue(e); - } - } -} - -/** - * A `QueryDocumentSnapshot` contains data read from a document in your - * Firestore database as part of a query. The document is guaranteed to exist - * and its data can be extracted with `.data()` or `.get()` to get a - * specific field. - * - * A `QueryDocumentSnapshot` offers the same API surface as a - * `DocumentSnapshot`. Since query results contain only existing documents, the - * `exists` property will always be true and `data()` will never return - * 'undefined'. - */ class lh extends hh { - /** - * Retrieves all fields in the document as an `Object`. - * - * @override - * @returns An `Object` containing all fields in the document. - */ - data() { - return super.data(); - } -} - -/** - * Helper that calls `fromDotSeparatedString()` but wraps any error thrown. - */ function fh(t, e) { - return "string" == typeof e ? ah(t, e) : e instanceof Nc ? e._internalPath : e._delegate._internalPath; -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Metadata about a snapshot, describing the state of the snapshot. - */ class dh { - /** @hideconstructor */ - constructor(t, e) { - this.hasPendingWrites = t, this.fromCache = e; - } - /** - * Returns true if this `SnapshotMetadata` is equal to the provided one. - * - * @param other - The `SnapshotMetadata` to compare against. - * @returns true if this `SnapshotMetadata` is equal to the provided one. - */ isEqual(t) { - return this.hasPendingWrites === t.hasPendingWrites && this.fromCache === t.fromCache; - } -} - -/** - * A `DocumentSnapshot` contains data read from a document in your Firestore - * database. The data can be extracted with `.data()` or `.get()` to - * get a specific field. - * - * For a `DocumentSnapshot` that points to a non-existing document, any data - * access will return 'undefined'. You can use the `exists()` method to - * explicitly verify a document's existence. - */ class _h extends hh { - /** @hideconstructor protected */ - constructor(t, e, n, s, i, r) { - super(t, e, n, s, r), this._firestore = t, this._firestoreImpl = t, this.metadata = i; - } - /** - * Returns whether or not the data exists. True if the document exists. - */ exists() { - return super.exists(); - } - /** - * Retrieves all fields in the document as an `Object`. Returns `undefined` if - * the document doesn't exist. - * - * By default, `serverTimestamp()` values that have not yet been - * set to their final value will be returned as `null`. You can override - * this by passing an options object. - * - * @param options - An options object to configure how data is retrieved from - * the snapshot (for example the desired behavior for server timestamps that - * have not yet been set to their final value). - * @returns An `Object` containing all fields in the document or `undefined` if - * the document doesn't exist. - */ data(t = {}) { - if (this._document) { - if (this._converter) { - // We only want to use the converter and create a new DocumentSnapshot - // if a converter has been provided. - const e = new wh(this._firestore, this._userDataWriter, this._key, this._document, this.metadata, - /* converter= */ null); - return this._converter.fromFirestore(e, t); - } - return this._userDataWriter.convertValue(this._document.data.value, t.serverTimestamps); - } - } - /** - * Retrieves the field specified by `fieldPath`. Returns `undefined` if the - * document or field doesn't exist. - * - * By default, a `serverTimestamp()` that has not yet been set to - * its final value will be returned as `null`. You can override this by - * passing an options object. - * - * @param fieldPath - The path (for example 'foo' or 'foo.bar') to a specific - * field. - * @param options - An options object to configure how the field is retrieved - * from the snapshot (for example the desired behavior for server timestamps - * that have not yet been set to their final value). - * @returns The data at the specified field location or undefined if no such - * field exists in the document. - */ - // We are using `any` here to avoid an explicit cast by our users. - // eslint-disable-next-line @typescript-eslint/no-explicit-any - get(t, e = {}) { - if (this._document) { - const n = this._document.data.field(fh("DocumentSnapshot.get", t)); - if (null !== n) return this._userDataWriter.convertValue(n, e.serverTimestamps); - } - } -} - -/** - * A `QueryDocumentSnapshot` contains data read from a document in your - * Firestore database as part of a query. The document is guaranteed to exist - * and its data can be extracted with `.data()` or `.get()` to get a - * specific field. - * - * A `QueryDocumentSnapshot` offers the same API surface as a - * `DocumentSnapshot`. Since query results contain only existing documents, the - * `exists` property will always be true and `data()` will never return - * 'undefined'. - */ class wh extends _h { - /** - * Retrieves all fields in the document as an `Object`. - * - * By default, `serverTimestamp()` values that have not yet been - * set to their final value will be returned as `null`. You can override - * this by passing an options object. - * - * @override - * @param options - An options object to configure how data is retrieved from - * the snapshot (for example the desired behavior for server timestamps that - * have not yet been set to their final value). - * @returns An `Object` containing all fields in the document. - */ - data(t = {}) { - return super.data(t); - } -} - -/** - * A `QuerySnapshot` contains zero or more `DocumentSnapshot` objects - * representing the results of a query. The documents can be accessed as an - * array via the `docs` property or enumerated using the `forEach` method. The - * number of documents can be determined via the `empty` and `size` - * properties. - */ class mh { - /** @hideconstructor */ - constructor(t, e, n, s) { - this._firestore = t, this._userDataWriter = e, this._snapshot = s, this.metadata = new dh(s.hasPendingWrites, s.fromCache), - this.query = n; - } - /** An array of all the documents in the `QuerySnapshot`. */ get docs() { - const t = []; - return this.forEach((e => t.push(e))), t; - } - /** The number of documents in the `QuerySnapshot`. */ get size() { - return this._snapshot.docs.size; - } - /** True if there are no documents in the `QuerySnapshot`. */ get empty() { - return 0 === this.size; - } - /** - * Enumerates all of the documents in the `QuerySnapshot`. - * - * @param callback - A callback to be called with a `QueryDocumentSnapshot` for - * each document in the snapshot. - * @param thisArg - The `this` binding for the callback. - */ forEach(t, e) { - this._snapshot.docs.forEach((n => { - t.call(e, new wh(this._firestore, this._userDataWriter, n.key, n, new dh(this._snapshot.mutatedKeys.has(n.key), this._snapshot.fromCache), this.query.converter)); - })); - } - /** - * Returns an array of the documents changes since the last snapshot. If this - * is the first snapshot, all documents will be in the list as 'added' - * changes. - * - * @param options - `SnapshotListenOptions` that control whether metadata-only - * changes (i.e. only `DocumentSnapshot.metadata` changed) should trigger - * snapshot events. - */ docChanges(t = {}) { - const e = !!t.includeMetadataChanges; - if (e && this._snapshot.excludesMetadataChanges) throw new Q(G.INVALID_ARGUMENT, "To include metadata changes with your document changes, you must also pass { includeMetadataChanges:true } to onSnapshot()."); - return this._cachedChanges && this._cachedChangesIncludeMetadataChanges === e || (this._cachedChanges = - /** Calculates the array of `DocumentChange`s for a given `ViewSnapshot`. */ - function(t, e) { - if (t._snapshot.oldDocs.isEmpty()) { - let e = 0; - return t._snapshot.docChanges.map((n => ({ - type: "added", - doc: new wh(t._firestore, t._userDataWriter, n.doc.key, n.doc, new dh(t._snapshot.mutatedKeys.has(n.doc.key), t._snapshot.fromCache), t.query.converter), - oldIndex: -1, - newIndex: e++ - }))); - } - { - // A `DocumentSet` that is updated incrementally as changes are applied to use - // to lookup the index of a document. - let n = t._snapshot.oldDocs; - return t._snapshot.docChanges.filter((t => e || 3 /* Metadata */ !== t.type)).map((e => { - const s = new wh(t._firestore, t._userDataWriter, e.doc.key, e.doc, new dh(t._snapshot.mutatedKeys.has(e.doc.key), t._snapshot.fromCache), t.query.converter); - let i = -1, r = -1; - return 0 /* Added */ !== e.type && (i = n.indexOf(e.doc.key), n = n.delete(e.doc.key)), - 1 /* Removed */ !== e.type && (n = n.add(e.doc), r = n.indexOf(e.doc.key)), { - type: gh(e.type), - doc: s, - oldIndex: i, - newIndex: r - }; - })); - } - }(this, e), this._cachedChangesIncludeMetadataChanges = e), this._cachedChanges; - } -} - -function gh(t) { - switch (t) { - case 0 /* Added */ : - return "added"; - - case 2 /* Modified */ : - case 3 /* Metadata */ : - return "modified"; - - case 1 /* Removed */ : - return "removed"; - - default: - return L(); - } -} - -// TODO(firestoreexp): Add tests for snapshotEqual with different snapshot -// metadata -/** - * Returns true if the provided snapshots are equal. - * - * @param left - A snapshot to compare. - * @param right - A snapshot to compare. - * @returns true if the snapshots are equal. - */ function yh(t, e) { - return t instanceof _h && e instanceof _h ? t._firestore === e._firestore && t._key.isEqual(e._key) && (null === t._document ? null === e._document : t._document.isEqual(e._document)) && t._converter === e._converter : t instanceof mh && e instanceof mh && (t._firestore === e._firestore && fc(t.query, e.query) && t.metadata.isEqual(e.metadata) && t._snapshot.isEqual(e._snapshot)); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ function ph(t) { - if (xe(t) && 0 === t.explicitOrderBy.length) throw new Q(G.UNIMPLEMENTED, "limitToLast() queries require specifying at least one orderBy() clause"); -} - -/** - * A `QueryConstraint` is used to narrow the set of documents returned by a - * Firestore query. `QueryConstraint`s are created by invoking {@link where}, - * {@link orderBy}, {@link (startAt:1)}, {@link (startAfter:1)}, {@link - * endBefore:1}, {@link (endAt:1)}, {@link limit} or {@link limitToLast} and - * can then be passed to {@link query} to create a new query instance that - * also contains this `QueryConstraint`. - */ class Ih {} - -/** - * Creates a new immutable instance of {@link Query} that is extended to also include - * additional query constraints. - * - * @param query - The {@link Query} instance to use as a base for the new constraints. - * @param queryConstraints - The list of {@link QueryConstraint}s to apply. - * @throws if any of the provided query constraints cannot be combined with the - * existing or new constraints. - */ function Th(t, ...e) { - for (const n of e) t = n._apply(t); - return t; -} - -class Eh extends Ih { - constructor(t, e, n) { - super(), this.ac = t, this.uc = e, this.cc = n, this.type = "where"; - } - _apply(t) { - const e = Gc(t.firestore), n = function(t, e, n, s, i, r, o) { - let a; - if (i.isKeyField()) { - if ("array-contains" /* ARRAY_CONTAINS */ === r || "array-contains-any" /* ARRAY_CONTAINS_ANY */ === r) throw new Q(G.INVALID_ARGUMENT, `Invalid Query. You can't perform '${r}' queries on documentId().`); - if ("in" /* IN */ === r || "not-in" /* NOT_IN */ === r) { - $h(o, r); - const e = []; - for (const n of o) e.push(Oh(s, t, n)); - a = { - arrayValue: { - values: e - } - }; - } else a = Oh(s, t, o); - } else "in" /* IN */ !== r && "not-in" /* NOT_IN */ !== r && "array-contains-any" /* ARRAY_CONTAINS_ANY */ !== r || $h(o, r), - a = th(n, e, o, - /* allowArrays= */ "in" /* IN */ === r || "not-in" /* NOT_IN */ === r); - const u = _e.create(i, r, a); - return function(t, e) { - if (e.S()) { - const n = ke(t); - if (null !== n && !n.isEqual(e.field)) throw new Q(G.INVALID_ARGUMENT, `Invalid query. All where filters with an inequality (<, <=, !=, not-in, >, or >=) must be on the same field. But you have inequality filters on '${n.toString()}' and '${e.field.toString()}'`); - const s = Ne(t); - null !== s && Fh(t, e.field, s); - } - const n = function(t, e) { - for (const n of t.filters) if (e.indexOf(n.op) >= 0) return n.op; - return null; - }(t, - /** - * Given an operator, returns the set of operators that cannot be used with it. - * - * Operators in a query must adhere to the following set of rules: - * 1. Only one array operator is allowed. - * 2. Only one disjunctive operator is allowed. - * 3. `NOT_EQUAL` cannot be used with another `NOT_EQUAL` operator. - * 4. `NOT_IN` cannot be used with array, disjunctive, or `NOT_EQUAL` operators. - * - * Array operators: `ARRAY_CONTAINS`, `ARRAY_CONTAINS_ANY` - * Disjunctive operators: `IN`, `ARRAY_CONTAINS_ANY`, `NOT_IN` - */ - function(t) { - switch (t) { - case "!=" /* NOT_EQUAL */ : - return [ "!=" /* NOT_EQUAL */ , "not-in" /* NOT_IN */ ]; - - case "array-contains" /* ARRAY_CONTAINS */ : - return [ "array-contains" /* ARRAY_CONTAINS */ , "array-contains-any" /* ARRAY_CONTAINS_ANY */ , "not-in" /* NOT_IN */ ]; - - case "in" /* IN */ : - return [ "array-contains-any" /* ARRAY_CONTAINS_ANY */ , "in" /* IN */ , "not-in" /* NOT_IN */ ]; - - case "array-contains-any" /* ARRAY_CONTAINS_ANY */ : - return [ "array-contains" /* ARRAY_CONTAINS */ , "array-contains-any" /* ARRAY_CONTAINS_ANY */ , "in" /* IN */ , "not-in" /* NOT_IN */ ]; - - case "not-in" /* NOT_IN */ : - return [ "array-contains" /* ARRAY_CONTAINS */ , "array-contains-any" /* ARRAY_CONTAINS_ANY */ , "in" /* IN */ , "not-in" /* NOT_IN */ , "!=" /* NOT_EQUAL */ ]; - - default: - return []; - } - }(e.op)); - if (null !== n) - // Special case when it's a duplicate op to give a slightly clearer error message. - throw n === e.op ? new Q(G.INVALID_ARGUMENT, `Invalid query. You cannot use more than one '${e.op.toString()}' filter.`) : new Q(G.INVALID_ARGUMENT, `Invalid query. You cannot use '${e.op.toString()}' filters with '${n.toString()}' filters.`); - }(t, u), u; - }(t._query, "where", e, t.firestore._databaseId, this.ac, this.uc, this.cc); - return new oc(t.firestore, t.converter, function(t, e) { - const n = t.filters.concat([ e ]); - return new ve(t.path, t.collectionGroup, t.explicitOrderBy.slice(), n, t.limit, t.limitType, t.startAt, t.endAt); - }(t._query, n)); - } -} - -/** - * Creates a {@link QueryConstraint} that enforces that documents must contain the - * specified field and that the value should satisfy the relation constraint - * provided. - * - * @param fieldPath - The path to compare - * @param opStr - The operation string (e.g "<", "<=", "==", "<", - * "<=", "!="). - * @param value - The value for comparison - * @returns The created {@link Query}. - */ function Ah(t, e, n) { - const s = e, i = fh("where", t); - return new Eh(i, s, n); -} - -class Rh extends Ih { - constructor(t, e) { - super(), this.ac = t, this.hc = e, this.type = "orderBy"; - } - _apply(t) { - const e = function(t, e, n) { - if (null !== t.startAt) throw new Q(G.INVALID_ARGUMENT, "Invalid query. You must not call startAt() or startAfter() before calling orderBy()."); - if (null !== t.endAt) throw new Q(G.INVALID_ARGUMENT, "Invalid query. You must not call endAt() or endBefore() before calling orderBy()."); - const s = new Re(e, n); - return function(t, e) { - if (null === Ne(t)) { - // This is the first order by. It must match any inequality. - const n = ke(t); - null !== n && Fh(t, n, e.field); - } - }(t, s), s; - } - /** - * Create a `Bound` from a query and a document. - * - * Note that the `Bound` will always include the key of the document - * and so only the provided document will compare equal to the returned - * position. - * - * Will throw if the document does not contain all fields of the order by - * of the query or if any of the fields in the order by are an uncommitted - * server timestamp. - */ (t._query, this.ac, this.hc); - return new oc(t.firestore, t.converter, function(t, e) { - // TODO(dimond): validate that orderBy does not list the same key twice. - const n = t.explicitOrderBy.concat([ e ]); - return new ve(t.path, t.collectionGroup, n, t.filters.slice(), t.limit, t.limitType, t.startAt, t.endAt); - }(t._query, e)); - } -} - -/** - * Creates a {@link QueryConstraint} that sorts the query result by the - * specified field, optionally in descending order instead of ascending. - * - * @param fieldPath - The field to sort by. - * @param directionStr - Optional direction to sort by ('asc' or 'desc'). If - * not specified, order will be ascending. - * @returns The created {@link Query}. - */ function bh(t, e = "asc") { - const n = e, s = fh("orderBy", t); - return new Rh(s, n); -} - -class Ph extends Ih { - constructor(t, e, n) { - super(), this.type = t, this.lc = e, this.fc = n; - } - _apply(t) { - return new oc(t.firestore, t.converter, Fe(t._query, this.lc, this.fc)); - } -} - -/** - * Creates a {@link QueryConstraint} that only returns the first matching documents. - * - * @param limit - The maximum number of items to return. - * @returns The created {@link Query}. - */ function Vh(t) { - return ec("limit", t), new Ph("limit", t, "F" /* First */); -} - -/** - * Creates a {@link QueryConstraint} that only returns the last matching documents. - * - * You must specify at least one `orderBy` clause for `limitToLast` queries, - * otherwise an exception will be thrown during execution. - * - * @param limit - The maximum number of items to return. - * @returns The created {@link Query}. - */ function vh(t) { - return ec("limitToLast", t), new Ph("limitToLast", t, "L" /* Last */); -} - -class Sh extends Ih { - constructor(t, e, n) { - super(), this.type = t, this.dc = e, this._c = n; - } - _apply(t) { - const e = Mh(t, this.type, this.dc, this._c); - return new oc(t.firestore, t.converter, function(t, e) { - return new ve(t.path, t.collectionGroup, t.explicitOrderBy.slice(), t.filters.slice(), t.limit, t.limitType, e, t.endAt); - }(t._query, e)); - } -} - -function Dh(...t) { - return new Sh("startAt", t, - /*inclusive=*/ !0); -} - -function Ch(...t) { - return new Sh("startAfter", t, - /*inclusive=*/ !1); -} - -class xh extends Ih { - constructor(t, e, n) { - super(), this.type = t, this.dc = e, this._c = n; - } - _apply(t) { - const e = Mh(t, this.type, this.dc, this._c); - return new oc(t.firestore, t.converter, function(t, e) { - return new ve(t.path, t.collectionGroup, t.explicitOrderBy.slice(), t.filters.slice(), t.limit, t.limitType, t.startAt, e); - }(t._query, e)); - } -} - -function Nh(...t) { - return new xh("endBefore", t, - /*inclusive=*/ !1); -} - -function kh(...t) { - return new xh("endAt", t, /*inclusive=*/ !0); -} - -/** Helper function to create a bound from a document or fields */ function Mh(t, e, n, s) { - if (n[0] = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(n[0]), n[0] instanceof hh) return function(t, e, n, s, i) { - if (!s) throw new Q(G.NOT_FOUND, `Can't use a DocumentSnapshot that doesn't exist for ${n}().`); - const r = []; - // Because people expect to continue/end a query at the exact document - // provided, we need to use the implicit sort order rather than the explicit - // sort order, because it's guaranteed to contain the document key. That way - // the position becomes unambiguous and the query continues/ends exactly at - // the provided document. Without the key (by using the explicit sort - // orders), multiple documents could match the position, yielding duplicate - // results. - for (const n of Oe(t)) if (n.field.isKeyField()) r.push(Ut(e, s.key)); else { - const t = s.data.field(n.field); - if (Rt(t)) throw new Q(G.INVALID_ARGUMENT, 'Invalid query. You are trying to start or end a query using a document for which the field "' + n.field + '" is an uncommitted server timestamp. (Since the value of this field is unknown, you cannot start/end a query with it.)'); - if (null === t) { - const t = n.field.canonicalString(); - throw new Q(G.INVALID_ARGUMENT, `Invalid query. You are trying to start or end a query using a document for which the field '${t}' (used as the orderBy) does not exist.`); - } - r.push(t); - } - return new Ae(r, i); - } - /** - * Converts a list of field values to a `Bound` for the given query. - */ (t._query, t.firestore._databaseId, e, n[0]._document, s); - { - const i = Gc(t.firestore); - return function(t, e, n, s, i, r) { - // Use explicit order by's because it has to match the query the user made - const o = t.explicitOrderBy; - if (i.length > o.length) throw new Q(G.INVALID_ARGUMENT, `Too many arguments provided to ${s}(). The number of arguments must be less than or equal to the number of orderBy() clauses`); - const a = []; - for (let r = 0; r < i.length; r++) { - const u = i[r]; - if (o[r].field.isKeyField()) { - if ("string" != typeof u) throw new Q(G.INVALID_ARGUMENT, `Invalid query. Expected a string for document ID in ${s}(), but got a ${typeof u}`); - if (!Me(t) && -1 !== u.indexOf("/")) throw new Q(G.INVALID_ARGUMENT, `Invalid query. When querying a collection and ordering by documentId(), the value passed to ${s}() must be a plain document ID, but '${u}' contains a slash.`); - const n = t.path.child(_t.fromString(u)); - if (!xt.isDocumentKey(n)) throw new Q(G.INVALID_ARGUMENT, `Invalid query. When querying a collection group and ordering by documentId(), the value passed to ${s}() must result in a valid document path, but '${n}' is not because it contains an odd number of segments.`); - const i = new xt(n); - a.push(Ut(e, i)); - } else { - const t = th(n, s, u); - a.push(t); - } - } - return new Ae(a, r); - } - /** - * Parses the given `documentIdValue` into a `ReferenceValue`, throwing - * appropriate errors if the value is anything other than a `DocumentReference` - * or `string`, or if the string is malformed. - */ (t._query, t.firestore._databaseId, i, e, n, s); - } -} - -function Oh(t, e, n) { - if ("string" == typeof (n = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(n))) { - if ("" === n) throw new Q(G.INVALID_ARGUMENT, "Invalid query. When querying with documentId(), you must provide a valid document ID, but it was an empty string."); - if (!Me(e) && -1 !== n.indexOf("/")) throw new Q(G.INVALID_ARGUMENT, `Invalid query. When querying a collection by documentId(), you must provide a plain document ID, but '${n}' contains a '/' character.`); - const s = e.path.child(_t.fromString(n)); - if (!xt.isDocumentKey(s)) throw new Q(G.INVALID_ARGUMENT, `Invalid query. When querying a collection group by documentId(), the value provided must result in a valid document path, but '${s}' is not because it has an odd number of segments (${s.length}).`); - return Ut(t, new xt(s)); - } - if (n instanceof rc) return Ut(t, n._key); - throw new Q(G.INVALID_ARGUMENT, `Invalid query. When querying with documentId(), you must provide a valid string or a DocumentReference, but it was: ${Zu(n)}.`); -} - -/** - * Validates that the value passed into a disjunctive filter satisfies all - * array requirements. - */ function $h(t, e) { - if (!Array.isArray(t) || 0 === t.length) throw new Q(G.INVALID_ARGUMENT, `Invalid Query. A non-empty array is required for '${e.toString()}' filters.`); - if (t.length > 10) throw new Q(G.INVALID_ARGUMENT, `Invalid Query. '${e.toString()}' filters support a maximum of 10 elements in the value array.`); -} - -function Fh(t, e, n) { - if (!n.isEqual(e)) throw new Q(G.INVALID_ARGUMENT, `Invalid query. You have a where filter with an inequality (<, <=, !=, not-in, >, or >=) on field '${e.toString()}' and so you must also use '${e.toString()}' as your first argument to orderBy(), but your first orderBy() is on field '${n.toString()}' instead.`); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Converts Firestore's internal types to the JavaScript types that we expose - * to the user. - * - * @internal - */ class Bh { - convertValue(t, e = "none") { - switch (Mt(t)) { - case 0 /* NullValue */ : - return null; - - case 1 /* BooleanValue */ : - return t.booleanValue; - - case 2 /* NumberValue */ : - return Et(t.integerValue || t.doubleValue); - - case 3 /* TimestampValue */ : - return this.convertTimestamp(t.timestampValue); - - case 4 /* ServerTimestampValue */ : - return this.convertServerTimestamp(t, e); - - case 5 /* StringValue */ : - return t.stringValue; - - case 6 /* BlobValue */ : - return this.convertBytes(At(t.bytesValue)); - - case 7 /* RefValue */ : - return this.convertReference(t.referenceValue); - - case 8 /* GeoPointValue */ : - return this.convertGeoPoint(t.geoPointValue); - - case 9 /* ArrayValue */ : - return this.convertArray(t.arrayValue, e); - - case 10 /* ObjectValue */ : - return this.convertObject(t.mapValue, e); - - default: - throw L(); - } - } - convertObject(t, e) { - const n = {}; - return lt(t.fields, ((t, s) => { - n[t] = this.convertValue(s, e); - })), n; - } - convertGeoPoint(t) { - return new $c(Et(t.latitude), Et(t.longitude)); - } - convertArray(t, e) { - return (t.values || []).map((t => this.convertValue(t, e))); - } - convertServerTimestamp(t, e) { - switch (e) { - case "previous": - const n = bt(t); - return null == n ? null : this.convertValue(n, e); - - case "estimate": - return this.convertTimestamp(Pt(t)); - - default: - return null; - } - } - convertTimestamp(t) { - const e = Tt(t); - return new ut(e.seconds, e.nanos); - } - convertDocumentKey(t, e) { - const n = _t.fromString(t); - q(Os(n)); - const s = new vt(n.get(1), n.get(3)), i = new xt(n.popFirst(5)); - return s.isEqual(e) || - // TODO(b/64130202): Somehow support foreign references. - $(`Document ${i} contains a document reference within a different database (${s.projectId}/${s.database}) which is not supported. It will be treated as a reference in the current database (${e.projectId}/${e.database}) instead.`), - i; - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Converts custom model object of type T into `DocumentData` by applying the - * converter if it exists. - * - * This function is used when converting user objects to `DocumentData` - * because we want to provide the user with a more specific error message if - * their `set()` or fails due to invalid data originating from a `toFirestore()` - * call. - */ function Lh(t, e, n) { - let s; - // Cast to `any` in order to satisfy the union type constraint on - // toFirestore(). - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return s = t ? n && (n.merge || n.mergeFields) ? t.toFirestore(e, n) : t.toFirestore(e) : e, - s; -} - -class qh extends Bh { - constructor(t) { - super(), this.firestore = t; - } - convertBytes(t) { - return new Mc(t); - } - convertReference(t) { - const e = this.convertDocumentKey(t, this.firestore._databaseId); - return new rc(this.firestore, /* converter= */ null, e); - } -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A write batch, used to perform multiple writes as a single atomic unit. - * - * A `WriteBatch` object can be acquired by calling {@link writeBatch}. It - * provides methods for adding writes to the write batch. None of the writes - * will be committed (or visible locally) until {@link WriteBatch.commit} is - * called. - */ class Uh { - /** @hideconstructor */ - constructor(t, e) { - this._firestore = t, this._commitHandler = e, this._mutations = [], this._committed = !1, - this._dataReader = Gc(t); - } - set(t, e, n) { - this._verifyNotCommitted(); - const s = Kh(t, this._firestore), i = Lh(s.converter, e, n), r = Qc(this._dataReader, "WriteBatch.set", s._key, i, null !== s.converter, n); - return this._mutations.push(r.toMutation(s._key, hn.none())), this; - } - update(t, e, n, ...s) { - this._verifyNotCommitted(); - const i = Kh(t, this._firestore); - // For Compat types, we have to "extract" the underlying types before - // performing validation. - let r; - return r = "string" == typeof (e = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(e)) || e instanceof Nc ? Zc(this._dataReader, "WriteBatch.update", i._key, e, n, s) : Xc(this._dataReader, "WriteBatch.update", i._key, e), - this._mutations.push(r.toMutation(i._key, hn.exists(!0))), this; - } - /** - * Deletes the document referred to by the provided {@link DocumentReference}. - * - * @param documentRef - A reference to the document to be deleted. - * @returns This `WriteBatch` instance. Used for chaining method calls. - */ delete(t) { - this._verifyNotCommitted(); - const e = Kh(t, this._firestore); - return this._mutations = this._mutations.concat(new An(e._key, hn.none())), this; - } - /** - * Commits all of the writes in this write batch as a single atomic unit. - * - * The result of these writes will only be reflected in document reads that - * occur after the returned promise resolves. If the client is offline, the - * write fails. If you would like to see local modifications or buffer writes - * until the client is online, use the full Firestore SDK. - * - * @returns A `Promise` resolved once all of the writes in the batch have been - * successfully written to the backend as an atomic unit (note that it won't - * resolve while you're offline). - */ commit() { - return this._verifyNotCommitted(), this._committed = !0, this._mutations.length > 0 ? this._commitHandler(this._mutations) : Promise.resolve(); - } - _verifyNotCommitted() { - if (this._committed) throw new Q(G.FAILED_PRECONDITION, "A write batch can no longer be used after commit() has been called."); - } -} - -function Kh(t, e) { - if ((t = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(t)).firestore !== e) throw new Q(G.INVALID_ARGUMENT, "Provided document reference is from a different Firestore instance."); - return t; -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -// TODO(mrschmidt) Consider using `BaseTransaction` as the base class in the -// legacy SDK. -/** - * A reference to a transaction. - * - * The `Transaction` object passed to a transaction's `updateFunction` provides - * the methods to read and write data within the transaction context. See - * {@link runTransaction}. - */ -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Reads the document referred to by this `DocumentReference`. - * - * Note: `getDoc()` attempts to provide up-to-date data when possible by waiting - * for data from the server, but it may return cached data or fail if you are - * offline and the server cannot be reached. To specify this behavior, invoke - * {@link getDocFromCache} or {@link getDocFromServer}. - * - * @param reference - The reference of the document to fetch. - * @returns A Promise resolved with a `DocumentSnapshot` containing the - * current document contents. - */ -function Gh(t) { - t = tc(t, rc); - const e = tc(t.firestore, gc); - return qu(Ic(e), t._key).then((n => il(e, t, n))); -} - -class Qh extends Bh { - constructor(t) { - super(), this.firestore = t; - } - convertBytes(t) { - return new Mc(t); - } - convertReference(t) { - const e = this.convertDocumentKey(t, this.firestore._databaseId); - return new rc(this.firestore, /* converter= */ null, e); - } -} - -/** - * Reads the document referred to by this `DocumentReference` from cache. - * Returns an error if the document is not currently cached. - * - * @returns A `Promise` resolved with a `DocumentSnapshot` containing the - * current document contents. - */ function jh(t) { - t = tc(t, rc); - const e = tc(t.firestore, gc), n = Ic(e), s = new Qh(e); - return Lu(n, t._key).then((n => new _h(e, s, t._key, n, new dh(null !== n && n.hasLocalMutations, - /* fromCache= */ !0), t.converter))); -} - -/** - * Reads the document referred to by this `DocumentReference` from the server. - * Returns an error if the network is not available. - * - * @returns A `Promise` resolved with a `DocumentSnapshot` containing the - * current document contents. - */ function Wh(t) { - t = tc(t, rc); - const e = tc(t.firestore, gc); - return qu(Ic(e), t._key, { - source: "server" - }).then((n => il(e, t, n))); -} - -/** - * Executes the query and returns the results as a `QuerySnapshot`. - * - * Note: `getDocs()` attempts to provide up-to-date data when possible by - * waiting for data from the server, but it may return cached data or fail if - * you are offline and the server cannot be reached. To specify this behavior, - * invoke {@link getDocsFromCache} or {@link getDocsFromServer}. - * - * @returns A `Promise` that will be resolved with the results of the query. - */ function zh(t) { - t = tc(t, oc); - const e = tc(t.firestore, gc), n = Ic(e), s = new Qh(e); - return ph(t._query), Ku(n, t._query).then((n => new mh(e, s, t, n))); -} - -/** - * Executes the query and returns the results as a `QuerySnapshot` from cache. - * Returns an error if the document is not currently cached. - * - * @returns A `Promise` that will be resolved with the results of the query. - */ function Hh(t) { - t = tc(t, oc); - const e = tc(t.firestore, gc), n = Ic(e), s = new Qh(e); - return Uu(n, t._query).then((n => new mh(e, s, t, n))); -} - -/** - * Executes the query and returns the results as a `QuerySnapshot` from the - * server. Returns an error if the network is not available. - * - * @returns A `Promise` that will be resolved with the results of the query. - */ function Jh(t) { - t = tc(t, oc); - const e = tc(t.firestore, gc), n = Ic(e), s = new Qh(e); - return Ku(n, t._query, { - source: "server" - }).then((n => new mh(e, s, t, n))); -} - -function Yh(t, e, n) { - t = tc(t, rc); - const s = tc(t.firestore, gc), i = Lh(t.converter, e, n); - return sl(s, [ Qc(Gc(s), "setDoc", t._key, i, null !== t.converter, n).toMutation(t._key, hn.none()) ]); -} - -function Xh(t, e, n, ...s) { - t = tc(t, rc); - const i = tc(t.firestore, gc), r = Gc(i); - let o; - o = "string" == typeof ( - // For Compat types, we have to "extract" the underlying types before - // performing validation. - e = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(e)) || e instanceof Nc ? Zc(r, "updateDoc", t._key, e, n, s) : Xc(r, "updateDoc", t._key, e); - return sl(i, [ o.toMutation(t._key, hn.exists(!0)) ]); -} - -/** - * Deletes the document referred to by the specified `DocumentReference`. - * - * @param reference - A reference to the document to delete. - * @returns A Promise resolved once the document has been successfully - * deleted from the backend (note that it won't resolve while you're offline). - */ function Zh(t) { - return sl(tc(t.firestore, gc), [ new An(t._key, hn.none()) ]); -} - -/** - * Add a new document to specified `CollectionReference` with the given data, - * assigning it a document ID automatically. - * - * @param reference - A reference to the collection to add this document to. - * @param data - An Object containing the data for the new document. - * @returns A `Promise` resolved with a `DocumentReference` pointing to the - * newly created document after it has been written to the backend (Note that it - * won't resolve while you're offline). - */ function tl(t, e) { - const n = tc(t.firestore, gc), s = hc(t), i = Lh(t.converter, e); - return sl(n, [ Qc(Gc(t.firestore), "addDoc", s._key, i, null !== t.converter, {}).toMutation(s._key, hn.exists(!1)) ]).then((() => s)); -} - -function el(t, ...e) { - var n, s, i; - t = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(t); - let r = { - includeMetadataChanges: !1 - }, o = 0; - "object" != typeof e[o] || _c(e[o]) || (r = e[o], o++); - const a = { - includeMetadataChanges: r.includeMetadataChanges - }; - if (_c(e[o])) { - const t = e[o]; - e[o] = null === (n = t.next) || void 0 === n ? void 0 : n.bind(t), e[o + 1] = null === (s = t.error) || void 0 === s ? void 0 : s.bind(t), - e[o + 2] = null === (i = t.complete) || void 0 === i ? void 0 : i.bind(t); - } - let u, c, h; - if (t instanceof rc) c = tc(t.firestore, gc), h = De(t._key.path), u = { - next: n => { - e[o] && e[o](il(c, t, n)); - }, - error: e[o + 1], - complete: e[o + 2] - }; else { - const n = tc(t, oc); - c = tc(n.firestore, gc), h = n._query; - const s = new Qh(c); - u = { - next: t => { - e[o] && e[o](new mh(c, s, n, t)); - }, - error: e[o + 1], - complete: e[o + 2] - }, ph(t._query); - } - return function(t, e, n, s) { - const i = new Ru(s), r = new Da(e, i, n); - return t.asyncQueue.enqueueAndForget((async () => ba(await $u(t), r))), () => { - i.mu(), t.asyncQueue.enqueueAndForget((async () => Pa(await $u(t), r))); - }; - }(Ic(c), h, a, u); -} - -function nl(t, e) { - return Gu(Ic(t = tc(t, gc)), _c(e) ? e : { - next: e - }); -} - -/** - * Locally writes `mutations` on the async queue. - * @internal - */ function sl(t, e) { - return function(t, e) { - const n = new j; - return t.asyncQueue.enqueueAndForget((async () => Ga(await Ou(t), e, n))), n.promise; - }(Ic(t), e); -} - -/** - * Converts a {@link ViewSnapshot} that contains the single document specified by `ref` - * to a {@link DocumentSnapshot}. - */ function il(t, e, n) { - const s = n.docs.get(e._key), i = new Qh(t); - return new _h(t, i, e._key, s, new dh(n.hasPendingWrites, n.fromCache), e.converter); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A reference to a transaction. - * - * The `Transaction` object passed to a transaction's `updateFunction` provides - * the methods to read and write data within the transaction context. See - * {@link runTransaction}. - */ class rl extends class { - /** @hideconstructor */ - constructor(t, e) { - this._firestore = t, this._transaction = e, this._dataReader = Gc(t); - } - /** - * Reads the document referenced by the provided {@link DocumentReference}. - * - * @param documentRef - A reference to the document to be read. - * @returns A `DocumentSnapshot` with the read data. - */ get(t) { - const e = Kh(t, this._firestore), n = new qh(this._firestore); - return this._transaction.lookup([ e._key ]).then((t => { - if (!t || 1 !== t.length) return L(); - const s = t[0]; - if (s.isFoundDocument()) return new hh(this._firestore, n, s.key, s, e.converter); - if (s.isNoDocument()) return new hh(this._firestore, n, e._key, null, e.converter); - throw L(); - })); - } - set(t, e, n) { - const s = Kh(t, this._firestore), i = Lh(s.converter, e, n), r = Qc(this._dataReader, "Transaction.set", s._key, i, null !== s.converter, n); - return this._transaction.set(s._key, r), this; - } - update(t, e, n, ...s) { - const i = Kh(t, this._firestore); - // For Compat types, we have to "extract" the underlying types before - // performing validation. - let r; - return r = "string" == typeof (e = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_3__.getModularInstance)(e)) || e instanceof Nc ? Zc(this._dataReader, "Transaction.update", i._key, e, n, s) : Xc(this._dataReader, "Transaction.update", i._key, e), - this._transaction.update(i._key, r), this; - } - /** - * Deletes the document referred to by the provided {@link DocumentReference}. - * - * @param documentRef - A reference to the document to be deleted. - * @returns This `Transaction` instance. Used for chaining method calls. - */ delete(t) { - const e = Kh(t, this._firestore); - return this._transaction.delete(e._key), this; - } -} { - // This class implements the same logic as the Transaction API in the Lite SDK - // but is subclassed in order to return its own DocumentSnapshot types. - /** @hideconstructor */ - constructor(t, e) { - super(t, e), this._firestore = t; - } - /** - * Reads the document referenced by the provided {@link DocumentReference}. - * - * @param documentRef - A reference to the document to be read. - * @returns A `DocumentSnapshot` with the read data. - */ get(t) { - const e = Kh(t, this._firestore), n = new Qh(this._firestore); - return super.get(t).then((t => new _h(this._firestore, n, e._key, t._document, new dh( - /* hasPendingWrites= */ !1, - /* fromCache= */ !1), e.converter))); - } -} - -/** - * Executes the given `updateFunction` and then attempts to commit the changes - * applied within the transaction. If any document read within the transaction - * has changed, Cloud Firestore retries the `updateFunction`. If it fails to - * commit after 5 attempts, the transaction fails. - * - * The maximum number of writes allowed in a single transaction is 500. - * - * @param firestore - A reference to the Firestore database to run this - * transaction against. - * @param updateFunction - The function to execute within the transaction - * context. - * @returns If the transaction completed successfully or was explicitly aborted - * (the `updateFunction` returned a failed promise), the promise returned by the - * `updateFunction `is returned here. Otherwise, if the transaction failed, a - * rejected promise with the corresponding failure error is returned. - */ function ol(t, e) { - return Qu(Ic(t = tc(t, gc)), (n => e(new rl(t, n)))); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Returns a sentinel for use with {@link @firebase/firestore/lite#(updateDoc:1)} or - * {@link @firebase/firestore/lite#(setDoc:1)} with `{merge: true}` to mark a field for deletion. - */ function al() { - return new jc("deleteField"); -} - -/** - * Returns a sentinel used with {@link @firebase/firestore/lite#(setDoc:1)} or {@link @firebase/firestore/lite#(updateDoc:1)} to - * include a server-generated timestamp in the written data. - */ function ul() { - return new zc("serverTimestamp"); -} - -/** - * Returns a special value that can be used with {@link @firebase/firestore/lite#(setDoc:1)} or {@link - * @firebase/firestore/lite#(updateDoc:1)} that tells the server to union the given elements with any array - * value that already exists on the server. Each specified element that doesn't - * already exist in the array will be added to the end. If the field being - * modified is not already an array it will be overwritten with an array - * containing exactly the specified elements. - * - * @param elements - The elements to union into the array. - * @returns The `FieldValue` sentinel for use in a call to `setDoc()` or - * `updateDoc()`. - */ function cl(...t) { - // NOTE: We don't actually parse the data until it's used in set() or - // update() since we'd need the Firestore instance to do this. - return new Hc("arrayUnion", t); -} - -/** - * Returns a special value that can be used with {@link (setDoc:1)} or {@link - * updateDoc:1} that tells the server to remove the given elements from any - * array value that already exists on the server. All instances of each element - * specified will be removed from the array. If the field being modified is not - * already an array it will be overwritten with an empty array. - * - * @param elements - The elements to remove from the array. - * @returns The `FieldValue` sentinel for use in a call to `setDoc()` or - * `updateDoc()` - */ function hl(...t) { - // NOTE: We don't actually parse the data until it's used in set() or - // update() since we'd need the Firestore instance to do this. - return new Jc("arrayRemove", t); -} - -/** - * Returns a special value that can be used with {@link @firebase/firestore/lite#(setDoc:1)} or {@link - * @firebase/firestore/lite#(updateDoc:1)} that tells the server to increment the field's current value by - * the given value. - * - * If either the operand or the current field value uses floating point - * precision, all arithmetic follows IEEE 754 semantics. If both values are - * integers, values outside of JavaScript's safe number range - * (`Number.MIN_SAFE_INTEGER` to `Number.MAX_SAFE_INTEGER`) are also subject to - * precision loss. Furthermore, once processed by the Firestore backend, all - * integer operations are capped between -2^63 and 2^63-1. - * - * If the current field value is not of type `number`, or if the field does not - * yet exist, the transformation sets the field to the given value. - * - * @param n - The value to increment by. - * @returns The `FieldValue` sentinel for use in a call to `setDoc()` or - * `updateDoc()` - */ function ll(t) { - return new Yc("increment", t); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Creates a write batch, used for performing multiple writes as a single - * atomic operation. The maximum number of writes allowed in a single {@link WriteBatch} - * is 500. - * - * Unlike transactions, write batches are persisted offline and therefore are - * preferable when you don't need to condition your writes on read data. - * - * @returns A {@link WriteBatch} that can be used to atomically execute multiple - * writes. - */ function fl(t) { - return Ic(t = tc(t, gc)), new Uh(t, (e => sl(t, e))); -} - -/** - * @license - * Copyright 2021 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ function dl(t, e) { - Ic(t = tc(t, gc)); - const n = "string" == typeof e ? function(t) { - try { - return JSON.parse(t); - } catch (t) { - throw new Q(G.INVALID_ARGUMENT, "Failed to parse JSON:" + t.message); - } - }(e) : e, s = []; - // PORTING NOTE: We don't return an error if the user has not enabled - // persistence since `enableIndexeddbPersistence()` can fail on the Web. - if (Array.isArray(n.indexes)) for (const t of n.indexes) { - const e = _l(t, "collectionGroup"), n = []; - if (Array.isArray(t.fields)) for (const e of t.fields) { - const t = ah("setIndexConfiguration", _l(e, "fieldPath")); - "CONTAINS" === e.arrayConfig ? n.push(new ie(t, 2 /* CONTAINS */)) : "ASCENDING" === e.order ? n.push(new ie(t, 0 /* ASCENDING */)) : "DESCENDING" === e.order && n.push(new ie(t, 1 /* DESCENDING */)); - } - s.push(new ee(ee.UNKNOWN_ID, e, n, re.empty())); - } - // TODO(indexing): Configure indexes - return Promise.resolve(); -} - -function _l(t, e) { - if ("string" != typeof t[e]) throw new Q(G.INVALID_ARGUMENT, "Missing string value for: " + e); - return t[e]; -} - -/** - * Cloud Firestore - * - * @packageDocumentation - */ !function(t, e = !0) { - !function(t) { - x = t; - }(_firebase_app__WEBPACK_IMPORTED_MODULE_0__.SDK_VERSION), (0,_firebase_app__WEBPACK_IMPORTED_MODULE_0__._registerComponent)(new _firebase_component__WEBPACK_IMPORTED_MODULE_1__.Component("firestore", ((t, {options: n}) => { - const s = t.getProvider("app").getImmediate(), i = new gc(s, new J(t.getProvider("auth-internal")), new tt(t.getProvider("app-check-internal"))); - return n = Object.assign({ - useFetchStreams: e - }, n), i._setSettings(n), i; - }), "PUBLIC")), (0,_firebase_app__WEBPACK_IMPORTED_MODULE_0__.registerVersion)(D, "3.4.6", t), - // BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation - (0,_firebase_app__WEBPACK_IMPORTED_MODULE_0__.registerVersion)(D, "3.4.6", "esm2017"); -}(); - - -//# sourceMappingURL=index.esm2017.js.map - - -/***/ }), - -/***/ "./node_modules/@firebase/util/dist/index.esm2017.js": -/*!***********************************************************!*\ - !*** ./node_modules/@firebase/util/dist/index.esm2017.js ***! - \***********************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "CONSTANTS": () => (/* binding */ CONSTANTS), -/* harmony export */ "DBWrapper": () => (/* binding */ DBWrapper), -/* harmony export */ "Deferred": () => (/* binding */ Deferred), -/* harmony export */ "ErrorFactory": () => (/* binding */ ErrorFactory), -/* harmony export */ "FirebaseError": () => (/* binding */ FirebaseError), -/* harmony export */ "MAX_VALUE_MILLIS": () => (/* binding */ MAX_VALUE_MILLIS), -/* harmony export */ "RANDOM_FACTOR": () => (/* binding */ RANDOM_FACTOR), -/* harmony export */ "Sha1": () => (/* binding */ Sha1), -/* harmony export */ "areCookiesEnabled": () => (/* binding */ areCookiesEnabled), -/* harmony export */ "assert": () => (/* binding */ assert), -/* harmony export */ "assertionError": () => (/* binding */ assertionError), -/* harmony export */ "async": () => (/* binding */ async), -/* harmony export */ "base64": () => (/* binding */ base64), -/* harmony export */ "base64Decode": () => (/* binding */ base64Decode), -/* harmony export */ "base64Encode": () => (/* binding */ base64Encode), -/* harmony export */ "base64urlEncodeWithoutPadding": () => (/* binding */ base64urlEncodeWithoutPadding), -/* harmony export */ "calculateBackoffMillis": () => (/* binding */ calculateBackoffMillis), -/* harmony export */ "contains": () => (/* binding */ contains), -/* harmony export */ "createMockUserToken": () => (/* binding */ createMockUserToken), -/* harmony export */ "createSubscribe": () => (/* binding */ createSubscribe), -/* harmony export */ "decode": () => (/* binding */ decode), -/* harmony export */ "deepCopy": () => (/* binding */ deepCopy), -/* harmony export */ "deepEqual": () => (/* binding */ deepEqual), -/* harmony export */ "deepExtend": () => (/* binding */ deepExtend), -/* harmony export */ "deleteDB": () => (/* binding */ deleteDB), -/* harmony export */ "errorPrefix": () => (/* binding */ errorPrefix), -/* harmony export */ "extractQuerystring": () => (/* binding */ extractQuerystring), -/* harmony export */ "getGlobal": () => (/* binding */ getGlobal), -/* harmony export */ "getModularInstance": () => (/* binding */ getModularInstance), -/* harmony export */ "getUA": () => (/* binding */ getUA), -/* harmony export */ "isAdmin": () => (/* binding */ isAdmin), -/* harmony export */ "isBrowser": () => (/* binding */ isBrowser), -/* harmony export */ "isBrowserExtension": () => (/* binding */ isBrowserExtension), -/* harmony export */ "isElectron": () => (/* binding */ isElectron), -/* harmony export */ "isEmpty": () => (/* binding */ isEmpty), -/* harmony export */ "isIE": () => (/* binding */ isIE), -/* harmony export */ "isIndexedDBAvailable": () => (/* binding */ isIndexedDBAvailable), -/* harmony export */ "isMobileCordova": () => (/* binding */ isMobileCordova), -/* harmony export */ "isNode": () => (/* binding */ isNode), -/* harmony export */ "isNodeSdk": () => (/* binding */ isNodeSdk), -/* harmony export */ "isReactNative": () => (/* binding */ isReactNative), -/* harmony export */ "isSafari": () => (/* binding */ isSafari), -/* harmony export */ "isUWP": () => (/* binding */ isUWP), -/* harmony export */ "isValidFormat": () => (/* binding */ isValidFormat), -/* harmony export */ "isValidTimestamp": () => (/* binding */ isValidTimestamp), -/* harmony export */ "issuedAtTime": () => (/* binding */ issuedAtTime), -/* harmony export */ "jsonEval": () => (/* binding */ jsonEval), -/* harmony export */ "map": () => (/* binding */ map), -/* harmony export */ "openDB": () => (/* binding */ openDB), -/* harmony export */ "ordinal": () => (/* binding */ ordinal), -/* harmony export */ "querystring": () => (/* binding */ querystring), -/* harmony export */ "querystringDecode": () => (/* binding */ querystringDecode), -/* harmony export */ "safeGet": () => (/* binding */ safeGet), -/* harmony export */ "stringLength": () => (/* binding */ stringLength), -/* harmony export */ "stringToByteArray": () => (/* binding */ stringToByteArray), -/* harmony export */ "stringify": () => (/* binding */ stringify), -/* harmony export */ "validateArgCount": () => (/* binding */ validateArgCount), -/* harmony export */ "validateCallback": () => (/* binding */ validateCallback), -/* harmony export */ "validateContextObject": () => (/* binding */ validateContextObject), -/* harmony export */ "validateIndexedDBOpenable": () => (/* binding */ validateIndexedDBOpenable), -/* harmony export */ "validateNamespace": () => (/* binding */ validateNamespace) -/* harmony export */ }); -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @fileoverview Firebase constants. Some of these (@defines) can be overridden at compile-time. - */ -const CONSTANTS = { - /** - * @define {boolean} Whether this is the client Node.js SDK. - */ - NODE_CLIENT: false, - /** - * @define {boolean} Whether this is the Admin Node.js SDK. - */ - NODE_ADMIN: false, - /** - * Firebase SDK Version - */ - SDK_VERSION: '${JSCORE_VERSION}' -}; - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Throws an error if the provided assertion is falsy - */ -const assert = function (assertion, message) { - if (!assertion) { - throw assertionError(message); - } -}; -/** - * Returns an Error object suitable for throwing. - */ -const assertionError = function (message) { - return new Error('Firebase Database (' + - CONSTANTS.SDK_VERSION + - ') INTERNAL ASSERT FAILED: ' + - message); -}; - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const stringToByteArray$1 = function (str) { - // TODO(user): Use native implementations if/when available - const out = []; - let p = 0; - for (let i = 0; i < str.length; i++) { - let c = str.charCodeAt(i); - if (c < 128) { - out[p++] = c; - } - else if (c < 2048) { - out[p++] = (c >> 6) | 192; - out[p++] = (c & 63) | 128; - } - else if ((c & 0xfc00) === 0xd800 && - i + 1 < str.length && - (str.charCodeAt(i + 1) & 0xfc00) === 0xdc00) { - // Surrogate Pair - c = 0x10000 + ((c & 0x03ff) << 10) + (str.charCodeAt(++i) & 0x03ff); - out[p++] = (c >> 18) | 240; - out[p++] = ((c >> 12) & 63) | 128; - out[p++] = ((c >> 6) & 63) | 128; - out[p++] = (c & 63) | 128; - } - else { - out[p++] = (c >> 12) | 224; - out[p++] = ((c >> 6) & 63) | 128; - out[p++] = (c & 63) | 128; - } - } - return out; -}; -/** - * Turns an array of numbers into the string given by the concatenation of the - * characters to which the numbers correspond. - * @param bytes Array of numbers representing characters. - * @return Stringification of the array. - */ -const byteArrayToString = function (bytes) { - // TODO(user): Use native implementations if/when available - const out = []; - let pos = 0, c = 0; - while (pos < bytes.length) { - const c1 = bytes[pos++]; - if (c1 < 128) { - out[c++] = String.fromCharCode(c1); - } - else if (c1 > 191 && c1 < 224) { - const c2 = bytes[pos++]; - out[c++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63)); - } - else if (c1 > 239 && c1 < 365) { - // Surrogate Pair - const c2 = bytes[pos++]; - const c3 = bytes[pos++]; - const c4 = bytes[pos++]; - const u = (((c1 & 7) << 18) | ((c2 & 63) << 12) | ((c3 & 63) << 6) | (c4 & 63)) - - 0x10000; - out[c++] = String.fromCharCode(0xd800 + (u >> 10)); - out[c++] = String.fromCharCode(0xdc00 + (u & 1023)); - } - else { - const c2 = bytes[pos++]; - const c3 = bytes[pos++]; - out[c++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); - } - } - return out.join(''); -}; -// We define it as an object literal instead of a class because a class compiled down to es5 can't -// be treeshaked. https://github.com/rollup/rollup/issues/1691 -// Static lookup maps, lazily populated by init_() -const base64 = { - /** - * Maps bytes to characters. - */ - byteToCharMap_: null, - /** - * Maps characters to bytes. - */ - charToByteMap_: null, - /** - * Maps bytes to websafe characters. - * @private - */ - byteToCharMapWebSafe_: null, - /** - * Maps websafe characters to bytes. - * @private - */ - charToByteMapWebSafe_: null, - /** - * Our default alphabet, shared between - * ENCODED_VALS and ENCODED_VALS_WEBSAFE - */ - ENCODED_VALS_BASE: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + 'abcdefghijklmnopqrstuvwxyz' + '0123456789', - /** - * Our default alphabet. Value 64 (=) is special; it means "nothing." - */ - get ENCODED_VALS() { - return this.ENCODED_VALS_BASE + '+/='; - }, - /** - * Our websafe alphabet. - */ - get ENCODED_VALS_WEBSAFE() { - return this.ENCODED_VALS_BASE + '-_.'; - }, - /** - * Whether this browser supports the atob and btoa functions. This extension - * started at Mozilla but is now implemented by many browsers. We use the - * ASSUME_* variables to avoid pulling in the full useragent detection library - * but still allowing the standard per-browser compilations. - * - */ - HAS_NATIVE_SUPPORT: typeof atob === 'function', - /** - * Base64-encode an array of bytes. - * - * @param input An array of bytes (numbers with - * value in [0, 255]) to encode. - * @param webSafe Boolean indicating we should use the - * alternative alphabet. - * @return The base64 encoded string. - */ - encodeByteArray(input, webSafe) { - if (!Array.isArray(input)) { - throw Error('encodeByteArray takes an array as a parameter'); - } - this.init_(); - const byteToCharMap = webSafe - ? this.byteToCharMapWebSafe_ - : this.byteToCharMap_; - const output = []; - for (let i = 0; i < input.length; i += 3) { - const byte1 = input[i]; - const haveByte2 = i + 1 < input.length; - const byte2 = haveByte2 ? input[i + 1] : 0; - const haveByte3 = i + 2 < input.length; - const byte3 = haveByte3 ? input[i + 2] : 0; - const outByte1 = byte1 >> 2; - const outByte2 = ((byte1 & 0x03) << 4) | (byte2 >> 4); - let outByte3 = ((byte2 & 0x0f) << 2) | (byte3 >> 6); - let outByte4 = byte3 & 0x3f; - if (!haveByte3) { - outByte4 = 64; - if (!haveByte2) { - outByte3 = 64; - } - } - output.push(byteToCharMap[outByte1], byteToCharMap[outByte2], byteToCharMap[outByte3], byteToCharMap[outByte4]); - } - return output.join(''); - }, - /** - * Base64-encode a string. - * - * @param input A string to encode. - * @param webSafe If true, we should use the - * alternative alphabet. - * @return The base64 encoded string. - */ - encodeString(input, webSafe) { - // Shortcut for Mozilla browsers that implement - // a native base64 encoder in the form of "btoa/atob" - if (this.HAS_NATIVE_SUPPORT && !webSafe) { - return btoa(input); - } - return this.encodeByteArray(stringToByteArray$1(input), webSafe); - }, - /** - * Base64-decode a string. - * - * @param input to decode. - * @param webSafe True if we should use the - * alternative alphabet. - * @return string representing the decoded value. - */ - decodeString(input, webSafe) { - // Shortcut for Mozilla browsers that implement - // a native base64 encoder in the form of "btoa/atob" - if (this.HAS_NATIVE_SUPPORT && !webSafe) { - return atob(input); - } - return byteArrayToString(this.decodeStringToByteArray(input, webSafe)); - }, - /** - * Base64-decode a string. - * - * In base-64 decoding, groups of four characters are converted into three - * bytes. If the encoder did not apply padding, the input length may not - * be a multiple of 4. - * - * In this case, the last group will have fewer than 4 characters, and - * padding will be inferred. If the group has one or two characters, it decodes - * to one byte. If the group has three characters, it decodes to two bytes. - * - * @param input Input to decode. - * @param webSafe True if we should use the web-safe alphabet. - * @return bytes representing the decoded value. - */ - decodeStringToByteArray(input, webSafe) { - this.init_(); - const charToByteMap = webSafe - ? this.charToByteMapWebSafe_ - : this.charToByteMap_; - const output = []; - for (let i = 0; i < input.length;) { - const byte1 = charToByteMap[input.charAt(i++)]; - const haveByte2 = i < input.length; - const byte2 = haveByte2 ? charToByteMap[input.charAt(i)] : 0; - ++i; - const haveByte3 = i < input.length; - const byte3 = haveByte3 ? charToByteMap[input.charAt(i)] : 64; - ++i; - const haveByte4 = i < input.length; - const byte4 = haveByte4 ? charToByteMap[input.charAt(i)] : 64; - ++i; - if (byte1 == null || byte2 == null || byte3 == null || byte4 == null) { - throw Error(); - } - const outByte1 = (byte1 << 2) | (byte2 >> 4); - output.push(outByte1); - if (byte3 !== 64) { - const outByte2 = ((byte2 << 4) & 0xf0) | (byte3 >> 2); - output.push(outByte2); - if (byte4 !== 64) { - const outByte3 = ((byte3 << 6) & 0xc0) | byte4; - output.push(outByte3); - } - } - } - return output; - }, - /** - * Lazy static initialization function. Called before - * accessing any of the static map variables. - * @private - */ - init_() { - if (!this.byteToCharMap_) { - this.byteToCharMap_ = {}; - this.charToByteMap_ = {}; - this.byteToCharMapWebSafe_ = {}; - this.charToByteMapWebSafe_ = {}; - // We want quick mappings back and forth, so we precompute two maps. - for (let i = 0; i < this.ENCODED_VALS.length; i++) { - this.byteToCharMap_[i] = this.ENCODED_VALS.charAt(i); - this.charToByteMap_[this.byteToCharMap_[i]] = i; - this.byteToCharMapWebSafe_[i] = this.ENCODED_VALS_WEBSAFE.charAt(i); - this.charToByteMapWebSafe_[this.byteToCharMapWebSafe_[i]] = i; - // Be forgiving when decoding and correctly decode both encodings. - if (i >= this.ENCODED_VALS_BASE.length) { - this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(i)] = i; - this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(i)] = i; - } - } - } - } -}; -/** - * URL-safe base64 encoding - */ -const base64Encode = function (str) { - const utf8Bytes = stringToByteArray$1(str); - return base64.encodeByteArray(utf8Bytes, true); -}; -/** - * URL-safe base64 encoding (without "." padding in the end). - * e.g. Used in JSON Web Token (JWT) parts. - */ -const base64urlEncodeWithoutPadding = function (str) { - // Use base64url encoding and remove padding in the end (dot characters). - return base64Encode(str).replace(/\./g, ''); -}; -/** - * URL-safe base64 decoding - * - * NOTE: DO NOT use the global atob() function - it does NOT support the - * base64Url variant encoding. - * - * @param str To be decoded - * @return Decoded result, if possible - */ -const base64Decode = function (str) { - try { - return base64.decodeString(str, true); - } - catch (e) { - console.error('base64Decode failed: ', e); - } - return null; -}; - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Do a deep-copy of basic JavaScript Objects or Arrays. - */ -function deepCopy(value) { - return deepExtend(undefined, value); -} -/** - * Copy properties from source to target (recursively allows extension - * of Objects and Arrays). Scalar values in the target are over-written. - * If target is undefined, an object of the appropriate type will be created - * (and returned). - * - * We recursively copy all child properties of plain Objects in the source- so - * that namespace- like dictionaries are merged. - * - * Note that the target can be a function, in which case the properties in - * the source Object are copied onto it as static properties of the Function. - * - * Note: we don't merge __proto__ to prevent prototype pollution - */ -function deepExtend(target, source) { - if (!(source instanceof Object)) { - return source; - } - switch (source.constructor) { - case Date: - // Treat Dates like scalars; if the target date object had any child - // properties - they will be lost! - const dateValue = source; - return new Date(dateValue.getTime()); - case Object: - if (target === undefined) { - target = {}; - } - break; - case Array: - // Always copy the array source and overwrite the target. - target = []; - break; - default: - // Not a plain Object - treat it as a scalar. - return source; - } - for (const prop in source) { - // use isValidKey to guard against prototype pollution. See https://snyk.io/vuln/SNYK-JS-LODASH-450202 - if (!source.hasOwnProperty(prop) || !isValidKey(prop)) { - continue; - } - target[prop] = deepExtend(target[prop], source[prop]); - } - return target; -} -function isValidKey(key) { - return key !== '__proto__'; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -class Deferred { - constructor() { - this.reject = () => { }; - this.resolve = () => { }; - this.promise = new Promise((resolve, reject) => { - this.resolve = resolve; - this.reject = reject; - }); - } - /** - * Our API internals are not promiseified and cannot because our callback APIs have subtle expectations around - * invoking promises inline, which Promises are forbidden to do. This method accepts an optional node-style callback - * and returns a node-style callback which will resolve or reject the Deferred's promise. - */ - wrapCallback(callback) { - return (error, value) => { - if (error) { - this.reject(error); - } - else { - this.resolve(value); - } - if (typeof callback === 'function') { - // Attaching noop handler just in case developer wasn't expecting - // promises - this.promise.catch(() => { }); - // Some of our callbacks don't expect a value and our own tests - // assert that the parameter length is 1 - if (callback.length === 1) { - callback(error); - } - else { - callback(error, value); - } - } - }; - } -} - -/** - * @license - * Copyright 2021 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function createMockUserToken(token, projectId) { - if (token.uid) { - throw new Error('The "uid" field is no longer supported by mockUserToken. Please use "sub" instead for Firebase Auth User ID.'); - } - // Unsecured JWTs use "none" as the algorithm. - const header = { - alg: 'none', - type: 'JWT' - }; - const project = projectId || 'demo-project'; - const iat = token.iat || 0; - const sub = token.sub || token.user_id; - if (!sub) { - throw new Error("mockUserToken must contain 'sub' or 'user_id' field!"); - } - const payload = Object.assign({ - // Set all required fields to decent defaults - iss: `https://securetoken.google.com/${project}`, aud: project, iat, exp: iat + 3600, auth_time: iat, sub, user_id: sub, firebase: { - sign_in_provider: 'custom', - identities: {} - } }, token); - // Unsecured JWTs use the empty string as a signature. - const signature = ''; - return [ - base64urlEncodeWithoutPadding(JSON.stringify(header)), - base64urlEncodeWithoutPadding(JSON.stringify(payload)), - signature - ].join('.'); -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Returns navigator.userAgent string or '' if it's not defined. - * @return user agent string - */ -function getUA() { - if (typeof navigator !== 'undefined' && - typeof navigator['userAgent'] === 'string') { - return navigator['userAgent']; - } - else { - return ''; - } -} -/** - * Detect Cordova / PhoneGap / Ionic frameworks on a mobile device. - * - * Deliberately does not rely on checking `file://` URLs (as this fails PhoneGap - * in the Ripple emulator) nor Cordova `onDeviceReady`, which would normally - * wait for a callback. - */ -function isMobileCordova() { - return (typeof window !== 'undefined' && - // @ts-ignore Setting up an broadly applicable index signature for Window - // just to deal with this case would probably be a bad idea. - !!(window['cordova'] || window['phonegap'] || window['PhoneGap']) && - /ios|iphone|ipod|ipad|android|blackberry|iemobile/i.test(getUA())); -} -/** - * Detect Node.js. - * - * @return true if Node.js environment is detected. - */ -// Node detection logic from: https://github.com/iliakan/detect-node/ -function isNode() { - try { - return (Object.prototype.toString.call(__webpack_require__.g.process) === '[object process]'); - } - catch (e) { - return false; - } -} -/** - * Detect Browser Environment - */ -function isBrowser() { - return typeof self === 'object' && self.self === self; -} -function isBrowserExtension() { - const runtime = typeof chrome === 'object' - ? chrome.runtime - : typeof browser === 'object' - ? browser.runtime - : undefined; - return typeof runtime === 'object' && runtime.id !== undefined; -} -/** - * Detect React Native. - * - * @return true if ReactNative environment is detected. - */ -function isReactNative() { - return (typeof navigator === 'object' && navigator['product'] === 'ReactNative'); -} -/** Detects Electron apps. */ -function isElectron() { - return getUA().indexOf('Electron/') >= 0; -} -/** Detects Internet Explorer. */ -function isIE() { - const ua = getUA(); - return ua.indexOf('MSIE ') >= 0 || ua.indexOf('Trident/') >= 0; -} -/** Detects Universal Windows Platform apps. */ -function isUWP() { - return getUA().indexOf('MSAppHost/') >= 0; -} -/** - * Detect whether the current SDK build is the Node version. - * - * @return true if it's the Node SDK build. - */ -function isNodeSdk() { - return CONSTANTS.NODE_CLIENT === true || CONSTANTS.NODE_ADMIN === true; -} -/** Returns true if we are running in Safari. */ -function isSafari() { - return (!isNode() && - navigator.userAgent.includes('Safari') && - !navigator.userAgent.includes('Chrome')); -} -/** - * This method checks if indexedDB is supported by current browser/service worker context - * @return true if indexedDB is supported by current browser/service worker context - */ -function isIndexedDBAvailable() { - return typeof indexedDB === 'object'; -} -/** - * This method validates browser/sw context for indexedDB by opening a dummy indexedDB database and reject - * if errors occur during the database open operation. - * - * @throws exception if current browser/sw context can't run idb.open (ex: Safari iframe, Firefox - * private browsing) - */ -function validateIndexedDBOpenable() { - return new Promise((resolve, reject) => { - try { - let preExist = true; - const DB_CHECK_NAME = 'validate-browser-context-for-indexeddb-analytics-module'; - const request = self.indexedDB.open(DB_CHECK_NAME); - request.onsuccess = () => { - request.result.close(); - // delete database only when it doesn't pre-exist - if (!preExist) { - self.indexedDB.deleteDatabase(DB_CHECK_NAME); - } - resolve(true); - }; - request.onupgradeneeded = () => { - preExist = false; - }; - request.onerror = () => { - var _a; - reject(((_a = request.error) === null || _a === void 0 ? void 0 : _a.message) || ''); - }; - } - catch (error) { - reject(error); - } - }); -} -/** - * - * This method checks whether cookie is enabled within current browser - * @return true if cookie is enabled within current browser - */ -function areCookiesEnabled() { - if (typeof navigator === 'undefined' || !navigator.cookieEnabled) { - return false; - } - return true; -} -/** - * Polyfill for `globalThis` object. - * @returns the `globalThis` object for the given environment. - */ -function getGlobal() { - if (typeof self !== 'undefined') { - return self; - } - if (typeof window !== 'undefined') { - return window; - } - if (typeof __webpack_require__.g !== 'undefined') { - return __webpack_require__.g; - } - throw new Error('Unable to locate global object.'); -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @fileoverview Standardized Firebase Error. - * - * Usage: - * - * // Typescript string literals for type-safe codes - * type Err = - * 'unknown' | - * 'object-not-found' - * ; - * - * // Closure enum for type-safe error codes - * // at-enum {string} - * var Err = { - * UNKNOWN: 'unknown', - * OBJECT_NOT_FOUND: 'object-not-found', - * } - * - * let errors: Map = { - * 'generic-error': "Unknown error", - * 'file-not-found': "Could not find file: {$file}", - * }; - * - * // Type-safe function - must pass a valid error code as param. - * let error = new ErrorFactory('service', 'Service', errors); - * - * ... - * throw error.create(Err.GENERIC); - * ... - * throw error.create(Err.FILE_NOT_FOUND, {'file': fileName}); - * ... - * // Service: Could not file file: foo.txt (service/file-not-found). - * - * catch (e) { - * assert(e.message === "Could not find file: foo.txt."); - * if (e.code === 'service/file-not-found') { - * console.log("Could not read file: " + e['file']); - * } - * } - */ -const ERROR_NAME = 'FirebaseError'; -// Based on code from: -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Custom_Error_Types -class FirebaseError extends Error { - constructor( - /** The error code for this error. */ - code, message, - /** Custom data for this error. */ - customData) { - super(message); - this.code = code; - this.customData = customData; - /** The custom name for all FirebaseErrors. */ - this.name = ERROR_NAME; - // Fix For ES5 - // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work - Object.setPrototypeOf(this, FirebaseError.prototype); - // Maintains proper stack trace for where our error was thrown. - // Only available on V8. - if (Error.captureStackTrace) { - Error.captureStackTrace(this, ErrorFactory.prototype.create); - } - } -} -class ErrorFactory { - constructor(service, serviceName, errors) { - this.service = service; - this.serviceName = serviceName; - this.errors = errors; - } - create(code, ...data) { - const customData = data[0] || {}; - const fullCode = `${this.service}/${code}`; - const template = this.errors[code]; - const message = template ? replaceTemplate(template, customData) : 'Error'; - // Service Name: Error message (service/code). - const fullMessage = `${this.serviceName}: ${message} (${fullCode}).`; - const error = new FirebaseError(fullCode, fullMessage, customData); - return error; - } -} -function replaceTemplate(template, data) { - return template.replace(PATTERN, (_, key) => { - const value = data[key]; - return value != null ? String(value) : `<${key}?>`; - }); -} -const PATTERN = /\{\$([^}]+)}/g; - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Evaluates a JSON string into a javascript object. - * - * @param {string} str A string containing JSON. - * @return {*} The javascript object representing the specified JSON. - */ -function jsonEval(str) { - return JSON.parse(str); -} -/** - * Returns JSON representing a javascript object. - * @param {*} data Javascript object to be stringified. - * @return {string} The JSON contents of the object. - */ -function stringify(data) { - return JSON.stringify(data); -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Decodes a Firebase auth. token into constituent parts. - * - * Notes: - * - May return with invalid / incomplete claims if there's no native base64 decoding support. - * - Doesn't check if the token is actually valid. - */ -const decode = function (token) { - let header = {}, claims = {}, data = {}, signature = ''; - try { - const parts = token.split('.'); - header = jsonEval(base64Decode(parts[0]) || ''); - claims = jsonEval(base64Decode(parts[1]) || ''); - signature = parts[2]; - data = claims['d'] || {}; - delete claims['d']; - } - catch (e) { } - return { - header, - claims, - data, - signature - }; -}; -/** - * Decodes a Firebase auth. token and checks the validity of its time-based claims. Will return true if the - * token is within the time window authorized by the 'nbf' (not-before) and 'iat' (issued-at) claims. - * - * Notes: - * - May return a false negative if there's no native base64 decoding support. - * - Doesn't check if the token is actually valid. - */ -const isValidTimestamp = function (token) { - const claims = decode(token).claims; - const now = Math.floor(new Date().getTime() / 1000); - let validSince = 0, validUntil = 0; - if (typeof claims === 'object') { - if (claims.hasOwnProperty('nbf')) { - validSince = claims['nbf']; - } - else if (claims.hasOwnProperty('iat')) { - validSince = claims['iat']; - } - if (claims.hasOwnProperty('exp')) { - validUntil = claims['exp']; - } - else { - // token will expire after 24h by default - validUntil = validSince + 86400; - } - } - return (!!now && - !!validSince && - !!validUntil && - now >= validSince && - now <= validUntil); -}; -/** - * Decodes a Firebase auth. token and returns its issued at time if valid, null otherwise. - * - * Notes: - * - May return null if there's no native base64 decoding support. - * - Doesn't check if the token is actually valid. - */ -const issuedAtTime = function (token) { - const claims = decode(token).claims; - if (typeof claims === 'object' && claims.hasOwnProperty('iat')) { - return claims['iat']; - } - return null; -}; -/** - * Decodes a Firebase auth. token and checks the validity of its format. Expects a valid issued-at time. - * - * Notes: - * - May return a false negative if there's no native base64 decoding support. - * - Doesn't check if the token is actually valid. - */ -const isValidFormat = function (token) { - const decoded = decode(token), claims = decoded.claims; - return !!claims && typeof claims === 'object' && claims.hasOwnProperty('iat'); -}; -/** - * Attempts to peer into an auth token and determine if it's an admin auth token by looking at the claims portion. - * - * Notes: - * - May return a false negative if there's no native base64 decoding support. - * - Doesn't check if the token is actually valid. - */ -const isAdmin = function (token) { - const claims = decode(token).claims; - return typeof claims === 'object' && claims['admin'] === true; -}; - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function contains(obj, key) { - return Object.prototype.hasOwnProperty.call(obj, key); -} -function safeGet(obj, key) { - if (Object.prototype.hasOwnProperty.call(obj, key)) { - return obj[key]; - } - else { - return undefined; - } -} -function isEmpty(obj) { - for (const key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) { - return false; - } - } - return true; -} -function map(obj, fn, contextObj) { - const res = {}; - for (const key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) { - res[key] = fn.call(contextObj, obj[key], key, obj); - } - } - return res; -} -/** - * Deep equal two objects. Support Arrays and Objects. - */ -function deepEqual(a, b) { - if (a === b) { - return true; - } - const aKeys = Object.keys(a); - const bKeys = Object.keys(b); - for (const k of aKeys) { - if (!bKeys.includes(k)) { - return false; - } - const aProp = a[k]; - const bProp = b[k]; - if (isObject(aProp) && isObject(bProp)) { - if (!deepEqual(aProp, bProp)) { - return false; - } - } - else if (aProp !== bProp) { - return false; - } - } - for (const k of bKeys) { - if (!aKeys.includes(k)) { - return false; - } - } - return true; -} -function isObject(thing) { - return thing !== null && typeof thing === 'object'; -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Returns a querystring-formatted string (e.g. &arg=val&arg2=val2) from a - * params object (e.g. {arg: 'val', arg2: 'val2'}) - * Note: You must prepend it with ? when adding it to a URL. - */ -function querystring(querystringParams) { - const params = []; - for (const [key, value] of Object.entries(querystringParams)) { - if (Array.isArray(value)) { - value.forEach(arrayVal => { - params.push(encodeURIComponent(key) + '=' + encodeURIComponent(arrayVal)); - }); - } - else { - params.push(encodeURIComponent(key) + '=' + encodeURIComponent(value)); - } - } - return params.length ? '&' + params.join('&') : ''; -} -/** - * Decodes a querystring (e.g. ?arg=val&arg2=val2) into a params object - * (e.g. {arg: 'val', arg2: 'val2'}) - */ -function querystringDecode(querystring) { - const obj = {}; - const tokens = querystring.replace(/^\?/, '').split('&'); - tokens.forEach(token => { - if (token) { - const [key, value] = token.split('='); - obj[decodeURIComponent(key)] = decodeURIComponent(value); - } - }); - return obj; -} -/** - * Extract the query string part of a URL, including the leading question mark (if present). - */ -function extractQuerystring(url) { - const queryStart = url.indexOf('?'); - if (!queryStart) { - return ''; - } - const fragmentStart = url.indexOf('#', queryStart); - return url.substring(queryStart, fragmentStart > 0 ? fragmentStart : undefined); -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @fileoverview SHA-1 cryptographic hash. - * Variable names follow the notation in FIPS PUB 180-3: - * http://csrc.nist.gov/publications/fips/fips180-3/fips180-3_final.pdf. - * - * Usage: - * var sha1 = new sha1(); - * sha1.update(bytes); - * var hash = sha1.digest(); - * - * Performance: - * Chrome 23: ~400 Mbit/s - * Firefox 16: ~250 Mbit/s - * - */ -/** - * SHA-1 cryptographic hash constructor. - * - * The properties declared here are discussed in the above algorithm document. - * @constructor - * @final - * @struct - */ -class Sha1 { - constructor() { - /** - * Holds the previous values of accumulated variables a-e in the compress_ - * function. - * @private - */ - this.chain_ = []; - /** - * A buffer holding the partially computed hash result. - * @private - */ - this.buf_ = []; - /** - * An array of 80 bytes, each a part of the message to be hashed. Referred to - * as the message schedule in the docs. - * @private - */ - this.W_ = []; - /** - * Contains data needed to pad messages less than 64 bytes. - * @private - */ - this.pad_ = []; - /** - * @private {number} - */ - this.inbuf_ = 0; - /** - * @private {number} - */ - this.total_ = 0; - this.blockSize = 512 / 8; - this.pad_[0] = 128; - for (let i = 1; i < this.blockSize; ++i) { - this.pad_[i] = 0; - } - this.reset(); - } - reset() { - this.chain_[0] = 0x67452301; - this.chain_[1] = 0xefcdab89; - this.chain_[2] = 0x98badcfe; - this.chain_[3] = 0x10325476; - this.chain_[4] = 0xc3d2e1f0; - this.inbuf_ = 0; - this.total_ = 0; - } - /** - * Internal compress helper function. - * @param buf Block to compress. - * @param offset Offset of the block in the buffer. - * @private - */ - compress_(buf, offset) { - if (!offset) { - offset = 0; - } - const W = this.W_; - // get 16 big endian words - if (typeof buf === 'string') { - for (let i = 0; i < 16; i++) { - // TODO(user): [bug 8140122] Recent versions of Safari for Mac OS and iOS - // have a bug that turns the post-increment ++ operator into pre-increment - // during JIT compilation. We have code that depends heavily on SHA-1 for - // correctness and which is affected by this bug, so I've removed all uses - // of post-increment ++ in which the result value is used. We can revert - // this change once the Safari bug - // (https://bugs.webkit.org/show_bug.cgi?id=109036) has been fixed and - // most clients have been updated. - W[i] = - (buf.charCodeAt(offset) << 24) | - (buf.charCodeAt(offset + 1) << 16) | - (buf.charCodeAt(offset + 2) << 8) | - buf.charCodeAt(offset + 3); - offset += 4; - } - } - else { - for (let i = 0; i < 16; i++) { - W[i] = - (buf[offset] << 24) | - (buf[offset + 1] << 16) | - (buf[offset + 2] << 8) | - buf[offset + 3]; - offset += 4; - } - } - // expand to 80 words - for (let i = 16; i < 80; i++) { - const t = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]; - W[i] = ((t << 1) | (t >>> 31)) & 0xffffffff; - } - let a = this.chain_[0]; - let b = this.chain_[1]; - let c = this.chain_[2]; - let d = this.chain_[3]; - let e = this.chain_[4]; - let f, k; - // TODO(user): Try to unroll this loop to speed up the computation. - for (let i = 0; i < 80; i++) { - if (i < 40) { - if (i < 20) { - f = d ^ (b & (c ^ d)); - k = 0x5a827999; - } - else { - f = b ^ c ^ d; - k = 0x6ed9eba1; - } - } - else { - if (i < 60) { - f = (b & c) | (d & (b | c)); - k = 0x8f1bbcdc; - } - else { - f = b ^ c ^ d; - k = 0xca62c1d6; - } - } - const t = (((a << 5) | (a >>> 27)) + f + e + k + W[i]) & 0xffffffff; - e = d; - d = c; - c = ((b << 30) | (b >>> 2)) & 0xffffffff; - b = a; - a = t; - } - this.chain_[0] = (this.chain_[0] + a) & 0xffffffff; - this.chain_[1] = (this.chain_[1] + b) & 0xffffffff; - this.chain_[2] = (this.chain_[2] + c) & 0xffffffff; - this.chain_[3] = (this.chain_[3] + d) & 0xffffffff; - this.chain_[4] = (this.chain_[4] + e) & 0xffffffff; - } - update(bytes, length) { - // TODO(johnlenz): tighten the function signature and remove this check - if (bytes == null) { - return; - } - if (length === undefined) { - length = bytes.length; - } - const lengthMinusBlock = length - this.blockSize; - let n = 0; - // Using local instead of member variables gives ~5% speedup on Firefox 16. - const buf = this.buf_; - let inbuf = this.inbuf_; - // The outer while loop should execute at most twice. - while (n < length) { - // When we have no data in the block to top up, we can directly process the - // input buffer (assuming it contains sufficient data). This gives ~25% - // speedup on Chrome 23 and ~15% speedup on Firefox 16, but requires that - // the data is provided in large chunks (or in multiples of 64 bytes). - if (inbuf === 0) { - while (n <= lengthMinusBlock) { - this.compress_(bytes, n); - n += this.blockSize; - } - } - if (typeof bytes === 'string') { - while (n < length) { - buf[inbuf] = bytes.charCodeAt(n); - ++inbuf; - ++n; - if (inbuf === this.blockSize) { - this.compress_(buf); - inbuf = 0; - // Jump to the outer loop so we use the full-block optimization. - break; - } - } - } - else { - while (n < length) { - buf[inbuf] = bytes[n]; - ++inbuf; - ++n; - if (inbuf === this.blockSize) { - this.compress_(buf); - inbuf = 0; - // Jump to the outer loop so we use the full-block optimization. - break; - } - } - } - } - this.inbuf_ = inbuf; - this.total_ += length; - } - /** @override */ - digest() { - const digest = []; - let totalBits = this.total_ * 8; - // Add pad 0x80 0x00*. - if (this.inbuf_ < 56) { - this.update(this.pad_, 56 - this.inbuf_); - } - else { - this.update(this.pad_, this.blockSize - (this.inbuf_ - 56)); - } - // Add # bits. - for (let i = this.blockSize - 1; i >= 56; i--) { - this.buf_[i] = totalBits & 255; - totalBits /= 256; // Don't use bit-shifting here! - } - this.compress_(this.buf_); - let n = 0; - for (let i = 0; i < 5; i++) { - for (let j = 24; j >= 0; j -= 8) { - digest[n] = (this.chain_[i] >> j) & 255; - ++n; - } - } - return digest; - } -} - -/** - * Helper to make a Subscribe function (just like Promise helps make a - * Thenable). - * - * @param executor Function which can make calls to a single Observer - * as a proxy. - * @param onNoObservers Callback when count of Observers goes to zero. - */ -function createSubscribe(executor, onNoObservers) { - const proxy = new ObserverProxy(executor, onNoObservers); - return proxy.subscribe.bind(proxy); -} -/** - * Implement fan-out for any number of Observers attached via a subscribe - * function. - */ -class ObserverProxy { - /** - * @param executor Function which can make calls to a single Observer - * as a proxy. - * @param onNoObservers Callback when count of Observers goes to zero. - */ - constructor(executor, onNoObservers) { - this.observers = []; - this.unsubscribes = []; - this.observerCount = 0; - // Micro-task scheduling by calling task.then(). - this.task = Promise.resolve(); - this.finalized = false; - this.onNoObservers = onNoObservers; - // Call the executor asynchronously so subscribers that are called - // synchronously after the creation of the subscribe function - // can still receive the very first value generated in the executor. - this.task - .then(() => { - executor(this); - }) - .catch(e => { - this.error(e); - }); - } - next(value) { - this.forEachObserver((observer) => { - observer.next(value); - }); - } - error(error) { - this.forEachObserver((observer) => { - observer.error(error); - }); - this.close(error); - } - complete() { - this.forEachObserver((observer) => { - observer.complete(); - }); - this.close(); - } - /** - * Subscribe function that can be used to add an Observer to the fan-out list. - * - * - We require that no event is sent to a subscriber sychronously to their - * call to subscribe(). - */ - subscribe(nextOrObserver, error, complete) { - let observer; - if (nextOrObserver === undefined && - error === undefined && - complete === undefined) { - throw new Error('Missing Observer.'); - } - // Assemble an Observer object when passed as callback functions. - if (implementsAnyMethods(nextOrObserver, [ - 'next', - 'error', - 'complete' - ])) { - observer = nextOrObserver; - } - else { - observer = { - next: nextOrObserver, - error, - complete - }; - } - if (observer.next === undefined) { - observer.next = noop; - } - if (observer.error === undefined) { - observer.error = noop; - } - if (observer.complete === undefined) { - observer.complete = noop; - } - const unsub = this.unsubscribeOne.bind(this, this.observers.length); - // Attempt to subscribe to a terminated Observable - we - // just respond to the Observer with the final error or complete - // event. - if (this.finalized) { - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.task.then(() => { - try { - if (this.finalError) { - observer.error(this.finalError); - } - else { - observer.complete(); - } - } - catch (e) { - // nothing - } - return; - }); - } - this.observers.push(observer); - return unsub; - } - // Unsubscribe is synchronous - we guarantee that no events are sent to - // any unsubscribed Observer. - unsubscribeOne(i) { - if (this.observers === undefined || this.observers[i] === undefined) { - return; - } - delete this.observers[i]; - this.observerCount -= 1; - if (this.observerCount === 0 && this.onNoObservers !== undefined) { - this.onNoObservers(this); - } - } - forEachObserver(fn) { - if (this.finalized) { - // Already closed by previous event....just eat the additional values. - return; - } - // Since sendOne calls asynchronously - there is no chance that - // this.observers will become undefined. - for (let i = 0; i < this.observers.length; i++) { - this.sendOne(i, fn); - } - } - // Call the Observer via one of it's callback function. We are careful to - // confirm that the observe has not been unsubscribed since this asynchronous - // function had been queued. - sendOne(i, fn) { - // Execute the callback asynchronously - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.task.then(() => { - if (this.observers !== undefined && this.observers[i] !== undefined) { - try { - fn(this.observers[i]); - } - catch (e) { - // Ignore exceptions raised in Observers or missing methods of an - // Observer. - // Log error to console. b/31404806 - if (typeof console !== 'undefined' && console.error) { - console.error(e); - } - } - } - }); - } - close(err) { - if (this.finalized) { - return; - } - this.finalized = true; - if (err !== undefined) { - this.finalError = err; - } - // Proxy is no longer needed - garbage collect references - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.task.then(() => { - this.observers = undefined; - this.onNoObservers = undefined; - }); - } -} -/** Turn synchronous function into one called asynchronously. */ -// eslint-disable-next-line @typescript-eslint/ban-types -function async(fn, onError) { - return (...args) => { - Promise.resolve(true) - .then(() => { - fn(...args); - }) - .catch((error) => { - if (onError) { - onError(error); - } - }); - }; -} -/** - * Return true if the object passed in implements any of the named methods. - */ -function implementsAnyMethods(obj, methods) { - if (typeof obj !== 'object' || obj === null) { - return false; - } - for (const method of methods) { - if (method in obj && typeof obj[method] === 'function') { - return true; - } - } - return false; -} -function noop() { - // do nothing -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Check to make sure the appropriate number of arguments are provided for a public function. - * Throws an error if it fails. - * - * @param fnName The function name - * @param minCount The minimum number of arguments to allow for the function call - * @param maxCount The maximum number of argument to allow for the function call - * @param argCount The actual number of arguments provided. - */ -const validateArgCount = function (fnName, minCount, maxCount, argCount) { - let argError; - if (argCount < minCount) { - argError = 'at least ' + minCount; - } - else if (argCount > maxCount) { - argError = maxCount === 0 ? 'none' : 'no more than ' + maxCount; - } - if (argError) { - const error = fnName + - ' failed: Was called with ' + - argCount + - (argCount === 1 ? ' argument.' : ' arguments.') + - ' Expects ' + - argError + - '.'; - throw new Error(error); - } -}; -/** - * Generates a string to prefix an error message about failed argument validation - * - * @param fnName The function name - * @param argName The name of the argument - * @return The prefix to add to the error thrown for validation. - */ -function errorPrefix(fnName, argName) { - return `${fnName} failed: ${argName} argument `; -} -/** - * @param fnName - * @param argumentNumber - * @param namespace - * @param optional - */ -function validateNamespace(fnName, namespace, optional) { - if (optional && !namespace) { - return; - } - if (typeof namespace !== 'string') { - //TODO: I should do more validation here. We only allow certain chars in namespaces. - throw new Error(errorPrefix(fnName, 'namespace') + 'must be a valid firebase namespace.'); - } -} -function validateCallback(fnName, argumentName, -// eslint-disable-next-line @typescript-eslint/ban-types -callback, optional) { - if (optional && !callback) { - return; - } - if (typeof callback !== 'function') { - throw new Error(errorPrefix(fnName, argumentName) + 'must be a valid function.'); - } -} -function validateContextObject(fnName, argumentName, context, optional) { - if (optional && !context) { - return; - } - if (typeof context !== 'object' || context === null) { - throw new Error(errorPrefix(fnName, argumentName) + 'must be a valid context object.'); - } -} - -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -// Code originally came from goog.crypt.stringToUtf8ByteArray, but for some reason they -// automatically replaced '\r\n' with '\n', and they didn't handle surrogate pairs, -// so it's been modified. -// Note that not all Unicode characters appear as single characters in JavaScript strings. -// fromCharCode returns the UTF-16 encoding of a character - so some Unicode characters -// use 2 characters in Javascript. All 4-byte UTF-8 characters begin with a first -// character in the range 0xD800 - 0xDBFF (the first character of a so-called surrogate -// pair). -// See http://www.ecma-international.org/ecma-262/5.1/#sec-15.1.3 -/** - * @param {string} str - * @return {Array} - */ -const stringToByteArray = function (str) { - const out = []; - let p = 0; - for (let i = 0; i < str.length; i++) { - let c = str.charCodeAt(i); - // Is this the lead surrogate in a surrogate pair? - if (c >= 0xd800 && c <= 0xdbff) { - const high = c - 0xd800; // the high 10 bits. - i++; - assert(i < str.length, 'Surrogate pair missing trail surrogate.'); - const low = str.charCodeAt(i) - 0xdc00; // the low 10 bits. - c = 0x10000 + (high << 10) + low; - } - if (c < 128) { - out[p++] = c; - } - else if (c < 2048) { - out[p++] = (c >> 6) | 192; - out[p++] = (c & 63) | 128; - } - else if (c < 65536) { - out[p++] = (c >> 12) | 224; - out[p++] = ((c >> 6) & 63) | 128; - out[p++] = (c & 63) | 128; - } - else { - out[p++] = (c >> 18) | 240; - out[p++] = ((c >> 12) & 63) | 128; - out[p++] = ((c >> 6) & 63) | 128; - out[p++] = (c & 63) | 128; - } - } - return out; -}; -/** - * Calculate length without actually converting; useful for doing cheaper validation. - * @param {string} str - * @return {number} - */ -const stringLength = function (str) { - let p = 0; - for (let i = 0; i < str.length; i++) { - const c = str.charCodeAt(i); - if (c < 128) { - p++; - } - else if (c < 2048) { - p += 2; - } - else if (c >= 0xd800 && c <= 0xdbff) { - // Lead surrogate of a surrogate pair. The pair together will take 4 bytes to represent. - p += 4; - i++; // skip trail surrogate. - } - else { - p += 3; - } - } - return p; -}; - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * The amount of milliseconds to exponentially increase. - */ -const DEFAULT_INTERVAL_MILLIS = 1000; -/** - * The factor to backoff by. - * Should be a number greater than 1. - */ -const DEFAULT_BACKOFF_FACTOR = 2; -/** - * The maximum milliseconds to increase to. - * - *

Visible for testing - */ -const MAX_VALUE_MILLIS = 4 * 60 * 60 * 1000; // Four hours, like iOS and Android. -/** - * The percentage of backoff time to randomize by. - * See - * http://go/safe-client-behavior#step-1-determine-the-appropriate-retry-interval-to-handle-spike-traffic - * for context. - * - *

Visible for testing - */ -const RANDOM_FACTOR = 0.5; -/** - * Based on the backoff method from - * https://github.com/google/closure-library/blob/master/closure/goog/math/exponentialbackoff.js. - * Extracted here so we don't need to pass metadata and a stateful ExponentialBackoff object around. - */ -function calculateBackoffMillis(backoffCount, intervalMillis = DEFAULT_INTERVAL_MILLIS, backoffFactor = DEFAULT_BACKOFF_FACTOR) { - // Calculates an exponentially increasing value. - // Deviation: calculates value from count and a constant interval, so we only need to save value - // and count to restore state. - const currBaseValue = intervalMillis * Math.pow(backoffFactor, backoffCount); - // A random "fuzz" to avoid waves of retries. - // Deviation: randomFactor is required. - const randomWait = Math.round( - // A fraction of the backoff value to add/subtract. - // Deviation: changes multiplication order to improve readability. - RANDOM_FACTOR * - currBaseValue * - // A random float (rounded to int by Math.round above) in the range [-1, 1]. Determines - // if we add or subtract. - (Math.random() - 0.5) * - 2); - // Limits backoff to max to avoid effectively permanent backoff. - return Math.min(MAX_VALUE_MILLIS, currBaseValue + randomWait); -} - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Provide English ordinal letters after a number - */ -function ordinal(i) { - if (!Number.isFinite(i)) { - return `${i}`; - } - return i + indicator(i); -} -function indicator(i) { - i = Math.abs(i); - const cent = i % 100; - if (cent >= 10 && cent <= 20) { - return 'th'; - } - const dec = i % 10; - if (dec === 1) { - return 'st'; - } - if (dec === 2) { - return 'nd'; - } - if (dec === 3) { - return 'rd'; - } - return 'th'; -} - -/** - * @license - * Copyright 2021 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function getModularInstance(service) { - if (service && service._delegate) { - return service._delegate; - } - else { - return service; - } -} - -/** - * @license - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function promisifyRequest(request, errorMessage) { - return new Promise((resolve, reject) => { - request.onsuccess = event => { - resolve(event.target.result); - }; - request.onerror = event => { - var _a; - reject(`${errorMessage}: ${(_a = event.target.error) === null || _a === void 0 ? void 0 : _a.message}`); - }; - }); -} -class DBWrapper { - constructor(_db) { - this._db = _db; - this.objectStoreNames = this._db.objectStoreNames; - } - transaction(storeNames, mode) { - return new TransactionWrapper(this._db.transaction.call(this._db, storeNames, mode)); - } - createObjectStore(storeName, options) { - return new ObjectStoreWrapper(this._db.createObjectStore(storeName, options)); - } - close() { - this._db.close(); - } -} -class TransactionWrapper { - constructor(_transaction) { - this._transaction = _transaction; - this.complete = new Promise((resolve, reject) => { - this._transaction.oncomplete = function () { - resolve(); - }; - this._transaction.onerror = () => { - reject(this._transaction.error); - }; - this._transaction.onabort = () => { - reject(this._transaction.error); - }; - }); - } - objectStore(storeName) { - return new ObjectStoreWrapper(this._transaction.objectStore(storeName)); - } -} -class ObjectStoreWrapper { - constructor(_store) { - this._store = _store; - } - index(name) { - return new IndexWrapper(this._store.index(name)); - } - createIndex(name, keypath, options) { - return new IndexWrapper(this._store.createIndex(name, keypath, options)); - } - get(key) { - const request = this._store.get(key); - return promisifyRequest(request, 'Error reading from IndexedDB'); - } - put(value, key) { - const request = this._store.put(value, key); - return promisifyRequest(request, 'Error writing to IndexedDB'); - } - delete(key) { - const request = this._store.delete(key); - return promisifyRequest(request, 'Error deleting from IndexedDB'); - } - clear() { - const request = this._store.clear(); - return promisifyRequest(request, 'Error clearing IndexedDB object store'); - } -} -class IndexWrapper { - constructor(_index) { - this._index = _index; - } - get(key) { - const request = this._index.get(key); - return promisifyRequest(request, 'Error reading from IndexedDB'); - } -} -function openDB(dbName, dbVersion, upgradeCallback) { - return new Promise((resolve, reject) => { - try { - const request = indexedDB.open(dbName, dbVersion); - request.onsuccess = event => { - resolve(new DBWrapper(event.target.result)); - }; - request.onerror = event => { - var _a; - reject(`Error opening indexedDB: ${(_a = event.target.error) === null || _a === void 0 ? void 0 : _a.message}`); - }; - request.onupgradeneeded = event => { - upgradeCallback(new DBWrapper(request.result), event.oldVersion, event.newVersion, new TransactionWrapper(request.transaction)); - }; - } - catch (e) { - reject(`Error opening indexedDB: ${e.message}`); - } - }); -} -async function deleteDB(dbName) { - return new Promise((resolve, reject) => { - try { - const request = indexedDB.deleteDatabase(dbName); - request.onsuccess = () => { - resolve(); - }; - request.onerror = event => { - var _a; - reject(`Error deleting indexedDB database "${dbName}": ${(_a = event.target.error) === null || _a === void 0 ? void 0 : _a.message}`); - }; - } - catch (e) { - reject(`Error deleting indexedDB database "${dbName}": ${e.message}`); - } - }); -} - - -//# sourceMappingURL=index.esm2017.js.map - - -/***/ }), - -/***/ "./node_modules/@firebase/webchannel-wrapper/dist/index.esm2017.js": -/*!*************************************************************************!*\ - !*** ./node_modules/@firebase/webchannel-wrapper/dist/index.esm2017.js ***! - \*************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "ErrorCode": () => (/* binding */ ErrorCode), -/* harmony export */ "Event": () => (/* binding */ Event), -/* harmony export */ "EventType": () => (/* binding */ EventType), -/* harmony export */ "FetchXmlHttpFactory": () => (/* binding */ FetchXmlHttpFactory), -/* harmony export */ "Stat": () => (/* binding */ Stat), -/* harmony export */ "WebChannel": () => (/* binding */ WebChannel), -/* harmony export */ "XhrIo": () => (/* binding */ XhrIo), -/* harmony export */ "createWebChannelTransport": () => (/* binding */ createWebChannelTransport), -/* harmony export */ "default": () => (/* binding */ esm), -/* harmony export */ "getStatEventTarget": () => (/* binding */ getStatEventTarget) -/* harmony export */ }); -var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {}; - -var esm = {}; - -/* - - Copyright The Closure Library Authors. - SPDX-License-Identifier: Apache-2.0 -*/ -var k,goog=goog||{},l=commonjsGlobal||self;function aa(){}function ba(a){var b=typeof a;b="object"!=b?b:a?Array.isArray(a)?"array":b:"null";return "array"==b||"object"==b&&"number"==typeof a.length}function p(a){var b=typeof a;return "object"==b&&null!=a||"function"==b}function da(a){return Object.prototype.hasOwnProperty.call(a,ea)&&a[ea]||(a[ea]=++fa)}var ea="closure_uid_"+(1E9*Math.random()>>>0),fa=0;function ha(a,b,c){return a.call.apply(a.bind,arguments)} -function ia(a,b,c){if(!a)throw Error();if(2b?null:"string"===typeof a?a.charAt(b):a[b]}function qa(a){return Array.prototype.concat.apply([],arguments)}function ra(a){const b=a.length;if(0b?1:0}var x;a:{var va=l.navigator;if(va){var wa=va.userAgent;if(wa){x=wa;break a}}x="";}function xa(a,b,c){for(const d in a)b.call(c,a[d],d,a);}function ya(a){const b={};for(const c in a)b[c]=a[c];return b}var za="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" ");function Aa(a,b){let c,d;for(let e=1;eparseFloat(Oa)){Na=String(Qa);break a}}Na=Oa;}var Ga={}; -function Ra(){return Fa(function(){let a=0;const b=ta(String(Na)).split("."),c=ta("9").split("."),d=Math.max(b.length,c.length);for(let h=0;0==a&&h>>0);function hb(a){if("function"===typeof a)return a;a[pb]||(a[pb]=function(b){return a.handleEvent(b)});return a[pb]}function C(){v.call(this);this.i=new $a(this);this.P=this;this.I=null;}t(C,v);C.prototype[B]=!0;C.prototype.removeEventListener=function(a,b,c,d){nb(this,a,b,c,d);}; -function D(a,b){var c,d=a.I;if(d)for(c=[];d;d=d.I)c.push(d);a=a.P;d=b.type||b;if("string"===typeof b)b=new z(b,a);else if(b instanceof z)b.target=b.target||a;else {var e=b;b=new z(d,a);Aa(b,e);}e=!0;if(c)for(var f=c.length-1;0<=f;f--){var h=b.g=c[f];e=qb(h,d,!0,b)&&e;}h=b.g=a;e=qb(h,d,!0,b)&&e;e=qb(h,d,!1,b)&&e;if(c)for(f=0;fnew wb,a=>a.reset()); -class wb{constructor(){this.next=this.g=this.h=null;}set(a,b){this.h=a;this.g=b;this.next=null;}reset(){this.next=this.g=this.h=null;}}function yb(a){l.setTimeout(()=>{throw a;},0);}function zb(a,b){Ab||Bb();Cb||(Ab(),Cb=!0);tb.add(a,b);}var Ab;function Bb(){var a=l.Promise.resolve(void 0);Ab=function(){a.then(Db);};}var Cb=!1,tb=new ub;function Db(){for(var a;a=sb();){try{a.h.call(a.g);}catch(c){yb(c);}var b=vb;b.j(a);100>b.h&&(b.h++,a.next=b.g,b.g=a);}Cb=!1;}function Eb(a,b){C.call(this);this.h=a||1;this.g=b||l;this.j=q(this.kb,this);this.l=Date.now();}t(Eb,C);k=Eb.prototype;k.da=!1;k.S=null;k.kb=function(){if(this.da){var a=Date.now()-this.l;0{a.g=null;a.i&&(a.i=!1,Hb(a));},a.j);const b=a.h;a.h=null;a.m.apply(null,b);}class Ib extends v{constructor(a,b){super();this.m=a;this.j=b;this.h=null;this.i=!1;this.g=null;}l(a){this.h=arguments;this.g?this.i=!0:Hb(this);}M(){super.M();this.g&&(l.clearTimeout(this.g),this.g=null,this.i=!1,this.h=null);}}function E(a){v.call(this);this.h=a;this.g={};}t(E,v);var Jb=[];function Kb(a,b,c,d){Array.isArray(c)||(c&&(Jb[0]=c.toString()),c=Jb);for(var e=0;ed.length)){var e=d[1];if(Array.isArray(e)&&!(1>e.length)){var f=e[0];if("noop"!=f&&"stop"!=f&&"close"!=f)for(var h=1;hr)&&(3!=r||Ja||this.g&&(this.h.h||this.g.ga()||oc(this.g)))){this.I||4!=r||7==b||(8==b||0>=G?I(3):I(2));pc(this);var c=this.g.ba();this.N=c;b:if(qc(this)){var d=oc(this.g);a="";var e=d.length,f=4==O(this.g);if(!this.h.i){if("undefined"===typeof TextDecoder){P(this);rc(this);var h="";break b}this.h.i=new l.TextDecoder;}for(b=0;bb.length)return hc;b=b.substr(d,c);a.C=d+c;return b}k.cancel=function(){this.I=!0;P(this);};function lc(a){a.Y=Date.now()+a.P;xc(a,a.P);} -function xc(a,b){if(null!=a.B)throw Error("WatchDog timer not null");a.B=K(q(a.eb,a),b);}function pc(a){a.B&&(l.clearTimeout(a.B),a.B=null);}k.eb=function(){this.B=null;const a=Date.now();0<=a-this.Y?(Qb(this.j,this.A),2!=this.K&&(I(3),J(17)),P(this),this.o=2,rc(this)):xc(this,this.Y-a);};function rc(a){0==a.l.G||a.I||uc(a.l,a);}function P(a){pc(a);var b=a.L;b&&"function"==typeof b.na&&b.na();a.L=null;Fb(a.W);Lb(a.V);a.g&&(b=a.g,a.g=null,b.abort(),b.na());} -function sc(a,b){try{var c=a.l;if(0!=c.G&&(c.g==a||yc(c.i,a)))if(c.I=a.N,!a.J&&yc(c.i,a)&&3==c.G){try{var d=c.Ca.g.parse(b);}catch(m){d=null;}if(Array.isArray(d)&&3==d.length){var e=d;if(0==e[0])a:{if(!c.u){if(c.g)if(c.g.F+3E3e[2]&&c.N&&0==c.A&&!c.v&&(c.v=K(q(c.ab,c),6E3));if(1>=Cc(c.i)&&c.ka){try{c.ka();}catch(m){}c.ka=void 0;}}else Q(c,11);}else if((a.J||c.g==a)&&zc(c),!sa(b))for(e=c.Ca.g.parse(b),b=0;bb)throw Error("Bad port number "+b);a.m=b;}else a.m=null;}function Sc(a,b,c){b instanceof Rc?(a.h=b,Zc(a.h,a.g)):(c||(b=Uc(b,$c)),a.h=new Rc(b,a.g));}function R(a,b,c){a.h.set(b,c);}function jc(a){R(a,"zx",Math.floor(2147483648*Math.random()).toString(36)+Math.abs(Math.floor(2147483648*Math.random())^Date.now()).toString(36));return a} -function ad(a){return a instanceof U?N(a):new U(a,void 0)}function bd(a,b,c,d){var e=new U(null,void 0);a&&Oc(e,a);b&&Pc(e,b);c&&Qc(e,c);d&&(e.l=d);return e}function Tc(a,b){return a?b?decodeURI(a.replace(/%25/g,"%2525")):decodeURIComponent(a):""}function Uc(a,b,c){return "string"===typeof a?(a=encodeURI(a).replace(b,cd),c&&(a=a.replace(/%25([0-9a-fA-F]{2})/g,"%$1")),a):null}function cd(a){a=a.charCodeAt(0);return "%"+(a>>4&15).toString(16)+(a&15).toString(16)} -var Vc=/[#\/\?@]/g,Xc=/[#\?:]/g,Wc=/[#\?]/g,$c=/[#\?@]/g,Yc=/#/g;function Rc(a,b){this.h=this.g=null;this.i=a||null;this.j=!!b;}function V(a){a.g||(a.g=new S,a.h=0,a.i&&Nc(a.i,function(b,c){a.add(decodeURIComponent(b.replace(/\+/g," ")),c);}));}k=Rc.prototype;k.add=function(a,b){V(this);this.i=null;a=W(this,a);var c=this.g.get(a);c||this.g.set(a,c=[]);c.push(b);this.h+=1;return this}; -function dd(a,b){V(a);b=W(a,b);T(a.g.h,b)&&(a.i=null,a.h-=a.g.get(b).length,a=a.g,T(a.h,b)&&(delete a.h[b],a.i--,a.g.length>2*a.i&&Lc(a)));}function ed(a,b){V(a);b=W(a,b);return T(a.g.h,b)}k.forEach=function(a,b){V(this);this.g.forEach(function(c,d){na(c,function(e){a.call(b,e,d,this);},this);},this);};k.T=function(){V(this);for(var a=this.g.R(),b=this.g.T(),c=[],d=0;d=a.j:!1}function Cc(a){return a.h?1:a.g?a.g.size:0}function yc(a,b){return a.h?a.h==b:a.g?a.g.has(b):!1}function Dc(a,b){a.g?a.g.add(b):a.h=b;} -function Fc(a,b){a.h&&a.h==b?a.h=null:a.g&&a.g.has(b)&&a.g.delete(b);}gd.prototype.cancel=function(){this.i=jd(this);if(this.h)this.h.cancel(),this.h=null;else if(this.g&&0!==this.g.size){for(const a of this.g.values())a.cancel();this.g.clear();}};function jd(a){if(null!=a.h)return a.i.concat(a.h.D);if(null!=a.g&&0!==a.g.size){let b=a.i;for(const c of a.g.values())b=b.concat(c.D);return b}return ra(a.i)}function kd(){}kd.prototype.stringify=function(a){return l.JSON.stringify(a,void 0)};kd.prototype.parse=function(a){return l.JSON.parse(a,void 0)};function ld(){this.g=new kd;}function md(a,b,c){const d=c||"";try{Kc(a,function(e,f){let h=e;p(e)&&(h=rb(e));b.push(d+f+"="+encodeURIComponent(h));});}catch(e){throw b.push(d+"type="+encodeURIComponent("_badmap")),e;}}function nd(a,b){const c=new Mb;if(l.Image){const d=new Image;d.onload=ja(od,c,d,"TestLoadImage: loaded",!0,b);d.onerror=ja(od,c,d,"TestLoadImage: error",!1,b);d.onabort=ja(od,c,d,"TestLoadImage: abort",!1,b);d.ontimeout=ja(od,c,d,"TestLoadImage: timeout",!1,b);l.setTimeout(function(){if(d.ontimeout)d.ontimeout();},1E4);d.src=a;}else b(!1);}function od(a,b,c,d,e){try{b.onload=null,b.onerror=null,b.onabort=null,b.ontimeout=null,e(d);}catch(f){}}function pd(a){this.l=a.$b||null;this.j=a.ib||!1;}t(pd,Yb);pd.prototype.g=function(){return new qd(this.l,this.j)};pd.prototype.i=function(a){return function(){return a}}({});function qd(a,b){C.call(this);this.D=a;this.u=b;this.m=void 0;this.readyState=rd;this.status=0;this.responseType=this.responseText=this.response=this.statusText="";this.onreadystatechange=null;this.v=new Headers;this.h=null;this.C="GET";this.B="";this.g=!1;this.A=this.j=this.l=null;}t(qd,C);var rd=0;k=qd.prototype; -k.open=function(a,b){if(this.readyState!=rd)throw this.abort(),Error("Error reopening a connection");this.C=a;this.B=b;this.readyState=1;sd(this);};k.send=function(a){if(1!=this.readyState)throw this.abort(),Error("need to call open() first. ");this.g=!0;const b={headers:this.v,method:this.C,credentials:this.m,cache:void 0};a&&(b.body=a);(this.D||l).fetch(new Request(this.B,b)).then(this.Va.bind(this),this.ha.bind(this));}; -k.abort=function(){this.response=this.responseText="";this.v=new Headers;this.status=0;this.j&&this.j.cancel("Request was aborted.");1<=this.readyState&&this.g&&4!=this.readyState&&(this.g=!1,td(this));this.readyState=rd;}; -k.Va=function(a){if(this.g&&(this.l=a,this.h||(this.status=this.l.status,this.statusText=this.l.statusText,this.h=a.headers,this.readyState=2,sd(this)),this.g&&(this.readyState=3,sd(this),this.g)))if("arraybuffer"===this.responseType)a.arrayBuffer().then(this.Ta.bind(this),this.ha.bind(this));else if("undefined"!==typeof l.ReadableStream&&"body"in a){this.j=a.body.getReader();if(this.u){if(this.responseType)throw Error('responseType must be empty for "streamBinaryChunks" mode responses.');this.response= -[];}else this.response=this.responseText="",this.A=new TextDecoder;ud(this);}else a.text().then(this.Ua.bind(this),this.ha.bind(this));};function ud(a){a.j.read().then(a.Sa.bind(a)).catch(a.ha.bind(a));}k.Sa=function(a){if(this.g){if(this.u&&a.value)this.response.push(a.value);else if(!this.u){var b=a.value?a.value:new Uint8Array(0);if(b=this.A.decode(b,{stream:!a.done}))this.response=this.responseText+=b;}a.done?td(this):sd(this);3==this.readyState&&ud(this);}}; -k.Ua=function(a){this.g&&(this.response=this.responseText=a,td(this));};k.Ta=function(a){this.g&&(this.response=a,td(this));};k.ha=function(){this.g&&td(this);};function td(a){a.readyState=4;a.l=null;a.j=null;a.A=null;sd(a);}k.setRequestHeader=function(a,b){this.v.append(a,b);};k.getResponseHeader=function(a){return this.h?this.h.get(a.toLowerCase())||"":""}; -k.getAllResponseHeaders=function(){if(!this.h)return "";const a=[],b=this.h.entries();for(var c=b.next();!c.done;)c=c.value,a.push(c[0]+": "+c[1]),c=b.next();return a.join("\r\n")};function sd(a){a.onreadystatechange&&a.onreadystatechange.call(a);}Object.defineProperty(qd.prototype,"withCredentials",{get:function(){return "include"===this.m},set:function(a){this.m=a?"include":"same-origin";}});var vd=l.JSON.parse;function X(a){C.call(this);this.headers=new S;this.u=a||null;this.h=!1;this.C=this.g=null;this.H="";this.m=0;this.j="";this.l=this.F=this.v=this.D=!1;this.B=0;this.A=null;this.J=wd;this.K=this.L=!1;}t(X,C);var wd="",xd=/^https?$/i,yd=["POST","PUT"];k=X.prototype; -k.ea=function(a,b,c,d){if(this.g)throw Error("[goog.net.XhrIo] Object is active with another request="+this.H+"; newUri="+a);b=b?b.toUpperCase():"GET";this.H=a;this.j="";this.m=0;this.D=!1;this.h=!0;this.g=this.u?this.u.g():cc.g();this.C=this.u?Zb(this.u):Zb(cc);this.g.onreadystatechange=q(this.Fa,this);try{this.F=!0,this.g.open(b,String(a),!0),this.F=!1;}catch(f){zd(this,f);return}a=c||"";const e=new S(this.headers);d&&Kc(d,function(f,h){e.set(h,f);});d=oa(e.T());c=l.FormData&&a instanceof l.FormData; -!(0<=ma(yd,b))||d||c||e.set("Content-Type","application/x-www-form-urlencoded;charset=utf-8");e.forEach(function(f,h){this.g.setRequestHeader(h,f);},this);this.J&&(this.g.responseType=this.J);"withCredentials"in this.g&&this.g.withCredentials!==this.L&&(this.g.withCredentials=this.L);try{Ad(this),0=a.i.j-(a.m?1:0))return !1;if(a.m)return a.l=b.D.concat(a.l),!0;if(1==a.G||2==a.G||a.C>=(a.Xa?0:a.Ya))return !1;a.m=K(q(a.Ha,a,b),Od(a,a.C));a.C++;return !0} -k.Ha=function(a){if(this.m)if(this.m=null,1==this.G){if(!a){this.V=Math.floor(1E5*Math.random());a=this.V++;const e=new M(this,this.h,a,void 0);let f=this.s;this.P&&(f?(f=ya(f),Aa(f,this.P)):f=this.P);null===this.o&&(e.H=f);if(this.ja)a:{var b=0;for(var c=0;cm)f=Math.max(0,e[u].h-100),n=!1;else try{md(r,h,"req"+m+"_");}catch(G){d&&d(r);}}if(n){d=h.join("&");break a}}}a=a.l.splice(0,c);b.D=a;return d}function Gc(a){a.g||a.u||(a.Y=1,zb(a.Ga,a),a.A=0);} -function Bc(a){if(a.g||a.u||3<=a.A)return !1;a.Y++;a.u=K(q(a.Ga,a),Od(a,a.A));a.A++;return !0}k.Ga=function(){this.u=null;Rd(this);if(this.$&&!(this.L||null==this.g||0>=this.O)){var a=2*this.O;this.h.info("BP detection timer enabled: "+a);this.B=K(q(this.bb,this),a);}};k.bb=function(){this.B&&(this.B=null,this.h.info("BP detection timeout reached."),this.h.info("Buffering proxy detected and switch to long-polling!"),this.N=!1,this.L=!0,J(10),Ac(this),Rd(this));}; -function wc(a){null!=a.B&&(l.clearTimeout(a.B),a.B=null);}function Rd(a){a.g=new M(a,a.h,"rpc",a.Y);null===a.o&&(a.g.H=a.s);a.g.O=0;var b=N(a.oa);R(b,"RID","rpc");R(b,"SID",a.J);R(b,"CI",a.N?"0":"1");R(b,"AID",a.U);Kd(a,b);R(b,"TYPE","xmlhttp");a.o&&a.s&&Gd(b,a.o,a.s);a.K&&a.g.setTimeout(a.K);var c=a.g;a=a.la;c.K=1;c.v=jc(N(b));c.s=null;c.U=!0;kc(c,a);}k.ab=function(){null!=this.v&&(this.v=null,Ac(this),Bc(this),J(19));};function zc(a){null!=a.v&&(l.clearTimeout(a.v),a.v=null);} -function uc(a,b){var c=null;if(a.g==b){zc(a);wc(a);a.g=null;var d=2;}else if(yc(a.i,b))c=b.D,Fc(a.i,b),d=1;else return;a.I=b.N;if(0!=a.G)if(b.i)if(1==d){c=b.s?b.s.length:0;b=Date.now()-b.F;var e=a.C;d=Sb();D(d,new Vb(d,c,b,e));Hc(a);}else Gc(a);else if(e=b.o,3==e||0==e&&0 { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "rootDoc": () => (/* binding */ rootDoc) -/* harmony export */ }); -/* harmony import */ var firebase_app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! firebase/app */ "./node_modules/firebase/app/dist/index.esm.js"); -/* harmony import */ var firebase_firestore__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! firebase/firestore */ "./node_modules/firebase/firestore/dist/index.esm.js"); -/* eslint-disable import/prefer-default-export */ - - -var firebaseConfig = { - apiKey: 'AIzaSyCX9WR-j9yv1giYeFsMpbjj2G3p7jNHxIU', - authDomain: 'gse-yeatmanlab.firebaseapp.com', - projectId: 'gse-yeatmanlab', - storageBucket: 'gse-yeatmanlab.appspot.com', - messagingSenderId: '292331000426', - appId: '1:292331000426:web:91a04220991e3405737013', - measurementId: 'G-0TBTMDS993' -}; -var firebaseApp = (0,firebase_app__WEBPACK_IMPORTED_MODULE_0__.initializeApp)(firebaseConfig); -var db = (0,firebase_firestore__WEBPACK_IMPORTED_MODULE_1__.getFirestore)(firebaseApp); -var rootDoc = (0,firebase_firestore__WEBPACK_IMPORTED_MODULE_1__.doc)(db, 'dev', 'richford-20220217'); - -/***/ }), - -/***/ "./src/index.js": -/*!**********************!*\ - !*** ./src/index.js ***! - \**********************/ -/***/ ((module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var jspsych__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jspsych */ "./node_modules/jspsych/dist/index.js"); -/* harmony import */ var _jspsych_plugin_survey_text__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @jspsych/plugin-survey-text */ "./node_modules/@jspsych/plugin-survey-text/dist/index.js"); -/* harmony import */ var _jspsych_plugin_fullscreen__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @jspsych/plugin-fullscreen */ "./node_modules/@jspsych/plugin-fullscreen/dist/index.js"); -/* harmony import */ var _jspsych_plugin_html_keyboard_response__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @jspsych/plugin-html-keyboard-response */ "./node_modules/@jspsych/plugin-html-keyboard-response/dist/index.js"); -/* harmony import */ var _jspsych_plugin_video_keyboard_response__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @jspsych/plugin-video-keyboard-response */ "./node_modules/@jspsych/plugin-video-keyboard-response/dist/index.js"); -/* harmony import */ var _jspsych_contrib_plugin_rdk__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @jspsych-contrib/plugin-rdk */ "./node_modules/@jspsych-contrib/plugin-rdk/dist/index.js"); -/* harmony import */ var jspsych_css_jspsych_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jspsych/css/jspsych.css */ "./node_modules/jspsych/css/jspsych.css"); -/* harmony import */ var regenerator_runtime_runtime__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! regenerator-runtime/runtime */ "./node_modules/regenerator-runtime/runtime.js"); -/* harmony import */ var regenerator_runtime_runtime__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(regenerator_runtime_runtime__WEBPACK_IMPORTED_MODULE_7__); -/* harmony import */ var _bdelab_roar_firekit__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @bdelab/roar-firekit */ "./node_modules/@bdelab/roar-firekit/lib/index.js"); -/* harmony import */ var _video_Asteroid_Attack_Intro_mp4__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./video/Asteroid_Attack_Intro.mp4 */ "./src/video/Asteroid_Attack_Intro.mp4"); -/* harmony import */ var _video_Asteroid_Attack_End_mp4__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./video/Asteroid_Attack_End.mp4 */ "./src/video/Asteroid_Attack_End.mp4"); -/* harmony import */ var _video_Asteroid_Attack_Level_Up_1_mp4__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./video/Asteroid_Attack_Level_Up_1.mp4 */ "./src/video/Asteroid_Attack_Level_Up_1.mp4"); -/* harmony import */ var _video_Asteroid_Attack_Level_Up_2_mp4__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./video/Asteroid_Attack_Level_Up_2.mp4 */ "./src/video/Asteroid_Attack_Level_Up_2.mp4"); -/* harmony import */ var _video_Asteroid_Attack_Level_Up_3_mp4__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./video/Asteroid_Attack_Level_Up_3.mp4 */ "./src/video/Asteroid_Attack_Level_Up_3.mp4"); -/* harmony import */ var _video_Asteroid_Attack_Level_Up_4_mp4__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./video/Asteroid_Attack_Level_Up_4.mp4 */ "./src/video/Asteroid_Attack_Level_Up_4.mp4"); -/* harmony import */ var _video_Asteroid_Attack_Level_Up_5_mp4__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./video/Asteroid_Attack_Level_Up_5.mp4 */ "./src/video/Asteroid_Attack_Level_Up_5.mp4"); -/* harmony import */ var _firebaseConfig__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./firebaseConfig */ "./src/firebaseConfig.js"); -/* harmony import */ var _jsPsychPavlovia__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./jsPsychPavlovia */ "./src/jsPsychPavlovia.js"); -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } - -function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } - -/* eslint-disable func-names */ - -/* eslint-disable object-shorthand */ - - - - // import imageKeyboardResponse from '@jspsych/plugin-image-keyboard-response'; - - - - - - // import bullsEye from './img/bullsEye.png'; - - - - - - - - - - // Set up all experiment related info here - -var jsPsychForURL = (0,jspsych__WEBPACK_IMPORTED_MODULE_0__.initJsPsych)(); -var participantId = jsPsychForURL.data.getURLVariable('participantId'); -var grade; -var schoolId = jsPsychForURL.data.getURLVariable('schoolId'); -var firekit; -var taskInfo = { - taskId: 'asteroid-attack', - taskName: 'Asteroid Attack', - variantName: 'default', - taskDescription: "In this game participants are on a trip to the moon and galaxy of stars are on their way pushing them to the left or right. To advance, participants are asked to report which way the galaxy of stars moving. They can move towards the left or right and participants need to determine which way the stars are going by pressing 'a' for left and 'l' for right.", - variantDescription: 'Default', - blocks: [{ - blockNumber: 1, - trialMethod: '96% coherence', - corpus: 'RDK' - }, { - blockNumber: 2, - trialMethod: 'repeat', - corpus: 'RDK' - }, { - blockNumber: 3, - trialMethod: 'repeat', - corpus: 'RDK' - }, { - blockNumber: 4, - trialMethod: 'repeat', - corpus: 'RDK' - }, { - blockNumber: 5, - trialMethod: 'repeat', - corpus: 'RDK' - }] -}; - -if (participantId !== undefined) { - var minimalUserInfo = { - id: participantId, - schoolId: schoolId - }; - firekit = new _bdelab_roar_firekit__WEBPACK_IMPORTED_MODULE_8__.RoarFirekit({ - rootDoc: _firebaseConfig__WEBPACK_IMPORTED_MODULE_16__.rootDoc, - userInfo: minimalUserInfo, - taskInfo: taskInfo - }); - await firekit.startRun(); -} - -var jsPsych = (0,jspsych__WEBPACK_IMPORTED_MODULE_0__.initJsPsych)(); -var timeline = []; -/* init connection with pavlovia.org */ - -var pavloviaInit = { - type: (0,_jsPsychPavlovia__WEBPACK_IMPORTED_MODULE_17__.jsPsychPavlovia)(jsPsych), - command: 'init' -}; -timeline.push(pavloviaInit); -var getPid = { - type: _jspsych_plugin_survey_text__WEBPACK_IMPORTED_MODULE_1__["default"], - questions: [{ - prompt: 'ID:', - name: 'participant_info', - placeholder: '0000', - required: true - }, { - prompt: 'Grade:', - name: 'Grade', - placeholder: 'KG/G1', - required: true - }], - on_finish: function on_finish(data) { - participantId = data.response.participant_info; - grade = data.response.Grade; - } -}; -var ifGetPid = { - timeline: [getPid], - conditional_function: function conditional_function() { - return !participantId; - }, - on_timeline_finish: function () { - var _on_timeline_finish = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { - var minimalUserInfo; - return regeneratorRuntime.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - minimalUserInfo = { - id: participantId, - schoolId: schoolId, - classId: grade - }; - firekit = new _bdelab_roar_firekit__WEBPACK_IMPORTED_MODULE_8__.RoarFirekit({ - rootDoc: _firebaseConfig__WEBPACK_IMPORTED_MODULE_16__.rootDoc, - userInfo: minimalUserInfo, - taskInfo: taskInfo - }); - _context.next = 4; - return firekit.startRun(); - - case 4: - case "end": - return _context.stop(); - } - } - }, _callee); - })); - - function on_timeline_finish() { - return _on_timeline_finish.apply(this, arguments); - } - - return on_timeline_finish; - }() -}; -timeline.push(ifGetPid); // store info about the experiment session: - -timeline.push({ - type: _jspsych_plugin_fullscreen__WEBPACK_IMPORTED_MODULE_2__["default"], - fullscreen_mode: true -}); - -var setHtmlBgGray = function setHtmlBgGray() { - document.body.style.backgroundColor = 'gray'; -}; - -var welcome = { - type: _jspsych_plugin_html_keyboard_response__WEBPACK_IMPORTED_MODULE_3__["default"], - on_start: setHtmlBgGray, - stimulus: '

Welcome to space!

', - choices: 'NO_KEYS', - trial_duration: 500 -}; -timeline.push(welcome); // ---------Create instructions--------- - -var intro1 = { - type: _jspsych_plugin_video_keyboard_response__WEBPACK_IMPORTED_MODULE_4__["default"], - // on_start: setHtmlBgGray, - stimulus: [_video_Asteroid_Attack_Intro_mp4__WEBPACK_IMPORTED_MODULE_9__["default"]], - choices: [' '], - response_allowed_while_playing: false, - trial_duration: null, - width: 1238, - height: 800 -}; -timeline.push(intro1); // const fixation = { -// type: imageKeyboardResponse, -// stimulus: bullsEye, -// choices: 'NO_KEYS', -// trial_duration: 10000, -// }; -// timeline.push(fixation); -// ---------Create trials--------- -// The test block where all the trials are nested. The properties here will -// trickle down to all trials in the timeline unless they have their own -// properties defined - -var testBlock = { - type: _jspsych_contrib_plugin_rdk__WEBPACK_IMPORTED_MODULE_5__["default"], - // The Inter Trial Interval. You can either have no ITI, or change the display - // element to be the same color as the stimuli background to prevent flashing - // between trials - timing_post_trial: 1000, - number_of_dots: 150, - // Total number of dots in the aperture - coherent_direction: jsPsych.timelineVariable('coherent_direction'), - coherence: jsPsych.timelineVariable('coherence'), - correct_choice: [jsPsych.timelineVariable('correct_choice')], - RDK_type: 3, - // The type of RDK used - aperture_type: 1, - // Circle - aperture_center_x: 960, - // window.innerWidth/2, - aperture_center_y: 540, - // window.innerHeight/2, - aperture_width: 700, - // Matches 14deg diameter - choices: ['a', 'l'], - // Choices available to be keyed in by participant - trial_duration: 10000, - // Duration of each trial in ms - fixation_cross: true, - // not sure if this is the correct scale - do the virtual chin to calibrat - fixation_cross_width: 40, - fixation_cross_height: 40, - fixation_cross_thickness: 7, - dot_color: 'black', - dot_radius: 3, - // 3.4, matching 5 pixels from Elle's paper - move_distance: 6, - // Speed parameter 6 seems the calculated speed but visually is not appealing - // Not sure where this number comes from 200ms is what we want the maximum dot life to be - dot_life: 12, - reinsert_type: 1, - on_finish: function on_finish(data) { - // eslint-disable-next-line no-param-reassign, eqeqeq - data.accuracy = data.correct_choice == data.response; - firekit.writeTrial(_objectSpread(_objectSpread({}, data), {}, { - grade: grade, - condition: jsPsych.timelineVariable('condition'), - blockType: 'test', - participant: participantId - })); - } -}; // create practice block - -var practiceBlock = { - type: _jspsych_contrib_plugin_rdk__WEBPACK_IMPORTED_MODULE_5__["default"], - // The Inter Trial Interval. You can either have no ITI, or change the display - // element to be the same color as the stimuli background to prevent flashing - // between trials - timing_post_trial: 1000, - number_of_dots: 150, - // Total number of dots in the aperture - coherent_direction: jsPsych.timelineVariable('coherent_direction'), - coherence: jsPsych.timelineVariable('coherence'), - correct_choice: [jsPsych.timelineVariable('correct_choice')], - RDK_type: 3, - // The type of RDK used - aperture_type: 1, - // Circle - aperture_center_x: 960, - // window.innerWidth/2, - aperture_center_y: 540, - // window.innerHeight/2, - aperture_width: 700, - // Matches 14deg diameter - choices: ['a', 'l'], - // Choices available to be keyed in by participant - trial_duration: 20000, - // Duration of each trial in ms - fixation_cross: true, - // not sure if this is the correct scale - do the virtual chin to calibrate - fixation_cross_width: 40, - fixation_cross_height: 40, - fixation_cross_thickness: 7, - dot_color: 'black', - dot_radius: 3, - // 3.4, matching 5pixels from Elle's paper - move_distance: 6, - // Speed parameter 6 seems the calculated speed but visually is not appealing - // Not sure where dot_life comes from 200ms is what we want the maximum dot life to be - dot_life: 12, - reinsert_type: 1, - on_finish: function on_finish(data) { - // eslint-disable-next-line no-param-reassign, eqeqeq - data.accuracy = data.correct_choice == data.response; - firekit.writeTrial(_objectSpread(_objectSpread({}, data), {}, { - grade: grade, - condition: jsPsych.timelineVariable('condition'), - blockType: 'practice', - participant: participantId - })); - } -}; // Create an array of 2 different trials (different conditions) - -var practiceTrials = [{ - // Condition Practice - correct_choice: 'l', - coherent_direction: 0, - coherence: 0.96, - condition: '96% Right' -}, { - // Condition Practice - correct_choice: 'a', - coherent_direction: 180, - coherence: 0.96, - condition: '96% Left' -}]; -var practiceInfo = jsPsych.randomization.repeat(practiceTrials, 6); -var trials = [{ - // Condition 1 - correct_choice: 'a', - // The correct answer for Condition 1 - coherent_direction: 180, - // The coherent direction for Condition 1 (dots move left) - coherence: 0.06, - condition: '6% Left' -}, { - // Condition 2 - correct_choice: 'l', - coherent_direction: 0, - coherence: 0.06, - condition: '6% Right' -}, { - // Condition 3 - correct_choice: 'a', - coherent_direction: 180, - coherence: 0.12, - condition: '12% Left' -}, { - // Condition 4 - correct_choice: 'l', - coherent_direction: 0, - coherence: 0.12, - condition: '12% Right' -}, { - // Condition 5 - correct_choice: 'a', - coherent_direction: 180, - coherence: 0.24, - condition: '24% Left' -}, { - // Condition 6 - correct_choice: 'l', - coherent_direction: 0, - coherence: 0.24, - condition: '24% Right' -}, { - // Condition 7 - correct_choice: 'a', - coherent_direction: 180, - coherence: 0.48, - condition: '48% Left' -}, { - // Condition 8 - correct_choice: 'l', - coherent_direction: 0, - coherence: 0.48, - condition: '48% Right' -}, { - // Condition 9 - correct_choice: 'a', - coherent_direction: 180, - coherence: 0.96, - condition: '96% Left' -}, { - // Condition 10 - correct_choice: 'l', - coherent_direction: 0, - coherence: 0.96, - condition: '96% Right' -}]; // Multiply based on how many trials you need and randomize the trial order -// 6*8=48 trials a block in total 240 trials -// Double the number of trials and shuffle them - -var trialInfo = jsPsych.randomization.repeat(trials, 2); -var feedbackBlock = { - type: _jspsych_plugin_html_keyboard_response__WEBPACK_IMPORTED_MODULE_3__["default"], - on_start: setHtmlBgGray, - stimulus: function stimulus() { - var lastTrialAccuracy = jsPsych.data.getLastTrialData().values()[0].accuracy; - - if (lastTrialAccuracy) { - return '+3!!'; - } - - return '+1'; - }, - choices: 'NO_KEYS', - trial_duration: 1000 -}; // Inter block interval image - -var IBI1 = { - type: _jspsych_plugin_video_keyboard_response__WEBPACK_IMPORTED_MODULE_4__["default"], - // on_start: setHtmlBgGray, - stimulus: [_video_Asteroid_Attack_Level_Up_1_mp4__WEBPACK_IMPORTED_MODULE_11__["default"]], - prompt: '

Press the Spacebar when you are ready to proceed. Remember to sit at one arm distance from the screen.

', - choices: [' '], - response_allowed_while_playing: true, - trial_duration: null, - width: 1238, - height: 800 -}; -var IBI2 = { - type: _jspsych_plugin_video_keyboard_response__WEBPACK_IMPORTED_MODULE_4__["default"], - // on_start: setHtmlBgGray, - stimulus: [_video_Asteroid_Attack_Level_Up_2_mp4__WEBPACK_IMPORTED_MODULE_12__["default"]], - prompt: '

Press the Spacebar when you are ready to proceed. Remember to sit at one arm distance from the screen.

', - choices: [' '], - response_allowed_while_playing: true, - trial_duration: null, - width: 1238, - height: 800 -}; -var IBI3 = { - type: _jspsych_plugin_video_keyboard_response__WEBPACK_IMPORTED_MODULE_4__["default"], - // on_start: setHtmlBgGray, - stimulus: [_video_Asteroid_Attack_Level_Up_3_mp4__WEBPACK_IMPORTED_MODULE_13__["default"]], - prompt: '

Press the Spacebar when you are ready to proceed. Remember to sit at one arm distance from the screen.

', - choices: [' '], - response_allowed_while_playing: true, - trial_duration: null, - width: 1238, - height: 800 -}; -var IBI4 = { - type: _jspsych_plugin_video_keyboard_response__WEBPACK_IMPORTED_MODULE_4__["default"], - on_start: setHtmlBgGray, - stimulus: [_video_Asteroid_Attack_Level_Up_4_mp4__WEBPACK_IMPORTED_MODULE_14__["default"]], - prompt: '

Press the Spacebar when you are ready to proceed. Remember to sit at one arm distance from the screen.

', - choices: [' '], - response_allowed_while_playing: true, - width: 1238, - height: 800 -}; -var IBI5 = { - type: _jspsych_plugin_video_keyboard_response__WEBPACK_IMPORTED_MODULE_4__["default"], - // on_start: setHtmlBgGray, - stimulus: [_video_Asteroid_Attack_Level_Up_5_mp4__WEBPACK_IMPORTED_MODULE_15__["default"]], - prompt: '

Press the Spacebar when you are ready to proceed. Remember to sit at one arm distance from the screen.

', - choices: [' '], - response_allowed_while_playing: true, - trial_duration: null, - width: 1238, - height: 800 -}; -var IBIEnd = { - type: _jspsych_plugin_video_keyboard_response__WEBPACK_IMPORTED_MODULE_4__["default"], - // on_start: setHtmlBgGray, - stimulus: [_video_Asteroid_Attack_End_mp4__WEBPACK_IMPORTED_MODULE_10__["default"]], - response_allowed_while_playing: true, - choices: [' '], - trial_duration: null, - width: 1238, - height: 800, - on_finish: function () { - var _on_finish = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { - return regeneratorRuntime.wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - _context2.next = 2; - return firekit.finishRun(); - - case 2: - case "end": - return _context2.stop(); - } - } - }, _callee2); - })); - - function on_finish() { - return _on_finish.apply(this, arguments); - } - - return on_finish; - }() -}; // ---------Prepare the main timeline--------- - -var PracticeProcedure = { - timeline: [practiceBlock, feedbackBlock], - timeline_variables: practiceInfo, - randomize_order: true, - repetition: 1 -}; -var MotionCohProcedure = { - timeline: [testBlock, feedbackBlock], - timeline_variables: trialInfo, - randomize_order: true, - repetition: 1 -}; -timeline.push(PracticeProcedure); -timeline.push(IBI1); -timeline.push(MotionCohProcedure); -timeline.push(IBI2); -timeline.push(MotionCohProcedure); -timeline.push(IBI3); -timeline.push(MotionCohProcedure); -timeline.push(IBI4); -timeline.push(MotionCohProcedure); -timeline.push(IBI5); -timeline.push(MotionCohProcedure); -timeline.push(IBIEnd); -/* finish connection with pavlovia.org */ - -var pavloviaFinish = { - type: (0,_jsPsychPavlovia__WEBPACK_IMPORTED_MODULE_17__.jsPsychPavlovia)(jsPsych), - command: 'finish', - participantId: participantId -}; -timeline.push(pavloviaFinish); // ---------Run the experiment--------- - -jsPsych.run(timeline); -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }, 1); - -/***/ }), - -/***/ "./src/jsPsychPavlovia.js": -/*!********************************!*\ - !*** ./src/jsPsychPavlovia.js ***! - \********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "jsPsychPavlovia": () => (/* binding */ jsPsychPavlovia) -/* harmony export */ }); -function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } - -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } - -function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } - -/* eslint-disable */ - -/** - * jsPsych plugin (version > 7.0) for pavlovia.org - * - * This plugin handles communications with the pavlovia.org server: it opens and closes sessions, - * and uploads data to the server. - * - * @author Alain Pitiot - * @version 2022.1.1 - * @copyright (c) 2017-2020 Ilixa Ltd. (http://ilixa.com) (c) 2020-2021 Open Science Tools Ltd. - * (https://opensciencetools.org) - * @license Distributed under the terms of the MIT License - */ -var jsPsychPavlovia = function jsPsychPavlovia(jsPsych) { - 'use strict'; - /** - * **pavlovia** - * - * This plugin handles communications with the pavlovia.org server: it opens and closes sessions, - * and uploads data to the server. - * - * @author Alain Pitiot - * @see {@link https://pavlovia.org/docs/experiments/create-jsPsych Running jsPsych experiments from Pavlovia} - */ - - var PavloviaPlugin = /*#__PURE__*/function () { - function PavloviaPlugin(jsPsych) { - _classCallCheck(this, PavloviaPlugin); - - this._jsPsych = jsPsych; - } - /** - * Run the plugin. - * - * @param {HTMLElement} display_element - the HTML DOM element where jsPsych content - * is rendered - * @param {Object} trial - the jsPsych trial - * @public - */ - - - _createClass(PavloviaPlugin, [{ - key: "trial", - value: function () { - var _trial2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(display_element, _trial) { - var data; - return regeneratorRuntime.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - _context.t0 = _trial.command.toLowerCase(); - _context.next = _context.t0 === 'init' ? 3 : _context.t0 === 'finish' ? 6 : 10; - break; - - case 3: - _context.next = 5; - return this._init(_trial); - - case 5: - return _context.abrupt("break", 11); - - case 6: - data = this._jsPsych.data.get().csv(); - _context.next = 9; - return this._finish(_trial, data); - - case 9: - return _context.abrupt("break", 11); - - case 10: - _trial.errorCallback('unknown command: ' + _trial.command); - - case 11: - // end trial - this._jsPsych.finishTrial(); - - case 12: - case "end": - return _context.stop(); - } - } - }, _callee, this); - })); - - function trial(_x, _x2) { - return _trial2.apply(this, arguments); - } - - return trial; - }() - /** - * The default error callback function. - * - * Error messages are displayed in the body of the document and in the browser's console. - * - * @param {Object} error - the error json object to be displayed. - * @public - */ - - }, { - key: "_init", - value: - /** - * Initialise the connection with pavlovia.org: configure the plugin and open a new session. - * - * @param {Object} trial - the jsPsych trial - * @param {string} [configURL= "config.json"] - the URL of the pavlovia.org json configuration file - * @returns {Promise} - * @private - */ - function () { - var _init2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(trial) { - var _this = this; - - var configURL, - response, - _beforeunloadCallback, - _args2 = arguments; - - return regeneratorRuntime.wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - configURL = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : 'config.json'; - _context2.prev = 1; - _context2.next = 4; - return this._configure(configURL); - - case 4: - response = _context2.sent; - PavloviaPlugin._config = response.config; - - this._log('init | _configure.response=', response); // open a new session: - - - _context2.next = 9; - return this._openSession(); - - case 9: - response = _context2.sent; - - // _config.experiment.token = response.token; - this._log('init | _openSession.response=', response); // warn the user when they attempt to close the tab or browser: - - - _beforeunloadCallback = function _beforeunloadCallback(event) { - // preventDefault should ensure that the user gets prompted: - event.preventDefault(); // Chrome requires returnValue to be set: - - event.returnValue = ''; - }; - - window.addEventListener('beforeunload', _beforeunloadCallback); // when the user closes the tab or browser, we attempt to close the session - // and optionally save the results - // note: we communicate with the server using the Beacon API - - window.addEventListener('unload', function (event) { - if (PavloviaPlugin._config.session.status === 'OPEN') { - // get and save the incomplete results if need be: - if (PavloviaPlugin._config.experiment.saveIncompleteResults) { - var data = _this._jsPsych.data.get().csv(); - - _this._save(trial, data, true); - } // close the session: - - - _this._closeSession(false, true); - } - }); - _context2.next = 19; - break; - - case 16: - _context2.prev = 16; - _context2.t0 = _context2["catch"](1); - trial.errorCallback(_context2.t0); - - case 19: - case "end": - return _context2.stop(); - } - } - }, _callee2, this, [[1, 16]]); - })); - - function _init(_x3) { - return _init2.apply(this, arguments); - } - - return _init; - }() - /** - * Finish the connection with pavlovia.org: upload the collected data and close the session. - * - * @param {Object} trial - the jsPsych trial - * @param {Object} data - the experiment data to be uploaded - * @returns {Promise} - * @private - */ - - }, { - key: "_finish", - value: function () { - var _finish2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(trial, data) { - var msg, displayElement, sync, response; - return regeneratorRuntime.wrap(function _callee3$(_context3) { - while (1) { - switch (_context3.prev = _context3.next) { - case 0: - _context3.prev = 0; - // remove the beforeunload listener: - window.removeEventListener('beforeunload', PavloviaPlugin._beforeunloadCallback); // tell the participant that the data is being uploaded: - - msg = 'Please wait a moment while the data are uploaded to the pavlovia.org server...'; - displayElement = this._jsPsych.getDisplayElement(); - displayElement.innerHTML = '
';
-                  document.getElementById('pavlovia-data-upload').textContent = msg; // upload the data to pavlovia.org:
-
-                  sync = typeof trial.sync !== 'undefined' ? trial.sync : false;
-                  _context3.next = 9;
-                  return this._save(trial, data, sync);
-
-                case 9:
-                  response = _context3.sent;
-
-                  this._log('finish | _save.response=', response); // check for errors:
-
-
-                  if (!('serverData' in response && 'error' in response.serverData)) {
-                    _context3.next = 13;
-                    break;
-                  }
-
-                  throw response.serverData;
-
-                case 13:
-                  _context3.next = 15;
-                  return this._closeSession(true, false);
-
-                case 15:
-                  response = _context3.sent;
-
-                  this._log('finish | _closeSession.response=', response);
-
-                  _context3.next = 22;
-                  break;
-
-                case 19:
-                  _context3.prev = 19;
-                  _context3.t0 = _context3["catch"](0);
-                  trial.errorCallback(_context3.t0);
-
-                case 22:
-                case "end":
-                  return _context3.stop();
-              }
-            }
-          }, _callee3, this, [[0, 19]]);
-        }));
-
-        function _finish(_x4, _x5) {
-          return _finish2.apply(this, arguments);
-        }
-
-        return _finish;
-      }()
-      /**
-       * Configure the plugin by reading the configuration file created upon activation
-       * of the experiment.
-       *
-       * @param {string} [configURL= "config.json"] - the URL of the pavlovia.org json
-       * 	configuration file
-       * @returns {Promise}
-       * @private
-       */
-
-    }, {
-      key: "_configure",
-      value: function () {
-        var _configure2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4(configURL) {
-          var response, configurationResponse, urlQuery, urlParameters;
-          return regeneratorRuntime.wrap(function _callee4$(_context4) {
-            while (1) {
-              switch (_context4.prev = _context4.next) {
-                case 0:
-                  response = {
-                    origin: '_configure',
-                    context: 'when configuring the plugin'
-                  };
-                  _context4.prev = 1;
-                  _context4.next = 4;
-                  return this._getConfiguration(configURL);
-
-                case 4:
-                  configurationResponse = _context4.sent;
-
-                  // legacy experiments had a psychoJsManager block instead of a pavlovia block, and the URL
-                  // pointed to https://pavlovia.org/server
-                  if ('psychoJsManager' in configurationResponse.config) {
-                    delete configurationResponse.config.psychoJsManager;
-                    configurationResponse.config.pavlovia = {
-                      URL: 'https://pavlovia.org'
-                    };
-                  } // tests for the presence of essential blocks in the configuration:
-
-
-                  if ('experiment' in configurationResponse.config) {
-                    _context4.next = 8;
-                    break;
-                  }
-
-                  throw 'missing experiment block in configuration';
-
-                case 8:
-                  if ('name' in configurationResponse.config.experiment) {
-                    _context4.next = 10;
-                    break;
-                  }
-
-                  throw 'missing name in experiment block in configuration';
-
-                case 10:
-                  if ('fullpath' in configurationResponse.config.experiment) {
-                    _context4.next = 12;
-                    break;
-                  }
-
-                  throw 'missing fullpath in experiment block in configuration';
-
-                case 12:
-                  if ('pavlovia' in configurationResponse.config) {
-                    _context4.next = 14;
-                    break;
-                  }
-
-                  throw 'missing pavlovia block in configuration';
-
-                case 14:
-                  if ('URL' in configurationResponse.config.pavlovia) {
-                    _context4.next = 16;
-                    break;
-                  }
-
-                  throw 'missing URL in pavlovia block in configuration';
-
-                case 16:
-                  // get the server parameters (those starting with a double underscore):
-                  urlQuery = window.location.search.slice(1);
-                  urlParameters = new URLSearchParams(urlQuery);
-                  urlParameters.forEach(function (value, key) {
-                    if (key.indexOf('__') === 0) {
-                      PavloviaPlugin._serverMsg.set(key, value);
-                    }
-                  });
-                  return _context4.abrupt("return", configurationResponse);
-
-                case 22:
-                  _context4.prev = 22;
-                  _context4.t0 = _context4["catch"](1);
-                  throw _objectSpread(_objectSpread({}, response), {}, {
-                    error: _context4.t0
-                  });
-
-                case 25:
-                case "end":
-                  return _context4.stop();
-              }
-            }
-          }, _callee4, this, [[1, 22]]);
-        }));
-
-        function _configure(_x6) {
-          return _configure2.apply(this, arguments);
-        }
-
-        return _configure;
-      }()
-      /**
-       * Get the pavlovia.org json configuration file.
-       *
-       * @param {string} configURL - the URL of the pavlovia.org json configuration file
-       * @returns {Promise}
-       * @private
-       */
-
-    }, {
-      key: "_getConfiguration",
-      value: function _getConfiguration(configURL) {
-        var response = {
-          origin: '_getConfiguration',
-          context: 'when reading the configuration file: ' + configURL
-        };
-        return new Promise( /*#__PURE__*/function () {
-          var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5(resolve, reject) {
-            var serverResponse, serverData;
-            return regeneratorRuntime.wrap(function _callee5$(_context5) {
-              while (1) {
-                switch (_context5.prev = _context5.next) {
-                  case 0:
-                    _context5.prev = 0;
-                    _context5.next = 3;
-                    return fetch(configURL, {
-                      method: 'GET',
-                      mode: 'cors',
-                      cache: 'no-cache',
-                      credentials: 'same-origin',
-                      headers: {
-                        'Content-Type': 'application/json'
-                      },
-                      redirect: 'follow',
-                      referrerPolicy: 'no-referrer'
-                    });
-
-                  case 3:
-                    serverResponse = _context5.sent;
-                    _context5.next = 6;
-                    return serverResponse.json();
-
-                  case 6:
-                    serverData = _context5.sent;
-                    resolve(_objectSpread(_objectSpread({}, response), {}, {
-                      config: serverData
-                    }));
-                    _context5.next = 14;
-                    break;
-
-                  case 10:
-                    _context5.prev = 10;
-                    _context5.t0 = _context5["catch"](0);
-                    console.error(_context5.t0);
-                    reject(_objectSpread(_objectSpread({}, response), {}, {
-                      error: _context5.t0
-                    }));
-
-                  case 14:
-                  case "end":
-                    return _context5.stop();
-                }
-              }
-            }, _callee5, null, [[0, 10]]);
-          }));
-
-          return function (_x7, _x8) {
-            return _ref.apply(this, arguments);
-          };
-        }());
-      }
-      /**
-       * Open a new session for this experiment on pavlovia.org.
-       *
-       * @returns {Promise}
-       * @private
-       */
-
-    }, {
-      key: "_openSession",
-      value: function _openSession() {
-        var response = {
-          origin: '_openSession',
-          context: 'when opening a session for experiment: ' + PavloviaPlugin._config.experiment.fullpath
-        }; // prepare a POST query:
-
-        var formData = new FormData();
-
-        if (PavloviaPlugin._serverMsg.has('__pilotToken')) {
-          formData.append('pilotToken', PavloviaPlugin._serverMsg.get('__pilotToken'));
-        } // query pavlovia server:
-
-
-        return new Promise( /*#__PURE__*/function () {
-          var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee6(resolve, reject) {
-            var url, serverResponse, serverData;
-            return regeneratorRuntime.wrap(function _callee6$(_context6) {
-              while (1) {
-                switch (_context6.prev = _context6.next) {
-                  case 0:
-                    url = "".concat(PavloviaPlugin._config.pavlovia.URL, "/api/v2/experiments/").concat(PavloviaPlugin._config.gitlab.projectId, "/sessions");
-                    _context6.prev = 1;
-                    _context6.next = 4;
-                    return fetch(url, {
-                      method: 'POST',
-                      mode: 'cors',
-                      cache: 'no-cache',
-                      credentials: 'same-origin',
-                      headers: {
-                        'Content-Type': 'application/json'
-                      },
-                      redirect: 'follow',
-                      referrerPolicy: 'no-referrer',
-                      body: formData
-                    });
-
-                  case 4:
-                    serverResponse = _context6.sent;
-                    _context6.next = 7;
-                    return serverResponse.json();
-
-                  case 7:
-                    serverData = _context6.sent;
-
-                    // check for required attributes:
-                    if (!('token' in serverData)) {
-                      reject(Object.assign(response, {
-                        error: 'unexpected answer from server: no token'
-                      }));
-                    }
-
-                    if (!('experiment' in serverData)) {
-                      reject(Object.assign(response, {
-                        error: 'unexpected answer from server: no experiment'
-                      }));
-                    } // update the configuration:
-
-
-                    PavloviaPlugin._config.session = {
-                      token: serverData.token,
-                      status: 'OPEN'
-                    };
-                    PavloviaPlugin._config.experiment.status = serverData.experiment.status2;
-                    PavloviaPlugin._config.experiment.saveFormat = Symbol["for"](serverData.experiment.saveFormat);
-                    PavloviaPlugin._config.experiment.saveIncompleteResults = serverData.experiment.saveIncompleteResults;
-                    PavloviaPlugin._config.experiment.license = serverData.experiment.license;
-                    PavloviaPlugin._config.runMode = serverData.experiment.runMode;
-                    resolve(Object.assign(response, {
-                      token: serverData.token,
-                      status: serverData.experiment.status2
-                    }));
-                    _context6.next = 23;
-                    break;
-
-                  case 19:
-                    _context6.prev = 19;
-                    _context6.t0 = _context6["catch"](1);
-                    console.error(_context6.t0);
-                    reject(_objectSpread(_objectSpread({}, response), {}, {
-                      error: _context6.t0
-                    }));
-
-                  case 23:
-                  case "end":
-                    return _context6.stop();
-                }
-              }
-            }, _callee6, null, [[1, 19]]);
-          }));
-
-          return function (_x9, _x10) {
-            return _ref2.apply(this, arguments);
-          };
-        }());
-      }
-      /**
-       * Close the previously opened session on pavlovia.org.
-       *
-       * @param {boolean} isCompleted - whether or not the participant completed the experiment
-       * @param {boolean} [sync = false] - whether or not to use the Beacon API to communicate
-       * 	with the server
-       * @private
-       */
-
-    }, {
-      key: "_closeSession",
-      value: function _closeSession() {
-        var isCompleted = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
-        var sync = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
-        var response = {
-          origin: '_closeSession',
-          context: 'when closing the session for experiment: ' + PavloviaPlugin._config.experiment.fullpath
-        }; // prepare a DELETE query:
-
-        var url = PavloviaPlugin._config.pavlovia.URL + '/api/v2/experiments/' + PavloviaPlugin._config.gitlab.projectId + '/sessions/' + PavloviaPlugin._config.session.token;
-        var formData = new FormData();
-        formData.append('isCompleted', isCompleted); // synchronously query the pavlovia server:
-
-        if (sync) {
-          navigator.sendBeacon(url + '/delete', formData);
-          PavloviaPlugin._config.session.status = 'CLOSED';
-        } else {
-          // asynchronously query the pavlovia server:
-          return new Promise( /*#__PURE__*/function () {
-            var _ref3 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee7(resolve, reject) {
-              var serverResponse, serverData;
-              return regeneratorRuntime.wrap(function _callee7$(_context7) {
-                while (1) {
-                  switch (_context7.prev = _context7.next) {
-                    case 0:
-                      _context7.prev = 0;
-                      _context7.next = 3;
-                      return fetch(url, {
-                        method: 'DELETE',
-                        mode: 'cors',
-                        cache: 'no-cache',
-                        credentials: 'same-origin',
-                        redirect: 'follow',
-                        referrerPolicy: 'no-referrer',
-                        body: formData
-                      });
-
-                    case 3:
-                      serverResponse = _context7.sent;
-                      _context7.next = 6;
-                      return serverResponse.json();
-
-                    case 6:
-                      serverData = _context7.sent;
-                      PavloviaPlugin._config.session.status = 'CLOSED';
-                      resolve(Object.assign(response, {
-                        serverData: serverData
-                      }));
-                      _context7.next = 15;
-                      break;
-
-                    case 11:
-                      _context7.prev = 11;
-                      _context7.t0 = _context7["catch"](0);
-                      console.error(_context7.t0);
-                      reject(_objectSpread(_objectSpread({}, response), {}, {
-                        error: _context7.t0
-                      }));
-
-                    case 15:
-                    case "end":
-                      return _context7.stop();
-                  }
-                }
-              }, _callee7, null, [[0, 11]]);
-            }));
-
-            return function (_x11, _x12) {
-              return _ref3.apply(this, arguments);
-            };
-          }());
-        }
-      }
-      /**
-       * Upload data to the pavlovia.org server.
-       *
-       * @param {Object} trial - the jsPsych trial
-       * @param {string} data - the experiment data to be uploaded
-       * @param {boolean} [sync = false] - whether or not to use the Beacon API to communicate
-       * 	with the server
-       * @return {Promise}
-       * @private
-       */
-
-    }, {
-      key: "_save",
-      value: function () {
-        var _save2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee8(trial, data) {
-          var sync,
-              date,
-              dateString,
-              key,
-              filteredData,
-              _args8 = arguments;
-          return regeneratorRuntime.wrap(function _callee8$(_context8) {
-            while (1) {
-              switch (_context8.prev = _context8.next) {
-                case 0:
-                  sync = _args8.length > 2 && _args8[2] !== undefined ? _args8[2] : false;
-                  date = new Date();
-                  dateString = date.getFullYear() + '-' + ('0' + (1 + date.getMonth())).slice(-2) + '-' + ('0' + date.getDate()).slice(-2) + '_';
-                  dateString += ('0' + date.getHours()).slice(-2) + 'h' + ('0' + date.getMinutes()).slice(-2) + '.' + ('0' + date.getSeconds()).slice(-2) + '.' + date.getMilliseconds();
-                  key = PavloviaPlugin._config.experiment.name + '_' + trial.participantId + '_' + 'SESSION' + '_' + dateString + '.csv';
-                  filteredData = trial.dataFilter(data);
-
-                  if (!(PavloviaPlugin._config.experiment.status === 'RUNNING' && !PavloviaPlugin._serverMsg.has('__pilotToken'))) {
-                    _context8.next = 12;
-                    break;
-                  }
-
-                  _context8.next = 9;
-                  return this._uploadData(key, filteredData, sync);
-
-                case 9:
-                  return _context8.abrupt("return", _context8.sent);
-
-                case 12:
-                  this._offerDataForDownload(key, filteredData, 'text/csv');
-
-                  return _context8.abrupt("return", {
-                    origin: '_save',
-                    context: 'when saving results for experiment: ' + PavloviaPlugin._config.experiment.fullpath,
-                    message: 'offered the .csv file for download'
-                  });
-
-                case 14:
-                case "end":
-                  return _context8.stop();
-              }
-            }
-          }, _callee8, this);
-        }));
-
-        function _save(_x13, _x14) {
-          return _save2.apply(this, arguments);
-        }
-
-        return _save;
-      }()
-      /**
-       * Upload data (a key/value pair) to pavlovia.org.
-       *
-       * @param {string} key - the key
-       * @param {string} value - the value
-       * @param {boolean} [sync = false] - whether or not to upload the data using the Beacon API
-       * @returns {Promise}
-       * @private
-       */
-
-    }, {
-      key: "_uploadData",
-      value: function _uploadData(key, value) {
-        var sync = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
-        var response = {
-          origin: '_uploadData',
-          context: "when uploading participant' results for experiment: " + PavloviaPlugin._config.experiment.fullpath
-        };
-        var url = PavloviaPlugin._config.pavlovia.URL + '/api/v2/experiments/' + PavloviaPlugin._config.gitlab.projectId + '/sessions/' + PavloviaPlugin._config.session.token + '/results';
-        var formData = new FormData();
-        formData.append('key', key);
-        formData.append('value', value); // synchronous query the pavlovia server:
-
-        if (sync) {
-          navigator.sendBeacon(url, formData);
-        } // asynchronously query the pavlovia server:
-        else {
-          return new Promise( /*#__PURE__*/function () {
-            var _ref4 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee9(resolve, reject) {
-              var serverResponse, serverData;
-              return regeneratorRuntime.wrap(function _callee9$(_context9) {
-                while (1) {
-                  switch (_context9.prev = _context9.next) {
-                    case 0:
-                      _context9.prev = 0;
-                      _context9.next = 3;
-                      return fetch(url, {
-                        method: 'POST',
-                        mode: 'cors',
-                        cache: 'no-cache',
-                        credentials: 'same-origin',
-                        redirect: 'follow',
-                        referrerPolicy: 'no-referrer',
-                        body: formData
-                      });
-
-                    case 3:
-                      serverResponse = _context9.sent;
-                      _context9.next = 6;
-                      return serverResponse.json();
-
-                    case 6:
-                      serverData = _context9.sent;
-                      resolve(Object.assign(response, {
-                        serverData: serverData
-                      }));
-                      _context9.next = 14;
-                      break;
-
-                    case 10:
-                      _context9.prev = 10;
-                      _context9.t0 = _context9["catch"](0);
-                      console.error(_context9.t0);
-                      reject(_objectSpread(_objectSpread({}, response), {}, {
-                        error: _context9.t0
-                      }));
-
-                    case 14:
-                    case "end":
-                      return _context9.stop();
-                  }
-                }
-              }, _callee9, null, [[0, 10]]);
-            }));
-
-            return function (_x15, _x16) {
-              return _ref4.apply(this, arguments);
-            };
-          }());
-        }
-      }
-      /**
-       * Log messages to the browser's console.
-       *
-       * @param {...*} messages - the messages to be displayed in the browser's console
-       * @private
-       */
-
-    }, {
-      key: "_log",
-      value: function _log() {
-        var _console;
-
-        for (var _len = arguments.length, messages = new Array(_len), _key = 0; _key < _len; _key++) {
-          messages[_key] = arguments[_key];
-        }
-
-        (_console = console).log.apply(_console, ['[pavlovia ' + PavloviaPlugin.version + ']'].concat(messages));
-      }
-      /**
-       * Offer data as download in the browser.
-       *
-       * @param {string} filename - the name of the file to be downloaded
-       * @param {*} data - the data
-       * @param {string} type - the MIME type of the data, e.g. 'text/csv' or 'application/json'
-       * @private
-       */
-
-    }, {
-      key: "_offerDataForDownload",
-      value: function _offerDataForDownload(filename, data, type) {
-        var blob = new Blob([data], {
-          type: type
-        });
-
-        if (window.navigator.msSaveOrOpenBlob) {
-          window.navigator.msSaveBlob(blob, filename);
-        } else {
-          var elem = window.document.createElement('a');
-          elem.href = window.URL.createObjectURL(blob);
-          elem.download = filename;
-          document.body.appendChild(elem);
-          elem.click();
-          document.body.removeChild(elem);
-        }
-      }
-    }], [{
-      key: "defaultErrorCallback",
-      value: function defaultErrorCallback(error) {
-        // output the error to the console:
-        console.error('[pavlovia ' + PavloviaPlugin.version + ']', error); // output the error to the html body:
-
-        var htmlCode = '

[jspsych-pavlovia plugin ' + PavloviaPlugin.version + '] Error

    '; - - while (true) { - if (_typeof(error) === 'object' && 'context' in error) { - htmlCode += '
  • ' + error.context + '
  • '; - error = error.error; - } else { - htmlCode += '
  • ' + error + '
  • '; - break; - } - } - - htmlCode += '
'; - document.querySelector('body').innerHTML = htmlCode; - } - /** - * The default data filter, applied to the data gathered by jsPsych, before they are - * uploaded to the server. - * - * The filter typically prunes and reformat jsPsych.data.get().csv(). - * - * @param {Object} data - input data, typically from jsPsych.data.get().csv() - * @returns filtered data, ready for upload to the server - * @public - */ - - }, { - key: "defaultDataFilter", - value: function defaultDataFilter(data) { - return data; - } - }]); - - return PavloviaPlugin; - }(); - /** - * Plugin version: - * @public - */ - - - PavloviaPlugin.version = '2022.1.1'; - /** - * The pavlovia.org configuration (usually read from the config.json configuration file). - * - * @type {Object} - * @private - */ - - PavloviaPlugin._config = {}; - /** - * The callback for the beforeunload event, which is triggered when the participant - * tries to leave the experiment by closing the tab or browser. - * - * @type {null} - * @private - */ - - PavloviaPlugin._beforeunloadCallback = null; - /** - * The server parameters (those starting with a double underscore). - * - * @type {Object} - * @private - */ - - PavloviaPlugin._serverMsg = new Map(); - /** - * Plugin information. - * @public - */ - - PavloviaPlugin.info = { - name: 'pavlovia', - description: 'communication with pavlovia.org', - parameters: { - command: { - type: jsPsych.ParameterType.STRING, - pretty_name: 'Command', - "default": 'init', - description: 'The pavlovia command: "init" (default) or "finish"' - }, - participantId: { - type: jsPsych.ParameterType.STRING, - pretty_name: 'Participant Id', - "default": 'PARTICIPANT', - description: 'The participant Id: "PARTICIPANT" (default) or any string' - }, - errorCallback: { - type: jsPsych.ParameterType.FUNCTION, - pretty_name: 'ErrorCallback', - "default": PavloviaPlugin.defaultErrorCallback, - description: 'The callback function called whenever an error has occurred' - }, - dataFilter: { - type: jsPsych.ParameterType.FUNCTION, - pretty_name: 'DataFilter', - "default": PavloviaPlugin.defaultDataFilter, - description: 'The filter applied to the data gathered by jsPsych before upload to the server' - } - } - }; - return PavloviaPlugin; -}; - -/***/ }), - -/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/jspsych/css/jspsych.css": -/*!************************************************************************************!*\ - !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/jspsych/css/jspsych.css ***! - \************************************************************************************/ -/***/ ((module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js"); -/* harmony import */ var _css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); -/* harmony import */ var _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../css-loader/dist/runtime/getUrl.js */ "./node_modules/css-loader/dist/runtime/getUrl.js"); -/* harmony import */ var _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__); -// Imports - - - -var ___CSS_LOADER_URL_IMPORT_0___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_1___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_2___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_3___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_4___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,d09GMgABAAAAAB4kABIAAAAAN6AAAB28AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGk4bhiocgWYGYD9TVEFUWgCBDAiCOAmfFBEQCrAYqEkLgRgAATYCJAOCLAQgBYRcByAMhhYbADKVBwAAAHgcgKzLR/b/xwM6xn5yIJpWiBEiUtScKrWmSpTWZuo96ncmHK7QEX54vFeGEN03oxIRIthX+aKb3/5EO2k4jhPjoGMZrIcVt3fWyCz/C8Yc74Bxe40ur+iLvtnCr2Z5WwZtlQ9bZDBCktmf57f55z6iBSQkFaOwMRaFjTElVYwIxEyY9lKdy/z+WkX596MKHvrGaH92Z8+8CaaRatroVNcWLSRvPELyRiqXkPE/01RSrVI+aQZO8pGfjl2f1cqS21K2WQaoFIBbZB9uqWd7fm6Xh1Qqtwo1PE3Msyrw4UYR3Lb3v6b/O/duT8JM6HbfhLuDsPSltJ5QWg2lrVAITxfu4yTGEIP21x9CUdScwA8xCS5lU34xTw0QFID+oY72D0xJg7peey+iWyDTr+36qhJhBxDYXIoDLuoh3v93zgLFXwgU0iHm7UpD1Ul9esZuxo+NuktAioWmvq4G/3+q6nrAkSbsDtMpTHdtw5ZSly3LiPsHkLg7QDqCynsEZapRKaRSSElW6bQ0iCm1jLVQcullSt/iLcueYVucrc3xazj7eVhMaEuMhgU23H25l7P+TfSrbp3tloiQSQSjnHW/ldaAYOyEviNM+4hYzL+ICg7SAViKhy+H+foi4SxK6BQqRmUwkDoSw0CyMPrcEM6eT9SD7EqLqRJkN0xFFSC7WZRvAtndPHM1yOABwKYD7W0EMngigEBHyD4dX9wncwpmkYCTjogVFosQTGVR0lh6JV3JVYqVyukmOBOrb4Z0wvQDGMpPQdZvgqa2Dp6F0E+2gjBIx9vWTWnn6Xr0ju38KaZyfjN3YMpIbcnAD/lYjI5fCmQsPgV7dCp+5FWP113bsi981AQu/Llvwz/7c+r/gb8c+SPqdBbiI0naBXkxHFJdjhZDuB0pwzEoMaxFaelsVCiDa9NbUaMs7g1b0Vh6LZoR4d3hg+i98DF0JnwJ3QjfQ0/Cr9DHU75E3y+DfkV/Y4ARIxgds88idB/grY+jSHHgok9gG7Fc52OzeJTn8jysjnnQmhtn+zeC7hFy1SMRYGIz/B+nHqvF3IUYkp3i3VdFUBeAMOHhWlHo4AacLv5thutwC6/IjYOPEihESkSZFB+BMF7w36JGLL4APQ+XgZ/qzbgktTGBvgb1aARexB/4jYjGEBbgeY5HeD71HlaVuxRHQ2ciqIOQrfIvxa5gHG2q0aqMXyXElGoBh+EwLA+FlVovpPlEAF25UlXr7Z4JhYALX2GU4ullKxU3ucBEn0IeocBQUEgRCgmFhsKCCxjFHjqBPS4eASERMXxqYwIBEI7k7Zo3c0iaangzRVstnK0EmFMXeyk5FvWMuT8JNvpvLyD/b8MAvQQA+IvjCAAZPKSnORwAbkqweezFVXMpQgBNN0rNCAD979tqEB4wRPZcSJqOhUihj4POrpKYANhnEGQASjEHFkMV6KDjNfsirNvBUsepcWZcGFfH1zv2E8ZSlhNOi75sEN7Synnlni5n4TVKbin+zK46fGDPoCn9c/6UP+YP+X1+B4m7ENfQxhH8aLlU4QLb1/zbQ/3/VF8y3pn8Bph4hCb5lwdw4nYtyvopO3URZFdZ7X2/MMs2E4aqU91vgxvKDenUY6PdWuwxbdSA9dYYtjuesgQBlCzWNybs9Ca7MPQ2AydvwozNdjqk1aBxG+yw3w1FqrXoMmRKsUbdiZFGrTVrq90OGH+VSWGUKbvZTcHWsESj2cKNOvQbYl6Ipm2xx1U/oac69LGaNBMEpKLUzGLSOrO2ODiowJ240FtrIW/ue052TE9tWG8ZHOjv6+3p7jrvaG9rbWluamww15vqamuqqyorysvyGV4+LOazaRX8N19/9eV96eyLu+eT8XDwxeeffdrvdTvt4qN3sq3NRhrr6pZv51vNRhKr+rC3VYsUdiNcwaFgryHkodX9kc1bSmunWCNDS57cFWZyvtB2TJYUeLD1V9cfc39YWsqlB3IrmWQsUeUR3zp1Am+cWGwxcmCAt8bcB9tWNmb7iEyAWsosAidUJqtIx42bjT8fx17jGOcMa7ZzXqfosTOb+NtuTDNSSm3wRqpbVPa+6QuuCTqVFrFfuA4zA0ywazWuEcrfXvbKI54nghWuBlZmv6lnldVHlkcflMw6Tc7V09/Dzkli3WxExk3s6M3+mNM3B0tbt0D8fMj+wrR0629cXEYbBIo4qwwuXKlxerIz7Y9UX+dUnfPwKPQNdTPTmvCKPXrUCAF2Wi1qIqTCAV2RJRUd8IExuFzxatviERgliMzYi5iUTV1trV5tXG1e7SztLqlIt+wXVfYvQhIo+bWh3TSERjyqq2n8w0uoGsUdPSkj5PFIX8YxBiqx3Wx2ethz67sfLu2vDXZJpSTJb+IvaDbyyHsMz2nDJsESQNTgneJrpBjJBuSxlav3SrtVulYZLKxdJMtzxS4uWiR38ti2t33ZOCyXGX1tHYe1D7yR+QazLMnZiewEJd0pFz5ez9Cysu53cnpHyj/nzZGjrJAtC4IHSQn+tN/q/Uj6/fQiuYjEazuouvkN6u6GO+0yuVQtcitASwg/4JxzOnwl57kiQh7YB7VwAfE8Mgfo7qY+KI0brd1h2mxQHpFkWs1GfxjzF2Zwb2+IriEpLcqtfBCmwV+ppRVrKX59t6nlpO1cyt9XHOaTWu6oKsaBjW7mQDPkIbQQoOPDK0v5/ElppbnAixzb62auZKBpUDR1So5Pya5rNRvpipJhqxuT5fKl9e7LdPFqXUdUnqubF0fsowd9ALZgFDGPe7roAVNWdnA+S0JiB91DbRxZTTM3Xzyot4whVrg2ZQhKFNdIuyoTJKJI8yLy+8ENveRFMt1DyzPqeomU9tO4pnDDmfLRAsaKJLZ8wu+0ptJGbWa21DgNdyZulx35UnodyVZKO+j0sEIWm6GIHzPyQtwy6kZhAh2yGixd6YxxQN6R9wTaL7VyiknRIswsuOfyQV/IRy8t+UEOlnkwrp96uEM2Kzln7UFeOEphUkDvxnqAzgJiKVx+p8dvrMjsRDAJNnU/EHW5YzjMEXtTdgQ0IzmOEANI96ictQsSAzTCoDXUjOp956fSDYTT3sDIgSwocYUce0RWlmTI6V2oJWvKqKBxlkF5MAC8C9KdwqykBaFN6a5fwk0TT6+/nzOh6rapKDxiWwK0FvvKhXOQse/efF56FIGOJ+lAWQs9Sh5Umez6EpQ9rRpmCHyIufqZd+s5KmfVAeAuVnXUVlxbGoXd4QYF5OUtA+OJVcZdV6J4cIEWm/JIOXdbDw7ocYmrGuGvoBaf883PQmg9GhsvL7Cbp+pp7rvdPc/gOadbeC0gTdUK8aGz8PjQfhiAG9uptei2v6hIVEw4e4FvdqfUDHqUuHQ9zZEGvhkBN63k9Yq01hy6iK44swbu2ubtE00b4yWG32jIe1tYz3pdBRRuHQgHjZzvl/OaUKe3MZC9D6UFJwWM2wX8BHDtpO91SQRpCZahtAv/wkg9H4UoNI9M66Ald6K8bHdHzvNa5Wef0oUDCyxUZ2EYCB4cmFb+6L7UQm9X1YqbLysSHo+nSCmURl1CkocVjkTuISTwQEFYBEiBPfRGg2ehbGhCXtQ7HoBuRM8gbTw5y6NT3YPeO0uorGeBwXr2pNzXUvH03ur0m3RAFT5BJcdwFiyktOReGECtV/gcDb2J7YRbj1lctoMs44m/5zW5Kg5ZoSQg8utp+p+jknQAgMEr7KwyqyEsTGDMaV4kzE+8AHMVEYEa2BVv+DHVKABbRUklK4JP+UpGg4yMJDc3sStq1aFKlEHJCZV2apnzpayMTnQfqAZxjZTtrR/cpkdATr6yfFEY5eabwEvTbEjZmMd90A2O2PWsCa7cPUCB9VHIVRtRb/zWhQUOD6Pf7BmM/PR/xA0Bxf02b58EKqo5hN/yeLUhR5sFE7oUvLJqR5/Yn4Ak/3+wUyhlkk64GjYwRJf3HbfNV7n8p4llb38K0mUjvQrQG1P2en/x40BM0tA7nC8lBHg4m9/D2Ifa64++MV7DuLScUXqWnH0n5PKPGHmWoMUGuh47UF9P/w5vVeB40k4KJhJjdhA2XIsFoAEfhtbiC84b7zRskiA7GatKkQHLu+wsyc4xdPphzN7SbEvHvrt62l9NGaemXUFdjVL+VtNQUCObv9OhAkaMX9qcEYBjWPnUSaGFdz9IJe5sSksQoUD4iuRxYyWLpKV8g+h/QH6nQz1903faZKgHNdFThTwa5oZLYL55dDKlYUJpucxCwLUV5NsyWyin5ARrjnDAHF8tWyCL7KAmtEZds2lAcMioGEgli+JxCbT19l4JCOcB6RNAbwD8CnBfACCvEjutMvcQWPDYVFygIcBpwFFxFEpw+Ee8d58XV4bHC/eEE7qqEw/ozh23d509dfjQ9eeHjhzZcurGLSu29Yq8dYn5v2mv2z0k0PRqIgyg8Tk1DisGA6mf9LxRytv+JKGy021Rgh/BbaKgBGW0y4c1caV8vRtN1FN23diRvCJQOCvgFN6403exaop6xmBgVbZep25jj3/4ykephBMkoyQTFeZSw4jnvq24Aybd75XAd2BP1R+7GZgijxQltws6QWKHlnU0z1o2LlnIoM67ntsqyC2cpSAoUllTI3wgr0wQhZlyUbP2DpKHu9pp174ZBkNpkORDXWlS1DO/RgyWFBqkr68255XvdMOaGeqpF2PzUWJLyOvyg3ploBANEC1KpPhTvGbvKyu5OKNTPllqwM5R5XFuu9rBrCpeFa72bIJo8CltHKTpY+5FkzpR9rBfID0fBYtYYOLWQOq3DeL8upJSD/po6yDgKdtETsFGTGsW1d9DREHFDmNcNr2X5pUJs/Kgh2GPuqOUxV0PcwtZaEHJFqH3VhPc7Px57idKupgp3y6iLSXaJjkNHeZUqNr6fH7xsnJej1fiQp1WGVTaNjt8PdzVmjRpjq0ro9t5qXO0LTo8nnSmnHUQMDC83pOTu4UAikcCjOwx9+APDfbPcM3gN5ff5SFdSEOYfVw76DWqwGjmzRk4a4xXuNRI/MWapiPYpO/eRTWwaENU1LU8LHgSZftWG4nZyuG///1FCP3t9MyYc2amy++Dnd05lEFOcJs3dSYgAdVZeTyBaJ10Y+h03x+25eQ4lARYjhsxcTvugLjM1key9Xql/fu5oPzj0STK7/eojlxwK/sWsELrnKwqWl3xTTODNZnp7uxf78e8f6SQ0MZnkTNutwd2Uc9ca+hwEv+gRXj6y9IWN+izFoN8zTtSSbf+254Y3l8HVv0u17JvNUrxasBcO+ra7P02MvDPDg9s6kchSbwcAuFBkS3XSr71qPVwwuy6tt99YcjAz8xwIS66FGGU2LYPdIYHOENyYibIO8cE5WxeGw6oTZLtwjNXlwwihlWov2XEenIm1Cf0Misx2FI83bEygbV7yzHXLz6dPfpTdDW3sPDproKndrE+tQvWRi3V+/67d9cJt29ZmUs+ju/mleZedvSSWM3Uenp0GNs9iuMzzk+Q6bAi/MW3kqF44hgxou2AONL/ccKawBge270shlrPWiexco86/h4auuHDI86pG9NNewX1eXczkrjeLqGuGspfkpHnaWR5Qpl3WEq0tCqX4frawrtNPVKY17NUNE/7pGuXb/rs8JHFV85Jre8JW5mxbtnZimyGkvZJB1tID14XHcZeFhzrmlRDXqB8QJuhS4ezSZuoHfiA7sPiiIDPE9cELuCKKkws+S61ZXvtfA727FDavgOlZc48uyWvX1BAfJSiFkqs54VtLYmpb/88ftp05ep0VORI2Sy2OymomDRAshJCq7cJwr3Pa8/2T0qlnXX04HX7DF9YXX76pC5NWkkOC+wmqAlMs5X1P8eyp9QzdZJjXrrArt0u2tK939ptF2PXELiMl6s9U6JIUPctJsyrRgWaI4IcTiEtX76ck2/aVxyYwFsbKR2+WCguGV+y44lsMmEJy8JaaZcgHwiuf6vQdjXFu2o0Dil0XuUD6i8L941tnV5Pv/ANy+3UQUqyq8q5KiRGNRlRz/oRX6R2HM/Z55CdOub7VL64jhTp4cBWUAsm884fu785GbPMaLZsSkN4/881DmnJI+Hz9/Sz/EK3uYOUZJcIcckl7zqf5CUtLCWLW6SUjodz5+y1hTsiLn/mllFr9vGl5u50m2OtVFhrHMprotzrZnxYhms/qMY/SJ3dt4j+nuNY1PD1X7ls2q4pIg2SLBeWpE5asezwYXnhcmFKFb1gxzfWHOoOqe9CHk3GfDueJqkihQV1E9V4pqd9/fmW4wVcPjmREiXakd5NoOIpjMF1MWl2jw3ExTnEYo1Hi9KVot5Ei9QcF1tZG67GGEPZcokuKuxeBL1T8MHjuIVeRPtP5mUFX9iHZs3SDAS1pxhTeO/39HNwQgXUpteh/y3ogRLrzmKXsh2DLUF+dIa7l37TAtdkMkk62pRODEnMdjt8hq/1c1AnDLZsc651Kb4XwbzMaZqKNTTIRmK8iSmM9C3u7w7bCrvxk5r7tdLRTPw+4gwutmEqKsXssjppAaODEeO6u/mvXbtv6Ywj2q4lhWYPw1e+FsdhZntAkltNxIk0abAoCi78Kksd+Nv9PbtYZlPgsHmNU1yoZMhNbtbY71+gxeNP7pFE0P7Vuk3WLo0NVeqnRPpDim2H/IS6+A0F1tflTQGzp0TSyW+YbiY7FbPBv69q46Cu03tr3SbKgFdTuCdPdTMqVuZ5KbR9ohQsh8ItK8VxZoG5/2hmaHLQ3iBj+foln/i4r0lsd5xgupmkRznLa3G5pBCzxJpKOUxJS+wMfhkVNylK+002yLUuTg3srIxKT+r22V5Q/nuvl0kZ5JarXxGLLoZ0TJaB5ZDSkiRS3WFTwfv1G8LT6sx/B60LMZGu5eiPJ4UsdREGfcP4VGh+PUeKZCYvI/6rZPy+km0aE5j0a/YaNnCyEtbUX+taFs/4Mov9lSqeoftaGi2x1jieu/fotPPlo99ldc135aoHr7u3qklbVnh0Brg2mK6rNLyEqKozI9wCFxbfl29eMJ59e0V3WEY8x0vpKrY+FjQF61x7XKJdVHvi8gIq3XKy0gPrvmXt/HIf64MvJSH04HWhMWxX11/OW0q+ziV7KjKwKkICTjqcRhgjhHbt5EV6ud642Jgs2D7+AhgqqoG2jdjnGao74UVO41b6clShWe87lWT6b8rwk1uLTsZGx6tOJXVxJ9gsSly8b5HDIHGsqHNhpH6bOOtg4OZDCnHayh0Fk7Nq3ZnGckd1DWuRk457dIOop8jbJ9rFRGxvoHGWhasI4dLhYtKH1C346NID4htIXrJY2p5Lj5zecA7J6u7K+aVKJy2kKLyysAhacAxbt7w9Q9PiJaTGm977g3Qf3+cHueMBBz9qDibdf6U57W+kMzf/4tnScKH/33/2p/m+JzrZifpMOsPz8VPySZf8CUlJ+viBk3x/WinLc9lxm6UpXr0cT3zHn1MtZqBHU00LQckG+fUhCXt4q+ZnOdYVPpUQPTSTctv3c0bOy8PNBL40ivA7dfa8RAfifyec0vf7FuBxzEUWa37/QGPkQ1tpWcCcOPk0of4CW1O9lqX8PCG/NsrWVrC0Y1sjl1L4lSLpePJpnYhM0V+vnOb5zicifhso04iXPAa0R6Rr0oxKZ/iVPpTvxxBS/kFAhUO8Lvfc1XG8iZm0jJXUsh0kl3mpQzL6iXiUvNOuP2KKvuMso3RqReGYoIFR//2M/XkcJ9pu3i/fvpAzcGRX8061brrahRRnadfNWDoyIgQVzVX1AvaHwe6YB4gAIkHMWAjDmVmxdmBVN/AU3XG2BjEOLuKAHN6roPYkUDYjZDlzw1s05E2PDsv/fwUxfRVogjidCbogXhj5AUKilYNCRES+5QdIYyfVLkUC9zpUFuEcKwK0SFSANkjHWUEG1rpMBGwKsBOxFFx7Pta6XNCNyD7I0+sQPuAQ8bCaXAGIZeilwn5hESWQwBU7+hlIQkSEshE+MgzJtM3jaK4CRG8i85Ah/EVkZK/l1sH2svJzP4GGCf/vjQfo2UZw1whOtqg/YQQnWEehojiwwdYi6wDd4aDLcewoprfWt7kvO/EQXUbHqf9cXD/B0daQfb1jwC3A+xKltoNrBgkC25I4NuKwogSVSyhHHL9Sskwf5cRtKbJDBJptjrL/l3HYJtBh02Yis6fq37fEqbYH6D6RuahnOYU2BKkx7NlOF4RwrttIV3mjTk1Rnt0JITPwk9tLfVOLWo0ejEG2bqbpxLaR5xiG1RGjzn7prgtPU4CmgKDOm8CYqYGMMpZzGl44wAagek4AvuMEEMKNgcYYBpYpMJ705psLiTqJGVsbqI0R+ztbfGThrxvJMv00Lpr2Vsir1t/nUGpaLRJ/cNeHIyS6Um8oqmFR/WiuLHc0hCTIXVxbT0L2P/22D3Pk2e2wGbC0MxO+v99XlRwqJgYbK1ELkqQQU5m2RUxQgY3ssw4jlEfrpTrpSJmwlWWpUshOZXEUKgON8pTXfr4/m8+RqknXRYRnCMvJLDFa2HRt0uZngus2sapBC3XqxQbalq9c0+52MO4Crx0bwBYygUZ7CL/fH0ZqfD8kvE6cci1q3oxk2qDdo0zDsJ3Sjm1YNPNuIWVgG2AUwnoTcGHyHYvP1fgnnkGjUvp/uqFlY/CrfdGlRBYueV3lqH7W73+3s4r9fr0uNIfTjMq5BgDnaYowBK8j59KooxOGcdxuU1T7TCigusxyxMSZO1gc0cu3vmyieKAvnfX7vsg8WjlAD3yIBCFEoqCEE6cyegAEsJvoIvZQeaXoYXCFKgLyN4vxZALCUHumdYXDAbDmJor2gi4v2RFgfkBAAHAifi/50xzm0i0yjQwAAM+/XngIAPD6hWPw77vvVXg81QVDhAEAQOCvyyTlcUK73A/0Lz0WH3xC3nY+h+tlrqjdV1TEw7p8ix2v2bcUmSdj2WxrnFFV2HWq36jTHnpfvNF8Vc/jXM3S1L3cb4V/6EceUZ5TMvtjikytk3fXnD+8HpeoBq/qUJSAWQqDm9fq/aq6bPo2NQ9OzKRlblBT0IcRwf9fAqAEwM4TLRprc1LOszEbODAOsgnQwONtZ7Kn+o76xL/ERRZBABJM4GtEgGEJMANw64t9cBAAhu1PvZICAAcBm43YOzgbQ3dmNk6IG7PxZP6fTSAKx9lEjrFwlp2QSFkMAdBjaDYCaqx38dgASDQxth6ehF0cFKlGrRYmZUqUMpNRCEx8Gf1NKfKT1TpWDV8nD6x+99VMZaycEgUN/HANjpXehUkkvJB8s1rPXyxgSZUoExJONp+/gopXcYhjNSZbqUjxwKrTrJ5ya8y59f5DeVvA4pDNU6msbwrmL/Bt+hKxklnsbsnH/BI/GLRPxSKWYqAnosym4TL8oWPGek19khAF1IraXgl/LFbpgCRWkipMFiNRqozSz1KlKAxEkoSoQrW1SWJYw87y7lkcePrpV/tWsyrhAWb9H113/r2/RxA/xza+D8HkQUwcEuO7m2dsr+Ntm2dkVeFl/X0MLWk8Ldt4XAjLIhhcVnE3E/0Djb6Bi+vJRs9wgO7BRtcgoXMkHaOgfezgpJfQ2pOWjjR3dQ7aGfZbQUNLzLUBO/UPpprUOa22kTUNXaa6KbFWkcqyTKsoZXkhtLJClhbpvJKig5Ucsij3yxTm2yzmDiykdzmfQuZmkDkZT8tOZFbitMxYZgTQ0gNpjOQ8adElqWGHlJmBEoZdT9O7Uucm59G6M/R7Uu1bmewX5SV5YXQ7p0y0oSVYMl6HjNO5UmXS88SaJMY4mOi9jmK+l0J+hHSqTiI+QzxkNU/lypfMIkQyorVsv4nEEkbIrEPQ30vAb4LfTHy9Ah9PHp6AyTjlmDRwgXgaO3DYErDb7LAZiWvYjEmRMdZ/i6dy3hvMRSO/KGxxewM7iGWwN7KMDAXdQFDgDXQj3sjEd+F/wOOYNruTpqAaSAqiAeWAYcFINRKNd4k/EDEwPoAu70C54wfAswBRFGQDToEZyEbMyMS6sB8wHAtwSiUBHUMTc3qfhGMkm7ZzjqLOmEPWOXdderBKTfoc0ToHhssZae8iNGYcGB0F6emEuQld2ns46PKM72JYpCai4XGdI+rBh89hn3oHDAII6NGC4egNCiCEJFpKeRAJYDSIxlau2DOhArnXhmJWHHIBAAAA"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_5___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_6___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_7___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_8___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,d09GMgABAAAAAEa8ABIAAAAAiTwAAEZUAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGlobinYcPAZgP1NUQVRWAFwIgjgJnxQREAqByVCBrXELgzAAATYCJAOGVAQgBYUGByAMhhYbdHgV45ilwMYBgL21CRhFfdazElEEGwcACv1Osv+/HtAhQ8LWgkz1D5kV1ZVcFaakEBUjU9TIiU0rPyfEliGKopKB6YlWOLlXDg76ekJsZ2/U2rAc34tSVO6VwQ89h1U4osuLZpuGdz1UjDPb6af9T4e8+S8a3ujkCI19kgv//u/3/84kK9nnvo9FJAdMEm1VFaoqAlmWyLqjwvzPJ/Pqqle2Zg0ySGyCwR3PrufkIx/OB4QOCMufOq9P0X2CMuXthlqioknqDMA2xYmJCgoGoiIoIBJlNC2iIhjQBqiIgYkRMXNO56KcTp2fK5ff3Fz9d35f1Ht363+Rj13/U80klSJ1lWZwtj/mO2P3aqVEbnLYdDqAcgCWu6uTiyrXd/PdNC7KB0fKXSx6+8T+6u2e6LTz05mZRKIUpeRDVY20tytilN6GJdMKEScdLKSLNtMKSSRfVul/c1Fq68jOs8I+ba/7ng7InnMI9UeRJiWSDAjnCxBcgFSldFGlNHRVpk+a/iZ1rT225FUx1wj49CMm/U4r+IaPYpoGMxOX/SvLtizL3vXeXm2vtJ9SCkoHKIAPQEdhYGoBsBQCj+YWct2HPhfM5ATJAAJuC5mQ9jtiVhL4n8tmk/+oCS2oXYmSWLfb7/LoH3Olq5OU5s5InATHnAPjQDj+L6fVtWTZbXVnKJMeZPcSnZMs0eB9gQ5H1a8ql1SSYkl2Xiwp6IbtOAN20+s4A5E7Pc9xeiCDcJu9ITlu4nRngWEQbst4uMxp71fg87612M/PDLBiaejd4StIXUi+0q8xrVswpZvicHlNQUMQcEVUTvnahjWtlgRjSp1WMyoiAioqIM3yvHuMYRISd09+fWYzIxIzroX/GW6iPLxFTXif7vC51bt/4A7mGDIAduRqdr6BawA1+XqJsyRhcfa58SkA71uqSwt0ckdpdn5yZ7auNLlXayq8Aaj5utcpAixF5acAh/vuMbcAmIoiKVEOLI0IvjUcDM1gJ/prBHBLzADAHR4QQvR9NTvnvbEs2uItyRSWZsWWZXlRY/93hdVZi3VZv22KmmiyCdtlU3bADtsJO2sX7Vu7bnfsJ3vo9+JB/GZP7S97b/84wCwyM5nT3bzU3dzLfd3fL/uKUz3II5wTNR7jCZ7iKs9wvRfEYy/1Km/wNu/xG/LzG77ZB8/lNt/j+zO9r/xoY/+ULynIxd/c8198zZ/7a//o/8UGKnoqVirucA/vwAYx6BESUcGL2JCELDShC0MUhgn9j6Mj+mI4xmNHTMZsLMRinIkLcRX5IlbjFvudx/Ey3sbn+F9AakZqdrnIQ2j5iawAhYmlaMUrSQqlKUt5KsYsZpXWBb1cPGKmkVNZpIzgmYDcQ4hsX/kqcqBPlmfhXq8RljNLqFOx0nJG5lQ9prg3NqrlES2thJsoOjgptYi4pwoaIz3nYoJiqgNfwaiR0lsI8xUiWkhDigUUSbijCYBAAll5OIxWxOvWPOYCj4iTRnqBlxKfKVK4Kwch0dCYSkHL6oTXNyIyU+MYRxywSf29AOudPBRKyxvsUogyhCenXlkoiW0qXBBp1A9NT6OAeTjgE06QoSuc9aErRcEcS1KnlnnEDJmzClD/otKSipWOOijkAUrIgSK0PgTYAdg+pqZzKHkxJ/U+G/1UOO9wkaA+RWKaL+z4Yg7Z1NBSLU1O9N4XjU0hWqa4hAoqDWcpZ2FRB7zsKn/hGIGz3Dp1qJgJeiqPkD71P5ByHwoi4r2L5zxLPLSEYAYKXz0fX7xXsAKlld2yuz3srnf3xmw+W2mfOAbn212WQBCksevh9l4shcAz4Ym8Nrm2YAH3dBj84Q//bf+VeL1k42ewAORRuta/MsEab5rxvQbdh4Gnc3b4vMvEArPdykjotHHzfgDT7L0A7PUSvfNzUUCAN4yQrUMYWyfawSLhiVtNBjOz/ifuMJjMBPlNxbQZMJQHDC9LbDdYWcF/ANhufmaqmxsoYxXhCg2DNQK50VuOE683UbI6NKCDCbV0irpRrerSsA73+r9fA9j42cavN552WTLe0K/c4Sa3CgYoh3BZPJqSgAHo5+Il65td+v+Y7vzKvgDQLWCBiuEpBeKwz0ib95jUiNHfbdgRtziV3Qb16OI2Y74lT6y/gWZbTalm2hYbtXPWN6LX1Nylcyywo1OAtDdmexNV0VhL+/oGTdhh0rwaOgxkt3evWd+STSHVNNJjnJ4KmjITbbTJNrtMmeu8bkNSbZOm9O+EPsIyKswWb1VPmx7mRFvsNO0Kb+yu77Xq4k80MRYkI1hU0el4o7blv5MO1BaiLkRNh2zYEdOnx24ZH9vc2dHe1trS3NTYUF9XW1NdVVlRbiorLSkuKjQW5NsTXz28vJ/PptUk+C+/+Pyzu9LZF7fPx6NB/9NPPv6o1+20W8X7b2Ub6400psk1X882mo0kJulqbzYDRyBoR/jeYNgQ7MDq3tDmN0prp1jDwtP5cV6YSnlXc0w9aXARPL+y3oh7g9JSLiuAvYrxBS9KHfDZOQtu1x66jB4+k7t5VK0nb1rvhEzAiLhphNCx2VZFel2/3/7jLIaNY6wa1mxnvEExwlZj7K+nadlEKbXA7VTnmJynVC+4JhhUWsiVuWszZ4M1DouMapzmr9MpeciSCIHmSd9KY5NWWF02Di3XL5Q0lCbn6vq8i6rrR6TZiIyrqOj1aLTp6/HS1jkgf07Yn5kWrv2Vi0ficBYxEla4iAoq8iTpT3tDiaZO1bYMFb2rMlpUNWGHyDzuEDb4LNciJo9a3vAurKD1NqKNavOojSR/8AimBIsqvonolHUXG8sXaxfrF1sL2wsq0nX3Z/Xhn4QkpuSXjLbTkKkwnNZUbfFU1UrOh2tbFbeoyq1jrJbyR2hup7WueI5+6GRpf8mwTSrBWXEVv5FmI488ZLhPq1sWrAOIct4pziKhk8zBjqxYn1faHba7aQPPmiRZnil2cccOeZTHPL/uSfug9DOyWzQWK+96I/0NelmWsyM5CEJ3Ki58uo/h6UPv3LPVLSltlYmfecoK6fIIEYiNXdu7LN6J5L2TniVnkXhlC4maXSFVV9yZ58l5JEBhJ2iXwz/DOee0/yAlT4hg+/ZezV2ALGE5wFNXKnq40trtp80G5RFD5qbZ6A2i/dT076yH6FASd0P5pXdDFaaL3WjFWu5fV3XcOGEtl/bmBUf3WSV3pCydA+vt5EBT2AE8TcA4P92yFH9fxqWV7BpPeWSjvZCCqqCockpmK2f33jQb6YGSiuXAxCKxMNw9Xc0/Fq0lJp4nVzAwy+6q3hN9zggRl7u6CJOpX/o4n2bhqAU6nWgfWk1T11/SGAkZI3ugOc0mCF1yt+QXL2KEFR6uQDbvo/hLURwP8/D0MxK5hko9i8YdhXvO5NcLqCYkMucjPpEnpRZq6f7lV1UYmUTgd/gmdddIdqK0g2cKL96mKuxyI5fFA1MeGU8XpAmrwbouBaj65N2h+wgatbWyku/TPPQsGHPNvi1+v7QWe0HG2wTePP0K4YQtys5YO3BrOJdCp4De9XWBcQvsF8duM5319KJwEME3CEznCxYljwyHGeSKKU0C5HCJKY4BRfNVztoFcQduhEbL1YzJafsrUQVh0Rv4ek+2OXleZh6xmCUFK6tuvWFNGRXUznZQDjSA6IDtjkEfUmJNZMnhTAb3TVxcfeeGQeaheXBGZJYkYMxiJN8ICfK1x57Huw8SUPMcjZW24UUQECDP7vgWZF2tJGcTeIJY3kZ0nrPUDfKiARlzhY6TWOWUaTSCg5yhGEX2AwO1huWJsC5JdZBChak4EubjygMFPRZxI77lM76nZxv6vhAqD53u28DHAlXXS/XycD2DKkG3EWkBYVKuIVOoLazGjpoBuPwQSUWn+uF7RkJEiAr4rD6j/EbnjgvqeslpZMoWwO0S+tWAZEMOXUe3zKmEtRK8PaJqCKgafKIx6M5qzXpVBSTWQtOccSOlXeYrh5rdwIAfZ6K04KSAH5VgVwKodnrqTSSIbLCMpyX8MyON+GCO4gUj0ypo10hUkG1vSclHxk/fSxf3LXBOnYShIURMoVvFi3FpoQm7rJZcf1E982V7GiaBXB6Jl8OxLXSiiPgpmUAjkieNQAEkQMZek7gE3JomFBnpQcRAAtHFMGtrc7F1zG5bZboLSvXuCQsYzq64cc2PizuD08vMXqz4CRJ9iPAEhMQt+XcGGNFrRDdk7o5tLay0zRy9GdQznvFXv8bvUogCQwnAIqjrdcxEkDYAENjBgeUxSfBMILojURx1v4kC2CCyNgfo6Czg87JRDIcyOSkuCd7Lm6yMXdiR5MbGdkktOySGMgh95ErNjHro2nIhuWv4bsRH3C1uM/RDNPAI2OQjyyvErFy9NfDeNBvi1pq4Vdc4xvaEdXBqm8Ed9lbIJ+1I2z91gQ9LIm79xZ7B1z/8F27Ge9pucq0OrYjufUQhTyQBOSkXM+hG7FZ52ji2P4CTvP+wViK/Rh+FajYwRPy7/aH5KFf80LH65+8FyaNKegjw2lN2V3zqyYKYeCAjnCcuBER4Rz/LGEbbJ7c3DIxXNSotZ5SeJCdqLMOmGAWW4GkbKD10oJW6fuYyVcTyidZj0VikzPbCQ0RuAxX41rTsYPDvU5gQGAT8wGvGORTgvGRrQfpH8MxkTNsgfYP46Ooir5kkQbilIFXjFn+txVBUY4m/0aEihpSf2RIbWIsGnzpxZISaSKVv7TNJQISOgUdyvmqCig6O5h8ouwOymRZ1PZcrTTP+Cb0k721yULsnfhP6m0PzA31IK402+xygmMB3RrdYFmSONSfEoQvjBb6jZsgJzERGyEJ93TVsYBurdcO4un/t0bqCf/aunzZF/a/wH4X+K+zkOVigIsc2XvF3Grf5OLwey68rGCO0ApD8n4flIJ+wYoSFXzGgq4kzJ8qxOYVlrREn08lzecCoMRS6WjYof2XoHBCE5QZhtBCflNwIaJfnnqN8Oaud/TCX7po3Ba/8i+Bl6XfD5DPhh657PGyZFkUWlvB4R99INnlQm5Xy9nR76NdqMzSDJ3iAD/AO/vugDOrML4e8qstSyhuPU65pahFuctWsZP8IrlSrlLfnDIcdD/unpbodt1BKmPKgG0jYv6139BKuvxJ8J22rWbPINH7f/xR/5D/Mp6ssI6SelWmDj/6pRXYqS8YCu4Rv/NyZ/uDU2LaLeVmdPHFKsrDWqRQlAv7AJbVIcm4dpyC4CvEbu/Qq/vvlnMMeYvObQBf2rBDd7WM68BZgqJuasCFJDAYuipEiePUQ8P+fENKtvR9qDPKyqJCpfcVDOTvjVkWUfA2WgBYLsPBU67RmV3qEQo5GeZHfAyRAi55lCnJiED1+yoXB3TCQu40vJJz2ARjVwaDWaQE1cpkPA8vBMXDhiyNEBf6O/JEoF3l0IKk4AwAEgQCrPlSgNMizO+gL7+RNyiD6qbVkcqHxqXXpNVZUPHQImcDblKQcCyTjOsqopfp09tvUA8KUVnAnafddiAehjjMvKtlM1sB4/kIjoCpBIq8cFEGhbBMT4ieyL46jXGpceu1LkChQhNoE0vfbBXoFq2Da/Sy3TdjK0PiV9y2yddGUMoyztEcRLD9hqWV+4KJK63sT+Z/X89M3EggjPJza0G7eMUwjjvyOVV0igzLBOjsDln+JzofS9glQxN5I6yruqPBn1SN/gkqmF40upQ7eI7DqRx5X8dBYMGO/ws6WsPX+pDVdPHJ6dn2bW81PQIb3gPOBlAN7Z0gwtkhURGs2mRDhMjzprxoNl+RC7ak2ZEzvtwqOz2C1uGRCZcFuvW6IOd3RyrnHsOgkU0WWSEj/p4haZCrjErkonvgjgcVaPcJ+8PCnY331WJYF2WF9uF3uYEJfzx53byilcbHfKvmob3ZXtrMyfgf3IcvxcglMmdsOK2sf4qIn9e/P69uj4PXCMF6RdpwOgn9XSYXz5xtWH73/iH7vHSRDw2rgBhfZfzc6UypIdrpKEAxgUTPmwsl0kLWxXhW6DtUvwsA83RsSYt5zgqM2r/ZnqJwXn5iaXKikDdwYaqMVBEnYkM2OZ0OV52oJBrlmGxx5yAKm+2m3fS+GDFtktNq2T3I8Pmf6tR58Ps6R+ygn16CmBDkivIyw4vRRhyTjghdnQctOMWt/7b24SS1uegdy93ZPT/HpAzsEiuqRdwiyjflQDNWTvb1oyS2VOoIT2uGih7zBUeRCB8nwQpodxrNyZbmQBEvleFOoJzURo/6ocCgqpdeJxPgMcwSYX4dE453SLrD+l2ZraOi7Ep4bQdCN9q37k3JNSI/xqBHah/k4l6lQOg2QQYDt30jlyHmE1i+gtdGhcF5n8q9lVkfiLPKPPIj63T+3lf8VaLa62nLH8MllCdqdqvN+dHrTOT4q0E5gZTZ1g/Pp97Zs7rhd/G3jXHpiZwY0CERzj0LbB7H2KpUXT3P3xfetfV5DxYUr7J27uw9f6NIjv1JuzP6Dt9YLR3TaHzzxzUwYu2vJtaLDuUHKsDn/pr1zXIinltMD8dUVGWNBBlYkbsox53mUz1KWS2+0DEgYHT5wkHbUcr9GTK3VQpdCf8M9M8x9DqWi2CFEVXXQLj39wqBJXNKKKaGRx9NccqTeypAqtyrV1XbV4+ENWWVWmwFtBhwf7198a7muZdVSW5Yrqji9IZ3xYHCrGt1lj6W9V9eY+gy6XpOtyOJIoj6K0+xMNnrz9UBvrF12SeeZu1p+2QjZ9trLiSkL+0rjGe1Yb0Y1/USxnYTdXFR2wIFWklO9cs4qE5/pV99jRUBgtCKIkzTjJwENxH3rYjQi7eAOhWYCJ+wEapj0JgBwAXuZNbWNB4XNL0fscOH3GHzS+xh0Y8EHtHIJDUkvlGx5P9lzqI6tyYMwom2tSlcOWkZ+DoIdhdTGGdIsQp4qmSh7tEwCRRDAYCAphD4VFAzNbqIrg6cKEQisGPAsRh4RPTQdeTMUrI7a1ne5vdacsya6NQGLDSEMM/EufOh2Gt5VKUnl7UKR9Pb9MqQJdjfZ5M+BUskTpTx7Lvi7qokVFSwhuBD+1BJPFCjE0kAziwJBK9GCYIqscOYyYYo7QfTEJZJt97owmKm92frcDByrwtwuYriXWa8nQia+F40lUNtpUVO69Qlx250n44ZKCmOQm6Zmp7P3KWOInwcoquFjbMOik62j1gdaRc0YrQ71KAXSupCYxHtPtcNPRyyYxpP/Br2aDVUpJO36i76h/g26Ya6pbqZuzoWUCu2MdrcnckwSBrXWUt7mphKU2DapdJgCYHfO/YXiq+Y8wHoldQNyEFQ95WhB644wxCZdT4LUEcI7CV3d34VkAcUvLlGUO5w1GMn+TZwdrQUbsN3dIvMUi+bBDvpVsvMW922O/AEvSEi70nZlPOdQ35eHZ6FuHESnXvk9rkQDEa/J/WQeBGQsMXdjHPav9jnlz6hU9FuYs7Hk8Uhi7sRGi8OzNoY0Nz+V1SkwpMnBITR4lR/kLBky+NmWOp5BYQUboKJxmt6ww6uoF5xtVQjjqayyg5GKoD+JVXh2RYEZR9atMVaFmosybFRSw0FLD5sWoBQCdrYuUl37Yts8SiBZ53HJk+aEdOYU8aJO+1XQB6Bmlq7RLTUUN/z+VlUlgskJ87w/iBP9zhisq/EyXmReJgsvnPk5F6DEY5YcyyxDehvoZ2Q6OvreVNntkIcOaFRYEuFpoYhG6Ra1WH7B7l0kLi7lZjK0I53Pks2DRyENHUoLDyFwbNEfHlAADIAcLGYtyNDAEDU60PFEK1lfC7tJbCNpLIBFnovVqGCDa0PhT56Q6eudk6ZasN3TW9uDbFYuwtCMEi6P2cjSYPDC4esMkyw50ZxfZgmiZTXA8fY4CxRrlJiUyI+yR01SzRDMoThQVhiWB/CWdhljfTXtAW9G4JXatrlcQx+xkt6q9BnmwRvR4Y6n+DoEkVN1dqRwlGtQngs7XB3LUeLFphYoKMFvhrnu//4+Lln6OxY2nwn/AWnCytjd84o0C1ay5WEksWbVHBtt3XuJxpNUgyfx5S4qWLOGmY6rvSWv0NxqGeVYHqMIFMpmXi5R0xzTmqHdg0L81t0hvaV1Gyqntm4MpPB4+6vHpMTGfAhZQlT7FFXNcDf1u3CUfjInHJdU8R3ejRdCTxfET2fie7sPFIeP3KT5AKCDN29fdbI+1BJZEzBPpLl5nlX+Ud8TsyD/G6A8Wiy3CVzEu6rvz6n90kXwqnCraqQFlmb8Ez4MPfRnXxXgYHOYVeXrk6e/GPf2nmdkBJT/He23KViTuUVc2CWYRR+XTXXvGU2e8U9BAa+sBEACodJFeuAXQKH9OejLz+IqQGDbGdDyRTq0fdFuC/Tw6+7af/aX+v2RdLPh2Fzn/bh2Wzv/z5XYZ5LbdUdnOu7FFplHGAnpSQlVweNex3M763bXMktpGWpRffAWj/k0bXhbCQdCqSA7LHeGNInLxTLs3s4KsusoNHFArDo0Uki+q1hq2LRLmibI9YsTFluH9D91WEv73X7QujhVWIInv43KzYjbCpZVWkooglgNm5gQwtZRG+AbBXKuAv831HQmqfDoSDXtZ+3pgZ6TotKsHRgeSr0my0FxBIWJ8d24WQXTTxpPCIpvJvPQH/m+u/GQkvc6vMn4u5aSxtUQuMLt1pYWcSBdd1w2CTYFe+Q4aF2sEZbgA99S4ulhKf65iEK7HJwkNp0+iv4vAQptvZxWdG6oTwzcce1p5ZYzp2Y7FAkDO/VvgvYyQGYgVU5uumIApyX9Ifc/5v/rBMk0SOMkUqmF9BAjP7kWjoFNwUih9hu9TKjie9YtafFFeE5GUwJzIBMDUu9pqyN19ZXUwpnqIJ7RJFmGV2hXPS2gDUs5BUvtleR7aYv9HV/HVrZ8bci51FdKvKE+2ttxNjbjPT2RzlT5V7h0x4S6Kx4GBssimNn4elhbpFqYCumBZtSLIgd1GFDZ6QY1qatP21t4Ir/AlHjRrfybkORwK+0xbBXkz9br60M9LV4E8UAVrzfl+KTXFpKkg7a8NFywhQhoMMv2s/7BIxmrmzaHC/zb/g8v3jQyH+0euvY5WECNFCVIYhhCcqRQIFv5vh+61Qu/hF1t6L5FicTN+CXhE58gVM8+UDekRzbIJYR+qKZHIzrSVk75WfV1/cA2iYqvxcTE3AKF9J9xVH7YGiLd/VUTo9cPhgJADiBJakV1/Cydg/4jwfc4VWfsC3wBTj1jP2hbrBAa8ZS3xHhKVDK18NUB23SqhJ3OJyWEMHWkBteNgnShRD3dIYU8h4D7xBv5xzba4VLuw52TDElFr2iOKllSrionMZ/lPU+yIbFo/SOBDE07BJ7+Pj/9UK63tc6enXocl/WLptaDTRVnomMdbbnWHtN/l44pLRR1g1t59kN8oYWbKfvM7ra16DFn9SHUQ2jbFU5RS0ZGYt1IjBZszYVrCyQ1rUO3mDXNl4hxfuqfBT4bSUpZaSg3IIOS1Um8sUlk8mayKMGqSGnlVBAH/VHoex6PXHqhXf3FeeWH7b7WwpymdEJTji7fPV6tkAIdbzO9HS+FC0GVIlV3xKoX4gTpgBcnxXX3ffOusxDdKrIee8TOZYZiMzc0hxmac5uL4d/APoxwXB1b9d284r/ifR06egUbi7NKpa9SdPH17qpgqpKZNS0e20h/06j9yrtQmihIS0pLO8SWhxRcN8V+lB3rWNLoJzRVuTtPp1RbWetBXQp+e6JRfGBb1Yso5KCzHvjwkb2e9Z61520pF2Glt1qwwYPfwSs86sHcEvk1i3N/A6WVgX8FPc4BU8h8Tw6BxXa85cTYUsHcs9/f3UdyVV6VgJm0lA6PfnNGj7CsoMagFhka1WRkbl+lu7KoyJeWbx4kh7LEHKF4CM9H9vTTodmLrsPdR6KCijlwV591vKY2+fjOmoeRA9QvfEmBDzvSU0ySpqdoRec6SvQw7rcVYhpadd43iQTmYerxpeAA01xy5T5sNSLgC9gDbp8T0l0aLVP2+al9xR8y/H6lVh580Vb535G2INuyN0fP/GOEl0IJXKsy8l90nkuoKpCXSq526YlOF2jZ6Mbn75/LwBHTPzy47YDwmMq8jjqmtB2ek7HQ03okxkjkWLUx/kKnuIZgTNQtSI/RstDFz94/+1a7aCY1/et+B3fgV+kXUPjLPQ7PTjvQVX+Iz+iDllwirH7mok4EGgUmOD8qJFQerlgg3qiXlrh00Chcuow7RZCgBQ+0mPuUurJjwYaqrERevokjhFonueTlpxeVT7/TINuZ5H4X5bc2+cooPSpC3ZzAHdRhwGXf0V+TItHaXjfmr6F8nVp4DNHh3kByWEtDvIKOzMoEw2p3m+yVjiKS9lKV3i5C3RcjaVMbMk/fMY384Dt9yojxO1qNRz6NOVaK43BDUr5uAsx/8zy9oLFtHjb/hVRhRdwiQrLBRWXy/zbLDWYrICXF+5BCNcge8U9C3ylifvFJRdGlPeXkW+kLQy2XBHDS0fvTh1XcfpE9Dm4LNgcJlWyJpijRLQfinl+264bCicPo5Ms9mh0HfZbCXPbDQsxcnJ6CFTagwPLQytQTJeYxoFJYJTiB5jGMwlshYRZuhfbqjTtjO3sCX9Ai3E+uGxez1wgecuIVz++s1GYCLyeMgWnli7OkIYd9vI9a+Lg/t8+wzIouxY+8jQXvcswiuG8Dw8D/OVVbszJq3pfgqLN42vJ41o+G8e8sXVn4EeSYLefzQa9G+/eQX6mPfsaeownNeK3S6NnDPXBXn328pjZFHpvEX7IlD5SmJr8ahdDhg1LRSCrGTrMo7XtJWXvlf5VEvIokr6Gov83m2XLLt4nFXTJd9smnFVt/oPDhL2pQIWxOsney9Ylj+z3prHh8PAT21cveyi9zzv4Wl9sraIqwkaqIM+jKujtH971OG2ta8Ri+Nvh+W4NlKR1hWVpBZbxTwBcIA+c+0T9RFW6EVKJj3IAZuAu+OPZ1mOlMcuGxEUdf8HfaVYrD+zSqZv4crnnsuwemvqztbliKvjGFpgcINX05lN/0dpYgJl4qIgTFNZP56I/RvrvwuFr66Jly0KUz7twKWkMFvKOCElPhsZx100aJt2RbCC3ioZG0XKLmJ1Q9HpaWD7qY5hKyDyPeB87Yh3+2T2c61euQaSsP+fFPNA+fiNLsV4KvjEiL4hQnue2MsIKjrLBsqwgwz7ppq0yy2woU7P5+0TAOt9Ic1fOaL/N5oFtprlErcOmKQ86Kx5eVAIcVa90KzWlhxOsRTfavBzEjp65bkAr55R6ia5d7//Hfkt2ydYztVkXepwkul30cJQ0Y67qaoJYaa9/fg+MOXljxzSwx54wS9MdLSRpVoTFM6LBc4JzzEyxHW/xYIPdttJH5Rv3vQqe5n+WqL4D0l3//hgbcmXxx+uRjH0xgp3wP/7t+BNG1C95/4rcEZLYseJN1fUkocOo2vucChecuXY+6dVUbolm1ba+IhJaYcUYolVpw8SDfOedHKL29o+WYR6QgvudqLth6DnviWB/jDboVRun+U499omhDP6wL3UKCOszbzBmLc1MVdXnDz5JPIwwOLcToUDgfnzUtHPbfqLDLsYDAFEXEN1Zp8EK8ETwaUx0QB596HS0ix6eMlud6++FG38Nc4NviOEqVc0MGpzm2Knf3aVm1lXU2qDuZ3yKtS9s3pf8xpM4+w9YED/HBbIpkpQMVwAAe3/lG8J3rr+NdA2STVqnGYb6wRRVPLzfI9gQVggpAHciXwQHyUPP2MluTCmEdjDPeacDwbDSR2l4uIsk76hq8GWjhghZTflEgSioNibw8E1sItR34fvT3bRmz4k85Zdhk4ugEgXckf8CGxWPD/gjyhP8kZFfQ9TpxH1zZbu/trI1oK+VUNVRbIhw7G3bXskppOk1CI9x3+3/tX/ho1Ndk+Yd2gNWkFmuxS43W9lZqXokkWBnJMcCDrT4s4swZEh9AAeWE27zE5eDSXz36LaKh7MR4Zik5HvLdZ7mtO+41MxEj9F4Dwl9bT6bhiEI/QN15G6fAmpAuN3qubmNzTDr232t/hQhdPV8irri3QhB2dofqIliRwf3wi3uy/9szIkLt+vhpZsbtFjeEFc4KA250P78j88OOOsqbzHsT87fKuqCX2eGaltZMkcQY1uc1lSHBNMekCprfEgmTvx/LSpKUBPd6bpeq/DrjVNH9Dwl+LfigwsDLyD2oS3+dyvE7JdlV0zCZlAO+fYlOnB7Zj7zw6VwmZjFhe2X93mQD5NytHn3hAB5P+4l9iijy0jgYQqKx+S8VV4n4ztvScC4hyUNjn06JJesxYdMxkOTY/GK6IDIfZSAVo1hw9yYncQVKS0pFBZM5QQ8CIh3iGkn9YEfxI0WNNwZKDuWywxkhKcUsDDZg591xo/muRt/nwlXjzFD1MU5B7rawrYW/PdJSeFQFOV4eWUkYcp1UbKnYnUtLwBKTewjJPVolipbcKtZ1s454f6NXUUwJoRSyDrMs+J1Hm8Xzm842GZ5uq8e/Tfyx+vjOzouxpuhmjIGD5/P2ibjEj66QpLjcYkZ0lBFlIBWhWHCPBkcJr/8AWcH3w5iQuPrIAYhjySNVpZdvMDGcyw+lB6eUsFHtZkUzmrRDgEaMBLzWLXbVzURplTV+itSH+zlQz0h1BDMLV+1YzciTGITeErIyGIQNsz+TTKNQEiiRcv9K535AwrQwLRQ7eT/knq7UX5Y/I9Md7ttIfZG62NYwxc4sPaLFcMSpu6LZtrZ/v8i+v8P6br/x42RrGKjyzckzX4x7m1amlHtMBMt+6UsKuwUH0Wc1E70TA6RE6yTwg93rPORF3o9q0GiafK5pZPbh4vlLE7BBoTpX4O5PULFFk/BImPtefo3X3ktKxN7oOo+9x0IaYo6Fu7awJqZd8ffYF13zC2QnXT4MVGTl5ugKCiykEkWcFyOSjVDH3/wxtt84q4RMQ05mfv6+4pw4ZBHLI49xxLZMMkTy94z3ol9Y9mPcC+UmE8yUvgMqNEs0GOKumx9wE0gHRzBUbLud4t24Vot8YAwspXN53OgEegJDQBNM4l8nC0l78k///bkuoYGRJBO2jBykTYGew8bY9nq+i4am4M7ZxPTOb0akIGVoqYt0/jd+HjfrrlZrRsOJcSk+yU8E3H/M6LgEUMDh/8bL422/y0lvnevr4JUulr0PlCkIOVKK1rIuqOZvYMvIpkwtNAV71lZoHa6dtZh5E2pXr/TH3/rgWwdowUeccXe9qx82uIOD9wYXoUesJ7JVNTRhRqOINajDQEaWb33QH43/QYrAU3nkJokJdPBFbQ76MozcTPfe/Dn4ywfvrdz5YB0Co+iOUVnAL0CZASl+XSD5Ym/nDr9Lu8i/kKi/UK5+WtadU7mIbY8/mxizyPIK8U6yvlq2kwHTwsfmfhWOH76Tl3GucVf//crwYNN8Irv7eLo1fVuBlS3Xst5hYSnANJMYXkfBKEI1GXLtIJN+fQ8LtMfABLFpR5z1sY8hMzYUtbw8KCZxQKw8PGok35lleC92pqTzUv1ZwnlrCwm0CxIvSOZ/SxSHsHWUZYQbg4Il51ATaOHJBAOiyC4HL47NoAU2JI8FfRltyiQHfgFUXg8M/hJYl+yJUe7upT7v1V5fC/h0nHzPkvrcUr7b3W2djLpnA5+2wuO4xSS5NLLcezBpcmiu0yfG0teEJkGliwQ+S3jtkxpEVC9EDLRJ70yU0X7JujAxejMF1fYhtAW2D1xY4BLK0RH4CXg91BSZn9Kohj15JG5YDABKH1LAR4toEKF+pkx6rVOFOic+1Nn/TZJPUsmseiZmnDiGbBL5fbH88of+nVi1dkjd0QCfWD0OcgUdGLOck4IR0utF0Yw2/Vx/vEMiLZ8eDW7qGgwMYs9qZo6AV8dWvdwP49Ccx5yCf+PyS5+Bncg3g+mDveu1yZvk8D6NXGh13ErxC3WM/qGrB/lp6b6oYRAMNCQu5fkIYed0+TdEDzXuq2OrPiowMI1UaLVkJfmD6kaMtUKb0HKlHWNb+7kun0AHHq054EszooPu0dF+Be1MLD0f+zCJhQlxGAjwwB7/y3vQu0iHKgNSg7RUH0ZM4qMm/i/w2lFegFnl4ByiJsJbOWR18yriNuiPaiF1rZJFjrgWBMtsVj2DbK+4G8Rrd4ep0CC+Sx79O5GB7KHUwQ3pKyrtil9eI1U5TwKNZD3s7knwrEP0AWbB4LWjdAIdnhikIa3UNRnoZjUpd6mnZA9A+tuFBZeuQ+O5RWRF7QrkQGIZf1O9IIXwmEf9FAjw6OkTmPi9gOjZfEUDIisPRgy2ye5MZPqcFczmDwwYjoT6MM9/DG2BHQM39DMklaELgvZWR4OWq7n19+T+JWtnSdvISa+mTmXH/01iYopTEntpIneBvdASN/2upfWfI91h4Ko3x09+ytsRW+68OfmVh8SRoR5OMHYLD/peyEjxH1CoeBvA7949R46qRqN/rx3bE6fJGRInbC2RY2djd+b1coM/XvRE8+0J7zxz7f7bOhptZDQi2pneP+13Rp8k5roNyYNhqf4R12NiaqluaUUugo6TBenf9ucRVzRH+juXRfX0GlhJ9IOrXFsfbnaoIINU5dwUkYDMLmUvtSx7eZWz5IQxeWk7W920s3tAFrorrWl0zzAUfbrqh6Dn+htSUbAWWcRAd8PhWdvt4/E+DgrflRn1DBK8djQjyOxtkJnWbu9Zj/6drvLEofTB1uTsbA9jFpO8LFgfRAuQswXlQVsdlenXlwrJ70MZcq6gIuOkmM1Dax99a3+OIbspLKGsrgqaZ43n5GW3hon6euY3YUDKPWEeZLwd2gsBP87v6qH0vTC8sAEGjF9ZOIv6UGsYrTrYL5GL9U3LeeEayJ5Vz4zNefV6yZj//nmSNW6RZ6HwvnXouXX/Tu+lwdTBXXVSK2naLxG/ebNLRe9EuhvUNrptV4+34E2V+UNlat4MMOPZZR5egQCPUr0tHfhh5IhniONQ+iD7A4K32Yqsqyme2aMOgJQviqv+oa55Hmv8LJ/WWnNdw2JpMUWuJL37X6b39XA7LvUxEUPKsNzzQD96IAFLnv07UfShofRBIJNcCU+fswlj98eq5jmo7jxwT8sKaokK/YLPHWKRs+Yj82isOozFOcYTDHPDTyqQe+ecvkeM8Shyr6v6tHXg4i+9gX93k2/t2DO/6TifGkugrsWG3rsbnR283cXgbnAtykJVIEQdq4ti6FVU6bdIeoF5tADKTmDHigfx0cjefmTYb7DLr7fkAyac8ZYG4Fi4JF8UgTN6/EdExWLRrTRbfF/Xw1O7X8j6e0+kavaXlqqOfd2A5azkgcwdt7fOTegO+SchN6T4XsFBk6s0iu3O1QF8JRf3dJXEqmQY0sWtmKeL3L9egjzMlMAGFjeHSfdQXb39yZ1DxBPQPt3bf37VvGvu+27j0zaTerDGd2wH7349zxLhBE7ufv40QMhdyfHa4aO2kG4BPXLg+7uDfzioHk6C1+SxJ4tBUJDatp7J0u1OGu0j9s7io3pxSVbiJqtNbvwviLO1Fa1Xj5rFfU80wpN8kiLF8d6+ZAOrvz02jySxdy+wsj2T95/XQQ5XF/88nUe6q13eMn5HgfrzQ3AVpNoYTi4kUOUVE8lQI6riCky9FWie/YQod/XVRzJanbRS3HBOc2wvFByuMRDPqyb7as/yUIyhWYsZOwjwKMTDFPF7xLWQeTiL81XXmWlBGT7G/pv/q557EsW+4iJCsZy6MXA+7Hv2W5+eVAjQq3vwAr86eG/wPWi5/OGaY6Q0IMoQuhWdjdLzjii6muMzyFxb4ueYClfcGDmDUO8WTevLuN7aeZkzbjjuMwriqv4HFyG91slGFxbcsUHiogGFKZrjlLvgjXl/26KfsdNovd+F7f++qkb89CGuHj5gGVeAZMZoWVF1Tir5PscE84B13Gtlp+sapqI8A/zTqmDLVgJeO0ALOoL8lu3ye/ddI0evjf6ZkZ0u3DD9vyEhlOtJWwpej5dqxps4ONbz7nKfa/aO8cnrAwZzyYPecbx9PD8MHtnj1YZqdddLbXw2GeHmt4zW4eB851bXtiP901CodHETEMa3QafwpwPpbUZxE4fuDf5Z4wcR+Q5ds3RvDUZtuBkMtNE3rg57Vr6Hs8PFjJ0bjjhYwn0cDthBm8GQIh9bWzs7W9t1PnpJk7G/VJ+wcKwjIO5xPsLJadPGfQPGI4Qk5IZk36t+dVfeby4239sUalnx+viZ/4w7zeIbGPo0cQtCPJG7GZURQUqmEw0v4DPQ06dlHPVLrxGiUZ1jyGG15DUV9Stbryi5v1FsDvH9rDN33As18lNqIBKfD4xwu/jG1AQtvYgR+Vn900xscw8U1XopIiiqyGSjftMW4kqN+vug9Vb/5Vv7Zp2+Pj1Zozyxr3Yt0sfrVelp/1hf29QavMmZrG6jSlPwhVGsoMzSUFUn8U5/0yPqU5nf8m9LJpu9etleQ4fi3r4tj5PqzyB5PuXdjHoG8QntHxjVVxc8+nc6Xh1MHwQ63Ep7SP90vCX/964eRzu7B68oGQ7/vt5yyhPzE0Voz4GICZ86b817K07UAm/R752IQzHevBaOvLxisHjre7qFth/Cy+fcl3nvva+o6ZE8C8qrT7z362jCLlfhU34j91HAl3++FZXknRV9dPyHuXEaVuGdVXPhHHXtyrFjUtnCY1dE7trlC9HKNuyN2fJAXXa8Z9+Ou9Dcw3oTdUDcWPlfYpO74hPq/GO0STJ9sgdXAtPuZ/fzQgd4RfVzGvl00Vc73rs0HsuooFLsb8ECIx1CnwdHJ+rdipL7ArU3PPvqFs4nLa/j2F5U3omAL4HyzlCRSUlHsb73WYWeOvXjlXTcinipemK3Ws/VEYTC7dZOFjEg5fdI/2GDgXkhSmjwF4ZEaIDXBHymcaKINx+eOdk8mYGJsfMojq1Cgd4SBP6hsUStR5FDSZCEky6kSEJYOlKD20aBPE5B4BTDGg7FpY0a4ZxoT6q/MA0vfkx+sCN7C1WmT2JKRGLFDl5ZyQ1l5OvE8aYTCt3WTL1863a9AW5jRJQ1FiLcoM7BB5iC+BznwuS+IN0Nj77aheUkDNMbVn2In9GdDYKClHmhhUPEG63SElgHg/JQzT3wnY/4zX3ZBSXcydpowdK8RJCzTRA7gBYbp3bWR8BpnKjy0NIkqL/PqmewCQW54/BkY4rxMePVD7wkI0p9jaOqPcuDRie/qlKtm4W8CpGbJWsAlokY2On9y2D64LugvzUNsJjUsLQfySQyc03sBJjtnZelS4QEplf83tXjnQgN6jvtzo86Ff2X2Ic4n2pf9k9jjgv9+zB+st6lfWWPnW+vOxmbM1qMBSV8s/kKxCWVukidpUwQ2xjvKX588BRSYb1HUuSjOg+5RvvtwzXHJF1q3AlS1/uCC+zq9wLoVd8PS0k+SQuwuuOi7PESAjjdjgfThfEB+7J/iiqRNqbonXcN0i2EFjbBeo9W5frTRLpmhL+fQzNpQbAgTnCQQKR3K9L05w59Egpi4J2H+ZDu5ysL9rrpputBCYTSf94MBBZmTcY0NEqnCUtZo+3zo4ZeWfKwo8oYbLaAPuY5kfN+cuaNAh4E7bmbVnNxvCbkXuHCnqbb/FbjBRoHU/CosMkvJcZElqeEmzx7EzSZxem1VXVQOZD8RzByu9/yzKO3WvgHaONuYPyKLsjs/yCzoh2fGo2QuvGhRuF7h/gW2ntELhvX+dvLLyc3RZPXvqauxaevxjTggz06N8rZIBmr1G4nIdjQ0ccpzfvr2gonL6oaHa1N6LpNZaXp23ZknCWkF+zDdDHv9v32/2FmNiPZ5YwDPqlevbeX/qZWMu5YS4lRxWq6RLWFKxFstF1wO3bSBRn1+2tqeBOUjx+2ju5jvQ1fCZvx4DPHu+Ym+fkvk4z3j9VjVdn03qD5iNv8/7GjqeC2TkL4k7Kv2D2IPWIKwqcUZ2cfWsx2mYGLbwmpPyfeLwKEDjNHv1F7MoYCAmkZJ45KYhoSkmMNDTQ78CtdHYkNoXhn7Nze/4Gdc5KTHOWlc9Gu+la+PvmeekJh98dT8xKLGpwR86hsgqEZ7nb5nT4ER0Gylmush03pouw8WUQ21hPX3lndp90R0yAHqaPPaz6zd7JCbAHB1v7ZEt9cPFsZzxNFF29iOxCeq6USiKGCJNaJB8M0+vvuRJaSd+Jz20rG1vf9LriEZjjKkMPYLESotr2gBuYfvejuYKn8Idr1z4nBQlyfu9xpgyUEAEhqj30JGWQDv9eUKeZY6L4wACALRFOYx1G7tLpkZN+m39lhCwMGkG+4kabf2KKFJEYJmBugwQ1R67TNojGsRPaoEuSKLJhangHL66KyvTBq1kCtZIWqYiX32JjPXbyblEFkZRozl/FR28ia2Ij8WXRTxb+I9sYWQy7McruZRHBgSUAg8okMb2J2VrZvYtyPwjPGyqcQOUC2aML817RbowoKpy2Qz1hBAo0/T1I0WPzveMuTGIBroi/SLaKWOxoZKDmgqriWHhtz79Pgt47NDTCDX2khxOVfRr0jk+VhmZxhoiizGokRwW+5a4nhJkjS+Eay/OTDAZYYL7kHzP+e9Pq2CeAA+ACgfs5FKmdYeZYTJwDyi1GNHoDeLBS1M2zJkNdQzbAFU2XMAYwPBpNOgPoqn4CfhRbyO+CziP9UJrpLBk+Pt+hUX56Wi//RswJ0X8FgaK+4SrcWjJfHWL80Lx/LxeShdiVvVVAp+gTkAH06NHvuKKA9HuAAFNUVlRHIjW2JfrXhCSetITEQgpmIaTwg9sWhC0MG3I7/XJCdpbYeQLzUdTgPQFSDc9p7tj3HTbel0F3yGgYtistQ5mhKIKQSrcBWm+0D+F82wzSUByCqYbRp46gOHhXK9dp9cJiE+QY2Z+zmanlwKhYnFzPRuO1F+qdg4OzHhKKy07dOfe1EyDEmpACd7ujYj8P2xHcUeaQg32paqkWHRVUKMVfXhKF/cyeR3lUolddCriq54FkVFrNiJxpDk1QcgVjAfX+dogQhZZKAkmvTwbDE6EZlQErRArlQNEOA6Y/LFxonSVEM2vlHxsCjmyZJnNON7rCmtMv9BIMggZ0JDtRXlIwML0vBqzelHEGSpoTQgOI3EW5QGSe09gU2tViwqpV+ZdHo0/vDkH+wnEw5CaP2RpDgMrXGWTp0pJLoC8NvGFOYb9F7s9ktRSE7D+zuu6XdQNN/vOqFnND69GlKQvT5tctU+rXRyBH1j5W7vjDNxN74sdH31NbGOqIP5Z3pkS5rjSTi3Lg3mQ4KtZ+hmwiyQM3vUNZ9UddgSWwsm9BlYwsuTQnnxskDXfZIHDFwbtiRcx1mJBuCIJS73cI1FjqJdP8Dxc8rSgkB6xrCpkyYMF6oEzYhc20AmWDJcTVrf6pwpFXA//h935tNWoPVhHf36oIV9LQxGEnIAb9f6PddR4tijTr8OPnsRoTKQlMU1998MzhcLklk48ylS3YjkPqRJ0AkXQBMJTwtCcFNqexliKpGENaJm+lIrS2FdlTI2uPtTZVBR8+OQALSjxO6Wmmet7BBMbqdW9jWbnpltxlSS5l5L3RCkbGozRwWjcPeztnLQw848wIELbBVBScvpOTM4qKBzL5a04/1ZvlqPpdh6bpSVCdMKlzwR328IT2YwKnIlENUQXdxNBeGq1ixoBIlFekKZMJsFEqcsiBJWe8KgxJi5VyrToemjGoM93EeK77RXWKBYqCGAFhz8E7HqO9HAf3IDK21tamDZC86JkKYJhnHpJlnGQhHUE+a7JgicZwodFIwxnR04IpcbNJMLVORcg9mJIpkHKMD6+Q9Qm3zmlQ3U58eNZEwP8C7Gdh0fFpZDINRRZio19pMqRCsSDFss1UjaN3tzM3eX1rjihcqz6eoad/4YAkUTpgwLzNLRMJugPnepQ/Y/qth6A5WN1wfx+HfUQS/2zYriEcgvS/d0MzuOErvKeRI6z7P5JNR6/Vmee01SYJ/Uwp+09dL+59777WgGCiNH4YL1bOES5aBZ681+Sr8U5qCR7PLlVajzB4nkX0J2Dj2irMGCyyJWnN6pPUkRhB8vS471jk+fh20yg2Z2k5cGEfg/TF3sen7fcZw9R2UVGRzAPb24IEzQxNmTVlmwPNDTvQFMnwMpnc85+KhJyHcUiaTmxBTJS+cgrj1ppteuv7mm6+/fl09ohZEkgv+rK/oPj3JF8L/7Whve8rD/Y/ZQPk3cf6kjWdvvvbGG2+49tq1BwEscxN8tdmrJH7MXO1J6c4dPY8MOMr6URH9GUnxUvqV54yo70dLtd/znkUFova+uDcoAqo+if3q40VsT9DMY0iTyZS0OejdwPhnnR4ZhNrD/rYtiQW4ioEKvzINsExqT2AbMSlgjuBCwPDD6qnX9zqhoBIWcgPSwjKQHl4/imOWKMU5Y8TV4Tc9eGYDASfDzI9FbyDhkzed26Z1DbxfeHDS876fsCeY9FhEvPAEO5r5DobZ+8pMGoumCUv71bkcQmdEdDd1+c8ahBOSFgVYqxokha2u4XwmS0QSWW3IZwifNigtP+KaRSehMfiEg2TDY2JWbtuLm4yCExZ24+jU+nHf02ZlA8Q0YiJdSB0XCJJNDWkhLOqjiYJ6pWJ7UnI8KSqt2RwWWPrvsZYMOTL8YJHBg2HJRa54X6oRZCyv2CFb7StMs9vVTyClRF1kkEASABNAqaJh8dQJsmKWE0nJlnS2lNTSYdHovVWFz54jiML3I9ZStoBzCFITI2AmaQS6HpYUlVbNDX34RhxICnFedUiQpDXbAhWUFnWdxpkJlUrHKB1JfJa8qpIorUiicIa8uOngIDaLdebw0u7GEZCt7MQ0JyXZ/IBa7rrNJvLelrx0+jSgxlKsSpqe9zSEGNIbLATYEI3ZUH8Y9h/bWC7yvLMx80sGrgg7Ax9QuNbQIOp2uuS5NQQsfn4JhVVyiKWhlylxPE2W8oeiUEOosVJk3jigly3ziPOZsGDFQwmsoOML53m0ZpIoBUV4GzJy/JAg64Zpg4xPzAJojBdXHGLn3qUiTaM4jiLbhZBEUqIjNggSQz25kTfIXj+axEOZ5XmW+aWE+h133EZBZojYGSIT8wYWrh03v6uyMxc2brk7orV9PwffZBCd26RlggAfMJ7LvrcvLfg8sbECJZ3KyxYJiaJTp5yHhfF9DjFsLES1gYzLCa0C5zo1vkoxG2z3jXi8Poq7v2Km42m4w48086PkuaBUZVGFGvzirI/EWTa0yxSUT7wdQTiYEEFG3Uls4FqjyF1jIwKDh7mV4S286mAa9oOiJogDhyDX5IQx6NqcVGBNCqv5OSAj8CTSBvAmiqBIz3RwdqEorvPry0dDTVaKk2xSZKNBFyRb6kjTWLtvlEa++lkqTWSAucziHk2OJX8bOReeSRJeUAtYdQnY6HuZVA7ogmnGzA1K7V+Xd+DTOnuC1JSPtmvn3pk7Pz8uwRBBNAFZgt7NQFu0UnlfX9gujHDTmU5RinFTPNIj2GfPJV2jzjzfV6TmaxNCsjgmBMzN0dcw/xSS68VSKp4klIKFNaneQMdXoj5dpSN1f5paWOt7EB18eu35g5cDSg3nDllthoF9hmWxt17kPV8VAb1pvtg/cxD3K9fr5t0+y8zf+6Ch/neWH9M6rH9i3JMfkijOIkdABRmcU1YzIolrCto6IUoFc2a5lcpe/d9lGi6pmLQ5M4E10SpQ+n64oi/bd5ZGMPHodc00BJ/DRt4rtRTCEDjXJo4eNZ1lU5cqwxGhVqXe1zhnsv/+322MunNG32s7zhyjt8Q780oHeGmtMmvjDn3oQNaDo6rKZh44qF3DZ6fdhNVyswFeMn0C1wYVKVrMcaufGDK1n7Y1WEFsOl7MZlNk3YcyS7NMioNt+QwIr9qvOfM0g9gAHjsFGGZp7rWdgKrYN7Wxbt16dzmJhx50ZLaCaRJQ39IwAC3laW4jEx76f8mFBdJmTt6ZrA3+1Il0hZ26zGA4FQmy1svt9A9VBQbXI9FwfpfPsYWnXQUx6FRNWSI7Y4bcjwSSxAsayHJR8bmZzcCa/p4oTmi/2qA9m6hiFza9Sl7StB8aTuhh5zWpN/a8H1iCoVU8b9Otp6kP+Wz4n4D3vJiRTv89voFA59E4Ts+pJGYXyqdSsjd+DHB1df6LbFni4G8YuIkD6Ih/DHaQEe8X/xqJ0ASM40O+NfeFcm9EJ7mZFHBEANJPr/3iHa/95n9KgwfEh/35zZc/M+G/T2Al/6E3/3Fxe2rk+BYmByTofzSyFw9nlE3iFeIpt4m392dd43xa/rfrEbWSEegDMPLuq14rp3IeVfyMik1X+RG3weirWkXCdZmKbNfAtzn1D+c7xwH/kB3+U50cDgJcVVJZr7tVl8CXLU7pG5Cp48TDCNQTEOOrfikacC0zeUby4meQKrLI4crcVdJZS3ykm0QOOIEFAPukqts12a0jy5UWHv1uz2pPT4zf0a4SXeoF0XrSNJgF/IDzTMngRNLQM3vxf0yZbtvlACUhZ5rgtN4zlCbBBcTebfsVw3gGfkyBryEC0xrP6oycRb2U6feJl/uMLFHE0X6fKe6Cm8EMVbfaBBTscrIxhh45eiKyR1Hxsa29C0zWsr8UYgslizIGTOGBFpSJo9Qzghs94Tg0Jnf2G8B0x3sDR5+d3aujva0Os7/laPI/6noy6dp0bjMp8AkxFU5kxgKDbgUK+Jzshv4+PxjWyxndl3JCdP8FBg9Rg5adH4J/GJIc+Aj4QZIlux18BnwDt+g828RIQdIMd0WJSvo/ZfSUL4D/JBnvpjAQ2yWEQPoN+FpZmsSnxDIXR8H4FfgR7xJwEfrO0X0rMf1JIjHb9QzTB+Bz8TuXqpPucmjNTQ7/7V4ehL40fiVwUMDkH9SmHR7OWfZXR5pOwPNrLZCjZO/nyKY62mWdoR1mALDpxs0vN1/b9GjT95gB+J1BLlRggQmBwgRA7LSqFfMCfwW/Ojti0Hu9BXCUAePAUSaKs0dBLnDrqAlrgxy1R2phR1ksLOXIkJNW83AkgOXWdRQJyMZ06lhsQRdEbOd9E8PaLuBSRDHVlJJLDgZMeEOHevS8SfGkbE9MsdUL4SWjhV6mPQmlbXpezMiU8NiUW93gG6VFwk8R1nqx44VBMX4OuYWY06+DTKYWRg62elHXX0A2+sUrxMTWKaDmrLLpWHgEHoeiFj3L04Wzrn0NzSUTBmSo+8PCESDWBTOT5NM2EoRgmVaOxEAgIxuMXLyV3gaX3wh3DJ3qZR643yi23CCr1AssOFLPyRWLiSYeuUx2kS6XImsWVmgkCAvjJTd4l5kD+j1Jb4NO/G6e3ptPHpWOKjfxKcgRfilymD+HHOKvIwf516oBnk3o5/GRG7kJfRwIspfzndHDDkV2s0uRXex1ZCd7DtnBzkG2s9aRbZEg5LORMGQLc/2had7maNrWadyu0bCvU7/PUbfHUrteo2Zdp3pZp2rhUzmnUTHPUT6vYxo9kWXjCKXjOiVWKZ7soileo3BiYRzWKejblPzezuuEktvZhi5fkNPFom+xjux2nay2lMwWi9TVfoK2XiejsdMbnpJW2amVUDSlrc6gqDJbWcgERdGEPF9Kdq6Tc5DGjpIS28lxNiEpTiMxsSXpYovTpoKEhIYURVDiQzvOw441Z4HQNBHj4rbASSXaroP/8pHMSDFRkTJCQ14TBQWmEUj1QWla84+vroYugw5FozQVmoakohBICkkMmeSNJKHWIRLmIPhHIv3J3l6ayNsJ6YdcB+cVC9Y3CInxxSB9vdbxoaGQahHmxf/R6wg3ek8U02v94zQnaUCLJETqpIQo7enLpUmXdLlSylXABL2SOdu/Q2MZfUk66CW1dKQrlUvKUn5vvaoNeOgBQCMHsXZ/BQCuxmyhOUmD7tJJ6cpVGxL8lZuzY3766RZmIzb4Xgoh7oTVetJFCzaSaxbMut7DJK/msxJVC5a03QDp1WrFITOz/KvaN24EeJ4ZtzCYrDhsDngWKA9t2KB7RUIBmuc4ZQDCN0b1MgsUZjAjrwwqzfbkDjA4slzCg4UBIGTGY3bDJ5y0ma1bA3ASngs3AAAA"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_9___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_10___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_11___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_12___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_13___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_14___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_15___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_16___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_17___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_18___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_19___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_20___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_21___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_22___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_23___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_24___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_25___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,d09GMgABAAAAACZoABIAAAAASFAAACYDAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGjgbIByBDAZgP1NUQVRaAIECCIF8CZ8UERAK1xjJEwuCEAABNgIkA4QcBCAFhGAHIAyFHxsHPzXK7RPF7QCURV2hEfz/3w44GSJQU6vbfsNxEsJp1AEjIQJE2CycTDpiMXFTuIYTHnW6GutwKhi2tx5e6ybiUIPVV42use4r/ZbNfWubZYc1bVed3hNBHVrdPtq/gDFl4nmujn38t1qteSfMEdWpdxwhySw8oX98fyaZSe5CUCW4gliq2sq/+i1UPWSA5taBm8yBMGEwV2QfwoARvZFjDYNxxDLIUWkUKQgi/YpRiB28HfyD/40VgI+ZiYCIWK/995S6Zp4ZpgzNpYec8COkmHSkPspUyYH0JWNIuOWHlt5lLt2VZaAQuaCMKhWANHEIe5eZJnznAoELpOKzn6euBO+3/dLW24wJ5zvaKhla1aF2HRPOomGpvlvzDdJiOSYI4a4vS54O9cMjv9TZiwyS3tpJriqvapkMn8jexmmd+dMTch2Ah/5UqtZ+xnoZY1EvYKVSvsdD1POcV7gsgU/+JsQfJLAwCoL27laTtn4c128XZWTm4QNMhxdKHb4QVT9v07L9oy/tzi7rIID2oRIuSuA2RZuiSqf//nx9mpH+jMa3AwuyFLKORpID0pLlkOzwIRVVSiBZ9pJ87LsQVgDYUZWmTJ+iqJIq5W1LtRrglUWEFqpfvS5jWgfSdVOPIqQQESEgjvbXWIzgKMpZ1tbW8lTDCSPqUimKG2mU4h6B4t3zjWBaQSpji1HvvqlsAIG6CtLPhsMuHo8e+NntZxn0SsBznl6kAJLniwr08JTF+UXqYfvTuyGD4u0B1ChmrD2wcoNisivAnsXLBErAvFFofzyoqx2BoCxmiG4PeixDgelhdxI4WCu9AcAZWbjx3gGujbNyvJopz9FvWDrVaECBGmURG/J2BPbnG68L5OJlHe1vkwBUB+ZNZ1Tp0lJfY4xXzi6SGkHJynnSIiOA/jNO3YgQ6sGS2IbdkooIj2DYH9xLADzOP78KABsZ96BFLsJYGpcFRY8uKFpYi+gwpStfc7VVD9SwoZSAJVbR52Zojm7W/f+q+Y3ztrmF88RcMJcAkPPPj3uvJIARrb0FmbwFA+UBjak9xuYSKJN4P/0N6l95Pt8mLfrSWuv/B4CrjNM1FMeol7ugU8d2NrHTeaRXUbGWrSjYSC/ljLBByDT+yCG/83+aKJNEIcux3c84h1CIvrCZHraX4p3sr6dj7EY8WE49KpVlW0IMbMT9yofZxT4aWE+3kNFRSwub6GWUKppZR6dq8738TxnVrKZdEjFQy3/bOtjKL+G8LzckpVMI9vtfAFVyT/eWrpbmpsaG+rramuqqyopyQ1lpSXFRoV6n1ahVSoVcJpWIRUJBQX5eLpTDz87iZWZwOWwWg55OS0tNSU5KpFLc2QzVCX9TWQuDlO+vT2xuF7UgPM3JzebFxknhfjmYcAQ1ETuaSv3AWOsNWyhQUXffHFeaGQhfkkU5gONqvdGMR5NGqNZlRpyRuZLDalcgTBGBpFuMfrctPeEBLlYbNNs2tCYTYFL1iQSW8FvKJLxybjv9ZQYTzjOqji3LutKXPIi65+H+tS1aq2Q9kJRyA1THq7OnnJH1NQK2vPH9UguIQHvRLMNu/kH1uAJYRgRH8GIs2m1wmY26OBWeXDHazS15n4tzhKb8+pZ02olAT+L4eiqp8nWpkdwAhr0uy68ESRru+bQmU3YRwypHQECTY7PFSDkyzXkNb7JawbmmPVS0soygwx7atxHyxG0YMCdJwiJ5WlVWFs17+bywzvJyDT37QBDMxWkFCQo07c4JWx1Tx9UpEpMkYZ/8lcf+QQAf4WuEMdoox9PGL8xrlbrJiN701cpBh3P6vpPAUodi5sNJwMh0JEdPN/JbBDEmEkmqe62P02nXiYw7nt/lMQIRJsJm8IavI0sSNaFmYjMfjPWfxj+4A6qsQcLr/FSfWlr0Sp0aGu6PNJ00NUdn2uJUOSKD07kHMy7i6hr1wRKDJXdDdJ5BxaccWNFyl1hUS2TWpqqr/dWhIjfQ9v6CLZGQivJIcaSGxIlMwNf3EPJ7gAuOFkdzDnIPAtvI/y7XXFPrlWa8IIIay9ZsfATLoDiC8nsmUeix1rfKzW2qE4y7B532aJLUEzfeEwfhDKnupfYhGZfx+DYPrGGrJvfkvQ+8pajJGJWXIWnXnrqVbJ6zjyOtoCagggAlngVNY5udN6LRCR7MTOab3NEKLaOhpTc6syS+8aDTLj9RMXJ4l2JCkbUfi+Xma3FmUA286IFVuqxu1S2Xm/QQD3g4LJUxLugw16skdEVsx1jpVCyt/NwJYHL/eDeNXxJbBEsMclgbDioLSJgct6HmtNh+RnW7swFUXKYikDTASRbnDC54ZzopIq+Ssga+xp+oE6uHetKeJHkWNynl1CAxrOFpSRbGelDZDVp5ZSY693hLXHKu6dbajWWxIGJaGeSTFPynDC6aMtZIy05oE2cZbL/uOK5k3Ej0cdTSHQHMrKV5uGVZiNZsVdBpTy8UCMZwriGgJIBEa64Nzjiyu9RHsCUcOfiGy8AVx3ENtuxXMAAMEneVJEB9q6nZ+gDpQCkksJkJVD898kx5hbAQHGyxo02a7dfj+7BQFWGz3LV72VJFXcq5iUaFZKgBM/46ODfYvqA4tH2SxEWXFo4KjcPCy+6mnZ58ewIcE0yaapcjW1x1YtJ+JQRJiPBYs2uasQCWmRmEOlKBNSgtAilzj76pgQvPaBDNO8q3crYSNg7Z4Npp4wj5yDOXHMy1XzFT7rQq2KCC0Tu2yHKvTgQaGNIjQM72wtWEivWbc1+EiUAFJCpyN2NycZa+oASBWZlgHNobECzpEFqPMHF4ef9eSgDA27lQD6Yy1K8Drt3QAeJMbYWdAU5imouzBNIjuwDgkCV+rE62/tBJdMZdWXtHdvKYaHmktJx81dG3J9ayPZqYFlkcCSWnWYzuD3Ld4S5BlBOo7OeiH7YYgDYwwAfLT42CGWwGhLaXA/wrAfT4lTPyuxNB12DbppSpTkc6488wrO7YnWMB7EtuRCApym+gxOrWFtVTlsPJoZm5c1Didm61lMCQC3V7bVZdQpUHqekBEkqdaAcNJODv/5j1TaC9QZGnw7byGd2VboQ89uoezFQ6BP3sHvAghyNwWNuB6i0uSQtnVmocyR2/8xwCcRXuCMFSitoPHGByDNrT0HMwlwl5Yf58cTIgq4r+e46TueUiRydguKS5+Bk+tXKSARw+oM3MGApUKXDpm+p2ZYiqLmMryju5WldGuz8fBvnQXsaoxk7hjl9jZFCahLTZXA4lh2cQSKpgiWu0CnlKVzd6ILjHlTkbkcOqw8cAiCv3AVTxReZtwoz2fDrw0HXaqr0YsOoxrT59YMWuxTL0smXRDlKE6dcx8IhS/kzougxbfP3/omwyhilw+q4D1uVwC97+p4LduYJRkOhU4czyTXEuX4Gw+H/jpIWJSdtVJoXgldb63GX3Ba/6WmT59HdBenFGryJoWvJgOahiVqESOehmF6uumCpec76dEa0WjKZfJW8wa4QrKg8Vh74p8vj7jYwQqBBz8KoHLufiL8K+BU0get2OuTJW7UTKsqcJWMGLNDOIZt3VTHAkmCjkFWoNhygGThE9MgOV35mJE02eaPwbrRv8eaOZIpxBIM9whj9YSjoyLPJHa3cwGHsmcQN4dYyd96rZoPh3VeGuSGCEEG2DL04+Iq/aoZUruQdFf4UarORi15Rb/9ufoNtUUdWXcn/5p2HuBTgn0TP5S2DT2meAj4hYLIROnddZthxSqz5YWKBGdSmofMm1Ty8QLPAggBjcosBDa8cr2I910P8CwPsPEOeIHtl4wXZWvvgAlUdhByHOMaowrmNM4Z9BOV2HAxiUTI/QkcAKOOXDrUrDfVSxb4qK8HI4XMG9fWDElw8RGm41SiAM5XdAlE3am6m81sk3+xO1veiXWnBdzOqvoTMvprZPpleZ37cHtavddJtivS31y9zsZjqrxtW+6uDtMySZZaT1LtPnwqiepEL7fW6ZW36rlI6/1VIekqKddPoiY0k+3Obbl5IFMFWnli5LRS+G8C8wnW2UY5uIEVJsbEzYD4z7MjqjWLlF3MaHQXmSGD5X76idtx6V1n0/dObb4OpwV3RFAiplBIkBk0kD8kzVYqusvoXgazwXzS3djtpdQiJjVZ0jBP3MxJg7w02KH2M7yof457RfV0OTX3hK/zW2LoQcC6N7B5tunHAIoAmsJbXQL3Tshv0fhZrwQENjOxFDR/Ql2WChpxQYRYayoLykjB8hK8Lel6Oi5N6FqJtzX/GpO8PnX/BuyNyrfj3jEijSB0GqBsPzYbIEuG+UCBK1FuRRqxnaBqFOBTHs8uDfB2+ExbZIu/LVAA1LcUNi43kmGEyWHvjAS5NEA+iBwWNo0nRs1V0CEbCf9U/2gLR5rtzE0xYwKQijzRFcEMb7V3Fb0OIyZTmWFmBp9dwi4m84tk5nRtXMylsH+i1b0zzmFafj98Xd1ug7+SXdUWNBAj31+x8ZgloIg/7HOALrpJeskhgnep6qYJOYxagdwkQOQY5ze7XmUg3zmpZmMjmj1ntxqN+Js0HJ5mCKfZSiAQiaqOWApGVZvp4L/1U6NXHHem9Yv/OuGW93/plhMWzJ+MFWCmkZz2QoQA6+RQAD0hwEjZYHJpi3AA2mOLXkuasS5QeNMTJnn429ge4oPtpP/P7Oj2IYw5ZOF5QHZErKTqIwCDJws4IJwwKKmP6nVVaxlpxXL6U9ATJJrblXn9G+1gLj1MJ902k6wdNdQcrMk+Jx/p820f8YU6spP4cM+Ava4tA6G+jeBFsxI7C4EgdkGtLnA+I6hAi6YMOvU16+rjs1hADN70qLqg+gAmieNBXiFYP8qfechupJEpnOJdhuaAXUGaZ/nTTZdJwV3V5mKP9XXvBbSPOCVb6mya/3659PNF/8+VJtDsvNmQvOWj3w9lwCX/jfWpaLweLEpivqqlSWUgdXLDEAAiEshzWAE8LBphNvIs7ywntlLWgelu/fzka4XTozYamog6qAMhdjaBHqwmoO+tGWzBQiDBNNd0vvXmcVV4vgPXW1W7XCUrtkRRrNh9rLUkfB+wivN8opVgu3+4co6PEc7/OfayPuZw3dsRRSRKFnNVMotjN7hH7r2gy6TmKWqmuK8CuTCLJKJsLClFwCqM6tBlG5YVweaA6uoPxcO94Kr9QckkrvzWqI8JyATdUwt8MQzlK6rte7akkt2BcDNqUxtFuaKVIHqmtCr8t4q1uddkPpnNd93z62JMmzPQuJpfHfDiKXNZ6QoRtotq4hRToHhTYQKuNEwGbTNamWUMoyKL++gutave0KtbuW+6u6MhV7ITL3HptfkFsP7k4ho3C7SUOTrO+t65wRpKD4DImdz0hyH3rxGQl/w61lgiWeHf7cm2nQjIiQU7oup7+XXZ0/bJE3gmXZ1p//TWn2CScr7EUnjXJlrFZ7ub26u9uxzE4hlrLwpk2TV5y9hm+yApsEHKoZMtG8OJGytrCp7tRb4ZiTlaBwokXCZrHLE5uGw6qur1cpskl+DK2PwC6AfY23Op5f53eksDf16aC+lnfQTeoMy3M74Vj8m+PxdfTpMZ7Vnms/78dUT0kCP8EPhutoKMo4GXhMJi+iY+YW5wxoLDcPmJZxpSQgTpIi4iKCsEcVZPwJNbPdE55l9nVMG39ONPNoy3EHdQoAPrEtAB//sujNbamZU1lYRYGV2Ug8NmiHNQB/fNl6BFpq8x80BsAf15hIgB2KQ+WXYY4ZCJD+xU4WevwKXP7gEFwuHzbLevz3DnrQsbn/A451MGL3z/SkPh8uqW+EMcnPe97sMrm0daTEeRQo98OT+CXvH+SF7q1veUIbaEKE9kTK+4UNB8UZNT4J+WnKUikmRtdVX3XmrWR36marRteT9hKfV0nqVL6bR4JPcFJabRzd1a00XiGI3yhsKD32sqBbfzNQCwreCt23e7PIDGePWO/AcEp5TLaXJrBfz9lK+Jc0scGY7jaU4uQBBaPcWe6pM+8uXeCSlwcWoX24j8M1O7xgazKkn/Af5BK6MjOHMWVt6TpSPD134epfD8hbED8EKXVOOYK+FF6f4eC3Hd8Q5wwcn81gMnp90hyFNzJ9nwdh1MVL2r1+Bp3CIMcWNBcqnERWY3+VGRYu31hr/NkwXK8U7fD+n/cPlVDhHEmXJa/q1GmCW2WU1Nz2gAQfeIJXtyvK9X5h76sSw/Rwxx1Y7ea2OsUBrxyvf5nuEy51O4wr2hbOXWyE/Ve//TGvSIcw7AbifGX8CCwRDUEg1H04Pj+Sy8mPjk/Ii+Zw8yJRCf8EasyT3iZFIzwiOfGicfCROG3HHgHMTZEaTbD6P9QqqR5cn/xoY8fVlOqSiymbO2iP1h9vMPrQtHPb+6a1Rv7042q/TlEKkyFM8e1Ua3zbRElMg3IU5T9TeOpPF8JplfG5hmpGoTsj+j6q1ITlfgEEJPmr52bz55yUMu8VH+g5MZ4NRkIHpXtnXhqHwkvz7lKNiEZdyOdS9fK+e/T+4jEi23E+y/12YDovNdCL8K8oROkj9WrmRZfn9r7tuy496SHwyX7GdGrzSY2Lc3LBewgD8t0g13XslEpcI1nimPVY8FSQpXCsJGf/Xf1PdRYBot0t2vZiWYzTUg46Z+FmEZXY8Z9n4ZqtB9MUgSnI0ffxX5yis4MisqxtcCuKq6j0KHIoK4oax4oJJdNj2mKNYngoG7FR+M+PuQfJwXoqh6HIlNDlU3g4V8rR3LAk2qAHw66EWbKQXb6WofnUUgeK4SC7YGJTH0gvyzDw+TKO13DpHXB335W+QaeEhElAvAiV+Wq0mn4ygiZwE6ioS1MT/8PxPVXvN+ZEnekY/CY6tmQaM31yyXdx21DEmWxF/Jnuri+8g7CJsUZ4X3pcPZufvKY/vQJuI5VVwrelTw2fbZYD/6MdzCi3LQOllneBuwsYF8dW5xhKDY9JyaUPBU1ojLOMJ1H8Nx9vnai7feOJAzJw5Bprna+UH9EE5xoWK+CZIWuEuZv8oYLLbkXOMKnbNcfqD6HHu+jTY7lWJ65Zqg42PCMp/NQ/slxHQrFmw1YeyabfFrvJdu7xHrVoXR1x0uWzu5Pltkyw8MI3XenVuic2c35bJpwQKda7MRMr92J7b2BrMg9250QcsISqW7O0NAqjgZidaHd0h0Ivhh1kSl+UgvaLC1Ybpm7JKTFo0ngSVXfrza0T2CBjXgKFroxvEhGJZN0Gdo97je912Z7ATQRZO+/vA8Rg+U2Errr/BNjPhRUuSDcMZmlpNEYbUZyOZVlPTlzY7TXeMe61Wxeiky1kOyVxVl5L1tbIo6is1RzlK/ed/+IwnMmXv09FPb5w0eHiVxT9z6l5JvXPmVmHWfi9TXVMHslrv3NowGbplVKPDrfVrru4Qn19DHCf4gJb6PcctqGc36uRyBZyH615X7H3rHcqOzylKbNRfymaE9R8M9l/nDrlWj36V07lkJ1p02PM+UDjKi3zvKpLPVtzCwH449KnQ5Y0hArLKopoODuvGIfkAkwvMTO7nz/Wi6YXBqJPYVm3gaCHYtOcSi+I0/ZTFqk0fyAVGfpR9lqzZycJbGT43jVX78l3k6rMoYKWDYwiVGA8ywdMs7AbwSWiyhoIsYR4g2kZjkJMPrUgwuRrPw94jQem9ztzFsPYD5A6tV4PfFQ3Zy8f5QfB5PnyYu4uZ5nzJhKxWgucb4Gb4ssTIWMzCLMe5eijVa+1j/ssXjOhMR4BK26a6Gqu1j1xmCMXLUg3DmQpFNEfVR2gcAqmq8odZTsXyltgrNk2J7rXEAVxpNiWJURGjbd4N/P9y4dx7LhWcDY42zX/m9zvHWnt4Lxw77kszKHpLnro8Y/VVx2lbrAi58tuBdBmXyE/ZO0SfvlimTFnVWNOTq0ftq7txU4aevuVT/JffkUPdDpbXFx5R/3ibK0P95iat158aXdsHSOCPtOT8Ly1RFfcVhL3vGcrZTaXFBa2l3hbcRj25/hnbq/fUZKbNlA65fBw6fOwn7Bv6aFrXcj0uPwaTWMrMXvbFwNv2c1HzgrLlytLLRyRQYblFeaF5m9EFi1x1HaTtRbFGbS6QE7zBZX88dDptYufaoYqr/A27ksBWldMXgipXtOc2aeI0Uam0f9JX9kRXJqX4E39EJqlrVatQBQu39AoyhN0PeHuR0Pohluk0pqVibFisuga4hZXE4VfHsgA6Y9eTOQLgu3I8dDsPQMImSfeh2pGtJatb1sttVCSVugQGb98bGZm1qLC/w31/qr8IbyKDfVizidQdpKCCcE7SZTzCb2YsA22dgS7Dbb2TkWFhjuRdfUSkaFEiEVSUPrQOBErp7jvfe7prH6LBlv4fLzd9aBCVjOGFuLvE09eT1CW3NN2j4JxJFlQefopZ6YD736e82++doQi6LgjTGwiM2HZ2sehNJDb6WCTxmXFRHsnczWEQQbfh+jHMdMJWVdJwSAE2mHXgAYs+lMoj/e4SVBAYlv4fczE4YgRPlr3Kw6g+WOadQEagoguDHgvPGapFYs9azXMRZjEwnv4RAK03/oT7hOeiIb2ju8FIfDG+A0QwiY1QlCAodMAQqi4ewa1ATRoZs2tImzQ+89ZLOtY835bX+MHROcV1Ax+5uwK067173sH6j4i234129+ZaVqbnbCRlx27sZaXbYrr7csyrebFbsxu7p5w4ca0WrYehEDDaUNAzTAWdxHqSaIkRmd2uaXa/Q5C4MlEl8mo4n23Dh4eIOrRECRFAUtBqaERGAMydQ+r1nz73u8s0UMI7X+0+xVV2aZRCrY/zthvbRDOkgoabiPu83TRqTHiUOwABO5v3/WSqjDteZSxb9vdDZCsJFSyJuDAs6MJ4W/vcYZV6IlAe8H2BVh8B/Fg5ScNM2glH7WjOv+f5DDik0kRrwrXwrPGpsaWVsjLRYkNLmWc29GEYwGK9r9Eqz8/u1YFf1uDldeDx6uX/N08tPaJZM19q+FrN0AI3HsD3br6qnH29Vv+bGoyenpM7dnJT0lJzk6RHWqNZxs/SRNJ8G/qkJzsfaxFwI6oy/5l/uBVBAQO7LiaT1HTMsdxd5hpNKLZqjv/+onNsW//ynQMSIwXHVTnqLh34A8AfFT/J9ZaTN3RL/BArrfa/aNk9fy1V2t//pDv4E+6MhwzHqcQ1jhFJeSTQpXLmKNTowguSQsFxxf0ezMd/6Y6b3XCmiXMQPs3jj2kyto0yrzt9zJ2XzL8PwP/CeTYhjpEE0sRnRqTH2rnpH6Dn5x78PceqIdf5YREurXMlXWg1a2W1tSH/5I2fSUx5RgJFf5pk82iAYQIIGpfXDvZbgRlGYNcb9IZWYXUf5sS7WYw5lRkt8mW0OIrJ2tORq8o6OZwhwv3HDnZn9fNzhwo2nPsTM8wNUooFEYVUJOiC4TCaKFrHCkKKcsfvMXbf/galzOAUK1AaHMT5ZmadKTMEolEImfNo4yj7GxZLXRfnj+PZsuq8mjnMHdJaoTwgZDTrJPJKhMxFu8M0fd94TsPD5kN8W8N/8AXhzsgBJpRxHb2+fn5oowTcbOrqz3Fb024IEhLHt7AO9UwsP7RZ+X2vneKtfd6mwoOblNzbZGyvkmy9Iz8qofc3BDz9gIxi9KpBoa+pEGuLm8sTo9QiNKwxq7AQCIV0nfJVDGhWFFa9y+lEEEroLoOvJ4/C9BR5wVb6WkMHH3+BjRYtJNwZa22bhB4l9jhDBsuoKtwXBB7XBhXxUVwMV0CN8+p08dxaVwGF9flmS5nY61oBir8pfLoMWg3jsvqkmCvKWI91eBSuJKXYau7lXol6s4NDsPSohwkxA3iu2RvfkXI9rAZJMhoTZGpbYZq8mCOZQfghnevNb1PAdTFyfKk0dEAlP5VjE2px8gfNpnmwV3PNZM0n8lA79v0PEJ3GC1uAcB0u53Ekf/lQC6MzjtjP/PAwvCl2WFzn7c0/Wt/2A2vi517XV+id2wKjx26WvD1HaEJATtsLOI2NUyL2XNogRYykNYKUSzX3chH6wQA2+FfWED/BoVAgp6Q1H5ngLX88+AAt3afvR1Afgvo9BuAOxRg6TeA2gcG4qoEO1v/c3DDEBXnnrjaM+B7V2vvYX1H30fbaEVIEZ2TOuj6Lv66HeKvu/vRZ92y6RQ8k/AJQCO/T608kuuYN6Bjl1P2k7UNjeQcIqKroGcrgkGJEsUirw2jeYGggBCdZj/bWQ7gtt9s9KUekLUbehWELQSgKu/2rL9GSW099pdelRZcjAsB7FfHhvHXrLbHMHWVGWUi4qsA4TjgMBblYKPFXPE7WTP88xIEbh/bj/i3Mib+vdMvWQaKdmJegWQXdIk+MpDl2GvyR0qKMncmIIPh1TdZPdzwnMRIHNnO7rMh91ZjysG/w9vHepv35CXFNHkKTonOdf1Y8+JF3jTYEI87fFJdXGfu66Ek/NZw11yeaHY3FsAkqBZzGuTJjZC/0clzahnq6N0Asz722R8FznA7TPM2oVZq1lzN55C5fQDPZj+eRaEvlPe8oohOUg/R+SyoB0CwaWENw7WqsW+UvdtaNv+jf4AEbhaeVwdC8j8/+4vH0DTgkueFSBxyKDKQ4FRB+mSjDRTgTFF1B0/sdpc1CLhPtle4bjhMhN+lBJ4BCX4DDXEhcqJnCkJP8hBO4NMBekMdla7JEc1st5xgVEYIKp+Isme9BKNaF3MCT+77gB0mnivA+3U5WEnB4pfXpFNJkihcPvoh41Y/PQMZjyoSei+LcBHf6bKpZPdv9Ez3Sdvqzw57pmPUqYAP4JKuGQGTC1eAQODg8FMLo/4kLSYjznGRNEZND1BZ0aC/sjLfeg70GblqVqszYKwtnmFKrg6+D3EiG7nFdYwRMokfQ+k9gy4J0QVzoB5sA9sxV/oDM/HNGa8H4VRuZA9MUEH00gCWNDlNgIlql/z2y2zGzxvdHMcTcpo1kjeLXzl2Wy2zN413ySaUODrfYeOgMDqqxIM4S3FzPpcxpbLkn3MdbKtyChc6zfKpf+8mcKIlNG/LhU/CvFrxyhiDpYWkYPc/munEwlFw/o8Gl7Za9CXwDLRpE18nLr6IM8p2ZOKMST/WqxW4BO2nrYqzhh4yN8Feu6famX49qVpZNhpSCqrfBknGSg7mXstLqC63MaO5n4USkbldlwmqxqFWLWq2YcrEnuiAf5wQo4hj28vPni/KEu7clzK/mOJqHAqAGMGOccZkFlc31OHfYaStx/7EXMewvOVWN/aGlMRljGind6MmcRtypn9xy98yE4bSOt1u1MaQvC4L6q9cACgtnpQ9/bWtVog1dw7a5fjkcubPjLsR1+02J6Rw2J8+mR4OKW6CsfD5W87pVvjQRT2dFrPZYeP6bwM8V3cj3dUlSwlssdukuZUleOChdpg9u2koG69gWO0r8yZpXxPCTwQF3P/60raxB+aVLsOYs4vuVdkLsjihuMo8tfJF7y0HEDxowvdBjRg2mrRJV4t9nReWQMpVT1oDXPrbDd2Slvzv39HG+/xfBweG28ehdWAkexCvmILiwj2kWrMYpietMVaigShTuJKb+IMQ2kDLBJgzL0GoHNVeHTMu/PXrZF7QrmHopP/l9qORBKeoHWYckC2a/mPVJp6eH8X13bkW4f8jTLOn5tdP57/IW/i50pXxo2/h3rK+rAAjAs6MlJ1/NvMLXE6hQNAMt76cnXqDc9YEYNM5alhKtYKjwY6jbuwyn6RxnS4g37alX4RKgXQID+MCuN9h6gO4SoSvx/EpTkd7I1XpR+wwFAP+O04aAKn7AfS7YOzGWCwwXc9R+0ytMA3fZ6rDQ5fIKfXD/Ov5EK5aBIpnMCgNM6GBxqBho0qgA94MRJCYflznzzQDCl3QBRip6eKxeHbxAI67NGaICbAhJIjND91w5h6qbMDP/tLEHS8XNT6EYmK2KWWmz/Gj7xlDcMnfG5tGh0jFxDAPoCug2QUGmK8f5awHQHinUtWkioKBJkpfosKPhWErZb5tzsxHURFrdpwusb0A4fMO/WsBS3KEyeQ0gE+gFEIwCmpAOSuD+q0UJREPECsBFEIB7tt0OTPGUcVukIXSov1ItYIuwKVhzywC6KnQrQiZVs3Wd9KKDbnAcRTHj60A7nWxBpaAkqLcVvhaYLvwJsClQkl2X+rIeH2ppzmXL1Uq8/lSo6JYWqHgfUlRWgvlBQQKy5pLhYKyYyT48aVitvBxfKWFhUvata3/iEODFgN6ZEiQUoQ9Afh3Y3vYjiWK09FKqYaYRT7Iwi2mo79Dyn0tsI5jKJZS6mk9TLmjkk1q1ZiM35BIkAFJfqEAXwSbUmmJlJq+oESEWJHqrCz0PY1vr/D4/jyCkbHpo5UIWYUv/p3ZMKikS6rC7Pix6sPeZVwcIrkdItGykEbsfbybuDxieiQJLaBVayPSvphSKYEgKcll06GQSgZx6mUGaeFJ08CxivyiSHJAJpQKYJIG/utLaL2+4iKAL0Klx4aPgVcSkk7x+lPRukvhfIN+1mzdXKJdftJMJeoBQjUY5ejZitGW9yWyVoK0HSNp9YjbBESdZoTdHRlBl05BU7PzG5NXo8mtqzZUZ3JqErJCk11m7KwywyslZBaUySjacQvdcHK02ZlhZTWbmZUw0lr0VKZLm5aYtHi0UyOTEuklyVE0SaGdGBiqTzbFNwn+HSXxXrs4rySWG2Iw0WTsKDcT6R5EOGDCbSgJs07I1thQ603w9p8hAgclA7YFWSp/BtyFqcsEXxFHGy5PQ5chriPQwddvDhzYs2FnaYp0VlrY6o2g3PC9zq6FKMtusJwaCewr8dubC8R10gjaaeIFng2oNIANj/A8bCOZY18sOR1gPEBgLuAU5Ske433Jn+KYWUYN+5hDAwTZUnEACh7ieeONaA59caDFqDuH8Rd+MmU3ym5xbAT+5B7wtRElAf95ZuBcjximmz1JiB9mvr1/Dyt7RvhUkl8tmAmPEUknIZtazXuvi41fA8rXEi5wghO9wtho2VEFo90KpOZ6UcFaoOSH5S/8OPzG3lULAA== */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_26___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_27___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_28___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_29___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_30___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,d09GMgABAAAAADHYABIAAAAAZLgAADFwAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGoEYGyAcgiYGYD9TVEFUWgCCDgiBfAmfFBEQCoGHHPZkC4QEAAE2AiQDiAQEIAWEYAcgDIUfG0ZZFWNbRjM4D0Ao0f4RR1EbOSkSRb0epIjs/y8H3JCBb6ivRAFQJYrTKB4iHJ9YfGOZVGHVwXlsxGnE0b3WK3QNBe8cbxejF83rexThsUFD+amDYBXb9ghrQ/9Ud0sMY663cdTi6Pe/hKff+q2p8/QZOM5HzeXhye55z50dfEdASamLO9BdfhWiFPx2hge39Q8EJxIq4gAF3IiIOHaKg+GE7SIcDHEswBTNnGjLscrGdmXmdWZkZmt63l3XL28sG9va1vVL/U9bpXoJe/fQluGrfqiZq7oMeAANw5Z6DdLQ1UUmDvE7S56MvaEp9pUu3d0DSf/yxAjyKHdhqG4iM8nAqAApWKbp8uk8aZsv00X7v6bJq2quQ8wNiHWJ/r1NIdmuEcbmp6AGR9PM2TZbmqSVdJLuun3293NqZ7USODRNAH9FNNABNCwIhH1R3FZStjubwTkiGhX4fwZFDDrpNCWKRGkS9McyuDTM0/ylotQtw+jLtCTr8Pcuw5bJeBhz35zfTqjt7kxSUGccKVsAVIfJmOR9l5z+AKgOEOHftpXk6S34jsmECZZPMvTq5TKlq1vtl645ubHSoQ1YABODb530TVq3llIqQF3zKPAnLIAGoD7c8flsWqXVasvqAWnQ+zyZvagDCjKiJNq7JOn61a3uquq2yi17plsGWrKWJNsL0qAkv30e+2CRg+gQjDOzngPTMmcHABlRhkF6ebx32V0Qp2iehC6xxsbwYotX0d3q1NyiijJz3s4ldEYcyYpkQwiu7P9alkugSc2oKA1+E3vtGFOriWR0ZQ5HRBBFZQknmv6/K0Ahnf36AlA2AnBA8B4KQqAgRJsh0mSCkCgIqYLI6UDkbX+UwrS67Ja6Y0H95k/1twfqkZfqrV+HH6DC8sbwxUS8NALM+ZhDgP+bBscZZLMtkoXAFAygr6Z+bUlrGPxnhEN16mLgfaRaUYTZoxR56h86LldbCnx7fkrefmM2AeC25yRj1m2HGPGszy6clJ3AX4I+E4Sg/7q7EdhxJ8qKgSN0gu7R5QPUAB2ig1IoGHORly/luOnKMX60t/71q//85n+/m7A/bohQSZLlynPI4eafNySYU6b16AUB06HTI4+rL/jaZz/7Z+0lSlWpBsvdaRYcKOvkecAN2U15c//U46zlNmBRyWlWveWOHBbkQICRR03bJ6PAlDFtBeLWn97uWxUDYEkwrdJUtZz3eTWrgp55mFYFgQBw5pEqLQSA+NOjCggOlDFrJ/cBpHAkN2pHVOgsGSjb5gSASHJEJSRvgfki1x/6bGHCL3iRG7Koj544GMdjKd7EKlSnkJSxOMR5Q2e98z7n95t/dksSBgkjhKNEm5GTq6s/sHTtEEZeyE9aD8R38Xzbl2TfCpw3cG7Y8m7zu3ZYGyMnylYDEv/EL2nOJ8s5CUt8/j8bPxtPAeOTY8+n9+5vvx93P3VxYfH5v+P/ev+7CMBHj2uog6mXZJzwOz4vvgoeWvLKp4pmUQww9DKZDw305+JlHhgxfYVx21n+AnCfMduvLcOa+FGUVtiv05Hl0b+hxBa7FOmwW41B7RGuxS6HbPGKXnWw6dXYZZ8xJzpL9brstF+Mjjh+kh82LkIFv0kImfdQ90BQcu8PO+o7zbYZiHAVGrTptNuQOq226v84+oRXqm20SW+w6TSkr7Q+u4zUS0NNMQfoHkr7hpGNEncO7Nje1qpvaW5qbKjfWLeBtrZGV121vlKrUVeUl5WWFBcVFqjylQq5LC83J1u6TpKVmZGeJhYJBTwuJzUlOSkxgc1ieuFR5mY+kO8tzONc4xTmFB/wx1m8lAXlx3GQDxnAuifotAQzdKY/cs2GNsZrNjDgqvl4WlzKzEHXi1wdBJDfn6s/5v6wcNSUSdBlwqRwatk7vP0WgoKI0GDjwFO90TmarOmrxuYZmQBdEs8mYIoNGZ3w9bZF8HOITusZ05YNu5VWlmw4qp2E+t3ozpRRGxRQmavmefbiLS4RZYWDF9a+Iw4BKTyMGZfwhL/4uF0B3oIIUvF84KQWOMm63DJyrKY0MWskeV8mF3GNS2VTrSSCWvKzH7uTyT71Fq7MVXTmH/vcL4QUhJpPV8MkxNNNjHAuIe5iXqtqzVpH0sYNdWnc9EjyJxYOzZQIK90mlwZCA3m5TGKaajVq4G0GU+MNdkMUv67ZsdxRl0AIWFrrIIFSFntyIMye2TdHlEMVCZ/5LzDtXwTlIPzqYg5SJNJH/ZcY/fHL6bIQf/StRYjqEftdT3AgFdf3Vq0n9HO/e3/hfnXhGCsO1Cpq6w9SrTQTdVjWaVOGIEUQHAxe8z1hnJJBmLHDGwja+FH5RhwMa4XkeKXZp8KrstlMuXm9L8GwMDO2GpumdnSwom/QspDze0kZmOouuBXMAwyuRt5Vw8WMwJ32pEeB8pY0GISIkwcFxYmYSshV9kg9SkjSzaT8VQ1pv5a4/bF6HJPE6gYWC/xpbnKTbj6XGZ4TwQzcM732Ed4ChiO4X9OJQ80YfzOrVqiZoMM2qpX+MJk37eDCPQi2kMR1VNjScRFn52kYzUbib+43Gh7bbSYqY3x4sBpNz2hxJm6zniMtYYbgigC9fARFgX9vJoUTd5aXPHbJPJEpWkRNC68lXAi7v1GtZCNRE7aByQ4F2XukFutpbOmpeeD5Eyyz5mrSZxO+9qiaBNxjxU46DksLN5dW7NyIe7Bg5Awtvb4E0AUZ48yQQBhJjinKvZJ7/yGOFGhxLZJZCBOLorVrDeDqFgsDTVT3M1jWWPU2fbaIaJrEy/ke71lOrU3aXGz5aCY6JiHNjipa78Lk5tp4cB3YJsZmAr07pVwd65Yec6cjsc8ZkKpLOaIuCp5C0JBuZfSqiTyto2bB5XqDpuQHhWtwFKU3LoDQfgZg9TmncMXmhqj0IoVSwPa2eoBeB6iQ2JcMhg/eciwjCA2puwuWFZuW4wpeKMv1OMioiyeCQUFn6CYbT9IUYkSrDZYE8/3yF+JHwliwEOpM8sW7K0OXMJYrh7kWs2DZUE4tkrOK+oYWEN1A+fvcymQ4ipGy7T4aazaN7aqIHXRs2IzrbX1+AvQ4dKVLa0KEu/WIqOSOATUfxJ7CtbyQgIA01Q0xxARGEw4RqG/i8x/RzefrCOENkrlcYdYZXvW0zVDKre4Sh9hq3XIzBMmYoi6Z4nBDhS18wrytymMKNj4lxoQf7vJcrX6svhCVh9LzJvKuSJfJBa7bg8CBmYC1tJkAm9GVMkNt8TW13Q5IdLaxtOxWvypOpibS4hfJaIoldmfhCK6nTC4IDTNricQepn6wSNvmyBxZ9JYE/g54R0SLwpzkcKShLlzkAJtdTWg0NhJ6rcw0y/tBoF4PGOi+D2UtVi2IMIRiJfN+J0P9ygNiO+jqXCr4F4LM9u8siDMyEVoZLHZERfnxUTzDY0dY9tKlAwd4rh/QaAnhTKFWse+WRvW57Yotry/mo/PAGjAOSHVCcWCPbZYQhZ2cFYRWZDmJJBIHBFPvEVwJsc3ItxUZwAkYEF0BvfftbUqnqwd+9DYK5T2JCew5kNit5dPYiXVGrj7TlZ4jpe7CkuCQiaVwagFdbKUdYYtg4mrhp2XWrg5JnvvJv/SaXjWLSKkxsOwqk1WeGabVAphgha2dZhPCMDHhHkVrx0MnWoFtRf6hhR7sAr5DmzjY1kjJMiX08lkuDA8qYXK0iduq2PZIacrB1D1RDuhDWHclL41JS8cEoV6J09CP8MxLAKMGltcKoTx9NHBmqxWJ7ZzESfcS5DGyFZw9PiHG7gqFVIB0MHaBXxKO9EfdglDf/gc3EEB1s63nSwFb9t6EDXkiBcgZsrgm8/HF2tMtE/cthBT9h7RqmC/a7IRuN5TEzLtzww5yxbeK5W9ehcNLEz2P4EHmB5PhFnmRPGnBHFwk8RQh4tV6h3FvYtAfjYznGReOc8oeqAdvQj7/xShyBK4cUXnXAyfL5BkOqjANVHtXMhGP8jO6XLxz4BTe38I4lxw15x5IjUF32nZIjAPOK44obh2D6z9j7gHyA3Teri73r1tpgkgrgX4Ji/yFEUNJCeP8paFKGB697VxmAFxC+0teYm8Q/h+pjpk7IIUguY8BycWiaVxSdTA/Efc7kAxOlcnRlE2ZidfaAS5t8mWmr3oB+hbgyIFtc9rgDT0H+JWgql1uqYzKMBs2COGblc0LHklCTlQm9oD9p2suAw4i6BddRoId1nG+sicA7gWotwDMpwDkU/LrKQGw79ozwutE7SRfnJygHo49x+ZtexFeGv74VorpFQFWzBQs8qaAXZRrNGbcfNfHPhkDCaqugBDUf90gqhvuiHzcgrQIx9FYKymj8q9k43fehUOQTcahpXZlr0x7S3UybvxmMAdzVRlLGepQ5I2e2v3tOCqYFkJcVFJOS+9fDmZ0fhf7QWnlWbHC4ehIY++RhWuEuPEhhlKkOoTQTWYcByM0t0w7nmtRLVnnZd6dhX2r3Ln0VSfrnun9YFSVUX5NaFBEJvdWeV02uQodLnIIVZjpg8iR9lcpfNsY9EYjiFjN/pf49YeQKRqt60BG0lKR+5KcYmskUHPYMQj8/9C8OsWt/EBHRtM2kMlwTFJMbinUvL6X0t5A4fp+pnXDOFty4Y0BDYtZ4o6W8uQaPSQJN880aAZusLzDWJF/DVX3f7+gM4n9qj8UvsZBfrRqrFH4jqBRaKqhh3kdroxwLKPCltQsFFwJcH6aLKXjmqdyn2VoGFS16qKq/8TaujCBekZDtnz80N0PY2T5vyUxvoP15TA1uuhbpsNV9MhdK8KJDfdqjC+xJbLzaDPzhO4YaHqUSQPbekbccdxkpPiMfk3IxzJbBo4IUubly8qBFxUVWvyqSr7NvWT5QQ3k7IXonCaSjjRNMdBicz2d3q+pZaFOrszLUx2POkYLGbmIbgArhxSqZPRaqiEq1GUPYdny8cERywg/QCJ7JtJp6P3+4Qz+5oOU3nPPrRB7slFFXBEHlONqvl3D6g0xZCvNWKFSLnAcE5Xc9McidC/nrn24V8MwQXGN0nraFrxSYrS3GaoLXwyoO8J+VkOmEW2WoWidM7R7EirH0lxNqMZxUqALQI4wD9QiUKG8EOeK8we9GnkQBg7wKLjLYemPE1LQg/tl6z4QH+UZmhLw21SCBBo+JS7pHpMMgxo0M+X1mZBo3XjRKG1tmVArzUMNqtEL2VAzlZonGm3q3zE3wGrE4DzsRSrf/s61VBJuI6TE0OE2nHh3i0QcBvQfSnjh27PR8vMSrnTHQK6gLt+jl+SAReQMW3N2u3tkSo5GC5xEwZSgzI7VJjqXNLtEy5yezRf+A4RbyMQ/MOnaHj5q4qhPn1uTx3Kqo4lmssv9tYBqBDrmnH3uCCb61/UVLCnEUgPCuR9iScWaU35isK+8kTeBRrt7a54qCyHr3ytAICChhIxbSvjth2bHuSB2GTcqX7BeEa3bz95BQoICEg5VAGIh5oDNqn8rhD3kOObwWbtXnyBtE6F64YuB0rP5gklGIdfUHO0hFuvLGm6HObcReXLLfQbbsny4Wry0DMJHJtWWEXlAB9EhR6nDHFbvBaMCjiiaLYTxqlJ9eBwTAgwmnEfhKHtfcpT7QkWbgO0E4m0wJqFQ1DnIx0IjrVh0sWwXG9QpxOSsv78SXZbmTOHdn67gpMuvkIh9+xw6UOmRmXuhYJBd8zPww5/+DwhBEdBMzsZ8ttJPZCxkzXwuOwf1zRf/OK3EU+gqCxvYVIec2kq1vvgMuzQiTjOkK83ievIbkyI5VxYmJkx6yowCJup8Sshi0VK1i4PknceVz1XEkXWBgoEc2AyHFPBTY5kn98EDkksFrcgdc6narl95E1plKnZUqxhZO0ys7BxqvliqdWZ4xM49J2yYvQZqHRmHuGKKig/Vti8CIK32tVJXAP27oUcN0zEjt0zZmWZh4UWQqdfjIdetnpGJMK+NfoMpzQDQsBaMJ3m6OQQAXfyF7AlwiHpfjrgCsU7+9OhAiY62BYilw+vqDmoMFGy34f0OGB2iuUwUE99nPIEPUoCmghm6lTiVMajTjeVUNefkiwjNxW/dgTQ+Yb7ldTfICOfWWMV/WxC5NfeMVYPkEHeZQ7lwZJnvTrGR14E6O9Me8XejjGeYNL71AG+3jCLL6v2/v3hTu7wpOD0zU4Wo3SfbmEDIqbdqLaUFg7GQMoemGYo7YdDPW7dEmFn2yl6FtmqCXf8DOvx2qbE8J+8r/DwubzixXL19FrVzuEsTRyFMa2caW7a7tASRTmSJlvD90B9SkGU7/vOQSmDM1hIUs5DsowXdhEJC6cCASzW+SKkSYP2FNzM2xUsaqac0u5N/P6huyJj0VLnBclY441J532VmK3dxOMPm2M3VkuGS34NlVNn/eXooDJXGf/ZpdhvF8Nd94LNffcw7dDoq5t2hA36elm0a8r+b1j/48y0KmgjghsQVdMzrldc6tINvQFD8str9k8/e36lH93I+Pj7OEZ5a1i7SsjyVn2KJRynStmu1xX/v6Ez5c2RDW2wmYj3N1kGcA4Kq4qqCgTAEr41bG+QwfaFyeQjnY5GZiM/QZTaCFCzyolUUAXgmedT0We3jn1UIEQBhY37TOnOiufY+jxA93/om/VurI+ltG3gA6YqB1ZrZmw6anE4atSXKh20HpcaYD9Lh8x4SpxiwEyaH7M3s+nQ4SReIL6/wzYzi4VvhW6CM45h3qc1zimUCiYPrYXpI7JSdnVT91xEBeuw6vPDECWmuSxbYjj3o4wadfv3K/3QfL/b4w53Jfx5e39TCp0n8c+fjoyZXmwfXP1aM8nA3XIdm113skyf11+azCMc2pEv8hmgVfg7v/SbdKt/VopSrOtKcYiq2N9Wdf5M/ntxl0+IxS8in/JNQmizxJDEoIQkpDXFcD8+q+CJZfIe8uer033kD6h8Dy2myN3Kv/T6CcJ4bKdYnMJJZE5NFLgvcpxbtwr0MnmqHcqHtNqJHhskdLe8Q7T+4UD0/TATVn+zt7lZuZER0V9Shaq8a7BiG3Kur1ZJhW4iSksmodegCm6y0K99y7EQGmsUJZw1ahi5GyQMZa+TWKpuMWktBgLsYLrTOtCmg/s86174D1/6dxWFnrOd7iV9GqrOgLiyQ6ixo49pV0G+S7yyNgfIb5MuvfnIIXIznb+ObOrYS/xKWpak+Ym8V5nOL09fx5mytPQYrF19fvvHsbvgO0//Lkhpd18n2JGXs0U3+N/qf6UU4LT2Lx+ftpqS4yOfTff8MsiutNOo1Uudymbzw2LxWTZGrwmb4WbXu27X5LdBl3WHtqM+rjBcsXK1bFLcgMaC/oiyku4CZnN3rz6DAGeQBDxTE5sxzNxx+yeMCV0dOT1gyz0ZtiFX6A4l+Ht5lOS9OrCI7vKtT9kH7iYdl45sUFccGB9VD7h7/0+z+Z71u8XDfbVhDV09j0ffkdeSXfK8p98ZRaG3Pt4tXWmBLTft/zdBWmOrGQeBbIFnr8PjF8+VDvYq6Nh3uASMzgJ4gZHiluStH1DWFYz9k9OJ5JvFmk627J3y0dgLq1Jcb/8Q+zK3CYJITkaHnpi/s3XmFueB2rWSPlyAx0BtM26TsC013DaCTo6tZZg+4Yk5BloIvFwgFckUWv4DihEGvFZj3+6LC8lhVRIbuhFA21fUbrb06TSeRFAjJg1VIGpBorBNaKqVJB07G50aJRbn0eEYOXSTOiUIxXgSWIRPeJNBNSVGieMUYbUGZMnpMBvMsEudEMTDviY0TBj0dbVYnhb2gi1ihgvQzD+9V58RcaVJJqAeE24d7TkNI0Jpzly4t/ObfXs3TiXWK8YM0WjvXtSghKFyUI/Sqyt2RPvPqsHJQsmqJ9NoxDkWApYkMKV60Kc2J34IIzUzPXrdNcfYE1r8sYYWsJiI2oYm2LXGho+9G0sb1V5K6+lIXts00Q97rj+x9p98C8ePOlFL7FUl8njzJt7+0zLdHkcDXFQ+haDCN3RVXjNNDOTqi1Ckt1r+YE0aTPvE5s8Y0T7ox1CH8YrK6cM8d7r7KYSehy9dMr58DORnJgWTcS0VoMUVFbs2g12TvfrPnlmqWJKNk/cF37aEkx8W5umNJcv9cT6nHVmHSBsf1f/tLbV49gHfhxPJ99MwDXdiexhFF2ovLr8IehWHp7CinRDep9LlXByq0iNVIZFZ/L8w7oaBmkU66TvN+DsKGiFrz8Jvc9jjrS81KnfRue/FbNBlNbJuHUr+GV5ftOqxbmKY4RDZKieRHbbbjNtkVY+qsWuCmNBu9Y88d/Ssy2k2Klab+ot37l1mMq7EIve7bj1qWU9+St2bzrsmUosAk86F38Z9c6VlBazNtMY5jmin4hSfPYq99mjB3sKqsY3Gjw8ME0aw4QUxYODemJ1bZEhkmJEIS+TmKJAUTbefW8YrS87mFc1i4WCUqm7c++J9Gv/E7Csvixug1gaWz05ire0JYFiJl58XxbQn+vokoNRcUSF70Z0V4fTRsXwmIQa4gdQGptJya1HqyV5Chj/Ff+JyfunDzymb5r98OK5dWloTN/y6+fX0o9+fTMjwMf9K8UUI8PqP1YFFGm1yW4zEDx/dGMe7KIAo27M9Pa8rNzXaNP5lh37/z/avYdJtg5zznowGJ4665/97L19mFQvScYXy0pv3e+urFw313rLpZcZos0QT/4FqyDvq0ZFIZEcyqrD3e2pyDSbl7dFVFA/dS9sPPwYWM9JgUbj8p0SXvZprvb0HaijF6WEwMfTz6eHG50Raj4lwuMzk8OloWECZjubxW1lSY6iZA4FMgWhuQ0ESbaTb60DpK12IYsfKdqjgZOzF1oR3jSv4Wv8FRFczbURQmiGMn/OzHbaWZ8Rsjf0/MwuuKh34Y8oIz1wXOh9xz1O5LBJmvhYVja7VFoJYwxPsnf2VetKYtMCDiesRB/4O7r+8ed2/P2wbdhOuT7Rmzt79Pvd2b/K+xgf8+8L7uSnjhPvk5wZKmaW1QREYUKyW/XLPjsSRK9ySkbYATFCS+2MbERacp09enLwVfirsUdOn09dOU/v++6+Km4jydMOiDEdcjrAXm232tw3JZVUSmblKYN9W5h8aFr0OLyIerbtPG91zfc9DVgtpnT8qU9NRqHpOEHenI4NKkNHcEREeGeccLEsNKsObmFhbTL+O9yi+fLL0QDOtI01422jvKA7gDf7G8y69Ml1Foaoa35srpsgHHmt+/6MYJeh7C/h2Th6Am53j4CaCxVG2qGdtkJ3xHyMBgphN6E5JxP6zb/63d/X70ac/dzsQG3H5JVSId3jxLd/FnxyvelGSWZFgy3Na6Dpt8I5Fh6ZVTXXwla3SfjFjWxREIxY0yCD+vfM7z2xfO+7TySUiMeXutvyJd1mDiuRPObmmJQESh5gONXAlHg9RG/H+ZNZczIjcqVb+cx7Fisiq8c+3upY0GJJ4XK3zo3OEUZmhy5CDteGfOvu/o1Xl63G3mP94cK6R//5xkI+4g65/ncVa+kX722ZkPHz3cp2SP7pc1+yka38x2CUj429aK0d4RHr8zc98Q3RXUMFwlaDa5bNPGssKeulIf+wQJXuGaXJBgV5TwXUq3gnDAW+OhzRFjxfhsxxRpzmPqGl9KHoniTyG7JDahbkbHRTCSxYi3iQHSUEkA0WO8cA/M+vjeMh+KkR9JRvGReW1jqUPjVAnlPfVF1XNL5QL3CAimOrEpcWGOsQgUyENAVhLnJWW5BYHYW9kb05linThmDivKVWWVnbWzdfvtbFapvl+EnYvRKTHT1p99Cxt4N33/aM1jqfrxO8N3EMFMsnGecmBcpD7+wymTnWPsKznIcL9cq/ggofWaVnRfPIRADy5wghbbrbeupLynvnAbr5LE93Ug3e530YdKIbnf4hIfk1KMhLstwDkUbUKixC2IlOqcTEp0dnNuudJvsXf3dpXyu8IneyXg3fAtV50il4m2X1I58gwZL+sQ9hq7gFFSkoM05hdVHZ6sxPc+EDdNNPcNHNuKMT6GvnZqprP61h8FfbJB/N92NCADh7b99Da3YylS7hNRrjLGb3MPa6jdUCZk5FWS2Ox3QUUKrTRXLSXp/N11UBjuWrFDB2OHiIl//IFrdmy2rdUiw2UHkpyMNOcwMgx2egubgw9glpDkZDdt3D/Zv1K2EsV1WHGYjISH2pjgYzunnaVyiJJHKbgmFwZbkJxdkX88X5M/WeCK5dGTan+E2X+OsUtluqTTJiHUTB5P/h7vUBuuC3xc7hqIZu/u5kRMtLYtpg4FmRKBMGi/CSdjt7SrtMUbVbSuuiXUbVRAJCs2gJpknf2TvgbHyt62Nrm3MaqneESZ9pzScDYyWQaX/wRvSDQczNmy/liGdLK1PkNiT7mCyHJs312ftmeMvfHw2fEdLYorVwe6Yp/xw5Qmly/GkBL8gjySotk5JOFxF7ISjY70l0cUuk86tlslofiWqX5IbyURO2JfaFOS5WibTEtRSHNxfVCcNG3QSJf5HvWOsrmfG/wH/L1xgSDnoVcqujiGcpc4vPmnhkBnjtNM7PHCt5Ystmcasfdd6xajGX+05PIbDEYcN4aD07Ioj2zy2KMdNRsIWx23VFNzR1pLxIoeGWatolKd1UzKXRQ/pDtPe4hTq1Q5nh07Dvdu/V3HRbQp+p2UDONHKEFIj7xykFNnRXvu1WEdWsRqIDIGR4/5NsW5SSStkhDDwWtZJAz8pxSejGNjxpzA9CRa8N0J3S5esYj/Rm/mImhbt5bZmq/vgQtaMwrd0P310uUW2MumfbsWK3X3D/XdNmro9lxbvSU+/6bEo+nSOHhFKVwXyc7QVjj46edG3sv6DfYb7v9dhj6cn3FEt0n7wyu1oczgwvc05vge90npqq/MlW4rHExfeLy0jh2a50BX1DMiutV1QfsMfZ+QGz1QipuljUnC7aTyMt+YskRiwN73peKlES+7r8tfkxKtQgv7UpV73Ctba1r+jHHrMz/5C1mdLA6zY5nVfj2WiXG20Buuu5EP/ygI1MtELIQ5G1nJZm7R6BvPvpEPL70MtlFkT7XlCwXCGrb+cETdrW0lRVnBVF45RUYIqSwsLG6vJaUhxvMFpAVy53dwkSaOHyhuObIALZ5Z414e4n3KDUxuOmPMwe415/9D0WnJ8S0llQffiSNL5Z5NdVY3xHGLxAHwQ+52zjFGDl0ozolmxOdGi4W5dNMJ8Nk7XHrQKnt7eDmE89n0zsaoPOwf8cFNEPmL5J6fNKZT14vYeafq3dOLLsW7n9xgU8Rd2mMSe8quEF2ShIR6gADRwJnAR7qKt7R76DrAm7NeTc/aDhbPD5WAQz0VBmjTVZ/40sP2KY3lZ04HdFCRbMNOnk2oDvNspJszAavNbBeNULccHFC7PVytgNqHsPyMq+xYpDO8OavXnLVZn41KDy6E05pim/QMlZssO4DhSpEmscmSrDkb0tbs1tYCjCYs+ozgI2cDQOYF7/yyBjCqYDwbD0FkxKW5HoGGYHKdX+hy/ljcZAPAz5zpE4OK5BpWz3adx468Y0CpnV8vOn0k09o7Z0mCa7BgmoYBdLrqnCq62XS6wBfmZQohiGYKD8ETSeChjiqA5rkPJhMQqIjmLVlJJHRPrFKhY+12XO6HVm4bA6zR97ZOBl1bqMlJW0RIH6aQQewSYRxghAtuWnLxvA8qxkaXYoNDgBXCE6tqc9+z5eLhVnLFBWlZj0xyTYd5fTGmPQUYGEk4Jt2OrcDNiK+xm0EclFziqZ4iwNkUXiOGEeQOH/r81GnxtqN5+n+wSIkKwBdpIswZzNrMGFEOZuzo8cEPuKIZ+fbauql+A9Dq6oVAX0fP4tRxWHMxjzxxhayQRp7pPMxzcc48F5n6YnR60mSg2Ao4ytYLiX9JL78/2MY0rJOkZAs2J0Mx2njkkzc861+bZ0Nlng2gZ0icvdnvwTflPgOUaQF3VrFfEShg/7GscazwIsNG94/ko0ITk4wnMdGrXvuku75I83iTHBVM9gVtJjGGjalhTsTlhZkeBkBa1NMMEyn9/Ptp+tfQjAIIwAbkK3lFkr6urmNX/sq/Bd8iPcRPXtA+U+3CHhif23rDqKjjPvYgDGPLeKBDdMVppPJxhW0wJupxha3A0eZ3mhXE+Ygo6knBEOAww7DL3fe9zc1WrHjUqeBSfzvmFC3sIomAHDG2v/fd3c+X6J/+9Vv7P1+9X+1fv/8c8efg/2Wj1cV/foV/lgsbDIj7yxxRxkvZXKnkyjhvpcx267XMy5Wq2KPbTUeC74a/KpHaGXBx7Uq0gD6bBsrp2K9IjKg4KAaua4cmsJbreWWcZHOzkqkY0JUR7Xv04k3nRu8XTxsa73ZLQM1EpmJAV8aIZplzs8ERe7291uX72kI3bEi/NWXftfBWRQKwcE+DrT5duKSM97mrH7Tmlp+/VMnaRnTCFQMJLhFvK9oEEP+2YtMjn/cx6K1k7l5X9XXM1ETX626npUrcqYjCHRzwvbyMdQaAvOEWjUB6pi1UczS0V+ORmB6e7SsHgOEg2lDsZDXAyzUHvDTd/PZo1tACHCiXWmv4iQcw4EoPGPBAHd+xCrYqRvLlIwQbeptDla2JTPHEUHrCdtFJx0uRmk1WRvRBmbOuu2tnjeCKqauk8R3NA2rdGkJKcq8A2w7Ug9xpdddfK9KmtMunDlWkhDXLODeTJDemmDfrJOrOvlSi7Y1otilLAdpj82igPm+pmsch8N12nEvQXJy8EAIMDzhQ8Xg0WUlYzq7aYV2JKg9be3UqD1hBERjx/hk+XJJkLGzGImrhtWca1NeqbZPdd4PJfStuVnuOQAjGXU42FkNnlkrEl/3BMq6cCQkk42xBGKORuuWN3rpVGCxPyryXRh6wsLHBsOImEFlkRNPZNfZqO6tEJoIijS6tFmC8hOzB5FHRJaLMpLw8wsot9W6fD2MUDedCcdLCEBRtQZ6qLueomzMYRbKVPcDb/uIOcqplcyEe0FqmOJKOYXo+xBbtAVQbu+RKzgRFRgjl0fsNmVJHqAoI3eI0DmarBji1H4onwU2SKmYPafgE2kmKgOG8dPahY9Ik17VwFJRBh+KeB1s8J2Zzi6eGGaOU7GWweSnTNEZIdb64S5wJSj5d5YB2u4qRPF9HJIO0ih62WggJCKk77+qTu5ZTSl+ci/nmxknybCIjHAgoAF2d6dKm2BK0lCrPjVkitFaFD8jhRH8RXcKckSGc9tPwZV9Fg49HfVNc4D1JRwugmQQFVaXseIpso3VZH6ypJRpVgLzbbpGm4kUR8CV53R5iXSAsEcFWnobCYi1t72A/MT78kIDeemu9BlMY/iyYrkBumNe1nPtvZ5x9ijQB5dGRVKWomgGTXMVZcgKJu4aLK0f9tp10xdd02E97oZFuSufyBl2MtSOHLcUJugWeeRSAWG6arnWRjmZzqZRcBU17TBOipEZnDkw5eRJ23LRkJJXeTENUC4ql+8V6WUQ8urHw9bBmpnmh1FwGktyNmqt76QMkFseuc+wGhY+D7mERXVooLSKSkE2jeJ6tchE/f3dAIt1c20i3LEeSoTc3rlemhIHYFAA/qgxFx1dwJQe760RbWLK/FmjCas6jW2nimoJTcpGCyjtXtZVwUQz7KOSUGFOm5xJrUFVaxOj+uDyHutbbVq0Sp07tLLJLuxerDWNR5PtlGQZUpO16rXtjDgfN2oS6ysXeODcr1/2Y1KqKvuDxDqZ9i15GeCvS6fT+DjQPQUsRXQ/I/stjtFgEQZb5noPpMk01p/WtW6qRvhTMBj99xV/QvakAnQ2jibJpMYqpmUlsyWa8OImsgaHMOD6uJ+GlDAA/QrHjnU9pZGecXAG61FAvdxnw8EFLur7ril6ktGuyOE9NIOtEE7MEbVysibdTSsh4vGjSNBDdhad7gTXLC7LaBShl8ETWcxsFz88nflsg+82sDohJfD3JCkt/vFPeUslGtX8BuJ8gu/9TLLrUOrFF43nAKk4VMKb8Va1tAN5mzBmDUsYDUBmxDSbKFlEOioZksUenffocSzGQyYcxL4c0o99/OUVz+j87WRDA9pHHz8izkpHVSjcGSWjXAdFijaxX51DQsQ0DAPNIVvxT8lpgwkltjQHFydfT6saySl5vdR4ICveKWSpx2ZFEsl60MViYJ98HUda+QEXxohmIMOfDRpGVVpo6RK3mXqnN7hBN0yRS05SdRxvn3Yflq8i+xXXfZ5b5S2bMxtNE0PSwFpvaESfeEg+JOlFsVyQ/NK80xMS5FwL04AGm4sDTKhonjgPquoDNXY9Ier+8+mAXJ5DybFMUMRtEE0kiakwrzgJrC2QPFMp3F2NY6Pe7Dzc3skI4HeM7P0x71M2tbpaGkNlMdG5pA1FxCqeGeicrIfvQUhfzddduwO4Da2KAfAJYuMQx60QTTlxDkNF1AjpIeR+05sJZnuublLyHybU150BYgBdeiRvDuJV1jRuTzdXVw8Mc9y5mEVV975ULn8B4BDoeXcaGIQsq98kXKQksFumueh2PnPlfF7Uykr2qZKuC1A02/dripsdG3H5X4bVwb2USzYxyYAFO+1eSwf/NaSFJGXDOwMC7sQEIpUccxMwZz4YB7GgzhyyZJGq/yOKB/hBB4UDx2qixldgiumtKLJzb4LGPUdVzPGq5Zi3fJ4XEGVSlHC2xlMI4K4hdLqygDtKVD5+6IkXfvLnZgNamhuW57WkE7ANz+QRcpkQHT9XVtmaFqqPx3H3oX0G4dfDdD15OYZtJ4QjV7FEuGYaqh5WMaeeEEXCqXOZaeGZVJUUbAhglCQz4QOptV+4vrB+P1qFhzM4r4yQIYkODCoy+szqcg7eins11ulOW4SZJbkPbWp8CxHknejurwRezYd0aHHNXewUyl6NMQgCY2MsDU4Sya4E6zArDFTw0+1kjxApjb/Spsd1e7fF8R5GfPGN/v3iMDllqwDVF8HugF8nzsIuOJPKNJGgv2zcDeY3/rrSNNchLr2kr+Y/5k1bbLQx1J9BE8lCe66r5mjoIq5ShVJCsc8NgedK2hcZamWKX81gUoVzrIQUm+5SlU1NIJdqoIHPRfX2w/m7xEMcRrBVP9Wj9zpSlslJqLWFKQGta2gPhYemXQmcEAJSbbRsrKyWnyt+lo1Mz8uFsbNc1o7cuVdbA5d85LONFf3fMAtiuI7se2wHApu8o4Dh94mmMj3zJjhUOcEzwt1ait1z7qGi9fuclv9vt1qtVkOu0pGWAKTsn2Xcee2Uv+0tEZ4LGuJNzaMMGw0EDH0A+vsB46AMgNGbx2nGsNDJJxjTNeAzCHHRyf05vMbm/Jw08Rs0elOoWBQEf/9sU33/nd/83ysBd63+XS5+yOXAfPjjTg/f/PZM7U/dMyQNhDAoggP/e1j71ng0JpKOalhwBm3ex6IGykKry0nSuNV3mplHxQRp+HOgqOJcRvWpbsa42cqmmsZejIs2HkCoCTLRZII/0pdCGxP6VHuHnu8TZiaSgbF2emU7PuMQ6kCr05mCvgy1/mDDaH+CK8gf7DYesffhSkQ51XXxX/Q06twPDV0LyH2EnOWsM9j/aPqB8jzrHYBMT90EDxtXM0IUZxpWgOVdQ2EwtNOi/gnkGsAh6xpVg30CJ7e0gYBqwNNwNqaLvqnUAf9q1Oc1A2gySWUyUZNN5Ua/lsAe2wyL2GOkNKLyxtOl4u35Af8ShunjiD6ysTb0k8A9YBrtqEjyF/XaK94pMn+GJnSbboRQ7RQB+1STEAh5eJAkRgt8sRhMujhO8r5nVgPLTcq+rHiMOiEFGhzNf3hTwH9cNicRgxJt1aRcJM4ZFIxNPK2wHxjq51hxudO6gDdfmXq45M7+5ms4kpAwgB6TYwSusB6KcmecOpzHpdZeqUkbS0CYq2i7g/3fkamZEz7Gthi9Yn/nSK9ZE0fc3Imcd4SXGII6IECxEHDAH9NAps9eKOuJKO5FY41XL1DD3ikCACNANIxscFAq1ukh6Yo5mRiCAWSbe2rNZND0EnABhbfwEKFPnTjDi59oJMDjLJ8A5hrVmHPc5HikwmC8CAWBG1JwAAebROsFYuh3iuI93cZzF93AndfWj4pQpp6NWIJ+KFoE/v8eIQLhoioijvHgpIoFccE1EXOozXsikrCOKUVlctUp1TXgJ0eDlLQpHvfL5CqpUGc7jSxaihKHFy8ZwMQXlO72UlgbVHudrTqYiTcBjhd2LyQXw5XffGoGFw1m33eqcZCmop8XhuXhgelkwxwSC7HilbJXWCaVSZqUsVyF9ZXhxwRSevyvlYEqW5hm7eZpL+alMbYhK5Mo8YUE2vUuGbxRG5ozcvaW+h7+7sFGvidSJdBnrQzn4ytBV/G7oUbwmeJ7VwdPYCk4rD1nFbwSlrQdI8SUBajVwNYoCjWX/tCW/fLzKb4kLfmq80o+BV9BW8bO0eZbROPg8qmrkUtWkr6lsX92Q+haN+Qa/O17ymsqa3MicRRkzn/ThRWmjl8WjK9FjhjCVIFWDn2m83sDczjllpDaVcqeRHCopelpi0EmoBvtSLHeD6YrhZ2nxpZfjSlos8xyDosONaEJRFCGftc5QkU5Ii8CpCcdNG4bjEEL/96UEBtxLpvmR8SQvDl62WAdJw1LwHu503JH2fMSrIw3v6oDHuzisMhGfDwFPB4+zx0hOexzeyW6VcZhVxvo74LOOUExIliG2h5tDFP3qnXdhc/t8enY7n5773B8/PJpuP9yaHoVb4Sm/2MpmdiVBVg8fHkx3H+5MswnVfxIehDvh/5itBP59daF+Q1bOVZnzcG+6+XBjuhduhKd0sZFNLFdtmifbeIk/M322X1oJPwlO1wXwU0aNn88wwwLSlw39xYVLiN/D7759g6paHz973S8MRpFPRMHwj8FZee1jdUtZaz8uJJzSsBgbE7N7ocAeM3zWHiDKvkNhH9c/t0+qr+0bcRMAAA== */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_URL_IMPORT_31___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;charset=utf-8;base64,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 */ "data:font/woff2;charset=utf-8;base64,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"), __webpack_require__.b); -var ___CSS_LOADER_EXPORT___ = _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); -var ___CSS_LOADER_URL_REPLACEMENT_0___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_0___); -var ___CSS_LOADER_URL_REPLACEMENT_1___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_1___); -var ___CSS_LOADER_URL_REPLACEMENT_2___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_2___); -var ___CSS_LOADER_URL_REPLACEMENT_3___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_3___); -var ___CSS_LOADER_URL_REPLACEMENT_4___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_4___); -var ___CSS_LOADER_URL_REPLACEMENT_5___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_5___); -var ___CSS_LOADER_URL_REPLACEMENT_6___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_6___); -var ___CSS_LOADER_URL_REPLACEMENT_7___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_7___); -var ___CSS_LOADER_URL_REPLACEMENT_8___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_8___); -var ___CSS_LOADER_URL_REPLACEMENT_9___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_9___); -var ___CSS_LOADER_URL_REPLACEMENT_10___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_10___); -var ___CSS_LOADER_URL_REPLACEMENT_11___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_11___); -var ___CSS_LOADER_URL_REPLACEMENT_12___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_12___); -var ___CSS_LOADER_URL_REPLACEMENT_13___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_13___); -var ___CSS_LOADER_URL_REPLACEMENT_14___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_14___); -var ___CSS_LOADER_URL_REPLACEMENT_15___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_15___); -var ___CSS_LOADER_URL_REPLACEMENT_16___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_16___); -var ___CSS_LOADER_URL_REPLACEMENT_17___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_17___); -var ___CSS_LOADER_URL_REPLACEMENT_18___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_18___); -var ___CSS_LOADER_URL_REPLACEMENT_19___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_19___); -var ___CSS_LOADER_URL_REPLACEMENT_20___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_20___); -var ___CSS_LOADER_URL_REPLACEMENT_21___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_21___); -var ___CSS_LOADER_URL_REPLACEMENT_22___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_22___); -var ___CSS_LOADER_URL_REPLACEMENT_23___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_23___); -var ___CSS_LOADER_URL_REPLACEMENT_24___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_24___); -var ___CSS_LOADER_URL_REPLACEMENT_25___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_25___); -var ___CSS_LOADER_URL_REPLACEMENT_26___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_26___); -var ___CSS_LOADER_URL_REPLACEMENT_27___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_27___); -var ___CSS_LOADER_URL_REPLACEMENT_28___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_28___); -var ___CSS_LOADER_URL_REPLACEMENT_29___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_29___); -var ___CSS_LOADER_URL_REPLACEMENT_30___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_30___); -var ___CSS_LOADER_URL_REPLACEMENT_31___ = _css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_31___); -// Module -___CSS_LOADER_EXPORT___.push([module.id, "/*!*************************************************************************************************************!*\\\n !*** css ../../node_modules/css-loader/dist/cjs.js!../../node_modules/@fontsource/open-sans/400-italic.css ***!\n \\*************************************************************************************************************/\n/* open-sans-cyrillic-ext-400-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 400;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_0___ + ") format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* open-sans-cyrillic-400-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 400;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_1___ + ") format('woff2');\n unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* open-sans-greek-ext-400-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 400;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_2___ + ") format('woff2');\n unicode-range: U+1F00-1FFF;\n}\n/* open-sans-greek-400-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 400;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_3___ + ") format('woff2');\n unicode-range: U+0370-03FF;\n}\n/* open-sans-hebrew-400-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 400;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_4___ + ") format('woff2');\n unicode-range: U+0590-05FF, U+20AA, U+25CC, U+FB1D-FB4F;\n}\n/* open-sans-vietnamese-400-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 400;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_5___ + ") format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;\n}\n/* open-sans-latin-ext-400-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 400;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_6___ + ") format('woff2');\n unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* open-sans-latin-400-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 400;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_7___ + ") format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n\n/*!*************************************************************************************************************!*\\\n !*** css ../../node_modules/css-loader/dist/cjs.js!../../node_modules/@fontsource/open-sans/700-italic.css ***!\n \\*************************************************************************************************************/\n/* open-sans-cyrillic-ext-700-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 700;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_8___ + ") format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* open-sans-cyrillic-700-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 700;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_9___ + ") format('woff2');\n unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* open-sans-greek-ext-700-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 700;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_10___ + ") format('woff2');\n unicode-range: U+1F00-1FFF;\n}\n/* open-sans-greek-700-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 700;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_11___ + ") format('woff2');\n unicode-range: U+0370-03FF;\n}\n/* open-sans-hebrew-700-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 700;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_12___ + ") format('woff2');\n unicode-range: U+0590-05FF, U+20AA, U+25CC, U+FB1D-FB4F;\n}\n/* open-sans-vietnamese-700-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 700;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_13___ + ") format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;\n}\n/* open-sans-latin-ext-700-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 700;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_14___ + ") format('woff2');\n unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* open-sans-latin-700-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 700;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_15___ + ") format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n\n/*!******************************************************************************************************!*\\\n !*** css ../../node_modules/css-loader/dist/cjs.js!../../node_modules/@fontsource/open-sans/400.css ***!\n \\******************************************************************************************************/\n/* open-sans-cyrillic-ext-400-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_16___ + ") format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* open-sans-cyrillic-400-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_17___ + ") format('woff2');\n unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* open-sans-greek-ext-400-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_18___ + ") format('woff2');\n unicode-range: U+1F00-1FFF;\n}\n/* open-sans-greek-400-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_19___ + ") format('woff2');\n unicode-range: U+0370-03FF;\n}\n/* open-sans-hebrew-400-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_20___ + ") format('woff2');\n unicode-range: U+0590-05FF, U+20AA, U+25CC, U+FB1D-FB4F;\n}\n/* open-sans-vietnamese-400-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_21___ + ") format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;\n}\n/* open-sans-latin-ext-400-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_22___ + ") format('woff2');\n unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* open-sans-latin-400-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_23___ + ") format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n\n/*!******************************************************************************************************!*\\\n !*** css ../../node_modules/css-loader/dist/cjs.js!../../node_modules/@fontsource/open-sans/700.css ***!\n \\******************************************************************************************************/\n/* open-sans-cyrillic-ext-700-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_24___ + ") format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* open-sans-cyrillic-700-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_25___ + ") format('woff2');\n unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* open-sans-greek-ext-700-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_26___ + ") format('woff2');\n unicode-range: U+1F00-1FFF;\n}\n/* open-sans-greek-700-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_27___ + ") format('woff2');\n unicode-range: U+0370-03FF;\n}\n/* open-sans-hebrew-700-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_28___ + ") format('woff2');\n unicode-range: U+0590-05FF, U+20AA, U+25CC, U+FB1D-FB4F;\n}\n/* open-sans-vietnamese-700-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_29___ + ") format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;\n}\n/* open-sans-latin-ext-700-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_30___ + ") format('woff2');\n unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* open-sans-latin-700-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_31___ + ") format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n\n/*!*****************************************************************************************************************!*\\\n !*** css ../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./src/index.scss ***!\n \\*****************************************************************************************************************/\n/*\n * CSS for jsPsych experiments.\n *\n * This stylesheet provides minimal styling to make jsPsych\n * experiments look polished without any additional styles.\n */\n/* Container holding jsPsych content */\n.jspsych-display-element {\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n}\n\n.jspsych-display-element:focus {\n outline: none;\n}\n\n.jspsych-content-wrapper {\n display: flex;\n margin: auto;\n flex: 1 1 100%;\n width: 100%;\n}\n\n.jspsych-content {\n max-width: 95%;\n /* this is mainly an IE 10-11 fix */\n text-align: center;\n margin: auto;\n /* this is for overflowing content */\n}\n\n.jspsych-top {\n align-items: flex-start;\n}\n\n.jspsych-middle {\n align-items: center;\n}\n\n/* fonts and type */\n.jspsych-display-element {\n font-family: \"Open Sans\", \"Arial\", sans-serif;\n font-size: 18px;\n line-height: 1.6em;\n}\n\n/* Form elements like input fields and buttons */\n.jspsych-display-element input[type=text] {\n font-family: \"Open Sans\", \"Arial\", sans-serif;\n font-size: 14px;\n}\n\n/* borrowing Bootstrap style for btn elements, but combining styles a bit */\n.jspsych-btn {\n display: inline-block;\n padding: 6px 12px;\n margin: 0px;\n font-size: 14px;\n font-weight: 400;\n font-family: \"Open Sans\", \"Arial\", sans-serif;\n cursor: pointer;\n line-height: 1.4;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n\n/* only apply the hover style on devices with a mouse/pointer that can hover - issue #977 */\n@media (hover: hover) {\n .jspsych-btn:hover {\n background-color: #ddd;\n border-color: #aaa;\n }\n}\n.jspsych-btn:active {\n background-color: #ddd;\n border-color: #000000;\n}\n\n.jspsych-btn:disabled {\n background-color: #eee;\n color: #aaa;\n border-color: #ccc;\n cursor: not-allowed;\n}\n\n/* custom style for input[type=\"range] (slider) to improve alignment between positions and labels */\n.jspsych-slider {\n appearance: none;\n -webkit-appearance: none;\n -moz-appearance: none;\n width: 100%;\n background: transparent;\n}\n\n.jspsych-slider:focus {\n outline: none;\n}\n\n/* track */\n.jspsych-slider::-webkit-slider-runnable-track {\n appearance: none;\n -webkit-appearance: none;\n width: 100%;\n height: 8px;\n cursor: pointer;\n background: #eee;\n box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;\n border-radius: 2px;\n border: 1px solid #aaa;\n}\n\n.jspsych-slider::-moz-range-track {\n appearance: none;\n width: 100%;\n height: 8px;\n cursor: pointer;\n background: #eee;\n box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;\n border-radius: 2px;\n border: 1px solid #aaa;\n}\n\n.jspsych-slider::-ms-track {\n appearance: none;\n width: 99%;\n height: 14px;\n cursor: pointer;\n background: #eee;\n box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;\n border-radius: 2px;\n border: 1px solid #aaa;\n}\n\n/* thumb */\n.jspsych-slider::-webkit-slider-thumb {\n border: 1px solid #666;\n height: 24px;\n width: 15px;\n border-radius: 5px;\n background: #ffffff;\n cursor: pointer;\n -webkit-appearance: none;\n margin-top: -9px;\n}\n\n.jspsych-slider::-moz-range-thumb {\n border: 1px solid #666;\n height: 24px;\n width: 15px;\n border-radius: 5px;\n background: #ffffff;\n cursor: pointer;\n}\n\n.jspsych-slider::-ms-thumb {\n border: 1px solid #666;\n height: 20px;\n width: 15px;\n border-radius: 5px;\n background: #ffffff;\n cursor: pointer;\n margin-top: -2px;\n}\n\n/* jsPsych progress bar */\n#jspsych-progressbar-container {\n color: #555;\n border-bottom: 1px solid #dedede;\n background-color: #f9f9f9;\n margin-bottom: 1em;\n text-align: center;\n padding: 8px 0px;\n width: 100%;\n line-height: 1em;\n}\n\n#jspsych-progressbar-container span {\n font-size: 14px;\n padding-right: 14px;\n}\n\n#jspsych-progressbar-outer {\n background-color: #eee;\n width: 50%;\n margin: auto;\n height: 14px;\n display: inline-block;\n vertical-align: middle;\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n#jspsych-progressbar-inner {\n background-color: #aaa;\n width: 0%;\n height: 100%;\n}\n\n/* Control appearance of jsPsych.data.displayData() */\n#jspsych-data-display {\n text-align: left;\n}\n", "",{"version":3,"sources":["webpack://./node_modules/jspsych/css/jspsych.css"],"names":[],"mappings":"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","sourcesContent":["/*!*************************************************************************************************************!*\\\n !*** css ../../node_modules/css-loader/dist/cjs.js!../../node_modules/@fontsource/open-sans/400-italic.css ***!\n \\*************************************************************************************************************/\n/* open-sans-cyrillic-ext-400-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 400;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* open-sans-cyrillic-400-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 400;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* open-sans-greek-ext-400-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 400;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+1F00-1FFF;\n}\n/* open-sans-greek-400-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 400;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+0370-03FF;\n}\n/* open-sans-hebrew-400-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 400;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+0590-05FF, U+20AA, U+25CC, U+FB1D-FB4F;\n}\n/* open-sans-vietnamese-400-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 400;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;\n}\n/* open-sans-latin-ext-400-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 400;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* open-sans-latin-400-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 400;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n\n/*!*************************************************************************************************************!*\\\n !*** css ../../node_modules/css-loader/dist/cjs.js!../../node_modules/@fontsource/open-sans/700-italic.css ***!\n \\*************************************************************************************************************/\n/* open-sans-cyrillic-ext-700-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 700;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* open-sans-cyrillic-700-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 700;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* open-sans-greek-ext-700-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 700;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+1F00-1FFF;\n}\n/* open-sans-greek-700-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 700;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+0370-03FF;\n}\n/* open-sans-hebrew-700-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 700;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+0590-05FF, U+20AA, U+25CC, U+FB1D-FB4F;\n}\n/* open-sans-vietnamese-700-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 700;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;\n}\n/* open-sans-latin-ext-700-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 700;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* open-sans-latin-700-italic*/\n@font-face {\n font-family: 'Open Sans';\n font-style: italic;\n font-display: swap;\n font-weight: 700;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n\n/*!******************************************************************************************************!*\\\n !*** css ../../node_modules/css-loader/dist/cjs.js!../../node_modules/@fontsource/open-sans/400.css ***!\n \\******************************************************************************************************/\n/* open-sans-cyrillic-ext-400-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* open-sans-cyrillic-400-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* open-sans-greek-ext-400-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+1F00-1FFF;\n}\n/* open-sans-greek-400-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+0370-03FF;\n}\n/* open-sans-hebrew-400-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+0590-05FF, U+20AA, U+25CC, U+FB1D-FB4F;\n}\n/* open-sans-vietnamese-400-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;\n}\n/* open-sans-latin-ext-400-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* open-sans-latin-400-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n\n/*!******************************************************************************************************!*\\\n !*** css ../../node_modules/css-loader/dist/cjs.js!../../node_modules/@fontsource/open-sans/700.css ***!\n \\******************************************************************************************************/\n/* open-sans-cyrillic-ext-700-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* open-sans-cyrillic-700-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* open-sans-greek-ext-700-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+1F00-1FFF;\n}\n/* open-sans-greek-700-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+0370-03FF;\n}\n/* open-sans-hebrew-700-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+0590-05FF, U+20AA, U+25CC, U+FB1D-FB4F;\n}\n/* open-sans-vietnamese-700-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;\n}\n/* open-sans-latin-ext-700-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* open-sans-latin-700-normal*/\n@font-face {\n font-family: 'Open Sans';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url(data:font/woff2;charset=utf-8;base64,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) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n\n/*!*****************************************************************************************************************!*\\\n !*** css ../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./src/index.scss ***!\n \\*****************************************************************************************************************/\n/*\n * CSS for jsPsych experiments.\n *\n * This stylesheet provides minimal styling to make jsPsych\n * experiments look polished without any additional styles.\n */\n/* Container holding jsPsych content */\n.jspsych-display-element {\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n}\n\n.jspsych-display-element:focus {\n outline: none;\n}\n\n.jspsych-content-wrapper {\n display: flex;\n margin: auto;\n flex: 1 1 100%;\n width: 100%;\n}\n\n.jspsych-content {\n max-width: 95%;\n /* this is mainly an IE 10-11 fix */\n text-align: center;\n margin: auto;\n /* this is for overflowing content */\n}\n\n.jspsych-top {\n align-items: flex-start;\n}\n\n.jspsych-middle {\n align-items: center;\n}\n\n/* fonts and type */\n.jspsych-display-element {\n font-family: \"Open Sans\", \"Arial\", sans-serif;\n font-size: 18px;\n line-height: 1.6em;\n}\n\n/* Form elements like input fields and buttons */\n.jspsych-display-element input[type=text] {\n font-family: \"Open Sans\", \"Arial\", sans-serif;\n font-size: 14px;\n}\n\n/* borrowing Bootstrap style for btn elements, but combining styles a bit */\n.jspsych-btn {\n display: inline-block;\n padding: 6px 12px;\n margin: 0px;\n font-size: 14px;\n font-weight: 400;\n font-family: \"Open Sans\", \"Arial\", sans-serif;\n cursor: pointer;\n line-height: 1.4;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n\n/* only apply the hover style on devices with a mouse/pointer that can hover - issue #977 */\n@media (hover: hover) {\n .jspsych-btn:hover {\n background-color: #ddd;\n border-color: #aaa;\n }\n}\n.jspsych-btn:active {\n background-color: #ddd;\n border-color: #000000;\n}\n\n.jspsych-btn:disabled {\n background-color: #eee;\n color: #aaa;\n border-color: #ccc;\n cursor: not-allowed;\n}\n\n/* custom style for input[type=\"range] (slider) to improve alignment between positions and labels */\n.jspsych-slider {\n appearance: none;\n -webkit-appearance: none;\n -moz-appearance: none;\n width: 100%;\n background: transparent;\n}\n\n.jspsych-slider:focus {\n outline: none;\n}\n\n/* track */\n.jspsych-slider::-webkit-slider-runnable-track {\n appearance: none;\n -webkit-appearance: none;\n width: 100%;\n height: 8px;\n cursor: pointer;\n background: #eee;\n box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;\n border-radius: 2px;\n border: 1px solid #aaa;\n}\n\n.jspsych-slider::-moz-range-track {\n appearance: none;\n width: 100%;\n height: 8px;\n cursor: pointer;\n background: #eee;\n box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;\n border-radius: 2px;\n border: 1px solid #aaa;\n}\n\n.jspsych-slider::-ms-track {\n appearance: none;\n width: 99%;\n height: 14px;\n cursor: pointer;\n background: #eee;\n box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;\n border-radius: 2px;\n border: 1px solid #aaa;\n}\n\n/* thumb */\n.jspsych-slider::-webkit-slider-thumb {\n border: 1px solid #666;\n height: 24px;\n width: 15px;\n border-radius: 5px;\n background: #ffffff;\n cursor: pointer;\n -webkit-appearance: none;\n margin-top: -9px;\n}\n\n.jspsych-slider::-moz-range-thumb {\n border: 1px solid #666;\n height: 24px;\n width: 15px;\n border-radius: 5px;\n background: #ffffff;\n cursor: pointer;\n}\n\n.jspsych-slider::-ms-thumb {\n border: 1px solid #666;\n height: 20px;\n width: 15px;\n border-radius: 5px;\n background: #ffffff;\n cursor: pointer;\n margin-top: -2px;\n}\n\n/* jsPsych progress bar */\n#jspsych-progressbar-container {\n color: #555;\n border-bottom: 1px solid #dedede;\n background-color: #f9f9f9;\n margin-bottom: 1em;\n text-align: center;\n padding: 8px 0px;\n width: 100%;\n line-height: 1em;\n}\n\n#jspsych-progressbar-container span {\n font-size: 14px;\n padding-right: 14px;\n}\n\n#jspsych-progressbar-outer {\n background-color: #eee;\n width: 50%;\n margin: auto;\n height: 14px;\n display: inline-block;\n vertical-align: middle;\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n#jspsych-progressbar-inner {\n background-color: #aaa;\n width: 0%;\n height: 100%;\n}\n\n/* Control appearance of jsPsych.data.displayData() */\n#jspsych-data-display {\n text-align: left;\n}\n"],"sourceRoot":""}]); -// Exports -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); - - -/***/ }), - -/***/ "./node_modules/css-loader/dist/runtime/api.js": -/*!*****************************************************!*\ - !*** ./node_modules/css-loader/dist/runtime/api.js ***! - \*****************************************************/ -/***/ ((module) => { - -"use strict"; - - -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -module.exports = function (cssWithMappingToString) { - var list = []; // return the list of modules as css string - - list.toString = function toString() { - return this.map(function (item) { - var content = ""; - var needLayer = typeof item[5] !== "undefined"; - - if (item[4]) { - content += "@supports (".concat(item[4], ") {"); - } - - if (item[2]) { - content += "@media ".concat(item[2], " {"); - } - - if (needLayer) { - content += "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {"); - } - - content += cssWithMappingToString(item); - - if (needLayer) { - content += "}"; - } - - if (item[2]) { - content += "}"; - } - - if (item[4]) { - content += "}"; - } - - return content; - }).join(""); - }; // import a list of modules into the list - - - list.i = function i(modules, media, dedupe, supports, layer) { - if (typeof modules === "string") { - modules = [[null, modules, undefined]]; - } - - var alreadyImportedModules = {}; - - if (dedupe) { - for (var k = 0; k < this.length; k++) { - var id = this[k][0]; - - if (id != null) { - alreadyImportedModules[id] = true; - } - } - } - - for (var _k = 0; _k < modules.length; _k++) { - var item = [].concat(modules[_k]); - - if (dedupe && alreadyImportedModules[item[0]]) { - continue; - } - - if (typeof layer !== "undefined") { - if (typeof item[5] === "undefined") { - item[5] = layer; - } else { - item[1] = "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {").concat(item[1], "}"); - item[5] = layer; - } - } - - if (media) { - if (!item[2]) { - item[2] = media; - } else { - item[1] = "@media ".concat(item[2], " {").concat(item[1], "}"); - item[2] = media; - } - } - - if (supports) { - if (!item[4]) { - item[4] = "".concat(supports); - } else { - item[1] = "@supports (".concat(item[4], ") {").concat(item[1], "}"); - item[4] = supports; - } - } - - list.push(item); - } - }; - - return list; -}; - -/***/ }), - -/***/ "./node_modules/css-loader/dist/runtime/getUrl.js": -/*!********************************************************!*\ - !*** ./node_modules/css-loader/dist/runtime/getUrl.js ***! - \********************************************************/ -/***/ ((module) => { - -"use strict"; - - -module.exports = function (url, options) { - if (!options) { - options = {}; - } - - if (!url) { - return url; - } - - url = String(url.__esModule ? url.default : url); // If url is already wrapped in quotes, remove them - - if (/^['"].*['"]$/.test(url)) { - url = url.slice(1, -1); - } - - if (options.hash) { - url += options.hash; - } // Should url be wrapped? - // See https://drafts.csswg.org/css-values-3/#urls - - - if (/["'() \t\n]|(%20)/.test(url) || options.needQuotes) { - return "\"".concat(url.replace(/"/g, '\\"').replace(/\n/g, "\\n"), "\""); - } - - return url; -}; - -/***/ }), - -/***/ "./node_modules/css-loader/dist/runtime/sourceMaps.js": -/*!************************************************************!*\ - !*** ./node_modules/css-loader/dist/runtime/sourceMaps.js ***! - \************************************************************/ -/***/ ((module) => { - -"use strict"; - - -module.exports = function (item) { - var content = item[1]; - var cssMapping = item[3]; - - if (!cssMapping) { - return content; - } - - if (typeof btoa === "function") { - var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping)))); - var data = "sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(base64); - var sourceMapping = "/*# ".concat(data, " */"); - var sourceURLs = cssMapping.sources.map(function (source) { - return "/*# sourceURL=".concat(cssMapping.sourceRoot || "").concat(source, " */"); - }); - return [content].concat(sourceURLs).concat([sourceMapping]).join("\n"); - } - - return [content].join("\n"); -}; - -/***/ }), - -/***/ "./src/video/Asteroid_Attack_End.mp4": -/*!*******************************************!*\ - !*** ./src/video/Asteroid_Attack_End.mp4 ***! - \*******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "video/Asteroid_Attack_End.mp4"); - -/***/ }), - -/***/ "./src/video/Asteroid_Attack_Intro.mp4": -/*!*********************************************!*\ - !*** ./src/video/Asteroid_Attack_Intro.mp4 ***! - \*********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "video/Asteroid_Attack_Intro.mp4"); - -/***/ }), - -/***/ "./src/video/Asteroid_Attack_Level_Up_1.mp4": -/*!**************************************************!*\ - !*** ./src/video/Asteroid_Attack_Level_Up_1.mp4 ***! - \**************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "video/Asteroid_Attack_Level_Up_1.mp4"); - -/***/ }), - -/***/ "./src/video/Asteroid_Attack_Level_Up_2.mp4": -/*!**************************************************!*\ - !*** ./src/video/Asteroid_Attack_Level_Up_2.mp4 ***! - \**************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "video/Asteroid_Attack_Level_Up_2.mp4"); - -/***/ }), - -/***/ "./src/video/Asteroid_Attack_Level_Up_3.mp4": -/*!**************************************************!*\ - !*** ./src/video/Asteroid_Attack_Level_Up_3.mp4 ***! - \**************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "video/Asteroid_Attack_Level_Up_3.mp4"); - -/***/ }), - -/***/ "./src/video/Asteroid_Attack_Level_Up_4.mp4": -/*!**************************************************!*\ - !*** ./src/video/Asteroid_Attack_Level_Up_4.mp4 ***! - \**************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "video/Asteroid_Attack_Level_Up_4.mp4"); - -/***/ }), - -/***/ "./src/video/Asteroid_Attack_Level_Up_5.mp4": -/*!**************************************************!*\ - !*** ./src/video/Asteroid_Attack_Level_Up_5.mp4 ***! - \**************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "video/Asteroid_Attack_Level_Up_5.mp4"); - -/***/ }), - -/***/ "./node_modules/firebase/app/dist/index.esm.js": -/*!*****************************************************!*\ - !*** ./node_modules/firebase/app/dist/index.esm.js ***! - \*****************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "FirebaseError": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__.FirebaseError), -/* harmony export */ "SDK_VERSION": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__.SDK_VERSION), -/* harmony export */ "_DEFAULT_ENTRY_NAME": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__._DEFAULT_ENTRY_NAME), -/* harmony export */ "_addComponent": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__._addComponent), -/* harmony export */ "_addOrOverwriteComponent": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__._addOrOverwriteComponent), -/* harmony export */ "_apps": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__._apps), -/* harmony export */ "_clearComponents": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__._clearComponents), -/* harmony export */ "_components": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__._components), -/* harmony export */ "_getProvider": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__._getProvider), -/* harmony export */ "_registerComponent": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__._registerComponent), -/* harmony export */ "_removeServiceInstance": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__._removeServiceInstance), -/* harmony export */ "deleteApp": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__.deleteApp), -/* harmony export */ "getApp": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__.getApp), -/* harmony export */ "getApps": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__.getApps), -/* harmony export */ "initializeApp": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__.initializeApp), -/* harmony export */ "onLog": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__.onLog), -/* harmony export */ "registerVersion": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__.registerVersion), -/* harmony export */ "setLogLevel": () => (/* reexport safe */ _firebase_app__WEBPACK_IMPORTED_MODULE_0__.setLogLevel) -/* harmony export */ }); -/* harmony import */ var _firebase_app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @firebase/app */ "./node_modules/@firebase/app/dist/esm/index.esm2017.js"); - - - -var name = "firebase"; -var version = "9.6.9"; - -/** - * @license - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -(0,_firebase_app__WEBPACK_IMPORTED_MODULE_0__.registerVersion)(name, version, 'app'); -//# sourceMappingURL=index.esm.js.map - - -/***/ }), - -/***/ "./node_modules/firebase/auth/dist/index.esm.js": -/*!******************************************************!*\ - !*** ./node_modules/firebase/auth/dist/index.esm.js ***! - \******************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "ActionCodeOperation": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.ActionCodeOperation), -/* harmony export */ "ActionCodeURL": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.ActionCodeURL), -/* harmony export */ "AuthCredential": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.AuthCredential), -/* harmony export */ "AuthErrorCodes": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.AuthErrorCodes), -/* harmony export */ "EmailAuthCredential": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.EmailAuthCredential), -/* harmony export */ "EmailAuthProvider": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.EmailAuthProvider), -/* harmony export */ "FacebookAuthProvider": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.FacebookAuthProvider), -/* harmony export */ "FactorId": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.FactorId), -/* harmony export */ "GithubAuthProvider": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.GithubAuthProvider), -/* harmony export */ "GoogleAuthProvider": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.GoogleAuthProvider), -/* harmony export */ "OAuthCredential": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.OAuthCredential), -/* harmony export */ "OAuthProvider": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.OAuthProvider), -/* harmony export */ "OperationType": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.OperationType), -/* harmony export */ "PhoneAuthCredential": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.PhoneAuthCredential), -/* harmony export */ "PhoneAuthProvider": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.PhoneAuthProvider), -/* harmony export */ "PhoneMultiFactorGenerator": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.PhoneMultiFactorGenerator), -/* harmony export */ "ProviderId": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.ProviderId), -/* harmony export */ "RecaptchaVerifier": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.RecaptchaVerifier), -/* harmony export */ "SAMLAuthProvider": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.SAMLAuthProvider), -/* harmony export */ "SignInMethod": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.SignInMethod), -/* harmony export */ "TwitterAuthProvider": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.TwitterAuthProvider), -/* harmony export */ "applyActionCode": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.applyActionCode), -/* harmony export */ "browserLocalPersistence": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.browserLocalPersistence), -/* harmony export */ "browserPopupRedirectResolver": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.browserPopupRedirectResolver), -/* harmony export */ "browserSessionPersistence": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.browserSessionPersistence), -/* harmony export */ "checkActionCode": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.checkActionCode), -/* harmony export */ "confirmPasswordReset": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.confirmPasswordReset), -/* harmony export */ "connectAuthEmulator": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.connectAuthEmulator), -/* harmony export */ "createUserWithEmailAndPassword": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.createUserWithEmailAndPassword), -/* harmony export */ "debugErrorMap": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.debugErrorMap), -/* harmony export */ "deleteUser": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.deleteUser), -/* harmony export */ "fetchSignInMethodsForEmail": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.fetchSignInMethodsForEmail), -/* harmony export */ "getAdditionalUserInfo": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.getAdditionalUserInfo), -/* harmony export */ "getAuth": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.getAuth), -/* harmony export */ "getIdToken": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.getIdToken), -/* harmony export */ "getIdTokenResult": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.getIdTokenResult), -/* harmony export */ "getMultiFactorResolver": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.getMultiFactorResolver), -/* harmony export */ "getRedirectResult": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.getRedirectResult), -/* harmony export */ "inMemoryPersistence": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.inMemoryPersistence), -/* harmony export */ "indexedDBLocalPersistence": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.indexedDBLocalPersistence), -/* harmony export */ "initializeAuth": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.initializeAuth), -/* harmony export */ "isSignInWithEmailLink": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.isSignInWithEmailLink), -/* harmony export */ "linkWithCredential": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.linkWithCredential), -/* harmony export */ "linkWithPhoneNumber": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.linkWithPhoneNumber), -/* harmony export */ "linkWithPopup": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.linkWithPopup), -/* harmony export */ "linkWithRedirect": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.linkWithRedirect), -/* harmony export */ "multiFactor": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.multiFactor), -/* harmony export */ "onAuthStateChanged": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.onAuthStateChanged), -/* harmony export */ "onIdTokenChanged": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.onIdTokenChanged), -/* harmony export */ "parseActionCodeURL": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.parseActionCodeURL), -/* harmony export */ "prodErrorMap": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.prodErrorMap), -/* harmony export */ "reauthenticateWithCredential": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.reauthenticateWithCredential), -/* harmony export */ "reauthenticateWithPhoneNumber": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.reauthenticateWithPhoneNumber), -/* harmony export */ "reauthenticateWithPopup": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.reauthenticateWithPopup), -/* harmony export */ "reauthenticateWithRedirect": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.reauthenticateWithRedirect), -/* harmony export */ "reload": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.reload), -/* harmony export */ "sendEmailVerification": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.sendEmailVerification), -/* harmony export */ "sendPasswordResetEmail": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.sendPasswordResetEmail), -/* harmony export */ "sendSignInLinkToEmail": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.sendSignInLinkToEmail), -/* harmony export */ "setPersistence": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.setPersistence), -/* harmony export */ "signInAnonymously": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.signInAnonymously), -/* harmony export */ "signInWithCredential": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.signInWithCredential), -/* harmony export */ "signInWithCustomToken": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.signInWithCustomToken), -/* harmony export */ "signInWithEmailAndPassword": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.signInWithEmailAndPassword), -/* harmony export */ "signInWithEmailLink": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.signInWithEmailLink), -/* harmony export */ "signInWithPhoneNumber": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.signInWithPhoneNumber), -/* harmony export */ "signInWithPopup": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.signInWithPopup), -/* harmony export */ "signInWithRedirect": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.signInWithRedirect), -/* harmony export */ "signOut": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.signOut), -/* harmony export */ "unlink": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.unlink), -/* harmony export */ "updateCurrentUser": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.updateCurrentUser), -/* harmony export */ "updateEmail": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.updateEmail), -/* harmony export */ "updatePassword": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.updatePassword), -/* harmony export */ "updatePhoneNumber": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.updatePhoneNumber), -/* harmony export */ "updateProfile": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.updateProfile), -/* harmony export */ "useDeviceLanguage": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.useDeviceLanguage), -/* harmony export */ "verifyBeforeUpdateEmail": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.verifyBeforeUpdateEmail), -/* harmony export */ "verifyPasswordResetCode": () => (/* reexport safe */ _firebase_auth__WEBPACK_IMPORTED_MODULE_0__.verifyPasswordResetCode) -/* harmony export */ }); -/* harmony import */ var _firebase_auth__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @firebase/auth */ "./node_modules/@firebase/auth/dist/esm2017/index.js"); - -//# sourceMappingURL=index.esm.js.map - - -/***/ }), - -/***/ "./node_modules/firebase/firestore/dist/index.esm.js": -/*!***********************************************************!*\ - !*** ./node_modules/firebase/firestore/dist/index.esm.js ***! - \***********************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "AbstractUserDataWriter": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.AbstractUserDataWriter), -/* harmony export */ "Bytes": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.Bytes), -/* harmony export */ "CACHE_SIZE_UNLIMITED": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.CACHE_SIZE_UNLIMITED), -/* harmony export */ "CollectionReference": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.CollectionReference), -/* harmony export */ "DocumentReference": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.DocumentReference), -/* harmony export */ "DocumentSnapshot": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.DocumentSnapshot), -/* harmony export */ "FieldPath": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.FieldPath), -/* harmony export */ "FieldValue": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.FieldValue), -/* harmony export */ "Firestore": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.Firestore), -/* harmony export */ "FirestoreError": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.FirestoreError), -/* harmony export */ "GeoPoint": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.GeoPoint), -/* harmony export */ "LoadBundleTask": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.LoadBundleTask), -/* harmony export */ "Query": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.Query), -/* harmony export */ "QueryConstraint": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.QueryConstraint), -/* harmony export */ "QueryDocumentSnapshot": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.QueryDocumentSnapshot), -/* harmony export */ "QuerySnapshot": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.QuerySnapshot), -/* harmony export */ "SnapshotMetadata": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.SnapshotMetadata), -/* harmony export */ "Timestamp": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.Timestamp), -/* harmony export */ "Transaction": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.Transaction), -/* harmony export */ "WriteBatch": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.WriteBatch), -/* harmony export */ "_DatabaseId": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__._DatabaseId), -/* harmony export */ "_DocumentKey": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__._DocumentKey), -/* harmony export */ "_EmptyAppCheckTokenProvider": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__._EmptyAppCheckTokenProvider), -/* harmony export */ "_EmptyAuthCredentialsProvider": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__._EmptyAuthCredentialsProvider), -/* harmony export */ "_FieldPath": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__._FieldPath), -/* harmony export */ "_cast": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__._cast), -/* harmony export */ "_debugAssert": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__._debugAssert), -/* harmony export */ "_isBase64Available": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__._isBase64Available), -/* harmony export */ "_logWarn": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__._logWarn), -/* harmony export */ "_setIndexConfiguration": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__._setIndexConfiguration), -/* harmony export */ "_validateIsNotUsedTogether": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__._validateIsNotUsedTogether), -/* harmony export */ "addDoc": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.addDoc), -/* harmony export */ "arrayRemove": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.arrayRemove), -/* harmony export */ "arrayUnion": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.arrayUnion), -/* harmony export */ "clearIndexedDbPersistence": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.clearIndexedDbPersistence), -/* harmony export */ "collection": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.collection), -/* harmony export */ "collectionGroup": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.collectionGroup), -/* harmony export */ "connectFirestoreEmulator": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.connectFirestoreEmulator), -/* harmony export */ "deleteDoc": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.deleteDoc), -/* harmony export */ "deleteField": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.deleteField), -/* harmony export */ "disableNetwork": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.disableNetwork), -/* harmony export */ "doc": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.doc), -/* harmony export */ "documentId": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.documentId), -/* harmony export */ "enableIndexedDbPersistence": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.enableIndexedDbPersistence), -/* harmony export */ "enableMultiTabIndexedDbPersistence": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.enableMultiTabIndexedDbPersistence), -/* harmony export */ "enableNetwork": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.enableNetwork), -/* harmony export */ "endAt": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.endAt), -/* harmony export */ "endBefore": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.endBefore), -/* harmony export */ "ensureFirestoreConfigured": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.ensureFirestoreConfigured), -/* harmony export */ "executeWrite": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.executeWrite), -/* harmony export */ "getDoc": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.getDoc), -/* harmony export */ "getDocFromCache": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.getDocFromCache), -/* harmony export */ "getDocFromServer": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.getDocFromServer), -/* harmony export */ "getDocs": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.getDocs), -/* harmony export */ "getDocsFromCache": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.getDocsFromCache), -/* harmony export */ "getDocsFromServer": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.getDocsFromServer), -/* harmony export */ "getFirestore": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.getFirestore), -/* harmony export */ "increment": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.increment), -/* harmony export */ "initializeFirestore": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.initializeFirestore), -/* harmony export */ "limit": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.limit), -/* harmony export */ "limitToLast": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.limitToLast), -/* harmony export */ "loadBundle": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.loadBundle), -/* harmony export */ "namedQuery": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.namedQuery), -/* harmony export */ "onSnapshot": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.onSnapshot), -/* harmony export */ "onSnapshotsInSync": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.onSnapshotsInSync), -/* harmony export */ "orderBy": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.orderBy), -/* harmony export */ "query": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.query), -/* harmony export */ "queryEqual": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.queryEqual), -/* harmony export */ "refEqual": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.refEqual), -/* harmony export */ "runTransaction": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.runTransaction), -/* harmony export */ "serverTimestamp": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.serverTimestamp), -/* harmony export */ "setDoc": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.setDoc), -/* harmony export */ "setLogLevel": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.setLogLevel), -/* harmony export */ "snapshotEqual": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.snapshotEqual), -/* harmony export */ "startAfter": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.startAfter), -/* harmony export */ "startAt": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.startAt), -/* harmony export */ "terminate": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.terminate), -/* harmony export */ "updateDoc": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.updateDoc), -/* harmony export */ "waitForPendingWrites": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.waitForPendingWrites), -/* harmony export */ "where": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.where), -/* harmony export */ "writeBatch": () => (/* reexport safe */ _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__.writeBatch) -/* harmony export */ }); -/* harmony import */ var _firebase_firestore__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @firebase/firestore */ "./node_modules/@firebase/firestore/dist/index.esm2017.js"); - -//# sourceMappingURL=index.esm.js.map - - -/***/ }), - -/***/ "./node_modules/regenerator-runtime/runtime.js": -/*!*****************************************************!*\ - !*** ./node_modules/regenerator-runtime/runtime.js ***! - \*****************************************************/ -/***/ ((module) => { - -/** - * Copyright (c) 2014-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -var runtime = (function (exports) { - "use strict"; - - var Op = Object.prototype; - var hasOwn = Op.hasOwnProperty; - var undefined; // More compressible than void 0. - var $Symbol = typeof Symbol === "function" ? Symbol : {}; - var iteratorSymbol = $Symbol.iterator || "@@iterator"; - var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator"; - var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; - - function define(obj, key, value) { - Object.defineProperty(obj, key, { - value: value, - enumerable: true, - configurable: true, - writable: true - }); - return obj[key]; - } - try { - // IE 8 has a broken Object.defineProperty that only works on DOM objects. - define({}, ""); - } catch (err) { - define = function(obj, key, value) { - return obj[key] = value; - }; - } - - function wrap(innerFn, outerFn, self, tryLocsList) { - // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator. - var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator; - var generator = Object.create(protoGenerator.prototype); - var context = new Context(tryLocsList || []); - - // The ._invoke method unifies the implementations of the .next, - // .throw, and .return methods. - generator._invoke = makeInvokeMethod(innerFn, self, context); - - return generator; - } - exports.wrap = wrap; - - // Try/catch helper to minimize deoptimizations. Returns a completion - // record like context.tryEntries[i].completion. This interface could - // have been (and was previously) designed to take a closure to be - // invoked without arguments, but in all the cases we care about we - // already have an existing method we want to call, so there's no need - // to create a new function object. We can even get away with assuming - // the method takes exactly one argument, since that happens to be true - // in every case, so we don't have to touch the arguments object. The - // only additional allocation required is the completion record, which - // has a stable shape and so hopefully should be cheap to allocate. - function tryCatch(fn, obj, arg) { - try { - return { type: "normal", arg: fn.call(obj, arg) }; - } catch (err) { - return { type: "throw", arg: err }; - } - } - - var GenStateSuspendedStart = "suspendedStart"; - var GenStateSuspendedYield = "suspendedYield"; - var GenStateExecuting = "executing"; - var GenStateCompleted = "completed"; - - // Returning this object from the innerFn has the same effect as - // breaking out of the dispatch switch statement. - var ContinueSentinel = {}; - - // Dummy constructor functions that we use as the .constructor and - // .constructor.prototype properties for functions that return Generator - // objects. For full spec compliance, you may wish to configure your - // minifier not to mangle the names of these two functions. - function Generator() {} - function GeneratorFunction() {} - function GeneratorFunctionPrototype() {} - - // This is a polyfill for %IteratorPrototype% for environments that - // don't natively support it. - var IteratorPrototype = {}; - define(IteratorPrototype, iteratorSymbol, function () { - return this; - }); - - var getProto = Object.getPrototypeOf; - var NativeIteratorPrototype = getProto && getProto(getProto(values([]))); - if (NativeIteratorPrototype && - NativeIteratorPrototype !== Op && - hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) { - // This environment has a native %IteratorPrototype%; use it instead - // of the polyfill. - IteratorPrototype = NativeIteratorPrototype; - } - - var Gp = GeneratorFunctionPrototype.prototype = - Generator.prototype = Object.create(IteratorPrototype); - GeneratorFunction.prototype = GeneratorFunctionPrototype; - define(Gp, "constructor", GeneratorFunctionPrototype); - define(GeneratorFunctionPrototype, "constructor", GeneratorFunction); - GeneratorFunction.displayName = define( - GeneratorFunctionPrototype, - toStringTagSymbol, - "GeneratorFunction" - ); - - // Helper for defining the .next, .throw, and .return methods of the - // Iterator interface in terms of a single ._invoke method. - function defineIteratorMethods(prototype) { - ["next", "throw", "return"].forEach(function(method) { - define(prototype, method, function(arg) { - return this._invoke(method, arg); - }); - }); - } - - exports.isGeneratorFunction = function(genFun) { - var ctor = typeof genFun === "function" && genFun.constructor; - return ctor - ? ctor === GeneratorFunction || - // For the native GeneratorFunction constructor, the best we can - // do is to check its .name property. - (ctor.displayName || ctor.name) === "GeneratorFunction" - : false; - }; - - exports.mark = function(genFun) { - if (Object.setPrototypeOf) { - Object.setPrototypeOf(genFun, GeneratorFunctionPrototype); - } else { - genFun.__proto__ = GeneratorFunctionPrototype; - define(genFun, toStringTagSymbol, "GeneratorFunction"); - } - genFun.prototype = Object.create(Gp); - return genFun; - }; - - // Within the body of any async function, `await x` is transformed to - // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test - // `hasOwn.call(value, "__await")` to determine if the yielded value is - // meant to be awaited. - exports.awrap = function(arg) { - return { __await: arg }; - }; - - function AsyncIterator(generator, PromiseImpl) { - function invoke(method, arg, resolve, reject) { - var record = tryCatch(generator[method], generator, arg); - if (record.type === "throw") { - reject(record.arg); - } else { - var result = record.arg; - var value = result.value; - if (value && - typeof value === "object" && - hasOwn.call(value, "__await")) { - return PromiseImpl.resolve(value.__await).then(function(value) { - invoke("next", value, resolve, reject); - }, function(err) { - invoke("throw", err, resolve, reject); - }); - } - - return PromiseImpl.resolve(value).then(function(unwrapped) { - // When a yielded Promise is resolved, its final value becomes - // the .value of the Promise<{value,done}> result for the - // current iteration. - result.value = unwrapped; - resolve(result); - }, function(error) { - // If a rejected Promise was yielded, throw the rejection back - // into the async generator function so it can be handled there. - return invoke("throw", error, resolve, reject); - }); - } - } - - var previousPromise; - - function enqueue(method, arg) { - function callInvokeWithMethodAndArg() { - return new PromiseImpl(function(resolve, reject) { - invoke(method, arg, resolve, reject); - }); - } - - return previousPromise = - // If enqueue has been called before, then we want to wait until - // all previous Promises have been resolved before calling invoke, - // so that results are always delivered in the correct order. If - // enqueue has not been called before, then it is important to - // call invoke immediately, without waiting on a callback to fire, - // so that the async generator function has the opportunity to do - // any necessary setup in a predictable way. This predictability - // is why the Promise constructor synchronously invokes its - // executor callback, and why async functions synchronously - // execute code before the first await. Since we implement simple - // async functions in terms of async generators, it is especially - // important to get this right, even though it requires care. - previousPromise ? previousPromise.then( - callInvokeWithMethodAndArg, - // Avoid propagating failures to Promises returned by later - // invocations of the iterator. - callInvokeWithMethodAndArg - ) : callInvokeWithMethodAndArg(); - } - - // Define the unified helper method that is used to implement .next, - // .throw, and .return (see defineIteratorMethods). - this._invoke = enqueue; - } - - defineIteratorMethods(AsyncIterator.prototype); - define(AsyncIterator.prototype, asyncIteratorSymbol, function () { - return this; - }); - exports.AsyncIterator = AsyncIterator; - - // Note that simple async functions are implemented on top of - // AsyncIterator objects; they just return a Promise for the value of - // the final result produced by the iterator. - exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) { - if (PromiseImpl === void 0) PromiseImpl = Promise; - - var iter = new AsyncIterator( - wrap(innerFn, outerFn, self, tryLocsList), - PromiseImpl - ); - - return exports.isGeneratorFunction(outerFn) - ? iter // If outerFn is a generator, return the full iterator. - : iter.next().then(function(result) { - return result.done ? result.value : iter.next(); - }); - }; - - function makeInvokeMethod(innerFn, self, context) { - var state = GenStateSuspendedStart; - - return function invoke(method, arg) { - if (state === GenStateExecuting) { - throw new Error("Generator is already running"); - } - - if (state === GenStateCompleted) { - if (method === "throw") { - throw arg; - } - - // Be forgiving, per 25.3.3.3.3 of the spec: - // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume - return doneResult(); - } - - context.method = method; - context.arg = arg; - - while (true) { - var delegate = context.delegate; - if (delegate) { - var delegateResult = maybeInvokeDelegate(delegate, context); - if (delegateResult) { - if (delegateResult === ContinueSentinel) continue; - return delegateResult; - } - } - - if (context.method === "next") { - // Setting context._sent for legacy support of Babel's - // function.sent implementation. - context.sent = context._sent = context.arg; - - } else if (context.method === "throw") { - if (state === GenStateSuspendedStart) { - state = GenStateCompleted; - throw context.arg; - } - - context.dispatchException(context.arg); - - } else if (context.method === "return") { - context.abrupt("return", context.arg); - } - - state = GenStateExecuting; - - var record = tryCatch(innerFn, self, context); - if (record.type === "normal") { - // If an exception is thrown from innerFn, we leave state === - // GenStateExecuting and loop back for another invocation. - state = context.done - ? GenStateCompleted - : GenStateSuspendedYield; - - if (record.arg === ContinueSentinel) { - continue; - } - - return { - value: record.arg, - done: context.done - }; - - } else if (record.type === "throw") { - state = GenStateCompleted; - // Dispatch the exception by looping back around to the - // context.dispatchException(context.arg) call above. - context.method = "throw"; - context.arg = record.arg; - } - } - }; - } - - // Call delegate.iterator[context.method](context.arg) and handle the - // result, either by returning a { value, done } result from the - // delegate iterator, or by modifying context.method and context.arg, - // setting context.delegate to null, and returning the ContinueSentinel. - function maybeInvokeDelegate(delegate, context) { - var method = delegate.iterator[context.method]; - if (method === undefined) { - // A .throw or .return when the delegate iterator has no .throw - // method always terminates the yield* loop. - context.delegate = null; - - if (context.method === "throw") { - // Note: ["return"] must be used for ES3 parsing compatibility. - if (delegate.iterator["return"]) { - // If the delegate iterator has a return method, give it a - // chance to clean up. - context.method = "return"; - context.arg = undefined; - maybeInvokeDelegate(delegate, context); - - if (context.method === "throw") { - // If maybeInvokeDelegate(context) changed context.method from - // "return" to "throw", let that override the TypeError below. - return ContinueSentinel; - } - } - - context.method = "throw"; - context.arg = new TypeError( - "The iterator does not provide a 'throw' method"); - } - - return ContinueSentinel; - } - - var record = tryCatch(method, delegate.iterator, context.arg); - - if (record.type === "throw") { - context.method = "throw"; - context.arg = record.arg; - context.delegate = null; - return ContinueSentinel; - } - - var info = record.arg; - - if (! info) { - context.method = "throw"; - context.arg = new TypeError("iterator result is not an object"); - context.delegate = null; - return ContinueSentinel; - } - - if (info.done) { - // Assign the result of the finished delegate to the temporary - // variable specified by delegate.resultName (see delegateYield). - context[delegate.resultName] = info.value; - - // Resume execution at the desired location (see delegateYield). - context.next = delegate.nextLoc; - - // If context.method was "throw" but the delegate handled the - // exception, let the outer generator proceed normally. If - // context.method was "next", forget context.arg since it has been - // "consumed" by the delegate iterator. If context.method was - // "return", allow the original .return call to continue in the - // outer generator. - if (context.method !== "return") { - context.method = "next"; - context.arg = undefined; - } - - } else { - // Re-yield the result returned by the delegate method. - return info; - } - - // The delegate iterator is finished, so forget it and continue with - // the outer generator. - context.delegate = null; - return ContinueSentinel; - } - - // Define Generator.prototype.{next,throw,return} in terms of the - // unified ._invoke helper method. - defineIteratorMethods(Gp); - - define(Gp, toStringTagSymbol, "Generator"); - - // A Generator should always return itself as the iterator object when the - // @@iterator function is called on it. Some browsers' implementations of the - // iterator prototype chain incorrectly implement this, causing the Generator - // object to not be returned from this call. This ensures that doesn't happen. - // See https://github.com/facebook/regenerator/issues/274 for more details. - define(Gp, iteratorSymbol, function() { - return this; - }); - - define(Gp, "toString", function() { - return "[object Generator]"; - }); - - function pushTryEntry(locs) { - var entry = { tryLoc: locs[0] }; - - if (1 in locs) { - entry.catchLoc = locs[1]; - } - - if (2 in locs) { - entry.finallyLoc = locs[2]; - entry.afterLoc = locs[3]; - } - - this.tryEntries.push(entry); - } - - function resetTryEntry(entry) { - var record = entry.completion || {}; - record.type = "normal"; - delete record.arg; - entry.completion = record; - } - - function Context(tryLocsList) { - // The root entry object (effectively a try statement without a catch - // or a finally block) gives us a place to store values thrown from - // locations where there is no enclosing try statement. - this.tryEntries = [{ tryLoc: "root" }]; - tryLocsList.forEach(pushTryEntry, this); - this.reset(true); - } - - exports.keys = function(object) { - var keys = []; - for (var key in object) { - keys.push(key); - } - keys.reverse(); - - // Rather than returning an object with a next method, we keep - // things simple and return the next function itself. - return function next() { - while (keys.length) { - var key = keys.pop(); - if (key in object) { - next.value = key; - next.done = false; - return next; - } - } - - // To avoid creating an additional object, we just hang the .value - // and .done properties off the next function object itself. This - // also ensures that the minifier will not anonymize the function. - next.done = true; - return next; - }; - }; - - function values(iterable) { - if (iterable) { - var iteratorMethod = iterable[iteratorSymbol]; - if (iteratorMethod) { - return iteratorMethod.call(iterable); - } - - if (typeof iterable.next === "function") { - return iterable; - } - - if (!isNaN(iterable.length)) { - var i = -1, next = function next() { - while (++i < iterable.length) { - if (hasOwn.call(iterable, i)) { - next.value = iterable[i]; - next.done = false; - return next; - } - } - - next.value = undefined; - next.done = true; - - return next; - }; - - return next.next = next; - } - } - - // Return an iterator with no values. - return { next: doneResult }; - } - exports.values = values; - - function doneResult() { - return { value: undefined, done: true }; - } - - Context.prototype = { - constructor: Context, - - reset: function(skipTempReset) { - this.prev = 0; - this.next = 0; - // Resetting context._sent for legacy support of Babel's - // function.sent implementation. - this.sent = this._sent = undefined; - this.done = false; - this.delegate = null; - - this.method = "next"; - this.arg = undefined; - - this.tryEntries.forEach(resetTryEntry); - - if (!skipTempReset) { - for (var name in this) { - // Not sure about the optimal order of these conditions: - if (name.charAt(0) === "t" && - hasOwn.call(this, name) && - !isNaN(+name.slice(1))) { - this[name] = undefined; - } - } - } - }, - - stop: function() { - this.done = true; - - var rootEntry = this.tryEntries[0]; - var rootRecord = rootEntry.completion; - if (rootRecord.type === "throw") { - throw rootRecord.arg; - } - - return this.rval; - }, - - dispatchException: function(exception) { - if (this.done) { - throw exception; - } - - var context = this; - function handle(loc, caught) { - record.type = "throw"; - record.arg = exception; - context.next = loc; - - if (caught) { - // If the dispatched exception was caught by a catch block, - // then let that catch block handle the exception normally. - context.method = "next"; - context.arg = undefined; - } - - return !! caught; - } - - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - var record = entry.completion; - - if (entry.tryLoc === "root") { - // Exception thrown outside of any try block that could handle - // it, so set the completion value of the entire function to - // throw the exception. - return handle("end"); - } - - if (entry.tryLoc <= this.prev) { - var hasCatch = hasOwn.call(entry, "catchLoc"); - var hasFinally = hasOwn.call(entry, "finallyLoc"); - - if (hasCatch && hasFinally) { - if (this.prev < entry.catchLoc) { - return handle(entry.catchLoc, true); - } else if (this.prev < entry.finallyLoc) { - return handle(entry.finallyLoc); - } - - } else if (hasCatch) { - if (this.prev < entry.catchLoc) { - return handle(entry.catchLoc, true); - } - - } else if (hasFinally) { - if (this.prev < entry.finallyLoc) { - return handle(entry.finallyLoc); - } - - } else { - throw new Error("try statement without catch or finally"); - } - } - } - }, - - abrupt: function(type, arg) { - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - if (entry.tryLoc <= this.prev && - hasOwn.call(entry, "finallyLoc") && - this.prev < entry.finallyLoc) { - var finallyEntry = entry; - break; - } - } - - if (finallyEntry && - (type === "break" || - type === "continue") && - finallyEntry.tryLoc <= arg && - arg <= finallyEntry.finallyLoc) { - // Ignore the finally entry if control is not jumping to a - // location outside the try/catch block. - finallyEntry = null; - } - - var record = finallyEntry ? finallyEntry.completion : {}; - record.type = type; - record.arg = arg; - - if (finallyEntry) { - this.method = "next"; - this.next = finallyEntry.finallyLoc; - return ContinueSentinel; - } - - return this.complete(record); - }, - - complete: function(record, afterLoc) { - if (record.type === "throw") { - throw record.arg; - } - - if (record.type === "break" || - record.type === "continue") { - this.next = record.arg; - } else if (record.type === "return") { - this.rval = this.arg = record.arg; - this.method = "return"; - this.next = "end"; - } else if (record.type === "normal" && afterLoc) { - this.next = afterLoc; - } - - return ContinueSentinel; - }, - - finish: function(finallyLoc) { - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - if (entry.finallyLoc === finallyLoc) { - this.complete(entry.completion, entry.afterLoc); - resetTryEntry(entry); - return ContinueSentinel; - } - } - }, - - "catch": function(tryLoc) { - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - if (entry.tryLoc === tryLoc) { - var record = entry.completion; - if (record.type === "throw") { - var thrown = record.arg; - resetTryEntry(entry); - } - return thrown; - } - } - - // The context.catch method must only be called with a location - // argument that corresponds to a known catch block. - throw new Error("illegal catch attempt"); - }, - - delegateYield: function(iterable, resultName, nextLoc) { - this.delegate = { - iterator: values(iterable), - resultName: resultName, - nextLoc: nextLoc - }; - - if (this.method === "next") { - // Deliberately forget the last sent value so that we don't - // accidentally pass it on to the delegate. - this.arg = undefined; - } - - return ContinueSentinel; - } - }; - - // Regardless of whether this script is executing as a CommonJS module - // or not, return the runtime object so that we can declare the variable - // regeneratorRuntime in the outer scope, which allows this module to be - // injected easily by `bin/regenerator --include-runtime script.js`. - return exports; - -}( - // If this script is executing as a CommonJS module, use module.exports - // as the regeneratorRuntime namespace. Otherwise create a new empty - // object. Either way, the resulting object will be used to initialize - // the regeneratorRuntime variable at the top of this file. - true ? module.exports : 0 -)); - -try { - regeneratorRuntime = runtime; -} catch (accidentalStrictMode) { - // This module should not be running in strict mode, so the above - // assignment should always work unless something is misconfigured. Just - // in case runtime.js accidentally runs in strict mode, in modern engines - // we can explicitly access globalThis. In older engines we can escape - // strict mode using a global Function call. This could conceivably fail - // if a Content Security Policy forbids using Function, but in that case - // the proper solution is to fix the accidental strict mode problem. If - // you've misconfigured your bundler to force strict mode and applied a - // CSP to forbid Function, and you're not willing to fix either of those - // problems, please detail your unique predicament in a GitHub issue. - if (typeof globalThis === "object") { - globalThis.regeneratorRuntime = runtime; - } else { - Function("r", "regeneratorRuntime = r")(runtime); - } -} - - -/***/ }), - -/***/ "./node_modules/jspsych/css/jspsych.css": -/*!**********************************************!*\ - !*** ./node_modules/jspsych/css/jspsych.css ***! - \**********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); -/* harmony import */ var _style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"); -/* harmony import */ var _style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js"); -/* harmony import */ var _style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"); -/* harmony import */ var _style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"); -/* harmony import */ var _style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"); -/* harmony import */ var _style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var _css_loader_dist_cjs_js_jspsych_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../css-loader/dist/cjs.js!./jspsych.css */ "./node_modules/css-loader/dist/cjs.js!./node_modules/jspsych/css/jspsych.css"); - - - - - - - - - - - -var options = {}; - -options.styleTagTransform = (_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); -options.setAttributes = (_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); - - options.insert = _style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); - -options.domAPI = (_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); -options.insertStyleElement = (_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); - -var update = _style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_css_loader_dist_cjs_js_jspsych_css__WEBPACK_IMPORTED_MODULE_6__["default"], options); - - - - - /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_css_loader_dist_cjs_js_jspsych_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _css_loader_dist_cjs_js_jspsych_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _css_loader_dist_cjs_js_jspsych_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); - - -/***/ }), - -/***/ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js": -/*!****************************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js ***! - \****************************************************************************/ -/***/ ((module) => { - -"use strict"; - - -var stylesInDOM = []; - -function getIndexByIdentifier(identifier) { - var result = -1; - - for (var i = 0; i < stylesInDOM.length; i++) { - if (stylesInDOM[i].identifier === identifier) { - result = i; - break; - } - } - - return result; -} - -function modulesToDom(list, options) { - var idCountMap = {}; - var identifiers = []; - - for (var i = 0; i < list.length; i++) { - var item = list[i]; - var id = options.base ? item[0] + options.base : item[0]; - var count = idCountMap[id] || 0; - var identifier = "".concat(id, " ").concat(count); - idCountMap[id] = count + 1; - var indexByIdentifier = getIndexByIdentifier(identifier); - var obj = { - css: item[1], - media: item[2], - sourceMap: item[3], - supports: item[4], - layer: item[5] - }; - - if (indexByIdentifier !== -1) { - stylesInDOM[indexByIdentifier].references++; - stylesInDOM[indexByIdentifier].updater(obj); - } else { - var updater = addElementStyle(obj, options); - options.byIndex = i; - stylesInDOM.splice(i, 0, { - identifier: identifier, - updater: updater, - references: 1 - }); - } - - identifiers.push(identifier); - } - - return identifiers; -} - -function addElementStyle(obj, options) { - var api = options.domAPI(options); - api.update(obj); - - var updater = function updater(newObj) { - if (newObj) { - if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) { - return; - } - - api.update(obj = newObj); - } else { - api.remove(); - } - }; - - return updater; -} - -module.exports = function (list, options) { - options = options || {}; - list = list || []; - var lastIdentifiers = modulesToDom(list, options); - return function update(newList) { - newList = newList || []; - - for (var i = 0; i < lastIdentifiers.length; i++) { - var identifier = lastIdentifiers[i]; - var index = getIndexByIdentifier(identifier); - stylesInDOM[index].references--; - } - - var newLastIdentifiers = modulesToDom(newList, options); - - for (var _i = 0; _i < lastIdentifiers.length; _i++) { - var _identifier = lastIdentifiers[_i]; - - var _index = getIndexByIdentifier(_identifier); - - if (stylesInDOM[_index].references === 0) { - stylesInDOM[_index].updater(); - - stylesInDOM.splice(_index, 1); - } - } - - lastIdentifiers = newLastIdentifiers; - }; -}; - -/***/ }), - -/***/ "./node_modules/style-loader/dist/runtime/insertBySelector.js": -/*!********************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/insertBySelector.js ***! - \********************************************************************/ -/***/ ((module) => { - -"use strict"; - - -var memo = {}; -/* istanbul ignore next */ - -function getTarget(target) { - if (typeof memo[target] === "undefined") { - var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself - - if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) { - try { - // This will throw an exception if access to iframe is blocked - // due to cross-origin restrictions - styleTarget = styleTarget.contentDocument.head; - } catch (e) { - // istanbul ignore next - styleTarget = null; - } - } - - memo[target] = styleTarget; - } - - return memo[target]; -} -/* istanbul ignore next */ - - -function insertBySelector(insert, style) { - var target = getTarget(insert); - - if (!target) { - throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid."); - } - - target.appendChild(style); -} - -module.exports = insertBySelector; - -/***/ }), - -/***/ "./node_modules/style-loader/dist/runtime/insertStyleElement.js": -/*!**********************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/insertStyleElement.js ***! - \**********************************************************************/ -/***/ ((module) => { - -"use strict"; - - -/* istanbul ignore next */ -function insertStyleElement(options) { - var element = document.createElement("style"); - options.setAttributes(element, options.attributes); - options.insert(element, options.options); - return element; -} - -module.exports = insertStyleElement; - -/***/ }), - -/***/ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js": -/*!**********************************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js ***! - \**********************************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -/* istanbul ignore next */ -function setAttributesWithoutAttributes(styleElement) { - var nonce = true ? __webpack_require__.nc : 0; - - if (nonce) { - styleElement.setAttribute("nonce", nonce); - } -} - -module.exports = setAttributesWithoutAttributes; - -/***/ }), - -/***/ "./node_modules/style-loader/dist/runtime/styleDomAPI.js": -/*!***************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/styleDomAPI.js ***! - \***************************************************************/ -/***/ ((module) => { - -"use strict"; - - -/* istanbul ignore next */ -function apply(styleElement, options, obj) { - var css = ""; - - if (obj.supports) { - css += "@supports (".concat(obj.supports, ") {"); - } - - if (obj.media) { - css += "@media ".concat(obj.media, " {"); - } - - var needLayer = typeof obj.layer !== "undefined"; - - if (needLayer) { - css += "@layer".concat(obj.layer.length > 0 ? " ".concat(obj.layer) : "", " {"); - } - - css += obj.css; - - if (needLayer) { - css += "}"; - } - - if (obj.media) { - css += "}"; - } - - if (obj.supports) { - css += "}"; - } - - var sourceMap = obj.sourceMap; - - if (sourceMap && typeof btoa !== "undefined") { - css += "\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), " */"); - } // For old IE - - /* istanbul ignore if */ - - - options.styleTagTransform(css, styleElement, options.options); -} - -function removeStyleElement(styleElement) { - // istanbul ignore if - if (styleElement.parentNode === null) { - return false; - } - - styleElement.parentNode.removeChild(styleElement); -} -/* istanbul ignore next */ - - -function domAPI(options) { - var styleElement = options.insertStyleElement(options); - return { - update: function update(obj) { - apply(styleElement, options, obj); - }, - remove: function remove() { - removeStyleElement(styleElement); - } - }; -} - -module.exports = domAPI; - -/***/ }), - -/***/ "./node_modules/style-loader/dist/runtime/styleTagTransform.js": -/*!*********************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/styleTagTransform.js ***! - \*********************************************************************/ -/***/ ((module) => { - -"use strict"; - - -/* istanbul ignore next */ -function styleTagTransform(css, styleElement) { - if (styleElement.styleSheet) { - styleElement.styleSheet.cssText = css; - } else { - while (styleElement.firstChild) { - styleElement.removeChild(styleElement.firstChild); - } - - styleElement.appendChild(document.createTextNode(css)); - } -} - -module.exports = styleTagTransform; - -/***/ }), - -/***/ "./node_modules/tslib/tslib.es6.js": -/*!*****************************************!*\ - !*** ./node_modules/tslib/tslib.es6.js ***! - \*****************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "__assign": () => (/* binding */ __assign), -/* harmony export */ "__asyncDelegator": () => (/* binding */ __asyncDelegator), -/* harmony export */ "__asyncGenerator": () => (/* binding */ __asyncGenerator), -/* harmony export */ "__asyncValues": () => (/* binding */ __asyncValues), -/* harmony export */ "__await": () => (/* binding */ __await), -/* harmony export */ "__awaiter": () => (/* binding */ __awaiter), -/* harmony export */ "__classPrivateFieldGet": () => (/* binding */ __classPrivateFieldGet), -/* harmony export */ "__classPrivateFieldSet": () => (/* binding */ __classPrivateFieldSet), -/* harmony export */ "__createBinding": () => (/* binding */ __createBinding), -/* harmony export */ "__decorate": () => (/* binding */ __decorate), -/* harmony export */ "__exportStar": () => (/* binding */ __exportStar), -/* harmony export */ "__extends": () => (/* binding */ __extends), -/* harmony export */ "__generator": () => (/* binding */ __generator), -/* harmony export */ "__importDefault": () => (/* binding */ __importDefault), -/* harmony export */ "__importStar": () => (/* binding */ __importStar), -/* harmony export */ "__makeTemplateObject": () => (/* binding */ __makeTemplateObject), -/* harmony export */ "__metadata": () => (/* binding */ __metadata), -/* harmony export */ "__param": () => (/* binding */ __param), -/* harmony export */ "__read": () => (/* binding */ __read), -/* harmony export */ "__rest": () => (/* binding */ __rest), -/* harmony export */ "__spread": () => (/* binding */ __spread), -/* harmony export */ "__spreadArray": () => (/* binding */ __spreadArray), -/* harmony export */ "__spreadArrays": () => (/* binding */ __spreadArrays), -/* harmony export */ "__values": () => (/* binding */ __values) -/* harmony export */ }); -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ -/* global Reflect, Promise */ - -var extendStatics = function(d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); -}; - -function __extends(d, b) { - if (typeof b !== "function" && b !== null) - throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -} - -var __assign = function() { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; - } - return t; - } - return __assign.apply(this, arguments); -} - -function __rest(s, e) { - var t = {}; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) - t[p] = s[p]; - if (s != null && typeof Object.getOwnPropertySymbols === "function") - for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { - if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) - t[p[i]] = s[p[i]]; - } - return t; -} - -function __decorate(decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -} - -function __param(paramIndex, decorator) { - return function (target, key) { decorator(target, key, paramIndex); } -} - -function __metadata(metadataKey, metadataValue) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue); -} - -function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} - -function __generator(thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -} - -var __createBinding = Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -}); - -function __exportStar(m, o) { - for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p); -} - -function __values(o) { - var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; - if (m) return m.call(o); - if (o && typeof o.length === "number") return { - next: function () { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - } - }; - throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); -} - -function __read(o, n) { - var m = typeof Symbol === "function" && o[Symbol.iterator]; - if (!m) return o; - var i = m.call(o), r, ar = [], e; - try { - while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); - } - catch (error) { e = { error: error }; } - finally { - try { - if (r && !r.done && (m = i["return"])) m.call(i); - } - finally { if (e) throw e.error; } - } - return ar; -} - -/** @deprecated */ -function __spread() { - for (var ar = [], i = 0; i < arguments.length; i++) - ar = ar.concat(__read(arguments[i])); - return ar; -} - -/** @deprecated */ -function __spreadArrays() { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; - for (var r = Array(s), k = 0, i = 0; i < il; i++) - for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) - r[k] = a[j]; - return r; -} - -function __spreadArray(to, from, pack) { - if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { - if (ar || !(i in from)) { - if (!ar) ar = Array.prototype.slice.call(from, 0, i); - ar[i] = from[i]; - } - } - return to.concat(ar || Array.prototype.slice.call(from)); -} - -function __await(v) { - return this instanceof __await ? (this.v = v, this) : new __await(v); -} - -function __asyncGenerator(thisArg, _arguments, generator) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var g = generator.apply(thisArg, _arguments || []), i, q = []; - return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; - function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } - function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } - function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } - function fulfill(value) { resume("next", value); } - function reject(value) { resume("throw", value); } - function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } -} - -function __asyncDelegator(o) { - var i, p; - return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i; - function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; } -} - -function __asyncValues(o) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var m = o[Symbol.asyncIterator], i; - return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); - function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } - function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } -} - -function __makeTemplateObject(cooked, raw) { - if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } - return cooked; -}; - -var __setModuleDefault = Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}; - -function __importStar(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -} - -function __importDefault(mod) { - return (mod && mod.__esModule) ? mod : { default: mod }; -} - -function __classPrivateFieldGet(receiver, state, kind, f) { - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); - return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); -} - -function __classPrivateFieldSet(receiver, state, value, kind, f) { - if (kind === "m") throw new TypeError("Private method is not writable"); - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; -} - - -/***/ }), - -/***/ "./node_modules/uuid/dist/esm-browser/index.js": -/*!*****************************************************!*\ - !*** ./node_modules/uuid/dist/esm-browser/index.js ***! - \*****************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "NIL": () => (/* reexport safe */ _nil_js__WEBPACK_IMPORTED_MODULE_4__["default"]), -/* harmony export */ "parse": () => (/* reexport safe */ _parse_js__WEBPACK_IMPORTED_MODULE_8__["default"]), -/* harmony export */ "stringify": () => (/* reexport safe */ _stringify_js__WEBPACK_IMPORTED_MODULE_7__["default"]), -/* harmony export */ "v1": () => (/* reexport safe */ _v1_js__WEBPACK_IMPORTED_MODULE_0__["default"]), -/* harmony export */ "v3": () => (/* reexport safe */ _v3_js__WEBPACK_IMPORTED_MODULE_1__["default"]), -/* harmony export */ "v4": () => (/* reexport safe */ _v4_js__WEBPACK_IMPORTED_MODULE_2__["default"]), -/* harmony export */ "v5": () => (/* reexport safe */ _v5_js__WEBPACK_IMPORTED_MODULE_3__["default"]), -/* harmony export */ "validate": () => (/* reexport safe */ _validate_js__WEBPACK_IMPORTED_MODULE_6__["default"]), -/* harmony export */ "version": () => (/* reexport safe */ _version_js__WEBPACK_IMPORTED_MODULE_5__["default"]) -/* harmony export */ }); -/* harmony import */ var _v1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v1.js */ "./node_modules/uuid/dist/esm-browser/v1.js"); -/* harmony import */ var _v3_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v3.js */ "./node_modules/uuid/dist/esm-browser/v3.js"); -/* harmony import */ var _v4_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v4.js */ "./node_modules/uuid/dist/esm-browser/v4.js"); -/* harmony import */ var _v5_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./v5.js */ "./node_modules/uuid/dist/esm-browser/v5.js"); -/* harmony import */ var _nil_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./nil.js */ "./node_modules/uuid/dist/esm-browser/nil.js"); -/* harmony import */ var _version_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./version.js */ "./node_modules/uuid/dist/esm-browser/version.js"); -/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./validate.js */ "./node_modules/uuid/dist/esm-browser/validate.js"); -/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./stringify.js */ "./node_modules/uuid/dist/esm-browser/stringify.js"); -/* harmony import */ var _parse_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./parse.js */ "./node_modules/uuid/dist/esm-browser/parse.js"); - - - - - - - - - - -/***/ }), - -/***/ "./node_modules/uuid/dist/esm-browser/md5.js": -/*!***************************************************!*\ - !*** ./node_modules/uuid/dist/esm-browser/md5.js ***! - \***************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* - * Browser-compatible JavaScript MD5 - * - * Modification of JavaScript MD5 - * https://github.com/blueimp/JavaScript-MD5 - * - * Copyright 2011, Sebastian Tschan - * https://blueimp.net - * - * Licensed under the MIT license: - * https://opensource.org/licenses/MIT - * - * Based on - * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message - * Digest Algorithm, as defined in RFC 1321. - * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009 - * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet - * Distributed under the BSD License - * See http://pajhome.org.uk/crypt/md5 for more info. - */ -function md5(bytes) { - if (typeof bytes === 'string') { - var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape - - bytes = new Uint8Array(msg.length); - - for (var i = 0; i < msg.length; ++i) { - bytes[i] = msg.charCodeAt(i); - } - } - - return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8)); -} -/* - * Convert an array of little-endian words to an array of bytes - */ - - -function md5ToHexEncodedArray(input) { - var output = []; - var length32 = input.length * 32; - var hexTab = '0123456789abcdef'; - - for (var i = 0; i < length32; i += 8) { - var x = input[i >> 5] >>> i % 32 & 0xff; - var hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16); - output.push(hex); - } - - return output; -} -/** - * Calculate output length with padding and bit length - */ - - -function getOutputLength(inputLength8) { - return (inputLength8 + 64 >>> 9 << 4) + 14 + 1; -} -/* - * Calculate the MD5 of an array of little-endian words, and a bit length. - */ - - -function wordsToMd5(x, len) { - /* append padding */ - x[len >> 5] |= 0x80 << len % 32; - x[getOutputLength(len) - 1] = len; - var a = 1732584193; - var b = -271733879; - var c = -1732584194; - var d = 271733878; - - for (var i = 0; i < x.length; i += 16) { - var olda = a; - var oldb = b; - var oldc = c; - var oldd = d; - a = md5ff(a, b, c, d, x[i], 7, -680876936); - d = md5ff(d, a, b, c, x[i + 1], 12, -389564586); - c = md5ff(c, d, a, b, x[i + 2], 17, 606105819); - b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330); - a = md5ff(a, b, c, d, x[i + 4], 7, -176418897); - d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426); - c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341); - b = md5ff(b, c, d, a, x[i + 7], 22, -45705983); - a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416); - d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417); - c = md5ff(c, d, a, b, x[i + 10], 17, -42063); - b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162); - a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682); - d = md5ff(d, a, b, c, x[i + 13], 12, -40341101); - c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290); - b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329); - a = md5gg(a, b, c, d, x[i + 1], 5, -165796510); - d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632); - c = md5gg(c, d, a, b, x[i + 11], 14, 643717713); - b = md5gg(b, c, d, a, x[i], 20, -373897302); - a = md5gg(a, b, c, d, x[i + 5], 5, -701558691); - d = md5gg(d, a, b, c, x[i + 10], 9, 38016083); - c = md5gg(c, d, a, b, x[i + 15], 14, -660478335); - b = md5gg(b, c, d, a, x[i + 4], 20, -405537848); - a = md5gg(a, b, c, d, x[i + 9], 5, 568446438); - d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690); - c = md5gg(c, d, a, b, x[i + 3], 14, -187363961); - b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501); - a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467); - d = md5gg(d, a, b, c, x[i + 2], 9, -51403784); - c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473); - b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734); - a = md5hh(a, b, c, d, x[i + 5], 4, -378558); - d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463); - c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562); - b = md5hh(b, c, d, a, x[i + 14], 23, -35309556); - a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060); - d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353); - c = md5hh(c, d, a, b, x[i + 7], 16, -155497632); - b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640); - a = md5hh(a, b, c, d, x[i + 13], 4, 681279174); - d = md5hh(d, a, b, c, x[i], 11, -358537222); - c = md5hh(c, d, a, b, x[i + 3], 16, -722521979); - b = md5hh(b, c, d, a, x[i + 6], 23, 76029189); - a = md5hh(a, b, c, d, x[i + 9], 4, -640364487); - d = md5hh(d, a, b, c, x[i + 12], 11, -421815835); - c = md5hh(c, d, a, b, x[i + 15], 16, 530742520); - b = md5hh(b, c, d, a, x[i + 2], 23, -995338651); - a = md5ii(a, b, c, d, x[i], 6, -198630844); - d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415); - c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905); - b = md5ii(b, c, d, a, x[i + 5], 21, -57434055); - a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571); - d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606); - c = md5ii(c, d, a, b, x[i + 10], 15, -1051523); - b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799); - a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359); - d = md5ii(d, a, b, c, x[i + 15], 10, -30611744); - c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380); - b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649); - a = md5ii(a, b, c, d, x[i + 4], 6, -145523070); - d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379); - c = md5ii(c, d, a, b, x[i + 2], 15, 718787259); - b = md5ii(b, c, d, a, x[i + 9], 21, -343485551); - a = safeAdd(a, olda); - b = safeAdd(b, oldb); - c = safeAdd(c, oldc); - d = safeAdd(d, oldd); - } - - return [a, b, c, d]; -} -/* - * Convert an array bytes to an array of little-endian words - * Characters >255 have their high-byte silently ignored. - */ - - -function bytesToWords(input) { - if (input.length === 0) { - return []; - } - - var length8 = input.length * 8; - var output = new Uint32Array(getOutputLength(length8)); - - for (var i = 0; i < length8; i += 8) { - output[i >> 5] |= (input[i / 8] & 0xff) << i % 32; - } - - return output; -} -/* - * Add integers, wrapping at 2^32. This uses 16-bit operations internally - * to work around bugs in some JS interpreters. - */ - - -function safeAdd(x, y) { - var lsw = (x & 0xffff) + (y & 0xffff); - var msw = (x >> 16) + (y >> 16) + (lsw >> 16); - return msw << 16 | lsw & 0xffff; -} -/* - * Bitwise rotate a 32-bit number to the left. - */ - - -function bitRotateLeft(num, cnt) { - return num << cnt | num >>> 32 - cnt; -} -/* - * These functions implement the four basic operations the algorithm uses. - */ - - -function md5cmn(q, a, b, x, s, t) { - return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b); -} - -function md5ff(a, b, c, d, x, s, t) { - return md5cmn(b & c | ~b & d, a, b, x, s, t); -} - -function md5gg(a, b, c, d, x, s, t) { - return md5cmn(b & d | c & ~d, a, b, x, s, t); -} - -function md5hh(a, b, c, d, x, s, t) { - return md5cmn(b ^ c ^ d, a, b, x, s, t); -} - -function md5ii(a, b, c, d, x, s, t) { - return md5cmn(c ^ (b | ~d), a, b, x, s, t); -} - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (md5); - -/***/ }), - -/***/ "./node_modules/uuid/dist/esm-browser/nil.js": -/*!***************************************************!*\ - !*** ./node_modules/uuid/dist/esm-browser/nil.js ***! - \***************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ('00000000-0000-0000-0000-000000000000'); - -/***/ }), - -/***/ "./node_modules/uuid/dist/esm-browser/parse.js": -/*!*****************************************************!*\ - !*** ./node_modules/uuid/dist/esm-browser/parse.js ***! - \*****************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validate.js */ "./node_modules/uuid/dist/esm-browser/validate.js"); - - -function parse(uuid) { - if (!(0,_validate_js__WEBPACK_IMPORTED_MODULE_0__["default"])(uuid)) { - throw TypeError('Invalid UUID'); - } - - var v; - var arr = new Uint8Array(16); // Parse ########-....-....-....-............ - - arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24; - arr[1] = v >>> 16 & 0xff; - arr[2] = v >>> 8 & 0xff; - arr[3] = v & 0xff; // Parse ........-####-....-....-............ - - arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8; - arr[5] = v & 0xff; // Parse ........-....-####-....-............ - - arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8; - arr[7] = v & 0xff; // Parse ........-....-....-####-............ - - arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8; - arr[9] = v & 0xff; // Parse ........-....-....-....-############ - // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes) - - arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff; - arr[11] = v / 0x100000000 & 0xff; - arr[12] = v >>> 24 & 0xff; - arr[13] = v >>> 16 & 0xff; - arr[14] = v >>> 8 & 0xff; - arr[15] = v & 0xff; - return arr; -} - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (parse); - -/***/ }), - -/***/ "./node_modules/uuid/dist/esm-browser/regex.js": -/*!*****************************************************!*\ - !*** ./node_modules/uuid/dist/esm-browser/regex.js ***! - \*****************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i); - -/***/ }), - -/***/ "./node_modules/uuid/dist/esm-browser/rng.js": -/*!***************************************************!*\ - !*** ./node_modules/uuid/dist/esm-browser/rng.js ***! - \***************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ rng) -/* harmony export */ }); -// Unique ID creation requires a high quality random # generator. In the browser we therefore -// require the crypto API and do not support built-in fallback to lower quality random number -// generators (like Math.random()). -var getRandomValues; -var rnds8 = new Uint8Array(16); -function rng() { - // lazy load so that environments that need to polyfill have a chance to do so - if (!getRandomValues) { - // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. Also, - // find the complete implementation of crypto (msCrypto) on IE11. - getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto); - - if (!getRandomValues) { - throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported'); - } - } - - return getRandomValues(rnds8); -} - -/***/ }), - -/***/ "./node_modules/uuid/dist/esm-browser/sha1.js": -/*!****************************************************!*\ - !*** ./node_modules/uuid/dist/esm-browser/sha1.js ***! - \****************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -// Adapted from Chris Veness' SHA1 code at -// http://www.movable-type.co.uk/scripts/sha1.html -function f(s, x, y, z) { - switch (s) { - case 0: - return x & y ^ ~x & z; - - case 1: - return x ^ y ^ z; - - case 2: - return x & y ^ x & z ^ y & z; - - case 3: - return x ^ y ^ z; - } -} - -function ROTL(x, n) { - return x << n | x >>> 32 - n; -} - -function sha1(bytes) { - var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6]; - var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0]; - - if (typeof bytes === 'string') { - var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape - - bytes = []; - - for (var i = 0; i < msg.length; ++i) { - bytes.push(msg.charCodeAt(i)); - } - } else if (!Array.isArray(bytes)) { - // Convert Array-like to Array - bytes = Array.prototype.slice.call(bytes); - } - - bytes.push(0x80); - var l = bytes.length / 4 + 2; - var N = Math.ceil(l / 16); - var M = new Array(N); - - for (var _i = 0; _i < N; ++_i) { - var arr = new Uint32Array(16); - - for (var j = 0; j < 16; ++j) { - arr[j] = bytes[_i * 64 + j * 4] << 24 | bytes[_i * 64 + j * 4 + 1] << 16 | bytes[_i * 64 + j * 4 + 2] << 8 | bytes[_i * 64 + j * 4 + 3]; - } - - M[_i] = arr; - } - - M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32); - M[N - 1][14] = Math.floor(M[N - 1][14]); - M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff; - - for (var _i2 = 0; _i2 < N; ++_i2) { - var W = new Uint32Array(80); - - for (var t = 0; t < 16; ++t) { - W[t] = M[_i2][t]; - } - - for (var _t = 16; _t < 80; ++_t) { - W[_t] = ROTL(W[_t - 3] ^ W[_t - 8] ^ W[_t - 14] ^ W[_t - 16], 1); - } - - var a = H[0]; - var b = H[1]; - var c = H[2]; - var d = H[3]; - var e = H[4]; - - for (var _t2 = 0; _t2 < 80; ++_t2) { - var s = Math.floor(_t2 / 20); - var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[_t2] >>> 0; - e = d; - d = c; - c = ROTL(b, 30) >>> 0; - b = a; - a = T; - } - - H[0] = H[0] + a >>> 0; - H[1] = H[1] + b >>> 0; - H[2] = H[2] + c >>> 0; - H[3] = H[3] + d >>> 0; - H[4] = H[4] + e >>> 0; - } - - return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff]; -} - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (sha1); - -/***/ }), - -/***/ "./node_modules/uuid/dist/esm-browser/stringify.js": -/*!*********************************************************!*\ - !*** ./node_modules/uuid/dist/esm-browser/stringify.js ***! - \*********************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validate.js */ "./node_modules/uuid/dist/esm-browser/validate.js"); - -/** - * Convert array of 16 byte values to UUID string format of the form: - * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX - */ - -var byteToHex = []; - -for (var i = 0; i < 256; ++i) { - byteToHex.push((i + 0x100).toString(16).substr(1)); -} - -function stringify(arr) { - var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; - // Note: Be careful editing this code! It's been tuned for performance - // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434 - var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one - // of the following: - // - One or more input array values don't map to a hex octet (leading to - // "undefined" in the uuid) - // - Invalid input values for the RFC `version` or `variant` fields - - if (!(0,_validate_js__WEBPACK_IMPORTED_MODULE_0__["default"])(uuid)) { - throw TypeError('Stringified UUID is invalid'); - } - - return uuid; -} - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (stringify); - -/***/ }), - -/***/ "./node_modules/uuid/dist/esm-browser/v1.js": -/*!**************************************************!*\ - !*** ./node_modules/uuid/dist/esm-browser/v1.js ***! - \**************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _rng_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./rng.js */ "./node_modules/uuid/dist/esm-browser/rng.js"); -/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stringify.js */ "./node_modules/uuid/dist/esm-browser/stringify.js"); - - // **`v1()` - Generate time-based UUID** -// -// Inspired by https://github.com/LiosK/UUID.js -// and http://docs.python.org/library/uuid.html - -var _nodeId; - -var _clockseq; // Previous uuid creation time - - -var _lastMSecs = 0; -var _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details - -function v1(options, buf, offset) { - var i = buf && offset || 0; - var b = buf || new Array(16); - options = options || {}; - var node = options.node || _nodeId; - var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not - // specified. We do this lazily to minimize issues related to insufficient - // system entropy. See #189 - - if (node == null || clockseq == null) { - var seedBytes = options.random || (options.rng || _rng_js__WEBPACK_IMPORTED_MODULE_0__["default"])(); - - if (node == null) { - // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1) - node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]]; - } - - if (clockseq == null) { - // Per 4.2.2, randomize (14 bit) clockseq - clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff; - } - } // UUID timestamps are 100 nano-second units since the Gregorian epoch, - // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so - // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs' - // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00. - - - var msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock - // cycle to simulate higher resolution clock - - var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs) - - var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression - - if (dt < 0 && options.clockseq === undefined) { - clockseq = clockseq + 1 & 0x3fff; - } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new - // time interval - - - if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) { - nsecs = 0; - } // Per 4.2.1.2 Throw error if too many uuids are requested - - - if (nsecs >= 10000) { - throw new Error("uuid.v1(): Can't create more than 10M uuids/sec"); - } - - _lastMSecs = msecs; - _lastNSecs = nsecs; - _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch - - msecs += 12219292800000; // `time_low` - - var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; - b[i++] = tl >>> 24 & 0xff; - b[i++] = tl >>> 16 & 0xff; - b[i++] = tl >>> 8 & 0xff; - b[i++] = tl & 0xff; // `time_mid` - - var tmh = msecs / 0x100000000 * 10000 & 0xfffffff; - b[i++] = tmh >>> 8 & 0xff; - b[i++] = tmh & 0xff; // `time_high_and_version` - - b[i++] = tmh >>> 24 & 0xf | 0x10; // include version - - b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant) - - b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low` - - b[i++] = clockseq & 0xff; // `node` - - for (var n = 0; n < 6; ++n) { - b[i + n] = node[n]; - } - - return buf || (0,_stringify_js__WEBPACK_IMPORTED_MODULE_1__["default"])(b); -} - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v1); - -/***/ }), - -/***/ "./node_modules/uuid/dist/esm-browser/v3.js": -/*!**************************************************!*\ - !*** ./node_modules/uuid/dist/esm-browser/v3.js ***! - \**************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _v35_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v35.js */ "./node_modules/uuid/dist/esm-browser/v35.js"); -/* harmony import */ var _md5_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./md5.js */ "./node_modules/uuid/dist/esm-browser/md5.js"); - - -var v3 = (0,_v35_js__WEBPACK_IMPORTED_MODULE_0__["default"])('v3', 0x30, _md5_js__WEBPACK_IMPORTED_MODULE_1__["default"]); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v3); - -/***/ }), - -/***/ "./node_modules/uuid/dist/esm-browser/v35.js": -/*!***************************************************!*\ - !*** ./node_modules/uuid/dist/esm-browser/v35.js ***! - \***************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "DNS": () => (/* binding */ DNS), -/* harmony export */ "URL": () => (/* binding */ URL), -/* harmony export */ "default": () => (/* export default binding */ __WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stringify.js */ "./node_modules/uuid/dist/esm-browser/stringify.js"); -/* harmony import */ var _parse_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./parse.js */ "./node_modules/uuid/dist/esm-browser/parse.js"); - - - -function stringToBytes(str) { - str = unescape(encodeURIComponent(str)); // UTF8 escape - - var bytes = []; - - for (var i = 0; i < str.length; ++i) { - bytes.push(str.charCodeAt(i)); - } - - return bytes; -} - -var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; -var URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'; -/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(name, version, hashfunc) { - function generateUUID(value, namespace, buf, offset) { - if (typeof value === 'string') { - value = stringToBytes(value); - } - - if (typeof namespace === 'string') { - namespace = (0,_parse_js__WEBPACK_IMPORTED_MODULE_0__["default"])(namespace); - } - - if (namespace.length !== 16) { - throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)'); - } // Compute hash of namespace and value, Per 4.3 - // Future: Use spread syntax when supported on all platforms, e.g. `bytes = - // hashfunc([...namespace, ... value])` - - - var bytes = new Uint8Array(16 + value.length); - bytes.set(namespace); - bytes.set(value, namespace.length); - bytes = hashfunc(bytes); - bytes[6] = bytes[6] & 0x0f | version; - bytes[8] = bytes[8] & 0x3f | 0x80; - - if (buf) { - offset = offset || 0; - - for (var i = 0; i < 16; ++i) { - buf[offset + i] = bytes[i]; - } - - return buf; - } - - return (0,_stringify_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bytes); - } // Function#name is not settable on some platforms (#270) - - - try { - generateUUID.name = name; // eslint-disable-next-line no-empty - } catch (err) {} // For CommonJS default export support - - - generateUUID.DNS = DNS; - generateUUID.URL = URL; - return generateUUID; -} - -/***/ }), - -/***/ "./node_modules/uuid/dist/esm-browser/v4.js": -/*!**************************************************!*\ - !*** ./node_modules/uuid/dist/esm-browser/v4.js ***! - \**************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _rng_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./rng.js */ "./node_modules/uuid/dist/esm-browser/rng.js"); -/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stringify.js */ "./node_modules/uuid/dist/esm-browser/stringify.js"); - - - -function v4(options, buf, offset) { - options = options || {}; - var rnds = options.random || (options.rng || _rng_js__WEBPACK_IMPORTED_MODULE_0__["default"])(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` - - rnds[6] = rnds[6] & 0x0f | 0x40; - rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided - - if (buf) { - offset = offset || 0; - - for (var i = 0; i < 16; ++i) { - buf[offset + i] = rnds[i]; - } - - return buf; - } - - return (0,_stringify_js__WEBPACK_IMPORTED_MODULE_1__["default"])(rnds); -} - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v4); - -/***/ }), - -/***/ "./node_modules/uuid/dist/esm-browser/v5.js": -/*!**************************************************!*\ - !*** ./node_modules/uuid/dist/esm-browser/v5.js ***! - \**************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _v35_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v35.js */ "./node_modules/uuid/dist/esm-browser/v35.js"); -/* harmony import */ var _sha1_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sha1.js */ "./node_modules/uuid/dist/esm-browser/sha1.js"); - - -var v5 = (0,_v35_js__WEBPACK_IMPORTED_MODULE_0__["default"])('v5', 0x50, _sha1_js__WEBPACK_IMPORTED_MODULE_1__["default"]); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v5); - -/***/ }), - -/***/ "./node_modules/uuid/dist/esm-browser/validate.js": -/*!********************************************************!*\ - !*** ./node_modules/uuid/dist/esm-browser/validate.js ***! - \********************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _regex_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./regex.js */ "./node_modules/uuid/dist/esm-browser/regex.js"); - - -function validate(uuid) { - return typeof uuid === 'string' && _regex_js__WEBPACK_IMPORTED_MODULE_0__["default"].test(uuid); -} - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (validate); - -/***/ }), - -/***/ "./node_modules/uuid/dist/esm-browser/version.js": -/*!*******************************************************!*\ - !*** ./node_modules/uuid/dist/esm-browser/version.js ***! - \*******************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validate.js */ "./node_modules/uuid/dist/esm-browser/validate.js"); - - -function version(uuid) { - if (!(0,_validate_js__WEBPACK_IMPORTED_MODULE_0__["default"])(uuid)) { - throw TypeError('Invalid UUID'); - } - - return parseInt(uuid.substr(14, 1), 16); -} - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (version); - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,d09GMgABAAAAAA5cABIAAAAAGsgAAA34AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGjIbgS4cPAZgP1NUQVRaADwIgXwJnxQREAqCLIInCwoAATYCJAMQBCAFhGAHIAyFHxuBGSMDtUSuZiT4ywLbeQ0WfHCD27obF1rP7nLrqdcpHMSlEvtmhDQRzF4R4UdQ+pEkNRJD52SEEZLMwvOEW/b+ZDIROKDmnCjV7PZEUxfuNhVXKkbFjT03A1G8VCZCA6B/4IWAzgkt8j56lSQDlA3OKdkhZEsHzOd2jGmHpH6hb+SVvtT19af2/ON0TuoqfVYJzLgxF6EnrcHQAcDi96aapFulvT1IGbxJh7RntyKqpqjFAbgpgCjJ2cMt9bx+k9vlI5XOreaHFuehzvfXk500LtGOOIy0dVm7LNHZSnxSnKfooVwmu2wXEKYuIzB8oImmP8H2bRNJ1CYhA37xrerVFdi2XA2sWSilkEM0XdPXrYugSABUdeVyhWDx3lBVpeRItAr+x/hcSXfslq079iQ9eOakMaSHTxo6mvSIoYMmkR4zcMo40miAYlGAoBKcQ2Ls6NlMZY1C4sB8DJdZvUxwEQLiCFdSEUUys6K/t2/HkBLlz2UczeeBdXNc1yCqRPezXKz6maZZT3q1e5l7mXtZ6bIdwIu1Xq/uxQa7RD8H7JBDpS8P1Ab4VELeu02XLm1kX71O9d53V/93DNz/1UqQvc6Xt7VvB5KU1I10q8rS+9RHTR8yZYQITB8+YoqA/IvHSG2iRMXrg5KaDCHw9YhR9wIWCiV1gN7ZCiIokXtrLmEmFlSOWHPAF35424cX2ucxlYnZt1NVbOjuZCk+kifP/X9C/59TFS/7gWNO2KJ6H7GQTlJ6InutdTz57Z9kLHk7jGaNnWZxyOpczWI7HJD3PUvMkLYsMYsd9jjhFi/pJdbZbm/LHlfox0ec8sjhaKFXlGkDQPvW287ioJPOWmSVbbmaieQss3Ztfthcllpps+r5Z3zPDOax3Ma0ZSY5/m/bZIej87A1y/apXLxS7bGOhu23b9u6ZdnSJYsXLVyQmz9v7pzZs2bOmD5NcDoe9rvtZr1aLuYUiWbTyXg0HPR73U671WzUa9VKuUjgX58f72+vL4W8Efoe2cZ6LY2xxjVfzzbqtST6zR+9WQ8HwxSofgu6GEI4sLo3tHlDae0Ua4RQ5uKiMJVHg9C1KGkbVFzdrzfi3qCwlMsd48lBY6XANR1ghKIDqlgWK2btuHBXq9NDrZl1Wr8rEyDkbxrxzHx+qqL0PD0ufj7HrnGMQYY121knE11szcb+2ukUv1tKLYSCqlQy0SvLz7kSlikszM9duzWfJwKuM6rg429VH+VhJREMedK3MoPcsVL3HlrW9yrNsybnqvIhYPULsa7XosJVTNK7bjFN73oUtuolSN/1tL8EWbj2Vy7OkTKDuaETcIq9jg1MOqS9oVOb41QVPnFzjiqnnl9WAp1bg3tPUAi1XkDHOcBUQeupFdOFWuGluGCu01vrHk+SYBUAE3GEnnWxsXyxdrF+sbWwvaCiDNEv1x3/EiSeJL/GZTuNIecO51TyUt5pVpXHaLhlL6hjL2LfRWFHh6E7ggYc8Fklm2cL+2sL26IkDsorcIV6LY9hx/DpXdYdCAxB5nmnuB8iIpmHdGRt5nql3ald4w08y74DWZ4pdnH0UCbksZdd96QYFBapWq0bB668642cenjCdXB2tDOw2Cm56atzGZondaJMeUMeD97czaWsKbXYymD1kxBFFb0TRd9Jz5KzKGFlC34yu0IzuUL0O0/OHQPVGZAJ+b9zzjk9fSmPPCFC2Le3au4CrETKAZpcqahxpbV7mtZrlEd8mUa91hvE9FPTf2ETkAEk+QYtW3o3lGG+XkMr1mJy+fmNhrMMc9GFC5w86OXOd0scPrUVB5oiHUBJoMx3pihsv8u4sNJ64imPbEwv5J7KoKh0SqKS+DmNei09ITlg+S4lpnLh2rcs51/rVulk4nkycGmYXx3yltEc3okb7ob1ZVeWSnvOpyCKYRi5qBhaTVOHns+AuH/s2XpimU+wGGSWpI6VReEX35eQwu209I1sigM9lM/9qXEKsJ3GKIUxzpjeK+BlQpLO+Ig7vhPWghbFN7mXMiAQ5hzkAetuSnaitIO61OXMK1/cr0a8GOOM63swQY6shmJZWeT65B15n8K+1soyO6Z5OMnw9iv7dfHv3oUlG+TwDUPzWpoL58g+0DNuS61rce4oYK5P1ewCZQvIJc9SSK8Gm49yBNthvNPlOzfBcJjBfNzQCH3wek1IQq9LVc7aVU0gpdjAeZXCpPNblZIEQl9vYHNPKkr6UMru0c0SaC9vvGFNGTVpzHVQLjZDdph2xxT8wfPo+/HhNo6xJvZdfUcjWMt486curm9IoGSxZ6ocDnZqooGaHpSwCWvJQWGhI2YQmemO70NotPIyn6COeKR3suMiUhrQBSMdcHQlbzcmgisD3Th44OpxhsrPhZl0yqr49lWtXY0tWNHEQpCHiiNCOHbke2PNGSZ4LGIhMJqHMLCYUFXxQcI6xjMzzqWh3IBo6YdQMsfCcXN4tyWIqEInpjql7DSsfK6c3DkiSjvYHoEKidOr4oME+nOxQsRMi6+uTnH9wVAYUZtaRyt3cktU7ulUDt46Mi+s1qxXVcjCuoHQw8jgGmuvyK117xLc2YbSJidNxNMcRAnQtNPOnCQNGRpBSmmOf1FIa3ywhPqaUckqZHJTSmTbWzKYzxY/fWCn+xYIqpMKNgU85t3bMc0wqNhlteQWC4xj+tgql9CwMuUA/5O6Q6h0WUlw7TMwYFBCdvg163OQXwsKropB5WEa2uko1kLWFkdqehfarS1EoK5Gjte2kb9bXBz77lypNu57eXofPg/haMzWp2jZHAOIFMhNxNKMbUFRbPwa3CxQ1lF/n+L8njlglELjylbF4v8XVqIZnPHAtzATXlArHU5uyKZI/lc2WXBFcYY4wp3v/tUw4CHfhVETO8UHfo09C6WOIs8b2yW17NBwymDxiNa5vgnH13J1sXv1XScGNUvym88BnC6/x0OYvGRekqYM3Ag8m3pN8mttxCHXtGp7Jo52tC0Hg+KyWNYo0CzeYyjg0jsR1nsOmz/9f+85hWaDHPsUsLSznsK9/4HfNt74KDoMK47YNe89tj8hYfZ/KMsktl2LUrUQo/rneut488JLP+EGC91yMyHRywAtUjZ3XmUtUItv/2ZnJR9CGfqCz5nw6TC94VvyA0aF5YzSk+Tkoyji742EJWja8A6HDnJXlV8Bx442bImpsRhle5Ws2D7kHp9mFLVi3UomGEdzh39aJI/HKnJbC9JhBPUvs3Bj0Maofmid8TZjJslPHpJUkPytpiRVocff6TjFSNMXtq5Blvp83ckfKXn+V1XLjZXQCAScsdLunaZqB4qDeQAY/0P+0/uqPAlYxy/9wMVX1GVTnlNGeOoZuZR82Ky0zfwg0CTEI5FDWq7kgjWXpPIg8kI1sKZDfeNsfHaSYhFr2MA2VstKAnTRiFwFXT/ZAJZicXYdqc6XqMHu5v4gs3Nvvvqhn//49bdlwTufxFZ+9NaMl9deI/3GG374dn6HV1+dLbe8cVObU86ca3u+/vonfAN5w5fI7bFbL8g91+pm0nvHe1Q+8YQ96pZbdNm+cY/xiU82dW161w/fB3dt6ta88On2ju8enLZwMd2h/bvbPz/pPLbo0LTkn55KXTDkrRqVm5xOdvCrdGg5tvPYq++plFMrlpRd36ZrWPpzI/Ejx8fuu+DvxXW4GJH7QRys/3/sFgKgeM5h+7k76iSsSVVtbxKZIBM0bnKbpYKE4s7+ixvJlJaG8dqxGDUqVDA6J9AoqPlsEDQqqVBC5UcE/0VYNF/48Z/aP3ntb27MBeCtZx/+A+C96d7tn/97xdvlDkIwKAAEfl01vCMQlCLfGTxf6+d4yPRjulsH9B5JId9fs15V+mOjSNGIHVD3JxdhTeIEZxQN7a3+pzBUqMipoQqX+4daNObxoZra/D7UpqZUZKZYf0iCUmk9lkBcZg0VfFl6gInTkJpocR3V5uIuqtN7/2O0AMjG1s0eBSEdYdycosVUEja1uK2lNdmyIdHBIaJrN+a5Gu9syskSmak9Thq98kVb14Y5VIxQSI4vHbEbL7nSckubuXRpauaMuHZ04BCxo8P8cKZsKA1vvjThYecUBkYU4FRwhF11Xrex3ddVwVBtYiWKyukALMae+hUVi/n0gzGtaluRsvu0S3Zh+6wDLu9DnSrUU91RE4rUF9quDJv0mnDLZfpYiTSM3/wMTKu43ReEvUdv3615DuKcXtrx/XO4/+1vz9vdI2wf2uYaYX30WB16eWbe4vTm+wjUiiDXO6B1z2zNMd08PdneSIw3nNHS84aLHsys+3PX682J7uyHnYl1e0S81phojojGIIn68Ks2+Lqa2KtEXY49rxRHKIZvRCDcel9efzrtfVj9bv0R3mySV+O9aF1Q4uWVzqk3RsjKXxk5Qpp/KXQSxEtgiTiGiClJRxU0QgTsCYM7hgBOIPn7e3g9TsLltECT0f4NjEK5tOPlNqjXJdGx6qpjZC6okUKoltJUEIHBJBBIRJ1eAqBCTAMimtwthe0yKAq0a+YUHZk0Dvx347uaqZit0CSVrRilonOCeNYOdDYe6Sip5+sftJUssr5Y4GedwGSlP9lE5EcmesH8YBTReOZz1g/oFOIFbtYKVNaNVJRU89UPykphhaEtd8q6Qs9MhzudYqlX8Lr2LsjywoU9pD8x7NarYJYXyPbqXVYusiZasno1dZp3KKzrUXazBXWaR+VKtehWVq6tNVHzyWTIZDKTJ5PpM2SA0AaTA0WQ9PtiBdOUGQQEQKWY7X4l5jvvxF5WBwAAAA==": -/*!*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,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 ***! - \*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,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": -/*!*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,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 ***! - \*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,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": -/*!*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,d09GMgABAAAAAA8MABIAAAAAG7gAAA6qAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGjIbgS4cPAZgP1NUQVRWADwIgjgJnxQREAqCRIJKCwoAATYCJAMQBCAFhQYHIAyGFht5GjOj9pCzkg/wXyZwYwjUR3oj0EaIEKr2oWFH9QUOBucuH+kIUKnBFRy0VhX15KXlCY3z41D0nG7Dzr8RTqeEEZLM+r069N/pJGMSF3BSnisVgPTqIoEL5OLYuTNPE8LYZfZPdNq/CQpoNq3jbilvUpm5+5DzRQ0PwP3y/Qo8S/AATDuBqkWaTbABN5zpfZ9+bpPs+d/e3KpoGuqdSOq0QI0wBtxkqQ9OE+1/1tK6TTheIC181V/WTBgG0DAUW2o7iXp6YPFMcErqp/Z0f1ps7w1rpOo+nZ/trGSffUQ9YlFSd2XlmdXK3h3LJ++R1v58hP+zdKhDSriiil5PRNWlTZV0Keo6XV50iiyMjX2a+AO0qI/hanXRSgmKcdvHUBDW6cr9KQcYUct0oC8XcIQ4jOWPSU2RijuOjE8HatnJ1AO1ZSrqgNpVlDJAnUrkjUDhANCSMIBw5npA51xnm8GIyoAQ3cEYluLDSIyMo4VMYSChydKUpHLvABWFcno2uSTapTb5G2pQeB+nMNWeyFLFI8fr+vp8n+/zS/zTgveWOJV1H3BBDznK5gPYghMboX8kHS7BspHgcy9YJEWhQ5yA31eb/e8CIL6ypgHoTfGBOfcOAA8xlZl8zb2hzzMC66VcXo0Q4MK2Wo4A9A88FnG8pEo7HODAAsq9dwDUZ9131nxHsV8xr2pmgqdzDAFD0pQ3Kmuw7trtc0ibhWmBZnIHmMTNOFUctF+L+Rbu/d+EHNPGefINgA1AHpxo+HKlpQmnT7E27UQ/yr5JS26t9S9waMHU/r1HrHtGrSl9Bm070+ncplmj1iybdha8YTzgQjBuTYtbt9sd6JrebfTPtmDLnhPXdRkzb92xK8+o0KhTvykbKrUZMGbWih0Hzih0mrRozZ4z1z1r1rINbfb7b+s1Yqrj327TvnNP+one0GvYhEVbARdFQ7AO4xat2rHvWqIBvdNHoi7izdpjnwfHbm6sr42PjY4MDw0O9Pf19nR3dXa0t8FWuYxpaW5qbKivq62prrIs08k4G6X+8aOHJ8eJs0eHD4aDXvdgf2+30241G/X33yqsrRbjkKUVrkzWSsUopFmFK+ulYgxTIWJ8F6wwhNCzutO3tarS2inWCBBXi3enY9nDrDnVUaeFUfN6nQF3eomlmuycsXrpkBLKbLrGV1gCrrbDfLNPv8CC3HalhSLjFr0qE9CVZhww77AdQQVC3l1XzzZhhXGM3YY12wk/FWJsdA995T0uf7WYGuCK8iIa+UPZEec0pxIL66eu2bEDcw7RkEGOy/wl/qU8bEYE43jUtdIN2smKNr1v+bV3KelmTc7l7cNk/ZVYl4qBUQ5l/HRVCPHTNYnNiwj26Vr7C9NcxZddGIRXELB+8BinJHh2brQk7vS9uMepPND92hN2nx1ZTqD7MZyWCQWuF8Y8j6jggjRCCiGFuFAXh4jYKwadYo4i3ILABtTOe91bW7y3cm/13sbc5pwKRNa/zFf8ixAlFP2a02YMQe33e3Kq3/MPqZyAFdmipgfU4XsC43RlNfcICn/Jg1Icuy6xv+bYJAUhy5SDZygVa4GXG27aFZ+AHQDU551iEihN2ocwsPK9XmnnYlftpxb2GcnyRLELvV+Qk7VQFCodqXpJe5OfoWHX0rveSLOjxpZw4YamoFwr47qn9TLEOd0qJ9khTbfbm7SXCnWhtGyWpvhZeCmweieQvBPfie4E4qUNpOWkjKwsc2fdje56BqIOUF/P3+Ua1+iVj2UPj4gQunampi6FzRA4hZRlFQRlrd0rcalItYB9Uy0VO70QDkz32FaB5pA0Vdq/8G6apedhVa1YC/uRZbXqUqVqJO/upZlnlWtOqtQMvOs8TmmM0IM4Agac2iRJ932GiZV8L495YEO4J7soSxVlTsmmzOs91VIxdhBdsjhCqc3M9XvnsmkwNLfRyPOI+PCw/nbF2aynzNxiuW1Swj7tk8VcG7MorqXrOFX1raaxazZPF107cYJr0w6Ccga6pLhJKRJOPA8j72Zb6SNTj+d6iDsjN+tJ+SkahxWOOiP2WinqEYkt8A0GpALRgIbWSabOUrCDaX9YFO2xZEdKO4jXhrS6ysRa1dpDcdyofQ0m0Fqrwa5IadRd8o68R2BVrFUsdIumaQOjodd0y4Th9MSSS2VNv4XrR72I1lpyMmFdITo731LtkPlP0wYGFlDSsLyLN0FcvSFD0B7Gt0A8mZOG0wmst1mzQumRWhcPkcZ9qsba0Sw7f5Lz+nLGCPi9MilTwjZvoN2O9BR7XTae4mEhgvjs0BvWVKA6VXecqgo5wrTm2N2UQLicOKlDRqd4HDNh2/I71GDecsIkmBD7kQT0LVaKcbSA7nfKgPtdI5ADElqdXCyVZaFE4pbvhWC10rCDwGuXSF6mlTxSVJCCMS7wdJhnP1OG2UR+DgnE8XEjlVYlYqIihXolvnWlSQcqOlUIHGQuIq6nI09oiZvwg69EKgQM+hBSjo9SefvQxmbW82ydywLHxiiVVM9ypkLT4+qxO4hbjbyMW8XIsThdOMo34qpYl2vnhx5s5+1D3pNndSNup3JPeqbqe7APDtbHKaOlUdwRZadNWW+PI3VstWa9rADBQ1PCGiN7yld/4tl6e4TA7CSK6xzVobcMXooAbsZAT2RBKwZrKc7wL4w45mtXSAYGpmVQ3wHpqMLmhuxht8WPv6z7dy1wTd2CySGQiOS1Pc4bBoZ2US24y07jcaFa2UMkFG6I4hc0Im+aeC4J3eUMBoyEUK6+kvJ+aFYMQsxZxAm/KV6uY8Vcfb6S2m0IWJ/TrtueFurXVprhrRW2bfVSl/sdrP9zSN11RJ5yKv2z/6oBuuY5psqrHdrCRFnVNd06qAt8/rt5Y0lEYFhJ0s3lLfnvKoVyBA764FEiSgNxTLRot0w91v429TnoTTggpyg/8ldNQELLGQQ2sUL6sq+zVkWJA+n7De2CWnRIPRWg3A2f9vp1RLVYppEmR+96GrhLmvXvANoOnCIK0Q7mw8IJ8YXANVMqSrPSwb3iCoc3T6qmG5uwZKgusT+tkFX7MDrlmqQRDDsD7b77f9y5gzjnePoOUJyuVxCPfSYdmcP0RQ/7iwfPvE4f2u/IW+5/cCyopb2OjXIfWZTtfOsJs7Orv+Na3FKJ0ZpEH6eQKma70+POptSBRw50TpoUMCkaHMrUXlm2099DfoNBYrlA8a3o1gFRxMcaR1mCOAtkrzvQzrz9ioxZtFrXiPsNxVJhB06LfQ60C3fNKgoz/RATjJfEDD9bpJGlEmQ25mTJAOKPymprS6+t6kHWvX5hRAzpyILKHB/xl9of/XI84q801I9h6cRSXwXIsfe6k4aepjyi2nJoIRIAgnMtpd3+TDUNvHE5E2HjH8i7eFfeKghr26Wf4AuJNeRRsQ3PqNlZ2gLJaLPS8juuAZwZLCv7/WWrbGbNBPPmR+WJaLDVhviHt/zeUYx5rGANm1huCV0EEwRRjOklJs6JQuRilmb+a7L6vLjx4ufy/Xv80491mfWf/6P+ujl5Rqxg7e+pzBXZW+v/r3WjG60Ha8OrYf3TE+JVnn7pf+jPU+4rXxj4i9g0vOU/2f33BeP8Seorfbcrxt+KG9XQ4v/Z7r9Kfq3ntsuxN2Ob2P4NgqLUxA6vDeXO93jPYXcQ41qcl9DrtUmuv0r8Rj6hetri9LcsC51qbKvuVTF+cN2UUVv1lGENqq5JDOAnRTsLhVIH56TPS9lctvVrrjxwgoIzAMpAXe8jawQAPGu+VQ3kKt9pshljUL8HwUBAS13vZFkBmgjBeoKRe7COKpdrbWFhqDWAALaG0UM3CW2h9xyt70ZL3KSugADKnNfl4MkiXf/f1DTVAAB+/T7yCgDw78Ux+V/b/95NXsv7gc1gAEDwE7E4uWeU/zV6QvSl1wS/t8RKDydv6M56YT7eQ69AAPGciTZcrCCxBVRbdxjYc6vDS6wZq+/Zr8BC0tO1hayvBxYqM7y6UAwL9BZqAwPfhYYP0hd0mhB0rYQAeXDDQgRpcI/mYMXHtIUUX/x+GNSCd4Vp0qwTo0aVanIUmjR2lPSqqHBJmmPdKC5NiWjZ1sl9rkktxmUvF6I11tV1ZmSMs0bcurnifEmerSo1UsjdV0qsbJsGDsa6yfbVq1CZLdlITkai7Eay89VccuJCNfXuK0eJMV2SZ2uUcSMmDZfgJ0oSRg0/DdVzQzTn5rOX9uyWdshUMXNNvi+lLJ+/tdBD6tyWKasHbvYAi3W7emIVTFoiSaR4WRLWlc7KuNynOc2cmIobaKHlfWxof/WPtxPRrt8wNGu3Vo+rOSsRErw8MXhpUuDFieCFSYnnx3iJuTECzw5LzPR6eLr/a0x1PniyY/BER/B4p8BjXRUebQkeqTTxcGWEhxpisFJgoCL6A5S4L5DoDVSgJzAWd/srcZc/0elHdPhF4HbfQtzmq0CrLyH3tsYy72Uw3kRLXG72iZt88Fdo9AnGDV5EvWd/uc4zrvUY5RqPuNqDd1SVRyyudJf/VhXuRLk7g8vcHXEpHYtL9pQTviAeF0qPMuJhpnSSEsfRsiQiXELYZMBRTBy2RDxDhj9g6BMDf1nfL0RKQHRD4iBU2g9ccYJH7LpExyHaJtEyBzRtpYZN1C2iNkbgoIAkBAZkwsc7Ap4ehfCQ2vHyS7bu/ILOBG1oy8vPbF2xlGeJJaIkiEUUFvGIokDB8AMwX0zZ5HuUAXbGxHs2sXC098QO9g7Y3oZgVx7OU31tIu62Fw+JNS8I/TvX0NUgQ3LVy5BzxByOzmta5jmS08Xplx+ErUt0ZnQ6ok0qQoZOTppjcj6YHwwLXBP0w42CqR8iBeKEjiuaxzmc08Xq5x+YrYf5ELjorngBawVxv4ikxt2UJG+5iSbgBtDdCim5N5kJICM3L/tmQnNu9MkTWIfONz1fk32Lgsg69Hozs8JWZd8s7DkXKgMBGIFApvJmwQSKE0CXolAyMJaxEpI8uhlY1EUFipo/0ayYuZNA+TV/NWYA ***! - \*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,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": -/*!*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,d09GMgABAAAAAA8cABIAAAAAG5AAAA67AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGjIbgS4cPAZgP1NUQVRaADwIgjgJnxQREAqCRIJJCwoAATYCJAMQBCAFhFwHIAyGFhtSGqOREWwcAITouwD4q4NsDJUa/QdEIpHMeaU3n65OBdsW21oNde9P2OZ1nqHyF10gjJBk9if+1HcfKTHnktZxg8oZVGuVUjsdRB9BcGmzl1IxoQBFC2C1CPRq+CDVvgu+aS4/tPz9f/1ZSkPo2d2gAk/nhWWHwYALppnR+17QN022CnGJStdcBf+UoTpVmSvd/3Y3Z5E3BPP7E/Yw6fCbCWISQUyC2KElTUfKP7TNL8pE1Z8239qnXTveEPWIRUldysp6WtmW3u6PLAdW9ucQ/s/e4AawA6yooumBDxCrXHlXXXlFXac9nQM2RDFrKwF+qsdw5eKilVEKxm0f/QGhGIuoL2YnBaHniQDWZArHiEIw/zX63IVju4NHRgJvXKMpAN5ck5kPvEVmugZ4m7TyIuBhAAAhQAFAqMJ1gvE232pgiSWAOLoRh0Di4xBdiJwhxJ05h0LWjHID2O3AYaqkf9aGnNxO55avPwdK5jFDpbYmPzlOJV7R0xf4Al9QEBwRfTCTDUcTgQVsmzmXPoDZcGJm4m+UJ5NhXo2/Lz1kFDIEteBR+L7uuH8rAXQfVC8AelK8c8huB/AQIZvR12QJfRkR6j6mPAchgKp5TjkCQP/AU0OMl5w5G00DUNEfxoALz9MD0UQA6hfgshGg7KxhLmsnBE9kOAEHubF8aG+4bH647aG9bBo4NTDIbQfrtJodKg7Ia9Fv4a7/1mRMWeXJGwCrIhVLv4RxqcKym02fsFQTl+09JttS65lkkYm0+89uN8NpyKPVqMUcy9VYYZZxOkw3Ra/lcUNXsOCvy3QtboZ53aGuiXU6/mkTzTbfUuvU6jTBDEusdhoyFanRRGumLJWadRpnqrkWWm6NGj0mmW6+5dY5A+NMMVNl/q/PORq005pqlgVWOAGf0A0N2nSbZHawaCj4q9ZlkmnmWmBtTh8s84cztcSdmk+v8B8+a+aM6V2dHe1trS3NTY0N9XW1NdVVlRXlZZrSkuKiwoL8vNycbJ/FcjGfTfNw6+aN65NM/OnJ8Xg06F+7euVyr9tpt5qPPVja2V6h025Scm2xs7KsUpKWXNtdWdbYKKEJPwQHHcEPvO0NfaNurBXDFh6CG+mWfB5bYkU6lOq0UGrerDfi3iDz1IjVxKtnjDGSZ83LdLmVgMrtsMPtIy+wM7OebRfLiN0vZQL0Y7iUYJWxjd4k3Hh/Wf50GgedMBrHlv2C35QM7I2NQ+01InuZphaopCKHqd89O+UCp6bMw1ZLaXdshBVG0m9UwAv8+fbXCrAtERTztO/jWI8VG9zEoec3rk0cKyyJFMOhgcvvxLZSTgTVVOAPg+T111Hmixxgvx7zPxNSGaqSFuFFBKzvPcIVEZ6drvbqvUPPdIopPN3vPEHy2dgWCHjfwHmAkKMoz8xzHGWUEy1egomcyXX5Jcx4eZ9zWEHALYxsgtr5oLd3pN/y236PRjQ3IVr9PF/4X4PSQ/glwxFC0PnDznHdJX7NFNri4ZN1iGedfI9agSOVVeQKjT/tuBX7H8/8Lxns41yIs3Q1ekCl3Eh0wHHTLvoExABgdxDDKIgUaTf8yPN3BWPFGan3Ywv7guR5YVjStGnxXiPlea0Xy0HW3sSnf6o3XHCx2WFjS7j0qjYh4s6Mm4HWxRDsVKeczE5ouia4tItKzUip2zaX+FVwZ6KIEwrWb6o3E5LK+p1iUUVaVKlT3lJveRugW4EzPP+KG9ygu2/HlqdE8H1/ZpaSw7bwnEMUVZMEVK2Vu3WlTI0EV129Uu4Nkr/m+hNfBZxGMWyjHWsun+XnAXVr2EbyjcW2ukhVGmp6z1WBFTREqFQMvO92zmkOP4BgAow4tVkm92PGmY/ZJZ7zyCf/dqxplhuaiYmnZ17vrFfK2oE6bX2Ekqumfu94tgz6FxamgafI68NWt7OeTWrJzMyWu1kK2MftcQ835ixMK/k6ICqH3tJcms39Qt8vhHF53EiIOIP2mG/E5JFPfq4T+6tr4ZpuptMDBD8pVutI+WEWNwxuiWN7oxxdQ9Hm/CoDQgFrQUvJJNW1OYih2h8vsu5w8lNjBcJpS2x1xclr5dyuxR2n9g2YgMe8BbFJzegOURAKAYHDxpqYyTot8waGQ6/u28TDiZknl8ej/RakH3VBH/PkZMG2gvjiFdYAlvN9BXcBIw8wMRShx1nlZkOKIB2U64D8pO45zhewVZ4VKyjPqVH0EGrcbhpshWaJ/YnO6y4IpsCfNYtFTTgfHCQfxSnBro+nzuFGSUG42UlwbKlETapuk5sKOkJ3JiOvScgcxCx0iOQwh9sund9kbDitvesERhk3mABDj0NspGeQPe470MyXCeiABI9kDxKVZRGxmE7oBW+t0bCRQMfmWLx0Rzw2WBA5pSXybKnMfiozJpX4GcRgzB0nxVbJorVJJb1ie90hJwdRfN8IPjC7mKiejAOiLnhBD78S0QgYdcPnnO5jiuFgqM9s4MmKFIFMZigl1FM8o9H4OLdxB1LLiZdSx4wMiZKZdLk5Ls06Uzq/5MFGMRz0njjLG1LbIv6+Z8q+B5fhWjSXjDdGcUc0Ow2aDfY4mibeWrabBmDUPyccdbG1L/res1F3hODZIaSbrJqQawruVABua6BTWeAyIC3oFP9MoE3x8hXi3olQ93rGgLRPaX8vzNitDfMv6559D3jZvA6jQyBm8Rs7PHEMGPv1uWty2aQcnlYrOQiZSitH+Re0aG9qMxUi3sVEShNCOJ97S/IyBJMhGEoTHU9iRLoEt/WMViup0YUAoxXtqutxxn5tYxje6un8QS91mTvCel5Awq9Aeyyp8M+OVw7Qz54MVlzt2BsTp1VX5V1Qlfj0Z/PmJbYJigwn3lwxkP8uJaQj+MAPP5JFakCK1rOSpZupCh/dnMLexAfsYZId+ctZwDbOR2FYwwrxyz5irRJjEuqHjf3a3HVB4qiEiF/1aZfbxWbNxA2ksdp5Eqg9hvQ7ANed56D81Q7mdUEi8kngtauUYzAj6lm3KLR/kjUd78MhQXaJHUmJtNyHUTlXx41gwJOQ/M2/4855BDvHk+dBRGm/G2bs08nIXJLPO7iSv3b0ZeLYf4Pecv+CihnWWWdTbdyHOYp2vu6u29lV33At3qvk0bKWbucQpS5sFbadramDHzHQuRhqQOeb4aFM5e5le8M95LcYZZ5LpF9Xrx8QxXyssY8nCPZA+hUBVsXwauCYhYvlVtpjHK0tHcHN0U4B1vi0fOUFMX43E5Tj5Bl/rw2BFy1I7VHojSDcUVllZ6mdVT7Iuui/y1k06UgDiwLe5c+tP3oUcJO/sFAPhrXXPfUlgAKu3Ccx2FsXR1S1Ew8JBkB4um6s7M+UZeD+MxkJe/8h9lgXDAZZM9CWn3ehBarEVov2UbRVZ2OzsygBEkltAJ9/o/s72BaGl2X+PbWJ2nhbvi1Bcz+yTIgD48ZGxuHhTflgQGi69BnRSQmYiEYxYt0tNcJYOTNlhsxXUfw3pOpWhlaF2uvXUcuNZQGD3mdU89VadC+yiDWu62unfaH5/1od2rA7FQZ910rNO1KwcuHxv3QfND+fVE6dCs1/qo0WGz/21pB1DaJXURcb1y5pOB5c/t1SZlLj+DzkQtXaBQ0n1Jqp0ZO8KvPjJ/msx4cyT+69tyJ6intNTuIEv/W8I7ntUfuWZJoaib7e7OfulOaQAxuyc9WZI7OSJ5gN14tOGOnSP6RRaPvSif93CKJ1We6bZXxwhKISABWAfuwli3gAAKvSt5yf7LkPbEBrrEDvBMKWUC5z2UFTPgYIQTRhR+lvrMOyg/r3tzBsRgC8KkjbCqm8v+lZuZlCLlXIXAABoAU2Lz1clGLi/U3XQBcAAG6dPXwFAOBelUPoX5t/d/WuFZuAwkEBAEDgh2JG78QI/lrekXnpGkR/NpM95xB71PSCJ6zKJqB3EADGRNYqsSimpGYDumHSBvRUN7J4q5rV21PXgtmIubWzKYb2z6YpnZ7N4Pk/m9U/uLM5uOE+y5gyohdDAIahnY1AP6ZrJg85Qf+xsfDHDQTjWAtBipWooZErW45yPHKy1PFEVlmmC1ESqyJxEdJElW0V2ueK5WGU8XIBKmKVUycNj3bSyLcqqThP0rueLZeLc7enk8jYupDCY1Vs2wtkysrmLVKujFTmG5edz+VcEjVM3jxNgVwZFCRk8XQvQ4SoIZmUK5/PEE/HtC3Lo6INLaLcsp3Gy+dEdEvr5blRJsPHVGIdSXS6AhJlmmapEIONFCOlelAxGY3xF43mpELtLlwmR1VkKq2+nQbkq7/dXJCLvqN/Ot17WtS0uKlqKZ6i1uDJ6jV4kprgiepzeEJwPM/4YDUeFzTP2EBT3Bv479AGeOCeAA3uDiC4K2AN7gzIxh3+BLf7GOA2H0vc6ke0+KzBzT5Ek8853OhLNPiuwfW+w3Gd9zlc603UeBHVXmpc5ZmMKz3X4ApPotx9EC5zn4I17kRpHJR4mGIP/AVFHv640I0ocO0P8l1NnmoEuSqTo+Ltk60ajrOU8h6ZSmKMUrMGzlA64HR5fZ40OREU5paCHyS7mBsuI0iUmYlYgkxsRKrzeGmzU8mwE38iOcNRgkowFpiRgDXPUJCMw4SmL/Lmmqj7VY8WuuBRzsRlJ6LnSHTtiI5ds7bDOTzEgWjaE41gNfbzCcG+PtHYw12NXVXJWCWz5Scq6ZdRyJFEbmGT/C1cbFywjD8AS8UhWCLmYTGfKAvXcAIfLJDwuInOPHPshIlHucOxg50rtrezx3Zcgl34OIHnyVUn2Jw8nAzi+6Gv7yxczKPMXEyjzONM44zkmZSLLE7ETWKaxAeGNiHGqTzRcoUpYByXxIXeOP0fZ4JDIO+pt+ofvE3/KyZXOl63dby6buV46/TK6UN6uzJBRbla9W+v47j+g2OuV+ghfATiQxPgV/BR4Ff4QQb1FXCcTXxC/CXf/vwJ91d7+HPU/xyBGlSVRFQOfBLRL6l+pJYr59xHH6nlD7xEbord63QdCwLCmEomQcObVrO8yEhisyecJDFzYjq7ZK/6bg== ***! - \*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,d09GMgABAAAAAB0gABIAAAAANswAABy7AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGlAbiEocgWYGYD9TVEFUXgCBDAiBfAmfFBEQCq04pVQLgRgAATYCJAOCLAQgBYR4ByAMhR8bGjEVctNpuR2AlHZJhuD/6wNeRCTuw2wrQvlAWGsEDOOwBQaP02t42gbiWsKJ749Em6o1VPzN7nT+793d2X2i3unO94u/dIgIge+E6tkCP9naUrBX1Qk4NkKteFWxLWJMIyJCaURrRKd603m/jJBk1v/KZb7/G6XWeOQl1Ja2OwDUVfIy2DyeBQIpYe3hksoRAG85X6Kf57f55z7eI1okSh5iYFIqaKNiFCiKihlbY9QydHOZriLcfi1/537U3P/wlO2pvaru2ZMIS1AKhcWIveQQGOEIf+5b+/1DbNFE9VBJPEoS8yZe71cVxWd3KinR+gCAFv1eW2X3EfYeGWQovTJr5mLgAVyCUq9Bapj1BZkxvnvlLPky9oam/CjSGjwHxouqH6yOppZ0V2u9ZV+aUu+C/r7aSQfsCwoMwCHEO3uyNbvS3Vr+Yvlas/1Nvvr2t+q/lNZgqbDVjhoLC05oAENBML6N+V4IYPEvKGb5pN3bmHYBR7uxiBhZIsbxrb/WVBBgwAUhXAMrIQJFSo+TjQLIBuQ0hI/DZDtOKo4lmwHZNhOQSpNoJoKB5tCXQ9h+5ZeA+t3nmQDqL0/zeFD/aW7wgPpvfeckUMMBgC0Ieh8AXSGqCmc2Ab3CBjEC6z0Di0+Bwkag8PMYMLv6FVVq90tUtO7MLQBn4OCp70WBGTAAnCfTJTicHonWXYW6v28KmvEydf978yVN2f8xR3tJgnPiuoA/Ncbz6Wgq5xpSVuhfUffb/bQS8ZEYQKuQBoUgnZD+PMpH8chKN9pOVJ4+g70iEdpIU6Yme1ym0G57Wub0LsoyFN1u78khesI+lyvpt/Igb+dZ+oedl8/zberPPZI/8rqOAaNibExA6dKqGtiwdENf1dzE9LTOa3bt6SWtaF1b3Akr2uppL85I9pIOp6/ti27uTrrPPtULeM2y73QU3yX74375aX3fV/2rbxAYhU7hUoQjH/UET8SYgIidZAgr21zJAq3o89gKINR4MhD6o2Z2o4V2AggeArYJYEqGM1zW8gCby09EFEIAkAS8gISODGEbcLDNTO3NZUmQaJCax+x5QK0OSf4ClgA2k7JYiZ16ryGBrHZtoV8BhIY1sVfslUp3aihWYbNYEkD4FpB5PZAEIgEGBAASWJC6wtkVVZUSE7EW1iJbuYVVA08CEYzJ2VQ2NUyfClK1GlZ7VN0UFMCXed+xJBA0MYthaUMM9LeSMK+NJYC0z14LSL3/QZgpFxFM4L3NAFoJ6z5ppQTlehs8PdVqMcpY3Irt7/oA/DRiQzm7jZOZmZmFxc3NsLVIwK1pfE+csr28Ng8GSGlEMLPKVaJGG3adBgYZinhw3BA3xk3x6HhM3GxakDG+dwIEhESkZOQUcHxFhhEAKmofAXwia2C6OVNXEhZHwPCZbfrtyELXzrF/efSh//sC+3+XAtoGAJl9zgAUcEBJVykAWCRxem6s57OzDSGA619tnQiA/in4GEgJAyoIaAhrZyTXFApA0mQcDQO+pKaY50exkChngygk2zj0fjIr8FGASVw6V86Nc/d8/90xZh5LHEseSx0bjS293kAdi9Dr9G07bCx2vnVsODb5N/ORpeabzfiJbn/bX/fV/rI/708QCA1aiEWcId6fabMJQfe9/JEPPvP+zyiS6n8A+NoZHLB2sPeYgwepdqptlttvfDL3EEtsNN4ym/TbZSjx5tlopyV+dvRm84T9VN3qgJNO+L0ybINtULjfMby0xyGHPOzNcSpkXBlwt2/cfO8jDjpqrkHrE2+qWRZabpPdpltgqTWq5z7iZ94Mi6xKtj6z2O9ttY32vm5MPCnhfVCN2Btzf9n73NfZa47eZpScYvDOGq2k4IwSjCCwHr49WbVNXcXwzddffXlcejk6PNjf29ne2txYXy7ms+nksw+LK5cfz5NLKx62V57oZSl1u776hLoQuoJ5N9jlCHFH7HJXxiNjrTdsESH9uDoWGx22cD2EGRxA23qs5R4vd0qhsc4BN5r2lQ6u6wHGURTB1RZio9t2LtmmXHaoze3mbXlEJmC3tkcShLeHo0lU88yq+mUcu5xnzDu2LC1SlyyurdsPQ2Fe9kg5TcEVdXlWjRvqI+4I6kpBEVZ+Bg2DPcQpex1e4O9UbyigqImgPVfboutAc2zU9q6wHhizkS1533XXlUafENt+LzEGqczf7Ekx/3BfKV2eoXizX35l4ioMfFofySRSsGgwZFBrFO3ZtnzbrmEHvOniGVYr2SCy4WFH0DFLTi1CjL3coxF4gHJMdkYjKmM2VpsPU2vkk07BBOw7hCBhhp7txRUVL8XL8Rr3eGWiJvw1P+y/hCwh/JZRj3RSs92Bv6n+BSmYzqG/e6I16FgtLknGzhZd33WMwEEHEtnyQCm/ZbhOKyUelAPhIfq9ceKdjpd3ZiyCvUpoKHjD9UQg8RDinpgMBmN9r/1oBayyV0nCrWGfFt3RC+OUF8OlVjvlmhPXqWlwIQSnSw8WXJGLR1wH4ec1T4J3kCF9j3OtWB9SduchflSlYqIbV4eM7CNhSWLhE0mfP8ueJWKd/ZyW7QCuHCCOfZ49NzQxPaAl5H/DYx7T2690yBUR4racmJWPKGpEjpDlwCSJgbX+7bzfo3HCTjfq95Y7KW657WMxCM0nbceoei7EOhbTRtaw1TY3Lkcjb+iOWf8c4xiC1tgLu8hqeQNHagL1O5CegH18FJSlaXS/FM2O8KD35Pg5XuiA6mio9kbHa+IHRv1e3pPsoPOblJNJvvdDX6/eTe2KrApcNVw9irA/5AngKrwLC3jhV8iMKrqVx00Qqm4sDaLaFUuNR9+3DOyW1mfLkku68l76NH+sNIln3q5Gfz6exU/ISbU9QPr7IgsCedjB4pTBGe/aPlpEPU9aFPyIb4QVOiVTVAelehgfUlKvQa7QxeYklbEeMlzSqSsvk7mcC3hVnHO2H4UJtF8s2A+rHvVuCp5CMMkebc1MVYlWcZHB41dup8Xf26VQGHXfigDj99IgzH45oVuGpdUpTy/MEPThmRbAPgFWalvqzzRu4ORUA0EF6DC/5a3hguPYoghh3YLABfd7ShI4LZsxW+/gFSiFERzqGNXNZ1VrGQnTwUH5NV2gxUM9fIrpIoMM9WFwbKmgCU25jkaE0ZBz0P4xdXSwEi/cCHGbgLMuTV/0miysOu86JW2YScBewe62yjCi3ItGyEsfuGAUirS3fFNywgKIdnoecBIDa5wME3g/8+VZzm34RiO6C5BeMGw2buYc70qLLCMJsfqco8x5p500w8q6BhX/8o4pEd7FgQAHnz4hDKVCLVhQbWoJ9jAQWAGlGLkaMV13rVA4CAwZhn4o6xEMhQ+lBQwcjnPbMQFETjScmg9ll2aVMmkiBIwztGY1AVkSu7vuGoGicPaA6BX+9d3p3H/kKDnhNcb+hY08JKpbN9U7bzrqjsVatheNSnlqJOxzOkzRe02ut9gkuLAd5RPOJlBZA5ZkQDnLbwayAlQ0mON5A//KyG35YEeSiYnJ/ExLHkqR4vq1dsj9qtA8Y9duC/CyeeKBUZEJhzmW1x5Rk/bL+ZXn/NLpCbg+tSpI0DKb8QC/pNMQKi3EFQ4ClHYGErC5LxlfDq31SqxyokxAbEqXIVw6eWcnqnsBeeudCYCLERjc24G2j7hSmr5xp4ZZWLNrbyH1D2FGiFZQVL3jgN19UFYjdsG+DMh305f3Vx1YIOrvJc6PqSFaGTTsw67zfv+skRgNYHDlzWnnOAGtNAx9kZMqhpecQMcdxRPJQNx188/5IQmw3bTqYqvwjO+xY0epE/Fz7cu5lec90kAFhH9Eqxt2NLLWV52Hm2Aown3aupcByNadAjF7lXm1GNeGIu46/63Q1vYQh7ykVddzZ7a7rsvQ6DwtqmkFV72NwRiXyUKYcB/K//z/XioydqWgo+liIPZ9b8NufzLdnLMuzECOmSd2z+19+RkIC/9HZ0qlE2xVmjGEoGKtrz7vXvHKn2cZ374WpDMSvYqQVV4Gc0EVFpEg3sTDLtR2oMpY1/F+xn27BMvdN8mPs1cKF5Q/yZ68K/L540ZECNKL2vjQg+a67jvltgU88NNqzb4WVKx5ttDiFmiA98bZOSrWbWCCDmgu8OcqbfGQRMM1brftQYYPZu6VgldK7p3Wpf74sXaS3DSCyg4n+DtLSU2HGf7e6jWMgr4Uvwasmh3veW2LQZYfqgqHIolWhMjT8OrkQvW8GVndzA0k+xP6Mw267qCSbfh4Q64LRaceM3Xlx2HpBTQpCbFgrMnwy0DZI645MdTqlE6wZZdEUV2duEBNuGAFemasEl+hPyodmMABmvfqg5DMg7XWG7cCgQDUtwDtBMAfUDoBoLwLU+xWMwdWXjBeoQEDARSguATJqTRRQr3tQJVWoMTxpSoL4R/HEvDMgoBAmdyQJ1YocHmogd2ha0Qqq4BSWdl19ZdqZc5nUVSpwecpXsxadSdSq+QTkXBcg8EFJQfpaQgMIGBHfdOwUkuF2UIJh8h6QHPq1Cj3PwXtcIBn5qUvyqwHWOZFJBoWJtE85+PSzveSHuxz5UJSwDMNhjuz2kFuVA0icgI9ap2x/iha9qjOxfyDvMq3yR3phN2o9LcI7+d6+Dx1TaoCpUwH0t2WVjselFqN9FzwLLchvgLGkHKypkVpynqAKYjISwvrQ4GcterCclG3PutC27wGld1E7r9J3MNpjkJYMnkTACW0RD0OFtlp5KtoB/xe4sLUdjkhiaS28WI4K5AtMgnbTmboLv8I1GDwQSwAZ3JrpN1xH1PLw5C3iB6JdzDzUDLOV6JUosagkmi2iiUKMXFTGVF+riC3ZP8OnYGBjHoKLSU7PopobOxLeTt+Ww6emU5lsVwmp1HrJgk/Q9S6wxyN6RF9bA2152UaZJ78RDl2tl18Rlm1wefFo9MM+YUL3sdoEiwKMT1LY8GZ4Bm1DDUtyvf13J61qr13Gyvny2Vbbh260Ap/d9lHpyAnsKY61SXZacz0/sD/ZeBzXbETLc3CrlMjzN3wM/MM0duWksUy2fRP5Y6Ml+iKxSdWWHziRxfYe2W9lnEG8AI5yK5Bc+8pObFWtbimLWuqdl4T6h84dLgLdbOyNTevgifKsTHCBYkH6DdvLl1l2YzcyrkR6yKXlsr4rp4ALvQS+ySA9b3L7A24W2RDCVKKjgvLQFmZFzHHB5pXRopoepgWMA/wkWAuTOxuZH63BvlFnsatYYzkzW1drxDhm40B1ppBTfbOaahT5apl6y6Z1bZdltNUYePWoAGMY8Jy1LddmxSD8qASn8u6zg072nNTiR0rQQNgB92yvexAvETAnlVNlTZy2Vz9aeHt6eW42wNC+hRkqhr2jJndfHBdyhnxOTJO1/DkfyUuVub6j8c2svhq3P+j7a5/82RAerOdo5vc/GL3C5ds1vW+6myrD9p9/uaPxvKY6dLUyXekxYs72d3jJ7dx5/0Rql9KbaAuzaEOU7ObFvBvPyvKWvjaj5YRyl+9WHiCprBSXaJ1t+/422fmam2H/Toy33ZFNTsDChjfDZUJym0NJOdb7XzXRwuFj5gub3WwUy8ZN9Msqwh3lG69tvjEgE+xcf7l8dP5Z9d0tU1u43bmEoaUUdZa9uCXbmKlA5+BG6YO+r58WeSY8Q3bFbPmBLmPlBwFwu0DwrHOviz1X397QJ86X7b4+jRHATH6h7i8Pc+ueelzFAhzvWOkirqNmtYx5PviZZF95tfsUvOaA2t6J06dwGmwUSJ10wkHsUiywTdzpiK5pryWtAU7AkfnzN4/e130s5SCjqg8e5fZEZ+j/XygL+hldM76aVHZwnnpg6ca5ZkDypQaZ4PCRuap705vkRyQZKrcDbPTQ2rnqEU73o3dv6N3LXfkh0vVqtUy7ts77DEzdEX0ssYsX9vwwlTO/DWVhKnlpK17NDJNrM5Q7669xJ7jW7WBn8nfwGwSetjm1JaACIUp79k34knJxydFHmXeWhDjSujmv/2Hyzr8eqB5fg0e03LK1n0pMi24RtnG8ViPl8pXHGlKdX5sS9odzH9U89PlFae27OOcWH5hac0fwn1AmOMdK6tp26jpXcuFr9cX5C79glMSNWIYXlzrl+pfGrYmW/qkIxPT66YTdoLXSIxcF7C5qqapsv9/FCcsSBiRSGzVnJv5CY1NM9U56RP9Dz+lks9Vw+VF5xfz7xX4d4vjMm3CCOvUoBBa7iui+Am55xtQ01b2DEkvEVocdyB+KK1X1MkfSgY1zexavOsMsz263yDJ71VT1CHF9LvLysqp0fEu0e/v3v3FJHTH9JsYUzgtdXN4Tb6DTZbs4HHz1bWSDOnB5u7AK7mrOjTrqcsq8b3UjZRM56B2UVpRm8KmylGdn1ouWC+wqtonrM0Lb08cHrR3WVIdYYv4W+yXc1480dX7m6PzUYerrPD1ydX6dzmpnRbJ6aUs7amD9wRfdu5Zn9bzpjpyxfrKh+y+GNP2mEhacdi6zEVvnD2cLWfkbs42sTTO+KNnjeGdN529pry8RYbZFaETEwt1XV88zfP75ol82nDl2kz9bv2KiuqUrRkb86N4bd3SVPt8tdOvsPKjoILgx7M8EpdvkodST7PNW+xmHGOU50415ozXLaTn5FNKoty8QWGaMD2zYfBnG09b0B1qeG2ZkZ6j6+niONSfviefvqKuTrrQ9ab5V/WMnAn2w9borMTj8fXFS4M6H+WW7Q2yax/PGYx4EVLAdLviIvv9ZIIfZLyPjsJd3HY3x6dkWcfqfetrwleOiD3WPE6/arekeHH7DGS6fO722fpsc4nDUfWA1S+lbZP8b2Hl+NiO3Q3MKXkro3SeYLDJbx+NQ4vS7BK6MkRORf3oYWvA4ie9J4trJcXS8vY+UYWomeOWKrb98O3+byWn13SPnzKO2zlXre3AeqjvDpYTq4ik3qF7+mj78uf/Heyr1KesHYmfpvH6Ymd8qxuhVyl0WxSR7PkJVxIzLek7HZ2+mAFJSMmSH1bnL8hbxD8UbdgaY2J6Uu9Fl8aUDc2vD301rLD7zacIn5+d4wrPzqluSDJmEcbBJtpB5nI8vmqAUSFZuTG3YOINVolpw741PROnjOc+twdVYM5MC7dStOF4QoNcxBRa8V/8gwe0/gEWXm/WYP7a2olBWgtP/rsmz2s0njGLN/vlqBNIU9Cau2rL5GsMrTDwEYC0lTrykbPVuVVrktBk2RqkcWofUTqy7sESZ4tzyYPQ6ihfItwKlq2dr0C/jdmT/oFFxsKf4ryg5pq/HpRl8w/WamPUAdqgYC2P/ueeTIRaaE+DITAnEvwyZedvOCc6GWHD94eKxxcP3WeCaLqtICC6TzDTwfadfxjLP6ASnElf9afo2NgY3LlMo/XUH9s9VFvVWsSUMVfQOQjKAlA6hyoEfqcRO1aBnn5lMQHDPY5ER++wgAicu+jVIvoRIP4cHb48perhwunrp7Xbls3JqVaDeo5TkrbxqrhtMDdzRdvPG36eXfX4bs/I5SAsuFfJAdEg8/hYwhdlWWnRFnhIxqhuD9YU5bTChK2laLYBayvuV3xpasvvd+0Z+fBhYnafohilxesY3hJ3jGjpNEolWj5FjJb4cPoMNBvymKwNBVljrLaUcZpsVmNyVKK5z3PGpvo+wEp9AYbVxYRtTQrfFNnuUHwJ2Jj3sCm1sxTGZIU4OJMLMjmZCnuEg1AJPUxacO8ZgL63S96We4GqeXEhX1ZsNa03C6NTr2bTDosOe6QFUOeZcYJkvP/wxkoEEB/b9Cipj9wrgMqS5b2bJy+1774/7urKzbyXPNpc8wgpjqOSSfnpmLc0AzH88tP4N4VaUhfgl4STcFKjubHVeJKaFqEjLvlhuY1zZ4gD8CItLreH3DeyTR2N55N8/POzy+QsPzoOAaPPowToTeEmgSTOYLQyGHm/R4EQmJBi8okKN1kPzyKZ/mofST8NmB6o5ZSouLiU1+AZR7dLeMbwE1A0KpkqFY022u9h0Ij61HOK+tSZI++soVA6x9MKmEqZDNF4kSnNWhVkuEygJADnWYZHM+G0AEB99ahfMHQqEff3ARD5s8sgj74TcU9j0IVQ2mPwKCovnlltolLQ0HF4GH5QIDPaV6DTyXSfZwCxZTpMgVadtOlx3Mp8l0EVFid7xqh5gX5FV/56LI4EYSpZRAUu1UGW1G2ZIqFYDCaov7EQp+8WZYeEhsLKuJvHsCcQIosIfRFuFDdjPMKhL4OMeFZlFArRrGmfqAE6i1B1CrlSyWNnvbuIy9V3Ge4/ZXgj9WhWnh+TudhXKKAQY6nE884z/4fgWlYxAwMFTVGb+c6XFE4+MubNjxUre36efKxTmUAAGqY9FWVK6LE5+pgYakBoqMTPD0b1MipG/gOc4FviaZrzxWIgTE7/SEz6yMgioVwO9ZR+uXS0DI+DMGANVEGlZgtUjs0yUKVSFQcCFUA2JOU/NnWMIXnimsk4qkk1WJ48LbtnccjFALT0UQExi96D0U1Oa4zj44EYvQarD5/P5S5H+CU6fYGAJCGbEx7NIGJ16+n68j0CAQAF0o7P/I67xUv80zoLAICXozf+BuCjnlA0pvrvvURlGwBQAQMAAATw16U8Y0+IRINmV+Gd5MlH/sNDmCr1sFckwzM4AxEEFUdLayU1vKl6xoNhd3706fyWJ/yYT2XSd2deL+zbv73zn8/x6NqHJu0ZifsF914zaT5Gwbs49qaj44WIs4/zCIXIGfLzQRXGAGzPsVjeK6vu3TjOcovAc+Gd0HsMC+kMgO76mPh/e+zdRHfB1NBMmk0v0ms0xLwG+M+quKs4X9mOQADYZgWxWgRgwKe3EfCVb3NRUDhy50IeZ2zHfQ8WIxA4hFjUvLKYAmaji3HQBFtMgDyBi6mgTvIiLkSnZhoCyNBKWIyAibYehIfJI3ky96EymafQD3vt16SbbIo+Hu1atemkZmKohmolBm0OHabMOInCYvWEHRsWouFk42zVeA5Tdc3YZikPToY45RtOEcN4+qHUqh3J45UGOo2bnKjlM06ulQmatQipk3TqoHdC+x3FXKHRoFNub9VlwmSPKDqGSnuCLA7MEhzjXHGISNhjirtDYmmF1LCdAZ8Lt28hskSIgsdUI91qSqJK5xgnzEActsZqHTLlK+PsnGAZq6ZS2dHhRPUg5hh85tzdyEkmRFGggHBO3WYmb0Nw0Xsrsc/V5+6OdZBdsV6dsQfJDvMj0mOWrKnmlCkWr8kxKZOiasiJUXpCtGWNj7bGmVLaDa1km+FhWg0essWQQTYbJd1kXBFpNDrIBj1m1et1nS7pWh1q1egi1TozWRWZdGVExKqIiLgjWsnycI6Uha8iS8Nl7QpLVkmoLg7FLGdoSlHILLIwBB2zZdfqguDRyg/SeUFySm6QlcwJtLIDdJaGrUyNztCsSLH5ryLT/VPSyEdkKqmtZMRKUUeS1a1kkop0oh+lJCg9ZLxyszilg7RYb5hhHR0lvGyjIZwMDXGQISKFrEqriCSDg6xkEFfePvVAuZEMkJGkRublT7aSatJKkkqpuEolVZJ+Ei+l2EthkpGV0lixpVIOhuQPLpIli737GgUuHyPfJXDz3RwT20WYcBfbjbt5+Ez8F5zC83IXWCami2aiulAtuLhuppvqfov6CxUD92SYCUf9IpA5UGKiuygmzEV3Y24eNhP7BaPwQUQrgc6h4WMl4XnnaF5n3jFGYeUxtOhYULFUthZVHKOmVwyuisry4wgtc88fGgK/tLxjw8XlJyhQI+7jGJZe5LJwSiStA8LhsQ47Zs5QAne0HdLBqCKhXlSzmK7wRgKOAEon3/PeKXY9OxcpBQ==": -/*!*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,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 ***! - \*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,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": -/*!*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,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 ***! - \*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,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": -/*!*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,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 ***! - \*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,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": -/*!*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,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 ***! - \*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,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": -/*!*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,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 ***! - \*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,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": -/*!*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,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 ***! - \*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,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": -/*!*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,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 ***! - \*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,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": -/*!*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,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 ***! - \*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,d09GMgABAAAAAC0cABIAAAAAUrAAACy4AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGj4bIByBIgZgP1NUQVRaAIECCII4CZ8UERAK6WzdHwuCJAABNgIkA4REBCAFhFwHIAyGFhsGShXsmCEeByDmTVwUwcYBtPHqBf9/OODGUOjDtAsmiU0lEkVRQkU7l+pLlGQwLZMxOLCLhdMIZy3bRY1QQTuHU3Ptqx30nURGfx0haBQKttA1HQsmFkFWqKlXK+hDmy9W0XxzT36bJ8irmJVrInyAOUJjn+T6nzqy97/AMuzGS6yNI+UAA1RpzmFygNEH5OPuOmwZmo6o6Hb6Aw/AvJo8hrGbmlio6XMqF1ZhzZiYtV6I2eRUnHFOxcZFca7TR7n4yD6e/9z7v5VkJxdXmseZ1oWqzSEcwjdjEI7xCPM1QtMf9xCtthQ3JUbvhRA/iN9rq1QvYR8aZCi9CjVzMfAAGmZY6jVIQ/cuMnGI5Sz5MvaGpthRaB9+f74i3IazN5rpCyzlpbyYr/9pM3fb/6TdcEVto1j/LNk6wo5kK9jutQmboAwwmWZcZ9DNChUkCUQMaICKcxrOhDcfpp+2H1eTZWl7w3aXa1UnHZoObmZpFniWjkiecae/XsgW6uy/Ip/PVLOdxZDikpeIizxnXoTsXHSiHENR+bmpdv7McHZmFsBgCVpYKJEArUdQCRCpAChhFV52SKkMsSN5EeI5xyqn6lyF3Lko3RTuixQ6u3TRVX4sDYs44k0JQUDOjvnqm2Rm/BoJvs2JFSti9/5/XPXwm2NP4yzd9CmVYXchCIxONPo+aXWJAoqdbmfZJ/Xpl4hnp4W3mPeX2AG9EoyCsVt8gcYFuEBCFe1LoGhXb9fA6dYRD5obqgDRTxqkagDlqbSiAUZelmtr0vyb5zVX8xEAr7tsLALgfz8lYUTEeafeSKoAoGq89ZSp7QwNjXrG6/7cvmDIsBGjBthBYyMunjISGo6S3cY4AWp2dusDM7BiutOXT+yHNIOMCwx6LLvJJNp1BDB5zgz/3zAM/98HY3pjfQNy+dwBgOVo0JoAbS9oe4D91YdahR3kXH2i0NoB+C91JuwcHWzoFuLmvihAJQAEk4aD2liNvwVYshPE5QVTCpZg1hFnkn5eynuvJUBmjh6OzLBSnNKM58x53/Ylukce6O4LUpKxnP6ADk8eQg6NB+Qh5YAA+Gfqn70P1HqquTDB8s8wMi1vbmqH7/p+QuIN0H5tvoXTu2/9r2sfqfINQC21FKf5EqKWrBNvanhNG4NGv0O25NYSy8YMtNZuhz2iSr1NOsyyamZzxDCzv9eEQda2p7c5AYLeBKHksPkNQi5rYO41ZsaCNSe06DHqfG9XHfWIVI1mbQZMk9Frdy01zGLOEqtjNek3jsEOz6ofJz0RsHoLrbOMug2Elj9ikc19P9Ee412GRZeaaU52JGhNesVk0pz3B+n4BAJ6163RUul9YYC0oSlHpg9P9faYu7s6O9rbTMZWQ0tzU6Nep9U01NfV1lRXqVVKhVwmrZRUlJeVikuKRUWFQgGfx+UUsJgMOo1KIZOIhEg4y58fHT6QpTQpub4+erCiUpK+3PGD06uhS0QfC9ZZQhg60x+5ZkMb4zUbBEjX7LfElRycEPqQVuEY+rxuqD/m/rBw1JR9mSknTVBFK96mSKQCLluCpbZ1L+kyNaPLu3JhxbQlmYD10hxKEE6vB53oRG9V/lRhnfWMA5YNu3WkLRmcTE5C/b4qWyqjNrikMlcLun0555JyW+Fgw8Z3QnWwQ7tgXGIuf459UAF2SQTteDFwMgnaxxrPjhwvv1/LJBvyvmxvMutniU21khi1VGQ/bEghe25T4cpcwf6w2f3MxGWo+TTDE6jE0pBhdAXozNhRtSpbNcqYKa/LsEJrKwc41A+WhF9qyKVP6OMoV5jxzOFxnywELk/2mb66/x7PZPJ5l2ACnqIWJ2zQuR4fqXAQDsMJd/BIoiH9c170a4KKCb9k1EFzUtPR1JdUfxSZ0KXE/OjLqzFGa/4zxOgWGPpBOOCkLQvZf0vhfslwSiMt5jS12tupVpqJ11r274BWwG5KqBa85m4iNGENYex4poM2fnS+sQNBNkWO1/5z+tR7Xc41U57X+1IOi5DjnrYw7d/zwYrvweMqnN/FNgjXXXIrWKcZ0o26O6ssZ5TDAyF2NUd5S5YGh4mlQ//7wxYukXTZQ/UwEevsw6RY15AWNYZLH6lHGU2iDaB+9L/ATW7S88/kIC+IEAbuqd74CLtE4AhZ1HSSqBnjn8+qFWomrLWNaqU/TOFNO7hwCqG7kTSLaW7Hx2W87dYwmo3QvGzRaHjOsInuw+DXwTnY9BCreTq7hCOtHO1DSEfAJr6Ki4L345kUTrJDvOKxS+Gx7Kdl1LT0Wqol8lONaiUbiTppN0tJMBz7iVtuTgtLqxaBFwOI0iP+nvZpqTfuVBlzTy1vU2rISm6unHgNYzlAlCNnaOV9p4T1/z+OlXpNqhOEU7JJ8nu9/cQy6y9APjwKA8dM63U0QLpbHGJPCg4zOKFxylva5SLqAyQ257vc4EK8NmlrdVGtD8YkZXQIsonX25fcQhsP6T9SkMALMpOVxufDGSsaqXVX2uwM2M2rHfV6Cp5CUMkGZzT3VJU20cuQfqPBsqqDwi0+ibJph8FOamhEm91CZc1GxJj1+GKDYEKvHrDJASPSFPIhVYpuLbURlIf23TOeHecsxzVs0BtagAxmjwQlSJ3VTTbewCowhQNrJWPReO+XUkTC7mCh3BXpFntHtl9id67MN7ScBcuGcmrRmruoRTjDdAvn74GYMBg7yOH1wzxO27R7342IonzWThoyfk8CNjqspzVRid/wvJLwwG0TnFCjjYVbBaOzA+hcN8RJiI2WEpLVbq7yUo7pisjrEUwXhfG1jBm3m6ZSudV1mpGYGHfGQrAOFlSY17hs9MF4wUtEdH4mqKAyTwwZZUMnBJg1izgWMRMEQDVEfm3SZXsjzUIcuAgQZlijEJxchZUbZo7PMxuXgEHVM6ntziU1bJPSRraDBcsSW6AeCsUNZXsDQdzkEwwbhfs+OmX8kcPkWLTizu9l8oRo2YOTHV462i6cMWz29dTjhZGwycrBJUbfoxv1sgQTDqGsxaoFBRX0K1otOhmZUhZUSuBr1dPBPzMyU9x+kHjXxBR9SP1JqSk/PWkO8lgOqwO7deCABfq+BU4xcYUtNldS1LzNbndkx/tOoExetcGMFigVmKuxWYgQNYalKAQO5UKsloYWyjMfcD8HGqOUGJvWTVzwrPRs+IOvaHulot66lXtbGnSP4onYjqVJcdW0+yxSk8xf0VuvInF3EFFYyzGau2WB9SZYM8If8cTNKJ+uX8kdG3QesX/6OLv2IqKtZsazWrYv7Rdcwhko8Yu6pJNSEKQotS+m9arD27QKEVEskQz1dPZXakiM8ghURRaKA7/IktHrEuFKE7czsuuReMoh3F1cp/0xItnJIuMFkc8owpukSd8DgK2XQFCnzBeISgYquG3tr4I0poPhtAej9pTIzS6etjEo98VcUiItrzF4R5nYE+bdgnLf/Jt7gEYaAzH0DCCem56HyX8myc7jMvo9OdJ/7MhVduK+AWLJv2DuUVV582q0C6GVh/rkWXviNd9ssn7is2jdN9GzCFlmRbwv9CU2Uoh1nuwSafZPTewSf2fC50vcH12SlxgXjnPK7qv7BkS5/L/R5AjSuWnnHQ/aV7ZfMfMWPwRN+7VlIpbyK5aAz7sK2o+n3SxZLI9tZ4L2zExg1rI07FhExwk3q8aQ/p9ZeFT0UVF/tJ7l1++nMySnE1SUOMafG0xaSuzhL8y8hWHpLWd3gNay5iUvjSWm+FdVnrkWqAiRR3A6eZr6AB8ZO5UHSHY75EPaX7bHLBv9A497V9FTkM+g3v+j8L0S7eyizn4l8NQXAIVBbCZtaJVdsoMNmwwq5a+0C/0kgRAYlvnhiA+5lnUAAkSAfVkyoBn8y4mQ7sNv3x/32/6geELWfDpZAhk+Wew8qTCJn1ESVBnGlyV6sRAMVD4mUgDBw0ItZB0vSqWAFrgoQSmTpqf3Z4flyBYVAk5RUZRNoS4GfxJdqCXahqDqVKmEnl0IXTuqsIo1vq6ksGK/xKsQ40UZNyU6X5ZoTLNQqLj6LNF6ieehFJi8Sv60VBT1w5yEh5P4dIj2Y9yRv92ePjFc8d6ozi2fwY/jCS942XeuVaVopnv7fG17RNkCSpQXvCHzoxGfBgMugtwfvg2or6Jo5YDz6dDxnt3FEZA09m4riwU3N90bgtnIkKe+lrIBJIB6aHWCSGhxC6lKmBIbSCHYrIMnJ7LkPHfxkWqE7nIEhV2bwa9DiYbS6cJ4cHDilTJV1DLXq2MZ9+p/+wtf1bf4+/2wB8oFOelt+3e+BSTrDCZz6/nxF50YcO/wkZV0IQRN8oa399AjCH1QCU9hHYUNbK9RcTW8DE/Fx2haN8ZF5bYBAvnAg9DwpOm1fRcI2gLSPJvJ6qlaGDZDjT4PKO0U5Cye5loFTa3i44KBYG7IftpdvPegXyzBnY8Zdz+k6MC3QeHdjGWbqTuDLLm6rc+Ay73dvGoSbQPUoiSbWhUAClGcRigMs2Mf2DORKoMg3pgGUFhZykYB+t9yoGRWB95IU7bDHWwl6IJSMBuxMnCjiJkVrBYov8jZx4jY2+YEuoyCHJfWlyYPbCBGXtoxTP527ys9+VoSQ/zKnEW0sWQ6AmloKKnE8yyDEKoHnarADz2bOugptMktvZztnwg01CJ2fMhV+RC4hXIHTvBLK0qHkV6XDcKSP5ZZrp9W4WPYfXVuqhJMQLh3ubfIfwIVIEHf+eKFILWrMgcUQQymAw0winiRsZpiT1xijQrSZm1iMga3LhkR4FNaFhz9XbKKOTlz7DCeWtTuYckcYJce4WToBO6tY83B7u24cN0y4bYjlw7T2QeLfhpuzr/K3KgSEaIb/ya0RSZxx7ykZB8FFeYGFoIY3ibQB2YvYEh1JvjeGHfb2GwOzLIOe9AFtAzDVVwSOBOo5Wuwmimr6UDwmUqLDQsfcVwQsnM2nkplNuE3jUSnN+vtCE4ykwUEdvPcYgTUiwsrU+kTgXsp8lDpydHqHtyzKwOUBI9OJeJpMCQcC0dVS+EKzkM3VCJPrx8AXHwGibhwLXByUcZTWosCuUXSEuXmyRwwmRVNU7pm4nDzIu/F6blv5Fn30rE/Vcaa42UfI3SAqBnMvA+L+xlz90oKA8b3y6ao3sej7kmfUNFaSOxaHxCTIRqV0Y7TgwHdvnr3R7KHOr78AITzaPzzDlceQlFHJQFxNhTCRsaxGnOaB7ebhJdM6uGpMeICWapY/CQ8RWbMw7/vZM9jya2u0rgkLxqPFpyab9095fpQDW4Q/UznMknEikrlaikqfiekJ21Jnt8+urgxA/TCvEnDXtYKN0Kn/OlPp34Kb76ZhvIbXW+PY6Gnya9SdYCfcvo9yfnMNW8RCC0v3nSJcB34xmMxyCNtI1j51JEPUAU2xRtIN/yWya2npY72ZcGEQ6xGF6adUn8O6H4nnUSHF1FjuMhsRz+bYNLTXqtcTwrNLu4OxDMBvfXsU/CX0sp7gUg4aejZPpp2HId8TWg0DprQMBy3EGpEtnSlttsPDSNUrgwOQfiDWqp8dtpTKUoBbtYA2+sGl64lc4MLIDFVearl8revPy6V4BlDBn6KcDxUT4DRSQTPZy+184CUuk6mdUd8INL1lPiJo3HYW3jYH+VMyZasOEDS5M9Uiz6o8rtrEn12zrhN7tgyXv/rj9c7isMRXGey52k7vDOcyrLGcqF8CG+npe8GQTreUFlw2FIm2e8qDTRbWqbGH/0nXXMYc9dvEET9UmWvefbH4KG/y+cyS1rElR3KiefwWcjq572Gv0/05YFMP1699K96XnEcRY3EDi0MRBYabgsPzZQ9TPhYe+PW+ycEK0ga1EIPXEN4KV78M/hkduVT/6AJqCYoRypBhVrrZnfNXFeN9TFlGzs9O7ZA+RDdjrW8J+7r7QlcD6Xj+J8UYBRalkSuBluG8Rub7ZeDejS2DZo7d/lH7wfX7qsuUXeuOkCcdo66OwyBC5CjQfqLjnFOnmagFOSSvt/kP+KBcYdMBp6GnP5xsPnlCWPsV7zXTMdXjffytb97J3g2oz5nvtp4fNF4H99g4Y9n6dVF4zkn4TelD668Z+NPpDcrikfzTiJuK7t5V1elM/qPCnn2eolgU9PMurzY8S12brIZPf3qWN8tumKh2TRcN271M0KqV+F4hO2HzeQ6vBFegUtXkrMSi6q5wgRqbFMFvrtURp3rVh1PLddsxjEi0KPGuQR+XhWiABNXhsYk8MR4fKQwqVdG7ZHV0NaGq26mBmWBpYhp+OTz4MlpsA4BqQrvcnI6fexxxrWMizEX/P49+7Tji44AhOUZX1BLqSf7nP3pgDJNehy6fxBSaOaRbc3NiR+UXO8eXWeWUarSSEVYYN6ZNlA3yRz8pstjjbIf499Pn6prugFv+htYESOvMolxOqxYj5sLO1+uKdFH/QVp2SmuPNerS9wrPzfYe5aiIg4F9MUPTtTDMSKLSLWS8XojL6ulDsMkt6NejKiHQr1+hBjOVIgvdJhpgNHXHhlMh2d79Bza4ILs53RrBDgG0t1maWcOxdLCRsnIyegYg3/727EdMn46lcjAm7lVy9BMkIVkwy+L+2cukYwY5GZIeOzVqCwc3qv3m3CMm2K4/wkyBhMbXwjCemk/WPe684O3hDbexghO/RWVO42cqObjIfL+2PRB3wQmSVU9JL620eyq2dda2zBC5rf193cdAHKODS9uTJwZcsHAcEQ6NaU+Q6XlnYE2qn63jp8cdsH6EzEsakpDmrqx8GJAp/TjuCTQNn0C+oY9R6UaIYmERjSuRRDvUaIdnz8zsTV0KohAJVLIy5L+d8KPyz4O/NPTdE5WdqVDEfeocLt74ARD3b4tr3a1Uxb7UPjfsZPMiv7c2iRRBXYk7Fw1Jq5ZyuAR9BklSvRoyLHSrrYxr5ivvH9P7At4a993dYqePFaRmUuxturj3y+81jlmY0npNamUQo5rspe+V/LObClBiy9uQi8it0q0xbrihPJ4EZepyRxEzrKVKlNULqRyCmWcYa6k8Xl1cems1BgGOys/ghatFKQqCGJRv5VaJ7HFPknpTjdHCcU1PHKEW0EmISIfVcNGqxhqqeUKLagTwjHkYJuEse7s1rGlDctWiws2gEhisKhr0qHnYSelH62Bukn9AW+6ctSqYVIw9d2k7yAbp+bp8zcfBvwXe/T6lngrIOPbg48f9FoxwHC2Tp5WSesDdvM2qImuGLcpp55o59fSWvN6h0mKszGfOadI6nr6cQHpb3uFPkPFJucnoQpDU9+3hD9ExSblJwbut/dLveYOuvMMSuQp2TW7V71FFFaRUMRq3Z/ptfbiSJDRgrpkjbwkDzRW7ueEDAfUmF25SvUIScQ35GGMJRHujIWBEdvo8uyoP5VawCKvy4aehZ0oezMKVPkisAcZ2OMe/R1fwibRYCkC1Ke/So2jYB5iqvy77BULSfhw2HW3pvresJn1se2ok2TbKXTrRNjW4L4n6pqbgzrKRysXnBuuOCV8WFILfDOqFbBDaezMPCGVUkeG6B6OBufzzCZz5klpCbFviC53QLgn1nlH0z1SJ/twbqHEouQUqQfZk1PggoPzpWxV2NwXm2AzAg+fHIVPrgiXwTtbMxOh+0r1YJ5fU9n8NA0JnIUc/2xQ86+tL9fD9NPVS/+pF2UnUJRI7NB8f5Sw4RJttFdyNlCmCZrUF9iTIzp5F1bLdVk1IFUgwsJRBzR6QN310e+lW1JLgnJLMzjDsYbQCvrfdC+yB1w321Gtt10Xs1akrexz07rX09toYDyMGyDBfIf/nfApXBTfqbx+WJ7stbEoGkSJmQlNBcbhStME3H0tG13qvG4127/Zer20YFXayhE1a2KMb+WNiyeUjS81rxN4I1XGIUnwZUK/AOsW+9kN2jo2PRPixl4QWI+WnDS7UOBCGUsdMvdFMBC4aWAbbBDezjGwGXEEzENsSI0VpsFHwMNPttQyKvbmTPdXZdntaW3n8bG7rVYCd6TKxM/fJeimoRaiKG67jj9R0VscfpgF5sHO10OWmYZDLMNfELKn1uwR2tR6cBZnRcEqTr5UP9iRX5i4sDp+65suPFx60fzsivrZzLOVI8+GniF6IPrrEezIFVL008w6+VRCBf+ABtd+VD//elD/XeWlbF1fg8IoVZVtYXmp+c3y/OfEYd06S3ioQiVa3VDX+zqy3I0MkllcSl6baHmej16vZTcO8yJ8NLhjwjGLe/22svKiG44DwsBGgtovJ2RZ3ggAOvkXberOrTuvfPT0+bu3nuxN70HXcvYViG7n6O02YD0+zMSLqbfTb6SegZLW78vmsw6JF4M31w9wfWPTi5HsfJYylgjh+h29uHDZR+DNUx1Or/NdvX09+g6b3XNkzUoNzLnZWmB4vi9KsA6K9mfT1gDxw7YJCbDdjCb5CJrcWhgFJM5W2W2o/usFYnyZQrZM/jCxADa5exQn/LhiLpPC/LRvMhsUh0nArUxDxWsAtqwUtpnxg7qpekjg93ibCAp88ueu6kO26+KCVVkrZ6uvWxg7b7BNnIIiFZgfb8x2Q8zaMjd2rjhY726k0nj8g21G84F8jzVpu36HpbGLJd4BMvytd8avCiJbi2Ci1pTq6CZ/8srn/SP/BG02wSbVDgHBevr2vKyxYjaC4B89SA68E9ew9Hlb629nLCm+DT+eO/e/FEo/7X3pkxm5/WyYfX4Idfz0hvL/warBw/oavz516qPygU9dYiEtEZ/TXtUcmzHdyK+2CEZz6+s4k2mnAi6Ld88+XWQPpmsUwtHsk/DbSj3+xuE6JNVhlh3dMN3VLjhzpPp+Yr0JkrJzrKPiu9cqMn5ZbUy4UDAAkxMz9IL6wYHgryDGE8rCXUsx8ivyH/qPrJs1YeKhUGvIXAAP0od3vYzciX6HE9zXLb8b0snKJF5vNMj7+fg1nSHzO8ONuw2t/ZRaLL0moddnMMckahTRBwg1CuyUe22iOG5EzkSBIJbLNYUP+7QHd8uODhm2cdWaxVx2UyGL2GAisb0cS3y0CjWNM3ddMdVbrEtPK0lJSSPoQktdgR5eS6MThl+ehbVwaREzjy+US+Z56iX4IKR0Lq2kqYyZo1Fwu3Lz/XmItjw8IyMVhxMUzMT+G9edD91Orhf1J9GrhYQ0ZRmrJRvnXxbWjybzcPkVTHmGylcW8fsEHr4aE/AIol+UsLYay6JucI61mJdolZzaRDKn1Nkr3PP/3t9HUjT+b0W1+h0JJVsujxb6P5HD3st7KrnRN3GaKxrMU2cWKolDSeuewv3YfHU5GpupTBGWY8xhy6K68kkkDxL0x5R/b1iaP0WfX6jLtgQvM4ylc2oYf2fgDgEYduLEi3sQf/BG5Ysj0hfLYA7thOHQqSJdCMbZH9bLk0IpunyBLsMStEQ3Fi1Uh+yzDmiIwPCGmXL6JbMfLGJT9vW04usVSAl72zRxWpCUCimyhptmGdZ0laAjmVSOpRUWtR6CD0oJZpiAy0ILqAJyZwgzJKGNHbEWrZKOZFEbCihZmnpaAdhR4FOmKVXIl3dFcGAmqJu0Vufp7vlGVJAu+r40pD4EOgS9sDX2thMkkX4AK8faUI3xffyHVZ1zeTqcAZwDqkzc8HC4+ka3v6CKIbyVdTK2k323uLsV65MN0hKe7lvVOcJ+0X0F4hKm+wfApNBDLx3pE1u3S5LVWR4450nu6gm8qP1Bf1382Lf8sRVUSdqQ/eir+BFq+kbyrMnzmLboTp/04HXJ+qTpHtngUHJ5puTyWb9XP3lFlXJHYTtsukPQAyQvfKVuHG6t42KJzJKwXSLPHammfeAschhCS5R53cHjREVufzWF6BSW+HoLS/2Q5y2yw7jw1YphnIhryMGdab4tgaFOMwMBYepIsABf83fwEjbPgxTW/fE+vbrQnMwqasnNNRShPMo7Uv+1pQK3gUQEj40j0WbZnffDT/g3WkEWUmAzpK1/sPOAO7t1eGHz0JlW4IVzH+K0rO115KK6tk2cGWqDkjGMPJpepRde+vx8ZAOtkfoC3gQmVarMJEGWIDQbiywiuLTW1g+TQ4VnWhjqhzxfEQDjHCZV9uTzNS1mlwaXVxMJtA4VGC/YahkhTEvbM0vvcGtgH8aPgqGTrzcgzqnSBeeHagqHNt+q/ws1BamdJ3AHlbGgqoXyB0WwEcDmQ1edZ1bDFI7cUSwp2rgi6+nFlITuBrNis+KJZUhqmsIdehnIQBQVy6Hvb7l0jsCpGAUbRy9og2dO3QSW0l4sFW1eln4h4vc7iBmXfYBYiiCnKtz/enxER5YUV+o0IO31/69C8FcQ7QqBM6SMA6kWTIIN5YeFRk9c62EyoYMvKd+4KzP34iUh6BwYKy4xilwWycbo3aEPXVkInqjKDwJh98IKJi8YEKTKI0KpFaL5KGjobRdHF0V6Tx2Wi9PDCxPaLlkiywa2VMK7vSrUY87JbvMFCjQH4XXj1rcXAiAeLoofbR76//NL2xVnOhpnsvgdx6p4V1vVMU94Z029VpqoP0uRwpPmjCK3lPr6CSWhHs2ryxgPWucZaqeRAdCe2+aVQx5hjINkGFqcxCBkAXo/jxJZmUFPN1aJFhNkcyAtaV2800fgRWfzEdhwBrleknWZdZ7R8CtZFZdRiCk1UpDu0G/C0W5NozPHkNGYuPhCDyzwdsjQKX8yhcmirEsHnoadFF+1eWlfTJ15f18q/NQgMrLLl+FaqFQMY0UCQy6mtQTlxpwD3g71rqCPtzEOAP+CGHaKJTu90phd4aW+8Ytc/d+7T54zTquZRtQ9Rwy9E+kZSEsx1JH5rCbUN8OtQ6FQ97zXvFeaePwuSp+seINxIjrvVtap6E7WXXG3AcsPeLA11iVIHr+dmHbmvcrecXx1bqN3a9mDKK1nlmbSp8aIL1O6u85E4du9A/LTgDnjgITau7IfN0HbpPWyx3crHtvkH/6l9cwOzZyrst5erJgG3a0USUlV+1dc3yoLS+RxQOA/mGWO7rH1fTGo4hXkuWC57NyolbKbSWApzCtxfXTT+NyN0itz7rcfeWVBpDtXfS13N/3MAX1X3ELzptf+8Z73/fX5W2AFpNandhX4S8JvgT1vB/csgJs6x0zMmEleUxuB22ieMmQgRuhd3byi2hR68kGhnzKFhebgkqjJiQJ/ZQoTwwuJtTyrHchCV5PBhKhDB6JBOSxCaYWR6V21uF9cPrBB2Q8EAoHptEpv2JRfs2fo2ObOl999eR0lmbQgEVPB5Er46De02j8CjL+7cgkbhNR9+Z5XHGgucLL4XBQJk30W5U0ABBjtabWh/7t/iH0+gZz/5NHt8eqPHs8NReIP1nXzBML6OeKrkT/6m9zcR7rcv/U9FyEn5IbG40rJpFhRWncncVnRQn0yNHmTrekXmnFFurjD3FrlvDi1DX62rfiKqdV0yAfY/I1kI+LkTL4yosnfAWQ+azUjx/czTo412sx7b5XmwBL1iH1g8Q2qi39/b3SNbxTI6NVp5EKcK+bLXU/Le/jhrqv35xnlCWXxIh5DmzWInClQVRjrCDp8cTNmYfp2sUakjwAC7d46Cur5Vve42EdwBCgCjGK1WpEismPtybAzIGXM08QL+kRhCTYa5bNY9k8Jmn/JE9iULANqreTmM8j0Q2qoorGdLDShgmZ0Ou2g02iXHRL3oESbUwPbv6N9dIDmtJeO2GE2BcejR1ie68mKaXYQ2G6y7SdcMrrv0h46nhdxLQmlgZc8UQbquL6T/CLKZ2R6vA+8Du94QC78rToHD/5hdM2YwrZ/iLRiXTLhI6us9Vd7pKZH3/dF/Q7A3vsbIPg8HoNka12e2zBwuYvbGFR9m/D5GK/x7LmTnZjtW7Bf29t6WnHqQb9f/+dM+mas4SE5yLD/0/6LfeecegMQYkl/AUQ4qK7e/VR9Ozvn7qS6xMs/O26AnB67KHufeBZyZbAs3g9E0pSSFJNCaVzjpP6OEYf00TQtEOBQ/SgREUgCkA+lot7afZORIghi3qnZTAD9dFqxsnZI9odU5wBk6kiSbTyab0iE0Z8XkntErnUemx/m8Hvfgv3vfYsleYHXVbgZljA5JmTLJvm/IPgT/bHLEs+Mo1zynW02XNE/x6KES/6s/Gixi8aAsOceuAZw42p2eXjZHB23xNNyaS04evqFdhfKVMMvL9sB/xkh56AZZmstWDsH6hgTgWIUicCsJdR/gUNYS/4fPBoAPLh5bYKDiJx5SliJuVHuV35NtRpKIcCEg4LFKL4rKznzYZPFaDAuqtJGFqd9KTHK0DaKW8gKpUCVs1B6z9HT35RBAODhs8u39w9QC8jUZ5LSfg8tS6WyDHiZrImWrXHy7Bq+aV05OEVTmsqCLayOlDAMaKjedUZdxYYDyA8x1NNg7+8U4t1dRWloeTGep3e4CLrx5C9Y1IzC6ZTaMhAAlaa0vNu2fbU2xlqOeDXBvi+wKJNS84Jjc9Al9+0ouzLBGH/7yJRYh4azPKfUJWkXe2aAwDAyI18L3ZJVschvHyqGh6Zx0s7/gf4WK5HZ3K/qWiuJdH5Dwuc+sF0snMttL/zhZ8e6fz1fgfCT/aDH1/tEbrosJo88TlPtQQP43DofQQsS4zSISW52u8jyTFgL5sakHZZhiCkTAFgE5wHM4XGXgf2yasiskPsQVN0gXRYhO87BmnZATeAmdrAAcT2UQLrWbhiPijPKbXdT+34GpQvusuNW9SEmXFDEpIXOPgc1SJeBqFFYx53W+3ht9IaTRpaShJCTa62a2v3WHW40mJbhnqUSlYEmitaRELdlx7zk8MuZMUpBN9yRKplAyT7WDWoPyG6HAOUNRenOvePGIIJOJCqQguP5HCv0TK348C60Y6JhGlMoPix/XaRJxEgVDZU/HjGXxIiwf4wAEVxxHKSdGhNWlCsfjnQoxVN0M89QzhLSRTKIgawKde5cPcUI46Lb34gil8fOwUmEKBrCXCjCsGvdbqKIlKCNJGNko0MWkA9Bppnr3t9bC4aUwix4tqdlGE8w8wY4rK2r1WQCnlLZEVZvRG2a6IpxZRaq+AlaluQ7fHqCBCPrfXRpOPfgNeTK51FRvHz7FtwvFsLq53d3wRPWKJN4PsX3fZ9PlJIM02otAcLlcZXOeGYsve6IOGdS5GGTCcOGyZqkDi4lT2G8ssgmE2/iA/B+nifecv7ilsf1PeA2u6k+920LALnxwiuUz3XGquuiBtYs8atvzt/MZ5AnKjCMHM2tLRDHSD8z9SY2ny4yn2PdD4O0hYr4Rg8rXf7YtMkZGuDz+Q3whSMnaCrjCJewn6JYoMSgLwFpj1wQQ4CRdWK6aMLWQs8xhNF6RGyfqerHy3LIpO+LApxTfwNx9G85v4lsNrzVrLI2y8bjYjHnvPZ5OcsppLkrw1tGtvw+nAS5Njuapk/QcgX8KtOkQu/PvdcfyN3b29vV3t6Jm4W/iTiAD0+3H9RqPo/qSCWpaWCADSPiYivmquA+tt9cVgaTZ0+JL1uVw2y5oXncLjf/9/EJqbxrcGL6CNsVHtYLIyRGX4MT6n63s7m8/HLYpI/uafD1/zP3nZ4Y1/3GD/VFiciI07eUlQiGIF3OpjiGRi4Nf9YnbojvmiEaDLo4lFKPMtO+mShuZHjhdk2X2DOLtol0WohfX02JYfb/l5uTcmALb+wMB2VSgw38Pl1eIbghN0/9/e7kpLxPU3K99nx4RWPBjyfdG2fCBafW/PQdOu6pGTgnBB77uhNyrNQz+4eLmwugGf3l2603AT3/eBfB+jfk/7uubx9rYw/dGYAt/rXAxRdc/sH79caX3lbbX8uum2mtYZ7Lz7aphOTMesIes0SP2K+ts7jzjk56v2BxAcwc/7uY+LL0uBaTHpKxpHL8S9qdAIu60/9/118yMycpHSqzWG8NDXe5d/3Yq3PjVGVF23Y72LdaEGu/6/PxJv6spuv/ZbFQLXaxwhJ0uR1ZFmzRdWXLow7GUD1U/0vAB0Mj8MJlq/teFiVbVlothOIl0+jBrc2DdcUbvMIfl4l6deER0rAEr6VZ6m8P8Fu0ibttSw1XwFeLFNFa2jhr/7aXqtN1Lo6ciEhDq41ViREgmo61Wh+Ovvo/Bh7F0m/LDKusc1B27knMj8gQF+JEhIiqNpkksZVyI57oLOlJ/RYsBfi+8edNbUFpG5u8F1lm0upNTcQKC/xquVjDXV01jdiyrt4EavS2FioicyMIK9sRctXURqJDhSy3TjxYpPC5ZD21yDBcRNBgrw7QfnIjff9fM8aXnhMYuQNmAMTI8S4OpGoH3kZK0rVd9i7AtYRux69lZPj+WoE5Hl0rYf1/rcJwg12rMd7Sr+nEnMa/FzsAMhq41g6Q0FTeUQeZBFxASyboI4H3G06tOs0aKMkpaCEkSugTBK7iSROmOq5rIOEoB61pCUvDDq3SrYSdYOi4Vmi2gWYiRVnTdWKS6QCpyimJzN+oEE/STPWQcV1bG1WkZM/cGloaB6R2XrM4U5QZTYZGuSrKx9Yk8RK60SxETE0UJFctTonLR/WXpml+hSurtHcSQus45FUAYqE1CmK2dQ5tvKyu4ghMy33NTAQ0AlRXhRagrVxaBtlWKyRsUp/WCbpcazgA7a/0lc1J1HyEdx7q3/53//7fUeFntvE9tK8hGJux0eY5Ix3A25czdBbxcn4wBmLBU7bxGILe0O4zwt1L0F0zumoV1w/RUbTLItocYyYnYXTSTp1RnNjHWuxEs41osgVwYG1i30rbsxJaMws75h/bZqKe+5sWV2vxNK1b3FgzSa7KuMNXG53KgL7S4BQGb9PIEMVQD26glxep1G+jpxeiq9VcRwuuTAeuVBfxxRpXouF+sdqJFOBXFa5QhTlC1aWSch++myjlKEhFPy91HKkzJyttIiNzLDl1TPmGJoZMg4REcjQx+FSRo/DBkfkxFxZ6cohCgiC4Fbw/AJcjBaejCIs5LWU0NGFQ86i6fvrkdFr1m0e7wqXqGq4GaooBlSIFpYIDBUXEymgyqQNSJYddl3CWIQaBYkch5Bsh4AvAZxOhGgo1jpUdqHGRDH7oWZSLTVZolgtLmtLm06s+96ezTqa7s3amJ9VOdS7v7kxFTGvP7vGso+n+rL1ptldtOauOqr3qvzW1GP49dVd9gED/q+Qqi2cdTLdnbU0Pqq3qnO9uTXWRq+3weJe+pFc/3Gz7ZdSOqIjXX4Ce+9CNwWwYFtDlvcaW4sIloperb196CWO1Pl7d5H4WuGryibkcmnwp2msfqfuVtfYjjoIla2Io88lZx88ERC8n8jHWkSpYqkYO1FyVQrYbo1IlvTLPAw==": -/*!*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,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 ***! - \*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,d09GMgABAAAAACJEABIAAAAAPjwAACHgAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGlgbhSQcgRoGYD9TVEFUWgBcCIF8CZ8UERAKv1C2aAuBSAABNgIkA4MMBCAFhGAHIAyFHxvYNxXs2IuA8wCUujN/BcH/HxI4kSHgH7pOjQQRYW0RNi3ioB1bjXasl4p4r94wOm+9Nn/3fiJCwHHy1o9qE3iCrTeM+AEIB0SExw1fWsOL3dO02MU+v473N7M64zwe4pIP6RUPRlfVCElmefj//Xrd51yYCX2ccEkBkwIGhWAMO0AFMr7gqoB1VlQa13cHaJsdqXM+NlFnYTSCTAQxMLEBsRBtjAQZomJg5ayVulIX+ZOx6lJX5dz/zfXvHcgAJpPwZmcfcRaK6HH/OVtA4ca3rKvsBxKuioSp8E/Id6YrZ2bR8JJDvC9nNwC0kp/Y98AHAQIHyMEyTel0UfrmjFrbfGrkRCp4SXzIWLIsVo9ZOUmvyQ/Qf2+bX4K0/cmErokcXZGvUlkT6FzK2xusi0C7JhHgf9Yyu03YzslVCnzVD2tmzwYcQNPAeqWeBWnItecAH/HndnkKto+h/zVVV+Ag2SfJjamuhSl1mErfnGHOshw+CN4BOFq4o+TH46mRdKFcSVMupKusFNc+lWFKLZQsp1Ta6X0YnS1b+pQ1w7SXMRn2vIbmAY7PT6lhSW33NmY1UWxX8VjALFIioP3af+8ppCWcOFcqn1mwALPt1g2xA26K7GYXORIjcqYUcSdgSFCIhoAVEWyClRBCX2xMVg+CuPTySCFgeb9KVjSNfliWUzj6kZxM2egnMipKVgGHqwgm4QP6ElaqioqEebDZAjvPxfcXQnW61wUIjBgRchAI2sjGbkjyq2TCsecGV5seg1ZYbdIWO+1xyAnnXHHLVw8C8K83Zn2l7beODApYsq2TB4MdGBYtTE7PLRqWVdaONHX0DQtf3NoN27T7jpy6cO3OoxfvPh6AgTmQnG46kCIEMmdsSVZAZpweHbyuNfM4BbKDjJC1JM8QJ4sxkIvqJKhADeEZ7k05p1YASSd8VYcl5caWZGkAl4LyZmKI9HYJaTT2NAYvm61dC0aN6DqoQmSkmjSqPWComoIXUXYrMm5kZmO+mxszcL+bxfQM1BgQe6O1qTgbktEluZuaRc3IEbiCU2Gl0ZVa1q5uuq16x1vIiBNxIk5D3eJcRV50TWwYYHyVMAe7ibm4dsgnns4qAlBFaA7QASgbN9GleP7lLanukSZDJojqMHR+hOB1SR6AoJ1SLwK8KzrJT+KZ/bjbvu4LuuLqmFDI6tJUbs27/98QMJ+yExAfAahXNh3AYeDEInNFLYQXOxb0uQcq8iAQwHMP51VUFf8/loQQiYdryM2yDLzsuDLRoQe6KH1qBgnABJS2BxViBO5KtRT5wL10lK6yplwq18qtzHrlbXlqT1lXrv5UfXr16NapLQiuoi8sbDrozq/8DHvjHchpMTNtG/O2sJDK3wN8apNhFpmkEZuhuNwqvTYaX/wZxTqsUKjHSlXGdYePJius1WFWs8oI06zKCmM2mbJS3KzPcqtSwUY78nBxgMX2KhqrIDr9AbhUqPnB19lsu0ZdloWPcvVa9VppglqLTkOyl99mVqVabQYijEo9Bq6mc2l9P1aqmgGwGN7QsbL+Qt7yeulwa0tzU6Omob6uVl1TXaWqVC5WVMhl5WWlJcVFhQX5eb0dHuaz6WQc/KuXL56Pcmef3T8dDnp3tzfXV91Ou9VsfPhOtrG+N41RmHF1trGvlEQVnTmbpSSFzKCU7wejhuB7Vnf7tl5TWjvFGh7c1vsLwlRaAxyXEknahxzrVN0Bd3u5pbrUgRpbDKU2rvkAwyUpUNYD9Ji+aUN6bUb6NgGjH6BfJsCYlBcjMGvnvIp448VF9sssRo1jNA1rtrNMWdSw1Tn0VWFI3F9KTVBGRQJjvnTyjAuEstzC1OeulcoBWfA9BgUc4y9lb8nDtIggLY/vrHRWWGclj/QtD9xQ0plqcq5oHx3LWlmXS5GgElP8aTz69Eue2yKBQP9favZXQsp8xcXt3TKRIe8YBAxuGmZKMpgO9g3d5VThV8gviisYy7UKhFei0aOJUEdu4tBwNICpjhNPEfM67RZG9TuxNpKSRyAEdDHOj7BAL3WxIfyaX/db1EGbIqrEr6Xqf4QkQPjNYAfqqCD9rn9Y/M0kVWEx0X/CBehIwV4aCTYd0XFDLAFbTEay9ja3v8WwjZsEGpQV7jHKpXqkEcPr2+IpkFURZr1TfBsxQZSFH1iTjFfajdrVdsAmO0uyPFPs4urVcrcek6TalayXbzn22jM2Vpw3svZgxaU4O6IyMNuecMN7MwxuR9HWUpN7Kk4zRc8WUdaQns0hQ/GJYG0kZiNym54lZxFJxlWYziqI0grigvPk3JBItQHXZv87rnOd9l9Li8dE8Hf2Qc1dgGnBcwBPKypyqGjt9tNyieoRRkytXOr2or81dyNrIJxMUnbRoiUXJqFeqaYVaxlyfNpVc4ZOnXTl48IHzbpj4wpW890caBoo74FbAuR85ue56QcZ5lbiizzlgY3+Qho0CYomTsnsJPNdtXIpHVGyxfIlxZmkox/YyfxNz8LA2PNYcWyYerfNBxDzcK/C545bJhLslgGuT4PQd0Jdh2V9q2nq1o4PY9fHXRx8XcwRmHXSIckZaT3SQo9jSHWFDb0qG/0pHtw+Ycx35GAjjesKN50ZOlBA0SQxCR/xGzYKbqKmECfpohVOKSm3IFVwZ02yY6UduHuXObLxrEJl2+PRuG3GHoAJWLMaZKdVjmKMvCPvTTSutZqxSNM8rDI4f927uNJ3uY0+CJLv8GH2KGWganYhNWMtgk65/MICQQgv1gHkFrBJyrSscNYQjaUygnCQrv0Wuoq7hsMMpu7XMQA2qN+VLIHVvKqzdg7aIKeQwGxBMH5z5hNJG4RFbyDsnqwszSmZeYTFLHHryb1eypoyatCc66BESIZsg3bHELvDlJbZYfxGDrdMXFy1mhi03DF3NQq3KgEmLMaGKlUg4dwzAlp34IIkpHAivyg+Yz7YMN32eeR9razkCFQrEvxZtsdwlYbfDyAdZ+g4baK5cyV5EqMAaX3bgL/uAAMFTCtuG2T0y3NTxNx7E4ESXCYIYYiEvxlyO4utgSxMBA2y8IH7BapoH/nIou8ZfOfCUNohGDIXSmqYODxuX6cEEDZvRKo9lV5qFRZSEQQMn9pWYgbsLIZF+0gGWc07QLQz++Ph5McPXUJX3alxYuUiD4gmR0iT3pcOPbJbMqxXlYqpZyDkRloxuj9m1+1cElTYgNIGJw0IVgFrE0DaSt90JQZYNYiGphX8K0Gq04MWBStGQlXh2lOpINveKls8tvjpO3bxnQWcVCceSIoMSlhi+fiMKqnZ5U1Lbu1YhvtkbpUTYKDN5JOjOUdlVGpMs1SQUDYKkkiCALD9NeNDUGqnSKuIlwGwS+kg3NqTuzhTYQf8rbvgQXQ4FHC0fSnPuHRc3DmoQez27OI3ENpDKA5kWY6clxEfxkJQWsNaf2gnlIjmz7ObDpFl1N9rnJ5jhaRSaOjCov2PPjPiyaAIr/Tgw7gVtkmhEK7KRl/4l2xA7EBRRDHwvS9/2w0KoNjMoGYeFd7xXbbMpToivdzQLm1adggdZWD2KK8ZtwklazntHK6cIRB1SBl9DABb/Ajgk0+Zx4RZUTwVeGXKJSl1B2Kba1q1XfHFbt4WQcn3xaIwQ5R9jREhLoOVsNITCPvd/1fPPrhNkCH2Aabt2Ie+/mR4Ocdt1Dt0uf7q5svI0H4HGQv+R84Y083pvlQpBK9sq7feMZ945XeLLN69LwhXN/Q6gGdp6te9LDANStGDnXaBlA1Vhlux7zPOfvW7/S/Jgw1yyxmlJ8mJ+l7Df9wosARurVp56ID1ov12vLbYu6Bs9ouGYky257HmkpXABj6mmWMU66ypHdKhqUCfLWWJhygqtqgcHIC7H8ycjSo2qv1N64D/7BkmyU4lMC3gKn+pc1JUwBJ/pfUihjHPrV8DnkXDbzopDZPpD1XJeyuwQQjRQfh0skfRNENbtmYFin+AVNgo2pvHVPsf+hY9YZI58mi1G78Ca8/HeYHxSaVNcicBaUBU4xSKZUHmWLNLmhdfOS2QI0f9LDBj4KUBAQEBCizwu0E8cI0/MP+SvwfYr4epPmxAf6KP5rI/fu+yJ6Aa4b5k+yd3JWC5xCVyLoOi9zMUvTjuw/YDuFifNxzFobcdG8N8n7sgdCmVMdR3VfBWCSNV8MbE0hpjGNM0eE8pFWUvZTxzJ33XHfvri85xXtyEN/vGngbfdNGc7q3eMHHsT2upZNxyzX2SAsxT02KtEFA4K4v3KddhD4JWhSjWNreuQCfhADcGZxpy39QVY4pUWfVdNV3BxkSTBAEpjqBqCqBQ4qrgKBy5KaUPfN4DG0SicYbtZUga6QyrAqrrfEdmIzhQWGc4uaFWUxWYjcEf5rW5b9Qt/7nffLWzXmu2FtehbmYeAgwyCBhb96sYLahqi0MByE0TEFIJSKdEMi0SyF/eVkDNiKZrFDW5KdvjGNrTkKZuyYbthk3O8WDTHG1ZIyvBGDPZBRupAWznqk8oTgsZq1nF2iTU6xIUCOkAOvH7HtWAdL+HoKMgy106kjPoj2aquR31sY+nruOyPzWUtBggOqQJOuXblGuxBUGzUiQadZIz34HMrmX83G1ALjfODI2TDGqMY1MHCrQYp+l62hh4yo2oS+TNhYQkbELy4ug2olA6HootKgUIyGuekVbyTRKlBIYSyF1aFtJTOioiXbuMnpmWtADgOFm2mYRQuTV/ke9FuP83PH5hhpfl1YX7NPh+9+V7EBDKBu7fMGTL+QTzZLIzCNBfjbAqgVG9YqoC6DpvOO+QL7kyWxiV+GhHIeJg3sqIoovrQXu+WyopQZ+GvtQs5ObQLos+ab0TfedJRPbG8JBU54NiBM8ia3pNW6xC6F55PvaK3MlCh8fmnbtbZlLFkefqQBsLYhAAiy3UUJCRVEC4EHCDb4BdkGVrRnmNdq0dbH+LgCXLW6KLnDCy6tpGkhvUs1GOZggFr270+Pd5wEJtONx5ebL4Zk+2vLDv1yzep0tr8ewABhWiKNvJsDXP+zsV2fhFh5LoE5SuZ10pmEFgLCrFb9kp21yM89B3T0IvRlWIQJRRqylhSjb8FNCmZ7K9eyVRsNtWWuiB0N0563tGuBdyYrt0C1yk/H8eJ+CH1c8XXY7ds8cgoORmsQrUWnBDCQTc45vC0fx3PRpRKfVw09oj/tElkL1qx3PZWx5y2tNoEImis/e8Jq6wXAKwOPclw+h1o2OWzaYIV3xsVNVSAHd7IG60PU224gIRRGCM7yfXt0c/n9b75IRtXQPnFUu+JWV/zcz3E4AhcTtpd4P2DLuCJxWS6GF+SA68vE4zw8m26w5/9Jndzq7EkyGBiwHKzFYdCtRyGl1w0k6pOA52ai5VlBZ22cUb+Rro4wPEYY++nguXr5vOp02ZxKPKi+tnTZqSZyMfLWlezqWZnSbcmVHdnSotOW/jJNVp4Y7a2u6Yrk/Ma8v9FDTrTts6r7skoDdnxYcaGoShFGEhHfLmhoMfsydtzLLk2lapUCCsCmtex1Kf6youTGG4x5W5ZoFQHoDQ8ebNAz7Mf1CZ40TpgJeSq2SoKzJ8ub5euD0SSqcwjAcAXyvVpBpgznj0HSv+XefHxL8teBs0vHoBVn9cb2/EBotI+aTFuASJ/iqZlN6nlTYYPqW3FrsAM6giivsAz/4EfwEsCNGJ6IAG7zB6V6322lA9CBfRDG+GBGoxGIns4UaB+abTiIKpKW7NNQssNj0fjPXa+2HWc+9gXOCOF8sjH6xbrGmCKrwHy19t1jvZOL7YOAtjh106AuzzzXTmNk3r3ejVzfpk/76O/e3emZtQ5xqcEVWkzMNMM7Td0Fhot1l8OpApcBA4RL74dPK4yOc/+n/R527g7b+IPZKiyQI1k+5OFrTGYsr9zzpfn9kEtDnjfHz2Mi5cQ+3i3e4ZPBNRu/hERN9g9O2ufY2QL80bRz83d0A8YveVuA/lRPDjsiPchkpK3fpzwvmqogljE4U6NNbPhynwC+UKApg+sQH9gUqEzRQiIWL/TaB4TRLJa6cho/WhESkUlm+m22+kLUwETaf4U4HOo3ZXJqgkKXlC53ElyipKK9n9778oZm7sSYqlSqgUQ4jKGe4UJOAxiwlk87vgFCYZnWGSGkLACplKbq2dP4qm05qzmTnBBcJ2/HpsgVlxxJvtzHC/UG54ANMnJIAbGuKX5s0r43kB3uxSjHFwsA6oXwO1o7woBwjNhjuu7iTsMiBp9/35F93EmsUsXMh/r9FxMX/+4ri03Hn9edaR9gX8onF0ig600DFNzEq7wGqyJjefpCGpuk0ExUwQoTPjAzNGWqvmf87T1/rNj8xvS9z8V+2lxWuNo7/eWnDu3Mzz+T124RAeXHDy2IOFIYhuRMhVoKffyfPaWQRhufpzT6rf4cE1v3L2wp5inh6A/c7tX+t7OKUw6PCy4R9JO+HaySbESAxXIxTz2sdiqhHovPwaxGgMr10s5GpGYqzyc3SP2wIvDLX9CtqtRWv3/w4ZaOeca3xu/bgyqm7Mo0ofrV+62k2krnwOegrPKzakJe9rX+xxUj6SzcDUweVpPj27ot6279toumjprVtY80az/e3Rb3qnMliL4Y2YXLpijHpG0Za8N58BDQ0Nnv+jQZU8EmZynXsgJYbrsra0FOdvnRwvnDD9fOKTDYH80/6GcqmAKjDSWPFr595b9qC3pngHG1ujRJkfh/4oMVJ1qLXE4mFiRI2LvXMuOPBcpNnWOLhsaycaudX81O59vZXn7ucPZo2DjzBUoNMnui5/yuiZYWe7sMrykGAXhVlfXVMqDM5UOIaFffYqzKmQZMgkjmFaCe5GJBjnvBu9LZjLxG12PUQQ4Mf5vuumKY5DVm0CpBtead9nEbDuj4XzK7DrOqvIs/JWsvOWRYlxASwHW3ZQVWSKW5Xv6HDEVOHu1vffyiZGPhV0XOjvkR7YWVEM3i7KDqiJHPo5aiBHliij+Z1F/rTcbJ8wnpTNUIoKipcQ6Zod1zfk15O3uFJCFWCG+o5XMPg10vq+Y7sVZOdw9WBVFdqgAJvflF3YWPeQ2VLx1jWekvognDTiIS0roTICmxk9oJ8lJUm0yzOEls0tdsiwNh2LJEb914Y9UZq/r7UxeWbs3oUzstRmoV48FG/9WKQ7N/nBSHHHdlNgFjdD7RRvosJ081iZBKpWXvm/MFPbd5KqqhSpUlPzhU7jShRV8tahx4RZEKqxIoRnIX8VZc4cPGGqP674VZA5c+CYyX+rrL7oKopewd6ehb3Kf6vXpJJLn+k9PYV8WvAMRzKXAP5hHDYt1Wz++c02YmzepH/66j5A0ycNWlmnOOVnMPnEBPqc7eRXrGZCULDaodxkAE4WeolSSUZeZtM//gbr4QUli0Jzsdw0ox3m/uxX8ciXDmrqxRdk4AEJ827hGE6IFVTrR+WmfXHyPEZ/GFF1KGnzZlOLlF3JoT21eQJLgyDjjEBadnA4W1obmoX5XIYQw0zRj22vRQiGQQWHK/EXyZLXTF7bIO9jBBbxE7mJaofcbJ+T3n8jhfnbKHH+9239TS/f96qy9OueWLElkK+gKt42/p9z++00wzOOFJ7pvrcMermlJ2aJU7lptMHKAByNtKcGMtO6cem71hYoarCkaGCT/ia5E1uWuXLnVOYKkoNWLtY5xlESXkcQ2239asuPHxeHpNe6Ck1V2O5oltQvRXTIM5wm5codpDZmfZFgFCrXbG1EuYy1PPN7B/aPwpzXcL9L/fi7Rjv+ra7tz95Ly+bw8uO+j4nhUfnnqZYh6R690hihumRdM5/Y6F3S4LmieznGHy552U1YqtGeErPZIa3/uQm4uu05mD6TM487kz4MpnsW9OfVy5TK7Teb7d6DLTR0ImmN0Xh6INbV2NxW8aA3Ol94pTU/tKUqjIeCn3x6btvQLU3Flw2H10OMOkdRTwhPRk3mapZM791eS6Zb5jL9ojOQYv22DN5qaaJ1f0yClRG8OEPBilRbZoc/QE/TTv06do99rImCfvl9dpvIKCBZHZDQAKZLg5kFwWCWojkNHxnJcDc/jf+6P9HU2g9pCjRmkUFnKHeovtUFad1NsO+lINuurppHKSf17xHubUQgZYPfL9JsWBWMzjpuoR7QWFbp4xK7DOoUZl/JRPbf073DmuEySrqBXfpQWePQmd6svxMlmH0eU3YZFL8WtsWyoZR9Uk4Qk1Aaa4+zjyWWBjN9g4VC+6GMpSy8f4vNVfcP68oA204KW5bHXjNV979sILGMOjm/eo5+KPm/eRMjTUJR+NkgQhCBRMctRAztTcSuNcO0lCRpaqITMkEv2d0vPlma0ZDtf31c3xX/D1ObWq9UpCWP7pMMvfQJoXmzwgs3B/VBFvDd64MS4l3d7K8LwSDfJnY1s3DL82COmOjvEGlIetmfaAE6B8fyakTrhLuskpzp7mR5ayyhRit5CXUhNBhpAiay3pyuHtYsjXoUJX04/+Sp6Y8Ax4ciNhCRdVtzIj++THcl1KLUnKGUJVIxt6GyHdv++mlLU/r6fY1qCQ2uxjlnSxoihMOOZaVuAaU8K9rolxLRzHoHzNz3uQieiXfBYHTuSPnDb6lqehBgO2iw65qzLFLExIQuqJ7bmowmf757SGamGWY52Sit+ZCWUDvQowAzi4k2VqceEJQz2YPbS49AKt8QYnak/SfYMXgFdQIqGsBsDGu70k4IoFh76/QbkB1IgRRSyTJppJMZmZMNZCPZRDaTJbwlPBzSU/fq9BITxTpUE2PMyXZgcR7eDZQZJ9UFGQ/hEKAd+QnAfNTlGTVZJ2toxTaZfXW676/uLIlx4+KoOr5xmivykgxna+oCAd3wvilj9Nv8ORoWH+8BsAC0r9s8RSHF9Vqu8uq+yxKAfp3YmP/OH9M9W594DdA3erxBF4wAENXeaQfsydX9TVfixFT3WXlLewhaYx/UXTO8/4y/L1WO6fa6XbSDP8eO+AUBgDuVZrvJHHPz8vOZWE9BiPN5oN8lGhoqZerqybxuAJoUynvHbD3QtVZD64GKQxWJS+qyKh+f8fVwF66Pm9PZKaaWXm2/oAH90HEZ31c9W4sH9uMidYLL9XL1jrUkYEwynDgRuvxl8eq04dRTxUtRluMI89DCGeBnbx2qxeFxUMOkRBnGSSHR4gLaKEFIptntUaafIk0CE5fux3EEC0cz2yRD6z6vTY2oy1GXsM1FZVdFGhtZ6tUhEr+6zvO5I6nJpAqGX9tLqZ3BSdsBmpIL2rhSbsK5NM60oEhdn2YMI5ByeCc0rq7klGY4YSHGAxZ7LXgeHU/NEadyiie+romEabPx9/JFYTQlXSd0QipVwDoYgw5yiv5HZtSiIuNBsES4IuQ8MSp+QQDTevg7xiqyizHoX5gJN735v4rig6C8OsFoyhG6f895Yeh8hrMJQOtpUhYhmucEIH3qcqlPZwjGcj+QNMg02jnT2JUktvfxtiCjFIQ0GxHYkHrOUKMBex6iSqI15xKSvtTaPIeU0T4/vPrqJvSXyg8Q6tuOpEOl9q2hYf6zdjcC5Gbwrq6ZlGLeepzEpNhKdDfDTg8VSXvjuFgIrZUr1rGZyNgeYcv791/pohh49vELFWe0jLhejOjggiJni5/Gly6yAoxT71Qz6G67TogtGx1dXS0BnPbMY6T+s6sFPz+/uIDKpxD3971OPaAKmj1evTxEp1CFYq1mifnpgRIy8xNdPF6dM7hudOIA++NV2u7qCuPiZMGTKrRt2+5PMXXfD8OJITNIBaZ8V/MFS7lKmU9lbQW+edlh/EGmC4HWGiVH9dymnuWsuFoFm/hquEBn1DbxEplFCdQmBPOKMyiw3QDbMlCh4hVi3N9fNtYWRQgluIde8xT8a+amqEmeB5acSsD17lDtc74JPFnsyYdhPqcaoMHrvBpCdNXl03KnUyI/9zEaamoo22Wgnlzhsqxvx2zqeZFpwxVA4Gs0Pom2PahgMQKIxgFbYnfNqgVbVb0YMwqzvngPgLMQrIhTvCgBMiVEpzpFqDyWJcp1AsCYHboAvqodHvply5LR5+ev9ug1WF1u1gKalj05GXK2eSde72dsxL5TnRKgddVK+n+nXozj3mH2/vvzFw7Z2nCdy/QGwDSzVl3841RsNu748Rp8BmQYcRpEyiXJfmxJq7VnZwUex64bZv2xrDs6KnS6UQnkYcuinftOnpnIwHBsRGcqyc3kbVAh6zpGWJRBzN9HOgHA7+KmOisAguLi77ZX+9KM2P/pL9QHuCm//HTshw/xx3Mu7s+erwcj80wQXYLgX6O9DR+HEB00vcta7q8XHc0witYMaPfYU6sPs4NmTpot1px1NvSGbgllQ8b6W8uxiQB1AkgvRq1fiev9wLQwq+t3HDUWT0ucb9uY20e5erYRzPJuQ/8Nv4b2LiwXj5O+kTrbgjApgG2gAX7jVBY0GoBOri7Bp4S+M1rpQ6KpAej+DwHFAWcJPNl5FuXkmNOb7bjyWi66BVpdeLY56tUx6mEnaCw05pU5woHO59koEFc4TR+fPg6JA5NMewsXVSozwbTS0Rxte10kTTkwLvedK75WXALHZz0zdR11XrufGcgQMJvQWvP4mAfwA+Zskd74/ZZAS4OQVrhbAcg9y41gqPSSryVeXdAv/BIwI6zZMiPN7ZlRnOjUjOog32c0u8IU93qX6UtOjZArQACbo2oGBNgYLVsg/XgQfLS+TxCxfkSQcm98A65SZVRk8knlqWDJk0c/sCQ0cE4Qo2wWJRAIZICQ9yCWbIcosFWWcRBAMYs8S8lw0sEq7aJMDHy4s7RUPpLGuzO5yeqyWEtnUdq6i+TIFaJLVJBz574T8np7jmREYHjtItlo3Hj0prCEihGhAjez62ZX6CsuGyNEDSJR+ZS2sPRxV+3yiHkdymXlVZVFpNxsBkXcCMvK3cUIESkB4rkXCYLKzpGKRgfFMpJOuAEipTALP2vgPwnD3dkY4eldXDiq2Kp4VdJi7xhQ4f0PrPDeDMoZFxeJIZnljKiyRf/AUq+oEpoELKbpIrplFtLNAs+o/A/wkIJ5HlUePGRgrkcwmEOV9JS6oyCLGgNmuufMDHft3VCnuWVNiVvBCzcGKHZFPXKJmMkuBc5FCiY6U0GC8wAocpb1Uyc0h45a4Jgz+Y5RPYd6MNZB3M5mtL2+tuPmFUV3KXIUj+IPhtuaLRvdtCYzxFrXrXdEBVkNgFyrqAp4EQwA9QUYMf0sC84spaAvGfQJCaKOiTLQh1j1kBgDLvI/xpCAdJpQM9XDGXR0iAEdLAg4sT3BFbSj+IMUFP743G3xVNAGB4LWuH8LDUpBS9AfBJc2ds2XsRsX8/YOHJs7cLbuF190rzQvfzGA0abq/q3A9ze5XIVtscq3YZfv7NpsszXdmh3defozva3E3y1t9Vpt+Zpt0TewXdqpHdv91287ht3TfnbfrZoDkmuxJWu8FTu88/hnfJskB1Klv1jGf/i7qpluodr9LoKxEfBLZXMh73s5JJ0xTOYjGxF/zn7/4wdsqXTxO7e/MmgFLhJlPZfJWUHlk2RPYgbxyUwJGii5NiZskfagkGlrY5rNMwDnQMqrvjte937mL3If": -/*!*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,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 ***! - \*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,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": -/*!*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,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 ***! - \*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,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": -/*!*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,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 ***! - \*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,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": -/*!*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,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 ***! - \*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,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": -/*!*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,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 ***! - \*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,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": -/*!*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,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 ***! - \*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,d09GMgABAAAAACdsABIAAAAAR/wAACcGAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGjgbIByBDAZgP1NUQVReAIECCIF8CZ8UERAK1ijJNAuCEAABNgIkA4QcBCAFhHgHIAyFHxtEPyVjW9aw2wEoUr6fP9H/fzx6DDd9kNQh50i4kXKUCkpBKThHbCi4oaOY7luoW0oMKj94JJbx4NagyA2tHDqcIzm5GQh2kWQe92XZSUnZ37+1+1Hu+U9iy2ho/ddqRwe7UXCKlWs2IgYKcnbyD7fl7XWpax4Sjp4xNGeztFB4q2GOkGT2Svevu6s76QTPlgFlz9wf+S4AdPn6TDIKDAQKkIxlJkUFpBegokqZFusUJZDmm3u9uxxxCEqQYjJUP2/PT7OwE67tlEChgN2E+q2Qe34DtM0ORWUYY4pMVBQDo4c6XRh9s0ijpyCKNhgDCzOwZiWYjVWLChftV8IDf6lgsRvz3RiLMiwWyq7Ha1ygViSt2QLu5+G/ud47mTeT/UW3qqgre6oA0AOwsnVAwgPrugrDmjDJ+r26Umj4I1kLdXsA2KE8l8R+6by5MkBcJRUAbKD/djTTJPiFHlG6FOFxalQAGOb7bSsRsSVeJ8SCxyNeaER8f5ghDo4PAAORW0iB5j3ay48DjuO4+dafM2oOJrJrVEM3ZKM5uzim6WQ6Bkd0BHdWhQNypLnzQ7L3S1tvMyac72irZGhVh9p1TDiLhqX6bs03SIvlmCCEu74seTrUD4+6wCDWuc+/TXvbNxprd7yfUR/1KVB0wG2KNmWqdPPum6d5MCM/Pcs+mpGylqWQ7Q+jZWlRdkDWhrHHEsiWl/Q/22EuNxVgt22qMkVRJhX1Keo6JkO1SoDJ2DTFMgh0oWv+/4yrfkvGzJ7+WN9akiZJx5OKf517AkKsUm6R6yU2aIHYl3m95EaBhOocgLC6DAKM83TUQNZt8KQCMJhSaEUWsm99hkXizNjDF1hxgMHxk5GxgPuJyAgWXX0mPCWhX+zUtH2rMxZi74wjltLOxJsIcux25jwtDpDLFFJNqM0DhKKdSzioHzG/mqegwU81JAC+OK4B4L1GUPp4fFOrnCQXCGMGdxLcIOsBbI2zyv6vcfGA1y3evGzANpU5AEhQJZpDpFfXXfcTu34kJRpCReeOR6dAAPZPONMQVR0bkaa+z5SU0QFgJShBd3WAnnQdFGNA5IsKpWvYXAL1JlkLoWyOBoBnQGWhhCBGcIQFPyYXFnBS3UmO3N1JERI1MfG36nK6oTvV9d0j3SbAP5//zR4HiPJCz+hXcXArknSZg7rYAEGvtD+k/pr5YTz516Wi7P4FwPuGNJ4vEciTw9SZrFO1QeWp7otXpkWsKq24+lSm0wruZI/e+U2hCwm8Si4vdhgyLUx3CzWadcLJoImxusCIpAZXnjTWyNqO7IpPlavXsHH5KjSl05LxFKuOB/fLUqRcQ/uRx3xzQbYSdQnEwcO/bfVaCOtm5hY4kE0W6sjCVSPNTfesOXqrJaerWZkZXM6F9LTUFDYrOSkxIT4uNoYZHcWIpNMiws+HhYYEBwUG+Pv5+lApJCLB28vTw/0c6OaqN98pUJ1w7y+7vpfw/fWJB9pF1/M35uQD1VsbO4Hz7WDSEcxE7Ggq9QNjrTdsYcBUXb06rrQcEB6WxZCFPcVGoxmPJo1QrRmiysC8E7KnrrB4qwZKYoIBF48t3MGQDBsa3ja8LhNgSuvdCSylt41J+GY8T35JMek8o3BsWdZoVxIQ9MzDfbEtWK+UPVBCOYQiPVA+5YyoqxHIbOP7cBtI4brHLMMT8Yf21xQgSyLYihdj0Z4GMzbdS6bCo3OjPbEl73P7admPiG2nnQh6U4xvTydTvj3bSA6hkW/Pya+ElIR7Pm3p+SqRrskRCN7lZKEYLUenOdH0JhurW2nWw0i7zAg0V5B9D2GConCmnKYdhyZY2XA7bEJMVPm7HZELd9sHQmguQWkTeObh7pzg5pg5bk5Rh6KEffJXv+b3COAifBFgB+ukcqfNb7HqotMmS4qnj04Fmlux5x0Ex04k0lNg+MC8BQfPN/JbAB2Magqoe+Vn6bTrRBOOt7WfaiBVJdgK3vB7YklyLZiZ8M4HY/3F+AejCK5NkvDasE+rV+vxOoXh/ZEmkybU2MueKT+ig9Mth41W4+qa64KlBkvuBss8g6mLHNRqy13yooDpfJGqrg4EhYrYwNrjN2yphEyVLxYvdpHsoPHi9T348T3G5S8VL+Vs4jSAa0H/FddcU+uVlrwgghnL1mx8hCxhOILF90xi0Gutb5UPtKlOMOEedNqjSTJP3HhPFII3k9Z9tHhIx2U87fXAGrY69LFx3wMvIGpnGoPJAHi1Z9NJro7t50grmAmYIsAsz23TiGTnjWiwm89mJktzR6ENltHQ0htNl4A3H3Ta5YUUA4cPJ04UpXyilpv7PbOEIvCiB8m5LG3oFssN1IctD+djjYsLOsL1CkAlYjjESqZiaeW3zCcKU7L2o54V2wRLTb5Tw+c6eaSerj+ANvvI9v2qWxUCmLrMiNU08VEWBw0OezdmVERVkMqQr/Eru9npkZ7ks7Qq4+6k7NCjFWd4IMnCWA+mby5rwPmelqGi98VRNyXbU3fFObEgZU4G1RQFf5FBJdPGmuzwlDZxc2Hfjcb2pONGrE6izo5aSFNoHs6cGM2ah5SlaQ8rPIO5xw0BswKI6jquG0wV2TV3EbiGrQcPuPQcdxzXkJk6IQmi1BYpOJD2WlOz9Q06AUo4rpUJitenXmqcE3YEB652dGUtn9GlfdhRFSaz3K3vzpYq6tJam2gKOEENkPHXKRjpuYqJs+shGkdc2nFUUUJUPeZG7xB6XwLMCKbGaAcTLk4oCa270oTxLZxpxPnKPhQwbAZhjBhrjXCbQHM4Zk9qcGtsKIRN2MqXOVvS1/X5rNq+ugFxiTBHHc2suzKsHHNKMtHGogMRYkUnDECGuWJi5Hgc3qVMrZ+CT4cwAJ5PTeQqY3L7DCPCBka+w/xazAQBNrXWEwzGw/GFK8AIrzlfDUzo79ceVo5mYHGTVnHHh+A1cvsEDid+AeMVlvqRlDztyB6yP1oJxUcO8IRoua7TcvLVRteeWMv2aFR1aM9ImHVa2hb9ADUaHg5UHEHlABcD4KQH1kID8VD52ixkg8GA3Payh38lQBFfORO3mQidllq7G2Wq00Fd8qUaVp+oO8cCeDq64eAM5WbwrTq7N+02J4ejQ+mW8ZXo3JpqXWNESNS5lCw7QCrBmtIcjmQ3a1sKauDjHxN6D9RiNiK0f1UuYofRu6GPPUYHV6g+BPsYHZAshwkYKW213tvStONMgiaB3tE7z8FTV+EkaMmgEZd7Fqbm1oLCznYuhsT+ulXUyYasUP331qZLxyG2jrhwqedW6M24AycA4wVXPsyFEZzA0gfVrWQ4qi7iiRSfTNLVwaEfTk9cXJcZnOLJ8Ik+Yom8YxK6R5rLoehwCk9TBUtdg1PojXRKo88aLnB0jhPaqbV//IMs7QOY4ovLDwip9nwxcMV12lqLDmPoMao+nXMvT3Ua9PJ4WPQS+MnXL/jcpNwNsNdlcPX1/yPnHTDlmBx/B7CoO1sQx57yDuWSaF6Tvfn9y2eXzOUrgEr+bzA7mEZtK2VcB2UsxGeOuS901VfvylcfD/UzSnoVwZIytlloJzInmK7ZLpdonVdVfBt8GyNawY6mXx2faNYIV1Q+XzwffTvDv8/ICIEpqfZe9cAst992XLFPfqpXdcxVymqndZDKlcAcb7iXP2imPcAEW3NRQQ/VuuaD9j2nqB6dgenvyMSJIE+E8Busd/nd+4YVifcC4wz7+YOFoiPDTv5o6x0MKZ+JzQAOHePnvdbyrOLvpqq7UmOQIHkYX5S8TVXwk82ruYcEf4U2mOf2w2Krdvsr5BxrlfXBn577Pmw5i9tqdqYfBbztpxuIF0JrXHWnbtetbLmpCNovXB90yQo3Y0G5OvbzqJEcJBhg/4UB5eQvJvS1Bz88/ee1P5PhPXnn5b/sZ1uD8NFBYRtZiEMaRyr5+VNQBRhc6HA6waAGNzDD/WUpC2WXE5VMGkmWEw9bpcd3AeEVdUMWcg9iFhf+HdCyCbvTldcqumZveW036qbiXBe9unM/6htd2yPVc5Hvdw/kLnfdbfL1vFA3g971tFaNqz1V3tmjjyLLSOtFqk5zrXoilKfb5Za55btSdLzd2hSHcLUdd/dNhgI/2E0NjBUjYIprY2ek4j/HJe8I+4MXKl4U4i/K5MTo2PdmVgvCGOQHw00jU4JqLfNY0cJUa74G/1j36pD3IAf+ia3FbVGoIAoTGLZlwGTalogpjjQSldcFK1W2FNVwt63EeZQhAYFjFNJ6rkawx9UytZVKTqnx1r/nvLrJjm4NrpGuvSWEAc/CyKQ7fywg6Yz8y82WXFH/TobVC66hxcYAASn+nr4lC9jJrnBdrK1gfY1W12mF76M8L/B8qJaUPO0CBkN4IRfTLP5nw7I+7yKG+vPNwFRQNMc2m1muXB34hKHTrosPTD2UQRR/QaMwUJFsWIR/a1CGfLw3QNV3xOinpx2gnHqe5ZR5QVqZs2Ek8nDG9yl/V+ZWsDnMrAZHjM7iPECBaZCezg9+YMvqd1e0RTgBCUlIzni3RovLtLKKpQUwTT5WekJ0ddbTtLeYcLmZ6ugw190mapY6eNZOSNyyNqcgH0Ib5lh44UTFQXptAkDWFlZZEmNySJIsiggm7l59arH4+wYlDJiFXNMHqlqqP+vZ4KQPwODPNoOvrDNeJu2DlO8BRMUhbEXwB4qVw3hAmiT0+uZmUwfD0kIYvXA4JNAUE2yfDUFMJljieh9bGGbMyucMtEaC/QbQjikGJkqakujAkFgl0i3ZloKl/n66Wc+6P8smRdjdoW1LZpe2trFjYLfAVeKC7NvDRpT86NM6QrqCB230He6UKHHmlDfpTDUQLLqTaZZb7cJMkKHojJk2r/u1E/IZxumS4nGlLDoZxwazizqGtWMXlnOJWTIV2G1LXA6yCrzHvt8venbSg7hqDt6VqCSqyHA9efLeOjYWpPaW6xwtTgFB0JhC/tch9/XA81L9IJAyrL/bpPVWyZe+VrD+L/n3MvkIa5N7bU7T9V7V/V8PvuGTGgNrhh6Gc1ylaHQBPW4haXqAnzjbulxvtR8QUm3Lh28+KwmXIOfE94yAZHhlFWtGC46rJUtmnefjx/ZKOyDbACHxfZNMlUBZL1MGW6+agT3kMpB6UE6mjdT9d8uSDuXxEq52Uwce7UWAPVvB45jIrIKmDLpQyA02LbQ2Lpk94GSb1XKMUI7H6wfU2pBH+YFu5ZSElBJitUGYzGDTCH2UZZt4mgKHHNtFTHEgRXogMfC+4MAxjCAgqBdRtdl6zl0/S/HccdLImvz43Dww4Ki5laHPfix9VmkppzD18fuH7qtKHMuH57n4DNotVeBeu4Z/dvMh6R43nA5BROVKn0rYbhW+9Nm94mo1ItSK941kq/QgqaBXmVWLc3wzcwoRu60JOiPwrNf7QoauSIWl3EKJy0tb6soglvISMErJ4Z8lZuiPkyI6Uq3XP/RW5adUtWdmqnivVuj3vZg01ST1w7lOe+TEg3+eElRD2Q/PJ4BZuPCwqb4JJjzu//mGTN9wn7oxorWz3KxVuNzIGLpKUiap+JU1oYiKzumjV1VkCuc65BV6d3zsizL8AhHwMLk6AqU6sThz8U1o2+/wq05Ka7VZnKyx+LV/krXMtrqb8ihgao9tibp5gyVnnVzU5vasfIEl97ZuJGIES1KqJ2DGVTkvDBbqSe8EwfJTe9C4wcRrhmQ9p2oXdYEJ4jcTIGqTxoJHYfVhmAI0aR14H2AF6KFE4NgQer9F049UBs7De8gO8/88Bze0DjG0YoYAvBoGpKWB0wJ/GQ+1WTmYtUSqeBnY1mHv/kf1l3UpDH39L3l2Dgw4iOdJpBjA1BVlVIM2nw36IAd2/4ztH/onVrBHVhx8WUcyEr15pLfYRATXD5aYRx/XDQ49rIs6uqTyxfbvoSf8GBmEduScCvTp9ZCzguLsp2DXlJ1O/yuJr9mmdlYsnQkpSqpdrDpuf6wwjzf3PqydUnc0A3PQ6672wCIt4eJp7wRvDwd6EznfJBhb6R1GM8v3SU0T3PYvTd01JGtb8L2xE4ahobyTTjQXL/vIKu9UA57JdHRIo2rpMICuNjo0XlZo2ijLr8mffffntmglzjXBdWZrQflYkUaWa5J3jIRS8lkqgeLvRDRCymvXB26vjG985Kh3w57QiHl6YfQWF//K+D7x8SNSy1JOVZzkRN/WEy4a+KxzuDVLNxuB5FUpYWpcaHJAaO1id49WpEL9K07Wn6t7Bf985DSQm7CwE2UKeeqnWI3h7ivlhaCoJiLer1y7pD62CIPAUYMr9jKYzxuifhV7sXhpMLoT56NdS9bu0Ujs+MTL/XN2Mk3sYXlNcWH7qFyrM5Cfrk8noxWpICgAqc36fdZW/fqGhVbWBQiDz+YecovFH//Sc6Z40P8U/Eq3q8r3AP6YtS4w5PuXVMFVTKfY5U4+f8kzLWHOs4AP3ime4fzzuqC98WVh5j8W2OkClw0+k82qZbpsFOS7rPKjUoY7XiEMtYOv/YxWESX+ezm3zC/fOMTrq4wOLF5/UwgUlSp2ww63kQvMbMpZZX52Y5B8bPnZtQpaOqM43nGbt9n4FmflYMSMrtp0K2YLtV42O2IXLcOrcoIIxnjndHumTrRukzc5Oaj8Zf08bUTHHWtV4KTarEtkcz0cza0dsk4xdBi4BiKRpTxtxkWtYvvV+5e5qGqzVfyqxeqyKvAETh1muGkxVEIypG6Z92Cob7nTmLsfcXR6QzWRYeoGbyykvte0DTRxCMg606ysEMnC2+joeuFP2OvqmOWYLS7G6YScdUQdnJmcWpoG8qwzkeJPJZxNVPrVI8YtKUte0RcpWsxeXNET93aQRkd7F+l75o9T/ScqBH2tpZnFudyaYNupPGXBk9bsVpGW3b25pnKAH9xKLvYch4UBAH1PvxsIa8srM+/Fj1WnHzZH221Vt/0InRB7NfBqRuwwr2w/u0FPdNisrf/uOyI249wvvhvhN34h+/zcPr0FCs83MemE7kWFzGdy/MZ2z2vI2GCRpiQZTv1H5yMm+BBdG0ZoMZeTxud9mO3HS23cabzUU3Xl0fIs/9K1HQ24haJl0pxdUTZpQZpzt/4RtMDlel7VmnsOYxpLPWB+v9ZVUz4bi2rIrweCkTO7R2JHePumFD1n/jntIWO0TB5Ky0l2sJpZibUFww3aED6yrho3cVA9Q2SnMKH85i9M5iJn+/93CxnglCjtr7ShsqmypNwv66hc5rGZzbC2H6zbmCurovmzp0+UpKkfSBsk5CWMJJTe/JkZI3qC4TOVN4V/WVu3NpJM/ahStexn55r+7bm4f2dxXnrw9ww2u6Ls3RDAJzdh4HBiDfDs8eztRwNNfk92QHHq/0qCGicfvrnzNer8YsblHy+P/8P/vNtXVkUjsIdPVFxHn4ucA/gzqN7sP7J7UUnuOXm2jGD7MFj3YVMwLMPG7LxdGs4heUXZ5/uZnRXzre2+bfOtlTPbxB/bDm8P+g4c325rOtwNa5gfaUZLTaNF07W5vE1I7Hr6A+0Ag/Zn1Yb1KOfdq03l1V/y7t+uvlKz4hjKpbIFGUXls64+ViR2c53ztF50653g+F51mf65Ti8zSJJ4LNTvOAz/9rIIoDudLMXToIkS/lJH8L/cXFaGv7zeefBuP+/artraKtpBP/Sbpceyieo/axxqPEBQ0GWem9mMaC1n2eY1+ntiB9INWo+SZJw0buBgesYKnfKKBMU5zLa2TXmOaDyk+HQEIm6QFYy08Io3oTBwVC1n+yVl8RPZKCWaVOj730NQbKvjQbxGZG+2l2t/NgA6vjUYmqJ/y5x34+nqtPOQEYfHrc3YNErXvzSISU8CDv4AbnD80Dj+rZHjvPXJZmMQTMfdGYk8uBJSod9/lz6N/yV83/sYw1hK3/79nZQU/9e54bIqGoU9cIL3GB0w5tNu34l8xt/ewYCamx0q7yWzBGY5D2xeT+U0RSqcBdTut5iYZ4S8kzLiq8zNlv3GBrBHTuRAjmP6LSOHjJ3VXaqoevcMWeNiMYNblCOdX1uDrFc+50yoUjD1VNSEJr3o8rnSavCGWOGdxlswttdcfs6UIzob/2yQiOze+xHTeVN5rN5W6h5jwjO/1iSm7FajpkLnpTtqS3Ukl5qXogjEtfquvht14UeXls7LXuP39lyvocloJEVkROw15RKUyoKpvbx9xC05vvj/F6BtvuIIrHzSw8vn61deY1L5nwLcl/frtXM0pfCZ8qr8D6WoUiWO8lcqipvsuid5UeZJlE+1dWDVCjfsWcM09+dn3MaUuYDsUce//4xhJQT3kfKxgu3aoDrPSCaTgVk715wXYORAs4xKZ4UqwBiy9Wnc0IDqNVLLQ/Bu2oxFVHpxYHitTwU6CVNWQ8W6eCd75mmdkSwu9VK3KAArfxIJQTkbbVDUDuvOgGV0wnxDcjMs7aiQ0Yv5UBjf0TgeAUZKqQRZgHvIb/jVF4ZGrUbPDVe/4feR82sKyFbkhgJWtT44Y9oxPCeYFpsaioY5HotztI8jBdNqr1DavEoRieoNF100RObx1EIdb183BxdqmV5MXQmnUkgII+cSOYGl2gSN0wU+OBFOHXkXnESqibuK2SNxtO6rYGsXFkITPw/HOXVdA4/D8W/B+YeI/05uHRoaCUEhEn0wuOKlIHY2KfADLy5A5VfJw1tbCGN397MXTT9on5XdL1KkOINg42UjaKCNJGorpxJlniNpLBaI374IvkBp8VBsnooiHbxKuyoABd9p34Ug2pkKgsJFcFEIIk71ipiiPhG9MlkBv4tc7pE9vFF4KOzj/fzjYED2ac/THukfNwp/Fgp5Px0eG5ZZds2G9zK9Z3NyCHO9zCzpI3eo1CyZnljv2azV2fs4r+6MnoxSUChyEQlWmtFIKFgWlRQeFz1o53vyqQAUfA46PemUObgw3tiIYdwFwaCXwF4gOhAJRe9Exxnb4Eo7VMgJMuv90WI06eC2Td2aS0gpgxHQsE5qfS4KrDSPIJ5Mtubx/Rn0Ei/0OCjcNqqYcfGzfKu+DQukemzRscw6v6jIUu9clFX3X6AAVPHJJ1YsugT7/+gDG5ZJDV9BofaWWGSVN8+GbXuhwf94uEJICWaY/7BSyz+pixQokMw0KjWQGREK+s5UYFOMi5u7NMmtH9l5f1xaK/33l300TUxnmvU/fjaUX09PO4D1aX0XgIKrONmL6feuJJfV3C1K+cfs5VSZ7XoRPS62iGa7Xl5qt1IYERtbFGG3ovF288w1Z7lUEMwJ67jdN3oAChZQUh4R5aF5CK4xL4mBkcG/+mLsIFdaOhiDPe3uEeFdmlHI49QE203lKQ88a81sFQlEDZkNa7ri3ppH0EzvIn2PggmK/0Q5JdKmmuuhD7+g0PIxPe+Pjf2Sf7+lN1Ha1JvNSoqKVc/EN3iQG+FJBqVGElwvQQMlKbBaa5/fWoZBy5zWBrfhlXMu/qUMhn/DKqmlXSQrL3Y2MfB9Tpyf2oFkZs920BVsmkw/4jaNf038nPwtq8GfQa/0UrengruSNfPO/iU+ECs3j+/7CfjpDjh0GXq5kfBz8s/Z9djXWualBYeb8kChyFMkANM5PYr2u292Wr7WGNdvjLCYLd36dVcI/uWA2FHWXzZ4uyWlIFkqXoJ3vzh9SwuG1D0YTrIcWmblZJYvmS9+zL+Y4NmSJOydrBG/Iq+mpIH+qbLEIEo6O4WcHBzkk5zCpqbrnNWRhtHJxZ3OWbltju7Fkow2eHwYIe58PAXOlIef/vF9YOAb8eZq+cVLeU8Lns6rsXPOmDWaMXB2v4DKMyCapxIniMPwVJT7wNHPcRoB+Isy9rCj9pZtGkEHkRo+AlAg45impsC/pWRq0ONkb7Sc48A4UWAvqo9YzW3OfPia1cJ/FZdzqzkjcGWsMEvbVZvl4RThRgpO2vK2sLg9GKDYFULvy28enW7qHpnrjfLgl8ag69nogALYAjWNlFi4qpc0aeBiSUDRK6G040peVg8/akaLrbj1S1HX/rJr1i7UqHY7jUViSy73vstd4grdY1e6iavdwTWu00Ge40Oq2kXR2aObu96tdMnpHrP1r3ZM1Fxbs3VR68gVF9qpuzSdZrplxH4iOq4TKaklDzmE1wE2KcaW2N2cOFb1X1vOsjbKreO+JXduMqjm+BLhvHwAAD8ArF/p5WZUn+5gTv4DInGl28ZLZc4XYmk/M9kfblIMg15hbzEHdfNhugho85kSy0g9YUMOb5xf5LLh2zFksS1e4XNIZJEoeO7a+Xyqyo7RO+JKuUK+dPYS5mT51ZF0bpDQjnwlArGwgkIEG68fqdIod745uIPtgCZzbbfYsIUYFKTr5FRmYjvK7Q5rU9UQxU7KM3YB8ER5PXmG5vRbkz04u/Bwi62+mqM7v8clkFeVYt8FqSb6LZdyoM9P9H4xjVaEFNEZqYNxGsPj8zk8vrhcXNYt7TpwHbm3AAcrUwx+ottD/gAtcTFFP7WfUEvOISK6DHp2AgaKlCgWeXEYzS9IChAxSu+nKTAAb6ZHWlypB2Tthl56LgLFqlTq9f1FCuKpcXHpVSkSkrW8B/vJYU35qccv0MymyCwiEfE2D3HqsRiLcrBFulxSN1oxvJ0tQeD8dXNr91aWyJ731E2aglIcm5cg8dsxwkbP9KbEadIHimsOv6QCYiqvRjsTRt4VG4kj2zHe9Yq9UeIM3Jn1faY/Q09eEFmbyCL1YF3Vh21WPM/qWibsiOZXNdpz+r4eFJjvauaKyx1b1RMLJBxUizkJchcF1jlaue4MQxWca6BCh/50R55kOJ/N+4BQKyTrbg0DZG4PwLf+LjbC7IHhpd8oortWjVY9PQ3oGPhT89swnJdV4jvS7k3NDsbbaUKN21s/tw4UgJW7O/OjBl/X4CzLcuSRO4MnWB94v/7DRF4Af7qouoPrxM0uQg/yrjLn8LT+oOV+ESO49oiwkUy3hcCIrrvQOc28L6Aq4Ijn8CleoyWa6fliYtBnaDMRqbhge7GLTIcZjkW0nqlDx9MS8OodWUggu7i4GnVS4CQKq9tpXmlnevgUZBpVJPReFu48PrN4Ka3qOTqmy7Zp1OOYeKps09Fzj2GTrikGvXOXgJi4ceePBhb7eRpMRpxjdDQXRVekUm/hpZSQrz315DpQWSdpMFOiLG6qKU1h17MDof7wxXaMEVKxG/S59TSqJETnzAFyiFjTZa12OQ3MhS/DKYmAKGuOhKCEVC0045g8pyhxUh6dvnjT9+x0h5tlZAjLstGZxaesKs2I7+POzmN2n9TS6SfWZEq0DCrgIJvLz46PixBjUbDHQblR5RR4mHn+Jro6RFDAd+Zu0/h56FsjXmpDiCkirkHfR5tWLBw548/RYNUEiV49ZaBNk3h75OKKOKVsJ05Om/Rhe2sLnHnlR3tUiJpqyIyCHs6fktYpXVmuNBsNKQUtPwBOhooO6k7Ls8hd7EaN5jFWFSgx5N9FB1VjHQfNWuyUMvlYaMCfJcQo4okd4ZvKNooC7sw3Rb7RxeVwAJgc2GBURmcWl4PT8DYfaMKwOzHXMSxv/eGGXp6SuIgR7fR21CRuQs70WaYrPWUmDKV190GDMkTkJRmQf+UCwIp4lHb317ZaIVTMGaip1o42Z35MmWtxFT5giwvGsdTs4RD9D6CDYfvz/lrzPfCJ86rr8r4/2LH9tQa+y09CegxH7grsrduktRUF+ExHmn50U91QMlswrOa2fKCOyreB4AUyAVd/fWHa2D31UpVhKDg8L1S5EOSQhOIyc4BPrdHcHwSfYarruUvENeasUScb+1WWGwKRk52GJqym80jOaUj/TWspa7v8uQ4ODOev50bBAi5AnO2gdcU+pKk6CsZHpTFWooEok7sUc/gZkF0BxwiYMy+eqxxBXh4brfr4cWF+oZWGOiNQ/uKHWhAcBeVZiwTAvXlTAgKA5cmE1/44mn32p/BhQFn46fWr37bw23W9+593/xbTNooAgA0NNxD4T7SK+2BDxkDpL5/KW3HNRjkKAL7IfoEDV8HK4l2abM5260xeWrz9ekonN8cGDTOiyUcnycYaGR0fmu9hRTZWIwF8aiT+v4NlWHFgPOeNo8KMbogBKHrTSf5H+gAZ+vbLHfv1PKaq+nPytBQjSz7U0qQlVT+QAdIO8ZBXrTgEWRT6euwTdGY45ZCRNbKKQGMIoSJdriDSKl0gNsAm2AFx2AJbgSATusAm8BSVCsKRw+TIYyHL0XopS/m0JA2sRhGq1Znda8SmtGgyntncima6EIwsr0Dzc04FZRxNhmaznmzRLh4rCAYN+Q3wALZW3qaPWmVRElSk+L3xT7S0asZbE+Mlh07FaXIBX/gZdrVHpgk0VQFKqDb5JweoOfzqdx8U1XmyLQY80IFh+We+2cp+vtAz0rETHR5BBpggj+nbzQFYE0BF1q9JCpatv4UPJYwExDPVAqBns/OJM9NlPrcqccRd8THgdigakQjJ/7098cDV27HtJHY70STt26nNZHubdS+F7gUBQJBq0e0QQKaOAaj8CkSZ8wNSlfMzEoNvfZ2TREk4WJiiREuBhWdWJVhUxYkUBIRmmcAJRThJdkyIWKMyRtc0ocRBapbRmmaxlZ40GmVSkZxmek6jMDkothDBBC2qeCrNMnFaiBOJIWQCItl6nKgyZp+Op6+FJJeFKKnidmcxZ8LsQ+EMNwTpJrhQeBpijFa0bTkO6TvBJsl04AvVvF6yQwDYifY1DWadZKE2kSjjMgCTUf0sgStPfi70hfRzml5ob64kXviAOKegoa5OQwYRyqfFlS+tfYP3TXweI8rnOcefnc8pAqnL/5xehjk1XeN1kt6Jqej4/D/HxqKjfSjxvTk8aN6hwTvYFR1ooohu1tjXsGA0LkS20uxuRzNnLYGIGvfCa5NVbMKqEW9nldlRneSlZLOt6HmBRSYtovDPXcYvr2MhL818xt5caigp7s2kRdMJj6lETmZvIjbjUfLGQjMalkUjoT3nAm/IN4Oe8wY80++NFjm7dSRuUS/XWMYYet5LTuZF54GNTeZ5i4qeM185bR7wjHnAavs1DRmLXmRONDlpks8CPcnQXmKVkijcgls12kug3OJr4GmCHh5g2aJuqvKLrWRiKYJNsiDqNO6qtTzfdZRTfscl9FoWN+y0tcvQWmW8+qtRZcUchuCvmc95eWuRTCohoxg0AxK+91kaSJ8cgYe+Cw9BPKq0UIYiuGvqYw6BBjR3DuO3eKeZc6PstORRuFN7wLcbNVu/1kwa2OEpw3yzJwnxVvrt5k3Y3DvCnVn51YJ5xieiZNL0mNW697q472tC+TojQ4GCveFosPygCsSqEmvK9ZKCl+iwfOVLeOp/4s+qBQAA"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,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": -/*!*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,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 ***! - \*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,d09GMgABAAAAADHYABIAAAAAZLgAADFwAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGoEYGyAcgiYGYD9TVEFUWgCCDgiBfAmfFBEQCoGHHPZkC4QEAAE2AiQDiAQEIAWEYAcgDIUfG0ZZFWNbRjM4D0Ao0f4RR1EbOSkSRb0epIjs/y8H3JCBb6ivRAFQJYrTKB4iHJ9YfGOZVGHVwXlsxGnE0b3WK3QNBe8cbxejF83rexThsUFD+amDYBXb9ghrQ/9Ud0sMY663cdTi6Pe/hKff+q2p8/QZOM5HzeXhye55z50dfEdASamLO9BdfhWiFPx2hge39Q8EJxIq4gAF3IiIOHaKg+GE7SIcDHEswBTNnGjLscrGdmXmdWZkZmt63l3XL28sG9va1vVL/U9bpXoJe/fQluGrfqiZq7oMeAANw5Z6DdLQ1UUmDvE7S56MvaEp9pUu3d0DSf/yxAjyKHdhqG4iM8nAqAApWKbp8uk8aZsv00X7v6bJq2quQ8wNiHWJ/r1NIdmuEcbmp6AGR9PM2TZbmqSVdJLuun3293NqZ7USODRNAH9FNNABNCwIhH1R3FZStjubwTkiGhX4fwZFDDrpNCWKRGkS9McyuDTM0/ylotQtw+jLtCTr8Pcuw5bJeBhz35zfTqjt7kxSUGccKVsAVIfJmOR9l5z+AKgOEOHftpXk6S34jsmECZZPMvTq5TKlq1vtl645ubHSoQ1YABODb530TVq3llIqQF3zKPAnLIAGoD7c8flsWqXVasvqAWnQ+zyZvagDCjKiJNq7JOn61a3uquq2yi17plsGWrKWJNsL0qAkv30e+2CRg+gQjDOzngPTMmcHABlRhkF6ebx32V0Qp2iehC6xxsbwYotX0d3q1NyiijJz3s4ldEYcyYpkQwiu7P9alkugSc2oKA1+E3vtGFOriWR0ZQ5HRBBFZQknmv6/K0Ahnf36AlA2AnBA8B4KQqAgRJsh0mSCkCgIqYLI6UDkbX+UwrS67Ja6Y0H95k/1twfqkZfqrV+HH6DC8sbwxUS8NALM+ZhDgP+bBscZZLMtkoXAFAygr6Z+bUlrGPxnhEN16mLgfaRaUYTZoxR56h86LldbCnx7fkrefmM2AeC25yRj1m2HGPGszy6clJ3AX4I+E4Sg/7q7EdhxJ8qKgSN0gu7R5QPUAB2ig1IoGHORly/luOnKMX60t/71q//85n+/m7A/bohQSZLlynPI4eafNySYU6b16AUB06HTI4+rL/jaZz/7Z+0lSlWpBsvdaRYcKOvkecAN2U15c//U46zlNmBRyWlWveWOHBbkQICRR03bJ6PAlDFtBeLWn97uWxUDYEkwrdJUtZz3eTWrgp55mFYFgQBw5pEqLQSA+NOjCggOlDFrJ/cBpHAkN2pHVOgsGSjb5gSASHJEJSRvgfki1x/6bGHCL3iRG7Koj544GMdjKd7EKlSnkJSxOMR5Q2e98z7n95t/dksSBgkjhKNEm5GTq6s/sHTtEEZeyE9aD8R38Xzbl2TfCpw3cG7Y8m7zu3ZYGyMnylYDEv/EL2nOJ8s5CUt8/j8bPxtPAeOTY8+n9+5vvx93P3VxYfH5v+P/ev+7CMBHj2uog6mXZJzwOz4vvgoeWvLKp4pmUQww9DKZDw305+JlHhgxfYVx21n+AnCfMduvLcOa+FGUVtiv05Hl0b+hxBa7FOmwW41B7RGuxS6HbPGKXnWw6dXYZZ8xJzpL9brstF+Mjjh+kh82LkIFv0kImfdQ90BQcu8PO+o7zbYZiHAVGrTptNuQOq226v84+oRXqm20SW+w6TSkr7Q+u4zUS0NNMQfoHkr7hpGNEncO7Nje1qpvaW5qbKjfWLeBtrZGV121vlKrUVeUl5WWFBcVFqjylQq5LC83J1u6TpKVmZGeJhYJBTwuJzUlOSkxgc1ieuFR5mY+kO8tzONc4xTmFB/wx1m8lAXlx3GQDxnAuifotAQzdKY/cs2GNsZrNjDgqvl4WlzKzEHXi1wdBJDfn6s/5v6wcNSUSdBlwqRwatk7vP0WgoKI0GDjwFO90TmarOmrxuYZmQBdEs8mYIoNGZ3w9bZF8HOITusZ05YNu5VWlmw4qp2E+t3ozpRRGxRQmavmefbiLS4RZYWDF9a+Iw4BKTyMGZfwhL/4uF0B3oIIUvF84KQWOMm63DJyrKY0MWskeV8mF3GNS2VTrSSCWvKzH7uTyT71Fq7MVXTmH/vcL4QUhJpPV8MkxNNNjHAuIe5iXqtqzVpH0sYNdWnc9EjyJxYOzZQIK90mlwZCA3m5TGKaajVq4G0GU+MNdkMUv67ZsdxRl0AIWFrrIIFSFntyIMye2TdHlEMVCZ/5LzDtXwTlIPzqYg5SJNJH/ZcY/fHL6bIQf/StRYjqEftdT3AgFdf3Vq0n9HO/e3/hfnXhGCsO1Cpq6w9SrTQTdVjWaVOGIEUQHAxe8z1hnJJBmLHDGwja+FH5RhwMa4XkeKXZp8KrstlMuXm9L8GwMDO2GpumdnSwom/QspDze0kZmOouuBXMAwyuRt5Vw8WMwJ32pEeB8pY0GISIkwcFxYmYSshV9kg9SkjSzaT8VQ1pv5a4/bF6HJPE6gYWC/xpbnKTbj6XGZ4TwQzcM732Ed4ChiO4X9OJQ80YfzOrVqiZoMM2qpX+MJk37eDCPQi2kMR1VNjScRFn52kYzUbib+43Gh7bbSYqY3x4sBpNz2hxJm6zniMtYYbgigC9fARFgX9vJoUTd5aXPHbJPJEpWkRNC68lXAi7v1GtZCNRE7aByQ4F2XukFutpbOmpeeD5Eyyz5mrSZxO+9qiaBNxjxU46DksLN5dW7NyIe7Bg5Awtvb4E0AUZ48yQQBhJjinKvZJ7/yGOFGhxLZJZCBOLorVrDeDqFgsDTVT3M1jWWPU2fbaIaJrEy/ke71lOrU3aXGz5aCY6JiHNjipa78Lk5tp4cB3YJsZmAr07pVwd65Yec6cjsc8ZkKpLOaIuCp5C0JBuZfSqiTyto2bB5XqDpuQHhWtwFKU3LoDQfgZg9TmncMXmhqj0IoVSwPa2eoBeB6iQ2JcMhg/eciwjCA2puwuWFZuW4wpeKMv1OMioiyeCQUFn6CYbT9IUYkSrDZYE8/3yF+JHwliwEOpM8sW7K0OXMJYrh7kWs2DZUE4tkrOK+oYWEN1A+fvcymQ4ipGy7T4aazaN7aqIHXRs2IzrbX1+AvQ4dKVLa0KEu/WIqOSOATUfxJ7CtbyQgIA01Q0xxARGEw4RqG/i8x/RzefrCOENkrlcYdYZXvW0zVDKre4Sh9hq3XIzBMmYoi6Z4nBDhS18wrytymMKNj4lxoQf7vJcrX6svhCVh9LzJvKuSJfJBa7bg8CBmYC1tJkAm9GVMkNt8TW13Q5IdLaxtOxWvypOpibS4hfJaIoldmfhCK6nTC4IDTNricQepn6wSNvmyBxZ9JYE/g54R0SLwpzkcKShLlzkAJtdTWg0NhJ6rcw0y/tBoF4PGOi+D2UtVi2IMIRiJfN+J0P9ygNiO+jqXCr4F4LM9u8siDMyEVoZLHZERfnxUTzDY0dY9tKlAwd4rh/QaAnhTKFWse+WRvW57Yotry/mo/PAGjAOSHVCcWCPbZYQhZ2cFYRWZDmJJBIHBFPvEVwJsc3ItxUZwAkYEF0BvfftbUqnqwd+9DYK5T2JCew5kNit5dPYiXVGrj7TlZ4jpe7CkuCQiaVwagFdbKUdYYtg4mrhp2XWrg5JnvvJv/SaXjWLSKkxsOwqk1WeGabVAphgha2dZhPCMDHhHkVrx0MnWoFtRf6hhR7sAr5DmzjY1kjJMiX08lkuDA8qYXK0iduq2PZIacrB1D1RDuhDWHclL41JS8cEoV6J09CP8MxLAKMGltcKoTx9NHBmqxWJ7ZzESfcS5DGyFZw9PiHG7gqFVIB0MHaBXxKO9EfdglDf/gc3EEB1s63nSwFb9t6EDXkiBcgZsrgm8/HF2tMtE/cthBT9h7RqmC/a7IRuN5TEzLtzww5yxbeK5W9ehcNLEz2P4EHmB5PhFnmRPGnBHFwk8RQh4tV6h3FvYtAfjYznGReOc8oeqAdvQj7/xShyBK4cUXnXAyfL5BkOqjANVHtXMhGP8jO6XLxz4BTe38I4lxw15x5IjUF32nZIjAPOK44obh2D6z9j7gHyA3Teri73r1tpgkgrgX4Ji/yFEUNJCeP8paFKGB697VxmAFxC+0teYm8Q/h+pjpk7IIUguY8BycWiaVxSdTA/Efc7kAxOlcnRlE2ZidfaAS5t8mWmr3oB+hbgyIFtc9rgDT0H+JWgql1uqYzKMBs2COGblc0LHklCTlQm9oD9p2suAw4i6BddRoId1nG+sicA7gWotwDMpwDkU/LrKQGw79ozwutE7SRfnJygHo49x+ZtexFeGv74VorpFQFWzBQs8qaAXZRrNGbcfNfHPhkDCaqugBDUf90gqhvuiHzcgrQIx9FYKymj8q9k43fehUOQTcahpXZlr0x7S3UybvxmMAdzVRlLGepQ5I2e2v3tOCqYFkJcVFJOS+9fDmZ0fhf7QWnlWbHC4ehIY++RhWuEuPEhhlKkOoTQTWYcByM0t0w7nmtRLVnnZd6dhX2r3Ln0VSfrnun9YFSVUX5NaFBEJvdWeV02uQodLnIIVZjpg8iR9lcpfNsY9EYjiFjN/pf49YeQKRqt60BG0lKR+5KcYmskUHPYMQj8/9C8OsWt/EBHRtM2kMlwTFJMbinUvL6X0t5A4fp+pnXDOFty4Y0BDYtZ4o6W8uQaPSQJN880aAZusLzDWJF/DVX3f7+gM4n9qj8UvsZBfrRqrFH4jqBRaKqhh3kdroxwLKPCltQsFFwJcH6aLKXjmqdyn2VoGFS16qKq/8TaujCBekZDtnz80N0PY2T5vyUxvoP15TA1uuhbpsNV9MhdK8KJDfdqjC+xJbLzaDPzhO4YaHqUSQPbekbccdxkpPiMfk3IxzJbBo4IUubly8qBFxUVWvyqSr7NvWT5QQ3k7IXonCaSjjRNMdBicz2d3q+pZaFOrszLUx2POkYLGbmIbgArhxSqZPRaqiEq1GUPYdny8cERywg/QCJ7JtJp6P3+4Qz+5oOU3nPPrRB7slFFXBEHlONqvl3D6g0xZCvNWKFSLnAcE5Xc9McidC/nrn24V8MwQXGN0nraFrxSYrS3GaoLXwyoO8J+VkOmEW2WoWidM7R7EirH0lxNqMZxUqALQI4wD9QiUKG8EOeK8we9GnkQBg7wKLjLYemPE1LQg/tl6z4QH+UZmhLw21SCBBo+JS7pHpMMgxo0M+X1mZBo3XjRKG1tmVArzUMNqtEL2VAzlZonGm3q3zE3wGrE4DzsRSrf/s61VBJuI6TE0OE2nHh3i0QcBvQfSnjh27PR8vMSrnTHQK6gLt+jl+SAReQMW3N2u3tkSo5GC5xEwZSgzI7VJjqXNLtEy5yezRf+A4RbyMQ/MOnaHj5q4qhPn1uTx3Kqo4lmssv9tYBqBDrmnH3uCCb61/UVLCnEUgPCuR9iScWaU35isK+8kTeBRrt7a54qCyHr3ytAICChhIxbSvjth2bHuSB2GTcqX7BeEa3bz95BQoICEg5VAGIh5oDNqn8rhD3kOObwWbtXnyBtE6F64YuB0rP5gklGIdfUHO0hFuvLGm6HObcReXLLfQbbsny4Wry0DMJHJtWWEXlAB9EhR6nDHFbvBaMCjiiaLYTxqlJ9eBwTAgwmnEfhKHtfcpT7QkWbgO0E4m0wJqFQ1DnIx0IjrVh0sWwXG9QpxOSsv78SXZbmTOHdn67gpMuvkIh9+xw6UOmRmXuhYJBd8zPww5/+DwhBEdBMzsZ8ttJPZCxkzXwuOwf1zRf/OK3EU+gqCxvYVIec2kq1vvgMuzQiTjOkK83ievIbkyI5VxYmJkx6yowCJup8Sshi0VK1i4PknceVz1XEkXWBgoEc2AyHFPBTY5kn98EDkksFrcgdc6narl95E1plKnZUqxhZO0ys7BxqvliqdWZ4xM49J2yYvQZqHRmHuGKKig/Vti8CIK32tVJXAP27oUcN0zEjt0zZmWZh4UWQqdfjIdetnpGJMK+NfoMpzQDQsBaMJ3m6OQQAXfyF7AlwiHpfjrgCsU7+9OhAiY62BYilw+vqDmoMFGy34f0OGB2iuUwUE99nPIEPUoCmghm6lTiVMajTjeVUNefkiwjNxW/dgTQ+Yb7ldTfICOfWWMV/WxC5NfeMVYPkEHeZQ7lwZJnvTrGR14E6O9Me8XejjGeYNL71AG+3jCLL6v2/v3hTu7wpOD0zU4Wo3SfbmEDIqbdqLaUFg7GQMoemGYo7YdDPW7dEmFn2yl6FtmqCXf8DOvx2qbE8J+8r/DwubzixXL19FrVzuEsTRyFMa2caW7a7tASRTmSJlvD90B9SkGU7/vOQSmDM1hIUs5DsowXdhEJC6cCASzW+SKkSYP2FNzM2xUsaqac0u5N/P6huyJj0VLnBclY441J532VmK3dxOMPm2M3VkuGS34NlVNn/eXooDJXGf/ZpdhvF8Nd94LNffcw7dDoq5t2hA36elm0a8r+b1j/48y0KmgjghsQVdMzrldc6tINvQFD8str9k8/e36lH93I+Pj7OEZ5a1i7SsjyVn2KJRynStmu1xX/v6Ez5c2RDW2wmYj3N1kGcA4Kq4qqCgTAEr41bG+QwfaFyeQjnY5GZiM/QZTaCFCzyolUUAXgmedT0We3jn1UIEQBhY37TOnOiufY+jxA93/om/VurI+ltG3gA6YqB1ZrZmw6anE4atSXKh20HpcaYD9Lh8x4SpxiwEyaH7M3s+nQ4SReIL6/wzYzi4VvhW6CM45h3qc1zimUCiYPrYXpI7JSdnVT91xEBeuw6vPDECWmuSxbYjj3o4wadfv3K/3QfL/b4w53Jfx5e39TCp0n8c+fjoyZXmwfXP1aM8nA3XIdm113skyf11+azCMc2pEv8hmgVfg7v/SbdKt/VopSrOtKcYiq2N9Wdf5M/ntxl0+IxS8in/JNQmizxJDEoIQkpDXFcD8+q+CJZfIe8uer033kD6h8Dy2myN3Kv/T6CcJ4bKdYnMJJZE5NFLgvcpxbtwr0MnmqHcqHtNqJHhskdLe8Q7T+4UD0/TATVn+zt7lZuZER0V9Shaq8a7BiG3Kur1ZJhW4iSksmodegCm6y0K99y7EQGmsUJZw1ahi5GyQMZa+TWKpuMWktBgLsYLrTOtCmg/s86174D1/6dxWFnrOd7iV9GqrOgLiyQ6ixo49pV0G+S7yyNgfIb5MuvfnIIXIznb+ObOrYS/xKWpak+Ym8V5nOL09fx5mytPQYrF19fvvHsbvgO0//Lkhpd18n2JGXs0U3+N/qf6UU4LT2Lx+ftpqS4yOfTff8MsiutNOo1Uudymbzw2LxWTZGrwmb4WbXu27X5LdBl3WHtqM+rjBcsXK1bFLcgMaC/oiyku4CZnN3rz6DAGeQBDxTE5sxzNxx+yeMCV0dOT1gyz0ZtiFX6A4l+Ht5lOS9OrCI7vKtT9kH7iYdl45sUFccGB9VD7h7/0+z+Z71u8XDfbVhDV09j0ffkdeSXfK8p98ZRaG3Pt4tXWmBLTft/zdBWmOrGQeBbIFnr8PjF8+VDvYq6Nh3uASMzgJ4gZHiluStH1DWFYz9k9OJ5JvFmk627J3y0dgLq1Jcb/8Q+zK3CYJITkaHnpi/s3XmFueB2rWSPlyAx0BtM26TsC013DaCTo6tZZg+4Yk5BloIvFwgFckUWv4DihEGvFZj3+6LC8lhVRIbuhFA21fUbrb06TSeRFAjJg1VIGpBorBNaKqVJB07G50aJRbn0eEYOXSTOiUIxXgSWIRPeJNBNSVGieMUYbUGZMnpMBvMsEudEMTDviY0TBj0dbVYnhb2gi1ihgvQzD+9V58RcaVJJqAeE24d7TkNI0Jpzly4t/ObfXs3TiXWK8YM0WjvXtSghKFyUI/Sqyt2RPvPqsHJQsmqJ9NoxDkWApYkMKV60Kc2J34IIzUzPXrdNcfYE1r8sYYWsJiI2oYm2LXGho+9G0sb1V5K6+lIXts00Q97rj+x9p98C8ePOlFL7FUl8njzJt7+0zLdHkcDXFQ+haDCN3RVXjNNDOTqi1Ckt1r+YE0aTPvE5s8Y0T7ox1CH8YrK6cM8d7r7KYSehy9dMr58DORnJgWTcS0VoMUVFbs2g12TvfrPnlmqWJKNk/cF37aEkx8W5umNJcv9cT6nHVmHSBsf1f/tLbV49gHfhxPJ99MwDXdiexhFF2ovLr8IehWHp7CinRDep9LlXByq0iNVIZFZ/L8w7oaBmkU66TvN+DsKGiFrz8Jvc9jjrS81KnfRue/FbNBlNbJuHUr+GV5ftOqxbmKY4RDZKieRHbbbjNtkVY+qsWuCmNBu9Y88d/Ssy2k2Klab+ot37l1mMq7EIve7bj1qWU9+St2bzrsmUosAk86F38Z9c6VlBazNtMY5jmin4hSfPYq99mjB3sKqsY3Gjw8ME0aw4QUxYODemJ1bZEhkmJEIS+TmKJAUTbefW8YrS87mFc1i4WCUqm7c++J9Gv/E7Csvixug1gaWz05ire0JYFiJl58XxbQn+vokoNRcUSF70Z0V4fTRsXwmIQa4gdQGptJya1HqyV5Chj/Ff+JyfunDzymb5r98OK5dWloTN/y6+fX0o9+fTMjwMf9K8UUI8PqP1YFFGm1yW4zEDx/dGMe7KIAo27M9Pa8rNzXaNP5lh37/z/avYdJtg5zznowGJ4665/97L19mFQvScYXy0pv3e+urFw313rLpZcZos0QT/4FqyDvq0ZFIZEcyqrD3e2pyDSbl7dFVFA/dS9sPPwYWM9JgUbj8p0SXvZprvb0HaijF6WEwMfTz6eHG50Raj4lwuMzk8OloWECZjubxW1lSY6iZA4FMgWhuQ0ESbaTb60DpK12IYsfKdqjgZOzF1oR3jSv4Wv8FRFczbURQmiGMn/OzHbaWZ8Rsjf0/MwuuKh34Y8oIz1wXOh9xz1O5LBJmvhYVja7VFoJYwxPsnf2VetKYtMCDiesRB/4O7r+8ed2/P2wbdhOuT7Rmzt79Pvd2b/K+xgf8+8L7uSnjhPvk5wZKmaW1QREYUKyW/XLPjsSRK9ySkbYATFCS+2MbERacp09enLwVfirsUdOn09dOU/v++6+Km4jydMOiDEdcjrAXm232tw3JZVUSmblKYN9W5h8aFr0OLyIerbtPG91zfc9DVgtpnT8qU9NRqHpOEHenI4NKkNHcEREeGeccLEsNKsObmFhbTL+O9yi+fLL0QDOtI01422jvKA7gDf7G8y69Ml1Foaoa35srpsgHHmt+/6MYJeh7C/h2Th6Am53j4CaCxVG2qGdtkJ3xHyMBgphN6E5JxP6zb/63d/X70ac/dzsQG3H5JVSId3jxLd/FnxyvelGSWZFgy3Na6Dpt8I5Fh6ZVTXXwla3SfjFjWxREIxY0yCD+vfM7z2xfO+7TySUiMeXutvyJd1mDiuRPObmmJQESh5gONXAlHg9RG/H+ZNZczIjcqVb+cx7Fisiq8c+3upY0GJJ4XK3zo3OEUZmhy5CDteGfOvu/o1Xl63G3mP94cK6R//5xkI+4g65/ncVa+kX722ZkPHz3cp2SP7pc1+yka38x2CUj429aK0d4RHr8zc98Q3RXUMFwlaDa5bNPGssKeulIf+wQJXuGaXJBgV5TwXUq3gnDAW+OhzRFjxfhsxxRpzmPqGl9KHoniTyG7JDahbkbHRTCSxYi3iQHSUEkA0WO8cA/M+vjeMh+KkR9JRvGReW1jqUPjVAnlPfVF1XNL5QL3CAimOrEpcWGOsQgUyENAVhLnJWW5BYHYW9kb05linThmDivKVWWVnbWzdfvtbFapvl+EnYvRKTHT1p99Cxt4N33/aM1jqfrxO8N3EMFMsnGecmBcpD7+wymTnWPsKznIcL9cq/ggofWaVnRfPIRADy5wghbbrbeupLynvnAbr5LE93Ug3e530YdKIbnf4hIfk1KMhLstwDkUbUKixC2IlOqcTEp0dnNuudJvsXf3dpXyu8IneyXg3fAtV50il4m2X1I58gwZL+sQ9hq7gFFSkoM05hdVHZ6sxPc+EDdNNPcNHNuKMT6GvnZqprP61h8FfbJB/N92NCADh7b99Da3YylS7hNRrjLGb3MPa6jdUCZk5FWS2Ox3QUUKrTRXLSXp/N11UBjuWrFDB2OHiIl//IFrdmy2rdUiw2UHkpyMNOcwMgx2egubgw9glpDkZDdt3D/Zv1K2EsV1WHGYjISH2pjgYzunnaVyiJJHKbgmFwZbkJxdkX88X5M/WeCK5dGTan+E2X+OsUtluqTTJiHUTB5P/h7vUBuuC3xc7hqIZu/u5kRMtLYtpg4FmRKBMGi/CSdjt7SrtMUbVbSuuiXUbVRAJCs2gJpknf2TvgbHyt62Nrm3MaqneESZ9pzScDYyWQaX/wRvSDQczNmy/liGdLK1PkNiT7mCyHJs312ftmeMvfHw2fEdLYorVwe6Yp/xw5Qmly/GkBL8gjySotk5JOFxF7ISjY70l0cUuk86tlslofiWqX5IbyURO2JfaFOS5WibTEtRSHNxfVCcNG3QSJf5HvWOsrmfG/wH/L1xgSDnoVcqujiGcpc4vPmnhkBnjtNM7PHCt5Ystmcasfdd6xajGX+05PIbDEYcN4aD07Ioj2zy2KMdNRsIWx23VFNzR1pLxIoeGWatolKd1UzKXRQ/pDtPe4hTq1Q5nh07Dvdu/V3HRbQp+p2UDONHKEFIj7xykFNnRXvu1WEdWsRqIDIGR4/5NsW5SSStkhDDwWtZJAz8pxSejGNjxpzA9CRa8N0J3S5esYj/Rm/mImhbt5bZmq/vgQtaMwrd0P310uUW2MumfbsWK3X3D/XdNmro9lxbvSU+/6bEo+nSOHhFKVwXyc7QVjj46edG3sv6DfYb7v9dhj6cn3FEt0n7wyu1oczgwvc05vge90npqq/MlW4rHExfeLy0jh2a50BX1DMiutV1QfsMfZ+QGz1QipuljUnC7aTyMt+YskRiwN73peKlES+7r8tfkxKtQgv7UpV73Ctba1r+jHHrMz/5C1mdLA6zY5nVfj2WiXG20Buuu5EP/ygI1MtELIQ5G1nJZm7R6BvPvpEPL70MtlFkT7XlCwXCGrb+cETdrW0lRVnBVF45RUYIqSwsLG6vJaUhxvMFpAVy53dwkSaOHyhuObIALZ5Z414e4n3KDUxuOmPMwe415/9D0WnJ8S0llQffiSNL5Z5NdVY3xHGLxAHwQ+52zjFGDl0ozolmxOdGi4W5dNMJ8Nk7XHrQKnt7eDmE89n0zsaoPOwf8cFNEPmL5J6fNKZT14vYeafq3dOLLsW7n9xgU8Rd2mMSe8quEF2ShIR6gADRwJnAR7qKt7R76DrAm7NeTc/aDhbPD5WAQz0VBmjTVZ/40sP2KY3lZ04HdFCRbMNOnk2oDvNspJszAavNbBeNULccHFC7PVytgNqHsPyMq+xYpDO8OavXnLVZn41KDy6E05pim/QMlZssO4DhSpEmscmSrDkb0tbs1tYCjCYs+ozgI2cDQOYF7/yyBjCqYDwbD0FkxKW5HoGGYHKdX+hy/ljcZAPAz5zpE4OK5BpWz3adx468Y0CpnV8vOn0k09o7Z0mCa7BgmoYBdLrqnCq62XS6wBfmZQohiGYKD8ETSeChjiqA5rkPJhMQqIjmLVlJJHRPrFKhY+12XO6HVm4bA6zR97ZOBl1bqMlJW0RIH6aQQewSYRxghAtuWnLxvA8qxkaXYoNDgBXCE6tqc9+z5eLhVnLFBWlZj0xyTYd5fTGmPQUYGEk4Jt2OrcDNiK+xm0EclFziqZ4iwNkUXiOGEeQOH/r81GnxtqN5+n+wSIkKwBdpIswZzNrMGFEOZuzo8cEPuKIZ+fbauql+A9Dq6oVAX0fP4tRxWHMxjzxxhayQRp7pPMxzcc48F5n6YnR60mSg2Ao4ytYLiX9JL78/2MY0rJOkZAs2J0Mx2njkkzc861+bZ0Nlng2gZ0icvdnvwTflPgOUaQF3VrFfEShg/7GscazwIsNG94/ko0ITk4wnMdGrXvuku75I83iTHBVM9gVtJjGGjalhTsTlhZkeBkBa1NMMEyn9/Ptp+tfQjAIIwAbkK3lFkr6urmNX/sq/Bd8iPcRPXtA+U+3CHhif23rDqKjjPvYgDGPLeKBDdMVppPJxhW0wJupxha3A0eZ3mhXE+Ygo6knBEOAww7DL3fe9zc1WrHjUqeBSfzvmFC3sIomAHDG2v/fd3c+X6J/+9Vv7P1+9X+1fv/8c8efg/2Wj1cV/foV/lgsbDIj7yxxRxkvZXKnkyjhvpcx267XMy5Wq2KPbTUeC74a/KpHaGXBx7Uq0gD6bBsrp2K9IjKg4KAaua4cmsJbreWWcZHOzkqkY0JUR7Xv04k3nRu8XTxsa73ZLQM1EpmJAV8aIZplzs8ERe7291uX72kI3bEi/NWXftfBWRQKwcE+DrT5duKSM97mrH7Tmlp+/VMnaRnTCFQMJLhFvK9oEEP+2YtMjn/cx6K1k7l5X9XXM1ETX626npUrcqYjCHRzwvbyMdQaAvOEWjUB6pi1UczS0V+ORmB6e7SsHgOEg2lDsZDXAyzUHvDTd/PZo1tACHCiXWmv4iQcw4EoPGPBAHd+xCrYqRvLlIwQbeptDla2JTPHEUHrCdtFJx0uRmk1WRvRBmbOuu2tnjeCKqauk8R3NA2rdGkJKcq8A2w7Ug9xpdddfK9KmtMunDlWkhDXLODeTJDemmDfrJOrOvlSi7Y1otilLAdpj82igPm+pmsch8N12nEvQXJy8EAIMDzhQ8Xg0WUlYzq7aYV2JKg9be3UqD1hBERjx/hk+XJJkLGzGImrhtWca1NeqbZPdd4PJfStuVnuOQAjGXU42FkNnlkrEl/3BMq6cCQkk42xBGKORuuWN3rpVGCxPyryXRh6wsLHBsOImEFlkRNPZNfZqO6tEJoIijS6tFmC8hOzB5FHRJaLMpLw8wsot9W6fD2MUDedCcdLCEBRtQZ6qLueomzMYRbKVPcDb/uIOcqplcyEe0FqmOJKOYXo+xBbtAVQbu+RKzgRFRgjl0fsNmVJHqAoI3eI0DmarBji1H4onwU2SKmYPafgE2kmKgOG8dPahY9Ik17VwFJRBh+KeB1s8J2Zzi6eGGaOU7GWweSnTNEZIdb64S5wJSj5d5YB2u4qRPF9HJIO0ih62WggJCKk77+qTu5ZTSl+ci/nmxknybCIjHAgoAF2d6dKm2BK0lCrPjVkitFaFD8jhRH8RXcKckSGc9tPwZV9Fg49HfVNc4D1JRwugmQQFVaXseIpso3VZH6ypJRpVgLzbbpGm4kUR8CV53R5iXSAsEcFWnobCYi1t72A/MT78kIDeemu9BlMY/iyYrkBumNe1nPtvZ5x9ijQB5dGRVKWomgGTXMVZcgKJu4aLK0f9tp10xdd02E97oZFuSufyBl2MtSOHLcUJugWeeRSAWG6arnWRjmZzqZRcBU17TBOipEZnDkw5eRJ23LRkJJXeTENUC4ql+8V6WUQ8urHw9bBmpnmh1FwGktyNmqt76QMkFseuc+wGhY+D7mERXVooLSKSkE2jeJ6tchE/f3dAIt1c20i3LEeSoTc3rlemhIHYFAA/qgxFx1dwJQe760RbWLK/FmjCas6jW2nimoJTcpGCyjtXtZVwUQz7KOSUGFOm5xJrUFVaxOj+uDyHutbbVq0Sp07tLLJLuxerDWNR5PtlGQZUpO16rXtjDgfN2oS6ysXeODcr1/2Y1KqKvuDxDqZ9i15GeCvS6fT+DjQPQUsRXQ/I/stjtFgEQZb5noPpMk01p/WtW6qRvhTMBj99xV/QvakAnQ2jibJpMYqpmUlsyWa8OImsgaHMOD6uJ+GlDAA/QrHjnU9pZGecXAG61FAvdxnw8EFLur7ril6ktGuyOE9NIOtEE7MEbVysibdTSsh4vGjSNBDdhad7gTXLC7LaBShl8ETWcxsFz88nflsg+82sDohJfD3JCkt/vFPeUslGtX8BuJ8gu/9TLLrUOrFF43nAKk4VMKb8Va1tAN5mzBmDUsYDUBmxDSbKFlEOioZksUenffocSzGQyYcxL4c0o99/OUVz+j87WRDA9pHHz8izkpHVSjcGSWjXAdFijaxX51DQsQ0DAPNIVvxT8lpgwkltjQHFydfT6saySl5vdR4ICveKWSpx2ZFEsl60MViYJ98HUda+QEXxohmIMOfDRpGVVpo6RK3mXqnN7hBN0yRS05SdRxvn3Yflq8i+xXXfZ5b5S2bMxtNE0PSwFpvaESfeEg+JOlFsVyQ/NK80xMS5FwL04AGm4sDTKhonjgPquoDNXY9Ier+8+mAXJ5DybFMUMRtEE0kiakwrzgJrC2QPFMp3F2NY6Pe7Dzc3skI4HeM7P0x71M2tbpaGkNlMdG5pA1FxCqeGeicrIfvQUhfzddduwO4Da2KAfAJYuMQx60QTTlxDkNF1AjpIeR+05sJZnuublLyHybU150BYgBdeiRvDuJV1jRuTzdXVw8Mc9y5mEVV975ULn8B4BDoeXcaGIQsq98kXKQksFumueh2PnPlfF7Uykr2qZKuC1A02/dripsdG3H5X4bVwb2USzYxyYAFO+1eSwf/NaSFJGXDOwMC7sQEIpUccxMwZz4YB7GgzhyyZJGq/yOKB/hBB4UDx2qixldgiumtKLJzb4LGPUdVzPGq5Zi3fJ4XEGVSlHC2xlMI4K4hdLqygDtKVD5+6IkXfvLnZgNamhuW57WkE7ANz+QRcpkQHT9XVtmaFqqPx3H3oX0G4dfDdD15OYZtJ4QjV7FEuGYaqh5WMaeeEEXCqXOZaeGZVJUUbAhglCQz4QOptV+4vrB+P1qFhzM4r4yQIYkODCoy+szqcg7eins11ulOW4SZJbkPbWp8CxHknejurwRezYd0aHHNXewUyl6NMQgCY2MsDU4Sya4E6zArDFTw0+1kjxApjb/Spsd1e7fF8R5GfPGN/v3iMDllqwDVF8HugF8nzsIuOJPKNJGgv2zcDeY3/rrSNNchLr2kr+Y/5k1bbLQx1J9BE8lCe66r5mjoIq5ShVJCsc8NgedK2hcZamWKX81gUoVzrIQUm+5SlU1NIJdqoIHPRfX2w/m7xEMcRrBVP9Wj9zpSlslJqLWFKQGta2gPhYemXQmcEAJSbbRsrKyWnyt+lo1Mz8uFsbNc1o7cuVdbA5d85LONFf3fMAtiuI7se2wHApu8o4Dh94mmMj3zJjhUOcEzwt1ait1z7qGi9fuclv9vt1qtVkOu0pGWAKTsn2Xcee2Uv+0tEZ4LGuJNzaMMGw0EDH0A+vsB46AMgNGbx2nGsNDJJxjTNeAzCHHRyf05vMbm/Jw08Rs0elOoWBQEf/9sU33/nd/83ysBd63+XS5+yOXAfPjjTg/f/PZM7U/dMyQNhDAoggP/e1j71ng0JpKOalhwBm3ex6IGykKry0nSuNV3mplHxQRp+HOgqOJcRvWpbsa42cqmmsZejIs2HkCoCTLRZII/0pdCGxP6VHuHnu8TZiaSgbF2emU7PuMQ6kCr05mCvgy1/mDDaH+CK8gf7DYesffhSkQ51XXxX/Q06twPDV0LyH2EnOWsM9j/aPqB8jzrHYBMT90EDxtXM0IUZxpWgOVdQ2EwtNOi/gnkGsAh6xpVg30CJ7e0gYBqwNNwNqaLvqnUAf9q1Oc1A2gySWUyUZNN5Ua/lsAe2wyL2GOkNKLyxtOl4u35Af8ShunjiD6ysTb0k8A9YBrtqEjyF/XaK94pMn+GJnSbboRQ7RQB+1STEAh5eJAkRgt8sRhMujhO8r5nVgPLTcq+rHiMOiEFGhzNf3hTwH9cNicRgxJt1aRcJM4ZFIxNPK2wHxjq51hxudO6gDdfmXq45M7+5ms4kpAwgB6TYwSusB6KcmecOpzHpdZeqUkbS0CYq2i7g/3fkamZEz7Gthi9Yn/nSK9ZE0fc3Imcd4SXGII6IECxEHDAH9NAps9eKOuJKO5FY41XL1DD3ikCACNANIxscFAq1ukh6Yo5mRiCAWSbe2rNZND0EnABhbfwEKFPnTjDi59oJMDjLJ8A5hrVmHPc5HikwmC8CAWBG1JwAAebROsFYuh3iuI93cZzF93AndfWj4pQpp6NWIJ+KFoE/v8eIQLhoioijvHgpIoFccE1EXOozXsikrCOKUVlctUp1TXgJ0eDlLQpHvfL5CqpUGc7jSxaihKHFy8ZwMQXlO72UlgbVHudrTqYiTcBjhd2LyQXw5XffGoGFw1m33eqcZCmop8XhuXhgelkwxwSC7HilbJXWCaVSZqUsVyF9ZXhxwRSevyvlYEqW5hm7eZpL+alMbYhK5Mo8YUE2vUuGbxRG5ozcvaW+h7+7sFGvidSJdBnrQzn4ytBV/G7oUbwmeJ7VwdPYCk4rD1nFbwSlrQdI8SUBajVwNYoCjWX/tCW/fLzKb4kLfmq80o+BV9BW8bO0eZbROPg8qmrkUtWkr6lsX92Q+haN+Qa/O17ymsqa3MicRRkzn/ThRWmjl8WjK9FjhjCVIFWDn2m83sDczjllpDaVcqeRHCopelpi0EmoBvtSLHeD6YrhZ2nxpZfjSlos8xyDosONaEJRFCGftc5QkU5Ii8CpCcdNG4bjEEL/96UEBtxLpvmR8SQvDl62WAdJw1LwHu503JH2fMSrIw3v6oDHuzisMhGfDwFPB4+zx0hOexzeyW6VcZhVxvo74LOOUExIliG2h5tDFP3qnXdhc/t8enY7n5773B8/PJpuP9yaHoVb4Sm/2MpmdiVBVg8fHkx3H+5MswnVfxIehDvh/5itBP59daF+Q1bOVZnzcG+6+XBjuhduhKd0sZFNLFdtmifbeIk/M322X1oJPwlO1wXwU0aNn88wwwLSlw39xYVLiN/D7759g6paHz973S8MRpFPRMHwj8FZee1jdUtZaz8uJJzSsBgbE7N7ocAeM3zWHiDKvkNhH9c/t0+qr+0bcRMAAA==": -/*!*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,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 ***! - \*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,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": -/*!*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,d09GMgABAAAAADKcABIAAAAAZIgAADI0AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGoEYGyAcgiYGYD9TVEFUXgCCDgiBfAmfFBEQCoGGUPZjC4QEAAE2AiQDiAQEIAWEeAcgDIUfG2FZFeyYIW4HEJVRncZRUVKo7Isi2DgQGLlZ9v+3A06GCNXQere9hjJR1GRQtwV0+jfjE4vjUAyx2/3kFY1g5UapoITqJEVjdDTqV+gaCn6zfLoY/dDgs6GtWWj7giCKzRtrpjjRf4XFxx9j36uP77N47751T0lxjd1HaOyTXINo0//Z4+5Cj8SpEbtIiYhWPHGgooSY0lQpVQs1T03T9yV5EKkboeKpiAcesv0g3+zO7L+7AimEeEASBlHWovFNjahsKkxd44HjgXf8T1ulegl778wyfNUPNXNVzg6wB8gwbKnXIA1dXWTiEL+z5MnYG5piD8A2ZYk1RMXEwCrMIkSJljYKrADRKWIA4rCxZvQUc9PpxK1dqqt027sW7bf+j/OnCw/P2cB23fV3HIf1BpbXPI+1F0hq0X7Vfb73YgidiuRTapdhspRjygFTU6AUxy5b0+3UdfnDmJ/m7HsD+AaSmSRt0vJuF6g9ZA2sxLNHFfqT0l/uaXX371zN4P+EGYLcVtv2KG5IGZwGnh3cVhdjVFXYVhshVxJJddtRGXSqEkMIMGjADpbBYxGCjZwxUbq+HmeO58g+vl7Gx9mW0ZjJ6fOparUDgBAhr8l3dEiVuJEXUtGl1FR71zSYPxgAMwDEIShpCZLKXj+JvkAq3BPlJFFaP620KVdbXshVSAqOkp0vx3Kre1ve5TLO/+X43qfTE7sDoLkAGzSp6Mp68UJdgw6LFu0ltkFKA/AsgcB0bPt32WxuZ3OdmjuKLF053HeSF3Zp+UPpVShcJPKcpD6GZodIvLFtSj3jihI6fvrqZ0svpvbQwq4J2WAiy/isaG7E/5Wfsdmrk8XVMoyJYqCA1BO9+38mCChY40jMiu0OwqQjyHzkCLJzBHIbcoMMFcMhRzAyRzA6R5BjQy7Pv7njzuWuu5G75W7uvse5p97kPvokvkCO4NtrE/zyF/m4AIDt4V4CXJaDExek14MpMghBY7/XbMZrd1XbiVmPf6lSXQrf14R5JfOh1wU56i/r7fTqcgT2rAvQqff04+H0BCUFDnk+iVQc8n+Wktob/luQZ5OY1IkC0KXvqUohgcEb0po/1ACDGGilQIND/CMayQlhKTrhTh/98slvn/3xxV/2X40SbaAUSjm22ta8sTVoNPjXMsuR+OUtUeOpZ9XXf++HD35+52XKjTcBTS8NHQZgwvIiYF32KfPy0LHM1XgtOLnJ8Wvr+1R6X3IksOtzd/H/u0HYPhYC2QwA3a/qATwaZDRMB+L7y/mjxr9cXUgIMP61wmoKyJ8ebUGcUGBhz13v7VFEIhcgAAFFaKIDqqnUqKJztAJQhHBAco7GryBy8CuhUwRHZihDFVNjWWyJQ/E2PoSZ0iNqDLmEuNzlMvs6cn3l8jd/Gb/dn/bnA5Nd3+ILBCQ0ZJETuZp8bdTFq72/Rpc8XO50mZZ76fKbtk2bI5+2vk6oYDP978pFDP//3T/sBmj/ci/73tS2qq1nW9qjG49ePdz/0PdhDjz4wsJSWJtnvAXgRb29GT96653vS0zE1OtEb5X9iMH8Sr7Jo7tTt7dEx9j+GrDbXqseuZ1miH3QWmWzGnuKX84ZZRZYp8QS602y3eKINcs6Wy3wzmwTot8sJkFjk73+20nTSZ21NguTPQ5pqjvtF6GCaIYQsljWFLXuZifZZp86My2yJmJVmWauGnfiDlpzLLTyZeeD3pkA2hTMwz7SDxMxLb3a9uMoLrHH9lQxeui+vKSRPbsQ+P6+w72NygaFXFZfV1sjrZZUVR6sKBeXiYSlJcVFhQX5ebk52VkCfmZGelpqSnJSIo/LYbOYjAQalUImEQl4HDY+zs2ONZAfHd7NUuDH3Fgf3aup5AdHdXyvchdEDPmjoNkS7MiZwdi1mtoYr9nAgunW7bG4krGtvhcKpYghdt9qMOHBqHTUkmHQYuW0cGvFmzx/qoBil6DKuoWHRrW3t1rNe121GzIBWiQbT+Do1rjVCR8vz+OfEzRbzxi1bNitZW3JhZPyaWiErnCjjDqgmKrjauE/unyLK0Rb6aDCxneF40AaNzMmFTzjL16+qwC1JILQvBg6KQcOsy5zY8ebj2gpZ0PeV8VFa/olsanXEkGRouzH1mSzL+2lq44rqB873C+EFIfCp+ttu0GUYXXCRiEedJVX9Vn9WHdHvK7smJEG7IWF42MVwtpwyZWFkKLweCW6oU2NUqzXYmos5aZS86bm6senXQEhYOVs4gS9st3DI24P7KE9oTK6lPBV/GLX/Y+gPIRfQyzDGkmN8cgRpv9kZV2VEo2/tBRRI2U/uwgWEvH93Wn1ik7qT+ws3a8hnOKlI+3KYvMV6rVWoibLMm37CkhXCI4Fr/mROIJwDHbi8EaDNv6pfFMHxbpFcrzW7NPpp2S5lY7njYHEo1LN2HpmGtkzwYq8QcoqnN/GNji6t+R2WB9lMP0UvbyynJNNRoN9NShvS5VCyIip4Ozt+3Z0Qqaz++p+QhJh7kfrAkFUJO57oB7ogsg68CzH/8gtbtFzT2SMF0SwQ/dYb3yEWsJyBIsKnRgUxvjnsnqNWgmabLNeG4ySfdMOL11BsIckq6DGjonLOJ/VNJqNxL88ajY9tt9ClVuJCF2r5RkpwZXLVnKkFewITBOgnV9xWeI3T0sn4Tg/1MQtd3goI7SMmpZeS7Lk9kizXsueRK3YBSYeSjL3RC83bzMrpRaBFy8wzI7rVR8HYiNYFMTcr4qdDZyUOm6tutj7kU5y4rEztPLyEkMLZCwzw9viOMHRhIfk+J0nE6mlh5eQfCpMT8v2Ph/A9A0WxoaInmEwqzHvbfpmEekoicr5Nh9YTq1DOoJ/VNOxaJmkUDuaaf255BbaeDCzsVeUzbY09Wp5IRYtOWZPp2KHMyDdlnakLRQ8hdAgrcpo1niVNlGyYHPDYVeqw9J1OInSroshMZ9RyA43VFmzSRANPE/RK6j2cn1AuwNckiySHJNCtAfbCNxAmN47VvOWLcc1VKjLV4BidCQUzqCkCd1i46t0Ah/BtLGKYHG4+aVEkTAQLLi+kJOibknPFQzkamCr5TxYNpRTm8Ssok7AANnzlb8DTibL06wo251hsGDTwL6OOH7fks24yzWfSIA2h5b0QAaE+ytFQudurqDlY9hWOsZLAQhIU72gITY2uuA4gTqCiH3LXr5IRwhLCWZzpdm4tBoBrzAQOyMkHnHVogV7C0+Tsi1uebijwQ4+ccKVxmOGaiJK1HkUHqpMr7+doRCNR69XbeR9k66KdaoLcWDfRlQduJUAm5ENZI7W4nNtlw1I9HZ6IHvNXxwX+EEg6UUyusL57i49ztWrYp1rmPMVEgcd/YNBcpMjE2Q6XBWI9sA7IVoe7LdgNNFQl045ymZfVzSaGQntVsa6Ff7A0bAPDDScRlmbVRs8nAdnFSDqZocRpYCkQJjO5vEvBJkb3VwSb2oilDmetURN+elJNsbPvrAapFuHDvBS362DEdKboV/lpl2a1uF2L+14ebGL/i2rwDgi1Qvlljn2Si5KN7koCExkOYkgAkf4ax8UeA4yt6LI7ckYns+A6FmYg69wWzi1Ptgp3CpV9D0CmHMsmV2rpoEz40xCc9FqvQZf34L0oJDxpbFvAS3VBm6ELeOpa0UUiKykj6silwV/yTVdapKIQGNgVa2KLzRzTMYABFhjx9N4QSgmAuFJtvci3GTb50YUHRvoaiHgc9LEw65DSpEJYZAvcml4Uglxp6nbubTr4RvK4ejbvBw1x5CpkterGWl0TmhIsgD6ER6/ArBqZPmSkMjLNwIHtl6TzC1LXPUgIThFvIeLp2fEcF1o+DGCeOoCtyQ94c+6Aa6//Q9unoJppuj8KeAkDD0HF/KkD8huMdOQSXO68yw3dd+CS8l/GKxhtYzZS8021MTUu3/JjnLltz0r3n0Wjm9J9CSCxVkUD4d7oiIJ6YFZuESykYqMN+c3jP8cxYPxxHiDSek4p+yuuluFYfO/GE2OwLSrzL/lgcNV8bs1VLGBT3b2LVNRlF/UbZ52DTiCj6zlyQFH7XkQwmDQQK99kuGA8nknlNVPwMyfMf+IxBF5v66e8Z87aZKKzgdGFUzzF4YPLRUM8pem1sJQ9LYb2QBwBI0vesnUQ0Z/pPrm7ogUguQhRiRPSEdxyZWH8wsJ/wzJcaQq5pds6ky/1bZw7ZVPe3rnU5C3GPuObFnWBm/8JSBqBM15va3SL71seEUa57LmtOCZWCMnGqN3sf92bSUEBytYmM3OQpIcuynq1lYDZwa7awFhGtB/wCYyJQb56gweEGqJTc5FguxhqRZ+iOtHZ957KqN8hJOeDYjMGrHxwUDO5hXMLFv30s33I6DBLOkQsHQ9NTWx2Ljn+bKddDqXYdbh3Mhf0Ra36MM+yJL1vOOkcSfb3dlexjWu597cnprRQoY2VHkzcDLcZ2ktnBDirDFyWiC+G+zocRuHOe7kRfXD/kCNcQjZMhCoNXp7im02+W2cCP3kxYuNbeXOc+OlE/OWVV7k7QXMebiObC/bQeoPXdU0tz9ROqffb5BwOt9/VCbJcaOxS0MKGI1Ix1ZRaYPgP7jiuk3y+cZjUUl51JEmGx5yrnjleUuWy8SRzbu/XVVC8I0AfBWIp1Zu+CBX4GZ5t9634grpqiJhFWpm4bRRSIoXUko3yNLPto470Hb01i7GBs3w5nqjAMImnWArBFkEFbLytQlXSoSq6TMTJ2UiFsTZ0AA78s/6eWtC1WN3SGuipKQpxW0pjLI5mnePyRipToXkUjlhNRbbuHhNTIrOXZF8saAtxOgz+m30bXRTXewBV8zlzL0fsdjMUIElCTVPjmw19te2hdMi4fTEuHI+tTJ4w1UCcu5X7SE7C5wo0k3uqaL4GEISplUM5QZbE4CeymTyRSkJRnV63TjQ0rhVMebLabJ614oietCCB5YKSg/0j74iGBkIn9EZnQSteWpuDeGjIhXTSnW6DaNCxUghI2PNCyC1FWCXTAXyArKgE+cVpZcHPT26NbWGJ7t5EN34n1LpBs5nIPUeibhM+48cLkZcQ3yNWVCPb0hrTvyOVnQu0LHCGG5DxCZnoGyRNlzRkbwfoiRaOEoctq2vKXtF72KNWcZ618xvhifnaD4yUHgHsMwl6Fxc0oMO16q02badcHgKZAHI4+Zw64RMKpCNbql1iy6S6+AjDNMkiIcIvdAL/Ype3QvOc3c9TRjHDB646vxEjS3oQc1KoapahudVhw4jbdAaOrPHmY/5Iwv9BDnle1iVyEG/k5yzQRad8Jg3fiMsDtWMBCOB5HUelixcqbonGri8YSSa8JY0DpoSaW/E+38llyLm6ANbNX7FbZDpn9j0NEl53oKVsOMGyHqMlAeuAb5gS6/JLD+uiOpxByD82Mk2mNQUyQ8TVZOyckh+ykxXk0lipBAJwpWDdABk7LlYqAk2yQV5JV1XHKhxVKT1Wz0VwqyGLDyd+WWXWujskzwLDEQP+Guhix4yMJBtKJWJWXvJx53hfABqVFLcfTbGSeZzqsghZGQIiQIQG1aIVen7RwTmwHJsJZNzNB0Z5LCh7pp/YR3VY4vVRG3UCODpk+NapFLb6tlPDyRha1dM1KmntnLDQGY6MM1Ku+hVYE4a0vlZjWAADbVl3Hgf11WPWxoeZxSAS45mNSKii9KcgodcBSGW3aO+QSzCuCwboq+65GN1Xr+U+v3GiOfAvrjL4UNLCxYD0BIMVdyQ5fjsWNCgWYwruTNQOO2oFcBlfSDXIj9obvqprN9Iycmr7zxIbsqUiPyDmf8sneE5jP4CPoqqjin4TEvwhdc9xKYRjdeNlQqqV5dzUNSsf46BB5Xa13swHX5ywxvqw+iBO7pYBienEQ1FkpsaDhshLNQgR+gASW/VKKNqLuch4ynJKI71c2PCq3RjJzTxKvig0VKsmfEVz9j72bbJ6BD2oBNkFDM0PNbsVkxJ0NRbc7WySu0Dg8ueHOkVfyUbGMQGfiI+Rjh+sqiKijhOm24INVzyqVLRwPGp5k8IgOyBOFF4BklzfC22kwMPfPxPwgbh3v+wB51GCg6/ABjIZH4D6ugI+qCbArSWUnQncS0T1OmHhOpVM7N+1Au7zZwIPPFSfA7Ze9HAiXLQUVYNy367crx7gXyy3beu00F/9s/cdXeBmC4xvImhBU7m+NhFURnzfLZiOCEZ7tRYyzWesKAwHEl3OOUE+5S6ftkmziOHB+WwSlor6bXfFECGdZB5UCYZnv+8cOwVkDMUVw2IGQWYROLZS5w83FTY9NiOM9V8cUktQJ60kVNtl7xyB798Z8Hx6tl+x4azvVlzN2lWNCi7qc+MahpbcfQmNKAnqHKdrhyK/7r5pBD0U9dCxgKMZtFNsVm0rvzW42Q37RdNkvHyxt6CPcW3POlu6HaMnQYOZhr//m4Fz9C8agVo7alvkRPHopf/uyr7slO99qbrDhzuDn4Lb/YevFfxNLU71UZhGdD5+UtILi+de38KXR2n/vbjMo1++p+qZ17JboguqsMlv5yVz13KA/o1MehDz9XMVrPRdaYlbR0w9w/gzl6A1s4VAyr2Wm5eCV8hA26aP+HAvPoDTs8zNNkzJDcZwBybB+hxFW9FwzH4ZQt0bbA5okjip6GIirpw5NzDDUylVdHMtqo+0ECXVZAwep9Y0IQdGqnpd6xfrwNt+OsfY0EzM8g9sn3Vvjp2pgbWCf8BgpCHN3VgwGq6BYfF6+nLfpObQON9dXtXIChj5omXvp5lQmaufcifmtvJ12zQTWe/66J5nfnxqdupPip2/efTuYbPumbntruyDU9D/4r+NPdcnWcAdg7SnviDI1ptLUsYaEwlWnZ0XBOk+2Y0+JqmrvOJ328rM+q2nmWJDcKoQVan/TV1OKHLUOP88xG87ZPA8qLD4eQiMgHJ76PL4UmwVnJqpq+cKS7X3OeoxNc86U6BajJsyTMlpS4YnYkhIQRtZLFHHXwlJ7nXWjUP0LCbvcje6ya0Ke3yYPWLT9l5Q4nz22PzK6evbF1RzqXRj4lOgMuYWguxdt7YcXvLjGFCvA63nQUTzJg3jI48mbfAaI+D/ttzDsIBJxygyOMMGfZsM+5NsKh50cix8xvzRGMWiJyVZpJvJf4MWumGRm4rvlqzFdWGzPnYyhtPm2Pe1fkFjrzv26jzix1xtwylBagkKh07pb00roSct8+iNJJBSeCgqV4QY6du3pVzixd/r7Qb17mTSZW5pfIHMJzWwsk9dboWTcCeSypLi1mDfhh7fynO+UJQfJRm/wXgtLggpZSb0nlqfMJRYNL9faX0w/kNxc7vlT30PpiOX5OJzC5M2JuOP9fcgD3TkVHIbnY61J2vtAEHmtx9CbWAvoPdZtd7JxP/M4gG5ruvaQAmRGkxCHyYQpHBo1VL6o2rtveavl3rP/zHjeu9z52dGUktG5Lcb3qy3+xeP7U1mzPqzHTqpDtN2BeP/FFX/2H1ePnu7eaOxobho6D1sQBlbHcF3fK7P7d/H1Nny9Qi8yORlMBIFC/WnemQpykuT9ecYitsJjlBB/O3LB67FqInv16/BH+n54/0hAlw4MCLK+d7OrSuF43rDy0Hc7LiUREokRnjPL7QO5yL5vYk6WeWVlRUiCSVVRXCqpqqEkmFtykLcs9tD7W7vmUOucGNoFhK4Cy2XJ+8oKpurK/qSIpekUVpACYEasrAYjVYRr/7ZGjIlLtnQ0ioAuzxZwABdKrx949usQkE/gfNG35Mm5wA+K4MVXjiLIuJaRzEzW2f0BGIyxCcz5dfPvlgW7Qp2z+rsnUKYEJgrGmACZk2kMuSVtfO3rs9ea1BqCgdbV9bEUxd4/qL+eGkQjk3fKk+VoNVWgzoClWpEtc46UySc4puUMqZJDdPftLljfMPfhzarltXor//xYd1ffLJDW7QuN0ujZgHcvVpYnmRlqhQYx80nqjc+UEx3PtdQ/VOIGxFgbmozhUJO3MxFxVyzHl1dtn8yPdgD0iSffz+VUi/Bgm0QZUFsjP8mpjEaWyT0RbQOpVfE2EZgvTKzWm7FN8omnb8rh8FOxWU3labSPH2j61A5LrkuPaR6aWJzd91r2UuuOBhIQq0db8rVVRFQAWEIqVhWS5Zzj1UqtAKLHJnHpitv5ll5MdujWSo65uGaEMI5N/8z0gZsiE7RWCDVmCxh8z7dbvkk5QuRNliAmex6fbMJZVEWVvVkRizLENCUUu7j0k3zcjG2H/igMHfGONMqds3qs4Y/4RdGE76ZF0GycLocKwx9mRT8sRW1cqlyn+ts83TMDp+ppnWFf+PJs0av8ZCAU7Y5ReSeMcsaLIEeC9gwobxU9WKzcPfnfn8nnZqlk+8Xm8D41eHaB4cyZVG9FsV2xU5d3ECZH9JnE2IKZYmAqF/lIsryd8P4eriW+vrH+XskuzvR3Vx9gXZlttDImOpCRwGJbLY4g0hL75Eajxnk95ToLYr35PrsWpLoHgGhuT50XU4dcVBxZZUdx8MOAcM2Lny4es7Sx5vtA976U89uz1t6AS/e2trIk83U+03qIlj0X++W8EzNa9rVIM9g33qjt+BZSvL3l328XZ3vSr/slNtZ3/zll/wx/kL2kWEwkFeJtd22Q6nyT/lj/dObxKSc7uS0jMasVeVIdvBBA+TExVqr0RQzhXVcVoWcD+A6P7jMabKlQnPZz2MFJjUcF4i+BqgLrq6Z2vq0hC/35nq1ElzGrIXpI0EH8xzJXlhi/IPh+fzhzDc1sLCot5v6Jq9emDfhdKSAtqQL8YhQIpzuRbIr5/kuvADeUcFrJih/UeAo+KClAJuIq85ntJesGFdqZ7RqzUCZER0F9MC4na7nKj6/INymKJ0UrAPFuDT5JF41E0ZyNrrT7LKVcwoL8amySOw6K1AWC3d4tDKg1p8qk34/Mj3PRsUy4bOB3UeadAwOY8I0tuIIsuGsjK1ewe9Ve0U0pdAZvM95WekZ05rTg9KB78+ZD6o8zCZIoNHqpbar1yB3Vc9X+vv/fnm9Z5nHvkPsCGIFz5gb3udVwXaJtdcfiYvPKyAnbTUC6bEcDIcGPpvHCBQdKeK2uKkPxO0qdp8P/ceQEQQgxx/zr6Ad3A1ZUHOnKo5dc5tD9l+JVW6E+WLDM5Si2Zy0Eu2LLPSPB+sGTzjqE9seZI9sSM/rmdeK37fJpEuYZds6ftHyHvDr7m13ofq6YlEZ3bnJaBKjuaaz63A5tEV/Lu3VX3Wk4zCWHTxcaGDZk2ZhCm+2XTBSk+P4+LT6/3JB862v6foeYemu0dnJwZCruu4AVV7N2IDJgS1nAL675PtWYk1HwPoeWXi4gwT6k/7yw8N6m+cnXOKJhP4QpWkoa5SnYg4LkNosEqrYV2fHLLCjdCg7V4tlfzoNinBvqpwS8teWzv3xiNaIl7c6EP23XoR1hI2bu8TVZtaK92yKLJzwehWVpaWcbBvop287d/vEdpqy8vMyUYipMnZx8RGEShagXuamTJ9FCDZNQVwt0/dnLu5GSWK0ekxFXtmlFgYlWZW6C7/SDcGBZreiM62KnSrt6JBvJJZAnmnqczodi1xsAuT54bV1zT/itBz4NBSKm8+oj4MaW4mT/THOe625z+2CEvBCCTC9HRZqQAdlmphz9g+flSdOq3+0f3F8WOHLRCWuIkqV1NQWg9UMComPAwVFRyIjgoLi0HYKY3voVhRXNYmGBiFJMSRUa4uE4U0oPC8QHRMSEg0IiwQiWA8pvdLQfADwlNQWTXC9AxJaRbfGxhxNcgtJ9YQfz9o+BwdF4VNCeTLaXdlwVq4JZn5WWbl9FIBi1XETxCasdPyOcVD5pArT4e5hWl5cZZChjDLnF2axSi3zMrM4xa2Qj160pVspYH/vl/3U1MONqLTunrVQE0h25INiQ5hm1XxjfUFba7YYWD/+ll6I2xVpRmp9Zgmu1aYlhqEQoSExMYE+O9w9olCgJ795wOGi1obMNFSJZ5PtMHE4ItB+zy/SrRPDkESHXzgCU4EeJyTvS/+2wyDsoqmVC9athesk6Nf+Dc2/nH2EP0oKpFDplqnWTxG58UUkxYRhBqxZDv3LLtDd1nlC/Vdw8e6LXRWIWc3TjWXX/paMCw+4hrr4DQNMIMmqu88z1Q1sdujGV31QqzrsE/uima8u4DTMo4uKWpNHD/cL6sbrXeX+8vfwVn7sxE2RIOcgmGrfrOthzaYScWg0Fd/pFrvfg08u9sIJDpNEaFeY2fhY6lQcxB4qXrJw7S3BIRbiXuBqEaAYZ7OWyWLXmhYuGynyyVBJJO2LQ9VDx0fqhlJcpREE6cs+gC7PQySUnwb+Zs1m8c3qzebWxkbq3leVkHaA5++up0arJHW3o0fQERNAbT2g5rJCL5yrm2ya6G1E9B+XPfjGi2EjrIj67MmVzGNowh5kWGVybdHSWOosCve4kJiTpqOOHdvQZ8BOTWT0Ryb0F//33fp1p9Ko1Jt7/zNCm+soQjKVUPtisxnxyZKfC0KaJX6Tl5pMWkIUnA2d7kWJd92cGVBjJTeReGlfyeaL0AIJgwQNRjk+hhm/sKx0LosccpkCl6EEBJBehxnS/NKl5QK+FWijFS5KCO7vlQejMeEhGGi/QNR0WEhd8CJE1/PMiAz197nT83/RgG0dnie+Wl6p5QhqA0jm4rxyw8h1aKr1XA4G76NHas9nWP4rGtu/kmXwPC01e8xO/PP1bkHoK7JrfN7Zc3nE0NSDxaewCHQExFUEzF26aFhcoKaLyBY2yOcxgNhqS2x650ZojJ1Zux6c1PsOXW6eGF4G0qb0m4i9GIHWkkSFh/qY/3ryFkSDNewbH3Zi1fZuqmDBSpq9eTm1qZyOo10VKi14UBePtKL95eTcg9i2LqscRI2l9TgQlAcR27OrFdd233rcsx01SckyVxCdbd49IyUzMCCdYoKDRaIBqxgPz+iY4Q134QfVO5aWc8z1du4+L1Jm/4cmt4v7Npu6WrZlOR+2539ds+Fk9fnskedWM5ddMcj9lsjaMDomO6D9BTl8FFL79UbygtUidou0zm8bve5TNGavD5345uSpfxTDiS3IbLHRd/EpZHRdtVq80q5NIpeRsVXuCVIJ9LIC6LVGW1/xX8vMhcDzEUMwzsi3Yb03EzytdZW1GO/6kj351Cdjfb11DzDGbjQUtFYtU/ZU4jtnuQGp26THb4DOzgx2AT4R+31H2wNgrTzlp/XtGy0QspkG+rk27QmYFty2uSn/0wc8flrTm+HF+TEuLS6ZlW89n+5t9vKYlc7hyaejKiF6euL5DuxGoOR/TEOpG89+mgOP5OHiz9UIGIl2mwwBF78MB+Yl8O71/Oapr2sk421+ndezAOk9RNalJKhrNP7wE2Ec3x8YF72wL2l9QPmb/WmwV3ulJ7i0RMS2u3h2R0a0qNzEKC1NzvOlSTdaJT2VefGtslwye4oHkzYGbJ71104m9OC77M0593ad9OHXzo9fts5XVhtt6orRqjjh1k8CkttqgnWlBQBiAUaw4JU+JKYTjtfMwAvm4LuadJgsH94ViLtXBvKQDXt+4+ePejS6h/TSeqjSOrtks1DIZtjmTREvjPYZgVIRNeuq+P3PougKmjX6AslRXw2ySYfZJNTjeZoycHlyOwinbSa+EqTM9hOJmFjwdGwfJedcRcG64i5ZJzAfOuI4YvM2D4C0sPg/bWLIWDhSGTHQKFORX8LyEVY7B/pYef8ihAFWBw39jg/z5roE1Y2dU9b04fziNXDK3WOvmnubFYSkMGAkIoHOO+7DGYghdpCOfiNQiavHeytY18quBp20Q/gnD85eYQEKNeSVCrf3WK2UR0jV2NmT8yzCa9iF+Hyhez/cuTRNfj/VbScYyRad/yHlgEYW8/nWjE96+kxhNIXE7QCvMJ0p6rnf6XV4sNm64FX1gobrEf8nG8cjWs5BWeoNdWiwXrSDZlG7KKnP3GHnqbBbY+q4T7a9IcZLLsVnzydN/X2+I42/aMGgwERBHmKLSANdlQND6ptfEmySl+SZto2Y6lnfZTZ7MLOHQmpehXbDvDeXZRZL3yzdii2XvFnyJZoli3Rp3E0anNy3pCtCjgAe6cf9vB2+tCmDjWbUp/oRdb59RuKvQ6LyfoeS4CXzbFZNkdAj0Gd9ze5IwSyzn920RDSseYzGGEoGDoI29UmisRZu71EXw3KTkPuOsUR2kvFb3npPwZJvxjd6ue8M41OHuZF2JHwbd/QaaBILpia6GYrZn+kmjcj3OPoptPiBoPtuR6y4rpyu23wyL3cFVkeca6q1iOqIqseuQG9Bjr6ALSddmSqlGou02pCEKoe2I45vHqtB4tRL6Wp17oQkTbDLRJ5rFXLojaCSQSxmjSWS1b72ZWbdmzhfSeLY3OrYzXgarrLYysljabsw6qfXX3t2t+/96f97S+fzf3f+7/b9QO+Q2B+9PdN+JOxYq8Y2W/m+VKWbRYK87zcfmeZaZrmF7M9h9K2XuX5Q0fdO1y23Ag1zXWL10xMrbbCqoczwGRiUlUusdi1qudqc0TwbV05mg6lROZQmM/NTNJm7US3B1KAM7pU0el9rlucQSlFpp6bmaTN2nG76zzXRpzm9xrQ3Y+3vV5MrjhSej7nK+tef84PWFfalA8oZT/Pyw9FX1fdK2kfvBNjW9ULgctPrjbNQGYfmc7sqXNnq6d2i2eZ6uFpwSg6arpjdCgW38vF5TNRh1XPJf4h2FTw+9CpAcrzeJfslAKZ2R1a/QxaKay2llLqQ0zSoYOFeLn12oZLD3bP4TWzppBHAfQx5k3UFAEZ7ZQcZDRHSgdJqgkvjdgtkHbnJaK1ptSpUSAruwWRoggFkfoFRs1q4KVZQ3hriy3mvLXFT53Da3Ptd1xmVz0eR8a+6mMsoEbjJ/YvMT23lORIsQ3r0XWPMutKpCRTET1H6ntmzTN0l09ZbrbtxByQ/biARW/cuAuKdVw8APREuI9qPy+ppLs07ul96GQ8KKhYbkhlZqotVWNrrG5X7HQpllp5aZdSdMxbo3mwaMd5YcQ5GkzdI3ErU93765qmSKcxcJs1PfsosMWRdbPH6vj79RK3uTTPQwXtn2l2V30/3U/CfBwtLVMpV2HuUe+LeWWJ2W9xNIZ4rnYnVlNdpOajOTqHp93rCpa4LcHMImM2vbWGL21vKRF9uSSz2yzOnctVdyO3emIUSswypERlvuR+HV/HKArnQnEywhLYrma3rWS3u/03GHVyjdsiuvRNqebUmnaOCto5pjhkPMNu2Nq0A1BdvGWWposmK4RCLX5/ptQnzCXs+XW0Pry8ATh2X00lwW2SKn68wpNbq30FAqzlLTOGnkmbfG1G8b67fyGFPLiKnJjbWd4as8YpM5j4mrewpYxCavMTfVImef96DQXd+TpD8nKlyATpSE86I4S02KPjQp7vHzhOqXB2qefbNc3wbBPrHA1aAPnGGZJ/Yk8wUqoqt/YYe85l4xVyOH7+Nq6E81maaTi+TMM/fhvFOhzcdQ0AIklPM2C+JK55lIHUlBBrWkXEd9QxhxpA6DcbZKiGaQpwUCjv4Ot5wkJrcA3SXEzv6PV7HKajr7+GoU8+2WzAlCR/qkUnkI2F8pvz/wWm7CppAsqjJ6lqtc0XsF/cvG/DC03cG5cnRTNdN7mazOc4b0uVK3dIUqHVPsbWk9fflGDk13T8UwNiO9PpO50V4/nCqLWywdDOoglRUqOfBxZOlSVSTU/WpNKHKMx2oERKnzCYHok4xvbexzJsNuekch0bcjs2XogSAbY59j0lRZtoH/VhrEuWzpdmUZOQpWCk2akX8efu90ik2xXRdOf7Ii65zfVq6UmYM0IBtLdYUQz9dr7lg/S97g6O6F8C2rDe8jNoHPFcwDE/6qH2PrBdI3wUj9OU5pQYU6rns27ctlLEyP6rKoe2dbvObhKn3taWQKb9GMutEGkaRU2TxFynzWbjorX7veNMQp2M8K13d3JdYrKbJn3WhweLdh0yF4BPUpeOT0/AdEryRlBekP3/x3i5jOOyjEJq0XVRON6YuzvbSqwF87H3SPE3NOyvwRSTaLrZvxz17Nymz8l2uTjpMiVQp6l/p1/aOxkA/gB7UH3EeUqynnwFuna0WWxLgPBVx2QvZd3z1L7t9znPTqFIo+l5mnctvyPVzThjk8lyXxSx7q+QnmJjlkfE2QKUHfF0OXgRBc2vo/9SIfvTPi2ISf+0yhrLeDNgbogU09a/HtxNkL34N1ZXGpPYrIQhcIpTA5SpetKZBuBtw0oIKGXcA9Xx7g5PBx2iAIKWZPrrY+8R17VYmgWvYt4GadZ48TZY88Z/AyJwYN8Y9XVVVjKyVpliNQnjNRAM62JDLoeS7iwMAOxXpuFXVa3GhJfGWQuKE7bT0eOgSd7ljA8nrMK67Gzui2OBFMNoV3x+lXAIoq4ijSp2oi5E2PNF09RPS0M9os6xr7THNWL/LInsLBUX0a5F/WP1PuJ30wy/l5m+TNbFbJaO91+v9P3daKUf09fpXbrehyW/sGocrRPnKASY0QNUxYOn2yg0y2IeBICd+wGRRFy9cOhoBbKh259GXYyj6TyddhXzvjXWVche9qh/WLyGzWfGi/rH2U1WcKdv8vDNpEfdblqbFMbmc937hfNlSymsGtqdabTiNaOeEBndTun6hygxQHuZ4riaukijaWo68F1ZJ6CPlPMBM89fVpW7TgkRpoBIzkJYgBO+lSCDcSPb1io229Pp+nphDS72IWn7XlRObsH4u0SHQyAEQCTlv/uehIuPd79sH6Yjx/876kQU9H0VdH2QPdP7/9bW/puiD1w2qv0doJNJlDPKgQU4vryXD+5vSwdJyqDPGRg4NwFK7Nb16JkzLl/8E6g9hyyZLFQ66kRgOISr7OH6OQi7xB7dPxfm4Gyn4hCjas/Z6OSWtZmnyjangzZlp8RSCuMZa93nyirqY7J+uNRbwub2drsFHaEiqoogjYB5WAS3wGV7aHh21+zdL9HiqJnrH/17CPc+NX/j7RpETRqfUJ0RlfNhrHpRyZjxXlgBx9Zmficqs6YxogsBrJIEJ/CV0HtP1M91Dwd/X4Qg+/lZHsfZyIDyrV5yjXPxbmkQC5cemibZ5vlFQpzDFCAuPJIbaAdXzMZ13wH1tm1YI3s9miQEgI2DPDBlIroeaMJZYbyCp0N4Nhp8hbJ3YXbi9rU761yfOj8iY2//fwONbB3Bc0Hw18YwFedFZz3LzZskaGe6XwbBKf4v0hV/Lq/R0MZA79zJqM0GhrbXaGJ5KJRlu/iOegjLQqBUNTnv53MfyZgWOutk0o+znBahPsshtUz0Wd9kZ5DNjdWCezVwabD+S6kQxxGsMFI7Wf9+6govlVpJmHLQeY52QDhY+ltBGwEA7V7XZXip5HSKtunQalZ8MlvX95fpm4DjFXDx9w9TXgx3B2bAHjiw2509AKyHPzU9TV/5NcVHvkzPTvyAYwJ4uzuh/QRqxMasPruvLg+HzXodVy4teBNblK1T0GsPX/PVSIPowlCNPw1XCKypMXfgqxry8RYVj78CDZ3ZvqXUTyOTZG0pkwkIC5BRCt1kH6ZU1vpI4AFm2mlgM7ctBOhx/v3/huds4n8XioS4yt/66th33Ma996WZnzb8f/3khhM5ABbUe3UC/AO3UoedHRKOjUVXN00IfdHRsgEYDtq65EyqnamrkTyzRnx+SHs4bWWAOkJ992L9mJ6VH36JqVKUheyrlf5QccmJQK+QNqf3DhUtK9VGzlbqfAralO0Hc80X6gaD2sGYdRlONlhHIbimvEI9ext/8mTBuI0vt9+2wnRJCpTgiIzcFpGSm8YpTutTb+aSWB1j65mRfbCAcR0zbEHD8hIsB08hYlGq7UPrQyJ4BDvLS/AsedENQLAB8YjvA4Mxz2fts2bSnpPrlsHdCEmaM0de5VDrOfOH6uERu00C7JKIGtbOmDONOqOzkMjlp3jgZUc6VkWoF3gGvzoSIoX/PJlauTJmRLKshBlAXB0T5gIRnpWEGULcmCNE7s4Tou+YNx0r1eVyLWXX7YR5wBx4Nriusdlb1q01flvT3opSa+RY8b57LiDjjhWNurFu7qhjQzKMJO3MyOVG4sZ9ltSmdFeZIPN3cnpUWB6YZXfuvuex19iVRJuPqVcgfaXaBn9LrnPG7HHfOsey3RTFVctQ7v2sJI5Hjij5GCxVOdhDzAN0wA6NsnvUIMwrTbUQjP9V37r6OZgg1QhACJbqZBQGFGwFWQdUy1kzCUAAWOPgU4nu4Pbvh3sI7O0XVN9suUeASBfuoeEe1D0MJOF5Dws+Eu+2RniMnEUAS7IM9xBwZNMKWrpEJMbcLZyM+T/hLL39I3qqUGkitSIFClXjhQq+TXiyQstL0lWyKIckmxLEGJdkUOtEcStQdSTdjWVRWAbqmvQWok5UJkmsoEe1QFGVSiZzBFI5WcZQFhXTZKk8+ZfCctXGCOLjojEHa/koEFlpvsBYpdPVwgQKvs7H6Std9A28wztYJQBL2upUFYoJdoIiZSv4EQ9NlpvnB7UxVB4HleaCQLGkVCBq6vYg6fpIMQjcGMSgEOT6FaQ1JGWUYtG/QLaxppLlIAaXBbj6cOYNQv0AyT0pfiJz4pBx0el2Y0PNrgvdhyj4IurgaBVcUPKb2xeKl4KiKYXCSRXMpZU/W3ljQW6fTU6/TnYvJKvHIBii4g+6psyBQkYntdI7ldYaldrKrZS2KbkN5miMSqzbFq9u4tbZcCpsYlddsKpUMUtjMQqVUEgtelFAy+ug5oLCFjlTpNRbxEQRkrQAnyDAxRY2UvEhWnGhwoS6gtigC3RQgOIWSBSCthXjN0X7L6KuoCIvUBDhvQn35oR5d0L236pQgVNo8usripwv6aa79pFBG9Jkx1no9iuPrQYiG0L7xJ4XMHbsPMs4rhYeF/PE2jiBjjZPK9TYnk7SzVe5bnkzzkf1U2o5u3g1n13zuT99fDLbfbwzO0l2knP2ZqeUzrECVDt+fDTbf7w3y4ZU51lylOwl/6/SIvDvqzfqL5TkcZV5jw9m24+3ZgfJVnJOb7ZKwzmutu3DXTzC33mHHVSyoBPgtVwCv+R6MuO/5ykIvGnoLC9dQvyZfPfjB1wpBvjd7n5xYPK9qVA8WrGY0158rO4oa+3HDMIhDtkjx8rsWiqwW5cv2i1E8SsUfH/pY36w+JxfyOcAAAA= ***! - \*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,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": -/*!*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,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 ***! - \*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,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": -/*!*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,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 ***! - \*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,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": -/*!*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,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 ***! - \*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,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": -/*!*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,d09GMgABAAAAAEE0ABIAAAAAe5AAAEDMAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGmIbIByEUAZgP1NUQVReAIIMCIF8CZ8UERAKgbIYgZh6C4QeAAE2AiQDiDgEIAWEeAcgDIUfG55rB9g2jRve7cCzvPs2zKgINg5gizw0+v//miBljGwCfymKOCcoikmKEJPOQpes6HW3tFJXJAaltmZGmPz82HHvas/Q+kuFLvzGNg48uA/3PnpT1NO1awsV9ItGsTtm1Uetoz0SWdpLUKgoF7/TEuEzS5h3lCPRMydbbsUHKAS9NLHwzdoj7d9jduWx/wMZ5phzMI4dhJq68Dz55/+vrTm5eRZKmN37diWpg5nMAGxTjJxzRqOCE7AKxUCkpYRWVAQrUBSMwgSzt6kLFSNnba6slYuO5/ZIC+ZGSDP97X6iiGjHE+t0QojUbIdjrDvEhovcNkT9WiN1QpuAv5zpypnZtfkVh3hfzm4AaCU/8d1J8bPPAYINkINlih6d7pXq05Wprijtl/4q9Zfw30VbJUOrOtTMxcADaBi29NcgDV1dZOIQ21nyZNSGpth+vE7xTmB497+hgMveYedJFCMkJZB0i9RscrMVkey0TM7MRZXGzLoJpwDt9BQApMnBoDf4b3C+Mf6TU032lqcke2cPpVZ+qFM/CSvhPxakuSoxYI/sEFRQ9EB/5JktXjgANN/hWn1fSSpcgU7TAC7R7AGBPiXq4K8cLZ8wvz60/s9Us53FYsmlZN4jpOxIXoRDLpqY+N5119m5drXzZxazM4MlBktIQiAYwJOZFBYgKRMQfUcQDiB1KdAhZ4KknilRF0id7KPkmKoYK1VOVSoad25dui7P7vyuc0hF19t3vpV50o6zeyc1qWpcVQjVBDMY9/w97sfKLIwwrZmJi2JBU649XreIV0N3ADoUSorhsQynZ4Ord1rqFKsgCVxGIih1ueVzy1plOhOKGpOJO0JbEIeOUB46RWvoAgZCV3A89DDnUt/wNcZ/3DW1vQbUz+vV4NrKtMYetclTJwl08f82CMzs05ZxHK1+8OqS61NsWS/dO9myIWX7er8tCbfnAMHQOVwmTaBcgG0DmVKb/hYTKEbh2rrqQteabdu34r5OunI1vlsy1q8EuUWyegvYbXu37oK043Ua+p4byQ1Cb1EYGQhk7UNHN718qFrUoTVCKthgmJkldU0M9t2dBSncvmTJPaQ0BNZTth+MEwaUg6jVUq0s0/R5NNEGsqEARZ/xwFrZNp4mjRlmnsWTKpN4/uleG2Y28VPHMP1sRzRMd+KVy5I/9rZu9AzVoJmf+KNm7b38hc5BTGqv4ctzoBG2a7NN6B9Rr3c5VAaC2jQOzL8XZ76gwQxofEULg4+o808pNJvPMLgmYcYR/XzpQAtikF8FwBXkaH5hX+3itvkEgG6YtWjozqdt2ryZEdwAkCul1soEgFJVmwHItQDAp8cqANqjiXQWMoDjUL1R37/m9hDVYP/6w9uLlF+5iqMt7Uo0ZO+Ut0pLkmGIzSou57Xro7Wm2TYAwEGM5lJEao5Yjjz9y9cSAHU4xv/SFY6e0vP6SJ+0V3ANuBa4MTvsc8gp93nGB3A+eCYIQyXUfzlXPt8gGmrPofvEPq0RW0xn1+PpH3Akf8+f5a18OkurLlUqP/47pq/+9ODyvmVLFsw6YkiPdN9R4KP8bOfZH/iG96ixlaTG7Ir7sch35yTMAORvxffSU12W/9O5eVn8HQBuZIq+PaSihk8jP4+DtDOpLPci2TSxnyzaOEApo7RKMIqFH9Hzf0BJsZAOXkpDw0yxFM5X0sE+DrpTkyzEMipmGmVLqWkGwrsMfmhdbikjTDNPLS0MSDB5VFFP+7r/GHLqaKa3XHqOHyimgga6hUQJVfSd1sN+xtOWlYY+jXOgDlsjx9GUfQP9ffV1SkVtTXVVZYW8vKy0pLiosCBfJs3LleRki7MyM9LTUlOSkxIT4kXCOEFsTDQ/KpLH5bCYDHoEjUohk8KJziC1vzw53lakwE+4uTnZXlPJD+7V6fa3ngY7gXM8GLYEPXZmOHHtljbGazbQ4LKdnxzXkr/D8W6uQh7s9zHfcMrDceWoLbPAStWsYnbsrmUXSVBSptBl14mr3s1utJ4yoF6KmkyAESlOJ2BS79U64RuHtpKfUwxbz2haNuw23qLkwln7LDSLurBWQV1QQjmCZd69eoszoqhyELNb33P3Akm8GjHNsJ+/KI8pQOREsCUvR07aS5xlXYcmjlWmVUsKyftc/SP3J4lNvZYIGinGH0eTLt7VKpcjgHhXd78QUhIaPm2wLEZC1wECSwi8BESL6i/6J9Jtn9RZl+pG8g+E9OYZYa+76MZECFI0khRQOKNRkLfp1hoPukFjbNLcQDTsBggBS3rwEgTmcE9PLH2kj/UZtdHqhJ/4LzjrXwQFEX4NsQ1lZPRJyRyaP57WWRCUpKVmYI1MZLeGYCInx5/U8qqGA/s3KvdrCOe4+ooVonF4J/VaO9GQ5bi2bBIkRYS54DW/IsbJ5KCnrm1P0MbfyrdaIblWSI43mn1askSut1MUNYeSjKtUI/uRKTtQwUrMQaQlubxvisBkf8WdUNLD4PLmfSm5WhA6TTV+HaSyI11JIWKhYNnxYTOZkMvisXqckOyw9ONNA0HcqNnwRD0J2MjpAC5D/Yvc5jZdvZCcl0TQI/dcb32EyKE5gscNnTg0jPFXRb1G7QRDtlWvDcdJv2lH1y6CsJmk6KDBPRVXcTaqZTQbob1w3NHyDE7bqFLreFCYbU/4cRYP2cmR1tBjcEmAGr96VcXin1VOwtN8qanzl3gqGa2ippXXkq4Q727Va8WNVNX+5GQTQUM+JVfb95FZwDLw8gMMzkn30z4v+FZVVng8kEfuOg5IH7fXCjg7kcaxZOIMrX3MeDAybTyNje4VewlMcu+U6OibgRjx9GykPEfqz4vOuSWAyzuEeIo4n8/gosZlb5vMFWGaJCLi+3whnbUu6nLrJW3yODoJO/WwoA3Gkltq48FVdZsknIU4ZIpm4qrlScbUQqw7A5L2+GBGKPibhygaVUY7zUrTNkYXjLvRkTvpUeWcTkWptQroQQMaTt0VJjdsAvgmPa4QGJB9qAGg5gCrpYiLEtMI7xQXESwFW/U/YFly3XLcQMyqcwQAKy6LCjogrF+32fgE7gFLAC6XCZaX5a8kzghTwcKSt2RRIQ7LqRuYKlWRWi3k4WyopA75WkUdAAiinyv/AGhD05OEnZzGKVyxaepQfmF54pptvMZV+xJgzGGkiXQKZDk3IilafjcJ1idxrBol95QHRlf90Ia0ZzRzL4Hqhcu3ot/V1V8QD9pk3BXmEDFXD2yp0j7pIfKQq65asOpsunDsiYiEZ9CasiAWvWEBlCDLpZqA5YaXNJebLf05BAsg8Gkd+ezTuZo/OeYFzi0D8qUrCRgIbykzsBjWB3ahgBp2CgSyb0PZZ+kX0jEZ6qhNUyzgGXrZXM0jBzO6hJoskz8MSnvYoTPofHTN5B5M4Cmi1ZSh1fjfRtG1M4bNoRY1GhkJNSu5a9EfUI0OJgfMzkNFh1UHFknCMmXTca+oupUAUhzks6cS/oWgcOO7C+QVJkKnxGWjka88PytyvhNh/UOdP3KAQ/phCsAQXgmhFXfHpmF1t796z8eMFYne86lUV2jAiLg3JNscJIVbF5MKgCSdpS0ErlAc+IjpKihcaciVwUl4OZmMroQ62kR3PZQZgN+iO4L5wEIBQ9qTYmxLp6mLAZoK1a14/m348h4cC0YSbJzHOQ9GZEv3C1l4M2eJG/gtLk8TvNTKv2Ib+5qDbKlbwTKTq8ps0pqCAAXs4WTTbWZITii4J9E583CITm4PJPd0kE4NJ33GH3lwmoQaY27wQ++yQPqmEpqlZm5v9b6Hr6gEk/fxdNTMnVDJkYJGRwUsRJ1SBOr+H+jQDYBQ4PLZQioH3ht4Yus1Kdy2M9MeHZXnzLaye/5FD9rLYdBPECT4BWKT8CbAqDuw5Lf/+ZxLcyk7PXQZYDedV3D9nvC9cqSuodBZ4/zk29DMfQuaSv0HdRqmQ5k3rv91tDeY49uuWaArvrUuf/F58HG3gl5E8KSIvdlQTImM1HgiTi4lRSaK+J2mMc4VecMJOl5oWjkuqXioHup0xs4zfI7ApRNL73ngbK7+k78iwU903/JmIkR5K2U5Z1GfyfBavfY5yccsk4WtuDDDe6Io+ED4kjMq+qfgKiNzToifEEuwrvC3racF1S8FxhnO8xdGF3kZpvlLI+cxhHjblSnAnjf4kpdCXCLOphIL9wEnEaJdAEouYZr8aO1UPoDCn0BKzHL1nWLTb/1zdI8U2uTO6u/7OZhyHk58kGv8twBv7yFAPBAs2X3ny6SMs+GkkMruyRYH9lGGyjCgQDf5BZCXBlJRHYqcKWwhURfisnWBGqlGSeZW28Tucfl+jW7bLOUlZUSeXlCtAiTNbVcsSlD5ie73q8S0kSFsffpYYzrphfCLyxlk0AzB3Ye8Om/lVWWG/sosC+VPF07FDVXO9vjKV1DBhqLciGm13diiyl12FsQqcMVZHjhj2U6IG7x2ngiJbiJh1wpFlJtbNe9OkS4uiz2UfFmIIllEe6Dvsxt7Hw4xULggbMUshlZSmEv1r24oD+SDQ2cx7eKcd4u0cMvXSmukjnq8m1pZ1jlPj8tFfqRduMGbFdLV1VWdET8pRMN62EZrTfbDgJWQ1g9p1885kbWYo8eyxofoD1SxZFrHWMJX75O7rki0DHGbl/W6uJ6IVoiRYoxUEdFa/GR0GP3erjLhjoj2eZex5bx7UfZFeCzVustbI5e0lNgZGERU5AFGbXtPmlgyCfpr2a6VJE6pP8tNfKDivUnXFDss5TULAQ9k5ICwJJELVgoLycj9/1RgjMtygMGT1SdP7Jq8VpxCh3XRnbC85X/S8r/LIfob7ajc6LeFfFIAXdp13rlBnhN7esZl/twXD2Diu8QhfTwU4Y1wHlVYekkl+2XVnMzDyVHQS6L+LJ721JJx4Bq2rswv/x9GbZ1K98NLUowVGJ3RImiDPkSuyb0/FtEIEL1iF1HhLQbNUj7n5X1nEK3lwg6vzw2DOkvw/hML8LO83ILaepe0B5GAL8XAUsfBzGZbbyaj2gwHbotVamJcM9rn4HVUbgBjAlhZozEat6mVfKSNjhSZJvpQyzTJe++MzToTe7uShu08Nko73KWUt6QATwxC8CAfA0BCzq9CyYGAilS4gswzzfwBRF0ar/Mgyrfb/bATEVMc2NWhzxNDMmUUjsKcldJMDcWW90OUybWGE0EHQgmkzKUgEYCjBDeJm21W31jyeJWo9C8hPZrE32gT1FC+g+/8J61AntH9F7E75oReK4FKdtx7lC79cZjURO1ZgTDTyjESBbsDnvdkkaeVaRBLk6sgQ6yXi/CnY6a8U3ysoCFn/3Ed7VLLaVPLa1s8a16XWo89QiDktvAbPuIahd/xoOJ1fRGVLKlYzC+4i32nqO9NwN1BCyuS02u5c1+rTd0cT5gFGwiFh3qkdyNVJOqf2edJOqxLPyEVAYrl3mkqJaOCNaPhQafwUgDY3sq0xKrqdmZx2bfFsdkTQpVWtQ+DrFOHaKVYsBTncnJiWgsNX0hGa4tR9/1hXWqeH1PXFLlk7xSprKeM16CvzpNb90t6f3OQmXXoCVJlfY6+oOcWK9ALcbzBybFsT2Rzjx1MPfj5SOBpK1LT3dvMeOPPrGbIwyfPsM3M+N+Jm2bPOtzVN8x2ET7l6ZXz9LmHI8LXw2bGZyeO6+1HwRRYiOoUyBQXeWQ0pnMBdOsqm1irzvpe51jwKxBA7Z6gn0G5FHia++Wh6uRRoisZIrwNo1qJSmhMkJ8BrX2aNtDBCJ6i9gH8poY6OI7R6UYPegHscnC160+vET1GLl6LLAVv9MZk5We4zGAveuc23w6eG2Gkw8i0oNbK7xQAPlF/5MLsKFQbaPZ3FzDniOqK5W0pttHCwlBTGg7H2kS9xzUxs72mirUstjgOHMOtxyaqdNoo/RZpPtuUsFvLWVjOx05GXMoEL7fjsZiMUDbGJip21XjCgKCN6D1TVpcgKl3w5JbKwTVPjPbaE0t2nJ2iDZIoCpxP+SAIldPLgFJKGWXUuch3lNDzhjxZHxzHQpaMVxg3Jl7WF29dKN/2zhDnyJPnpMeS6ugiXeJhog3M4TPrsuQxZ+wFnuBPAS7Fu7lc+7ZYLaC79o7dCGiMGarXN8TdxYLaXvu2YQtXcYI9OtGDoLEmqIicgsYBq6ftqERCcxUIhvbG6oJVu3mQPTPL/2mCaCe9QF/3vntDMigegZPPkWm/SvqIwAhIqDb1X3Nkybik2q1duoB/kkcGy68LsXdwIIrDv26cKecFX8x2pxe86PO+nG54MfG31DNEGK8B7TFYwtnefi4qNTiuLqFyawYu0LaY/ACSHedPzK9PoZf18urfxqvvweVJ7A4roXqn2PdUvV18e3fsO5hg/ixXjgNoRCHWBx04YXCCwj7LUAmpquwJO9Qa/aYlrxW4jBuvw8UyWM0/91cPbofvqNvo/FSjR+jBcSVUVhTqgKrrF76AL1SIkQDjwSL0lQV3KYd7M7TFWGHzZPRfR2BVjCrSp00pOmN1fH+J6WXgG28FvyVfs27O7cYjtsDZ6unOoLCXqD+Pg7z2snW5nP2E/HJULMEPZrkGv+w8d+XL+9Igmk9Nz562Zvc/jhfRehUvJ5+vbFXSUbVjldpdbPhEPCHQynKpgodRKVw7nnqKXbCtGiS1+TSPf4pQ1IGe+pP3NDUBsctQOwynXYr76+6VWq5JAGySufWH3l15BwRU4oPFn8KzIAZY5pInDx1/BHbsVUEUHwCQEw9iD5syKv0DRajnIpbRP4kkKAZBzihx5Kzc3ngR2IC4bb1lZa+oSR0qU5oFWRfNScfZTkdR0lHH5MuBYlPAy/wQIpBTnMRS7VzuHYbcz/Zy3KyqLuXnU5Mo/pTjQ/dEV8LQBndpEfpomKteL0aiAihnJ/H03yORCJWuO/l065xtmfrNJ2K08R2bxI4TiaYmDom4KD4dMkTCWJPBuqjzPvyslrD2JbU0PyR8mKpSAkgd5OkDY+JCHdjZwKj0T87/jUnwV0ttYqRH7CKyL1/wCX4u9YEGO24F0hvOpc+5/ZxhgJX0CgX+XxNTVBMNqNJeoN/JuSoQm4McnVj6MsZlPuVj2UBP3rlB28uldUmTFJJIFjeggQ9uqfVwlYra5ZbMPs6QKWMdTfJoXTRiiXOOSz74MhyLB7dUBgYYoYeSlg9uEzzD71QQlp9rlt5TJkomeGmV8cxo5z98R0HhDX09MYGW+jpJNGIO2fGZXvoYxHZNsq/T6BhW787SPHNdM/3XGvBaw2txaYqkWmV+qrJ9KIAJUpbkrRJMhEv7pfltA384z1IWyCrLf0Ww583MKDTTEJauq3sjbsuBdEoUfZgz4QQVSAUSJeLGXOcITo/8adFGdQiK6W5KzZnosX0QZIk6udY3IlDwGZOs18lPSd8W8b3Z6m/AO7vv0om4YD9ffDCRgEf5+uFQFqYrq9A9GZA9eyEfsxqF4mrRHGAlnDtfPy7uw5pX0ue1K0FYjoXcg73S+Ib8kOLbUU/us8n1wXB8grQKb0nVbjhibI/gQfe90tWO10JmhLzGxNT4jnlWgdZs6XSm+rwzBeTXhLMZgjK0V5Sw5ajY6rSuu4sbJo9ySncVC+mBnuEZ8BjLkuv1FM0UD1+yX4g7PTnA2er75b79Pzx61PvLgY6BX9wqOn/oK2RRJyYnqdMsLmt6coI5Ce9I9F1Z7bLdmfDeA1rt4d129v/y8FHHD/1F2rg2ZU5M//BM7IV9vyoepHCbk2omlqrJvY0SwoRl4gSoNvkplQOxf7m88FcXf9Fb1nI1NvdodWZEf3tBEuI1J9OvlJIc06qiqnXvinDPiQrOphcMtSgazkRjwyw03WJzhTwaq5IaUY7PrYpipCe4KfQ7Rp/lPYkOUzqklBzsON15/fshdEAVSFg5lFKktEGH6Ov5jqORCmBq4ZCoosoBHXBoBBNS5RhfcTC1VAFGo/SdV82gLU1S67kS2K/4w/zlpLGkcf7P+CIYcE4hhbUAnbctBhsGJxonnv9tmGo0FH89b0wKGEOrwKRyM4bTAnhGL9yA9bjnpx7d3jQiLtjHjxBMJBBQfj44lL5H7+perdXRvearu7CLTxf9LWWbx5KrR+4cTWf+8EnIvL08N3Z3MY3pc+PLldA9TXV5eU1K1J6rO6GGjQ0yWWMD0tDo+hGDEABXiZAfBbkqZWRus3eTueOZ5roWcXbPdIQqubyrpjjjcDgXw5d0NFAH3aLrt+MyZ4vzY8+PbeWIQ5E6ny1RdxISqe31MbHGurPmc0tdlYXb33LW889Col0HY9zv+iZfPDrcJErMPx5Q09XWXTRGiKyIknQXV9IrQRJEPiePEfo2uuvF88sg4ibnMecIZ7vFrfb57N3H8mcINb4GTZ2gpuvkza/ZqgA5+lX0Pk4uXm/sq37wa/6UdNsJ6zRMcrvulyhREQUdOV2Lw5uobtO/OQGI2fsDZMjxqCIjR1muAvJ31IP+kVeCgx5putbtNOEu7xN3DseZac/seiliNnjFVp1JSz/X2i95fK2wPWuJpThM/ukzv2FkdqGjc7w7uZvNkmOwsHqGrIQA2gtV2tsNXK+CEgJMIcrLlduMnP150TRFdSIdFufalxXVmVxWuHhX1HHggSB3riyF19OaxYGQnIpTiA2xktz9Z5kGkOjcoY5DA2MdhWRqTnOU0BEZC60S4ApMt2sLe3MzaaR0OSUCRAUV0HAZlMweiQ2WE66E/M1/2D/yRnDQLVvfpYOWZOh98u6hODOtGYPn8cxGb0HlqbT0cy390ifXi1rFSyzFEdKPX6OUo7Pzna3jPak9LKYcO4YXLy0hgqZR4hRpfysJTwhdcahR7Nd7xuEIFVoFIlWY0Z0W9s7qhVv9xNXgjwvhQv3HmGA7fkU6TIls/5Me75d5WCvCRMcvpn6qPvjwvslnkKr0/pkKcVlPARcVfkVNQL1wpp2UkoRFRKBjYpxiMenKnNKkfT7EvUFKluu6f+Hm7TPjcSE12WIKEoMgcK35KIcFDyImGO7j5v5K94FjUJZZ0kci1+WojhpedFx2lj5ZD0rvSs0anLg2U5d5batQGT1uZ2zapWmxS0yjIHAx6V4L4vV9uw1bF+YNs09cFJmOX+mws+q5VPrSn+9QEwV56Fn7M295hfPDZiHuxVd0zc59ysIpIsYhVZlRJswXz+q07dK8yDbwSKtICDrgErd0nbJ4fcbx3Kl9jspTfalTV1g2LGBU04AF0xxfNHsFaKBcHTYxHTnHQ9eVRcUY6YsMuxmcdkl9+dpr4eDv+iM4q/UueYl8Lnv9nzxH7+3DAzUcUsERVAPIr9e/ZINdNxj+tPm41PBN90ziDJhl1cOwm7ctee56vIf1TiUwWbygKZ6UXHVjO+PaCSCVpxHP5OPvSxSu6tdWQKyuPcccmUMt/nSu5v937Hv3dU9PF6PfPDMLevYpHop6RHYKa+nU7pfeKq43ztKv67//Fwz7Bdr3JnDlMPPD60UW+8QPpY/c45zR3cy9Wz7pS/911+1eO1Zg+GfvuaRWi4MbPGvWBmDqKOCudvKnJADJzdYXGex9mgz0q3ypu6c7/yTruwXGuSEy4gBac9OAONwYs6TiG7zbMTx/oDmk3sEfBqKLqoIxU3cuEEps6h/avnHAkGq/YqgbqFWg0UQaHJaL/7H9tqFjl7zxFz+uiQmMRo1WvqsuyNzAlvMTYD7gzhVdsE65ZguZxPtVuu0zelHHRKtKswfNOGQZu/V0kmc2cf7PrLGpf7JUF9jmky+6We4nXz90XhtgkjbensjY86h7cupBd9qeE8AvqL+nHndmGhhBUlaBmk+uxSFV9RVPSIcWw4Z7mOyOs9yDLSdC4upyu9bamv5ZtZzguLHT7hGV/qsNeffh3T2s2Brqv7r8iS9bac3n7K8X0aw7Os6nJHgn9vPnparrvs+HpYnOtt7FMju0sbKmavW9aIjTvafM7u0Ixf4+vDCnP5ieQ6dikgfYtZ4CcCtdlORdyysoVN3iNxacd2ND4J108IKbUFgVgEsiRKBT2ugFrlWeS+lxfbaN04AAX+nD9F0yZY2tLh4o//lvObPHBvrb3PTSibM7Z+um4tlzsmUjGm8VfHd12l6/RfOkbTI4wzphaMg60SGTYo7bMM3PmlYF34Ymjg92LLimtEue9pNGVAveZeOR+9NWhNWjhku9p834RpzdDB5xD9ckyiL6ipGsed7YseuZZaxJpCGdHW+aZVPwn+FSD3Bgs6m2o3bl3Z9nT54WE3OIy9vHbZAPFE+O2csqEVNe9rX1JywJv1f5wIf/GLhwnCh+2MU6E3cOoP3XuQZHgNYHR8Ndvat7oatje81XDXzXDsUbzqf/BnvekAEBygbj7W4P9hZ85Hw0DGT5NZY16hrXOciJufRMLas8JJfB4eOY7mYmkJ6Ys6fnNz+WgA7rPk5i1jiLkvcT+K3ZoxrzejqndHBtJXmSyAM+BAdfORm67h8eqtK+ojNeIBbmRQu71g4fcTSPNFPitOUmeu7kyRTFtW+21muSfy9XN9eo4t0Jux26igHaZm9xRc0C5Il2veuNj1b3DTy/cafvLjTFtOdlifzPMxcU/3ws6WUPgHV9mkxrQEHSvgTK6WYl6WRHYnZUM6ShJ6vOzghueuMXoBXwd/C1qGqPONpPBiidrL3HVIBkVmd1QOeFkFHjiWpc6Lxwzv5m0/Nj+/o/Xb7U9xgK5QpaLpRlPOtN+66+sbYzmX4QyoN0sSFHHCTDn6qq/1w5Wqj+oLmjXjk0a3gAD0gY2VPEtnaRnTc+rzq/xdwMIDexZg6wcsPSzeWuNTZcE3dRTGkt0xj44vODj4c602o6ZZYjSAYciY3Bu/D2ZqokhQmqtSiF3Sjfvzhrx+qeUzZu9OnGlufv+r4YN3AK2Qi+uXSmt2PVadOkumExgJ8ajg3Byiy4ZyjZHsHRuOhewa4kcVFRkayspLRIWlpRmltW5GEeaXbTWYOJ2WWdTlc6UxULHP58y6XR9cby+urSDgFqqSZUD597oDmXRFKRuPtcRgMRYy5uSkSgwsj1sx/VcK3+41/OeA41+U/V9+Swtloq4PeEQIUb3yfB1Jxo5uysJQXqkJkpZ7Jqt4/ffiC7WKOtKGkdAyQzcOT48w0wbsDjClaOnbp5bfS8UqrIO9h+bCll7Hy0b0FycER2bXTwQjVeRaqz2q+nmxRR5kSUTwigQj1/4UmBs1uyYPvCmdsCD652Xz2L4vwfoyE9lyy60hlIVIfVE27Xdp6gFeas0hSdpNv1yyX/vFIM9b1Qlv8DBy8pCJudGTJpVwZhU1FLONOZlj89/NLIDSK4+qs18KTk30vVTVG1HnERXw1gutkuW+OA5Ntoflj351i2wju0WdoUFTanVgtuRq63JBWl1mdjz1Zt9b2BBr78dM9JIwW/y4M6mVK38yvQZk3y75WaxtqxVE+yrtWgApB834nymyPR82o1jnfaHy3t7/20s9P7DOpqJnAI114x26fC6Nhh8+FRiT5NPNo4qcl4R8dWlFwRYo3AuGekt22F18vGHV/sw4LX/BPaKmMZHr74InQGLN1pgM7Oi21+0XMsaQZGASMUONt9TkxZKRXrF4iRB6XCUqG9TKbUxkjmwts9WX0l1dgnqhXJ7axuGmQNojFfk//D1GCUacIUO5yCRGqw3KdnlRVRB6PVzHP4803XJrYay+oqSztiwxZrMMBDNpqkxZ/6rHB+I506RxGjFtif+hZtzEjm2AX1LflFC7oJ6QeiTsAzE7I588Hl0pMmb0gzQ4K/bfPNUgm6fEOCCd2cfmSndGmr5EfbNMt4gq6PeZJt0b8HBZMm30jAJe9SizPgMdDYqVKLdu8zvmfgZ07ZAiA9iz+XhTumAuPKdG76HbHjvildsrvzEZqc3NvOTPUK1+9Tct/vRcV4YqLlIftsJKAcaDffr+ZLGdSUJrQ+jSsDLBKFrVm+4YjIbCdWExOQ3RXBC4dnJbUsEooayGrpLgE8vEd6hjzb1EBikibP8MP7c9OdKAC7defNmwElrWZdLK6JrJbmHMDFe2VkysUmBjmm6fJ0b4I/L82ZAmgoAxwlCFvE3iREZI4Tq4mV44TgEQMyk1qPEu1cOomgBCuvoAqcY69ZqT8ZlW8TBSXZi6w9QuQ40+5fSwIpyAJru9sTEvU3oMu73zKI+GDfRBThsbsJRpl6aF0eo6m3gGBeTckK+0BZv4hypr2NfLwrJodf7/CwM7MQxFC7UHWl3HilPOHj8rGkH1aqSo1nzVzf7kjmPQkOIcorPZ6cEnllG+hQ5aFnXKccNJZnNQA4+2ocDl4U++JC5QWf8uTZYwLo6q0w50KjhpbY6EalehEMi5bBTJqUsdF1zXtcCzFoWDFa0RjNb1L+XABDY0tgrxvrYvj1TUbOhZVhEaTychKNLieTy/uxZLmcEhFRTiHR7OFvim/M2+A0dMtC5kLG8D1H9iDLkHMFmjYaGkfd9XsTodf8S7N+s4HutktKihxrT4Xxcnil11o38oZgFDvfSjywBRYvz8KhXEKLg5IhaZDeSKaMmy5U3iJBmGJm87v9N/MmHP/rOCuDVVqiDxTGolxP5yPFTumwfg6rsC3LP4hRhc9wYiO5QmJAMKeVXA59LhLZmKZIfUNhThG+PmgnmHelt9cEhcVdHyYM6m3ojzYbMZFc2skxOTIiMXEWX+DIkFHu1Usy4yNH9r/I1dBLl/+4oYy/cjxfga0GtSBk1gk2XpXNC/sPVUw3+kqt4aVaacDUdeUH0fxc0pfWOuHH6aVPyS0tn0Qzc8K3LXGfZhb/PwRoobxQU5tdtBVrEZmZFxiBFrr5RuPwhNh2H7GGRMOLwEWgEKm2912FQdXg2+kJGmUa0WHB/jf80wWJHBDdjTNQiLOPt48vxHP6Wm34A/k4u3i7+Hw8vw+CxVnsqatHNBiigHKtkQM1ioTE3D++NI1eS2pKfiThCFnEiCicIFsX7zfWK3M4ZRS/z47oVDODSgNdYFJsfHsEs0UQR29ppyeKOuisljgBq6UjQpCXmCDmC5LFopQEsYAfLzZKq9+ut34NzNNvrgOd/LiY9C/vWYyoFDDLCxtBxIamepKw/KPNIZE13VW5+IC8TBmNNDmy38Q84HZ7pzyRy8+4pc3cI0znFE11L1JrrK+W4ECNjihxaiSVVogXF2UWpcezcBhuGBqd45qI4z9p9gfaFzqYIfFMDp/LQEqsvlMzw3PlJng4iVRv3a9nHkcrd2ZFFvvLdZ00iGp8f4YKkOCqs8rKhuryVgFysRrjQLipKQFozz4AaM/mEj5E6ELlx+KTHyyfzn58Lk7pajJll9Ar7gQVamQ4rthTGW5wRKYPW5c/L/GXWDNdvAhG9hab2fUBEHt3W2zQlpiGidM/buJ2RzI6c6y7eW5xUjW52JPQwozYB9h6MLY8NVVQXlIcW5KaEldkFNxlwu+X4e0S7EQyHL+/w4bXn7+n8nHsYDY6AW9XOwK+rxLIjYe2xdRVHmsUfyNf7UrswTXDq6RVVwdQu667q2WDJ5BxCQE39LzdOtCW0UCAxzYttgvb2SS+SjaG5tDMIGJQKXeE4R9uCeFtQORlZIpgyY38SrxdvRBEqbW5WoIDN+1FiVN5NFqRCX692a5SXNTTFn9hW2dFIicq45YOY48ojVM03eO3FSxgUz9KH6mbF0NGhjGn4Qw7WY4bio2BNdXllKzzJTpsPONfdJc5YjISi8BvQgf7D/ijURb65/EZpBsB/rnx59PrC67fV+/0sR+69bjZsak+N48dk7mdh7dPn7P56jPskTnU59+XKDzVt4rGA70HBjo7Purk9+b/vu3l4eJ0rvb/B9Jv0R98ti8uPiFhLhLGJ4kEosR4zzpeOFGUBEmXjli47kv2TWmXUbMPxCRF2y8mNYtkrflSPBKapPSMbkFCYnT+lTrEgwCqq+lyUad7bI6zVGjHiRq/W340l9dzvEYnXrYjg8ScnygzFIao6iqekUYWMPnf9yTgrY5qT75pD3ecQMbWSbpXWy5vgzCj38KDUrgRXEwQ2hl0nY4ke4d7ZSQEFnJy4zoniHkJ7XtF/XgBNMMyID81kesPieBSiB5s/4QoF34gBsHn4NhhCHogv4Mli6h0pabGjqvGG2WjO+Tq6nVspsJcAz+kuyPgAuWZspSngM6Mcxo7Y1uDyfugTEgXCzLokBI/HFCc6RThTsrJ6g/OSh4kRLdmZ+f0PWOrNNd0wpvluWLWoDdhr5+cDDsPT64ejYYlw2NmUyLDBrU3dA4WiIXi6NiY5nBGu/iCbUnnhP4hY0DikB4Jy89aX7fAQjucfTV5/6eG8JTLhUJ+2wc6cOxMkcbL2oNdL4rkzwb2FTy+V9hJLbER+v9RAypuuMpn6u8jpr1TzIoCdb9lyro5xMMF6cSDXXzp9OHr51GwHEZkuY+DdZeV2tqw3fCyw/NBKOa2p/ttTOgDt9NeAI3QXytmRHXYcul/r+qGGHUQRVSxmBJfi6Rgr9QYGjp9pjc6FXALJaT42hASbgcOrmRbNSzdrqSI7IKnh1/2XmBYK7tuV7nGA4NwqPSX6C9OuK/TScm/O9WN/FqPONp/BsZaeI1wq51xQPHf+FWQRoKtzk8CZq13zNVf7abM7vTcGpzpOqu2CbnR+mwprS4Zu+lg4MO7DI/Xu2TWJ3jo3+NvJ+jbdSxBD/7a9WQX+9WrLgZs7Utv9SlW6QHk05YTmYZPu6YCU4wqCtsTdntEQWKat0vTn/amvdLYmdsYzRqEsjObP5pDDuKuuyWhhSEFt0pbOp8qy/9bWSr6+7lif8PVsiAZlJqb2Rm43qjqe3CzBbvRkpgraU7Anmpqw220JIypVfWrDA55JiG685keoEhwS3RuUlaqRSE7LyUyMieZI7WIis/iSwYtd6W8SjIWMTD59iihLC81uTQvUVRtF0mrlMaL/LFoBAIf5udrLbf6ULShFuRJrEMcAkPb6+XJgVA9iRAHb8rzRIN8SZPInSXUJkEcfYKf2bEe9wh6dJ9kwQagOwF12eaKMQmhwqjA4aWmNOejDnP6RENT6Orbo4uPgUmlH+yrgUoLeYGhm/mqmSJv0WFWj3h03DdwDKtyIP12yFxYCQWMYVKWrub1GhmNLiE3o7ocdZjXI27cNSIHkutT/MG+2kZpIU+xnPochUiP9woNtUWIjEguIjPehyOfZemaj61O4Q0k+kDTSX2DKYLBDT2DcBrDAL+vkYHjOV4/0OkXGTmbrwZ8X20bvhd3eb+9lDrnzvIk1Lf1+zDp1T5JKYQBk5Q/yrU0dC3Md2tdK1+3KE6fHI+WMYagf/c+GoAkjHyQt322HRsvH9DVAFraGw6Uj1lNtP/xqd6t883NpXN+l/3mbpYOW2okGOjc8ku96Kdros41mzDLuJlul347w21x7KvrxnWoutrmu6Wh24bA8m+kBUAbBdvMLDf50HMB0rjUWtU2PTiKawY+rMpthCJEEl4MS8xPCaDueb8CHgfp+3Hj/7wk4wstHPcYWUTeyDskzqHxktAgtkO8hJs33lCf0BBMzKYGufDIYfcwTvhoung0n/PmG9oXjHZB8miR0VxqKDKGybYBKPG00MBAbvgfaMsIYnAgPdQy7J1Z8PZU8PZk8MgkauFvL98hrN9cBAeWgGs81T8SVGwjcXvEOopzqPBAhD30CoYTcXAqEpvLDLExITFRyEA2ikRjIwORTKSlhSN+6MCH5497P40MDb9/9qj361iRgDc6PcUbFcRwR2cmOaOGdu9uggg6BdI0oj5MUsUL6tKK1b2cG8Ir6W2rFVIaGslxcV1c3mxtGuxEfMckx2IxhO/mjXfyd03ghaKYifHxzKhYa/PIu4JuduRUXRrslLB7nFvjGK6Tks/H7PLJlccE9mpG6R/LQHNq+jqVStV4UzYtKU7A4sTzg/muPninUBcRFwHkqUgqA5z0P4wjli0nF24EWS59FjJuLc+r7ly9C78Or8nJTk/4vaNCXS0kzh17l03ezYBYNWdcnVqUeSScE1ZPHXKLqdMz1o9uSZwBeusoErpVCw02KZynVIVHKARAa/fWubdwBs9G8Cfkkt03ztkWt+7nM3cf9z3mHPrwjAyQWSxENyosqWZebLf3dkXfrV6EfrlvMnMjrOEzd4EHAxTHY8RiIwfpEuhb45mK4ras3T0kfPBZAy031Ja1rJH0+gFVJ2A1HKjQ6A8CvDdkFGd64P63KTTuGVwI2alo+BazvGqbkf2tDa1yvcC1Vys4QrcitRVDLmCQqTlNUaLvXpw4toBOIeS3YHLvke0LqfhMama3pLygNzeTRk4vp1hi/bjlQf/om9j1eq7tT+TOIaGp1ixKCw1IHwezrvVLVN3ozEJH21gXYN3FTGb5pRZQXRtwAKA6gHuMSVSHASAAkOqsiIuapDWy0Vretx4nNxU4ouULF1Cjw1qeWgAArvMJurnhrM8azu5t0Ja6g3RH6+R2a0hsbW59qzd0n/UTpO7bOrLVGuVvViohZrBpL/qVYGBC2sluosOMQDcCNKYfcJFXqxdH8dzHEwDcGsnfLPtfSBuwremUfg1jlvquKBFrRRgkJfhU2XCrQRGdAG0Y+FP+UD5Irm9kDBnw9sEAeRQ6a/2YcdmoNkBrZHSzXIKYkaEMky4CzV1+C93K4OvzBj96l2ko0MkV+FAIEDUCdyAvRNgLyq3kEGWgR/iVPml5Daf/hgXexKZmnOuGsQIVpoPimlwcYEmyNnOGHq3uffa9zpPdnKCe3exIRPPI5x76Mv7/rWIcNvYYe433jQ+Mr4wPjY+Mr9GXDdU/jcPGHmOv8b7xgfGV8aHxkf71i9GmIVuhMH5c5fOn8upylYnm0VzV7gMslCeK1Vz6lCgKo4IXF3WK89g415htTFiszNGqmV+Oy1wEYH/6J4PR3oTJ3+JyWkfLSmegIV/j222kbeoo8NWIcQUNef4Sp5ZJyGiPUAjDGrKZDEY76S/uBwkJX5xdTg4UBDfGU/cWxjYgrZpZlwtg4cW5aXJAEGz58/IfIGdTczsA7RyWVwDo0rD8HoC2Npnv9QnxFE48JpMgOALMfAQocDIOgjFa1KuNXJ0A1zDW9H+xes6cuiuZgan+Iel85Qa9X7svv4kRPmJjm4LxIftcPJFAaPQWwaIxvaw9uDqX/JMOWwU0APKJZeMLQHdbJdD8s7YKN6+L7zMZqPyDNtvgbz5scoIb9AIO9w30WDmO+uoHrRoXDdbhuAhNKfIyjuGrFJXFDlAN0Vbh5nXxSpwGpYHabIO/+XBcILhBuzjcN9AT53HUM4Nx+fzjfSdW7xz9FkJYmyJLyfC4qTD7dXq9uWhxRqV0V2Ur3WixFptNAPtBkSSEhOhcjDmHuVdNcPAN21sIpwx7VwcmQChw5aLDer9fbuHm2TdiaHhG+Zcg4NQ+jZ8OkvF2h+/uuvuxzytqBtYdD7RqX0VR48mJRoeVL+3uEw3aIXQ3OkZ4Tl2ugd8D1RIM93OacZLxpf1FrHnL1iQM0DDJGk6blYqqvcUQVRKSonFngJatjiUyeK8NnLTDNVv0WYBTJS0uTzMcSysf1WHtGCVZOPhmAyX1NmkedaLAvJYIMQRDyEAG7AAHrVhR07yWm40yANCStU0WjdL4Tse7ejK4JxHgSo4Rzulzm8l7LYRsFlkywooYSGA72VVRpOkAgL1b61wceyQA/aV1q5VmnHm58zkZvUDEFrDXaymVroRhbH5c2B8jXCJsPEE7zozZ1jVRmsGk2flQPRbLAMFnHJpDzgl9DgDLtoVSC4XKgJm4ClUSUAeI4ayFFqalggDQ8qAi7veTycpl6pW0OKPysvrf/vxz6mePGvufftpqTeeXj6pyZYOmHiQMtWX+lFSTUmnJVjlCjCXbsd71fbcLtiSRXYPEhQKPzV1DC4199aqakq5OuxD7yXgvtBQbgwDBoHOEQggjPzEdAYwhKd5o3/72ySmlo5mqOQ2dhWTgYXFTJmFBw+ATWUmXYUrqQtKeX2apCtLubkukUaDLITNXu6IVaDkgyfcRXc+BWm1uc+OkoZmveB8zddNEV9RFrytAu14bIRcNZKT9rNm15lHuiuTAJ6YykMPVCobtsjDxaqsxISMz55W8VQohg2hSvQ+rsylW3ySzCkr8hSAvfL7Syv0ONcpiJ2pJljo6FAGke0XwnE+BQmmJfGckZxE1f8+JHJKILMTZl81GwInhoE1piXkcit8Z2hJ/tWgE0aVbfLpAEpyYPyKcQyMMnJ5X/x/QN6DZ62t310cgRsbAM9gRDGIvMmoeywR4DNz6wSCMrHGebTtl0AuMOrzEOmaIOXS6m87hChzDk2pa7oc8B3GMoLUx4Cu5C7mBCvDyGS3EbNpaSLAKtLdpfPHpwvv224P57LPVCqyy7Gu/dbxCYcYdDa/6zxHcf6wVcFkGRt33UGvQeBgGZViKFtd8pB9WrmHLi36K9635CBl1dCak1AUOJiLSJOOI90pgwQH3i8yb3nSm9/0IguXjPXJlOOtliHMSRe04c8wpCaUzplsHW5YZpHY5vOSkIWxuJnf5p0kXF1bkcSgKgDt4BwVbDfdtq2XUFXBWqSiIykbL2pSTzLndpjoelhZHjGkJ64OkcURhMww2U+3baKIfZE6GFbZmRwTYD0hesAZIVLmhZ5BqzHhhqny/DePZhxxynTQXb0AlnYsgNBsJtG3CvGa78REWOGQCWjn18tDNvYXrFmmzdYL3MEQqXwNQJwqrQANBSyWD30ypHmhw7wKannPoIy3MZ2tMnYOvNXWUqI2ac9WAZZNlCafr+O+TpFaLsvaxjSKA15phUS09R1Had+M2Z5g8tqAvgAKhV5++y2O/v0zyfLnspFk2HHRColdlzOsrzCmh9n5N8A2j12nNXmJon7VUY4Qhxo61qdYXdZ0nRmQaI4GV1qAoIoRGUQxwpHI6sv79JzW7pysEhe8gyOPMMo6an1+kizV3FN8N/07gAeNlM1mWmOigV1ekB7T27yagzp1LMefmWLpFIu2dM0kFsEaK6GopdmRcICWFSBiNpSffyGUFk/LRUeMA583cIXWmmZMUzmzUpcK71O6ThIfSjCl5G4IwqjUjZgMTVUscD95C9z/4hr0KVpOM3W7LMvbfLkFGFYu1z044cpLjus6LqBaL6e4OcxGmAD4BoI4w3qtOK5aGy/n66qh3DZzKRhOz+BjIonxL/zPp1/Hh30qpydvWOJL0IVkwqGLQJJyioO4JbcZ+P8+jcaeTEk014kTZIxYhChpNoYbIZ1+UM7ftGzab7iRSb8mpBFTvtSYaXIvt37u9PR7p47t31V5TL6Bu7yp9GLt4XB1rj9qpiGqnQiezeYDJZGUx9VAQWRPpl6UORFOvhfp93VWHvNswTDXE2ENfVUjqOo82krMQOvQNYc4pRfJkDieabKByoUMeRwZHG4OouOmTaSm6P8lCXecOA6xZ8ujBAl0224dQPXubVaH+rv4ZvW83ftuPHwK1kt56oVyU2gUD4ASDiCodusJ7lBg58DCQJLtdRofh/f3Kjc5dXDhe+3ZiVjwr0qGdsvKxdaHu2CHvtwyONlabL0oxi2gu7rIEjE3QMTwd5OUzhT8MvGruTMfN609gywr1H9V93iG/fp9h+pzVSt6DEOe/6PF4FCtfa/7BXD9ZfHzffN/AZ7nLp68fgXXhgoiAHZPNvWm1rICe7M1tP7oHdn2QpozU1YxcJkaNsbxrXV+po9kdBnCawHMQGYB+O2Rs0Klxi9l9yfXPde/3yYePgzHvwgAT8kBxdL3BM/0Or7bzeZoOh0mMLL7ddJ1g7cMDdBgtSy837pKJ7QvsWEY+HxnZbrwGU9Km4bC0uOKWUexvb/WoWhvG9skPboEiPuTF9XiMIdsQVMyOjZJ8syyAsgZcUQKw65iOs9k700wfAuhb3D9tYa1p63BjQy9a+iiix6za2RQSBKfnD1ZtVHHBq8JAcs28Ix1R163ShHPo7rxcOqUTXRnrgKhr5Vmyy77QWZ7dRrps29usz/FgInQVmXgOo4wL+BeCw82CqNN1U4BlTkiRJPsiRYY+dLYgDQ/JAO8GjQKpheZNj0M87jQaFBkmZWOQSfdRiPGDwyG8XeTrxCsFNhM/6jMvwkIwlD2WdZZphdTC5gyQ5IaUC+CeQE05+jsEG/MSIpkYvUch1FuxUWxiSr1E3m66RaEZ09Ob3J2twgovWgjzpsIOLT+Gblex+aKPvXsX+WjOM/Z4rc7l8VGFtYlyKshiGHEmeGumTZIAj6NYyu30zVYl/ZBGDzKM02meI/i2u6BpOKDkevPs6k3+aaI5eK/jvSfTd4+6Eus1SCdUEXu0e/VotJh+5qEPoCCuSKvdiEDgPKGVgC1sp5SfJTBG6rLb7dQoRnaWaC/ckJZSIUbx1Imad/f24j3j02ocIC2WTsAaIOPe04rYupoaYEzse/LNn4lB/lHaVWJreefVrd+h5gf7FevvwcptvcFSIqcTmiBE/7J9vOZ6E8FBKdsKpK6/xia2aeO82jb0mTf14Qbcu6lMQ6TGHSSySb0KYOcBlKcTbeWnqQkc7dbu0IY+/RFzTNqalqIJNHdNoeVrcYE08GO4GAiZrMLyARXuFMYeiF5cDH2OxjUuupS4Q63dRO/iikQPLAu8NN1DFb5oSNq7g5D7DUE/fUo8iQxPxyTusubnABSrsfeDaPtBAH4RdB1G1TMG98PymFad/9FA2C5F6G+Zt7tIYWVUEdej0dn4gPwD86rFdcjlDoeXFswiHfR2v+Hn85TMMwIV2Q3S9BFga3Uj9j+ANAgr98bJ1VF7EqYBGOEp8kXkpJHYo7fHp+G1EgHyrMhtKfURCUgTJOtt8PY78yLAoN2TA/K/lk1B6iK+WUKvpfAX7ohQSsfdI+ex1Y+epv8yyX5nTnwBm6C4p2AcLB//sVfKufRrrs6CzIERIJ6/MV8W7doe7XidYJo057wbJcEsyggAM8v539wx9opspneEp6lAj2rlP6Cdy1ew571fIW8OkwLGAgKzKGMAzAwEPpaUWpaLFKnIiz5yjQBbxNnURNOaTAdopa0SC/DubeQ7E/QSQG7jrYUxdW5JQfTJfXaCaKumwchFiHb14383PNkCmo9mzlGkBSfhDrjdLIvJlWBxe2y5LnynjpGIva/eokiFjz3bjtFmzlqDTttDfFk+hcwK8fNMGN5AlO/HW5IV3sFFboKxL1NaXiSp7eDzxkPtq8eKOR8LRGih1MeL/QD08Xq1aJgIcXsR95py460AzhAaMsPVYzx+hjGUK2c4HUX9jKClQM5ItBfU6XUZLMJRArXlApwhlOWaKm8fl5Zk3Mhbk3Evb+M/+ifBISGXEqRkkEY6+YDxxTunwIjkKlpKikGu8BykOCSAy4oUE2mUZ+oyKZTCUCA8XZNSWzg3wyvPrVLBeO3pNDIc2DeQiCdJq8hWsXBJGhCTQmoRnkM+MrzsM11ZOpBLF5xdt6RRgHi4FD888d5bQgiHwcMLO8TSNB6oeG2TOXhkgmviGQw+ds7T1ZoNgKaMjKQxy9wrlJ4NU2I8WZMWe8GACI0oRGbBowqZPDJJd6WySQhwsoIFcyYJ9hDh9HYNtseUq+BGfEc6550l96el+1YGCib/y59Mk42uko5KM28Uljv+n2QYltMXIruvxAPNzBqYmb2wjE4a0juzpHWkSO0QkNJdVHI36kvqMpDY9psJbRXfYiVqRUxhyxfXCkDVJBXbsMyYhi+6kQZ+nX1R9W6R9VrxSjK5heIUfpNdhLHyKsycM8SkZyoizSYtUdSkDqMkaJBjkxSp8JBNYqgIYTQMH3TDBWFYXIWBQsMyw9iH4idCfSikh7AQeiGYxgTREYjNexRS8H7h8+nUUeSyqLPu2lUGbCJNNoAK5cunPLbpIrKB0P5zwBNgbAAiy6h8K4Jn/tkaf8CejYcVaIwfDgXMpG69Mr57J/god9lnU5bz277053vO5vt79uZn6V56yZ/ttZwtqC7k6Z6T+eGeg3kxoxoX6Ul6kP5vWonAv6+eqd/QwiNVeHuO5rt7duZH6U56Sc92Wsoitauf7uMcfi3rdpidakKFN3INfFfK2tGvxxVsXjY0qmuXED+n3336BGsbQ3ytuV8YJJ9PRMn4nSZnvsbHaquyG/9YMMMKbKv0qCp2IFHcMqvKPiFFN6jopfIdS+VP9rO4AgAA ***! - \*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,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": -/*!*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,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 ***! - \*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,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": -/*!*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,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 ***! - \*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,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": -/*!*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,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 ***! - \*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,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": -/*!*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,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 ***! - \*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,d09GMgABAAAAAEVoABIAAAAAgzQAAET9AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGoECG4kOHIVUBmA/U1RBVFoAghwIgjgJnxQREAqBtWCBn0MLhCoAATYCJAOIUAQgBYRcByAMhhYbtHQVY1vWMGwcAJh3m/FRlIzWp4mifhLNRPb/1wMqMtYO030/KIoKUSUKTRGtbp/ZaxWzLY4hKnSO0DEU1Lrb2ympWi16+b7y2PG2+CgOCohlKIKCCr42RcqxMXS+o8f4AfjsvZaFULzeJXzof9/7saSF0J0YBYYBhngTgE2c4uRylz3qFCleW0WMD1CcgeN81Fz4r/eP/9be3X3uF0bK6AhA5QKCbGI5hyr/6YCMHm4PT9v8d5QMEQuj8OyY42MiBm7O6K2tCZiBNmIlZmA1umpj9V1EWavSo7mq6u5qwHTCQ8nc7sByDoCNPqFKP7kX6sDJM/aV+AYX8TZpD9f6Aim8mMvuTxUptMSL/PxPW6V6CXsv2irdnb/qmzVzMfAAHg2e1GuQhswc4neWPBl7Q1PsKPQAbLP/xW0iOqeiUioWMgUjATGIbCkTDFRU0GaYWHNRRs2FLlzf9epqu92u/v4uMt5vutf33hkoigsYuuh6VwA6ySH2/1Id9neBwAW64thlq7tFXZcMo4/ZlE83qLlsMT2OijrbUtNl6irGk6STzef2eoTDzrjDNOL8lARqVK+vm/u06LimHxm2Tp8/bN3SsS0zc+Z9SWf6/lm6Sz5Tadw7ydYZEoegBOeouNrthkwKbLNlQuvQxLpdVLdh6UpU21LclH7gkAvRoP9natrOYADeElAgHpQSFOnMc6rPziUdYumm2vkzO7szs0ssFqAPC5C6A3kJUAIYsmQsoEDyTu/RKZ9VOYRAUFTgnROlTDndc6Xnyurs6tQ5pKpz0Wqe+5n+pFWCjmxvwht4UFFE4Z9F4tpGA5pA1HVTB0bS6QGe2QGeWVGkH5iewEEsUeXBkTqWq/rI0tkKobIc2MqArWAIYiOIKyF7iGQlJ0H9VpehamUQPj/kERcjJE7/NoxpVj24udM0w8FYygwgkvxPRSAgYPRlt83qWANBW2tIHDiAjCANkZRGwq5B5FC6pauoTzcymz7KBfmegRAfWAPBOrW+Db5Sf1kkgO0AbICKIY0kNLAPvgoLnEAff6KrD4AvTo2LqBdcHhcafsEVoUFxF1wTmBA1AxQAFhU8xzzAXpQDqhVMVJN9AluNBvCE47h+aFw/GnRC5LV5D2Q7sSD2xAUzTuUHElhngyRS+MxPS1iXTaEgHCQmaSlKNYjSlqHdZN5OBUV2cpKrvBSggwoRSzFKcktgofRYVK4KVV661Ya8mtQhvoZlnUnN6ZQu6I5CeWNrfqQXeqc17f5Vvw0QA4FHSFhWdidZ3bo2tsXuVrY33W726bbXh33EEY5zinTPNMfFrnSdW9wl2X6Penr3Yz7jS77i5d3v+Ylf+YM3nux3/w0EEoskIIkhH3Bohn7ciMUwBQokWkBML+VvsZFUTMRSUnqun0YxIzcLSKv+e0tEtECR84Qde5ZM/ZRP6EWQV+Fc0lPprEFU2Qgcr5P6V9X1ekZso5AYQl92pJ5cJA4x+ar+lgOxC6mwI05aD8QqrVBn++Tq5sURNlXg8nTAtCvtN1H7kqdHhcR1oHOh92SRPZpO65iU/DJBDYhU4vQfDvJL82n9tIw8Jde0UaSFiLTOUK4oDRWH4bQI+nFaGL2cNhkcfappHYXM66GCYXWLDvQoSuphUktjoTxITMBR8N9c8levaPWBLlggkNauSbS1TMqriBAx5UwtO3h1C4W0aFevCa2S3YxyHMqg55AWmjiMOpSZryBALAgNVoNGz69adQJbUz5dNmxSwyFN0FqnQEcbEMCUw1wHPiVPvqw3ERE+VpHIKaVYt28sDYm8BATa1vMkcqZDdN0uik0b6WYtorclhSdpdYgn2wDiuGN8YFRP8HeEsVhM3jiV6IsWihLT0ZD7CdTDwF5yXXQkML0sLjAYkK9hhgWC386rRAC6m+d2XWJkHPC54VQGe2+BPlwK8roBFmoRRwBBEhQRruEhQJqan00HKyxyj/C3yOtsDzGUDWZYk3EgkEBzb9QId46aSQHqNXQbiYk77IliLeFBuedo2O9MJc4KVgBGaMzqrX3hK5+qhPoHcuEDH1lhlbWsz4co5UWQxnCRcdtxhcX3vuBdYFQVJOHZy6RX5ubuphK66VUgvuAbmwDuoFfwbrQNkiC8GyRRTDUxvQWZXamPNFIhg56MkymiijarIHHBlTWfdecDCPkR7cq80j0Tf8Lr+DNexxuZdb6QrwoqpfsTo9JLlaABdXBe7ac0+RINbsebuhrjPEB2dwCr8R5/LE46y90ZygH0vxVly/2AFbNLAHoCAHlyCQDsBko6jK0AtnJb7gPi9ksSGBAEwO2XMxIg2G+gFiDUrI1IoLr1XCh5QkDy3RFSVCXAb2NVgJJW3NqsGvIaJaI+suqfngRgLZlMM8MWdEfePuFLfuBHuxleCa+Gt4LlYRKsCmvCZjAFdoBvgV81qUqoSm12L3dDaRqmAwtenddVm2FZWPEtmcL//Z9P/a2/63OY9dme69hZe7mX//i38uzxs7vP7jwTmDJpzLBOLWqE0Xz12uefbEIveQOEWTC2QrgESNvdkg4R0B/Uiq/O0r05klK30kdAyWt7qN550Hl6V1zX10MWpVZENVN98wE6qaS4NnOoZxGWbp1JDs3wSaWPRsrIz6xfQwl83aVAaGC3UYPisJ7WKc6RZpO/VSVNtNHDCGlwqQi3280gi4QSRSpZFNPAEZLIDrqVUUsLHfAZKmERVWbOYb5cUlmT0kl1m5vJgENxslsj7fRxmU+6uw/zKMx3axIaomNHCgVdyKMl/ksaLhwgjnOR1mS3Rd/RqcZfswf8gwP9fb093V0XGenstNSU5KTEhPi42JjoqMiIcFvhzTdef221XMxnMbz6yssvnRXePZlOxqPB40cPH9zv97qdduv5p/K93T1ZCoOE68u9vRWVgnDJxd/fS1wFJ4G7E0xagh440x+6ZkMb4zUbaFiy+XEoLqQ46vhMqSoCOPj31h9xf1A4aspyQ4OV4x0+NHS1W2xKoKQNMWDb1hsyaAM8FGnQMG+6MgGmxFxMwGRsXOuEv1vbyU8ZJq1ntCwbdsu8ecmDg95xqLueqFtGbVBCZQwze9P8CZfYzCsc+PLKdzLHgSTep4xKOMqfbx9VAC+I4EiePXbSW+Ey69300PHGuZZeYcj7sj7LvTKXU1KtJIJaEvjDdNLZl7RwZQzgXxruZ0JKQs2nbXEzgjjRMQIAVzGeVaPZ6DDm7fe61Gmk1NYeA+NFiXBIPHRuIMTJjbnEFI1iiltDGhFbcS9eJnZgLxZPOgdCwB1/DRI45UR392y9o3f1AbVRR8J9+bNe9z+C8hF+ibANKVSS4f4VLP/lFXTJxBs+4hIOScmekwStVBy/8Ukvayq/uFm4XyI4xI4vKqra6/epVpqJJiz7tGlLIEkgHAte87+ISVJj0COHVg3a+IvvG3UQWA+RHC81+7R+vdxtpjiu9yUZFGHGXqamfEsFK/4GXlbi/LqaBya7c24Fvsqw5EV2z6X5lLTTyqSvOuUtGQgIFVsfNq6Pm8mElsxuq9sJyYmqQCxrCEWt85w76k7MQe4IcKPBn+YmN+n0DSl4RgT92L2mVz6CF9AcYYmaThbUjPGnWbVCzQQTtlGt9AdJP7KPz1yA8AoS00f1DRXn8Xpaw2g2cvx40dfwyE5T+ZXOkUE0mp7Rkkxs2c+RFtADWJIAKb+CokB/KuPCSXSRFzxySd+VnOZR09xryebG3t+oVrILUss2M5MFFMV7KOer69SSwyzwbA8is+3hqq+1cpURaQPu8WI/BGsyws2FCB9OxCUsGTpDC+8vAUzljNs5Yk8cJzBJ+XqJT+8kkGrafwKproBdV1XrIxtgySsMBIqovo/BdY2b3vZvFFG2SHjM1/mTYeI2akv7WS6LmJiUE3b0hHtzyc208bBU4ZAEm6mpbwv5WNy29Fg6nYgNZ0ByKg0opyj4iwwRNO0b/cB2mVbRsyDlqsdzofd04SiMktYFkMVPFW7DJZWWbDw41N6k4BTgu1UPkDpAhxhhKswC2UqcR7AVHNW9w92Cu5bjEnxZlMMByGiKK4YBRkd0k40nqQEzgtbGSoLZ5/bnInLCQrCw5YmsNfykXDiHhVwl3Nt8GiwbyqlFdvaj9kADqtv4/gbwUYYvGSl7v5XCLZsWtuWBaIp37Mikp2YSYMZhql+7LbKde0FIm64yMPExnCmc5pWTEaDP74YapAOjCccJ1Gg960l18Vx9YOFAw1KuMq9CVRJaHLXzTiLkI8+/bcEssfqUOxXBDrYgMUdHzL0nPVwBH486Y7YO/wCWWnbzpRCkB6eXdeSPBl3WZwrOBYEbUwFv7XEBZEZXyzVMFh6O7ukBOu33WKi78keO6aDVrrrQzaez0ta6MFylrM8YjV/zO+gcZfL7iLRiDl1CV90FgbeVvUOieV+h+aDSmHfmjGGzrQlMUyMhtVLMy/3eoG4vM1B3G8parFqwwQLYqACik33uVxyIPkjtyhbwzwSZJ67eIn9iInQr3JiIGvLDA1PwpRgWi3TzYwc4oW/SoAnlX4Fb1eO0NKnhNjs2vL+YgfvEnlp9Qa8N1JN4HHKNqLzunEDQIsPUDgP4gvboOwQfAeNxQp4O35XfsEz0YaidR3fdOm7PVsXeGlPZs3AH8RyISWvltHAUnWGkTmLNFxDIa3AtKMjMUn9pAVN8tXfAboOxm4QX2iwv90mZ5+k//Zq+xy5ytEaAu0pZb6nMELkGoIUXeOd9ghACE1rpUbU+ZFhVq7GiyNuP0JVRxrdpIx/e2/TkmBIs8i4zs3b8hOpkY7fRsekRKMrB5HVTVtU+XN+XU+yZrorZiK4XE+Z+ADecA2i1svyEkMnejwOvbLUixmvrXHWnQx9Cy8He4Q8/Yp0K9SBBmNQuUJaUb/1JV2DLb/7NN2CA6LzZvtm/Gnb9Kbycp4KMLMgSCl1OXG1/lR67b8BI4b/wA2O5lPlQWm8giIX38B27ylXfOFa++yj4GsjpjQgryUSwHLYhzymT9izBhWJyQsW//BzGOcWgP6yMNxsVjnPKbqqb+lzGusRocARLOmLhNQ9cLuv33FzFFj7V/mgaC+f5CW0+Jq0F5vioW6tb86F5G4WjEKijS9EYFFB8wQGZ0REsdTHm7KHcQ/vs6kP+s7tPEelCoCjhKn9uzGC66iJ/YagmBucvuZQugBUYv+jF8F2JC6ni1H1BD0J0AFYka8oWKupayXsoehZSYV7WQ7nCiNz1Fj+BzZA8mOY1XwF/C3Dui70XtEEbPwEQUtCzJbZZ5mWWDTOK3+LFUgV2EQNMkCb2y/6nckODI6K7WQ9UW33l+R4Oya8LY0xvDHzREMcbVWC9ag5DgbSrqzPkuOdKi0wRiDKG9hBUNN2ZFo6z2Pt3rBDDaqwNpj+3m9QQxaXbCN8x6EwOEgI4o8Tdi9JXE8Jbgr86Ljpgtp38sG8Z4IsIZFXR/PauN90yIK7xYC1WMn+PFtg0dvBHf4iuYdM97Pd739gW6bymwUeNqMfwtTCudu5WYKDbBayiGtpTy9yytf1ds8q7xDqDRmNY1Lm7lbslOT71vG0Yq1ji/dFzs/dnenBSFHyfjG7Gu0sY96e7PIT4tAixWXmBMLRKtmlgDhhW17QdaM6GHkPGnMk2pey+PPTIsYYhjDGOdSoWDmliCEvE4L23T9gXqDXebU309kQvQ8CwrnnJpnQLv36FcdnuEmQPaLPR2fxh7MxZcSclZIqJ5iqMNZsU2hRpA2KZHq7T4H9yqr8mj13qySNhwUj3jQ76JLR/fwaQEgoo/j/A2NnQziD+45NyNIEJujTPphqwIodSwSJ/kKcDojnA3T0ajk9pwR1aLlB2zhLFA/4QApxhX1fw3onP+HANE9Wh6k690XwnAoAQcvvfp2NFI06DxnYIm6N20GtyI/Zti5qhGC8WAZNamUm0/4XJJfh1IWZDvi4PUEEnozUP9my/2JDDUpycbk674MKtk/x66JB7g2vdwfTmtj1Rn0YuVL4Z8mETi8BbhroCgOcJ3DghLrGgQwK7zrilsQCGUdsoLvS6mdgPs9Iylex9/LxaS2AzKIjfN+U2Eow6HAF87R4ANqjWHvBPGnD2WIkrYADuqNW+QUsfcMv0zfUwNMFEOHnEqj4qVxLwIhyisrS0EqhQTRSgjhMB5BZmtrDg8kO3tNosOtxVjpV4KUeiKrRZqfFRphYQ2+qWAcCOnD7Fo9yfTNH5x+AVhUzaAsK3LXPgsKq9985C2obMDr7wXnL8vjc+N4t7pYIZRNqOTPSP0T0BinGvT5sBtMwXxIZbzq157uP0SYgAc5iY3T/LjkKXf2iAY92YMfABalHCtrHkuJW7/jGMyD8vIrOy5QuVMHMwb2KKDtJSEu/IVsq513ngf+6fwUW8GTdkMCQI9H3M7LhxIGFpPiaP4QgUuC59msg63KcKXTDC9Yf4s0TUMtNAtygKSaqTbyGL9pj0DoNPDTpdCM0BqELtxoLsNNzjo4cUo7pmWUXE/sw40VwB/ARqJSLsjswR06wTN8bsJM1cHJtlywC7Y38B2Esdonv76A5gfEzagBsABzLE6gg3DKDWN+l4e8AlwNG3QZmsGAKHRGe+ZRRg49K2CsO+FZ89+5l0vRI+SbPOM51cfhNmIgdRB8Y9Q5y2AEzggmbwAWlnLzUbdE7ZArZGQECPjtshf48ub15xdtqfawti7jazKNA1sGy85oAd2HL5IVAhBPtU75rqMjBHM09lMT6CgEDzei5GS+LR4gbZyjFMIfQbpcH40EUWwkT/D0DeSed90OCt26yqQba867u+Ka4eFCaylCxoIGbZWPWSCdojx/JcQ03LTXDp8eg2ABsPjZJfjJ3Nt0WOJVttOzyifXAy0XBJJiZjewA1bGpFenb5jy0kngNss2Ojd5ZJWKazhQHyZpVBCmAR5iNfogW5NjwcSlvxYdAFab1D0B1laO8W9W5YlxF/08XU0s6TEEBiwQBxULNrzktyUJD6wBIkQzo54HtMucNbHOBwjXASlbYHOmzFVUXiz2gYwa7ZVAqx/d6rPvSK9KLaKYVNfDh9GNUw7GG/ClHb5pty1eufijGBUrwdzFRn0VyOV7ejYIGbja+4GIBefKR1L9icX8wktcveljytmZrUaqW+k1NIPGFNa6SmexCkN1ut4FfhrXkMlkPeGTvoQQ9sWdiGn6fWWrza+5i37IpdAepAwO+HHGjd2IWuR/cK6seF9Af2MknwhHW9n/z42bMz8Aj85+OcPgjoqoyHe/2gwqPgWpurUYctGBo0HpC2WZOVWZxxaryRq9vxUbDG9cn9go7dFODhtzsh4gy8U5H5ZLJoPHyL3eb7j1g/yt/6O8tAUZcmfvFC/Qzn4WVrAVoAtnGAbUtZuCEP/THxpmiGhOslM9GyBd922PheIlMwuaD42cWn2R5CBBOTml13lOioKBTS+yp55aWR3JL4eFWhfU1r5uoWBfkwBXfgF7yiV4aGZeRolTEN3qAzuE7ZXo+UpHqujzQguME21rlW6IzNxfynlDMQyOIAt+XToDGkGNEG6em84MypkvxaAQjonVea3FiTg17E4eLN78BLzgUt9U3OX3cpEbRuvDJnIb2PSqW+mVuKdXtkUsCLw3g76qFHkRjS4rc71G0HvS53/CAarGeHW/1SOaviy7US1/R8d5IozxKYDVvqkrNtDPoQJaplwoH7S/YqvlQBRR2QOFn87Fdg78BjgyjIIh0W8WOiEgmKHiBg0Gz7JT63s4TaDPls/UXhmm71gC+pm4+yr/WvdygJto3qE6qCRev6mUzW3sa3x/GAX0n6eR726WbZGPa2KH3fMDthgLj5UplhVYfbCO5AoUnCkehqeE1b2fXf5w6w2FaIgK24wOTT7Kw34pvYOtfOGivIZSeBmqitFgAHH7r+h3IXb5FaNPybX0eicvguHTfthRVPgROj8YZbY+xfATsuJEvPZPCNNY1ySZOzf8UgNMdQGrmHPnqnI9fLcjwyR0fYT1Eux91ILBur2WZgPByd59xF6ncfGZ5C9YB/kqlaKr2dHUxjNcUpmNyZ58B+qMFREiJMgyp7FOUrj6tDaB5hggTURT6dlxxAZfYRhi23Lt9XVornu7oD2VjxpEm8fuNyAyjC17wX+5t0/lkz8tnQn380lszlRGcY9+1ciou+mI/uAIZILhV0O+Wk1pzlllWYSK28nMIYECN5RcAvcVej+S43csV9vlNdAi9UOw0Pnbn6u0Or3WMy69/lFEvpvecIk9VkVftcontsWNXXC4UvLwIQ7Y5a7KvLJ7wYqZ40uZlHzyujGjgYWj6OYolN7Vtm793i7b2wS3Srbi9hIXVsl3CGklUeG9au13Ep4L2U13Wpp+MSAJ+mYpbHh3nNO88Fes/l+c7NZ+Xp5Tklqpbcx3LUusbjQ66oaxjJdtNFb5JHRHLLm+sOX5c1h6aPdKae5e4a13i9LD+zK4O2U39ck+IVVtSLWhrnnlcnh+c+4YWTQ2rJJCNl3380U5nkpmScsrtqe4mehkomkfIzv6TcFvDs/iOYR3kOjJfFzBWsKMYHlLqmtnE/Lm6+6IzqQL+e58UJBcXepKGIVDUllleEFbGK3Un+iAx9WZE0L/+OM3V6vDx2Pn9FOd6v1DV7xgfx4DJU3aMQ25k0HJGiqsTxi7ECVtHbEd2ToScrkCGvg5YeXB5z6ZY3BrwlmeSyQzKHZumsqdM0Tuf3qKrqJi85a4vBgxRC5clkyUqKRDFl6127HX4xodckfMzIDPC8GXUMTu45ASqgk/ToGWWOWuytPyEsnJaBU5ewFRohrRJbZGNV7GtE7fmZ74B5wz2nGYhJN5Lvu2YpjB7ktdCk1CN1rVt78nWYtE037H7hHFICPEyrP1M4ugws9LWCY0hxXwFQwX69cZYMpM1ncirwv6j40e274pry41wtRVPOa5jRhSR31xw45Ag3fbMdipbEHd1/dDWwevvn81Qgwl8I6cXaIK1BGRdbkpjyJeNSDguIvZvc+FFSI6BcIacwt4Ju5GYW5BNolUCd6a+CwfxHW7gXkhPX/l2xKXxc+tJwhdt+TuPUB8rULejTzo7EP2zfmue5vDNSxSi9iasbpG1k34lbtjRbFhzUZo6hn7me9zx0Xj9gvxC5GB7f8yQ+K9659OSHwKk2Xucd1WrQzFYcIKHsnVOByslhU2duF9fQ5K4urUmy4GL4DXLKXf8sz4pEMWVu091ZuN1V7iCELCvOxp4BtV7L5KfN0VH3S8NlfZlqfraTJmc0DxJMg/BAgDeSUScsd3ONbQ6DcZ4kwPLcsrL74sK2JaEsaKzSrKw6m2NCm4nT8/3K8rke710XZQVLPBU/Uyh57TT+/I3XyjWfM72SPvvSgx3JQR1Hjb4e0u/b9EClCURqjapKvTrHwKxjtdWHcZWWnH5u90ywj1gbQ4mkF9863Y6Y3Zs9q1TvIaRu6Ezrrcaya/6DTzQq20GJpyt1t3jhyG94H5NueLitT0jOZdqKzGElKuMw8R4c5wPPYIjJnZBgpqAni3Pw4rNnmeX3fD03Tc5hvocqbkFPC1rrfS5hD01RmdA8VwjHQaqKJapcxJlcWeobCdU9kN5cWQHoV8niS2bVoqXWsLjp8WBoQmVWA7e1cf15bWrfvJozIa01Hjhu16YzMqqsJf0aV831/2uoCzj2c6mdDFpurUnFRBkTDkvVvRbnaMfX1w+p9UupLq6m2WHmNJZU1HD1eg9MBCrviqo4LPJA6dZFRk/Q8BjmhYoFsT2ZDNdRpehUuzprUT7caTuK13nWbMo71RHIH+grYVeozm8wnBuy2mLmrzM8+Vo9jHgf72kqyeuuZHEEnUSpEzMpaXf2I0CV+mxKNiaRScTko/MKymimiJ/TwrLzSHNImhdrg7wGYWzZvLg8atGWU4ATFElL+tlK5ZTB+h9PG3/YoBvxJEJf2Ftwyl8yd6jHhFfk5/64CxTxtazUkLRx0TtmCHvJfcZ6Np6U12ikNwu1DruJO5VLSSJ0idHPFR+Ye3r+uJ4609evo/FwakmOLpLl38ymyoXjoF/B4Lykawf/2De5Yfxfz7QEMvfju0s61gtv7u3NjVmqy3iGe7Smoa+U41LX7uZgMW7jVTbX4GSgsvCUMdBtPFQgMfSmFeqsUcQoaRpxAFOowNJMeT7oOHvI/MFDjiD4s9cZXsGr9O9FE93//fBP1L9nvDel0575ISYjzFZwDjVG3a6035vh0kU0NBUf1mjokqKm/NitzTCeYAX/4M/fHzAZs+nS3SzRDcgRg9glXMZIoXKQbKt9/7P00IlGi2h22lgZHWpVGJhuPzBx719rz85KfFI/XROwVvkHjvygVPpXYEuJrl1v6amaeg/RDFr4zM/+a6SwIsK3cfLYP+GtjtMozj7yyPGhfaqOFwKqDxvvGr9oPnPuyYj/fDIXOs2DLyZFcpu7DIghZRxghI7ef71VXLZ6aGKx/xGza6B+C/u4482TayemEep/iuCVWt6RVZyCNsWXHXLo4T5M4JW7oFDEDKzPCb4O2pmiumveJXHom+eHNvaX9N3O2osiTnFTNnMdPY8bex5q4LNt0mvr1X2iAGSv8SQGMfXo0Dmtyv1MZSVItrXWX3+0r37Z2VeCG0cuAVA5yL21jMMJ783Ole6pQk383InLsLMVsOqiaDJtdS3sevxg08oqN1yOsa0efN2bx+a8mpsVByq+inr9AredCX8MibImliFmI3yOhfw+lHMSoHPhJlISvTUYjiwVFyWPx7dcfcoAvTcfF0oAkCV8kLE9VDyIBx9b53z8L/O7AqX64cHQKZxqcxIc0oS0l3dRCTqJutjGS8Cb5jIboI0fSlL/N+LFfCm7kTm84L3lkPAb0XivR+szwfXk4RPe245x0/IJQkuNeqLsLOI56/yJxyt+UziPQztecTbphSqO7OaC1bi3LuvIMzrFWpNHeP1EzzfklhkP8eDrwcLneYzjHt+oa2IZXPKc9pFL9geAUbAmaf+N8uu5Q/cryXLmyFKnPTHCevVRQDW48qOaKD2bCIF/TIgfPJ2bqWVtzHf1pX4/OPfQtJVtOv7jROhMtlmW6+F0Be2TiwleUN0Cgpa08v2auYvmRZgpuCoWIV9dJ1XmcjBtZlq/wcY52l99utjUtJbFTyeOe4/myitqk0SkLCORlCvT02j7lAV+G2fQVs9dHK19zkKREGVNOoiYeS+BdzDKnQSygg7c1gVf6E0NM/WFvUwdCPuSOxIWDHum/MGOBbnlFMwXfmF6Nfz8OZWu8S++ZYsZgbGCld1qszJAPbKK8JSNYWVx3b+k81vHc1/akkzc+auAvwNZg/BEnUa5Y+J3c5/XDYDtbBvacTMRrUHeBl8w0VoutHsI8nBsKsO9dXonckEPaQALOrvRZp5MXTzoDjwC2bcLPT70Mv4U/ir6CvifyXs9b3vkcS3IvamVa1tffPvutFbljCsJHAPtLaEemULM6sH9JYWHbibOQqMo4Ft/jZD2fxsj9fn3pKKIoyKvBfXtRS9cTYMHvotBf76mVDgCfuuvCKF6fN9RY3zl0Wnjl8HvCUdt4L0oeC8Arn1X7u9kN7Biz/9oxMRaT0Ojh0GqARlrxePJf193un98SWBk12KZajKwYqIrop8+kPAQsBTPDJAgAd4BV9uzyil/4cx69lqfnuIm61soR9Mum5p0LRkIEM9VzFJRQknjvpjlmGVB6x6yci9EjQX8E8XoJwq0fil7qaMl+4nqdE9wVeQK0Jtp2jbiieQLumatW5trztbI+E0lw8lHRFXVvow/JdO2tJZLfnf+26aZYf95djVjBLY/e3iqAUHSTGuq5/EPWn0J7S6SgNWN+r+x8JHUyBGQekDCWu5syXmiPt0XXBVaeXVYppIM1AnLxVTnuPVLMcsxAdjDkH8xzIEKcCDHmKWRCppK9dUsqbZ6XbRmms5DPJ5yUdukacn4QZK9adZf6Rngbvt1/x47c/bIYIuEO3zc9hOZnx6FBvV3TXcLRjDctHFW8kwmugPS/QiTY5PjOAw+bUBaOwe1fa1FDdtfttaZxBa5Ic4Ii8Mze5wWrWSq4qzEIYW4OZWb74iLyMx8jya2T2bUw7shdd/IZH5L6PEH14mOdomTS79+7n51fk3w6IlCSe0+aqVZlfHD7izJthZ14ar7AEGVzgllxYEt70hFxUl2mKnHbhnrCrXbOn4/ZsrRaKj4bf+N1brDW0Vm7RkN0mrTYU0uLXULaW/TjCEShDhdGTws8pg9WbD7hKi3uIuON5WJ/RrQxw6/FnlFUI6OI1vlZDC6ojKXKktrIGXGkugP9Skv6rooptrj1GD1dWAIq2qMoZa3l5HbdagwYcn4iZWJzaNdEBZTIOQsWobeSRu1fqREiZimr+iWhH+K1XZDJ6+lIDE3MwgUWqT/ayQ1zFEWeCVZj4TJVkWQxZrf7xV78XtiMHeii59Q/IuWzWOBM9On0kC4mOWYVX97rB05Bdc6noLDL717RzPmyjeAtmyBPz6Q3qrGrZjwTT00+6EPgWah1YNMeXPrQGi8UGd04xhL3hUI9OUAJUOjJ1anNkcAVBKFweMUNeCrm2Wb0Nbq3/hVZ0cB9rIMkpBT1IitaVVdhfVaPzIwi7i4ewr6xg5vVvUYU6P0Eintiuw9uoSJY5tTF0bOxdM5DDZrrjLwFnLY9pHCT1HfjM14o8eRdU813T90hl/TfbHnuNlrw9xVbtRZgTlQ7izQmMljaZfqSFkeK19Gb8HrqojjKeuGvq5gJPrLmO+mhbA3Q1ZjGIMVQvWAlL3cOTE361RvcEVo5dUXs1WS0EKxFn/lW82H5gcw4aQCSHxIar4Muh5OlIJVfYBHMawBolAzKGUtd7hznqjPcKpWRTZuLZalKgCSJryxcfkcQ64xWyPnNxOGkw8LzdaBOpqbpvOQXg1WdQtK1N/cDYeq2ynCxLdW1KaXkHBuD9/WR5+LklT/JWcDshxAeQ8L5rFymSsLJyxG88UEajo3s0pR7KDrNYFljqtyBfNKEQc3kKHU18tY6WEiCj2diqoXE6v5NdbpG9z4BlBd0NGNCGFyuy1re11naK2fB1v8LS/ng/bYas4l5BeQy9Kpe2qzhy1xCb0gSUcZuU2JCRenB0+uTl9oB5DlGUy+kLNoHXkvbdT6YQ+BQw/AHoZ6h1ePMhM+AzjQV8kt0tABTCJpt5DSSWivEbnOI6VM0OJOFL07WrujFnXmv5A/9aNynVxMx3mUfjsbeQPaKbTdIA0XSGT8azqOeJN5ST0sdZsJXLEGRKrKMg2JJLQHznlstgrqP3eMd+y5u/L/9AefuaC/AMN/k7d0p4BPAiK93HashbsfyPFd5eSHkoQPoLm6u+/vSK/wjzId59Gf7t4e7BoMUGCIOBd6QfWxXMYhaH/mz44yEC/0MiU4U9OUFEZKKPjEkABh2Oi2xEDriDK2mkKNq1L6prGulPiAvoYcV0knxTka/U2gp7iS9Bo+DEDJynmizI4hyjK4w3GQb7cZKgJYwrrRthmqCV7G2EN2JsXZGwebondxpWhVPHgoOTrvg6osENGAVkADEUF52WQTHwEkcQo+09dAmFU0a+KQoBHJkEXQaTSwS+edzXNBxBN0hAmSg/dRUmdi2otY5c0wBZKZaIBmEbwU0NTPqWR2qRsKj26O/CQpJkwKAy1XjU1ziXQjG5OWj0xgPpG8BNJ95FOevbMQnXVPNto5eFSuC0/q96StXnBBPs4uXnAlkjTTmpq5koetWYOTLYwe5KtjpSPJ8u0Zl2KkYSOPHTRuS7Q6+707chl3nb3j+9pPnGVUO1byN4h9oYWmMs2kLSFIKXXCvM6cdyGZDs//7qhPJjwHy+t94FQvL2tMv9+TI1f29CYg6ypKkU5EX59S3dP3Q4xmWXl9+gd9eSplX99/WjHlFenOPb25V0xMN4XayGBSm91UJr2JSmlmMiiNTZTCavwelKIvLWUJFd/1lQgNuTD74bfPZ1Ve2Lkmn5WZvJQJ86EIe7JUpsKxRVhs7W9cAIcPwtrq0j8P7p/PlwyMaWUps0osM4mV5OJX1PAElKY64Xu2jmaWWNOzzvYY5pFP8pPJsIFkarE9gULB4bSM6hwGooFDsnPopa12PTH5O1IA3WAKPiv0wFFSq9uFWdkUe7kk5RUlpURByM9h1pNguEeRau+i9AupBShVavGTaY27KP0Caj48egfY4unw7XYxC9HOewtREvMLzuh7dyWi549Ful5djBefnw/XuQd57+Wf9wcOvzKX0E/uQYxgm6AmWE7X8Mbhk771QH4jtLB9l13B9szAF4axs5XflHH1Xw5NfWUpHfnKMHxWL2zdV8OTf0IUYn+WNBUX5NjYCvSSpM/DE5CYZX9jU/crhg9p9roxLUEcpC2LmY3lInXR+owyLJOQJyDgKxM7SfQiCqrQ/fE0jpspEmE4a76wvLtB4bh6JSOp5pgeRn0oLTpYgN0fYaPg3bXQ3NtvMrv+WBnqea2y2PJetLdeROcpKNo6ANWsy2LmrO1PWy38NyKpex+iG6AQrDGO84QjWh1/ZJxvNgT5ohGdttUP8rQNZlOtUmupNVj93FqlsTYy6H/BL/cx/Ks1jyQc8IKPjAP4sbdzbV2hCVv4PcHciIKUqD8sMhV6q3t4tHx3Q4ee/850Bbg5GvICg9YW/4X3QAeqrLpKIyKrKAoDuEpPNKUV0/II1HLidtfB1NcK9z0VMJGJagqLNKV6p9MADaGKcS1UEdd7mAGPePG+nLOsSlz/6kmihi1UKzXCzuhfkbR3TljMwQNFNU24G/6x8meb4ucKLJnbQjbHbHM+3tXnRELwtYL0TovZVCSWA2lMz+KiibvNkzWElngxlV1OMfXiIiEScX3Iokr39RzABSa5UJV6uSVsIQIKmwJVjwwMiDJnZR4fXdLVNNUgTD8k6vCxeJYiflGxBtZULmfyy4vFBVglvJEoZUsjPkj0FGWxTnU35X20hf8XvYeebD9ubsx7a5IEc65+8U6rY5fwbBLhTz7TYEBH5eNV4lzdXuHOKZyvWCAQJ4wXSaTQtjYSZoi2dxQVp2CN8eWImS/N/8+oPugNa5q6LEUnZHhVOT/u0CxicnZ09svZiPrdHHiSjQjjxlr7HNAZTabfEL2x0qA1mI13wu06ZkMl5B0hSzF6poCRd63uc6261gUsBT+4VCef3fr+OLXmM71OUx1L+eQCeZZ8ktD6+d4wraKrfjesGV30oH+/kN09e701hyefwqdUuuBnYi5qTHPWkxeff25XC/93cuQZjWq10Sd9erHrO7umUSrR9KCMc4sdecznHasPnkLs/zrtD6NiqAZBlunjqqLcqfGDreevK3qPXxvpZuPr1NLYfxl7CEmfv+q1s0LXa+yuX7zMr9cMIs8e3vAX0X1dnbpsOOXMI5Edt5bEwJmU7B+uCmxzeQXUarZK3ERguKPkUUXQuDrRsR4JGAjE4fAikZLCVhl5ua0970Pd6Z6x4wINzYglqlOApIlaxKFi7pqxqe5EZ7eEO3zM9iOZj9mOluzrmhngjeRwkie5qceRSueyFKVIOuiEvRFiTquzd5aAA3gn0dzEOwJW/4Uz6dlVPjGxgax1U46lbpma+S31PypkP8JkW6UUfkUJf0RaN0d9iY/AE8mUszrdRqeb8WZB7zOGNs+4PYEu2t5m/ZEiAji5w/pt7grjv3V1w/eBO29uqyi1fpO7uasBfcPtRn4t+Z/b87wuOSBsJyjM2FZoR3EWVIVj6zA07SBX3ptxUtpQO5EG7HhEFWX7X9j/PGj4Thn1oaH+Q5L1O+iTd5AdQOwP0sCx8N0jMSndAkfWPeXHyEMi7EzbUZ1l4bT1/aBYRLWjX1XM9o6fEdeyvanbty2fq0Bnog4hN+xpvkZg+4KP3OWFiKx8dgKe3oo32CnDqUsaNJCm+Sxno/ceLvQf370lWpZ+EIj9F80YqBAEFp654s76/y/Nrm5FZOU2FHNVktBosbZPMg8z90ij9xYp/QzwgFFVlQ8ZviG+8UNx6n8jvIrYjq8mxz4zlXDrQ/9ZTuARre8okKZgDfHEpJlNLC80rTb18yuiCaXVpjBc2Lqwf1L9ouFbL0d2Y8GS9d3e2Zsfnfuk+bEeGNrg188u9qdZWc4HWZk9S51dEvbIEdsPZH72doJkX89ML29/Di9l2wQv7QhSLR/Lt9rg3ArbHXZmgN2KV1eVBRM3KlsbJlvpbrzWQRxJXtUOd0wGv03IeSsru0qVT6FRBEGh82ROxMX7AOPomtqmVzrMCLXEyv1Qh19XTJ++5Q2xQuOKAKiD6PxSTnGipRhOoNLCEQ7vHU5zWS3dTrWpw2m2e116QxGporiYXFGYR/GNeD+CEPJI3KuiQY0nZPFTaFnPx+sXQoj2WDGpQVVSksFKoWaTUlLQuFow9t3kBlziQYC3uz4AUw3Dmp21wiz54jc4R9y1just6svtTAsPmTqb5s7dpK7H0S+4EY96My3lssJNQqnunE3KaQj96/tUxZIpFIF8Lh9mKRfNdxJvBHCB9SxJfJToxL7G7E3yOpi+5U5kKRYrJctXmzBEh4QciADBMKJENuvrqvshcuWvfcn1Xjm2xpRfXmrIxtplUlytqQAAmOLvFBW47QWaJ348hufmiEQY0VpbpNktFmGEa57GvI/ObRN7S3ktaGg/yPguycFbDeFfTA1CvYfRx67SZmBdx/Crl37b8FfbhnLv8LhPnAYs/arKfyF74Ay460bbnSb97nhvdT95qZdvYHYjVqeUk8noiU8eTF0sWCoYfdDeBt5pwocsmx25Y4aNRkiJqzFVDxhKjodMHd/I8PFhgNJ5qc49l5TlE/vCtmJfrKs3416a5ReZ5y5K2e9f3nn4LBzys5NVNeRKT6ITWUI35RaoShk6JiOVDETrehbOgluIpA/NfyjFdnsbCKhGqdZfjIho8nv0Z0zOlRitTaiMjIRT6E1jzRZ9Y0/DvrQSCZNCdXQRNC3NbpGktkWP+JwVxGVx3KMUuUOwbdaHUkSXsgTwWjkbzyOPLD6y09k5JFwxncPEYs/FVXxYQVlYK1k4VfLCKavzMzhxOZMrLsWVCku5TGF50aE3ckyPkQsUdEWHNXBjdkF+EU9FiTYpyb4sbMW7OZRCOqWQU0p2CSPhP9N219BwQw4meKHwhKLXy5e1tU9NymEb2JNKXweL0VKm0uFn4RtSVam0FC9XEMYTT0lMWFNEfDetxr9/xFvyYdvYFWtXGgVwWdHVSglN9+3iSEdiDABdIIlnbOqoIaZ3CMytJbQ6gqBin41QUUovYwmZCF0SqdQAjQHRUiiA5dQALxJlChjE0xHuaCSrgGBo9NSR0tv5/1oIUa3fP95Z9mHH2GUL/iJWXJijxpIIWipBWL7PRiCWUeCYL5NXnR88fwxAlaGzRALWvHn0nfSJqo+7CT10P+Rh6BFmdYCmKpPmT4W4iZrETAYiHvGtiKRvzQhcrrVCu7DvyMXEWSoCDwA3WMiRlXmNGokC43v9Tj7zW0KtP7hOeLRbbEBSvq3R1dHkcrUd4o2wOLzzLZ07mbdRvTTqm5uTvhIx/W0YWANKvZ80Gv7pOPK+ieGv2vmdfytmuzL84cJXx2jmbso9Epq7VCYqznZFgT0uEUNoI7BuKEt4fqGvyTvf29Vrd8EgBmBCnAwHocVd8wBeS+uz88/RVQ/NWBp91fpMgp/WE3t+/k4ZIc5yf/WDpWFrog7QBGiCFR0MTtL1wRdZGzzPi8Es/LOXtV0BSBORTbUhwNNmJ1IJbXIuoe2+gcVHPIj+x9J6A4OTEAy+2I8yrLYnJpl5ZRPTwTSdGZzkyMEXVTZ4XrkZFj88MgNpSJAJLUF2Q2GVkOueVaek1nXQh3kA0IOTlDv4Ivzz56k7bgDW+mTmMmuuk8gpRcXpRbqUhdxuOINl190mWR+R929EezyVdLQl7poQdIY1X/E8GyM9nldFMp3wWn5YnX+RnOMGmL91L8n6wwsoJi8SAaQ0EeCOKl4Q247sTyfxSSDD6kxkhOh3SYPLYcTdL+TdcqoWn40RcQvNUiFFwvRN7XeGq9wLrwBS2oX8WFdnBAl3sjHYNf8l3Feul/SsM5993W5Lw9m09l0a9RLCSmIHIvOwgzOPOiDzpl3lY/AQfgIl5G0Fg2SrIfHZzS0t9TFJ6feSMp2U/TQp921S/v2kws9FxR/a0AvrwV4TQV/0AAq0oZZAkYsA5HUA8gYAeQGA8z9fxBgggZkoCu6j00faHUEb7Hb3b23134AjdM9WjmPATmqKXWPtUo+VgHHAWGmYeQXoLV12cW43VSYuzhw7VWRemVxHT56oOd0eUTcTi4Bewk+cG7LtVKIiRi36gtRwnAr3AKo3DkY+XerFyZW6XqlcaYNEhcA5VHragVQAsicBuQUF31MeGCog8Miheowza3k9DiEzMcZyP6GSj1NZUInnmXMDlvPUKACXgUq8L18HIN8BmXXJa+sxIb2RsLQBgYdsQLO12F7Jg7TRcdikX1vOm1OCg2ZBsu3fUwLIAL85iOj3q9LlPRXBj87REXacNcpepmXmrbJpKKM+mOThaQfEdwcKwDBQodfNDS55de8cEb0yu98RWSD6iwsju3/VrR6MeIj92TURjVp/sq3Y2AL5dET1Zv/v7KwkjHD69tm9ki51lWugQ6eO9zNArkEvAURiVIr02ZNqFs2aegkIQdoazpHnKXaoWddVHMES3etsGRB6mXXvdFFU87Sr1wmZtvXwCoH99t/Xabi2CTT6OHxbh3RdZtZusUOcJO3nn7VAleGtYndLuIObYtIJ4Rx6YpygqhrR1qdnA0BJVWpm5cnLzM0yWE2l7b0xslsmCkOEuJLTAAyvmolqV7diDdYcXUDRqfX840vWer6sN7t9WWfPdqvTU1d44Ek8c1cVTth9PQTn/tnhDVWcRepgnBiLctM31Q1fuaRPbDfcMpfLcLs8Co8D466Bp0zQHlijNDphJ9r6bi0soQ85X6RdQjBXBLWNUf3QJGfBR6eRWam4iGCY5934h72zUwXmVu6x306hiqZrOGcAc6OqSwX+W6AdEQwpLZi2TlIHYhfczJfEGicRvKSIKfnEFiBXSWLr9SHol43z7QthsSMEWG1rpPEtLQZOh35SrnqleFVaFl0gREamYBpQTbW9p++5nMdZBgYfksFmDVAfuBhOTvIcNHTPvfV4syU5FyrqxlZz2dlgzggPeTLZcp0Cm4ExnJ8LAe6nr17fZqqjJzAmHZRGXx2W9mB3wcQkFyiUFoM/qFWWKHWq1wP9UQouQMXbTSXebHZ3C0y+EuyYT+5EJrUfxQ8eZE+ePz/c87O9vcxX4Qnm9I4NzTALnXpTYvLwxsOvTkxUyh8qCIaSIxJ0ZxrfO1PNMnCIkzqi/RlT6QQtPYv6sk/pCcAyK40BXGHJQHJxlAEbbG6PUwmyJWgdx1ssmR9IhwNaWeEcqFdjcgMV8zD6oPU0uezjQqNEJ1Y4So5BQoBDx0UZxRgvs7VtKjG5ws2JT9uYfE8LY754CgH62ZTwrhjry0gBvPPXbexlHrNFESMs2pVep8ynT59c5yNvT4dtrJKOWwjGqjakeo9HiNnMmDrDKSOw2zWQVGDMurKsJsEWpyb1hOZTI6LMnM5SH1DZOHlJyIrgRhTrcgVYrIRATkzrscw1SlgAbKmk0UEB3QsPeVWRhpA9bMagUDKRM/1zADDRxAnlP6gAhMrnJsmmjzBwEWWdipROT5GmxvfjGHhhcMO+VDWK8n2Hg3u6Bkg7Qik3m8atbligYk08Y47CZAN6j0dnMIDVqW0mU+WAo8XzPtuxJxY0hJMTNilaeQppKAbgxuL3SGWURpH/5IB8/KTfnq0Lvdu9842nKFPvtl0ddm0UgqeexGi9XhNNDKgF7o+t9g0emaIjQbVubrYWFVHC+P5CbiftEdzA7onMjaMDA0woDg9CvL9GIa6vS85NnWn2xUN0zbnBnZDoRoZiGEYsL+8BqNEhEV2a2BBmmYMpfUTs9zAAxlFoUxS7OYlOi+jgwIPpUqnNBnkUG/S21U1UYFHQSCCe0f8efF7s6y0dxtAgDd5j75dZY3LGLirqO3OzcY8MjjoTvmCRJJw72atOGcFHNH2TKl9huUc0UKZejYMVcaLzgqXzlbuwjWjsqCFqTwfp5aWnLcPrmyjcCOp2LCunqsa51dkRWYQ+jiA7KW3W1K7q/jGUyv1yXElm1DaaOEd0mgTMzNX3Arxot1ZOG+LiqoJm6rnwDbB2rRS0LGTb7QfTRpRGADtK0yQRjrMDwK4wTJ+4vHZjs9tBvOr4mX3ohF3PVzNuAx4ONialstRaxiqUEsJKrC6ApVpLJ97Y8mYAC/5eEbNg4b2n94JKh10eR/YsoaIIKsILAmwzerLqkKAz79ec71RS+bDbh+HQME1WXQWBEMCuS1YY0uEMzInxYwEwUSHj0tj1TcEJLqbIKhvQmZTAi+jf7hCTBHTKg1sqOfin6nnBc8uaZ/KYATpTegfP+IsTxmi1c2xQCW1ba4BN2TCAX1b+CXfbC20dIYe9XaCjqTPC0S6th7X8R8mIaiVkPkOsUwkwa172ZFlV/W0zS9rpE79CG2MtIvxCP8Hd/2a+YcgwmMYwDRiAmrwSQPVaj01BWqsKbIzC3F4XltWScQzrjT9y3ISx72+gutxXYwfFwiRg7I9ul6UP65ozadKuoBTvDWHxKIuuq0cs/xleBqqdNyN9GCB0EOzYAtKZmGGuC8V6vTFNYKUVypWmCgST1lvG2L9KHlheeEHaYQPTNC48+XbxxUMsWKLaSEtuvGUGXFZo8dXjj49ru8KJ31zCwAC2mUUl5w0RdQ2cDGYaC/HiyijdeTPSr44QOlKWw5xqOS1E2nNQ7m1Dgmftv9xhSoguTFSdc+V0503Pi0p/9RhajjSuXPyvR7F3im52uw/z3K8wVS9e+MZC3fvmzXu+0zRXr1p2VrWD5V3MXFrdeVPpLx9BqyWqcwtNj/r5Lg137wqH526i99b2RwWcerayFK3KzeSw5N/OTe6xDs4+3ruNtNBBx3lUO99Q86X3YQb5xtnlwUIw40cGS0wzt722sWo+6ERNZjSq82akHy8g60iEk0gvjorCw6TV8YjXBi1LKgO6xesh/zsZCc+j7WBSppym7W0kaExTYBec1vrlscbFHqaXUQTsiYWm8OCBpel8sXCc9QHVN69xkVM5JaVrVodtMv9PgfuQSlL0uLBSvwPPVxtK1AX8J7ZFyUpktkTZidP+Ge+Zl5ejsM0oh9ELzOlTYK6T+YybJcevq0rXyuIADWPQwmI029XnWa3lbBfQmyTjKEVMrewBZ12HlJC4O20QgRjWSY/Hh8ejsduw5P12CxaORpdnfPalPE/hj8ZLg0D1hRh0SgAtZGxYoburcsdCz54rWwssDsEyBr845vyWc9J1WFUKlvplYjCpoNYgT1RNknP1S6X0xe4cibe1fsBl3hmLyOb0SujKk1QDHtSr5QAwmAtP49C4YViCX7ZhzbJFY/DTZBc6evZ+z2W6X+E6lu09lYjSyk6sBkFryCXUPz+VnU3X+wrdxx8+0JTu1MeAZVWOc8rXTx7q9BUl+zQg7Wil2m8rr7vujt23fJqbVQV/JvOHAAcmuAkfBrVVVCJWl3iVA395uKgRnWYKXSg3NyricUR7ZSHQTwiCt8/+rf5qP//feAMEk/1vdS74uAm2/OL2nf1XdfnzbbdXZIEA0wDU+P+Z8FfeFBhLW31+vOM2+nm1VV7lLMPeyj6da4B+iPO01LFJBjvHfnorBEfN8dTOeNi5QzOEe1lDpf72i86BbATQ97XuzjrJGNLtBYsNMAG74lw8gvfrwygjtlrLqaoWv80Ip31cIjLTuyyv4pfT1FWAO6pqxM18xfRXxBJgvSZrzu8me4TuNI1JfKpTnQvReBbg51HNKUss0IpNjlYkPXmE02OZp2nYtSkCTia1V+zba77GQ99+ZJbjGertZAPpJZfgbIcSHYT4QwmOv4Q6q2VSq7uyBYrRdsDmQryHbHR1/IIyKptlTm6hb+U7Ovt5EQ/e3Rxg57ExRlAdJSHu9kyMtWWU9XPPo5ChlvN8T/TOZW/YWk0GD1u9P2QEUqoM+mHFG3Zkgq6OfkI8yWAcxTO/nAk5fpkgcz0iSQwXKW0P3mlxVsqaRSPAgDrbiyYZ+iiTcycWq6uMjv2MDzuYEd735O6ox0ZFl4wA5I8oQASHKgAnRMHHIEddRY0gogEwqvHsmP/K3UkboxY0yB9RgAgOZQl70RYgB3VlPoKIBsCowMM2dMrsCnm8om58ISQk+ahoYRBMyYUnb+Iu5GkEsgJIbwPZetttvki6eTPCe1uBALeHKNDXcUpChgpb4sn2xCS8uX0ysBuKKGcEWV6kruET+G3/yQQAnS/25q0AnK+9sMfyquK79TPZ1zf7m1JgSybz0DshELqfswjIf2dMkGkUlEtnpAIoL98PHCPwL0kEq0nbHm9uTchs2NHGtQzqZ8kAgEWw5vyQuE5OsnDAc2wZr2NPyQQHYi7m41mcpKrmPwBaKDumEmmSQINADCOaALHj+jyQQADW0nWdz2313FcB10BIMHwNAjynrkFizuI1KGA2r0EjL9I1GEgiX03AXH4vAgGwRsXXQACnOo3i5kDyZ6rjqSlC0DA0ookhlTiYhMEgARhTjG0I47PDoaE7MS6jCL0JRMbX0IO4Ocka6eCCkEqiS8Zex1FKm4lWGdOFFIzWchhMkmZqQRgSXFVkgrqMLrUIQjlykVFxGI8RvJ4Xv3c0nQakC7VAImB+3GCGIcYXWUuccZfOF5Ev9lYYoGNPUUr6FehEM1taBvPfEU7RNdujgQ6WVsd0pQ25ZISDSDIsanbHCVf8Tcgv/U2H7Gu3DB3JGnoRGsnEiwzc15CA/tq+RAumgL0neHTXfXgP7/3//qrHb3fwU0ZVCcGyxq/3G7tRvD/9Rs4SXs86Q3HiOTt4iv35+sPgZg33m9A/wvqGiJu1pWeGZM+WLi/L5yNeHyPdl8Kph9XuIR43aXNHcejq4cDFSHSRZgcPu45fcQ7SgBHj9J3OcUOUM4B1u/artbFqbH61VY0qq++wxg1h1hRmFh4k1EIslh2MLTKMTNZvaCJGs28w5wy90dcZ1dAafI0WY6/WV+mtn1J/xV83Rx4gnR1VVWf4qHyJKuznpeqhqPaFmraOQMPiq43IKm8+V4HBkRtsic+SZH26bNyPISN06YPQIlH4vXn4vDU4HdbNZu3BahALO5bFv0azqQbTqujzGWEUGWEQcqDX5qHTCqAVEoyaoafyQqUT8DtKwQoUICh+CjKJDVKJFBI+STUK0Ra4+NG26DqGv3qe0M+n3zWuVJeNk8wnF3zuDw8dTDYPbUwOso3s2HqzsZrRXjO+f2hvsn1oa5ItqeZRtpdtZf+pv4bBv6feqL+g6X+Fscr8QzuT9UNrk51sLTumN2urjlit67ubuIK/q4btl279YhT+1BnwSyVTd0QPCjinbUOzOHMJ8Wf27Y8f0FXr43fqfmZwbfCJKBk8MCw2VvtI7f6cSX7koGGfVp6wsDy7YPeAB2s9yFJwqJVi+7bhUXSXYyjb2VNFVfRAnQIAAAA="; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,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": -/*!*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,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 ***! - \*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "data:font/woff2;charset=utf-8;base64,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": -/*!*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** data:font/woff2;charset=utf-8;base64,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 ***! - \*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = "data:font/woff2;charset=utf-8;base64,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"; - -/***/ }), - -/***/ "./node_modules/@firebase/app/dist/esm/index.esm2017.js": -/*!**************************************************************!*\ - !*** ./node_modules/@firebase/app/dist/esm/index.esm2017.js ***! - \**************************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "FirebaseError": () => (/* reexport safe */ _firebase_util__WEBPACK_IMPORTED_MODULE_2__.FirebaseError), -/* harmony export */ "SDK_VERSION": () => (/* binding */ SDK_VERSION), -/* harmony export */ "_DEFAULT_ENTRY_NAME": () => (/* binding */ DEFAULT_ENTRY_NAME), -/* harmony export */ "_addComponent": () => (/* binding */ _addComponent), -/* harmony export */ "_addOrOverwriteComponent": () => (/* binding */ _addOrOverwriteComponent), -/* harmony export */ "_apps": () => (/* binding */ _apps), -/* harmony export */ "_clearComponents": () => (/* binding */ _clearComponents), -/* harmony export */ "_components": () => (/* binding */ _components), -/* harmony export */ "_getProvider": () => (/* binding */ _getProvider), -/* harmony export */ "_registerComponent": () => (/* binding */ _registerComponent), -/* harmony export */ "_removeServiceInstance": () => (/* binding */ _removeServiceInstance), -/* harmony export */ "deleteApp": () => (/* binding */ deleteApp), -/* harmony export */ "getApp": () => (/* binding */ getApp), -/* harmony export */ "getApps": () => (/* binding */ getApps), -/* harmony export */ "initializeApp": () => (/* binding */ initializeApp), -/* harmony export */ "onLog": () => (/* binding */ onLog), -/* harmony export */ "registerVersion": () => (/* binding */ registerVersion), -/* harmony export */ "setLogLevel": () => (/* binding */ setLogLevel) -/* harmony export */ }); -/* harmony import */ var _firebase_component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @firebase/component */ "./node_modules/@firebase/component/dist/esm/index.esm2017.js"); -/* harmony import */ var _firebase_logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @firebase/logger */ "./node_modules/@firebase/logger/dist/esm/index.esm2017.js"); -/* harmony import */ var _firebase_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @firebase/util */ "./node_modules/@firebase/util/dist/index.esm2017.js"); - - - - - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -class PlatformLoggerServiceImpl { - constructor(container) { - this.container = container; - } - // In initial implementation, this will be called by installations on - // auth token refresh, and installations will send this string. - getPlatformInfoString() { - const providers = this.container.getProviders(); - // Loop through providers and get library/version pairs from any that are - // version components. - return providers - .map(provider => { - if (isVersionServiceProvider(provider)) { - const service = provider.getImmediate(); - return `${service.library}/${service.version}`; - } - else { - return null; - } - }) - .filter(logString => logString) - .join(' '); - } -} -/** - * - * @param provider check if this provider provides a VersionService - * - * NOTE: Using Provider<'app-version'> is a hack to indicate that the provider - * provides VersionService. The provider is not necessarily a 'app-version' - * provider. - */ -function isVersionServiceProvider(provider) { - const component = provider.getComponent(); - return (component === null || component === void 0 ? void 0 : component.type) === "VERSION" /* VERSION */; -} - -const name$o = "@firebase/app"; -const version$1 = "0.7.19"; - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const logger = new _firebase_logger__WEBPACK_IMPORTED_MODULE_1__.Logger('@firebase/app'); - -const name$n = "@firebase/app-compat"; - -const name$m = "@firebase/analytics-compat"; - -const name$l = "@firebase/analytics"; - -const name$k = "@firebase/app-check-compat"; - -const name$j = "@firebase/app-check"; - -const name$i = "@firebase/auth"; - -const name$h = "@firebase/auth-compat"; - -const name$g = "@firebase/database"; - -const name$f = "@firebase/database-compat"; - -const name$e = "@firebase/functions"; - -const name$d = "@firebase/functions-compat"; - -const name$c = "@firebase/installations"; - -const name$b = "@firebase/installations-compat"; - -const name$a = "@firebase/messaging"; - -const name$9 = "@firebase/messaging-compat"; - -const name$8 = "@firebase/performance"; - -const name$7 = "@firebase/performance-compat"; - -const name$6 = "@firebase/remote-config"; - -const name$5 = "@firebase/remote-config-compat"; - -const name$4 = "@firebase/storage"; - -const name$3 = "@firebase/storage-compat"; - -const name$2 = "@firebase/firestore"; - -const name$1 = "@firebase/firestore-compat"; - -const name = "firebase"; -const version = "9.6.9"; - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * The default app name - * - * @internal - */ -const DEFAULT_ENTRY_NAME = '[DEFAULT]'; -const PLATFORM_LOG_STRING = { - [name$o]: 'fire-core', - [name$n]: 'fire-core-compat', - [name$l]: 'fire-analytics', - [name$m]: 'fire-analytics-compat', - [name$j]: 'fire-app-check', - [name$k]: 'fire-app-check-compat', - [name$i]: 'fire-auth', - [name$h]: 'fire-auth-compat', - [name$g]: 'fire-rtdb', - [name$f]: 'fire-rtdb-compat', - [name$e]: 'fire-fn', - [name$d]: 'fire-fn-compat', - [name$c]: 'fire-iid', - [name$b]: 'fire-iid-compat', - [name$a]: 'fire-fcm', - [name$9]: 'fire-fcm-compat', - [name$8]: 'fire-perf', - [name$7]: 'fire-perf-compat', - [name$6]: 'fire-rc', - [name$5]: 'fire-rc-compat', - [name$4]: 'fire-gcs', - [name$3]: 'fire-gcs-compat', - [name$2]: 'fire-fst', - [name$1]: 'fire-fst-compat', - 'fire-js': 'fire-js', - [name]: 'fire-js-all' -}; - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @internal - */ -const _apps = new Map(); -/** - * Registered components. - * - * @internal - */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const _components = new Map(); -/** - * @param component - the component being added to this app's container - * - * @internal - */ -function _addComponent(app, component) { - try { - app.container.addComponent(component); - } - catch (e) { - logger.debug(`Component ${component.name} failed to register with FirebaseApp ${app.name}`, e); - } -} -/** - * - * @internal - */ -function _addOrOverwriteComponent(app, component) { - app.container.addOrOverwriteComponent(component); -} -/** - * - * @param component - the component to register - * @returns whether or not the component is registered successfully - * - * @internal - */ -function _registerComponent(component) { - const componentName = component.name; - if (_components.has(componentName)) { - logger.debug(`There were multiple attempts to register component ${componentName}.`); - return false; - } - _components.set(componentName, component); - // add the component to existing app instances - for (const app of _apps.values()) { - _addComponent(app, component); - } - return true; -} -/** - * - * @param app - FirebaseApp instance - * @param name - service name - * - * @returns the provider for the service with the matching name - * - * @internal - */ -function _getProvider(app, name) { - const heartbeatController = app.container - .getProvider('heartbeat') - .getImmediate({ optional: true }); - if (heartbeatController) { - void heartbeatController.triggerHeartbeat(); - } - return app.container.getProvider(name); -} -/** - * - * @param app - FirebaseApp instance - * @param name - service name - * @param instanceIdentifier - service instance identifier in case the service supports multiple instances - * - * @internal - */ -function _removeServiceInstance(app, name, instanceIdentifier = DEFAULT_ENTRY_NAME) { - _getProvider(app, name).clearInstance(instanceIdentifier); -} -/** - * Test only - * - * @internal - */ -function _clearComponents() { - _components.clear(); -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const ERRORS = { - ["no-app" /* NO_APP */]: "No Firebase App '{$appName}' has been created - " + - 'call Firebase App.initializeApp()', - ["bad-app-name" /* BAD_APP_NAME */]: "Illegal App name: '{$appName}", - ["duplicate-app" /* DUPLICATE_APP */]: "Firebase App named '{$appName}' already exists with different options or config", - ["app-deleted" /* APP_DELETED */]: "Firebase App named '{$appName}' already deleted", - ["invalid-app-argument" /* INVALID_APP_ARGUMENT */]: 'firebase.{$appName}() takes either no argument or a ' + - 'Firebase App instance.', - ["invalid-log-argument" /* INVALID_LOG_ARGUMENT */]: 'First argument to `onLog` must be null or a function.', - ["storage-open" /* STORAGE_OPEN */]: 'Error thrown when opening storage. Original error: {$originalErrorMessage}.', - ["storage-get" /* STORAGE_GET */]: 'Error thrown when reading from storage. Original error: {$originalErrorMessage}.', - ["storage-set" /* STORAGE_WRITE */]: 'Error thrown when writing to storage. Original error: {$originalErrorMessage}.', - ["storage-delete" /* STORAGE_DELETE */]: 'Error thrown when deleting from storage. Original error: {$originalErrorMessage}.' -}; -const ERROR_FACTORY = new _firebase_util__WEBPACK_IMPORTED_MODULE_2__.ErrorFactory('app', 'Firebase', ERRORS); - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -class FirebaseAppImpl { - constructor(options, config, container) { - this._isDeleted = false; - this._options = Object.assign({}, options); - this._config = Object.assign({}, config); - this._name = config.name; - this._automaticDataCollectionEnabled = - config.automaticDataCollectionEnabled; - this._container = container; - this.container.addComponent(new _firebase_component__WEBPACK_IMPORTED_MODULE_0__.Component('app', () => this, "PUBLIC" /* PUBLIC */)); - } - get automaticDataCollectionEnabled() { - this.checkDestroyed(); - return this._automaticDataCollectionEnabled; - } - set automaticDataCollectionEnabled(val) { - this.checkDestroyed(); - this._automaticDataCollectionEnabled = val; - } - get name() { - this.checkDestroyed(); - return this._name; - } - get options() { - this.checkDestroyed(); - return this._options; - } - get config() { - this.checkDestroyed(); - return this._config; - } - get container() { - return this._container; - } - get isDeleted() { - return this._isDeleted; - } - set isDeleted(val) { - this._isDeleted = val; - } - /** - * This function will throw an Error if the App has already been deleted - - * use before performing API actions on the App. - */ - checkDestroyed() { - if (this.isDeleted) { - throw ERROR_FACTORY.create("app-deleted" /* APP_DELETED */, { appName: this._name }); - } - } -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * The current SDK version. - * - * @public - */ -const SDK_VERSION = version; -function initializeApp(options, rawConfig = {}) { - if (typeof rawConfig !== 'object') { - const name = rawConfig; - rawConfig = { name }; - } - const config = Object.assign({ name: DEFAULT_ENTRY_NAME, automaticDataCollectionEnabled: false }, rawConfig); - const name = config.name; - if (typeof name !== 'string' || !name) { - throw ERROR_FACTORY.create("bad-app-name" /* BAD_APP_NAME */, { - appName: String(name) - }); - } - const existingApp = _apps.get(name); - if (existingApp) { - // return the existing app if options and config deep equal the ones in the existing app. - if ((0,_firebase_util__WEBPACK_IMPORTED_MODULE_2__.deepEqual)(options, existingApp.options) && - (0,_firebase_util__WEBPACK_IMPORTED_MODULE_2__.deepEqual)(config, existingApp.config)) { - return existingApp; - } - else { - throw ERROR_FACTORY.create("duplicate-app" /* DUPLICATE_APP */, { appName: name }); - } - } - const container = new _firebase_component__WEBPACK_IMPORTED_MODULE_0__.ComponentContainer(name); - for (const component of _components.values()) { - container.addComponent(component); - } - const newApp = new FirebaseAppImpl(options, config, container); - _apps.set(name, newApp); - return newApp; -} -/** - * Retrieves a {@link @firebase/app#FirebaseApp} instance. - * - * When called with no arguments, the default app is returned. When an app name - * is provided, the app corresponding to that name is returned. - * - * An exception is thrown if the app being retrieved has not yet been - * initialized. - * - * @example - * ```javascript - * // Return the default app - * const app = getApp(); - * ``` - * - * @example - * ```javascript - * // Return a named app - * const otherApp = getApp("otherApp"); - * ``` - * - * @param name - Optional name of the app to return. If no name is - * provided, the default is `"[DEFAULT]"`. - * - * @returns The app corresponding to the provided app name. - * If no app name is provided, the default app is returned. - * - * @public - */ -function getApp(name = DEFAULT_ENTRY_NAME) { - const app = _apps.get(name); - if (!app) { - throw ERROR_FACTORY.create("no-app" /* NO_APP */, { appName: name }); - } - return app; -} -/** - * A (read-only) array of all initialized apps. - * @public - */ -function getApps() { - return Array.from(_apps.values()); -} -/** - * Renders this app unusable and frees the resources of all associated - * services. - * - * @example - * ```javascript - * deleteApp(app) - * .then(function() { - * console.log("App deleted successfully"); - * }) - * .catch(function(error) { - * console.log("Error deleting app:", error); - * }); - * ``` - * - * @public - */ -async function deleteApp(app) { - const name = app.name; - if (_apps.has(name)) { - _apps.delete(name); - await Promise.all(app.container - .getProviders() - .map(provider => provider.delete())); - app.isDeleted = true; - } -} -/** - * Registers a library's name and version for platform logging purposes. - * @param library - Name of 1p or 3p library (e.g. firestore, angularfire) - * @param version - Current version of that library. - * @param variant - Bundle variant, e.g., node, rn, etc. - * - * @public - */ -function registerVersion(libraryKeyOrName, version, variant) { - var _a; - // TODO: We can use this check to whitelist strings when/if we set up - // a good whitelist system. - let library = (_a = PLATFORM_LOG_STRING[libraryKeyOrName]) !== null && _a !== void 0 ? _a : libraryKeyOrName; - if (variant) { - library += `-${variant}`; - } - const libraryMismatch = library.match(/\s|\//); - const versionMismatch = version.match(/\s|\//); - if (libraryMismatch || versionMismatch) { - const warning = [ - `Unable to register library "${library}" with version "${version}":` - ]; - if (libraryMismatch) { - warning.push(`library name "${library}" contains illegal characters (whitespace or "/")`); - } - if (libraryMismatch && versionMismatch) { - warning.push('and'); - } - if (versionMismatch) { - warning.push(`version name "${version}" contains illegal characters (whitespace or "/")`); - } - logger.warn(warning.join(' ')); - return; - } - _registerComponent(new _firebase_component__WEBPACK_IMPORTED_MODULE_0__.Component(`${library}-version`, () => ({ library, version }), "VERSION" /* VERSION */)); -} -/** - * Sets log handler for all Firebase SDKs. - * @param logCallback - An optional custom log handler that executes user code whenever - * the Firebase SDK makes a logging call. - * - * @public - */ -function onLog(logCallback, options) { - if (logCallback !== null && typeof logCallback !== 'function') { - throw ERROR_FACTORY.create("invalid-log-argument" /* INVALID_LOG_ARGUMENT */); - } - (0,_firebase_logger__WEBPACK_IMPORTED_MODULE_1__.setUserLogHandler)(logCallback, options); -} -/** - * Sets log level for all Firebase SDKs. - * - * All of the log types above the current log level are captured (i.e. if - * you set the log level to `info`, errors are logged, but `debug` and - * `verbose` logs are not). - * - * @public - */ -function setLogLevel(logLevel) { - (0,_firebase_logger__WEBPACK_IMPORTED_MODULE_1__.setLogLevel)(logLevel); -} - -/** - * @license - * Copyright 2021 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const DB_NAME = 'firebase-heartbeat-database'; -const DB_VERSION = 1; -const STORE_NAME = 'firebase-heartbeat-store'; -let dbPromise = null; -function getDbPromise() { - if (!dbPromise) { - dbPromise = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_2__.openDB)(DB_NAME, DB_VERSION, (db, oldVersion) => { - // We don't use 'break' in this switch statement, the fall-through - // behavior is what we want, because if there are multiple versions between - // the old version and the current version, we want ALL the migrations - // that correspond to those versions to run, not only the last one. - // eslint-disable-next-line default-case - switch (oldVersion) { - case 0: - db.createObjectStore(STORE_NAME); - } - }).catch(e => { - throw ERROR_FACTORY.create("storage-open" /* STORAGE_OPEN */, { - originalErrorMessage: e.message - }); - }); - } - return dbPromise; -} -async function readHeartbeatsFromIndexedDB(app) { - try { - const db = await getDbPromise(); - return db - .transaction(STORE_NAME) - .objectStore(STORE_NAME) - .get(computeKey(app)); - } - catch (e) { - throw ERROR_FACTORY.create("storage-get" /* STORAGE_GET */, { - originalErrorMessage: e.message - }); - } -} -async function writeHeartbeatsToIndexedDB(app, heartbeatObject) { - try { - const db = await getDbPromise(); - const tx = db.transaction(STORE_NAME, 'readwrite'); - const objectStore = tx.objectStore(STORE_NAME); - await objectStore.put(heartbeatObject, computeKey(app)); - return tx.complete; - } - catch (e) { - throw ERROR_FACTORY.create("storage-set" /* STORAGE_WRITE */, { - originalErrorMessage: e.message - }); - } -} -function computeKey(app) { - return `${app.name}!${app.options.appId}`; -} - -/** - * @license - * Copyright 2021 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const MAX_HEADER_BYTES = 1024; -// 30 days -const STORED_HEARTBEAT_RETENTION_MAX_MILLIS = 30 * 24 * 60 * 60 * 1000; -class HeartbeatServiceImpl { - constructor(container) { - this.container = container; - /** - * In-memory cache for heartbeats, used by getHeartbeatsHeader() to generate - * the header string. - * Stores one record per date. This will be consolidated into the standard - * format of one record per user agent string before being sent as a header. - * Populated from indexedDB when the controller is instantiated and should - * be kept in sync with indexedDB. - * Leave public for easier testing. - */ - this._heartbeatsCache = null; - const app = this.container.getProvider('app').getImmediate(); - this._storage = new HeartbeatStorageImpl(app); - this._heartbeatsCachePromise = this._storage.read().then(result => { - this._heartbeatsCache = result; - return result; - }); - } - /** - * Called to report a heartbeat. The function will generate - * a HeartbeatsByUserAgent object, update heartbeatsCache, and persist it - * to IndexedDB. - * Note that we only store one heartbeat per day. So if a heartbeat for today is - * already logged, subsequent calls to this function in the same day will be ignored. - */ - async triggerHeartbeat() { - const platformLogger = this.container - .getProvider('platform-logger') - .getImmediate(); - // This is the "Firebase user agent" string from the platform logger - // service, not the browser user agent. - const agent = platformLogger.getPlatformInfoString(); - const date = getUTCDateString(); - if (this._heartbeatsCache === null) { - this._heartbeatsCache = await this._heartbeatsCachePromise; - } - // Do not store a heartbeat if one is already stored for this day - // or if a header has already been sent today. - if (this._heartbeatsCache.lastSentHeartbeatDate === date || - this._heartbeatsCache.heartbeats.some(singleDateHeartbeat => singleDateHeartbeat.date === date)) { - return; - } - else { - // There is no entry for this date. Create one. - this._heartbeatsCache.heartbeats.push({ date, agent }); - } - // Remove entries older than 30 days. - this._heartbeatsCache.heartbeats = this._heartbeatsCache.heartbeats.filter(singleDateHeartbeat => { - const hbTimestamp = new Date(singleDateHeartbeat.date).valueOf(); - const now = Date.now(); - return now - hbTimestamp <= STORED_HEARTBEAT_RETENTION_MAX_MILLIS; - }); - return this._storage.overwrite(this._heartbeatsCache); - } - /** - * Returns a base64 encoded string which can be attached to the heartbeat-specific header directly. - * It also clears all heartbeats from memory as well as in IndexedDB. - * - * NOTE: Consuming product SDKs should not send the header if this method - * returns an empty string. - */ - async getHeartbeatsHeader() { - if (this._heartbeatsCache === null) { - await this._heartbeatsCachePromise; - } - // If it's still null or the array is empty, there is no data to send. - if (this._heartbeatsCache === null || - this._heartbeatsCache.heartbeats.length === 0) { - return ''; - } - const date = getUTCDateString(); - // Extract as many heartbeats from the cache as will fit under the size limit. - const { heartbeatsToSend, unsentEntries } = extractHeartbeatsForHeader(this._heartbeatsCache.heartbeats); - const headerString = (0,_firebase_util__WEBPACK_IMPORTED_MODULE_2__.base64urlEncodeWithoutPadding)(JSON.stringify({ version: 2, heartbeats: heartbeatsToSend })); - // Store last sent date to prevent another being logged/sent for the same day. - this._heartbeatsCache.lastSentHeartbeatDate = date; - if (unsentEntries.length > 0) { - // Store any unsent entries if they exist. - this._heartbeatsCache.heartbeats = unsentEntries; - // This seems more likely than emptying the array (below) to lead to some odd state - // since the cache isn't empty and this will be called again on the next request, - // and is probably safest if we await it. - await this._storage.overwrite(this._heartbeatsCache); - } - else { - this._heartbeatsCache.heartbeats = []; - // Do not wait for this, to reduce latency. - void this._storage.overwrite(this._heartbeatsCache); - } - return headerString; - } -} -function getUTCDateString() { - const today = new Date(); - // Returns date format 'YYYY-MM-DD' - return today.toISOString().substring(0, 10); -} -function extractHeartbeatsForHeader(heartbeatsCache, maxSize = MAX_HEADER_BYTES) { - // Heartbeats grouped by user agent in the standard format to be sent in - // the header. - const heartbeatsToSend = []; - // Single date format heartbeats that are not sent. - let unsentEntries = heartbeatsCache.slice(); - for (const singleDateHeartbeat of heartbeatsCache) { - // Look for an existing entry with the same user agent. - const heartbeatEntry = heartbeatsToSend.find(hb => hb.agent === singleDateHeartbeat.agent); - if (!heartbeatEntry) { - // If no entry for this user agent exists, create one. - heartbeatsToSend.push({ - agent: singleDateHeartbeat.agent, - dates: [singleDateHeartbeat.date] - }); - if (countBytes(heartbeatsToSend) > maxSize) { - // If the header would exceed max size, remove the added heartbeat - // entry and stop adding to the header. - heartbeatsToSend.pop(); - break; - } - } - else { - heartbeatEntry.dates.push(singleDateHeartbeat.date); - // If the header would exceed max size, remove the added date - // and stop adding to the header. - if (countBytes(heartbeatsToSend) > maxSize) { - heartbeatEntry.dates.pop(); - break; - } - } - // Pop unsent entry from queue. (Skipped if adding the entry exceeded - // quota and the loop breaks early.) - unsentEntries = unsentEntries.slice(1); - } - return { - heartbeatsToSend, - unsentEntries - }; -} -class HeartbeatStorageImpl { - constructor(app) { - this.app = app; - this._canUseIndexedDBPromise = this.runIndexedDBEnvironmentCheck(); - } - async runIndexedDBEnvironmentCheck() { - if (!(0,_firebase_util__WEBPACK_IMPORTED_MODULE_2__.isIndexedDBAvailable)()) { - return false; - } - else { - return (0,_firebase_util__WEBPACK_IMPORTED_MODULE_2__.validateIndexedDBOpenable)() - .then(() => true) - .catch(() => false); - } - } - /** - * Read all heartbeats. - */ - async read() { - const canUseIndexedDB = await this._canUseIndexedDBPromise; - if (!canUseIndexedDB) { - return { heartbeats: [] }; - } - else { - const idbHeartbeatObject = await readHeartbeatsFromIndexedDB(this.app); - return idbHeartbeatObject || { heartbeats: [] }; - } - } - // overwrite the storage with the provided heartbeats - async overwrite(heartbeatsObject) { - var _a; - const canUseIndexedDB = await this._canUseIndexedDBPromise; - if (!canUseIndexedDB) { - return; - } - else { - const existingHeartbeatsObject = await this.read(); - return writeHeartbeatsToIndexedDB(this.app, { - lastSentHeartbeatDate: (_a = heartbeatsObject.lastSentHeartbeatDate) !== null && _a !== void 0 ? _a : existingHeartbeatsObject.lastSentHeartbeatDate, - heartbeats: heartbeatsObject.heartbeats - }); - } - } - // add heartbeats - async add(heartbeatsObject) { - var _a; - const canUseIndexedDB = await this._canUseIndexedDBPromise; - if (!canUseIndexedDB) { - return; - } - else { - const existingHeartbeatsObject = await this.read(); - return writeHeartbeatsToIndexedDB(this.app, { - lastSentHeartbeatDate: (_a = heartbeatsObject.lastSentHeartbeatDate) !== null && _a !== void 0 ? _a : existingHeartbeatsObject.lastSentHeartbeatDate, - heartbeats: [ - ...existingHeartbeatsObject.heartbeats, - ...heartbeatsObject.heartbeats - ] - }); - } - } -} -/** - * Calculate bytes of a HeartbeatsByUserAgent array after being wrapped - * in a platform logging header JSON object, stringified, and converted - * to base 64. - */ -function countBytes(heartbeatsCache) { - // base64 has a restricted set of characters, all of which should be 1 byte. - return (0,_firebase_util__WEBPACK_IMPORTED_MODULE_2__.base64urlEncodeWithoutPadding)( - // heartbeatsCache wrapper properties - JSON.stringify({ version: 2, heartbeats: heartbeatsCache })).length; -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function registerCoreComponents(variant) { - _registerComponent(new _firebase_component__WEBPACK_IMPORTED_MODULE_0__.Component('platform-logger', container => new PlatformLoggerServiceImpl(container), "PRIVATE" /* PRIVATE */)); - _registerComponent(new _firebase_component__WEBPACK_IMPORTED_MODULE_0__.Component('heartbeat', container => new HeartbeatServiceImpl(container), "PRIVATE" /* PRIVATE */)); - // Register `app` package. - registerVersion(name$o, version$1, variant); - // BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation - registerVersion(name$o, version$1, 'esm2017'); - // Register platform SDK identifier (no version). - registerVersion('fire-js', ''); -} - -/** - * Firebase App - * - * @remarks This package coordinates the communication between the different Firebase components - * @packageDocumentation - */ -registerCoreComponents(''); - - -//# sourceMappingURL=index.esm2017.js.map - - -/***/ }), - -/***/ "./node_modules/@firebase/component/dist/esm/index.esm2017.js": -/*!********************************************************************!*\ - !*** ./node_modules/@firebase/component/dist/esm/index.esm2017.js ***! - \********************************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Component": () => (/* binding */ Component), -/* harmony export */ "ComponentContainer": () => (/* binding */ ComponentContainer), -/* harmony export */ "Provider": () => (/* binding */ Provider) -/* harmony export */ }); -/* harmony import */ var _firebase_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @firebase/util */ "./node_modules/@firebase/util/dist/index.esm2017.js"); - - -/** - * Component for service name T, e.g. `auth`, `auth-internal` - */ -class Component { - /** - * - * @param name The public service name, e.g. app, auth, firestore, database - * @param instanceFactory Service factory responsible for creating the public interface - * @param type whether the service provided by the component is public or private - */ - constructor(name, instanceFactory, type) { - this.name = name; - this.instanceFactory = instanceFactory; - this.type = type; - this.multipleInstances = false; - /** - * Properties to be added to the service namespace - */ - this.serviceProps = {}; - this.instantiationMode = "LAZY" /* LAZY */; - this.onInstanceCreated = null; - } - setInstantiationMode(mode) { - this.instantiationMode = mode; - return this; - } - setMultipleInstances(multipleInstances) { - this.multipleInstances = multipleInstances; - return this; - } - setServiceProps(props) { - this.serviceProps = props; - return this; - } - setInstanceCreatedCallback(callback) { - this.onInstanceCreated = callback; - return this; - } -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const DEFAULT_ENTRY_NAME = '[DEFAULT]'; - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Provider for instance for service name T, e.g. 'auth', 'auth-internal' - * NameServiceMapping[T] is an alias for the type of the instance - */ -class Provider { - constructor(name, container) { - this.name = name; - this.container = container; - this.component = null; - this.instances = new Map(); - this.instancesDeferred = new Map(); - this.instancesOptions = new Map(); - this.onInitCallbacks = new Map(); - } - /** - * @param identifier A provider can provide mulitple instances of a service - * if this.component.multipleInstances is true. - */ - get(identifier) { - // if multipleInstances is not supported, use the default name - const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier); - if (!this.instancesDeferred.has(normalizedIdentifier)) { - const deferred = new _firebase_util__WEBPACK_IMPORTED_MODULE_0__.Deferred(); - this.instancesDeferred.set(normalizedIdentifier, deferred); - if (this.isInitialized(normalizedIdentifier) || - this.shouldAutoInitialize()) { - // initialize the service if it can be auto-initialized - try { - const instance = this.getOrInitializeService({ - instanceIdentifier: normalizedIdentifier - }); - if (instance) { - deferred.resolve(instance); - } - } - catch (e) { - // when the instance factory throws an exception during get(), it should not cause - // a fatal error. We just return the unresolved promise in this case. - } - } - } - return this.instancesDeferred.get(normalizedIdentifier).promise; - } - getImmediate(options) { - var _a; - // if multipleInstances is not supported, use the default name - const normalizedIdentifier = this.normalizeInstanceIdentifier(options === null || options === void 0 ? void 0 : options.identifier); - const optional = (_a = options === null || options === void 0 ? void 0 : options.optional) !== null && _a !== void 0 ? _a : false; - if (this.isInitialized(normalizedIdentifier) || - this.shouldAutoInitialize()) { - try { - return this.getOrInitializeService({ - instanceIdentifier: normalizedIdentifier - }); - } - catch (e) { - if (optional) { - return null; - } - else { - throw e; - } - } - } - else { - // In case a component is not initialized and should/can not be auto-initialized at the moment, return null if the optional flag is set, or throw - if (optional) { - return null; - } - else { - throw Error(`Service ${this.name} is not available`); - } - } - } - getComponent() { - return this.component; - } - setComponent(component) { - if (component.name !== this.name) { - throw Error(`Mismatching Component ${component.name} for Provider ${this.name}.`); - } - if (this.component) { - throw Error(`Component for ${this.name} has already been provided`); - } - this.component = component; - // return early without attempting to initialize the component if the component requires explicit initialization (calling `Provider.initialize()`) - if (!this.shouldAutoInitialize()) { - return; - } - // if the service is eager, initialize the default instance - if (isComponentEager(component)) { - try { - this.getOrInitializeService({ instanceIdentifier: DEFAULT_ENTRY_NAME }); - } - catch (e) { - // when the instance factory for an eager Component throws an exception during the eager - // initialization, it should not cause a fatal error. - // TODO: Investigate if we need to make it configurable, because some component may want to cause - // a fatal error in this case? - } - } - // Create service instances for the pending promises and resolve them - // NOTE: if this.multipleInstances is false, only the default instance will be created - // and all promises with resolve with it regardless of the identifier. - for (const [instanceIdentifier, instanceDeferred] of this.instancesDeferred.entries()) { - const normalizedIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier); - try { - // `getOrInitializeService()` should always return a valid instance since a component is guaranteed. use ! to make typescript happy. - const instance = this.getOrInitializeService({ - instanceIdentifier: normalizedIdentifier - }); - instanceDeferred.resolve(instance); - } - catch (e) { - // when the instance factory throws an exception, it should not cause - // a fatal error. We just leave the promise unresolved. - } - } - } - clearInstance(identifier = DEFAULT_ENTRY_NAME) { - this.instancesDeferred.delete(identifier); - this.instancesOptions.delete(identifier); - this.instances.delete(identifier); - } - // app.delete() will call this method on every provider to delete the services - // TODO: should we mark the provider as deleted? - async delete() { - const services = Array.from(this.instances.values()); - await Promise.all([ - ...services - .filter(service => 'INTERNAL' in service) // legacy services - // eslint-disable-next-line @typescript-eslint/no-explicit-any - .map(service => service.INTERNAL.delete()), - ...services - .filter(service => '_delete' in service) // modularized services - // eslint-disable-next-line @typescript-eslint/no-explicit-any - .map(service => service._delete()) - ]); - } - isComponentSet() { - return this.component != null; - } - isInitialized(identifier = DEFAULT_ENTRY_NAME) { - return this.instances.has(identifier); - } - getOptions(identifier = DEFAULT_ENTRY_NAME) { - return this.instancesOptions.get(identifier) || {}; - } - initialize(opts = {}) { - const { options = {} } = opts; - const normalizedIdentifier = this.normalizeInstanceIdentifier(opts.instanceIdentifier); - if (this.isInitialized(normalizedIdentifier)) { - throw Error(`${this.name}(${normalizedIdentifier}) has already been initialized`); - } - if (!this.isComponentSet()) { - throw Error(`Component ${this.name} has not been registered yet`); - } - const instance = this.getOrInitializeService({ - instanceIdentifier: normalizedIdentifier, - options - }); - // resolve any pending promise waiting for the service instance - for (const [instanceIdentifier, instanceDeferred] of this.instancesDeferred.entries()) { - const normalizedDeferredIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier); - if (normalizedIdentifier === normalizedDeferredIdentifier) { - instanceDeferred.resolve(instance); - } - } - return instance; - } - /** - * - * @param callback - a function that will be invoked after the provider has been initialized by calling provider.initialize(). - * The function is invoked SYNCHRONOUSLY, so it should not execute any longrunning tasks in order to not block the program. - * - * @param identifier An optional instance identifier - * @returns a function to unregister the callback - */ - onInit(callback, identifier) { - var _a; - const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier); - const existingCallbacks = (_a = this.onInitCallbacks.get(normalizedIdentifier)) !== null && _a !== void 0 ? _a : new Set(); - existingCallbacks.add(callback); - this.onInitCallbacks.set(normalizedIdentifier, existingCallbacks); - const existingInstance = this.instances.get(normalizedIdentifier); - if (existingInstance) { - callback(existingInstance, normalizedIdentifier); - } - return () => { - existingCallbacks.delete(callback); - }; - } - /** - * Invoke onInit callbacks synchronously - * @param instance the service instance` - */ - invokeOnInitCallbacks(instance, identifier) { - const callbacks = this.onInitCallbacks.get(identifier); - if (!callbacks) { - return; - } - for (const callback of callbacks) { - try { - callback(instance, identifier); - } - catch (_a) { - // ignore errors in the onInit callback - } - } - } - getOrInitializeService({ instanceIdentifier, options = {} }) { - let instance = this.instances.get(instanceIdentifier); - if (!instance && this.component) { - instance = this.component.instanceFactory(this.container, { - instanceIdentifier: normalizeIdentifierForFactory(instanceIdentifier), - options - }); - this.instances.set(instanceIdentifier, instance); - this.instancesOptions.set(instanceIdentifier, options); - /** - * Invoke onInit listeners. - * Note this.component.onInstanceCreated is different, which is used by the component creator, - * while onInit listeners are registered by consumers of the provider. - */ - this.invokeOnInitCallbacks(instance, instanceIdentifier); - /** - * Order is important - * onInstanceCreated() should be called after this.instances.set(instanceIdentifier, instance); which - * makes `isInitialized()` return true. - */ - if (this.component.onInstanceCreated) { - try { - this.component.onInstanceCreated(this.container, instanceIdentifier, instance); - } - catch (_a) { - // ignore errors in the onInstanceCreatedCallback - } - } - } - return instance || null; - } - normalizeInstanceIdentifier(identifier = DEFAULT_ENTRY_NAME) { - if (this.component) { - return this.component.multipleInstances ? identifier : DEFAULT_ENTRY_NAME; - } - else { - return identifier; // assume multiple instances are supported before the component is provided. - } - } - shouldAutoInitialize() { - return (!!this.component && - this.component.instantiationMode !== "EXPLICIT" /* EXPLICIT */); - } -} -// undefined should be passed to the service factory for the default instance -function normalizeIdentifierForFactory(identifier) { - return identifier === DEFAULT_ENTRY_NAME ? undefined : identifier; -} -function isComponentEager(component) { - return component.instantiationMode === "EAGER" /* EAGER */; -} - -/** - * @license - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * ComponentContainer that provides Providers for service name T, e.g. `auth`, `auth-internal` - */ -class ComponentContainer { - constructor(name) { - this.name = name; - this.providers = new Map(); - } - /** - * - * @param component Component being added - * @param overwrite When a component with the same name has already been registered, - * if overwrite is true: overwrite the existing component with the new component and create a new - * provider with the new component. It can be useful in tests where you want to use different mocks - * for different tests. - * if overwrite is false: throw an exception - */ - addComponent(component) { - const provider = this.getProvider(component.name); - if (provider.isComponentSet()) { - throw new Error(`Component ${component.name} has already been registered with ${this.name}`); - } - provider.setComponent(component); - } - addOrOverwriteComponent(component) { - const provider = this.getProvider(component.name); - if (provider.isComponentSet()) { - // delete the existing provider from the container, so we can register the new component - this.providers.delete(component.name); - } - this.addComponent(component); - } - /** - * getProvider provides a type safe interface where it can only be called with a field name - * present in NameServiceMapping interface. - * - * Firebase SDKs providing services should extend NameServiceMapping interface to register - * themselves. - */ - getProvider(name) { - if (this.providers.has(name)) { - return this.providers.get(name); - } - // create a Provider for a service that hasn't registered with Firebase - const provider = new Provider(name, this); - this.providers.set(name, provider); - return provider; - } - getProviders() { - return Array.from(this.providers.values()); - } -} - - -//# sourceMappingURL=index.esm2017.js.map - - -/***/ }), - -/***/ "./node_modules/@firebase/logger/dist/esm/index.esm2017.js": -/*!*****************************************************************!*\ - !*** ./node_modules/@firebase/logger/dist/esm/index.esm2017.js ***! - \*****************************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "LogLevel": () => (/* binding */ LogLevel), -/* harmony export */ "Logger": () => (/* binding */ Logger), -/* harmony export */ "setLogLevel": () => (/* binding */ setLogLevel), -/* harmony export */ "setUserLogHandler": () => (/* binding */ setUserLogHandler) -/* harmony export */ }); -/** - * @license - * Copyright 2017 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * A container for all of the Logger instances - */ -const instances = []; -/** - * The JS SDK supports 5 log levels and also allows a user the ability to - * silence the logs altogether. - * - * The order is a follows: - * DEBUG < VERBOSE < INFO < WARN < ERROR - * - * All of the log types above the current log level will be captured (i.e. if - * you set the log level to `INFO`, errors will still be logged, but `DEBUG` and - * `VERBOSE` logs will not) - */ -var LogLevel; -(function (LogLevel) { - LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG"; - LogLevel[LogLevel["VERBOSE"] = 1] = "VERBOSE"; - LogLevel[LogLevel["INFO"] = 2] = "INFO"; - LogLevel[LogLevel["WARN"] = 3] = "WARN"; - LogLevel[LogLevel["ERROR"] = 4] = "ERROR"; - LogLevel[LogLevel["SILENT"] = 5] = "SILENT"; -})(LogLevel || (LogLevel = {})); -const levelStringToEnum = { - 'debug': LogLevel.DEBUG, - 'verbose': LogLevel.VERBOSE, - 'info': LogLevel.INFO, - 'warn': LogLevel.WARN, - 'error': LogLevel.ERROR, - 'silent': LogLevel.SILENT -}; -/** - * The default log level - */ -const defaultLogLevel = LogLevel.INFO; -/** - * By default, `console.debug` is not displayed in the developer console (in - * chrome). To avoid forcing users to have to opt-in to these logs twice - * (i.e. once for firebase, and once in the console), we are sending `DEBUG` - * logs to the `console.log` function. - */ -const ConsoleMethod = { - [LogLevel.DEBUG]: 'log', - [LogLevel.VERBOSE]: 'log', - [LogLevel.INFO]: 'info', - [LogLevel.WARN]: 'warn', - [LogLevel.ERROR]: 'error' -}; -/** - * The default log handler will forward DEBUG, VERBOSE, INFO, WARN, and ERROR - * messages on to their corresponding console counterparts (if the log method - * is supported by the current log level) - */ -const defaultLogHandler = (instance, logType, ...args) => { - if (logType < instance.logLevel) { - return; - } - const now = new Date().toISOString(); - const method = ConsoleMethod[logType]; - if (method) { - console[method](`[${now}] ${instance.name}:`, ...args); - } - else { - throw new Error(`Attempted to log a message with an invalid logType (value: ${logType})`); - } -}; -class Logger { - /** - * Gives you an instance of a Logger to capture messages according to - * Firebase's logging scheme. - * - * @param name The name that the logs will be associated with - */ - constructor(name) { - this.name = name; - /** - * The log level of the given Logger instance. - */ - this._logLevel = defaultLogLevel; - /** - * The main (internal) log handler for the Logger instance. - * Can be set to a new function in internal package code but not by user. - */ - this._logHandler = defaultLogHandler; - /** - * The optional, additional, user-defined log handler for the Logger instance. - */ - this._userLogHandler = null; - /** - * Capture the current instance for later use - */ - instances.push(this); - } - get logLevel() { - return this._logLevel; - } - set logLevel(val) { - if (!(val in LogLevel)) { - throw new TypeError(`Invalid value "${val}" assigned to \`logLevel\``); - } - this._logLevel = val; - } - // Workaround for setter/getter having to be the same type. - setLogLevel(val) { - this._logLevel = typeof val === 'string' ? levelStringToEnum[val] : val; - } - get logHandler() { - return this._logHandler; - } - set logHandler(val) { - if (typeof val !== 'function') { - throw new TypeError('Value assigned to `logHandler` must be a function'); - } - this._logHandler = val; - } - get userLogHandler() { - return this._userLogHandler; - } - set userLogHandler(val) { - this._userLogHandler = val; - } - /** - * The functions below are all based on the `console` interface - */ - debug(...args) { - this._userLogHandler && this._userLogHandler(this, LogLevel.DEBUG, ...args); - this._logHandler(this, LogLevel.DEBUG, ...args); - } - log(...args) { - this._userLogHandler && - this._userLogHandler(this, LogLevel.VERBOSE, ...args); - this._logHandler(this, LogLevel.VERBOSE, ...args); - } - info(...args) { - this._userLogHandler && this._userLogHandler(this, LogLevel.INFO, ...args); - this._logHandler(this, LogLevel.INFO, ...args); - } - warn(...args) { - this._userLogHandler && this._userLogHandler(this, LogLevel.WARN, ...args); - this._logHandler(this, LogLevel.WARN, ...args); - } - error(...args) { - this._userLogHandler && this._userLogHandler(this, LogLevel.ERROR, ...args); - this._logHandler(this, LogLevel.ERROR, ...args); - } -} -function setLogLevel(level) { - instances.forEach(inst => { - inst.setLogLevel(level); - }); -} -function setUserLogHandler(logCallback, options) { - for (const instance of instances) { - let customLogLevel = null; - if (options && options.level) { - customLogLevel = levelStringToEnum[options.level]; - } - if (logCallback === null) { - instance.userLogHandler = null; - } - else { - instance.userLogHandler = (instance, level, ...args) => { - const message = args - .map(arg => { - if (arg == null) { - return null; - } - else if (typeof arg === 'string') { - return arg; - } - else if (typeof arg === 'number' || typeof arg === 'boolean') { - return arg.toString(); - } - else if (arg instanceof Error) { - return arg.message; - } - else { - try { - return JSON.stringify(arg); - } - catch (ignored) { - return null; - } - } - }) - .filter(arg => arg) - .join(' '); - if (level >= (customLogLevel !== null && customLogLevel !== void 0 ? customLogLevel : instance.logLevel)) { - logCallback({ - level: LogLevel[level].toLowerCase(), - message, - args, - type: instance.name - }); - } - }; - } - } -} - - -//# sourceMappingURL=index.esm2017.js.map - - -/***/ }), - -/***/ "./node_modules/@jspsych-contrib/plugin-rdk/dist/index.js": -/*!****************************************************************!*\ - !*** ./node_modules/@jspsych-contrib/plugin-rdk/dist/index.js ***! - \****************************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ RdkPlugin) -/* harmony export */ }); -/* harmony import */ var jspsych__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jspsych */ "./node_modules/jspsych/dist/index.js"); - - -const info = { - name: "rdk", - parameters: { - /** Array containing the valid key(s) that the subject can press to indicate a response. */ - choices: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.KEYS, - pretty_name: "Choices", - default: "ALL_KEYS", - }, - /** Array containing the correct key(s) for that trial. */ - correct_choice: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.KEYS, - pretty_name: "Correct choice", - default: undefined, - }, - /** The length of stimulus presentation. */ - trial_duration: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.INT, - pretty_name: "Trial duration", - default: 500, - }, - /** If true, then any valid key will end the trial. */ - response_ends_trial: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.BOOL, - pretty_name: "Response ends trial", - default: true, - }, - /** The number of RDK apertures (If more than one, make sure to separate them by setting aperture_center_x and aperture_center_y for each RDK). */ - number_of_apertures: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.INT, - pretty_name: "Number of apertures", - default: 1, - }, - /** The number of dots per set in the stimulus. */ - number_of_dots: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.INT, - pretty_name: "Number of dots", - default: 300, - }, - /** The number of sets of dots to cycle through. */ - number_of_sets: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.INT, - pretty_name: "Number of sets", - default: 1, - }, - /** The direction of coherent motion in degrees. */ - coherent_direction: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.INT, - pretty_name: "Coherent direction", - default: 0, - }, - /** The proportion of dots moving in the coherent direction. */ - coherence: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.FLOAT, - pretty_name: "Coherence", - default: 0.5, - }, - /** The proportion of dots moving in the direction opposite of the coherent direction. */ - opposite_coherence: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.FLOAT, - pretty_name: "Opposite coherence", - default: 0, - }, - /** The radius of the dots in pixels */ - dot_radius: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.INT, - pretty_name: "Dot radius", - default: 2, - }, - /** The length of the side of a dot in pixels (only when dot_shape is "square") */ - dot_side_length: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.INT, - pretty_name: "Dot side length", - default: 1, - }, - /** The number of frames that pass before each dot disappears and reappears somewhere else. */ - dot_life: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.INT, - pretty_name: "Dot life", - default: -1, - }, - /** The distance in pixels each dot moves per frame. */ - move_distance: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.INT, - pretty_name: "Move distance", - default: 1, - }, - /** The width of the aperture in pixels. */ - aperture_width: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.INT, - pretty_name: "Aperture width", - default: 600, - }, - /** The height of the aperture in pixels. */ - aperture_height: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.INT, - pretty_name: "Aperture height", - default: 400, - }, - /** The color of the dots. */ - dot_color: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.STRING, - pretty_name: "Dot color", - default: "white", - }, - /** The shape of the dots */ - dot_shape: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.STRING, - pretty_name: "Dot shape", - default: "circle", - }, - /** The background color of the stimulus. */ - background_color: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.STRING, - pretty_name: "Background color", - default: "gray", - }, - /** The type of RDK (refer to documentation for details). */ - RDK_type: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.INT, - pretty_name: "RDK type", - default: 3, - }, - /** The shape of the aperture. */ - aperture_type: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.INT, - pretty_name: "Aperture Type", - default: 2, - }, - /** The reinsertion rule for dots that move out of the aperture. */ - reinsert_type: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.INT, - pretty_name: "Reinsert type", - default: 2, - }, - /** The x-coordinate of the center of the aperture. */ - aperture_center_x: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.INT, - pretty_name: "Aperture center X", - default: window.innerWidth / 2, - }, - /** The y-coordinate of the center of the aperture. */ - aperture_center_y: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.INT, - pretty_name: "Aperture center Y", - default: window.innerHeight / 2, - }, - /** If true, then a fixation cross will be present in the middle of the screen. */ - fixation_cross: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.BOOL, - pretty_name: "Fixation cross", - default: false, - }, - /** The width of the fixation cross in pixels. */ - fixation_cross_width: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.INT, - pretty_name: "Fixation cross width", - default: 20, - }, - /** The height of the fixation cross in pixels. */ - fixation_cross_height: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.INT, - pretty_name: "Fixation cross height", - default: 20, - }, - /** The color of the fixation cross. */ - fixation_cross_color: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.STRING, - pretty_name: "Fixation cross color", - default: "black", - }, - /** The thickness of the fixation cross. */ - fixation_cross_thickness: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.INT, - pretty_name: "Fixation cross thickness", - default: 1, - }, - /** The presence of a border around the aperture. */ - border: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.BOOL, - pretty_name: "Border", - default: false, - }, - /** The thickness of the border in pixels. */ - border_thickness: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.INT, - pretty_name: "Border width", - default: 1, - }, - /** The color of the border. */ - border_color: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.STRING, - pretty_name: "Border Color", - default: 1, - }, - }, -}; -/** - * **RDK** - * - * jsPsych plugin for showing a random-dot kinematogram stimulus and recording a keyboard response - * - * @author Sivananda Rajananda - * @see {@link https://www.jspsych.org/plugins/jspsych-rdk/ RDK plugin documentation on jspsych.org} - * @copyright - * - * This code was created in the Consciousness and Metacognition Lab at UCLA, - * under the supervision of Brian Odegaard and Hakwan Lau - * - * We would appreciate it if you cited this paper when you use the RDK: - * Rajananda, S., Lau, H. & Odegaard, B., (2018). A Random-Dot Kinematogram for Web-Based Vision Research. Journal of Open Research Software. 6(1), p.6. DOI: [http://doi.org/10.5334/jors.194] - * - * ---------------------- - * - * Copyright (C) 2017 Sivananda Rajananda - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -class RdkPlugin { - constructor(jsPsych) { - this.jsPsych = jsPsych; - } - trial(display_element, trial) { - //-------------------------------------- - //---------SET PARAMETERS BEGIN--------- - //-------------------------------------- - //Note on '||' logical operator: If the first option is 'undefined', it evalutes to 'false' and the second option is returned as the assignment - // Note: trial properties are now read-only, so these params have all been changed to separate variables here and throughout trial function - var choices = assignParameterValue(trial.choices, []); - var correct_choice = assignParameterValue(trial.correct_choice, undefined); - var trial_duration = assignParameterValue(trial.trial_duration, 500); - var response_ends_trial = assignParameterValue(trial.response_ends_trial, true); - var number_of_apertures = assignParameterValue(trial.number_of_apertures, 1); - var number_of_dots = assignParameterValue(trial.number_of_dots, 300); - var number_of_sets = assignParameterValue(trial.number_of_sets, 1); - var coherent_direction = assignParameterValue(trial.coherent_direction, 0); - var coherence = assignParameterValue(trial.coherence, 0.5); - var opposite_coherence = assignParameterValue(trial.opposite_coherence, 0); - var dot_radius = assignParameterValue(trial.dot_radius, 2); - var dot_side_length = assignParameterValue(trial.dot_side_length, 1); - var dot_life = assignParameterValue(trial.dot_life, -1); - var move_distance = assignParameterValue(trial.move_distance, 1); - var aperture_width = assignParameterValue(trial.aperture_width, 600); - var aperture_height = assignParameterValue(trial.aperture_height, 400); - var dot_color = assignParameterValue(trial.dot_color, "white"); - var dot_shape = assignParameterValue(trial.dot_shape, "circle"); - var background_color = assignParameterValue(trial.background_color, "gray"); - var RDK_type = assignParameterValue(trial.RDK_type, 3); - var aperture_type = assignParameterValue(trial.aperture_type, 2); - var reinsert_type = assignParameterValue(trial.reinsert_type, 2); - var aperture_center_x = assignParameterValue(trial.aperture_center_x, window.innerWidth / 2); - var aperture_center_y = assignParameterValue(trial.aperture_center_y, window.innerHeight / 2); - var fixation_cross = assignParameterValue(trial.fixation_cross, false); - var fixation_cross_width = assignParameterValue(trial.fixation_cross_width, 20); - var fixation_cross_height = assignParameterValue(trial.fixation_cross_height, 20); - var fixation_cross_color = assignParameterValue(trial.fixation_cross_color, "black"); - var fixation_cross_thickness = assignParameterValue(trial.fixation_cross_thickness, 1); - var border = assignParameterValue(trial.border, false); - var border_thickness = assignParameterValue(trial.border_thickness, 1); - var border_color = assignParameterValue(trial.border_color, "black"); - //For square and circle, set the aperture height == aperture width - if (apertureType == 1 || apertureType == 3) { - aperture_height = aperture_width; - } - //Convert the parameter variables to those that the code below can use - var nApertures = number_of_apertures; //The number of apertures - var nDots = number_of_dots; //Number of dots per set (equivalent to number of dots per frame) - var nSets = number_of_sets; //Number of sets to cycle through per frame - var coherentDirection = coherent_direction; //The direction of the coherentDots in degrees. Starts at 3 o'clock and goes counterclockwise (0 == rightwards, 90 == upwards, 180 == leftwards, 270 == downwards), range 0 - 360 - var coherence = coherence; //Proportion of dots to move together, range from 0 to 1 - var oppositeCoherence = opposite_coherence; // The coherence for the dots going the opposite direction as the coherent dots - var dotRadius = dot_radius; //Radius of each dot in pixels - var dotSideLength = dot_side_length; // Length of dot side in pixels (only when dot_shape is "square") - var dotLife = dot_life; //How many frames a dot will keep following its trajectory before it is redrawn at a random location. -1 denotes infinite life (the dot will only be redrawn if it reaches the end of the aperture). - var moveDistance = move_distance; //How many pixels the dots move per frame - var apertureWidth = aperture_width; // How many pixels wide the aperture is. For square aperture this will be the both height and width. For circle, this will be the diameter. - var apertureHeight = aperture_height; //How many pixels high the aperture is. Only relevant for ellipse and rectangle apertures. For circle and square, this is ignored. - var dotColor = dot_color; //Color of the dots - var backgroundColor = background_color; //Color of the background - var apertureCenterX = aperture_center_x; // The x-coordinate of center of the aperture on the screen, in pixels - var apertureCenterY = aperture_center_y; // The y-coordinate of center of the aperture on the screen, in pixels - /** RDK type parameter - ** See Fig. 1 in Scase, Braddick, and Raymond (1996) for a visual depiction of these different signal selection rules and noise types - - ------------------- - SUMMARY: - - Signal Selection rule: - -Same: Each dot is designated to be either a coherent dot (signal) or incoherent dot (noise) and will remain so throughout all frames in the display. Coherent dots will always move in the direction of coherent motion in all frames. - -Different: Each dot can be either a coherent dot (signal) or incoherent dot (noise) and will be designated randomly (weighted based on the coherence level) at each frame. Only the dots that are designated to be coherent dots will move in the direction of coherent motion, but only in that frame. In the next frame, each dot will be designated randomly again on whether it is a coherent or incoherent dot. - - Noise Type: - -Random position: The incoherent dots appear in a random location in the aperture in each frame - -Random walk: The incoherent dots will move in a random direction (designated randomly in each frame) in each frame. - -Random direction: Each incoherent dot has its own alternative direction of motion (designated randomly at the beginning of the trial), and moves in that direction in each frame. - - ------------------- - - 1 - same && random position - 2 - same && random walk - 3 - same && random direction - 4 - different && random position - 5 - different && random walk - 6 - different && random direction */ - var RDK = RDK_type; - /** - Shape of aperture - 1 - Circle - 2 - Ellipse - 3 - Square - 4 - Rectangle - */ - var apertureType = aperture_type; - /** - Shape of dots - "circle" (default) or "square" - */ - var dotShape = dot_shape; - /* - Out of Bounds Decision - How we reinsert a dot that has moved outside the edges of the aperture: - 1 - Randomly appear anywhere in the aperture - 2 - Appear on the opposite edge of the aperture (Random if square or rectangle, reflected about origin in circle and ellipse) - */ - var reinsertType = reinsert_type; - //Fixation Cross Parameters - var fixationCross = fixation_cross; //To display or not to display the cross - var fixationCrossWidth = fixation_cross_width; //The width of the fixation cross in pixels - var fixationCrossHeight = fixation_cross_height; //The height of the fixation cross in pixels - var fixationCrossColor = fixation_cross_color; //The color of the fixation cross - var fixationCrossThickness = fixation_cross_thickness; //The thickness of the fixation cross, must be positive number above 1 - //Border Parameters - var border = border; //To display or not to display the border - var borderThickness = border_thickness; //The width of the border in pixels - var borderColor = border_color; //The color of the border - //-------------------------------------- - //----------SET PARAMETERS END---------- - //-------------------------------------- - //--------Set up Canvas begin------- - //Create a canvas element and append it to the DOM - var canvas = document.createElement("canvas"); - display_element.appendChild(canvas); - //The document body IS 'display_element' (i.e. .... ) - var body = document.getElementsByClassName("jspsych-display-element")[0]; - //Save the current settings to be restored later - var originalMargin = body.style.margin; - var originalPadding = body.style.padding; - var originalBackgroundColor = body.style.backgroundColor; - //Remove the margins and paddings of the display_element - body.style.margin = "0"; - body.style.padding = "0"; - body.style.backgroundColor = backgroundColor; //Match the background of the display element to the background color of the canvas so that the removal of the canvas at the end of the trial is not noticed - //Remove the margins and padding of the canvas - canvas.style.margin = "0"; - canvas.style.padding = "0"; - // use absolute positioning in top left corner to get rid of scroll bars - canvas.style.position = "absolute"; - canvas.style.top = "0"; - canvas.style.left = "0"; - //Get the context of the canvas so that it can be painted on. - var ctx = canvas.getContext("2d"); - //Declare variables for width and height, and also set the canvas width and height to the window width and height - var canvasWidth = (canvas.width = window.innerWidth); - var canvasHeight = (canvas.height = window.innerHeight); - //Set the canvas background color - canvas.style.backgroundColor = backgroundColor; - //--------Set up Canvas end------- - //--------RDK variables and function calls begin-------- - //This is the main part of the trial that makes everything run - //Global variable for the current aperture number - var currentApertureNumber; - //3D Array to hold the dots (1st D is Apertures, 2nd D is Sets, 3rd D is Dots) - var dotArray3d = []; - //Variables for different apertures (initialized in setUpMultipleApertures function below) - var nDotsArray; - var nSetsArray; - var coherentDirectionArray; - var coherenceArray; - var oppositeCoherenceArray; - var dotRadiusArray; - var dotSideLengthArray; - var dotLifeArray; - var moveDistanceArray; - var apertureWidthArray; - var apertureHeightArray; - var dotColorArray; - var dotShapeArray; - var apertureCenterXArray; - var apertureCenterYArray; - var RDKArray; - var apertureTypeArray; - var reinsertTypeArray; - var fixationCrossArray; - var fixationCrossWidthArray; - var fixationCrossHeightArray; - var fixationCrossColorArray; - var fixationCrossThicknessArray; - var borderArray; - var borderThicknessArray; - var borderColorArray; - //Set up the variables for the apertures - const setUpMultipleApertures = () => { - nDotsArray = setParameter(nDots); - nSetsArray = setParameter(nSets); - coherentDirectionArray = setParameter(coherentDirection); - coherenceArray = setParameter(coherence); - oppositeCoherenceArray = setParameter(oppositeCoherence); - dotRadiusArray = setParameter(dotRadius); - dotSideLengthArray = setParameter(dotSideLength); - dotLifeArray = setParameter(dotLife); - moveDistanceArray = setParameter(moveDistance); - apertureWidthArray = setParameter(apertureWidth); - apertureHeightArray = setParameter(apertureHeight); - dotColorArray = setParameter(dotColor); - dotShapeArray = setParameter(dotShape); - apertureCenterXArray = setParameter(apertureCenterX); - apertureCenterYArray = setParameter(apertureCenterY); - RDKArray = setParameter(RDK); - apertureTypeArray = setParameter(apertureType); - reinsertTypeArray = setParameter(reinsertType); - fixationCrossArray = setParameter(fixationCross); - fixationCrossWidthArray = setParameter(fixationCrossWidth); - fixationCrossHeightArray = setParameter(fixationCrossHeight); - fixationCrossColorArray = setParameter(fixationCrossColor); - fixationCrossThicknessArray = setParameter(fixationCrossThickness); - borderArray = setParameter(border); - borderThicknessArray = setParameter(borderThickness); - borderColorArray = setParameter(borderColor); - currentSetArray = setParameter(0); //Always starts at zero - //Loop through the number of apertures to make the dots - for (currentApertureNumber = 0; currentApertureNumber < nApertures; currentApertureNumber++) { - //Initialize the parameters to make the 2d dot array (one for each aperture); - initializeCurrentApertureParameters(currentApertureNumber); - //Make each 2d array and push it into the 3d array - dotArray3d.push(makeDotArray2d()); - } - }; - // Set up multiple apertures - setUpMultipleApertures(); - //Declare aperture parameters for initialization based on shape (used in initializeApertureDimensions function below) - var horizontalAxis; - var verticalAxis; - //Calculate the x and y jump sizes for coherent dots - var coherentJumpSizeX; - var coherentJumpSizeY; - //Calculate the number of coherent, opposite coherent, and incoherent dots - var nCoherentDots; - var nOppositeCoherentDots; - //Make the array of arrays containing dot objects - var dotArray2d; - var currentSetArray; //Declare and initialize a global variable to cycle through the dot arrays - //Initialize stopping condition for animateDotMotion function that runs in a loop - var stopDotMotion = false; - //Variable to start the timer when the time comes - var timerHasStarted = false; - //Initialize object to store the response data. Default values of -1 are used if the trial times out and the subject has not pressed a valid key - var response = { - rt: -1, - key: "", - }; - //Declare a global timeout ID to be initialized below in animateDotMotion function and to be used in after_response function - var timeoutID; - //Declare global variable to be defined in startKeyboardListener function and to be used in end_trial function - var keyboardListener; - //Declare global variable to store the frame rate of the trial - var frameRate = []; //How often the monitor refreshes, in ms. Currently an array to store all the intervals. Will be converted into a single number (the average) in end_trial function. - //variable to store how many frames were presented. - var numberOfFrames = 0; - // set up dot-drawing abstractions - const pi2 = Math.PI * 2; - const circleFn = (x, y, rad) => { - ctx.arc(x, y, rad, 0, pi2); - }; - const squareFn = (x, y, half_len) => { - const len = half_len * 2; - ctx.rect(x - half_len, y - half_len, len, len); - }; - //Function to start the keyboard listener - const startKeyboardListener = () => { - //Start the response listener if there are choices for keys - if (choices != "NO_KEYS") { - //Create the keyboard listener to listen for subjects' key response - keyboardListener = this.jsPsych.pluginAPI.getKeyboardResponse({ - callback_function: after_response, - valid_responses: choices, - rt_method: "performance", - persist: false, - allow_held_key: false, //Only register the key once, after this getKeyboardResponse function is called. (Check JsPsych docs for better info under 'jsPsych.pluginAPI.getKeyboardResponse'). - }); - } - }; - //Function to end the trial proper - const end_trial = () => { - //Stop the dot motion animation - stopDotMotion = true; - //Store the number of frames - numberOfFrames = frameRate.length; - //Variable to store the frame rate array - var frameRateArray = frameRate; - //Calculate the average frame rate - if (numberOfFrames > 0) { - //Check to make sure that the array is not empty - frameRate = - frameRate.reduce((total, current) => total + current) / numberOfFrames; //Sum up all the elements in the array - } - else { - frameRate = 0; //Set to zero if the subject presses an answer before a frame is shown (i.e. if frameRate is an empty array) - } - //Kill the keyboard listener if keyboardListener has been defined - if (typeof keyboardListener !== "undefined") { - this.jsPsych.pluginAPI.cancelKeyboardResponse(keyboardListener); - } - //Place all the data to be saved from this trial in one data object - var trial_data = { - rt: response.rt, - response: response.key, - correct: correctOrNot(), - choices: choices, - correct_choice: correct_choice, - trial_duration: trial_duration, - response_ends_trial: response_ends_trial, - number_of_apertures: number_of_apertures, - number_of_dots: number_of_dots, - number_of_sets: number_of_sets, - coherent_direction: coherent_direction, - coherence: coherence, - opposite_coherence: opposite_coherence, - dot_radius: dot_radius, - dot_side_length: dot_side_length, - dot_life: dot_life, - move_distance: move_distance, - aperture_width: aperture_width, - aperture_height: aperture_height, - dot_color: dot_color, - dot_shape: dot_shape, - background_color: background_color, - RDK_type: RDK_type, - aperture_type: aperture_type, - reinsert_type: reinsert_type, - frame_rate: frameRate, - frame_rate_array: frameRateArray, - number_of_frames: numberOfFrames, - aperture_center_x: aperture_center_x, - aperture_center_y: aperture_center_y, - fixation_cross: fixation_cross, - fixation_cross_width: fixation_cross_width, - fixation_cross_height: fixation_cross_height, - fixation_cross_color: fixation_cross_color, - fixation_cross_thickness: fixation_cross_thickness, - border: border, - border_thickness: border_thickness, - border_color: border_color, - canvas_width: canvasWidth, - canvas_height: canvasHeight, - }; - //Remove the canvas as the child of the display_element element - display_element.innerHTML = ""; - //Restore the settings to JsPsych defaults - body.style.margin = originalMargin; - body.style.padding = originalPadding; - body.style.backgroundColor = originalBackgroundColor; - //End this trial and move on to the next trial - this.jsPsych.finishTrial(trial_data); - }; //End of end_trial - //This runs the dot motion simulation, updating it according to the frame refresh rate of the screen. - animateDotMotion(); - //--------RDK variables and function calls end-------- - //------------------------------------- - //-----------FUNCTIONS BEGIN----------- - //------------------------------------- - //----JsPsych Functions Begin---- - //Function to record the first response by the subject - function after_response(info) { - //If the response has not been recorded, record it - if (response.key == "") { - response = info; //Replace the response object created above - } - //If the parameter is set such that the response ends the trial, then kill the timeout and end the trial - if (response_ends_trial) { - window.clearTimeout(timeoutID); - end_trial(); - } - } //End of after_response - //Function that determines if the response is correct - const correctOrNot = () => { - //Check that the correct_choice has been defined and that it is an array - if (typeof correct_choice !== "undefined" && correct_choice.constructor === Array) { - if (typeof correct_choice[0] === "string" || correct_choice[0] instanceof String) { - var key_in_choices = correct_choice.every((x) => { - return this.jsPsych.pluginAPI.compareKeys(x, response.key); - }); - return key_in_choices; //If the response is included in the correct_choice array, return true. Else, return false. - } - else if (typeof correct_choice[0] === "number") { - // the elements are numbers (javascript character codes) - console.error("Error in RDK plugin: elements in the correct_choice array must be key characters (strings)."); - return false; // added due to TS error: not all code paths return a value - } - else { - console.error("Error in RDK plugin: elements in the correct_choice array must be key characters (strings)."); - return false; // added due to TS error: not all code paths return a value - } - } - else { - console.error("Error in RDK plugin: you must specify an array of key characters for the correct_choice parameter."); - return false; // added due to TS error: not all code paths return a value - } - }; - //----JsPsych Functions End---- - //----RDK Functions Begin---- - //Function to set the parameters of the array - //@ts-expect-error "not all code paths return a value" - function setParameter(originalVariable) { - //Check if it is an array and its length matches the aperture then return the original array - if (originalVariable.constructor === Array && originalVariable.length === nApertures) { - return originalVariable; - } - //Else if it is not an array, we make it an array with duplicate values - else if (originalVariable.constructor !== Array) { - var tempArray = []; - //Make a for loop and duplicate the values - for (var i = 0; i < nApertures; i++) { - tempArray.push(originalVariable); - } - return tempArray; - } - //Else if the array is not long enough, then print out that error message - else if (originalVariable.constructor === Array && originalVariable.length !== nApertures) { - console.error("If you have more than one aperture, please ensure that arrays that are passed in as parameters are the same length as the number of apertures. Else you can use a single value without the array"); - } - //Else print a generic error - else { - console.error("A parameter is incorrectly set. Please ensure that the nApertures parameter is set to the correct value (if using more than one aperture), and all others parameters are set correctly."); - } - } - //Function to set the global variables to the current aperture so that the correct dots are updated and drawn - function initializeCurrentApertureParameters(currentApertureNumber) { - //Set the global variables to that relevant to the current aperture - nDots = nDotsArray[currentApertureNumber]; - nSets = nSetsArray[currentApertureNumber]; - coherentDirection = coherentDirectionArray[currentApertureNumber]; - coherence = coherenceArray[currentApertureNumber]; - oppositeCoherence = oppositeCoherenceArray[currentApertureNumber]; - dotRadius = dotRadiusArray[currentApertureNumber]; - dotSideLength = dotSideLengthArray[currentApertureNumber]; - dotLife = dotLifeArray[currentApertureNumber]; - moveDistance = moveDistanceArray[currentApertureNumber]; - apertureWidth = apertureWidthArray[currentApertureNumber]; - apertureHeight = apertureHeightArray[currentApertureNumber]; - dotColor = dotColorArray[currentApertureNumber]; - dotShape = dotShapeArray[currentApertureNumber]; - apertureCenterX = apertureCenterXArray[currentApertureNumber]; - apertureCenterY = apertureCenterYArray[currentApertureNumber]; - RDK = RDKArray[currentApertureNumber]; - apertureType = apertureTypeArray[currentApertureNumber]; - reinsertType = reinsertTypeArray[currentApertureNumber]; - fixationCross = fixationCrossArray[currentApertureNumber]; - fixationCrossWidth = fixationCrossWidthArray[currentApertureNumber]; - fixationCrossHeight = fixationCrossHeightArray[currentApertureNumber]; - fixationCrossColor = fixationCrossColorArray[currentApertureNumber]; - fixationCrossThickness = fixationCrossThicknessArray[currentApertureNumber]; - border = borderArray[currentApertureNumber]; - borderThickness = borderThicknessArray[currentApertureNumber]; - borderColor = borderColorArray[currentApertureNumber]; - //Calculate the x and y jump sizes for coherent dots - coherentJumpSizeX = calculateCoherentJumpSizeX(coherentDirection); - coherentJumpSizeY = calculateCoherentJumpSizeY(coherentDirection); - //Initialize the aperture parameters - initializeApertureDimensions(); - //Calculate the number of coherent, opposite coherent, and incoherent dots - nCoherentDots = nDots * coherence; - nOppositeCoherentDots = nDots * oppositeCoherence; - //If the 3d array has been made, then choose the 2d array and the current set - dotArray2d = dotArray3d.length !== 0 ? dotArray3d[currentApertureNumber] : undefined; - } // End of initializeCurrentApertureParameters - //Calculate coherent jump size in the x direction - function calculateCoherentJumpSizeX(coherentDirection) { - var angleInRadians = (coherentDirection * Math.PI) / 180; - return moveDistance * Math.cos(angleInRadians); - } - //Calculate coherent jump size in the y direction - function calculateCoherentJumpSizeY(coherentDirection) { - var angleInRadians = (-coherentDirection * Math.PI) / 180; //Negative sign because the y-axis is flipped on screen - return moveDistance * Math.sin(angleInRadians); - } - //Initialize the parameters for the aperture for further calculation - function initializeApertureDimensions() { - //For circle and square - if (apertureType == 1 || apertureType == 3) { - horizontalAxis = verticalAxis = apertureWidth / 2; - } - //For ellipse and rectangle - else if (apertureType == 2 || apertureType == 4) { - horizontalAxis = apertureWidth / 2; - verticalAxis = apertureHeight / 2; - } - } - //Make the 2d array, which is an array of array of dots - function makeDotArray2d() { - //Declare an array to hold the sets of dot arrays - var tempArray = []; - //Loop for each set of dot array - for (var i = 0; i < nSets; i++) { - tempArray.push(makeDotArray()); //Make a dot array and push it into the 2d array - } - return tempArray; - } - //Make the dot array - function makeDotArray() { - var tempArray = []; - for (var i = 0; i < nDots; i++) { - //Initialize a dot to be modified and inserted into the array - var dot = { - x: 0, - y: 0, - vx: 0, - vy: 0, - vx2: 0, - vy2: 0, - latestXMove: 0, - latestYMove: 0, - lifeCount: Math.floor(randomNumberBetween(0, dotLife)), - updateType: "", //String to determine how this dot is updated - }; - //randomly set the x and y coordinates - dot = resetLocation(dot); - //For the same && random position RDK type - if (RDK == 1) { - //For coherent dots - if (i < nCoherentDots) { - dot = setvxvy(dot); // Set dot.vx and dot.vy - dot.updateType = "constant direction"; - } - //For opposite coherent dots - else if (i >= nCoherentDots && i < nCoherentDots + nOppositeCoherentDots) { - dot = setvxvy(dot); // Set dot.vx and dot.vy - dot.updateType = "opposite direction"; - } - //For incoherent dots - else { - dot.updateType = "random position"; - } - } //End of RDK==1 - //For the same && random walk RDK type - if (RDK == 2) { - //For coherent dots - if (i < nCoherentDots) { - dot = setvxvy(dot); // Set dot.vx and dot.vy - dot.updateType = "constant direction"; - } - //For opposite coherent dots - else if (i >= nCoherentDots && i < nCoherentDots + nOppositeCoherentDots) { - dot = setvxvy(dot); // Set dot.vx and dot.vy - dot.updateType = "opposite direction"; - } - //For incoherent dots - else { - dot.updateType = "random walk"; - } - } //End of RDK==2 - //For the same && random direction RDK type - if (RDK == 3) { - //For coherent dots - if (i < nCoherentDots) { - dot = setvxvy(dot); // Set dot.vx and dot.vy - dot.updateType = "constant direction"; - } - //For opposite coherent dots - else if (i >= nCoherentDots && i < nCoherentDots + nOppositeCoherentDots) { - dot = setvxvy(dot); // Set dot.vx and dot.vy - dot.updateType = "opposite direction"; - } - //For incoherent dots - else { - setvx2vy2(dot); // Set dot.vx2 and dot.vy2 - dot.updateType = "random direction"; - } - } //End of RDK==3 - //For the different && random position RDK type - if (RDK == 4) { - //For all dots - dot = setvxvy(dot); // Set dot.vx and dot.vy - dot.updateType = "constant direction or opposite direction or random position"; - } //End of RDK==4 - //For the different && random walk RDK type - if (RDK == 5) { - //For all dots - dot = setvxvy(dot); // Set dot.vx and dot.vy - dot.updateType = "constant direction or opposite direction or random walk"; - } //End of RDK==5 - //For the different && random direction RDK type - if (RDK == 6) { - //For all dots - dot = setvxvy(dot); // Set dot.vx and dot.vy - //Each dot will have its own alternate direction of motion - setvx2vy2(dot); // Set dot.vx2 and dot.vy2 - dot.updateType = "constant direction or opposite direction or random direction"; - } //End of RDK==6 - tempArray.push(dot); - } //End of for loop - return tempArray; - } - //Function to update all the dots all the apertures and then draw them - function updateAndDraw() { - //Three for loops that do things in sequence: clear, update, and draw dots. - // Clear all the current dots - ctx.clearRect(0, 0, canvas.width, canvas.height); - // Update all the relevant dots - for (currentApertureNumber = 0; currentApertureNumber < nApertures; currentApertureNumber++) { - //Initialize the variables for each parameter - initializeCurrentApertureParameters(currentApertureNumber); - //Update the dots - updateDots(); - } - // Draw all the relevant dots on the canvas - for (currentApertureNumber = 0; currentApertureNumber < nApertures; currentApertureNumber++) { - //Initialize the variables for each parameter - initializeCurrentApertureParameters(currentApertureNumber); - //Draw on the canvas - draw(); - } - //Draw the fixation cross if we want it - if (fixationCross === true) { - //Horizontal line - ctx.beginPath(); - ctx.lineWidth = fixationCrossThickness; - ctx.moveTo(canvasWidth / 2 - fixationCrossWidth, canvasHeight / 2); - ctx.lineTo(canvasWidth / 2 + fixationCrossWidth, canvasHeight / 2); - //Vertical line - ctx.moveTo(canvasWidth / 2, canvasHeight / 2 - fixationCrossHeight); - ctx.lineTo(canvasWidth / 2, canvasHeight / 2 + fixationCrossHeight); - ctx.strokeStyle = fixationCrossColor; - ctx.stroke(); - } - } - //Draw the dots on the canvas after they're updated - function draw() { - //Load in the current set of dot array for easy handling - const dotArray = dotArray2d[currentSetArray[currentApertureNumber]]; - let drawFn; - let dot_size; - if (dotShape == "square") { - drawFn = squareFn; - dot_size = dotSideLength * 0.5; - } - else { - drawFn = circleFn; - dot_size = dotRadius; - } - //Loop through the dots one by one and draw them - ctx.fillStyle = dotColor; - ctx.beginPath(); - for (let i = 0; i < nDots; i++) { - const dot = dotArray[i]; - ctx.moveTo(dot.x + dot_size, dot.y); - drawFn(dot.x, dot.y, dot_size); - } - ctx.fill(); - //Draw the border if we want it - if (border === true) { - //For circle and ellipse - if (apertureType === 1 || apertureType === 2) { - ctx.lineWidth = borderThickness; - ctx.strokeStyle = borderColor; - ctx.beginPath(); - ctx.ellipse(apertureCenterX, apertureCenterY, horizontalAxis + borderThickness / 2, verticalAxis + borderThickness / 2, 0, 0, pi2); - ctx.stroke(); - } //End of if circle or ellipse - //For square and rectangle - if (apertureType === 3 || apertureType === 4) { - ctx.lineWidth = borderThickness; - ctx.strokeStyle = borderColor; - ctx.strokeRect(apertureCenterX - horizontalAxis - borderThickness / 2, apertureCenterY - verticalAxis - borderThickness / 2, horizontalAxis * 2 + borderThickness, verticalAxis * 2 + borderThickness); - } //End of if square or - } //End of if border === true - } //End of draw - //Update the dots with their new location - function updateDots() { - //Cycle through to the next set of dots - if (currentSetArray[currentApertureNumber] == nSets - 1) { - currentSetArray[currentApertureNumber] = 0; - } - else { - currentSetArray[currentApertureNumber] = currentSetArray[currentApertureNumber] + 1; - } - //Load in the current set of dot array for easy handling - var dotArray = dotArray2d[currentSetArray[currentApertureNumber]]; - //Loop through the dots one by one and update them accordingly - for (var i = 0; i < nDots; i++) { - var dot = dotArray[i]; //Load the current dot into the variable for easy handling - //Generate a random value - var randomValue = Math.random(); - //Update based on the dot's update type - if (dot.updateType == "constant direction") { - dot = constantDirectionUpdate(dot); - } - else if (dot.updateType == "opposite direction") { - dot = oppositeDirectionUpdate(dot); - } - else if (dot.updateType == "random position") { - dot = resetLocation(dot); - } - else if (dot.updateType == "random walk") { - dot = randomWalkUpdate(dot); - } - else if (dot.updateType == "random direction") { - dot = randomDirectionUpdate(dot); - } - else if (dot.updateType == "constant direction or opposite direction or random position") { - //Randomly select if the dot goes in a constant direction or random position, weighted based on the coherence level - if (randomValue < coherence) { - dot = constantDirectionUpdate(dot); - } - else if (randomValue >= coherence && randomValue < coherence + oppositeCoherence) { - dot = oppositeDirectionUpdate(dot); - } - else { - dot = resetLocation(dot); - } - } - else if (dot.updateType == "constant direction or opposite direction or random walk") { - //Randomly select if the dot goes in a constant direction or random walk, weighted based on the coherence level - if (randomValue < coherence) { - dot = constantDirectionUpdate(dot); - } - else if (randomValue >= coherence && randomValue < coherence + oppositeCoherence) { - dot = oppositeDirectionUpdate(dot); - } - else { - dot = randomWalkUpdate(dot); - } - } - else if (dot.updateType == "constant direction or opposite direction or random direction") { - //Randomly select if the dot goes in a constant direction or random direction, weighted based on the coherence level - if (randomValue < coherence) { - dot = constantDirectionUpdate(dot); - } - else if (randomValue >= coherence && randomValue < coherence + oppositeCoherence) { - dot = oppositeDirectionUpdate(dot); - } - else { - dot = randomDirectionUpdate(dot); - } - } //End of if dot.updateType == ... - //Increment the life count - dot.lifeCount++; - //Check if out of bounds or if life ended - if (lifeEnded(dot)) { - dot = resetLocation(dot); - } - //If it goes out of bounds, do what is necessary (reinsert randomly or reinsert on the opposite edge) based on the parameter chosen - if (outOfBounds(dot)) { - switch (reinsertType) { - case 1: - dot = resetLocation(dot); - break; - case 2: - dot = reinsertOnOppositeEdge(dot); - break; - } //End of switch statement - } //End of if - } //End of for loop - } //End of updateDots function - //Function to check if dot life has ended - function lifeEnded(dot) { - //If we want infinite dot life - if (dotLife < 0) { - dot.lifeCount = 0; //resetting to zero to save memory. Otherwise it might increment to huge numbers. - return false; - } - //Else if the dot's life has reached its end - else if (dot.lifeCount >= dotLife) { - dot.lifeCount = 0; - return true; - } - //Else the dot's life has not reached its end - else { - return false; - } - } - //Function to check if dot is out of bounds - //@ts-expect-error "not all code paths return a value" - function outOfBounds(dot) { - //For circle and ellipse - if (apertureType == 1 || apertureType == 2) { - if (dot.x < xValueNegative(dot.y) || - dot.x > xValuePositive(dot.y) || - dot.y < yValueNegative(dot.x) || - dot.y > yValuePositive(dot.x)) { - return true; - } - else { - return false; - } - } - //For square and rectangle - if (apertureType == 3 || apertureType == 4) { - if (dot.x < apertureCenterX - horizontalAxis || - dot.x > apertureCenterX + horizontalAxis || - dot.y < apertureCenterY - verticalAxis || - dot.y > apertureCenterY + verticalAxis) { - return true; - } - else { - return false; - } - } - } - //Set the vx and vy for the dot to the coherent jump sizes of the X and Y directions - function setvxvy(dot) { - dot.vx = coherentJumpSizeX; - dot.vy = coherentJumpSizeY; - return dot; - } - //Set the vx2 and vy2 based on a random angle - function setvx2vy2(dot) { - //Generate a random angle of movement - var theta = randomNumberBetween(-Math.PI, Math.PI); - //Update properties vx2 and vy2 with the alternate directions - dot.vx2 = Math.cos(theta) * moveDistance; - dot.vy2 = -Math.sin(theta) * moveDistance; - return dot; - } - //Updates the x and y coordinates by moving it in the x and y coherent directions - function constantDirectionUpdate(dot) { - dot.x += dot.vx; - dot.y += dot.vy; - dot.latestXMove = dot.vx; - dot.latestYMove = dot.vy; - return dot; - } - //Updates the x and y coordinates by moving it in the opposite x and y coherent directions - function oppositeDirectionUpdate(dot) { - dot.x -= dot.vx; - dot.y -= dot.vy; - dot.latestXMove = -dot.vx; - dot.latestYMove = -dot.vy; - return dot; - } - //Creates a new angle to move towards and updates the x and y coordinates - function randomWalkUpdate(dot) { - //Generate a random angle of movement - var theta = randomNumberBetween(-Math.PI, Math.PI); - //Generate the movement from the angle - dot.latestXMove = Math.cos(theta) * moveDistance; - dot.latestYMove = -Math.sin(theta) * moveDistance; - //Update x and y coordinates with the new location - dot.x += dot.latestXMove; - dot.y += dot.latestYMove; - return dot; - } - //Updates the x and y coordinates with the alternative move direction - function randomDirectionUpdate(dot) { - dot.x += dot.vx2; - dot.y += dot.vy2; - dot.latestXMove = dot.vx2; - dot.latestYMove = dot.vy2; - return dot; - } - //Calculates a random position on the opposite edge to reinsert the dot - function reinsertOnOppositeEdge(dot) { - //If it is a circle or ellipse - if (apertureType == 1 || apertureType == 2) { - //Bring the dot back into the aperture by moving back one step - dot.x -= dot.latestXMove; - dot.y -= dot.latestYMove; - //Move the dot to the position relative to the origin to be reflected about the origin - dot.x -= apertureCenterX; - dot.y -= apertureCenterY; - //Reflect the dot about the origin - dot.x = -dot.x; - dot.y = -dot.y; - //Move the dot back to the center of the screen - dot.x += apertureCenterX; - dot.y += apertureCenterY; - } //End of if apertureType == 1 | == 2 - //If it is a square or rectangle, re-insert on one of the opposite edges - if (apertureType == 3 || apertureType == 4) { - /** The formula for calculating whether a dot appears from the vertical edge (left or right edges) is dependent on the direction of the dot and the ratio of the vertical and horizontal edge lengths. - E.g. - Aperture is 100 px high and 200px wide - Dot is moving 3 px in x direction and 4px in y direction - Weight on vertical edge (sides) = (100/(100+200)) * (|3| / (|3| + |4|)) = 1/7 - Weight on horizontal edge (top or bottom) = (200/(100+200)) * (|4| / (|3| + |4|)) = 8/21 - - The weights above are the ratios to one another. - E.g. (cont.) - Ratio (vertical edge : horizontal edge) == (1/7 : 8/21) - Total probability space = 1/7 + 8/21 = 11/21 - Probability that dot appears on vertical edge = (1/7)/(11/21) = 3/11 - Probability that dot appears on horizontal edge = (8/21)/(11/21) = 8/11 - */ - //Get the absolute values of the latest X and Y moves and store them in variables for easy handling. - var absX = Math.abs(dot.latestXMove); - var absY = Math.abs(dot.latestYMove); - //Calculate the direction weights based on direction the dot was moving - var weightInXDirection = absX / (absX + absY); - var weightInYDirection = absY / (absX + absY); - //Calculate the weight of the edge the dot should appear from, based on direction of dot and ratio of the aperture edges - var weightOnVerticalEdge = (verticalAxis / (verticalAxis + horizontalAxis)) * weightInXDirection; - var weightOnHorizontalEdge = (horizontalAxis / (verticalAxis + horizontalAxis)) * weightInYDirection; - //Generate a bounded random number to determine if the dot should appear on the vertical edge or the horizontal edge - if (weightOnVerticalEdge > - (weightOnHorizontalEdge + weightOnVerticalEdge) * Math.random()) { - //If yes, appear on the left or right edge (vertical edge) - if (dot.latestXMove < 0) { - //If dots move left, appear on right edge - dot.x = apertureCenterX + horizontalAxis; - dot.y = randomNumberBetween(apertureCenterY - verticalAxis, apertureCenterY + verticalAxis); - } - else { - //Else dots move right, so they should appear on the left edge - dot.x = apertureCenterX - horizontalAxis; - dot.y = randomNumberBetween(apertureCenterY - verticalAxis, apertureCenterY + verticalAxis); - } - } - else { - //Else appear on the top or bottom edge (horizontal edge) - if (dot.latestYMove < 0) { - //If dots move upwards, then appear on bottom edge - dot.y = apertureCenterY + verticalAxis; - dot.x = randomNumberBetween(apertureCenterX - horizontalAxis, apertureCenterX + horizontalAxis); - } - else { - //If dots move downwards, then appear on top edge - dot.y = apertureCenterY - verticalAxis; - dot.x = randomNumberBetween(apertureCenterX - horizontalAxis, apertureCenterX + horizontalAxis); - } - } - } //End of apertureType == 3 - return dot; - } //End of reinsertOnOppositeEdge - //Calculate the POSITIVE y value of a point on the edge of the ellipse given an x-value - function yValuePositive(x) { - x = x - apertureCenterX; //Bring it back to the (0,0) center to calculate accurately (ignore the y-coordinate because it is not necessary for calculation) - return (verticalAxis * Math.sqrt(1 - Math.pow(x, 2) / Math.pow(horizontalAxis, 2)) + apertureCenterY); //Calculated the positive y value and added apertureCenterY to recenter it on the screen - } - //Calculate the NEGATIVE y value of a point on the edge of the ellipse given an x-value - function yValueNegative(x) { - x = x - apertureCenterX; //Bring it back to the (0,0) center to calculate accurately (ignore the y-coordinate because it is not necessary for calculation) - return (-verticalAxis * Math.sqrt(1 - Math.pow(x, 2) / Math.pow(horizontalAxis, 2)) + - apertureCenterY); //Calculated the negative y value and added apertureCenterY to recenter it on the screen - } - //Calculate the POSITIVE x value of a point on the edge of the ellipse given a y-value - function xValuePositive(y) { - y = y - apertureCenterY; //Bring it back to the (0,0) center to calculate accurately (ignore the x-coordinate because it is not necessary for calculation) - return (horizontalAxis * Math.sqrt(1 - Math.pow(y, 2) / Math.pow(verticalAxis, 2)) + apertureCenterX); //Calculated the positive x value and added apertureCenterX to recenter it on the screen - } - //Calculate the NEGATIVE x value of a point on the edge of the ellipse given a y-value - function xValueNegative(y) { - y = y - apertureCenterY; //Bring it back to the (0,0) center to calculate accurately (ignore the x-coordinate because it is not necessary for calculation) - return (-horizontalAxis * Math.sqrt(1 - Math.pow(y, 2) / Math.pow(verticalAxis, 2)) + - apertureCenterX); //Calculated the negative x value and added apertureCenterX to recenter it on the screen - } - //Calculate a random x and y coordinate in the ellipse - function resetLocation(dot) { - //For circle and ellipse - if (apertureType == 1 || apertureType == 2) { - var phi = randomNumberBetween(-Math.PI, Math.PI); - var rho = Math.random(); - var x = Math.sqrt(rho) * Math.cos(phi); - var y = Math.sqrt(rho) * Math.sin(phi); - x = x * horizontalAxis + apertureCenterX; - y = y * verticalAxis + apertureCenterY; - dot.x = x; - dot.y = y; - } - //For square and rectangle - else if (apertureType == 3 || apertureType == 4) { - dot.x = randomNumberBetween(apertureCenterX - horizontalAxis, apertureCenterX + horizontalAxis); //Between the left and right edges of the square / rectangle - dot.y = randomNumberBetween(apertureCenterY - verticalAxis, apertureCenterY + verticalAxis); //Between the top and bottom edges of the square / rectangle - } - return dot; - } - //Generates a random number (with decimals) between 2 values - function randomNumberBetween(lowerBound, upperBound) { - return lowerBound + Math.random() * (upperBound - lowerBound); - } - //Function to make the dots move on the canvas - function animateDotMotion() { - //frameRequestID saves a long integer that is the ID of this frame request. The ID is then used to terminate the request below. - var frameRequestID = window.requestAnimationFrame(animate); - //Start to listen to subject's key responses - startKeyboardListener(); - //Delare a timestamp - var previousTimestamp; - function animate() { - //If stopping condition has been reached, then stop the animation - if (stopDotMotion) { - window.cancelAnimationFrame(frameRequestID); //Cancels the frame request - } - //Else continue with another frame request - else { - frameRequestID = window.requestAnimationFrame(animate); //Calls for another frame request - //If the timer has not been started and it is set, then start the timer - if (!timerHasStarted && trial_duration > 0) { - //If the trial duration is set, then set a timer to count down and call the end_trial function when the time is up - //(If the subject did not press a valid keyboard response within the trial duration, then this will end the trial) - timeoutID = window.setTimeout(end_trial, trial_duration); //This timeoutID is then used to cancel the timeout should the subject press a valid key - //The timer has started, so we set the variable to true so it does not start more timers - timerHasStarted = true; - } - updateAndDraw(); //Update and draw each of the dots in their respective apertures - //If this is before the first frame, then start the timestamp - if (previousTimestamp === undefined) { - previousTimestamp = performance.now(); - } - //Else calculate the time and push it into the array - else { - var currentTimeStamp = performance.now(); //Variable to hold current timestamp - frameRate.push(Math.round(currentTimeStamp - previousTimestamp)); //Push the interval into the frameRate array - previousTimestamp = currentTimeStamp; //Reset the timestamp - } - } - } - } - //----RDK Functions End---- - //----General Functions Begin//---- - //Function to assign the default values for the staircase parameters - function assignParameterValue(argument, defaultValue) { - return typeof argument !== "undefined" ? argument : defaultValue; - } - //----General Functions End//---- - //------------------------------------- - //-----------FUNCTIONS END------------- - //------------------------------------- - } -} -RdkPlugin.info = info; - - -//# sourceMappingURL=index.js.map - - -/***/ }), - -/***/ "./node_modules/@jspsych/plugin-fullscreen/dist/index.js": -/*!***************************************************************!*\ - !*** ./node_modules/@jspsych/plugin-fullscreen/dist/index.js ***! - \***************************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ FullscreenPlugin) -/* harmony export */ }); -/* harmony import */ var jspsych__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jspsych */ "./node_modules/jspsych/dist/index.js"); - - -const info = { - name: "fullscreen", - parameters: { - /** If true, experiment will enter fullscreen mode. If false, the browser will exit fullscreen mode. */ - fullscreen_mode: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.BOOL, - pretty_name: "Fullscreen mode", - default: true, - array: false, - }, - /** HTML content to display above the button to enter fullscreen mode */ - message: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.HTML_STRING, - pretty_name: "Message", - default: "

The experiment will switch to full screen mode when you press the button below

", - array: false, - }, - /** The text that appears on the button to enter fullscreen */ - button_label: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.STRING, - pretty_name: "Button label", - default: "Continue", - array: false, - }, - /** The length of time to delay after entering fullscreen mode before ending the trial. */ - delay_after: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.INT, - pretty_name: "Delay after", - default: 1000, - array: false, - }, - }, -}; -/** - * **fullscreen** - * - * jsPsych plugin for toggling fullscreen mode in the browser - * - * @author Josh de Leeuw - * @see {@link https://www.jspsych.org/plugins/jspsych-fullscreen/ fullscreen plugin documentation on jspsych.org} - */ -class FullscreenPlugin { - constructor(jsPsych) { - this.jsPsych = jsPsych; - } - trial(display_element, trial) { - // check if keys are allowed in fullscreen mode - var keyboardNotAllowed = typeof Element !== "undefined" && "ALLOW_KEYBOARD_INPUT" in Element; - if (keyboardNotAllowed) { - // This is Safari, and keyboard events will be disabled. Don't allow fullscreen here. - // do something else? - this.endTrial(display_element, false, trial); - } - else { - if (trial.fullscreen_mode) { - this.showDisplay(display_element, trial); - } - else { - this.exitFullScreen(); - this.endTrial(display_element, true, trial); - } - } - } - showDisplay(display_element, trial) { - display_element.innerHTML = ` - ${trial.message} - - `; - display_element.querySelector("#jspsych-fullscreen-btn").addEventListener("click", () => { - this.enterFullScreen(); - this.endTrial(display_element, true, trial); - }); - } - endTrial(display_element, success, trial) { - display_element.innerHTML = ""; - this.jsPsych.pluginAPI.setTimeout(() => { - var trial_data = { - success: success, - }; - this.jsPsych.finishTrial(trial_data); - }, trial.delay_after); - } - enterFullScreen() { - var element = document.documentElement; - if (element.requestFullscreen) { - element.requestFullscreen(); - } - else if (element["mozRequestFullScreen"]) { - element["mozRequestFullScreen"](); - } - else if (element["webkitRequestFullscreen"]) { - element["webkitRequestFullscreen"](); - } - else if (element["msRequestFullscreen"]) { - element["msRequestFullscreen"](); - } - } - exitFullScreen() { - if (document.fullscreenElement || - document["mozFullScreenElement"] || - document["webkitFullscreenElement"]) { - if (document.exitFullscreen) { - document.exitFullscreen(); - } - else if (document["msExitFullscreen"]) { - document["msExitFullscreen"](); - } - else if (document["mozCancelFullScreen"]) { - document["mozCancelFullScreen"](); - } - else if (document["webkitExitFullscreen"]) { - document["webkitExitFullscreen"](); - } - } - } - simulate(trial, simulation_mode, simulation_options, load_callback) { - if (simulation_mode == "data-only") { - load_callback(); - this.simulate_data_only(trial, simulation_options); - } - if (simulation_mode == "visual") { - this.simulate_visual(trial, simulation_options, load_callback); - } - } - create_simulation_data(trial, simulation_options) { - const default_data = { - success: true, - }; - const data = this.jsPsych.pluginAPI.mergeSimulationData(default_data, simulation_options); - return data; - } - simulate_data_only(trial, simulation_options) { - const data = this.create_simulation_data(trial, simulation_options); - this.jsPsych.finishTrial(data); - } - simulate_visual(trial, simulation_options, load_callback) { - const data = this.create_simulation_data(trial, simulation_options); - const display_element = this.jsPsych.getDisplayElement(); - if (data.success === false) { - this.endTrial(display_element, false, trial); - } - else { - this.trial(display_element, trial); - load_callback(); - this.jsPsych.pluginAPI.clickTarget(display_element.querySelector("#jspsych-fullscreen-btn"), this.jsPsych.randomization.sampleExGaussian(1000, 100, 1 / 200, true)); - } - } -} -FullscreenPlugin.info = info; - - -//# sourceMappingURL=index.js.map - - -/***/ }), - -/***/ "./node_modules/@jspsych/plugin-html-keyboard-response/dist/index.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@jspsych/plugin-html-keyboard-response/dist/index.js ***! - \***************************************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ HtmlKeyboardResponsePlugin) -/* harmony export */ }); -/* harmony import */ var jspsych__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jspsych */ "./node_modules/jspsych/dist/index.js"); - - -const info = { - name: "html-keyboard-response", - parameters: { - /** - * The HTML string to be displayed. - */ - stimulus: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.HTML_STRING, - pretty_name: "Stimulus", - default: undefined, - }, - /** - * Array containing the key(s) the subject is allowed to press to respond to the stimulus. - */ - choices: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.KEYS, - pretty_name: "Choices", - default: "ALL_KEYS", - }, - /** - * Any content here will be displayed below the stimulus. - */ - prompt: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.HTML_STRING, - pretty_name: "Prompt", - default: null, - }, - /** - * How long to show the stimulus. - */ - stimulus_duration: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.INT, - pretty_name: "Stimulus duration", - default: null, - }, - /** - * How long to show trial before it ends. - */ - trial_duration: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.INT, - pretty_name: "Trial duration", - default: null, - }, - /** - * If true, trial will end when subject makes a response. - */ - response_ends_trial: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.BOOL, - pretty_name: "Response ends trial", - default: true, - }, - }, -}; -/** - * **html-keyboard-response** - * - * jsPsych plugin for displaying a stimulus and getting a keyboard response - * - * @author Josh de Leeuw - * @see {@link https://www.jspsych.org/plugins/jspsych-html-keyboard-response/ html-keyboard-response plugin documentation on jspsych.org} - */ -class HtmlKeyboardResponsePlugin { - constructor(jsPsych) { - this.jsPsych = jsPsych; - } - trial(display_element, trial) { - var new_html = '
' + trial.stimulus + "
"; - // add prompt - if (trial.prompt !== null) { - new_html += trial.prompt; - } - // draw - display_element.innerHTML = new_html; - // store response - var response = { - rt: null, - key: null, - }; - // function to end trial when it is time - const end_trial = () => { - // kill any remaining setTimeout handlers - this.jsPsych.pluginAPI.clearAllTimeouts(); - // kill keyboard listeners - if (typeof keyboardListener !== "undefined") { - this.jsPsych.pluginAPI.cancelKeyboardResponse(keyboardListener); - } - // gather the data to store for the trial - var trial_data = { - rt: response.rt, - stimulus: trial.stimulus, - response: response.key, - }; - // clear the display - display_element.innerHTML = ""; - // move on to the next trial - this.jsPsych.finishTrial(trial_data); - }; - // function to handle responses by the subject - var after_response = (info) => { - // after a valid response, the stimulus will have the CSS class 'responded' - // which can be used to provide visual feedback that a response was recorded - display_element.querySelector("#jspsych-html-keyboard-response-stimulus").className += - " responded"; - // only record the first response - if (response.key == null) { - response = info; - } - if (trial.response_ends_trial) { - end_trial(); - } - }; - // start the response listener - if (trial.choices != "NO_KEYS") { - var keyboardListener = this.jsPsych.pluginAPI.getKeyboardResponse({ - callback_function: after_response, - valid_responses: trial.choices, - rt_method: "performance", - persist: false, - allow_held_key: false, - }); - } - // hide stimulus if stimulus_duration is set - if (trial.stimulus_duration !== null) { - this.jsPsych.pluginAPI.setTimeout(() => { - display_element.querySelector("#jspsych-html-keyboard-response-stimulus").style.visibility = "hidden"; - }, trial.stimulus_duration); - } - // end trial if trial_duration is set - if (trial.trial_duration !== null) { - this.jsPsych.pluginAPI.setTimeout(end_trial, trial.trial_duration); - } - } - simulate(trial, simulation_mode, simulation_options, load_callback) { - if (simulation_mode == "data-only") { - load_callback(); - this.simulate_data_only(trial, simulation_options); - } - if (simulation_mode == "visual") { - this.simulate_visual(trial, simulation_options, load_callback); - } - } - create_simulation_data(trial, simulation_options) { - const default_data = { - stimulus: trial.stimulus, - rt: this.jsPsych.randomization.sampleExGaussian(500, 50, 1 / 150, true), - response: this.jsPsych.pluginAPI.getValidKey(trial.choices), - }; - const data = this.jsPsych.pluginAPI.mergeSimulationData(default_data, simulation_options); - this.jsPsych.pluginAPI.ensureSimulationDataConsistency(trial, data); - return data; - } - simulate_data_only(trial, simulation_options) { - const data = this.create_simulation_data(trial, simulation_options); - this.jsPsych.finishTrial(data); - } - simulate_visual(trial, simulation_options, load_callback) { - const data = this.create_simulation_data(trial, simulation_options); - const display_element = this.jsPsych.getDisplayElement(); - this.trial(display_element, trial); - load_callback(); - if (data.rt !== null) { - this.jsPsych.pluginAPI.pressKey(data.response, data.rt); - } - } -} -HtmlKeyboardResponsePlugin.info = info; - - -//# sourceMappingURL=index.js.map - - -/***/ }), - -/***/ "./node_modules/@jspsych/plugin-survey-text/dist/index.js": -/*!****************************************************************!*\ - !*** ./node_modules/@jspsych/plugin-survey-text/dist/index.js ***! - \****************************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ SurveyTextPlugin) -/* harmony export */ }); -/* harmony import */ var jspsych__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jspsych */ "./node_modules/jspsych/dist/index.js"); - - -const info = { - name: "survey-text", - parameters: { - questions: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.COMPLEX, - array: true, - pretty_name: "Questions", - default: undefined, - nested: { - /** Question prompt. */ - prompt: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.HTML_STRING, - pretty_name: "Prompt", - default: undefined, - }, - /** Placeholder text in the response text box. */ - placeholder: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.STRING, - pretty_name: "Placeholder", - default: "", - }, - /** The number of rows for the response text box. */ - rows: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.INT, - pretty_name: "Rows", - default: 1, - }, - /** The number of columns for the response text box. */ - columns: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.INT, - pretty_name: "Columns", - default: 40, - }, - /** Whether or not a response to this question must be given in order to continue. */ - required: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.BOOL, - pretty_name: "Required", - default: false, - }, - /** Name of the question in the trial data. If no name is given, the questions are named Q0, Q1, etc. */ - name: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.STRING, - pretty_name: "Question Name", - default: "", - }, - }, - }, - /** If true, the order of the questions in the 'questions' array will be randomized. */ - randomize_question_order: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.BOOL, - pretty_name: "Randomize Question Order", - default: false, - }, - /** HTML-formatted string to display at top of the page above all of the questions. */ - preamble: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.HTML_STRING, - pretty_name: "Preamble", - default: null, - }, - /** Label of the button to submit responses. */ - button_label: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.STRING, - pretty_name: "Button label", - default: "Continue", - }, - /** Setting this to true will enable browser auto-complete or auto-fill for the form. */ - autocomplete: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.BOOL, - pretty_name: "Allow autocomplete", - default: false, - }, - }, -}; -/** - * **survey-text** - * - * jsPsych plugin for free text response survey questions - * - * @author Josh de Leeuw - * @see {@link https://www.jspsych.org/plugins/jspsych-survey-text/ survey-text plugin documentation on jspsych.org} - */ -class SurveyTextPlugin { - constructor(jsPsych) { - this.jsPsych = jsPsych; - } - trial(display_element, trial) { - for (var i = 0; i < trial.questions.length; i++) { - if (typeof trial.questions[i].rows == "undefined") { - trial.questions[i].rows = 1; - } - } - for (var i = 0; i < trial.questions.length; i++) { - if (typeof trial.questions[i].columns == "undefined") { - trial.questions[i].columns = 40; - } - } - for (var i = 0; i < trial.questions.length; i++) { - if (typeof trial.questions[i].value == "undefined") { - trial.questions[i].value = ""; - } - } - var html = ""; - // show preamble text - if (trial.preamble !== null) { - html += - '
' + - trial.preamble + - "
"; - } - // start form - if (trial.autocomplete) { - html += '
'; - } - else { - html += ''; - } - // generate question order - var question_order = []; - for (var i = 0; i < trial.questions.length; i++) { - question_order.push(i); - } - if (trial.randomize_question_order) { - question_order = this.jsPsych.randomization.shuffle(question_order); - } - // add questions - for (var i = 0; i < trial.questions.length; i++) { - var question = trial.questions[question_order[i]]; - var question_index = question_order[i]; - html += - '
'; - html += '

' + question.prompt + "

"; - var autofocus = i == 0 ? "autofocus" : ""; - var req = question.required ? "required" : ""; - if (question.rows == 1) { - html += - ''; - } - else { - html += - ''; - } - html += "
"; - } - // add submit button - html += - ''; - html += "
"; - display_element.innerHTML = html; - // backup in case autofocus doesn't work - display_element.querySelector("#input-" + question_order[0]).focus(); - display_element.querySelector("#jspsych-survey-text-form").addEventListener("submit", (e) => { - e.preventDefault(); - // measure response time - var endTime = performance.now(); - var response_time = Math.round(endTime - startTime); - // create object to hold responses - var question_data = {}; - for (var index = 0; index < trial.questions.length; index++) { - var id = "Q" + index; - var q_element = document - .querySelector("#jspsych-survey-text-" + index) - .querySelector("textarea, input"); - var val = q_element.value; - var name = q_element.attributes["data-name"].value; - if (name == "") { - name = id; - } - var obje = {}; - obje[name] = val; - Object.assign(question_data, obje); - } - // save data - var trialdata = { - rt: response_time, - response: question_data, - }; - display_element.innerHTML = ""; - // next trial - this.jsPsych.finishTrial(trialdata); - }); - var startTime = performance.now(); - } - simulate(trial, simulation_mode, simulation_options, load_callback) { - if (simulation_mode == "data-only") { - load_callback(); - this.simulate_data_only(trial, simulation_options); - } - if (simulation_mode == "visual") { - this.simulate_visual(trial, simulation_options, load_callback); - } - } - create_simulation_data(trial, simulation_options) { - const question_data = {}; - let rt = 1000; - for (const q of trial.questions) { - const name = q.name ? q.name : `Q${trial.questions.indexOf(q)}`; - const ans_words = q.rows == 1 - ? this.jsPsych.randomization.sampleExponential(0.25) - : this.jsPsych.randomization.randomInt(1, 10) * q.rows; - question_data[name] = this.jsPsych.randomization.randomWords({ - exactly: ans_words, - join: " ", - }); - rt += this.jsPsych.randomization.sampleExGaussian(2000, 400, 0.004, true); - } - const default_data = { - response: question_data, - rt: rt, - }; - const data = this.jsPsych.pluginAPI.mergeSimulationData(default_data, simulation_options); - this.jsPsych.pluginAPI.ensureSimulationDataConsistency(trial, data); - return data; - } - simulate_data_only(trial, simulation_options) { - const data = this.create_simulation_data(trial, simulation_options); - this.jsPsych.finishTrial(data); - } - simulate_visual(trial, simulation_options, load_callback) { - const data = this.create_simulation_data(trial, simulation_options); - const display_element = this.jsPsych.getDisplayElement(); - this.trial(display_element, trial); - load_callback(); - const answers = Object.entries(data.response).map((x) => { - return x[1]; - }); - for (let i = 0; i < answers.length; i++) { - this.jsPsych.pluginAPI.fillTextInput(display_element.querySelector(`#input-${i}`), answers[i], ((data.rt - 1000) / answers.length) * (i + 1)); - } - this.jsPsych.pluginAPI.clickTarget(display_element.querySelector("#jspsych-survey-text-next"), data.rt); - } -} -SurveyTextPlugin.info = info; - - -//# sourceMappingURL=index.js.map - - -/***/ }), - -/***/ "./node_modules/@jspsych/plugin-video-keyboard-response/dist/index.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@jspsych/plugin-video-keyboard-response/dist/index.js ***! - \****************************************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ VideoKeyboardResponsePlugin) -/* harmony export */ }); -/* harmony import */ var jspsych__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jspsych */ "./node_modules/jspsych/dist/index.js"); - - -const info = { - name: "video-keyboard-response", - parameters: { - /** Array of the video file(s) to play. Video can be provided in multiple file formats for better cross-browser support. */ - stimulus: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.VIDEO, - pretty_name: "Video", - default: undefined, - array: true, - }, - /** Array containing the key(s) the subject is allowed to press to respond to the stimulus. */ - choices: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.KEYS, - pretty_name: "Choices", - default: "ALL_KEYS", - }, - /** Any content here will be displayed below the stimulus. */ - prompt: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.HTML_STRING, - pretty_name: "Prompt", - default: null, - }, - /** The width of the video in pixels. */ - width: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.INT, - pretty_name: "Width", - default: "", - }, - /** The height of the video display in pixels. */ - height: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.INT, - pretty_name: "Height", - default: "", - }, - /** If true, the video will begin playing as soon as it has loaded. */ - autoplay: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.BOOL, - pretty_name: "Autoplay", - default: true, - }, - /** If true, the subject will be able to pause the video or move the playback to any point in the video. */ - controls: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.BOOL, - pretty_name: "Controls", - default: false, - }, - /** Time to start the clip. If null (default), video will start at the beginning of the file. */ - start: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.FLOAT, - pretty_name: "Start", - default: null, - }, - /** Time to stop the clip. If null (default), video will stop at the end of the file. */ - stop: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.FLOAT, - pretty_name: "Stop", - default: null, - }, - /** The playback rate of the video. 1 is normal, <1 is slower, >1 is faster. */ - rate: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.FLOAT, - pretty_name: "Rate", - default: 1, - }, - /** If true, the trial will end immediately after the video finishes playing. */ - trial_ends_after_video: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.BOOL, - pretty_name: "End trial after video finishes", - default: false, - }, - /** How long to show trial before it ends. */ - trial_duration: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.INT, - pretty_name: "Trial duration", - default: null, - }, - /** If true, the trial will end when subject makes a response. */ - response_ends_trial: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.BOOL, - pretty_name: "Response ends trial", - default: true, - }, - /** If true, then responses are allowed while the video is playing. If false, then the video must finish playing before a response is accepted. */ - response_allowed_while_playing: { - type: jspsych__WEBPACK_IMPORTED_MODULE_0__.ParameterType.BOOL, - pretty_name: "Response allowed while playing", - default: true, - }, - }, -}; -/** - * **video-keyboard-response** - * - * jsPsych plugin for playing a video file and getting a keyboard response - * - * @author Josh de Leeuw - * @see {@link https://www.jspsych.org/plugins/jspsych-video-keyboard-response/ video-keyboard-response plugin documentation on jspsych.org} - */ -class VideoKeyboardResponsePlugin { - constructor(jsPsych) { - this.jsPsych = jsPsych; - } - trial(display_element, trial) { - // catch mistake where stimuli are not an array - if (!Array.isArray(trial.stimulus)) { - throw new Error(` - The stimulus property for the video-keyboard-response plugin must be an array - of files. See https://www.jspsych.org/latest/plugins/video-keyboard-response/#parameters - `); - } - // setup stimulus - var video_html = "
"; - video_html += '"; - video_html += "
"; - // add prompt if there is one - if (trial.prompt !== null) { - video_html += trial.prompt; - } - display_element.innerHTML = video_html; - var video_element = display_element.querySelector("#jspsych-video-keyboard-response-stimulus"); - if (video_preload_blob) { - video_element.src = video_preload_blob; - } - video_element.onended = () => { - if (trial.trial_ends_after_video) { - end_trial(); - } - if (trial.response_allowed_while_playing == false && !trial.trial_ends_after_video) { - // start keyboard listener - this.jsPsych.pluginAPI.getKeyboardResponse({ - callback_function: after_response, - valid_responses: trial.choices, - rt_method: "performance", - persist: false, - allow_held_key: false, - }); - } - }; - video_element.playbackRate = trial.rate; - // if video start time is specified, hide the video and set the starting time - // before showing and playing, so that the video doesn't automatically show the first frame - if (trial.start !== null) { - video_element.pause(); - video_element.onseeked = () => { - video_element.style.visibility = "visible"; - video_element.muted = false; - if (trial.autoplay) { - video_element.play(); - } - else { - video_element.pause(); - } - video_element.onseeked = () => { }; - }; - video_element.onplaying = () => { - video_element.currentTime = trial.start; - video_element.onplaying = () => { }; - }; - // fix for iOS/MacOS browsers: videos aren't seekable until they start playing, so need to hide/mute, play, - // change current time, then show/unmute - video_element.muted = true; - video_element.play(); - } - let stopped = false; - if (trial.stop !== null) { - video_element.addEventListener("timeupdate", (e) => { - var currenttime = video_element.currentTime; - if (currenttime >= trial.stop) { - if (!trial.response_allowed_while_playing) { - this.jsPsych.pluginAPI.getKeyboardResponse({ - callback_function: after_response, - valid_responses: trial.choices, - rt_method: "performance", - persist: false, - allow_held_key: false, - }); - } - video_element.pause(); - if (trial.trial_ends_after_video && !stopped) { - // this is to prevent end_trial from being called twice, because the timeupdate event - // can fire in quick succession - stopped = true; - end_trial(); - } - } - }); - } - // store response - var response = { - rt: null, - key: null, - }; - // function to end trial when it is time - const end_trial = () => { - // kill any remaining setTimeout handlers - this.jsPsych.pluginAPI.clearAllTimeouts(); - // kill keyboard listeners - this.jsPsych.pluginAPI.cancelAllKeyboardResponses(); - // stop the video file if it is playing - // remove end event listeners if they exist - display_element - .querySelector("#jspsych-video-keyboard-response-stimulus") - .pause(); - display_element.querySelector("#jspsych-video-keyboard-response-stimulus").onended = () => { }; - // gather the data to store for the trial - var trial_data = { - rt: response.rt, - stimulus: trial.stimulus, - response: response.key, - }; - // clear the display - display_element.innerHTML = ""; - // move on to the next trial - this.jsPsych.finishTrial(trial_data); - }; - // function to handle responses by the subject - var after_response = (info) => { - // after a valid response, the stimulus will have the CSS class 'responded' - // which can be used to provide visual feedback that a response was recorded - display_element.querySelector("#jspsych-video-keyboard-response-stimulus").className += - " responded"; - // only record the first response - if (response.key == null) { - response = info; - } - if (trial.response_ends_trial) { - end_trial(); - } - }; - // start the response listener - if (trial.choices != "NO_KEYS" && trial.response_allowed_while_playing) { - this.jsPsych.pluginAPI.getKeyboardResponse({ - callback_function: after_response, - valid_responses: trial.choices, - rt_method: "performance", - persist: false, - allow_held_key: false, - }); - } - // end trial if time limit is set - if (trial.trial_duration !== null) { - this.jsPsych.pluginAPI.setTimeout(end_trial, trial.trial_duration); - } - } - simulate(trial, simulation_mode, simulation_options, load_callback) { - if (simulation_mode == "data-only") { - load_callback(); - this.simulate_data_only(trial, simulation_options); - } - if (simulation_mode == "visual") { - this.simulate_visual(trial, simulation_options, load_callback); - } - } - simulate_data_only(trial, simulation_options) { - const data = this.create_simulation_data(trial, simulation_options); - this.jsPsych.finishTrial(data); - } - simulate_visual(trial, simulation_options, load_callback) { - const data = this.create_simulation_data(trial, simulation_options); - const display_element = this.jsPsych.getDisplayElement(); - this.trial(display_element, trial); - load_callback(); - const video_element = display_element.querySelector("#jspsych-video-button-response-stimulus"); - const respond = () => { - if (data.rt !== null) { - this.jsPsych.pluginAPI.pressKey(data.response, data.rt); - } - }; - if (!trial.response_allowed_while_playing) { - video_element.addEventListener("ended", respond); - } - else { - respond(); - } - } - create_simulation_data(trial, simulation_options) { - const default_data = { - stimulus: trial.stimulus, - rt: this.jsPsych.randomization.sampleExGaussian(500, 50, 1 / 150, true), - response: this.jsPsych.pluginAPI.getValidKey(trial.choices), - }; - const data = this.jsPsych.pluginAPI.mergeSimulationData(default_data, simulation_options); - this.jsPsych.pluginAPI.ensureSimulationDataConsistency(trial, data); - return data; - } -} -VideoKeyboardResponsePlugin.info = info; - - -//# sourceMappingURL=index.js.map - - -/***/ }), - -/***/ "./node_modules/jspsych/dist/index.js": -/*!********************************************!*\ - !*** ./node_modules/jspsych/dist/index.js ***! - \********************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "JsPsych": () => (/* binding */ JsPsych), -/* harmony export */ "ParameterType": () => (/* binding */ ParameterType), -/* harmony export */ "initJsPsych": () => (/* binding */ initJsPsych), -/* harmony export */ "universalPluginParameters": () => (/* binding */ universalPluginParameters) -/* harmony export */ }); -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ - -function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} - -var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; - -// Gets all non-builtin properties up the prototype chain -const getAllProperties = object => { - const properties = new Set(); - - do { - for (const key of Reflect.ownKeys(object)) { - properties.add([object, key]); - } - } while ((object = Reflect.getPrototypeOf(object)) && object !== Object.prototype); - - return properties; -}; - -var autoBind = (self, {include, exclude} = {}) => { - const filter = key => { - const match = pattern => typeof pattern === 'string' ? key === pattern : pattern.test(key); - - if (include) { - return include.some(match); - } - - if (exclude) { - return !exclude.some(match); - } - - return true; - }; - - for (const [object, key] of getAllProperties(self.constructor.prototype)) { - if (key === 'constructor' || !filter(key)) { - continue; - } - - const descriptor = Reflect.getOwnPropertyDescriptor(object, key); - if (descriptor && typeof descriptor.value === 'function') { - self[key] = self[key].bind(self); - } - } - - return self; -}; - -var version = "7.2.1"; - -class MigrationError extends Error { - constructor(message = "The global `jsPsych` variable is no longer available in jsPsych v7.") { - super(`${message} Please follow the migration guide at https://www.jspsych.org/7.0/support/migration-v7/ to update your experiment.`); - this.name = "MigrationError"; - } -} -// Define a global jsPsych object to handle invocations on it with migration errors -window.jsPsych = { - get init() { - throw new MigrationError("`jsPsych.init()` was replaced by `initJsPsych()` in jsPsych v7."); - }, - get data() { - throw new MigrationError(); - }, - get randomization() { - throw new MigrationError(); - }, - get turk() { - throw new MigrationError(); - }, - get pluginAPI() { - throw new MigrationError(); - }, - get ALL_KEYS() { - throw new MigrationError('jsPsych.ALL_KEYS was replaced by the "ALL_KEYS" string in jsPsych v7.'); - }, - get NO_KEYS() { - throw new MigrationError('jsPsych.NO_KEYS was replaced by the "NO_KEYS" string in jsPsych v7.'); - }, -}; - -/** - * Finds all of the unique items in an array. - * @param arr The array to extract unique values from - * @returns An array with one copy of each unique item in `arr` - */ -function unique(arr) { - return [...new Set(arr)]; -} -function deepCopy(obj) { - if (!obj) - return obj; - let out; - if (Array.isArray(obj)) { - out = []; - for (const x of obj) { - out.push(deepCopy(x)); - } - return out; - } - else if (typeof obj === "object" && obj !== null) { - out = {}; - for (const key in obj) { - if (obj.hasOwnProperty(key)) { - out[key] = deepCopy(obj[key]); - } - } - return out; - } - else { - return obj; - } -} - -var utils = /*#__PURE__*/Object.freeze({ - __proto__: null, - unique: unique, - deepCopy: deepCopy -}); - -class DataColumn { - constructor(values = []) { - this.values = values; - } - sum() { - let s = 0; - for (const v of this.values) { - s += v; - } - return s; - } - mean() { - return this.sum() / this.count(); - } - median() { - if (this.values.length === 0) { - return undefined; - } - const numbers = this.values.slice(0).sort(function (a, b) { - return a - b; - }); - const middle = Math.floor(numbers.length / 2); - const isEven = numbers.length % 2 === 0; - return isEven ? (numbers[middle] + numbers[middle - 1]) / 2 : numbers[middle]; - } - min() { - return Math.min.apply(null, this.values); - } - max() { - return Math.max.apply(null, this.values); - } - count() { - return this.values.length; - } - variance() { - const mean = this.mean(); - let sum_square_error = 0; - for (const x of this.values) { - sum_square_error += Math.pow(x - mean, 2); - } - const mse = sum_square_error / (this.values.length - 1); - return mse; - } - sd() { - const mse = this.variance(); - const rmse = Math.sqrt(mse); - return rmse; - } - frequencies() { - const unique = {}; - for (const x of this.values) { - if (typeof unique[x] === "undefined") { - unique[x] = 1; - } - else { - unique[x]++; - } - } - return unique; - } - all(eval_fn) { - for (const x of this.values) { - if (!eval_fn(x)) { - return false; - } - } - return true; - } - subset(eval_fn) { - const out = []; - for (const x of this.values) { - if (eval_fn(x)) { - out.push(x); - } - } - return new DataColumn(out); - } -} - -// private function to save text file on local drive -function saveTextToFile(textstr, filename) { - const blobToSave = new Blob([textstr], { - type: "text/plain", - }); - let blobURL = ""; - if (typeof window.webkitURL !== "undefined") { - blobURL = window.webkitURL.createObjectURL(blobToSave); - } - else { - blobURL = window.URL.createObjectURL(blobToSave); - } - const link = document.createElement("a"); - link.id = "jspsych-download-as-text-link"; - link.style.display = "none"; - link.download = filename; - link.href = blobURL; - link.click(); -} -// this function based on code suggested by StackOverflow users: -// http://stackoverflow.com/users/64741/zachary -// http://stackoverflow.com/users/317/joseph-sturtevant -function JSON2CSV(objArray) { - const array = typeof objArray != "object" ? JSON.parse(objArray) : objArray; - let line = ""; - let result = ""; - const columns = []; - for (const row of array) { - for (const key in row) { - let keyString = key + ""; - keyString = '"' + keyString.replace(/"/g, '""') + '",'; - if (!columns.includes(key)) { - columns.push(key); - line += keyString; - } - } - } - line = line.slice(0, -1); // removes last comma - result += line + "\r\n"; - for (const row of array) { - line = ""; - for (const col of columns) { - let value = typeof row[col] === "undefined" ? "" : row[col]; - if (typeof value == "object") { - value = JSON.stringify(value); - } - const valueString = value + ""; - line += '"' + valueString.replace(/"/g, '""') + '",'; - } - line = line.slice(0, -1); - result += line + "\r\n"; - } - return result; -} -// this function is modified from StackOverflow: -// http://stackoverflow.com/posts/3855394 -function getQueryString() { - const a = window.location.search.substr(1).split("&"); - const b = {}; - for (let i = 0; i < a.length; ++i) { - const p = a[i].split("=", 2); - if (p.length == 1) - b[p[0]] = ""; - else - b[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " ")); - } - return b; -} - -class DataCollection { - constructor(data = []) { - this.trials = data; - } - push(new_data) { - this.trials.push(new_data); - return this; - } - join(other_data_collection) { - this.trials = this.trials.concat(other_data_collection.values()); - return this; - } - top() { - if (this.trials.length <= 1) { - return this; - } - else { - return new DataCollection([this.trials[this.trials.length - 1]]); - } - } - /** - * Queries the first n elements in a collection of trials. - * - * @param n A positive integer of elements to return. A value of - * n that is less than 1 will throw an error. - * - * @return First n objects of a collection of trials. If fewer than - * n trials are available, the trials.length elements will - * be returned. - * - */ - first(n = 1) { - if (n < 1) { - throw `You must query with a positive nonzero integer. Please use a - different value for n.`; - } - if (this.trials.length === 0) - return new DataCollection(); - if (n > this.trials.length) - n = this.trials.length; - return new DataCollection(this.trials.slice(0, n)); - } - /** - * Queries the last n elements in a collection of trials. - * - * @param n A positive integer of elements to return. A value of - * n that is less than 1 will throw an error. - * - * @return Last n objects of a collection of trials. If fewer than - * n trials are available, the trials.length elements will - * be returned. - * - */ - last(n = 1) { - if (n < 1) { - throw `You must query with a positive nonzero integer. Please use a - different value for n.`; - } - if (this.trials.length === 0) - return new DataCollection(); - if (n > this.trials.length) - n = this.trials.length; - return new DataCollection(this.trials.slice(this.trials.length - n, this.trials.length)); - } - values() { - return this.trials; - } - count() { - return this.trials.length; - } - readOnly() { - return new DataCollection(deepCopy(this.trials)); - } - addToAll(properties) { - for (const trial of this.trials) { - Object.assign(trial, properties); - } - return this; - } - addToLast(properties) { - if (this.trials.length != 0) { - Object.assign(this.trials[this.trials.length - 1], properties); - } - return this; - } - filter(filters) { - // [{p1: v1, p2:v2}, {p1:v2}] - // {p1: v1} - let f; - if (!Array.isArray(filters)) { - f = deepCopy([filters]); - } - else { - f = deepCopy(filters); - } - const filtered_data = []; - for (const trial of this.trials) { - let keep = false; - for (const filter of f) { - let match = true; - for (const key of Object.keys(filter)) { - if (typeof trial[key] !== "undefined" && trial[key] === filter[key]) ; - else { - match = false; - } - } - if (match) { - keep = true; - break; - } // can break because each filter is OR. - } - if (keep) { - filtered_data.push(trial); - } - } - return new DataCollection(filtered_data); - } - filterCustom(fn) { - return new DataCollection(this.trials.filter(fn)); - } - filterColumns(columns) { - return new DataCollection(this.trials.map((trial) => Object.fromEntries(columns.filter((key) => key in trial).map((key) => [key, trial[key]])))); - } - select(column) { - const values = []; - for (const trial of this.trials) { - if (typeof trial[column] !== "undefined") { - values.push(trial[column]); - } - } - return new DataColumn(values); - } - ignore(columns) { - if (!Array.isArray(columns)) { - columns = [columns]; - } - const o = deepCopy(this.trials); - for (const trial of o) { - for (const delete_key of columns) { - delete trial[delete_key]; - } - } - return new DataCollection(o); - } - uniqueNames() { - const names = []; - for (const trial of this.trials) { - for (const key of Object.keys(trial)) { - if (!names.includes(key)) { - names.push(key); - } - } - } - return names; - } - csv() { - return JSON2CSV(this.trials); - } - json(pretty = false) { - if (pretty) { - return JSON.stringify(this.trials, null, "\t"); - } - return JSON.stringify(this.trials); - } - localSave(format, filename) { - format = format.toLowerCase(); - let data_string; - if (format === "json") { - data_string = this.json(); - } - else if (format === "csv") { - data_string = this.csv(); - } - else { - throw new Error('Invalid format specified for localSave. Must be "json" or "csv".'); - } - saveTextToFile(data_string, filename); - } -} - -class JsPsychData { - constructor(jsPsych) { - this.jsPsych = jsPsych; - // data properties for all trials - this.dataProperties = {}; - this.reset(); - } - reset() { - this.allData = new DataCollection(); - this.interactionData = new DataCollection(); - } - get() { - return this.allData; - } - getInteractionData() { - return this.interactionData; - } - write(data_object) { - const progress = this.jsPsych.getProgress(); - const trial = this.jsPsych.getCurrentTrial(); - //var trial_opt_data = typeof trial.data == 'function' ? trial.data() : trial.data; - const default_data = { - trial_type: trial.type.info.name, - trial_index: progress.current_trial_global, - time_elapsed: this.jsPsych.getTotalTime(), - internal_node_id: this.jsPsych.getCurrentTimelineNodeID(), - }; - this.allData.push(Object.assign(Object.assign(Object.assign(Object.assign({}, data_object), trial.data), default_data), this.dataProperties)); - } - addProperties(properties) { - // first, add the properties to all data that's already stored - this.allData.addToAll(properties); - // now add to list so that it gets appended to all future data - this.dataProperties = Object.assign({}, this.dataProperties, properties); - } - addDataToLastTrial(data) { - this.allData.addToLast(data); - } - getDataByTimelineNode(node_id) { - return this.allData.filterCustom((x) => x.internal_node_id.slice(0, node_id.length) === node_id); - } - getLastTrialData() { - return this.allData.top(); - } - getLastTimelineData() { - const lasttrial = this.getLastTrialData(); - const node_id = lasttrial.select("internal_node_id").values[0]; - if (typeof node_id === "undefined") { - return new DataCollection(); - } - else { - const parent_node_id = node_id.substr(0, node_id.lastIndexOf("-")); - const lastnodedata = this.getDataByTimelineNode(parent_node_id); - return lastnodedata; - } - } - displayData(format = "json") { - format = format.toLowerCase(); - if (format != "json" && format != "csv") { - console.log("Invalid format declared for displayData function. Using json as default."); - format = "json"; - } - const data_string = format === "json" ? this.allData.json(true) : this.allData.csv(); - const display_element = this.jsPsych.getDisplayElement(); - display_element.innerHTML = '
';
-        document.getElementById("jspsych-data-display").textContent = data_string;
-    }
-    urlVariables() {
-        if (typeof this.query_string == "undefined") {
-            this.query_string = getQueryString();
-        }
-        return this.query_string;
-    }
-    getURLVariable(whichvar) {
-        return this.urlVariables()[whichvar];
-    }
-    createInteractionListeners() {
-        // blur event capture
-        window.addEventListener("blur", () => {
-            const data = {
-                event: "blur",
-                trial: this.jsPsych.getProgress().current_trial_global,
-                time: this.jsPsych.getTotalTime(),
-            };
-            this.interactionData.push(data);
-            this.jsPsych.getInitSettings().on_interaction_data_update(data);
-        });
-        // focus event capture
-        window.addEventListener("focus", () => {
-            const data = {
-                event: "focus",
-                trial: this.jsPsych.getProgress().current_trial_global,
-                time: this.jsPsych.getTotalTime(),
-            };
-            this.interactionData.push(data);
-            this.jsPsych.getInitSettings().on_interaction_data_update(data);
-        });
-        // fullscreen change capture
-        const fullscreenchange = () => {
-            const data = {
-                event: 
-                // @ts-expect-error
-                document.isFullScreen ||
-                    // @ts-expect-error
-                    document.webkitIsFullScreen ||
-                    // @ts-expect-error
-                    document.mozIsFullScreen ||
-                    document.fullscreenElement
-                    ? "fullscreenenter"
-                    : "fullscreenexit",
-                trial: this.jsPsych.getProgress().current_trial_global,
-                time: this.jsPsych.getTotalTime(),
-            };
-            this.interactionData.push(data);
-            this.jsPsych.getInitSettings().on_interaction_data_update(data);
-        };
-        document.addEventListener("fullscreenchange", fullscreenchange);
-        document.addEventListener("mozfullscreenchange", fullscreenchange);
-        document.addEventListener("webkitfullscreenchange", fullscreenchange);
-    }
-    // public methods for testing purposes. not recommended for use.
-    _customInsert(data) {
-        this.allData = new DataCollection(data);
-    }
-    _fullreset() {
-        this.reset();
-        this.dataProperties = {};
-    }
-}
-
-class HardwareAPI {
-    constructor() {
-        /**
-         * Indicates whether this instance of jspsych has opened a hardware connection through our browser
-         * extension
-         **/
-        this.hardwareConnected = false;
-        //it might be useful to open up a line of communication from the extension back to this page
-        //script, again, this will have to pass through DOM events. For now speed is of no concern so I
-        //will use jQuery
-        document.addEventListener("jspsych-activate", (evt) => {
-            this.hardwareConnected = true;
-        });
-    }
-    /**
-     * Allows communication with user hardware through our custom Google Chrome extension + native C++ program
-     * @param		mess	The message to be passed to our extension, see its documentation for the expected members of this object.
-     * @author	Daniel Rivas
-     *
-     */
-    hardware(mess) {
-        //since Chrome extension content-scripts do not share the javascript environment with the page
-        //script that loaded jspsych, we will need to use hacky methods like communicating through DOM
-        //events.
-        const jspsychEvt = new CustomEvent("jspsych", { detail: mess });
-        document.dispatchEvent(jspsychEvt);
-        //And voila! it will be the job of the content script injected by the extension to listen for
-        //the event and do the appropriate actions.
-    }
-}
-
-class KeyboardListenerAPI {
-    constructor(getRootElement, areResponsesCaseSensitive = false, minimumValidRt = 0) {
-        this.getRootElement = getRootElement;
-        this.areResponsesCaseSensitive = areResponsesCaseSensitive;
-        this.minimumValidRt = minimumValidRt;
-        this.listeners = new Set();
-        this.heldKeys = new Set();
-        this.areRootListenersRegistered = false;
-        autoBind(this);
-        this.registerRootListeners();
-    }
-    /**
-     * If not previously done and `this.getRootElement()` returns an element, adds the root key
-     * listeners to that element.
-     */
-    registerRootListeners() {
-        if (!this.areRootListenersRegistered) {
-            const rootElement = this.getRootElement();
-            if (rootElement) {
-                rootElement.addEventListener("keydown", this.rootKeydownListener);
-                rootElement.addEventListener("keyup", this.rootKeyupListener);
-                this.areRootListenersRegistered = true;
-            }
-        }
-    }
-    rootKeydownListener(e) {
-        // Iterate over a static copy of the listeners set because listeners might add other listeners
-        // that we do not want to be included in the loop
-        for (const listener of Array.from(this.listeners)) {
-            listener(e);
-        }
-        this.heldKeys.add(this.toLowerCaseIfInsensitive(e.key));
-    }
-    toLowerCaseIfInsensitive(string) {
-        return this.areResponsesCaseSensitive ? string : string.toLowerCase();
-    }
-    rootKeyupListener(e) {
-        this.heldKeys.delete(this.toLowerCaseIfInsensitive(e.key));
-    }
-    isResponseValid(validResponses, allowHeldKey, key) {
-        // check if key was already held down
-        if (!allowHeldKey && this.heldKeys.has(key)) {
-            return false;
-        }
-        if (validResponses === "ALL_KEYS") {
-            return true;
-        }
-        if (validResponses === "NO_KEYS") {
-            return false;
-        }
-        return validResponses.includes(key);
-    }
-    getKeyboardResponse({ callback_function, valid_responses = "ALL_KEYS", rt_method = "performance", persist, audio_context, audio_context_start_time, allow_held_key = false, minimum_valid_rt = this.minimumValidRt, }) {
-        if (rt_method !== "performance" && rt_method !== "audio") {
-            console.log('Invalid RT method specified in getKeyboardResponse. Defaulting to "performance" method.');
-            rt_method = "performance";
-        }
-        const usePerformanceRt = rt_method === "performance";
-        const startTime = usePerformanceRt ? performance.now() : audio_context_start_time * 1000;
-        this.registerRootListeners();
-        if (!this.areResponsesCaseSensitive && typeof valid_responses !== "string") {
-            valid_responses = valid_responses.map((r) => r.toLowerCase());
-        }
-        const listener = (e) => {
-            const rt = Math.round((rt_method == "performance" ? performance.now() : audio_context.currentTime * 1000) -
-                startTime);
-            if (rt < minimum_valid_rt) {
-                return;
-            }
-            const key = this.toLowerCaseIfInsensitive(e.key);
-            if (this.isResponseValid(valid_responses, allow_held_key, key)) {
-                // if this is a valid response, then we don't want the key event to trigger other actions
-                // like scrolling via the spacebar.
-                e.preventDefault();
-                if (!persist) {
-                    // remove keyboard listener if it exists
-                    this.cancelKeyboardResponse(listener);
-                }
-                callback_function({ key, rt });
-            }
-        };
-        this.listeners.add(listener);
-        return listener;
-    }
-    cancelKeyboardResponse(listener) {
-        // remove the listener from the set of listeners if it is contained
-        this.listeners.delete(listener);
-    }
-    cancelAllKeyboardResponses() {
-        this.listeners.clear();
-    }
-    compareKeys(key1, key2) {
-        if ((typeof key1 !== "string" && key1 !== null) ||
-            (typeof key2 !== "string" && key2 !== null)) {
-            console.error("Error in jsPsych.pluginAPI.compareKeys: arguments must be key strings or null.");
-            return undefined;
-        }
-        if (typeof key1 === "string" && typeof key2 === "string") {
-            // if both values are strings, then check whether or not letter case should be converted before comparing (case_sensitive_responses in initJsPsych)
-            return this.areResponsesCaseSensitive
-                ? key1 === key2
-                : key1.toLowerCase() === key2.toLowerCase();
-        }
-        return key1 === null && key2 === null;
-    }
-}
-
-/**
- * Parameter types for plugins
- */
-var ParameterType;
-(function (ParameterType) {
-    ParameterType[ParameterType["BOOL"] = 0] = "BOOL";
-    ParameterType[ParameterType["STRING"] = 1] = "STRING";
-    ParameterType[ParameterType["INT"] = 2] = "INT";
-    ParameterType[ParameterType["FLOAT"] = 3] = "FLOAT";
-    ParameterType[ParameterType["FUNCTION"] = 4] = "FUNCTION";
-    ParameterType[ParameterType["KEY"] = 5] = "KEY";
-    ParameterType[ParameterType["KEYS"] = 6] = "KEYS";
-    ParameterType[ParameterType["SELECT"] = 7] = "SELECT";
-    ParameterType[ParameterType["HTML_STRING"] = 8] = "HTML_STRING";
-    ParameterType[ParameterType["IMAGE"] = 9] = "IMAGE";
-    ParameterType[ParameterType["AUDIO"] = 10] = "AUDIO";
-    ParameterType[ParameterType["VIDEO"] = 11] = "VIDEO";
-    ParameterType[ParameterType["OBJECT"] = 12] = "OBJECT";
-    ParameterType[ParameterType["COMPLEX"] = 13] = "COMPLEX";
-    ParameterType[ParameterType["TIMELINE"] = 14] = "TIMELINE";
-})(ParameterType || (ParameterType = {}));
-const universalPluginParameters = {
-    /**
-     * Data to add to this trial (key-value pairs)
-     */
-    data: {
-        type: ParameterType.OBJECT,
-        pretty_name: "Data",
-        default: {},
-    },
-    /**
-     * Function to execute when trial begins
-     */
-    on_start: {
-        type: ParameterType.FUNCTION,
-        pretty_name: "On start",
-        default: function () {
-            return;
-        },
-    },
-    /**
-     * Function to execute when trial is finished
-     */
-    on_finish: {
-        type: ParameterType.FUNCTION,
-        pretty_name: "On finish",
-        default: function () {
-            return;
-        },
-    },
-    /**
-     * Function to execute after the trial has loaded
-     */
-    on_load: {
-        type: ParameterType.FUNCTION,
-        pretty_name: "On load",
-        default: function () {
-            return;
-        },
-    },
-    /**
-     * Length of gap between the end of this trial and the start of the next trial
-     */
-    post_trial_gap: {
-        type: ParameterType.INT,
-        pretty_name: "Post trial gap",
-        default: null,
-    },
-    /**
-     * A list of CSS classes to add to the jsPsych display element for the duration of this trial
-     */
-    css_classes: {
-        type: ParameterType.STRING,
-        pretty_name: "Custom CSS classes",
-        default: null,
-    },
-    /**
-     * Options to control simulation mode for the trial.
-     */
-    simulation_options: {
-        type: ParameterType.COMPLEX,
-        default: null,
-    },
-};
-
-const preloadParameterTypes = [
-    ParameterType.AUDIO,
-    ParameterType.IMAGE,
-    ParameterType.VIDEO,
-];
-class MediaAPI {
-    constructor(useWebaudio, webaudioContext) {
-        this.useWebaudio = useWebaudio;
-        this.webaudioContext = webaudioContext;
-        // video //
-        this.video_buffers = {};
-        // audio //
-        this.context = null;
-        this.audio_buffers = [];
-        // preloading stimuli //
-        this.preload_requests = [];
-        this.img_cache = {};
-        this.preloadMap = new Map();
-        this.microphone_recorder = null;
-    }
-    getVideoBuffer(videoID) {
-        return this.video_buffers[videoID];
-    }
-    initAudio() {
-        this.context = this.useWebaudio ? this.webaudioContext : null;
-    }
-    audioContext() {
-        if (this.context !== null) {
-            if (this.context.state !== "running") {
-                this.context.resume();
-            }
-        }
-        return this.context;
-    }
-    getAudioBuffer(audioID) {
-        return new Promise((resolve, reject) => {
-            // check whether audio file already preloaded
-            if (typeof this.audio_buffers[audioID] == "undefined" ||
-                this.audio_buffers[audioID] == "tmp") {
-                // if audio is not already loaded, try to load it
-                this.preloadAudio([audioID], () => {
-                    resolve(this.audio_buffers[audioID]);
-                }, () => { }, (e) => {
-                    reject(e.error);
-                });
-            }
-            else {
-                // audio is already loaded
-                resolve(this.audio_buffers[audioID]);
-            }
-        });
-    }
-    preloadAudio(files, callback_complete = () => { }, callback_load = (filepath) => { }, callback_error = (error_msg) => { }) {
-        files = unique(files.flat());
-        let n_loaded = 0;
-        if (files.length == 0) {
-            callback_complete();
-            return;
-        }
-        const load_audio_file_webaudio = (source, count = 1) => {
-            const request = new XMLHttpRequest();
-            request.open("GET", source, true);
-            request.responseType = "arraybuffer";
-            request.onload = () => {
-                this.context.decodeAudioData(request.response, (buffer) => {
-                    this.audio_buffers[source] = buffer;
-                    n_loaded++;
-                    callback_load(source);
-                    if (n_loaded == files.length) {
-                        callback_complete();
-                    }
-                }, (e) => {
-                    callback_error({ source: source, error: e });
-                });
-            };
-            request.onerror = function (e) {
-                let err = e;
-                if (this.status == 404) {
-                    err = "404";
-                }
-                callback_error({ source: source, error: err });
-            };
-            request.onloadend = function (e) {
-                if (this.status == 404) {
-                    callback_error({ source: source, error: "404" });
-                }
-            };
-            request.send();
-            this.preload_requests.push(request);
-        };
-        const load_audio_file_html5audio = (source, count = 1) => {
-            const audio = new Audio();
-            const handleCanPlayThrough = () => {
-                this.audio_buffers[source] = audio;
-                n_loaded++;
-                callback_load(source);
-                if (n_loaded == files.length) {
-                    callback_complete();
-                }
-                audio.removeEventListener("canplaythrough", handleCanPlayThrough);
-            };
-            audio.addEventListener("canplaythrough", handleCanPlayThrough);
-            audio.addEventListener("error", function handleError(e) {
-                callback_error({ source: audio.src, error: e });
-                audio.removeEventListener("error", handleError);
-            });
-            audio.addEventListener("abort", function handleAbort(e) {
-                callback_error({ source: audio.src, error: e });
-                audio.removeEventListener("abort", handleAbort);
-            });
-            audio.src = source;
-            this.preload_requests.push(audio);
-        };
-        for (const file of files) {
-            if (typeof this.audio_buffers[file] !== "undefined") {
-                n_loaded++;
-                callback_load(file);
-                if (n_loaded == files.length) {
-                    callback_complete();
-                }
-            }
-            else {
-                this.audio_buffers[file] = "tmp";
-                if (this.audioContext() !== null) {
-                    load_audio_file_webaudio(file);
-                }
-                else {
-                    load_audio_file_html5audio(file);
-                }
-            }
-        }
-    }
-    preloadImages(images, callback_complete = () => { }, callback_load = (filepath) => { }, callback_error = (error_msg) => { }) {
-        // flatten the images array
-        images = unique(images.flat());
-        var n_loaded = 0;
-        if (images.length === 0) {
-            callback_complete();
-            return;
-        }
-        for (var i = 0; i < images.length; i++) {
-            var img = new Image();
-            img.onload = function () {
-                n_loaded++;
-                callback_load(img.src);
-                if (n_loaded === images.length) {
-                    callback_complete();
-                }
-            };
-            img.onerror = function (e) {
-                callback_error({ source: img.src, error: e });
-            };
-            img.src = images[i];
-            this.img_cache[images[i]] = img;
-            this.preload_requests.push(img);
-        }
-    }
-    preloadVideo(videos, callback_complete = () => { }, callback_load = (filepath) => { }, callback_error = (error_msg) => { }) {
-        // flatten the video array
-        videos = unique(videos.flat());
-        let n_loaded = 0;
-        if (videos.length === 0) {
-            callback_complete();
-            return;
-        }
-        for (const video of videos) {
-            const video_buffers = this.video_buffers;
-            //based on option 4 here: http://dinbror.dk/blog/how-to-preload-entire-html5-video-before-play-solved/
-            const request = new XMLHttpRequest();
-            request.open("GET", video, true);
-            request.responseType = "blob";
-            request.onload = function () {
-                if (this.status === 200 || this.status === 0) {
-                    const videoBlob = this.response;
-                    video_buffers[video] = URL.createObjectURL(videoBlob); // IE10+
-                    n_loaded++;
-                    callback_load(video);
-                    if (n_loaded === videos.length) {
-                        callback_complete();
-                    }
-                }
-            };
-            request.onerror = function (e) {
-                let err = e;
-                if (this.status == 404) {
-                    err = "404";
-                }
-                callback_error({ source: video, error: err });
-            };
-            request.onloadend = function (e) {
-                if (this.status == 404) {
-                    callback_error({ source: video, error: "404" });
-                }
-            };
-            request.send();
-            this.preload_requests.push(request);
-        }
-    }
-    getAutoPreloadList(timeline_description) {
-        /** Map each preload parameter type to a set of paths to be preloaded */
-        const preloadPaths = Object.fromEntries(preloadParameterTypes.map((type) => [type, new Set()]));
-        const traverseTimeline = (node, inheritedTrialType) => {
-            var _a, _b, _c, _d;
-            const isTimeline = typeof node.timeline !== "undefined";
-            if (isTimeline) {
-                for (const childNode of node.timeline) {
-                    traverseTimeline(childNode, (_a = node.type) !== null && _a !== void 0 ? _a : inheritedTrialType);
-                }
-            }
-            else if ((_c = ((_b = node.type) !== null && _b !== void 0 ? _b : inheritedTrialType)) === null || _c === void 0 ? void 0 : _c.info) {
-                // node is a trial with type.info set
-                // Get the plugin name and parameters object from the info object
-                const { name: pluginName, parameters } = ((_d = node.type) !== null && _d !== void 0 ? _d : inheritedTrialType).info;
-                // Extract parameters to be preloaded and their types from parameter info if this has not
-                // yet been done for `pluginName`
-                if (!this.preloadMap.has(pluginName)) {
-                    this.preloadMap.set(pluginName, Object.fromEntries(Object.entries(parameters)
-                        // Filter out parameter entries with media types and a non-false `preload` option
-                        .filter(([_name, { type, preload }]) => preloadParameterTypes.includes(type) && (preload !== null && preload !== void 0 ? preload : true))
-                        // Map each entry's value to its parameter type
-                        .map(([name, { type }]) => [name, type])));
-                }
-                // Add preload paths from this trial
-                for (const [parameterName, parameterType] of Object.entries(this.preloadMap.get(pluginName))) {
-                    const parameterValue = node[parameterName];
-                    const elements = preloadPaths[parameterType];
-                    if (typeof parameterValue === "string") {
-                        elements.add(parameterValue);
-                    }
-                    else if (Array.isArray(parameterValue)) {
-                        for (const element of parameterValue.flat()) {
-                            if (typeof element === "string") {
-                                elements.add(element);
-                            }
-                        }
-                    }
-                }
-            }
-        };
-        traverseTimeline({ timeline: timeline_description });
-        return {
-            images: [...preloadPaths[ParameterType.IMAGE]],
-            audio: [...preloadPaths[ParameterType.AUDIO]],
-            video: [...preloadPaths[ParameterType.VIDEO]],
-        };
-    }
-    cancelPreloads() {
-        for (const request of this.preload_requests) {
-            request.onload = () => { };
-            request.onerror = () => { };
-            request.oncanplaythrough = () => { };
-            request.onabort = () => { };
-        }
-        this.preload_requests = [];
-    }
-    initializeMicrophoneRecorder(stream) {
-        const recorder = new MediaRecorder(stream);
-        this.microphone_recorder = recorder;
-    }
-    getMicrophoneRecorder() {
-        return this.microphone_recorder;
-    }
-}
-
-class SimulationAPI {
-    dispatchEvent(event) {
-        document.body.dispatchEvent(event);
-    }
-    /**
-     * Dispatches a `keydown` event for the specified key
-     * @param key Character code (`.key` property) for the key to press.
-     */
-    keyDown(key) {
-        this.dispatchEvent(new KeyboardEvent("keydown", { key }));
-    }
-    /**
-     * Dispatches a `keyup` event for the specified key
-     * @param key Character code (`.key` property) for the key to press.
-     */
-    keyUp(key) {
-        this.dispatchEvent(new KeyboardEvent("keyup", { key }));
-    }
-    /**
-     * Dispatches a `keydown` and `keyup` event in sequence to simulate pressing a key.
-     * @param key Character code (`.key` property) for the key to press.
-     * @param delay Length of time to wait (ms) before executing action
-     */
-    pressKey(key, delay = 0) {
-        if (delay > 0) {
-            setTimeout(() => {
-                this.keyDown(key);
-                this.keyUp(key);
-            }, delay);
-        }
-        else {
-            this.keyDown(key);
-            this.keyUp(key);
-        }
-    }
-    /**
-     * Dispatches `mousedown`, `mouseup`, and `click` events on the target element
-     * @param target The element to click
-     * @param delay Length of time to wait (ms) before executing action
-     */
-    clickTarget(target, delay = 0) {
-        if (delay > 0) {
-            setTimeout(() => {
-                target.dispatchEvent(new MouseEvent("mousedown", { bubbles: true }));
-                target.dispatchEvent(new MouseEvent("mouseup", { bubbles: true }));
-                target.dispatchEvent(new MouseEvent("click", { bubbles: true }));
-            }, delay);
-        }
-        else {
-            target.dispatchEvent(new MouseEvent("mousedown", { bubbles: true }));
-            target.dispatchEvent(new MouseEvent("mouseup", { bubbles: true }));
-            target.dispatchEvent(new MouseEvent("click", { bubbles: true }));
-        }
-    }
-    /**
-     * Sets the value of a target text input
-     * @param target A text input element to fill in
-     * @param text Text to input
-     * @param delay Length of time to wait (ms) before executing action
-     */
-    fillTextInput(target, text, delay = 0) {
-        if (delay > 0) {
-            setTimeout(() => {
-                target.value = text;
-            }, delay);
-        }
-        else {
-            target.value = text;
-        }
-    }
-    /**
-     * Picks a valid key from `choices`, taking into account jsPsych-specific
-     * identifiers like "NO_KEYS" and "ALL_KEYS".
-     * @param choices Which keys are valid.
-     * @returns A key selected at random from the valid keys.
-     */
-    getValidKey(choices) {
-        const possible_keys = [
-            "a",
-            "b",
-            "c",
-            "d",
-            "e",
-            "f",
-            "g",
-            "h",
-            "i",
-            "j",
-            "k",
-            "l",
-            "m",
-            "n",
-            "o",
-            "p",
-            "q",
-            "r",
-            "s",
-            "t",
-            "u",
-            "v",
-            "w",
-            "x",
-            "y",
-            "z",
-            "0",
-            "1",
-            "2",
-            "3",
-            "4",
-            "5",
-            "6",
-            "7",
-            "8",
-            "9",
-            " ",
-        ];
-        let key;
-        if (choices == "NO_KEYS") {
-            key = null;
-        }
-        else if (choices == "ALL_KEYS") {
-            key = possible_keys[Math.floor(Math.random() * possible_keys.length)];
-        }
-        else {
-            const flat_choices = choices.flat();
-            key = flat_choices[Math.floor(Math.random() * flat_choices.length)];
-        }
-        return key;
-    }
-    mergeSimulationData(default_data, simulation_options) {
-        // override any data with data from simulation object
-        return Object.assign(Object.assign({}, default_data), simulation_options === null || simulation_options === void 0 ? void 0 : simulation_options.data);
-    }
-    ensureSimulationDataConsistency(trial, data) {
-        // All RTs must be rounded
-        if (data.rt) {
-            data.rt = Math.round(data.rt);
-        }
-        // If a trial_duration and rt exist, make sure that the RT is not longer than the trial.
-        if (trial.trial_duration && data.rt && data.rt > trial.trial_duration) {
-            data.rt = null;
-            if (data.response) {
-                data.response = null;
-            }
-            if (data.correct) {
-                data.correct = false;
-            }
-        }
-        // If trial.choices is NO_KEYS make sure that response and RT are null
-        if (trial.choices && trial.choices == "NO_KEYS") {
-            if (data.rt) {
-                data.rt = null;
-            }
-            if (data.response) {
-                data.response = null;
-            }
-        }
-        // If response is not allowed before stimulus display complete, ensure RT
-        // is longer than display time.
-        if (trial.allow_response_before_complete) {
-            if (trial.sequence_reps && trial.frame_time) {
-                const min_time = trial.sequence_reps * trial.frame_time * trial.stimuli.length;
-                if (data.rt < min_time) {
-                    data.rt = null;
-                    data.response = null;
-                }
-            }
-        }
-    }
-}
-
-class TimeoutAPI {
-    constructor() {
-        this.timeout_handlers = [];
-    }
-    setTimeout(callback, delay) {
-        const handle = window.setTimeout(callback, delay);
-        this.timeout_handlers.push(handle);
-        return handle;
-    }
-    clearAllTimeouts() {
-        for (const handler of this.timeout_handlers) {
-            clearTimeout(handler);
-        }
-        this.timeout_handlers = [];
-    }
-}
-
-function createJointPluginAPIObject(jsPsych) {
-    const settings = jsPsych.getInitSettings();
-    return Object.assign({}, ...[
-        new KeyboardListenerAPI(jsPsych.getDisplayContainerElement, settings.case_sensitive_responses, settings.minimum_valid_rt),
-        new TimeoutAPI(),
-        new MediaAPI(settings.use_webaudio, jsPsych.webaudio_context),
-        new HardwareAPI(),
-        new SimulationAPI(),
-    ].map((object) => autoBind(object)));
-}
-
-var wordList = [
-  // Borrowed from xkcd password generator which borrowed it from wherever
-  "ability","able","aboard","about","above","accept","accident","according",
-  "account","accurate","acres","across","act","action","active","activity",
-  "actual","actually","add","addition","additional","adjective","adult","adventure",
-  "advice","affect","afraid","after","afternoon","again","against","age",
-  "ago","agree","ahead","aid","air","airplane","alike","alive",
-  "all","allow","almost","alone","along","aloud","alphabet","already",
-  "also","although","am","among","amount","ancient","angle","angry",
-  "animal","announced","another","answer","ants","any","anybody","anyone",
-  "anything","anyway","anywhere","apart","apartment","appearance","apple","applied",
-  "appropriate","are","area","arm","army","around","arrange","arrangement",
-  "arrive","arrow","art","article","as","aside","ask","asleep",
-  "at","ate","atmosphere","atom","atomic","attached","attack","attempt",
-  "attention","audience","author","automobile","available","average","avoid","aware",
-  "away","baby","back","bad","badly","bag","balance","ball",
-  "balloon","band","bank","bar","bare","bark","barn","base",
-  "baseball","basic","basis","basket","bat","battle","be","bean",
-  "bear","beat","beautiful","beauty","became","because","become","becoming",
-  "bee","been","before","began","beginning","begun","behavior","behind",
-  "being","believed","bell","belong","below","belt","bend","beneath",
-  "bent","beside","best","bet","better","between","beyond","bicycle",
-  "bigger","biggest","bill","birds","birth","birthday","bit","bite",
-  "black","blank","blanket","blew","blind","block","blood","blow",
-  "blue","board","boat","body","bone","book","border","born",
-  "both","bottle","bottom","bound","bow","bowl","box","boy",
-  "brain","branch","brass","brave","bread","break","breakfast","breath",
-  "breathe","breathing","breeze","brick","bridge","brief","bright","bring",
-  "broad","broke","broken","brother","brought","brown","brush","buffalo",
-  "build","building","built","buried","burn","burst","bus","bush",
-  "business","busy","but","butter","buy","by","cabin","cage",
-  "cake","call","calm","came","camera","camp","can","canal",
-  "cannot","cap","capital","captain","captured","car","carbon","card",
-  "care","careful","carefully","carried","carry","case","cast","castle",
-  "cat","catch","cattle","caught","cause","cave","cell","cent",
-  "center","central","century","certain","certainly","chain","chair","chamber",
-  "chance","change","changing","chapter","character","characteristic","charge","chart",
-  "check","cheese","chemical","chest","chicken","chief","child","children",
-  "choice","choose","chose","chosen","church","circle","circus","citizen",
-  "city","class","classroom","claws","clay","clean","clear","clearly",
-  "climate","climb","clock","close","closely","closer","cloth","clothes",
-  "clothing","cloud","club","coach","coal","coast","coat","coffee",
-  "cold","collect","college","colony","color","column","combination","combine",
-  "come","comfortable","coming","command","common","community","company","compare",
-  "compass","complete","completely","complex","composed","composition","compound","concerned",
-  "condition","congress","connected","consider","consist","consonant","constantly","construction",
-  "contain","continent","continued","contrast","control","conversation","cook","cookies",
-  "cool","copper","copy","corn","corner","correct","correctly","cost",
-  "cotton","could","count","country","couple","courage","course","court",
-  "cover","cow","cowboy","crack","cream","create","creature","crew",
-  "crop","cross","crowd","cry","cup","curious","current","curve",
-  "customs","cut","cutting","daily","damage","dance","danger","dangerous",
-  "dark","darkness","date","daughter","dawn","day","dead","deal",
-  "dear","death","decide","declared","deep","deeply","deer","definition",
-  "degree","depend","depth","describe","desert","design","desk","detail",
-  "determine","develop","development","diagram","diameter","did","die","differ",
-  "difference","different","difficult","difficulty","dig","dinner","direct","direction",
-  "directly","dirt","dirty","disappear","discover","discovery","discuss","discussion",
-  "disease","dish","distance","distant","divide","division","do","doctor",
-  "does","dog","doing","doll","dollar","done","donkey","door",
-  "dot","double","doubt","down","dozen","draw","drawn","dream",
-  "dress","drew","dried","drink","drive","driven","driver","driving",
-  "drop","dropped","drove","dry","duck","due","dug","dull",
-  "during","dust","duty","each","eager","ear","earlier","early",
-  "earn","earth","easier","easily","east","easy","eat","eaten",
-  "edge","education","effect","effort","egg","eight","either","electric",
-  "electricity","element","elephant","eleven","else","empty","end","enemy",
-  "energy","engine","engineer","enjoy","enough","enter","entire","entirely",
-  "environment","equal","equally","equator","equipment","escape","especially","essential",
-  "establish","even","evening","event","eventually","ever","every","everybody",
-  "everyone","everything","everywhere","evidence","exact","exactly","examine","example",
-  "excellent","except","exchange","excited","excitement","exciting","exclaimed","exercise",
-  "exist","expect","experience","experiment","explain","explanation","explore","express",
-  "expression","extra","eye","face","facing","fact","factor","factory",
-  "failed","fair","fairly","fall","fallen","familiar","family","famous",
-  "far","farm","farmer","farther","fast","fastened","faster","fat",
-  "father","favorite","fear","feathers","feature","fed","feed","feel",
-  "feet","fell","fellow","felt","fence","few","fewer","field",
-  "fierce","fifteen","fifth","fifty","fight","fighting","figure","fill",
-  "film","final","finally","find","fine","finest","finger","finish",
-  "fire","fireplace","firm","first","fish","five","fix","flag",
-  "flame","flat","flew","flies","flight","floating","floor","flow",
-  "flower","fly","fog","folks","follow","food","foot","football",
-  "for","force","foreign","forest","forget","forgot","forgotten","form",
-  "former","fort","forth","forty","forward","fought","found","four",
-  "fourth","fox","frame","free","freedom","frequently","fresh","friend",
-  "friendly","frighten","frog","from","front","frozen","fruit","fuel",
-  "full","fully","fun","function","funny","fur","furniture","further",
-  "future","gain","game","garage","garden","gas","gasoline","gate",
-  "gather","gave","general","generally","gentle","gently","get","getting",
-  "giant","gift","girl","give","given","giving","glad","glass",
-  "globe","go","goes","gold","golden","gone","good","goose",
-  "got","government","grabbed","grade","gradually","grain","grandfather","grandmother",
-  "graph","grass","gravity","gray","great","greater","greatest","greatly",
-  "green","grew","ground","group","grow","grown","growth","guard",
-  "guess","guide","gulf","gun","habit","had","hair","half",
-  "halfway","hall","hand","handle","handsome","hang","happen","happened",
-  "happily","happy","harbor","hard","harder","hardly","has","hat",
-  "have","having","hay","he","headed","heading","health","heard",
-  "hearing","heart","heat","heavy","height","held","hello","help",
-  "helpful","her","herd","here","herself","hidden","hide","high",
-  "higher","highest","highway","hill","him","himself","his","history",
-  "hit","hold","hole","hollow","home","honor","hope","horn",
-  "horse","hospital","hot","hour","house","how","however","huge",
-  "human","hundred","hung","hungry","hunt","hunter","hurried","hurry",
-  "hurt","husband","ice","idea","identity","if","ill","image",
-  "imagine","immediately","importance","important","impossible","improve","in","inch",
-  "include","including","income","increase","indeed","independent","indicate","individual",
-  "industrial","industry","influence","information","inside","instance","instant","instead",
-  "instrument","interest","interior","into","introduced","invented","involved","iron",
-  "is","island","it","its","itself","jack","jar","jet",
-  "job","join","joined","journey","joy","judge","jump","jungle",
-  "just","keep","kept","key","kids","kill","kind","kitchen",
-  "knew","knife","know","knowledge","known","label","labor","lack",
-  "lady","laid","lake","lamp","land","language","large","larger",
-  "largest","last","late","later","laugh","law","lay","layers",
-  "lead","leader","leaf","learn","least","leather","leave","leaving",
-  "led","left","leg","length","lesson","let","letter","level",
-  "library","lie","life","lift","light","like","likely","limited",
-  "line","lion","lips","liquid","list","listen","little","live",
-  "living","load","local","locate","location","log","lonely","long",
-  "longer","look","loose","lose","loss","lost","lot","loud",
-  "love","lovely","low","lower","luck","lucky","lunch","lungs",
-  "lying","machine","machinery","mad","made","magic","magnet","mail",
-  "main","mainly","major","make","making","man","managed","manner",
-  "manufacturing","many","map","mark","market","married","mass","massage",
-  "master","material","mathematics","matter","may","maybe","me","meal",
-  "mean","means","meant","measure","meat","medicine","meet","melted",
-  "member","memory","men","mental","merely","met","metal","method",
-  "mice","middle","might","mighty","mile","military","milk","mill",
-  "mind","mine","minerals","minute","mirror","missing","mission","mistake",
-  "mix","mixture","model","modern","molecular","moment","money","monkey",
-  "month","mood","moon","more","morning","most","mostly","mother",
-  "motion","motor","mountain","mouse","mouth","move","movement","movie",
-  "moving","mud","muscle","music","musical","must","my","myself",
-  "mysterious","nails","name","nation","national","native","natural","naturally",
-  "nature","near","nearby","nearer","nearest","nearly","necessary","neck",
-  "needed","needle","needs","negative","neighbor","neighborhood","nervous","nest",
-  "never","new","news","newspaper","next","nice","night","nine",
-  "no","nobody","nodded","noise","none","noon","nor","north",
-  "nose","not","note","noted","nothing","notice","noun","now",
-  "number","numeral","nuts","object","observe","obtain","occasionally","occur",
-  "ocean","of","off","offer","office","officer","official","oil",
-  "old","older","oldest","on","once","one","only","onto",
-  "open","operation","opinion","opportunity","opposite","or","orange","orbit",
-  "order","ordinary","organization","organized","origin","original","other","ought",
-  "our","ourselves","out","outer","outline","outside","over","own",
-  "owner","oxygen","pack","package","page","paid","pain","paint",
-  "pair","palace","pale","pan","paper","paragraph","parallel","parent",
-  "park","part","particles","particular","particularly","partly","parts","party",
-  "pass","passage","past","path","pattern","pay","peace","pen",
-  "pencil","people","per","percent","perfect","perfectly","perhaps","period",
-  "person","personal","pet","phrase","physical","piano","pick","picture",
-  "pictured","pie","piece","pig","pile","pilot","pine","pink",
-  "pipe","pitch","place","plain","plan","plane","planet","planned",
-  "planning","plant","plastic","plate","plates","play","pleasant","please",
-  "pleasure","plenty","plural","plus","pocket","poem","poet","poetry",
-  "point","pole","police","policeman","political","pond","pony","pool",
-  "poor","popular","population","porch","port","position","positive","possible",
-  "possibly","post","pot","potatoes","pound","pour","powder","power",
-  "powerful","practical","practice","prepare","present","president","press","pressure",
-  "pretty","prevent","previous","price","pride","primitive","principal","principle",
-  "printed","private","prize","probably","problem","process","produce","product",
-  "production","program","progress","promised","proper","properly","property","protection",
-  "proud","prove","provide","public","pull","pupil","pure","purple",
-  "purpose","push","put","putting","quarter","queen","question","quick",
-  "quickly","quiet","quietly","quite","rabbit","race","radio","railroad",
-  "rain","raise","ran","ranch","range","rapidly","rate","rather",
-  "raw","rays","reach","read","reader","ready","real","realize",
-  "rear","reason","recall","receive","recent","recently","recognize","record",
-  "red","refer","refused","region","regular","related","relationship","religious",
-  "remain","remarkable","remember","remove","repeat","replace","replied","report",
-  "represent","require","research","respect","rest","result","return","review",
-  "rhyme","rhythm","rice","rich","ride","riding","right","ring",
-  "rise","rising","river","road","roar","rock","rocket","rocky",
-  "rod","roll","roof","room","root","rope","rose","rough",
-  "round","route","row","rubbed","rubber","rule","ruler","run",
-  "running","rush","sad","saddle","safe","safety","said","sail",
-  "sale","salmon","salt","same","sand","sang","sat","satellites",
-  "satisfied","save","saved","saw","say","scale","scared","scene",
-  "school","science","scientific","scientist","score","screen","sea","search",
-  "season","seat","second","secret","section","see","seed","seeing",
-  "seems","seen","seldom","select","selection","sell","send","sense",
-  "sent","sentence","separate","series","serious","serve","service","sets",
-  "setting","settle","settlers","seven","several","shade","shadow","shake",
-  "shaking","shall","shallow","shape","share","sharp","she","sheep",
-  "sheet","shelf","shells","shelter","shine","shinning","ship","shirt",
-  "shoe","shoot","shop","shore","short","shorter","shot","should",
-  "shoulder","shout","show","shown","shut","sick","sides","sight",
-  "sign","signal","silence","silent","silk","silly","silver","similar",
-  "simple","simplest","simply","since","sing","single","sink","sister",
-  "sit","sitting","situation","six","size","skill","skin","sky",
-  "slabs","slave","sleep","slept","slide","slight","slightly","slip",
-  "slipped","slope","slow","slowly","small","smaller","smallest","smell",
-  "smile","smoke","smooth","snake","snow","so","soap","social",
-  "society","soft","softly","soil","solar","sold","soldier","solid",
-  "solution","solve","some","somebody","somehow","someone","something","sometime",
-  "somewhere","son","song","soon","sort","sound","source","south",
-  "southern","space","speak","special","species","specific","speech","speed",
-  "spell","spend","spent","spider","spin","spirit","spite","split",
-  "spoken","sport","spread","spring","square","stage","stairs","stand",
-  "standard","star","stared","start","state","statement","station","stay",
-  "steady","steam","steel","steep","stems","step","stepped","stick",
-  "stiff","still","stock","stomach","stone","stood","stop","stopped",
-  "store","storm","story","stove","straight","strange","stranger","straw",
-  "stream","street","strength","stretch","strike","string","strip","strong",
-  "stronger","struck","structure","struggle","stuck","student","studied","studying",
-  "subject","substance","success","successful","such","sudden","suddenly","sugar",
-  "suggest","suit","sum","summer","sun","sunlight","supper","supply",
-  "support","suppose","sure","surface","surprise","surrounded","swam","sweet",
-  "swept","swim","swimming","swing","swung","syllable","symbol","system",
-  "table","tail","take","taken","tales","talk","tall","tank",
-  "tape","task","taste","taught","tax","tea","teach","teacher",
-  "team","tears","teeth","telephone","television","tell","temperature","ten",
-  "tent","term","terrible","test","than","thank","that","thee",
-  "them","themselves","then","theory","there","therefore","these","they",
-  "thick","thin","thing","think","third","thirty","this","those",
-  "thou","though","thought","thousand","thread","three","threw","throat",
-  "through","throughout","throw","thrown","thumb","thus","thy","tide",
-  "tie","tight","tightly","till","time","tin","tiny","tip",
-  "tired","title","to","tobacco","today","together","told","tomorrow",
-  "tone","tongue","tonight","too","took","tool","top","topic",
-  "torn","total","touch","toward","tower","town","toy","trace",
-  "track","trade","traffic","trail","train","transportation","trap","travel",
-  "treated","tree","triangle","tribe","trick","tried","trip","troops",
-  "tropical","trouble","truck","trunk","truth","try","tube","tune",
-  "turn","twelve","twenty","twice","two","type","typical","uncle",
-  "under","underline","understanding","unhappy","union","unit","universe","unknown",
-  "unless","until","unusual","up","upon","upper","upward","us",
-  "use","useful","using","usual","usually","valley","valuable","value",
-  "vapor","variety","various","vast","vegetable","verb","vertical","very",
-  "vessels","victory","view","village","visit","visitor","voice","volume",
-  "vote","vowel","voyage","wagon","wait","walk","wall","want",
-  "war","warm","warn","was","wash","waste","watch","water",
-  "wave","way","we","weak","wealth","wear","weather","week",
-  "weigh","weight","welcome","well","went","were","west","western",
-  "wet","whale","what","whatever","wheat","wheel","when","whenever",
-  "where","wherever","whether","which","while","whispered","whistle","white",
-  "who","whole","whom","whose","why","wide","widely","wife",
-  "wild","will","willing","win","wind","window","wing","winter",
-  "wire","wise","wish","with","within","without","wolf","women",
-  "won","wonder","wonderful","wood","wooden","wool","word","wore",
-  "work","worker","world","worried","worry","worse","worth","would",
-  "wrapped","write","writer","writing","written","wrong","wrote","yard",
-  "year","yellow","yes","yesterday","yet","you","young","younger",
-  "your","yourself","youth","zero","zebra","zipper","zoo","zulu"
-];
-
-function words(options) {
-
-  function word() {
-    if (options && options.maxLength > 1) {
-      return generateWordWithMaxLength();
-    } else {
-      return generateRandomWord();
-    }
-  }
-
-  function generateWordWithMaxLength() {
-    var rightSize = false;
-    var wordUsed;
-    while (!rightSize) {  
-      wordUsed = generateRandomWord();
-      if(wordUsed.length <= options.maxLength) {
-        rightSize = true;
-      }
-
-    }
-    return wordUsed;
-  }
-
-  function generateRandomWord() {
-    return wordList[randInt(wordList.length)];
-  }
-
-  function randInt(lessThan) {
-    return Math.floor(Math.random() * lessThan);
-  }
-
-  // No arguments = generate one word
-  if (typeof(options) === 'undefined') {
-    return word();
-  }
-
-  // Just a number = return that many words
-  if (typeof(options) === 'number') {
-    options = { exactly: options };
-  }
-
-  // options supported: exactly, min, max, join
-  if (options.exactly) {
-    options.min = options.exactly;
-    options.max = options.exactly;
-  }
-  
-  // not a number = one word par string
-  if (typeof(options.wordsPerString) !== 'number') {
-    options.wordsPerString = 1;
-  }
-
-  //not a function = returns the raw word
-  if (typeof(options.formatter) !== 'function') {
-    options.formatter = (word) => word;
-  }
-
-  //not a string = separator is a space
-  if (typeof(options.separator) !== 'string') {
-    options.separator = ' ';
-  }
-
-  var total = options.min + randInt(options.max + 1 - options.min);
-  var results = [];
-  var token = '';
-  var relativeIndex = 0;
-
-  for (var i = 0; (i < total * options.wordsPerString); i++) {
-    if (relativeIndex === options.wordsPerString - 1) {
-      token += options.formatter(word(), relativeIndex);
-    }
-    else {
-      token += options.formatter(word(), relativeIndex) + options.separator;
-    }
-    relativeIndex++;
-    if ((i + 1) % options.wordsPerString === 0) {
-      results.push(token);
-      token = ''; 
-      relativeIndex = 0;
-    }
-   
-  }
-  if (typeof options.join === 'string') {
-    results = results.join(options.join);
-  }
-
-  return results;
-}
-
-var randomWords$1 = words;
-// Export the word list as it is often useful
-words.wordList = wordList;
-
-var alea = {exports: {}};
-
-(function (module) {
-// A port of an algorithm by Johannes Baagøe , 2010
-// http://baagoe.com/en/RandomMusings/javascript/
-// https://github.com/nquinlan/better-random-numbers-for-javascript-mirror
-// Original work is under MIT license -
-
-// Copyright (C) 2010 by Johannes Baagøe 
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-
-
-(function(global, module, define) {
-
-function Alea(seed) {
-  var me = this, mash = Mash();
-
-  me.next = function() {
-    var t = 2091639 * me.s0 + me.c * 2.3283064365386963e-10; // 2^-32
-    me.s0 = me.s1;
-    me.s1 = me.s2;
-    return me.s2 = t - (me.c = t | 0);
-  };
-
-  // Apply the seeding algorithm from Baagoe.
-  me.c = 1;
-  me.s0 = mash(' ');
-  me.s1 = mash(' ');
-  me.s2 = mash(' ');
-  me.s0 -= mash(seed);
-  if (me.s0 < 0) { me.s0 += 1; }
-  me.s1 -= mash(seed);
-  if (me.s1 < 0) { me.s1 += 1; }
-  me.s2 -= mash(seed);
-  if (me.s2 < 0) { me.s2 += 1; }
-  mash = null;
-}
-
-function copy(f, t) {
-  t.c = f.c;
-  t.s0 = f.s0;
-  t.s1 = f.s1;
-  t.s2 = f.s2;
-  return t;
-}
-
-function impl(seed, opts) {
-  var xg = new Alea(seed),
-      state = opts && opts.state,
-      prng = xg.next;
-  prng.int32 = function() { return (xg.next() * 0x100000000) | 0; };
-  prng.double = function() {
-    return prng() + (prng() * 0x200000 | 0) * 1.1102230246251565e-16; // 2^-53
-  };
-  prng.quick = prng;
-  if (state) {
-    if (typeof(state) == 'object') copy(state, xg);
-    prng.state = function() { return copy(xg, {}); };
-  }
-  return prng;
-}
-
-function Mash() {
-  var n = 0xefc8249d;
-
-  var mash = function(data) {
-    data = String(data);
-    for (var i = 0; i < data.length; i++) {
-      n += data.charCodeAt(i);
-      var h = 0.02519603282416938 * n;
-      n = h >>> 0;
-      h -= n;
-      h *= n;
-      n = h >>> 0;
-      h -= n;
-      n += h * 0x100000000; // 2^32
-    }
-    return (n >>> 0) * 2.3283064365386963e-10; // 2^-32
-  };
-
-  return mash;
-}
-
-
-if (module && module.exports) {
-  module.exports = impl;
-} else if (define && define.amd) {
-  define(function() { return impl; });
-} else {
-  this.alea = impl;
-}
-
-})(
-  commonjsGlobal,
-  module,    // present in node.js
-  (typeof undefined) == 'function'    // present with an AMD loader
-);
-}(alea));
-
-var seedrandom = alea.exports;
-
-/**
- * Uses the `seedrandom` package to replace Math.random() with a seedable PRNG.
- *
- * @param seed An optional seed. If none is given, a random seed will be generated.
- * @returns The seed value.
- */
-function setSeed(seed = Math.random().toString()) {
-    Math.random = seedrandom(seed);
-    return seed;
-}
-function repeat(array, repetitions, unpack = false) {
-    const arr_isArray = Array.isArray(array);
-    const rep_isArray = Array.isArray(repetitions);
-    // if array is not an array, then we just repeat the item
-    if (!arr_isArray) {
-        if (!rep_isArray) {
-            array = [array];
-            repetitions = [repetitions];
-        }
-        else {
-            repetitions = [repetitions[0]];
-            console.log("Unclear parameters given to randomization.repeat. Multiple set sizes specified, but only one item exists to sample. Proceeding using the first set size.");
-        }
-    }
-    else {
-        // if repetitions is not an array, but array is, then we
-        // repeat repetitions for each entry in array
-        if (!rep_isArray) {
-            let reps = [];
-            for (let i = 0; i < array.length; i++) {
-                reps.push(repetitions);
-            }
-            repetitions = reps;
-        }
-        else {
-            if (array.length != repetitions.length) {
-                console.warn("Unclear parameters given to randomization.repeat. Items and repetitions are unequal lengths. Behavior may not be as expected.");
-                // throw warning if repetitions is too short, use first rep ONLY.
-                if (repetitions.length < array.length) {
-                    let reps = [];
-                    for (let i = 0; i < array.length; i++) {
-                        reps.push(repetitions);
-                    }
-                    repetitions = reps;
-                }
-                else {
-                    // throw warning if too long, and then use the first N
-                    repetitions = repetitions.slice(0, array.length);
-                }
-            }
-        }
-    }
-    // should be clear at this point to assume that array and repetitions are arrays with == length
-    let allsamples = [];
-    for (let i = 0; i < array.length; i++) {
-        for (let j = 0; j < repetitions[i]; j++) {
-            if (array[i] == null || typeof array[i] != "object") {
-                allsamples.push(array[i]);
-            }
-            else {
-                allsamples.push(Object.assign({}, array[i]));
-            }
-        }
-    }
-    let out = shuffle(allsamples);
-    if (unpack) {
-        out = unpackArray(out);
-    }
-    return out;
-}
-function shuffle(array) {
-    if (!Array.isArray(array)) {
-        console.error("Argument to shuffle() must be an array.");
-    }
-    const copy_array = array.slice(0);
-    let m = copy_array.length, t, i;
-    // While there remain elements to shuffle…
-    while (m) {
-        // Pick a remaining element…
-        i = Math.floor(Math.random() * m--);
-        // And swap it with the current element.
-        t = copy_array[m];
-        copy_array[m] = copy_array[i];
-        copy_array[i] = t;
-    }
-    return copy_array;
-}
-function shuffleNoRepeats(arr, equalityTest) {
-    if (!Array.isArray(arr)) {
-        console.error("First argument to shuffleNoRepeats() must be an array.");
-    }
-    if (typeof equalityTest !== "undefined" && typeof equalityTest !== "function") {
-        console.error("Second argument to shuffleNoRepeats() must be a function.");
-    }
-    // define a default equalityTest
-    if (typeof equalityTest == "undefined") {
-        equalityTest = function (a, b) {
-            if (a === b) {
-                return true;
-            }
-            else {
-                return false;
-            }
-        };
-    }
-    const random_shuffle = shuffle(arr);
-    for (let i = 0; i < random_shuffle.length - 1; i++) {
-        if (equalityTest(random_shuffle[i], random_shuffle[i + 1])) {
-            // neighbors are equal, pick a new random neighbor to swap (not the first or last element, to avoid edge cases)
-            let random_pick = Math.floor(Math.random() * (random_shuffle.length - 2)) + 1;
-            // test to make sure the new neighbor isn't equal to the old one
-            while (equalityTest(random_shuffle[i + 1], random_shuffle[random_pick]) ||
-                equalityTest(random_shuffle[i + 1], random_shuffle[random_pick + 1]) ||
-                equalityTest(random_shuffle[i + 1], random_shuffle[random_pick - 1])) {
-                random_pick = Math.floor(Math.random() * (random_shuffle.length - 2)) + 1;
-            }
-            const new_neighbor = random_shuffle[random_pick];
-            random_shuffle[random_pick] = random_shuffle[i + 1];
-            random_shuffle[i + 1] = new_neighbor;
-        }
-    }
-    return random_shuffle;
-}
-function shuffleAlternateGroups(arr_groups, random_group_order = false) {
-    const n_groups = arr_groups.length;
-    if (n_groups == 1) {
-        console.warn("shuffleAlternateGroups() was called with only one group. Defaulting to simple shuffle.");
-        return shuffle(arr_groups[0]);
-    }
-    let group_order = [];
-    for (let i = 0; i < n_groups; i++) {
-        group_order.push(i);
-    }
-    if (random_group_order) {
-        group_order = shuffle(group_order);
-    }
-    const randomized_groups = [];
-    let min_length = null;
-    for (let i = 0; i < n_groups; i++) {
-        min_length =
-            min_length === null ? arr_groups[i].length : Math.min(min_length, arr_groups[i].length);
-        randomized_groups.push(shuffle(arr_groups[i]));
-    }
-    const out = [];
-    for (let i = 0; i < min_length; i++) {
-        for (let j = 0; j < group_order.length; j++) {
-            out.push(randomized_groups[group_order[j]][i]);
-        }
-    }
-    return out;
-}
-function sampleWithoutReplacement(arr, size) {
-    if (!Array.isArray(arr)) {
-        console.error("First argument to sampleWithoutReplacement() must be an array");
-    }
-    if (size > arr.length) {
-        console.error("Cannot take a sample larger than the size of the set of items to sample.");
-    }
-    return shuffle(arr).slice(0, size);
-}
-function sampleWithReplacement(arr, size, weights) {
-    if (!Array.isArray(arr)) {
-        console.error("First argument to sampleWithReplacement() must be an array");
-    }
-    const normalized_weights = [];
-    if (typeof weights !== "undefined") {
-        if (weights.length !== arr.length) {
-            console.error("The length of the weights array must equal the length of the array " +
-                "to be sampled from.");
-        }
-        let weight_sum = 0;
-        for (const weight of weights) {
-            weight_sum += weight;
-        }
-        for (const weight of weights) {
-            normalized_weights.push(weight / weight_sum);
-        }
-    }
-    else {
-        for (let i = 0; i < arr.length; i++) {
-            normalized_weights.push(1 / arr.length);
-        }
-    }
-    const cumulative_weights = [normalized_weights[0]];
-    for (let i = 1; i < normalized_weights.length; i++) {
-        cumulative_weights.push(normalized_weights[i] + cumulative_weights[i - 1]);
-    }
-    const samp = [];
-    for (let i = 0; i < size; i++) {
-        const rnd = Math.random();
-        let index = 0;
-        while (rnd > cumulative_weights[index]) {
-            index++;
-        }
-        samp.push(arr[index]);
-    }
-    return samp;
-}
-function factorial(factors, repetitions = 1, unpack = false) {
-    let design = [{}];
-    for (const [factorName, factor] of Object.entries(factors)) {
-        const new_design = [];
-        for (const level of factor) {
-            for (const cell of design) {
-                new_design.push(Object.assign(Object.assign({}, cell), { [factorName]: level }));
-            }
-        }
-        design = new_design;
-    }
-    return repeat(design, repetitions, unpack);
-}
-function randomID(length = 32) {
-    let result = "";
-    const chars = "0123456789abcdefghjklmnopqrstuvwxyz";
-    for (let i = 0; i < length; i++) {
-        result += chars[Math.floor(Math.random() * chars.length)];
-    }
-    return result;
-}
-/**
- * Generate a random integer from `lower` to `upper`, inclusive of both end points.
- * @param lower The lowest value it is possible to generate
- * @param upper The highest value it is possible to generate
- * @returns A random integer
- */
-function randomInt(lower, upper) {
-    if (upper < lower) {
-        throw new Error("Upper boundary must be less than or equal to lower boundary");
-    }
-    return lower + Math.floor(Math.random() * (upper - lower + 1));
-}
-/**
- * Generates a random sample from a Bernoulli distribution.
- * @param p The probability of sampling 1.
- * @returns 0, with probability 1-p, or 1, with probability p.
- */
-function sampleBernoulli(p) {
-    return Math.random() <= p ? 1 : 0;
-}
-function sampleNormal(mean, standard_deviation) {
-    return randn_bm() * standard_deviation + mean;
-}
-function sampleExponential(rate) {
-    return -Math.log(Math.random()) / rate;
-}
-function sampleExGaussian(mean, standard_deviation, rate, positive = false) {
-    let s = sampleNormal(mean, standard_deviation) + sampleExponential(rate);
-    if (positive) {
-        while (s <= 0) {
-            s = sampleNormal(mean, standard_deviation) + sampleExponential(rate);
-        }
-    }
-    return s;
-}
-/**
- * Generate one or more random words.
- *
- * This is a wrapper function for the {@link https://www.npmjs.com/package/random-words `random-words` npm package}.
- *
- * @param opts An object with optional properties `min`, `max`, `exactly`,
- * `join`, `maxLength`, `wordsPerString`, `separator`, and `formatter`.
- *
- * @returns An array of words or a single string, depending on parameter choices.
- */
-function randomWords(opts) {
-    return randomWords$1(opts);
-}
-// Box-Muller transformation for a random sample from normal distribution with mean = 0, std = 1
-// https://stackoverflow.com/a/36481059/3726673
-function randn_bm() {
-    var u = 0, v = 0;
-    while (u === 0)
-        u = Math.random(); //Converting [0,1) to (0,1)
-    while (v === 0)
-        v = Math.random();
-    return Math.sqrt(-2.0 * Math.log(u)) * Math.cos(2.0 * Math.PI * v);
-}
-function unpackArray(array) {
-    const out = {};
-    for (const x of array) {
-        for (const key of Object.keys(x)) {
-            if (typeof out[key] === "undefined") {
-                out[key] = [];
-            }
-            out[key].push(x[key]);
-        }
-    }
-    return out;
-}
-
-var randomization = /*#__PURE__*/Object.freeze({
-    __proto__: null,
-    setSeed: setSeed,
-    repeat: repeat,
-    shuffle: shuffle,
-    shuffleNoRepeats: shuffleNoRepeats,
-    shuffleAlternateGroups: shuffleAlternateGroups,
-    sampleWithoutReplacement: sampleWithoutReplacement,
-    sampleWithReplacement: sampleWithReplacement,
-    factorial: factorial,
-    randomID: randomID,
-    randomInt: randomInt,
-    sampleBernoulli: sampleBernoulli,
-    sampleNormal: sampleNormal,
-    sampleExponential: sampleExponential,
-    sampleExGaussian: sampleExGaussian,
-    randomWords: randomWords
-});
-
-/**
- * Gets information about the Mechanical Turk Environment, HIT, Assignment, and Worker
- * by parsing the URL variables that Mechanical Turk generates.
- * @returns An object containing information about the Mechanical Turk Environment, HIT, Assignment, and Worker.
- */
-function turkInfo() {
-    const turk = {
-        previewMode: false,
-        outsideTurk: false,
-        hitId: "INVALID_URL_PARAMETER",
-        assignmentId: "INVALID_URL_PARAMETER",
-        workerId: "INVALID_URL_PARAMETER",
-        turkSubmitTo: "INVALID_URL_PARAMETER",
-    };
-    const param = function (url, name) {
-        name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
-        const regexS = "[\\?&]" + name + "=([^&#]*)";
-        const regex = new RegExp(regexS);
-        const results = regex.exec(url);
-        return results == null ? "" : results[1];
-    };
-    const src = param(window.location.href, "assignmentId")
-        ? window.location.href
-        : document.referrer;
-    const keys = ["assignmentId", "hitId", "workerId", "turkSubmitTo"];
-    keys.map(function (key) {
-        turk[key] = unescape(param(src, key));
-    });
-    turk.previewMode = turk.assignmentId == "ASSIGNMENT_ID_NOT_AVAILABLE";
-    turk.outsideTurk =
-        !turk.previewMode && turk.hitId === "" && turk.assignmentId == "" && turk.workerId == "";
-    return turk;
-}
-/**
- * Send data to Mechnical Turk for storage.
- * @param data An object containing `key:value` pairs to send to Mechanical Turk. Values
- * cannot contain nested objects, arrays, or functions.
- * @returns Nothing
- */
-function submitToTurk(data) {
-    const turk = turkInfo();
-    const assignmentId = turk.assignmentId;
-    const turkSubmitTo = turk.turkSubmitTo;
-    if (!assignmentId || !turkSubmitTo)
-        return;
-    const form = document.createElement("form");
-    form.method = "POST";
-    form.action = turkSubmitTo + "/mturk/externalSubmit?assignmentId=" + assignmentId;
-    for (const key in data) {
-        if (data.hasOwnProperty(key)) {
-            const hiddenField = document.createElement("input");
-            hiddenField.type = "hidden";
-            hiddenField.name = key;
-            hiddenField.id = key;
-            hiddenField.value = data[key];
-            form.appendChild(hiddenField);
-        }
-    }
-    document.body.appendChild(form);
-    form.submit();
-}
-
-var turk = /*#__PURE__*/Object.freeze({
-    __proto__: null,
-    turkInfo: turkInfo,
-    submitToTurk: submitToTurk
-});
-
-class TimelineNode {
-    // constructor
-    constructor(jsPsych, parameters, parent, relativeID) {
-        this.jsPsych = jsPsych;
-        // track progress through the node
-        this.progress = {
-            current_location: -1,
-            current_variable_set: 0,
-            current_repetition: 0,
-            current_iteration: 0,
-            done: false,
-        };
-        // store a link to the parent of this node
-        this.parent_node = parent;
-        // create the ID for this node
-        this.relative_id = typeof parent === "undefined" ? 0 : relativeID;
-        // check if there is a timeline parameter
-        // if there is, then this node has its own timeline
-        if (typeof parameters.timeline !== "undefined") {
-            // create timeline properties
-            this.timeline_parameters = {
-                timeline: [],
-                loop_function: parameters.loop_function,
-                conditional_function: parameters.conditional_function,
-                sample: parameters.sample,
-                randomize_order: typeof parameters.randomize_order == "undefined" ? false : parameters.randomize_order,
-                repetitions: typeof parameters.repetitions == "undefined" ? 1 : parameters.repetitions,
-                timeline_variables: typeof parameters.timeline_variables == "undefined"
-                    ? [{}]
-                    : parameters.timeline_variables,
-                on_timeline_finish: parameters.on_timeline_finish,
-                on_timeline_start: parameters.on_timeline_start,
-            };
-            this.setTimelineVariablesOrder();
-            // extract all of the node level data and parameters
-            // but remove all of the timeline-level specific information
-            // since this will be used to copy things down hierarchically
-            var node_data = Object.assign({}, parameters);
-            delete node_data.timeline;
-            delete node_data.conditional_function;
-            delete node_data.loop_function;
-            delete node_data.randomize_order;
-            delete node_data.repetitions;
-            delete node_data.timeline_variables;
-            delete node_data.sample;
-            delete node_data.on_timeline_start;
-            delete node_data.on_timeline_finish;
-            this.node_trial_data = node_data; // store for later...
-            // create a TimelineNode for each element in the timeline
-            for (var i = 0; i < parameters.timeline.length; i++) {
-                // merge parameters
-                var merged_parameters = Object.assign({}, node_data, parameters.timeline[i]);
-                // merge any data from the parent node into child nodes
-                if (typeof node_data.data == "object" && typeof parameters.timeline[i].data == "object") {
-                    var merged_data = Object.assign({}, node_data.data, parameters.timeline[i].data);
-                    merged_parameters.data = merged_data;
-                }
-                this.timeline_parameters.timeline.push(new TimelineNode(this.jsPsych, merged_parameters, this, i));
-            }
-        }
-        // if there is no timeline parameter, then this node is a trial node
-        else {
-            // check to see if a valid trial type is defined
-            if (typeof parameters.type === "undefined") {
-                console.error('Trial level node is missing the "type" parameter. The parameters for the node are: ' +
-                    JSON.stringify(parameters));
-            }
-            // create a deep copy of the parameters for the trial
-            this.trial_parameters = Object.assign({}, parameters);
-        }
-    }
-    // recursively get the next trial to run.
-    // if this node is a leaf (trial), then return the trial.
-    // otherwise, recursively find the next trial in the child timeline.
-    trial() {
-        if (typeof this.timeline_parameters == "undefined") {
-            // returns a clone of the trial_parameters to
-            // protect functions.
-            return deepCopy(this.trial_parameters);
-        }
-        else {
-            if (this.progress.current_location >= this.timeline_parameters.timeline.length) {
-                return null;
-            }
-            else {
-                return this.timeline_parameters.timeline[this.progress.current_location].trial();
-            }
-        }
-    }
-    markCurrentTrialComplete() {
-        if (typeof this.timeline_parameters === "undefined") {
-            this.progress.done = true;
-        }
-        else {
-            this.timeline_parameters.timeline[this.progress.current_location].markCurrentTrialComplete();
-        }
-    }
-    nextRepetiton() {
-        this.setTimelineVariablesOrder();
-        this.progress.current_location = -1;
-        this.progress.current_variable_set = 0;
-        this.progress.current_repetition++;
-        for (var i = 0; i < this.timeline_parameters.timeline.length; i++) {
-            this.timeline_parameters.timeline[i].reset();
-        }
-    }
-    // set the order for going through the timeline variables array
-    setTimelineVariablesOrder() {
-        const timeline_parameters = this.timeline_parameters;
-        // check to make sure this node has variables
-        if (typeof timeline_parameters === "undefined" ||
-            typeof timeline_parameters.timeline_variables === "undefined") {
-            return;
-        }
-        var order = [];
-        for (var i = 0; i < timeline_parameters.timeline_variables.length; i++) {
-            order.push(i);
-        }
-        if (typeof timeline_parameters.sample !== "undefined") {
-            if (timeline_parameters.sample.type == "custom") {
-                order = timeline_parameters.sample.fn(order);
-            }
-            else if (timeline_parameters.sample.type == "with-replacement") {
-                order = sampleWithReplacement(order, timeline_parameters.sample.size, timeline_parameters.sample.weights);
-            }
-            else if (timeline_parameters.sample.type == "without-replacement") {
-                order = sampleWithoutReplacement(order, timeline_parameters.sample.size);
-            }
-            else if (timeline_parameters.sample.type == "fixed-repetitions") {
-                order = repeat(order, timeline_parameters.sample.size, false);
-            }
-            else if (timeline_parameters.sample.type == "alternate-groups") {
-                order = shuffleAlternateGroups(timeline_parameters.sample.groups, timeline_parameters.sample.randomize_group_order);
-            }
-            else {
-                console.error('Invalid type in timeline sample parameters. Valid options for type are "custom", "with-replacement", "without-replacement", "fixed-repetitions", and "alternate-groups"');
-            }
-        }
-        if (timeline_parameters.randomize_order) {
-            order = shuffle(order);
-        }
-        this.progress.order = order;
-    }
-    // next variable set
-    nextSet() {
-        this.progress.current_location = -1;
-        this.progress.current_variable_set++;
-        for (var i = 0; i < this.timeline_parameters.timeline.length; i++) {
-            this.timeline_parameters.timeline[i].reset();
-        }
-    }
-    // update the current trial node to be completed
-    // returns true if the node is complete after advance (all subnodes are also complete)
-    // returns false otherwise
-    advance() {
-        const progress = this.progress;
-        const timeline_parameters = this.timeline_parameters;
-        const internal = this.jsPsych.internal;
-        // first check to see if done
-        if (progress.done) {
-            return true;
-        }
-        // if node has not started yet (progress.current_location == -1),
-        // then try to start the node.
-        if (progress.current_location == -1) {
-            // check for on_timeline_start and conditonal function on nodes with timelines
-            if (typeof timeline_parameters !== "undefined") {
-                // only run the conditional function if this is the first repetition of the timeline when
-                // repetitions > 1, and only when on the first variable set
-                if (typeof timeline_parameters.conditional_function !== "undefined" &&
-                    progress.current_repetition == 0 &&
-                    progress.current_variable_set == 0) {
-                    internal.call_immediate = true;
-                    var conditional_result = timeline_parameters.conditional_function();
-                    internal.call_immediate = false;
-                    // if the conditional_function() returns false, then the timeline
-                    // doesn't run and is marked as complete.
-                    if (conditional_result == false) {
-                        progress.done = true;
-                        return true;
-                    }
-                }
-                // if we reach this point then the node has its own timeline and will start
-                // so we need to check if there is an on_timeline_start function if we are on the first variable set
-                if (typeof timeline_parameters.on_timeline_start !== "undefined" &&
-                    progress.current_variable_set == 0) {
-                    timeline_parameters.on_timeline_start();
-                }
-            }
-            // if we reach this point, then either the node doesn't have a timeline of the
-            // conditional function returned true and it can start
-            progress.current_location = 0;
-            // call advance again on this node now that it is pointing to a new location
-            return this.advance();
-        }
-        // if this node has a timeline, propogate down to the current trial.
-        if (typeof timeline_parameters !== "undefined") {
-            var have_node_to_run = false;
-            // keep incrementing the location in the timeline until one of the nodes reached is incomplete
-            while (progress.current_location < timeline_parameters.timeline.length &&
-                have_node_to_run == false) {
-                // check to see if the node currently pointed at is done
-                var target_complete = timeline_parameters.timeline[progress.current_location].advance();
-                if (!target_complete) {
-                    have_node_to_run = true;
-                    return false;
-                }
-                else {
-                    progress.current_location++;
-                }
-            }
-            // if we've reached the end of the timeline (which, if the code is here, we have)
-            // there are a few steps to see what to do next...
-            // first, check the timeline_variables to see if we need to loop through again
-            // with a new set of variables
-            if (progress.current_variable_set < progress.order.length - 1) {
-                // reset the progress of the node to be with the new set
-                this.nextSet();
-                // then try to advance this node again.
-                return this.advance();
-            }
-            // if we're all done with the timeline_variables, then check to see if there are more repetitions
-            else if (progress.current_repetition < timeline_parameters.repetitions - 1) {
-                this.nextRepetiton();
-                // check to see if there is an on_timeline_finish function
-                if (typeof timeline_parameters.on_timeline_finish !== "undefined") {
-                    timeline_parameters.on_timeline_finish();
-                }
-                return this.advance();
-            }
-            // if we're all done with the repetitions...
-            else {
-                // check to see if there is an on_timeline_finish function
-                if (typeof timeline_parameters.on_timeline_finish !== "undefined") {
-                    timeline_parameters.on_timeline_finish();
-                }
-                // if we're all done with the repetitions, check if there is a loop function.
-                if (typeof timeline_parameters.loop_function !== "undefined") {
-                    internal.call_immediate = true;
-                    if (timeline_parameters.loop_function(this.generatedData())) {
-                        this.reset();
-                        internal.call_immediate = false;
-                        return this.parent_node.advance();
-                    }
-                    else {
-                        progress.done = true;
-                        internal.call_immediate = false;
-                        return true;
-                    }
-                }
-            }
-            // no more loops on this timeline, we're done!
-            progress.done = true;
-            return true;
-        }
-    }
-    // check the status of the done flag
-    isComplete() {
-        return this.progress.done;
-    }
-    // getter method for timeline variables
-    getTimelineVariableValue(variable_name) {
-        if (typeof this.timeline_parameters == "undefined") {
-            return undefined;
-        }
-        var v = this.timeline_parameters.timeline_variables[this.progress.order[this.progress.current_variable_set]][variable_name];
-        return v;
-    }
-    // recursive upward search for timeline variables
-    findTimelineVariable(variable_name) {
-        var v = this.getTimelineVariableValue(variable_name);
-        if (typeof v == "undefined") {
-            if (typeof this.parent_node !== "undefined") {
-                return this.parent_node.findTimelineVariable(variable_name);
-            }
-            else {
-                return undefined;
-            }
-        }
-        else {
-            return v;
-        }
-    }
-    // recursive downward search for active trial to extract timeline variable
-    timelineVariable(variable_name) {
-        if (typeof this.timeline_parameters == "undefined") {
-            return this.findTimelineVariable(variable_name);
-        }
-        else {
-            // if progress.current_location is -1, then the timeline variable is being evaluated
-            // in a function that runs prior to the trial starting, so we should treat that trial
-            // as being the active trial for purposes of finding the value of the timeline variable
-            var loc = Math.max(0, this.progress.current_location);
-            // if loc is greater than the number of elements on this timeline, then the timeline
-            // variable is being evaluated in a function that runs after the trial on the timeline
-            // are complete but before advancing to the next (like a loop_function).
-            // treat the last active trial as the active trial for this purpose.
-            if (loc == this.timeline_parameters.timeline.length) {
-                loc = loc - 1;
-            }
-            // now find the variable
-            return this.timeline_parameters.timeline[loc].timelineVariable(variable_name);
-        }
-    }
-    // recursively get all the timeline variables for this trial
-    allTimelineVariables() {
-        var all_tvs = this.allTimelineVariablesNames();
-        var all_tvs_vals = {};
-        for (var i = 0; i < all_tvs.length; i++) {
-            all_tvs_vals[all_tvs[i]] = this.timelineVariable(all_tvs[i]);
-        }
-        return all_tvs_vals;
-    }
-    // helper to get all the names at this stage.
-    allTimelineVariablesNames(so_far = []) {
-        if (typeof this.timeline_parameters !== "undefined") {
-            so_far = so_far.concat(Object.keys(this.timeline_parameters.timeline_variables[this.progress.order[this.progress.current_variable_set]]));
-            // if progress.current_location is -1, then the timeline variable is being evaluated
-            // in a function that runs prior to the trial starting, so we should treat that trial
-            // as being the active trial for purposes of finding the value of the timeline variable
-            var loc = Math.max(0, this.progress.current_location);
-            // if loc is greater than the number of elements on this timeline, then the timeline
-            // variable is being evaluated in a function that runs after the trial on the timeline
-            // are complete but before advancing to the next (like a loop_function).
-            // treat the last active trial as the active trial for this purpose.
-            if (loc == this.timeline_parameters.timeline.length) {
-                loc = loc - 1;
-            }
-            // now find the variable
-            return this.timeline_parameters.timeline[loc].allTimelineVariablesNames(so_far);
-        }
-        if (typeof this.timeline_parameters == "undefined") {
-            return so_far;
-        }
-    }
-    // recursively get the number of **trials** contained in the timeline
-    // assuming that while loops execute exactly once and if conditionals
-    // always run
-    length() {
-        var length = 0;
-        if (typeof this.timeline_parameters !== "undefined") {
-            for (var i = 0; i < this.timeline_parameters.timeline.length; i++) {
-                length += this.timeline_parameters.timeline[i].length();
-            }
-        }
-        else {
-            return 1;
-        }
-        return length;
-    }
-    // return the percentage of trials completed, grouped at the first child level
-    // counts a set of trials as complete when the child node is done
-    percentComplete() {
-        var total_trials = this.length();
-        var completed_trials = 0;
-        for (var i = 0; i < this.timeline_parameters.timeline.length; i++) {
-            if (this.timeline_parameters.timeline[i].isComplete()) {
-                completed_trials += this.timeline_parameters.timeline[i].length();
-            }
-        }
-        return (completed_trials / total_trials) * 100;
-    }
-    // resets the node and all subnodes to original state
-    // but increments the current_iteration counter
-    reset() {
-        this.progress.current_location = -1;
-        this.progress.current_repetition = 0;
-        this.progress.current_variable_set = 0;
-        this.progress.current_iteration++;
-        this.progress.done = false;
-        this.setTimelineVariablesOrder();
-        if (typeof this.timeline_parameters != "undefined") {
-            for (var i = 0; i < this.timeline_parameters.timeline.length; i++) {
-                this.timeline_parameters.timeline[i].reset();
-            }
-        }
-    }
-    // mark this node as finished
-    end() {
-        this.progress.done = true;
-    }
-    // recursively end whatever sub-node is running the current trial
-    endActiveNode() {
-        if (typeof this.timeline_parameters == "undefined") {
-            this.end();
-            this.parent_node.end();
-        }
-        else {
-            this.timeline_parameters.timeline[this.progress.current_location].endActiveNode();
-        }
-    }
-    // get a unique ID associated with this node
-    // the ID reflects the current iteration through this node.
-    ID() {
-        var id = "";
-        if (typeof this.parent_node == "undefined") {
-            return "0." + this.progress.current_iteration;
-        }
-        else {
-            id += this.parent_node.ID() + "-";
-            id += this.relative_id + "." + this.progress.current_iteration;
-            return id;
-        }
-    }
-    // get the ID of the active trial
-    activeID() {
-        if (typeof this.timeline_parameters == "undefined") {
-            return this.ID();
-        }
-        else {
-            return this.timeline_parameters.timeline[this.progress.current_location].activeID();
-        }
-    }
-    // get all the data generated within this node
-    generatedData() {
-        return this.jsPsych.data.getDataByTimelineNode(this.ID());
-    }
-    // get all the trials of a particular type
-    trialsOfType(type) {
-        if (typeof this.timeline_parameters == "undefined") {
-            if (this.trial_parameters.type == type) {
-                return this.trial_parameters;
-            }
-            else {
-                return [];
-            }
-        }
-        else {
-            var trials = [];
-            for (var i = 0; i < this.timeline_parameters.timeline.length; i++) {
-                var t = this.timeline_parameters.timeline[i].trialsOfType(type);
-                trials = trials.concat(t);
-            }
-            return trials;
-        }
-    }
-    // add new trials to end of this timeline
-    insert(parameters) {
-        if (typeof this.timeline_parameters === "undefined") {
-            console.error("Cannot add new trials to a trial-level node.");
-        }
-        else {
-            this.timeline_parameters.timeline.push(new TimelineNode(this.jsPsych, Object.assign(Object.assign({}, this.node_trial_data), parameters), this, this.timeline_parameters.timeline.length));
-        }
-    }
-}
-
-function delay(ms) {
-    return new Promise((resolve) => setTimeout(resolve, ms));
-}
-class JsPsych {
-    constructor(options) {
-        this.extensions = {};
-        this.turk = turk;
-        this.randomization = randomization;
-        this.utils = utils;
-        //
-        // private variables
-        //
-        /**
-         * options
-         */
-        this.opts = {};
-        // flow control
-        this.global_trial_index = 0;
-        this.current_trial = {};
-        this.current_trial_finished = false;
-        /**
-         * is the experiment paused?
-         */
-        this.paused = false;
-        this.waiting = false;
-        /**
-         * is the page retrieved directly via file:// protocol (true) or hosted on a server (false)?
-         */
-        this.file_protocol = false;
-        /**
-         * is the experiment running in `simulate()` mode
-         */
-        this.simulation_mode = null;
-        // storing a single webaudio context to prevent problems with multiple inits
-        // of jsPsych
-        this.webaudio_context = null;
-        this.internal = {
-            /**
-             * this flag is used to determine whether we are in a scope where
-             * jsPsych.timelineVariable() should be executed immediately or
-             * whether it should return a function to access the variable later.
-             *
-             **/
-            call_immediate: false,
-        };
-        this.progress_bar_amount = 0;
-        // override default options if user specifies an option
-        options = Object.assign({ display_element: undefined, on_finish: () => { }, on_trial_start: () => { }, on_trial_finish: () => { }, on_data_update: () => { }, on_interaction_data_update: () => { }, on_close: () => { }, use_webaudio: true, exclusions: {}, show_progress_bar: false, message_progress_bar: "Completion Progress", auto_update_progress_bar: true, default_iti: 0, minimum_valid_rt: 0, experiment_width: null, override_safe_mode: false, case_sensitive_responses: false, extensions: [] }, options);
-        this.opts = options;
-        autoBind(this); // so we can pass JsPsych methods as callbacks and `this` remains the JsPsych instance
-        this.webaudio_context =
-            typeof window !== "undefined" && typeof window.AudioContext !== "undefined"
-                ? new AudioContext()
-                : null;
-        // detect whether page is running in browser as a local file, and if so, disable web audio and video preloading to prevent CORS issues
-        if (window.location.protocol == "file:" &&
-            (options.override_safe_mode === false || typeof options.override_safe_mode === "undefined")) {
-            options.use_webaudio = false;
-            this.file_protocol = true;
-            console.warn("jsPsych detected that it is running via the file:// protocol and not on a web server. " +
-                "To prevent issues with cross-origin requests, Web Audio and video preloading have been disabled. " +
-                "If you would like to override this setting, you can set 'override_safe_mode' to 'true' in initJsPsych. " +
-                "For more information, see: https://www.jspsych.org/overview/running-experiments");
-        }
-        // initialize modules
-        this.data = new JsPsychData(this);
-        this.pluginAPI = createJointPluginAPIObject(this);
-        // create instances of extensions
-        for (const extension of options.extensions) {
-            this.extensions[extension.type.info.name] = new extension.type(this);
-        }
-        // initialize audio context based on options and browser capabilities
-        this.pluginAPI.initAudio();
-    }
-    version() {
-        return version;
-    }
-    /**
-     * Starts an experiment using the provided timeline and returns a promise that is resolved when
-     * the experiment is finished.
-     *
-     * @param timeline The timeline to be run
-     */
-    run(timeline) {
-        return __awaiter(this, void 0, void 0, function* () {
-            if (typeof timeline === "undefined") {
-                console.error("No timeline declared in jsPsych.run. Cannot start experiment.");
-            }
-            if (timeline.length === 0) {
-                console.error("No trials have been added to the timeline (the timeline is an empty array). Cannot start experiment.");
-            }
-            // create experiment timeline
-            this.timelineDescription = timeline;
-            this.timeline = new TimelineNode(this, { timeline });
-            yield this.prepareDom();
-            yield this.checkExclusions(this.opts.exclusions);
-            yield this.loadExtensions(this.opts.extensions);
-            document.documentElement.setAttribute("jspsych", "present");
-            this.startExperiment();
-            yield this.finished;
-        });
-    }
-    simulate(timeline, simulation_mode = "data-only", simulation_options = {}) {
-        return __awaiter(this, void 0, void 0, function* () {
-            this.simulation_mode = simulation_mode;
-            this.simulation_options = simulation_options;
-            yield this.run(timeline);
-        });
-    }
-    getProgress() {
-        return {
-            total_trials: typeof this.timeline === "undefined" ? undefined : this.timeline.length(),
-            current_trial_global: this.global_trial_index,
-            percent_complete: typeof this.timeline === "undefined" ? 0 : this.timeline.percentComplete(),
-        };
-    }
-    getStartTime() {
-        return this.exp_start_time;
-    }
-    getTotalTime() {
-        if (typeof this.exp_start_time === "undefined") {
-            return 0;
-        }
-        return new Date().getTime() - this.exp_start_time.getTime();
-    }
-    getDisplayElement() {
-        return this.DOM_target;
-    }
-    getDisplayContainerElement() {
-        return this.DOM_container;
-    }
-    finishTrial(data = {}) {
-        if (this.current_trial_finished) {
-            return;
-        }
-        this.current_trial_finished = true;
-        // remove any CSS classes that were added to the DOM via css_classes parameter
-        if (typeof this.current_trial.css_classes !== "undefined" &&
-            Array.isArray(this.current_trial.css_classes)) {
-            this.DOM_target.classList.remove(...this.current_trial.css_classes);
-        }
-        // write the data from the trial
-        this.data.write(data);
-        // get back the data with all of the defaults in
-        const trial_data = this.data.get().filter({ trial_index: this.global_trial_index });
-        // for trial-level callbacks, we just want to pass in a reference to the values
-        // of the DataCollection, for easy access and editing.
-        const trial_data_values = trial_data.values()[0];
-        const current_trial = this.current_trial;
-        if (typeof current_trial.save_trial_parameters === "object") {
-            for (const key of Object.keys(current_trial.save_trial_parameters)) {
-                const key_val = current_trial.save_trial_parameters[key];
-                if (key_val === true) {
-                    if (typeof current_trial[key] === "undefined") {
-                        console.warn(`Invalid parameter specified in save_trial_parameters. Trial has no property called "${key}".`);
-                    }
-                    else if (typeof current_trial[key] === "function") {
-                        trial_data_values[key] = current_trial[key].toString();
-                    }
-                    else {
-                        trial_data_values[key] = current_trial[key];
-                    }
-                }
-                if (key_val === false) {
-                    // we don't allow internal_node_id or trial_index to be deleted because it would break other things
-                    if (key !== "internal_node_id" && key !== "trial_index") {
-                        delete trial_data_values[key];
-                    }
-                }
-            }
-        }
-        // handle extension callbacks
-        if (Array.isArray(current_trial.extensions)) {
-            for (const extension of current_trial.extensions) {
-                const ext_data_values = this.extensions[extension.type.info.name].on_finish(extension.params);
-                Object.assign(trial_data_values, ext_data_values);
-            }
-        }
-        // about to execute lots of callbacks, so switch context.
-        this.internal.call_immediate = true;
-        // handle callback at plugin level
-        if (typeof current_trial.on_finish === "function") {
-            current_trial.on_finish(trial_data_values);
-        }
-        // handle callback at whole-experiment level
-        this.opts.on_trial_finish(trial_data_values);
-        // after the above callbacks are complete, then the data should be finalized
-        // for this trial. call the on_data_update handler, passing in the same
-        // data object that just went through the trial's finish handlers.
-        this.opts.on_data_update(trial_data_values);
-        // done with callbacks
-        this.internal.call_immediate = false;
-        // wait for iti
-        if (this.simulation_mode === "data-only") {
-            this.nextTrial();
-        }
-        else if (typeof current_trial.post_trial_gap === null ||
-            typeof current_trial.post_trial_gap === "undefined") {
-            if (this.opts.default_iti > 0) {
-                setTimeout(this.nextTrial, this.opts.default_iti);
-            }
-            else {
-                this.nextTrial();
-            }
-        }
-        else {
-            if (current_trial.post_trial_gap > 0) {
-                setTimeout(this.nextTrial, current_trial.post_trial_gap);
-            }
-            else {
-                this.nextTrial();
-            }
-        }
-    }
-    endExperiment(end_message = "", data = {}) {
-        this.timeline.end_message = end_message;
-        this.timeline.end();
-        this.pluginAPI.cancelAllKeyboardResponses();
-        this.pluginAPI.clearAllTimeouts();
-        this.finishTrial(data);
-    }
-    endCurrentTimeline() {
-        this.timeline.endActiveNode();
-    }
-    getCurrentTrial() {
-        return this.current_trial;
-    }
-    getInitSettings() {
-        return this.opts;
-    }
-    getCurrentTimelineNodeID() {
-        return this.timeline.activeID();
-    }
-    timelineVariable(varname, immediate = false) {
-        if (this.internal.call_immediate || immediate === true) {
-            return this.timeline.timelineVariable(varname);
-        }
-        else {
-            return {
-                timelineVariablePlaceholder: true,
-                timelineVariableFunction: () => this.timeline.timelineVariable(varname),
-            };
-        }
-    }
-    getAllTimelineVariables() {
-        return this.timeline.allTimelineVariables();
-    }
-    addNodeToEndOfTimeline(new_timeline, preload_callback) {
-        this.timeline.insert(new_timeline);
-    }
-    pauseExperiment() {
-        this.paused = true;
-    }
-    resumeExperiment() {
-        this.paused = false;
-        if (this.waiting) {
-            this.waiting = false;
-            this.nextTrial();
-        }
-    }
-    loadFail(message) {
-        message = message || "

The experiment failed to load.

"; - this.DOM_target.innerHTML = message; - } - getSafeModeStatus() { - return this.file_protocol; - } - getTimeline() { - return this.timelineDescription; - } - prepareDom() { - return __awaiter(this, void 0, void 0, function* () { - // Wait until the document is ready - if (document.readyState !== "complete") { - yield new Promise((resolve) => { - window.addEventListener("load", resolve); - }); - } - const options = this.opts; - // set DOM element where jsPsych will render content - // if undefined, then jsPsych will use the tag and the entire page - if (typeof options.display_element === "undefined") { - // check if there is a body element on the page - const body = document.querySelector("body"); - if (body === null) { - document.documentElement.appendChild(document.createElement("body")); - } - // using the full page, so we need the HTML element to - // have 100% height, and body to be full width and height with - // no margin - document.querySelector("html").style.height = "100%"; - document.querySelector("body").style.margin = "0px"; - document.querySelector("body").style.height = "100%"; - document.querySelector("body").style.width = "100%"; - options.display_element = document.querySelector("body"); - } - else { - // make sure that the display element exists on the page - const display = options.display_element instanceof Element - ? options.display_element - : document.querySelector("#" + options.display_element); - if (display === null) { - console.error("The display_element specified in initJsPsych() does not exist in the DOM."); - } - else { - options.display_element = display; - } - } - options.display_element.innerHTML = - '
'; - this.DOM_container = options.display_element; - this.DOM_target = document.querySelector("#jspsych-content"); - // set experiment_width if not null - if (options.experiment_width !== null) { - this.DOM_target.style.width = options.experiment_width + "px"; - } - // add tabIndex attribute to scope event listeners - options.display_element.tabIndex = 0; - // add CSS class to DOM_target - if (options.display_element.className.indexOf("jspsych-display-element") === -1) { - options.display_element.className += " jspsych-display-element"; - } - this.DOM_target.className += "jspsych-content"; - // create listeners for user browser interaction - this.data.createInteractionListeners(); - // add event for closing window - window.addEventListener("beforeunload", options.on_close); - }); - } - loadExtensions(extensions) { - return __awaiter(this, void 0, void 0, function* () { - // run the .initialize method of any extensions that are in use - // these should return a Promise to indicate when loading is complete - try { - yield Promise.all(extensions.map((extension) => this.extensions[extension.type.info.name].initialize(extension.params || {}))); - } - catch (error_message) { - console.error(error_message); - throw new Error(error_message); - } - }); - } - startExperiment() { - this.finished = new Promise((resolve) => { - this.resolveFinishedPromise = resolve; - }); - // show progress bar if requested - if (this.opts.show_progress_bar === true) { - this.drawProgressBar(this.opts.message_progress_bar); - } - // record the start time - this.exp_start_time = new Date(); - // begin! - this.timeline.advance(); - this.doTrial(this.timeline.trial()); - } - finishExperiment() { - const finish_result = this.opts.on_finish(this.data.get()); - const done_handler = () => { - if (typeof this.timeline.end_message !== "undefined") { - this.DOM_target.innerHTML = this.timeline.end_message; - } - this.resolveFinishedPromise(); - }; - if (finish_result) { - Promise.resolve(finish_result).then(done_handler); - } - else { - done_handler(); - } - } - nextTrial() { - // if experiment is paused, don't do anything. - if (this.paused) { - this.waiting = true; - return; - } - this.global_trial_index++; - // advance timeline - this.timeline.markCurrentTrialComplete(); - const complete = this.timeline.advance(); - // update progress bar if shown - if (this.opts.show_progress_bar === true && this.opts.auto_update_progress_bar === true) { - this.updateProgressBar(); - } - // check if experiment is over - if (complete) { - this.finishExperiment(); - return; - } - this.doTrial(this.timeline.trial()); - } - doTrial(trial) { - this.current_trial = trial; - this.current_trial_finished = false; - // process all timeline variables for this trial - this.evaluateTimelineVariables(trial); - if (typeof trial.type === "string") { - throw new MigrationError("A string was provided as the trial's `type` parameter. Since jsPsych v7, the `type` parameter needs to be a plugin object."); - } - // instantiate the plugin for this trial - trial.type = Object.assign(Object.assign({}, autoBind(new trial.type(this))), { info: trial.type.info }); - // evaluate variables that are functions - this.evaluateFunctionParameters(trial); - // get default values for parameters - this.setDefaultValues(trial); - // about to execute callbacks - this.internal.call_immediate = true; - // call experiment wide callback - this.opts.on_trial_start(trial); - // call trial specific callback if it exists - if (typeof trial.on_start === "function") { - trial.on_start(trial); - } - // call any on_start functions for extensions - if (Array.isArray(trial.extensions)) { - for (const extension of trial.extensions) { - this.extensions[extension.type.info.name].on_start(extension.params); - } - } - // apply the focus to the element containing the experiment. - this.DOM_container.focus(); - // reset the scroll on the DOM target - this.DOM_target.scrollTop = 0; - // add CSS classes to the DOM_target if they exist in trial.css_classes - if (typeof trial.css_classes !== "undefined") { - if (!Array.isArray(trial.css_classes) && typeof trial.css_classes === "string") { - trial.css_classes = [trial.css_classes]; - } - if (Array.isArray(trial.css_classes)) { - this.DOM_target.classList.add(...trial.css_classes); - } - } - // setup on_load event callback - const load_callback = () => { - if (typeof trial.on_load === "function") { - trial.on_load(); - } - // call any on_load functions for extensions - if (Array.isArray(trial.extensions)) { - for (const extension of trial.extensions) { - this.extensions[extension.type.info.name].on_load(extension.params); - } - } - }; - let trial_complete; - if (!this.simulation_mode) { - trial_complete = trial.type.trial(this.DOM_target, trial, load_callback); - } - if (this.simulation_mode) { - // check if the trial supports simulation - if (trial.type.simulate) { - let trial_sim_opts; - if (!trial.simulation_options) { - trial_sim_opts = this.simulation_options.default; - } - if (trial.simulation_options) { - if (typeof trial.simulation_options == "string") { - if (this.simulation_options[trial.simulation_options]) { - trial_sim_opts = this.simulation_options[trial.simulation_options]; - } - else if (this.simulation_options.default) { - console.log(`No matching simulation options found for "${trial.simulation_options}". Using "default" options.`); - trial_sim_opts = this.simulation_options.default; - } - else { - console.log(`No matching simulation options found for "${trial.simulation_options}" and no "default" options provided. Using the default values provided by the plugin.`); - trial_sim_opts = {}; - } - } - else { - trial_sim_opts = trial.simulation_options; - } - } - trial_sim_opts = this.utils.deepCopy(trial_sim_opts); - trial_sim_opts = this.replaceFunctionsWithValues(trial_sim_opts, null); - if ((trial_sim_opts === null || trial_sim_opts === void 0 ? void 0 : trial_sim_opts.simulate) === false) { - trial_complete = trial.type.trial(this.DOM_target, trial, load_callback); - } - else { - trial_complete = trial.type.simulate(trial, (trial_sim_opts === null || trial_sim_opts === void 0 ? void 0 : trial_sim_opts.mode) || this.simulation_mode, trial_sim_opts, load_callback); - } - } - else { - // trial doesn't have a simulate method, so just run as usual - trial_complete = trial.type.trial(this.DOM_target, trial, load_callback); - } - } - // see if trial_complete is a Promise by looking for .then() function - const is_promise = trial_complete && typeof trial_complete.then == "function"; - // in simulation mode we let the simulate function call the load_callback always. - if (!is_promise && !this.simulation_mode) { - load_callback(); - } - // done with callbacks - this.internal.call_immediate = false; - } - evaluateTimelineVariables(trial) { - for (const key of Object.keys(trial)) { - // timeline variables on the root level - if (typeof trial[key] === "object" && - trial[key] !== null && - typeof trial[key].timelineVariablePlaceholder !== "undefined") { - /*trial[key].toString().replace(/\s/g, "") == - "function(){returntimeline.timelineVariable(varname);}" - )*/ trial[key] = trial[key].timelineVariableFunction(); - } - // timeline variables that are nested in objects - if (typeof trial[key] === "object" && trial[key] !== null) { - this.evaluateTimelineVariables(trial[key]); - } - } - } - evaluateFunctionParameters(trial) { - // set a flag so that jsPsych.timelineVariable() is immediately executed in this context - this.internal.call_immediate = true; - // iterate over each parameter - for (const key of Object.keys(trial)) { - // check to make sure parameter is not "type", since that was eval'd above. - if (key !== "type") { - // this if statement is checking to see if the parameter type is expected to be a function, in which case we should NOT evaluate it. - // the first line checks if the parameter is defined in the universalPluginParameters set - // the second line checks the plugin-specific parameters - if (typeof universalPluginParameters[key] !== "undefined" && - universalPluginParameters[key].type !== ParameterType.FUNCTION) { - trial[key] = this.replaceFunctionsWithValues(trial[key], null); - } - if (typeof trial.type.info.parameters[key] !== "undefined" && - trial.type.info.parameters[key].type !== ParameterType.FUNCTION) { - trial[key] = this.replaceFunctionsWithValues(trial[key], trial.type.info.parameters[key]); - } - } - } - // reset so jsPsych.timelineVariable() is no longer immediately executed - this.internal.call_immediate = false; - } - replaceFunctionsWithValues(obj, info) { - // null typeof is 'object' (?!?!), so need to run this first! - if (obj === null) { - return obj; - } - // arrays - else if (Array.isArray(obj)) { - for (let i = 0; i < obj.length; i++) { - obj[i] = this.replaceFunctionsWithValues(obj[i], info); - } - } - // objects - else if (typeof obj === "object") { - if (info === null || !info.nested) { - for (const key of Object.keys(obj)) { - if (key === "type") { - // Ignore the object's `type` field because it contains a plugin and we do not want to - // call plugin functions - continue; - } - obj[key] = this.replaceFunctionsWithValues(obj[key], null); - } - } - else { - for (const key of Object.keys(obj)) { - if (typeof info.nested[key] === "object" && - info.nested[key].type !== ParameterType.FUNCTION) { - obj[key] = this.replaceFunctionsWithValues(obj[key], info.nested[key]); - } - } - } - } - else if (typeof obj === "function") { - return obj(); - } - return obj; - } - setDefaultValues(trial) { - for (const param in trial.type.info.parameters) { - // check if parameter is complex with nested defaults - if (trial.type.info.parameters[param].type === ParameterType.COMPLEX) { - if (trial.type.info.parameters[param].array === true) { - // iterate over each entry in the array - trial[param].forEach(function (ip, i) { - // check each parameter in the plugin description - for (const p in trial.type.info.parameters[param].nested) { - if (typeof trial[param][i][p] === "undefined" || trial[param][i][p] === null) { - if (typeof trial.type.info.parameters[param].nested[p].default === "undefined") { - console.error("You must specify a value for the " + - p + - " parameter (nested in the " + - param + - " parameter) in the " + - trial.type + - " plugin."); - } - else { - trial[param][i][p] = trial.type.info.parameters[param].nested[p].default; - } - } - } - }); - } - } - // if it's not nested, checking is much easier and do that here: - else if (typeof trial[param] === "undefined" || trial[param] === null) { - if (typeof trial.type.info.parameters[param].default === "undefined") { - console.error("You must specify a value for the " + - param + - " parameter in the " + - trial.type.info.name + - " plugin."); - } - else { - trial[param] = trial.type.info.parameters[param].default; - } - } - } - } - checkExclusions(exclusions) { - return __awaiter(this, void 0, void 0, function* () { - if (exclusions.min_width || exclusions.min_height || exclusions.audio) { - console.warn("The exclusions option in `initJsPsych()` is deprecated and will be removed in a future version. We recommend using the browser-check plugin instead. See https://www.jspsych.org/latest/plugins/browser-check/."); - } - // MINIMUM SIZE - if (exclusions.min_width || exclusions.min_height) { - const mw = exclusions.min_width || 0; - const mh = exclusions.min_height || 0; - if (window.innerWidth < mw || window.innerHeight < mh) { - this.getDisplayElement().innerHTML = - "

Your browser window is too small to complete this experiment. " + - "Please maximize the size of your browser window. If your browser window is already maximized, " + - "you will not be able to complete this experiment.

" + - "

The minimum width is " + - mw + - "px. Your current width is " + - window.innerWidth + - "px.

" + - "

The minimum height is " + - mh + - "px. Your current height is " + - window.innerHeight + - "px.

"; - // Wait for window size to increase - while (window.innerWidth < mw || window.innerHeight < mh) { - yield delay(100); - } - this.getDisplayElement().innerHTML = ""; - } - } - // WEB AUDIO API - if (typeof exclusions.audio !== "undefined" && exclusions.audio) { - if (!window.hasOwnProperty("AudioContext") && !window.hasOwnProperty("webkitAudioContext")) { - this.getDisplayElement().innerHTML = - "

Your browser does not support the WebAudio API, which means that you will not " + - "be able to complete the experiment.

Browsers that support the WebAudio API include " + - "Chrome, Firefox, Safari, and Edge.

"; - throw new Error(); - } - } - }); - } - drawProgressBar(msg) { - document - .querySelector(".jspsych-display-element") - .insertAdjacentHTML("afterbegin", '
' + - "" + - msg + - "" + - '
' + - '
' + - "
"); - } - updateProgressBar() { - this.setProgressBar(this.getProgress().percent_complete / 100); - } - setProgressBar(proportion_complete) { - proportion_complete = Math.max(Math.min(1, proportion_complete), 0); - document.querySelector("#jspsych-progressbar-inner").style.width = - proportion_complete * 100 + "%"; - this.progress_bar_amount = proportion_complete; - } - getProgressBarCompleted() { - return this.progress_bar_amount; - } -} - -// temporary patch for Safari -if (typeof window !== "undefined" && - window.hasOwnProperty("webkitAudioContext") && - !window.hasOwnProperty("AudioContext")) { - // @ts-expect-error - window.AudioContext = webkitAudioContext; -} -// end patch -// The following function provides a uniform interface to initialize jsPsych, no matter whether a -// browser supports ES6 classes or not (and whether the ES6 build or the Babel build is used). -/** - * Creates a new JsPsych instance using the provided options. - * - * @param options The options to pass to the JsPsych constructor - * @returns A new JsPsych instance - */ -function initJsPsych(options) { - const jsPsych = new JsPsych(options); - // Handle invocations of non-existent v6 methods with migration errors - const migrationMessages = { - init: "`jsPsych.init()` was replaced by `initJsPsych()` in jsPsych v7.", - ALL_KEYS: 'jsPsych.ALL_KEYS was replaced by the "ALL_KEYS" string in jsPsych v7.', - NO_KEYS: 'jsPsych.NO_KEYS was replaced by the "NO_KEYS" string in jsPsych v7.', - // Getter functions that were renamed - currentTimelineNodeID: "`currentTimelineNodeID()` was renamed to `getCurrentTimelineNodeID()` in jsPsych v7.", - progress: "`progress()` was renamed to `getProgress()` in jsPsych v7.", - startTime: "`startTime()` was renamed to `getStartTime()` in jsPsych v7.", - totalTime: "`totalTime()` was renamed to `getTotalTime()` in jsPsych v7.", - currentTrial: "`currentTrial()` was renamed to `getCurrentTrial()` in jsPsych v7.", - initSettings: "`initSettings()` was renamed to `getInitSettings()` in jsPsych v7.", - allTimelineVariables: "`allTimelineVariables()` was renamed to `getAllTimelineVariables()` in jsPsych v7.", - }; - Object.defineProperties(jsPsych, Object.fromEntries(Object.entries(migrationMessages).map(([key, message]) => [ - key, - { - get() { - throw new MigrationError(message); - }, - }, - ]))); - return jsPsych; -} - - -//# sourceMappingURL=index.js.map - - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ id: moduleId, -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = __webpack_modules__; -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/async module */ -/******/ (() => { -/******/ var webpackThen = typeof Symbol === "function" ? Symbol("webpack then") : "__webpack_then__"; -/******/ var webpackExports = typeof Symbol === "function" ? Symbol("webpack exports") : "__webpack_exports__"; -/******/ var webpackError = typeof Symbol === "function" ? Symbol("webpack error") : "__webpack_error__"; -/******/ var completeQueue = (queue) => { -/******/ if(queue) { -/******/ queue.forEach((fn) => (fn.r--)); -/******/ queue.forEach((fn) => (fn.r-- ? fn.r++ : fn())); -/******/ } -/******/ } -/******/ var completeFunction = (fn) => (!--fn.r && fn()); -/******/ var queueFunction = (queue, fn) => (queue ? queue.push(fn) : completeFunction(fn)); -/******/ var wrapDeps = (deps) => (deps.map((dep) => { -/******/ if(dep !== null && typeof dep === "object") { -/******/ if(dep[webpackThen]) return dep; -/******/ if(dep.then) { -/******/ var queue = []; -/******/ dep.then((r) => { -/******/ obj[webpackExports] = r; -/******/ completeQueue(queue); -/******/ queue = 0; -/******/ }, (e) => { -/******/ obj[webpackError] = e; -/******/ completeQueue(queue); -/******/ queue = 0; -/******/ }); -/******/ var obj = {}; -/******/ obj[webpackThen] = (fn, reject) => (queueFunction(queue, fn), dep['catch'](reject)); -/******/ return obj; -/******/ } -/******/ } -/******/ var ret = {}; -/******/ ret[webpackThen] = (fn) => (completeFunction(fn)); -/******/ ret[webpackExports] = dep; -/******/ return ret; -/******/ })); -/******/ __webpack_require__.a = (module, body, hasAwait) => { -/******/ var queue = hasAwait && []; -/******/ var exports = module.exports; -/******/ var currentDeps; -/******/ var outerResolve; -/******/ var reject; -/******/ var isEvaluating = true; -/******/ var nested = false; -/******/ var whenAll = (deps, onResolve, onReject) => { -/******/ if (nested) return; -/******/ nested = true; -/******/ onResolve.r += deps.length; -/******/ deps.map((dep, i) => (dep[webpackThen](onResolve, onReject))); -/******/ nested = false; -/******/ }; -/******/ var promise = new Promise((resolve, rej) => { -/******/ reject = rej; -/******/ outerResolve = () => (resolve(exports), completeQueue(queue), queue = 0); -/******/ }); -/******/ promise[webpackExports] = exports; -/******/ promise[webpackThen] = (fn, rejectFn) => { -/******/ if (isEvaluating) { return completeFunction(fn); } -/******/ if (currentDeps) whenAll(currentDeps, fn, rejectFn); -/******/ queueFunction(queue, fn); -/******/ promise['catch'](rejectFn); -/******/ }; -/******/ module.exports = promise; -/******/ body((deps) => { -/******/ currentDeps = wrapDeps(deps); -/******/ var fn; -/******/ var getResult = () => (currentDeps.map((d) => { -/******/ if(d[webpackError]) throw d[webpackError]; -/******/ return d[webpackExports]; -/******/ })) -/******/ var promise = new Promise((resolve, reject) => { -/******/ fn = () => (resolve(getResult)); -/******/ fn.r = 0; -/******/ whenAll(currentDeps, fn, reject); -/******/ }); -/******/ return fn.r ? promise : getResult(); -/******/ }, (err) => (err && reject(promise[webpackError] = err), outerResolve())); -/******/ isEvaluating = false; -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/compat get default export */ -/******/ (() => { -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = (module) => { -/******/ var getter = module && module.__esModule ? -/******/ () => (module['default']) : -/******/ () => (module); -/******/ __webpack_require__.d(getter, { a: getter }); -/******/ return getter; -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/global */ -/******/ (() => { -/******/ __webpack_require__.g = (function() { -/******/ if (typeof globalThis === 'object') return globalThis; -/******/ try { -/******/ return this || new Function('return this')(); -/******/ } catch (e) { -/******/ if (typeof window === 'object') return window; -/******/ } -/******/ })(); -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/publicPath */ -/******/ (() => { -/******/ var scriptUrl; -/******/ if (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + ""; -/******/ var document = __webpack_require__.g.document; -/******/ if (!scriptUrl && document) { -/******/ if (document.currentScript) -/******/ scriptUrl = document.currentScript.src -/******/ if (!scriptUrl) { -/******/ var scripts = document.getElementsByTagName("script"); -/******/ if(scripts.length) scriptUrl = scripts[scripts.length - 1].src -/******/ } -/******/ } -/******/ // When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration -/******/ // or pass an empty string ("") and set the __webpack_public_path__ variable from your code to use your own logic. -/******/ if (!scriptUrl) throw new Error("Automatic publicPath is not supported in this browser"); -/******/ scriptUrl = scriptUrl.replace(/#.*$/, "").replace(/\?.*$/, "").replace(/\/[^\/]+$/, "/"); -/******/ __webpack_require__.p = scriptUrl; -/******/ })(); -/******/ -/******/ /* webpack/runtime/jsonp chunk loading */ -/******/ (() => { -/******/ __webpack_require__.b = document.baseURI || self.location.href; -/******/ -/******/ // object to store loaded and loading chunks -/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched -/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded -/******/ var installedChunks = { -/******/ "index": 0 -/******/ }; -/******/ -/******/ // no chunk on demand loading -/******/ -/******/ // no prefetching -/******/ -/******/ // no preloaded -/******/ -/******/ // no HMR -/******/ -/******/ // no HMR manifest -/******/ -/******/ // no on chunks loaded -/******/ -/******/ // no jsonp function -/******/ })(); -/******/ -/************************************************************************/ -/******/ -/******/ // startup -/******/ // Load entry module and return exports -/******/ // This entry module used 'module' so it can't be inlined -/******/ var __webpack_exports__ = __webpack_require__("./src/index.js"); -/******/ -/******/ })() -; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0Msd0RBQVk7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLG9EQUFNO0FBQzVCO0FBQ0EsOEJBQThCLDREQUFjO0FBQzVDLGlDQUFpQyxzREFBVyxDQUFDLEtBQUssSUFBSTtBQUN0RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQscUJBQXFCLGlCQUFpQjtBQUN6Rix3QkFB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLHNEQUFzRDtBQUN6RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxrRUFBa0I7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLHdEQUFZO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHVCQUF1QixHQUFHLG1CQUFtQixHQUFHLFVBQVU7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxrRUFBa0I7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLCtEQUFlO0FB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N0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osa0JBQWtCLCtEQUErRDtBQUNqRjtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsWUFBWTtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLDRCQUE0QjtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNO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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxxREFBSztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLG1CQUFtQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLG1CQUFtQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsa0JBQWtCLG9CQUFvQixtQkFBbUI7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsMkJBQTJCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFlBQVk7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxhQUFhO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSw0REFBNEQsMEJBQTBCO0FBQ3RGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0VBQWtFLFdBQVc7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxRUFBcUU7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFLEtBQUs7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQix3QkFBd0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLG1CQUFtQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxnQkFBZ0IsT0FBTyxFQUFFLG9DQUFvQztBQUM3RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RkFBd0Y7QUFDeEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FLFNBQVM7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixnREFBZ0Q7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixTQUFTO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsZUFBZSxHQUFHLDJEQUFXO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBLGFBQWEsRUFBRTtBQUNmO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxvREFBb0Q7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQsWUFBWTtBQUNuRTtBQUNBO0FBQ0Esa0RBQWtELFlBQVksOEJBQThCLFlBQVk7QUFDeEc7QUFDQTtBQUNBLDREQUE0RDtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtB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QUFDL0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxTQUFTO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0Q7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLGFBQWE7QUFDNUM7QUFDQSwrRUFBK0Usb0NBQW9DO0FBQ25IO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXNCLDREQUFjO0FBQ3BDO0FBQ0EsOEJBQThCLEVBQUUsS0FBSyxFQUFFO0FBQ3ZDO0FBQ0E7O0FBRUE7QUFDQSxzQkFBc0IsNERBQWM7QUFDcEM7QUFDQSw4QkFBOEIsRUFBRSxLQUFLLEVBQUU7QUFDdkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsMkRBQWE7QUFDbkM7QUFDQSw2QkFBNkIsRUFBRSxLQUFLLEVBQUU7QUFDdEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixFQUFFO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1FQUFtRSx5REFBYTtBQUNoRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLFVBQVUsVUFBVSxVQUFVLEtBQUssYUFBYTtBQUNqRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdIQUFnSCxFQUFFO0FBQ2xIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtHQUFrRywwQ0FBMEMsZ0JBQWdCO0FBQzVKO0FBQ0Esb0ZBQW9GLHdCQUF3QjtBQUM1RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRUFBMkU7QUFDM0U7QUFDQSxvQkFBb0IsT0FBTztBQUMzQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsZUFBZTtBQUM3QjtBQUNBLDRCQUE0QixjQUFjO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksZ0hBQWdIO0FBQ3BIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsaUJBQWlCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGlCQUFpQjtBQUN6QztBQUNBO0FBQ0E7QUFDQSxvREFBb0QsT0FBTztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsT0FBTztBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBGQUEwRixFQUFFO0FBQzVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVGQUF1RixFQUFFO0FBQ3pGO0FBQ0E7QUFDQTtBQUNBLGNBQWMsY0FBYztBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixjQUFjO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLGNBQWM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsMkJBQTJCLEVBQUU7O0FBRTdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRJQUE0STtBQUM1STs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7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QUFDMUM7QUFDQSxvQkFBb0Isc0JBQXNCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0IsdUJBQXVCO0FBQzNDO0FBQ0EsMkZBQTJGO0FBQzNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQix1QkFBdUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVHQUF1RztBQUN2RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1SUFBdUk7QUFDdkk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsVUFBVSxNQUFNLFlBQVk7QUFDMUM7O0FBRUE7QUFDQSwyQkFBMkIsWUFBWSxZQUFZLFlBQVk7QUFDL0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsY0FBYztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsY0FBYztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsY0FBYztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGNBQWM7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsY0FBYztBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQsRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLGNBQWM7QUFDL0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGNBQWM7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsY0FBYyx1Q0FBdUMsdUJBQXVCLGNBQWM7QUFDdkk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlFQUFpRTtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCxZQUFZO0FBQ2xFO0FBQ0EsY0FBYyxhQUFhO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDtBQUNBO0FBQ0Esd0ZBQXdGLGFBQWE7QUFDckc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGFBQWE7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGlCQUFpQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiw4RUFBOEUsR0FBRyx3Q0FBd0M7QUFDM0k7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQjtBQUNqQztBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVixLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsMkZBQTJGO0FBQzNGO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLE9BQU87QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsT0FBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCOztBQUVqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixxREFBSztBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxvRUFBb0I7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixxREFBSztBQUMvQjtBQUNBLDBDQUEwQyxXQUFXLGdCQUFnQjtBQUNyRTtBQUNBLDhDQUE4QyxhQUFhO0FBQzNEO0FBQ0EsK0NBQStDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1REFBdUQsRUFBRSxZQUFZLEVBQUU7QUFDdkU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQixxREFBSztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFGQUFxRixFQUFFO0FBQ3ZGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsMkJBQTJCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixjQUFjO0FBQ3RDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLDBCQUEwQixvQkFBb0IscUJBQXFCLHlCQUF5QixPQUFPO0FBQzNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUVBQXlFO0FBQ3pFO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLDRCQUE0QjtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVGQUF1RjtBQUN2RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0Msc0NBQXNDLHdFQUF3RTtBQUM5RztBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLHNFQUFzRSxnQkFBZ0I7QUFDdEYsVUFBVSxvRUFBb0U7QUFDOUUsNENBQTRDLDhEQUE4RDtBQUMxRztBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLE9BQU87QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFNBQVM7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsU0FBUztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLGtFQUFrRTtBQUN2RyxnRUFBZ0U7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsa0VBQWtFO0FBQ3ZHLGdFQUFnRTtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxjQUFjO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLGNBQWM7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsY0FBYztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQiw4QkFBOEI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYywrQkFBK0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsY0FBYztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThELGFBQWEsVUFBVSxNQUFNLGtCQUFrQixLQUFLLHNCQUFzQixZQUFZLEdBQUcsT0FBTyxjQUFjLEdBQUcsYUFBYSxNQUFNO0FBQ2xNO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQSxzQ0FBc0M7QUFDdEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0dBQWdHLHNCQUFzQjtBQUN0SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQSxzQ0FBc0M7QUFDdEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEZBQThGLHNCQUFzQjtBQUNwSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QixxQkFBcUI7QUFDckIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsT0FBTztBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRkFBMkY7QUFDM0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixjQUFjO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGNBQWM7QUFDdEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLG1EQUFtRDtBQUN2RjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEIsYUFBYTtBQUNiO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBFQUEwRTtBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9FQUFvRSxFQUFFO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdIQUF3SDtBQUN4SCxnS0FBZ0ssYUFBYSxHQUFHLDBCQUEwQix5Q0FBeUM7QUFDblA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrSkFBa0osNkNBQTZDLE9BQU8sRUFBRTtBQUN4TTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsNERBQWM7QUFDckQseUZBQXlGLE1BQU0sdUNBQXVDLEdBQUcsdUNBQXVDLEdBQUcsK0NBQStDLEdBQUcsdURBQXVELE1BQU07QUFDbFM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsYUFBYSwyQkFBMkI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLDhCQUE4Qiw4QkFBOEI7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0Esa0JBQWtCLEdBQUc7QUFDckIsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLG9CQUFvQjtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2I7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hELGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MscUJBQXFCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUywyRUFBMkUscUJBQXFCO0FBQ3pHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEVBQTBFLEVBQUU7QUFDNUU7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUdBQWlHLEdBQUcsSUFBSSxFQUFFO0FBQzFHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qix3REFBUTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RCxFQUFFLElBQUkscUJBQXFCO0FBQ25GO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLG9CQUFvQixHQUFHLEVBQUU7QUFDNUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLCtGQUErRiw0REFBYztBQUM3RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsNERBQWM7QUFDcEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1QsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFLEVBQUUsSUFBSSxFQUFFO0FBQ2hGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsbUJBQW1CO0FBQ2pEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxzREFBc0QsRUFBRTtBQUN4RCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsYUFBYTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsYUFBYTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsYUFBYTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGFBQWE7QUFDM0IsbUJBQW1CLGdCQUFnQixjQUFjO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isb0JBQW9CO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsRUFBRSxHQUFHLEVBQUU7QUFDdkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsRUFBRSxHQUFHLEVBQUU7QUFDMUMsNENBQTRDLE1BQU07QUFDbEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsRUFBRSxHQUFHLEVBQUU7QUFDdkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwySkFBMkosRUFBRSxLQUFLLEVBQUU7QUFDcEs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNKQUFzSixFQUFFLEtBQUssRUFBRTtBQUMvSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG1DQUFtQztBQUMzRDtBQUNBLHVHQUF1RyxFQUFFLEtBQUssRUFBRTtBQUNoSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3T0FBd08sRUFBRTtBQUMxTztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCxFQUFFO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUhBQWlILEVBQUU7QUFDbkgscURBQXFELEVBQUUsaUVBQWlFLEVBQUU7QUFDMUg7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLEVBQUU7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLEVBQUU7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEIsa0JBQWtCO0FBQ2xCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RUFBd0UsV0FBVztBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxHQUFHO0FBQzVDO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsUUFBUSxNQUFNLEVBQUUsR0FBRyxFQUFFO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsK0RBQUs7QUFDL0IseUJBQXlCLDRFQUFrQjtBQUMzQztBQUNBO0FBQ0EsMkJBQTJCLDRFQUFrQjtBQUM3QztBQUNBO0FBQ0E7O0FBRUEsMkJBQTJCLDJFQUFpQjtBQUM1QztBQUNBOztBQUVBLDJCQUEyQiw4RUFBb0I7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBLDhCQUE4QjtBQUM5QiwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsNkZBQTZGLHVGQUF5QixRQUFRLGdGQUFrQjtBQUNoSjtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLDBCQUEwQixhQUFhLHlCQUF5QjtBQUN0RyxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0Esd0RBQXdELDZFQUFtQixHQUFHO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsK0RBQWUsTUFBTSw2REFBYSxNQUFNLDBEQUFVLE1BQU0sb0RBQUksTUFBTSxxREFBSyxNQUFNLGtFQUFrQjtBQUN2RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixtRkFBeUI7QUFDckQ7QUFDQSxTQUFTLFNBQVMsb0ZBQTBCO0FBQzVDO0FBQ0EsU0FBUyxTQUFTLG9GQUEwQjtBQUM1QztBQUNBLFNBQVMsU0FBUyxzRkFBNEI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQSxTQUFTLFNBQVMsMEVBQWdCO0FBQ2xDLHVCQUF1QixvRUFBVSw0REFBNEQsc0VBQVk7QUFDekcsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9FQUFvRSxHQUFHLGtCQUFrQixTQUFTLHlCQUF5QixHQUFHLG9CQUFvQixHQUFHO0FBQ3JKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2RUFBNkU7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMERBQTBELEVBQUU7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2RkFBNkYsYUFBYTtBQUMxRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQsRUFBRTtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRGQUE0RjtBQUM1RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNULE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLE9BQU87QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsOEdBQThHLGFBQWE7QUFDM0g7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLEVBQUUsSUFBSSxFQUFFLDBDQUEwQyxFQUFFLElBQUksRUFBRTtBQUNyRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxhQUFhO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixjQUFjO0FBQ3RDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sb0RBQW9ELFlBQVk7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkVBQTJFO0FBQzNFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLDRDQUE0QywyQkFBMkI7QUFDaEY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkdBQTZHO0FBQzdHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtGQUFrRjtBQUNsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUZBQWlGO0FBQ2pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsYUFBYTtBQUMzRDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtRkFBbUY7QUFDbkY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSw4REFBOEQ7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzRUFBc0U7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixHQUFHO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDViwwREFBMEQsRUFBRTtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QseUJBQXlCO0FBQ3pCLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0tBQStLLCtDQUErQztBQUM5TixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLEVBQUU7QUFDaEQ7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0EsMEVBQTBFO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxlQUFlO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyx3QkFBd0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9FQUFvRSxFQUFFO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2I7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFVBQVU7QUFDVix1REFBdUQsR0FBRztBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVix3REFBd0QsR0FBRztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdELEVBQUUsb0NBQW9DLEVBQUU7QUFDaEc7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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDJEQUEyRCxZQUFZO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWSxrRUFBa0I7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpSkFBaUosRUFBRTtBQUNuSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsWUFBWSxrRUFBa0I7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsa0VBQWtCLFNBQVMsa0VBQWtCO0FBQzVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsa0VBQWtCLFNBQVMsa0VBQWtCO0FBQzVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGNBQWM7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHFFQUFxRTtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxzQkFBc0I7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxrRUFBa0I7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkRBQTJELEVBQUU7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sd0NBQXdDLEVBQUU7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdCQUF3QixFQUFFO0FBQzFCO0FBQ0E7QUFDQSxnRUFBZ0UsRUFBRSwrQkFBK0IsRUFBRTtBQUNuRztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0EsdUtBQXVLLDhCQUE4QjtBQUNyTTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0VBQWdFLFlBQVk7QUFDNUUsSUFBSSxjQUFjLEdBQUcsa0JBQWtCLEdBQUcscUJBQXFCLEdBQUc7QUFDbEUsZUFBZSxHQUFHLGdCQUFnQixHQUFHLGFBQWEsSUFBSSxtQkFBbUI7QUFDekUsMEJBQTBCLGFBQWE7QUFDdkM7QUFDQTs7QUFFQTtBQUNBLHdDQUF3QyxhQUFhO0FBQ3JEO0FBQ0E7QUFDQSx1QkFBdUIsYUFBYTtBQUNwQywwQ0FBMEMsc0JBQXNCO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkxBQTZMLEVBQUU7QUFDL0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrT0FBK08sYUFBYSxTQUFTLG1CQUFtQjtBQUN4UjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLDZHQUE2RyxnQkFBZ0IsMEVBQTBFLGdCQUFnQixrQkFBa0IsYUFBYTtBQUN0UCxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0EsY0FBYyx1QkFBdUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsUUFBUSxlQUFlO0FBQ3hFLFVBQVU7QUFDVjtBQUNBLHlCQUF5QixZQUFZO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0EsY0FBYyx1QkFBdUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixZQUFZO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjLHVCQUF1QjtBQUNyQztBQUNBO0FBQ0EseUJBQXlCLFlBQVk7QUFDckM7QUFDQTtBQUNBOztBQUVBO0FBQ0EsY0FBYyx1QkFBdUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixZQUFZO0FBQ3JDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsa0VBQWtCO0FBQ2pDLGdHQUFnRyxFQUFFO0FBQ2xHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RkFBdUY7QUFDdkY7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrSUFBK0ksRUFBRTtBQUNqSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVHQUF1RyxFQUFFO0FBQ3pHO0FBQ0EsNEJBQTRCLGNBQWM7QUFDMUM7QUFDQTtBQUNBLHFJQUFxSSxFQUFFLGdCQUFnQixTQUFTO0FBQ2hLLHdMQUF3TCxFQUFFLHVDQUF1QyxFQUFFO0FBQ25PO0FBQ0EsbUxBQW1MLEVBQUUsZ0RBQWdELEVBQUU7QUFDdk87QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdDQUFnQyxrRUFBa0I7QUFDbEQ7QUFDQSxzTEFBc0wsRUFBRTtBQUN4TDtBQUNBLG9NQUFvTSxFQUFFLHFEQUFxRCxTQUFTO0FBQ3BRO0FBQ0E7QUFDQTtBQUNBLDJKQUEySixNQUFNO0FBQ2pLOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0lBQWtJLGFBQWE7QUFDL0ksMEVBQTBFLGFBQWE7QUFDdkY7O0FBRUE7QUFDQSw0SkFBNEosYUFBYSw4QkFBOEIsYUFBYSwrRUFBK0UsYUFBYTtBQUNoVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLEdBQUcsNkRBQTZELFlBQVksR0FBRyxXQUFXLHVGQUF1RixZQUFZLEdBQUcsV0FBVztBQUNqTztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsaUJBQWlCO0FBQ3RFO0FBQ0EsaURBQWlELHlCQUF5QjtBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsZ0JBQWdCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isa0JBQWtCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixpQkFBaUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLDhCQUE4QjtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0MsUUFBUTtBQUN2RDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDLHFCQUFNO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxxQkFBTTtBQUNyQixlQUFlLHFCQUFNO0FBQ3JCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCxNQUFNO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsaUJBQWlCO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixhQUFhLEdBQUcsS0FBSztBQUNqRDtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsaUJBQWlCLElBQUksU0FBUyxHQUFHLFNBQVM7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQsSUFBSTtBQUN2RCxLQUFLO0FBQ0w7QUFDQSxtQkFBbUIsTUFBTSxJQUFJOztBQUU3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixZQUFZLEdBQUc7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGFBQWEsV0FBVztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHlCQUF5QjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUseUJBQXlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isb0JBQW9CO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsUUFBUTtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFFBQVE7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLFFBQVE7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsUUFBUTtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxTQUFTO0FBQ2xEO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixPQUFPO0FBQy9CLDZCQUE2QixRQUFRO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QiwyQkFBMkI7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNB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LG1GQUFtRixxQkFBcUIsR0FBRyxTQUFTLHdHQUF3RyxPQUFPLGFBQWEsTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGVBQWUsZUFBZSxNQUFNLFlBQVksTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGNBQWMsY0FBYyxNQUFNLFlBQVksTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGNBQWMsY0FBYyxNQUFNLFlBQVksTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGNBQWMsY0FBYyxNQUFNLFlBQVksTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGNBQWMsY0FBYyxNQUFNLFlBQVksTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGNBQWMsY0FBYyxNQUFNLFlBQVksTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGVBQWUsZUFBZSxNQUFNLFlBQVksTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGVBQWUsZUFBZSxPQUFPLE1BQU0sT0FBTyxhQUFhLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxlQUFlLGVBQWUsTUFBTSxZQUFZLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxjQUFjLGNBQWMsTUFBTSxZQUFZLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxjQUFjLGNBQWMsTUFBTSxZQUFZLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxjQUFjLGNBQWMsTUFBTSxZQUFZLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxjQUFjLGNBQWMsTUFBTSxZQUFZLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxjQUFjLGNBQWMsTUFBTSxZQUFZLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxlQUFlLGVBQWUsTUFBTSxZQUFZLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxlQUFlLGVBQWUsT0FBTyxNQUFNLE9BQU8sYUFBYSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsZUFBZSxlQUFlLE1BQU0sWUFBWSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsY0FBYyxjQUFjLE1BQU0sWUFBWSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsY0FBYyxjQUFjLE1BQU0sWUFBWSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsY0FBYyxjQUFjLE1BQU0sWUFBWSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsY0FBYyxjQUFjLE1BQU0sWUFBWSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsY0FBYyxjQUFjLE1BQU0sWUFBWSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsZUFBZSxlQUFlLE1BQU0sWUFBWSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsZUFBZSxlQUFlLE9BQU8sTUFBTSxPQUFPLGFBQWEsTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGVBQWUsZUFBZSxNQUFNLFlBQVksTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGNBQWMsY0FBYyxNQUFNLFlBQVksTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGNBQWMsY0FBYyxNQUFNLFlBQVksTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGNBQWMsY0FBYyxNQUFNLFlBQVksTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGNBQWMsY0FBYyxNQUFNLFlBQVksTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGNBQWMsY0FBYyxNQUFNLFlBQVksTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGVBQWUsZUFBZSxNQUFNLFlBQVksTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGVBQWUsZUFBZSxPQUFPLE1BQU0sT0FBTyxVQUFVLEtBQUssWUFBWSxNQUFNLFVBQVUsWUFBWSxhQUFhLE9BQU8sS0FBSyxVQUFVLE1BQU0sS0FBSyxVQUFVLFVBQVUsVUFBVSxVQUFVLE1BQU0sS0FBSyxVQUFVLFlBQVksYUFBYSxXQUFXLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxZQUFZLE1BQU0sWUFBWSxXQUFXLFlBQVksT0FBTyxZQUFZLE1BQU0sWUFBWSxXQUFXLE9BQU8sWUFBWSxNQUFNLFlBQVksYUFBYSxXQUFXLFVBQVUsWUFBWSxhQUFhLFdBQVcsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQSx3Q0FBd0MsV0FBVztBQUNuRDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLFVBQVU7QUFDVjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EscUNBQXFDLGNBQWM7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUNBQWlDLG1CQUFtQjtBQUNwRDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLGtCQUFrQjs7QUFFbEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLGdCQUFnQjtBQUN6QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsK0NBQStDLFFBQVE7QUFDdkQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUEsWUFBWTtBQUNaO0FBQ0E7QUFDQTs7QUFFQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsK0NBQStDLFFBQVE7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSwrQ0FBK0MsUUFBUTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSwrQ0FBK0MsUUFBUTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLGdCQUFnQixHQUFHLGdCQUFnQjtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLG9EQUFNOztBQUV6Qjs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsZ0JBQWdCLHNDQUFzQyxT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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLDZFQUE2QjtBQUN4QztBQUNBLHFCQUFxQix5Q0FBeUM7QUFDOUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiwwREFBUztBQUNwQywyQkFBMkIsMERBQVM7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRTJSO0FBQzNSOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNTRCMEM7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRW1EO0FBQ25EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeFpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsNEJBQTRCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLElBQUksS0FBSyxjQUFjO0FBQ25EO0FBQ0E7QUFDQSxzRkFBc0YsUUFBUTtBQUM5RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxJQUFJO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUU0RDtBQUM1RDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxTndDOztBQUV4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHVEQUFrQjtBQUNwQztBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxrQkFBa0IsdURBQWtCO0FBQ3BDO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLGtCQUFrQixzREFBaUI7QUFDbkM7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0Esa0JBQWtCLHVEQUFrQjtBQUNwQztBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxrQkFBa0Isc0RBQWlCO0FBQ25DO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLGtCQUFrQixzREFBaUI7QUFDbkM7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0Esa0JBQWtCLHNEQUFpQjtBQUNuQztBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxrQkFBa0Isc0RBQWlCO0FBQ25DO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLGtCQUFrQix3REFBbUI7QUFDckM7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0Esa0JBQWtCLHdEQUFtQjtBQUNyQztBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxrQkFBa0Isc0RBQWlCO0FBQ25DO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLGtCQUFrQixzREFBaUI7QUFDbkM7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0Esa0JBQWtCLHNEQUFpQjtBQUNuQztBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxrQkFBa0Isc0RBQWlCO0FBQ25DO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLGtCQUFrQixzREFBaUI7QUFDbkM7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0Esa0JBQWtCLHNEQUFpQjtBQUNuQztBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxrQkFBa0IseURBQW9CO0FBQ3RDO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLGtCQUFrQix5REFBb0I7QUFDdEM7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0Esa0JBQWtCLHlEQUFvQjtBQUN0QztBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxrQkFBa0Isc0RBQWlCO0FBQ25DO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLGtCQUFrQixzREFBaUI7QUFDbkM7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0Esa0JBQWtCLHNEQUFpQjtBQUNuQztBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxrQkFBa0Isc0RBQWlCO0FBQ25DO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLGtCQUFrQixzREFBaUI7QUFDbkM7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0Esa0JBQWtCLHVEQUFrQjtBQUNwQztBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxrQkFBa0Isc0RBQWlCO0FBQ25DO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLGtCQUFrQixzREFBaUI7QUFDbkM7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0Esa0JBQWtCLHlEQUFvQjtBQUN0QztBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxrQkFBa0Isc0RBQWlCO0FBQ25DO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLGtCQUFrQix1REFBa0I7QUFDcEM7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0Esa0JBQWtCLHNEQUFpQjtBQUNuQztBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxrQkFBa0IseURBQW9CO0FBQ3RDO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDO0FBQzlDLG9DQUFvQztBQUNwQyxvQ0FBb0M7QUFDcEMsb0RBQW9EO0FBQ3BELG1DQUFtQztBQUNuQyxvREFBb0Q7QUFDcEQsb0NBQW9DO0FBQ3BDLDZDQUE2QztBQUM3QyxnQ0FBZ0M7QUFDaEMsMENBQTBDO0FBQzFDLDRDQUE0QztBQUM1Qyw4Q0FBOEM7QUFDOUMsa0NBQWtDO0FBQ2xDLGdEQUFnRDtBQUNoRCxpREFBaUQ7QUFDakQsaURBQWlEO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1Qyx1REFBdUQ7QUFDdkQseURBQXlEO0FBQ3pELHVEQUF1RDtBQUN2RCwrREFBK0Q7QUFDL0Q7QUFDQSw2QkFBNkI7QUFDN0IsZ0RBQWdEO0FBQ2hELHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQztBQUNBLDRDQUE0QyxvQ0FBb0M7QUFDaEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEZBQTRGO0FBQzVGO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQiwyQ0FBMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxnQkFBZ0I7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RUFBdUU7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsV0FBVztBQUN2QyxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFdBQVc7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsb0NBQW9DO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxvQ0FBb0M7QUFDaEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFdBQVc7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCLGNBQWM7QUFDZCxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFdBQVc7QUFDdkMsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCLGtCQUFrQjtBQUNsQixjQUFjO0FBQ2QsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FB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O0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QiwyQkFBMkI7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFa0Q7QUFDbEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2VUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsK0RBQStELGlCQUFpQjtBQUM1RztBQUNBLG9DQUFvQyxNQUFNLCtCQUErQixZQUFZO0FBQ3JGLG1DQUFtQyxNQUFNLG1DQUFtQyxZQUFZO0FBQ3hGLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUEsdUJBQXVCLGtCQUFrQixJQUFJO0FBQzdDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsY0FBYztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGNBQWMsR0FBRyxNQUFNO0FBQ3BDLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9GQUFvRjtBQUNwRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLHNDQUFzQztBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLFlBQVk7O0FBRVo7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSw2REFBNkQ7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQSxzRUFBc0U7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsa0JBQWtCO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0IsaUJBQWlCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0EsK0NBQStDO0FBQy9DOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Ysc0JBQXNCLGNBQWM7QUFDcEMsRUFBRTtBQUNGO0FBQ0E7O0FBRUEsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLGtCQUFrQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxrQkFBa0I7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDLHdCQUF3QixvQkFBb0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLCtCQUErQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsY0FBYztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGdCQUFnQjtBQUNwQyx3QkFBd0Isd0JBQXdCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixnQkFBZ0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsK0JBQStCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixVQUFVO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThELFdBQVcscUJBQXFCO0FBQzlGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixZQUFZO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1Qyw0RUFBNEU7QUFDbkg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBLDRCQUE0QixnQ0FBZ0M7QUFDNUQ7QUFDQSx3REFBd0Q7QUFDeEQ7QUFDQTtBQUNBLHNEQUFzRDtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsOENBQThDO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixtREFBbUQ7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsOENBQThDO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG9CQUFvQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLDhDQUE4QztBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qiw4Q0FBOEM7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsOENBQThDO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsOENBQThDO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdIQUFnSDtBQUNoSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxnREFBZ0QsMkJBQTJCLDRCQUE0QiwyQkFBMkIsdUNBQXVDLHFCQUFxQixvQ0FBb0Msa1BBQWtQO0FBQ3RmO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFELFVBQVU7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsNkVBQTZFO0FBQzdFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9ELHNDQUFzQztBQUMxRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0SEFBNEgsSUFBSTtBQUNoSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMklBQTJJO0FBQzNJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQscUNBQXFDLHVCQUF1QjtBQUMvRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxRkFBcUYseUJBQXlCO0FBQzlHO0FBQ0E7QUFDQTtBQUNBLHFGQUFxRix5QkFBeUI7QUFDOUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsMENBQTBDO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsZ0JBQWdCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFMEU7QUFDMUU7Ozs7Ozs7VUNodUdBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7O1VBRUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7O1VBRUE7VUFDQTs7Ozs7V0N6QkE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLElBQUk7V0FDSjtXQUNBO1dBQ0E7V0FDQSxJQUFJO1dBQ0o7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsQ0FBQztXQUNEO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLEVBQUU7V0FDRjtXQUNBO1dBQ0Esc0JBQXNCO1dBQ3RCO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSxHQUFHO1dBQ0g7V0FDQTtXQUNBO1dBQ0E7V0FDQSxHQUFHO1dBQ0g7V0FDQSxFQUFFO1dBQ0Y7V0FDQTs7Ozs7V0M3RUE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGlDQUFpQyxXQUFXO1dBQzVDO1dBQ0E7Ozs7O1dDUEE7V0FDQTtXQUNBO1dBQ0E7V0FDQSx5Q0FBeUMsd0NBQXdDO1dBQ2pGO1dBQ0E7V0FDQTs7Ozs7V0NQQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLEdBQUc7V0FDSDtXQUNBO1dBQ0EsQ0FBQzs7Ozs7V0NQRDs7Ozs7V0NBQTtXQUNBO1dBQ0E7V0FDQSx1REFBdUQsaUJBQWlCO1dBQ3hFO1dBQ0EsZ0RBQWdELGFBQWE7V0FDN0Q7Ozs7O1dDTkE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7Ozs7O1dDZkE7O1dBRUE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOzs7OztVRXJCQTtVQUNBO1VBQ0E7VUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay8uL25vZGVfbW9kdWxlcy9AYmRlbGFiL3JvYXItZmlyZWtpdC9saWIvYXV0aC5qcyIsIndlYnBhY2s6Ly9hc3Rlcm9pZC1hdHRhY2svLi9ub2RlX21vZHVsZXMvQGJkZWxhYi9yb2FyLWZpcmVraXQvbGliL2ZpcmVzdG9yZS9maXJla2l0LmpzIiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay8uL25vZGVfbW9kdWxlcy9AYmRlbGFiL3JvYXItZmlyZWtpdC9saWIvZmlyZXN0b3JlL3J1bi5qcyIsIndlYnBhY2s6Ly9hc3Rlcm9pZC1hdHRhY2svLi9ub2RlX21vZHVsZXMvQGJkZWxhYi9yb2FyLWZpcmVraXQvbGliL2ZpcmVzdG9yZS90YXNrLmpzIiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay8uL25vZGVfbW9kdWxlcy9AYmRlbGFiL3JvYXItZmlyZWtpdC9saWIvZmlyZXN0b3JlL3VzZXIuanMiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrLy4vbm9kZV9tb2R1bGVzL0BiZGVsYWIvcm9hci1maXJla2l0L2xpYi9maXJlc3RvcmUvdXRpbC5qcyIsIndlYnBhY2s6Ly9hc3Rlcm9pZC1hdHRhY2svLi9ub2RlX21vZHVsZXMvQGJkZWxhYi9yb2FyLWZpcmVraXQvbGliL2luZGV4LmpzIiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay8uL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9kaXN0L2VzbTIwMTcvaW5kZXgtZjY5YTI4ZDguanMiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrLy4vbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL2Rpc3QvZXNtMjAxNy9pbmRleC5qcyIsIndlYnBhY2s6Ly9hc3Rlcm9pZC1hdHRhY2svLi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2ZpcmVzdG9yZS9kaXN0L2luZGV4LmVzbTIwMTcuanMiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrLy4vbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS91dGlsL2Rpc3QvaW5kZXguZXNtMjAxNy5qcyIsIndlYnBhY2s6Ly9hc3Rlcm9pZC1hdHRhY2svLi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL3dlYmNoYW5uZWwtd3JhcHBlci9kaXN0L2luZGV4LmVzbTIwMTcuanMiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrLy4vc3JjL2ZpcmViYXNlQ29uZmlnLmpzIiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay8uL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9hc3Rlcm9pZC1hdHRhY2svLi9zcmMvanNQc3ljaFBhdmxvdmlhLmpzIiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay8uL25vZGVfbW9kdWxlcy9qc3BzeWNoL2Nzcy9qc3BzeWNoLmNzcyIsIndlYnBhY2s6Ly9hc3Rlcm9pZC1hdHRhY2svLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzIiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9nZXRVcmwuanMiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrLy4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanMiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrLy4vc3JjL3ZpZGVvL0FzdGVyb2lkX0F0dGFja19FbmQubXA0Iiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay8uL3NyYy92aWRlby9Bc3Rlcm9pZF9BdHRhY2tfSW50cm8ubXA0Iiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay8uL3NyYy92aWRlby9Bc3Rlcm9pZF9BdHRhY2tfTGV2ZWxfVXBfMS5tcDQiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrLy4vc3JjL3ZpZGVvL0FzdGVyb2lkX0F0dGFja19MZXZlbF9VcF8yLm1wNCIsIndlYnBhY2s6Ly9hc3Rlcm9pZC1hdHRhY2svLi9zcmMvdmlkZW8vQXN0ZXJvaWRfQXR0YWNrX0xldmVsX1VwXzMubXA0Iiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay8uL3NyYy92aWRlby9Bc3Rlcm9pZF9BdHRhY2tfTGV2ZWxfVXBfNC5tcDQiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrLy4vc3JjL3ZpZGVvL0FzdGVyb2lkX0F0dGFja19MZXZlbF9VcF81Lm1wNCIsIndlYnBhY2s6Ly9hc3Rlcm9pZC1hdHRhY2svLi9ub2RlX21vZHVsZXMvZmlyZWJhc2UvYXBwL2Rpc3QvaW5kZXguZXNtLmpzIiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay8uL25vZGVfbW9kdWxlcy9maXJlYmFzZS9hdXRoL2Rpc3QvaW5kZXguZXNtLmpzIiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay8uL25vZGVfbW9kdWxlcy9maXJlYmFzZS9maXJlc3RvcmUvZGlzdC9pbmRleC5lc20uanMiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrLy4vbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcyIsIndlYnBhY2s6Ly9hc3Rlcm9pZC1hdHRhY2svLi9ub2RlX21vZHVsZXMvanNwc3ljaC9jc3MvanNwc3ljaC5jc3M/ZWI3ZiIsIndlYnBhY2s6Ly9hc3Rlcm9pZC1hdHRhY2svLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanMiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9hc3Rlcm9pZC1hdHRhY2svLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzIiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzIiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzIiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay8uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9pbmRleC5qcyIsIndlYnBhY2s6Ly9hc3Rlcm9pZC1hdHRhY2svLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL21kNS5qcyIsIndlYnBhY2s6Ly9hc3Rlcm9pZC1hdHRhY2svLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL25pbC5qcyIsIndlYnBhY2s6Ly9hc3Rlcm9pZC1hdHRhY2svLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3BhcnNlLmpzIiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvcmVnZXguanMiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9ybmcuanMiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9zaGExLmpzIiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvc3RyaW5naWZ5LmpzIiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjEuanMiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92My5qcyIsIndlYnBhY2s6Ly9hc3Rlcm9pZC1hdHRhY2svLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3YzNS5qcyIsIndlYnBhY2s6Ly9hc3Rlcm9pZC1hdHRhY2svLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3Y0LmpzIiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjUuanMiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92YWxpZGF0ZS5qcyIsIndlYnBhY2s6Ly9hc3Rlcm9pZC1hdHRhY2svLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3ZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrLy4vbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hcHAvZGlzdC9lc20vaW5kZXguZXNtMjAxNy5qcyIsIndlYnBhY2s6Ly9hc3Rlcm9pZC1hdHRhY2svLi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2NvbXBvbmVudC9kaXN0L2VzbS9pbmRleC5lc20yMDE3LmpzIiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay8uL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvbG9nZ2VyL2Rpc3QvZXNtL2luZGV4LmVzbTIwMTcuanMiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrLy4vbm9kZV9tb2R1bGVzL0Bqc3BzeWNoLWNvbnRyaWIvcGx1Z2luLXJkay9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay8uL25vZGVfbW9kdWxlcy9AanNwc3ljaC9wbHVnaW4tZnVsbHNjcmVlbi9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay8uL25vZGVfbW9kdWxlcy9AanNwc3ljaC9wbHVnaW4taHRtbC1rZXlib2FyZC1yZXNwb25zZS9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay8uL25vZGVfbW9kdWxlcy9AanNwc3ljaC9wbHVnaW4tc3VydmV5LXRleHQvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9hc3Rlcm9pZC1hdHRhY2svLi9ub2RlX21vZHVsZXMvQGpzcHN5Y2gvcGx1Z2luLXZpZGVvLWtleWJvYXJkLXJlc3BvbnNlL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrLy4vbm9kZV9tb2R1bGVzL2pzcHN5Y2gvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9hc3Rlcm9pZC1hdHRhY2svd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrL3dlYnBhY2svcnVudGltZS9hc3luYyBtb2R1bGUiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrL3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrL3dlYnBhY2svcnVudGltZS9wdWJsaWNQYXRoIiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay93ZWJwYWNrL3J1bnRpbWUvanNvbnAgY2h1bmsgbG9hZGluZyIsIndlYnBhY2s6Ly9hc3Rlcm9pZC1hdHRhY2svd2VicGFjay9iZWZvcmUtc3RhcnR1cCIsIndlYnBhY2s6Ly9hc3Rlcm9pZC1hdHRhY2svd2VicGFjay9zdGFydHVwIiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay93ZWJwYWNrL2FmdGVyLXN0YXJ0dXAiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbnZhciBfX2dlbmVyYXRvciA9ICh0aGlzICYmIHRoaXMuX19nZW5lcmF0b3IpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBib2R5KSB7XG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgICAgd2hpbGUgKF8pIHRyeSB7XG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgICB9XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5maXJlYmFzZVNpZ25PdXQgPSBleHBvcnRzLmZpcmViYXNlU2lnbkluID0gZXhwb3J0cy5yb2FyUGFzc3dvcmQgPSBleHBvcnRzLnJvYXJFbWFpbCA9IHZvaWQgMDtcbnZhciBhdXRoXzEgPSByZXF1aXJlKFwiZmlyZWJhc2UvYXV0aFwiKTtcbnZhciB1dWlkXzEgPSByZXF1aXJlKFwidXVpZFwiKTtcbi8qKlxuICogUmV0dXJuIGEgdW5pcXVlLCByZXByb2R1Y2libGUsIGFuZCBkaXNwb3NhYmxlIGVtYWlsIGFkZHJlc3MgZm9yIHRoZVxuICogdXNlci5cbiAqXG4gKiBXZSBjcmVhdGUgYW4gZW1haWwvcGFzc3dvcmQgY29tYmluYXRpb24gZm9yIGVhY2ggcm9hciBVSUQuIFRoaXNcbiAqIGZ1bmN0aW9uIHVzZXMgZGlzcG9zdGFibGUuY29tIHRvIGNyZWF0ZSBhIGRpc3Bvc2FibGUgZW1haWwgYWRkcmVzcyBmb3JcbiAqIGF1dGhlbnRpY2F0aW9uLiBPbiBkaXNwb3N0YWJsZS5jb20sIHVucmVhZCBlbWFpbHMgYXJlIGRlbGV0ZWQgYWZ0ZXIgMlxuICogZGF5cyBhbmQgcmVhZCBtZXNzYWdlcyBhcmUgZGVsZXRlZCBhZnRlciAyIG1vbnRocy4gVGhlc2UgbWVzc2FnZXMgYXJlXG4gKiB2aWV3YWJsZSBieSBhbnlvbmUgd2hvIGtub3dzIHRoZSBlbWFpbCBhZGRyZXNzLCBzbyB0aGlzIGVtYWlsIGlzIG5vdFxuICogaW50ZW5kZWQgdG8gcmVjZWl2ZSBzZWN1cmUgbWVzc2FnZXMuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gcm9hclVpZCAtIFRoZSBST0FSIHVzZXIgSURcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIGVtYWlsIGFkZHJlc3NcbiAqL1xudmFyIHJvYXJFbWFpbCA9IGZ1bmN0aW9uIChyb2FyVWlkKSB7XG4gICAgcmV0dXJuIFwiXCIuY29uY2F0KHJvYXJVaWQsIFwiQGRpc3Bvc3RhYmxlLmNvbVwiKTtcbn07XG5leHBvcnRzLnJvYXJFbWFpbCA9IHJvYXJFbWFpbDtcbnZhciByb2FyVXVpZHY1TmFtZXNwYWNlID0gKDAsIHV1aWRfMS52NSkoJ2h0dHBzOi8vcmVhZGluZy5zdGFuZm9yZC5lZHUvJywgdXVpZF8xLnY1LlVSTCk7XG4vKipcbiAqIFJldHVybiBhIHVuaXF1ZSBhbmQgcmVwcm9kdWNpYmxlIHBhc3N3b3JkIGZvciB0aGUgdXNlci5cbiAqXG4gKiBXZSBjcmVhdGUgYW4gZW1haWwvcGFzc3dvcmQgY29tYmluYXRpb24gZm9yIGVhY2ggcm9hciBVSUQuIFRoaXNcbiAqIGNvbXB1dGVkIHByb3BlcnR5IHJldHVybnMgYSBVVUlEIFY1IGhhc2ggb2YgdGhlIHJvYXIgVUlEIHVzaW5nIHRoZSBST0FSXG4gKiBVVUlEIG5hbWVzcGFjZSwgd2hpY2ggaXRzZWxmIGlzIGEgVVVJRCBWNSBoYXNoIG9mIHRoZSB0aGVcbiAqIGh0dHBzOi8vcmVhZGluZy5zdGFuZm9yZC5lZHUvIFVSTCB1c2luZyB0aGUgVVVJRCBWNSBVUkwgbmFtZXNwYWNlLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IHJvYXJVaWQgLSBUaGUgUk9BUiB1c2VyIElEXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBwYXNzd29yZFxuICovXG52YXIgcm9hclBhc3N3b3JkID0gZnVuY3Rpb24gKHJvYXJVaWQpIHtcbiAgICByZXR1cm4gKDAsIHV1aWRfMS52NSkocm9hclVpZCwgcm9hclV1aWR2NU5hbWVzcGFjZSkucmVwbGFjZSgvLS9nLCAnJyk7XG59O1xuZXhwb3J0cy5yb2FyUGFzc3dvcmQgPSByb2FyUGFzc3dvcmQ7XG52YXIgZmlyZWJhc2VTaWduSW4gPSBmdW5jdGlvbiAocm9hclVpZCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXV0aCwgdXNlckNyZWRlbnRpYWw7XG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgYXV0aCA9ICgwLCBhdXRoXzEuZ2V0QXV0aCkoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCAoMCwgYXV0aF8xLmNyZWF0ZVVzZXJXaXRoRW1haWxBbmRQYXNzd29yZCkoYXV0aCwgKDAsIGV4cG9ydHMucm9hckVtYWlsKShyb2FyVWlkKSwgKDAsIGV4cG9ydHMucm9hclBhc3N3b3JkKShyb2FyVWlkKSkuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gJ2F1dGgvZW1haWwtYWxyZWFkeS1pbi11c2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ0VtYWlsIGFscmVhZHkgaW4gdXNlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBhdXRoXzEuc2lnbkluV2l0aEVtYWlsQW5kUGFzc3dvcmQpKGF1dGgsICgwLCBleHBvcnRzLnJvYXJFbWFpbCkocm9hclVpZCksICgwLCBleHBvcnRzLnJvYXJQYXNzd29yZCkocm9hclVpZCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXTtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICB1c2VyQ3JlZGVudGlhbCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhgU2lnbmVkIGluIGFzICR7dXNlckNyZWRlbnRpYWwudXNlci5lbWFpbH1gKTtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhgRmlyZWJhc2UgVUlEOiAke3VzZXJDcmVkZW50aWFsLnVzZXIudWlkfWApO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBhdXRoXTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7IH07XG5leHBvcnRzLmZpcmViYXNlU2lnbkluID0gZmlyZWJhc2VTaWduSW47XG52YXIgZmlyZWJhc2VTaWduT3V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXV0aDtcbiAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBhdXRoID0gKDAsIGF1dGhfMS5nZXRBdXRoKSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sICgwLCBhdXRoXzEuc2lnbk91dCkoYXV0aCldO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgYXV0aF07XG4gICAgICAgIH1cbiAgICB9KTtcbn0pOyB9O1xuZXhwb3J0cy5maXJlYmFzZVNpZ25PdXQgPSBmaXJlYmFzZVNpZ25PdXQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbnZhciBfX2dlbmVyYXRvciA9ICh0aGlzICYmIHRoaXMuX19nZW5lcmF0b3IpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBib2R5KSB7XG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgICAgd2hpbGUgKF8pIHRyeSB7XG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgICB9XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Sb2FyRmlyZWtpdCA9IHZvaWQgMDtcbnZhciB1c2VyXzEgPSByZXF1aXJlKFwiLi91c2VyXCIpO1xudmFyIHRhc2tfMSA9IHJlcXVpcmUoXCIuL3Rhc2tcIik7XG52YXIgcnVuXzEgPSByZXF1aXJlKFwiLi9ydW5cIik7XG52YXIgYXV0aF8xID0gcmVxdWlyZShcIi4uL2F1dGhcIik7XG4vKipcbiAqIFRoZSBSb2FyRmlyZWtpdCBjbGFzcyBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIFJPQVIgRmlyZXN0b3JlIEFQSS5cbiAqIEl0IHJlcHJlc2VudHMgbXVsdGlwbGUgbGlua2VkIEZpcmVzdG9yZSBkb2N1bWVudHMgYW5kIHByb3ZpZGVzIG1ldGhvZHNcbiAqIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZW0uXG4gKi9cbnZhciBSb2FyRmlyZWtpdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBSb2FyRmlyZWtpdC4gVGhpcyBleHBlY3RzIGFuIG9iamVjdCB3aXRoIGtleXMgYHJvb3REb2NgLFxuICAgICAqIGB1c2VySW5mb2AsIGFuZCBgdGFza0luZm9gLCB3aGVyZSBgcm9vdERvY2AgaXMgYSBbW0RvY3VtZW50UmVmZXJlbmNlIHxcbiAgICAgKiBGaXJlc3RvcmUgZG9jdW1lbnQgcmVmZXJlbmNlXV0gcG9pbnRpbmcgdG8gdGhlIGRvY3VtZW50IHVuZGVyIHdoaWNoIGFsbFxuICAgICAqIFJPQVIgZGF0YSB3aWxsIGJlIHN0b3JlZCwgYHVzZXJJbmZvYCBpcyBhIFtbVXNlckRhdGFdXSBvYmplY3QsIGFuZFxuICAgICAqIGB0YXNrSW5mb2AgaXMgYSBbW1Rhc2tWYXJpYW50SW5wdXRdXSBvYmplY3QuXG4gICAgICogQHBhcmFtIHt7cm9vdERvYzogRG9jdW1lbnRSZWZlcmVuY2UsIHVzZXJJbmZvOiBVc2VyRGF0YSwgdGFza0luZm86IFRhc2tWYXJpYW50SW5wdXR9PX0gZGVzdHJ1Y3R1cmVkUGFyYW1cbiAgICAgKiAgICAgcm9vdERvYzogVGhlIEZpcmVzdG9yZSByb290IGRvY3VtZW50IHJlZmVyZW5jZVxuICAgICAqICAgICB1c2VySW5mbzogVGhlIHVzZXIgaW5wdXQgb2JqZWN0XG4gICAgICogICAgIHRhc2tJbmZvOiBUaGUgdGFzayBpbnB1dCBvYmplY3RcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBSb2FyRmlyZWtpdChfYSkge1xuICAgICAgICB2YXIgcm9vdERvYyA9IF9hLnJvb3REb2MsIHVzZXJJbmZvID0gX2EudXNlckluZm8sIHRhc2tJbmZvID0gX2EudGFza0luZm87XG4gICAgICAgIHRoaXMucm9vdERvYyA9IHJvb3REb2M7XG4gICAgICAgIHRoaXMudXNlckluZm8gPSB1c2VySW5mbztcbiAgICAgICAgdGhpcy50YXNrSW5mbyA9IHRhc2tJbmZvO1xuICAgICAgICB0aGlzLnVzZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudGFzayA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5ydW4gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXJ0IHRoZSBST0FSIHJ1bi4gUHVzaCB0aGUgdGFzaywgdXNlciwgYW5kIHJ1biBpbmZvIHRvIEZpcmVzdG9yZVxuICAgICAqIENhbGwgdGhpcyBtZXRob2QgYmVmb3JlIHN0YXJ0aW5nIHRoZSBqc1BzeWNoIGV4cGVyaW1lbnQuXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBhc3luY1xuICAgICAqL1xuICAgIFJvYXJGaXJla2l0LnByb3RvdHlwZS5zdGFydFJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGF1dGg7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCAoMCwgYXV0aF8xLmZpcmViYXNlU2lnbkluKSh0aGlzLnVzZXJJbmZvLmlkKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dGggPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZXIgPSBuZXcgdXNlcl8xLlJvYXJVc2VyKF9fYXNzaWduKF9fYXNzaWduKHt9LCB0aGlzLnVzZXJJbmZvKSwgeyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcmViYXNlVWlkOiBhdXRoLmN1cnJlbnRVc2VyLnVpZCB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZXIuc2V0UmVmcyh0aGlzLnJvb3REb2MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YXNrID0gbmV3IHRhc2tfMS5Sb2FyVGFza1ZhcmlhbnQodGhpcy50YXNrSW5mbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhc2suc2V0UmVmcyh0aGlzLnJvb3REb2MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW4gPSBuZXcgcnVuXzEuUm9hclJ1bih7IHVzZXI6IHRoaXMudXNlciwgdGFzazogdGhpcy50YXNrIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sICh0aGlzLnRhc2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvRmlyZXN0b3JlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMudXNlci50b0ZpcmVzdG9yZSgpOyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5ydW4uc3RhcnRSdW4oKTsgfSkpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGaW5pc2ggdGhlIFJPQVIgcnVuIGJ5IG1hcmtpbmcgaXQgYXMgZmluaXNoZWQgaW4gRmlyZXN0b3JlLlxuICAgICAqIENhbGwgdGhpcyBtZXRob2QgYWZ0ZXIgdGhlIGpzUHN5Y2ggZXhwZXJpbWVudCBmaW5pc2hlcy4gRm9yIGV4YW1wbGU6XG4gICAgICpcbiAgICAgKiBgYGBqYXZhc2NyaXB0XG4gICAgICoganNQc3ljaC5pbml0KHtcbiAgICAgKiAgIHRpbWVsaW5lOiBleHAsXG4gICAgICogICBvbl9maW5pc2g6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgKiAgICAgZmlyZWtpdC5maW5pc2hSdW4oKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQGFzeW5jXG4gICAgICovXG4gICAgUm9hckZpcmVraXQucHJvdG90eXBlLmZpbmlzaFJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJ1bikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5ydW4uZmluaXNoUnVuKCkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiAoMCwgYXV0aF8xLmZpcmViYXNlU2lnbk91dCkoKTsgfSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSdW4gaXMgdW5kZWZpbmVkLiBVc2UgdGhlIHN0YXJ0UnVuIG1ldGhvZCBmaXJzdC4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkIG5ldyB0cmlhbCBkYXRhIHRvIHRoaXMgcnVuIG9uIEZpcmVzdG9yZS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBhZGRlZCB0byBpbmRpdmlkdWFsIGpzUHN5Y2ggdHJpYWxzIGJ5IGNhbGxpbmcgaXQgZnJvbVxuICAgICAqIHRoZSBgb25fZmluaXNoYCBmdW5jdGlvbiwgbGlrZSBzbzpcbiAgICAgKlxuICAgICAqIGBgYGphdmFzY3JpcHRcbiAgICAgKiB2YXIgdHJpYWwgPSB7XG4gICAgICogICB0eXBlOiAnaW1hZ2Uta2V5Ym9hcmQtcmVzcG9uc2UnLFxuICAgICAqICAgc3RpbXVsdXM6ICdpbWdBLnBuZycsXG4gICAgICogICBvbl9maW5pc2g6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgKiAgICAgZmlyZWtpdC5hZGRUcmlhbERhdGEoZGF0YSk7XG4gICAgICogICB9XG4gICAgICogfTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIE9yIHlvdSBjYW4gY2FsbCBpdCBmcm9tIGFsbCB0cmlhbHMgaW4gYSBqc1BzeWNoXG4gICAgICogdGltZWxpbmUgYnkgY2FsbGluZyBpdCBmcm9tIHRoZSBgb25fZGF0YV91cGRhdGVgIGNhbGxiYWNrLiBJbiB0aGUgbGF0dGVyXG4gICAgICogY2FzZSwgeW91IGNhbiBhdm9pZCBzYXZpbmcgZXh0cmFuZW91cyB0cmlhbHMgYnkgY29uZGl0aW9uYWxseSBjYWxsaW5nXG4gICAgICogdGhpcyBtZXRob2QgYmFzZWQgb24gdGhlIGRhdGEuIEZvciBleGFtcGxlOlxuICAgICAqXG4gICAgICogYGBgamF2YXNjcmlwdFxuICAgICAqIGNvbnN0IHRpbWVsaW5lID0gW1xuICAgICAqICAgLy8gQSBmaXhhdGlvbiB0cmlhbDsgZG9uJ3Qgc2F2ZSB0byBGaXJlc3RvcmVcbiAgICAgKiAgIHtcbiAgICAgKiAgICAgdHlwZTogaHRtbEtleWJvYXJkUmVzcG9uc2UsXG4gICAgICogICAgIHN0aW11bHVzOiAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTo2MHB4O1wiPis8L2Rpdj4nLFxuICAgICAqICAgICBjaG9pY2VzOiBcIk5PX0tFWVNcIixcbiAgICAgKiAgICAgdHJpYWxfZHVyYXRpb246IDUwMCxcbiAgICAgKiAgIH0sXG4gICAgICogICAvLyBBIHN0aW11bHVzIGFuZCByZXNwb25zZSB0cmlhbDsgc2F2ZSB0byBGaXJlc3RvcmVcbiAgICAgKiAgIHtcbiAgICAgKiAgICAgdHlwZTogaW1hZ2VLZXlib2FyZFJlc3BvbnNlLFxuICAgICAqICAgICBzdGltdWx1czogJ2ltZ0EucG5nJyxcbiAgICAgKiAgICAgZGF0YTogeyBzYXZlVG9GaXJlc3RvcmU6IHRydWUgfSxcbiAgICAgKiAgIH1cbiAgICAgKiBdXG4gICAgICoganNQc3ljaC5pbml0KHtcbiAgICAgKiAgIHRpbWVsaW5lOiB0aW1lbGluZSxcbiAgICAgKiAgIG9uX2RhdGFfdXBkYXRlOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICogICAgIGlmIChkYXRhLnNhdmVUb0ZpcmVzdG9yZSkge1xuICAgICAqICAgICAgIGZpcmVraXQuYWRkVHJpYWxEYXRhKGRhdGEpO1xuICAgICAqICAgICB9XG4gICAgICogICB9XG4gICAgICogfSk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQGFzeW5jXG4gICAgICogQHBhcmFtIHsqfSB0cmlhbERhdGEgLSBBbiBvYmplY3QgY29udGFpbmluZyB0cmlhbCBkYXRhLlxuICAgICAqL1xuICAgIFJvYXJGaXJla2l0LnByb3RvdHlwZS53cml0ZVRyaWFsID0gZnVuY3Rpb24gKHRyaWFsRGF0YSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucnVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLnJ1bi53cml0ZVRyaWFsKHRyaWFsRGF0YSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSdW4gaXMgdW5kZWZpbmVkLiBVc2UgdGhlIHN0YXJ0UnVuIG1ldGhvZCBmaXJzdC4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIFJvYXJGaXJla2l0O1xufSgpKTtcbmV4cG9ydHMuUm9hckZpcmVraXQgPSBSb2FyRmlyZWtpdDtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG52YXIgX19nZW5lcmF0b3IgPSAodGhpcyAmJiB0aGlzLl9fZ2VuZXJhdG9yKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgYm9keSkge1xuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gICAgfVxufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUm9hclJ1biA9IGV4cG9ydHMuY29udmVydFRyaWFsVG9GaXJlc3RvcmUgPSB2b2lkIDA7XG52YXIgZmlyZXN0b3JlXzEgPSByZXF1aXJlKFwiZmlyZWJhc2UvZmlyZXN0b3JlXCIpO1xuLyoqXG4gKiBDb252ZXJ0IGEgdHJpYWwgZGF0YSB0byBhbGxvdyBzdG9yYWdlIG9uIENsb3VkIEZpcmVzdG9yZS5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGxlYXZlcyBhbGwgb3RoZXIgdHJpYWwgZGF0YSBpbnRhY3QgYnV0IGNvbnZlcnRzXG4gKiBhbnkgVVJMIG9iamVjdCB0byBhIHN0cmluZy5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSB0cmlhbERhdGEgLSBUcmlhbCBkYXRhIHRvIGNvbnZlcnRcbiAqIEByZXR1cm5zIHtPYmplY3R9IENvbnZlcnRlZCB0cmlhbCBkYXRhXG4gKi9cbnZhciBjb252ZXJ0VHJpYWxUb0ZpcmVzdG9yZSA9IGZ1bmN0aW9uICh0cmlhbERhdGEpIHtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHRyaWFsRGF0YSkubWFwKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIga2V5ID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVSTCkge1xuICAgICAgICAgICAgcmV0dXJuIFtrZXksIHZhbHVlLnRvU3RyaW5nKCldO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBba2V5LCAoMCwgZXhwb3J0cy5jb252ZXJ0VHJpYWxUb0ZpcmVzdG9yZSkodmFsdWUpXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBba2V5LCB2YWx1ZV07XG4gICAgICAgIH1cbiAgICB9KSk7XG59O1xuZXhwb3J0cy5jb252ZXJ0VHJpYWxUb0ZpcmVzdG9yZSA9IGNvbnZlcnRUcmlhbFRvRmlyZXN0b3JlO1xuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgYSBST0FSIHJ1bi5cbiAqXG4gKiBBIHJ1biBpcyBhIGdsb2JhbGx5IHVuaXF1ZSBjb2xsZWN0aW9uIG9mIHN1Y2Nlc3NpdmUgdHJpYWxzIHRoYXQgY29uc3RpdHV0ZVxuICogb25lIHVzZXIgXCJydW5uaW5nXCIgdGhyb3VnaCBhIHNpbmdsZSB0YXNrIG9uZSB0aW1lLlxuICovXG52YXIgUm9hclJ1biA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKiogQ3JlYXRlIGEgUk9BUiBydW5cbiAgICAgKiBAcGFyYW0ge1JvYXJVc2VyfSB1c2VyIC0gVGhlIHVzZXIgcnVubmluZyB0aGUgdGFza1xuICAgICAqIEBwYXJhbSB7Um9hclRhc2tWYXJpYW50fSB0YXNrIC0gVGhlIHRhc2sgdmFyaWFudCBiZWluZyBydW5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBSb2FyUnVuKF9hKSB7XG4gICAgICAgIHZhciB1c2VyID0gX2EudXNlciwgdGFzayA9IF9hLnRhc2s7XG4gICAgICAgIGlmICghKHVzZXIudXNlckNhdGVnb3J5ID09PSAnc3R1ZGVudCcpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ09ubHkgc3R1ZGVudHMgY2FuIHN0YXJ0IGEgcnVuLicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlciA9IHVzZXI7XG4gICAgICAgIHRoaXMudGFzayA9IHRhc2s7XG4gICAgICAgIGlmICh0aGlzLnVzZXIudXNlclJlZikge1xuICAgICAgICAgICAgdGhpcy5ydW5SZWYgPSAoMCwgZmlyZXN0b3JlXzEuZG9jKSgoMCwgZmlyZXN0b3JlXzEuY29sbGVjdGlvbikodGhpcy51c2VyLnVzZXJSZWYsICdydW5zJykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVc2VyIHJlZnMgbm90IHNldC4gUGxlYXNlIHVzZSB0aGUgdXNlci5zZXRSZWZzIG1ldGhvZCBmaXJzdC4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudGFzay50YXNrUmVmKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Rhc2sgcmVmcyBub3Qgc2V0LiBQbGVhc2UgdXNlIHRoZSB0YXNrLnNldFJlZnMgbWV0aG9kIGZpcnN0LicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgcnVuIG9uIEZpcmVzdG9yZVxuICAgICAqIEBtZXRob2RcbiAgICAgKiBAYXN5bmNcbiAgICAgKi9cbiAgICBSb2FyUnVuLnByb3RvdHlwZS5zdGFydFJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHJ1bkRhdGE7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhdGhpcy51c2VyLmlzUHVzaGVkVG9GaXJlc3RvcmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy51c2VyLnRvRmlyZXN0b3JlKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMudGFzay52YXJpYW50UmVmID09PSB1bmRlZmluZWQpKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMudGFzay50b0ZpcmVzdG9yZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5EYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RyaWN0SWQ6IHRoaXMudXNlci5kaXN0cmljdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaG9vbElkOiB0aGlzLnVzZXIuc2Nob29sSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NJZDogdGhpcy51c2VyLmNsYXNzSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R1ZHlJZDogdGhpcy51c2VyLnN0dWR5SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza0lkOiB0aGlzLnRhc2sudGFza0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnRJZDogdGhpcy50YXNrLnZhcmlhbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrUmVmOiB0aGlzLnRhc2sudGFza1JlZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50UmVmOiB0aGlzLnRhc2sudmFyaWFudFJlZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVTdGFydGVkOiAoMCwgZmlyZXN0b3JlXzEuc2VydmVyVGltZXN0YW1wKSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVGaW5pc2hlZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCAoMCwgZmlyZXN0b3JlXzEuc2V0RG9jKSh0aGlzLnJ1blJlZiwgcnVuRGF0YSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGZpcmVzdG9yZV8xLnVwZGF0ZURvYykoX3RoaXMudXNlci51c2VyUmVmLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrczogKDAsIGZpcmVzdG9yZV8xLmFycmF5VW5pb24pKF90aGlzLnRhc2sudGFza0lkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnRzOiAoMCwgZmlyZXN0b3JlXzEuYXJyYXlVbmlvbikoX3RoaXMudGFzay52YXJpYW50SWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza1JlZnM6ICgwLCBmaXJlc3RvcmVfMS5hcnJheVVuaW9uKShfdGhpcy50YXNrLnRhc2tSZWYpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudFJlZnM6ICgwLCBmaXJlc3RvcmVfMS5hcnJheVVuaW9uKShfdGhpcy50YXNrLnZhcmlhbnRSZWYpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy51c2VyLnVwZGF0ZUZpcmVzdG9yZVRpbWVzdGFtcCgpOyB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTWFyayB0aGlzIHJ1biBhcyBjb21wbGV0ZSBvbiBGaXJlc3RvcmVcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQGFzeW5jXG4gICAgICovXG4gICAgUm9hclJ1bi5wcm90b3R5cGUuZmluaXNoUnVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zdGFydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUnVuIGhhcyBub3QgYmVlbiBzdGFydGVkIHlldC4gVXNlIHRoZSBzdGFydFJ1biBtZXRob2QgZmlyc3QuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCAoMCwgZmlyZXN0b3JlXzEudXBkYXRlRG9jKSh0aGlzLnJ1blJlZiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGltZUZpbmlzaGVkOiAoMCwgZmlyZXN0b3JlXzEuc2VydmVyVGltZXN0YW1wKSgpLFxuICAgICAgICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy51c2VyLnVwZGF0ZUZpcmVzdG9yZVRpbWVzdGFtcCgpO1xuICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGQgYSBuZXcgdHJpYWwgdG8gdGhpcyBydW4gb24gRmlyZXN0b3JlXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBhc3luY1xuICAgICAqIEBwYXJhbSB7Kn0gdHJpYWxEYXRhIC0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdHJpYWwgZGF0YS5cbiAgICAgKi9cbiAgICBSb2FyUnVuLnByb3RvdHlwZS53cml0ZVRyaWFsID0gZnVuY3Rpb24gKHRyaWFsRGF0YSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdHJpYWxSZWY7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zdGFydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUnVuIGhhcyBub3QgYmVlbiBzdGFydGVkIHlldC4gVXNlIHRoZSBzdGFydFJ1biBtZXRob2QgZmlyc3QuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRyaWFsUmVmID0gKDAsIGZpcmVzdG9yZV8xLmRvYykoKDAsIGZpcmVzdG9yZV8xLmNvbGxlY3Rpb24pKHRoaXMucnVuUmVmLCAndHJpYWxzJykpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCAoMCwgZmlyZXN0b3JlXzEuc2V0RG9jKSh0cmlhbFJlZiwgKDAsIGV4cG9ydHMuY29udmVydFRyaWFsVG9GaXJlc3RvcmUpKHRyaWFsRGF0YSkpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMudXNlci51cGRhdGVGaXJlc3RvcmVUaW1lc3RhbXAoKTtcbiAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIFJvYXJSdW47XG59KCkpO1xuZXhwb3J0cy5Sb2FyUnVuID0gUm9hclJ1bjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG52YXIgX19nZW5lcmF0b3IgPSAodGhpcyAmJiB0aGlzLl9fZ2VuZXJhdG9yKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgYm9keSkge1xuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gICAgfVxufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUm9hclRhc2tWYXJpYW50ID0gdm9pZCAwO1xudmFyIGZpcmVzdG9yZV8xID0gcmVxdWlyZShcImZpcmViYXNlL2ZpcmVzdG9yZVwiKTtcbnZhciB1dGlsXzEgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xuLyoqIENsYXNzIHJlcHJlc2VudGluZyBhIFJPQVIgdGFza1xuICogQHBhcmFtIHtzdHJpbmd9IHRhc2tJZCAtIFRoZSBJRCBvZiB0aGUgcGFyZW50IHRhc2suIFNob3VsZCBiZSBhIHNob3J0IGluaXRpYWxpc20sIGUuZy4gXCJzd3JcIiBvciBcInNyZlwiXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFza05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcGFyZW50IHRhc2tcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YXNrRGVzY3JpcHRpb24gLSBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHRhc2tcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YXJpYW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YXNrIHZhcmlhbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YXJpYW50RGVzY3JpcHRpb24gLSBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHZhcmlhbnRcbiAqIEBwYXJhbSB7QXJyYXl9IGJsb2NrcyAtIFRoZSBibG9ja3Mgb2YgdGhpcyB0YXNrIHZhcmlhbnRcbiAqL1xudmFyIFJvYXJUYXNrVmFyaWFudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSb2FyVGFza1ZhcmlhbnQoX2EpIHtcbiAgICAgICAgdmFyIHRhc2tJZCA9IF9hLnRhc2tJZCwgdGFza05hbWUgPSBfYS50YXNrTmFtZSwgdmFyaWFudE5hbWUgPSBfYS52YXJpYW50TmFtZSwgX2IgPSBfYS50YXNrRGVzY3JpcHRpb24sIHRhc2tEZXNjcmlwdGlvbiA9IF9iID09PSB2b2lkIDAgPyBudWxsIDogX2IsIF9jID0gX2EudmFyaWFudERlc2NyaXB0aW9uLCB2YXJpYW50RGVzY3JpcHRpb24gPSBfYyA9PT0gdm9pZCAwID8gbnVsbCA6IF9jLCBfZCA9IF9hLmJsb2NrcywgYmxvY2tzID0gX2QgPT09IHZvaWQgMCA/IFtdIDogX2Q7XG4gICAgICAgIHRoaXMudGFza0lkID0gdGFza0lkO1xuICAgICAgICB0aGlzLnRhc2tOYW1lID0gdGFza05hbWU7XG4gICAgICAgIHRoaXMudGFza0Rlc2NyaXB0aW9uID0gdGFza0Rlc2NyaXB0aW9uO1xuICAgICAgICB0aGlzLnZhcmlhbnROYW1lID0gdmFyaWFudE5hbWU7XG4gICAgICAgIHRoaXMudmFyaWFudERlc2NyaXB0aW9uID0gdmFyaWFudERlc2NyaXB0aW9uO1xuICAgICAgICB0aGlzLmJsb2NrcyA9IGJsb2NrcztcbiAgICAgICAgdGhpcy50YXNrUmVmID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnZhcmlhbnRzQ29sbGVjdGlvblJlZiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy52YXJpYW50SWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudmFyaWFudFJlZiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqIFNldCBGaXJlc3RvcmUgZG9jIGFuZCBjb2xsZWN0aW9uIHJlZmVyZW5jZXNcbiAgICAgKiBAcGFyYW0ge0RvY3VtZW50UmVmZXJlbmNlfSByb290RG9jIC0gVGhlIHJvb3QgZG9jdW1lbnQgcmVmZXJlbmNlXG4gICAgICovXG4gICAgUm9hclRhc2tWYXJpYW50LnByb3RvdHlwZS5zZXRSZWZzID0gZnVuY3Rpb24gKHJvb3REb2MpIHtcbiAgICAgICAgdGhpcy50YXNrUmVmID0gKDAsIGZpcmVzdG9yZV8xLmRvYykocm9vdERvYywgJ3Rhc2tzJywgdGhpcy50YXNrSWQpO1xuICAgICAgICB0aGlzLnZhcmlhbnRzQ29sbGVjdGlvblJlZiA9ICgwLCBmaXJlc3RvcmVfMS5jb2xsZWN0aW9uKSh0aGlzLnRhc2tSZWYsICd2YXJpYW50cycpO1xuICAgIH07XG4gICAgLyoqIEFkZCBhIGJsb2NrIHRvIHRoaXMgZXhwZXJpbWVudFxuICAgICAqIEBtZXRob2RcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYmxvY2tOdW1iZXIgLSBUaGUgYmxvY2sgaW5kZXhcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHJpYWxNZXRob2QgLSBUaGUgdHJpYWwgc2FtcGxpbmcgbWV0aG9kXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvcnB1cyAtIFRoZSBjb3JwdXMgZnJvbSB3aGljaCBzdGltdWxpIGFyZSBkcmF3blxuICAgICAqL1xuICAgIFJvYXJUYXNrVmFyaWFudC5wcm90b3R5cGUuYWRkQmxvY2sgPSBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgdmFyIF9iID0gX2EuYmxvY2tOdW1iZXIsIGJsb2NrTnVtYmVyID0gX2IgPT09IHZvaWQgMCA/IDAgOiBfYiwgX2MgPSBfYS50cmlhbE1ldGhvZCwgdHJpYWxNZXRob2QgPSBfYyA9PT0gdm9pZCAwID8gJ3ByYWN0aWNlJyA6IF9jLCBfZCA9IF9hLmNvcnB1cywgY29ycHVzID0gX2QgPT09IHZvaWQgMCA/ICdwcmFjdGljZUNvcnB1c0lkJyA6IF9kO1xuICAgICAgICB0aGlzLmJsb2Nrcy5wdXNoKHtcbiAgICAgICAgICAgIGJsb2NrTnVtYmVyOiBibG9ja051bWJlcixcbiAgICAgICAgICAgIHRyaWFsTWV0aG9kOiB0cmlhbE1ldGhvZCxcbiAgICAgICAgICAgIGNvcnB1czogY29ycHVzLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFB1c2ggdGhlIHRyaWFsIGFuZCB0cmlhbCB2YXJpYW50IHRvIEZpcmVzdG9yZVxuICAgICAqIEBtZXRob2RcbiAgICAgKiBAYXN5bmNcbiAgICAgKi9cbiAgICBSb2FyVGFza1ZhcmlhbnQucHJvdG90eXBlLnRvRmlyZXN0b3JlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFza0RhdGEsIGVtcHR5VmFyaWFudFJlZiwgcSwgcXVlcnlTbmFwc2hvdCwgdmFyaWFudERhdGE7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy50YXNrUmVmID09PSB1bmRlZmluZWQgfHwgdGhpcy52YXJpYW50c0NvbGxlY3Rpb25SZWYgPT09IHVuZGVmaW5lZCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUYXNrIHJlZnMgbm90IHNldC4gUGxlYXNlIHVzZSB0aGUgc2V0UmVmcyBtZXRob2QgZmlyc3QuJyk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tEYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLnRhc2tJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLnRhc2tOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLnRhc2tEZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0VXBkYXRlZDogKDAsIGZpcmVzdG9yZV8xLnNlcnZlclRpbWVzdGFtcCkoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCAoMCwgZmlyZXN0b3JlXzEuc2V0RG9jKSh0aGlzLnRhc2tSZWYsIHRhc2tEYXRhKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5VmFyaWFudFJlZiA9ICgwLCBmaXJlc3RvcmVfMS5kb2MpKHRoaXMudGFza1JlZiwgJ3ZhcmlhbnRzJywgJ2VtcHR5Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCAoMCwgZmlyZXN0b3JlXzEuc2V0RG9jKShlbXB0eVZhcmlhbnRSZWYsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VtcHR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzU3RyaW5nOiAnZW1wdHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcSA9ICgwLCBmaXJlc3RvcmVfMS5xdWVyeSkodGhpcy52YXJpYW50c0NvbGxlY3Rpb25SZWYsICgwLCBmaXJlc3RvcmVfMS53aGVyZSkoJ25hbWUnLCAnPT0nLCB0aGlzLnZhcmlhbnROYW1lKSwgKDAsIGZpcmVzdG9yZV8xLndoZXJlKSgnYmxvY2tzU3RyaW5nJywgJz09JywgSlNPTi5zdHJpbmdpZnkodGhpcy5ibG9ja3MpKSwgKDAsIGZpcmVzdG9yZV8xLm9yZGVyQnkpKCdsYXN0UGxheWVkJywgJ2Rlc2MnKSwgKDAsIGZpcmVzdG9yZV8xLmxpbWl0KSgxKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCAoMCwgZmlyZXN0b3JlXzEuZ2V0RG9jcykocSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVNuYXBzaG90ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgc28gdXNlIHRoZSBGaXJlc3RvcmUgZ2VuZXJhdGVkIGlkIGZvciB0aGUgdmFyaWFudCBhbmQgdXBkYXRlIHRpbWVzdGFtcC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5U25hcHNob3QuZm9yRWFjaChmdW5jdGlvbiAoZG9jUmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMudmFyaWFudElkID0gZG9jUmVmLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMudmFyaWFudFJlZiA9ICgwLCBmaXJlc3RvcmVfMS5kb2MpKF90aGlzLnZhcmlhbnRzQ29sbGVjdGlvblJlZiwgX3RoaXMudmFyaWFudElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgZmlyZXN0b3JlXzEudXBkYXRlRG9jKShfdGhpcy52YXJpYW50UmVmLCAoMCwgdXRpbF8xLnJlbW92ZU51bGwpKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IF90aGlzLnZhcmlhbnREZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFBsYXllZDogKDAsIGZpcmVzdG9yZV8xLnNlcnZlclRpbWVzdGFtcCkoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMudmFyaWFudElkID09PSB1bmRlZmluZWQpKSByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnREYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMudmFyaWFudE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMudmFyaWFudERlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrczogdGhpcy5ibG9ja3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzU3RyaW5nOiBKU09OLnN0cmluZ2lmeSh0aGlzLmJsb2NrcyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFBsYXllZDogKDAsIGZpcmVzdG9yZV8xLnNlcnZlclRpbWVzdGFtcCkoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhcmlhbnRSZWYgPSAoMCwgZmlyZXN0b3JlXzEuZG9jKSh0aGlzLnZhcmlhbnRzQ29sbGVjdGlvblJlZik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCAoMCwgZmlyZXN0b3JlXzEuc2V0RG9jKSh0aGlzLnZhcmlhbnRSZWYsIHZhcmlhbnREYXRhKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFyaWFudElkID0gdGhpcy52YXJpYW50UmVmLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA2O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gUm9hclRhc2tWYXJpYW50O1xufSgpKTtcbmV4cG9ydHMuUm9hclRhc2tWYXJpYW50ID0gUm9hclRhc2tWYXJpYW50O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG52YXIgX19nZW5lcmF0b3IgPSAodGhpcyAmJiB0aGlzLl9fZ2VuZXJhdG9yKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgYm9keSkge1xuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gICAgfVxufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUm9hclVzZXIgPSB2b2lkIDA7XG52YXIgZmlyZXN0b3JlXzEgPSByZXF1aXJlKFwiZmlyZWJhc2UvZmlyZXN0b3JlXCIpO1xudmFyIHV0aWxfMSA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG4vKiogQ2xhc3MgcmVwcmVzZW50aW5nIGEgUk9BUiB1c2VyICovXG52YXIgUm9hclVzZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUm9hclVzZXIoX2EpIHtcbiAgICAgICAgdmFyIGlkID0gX2EuaWQsIGZpcmViYXNlVWlkID0gX2EuZmlyZWJhc2VVaWQsIF9iID0gX2EuYmlydGhNb250aCwgYmlydGhNb250aCA9IF9iID09PSB2b2lkIDAgPyBudWxsIDogX2IsIF9jID0gX2EuYmlydGhZZWFyLCBiaXJ0aFllYXIgPSBfYyA9PT0gdm9pZCAwID8gbnVsbCA6IF9jLCBfZCA9IF9hLmNsYXNzSWQsIGNsYXNzSWQgPSBfZCA9PT0gdm9pZCAwID8gbnVsbCA6IF9kLCBfZSA9IF9hLnNjaG9vbElkLCBzY2hvb2xJZCA9IF9lID09PSB2b2lkIDAgPyBudWxsIDogX2UsIF9mID0gX2EuZGlzdHJpY3RJZCwgZGlzdHJpY3RJZCA9IF9mID09PSB2b2lkIDAgPyBudWxsIDogX2YsIF9nID0gX2Euc3R1ZHlJZCwgc3R1ZHlJZCA9IF9nID09PSB2b2lkIDAgPyBudWxsIDogX2csIF9oID0gX2EudXNlckNhdGVnb3J5LCB1c2VyQ2F0ZWdvcnkgPSBfaCA9PT0gdm9pZCAwID8gJ3N0dWRlbnQnIDogX2g7XG4gICAgICAgIHZhciBhbGxvd2VkVXNlckNhdGVnb3JpZXMgPSBbJ3N0dWRlbnQnLCAnZWR1Y2F0b3InLCAncmVzZWFyY2hlciddO1xuICAgICAgICBpZiAoIWFsbG93ZWRVc2VyQ2F0ZWdvcmllcy5pbmNsdWRlcyh1c2VyQ2F0ZWdvcnkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2VyIGNhdGVnb3J5IG11c3QgYmUgb25lIG9mIFwiLmNvbmNhdChhbGxvd2VkVXNlckNhdGVnb3JpZXMuam9pbignLCAnKSwgXCIuXCIpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMuZmlyZWJhc2VVaWQgPSBmaXJlYmFzZVVpZDtcbiAgICAgICAgdGhpcy5iaXJ0aE1vbnRoID0gYmlydGhNb250aDtcbiAgICAgICAgdGhpcy5iaXJ0aFllYXIgPSBiaXJ0aFllYXI7XG4gICAgICAgIHRoaXMuY2xhc3NJZCA9IGNsYXNzSWQ7XG4gICAgICAgIHRoaXMuc2Nob29sSWQgPSBzY2hvb2xJZDtcbiAgICAgICAgdGhpcy5kaXN0cmljdElkID0gZGlzdHJpY3RJZDtcbiAgICAgICAgdGhpcy5zdHVkeUlkID0gc3R1ZHlJZDtcbiAgICAgICAgdGhpcy51c2VyQ2F0ZWdvcnkgPSB1c2VyQ2F0ZWdvcnk7XG4gICAgICAgIHRoaXMudXNlclJlZiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5pc1B1c2hlZFRvRmlyZXN0b3JlID0gZmFsc2U7XG4gICAgfVxuICAgIC8qKiBTZXQgRmlyZXN0b3JlIGRvYyByZWZlcmVuY2VzXG4gICAgICogQHBhcmFtIHtEb2N1bWVudFJlZmVyZW5jZX0gcm9vdERvYyAtIFRoZSByb290IGRvY3VtZW50IHJlZmVyZW5jZVxuICAgICAqL1xuICAgIFJvYXJVc2VyLnByb3RvdHlwZS5zZXRSZWZzID0gZnVuY3Rpb24gKHJvb3REb2MpIHtcbiAgICAgICAgdGhpcy51c2VyUmVmID0gKDAsIGZpcmVzdG9yZV8xLmRvYykocm9vdERvYywgJ3VzZXJzJywgdGhpcy5pZCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQdXNoIHRoZSB1c2VyIHRvIEZpcmVzdG9yZVxuICAgICAqIEBtZXRob2RcbiAgICAgKiBAYXN5bmNcbiAgICAgKi9cbiAgICBSb2FyVXNlci5wcm90b3R5cGUudG9GaXJlc3RvcmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB1c2VyRGF0YV8xO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy51c2VyUmVmID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVc2VyIHJlZnMgbm90IHNldC4gUGxlYXNlIHVzZSB0aGUgc2V0UmVmcyBtZXRob2QgZmlyc3QuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YV8xID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJlYmFzZVVpZDogdGhpcy5maXJlYmFzZVVpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpcnRoTW9udGg6IHRoaXMuYmlydGhNb250aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpcnRoWWVhcjogdGhpcy5iaXJ0aFllYXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0lkOiB0aGlzLmNsYXNzSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hvb2xJZDogdGhpcy5zY2hvb2xJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RyaWN0SWQ6IHRoaXMuZGlzdHJpY3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0dWR5SWQ6IHRoaXMuc3R1ZHlJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJDYXRlZ29yeTogdGhpcy51c2VyQ2F0ZWdvcnksXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0VXBkYXRlZDogKDAsIGZpcmVzdG9yZV8xLnNlcnZlclRpbWVzdGFtcCkoKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHN0dWR5LCBkaXN0cmljdCwgc2Nob29sLCBvciBjbGFzcyBpcyBwcm92aWRlZCwgYWxzbyBhZGQgaXQgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIGxpc3Qgb2YgYWxsIHN0dWRpZXMsIGRpc3RyaWN0cywgc2Nob29scywgb3IgY2xhc3Nlcy5cbiAgICAgICAgICAgICAgICAgICAgLy8gTGlrZXdpc2UgZm9yIHRhc2sgYW5kIHZhcmlhbnQuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0dWR5SWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YV8xLnN0dWRpZXMgPSAoMCwgZmlyZXN0b3JlXzEuYXJyYXlVbmlvbikodGhpcy5zdHVkeUlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGlzdHJpY3RJZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJEYXRhXzEuZGlzdHJpY3RzID0gKDAsIGZpcmVzdG9yZV8xLmFycmF5VW5pb24pKHRoaXMuZGlzdHJpY3RJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaG9vbElkKVxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlckRhdGFfMS5zY2hvb2xzID0gKDAsIGZpcmVzdG9yZV8xLmFycmF5VW5pb24pKHRoaXMuc2Nob29sSWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jbGFzc0lkKVxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlckRhdGFfMS5jbGFzc2VzID0gKDAsIGZpcmVzdG9yZV8xLmFycmF5VW5pb24pKHRoaXMuY2xhc3NJZCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCAoMCwgZmlyZXN0b3JlXzEudXBkYXRlRG9jKSh0aGlzLnVzZXJSZWYsICgwLCB1dGlsXzEucmVtb3ZlTnVsbCkodXNlckRhdGFfMSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcnJvckNvZGUgPSBlcnJvci5jb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvckNvZGUgPT09ICdwZXJtaXNzaW9uLWRlbmllZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIFJPQVIgRmlyZXN0b3JlIHJ1bGVzIGFyZSB3cml0dGVuIHN1Y2ggdGhhdCBpZiB3ZSBnZXQgaGVyZSwgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZXIgZG9lcyBub3QgY3VycmVudGx5IGV4aXN0IGluIEZpcmVzdG9yZS4gU28gY3JlYXRlIHRoZW0uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgZmlyZXN0b3JlXzEuc2V0RG9jKShfdGhpcy51c2VyUmVmLCBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdXNlckRhdGFfMSksIHsgY3JlYXRlZEF0OiAoMCwgZmlyZXN0b3JlXzEuc2VydmVyVGltZXN0YW1wKSgpIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmlzUHVzaGVkVG9GaXJlc3RvcmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIHVzZXIncyBcImxhc3RVcGRhdGVkXCIgdGltZXN0YW1wXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBhc3luY1xuICAgICAqL1xuICAgIFJvYXJVc2VyLnByb3RvdHlwZS51cGRhdGVGaXJlc3RvcmVUaW1lc3RhbXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy51c2VyUmVmID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVc2VyIHJlZnMgbm90IHNldC4gUGxlYXNlIHVzZSB0aGUgc2V0UmVmcyBtZXRob2QgZmlyc3QuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAoMCwgZmlyZXN0b3JlXzEudXBkYXRlRG9jKSh0aGlzLnVzZXJSZWYsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RVcGRhdGVkOiAoMCwgZmlyZXN0b3JlXzEuc2VydmVyVGltZXN0YW1wKSgpLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIFJvYXJVc2VyO1xufSgpKTtcbmV4cG9ydHMuUm9hclVzZXIgPSBSb2FyVXNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5yZW1vdmVOdWxsID0gdm9pZCAwO1xuLyoqIFJlbW92ZSBudWxsIGF0dHJpYnV0ZXMgZnJvbSBhbiBvYmplY3RcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIE9iamVjdCB0byByZW1vdmUgbnVsbCBhdHRyaWJ1dGVzIGZyb21cbiAqIEByZXR1cm5zIHtPYmplY3R9IE9iamVjdCB3aXRoIG51bGwgYXR0cmlidXRlcyByZW1vdmVkXG4gKi9cbnZhciByZW1vdmVOdWxsID0gZnVuY3Rpb24gKG9iaikge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKG9iaikuZmlsdGVyKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgXyA9IF9hWzBdLCB2ID0gX2FbMV07XG4gICAgICAgIHJldHVybiB2ICE9IG51bGw7XG4gICAgfSkpO1xufTtcbmV4cG9ydHMucmVtb3ZlTnVsbCA9IHJlbW92ZU51bGw7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUm9hckZpcmVraXQgPSB2b2lkIDA7XG52YXIgZmlyZWtpdF8xID0gcmVxdWlyZShcIi4vZmlyZXN0b3JlL2ZpcmVraXRcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSb2FyRmlyZWtpdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZmlyZWtpdF8xLlJvYXJGaXJla2l0OyB9IH0pO1xuIiwiaW1wb3J0IHsgRXJyb3JGYWN0b3J5LCBkZWVwRXF1YWwsIGlzQnJvd3NlckV4dGVuc2lvbiwgaXNNb2JpbGVDb3Jkb3ZhLCBpc1JlYWN0TmF0aXZlLCBGaXJlYmFzZUVycm9yLCBxdWVyeXN0cmluZywgZ2V0TW9kdWxhckluc3RhbmNlLCBiYXNlNjREZWNvZGUsIGdldFVBLCBpc0lFLCBjcmVhdGVTdWJzY3JpYmUsIHF1ZXJ5c3RyaW5nRGVjb2RlLCBleHRyYWN0UXVlcnlzdHJpbmcsIGlzRW1wdHkgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5pbXBvcnQgeyBTREtfVkVSU0lPTiwgX2dldFByb3ZpZGVyLCBfcmVnaXN0ZXJDb21wb25lbnQsIHJlZ2lzdGVyVmVyc2lvbiwgZ2V0QXBwIH0gZnJvbSAnQGZpcmViYXNlL2FwcCc7XG5pbXBvcnQgeyBfX3Jlc3QgfSBmcm9tICd0c2xpYic7XG5pbXBvcnQgeyBMb2dnZXIsIExvZ0xldmVsIH0gZnJvbSAnQGZpcmViYXNlL2xvZ2dlcic7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAZmlyZWJhc2UvY29tcG9uZW50JztcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIEFuIGVudW0gb2YgZmFjdG9ycyB0aGF0IG1heSBiZSB1c2VkIGZvciBtdWx0aWZhY3RvciBhdXRoZW50aWNhdGlvbi5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY29uc3QgRmFjdG9ySWQgPSB7XHJcbiAgICAvKiogUGhvbmUgYXMgc2Vjb25kIGZhY3RvciAqL1xyXG4gICAgUEhPTkU6ICdwaG9uZSdcclxufTtcclxuLyoqXHJcbiAqIEVudW1lcmF0aW9uIG9mIHN1cHBvcnRlZCBwcm92aWRlcnMuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNvbnN0IFByb3ZpZGVySWQgPSB7XHJcbiAgICAvKiogRmFjZWJvb2sgcHJvdmlkZXIgSUQgKi9cclxuICAgIEZBQ0VCT09LOiAnZmFjZWJvb2suY29tJyxcclxuICAgIC8qKiBHaXRIdWIgcHJvdmlkZXIgSUQgKi9cclxuICAgIEdJVEhVQjogJ2dpdGh1Yi5jb20nLFxyXG4gICAgLyoqIEdvb2dsZSBwcm92aWRlciBJRCAqL1xyXG4gICAgR09PR0xFOiAnZ29vZ2xlLmNvbScsXHJcbiAgICAvKiogUGFzc3dvcmQgcHJvdmlkZXIgKi9cclxuICAgIFBBU1NXT1JEOiAncGFzc3dvcmQnLFxyXG4gICAgLyoqIFBob25lIHByb3ZpZGVyICovXHJcbiAgICBQSE9ORTogJ3Bob25lJyxcclxuICAgIC8qKiBUd2l0dGVyIHByb3ZpZGVyIElEICovXHJcbiAgICBUV0lUVEVSOiAndHdpdHRlci5jb20nXHJcbn07XHJcbi8qKlxyXG4gKiBFbnVtZXJhdGlvbiBvZiBzdXBwb3J0ZWQgc2lnbi1pbiBtZXRob2RzLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jb25zdCBTaWduSW5NZXRob2QgPSB7XHJcbiAgICAvKiogRW1haWwgbGluayBzaWduIGluIG1ldGhvZCAqL1xyXG4gICAgRU1BSUxfTElOSzogJ2VtYWlsTGluaycsXHJcbiAgICAvKiogRW1haWwvcGFzc3dvcmQgc2lnbiBpbiBtZXRob2QgKi9cclxuICAgIEVNQUlMX1BBU1NXT1JEOiAncGFzc3dvcmQnLFxyXG4gICAgLyoqIEZhY2Vib29rIHNpZ24gaW4gbWV0aG9kICovXHJcbiAgICBGQUNFQk9PSzogJ2ZhY2Vib29rLmNvbScsXHJcbiAgICAvKiogR2l0SHViIHNpZ24gaW4gbWV0aG9kICovXHJcbiAgICBHSVRIVUI6ICdnaXRodWIuY29tJyxcclxuICAgIC8qKiBHb29nbGUgc2lnbiBpbiBtZXRob2QgKi9cclxuICAgIEdPT0dMRTogJ2dvb2dsZS5jb20nLFxyXG4gICAgLyoqIFBob25lIHNpZ24gaW4gbWV0aG9kICovXHJcbiAgICBQSE9ORTogJ3Bob25lJyxcclxuICAgIC8qKiBUd2l0dGVyIHNpZ24gaW4gbWV0aG9kICovXHJcbiAgICBUV0lUVEVSOiAndHdpdHRlci5jb20nXHJcbn07XHJcbi8qKlxyXG4gKiBFbnVtZXJhdGlvbiBvZiBzdXBwb3J0ZWQgb3BlcmF0aW9uIHR5cGVzLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jb25zdCBPcGVyYXRpb25UeXBlID0ge1xyXG4gICAgLyoqIE9wZXJhdGlvbiBpbnZvbHZpbmcgbGlua2luZyBhbiBhZGRpdGlvbmFsIHByb3ZpZGVyIHRvIGFuIGFscmVhZHkgc2lnbmVkLWluIHVzZXIuICovXHJcbiAgICBMSU5LOiAnbGluaycsXHJcbiAgICAvKiogT3BlcmF0aW9uIGludm9sdmluZyB1c2luZyBhIHByb3ZpZGVyIHRvIHJlYXV0aGVudGljYXRlIGFuIGFscmVhZHkgc2lnbmVkLWluIHVzZXIuICovXHJcbiAgICBSRUFVVEhFTlRJQ0FURTogJ3JlYXV0aGVudGljYXRlJyxcclxuICAgIC8qKiBPcGVyYXRpb24gaW52b2x2aW5nIHNpZ25pbmcgaW4gYSB1c2VyLiAqL1xyXG4gICAgU0lHTl9JTjogJ3NpZ25JbidcclxufTtcclxuLyoqXHJcbiAqIEFuIGVudW1lcmF0aW9uIG9mIHRoZSBwb3NzaWJsZSBlbWFpbCBhY3Rpb24gdHlwZXMuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNvbnN0IEFjdGlvbkNvZGVPcGVyYXRpb24gPSB7XHJcbiAgICAvKiogVGhlIGVtYWlsIGxpbmsgc2lnbi1pbiBhY3Rpb24uICovXHJcbiAgICBFTUFJTF9TSUdOSU46ICdFTUFJTF9TSUdOSU4nLFxyXG4gICAgLyoqIFRoZSBwYXNzd29yZCByZXNldCBhY3Rpb24uICovXHJcbiAgICBQQVNTV09SRF9SRVNFVDogJ1BBU1NXT1JEX1JFU0VUJyxcclxuICAgIC8qKiBUaGUgZW1haWwgcmV2b2NhdGlvbiBhY3Rpb24uICovXHJcbiAgICBSRUNPVkVSX0VNQUlMOiAnUkVDT1ZFUl9FTUFJTCcsXHJcbiAgICAvKiogVGhlIHJldmVydCBzZWNvbmQgZmFjdG9yIGFkZGl0aW9uIGVtYWlsIGFjdGlvbi4gKi9cclxuICAgIFJFVkVSVF9TRUNPTkRfRkFDVE9SX0FERElUSU9OOiAnUkVWRVJUX1NFQ09ORF9GQUNUT1JfQURESVRJT04nLFxyXG4gICAgLyoqIFRoZSByZXZlcnQgc2Vjb25kIGZhY3RvciBhZGRpdGlvbiBlbWFpbCBhY3Rpb24uICovXHJcbiAgICBWRVJJRllfQU5EX0NIQU5HRV9FTUFJTDogJ1ZFUklGWV9BTkRfQ0hBTkdFX0VNQUlMJyxcclxuICAgIC8qKiBUaGUgZW1haWwgdmVyaWZpY2F0aW9uIGFjdGlvbi4gKi9cclxuICAgIFZFUklGWV9FTUFJTDogJ1ZFUklGWV9FTUFJTCdcclxufTtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gX2RlYnVnRXJyb3JNYXAoKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIFtcImFkbWluLXJlc3RyaWN0ZWQtb3BlcmF0aW9uXCIgLyogQURNSU5fT05MWV9PUEVSQVRJT04gKi9dOiAnVGhpcyBvcGVyYXRpb24gaXMgcmVzdHJpY3RlZCB0byBhZG1pbmlzdHJhdG9ycyBvbmx5LicsXHJcbiAgICAgICAgW1wiYXJndW1lbnQtZXJyb3JcIiAvKiBBUkdVTUVOVF9FUlJPUiAqL106ICcnLFxyXG4gICAgICAgIFtcImFwcC1ub3QtYXV0aG9yaXplZFwiIC8qIEFQUF9OT1RfQVVUSE9SSVpFRCAqL106IFwiVGhpcyBhcHAsIGlkZW50aWZpZWQgYnkgdGhlIGRvbWFpbiB3aGVyZSBpdCdzIGhvc3RlZCwgaXMgbm90IFwiICtcclxuICAgICAgICAgICAgJ2F1dGhvcml6ZWQgdG8gdXNlIEZpcmViYXNlIEF1dGhlbnRpY2F0aW9uIHdpdGggdGhlIHByb3ZpZGVkIEFQSSBrZXkuICcgK1xyXG4gICAgICAgICAgICAnUmV2aWV3IHlvdXIga2V5IGNvbmZpZ3VyYXRpb24gaW4gdGhlIEdvb2dsZSBBUEkgY29uc29sZS4nLFxyXG4gICAgICAgIFtcImFwcC1ub3QtaW5zdGFsbGVkXCIgLyogQVBQX05PVF9JTlNUQUxMRUQgKi9dOiAnVGhlIHJlcXVlc3RlZCBtb2JpbGUgYXBwbGljYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgaWRlbnRpZmllciAoJyArXHJcbiAgICAgICAgICAgICdBbmRyb2lkIHBhY2thZ2UgbmFtZSBvciBpT1MgYnVuZGxlIElEKSBwcm92aWRlZCBpcyBub3QgaW5zdGFsbGVkIG9uICcgK1xyXG4gICAgICAgICAgICAndGhpcyBkZXZpY2UuJyxcclxuICAgICAgICBbXCJjYXB0Y2hhLWNoZWNrLWZhaWxlZFwiIC8qIENBUFRDSEFfQ0hFQ0tfRkFJTEVEICovXTogJ1RoZSByZUNBUFRDSEEgcmVzcG9uc2UgdG9rZW4gcHJvdmlkZWQgaXMgZWl0aGVyIGludmFsaWQsIGV4cGlyZWQsICcgK1xyXG4gICAgICAgICAgICAnYWxyZWFkeSB1c2VkIG9yIHRoZSBkb21haW4gYXNzb2NpYXRlZCB3aXRoIGl0IGRvZXMgbm90IG1hdGNoIHRoZSBsaXN0ICcgK1xyXG4gICAgICAgICAgICAnb2Ygd2hpdGVsaXN0ZWQgZG9tYWlucy4nLFxyXG4gICAgICAgIFtcImNvZGUtZXhwaXJlZFwiIC8qIENPREVfRVhQSVJFRCAqL106ICdUaGUgU01TIGNvZGUgaGFzIGV4cGlyZWQuIFBsZWFzZSByZS1zZW5kIHRoZSB2ZXJpZmljYXRpb24gY29kZSB0byB0cnkgJyArXHJcbiAgICAgICAgICAgICdhZ2Fpbi4nLFxyXG4gICAgICAgIFtcImNvcmRvdmEtbm90LXJlYWR5XCIgLyogQ09SRE9WQV9OT1RfUkVBRFkgKi9dOiAnQ29yZG92YSBmcmFtZXdvcmsgaXMgbm90IHJlYWR5LicsXHJcbiAgICAgICAgW1wiY29ycy11bnN1cHBvcnRlZFwiIC8qIENPUlNfVU5TVVBQT1JURUQgKi9dOiAnVGhpcyBicm93c2VyIGlzIG5vdCBzdXBwb3J0ZWQuJyxcclxuICAgICAgICBbXCJjcmVkZW50aWFsLWFscmVhZHktaW4tdXNlXCIgLyogQ1JFREVOVElBTF9BTFJFQURZX0lOX1VTRSAqL106ICdUaGlzIGNyZWRlbnRpYWwgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggYSBkaWZmZXJlbnQgdXNlciBhY2NvdW50LicsXHJcbiAgICAgICAgW1wiY3VzdG9tLXRva2VuLW1pc21hdGNoXCIgLyogQ1JFREVOVElBTF9NSVNNQVRDSCAqL106ICdUaGUgY3VzdG9tIHRva2VuIGNvcnJlc3BvbmRzIHRvIGEgZGlmZmVyZW50IGF1ZGllbmNlLicsXHJcbiAgICAgICAgW1wicmVxdWlyZXMtcmVjZW50LWxvZ2luXCIgLyogQ1JFREVOVElBTF9UT09fT0xEX0xPR0lOX0FHQUlOICovXTogJ1RoaXMgb3BlcmF0aW9uIGlzIHNlbnNpdGl2ZSBhbmQgcmVxdWlyZXMgcmVjZW50IGF1dGhlbnRpY2F0aW9uLiBMb2cgaW4gJyArXHJcbiAgICAgICAgICAgICdhZ2FpbiBiZWZvcmUgcmV0cnlpbmcgdGhpcyByZXF1ZXN0LicsXHJcbiAgICAgICAgW1wiZGVwZW5kZW50LXNkay1pbml0aWFsaXplZC1iZWZvcmUtYXV0aFwiIC8qIERFUEVOREVOVF9TREtfSU5JVF9CRUZPUkVfQVVUSCAqL106ICdBbm90aGVyIEZpcmViYXNlIFNESyB3YXMgaW5pdGlhbGl6ZWQgYW5kIGlzIHRyeWluZyB0byB1c2UgQXV0aCBiZWZvcmUgQXV0aCBpcyAnICtcclxuICAgICAgICAgICAgJ2luaXRpYWxpemVkLiBQbGVhc2UgYmUgc3VyZSB0byBjYWxsIGBpbml0aWFsaXplQXV0aGAgb3IgYGdldEF1dGhgIGJlZm9yZSAnICtcclxuICAgICAgICAgICAgJ3N0YXJ0aW5nIGFueSBvdGhlciBGaXJlYmFzZSBTREsuJyxcclxuICAgICAgICBbXCJkeW5hbWljLWxpbmstbm90LWFjdGl2YXRlZFwiIC8qIERZTkFNSUNfTElOS19OT1RfQUNUSVZBVEVEICovXTogJ1BsZWFzZSBhY3RpdmF0ZSBEeW5hbWljIExpbmtzIGluIHRoZSBGaXJlYmFzZSBDb25zb2xlIGFuZCBhZ3JlZSB0byB0aGUgdGVybXMgYW5kICcgK1xyXG4gICAgICAgICAgICAnY29uZGl0aW9ucy4nLFxyXG4gICAgICAgIFtcImVtYWlsLWNoYW5nZS1uZWVkcy12ZXJpZmljYXRpb25cIiAvKiBFTUFJTF9DSEFOR0VfTkVFRFNfVkVSSUZJQ0FUSU9OICovXTogJ011bHRpLWZhY3RvciB1c2VycyBtdXN0IGFsd2F5cyBoYXZlIGEgdmVyaWZpZWQgZW1haWwuJyxcclxuICAgICAgICBbXCJlbWFpbC1hbHJlYWR5LWluLXVzZVwiIC8qIEVNQUlMX0VYSVNUUyAqL106ICdUaGUgZW1haWwgYWRkcmVzcyBpcyBhbHJlYWR5IGluIHVzZSBieSBhbm90aGVyIGFjY291bnQuJyxcclxuICAgICAgICBbXCJlbXVsYXRvci1jb25maWctZmFpbGVkXCIgLyogRU1VTEFUT1JfQ09ORklHX0ZBSUxFRCAqL106ICdBdXRoIGluc3RhbmNlIGhhcyBhbHJlYWR5IGJlZW4gdXNlZCB0byBtYWtlIGEgbmV0d29yayBjYWxsLiBBdXRoIGNhbiAnICtcclxuICAgICAgICAgICAgJ25vIGxvbmdlciBiZSBjb25maWd1cmVkIHRvIHVzZSB0aGUgZW11bGF0b3IuIFRyeSBjYWxsaW5nICcgK1xyXG4gICAgICAgICAgICAnXCJjb25uZWN0QXV0aEVtdWxhdG9yKClcIiBzb29uZXIuJyxcclxuICAgICAgICBbXCJleHBpcmVkLWFjdGlvbi1jb2RlXCIgLyogRVhQSVJFRF9PT0JfQ09ERSAqL106ICdUaGUgYWN0aW9uIGNvZGUgaGFzIGV4cGlyZWQuJyxcclxuICAgICAgICBbXCJjYW5jZWxsZWQtcG9wdXAtcmVxdWVzdFwiIC8qIEVYUElSRURfUE9QVVBfUkVRVUVTVCAqL106ICdUaGlzIG9wZXJhdGlvbiBoYXMgYmVlbiBjYW5jZWxsZWQgZHVlIHRvIGFub3RoZXIgY29uZmxpY3RpbmcgcG9wdXAgYmVpbmcgb3BlbmVkLicsXHJcbiAgICAgICAgW1wiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqL106ICdBbiBpbnRlcm5hbCBBdXRoRXJyb3IgaGFzIG9jY3VycmVkLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1hcHAtY3JlZGVudGlhbFwiIC8qIElOVkFMSURfQVBQX0NSRURFTlRJQUwgKi9dOiAnVGhlIHBob25lIHZlcmlmaWNhdGlvbiByZXF1ZXN0IGNvbnRhaW5zIGFuIGludmFsaWQgYXBwbGljYXRpb24gdmVyaWZpZXIuJyArXHJcbiAgICAgICAgICAgICcgVGhlIHJlQ0FQVENIQSB0b2tlbiByZXNwb25zZSBpcyBlaXRoZXIgaW52YWxpZCBvciBleHBpcmVkLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1hcHAtaWRcIiAvKiBJTlZBTElEX0FQUF9JRCAqL106ICdUaGUgbW9iaWxlIGFwcCBpZGVudGlmaWVyIGlzIG5vdCByZWdpc3RlZCBmb3IgdGhlIGN1cnJlbnQgcHJvamVjdC4nLFxyXG4gICAgICAgIFtcImludmFsaWQtdXNlci10b2tlblwiIC8qIElOVkFMSURfQVVUSCAqL106IFwiVGhpcyB1c2VyJ3MgY3JlZGVudGlhbCBpc24ndCB2YWxpZCBmb3IgdGhpcyBwcm9qZWN0LiBUaGlzIGNhbiBoYXBwZW4gXCIgK1xyXG4gICAgICAgICAgICBcImlmIHRoZSB1c2VyJ3MgdG9rZW4gaGFzIGJlZW4gdGFtcGVyZWQgd2l0aCwgb3IgaWYgdGhlIHVzZXIgaXNuJ3QgZm9yIFwiICtcclxuICAgICAgICAgICAgJ3RoZSBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIEFQSSBrZXkuJyxcclxuICAgICAgICBbXCJpbnZhbGlkLWF1dGgtZXZlbnRcIiAvKiBJTlZBTElEX0FVVEhfRVZFTlQgKi9dOiAnQW4gaW50ZXJuYWwgQXV0aEVycm9yIGhhcyBvY2N1cnJlZC4nLFxyXG4gICAgICAgIFtcImludmFsaWQtdmVyaWZpY2F0aW9uLWNvZGVcIiAvKiBJTlZBTElEX0NPREUgKi9dOiAnVGhlIFNNUyB2ZXJpZmljYXRpb24gY29kZSB1c2VkIHRvIGNyZWF0ZSB0aGUgcGhvbmUgYXV0aCBjcmVkZW50aWFsIGlzICcgK1xyXG4gICAgICAgICAgICAnaW52YWxpZC4gUGxlYXNlIHJlc2VuZCB0aGUgdmVyaWZpY2F0aW9uIGNvZGUgc21zIGFuZCBiZSBzdXJlIHRvIHVzZSB0aGUgJyArXHJcbiAgICAgICAgICAgICd2ZXJpZmljYXRpb24gY29kZSBwcm92aWRlZCBieSB0aGUgdXNlci4nLFxyXG4gICAgICAgIFtcImludmFsaWQtY29udGludWUtdXJpXCIgLyogSU5WQUxJRF9DT05USU5VRV9VUkkgKi9dOiAnVGhlIGNvbnRpbnVlIFVSTCBwcm92aWRlZCBpbiB0aGUgcmVxdWVzdCBpcyBpbnZhbGlkLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1jb3Jkb3ZhLWNvbmZpZ3VyYXRpb25cIiAvKiBJTlZBTElEX0NPUkRPVkFfQ09ORklHVVJBVElPTiAqL106ICdUaGUgZm9sbG93aW5nIENvcmRvdmEgcGx1Z2lucyBtdXN0IGJlIGluc3RhbGxlZCB0byBlbmFibGUgT0F1dGggc2lnbi1pbjogJyArXHJcbiAgICAgICAgICAgICdjb3Jkb3ZhLXBsdWdpbi1idWlsZGluZm8sIGNvcmRvdmEtdW5pdmVyc2FsLWxpbmtzLXBsdWdpbiwgJyArXHJcbiAgICAgICAgICAgICdjb3Jkb3ZhLXBsdWdpbi1icm93c2VydGFiLCBjb3Jkb3ZhLXBsdWdpbi1pbmFwcGJyb3dzZXIgYW5kICcgK1xyXG4gICAgICAgICAgICAnY29yZG92YS1wbHVnaW4tY3VzdG9tdXJsc2NoZW1lLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1jdXN0b20tdG9rZW5cIiAvKiBJTlZBTElEX0NVU1RPTV9UT0tFTiAqL106ICdUaGUgY3VzdG9tIHRva2VuIGZvcm1hdCBpcyBpbmNvcnJlY3QuIFBsZWFzZSBjaGVjayB0aGUgZG9jdW1lbnRhdGlvbi4nLFxyXG4gICAgICAgIFtcImludmFsaWQtZHluYW1pYy1saW5rLWRvbWFpblwiIC8qIElOVkFMSURfRFlOQU1JQ19MSU5LX0RPTUFJTiAqL106ICdUaGUgcHJvdmlkZWQgZHluYW1pYyBsaW5rIGRvbWFpbiBpcyBub3QgY29uZmlndXJlZCBvciBhdXRob3JpemVkIGZvciB0aGUgY3VycmVudCBwcm9qZWN0LicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1lbWFpbFwiIC8qIElOVkFMSURfRU1BSUwgKi9dOiAnVGhlIGVtYWlsIGFkZHJlc3MgaXMgYmFkbHkgZm9ybWF0dGVkLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1lbXVsYXRvci1zY2hlbWVcIiAvKiBJTlZBTElEX0VNVUxBVE9SX1NDSEVNRSAqL106ICdFbXVsYXRvciBVUkwgbXVzdCBzdGFydCB3aXRoIGEgdmFsaWQgc2NoZW1lIChodHRwOi8vIG9yIGh0dHBzOi8vKS4nLFxyXG4gICAgICAgIFtcImludmFsaWQtYXBpLWtleVwiIC8qIElOVkFMSURfQVBJX0tFWSAqL106ICdZb3VyIEFQSSBrZXkgaXMgaW52YWxpZCwgcGxlYXNlIGNoZWNrIHlvdSBoYXZlIGNvcGllZCBpdCBjb3JyZWN0bHkuJyxcclxuICAgICAgICBbXCJpbnZhbGlkLWNlcnQtaGFzaFwiIC8qIElOVkFMSURfQ0VSVF9IQVNIICovXTogJ1RoZSBTSEEtMSBjZXJ0aWZpY2F0ZSBoYXNoIHByb3ZpZGVkIGlzIGludmFsaWQuJyxcclxuICAgICAgICBbXCJpbnZhbGlkLWNyZWRlbnRpYWxcIiAvKiBJTlZBTElEX0lEUF9SRVNQT05TRSAqL106ICdUaGUgc3VwcGxpZWQgYXV0aCBjcmVkZW50aWFsIGlzIG1hbGZvcm1lZCBvciBoYXMgZXhwaXJlZC4nLFxyXG4gICAgICAgIFtcImludmFsaWQtbWVzc2FnZS1wYXlsb2FkXCIgLyogSU5WQUxJRF9NRVNTQUdFX1BBWUxPQUQgKi9dOiAnVGhlIGVtYWlsIHRlbXBsYXRlIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBhY3Rpb24gY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIGluIGl0cyBtZXNzYWdlLiAnICtcclxuICAgICAgICAgICAgJ1BsZWFzZSBmaXggYnkgZ29pbmcgdG8gdGhlIEF1dGggZW1haWwgdGVtcGxhdGVzIHNlY3Rpb24gaW4gdGhlIEZpcmViYXNlIENvbnNvbGUuJyxcclxuICAgICAgICBbXCJpbnZhbGlkLW11bHRpLWZhY3Rvci1zZXNzaW9uXCIgLyogSU5WQUxJRF9NRkFfU0VTU0lPTiAqL106ICdUaGUgcmVxdWVzdCBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgcHJvb2Ygb2YgZmlyc3QgZmFjdG9yIHN1Y2Nlc3NmdWwgc2lnbi1pbi4nLFxyXG4gICAgICAgIFtcImludmFsaWQtb2F1dGgtcHJvdmlkZXJcIiAvKiBJTlZBTElEX09BVVRIX1BST1ZJREVSICovXTogJ0VtYWlsQXV0aFByb3ZpZGVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgb3BlcmF0aW9uLiBUaGlzIG9wZXJhdGlvbiAnICtcclxuICAgICAgICAgICAgJ29ubHkgc3VwcG9ydHMgT0F1dGggcHJvdmlkZXJzLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1vYXV0aC1jbGllbnQtaWRcIiAvKiBJTlZBTElEX09BVVRIX0NMSUVOVF9JRCAqL106ICdUaGUgT0F1dGggY2xpZW50IElEIHByb3ZpZGVkIGlzIGVpdGhlciBpbnZhbGlkIG9yIGRvZXMgbm90IG1hdGNoIHRoZSAnICtcclxuICAgICAgICAgICAgJ3NwZWNpZmllZCBBUEkga2V5LicsXHJcbiAgICAgICAgW1widW5hdXRob3JpemVkLWRvbWFpblwiIC8qIElOVkFMSURfT1JJR0lOICovXTogJ1RoaXMgZG9tYWluIGlzIG5vdCBhdXRob3JpemVkIGZvciBPQXV0aCBvcGVyYXRpb25zIGZvciB5b3VyIEZpcmViYXNlICcgK1xyXG4gICAgICAgICAgICAncHJvamVjdC4gRWRpdCB0aGUgbGlzdCBvZiBhdXRob3JpemVkIGRvbWFpbnMgZnJvbSB0aGUgRmlyZWJhc2UgY29uc29sZS4nLFxyXG4gICAgICAgIFtcImludmFsaWQtYWN0aW9uLWNvZGVcIiAvKiBJTlZBTElEX09PQl9DT0RFICovXTogJ1RoZSBhY3Rpb24gY29kZSBpcyBpbnZhbGlkLiBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIGNvZGUgaXMgbWFsZm9ybWVkLCAnICtcclxuICAgICAgICAgICAgJ2V4cGlyZWQsIG9yIGhhcyBhbHJlYWR5IGJlZW4gdXNlZC4nLFxyXG4gICAgICAgIFtcIndyb25nLXBhc3N3b3JkXCIgLyogSU5WQUxJRF9QQVNTV09SRCAqL106ICdUaGUgcGFzc3dvcmQgaXMgaW52YWxpZCBvciB0aGUgdXNlciBkb2VzIG5vdCBoYXZlIGEgcGFzc3dvcmQuJyxcclxuICAgICAgICBbXCJpbnZhbGlkLXBlcnNpc3RlbmNlLXR5cGVcIiAvKiBJTlZBTElEX1BFUlNJU1RFTkNFICovXTogJ1RoZSBzcGVjaWZpZWQgcGVyc2lzdGVuY2UgdHlwZSBpcyBpbnZhbGlkLiBJdCBjYW4gb25seSBiZSBsb2NhbCwgc2Vzc2lvbiBvciBub25lLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1waG9uZS1udW1iZXJcIiAvKiBJTlZBTElEX1BIT05FX05VTUJFUiAqL106ICdUaGUgZm9ybWF0IG9mIHRoZSBwaG9uZSBudW1iZXIgcHJvdmlkZWQgaXMgaW5jb3JyZWN0LiBQbGVhc2UgZW50ZXIgdGhlICcgK1xyXG4gICAgICAgICAgICAncGhvbmUgbnVtYmVyIGluIGEgZm9ybWF0IHRoYXQgY2FuIGJlIHBhcnNlZCBpbnRvIEUuMTY0IGZvcm1hdC4gRS4xNjQgJyArXHJcbiAgICAgICAgICAgICdwaG9uZSBudW1iZXJzIGFyZSB3cml0dGVuIGluIHRoZSBmb3JtYXQgWytdW2NvdW50cnkgY29kZV1bc3Vic2NyaWJlciAnICtcclxuICAgICAgICAgICAgJ251bWJlciBpbmNsdWRpbmcgYXJlYSBjb2RlXS4nLFxyXG4gICAgICAgIFtcImludmFsaWQtcHJvdmlkZXItaWRcIiAvKiBJTlZBTElEX1BST1ZJREVSX0lEICovXTogJ1RoZSBzcGVjaWZpZWQgcHJvdmlkZXIgSUQgaXMgaW52YWxpZC4nLFxyXG4gICAgICAgIFtcImludmFsaWQtcmVjaXBpZW50LWVtYWlsXCIgLyogSU5WQUxJRF9SRUNJUElFTlRfRU1BSUwgKi9dOiAnVGhlIGVtYWlsIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBhY3Rpb24gZmFpbGVkIHRvIHNlbmQgYXMgdGhlIHByb3ZpZGVkICcgK1xyXG4gICAgICAgICAgICAncmVjaXBpZW50IGVtYWlsIGFkZHJlc3MgaXMgaW52YWxpZC4nLFxyXG4gICAgICAgIFtcImludmFsaWQtc2VuZGVyXCIgLyogSU5WQUxJRF9TRU5ERVIgKi9dOiAnVGhlIGVtYWlsIHRlbXBsYXRlIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBhY3Rpb24gY29udGFpbnMgYW4gaW52YWxpZCBzZW5kZXIgZW1haWwgb3IgbmFtZS4gJyArXHJcbiAgICAgICAgICAgICdQbGVhc2UgZml4IGJ5IGdvaW5nIHRvIHRoZSBBdXRoIGVtYWlsIHRlbXBsYXRlcyBzZWN0aW9uIGluIHRoZSBGaXJlYmFzZSBDb25zb2xlLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC12ZXJpZmljYXRpb24taWRcIiAvKiBJTlZBTElEX1NFU1NJT05fSU5GTyAqL106ICdUaGUgdmVyaWZpY2F0aW9uIElEIHVzZWQgdG8gY3JlYXRlIHRoZSBwaG9uZSBhdXRoIGNyZWRlbnRpYWwgaXMgaW52YWxpZC4nLFxyXG4gICAgICAgIFtcImludmFsaWQtdGVuYW50LWlkXCIgLyogSU5WQUxJRF9URU5BTlRfSUQgKi9dOiBcIlRoZSBBdXRoIGluc3RhbmNlJ3MgdGVuYW50IElEIGlzIGludmFsaWQuXCIsXHJcbiAgICAgICAgW1wibWlzc2luZy1hbmRyb2lkLXBrZy1uYW1lXCIgLyogTUlTU0lOR19BTkRST0lEX1BBQ0tBR0VfTkFNRSAqL106ICdBbiBBbmRyb2lkIFBhY2thZ2UgTmFtZSBtdXN0IGJlIHByb3ZpZGVkIGlmIHRoZSBBbmRyb2lkIEFwcCBpcyByZXF1aXJlZCB0byBiZSBpbnN0YWxsZWQuJyxcclxuICAgICAgICBbXCJhdXRoLWRvbWFpbi1jb25maWctcmVxdWlyZWRcIiAvKiBNSVNTSU5HX0FVVEhfRE9NQUlOICovXTogJ0JlIHN1cmUgdG8gaW5jbHVkZSBhdXRoRG9tYWluIHdoZW4gY2FsbGluZyBmaXJlYmFzZS5pbml0aWFsaXplQXBwKCksICcgK1xyXG4gICAgICAgICAgICAnYnkgZm9sbG93aW5nIHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhlIEZpcmViYXNlIGNvbnNvbGUuJyxcclxuICAgICAgICBbXCJtaXNzaW5nLWFwcC1jcmVkZW50aWFsXCIgLyogTUlTU0lOR19BUFBfQ1JFREVOVElBTCAqL106ICdUaGUgcGhvbmUgdmVyaWZpY2F0aW9uIHJlcXVlc3QgaXMgbWlzc2luZyBhbiBhcHBsaWNhdGlvbiB2ZXJpZmllciAnICtcclxuICAgICAgICAgICAgJ2Fzc2VydGlvbi4gQSByZUNBUFRDSEEgcmVzcG9uc2UgdG9rZW4gbmVlZHMgdG8gYmUgcHJvdmlkZWQuJyxcclxuICAgICAgICBbXCJtaXNzaW5nLXZlcmlmaWNhdGlvbi1jb2RlXCIgLyogTUlTU0lOR19DT0RFICovXTogJ1RoZSBwaG9uZSBhdXRoIGNyZWRlbnRpYWwgd2FzIGNyZWF0ZWQgd2l0aCBhbiBlbXB0eSBTTVMgdmVyaWZpY2F0aW9uIGNvZGUuJyxcclxuICAgICAgICBbXCJtaXNzaW5nLWNvbnRpbnVlLXVyaVwiIC8qIE1JU1NJTkdfQ09OVElOVUVfVVJJICovXTogJ0EgY29udGludWUgVVJMIG11c3QgYmUgcHJvdmlkZWQgaW4gdGhlIHJlcXVlc3QuJyxcclxuICAgICAgICBbXCJtaXNzaW5nLWlmcmFtZS1zdGFydFwiIC8qIE1JU1NJTkdfSUZSQU1FX1NUQVJUICovXTogJ0FuIGludGVybmFsIEF1dGhFcnJvciBoYXMgb2NjdXJyZWQuJyxcclxuICAgICAgICBbXCJtaXNzaW5nLWlvcy1idW5kbGUtaWRcIiAvKiBNSVNTSU5HX0lPU19CVU5ETEVfSUQgKi9dOiAnQW4gaU9TIEJ1bmRsZSBJRCBtdXN0IGJlIHByb3ZpZGVkIGlmIGFuIEFwcCBTdG9yZSBJRCBpcyBwcm92aWRlZC4nLFxyXG4gICAgICAgIFtcIm1pc3Npbmctb3ItaW52YWxpZC1ub25jZVwiIC8qIE1JU1NJTkdfT1JfSU5WQUxJRF9OT05DRSAqL106ICdUaGUgcmVxdWVzdCBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgbm9uY2UuIFRoaXMgY2FuIG9jY3VyIGlmIHRoZSAnICtcclxuICAgICAgICAgICAgJ1NIQS0yNTYgaGFzaCBvZiB0aGUgcHJvdmlkZWQgcmF3IG5vbmNlIGRvZXMgbm90IG1hdGNoIHRoZSBoYXNoZWQgbm9uY2UgJyArXHJcbiAgICAgICAgICAgICdpbiB0aGUgSUQgdG9rZW4gcGF5bG9hZC4nLFxyXG4gICAgICAgIFtcIm1pc3NpbmctbXVsdGktZmFjdG9yLWluZm9cIiAvKiBNSVNTSU5HX01GQV9JTkZPICovXTogJ05vIHNlY29uZCBmYWN0b3IgaWRlbnRpZmllciBpcyBwcm92aWRlZC4nLFxyXG4gICAgICAgIFtcIm1pc3NpbmctbXVsdGktZmFjdG9yLXNlc3Npb25cIiAvKiBNSVNTSU5HX01GQV9TRVNTSU9OICovXTogJ1RoZSByZXF1ZXN0IGlzIG1pc3NpbmcgcHJvb2Ygb2YgZmlyc3QgZmFjdG9yIHN1Y2Nlc3NmdWwgc2lnbi1pbi4nLFxyXG4gICAgICAgIFtcIm1pc3NpbmctcGhvbmUtbnVtYmVyXCIgLyogTUlTU0lOR19QSE9ORV9OVU1CRVIgKi9dOiAnVG8gc2VuZCB2ZXJpZmljYXRpb24gY29kZXMsIHByb3ZpZGUgYSBwaG9uZSBudW1iZXIgZm9yIHRoZSByZWNpcGllbnQuJyxcclxuICAgICAgICBbXCJtaXNzaW5nLXZlcmlmaWNhdGlvbi1pZFwiIC8qIE1JU1NJTkdfU0VTU0lPTl9JTkZPICovXTogJ1RoZSBwaG9uZSBhdXRoIGNyZWRlbnRpYWwgd2FzIGNyZWF0ZWQgd2l0aCBhbiBlbXB0eSB2ZXJpZmljYXRpb24gSUQuJyxcclxuICAgICAgICBbXCJhcHAtZGVsZXRlZFwiIC8qIE1PRFVMRV9ERVNUUk9ZRUQgKi9dOiAnVGhpcyBpbnN0YW5jZSBvZiBGaXJlYmFzZUFwcCBoYXMgYmVlbiBkZWxldGVkLicsXHJcbiAgICAgICAgW1wibXVsdGktZmFjdG9yLWluZm8tbm90LWZvdW5kXCIgLyogTUZBX0lORk9fTk9UX0ZPVU5EICovXTogJ1RoZSB1c2VyIGRvZXMgbm90IGhhdmUgYSBzZWNvbmQgZmFjdG9yIG1hdGNoaW5nIHRoZSBpZGVudGlmaWVyIHByb3ZpZGVkLicsXHJcbiAgICAgICAgW1wibXVsdGktZmFjdG9yLWF1dGgtcmVxdWlyZWRcIiAvKiBNRkFfUkVRVUlSRUQgKi9dOiAnUHJvb2Ygb2Ygb3duZXJzaGlwIG9mIGEgc2Vjb25kIGZhY3RvciBpcyByZXF1aXJlZCB0byBjb21wbGV0ZSBzaWduLWluLicsXHJcbiAgICAgICAgW1wiYWNjb3VudC1leGlzdHMtd2l0aC1kaWZmZXJlbnQtY3JlZGVudGlhbFwiIC8qIE5FRURfQ09ORklSTUFUSU9OICovXTogJ0FuIGFjY291bnQgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgc2FtZSBlbWFpbCBhZGRyZXNzIGJ1dCBkaWZmZXJlbnQgJyArXHJcbiAgICAgICAgICAgICdzaWduLWluIGNyZWRlbnRpYWxzLiBTaWduIGluIHVzaW5nIGEgcHJvdmlkZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgJyArXHJcbiAgICAgICAgICAgICdlbWFpbCBhZGRyZXNzLicsXHJcbiAgICAgICAgW1wibmV0d29yay1yZXF1ZXN0LWZhaWxlZFwiIC8qIE5FVFdPUktfUkVRVUVTVF9GQUlMRUQgKi9dOiAnQSBuZXR3b3JrIEF1dGhFcnJvciAoc3VjaCBhcyB0aW1lb3V0LCBpbnRlcnJ1cHRlZCBjb25uZWN0aW9uIG9yIHVucmVhY2hhYmxlIGhvc3QpIGhhcyBvY2N1cnJlZC4nLFxyXG4gICAgICAgIFtcIm5vLWF1dGgtZXZlbnRcIiAvKiBOT19BVVRIX0VWRU5UICovXTogJ0FuIGludGVybmFsIEF1dGhFcnJvciBoYXMgb2NjdXJyZWQuJyxcclxuICAgICAgICBbXCJuby1zdWNoLXByb3ZpZGVyXCIgLyogTk9fU1VDSF9QUk9WSURFUiAqL106ICdVc2VyIHdhcyBub3QgbGlua2VkIHRvIGFuIGFjY291bnQgd2l0aCB0aGUgZ2l2ZW4gcHJvdmlkZXIuJyxcclxuICAgICAgICBbXCJudWxsLXVzZXJcIiAvKiBOVUxMX1VTRVIgKi9dOiAnQSBudWxsIHVzZXIgb2JqZWN0IHdhcyBwcm92aWRlZCBhcyB0aGUgYXJndW1lbnQgZm9yIGFuIG9wZXJhdGlvbiB3aGljaCAnICtcclxuICAgICAgICAgICAgJ3JlcXVpcmVzIGEgbm9uLW51bGwgdXNlciBvYmplY3QuJyxcclxuICAgICAgICBbXCJvcGVyYXRpb24tbm90LWFsbG93ZWRcIiAvKiBPUEVSQVRJT05fTk9UX0FMTE9XRUQgKi9dOiAnVGhlIGdpdmVuIHNpZ24taW4gcHJvdmlkZXIgaXMgZGlzYWJsZWQgZm9yIHRoaXMgRmlyZWJhc2UgcHJvamVjdC4gJyArXHJcbiAgICAgICAgICAgICdFbmFibGUgaXQgaW4gdGhlIEZpcmViYXNlIGNvbnNvbGUsIHVuZGVyIHRoZSBzaWduLWluIG1ldGhvZCB0YWIgb2YgdGhlICcgK1xyXG4gICAgICAgICAgICAnQXV0aCBzZWN0aW9uLicsXHJcbiAgICAgICAgW1wib3BlcmF0aW9uLW5vdC1zdXBwb3J0ZWQtaW4tdGhpcy1lbnZpcm9ubWVudFwiIC8qIE9QRVJBVElPTl9OT1RfU1VQUE9SVEVEICovXTogJ1RoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGVudmlyb25tZW50IHRoaXMgYXBwbGljYXRpb24gaXMgJyArXHJcbiAgICAgICAgICAgICdydW5uaW5nIG9uLiBcImxvY2F0aW9uLnByb3RvY29sXCIgbXVzdCBiZSBodHRwLCBodHRwcyBvciBjaHJvbWUtZXh0ZW5zaW9uJyArXHJcbiAgICAgICAgICAgICcgYW5kIHdlYiBzdG9yYWdlIG11c3QgYmUgZW5hYmxlZC4nLFxyXG4gICAgICAgIFtcInBvcHVwLWJsb2NrZWRcIiAvKiBQT1BVUF9CTE9DS0VEICovXTogJ1VuYWJsZSB0byBlc3RhYmxpc2ggYSBjb25uZWN0aW9uIHdpdGggdGhlIHBvcHVwLiBJdCBtYXkgaGF2ZSBiZWVuIGJsb2NrZWQgYnkgdGhlIGJyb3dzZXIuJyxcclxuICAgICAgICBbXCJwb3B1cC1jbG9zZWQtYnktdXNlclwiIC8qIFBPUFVQX0NMT1NFRF9CWV9VU0VSICovXTogJ1RoZSBwb3B1cCBoYXMgYmVlbiBjbG9zZWQgYnkgdGhlIHVzZXIgYmVmb3JlIGZpbmFsaXppbmcgdGhlIG9wZXJhdGlvbi4nLFxyXG4gICAgICAgIFtcInByb3ZpZGVyLWFscmVhZHktbGlua2VkXCIgLyogUFJPVklERVJfQUxSRUFEWV9MSU5LRUQgKi9dOiAnVXNlciBjYW4gb25seSBiZSBsaW5rZWQgdG8gb25lIGlkZW50aXR5IGZvciB0aGUgZ2l2ZW4gcHJvdmlkZXIuJyxcclxuICAgICAgICBbXCJxdW90YS1leGNlZWRlZFwiIC8qIFFVT1RBX0VYQ0VFREVEICovXTogXCJUaGUgcHJvamVjdCdzIHF1b3RhIGZvciB0aGlzIG9wZXJhdGlvbiBoYXMgYmVlbiBleGNlZWRlZC5cIixcclxuICAgICAgICBbXCJyZWRpcmVjdC1jYW5jZWxsZWQtYnktdXNlclwiIC8qIFJFRElSRUNUX0NBTkNFTExFRF9CWV9VU0VSICovXTogJ1RoZSByZWRpcmVjdCBvcGVyYXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkIGJ5IHRoZSB1c2VyIGJlZm9yZSBmaW5hbGl6aW5nLicsXHJcbiAgICAgICAgW1wicmVkaXJlY3Qtb3BlcmF0aW9uLXBlbmRpbmdcIiAvKiBSRURJUkVDVF9PUEVSQVRJT05fUEVORElORyAqL106ICdBIHJlZGlyZWN0IHNpZ24taW4gb3BlcmF0aW9uIGlzIGFscmVhZHkgcGVuZGluZy4nLFxyXG4gICAgICAgIFtcInJlamVjdGVkLWNyZWRlbnRpYWxcIiAvKiBSRUpFQ1RFRF9DUkVERU5USUFMICovXTogJ1RoZSByZXF1ZXN0IGNvbnRhaW5zIG1hbGZvcm1lZCBvciBtaXNtYXRjaGluZyBjcmVkZW50aWFscy4nLFxyXG4gICAgICAgIFtcInNlY29uZC1mYWN0b3ItYWxyZWFkeS1pbi11c2VcIiAvKiBTRUNPTkRfRkFDVE9SX0FMUkVBRFlfRU5ST0xMRUQgKi9dOiAnVGhlIHNlY29uZCBmYWN0b3IgaXMgYWxyZWFkeSBlbnJvbGxlZCBvbiB0aGlzIGFjY291bnQuJyxcclxuICAgICAgICBbXCJtYXhpbXVtLXNlY29uZC1mYWN0b3ItY291bnQtZXhjZWVkZWRcIiAvKiBTRUNPTkRfRkFDVE9SX0xJTUlUX0VYQ0VFREVEICovXTogJ1RoZSBtYXhpbXVtIGFsbG93ZWQgbnVtYmVyIG9mIHNlY29uZCBmYWN0b3JzIG9uIGEgdXNlciBoYXMgYmVlbiBleGNlZWRlZC4nLFxyXG4gICAgICAgIFtcInRlbmFudC1pZC1taXNtYXRjaFwiIC8qIFRFTkFOVF9JRF9NSVNNQVRDSCAqL106IFwiVGhlIHByb3ZpZGVkIHRlbmFudCBJRCBkb2VzIG5vdCBtYXRjaCB0aGUgQXV0aCBpbnN0YW5jZSdzIHRlbmFudCBJRFwiLFxyXG4gICAgICAgIFtcInRpbWVvdXRcIiAvKiBUSU1FT1VUICovXTogJ1RoZSBvcGVyYXRpb24gaGFzIHRpbWVkIG91dC4nLFxyXG4gICAgICAgIFtcInVzZXItdG9rZW4tZXhwaXJlZFwiIC8qIFRPS0VOX0VYUElSRUQgKi9dOiBcIlRoZSB1c2VyJ3MgY3JlZGVudGlhbCBpcyBubyBsb25nZXIgdmFsaWQuIFRoZSB1c2VyIG11c3Qgc2lnbiBpbiBhZ2Fpbi5cIixcclxuICAgICAgICBbXCJ0b28tbWFueS1yZXF1ZXN0c1wiIC8qIFRPT19NQU5ZX0FUVEVNUFRTX1RSWV9MQVRFUiAqL106ICdXZSBoYXZlIGJsb2NrZWQgYWxsIHJlcXVlc3RzIGZyb20gdGhpcyBkZXZpY2UgZHVlIHRvIHVudXN1YWwgYWN0aXZpdHkuICcgK1xyXG4gICAgICAgICAgICAnVHJ5IGFnYWluIGxhdGVyLicsXHJcbiAgICAgICAgW1widW5hdXRob3JpemVkLWNvbnRpbnVlLXVyaVwiIC8qIFVOQVVUSE9SSVpFRF9ET01BSU4gKi9dOiAnVGhlIGRvbWFpbiBvZiB0aGUgY29udGludWUgVVJMIGlzIG5vdCB3aGl0ZWxpc3RlZC4gIFBsZWFzZSB3aGl0ZWxpc3QgJyArXHJcbiAgICAgICAgICAgICd0aGUgZG9tYWluIGluIHRoZSBGaXJlYmFzZSBjb25zb2xlLicsXHJcbiAgICAgICAgW1widW5zdXBwb3J0ZWQtZmlyc3QtZmFjdG9yXCIgLyogVU5TVVBQT1JURURfRklSU1RfRkFDVE9SICovXTogJ0Vucm9sbGluZyBhIHNlY29uZCBmYWN0b3Igb3Igc2lnbmluZyBpbiB3aXRoIGEgbXVsdGktZmFjdG9yIGFjY291bnQgcmVxdWlyZXMgc2lnbi1pbiB3aXRoIGEgc3VwcG9ydGVkIGZpcnN0IGZhY3Rvci4nLFxyXG4gICAgICAgIFtcInVuc3VwcG9ydGVkLXBlcnNpc3RlbmNlLXR5cGVcIiAvKiBVTlNVUFBPUlRFRF9QRVJTSVNURU5DRSAqL106ICdUaGUgY3VycmVudCBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzcGVjaWZpZWQgcGVyc2lzdGVuY2UgdHlwZS4nLFxyXG4gICAgICAgIFtcInVuc3VwcG9ydGVkLXRlbmFudC1vcGVyYXRpb25cIiAvKiBVTlNVUFBPUlRFRF9URU5BTlRfT1BFUkFUSU9OICovXTogJ1RoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gYSBtdWx0aS10ZW5hbnQgY29udGV4dC4nLFxyXG4gICAgICAgIFtcInVudmVyaWZpZWQtZW1haWxcIiAvKiBVTlZFUklGSUVEX0VNQUlMICovXTogJ1RoZSBvcGVyYXRpb24gcmVxdWlyZXMgYSB2ZXJpZmllZCBlbWFpbC4nLFxyXG4gICAgICAgIFtcInVzZXItY2FuY2VsbGVkXCIgLyogVVNFUl9DQU5DRUxMRUQgKi9dOiAnVGhlIHVzZXIgZGlkIG5vdCBncmFudCB5b3VyIGFwcGxpY2F0aW9uIHRoZSBwZXJtaXNzaW9ucyBpdCByZXF1ZXN0ZWQuJyxcclxuICAgICAgICBbXCJ1c2VyLW5vdC1mb3VuZFwiIC8qIFVTRVJfREVMRVRFRCAqL106ICdUaGVyZSBpcyBubyB1c2VyIHJlY29yZCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaWRlbnRpZmllci4gVGhlIHVzZXIgbWF5ICcgK1xyXG4gICAgICAgICAgICAnaGF2ZSBiZWVuIGRlbGV0ZWQuJyxcclxuICAgICAgICBbXCJ1c2VyLWRpc2FibGVkXCIgLyogVVNFUl9ESVNBQkxFRCAqL106ICdUaGUgdXNlciBhY2NvdW50IGhhcyBiZWVuIGRpc2FibGVkIGJ5IGFuIGFkbWluaXN0cmF0b3IuJyxcclxuICAgICAgICBbXCJ1c2VyLW1pc21hdGNoXCIgLyogVVNFUl9NSVNNQVRDSCAqL106ICdUaGUgc3VwcGxpZWQgY3JlZGVudGlhbHMgZG8gbm90IGNvcnJlc3BvbmQgdG8gdGhlIHByZXZpb3VzbHkgc2lnbmVkIGluIHVzZXIuJyxcclxuICAgICAgICBbXCJ1c2VyLXNpZ25lZC1vdXRcIiAvKiBVU0VSX1NJR05FRF9PVVQgKi9dOiAnJyxcclxuICAgICAgICBbXCJ3ZWFrLXBhc3N3b3JkXCIgLyogV0VBS19QQVNTV09SRCAqL106ICdUaGUgcGFzc3dvcmQgbXVzdCBiZSA2IGNoYXJhY3RlcnMgbG9uZyBvciBtb3JlLicsXHJcbiAgICAgICAgW1wid2ViLXN0b3JhZ2UtdW5zdXBwb3J0ZWRcIiAvKiBXRUJfU1RPUkFHRV9VTlNVUFBPUlRFRCAqL106ICdUaGlzIGJyb3dzZXIgaXMgbm90IHN1cHBvcnRlZCBvciAzcmQgcGFydHkgY29va2llcyBhbmQgZGF0YSBtYXkgYmUgZGlzYWJsZWQuJyxcclxuICAgICAgICBbXCJhbHJlYWR5LWluaXRpYWxpemVkXCIgLyogQUxSRUFEWV9JTklUSUFMSVpFRCAqL106ICdpbml0aWFsaXplQXV0aCgpIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIHdpdGggJyArXHJcbiAgICAgICAgICAgICdkaWZmZXJlbnQgb3B0aW9ucy4gVG8gYXZvaWQgdGhpcyBlcnJvciwgY2FsbCBpbml0aWFsaXplQXV0aCgpIHdpdGggdGhlICcgK1xyXG4gICAgICAgICAgICAnc2FtZSBvcHRpb25zIGFzIHdoZW4gaXQgd2FzIG9yaWdpbmFsbHkgY2FsbGVkLCBvciBjYWxsIGdldEF1dGgoKSB0byByZXR1cm4gdGhlJyArXHJcbiAgICAgICAgICAgICcgYWxyZWFkeSBpbml0aWFsaXplZCBpbnN0YW5jZS4nXHJcbiAgICB9O1xyXG59XHJcbmZ1bmN0aW9uIF9wcm9kRXJyb3JNYXAoKSB7XHJcbiAgICAvLyBXZSB3aWxsIGluY2x1ZGUgdGhpcyBvbmUgbWVzc2FnZSBpbiB0aGUgcHJvZCBlcnJvciBtYXAgc2luY2UgYnkgdGhlIHZlcnlcclxuICAgIC8vIG5hdHVyZSBvZiB0aGlzIGVycm9yLCBkZXZlbG9wZXJzIHdpbGwgbmV2ZXIgYmUgYWJsZSB0byBzZWUgdGhlIG1lc3NhZ2VcclxuICAgIC8vIHVzaW5nIHRoZSBkZWJ1Z0Vycm9yTWFwICh3aGljaCBpcyBpbnN0YWxsZWQgZHVyaW5nIGF1dGggaW5pdGlhbGl6YXRpb24pLlxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBbXCJkZXBlbmRlbnQtc2RrLWluaXRpYWxpemVkLWJlZm9yZS1hdXRoXCIgLyogREVQRU5ERU5UX1NES19JTklUX0JFRk9SRV9BVVRIICovXTogJ0Fub3RoZXIgRmlyZWJhc2UgU0RLIHdhcyBpbml0aWFsaXplZCBhbmQgaXMgdHJ5aW5nIHRvIHVzZSBBdXRoIGJlZm9yZSBBdXRoIGlzICcgK1xyXG4gICAgICAgICAgICAnaW5pdGlhbGl6ZWQuIFBsZWFzZSBiZSBzdXJlIHRvIGNhbGwgYGluaXRpYWxpemVBdXRoYCBvciBgZ2V0QXV0aGAgYmVmb3JlICcgK1xyXG4gICAgICAgICAgICAnc3RhcnRpbmcgYW55IG90aGVyIEZpcmViYXNlIFNESy4nXHJcbiAgICB9O1xyXG59XHJcbi8qKlxyXG4gKiBBIHZlcmJvc2UgZXJyb3IgbWFwIHdpdGggZGV0YWlsZWQgZGVzY3JpcHRpb25zIGZvciBtb3N0IGVycm9yIGNvZGVzLlxyXG4gKlxyXG4gKiBTZWUgZGlzY3Vzc2lvbiBhdCB7QGxpbmsgQXV0aEVycm9yTWFwfVxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jb25zdCBkZWJ1Z0Vycm9yTWFwID0gX2RlYnVnRXJyb3JNYXA7XHJcbi8qKlxyXG4gKiBBIG1pbmltYWwgZXJyb3IgbWFwIHdpdGggYWxsIHZlcmJvc2UgZXJyb3IgbWVzc2FnZXMgc3RyaXBwZWQuXHJcbiAqXHJcbiAqIFNlZSBkaXNjdXNzaW9uIGF0IHtAbGluayBBdXRoRXJyb3JNYXB9XHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNvbnN0IHByb2RFcnJvck1hcCA9IF9wcm9kRXJyb3JNYXA7XHJcbmNvbnN0IF9ERUZBVUxUX0FVVEhfRVJST1JfRkFDVE9SWSA9IG5ldyBFcnJvckZhY3RvcnkoJ2F1dGgnLCAnRmlyZWJhc2UnLCBfcHJvZEVycm9yTWFwKCkpO1xyXG4vKipcclxuICogQSBtYXAgb2YgcG90ZW50aWFsIGBBdXRoYCBlcnJvciBjb2RlcywgZm9yIGVhc2llciBjb21wYXJpc29uIHdpdGggZXJyb3JzXHJcbiAqIHRocm93biBieSB0aGUgU0RLLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBOb3RlIHRoYXQgeW91IGNhbid0IHRyZWUtc2hha2UgaW5kaXZpZHVhbCBrZXlzXHJcbiAqIGluIHRoZSBtYXAsIHNvIGJ5IHVzaW5nIHRoZSBtYXAgeW91IG1pZ2h0IHN1YnN0YW50aWFsbHkgaW5jcmVhc2UgeW91clxyXG4gKiBidW5kbGUgc2l6ZS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY29uc3QgQVVUSF9FUlJPUl9DT0RFU19NQVBfRE9fTk9UX1VTRV9JTlRFUk5BTExZID0ge1xyXG4gICAgQURNSU5fT05MWV9PUEVSQVRJT046ICdhdXRoL2FkbWluLXJlc3RyaWN0ZWQtb3BlcmF0aW9uJyxcclxuICAgIEFSR1VNRU5UX0VSUk9SOiAnYXV0aC9hcmd1bWVudC1lcnJvcicsXHJcbiAgICBBUFBfTk9UX0FVVEhPUklaRUQ6ICdhdXRoL2FwcC1ub3QtYXV0aG9yaXplZCcsXHJcbiAgICBBUFBfTk9UX0lOU1RBTExFRDogJ2F1dGgvYXBwLW5vdC1pbnN0YWxsZWQnLFxyXG4gICAgQ0FQVENIQV9DSEVDS19GQUlMRUQ6ICdhdXRoL2NhcHRjaGEtY2hlY2stZmFpbGVkJyxcclxuICAgIENPREVfRVhQSVJFRDogJ2F1dGgvY29kZS1leHBpcmVkJyxcclxuICAgIENPUkRPVkFfTk9UX1JFQURZOiAnYXV0aC9jb3Jkb3ZhLW5vdC1yZWFkeScsXHJcbiAgICBDT1JTX1VOU1VQUE9SVEVEOiAnYXV0aC9jb3JzLXVuc3VwcG9ydGVkJyxcclxuICAgIENSRURFTlRJQUxfQUxSRUFEWV9JTl9VU0U6ICdhdXRoL2NyZWRlbnRpYWwtYWxyZWFkeS1pbi11c2UnLFxyXG4gICAgQ1JFREVOVElBTF9NSVNNQVRDSDogJ2F1dGgvY3VzdG9tLXRva2VuLW1pc21hdGNoJyxcclxuICAgIENSRURFTlRJQUxfVE9PX09MRF9MT0dJTl9BR0FJTjogJ2F1dGgvcmVxdWlyZXMtcmVjZW50LWxvZ2luJyxcclxuICAgIERFUEVOREVOVF9TREtfSU5JVF9CRUZPUkVfQVVUSDogJ2F1dGgvZGVwZW5kZW50LXNkay1pbml0aWFsaXplZC1iZWZvcmUtYXV0aCcsXHJcbiAgICBEWU5BTUlDX0xJTktfTk9UX0FDVElWQVRFRDogJ2F1dGgvZHluYW1pYy1saW5rLW5vdC1hY3RpdmF0ZWQnLFxyXG4gICAgRU1BSUxfQ0hBTkdFX05FRURTX1ZFUklGSUNBVElPTjogJ2F1dGgvZW1haWwtY2hhbmdlLW5lZWRzLXZlcmlmaWNhdGlvbicsXHJcbiAgICBFTUFJTF9FWElTVFM6ICdhdXRoL2VtYWlsLWFscmVhZHktaW4tdXNlJyxcclxuICAgIEVNVUxBVE9SX0NPTkZJR19GQUlMRUQ6ICdhdXRoL2VtdWxhdG9yLWNvbmZpZy1mYWlsZWQnLFxyXG4gICAgRVhQSVJFRF9PT0JfQ09ERTogJ2F1dGgvZXhwaXJlZC1hY3Rpb24tY29kZScsXHJcbiAgICBFWFBJUkVEX1BPUFVQX1JFUVVFU1Q6ICdhdXRoL2NhbmNlbGxlZC1wb3B1cC1yZXF1ZXN0JyxcclxuICAgIElOVEVSTkFMX0VSUk9SOiAnYXV0aC9pbnRlcm5hbC1lcnJvcicsXHJcbiAgICBJTlZBTElEX0FQSV9LRVk6ICdhdXRoL2ludmFsaWQtYXBpLWtleScsXHJcbiAgICBJTlZBTElEX0FQUF9DUkVERU5USUFMOiAnYXV0aC9pbnZhbGlkLWFwcC1jcmVkZW50aWFsJyxcclxuICAgIElOVkFMSURfQVBQX0lEOiAnYXV0aC9pbnZhbGlkLWFwcC1pZCcsXHJcbiAgICBJTlZBTElEX0FVVEg6ICdhdXRoL2ludmFsaWQtdXNlci10b2tlbicsXHJcbiAgICBJTlZBTElEX0FVVEhfRVZFTlQ6ICdhdXRoL2ludmFsaWQtYXV0aC1ldmVudCcsXHJcbiAgICBJTlZBTElEX0NFUlRfSEFTSDogJ2F1dGgvaW52YWxpZC1jZXJ0LWhhc2gnLFxyXG4gICAgSU5WQUxJRF9DT0RFOiAnYXV0aC9pbnZhbGlkLXZlcmlmaWNhdGlvbi1jb2RlJyxcclxuICAgIElOVkFMSURfQ09OVElOVUVfVVJJOiAnYXV0aC9pbnZhbGlkLWNvbnRpbnVlLXVyaScsXHJcbiAgICBJTlZBTElEX0NPUkRPVkFfQ09ORklHVVJBVElPTjogJ2F1dGgvaW52YWxpZC1jb3Jkb3ZhLWNvbmZpZ3VyYXRpb24nLFxyXG4gICAgSU5WQUxJRF9DVVNUT01fVE9LRU46ICdhdXRoL2ludmFsaWQtY3VzdG9tLXRva2VuJyxcclxuICAgIElOVkFMSURfRFlOQU1JQ19MSU5LX0RPTUFJTjogJ2F1dGgvaW52YWxpZC1keW5hbWljLWxpbmstZG9tYWluJyxcclxuICAgIElOVkFMSURfRU1BSUw6ICdhdXRoL2ludmFsaWQtZW1haWwnLFxyXG4gICAgSU5WQUxJRF9FTVVMQVRPUl9TQ0hFTUU6ICdhdXRoL2ludmFsaWQtZW11bGF0b3Itc2NoZW1lJyxcclxuICAgIElOVkFMSURfSURQX1JFU1BPTlNFOiAnYXV0aC9pbnZhbGlkLWNyZWRlbnRpYWwnLFxyXG4gICAgSU5WQUxJRF9NRVNTQUdFX1BBWUxPQUQ6ICdhdXRoL2ludmFsaWQtbWVzc2FnZS1wYXlsb2FkJyxcclxuICAgIElOVkFMSURfTUZBX1NFU1NJT046ICdhdXRoL2ludmFsaWQtbXVsdGktZmFjdG9yLXNlc3Npb24nLFxyXG4gICAgSU5WQUxJRF9PQVVUSF9DTElFTlRfSUQ6ICdhdXRoL2ludmFsaWQtb2F1dGgtY2xpZW50LWlkJyxcclxuICAgIElOVkFMSURfT0FVVEhfUFJPVklERVI6ICdhdXRoL2ludmFsaWQtb2F1dGgtcHJvdmlkZXInLFxyXG4gICAgSU5WQUxJRF9PT0JfQ09ERTogJ2F1dGgvaW52YWxpZC1hY3Rpb24tY29kZScsXHJcbiAgICBJTlZBTElEX09SSUdJTjogJ2F1dGgvdW5hdXRob3JpemVkLWRvbWFpbicsXHJcbiAgICBJTlZBTElEX1BBU1NXT1JEOiAnYXV0aC93cm9uZy1wYXNzd29yZCcsXHJcbiAgICBJTlZBTElEX1BFUlNJU1RFTkNFOiAnYXV0aC9pbnZhbGlkLXBlcnNpc3RlbmNlLXR5cGUnLFxyXG4gICAgSU5WQUxJRF9QSE9ORV9OVU1CRVI6ICdhdXRoL2ludmFsaWQtcGhvbmUtbnVtYmVyJyxcclxuICAgIElOVkFMSURfUFJPVklERVJfSUQ6ICdhdXRoL2ludmFsaWQtcHJvdmlkZXItaWQnLFxyXG4gICAgSU5WQUxJRF9SRUNJUElFTlRfRU1BSUw6ICdhdXRoL2ludmFsaWQtcmVjaXBpZW50LWVtYWlsJyxcclxuICAgIElOVkFMSURfU0VOREVSOiAnYXV0aC9pbnZhbGlkLXNlbmRlcicsXHJcbiAgICBJTlZBTElEX1NFU1NJT05fSU5GTzogJ2F1dGgvaW52YWxpZC12ZXJpZmljYXRpb24taWQnLFxyXG4gICAgSU5WQUxJRF9URU5BTlRfSUQ6ICdhdXRoL2ludmFsaWQtdGVuYW50LWlkJyxcclxuICAgIE1GQV9JTkZPX05PVF9GT1VORDogJ2F1dGgvbXVsdGktZmFjdG9yLWluZm8tbm90LWZvdW5kJyxcclxuICAgIE1GQV9SRVFVSVJFRDogJ2F1dGgvbXVsdGktZmFjdG9yLWF1dGgtcmVxdWlyZWQnLFxyXG4gICAgTUlTU0lOR19BTkRST0lEX1BBQ0tBR0VfTkFNRTogJ2F1dGgvbWlzc2luZy1hbmRyb2lkLXBrZy1uYW1lJyxcclxuICAgIE1JU1NJTkdfQVBQX0NSRURFTlRJQUw6ICdhdXRoL21pc3NpbmctYXBwLWNyZWRlbnRpYWwnLFxyXG4gICAgTUlTU0lOR19BVVRIX0RPTUFJTjogJ2F1dGgvYXV0aC1kb21haW4tY29uZmlnLXJlcXVpcmVkJyxcclxuICAgIE1JU1NJTkdfQ09ERTogJ2F1dGgvbWlzc2luZy12ZXJpZmljYXRpb24tY29kZScsXHJcbiAgICBNSVNTSU5HX0NPTlRJTlVFX1VSSTogJ2F1dGgvbWlzc2luZy1jb250aW51ZS11cmknLFxyXG4gICAgTUlTU0lOR19JRlJBTUVfU1RBUlQ6ICdhdXRoL21pc3NpbmctaWZyYW1lLXN0YXJ0JyxcclxuICAgIE1JU1NJTkdfSU9TX0JVTkRMRV9JRDogJ2F1dGgvbWlzc2luZy1pb3MtYnVuZGxlLWlkJyxcclxuICAgIE1JU1NJTkdfT1JfSU5WQUxJRF9OT05DRTogJ2F1dGgvbWlzc2luZy1vci1pbnZhbGlkLW5vbmNlJyxcclxuICAgIE1JU1NJTkdfTUZBX0lORk86ICdhdXRoL21pc3NpbmctbXVsdGktZmFjdG9yLWluZm8nLFxyXG4gICAgTUlTU0lOR19NRkFfU0VTU0lPTjogJ2F1dGgvbWlzc2luZy1tdWx0aS1mYWN0b3Itc2Vzc2lvbicsXHJcbiAgICBNSVNTSU5HX1BIT05FX05VTUJFUjogJ2F1dGgvbWlzc2luZy1waG9uZS1udW1iZXInLFxyXG4gICAgTUlTU0lOR19TRVNTSU9OX0lORk86ICdhdXRoL21pc3NpbmctdmVyaWZpY2F0aW9uLWlkJyxcclxuICAgIE1PRFVMRV9ERVNUUk9ZRUQ6ICdhdXRoL2FwcC1kZWxldGVkJyxcclxuICAgIE5FRURfQ09ORklSTUFUSU9OOiAnYXV0aC9hY2NvdW50LWV4aXN0cy13aXRoLWRpZmZlcmVudC1jcmVkZW50aWFsJyxcclxuICAgIE5FVFdPUktfUkVRVUVTVF9GQUlMRUQ6ICdhdXRoL25ldHdvcmstcmVxdWVzdC1mYWlsZWQnLFxyXG4gICAgTlVMTF9VU0VSOiAnYXV0aC9udWxsLXVzZXInLFxyXG4gICAgTk9fQVVUSF9FVkVOVDogJ2F1dGgvbm8tYXV0aC1ldmVudCcsXHJcbiAgICBOT19TVUNIX1BST1ZJREVSOiAnYXV0aC9uby1zdWNoLXByb3ZpZGVyJyxcclxuICAgIE9QRVJBVElPTl9OT1RfQUxMT1dFRDogJ2F1dGgvb3BlcmF0aW9uLW5vdC1hbGxvd2VkJyxcclxuICAgIE9QRVJBVElPTl9OT1RfU1VQUE9SVEVEOiAnYXV0aC9vcGVyYXRpb24tbm90LXN1cHBvcnRlZC1pbi10aGlzLWVudmlyb25tZW50JyxcclxuICAgIFBPUFVQX0JMT0NLRUQ6ICdhdXRoL3BvcHVwLWJsb2NrZWQnLFxyXG4gICAgUE9QVVBfQ0xPU0VEX0JZX1VTRVI6ICdhdXRoL3BvcHVwLWNsb3NlZC1ieS11c2VyJyxcclxuICAgIFBST1ZJREVSX0FMUkVBRFlfTElOS0VEOiAnYXV0aC9wcm92aWRlci1hbHJlYWR5LWxpbmtlZCcsXHJcbiAgICBRVU9UQV9FWENFRURFRDogJ2F1dGgvcXVvdGEtZXhjZWVkZWQnLFxyXG4gICAgUkVESVJFQ1RfQ0FOQ0VMTEVEX0JZX1VTRVI6ICdhdXRoL3JlZGlyZWN0LWNhbmNlbGxlZC1ieS11c2VyJyxcclxuICAgIFJFRElSRUNUX09QRVJBVElPTl9QRU5ESU5HOiAnYXV0aC9yZWRpcmVjdC1vcGVyYXRpb24tcGVuZGluZycsXHJcbiAgICBSRUpFQ1RFRF9DUkVERU5USUFMOiAnYXV0aC9yZWplY3RlZC1jcmVkZW50aWFsJyxcclxuICAgIFNFQ09ORF9GQUNUT1JfQUxSRUFEWV9FTlJPTExFRDogJ2F1dGgvc2Vjb25kLWZhY3Rvci1hbHJlYWR5LWluLXVzZScsXHJcbiAgICBTRUNPTkRfRkFDVE9SX0xJTUlUX0VYQ0VFREVEOiAnYXV0aC9tYXhpbXVtLXNlY29uZC1mYWN0b3ItY291bnQtZXhjZWVkZWQnLFxyXG4gICAgVEVOQU5UX0lEX01JU01BVENIOiAnYXV0aC90ZW5hbnQtaWQtbWlzbWF0Y2gnLFxyXG4gICAgVElNRU9VVDogJ2F1dGgvdGltZW91dCcsXHJcbiAgICBUT0tFTl9FWFBJUkVEOiAnYXV0aC91c2VyLXRva2VuLWV4cGlyZWQnLFxyXG4gICAgVE9PX01BTllfQVRURU1QVFNfVFJZX0xBVEVSOiAnYXV0aC90b28tbWFueS1yZXF1ZXN0cycsXHJcbiAgICBVTkFVVEhPUklaRURfRE9NQUlOOiAnYXV0aC91bmF1dGhvcml6ZWQtY29udGludWUtdXJpJyxcclxuICAgIFVOU1VQUE9SVEVEX0ZJUlNUX0ZBQ1RPUjogJ2F1dGgvdW5zdXBwb3J0ZWQtZmlyc3QtZmFjdG9yJyxcclxuICAgIFVOU1VQUE9SVEVEX1BFUlNJU1RFTkNFOiAnYXV0aC91bnN1cHBvcnRlZC1wZXJzaXN0ZW5jZS10eXBlJyxcclxuICAgIFVOU1VQUE9SVEVEX1RFTkFOVF9PUEVSQVRJT046ICdhdXRoL3Vuc3VwcG9ydGVkLXRlbmFudC1vcGVyYXRpb24nLFxyXG4gICAgVU5WRVJJRklFRF9FTUFJTDogJ2F1dGgvdW52ZXJpZmllZC1lbWFpbCcsXHJcbiAgICBVU0VSX0NBTkNFTExFRDogJ2F1dGgvdXNlci1jYW5jZWxsZWQnLFxyXG4gICAgVVNFUl9ERUxFVEVEOiAnYXV0aC91c2VyLW5vdC1mb3VuZCcsXHJcbiAgICBVU0VSX0RJU0FCTEVEOiAnYXV0aC91c2VyLWRpc2FibGVkJyxcclxuICAgIFVTRVJfTUlTTUFUQ0g6ICdhdXRoL3VzZXItbWlzbWF0Y2gnLFxyXG4gICAgVVNFUl9TSUdORURfT1VUOiAnYXV0aC91c2VyLXNpZ25lZC1vdXQnLFxyXG4gICAgV0VBS19QQVNTV09SRDogJ2F1dGgvd2Vhay1wYXNzd29yZCcsXHJcbiAgICBXRUJfU1RPUkFHRV9VTlNVUFBPUlRFRDogJ2F1dGgvd2ViLXN0b3JhZ2UtdW5zdXBwb3J0ZWQnLFxyXG4gICAgQUxSRUFEWV9JTklUSUFMSVpFRDogJ2F1dGgvYWxyZWFkeS1pbml0aWFsaXplZCdcclxufTtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgbG9nQ2xpZW50ID0gbmV3IExvZ2dlcignQGZpcmViYXNlL2F1dGgnKTtcclxuZnVuY3Rpb24gX2xvZ0Vycm9yKG1zZywgLi4uYXJncykge1xyXG4gICAgaWYgKGxvZ0NsaWVudC5sb2dMZXZlbCA8PSBMb2dMZXZlbC5FUlJPUikge1xyXG4gICAgICAgIGxvZ0NsaWVudC5lcnJvcihgQXV0aCAoJHtTREtfVkVSU0lPTn0pOiAke21zZ31gLCAuLi5hcmdzKTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBfZmFpbChhdXRoT3JDb2RlLCAuLi5yZXN0KSB7XHJcbiAgICB0aHJvdyBjcmVhdGVFcnJvckludGVybmFsKGF1dGhPckNvZGUsIC4uLnJlc3QpO1xyXG59XHJcbmZ1bmN0aW9uIF9jcmVhdGVFcnJvcihhdXRoT3JDb2RlLCAuLi5yZXN0KSB7XHJcbiAgICByZXR1cm4gY3JlYXRlRXJyb3JJbnRlcm5hbChhdXRoT3JDb2RlLCAuLi5yZXN0KTtcclxufVxyXG5mdW5jdGlvbiBfZXJyb3JXaXRoQ3VzdG9tTWVzc2FnZShhdXRoLCBjb2RlLCBtZXNzYWdlKSB7XHJcbiAgICBjb25zdCBlcnJvck1hcCA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJvZEVycm9yTWFwKCkpLCB7IFtjb2RlXTogbWVzc2FnZSB9KTtcclxuICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgRXJyb3JGYWN0b3J5KCdhdXRoJywgJ0ZpcmViYXNlJywgZXJyb3JNYXApO1xyXG4gICAgcmV0dXJuIGZhY3RvcnkuY3JlYXRlKGNvZGUsIHtcclxuICAgICAgICBhcHBOYW1lOiBhdXRoLm5hbWUsXHJcbiAgICB9KTtcclxufVxyXG5mdW5jdGlvbiBfYXNzZXJ0SW5zdGFuY2VPZihhdXRoLCBvYmplY3QsIGluc3RhbmNlKSB7XHJcbiAgICBjb25zdCBjb25zdHJ1Y3Rvckluc3RhbmNlID0gaW5zdGFuY2U7XHJcbiAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBjb25zdHJ1Y3Rvckluc3RhbmNlKSkge1xyXG4gICAgICAgIGlmIChjb25zdHJ1Y3Rvckluc3RhbmNlLm5hbWUgIT09IG9iamVjdC5jb25zdHJ1Y3Rvci5uYW1lKSB7XHJcbiAgICAgICAgICAgIF9mYWlsKGF1dGgsIFwiYXJndW1lbnQtZXJyb3JcIiAvKiBBUkdVTUVOVF9FUlJPUiAqLyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IF9lcnJvcldpdGhDdXN0b21NZXNzYWdlKGF1dGgsIFwiYXJndW1lbnQtZXJyb3JcIiAvKiBBUkdVTUVOVF9FUlJPUiAqLywgYFR5cGUgb2YgJHtvYmplY3QuY29uc3RydWN0b3IubmFtZX0gZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgaW5zdGFuY2UuYCArXHJcbiAgICAgICAgICAgIGBEaWQgeW91IHBhc3MgYSByZWZlcmVuY2UgZnJvbSBhIGRpZmZlcmVudCBBdXRoIFNESz9gKTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBjcmVhdGVFcnJvckludGVybmFsKGF1dGhPckNvZGUsIC4uLnJlc3QpIHtcclxuICAgIGlmICh0eXBlb2YgYXV0aE9yQ29kZSAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICBjb25zdCBjb2RlID0gcmVzdFswXTtcclxuICAgICAgICBjb25zdCBmdWxsUGFyYW1zID0gWy4uLnJlc3Quc2xpY2UoMSldO1xyXG4gICAgICAgIGlmIChmdWxsUGFyYW1zWzBdKSB7XHJcbiAgICAgICAgICAgIGZ1bGxQYXJhbXNbMF0uYXBwTmFtZSA9IGF1dGhPckNvZGUubmFtZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGF1dGhPckNvZGUuX2Vycm9yRmFjdG9yeS5jcmVhdGUoY29kZSwgLi4uZnVsbFBhcmFtcyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX0RFRkFVTFRfQVVUSF9FUlJPUl9GQUNUT1JZLmNyZWF0ZShhdXRoT3JDb2RlLCAuLi5yZXN0KTtcclxufVxyXG5mdW5jdGlvbiBfYXNzZXJ0KGFzc2VydGlvbiwgYXV0aE9yQ29kZSwgLi4ucmVzdCkge1xyXG4gICAgaWYgKCFhc3NlcnRpb24pIHtcclxuICAgICAgICB0aHJvdyBjcmVhdGVFcnJvckludGVybmFsKGF1dGhPckNvZGUsIC4uLnJlc3QpO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBVbmNvbmRpdGlvbmFsbHkgZmFpbHMsIHRocm93aW5nIGFuIGludGVybmFsIGVycm9yIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UuXHJcbiAqXHJcbiAqIEBwYXJhbSBmYWlsdXJlIHR5cGUgb2YgZmFpbHVyZSBlbmNvdW50ZXJlZFxyXG4gKiBAdGhyb3dzIEVycm9yXHJcbiAqL1xyXG5mdW5jdGlvbiBkZWJ1Z0ZhaWwoZmFpbHVyZSkge1xyXG4gICAgLy8gTG9nIHRoZSBmYWlsdXJlIGluIGFkZGl0aW9uIHRvIHRocm93IGFuIGV4Y2VwdGlvbiwganVzdCBpbiBjYXNlIHRoZVxyXG4gICAgLy8gZXhjZXB0aW9uIGlzIHN3YWxsb3dlZC5cclxuICAgIGNvbnN0IG1lc3NhZ2UgPSBgSU5URVJOQUwgQVNTRVJUSU9OIEZBSUxFRDogYCArIGZhaWx1cmU7XHJcbiAgICBfbG9nRXJyb3IobWVzc2FnZSk7XHJcbiAgICAvLyBOT1RFOiBXZSBkb24ndCB1c2UgRmlyZWJhc2VFcnJvciBoZXJlIGJlY2F1c2UgdGhlc2UgYXJlIGludGVybmFsIGZhaWx1cmVzXHJcbiAgICAvLyB0aGF0IGNhbm5vdCBiZSBoYW5kbGVkIGJ5IHRoZSB1c2VyLiAoQWxzbyBpdCB3b3VsZCBjcmVhdGUgYSBjaXJjdWxhclxyXG4gICAgLy8gZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZSBlcnJvciBhbmQgYXNzZXJ0IG1vZHVsZXMgd2hpY2ggZG9lc24ndCB3b3JrLilcclxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcclxufVxyXG4vKipcclxuICogRmFpbHMgaWYgdGhlIGdpdmVuIGFzc2VydGlvbiBjb25kaXRpb24gaXMgZmFsc2UsIHRocm93aW5nIGFuIEVycm9yIHdpdGggdGhlXHJcbiAqIGdpdmVuIG1lc3NhZ2UgaWYgaXQgZGlkLlxyXG4gKlxyXG4gKiBAcGFyYW0gYXNzZXJ0aW9uXHJcbiAqIEBwYXJhbSBtZXNzYWdlXHJcbiAqL1xyXG5mdW5jdGlvbiBkZWJ1Z0Fzc2VydChhc3NlcnRpb24sIG1lc3NhZ2UpIHtcclxuICAgIGlmICghYXNzZXJ0aW9uKSB7XHJcbiAgICAgICAgZGVidWdGYWlsKG1lc3NhZ2UpO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IGluc3RhbmNlQ2FjaGUgPSBuZXcgTWFwKCk7XHJcbmZ1bmN0aW9uIF9nZXRJbnN0YW5jZShjbHMpIHtcclxuICAgIGRlYnVnQXNzZXJ0KGNscyBpbnN0YW5jZW9mIEZ1bmN0aW9uLCAnRXhwZWN0ZWQgYSBjbGFzcyBkZWZpbml0aW9uJyk7XHJcbiAgICBsZXQgaW5zdGFuY2UgPSBpbnN0YW5jZUNhY2hlLmdldChjbHMpO1xyXG4gICAgaWYgKGluc3RhbmNlKSB7XHJcbiAgICAgICAgZGVidWdBc3NlcnQoaW5zdGFuY2UgaW5zdGFuY2VvZiBjbHMsICdJbnN0YW5jZSBzdG9yZWQgaW4gY2FjaGUgbWlzbWF0Y2hlZCB3aXRoIGNsYXNzJyk7XHJcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xyXG4gICAgfVxyXG4gICAgaW5zdGFuY2UgPSBuZXcgY2xzKCk7XHJcbiAgICBpbnN0YW5jZUNhY2hlLnNldChjbHMsIGluc3RhbmNlKTtcclxuICAgIHJldHVybiBpbnN0YW5jZTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogSW5pdGlhbGl6ZXMgYW4ge0BsaW5rIEF1dGh9IGluc3RhbmNlIHdpdGggZmluZS1ncmFpbmVkIGNvbnRyb2wgb3ZlclxyXG4gKiB7QGxpbmsgRGVwZW5kZW5jaWVzfS5cclxuICpcclxuICogQHJlbWFya3NcclxuICpcclxuICogVGhpcyBmdW5jdGlvbiBhbGxvd3MgbW9yZSBjb250cm9sIG92ZXIgdGhlIHtAbGluayBBdXRofSBpbnN0YW5jZSB0aGFuXHJcbiAqIHtAbGluayBnZXRBdXRofS4gYGdldEF1dGhgIHVzZXMgcGxhdGZvcm0tc3BlY2lmaWMgZGVmYXVsdHMgdG8gc3VwcGx5XHJcbiAqIHRoZSB7QGxpbmsgRGVwZW5kZW5jaWVzfS4gSW4gZ2VuZXJhbCwgYGdldEF1dGhgIGlzIHRoZSBlYXNpZXN0IHdheSB0b1xyXG4gKiBpbml0aWFsaXplIEF1dGggYW5kIHdvcmtzIGZvciBtb3N0IHVzZSBjYXNlcy4gVXNlIGBpbml0aWFsaXplQXV0aGAgaWYgeW91XHJcbiAqIG5lZWQgY29udHJvbCBvdmVyIHdoaWNoIHBlcnNpc3RlbmNlIGxheWVyIGlzIHVzZWQsIG9yIHRvIG1pbmltaXplIGJ1bmRsZVxyXG4gKiBzaXplIGlmIHlvdSdyZSBub3QgdXNpbmcgZWl0aGVyIGBzaWduSW5XaXRoUG9wdXBgIG9yIGBzaWduSW5XaXRoUmVkaXJlY3RgLlxyXG4gKlxyXG4gKiBGb3IgZXhhbXBsZSwgaWYgeW91ciBhcHAgb25seSB1c2VzIGFub255bW91cyBhY2NvdW50cyBhbmQgeW91IG9ubHkgd2FudFxyXG4gKiBhY2NvdW50cyBzYXZlZCBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbiwgaW5pdGlhbGl6ZSBgQXV0aGAgd2l0aDpcclxuICpcclxuICogYGBganNcclxuICogY29uc3QgYXV0aCA9IGluaXRpYWxpemVBdXRoKGFwcCwge1xyXG4gKiAgIHBlcnNpc3RlbmNlOiBicm93c2VyU2Vzc2lvblBlcnNpc3RlbmNlLFxyXG4gKiAgIHBvcHVwUmVkaXJlY3RSZXNvbHZlcjogdW5kZWZpbmVkLFxyXG4gKiB9KTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmZ1bmN0aW9uIGluaXRpYWxpemVBdXRoKGFwcCwgZGVwcykge1xyXG4gICAgY29uc3QgcHJvdmlkZXIgPSBfZ2V0UHJvdmlkZXIoYXBwLCAnYXV0aCcpO1xyXG4gICAgaWYgKHByb3ZpZGVyLmlzSW5pdGlhbGl6ZWQoKSkge1xyXG4gICAgICAgIGNvbnN0IGF1dGggPSBwcm92aWRlci5nZXRJbW1lZGlhdGUoKTtcclxuICAgICAgICBjb25zdCBpbml0aWFsT3B0aW9ucyA9IHByb3ZpZGVyLmdldE9wdGlvbnMoKTtcclxuICAgICAgICBpZiAoZGVlcEVxdWFsKGluaXRpYWxPcHRpb25zLCBkZXBzICE9PSBudWxsICYmIGRlcHMgIT09IHZvaWQgMCA/IGRlcHMgOiB7fSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGF1dGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBfZmFpbChhdXRoLCBcImFscmVhZHktaW5pdGlhbGl6ZWRcIiAvKiBBTFJFQURZX0lOSVRJQUxJWkVEICovKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdCBhdXRoID0gcHJvdmlkZXIuaW5pdGlhbGl6ZSh7IG9wdGlvbnM6IGRlcHMgfSk7XHJcbiAgICByZXR1cm4gYXV0aDtcclxufVxyXG5mdW5jdGlvbiBfaW5pdGlhbGl6ZUF1dGhJbnN0YW5jZShhdXRoLCBkZXBzKSB7XHJcbiAgICBjb25zdCBwZXJzaXN0ZW5jZSA9IChkZXBzID09PSBudWxsIHx8IGRlcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlcHMucGVyc2lzdGVuY2UpIHx8IFtdO1xyXG4gICAgY29uc3QgaGllcmFyY2h5ID0gKEFycmF5LmlzQXJyYXkocGVyc2lzdGVuY2UpID8gcGVyc2lzdGVuY2UgOiBbcGVyc2lzdGVuY2VdKS5tYXAoX2dldEluc3RhbmNlKTtcclxuICAgIGlmIChkZXBzID09PSBudWxsIHx8IGRlcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlcHMuZXJyb3JNYXApIHtcclxuICAgICAgICBhdXRoLl91cGRhdGVFcnJvck1hcChkZXBzLmVycm9yTWFwKTtcclxuICAgIH1cclxuICAgIC8vIFRoaXMgcHJvbWlzZSBpcyBpbnRlbmRlZCB0byBmbG9hdDsgYXV0aCBpbml0aWFsaXphdGlvbiBoYXBwZW5zIGluIHRoZVxyXG4gICAgLy8gYmFja2dyb3VuZCwgbWVhbndoaWxlIHRoZSBhdXRoIG9iamVjdCBtYXkgYmUgdXNlZCBieSB0aGUgYXBwLlxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xyXG4gICAgYXV0aC5faW5pdGlhbGl6ZVdpdGhQZXJzaXN0ZW5jZShoaWVyYXJjaHksIGRlcHMgPT09IG51bGwgfHwgZGVwcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGVwcy5wb3B1cFJlZGlyZWN0UmVzb2x2ZXIpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIF9nZXRDdXJyZW50VXJsKCkge1xyXG4gICAgdmFyIF9hO1xyXG4gICAgcmV0dXJuICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgKChfYSA9IHNlbGYubG9jYXRpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ocmVmKSkgfHwgJyc7XHJcbn1cclxuZnVuY3Rpb24gX2lzSHR0cE9ySHR0cHMoKSB7XHJcbiAgICByZXR1cm4gX2dldEN1cnJlbnRTY2hlbWUoKSA9PT0gJ2h0dHA6JyB8fCBfZ2V0Q3VycmVudFNjaGVtZSgpID09PSAnaHR0cHM6JztcclxufVxyXG5mdW5jdGlvbiBfZ2V0Q3VycmVudFNjaGVtZSgpIHtcclxuICAgIHZhciBfYTtcclxuICAgIHJldHVybiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmICgoX2EgPSBzZWxmLmxvY2F0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucHJvdG9jb2wpKSB8fCBudWxsO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgYnJvd3NlciBpcyB3b3JraW5nIG9ubGluZVxyXG4gKi9cclxuZnVuY3Rpb24gX2lzT25saW5lKCkge1xyXG4gICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmXHJcbiAgICAgICAgbmF2aWdhdG9yICYmXHJcbiAgICAgICAgJ29uTGluZScgaW4gbmF2aWdhdG9yICYmXHJcbiAgICAgICAgdHlwZW9mIG5hdmlnYXRvci5vbkxpbmUgPT09ICdib29sZWFuJyAmJlxyXG4gICAgICAgIC8vIEFwcGx5IG9ubHkgZm9yIHRyYWRpdGlvbmFsIHdlYiBhcHBzIGFuZCBDaHJvbWUgZXh0ZW5zaW9ucy5cclxuICAgICAgICAvLyBUaGlzIGlzIGVzcGVjaWFsbHkgdHJ1ZSBmb3IgQ29yZG92YSBhcHBzIHdoaWNoIGhhdmUgdW5yZWxpYWJsZVxyXG4gICAgICAgIC8vIG5hdmlnYXRvci5vbkxpbmUgYmVoYXZpb3IgdW5sZXNzIGNvcmRvdmEtcGx1Z2luLW5ldHdvcmstaW5mb3JtYXRpb24gaXNcclxuICAgICAgICAvLyBpbnN0YWxsZWQgd2hpY2ggb3ZlcndyaXRlcyB0aGUgbmF0aXZlIG5hdmlnYXRvci5vbkxpbmUgdmFsdWUgYW5kXHJcbiAgICAgICAgLy8gZGVmaW5lcyBuYXZpZ2F0b3IuY29ubmVjdGlvbi5cclxuICAgICAgICAoX2lzSHR0cE9ySHR0cHMoKSB8fCBpc0Jyb3dzZXJFeHRlbnNpb24oKSB8fCAnY29ubmVjdGlvbicgaW4gbmF2aWdhdG9yKSkge1xyXG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3Iub25MaW5lO1xyXG4gICAgfVxyXG4gICAgLy8gSWYgd2UgY2FuJ3QgZGV0ZXJtaW5lIHRoZSBzdGF0ZSwgYXNzdW1lIGl0IGlzIG9ubGluZS5cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcbmZ1bmN0aW9uIF9nZXRVc2VyTGFuZ3VhZ2UoKSB7XHJcbiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IG5hdmlnYXRvckxhbmd1YWdlID0gbmF2aWdhdG9yO1xyXG4gICAgcmV0dXJuIChcclxuICAgIC8vIE1vc3QgcmVsaWFibGUsIGJ1dCBvbmx5IHN1cHBvcnRlZCBpbiBDaHJvbWUvRmlyZWZveC5cclxuICAgIChuYXZpZ2F0b3JMYW5ndWFnZS5sYW5ndWFnZXMgJiYgbmF2aWdhdG9yTGFuZ3VhZ2UubGFuZ3VhZ2VzWzBdKSB8fFxyXG4gICAgICAgIC8vIFN1cHBvcnRlZCBpbiBtb3N0IGJyb3dzZXJzLCBidXQgcmV0dXJucyB0aGUgbGFuZ3VhZ2Ugb2YgdGhlIGJyb3dzZXJcclxuICAgICAgICAvLyBVSSwgbm90IHRoZSBsYW5ndWFnZSBzZXQgaW4gYnJvd3NlciBzZXR0aW5ncy5cclxuICAgICAgICBuYXZpZ2F0b3JMYW5ndWFnZS5sYW5ndWFnZSB8fFxyXG4gICAgICAgIC8vIENvdWxkbid0IGRldGVybWluZSBsYW5ndWFnZS5cclxuICAgICAgICBudWxsKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogQSBzdHJ1Y3R1cmUgdG8gaGVscCBwaWNrIGJldHdlZW4gYSByYW5nZSBvZiBsb25nIGFuZCBzaG9ydCBkZWxheSBkdXJhdGlvbnNcclxuICogZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50LiBJbiBnZW5lcmFsLCB0aGUgbG9uZyBkZWxheSBpcyB1c2VkIGZvclxyXG4gKiBtb2JpbGUgZW52aXJvbm1lbnRzIHdoZXJlYXMgc2hvcnQgZGVsYXlzIGFyZSB1c2VkIGZvciBkZXNrdG9wIGVudmlyb25tZW50cy5cclxuICovXHJcbmNsYXNzIERlbGF5IHtcclxuICAgIGNvbnN0cnVjdG9yKHNob3J0RGVsYXksIGxvbmdEZWxheSkge1xyXG4gICAgICAgIHRoaXMuc2hvcnREZWxheSA9IHNob3J0RGVsYXk7XHJcbiAgICAgICAgdGhpcy5sb25nRGVsYXkgPSBsb25nRGVsYXk7XHJcbiAgICAgICAgLy8gSW50ZXJuYWwgZXJyb3Igd2hlbiBpbXByb3Blcmx5IGluaXRpYWxpemVkLlxyXG4gICAgICAgIGRlYnVnQXNzZXJ0KGxvbmdEZWxheSA+IHNob3J0RGVsYXksICdTaG9ydCBkZWxheSBzaG91bGQgYmUgbGVzcyB0aGFuIGxvbmcgZGVsYXkhJyk7XHJcbiAgICAgICAgdGhpcy5pc01vYmlsZSA9IGlzTW9iaWxlQ29yZG92YSgpIHx8IGlzUmVhY3ROYXRpdmUoKTtcclxuICAgIH1cclxuICAgIGdldCgpIHtcclxuICAgICAgICBpZiAoIV9pc09ubGluZSgpKSB7XHJcbiAgICAgICAgICAgIC8vIFBpY2sgdGhlIHNob3J0ZXIgdGltZW91dC5cclxuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKDUwMDAgLyogT0ZGTElORSAqLywgdGhpcy5zaG9ydERlbGF5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSWYgcnVubmluZyBpbiBhIG1vYmlsZSBlbnZpcm9ubWVudCwgcmV0dXJuIHRoZSBsb25nIGRlbGF5LCBvdGhlcndpc2VcclxuICAgICAgICAvLyByZXR1cm4gdGhlIHNob3J0IGRlbGF5LlxyXG4gICAgICAgIC8vIFRoaXMgY291bGQgYmUgaW1wcm92ZWQgaW4gdGhlIGZ1dHVyZSB0byBkeW5hbWljYWxseSBjaGFuZ2UgYmFzZWQgb24gb3RoZXJcclxuICAgICAgICAvLyB2YXJpYWJsZXMgaW5zdGVhZCBvZiBqdXN0IHJlYWRpbmcgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNNb2JpbGUgPyB0aGlzLmxvbmdEZWxheSA6IHRoaXMuc2hvcnREZWxheTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBfZW11bGF0b3JVcmwoY29uZmlnLCBwYXRoKSB7XHJcbiAgICBkZWJ1Z0Fzc2VydChjb25maWcuZW11bGF0b3IsICdFbXVsYXRvciBzaG91bGQgYWx3YXlzIGJlIHNldCBoZXJlJyk7XHJcbiAgICBjb25zdCB7IHVybCB9ID0gY29uZmlnLmVtdWxhdG9yO1xyXG4gICAgaWYgKCFwYXRoKSB7XHJcbiAgICAgICAgcmV0dXJuIHVybDtcclxuICAgIH1cclxuICAgIHJldHVybiBgJHt1cmx9JHtwYXRoLnN0YXJ0c1dpdGgoJy8nKSA/IHBhdGguc2xpY2UoMSkgOiBwYXRofWA7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgRmV0Y2hQcm92aWRlciB7XHJcbiAgICBzdGF0aWMgaW5pdGlhbGl6ZShmZXRjaEltcGwsIGhlYWRlcnNJbXBsLCByZXNwb25zZUltcGwpIHtcclxuICAgICAgICB0aGlzLmZldGNoSW1wbCA9IGZldGNoSW1wbDtcclxuICAgICAgICBpZiAoaGVhZGVyc0ltcGwpIHtcclxuICAgICAgICAgICAgdGhpcy5oZWFkZXJzSW1wbCA9IGhlYWRlcnNJbXBsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVzcG9uc2VJbXBsKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2VJbXBsID0gcmVzcG9uc2VJbXBsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHN0YXRpYyBmZXRjaCgpIHtcclxuICAgICAgICBpZiAodGhpcy5mZXRjaEltcGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hJbXBsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmICdmZXRjaCcgaW4gc2VsZikge1xyXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5mZXRjaDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGVidWdGYWlsKCdDb3VsZCBub3QgZmluZCBmZXRjaCBpbXBsZW1lbnRhdGlvbiwgbWFrZSBzdXJlIHlvdSBjYWxsIEZldGNoUHJvdmlkZXIuaW5pdGlhbGl6ZSgpIHdpdGggYW4gYXBwcm9wcmlhdGUgcG9seWZpbGwnKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBoZWFkZXJzKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmhlYWRlcnNJbXBsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhlYWRlcnNJbXBsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmICdIZWFkZXJzJyBpbiBzZWxmKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzZWxmLkhlYWRlcnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlYnVnRmFpbCgnQ291bGQgbm90IGZpbmQgSGVhZGVycyBpbXBsZW1lbnRhdGlvbiwgbWFrZSBzdXJlIHlvdSBjYWxsIEZldGNoUHJvdmlkZXIuaW5pdGlhbGl6ZSgpIHdpdGggYW4gYXBwcm9wcmlhdGUgcG9seWZpbGwnKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyByZXNwb25zZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5yZXNwb25zZUltcGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzcG9uc2VJbXBsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmICdSZXNwb25zZScgaW4gc2VsZikge1xyXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5SZXNwb25zZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGVidWdGYWlsKCdDb3VsZCBub3QgZmluZCBSZXNwb25zZSBpbXBsZW1lbnRhdGlvbiwgbWFrZSBzdXJlIHlvdSBjYWxsIEZldGNoUHJvdmlkZXIuaW5pdGlhbGl6ZSgpIHdpdGggYW4gYXBwcm9wcmlhdGUgcG9seWZpbGwnKTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogTWFwIGZyb20gZXJyb3JzIHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXIgdG8gZXJyb3JzIHRvIGRldmVsb3BlciB2aXNpYmxlIGVycm9yc1xyXG4gKi9cclxuY29uc3QgU0VSVkVSX0VSUk9SX01BUCA9IHtcclxuICAgIC8vIEN1c3RvbSB0b2tlbiBlcnJvcnMuXHJcbiAgICBbXCJDUkVERU5USUFMX01JU01BVENIXCIgLyogQ1JFREVOVElBTF9NSVNNQVRDSCAqL106IFwiY3VzdG9tLXRva2VuLW1pc21hdGNoXCIgLyogQ1JFREVOVElBTF9NSVNNQVRDSCAqLyxcclxuICAgIC8vIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHRoZSBTREsgc2VuZHMgYSBiYWQgcmVxdWVzdC5cclxuICAgIFtcIk1JU1NJTkdfQ1VTVE9NX1RPS0VOXCIgLyogTUlTU0lOR19DVVNUT01fVE9LRU4gKi9dOiBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8sXHJcbiAgICAvLyBDcmVhdGUgQXV0aCBVUkkgZXJyb3JzLlxyXG4gICAgW1wiSU5WQUxJRF9JREVOVElGSUVSXCIgLyogSU5WQUxJRF9JREVOVElGSUVSICovXTogXCJpbnZhbGlkLWVtYWlsXCIgLyogSU5WQUxJRF9FTUFJTCAqLyxcclxuICAgIC8vIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHRoZSBTREsgc2VuZHMgYSBiYWQgcmVxdWVzdC5cclxuICAgIFtcIk1JU1NJTkdfQ09OVElOVUVfVVJJXCIgLyogTUlTU0lOR19DT05USU5VRV9VUkkgKi9dOiBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8sXHJcbiAgICAvLyBTaWduIGluIHdpdGggZW1haWwgYW5kIHBhc3N3b3JkIGVycm9ycyAoc29tZSBhcHBseSB0byBzaWduIHVwIHRvbykuXHJcbiAgICBbXCJJTlZBTElEX1BBU1NXT1JEXCIgLyogSU5WQUxJRF9QQVNTV09SRCAqL106IFwid3JvbmctcGFzc3dvcmRcIiAvKiBJTlZBTElEX1BBU1NXT1JEICovLFxyXG4gICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgdGhlIFNESyBzZW5kcyBhIGJhZCByZXF1ZXN0LlxyXG4gICAgW1wiTUlTU0lOR19QQVNTV09SRFwiIC8qIE1JU1NJTkdfUEFTU1dPUkQgKi9dOiBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8sXHJcbiAgICAvLyBTaWduIHVwIHdpdGggZW1haWwgYW5kIHBhc3N3b3JkIGVycm9ycy5cclxuICAgIFtcIkVNQUlMX0VYSVNUU1wiIC8qIEVNQUlMX0VYSVNUUyAqL106IFwiZW1haWwtYWxyZWFkeS1pbi11c2VcIiAvKiBFTUFJTF9FWElTVFMgKi8sXHJcbiAgICBbXCJQQVNTV09SRF9MT0dJTl9ESVNBQkxFRFwiIC8qIFBBU1NXT1JEX0xPR0lOX0RJU0FCTEVEICovXTogXCJvcGVyYXRpb24tbm90LWFsbG93ZWRcIiAvKiBPUEVSQVRJT05fTk9UX0FMTE9XRUQgKi8sXHJcbiAgICAvLyBWZXJpZnkgYXNzZXJ0aW9uIGZvciBzaWduIGluIHdpdGggY3JlZGVudGlhbCBlcnJvcnM6XHJcbiAgICBbXCJJTlZBTElEX0lEUF9SRVNQT05TRVwiIC8qIElOVkFMSURfSURQX1JFU1BPTlNFICovXTogXCJpbnZhbGlkLWNyZWRlbnRpYWxcIiAvKiBJTlZBTElEX0lEUF9SRVNQT05TRSAqLyxcclxuICAgIFtcIklOVkFMSURfUEVORElOR19UT0tFTlwiIC8qIElOVkFMSURfUEVORElOR19UT0tFTiAqL106IFwiaW52YWxpZC1jcmVkZW50aWFsXCIgLyogSU5WQUxJRF9JRFBfUkVTUE9OU0UgKi8sXHJcbiAgICBbXCJGRURFUkFURURfVVNFUl9JRF9BTFJFQURZX0xJTktFRFwiIC8qIEZFREVSQVRFRF9VU0VSX0lEX0FMUkVBRFlfTElOS0VEICovXTogXCJjcmVkZW50aWFsLWFscmVhZHktaW4tdXNlXCIgLyogQ1JFREVOVElBTF9BTFJFQURZX0lOX1VTRSAqLyxcclxuICAgIC8vIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHRoZSBTREsgc2VuZHMgYSBiYWQgcmVxdWVzdC5cclxuICAgIFtcIk1JU1NJTkdfUkVRX1RZUEVcIiAvKiBNSVNTSU5HX1JFUV9UWVBFICovXTogXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovLFxyXG4gICAgLy8gU2VuZCBQYXNzd29yZCByZXNldCBlbWFpbCBlcnJvcnM6XHJcbiAgICBbXCJFTUFJTF9OT1RfRk9VTkRcIiAvKiBFTUFJTF9OT1RfRk9VTkQgKi9dOiBcInVzZXItbm90LWZvdW5kXCIgLyogVVNFUl9ERUxFVEVEICovLFxyXG4gICAgW1wiUkVTRVRfUEFTU1dPUkRfRVhDRUVEX0xJTUlUXCIgLyogUkVTRVRfUEFTU1dPUkRfRVhDRUVEX0xJTUlUICovXTogXCJ0b28tbWFueS1yZXF1ZXN0c1wiIC8qIFRPT19NQU5ZX0FUVEVNUFRTX1RSWV9MQVRFUiAqLyxcclxuICAgIFtcIkVYUElSRURfT09CX0NPREVcIiAvKiBFWFBJUkVEX09PQl9DT0RFICovXTogXCJleHBpcmVkLWFjdGlvbi1jb2RlXCIgLyogRVhQSVJFRF9PT0JfQ09ERSAqLyxcclxuICAgIFtcIklOVkFMSURfT09CX0NPREVcIiAvKiBJTlZBTElEX09PQl9DT0RFICovXTogXCJpbnZhbGlkLWFjdGlvbi1jb2RlXCIgLyogSU5WQUxJRF9PT0JfQ09ERSAqLyxcclxuICAgIC8vIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHRoZSBTREsgc2VuZHMgYSBiYWQgcmVxdWVzdC5cclxuICAgIFtcIk1JU1NJTkdfT09CX0NPREVcIiAvKiBNSVNTSU5HX09PQl9DT0RFICovXTogXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovLFxyXG4gICAgLy8gT3BlcmF0aW9ucyB0aGF0IHJlcXVpcmUgSUQgdG9rZW4gaW4gcmVxdWVzdDpcclxuICAgIFtcIkNSRURFTlRJQUxfVE9PX09MRF9MT0dJTl9BR0FJTlwiIC8qIENSRURFTlRJQUxfVE9PX09MRF9MT0dJTl9BR0FJTiAqL106IFwicmVxdWlyZXMtcmVjZW50LWxvZ2luXCIgLyogQ1JFREVOVElBTF9UT09fT0xEX0xPR0lOX0FHQUlOICovLFxyXG4gICAgW1wiSU5WQUxJRF9JRF9UT0tFTlwiIC8qIElOVkFMSURfSURfVE9LRU4gKi9dOiBcImludmFsaWQtdXNlci10b2tlblwiIC8qIElOVkFMSURfQVVUSCAqLyxcclxuICAgIFtcIlRPS0VOX0VYUElSRURcIiAvKiBUT0tFTl9FWFBJUkVEICovXTogXCJ1c2VyLXRva2VuLWV4cGlyZWRcIiAvKiBUT0tFTl9FWFBJUkVEICovLFxyXG4gICAgW1wiVVNFUl9OT1RfRk9VTkRcIiAvKiBVU0VSX05PVF9GT1VORCAqL106IFwidXNlci10b2tlbi1leHBpcmVkXCIgLyogVE9LRU5fRVhQSVJFRCAqLyxcclxuICAgIC8vIE90aGVyIGVycm9ycy5cclxuICAgIFtcIlRPT19NQU5ZX0FUVEVNUFRTX1RSWV9MQVRFUlwiIC8qIFRPT19NQU5ZX0FUVEVNUFRTX1RSWV9MQVRFUiAqL106IFwidG9vLW1hbnktcmVxdWVzdHNcIiAvKiBUT09fTUFOWV9BVFRFTVBUU19UUllfTEFURVIgKi8sXHJcbiAgICAvLyBQaG9uZSBBdXRoIHJlbGF0ZWQgZXJyb3JzLlxyXG4gICAgW1wiSU5WQUxJRF9DT0RFXCIgLyogSU5WQUxJRF9DT0RFICovXTogXCJpbnZhbGlkLXZlcmlmaWNhdGlvbi1jb2RlXCIgLyogSU5WQUxJRF9DT0RFICovLFxyXG4gICAgW1wiSU5WQUxJRF9TRVNTSU9OX0lORk9cIiAvKiBJTlZBTElEX1NFU1NJT05fSU5GTyAqL106IFwiaW52YWxpZC12ZXJpZmljYXRpb24taWRcIiAvKiBJTlZBTElEX1NFU1NJT05fSU5GTyAqLyxcclxuICAgIFtcIklOVkFMSURfVEVNUE9SQVJZX1BST09GXCIgLyogSU5WQUxJRF9URU1QT1JBUllfUFJPT0YgKi9dOiBcImludmFsaWQtY3JlZGVudGlhbFwiIC8qIElOVkFMSURfSURQX1JFU1BPTlNFICovLFxyXG4gICAgW1wiTUlTU0lOR19TRVNTSU9OX0lORk9cIiAvKiBNSVNTSU5HX1NFU1NJT05fSU5GTyAqL106IFwibWlzc2luZy12ZXJpZmljYXRpb24taWRcIiAvKiBNSVNTSU5HX1NFU1NJT05fSU5GTyAqLyxcclxuICAgIFtcIlNFU1NJT05fRVhQSVJFRFwiIC8qIFNFU1NJT05fRVhQSVJFRCAqL106IFwiY29kZS1leHBpcmVkXCIgLyogQ09ERV9FWFBJUkVEICovLFxyXG4gICAgLy8gT3RoZXIgYWN0aW9uIGNvZGUgZXJyb3JzIHdoZW4gYWRkaXRpb25hbCBzZXR0aW5ncyBwYXNzZWQuXHJcbiAgICAvLyBNSVNTSU5HX0NPTlRJTlVFX1VSSSBpcyBnZXR0aW5nIG1hcHBlZCB0byBJTlRFUk5BTF9FUlJPUiBhYm92ZS5cclxuICAgIC8vIFRoaXMgaXMgT0sgYXMgdGhpcyBlcnJvciB3aWxsIGJlIGNhdWdodCBieSBjbGllbnQgc2lkZSB2YWxpZGF0aW9uLlxyXG4gICAgW1wiTUlTU0lOR19BTkRST0lEX1BBQ0tBR0VfTkFNRVwiIC8qIE1JU1NJTkdfQU5EUk9JRF9QQUNLQUdFX05BTUUgKi9dOiBcIm1pc3NpbmctYW5kcm9pZC1wa2ctbmFtZVwiIC8qIE1JU1NJTkdfQU5EUk9JRF9QQUNLQUdFX05BTUUgKi8sXHJcbiAgICBbXCJVTkFVVEhPUklaRURfRE9NQUlOXCIgLyogVU5BVVRIT1JJWkVEX0RPTUFJTiAqL106IFwidW5hdXRob3JpemVkLWNvbnRpbnVlLXVyaVwiIC8qIFVOQVVUSE9SSVpFRF9ET01BSU4gKi8sXHJcbiAgICAvLyBnZXRQcm9qZWN0Q29uZmlnIGVycm9ycyB3aGVuIGNsaWVudElkIGlzIHBhc3NlZC5cclxuICAgIFtcIklOVkFMSURfT0FVVEhfQ0xJRU5UX0lEXCIgLyogSU5WQUxJRF9PQVVUSF9DTElFTlRfSUQgKi9dOiBcImludmFsaWQtb2F1dGgtY2xpZW50LWlkXCIgLyogSU5WQUxJRF9PQVVUSF9DTElFTlRfSUQgKi8sXHJcbiAgICAvLyBVc2VyIGFjdGlvbnMgKHNpZ24tdXAgb3IgZGVsZXRpb24pIGRpc2FibGVkIGVycm9ycy5cclxuICAgIFtcIkFETUlOX09OTFlfT1BFUkFUSU9OXCIgLyogQURNSU5fT05MWV9PUEVSQVRJT04gKi9dOiBcImFkbWluLXJlc3RyaWN0ZWQtb3BlcmF0aW9uXCIgLyogQURNSU5fT05MWV9PUEVSQVRJT04gKi8sXHJcbiAgICAvLyBNdWx0aSBmYWN0b3IgcmVsYXRlZCBlcnJvcnMuXHJcbiAgICBbXCJJTlZBTElEX01GQV9QRU5ESU5HX0NSRURFTlRJQUxcIiAvKiBJTlZBTElEX01GQV9QRU5ESU5HX0NSRURFTlRJQUwgKi9dOiBcImludmFsaWQtbXVsdGktZmFjdG9yLXNlc3Npb25cIiAvKiBJTlZBTElEX01GQV9TRVNTSU9OICovLFxyXG4gICAgW1wiTUZBX0VOUk9MTE1FTlRfTk9UX0ZPVU5EXCIgLyogTUZBX0VOUk9MTE1FTlRfTk9UX0ZPVU5EICovXTogXCJtdWx0aS1mYWN0b3ItaW5mby1ub3QtZm91bmRcIiAvKiBNRkFfSU5GT19OT1RfRk9VTkQgKi8sXHJcbiAgICBbXCJNSVNTSU5HX01GQV9FTlJPTExNRU5UX0lEXCIgLyogTUlTU0lOR19NRkFfRU5ST0xMTUVOVF9JRCAqL106IFwibWlzc2luZy1tdWx0aS1mYWN0b3ItaW5mb1wiIC8qIE1JU1NJTkdfTUZBX0lORk8gKi8sXHJcbiAgICBbXCJNSVNTSU5HX01GQV9QRU5ESU5HX0NSRURFTlRJQUxcIiAvKiBNSVNTSU5HX01GQV9QRU5ESU5HX0NSRURFTlRJQUwgKi9dOiBcIm1pc3NpbmctbXVsdGktZmFjdG9yLXNlc3Npb25cIiAvKiBNSVNTSU5HX01GQV9TRVNTSU9OICovLFxyXG4gICAgW1wiU0VDT05EX0ZBQ1RPUl9FWElTVFNcIiAvKiBTRUNPTkRfRkFDVE9SX0VYSVNUUyAqL106IFwic2Vjb25kLWZhY3Rvci1hbHJlYWR5LWluLXVzZVwiIC8qIFNFQ09ORF9GQUNUT1JfQUxSRUFEWV9FTlJPTExFRCAqLyxcclxuICAgIFtcIlNFQ09ORF9GQUNUT1JfTElNSVRfRVhDRUVERURcIiAvKiBTRUNPTkRfRkFDVE9SX0xJTUlUX0VYQ0VFREVEICovXTogXCJtYXhpbXVtLXNlY29uZC1mYWN0b3ItY291bnQtZXhjZWVkZWRcIiAvKiBTRUNPTkRfRkFDVE9SX0xJTUlUX0VYQ0VFREVEICovLFxyXG4gICAgLy8gQmxvY2tpbmcgZnVuY3Rpb25zIHJlbGF0ZWQgZXJyb3JzLlxyXG4gICAgW1wiQkxPQ0tJTkdfRlVOQ1RJT05fRVJST1JfUkVTUE9OU0VcIiAvKiBCTE9DS0lOR19GVU5DVElPTl9FUlJPUl9SRVNQT05TRSAqL106IFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyxcclxufTtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgREVGQVVMVF9BUElfVElNRU9VVF9NUyA9IG5ldyBEZWxheSgzMDAwMCwgNjAwMDApO1xyXG5mdW5jdGlvbiBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgaWYgKGF1dGgudGVuYW50SWQgJiYgIXJlcXVlc3QudGVuYW50SWQpIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXF1ZXN0KSwgeyB0ZW5hbnRJZDogYXV0aC50ZW5hbnRJZCB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXF1ZXN0O1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIF9wZXJmb3JtQXBpUmVxdWVzdChhdXRoLCBtZXRob2QsIHBhdGgsIHJlcXVlc3QsIGN1c3RvbUVycm9yTWFwID0ge30pIHtcclxuICAgIHJldHVybiBfcGVyZm9ybUZldGNoV2l0aEVycm9ySGFuZGxpbmcoYXV0aCwgY3VzdG9tRXJyb3JNYXAsIGFzeW5jICgpID0+IHtcclxuICAgICAgICBsZXQgYm9keSA9IHt9O1xyXG4gICAgICAgIGxldCBwYXJhbXMgPSB7fTtcclxuICAgICAgICBpZiAocmVxdWVzdCkge1xyXG4gICAgICAgICAgICBpZiAobWV0aG9kID09PSBcIkdFVFwiIC8qIEdFVCAqLykge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1zID0gcmVxdWVzdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGJvZHkgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxdWVzdClcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBxdWVyeXN0cmluZyhPYmplY3QuYXNzaWduKHsga2V5OiBhdXRoLmNvbmZpZy5hcGlLZXkgfSwgcGFyYW1zKSkuc2xpY2UoMSk7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IGF1dGguX2dldEFkZGl0aW9uYWxIZWFkZXJzKCk7XHJcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiIC8qIENPTlRFTlRfVFlQRSAqL10gPSAnYXBwbGljYXRpb24vanNvbic7XHJcbiAgICAgICAgaWYgKGF1dGgubGFuZ3VhZ2VDb2RlKSB7XHJcbiAgICAgICAgICAgIGhlYWRlcnNbXCJYLUZpcmViYXNlLUxvY2FsZVwiIC8qIFhfRklSRUJBU0VfTE9DQUxFICovXSA9IGF1dGgubGFuZ3VhZ2VDb2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gRmV0Y2hQcm92aWRlci5mZXRjaCgpKF9nZXRGaW5hbFRhcmdldChhdXRoLCBhdXRoLmNvbmZpZy5hcGlIb3N0LCBwYXRoLCBxdWVyeSksIE9iamVjdC5hc3NpZ24oeyBtZXRob2QsXHJcbiAgICAgICAgICAgIGhlYWRlcnMsIHJlZmVycmVyUG9saWN5OiAnbm8tcmVmZXJyZXInIH0sIGJvZHkpKTtcclxuICAgIH0pO1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIF9wZXJmb3JtRmV0Y2hXaXRoRXJyb3JIYW5kbGluZyhhdXRoLCBjdXN0b21FcnJvck1hcCwgZmV0Y2hGbikge1xyXG4gICAgYXV0aC5fY2FuSW5pdEVtdWxhdG9yID0gZmFsc2U7XHJcbiAgICBjb25zdCBlcnJvck1hcCA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgU0VSVkVSX0VSUk9SX01BUCksIGN1c3RvbUVycm9yTWFwKTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgbmV0d29ya1RpbWVvdXQgPSBuZXcgTmV0d29ya1RpbWVvdXQoYXV0aCk7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBQcm9taXNlLnJhY2UoW1xyXG4gICAgICAgICAgICBmZXRjaEZuKCksXHJcbiAgICAgICAgICAgIG5ldHdvcmtUaW1lb3V0LnByb21pc2VcclxuICAgICAgICBdKTtcclxuICAgICAgICAvLyBJZiB3ZSd2ZSByZWFjaGVkIHRoaXMgcG9pbnQsIHRoZSBmZXRjaCBzdWNjZWVkZWQgYW5kIHRoZSBuZXR3b3JrVGltZW91dFxyXG4gICAgICAgIC8vIGRpZG4ndCB0aHJvdzsgY2xlYXIgdGhlIG5ldHdvcmsgdGltZW91dCBkZWxheSBzbyB0aGF0IE5vZGUgd29uJ3QgaGFuZ1xyXG4gICAgICAgIG5ldHdvcmtUaW1lb3V0LmNsZWFyTmV0d29ya1RpbWVvdXQoKTtcclxuICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG4gICAgICAgIGlmICgnbmVlZENvbmZpcm1hdGlvbicgaW4ganNvbikge1xyXG4gICAgICAgICAgICB0aHJvdyBfbWFrZVRhZ2dlZEVycm9yKGF1dGgsIFwiYWNjb3VudC1leGlzdHMtd2l0aC1kaWZmZXJlbnQtY3JlZGVudGlhbFwiIC8qIE5FRURfQ09ORklSTUFUSU9OICovLCBqc29uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLm9rICYmICEoJ2Vycm9yTWVzc2FnZScgaW4ganNvbikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGpzb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSByZXNwb25zZS5vayA/IGpzb24uZXJyb3JNZXNzYWdlIDoganNvbi5lcnJvci5tZXNzYWdlO1xyXG4gICAgICAgICAgICBjb25zdCBbc2VydmVyRXJyb3JDb2RlLCBzZXJ2ZXJFcnJvck1lc3NhZ2VdID0gZXJyb3JNZXNzYWdlLnNwbGl0KCcgOiAnKTtcclxuICAgICAgICAgICAgaWYgKHNlcnZlckVycm9yQ29kZSA9PT0gXCJGRURFUkFURURfVVNFUl9JRF9BTFJFQURZX0xJTktFRFwiIC8qIEZFREVSQVRFRF9VU0VSX0lEX0FMUkVBRFlfTElOS0VEICovKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBfbWFrZVRhZ2dlZEVycm9yKGF1dGgsIFwiY3JlZGVudGlhbC1hbHJlYWR5LWluLXVzZVwiIC8qIENSRURFTlRJQUxfQUxSRUFEWV9JTl9VU0UgKi8sIGpzb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHNlcnZlckVycm9yQ29kZSA9PT0gXCJFTUFJTF9FWElTVFNcIiAvKiBFTUFJTF9FWElTVFMgKi8pIHtcclxuICAgICAgICAgICAgICAgIHRocm93IF9tYWtlVGFnZ2VkRXJyb3IoYXV0aCwgXCJlbWFpbC1hbHJlYWR5LWluLXVzZVwiIC8qIEVNQUlMX0VYSVNUUyAqLywganNvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgYXV0aEVycm9yID0gZXJyb3JNYXBbc2VydmVyRXJyb3JDb2RlXSB8fFxyXG4gICAgICAgICAgICAgICAgc2VydmVyRXJyb3JDb2RlXHJcbiAgICAgICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvW19cXHNdKy9nLCAnLScpO1xyXG4gICAgICAgICAgICBpZiAoc2VydmVyRXJyb3JNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBfZXJyb3JXaXRoQ3VzdG9tTWVzc2FnZShhdXRoLCBhdXRoRXJyb3IsIHNlcnZlckVycm9yTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBfZmFpbChhdXRoLCBhdXRoRXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEZpcmViYXNlRXJyb3IpIHtcclxuICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgX2ZhaWwoYXV0aCwgXCJuZXR3b3JrLXJlcXVlc3QtZmFpbGVkXCIgLyogTkVUV09SS19SRVFVRVNUX0ZBSUxFRCAqLyk7XHJcbiAgICB9XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gX3BlcmZvcm1TaWduSW5SZXF1ZXN0KGF1dGgsIG1ldGhvZCwgcGF0aCwgcmVxdWVzdCwgY3VzdG9tRXJyb3JNYXAgPSB7fSkge1xyXG4gICAgY29uc3Qgc2VydmVyUmVzcG9uc2UgPSAoYXdhaXQgX3BlcmZvcm1BcGlSZXF1ZXN0KGF1dGgsIG1ldGhvZCwgcGF0aCwgcmVxdWVzdCwgY3VzdG9tRXJyb3JNYXApKTtcclxuICAgIGlmICgnbWZhUGVuZGluZ0NyZWRlbnRpYWwnIGluIHNlcnZlclJlc3BvbnNlKSB7XHJcbiAgICAgICAgX2ZhaWwoYXV0aCwgXCJtdWx0aS1mYWN0b3ItYXV0aC1yZXF1aXJlZFwiIC8qIE1GQV9SRVFVSVJFRCAqLywge1xyXG4gICAgICAgICAgICBfc2VydmVyUmVzcG9uc2U6IHNlcnZlclJlc3BvbnNlXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc2VydmVyUmVzcG9uc2U7XHJcbn1cclxuZnVuY3Rpb24gX2dldEZpbmFsVGFyZ2V0KGF1dGgsIGhvc3QsIHBhdGgsIHF1ZXJ5KSB7XHJcbiAgICBjb25zdCBiYXNlID0gYCR7aG9zdH0ke3BhdGh9PyR7cXVlcnl9YDtcclxuICAgIGlmICghYXV0aC5jb25maWcuZW11bGF0b3IpIHtcclxuICAgICAgICByZXR1cm4gYCR7YXV0aC5jb25maWcuYXBpU2NoZW1lfTovLyR7YmFzZX1gO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9lbXVsYXRvclVybChhdXRoLmNvbmZpZywgYmFzZSk7XHJcbn1cclxuY2xhc3MgTmV0d29ya1RpbWVvdXQge1xyXG4gICAgY29uc3RydWN0b3IoYXV0aCkge1xyXG4gICAgICAgIHRoaXMuYXV0aCA9IGF1dGg7XHJcbiAgICAgICAgLy8gTm9kZSB0aW1lcnMgYW5kIGJyb3dzZXIgdGltZXJzIGFyZSBmdW5kYW1lbnRhbGx5IGluY29tcGF0aWJsZSwgYnV0IHdlXHJcbiAgICAgICAgLy8gZG9uJ3QgY2FyZSBhYm91dCB0aGUgdmFsdWUgaGVyZVxyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgdGhpcy50aW1lciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KF9jcmVhdGVFcnJvcih0aGlzLmF1dGgsIFwibmV0d29yay1yZXF1ZXN0LWZhaWxlZFwiIC8qIE5FVFdPUktfUkVRVUVTVF9GQUlMRUQgKi8pKTtcclxuICAgICAgICAgICAgfSwgREVGQVVMVF9BUElfVElNRU9VVF9NUy5nZXQoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBjbGVhck5ldHdvcmtUaW1lb3V0KCkge1xyXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBfbWFrZVRhZ2dlZEVycm9yKGF1dGgsIGNvZGUsIHJlc3BvbnNlKSB7XHJcbiAgICBjb25zdCBlcnJvclBhcmFtcyA9IHtcclxuICAgICAgICBhcHBOYW1lOiBhdXRoLm5hbWVcclxuICAgIH07XHJcbiAgICBpZiAocmVzcG9uc2UuZW1haWwpIHtcclxuICAgICAgICBlcnJvclBhcmFtcy5lbWFpbCA9IHJlc3BvbnNlLmVtYWlsO1xyXG4gICAgfVxyXG4gICAgaWYgKHJlc3BvbnNlLnBob25lTnVtYmVyKSB7XHJcbiAgICAgICAgZXJyb3JQYXJhbXMucGhvbmVOdW1iZXIgPSByZXNwb25zZS5waG9uZU51bWJlcjtcclxuICAgIH1cclxuICAgIGNvbnN0IGVycm9yID0gX2NyZWF0ZUVycm9yKGF1dGgsIGNvZGUsIGVycm9yUGFyYW1zKTtcclxuICAgIC8vIFdlIGtub3cgY3VzdG9tRGF0YSBpcyBkZWZpbmVkIG9uIGVycm9yIGJlY2F1c2UgZXJyb3JQYXJhbXMgaXMgZGVmaW5lZFxyXG4gICAgZXJyb3IuY3VzdG9tRGF0YS5fdG9rZW5SZXNwb25zZSA9IHJlc3BvbnNlO1xyXG4gICAgcmV0dXJuIGVycm9yO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUFjY291bnQoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdChhdXRoLCBcIlBPU1RcIiAvKiBQT1NUICovLCBcIi92MS9hY2NvdW50czpkZWxldGVcIiAvKiBERUxFVEVfQUNDT1VOVCAqLywgcmVxdWVzdCk7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTGlua2VkQWNjb3VudHMoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdChhdXRoLCBcIlBPU1RcIiAvKiBQT1NUICovLCBcIi92MS9hY2NvdW50czp1cGRhdGVcIiAvKiBTRVRfQUNDT1VOVF9JTkZPICovLCByZXF1ZXN0KTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBnZXRBY2NvdW50SW5mbyhhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0KGF1dGgsIFwiUE9TVFwiIC8qIFBPU1QgKi8sIFwiL3YxL2FjY291bnRzOmxvb2t1cFwiIC8qIEdFVF9BQ0NPVU5UX0lORk8gKi8sIHJlcXVlc3QpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIHV0Y1RpbWVzdGFtcFRvRGF0ZVN0cmluZyh1dGNUaW1lc3RhbXApIHtcclxuICAgIGlmICghdXRjVGltZXN0YW1wKSB7XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgICAgLy8gQ29udmVydCB0byBkYXRlIG9iamVjdC5cclxuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoTnVtYmVyKHV0Y1RpbWVzdGFtcCkpO1xyXG4gICAgICAgIC8vIFRlc3QgZGF0ZSBpcyB2YWxpZC5cclxuICAgICAgICBpZiAoIWlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xyXG4gICAgICAgICAgICAvLyBDb252ZXJ0IHRvIFVUQyBkYXRlIHN0cmluZy5cclxuICAgICAgICAgICAgcmV0dXJuIGRhdGUudG9VVENTdHJpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgIC8vIERvIG5vdGhpbmcuIHVuZGVmaW5lZCB3aWxsIGJlIHJldHVybmVkLlxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogUmV0dXJucyBhIEpTT04gV2ViIFRva2VuIChKV1QpIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHVzZXIgdG8gYSBGaXJlYmFzZSBzZXJ2aWNlLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50IHRva2VuIGlmIGl0IGhhcyBub3QgZXhwaXJlZCBvciBpZiBpdCB3aWxsIG5vdCBleHBpcmUgaW4gdGhlIG5leHQgZml2ZVxyXG4gKiBtaW51dGVzLiBPdGhlcndpc2UsIHRoaXMgd2lsbCByZWZyZXNoIHRoZSB0b2tlbiBhbmQgcmV0dXJuIGEgbmV3IG9uZS5cclxuICpcclxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cclxuICogQHBhcmFtIGZvcmNlUmVmcmVzaCAtIEZvcmNlIHJlZnJlc2ggcmVnYXJkbGVzcyBvZiB0b2tlbiBleHBpcmF0aW9uLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRJZFRva2VuKHVzZXIsIGZvcmNlUmVmcmVzaCA9IGZhbHNlKSB7XHJcbiAgICByZXR1cm4gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpLmdldElkVG9rZW4oZm9yY2VSZWZyZXNoKTtcclxufVxyXG4vKipcclxuICogUmV0dXJucyBhIGRlc2VyaWFsaXplZCBKU09OIFdlYiBUb2tlbiAoSldUKSB1c2VkIHRvIGlkZW50aXRmeSB0aGUgdXNlciB0byBhIEZpcmViYXNlIHNlcnZpY2UuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIFJldHVybnMgdGhlIGN1cnJlbnQgdG9rZW4gaWYgaXQgaGFzIG5vdCBleHBpcmVkIG9yIGlmIGl0IHdpbGwgbm90IGV4cGlyZSBpbiB0aGUgbmV4dCBmaXZlXHJcbiAqIG1pbnV0ZXMuIE90aGVyd2lzZSwgdGhpcyB3aWxsIHJlZnJlc2ggdGhlIHRva2VuIGFuZCByZXR1cm4gYSBuZXcgb25lLlxyXG4gKlxyXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxyXG4gKiBAcGFyYW0gZm9yY2VSZWZyZXNoIC0gRm9yY2UgcmVmcmVzaCByZWdhcmRsZXNzIG9mIHRva2VuIGV4cGlyYXRpb24uXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIGdldElkVG9rZW5SZXN1bHQodXNlciwgZm9yY2VSZWZyZXNoID0gZmFsc2UpIHtcclxuICAgIGNvbnN0IHVzZXJJbnRlcm5hbCA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKTtcclxuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdXNlckludGVybmFsLmdldElkVG9rZW4oZm9yY2VSZWZyZXNoKTtcclxuICAgIGNvbnN0IGNsYWltcyA9IF9wYXJzZVRva2VuKHRva2VuKTtcclxuICAgIF9hc3NlcnQoY2xhaW1zICYmIGNsYWltcy5leHAgJiYgY2xhaW1zLmF1dGhfdGltZSAmJiBjbGFpbXMuaWF0LCB1c2VySW50ZXJuYWwuYXV0aCwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovKTtcclxuICAgIGNvbnN0IGZpcmViYXNlID0gdHlwZW9mIGNsYWltcy5maXJlYmFzZSA9PT0gJ29iamVjdCcgPyBjbGFpbXMuZmlyZWJhc2UgOiB1bmRlZmluZWQ7XHJcbiAgICBjb25zdCBzaWduSW5Qcm92aWRlciA9IGZpcmViYXNlID09PSBudWxsIHx8IGZpcmViYXNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmaXJlYmFzZVsnc2lnbl9pbl9wcm92aWRlciddO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBjbGFpbXMsXHJcbiAgICAgICAgdG9rZW4sXHJcbiAgICAgICAgYXV0aFRpbWU6IHV0Y1RpbWVzdGFtcFRvRGF0ZVN0cmluZyhzZWNvbmRzU3RyaW5nVG9NaWxsaXNlY29uZHMoY2xhaW1zLmF1dGhfdGltZSkpLFxyXG4gICAgICAgIGlzc3VlZEF0VGltZTogdXRjVGltZXN0YW1wVG9EYXRlU3RyaW5nKHNlY29uZHNTdHJpbmdUb01pbGxpc2Vjb25kcyhjbGFpbXMuaWF0KSksXHJcbiAgICAgICAgZXhwaXJhdGlvblRpbWU6IHV0Y1RpbWVzdGFtcFRvRGF0ZVN0cmluZyhzZWNvbmRzU3RyaW5nVG9NaWxsaXNlY29uZHMoY2xhaW1zLmV4cCkpLFxyXG4gICAgICAgIHNpZ25JblByb3ZpZGVyOiBzaWduSW5Qcm92aWRlciB8fCBudWxsLFxyXG4gICAgICAgIHNpZ25JblNlY29uZEZhY3RvcjogKGZpcmViYXNlID09PSBudWxsIHx8IGZpcmViYXNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmaXJlYmFzZVsnc2lnbl9pbl9zZWNvbmRfZmFjdG9yJ10pIHx8IG51bGxcclxuICAgIH07XHJcbn1cclxuZnVuY3Rpb24gc2Vjb25kc1N0cmluZ1RvTWlsbGlzZWNvbmRzKHNlY29uZHMpIHtcclxuICAgIHJldHVybiBOdW1iZXIoc2Vjb25kcykgKiAxMDAwO1xyXG59XHJcbmZ1bmN0aW9uIF9wYXJzZVRva2VuKHRva2VuKSB7XHJcbiAgICBjb25zdCBbYWxnb3JpdGhtLCBwYXlsb2FkLCBzaWduYXR1cmVdID0gdG9rZW4uc3BsaXQoJy4nKTtcclxuICAgIGlmIChhbGdvcml0aG0gPT09IHVuZGVmaW5lZCB8fFxyXG4gICAgICAgIHBheWxvYWQgPT09IHVuZGVmaW5lZCB8fFxyXG4gICAgICAgIHNpZ25hdHVyZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgX2xvZ0Vycm9yKCdKV1QgbWFsZm9ybWVkLCBjb250YWluZWQgZmV3ZXIgdGhhbiAzIHNlY3Rpb25zJyk7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSBiYXNlNjREZWNvZGUocGF5bG9hZCk7XHJcbiAgICAgICAgaWYgKCFkZWNvZGVkKSB7XHJcbiAgICAgICAgICAgIF9sb2dFcnJvcignRmFpbGVkIHRvIGRlY29kZSBiYXNlNjQgSldUIHBheWxvYWQnKTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGRlY29kZWQpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICBfbG9nRXJyb3IoJ0NhdWdodCBlcnJvciBwYXJzaW5nIEpXVCBwYXlsb2FkIGFzIEpTT04nLCBlKTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogRXh0cmFjdCBleHBpcmVzSW4gVFRMIGZyb20gYSB0b2tlbiBieSBzdWJ0cmFjdGluZyB0aGUgZXhwaXJhdGlvbiBmcm9tIHRoZSBpc3N1YW5jZS5cclxuICovXHJcbmZ1bmN0aW9uIF90b2tlbkV4cGlyZXNJbih0b2tlbikge1xyXG4gICAgY29uc3QgcGFyc2VkVG9rZW4gPSBfcGFyc2VUb2tlbih0b2tlbik7XHJcbiAgICBfYXNzZXJ0KHBhcnNlZFRva2VuLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgX2Fzc2VydCh0eXBlb2YgcGFyc2VkVG9rZW4uZXhwICE9PSAndW5kZWZpbmVkJywgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovKTtcclxuICAgIF9hc3NlcnQodHlwZW9mIHBhcnNlZFRva2VuLmlhdCAhPT0gJ3VuZGVmaW5lZCcsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICByZXR1cm4gTnVtYmVyKHBhcnNlZFRva2VuLmV4cCkgLSBOdW1iZXIocGFyc2VkVG9rZW4uaWF0KTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBfbG9nb3V0SWZJbnZhbGlkYXRlZCh1c2VyLCBwcm9taXNlLCBieXBhc3NBdXRoU3RhdGUgPSBmYWxzZSkge1xyXG4gICAgaWYgKGJ5cGFzc0F1dGhTdGF0ZSkge1xyXG4gICAgICAgIHJldHVybiBwcm9taXNlO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gYXdhaXQgcHJvbWlzZTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBGaXJlYmFzZUVycm9yICYmIGlzVXNlckludmFsaWRhdGVkKGUpKSB7XHJcbiAgICAgICAgICAgIGlmICh1c2VyLmF1dGguY3VycmVudFVzZXIgPT09IHVzZXIpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHVzZXIuYXV0aC5zaWduT3V0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgZTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBpc1VzZXJJbnZhbGlkYXRlZCh7IGNvZGUgfSkge1xyXG4gICAgcmV0dXJuIChjb2RlID09PSBgYXV0aC8ke1widXNlci1kaXNhYmxlZFwiIC8qIFVTRVJfRElTQUJMRUQgKi99YCB8fFxyXG4gICAgICAgIGNvZGUgPT09IGBhdXRoLyR7XCJ1c2VyLXRva2VuLWV4cGlyZWRcIiAvKiBUT0tFTl9FWFBJUkVEICovfWApO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNsYXNzIFByb2FjdGl2ZVJlZnJlc2gge1xyXG4gICAgY29uc3RydWN0b3IodXNlcikge1xyXG4gICAgICAgIHRoaXMudXNlciA9IHVzZXI7XHJcbiAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgICAvLyBOb2RlIHRpbWVycyBhbmQgYnJvd3NlciB0aW1lcnMgcmV0dXJuIGZ1bmRhbWVudGFsbHkgZGlmZmVyZW50IHR5cGVzLlxyXG4gICAgICAgIC8vIFdlIGRvbid0IGFjdHVhbGx5IGNhcmUgd2hhdCB0aGUgdmFsdWUgaXMgYnV0IFRTIHdvbid0IGFjY2VwdCB1bmtub3duIGFuZFxyXG4gICAgICAgIC8vIHdlIGNhbid0IGNhc3QgcHJvcGVybHkgaW4gYm90aCBlbnZpcm9ubWVudHMuXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICB0aGlzLnRpbWVySWQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZXJyb3JCYWNrb2ZmID0gMzAwMDAgLyogUkVUUllfQkFDS09GRl9NSU4gKi87XHJcbiAgICB9XHJcbiAgICBfc3RhcnQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNSdW5uaW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2NoZWR1bGUoKTtcclxuICAgIH1cclxuICAgIF9zdG9wKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc1J1bm5pbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmlzUnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLnRpbWVySWQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXJJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0SW50ZXJ2YWwod2FzRXJyb3IpIHtcclxuICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgaWYgKHdhc0Vycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGludGVydmFsID0gdGhpcy5lcnJvckJhY2tvZmY7XHJcbiAgICAgICAgICAgIHRoaXMuZXJyb3JCYWNrb2ZmID0gTWF0aC5taW4odGhpcy5lcnJvckJhY2tvZmYgKiAyLCA5NjAwMDAgLyogUkVUUllfQkFDS09GRl9NQVggKi8pO1xyXG4gICAgICAgICAgICByZXR1cm4gaW50ZXJ2YWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBSZXNldCB0aGUgZXJyb3IgYmFja29mZlxyXG4gICAgICAgICAgICB0aGlzLmVycm9yQmFja29mZiA9IDMwMDAwIC8qIFJFVFJZX0JBQ0tPRkZfTUlOICovO1xyXG4gICAgICAgICAgICBjb25zdCBleHBUaW1lID0gKF9hID0gdGhpcy51c2VyLnN0c1Rva2VuTWFuYWdlci5leHBpcmF0aW9uVGltZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSBleHBUaW1lIC0gRGF0ZS5ub3coKSAtIDMwMDAwMCAvKiBPRkZTRVQgKi87XHJcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCgwLCBpbnRlcnZhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc2NoZWR1bGUod2FzRXJyb3IgPSBmYWxzZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc1J1bm5pbmcpIHtcclxuICAgICAgICAgICAgLy8gSnVzdCBpbiBjYXNlLi4uXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSB0aGlzLmdldEludGVydmFsKHdhc0Vycm9yKTtcclxuICAgICAgICB0aGlzLnRpbWVySWQgPSBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5pdGVyYXRpb24oKTtcclxuICAgICAgICB9LCBpbnRlcnZhbCk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBpdGVyYXRpb24oKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy51c2VyLmdldElkVG9rZW4odHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIE9ubHkgcmV0cnkgb24gbmV0d29yayBlcnJvcnNcclxuICAgICAgICAgICAgaWYgKGUuY29kZSA9PT0gYGF1dGgvJHtcIm5ldHdvcmstcmVxdWVzdC1mYWlsZWRcIiAvKiBORVRXT1JLX1JFUVVFU1RfRkFJTEVEICovfWApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGUoLyogd2FzRXJyb3IgKi8gdHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNjaGVkdWxlKCk7XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgVXNlck1ldGFkYXRhIHtcclxuICAgIGNvbnN0cnVjdG9yKGNyZWF0ZWRBdCwgbGFzdExvZ2luQXQpIHtcclxuICAgICAgICB0aGlzLmNyZWF0ZWRBdCA9IGNyZWF0ZWRBdDtcclxuICAgICAgICB0aGlzLmxhc3RMb2dpbkF0ID0gbGFzdExvZ2luQXQ7XHJcbiAgICAgICAgdGhpcy5faW5pdGlhbGl6ZVRpbWUoKTtcclxuICAgIH1cclxuICAgIF9pbml0aWFsaXplVGltZSgpIHtcclxuICAgICAgICB0aGlzLmxhc3RTaWduSW5UaW1lID0gdXRjVGltZXN0YW1wVG9EYXRlU3RyaW5nKHRoaXMubGFzdExvZ2luQXQpO1xyXG4gICAgICAgIHRoaXMuY3JlYXRpb25UaW1lID0gdXRjVGltZXN0YW1wVG9EYXRlU3RyaW5nKHRoaXMuY3JlYXRlZEF0KTtcclxuICAgIH1cclxuICAgIF9jb3B5KG1ldGFkYXRhKSB7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVkQXQgPSBtZXRhZGF0YS5jcmVhdGVkQXQ7XHJcbiAgICAgICAgdGhpcy5sYXN0TG9naW5BdCA9IG1ldGFkYXRhLmxhc3RMb2dpbkF0O1xyXG4gICAgICAgIHRoaXMuX2luaXRpYWxpemVUaW1lKCk7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgY3JlYXRlZEF0OiB0aGlzLmNyZWF0ZWRBdCxcclxuICAgICAgICAgICAgbGFzdExvZ2luQXQ6IHRoaXMubGFzdExvZ2luQXRcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIF9yZWxvYWRXaXRob3V0U2F2aW5nKHVzZXIpIHtcclxuICAgIHZhciBfYTtcclxuICAgIGNvbnN0IGF1dGggPSB1c2VyLmF1dGg7XHJcbiAgICBjb25zdCBpZFRva2VuID0gYXdhaXQgdXNlci5nZXRJZFRva2VuKCk7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9sb2dvdXRJZkludmFsaWRhdGVkKHVzZXIsIGdldEFjY291bnRJbmZvKGF1dGgsIHsgaWRUb2tlbiB9KSk7XHJcbiAgICBfYXNzZXJ0KHJlc3BvbnNlID09PSBudWxsIHx8IHJlc3BvbnNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXNwb25zZS51c2Vycy5sZW5ndGgsIGF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICBjb25zdCBjb3JlQWNjb3VudCA9IHJlc3BvbnNlLnVzZXJzWzBdO1xyXG4gICAgdXNlci5fbm90aWZ5UmVsb2FkTGlzdGVuZXIoY29yZUFjY291bnQpO1xyXG4gICAgY29uc3QgbmV3UHJvdmlkZXJEYXRhID0gKChfYSA9IGNvcmVBY2NvdW50LnByb3ZpZGVyVXNlckluZm8pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpXHJcbiAgICAgICAgPyBleHRyYWN0UHJvdmlkZXJEYXRhKGNvcmVBY2NvdW50LnByb3ZpZGVyVXNlckluZm8pXHJcbiAgICAgICAgOiBbXTtcclxuICAgIGNvbnN0IHByb3ZpZGVyRGF0YSA9IG1lcmdlUHJvdmlkZXJEYXRhKHVzZXIucHJvdmlkZXJEYXRhLCBuZXdQcm92aWRlckRhdGEpO1xyXG4gICAgLy8gUHJlc2VydmVzIHRoZSBub24tbm9ueW1vdXMgc3RhdHVzIG9mIHRoZSBzdG9yZWQgdXNlciwgZXZlbiBpZiBubyBtb3JlXHJcbiAgICAvLyBjcmVkZW50aWFscyAoZmVkZXJhdGVkIG9yIGVtYWlsL3Bhc3N3b3JkKSBhcmUgbGlua2VkIHRvIHRoZSB1c2VyLiBJZlxyXG4gICAgLy8gdGhlIHVzZXIgd2FzIHByZXZpb3VzbHkgYW5vbnltb3VzLCB0aGVuIHVzZSBwcm92aWRlciBkYXRhIHRvIHVwZGF0ZS5cclxuICAgIC8vIE9uIHRoZSBvdGhlciBoYW5kLCBpZiBpdCB3YXMgbm90IGFub255bW91cyBiZWZvcmUsIGl0IHNob3VsZCBuZXZlciBiZVxyXG4gICAgLy8gY29uc2lkZXJlZCBhbm9ueW1vdXMgbm93LlxyXG4gICAgY29uc3Qgb2xkSXNBbm9ueW1vdXMgPSB1c2VyLmlzQW5vbnltb3VzO1xyXG4gICAgY29uc3QgbmV3SXNBbm9ueW1vdXMgPSAhKHVzZXIuZW1haWwgJiYgY29yZUFjY291bnQucGFzc3dvcmRIYXNoKSAmJiAhKHByb3ZpZGVyRGF0YSA9PT0gbnVsbCB8fCBwcm92aWRlckRhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHByb3ZpZGVyRGF0YS5sZW5ndGgpO1xyXG4gICAgY29uc3QgaXNBbm9ueW1vdXMgPSAhb2xkSXNBbm9ueW1vdXMgPyBmYWxzZSA6IG5ld0lzQW5vbnltb3VzO1xyXG4gICAgY29uc3QgdXBkYXRlcyA9IHtcclxuICAgICAgICB1aWQ6IGNvcmVBY2NvdW50LmxvY2FsSWQsXHJcbiAgICAgICAgZGlzcGxheU5hbWU6IGNvcmVBY2NvdW50LmRpc3BsYXlOYW1lIHx8IG51bGwsXHJcbiAgICAgICAgcGhvdG9VUkw6IGNvcmVBY2NvdW50LnBob3RvVXJsIHx8IG51bGwsXHJcbiAgICAgICAgZW1haWw6IGNvcmVBY2NvdW50LmVtYWlsIHx8IG51bGwsXHJcbiAgICAgICAgZW1haWxWZXJpZmllZDogY29yZUFjY291bnQuZW1haWxWZXJpZmllZCB8fCBmYWxzZSxcclxuICAgICAgICBwaG9uZU51bWJlcjogY29yZUFjY291bnQucGhvbmVOdW1iZXIgfHwgbnVsbCxcclxuICAgICAgICB0ZW5hbnRJZDogY29yZUFjY291bnQudGVuYW50SWQgfHwgbnVsbCxcclxuICAgICAgICBwcm92aWRlckRhdGEsXHJcbiAgICAgICAgbWV0YWRhdGE6IG5ldyBVc2VyTWV0YWRhdGEoY29yZUFjY291bnQuY3JlYXRlZEF0LCBjb3JlQWNjb3VudC5sYXN0TG9naW5BdCksXHJcbiAgICAgICAgaXNBbm9ueW1vdXNcclxuICAgIH07XHJcbiAgICBPYmplY3QuYXNzaWduKHVzZXIsIHVwZGF0ZXMpO1xyXG59XHJcbi8qKlxyXG4gKiBSZWxvYWRzIHVzZXIgYWNjb3VudCBkYXRhLCBpZiBzaWduZWQgaW4uXHJcbiAqXHJcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHJlbG9hZCh1c2VyKSB7XHJcbiAgICBjb25zdCB1c2VySW50ZXJuYWwgPSBnZXRNb2R1bGFySW5zdGFuY2UodXNlcik7XHJcbiAgICBhd2FpdCBfcmVsb2FkV2l0aG91dFNhdmluZyh1c2VySW50ZXJuYWwpO1xyXG4gICAgLy8gRXZlbiB0aG91Z2ggdGhlIGN1cnJlbnQgdXNlciBoYXNuJ3QgY2hhbmdlZCwgdXBkYXRlXHJcbiAgICAvLyBjdXJyZW50IHVzZXIgd2lsbCB0cmlnZ2VyIGEgcGVyc2lzdGVuY2UgdXBkYXRlIHcvIHRoZVxyXG4gICAgLy8gbmV3IGluZm8uXHJcbiAgICBhd2FpdCB1c2VySW50ZXJuYWwuYXV0aC5fcGVyc2lzdFVzZXJJZkN1cnJlbnQodXNlckludGVybmFsKTtcclxuICAgIHVzZXJJbnRlcm5hbC5hdXRoLl9ub3RpZnlMaXN0ZW5lcnNJZkN1cnJlbnQodXNlckludGVybmFsKTtcclxufVxyXG5mdW5jdGlvbiBtZXJnZVByb3ZpZGVyRGF0YShvcmlnaW5hbCwgbmV3RGF0YSkge1xyXG4gICAgY29uc3QgZGVkdXBlZCA9IG9yaWdpbmFsLmZpbHRlcihvID0+ICFuZXdEYXRhLnNvbWUobiA9PiBuLnByb3ZpZGVySWQgPT09IG8ucHJvdmlkZXJJZCkpO1xyXG4gICAgcmV0dXJuIFsuLi5kZWR1cGVkLCAuLi5uZXdEYXRhXTtcclxufVxyXG5mdW5jdGlvbiBleHRyYWN0UHJvdmlkZXJEYXRhKHByb3ZpZGVycykge1xyXG4gICAgcmV0dXJuIHByb3ZpZGVycy5tYXAoKF9hKSA9PiB7XHJcbiAgICAgICAgdmFyIHsgcHJvdmlkZXJJZCB9ID0gX2EsIHByb3ZpZGVyID0gX19yZXN0KF9hLCBbXCJwcm92aWRlcklkXCJdKTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBwcm92aWRlcklkLFxyXG4gICAgICAgICAgICB1aWQ6IHByb3ZpZGVyLnJhd0lkIHx8ICcnLFxyXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogcHJvdmlkZXIuZGlzcGxheU5hbWUgfHwgbnVsbCxcclxuICAgICAgICAgICAgZW1haWw6IHByb3ZpZGVyLmVtYWlsIHx8IG51bGwsXHJcbiAgICAgICAgICAgIHBob25lTnVtYmVyOiBwcm92aWRlci5waG9uZU51bWJlciB8fCBudWxsLFxyXG4gICAgICAgICAgICBwaG90b1VSTDogcHJvdmlkZXIucGhvdG9VcmwgfHwgbnVsbFxyXG4gICAgICAgIH07XHJcbiAgICB9KTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0U3RzVG9rZW4oYXV0aCwgcmVmcmVzaFRva2VuKSB7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9wZXJmb3JtRmV0Y2hXaXRoRXJyb3JIYW5kbGluZyhhdXRoLCB7fSwgYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGJvZHkgPSBxdWVyeXN0cmluZyh7XHJcbiAgICAgICAgICAgICdncmFudF90eXBlJzogJ3JlZnJlc2hfdG9rZW4nLFxyXG4gICAgICAgICAgICAncmVmcmVzaF90b2tlbic6IHJlZnJlc2hUb2tlblxyXG4gICAgICAgIH0pLnNsaWNlKDEpO1xyXG4gICAgICAgIGNvbnN0IHsgdG9rZW5BcGlIb3N0LCBhcGlLZXkgfSA9IGF1dGguY29uZmlnO1xyXG4gICAgICAgIGNvbnN0IHVybCA9IF9nZXRGaW5hbFRhcmdldChhdXRoLCB0b2tlbkFwaUhvc3QsIFwiL3YxL3Rva2VuXCIgLyogVE9LRU4gKi8sIGBrZXk9JHthcGlLZXl9YCk7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IGF1dGguX2dldEFkZGl0aW9uYWxIZWFkZXJzKCk7XHJcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiIC8qIENPTlRFTlRfVFlQRSAqL10gPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJztcclxuICAgICAgICByZXR1cm4gRmV0Y2hQcm92aWRlci5mZXRjaCgpKHVybCwge1xyXG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiIC8qIFBPU1QgKi8sXHJcbiAgICAgICAgICAgIGhlYWRlcnMsXHJcbiAgICAgICAgICAgIGJvZHlcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgLy8gVGhlIHJlc3BvbnNlIGNvbWVzIGJhY2sgaW4gc25ha2VfY2FzZS4gQ29udmVydCB0byBjYW1lbDpcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgYWNjZXNzVG9rZW46IHJlc3BvbnNlLmFjY2Vzc190b2tlbixcclxuICAgICAgICBleHBpcmVzSW46IHJlc3BvbnNlLmV4cGlyZXNfaW4sXHJcbiAgICAgICAgcmVmcmVzaFRva2VuOiByZXNwb25zZS5yZWZyZXNoX3Rva2VuXHJcbiAgICB9O1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBXZSBuZWVkIHRvIG1hcmsgdGhpcyBjbGFzcyBhcyBpbnRlcm5hbCBleHBsaWNpdGx5IHRvIGV4Y2x1ZGUgaXQgaW4gdGhlIHB1YmxpYyB0eXBpbmdzLCBiZWNhdXNlXHJcbiAqIGl0IHJlZmVyZW5jZXMgQXV0aEludGVybmFsIHdoaWNoIGhhcyBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgd2l0aCBVc2VySW50ZXJuYWwuXHJcbiAqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuY2xhc3MgU3RzVG9rZW5NYW5hZ2VyIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMucmVmcmVzaFRva2VuID0gbnVsbDtcclxuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gbnVsbDtcclxuICAgICAgICB0aGlzLmV4cGlyYXRpb25UaW1lID0gbnVsbDtcclxuICAgIH1cclxuICAgIGdldCBpc0V4cGlyZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuICghdGhpcy5leHBpcmF0aW9uVGltZSB8fFxyXG4gICAgICAgICAgICBEYXRlLm5vdygpID4gdGhpcy5leHBpcmF0aW9uVGltZSAtIDMwMDAwIC8qIFRPS0VOX1JFRlJFU0ggKi8pO1xyXG4gICAgfVxyXG4gICAgdXBkYXRlRnJvbVNlcnZlclJlc3BvbnNlKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgX2Fzc2VydChyZXNwb25zZS5pZFRva2VuLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgIF9hc3NlcnQodHlwZW9mIHJlc3BvbnNlLmlkVG9rZW4gIT09ICd1bmRlZmluZWQnLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgIF9hc3NlcnQodHlwZW9mIHJlc3BvbnNlLnJlZnJlc2hUb2tlbiAhPT0gJ3VuZGVmaW5lZCcsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgY29uc3QgZXhwaXJlc0luID0gJ2V4cGlyZXNJbicgaW4gcmVzcG9uc2UgJiYgdHlwZW9mIHJlc3BvbnNlLmV4cGlyZXNJbiAhPT0gJ3VuZGVmaW5lZCdcclxuICAgICAgICAgICAgPyBOdW1iZXIocmVzcG9uc2UuZXhwaXJlc0luKVxyXG4gICAgICAgICAgICA6IF90b2tlbkV4cGlyZXNJbihyZXNwb25zZS5pZFRva2VuKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVRva2Vuc0FuZEV4cGlyYXRpb24ocmVzcG9uc2UuaWRUb2tlbiwgcmVzcG9uc2UucmVmcmVzaFRva2VuLCBleHBpcmVzSW4pO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgZ2V0VG9rZW4oYXV0aCwgZm9yY2VSZWZyZXNoID0gZmFsc2UpIHtcclxuICAgICAgICBfYXNzZXJ0KCF0aGlzLmFjY2Vzc1Rva2VuIHx8IHRoaXMucmVmcmVzaFRva2VuLCBhdXRoLCBcInVzZXItdG9rZW4tZXhwaXJlZFwiIC8qIFRPS0VOX0VYUElSRUQgKi8pO1xyXG4gICAgICAgIGlmICghZm9yY2VSZWZyZXNoICYmIHRoaXMuYWNjZXNzVG9rZW4gJiYgIXRoaXMuaXNFeHBpcmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFjY2Vzc1Rva2VuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5yZWZyZXNoVG9rZW4pIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKGF1dGgsIHRoaXMucmVmcmVzaFRva2VuKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWNjZXNzVG9rZW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgY2xlYXJSZWZyZXNoVG9rZW4oKSB7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW4gPSBudWxsO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgcmVmcmVzaChhdXRoLCBvbGRUb2tlbikge1xyXG4gICAgICAgIGNvbnN0IHsgYWNjZXNzVG9rZW4sIHJlZnJlc2hUb2tlbiwgZXhwaXJlc0luIH0gPSBhd2FpdCByZXF1ZXN0U3RzVG9rZW4oYXV0aCwgb2xkVG9rZW4pO1xyXG4gICAgICAgIHRoaXMudXBkYXRlVG9rZW5zQW5kRXhwaXJhdGlvbihhY2Nlc3NUb2tlbiwgcmVmcmVzaFRva2VuLCBOdW1iZXIoZXhwaXJlc0luKSk7XHJcbiAgICB9XHJcbiAgICB1cGRhdGVUb2tlbnNBbmRFeHBpcmF0aW9uKGFjY2Vzc1Rva2VuLCByZWZyZXNoVG9rZW4sIGV4cGlyZXNJblNlYykge1xyXG4gICAgICAgIHRoaXMucmVmcmVzaFRva2VuID0gcmVmcmVzaFRva2VuIHx8IG51bGw7XHJcbiAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IGFjY2Vzc1Rva2VuIHx8IG51bGw7XHJcbiAgICAgICAgdGhpcy5leHBpcmF0aW9uVGltZSA9IERhdGUubm93KCkgKyBleHBpcmVzSW5TZWMgKiAxMDAwO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGZyb21KU09OKGFwcE5hbWUsIG9iamVjdCkge1xyXG4gICAgICAgIGNvbnN0IHsgcmVmcmVzaFRva2VuLCBhY2Nlc3NUb2tlbiwgZXhwaXJhdGlvblRpbWUgfSA9IG9iamVjdDtcclxuICAgICAgICBjb25zdCBtYW5hZ2VyID0gbmV3IFN0c1Rva2VuTWFuYWdlcigpO1xyXG4gICAgICAgIGlmIChyZWZyZXNoVG9rZW4pIHtcclxuICAgICAgICAgICAgX2Fzc2VydCh0eXBlb2YgcmVmcmVzaFRva2VuID09PSAnc3RyaW5nJywgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovLCB7XHJcbiAgICAgICAgICAgICAgICBhcHBOYW1lXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBtYW5hZ2VyLnJlZnJlc2hUb2tlbiA9IHJlZnJlc2hUb2tlbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFjY2Vzc1Rva2VuKSB7XHJcbiAgICAgICAgICAgIF9hc3NlcnQodHlwZW9mIGFjY2Vzc1Rva2VuID09PSAnc3RyaW5nJywgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovLCB7XHJcbiAgICAgICAgICAgICAgICBhcHBOYW1lXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBtYW5hZ2VyLmFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChleHBpcmF0aW9uVGltZSkge1xyXG4gICAgICAgICAgICBfYXNzZXJ0KHR5cGVvZiBleHBpcmF0aW9uVGltZSA9PT0gJ251bWJlcicsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLywge1xyXG4gICAgICAgICAgICAgICAgYXBwTmFtZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgbWFuYWdlci5leHBpcmF0aW9uVGltZSA9IGV4cGlyYXRpb25UaW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbWFuYWdlcjtcclxuICAgIH1cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICByZWZyZXNoVG9rZW46IHRoaXMucmVmcmVzaFRva2VuLFxyXG4gICAgICAgICAgICBhY2Nlc3NUb2tlbjogdGhpcy5hY2Nlc3NUb2tlbixcclxuICAgICAgICAgICAgZXhwaXJhdGlvblRpbWU6IHRoaXMuZXhwaXJhdGlvblRpbWVcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgX2Fzc2lnbihzdHNUb2tlbk1hbmFnZXIpIHtcclxuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gc3RzVG9rZW5NYW5hZ2VyLmFjY2Vzc1Rva2VuO1xyXG4gICAgICAgIHRoaXMucmVmcmVzaFRva2VuID0gc3RzVG9rZW5NYW5hZ2VyLnJlZnJlc2hUb2tlbjtcclxuICAgICAgICB0aGlzLmV4cGlyYXRpb25UaW1lID0gc3RzVG9rZW5NYW5hZ2VyLmV4cGlyYXRpb25UaW1lO1xyXG4gICAgfVxyXG4gICAgX2Nsb25lKCkge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBTdHNUb2tlbk1hbmFnZXIoKSwgdGhpcy50b0pTT04oKSk7XHJcbiAgICB9XHJcbiAgICBfcGVyZm9ybVJlZnJlc2goKSB7XHJcbiAgICAgICAgcmV0dXJuIGRlYnVnRmFpbCgnbm90IGltcGxlbWVudGVkJyk7XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gYXNzZXJ0U3RyaW5nT3JVbmRlZmluZWQoYXNzZXJ0aW9uLCBhcHBOYW1lKSB7XHJcbiAgICBfYXNzZXJ0KHR5cGVvZiBhc3NlcnRpb24gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBhc3NlcnRpb24gPT09ICd1bmRlZmluZWQnLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8sIHsgYXBwTmFtZSB9KTtcclxufVxyXG5jbGFzcyBVc2VySW1wbCB7XHJcbiAgICBjb25zdHJ1Y3RvcihfYSkge1xyXG4gICAgICAgIHZhciB7IHVpZCwgYXV0aCwgc3RzVG9rZW5NYW5hZ2VyIH0gPSBfYSwgb3B0ID0gX19yZXN0KF9hLCBbXCJ1aWRcIiwgXCJhdXRoXCIsIFwic3RzVG9rZW5NYW5hZ2VyXCJdKTtcclxuICAgICAgICAvLyBGb3IgdGhlIHVzZXIgb2JqZWN0LCBwcm92aWRlciBpcyBhbHdheXMgRmlyZWJhc2UuXHJcbiAgICAgICAgdGhpcy5wcm92aWRlcklkID0gXCJmaXJlYmFzZVwiIC8qIEZJUkVCQVNFICovO1xyXG4gICAgICAgIHRoaXMucHJvYWN0aXZlUmVmcmVzaCA9IG5ldyBQcm9hY3RpdmVSZWZyZXNoKHRoaXMpO1xyXG4gICAgICAgIHRoaXMucmVsb2FkVXNlckluZm8gPSBudWxsO1xyXG4gICAgICAgIHRoaXMucmVsb2FkTGlzdGVuZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMudWlkID0gdWlkO1xyXG4gICAgICAgIHRoaXMuYXV0aCA9IGF1dGg7XHJcbiAgICAgICAgdGhpcy5zdHNUb2tlbk1hbmFnZXIgPSBzdHNUb2tlbk1hbmFnZXI7XHJcbiAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IHN0c1Rva2VuTWFuYWdlci5hY2Nlc3NUb2tlbjtcclxuICAgICAgICB0aGlzLmRpc3BsYXlOYW1lID0gb3B0LmRpc3BsYXlOYW1lIHx8IG51bGw7XHJcbiAgICAgICAgdGhpcy5lbWFpbCA9IG9wdC5lbWFpbCB8fCBudWxsO1xyXG4gICAgICAgIHRoaXMuZW1haWxWZXJpZmllZCA9IG9wdC5lbWFpbFZlcmlmaWVkIHx8IGZhbHNlO1xyXG4gICAgICAgIHRoaXMucGhvbmVOdW1iZXIgPSBvcHQucGhvbmVOdW1iZXIgfHwgbnVsbDtcclxuICAgICAgICB0aGlzLnBob3RvVVJMID0gb3B0LnBob3RvVVJMIHx8IG51bGw7XHJcbiAgICAgICAgdGhpcy5pc0Fub255bW91cyA9IG9wdC5pc0Fub255bW91cyB8fCBmYWxzZTtcclxuICAgICAgICB0aGlzLnRlbmFudElkID0gb3B0LnRlbmFudElkIHx8IG51bGw7XHJcbiAgICAgICAgdGhpcy5wcm92aWRlckRhdGEgPSBvcHQucHJvdmlkZXJEYXRhID8gWy4uLm9wdC5wcm92aWRlckRhdGFdIDogW107XHJcbiAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG5ldyBVc2VyTWV0YWRhdGEob3B0LmNyZWF0ZWRBdCB8fCB1bmRlZmluZWQsIG9wdC5sYXN0TG9naW5BdCB8fCB1bmRlZmluZWQpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgZ2V0SWRUb2tlbihmb3JjZVJlZnJlc2gpIHtcclxuICAgICAgICBjb25zdCBhY2Nlc3NUb2tlbiA9IGF3YWl0IF9sb2dvdXRJZkludmFsaWRhdGVkKHRoaXMsIHRoaXMuc3RzVG9rZW5NYW5hZ2VyLmdldFRva2VuKHRoaXMuYXV0aCwgZm9yY2VSZWZyZXNoKSk7XHJcbiAgICAgICAgX2Fzc2VydChhY2Nlc3NUb2tlbiwgdGhpcy5hdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgIGlmICh0aGlzLmFjY2Vzc1Rva2VuICE9PSBhY2Nlc3NUb2tlbikge1xyXG4gICAgICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW47XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXV0aC5fcGVyc2lzdFVzZXJJZkN1cnJlbnQodGhpcyk7XHJcbiAgICAgICAgICAgIHRoaXMuYXV0aC5fbm90aWZ5TGlzdGVuZXJzSWZDdXJyZW50KHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYWNjZXNzVG9rZW47XHJcbiAgICB9XHJcbiAgICBnZXRJZFRva2VuUmVzdWx0KGZvcmNlUmVmcmVzaCkge1xyXG4gICAgICAgIHJldHVybiBnZXRJZFRva2VuUmVzdWx0KHRoaXMsIGZvcmNlUmVmcmVzaCk7XHJcbiAgICB9XHJcbiAgICByZWxvYWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlbG9hZCh0aGlzKTtcclxuICAgIH1cclxuICAgIF9hc3NpZ24odXNlcikge1xyXG4gICAgICAgIGlmICh0aGlzID09PSB1c2VyKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgX2Fzc2VydCh0aGlzLnVpZCA9PT0gdXNlci51aWQsIHRoaXMuYXV0aCwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovKTtcclxuICAgICAgICB0aGlzLmRpc3BsYXlOYW1lID0gdXNlci5kaXNwbGF5TmFtZTtcclxuICAgICAgICB0aGlzLnBob3RvVVJMID0gdXNlci5waG90b1VSTDtcclxuICAgICAgICB0aGlzLmVtYWlsID0gdXNlci5lbWFpbDtcclxuICAgICAgICB0aGlzLmVtYWlsVmVyaWZpZWQgPSB1c2VyLmVtYWlsVmVyaWZpZWQ7XHJcbiAgICAgICAgdGhpcy5waG9uZU51bWJlciA9IHVzZXIucGhvbmVOdW1iZXI7XHJcbiAgICAgICAgdGhpcy5pc0Fub255bW91cyA9IHVzZXIuaXNBbm9ueW1vdXM7XHJcbiAgICAgICAgdGhpcy50ZW5hbnRJZCA9IHVzZXIudGVuYW50SWQ7XHJcbiAgICAgICAgdGhpcy5wcm92aWRlckRhdGEgPSB1c2VyLnByb3ZpZGVyRGF0YS5tYXAodXNlckluZm8gPT4gKE9iamVjdC5hc3NpZ24oe30sIHVzZXJJbmZvKSkpO1xyXG4gICAgICAgIHRoaXMubWV0YWRhdGEuX2NvcHkodXNlci5tZXRhZGF0YSk7XHJcbiAgICAgICAgdGhpcy5zdHNUb2tlbk1hbmFnZXIuX2Fzc2lnbih1c2VyLnN0c1Rva2VuTWFuYWdlcik7XHJcbiAgICB9XHJcbiAgICBfY2xvbmUoYXV0aCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgVXNlckltcGwoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0aGlzKSwgeyBhdXRoLCBzdHNUb2tlbk1hbmFnZXI6IHRoaXMuc3RzVG9rZW5NYW5hZ2VyLl9jbG9uZSgpIH0pKTtcclxuICAgIH1cclxuICAgIF9vblJlbG9hZChjYWxsYmFjaykge1xyXG4gICAgICAgIC8vIFRoZXJlIHNob3VsZCBvbmx5IGV2ZXIgYmUgb25lIGxpc3RlbmVyLCBhbmQgdGhhdCBpcyBhIHNpbmdsZSBpbnN0YW5jZSBvZiBNdWx0aUZhY3RvclVzZXJcclxuICAgICAgICBfYXNzZXJ0KCF0aGlzLnJlbG9hZExpc3RlbmVyLCB0aGlzLmF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgdGhpcy5yZWxvYWRMaXN0ZW5lciA9IGNhbGxiYWNrO1xyXG4gICAgICAgIGlmICh0aGlzLnJlbG9hZFVzZXJJbmZvKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX25vdGlmeVJlbG9hZExpc3RlbmVyKHRoaXMucmVsb2FkVXNlckluZm8pO1xyXG4gICAgICAgICAgICB0aGlzLnJlbG9hZFVzZXJJbmZvID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBfbm90aWZ5UmVsb2FkTGlzdGVuZXIodXNlckluZm8pIHtcclxuICAgICAgICBpZiAodGhpcy5yZWxvYWRMaXN0ZW5lcikge1xyXG4gICAgICAgICAgICB0aGlzLnJlbG9hZExpc3RlbmVyKHVzZXJJbmZvKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIElmIG5vIGxpc3RlbmVyIGlzIHN1YnNjcmliZWQgeWV0LCBzYXZlIHRoZSByZXN1bHQgc28gaXQncyBhdmFpbGFibGUgd2hlbiB0aGV5IGRvIHN1YnNjcmliZVxyXG4gICAgICAgICAgICB0aGlzLnJlbG9hZFVzZXJJbmZvID0gdXNlckluZm87XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgX3N0YXJ0UHJvYWN0aXZlUmVmcmVzaCgpIHtcclxuICAgICAgICB0aGlzLnByb2FjdGl2ZVJlZnJlc2guX3N0YXJ0KCk7XHJcbiAgICB9XHJcbiAgICBfc3RvcFByb2FjdGl2ZVJlZnJlc2goKSB7XHJcbiAgICAgICAgdGhpcy5wcm9hY3RpdmVSZWZyZXNoLl9zdG9wKCk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBfdXBkYXRlVG9rZW5zSWZOZWNlc3NhcnkocmVzcG9uc2UsIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICAgICAgbGV0IHRva2Vuc1JlZnJlc2hlZCA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5pZFRva2VuICYmXHJcbiAgICAgICAgICAgIHJlc3BvbnNlLmlkVG9rZW4gIT09IHRoaXMuc3RzVG9rZW5NYW5hZ2VyLmFjY2Vzc1Rva2VuKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RzVG9rZW5NYW5hZ2VyLnVwZGF0ZUZyb21TZXJ2ZXJSZXNwb25zZShyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIHRva2Vuc1JlZnJlc2hlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZWxvYWQpIHtcclxuICAgICAgICAgICAgYXdhaXQgX3JlbG9hZFdpdGhvdXRTYXZpbmcodGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuYXV0aC5fcGVyc2lzdFVzZXJJZkN1cnJlbnQodGhpcyk7XHJcbiAgICAgICAgaWYgKHRva2Vuc1JlZnJlc2hlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmF1dGguX25vdGlmeUxpc3RlbmVyc0lmQ3VycmVudCh0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhc3luYyBkZWxldGUoKSB7XHJcbiAgICAgICAgY29uc3QgaWRUb2tlbiA9IGF3YWl0IHRoaXMuZ2V0SWRUb2tlbigpO1xyXG4gICAgICAgIGF3YWl0IF9sb2dvdXRJZkludmFsaWRhdGVkKHRoaXMsIGRlbGV0ZUFjY291bnQodGhpcy5hdXRoLCB7IGlkVG9rZW4gfSkpO1xyXG4gICAgICAgIHRoaXMuc3RzVG9rZW5NYW5hZ2VyLmNsZWFyUmVmcmVzaFRva2VuKCk7XHJcbiAgICAgICAgLy8gVE9ETzogRGV0ZXJtaW5lIGlmIGNhbmNlbGxhYmxlLXByb21pc2VzIGFyZSBuZWNlc3NhcnkgdG8gdXNlIGluIHRoaXMgY2xhc3Mgc28gdGhhdCBkZWxldGUoKVxyXG4gICAgICAgIC8vICAgICAgIGNhbmNlbHMgcGVuZGluZyBhY3Rpb25zLi4uXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXV0aC5zaWduT3V0KCk7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7IHVpZDogdGhpcy51aWQsIGVtYWlsOiB0aGlzLmVtYWlsIHx8IHVuZGVmaW5lZCwgZW1haWxWZXJpZmllZDogdGhpcy5lbWFpbFZlcmlmaWVkLCBkaXNwbGF5TmFtZTogdGhpcy5kaXNwbGF5TmFtZSB8fCB1bmRlZmluZWQsIGlzQW5vbnltb3VzOiB0aGlzLmlzQW5vbnltb3VzLCBwaG90b1VSTDogdGhpcy5waG90b1VSTCB8fCB1bmRlZmluZWQsIHBob25lTnVtYmVyOiB0aGlzLnBob25lTnVtYmVyIHx8IHVuZGVmaW5lZCwgdGVuYW50SWQ6IHRoaXMudGVuYW50SWQgfHwgdW5kZWZpbmVkLCBwcm92aWRlckRhdGE6IHRoaXMucHJvdmlkZXJEYXRhLm1hcCh1c2VySW5mbyA9PiAoT2JqZWN0LmFzc2lnbih7fSwgdXNlckluZm8pKSksIHN0c1Rva2VuTWFuYWdlcjogdGhpcy5zdHNUb2tlbk1hbmFnZXIudG9KU09OKCksIFxyXG4gICAgICAgICAgICAvLyBSZWRpcmVjdCBldmVudCBJRCBtdXN0IGJlIG1haW50YWluZWQgaW4gY2FzZSB0aGVyZSBpcyBhIHBlbmRpbmdcclxuICAgICAgICAgICAgLy8gcmVkaXJlY3QgZXZlbnQuXHJcbiAgICAgICAgICAgIF9yZWRpcmVjdEV2ZW50SWQ6IHRoaXMuX3JlZGlyZWN0RXZlbnRJZCB9LCB0aGlzLm1ldGFkYXRhLnRvSlNPTigpKSwgeyBcclxuICAgICAgICAgICAgLy8gUmVxdWlyZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgbGVnYWN5IFNESyAoZ28vZmlyZWJhc2UtYXV0aC1zZGstcGVyc2lzdGVuY2UtcGFyc2luZyk6XHJcbiAgICAgICAgICAgIGFwaUtleTogdGhpcy5hdXRoLmNvbmZpZy5hcGlLZXksIGFwcE5hbWU6IHRoaXMuYXV0aC5uYW1lIH0pO1xyXG4gICAgfVxyXG4gICAgZ2V0IHJlZnJlc2hUb2tlbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdHNUb2tlbk1hbmFnZXIucmVmcmVzaFRva2VuIHx8ICcnO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIF9mcm9tSlNPTihhdXRoLCBvYmplY3QpIHtcclxuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oO1xyXG4gICAgICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gKF9hID0gb2JqZWN0LmRpc3BsYXlOYW1lKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgY29uc3QgZW1haWwgPSAoX2IgPSBvYmplY3QuZW1haWwpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHVuZGVmaW5lZDtcclxuICAgICAgICBjb25zdCBwaG9uZU51bWJlciA9IChfYyA9IG9iamVjdC5waG9uZU51bWJlcikgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIGNvbnN0IHBob3RvVVJMID0gKF9kID0gb2JqZWN0LnBob3RvVVJMKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgY29uc3QgdGVuYW50SWQgPSAoX2UgPSBvYmplY3QudGVuYW50SWQpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IHVuZGVmaW5lZDtcclxuICAgICAgICBjb25zdCBfcmVkaXJlY3RFdmVudElkID0gKF9mID0gb2JqZWN0Ll9yZWRpcmVjdEV2ZW50SWQpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IHVuZGVmaW5lZDtcclxuICAgICAgICBjb25zdCBjcmVhdGVkQXQgPSAoX2cgPSBvYmplY3QuY3JlYXRlZEF0KSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgY29uc3QgbGFzdExvZ2luQXQgPSAoX2ggPSBvYmplY3QubGFzdExvZ2luQXQpICE9PSBudWxsICYmIF9oICE9PSB2b2lkIDAgPyBfaCA6IHVuZGVmaW5lZDtcclxuICAgICAgICBjb25zdCB7IHVpZCwgZW1haWxWZXJpZmllZCwgaXNBbm9ueW1vdXMsIHByb3ZpZGVyRGF0YSwgc3RzVG9rZW5NYW5hZ2VyOiBwbGFpbk9iamVjdFRva2VuTWFuYWdlciB9ID0gb2JqZWN0O1xyXG4gICAgICAgIF9hc3NlcnQodWlkICYmIHBsYWluT2JqZWN0VG9rZW5NYW5hZ2VyLCBhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgIGNvbnN0IHN0c1Rva2VuTWFuYWdlciA9IFN0c1Rva2VuTWFuYWdlci5mcm9tSlNPTih0aGlzLm5hbWUsIHBsYWluT2JqZWN0VG9rZW5NYW5hZ2VyKTtcclxuICAgICAgICBfYXNzZXJ0KHR5cGVvZiB1aWQgPT09ICdzdHJpbmcnLCBhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgIGFzc2VydFN0cmluZ09yVW5kZWZpbmVkKGRpc3BsYXlOYW1lLCBhdXRoLm5hbWUpO1xyXG4gICAgICAgIGFzc2VydFN0cmluZ09yVW5kZWZpbmVkKGVtYWlsLCBhdXRoLm5hbWUpO1xyXG4gICAgICAgIF9hc3NlcnQodHlwZW9mIGVtYWlsVmVyaWZpZWQgPT09ICdib29sZWFuJywgYXV0aCwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovKTtcclxuICAgICAgICBfYXNzZXJ0KHR5cGVvZiBpc0Fub255bW91cyA9PT0gJ2Jvb2xlYW4nLCBhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgIGFzc2VydFN0cmluZ09yVW5kZWZpbmVkKHBob25lTnVtYmVyLCBhdXRoLm5hbWUpO1xyXG4gICAgICAgIGFzc2VydFN0cmluZ09yVW5kZWZpbmVkKHBob3RvVVJMLCBhdXRoLm5hbWUpO1xyXG4gICAgICAgIGFzc2VydFN0cmluZ09yVW5kZWZpbmVkKHRlbmFudElkLCBhdXRoLm5hbWUpO1xyXG4gICAgICAgIGFzc2VydFN0cmluZ09yVW5kZWZpbmVkKF9yZWRpcmVjdEV2ZW50SWQsIGF1dGgubmFtZSk7XHJcbiAgICAgICAgYXNzZXJ0U3RyaW5nT3JVbmRlZmluZWQoY3JlYXRlZEF0LCBhdXRoLm5hbWUpO1xyXG4gICAgICAgIGFzc2VydFN0cmluZ09yVW5kZWZpbmVkKGxhc3RMb2dpbkF0LCBhdXRoLm5hbWUpO1xyXG4gICAgICAgIGNvbnN0IHVzZXIgPSBuZXcgVXNlckltcGwoe1xyXG4gICAgICAgICAgICB1aWQsXHJcbiAgICAgICAgICAgIGF1dGgsXHJcbiAgICAgICAgICAgIGVtYWlsLFxyXG4gICAgICAgICAgICBlbWFpbFZlcmlmaWVkLFxyXG4gICAgICAgICAgICBkaXNwbGF5TmFtZSxcclxuICAgICAgICAgICAgaXNBbm9ueW1vdXMsXHJcbiAgICAgICAgICAgIHBob3RvVVJMLFxyXG4gICAgICAgICAgICBwaG9uZU51bWJlcixcclxuICAgICAgICAgICAgdGVuYW50SWQsXHJcbiAgICAgICAgICAgIHN0c1Rva2VuTWFuYWdlcixcclxuICAgICAgICAgICAgY3JlYXRlZEF0LFxyXG4gICAgICAgICAgICBsYXN0TG9naW5BdFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChwcm92aWRlckRhdGEgJiYgQXJyYXkuaXNBcnJheShwcm92aWRlckRhdGEpKSB7XHJcbiAgICAgICAgICAgIHVzZXIucHJvdmlkZXJEYXRhID0gcHJvdmlkZXJEYXRhLm1hcCh1c2VySW5mbyA9PiAoT2JqZWN0LmFzc2lnbih7fSwgdXNlckluZm8pKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChfcmVkaXJlY3RFdmVudElkKSB7XHJcbiAgICAgICAgICAgIHVzZXIuX3JlZGlyZWN0RXZlbnRJZCA9IF9yZWRpcmVjdEV2ZW50SWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1c2VyO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplIGEgVXNlciBmcm9tIGFuIGlkVG9rZW4gc2VydmVyIHJlc3BvbnNlXHJcbiAgICAgKiBAcGFyYW0gYXV0aFxyXG4gICAgICogQHBhcmFtIGlkVG9rZW5SZXNwb25zZVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgYXN5bmMgX2Zyb21JZFRva2VuUmVzcG9uc2UoYXV0aCwgaWRUb2tlblJlc3BvbnNlLCBpc0Fub255bW91cyA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3Qgc3RzVG9rZW5NYW5hZ2VyID0gbmV3IFN0c1Rva2VuTWFuYWdlcigpO1xyXG4gICAgICAgIHN0c1Rva2VuTWFuYWdlci51cGRhdGVGcm9tU2VydmVyUmVzcG9uc2UoaWRUb2tlblJlc3BvbnNlKTtcclxuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBGaXJlYmFzZSBBdXRoIHVzZXIuXHJcbiAgICAgICAgY29uc3QgdXNlciA9IG5ldyBVc2VySW1wbCh7XHJcbiAgICAgICAgICAgIHVpZDogaWRUb2tlblJlc3BvbnNlLmxvY2FsSWQsXHJcbiAgICAgICAgICAgIGF1dGgsXHJcbiAgICAgICAgICAgIHN0c1Rva2VuTWFuYWdlcixcclxuICAgICAgICAgICAgaXNBbm9ueW1vdXNcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBVcGRhdGVzIHRoZSB1c2VyIGluZm8gYW5kIGRhdGEgYW5kIHJlc29sdmVzIHdpdGggYSB1c2VyIGluc3RhbmNlLlxyXG4gICAgICAgIGF3YWl0IF9yZWxvYWRXaXRob3V0U2F2aW5nKHVzZXIpO1xyXG4gICAgICAgIHJldHVybiB1c2VyO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNsYXNzIEluTWVtb3J5UGVyc2lzdGVuY2Uge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy50eXBlID0gXCJOT05FXCIgLyogTk9ORSAqLztcclxuICAgICAgICB0aGlzLnN0b3JhZ2UgPSB7fTtcclxuICAgIH1cclxuICAgIGFzeW5jIF9pc0F2YWlsYWJsZSgpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGFzeW5jIF9zZXQoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuc3RvcmFnZVtrZXldID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgICBhc3luYyBfZ2V0KGtleSkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5zdG9yYWdlW2tleV07XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyBudWxsIDogdmFsdWU7XHJcbiAgICB9XHJcbiAgICBhc3luYyBfcmVtb3ZlKGtleSkge1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLnN0b3JhZ2Vba2V5XTtcclxuICAgIH1cclxuICAgIF9hZGRMaXN0ZW5lcihfa2V5LCBfbGlzdGVuZXIpIHtcclxuICAgICAgICAvLyBMaXN0ZW5lcnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIGluLW1lbW9yeSBzdG9yYWdlIHNpbmNlIGl0IGNhbm5vdCBiZSBzaGFyZWQgYWNyb3NzIHdpbmRvd3Mvd29ya2Vyc1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIF9yZW1vdmVMaXN0ZW5lcihfa2V5LCBfbGlzdGVuZXIpIHtcclxuICAgICAgICAvLyBMaXN0ZW5lcnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIGluLW1lbW9yeSBzdG9yYWdlIHNpbmNlIGl0IGNhbm5vdCBiZSBzaGFyZWQgYWNyb3NzIHdpbmRvd3Mvd29ya2Vyc1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxufVxyXG5Jbk1lbW9yeVBlcnNpc3RlbmNlLnR5cGUgPSAnTk9ORSc7XHJcbi8qKlxyXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgUGVyc2lzdGVuY2V9IG9mIHR5cGUgJ05PTkUnLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jb25zdCBpbk1lbW9yeVBlcnNpc3RlbmNlID0gSW5NZW1vcnlQZXJzaXN0ZW5jZTtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gX3BlcnNpc3RlbmNlS2V5TmFtZShrZXksIGFwaUtleSwgYXBwTmFtZSkge1xyXG4gICAgcmV0dXJuIGAke1wiZmlyZWJhc2VcIiAvKiBQRVJTSVNURU5DRSAqL306JHtrZXl9OiR7YXBpS2V5fToke2FwcE5hbWV9YDtcclxufVxyXG5jbGFzcyBQZXJzaXN0ZW5jZVVzZXJNYW5hZ2VyIHtcclxuICAgIGNvbnN0cnVjdG9yKHBlcnNpc3RlbmNlLCBhdXRoLCB1c2VyS2V5KSB7XHJcbiAgICAgICAgdGhpcy5wZXJzaXN0ZW5jZSA9IHBlcnNpc3RlbmNlO1xyXG4gICAgICAgIHRoaXMuYXV0aCA9IGF1dGg7XHJcbiAgICAgICAgdGhpcy51c2VyS2V5ID0gdXNlcktleTtcclxuICAgICAgICBjb25zdCB7IGNvbmZpZywgbmFtZSB9ID0gdGhpcy5hdXRoO1xyXG4gICAgICAgIHRoaXMuZnVsbFVzZXJLZXkgPSBfcGVyc2lzdGVuY2VLZXlOYW1lKHRoaXMudXNlcktleSwgY29uZmlnLmFwaUtleSwgbmFtZSk7XHJcbiAgICAgICAgdGhpcy5mdWxsUGVyc2lzdGVuY2VLZXkgPSBfcGVyc2lzdGVuY2VLZXlOYW1lKFwicGVyc2lzdGVuY2VcIiAvKiBQRVJTSVNURU5DRV9VU0VSICovLCBjb25maWcuYXBpS2V5LCBuYW1lKTtcclxuICAgICAgICB0aGlzLmJvdW5kRXZlbnRIYW5kbGVyID0gYXV0aC5fb25TdG9yYWdlRXZlbnQuYmluZChhdXRoKTtcclxuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlLl9hZGRMaXN0ZW5lcih0aGlzLmZ1bGxVc2VyS2V5LCB0aGlzLmJvdW5kRXZlbnRIYW5kbGVyKTtcclxuICAgIH1cclxuICAgIHNldEN1cnJlbnRVc2VyKHVzZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZS5fc2V0KHRoaXMuZnVsbFVzZXJLZXksIHVzZXIudG9KU09OKCkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgZ2V0Q3VycmVudFVzZXIoKSB7XHJcbiAgICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IHRoaXMucGVyc2lzdGVuY2UuX2dldCh0aGlzLmZ1bGxVc2VyS2V5KTtcclxuICAgICAgICByZXR1cm4gYmxvYiA/IFVzZXJJbXBsLl9mcm9tSlNPTih0aGlzLmF1dGgsIGJsb2IpIDogbnVsbDtcclxuICAgIH1cclxuICAgIHJlbW92ZUN1cnJlbnRVc2VyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlLl9yZW1vdmUodGhpcy5mdWxsVXNlcktleSk7XHJcbiAgICB9XHJcbiAgICBzYXZlUGVyc2lzdGVuY2VGb3JSZWRpcmVjdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZS5fc2V0KHRoaXMuZnVsbFBlcnNpc3RlbmNlS2V5LCB0aGlzLnBlcnNpc3RlbmNlLnR5cGUpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgc2V0UGVyc2lzdGVuY2UobmV3UGVyc2lzdGVuY2UpIHtcclxuICAgICAgICBpZiAodGhpcy5wZXJzaXN0ZW5jZSA9PT0gbmV3UGVyc2lzdGVuY2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjdXJyZW50VXNlciA9IGF3YWl0IHRoaXMuZ2V0Q3VycmVudFVzZXIoKTtcclxuICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZUN1cnJlbnRVc2VyKCk7XHJcbiAgICAgICAgdGhpcy5wZXJzaXN0ZW5jZSA9IG5ld1BlcnNpc3RlbmNlO1xyXG4gICAgICAgIGlmIChjdXJyZW50VXNlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRDdXJyZW50VXNlcihjdXJyZW50VXNlcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZGVsZXRlKCkge1xyXG4gICAgICAgIHRoaXMucGVyc2lzdGVuY2UuX3JlbW92ZUxpc3RlbmVyKHRoaXMuZnVsbFVzZXJLZXksIHRoaXMuYm91bmRFdmVudEhhbmRsZXIpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGNyZWF0ZShhdXRoLCBwZXJzaXN0ZW5jZUhpZXJhcmNoeSwgdXNlcktleSA9IFwiYXV0aFVzZXJcIiAvKiBBVVRIX1VTRVIgKi8pIHtcclxuICAgICAgICBpZiAoIXBlcnNpc3RlbmNlSGllcmFyY2h5Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFBlcnNpc3RlbmNlVXNlck1hbmFnZXIoX2dldEluc3RhbmNlKGluTWVtb3J5UGVyc2lzdGVuY2UpLCBhdXRoLCB1c2VyS2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRWxpbWluYXRlIGFueSBwZXJzaXN0ZW5jZXMgdGhhdCBhcmUgbm90IGF2YWlsYWJsZVxyXG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZVBlcnNpc3RlbmNlcyA9IChhd2FpdCBQcm9taXNlLmFsbChwZXJzaXN0ZW5jZUhpZXJhcmNoeS5tYXAoYXN5bmMgKHBlcnNpc3RlbmNlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChhd2FpdCBwZXJzaXN0ZW5jZS5faXNBdmFpbGFibGUoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSkpKS5maWx0ZXIocGVyc2lzdGVuY2UgPT4gcGVyc2lzdGVuY2UpO1xyXG4gICAgICAgIC8vIEZhbGwgYmFjayB0byB0aGUgZmlyc3QgcGVyc2lzdGVuY2UgbGlzdGVkLCBvciBpbiBtZW1vcnkgaWYgbm9uZSBhdmFpbGFibGVcclxuICAgICAgICBsZXQgc2VsZWN0ZWRQZXJzaXN0ZW5jZSA9IGF2YWlsYWJsZVBlcnNpc3RlbmNlc1swXSB8fFxyXG4gICAgICAgICAgICBfZ2V0SW5zdGFuY2UoaW5NZW1vcnlQZXJzaXN0ZW5jZSk7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gX3BlcnNpc3RlbmNlS2V5TmFtZSh1c2VyS2V5LCBhdXRoLmNvbmZpZy5hcGlLZXksIGF1dGgubmFtZSk7XHJcbiAgICAgICAgLy8gUHVsbCBvdXQgdGhlIGV4aXN0aW5nIHVzZXIsIHNldHRpbmcgdGhlIGNob3NlbiBwZXJzaXN0ZW5jZSB0byB0aGF0XHJcbiAgICAgICAgLy8gcGVyc2lzdGVuY2UgaWYgdGhlIHVzZXIgZXhpc3RzLlxyXG4gICAgICAgIGxldCB1c2VyVG9NaWdyYXRlID0gbnVsbDtcclxuICAgICAgICAvLyBOb3RlLCBoZXJlIHdlIGNoZWNrIGZvciBhIHVzZXIgaW4gX2FsbF8gcGVyc2lzdGVuY2VzLCBub3QganVzdCB0aGVcclxuICAgICAgICAvLyBvbmVzIGRlZW1lZCBhdmFpbGFibGUuIElmIHdlIGNhbiBtaWdyYXRlIGEgdXNlciBvdXQgb2YgYSBicm9rZW5cclxuICAgICAgICAvLyBwZXJzaXN0ZW5jZSwgd2Ugd2lsbCAoYnV0IG9ubHkgaWYgdGhhdCBwZXJzaXN0ZW5jZSBzdXBwb3J0cyBtaWdyYXRpb24pLlxyXG4gICAgICAgIGZvciAoY29uc3QgcGVyc2lzdGVuY2Ugb2YgcGVyc2lzdGVuY2VIaWVyYXJjaHkpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBwZXJzaXN0ZW5jZS5fZ2V0KGtleSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYmxvYikge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXIgPSBVc2VySW1wbC5fZnJvbUpTT04oYXV0aCwgYmxvYik7IC8vIHRocm93cyBmb3IgdW5wYXJzYWJsZSBibG9iICh3cm9uZyBmb3JtYXQpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBlcnNpc3RlbmNlICE9PSBzZWxlY3RlZFBlcnNpc3RlbmNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJUb01pZ3JhdGUgPSB1c2VyO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFBlcnNpc3RlbmNlID0gcGVyc2lzdGVuY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKF9hKSB7IH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSWYgd2UgZmluZCB0aGUgdXNlciBpbiBhIHBlcnNpc3RlbmNlIHRoYXQgZG9lcyBzdXBwb3J0IG1pZ3JhdGlvbiwgdXNlXHJcbiAgICAgICAgLy8gdGhhdCBtaWdyYXRpb24gcGF0aCAob2Ygb25seSBwZXJzaXN0ZW5jZXMgdGhhdCBzdXBwb3J0IG1pZ3JhdGlvbilcclxuICAgICAgICBjb25zdCBtaWdyYXRpb25IaWVyYXJjaHkgPSBhdmFpbGFibGVQZXJzaXN0ZW5jZXMuZmlsdGVyKHAgPT4gcC5fc2hvdWxkQWxsb3dNaWdyYXRpb24pO1xyXG4gICAgICAgIC8vIElmIHRoZSBwZXJzaXN0ZW5jZSBkb2VzIF9ub3RfIGFsbG93IG1pZ3JhdGlvbiwganVzdCBmaW5pc2ggb2ZmIGhlcmVcclxuICAgICAgICBpZiAoIXNlbGVjdGVkUGVyc2lzdGVuY2UuX3Nob3VsZEFsbG93TWlncmF0aW9uIHx8XHJcbiAgICAgICAgICAgICFtaWdyYXRpb25IaWVyYXJjaHkubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUGVyc2lzdGVuY2VVc2VyTWFuYWdlcihzZWxlY3RlZFBlcnNpc3RlbmNlLCBhdXRoLCB1c2VyS2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2VsZWN0ZWRQZXJzaXN0ZW5jZSA9IG1pZ3JhdGlvbkhpZXJhcmNoeVswXTtcclxuICAgICAgICBpZiAodXNlclRvTWlncmF0ZSkge1xyXG4gICAgICAgICAgICAvLyBUaGlzIG5vcm1hbGx5IHNob3VsZG4ndCB0aHJvdyBzaW5jZSBjaG9zZW5QZXJzaXN0ZW5jZS5pc0F2YWlsYWJsZSgpIGlzIHRydWUsIGJ1dCBpZiBpdCBkb2VzXHJcbiAgICAgICAgICAgIC8vIHdlJ2xsIGp1c3QgbGV0IGl0IGJ1YmJsZSB0byBzdXJmYWNlIHRoZSBlcnJvci5cclxuICAgICAgICAgICAgYXdhaXQgc2VsZWN0ZWRQZXJzaXN0ZW5jZS5fc2V0KGtleSwgdXNlclRvTWlncmF0ZS50b0pTT04oKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEF0dGVtcHQgdG8gY2xlYXIgdGhlIGtleSBpbiBvdGhlciBwZXJzaXN0ZW5jZXMgYnV0IGlnbm9yZSBlcnJvcnMuIFRoaXMgaGVscHMgcHJldmVudCBpc3N1ZXNcclxuICAgICAgICAvLyBzdWNoIGFzIHVzZXJzIGdldHRpbmcgc3R1Y2sgd2l0aCBhIHByZXZpb3VzIGFjY291bnQgYWZ0ZXIgc2lnbmluZyBvdXQgYW5kIHJlZnJlc2hpbmcgdGhlIHRhYi5cclxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChwZXJzaXN0ZW5jZUhpZXJhcmNoeS5tYXAoYXN5bmMgKHBlcnNpc3RlbmNlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChwZXJzaXN0ZW5jZSAhPT0gc2VsZWN0ZWRQZXJzaXN0ZW5jZSkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBwZXJzaXN0ZW5jZS5fcmVtb3ZlKGtleSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoX2EpIHsgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIHJldHVybiBuZXcgUGVyc2lzdGVuY2VVc2VyTWFuYWdlcihzZWxlY3RlZFBlcnNpc3RlbmNlLCBhdXRoLCB1c2VyS2V5KTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogRGV0ZXJtaW5lIHRoZSBicm93c2VyIGZvciB0aGUgcHVycG9zZXMgb2YgcmVwb3J0aW5nIHVzYWdlIHRvIHRoZSBBUElcclxuICovXHJcbmZ1bmN0aW9uIF9nZXRCcm93c2VyTmFtZSh1c2VyQWdlbnQpIHtcclxuICAgIGNvbnN0IHVhID0gdXNlckFnZW50LnRvTG93ZXJDYXNlKCk7XHJcbiAgICBpZiAodWEuaW5jbHVkZXMoJ29wZXJhLycpIHx8IHVhLmluY2x1ZGVzKCdvcHIvJykgfHwgdWEuaW5jbHVkZXMoJ29waW9zLycpKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiT3BlcmFcIiAvKiBPUEVSQSAqLztcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKF9pc0lFTW9iaWxlKHVhKSkge1xyXG4gICAgICAgIC8vIFdpbmRvd3MgcGhvbmUgSUVNb2JpbGUgYnJvd3Nlci5cclxuICAgICAgICByZXR1cm4gXCJJRU1vYmlsZVwiIC8qIElFTU9CSUxFICovO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodWEuaW5jbHVkZXMoJ21zaWUnKSB8fCB1YS5pbmNsdWRlcygndHJpZGVudC8nKSkge1xyXG4gICAgICAgIHJldHVybiBcIklFXCIgLyogSUUgKi87XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh1YS5pbmNsdWRlcygnZWRnZS8nKSkge1xyXG4gICAgICAgIHJldHVybiBcIkVkZ2VcIiAvKiBFREdFICovO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoX2lzRmlyZWZveCh1YSkpIHtcclxuICAgICAgICByZXR1cm4gXCJGaXJlZm94XCIgLyogRklSRUZPWCAqLztcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHVhLmluY2x1ZGVzKCdzaWxrLycpKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiU2lsa1wiIC8qIFNJTEsgKi87XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChfaXNCbGFja0JlcnJ5KHVhKSkge1xyXG4gICAgICAgIC8vIEJsYWNrYmVycnkgYnJvd3Nlci5cclxuICAgICAgICByZXR1cm4gXCJCbGFja2JlcnJ5XCIgLyogQkxBQ0tCRVJSWSAqLztcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKF9pc1dlYk9TKHVhKSkge1xyXG4gICAgICAgIC8vIFdlYk9TIGRlZmF1bHQgYnJvd3Nlci5cclxuICAgICAgICByZXR1cm4gXCJXZWJvc1wiIC8qIFdFQk9TICovO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoX2lzU2FmYXJpKHVhKSkge1xyXG4gICAgICAgIHJldHVybiBcIlNhZmFyaVwiIC8qIFNBRkFSSSAqLztcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKCh1YS5pbmNsdWRlcygnY2hyb21lLycpIHx8IF9pc0Nocm9tZUlPUyh1YSkpICYmXHJcbiAgICAgICAgIXVhLmluY2x1ZGVzKCdlZGdlLycpKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiQ2hyb21lXCIgLyogQ0hST01FICovO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoX2lzQW5kcm9pZCh1YSkpIHtcclxuICAgICAgICAvLyBBbmRyb2lkIHN0b2NrIGJyb3dzZXIuXHJcbiAgICAgICAgcmV0dXJuIFwiQW5kcm9pZFwiIC8qIEFORFJPSUQgKi87XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICAvLyBNb3N0IG1vZGVybiBicm93c2VycyBoYXZlIG5hbWUvdmVyc2lvbiBhdCBlbmQgb2YgdXNlciBhZ2VudCBzdHJpbmcuXHJcbiAgICAgICAgY29uc3QgcmUgPSAvKFthLXpBLVpcXGRcXC5dKylcXC9bYS16QS1aXFxkXFwuXSokLztcclxuICAgICAgICBjb25zdCBtYXRjaGVzID0gdXNlckFnZW50Lm1hdGNoKHJlKTtcclxuICAgICAgICBpZiAoKG1hdGNoZXMgPT09IG51bGwgfHwgbWF0Y2hlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogbWF0Y2hlcy5sZW5ndGgpID09PSAyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzWzFdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBcIk90aGVyXCIgLyogT1RIRVIgKi87XHJcbn1cclxuZnVuY3Rpb24gX2lzRmlyZWZveCh1YSA9IGdldFVBKCkpIHtcclxuICAgIHJldHVybiAvZmlyZWZveFxcLy9pLnRlc3QodWEpO1xyXG59XHJcbmZ1bmN0aW9uIF9pc1NhZmFyaSh1c2VyQWdlbnQgPSBnZXRVQSgpKSB7XHJcbiAgICBjb25zdCB1YSA9IHVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuICh1YS5pbmNsdWRlcygnc2FmYXJpLycpICYmXHJcbiAgICAgICAgIXVhLmluY2x1ZGVzKCdjaHJvbWUvJykgJiZcclxuICAgICAgICAhdWEuaW5jbHVkZXMoJ2NyaW9zLycpICYmXHJcbiAgICAgICAgIXVhLmluY2x1ZGVzKCdhbmRyb2lkJykpO1xyXG59XHJcbmZ1bmN0aW9uIF9pc0Nocm9tZUlPUyh1YSA9IGdldFVBKCkpIHtcclxuICAgIHJldHVybiAvY3Jpb3NcXC8vaS50ZXN0KHVhKTtcclxufVxyXG5mdW5jdGlvbiBfaXNJRU1vYmlsZSh1YSA9IGdldFVBKCkpIHtcclxuICAgIHJldHVybiAvaWVtb2JpbGUvaS50ZXN0KHVhKTtcclxufVxyXG5mdW5jdGlvbiBfaXNBbmRyb2lkKHVhID0gZ2V0VUEoKSkge1xyXG4gICAgcmV0dXJuIC9hbmRyb2lkL2kudGVzdCh1YSk7XHJcbn1cclxuZnVuY3Rpb24gX2lzQmxhY2tCZXJyeSh1YSA9IGdldFVBKCkpIHtcclxuICAgIHJldHVybiAvYmxhY2tiZXJyeS9pLnRlc3QodWEpO1xyXG59XHJcbmZ1bmN0aW9uIF9pc1dlYk9TKHVhID0gZ2V0VUEoKSkge1xyXG4gICAgcmV0dXJuIC93ZWJvcy9pLnRlc3QodWEpO1xyXG59XHJcbmZ1bmN0aW9uIF9pc0lPUyh1YSA9IGdldFVBKCkpIHtcclxuICAgIHJldHVybiAvaXBob25lfGlwYWR8aXBvZC9pLnRlc3QodWEpO1xyXG59XHJcbmZ1bmN0aW9uIF9pc0lPUzdPcjgodWEgPSBnZXRVQSgpKSB7XHJcbiAgICByZXR1cm4gKC8oaVBhZHxpUGhvbmV8aVBvZCkuKk9TIDdfXFxkL2kudGVzdCh1YSkgfHxcclxuICAgICAgICAvKGlQYWR8aVBob25lfGlQb2QpLipPUyA4X1xcZC9pLnRlc3QodWEpKTtcclxufVxyXG5mdW5jdGlvbiBfaXNJT1NTdGFuZGFsb25lKHVhID0gZ2V0VUEoKSkge1xyXG4gICAgdmFyIF9hO1xyXG4gICAgcmV0dXJuIF9pc0lPUyh1YSkgJiYgISEoKF9hID0gd2luZG93Lm5hdmlnYXRvcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnN0YW5kYWxvbmUpO1xyXG59XHJcbmZ1bmN0aW9uIF9pc0lFMTAoKSB7XHJcbiAgICByZXR1cm4gaXNJRSgpICYmIGRvY3VtZW50LmRvY3VtZW50TW9kZSA9PT0gMTA7XHJcbn1cclxuZnVuY3Rpb24gX2lzTW9iaWxlQnJvd3Nlcih1YSA9IGdldFVBKCkpIHtcclxuICAgIC8vIFRPRE86IGltcGxlbWVudCBnZXRCcm93c2VyTmFtZSBlcXVpdmFsZW50IGZvciBPUy5cclxuICAgIHJldHVybiAoX2lzSU9TKHVhKSB8fFxyXG4gICAgICAgIF9pc0FuZHJvaWQodWEpIHx8XHJcbiAgICAgICAgX2lzV2ViT1ModWEpIHx8XHJcbiAgICAgICAgX2lzQmxhY2tCZXJyeSh1YSkgfHxcclxuICAgICAgICAvd2luZG93cyBwaG9uZS9pLnRlc3QodWEpIHx8XHJcbiAgICAgICAgX2lzSUVNb2JpbGUodWEpKTtcclxufVxyXG5mdW5jdGlvbiBfaXNJZnJhbWUoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIGN1cnJlbnQgd2luZG93IGlzIG5vdCB0aGUgdG9wIHdpbmRvdy5cclxuICAgICAgICAvLyBJZiBzbywgcmV0dXJuIHRydWUuXHJcbiAgICAgICAgcmV0dXJuICEhKHdpbmRvdyAmJiB3aW5kb3cgIT09IHdpbmRvdy50b3ApO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLypcclxuICogRGV0ZXJtaW5lIHRoZSBTREsgdmVyc2lvbiBzdHJpbmdcclxuICovXHJcbmZ1bmN0aW9uIF9nZXRDbGllbnRWZXJzaW9uKGNsaWVudFBsYXRmb3JtLCBmcmFtZXdvcmtzID0gW10pIHtcclxuICAgIGxldCByZXBvcnRlZFBsYXRmb3JtO1xyXG4gICAgc3dpdGNoIChjbGllbnRQbGF0Zm9ybSkge1xyXG4gICAgICAgIGNhc2UgXCJCcm93c2VyXCIgLyogQlJPV1NFUiAqLzpcclxuICAgICAgICAgICAgLy8gSW4gYSBicm93c2VyIGVudmlyb25tZW50LCByZXBvcnQgdGhlIGJyb3dzZXIgbmFtZS5cclxuICAgICAgICAgICAgcmVwb3J0ZWRQbGF0Zm9ybSA9IF9nZXRCcm93c2VyTmFtZShnZXRVQSgpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcIldvcmtlclwiIC8qIFdPUktFUiAqLzpcclxuICAgICAgICAgICAgLy8gVGVjaG5pY2FsbHkgYSB3b3JrZXIgcnVucyBmcm9tIGEgYnJvd3NlciBidXQgd2UgbmVlZCB0byBkaWZmZXJlbnRpYXRlIGFcclxuICAgICAgICAgICAgLy8gd29ya2VyIGZyb20gYSBicm93c2VyLlxyXG4gICAgICAgICAgICAvLyBGb3IgZXhhbXBsZTogQ2hyb21lLVdvcmtlci9Kc0NvcmUvNC45LjEvRmlyZWJhc2VDb3JlLXdlYi5cclxuICAgICAgICAgICAgcmVwb3J0ZWRQbGF0Zm9ybSA9IGAke19nZXRCcm93c2VyTmFtZShnZXRVQSgpKX0tJHtjbGllbnRQbGF0Zm9ybX1gO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICByZXBvcnRlZFBsYXRmb3JtID0gY2xpZW50UGxhdGZvcm07XHJcbiAgICB9XHJcbiAgICBjb25zdCByZXBvcnRlZEZyYW1ld29ya3MgPSBmcmFtZXdvcmtzLmxlbmd0aFxyXG4gICAgICAgID8gZnJhbWV3b3Jrcy5qb2luKCcsJylcclxuICAgICAgICA6ICdGaXJlYmFzZUNvcmUtd2ViJzsgLyogZGVmYXVsdCB2YWx1ZSBpZiBubyBvdGhlciBmcmFtZXdvcmsgaXMgdXNlZCAqL1xyXG4gICAgcmV0dXJuIGAke3JlcG9ydGVkUGxhdGZvcm19LyR7XCJKc0NvcmVcIiAvKiBDT1JFICovfS8ke1NES19WRVJTSU9OfS8ke3JlcG9ydGVkRnJhbWV3b3Jrc31gO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNsYXNzIEF1dGhJbXBsIHtcclxuICAgIGNvbnN0cnVjdG9yKGFwcCwgaGVhcnRiZWF0U2VydmljZVByb3ZpZGVyLCBjb25maWcpIHtcclxuICAgICAgICB0aGlzLmFwcCA9IGFwcDtcclxuICAgICAgICB0aGlzLmhlYXJ0YmVhdFNlcnZpY2VQcm92aWRlciA9IGhlYXJ0YmVhdFNlcnZpY2VQcm92aWRlcjtcclxuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcclxuICAgICAgICB0aGlzLmN1cnJlbnRVc2VyID0gbnVsbDtcclxuICAgICAgICB0aGlzLmVtdWxhdG9yQ29uZmlnID0gbnVsbDtcclxuICAgICAgICB0aGlzLm9wZXJhdGlvbnMgPSBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICB0aGlzLmF1dGhTdGF0ZVN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24odGhpcyk7XHJcbiAgICAgICAgdGhpcy5pZFRva2VuU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbih0aGlzKTtcclxuICAgICAgICB0aGlzLnJlZGlyZWN0VXNlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5pc1Byb2FjdGl2ZVJlZnJlc2hFbmFibGVkID0gZmFsc2U7XHJcbiAgICAgICAgLy8gQW55IG5ldHdvcmsgY2FsbHMgd2lsbCBzZXQgdGhpcyB0byB0cnVlIGFuZCBwcmV2ZW50IHN1YnNlcXVlbnQgZW11bGF0b3JcclxuICAgICAgICAvLyBpbml0aWFsaXphdGlvblxyXG4gICAgICAgIHRoaXMuX2NhbkluaXRFbXVsYXRvciA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2RlbGV0ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9pbml0aWFsaXphdGlvblByb21pc2UgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3BvcHVwUmVkaXJlY3RSZXNvbHZlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZXJyb3JGYWN0b3J5ID0gX0RFRkFVTFRfQVVUSF9FUlJPUl9GQUNUT1JZO1xyXG4gICAgICAgIC8vIFRyYWNrcyB0aGUgbGFzdCBub3RpZmllZCBVSUQgZm9yIHN0YXRlIGNoYW5nZSBsaXN0ZW5lcnMgdG8gcHJldmVudFxyXG4gICAgICAgIC8vIHJlcGVhdGVkIGNhbGxzIHRvIHRoZSBjYWxsYmFja3MuIFVuZGVmaW5lZCBtZWFucyBpdCdzIG5ldmVyIGJlZW5cclxuICAgICAgICAvLyBjYWxsZWQsIHdoZXJlYXMgbnVsbCBtZWFucyBpdCdzIGJlZW4gY2FsbGVkIHdpdGggYSBzaWduZWQgb3V0IHVzZXJcclxuICAgICAgICB0aGlzLmxhc3ROb3RpZmllZFVpZCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLmxhbmd1YWdlQ29kZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy50ZW5hbnRJZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHsgYXBwVmVyaWZpY2F0aW9uRGlzYWJsZWRGb3JUZXN0aW5nOiBmYWxzZSB9O1xyXG4gICAgICAgIHRoaXMuZnJhbWV3b3JrcyA9IFtdO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IGFwcC5uYW1lO1xyXG4gICAgICAgIHRoaXMuY2xpZW50VmVyc2lvbiA9IGNvbmZpZy5zZGtDbGllbnRWZXJzaW9uO1xyXG4gICAgfVxyXG4gICAgX2luaXRpYWxpemVXaXRoUGVyc2lzdGVuY2UocGVyc2lzdGVuY2VIaWVyYXJjaHksIHBvcHVwUmVkaXJlY3RSZXNvbHZlcikge1xyXG4gICAgICAgIGlmIChwb3B1cFJlZGlyZWN0UmVzb2x2ZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fcG9wdXBSZWRpcmVjdFJlc29sdmVyID0gX2dldEluc3RhbmNlKHBvcHVwUmVkaXJlY3RSZXNvbHZlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEhhdmUgdG8gY2hlY2sgZm9yIGFwcCBkZWxldGlvbiB0aHJvdWdob3V0IGluaXRpYWxpemF0aW9uIChhZnRlciBlYWNoXHJcbiAgICAgICAgLy8gcHJvbWlzZSByZXNvbHV0aW9uKVxyXG4gICAgICAgIHRoaXMuX2luaXRpYWxpemF0aW9uUHJvbWlzZSA9IHRoaXMucXVldWUoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZGVsZXRlZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucGVyc2lzdGVuY2VNYW5hZ2VyID0gYXdhaXQgUGVyc2lzdGVuY2VVc2VyTWFuYWdlci5jcmVhdGUodGhpcywgcGVyc2lzdGVuY2VIaWVyYXJjaHkpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZGVsZXRlZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHJlc29sdmVyIGVhcmx5IGlmIG5lY2Vzc2FyeSAob25seSBhcHBsaWNhYmxlIHRvIHdlYjpcclxuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIGNhdXNlIHRoZSBpZnJhbWUgdG8gbG9hZCBpbW1lZGlhdGVseSBpbiBjZXJ0YWluIGNhc2VzKVxyXG4gICAgICAgICAgICBpZiAoKF9hID0gdGhpcy5fcG9wdXBSZWRpcmVjdFJlc29sdmVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuX3Nob3VsZEluaXRQcm9hY3RpdmVseSkge1xyXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBmYWlscywgZG9uJ3QgaGFsdCBhdXRoIGxvYWRpbmdcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fcG9wdXBSZWRpcmVjdFJlc29sdmVyLl9pbml0aWFsaXplKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsgLyogSWdub3JlIHRoZSBlcnJvciAqLyB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplQ3VycmVudFVzZXIocG9wdXBSZWRpcmVjdFJlc29sdmVyKTtcclxuICAgICAgICAgICAgdGhpcy5sYXN0Tm90aWZpZWRVaWQgPSAoKF9iID0gdGhpcy5jdXJyZW50VXNlcikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnVpZCkgfHwgbnVsbDtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2RlbGV0ZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdGhpcy5faW5pdGlhbGl6YXRpb25Qcm9taXNlO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBJZiB0aGUgcGVyc2lzdGVuY2UgaXMgY2hhbmdlZCBpbiBhbm90aGVyIHdpbmRvdywgdGhlIHVzZXIgbWFuYWdlciB3aWxsIGxldCB1cyBrbm93XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIF9vblN0b3JhZ2VFdmVudCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fZGVsZXRlZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLmFzc2VydGVkUGVyc2lzdGVuY2UuZ2V0Q3VycmVudFVzZXIoKTtcclxuICAgICAgICBpZiAoIXRoaXMuY3VycmVudFVzZXIgJiYgIXVzZXIpIHtcclxuICAgICAgICAgICAgLy8gTm8gY2hhbmdlLCBkbyBub3RoaW5nICh3YXMgc2lnbmVkIG91dCBhbmQgcmVtYWluZWQgc2lnbmVkIG91dCkuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSWYgdGhlIHNhbWUgdXNlciBpcyB0byBiZSBzeW5jaHJvbml6ZWQuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFVzZXIgJiYgdXNlciAmJiB0aGlzLmN1cnJlbnRVc2VyLnVpZCA9PT0gdXNlci51aWQpIHtcclxuICAgICAgICAgICAgLy8gRGF0YSB1cGRhdGUsIHNpbXBseSBjb3B5IGRhdGEgY2hhbmdlcy5cclxuICAgICAgICAgICAgdGhpcy5fY3VycmVudFVzZXIuX2Fzc2lnbih1c2VyKTtcclxuICAgICAgICAgICAgLy8gSWYgdG9rZW5zIGNoYW5nZWQgZnJvbSBwcmV2aW91cyB1c2VyIHRva2VucywgdGhpcyB3aWxsIHRyaWdnZXJcclxuICAgICAgICAgICAgLy8gbm90aWZ5QXV0aExpc3RlbmVyc18uXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY3VycmVudFVzZXIuZ2V0SWRUb2tlbigpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFVwZGF0ZSBjdXJyZW50IEF1dGggc3RhdGUuIEVpdGhlciBhIG5ldyBsb2dpbiBvciBsb2dvdXQuXHJcbiAgICAgICAgYXdhaXQgdGhpcy5fdXBkYXRlQ3VycmVudFVzZXIodXNlcik7XHJcbiAgICB9XHJcbiAgICBhc3luYyBpbml0aWFsaXplQ3VycmVudFVzZXIocG9wdXBSZWRpcmVjdFJlc29sdmVyKSB7XHJcbiAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgIC8vIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcGVuZGluZyByZWRpcmVjdCBldmVudC5cclxuICAgICAgICBsZXQgc3RvcmVkVXNlciA9IChhd2FpdCB0aGlzLmFzc2VydGVkUGVyc2lzdGVuY2UuZ2V0Q3VycmVudFVzZXIoKSk7XHJcbiAgICAgICAgaWYgKHBvcHVwUmVkaXJlY3RSZXNvbHZlciAmJiB0aGlzLmNvbmZpZy5hdXRoRG9tYWluKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0T3JJbml0UmVkaXJlY3RQZXJzaXN0ZW5jZU1hbmFnZXIoKTtcclxuICAgICAgICAgICAgY29uc3QgcmVkaXJlY3RVc2VyRXZlbnRJZCA9IChfYSA9IHRoaXMucmVkaXJlY3RVc2VyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuX3JlZGlyZWN0RXZlbnRJZDtcclxuICAgICAgICAgICAgY29uc3Qgc3RvcmVkVXNlckV2ZW50SWQgPSBzdG9yZWRVc2VyID09PSBudWxsIHx8IHN0b3JlZFVzZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0b3JlZFVzZXIuX3JlZGlyZWN0RXZlbnRJZDtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy50cnlSZWRpcmVjdFNpZ25Jbihwb3B1cFJlZGlyZWN0UmVzb2x2ZXIpO1xyXG4gICAgICAgICAgICAvLyBJZiB0aGUgc3RvcmVkIHVzZXIgKGkuZS4gdGhlIG9sZCBcImN1cnJlbnRVc2VyXCIpIGhhcyBhIHJlZGlyZWN0SWQgdGhhdFxyXG4gICAgICAgICAgICAvLyBtYXRjaGVzIHRoZSByZWRpcmVjdCB1c2VyLCB0aGVuIHdlIHdhbnQgdG8gaW5pdGlhbGx5IHNpZ24gaW4gd2l0aCB0aGVcclxuICAgICAgICAgICAgLy8gbmV3IHVzZXIgb2JqZWN0IGZyb20gcmVzdWx0LlxyXG4gICAgICAgICAgICAvLyBUT0RPKHNhbWdobyk6IE1vcmUgdGhvcm91Z2hseSB0ZXN0IGFsbCBvZiB0aGlzXHJcbiAgICAgICAgICAgIGlmICgoIXJlZGlyZWN0VXNlckV2ZW50SWQgfHwgcmVkaXJlY3RVc2VyRXZlbnRJZCA9PT0gc3RvcmVkVXNlckV2ZW50SWQpICYmXHJcbiAgICAgICAgICAgICAgICAocmVzdWx0ID09PSBudWxsIHx8IHJlc3VsdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVzdWx0LnVzZXIpKSB7XHJcbiAgICAgICAgICAgICAgICBzdG9yZWRVc2VyID0gcmVzdWx0LnVzZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSWYgbm8gdXNlciBpbiBwZXJzaXN0ZW5jZSwgdGhlcmUgaXMgbm8gY3VycmVudCB1c2VyLiBTZXQgdG8gbnVsbC5cclxuICAgICAgICBpZiAoIXN0b3JlZFVzZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGlyZWN0bHlTZXRDdXJyZW50VXNlcihudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFzdG9yZWRVc2VyLl9yZWRpcmVjdEV2ZW50SWQpIHtcclxuICAgICAgICAgICAgLy8gVGhpcyBpc24ndCBhIHJlZGlyZWN0IHVzZXIsIHdlIGNhbiByZWxvYWQgYW5kIGJhaWxcclxuICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGFsc28gY2F0Y2ggdGhlIHJlZGlyZWN0ZWQgdXNlciwgaWYgYXZhaWxhYmxlLCBhcyB0aGF0IG1ldGhvZFxyXG4gICAgICAgICAgICAvLyBzdHJpcHMgdGhlIF9yZWRpcmVjdEV2ZW50SWRcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVsb2FkQW5kU2V0Q3VycmVudFVzZXJPckNsZWFyKHN0b3JlZFVzZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBfYXNzZXJ0KHRoaXMuX3BvcHVwUmVkaXJlY3RSZXNvbHZlciwgdGhpcywgXCJhcmd1bWVudC1lcnJvclwiIC8qIEFSR1VNRU5UX0VSUk9SICovKTtcclxuICAgICAgICBhd2FpdCB0aGlzLmdldE9ySW5pdFJlZGlyZWN0UGVyc2lzdGVuY2VNYW5hZ2VyKCk7XHJcbiAgICAgICAgLy8gSWYgdGhlIHJlZGlyZWN0IHVzZXIncyBldmVudCBJRCBtYXRjaGVzIHRoZSBjdXJyZW50IHVzZXIncyBldmVudCBJRCxcclxuICAgICAgICAvLyBETyBOT1QgcmVsb2FkIHRoZSBjdXJyZW50IHVzZXIsIG90aGVyd2lzZSB0aGV5J2xsIGJlIGNsZWFyZWQgZnJvbSBzdG9yYWdlLlxyXG4gICAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGZvciB0aGUgcmVhdXRoZW50aWNhdGVXaXRoUmVkaXJlY3QoKSBmbG93LlxyXG4gICAgICAgIGlmICh0aGlzLnJlZGlyZWN0VXNlciAmJlxyXG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0VXNlci5fcmVkaXJlY3RFdmVudElkID09PSBzdG9yZWRVc2VyLl9yZWRpcmVjdEV2ZW50SWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGlyZWN0bHlTZXRDdXJyZW50VXNlcihzdG9yZWRVc2VyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVsb2FkQW5kU2V0Q3VycmVudFVzZXJPckNsZWFyKHN0b3JlZFVzZXIpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgdHJ5UmVkaXJlY3RTaWduSW4ocmVkaXJlY3RSZXNvbHZlcikge1xyXG4gICAgICAgIC8vIFRoZSByZWRpcmVjdCB1c2VyIG5lZWRzIHRvIGJlIGNoZWNrZWQgKGFuZCBzaWduZWQgaW4gaWYgYXZhaWxhYmxlKVxyXG4gICAgICAgIC8vIGR1cmluZyBhdXRoIGluaXRpYWxpemF0aW9uLiBBbGwgb2YgdGhlIG5vcm1hbCBzaWduIGluIGFuZCBsaW5rL3JlYXV0aFxyXG4gICAgICAgIC8vIGZsb3dzIGNhbGwgYmFjayBpbnRvIGF1dGggYW5kIHB1c2ggdGhpbmdzIG9udG8gdGhlIHByb21pc2UgcXVldWUuIFdlXHJcbiAgICAgICAgLy8gbmVlZCB0byBhd2FpdCB0aGUgcmVzdWx0IG9mIHRoZSByZWRpcmVjdCBzaWduIGluICppbnNpZGUgdGhlIHByb21pc2VcclxuICAgICAgICAvLyBxdWV1ZSouIFRoaXMgcHJlc2VudHMgYSBwcm9ibGVtOiB3ZSBydW4gaW50byBkZWFkbG9jay4gU2VlOlxyXG4gICAgICAgIC8vICAgIOKUjD4gW0luaXRpYWxpemF0aW9uXSDilIDilIDilIDilIDilIDilJBcclxuICAgICAgICAvLyAgICDilIw+IFs8b3RoZXIgcXVldWUgdGFza3M+XSDilIJcclxuICAgICAgICAvLyAgICDilJTilIAgW2dldFJlZGlyZWN0UmVzdWx0XSA84pSA4pSYXHJcbiAgICAgICAgLy8gICAgd2hlcmUgW10gYXJlIHRhc2tzIG9uIHRoZSBxdWV1ZSBhbmQgYXJyb3dzIGRlbm90ZSBhd2FpdHNcclxuICAgICAgICAvLyBJbml0aWFsaXphdGlvbiB3aWxsIG5ldmVyIGNvbXBsZXRlIGJlY2F1c2UgaXQncyB3YWl0aW5nIG9uIHNvbWV0aGluZ1xyXG4gICAgICAgIC8vIHRoYXQncyB3YWl0aW5nIGZvciBpbml0aWFsaXphdGlvbiB0byBjb21wbGV0ZSFcclxuICAgICAgICAvL1xyXG4gICAgICAgIC8vIEluc3RlYWQsIHRoaXMgbWV0aG9kIGNhbGxzIGdldFJlZGlyZWN0UmVzdWx0KCkgKHN0b3JlZCBpblxyXG4gICAgICAgIC8vIF9jb21wbGV0ZVJlZGlyZWN0Rm4pIHdpdGggYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHRoYXQgaW5zdHJ1Y3RzIGFsbCBvZlxyXG4gICAgICAgIC8vIHRoZSB1bmRlcmx5aW5nIGF1dGggb3BlcmF0aW9ucyB0byBza2lwIGFueXRoaW5nIHRoYXQgbXV0YXRlcyBhdXRoIHN0YXRlLlxyXG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vIFdlIGtub3cgdGhpcy5fcG9wdXBSZWRpcmVjdFJlc29sdmVyIGlzIHNldCBzaW5jZSByZWRpcmVjdFJlc29sdmVyXHJcbiAgICAgICAgICAgIC8vIGlzIHBhc3NlZCBpbi4gVGhlIF9jb21wbGV0ZVJlZGlyZWN0Rm4gZXhwZWN0cyB0aGUgdW53cmFwcGVkIGV4dGVybi5cclxuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5fcG9wdXBSZWRpcmVjdFJlc29sdmVyLl9jb21wbGV0ZVJlZGlyZWN0Rm4odGhpcywgcmVkaXJlY3RSZXNvbHZlciwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIFN3YWxsb3cgYW55IGVycm9ycyBoZXJlOyB0aGUgY29kZSBjYW4gcmV0cmlldmUgdGhlbSBpblxyXG4gICAgICAgICAgICAvLyBnZXRSZWRpcmVjdFJlc3VsdCgpLlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9zZXRSZWRpcmVjdFVzZXIobnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICBhc3luYyByZWxvYWRBbmRTZXRDdXJyZW50VXNlck9yQ2xlYXIodXNlcikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IF9yZWxvYWRXaXRob3V0U2F2aW5nKHVzZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBpZiAoZS5jb2RlICE9PSBgYXV0aC8ke1wibmV0d29yay1yZXF1ZXN0LWZhaWxlZFwiIC8qIE5FVFdPUktfUkVRVUVTVF9GQUlMRUQgKi99YCkge1xyXG4gICAgICAgICAgICAgICAgLy8gU29tZXRoaW5nJ3Mgd3Jvbmcgd2l0aCB0aGUgdXNlcidzIHRva2VuLiBMb2cgdGhlbSBvdXQgYW5kIHJlbW92ZVxyXG4gICAgICAgICAgICAgICAgLy8gdGhlbSBmcm9tIHN0b3JhZ2VcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRpcmVjdGx5U2V0Q3VycmVudFVzZXIobnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlyZWN0bHlTZXRDdXJyZW50VXNlcih1c2VyKTtcclxuICAgIH1cclxuICAgIHVzZURldmljZUxhbmd1YWdlKCkge1xyXG4gICAgICAgIHRoaXMubGFuZ3VhZ2VDb2RlID0gX2dldFVzZXJMYW5ndWFnZSgpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgX2RlbGV0ZSgpIHtcclxuICAgICAgICB0aGlzLl9kZWxldGVkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGFzeW5jIHVwZGF0ZUN1cnJlbnRVc2VyKHVzZXJFeHRlcm4pIHtcclxuICAgICAgICAvLyBUaGUgcHVibGljIHVwZGF0ZUN1cnJlbnRVc2VyIG1ldGhvZCBuZWVkcyB0byBtYWtlIGEgY29weSBvZiB0aGUgdXNlcixcclxuICAgICAgICAvLyBhbmQgYWxzbyBjaGVjayB0aGF0IHRoZSBwcm9qZWN0IG1hdGNoZXNcclxuICAgICAgICBjb25zdCB1c2VyID0gdXNlckV4dGVyblxyXG4gICAgICAgICAgICA/IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyRXh0ZXJuKVxyXG4gICAgICAgICAgICA6IG51bGw7XHJcbiAgICAgICAgaWYgKHVzZXIpIHtcclxuICAgICAgICAgICAgX2Fzc2VydCh1c2VyLmF1dGguY29uZmlnLmFwaUtleSA9PT0gdGhpcy5jb25maWcuYXBpS2V5LCB0aGlzLCBcImludmFsaWQtdXNlci10b2tlblwiIC8qIElOVkFMSURfQVVUSCAqLyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGVDdXJyZW50VXNlcih1c2VyICYmIHVzZXIuX2Nsb25lKHRoaXMpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIF91cGRhdGVDdXJyZW50VXNlcih1c2VyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RlbGV0ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICBfYXNzZXJ0KHRoaXMudGVuYW50SWQgPT09IHVzZXIudGVuYW50SWQsIHRoaXMsIFwidGVuYW50LWlkLW1pc21hdGNoXCIgLyogVEVOQU5UX0lEX01JU01BVENIICovKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRpcmVjdGx5U2V0Q3VycmVudFVzZXIodXNlcik7XHJcbiAgICAgICAgICAgIHRoaXMubm90aWZ5QXV0aExpc3RlbmVycygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgc2lnbk91dCgpIHtcclxuICAgICAgICAvLyBDbGVhciB0aGUgcmVkaXJlY3QgdXNlciB3aGVuIHNpZ25PdXQgaXMgY2FsbGVkXHJcbiAgICAgICAgaWYgKHRoaXMucmVkaXJlY3RQZXJzaXN0ZW5jZU1hbmFnZXIgfHwgdGhpcy5fcG9wdXBSZWRpcmVjdFJlc29sdmVyKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NldFJlZGlyZWN0VXNlcihudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZUN1cnJlbnRVc2VyKG51bGwpO1xyXG4gICAgfVxyXG4gICAgc2V0UGVyc2lzdGVuY2UocGVyc2lzdGVuY2UpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZShhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXNzZXJ0ZWRQZXJzaXN0ZW5jZS5zZXRQZXJzaXN0ZW5jZShfZ2V0SW5zdGFuY2UocGVyc2lzdGVuY2UpKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIF9nZXRQZXJzaXN0ZW5jZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hc3NlcnRlZFBlcnNpc3RlbmNlLnBlcnNpc3RlbmNlLnR5cGU7XHJcbiAgICB9XHJcbiAgICBfdXBkYXRlRXJyb3JNYXAoZXJyb3JNYXApIHtcclxuICAgICAgICB0aGlzLl9lcnJvckZhY3RvcnkgPSBuZXcgRXJyb3JGYWN0b3J5KCdhdXRoJywgJ0ZpcmViYXNlJywgZXJyb3JNYXAoKSk7XHJcbiAgICB9XHJcbiAgICBvbkF1dGhTdGF0ZUNoYW5nZWQobmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZWQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3RlclN0YXRlTGlzdGVuZXIodGhpcy5hdXRoU3RhdGVTdWJzY3JpcHRpb24sIG5leHRPck9ic2VydmVyLCBlcnJvciwgY29tcGxldGVkKTtcclxuICAgIH1cclxuICAgIG9uSWRUb2tlbkNoYW5nZWQobmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZWQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3RlclN0YXRlTGlzdGVuZXIodGhpcy5pZFRva2VuU3Vic2NyaXB0aW9uLCBuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlZCk7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGFwaUtleTogdGhpcy5jb25maWcuYXBpS2V5LFxyXG4gICAgICAgICAgICBhdXRoRG9tYWluOiB0aGlzLmNvbmZpZy5hdXRoRG9tYWluLFxyXG4gICAgICAgICAgICBhcHBOYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgICAgIGN1cnJlbnRVc2VyOiAoX2EgPSB0aGlzLl9jdXJyZW50VXNlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRvSlNPTigpXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGFzeW5jIF9zZXRSZWRpcmVjdFVzZXIodXNlciwgcG9wdXBSZWRpcmVjdFJlc29sdmVyKSB7XHJcbiAgICAgICAgY29uc3QgcmVkaXJlY3RNYW5hZ2VyID0gYXdhaXQgdGhpcy5nZXRPckluaXRSZWRpcmVjdFBlcnNpc3RlbmNlTWFuYWdlcihwb3B1cFJlZGlyZWN0UmVzb2x2ZXIpO1xyXG4gICAgICAgIHJldHVybiB1c2VyID09PSBudWxsXHJcbiAgICAgICAgICAgID8gcmVkaXJlY3RNYW5hZ2VyLnJlbW92ZUN1cnJlbnRVc2VyKClcclxuICAgICAgICAgICAgOiByZWRpcmVjdE1hbmFnZXIuc2V0Q3VycmVudFVzZXIodXNlcik7XHJcbiAgICB9XHJcbiAgICBhc3luYyBnZXRPckluaXRSZWRpcmVjdFBlcnNpc3RlbmNlTWFuYWdlcihwb3B1cFJlZGlyZWN0UmVzb2x2ZXIpIHtcclxuICAgICAgICBpZiAoIXRoaXMucmVkaXJlY3RQZXJzaXN0ZW5jZU1hbmFnZXIpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZXIgPSAocG9wdXBSZWRpcmVjdFJlc29sdmVyICYmIF9nZXRJbnN0YW5jZShwb3B1cFJlZGlyZWN0UmVzb2x2ZXIpKSB8fFxyXG4gICAgICAgICAgICAgICAgdGhpcy5fcG9wdXBSZWRpcmVjdFJlc29sdmVyO1xyXG4gICAgICAgICAgICBfYXNzZXJ0KHJlc29sdmVyLCB0aGlzLCBcImFyZ3VtZW50LWVycm9yXCIgLyogQVJHVU1FTlRfRVJST1IgKi8pO1xyXG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0UGVyc2lzdGVuY2VNYW5hZ2VyID0gYXdhaXQgUGVyc2lzdGVuY2VVc2VyTWFuYWdlci5jcmVhdGUodGhpcywgW19nZXRJbnN0YW5jZShyZXNvbHZlci5fcmVkaXJlY3RQZXJzaXN0ZW5jZSldLCBcInJlZGlyZWN0VXNlclwiIC8qIFJFRElSRUNUX1VTRVIgKi8pO1xyXG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0VXNlciA9XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlZGlyZWN0UGVyc2lzdGVuY2VNYW5hZ2VyLmdldEN1cnJlbnRVc2VyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnJlZGlyZWN0UGVyc2lzdGVuY2VNYW5hZ2VyO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgX3JlZGlyZWN0VXNlckZvcklkKGlkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICAvLyBNYWtlIHN1cmUgd2UndmUgY2xlYXJlZCBhbnkgcGVuZGluZyBwZXJzaXN0ZW5jZSBhY3Rpb25zIGlmIHdlJ3JlIG5vdCBpblxyXG4gICAgICAgIC8vIHRoZSBpbml0aWFsaXplclxyXG4gICAgICAgIGlmICh0aGlzLl9pc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucXVldWUoYXN5bmMgKCkgPT4geyB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCgoX2EgPSB0aGlzLl9jdXJyZW50VXNlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLl9yZWRpcmVjdEV2ZW50SWQpID09PSBpZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudFVzZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgoKF9iID0gdGhpcy5yZWRpcmVjdFVzZXIpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5fcmVkaXJlY3RFdmVudElkKSA9PT0gaWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVkaXJlY3RVc2VyO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGFzeW5jIF9wZXJzaXN0VXNlcklmQ3VycmVudCh1c2VyKSB7XHJcbiAgICAgICAgaWYgKHVzZXIgPT09IHRoaXMuY3VycmVudFVzZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucXVldWUoYXN5bmMgKCkgPT4gdGhpcy5kaXJlY3RseVNldEN1cnJlbnRVc2VyKHVzZXIpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKiogTm90aWZpZXMgbGlzdGVuZXJzIG9ubHkgaWYgdGhlIHVzZXIgaXMgY3VycmVudCAqL1xyXG4gICAgX25vdGlmeUxpc3RlbmVyc0lmQ3VycmVudCh1c2VyKSB7XHJcbiAgICAgICAgaWYgKHVzZXIgPT09IHRoaXMuY3VycmVudFVzZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5ub3RpZnlBdXRoTGlzdGVuZXJzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgX2tleSgpIHtcclxuICAgICAgICByZXR1cm4gYCR7dGhpcy5jb25maWcuYXV0aERvbWFpbn06JHt0aGlzLmNvbmZpZy5hcGlLZXl9OiR7dGhpcy5uYW1lfWA7XHJcbiAgICB9XHJcbiAgICBfc3RhcnRQcm9hY3RpdmVSZWZyZXNoKCkge1xyXG4gICAgICAgIHRoaXMuaXNQcm9hY3RpdmVSZWZyZXNoRW5hYmxlZCA9IHRydWU7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFVzZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fY3VycmVudFVzZXIuX3N0YXJ0UHJvYWN0aXZlUmVmcmVzaCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIF9zdG9wUHJvYWN0aXZlUmVmcmVzaCgpIHtcclxuICAgICAgICB0aGlzLmlzUHJvYWN0aXZlUmVmcmVzaEVuYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50VXNlcikge1xyXG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50VXNlci5fc3RvcFByb2FjdGl2ZVJlZnJlc2goKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKiogUmV0dXJucyB0aGUgY3VycmVudCB1c2VyIGNhc3QgYXMgdGhlIGludGVybmFsIHR5cGUgKi9cclxuICAgIGdldCBfY3VycmVudFVzZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFVzZXI7XHJcbiAgICB9XHJcbiAgICBub3RpZnlBdXRoTGlzdGVuZXJzKCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pZFRva2VuU3Vic2NyaXB0aW9uLm5leHQodGhpcy5jdXJyZW50VXNlcik7XHJcbiAgICAgICAgY29uc3QgY3VycmVudFVpZCA9IChfYiA9IChfYSA9IHRoaXMuY3VycmVudFVzZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS51aWQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IG51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMubGFzdE5vdGlmaWVkVWlkICE9PSBjdXJyZW50VWlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGFzdE5vdGlmaWVkVWlkID0gY3VycmVudFVpZDtcclxuICAgICAgICAgICAgdGhpcy5hdXRoU3RhdGVTdWJzY3JpcHRpb24ubmV4dCh0aGlzLmN1cnJlbnRVc2VyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZWdpc3RlclN0YXRlTGlzdGVuZXIoc3Vic2NyaXB0aW9uLCBuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlZCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kZWxldGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7IH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNiID0gdHlwZW9mIG5leHRPck9ic2VydmVyID09PSAnZnVuY3Rpb24nXHJcbiAgICAgICAgICAgID8gbmV4dE9yT2JzZXJ2ZXJcclxuICAgICAgICAgICAgOiBuZXh0T3JPYnNlcnZlci5uZXh0LmJpbmQobmV4dE9yT2JzZXJ2ZXIpO1xyXG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLl9pc0luaXRpYWxpemVkXHJcbiAgICAgICAgICAgID8gUHJvbWlzZS5yZXNvbHZlKClcclxuICAgICAgICAgICAgOiB0aGlzLl9pbml0aWFsaXphdGlvblByb21pc2U7XHJcbiAgICAgICAgX2Fzc2VydChwcm9taXNlLCB0aGlzLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgIC8vIFRoZSBjYWxsYmFjayBuZWVkcyB0byBiZSBjYWxsZWQgYXN5bmNocm9ub3VzbHkgcGVyIHRoZSBzcGVjLlxyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcclxuICAgICAgICBwcm9taXNlLnRoZW4oKCkgPT4gY2IodGhpcy5jdXJyZW50VXNlcikpO1xyXG4gICAgICAgIGlmICh0eXBlb2YgbmV4dE9yT2JzZXJ2ZXIgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbi5hZGRPYnNlcnZlcihuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gc3Vic2NyaXB0aW9uLmFkZE9ic2VydmVyKG5leHRPck9ic2VydmVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVucHJvdGVjdGVkIChmcm9tIHJhY2UgY29uZGl0aW9ucykgbWV0aG9kIHRvIHNldCB0aGUgY3VycmVudCB1c2VyLiBUaGlzXHJcbiAgICAgKiBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gYSBxdWV1ZWQgY2FsbGJhY2suIFRoaXMgaXMgbmVjZXNzYXJ5XHJcbiAgICAgKiBiZWNhdXNlIHRoZSBxdWV1ZSBzaG91bGRuJ3QgcmVseSBvbiBhbm90aGVyIHF1ZXVlZCBjYWxsYmFjay5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgZGlyZWN0bHlTZXRDdXJyZW50VXNlcih1c2VyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFVzZXIgJiYgdGhpcy5jdXJyZW50VXNlciAhPT0gdXNlcikge1xyXG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50VXNlci5fc3RvcFByb2FjdGl2ZVJlZnJlc2goKTtcclxuICAgICAgICAgICAgaWYgKHVzZXIgJiYgdGhpcy5pc1Byb2FjdGl2ZVJlZnJlc2hFbmFibGVkKSB7XHJcbiAgICAgICAgICAgICAgICB1c2VyLl9zdGFydFByb2FjdGl2ZVJlZnJlc2goKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmN1cnJlbnRVc2VyID0gdXNlcjtcclxuICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFzc2VydGVkUGVyc2lzdGVuY2Uuc2V0Q3VycmVudFVzZXIodXNlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFzc2VydGVkUGVyc2lzdGVuY2UucmVtb3ZlQ3VycmVudFVzZXIoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBxdWV1ZShhY3Rpb24pIHtcclxuICAgICAgICAvLyBJbiBjYXNlIHNvbWV0aGluZyBlcnJvcnMsIHRoZSBjYWxsYmFjayBzdGlsbCBzaG91bGQgYmUgY2FsbGVkIGluIG9yZGVyXHJcbiAgICAgICAgLy8gdG8ga2VlcCB0aGUgcHJvbWlzZSBjaGFpbiBhbGl2ZVxyXG4gICAgICAgIHRoaXMub3BlcmF0aW9ucyA9IHRoaXMub3BlcmF0aW9ucy50aGVuKGFjdGlvbiwgYWN0aW9uKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcGVyYXRpb25zO1xyXG4gICAgfVxyXG4gICAgZ2V0IGFzc2VydGVkUGVyc2lzdGVuY2UoKSB7XHJcbiAgICAgICAgX2Fzc2VydCh0aGlzLnBlcnNpc3RlbmNlTWFuYWdlciwgdGhpcywgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZU1hbmFnZXI7XHJcbiAgICB9XHJcbiAgICBfbG9nRnJhbWV3b3JrKGZyYW1ld29yaykge1xyXG4gICAgICAgIGlmICghZnJhbWV3b3JrIHx8IHRoaXMuZnJhbWV3b3Jrcy5pbmNsdWRlcyhmcmFtZXdvcmspKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5mcmFtZXdvcmtzLnB1c2goZnJhbWV3b3JrKTtcclxuICAgICAgICAvLyBTb3J0IGFscGhhYmV0aWNhbGx5IHNvIHRoYXQgXCJGaXJlYmFzZUNvcmUtd2ViLEZpcmViYXNlVUktd2ViXCIgYW5kXHJcbiAgICAgICAgLy8gXCJGaXJlYmFzZVVJLXdlYixGaXJlYmFzZUNvcmUtd2ViXCIgYXJlbid0IHZpZXdlZCBhcyBkaWZmZXJlbnQuXHJcbiAgICAgICAgdGhpcy5mcmFtZXdvcmtzLnNvcnQoKTtcclxuICAgICAgICB0aGlzLmNsaWVudFZlcnNpb24gPSBfZ2V0Q2xpZW50VmVyc2lvbih0aGlzLmNvbmZpZy5jbGllbnRQbGF0Zm9ybSwgdGhpcy5fZ2V0RnJhbWV3b3JrcygpKTtcclxuICAgIH1cclxuICAgIF9nZXRGcmFtZXdvcmtzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZyYW1ld29ya3M7XHJcbiAgICB9XHJcbiAgICBhc3luYyBfZ2V0QWRkaXRpb25hbEhlYWRlcnMoKSB7XHJcbiAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgIC8vIEFkZGl0aW9uYWwgaGVhZGVycyBvbiBldmVyeSByZXF1ZXN0XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHtcclxuICAgICAgICAgICAgW1wiWC1DbGllbnQtVmVyc2lvblwiIC8qIFhfQ0xJRU5UX1ZFUlNJT04gKi9dOiB0aGlzLmNsaWVudFZlcnNpb24sXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAodGhpcy5hcHAub3B0aW9ucy5hcHBJZCkge1xyXG4gICAgICAgICAgICBoZWFkZXJzW1wiWC1GaXJlYmFzZS1nbXBpZFwiIC8qIFhfRklSRUJBU0VfR01QSUQgKi9dID0gdGhpcy5hcHAub3B0aW9ucy5hcHBJZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSWYgdGhlIGhlYXJ0YmVhdCBzZXJ2aWNlIGV4aXN0cywgYWRkIHRoZSBoZWFydGJlYXQgc3RyaW5nXHJcbiAgICAgICAgY29uc3QgaGVhcnRiZWF0c0hlYWRlciA9IGF3YWl0ICgoX2EgPSB0aGlzLmhlYXJ0YmVhdFNlcnZpY2VQcm92aWRlci5nZXRJbW1lZGlhdGUoe1xyXG4gICAgICAgICAgICBvcHRpb25hbDogdHJ1ZSxcclxuICAgICAgICB9KSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmdldEhlYXJ0YmVhdHNIZWFkZXIoKSk7XHJcbiAgICAgICAgaWYgKGhlYXJ0YmVhdHNIZWFkZXIpIHtcclxuICAgICAgICAgICAgaGVhZGVyc1tcIlgtRmlyZWJhc2UtQ2xpZW50XCIgLyogWF9GSVJFQkFTRV9DTElFTlQgKi9dID0gaGVhcnRiZWF0c0hlYWRlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGhlYWRlcnM7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIE1ldGhvZCB0byBiZSB1c2VkIHRvIGNhc3QgZG93biB0byBvdXIgcHJpdmF0ZSBpbXBsbWVudGF0aW9uIG9mIEF1dGguXHJcbiAqIEl0IHdpbGwgYWxzbyBoYW5kbGUgdW53cmFwcGluZyBmcm9tIHRoZSBjb21wYXQgdHlwZSBpZiBuZWNlc3NhcnlcclxuICpcclxuICogQHBhcmFtIGF1dGggQXV0aCBvYmplY3QgcGFzc2VkIGluIGZyb20gZGV2ZWxvcGVyXHJcbiAqL1xyXG5mdW5jdGlvbiBfY2FzdEF1dGgoYXV0aCkge1xyXG4gICAgcmV0dXJuIGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKTtcclxufVxyXG4vKiogSGVscGVyIGNsYXNzIHRvIHdyYXAgc3Vic2NyaWJlciBsb2dpYyAqL1xyXG5jbGFzcyBTdWJzY3JpcHRpb24ge1xyXG4gICAgY29uc3RydWN0b3IoYXV0aCkge1xyXG4gICAgICAgIHRoaXMuYXV0aCA9IGF1dGg7XHJcbiAgICAgICAgdGhpcy5vYnNlcnZlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5hZGRPYnNlcnZlciA9IGNyZWF0ZVN1YnNjcmliZShvYnNlcnZlciA9PiAodGhpcy5vYnNlcnZlciA9IG9ic2VydmVyKSk7XHJcbiAgICB9XHJcbiAgICBnZXQgbmV4dCgpIHtcclxuICAgICAgICBfYXNzZXJ0KHRoaXMub2JzZXJ2ZXIsIHRoaXMuYXV0aCwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5vYnNlcnZlci5uZXh0LmJpbmQodGhpcy5vYnNlcnZlcik7XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIENoYW5nZXMgdGhlIHtAbGluayBBdXRofSBpbnN0YW5jZSB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBGaXJlYmFzZSBBdXRoIEVtdWxhdG9yLCBpbnN0ZWFkIG9mIHByb2R1Y3Rpb25cclxuICogRmlyZWJhc2UgQXV0aCBzZXJ2aWNlcy5cclxuICpcclxuICogQHJlbWFya3NcclxuICogVGhpcyBtdXN0IGJlIGNhbGxlZCBzeW5jaHJvbm91c2x5IGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgZmlyc3QgY2FsbCB0b1xyXG4gKiB7QGxpbmsgaW5pdGlhbGl6ZUF1dGh9LiAgRG8gbm90IHVzZSB3aXRoIHByb2R1Y3Rpb24gY3JlZGVudGlhbHMgYXMgZW11bGF0b3JcclxuICogdHJhZmZpYyBpcyBub3QgZW5jcnlwdGVkLlxyXG4gKlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIGNvbm5lY3RBdXRoRW11bGF0b3IoYXV0aCwgJ2h0dHA6Ly8xMjcuMC4wLjE6OTA5OScsIHsgZGlzYWJsZVdhcm5pbmdzOiB0cnVlIH0pO1xyXG4gKiBgYGBcclxuICpcclxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxyXG4gKiBAcGFyYW0gdXJsIC0gVGhlIFVSTCBhdCB3aGljaCB0aGUgZW11bGF0b3IgaXMgcnVubmluZyAoZWcsICdodHRwOi8vbG9jYWxob3N0OjkwOTknKS5cclxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbC4gYG9wdGlvbnMuZGlzYWJsZVdhcm5pbmdzYCBkZWZhdWx0cyB0byBgZmFsc2VgLiBTZXQgaXQgdG9cclxuICogYHRydWVgIHRvIGRpc2FibGUgdGhlIHdhcm5pbmcgYmFubmVyIGF0dGFjaGVkIHRvIHRoZSBET00uXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmZ1bmN0aW9uIGNvbm5lY3RBdXRoRW11bGF0b3IoYXV0aCwgdXJsLCBvcHRpb25zKSB7XHJcbiAgICBjb25zdCBhdXRoSW50ZXJuYWwgPSBfY2FzdEF1dGgoYXV0aCk7XHJcbiAgICBfYXNzZXJ0KGF1dGhJbnRlcm5hbC5fY2FuSW5pdEVtdWxhdG9yLCBhdXRoSW50ZXJuYWwsIFwiZW11bGF0b3ItY29uZmlnLWZhaWxlZFwiIC8qIEVNVUxBVE9SX0NPTkZJR19GQUlMRUQgKi8pO1xyXG4gICAgX2Fzc2VydCgvXmh0dHBzPzpcXC9cXC8vLnRlc3QodXJsKSwgYXV0aEludGVybmFsLCBcImludmFsaWQtZW11bGF0b3Itc2NoZW1lXCIgLyogSU5WQUxJRF9FTVVMQVRPUl9TQ0hFTUUgKi8pO1xyXG4gICAgY29uc3QgZGlzYWJsZVdhcm5pbmdzID0gISEob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmRpc2FibGVXYXJuaW5ncyk7XHJcbiAgICBjb25zdCBwcm90b2NvbCA9IGV4dHJhY3RQcm90b2NvbCh1cmwpO1xyXG4gICAgY29uc3QgeyBob3N0LCBwb3J0IH0gPSBleHRyYWN0SG9zdEFuZFBvcnQodXJsKTtcclxuICAgIGNvbnN0IHBvcnRTdHIgPSBwb3J0ID09PSBudWxsID8gJycgOiBgOiR7cG9ydH1gO1xyXG4gICAgLy8gQWx3YXlzIHJlcGxhY2UgcGF0aCB3aXRoIFwiL1wiIChldmVuIGlmIGlucHV0IHVybCBoYWQgbm8gcGF0aCBhdCBhbGwsIG9yIGhhZCBhIGRpZmZlcmVudCBvbmUpLlxyXG4gICAgYXV0aEludGVybmFsLmNvbmZpZy5lbXVsYXRvciA9IHsgdXJsOiBgJHtwcm90b2NvbH0vLyR7aG9zdH0ke3BvcnRTdHJ9L2AgfTtcclxuICAgIGF1dGhJbnRlcm5hbC5zZXR0aW5ncy5hcHBWZXJpZmljYXRpb25EaXNhYmxlZEZvclRlc3RpbmcgPSB0cnVlO1xyXG4gICAgYXV0aEludGVybmFsLmVtdWxhdG9yQ29uZmlnID0gT2JqZWN0LmZyZWV6ZSh7XHJcbiAgICAgICAgaG9zdCxcclxuICAgICAgICBwb3J0LFxyXG4gICAgICAgIHByb3RvY29sOiBwcm90b2NvbC5yZXBsYWNlKCc6JywgJycpLFxyXG4gICAgICAgIG9wdGlvbnM6IE9iamVjdC5mcmVlemUoeyBkaXNhYmxlV2FybmluZ3MgfSlcclxuICAgIH0pO1xyXG4gICAgaWYgKCFkaXNhYmxlV2FybmluZ3MpIHtcclxuICAgICAgICBlbWl0RW11bGF0b3JXYXJuaW5nKCk7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gZXh0cmFjdFByb3RvY29sKHVybCkge1xyXG4gICAgY29uc3QgcHJvdG9jb2xFbmQgPSB1cmwuaW5kZXhPZignOicpO1xyXG4gICAgcmV0dXJuIHByb3RvY29sRW5kIDwgMCA/ICcnIDogdXJsLnN1YnN0cigwLCBwcm90b2NvbEVuZCArIDEpO1xyXG59XHJcbmZ1bmN0aW9uIGV4dHJhY3RIb3N0QW5kUG9ydCh1cmwpIHtcclxuICAgIGNvbnN0IHByb3RvY29sID0gZXh0cmFjdFByb3RvY29sKHVybCk7XHJcbiAgICBjb25zdCBhdXRob3JpdHkgPSAvKFxcL1xcLyk/KFtePyMvXSspLy5leGVjKHVybC5zdWJzdHIocHJvdG9jb2wubGVuZ3RoKSk7IC8vIEJldHdlZW4gLy8gYW5kIC8sID8gb3IgIy5cclxuICAgIGlmICghYXV0aG9yaXR5KSB7XHJcbiAgICAgICAgcmV0dXJuIHsgaG9zdDogJycsIHBvcnQ6IG51bGwgfTtcclxuICAgIH1cclxuICAgIGNvbnN0IGhvc3RBbmRQb3J0ID0gYXV0aG9yaXR5WzJdLnNwbGl0KCdAJykucG9wKCkgfHwgJyc7IC8vIFN0cmlwIG91dCBcInVzZXJuYW1lOnBhc3N3b3JkQFwiLlxyXG4gICAgY29uc3QgYnJhY2tldGVkSVB2NiA9IC9eKFxcW1teXFxdXStcXF0pKDp8JCkvLmV4ZWMoaG9zdEFuZFBvcnQpO1xyXG4gICAgaWYgKGJyYWNrZXRlZElQdjYpIHtcclxuICAgICAgICBjb25zdCBob3N0ID0gYnJhY2tldGVkSVB2NlsxXTtcclxuICAgICAgICByZXR1cm4geyBob3N0LCBwb3J0OiBwYXJzZVBvcnQoaG9zdEFuZFBvcnQuc3Vic3RyKGhvc3QubGVuZ3RoICsgMSkpIH07XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBjb25zdCBbaG9zdCwgcG9ydF0gPSBob3N0QW5kUG9ydC5zcGxpdCgnOicpO1xyXG4gICAgICAgIHJldHVybiB7IGhvc3QsIHBvcnQ6IHBhcnNlUG9ydChwb3J0KSB9O1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHBhcnNlUG9ydChwb3J0U3RyKSB7XHJcbiAgICBpZiAoIXBvcnRTdHIpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocG9ydFN0cik7XHJcbiAgICBpZiAoaXNOYU4ocG9ydCkpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiBwb3J0O1xyXG59XHJcbmZ1bmN0aW9uIGVtaXRFbXVsYXRvcldhcm5pbmcoKSB7XHJcbiAgICBmdW5jdGlvbiBhdHRhY2hCYW5uZXIoKSB7XHJcbiAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XHJcbiAgICAgICAgY29uc3Qgc3R5ID0gZWwuc3R5bGU7XHJcbiAgICAgICAgZWwuaW5uZXJUZXh0ID1cclxuICAgICAgICAgICAgJ1J1bm5pbmcgaW4gZW11bGF0b3IgbW9kZS4gRG8gbm90IHVzZSB3aXRoIHByb2R1Y3Rpb24gY3JlZGVudGlhbHMuJztcclxuICAgICAgICBzdHkucG9zaXRpb24gPSAnZml4ZWQnO1xyXG4gICAgICAgIHN0eS53aWR0aCA9ICcxMDAlJztcclxuICAgICAgICBzdHkuYmFja2dyb3VuZENvbG9yID0gJyNmZmZmZmYnO1xyXG4gICAgICAgIHN0eS5ib3JkZXIgPSAnLjFlbSBzb2xpZCAjMDAwMDAwJztcclxuICAgICAgICBzdHkuY29sb3IgPSAnI2I1MDAwMCc7XHJcbiAgICAgICAgc3R5LmJvdHRvbSA9ICcwcHgnO1xyXG4gICAgICAgIHN0eS5sZWZ0ID0gJzBweCc7XHJcbiAgICAgICAgc3R5Lm1hcmdpbiA9ICcwcHgnO1xyXG4gICAgICAgIHN0eS56SW5kZXggPSAnMTAwMDAnO1xyXG4gICAgICAgIHN0eS50ZXh0QWxpZ24gPSAnY2VudGVyJztcclxuICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKCdmaXJlYmFzZS1lbXVsYXRvci13YXJuaW5nJyk7XHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlbCk7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zb2xlLmluZm8gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICBjb25zb2xlLmluZm8oJ1dBUk5JTkc6IFlvdSBhcmUgdXNpbmcgdGhlIEF1dGggRW11bGF0b3IsJyArXHJcbiAgICAgICAgICAgICcgd2hpY2ggaXMgaW50ZW5kZWQgZm9yIGxvY2FsIHRlc3Rpbmcgb25seS4gIERvIG5vdCB1c2Ugd2l0aCcgK1xyXG4gICAgICAgICAgICAnIHByb2R1Y3Rpb24gY3JlZGVudGlhbHMuJyk7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcclxuICAgICAgICB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykge1xyXG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGF0dGFjaEJhbm5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBhdHRhY2hCYW5uZXIoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIEludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMgdGhlIGNyZWRlbnRpYWxzIHJldHVybmVkIGJ5IGFuIHtAbGluayBBdXRoUHJvdmlkZXJ9LlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBJbXBsZW1lbnRhdGlvbnMgc3BlY2lmeSB0aGUgZGV0YWlscyBhYm91dCBlYWNoIGF1dGggcHJvdmlkZXIncyBjcmVkZW50aWFsIHJlcXVpcmVtZW50cy5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY2xhc3MgQXV0aENyZWRlbnRpYWwge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBhdXRoZW50aWNhdGlvbiBwcm92aWRlciBJRCBmb3IgdGhlIGNyZWRlbnRpYWwuXHJcbiAgICAgKlxyXG4gICAgICogQHJlbWFya3NcclxuICAgICAqIEZvciBleGFtcGxlLCAnZmFjZWJvb2suY29tJywgb3IgJ2dvb2dsZS5jb20nLlxyXG4gICAgICovXHJcbiAgICBwcm92aWRlcklkLCBcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGF1dGhlbnRpY2F0aW9uIHNpZ24gaW4gbWV0aG9kIGZvciB0aGUgY3JlZGVudGlhbC5cclxuICAgICAqXHJcbiAgICAgKiBAcmVtYXJrc1xyXG4gICAgICogRm9yIGV4YW1wbGUsIHtAbGluayBTaWduSW5NZXRob2R9LkVNQUlMX1BBU1NXT1JELCBvclxyXG4gICAgICoge0BsaW5rIFNpZ25Jbk1ldGhvZH0uRU1BSUxfTElOSy4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgc2lnbi1pbiBtZXRob2RcclxuICAgICAqIGlkZW50aWZpZXIgYXMgcmV0dXJuZWQgaW4ge0BsaW5rIGZldGNoU2lnbkluTWV0aG9kc0ZvckVtYWlsfS5cclxuICAgICAqL1xyXG4gICAgc2lnbkluTWV0aG9kKSB7XHJcbiAgICAgICAgdGhpcy5wcm92aWRlcklkID0gcHJvdmlkZXJJZDtcclxuICAgICAgICB0aGlzLnNpZ25Jbk1ldGhvZCA9IHNpZ25Jbk1ldGhvZDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIEpTT04tc2VyaWFsaXphYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIGEgSlNPTi1zZXJpYWxpemFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICByZXR1cm4gZGVidWdGYWlsKCdub3QgaW1wbGVtZW50ZWQnKTtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF9nZXRJZFRva2VuUmVzcG9uc2UoX2F1dGgpIHtcclxuICAgICAgICByZXR1cm4gZGVidWdGYWlsKCdub3QgaW1wbGVtZW50ZWQnKTtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF9saW5rVG9JZFRva2VuKF9hdXRoLCBfaWRUb2tlbikge1xyXG4gICAgICAgIHJldHVybiBkZWJ1Z0ZhaWwoJ25vdCBpbXBsZW1lbnRlZCcpO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgX2dldFJlYXV0aGVudGljYXRpb25SZXNvbHZlcihfYXV0aCkge1xyXG4gICAgICAgIHJldHVybiBkZWJ1Z0ZhaWwoJ25vdCBpbXBsZW1lbnRlZCcpO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHJlc2V0UGFzc3dvcmQoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdChhdXRoLCBcIlBPU1RcIiAvKiBQT1NUICovLCBcIi92MS9hY2NvdW50czpyZXNldFBhc3N3b3JkXCIgLyogUkVTRVRfUEFTU1dPUkQgKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlRW1haWxQYXNzd29yZChhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0KGF1dGgsIFwiUE9TVFwiIC8qIFBPU1QgKi8sIFwiL3YxL2FjY291bnRzOnVwZGF0ZVwiIC8qIFNFVF9BQ0NPVU5UX0lORk8gKi8sIHJlcXVlc3QpO1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIGFwcGx5QWN0aW9uQ29kZSQxKGF1dGgsIHJlcXVlc3QpIHtcclxuICAgIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3QoYXV0aCwgXCJQT1NUXCIgLyogUE9TVCAqLywgXCIvdjEvYWNjb3VudHM6dXBkYXRlXCIgLyogU0VUX0FDQ09VTlRfSU5GTyAqLywgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBzaWduSW5XaXRoUGFzc3dvcmQoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgcmV0dXJuIF9wZXJmb3JtU2lnbkluUmVxdWVzdChhdXRoLCBcIlBPU1RcIiAvKiBQT1NUICovLCBcIi92MS9hY2NvdW50czpzaWduSW5XaXRoUGFzc3dvcmRcIiAvKiBTSUdOX0lOX1dJVEhfUEFTU1dPUkQgKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gc2VuZE9vYkNvZGUoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdChhdXRoLCBcIlBPU1RcIiAvKiBQT1NUICovLCBcIi92MS9hY2NvdW50czpzZW5kT29iQ29kZVwiIC8qIFNFTkRfT09CX0NPREUgKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gc2VuZEVtYWlsVmVyaWZpY2F0aW9uJDEoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgcmV0dXJuIHNlbmRPb2JDb2RlKGF1dGgsIHJlcXVlc3QpO1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIHNlbmRQYXNzd29yZFJlc2V0RW1haWwkMShhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gc2VuZE9vYkNvZGUoYXV0aCwgcmVxdWVzdCk7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gc2VuZFNpZ25JbkxpbmtUb0VtYWlsJDEoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgcmV0dXJuIHNlbmRPb2JDb2RlKGF1dGgsIHJlcXVlc3QpO1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeUFuZENoYW5nZUVtYWlsKGF1dGgsIHJlcXVlc3QpIHtcclxuICAgIHJldHVybiBzZW5kT29iQ29kZShhdXRoLCByZXF1ZXN0KTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBzaWduSW5XaXRoRW1haWxMaW5rJDEoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgcmV0dXJuIF9wZXJmb3JtU2lnbkluUmVxdWVzdChhdXRoLCBcIlBPU1RcIiAvKiBQT1NUICovLCBcIi92MS9hY2NvdW50czpzaWduSW5XaXRoRW1haWxMaW5rXCIgLyogU0lHTl9JTl9XSVRIX0VNQUlMX0xJTksgKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gc2lnbkluV2l0aEVtYWlsTGlua0ZvckxpbmtpbmcoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgcmV0dXJuIF9wZXJmb3JtU2lnbkluUmVxdWVzdChhdXRoLCBcIlBPU1RcIiAvKiBQT1NUICovLCBcIi92MS9hY2NvdW50czpzaWduSW5XaXRoRW1haWxMaW5rXCIgLyogU0lHTl9JTl9XSVRIX0VNQUlMX0xJTksgKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIEludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMgdGhlIGNyZWRlbnRpYWxzIHJldHVybmVkIGJ5IHtAbGluayBFbWFpbEF1dGhQcm92aWRlcn0gZm9yXHJcbiAqIHtAbGluayBQcm92aWRlcklkfS5QQVNTV09SRFxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBDb3ZlcnMgYm90aCB7QGxpbmsgU2lnbkluTWV0aG9kfS5FTUFJTF9QQVNTV09SRCBhbmRcclxuICoge0BsaW5rIFNpZ25Jbk1ldGhvZH0uRU1BSUxfTElOSy5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY2xhc3MgRW1haWxBdXRoQ3JlZGVudGlhbCBleHRlbmRzIEF1dGhDcmVkZW50aWFsIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgX2VtYWlsLCBcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF9wYXNzd29yZCwgc2lnbkluTWV0aG9kLCBcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF90ZW5hbnRJZCA9IG51bGwpIHtcclxuICAgICAgICBzdXBlcihcInBhc3N3b3JkXCIgLyogUEFTU1dPUkQgKi8sIHNpZ25Jbk1ldGhvZCk7XHJcbiAgICAgICAgdGhpcy5fZW1haWwgPSBfZW1haWw7XHJcbiAgICAgICAgdGhpcy5fcGFzc3dvcmQgPSBfcGFzc3dvcmQ7XHJcbiAgICAgICAgdGhpcy5fdGVuYW50SWQgPSBfdGVuYW50SWQ7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzdGF0aWMgX2Zyb21FbWFpbEFuZFBhc3N3b3JkKGVtYWlsLCBwYXNzd29yZCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgRW1haWxBdXRoQ3JlZGVudGlhbChlbWFpbCwgcGFzc3dvcmQsIFwicGFzc3dvcmRcIiAvKiBFTUFJTF9QQVNTV09SRCAqLyk7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzdGF0aWMgX2Zyb21FbWFpbEFuZENvZGUoZW1haWwsIG9vYkNvZGUsIHRlbmFudElkID0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgRW1haWxBdXRoQ3JlZGVudGlhbChlbWFpbCwgb29iQ29kZSwgXCJlbWFpbExpbmtcIiAvKiBFTUFJTF9MSU5LICovLCB0ZW5hbnRJZCk7XHJcbiAgICB9XHJcbiAgICAvKioge0Bpbmhlcml0ZG9jIEF1dGhDcmVkZW50aWFsLnRvSlNPTn0gKi9cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBlbWFpbDogdGhpcy5fZW1haWwsXHJcbiAgICAgICAgICAgIHBhc3N3b3JkOiB0aGlzLl9wYXNzd29yZCxcclxuICAgICAgICAgICAgc2lnbkluTWV0aG9kOiB0aGlzLnNpZ25Jbk1ldGhvZCxcclxuICAgICAgICAgICAgdGVuYW50SWQ6IHRoaXMuX3RlbmFudElkXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU3RhdGljIG1ldGhvZCB0byBkZXNlcmlhbGl6ZSBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0IGludG8gYW4ge0BsaW5rICBBdXRoQ3JlZGVudGlhbH0uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGpzb24gLSBFaXRoZXIgYG9iamVjdGAgb3IgdGhlIHN0cmluZ2lmaWVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QuIFdoZW4gc3RyaW5nIGlzXHJcbiAgICAgKiBwcm92aWRlZCwgYEpTT04ucGFyc2VgIHdvdWxkIGJlIGNhbGxlZCBmaXJzdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBJZiB0aGUgSlNPTiBpbnB1dCBkb2VzIG5vdCByZXByZXNlbnQgYW4ge0BsaW5rIEF1dGhDcmVkZW50aWFsfSwgbnVsbCBpcyByZXR1cm5lZC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGZyb21KU09OKGpzb24pIHtcclxuICAgICAgICBjb25zdCBvYmogPSB0eXBlb2YganNvbiA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKGpzb24pIDoganNvbjtcclxuICAgICAgICBpZiAoKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9iai5lbWFpbCkgJiYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9iai5wYXNzd29yZCkpIHtcclxuICAgICAgICAgICAgaWYgKG9iai5zaWduSW5NZXRob2QgPT09IFwicGFzc3dvcmRcIiAvKiBFTUFJTF9QQVNTV09SRCAqLykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Zyb21FbWFpbEFuZFBhc3N3b3JkKG9iai5lbWFpbCwgb2JqLnBhc3N3b3JkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChvYmouc2lnbkluTWV0aG9kID09PSBcImVtYWlsTGlua1wiIC8qIEVNQUlMX0xJTksgKi8pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9mcm9tRW1haWxBbmRDb2RlKG9iai5lbWFpbCwgb2JqLnBhc3N3b3JkLCBvYmoudGVuYW50SWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgYXN5bmMgX2dldElkVG9rZW5SZXNwb25zZShhdXRoKSB7XHJcbiAgICAgICAgc3dpdGNoICh0aGlzLnNpZ25Jbk1ldGhvZCkge1xyXG4gICAgICAgICAgICBjYXNlIFwicGFzc3dvcmRcIiAvKiBFTUFJTF9QQVNTV09SRCAqLzpcclxuICAgICAgICAgICAgICAgIHJldHVybiBzaWduSW5XaXRoUGFzc3dvcmQoYXV0aCwge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVyblNlY3VyZVRva2VuOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIGVtYWlsOiB0aGlzLl9lbWFpbCxcclxuICAgICAgICAgICAgICAgICAgICBwYXNzd29yZDogdGhpcy5fcGFzc3dvcmRcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjYXNlIFwiZW1haWxMaW5rXCIgLyogRU1BSUxfTElOSyAqLzpcclxuICAgICAgICAgICAgICAgIHJldHVybiBzaWduSW5XaXRoRW1haWxMaW5rJDEoYXV0aCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGVtYWlsOiB0aGlzLl9lbWFpbCxcclxuICAgICAgICAgICAgICAgICAgICBvb2JDb2RlOiB0aGlzLl9wYXNzd29yZFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBfZmFpbChhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGFzeW5jIF9saW5rVG9JZFRva2VuKGF1dGgsIGlkVG9rZW4pIHtcclxuICAgICAgICBzd2l0Y2ggKHRoaXMuc2lnbkluTWV0aG9kKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJwYXNzd29yZFwiIC8qIEVNQUlMX1BBU1NXT1JEICovOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUVtYWlsUGFzc3dvcmQoYXV0aCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGlkVG9rZW4sXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuU2VjdXJlVG9rZW46IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgZW1haWw6IHRoaXMuX2VtYWlsLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkOiB0aGlzLl9wYXNzd29yZFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJlbWFpbExpbmtcIiAvKiBFTUFJTF9MSU5LICovOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNpZ25JbldpdGhFbWFpbExpbmtGb3JMaW5raW5nKGF1dGgsIHtcclxuICAgICAgICAgICAgICAgICAgICBpZFRva2VuLFxyXG4gICAgICAgICAgICAgICAgICAgIGVtYWlsOiB0aGlzLl9lbWFpbCxcclxuICAgICAgICAgICAgICAgICAgICBvb2JDb2RlOiB0aGlzLl9wYXNzd29yZFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBfZmFpbChhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF9nZXRSZWF1dGhlbnRpY2F0aW9uUmVzb2x2ZXIoYXV0aCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRJZFRva2VuUmVzcG9uc2UoYXV0aCk7XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gc2lnbkluV2l0aElkcChhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gX3BlcmZvcm1TaWduSW5SZXF1ZXN0KGF1dGgsIFwiUE9TVFwiIC8qIFBPU1QgKi8sIFwiL3YxL2FjY291bnRzOnNpZ25JbldpdGhJZHBcIiAvKiBTSUdOX0lOX1dJVEhfSURQICovLCBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdCkpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IElEUF9SRVFVRVNUX1VSSSQxID0gJ2h0dHA6Ly9sb2NhbGhvc3QnO1xyXG4vKipcclxuICogUmVwcmVzZW50cyB0aGUgT0F1dGggY3JlZGVudGlhbHMgcmV0dXJuZWQgYnkgYW4ge0BsaW5rIE9BdXRoUHJvdmlkZXJ9LlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBJbXBsZW1lbnRhdGlvbnMgc3BlY2lmeSB0aGUgZGV0YWlscyBhYm91dCBlYWNoIGF1dGggcHJvdmlkZXIncyBjcmVkZW50aWFsIHJlcXVpcmVtZW50cy5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY2xhc3MgT0F1dGhDcmVkZW50aWFsIGV4dGVuZHMgQXV0aENyZWRlbnRpYWwge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLnBlbmRpbmdUb2tlbiA9IG51bGw7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzdGF0aWMgX2Zyb21QYXJhbXMocGFyYW1zKSB7XHJcbiAgICAgICAgY29uc3QgY3JlZCA9IG5ldyBPQXV0aENyZWRlbnRpYWwocGFyYW1zLnByb3ZpZGVySWQsIHBhcmFtcy5zaWduSW5NZXRob2QpO1xyXG4gICAgICAgIGlmIChwYXJhbXMuaWRUb2tlbiB8fCBwYXJhbXMuYWNjZXNzVG9rZW4pIHtcclxuICAgICAgICAgICAgLy8gT0F1dGggMiBhbmQgZWl0aGVyIElEIHRva2VuIG9yIGFjY2VzcyB0b2tlbi5cclxuICAgICAgICAgICAgaWYgKHBhcmFtcy5pZFRva2VuKSB7XHJcbiAgICAgICAgICAgICAgICBjcmVkLmlkVG9rZW4gPSBwYXJhbXMuaWRUb2tlbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocGFyYW1zLmFjY2Vzc1Rva2VuKSB7XHJcbiAgICAgICAgICAgICAgICBjcmVkLmFjY2Vzc1Rva2VuID0gcGFyYW1zLmFjY2Vzc1Rva2VuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIEFkZCBub25jZSBpZiBhdmFpbGFibGUgYW5kIG5vIHBlbmRpbmdUb2tlbiBpcyBwcmVzZW50LlxyXG4gICAgICAgICAgICBpZiAocGFyYW1zLm5vbmNlICYmICFwYXJhbXMucGVuZGluZ1Rva2VuKSB7XHJcbiAgICAgICAgICAgICAgICBjcmVkLm5vbmNlID0gcGFyYW1zLm5vbmNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwYXJhbXMucGVuZGluZ1Rva2VuKSB7XHJcbiAgICAgICAgICAgICAgICBjcmVkLnBlbmRpbmdUb2tlbiA9IHBhcmFtcy5wZW5kaW5nVG9rZW47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocGFyYW1zLm9hdXRoVG9rZW4gJiYgcGFyYW1zLm9hdXRoVG9rZW5TZWNyZXQpIHtcclxuICAgICAgICAgICAgLy8gT0F1dGggMSBhbmQgT0F1dGggdG9rZW4gd2l0aCB0b2tlbiBzZWNyZXRcclxuICAgICAgICAgICAgY3JlZC5hY2Nlc3NUb2tlbiA9IHBhcmFtcy5vYXV0aFRva2VuO1xyXG4gICAgICAgICAgICBjcmVkLnNlY3JldCA9IHBhcmFtcy5vYXV0aFRva2VuU2VjcmV0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgX2ZhaWwoXCJhcmd1bWVudC1lcnJvclwiIC8qIEFSR1VNRU5UX0VSUk9SICovKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNyZWQ7XHJcbiAgICB9XHJcbiAgICAvKioge0Bpbmhlcml0ZG9jIEF1dGhDcmVkZW50aWFsLnRvSlNPTn0gICovXHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgaWRUb2tlbjogdGhpcy5pZFRva2VuLFxyXG4gICAgICAgICAgICBhY2Nlc3NUb2tlbjogdGhpcy5hY2Nlc3NUb2tlbixcclxuICAgICAgICAgICAgc2VjcmV0OiB0aGlzLnNlY3JldCxcclxuICAgICAgICAgICAgbm9uY2U6IHRoaXMubm9uY2UsXHJcbiAgICAgICAgICAgIHBlbmRpbmdUb2tlbjogdGhpcy5wZW5kaW5nVG9rZW4sXHJcbiAgICAgICAgICAgIHByb3ZpZGVySWQ6IHRoaXMucHJvdmlkZXJJZCxcclxuICAgICAgICAgICAgc2lnbkluTWV0aG9kOiB0aGlzLnNpZ25Jbk1ldGhvZFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFN0YXRpYyBtZXRob2QgdG8gZGVzZXJpYWxpemUgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdCBpbnRvIGFuXHJcbiAgICAgKiB7QGxpbmsgIEF1dGhDcmVkZW50aWFsfS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ganNvbiAtIElucHV0IGNhbiBiZSBlaXRoZXIgT2JqZWN0IG9yIHRoZSBzdHJpbmdpZmllZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LlxyXG4gICAgICogV2hlbiBzdHJpbmcgaXMgcHJvdmlkZWQsIEpTT04ucGFyc2Ugd291bGQgYmUgY2FsbGVkIGZpcnN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIElmIHRoZSBKU09OIGlucHV0IGRvZXMgbm90IHJlcHJlc2VudCBhbiB7QGxpbmsgIEF1dGhDcmVkZW50aWFsfSwgbnVsbCBpcyByZXR1cm5lZC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGZyb21KU09OKGpzb24pIHtcclxuICAgICAgICBjb25zdCBvYmogPSB0eXBlb2YganNvbiA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKGpzb24pIDoganNvbjtcclxuICAgICAgICBjb25zdCB7IHByb3ZpZGVySWQsIHNpZ25Jbk1ldGhvZCB9ID0gb2JqLCByZXN0ID0gX19yZXN0KG9iaiwgW1wicHJvdmlkZXJJZFwiLCBcInNpZ25Jbk1ldGhvZFwiXSk7XHJcbiAgICAgICAgaWYgKCFwcm92aWRlcklkIHx8ICFzaWduSW5NZXRob2QpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNyZWQgPSBuZXcgT0F1dGhDcmVkZW50aWFsKHByb3ZpZGVySWQsIHNpZ25Jbk1ldGhvZCk7XHJcbiAgICAgICAgY3JlZC5pZFRva2VuID0gcmVzdC5pZFRva2VuIHx8IHVuZGVmaW5lZDtcclxuICAgICAgICBjcmVkLmFjY2Vzc1Rva2VuID0gcmVzdC5hY2Nlc3NUb2tlbiB8fCB1bmRlZmluZWQ7XHJcbiAgICAgICAgY3JlZC5zZWNyZXQgPSByZXN0LnNlY3JldDtcclxuICAgICAgICBjcmVkLm5vbmNlID0gcmVzdC5ub25jZTtcclxuICAgICAgICBjcmVkLnBlbmRpbmdUb2tlbiA9IHJlc3QucGVuZGluZ1Rva2VuIHx8IG51bGw7XHJcbiAgICAgICAgcmV0dXJuIGNyZWQ7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBfZ2V0SWRUb2tlblJlc3BvbnNlKGF1dGgpIHtcclxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5idWlsZFJlcXVlc3QoKTtcclxuICAgICAgICByZXR1cm4gc2lnbkluV2l0aElkcChhdXRoLCByZXF1ZXN0KTtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF9saW5rVG9JZFRva2VuKGF1dGgsIGlkVG9rZW4pIHtcclxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5idWlsZFJlcXVlc3QoKTtcclxuICAgICAgICByZXF1ZXN0LmlkVG9rZW4gPSBpZFRva2VuO1xyXG4gICAgICAgIHJldHVybiBzaWduSW5XaXRoSWRwKGF1dGgsIHJlcXVlc3QpO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgX2dldFJlYXV0aGVudGljYXRpb25SZXNvbHZlcihhdXRoKSB7XHJcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuYnVpbGRSZXF1ZXN0KCk7XHJcbiAgICAgICAgcmVxdWVzdC5hdXRvQ3JlYXRlID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIHNpZ25JbldpdGhJZHAoYXV0aCwgcmVxdWVzdCk7XHJcbiAgICB9XHJcbiAgICBidWlsZFJlcXVlc3QoKSB7XHJcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHtcclxuICAgICAgICAgICAgcmVxdWVzdFVyaTogSURQX1JFUVVFU1RfVVJJJDEsXHJcbiAgICAgICAgICAgIHJldHVyblNlY3VyZVRva2VuOiB0cnVlXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAodGhpcy5wZW5kaW5nVG9rZW4pIHtcclxuICAgICAgICAgICAgcmVxdWVzdC5wZW5kaW5nVG9rZW4gPSB0aGlzLnBlbmRpbmdUb2tlbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvc3RCb2R5ID0ge307XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlkVG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIHBvc3RCb2R5WydpZF90b2tlbiddID0gdGhpcy5pZFRva2VuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmFjY2Vzc1Rva2VuKSB7XHJcbiAgICAgICAgICAgICAgICBwb3N0Qm9keVsnYWNjZXNzX3Rva2VuJ10gPSB0aGlzLmFjY2Vzc1Rva2VuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlY3JldCkge1xyXG4gICAgICAgICAgICAgICAgcG9zdEJvZHlbJ29hdXRoX3Rva2VuX3NlY3JldCddID0gdGhpcy5zZWNyZXQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcG9zdEJvZHlbJ3Byb3ZpZGVySWQnXSA9IHRoaXMucHJvdmlkZXJJZDtcclxuICAgICAgICAgICAgaWYgKHRoaXMubm9uY2UgJiYgIXRoaXMucGVuZGluZ1Rva2VuKSB7XHJcbiAgICAgICAgICAgICAgICBwb3N0Qm9keVsnbm9uY2UnXSA9IHRoaXMubm9uY2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVxdWVzdC5wb3N0Qm9keSA9IHF1ZXJ5c3RyaW5nKHBvc3RCb2R5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlcXVlc3Q7XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gc2VuZFBob25lVmVyaWZpY2F0aW9uQ29kZShhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0KGF1dGgsIFwiUE9TVFwiIC8qIFBPU1QgKi8sIFwiL3YxL2FjY291bnRzOnNlbmRWZXJpZmljYXRpb25Db2RlXCIgLyogU0VORF9WRVJJRklDQVRJT05fQ09ERSAqLywgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpKTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBzaWduSW5XaXRoUGhvbmVOdW1iZXIkMShhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gX3BlcmZvcm1TaWduSW5SZXF1ZXN0KGF1dGgsIFwiUE9TVFwiIC8qIFBPU1QgKi8sIFwiL3YxL2FjY291bnRzOnNpZ25JbldpdGhQaG9uZU51bWJlclwiIC8qIFNJR05fSU5fV0lUSF9QSE9ORV9OVU1CRVIgKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gbGlua1dpdGhQaG9uZU51bWJlciQxKGF1dGgsIHJlcXVlc3QpIHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgX3BlcmZvcm1TaWduSW5SZXF1ZXN0KGF1dGgsIFwiUE9TVFwiIC8qIFBPU1QgKi8sIFwiL3YxL2FjY291bnRzOnNpZ25JbldpdGhQaG9uZU51bWJlclwiIC8qIFNJR05fSU5fV0lUSF9QSE9ORV9OVU1CRVIgKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbiAgICBpZiAocmVzcG9uc2UudGVtcG9yYXJ5UHJvb2YpIHtcclxuICAgICAgICB0aHJvdyBfbWFrZVRhZ2dlZEVycm9yKGF1dGgsIFwiYWNjb3VudC1leGlzdHMtd2l0aC1kaWZmZXJlbnQtY3JlZGVudGlhbFwiIC8qIE5FRURfQ09ORklSTUFUSU9OICovLCByZXNwb25zZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzcG9uc2U7XHJcbn1cclxuY29uc3QgVkVSSUZZX1BIT05FX05VTUJFUl9GT1JfRVhJU1RJTkdfRVJST1JfTUFQXyA9IHtcclxuICAgIFtcIlVTRVJfTk9UX0ZPVU5EXCIgLyogVVNFUl9OT1RfRk9VTkQgKi9dOiBcInVzZXItbm90LWZvdW5kXCIgLyogVVNFUl9ERUxFVEVEICovXHJcbn07XHJcbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeVBob25lTnVtYmVyRm9yRXhpc3RpbmcoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgY29uc3QgYXBpUmVxdWVzdCA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVxdWVzdCksIHsgb3BlcmF0aW9uOiAnUkVBVVRIJyB9KTtcclxuICAgIHJldHVybiBfcGVyZm9ybVNpZ25JblJlcXVlc3QoYXV0aCwgXCJQT1NUXCIgLyogUE9TVCAqLywgXCIvdjEvYWNjb3VudHM6c2lnbkluV2l0aFBob25lTnVtYmVyXCIgLyogU0lHTl9JTl9XSVRIX1BIT05FX05VTUJFUiAqLywgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIGFwaVJlcXVlc3QpLCBWRVJJRllfUEhPTkVfTlVNQkVSX0ZPUl9FWElTVElOR19FUlJPUl9NQVBfKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogUmVwcmVzZW50cyB0aGUgY3JlZGVudGlhbHMgcmV0dXJuZWQgYnkge0BsaW5rIFBob25lQXV0aFByb3ZpZGVyfS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY2xhc3MgUGhvbmVBdXRoQ3JlZGVudGlhbCBleHRlbmRzIEF1dGhDcmVkZW50aWFsIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtcykge1xyXG4gICAgICAgIHN1cGVyKFwicGhvbmVcIiAvKiBQSE9ORSAqLywgXCJwaG9uZVwiIC8qIFBIT05FICovKTtcclxuICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHN0YXRpYyBfZnJvbVZlcmlmaWNhdGlvbih2ZXJpZmljYXRpb25JZCwgdmVyaWZpY2F0aW9uQ29kZSkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUGhvbmVBdXRoQ3JlZGVudGlhbCh7IHZlcmlmaWNhdGlvbklkLCB2ZXJpZmljYXRpb25Db2RlIH0pO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc3RhdGljIF9mcm9tVG9rZW5SZXNwb25zZShwaG9uZU51bWJlciwgdGVtcG9yYXJ5UHJvb2YpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFBob25lQXV0aENyZWRlbnRpYWwoeyBwaG9uZU51bWJlciwgdGVtcG9yYXJ5UHJvb2YgfSk7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBfZ2V0SWRUb2tlblJlc3BvbnNlKGF1dGgpIHtcclxuICAgICAgICByZXR1cm4gc2lnbkluV2l0aFBob25lTnVtYmVyJDEoYXV0aCwgdGhpcy5fbWFrZVZlcmlmaWNhdGlvblJlcXVlc3QoKSk7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBfbGlua1RvSWRUb2tlbihhdXRoLCBpZFRva2VuKSB7XHJcbiAgICAgICAgcmV0dXJuIGxpbmtXaXRoUGhvbmVOdW1iZXIkMShhdXRoLCBPYmplY3QuYXNzaWduKHsgaWRUb2tlbiB9LCB0aGlzLl9tYWtlVmVyaWZpY2F0aW9uUmVxdWVzdCgpKSk7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBfZ2V0UmVhdXRoZW50aWNhdGlvblJlc29sdmVyKGF1dGgpIHtcclxuICAgICAgICByZXR1cm4gdmVyaWZ5UGhvbmVOdW1iZXJGb3JFeGlzdGluZyhhdXRoLCB0aGlzLl9tYWtlVmVyaWZpY2F0aW9uUmVxdWVzdCgpKTtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF9tYWtlVmVyaWZpY2F0aW9uUmVxdWVzdCgpIHtcclxuICAgICAgICBjb25zdCB7IHRlbXBvcmFyeVByb29mLCBwaG9uZU51bWJlciwgdmVyaWZpY2F0aW9uSWQsIHZlcmlmaWNhdGlvbkNvZGUgfSA9IHRoaXMucGFyYW1zO1xyXG4gICAgICAgIGlmICh0ZW1wb3JhcnlQcm9vZiAmJiBwaG9uZU51bWJlcikge1xyXG4gICAgICAgICAgICByZXR1cm4geyB0ZW1wb3JhcnlQcm9vZiwgcGhvbmVOdW1iZXIgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgc2Vzc2lvbkluZm86IHZlcmlmaWNhdGlvbklkLFxyXG4gICAgICAgICAgICBjb2RlOiB2ZXJpZmljYXRpb25Db2RlXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIC8qKiB7QGluaGVyaXRkb2MgQXV0aENyZWRlbnRpYWwudG9KU09OfSAqL1xyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIGNvbnN0IG9iaiA9IHtcclxuICAgICAgICAgICAgcHJvdmlkZXJJZDogdGhpcy5wcm92aWRlcklkXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAodGhpcy5wYXJhbXMucGhvbmVOdW1iZXIpIHtcclxuICAgICAgICAgICAgb2JqLnBob25lTnVtYmVyID0gdGhpcy5wYXJhbXMucGhvbmVOdW1iZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnBhcmFtcy50ZW1wb3JhcnlQcm9vZikge1xyXG4gICAgICAgICAgICBvYmoudGVtcG9yYXJ5UHJvb2YgPSB0aGlzLnBhcmFtcy50ZW1wb3JhcnlQcm9vZjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMucGFyYW1zLnZlcmlmaWNhdGlvbkNvZGUpIHtcclxuICAgICAgICAgICAgb2JqLnZlcmlmaWNhdGlvbkNvZGUgPSB0aGlzLnBhcmFtcy52ZXJpZmljYXRpb25Db2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5wYXJhbXMudmVyaWZpY2F0aW9uSWQpIHtcclxuICAgICAgICAgICAgb2JqLnZlcmlmaWNhdGlvbklkID0gdGhpcy5wYXJhbXMudmVyaWZpY2F0aW9uSWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcbiAgICAvKiogR2VuZXJhdGVzIGEgcGhvbmUgY3JlZGVudGlhbCBiYXNlZCBvbiBhIHBsYWluIG9iamVjdCBvciBhIEpTT04gc3RyaW5nLiAqL1xyXG4gICAgc3RhdGljIGZyb21KU09OKGpzb24pIHtcclxuICAgICAgICBpZiAodHlwZW9mIGpzb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGpzb24gPSBKU09OLnBhcnNlKGpzb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB7IHZlcmlmaWNhdGlvbklkLCB2ZXJpZmljYXRpb25Db2RlLCBwaG9uZU51bWJlciwgdGVtcG9yYXJ5UHJvb2YgfSA9IGpzb247XHJcbiAgICAgICAgaWYgKCF2ZXJpZmljYXRpb25Db2RlICYmXHJcbiAgICAgICAgICAgICF2ZXJpZmljYXRpb25JZCAmJlxyXG4gICAgICAgICAgICAhcGhvbmVOdW1iZXIgJiZcclxuICAgICAgICAgICAgIXRlbXBvcmFyeVByb29mKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IFBob25lQXV0aENyZWRlbnRpYWwoe1xyXG4gICAgICAgICAgICB2ZXJpZmljYXRpb25JZCxcclxuICAgICAgICAgICAgdmVyaWZpY2F0aW9uQ29kZSxcclxuICAgICAgICAgICAgcGhvbmVOdW1iZXIsXHJcbiAgICAgICAgICAgIHRlbXBvcmFyeVByb29mXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIE1hcHMgdGhlIG1vZGUgc3RyaW5nIGluIGFjdGlvbiBjb2RlIFVSTCB0byBBY3Rpb24gQ29kZSBJbmZvIG9wZXJhdGlvbi5cclxuICpcclxuICogQHBhcmFtIG1vZGVcclxuICovXHJcbmZ1bmN0aW9uIHBhcnNlTW9kZShtb2RlKSB7XHJcbiAgICBzd2l0Y2ggKG1vZGUpIHtcclxuICAgICAgICBjYXNlICdyZWNvdmVyRW1haWwnOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJSRUNPVkVSX0VNQUlMXCIgLyogUkVDT1ZFUl9FTUFJTCAqLztcclxuICAgICAgICBjYXNlICdyZXNldFBhc3N3b3JkJzpcclxuICAgICAgICAgICAgcmV0dXJuIFwiUEFTU1dPUkRfUkVTRVRcIiAvKiBQQVNTV09SRF9SRVNFVCAqLztcclxuICAgICAgICBjYXNlICdzaWduSW4nOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJFTUFJTF9TSUdOSU5cIiAvKiBFTUFJTF9TSUdOSU4gKi87XHJcbiAgICAgICAgY2FzZSAndmVyaWZ5RW1haWwnOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJWRVJJRllfRU1BSUxcIiAvKiBWRVJJRllfRU1BSUwgKi87XHJcbiAgICAgICAgY2FzZSAndmVyaWZ5QW5kQ2hhbmdlRW1haWwnOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJWRVJJRllfQU5EX0NIQU5HRV9FTUFJTFwiIC8qIFZFUklGWV9BTkRfQ0hBTkdFX0VNQUlMICovO1xyXG4gICAgICAgIGNhc2UgJ3JldmVydFNlY29uZEZhY3RvckFkZGl0aW9uJzpcclxuICAgICAgICAgICAgcmV0dXJuIFwiUkVWRVJUX1NFQ09ORF9GQUNUT1JfQURESVRJT05cIiAvKiBSRVZFUlRfU0VDT05EX0ZBQ1RPUl9BRERJVElPTiAqLztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogSGVscGVyIHRvIHBhcnNlIEZETCBsaW5rc1xyXG4gKlxyXG4gKiBAcGFyYW0gdXJsXHJcbiAqL1xyXG5mdW5jdGlvbiBwYXJzZURlZXBMaW5rKHVybCkge1xyXG4gICAgY29uc3QgbGluayA9IHF1ZXJ5c3RyaW5nRGVjb2RlKGV4dHJhY3RRdWVyeXN0cmluZyh1cmwpKVsnbGluayddO1xyXG4gICAgLy8gRG91YmxlIGxpbmsgY2FzZSAoYXV0b21hdGljIHJlZGlyZWN0KS5cclxuICAgIGNvbnN0IGRvdWJsZURlZXBMaW5rID0gbGlua1xyXG4gICAgICAgID8gcXVlcnlzdHJpbmdEZWNvZGUoZXh0cmFjdFF1ZXJ5c3RyaW5nKGxpbmspKVsnZGVlcF9saW5rX2lkJ11cclxuICAgICAgICA6IG51bGw7XHJcbiAgICAvLyBpT1MgY3VzdG9tIHNjaGVtZSBsaW5rcy5cclxuICAgIGNvbnN0IGlPU0RlZXBMaW5rID0gcXVlcnlzdHJpbmdEZWNvZGUoZXh0cmFjdFF1ZXJ5c3RyaW5nKHVybCkpWydkZWVwX2xpbmtfaWQnXTtcclxuICAgIGNvbnN0IGlPU0RvdWJsZURlZXBMaW5rID0gaU9TRGVlcExpbmtcclxuICAgICAgICA/IHF1ZXJ5c3RyaW5nRGVjb2RlKGV4dHJhY3RRdWVyeXN0cmluZyhpT1NEZWVwTGluaykpWydsaW5rJ11cclxuICAgICAgICA6IG51bGw7XHJcbiAgICByZXR1cm4gaU9TRG91YmxlRGVlcExpbmsgfHwgaU9TRGVlcExpbmsgfHwgZG91YmxlRGVlcExpbmsgfHwgbGluayB8fCB1cmw7XHJcbn1cclxuLyoqXHJcbiAqIEEgdXRpbGl0eSBjbGFzcyB0byBwYXJzZSBlbWFpbCBhY3Rpb24gVVJMcyBzdWNoIGFzIHBhc3N3b3JkIHJlc2V0LCBlbWFpbCB2ZXJpZmljYXRpb24sXHJcbiAqIGVtYWlsIGxpbmsgc2lnbiBpbiwgZXRjLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jbGFzcyBBY3Rpb25Db2RlVVJMIHtcclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIGFjdGlvbkxpbmsgLSBUaGUgbGluayBmcm9tIHdoaWNoIHRvIGV4dHJhY3QgdGhlIFVSTC5cclxuICAgICAqIEByZXR1cm5zIFRoZSB7QGxpbmsgQWN0aW9uQ29kZVVSTH0gb2JqZWN0LCBvciBudWxsIGlmIHRoZSBsaW5rIGlzIGludmFsaWQuXHJcbiAgICAgKlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKGFjdGlvbkxpbmspIHtcclxuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZjtcclxuICAgICAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBxdWVyeXN0cmluZ0RlY29kZShleHRyYWN0UXVlcnlzdHJpbmcoYWN0aW9uTGluaykpO1xyXG4gICAgICAgIGNvbnN0IGFwaUtleSA9IChfYSA9IHNlYXJjaFBhcmFtc1tcImFwaUtleVwiIC8qIEFQSV9LRVkgKi9dKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBudWxsO1xyXG4gICAgICAgIGNvbnN0IGNvZGUgPSAoX2IgPSBzZWFyY2hQYXJhbXNbXCJvb2JDb2RlXCIgLyogQ09ERSAqL10pICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IG51bGw7XHJcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uID0gcGFyc2VNb2RlKChfYyA9IHNlYXJjaFBhcmFtc1tcIm1vZGVcIiAvKiBNT0RFICovXSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogbnVsbCk7XHJcbiAgICAgICAgLy8gVmFsaWRhdGUgQVBJIGtleSwgY29kZSBhbmQgbW9kZS5cclxuICAgICAgICBfYXNzZXJ0KGFwaUtleSAmJiBjb2RlICYmIG9wZXJhdGlvbiwgXCJhcmd1bWVudC1lcnJvclwiIC8qIEFSR1VNRU5UX0VSUk9SICovKTtcclxuICAgICAgICB0aGlzLmFwaUtleSA9IGFwaUtleTtcclxuICAgICAgICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjtcclxuICAgICAgICB0aGlzLmNvZGUgPSBjb2RlO1xyXG4gICAgICAgIHRoaXMuY29udGludWVVcmwgPSAoX2QgPSBzZWFyY2hQYXJhbXNbXCJjb250aW51ZVVybFwiIC8qIENPTlRJTlVFX1VSTCAqL10pICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IG51bGw7XHJcbiAgICAgICAgdGhpcy5sYW5ndWFnZUNvZGUgPSAoX2UgPSBzZWFyY2hQYXJhbXNbXCJsYW5ndWFnZUNvZGVcIiAvKiBMQU5HVUFHRV9DT0RFICovXSkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogbnVsbDtcclxuICAgICAgICB0aGlzLnRlbmFudElkID0gKF9mID0gc2VhcmNoUGFyYW1zW1widGVuYW50SWRcIiAvKiBURU5BTlRfSUQgKi9dKSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiBudWxsO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJzZXMgdGhlIGVtYWlsIGFjdGlvbiBsaW5rIHN0cmluZyBhbmQgcmV0dXJucyBhbiB7QGxpbmsgQWN0aW9uQ29kZVVSTH0gaWYgdGhlIGxpbmsgaXMgdmFsaWQsXHJcbiAgICAgKiBvdGhlcndpc2UgcmV0dXJucyBudWxsLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBsaW5rICAtIFRoZSBlbWFpbCBhY3Rpb24gbGluayBzdHJpbmcuXHJcbiAgICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIEFjdGlvbkNvZGVVUkx9IG9iamVjdCwgb3IgbnVsbCBpZiB0aGUgbGluayBpcyBpbnZhbGlkLlxyXG4gICAgICpcclxuICAgICAqIEBwdWJsaWNcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHBhcnNlTGluayhsaW5rKSB7XHJcbiAgICAgICAgY29uc3QgYWN0aW9uTGluayA9IHBhcnNlRGVlcExpbmsobGluayk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBBY3Rpb25Db2RlVVJMKGFjdGlvbkxpbmspO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBQYXJzZXMgdGhlIGVtYWlsIGFjdGlvbiBsaW5rIHN0cmluZyBhbmQgcmV0dXJucyBhbiB7QGxpbmsgQWN0aW9uQ29kZVVSTH0gaWZcclxuICogdGhlIGxpbmsgaXMgdmFsaWQsIG90aGVyd2lzZSByZXR1cm5zIG51bGwuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmZ1bmN0aW9uIHBhcnNlQWN0aW9uQ29kZVVSTChsaW5rKSB7XHJcbiAgICByZXR1cm4gQWN0aW9uQ29kZVVSTC5wYXJzZUxpbmsobGluayk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFByb3ZpZGVyIGZvciBnZW5lcmF0aW5nIHtAbGluayBFbWFpbEF1dGhDcmVkZW50aWFsfS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY2xhc3MgRW1haWxBdXRoUHJvdmlkZXIge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQWx3YXlzIHNldCB0byB7QGxpbmsgUHJvdmlkZXJJZH0uUEFTU1dPUkQsIGV2ZW4gZm9yIGVtYWlsIGxpbmsuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wcm92aWRlcklkID0gRW1haWxBdXRoUHJvdmlkZXIuUFJPVklERVJfSUQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemUgYW4ge0BsaW5rIEF1dGhDcmVkZW50aWFsfSB1c2luZyBhbiBlbWFpbCBhbmQgcGFzc3dvcmQuXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIGNvbnN0IGF1dGhDcmVkZW50aWFsID0gRW1haWxBdXRoUHJvdmlkZXIuY3JlZGVudGlhbChlbWFpbCwgcGFzc3dvcmQpO1xyXG4gICAgICogY29uc3QgdXNlckNyZWRlbnRpYWwgPSBhd2FpdCBzaWduSW5XaXRoQ3JlZGVudGlhbChhdXRoLCBhdXRoQ3JlZGVudGlhbCk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogY29uc3QgdXNlckNyZWRlbnRpYWwgPSBhd2FpdCBzaWduSW5XaXRoRW1haWxBbmRQYXNzd29yZChhdXRoLCBlbWFpbCwgcGFzc3dvcmQpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGVtYWlsIC0gRW1haWwgYWRkcmVzcy5cclxuICAgICAqIEBwYXJhbSBwYXNzd29yZCAtIFVzZXIgYWNjb3VudCBwYXNzd29yZC5cclxuICAgICAqIEByZXR1cm5zIFRoZSBhdXRoIHByb3ZpZGVyIGNyZWRlbnRpYWwuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBjcmVkZW50aWFsKGVtYWlsLCBwYXNzd29yZCkge1xyXG4gICAgICAgIHJldHVybiBFbWFpbEF1dGhDcmVkZW50aWFsLl9mcm9tRW1haWxBbmRQYXNzd29yZChlbWFpbCwgcGFzc3dvcmQpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplIGFuIHtAbGluayBBdXRoQ3JlZGVudGlhbH0gdXNpbmcgYW4gZW1haWwgYW5kIGFuIGVtYWlsIGxpbmsgYWZ0ZXIgYSBzaWduIGluIHdpdGhcclxuICAgICAqIGVtYWlsIGxpbmsgb3BlcmF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiBjb25zdCBhdXRoQ3JlZGVudGlhbCA9IEVtYWlsQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxXaXRoTGluayhhdXRoLCBlbWFpbCwgZW1haWxMaW5rKTtcclxuICAgICAqIGNvbnN0IHVzZXJDcmVkZW50aWFsID0gYXdhaXQgc2lnbkluV2l0aENyZWRlbnRpYWwoYXV0aCwgYXV0aENyZWRlbnRpYWwpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIGF3YWl0IHNlbmRTaWduSW5MaW5rVG9FbWFpbChhdXRoLCBlbWFpbCk7XHJcbiAgICAgKiAvLyBPYnRhaW4gZW1haWxMaW5rIGZyb20gdXNlci5cclxuICAgICAqIGNvbnN0IHVzZXJDcmVkZW50aWFsID0gYXdhaXQgc2lnbkluV2l0aEVtYWlsTGluayhhdXRoLCBlbWFpbCwgZW1haWxMaW5rKTtcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZSB1c2VkIHRvIHZlcmlmeSB0aGUgbGluay5cclxuICAgICAqIEBwYXJhbSBlbWFpbCAtIEVtYWlsIGFkZHJlc3MuXHJcbiAgICAgKiBAcGFyYW0gZW1haWxMaW5rIC0gU2lnbi1pbiBlbWFpbCBsaW5rLlxyXG4gICAgICogQHJldHVybnMgLSBUaGUgYXV0aCBwcm92aWRlciBjcmVkZW50aWFsLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbFdpdGhMaW5rKGVtYWlsLCBlbWFpbExpbmspIHtcclxuICAgICAgICBjb25zdCBhY3Rpb25Db2RlVXJsID0gQWN0aW9uQ29kZVVSTC5wYXJzZUxpbmsoZW1haWxMaW5rKTtcclxuICAgICAgICBfYXNzZXJ0KGFjdGlvbkNvZGVVcmwsIFwiYXJndW1lbnQtZXJyb3JcIiAvKiBBUkdVTUVOVF9FUlJPUiAqLyk7XHJcbiAgICAgICAgcmV0dXJuIEVtYWlsQXV0aENyZWRlbnRpYWwuX2Zyb21FbWFpbEFuZENvZGUoZW1haWwsIGFjdGlvbkNvZGVVcmwuY29kZSwgYWN0aW9uQ29kZVVybC50ZW5hbnRJZCk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIEFsd2F5cyBzZXQgdG8ge0BsaW5rIFByb3ZpZGVySWR9LlBBU1NXT1JELCBldmVuIGZvciBlbWFpbCBsaW5rLlxyXG4gKi9cclxuRW1haWxBdXRoUHJvdmlkZXIuUFJPVklERVJfSUQgPSBcInBhc3N3b3JkXCIgLyogUEFTU1dPUkQgKi87XHJcbi8qKlxyXG4gKiBBbHdheXMgc2V0IHRvIHtAbGluayBTaWduSW5NZXRob2R9LkVNQUlMX1BBU1NXT1JELlxyXG4gKi9cclxuRW1haWxBdXRoUHJvdmlkZXIuRU1BSUxfUEFTU1dPUkRfU0lHTl9JTl9NRVRIT0QgPSBcInBhc3N3b3JkXCIgLyogRU1BSUxfUEFTU1dPUkQgKi87XHJcbi8qKlxyXG4gKiBBbHdheXMgc2V0IHRvIHtAbGluayBTaWduSW5NZXRob2R9LkVNQUlMX0xJTksuXHJcbiAqL1xyXG5FbWFpbEF1dGhQcm92aWRlci5FTUFJTF9MSU5LX1NJR05fSU5fTUVUSE9EID0gXCJlbWFpbExpbmtcIiAvKiBFTUFJTF9MSU5LICovO1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBGZWRlcmF0ZWQgcHJvdmlkZXJzIChPQXV0aCAoaW5jbHVkaW5nIE9JREMpLCBTQU1MKS5cclxuICpcclxuICogVGhpcyBjbGFzcyBpcyBub3QgbWVhbnQgdG8gYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5LlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jbGFzcyBGZWRlcmF0ZWRBdXRoUHJvdmlkZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBDb25zdHJ1Y3RvciBmb3IgZ2VuZXJpYyBPQXV0aCBwcm92aWRlcnMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHByb3ZpZGVySWQgLSBQcm92aWRlciBmb3Igd2hpY2ggY3JlZGVudGlhbHMgc2hvdWxkIGJlIGdlbmVyYXRlZC5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IocHJvdmlkZXJJZCkge1xyXG4gICAgICAgIHRoaXMucHJvdmlkZXJJZCA9IHByb3ZpZGVySWQ7XHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHRoaXMuZGVmYXVsdExhbmd1YWdlQ29kZSA9IG51bGw7XHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHRoaXMuY3VzdG9tUGFyYW1ldGVycyA9IHt9O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGxhbmd1YWdlIGdvZGUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGxhbmd1YWdlQ29kZSAtIGxhbmd1YWdlIGNvZGVcclxuICAgICAqL1xyXG4gICAgc2V0RGVmYXVsdExhbmd1YWdlKGxhbmd1YWdlQ29kZSkge1xyXG4gICAgICAgIHRoaXMuZGVmYXVsdExhbmd1YWdlQ29kZSA9IGxhbmd1YWdlQ29kZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgT0F1dGggY3VzdG9tIHBhcmFtZXRlcnMgdG8gcGFzcyBpbiBhbiBPQXV0aCByZXF1ZXN0IGZvciBwb3B1cCBhbmQgcmVkaXJlY3Qgc2lnbi1pblxyXG4gICAgICogb3BlcmF0aW9ucy5cclxuICAgICAqXHJcbiAgICAgKiBAcmVtYXJrc1xyXG4gICAgICogRm9yIGEgZGV0YWlsZWQgbGlzdCwgY2hlY2sgdGhlIHJlc2VydmVkIHJlcXVpcmVkIE9BdXRoIDIuMCBwYXJhbWV0ZXJzIHN1Y2ggYXMgYGNsaWVudF9pZGAsXHJcbiAgICAgKiBgcmVkaXJlY3RfdXJpYCwgYHNjb3BlYCwgYHJlc3BvbnNlX3R5cGVgLCBhbmQgYHN0YXRlYCBhcmUgbm90IGFsbG93ZWQgYW5kIHdpbGwgYmUgaWdub3JlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY3VzdG9tT0F1dGhQYXJhbWV0ZXJzIC0gVGhlIGN1c3RvbSBPQXV0aCBwYXJhbWV0ZXJzIHRvIHBhc3MgaW4gdGhlIE9BdXRoIHJlcXVlc3QuXHJcbiAgICAgKi9cclxuICAgIHNldEN1c3RvbVBhcmFtZXRlcnMoY3VzdG9tT0F1dGhQYXJhbWV0ZXJzKSB7XHJcbiAgICAgICAgdGhpcy5jdXN0b21QYXJhbWV0ZXJzID0gY3VzdG9tT0F1dGhQYXJhbWV0ZXJzO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBsaXN0IG9mIHtAbGluayBDdXN0b21QYXJhbWV0ZXJzfS5cclxuICAgICAqL1xyXG4gICAgZ2V0Q3VzdG9tUGFyYW1ldGVycygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jdXN0b21QYXJhbWV0ZXJzO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBDb21tb24gY29kZSB0byBhbGwgT0F1dGggcHJvdmlkZXJzLiBUaGlzIGlzIHNlcGFyYXRlIGZyb20gdGhlXHJcbiAqIHtAbGluayBPQXV0aFByb3ZpZGVyfSBzbyB0aGF0IGNoaWxkIHByb3ZpZGVycyAobGlrZVxyXG4gKiB7QGxpbmsgR29vZ2xlQXV0aFByb3ZpZGVyfSkgZG9uJ3QgaW5oZXJpdCB0aGUgYGNyZWRlbnRpYWxgIGluc3RhbmNlIG1ldGhvZC5cclxuICogSW5zdGVhZCwgdGhleSByZWx5IG9uIGEgc3RhdGljIGBjcmVkZW50aWFsYCBtZXRob2QuXHJcbiAqL1xyXG5jbGFzcyBCYXNlT0F1dGhQcm92aWRlciBleHRlbmRzIEZlZGVyYXRlZEF1dGhQcm92aWRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICB0aGlzLnNjb3BlcyA9IFtdO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgYW4gT0F1dGggc2NvcGUgdG8gdGhlIGNyZWRlbnRpYWwuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHNjb3BlIC0gUHJvdmlkZXIgT0F1dGggc2NvcGUgdG8gYWRkLlxyXG4gICAgICovXHJcbiAgICBhZGRTY29wZShzY29wZSkge1xyXG4gICAgICAgIC8vIElmIG5vdCBhbHJlYWR5IGFkZGVkLCBhZGQgc2NvcGUgdG8gbGlzdC5cclxuICAgICAgICBpZiAoIXRoaXMuc2NvcGVzLmluY2x1ZGVzKHNjb3BlKSkge1xyXG4gICAgICAgICAgICB0aGlzLnNjb3Blcy5wdXNoKHNjb3BlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IGxpc3Qgb2YgT0F1dGggc2NvcGVzLlxyXG4gICAgICovXHJcbiAgICBnZXRTY29wZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLnNjb3Blc107XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIFByb3ZpZGVyIGZvciBnZW5lcmF0aW5nIGdlbmVyaWMge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0uXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogLy8gU2lnbiBpbiB1c2luZyBhIHJlZGlyZWN0LlxyXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBPQXV0aFByb3ZpZGVyKCdnb29nbGUuY29tJyk7XHJcbiAqIC8vIFN0YXJ0IGEgc2lnbiBpbiBwcm9jZXNzIGZvciBhbiB1bmF1dGhlbnRpY2F0ZWQgdXNlci5cclxuICogcHJvdmlkZXIuYWRkU2NvcGUoJ3Byb2ZpbGUnKTtcclxuICogcHJvdmlkZXIuYWRkU2NvcGUoJ2VtYWlsJyk7XHJcbiAqIGF3YWl0IHNpZ25JbldpdGhSZWRpcmVjdChhdXRoLCBwcm92aWRlcik7XHJcbiAqIC8vIFRoaXMgd2lsbCB0cmlnZ2VyIGEgZnVsbCBwYWdlIHJlZGlyZWN0IGF3YXkgZnJvbSB5b3VyIGFwcFxyXG4gKlxyXG4gKiAvLyBBZnRlciByZXR1cm5pbmcgZnJvbSB0aGUgcmVkaXJlY3Qgd2hlbiB5b3VyIGFwcCBpbml0aWFsaXplcyB5b3UgY2FuIG9idGFpbiB0aGUgcmVzdWx0XHJcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlZGlyZWN0UmVzdWx0KGF1dGgpO1xyXG4gKiBpZiAocmVzdWx0KSB7XHJcbiAqICAgLy8gVGhpcyBpcyB0aGUgc2lnbmVkLWluIHVzZXJcclxuICogICBjb25zdCB1c2VyID0gcmVzdWx0LnVzZXI7XHJcbiAqICAgLy8gVGhpcyBnaXZlcyB5b3UgYSBPQXV0aCBBY2Nlc3MgVG9rZW4gZm9yIHRoZSBwcm92aWRlci5cclxuICogICBjb25zdCBjcmVkZW50aWFsID0gcHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQoYXV0aCwgcmVzdWx0KTtcclxuICogICBjb25zdCB0b2tlbiA9IGNyZWRlbnRpYWwuYWNjZXNzVG9rZW47XHJcbiAqIH1cclxuICogYGBgXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogLy8gU2lnbiBpbiB1c2luZyBhIHBvcHVwLlxyXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBPQXV0aFByb3ZpZGVyKCdnb29nbGUuY29tJyk7XHJcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCdwcm9maWxlJyk7XHJcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCdlbWFpbCcpO1xyXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzaWduSW5XaXRoUG9wdXAoYXV0aCwgcHJvdmlkZXIpO1xyXG4gKlxyXG4gKiAvLyBUaGUgc2lnbmVkLWluIHVzZXIgaW5mby5cclxuICogY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xyXG4gKiAvLyBUaGlzIGdpdmVzIHlvdSBhIE9BdXRoIEFjY2VzcyBUb2tlbiBmb3IgdGhlIHByb3ZpZGVyLlxyXG4gKiBjb25zdCBjcmVkZW50aWFsID0gcHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQoYXV0aCwgcmVzdWx0KTtcclxuICogY29uc3QgdG9rZW4gPSBjcmVkZW50aWFsLmFjY2Vzc1Rva2VuO1xyXG4gKiBgYGBcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY2xhc3MgT0F1dGhQcm92aWRlciBleHRlbmRzIEJhc2VPQXV0aFByb3ZpZGVyIHtcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbiB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmcm9tIGEgSlNPTiBzdHJpbmcgb3IgYSBwbGFpbiBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0ganNvbiAtIEEgcGxhaW4gb2JqZWN0IG9yIGEgSlNPTiBzdHJpbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGNyZWRlbnRpYWxGcm9tSlNPTihqc29uKSB7XHJcbiAgICAgICAgY29uc3Qgb2JqID0gdHlwZW9mIGpzb24gPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShqc29uKSA6IGpzb247XHJcbiAgICAgICAgX2Fzc2VydCgncHJvdmlkZXJJZCcgaW4gb2JqICYmICdzaWduSW5NZXRob2QnIGluIG9iaiwgXCJhcmd1bWVudC1lcnJvclwiIC8qIEFSR1VNRU5UX0VSUk9SICovKTtcclxuICAgICAgICByZXR1cm4gT0F1dGhDcmVkZW50aWFsLl9mcm9tUGFyYW1zKG9iaik7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmcm9tIGEgZ2VuZXJpYyBPQXV0aCBwcm92aWRlcidzIGFjY2VzcyB0b2tlbiBvciBJRCB0b2tlbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmVtYXJrc1xyXG4gICAgICogVGhlIHJhdyBub25jZSBpcyByZXF1aXJlZCB3aGVuIGFuIElEIHRva2VuIHdpdGggYSBub25jZSBmaWVsZCBpcyBwcm92aWRlZC4gVGhlIFNIQS0yNTYgaGFzaCBvZlxyXG4gICAgICogdGhlIHJhdyBub25jZSBtdXN0IG1hdGNoIHRoZSBub25jZSBmaWVsZCBpbiB0aGUgSUQgdG9rZW4uXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIC8vIGBnb29nbGVVc2VyYCBmcm9tIHRoZSBvbnN1Y2Nlc3MgR29vZ2xlIFNpZ24gSW4gY2FsbGJhY2suXHJcbiAgICAgKiAvLyBJbml0aWFsaXplIGEgZ2VuZXJhdGUgT0F1dGggcHJvdmlkZXIgd2l0aCBhIGBnb29nbGUuY29tYCBwcm92aWRlcklkLlxyXG4gICAgICogY29uc3QgcHJvdmlkZXIgPSBuZXcgT0F1dGhQcm92aWRlcignZ29vZ2xlLmNvbScpO1xyXG4gICAgICogY29uc3QgY3JlZGVudGlhbCA9IHByb3ZpZGVyLmNyZWRlbnRpYWwoe1xyXG4gICAgICogICBpZFRva2VuOiBnb29nbGVVc2VyLmdldEF1dGhSZXNwb25zZSgpLmlkX3Rva2VuLFxyXG4gICAgICogfSk7XHJcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzaWduSW5XaXRoQ3JlZGVudGlhbChjcmVkZW50aWFsKTtcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBwYXJhbXMgLSBFaXRoZXIgdGhlIG9wdGlvbnMgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIElEIHRva2VuLCBhY2Nlc3MgdG9rZW4gYW5kIHJhdyBub25jZVxyXG4gICAgICogb3IgdGhlIElEIHRva2VuIHN0cmluZy5cclxuICAgICAqL1xyXG4gICAgY3JlZGVudGlhbChwYXJhbXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY3JlZGVudGlhbChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHBhcmFtcyksIHsgbm9uY2U6IHBhcmFtcy5yYXdOb25jZSB9KSk7XHJcbiAgICB9XHJcbiAgICAvKiogQW4gaW50ZXJuYWwgY3JlZGVudGlhbCBtZXRob2QgdGhhdCBhY2NlcHRzIG1vcmUgcGVybWlzc2l2ZSBvcHRpb25zICovXHJcbiAgICBfY3JlZGVudGlhbChwYXJhbXMpIHtcclxuICAgICAgICBfYXNzZXJ0KHBhcmFtcy5pZFRva2VuIHx8IHBhcmFtcy5hY2Nlc3NUb2tlbiwgXCJhcmd1bWVudC1lcnJvclwiIC8qIEFSR1VNRU5UX0VSUk9SICovKTtcclxuICAgICAgICAvLyBGb3IgT0F1dGhDcmVkZW50aWFsLCBzaWduIGluIG1ldGhvZCBpcyBzYW1lIGFzIHByb3ZpZGVySWQuXHJcbiAgICAgICAgcmV0dXJuIE9BdXRoQ3JlZGVudGlhbC5fZnJvbVBhcmFtcyhPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHBhcmFtcyksIHsgcHJvdmlkZXJJZDogdGhpcy5wcm92aWRlcklkLCBzaWduSW5NZXRob2Q6IHRoaXMucHJvdmlkZXJJZCB9KSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVzZWQgdG8gZXh0cmFjdCB0aGUgdW5kZXJseWluZyB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmcm9tIGEge0BsaW5rIFVzZXJDcmVkZW50aWFsfS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbEZyb21SZXN1bHQodXNlckNyZWRlbnRpYWwpIHtcclxuICAgICAgICByZXR1cm4gT0F1dGhQcm92aWRlci5vYXV0aENyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KHVzZXJDcmVkZW50aWFsKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVXNlZCB0byBleHRyYWN0IHRoZSB1bmRlcmx5aW5nIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZyb20gYSB7QGxpbmsgQXV0aEVycm9yfSB3aGljaCB3YXNcclxuICAgICAqIHRocm93biBkdXJpbmcgYSBzaWduLWluLCBsaW5rLCBvciByZWF1dGhlbnRpY2F0ZSBvcGVyYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHVzZXJDcmVkZW50aWFsIC0gVGhlIHVzZXIgY3JlZGVudGlhbC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGNyZWRlbnRpYWxGcm9tRXJyb3IoZXJyb3IpIHtcclxuICAgICAgICByZXR1cm4gT0F1dGhQcm92aWRlci5vYXV0aENyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KChlcnJvci5jdXN0b21EYXRhIHx8IHt9KSk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgb2F1dGhDcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCh7IF90b2tlblJlc3BvbnNlOiB0b2tlblJlc3BvbnNlIH0pIHtcclxuICAgICAgICBpZiAoIXRva2VuUmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHsgb2F1dGhJZFRva2VuLCBvYXV0aEFjY2Vzc1Rva2VuLCBvYXV0aFRva2VuU2VjcmV0LCBwZW5kaW5nVG9rZW4sIG5vbmNlLCBwcm92aWRlcklkIH0gPSB0b2tlblJlc3BvbnNlO1xyXG4gICAgICAgIGlmICghb2F1dGhBY2Nlc3NUb2tlbiAmJlxyXG4gICAgICAgICAgICAhb2F1dGhUb2tlblNlY3JldCAmJlxyXG4gICAgICAgICAgICAhb2F1dGhJZFRva2VuICYmXHJcbiAgICAgICAgICAgICFwZW5kaW5nVG9rZW4pIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghcHJvdmlkZXJJZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBPQXV0aFByb3ZpZGVyKHByb3ZpZGVySWQpLl9jcmVkZW50aWFsKHtcclxuICAgICAgICAgICAgICAgIGlkVG9rZW46IG9hdXRoSWRUb2tlbixcclxuICAgICAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiBvYXV0aEFjY2Vzc1Rva2VuLFxyXG4gICAgICAgICAgICAgICAgbm9uY2UsXHJcbiAgICAgICAgICAgICAgICBwZW5kaW5nVG9rZW5cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogUHJvdmlkZXIgZm9yIGdlbmVyYXRpbmcgYW4ge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZm9yIHtAbGluayBQcm92aWRlcklkfS5GQUNFQk9PSy5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiAvLyBTaWduIGluIHVzaW5nIGEgcmVkaXJlY3QuXHJcbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IEZhY2Vib29rQXV0aFByb3ZpZGVyKCk7XHJcbiAqIC8vIFN0YXJ0IGEgc2lnbiBpbiBwcm9jZXNzIGZvciBhbiB1bmF1dGhlbnRpY2F0ZWQgdXNlci5cclxuICogcHJvdmlkZXIuYWRkU2NvcGUoJ3VzZXJfYmlydGhkYXknKTtcclxuICogYXdhaXQgc2lnbkluV2l0aFJlZGlyZWN0KGF1dGgsIHByb3ZpZGVyKTtcclxuICogLy8gVGhpcyB3aWxsIHRyaWdnZXIgYSBmdWxsIHBhZ2UgcmVkaXJlY3QgYXdheSBmcm9tIHlvdXIgYXBwXHJcbiAqXHJcbiAqIC8vIEFmdGVyIHJldHVybmluZyBmcm9tIHRoZSByZWRpcmVjdCB3aGVuIHlvdXIgYXBwIGluaXRpYWxpemVzIHlvdSBjYW4gb2J0YWluIHRoZSByZXN1bHRcclxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVkaXJlY3RSZXN1bHQoYXV0aCk7XHJcbiAqIGlmIChyZXN1bHQpIHtcclxuICogICAvLyBUaGlzIGlzIHRoZSBzaWduZWQtaW4gdXNlclxyXG4gKiAgIGNvbnN0IHVzZXIgPSByZXN1bHQudXNlcjtcclxuICogICAvLyBUaGlzIGdpdmVzIHlvdSBhIEZhY2Vib29rIEFjY2VzcyBUb2tlbi5cclxuICogICBjb25zdCBjcmVkZW50aWFsID0gRmFjZWJvb2tBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQocmVzdWx0KTtcclxuICogICBjb25zdCB0b2tlbiA9IGNyZWRlbnRpYWwuYWNjZXNzVG9rZW47XHJcbiAqIH1cclxuICogYGBgXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogLy8gU2lnbiBpbiB1c2luZyBhIHBvcHVwLlxyXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBGYWNlYm9va0F1dGhQcm92aWRlcigpO1xyXG4gKiBwcm92aWRlci5hZGRTY29wZSgndXNlcl9iaXJ0aGRheScpO1xyXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzaWduSW5XaXRoUG9wdXAoYXV0aCwgcHJvdmlkZXIpO1xyXG4gKlxyXG4gKiAvLyBUaGUgc2lnbmVkLWluIHVzZXIgaW5mby5cclxuICogY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xyXG4gKiAvLyBUaGlzIGdpdmVzIHlvdSBhIEZhY2Vib29rIEFjY2VzcyBUb2tlbi5cclxuICogY29uc3QgY3JlZGVudGlhbCA9IEZhY2Vib29rQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tUmVzdWx0KHJlc3VsdCk7XHJcbiAqIGNvbnN0IHRva2VuID0gY3JlZGVudGlhbC5hY2Nlc3NUb2tlbjtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNsYXNzIEZhY2Vib29rQXV0aFByb3ZpZGVyIGV4dGVuZHMgQmFzZU9BdXRoUHJvdmlkZXIge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoXCJmYWNlYm9vay5jb21cIiAvKiBGQUNFQk9PSyAqLyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBjcmVkZW50aWFsIGZvciBGYWNlYm9vay5cclxuICAgICAqXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogLy8gYGV2ZW50YCBmcm9tIHRoZSBGYWNlYm9vayBhdXRoLmF1dGhSZXNwb25zZUNoYW5nZSBjYWxsYmFjay5cclxuICAgICAqIGNvbnN0IGNyZWRlbnRpYWwgPSBGYWNlYm9va0F1dGhQcm92aWRlci5jcmVkZW50aWFsKGV2ZW50LmF1dGhSZXNwb25zZS5hY2Nlc3NUb2tlbik7XHJcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzaWduSW5XaXRoQ3JlZGVudGlhbChjcmVkZW50aWFsKTtcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBhY2Nlc3NUb2tlbiAtIEZhY2Vib29rIGFjY2VzcyB0b2tlbi5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGNyZWRlbnRpYWwoYWNjZXNzVG9rZW4pIHtcclxuICAgICAgICByZXR1cm4gT0F1dGhDcmVkZW50aWFsLl9mcm9tUGFyYW1zKHtcclxuICAgICAgICAgICAgcHJvdmlkZXJJZDogRmFjZWJvb2tBdXRoUHJvdmlkZXIuUFJPVklERVJfSUQsXHJcbiAgICAgICAgICAgIHNpZ25Jbk1ldGhvZDogRmFjZWJvb2tBdXRoUHJvdmlkZXIuRkFDRUJPT0tfU0lHTl9JTl9NRVRIT0QsXHJcbiAgICAgICAgICAgIGFjY2Vzc1Rva2VuXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVzZWQgdG8gZXh0cmFjdCB0aGUgdW5kZXJseWluZyB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmcm9tIGEge0BsaW5rIFVzZXJDcmVkZW50aWFsfS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbEZyb21SZXN1bHQodXNlckNyZWRlbnRpYWwpIHtcclxuICAgICAgICByZXR1cm4gRmFjZWJvb2tBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QodXNlckNyZWRlbnRpYWwpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VkIHRvIGV4dHJhY3QgdGhlIHVuZGVybHlpbmcge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZnJvbSBhIHtAbGluayBBdXRoRXJyb3J9IHdoaWNoIHdhc1xyXG4gICAgICogdGhyb3duIGR1cmluZyBhIHNpZ24taW4sIGxpbmssIG9yIHJlYXV0aGVudGljYXRlIG9wZXJhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbEZyb21FcnJvcihlcnJvcikge1xyXG4gICAgICAgIHJldHVybiBGYWNlYm9va0F1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCgoZXJyb3IuY3VzdG9tRGF0YSB8fCB7fSkpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGNyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KHsgX3Rva2VuUmVzcG9uc2U6IHRva2VuUmVzcG9uc2UgfSkge1xyXG4gICAgICAgIGlmICghdG9rZW5SZXNwb25zZSB8fCAhKCdvYXV0aEFjY2Vzc1Rva2VuJyBpbiB0b2tlblJlc3BvbnNlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0b2tlblJlc3BvbnNlLm9hdXRoQWNjZXNzVG9rZW4pIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiBGYWNlYm9va0F1dGhQcm92aWRlci5jcmVkZW50aWFsKHRva2VuUmVzcG9uc2Uub2F1dGhBY2Nlc3NUb2tlbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuLyoqIEFsd2F5cyBzZXQgdG8ge0BsaW5rIFNpZ25Jbk1ldGhvZH0uRkFDRUJPT0suICovXHJcbkZhY2Vib29rQXV0aFByb3ZpZGVyLkZBQ0VCT09LX1NJR05fSU5fTUVUSE9EID0gXCJmYWNlYm9vay5jb21cIiAvKiBGQUNFQk9PSyAqLztcclxuLyoqIEFsd2F5cyBzZXQgdG8ge0BsaW5rIFByb3ZpZGVySWR9LkZBQ0VCT09LLiAqL1xyXG5GYWNlYm9va0F1dGhQcm92aWRlci5QUk9WSURFUl9JRCA9IFwiZmFjZWJvb2suY29tXCIgLyogRkFDRUJPT0sgKi87XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBQcm92aWRlciBmb3IgZ2VuZXJhdGluZyBhbiBhbiB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmb3Ige0BsaW5rIFByb3ZpZGVySWR9LkdPT0dMRS5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiAvLyBTaWduIGluIHVzaW5nIGEgcmVkaXJlY3QuXHJcbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IEdvb2dsZUF1dGhQcm92aWRlcigpO1xyXG4gKiAvLyBTdGFydCBhIHNpZ24gaW4gcHJvY2VzcyBmb3IgYW4gdW5hdXRoZW50aWNhdGVkIHVzZXIuXHJcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCdwcm9maWxlJyk7XHJcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCdlbWFpbCcpO1xyXG4gKiBhd2FpdCBzaWduSW5XaXRoUmVkaXJlY3QoYXV0aCwgcHJvdmlkZXIpO1xyXG4gKiAvLyBUaGlzIHdpbGwgdHJpZ2dlciBhIGZ1bGwgcGFnZSByZWRpcmVjdCBhd2F5IGZyb20geW91ciBhcHBcclxuICpcclxuICogLy8gQWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhlIHJlZGlyZWN0IHdoZW4geW91ciBhcHAgaW5pdGlhbGl6ZXMgeW91IGNhbiBvYnRhaW4gdGhlIHJlc3VsdFxyXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRSZWRpcmVjdFJlc3VsdChhdXRoKTtcclxuICogaWYgKHJlc3VsdCkge1xyXG4gKiAgIC8vIFRoaXMgaXMgdGhlIHNpZ25lZC1pbiB1c2VyXHJcbiAqICAgY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xyXG4gKiAgIC8vIFRoaXMgZ2l2ZXMgeW91IGEgR29vZ2xlIEFjY2VzcyBUb2tlbi5cclxuICogICBjb25zdCBjcmVkZW50aWFsID0gR29vZ2xlQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tUmVzdWx0KHJlc3VsdCk7XHJcbiAqICAgY29uc3QgdG9rZW4gPSBjcmVkZW50aWFsLmFjY2Vzc1Rva2VuO1xyXG4gKiB9XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIC8vIFNpZ24gaW4gdXNpbmcgYSBwb3B1cC5cclxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgR29vZ2xlQXV0aFByb3ZpZGVyKCk7XHJcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCdwcm9maWxlJyk7XHJcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCdlbWFpbCcpO1xyXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzaWduSW5XaXRoUG9wdXAoYXV0aCwgcHJvdmlkZXIpO1xyXG4gKlxyXG4gKiAvLyBUaGUgc2lnbmVkLWluIHVzZXIgaW5mby5cclxuICogY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xyXG4gKiAvLyBUaGlzIGdpdmVzIHlvdSBhIEdvb2dsZSBBY2Nlc3MgVG9rZW4uXHJcbiAqIGNvbnN0IGNyZWRlbnRpYWwgPSBHb29nbGVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQocmVzdWx0KTtcclxuICogY29uc3QgdG9rZW4gPSBjcmVkZW50aWFsLmFjY2Vzc1Rva2VuO1xyXG4gKiBgYGBcclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY2xhc3MgR29vZ2xlQXV0aFByb3ZpZGVyIGV4dGVuZHMgQmFzZU9BdXRoUHJvdmlkZXIge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoXCJnb29nbGUuY29tXCIgLyogR09PR0xFICovKTtcclxuICAgICAgICB0aGlzLmFkZFNjb3BlKCdwcm9maWxlJyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBjcmVkZW50aWFsIGZvciBHb29nbGUuIEF0IGxlYXN0IG9uZSBvZiBJRCB0b2tlbiBhbmQgYWNjZXNzIHRva2VuIGlzIHJlcXVpcmVkLlxyXG4gICAgICpcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiAvLyBcXGBnb29nbGVVc2VyXFxgIGZyb20gdGhlIG9uc3VjY2VzcyBHb29nbGUgU2lnbiBJbiBjYWxsYmFjay5cclxuICAgICAqIGNvbnN0IGNyZWRlbnRpYWwgPSBHb29nbGVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbChnb29nbGVVc2VyLmdldEF1dGhSZXNwb25zZSgpLmlkX3Rva2VuKTtcclxuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpZ25JbldpdGhDcmVkZW50aWFsKGNyZWRlbnRpYWwpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGlkVG9rZW4gLSBHb29nbGUgSUQgdG9rZW4uXHJcbiAgICAgKiBAcGFyYW0gYWNjZXNzVG9rZW4gLSBHb29nbGUgYWNjZXNzIHRva2VuLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbChpZFRva2VuLCBhY2Nlc3NUb2tlbikge1xyXG4gICAgICAgIHJldHVybiBPQXV0aENyZWRlbnRpYWwuX2Zyb21QYXJhbXMoe1xyXG4gICAgICAgICAgICBwcm92aWRlcklkOiBHb29nbGVBdXRoUHJvdmlkZXIuUFJPVklERVJfSUQsXHJcbiAgICAgICAgICAgIHNpZ25Jbk1ldGhvZDogR29vZ2xlQXV0aFByb3ZpZGVyLkdPT0dMRV9TSUdOX0lOX01FVEhPRCxcclxuICAgICAgICAgICAgaWRUb2tlbixcclxuICAgICAgICAgICAgYWNjZXNzVG9rZW5cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVXNlZCB0byBleHRyYWN0IHRoZSB1bmRlcmx5aW5nIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZyb20gYSB7QGxpbmsgVXNlckNyZWRlbnRpYWx9LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB1c2VyQ3JlZGVudGlhbCAtIFRoZSB1c2VyIGNyZWRlbnRpYWwuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBjcmVkZW50aWFsRnJvbVJlc3VsdCh1c2VyQ3JlZGVudGlhbCkge1xyXG4gICAgICAgIHJldHVybiBHb29nbGVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QodXNlckNyZWRlbnRpYWwpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VkIHRvIGV4dHJhY3QgdGhlIHVuZGVybHlpbmcge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZnJvbSBhIHtAbGluayBBdXRoRXJyb3J9IHdoaWNoIHdhc1xyXG4gICAgICogdGhyb3duIGR1cmluZyBhIHNpZ24taW4sIGxpbmssIG9yIHJlYXV0aGVudGljYXRlIG9wZXJhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbEZyb21FcnJvcihlcnJvcikge1xyXG4gICAgICAgIHJldHVybiBHb29nbGVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QoKGVycm9yLmN1c3RvbURhdGEgfHwge30pKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBjcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCh7IF90b2tlblJlc3BvbnNlOiB0b2tlblJlc3BvbnNlIH0pIHtcclxuICAgICAgICBpZiAoIXRva2VuUmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHsgb2F1dGhJZFRva2VuLCBvYXV0aEFjY2Vzc1Rva2VuIH0gPSB0b2tlblJlc3BvbnNlO1xyXG4gICAgICAgIGlmICghb2F1dGhJZFRva2VuICYmICFvYXV0aEFjY2Vzc1Rva2VuKSB7XHJcbiAgICAgICAgICAgIC8vIFRoaXMgY291bGQgYmUgYW4gb2F1dGggMSBjcmVkZW50aWFsIG9yIGEgcGhvbmUgY3JlZGVudGlhbFxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIEdvb2dsZUF1dGhQcm92aWRlci5jcmVkZW50aWFsKG9hdXRoSWRUb2tlbiwgb2F1dGhBY2Nlc3NUb2tlbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuLyoqIEFsd2F5cyBzZXQgdG8ge0BsaW5rIFNpZ25Jbk1ldGhvZH0uR09PR0xFLiAqL1xyXG5Hb29nbGVBdXRoUHJvdmlkZXIuR09PR0xFX1NJR05fSU5fTUVUSE9EID0gXCJnb29nbGUuY29tXCIgLyogR09PR0xFICovO1xyXG4vKiogQWx3YXlzIHNldCB0byB7QGxpbmsgUHJvdmlkZXJJZH0uR09PR0xFLiAqL1xyXG5Hb29nbGVBdXRoUHJvdmlkZXIuUFJPVklERVJfSUQgPSBcImdvb2dsZS5jb21cIiAvKiBHT09HTEUgKi87XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBQcm92aWRlciBmb3IgZ2VuZXJhdGluZyBhbiB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmb3Ige0BsaW5rIFByb3ZpZGVySWR9LkdJVEhVQi5cclxuICpcclxuICogQHJlbWFya3NcclxuICogR2l0SHViIHJlcXVpcmVzIGFuIE9BdXRoIDIuMCByZWRpcmVjdCwgc28geW91IGNhbiBlaXRoZXIgaGFuZGxlIHRoZSByZWRpcmVjdCBkaXJlY3RseSwgb3IgdXNlXHJcbiAqIHRoZSB7QGxpbmsgc2lnbkluV2l0aFBvcHVwfSBoYW5kbGVyOlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIC8vIFNpZ24gaW4gdXNpbmcgYSByZWRpcmVjdC5cclxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgR2l0aHViQXV0aFByb3ZpZGVyKCk7XHJcbiAqIC8vIFN0YXJ0IGEgc2lnbiBpbiBwcm9jZXNzIGZvciBhbiB1bmF1dGhlbnRpY2F0ZWQgdXNlci5cclxuICogcHJvdmlkZXIuYWRkU2NvcGUoJ3JlcG8nKTtcclxuICogYXdhaXQgc2lnbkluV2l0aFJlZGlyZWN0KGF1dGgsIHByb3ZpZGVyKTtcclxuICogLy8gVGhpcyB3aWxsIHRyaWdnZXIgYSBmdWxsIHBhZ2UgcmVkaXJlY3QgYXdheSBmcm9tIHlvdXIgYXBwXHJcbiAqXHJcbiAqIC8vIEFmdGVyIHJldHVybmluZyBmcm9tIHRoZSByZWRpcmVjdCB3aGVuIHlvdXIgYXBwIGluaXRpYWxpemVzIHlvdSBjYW4gb2J0YWluIHRoZSByZXN1bHRcclxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVkaXJlY3RSZXN1bHQoYXV0aCk7XHJcbiAqIGlmIChyZXN1bHQpIHtcclxuICogICAvLyBUaGlzIGlzIHRoZSBzaWduZWQtaW4gdXNlclxyXG4gKiAgIGNvbnN0IHVzZXIgPSByZXN1bHQudXNlcjtcclxuICogICAvLyBUaGlzIGdpdmVzIHlvdSBhIEdpdGh1YiBBY2Nlc3MgVG9rZW4uXHJcbiAqICAgY29uc3QgY3JlZGVudGlhbCA9IEdpdGh1YkF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChyZXN1bHQpO1xyXG4gKiAgIGNvbnN0IHRva2VuID0gY3JlZGVudGlhbC5hY2Nlc3NUb2tlbjtcclxuICogfVxyXG4gKiBgYGBcclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiAvLyBTaWduIGluIHVzaW5nIGEgcG9wdXAuXHJcbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IEdpdGh1YkF1dGhQcm92aWRlcigpO1xyXG4gKiBwcm92aWRlci5hZGRTY29wZSgncmVwbycpO1xyXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzaWduSW5XaXRoUG9wdXAoYXV0aCwgcHJvdmlkZXIpO1xyXG4gKlxyXG4gKiAvLyBUaGUgc2lnbmVkLWluIHVzZXIgaW5mby5cclxuICogY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xyXG4gKiAvLyBUaGlzIGdpdmVzIHlvdSBhIEdpdGh1YiBBY2Nlc3MgVG9rZW4uXHJcbiAqIGNvbnN0IGNyZWRlbnRpYWwgPSBHaXRodWJBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQocmVzdWx0KTtcclxuICogY29uc3QgdG9rZW4gPSBjcmVkZW50aWFsLmFjY2Vzc1Rva2VuO1xyXG4gKiBgYGBcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY2xhc3MgR2l0aHViQXV0aFByb3ZpZGVyIGV4dGVuZHMgQmFzZU9BdXRoUHJvdmlkZXIge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoXCJnaXRodWIuY29tXCIgLyogR0lUSFVCICovKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIGNyZWRlbnRpYWwgZm9yIEdpdGh1Yi5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gYWNjZXNzVG9rZW4gLSBHaXRodWIgYWNjZXNzIHRva2VuLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbChhY2Nlc3NUb2tlbikge1xyXG4gICAgICAgIHJldHVybiBPQXV0aENyZWRlbnRpYWwuX2Zyb21QYXJhbXMoe1xyXG4gICAgICAgICAgICBwcm92aWRlcklkOiBHaXRodWJBdXRoUHJvdmlkZXIuUFJPVklERVJfSUQsXHJcbiAgICAgICAgICAgIHNpZ25Jbk1ldGhvZDogR2l0aHViQXV0aFByb3ZpZGVyLkdJVEhVQl9TSUdOX0lOX01FVEhPRCxcclxuICAgICAgICAgICAgYWNjZXNzVG9rZW5cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVXNlZCB0byBleHRyYWN0IHRoZSB1bmRlcmx5aW5nIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZyb20gYSB7QGxpbmsgVXNlckNyZWRlbnRpYWx9LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB1c2VyQ3JlZGVudGlhbCAtIFRoZSB1c2VyIGNyZWRlbnRpYWwuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBjcmVkZW50aWFsRnJvbVJlc3VsdCh1c2VyQ3JlZGVudGlhbCkge1xyXG4gICAgICAgIHJldHVybiBHaXRodWJBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QodXNlckNyZWRlbnRpYWwpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VkIHRvIGV4dHJhY3QgdGhlIHVuZGVybHlpbmcge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZnJvbSBhIHtAbGluayBBdXRoRXJyb3J9IHdoaWNoIHdhc1xyXG4gICAgICogdGhyb3duIGR1cmluZyBhIHNpZ24taW4sIGxpbmssIG9yIHJlYXV0aGVudGljYXRlIG9wZXJhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbEZyb21FcnJvcihlcnJvcikge1xyXG4gICAgICAgIHJldHVybiBHaXRodWJBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QoKGVycm9yLmN1c3RvbURhdGEgfHwge30pKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBjcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCh7IF90b2tlblJlc3BvbnNlOiB0b2tlblJlc3BvbnNlIH0pIHtcclxuICAgICAgICBpZiAoIXRva2VuUmVzcG9uc2UgfHwgISgnb2F1dGhBY2Nlc3NUb2tlbicgaW4gdG9rZW5SZXNwb25zZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdG9rZW5SZXNwb25zZS5vYXV0aEFjY2Vzc1Rva2VuKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gR2l0aHViQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWwodG9rZW5SZXNwb25zZS5vYXV0aEFjY2Vzc1Rva2VuKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4vKiogQWx3YXlzIHNldCB0byB7QGxpbmsgU2lnbkluTWV0aG9kfS5HSVRIVUIuICovXHJcbkdpdGh1YkF1dGhQcm92aWRlci5HSVRIVUJfU0lHTl9JTl9NRVRIT0QgPSBcImdpdGh1Yi5jb21cIiAvKiBHSVRIVUIgKi87XHJcbi8qKiBBbHdheXMgc2V0IHRvIHtAbGluayBQcm92aWRlcklkfS5HSVRIVUIuICovXHJcbkdpdGh1YkF1dGhQcm92aWRlci5QUk9WSURFUl9JRCA9IFwiZ2l0aHViLmNvbVwiIC8qIEdJVEhVQiAqLztcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgSURQX1JFUVVFU1RfVVJJID0gJ2h0dHA6Ly9sb2NhbGhvc3QnO1xyXG4vKipcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY2xhc3MgU0FNTEF1dGhDcmVkZW50aWFsIGV4dGVuZHMgQXV0aENyZWRlbnRpYWwge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IocHJvdmlkZXJJZCwgcGVuZGluZ1Rva2VuKSB7XHJcbiAgICAgICAgc3VwZXIocHJvdmlkZXJJZCwgcHJvdmlkZXJJZCk7XHJcbiAgICAgICAgdGhpcy5wZW5kaW5nVG9rZW4gPSBwZW5kaW5nVG9rZW47XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBfZ2V0SWRUb2tlblJlc3BvbnNlKGF1dGgpIHtcclxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5idWlsZFJlcXVlc3QoKTtcclxuICAgICAgICByZXR1cm4gc2lnbkluV2l0aElkcChhdXRoLCByZXF1ZXN0KTtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF9saW5rVG9JZFRva2VuKGF1dGgsIGlkVG9rZW4pIHtcclxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5idWlsZFJlcXVlc3QoKTtcclxuICAgICAgICByZXF1ZXN0LmlkVG9rZW4gPSBpZFRva2VuO1xyXG4gICAgICAgIHJldHVybiBzaWduSW5XaXRoSWRwKGF1dGgsIHJlcXVlc3QpO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgX2dldFJlYXV0aGVudGljYXRpb25SZXNvbHZlcihhdXRoKSB7XHJcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuYnVpbGRSZXF1ZXN0KCk7XHJcbiAgICAgICAgcmVxdWVzdC5hdXRvQ3JlYXRlID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIHNpZ25JbldpdGhJZHAoYXV0aCwgcmVxdWVzdCk7XHJcbiAgICB9XHJcbiAgICAvKioge0Bpbmhlcml0ZG9jIEF1dGhDcmVkZW50aWFsLnRvSlNPTn0gICovXHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgc2lnbkluTWV0aG9kOiB0aGlzLnNpZ25Jbk1ldGhvZCxcclxuICAgICAgICAgICAgcHJvdmlkZXJJZDogdGhpcy5wcm92aWRlcklkLFxyXG4gICAgICAgICAgICBwZW5kaW5nVG9rZW46IHRoaXMucGVuZGluZ1Rva2VuXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU3RhdGljIG1ldGhvZCB0byBkZXNlcmlhbGl6ZSBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0IGludG8gYW5cclxuICAgICAqIHtAbGluayAgQXV0aENyZWRlbnRpYWx9LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBqc29uIC0gSW5wdXQgY2FuIGJlIGVpdGhlciBPYmplY3Qgb3IgdGhlIHN0cmluZ2lmaWVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QuXHJcbiAgICAgKiBXaGVuIHN0cmluZyBpcyBwcm92aWRlZCwgSlNPTi5wYXJzZSB3b3VsZCBiZSBjYWxsZWQgZmlyc3QuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgSWYgdGhlIEpTT04gaW5wdXQgZG9lcyBub3QgcmVwcmVzZW50IGFuIHtAbGluayAgQXV0aENyZWRlbnRpYWx9LCBudWxsIGlzIHJldHVybmVkLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZnJvbUpTT04oanNvbikge1xyXG4gICAgICAgIGNvbnN0IG9iaiA9IHR5cGVvZiBqc29uID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoanNvbikgOiBqc29uO1xyXG4gICAgICAgIGNvbnN0IHsgcHJvdmlkZXJJZCwgc2lnbkluTWV0aG9kLCBwZW5kaW5nVG9rZW4gfSA9IG9iajtcclxuICAgICAgICBpZiAoIXByb3ZpZGVySWQgfHxcclxuICAgICAgICAgICAgIXNpZ25Jbk1ldGhvZCB8fFxyXG4gICAgICAgICAgICAhcGVuZGluZ1Rva2VuIHx8XHJcbiAgICAgICAgICAgIHByb3ZpZGVySWQgIT09IHNpZ25Jbk1ldGhvZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTQU1MQXV0aENyZWRlbnRpYWwocHJvdmlkZXJJZCwgcGVuZGluZ1Rva2VuKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIHN0YXRpYyBtZXRob2QgdG8gYXZvaWQgZXhwb3NpbmcgdGhlIGNvbnN0cnVjdG9yIHRvIGVuZCB1c2Vycy5cclxuICAgICAqXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgc3RhdGljIF9jcmVhdGUocHJvdmlkZXJJZCwgcGVuZGluZ1Rva2VuKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTQU1MQXV0aENyZWRlbnRpYWwocHJvdmlkZXJJZCwgcGVuZGluZ1Rva2VuKTtcclxuICAgIH1cclxuICAgIGJ1aWxkUmVxdWVzdCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICByZXF1ZXN0VXJpOiBJRFBfUkVRVUVTVF9VUkksXHJcbiAgICAgICAgICAgIHJldHVyblNlY3VyZVRva2VuOiB0cnVlLFxyXG4gICAgICAgICAgICBwZW5kaW5nVG9rZW46IHRoaXMucGVuZGluZ1Rva2VuXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBTQU1MX1BST1ZJREVSX1BSRUZJWCA9ICdzYW1sLic7XHJcbi8qKlxyXG4gKiBBbiB7QGxpbmsgQXV0aFByb3ZpZGVyfSBmb3IgU0FNTC5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY2xhc3MgU0FNTEF1dGhQcm92aWRlciBleHRlbmRzIEZlZGVyYXRlZEF1dGhQcm92aWRlciB7XHJcbiAgICAvKipcclxuICAgICAqIENvbnN0cnVjdG9yLiBUaGUgcHJvdmlkZXJJZCBtdXN0IHN0YXJ0IHdpdGggXCJzYW1sLlwiXHJcbiAgICAgKiBAcGFyYW0gcHJvdmlkZXJJZCAtIFNBTUwgcHJvdmlkZXIgSUQuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKHByb3ZpZGVySWQpIHtcclxuICAgICAgICBfYXNzZXJ0KHByb3ZpZGVySWQuc3RhcnRzV2l0aChTQU1MX1BST1ZJREVSX1BSRUZJWCksIFwiYXJndW1lbnQtZXJyb3JcIiAvKiBBUkdVTUVOVF9FUlJPUiAqLyk7XHJcbiAgICAgICAgc3VwZXIocHJvdmlkZXJJZCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYXRlcyBhbiB7QGxpbmsgQXV0aENyZWRlbnRpYWx9IGZyb20gYSB7QGxpbmsgVXNlckNyZWRlbnRpYWx9IGFmdGVyIGFcclxuICAgICAqIHN1Y2Nlc3NmdWwgU0FNTCBmbG93IGNvbXBsZXRlcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmVtYXJrc1xyXG4gICAgICpcclxuICAgICAqIEZvciBleGFtcGxlLCB0byBnZXQgYW4ge0BsaW5rIEF1dGhDcmVkZW50aWFsfSwgeW91IGNvdWxkIHdyaXRlIHRoZVxyXG4gICAgICogZm9sbG93aW5nIGNvZGU6XHJcbiAgICAgKlxyXG4gICAgICogYGBganNcclxuICAgICAqIGNvbnN0IHVzZXJDcmVkZW50aWFsID0gYXdhaXQgc2lnbkluV2l0aFBvcHVwKGF1dGgsIHNhbWxQcm92aWRlcik7XHJcbiAgICAgKiBjb25zdCBjcmVkZW50aWFsID0gU0FNTEF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdCh1c2VyQ3JlZGVudGlhbCk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbEZyb21SZXN1bHQodXNlckNyZWRlbnRpYWwpIHtcclxuICAgICAgICByZXR1cm4gU0FNTEF1dGhQcm92aWRlci5zYW1sQ3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QodXNlckNyZWRlbnRpYWwpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VkIHRvIGV4dHJhY3QgdGhlIHVuZGVybHlpbmcge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZnJvbSBhIHtAbGluayBBdXRoRXJyb3J9IHdoaWNoIHdhc1xyXG4gICAgICogdGhyb3duIGR1cmluZyBhIHNpZ24taW4sIGxpbmssIG9yIHJlYXV0aGVudGljYXRlIG9wZXJhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbEZyb21FcnJvcihlcnJvcikge1xyXG4gICAgICAgIHJldHVybiBTQU1MQXV0aFByb3ZpZGVyLnNhbWxDcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCgoZXJyb3IuY3VzdG9tRGF0YSB8fCB7fSkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuIHtAbGluayBBdXRoQ3JlZGVudGlhbH0gZnJvbSBhIEpTT04gc3RyaW5nIG9yIGEgcGxhaW4gb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIGpzb24gLSBBIHBsYWluIG9iamVjdCBvciBhIEpTT04gc3RyaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBjcmVkZW50aWFsRnJvbUpTT04oanNvbikge1xyXG4gICAgICAgIGNvbnN0IGNyZWRlbnRpYWwgPSBTQU1MQXV0aENyZWRlbnRpYWwuZnJvbUpTT04oanNvbik7XHJcbiAgICAgICAgX2Fzc2VydChjcmVkZW50aWFsLCBcImFyZ3VtZW50LWVycm9yXCIgLyogQVJHVU1FTlRfRVJST1IgKi8pO1xyXG4gICAgICAgIHJldHVybiBjcmVkZW50aWFsO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIHNhbWxDcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCh7IF90b2tlblJlc3BvbnNlOiB0b2tlblJlc3BvbnNlIH0pIHtcclxuICAgICAgICBpZiAoIXRva2VuUmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHsgcGVuZGluZ1Rva2VuLCBwcm92aWRlcklkIH0gPSB0b2tlblJlc3BvbnNlO1xyXG4gICAgICAgIGlmICghcGVuZGluZ1Rva2VuIHx8ICFwcm92aWRlcklkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gU0FNTEF1dGhDcmVkZW50aWFsLl9jcmVhdGUocHJvdmlkZXJJZCwgcGVuZGluZ1Rva2VuKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBQcm92aWRlciBmb3IgZ2VuZXJhdGluZyBhbiB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmb3Ige0BsaW5rIFByb3ZpZGVySWR9LlRXSVRURVIuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogLy8gU2lnbiBpbiB1c2luZyBhIHJlZGlyZWN0LlxyXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBUd2l0dGVyQXV0aFByb3ZpZGVyKCk7XHJcbiAqIC8vIFN0YXJ0IGEgc2lnbiBpbiBwcm9jZXNzIGZvciBhbiB1bmF1dGhlbnRpY2F0ZWQgdXNlci5cclxuICogYXdhaXQgc2lnbkluV2l0aFJlZGlyZWN0KGF1dGgsIHByb3ZpZGVyKTtcclxuICogLy8gVGhpcyB3aWxsIHRyaWdnZXIgYSBmdWxsIHBhZ2UgcmVkaXJlY3QgYXdheSBmcm9tIHlvdXIgYXBwXHJcbiAqXHJcbiAqIC8vIEFmdGVyIHJldHVybmluZyBmcm9tIHRoZSByZWRpcmVjdCB3aGVuIHlvdXIgYXBwIGluaXRpYWxpemVzIHlvdSBjYW4gb2J0YWluIHRoZSByZXN1bHRcclxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVkaXJlY3RSZXN1bHQoYXV0aCk7XHJcbiAqIGlmIChyZXN1bHQpIHtcclxuICogICAvLyBUaGlzIGlzIHRoZSBzaWduZWQtaW4gdXNlclxyXG4gKiAgIGNvbnN0IHVzZXIgPSByZXN1bHQudXNlcjtcclxuICogICAvLyBUaGlzIGdpdmVzIHlvdSBhIFR3aXR0ZXIgQWNjZXNzIFRva2VuIGFuZCBTZWNyZXQuXHJcbiAqICAgY29uc3QgY3JlZGVudGlhbCA9IFR3aXR0ZXJBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQocmVzdWx0KTtcclxuICogICBjb25zdCB0b2tlbiA9IGNyZWRlbnRpYWwuYWNjZXNzVG9rZW47XHJcbiAqICAgY29uc3Qgc2VjcmV0ID0gY3JlZGVudGlhbC5zZWNyZXQ7XHJcbiAqIH1cclxuICogYGBgXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogLy8gU2lnbiBpbiB1c2luZyBhIHBvcHVwLlxyXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBUd2l0dGVyQXV0aFByb3ZpZGVyKCk7XHJcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpZ25JbldpdGhQb3B1cChhdXRoLCBwcm92aWRlcik7XHJcbiAqXHJcbiAqIC8vIFRoZSBzaWduZWQtaW4gdXNlciBpbmZvLlxyXG4gKiBjb25zdCB1c2VyID0gcmVzdWx0LnVzZXI7XHJcbiAqIC8vIFRoaXMgZ2l2ZXMgeW91IGEgVHdpdHRlciBBY2Nlc3MgVG9rZW4gYW5kIFNlY3JldC5cclxuICogY29uc3QgY3JlZGVudGlhbCA9IFR3aXR0ZXJBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQocmVzdWx0KTtcclxuICogY29uc3QgdG9rZW4gPSBjcmVkZW50aWFsLmFjY2Vzc1Rva2VuO1xyXG4gKiBjb25zdCBzZWNyZXQgPSBjcmVkZW50aWFsLnNlY3JldDtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNsYXNzIFR3aXR0ZXJBdXRoUHJvdmlkZXIgZXh0ZW5kcyBCYXNlT0F1dGhQcm92aWRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcihcInR3aXR0ZXIuY29tXCIgLyogVFdJVFRFUiAqLyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBjcmVkZW50aWFsIGZvciBUd2l0dGVyLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB0b2tlbiAtIFR3aXR0ZXIgYWNjZXNzIHRva2VuLlxyXG4gICAgICogQHBhcmFtIHNlY3JldCAtIFR3aXR0ZXIgc2VjcmV0LlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbCh0b2tlbiwgc2VjcmV0KSB7XHJcbiAgICAgICAgcmV0dXJuIE9BdXRoQ3JlZGVudGlhbC5fZnJvbVBhcmFtcyh7XHJcbiAgICAgICAgICAgIHByb3ZpZGVySWQ6IFR3aXR0ZXJBdXRoUHJvdmlkZXIuUFJPVklERVJfSUQsXHJcbiAgICAgICAgICAgIHNpZ25Jbk1ldGhvZDogVHdpdHRlckF1dGhQcm92aWRlci5UV0lUVEVSX1NJR05fSU5fTUVUSE9ELFxyXG4gICAgICAgICAgICBvYXV0aFRva2VuOiB0b2tlbixcclxuICAgICAgICAgICAgb2F1dGhUb2tlblNlY3JldDogc2VjcmV0XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVzZWQgdG8gZXh0cmFjdCB0aGUgdW5kZXJseWluZyB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmcm9tIGEge0BsaW5rIFVzZXJDcmVkZW50aWFsfS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbEZyb21SZXN1bHQodXNlckNyZWRlbnRpYWwpIHtcclxuICAgICAgICByZXR1cm4gVHdpdHRlckF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCh1c2VyQ3JlZGVudGlhbCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVzZWQgdG8gZXh0cmFjdCB0aGUgdW5kZXJseWluZyB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmcm9tIGEge0BsaW5rIEF1dGhFcnJvcn0gd2hpY2ggd2FzXHJcbiAgICAgKiB0aHJvd24gZHVyaW5nIGEgc2lnbi1pbiwgbGluaywgb3IgcmVhdXRoZW50aWNhdGUgb3BlcmF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB1c2VyQ3JlZGVudGlhbCAtIFRoZSB1c2VyIGNyZWRlbnRpYWwuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBjcmVkZW50aWFsRnJvbUVycm9yKGVycm9yKSB7XHJcbiAgICAgICAgcmV0dXJuIFR3aXR0ZXJBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QoKGVycm9yLmN1c3RvbURhdGEgfHwge30pKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBjcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCh7IF90b2tlblJlc3BvbnNlOiB0b2tlblJlc3BvbnNlIH0pIHtcclxuICAgICAgICBpZiAoIXRva2VuUmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHsgb2F1dGhBY2Nlc3NUb2tlbiwgb2F1dGhUb2tlblNlY3JldCB9ID0gdG9rZW5SZXNwb25zZTtcclxuICAgICAgICBpZiAoIW9hdXRoQWNjZXNzVG9rZW4gfHwgIW9hdXRoVG9rZW5TZWNyZXQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiBUd2l0dGVyQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWwob2F1dGhBY2Nlc3NUb2tlbiwgb2F1dGhUb2tlblNlY3JldCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuLyoqIEFsd2F5cyBzZXQgdG8ge0BsaW5rIFNpZ25Jbk1ldGhvZH0uVFdJVFRFUi4gKi9cclxuVHdpdHRlckF1dGhQcm92aWRlci5UV0lUVEVSX1NJR05fSU5fTUVUSE9EID0gXCJ0d2l0dGVyLmNvbVwiIC8qIFRXSVRURVIgKi87XHJcbi8qKiBBbHdheXMgc2V0IHRvIHtAbGluayBQcm92aWRlcklkfS5UV0lUVEVSLiAqL1xyXG5Ud2l0dGVyQXV0aFByb3ZpZGVyLlBST1ZJREVSX0lEID0gXCJ0d2l0dGVyLmNvbVwiIC8qIFRXSVRURVIgKi87XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHNpZ25VcChhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gX3BlcmZvcm1TaWduSW5SZXF1ZXN0KGF1dGgsIFwiUE9TVFwiIC8qIFBPU1QgKi8sIFwiL3YxL2FjY291bnRzOnNpZ25VcFwiIC8qIFNJR05fVVAgKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgVXNlckNyZWRlbnRpYWxJbXBsIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtcykge1xyXG4gICAgICAgIHRoaXMudXNlciA9IHBhcmFtcy51c2VyO1xyXG4gICAgICAgIHRoaXMucHJvdmlkZXJJZCA9IHBhcmFtcy5wcm92aWRlcklkO1xyXG4gICAgICAgIHRoaXMuX3Rva2VuUmVzcG9uc2UgPSBwYXJhbXMuX3Rva2VuUmVzcG9uc2U7XHJcbiAgICAgICAgdGhpcy5vcGVyYXRpb25UeXBlID0gcGFyYW1zLm9wZXJhdGlvblR5cGU7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXN5bmMgX2Zyb21JZFRva2VuUmVzcG9uc2UoYXV0aCwgb3BlcmF0aW9uVHlwZSwgaWRUb2tlblJlc3BvbnNlLCBpc0Fub255bW91cyA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3QgdXNlciA9IGF3YWl0IFVzZXJJbXBsLl9mcm9tSWRUb2tlblJlc3BvbnNlKGF1dGgsIGlkVG9rZW5SZXNwb25zZSwgaXNBbm9ueW1vdXMpO1xyXG4gICAgICAgIGNvbnN0IHByb3ZpZGVySWQgPSBwcm92aWRlcklkRm9yUmVzcG9uc2UoaWRUb2tlblJlc3BvbnNlKTtcclxuICAgICAgICBjb25zdCB1c2VyQ3JlZCA9IG5ldyBVc2VyQ3JlZGVudGlhbEltcGwoe1xyXG4gICAgICAgICAgICB1c2VyLFxyXG4gICAgICAgICAgICBwcm92aWRlcklkLFxyXG4gICAgICAgICAgICBfdG9rZW5SZXNwb25zZTogaWRUb2tlblJlc3BvbnNlLFxyXG4gICAgICAgICAgICBvcGVyYXRpb25UeXBlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHVzZXJDcmVkO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIF9mb3JPcGVyYXRpb24odXNlciwgb3BlcmF0aW9uVHlwZSwgcmVzcG9uc2UpIHtcclxuICAgICAgICBhd2FpdCB1c2VyLl91cGRhdGVUb2tlbnNJZk5lY2Vzc2FyeShyZXNwb25zZSwgLyogcmVsb2FkICovIHRydWUpO1xyXG4gICAgICAgIGNvbnN0IHByb3ZpZGVySWQgPSBwcm92aWRlcklkRm9yUmVzcG9uc2UocmVzcG9uc2UpO1xyXG4gICAgICAgIHJldHVybiBuZXcgVXNlckNyZWRlbnRpYWxJbXBsKHtcclxuICAgICAgICAgICAgdXNlcixcclxuICAgICAgICAgICAgcHJvdmlkZXJJZCxcclxuICAgICAgICAgICAgX3Rva2VuUmVzcG9uc2U6IHJlc3BvbnNlLFxyXG4gICAgICAgICAgICBvcGVyYXRpb25UeXBlXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gcHJvdmlkZXJJZEZvclJlc3BvbnNlKHJlc3BvbnNlKSB7XHJcbiAgICBpZiAocmVzcG9uc2UucHJvdmlkZXJJZCkge1xyXG4gICAgICAgIHJldHVybiByZXNwb25zZS5wcm92aWRlcklkO1xyXG4gICAgfVxyXG4gICAgaWYgKCdwaG9uZU51bWJlcicgaW4gcmVzcG9uc2UpIHtcclxuICAgICAgICByZXR1cm4gXCJwaG9uZVwiIC8qIFBIT05FICovO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIEFzeW5jaHJvbm91c2x5IHNpZ25zIGluIGFzIGFuIGFub255bW91cyB1c2VyLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGFuIGFub255bW91cyB1c2VyIHNpZ25lZCBpbiwgdGhhdCB1c2VyIHdpbGwgYmUgcmV0dXJuZWQ7IG90aGVyd2lzZSwgYVxyXG4gKiBuZXcgYW5vbnltb3VzIHVzZXIgaWRlbnRpdHkgd2lsbCBiZSBjcmVhdGVkIGFuZCByZXR1cm5lZC5cclxuICpcclxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBzaWduSW5Bbm9ueW1vdXNseShhdXRoKSB7XHJcbiAgICB2YXIgX2E7XHJcbiAgICBjb25zdCBhdXRoSW50ZXJuYWwgPSBfY2FzdEF1dGgoYXV0aCk7XHJcbiAgICBhd2FpdCBhdXRoSW50ZXJuYWwuX2luaXRpYWxpemF0aW9uUHJvbWlzZTtcclxuICAgIGlmICgoX2EgPSBhdXRoSW50ZXJuYWwuY3VycmVudFVzZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pc0Fub255bW91cykge1xyXG4gICAgICAgIC8vIElmIGFuIGFub255bW91cyB1c2VyIGlzIGFscmVhZHkgc2lnbmVkIGluLCBubyBuZWVkIHRvIHNpZ24gdGhlbSBpbiBhZ2Fpbi5cclxuICAgICAgICByZXR1cm4gbmV3IFVzZXJDcmVkZW50aWFsSW1wbCh7XHJcbiAgICAgICAgICAgIHVzZXI6IGF1dGhJbnRlcm5hbC5jdXJyZW50VXNlcixcclxuICAgICAgICAgICAgcHJvdmlkZXJJZDogbnVsbCxcclxuICAgICAgICAgICAgb3BlcmF0aW9uVHlwZTogXCJzaWduSW5cIiAvKiBTSUdOX0lOICovXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNpZ25VcChhdXRoSW50ZXJuYWwsIHtcclxuICAgICAgICByZXR1cm5TZWN1cmVUb2tlbjogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBjb25zdCB1c2VyQ3JlZGVudGlhbCA9IGF3YWl0IFVzZXJDcmVkZW50aWFsSW1wbC5fZnJvbUlkVG9rZW5SZXNwb25zZShhdXRoSW50ZXJuYWwsIFwic2lnbkluXCIgLyogU0lHTl9JTiAqLywgcmVzcG9uc2UsIHRydWUpO1xyXG4gICAgYXdhaXQgYXV0aEludGVybmFsLl91cGRhdGVDdXJyZW50VXNlcih1c2VyQ3JlZGVudGlhbC51c2VyKTtcclxuICAgIHJldHVybiB1c2VyQ3JlZGVudGlhbDtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jbGFzcyBNdWx0aUZhY3RvckVycm9yIGV4dGVuZHMgRmlyZWJhc2VFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3RvcihhdXRoLCBlcnJvciwgb3BlcmF0aW9uVHlwZSwgdXNlcikge1xyXG4gICAgICAgIHZhciBfYTtcclxuICAgICAgICBzdXBlcihlcnJvci5jb2RlLCBlcnJvci5tZXNzYWdlKTtcclxuICAgICAgICB0aGlzLm9wZXJhdGlvblR5cGUgPSBvcGVyYXRpb25UeXBlO1xyXG4gICAgICAgIHRoaXMudXNlciA9IHVzZXI7XHJcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0LXdpa2kvYmxvYi9tYXN0ZXIvQnJlYWtpbmctQ2hhbmdlcy5tZCNleHRlbmRpbmctYnVpbHQtaW5zLWxpa2UtZXJyb3ItYXJyYXktYW5kLW1hcC1tYXktbm8tbG9uZ2VyLXdvcmtcclxuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgTXVsdGlGYWN0b3JFcnJvci5wcm90b3R5cGUpO1xyXG4gICAgICAgIHRoaXMuY3VzdG9tRGF0YSA9IHtcclxuICAgICAgICAgICAgYXBwTmFtZTogYXV0aC5uYW1lLFxyXG4gICAgICAgICAgICB0ZW5hbnRJZDogKF9hID0gYXV0aC50ZW5hbnRJZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBfc2VydmVyUmVzcG9uc2U6IGVycm9yLmN1c3RvbURhdGEuX3NlcnZlclJlc3BvbnNlLFxyXG4gICAgICAgICAgICBvcGVyYXRpb25UeXBlLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgX2Zyb21FcnJvckFuZE9wZXJhdGlvbihhdXRoLCBlcnJvciwgb3BlcmF0aW9uVHlwZSwgdXNlcikge1xyXG4gICAgICAgIHJldHVybiBuZXcgTXVsdGlGYWN0b3JFcnJvcihhdXRoLCBlcnJvciwgb3BlcmF0aW9uVHlwZSwgdXNlcik7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gX3Byb2Nlc3NDcmVkZW50aWFsU2F2aW5nTWZhQ29udGV4dElmTmVjZXNzYXJ5KGF1dGgsIG9wZXJhdGlvblR5cGUsIGNyZWRlbnRpYWwsIHVzZXIpIHtcclxuICAgIGNvbnN0IGlkVG9rZW5Qcm92aWRlciA9IG9wZXJhdGlvblR5cGUgPT09IFwicmVhdXRoZW50aWNhdGVcIiAvKiBSRUFVVEhFTlRJQ0FURSAqL1xyXG4gICAgICAgID8gY3JlZGVudGlhbC5fZ2V0UmVhdXRoZW50aWNhdGlvblJlc29sdmVyKGF1dGgpXHJcbiAgICAgICAgOiBjcmVkZW50aWFsLl9nZXRJZFRva2VuUmVzcG9uc2UoYXV0aCk7XHJcbiAgICByZXR1cm4gaWRUb2tlblByb3ZpZGVyLmNhdGNoKGVycm9yID0+IHtcclxuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gYGF1dGgvJHtcIm11bHRpLWZhY3Rvci1hdXRoLXJlcXVpcmVkXCIgLyogTUZBX1JFUVVJUkVEICovfWApIHtcclxuICAgICAgICAgICAgdGhyb3cgTXVsdGlGYWN0b3JFcnJvci5fZnJvbUVycm9yQW5kT3BlcmF0aW9uKGF1dGgsIGVycm9yLCBvcGVyYXRpb25UeXBlLCB1c2VyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICB9KTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogVGFrZXMgYSBzZXQgb2YgVXNlckluZm8gcHJvdmlkZXIgZGF0YSBhbmQgY29udmVydHMgaXQgdG8gYSBzZXQgb2YgbmFtZXNcclxuICovXHJcbmZ1bmN0aW9uIHByb3ZpZGVyRGF0YUFzTmFtZXMocHJvdmlkZXJEYXRhKSB7XHJcbiAgICByZXR1cm4gbmV3IFNldChwcm92aWRlckRhdGFcclxuICAgICAgICAubWFwKCh7IHByb3ZpZGVySWQgfSkgPT4gcHJvdmlkZXJJZClcclxuICAgICAgICAuZmlsdGVyKHBpZCA9PiAhIXBpZCkpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBVbmxpbmtzIGEgcHJvdmlkZXIgZnJvbSBhIHVzZXIgYWNjb3VudC5cclxuICpcclxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cclxuICogQHBhcmFtIHByb3ZpZGVySWQgLSBUaGUgcHJvdmlkZXIgdG8gdW5saW5rLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiB1bmxpbmsodXNlciwgcHJvdmlkZXJJZCkge1xyXG4gICAgY29uc3QgdXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpO1xyXG4gICAgYXdhaXQgX2Fzc2VydExpbmtlZFN0YXR1cyh0cnVlLCB1c2VySW50ZXJuYWwsIHByb3ZpZGVySWQpO1xyXG4gICAgY29uc3QgeyBwcm92aWRlclVzZXJJbmZvIH0gPSBhd2FpdCBkZWxldGVMaW5rZWRBY2NvdW50cyh1c2VySW50ZXJuYWwuYXV0aCwge1xyXG4gICAgICAgIGlkVG9rZW46IGF3YWl0IHVzZXJJbnRlcm5hbC5nZXRJZFRva2VuKCksXHJcbiAgICAgICAgZGVsZXRlUHJvdmlkZXI6IFtwcm92aWRlcklkXVxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBwcm92aWRlcnNMZWZ0ID0gcHJvdmlkZXJEYXRhQXNOYW1lcyhwcm92aWRlclVzZXJJbmZvIHx8IFtdKTtcclxuICAgIHVzZXJJbnRlcm5hbC5wcm92aWRlckRhdGEgPSB1c2VySW50ZXJuYWwucHJvdmlkZXJEYXRhLmZpbHRlcihwZCA9PiBwcm92aWRlcnNMZWZ0LmhhcyhwZC5wcm92aWRlcklkKSk7XHJcbiAgICBpZiAoIXByb3ZpZGVyc0xlZnQuaGFzKFwicGhvbmVcIiAvKiBQSE9ORSAqLykpIHtcclxuICAgICAgICB1c2VySW50ZXJuYWwucGhvbmVOdW1iZXIgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdXNlckludGVybmFsLmF1dGguX3BlcnNpc3RVc2VySWZDdXJyZW50KHVzZXJJbnRlcm5hbCk7XHJcbiAgICByZXR1cm4gdXNlckludGVybmFsO1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIF9saW5rJDEodXNlciwgY3JlZGVudGlhbCwgYnlwYXNzQXV0aFN0YXRlID0gZmFsc2UpIHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgX2xvZ291dElmSW52YWxpZGF0ZWQodXNlciwgY3JlZGVudGlhbC5fbGlua1RvSWRUb2tlbih1c2VyLmF1dGgsIGF3YWl0IHVzZXIuZ2V0SWRUb2tlbigpKSwgYnlwYXNzQXV0aFN0YXRlKTtcclxuICAgIHJldHVybiBVc2VyQ3JlZGVudGlhbEltcGwuX2Zvck9wZXJhdGlvbih1c2VyLCBcImxpbmtcIiAvKiBMSU5LICovLCByZXNwb25zZSk7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gX2Fzc2VydExpbmtlZFN0YXR1cyhleHBlY3RlZCwgdXNlciwgcHJvdmlkZXIpIHtcclxuICAgIGF3YWl0IF9yZWxvYWRXaXRob3V0U2F2aW5nKHVzZXIpO1xyXG4gICAgY29uc3QgcHJvdmlkZXJJZHMgPSBwcm92aWRlckRhdGFBc05hbWVzKHVzZXIucHJvdmlkZXJEYXRhKTtcclxuICAgIGNvbnN0IGNvZGUgPSBleHBlY3RlZCA9PT0gZmFsc2VcclxuICAgICAgICA/IFwicHJvdmlkZXItYWxyZWFkeS1saW5rZWRcIiAvKiBQUk9WSURFUl9BTFJFQURZX0xJTktFRCAqL1xyXG4gICAgICAgIDogXCJuby1zdWNoLXByb3ZpZGVyXCIgLyogTk9fU1VDSF9QUk9WSURFUiAqLztcclxuICAgIF9hc3NlcnQocHJvdmlkZXJJZHMuaGFzKHByb3ZpZGVyKSA9PT0gZXhwZWN0ZWQsIHVzZXIuYXV0aCwgY29kZSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gX3JlYXV0aGVudGljYXRlKHVzZXIsIGNyZWRlbnRpYWwsIGJ5cGFzc0F1dGhTdGF0ZSA9IGZhbHNlKSB7XHJcbiAgICBjb25zdCB7IGF1dGggfSA9IHVzZXI7XHJcbiAgICBjb25zdCBvcGVyYXRpb25UeXBlID0gXCJyZWF1dGhlbnRpY2F0ZVwiIC8qIFJFQVVUSEVOVElDQVRFICovO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9sb2dvdXRJZkludmFsaWRhdGVkKHVzZXIsIF9wcm9jZXNzQ3JlZGVudGlhbFNhdmluZ01mYUNvbnRleHRJZk5lY2Vzc2FyeShhdXRoLCBvcGVyYXRpb25UeXBlLCBjcmVkZW50aWFsLCB1c2VyKSwgYnlwYXNzQXV0aFN0YXRlKTtcclxuICAgICAgICBfYXNzZXJ0KHJlc3BvbnNlLmlkVG9rZW4sIGF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgY29uc3QgcGFyc2VkID0gX3BhcnNlVG9rZW4ocmVzcG9uc2UuaWRUb2tlbik7XHJcbiAgICAgICAgX2Fzc2VydChwYXJzZWQsIGF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgY29uc3QgeyBzdWI6IGxvY2FsSWQgfSA9IHBhcnNlZDtcclxuICAgICAgICBfYXNzZXJ0KHVzZXIudWlkID09PSBsb2NhbElkLCBhdXRoLCBcInVzZXItbWlzbWF0Y2hcIiAvKiBVU0VSX01JU01BVENIICovKTtcclxuICAgICAgICByZXR1cm4gVXNlckNyZWRlbnRpYWxJbXBsLl9mb3JPcGVyYXRpb24odXNlciwgb3BlcmF0aW9uVHlwZSwgcmVzcG9uc2UpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAvLyBDb252ZXJ0IHVzZXIgZGVsZXRlZCBlcnJvciBpbnRvIHVzZXIgbWlzbWF0Y2hcclxuICAgICAgICBpZiAoKGUgPT09IG51bGwgfHwgZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZS5jb2RlKSA9PT0gYGF1dGgvJHtcInVzZXItbm90LWZvdW5kXCIgLyogVVNFUl9ERUxFVEVEICovfWApIHtcclxuICAgICAgICAgICAgX2ZhaWwoYXV0aCwgXCJ1c2VyLW1pc21hdGNoXCIgLyogVVNFUl9NSVNNQVRDSCAqLyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IGU7XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gX3NpZ25JbldpdGhDcmVkZW50aWFsKGF1dGgsIGNyZWRlbnRpYWwsIGJ5cGFzc0F1dGhTdGF0ZSA9IGZhbHNlKSB7XHJcbiAgICBjb25zdCBvcGVyYXRpb25UeXBlID0gXCJzaWduSW5cIiAvKiBTSUdOX0lOICovO1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBfcHJvY2Vzc0NyZWRlbnRpYWxTYXZpbmdNZmFDb250ZXh0SWZOZWNlc3NhcnkoYXV0aCwgb3BlcmF0aW9uVHlwZSwgY3JlZGVudGlhbCk7XHJcbiAgICBjb25zdCB1c2VyQ3JlZGVudGlhbCA9IGF3YWl0IFVzZXJDcmVkZW50aWFsSW1wbC5fZnJvbUlkVG9rZW5SZXNwb25zZShhdXRoLCBvcGVyYXRpb25UeXBlLCByZXNwb25zZSk7XHJcbiAgICBpZiAoIWJ5cGFzc0F1dGhTdGF0ZSkge1xyXG4gICAgICAgIGF3YWl0IGF1dGguX3VwZGF0ZUN1cnJlbnRVc2VyKHVzZXJDcmVkZW50aWFsLnVzZXIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVzZXJDcmVkZW50aWFsO1xyXG59XHJcbi8qKlxyXG4gKiBBc3luY2hyb25vdXNseSBzaWducyBpbiB3aXRoIHRoZSBnaXZlbiBjcmVkZW50aWFscy5cclxuICpcclxuICogQHJlbWFya3NcclxuICogQW4ge0BsaW5rIEF1dGhQcm92aWRlcn0gY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNyZWRlbnRpYWwuXHJcbiAqXHJcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cclxuICogQHBhcmFtIGNyZWRlbnRpYWwgLSBUaGUgYXV0aCBjcmVkZW50aWFsLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBzaWduSW5XaXRoQ3JlZGVudGlhbChhdXRoLCBjcmVkZW50aWFsKSB7XHJcbiAgICByZXR1cm4gX3NpZ25JbldpdGhDcmVkZW50aWFsKF9jYXN0QXV0aChhdXRoKSwgY3JlZGVudGlhbCk7XHJcbn1cclxuLyoqXHJcbiAqIExpbmtzIHRoZSB1c2VyIGFjY291bnQgd2l0aCB0aGUgZ2l2ZW4gY3JlZGVudGlhbHMuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIEFuIHtAbGluayBBdXRoUHJvdmlkZXJ9IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjcmVkZW50aWFsLlxyXG4gKlxyXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxyXG4gKiBAcGFyYW0gY3JlZGVudGlhbCAtIFRoZSBhdXRoIGNyZWRlbnRpYWwuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIGxpbmtXaXRoQ3JlZGVudGlhbCh1c2VyLCBjcmVkZW50aWFsKSB7XHJcbiAgICBjb25zdCB1c2VySW50ZXJuYWwgPSBnZXRNb2R1bGFySW5zdGFuY2UodXNlcik7XHJcbiAgICBhd2FpdCBfYXNzZXJ0TGlua2VkU3RhdHVzKGZhbHNlLCB1c2VySW50ZXJuYWwsIGNyZWRlbnRpYWwucHJvdmlkZXJJZCk7XHJcbiAgICByZXR1cm4gX2xpbmskMSh1c2VySW50ZXJuYWwsIGNyZWRlbnRpYWwpO1xyXG59XHJcbi8qKlxyXG4gKiBSZS1hdXRoZW50aWNhdGVzIGEgdXNlciB1c2luZyBhIGZyZXNoIGNyZWRlbnRpYWwuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIFVzZSBiZWZvcmUgb3BlcmF0aW9ucyBzdWNoIGFzIHtAbGluayB1cGRhdGVQYXNzd29yZH0gdGhhdCByZXF1aXJlIHRva2VucyBmcm9tIHJlY2VudCBzaWduLWluXHJcbiAqIGF0dGVtcHRzLiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byByZWNvdmVyIGZyb20gYSBgQ1JFREVOVElBTF9UT09fT0xEX0xPR0lOX0FHQUlOYCBlcnJvci5cclxuICpcclxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cclxuICogQHBhcmFtIGNyZWRlbnRpYWwgLSBUaGUgYXV0aCBjcmVkZW50aWFsLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiByZWF1dGhlbnRpY2F0ZVdpdGhDcmVkZW50aWFsKHVzZXIsIGNyZWRlbnRpYWwpIHtcclxuICAgIHJldHVybiBfcmVhdXRoZW50aWNhdGUoZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpLCBjcmVkZW50aWFsKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBzaWduSW5XaXRoQ3VzdG9tVG9rZW4kMShhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gX3BlcmZvcm1TaWduSW5SZXF1ZXN0KGF1dGgsIFwiUE9TVFwiIC8qIFBPU1QgKi8sIFwiL3YxL2FjY291bnRzOnNpZ25JbldpdGhDdXN0b21Ub2tlblwiIC8qIFNJR05fSU5fV0lUSF9DVVNUT01fVE9LRU4gKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIEFzeW5jaHJvbm91c2x5IHNpZ25zIGluIHVzaW5nIGEgY3VzdG9tIHRva2VuLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBDdXN0b20gdG9rZW5zIGFyZSB1c2VkIHRvIGludGVncmF0ZSBGaXJlYmFzZSBBdXRoIHdpdGggZXhpc3RpbmcgYXV0aCBzeXN0ZW1zLCBhbmQgbXVzdFxyXG4gKiBiZSBnZW5lcmF0ZWQgYnkgYW4gYXV0aCBiYWNrZW5kIHVzaW5nIHRoZVxyXG4gKiB7QGxpbmsgaHR0cHM6Ly9maXJlYmFzZS5nb29nbGUuY29tL2RvY3MvcmVmZXJlbmNlL2FkbWluL25vZGUvYWRtaW4uYXV0aC5BdXRoI2NyZWF0ZWN1c3RvbXRva2VuIHwgY3JlYXRlQ3VzdG9tVG9rZW59XHJcbiAqIG1ldGhvZCBpbiB0aGUge0BsaW5rIGh0dHBzOi8vZmlyZWJhc2UuZ29vZ2xlLmNvbS9kb2NzL2F1dGgvYWRtaW4gfCBBZG1pbiBTREt9IC5cclxuICpcclxuICogRmFpbHMgd2l0aCBhbiBlcnJvciBpZiB0aGUgdG9rZW4gaXMgaW52YWxpZCwgZXhwaXJlZCwgb3Igbm90IGFjY2VwdGVkIGJ5IHRoZSBGaXJlYmFzZSBBdXRoIHNlcnZpY2UuXHJcbiAqXHJcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cclxuICogQHBhcmFtIGN1c3RvbVRva2VuIC0gVGhlIGN1c3RvbSB0b2tlbiB0byBzaWduIGluIHdpdGguXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHNpZ25JbldpdGhDdXN0b21Ub2tlbihhdXRoLCBjdXN0b21Ub2tlbikge1xyXG4gICAgY29uc3QgYXV0aEludGVybmFsID0gX2Nhc3RBdXRoKGF1dGgpO1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzaWduSW5XaXRoQ3VzdG9tVG9rZW4kMShhdXRoSW50ZXJuYWwsIHtcclxuICAgICAgICB0b2tlbjogY3VzdG9tVG9rZW4sXHJcbiAgICAgICAgcmV0dXJuU2VjdXJlVG9rZW46IHRydWVcclxuICAgIH0pO1xyXG4gICAgY29uc3QgY3JlZCA9IGF3YWl0IFVzZXJDcmVkZW50aWFsSW1wbC5fZnJvbUlkVG9rZW5SZXNwb25zZShhdXRoSW50ZXJuYWwsIFwic2lnbkluXCIgLyogU0lHTl9JTiAqLywgcmVzcG9uc2UpO1xyXG4gICAgYXdhaXQgYXV0aEludGVybmFsLl91cGRhdGVDdXJyZW50VXNlcihjcmVkLnVzZXIpO1xyXG4gICAgcmV0dXJuIGNyZWQ7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgTXVsdGlGYWN0b3JJbmZvSW1wbCB7XHJcbiAgICBjb25zdHJ1Y3RvcihmYWN0b3JJZCwgcmVzcG9uc2UpIHtcclxuICAgICAgICB0aGlzLmZhY3RvcklkID0gZmFjdG9ySWQ7XHJcbiAgICAgICAgdGhpcy51aWQgPSByZXNwb25zZS5tZmFFbnJvbGxtZW50SWQ7XHJcbiAgICAgICAgdGhpcy5lbnJvbGxtZW50VGltZSA9IG5ldyBEYXRlKHJlc3BvbnNlLmVucm9sbGVkQXQpLnRvVVRDU3RyaW5nKCk7XHJcbiAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSA9IHJlc3BvbnNlLmRpc3BsYXlOYW1lO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIF9mcm9tU2VydmVyUmVzcG9uc2UoYXV0aCwgZW5yb2xsbWVudCkge1xyXG4gICAgICAgIGlmICgncGhvbmVJbmZvJyBpbiBlbnJvbGxtZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQaG9uZU11bHRpRmFjdG9ySW5mb0ltcGwuX2Zyb21TZXJ2ZXJSZXNwb25zZShhdXRoLCBlbnJvbGxtZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9mYWlsKGF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgUGhvbmVNdWx0aUZhY3RvckluZm9JbXBsIGV4dGVuZHMgTXVsdGlGYWN0b3JJbmZvSW1wbCB7XHJcbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZSkge1xyXG4gICAgICAgIHN1cGVyKFwicGhvbmVcIiAvKiBQSE9ORSAqLywgcmVzcG9uc2UpO1xyXG4gICAgICAgIHRoaXMucGhvbmVOdW1iZXIgPSByZXNwb25zZS5waG9uZUluZm87XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgX2Zyb21TZXJ2ZXJSZXNwb25zZShfYXV0aCwgZW5yb2xsbWVudCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUGhvbmVNdWx0aUZhY3RvckluZm9JbXBsKGVucm9sbG1lbnQpO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIF9zZXRBY3Rpb25Db2RlU2V0dGluZ3NPblJlcXVlc3QoYXV0aCwgcmVxdWVzdCwgYWN0aW9uQ29kZVNldHRpbmdzKSB7XHJcbiAgICB2YXIgX2E7XHJcbiAgICBfYXNzZXJ0KCgoX2EgPSBhY3Rpb25Db2RlU2V0dGluZ3MudXJsKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubGVuZ3RoKSA+IDAsIGF1dGgsIFwiaW52YWxpZC1jb250aW51ZS11cmlcIiAvKiBJTlZBTElEX0NPTlRJTlVFX1VSSSAqLyk7XHJcbiAgICBfYXNzZXJ0KHR5cGVvZiBhY3Rpb25Db2RlU2V0dGluZ3MuZHluYW1pY0xpbmtEb21haW4gPT09ICd1bmRlZmluZWQnIHx8XHJcbiAgICAgICAgYWN0aW9uQ29kZVNldHRpbmdzLmR5bmFtaWNMaW5rRG9tYWluLmxlbmd0aCA+IDAsIGF1dGgsIFwiaW52YWxpZC1keW5hbWljLWxpbmstZG9tYWluXCIgLyogSU5WQUxJRF9EWU5BTUlDX0xJTktfRE9NQUlOICovKTtcclxuICAgIHJlcXVlc3QuY29udGludWVVcmwgPSBhY3Rpb25Db2RlU2V0dGluZ3MudXJsO1xyXG4gICAgcmVxdWVzdC5keW5hbWljTGlua0RvbWFpbiA9IGFjdGlvbkNvZGVTZXR0aW5ncy5keW5hbWljTGlua0RvbWFpbjtcclxuICAgIHJlcXVlc3QuY2FuSGFuZGxlQ29kZUluQXBwID0gYWN0aW9uQ29kZVNldHRpbmdzLmhhbmRsZUNvZGVJbkFwcDtcclxuICAgIGlmIChhY3Rpb25Db2RlU2V0dGluZ3MuaU9TKSB7XHJcbiAgICAgICAgX2Fzc2VydChhY3Rpb25Db2RlU2V0dGluZ3MuaU9TLmJ1bmRsZUlkLmxlbmd0aCA+IDAsIGF1dGgsIFwibWlzc2luZy1pb3MtYnVuZGxlLWlkXCIgLyogTUlTU0lOR19JT1NfQlVORExFX0lEICovKTtcclxuICAgICAgICByZXF1ZXN0LmlPU0J1bmRsZUlkID0gYWN0aW9uQ29kZVNldHRpbmdzLmlPUy5idW5kbGVJZDtcclxuICAgIH1cclxuICAgIGlmIChhY3Rpb25Db2RlU2V0dGluZ3MuYW5kcm9pZCkge1xyXG4gICAgICAgIF9hc3NlcnQoYWN0aW9uQ29kZVNldHRpbmdzLmFuZHJvaWQucGFja2FnZU5hbWUubGVuZ3RoID4gMCwgYXV0aCwgXCJtaXNzaW5nLWFuZHJvaWQtcGtnLW5hbWVcIiAvKiBNSVNTSU5HX0FORFJPSURfUEFDS0FHRV9OQU1FICovKTtcclxuICAgICAgICByZXF1ZXN0LmFuZHJvaWRJbnN0YWxsQXBwID0gYWN0aW9uQ29kZVNldHRpbmdzLmFuZHJvaWQuaW5zdGFsbEFwcDtcclxuICAgICAgICByZXF1ZXN0LmFuZHJvaWRNaW5pbXVtVmVyc2lvbkNvZGUgPVxyXG4gICAgICAgICAgICBhY3Rpb25Db2RlU2V0dGluZ3MuYW5kcm9pZC5taW5pbXVtVmVyc2lvbjtcclxuICAgICAgICByZXF1ZXN0LmFuZHJvaWRQYWNrYWdlTmFtZSA9IGFjdGlvbkNvZGVTZXR0aW5ncy5hbmRyb2lkLnBhY2thZ2VOYW1lO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBTZW5kcyBhIHBhc3N3b3JkIHJlc2V0IGVtYWlsIHRvIHRoZSBnaXZlbiBlbWFpbCBhZGRyZXNzLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBUbyBjb21wbGV0ZSB0aGUgcGFzc3dvcmQgcmVzZXQsIGNhbGwge0BsaW5rIGNvbmZpcm1QYXNzd29yZFJlc2V0fSB3aXRoIHRoZSBjb2RlIHN1cHBsaWVkIGluXHJcbiAqIHRoZSBlbWFpbCBzZW50IHRvIHRoZSB1c2VyLCBhbG9uZyB3aXRoIHRoZSBuZXcgcGFzc3dvcmQgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIGNvbnN0IGFjdGlvbkNvZGVTZXR0aW5ncyA9IHtcclxuICogICB1cmw6ICdodHRwczovL3d3dy5leGFtcGxlLmNvbS8/ZW1haWw9dXNlckBleGFtcGxlLmNvbScsXHJcbiAqICAgaU9TOiB7XHJcbiAqICAgICAgYnVuZGxlSWQ6ICdjb20uZXhhbXBsZS5pb3MnXHJcbiAqICAgfSxcclxuICogICBhbmRyb2lkOiB7XHJcbiAqICAgICBwYWNrYWdlTmFtZTogJ2NvbS5leGFtcGxlLmFuZHJvaWQnLFxyXG4gKiAgICAgaW5zdGFsbEFwcDogdHJ1ZSxcclxuICogICAgIG1pbmltdW1WZXJzaW9uOiAnMTInXHJcbiAqICAgfSxcclxuICogICBoYW5kbGVDb2RlSW5BcHA6IHRydWVcclxuICogfTtcclxuICogYXdhaXQgc2VuZFBhc3N3b3JkUmVzZXRFbWFpbChhdXRoLCAndXNlckBleGFtcGxlLmNvbScsIGFjdGlvbkNvZGVTZXR0aW5ncyk7XHJcbiAqIC8vIE9idGFpbiBjb2RlIGZyb20gdXNlci5cclxuICogYXdhaXQgY29uZmlybVBhc3N3b3JkUmVzZXQoJ3VzZXJAZXhhbXBsZS5jb20nLCBjb2RlKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cclxuICogQHBhcmFtIGVtYWlsIC0gVGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzLlxyXG4gKiBAcGFyYW0gYWN0aW9uQ29kZVNldHRpbmdzIC0gVGhlIHtAbGluayBBY3Rpb25Db2RlU2V0dGluZ3N9LlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBzZW5kUGFzc3dvcmRSZXNldEVtYWlsKGF1dGgsIGVtYWlsLCBhY3Rpb25Db2RlU2V0dGluZ3MpIHtcclxuICAgIGNvbnN0IGF1dGhNb2R1bGFyID0gZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpO1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IHtcclxuICAgICAgICByZXF1ZXN0VHlwZTogXCJQQVNTV09SRF9SRVNFVFwiIC8qIFBBU1NXT1JEX1JFU0VUICovLFxyXG4gICAgICAgIGVtYWlsXHJcbiAgICB9O1xyXG4gICAgaWYgKGFjdGlvbkNvZGVTZXR0aW5ncykge1xyXG4gICAgICAgIF9zZXRBY3Rpb25Db2RlU2V0dGluZ3NPblJlcXVlc3QoYXV0aE1vZHVsYXIsIHJlcXVlc3QsIGFjdGlvbkNvZGVTZXR0aW5ncyk7XHJcbiAgICB9XHJcbiAgICBhd2FpdCBzZW5kUGFzc3dvcmRSZXNldEVtYWlsJDEoYXV0aE1vZHVsYXIsIHJlcXVlc3QpO1xyXG59XHJcbi8qKlxyXG4gKiBDb21wbGV0ZXMgdGhlIHBhc3N3b3JkIHJlc2V0IHByb2Nlc3MsIGdpdmVuIGEgY29uZmlybWF0aW9uIGNvZGUgYW5kIG5ldyBwYXNzd29yZC5cclxuICpcclxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxyXG4gKiBAcGFyYW0gb29iQ29kZSAtIEEgY29uZmlybWF0aW9uIGNvZGUgc2VudCB0byB0aGUgdXNlci5cclxuICogQHBhcmFtIG5ld1Bhc3N3b3JkIC0gVGhlIG5ldyBwYXNzd29yZC5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gY29uZmlybVBhc3N3b3JkUmVzZXQoYXV0aCwgb29iQ29kZSwgbmV3UGFzc3dvcmQpIHtcclxuICAgIGF3YWl0IHJlc2V0UGFzc3dvcmQoZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpLCB7XHJcbiAgICAgICAgb29iQ29kZSxcclxuICAgICAgICBuZXdQYXNzd29yZFxyXG4gICAgfSk7XHJcbiAgICAvLyBEbyBub3QgcmV0dXJuIHRoZSBlbWFpbC5cclxufVxyXG4vKipcclxuICogQXBwbGllcyBhIHZlcmlmaWNhdGlvbiBjb2RlIHNlbnQgdG8gdGhlIHVzZXIgYnkgZW1haWwgb3Igb3RoZXIgb3V0LW9mLWJhbmQgbWVjaGFuaXNtLlxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSBvb2JDb2RlIC0gQSB2ZXJpZmljYXRpb24gY29kZSBzZW50IHRvIHRoZSB1c2VyLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBhcHBseUFjdGlvbkNvZGUoYXV0aCwgb29iQ29kZSkge1xyXG4gICAgYXdhaXQgYXBwbHlBY3Rpb25Db2RlJDEoZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpLCB7IG9vYkNvZGUgfSk7XHJcbn1cclxuLyoqXHJcbiAqIENoZWNrcyBhIHZlcmlmaWNhdGlvbiBjb2RlIHNlbnQgdG8gdGhlIHVzZXIgYnkgZW1haWwgb3Igb3RoZXIgb3V0LW9mLWJhbmQgbWVjaGFuaXNtLlxyXG4gKlxyXG4gKiBAcmV0dXJucyBtZXRhZGF0YSBhYm91dCB0aGUgY29kZS5cclxuICpcclxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxyXG4gKiBAcGFyYW0gb29iQ29kZSAtIEEgdmVyaWZpY2F0aW9uIGNvZGUgc2VudCB0byB0aGUgdXNlci5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gY2hlY2tBY3Rpb25Db2RlKGF1dGgsIG9vYkNvZGUpIHtcclxuICAgIGNvbnN0IGF1dGhNb2R1bGFyID0gZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpO1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXNldFBhc3N3b3JkKGF1dGhNb2R1bGFyLCB7IG9vYkNvZGUgfSk7XHJcbiAgICAvLyBFbWFpbCBjb3VsZCBiZSBlbXB0eSBvbmx5IGlmIHRoZSByZXF1ZXN0IHR5cGUgaXMgRU1BSUxfU0lHTklOIG9yXHJcbiAgICAvLyBWRVJJRllfQU5EX0NIQU5HRV9FTUFJTC5cclxuICAgIC8vIE5ldyBlbWFpbCBzaG91bGQgbm90IGJlIGVtcHR5IGlmIHRoZSByZXF1ZXN0IHR5cGUgaXNcclxuICAgIC8vIFZFUklGWV9BTkRfQ0hBTkdFX0VNQUlMLlxyXG4gICAgLy8gTXVsdGktZmFjdG9yIGluZm8gY291bGQgbm90IGJlIGVtcHR5IGlmIHRoZSByZXF1ZXN0IHR5cGUgaXNcclxuICAgIC8vIFJFVkVSVF9TRUNPTkRfRkFDVE9SX0FERElUSU9OLlxyXG4gICAgY29uc3Qgb3BlcmF0aW9uID0gcmVzcG9uc2UucmVxdWVzdFR5cGU7XHJcbiAgICBfYXNzZXJ0KG9wZXJhdGlvbiwgYXV0aE1vZHVsYXIsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICBzd2l0Y2ggKG9wZXJhdGlvbikge1xyXG4gICAgICAgIGNhc2UgXCJFTUFJTF9TSUdOSU5cIiAvKiBFTUFJTF9TSUdOSU4gKi86XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJWRVJJRllfQU5EX0NIQU5HRV9FTUFJTFwiIC8qIFZFUklGWV9BTkRfQ0hBTkdFX0VNQUlMICovOlxyXG4gICAgICAgICAgICBfYXNzZXJ0KHJlc3BvbnNlLm5ld0VtYWlsLCBhdXRoTW9kdWxhciwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcIlJFVkVSVF9TRUNPTkRfRkFDVE9SX0FERElUSU9OXCIgLyogUkVWRVJUX1NFQ09ORF9GQUNUT1JfQURESVRJT04gKi86XHJcbiAgICAgICAgICAgIF9hc3NlcnQocmVzcG9uc2UubWZhSW5mbywgYXV0aE1vZHVsYXIsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgLy8gZmFsbCB0aHJvdWdoXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgX2Fzc2VydChyZXNwb25zZS5lbWFpbCwgYXV0aE1vZHVsYXIsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICB9XHJcbiAgICAvLyBUaGUgbXVsdGktZmFjdG9yIGluZm8gZm9yIHJldmVydCBzZWNvbmQgZmFjdG9yIGFkZGl0aW9uXHJcbiAgICBsZXQgbXVsdGlGYWN0b3JJbmZvID0gbnVsbDtcclxuICAgIGlmIChyZXNwb25zZS5tZmFJbmZvKSB7XHJcbiAgICAgICAgbXVsdGlGYWN0b3JJbmZvID0gTXVsdGlGYWN0b3JJbmZvSW1wbC5fZnJvbVNlcnZlclJlc3BvbnNlKF9jYXN0QXV0aChhdXRoTW9kdWxhciksIHJlc3BvbnNlLm1mYUluZm8pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgIGVtYWlsOiAocmVzcG9uc2UucmVxdWVzdFR5cGUgPT09IFwiVkVSSUZZX0FORF9DSEFOR0VfRU1BSUxcIiAvKiBWRVJJRllfQU5EX0NIQU5HRV9FTUFJTCAqL1xyXG4gICAgICAgICAgICAgICAgPyByZXNwb25zZS5uZXdFbWFpbFxyXG4gICAgICAgICAgICAgICAgOiByZXNwb25zZS5lbWFpbCkgfHwgbnVsbCxcclxuICAgICAgICAgICAgcHJldmlvdXNFbWFpbDogKHJlc3BvbnNlLnJlcXVlc3RUeXBlID09PSBcIlZFUklGWV9BTkRfQ0hBTkdFX0VNQUlMXCIgLyogVkVSSUZZX0FORF9DSEFOR0VfRU1BSUwgKi9cclxuICAgICAgICAgICAgICAgID8gcmVzcG9uc2UuZW1haWxcclxuICAgICAgICAgICAgICAgIDogcmVzcG9uc2UubmV3RW1haWwpIHx8IG51bGwsXHJcbiAgICAgICAgICAgIG11bHRpRmFjdG9ySW5mb1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb3BlcmF0aW9uXHJcbiAgICB9O1xyXG59XHJcbi8qKlxyXG4gKiBDaGVja3MgYSBwYXNzd29yZCByZXNldCBjb2RlIHNlbnQgdG8gdGhlIHVzZXIgYnkgZW1haWwgb3Igb3RoZXIgb3V0LW9mLWJhbmQgbWVjaGFuaXNtLlxyXG4gKlxyXG4gKiBAcmV0dXJucyB0aGUgdXNlcidzIGVtYWlsIGFkZHJlc3MgaWYgdmFsaWQuXHJcbiAqXHJcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cclxuICogQHBhcmFtIGNvZGUgLSBBIHZlcmlmaWNhdGlvbiBjb2RlIHNlbnQgdG8gdGhlIHVzZXIuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeVBhc3N3b3JkUmVzZXRDb2RlKGF1dGgsIGNvZGUpIHtcclxuICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgY2hlY2tBY3Rpb25Db2RlKGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKSwgY29kZSk7XHJcbiAgICAvLyBFbWFpbCBzaG91bGQgYWx3YXlzIGJlIHByZXNlbnQgc2luY2UgYSBjb2RlIHdhcyBzZW50IHRvIGl0XHJcbiAgICByZXR1cm4gZGF0YS5lbWFpbDtcclxufVxyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyB1c2VyIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgZW1haWwgYWRkcmVzcyBhbmQgcGFzc3dvcmQuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIE9uIHN1Y2Nlc3NmdWwgY3JlYXRpb24gb2YgdGhlIHVzZXIgYWNjb3VudCwgdGhpcyB1c2VyIHdpbGwgYWxzbyBiZSBzaWduZWQgaW4gdG8geW91ciBhcHBsaWNhdGlvbi5cclxuICpcclxuICogVXNlciBhY2NvdW50IGNyZWF0aW9uIGNhbiBmYWlsIGlmIHRoZSBhY2NvdW50IGFscmVhZHkgZXhpc3RzIG9yIHRoZSBwYXNzd29yZCBpcyBpbnZhbGlkLlxyXG4gKlxyXG4gKiBOb3RlOiBUaGUgZW1haWwgYWRkcmVzcyBhY3RzIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB1c2VyIGFuZCBlbmFibGVzIGFuIGVtYWlsLWJhc2VkXHJcbiAqIHBhc3N3b3JkIHJlc2V0LiBUaGlzIGZ1bmN0aW9uIHdpbGwgY3JlYXRlIGEgbmV3IHVzZXIgYWNjb3VudCBhbmQgc2V0IHRoZSBpbml0aWFsIHVzZXIgcGFzc3dvcmQuXHJcbiAqXHJcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cclxuICogQHBhcmFtIGVtYWlsIC0gVGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzLlxyXG4gKiBAcGFyYW0gcGFzc3dvcmQgLSBUaGUgdXNlcidzIGNob3NlbiBwYXNzd29yZC5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlVXNlcldpdGhFbWFpbEFuZFBhc3N3b3JkKGF1dGgsIGVtYWlsLCBwYXNzd29yZCkge1xyXG4gICAgY29uc3QgYXV0aEludGVybmFsID0gX2Nhc3RBdXRoKGF1dGgpO1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzaWduVXAoYXV0aEludGVybmFsLCB7XHJcbiAgICAgICAgcmV0dXJuU2VjdXJlVG9rZW46IHRydWUsXHJcbiAgICAgICAgZW1haWwsXHJcbiAgICAgICAgcGFzc3dvcmRcclxuICAgIH0pO1xyXG4gICAgY29uc3QgdXNlckNyZWRlbnRpYWwgPSBhd2FpdCBVc2VyQ3JlZGVudGlhbEltcGwuX2Zyb21JZFRva2VuUmVzcG9uc2UoYXV0aEludGVybmFsLCBcInNpZ25JblwiIC8qIFNJR05fSU4gKi8sIHJlc3BvbnNlKTtcclxuICAgIGF3YWl0IGF1dGhJbnRlcm5hbC5fdXBkYXRlQ3VycmVudFVzZXIodXNlckNyZWRlbnRpYWwudXNlcik7XHJcbiAgICByZXR1cm4gdXNlckNyZWRlbnRpYWw7XHJcbn1cclxuLyoqXHJcbiAqIEFzeW5jaHJvbm91c2x5IHNpZ25zIGluIHVzaW5nIGFuIGVtYWlsIGFuZCBwYXNzd29yZC5cclxuICpcclxuICogQHJlbWFya3NcclxuICogRmFpbHMgd2l0aCBhbiBlcnJvciBpZiB0aGUgZW1haWwgYWRkcmVzcyBhbmQgcGFzc3dvcmQgZG8gbm90IG1hdGNoLlxyXG4gKlxyXG4gKiBOb3RlOiBUaGUgdXNlcidzIHBhc3N3b3JkIGlzIE5PVCB0aGUgcGFzc3dvcmQgdXNlZCB0byBhY2Nlc3MgdGhlIHVzZXIncyBlbWFpbCBhY2NvdW50LiBUaGVcclxuICogZW1haWwgYWRkcmVzcyBzZXJ2ZXMgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHVzZXIsIGFuZCB0aGUgcGFzc3dvcmQgaXMgdXNlZCB0byBhY2Nlc3NcclxuICogdGhlIHVzZXIncyBhY2NvdW50IGluIHlvdXIgRmlyZWJhc2UgcHJvamVjdC4gU2VlIGFsc286IHtAbGluayBjcmVhdGVVc2VyV2l0aEVtYWlsQW5kUGFzc3dvcmR9LlxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSBlbWFpbCAtIFRoZSB1c2VycyBlbWFpbCBhZGRyZXNzLlxyXG4gKiBAcGFyYW0gcGFzc3dvcmQgLSBUaGUgdXNlcnMgcGFzc3dvcmQuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmZ1bmN0aW9uIHNpZ25JbldpdGhFbWFpbEFuZFBhc3N3b3JkKGF1dGgsIGVtYWlsLCBwYXNzd29yZCkge1xyXG4gICAgcmV0dXJuIHNpZ25JbldpdGhDcmVkZW50aWFsKGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKSwgRW1haWxBdXRoUHJvdmlkZXIuY3JlZGVudGlhbChlbWFpbCwgcGFzc3dvcmQpKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogU2VuZHMgYSBzaWduLWluIGVtYWlsIGxpbmsgdG8gdGhlIHVzZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGVtYWlsLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBUaGUgc2lnbi1pbiBvcGVyYXRpb24gaGFzIHRvIGFsd2F5cyBiZSBjb21wbGV0ZWQgaW4gdGhlIGFwcCB1bmxpa2Ugb3RoZXIgb3V0IG9mIGJhbmQgZW1haWxcclxuICogYWN0aW9ucyAocGFzc3dvcmQgcmVzZXQgYW5kIGVtYWlsIHZlcmlmaWNhdGlvbnMpLiBUaGlzIGlzIGJlY2F1c2UsIGF0IHRoZSBlbmQgb2YgdGhlIGZsb3csXHJcbiAqIHRoZSB1c2VyIGlzIGV4cGVjdGVkIHRvIGJlIHNpZ25lZCBpbiBhbmQgdGhlaXIgQXV0aCBzdGF0ZSBwZXJzaXN0ZWQgd2l0aGluIHRoZSBhcHAuXHJcbiAqXHJcbiAqIFRvIGNvbXBsZXRlIHNpZ24gaW4gd2l0aCB0aGUgZW1haWwgbGluaywgY2FsbCB7QGxpbmsgc2lnbkluV2l0aEVtYWlsTGlua30gd2l0aCB0aGUgZW1haWxcclxuICogYWRkcmVzcyBhbmQgdGhlIGVtYWlsIGxpbmsgc3VwcGxpZWQgaW4gdGhlIGVtYWlsIHNlbnQgdG8gdGhlIHVzZXIuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogY29uc3QgYWN0aW9uQ29kZVNldHRpbmdzID0ge1xyXG4gKiAgIHVybDogJ2h0dHBzOi8vd3d3LmV4YW1wbGUuY29tLz9lbWFpbD11c2VyQGV4YW1wbGUuY29tJyxcclxuICogICBpT1M6IHtcclxuICogICAgICBidW5kbGVJZDogJ2NvbS5leGFtcGxlLmlvcydcclxuICogICB9LFxyXG4gKiAgIGFuZHJvaWQ6IHtcclxuICogICAgIHBhY2thZ2VOYW1lOiAnY29tLmV4YW1wbGUuYW5kcm9pZCcsXHJcbiAqICAgICBpbnN0YWxsQXBwOiB0cnVlLFxyXG4gKiAgICAgbWluaW11bVZlcnNpb246ICcxMidcclxuICogICB9LFxyXG4gKiAgIGhhbmRsZUNvZGVJbkFwcDogdHJ1ZVxyXG4gKiB9O1xyXG4gKiBhd2FpdCBzZW5kU2lnbkluTGlua1RvRW1haWwoYXV0aCwgJ3VzZXJAZXhhbXBsZS5jb20nLCBhY3Rpb25Db2RlU2V0dGluZ3MpO1xyXG4gKiAvLyBPYnRhaW4gZW1haWxMaW5rIGZyb20gdGhlIHVzZXIuXHJcbiAqIGlmKGlzU2lnbkluV2l0aEVtYWlsTGluayhhdXRoLCBlbWFpbExpbmspKSB7XHJcbiAqICAgYXdhaXQgc2lnbkluV2l0aEVtYWlsTGluayhhdXRoLCAndXNlckBleGFtcGxlLmNvbScsIGVtYWlsTGluayk7XHJcbiAqIH1cclxuICogYGBgXHJcbiAqXHJcbiAqIEBwYXJhbSBhdXRoSW50ZXJuYWwgLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxyXG4gKiBAcGFyYW0gZW1haWwgLSBUaGUgdXNlcidzIGVtYWlsIGFkZHJlc3MuXHJcbiAqIEBwYXJhbSBhY3Rpb25Db2RlU2V0dGluZ3MgLSBUaGUge0BsaW5rIEFjdGlvbkNvZGVTZXR0aW5nc30uXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHNlbmRTaWduSW5MaW5rVG9FbWFpbChhdXRoLCBlbWFpbCwgYWN0aW9uQ29kZVNldHRpbmdzKSB7XHJcbiAgICBjb25zdCBhdXRoTW9kdWxhciA9IGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKTtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSB7XHJcbiAgICAgICAgcmVxdWVzdFR5cGU6IFwiRU1BSUxfU0lHTklOXCIgLyogRU1BSUxfU0lHTklOICovLFxyXG4gICAgICAgIGVtYWlsXHJcbiAgICB9O1xyXG4gICAgX2Fzc2VydChhY3Rpb25Db2RlU2V0dGluZ3MuaGFuZGxlQ29kZUluQXBwLCBhdXRoTW9kdWxhciwgXCJhcmd1bWVudC1lcnJvclwiIC8qIEFSR1VNRU5UX0VSUk9SICovKTtcclxuICAgIGlmIChhY3Rpb25Db2RlU2V0dGluZ3MpIHtcclxuICAgICAgICBfc2V0QWN0aW9uQ29kZVNldHRpbmdzT25SZXF1ZXN0KGF1dGhNb2R1bGFyLCByZXF1ZXN0LCBhY3Rpb25Db2RlU2V0dGluZ3MpO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgc2VuZFNpZ25JbkxpbmtUb0VtYWlsJDEoYXV0aE1vZHVsYXIsIHJlcXVlc3QpO1xyXG59XHJcbi8qKlxyXG4gKiBDaGVja3MgaWYgYW4gaW5jb21pbmcgbGluayBpcyBhIHNpZ24taW4gd2l0aCBlbWFpbCBsaW5rIHN1aXRhYmxlIGZvciB7QGxpbmsgc2lnbkluV2l0aEVtYWlsTGlua30uXHJcbiAqXHJcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cclxuICogQHBhcmFtIGVtYWlsTGluayAtIFRoZSBsaW5rIHNlbnQgdG8gdGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiBpc1NpZ25JbldpdGhFbWFpbExpbmsoYXV0aCwgZW1haWxMaW5rKSB7XHJcbiAgICBjb25zdCBhY3Rpb25Db2RlVXJsID0gQWN0aW9uQ29kZVVSTC5wYXJzZUxpbmsoZW1haWxMaW5rKTtcclxuICAgIHJldHVybiAoYWN0aW9uQ29kZVVybCA9PT0gbnVsbCB8fCBhY3Rpb25Db2RlVXJsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhY3Rpb25Db2RlVXJsLm9wZXJhdGlvbikgPT09IFwiRU1BSUxfU0lHTklOXCIgLyogRU1BSUxfU0lHTklOICovO1xyXG59XHJcbi8qKlxyXG4gKiBBc3luY2hyb25vdXNseSBzaWducyBpbiB1c2luZyBhbiBlbWFpbCBhbmQgc2lnbi1pbiBlbWFpbCBsaW5rLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBJZiBubyBsaW5rIGlzIHBhc3NlZCwgdGhlIGxpbmsgaXMgaW5mZXJyZWQgZnJvbSB0aGUgY3VycmVudCBVUkwuXHJcbiAqXHJcbiAqIEZhaWxzIHdpdGggYW4gZXJyb3IgaWYgdGhlIGVtYWlsIGFkZHJlc3MgaXMgaW52YWxpZCBvciBPVFAgaW4gZW1haWwgbGluayBleHBpcmVzLlxyXG4gKlxyXG4gKiBOb3RlOiBDb25maXJtIHRoZSBsaW5rIGlzIGEgc2lnbi1pbiBlbWFpbCBsaW5rIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kIGZpcmViYXNlLmF1dGguQXV0aC5pc1NpZ25JbldpdGhFbWFpbExpbmsuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogY29uc3QgYWN0aW9uQ29kZVNldHRpbmdzID0ge1xyXG4gKiAgIHVybDogJ2h0dHBzOi8vd3d3LmV4YW1wbGUuY29tLz9lbWFpbD11c2VyQGV4YW1wbGUuY29tJyxcclxuICogICBpT1M6IHtcclxuICogICAgICBidW5kbGVJZDogJ2NvbS5leGFtcGxlLmlvcydcclxuICogICB9LFxyXG4gKiAgIGFuZHJvaWQ6IHtcclxuICogICAgIHBhY2thZ2VOYW1lOiAnY29tLmV4YW1wbGUuYW5kcm9pZCcsXHJcbiAqICAgICBpbnN0YWxsQXBwOiB0cnVlLFxyXG4gKiAgICAgbWluaW11bVZlcnNpb246ICcxMidcclxuICogICB9LFxyXG4gKiAgIGhhbmRsZUNvZGVJbkFwcDogdHJ1ZVxyXG4gKiB9O1xyXG4gKiBhd2FpdCBzZW5kU2lnbkluTGlua1RvRW1haWwoYXV0aCwgJ3VzZXJAZXhhbXBsZS5jb20nLCBhY3Rpb25Db2RlU2V0dGluZ3MpO1xyXG4gKiAvLyBPYnRhaW4gZW1haWxMaW5rIGZyb20gdGhlIHVzZXIuXHJcbiAqIGlmKGlzU2lnbkluV2l0aEVtYWlsTGluayhhdXRoLCBlbWFpbExpbmspKSB7XHJcbiAqICAgYXdhaXQgc2lnbkluV2l0aEVtYWlsTGluayhhdXRoLCAndXNlckBleGFtcGxlLmNvbScsIGVtYWlsTGluayk7XHJcbiAqIH1cclxuICogYGBgXHJcbiAqXHJcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cclxuICogQHBhcmFtIGVtYWlsIC0gVGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzLlxyXG4gKiBAcGFyYW0gZW1haWxMaW5rIC0gVGhlIGxpbmsgc2VudCB0byB0aGUgdXNlcidzIGVtYWlsIGFkZHJlc3MuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHNpZ25JbldpdGhFbWFpbExpbmsoYXV0aCwgZW1haWwsIGVtYWlsTGluaykge1xyXG4gICAgY29uc3QgYXV0aE1vZHVsYXIgPSBnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCk7XHJcbiAgICBjb25zdCBjcmVkZW50aWFsID0gRW1haWxBdXRoUHJvdmlkZXIuY3JlZGVudGlhbFdpdGhMaW5rKGVtYWlsLCBlbWFpbExpbmsgfHwgX2dldEN1cnJlbnRVcmwoKSk7XHJcbiAgICAvLyBDaGVjayBpZiB0aGUgdGVuYW50IElEIGluIHRoZSBlbWFpbCBsaW5rIG1hdGNoZXMgdGhlIHRlbmFudCBJRCBvbiBBdXRoXHJcbiAgICAvLyBpbnN0YW5jZS5cclxuICAgIF9hc3NlcnQoY3JlZGVudGlhbC5fdGVuYW50SWQgPT09IChhdXRoTW9kdWxhci50ZW5hbnRJZCB8fCBudWxsKSwgYXV0aE1vZHVsYXIsIFwidGVuYW50LWlkLW1pc21hdGNoXCIgLyogVEVOQU5UX0lEX01JU01BVENIICovKTtcclxuICAgIHJldHVybiBzaWduSW5XaXRoQ3JlZGVudGlhbChhdXRoTW9kdWxhciwgY3JlZGVudGlhbCk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXV0aFVyaShhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0KGF1dGgsIFwiUE9TVFwiIC8qIFBPU1QgKi8sIFwiL3YxL2FjY291bnRzOmNyZWF0ZUF1dGhVcmlcIiAvKiBDUkVBVEVfQVVUSF9VUkkgKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIEdldHMgdGhlIGxpc3Qgb2YgcG9zc2libGUgc2lnbiBpbiBtZXRob2RzIGZvciB0aGUgZ2l2ZW4gZW1haWwgYWRkcmVzcy5cclxuICpcclxuICogQHJlbWFya3NcclxuICogVGhpcyBpcyB1c2VmdWwgdG8gZGlmZmVyZW50aWF0ZSBtZXRob2RzIG9mIHNpZ24taW4gZm9yIHRoZSBzYW1lIHByb3ZpZGVyLCBlZy5cclxuICoge0BsaW5rIEVtYWlsQXV0aFByb3ZpZGVyfSB3aGljaCBoYXMgMiBtZXRob2RzIG9mIHNpZ24taW4sXHJcbiAqIHtAbGluayBTaWduSW5NZXRob2R9LkVNQUlMX1BBU1NXT1JEIGFuZFxyXG4gKiB7QGxpbmsgU2lnbkluTWV0aG9kfS5FTUFJTF9MSU5LLlxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSBlbWFpbCAtIFRoZSB1c2VyJ3MgZW1haWwgYWRkcmVzcy5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hTaWduSW5NZXRob2RzRm9yRW1haWwoYXV0aCwgZW1haWwpIHtcclxuICAgIC8vIGNyZWF0ZUF1dGhVcmkgcmV0dXJucyBhbiBlcnJvciBpZiBjb250aW51ZSBVUkkgaXMgbm90IGh0dHAgb3IgaHR0cHMuXHJcbiAgICAvLyBGb3IgZW52aXJvbm1lbnRzIGxpa2UgQ29yZG92YSwgQ2hyb21lIGV4dGVuc2lvbnMsIG5hdGl2ZSBmcmFtZXdvcmtzLCBmaWxlXHJcbiAgICAvLyBzeXN0ZW1zLCBldGMsIHVzZSBodHRwOi8vbG9jYWxob3N0IGFzIGNvbnRpbnVlIFVSTC5cclxuICAgIGNvbnN0IGNvbnRpbnVlVXJpID0gX2lzSHR0cE9ySHR0cHMoKSA/IF9nZXRDdXJyZW50VXJsKCkgOiAnaHR0cDovL2xvY2FsaG9zdCc7XHJcbiAgICBjb25zdCByZXF1ZXN0ID0ge1xyXG4gICAgICAgIGlkZW50aWZpZXI6IGVtYWlsLFxyXG4gICAgICAgIGNvbnRpbnVlVXJpXHJcbiAgICB9O1xyXG4gICAgY29uc3QgeyBzaWduaW5NZXRob2RzIH0gPSBhd2FpdCBjcmVhdGVBdXRoVXJpKGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKSwgcmVxdWVzdCk7XHJcbiAgICByZXR1cm4gc2lnbmluTWV0aG9kcyB8fCBbXTtcclxufVxyXG4vKipcclxuICogU2VuZHMgYSB2ZXJpZmljYXRpb24gZW1haWwgdG8gYSB1c2VyLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBUaGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgaXMgY29tcGxldGVkIGJ5IGNhbGxpbmcge0BsaW5rIGFwcGx5QWN0aW9uQ29kZX0uXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogY29uc3QgYWN0aW9uQ29kZVNldHRpbmdzID0ge1xyXG4gKiAgIHVybDogJ2h0dHBzOi8vd3d3LmV4YW1wbGUuY29tLz9lbWFpbD11c2VyQGV4YW1wbGUuY29tJyxcclxuICogICBpT1M6IHtcclxuICogICAgICBidW5kbGVJZDogJ2NvbS5leGFtcGxlLmlvcydcclxuICogICB9LFxyXG4gKiAgIGFuZHJvaWQ6IHtcclxuICogICAgIHBhY2thZ2VOYW1lOiAnY29tLmV4YW1wbGUuYW5kcm9pZCcsXHJcbiAqICAgICBpbnN0YWxsQXBwOiB0cnVlLFxyXG4gKiAgICAgbWluaW11bVZlcnNpb246ICcxMidcclxuICogICB9LFxyXG4gKiAgIGhhbmRsZUNvZGVJbkFwcDogdHJ1ZVxyXG4gKiB9O1xyXG4gKiBhd2FpdCBzZW5kRW1haWxWZXJpZmljYXRpb24odXNlciwgYWN0aW9uQ29kZVNldHRpbmdzKTtcclxuICogLy8gT2J0YWluIGNvZGUgZnJvbSB0aGUgdXNlci5cclxuICogYXdhaXQgYXBwbHlBY3Rpb25Db2RlKGF1dGgsIGNvZGUpO1xyXG4gKiBgYGBcclxuICpcclxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cclxuICogQHBhcmFtIGFjdGlvbkNvZGVTZXR0aW5ncyAtIFRoZSB7QGxpbmsgQWN0aW9uQ29kZVNldHRpbmdzfS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gc2VuZEVtYWlsVmVyaWZpY2F0aW9uKHVzZXIsIGFjdGlvbkNvZGVTZXR0aW5ncykge1xyXG4gICAgY29uc3QgdXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpO1xyXG4gICAgY29uc3QgaWRUb2tlbiA9IGF3YWl0IHVzZXIuZ2V0SWRUb2tlbigpO1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IHtcclxuICAgICAgICByZXF1ZXN0VHlwZTogXCJWRVJJRllfRU1BSUxcIiAvKiBWRVJJRllfRU1BSUwgKi8sXHJcbiAgICAgICAgaWRUb2tlblxyXG4gICAgfTtcclxuICAgIGlmIChhY3Rpb25Db2RlU2V0dGluZ3MpIHtcclxuICAgICAgICBfc2V0QWN0aW9uQ29kZVNldHRpbmdzT25SZXF1ZXN0KHVzZXJJbnRlcm5hbC5hdXRoLCByZXF1ZXN0LCBhY3Rpb25Db2RlU2V0dGluZ3MpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgeyBlbWFpbCB9ID0gYXdhaXQgc2VuZEVtYWlsVmVyaWZpY2F0aW9uJDEodXNlckludGVybmFsLmF1dGgsIHJlcXVlc3QpO1xyXG4gICAgaWYgKGVtYWlsICE9PSB1c2VyLmVtYWlsKSB7XHJcbiAgICAgICAgYXdhaXQgdXNlci5yZWxvYWQoKTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogU2VuZHMgYSB2ZXJpZmljYXRpb24gZW1haWwgdG8gYSBuZXcgZW1haWwgYWRkcmVzcy5cclxuICpcclxuICogQHJlbWFya3NcclxuICogVGhlIHVzZXIncyBlbWFpbCB3aWxsIGJlIHVwZGF0ZWQgdG8gdGhlIG5ldyBvbmUgYWZ0ZXIgYmVpbmcgdmVyaWZpZWQuXHJcbiAqXHJcbiAqIElmIHlvdSBoYXZlIGEgY3VzdG9tIGVtYWlsIGFjdGlvbiBoYW5kbGVyLCB5b3UgY2FuIGNvbXBsZXRlIHRoZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBieSBjYWxsaW5nXHJcbiAqIHtAbGluayBhcHBseUFjdGlvbkNvZGV9LlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIGNvbnN0IGFjdGlvbkNvZGVTZXR0aW5ncyA9IHtcclxuICogICB1cmw6ICdodHRwczovL3d3dy5leGFtcGxlLmNvbS8/ZW1haWw9dXNlckBleGFtcGxlLmNvbScsXHJcbiAqICAgaU9TOiB7XHJcbiAqICAgICAgYnVuZGxlSWQ6ICdjb20uZXhhbXBsZS5pb3MnXHJcbiAqICAgfSxcclxuICogICBhbmRyb2lkOiB7XHJcbiAqICAgICBwYWNrYWdlTmFtZTogJ2NvbS5leGFtcGxlLmFuZHJvaWQnLFxyXG4gKiAgICAgaW5zdGFsbEFwcDogdHJ1ZSxcclxuICogICAgIG1pbmltdW1WZXJzaW9uOiAnMTInXHJcbiAqICAgfSxcclxuICogICBoYW5kbGVDb2RlSW5BcHA6IHRydWVcclxuICogfTtcclxuICogYXdhaXQgdmVyaWZ5QmVmb3JlVXBkYXRlRW1haWwodXNlciwgJ25ld2VtYWlsQGV4YW1wbGUuY29tJywgYWN0aW9uQ29kZVNldHRpbmdzKTtcclxuICogLy8gT2J0YWluIGNvZGUgZnJvbSB0aGUgdXNlci5cclxuICogYXdhaXQgYXBwbHlBY3Rpb25Db2RlKGF1dGgsIGNvZGUpO1xyXG4gKiBgYGBcclxuICpcclxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cclxuICogQHBhcmFtIG5ld0VtYWlsIC0gVGhlIG5ldyBlbWFpbCBhZGRyZXNzIHRvIGJlIHZlcmlmaWVkIGJlZm9yZSB1cGRhdGUuXHJcbiAqIEBwYXJhbSBhY3Rpb25Db2RlU2V0dGluZ3MgLSBUaGUge0BsaW5rIEFjdGlvbkNvZGVTZXR0aW5nc30uXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeUJlZm9yZVVwZGF0ZUVtYWlsKHVzZXIsIG5ld0VtYWlsLCBhY3Rpb25Db2RlU2V0dGluZ3MpIHtcclxuICAgIGNvbnN0IHVzZXJJbnRlcm5hbCA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKTtcclxuICAgIGNvbnN0IGlkVG9rZW4gPSBhd2FpdCB1c2VyLmdldElkVG9rZW4oKTtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSB7XHJcbiAgICAgICAgcmVxdWVzdFR5cGU6IFwiVkVSSUZZX0FORF9DSEFOR0VfRU1BSUxcIiAvKiBWRVJJRllfQU5EX0NIQU5HRV9FTUFJTCAqLyxcclxuICAgICAgICBpZFRva2VuLFxyXG4gICAgICAgIG5ld0VtYWlsXHJcbiAgICB9O1xyXG4gICAgaWYgKGFjdGlvbkNvZGVTZXR0aW5ncykge1xyXG4gICAgICAgIF9zZXRBY3Rpb25Db2RlU2V0dGluZ3NPblJlcXVlc3QodXNlckludGVybmFsLmF1dGgsIHJlcXVlc3QsIGFjdGlvbkNvZGVTZXR0aW5ncyk7XHJcbiAgICB9XHJcbiAgICBjb25zdCB7IGVtYWlsIH0gPSBhd2FpdCB2ZXJpZnlBbmRDaGFuZ2VFbWFpbCh1c2VySW50ZXJuYWwuYXV0aCwgcmVxdWVzdCk7XHJcbiAgICBpZiAoZW1haWwgIT09IHVzZXIuZW1haWwpIHtcclxuICAgICAgICAvLyBJZiB0aGUgbG9jYWwgY29weSBvZiB0aGUgZW1haWwgb24gdXNlciBpcyBvdXRkYXRlZCwgcmVsb2FkIHRoZVxyXG4gICAgICAgIC8vIHVzZXIuXHJcbiAgICAgICAgYXdhaXQgdXNlci5yZWxvYWQoKTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcm9maWxlJDEoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdChhdXRoLCBcIlBPU1RcIiAvKiBQT1NUICovLCBcIi92MS9hY2NvdW50czp1cGRhdGVcIiAvKiBTRVRfQUNDT1VOVF9JTkZPICovLCByZXF1ZXN0KTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogVXBkYXRlcyBhIHVzZXIncyBwcm9maWxlIGRhdGEuXHJcbiAqXHJcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXHJcbiAqIEBwYXJhbSBwcm9maWxlIC0gVGhlIHByb2ZpbGUncyBgZGlzcGxheU5hbWVgIGFuZCBgcGhvdG9VUkxgIHRvIHVwZGF0ZS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlUHJvZmlsZSh1c2VyLCB7IGRpc3BsYXlOYW1lLCBwaG90b1VSTDogcGhvdG9VcmwgfSkge1xyXG4gICAgaWYgKGRpc3BsYXlOYW1lID09PSB1bmRlZmluZWQgJiYgcGhvdG9VcmwgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHVzZXJJbnRlcm5hbCA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKTtcclxuICAgIGNvbnN0IGlkVG9rZW4gPSBhd2FpdCB1c2VySW50ZXJuYWwuZ2V0SWRUb2tlbigpO1xyXG4gICAgY29uc3QgcHJvZmlsZVJlcXVlc3QgPSB7XHJcbiAgICAgICAgaWRUb2tlbixcclxuICAgICAgICBkaXNwbGF5TmFtZSxcclxuICAgICAgICBwaG90b1VybCxcclxuICAgICAgICByZXR1cm5TZWN1cmVUb2tlbjogdHJ1ZVxyXG4gICAgfTtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgX2xvZ291dElmSW52YWxpZGF0ZWQodXNlckludGVybmFsLCB1cGRhdGVQcm9maWxlJDEodXNlckludGVybmFsLmF1dGgsIHByb2ZpbGVSZXF1ZXN0KSk7XHJcbiAgICB1c2VySW50ZXJuYWwuZGlzcGxheU5hbWUgPSByZXNwb25zZS5kaXNwbGF5TmFtZSB8fCBudWxsO1xyXG4gICAgdXNlckludGVybmFsLnBob3RvVVJMID0gcmVzcG9uc2UucGhvdG9VcmwgfHwgbnVsbDtcclxuICAgIC8vIFVwZGF0ZSB0aGUgcGFzc3dvcmQgcHJvdmlkZXIgYXMgd2VsbFxyXG4gICAgY29uc3QgcGFzc3dvcmRQcm92aWRlciA9IHVzZXJJbnRlcm5hbC5wcm92aWRlckRhdGEuZmluZCgoeyBwcm92aWRlcklkIH0pID0+IHByb3ZpZGVySWQgPT09IFwicGFzc3dvcmRcIiAvKiBQQVNTV09SRCAqLyk7XHJcbiAgICBpZiAocGFzc3dvcmRQcm92aWRlcikge1xyXG4gICAgICAgIHBhc3N3b3JkUHJvdmlkZXIuZGlzcGxheU5hbWUgPSB1c2VySW50ZXJuYWwuZGlzcGxheU5hbWU7XHJcbiAgICAgICAgcGFzc3dvcmRQcm92aWRlci5waG90b1VSTCA9IHVzZXJJbnRlcm5hbC5waG90b1VSTDtcclxuICAgIH1cclxuICAgIGF3YWl0IHVzZXJJbnRlcm5hbC5fdXBkYXRlVG9rZW5zSWZOZWNlc3NhcnkocmVzcG9uc2UpO1xyXG59XHJcbi8qKlxyXG4gKiBVcGRhdGVzIHRoZSB1c2VyJ3MgZW1haWwgYWRkcmVzcy5cclxuICpcclxuICogQHJlbWFya3NcclxuICogQW4gZW1haWwgd2lsbCBiZSBzZW50IHRvIHRoZSBvcmlnaW5hbCBlbWFpbCBhZGRyZXNzIChpZiBpdCB3YXMgc2V0KSB0aGF0IGFsbG93cyB0byByZXZva2UgdGhlXHJcbiAqIGVtYWlsIGFkZHJlc3MgY2hhbmdlLCBpbiBvcmRlciB0byBwcm90ZWN0IHRoZW0gZnJvbSBhY2NvdW50IGhpamFja2luZy5cclxuICpcclxuICogSW1wb3J0YW50OiB0aGlzIGlzIGEgc2VjdXJpdHkgc2Vuc2l0aXZlIG9wZXJhdGlvbiB0aGF0IHJlcXVpcmVzIHRoZSB1c2VyIHRvIGhhdmUgcmVjZW50bHkgc2lnbmVkXHJcbiAqIGluLiBJZiB0aGlzIHJlcXVpcmVtZW50IGlzbid0IG1ldCwgYXNrIHRoZSB1c2VyIHRvIGF1dGhlbnRpY2F0ZSBhZ2FpbiBhbmQgdGhlbiBjYWxsXHJcbiAqIHtAbGluayByZWF1dGhlbnRpY2F0ZVdpdGhDcmVkZW50aWFsfS5cclxuICpcclxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cclxuICogQHBhcmFtIG5ld0VtYWlsIC0gVGhlIG5ldyBlbWFpbCBhZGRyZXNzLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiB1cGRhdGVFbWFpbCh1c2VyLCBuZXdFbWFpbCkge1xyXG4gICAgcmV0dXJuIHVwZGF0ZUVtYWlsT3JQYXNzd29yZChnZXRNb2R1bGFySW5zdGFuY2UodXNlciksIG5ld0VtYWlsLCBudWxsKTtcclxufVxyXG4vKipcclxuICogVXBkYXRlcyB0aGUgdXNlcidzIHBhc3N3b3JkLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBJbXBvcnRhbnQ6IHRoaXMgaXMgYSBzZWN1cml0eSBzZW5zaXRpdmUgb3BlcmF0aW9uIHRoYXQgcmVxdWlyZXMgdGhlIHVzZXIgdG8gaGF2ZSByZWNlbnRseSBzaWduZWRcclxuICogaW4uIElmIHRoaXMgcmVxdWlyZW1lbnQgaXNuJ3QgbWV0LCBhc2sgdGhlIHVzZXIgdG8gYXV0aGVudGljYXRlIGFnYWluIGFuZCB0aGVuIGNhbGxcclxuICoge0BsaW5rIHJlYXV0aGVudGljYXRlV2l0aENyZWRlbnRpYWx9LlxyXG4gKlxyXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxyXG4gKiBAcGFyYW0gbmV3UGFzc3dvcmQgLSBUaGUgbmV3IHBhc3N3b3JkLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiB1cGRhdGVQYXNzd29yZCh1c2VyLCBuZXdQYXNzd29yZCkge1xyXG4gICAgcmV0dXJuIHVwZGF0ZUVtYWlsT3JQYXNzd29yZChnZXRNb2R1bGFySW5zdGFuY2UodXNlciksIG51bGwsIG5ld1Bhc3N3b3JkKTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVFbWFpbE9yUGFzc3dvcmQodXNlciwgZW1haWwsIHBhc3N3b3JkKSB7XHJcbiAgICBjb25zdCB7IGF1dGggfSA9IHVzZXI7XHJcbiAgICBjb25zdCBpZFRva2VuID0gYXdhaXQgdXNlci5nZXRJZFRva2VuKCk7XHJcbiAgICBjb25zdCByZXF1ZXN0ID0ge1xyXG4gICAgICAgIGlkVG9rZW4sXHJcbiAgICAgICAgcmV0dXJuU2VjdXJlVG9rZW46IHRydWVcclxuICAgIH07XHJcbiAgICBpZiAoZW1haWwpIHtcclxuICAgICAgICByZXF1ZXN0LmVtYWlsID0gZW1haWw7XHJcbiAgICB9XHJcbiAgICBpZiAocGFzc3dvcmQpIHtcclxuICAgICAgICByZXF1ZXN0LnBhc3N3b3JkID0gcGFzc3dvcmQ7XHJcbiAgICB9XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9sb2dvdXRJZkludmFsaWRhdGVkKHVzZXIsIHVwZGF0ZUVtYWlsUGFzc3dvcmQoYXV0aCwgcmVxdWVzdCkpO1xyXG4gICAgYXdhaXQgdXNlci5fdXBkYXRlVG9rZW5zSWZOZWNlc3NhcnkocmVzcG9uc2UsIC8qIHJlbG9hZCAqLyB0cnVlKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogUGFyc2UgdGhlIGBBZGRpdGlvbmFsVXNlckluZm9gIGZyb20gdGhlIElEIHRva2VuIHJlc3BvbnNlLlxyXG4gKlxyXG4gKi9cclxuZnVuY3Rpb24gX2Zyb21JZFRva2VuUmVzcG9uc2UoaWRUb2tlblJlc3BvbnNlKSB7XHJcbiAgICB2YXIgX2EsIF9iO1xyXG4gICAgaWYgKCFpZFRva2VuUmVzcG9uc2UpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IHsgcHJvdmlkZXJJZCB9ID0gaWRUb2tlblJlc3BvbnNlO1xyXG4gICAgY29uc3QgcHJvZmlsZSA9IGlkVG9rZW5SZXNwb25zZS5yYXdVc2VySW5mb1xyXG4gICAgICAgID8gSlNPTi5wYXJzZShpZFRva2VuUmVzcG9uc2UucmF3VXNlckluZm8pXHJcbiAgICAgICAgOiB7fTtcclxuICAgIGNvbnN0IGlzTmV3VXNlciA9IGlkVG9rZW5SZXNwb25zZS5pc05ld1VzZXIgfHxcclxuICAgICAgICBpZFRva2VuUmVzcG9uc2Uua2luZCA9PT0gXCJpZGVudGl0eXRvb2xraXQjU2lnbnVwTmV3VXNlclJlc3BvbnNlXCIgLyogU2lnbnVwTmV3VXNlciAqLztcclxuICAgIGlmICghcHJvdmlkZXJJZCAmJiAoaWRUb2tlblJlc3BvbnNlID09PSBudWxsIHx8IGlkVG9rZW5SZXNwb25zZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogaWRUb2tlblJlc3BvbnNlLmlkVG9rZW4pKSB7XHJcbiAgICAgICAgY29uc3Qgc2lnbkluUHJvdmlkZXIgPSAoX2IgPSAoX2EgPSBfcGFyc2VUb2tlbihpZFRva2VuUmVzcG9uc2UuaWRUb2tlbikpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5maXJlYmFzZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iWydzaWduX2luX3Byb3ZpZGVyJ107XHJcbiAgICAgICAgaWYgKHNpZ25JblByb3ZpZGVyKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkUHJvdmlkZXJJZCA9IHNpZ25JblByb3ZpZGVyICE9PSBcImFub255bW91c1wiIC8qIEFOT05ZTU9VUyAqLyAmJlxyXG4gICAgICAgICAgICAgICAgc2lnbkluUHJvdmlkZXIgIT09IFwiY3VzdG9tXCIgLyogQ1VTVE9NICovXHJcbiAgICAgICAgICAgICAgICA/IHNpZ25JblByb3ZpZGVyXHJcbiAgICAgICAgICAgICAgICA6IG51bGw7XHJcbiAgICAgICAgICAgIC8vIFVzZXMgZ2VuZXJpYyBjbGFzcyBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIGxlZ2FjeSBTREsuXHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgR2VuZXJpY0FkZGl0aW9uYWxVc2VySW5mbyhpc05ld1VzZXIsIGZpbHRlcmVkUHJvdmlkZXJJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKCFwcm92aWRlcklkKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBzd2l0Y2ggKHByb3ZpZGVySWQpIHtcclxuICAgICAgICBjYXNlIFwiZmFjZWJvb2suY29tXCIgLyogRkFDRUJPT0sgKi86XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgRmFjZWJvb2tBZGRpdGlvbmFsVXNlckluZm8oaXNOZXdVc2VyLCBwcm9maWxlKTtcclxuICAgICAgICBjYXNlIFwiZ2l0aHViLmNvbVwiIC8qIEdJVEhVQiAqLzpcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBHaXRodWJBZGRpdGlvbmFsVXNlckluZm8oaXNOZXdVc2VyLCBwcm9maWxlKTtcclxuICAgICAgICBjYXNlIFwiZ29vZ2xlLmNvbVwiIC8qIEdPT0dMRSAqLzpcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBHb29nbGVBZGRpdGlvbmFsVXNlckluZm8oaXNOZXdVc2VyLCBwcm9maWxlKTtcclxuICAgICAgICBjYXNlIFwidHdpdHRlci5jb21cIiAvKiBUV0lUVEVSICovOlxyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFR3aXR0ZXJBZGRpdGlvbmFsVXNlckluZm8oaXNOZXdVc2VyLCBwcm9maWxlLCBpZFRva2VuUmVzcG9uc2Uuc2NyZWVuTmFtZSB8fCBudWxsKTtcclxuICAgICAgICBjYXNlIFwiY3VzdG9tXCIgLyogQ1VTVE9NICovOlxyXG4gICAgICAgIGNhc2UgXCJhbm9ueW1vdXNcIiAvKiBBTk9OWU1PVVMgKi86XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgR2VuZXJpY0FkZGl0aW9uYWxVc2VySW5mbyhpc05ld1VzZXIsIG51bGwpO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgR2VuZXJpY0FkZGl0aW9uYWxVc2VySW5mbyhpc05ld1VzZXIsIHByb3ZpZGVySWQsIHByb2ZpbGUpO1xyXG4gICAgfVxyXG59XHJcbmNsYXNzIEdlbmVyaWNBZGRpdGlvbmFsVXNlckluZm8ge1xyXG4gICAgY29uc3RydWN0b3IoaXNOZXdVc2VyLCBwcm92aWRlcklkLCBwcm9maWxlID0ge30pIHtcclxuICAgICAgICB0aGlzLmlzTmV3VXNlciA9IGlzTmV3VXNlcjtcclxuICAgICAgICB0aGlzLnByb3ZpZGVySWQgPSBwcm92aWRlcklkO1xyXG4gICAgICAgIHRoaXMucHJvZmlsZSA9IHByb2ZpbGU7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgRmVkZXJhdGVkQWRkaXRpb25hbFVzZXJJbmZvV2l0aFVzZXJuYW1lIGV4dGVuZHMgR2VuZXJpY0FkZGl0aW9uYWxVc2VySW5mbyB7XHJcbiAgICBjb25zdHJ1Y3Rvcihpc05ld1VzZXIsIHByb3ZpZGVySWQsIHByb2ZpbGUsIHVzZXJuYW1lKSB7XHJcbiAgICAgICAgc3VwZXIoaXNOZXdVc2VyLCBwcm92aWRlcklkLCBwcm9maWxlKTtcclxuICAgICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgRmFjZWJvb2tBZGRpdGlvbmFsVXNlckluZm8gZXh0ZW5kcyBHZW5lcmljQWRkaXRpb25hbFVzZXJJbmZvIHtcclxuICAgIGNvbnN0cnVjdG9yKGlzTmV3VXNlciwgcHJvZmlsZSkge1xyXG4gICAgICAgIHN1cGVyKGlzTmV3VXNlciwgXCJmYWNlYm9vay5jb21cIiAvKiBGQUNFQk9PSyAqLywgcHJvZmlsZSk7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgR2l0aHViQWRkaXRpb25hbFVzZXJJbmZvIGV4dGVuZHMgRmVkZXJhdGVkQWRkaXRpb25hbFVzZXJJbmZvV2l0aFVzZXJuYW1lIHtcclxuICAgIGNvbnN0cnVjdG9yKGlzTmV3VXNlciwgcHJvZmlsZSkge1xyXG4gICAgICAgIHN1cGVyKGlzTmV3VXNlciwgXCJnaXRodWIuY29tXCIgLyogR0lUSFVCICovLCBwcm9maWxlLCB0eXBlb2YgKHByb2ZpbGUgPT09IG51bGwgfHwgcHJvZmlsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHJvZmlsZS5sb2dpbikgPT09ICdzdHJpbmcnID8gcHJvZmlsZSA9PT0gbnVsbCB8fCBwcm9maWxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwcm9maWxlLmxvZ2luIDogbnVsbCk7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgR29vZ2xlQWRkaXRpb25hbFVzZXJJbmZvIGV4dGVuZHMgR2VuZXJpY0FkZGl0aW9uYWxVc2VySW5mbyB7XHJcbiAgICBjb25zdHJ1Y3Rvcihpc05ld1VzZXIsIHByb2ZpbGUpIHtcclxuICAgICAgICBzdXBlcihpc05ld1VzZXIsIFwiZ29vZ2xlLmNvbVwiIC8qIEdPT0dMRSAqLywgcHJvZmlsZSk7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgVHdpdHRlckFkZGl0aW9uYWxVc2VySW5mbyBleHRlbmRzIEZlZGVyYXRlZEFkZGl0aW9uYWxVc2VySW5mb1dpdGhVc2VybmFtZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcihpc05ld1VzZXIsIHByb2ZpbGUsIHNjcmVlbk5hbWUpIHtcclxuICAgICAgICBzdXBlcihpc05ld1VzZXIsIFwidHdpdHRlci5jb21cIiAvKiBUV0lUVEVSICovLCBwcm9maWxlLCBzY3JlZW5OYW1lKTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogRXh0cmFjdHMgcHJvdmlkZXIgc3BlY2lmaWMge0BsaW5rIEFkZGl0aW9uYWxVc2VySW5mb30gZm9yIHRoZSBnaXZlbiBjcmVkZW50aWFsLlxyXG4gKlxyXG4gKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRBZGRpdGlvbmFsVXNlckluZm8odXNlckNyZWRlbnRpYWwpIHtcclxuICAgIGNvbnN0IHsgdXNlciwgX3Rva2VuUmVzcG9uc2UgfSA9IHVzZXJDcmVkZW50aWFsO1xyXG4gICAgaWYgKHVzZXIuaXNBbm9ueW1vdXMgJiYgIV90b2tlblJlc3BvbnNlKSB7XHJcbiAgICAgICAgLy8gSGFuZGxlIHRoZSBzcGVjaWFsIGNhc2Ugd2hlcmUgc2lnbkluQW5vbnltb3VzbHkoKSBnZXRzIGNhbGxlZCB0d2ljZS5cclxuICAgICAgICAvLyBObyBuZXR3b3JrIGNhbGwgaXMgbWFkZSBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gYWN0dWFsbHkgZmlsbCB0aGlzIGluXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcHJvdmlkZXJJZDogbnVsbCxcclxuICAgICAgICAgICAgaXNOZXdVc2VyOiBmYWxzZSxcclxuICAgICAgICAgICAgcHJvZmlsZTogbnVsbFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX2Zyb21JZFRva2VuUmVzcG9uc2UoX3Rva2VuUmVzcG9uc2UpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8vIE5vbi1vcHRpb25hbCBhdXRoIG1ldGhvZHMuXHJcbi8qKlxyXG4gKiBDaGFuZ2VzIHRoZSB0eXBlIG9mIHBlcnNpc3RlbmNlIG9uIHRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UgZm9yIHRoZSBjdXJyZW50bHkgc2F2ZWRcclxuICogYEF1dGhgIHNlc3Npb24gYW5kIGFwcGxpZXMgdGhpcyB0eXBlIG9mIHBlcnNpc3RlbmNlIGZvciBmdXR1cmUgc2lnbi1pbiByZXF1ZXN0cywgaW5jbHVkaW5nXHJcbiAqIHNpZ24taW4gd2l0aCByZWRpcmVjdCByZXF1ZXN0cy5cclxuICpcclxuICogQHJlbWFya3NcclxuICogVGhpcyBtYWtlcyBpdCBlYXN5IGZvciBhIHVzZXIgc2lnbmluZyBpbiB0byBzcGVjaWZ5IHdoZXRoZXIgdGhlaXIgc2Vzc2lvbiBzaG91bGQgYmVcclxuICogcmVtZW1iZXJlZCBvciBub3QuIEl0IGFsc28gbWFrZXMgaXQgZWFzaWVyIHRvIG5ldmVyIHBlcnNpc3QgdGhlIGBBdXRoYCBzdGF0ZSBmb3IgYXBwbGljYXRpb25zXHJcbiAqIHRoYXQgYXJlIHNoYXJlZCBieSBvdGhlciB1c2VycyBvciBoYXZlIHNlbnNpdGl2ZSBkYXRhLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHNldFBlcnNpc3RlbmNlKGF1dGgsIGJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2UpO1xyXG4gKiBgYGBcclxuICpcclxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxyXG4gKiBAcGFyYW0gcGVyc2lzdGVuY2UgLSBUaGUge0BsaW5rIFBlcnNpc3RlbmNlfSB0byB1c2UuXHJcbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgcGVyc2lzdGVuY2UgY2hhbmdlIGhhcyBjb21wbGV0ZWRcclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gc2V0UGVyc2lzdGVuY2UoYXV0aCwgcGVyc2lzdGVuY2UpIHtcclxuICAgIHJldHVybiBnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCkuc2V0UGVyc2lzdGVuY2UocGVyc2lzdGVuY2UpO1xyXG59XHJcbi8qKlxyXG4gKiBBZGRzIGFuIG9ic2VydmVyIGZvciBjaGFuZ2VzIHRvIHRoZSBzaWduZWQtaW4gdXNlcidzIElEIHRva2VuLCB3aGljaCBpbmNsdWRlcyBzaWduLWluLFxyXG4gKiBzaWduLW91dCwgYW5kIHRva2VuIHJlZnJlc2ggZXZlbnRzLlxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSBuZXh0T3JPYnNlcnZlciAtIGNhbGxiYWNrIHRyaWdnZXJlZCBvbiBjaGFuZ2UuXHJcbiAqIEBwYXJhbSBlcnJvciAtIGNhbGxiYWNrIHRyaWdnZXJlZCBvbiBlcnJvci5cclxuICogQHBhcmFtIGNvbXBsZXRlZCAtIGNhbGxiYWNrIHRyaWdnZXJlZCB3aGVuIG9ic2VydmVyIGlzIHJlbW92ZWQuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmZ1bmN0aW9uIG9uSWRUb2tlbkNoYW5nZWQoYXV0aCwgbmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZWQpIHtcclxuICAgIHJldHVybiBnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCkub25JZFRva2VuQ2hhbmdlZChuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlZCk7XHJcbn1cclxuLyoqXHJcbiAqIEFkZHMgYW4gb2JzZXJ2ZXIgZm9yIGNoYW5nZXMgdG8gdGhlIHVzZXIncyBzaWduLWluIHN0YXRlLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBUbyBrZWVwIHRoZSBvbGQgYmVoYXZpb3IsIHNlZSB7QGxpbmsgb25JZFRva2VuQ2hhbmdlZH0uXHJcbiAqXHJcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cclxuICogQHBhcmFtIG5leHRPck9ic2VydmVyIC0gY2FsbGJhY2sgdHJpZ2dlcmVkIG9uIGNoYW5nZS5cclxuICogQHBhcmFtIGVycm9yIC0gY2FsbGJhY2sgdHJpZ2dlcmVkIG9uIGVycm9yLlxyXG4gKiBAcGFyYW0gY29tcGxldGVkIC0gY2FsbGJhY2sgdHJpZ2dlcmVkIHdoZW4gb2JzZXJ2ZXIgaXMgcmVtb3ZlZC5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gb25BdXRoU3RhdGVDaGFuZ2VkKGF1dGgsIG5leHRPck9ic2VydmVyLCBlcnJvciwgY29tcGxldGVkKSB7XHJcbiAgICByZXR1cm4gZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpLm9uQXV0aFN0YXRlQ2hhbmdlZChuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlZCk7XHJcbn1cclxuLyoqXHJcbiAqIFNldHMgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UgdG8gdGhlIGRlZmF1bHQgZGV2aWNlL2Jyb3dzZXIgcHJlZmVyZW5jZS5cclxuICpcclxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiB1c2VEZXZpY2VMYW5ndWFnZShhdXRoKSB7XHJcbiAgICBnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCkudXNlRGV2aWNlTGFuZ3VhZ2UoKTtcclxufVxyXG4vKipcclxuICogQXN5bmNocm9ub3VzbHkgc2V0cyB0aGUgcHJvdmlkZWQgdXNlciBhcyB7QGxpbmsgQXV0aC5jdXJyZW50VXNlcn0gb24gdGhlXHJcbiAqIHtAbGluayBBdXRofSBpbnN0YW5jZS5cclxuICpcclxuICogQHJlbWFya3NcclxuICogQSBuZXcgaW5zdGFuY2UgY29weSBvZiB0aGUgdXNlciBwcm92aWRlZCB3aWxsIGJlIG1hZGUgYW5kIHNldCBhcyBjdXJyZW50VXNlci5cclxuICpcclxuICogVGhpcyB3aWxsIHRyaWdnZXIge0BsaW5rIG9uQXV0aFN0YXRlQ2hhbmdlZH0gYW5kIHtAbGluayBvbklkVG9rZW5DaGFuZ2VkfSBsaXN0ZW5lcnNcclxuICogbGlrZSBvdGhlciBzaWduIGluIG1ldGhvZHMuXHJcbiAqXHJcbiAqIFRoZSBvcGVyYXRpb24gZmFpbHMgd2l0aCBhbiBlcnJvciBpZiB0aGUgdXNlciB0byBiZSB1cGRhdGVkIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgRmlyZWJhc2VcclxuICogcHJvamVjdC5cclxuICpcclxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxyXG4gKiBAcGFyYW0gdXNlciAtIFRoZSBuZXcge0BsaW5rIFVzZXJ9LlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiB1cGRhdGVDdXJyZW50VXNlcihhdXRoLCB1c2VyKSB7XHJcbiAgICByZXR1cm4gZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpLnVwZGF0ZUN1cnJlbnRVc2VyKHVzZXIpO1xyXG59XHJcbi8qKlxyXG4gKiBTaWducyBvdXQgdGhlIGN1cnJlbnQgdXNlci5cclxuICpcclxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiBzaWduT3V0KGF1dGgpIHtcclxuICAgIHJldHVybiBnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCkuc2lnbk91dCgpO1xyXG59XHJcbi8qKlxyXG4gKiBEZWxldGVzIGFuZCBzaWducyBvdXQgdGhlIHVzZXIuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIEltcG9ydGFudDogdGhpcyBpcyBhIHNlY3VyaXR5LXNlbnNpdGl2ZSBvcGVyYXRpb24gdGhhdCByZXF1aXJlcyB0aGUgdXNlciB0byBoYXZlIHJlY2VudGx5XHJcbiAqIHNpZ25lZCBpbi4gSWYgdGhpcyByZXF1aXJlbWVudCBpc24ndCBtZXQsIGFzayB0aGUgdXNlciB0byBhdXRoZW50aWNhdGUgYWdhaW4gYW5kIHRoZW4gY2FsbFxyXG4gKiB7QGxpbmsgcmVhdXRoZW50aWNhdGVXaXRoQ3JlZGVudGlhbH0uXHJcbiAqXHJcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVVzZXIodXNlcikge1xyXG4gICAgcmV0dXJuIGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKS5kZWxldGUoKTtcclxufVxuXG5jbGFzcyBNdWx0aUZhY3RvclNlc3Npb25JbXBsIHtcclxuICAgIGNvbnN0cnVjdG9yKHR5cGUsIGNyZWRlbnRpYWwpIHtcclxuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xyXG4gICAgICAgIHRoaXMuY3JlZGVudGlhbCA9IGNyZWRlbnRpYWw7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgX2Zyb21JZHRva2VuKGlkVG9rZW4pIHtcclxuICAgICAgICByZXR1cm4gbmV3IE11bHRpRmFjdG9yU2Vzc2lvbkltcGwoXCJlbnJvbGxcIiAvKiBFTlJPTEwgKi8sIGlkVG9rZW4pO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIF9mcm9tTWZhUGVuZGluZ0NyZWRlbnRpYWwobWZhUGVuZGluZ0NyZWRlbnRpYWwpIHtcclxuICAgICAgICByZXR1cm4gbmV3IE11bHRpRmFjdG9yU2Vzc2lvbkltcGwoXCJzaWduaW5cIiAvKiBTSUdOX0lOICovLCBtZmFQZW5kaW5nQ3JlZGVudGlhbCk7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy50eXBlID09PSBcImVucm9sbFwiIC8qIEVOUk9MTCAqL1xyXG4gICAgICAgICAgICA/ICdpZFRva2VuJ1xyXG4gICAgICAgICAgICA6ICdwZW5kaW5nQ3JlZGVudGlhbCc7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbXVsdGlGYWN0b3JTZXNzaW9uOiB7XHJcbiAgICAgICAgICAgICAgICBba2V5XTogdGhpcy5jcmVkZW50aWFsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGZyb21KU09OKG9iaikge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9iai5tdWx0aUZhY3RvclNlc3Npb24pIHtcclxuICAgICAgICAgICAgaWYgKChfYSA9IG9iai5tdWx0aUZhY3RvclNlc3Npb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wZW5kaW5nQ3JlZGVudGlhbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE11bHRpRmFjdG9yU2Vzc2lvbkltcGwuX2Zyb21NZmFQZW5kaW5nQ3JlZGVudGlhbChvYmoubXVsdGlGYWN0b3JTZXNzaW9uLnBlbmRpbmdDcmVkZW50aWFsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICgoX2IgPSBvYmoubXVsdGlGYWN0b3JTZXNzaW9uKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWRUb2tlbikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE11bHRpRmFjdG9yU2Vzc2lvbkltcGwuX2Zyb21JZHRva2VuKG9iai5tdWx0aUZhY3RvclNlc3Npb24uaWRUb2tlbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgTXVsdGlGYWN0b3JSZXNvbHZlckltcGwge1xyXG4gICAgY29uc3RydWN0b3Ioc2Vzc2lvbiwgaGludHMsIHNpZ25JblJlc29sdmVyKSB7XHJcbiAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcclxuICAgICAgICB0aGlzLmhpbnRzID0gaGludHM7XHJcbiAgICAgICAgdGhpcy5zaWduSW5SZXNvbHZlciA9IHNpZ25JblJlc29sdmVyO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc3RhdGljIF9mcm9tRXJyb3IoYXV0aEV4dGVybiwgZXJyb3IpIHtcclxuICAgICAgICBjb25zdCBhdXRoID0gX2Nhc3RBdXRoKGF1dGhFeHRlcm4pO1xyXG4gICAgICAgIGNvbnN0IHNlcnZlclJlc3BvbnNlID0gZXJyb3IuY3VzdG9tRGF0YS5fc2VydmVyUmVzcG9uc2U7XHJcbiAgICAgICAgY29uc3QgaGludHMgPSAoc2VydmVyUmVzcG9uc2UubWZhSW5mbyB8fCBbXSkubWFwKGVucm9sbG1lbnQgPT4gTXVsdGlGYWN0b3JJbmZvSW1wbC5fZnJvbVNlcnZlclJlc3BvbnNlKGF1dGgsIGVucm9sbG1lbnQpKTtcclxuICAgICAgICBfYXNzZXJ0KHNlcnZlclJlc3BvbnNlLm1mYVBlbmRpbmdDcmVkZW50aWFsLCBhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSBNdWx0aUZhY3RvclNlc3Npb25JbXBsLl9mcm9tTWZhUGVuZGluZ0NyZWRlbnRpYWwoc2VydmVyUmVzcG9uc2UubWZhUGVuZGluZ0NyZWRlbnRpYWwpO1xyXG4gICAgICAgIHJldHVybiBuZXcgTXVsdGlGYWN0b3JSZXNvbHZlckltcGwoc2Vzc2lvbiwgaGludHMsIGFzeW5jIChhc3NlcnRpb24pID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbWZhUmVzcG9uc2UgPSBhd2FpdCBhc3NlcnRpb24uX3Byb2Nlc3MoYXV0aCwgc2Vzc2lvbik7XHJcbiAgICAgICAgICAgIC8vIENsZWFyIG91dCB0aGUgdW5uZWVkZWQgZmllbGRzIGZyb20gdGhlIG9sZCBsb2dpbiByZXNwb25zZVxyXG4gICAgICAgICAgICBkZWxldGUgc2VydmVyUmVzcG9uc2UubWZhSW5mbztcclxuICAgICAgICAgICAgZGVsZXRlIHNlcnZlclJlc3BvbnNlLm1mYVBlbmRpbmdDcmVkZW50aWFsO1xyXG4gICAgICAgICAgICAvLyBVc2UgaW4gdGhlIG5ldyB0b2tlbiAmIHJlZnJlc2ggdG9rZW4gaW4gdGhlIG9sZCByZXNwb25zZVxyXG4gICAgICAgICAgICBjb25zdCBpZFRva2VuUmVzcG9uc2UgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHNlcnZlclJlc3BvbnNlKSwgeyBpZFRva2VuOiBtZmFSZXNwb25zZS5pZFRva2VuLCByZWZyZXNoVG9rZW46IG1mYVJlc3BvbnNlLnJlZnJlc2hUb2tlbiB9KTtcclxuICAgICAgICAgICAgLy8gVE9ETzogd2Ugc2hvdWxkIGNvbGxhcHNlIHRoaXMgc3dpdGNoIHN0YXRlbWVudCBpbnRvIFVzZXJDcmVkZW50aWFsSW1wbC5fZm9yT3BlcmF0aW9uIGFuZCBoYXZlIGl0IHN1cHBvcnQgdGhlIFNJR05fSU4gY2FzZVxyXG4gICAgICAgICAgICBzd2l0Y2ggKGVycm9yLm9wZXJhdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJzaWduSW5cIiAvKiBTSUdOX0lOICovOlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJDcmVkZW50aWFsID0gYXdhaXQgVXNlckNyZWRlbnRpYWxJbXBsLl9mcm9tSWRUb2tlblJlc3BvbnNlKGF1dGgsIGVycm9yLm9wZXJhdGlvblR5cGUsIGlkVG9rZW5SZXNwb25zZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXV0aC5fdXBkYXRlQ3VycmVudFVzZXIodXNlckNyZWRlbnRpYWwudXNlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVzZXJDcmVkZW50aWFsO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcInJlYXV0aGVudGljYXRlXCIgLyogUkVBVVRIRU5USUNBVEUgKi86XHJcbiAgICAgICAgICAgICAgICAgICAgX2Fzc2VydChlcnJvci51c2VyLCBhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBVc2VyQ3JlZGVudGlhbEltcGwuX2Zvck9wZXJhdGlvbihlcnJvci51c2VyLCBlcnJvci5vcGVyYXRpb25UeXBlLCBpZFRva2VuUmVzcG9uc2UpO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBfZmFpbChhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyByZXNvbHZlU2lnbkluKGFzc2VydGlvbkV4dGVybikge1xyXG4gICAgICAgIGNvbnN0IGFzc2VydGlvbiA9IGFzc2VydGlvbkV4dGVybjtcclxuICAgICAgICByZXR1cm4gdGhpcy5zaWduSW5SZXNvbHZlcihhc3NlcnRpb24pO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBQcm92aWRlcyBhIHtAbGluayBNdWx0aUZhY3RvclJlc29sdmVyfSBzdWl0YWJsZSBmb3IgY29tcGxldGlvbiBvZiBhXHJcbiAqIG11bHRpLWZhY3RvciBmbG93LlxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSBlcnJvciAtIFRoZSB7QGxpbmsgTXVsdGlGYWN0b3JFcnJvcn0gcmFpc2VkIGR1cmluZyBhIHNpZ24taW4sIG9yXHJcbiAqIHJlYXV0aGVudGljYXRpb24gb3BlcmF0aW9uLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRNdWx0aUZhY3RvclJlc29sdmVyKGF1dGgsIGVycm9yKSB7XHJcbiAgICB2YXIgX2E7XHJcbiAgICBjb25zdCBhdXRoTW9kdWxhciA9IGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKTtcclxuICAgIGNvbnN0IGVycm9ySW50ZXJuYWwgPSBlcnJvcjtcclxuICAgIF9hc3NlcnQoZXJyb3IuY3VzdG9tRGF0YS5vcGVyYXRpb25UeXBlLCBhdXRoTW9kdWxhciwgXCJhcmd1bWVudC1lcnJvclwiIC8qIEFSR1VNRU5UX0VSUk9SICovKTtcclxuICAgIF9hc3NlcnQoKF9hID0gZXJyb3JJbnRlcm5hbC5jdXN0b21EYXRhLl9zZXJ2ZXJSZXNwb25zZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm1mYVBlbmRpbmdDcmVkZW50aWFsLCBhdXRoTW9kdWxhciwgXCJhcmd1bWVudC1lcnJvclwiIC8qIEFSR1VNRU5UX0VSUk9SICovKTtcclxuICAgIHJldHVybiBNdWx0aUZhY3RvclJlc29sdmVySW1wbC5fZnJvbUVycm9yKGF1dGhNb2R1bGFyLCBlcnJvckludGVybmFsKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBzdGFydEVucm9sbFBob25lTWZhKGF1dGgsIHJlcXVlc3QpIHtcclxuICAgIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3QoYXV0aCwgXCJQT1NUXCIgLyogUE9TVCAqLywgXCIvdjIvYWNjb3VudHMvbWZhRW5yb2xsbWVudDpzdGFydFwiIC8qIFNUQVJUX1BIT05FX01GQV9FTlJPTExNRU5UICovLCBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdCkpO1xyXG59XHJcbmZ1bmN0aW9uIGZpbmFsaXplRW5yb2xsUGhvbmVNZmEoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdChhdXRoLCBcIlBPU1RcIiAvKiBQT1NUICovLCBcIi92Mi9hY2NvdW50cy9tZmFFbnJvbGxtZW50OmZpbmFsaXplXCIgLyogRklOQUxJWkVfUEhPTkVfTUZBX0VOUk9MTE1FTlQgKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbn1cclxuZnVuY3Rpb24gd2l0aGRyYXdNZmEoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdChhdXRoLCBcIlBPU1RcIiAvKiBQT1NUICovLCBcIi92Mi9hY2NvdW50cy9tZmFFbnJvbGxtZW50OndpdGhkcmF3XCIgLyogV0lUSERSQVdfTUZBICovLCBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdCkpO1xyXG59XG5cbmNsYXNzIE11bHRpRmFjdG9yVXNlckltcGwge1xyXG4gICAgY29uc3RydWN0b3IodXNlcikge1xyXG4gICAgICAgIHRoaXMudXNlciA9IHVzZXI7XHJcbiAgICAgICAgdGhpcy5lbnJvbGxlZEZhY3RvcnMgPSBbXTtcclxuICAgICAgICB1c2VyLl9vblJlbG9hZCh1c2VySW5mbyA9PiB7XHJcbiAgICAgICAgICAgIGlmICh1c2VySW5mby5tZmFJbmZvKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVucm9sbGVkRmFjdG9ycyA9IHVzZXJJbmZvLm1mYUluZm8ubWFwKGVucm9sbG1lbnQgPT4gTXVsdGlGYWN0b3JJbmZvSW1wbC5fZnJvbVNlcnZlclJlc3BvbnNlKHVzZXIuYXV0aCwgZW5yb2xsbWVudCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgX2Zyb21Vc2VyKHVzZXIpIHtcclxuICAgICAgICByZXR1cm4gbmV3IE11bHRpRmFjdG9yVXNlckltcGwodXNlcik7XHJcbiAgICB9XHJcbiAgICBhc3luYyBnZXRTZXNzaW9uKCkge1xyXG4gICAgICAgIHJldHVybiBNdWx0aUZhY3RvclNlc3Npb25JbXBsLl9mcm9tSWR0b2tlbihhd2FpdCB0aGlzLnVzZXIuZ2V0SWRUb2tlbigpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIGVucm9sbChhc3NlcnRpb25FeHRlcm4sIGRpc3BsYXlOYW1lKSB7XHJcbiAgICAgICAgY29uc3QgYXNzZXJ0aW9uID0gYXNzZXJ0aW9uRXh0ZXJuO1xyXG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSAoYXdhaXQgdGhpcy5nZXRTZXNzaW9uKCkpO1xyXG4gICAgICAgIGNvbnN0IGZpbmFsaXplTWZhUmVzcG9uc2UgPSBhd2FpdCBfbG9nb3V0SWZJbnZhbGlkYXRlZCh0aGlzLnVzZXIsIGFzc2VydGlvbi5fcHJvY2Vzcyh0aGlzLnVzZXIuYXV0aCwgc2Vzc2lvbiwgZGlzcGxheU5hbWUpKTtcclxuICAgICAgICAvLyBOZXcgdG9rZW5zIHdpbGwgYmUgaXNzdWVkIGFmdGVyIGVucm9sbG1lbnQgb2YgdGhlIG5ldyBzZWNvbmQgZmFjdG9ycy5cclxuICAgICAgICAvLyBUaGV5IG5lZWQgdG8gYmUgdXBkYXRlZCBvbiB0aGUgdXNlci5cclxuICAgICAgICBhd2FpdCB0aGlzLnVzZXIuX3VwZGF0ZVRva2Vuc0lmTmVjZXNzYXJ5KGZpbmFsaXplTWZhUmVzcG9uc2UpO1xyXG4gICAgICAgIC8vIFRoZSB1c2VyIG5lZWRzIHRvIGJlIHJlbG9hZGVkIHRvIGdldCB0aGUgbmV3IG11bHRpLWZhY3RvciBpbmZvcm1hdGlvblxyXG4gICAgICAgIC8vIGZyb20gc2VydmVyLiBVU0VSX1JFTE9BREVEIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkIGFuZCBgZW5yb2xsZWRGYWN0b3JzYFxyXG4gICAgICAgIC8vIHdpbGwgYmUgdXBkYXRlZC5cclxuICAgICAgICByZXR1cm4gdGhpcy51c2VyLnJlbG9hZCgpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgdW5lbnJvbGwoaW5mb09yVWlkKSB7XHJcbiAgICAgICAgY29uc3QgbWZhRW5yb2xsbWVudElkID0gdHlwZW9mIGluZm9PclVpZCA9PT0gJ3N0cmluZycgPyBpbmZvT3JVaWQgOiBpbmZvT3JVaWQudWlkO1xyXG4gICAgICAgIGNvbnN0IGlkVG9rZW4gPSBhd2FpdCB0aGlzLnVzZXIuZ2V0SWRUb2tlbigpO1xyXG4gICAgICAgIGNvbnN0IGlkVG9rZW5SZXNwb25zZSA9IGF3YWl0IF9sb2dvdXRJZkludmFsaWRhdGVkKHRoaXMudXNlciwgd2l0aGRyYXdNZmEodGhpcy51c2VyLmF1dGgsIHtcclxuICAgICAgICAgICAgaWRUb2tlbixcclxuICAgICAgICAgICAgbWZhRW5yb2xsbWVudElkXHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgc2Vjb25kIGZhY3RvciBmcm9tIHRoZSB1c2VyJ3MgbGlzdC5cclxuICAgICAgICB0aGlzLmVucm9sbGVkRmFjdG9ycyA9IHRoaXMuZW5yb2xsZWRGYWN0b3JzLmZpbHRlcigoeyB1aWQgfSkgPT4gdWlkICE9PSBtZmFFbnJvbGxtZW50SWQpO1xyXG4gICAgICAgIC8vIERlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBiYWNrZW5kIGRlY2lkZWQgdG8gcmV2b2tlIHRoZSB1c2VyJ3Mgc2Vzc2lvbixcclxuICAgICAgICAvLyB0aGUgdG9rZW5SZXNwb25zZSBtYXkgYmUgZW1wdHkuIElmIHRoZSB0b2tlbnMgd2VyZSBub3QgdXBkYXRlZCAoYW5kIHRoZXlcclxuICAgICAgICAvLyBhcmUgbm93IGludmFsaWQpLCByZWxvYWRpbmcgdGhlIHVzZXIgd2lsbCBkaXNjb3ZlciB0aGlzIGFuZCBpbnZhbGlkYXRlXHJcbiAgICAgICAgLy8gdGhlIHVzZXIncyBzdGF0ZSBhY2NvcmRpbmdseS5cclxuICAgICAgICBhd2FpdCB0aGlzLnVzZXIuX3VwZGF0ZVRva2Vuc0lmTmVjZXNzYXJ5KGlkVG9rZW5SZXNwb25zZSk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy51c2VyLnJlbG9hZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBpZiAoZS5jb2RlICE9PSBgYXV0aC8ke1widXNlci10b2tlbi1leHBpcmVkXCIgLyogVE9LRU5fRVhQSVJFRCAqL31gKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmNvbnN0IG11bHRpRmFjdG9yVXNlckNhY2hlID0gbmV3IFdlYWtNYXAoKTtcclxuLyoqXHJcbiAqIFRoZSB7QGxpbmsgTXVsdGlGYWN0b3JVc2VyfSBjb3JyZXNwb25kaW5nIHRvIHRoZSB1c2VyLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBUaGlzIGlzIHVzZWQgdG8gYWNjZXNzIGFsbCBtdWx0aS1mYWN0b3IgcHJvcGVydGllcyBhbmQgb3BlcmF0aW9ucyByZWxhdGVkIHRvIHRoZSB1c2VyLlxyXG4gKlxyXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiBtdWx0aUZhY3Rvcih1c2VyKSB7XHJcbiAgICBjb25zdCB1c2VyTW9kdWxhciA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKTtcclxuICAgIGlmICghbXVsdGlGYWN0b3JVc2VyQ2FjaGUuaGFzKHVzZXJNb2R1bGFyKSkge1xyXG4gICAgICAgIG11bHRpRmFjdG9yVXNlckNhY2hlLnNldCh1c2VyTW9kdWxhciwgTXVsdGlGYWN0b3JVc2VySW1wbC5fZnJvbVVzZXIodXNlck1vZHVsYXIpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBtdWx0aUZhY3RvclVzZXJDYWNoZS5nZXQodXNlck1vZHVsYXIpO1xyXG59XG5cbmNvbnN0IFNUT1JBR0VfQVZBSUxBQkxFX0tFWSA9ICdfX3Nhayc7XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8vIFRoZXJlIGFyZSB0d28gZGlmZmVyZW50IGJyb3dzZXIgcGVyc2lzdGVuY2UgdHlwZXM6IGxvY2FsIGFuZCBzZXNzaW9uLlxyXG4vLyBCb3RoIGhhdmUgdGhlIHNhbWUgaW1wbGVtZW50YXRpb24gYnV0IHVzZSBhIGRpZmZlcmVudCB1bmRlcmx5aW5nIHN0b3JhZ2VcclxuLy8gb2JqZWN0LlxyXG5jbGFzcyBCcm93c2VyUGVyc2lzdGVuY2VDbGFzcyB7XHJcbiAgICBjb25zdHJ1Y3RvcihzdG9yYWdlUmV0cmlldmVyLCB0eXBlKSB7XHJcbiAgICAgICAgdGhpcy5zdG9yYWdlUmV0cmlldmVyID0gc3RvcmFnZVJldHJpZXZlcjtcclxuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xyXG4gICAgfVxyXG4gICAgX2lzQXZhaWxhYmxlKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5zdG9yYWdlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0FWQUlMQUJMRV9LRVksICcxJyk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmVJdGVtKFNUT1JBR0VfQVZBSUxBQkxFX0tFWSk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBfc2V0KGtleSwgdmFsdWUpIHtcclxuICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgfVxyXG4gICAgX2dldChrZXkpIHtcclxuICAgICAgICBjb25zdCBqc29uID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0oa2V5KTtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGpzb24gPyBKU09OLnBhcnNlKGpzb24pIDogbnVsbCk7XHJcbiAgICB9XHJcbiAgICBfcmVtb3ZlKGtleSkge1xyXG4gICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IHN0b3JhZ2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZVJldHJpZXZlcigpO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIF9pZnJhbWVDYW5ub3RTeW5jV2ViU3RvcmFnZSgpIHtcclxuICAgIGNvbnN0IHVhID0gZ2V0VUEoKTtcclxuICAgIHJldHVybiBfaXNTYWZhcmkodWEpIHx8IF9pc0lPUyh1YSk7XHJcbn1cclxuLy8gVGhlIHBvbGxpbmcgcGVyaW9kIGluIGNhc2UgZXZlbnRzIGFyZSBub3Qgc3VwcG9ydGVkXHJcbmNvbnN0IF9QT0xMSU5HX0lOVEVSVkFMX01TJDEgPSAxMDAwO1xyXG4vLyBUaGUgSUUgMTAgbG9jYWxTdG9yYWdlIGNyb3NzIHRhYiBzeW5jaHJvbml6YXRpb24gZGVsYXkgaW4gbWlsbGlzZWNvbmRzXHJcbmNvbnN0IElFMTBfTE9DQUxfU1RPUkFHRV9TWU5DX0RFTEFZID0gMTA7XHJcbmNsYXNzIEJyb3dzZXJMb2NhbFBlcnNpc3RlbmNlIGV4dGVuZHMgQnJvd3NlclBlcnNpc3RlbmNlQ2xhc3Mge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKCkgPT4gd2luZG93LmxvY2FsU3RvcmFnZSwgXCJMT0NBTFwiIC8qIExPQ0FMICovKTtcclxuICAgICAgICB0aGlzLmJvdW5kRXZlbnRIYW5kbGVyID0gKGV2ZW50LCBwb2xsKSA9PiB0aGlzLm9uU3RvcmFnZUV2ZW50KGV2ZW50LCBwb2xsKTtcclxuICAgICAgICB0aGlzLmxpc3RlbmVycyA9IHt9O1xyXG4gICAgICAgIHRoaXMubG9jYWxDYWNoZSA9IHt9O1xyXG4gICAgICAgIC8vIHNldFRpbWVvdXQgcmV0dXJuIHZhbHVlIGlzIHBsYXRmb3JtIHNwZWNpZmljXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICB0aGlzLnBvbGxUaW1lciA9IG51bGw7XHJcbiAgICAgICAgLy8gU2FmYXJpIG9yIGlPUyBicm93c2VyIGFuZCBlbWJlZGRlZCBpbiBhbiBpZnJhbWUuXHJcbiAgICAgICAgdGhpcy5zYWZhcmlMb2NhbFN0b3JhZ2VOb3RTeW5jZWQgPSBfaWZyYW1lQ2Fubm90U3luY1dlYlN0b3JhZ2UoKSAmJiBfaXNJZnJhbWUoKTtcclxuICAgICAgICAvLyBXaGV0aGVyIHRvIHVzZSBwb2xsaW5nIGluc3RlYWQgb2YgZGVwZW5kaW5nIG9uIHdpbmRvdyBldmVudHNcclxuICAgICAgICB0aGlzLmZhbGxiYWNrVG9Qb2xsaW5nID0gX2lzTW9iaWxlQnJvd3NlcigpO1xyXG4gICAgICAgIHRoaXMuX3Nob3VsZEFsbG93TWlncmF0aW9uID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGZvckFsbENoYW5nZWRLZXlzKGNiKSB7XHJcbiAgICAgICAgLy8gQ2hlY2sgYWxsIGtleXMgd2l0aCBsaXN0ZW5lcnMgb24gdGhlbS5cclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmxpc3RlbmVycykpIHtcclxuICAgICAgICAgICAgLy8gR2V0IHZhbHVlIGZyb20gbG9jYWxTdG9yYWdlLlxyXG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXMuc3RvcmFnZS5nZXRJdGVtKGtleSk7XHJcbiAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5sb2NhbENhY2hlW2tleV07XHJcbiAgICAgICAgICAgIC8vIElmIGxvY2FsIG1hcCB2YWx1ZSBkb2VzIG5vdCBtYXRjaCwgdHJpZ2dlciBsaXN0ZW5lciB3aXRoIHN0b3JhZ2UgZXZlbnQuXHJcbiAgICAgICAgICAgIC8vIERpZmZlcmVudGlhdGUgdGhpcyBzaW11bGF0ZWQgZXZlbnQgZnJvbSB0aGUgcmVhbCBzdG9yYWdlIGV2ZW50LlxyXG4gICAgICAgICAgICBpZiAobmV3VmFsdWUgIT09IG9sZFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBjYihrZXksIG9sZFZhbHVlLCBuZXdWYWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBvblN0b3JhZ2VFdmVudChldmVudCwgcG9sbCA9IGZhbHNlKSB7XHJcbiAgICAgICAgLy8gS2V5IHdvdWxkIGJlIG51bGwgaW4gc29tZSBzaXR1YXRpb25zLCBsaWtlIHdoZW4gbG9jYWxTdG9yYWdlIGlzIGNsZWFyZWRcclxuICAgICAgICBpZiAoIWV2ZW50LmtleSkge1xyXG4gICAgICAgICAgICB0aGlzLmZvckFsbENoYW5nZWRLZXlzKChrZXksIF9vbGRWYWx1ZSwgbmV3VmFsdWUpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5TGlzdGVuZXJzKGtleSwgbmV3VmFsdWUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBrZXkgPSBldmVudC5rZXk7XHJcbiAgICAgICAgLy8gQ2hlY2sgdGhlIG1lY2hhbmlzbSBob3cgdGhpcyBldmVudCB3YXMgZGV0ZWN0ZWQuXHJcbiAgICAgICAgLy8gVGhlIGZpcnN0IGV2ZW50IHdpbGwgZGljdGF0ZSB0aGUgbWVjaGFuaXNtIHRvIGJlIHVzZWQuXHJcbiAgICAgICAgaWYgKHBvbGwpIHtcclxuICAgICAgICAgICAgLy8gRW52aXJvbm1lbnQgZGV0ZWN0cyBzdG9yYWdlIGNoYW5nZXMgdmlhIHBvbGxpbmcuXHJcbiAgICAgICAgICAgIC8vIFJlbW92ZSBzdG9yYWdlIGV2ZW50IGxpc3RlbmVyIHRvIHByZXZlbnQgcG9zc2libGUgZXZlbnQgZHVwbGljYXRpb24uXHJcbiAgICAgICAgICAgIHRoaXMuZGV0YWNoTGlzdGVuZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIEVudmlyb25tZW50IGRldGVjdHMgc3RvcmFnZSBjaGFuZ2VzIHZpYSBzdG9yYWdlIGV2ZW50IGxpc3RlbmVyLlxyXG4gICAgICAgICAgICAvLyBSZW1vdmUgcG9sbGluZyBsaXN0ZW5lciB0byBwcmV2ZW50IHBvc3NpYmxlIGV2ZW50IGR1cGxpY2F0aW9uLlxyXG4gICAgICAgICAgICB0aGlzLnN0b3BQb2xsaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFNhZmFyaSBlbWJlZGRlZCBpZnJhbWUuIFN0b3JhZ2UgZXZlbnQgd2lsbCB0cmlnZ2VyIHdpdGggdGhlIGRlbHRhXHJcbiAgICAgICAgLy8gY2hhbmdlcyBidXQgbm8gY2hhbmdlcyB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGlmcmFtZSBsb2NhbFN0b3JhZ2UuXHJcbiAgICAgICAgaWYgKHRoaXMuc2FmYXJpTG9jYWxTdG9yYWdlTm90U3luY2VkKSB7XHJcbiAgICAgICAgICAgIC8vIEdldCBjdXJyZW50IGlmcmFtZSBwYWdlIHZhbHVlLlxyXG4gICAgICAgICAgICBjb25zdCBzdG9yZWRWYWx1ZSA9IHRoaXMuc3RvcmFnZS5nZXRJdGVtKGtleSk7XHJcbiAgICAgICAgICAgIC8vIFZhbHVlIG5vdCBzeW5jaHJvbml6ZWQsIHN5bmNocm9uaXplIG1hbnVhbGx5LlxyXG4gICAgICAgICAgICBpZiAoZXZlbnQubmV3VmFsdWUgIT09IHN0b3JlZFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQubmV3VmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBWYWx1ZSBjaGFuZ2VkIGZyb20gY3VycmVudCB2YWx1ZS5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbShrZXksIGV2ZW50Lm5ld1ZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEN1cnJlbnQgdmFsdWUgZGVsZXRlZC5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubG9jYWxDYWNoZVtrZXldID09PSBldmVudC5uZXdWYWx1ZSAmJiAhcG9sbCkge1xyXG4gICAgICAgICAgICAgICAgLy8gQWxyZWFkeSBkZXRlY3RlZCBhbmQgcHJvY2Vzc2VkLCBkbyBub3QgdHJpZ2dlciBsaXN0ZW5lcnMgYWdhaW4uXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdHJpZ2dlckxpc3RlbmVycyA9ICgpID0+IHtcclxuICAgICAgICAgICAgLy8gS2VlcCBsb2NhbCBtYXAgdXAgdG8gZGF0ZSBpbiBjYXNlIHN0b3JhZ2UgZXZlbnQgaXMgdHJpZ2dlcmVkIGJlZm9yZVxyXG4gICAgICAgICAgICAvLyBwb2xsLlxyXG4gICAgICAgICAgICBjb25zdCBzdG9yZWRWYWx1ZSA9IHRoaXMuc3RvcmFnZS5nZXRJdGVtKGtleSk7XHJcbiAgICAgICAgICAgIGlmICghcG9sbCAmJiB0aGlzLmxvY2FsQ2FjaGVba2V5XSA9PT0gc3RvcmVkVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIC8vIFJlYWwgc3RvcmFnZSBldmVudCB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIGRldGVjdGVkLCBkbyBub3RoaW5nLlxyXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBzZWVtcyB0byB0cmlnZ2VyIGluIHNvbWUgSUUgYnJvd3NlcnMgZm9yIHNvbWUgcmVhc29uLlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubm90aWZ5TGlzdGVuZXJzKGtleSwgc3RvcmVkVmFsdWUpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3Qgc3RvcmVkVmFsdWUgPSB0aGlzLnN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xyXG4gICAgICAgIGlmIChfaXNJRTEwKCkgJiZcclxuICAgICAgICAgICAgc3RvcmVkVmFsdWUgIT09IGV2ZW50Lm5ld1ZhbHVlICYmXHJcbiAgICAgICAgICAgIGV2ZW50Lm5ld1ZhbHVlICE9PSBldmVudC5vbGRWYWx1ZSkge1xyXG4gICAgICAgICAgICAvLyBJRSAxMCBoYXMgdGhpcyB3ZWlyZCBidWcgd2hlcmUgYSBzdG9yYWdlIGV2ZW50IHdvdWxkIHRyaWdnZXIgd2l0aCB0aGVcclxuICAgICAgICAgICAgLy8gY29ycmVjdCBrZXksIG9sZFZhbHVlIGFuZCBuZXdWYWx1ZSBidXQgbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KSBkb2VzXHJcbiAgICAgICAgICAgIC8vIG5vdCB5aWVsZCB0aGUgdXBkYXRlZCB2YWx1ZSB1bnRpbCBhIGZldyBtaWxsaXNlY29uZHMuIFRoaXMgZW5zdXJlc1xyXG4gICAgICAgICAgICAvLyB0aGlzIHJlY292ZXJzIGZyb20gdGhhdCBzaXR1YXRpb24uXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQodHJpZ2dlckxpc3RlbmVycywgSUUxMF9MT0NBTF9TVE9SQUdFX1NZTkNfREVMQVkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdHJpZ2dlckxpc3RlbmVycygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIG5vdGlmeUxpc3RlbmVycyhrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5sb2NhbENhY2hlW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVyc1trZXldO1xyXG4gICAgICAgIGlmIChsaXN0ZW5lcnMpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBBcnJheS5mcm9tKGxpc3RlbmVycykpIHtcclxuICAgICAgICAgICAgICAgIGxpc3RlbmVyKHZhbHVlID8gSlNPTi5wYXJzZSh2YWx1ZSkgOiB2YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGFydFBvbGxpbmcoKSB7XHJcbiAgICAgICAgdGhpcy5zdG9wUG9sbGluZygpO1xyXG4gICAgICAgIHRoaXMucG9sbFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmZvckFsbENoYW5nZWRLZXlzKChrZXksIG9sZFZhbHVlLCBuZXdWYWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vblN0b3JhZ2VFdmVudChuZXcgU3RvcmFnZUV2ZW50KCdzdG9yYWdlJywge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleSxcclxuICAgICAgICAgICAgICAgICAgICBvbGRWYWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICBuZXdWYWx1ZVxyXG4gICAgICAgICAgICAgICAgfSksIFxyXG4gICAgICAgICAgICAgICAgLyogcG9sbCAqLyB0cnVlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSwgX1BPTExJTkdfSU5URVJWQUxfTVMkMSk7XHJcbiAgICB9XHJcbiAgICBzdG9wUG9sbGluZygpIHtcclxuICAgICAgICBpZiAodGhpcy5wb2xsVGltZXIpIHtcclxuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnBvbGxUaW1lcik7XHJcbiAgICAgICAgICAgIHRoaXMucG9sbFRpbWVyID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhdHRhY2hMaXN0ZW5lcigpIHtcclxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc3RvcmFnZScsIHRoaXMuYm91bmRFdmVudEhhbmRsZXIpO1xyXG4gICAgfVxyXG4gICAgZGV0YWNoTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3N0b3JhZ2UnLCB0aGlzLmJvdW5kRXZlbnRIYW5kbGVyKTtcclxuICAgIH1cclxuICAgIF9hZGRMaXN0ZW5lcihrZXksIGxpc3RlbmVyKSB7XHJcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMubGlzdGVuZXJzKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgLy8gV2hldGhlciBicm93c2VyIGNhbiBkZXRlY3Qgc3RvcmFnZSBldmVudCB3aGVuIGl0IGhhZCBhbHJlYWR5IGJlZW4gcHVzaGVkIHRvIHRoZSBiYWNrZ3JvdW5kLlxyXG4gICAgICAgICAgICAvLyBUaGlzIG1heSBoYXBwZW4gaW4gc29tZSBtb2JpbGUgYnJvd3NlcnMuIEEgbG9jYWxTdG9yYWdlIGNoYW5nZSBpbiB0aGUgZm9yZWdyb3VuZCB3aW5kb3dcclxuICAgICAgICAgICAgLy8gd2lsbCBub3QgYmUgZGV0ZWN0ZWQgaW4gdGhlIGJhY2tncm91bmQgd2luZG93IHZpYSB0aGUgc3RvcmFnZSBldmVudC5cclxuICAgICAgICAgICAgLy8gVGhpcyB3YXMgZGV0ZWN0ZWQgaW4gaU9TIDcueCBtb2JpbGUgYnJvd3NlcnNcclxuICAgICAgICAgICAgaWYgKHRoaXMuZmFsbGJhY2tUb1BvbGxpbmcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRQb2xsaW5nKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmF0dGFjaExpc3RlbmVyKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVyc1trZXldKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW2tleV0gPSBuZXcgU2V0KCk7XHJcbiAgICAgICAgICAgIC8vIFBvcHVsYXRlIHRoZSBjYWNoZSB0byBhdm9pZCBzcHVyaW91c2x5IHRyaWdnZXJpbmcgb24gZmlyc3QgcG9sbC5cclxuICAgICAgICAgICAgdGhpcy5sb2NhbENhY2hlW2tleV0gPSB0aGlzLnN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxpc3RlbmVyc1trZXldLmFkZChsaXN0ZW5lcik7XHJcbiAgICB9XHJcbiAgICBfcmVtb3ZlTGlzdGVuZXIoa2V5LCBsaXN0ZW5lcikge1xyXG4gICAgICAgIGlmICh0aGlzLmxpc3RlbmVyc1trZXldKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW2tleV0uZGVsZXRlKGxpc3RlbmVyKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMubGlzdGVuZXJzW2tleV0uc2l6ZSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMubGlzdGVuZXJzW2tleV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMubGlzdGVuZXJzKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5kZXRhY2hMaXN0ZW5lcigpO1xyXG4gICAgICAgICAgICB0aGlzLnN0b3BQb2xsaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gVXBkYXRlIGxvY2FsIGNhY2hlIG9uIGJhc2Ugb3BlcmF0aW9uczpcclxuICAgIGFzeW5jIF9zZXQoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIGF3YWl0IHN1cGVyLl9zZXQoa2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5sb2NhbENhY2hlW2tleV0gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBfZ2V0KGtleSkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgc3VwZXIuX2dldChrZXkpO1xyXG4gICAgICAgIHRoaXMubG9jYWxDYWNoZVtrZXldID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuICAgIGFzeW5jIF9yZW1vdmUoa2V5KSB7XHJcbiAgICAgICAgYXdhaXQgc3VwZXIuX3JlbW92ZShrZXkpO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmxvY2FsQ2FjaGVba2V5XTtcclxuICAgIH1cclxufVxyXG5Ccm93c2VyTG9jYWxQZXJzaXN0ZW5jZS50eXBlID0gJ0xPQ0FMJztcclxuLyoqXHJcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBQZXJzaXN0ZW5jZX0gb2YgdHlwZSBgTE9DQUxgIHVzaW5nIGBsb2NhbFN0b3JhZ2VgXHJcbiAqIGZvciB0aGUgdW5kZXJseWluZyBzdG9yYWdlLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jb25zdCBicm93c2VyTG9jYWxQZXJzaXN0ZW5jZSA9IEJyb3dzZXJMb2NhbFBlcnNpc3RlbmNlO1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jbGFzcyBCcm93c2VyU2Vzc2lvblBlcnNpc3RlbmNlIGV4dGVuZHMgQnJvd3NlclBlcnNpc3RlbmNlQ2xhc3Mge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKCkgPT4gd2luZG93LnNlc3Npb25TdG9yYWdlLCBcIlNFU1NJT05cIiAvKiBTRVNTSU9OICovKTtcclxuICAgIH1cclxuICAgIF9hZGRMaXN0ZW5lcihfa2V5LCBfbGlzdGVuZXIpIHtcclxuICAgICAgICAvLyBMaXN0ZW5lcnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIHNlc3Npb24gc3RvcmFnZSBzaW5jZSBpdCBjYW5ub3QgYmUgc2hhcmVkIGFjcm9zcyB3aW5kb3dzXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgX3JlbW92ZUxpc3RlbmVyKF9rZXksIF9saXN0ZW5lcikge1xyXG4gICAgICAgIC8vIExpc3RlbmVycyBhcmUgbm90IHN1cHBvcnRlZCBmb3Igc2Vzc2lvbiBzdG9yYWdlIHNpbmNlIGl0IGNhbm5vdCBiZSBzaGFyZWQgYWNyb3NzIHdpbmRvd3NcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbn1cclxuQnJvd3NlclNlc3Npb25QZXJzaXN0ZW5jZS50eXBlID0gJ1NFU1NJT04nO1xyXG4vKipcclxuICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFBlcnNpc3RlbmNlfSBvZiBgU0VTU0lPTmAgdXNpbmcgYHNlc3Npb25TdG9yYWdlYFxyXG4gKiBmb3IgdGhlIHVuZGVybHlpbmcgc3RvcmFnZS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY29uc3QgYnJvd3NlclNlc3Npb25QZXJzaXN0ZW5jZSA9IEJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2U7XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBTaGltIGZvciBQcm9taXNlLmFsbFNldHRsZWQsIG5vdGUgdGhlIHNsaWdodGx5IGRpZmZlcmVudCBmb3JtYXQgb2YgYGZ1bGZpbGxlZGAgdnMgYHN0YXR1c2AuXHJcbiAqXHJcbiAqIEBwYXJhbSBwcm9taXNlcyAtIEFycmF5IG9mIHByb21pc2VzIHRvIHdhaXQgb24uXHJcbiAqL1xyXG5mdW5jdGlvbiBfYWxsU2V0dGxlZChwcm9taXNlcykge1xyXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzLm1hcChhc3luYyAocHJvbWlzZSkgPT4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcHJvbWlzZTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGZ1bGZpbGxlZDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChyZWFzb24pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGZ1bGZpbGxlZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICByZWFzb25cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9KSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIEludGVyZmFjZSBjbGFzcyBmb3IgcmVjZWl2aW5nIG1lc3NhZ2VzLlxyXG4gKlxyXG4gKi9cclxuY2xhc3MgUmVjZWl2ZXIge1xyXG4gICAgY29uc3RydWN0b3IoZXZlbnRUYXJnZXQpIHtcclxuICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0ID0gZXZlbnRUYXJnZXQ7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVyc01hcCA9IHt9O1xyXG4gICAgICAgIHRoaXMuYm91bmRFdmVudEhhbmRsZXIgPSB0aGlzLmhhbmRsZUV2ZW50LmJpbmQodGhpcyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE9idGFpbiBhbiBpbnN0YW5jZSBvZiBhIFJlY2VpdmVyIGZvciBhIGdpdmVuIGV2ZW50IHRhcmdldCwgaWYgbm9uZSBleGlzdHMgaXQgd2lsbCBiZSBjcmVhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBldmVudFRhcmdldCAtIEFuIGV2ZW50IHRhcmdldCAoc3VjaCBhcyB3aW5kb3cgb3Igc2VsZikgdGhyb3VnaCB3aGljaCB0aGUgdW5kZXJseWluZ1xyXG4gICAgICogbWVzc2FnZXMgd2lsbCBiZSByZWNlaXZlZC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIF9nZXRJbnN0YW5jZShldmVudFRhcmdldCkge1xyXG4gICAgICAgIC8vIFRoZSByZXN1bHRzIGFyZSBzdG9yZWQgaW4gYW4gYXJyYXkgc2luY2Ugb2JqZWN0cyBjYW4ndCBiZSBrZXlzIGZvciBvdGhlclxyXG4gICAgICAgIC8vIG9iamVjdHMuIEluIGFkZGl0aW9uLCBzZXR0aW5nIGEgdW5pcXVlIHByb3BlcnR5IG9uIGFuIGV2ZW50IHRhcmdldCBhcyBhXHJcbiAgICAgICAgLy8gaGFzaCBtYXAga2V5IG1heSBub3QgYmUgYWxsb3dlZCBkdWUgdG8gQ09SUyByZXN0cmljdGlvbnMuXHJcbiAgICAgICAgY29uc3QgZXhpc3RpbmdJbnN0YW5jZSA9IHRoaXMucmVjZWl2ZXJzLmZpbmQocmVjZWl2ZXIgPT4gcmVjZWl2ZXIuaXNMaXN0ZW5pbmd0byhldmVudFRhcmdldCkpO1xyXG4gICAgICAgIGlmIChleGlzdGluZ0luc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0luc3RhbmNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBuZXdJbnN0YW5jZSA9IG5ldyBSZWNlaXZlcihldmVudFRhcmdldCk7XHJcbiAgICAgICAgdGhpcy5yZWNlaXZlcnMucHVzaChuZXdJbnN0YW5jZSk7XHJcbiAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlO1xyXG4gICAgfVxyXG4gICAgaXNMaXN0ZW5pbmd0byhldmVudFRhcmdldCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmV2ZW50VGFyZ2V0ID09PSBldmVudFRhcmdldDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmFucyBvdXQgYSBNZXNzYWdlRXZlbnQgdG8gdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVycy5cclxuICAgICAqXHJcbiAgICAgKiBAcmVtYXJrc1xyXG4gICAgICogU2VuZHMgYW4ge0BsaW5rIFN0YXR1cy5BQ0t9IHVwb24gcmVjZWlwdCBhbmQgYSB7QGxpbmsgU3RhdHVzLkRPTkV9IG9uY2UgYWxsIGhhbmRsZXJzIGhhdmVcclxuICAgICAqIGZpbmlzaGVkIHByb2Nlc3NpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGV2ZW50IC0gVGhlIE1lc3NhZ2VFdmVudC5cclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGhhbmRsZUV2ZW50KGV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgbWVzc2FnZUV2ZW50ID0gZXZlbnQ7XHJcbiAgICAgICAgY29uc3QgeyBldmVudElkLCBldmVudFR5cGUsIGRhdGEgfSA9IG1lc3NhZ2VFdmVudC5kYXRhO1xyXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5oYW5kbGVyc01hcFtldmVudFR5cGVdO1xyXG4gICAgICAgIGlmICghKGhhbmRsZXJzID09PSBudWxsIHx8IGhhbmRsZXJzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBoYW5kbGVycy5zaXplKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG1lc3NhZ2VFdmVudC5wb3J0c1swXS5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgICAgIHN0YXR1czogXCJhY2tcIiAvKiBBQ0sgKi8sXHJcbiAgICAgICAgICAgIGV2ZW50SWQsXHJcbiAgICAgICAgICAgIGV2ZW50VHlwZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gQXJyYXkuZnJvbShoYW5kbGVycykubWFwKGFzeW5jIChoYW5kbGVyKSA9PiBoYW5kbGVyKG1lc3NhZ2VFdmVudC5vcmlnaW4sIGRhdGEpKTtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9hbGxTZXR0bGVkKHByb21pc2VzKTtcclxuICAgICAgICBtZXNzYWdlRXZlbnQucG9ydHNbMF0ucG9zdE1lc3NhZ2Uoe1xyXG4gICAgICAgICAgICBzdGF0dXM6IFwiZG9uZVwiIC8qIERPTkUgKi8sXHJcbiAgICAgICAgICAgIGV2ZW50SWQsXHJcbiAgICAgICAgICAgIGV2ZW50VHlwZSxcclxuICAgICAgICAgICAgcmVzcG9uc2VcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU3Vic2NyaWJlIGFuIGV2ZW50IGhhbmRsZXIgZm9yIGEgcGFydGljdWxhciBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gRXZlbnQgbmFtZSB0byBzdWJzY3JpYmUgdG8uXHJcbiAgICAgKiBAcGFyYW0gZXZlbnRIYW5kbGVyIC0gVGhlIGV2ZW50IGhhbmRsZXIgd2hpY2ggc2hvdWxkIHJlY2VpdmUgdGhlIGV2ZW50cy5cclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgIF9zdWJzY3JpYmUoZXZlbnRUeXBlLCBldmVudEhhbmRsZXIpIHtcclxuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5oYW5kbGVyc01hcCkubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuYm91bmRFdmVudEhhbmRsZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuaGFuZGxlcnNNYXBbZXZlbnRUeXBlXSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZXJzTWFwW2V2ZW50VHlwZV0gPSBuZXcgU2V0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaGFuZGxlcnNNYXBbZXZlbnRUeXBlXS5hZGQoZXZlbnRIYW5kbGVyKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVW5zdWJzY3JpYmUgYW4gZXZlbnQgaGFuZGxlciBmcm9tIGEgcGFydGljdWxhciBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gRXZlbnQgbmFtZSB0byB1bnN1YnNjcmliZSBmcm9tLlxyXG4gICAgICogQHBhcmFtIGV2ZW50SGFuZGxlciAtIE9wdGlub2FsIGV2ZW50IGhhbmRsZXIsIGlmIG5vbmUgcHJvdmlkZWQsIHVuc3Vic2NyaWJlIGFsbCBoYW5kbGVycyBvbiB0aGlzIGV2ZW50LlxyXG4gICAgICpcclxuICAgICAqL1xyXG4gICAgX3Vuc3Vic2NyaWJlKGV2ZW50VHlwZSwgZXZlbnRIYW5kbGVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGFuZGxlcnNNYXBbZXZlbnRUeXBlXSAmJiBldmVudEhhbmRsZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVyc01hcFtldmVudFR5cGVdLmRlbGV0ZShldmVudEhhbmRsZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWV2ZW50SGFuZGxlciB8fCB0aGlzLmhhbmRsZXJzTWFwW2V2ZW50VHlwZV0uc2l6ZSA9PT0gMCkge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5oYW5kbGVyc01hcFtldmVudFR5cGVdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5oYW5kbGVyc01hcCkubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuYm91bmRFdmVudEhhbmRsZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5SZWNlaXZlci5yZWNlaXZlcnMgPSBbXTtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gX2dlbmVyYXRlRXZlbnRJZChwcmVmaXggPSAnJywgZGlnaXRzID0gMTApIHtcclxuICAgIGxldCByYW5kb20gPSAnJztcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlnaXRzOyBpKyspIHtcclxuICAgICAgICByYW5kb20gKz0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHByZWZpeCArIHJhbmRvbTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogSW50ZXJmYWNlIGZvciBzZW5kaW5nIG1lc3NhZ2VzIGFuZCB3YWl0aW5nIGZvciBhIGNvbXBsZXRpb24gcmVzcG9uc2UuXHJcbiAqXHJcbiAqL1xyXG5jbGFzcyBTZW5kZXIge1xyXG4gICAgY29uc3RydWN0b3IodGFyZ2V0KSB7XHJcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IG5ldyBTZXQoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVW5zdWJzY3JpYmUgdGhlIGhhbmRsZXIgYW5kIHJlbW92ZSBpdCBmcm9tIG91ciB0cmFja2luZyBTZXQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGhhbmRsZXIgLSBUaGUgaGFuZGxlciB0byB1bnN1YnNjcmliZS5cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlTWVzc2FnZUhhbmRsZXIoaGFuZGxlcikge1xyXG4gICAgICAgIGlmIChoYW5kbGVyLm1lc3NhZ2VDaGFubmVsKSB7XHJcbiAgICAgICAgICAgIGhhbmRsZXIubWVzc2FnZUNoYW5uZWwucG9ydDEucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIub25NZXNzYWdlKTtcclxuICAgICAgICAgICAgaGFuZGxlci5tZXNzYWdlQ2hhbm5lbC5wb3J0MS5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU2VuZCBhIG1lc3NhZ2UgdG8gdGhlIFJlY2VpdmVyIGxvY2F0ZWQgYXQge0BsaW5rIHRhcmdldH0uXHJcbiAgICAgKlxyXG4gICAgICogQHJlbWFya3NcclxuICAgICAqIFdlJ2xsIGZpcnN0IHdhaXQgYSBiaXQgZm9yIGFuIEFDSyAsIGlmIHdlIGdldCBvbmUgd2Ugd2lsbCB3YWl0IHNpZ25pZmljYW50bHkgbG9uZ2VyIHVudGlsIHRoZVxyXG4gICAgICogcmVjZWl2ZXIgaGFzIGhhZCBhIGNoYW5jZSB0byBmdWxseSBwcm9jZXNzIHRoZSBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gVHlwZSBvZiBldmVudCB0byBzZW5kLlxyXG4gICAgICogQHBhcmFtIGRhdGEgLSBUaGUgcGF5bG9hZCBvZiB0aGUgZXZlbnQuXHJcbiAgICAgKiBAcGFyYW0gdGltZW91dCAtIFRpbWVvdXQgZm9yIHdhaXRpbmcgb24gYW4gQUNLIGZyb20gdGhlIHJlY2VpdmVyLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHNldHRsZWQgcHJvbWlzZXMgZnJvbSBhbGwgdGhlIGhhbmRsZXJzIHRoYXQgd2VyZSBsaXN0ZW5pbmcgb24gdGhlIHJlY2VpdmVyLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBfc2VuZChldmVudFR5cGUsIGRhdGEsIHRpbWVvdXQgPSA1MCAvKiBBQ0sgKi8pIHtcclxuICAgICAgICBjb25zdCBtZXNzYWdlQ2hhbm5lbCA9IHR5cGVvZiBNZXNzYWdlQ2hhbm5lbCAhPT0gJ3VuZGVmaW5lZCcgPyBuZXcgTWVzc2FnZUNoYW5uZWwoKSA6IG51bGw7XHJcbiAgICAgICAgaWYgKCFtZXNzYWdlQ2hhbm5lbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb25uZWN0aW9uX3VuYXZhaWxhYmxlXCIgLyogQ09OTkVDVElPTl9VTkFWQUlMQUJMRSAqLyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIE5vZGUgdGltZXJzIGFuZCBicm93c2VyIHRpbWVycyByZXR1cm4gZnVuZGFtZW50YWxseSBkaWZmZXJlbnQgdHlwZXMuXHJcbiAgICAgICAgLy8gV2UgZG9uJ3QgYWN0dWFsbHkgY2FyZSB3aGF0IHRoZSB2YWx1ZSBpcyBidXQgVFMgd29uJ3QgYWNjZXB0IHVua25vd24gYW5kXHJcbiAgICAgICAgLy8gd2UgY2FuJ3QgY2FzdCBwcm9wZXJseSBpbiBib3RoIGVudmlyb25tZW50cy5cclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgIGxldCBjb21wbGV0aW9uVGltZXI7XHJcbiAgICAgICAgbGV0IGhhbmRsZXI7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZXZlbnRJZCA9IF9nZW5lcmF0ZUV2ZW50SWQoJycsIDIwKTtcclxuICAgICAgICAgICAgbWVzc2FnZUNoYW5uZWwucG9ydDEuc3RhcnQoKTtcclxuICAgICAgICAgICAgY29uc3QgYWNrVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJ1bnN1cHBvcnRlZF9ldmVudFwiIC8qIFVOU1VQUE9SVEVEX0VWRU5UICovKSk7XHJcbiAgICAgICAgICAgIH0sIHRpbWVvdXQpO1xyXG4gICAgICAgICAgICBoYW5kbGVyID0ge1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZUNoYW5uZWwsXHJcbiAgICAgICAgICAgICAgICBvbk1lc3NhZ2UoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlRXZlbnQgPSBldmVudDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZUV2ZW50LmRhdGEuZXZlbnRJZCAhPT0gZXZlbnRJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZUV2ZW50LmRhdGEuc3RhdHVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJhY2tcIiAvKiBBQ0sgKi86XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVjZWl2ZXIgc2hvdWxkIEFDSyBmaXJzdC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhY2tUaW1lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwidGltZW91dFwiIC8qIFRJTUVPVVQgKi8pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDMwMDAgLyogQ09NUExFVElPTiAqLyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImRvbmVcIiAvKiBET05FICovOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25jZSB0aGUgcmVjZWl2ZXIncyBoYW5kbGVycyBhcmUgZmluaXNoZWQgd2Ugd2lsbCBnZXQgdGhlIHJlc3VsdHMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoY29tcGxldGlvblRpbWVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobWVzc2FnZUV2ZW50LmRhdGEucmVzcG9uc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoYWNrVGltZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGNvbXBsZXRpb25UaW1lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwiaW52YWxpZF9yZXNwb25zZVwiIC8qIElOVkFMSURfUkVTUE9OU0UgKi8pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVycy5hZGQoaGFuZGxlcik7XHJcbiAgICAgICAgICAgIG1lc3NhZ2VDaGFubmVsLnBvcnQxLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyLm9uTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0LnBvc3RNZXNzYWdlKHtcclxuICAgICAgICAgICAgICAgIGV2ZW50VHlwZSxcclxuICAgICAgICAgICAgICAgIGV2ZW50SWQsXHJcbiAgICAgICAgICAgICAgICBkYXRhXHJcbiAgICAgICAgICAgIH0sIFttZXNzYWdlQ2hhbm5lbC5wb3J0Ml0pO1xyXG4gICAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaGFuZGxlcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVNZXNzYWdlSGFuZGxlcihoYW5kbGVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBMYXp5IGFjY2Vzc29yIGZvciB3aW5kb3csIHNpbmNlIHRoZSBjb21wYXQgbGF5ZXIgd29uJ3QgdHJlZSBzaGFrZSB0aGlzIG91dCxcclxuICogd2UgbmVlZCB0byBtYWtlIHN1cmUgbm90IHRvIG1lc3Mgd2l0aCB3aW5kb3cgdW5sZXNzIHdlIGhhdmUgdG9cclxuICovXHJcbmZ1bmN0aW9uIF93aW5kb3coKSB7XHJcbiAgICByZXR1cm4gd2luZG93O1xyXG59XHJcbmZ1bmN0aW9uIF9zZXRXaW5kb3dMb2NhdGlvbih1cmwpIHtcclxuICAgIF93aW5kb3coKS5sb2NhdGlvbi5ocmVmID0gdXJsO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLlxyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBfaXNXb3JrZXIoKSB7XHJcbiAgICByZXR1cm4gKHR5cGVvZiBfd2luZG93KClbJ1dvcmtlckdsb2JhbFNjb3BlJ10gIT09ICd1bmRlZmluZWQnICYmXHJcbiAgICAgICAgdHlwZW9mIF93aW5kb3coKVsnaW1wb3J0U2NyaXB0cyddID09PSAnZnVuY3Rpb24nKTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBfZ2V0QWN0aXZlU2VydmljZVdvcmtlcigpIHtcclxuICAgIGlmICghKG5hdmlnYXRvciA9PT0gbnVsbCB8fCBuYXZpZ2F0b3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5hdmlnYXRvci5zZXJ2aWNlV29ya2VyKSkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgICBjb25zdCByZWdpc3RyYXRpb24gPSBhd2FpdCBuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5yZWFkeTtcclxuICAgICAgICByZXR1cm4gcmVnaXN0cmF0aW9uLmFjdGl2ZTtcclxuICAgIH1cclxuICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIF9nZXRTZXJ2aWNlV29ya2VyQ29udHJvbGxlcigpIHtcclxuICAgIHZhciBfYTtcclxuICAgIHJldHVybiAoKF9hID0gbmF2aWdhdG9yID09PSBudWxsIHx8IG5hdmlnYXRvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jb250cm9sbGVyKSB8fCBudWxsO1xyXG59XHJcbmZ1bmN0aW9uIF9nZXRXb3JrZXJHbG9iYWxTY29wZSgpIHtcclxuICAgIHJldHVybiBfaXNXb3JrZXIoKSA/IHNlbGYgOiBudWxsO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IERCX05BTUUgPSAnZmlyZWJhc2VMb2NhbFN0b3JhZ2VEYic7XHJcbmNvbnN0IERCX1ZFUlNJT04gPSAxO1xyXG5jb25zdCBEQl9PQkpFQ1RTVE9SRV9OQU1FID0gJ2ZpcmViYXNlTG9jYWxTdG9yYWdlJztcclxuY29uc3QgREJfREFUQV9LRVlQQVRIID0gJ2ZiYXNlX2tleSc7XHJcbi8qKlxyXG4gKiBQcm9taXNlIHdyYXBwZXIgZm9yIElEQlJlcXVlc3RcclxuICpcclxuICogVW5mb3J0dW5hdGVseSB3ZSBjYW4ndCBjbGVhbmx5IGV4dGVuZCBQcm9taXNlPFQ+IHNpbmNlIHByb21pc2VzIGFyZSBub3QgY2FsbGFibGUgaW4gRVM2XHJcbiAqXHJcbiAqL1xyXG5jbGFzcyBEQlByb21pc2Uge1xyXG4gICAgY29uc3RydWN0b3IocmVxdWVzdCkge1xyXG4gICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XHJcbiAgICB9XHJcbiAgICB0b1Byb21pc2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ3N1Y2Nlc3MnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMucmVxdWVzdC5yZXN1bHQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KHRoaXMucmVxdWVzdC5lcnJvcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGdldE9iamVjdFN0b3JlKGRiLCBpc1JlYWRXcml0ZSkge1xyXG4gICAgcmV0dXJuIGRiXHJcbiAgICAgICAgLnRyYW5zYWN0aW9uKFtEQl9PQkpFQ1RTVE9SRV9OQU1FXSwgaXNSZWFkV3JpdGUgPyAncmVhZHdyaXRlJyA6ICdyZWFkb25seScpXHJcbiAgICAgICAgLm9iamVjdFN0b3JlKERCX09CSkVDVFNUT1JFX05BTUUpO1xyXG59XHJcbmZ1bmN0aW9uIF9kZWxldGVEYXRhYmFzZSgpIHtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIuZGVsZXRlRGF0YWJhc2UoREJfTkFNRSk7XHJcbiAgICByZXR1cm4gbmV3IERCUHJvbWlzZShyZXF1ZXN0KS50b1Byb21pc2UoKTtcclxufVxyXG5mdW5jdGlvbiBfb3BlbkRhdGFiYXNlKCkge1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IGluZGV4ZWREQi5vcGVuKERCX05BTUUsIERCX1ZFUlNJT04pO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xyXG4gICAgICAgICAgICByZWplY3QocmVxdWVzdC5lcnJvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCd1cGdyYWRlbmVlZGVkJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBkYiA9IHJlcXVlc3QucmVzdWx0O1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoREJfT0JKRUNUU1RPUkVfTkFNRSwgeyBrZXlQYXRoOiBEQl9EQVRBX0tFWVBBVEggfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcignc3VjY2VzcycsIGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZGIgPSByZXF1ZXN0LnJlc3VsdDtcclxuICAgICAgICAgICAgLy8gU3RyYW5nZSBidWcgdGhhdCBvY2N1cnMgaW4gRmlyZWZveCB3aGVuIG11bHRpcGxlIHRhYnMgYXJlIG9wZW5lZCBhdCB0aGVcclxuICAgICAgICAgICAgLy8gc2FtZSB0aW1lLiBUaGUgb25seSB3YXkgdG8gcmVjb3ZlciBzZWVtcyB0byBiZSBkZWxldGluZyB0aGUgZGF0YWJhc2VcclxuICAgICAgICAgICAgLy8gYW5kIHJlLWluaXRpYWxpemluZyBpdC5cclxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZpcmViYXNlL2ZpcmViYXNlLWpzLXNkay9pc3N1ZXMvNjM0XHJcbiAgICAgICAgICAgIGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhEQl9PQkpFQ1RTVE9SRV9OQU1FKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gTmVlZCB0byBjbG9zZSB0aGUgZGF0YWJhc2Ugb3IgZWxzZSB5b3UgZ2V0IGEgYGJsb2NrZWRgIGV2ZW50XHJcbiAgICAgICAgICAgICAgICBkYi5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgX2RlbGV0ZURhdGFiYXNlKCk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGF3YWl0IF9vcGVuRGF0YWJhc2UoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGRiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gX3B1dE9iamVjdChkYiwga2V5LCB2YWx1ZSkge1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IGdldE9iamVjdFN0b3JlKGRiLCB0cnVlKS5wdXQoe1xyXG4gICAgICAgIFtEQl9EQVRBX0tFWVBBVEhdOiBrZXksXHJcbiAgICAgICAgdmFsdWVcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG5ldyBEQlByb21pc2UocmVxdWVzdCkudG9Qcm9taXNlKCk7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gZ2V0T2JqZWN0KGRiLCBrZXkpIHtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSBnZXRPYmplY3RTdG9yZShkYiwgZmFsc2UpLmdldChrZXkpO1xyXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IG5ldyBEQlByb21pc2UocmVxdWVzdCkudG9Qcm9taXNlKCk7XHJcbiAgICByZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRhdGEudmFsdWU7XHJcbn1cclxuZnVuY3Rpb24gX2RlbGV0ZU9iamVjdChkYiwga2V5KSB7XHJcbiAgICBjb25zdCByZXF1ZXN0ID0gZ2V0T2JqZWN0U3RvcmUoZGIsIHRydWUpLmRlbGV0ZShrZXkpO1xyXG4gICAgcmV0dXJuIG5ldyBEQlByb21pc2UocmVxdWVzdCkudG9Qcm9taXNlKCk7XHJcbn1cclxuY29uc3QgX1BPTExJTkdfSU5URVJWQUxfTVMgPSA4MDA7XHJcbmNvbnN0IF9UUkFOU0FDVElPTl9SRVRSWV9DT1VOVCA9IDM7XHJcbmNsYXNzIEluZGV4ZWREQkxvY2FsUGVyc2lzdGVuY2Uge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy50eXBlID0gXCJMT0NBTFwiIC8qIExPQ0FMICovO1xyXG4gICAgICAgIHRoaXMuX3Nob3VsZEFsbG93TWlncmF0aW9uID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmxpc3RlbmVycyA9IHt9O1xyXG4gICAgICAgIHRoaXMubG9jYWxDYWNoZSA9IHt9O1xyXG4gICAgICAgIC8vIHNldFRpbWVvdXQgcmV0dXJuIHZhbHVlIGlzIHBsYXRmb3JtIHNwZWNpZmljXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICB0aGlzLnBvbGxUaW1lciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5wZW5kaW5nV3JpdGVzID0gMDtcclxuICAgICAgICB0aGlzLnJlY2VpdmVyID0gbnVsbDtcclxuICAgICAgICB0aGlzLnNlbmRlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWNlV29ya2VyUmVjZWl2ZXJBdmFpbGFibGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmFjdGl2ZVNlcnZpY2VXb3JrZXIgPSBudWxsO1xyXG4gICAgICAgIC8vIEZpcmUgJiBmb3JnZXQgdGhlIHNlcnZpY2Ugd29ya2VyIHJlZ2lzdHJhdGlvbiBhcyBpdCBtYXkgbmV2ZXIgcmVzb2x2ZVxyXG4gICAgICAgIHRoaXMuX3dvcmtlckluaXRpYWxpemF0aW9uUHJvbWlzZSA9XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVNlcnZpY2VXb3JrZXJNZXNzYWdpbmcoKS50aGVuKCgpID0+IHsgfSwgKCkgPT4geyB9KTtcclxuICAgIH1cclxuICAgIGFzeW5jIF9vcGVuRGIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZGIgPSBhd2FpdCBfb3BlbkRhdGFiYXNlKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGI7XHJcbiAgICB9XHJcbiAgICBhc3luYyBfd2l0aFJldHJpZXMob3ApIHtcclxuICAgICAgICBsZXQgbnVtQXR0ZW1wdHMgPSAwO1xyXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYiA9IGF3YWl0IHRoaXMuX29wZW5EYigpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IG9wKGRiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG51bUF0dGVtcHRzKysgPiBfVFJBTlNBQ1RJT05fUkVUUllfQ09VTlQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRiLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYiA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIFRPRE86IGNvbnNpZGVyIGFkZGluZyBleHBvbmVudGlhbCBiYWNrb2ZmXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEluZGV4ZWREQiBldmVudHMgZG8gbm90IHByb3BhZ2F0ZSBmcm9tIHRoZSBtYWluIHdpbmRvdyB0byB0aGUgd29ya2VyIGNvbnRleHQuICBXZSByZWx5IG9uIGFcclxuICAgICAqIHBvc3RNZXNzYWdlIGludGVyZmFjZSB0byBzZW5kIHRoZXNlIGV2ZW50cyB0byB0aGUgd29ya2VyIG91cnNlbHZlcy5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgaW5pdGlhbGl6ZVNlcnZpY2VXb3JrZXJNZXNzYWdpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIF9pc1dvcmtlcigpID8gdGhpcy5pbml0aWFsaXplUmVjZWl2ZXIoKSA6IHRoaXMuaW5pdGlhbGl6ZVNlbmRlcigpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBcyB0aGUgd29ya2VyIHdlIHNob3VsZCBsaXN0ZW4gdG8gZXZlbnRzIGZyb20gdGhlIG1haW4gd2luZG93LlxyXG4gICAgICovXHJcbiAgICBhc3luYyBpbml0aWFsaXplUmVjZWl2ZXIoKSB7XHJcbiAgICAgICAgdGhpcy5yZWNlaXZlciA9IFJlY2VpdmVyLl9nZXRJbnN0YW5jZShfZ2V0V29ya2VyR2xvYmFsU2NvcGUoKSk7XHJcbiAgICAgICAgLy8gUmVmcmVzaCBmcm9tIHBlcnNpc3RlbmNlIGlmIHdlIHJlY2VpdmUgYSBLZXlDaGFuZ2VkIG1lc3NhZ2UuXHJcbiAgICAgICAgdGhpcy5yZWNlaXZlci5fc3Vic2NyaWJlKFwia2V5Q2hhbmdlZFwiIC8qIEtFWV9DSEFOR0VEICovLCBhc3luYyAoX29yaWdpbiwgZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBrZXlzID0gYXdhaXQgdGhpcy5fcG9sbCgpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAga2V5UHJvY2Vzc2VkOiBrZXlzLmluY2x1ZGVzKGRhdGEua2V5KVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIExldCB0aGUgc2VuZGVyIGtub3cgdGhhdCB3ZSBhcmUgbGlzdGVuaW5nIHNvIHRoZXkgZ2l2ZSB1cyBtb3JlIHRpbWVvdXQuXHJcbiAgICAgICAgdGhpcy5yZWNlaXZlci5fc3Vic2NyaWJlKFwicGluZ1wiIC8qIFBJTkcgKi8sIGFzeW5jIChfb3JpZ2luLCBfZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gW1wia2V5Q2hhbmdlZFwiIC8qIEtFWV9DSEFOR0VEICovXTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQXMgdGhlIG1haW4gd2luZG93LCB3ZSBzaG91bGQgbGV0IHRoZSB3b3JrZXIga25vdyB3aGVuIGtleXMgY2hhbmdlIChzZXQgYW5kIHJlbW92ZSkuXHJcbiAgICAgKlxyXG4gICAgICogQHJlbWFya3NcclxuICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvU2VydmljZVdvcmtlckNvbnRhaW5lci9yZWFkeSB8IFNlcnZpY2VXb3JrZXJDb250YWluZXIucmVhZHl9XHJcbiAgICAgKiBtYXkgbm90IHJlc29sdmUuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGluaXRpYWxpemVTZW5kZXIoKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlcmUncyBhbiBhY3RpdmUgc2VydmljZSB3b3JrZXIuXHJcbiAgICAgICAgdGhpcy5hY3RpdmVTZXJ2aWNlV29ya2VyID0gYXdhaXQgX2dldEFjdGl2ZVNlcnZpY2VXb3JrZXIoKTtcclxuICAgICAgICBpZiAoIXRoaXMuYWN0aXZlU2VydmljZVdvcmtlcikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2VuZGVyID0gbmV3IFNlbmRlcih0aGlzLmFjdGl2ZVNlcnZpY2VXb3JrZXIpO1xyXG4gICAgICAgIC8vIFBpbmcgdGhlIHNlcnZpY2Ugd29ya2VyIHRvIGNoZWNrIHdoYXQgZXZlbnRzIHRoZXkgY2FuIGhhbmRsZS5cclxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5zZW5kZXIuX3NlbmQoXCJwaW5nXCIgLyogUElORyAqLywge30sIDgwMCAvKiBMT05HX0FDSyAqLyk7XHJcbiAgICAgICAgaWYgKCFyZXN1bHRzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCgoX2EgPSByZXN1bHRzWzBdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZnVsZmlsbGVkKSAmJlxyXG4gICAgICAgICAgICAoKF9iID0gcmVzdWx0c1swXSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnZhbHVlLmluY2x1ZGVzKFwia2V5Q2hhbmdlZFwiIC8qIEtFWV9DSEFOR0VEICovKSkpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlV29ya2VyUmVjZWl2ZXJBdmFpbGFibGUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogTGV0IHRoZSB3b3JrZXIga25vdyBhYm91dCBhIGNoYW5nZWQga2V5LCB0aGUgZXhhY3Qga2V5IGRvZXNuJ3QgdGVjaG5pY2FsbHkgbWF0dGVyIHNpbmNlIHRoZVxyXG4gICAgICogd29ya2VyIHdpbGwganVzdCB0cmlnZ2VyIGEgZnVsbCBzeW5jIGFueXdheS5cclxuICAgICAqXHJcbiAgICAgKiBAcmVtYXJrc1xyXG4gICAgICogRm9yIG5vdywgd2Ugb25seSBzdXBwb3J0IG9uZSBzZXJ2aWNlIHdvcmtlciBwZXIgcGFnZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ga2V5IC0gU3RvcmFnZSBrZXkgd2hpY2ggY2hhbmdlZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgbm90aWZ5U2VydmljZVdvcmtlcihrZXkpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc2VuZGVyIHx8XHJcbiAgICAgICAgICAgICF0aGlzLmFjdGl2ZVNlcnZpY2VXb3JrZXIgfHxcclxuICAgICAgICAgICAgX2dldFNlcnZpY2VXb3JrZXJDb250cm9sbGVyKCkgIT09IHRoaXMuYWN0aXZlU2VydmljZVdvcmtlcikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2VuZGVyLl9zZW5kKFwia2V5Q2hhbmdlZFwiIC8qIEtFWV9DSEFOR0VEICovLCB7IGtleSB9LCBcclxuICAgICAgICAgICAgLy8gVXNlIGxvbmcgdGltZW91dCBpZiByZWNlaXZlciBoYXMgcHJldmlvdXNseSByZXNwb25kZWQgdG8gYSBwaW5nIGZyb20gdXMuXHJcbiAgICAgICAgICAgIHRoaXMuc2VydmljZVdvcmtlclJlY2VpdmVyQXZhaWxhYmxlXHJcbiAgICAgICAgICAgICAgICA/IDgwMCAvKiBMT05HX0FDSyAqL1xyXG4gICAgICAgICAgICAgICAgOiA1MCAvKiBBQ0sgKi8pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGJlc3QgZWZmb3J0IGFwcHJvYWNoLiBJZ25vcmUgZXJyb3JzLlxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIF9pc0F2YWlsYWJsZSgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoIWluZGV4ZWREQikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGRiID0gYXdhaXQgX29wZW5EYXRhYmFzZSgpO1xyXG4gICAgICAgICAgICBhd2FpdCBfcHV0T2JqZWN0KGRiLCBTVE9SQUdFX0FWQUlMQUJMRV9LRVksICcxJyk7XHJcbiAgICAgICAgICAgIGF3YWl0IF9kZWxldGVPYmplY3QoZGIsIFNUT1JBR0VfQVZBSUxBQkxFX0tFWSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoX2EpIHsgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGFzeW5jIF93aXRoUGVuZGluZ1dyaXRlKHdyaXRlKSB7XHJcbiAgICAgICAgdGhpcy5wZW5kaW5nV3JpdGVzKys7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgd3JpdGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ1dyaXRlcy0tO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIF9zZXQoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl93aXRoUGVuZGluZ1dyaXRlKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fd2l0aFJldHJpZXMoKGRiKSA9PiBfcHV0T2JqZWN0KGRiLCBrZXksIHZhbHVlKSk7XHJcbiAgICAgICAgICAgIHRoaXMubG9jYWxDYWNoZVtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5vdGlmeVNlcnZpY2VXb3JrZXIoa2V5KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGFzeW5jIF9nZXQoa2V5KSB7XHJcbiAgICAgICAgY29uc3Qgb2JqID0gKGF3YWl0IHRoaXMuX3dpdGhSZXRyaWVzKChkYikgPT4gZ2V0T2JqZWN0KGRiLCBrZXkpKSk7XHJcbiAgICAgICAgdGhpcy5sb2NhbENhY2hlW2tleV0gPSBvYmo7XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxuICAgIGFzeW5jIF9yZW1vdmUoa2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpdGhQZW5kaW5nV3JpdGUoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl93aXRoUmV0cmllcygoZGIpID0+IF9kZWxldGVPYmplY3QoZGIsIGtleSkpO1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5sb2NhbENhY2hlW2tleV07XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5vdGlmeVNlcnZpY2VXb3JrZXIoa2V5KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGFzeW5jIF9wb2xsKCkge1xyXG4gICAgICAgIC8vIFRPRE86IGNoZWNrIGlmIHdlIG5lZWQgdG8gZmFsbGJhY2sgaWYgZ2V0QWxsIGlzIG5vdCBzdXBwb3J0ZWRcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl93aXRoUmV0cmllcygoZGIpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZ2V0QWxsUmVxdWVzdCA9IGdldE9iamVjdFN0b3JlKGRiLCBmYWxzZSkuZ2V0QWxsKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgREJQcm9taXNlKGdldEFsbFJlcXVlc3QpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICghcmVzdWx0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBwZW5kaW5nIHdyaXRlcyBpbiBwcm9ncmVzcyBhYm9ydCwgd2UnbGwgZ2V0IHBpY2tlZCB1cCBvbiB0aGUgbmV4dCBwb2xsXHJcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ1dyaXRlcyAhPT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGtleXMgPSBbXTtcclxuICAgICAgICBjb25zdCBrZXlzSW5SZXN1bHQgPSBuZXcgU2V0KCk7XHJcbiAgICAgICAgZm9yIChjb25zdCB7IGZiYXNlX2tleToga2V5LCB2YWx1ZSB9IG9mIHJlc3VsdCkge1xyXG4gICAgICAgICAgICBrZXlzSW5SZXN1bHQuYWRkKGtleSk7XHJcbiAgICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeSh0aGlzLmxvY2FsQ2FjaGVba2V5XSkgIT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlMaXN0ZW5lcnMoa2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBrZXlzLnB1c2goa2V5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGNvbnN0IGxvY2FsS2V5IG9mIE9iamVjdC5rZXlzKHRoaXMubG9jYWxDYWNoZSkpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubG9jYWxDYWNoZVtsb2NhbEtleV0gJiYgIWtleXNJblJlc3VsdC5oYXMobG9jYWxLZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBEZWxldGVkXHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUxpc3RlbmVycyhsb2NhbEtleSwgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICBrZXlzLnB1c2gobG9jYWxLZXkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBrZXlzO1xyXG4gICAgfVxyXG4gICAgbm90aWZ5TGlzdGVuZXJzKGtleSwgbmV3VmFsdWUpIHtcclxuICAgICAgICB0aGlzLmxvY2FsQ2FjaGVba2V5XSA9IG5ld1ZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzW2tleV07XHJcbiAgICAgICAgaWYgKGxpc3RlbmVycykge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIEFycmF5LmZyb20obGlzdGVuZXJzKSkge1xyXG4gICAgICAgICAgICAgICAgbGlzdGVuZXIobmV3VmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhcnRQb2xsaW5nKCkge1xyXG4gICAgICAgIHRoaXMuc3RvcFBvbGxpbmcoKTtcclxuICAgICAgICB0aGlzLnBvbGxUaW1lciA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHRoaXMuX3BvbGwoKSwgX1BPTExJTkdfSU5URVJWQUxfTVMpO1xyXG4gICAgfVxyXG4gICAgc3RvcFBvbGxpbmcoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucG9sbFRpbWVyKSB7XHJcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5wb2xsVGltZXIpO1xyXG4gICAgICAgICAgICB0aGlzLnBvbGxUaW1lciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgX2FkZExpc3RlbmVyKGtleSwgbGlzdGVuZXIpIHtcclxuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5saXN0ZW5lcnMpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXJ0UG9sbGluZygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMubGlzdGVuZXJzW2tleV0pIHtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNba2V5XSA9IG5ldyBTZXQoKTtcclxuICAgICAgICAgICAgLy8gUG9wdWxhdGUgdGhlIGNhY2hlIHRvIGF2b2lkIHNwdXJpb3VzbHkgdHJpZ2dlcmluZyBvbiBmaXJzdCBwb2xsLlxyXG4gICAgICAgICAgICB2b2lkIHRoaXMuX2dldChrZXkpOyAvLyBUaGlzIGNhbiBoYXBwZW4gaW4gdGhlIGJhY2tncm91bmQgYXN5bmMgYW5kIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHkuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGlzdGVuZXJzW2tleV0uYWRkKGxpc3RlbmVyKTtcclxuICAgIH1cclxuICAgIF9yZW1vdmVMaXN0ZW5lcihrZXksIGxpc3RlbmVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubGlzdGVuZXJzW2tleV0pIHtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNba2V5XS5kZWxldGUobGlzdGVuZXIpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5saXN0ZW5lcnNba2V5XS5zaXplID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5saXN0ZW5lcnNba2V5XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5saXN0ZW5lcnMpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnN0b3BQb2xsaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbkluZGV4ZWREQkxvY2FsUGVyc2lzdGVuY2UudHlwZSA9ICdMT0NBTCc7XHJcbi8qKlxyXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgUGVyc2lzdGVuY2V9IG9mIHR5cGUgYExPQ0FMYCB1c2luZyBgaW5kZXhlZERCYFxyXG4gKiBmb3IgdGhlIHVuZGVybHlpbmcgc3RvcmFnZS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY29uc3QgaW5kZXhlZERCTG9jYWxQZXJzaXN0ZW5jZSA9IEluZGV4ZWREQkxvY2FsUGVyc2lzdGVuY2U7XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIHN0YXJ0U2lnbkluUGhvbmVNZmEoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdChhdXRoLCBcIlBPU1RcIiAvKiBQT1NUICovLCBcIi92Mi9hY2NvdW50cy9tZmFTaWduSW46c3RhcnRcIiAvKiBTVEFSVF9QSE9ORV9NRkFfU0lHTl9JTiAqLywgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpKTtcclxufVxyXG5mdW5jdGlvbiBmaW5hbGl6ZVNpZ25JblBob25lTWZhKGF1dGgsIHJlcXVlc3QpIHtcclxuICAgIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3QoYXV0aCwgXCJQT1NUXCIgLyogUE9TVCAqLywgXCIvdjIvYWNjb3VudHMvbWZhU2lnbkluOmZpbmFsaXplXCIgLyogRklOQUxJWkVfUEhPTkVfTUZBX1NJR05fSU4gKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gZ2V0UmVjYXB0Y2hhUGFyYW1zKGF1dGgpIHtcclxuICAgIHJldHVybiAoKGF3YWl0IF9wZXJmb3JtQXBpUmVxdWVzdChhdXRoLCBcIkdFVFwiIC8qIEdFVCAqLywgXCIvdjEvcmVjYXB0Y2hhUGFyYW1zXCIgLyogR0VUX1JFQ0FQVENIQV9QQVJBTSAqLykpLnJlY2FwdGNoYVNpdGVLZXkgfHwgJycpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIGdldFNjcmlwdFBhcmVudEVsZW1lbnQoKSB7XHJcbiAgICB2YXIgX2EsIF9iO1xyXG4gICAgcmV0dXJuIChfYiA9IChfYSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJykpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYVswXSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogZG9jdW1lbnQ7XHJcbn1cclxuZnVuY3Rpb24gX2xvYWRKUyh1cmwpIHtcclxuICAgIC8vIFRPRE86IGNvbnNpZGVyIGFkZGluZyB0aW1lb3V0IHN1cHBvcnQgJiBjYW5jZWxsYXRpb25cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcclxuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3NyYycsIHVybCk7XHJcbiAgICAgICAgZWwub25sb2FkID0gcmVzb2x2ZTtcclxuICAgICAgICBlbC5vbmVycm9yID0gZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gX2NyZWF0ZUVycm9yKFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgICAgIGVycm9yLmN1c3RvbURhdGEgPSBlO1xyXG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgZWwudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnO1xyXG4gICAgICAgIGVsLmNoYXJzZXQgPSAnVVRGLTgnO1xyXG4gICAgICAgIGdldFNjcmlwdFBhcmVudEVsZW1lbnQoKS5hcHBlbmRDaGlsZChlbCk7XHJcbiAgICB9KTtcclxufVxyXG5mdW5jdGlvbiBfZ2VuZXJhdGVDYWxsYmFja05hbWUocHJlZml4KSB7XHJcbiAgICByZXR1cm4gYF9fJHtwcmVmaXh9JHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwKX1gO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IF9TT0xWRV9USU1FX01TID0gNTAwO1xyXG5jb25zdCBfRVhQSVJBVElPTl9USU1FX01TID0gNjAwMDA7XHJcbmNvbnN0IF9XSURHRVRfSURfU1RBUlQgPSAxMDAwMDAwMDAwMDAwO1xyXG5jbGFzcyBNb2NrUmVDYXB0Y2hhIHtcclxuICAgIGNvbnN0cnVjdG9yKGF1dGgpIHtcclxuICAgICAgICB0aGlzLmF1dGggPSBhdXRoO1xyXG4gICAgICAgIHRoaXMuY291bnRlciA9IF9XSURHRVRfSURfU1RBUlQ7XHJcbiAgICAgICAgdGhpcy5fd2lkZ2V0cyA9IG5ldyBNYXAoKTtcclxuICAgIH1cclxuICAgIHJlbmRlcihjb250YWluZXIsIHBhcmFtZXRlcnMpIHtcclxuICAgICAgICBjb25zdCBpZCA9IHRoaXMuY291bnRlcjtcclxuICAgICAgICB0aGlzLl93aWRnZXRzLnNldChpZCwgbmV3IE1vY2tXaWRnZXQoY29udGFpbmVyLCB0aGlzLmF1dGgubmFtZSwgcGFyYW1ldGVycyB8fCB7fSkpO1xyXG4gICAgICAgIHRoaXMuY291bnRlcisrO1xyXG4gICAgICAgIHJldHVybiBpZDtcclxuICAgIH1cclxuICAgIHJlc2V0KG9wdFdpZGdldElkKSB7XHJcbiAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgIGNvbnN0IGlkID0gb3B0V2lkZ2V0SWQgfHwgX1dJREdFVF9JRF9TVEFSVDtcclxuICAgICAgICB2b2lkICgoX2EgPSB0aGlzLl93aWRnZXRzLmdldChpZCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kZWxldGUoKSk7XHJcbiAgICAgICAgdGhpcy5fd2lkZ2V0cy5kZWxldGUoaWQpO1xyXG4gICAgfVxyXG4gICAgZ2V0UmVzcG9uc2Uob3B0V2lkZ2V0SWQpIHtcclxuICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgY29uc3QgaWQgPSBvcHRXaWRnZXRJZCB8fCBfV0lER0VUX0lEX1NUQVJUO1xyXG4gICAgICAgIHJldHVybiAoKF9hID0gdGhpcy5fd2lkZ2V0cy5nZXQoaWQpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ2V0UmVzcG9uc2UoKSkgfHwgJyc7XHJcbiAgICB9XHJcbiAgICBhc3luYyBleGVjdXRlKG9wdFdpZGdldElkKSB7XHJcbiAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgIGNvbnN0IGlkID0gb3B0V2lkZ2V0SWQgfHwgX1dJREdFVF9JRF9TVEFSVDtcclxuICAgICAgICB2b2lkICgoX2EgPSB0aGlzLl93aWRnZXRzLmdldChpZCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5leGVjdXRlKCkpO1xyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxufVxyXG5jbGFzcyBNb2NrV2lkZ2V0IHtcclxuICAgIGNvbnN0cnVjdG9yKGNvbnRhaW5lck9ySWQsIGFwcE5hbWUsIHBhcmFtcykge1xyXG4gICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xyXG4gICAgICAgIHRoaXMudGltZXJJZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5kZWxldGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5yZXNwb25zZVRva2VuID0gbnVsbDtcclxuICAgICAgICB0aGlzLmNsaWNrSGFuZGxlciA9ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5leGVjdXRlKCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0eXBlb2YgY29udGFpbmVyT3JJZCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb250YWluZXJPcklkKVxyXG4gICAgICAgICAgICA6IGNvbnRhaW5lck9ySWQ7XHJcbiAgICAgICAgX2Fzc2VydChjb250YWluZXIsIFwiYXJndW1lbnQtZXJyb3JcIiAvKiBBUkdVTUVOVF9FUlJPUiAqLywgeyBhcHBOYW1lIH0pO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xyXG4gICAgICAgIHRoaXMuaXNWaXNpYmxlID0gdGhpcy5wYXJhbXMuc2l6ZSAhPT0gJ2ludmlzaWJsZSc7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXhlY3V0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNsaWNrSGFuZGxlcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0UmVzcG9uc2UoKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0lmRGVsZXRlZCgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlc3BvbnNlVG9rZW47XHJcbiAgICB9XHJcbiAgICBkZWxldGUoKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0lmRGVsZXRlZCgpO1xyXG4gICAgICAgIHRoaXMuZGVsZXRlZCA9IHRydWU7XHJcbiAgICAgICAgaWYgKHRoaXMudGltZXJJZCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcklkKTtcclxuICAgICAgICAgICAgdGhpcy50aW1lcklkID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNsaWNrSGFuZGxlcik7XHJcbiAgICB9XHJcbiAgICBleGVjdXRlKCkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tJZkRlbGV0ZWQoKTtcclxuICAgICAgICBpZiAodGhpcy50aW1lcklkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50aW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNlVG9rZW4gPSBnZW5lcmF0ZVJhbmRvbUFscGhhTnVtZXJpY1N0cmluZyg1MCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssICdleHBpcmVkLWNhbGxiYWNrJzogZXhwaXJlZENhbGxiYWNrIH0gPSB0aGlzLnBhcmFtcztcclxuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHRoaXMucmVzcG9uc2VUb2tlbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkgeyB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy50aW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50aW1lcklkID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2VUb2tlbiA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXhwaXJlZENhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlZENhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7IH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCBfRVhQSVJBVElPTl9USU1FX01TKTtcclxuICAgICAgICB9LCBfU09MVkVfVElNRV9NUyk7XHJcbiAgICB9XHJcbiAgICBjaGVja0lmRGVsZXRlZCgpIHtcclxuICAgICAgICBpZiAodGhpcy5kZWxldGVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmVDQVBUQ0hBIG1vY2sgd2FzIGFscmVhZHkgZGVsZXRlZCEnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gZ2VuZXJhdGVSYW5kb21BbHBoYU51bWVyaWNTdHJpbmcobGVuKSB7XHJcbiAgICBjb25zdCBjaGFycyA9IFtdO1xyXG4gICAgY29uc3QgYWxsb3dlZENoYXJzID0gJzEyMzQ1Njc4OTBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJztcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICBjaGFycy5wdXNoKGFsbG93ZWRDaGFycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYWxsb3dlZENoYXJzLmxlbmd0aCkpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBjaGFycy5qb2luKCcnKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vLyBSZUNhcHRjaGEgd2lsbCBsb2FkIHVzaW5nIHRoZSBzYW1lIGNhbGxiYWNrLCBzbyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gbmVlZHNcclxuLy8gdG8gYmUga2VwdCBhcm91bmRcclxuY29uc3QgX0pTTE9BRF9DQUxMQkFDSyA9IF9nZW5lcmF0ZUNhbGxiYWNrTmFtZSgncmNiJyk7XHJcbmNvbnN0IE5FVFdPUktfVElNRU9VVF9ERUxBWSA9IG5ldyBEZWxheSgzMDAwMCwgNjAwMDApO1xyXG5jb25zdCBSRUNBUFRDSEFfQkFTRSA9ICdodHRwczovL3d3dy5nb29nbGUuY29tL3JlY2FwdGNoYS9hcGkuanM/JztcclxuLyoqXHJcbiAqIExvYWRlciBmb3IgdGhlIEdSZUNhcHRjaGEgbGlicmFyeS4gVGhlcmUgc2hvdWxkIG9ubHkgZXZlciBiZSBvbmUgb2YgdGhpcy5cclxuICovXHJcbmNsYXNzIFJlQ2FwdGNoYUxvYWRlckltcGwge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5ob3N0TGFuZ3VhZ2UgPSAnJztcclxuICAgICAgICB0aGlzLmNvdW50ZXIgPSAwO1xyXG4gICAgICAgIHRoaXMubGlicmFyeVNlcGFyYXRlbHlMb2FkZWQgPSAhIV93aW5kb3coKS5ncmVjYXB0Y2hhO1xyXG4gICAgfVxyXG4gICAgbG9hZChhdXRoLCBobCA9ICcnKSB7XHJcbiAgICAgICAgX2Fzc2VydChpc0hvc3RMYW5ndWFnZVZhbGlkKGhsKSwgYXV0aCwgXCJhcmd1bWVudC1lcnJvclwiIC8qIEFSR1VNRU5UX0VSUk9SICovKTtcclxuICAgICAgICBpZiAodGhpcy5zaG91bGRSZXNvbHZlSW1tZWRpYXRlbHkoaGwpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoX3dpbmRvdygpLmdyZWNhcHRjaGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBuZXR3b3JrVGltZW91dCA9IF93aW5kb3coKS5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChfY3JlYXRlRXJyb3IoYXV0aCwgXCJuZXR3b3JrLXJlcXVlc3QtZmFpbGVkXCIgLyogTkVUV09SS19SRVFVRVNUX0ZBSUxFRCAqLykpO1xyXG4gICAgICAgICAgICB9LCBORVRXT1JLX1RJTUVPVVRfREVMQVkuZ2V0KCkpO1xyXG4gICAgICAgICAgICBfd2luZG93KClbX0pTTE9BRF9DQUxMQkFDS10gPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBfd2luZG93KCkuY2xlYXJUaW1lb3V0KG5ldHdvcmtUaW1lb3V0KTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBfd2luZG93KClbX0pTTE9BRF9DQUxMQkFDS107XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWNhcHRjaGEgPSBfd2luZG93KCkuZ3JlY2FwdGNoYTtcclxuICAgICAgICAgICAgICAgIGlmICghcmVjYXB0Y2hhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KF9jcmVhdGVFcnJvcihhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBXcmFwIHRoZSBncmVwdGNoYSByZW5kZXIgZnVuY3Rpb24gc28gdGhhdCB3ZSBrbm93IGlmIHRoZSBkZXZlbG9wZXIgaGFzXHJcbiAgICAgICAgICAgICAgICAvLyBjYWxsZWQgaXQgc2VwYXJhdGVseVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVuZGVyID0gcmVjYXB0Y2hhLnJlbmRlcjtcclxuICAgICAgICAgICAgICAgIHJlY2FwdGNoYS5yZW5kZXIgPSAoY29udGFpbmVyLCBwYXJhbXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB3aWRnZXRJZCA9IHJlbmRlcihjb250YWluZXIsIHBhcmFtcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudGVyKys7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpZGdldElkO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaG9zdExhbmd1YWdlID0gaGw7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlY2FwdGNoYSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IGAke1JFQ0FQVENIQV9CQVNFfT8ke3F1ZXJ5c3RyaW5nKHtcclxuICAgICAgICAgICAgICAgIG9ubG9hZDogX0pTTE9BRF9DQUxMQkFDSyxcclxuICAgICAgICAgICAgICAgIHJlbmRlcjogJ2V4cGxpY2l0JyxcclxuICAgICAgICAgICAgICAgIGhsXHJcbiAgICAgICAgICAgIH0pfWA7XHJcbiAgICAgICAgICAgIF9sb2FkSlModXJsKS5jYXRjaCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQobmV0d29ya1RpbWVvdXQpO1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KF9jcmVhdGVFcnJvcihhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBjbGVhcmVkT25lSW5zdGFuY2UoKSB7XHJcbiAgICAgICAgdGhpcy5jb3VudGVyLS07XHJcbiAgICB9XHJcbiAgICBzaG91bGRSZXNvbHZlSW1tZWRpYXRlbHkoaGwpIHtcclxuICAgICAgICAvLyBXZSBjYW4gcmVzb2x2ZSBpbW1lZGlhdGVseSBpZjpcclxuICAgICAgICAvLyAgIOKAoiBncmVjYXB0Y2hhIGlzIGFscmVhZHkgZGVmaW5lZCBBTkQgKFxyXG4gICAgICAgIC8vICAgICAxLiB0aGUgcmVxdWVzdGVkIGxhbmd1YWdlIGNvZGVzIGFyZSB0aGUgc2FtZSBPUlxyXG4gICAgICAgIC8vICAgICAyLiB0aGVyZSBleGlzdHMgYWxyZWFkeSBhIFJlQ2FwdGNoYSBvbiB0aGUgcGFnZVxyXG4gICAgICAgIC8vICAgICAzLiB0aGUgbGlicmFyeSB3YXMgYWxyZWFkeSBsb2FkZWQgYnkgdGhlIGFwcFxyXG4gICAgICAgIC8vIEluIGNhc2VzICgyKSBhbmQgKDMpLCB3ZSBfY2FuJ3RfIHJlbG9hZCBhcyBpdCB3b3VsZCBicmVhayB0aGUgcmVjYXB0Y2hhc1xyXG4gICAgICAgIC8vIHRoYXQgYXJlIGFscmVhZHkgaW4gdGhlIHBhZ2VcclxuICAgICAgICByZXR1cm4gKCEhX3dpbmRvdygpLmdyZWNhcHRjaGEgJiZcclxuICAgICAgICAgICAgKGhsID09PSB0aGlzLmhvc3RMYW5ndWFnZSB8fFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudGVyID4gMCB8fFxyXG4gICAgICAgICAgICAgICAgdGhpcy5saWJyYXJ5U2VwYXJhdGVseUxvYWRlZCkpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGlzSG9zdExhbmd1YWdlVmFsaWQoaGwpIHtcclxuICAgIHJldHVybiBobC5sZW5ndGggPD0gNiAmJiAvXlxccypbYS16QS1aMC05XFwtXSpcXHMqJC8udGVzdChobCk7XHJcbn1cclxuY2xhc3MgTW9ja1JlQ2FwdGNoYUxvYWRlckltcGwge1xyXG4gICAgYXN5bmMgbG9hZChhdXRoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBNb2NrUmVDYXB0Y2hhKGF1dGgpO1xyXG4gICAgfVxyXG4gICAgY2xlYXJlZE9uZUluc3RhbmNlKCkgeyB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgUkVDQVBUQ0hBX1ZFUklGSUVSX1RZUEUgPSAncmVjYXB0Y2hhJztcclxuY29uc3QgREVGQVVMVF9QQVJBTVMgPSB7XHJcbiAgICB0aGVtZTogJ2xpZ2h0JyxcclxuICAgIHR5cGU6ICdpbWFnZSdcclxufTtcclxuLyoqXHJcbiAqIEFuIHtAbGluayBodHRwczovL3d3dy5nb29nbGUuY29tL3JlY2FwdGNoYS8gfCByZUNBUFRDSEF9LWJhc2VkIGFwcGxpY2F0aW9uIHZlcmlmaWVyLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jbGFzcyBSZWNhcHRjaGFWZXJpZmllciB7XHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY29udGFpbmVyT3JJZCAtIFRoZSByZUNBUFRDSEEgY29udGFpbmVyIHBhcmFtZXRlci5cclxuICAgICAqXHJcbiAgICAgKiBAcmVtYXJrc1xyXG4gICAgICogVGhpcyBoYXMgZGlmZmVyZW50IG1lYW5pbmcgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHJlQ0FQVENIQSBpcyBoaWRkZW4gb3IgdmlzaWJsZS4gRm9yIGFcclxuICAgICAqIHZpc2libGUgcmVDQVBUQ0hBIHRoZSBjb250YWluZXIgbXVzdCBiZSBlbXB0eS4gSWYgYSBzdHJpbmcgaXMgdXNlZCwgaXQgaGFzIHRvIGNvcnJlc3BvbmQgdG9cclxuICAgICAqIGFuIGVsZW1lbnQgSUQuIFRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgbXVzdCBhbHNvIG11c3QgYmUgaW4gdGhlIERPTSBhdCB0aGUgdGltZSBvZlxyXG4gICAgICogaW5pdGlhbGl6YXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHBhcmFtZXRlcnMgLSBUaGUgb3B0aW9uYWwgcmVDQVBUQ0hBIHBhcmFtZXRlcnMuXHJcbiAgICAgKlxyXG4gICAgICogQHJlbWFya3NcclxuICAgICAqIENoZWNrIHRoZSByZUNBUFRDSEEgZG9jcyBmb3IgYSBjb21wcmVoZW5zaXZlIGxpc3QuIEFsbCBwYXJhbWV0ZXJzIGFyZSBhY2NlcHRlZCBleGNlcHQgZm9yXHJcbiAgICAgKiB0aGUgc2l0ZWtleS4gRmlyZWJhc2UgQXV0aCBiYWNrZW5kIHByb3Zpc2lvbnMgYSByZUNBUFRDSEEgZm9yIGVhY2ggcHJvamVjdCBhbmQgd2lsbFxyXG4gICAgICogY29uZmlndXJlIHRoaXMgdXBvbiByZW5kZXJpbmcuIEZvciBhbiBpbnZpc2libGUgcmVDQVBUQ0hBLCBhIHNpemUga2V5IG11c3QgaGF2ZSB0aGUgdmFsdWVcclxuICAgICAqICdpbnZpc2libGUnLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBhdXRoRXh0ZXJuIC0gVGhlIGNvcnJlc3BvbmRpbmcgRmlyZWJhc2Uge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxyXG4gICAgICpcclxuICAgICAqIEByZW1hcmtzXHJcbiAgICAgKiBJZiBub25lIGlzIHByb3ZpZGVkLCB0aGUgZGVmYXVsdCBGaXJlYmFzZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UgaXMgdXNlZC4gQSBGaXJlYmFzZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2VcclxuICAgICAqIG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhbiBBUEkga2V5LCBvdGhlcndpc2UgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24uXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKGNvbnRhaW5lck9ySWQsIHBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1BBUkFNUyksIGF1dGhFeHRlcm4pIHtcclxuICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBhcHBsaWNhdGlvbiB2ZXJpZmllciB0eXBlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHJlbWFya3NcclxuICAgICAgICAgKiBGb3IgYSByZUNBUFRDSEEgdmVyaWZpZXIsIHRoaXMgaXMgJ3JlY2FwdGNoYScuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50eXBlID0gUkVDQVBUQ0hBX1ZFUklGSUVSX1RZUEU7XHJcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLndpZGdldElkID0gbnVsbDtcclxuICAgICAgICB0aGlzLnRva2VuQ2hhbmdlTGlzdGVuZXJzID0gbmV3IFNldCgpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyUHJvbWlzZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5yZWNhcHRjaGEgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuYXV0aCA9IF9jYXN0QXV0aChhdXRoRXh0ZXJuKTtcclxuICAgICAgICB0aGlzLmlzSW52aXNpYmxlID0gdGhpcy5wYXJhbWV0ZXJzLnNpemUgPT09ICdpbnZpc2libGUnO1xyXG4gICAgICAgIF9hc3NlcnQodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJywgdGhpcy5hdXRoLCBcIm9wZXJhdGlvbi1ub3Qtc3VwcG9ydGVkLWluLXRoaXMtZW52aXJvbm1lbnRcIiAvKiBPUEVSQVRJT05fTk9UX1NVUFBPUlRFRCAqLyk7XHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdHlwZW9mIGNvbnRhaW5lck9ySWQgPT09ICdzdHJpbmcnXHJcbiAgICAgICAgICAgID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29udGFpbmVyT3JJZClcclxuICAgICAgICAgICAgOiBjb250YWluZXJPcklkO1xyXG4gICAgICAgIF9hc3NlcnQoY29udGFpbmVyLCB0aGlzLmF1dGgsIFwiYXJndW1lbnQtZXJyb3JcIiAvKiBBUkdVTUVOVF9FUlJPUiAqLyk7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XHJcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLmNhbGxiYWNrID0gdGhpcy5tYWtlVG9rZW5DYWxsYmFjayh0aGlzLnBhcmFtZXRlcnMuY2FsbGJhY2spO1xyXG4gICAgICAgIHRoaXMuX3JlY2FwdGNoYUxvYWRlciA9IHRoaXMuYXV0aC5zZXR0aW5ncy5hcHBWZXJpZmljYXRpb25EaXNhYmxlZEZvclRlc3RpbmdcclxuICAgICAgICAgICAgPyBuZXcgTW9ja1JlQ2FwdGNoYUxvYWRlckltcGwoKVxyXG4gICAgICAgICAgICA6IG5ldyBSZUNhcHRjaGFMb2FkZXJJbXBsKCk7XHJcbiAgICAgICAgdGhpcy52YWxpZGF0ZVN0YXJ0aW5nU3RhdGUoKTtcclxuICAgICAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IGlmIHNkayB2ZXJzaW9uIGlzIG5lZWRlZFxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBXYWl0cyBmb3IgdGhlIHVzZXIgdG8gc29sdmUgdGhlIHJlQ0FQVENIQSBhbmQgcmVzb2x2ZXMgd2l0aCB0aGUgcmVDQVBUQ0hBIHRva2VuLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIEEgUHJvbWlzZSBmb3IgdGhlIHJlQ0FQVENIQSB0b2tlbi5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgdmVyaWZ5KCkge1xyXG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90RGVzdHJveWVkKCk7XHJcbiAgICAgICAgY29uc3QgaWQgPSBhd2FpdCB0aGlzLnJlbmRlcigpO1xyXG4gICAgICAgIGNvbnN0IHJlY2FwdGNoYSA9IHRoaXMuZ2V0QXNzZXJ0ZWRSZWNhcHRjaGEoKTtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlY2FwdGNoYS5nZXRSZXNwb25zZShpZCk7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB0b2tlbkNoYW5nZSA9ICh0b2tlbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0b2tlbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gSWdub3JlIHRva2VuIGV4cGlyYXRpb25zLlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy50b2tlbkNoYW5nZUxpc3RlbmVycy5kZWxldGUodG9rZW5DaGFuZ2UpO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0b2tlbik7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMudG9rZW5DaGFuZ2VMaXN0ZW5lcnMuYWRkKHRva2VuQ2hhbmdlKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNJbnZpc2libGUpIHtcclxuICAgICAgICAgICAgICAgIHJlY2FwdGNoYS5leGVjdXRlKGlkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW5kZXJzIHRoZSByZUNBUFRDSEEgd2lkZ2V0IG9uIHRoZSBwYWdlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlQ0FQVENIQSB3aWRnZXQgSUQuXHJcbiAgICAgKi9cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLmFzc2VydE5vdERlc3Ryb3llZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvLyBUaGlzIG1ldGhvZCByZXR1cm5zIGEgcHJvbWlzZS4gU2luY2UgaXQncyBub3QgYXN5bmMgKHdlIHdhbnQgdG8gcmV0dXJuIHRoZVxyXG4gICAgICAgICAgICAvLyBfc2FtZV8gcHJvbWlzZSBpZiByZW5kZXJpbmcgaXMgc3RpbGwgb2NjdXJyaW5nKSwgdGhlIEFQSSBzdXJmYWNlIHNob3VsZFxyXG4gICAgICAgICAgICAvLyByZWplY3Qgd2l0aCB0aGUgZXJyb3IgcmF0aGVyIHRoYW4ganVzdCB0aHJvd1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnJlbmRlclByb21pc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyUHJvbWlzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZW5kZXJQcm9taXNlID0gdGhpcy5tYWtlUmVuZGVyUHJvbWlzZSgpLmNhdGNoKGUgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlclByb21pc2UgPSBudWxsO1xyXG4gICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlclByb21pc2U7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBfcmVzZXQoKSB7XHJcbiAgICAgICAgdGhpcy5hc3NlcnROb3REZXN0cm95ZWQoKTtcclxuICAgICAgICBpZiAodGhpcy53aWRnZXRJZCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLmdldEFzc2VydGVkUmVjYXB0Y2hhKCkucmVzZXQodGhpcy53aWRnZXRJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgdGhlIHJlQ0FQVENIQSB3aWRnZXQgZnJvbSB0aGUgcGFnZSBhbmQgZGVzdHJveXMgdGhlIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBjbGVhcigpIHtcclxuICAgICAgICB0aGlzLmFzc2VydE5vdERlc3Ryb3llZCgpO1xyXG4gICAgICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9yZWNhcHRjaGFMb2FkZXIuY2xlYXJlZE9uZUluc3RhbmNlKCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW52aXNpYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNoaWxkTm9kZXMuZm9yRWFjaChub2RlID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUNoaWxkKG5vZGUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB2YWxpZGF0ZVN0YXJ0aW5nU3RhdGUoKSB7XHJcbiAgICAgICAgX2Fzc2VydCghdGhpcy5wYXJhbWV0ZXJzLnNpdGVrZXksIHRoaXMuYXV0aCwgXCJhcmd1bWVudC1lcnJvclwiIC8qIEFSR1VNRU5UX0VSUk9SICovKTtcclxuICAgICAgICBfYXNzZXJ0KHRoaXMuaXNJbnZpc2libGUgfHwgIXRoaXMuY29udGFpbmVyLmhhc0NoaWxkTm9kZXMoKSwgdGhpcy5hdXRoLCBcImFyZ3VtZW50LWVycm9yXCIgLyogQVJHVU1FTlRfRVJST1IgKi8pO1xyXG4gICAgICAgIF9hc3NlcnQodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJywgdGhpcy5hdXRoLCBcIm9wZXJhdGlvbi1ub3Qtc3VwcG9ydGVkLWluLXRoaXMtZW52aXJvbm1lbnRcIiAvKiBPUEVSQVRJT05fTk9UX1NVUFBPUlRFRCAqLyk7XHJcbiAgICB9XHJcbiAgICBtYWtlVG9rZW5DYWxsYmFjayhleGlzdGluZykge1xyXG4gICAgICAgIHJldHVybiB0b2tlbiA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudG9rZW5DaGFuZ2VMaXN0ZW5lcnMuZm9yRWFjaChsaXN0ZW5lciA9PiBsaXN0ZW5lcih0b2tlbikpO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGV4aXN0aW5nID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICBleGlzdGluZyh0b2tlbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGV4aXN0aW5nID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ2xvYmFsRnVuYyA9IF93aW5kb3coKVtleGlzdGluZ107XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGdsb2JhbEZ1bmMgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICBnbG9iYWxGdW5jKHRva2VuKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBhc3NlcnROb3REZXN0cm95ZWQoKSB7XHJcbiAgICAgICAgX2Fzc2VydCghdGhpcy5kZXN0cm95ZWQsIHRoaXMuYXV0aCwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG1ha2VSZW5kZXJQcm9taXNlKCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xyXG4gICAgICAgIGlmICghdGhpcy53aWRnZXRJZCkge1xyXG4gICAgICAgICAgICBsZXQgY29udGFpbmVyID0gdGhpcy5jb250YWluZXI7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0ludmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ3VhcmFudGVlZEVtcHR5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZ3VhcmFudGVlZEVtcHR5KTtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGd1YXJhbnRlZWRFbXB0eTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLndpZGdldElkID0gdGhpcy5nZXRBc3NlcnRlZFJlY2FwdGNoYSgpLnJlbmRlcihjb250YWluZXIsIHRoaXMucGFyYW1ldGVycyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLndpZGdldElkO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgaW5pdCgpIHtcclxuICAgICAgICBfYXNzZXJ0KF9pc0h0dHBPckh0dHBzKCkgJiYgIV9pc1dvcmtlcigpLCB0aGlzLmF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgYXdhaXQgZG9tUmVhZHkoKTtcclxuICAgICAgICB0aGlzLnJlY2FwdGNoYSA9IGF3YWl0IHRoaXMuX3JlY2FwdGNoYUxvYWRlci5sb2FkKHRoaXMuYXV0aCwgdGhpcy5hdXRoLmxhbmd1YWdlQ29kZSB8fCB1bmRlZmluZWQpO1xyXG4gICAgICAgIGNvbnN0IHNpdGVLZXkgPSBhd2FpdCBnZXRSZWNhcHRjaGFQYXJhbXModGhpcy5hdXRoKTtcclxuICAgICAgICBfYXNzZXJ0KHNpdGVLZXksIHRoaXMuYXV0aCwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovKTtcclxuICAgICAgICB0aGlzLnBhcmFtZXRlcnMuc2l0ZWtleSA9IHNpdGVLZXk7XHJcbiAgICB9XHJcbiAgICBnZXRBc3NlcnRlZFJlY2FwdGNoYSgpIHtcclxuICAgICAgICBfYXNzZXJ0KHRoaXMucmVjYXB0Y2hhLCB0aGlzLmF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVjYXB0Y2hhO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGRvbVJlYWR5KCkge1xyXG4gICAgbGV0IHJlc29sdmVyID0gbnVsbDtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xyXG4gICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRG9jdW1lbnQgbm90IHJlYWR5LCB3YWl0IGZvciBsb2FkIGJlZm9yZSByZXNvbHZpbmcuXHJcbiAgICAgICAgLy8gU2F2ZSByZXNvbHZlciwgc28gd2UgY2FuIHJlbW92ZSBsaXN0ZW5lciBpbiBjYXNlIGl0IHdhcyBleHRlcm5hbGx5XHJcbiAgICAgICAgLy8gY2FuY2VsbGVkLlxyXG4gICAgICAgIHJlc29sdmVyID0gKCkgPT4gcmVzb2x2ZSgpO1xyXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgcmVzb2x2ZXIpO1xyXG4gICAgfSkuY2F0Y2goZSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc29sdmVyKSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgcmVzb2x2ZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aHJvdyBlO1xyXG4gICAgfSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgQ29uZmlybWF0aW9uUmVzdWx0SW1wbCB7XHJcbiAgICBjb25zdHJ1Y3Rvcih2ZXJpZmljYXRpb25JZCwgb25Db25maXJtYXRpb24pIHtcclxuICAgICAgICB0aGlzLnZlcmlmaWNhdGlvbklkID0gdmVyaWZpY2F0aW9uSWQ7XHJcbiAgICAgICAgdGhpcy5vbkNvbmZpcm1hdGlvbiA9IG9uQ29uZmlybWF0aW9uO1xyXG4gICAgfVxyXG4gICAgY29uZmlybSh2ZXJpZmljYXRpb25Db2RlKSB7XHJcbiAgICAgICAgY29uc3QgYXV0aENyZWRlbnRpYWwgPSBQaG9uZUF1dGhDcmVkZW50aWFsLl9mcm9tVmVyaWZpY2F0aW9uKHRoaXMudmVyaWZpY2F0aW9uSWQsIHZlcmlmaWNhdGlvbkNvZGUpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9uQ29uZmlybWF0aW9uKGF1dGhDcmVkZW50aWFsKTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogQXN5bmNocm9ub3VzbHkgc2lnbnMgaW4gdXNpbmcgYSBwaG9uZSBudW1iZXIuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIFRoaXMgbWV0aG9kIHNlbmRzIGEgY29kZSB2aWEgU01TIHRvIHRoZSBnaXZlblxyXG4gKiBwaG9uZSBudW1iZXIsIGFuZCByZXR1cm5zIGEge0BsaW5rIENvbmZpcm1hdGlvblJlc3VsdH0uIEFmdGVyIHRoZSB1c2VyXHJcbiAqIHByb3ZpZGVzIHRoZSBjb2RlIHNlbnQgdG8gdGhlaXIgcGhvbmUsIGNhbGwge0BsaW5rIENvbmZpcm1hdGlvblJlc3VsdC5jb25maXJtfVxyXG4gKiB3aXRoIHRoZSBjb2RlIHRvIHNpZ24gdGhlIHVzZXIgaW4uXHJcbiAqXHJcbiAqIEZvciBhYnVzZSBwcmV2ZW50aW9uLCB0aGlzIG1ldGhvZCBhbHNvIHJlcXVpcmVzIGEge0BsaW5rIEFwcGxpY2F0aW9uVmVyaWZpZXJ9LlxyXG4gKiBUaGlzIFNESyBpbmNsdWRlcyBhIHJlQ0FQVENIQS1iYXNlZCBpbXBsZW1lbnRhdGlvbiwge0BsaW5rIFJlY2FwdGNoYVZlcmlmaWVyfS5cclxuICogVGhpcyBmdW5jdGlvbiBjYW4gd29yayBvbiBvdGhlciBwbGF0Zm9ybXMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0aGVcclxuICoge0BsaW5rIFJlY2FwdGNoYVZlcmlmaWVyfSAobGlrZSBSZWFjdCBOYXRpdmUpLCBidXQgeW91IG5lZWQgdG8gdXNlIGFcclxuICogdGhpcmQtcGFydHkge0BsaW5rIEFwcGxpY2F0aW9uVmVyaWZpZXJ9IGltcGxlbWVudGF0aW9uLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIC8vICdyZWNhcHRjaGEtY29udGFpbmVyJyBpcyB0aGUgSUQgb2YgYW4gZWxlbWVudCBpbiB0aGUgRE9NLlxyXG4gKiBjb25zdCBhcHBsaWNhdGlvblZlcmlmaWVyID0gbmV3IGZpcmViYXNlLmF1dGguUmVjYXB0Y2hhVmVyaWZpZXIoJ3JlY2FwdGNoYS1jb250YWluZXInKTtcclxuICogY29uc3QgY29uZmlybWF0aW9uUmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aFBob25lTnVtYmVyKGF1dGgsIHBob25lTnVtYmVyLCBhcHBsaWNhdGlvblZlcmlmaWVyKTtcclxuICogLy8gT2J0YWluIGEgdmVyaWZpY2F0aW9uQ29kZSBmcm9tIHRoZSB1c2VyLlxyXG4gKiBjb25zdCBjcmVkZW50aWFsID0gYXdhaXQgY29uZmlybWF0aW9uUmVzdWx0LmNvbmZpcm0odmVyaWZpY2F0aW9uQ29kZSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSBwaG9uZU51bWJlciAtIFRoZSB1c2VyJ3MgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdCAoZS5nLiArMTY1MDU1NTAxMDEpLlxyXG4gKiBAcGFyYW0gYXBwVmVyaWZpZXIgLSBUaGUge0BsaW5rIEFwcGxpY2F0aW9uVmVyaWZpZXJ9LlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBzaWduSW5XaXRoUGhvbmVOdW1iZXIoYXV0aCwgcGhvbmVOdW1iZXIsIGFwcFZlcmlmaWVyKSB7XHJcbiAgICBjb25zdCBhdXRoSW50ZXJuYWwgPSBfY2FzdEF1dGgoYXV0aCk7XHJcbiAgICBjb25zdCB2ZXJpZmljYXRpb25JZCA9IGF3YWl0IF92ZXJpZnlQaG9uZU51bWJlcihhdXRoSW50ZXJuYWwsIHBob25lTnVtYmVyLCBnZXRNb2R1bGFySW5zdGFuY2UoYXBwVmVyaWZpZXIpKTtcclxuICAgIHJldHVybiBuZXcgQ29uZmlybWF0aW9uUmVzdWx0SW1wbCh2ZXJpZmljYXRpb25JZCwgY3JlZCA9PiBzaWduSW5XaXRoQ3JlZGVudGlhbChhdXRoSW50ZXJuYWwsIGNyZWQpKTtcclxufVxyXG4vKipcclxuICogTGlua3MgdGhlIHVzZXIgYWNjb3VudCB3aXRoIHRoZSBnaXZlbiBwaG9uZSBudW1iZXIuXHJcbiAqXHJcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXHJcbiAqIEBwYXJhbSBwaG9uZU51bWJlciAtIFRoZSB1c2VyJ3MgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdCAoZS5nLiArMTY1MDU1NTAxMDEpLlxyXG4gKiBAcGFyYW0gYXBwVmVyaWZpZXIgLSBUaGUge0BsaW5rIEFwcGxpY2F0aW9uVmVyaWZpZXJ9LlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBsaW5rV2l0aFBob25lTnVtYmVyKHVzZXIsIHBob25lTnVtYmVyLCBhcHBWZXJpZmllcikge1xyXG4gICAgY29uc3QgdXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpO1xyXG4gICAgYXdhaXQgX2Fzc2VydExpbmtlZFN0YXR1cyhmYWxzZSwgdXNlckludGVybmFsLCBcInBob25lXCIgLyogUEhPTkUgKi8pO1xyXG4gICAgY29uc3QgdmVyaWZpY2F0aW9uSWQgPSBhd2FpdCBfdmVyaWZ5UGhvbmVOdW1iZXIodXNlckludGVybmFsLmF1dGgsIHBob25lTnVtYmVyLCBnZXRNb2R1bGFySW5zdGFuY2UoYXBwVmVyaWZpZXIpKTtcclxuICAgIHJldHVybiBuZXcgQ29uZmlybWF0aW9uUmVzdWx0SW1wbCh2ZXJpZmljYXRpb25JZCwgY3JlZCA9PiBsaW5rV2l0aENyZWRlbnRpYWwodXNlckludGVybmFsLCBjcmVkKSk7XHJcbn1cclxuLyoqXHJcbiAqIFJlLWF1dGhlbnRpY2F0ZXMgYSB1c2VyIHVzaW5nIGEgZnJlc2ggcGhvbmUgY3JlZGVudGlhbC5cclxuICpcclxuICogQHJlbWFya3MgVXNlIGJlZm9yZSBvcGVyYXRpb25zIHN1Y2ggYXMge0BsaW5rIHVwZGF0ZVBhc3N3b3JkfSB0aGF0IHJlcXVpcmUgdG9rZW5zIGZyb20gcmVjZW50IHNpZ24taW4gYXR0ZW1wdHMuXHJcbiAqXHJcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXHJcbiAqIEBwYXJhbSBwaG9uZU51bWJlciAtIFRoZSB1c2VyJ3MgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdCAoZS5nLiArMTY1MDU1NTAxMDEpLlxyXG4gKiBAcGFyYW0gYXBwVmVyaWZpZXIgLSBUaGUge0BsaW5rIEFwcGxpY2F0aW9uVmVyaWZpZXJ9LlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiByZWF1dGhlbnRpY2F0ZVdpdGhQaG9uZU51bWJlcih1c2VyLCBwaG9uZU51bWJlciwgYXBwVmVyaWZpZXIpIHtcclxuICAgIGNvbnN0IHVzZXJJbnRlcm5hbCA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKTtcclxuICAgIGNvbnN0IHZlcmlmaWNhdGlvbklkID0gYXdhaXQgX3ZlcmlmeVBob25lTnVtYmVyKHVzZXJJbnRlcm5hbC5hdXRoLCBwaG9uZU51bWJlciwgZ2V0TW9kdWxhckluc3RhbmNlKGFwcFZlcmlmaWVyKSk7XHJcbiAgICByZXR1cm4gbmV3IENvbmZpcm1hdGlvblJlc3VsdEltcGwodmVyaWZpY2F0aW9uSWQsIGNyZWQgPT4gcmVhdXRoZW50aWNhdGVXaXRoQ3JlZGVudGlhbCh1c2VySW50ZXJuYWwsIGNyZWQpKTtcclxufVxyXG4vKipcclxuICogUmV0dXJucyBhIHZlcmlmaWNhdGlvbiBJRCB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFNNUyBjb2RlIHRoYXQgaXMgc2VudC5cclxuICpcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIF92ZXJpZnlQaG9uZU51bWJlcihhdXRoLCBvcHRpb25zLCB2ZXJpZmllcikge1xyXG4gICAgdmFyIF9hO1xyXG4gICAgY29uc3QgcmVjYXB0Y2hhVG9rZW4gPSBhd2FpdCB2ZXJpZmllci52ZXJpZnkoKTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgX2Fzc2VydCh0eXBlb2YgcmVjYXB0Y2hhVG9rZW4gPT09ICdzdHJpbmcnLCBhdXRoLCBcImFyZ3VtZW50LWVycm9yXCIgLyogQVJHVU1FTlRfRVJST1IgKi8pO1xyXG4gICAgICAgIF9hc3NlcnQodmVyaWZpZXIudHlwZSA9PT0gUkVDQVBUQ0hBX1ZFUklGSUVSX1RZUEUsIGF1dGgsIFwiYXJndW1lbnQtZXJyb3JcIiAvKiBBUkdVTUVOVF9FUlJPUiAqLyk7XHJcbiAgICAgICAgbGV0IHBob25lSW5mb09wdGlvbnM7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBwaG9uZUluZm9PcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgcGhvbmVOdW1iZXI6IG9wdGlvbnNcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHBob25lSW5mb09wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoJ3Nlc3Npb24nIGluIHBob25lSW5mb09wdGlvbnMpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IHBob25lSW5mb09wdGlvbnMuc2Vzc2lvbjtcclxuICAgICAgICAgICAgaWYgKCdwaG9uZU51bWJlcicgaW4gcGhvbmVJbmZvT3B0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgX2Fzc2VydChzZXNzaW9uLnR5cGUgPT09IFwiZW5yb2xsXCIgLyogRU5ST0xMICovLCBhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzdGFydEVucm9sbFBob25lTWZhKGF1dGgsIHtcclxuICAgICAgICAgICAgICAgICAgICBpZFRva2VuOiBzZXNzaW9uLmNyZWRlbnRpYWwsXHJcbiAgICAgICAgICAgICAgICAgICAgcGhvbmVFbnJvbGxtZW50SW5mbzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwaG9uZU51bWJlcjogcGhvbmVJbmZvT3B0aW9ucy5waG9uZU51bWJlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVjYXB0Y2hhVG9rZW5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5waG9uZVNlc3Npb25JbmZvLnNlc3Npb25JbmZvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgX2Fzc2VydChzZXNzaW9uLnR5cGUgPT09IFwic2lnbmluXCIgLyogU0lHTl9JTiAqLywgYXV0aCwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1mYUVucm9sbG1lbnRJZCA9ICgoX2EgPSBwaG9uZUluZm9PcHRpb25zLm11bHRpRmFjdG9ySGludCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnVpZCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBwaG9uZUluZm9PcHRpb25zLm11bHRpRmFjdG9yVWlkO1xyXG4gICAgICAgICAgICAgICAgX2Fzc2VydChtZmFFbnJvbGxtZW50SWQsIGF1dGgsIFwibWlzc2luZy1tdWx0aS1mYWN0b3ItaW5mb1wiIC8qIE1JU1NJTkdfTUZBX0lORk8gKi8pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzdGFydFNpZ25JblBob25lTWZhKGF1dGgsIHtcclxuICAgICAgICAgICAgICAgICAgICBtZmFQZW5kaW5nQ3JlZGVudGlhbDogc2Vzc2lvbi5jcmVkZW50aWFsLFxyXG4gICAgICAgICAgICAgICAgICAgIG1mYUVucm9sbG1lbnRJZCxcclxuICAgICAgICAgICAgICAgICAgICBwaG9uZVNpZ25JbkluZm86IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVjYXB0Y2hhVG9rZW5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5waG9uZVJlc3BvbnNlSW5mby5zZXNzaW9uSW5mbztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgeyBzZXNzaW9uSW5mbyB9ID0gYXdhaXQgc2VuZFBob25lVmVyaWZpY2F0aW9uQ29kZShhdXRoLCB7XHJcbiAgICAgICAgICAgICAgICBwaG9uZU51bWJlcjogcGhvbmVJbmZvT3B0aW9ucy5waG9uZU51bWJlcixcclxuICAgICAgICAgICAgICAgIHJlY2FwdGNoYVRva2VuXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gc2Vzc2lvbkluZm87XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdmVyaWZpZXIuX3Jlc2V0KCk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIFVwZGF0ZXMgdGhlIHVzZXIncyBwaG9uZSBudW1iZXIuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYFxyXG4gKiAvLyAncmVjYXB0Y2hhLWNvbnRhaW5lcicgaXMgdGhlIElEIG9mIGFuIGVsZW1lbnQgaW4gdGhlIERPTS5cclxuICogY29uc3QgYXBwbGljYXRpb25WZXJpZmllciA9IG5ldyBSZWNhcHRjaGFWZXJpZmllcigncmVjYXB0Y2hhLWNvbnRhaW5lcicpO1xyXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBQaG9uZUF1dGhQcm92aWRlcihhdXRoKTtcclxuICogY29uc3QgdmVyaWZpY2F0aW9uSWQgPSBhd2FpdCBwcm92aWRlci52ZXJpZnlQaG9uZU51bWJlcignKzE2NTA1NTUwMTAxJywgYXBwbGljYXRpb25WZXJpZmllcik7XHJcbiAqIC8vIE9idGFpbiB0aGUgdmVyaWZpY2F0aW9uQ29kZSBmcm9tIHRoZSB1c2VyLlxyXG4gKiBjb25zdCBwaG9uZUNyZWRlbnRpYWwgPSBQaG9uZUF1dGhQcm92aWRlci5jcmVkZW50aWFsKHZlcmlmaWNhdGlvbklkLCB2ZXJpZmljYXRpb25Db2RlKTtcclxuICogYXdhaXQgdXBkYXRlUGhvbmVOdW1iZXIodXNlciwgcGhvbmVDcmVkZW50aWFsKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXHJcbiAqIEBwYXJhbSBjcmVkZW50aWFsIC0gQSBjcmVkZW50aWFsIGF1dGhlbnRpY2F0aW5nIHRoZSBuZXcgcGhvbmUgbnVtYmVyLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQaG9uZU51bWJlcih1c2VyLCBjcmVkZW50aWFsKSB7XHJcbiAgICBhd2FpdCBfbGluayQxKGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKSwgY3JlZGVudGlhbCk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFByb3ZpZGVyIGZvciBnZW5lcmF0aW5nIGFuIHtAbGluayBQaG9uZUF1dGhDcmVkZW50aWFsfS5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiAvLyAncmVjYXB0Y2hhLWNvbnRhaW5lcicgaXMgdGhlIElEIG9mIGFuIGVsZW1lbnQgaW4gdGhlIERPTS5cclxuICogY29uc3QgYXBwbGljYXRpb25WZXJpZmllciA9IG5ldyBSZWNhcHRjaGFWZXJpZmllcigncmVjYXB0Y2hhLWNvbnRhaW5lcicpO1xyXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBQaG9uZUF1dGhQcm92aWRlcihhdXRoKTtcclxuICogY29uc3QgdmVyaWZpY2F0aW9uSWQgPSBhd2FpdCBwcm92aWRlci52ZXJpZnlQaG9uZU51bWJlcignKzE2NTA1NTUwMTAxJywgYXBwbGljYXRpb25WZXJpZmllcik7XHJcbiAqIC8vIE9idGFpbiB0aGUgdmVyaWZpY2F0aW9uQ29kZSBmcm9tIHRoZSB1c2VyLlxyXG4gKiBjb25zdCBwaG9uZUNyZWRlbnRpYWwgPSBQaG9uZUF1dGhQcm92aWRlci5jcmVkZW50aWFsKHZlcmlmaWNhdGlvbklkLCB2ZXJpZmljYXRpb25Db2RlKTtcclxuICogY29uc3QgdXNlckNyZWRlbnRpYWwgPSBhd2FpdCBzaWduSW5XaXRoQ3JlZGVudGlhbChhdXRoLCBwaG9uZUNyZWRlbnRpYWwpO1xyXG4gKiBgYGBcclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY2xhc3MgUGhvbmVBdXRoUHJvdmlkZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0gYXV0aCAtIFRoZSBGaXJlYmFzZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UgaW4gd2hpY2ggc2lnbi1pbnMgc2hvdWxkIG9jY3VyLlxyXG4gICAgICpcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoYXV0aCkge1xyXG4gICAgICAgIC8qKiBBbHdheXMgc2V0IHRvIHtAbGluayBQcm92aWRlcklkfS5QSE9ORS4gKi9cclxuICAgICAgICB0aGlzLnByb3ZpZGVySWQgPSBQaG9uZUF1dGhQcm92aWRlci5QUk9WSURFUl9JRDtcclxuICAgICAgICB0aGlzLmF1dGggPSBfY2FzdEF1dGgoYXV0aCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKiBTdGFydHMgYSBwaG9uZSBudW1iZXIgYXV0aGVudGljYXRpb24gZmxvdyBieSBzZW5kaW5nIGEgdmVyaWZpY2F0aW9uIGNvZGUgdG8gdGhlIGdpdmVuIHBob25lXHJcbiAgICAgKiBudW1iZXIuXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IFBob25lQXV0aFByb3ZpZGVyKGF1dGgpO1xyXG4gICAgICogY29uc3QgdmVyaWZpY2F0aW9uSWQgPSBhd2FpdCBwcm92aWRlci52ZXJpZnlQaG9uZU51bWJlcihwaG9uZU51bWJlciwgYXBwbGljYXRpb25WZXJpZmllcik7XHJcbiAgICAgKiAvLyBPYnRhaW4gdmVyaWZpY2F0aW9uQ29kZSBmcm9tIHRoZSB1c2VyLlxyXG4gICAgICogY29uc3QgYXV0aENyZWRlbnRpYWwgPSBQaG9uZUF1dGhQcm92aWRlci5jcmVkZW50aWFsKHZlcmlmaWNhdGlvbklkLCB2ZXJpZmljYXRpb25Db2RlKTtcclxuICAgICAqIGNvbnN0IHVzZXJDcmVkZW50aWFsID0gYXdhaXQgc2lnbkluV2l0aENyZWRlbnRpYWwoYXV0aCwgYXV0aENyZWRlbnRpYWwpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIEFuIGFsdGVybmF0aXZlIGZsb3cgaXMgcHJvdmlkZWQgdXNpbmcgdGhlIGBzaWduSW5XaXRoUGhvbmVOdW1iZXJgIG1ldGhvZC5cclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIGNvbnN0IGNvbmZpcm1hdGlvblJlc3VsdCA9IHNpZ25JbldpdGhQaG9uZU51bWJlcihhdXRoLCBwaG9uZU51bWJlciwgYXBwbGljYXRpb25WZXJpZmllcik7XHJcbiAgICAgKiAvLyBPYnRhaW4gdmVyaWZpY2F0aW9uQ29kZSBmcm9tIHRoZSB1c2VyLlxyXG4gICAgICogY29uc3QgdXNlckNyZWRlbnRpYWwgPSBjb25maXJtYXRpb25SZXN1bHQuY29uZmlybSh2ZXJpZmljYXRpb25Db2RlKTtcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBwaG9uZUluZm9PcHRpb25zIC0gVGhlIHVzZXIncyB7QGxpbmsgUGhvbmVJbmZvT3B0aW9uc30uIFRoZSBwaG9uZSBudW1iZXIgc2hvdWxkIGJlIGluXHJcbiAgICAgKiBFLjE2NCBmb3JtYXQgKGUuZy4gKzE2NTA1NTUwMTAxKS5cclxuICAgICAqIEBwYXJhbSBhcHBsaWNhdGlvblZlcmlmaWVyIC0gRm9yIGFidXNlIHByZXZlbnRpb24sIHRoaXMgbWV0aG9kIGFsc28gcmVxdWlyZXMgYVxyXG4gICAgICoge0BsaW5rIEFwcGxpY2F0aW9uVmVyaWZpZXJ9LiBUaGlzIFNESyBpbmNsdWRlcyBhIHJlQ0FQVENIQS1iYXNlZCBpbXBsZW1lbnRhdGlvbixcclxuICAgICAqIHtAbGluayBSZWNhcHRjaGFWZXJpZmllcn0uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgQSBQcm9taXNlIGZvciBhIHZlcmlmaWNhdGlvbiBJRCB0aGF0IGNhbiBiZSBwYXNzZWQgdG9cclxuICAgICAqIHtAbGluayBQaG9uZUF1dGhQcm92aWRlci5jcmVkZW50aWFsfSB0byBpZGVudGlmeSB0aGlzIGZsb3cuLlxyXG4gICAgICovXHJcbiAgICB2ZXJpZnlQaG9uZU51bWJlcihwaG9uZU9wdGlvbnMsIGFwcGxpY2F0aW9uVmVyaWZpZXIpIHtcclxuICAgICAgICByZXR1cm4gX3ZlcmlmeVBob25lTnVtYmVyKHRoaXMuYXV0aCwgcGhvbmVPcHRpb25zLCBnZXRNb2R1bGFySW5zdGFuY2UoYXBwbGljYXRpb25WZXJpZmllcikpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgcGhvbmUgYXV0aCBjcmVkZW50aWFsLCBnaXZlbiB0aGUgdmVyaWZpY2F0aW9uIElEIGZyb21cclxuICAgICAqIHtAbGluayBQaG9uZUF1dGhQcm92aWRlci52ZXJpZnlQaG9uZU51bWJlcn0gYW5kIHRoZSBjb2RlIHRoYXQgd2FzIHNlbnQgdG8gdGhlIHVzZXInc1xyXG4gICAgICogbW9iaWxlIGRldmljZS5cclxuICAgICAqXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogY29uc3QgcHJvdmlkZXIgPSBuZXcgUGhvbmVBdXRoUHJvdmlkZXIoYXV0aCk7XHJcbiAgICAgKiBjb25zdCB2ZXJpZmljYXRpb25JZCA9IHByb3ZpZGVyLnZlcmlmeVBob25lTnVtYmVyKHBob25lTnVtYmVyLCBhcHBsaWNhdGlvblZlcmlmaWVyKTtcclxuICAgICAqIC8vIE9idGFpbiB2ZXJpZmljYXRpb25Db2RlIGZyb20gdGhlIHVzZXIuXHJcbiAgICAgKiBjb25zdCBhdXRoQ3JlZGVudGlhbCA9IFBob25lQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWwodmVyaWZpY2F0aW9uSWQsIHZlcmlmaWNhdGlvbkNvZGUpO1xyXG4gICAgICogY29uc3QgdXNlckNyZWRlbnRpYWwgPSBzaWduSW5XaXRoQ3JlZGVudGlhbChhdXRoLCBhdXRoQ3JlZGVudGlhbCk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogQW4gYWx0ZXJuYXRpdmUgZmxvdyBpcyBwcm92aWRlZCB1c2luZyB0aGUgYHNpZ25JbldpdGhQaG9uZU51bWJlcmAgbWV0aG9kLlxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogY29uc3QgY29uZmlybWF0aW9uUmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aFBob25lTnVtYmVyKGF1dGgsIHBob25lTnVtYmVyLCBhcHBsaWNhdGlvblZlcmlmaWVyKTtcclxuICAgICAqIC8vIE9idGFpbiB2ZXJpZmljYXRpb25Db2RlIGZyb20gdGhlIHVzZXIuXHJcbiAgICAgKiBjb25zdCB1c2VyQ3JlZGVudGlhbCA9IGF3YWl0IGNvbmZpcm1hdGlvblJlc3VsdC5jb25maXJtKHZlcmlmaWNhdGlvbkNvZGUpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHZlcmlmaWNhdGlvbklkIC0gVGhlIHZlcmlmaWNhdGlvbiBJRCByZXR1cm5lZCBmcm9tIHtAbGluayBQaG9uZUF1dGhQcm92aWRlci52ZXJpZnlQaG9uZU51bWJlcn0uXHJcbiAgICAgKiBAcGFyYW0gdmVyaWZpY2F0aW9uQ29kZSAtIFRoZSB2ZXJpZmljYXRpb24gY29kZSBzZW50IHRvIHRoZSB1c2VyJ3MgbW9iaWxlIGRldmljZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgYXV0aCBwcm92aWRlciBjcmVkZW50aWFsLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbCh2ZXJpZmljYXRpb25JZCwgdmVyaWZpY2F0aW9uQ29kZSkge1xyXG4gICAgICAgIHJldHVybiBQaG9uZUF1dGhDcmVkZW50aWFsLl9mcm9tVmVyaWZpY2F0aW9uKHZlcmlmaWNhdGlvbklkLCB2ZXJpZmljYXRpb25Db2RlKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdGVzIGFuIHtAbGluayBBdXRoQ3JlZGVudGlhbH0gZnJvbSBhIHtAbGluayBVc2VyQ3JlZGVudGlhbH0uXHJcbiAgICAgKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbEZyb21SZXN1bHQodXNlckNyZWRlbnRpYWwpIHtcclxuICAgICAgICBjb25zdCBjcmVkZW50aWFsID0gdXNlckNyZWRlbnRpYWw7XHJcbiAgICAgICAgcmV0dXJuIFBob25lQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KGNyZWRlbnRpYWwpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIHtAbGluayBBdXRoQ3JlZGVudGlhbH0gd2hlbiBwYXNzZWQgYW4gZXJyb3IuXHJcbiAgICAgKlxyXG4gICAgICogQHJlbWFya3NcclxuICAgICAqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCB3b3JrcyBmb3IgZXJyb3JzIGxpa2VcclxuICAgICAqIGBhdXRoL2FjY291bnQtZXhpc3RzLXdpdGgtZGlmZmVyZW50LWNyZWRlbnRpYWxzYC4gVGhpcyBpcyB1c2VmdWwgZm9yXHJcbiAgICAgKiByZWNvdmVyaW5nIHdoZW4gYXR0ZW1wdGluZyB0byBzZXQgYSB1c2VyJ3MgcGhvbmUgbnVtYmVyIGJ1dCB0aGUgbnVtYmVyXHJcbiAgICAgKiBpbiBxdWVzdGlvbiBpcyBhbHJlYWR5IHRpZWQgdG8gYW5vdGhlciBhY2NvdW50LiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZ1xyXG4gICAgICogY29kZSB0cmllcyB0byB1cGRhdGUgdGhlIGN1cnJlbnQgdXNlcidzIHBob25lIG51bWJlciwgYW5kIGlmIHRoYXRcclxuICAgICAqIGZhaWxzLCBsaW5rcyB0aGUgdXNlciB3aXRoIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGF0IG51bWJlcjpcclxuICAgICAqXHJcbiAgICAgKiBgYGBqc1xyXG4gICAgICogY29uc3QgcHJvdmlkZXIgPSBuZXcgUGhvbmVBdXRoUHJvdmlkZXIoYXV0aCk7XHJcbiAgICAgKiBjb25zdCB2ZXJpZmljYXRpb25JZCA9IGF3YWl0IHByb3ZpZGVyLnZlcmlmeVBob25lTnVtYmVyKG51bWJlciwgdmVyaWZpZXIpO1xyXG4gICAgICogdHJ5IHtcclxuICAgICAqICAgY29uc3QgY29kZSA9ICcnOyAvLyBQcm9tcHQgdGhlIHVzZXIgZm9yIHRoZSB2ZXJpZmljYXRpb24gY29kZVxyXG4gICAgICogICBhd2FpdCB1cGRhdGVQaG9uZU51bWJlcihcclxuICAgICAqICAgICAgIGF1dGguY3VycmVudFVzZXIsXHJcbiAgICAgKiAgICAgICBQaG9uZUF1dGhQcm92aWRlci5jcmVkZW50aWFsKHZlcmlmaWNhdGlvbklkLCBjb2RlKSk7XHJcbiAgICAgKiB9IGNhdGNoIChlKSB7XHJcbiAgICAgKiAgIGlmIChlLmNvZGUgPT09ICdhdXRoL2FjY291bnQtZXhpc3RzLXdpdGgtZGlmZmVyZW50LWNyZWRlbnRpYWwnKSB7XHJcbiAgICAgKiAgICAgY29uc3QgY3JlZCA9IFBob25lQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tRXJyb3IoZSk7XHJcbiAgICAgKiAgICAgYXdhaXQgbGlua1dpdGhDcmVkZW50aWFsKGF1dGguY3VycmVudFVzZXIsIGNyZWQpO1xyXG4gICAgICogICB9XHJcbiAgICAgKiB9XHJcbiAgICAgKlxyXG4gICAgICogLy8gQXQgdGhpcyBwb2ludCwgYXV0aC5jdXJyZW50VXNlci5waG9uZU51bWJlciA9PT0gbnVtYmVyLlxyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIHRvIGdlbmVyYXRlIGEgY3JlZGVudGlhbCBmcm9tLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbEZyb21FcnJvcihlcnJvcikge1xyXG4gICAgICAgIHJldHVybiBQaG9uZUF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCgoZXJyb3IuY3VzdG9tRGF0YSB8fCB7fSkpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGNyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KHsgX3Rva2VuUmVzcG9uc2U6IHRva2VuUmVzcG9uc2UgfSkge1xyXG4gICAgICAgIGlmICghdG9rZW5SZXNwb25zZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgeyBwaG9uZU51bWJlciwgdGVtcG9yYXJ5UHJvb2YgfSA9IHRva2VuUmVzcG9uc2U7XHJcbiAgICAgICAgaWYgKHBob25lTnVtYmVyICYmIHRlbXBvcmFyeVByb29mKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQaG9uZUF1dGhDcmVkZW50aWFsLl9mcm9tVG9rZW5SZXNwb25zZShwaG9uZU51bWJlciwgdGVtcG9yYXJ5UHJvb2YpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxufVxyXG4vKiogQWx3YXlzIHNldCB0byB7QGxpbmsgUHJvdmlkZXJJZH0uUEhPTkUuICovXHJcblBob25lQXV0aFByb3ZpZGVyLlBST1ZJREVSX0lEID0gXCJwaG9uZVwiIC8qIFBIT05FICovO1xyXG4vKiogQWx3YXlzIHNldCB0byB7QGxpbmsgU2lnbkluTWV0aG9kfS5QSE9ORS4gKi9cclxuUGhvbmVBdXRoUHJvdmlkZXIuUEhPTkVfU0lHTl9JTl9NRVRIT0QgPSBcInBob25lXCIgLyogUEhPTkUgKi87XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBDaG9vc2VzIGEgcG9wdXAvcmVkaXJlY3QgcmVzb2x2ZXIgdG8gdXNlLiBUaGlzIHByZWZlcnMgdGhlIG92ZXJyaWRlICh3aGljaFxyXG4gKiBpcyBkaXJlY3RseSBwYXNzZWQgaW4pLCBhbmQgZmFsbHMgYmFjayB0byB0aGUgcHJvcGVydHkgc2V0IG9uIHRoZSBhdXRoXHJcbiAqIG9iamVjdC4gSWYgbmVpdGhlciBhcmUgYXZhaWxhYmxlLCB0aGlzIGZ1bmN0aW9uIGVycm9ycyB3LyBhbiBhcmd1bWVudCBlcnJvci5cclxuICovXHJcbmZ1bmN0aW9uIF93aXRoRGVmYXVsdFJlc29sdmVyKGF1dGgsIHJlc29sdmVyT3ZlcnJpZGUpIHtcclxuICAgIGlmIChyZXNvbHZlck92ZXJyaWRlKSB7XHJcbiAgICAgICAgcmV0dXJuIF9nZXRJbnN0YW5jZShyZXNvbHZlck92ZXJyaWRlKTtcclxuICAgIH1cclxuICAgIF9hc3NlcnQoYXV0aC5fcG9wdXBSZWRpcmVjdFJlc29sdmVyLCBhdXRoLCBcImFyZ3VtZW50LWVycm9yXCIgLyogQVJHVU1FTlRfRVJST1IgKi8pO1xyXG4gICAgcmV0dXJuIGF1dGguX3BvcHVwUmVkaXJlY3RSZXNvbHZlcjtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jbGFzcyBJZHBDcmVkZW50aWFsIGV4dGVuZHMgQXV0aENyZWRlbnRpYWwge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1zKSB7XHJcbiAgICAgICAgc3VwZXIoXCJjdXN0b21cIiAvKiBDVVNUT00gKi8sIFwiY3VzdG9tXCIgLyogQ1VTVE9NICovKTtcclxuICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcclxuICAgIH1cclxuICAgIF9nZXRJZFRva2VuUmVzcG9uc2UoYXV0aCkge1xyXG4gICAgICAgIHJldHVybiBzaWduSW5XaXRoSWRwKGF1dGgsIHRoaXMuX2J1aWxkSWRwUmVxdWVzdCgpKTtcclxuICAgIH1cclxuICAgIF9saW5rVG9JZFRva2VuKGF1dGgsIGlkVG9rZW4pIHtcclxuICAgICAgICByZXR1cm4gc2lnbkluV2l0aElkcChhdXRoLCB0aGlzLl9idWlsZElkcFJlcXVlc3QoaWRUb2tlbikpO1xyXG4gICAgfVxyXG4gICAgX2dldFJlYXV0aGVudGljYXRpb25SZXNvbHZlcihhdXRoKSB7XHJcbiAgICAgICAgcmV0dXJuIHNpZ25JbldpdGhJZHAoYXV0aCwgdGhpcy5fYnVpbGRJZHBSZXF1ZXN0KCkpO1xyXG4gICAgfVxyXG4gICAgX2J1aWxkSWRwUmVxdWVzdChpZFRva2VuKSB7XHJcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHtcclxuICAgICAgICAgICAgcmVxdWVzdFVyaTogdGhpcy5wYXJhbXMucmVxdWVzdFVyaSxcclxuICAgICAgICAgICAgc2Vzc2lvbklkOiB0aGlzLnBhcmFtcy5zZXNzaW9uSWQsXHJcbiAgICAgICAgICAgIHBvc3RCb2R5OiB0aGlzLnBhcmFtcy5wb3N0Qm9keSxcclxuICAgICAgICAgICAgdGVuYW50SWQ6IHRoaXMucGFyYW1zLnRlbmFudElkLFxyXG4gICAgICAgICAgICBwZW5kaW5nVG9rZW46IHRoaXMucGFyYW1zLnBlbmRpbmdUb2tlbixcclxuICAgICAgICAgICAgcmV0dXJuU2VjdXJlVG9rZW46IHRydWUsXHJcbiAgICAgICAgICAgIHJldHVybklkcENyZWRlbnRpYWw6IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChpZFRva2VuKSB7XHJcbiAgICAgICAgICAgIHJlcXVlc3QuaWRUb2tlbiA9IGlkVG9rZW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXF1ZXN0O1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIF9zaWduSW4ocGFyYW1zKSB7XHJcbiAgICByZXR1cm4gX3NpZ25JbldpdGhDcmVkZW50aWFsKHBhcmFtcy5hdXRoLCBuZXcgSWRwQ3JlZGVudGlhbChwYXJhbXMpLCBwYXJhbXMuYnlwYXNzQXV0aFN0YXRlKTtcclxufVxyXG5mdW5jdGlvbiBfcmVhdXRoKHBhcmFtcykge1xyXG4gICAgY29uc3QgeyBhdXRoLCB1c2VyIH0gPSBwYXJhbXM7XHJcbiAgICBfYXNzZXJ0KHVzZXIsIGF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICByZXR1cm4gX3JlYXV0aGVudGljYXRlKHVzZXIsIG5ldyBJZHBDcmVkZW50aWFsKHBhcmFtcyksIHBhcmFtcy5ieXBhc3NBdXRoU3RhdGUpO1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIF9saW5rKHBhcmFtcykge1xyXG4gICAgY29uc3QgeyBhdXRoLCB1c2VyIH0gPSBwYXJhbXM7XHJcbiAgICBfYXNzZXJ0KHVzZXIsIGF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICByZXR1cm4gX2xpbmskMSh1c2VyLCBuZXcgSWRwQ3JlZGVudGlhbChwYXJhbXMpLCBwYXJhbXMuYnlwYXNzQXV0aFN0YXRlKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogUG9wdXAgZXZlbnQgbWFuYWdlci4gSGFuZGxlcyB0aGUgcG9wdXAncyBlbnRpcmUgbGlmZWN5Y2xlOyBsaXN0ZW5zIHRvIGF1dGhcclxuICogZXZlbnRzXHJcbiAqL1xyXG5jbGFzcyBBYnN0cmFjdFBvcHVwUmVkaXJlY3RPcGVyYXRpb24ge1xyXG4gICAgY29uc3RydWN0b3IoYXV0aCwgZmlsdGVyLCByZXNvbHZlciwgdXNlciwgYnlwYXNzQXV0aFN0YXRlID0gZmFsc2UpIHtcclxuICAgICAgICB0aGlzLmF1dGggPSBhdXRoO1xyXG4gICAgICAgIHRoaXMucmVzb2x2ZXIgPSByZXNvbHZlcjtcclxuICAgICAgICB0aGlzLnVzZXIgPSB1c2VyO1xyXG4gICAgICAgIHRoaXMuYnlwYXNzQXV0aFN0YXRlID0gYnlwYXNzQXV0aFN0YXRlO1xyXG4gICAgICAgIHRoaXMucGVuZGluZ1Byb21pc2UgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZXZlbnRNYW5hZ2VyID0gbnVsbDtcclxuICAgICAgICB0aGlzLmZpbHRlciA9IEFycmF5LmlzQXJyYXkoZmlsdGVyKSA/IGZpbHRlciA6IFtmaWx0ZXJdO1xyXG4gICAgfVxyXG4gICAgZXhlY3V0ZSgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdQcm9taXNlID0geyByZXNvbHZlLCByZWplY3QgfTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRNYW5hZ2VyID0gYXdhaXQgdGhpcy5yZXNvbHZlci5faW5pdGlhbGl6ZSh0aGlzLmF1dGgpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vbkV4ZWN1dGlvbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudE1hbmFnZXIucmVnaXN0ZXJDb25zdW1lcih0aGlzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWplY3QoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uQXV0aEV2ZW50KGV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgeyB1cmxSZXNwb25zZSwgc2Vzc2lvbklkLCBwb3N0Qm9keSwgdGVuYW50SWQsIGVycm9yLCB0eXBlIH0gPSBldmVudDtcclxuICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgdGhpcy5yZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgICAgICAgYXV0aDogdGhpcy5hdXRoLFxyXG4gICAgICAgICAgICByZXF1ZXN0VXJpOiB1cmxSZXNwb25zZSxcclxuICAgICAgICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uSWQsXHJcbiAgICAgICAgICAgIHRlbmFudElkOiB0ZW5hbnRJZCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHBvc3RCb2R5OiBwb3N0Qm9keSB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHVzZXI6IHRoaXMudXNlcixcclxuICAgICAgICAgICAgYnlwYXNzQXV0aFN0YXRlOiB0aGlzLmJ5cGFzc0F1dGhTdGF0ZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5yZXNvbHZlKGF3YWl0IHRoaXMuZ2V0SWRwVGFzayh0eXBlKShwYXJhbXMpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5yZWplY3QoZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgb25FcnJvcihlcnJvcikge1xyXG4gICAgICAgIHRoaXMucmVqZWN0KGVycm9yKTtcclxuICAgIH1cclxuICAgIGdldElkcFRhc2sodHlwZSkge1xyXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIFwic2lnbkluVmlhUG9wdXBcIiAvKiBTSUdOX0lOX1ZJQV9QT1BVUCAqLzpcclxuICAgICAgICAgICAgY2FzZSBcInNpZ25JblZpYVJlZGlyZWN0XCIgLyogU0lHTl9JTl9WSUFfUkVESVJFQ1QgKi86XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gX3NpZ25JbjtcclxuICAgICAgICAgICAgY2FzZSBcImxpbmtWaWFQb3B1cFwiIC8qIExJTktfVklBX1BPUFVQICovOlxyXG4gICAgICAgICAgICBjYXNlIFwibGlua1ZpYVJlZGlyZWN0XCIgLyogTElOS19WSUFfUkVESVJFQ1QgKi86XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gX2xpbms7XHJcbiAgICAgICAgICAgIGNhc2UgXCJyZWF1dGhWaWFQb3B1cFwiIC8qIFJFQVVUSF9WSUFfUE9QVVAgKi86XHJcbiAgICAgICAgICAgIGNhc2UgXCJyZWF1dGhWaWFSZWRpcmVjdFwiIC8qIFJFQVVUSF9WSUFfUkVESVJFQ1QgKi86XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlYXV0aDtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIF9mYWlsKHRoaXMuYXV0aCwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXNvbHZlKGNyZWQpIHtcclxuICAgICAgICBkZWJ1Z0Fzc2VydCh0aGlzLnBlbmRpbmdQcm9taXNlLCAnUGVuZGluZyBwcm9taXNlIHdhcyBuZXZlciBzZXQnKTtcclxuICAgICAgICB0aGlzLnBlbmRpbmdQcm9taXNlLnJlc29sdmUoY3JlZCk7XHJcbiAgICAgICAgdGhpcy51bnJlZ2lzdGVyQW5kQ2xlYW5VcCgpO1xyXG4gICAgfVxyXG4gICAgcmVqZWN0KGVycm9yKSB7XHJcbiAgICAgICAgZGVidWdBc3NlcnQodGhpcy5wZW5kaW5nUHJvbWlzZSwgJ1BlbmRpbmcgcHJvbWlzZSB3YXMgbmV2ZXIgc2V0Jyk7XHJcbiAgICAgICAgdGhpcy5wZW5kaW5nUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xyXG4gICAgICAgIHRoaXMudW5yZWdpc3RlckFuZENsZWFuVXAoKTtcclxuICAgIH1cclxuICAgIHVucmVnaXN0ZXJBbmRDbGVhblVwKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmV2ZW50TWFuYWdlcikge1xyXG4gICAgICAgICAgICB0aGlzLmV2ZW50TWFuYWdlci51bnJlZ2lzdGVyQ29uc3VtZXIodGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucGVuZGluZ1Byb21pc2UgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY2xlYW5VcCgpO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IF9QT0xMX1dJTkRPV19DTE9TRV9USU1FT1VUID0gbmV3IERlbGF5KDIwMDAsIDEwMDAwKTtcclxuLyoqXHJcbiAqIEF1dGhlbnRpY2F0ZXMgYSBGaXJlYmFzZSBjbGllbnQgdXNpbmcgYSBwb3B1cC1iYXNlZCBPQXV0aCBhdXRoZW50aWNhdGlvbiBmbG93LlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBJZiBzdWNjZWVkcywgcmV0dXJucyB0aGUgc2lnbmVkIGluIHVzZXIgYWxvbmcgd2l0aCB0aGUgcHJvdmlkZXIncyBjcmVkZW50aWFsLiBJZiBzaWduIGluIHdhc1xyXG4gKiB1bnN1Y2Nlc3NmdWwsIHJldHVybnMgYW4gZXJyb3Igb2JqZWN0IGNvbnRhaW5pbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogLy8gU2lnbiBpbiB1c2luZyBhIHBvcHVwLlxyXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBGYWNlYm9va0F1dGhQcm92aWRlcigpO1xyXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzaWduSW5XaXRoUG9wdXAoYXV0aCwgcHJvdmlkZXIpO1xyXG4gKlxyXG4gKiAvLyBUaGUgc2lnbmVkLWluIHVzZXIgaW5mby5cclxuICogY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xyXG4gKiAvLyBUaGlzIGdpdmVzIHlvdSBhIEZhY2Vib29rIEFjY2VzcyBUb2tlbi5cclxuICogY29uc3QgY3JlZGVudGlhbCA9IHByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tUmVzdWx0KGF1dGgsIHJlc3VsdCk7XHJcbiAqIGNvbnN0IHRva2VuID0gY3JlZGVudGlhbC5hY2Nlc3NUb2tlbjtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cclxuICogQHBhcmFtIHByb3ZpZGVyIC0gVGhlIHByb3ZpZGVyIHRvIGF1dGhlbnRpY2F0ZS4gVGhlIHByb3ZpZGVyIGhhcyB0byBiZSBhbiB7QGxpbmsgT0F1dGhQcm92aWRlcn0uXHJcbiAqIE5vbi1PQXV0aCBwcm92aWRlcnMgbGlrZSB7QGxpbmsgRW1haWxBdXRoUHJvdmlkZXJ9IHdpbGwgdGhyb3cgYW4gZXJyb3IuXHJcbiAqIEBwYXJhbSByZXNvbHZlciAtIEFuIGluc3RhbmNlIG9mIHtAbGluayBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJ9LCBvcHRpb25hbFxyXG4gKiBpZiBhbHJlYWR5IHN1cHBsaWVkIHRvIHtAbGluayBpbml0aWFsaXplQXV0aH0gb3IgcHJvdmlkZWQgYnkge0BsaW5rIGdldEF1dGh9LlxyXG4gKlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBzaWduSW5XaXRoUG9wdXAoYXV0aCwgcHJvdmlkZXIsIHJlc29sdmVyKSB7XHJcbiAgICBjb25zdCBhdXRoSW50ZXJuYWwgPSBfY2FzdEF1dGgoYXV0aCk7XHJcbiAgICBfYXNzZXJ0SW5zdGFuY2VPZihhdXRoLCBwcm92aWRlciwgRmVkZXJhdGVkQXV0aFByb3ZpZGVyKTtcclxuICAgIGNvbnN0IHJlc29sdmVySW50ZXJuYWwgPSBfd2l0aERlZmF1bHRSZXNvbHZlcihhdXRoSW50ZXJuYWwsIHJlc29sdmVyKTtcclxuICAgIGNvbnN0IGFjdGlvbiA9IG5ldyBQb3B1cE9wZXJhdGlvbihhdXRoSW50ZXJuYWwsIFwic2lnbkluVmlhUG9wdXBcIiAvKiBTSUdOX0lOX1ZJQV9QT1BVUCAqLywgcHJvdmlkZXIsIHJlc29sdmVySW50ZXJuYWwpO1xyXG4gICAgcmV0dXJuIGFjdGlvbi5leGVjdXRlTm90TnVsbCgpO1xyXG59XHJcbi8qKlxyXG4gKiBSZWF1dGhlbnRpY2F0ZXMgdGhlIGN1cnJlbnQgdXNlciB3aXRoIHRoZSBzcGVjaWZpZWQge0BsaW5rIE9BdXRoUHJvdmlkZXJ9IHVzaW5nIGEgcG9wLXVwIGJhc2VkXHJcbiAqIE9BdXRoIGZsb3cuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIElmIHRoZSByZWF1dGhlbnRpY2F0aW9uIGlzIHN1Y2Nlc3NmdWwsIHRoZSByZXR1cm5lZCByZXN1bHQgd2lsbCBjb250YWluIHRoZSB1c2VyIGFuZCB0aGVcclxuICogcHJvdmlkZXIncyBjcmVkZW50aWFsLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIC8vIFNpZ24gaW4gdXNpbmcgYSBwb3B1cC5cclxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgRmFjZWJvb2tBdXRoUHJvdmlkZXIoKTtcclxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aFBvcHVwKGF1dGgsIHByb3ZpZGVyKTtcclxuICogLy8gUmVhdXRoZW50aWNhdGUgdXNpbmcgYSBwb3B1cC5cclxuICogYXdhaXQgcmVhdXRoZW50aWNhdGVXaXRoUG9wdXAocmVzdWx0LnVzZXIsIHByb3ZpZGVyKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXHJcbiAqIEBwYXJhbSBwcm92aWRlciAtIFRoZSBwcm92aWRlciB0byBhdXRoZW50aWNhdGUuIFRoZSBwcm92aWRlciBoYXMgdG8gYmUgYW4ge0BsaW5rIE9BdXRoUHJvdmlkZXJ9LlxyXG4gKiBOb24tT0F1dGggcHJvdmlkZXJzIGxpa2Uge0BsaW5rIEVtYWlsQXV0aFByb3ZpZGVyfSB3aWxsIHRocm93IGFuIGVycm9yLlxyXG4gKiBAcGFyYW0gcmVzb2x2ZXIgLSBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgUG9wdXBSZWRpcmVjdFJlc29sdmVyfSwgb3B0aW9uYWxcclxuICogaWYgYWxyZWFkeSBzdXBwbGllZCB0byB7QGxpbmsgaW5pdGlhbGl6ZUF1dGh9IG9yIHByb3ZpZGVkIGJ5IHtAbGluayBnZXRBdXRofS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gcmVhdXRoZW50aWNhdGVXaXRoUG9wdXAodXNlciwgcHJvdmlkZXIsIHJlc29sdmVyKSB7XHJcbiAgICBjb25zdCB1c2VySW50ZXJuYWwgPSBnZXRNb2R1bGFySW5zdGFuY2UodXNlcik7XHJcbiAgICBfYXNzZXJ0SW5zdGFuY2VPZih1c2VySW50ZXJuYWwuYXV0aCwgcHJvdmlkZXIsIEZlZGVyYXRlZEF1dGhQcm92aWRlcik7XHJcbiAgICBjb25zdCByZXNvbHZlckludGVybmFsID0gX3dpdGhEZWZhdWx0UmVzb2x2ZXIodXNlckludGVybmFsLmF1dGgsIHJlc29sdmVyKTtcclxuICAgIGNvbnN0IGFjdGlvbiA9IG5ldyBQb3B1cE9wZXJhdGlvbih1c2VySW50ZXJuYWwuYXV0aCwgXCJyZWF1dGhWaWFQb3B1cFwiIC8qIFJFQVVUSF9WSUFfUE9QVVAgKi8sIHByb3ZpZGVyLCByZXNvbHZlckludGVybmFsLCB1c2VySW50ZXJuYWwpO1xyXG4gICAgcmV0dXJuIGFjdGlvbi5leGVjdXRlTm90TnVsbCgpO1xyXG59XHJcbi8qKlxyXG4gKiBMaW5rcyB0aGUgYXV0aGVudGljYXRlZCBwcm92aWRlciB0byB0aGUgdXNlciBhY2NvdW50IHVzaW5nIGEgcG9wLXVwIGJhc2VkIE9BdXRoIGZsb3cuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIElmIHRoZSBsaW5raW5nIGlzIHN1Y2Nlc3NmdWwsIHRoZSByZXR1cm5lZCByZXN1bHQgd2lsbCBjb250YWluIHRoZSB1c2VyIGFuZCB0aGUgcHJvdmlkZXIncyBjcmVkZW50aWFsLlxyXG4gKlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIC8vIFNpZ24gaW4gdXNpbmcgc29tZSBvdGhlciBwcm92aWRlci5cclxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aEVtYWlsQW5kUGFzc3dvcmQoYXV0aCwgZW1haWwsIHBhc3N3b3JkKTtcclxuICogLy8gTGluayB1c2luZyBhIHBvcHVwLlxyXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBGYWNlYm9va0F1dGhQcm92aWRlcigpO1xyXG4gKiBhd2FpdCBsaW5rV2l0aFBvcHVwKHJlc3VsdC51c2VyLCBwcm92aWRlcik7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxyXG4gKiBAcGFyYW0gcHJvdmlkZXIgLSBUaGUgcHJvdmlkZXIgdG8gYXV0aGVudGljYXRlLiBUaGUgcHJvdmlkZXIgaGFzIHRvIGJlIGFuIHtAbGluayBPQXV0aFByb3ZpZGVyfS5cclxuICogTm9uLU9BdXRoIHByb3ZpZGVycyBsaWtlIHtAbGluayBFbWFpbEF1dGhQcm92aWRlcn0gd2lsbCB0aHJvdyBhbiBlcnJvci5cclxuICogQHBhcmFtIHJlc29sdmVyIC0gQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFBvcHVwUmVkaXJlY3RSZXNvbHZlcn0sIG9wdGlvbmFsXHJcbiAqIGlmIGFscmVhZHkgc3VwcGxpZWQgdG8ge0BsaW5rIGluaXRpYWxpemVBdXRofSBvciBwcm92aWRlZCBieSB7QGxpbmsgZ2V0QXV0aH0uXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIGxpbmtXaXRoUG9wdXAodXNlciwgcHJvdmlkZXIsIHJlc29sdmVyKSB7XHJcbiAgICBjb25zdCB1c2VySW50ZXJuYWwgPSBnZXRNb2R1bGFySW5zdGFuY2UodXNlcik7XHJcbiAgICBfYXNzZXJ0SW5zdGFuY2VPZih1c2VySW50ZXJuYWwuYXV0aCwgcHJvdmlkZXIsIEZlZGVyYXRlZEF1dGhQcm92aWRlcik7XHJcbiAgICBjb25zdCByZXNvbHZlckludGVybmFsID0gX3dpdGhEZWZhdWx0UmVzb2x2ZXIodXNlckludGVybmFsLmF1dGgsIHJlc29sdmVyKTtcclxuICAgIGNvbnN0IGFjdGlvbiA9IG5ldyBQb3B1cE9wZXJhdGlvbih1c2VySW50ZXJuYWwuYXV0aCwgXCJsaW5rVmlhUG9wdXBcIiAvKiBMSU5LX1ZJQV9QT1BVUCAqLywgcHJvdmlkZXIsIHJlc29sdmVySW50ZXJuYWwsIHVzZXJJbnRlcm5hbCk7XHJcbiAgICByZXR1cm4gYWN0aW9uLmV4ZWN1dGVOb3ROdWxsKCk7XHJcbn1cclxuLyoqXHJcbiAqIFBvcHVwIGV2ZW50IG1hbmFnZXIuIEhhbmRsZXMgdGhlIHBvcHVwJ3MgZW50aXJlIGxpZmVjeWNsZTsgbGlzdGVucyB0byBhdXRoXHJcbiAqIGV2ZW50c1xyXG4gKlxyXG4gKi9cclxuY2xhc3MgUG9wdXBPcGVyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdFBvcHVwUmVkaXJlY3RPcGVyYXRpb24ge1xyXG4gICAgY29uc3RydWN0b3IoYXV0aCwgZmlsdGVyLCBwcm92aWRlciwgcmVzb2x2ZXIsIHVzZXIpIHtcclxuICAgICAgICBzdXBlcihhdXRoLCBmaWx0ZXIsIHJlc29sdmVyLCB1c2VyKTtcclxuICAgICAgICB0aGlzLnByb3ZpZGVyID0gcHJvdmlkZXI7XHJcbiAgICAgICAgdGhpcy5hdXRoV2luZG93ID0gbnVsbDtcclxuICAgICAgICB0aGlzLnBvbGxJZCA9IG51bGw7XHJcbiAgICAgICAgaWYgKFBvcHVwT3BlcmF0aW9uLmN1cnJlbnRQb3B1cEFjdGlvbikge1xyXG4gICAgICAgICAgICBQb3B1cE9wZXJhdGlvbi5jdXJyZW50UG9wdXBBY3Rpb24uY2FuY2VsKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFBvcHVwT3BlcmF0aW9uLmN1cnJlbnRQb3B1cEFjdGlvbiA9IHRoaXM7XHJcbiAgICB9XHJcbiAgICBhc3luYyBleGVjdXRlTm90TnVsbCgpIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGUoKTtcclxuICAgICAgICBfYXNzZXJ0KHJlc3VsdCwgdGhpcy5hdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkV4ZWN1dGlvbigpIHtcclxuICAgICAgICBkZWJ1Z0Fzc2VydCh0aGlzLmZpbHRlci5sZW5ndGggPT09IDEsICdQb3B1cCBvcGVyYXRpb25zIG9ubHkgaGFuZGxlIG9uZSBldmVudCcpO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50SWQgPSBfZ2VuZXJhdGVFdmVudElkKCk7XHJcbiAgICAgICAgdGhpcy5hdXRoV2luZG93ID0gYXdhaXQgdGhpcy5yZXNvbHZlci5fb3BlblBvcHVwKHRoaXMuYXV0aCwgdGhpcy5wcm92aWRlciwgdGhpcy5maWx0ZXJbMF0sIC8vIFRoZXJlJ3MgYWx3YXlzIG9uZSwgc2VlIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgZXZlbnRJZCk7XHJcbiAgICAgICAgdGhpcy5hdXRoV2luZG93LmFzc29jaWF0ZWRFdmVudCA9IGV2ZW50SWQ7XHJcbiAgICAgICAgLy8gQ2hlY2sgZm9yIHdlYiBzdG9yYWdlIHN1cHBvcnQgYW5kIG9yaWdpbiB2YWxpZGF0aW9uIF9hZnRlcl8gdGhlIHBvcHVwIGlzXHJcbiAgICAgICAgLy8gbG9hZGVkLiBUaGVzZSBvcGVyYXRpb25zIGFyZSBzbG93ICh+MSBzZWNvbmQgb3Igc28pIFJhdGhlciB0aGFuXHJcbiAgICAgICAgLy8gd2FpdGluZyBvbiB0aGVtIGJlZm9yZSBvcGVuaW5nIHRoZSB3aW5kb3csIG9wdGltaXN0aWNhbGx5IG9wZW4gdGhlIHBvcHVwXHJcbiAgICAgICAgLy8gYW5kIGNoZWNrIGZvciBzdG9yYWdlIHN1cHBvcnQgYXQgdGhlIHNhbWUgdGltZS4gSWYgc3RvcmFnZSBzdXBwb3J0IGlzXHJcbiAgICAgICAgLy8gbm90IGF2YWlsYWJsZSwgdGhpcyB3aWxsIGNhdXNlIHRoZSB3aG9sZSB0aGluZyB0byByZWplY3QgcHJvcGVybHkuIEl0XHJcbiAgICAgICAgLy8gd2lsbCBhbHNvIGNsb3NlIHRoZSBwb3B1cCwgYnV0IHNpbmNlIHRoZSBwcm9taXNlIGhhcyBhbHJlYWR5IHJlamVjdGVkLFxyXG4gICAgICAgIC8vIHRoZSBwb3B1cCBjbG9zZWQgYnkgdXNlciBwb2xsIHdpbGwgcmVqZWN0IGludG8gdGhlIHZvaWQuXHJcbiAgICAgICAgdGhpcy5yZXNvbHZlci5fb3JpZ2luVmFsaWRhdGlvbih0aGlzLmF1dGgpLmNhdGNoKGUgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlamVjdChlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnJlc29sdmVyLl9pc0lmcmFtZVdlYlN0b3JhZ2VTdXBwb3J0ZWQodGhpcy5hdXRoLCBpc1N1cHBvcnRlZCA9PiB7XHJcbiAgICAgICAgICAgIGlmICghaXNTdXBwb3J0ZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVqZWN0KF9jcmVhdGVFcnJvcih0aGlzLmF1dGgsIFwid2ViLXN0b3JhZ2UtdW5zdXBwb3J0ZWRcIiAvKiBXRUJfU1RPUkFHRV9VTlNVUFBPUlRFRCAqLykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gSGFuZGxlIHVzZXIgY2xvc3VyZS4gTm90aWNlIHRoaXMgZG9lcyAqbm90KiB1c2UgYXdhaXRcclxuICAgICAgICB0aGlzLnBvbGxVc2VyQ2FuY2VsbGF0aW9uKCk7XHJcbiAgICB9XHJcbiAgICBnZXQgZXZlbnRJZCgpIHtcclxuICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgcmV0dXJuICgoX2EgPSB0aGlzLmF1dGhXaW5kb3cpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hc3NvY2lhdGVkRXZlbnQpIHx8IG51bGw7XHJcbiAgICB9XHJcbiAgICBjYW5jZWwoKSB7XHJcbiAgICAgICAgdGhpcy5yZWplY3QoX2NyZWF0ZUVycm9yKHRoaXMuYXV0aCwgXCJjYW5jZWxsZWQtcG9wdXAtcmVxdWVzdFwiIC8qIEVYUElSRURfUE9QVVBfUkVRVUVTVCAqLykpO1xyXG4gICAgfVxyXG4gICAgY2xlYW5VcCgpIHtcclxuICAgICAgICBpZiAodGhpcy5hdXRoV2luZG93KSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXV0aFdpbmRvdy5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5wb2xsSWQpIHtcclxuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnBvbGxJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYXV0aFdpbmRvdyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5wb2xsSWQgPSBudWxsO1xyXG4gICAgICAgIFBvcHVwT3BlcmF0aW9uLmN1cnJlbnRQb3B1cEFjdGlvbiA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBwb2xsVXNlckNhbmNlbGxhdGlvbigpIHtcclxuICAgICAgICBjb25zdCBwb2xsID0gKCkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgICAgICBpZiAoKF9iID0gKF9hID0gdGhpcy5hdXRoV2luZG93KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eud2luZG93KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2xvc2VkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBzdWZmaWNpZW50IHRpbWUgZm9yIHdoYXRldmVyIGFjdGlvbiB0b1xyXG4gICAgICAgICAgICAgICAgLy8gY29tcGxldGUuIFRoZSB3aW5kb3cgY291bGQgaGF2ZSBjbG9zZWQgYnV0IHRoZSBzaWduIGluIG5ldHdvcmtcclxuICAgICAgICAgICAgICAgIC8vIGNhbGwgY291bGQgc3RpbGwgYmUgaW4gZmxpZ2h0LlxyXG4gICAgICAgICAgICAgICAgdGhpcy5wb2xsSWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb2xsSWQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVqZWN0KF9jcmVhdGVFcnJvcih0aGlzLmF1dGgsIFwicG9wdXAtY2xvc2VkLWJ5LXVzZXJcIiAvKiBQT1BVUF9DTE9TRURfQllfVVNFUiAqLykpO1xyXG4gICAgICAgICAgICAgICAgfSwgMjAwMCAvKiBBVVRIX0VWRU5UICovKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnBvbGxJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KHBvbGwsIF9QT0xMX1dJTkRPV19DTE9TRV9USU1FT1VULmdldCgpKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHBvbGwoKTtcclxuICAgIH1cclxufVxyXG4vLyBPbmx5IG9uZSBwb3B1cCBpcyBldmVyIHNob3duIGF0IG9uY2UuIFRoZSBsaWZlY3ljbGUgb2YgdGhlIGN1cnJlbnQgcG9wdXBcclxuLy8gY2FuIGJlIG1hbmFnZWQgLyBjYW5jZWxsZWQgYnkgdGhlIGNvbnN0cnVjdG9yLlxyXG5Qb3B1cE9wZXJhdGlvbi5jdXJyZW50UG9wdXBBY3Rpb24gPSBudWxsO1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBQRU5ESU5HX1JFRElSRUNUX0tFWSA9ICdwZW5kaW5nUmVkaXJlY3QnO1xyXG4vLyBXZSBvbmx5IGdldCBvbmUgcmVkaXJlY3Qgb3V0Y29tZSBmb3IgYW55IG9uZSBhdXRoLCBzbyBqdXN0IHN0b3JlIGl0XHJcbi8vIGluIGhlcmUuXHJcbmNvbnN0IHJlZGlyZWN0T3V0Y29tZU1hcCA9IG5ldyBNYXAoKTtcclxuY2xhc3MgUmVkaXJlY3RBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFBvcHVwUmVkaXJlY3RPcGVyYXRpb24ge1xyXG4gICAgY29uc3RydWN0b3IoYXV0aCwgcmVzb2x2ZXIsIGJ5cGFzc0F1dGhTdGF0ZSA9IGZhbHNlKSB7XHJcbiAgICAgICAgc3VwZXIoYXV0aCwgW1xyXG4gICAgICAgICAgICBcInNpZ25JblZpYVJlZGlyZWN0XCIgLyogU0lHTl9JTl9WSUFfUkVESVJFQ1QgKi8sXHJcbiAgICAgICAgICAgIFwibGlua1ZpYVJlZGlyZWN0XCIgLyogTElOS19WSUFfUkVESVJFQ1QgKi8sXHJcbiAgICAgICAgICAgIFwicmVhdXRoVmlhUmVkaXJlY3RcIiAvKiBSRUFVVEhfVklBX1JFRElSRUNUICovLFxyXG4gICAgICAgICAgICBcInVua25vd25cIiAvKiBVTktOT1dOICovXHJcbiAgICAgICAgXSwgcmVzb2x2ZXIsIHVuZGVmaW5lZCwgYnlwYXNzQXV0aFN0YXRlKTtcclxuICAgICAgICB0aGlzLmV2ZW50SWQgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBPdmVycmlkZSB0aGUgZXhlY3V0ZSBmdW5jdGlvbjsgaWYgd2UgYWxyZWFkeSBoYXZlIGEgcmVkaXJlY3QgcmVzdWx0LCB0aGVuXHJcbiAgICAgKiBqdXN0IHJldHVybiBpdC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcclxuICAgICAgICBsZXQgcmVhZHlPdXRjb21lID0gcmVkaXJlY3RPdXRjb21lTWFwLmdldCh0aGlzLmF1dGguX2tleSgpKTtcclxuICAgICAgICBpZiAoIXJlYWR5T3V0Y29tZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaGFzUGVuZGluZ1JlZGlyZWN0ID0gYXdhaXQgX2dldEFuZENsZWFyUGVuZGluZ1JlZGlyZWN0U3RhdHVzKHRoaXMucmVzb2x2ZXIsIHRoaXMuYXV0aCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBoYXNQZW5kaW5nUmVkaXJlY3QgPyBhd2FpdCBzdXBlci5leGVjdXRlKCkgOiBudWxsO1xyXG4gICAgICAgICAgICAgICAgcmVhZHlPdXRjb21lID0gKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHJlYWR5T3V0Y29tZSA9ICgpID0+IFByb21pc2UucmVqZWN0KGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlZGlyZWN0T3V0Y29tZU1hcC5zZXQodGhpcy5hdXRoLl9rZXkoKSwgcmVhZHlPdXRjb21lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSWYgd2UncmUgbm90IGJ5cGFzc2luZyBhdXRoIHN0YXRlLCB0aGUgcmVhZHkgb3V0Y29tZSBzaG91bGQgYmUgc2V0IHRvXHJcbiAgICAgICAgLy8gbnVsbC5cclxuICAgICAgICBpZiAoIXRoaXMuYnlwYXNzQXV0aFN0YXRlKSB7XHJcbiAgICAgICAgICAgIHJlZGlyZWN0T3V0Y29tZU1hcC5zZXQodGhpcy5hdXRoLl9rZXkoKSwgKCkgPT4gUHJvbWlzZS5yZXNvbHZlKG51bGwpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlYWR5T3V0Y29tZSgpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25BdXRoRXZlbnQoZXZlbnQpIHtcclxuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJzaWduSW5WaWFSZWRpcmVjdFwiIC8qIFNJR05fSU5fVklBX1JFRElSRUNUICovKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzdXBlci5vbkF1dGhFdmVudChldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGV2ZW50LnR5cGUgPT09IFwidW5rbm93blwiIC8qIFVOS05PV04gKi8pIHtcclxuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHNlbnRpbmVsIHZhbHVlIGluZGljYXRpbmcgdGhlcmUncyBubyBwZW5kaW5nIHJlZGlyZWN0XHJcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZShudWxsKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZXZlbnQuZXZlbnRJZCkge1xyXG4gICAgICAgICAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5hdXRoLl9yZWRpcmVjdFVzZXJGb3JJZChldmVudC5ldmVudElkKTtcclxuICAgICAgICAgICAgaWYgKHVzZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXNlciA9IHVzZXI7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIub25BdXRoRXZlbnQoZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlKG51bGwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgb25FeGVjdXRpb24oKSB7IH1cclxuICAgIGNsZWFuVXAoKSB7IH1cclxufVxyXG5hc3luYyBmdW5jdGlvbiBfZ2V0QW5kQ2xlYXJQZW5kaW5nUmVkaXJlY3RTdGF0dXMocmVzb2x2ZXIsIGF1dGgpIHtcclxuICAgIGNvbnN0IGtleSA9IHBlbmRpbmdSZWRpcmVjdEtleShhdXRoKTtcclxuICAgIGNvbnN0IHBlcnNpc3RlbmNlID0gcmVzb2x2ZXJQZXJzaXN0ZW5jZShyZXNvbHZlcik7XHJcbiAgICBpZiAoIShhd2FpdCBwZXJzaXN0ZW5jZS5faXNBdmFpbGFibGUoKSkpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBoYXNQZW5kaW5nUmVkaXJlY3QgPSAoYXdhaXQgcGVyc2lzdGVuY2UuX2dldChrZXkpKSA9PT0gJ3RydWUnO1xyXG4gICAgYXdhaXQgcGVyc2lzdGVuY2UuX3JlbW92ZShrZXkpO1xyXG4gICAgcmV0dXJuIGhhc1BlbmRpbmdSZWRpcmVjdDtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBfc2V0UGVuZGluZ1JlZGlyZWN0U3RhdHVzKHJlc29sdmVyLCBhdXRoKSB7XHJcbiAgICByZXR1cm4gcmVzb2x2ZXJQZXJzaXN0ZW5jZShyZXNvbHZlcikuX3NldChwZW5kaW5nUmVkaXJlY3RLZXkoYXV0aCksICd0cnVlJyk7XHJcbn1cclxuZnVuY3Rpb24gX2NsZWFyUmVkaXJlY3RPdXRjb21lcygpIHtcclxuICAgIHJlZGlyZWN0T3V0Y29tZU1hcC5jbGVhcigpO1xyXG59XHJcbmZ1bmN0aW9uIHJlc29sdmVyUGVyc2lzdGVuY2UocmVzb2x2ZXIpIHtcclxuICAgIHJldHVybiBfZ2V0SW5zdGFuY2UocmVzb2x2ZXIuX3JlZGlyZWN0UGVyc2lzdGVuY2UpO1xyXG59XHJcbmZ1bmN0aW9uIHBlbmRpbmdSZWRpcmVjdEtleShhdXRoKSB7XHJcbiAgICByZXR1cm4gX3BlcnNpc3RlbmNlS2V5TmFtZShQRU5ESU5HX1JFRElSRUNUX0tFWSwgYXV0aC5jb25maWcuYXBpS2V5LCBhdXRoLm5hbWUpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBBdXRoZW50aWNhdGVzIGEgRmlyZWJhc2UgY2xpZW50IHVzaW5nIGEgZnVsbC1wYWdlIHJlZGlyZWN0IGZsb3cuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIFRvIGhhbmRsZSB0aGUgcmVzdWx0cyBhbmQgZXJyb3JzIGZvciB0aGlzIG9wZXJhdGlvbiwgcmVmZXIgdG8ge0BsaW5rIGdldFJlZGlyZWN0UmVzdWx0fS5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiAvLyBTaWduIGluIHVzaW5nIGEgcmVkaXJlY3QuXHJcbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IEZhY2Vib29rQXV0aFByb3ZpZGVyKCk7XHJcbiAqIC8vIFlvdSBjYW4gYWRkIGFkZGl0aW9uYWwgc2NvcGVzIHRvIHRoZSBwcm92aWRlcjpcclxuICogcHJvdmlkZXIuYWRkU2NvcGUoJ3VzZXJfYmlydGhkYXknKTtcclxuICogLy8gU3RhcnQgYSBzaWduIGluIHByb2Nlc3MgZm9yIGFuIHVuYXV0aGVudGljYXRlZCB1c2VyLlxyXG4gKiBhd2FpdCBzaWduSW5XaXRoUmVkaXJlY3QoYXV0aCwgcHJvdmlkZXIpO1xyXG4gKiAvLyBUaGlzIHdpbGwgdHJpZ2dlciBhIGZ1bGwgcGFnZSByZWRpcmVjdCBhd2F5IGZyb20geW91ciBhcHBcclxuICpcclxuICogLy8gQWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhlIHJlZGlyZWN0IHdoZW4geW91ciBhcHAgaW5pdGlhbGl6ZXMgeW91IGNhbiBvYnRhaW4gdGhlIHJlc3VsdFxyXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRSZWRpcmVjdFJlc3VsdChhdXRoKTtcclxuICogaWYgKHJlc3VsdCkge1xyXG4gKiAgIC8vIFRoaXMgaXMgdGhlIHNpZ25lZC1pbiB1c2VyXHJcbiAqICAgY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xyXG4gKiAgIC8vIFRoaXMgZ2l2ZXMgeW91IGEgRmFjZWJvb2sgQWNjZXNzIFRva2VuLlxyXG4gKiAgIGNvbnN0IGNyZWRlbnRpYWwgPSBwcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChhdXRoLCByZXN1bHQpO1xyXG4gKiAgIGNvbnN0IHRva2VuID0gY3JlZGVudGlhbC5hY2Nlc3NUb2tlbjtcclxuICogfVxyXG4gKiAvLyBBcyB0aGlzIEFQSSBjYW4gYmUgdXNlZCBmb3Igc2lnbi1pbiwgbGlua2luZyBhbmQgcmVhdXRoZW50aWNhdGlvbixcclxuICogLy8gY2hlY2sgdGhlIG9wZXJhdGlvblR5cGUgdG8gZGV0ZXJtaW5lIHdoYXQgdHJpZ2dlcmVkIHRoaXMgcmVkaXJlY3RcclxuICogLy8gb3BlcmF0aW9uLlxyXG4gKiBjb25zdCBvcGVyYXRpb25UeXBlID0gcmVzdWx0Lm9wZXJhdGlvblR5cGU7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSBwcm92aWRlciAtIFRoZSBwcm92aWRlciB0byBhdXRoZW50aWNhdGUuIFRoZSBwcm92aWRlciBoYXMgdG8gYmUgYW4ge0BsaW5rIE9BdXRoUHJvdmlkZXJ9LlxyXG4gKiBOb24tT0F1dGggcHJvdmlkZXJzIGxpa2Uge0BsaW5rIEVtYWlsQXV0aFByb3ZpZGVyfSB3aWxsIHRocm93IGFuIGVycm9yLlxyXG4gKiBAcGFyYW0gcmVzb2x2ZXIgLSBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgUG9wdXBSZWRpcmVjdFJlc29sdmVyfSwgb3B0aW9uYWxcclxuICogaWYgYWxyZWFkeSBzdXBwbGllZCB0byB7QGxpbmsgaW5pdGlhbGl6ZUF1dGh9IG9yIHByb3ZpZGVkIGJ5IHtAbGluayBnZXRBdXRofS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gc2lnbkluV2l0aFJlZGlyZWN0KGF1dGgsIHByb3ZpZGVyLCByZXNvbHZlcikge1xyXG4gICAgcmV0dXJuIF9zaWduSW5XaXRoUmVkaXJlY3QoYXV0aCwgcHJvdmlkZXIsIHJlc29sdmVyKTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBfc2lnbkluV2l0aFJlZGlyZWN0KGF1dGgsIHByb3ZpZGVyLCByZXNvbHZlcikge1xyXG4gICAgY29uc3QgYXV0aEludGVybmFsID0gX2Nhc3RBdXRoKGF1dGgpO1xyXG4gICAgX2Fzc2VydEluc3RhbmNlT2YoYXV0aCwgcHJvdmlkZXIsIEZlZGVyYXRlZEF1dGhQcm92aWRlcik7XHJcbiAgICBjb25zdCByZXNvbHZlckludGVybmFsID0gX3dpdGhEZWZhdWx0UmVzb2x2ZXIoYXV0aEludGVybmFsLCByZXNvbHZlcik7XHJcbiAgICBhd2FpdCBfc2V0UGVuZGluZ1JlZGlyZWN0U3RhdHVzKHJlc29sdmVySW50ZXJuYWwsIGF1dGhJbnRlcm5hbCk7XHJcbiAgICByZXR1cm4gcmVzb2x2ZXJJbnRlcm5hbC5fb3BlblJlZGlyZWN0KGF1dGhJbnRlcm5hbCwgcHJvdmlkZXIsIFwic2lnbkluVmlhUmVkaXJlY3RcIiAvKiBTSUdOX0lOX1ZJQV9SRURJUkVDVCAqLyk7XHJcbn1cclxuLyoqXHJcbiAqIFJlYXV0aGVudGljYXRlcyB0aGUgY3VycmVudCB1c2VyIHdpdGggdGhlIHNwZWNpZmllZCB7QGxpbmsgT0F1dGhQcm92aWRlcn0gdXNpbmcgYSBmdWxsLXBhZ2UgcmVkaXJlY3QgZmxvdy5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiAvLyBTaWduIGluIHVzaW5nIGEgcmVkaXJlY3QuXHJcbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IEZhY2Vib29rQXV0aFByb3ZpZGVyKCk7XHJcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpZ25JbldpdGhSZWRpcmVjdChhdXRoLCBwcm92aWRlcik7XHJcbiAqIC8vIFRoaXMgd2lsbCB0cmlnZ2VyIGEgZnVsbCBwYWdlIHJlZGlyZWN0IGF3YXkgZnJvbSB5b3VyIGFwcFxyXG4gKlxyXG4gKiAvLyBBZnRlciByZXR1cm5pbmcgZnJvbSB0aGUgcmVkaXJlY3Qgd2hlbiB5b3VyIGFwcCBpbml0aWFsaXplcyB5b3UgY2FuIG9idGFpbiB0aGUgcmVzdWx0XHJcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlZGlyZWN0UmVzdWx0KGF1dGgpO1xyXG4gKiAvLyBMaW5rIHVzaW5nIGEgcmVkaXJlY3QuXHJcbiAqIGF3YWl0IGxpbmtXaXRoUmVkaXJlY3QocmVzdWx0LnVzZXIsIHByb3ZpZGVyKTtcclxuICogLy8gVGhpcyB3aWxsIGFnYWluIHRyaWdnZXIgYSBmdWxsIHBhZ2UgcmVkaXJlY3QgYXdheSBmcm9tIHlvdXIgYXBwXHJcbiAqXHJcbiAqIC8vIEFmdGVyIHJldHVybmluZyBmcm9tIHRoZSByZWRpcmVjdCB3aGVuIHlvdXIgYXBwIGluaXRpYWxpemVzIHlvdSBjYW4gb2J0YWluIHRoZSByZXN1bHRcclxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVkaXJlY3RSZXN1bHQoYXV0aCk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxyXG4gKiBAcGFyYW0gcHJvdmlkZXIgLSBUaGUgcHJvdmlkZXIgdG8gYXV0aGVudGljYXRlLiBUaGUgcHJvdmlkZXIgaGFzIHRvIGJlIGFuIHtAbGluayBPQXV0aFByb3ZpZGVyfS5cclxuICogTm9uLU9BdXRoIHByb3ZpZGVycyBsaWtlIHtAbGluayBFbWFpbEF1dGhQcm92aWRlcn0gd2lsbCB0aHJvdyBhbiBlcnJvci5cclxuICogQHBhcmFtIHJlc29sdmVyIC0gQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFBvcHVwUmVkaXJlY3RSZXNvbHZlcn0sIG9wdGlvbmFsXHJcbiAqIGlmIGFscmVhZHkgc3VwcGxpZWQgdG8ge0BsaW5rIGluaXRpYWxpemVBdXRofSBvciBwcm92aWRlZCBieSB7QGxpbmsgZ2V0QXV0aH0uXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmZ1bmN0aW9uIHJlYXV0aGVudGljYXRlV2l0aFJlZGlyZWN0KHVzZXIsIHByb3ZpZGVyLCByZXNvbHZlcikge1xyXG4gICAgcmV0dXJuIF9yZWF1dGhlbnRpY2F0ZVdpdGhSZWRpcmVjdCh1c2VyLCBwcm92aWRlciwgcmVzb2x2ZXIpO1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIF9yZWF1dGhlbnRpY2F0ZVdpdGhSZWRpcmVjdCh1c2VyLCBwcm92aWRlciwgcmVzb2x2ZXIpIHtcclxuICAgIGNvbnN0IHVzZXJJbnRlcm5hbCA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKTtcclxuICAgIF9hc3NlcnRJbnN0YW5jZU9mKHVzZXJJbnRlcm5hbC5hdXRoLCBwcm92aWRlciwgRmVkZXJhdGVkQXV0aFByb3ZpZGVyKTtcclxuICAgIC8vIEFsbG93IHRoZSByZXNvbHZlciB0byBlcnJvciBiZWZvcmUgcGVyc2lzdGluZyB0aGUgcmVkaXJlY3QgdXNlclxyXG4gICAgY29uc3QgcmVzb2x2ZXJJbnRlcm5hbCA9IF93aXRoRGVmYXVsdFJlc29sdmVyKHVzZXJJbnRlcm5hbC5hdXRoLCByZXNvbHZlcik7XHJcbiAgICBhd2FpdCBfc2V0UGVuZGluZ1JlZGlyZWN0U3RhdHVzKHJlc29sdmVySW50ZXJuYWwsIHVzZXJJbnRlcm5hbC5hdXRoKTtcclxuICAgIGNvbnN0IGV2ZW50SWQgPSBhd2FpdCBwcmVwYXJlVXNlckZvclJlZGlyZWN0KHVzZXJJbnRlcm5hbCk7XHJcbiAgICByZXR1cm4gcmVzb2x2ZXJJbnRlcm5hbC5fb3BlblJlZGlyZWN0KHVzZXJJbnRlcm5hbC5hdXRoLCBwcm92aWRlciwgXCJyZWF1dGhWaWFSZWRpcmVjdFwiIC8qIFJFQVVUSF9WSUFfUkVESVJFQ1QgKi8sIGV2ZW50SWQpO1xyXG59XHJcbi8qKlxyXG4gKiBMaW5rcyB0aGUge0BsaW5rIE9BdXRoUHJvdmlkZXJ9IHRvIHRoZSB1c2VyIGFjY291bnQgdXNpbmcgYSBmdWxsLXBhZ2UgcmVkaXJlY3QgZmxvdy5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiAvLyBTaWduIGluIHVzaW5nIHNvbWUgb3RoZXIgcHJvdmlkZXIuXHJcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpZ25JbldpdGhFbWFpbEFuZFBhc3N3b3JkKGF1dGgsIGVtYWlsLCBwYXNzd29yZCk7XHJcbiAqIC8vIExpbmsgdXNpbmcgYSByZWRpcmVjdC5cclxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgRmFjZWJvb2tBdXRoUHJvdmlkZXIoKTtcclxuICogYXdhaXQgbGlua1dpdGhSZWRpcmVjdChyZXN1bHQudXNlciwgcHJvdmlkZXIpO1xyXG4gKiAvLyBUaGlzIHdpbGwgdHJpZ2dlciBhIGZ1bGwgcGFnZSByZWRpcmVjdCBhd2F5IGZyb20geW91ciBhcHBcclxuICpcclxuICogLy8gQWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhlIHJlZGlyZWN0IHdoZW4geW91ciBhcHAgaW5pdGlhbGl6ZXMgeW91IGNhbiBvYnRhaW4gdGhlIHJlc3VsdFxyXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRSZWRpcmVjdFJlc3VsdChhdXRoKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXHJcbiAqIEBwYXJhbSBwcm92aWRlciAtIFRoZSBwcm92aWRlciB0byBhdXRoZW50aWNhdGUuIFRoZSBwcm92aWRlciBoYXMgdG8gYmUgYW4ge0BsaW5rIE9BdXRoUHJvdmlkZXJ9LlxyXG4gKiBOb24tT0F1dGggcHJvdmlkZXJzIGxpa2Uge0BsaW5rIEVtYWlsQXV0aFByb3ZpZGVyfSB3aWxsIHRocm93IGFuIGVycm9yLlxyXG4gKiBAcGFyYW0gcmVzb2x2ZXIgLSBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgUG9wdXBSZWRpcmVjdFJlc29sdmVyfSwgb3B0aW9uYWxcclxuICogaWYgYWxyZWFkeSBzdXBwbGllZCB0byB7QGxpbmsgaW5pdGlhbGl6ZUF1dGh9IG9yIHByb3ZpZGVkIGJ5IHtAbGluayBnZXRBdXRofS5cclxuICpcclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gbGlua1dpdGhSZWRpcmVjdCh1c2VyLCBwcm92aWRlciwgcmVzb2x2ZXIpIHtcclxuICAgIHJldHVybiBfbGlua1dpdGhSZWRpcmVjdCh1c2VyLCBwcm92aWRlciwgcmVzb2x2ZXIpO1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIF9saW5rV2l0aFJlZGlyZWN0KHVzZXIsIHByb3ZpZGVyLCByZXNvbHZlcikge1xyXG4gICAgY29uc3QgdXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpO1xyXG4gICAgX2Fzc2VydEluc3RhbmNlT2YodXNlckludGVybmFsLmF1dGgsIHByb3ZpZGVyLCBGZWRlcmF0ZWRBdXRoUHJvdmlkZXIpO1xyXG4gICAgLy8gQWxsb3cgdGhlIHJlc29sdmVyIHRvIGVycm9yIGJlZm9yZSBwZXJzaXN0aW5nIHRoZSByZWRpcmVjdCB1c2VyXHJcbiAgICBjb25zdCByZXNvbHZlckludGVybmFsID0gX3dpdGhEZWZhdWx0UmVzb2x2ZXIodXNlckludGVybmFsLmF1dGgsIHJlc29sdmVyKTtcclxuICAgIGF3YWl0IF9hc3NlcnRMaW5rZWRTdGF0dXMoZmFsc2UsIHVzZXJJbnRlcm5hbCwgcHJvdmlkZXIucHJvdmlkZXJJZCk7XHJcbiAgICBhd2FpdCBfc2V0UGVuZGluZ1JlZGlyZWN0U3RhdHVzKHJlc29sdmVySW50ZXJuYWwsIHVzZXJJbnRlcm5hbC5hdXRoKTtcclxuICAgIGNvbnN0IGV2ZW50SWQgPSBhd2FpdCBwcmVwYXJlVXNlckZvclJlZGlyZWN0KHVzZXJJbnRlcm5hbCk7XHJcbiAgICByZXR1cm4gcmVzb2x2ZXJJbnRlcm5hbC5fb3BlblJlZGlyZWN0KHVzZXJJbnRlcm5hbC5hdXRoLCBwcm92aWRlciwgXCJsaW5rVmlhUmVkaXJlY3RcIiAvKiBMSU5LX1ZJQV9SRURJUkVDVCAqLywgZXZlbnRJZCk7XHJcbn1cclxuLyoqXHJcbiAqIFJldHVybnMgYSB7QGxpbmsgVXNlckNyZWRlbnRpYWx9IGZyb20gdGhlIHJlZGlyZWN0LWJhc2VkIHNpZ24taW4gZmxvdy5cclxuICpcclxuICogQHJlbWFya3NcclxuICogSWYgc2lnbi1pbiBzdWNjZWVkZWQsIHJldHVybnMgdGhlIHNpZ25lZCBpbiB1c2VyLiBJZiBzaWduLWluIHdhcyB1bnN1Y2Nlc3NmdWwsIGZhaWxzIHdpdGggYW5cclxuICogZXJyb3IuIElmIG5vIHJlZGlyZWN0IG9wZXJhdGlvbiB3YXMgY2FsbGVkLCByZXR1cm5zIGEge0BsaW5rIFVzZXJDcmVkZW50aWFsfVxyXG4gKiB3aXRoIGEgbnVsbCBgdXNlcmAuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogLy8gU2lnbiBpbiB1c2luZyBhIHJlZGlyZWN0LlxyXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBGYWNlYm9va0F1dGhQcm92aWRlcigpO1xyXG4gKiAvLyBZb3UgY2FuIGFkZCBhZGRpdGlvbmFsIHNjb3BlcyB0byB0aGUgcHJvdmlkZXI6XHJcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCd1c2VyX2JpcnRoZGF5Jyk7XHJcbiAqIC8vIFN0YXJ0IGEgc2lnbiBpbiBwcm9jZXNzIGZvciBhbiB1bmF1dGhlbnRpY2F0ZWQgdXNlci5cclxuICogYXdhaXQgc2lnbkluV2l0aFJlZGlyZWN0KGF1dGgsIHByb3ZpZGVyKTtcclxuICogLy8gVGhpcyB3aWxsIHRyaWdnZXIgYSBmdWxsIHBhZ2UgcmVkaXJlY3QgYXdheSBmcm9tIHlvdXIgYXBwXHJcbiAqXHJcbiAqIC8vIEFmdGVyIHJldHVybmluZyBmcm9tIHRoZSByZWRpcmVjdCB3aGVuIHlvdXIgYXBwIGluaXRpYWxpemVzIHlvdSBjYW4gb2J0YWluIHRoZSByZXN1bHRcclxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVkaXJlY3RSZXN1bHQoYXV0aCk7XHJcbiAqIGlmIChyZXN1bHQpIHtcclxuICogICAvLyBUaGlzIGlzIHRoZSBzaWduZWQtaW4gdXNlclxyXG4gKiAgIGNvbnN0IHVzZXIgPSByZXN1bHQudXNlcjtcclxuICogICAvLyBUaGlzIGdpdmVzIHlvdSBhIEZhY2Vib29rIEFjY2VzcyBUb2tlbi5cclxuICogICBjb25zdCBjcmVkZW50aWFsID0gcHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQoYXV0aCwgcmVzdWx0KTtcclxuICogICBjb25zdCB0b2tlbiA9IGNyZWRlbnRpYWwuYWNjZXNzVG9rZW47XHJcbiAqIH1cclxuICogLy8gQXMgdGhpcyBBUEkgY2FuIGJlIHVzZWQgZm9yIHNpZ24taW4sIGxpbmtpbmcgYW5kIHJlYXV0aGVudGljYXRpb24sXHJcbiAqIC8vIGNoZWNrIHRoZSBvcGVyYXRpb25UeXBlIHRvIGRldGVybWluZSB3aGF0IHRyaWdnZXJlZCB0aGlzIHJlZGlyZWN0XHJcbiAqIC8vIG9wZXJhdGlvbi5cclxuICogY29uc3Qgb3BlcmF0aW9uVHlwZSA9IHJlc3VsdC5vcGVyYXRpb25UeXBlO1xyXG4gKiBgYGBcclxuICpcclxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxyXG4gKiBAcGFyYW0gcmVzb2x2ZXIgLSBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgUG9wdXBSZWRpcmVjdFJlc29sdmVyfSwgb3B0aW9uYWxcclxuICogaWYgYWxyZWFkeSBzdXBwbGllZCB0byB7QGxpbmsgaW5pdGlhbGl6ZUF1dGh9IG9yIHByb3ZpZGVkIGJ5IHtAbGluayBnZXRBdXRofS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gZ2V0UmVkaXJlY3RSZXN1bHQoYXV0aCwgcmVzb2x2ZXIpIHtcclxuICAgIGF3YWl0IF9jYXN0QXV0aChhdXRoKS5faW5pdGlhbGl6YXRpb25Qcm9taXNlO1xyXG4gICAgcmV0dXJuIF9nZXRSZWRpcmVjdFJlc3VsdChhdXRoLCByZXNvbHZlciwgZmFsc2UpO1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIF9nZXRSZWRpcmVjdFJlc3VsdChhdXRoLCByZXNvbHZlckV4dGVybiwgYnlwYXNzQXV0aFN0YXRlID0gZmFsc2UpIHtcclxuICAgIGNvbnN0IGF1dGhJbnRlcm5hbCA9IF9jYXN0QXV0aChhdXRoKTtcclxuICAgIGNvbnN0IHJlc29sdmVyID0gX3dpdGhEZWZhdWx0UmVzb2x2ZXIoYXV0aEludGVybmFsLCByZXNvbHZlckV4dGVybik7XHJcbiAgICBjb25zdCBhY3Rpb24gPSBuZXcgUmVkaXJlY3RBY3Rpb24oYXV0aEludGVybmFsLCByZXNvbHZlciwgYnlwYXNzQXV0aFN0YXRlKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFjdGlvbi5leGVjdXRlKCk7XHJcbiAgICBpZiAocmVzdWx0ICYmICFieXBhc3NBdXRoU3RhdGUpIHtcclxuICAgICAgICBkZWxldGUgcmVzdWx0LnVzZXIuX3JlZGlyZWN0RXZlbnRJZDtcclxuICAgICAgICBhd2FpdCBhdXRoSW50ZXJuYWwuX3BlcnNpc3RVc2VySWZDdXJyZW50KHJlc3VsdC51c2VyKTtcclxuICAgICAgICBhd2FpdCBhdXRoSW50ZXJuYWwuX3NldFJlZGlyZWN0VXNlcihudWxsLCByZXNvbHZlckV4dGVybik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIHByZXBhcmVVc2VyRm9yUmVkaXJlY3QodXNlcikge1xyXG4gICAgY29uc3QgZXZlbnRJZCA9IF9nZW5lcmF0ZUV2ZW50SWQoYCR7dXNlci51aWR9Ojo6YCk7XHJcbiAgICB1c2VyLl9yZWRpcmVjdEV2ZW50SWQgPSBldmVudElkO1xyXG4gICAgYXdhaXQgdXNlci5hdXRoLl9zZXRSZWRpcmVjdFVzZXIodXNlcik7XHJcbiAgICBhd2FpdCB1c2VyLmF1dGguX3BlcnNpc3RVc2VySWZDdXJyZW50KHVzZXIpO1xyXG4gICAgcmV0dXJuIGV2ZW50SWQ7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLy8gVGhlIGFtb3VudCBvZiB0aW1lIHRvIHN0b3JlIHRoZSBVSURzIG9mIHNlZW4gZXZlbnRzOyB0aGlzIGlzXHJcbi8vIHNldCB0byAxMCBtaW4gYnkgZGVmYXVsdFxyXG5jb25zdCBFVkVOVF9EVVBMSUNBVElPTl9DQUNIRV9EVVJBVElPTl9NUyA9IDEwICogNjAgKiAxMDAwO1xyXG5jbGFzcyBBdXRoRXZlbnRNYW5hZ2VyIHtcclxuICAgIGNvbnN0cnVjdG9yKGF1dGgpIHtcclxuICAgICAgICB0aGlzLmF1dGggPSBhdXRoO1xyXG4gICAgICAgIHRoaXMuY2FjaGVkRXZlbnRVaWRzID0gbmV3IFNldCgpO1xyXG4gICAgICAgIHRoaXMuY29uc3VtZXJzID0gbmV3IFNldCgpO1xyXG4gICAgICAgIHRoaXMucXVldWVkUmVkaXJlY3RFdmVudCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5oYXNIYW5kbGVkUG90ZW50aWFsUmVkaXJlY3QgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmxhc3RQcm9jZXNzZWRFdmVudFRpbWUgPSBEYXRlLm5vdygpO1xyXG4gICAgfVxyXG4gICAgcmVnaXN0ZXJDb25zdW1lcihhdXRoRXZlbnRDb25zdW1lcikge1xyXG4gICAgICAgIHRoaXMuY29uc3VtZXJzLmFkZChhdXRoRXZlbnRDb25zdW1lcik7XHJcbiAgICAgICAgaWYgKHRoaXMucXVldWVkUmVkaXJlY3RFdmVudCAmJlxyXG4gICAgICAgICAgICB0aGlzLmlzRXZlbnRGb3JDb25zdW1lcih0aGlzLnF1ZXVlZFJlZGlyZWN0RXZlbnQsIGF1dGhFdmVudENvbnN1bWVyKSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbmRUb0NvbnN1bWVyKHRoaXMucXVldWVkUmVkaXJlY3RFdmVudCwgYXV0aEV2ZW50Q29uc3VtZXIpO1xyXG4gICAgICAgICAgICB0aGlzLnNhdmVFdmVudFRvQ2FjaGUodGhpcy5xdWV1ZWRSZWRpcmVjdEV2ZW50KTtcclxuICAgICAgICAgICAgdGhpcy5xdWV1ZWRSZWRpcmVjdEV2ZW50ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB1bnJlZ2lzdGVyQ29uc3VtZXIoYXV0aEV2ZW50Q29uc3VtZXIpIHtcclxuICAgICAgICB0aGlzLmNvbnN1bWVycy5kZWxldGUoYXV0aEV2ZW50Q29uc3VtZXIpO1xyXG4gICAgfVxyXG4gICAgb25FdmVudChldmVudCkge1xyXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBldmVudCBoYXMgYWxyZWFkeSBiZWVuIGhhbmRsZWRcclxuICAgICAgICBpZiAodGhpcy5oYXNFdmVudEJlZW5IYW5kbGVkKGV2ZW50KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBoYW5kbGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jb25zdW1lcnMuZm9yRWFjaChjb25zdW1lciA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRXZlbnRGb3JDb25zdW1lcihldmVudCwgY29uc3VtZXIpKSB7XHJcbiAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VuZFRvQ29uc3VtZXIoZXZlbnQsIGNvbnN1bWVyKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUV2ZW50VG9DYWNoZShldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAodGhpcy5oYXNIYW5kbGVkUG90ZW50aWFsUmVkaXJlY3QgfHwgIWlzUmVkaXJlY3RFdmVudChldmVudCkpIHtcclxuICAgICAgICAgICAgLy8gSWYgd2UndmUgYWxyZWFkeSBzZWVuIGEgcmVkaXJlY3QgYmVmb3JlLCBvciB0aGlzIGlzIGEgcG9wdXAgZXZlbnQsXHJcbiAgICAgICAgICAgIC8vIGJhaWwgbm93XHJcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmhhc0hhbmRsZWRQb3RlbnRpYWxSZWRpcmVjdCA9IHRydWU7XHJcbiAgICAgICAgLy8gSWYgdGhlIHJlZGlyZWN0IHdhc24ndCBoYW5kbGVkLCBoYW5nIG9uIHRvIGl0XHJcbiAgICAgICAgaWYgKCFoYW5kbGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucXVldWVkUmVkaXJlY3RFdmVudCA9IGV2ZW50O1xyXG4gICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGhhbmRsZWQ7XHJcbiAgICB9XHJcbiAgICBzZW5kVG9Db25zdW1lcihldmVudCwgY29uc3VtZXIpIHtcclxuICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgaWYgKGV2ZW50LmVycm9yICYmICFpc051bGxSZWRpcmVjdEV2ZW50KGV2ZW50KSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb2RlID0gKChfYSA9IGV2ZW50LmVycm9yLmNvZGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zcGxpdCgnYXV0aC8nKVsxXSkgfHxcclxuICAgICAgICAgICAgICAgIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLztcclxuICAgICAgICAgICAgY29uc3VtZXIub25FcnJvcihfY3JlYXRlRXJyb3IodGhpcy5hdXRoLCBjb2RlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdW1lci5vbkF1dGhFdmVudChldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaXNFdmVudEZvckNvbnN1bWVyKGV2ZW50LCBjb25zdW1lcikge1xyXG4gICAgICAgIGNvbnN0IGV2ZW50SWRNYXRjaGVzID0gY29uc3VtZXIuZXZlbnRJZCA9PT0gbnVsbCB8fFxyXG4gICAgICAgICAgICAoISFldmVudC5ldmVudElkICYmIGV2ZW50LmV2ZW50SWQgPT09IGNvbnN1bWVyLmV2ZW50SWQpO1xyXG4gICAgICAgIHJldHVybiBjb25zdW1lci5maWx0ZXIuaW5jbHVkZXMoZXZlbnQudHlwZSkgJiYgZXZlbnRJZE1hdGNoZXM7XHJcbiAgICB9XHJcbiAgICBoYXNFdmVudEJlZW5IYW5kbGVkKGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKERhdGUubm93KCkgLSB0aGlzLmxhc3RQcm9jZXNzZWRFdmVudFRpbWUgPj1cclxuICAgICAgICAgICAgRVZFTlRfRFVQTElDQVRJT05fQ0FDSEVfRFVSQVRJT05fTVMpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWNoZWRFdmVudFVpZHMuY2xlYXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkRXZlbnRVaWRzLmhhcyhldmVudFVpZChldmVudCkpO1xyXG4gICAgfVxyXG4gICAgc2F2ZUV2ZW50VG9DYWNoZShldmVudCkge1xyXG4gICAgICAgIHRoaXMuY2FjaGVkRXZlbnRVaWRzLmFkZChldmVudFVpZChldmVudCkpO1xyXG4gICAgICAgIHRoaXMubGFzdFByb2Nlc3NlZEV2ZW50VGltZSA9IERhdGUubm93KCk7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gZXZlbnRVaWQoZSkge1xyXG4gICAgcmV0dXJuIFtlLnR5cGUsIGUuZXZlbnRJZCwgZS5zZXNzaW9uSWQsIGUudGVuYW50SWRdLmZpbHRlcih2ID0+IHYpLmpvaW4oJy0nKTtcclxufVxyXG5mdW5jdGlvbiBpc051bGxSZWRpcmVjdEV2ZW50KHsgdHlwZSwgZXJyb3IgfSkge1xyXG4gICAgcmV0dXJuICh0eXBlID09PSBcInVua25vd25cIiAvKiBVTktOT1dOICovICYmXHJcbiAgICAgICAgKGVycm9yID09PSBudWxsIHx8IGVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJvci5jb2RlKSA9PT0gYGF1dGgvJHtcIm5vLWF1dGgtZXZlbnRcIiAvKiBOT19BVVRIX0VWRU5UICovfWApO1xyXG59XHJcbmZ1bmN0aW9uIGlzUmVkaXJlY3RFdmVudChldmVudCkge1xyXG4gICAgc3dpdGNoIChldmVudC50eXBlKSB7XHJcbiAgICAgICAgY2FzZSBcInNpZ25JblZpYVJlZGlyZWN0XCIgLyogU0lHTl9JTl9WSUFfUkVESVJFQ1QgKi86XHJcbiAgICAgICAgY2FzZSBcImxpbmtWaWFSZWRpcmVjdFwiIC8qIExJTktfVklBX1JFRElSRUNUICovOlxyXG4gICAgICAgIGNhc2UgXCJyZWF1dGhWaWFSZWRpcmVjdFwiIC8qIFJFQVVUSF9WSUFfUkVESVJFQ1QgKi86XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGNhc2UgXCJ1bmtub3duXCIgLyogVU5LTk9XTiAqLzpcclxuICAgICAgICAgICAgcmV0dXJuIGlzTnVsbFJlZGlyZWN0RXZlbnQoZXZlbnQpO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBfZ2V0UHJvamVjdENvbmZpZyhhdXRoLCByZXF1ZXN0ID0ge30pIHtcclxuICAgIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3QoYXV0aCwgXCJHRVRcIiAvKiBHRVQgKi8sIFwiL3YxL3Byb2plY3RzXCIgLyogR0VUX1BST0pFQ1RfQ09ORklHICovLCByZXF1ZXN0KTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBJUF9BRERSRVNTX1JFR0VYID0gL15cXGR7MSwzfVxcLlxcZHsxLDN9XFwuXFxkezEsM31cXC5cXGR7MSwzfSQvO1xyXG5jb25zdCBIVFRQX1JFR0VYID0gL15odHRwcz8vO1xyXG5hc3luYyBmdW5jdGlvbiBfdmFsaWRhdGVPcmlnaW4oYXV0aCkge1xyXG4gICAgLy8gU2tpcCBvcmlnaW4gdmFsaWRhdGlvbiBpZiB3ZSBhcmUgaW4gYW4gZW11bGF0ZWQgZW52aXJvbm1lbnRcclxuICAgIGlmIChhdXRoLmNvbmZpZy5lbXVsYXRvcikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHsgYXV0aG9yaXplZERvbWFpbnMgfSA9IGF3YWl0IF9nZXRQcm9qZWN0Q29uZmlnKGF1dGgpO1xyXG4gICAgZm9yIChjb25zdCBkb21haW4gb2YgYXV0aG9yaXplZERvbWFpbnMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAobWF0Y2hEb21haW4oZG9tYWluKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAvLyBEbyBub3RoaW5nIGlmIHRoZXJlJ3MgYSBVUkwgZXJyb3I7IGp1c3QgY29udGludWUgc2VhcmNoaW5nXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gSW4gdGhlIG9sZCBTREssIHRoaXMgZXJyb3IgYWxzbyBwcm92aWRlcyBoZWxwZnVsIG1lc3NhZ2VzLlxyXG4gICAgX2ZhaWwoYXV0aCwgXCJ1bmF1dGhvcml6ZWQtZG9tYWluXCIgLyogSU5WQUxJRF9PUklHSU4gKi8pO1xyXG59XHJcbmZ1bmN0aW9uIG1hdGNoRG9tYWluKGV4cGVjdGVkKSB7XHJcbiAgICBjb25zdCBjdXJyZW50VXJsID0gX2dldEN1cnJlbnRVcmwoKTtcclxuICAgIGNvbnN0IHsgcHJvdG9jb2wsIGhvc3RuYW1lIH0gPSBuZXcgVVJMKGN1cnJlbnRVcmwpO1xyXG4gICAgaWYgKGV4cGVjdGVkLnN0YXJ0c1dpdGgoJ2Nocm9tZS1leHRlbnNpb246Ly8nKSkge1xyXG4gICAgICAgIGNvbnN0IGNlVXJsID0gbmV3IFVSTChleHBlY3RlZCk7XHJcbiAgICAgICAgaWYgKGNlVXJsLmhvc3RuYW1lID09PSAnJyAmJiBob3N0bmFtZSA9PT0gJycpIHtcclxuICAgICAgICAgICAgLy8gRm9yIHNvbWUgcmVhc29uIHdlJ3JlIG5vdCBwYXJzaW5nIGNocm9tZSBVUkxzIHByb3Blcmx5XHJcbiAgICAgICAgICAgIHJldHVybiAocHJvdG9jb2wgPT09ICdjaHJvbWUtZXh0ZW5zaW9uOicgJiZcclxuICAgICAgICAgICAgICAgIGV4cGVjdGVkLnJlcGxhY2UoJ2Nocm9tZS1leHRlbnNpb246Ly8nLCAnJykgPT09XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFVybC5yZXBsYWNlKCdjaHJvbWUtZXh0ZW5zaW9uOi8vJywgJycpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHByb3RvY29sID09PSAnY2hyb21lLWV4dGVuc2lvbjonICYmIGNlVXJsLmhvc3RuYW1lID09PSBob3N0bmFtZTtcclxuICAgIH1cclxuICAgIGlmICghSFRUUF9SRUdFWC50ZXN0KHByb3RvY29sKSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmIChJUF9BRERSRVNTX1JFR0VYLnRlc3QoZXhwZWN0ZWQpKSB7XHJcbiAgICAgICAgLy8gVGhlIGRvbWFpbiBoYXMgdG8gYmUgZXhhY3RseSBlcXVhbCB0byB0aGUgcGF0dGVybiwgYXMgYW4gSVAgZG9tYWluIHdpbGxcclxuICAgICAgICAvLyBvbmx5IGNvbnRhaW4gdGhlIElQLCBubyBleHRyYSBjaGFyYWN0ZXIuXHJcbiAgICAgICAgcmV0dXJuIGhvc3RuYW1lID09PSBleHBlY3RlZDtcclxuICAgIH1cclxuICAgIC8vIERvdHMgaW4gcGF0dGVybiBzaG91bGQgYmUgZXNjYXBlZC5cclxuICAgIGNvbnN0IGVzY2FwZWREb21haW5QYXR0ZXJuID0gZXhwZWN0ZWQucmVwbGFjZSgvXFwuL2csICdcXFxcLicpO1xyXG4gICAgLy8gTm9uIGlwIGFkZHJlc3MgZG9tYWlucy5cclxuICAgIC8vIGRvbWFpbi5jb20gPSAqLmRvbWFpbi5jb20gT1IgZG9tYWluLmNvbVxyXG4gICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKCdeKC4rXFxcXC4nICsgZXNjYXBlZERvbWFpblBhdHRlcm4gKyAnfCcgKyBlc2NhcGVkRG9tYWluUGF0dGVybiArICcpJCcsICdpJyk7XHJcbiAgICByZXR1cm4gcmUudGVzdChob3N0bmFtZSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IE5FVFdPUktfVElNRU9VVCA9IG5ldyBEZWxheSgzMDAwMCwgNjAwMDApO1xyXG4vKipcclxuICogUmVzZXQgdW5sYW9kZWQgR0FwaSBtb2R1bGVzLiBJZiBnYXBpLmxvYWQgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBlcnJvcixcclxuICogaXQgd2lsbCBzdG9wIHdvcmtpbmcgYWZ0ZXIgYSByZXRyaWFsLiBUaGlzIGlzIGEgaGFjayB0byBmaXggdGhpcyBpc3N1ZS5cclxuICovXHJcbmZ1bmN0aW9uIHJlc2V0VW5sb2FkZWRHYXBpTW9kdWxlcygpIHtcclxuICAgIC8vIENsZWFyIGxhc3QgZmFpbGVkIGdhcGkubG9hZCBzdGF0ZSB0byBmb3JjZSBuZXh0IGdhcGkubG9hZCB0byBmaXJzdFxyXG4gICAgLy8gbG9hZCB0aGUgZmFpbGVkIGdhcGkuaWZyYW1lcyBtb2R1bGUuXHJcbiAgICAvLyBHZXQgZ2FwaXguYmVhY29uIGNvbnRleHQuXHJcbiAgICBjb25zdCBiZWFjb24gPSBfd2luZG93KCkuX19fanNsO1xyXG4gICAgLy8gR2V0IGN1cnJlbnQgaGludC5cclxuICAgIGlmIChiZWFjb24gPT09IG51bGwgfHwgYmVhY29uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBiZWFjb24uSCkge1xyXG4gICAgICAgIC8vIEdldCBnYXBpIGhpbnQuXHJcbiAgICAgICAgZm9yIChjb25zdCBoaW50IG9mIE9iamVjdC5rZXlzKGJlYWNvbi5IKSkge1xyXG4gICAgICAgICAgICAvLyBSZXF1ZXN0ZWQgbW9kdWxlcy5cclxuICAgICAgICAgICAgYmVhY29uLkhbaGludF0uciA9IGJlYWNvbi5IW2hpbnRdLnIgfHwgW107XHJcbiAgICAgICAgICAgIC8vIExvYWRlZCBtb2R1bGVzLlxyXG4gICAgICAgICAgICBiZWFjb24uSFtoaW50XS5MID0gYmVhY29uLkhbaGludF0uTCB8fCBbXTtcclxuICAgICAgICAgICAgLy8gU2V0IHJlcXVlc3RlZCBtb2R1bGVzIHRvIGEgY29weSBvZiB0aGUgbG9hZGVkIG1vZHVsZXMuXHJcbiAgICAgICAgICAgIGJlYWNvbi5IW2hpbnRdLnIgPSBbLi4uYmVhY29uLkhbaGludF0uTF07XHJcbiAgICAgICAgICAgIC8vIENsZWFyIHBlbmRpbmcgY2FsbGJhY2tzLlxyXG4gICAgICAgICAgICBpZiAoYmVhY29uLkNQKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJlYWNvbi5DUC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBhbGwgZmFpbGVkIHBlbmRpbmcgY2FsbGJhY2tzLlxyXG4gICAgICAgICAgICAgICAgICAgIGJlYWNvbi5DUFtpXSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gbG9hZEdhcGkoYXV0aCkge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAvLyBGdW5jdGlvbiB0byBydW4gd2hlbiBnYXBpLmxvYWQgaXMgcmVhZHkuXHJcbiAgICAgICAgZnVuY3Rpb24gbG9hZEdhcGlJZnJhbWUoKSB7XHJcbiAgICAgICAgICAgIC8vIFRoZSBkZXZlbG9wZXIgbWF5IGhhdmUgdHJpZWQgdG8gcHJldmlvdXNseSBydW4gZ2FwaS5sb2FkIGFuZCBmYWlsZWQuXHJcbiAgICAgICAgICAgIC8vIFJ1biB0aGlzIHRvIGZpeCB0aGF0LlxyXG4gICAgICAgICAgICByZXNldFVubG9hZGVkR2FwaU1vZHVsZXMoKTtcclxuICAgICAgICAgICAgZ2FwaS5sb2FkKCdnYXBpLmlmcmFtZXMnLCB7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZ2FwaS5pZnJhbWVzLmdldENvbnRleHQoKSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgb250aW1lb3V0OiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGFib3ZlIHJlc2V0IG1heSBiZSBzdWZmaWNpZW50LCBidXQgaGF2aW5nIHRoaXMgcmVzZXQgYWZ0ZXJcclxuICAgICAgICAgICAgICAgICAgICAvLyBmYWlsdXJlIGVuc3VyZXMgdGhhdCBpZiB0aGUgZGV2ZWxvcGVyIGNhbGxzIGdhcGkubG9hZCBhZnRlciB0aGVcclxuICAgICAgICAgICAgICAgICAgICAvLyBjb25uZWN0aW9uIGlzIHJlLWVzdGFibGlzaGVkIGFuZCBiZWZvcmUgYW5vdGhlciBhdHRlbXB0IHRvIGVtYmVkXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGlmcmFtZSwgaXQgd291bGQgd29yayBhbmQgd291bGQgbm90IGJlIGJyb2tlbiBiZWNhdXNlIG9mIG91clxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGZhaWxlZCBhdHRlbXB0LlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRpbWVvdXQgd2hlbiBnYXBpLmlmcmFtZXMuSWZyYW1lIG5vdCBsb2FkZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzZXRVbmxvYWRlZEdhcGlNb2R1bGVzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KF9jcmVhdGVFcnJvcihhdXRoLCBcIm5ldHdvcmstcmVxdWVzdC1mYWlsZWRcIiAvKiBORVRXT1JLX1JFUVVFU1RfRkFJTEVEICovKSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgdGltZW91dDogTkVUV09SS19USU1FT1VULmdldCgpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoKF9iID0gKF9hID0gX3dpbmRvdygpLmdhcGkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pZnJhbWVzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuSWZyYW1lKSB7XHJcbiAgICAgICAgICAgIC8vIElmIGdhcGkuaWZyYW1lcy5JZnJhbWUgYXZhaWxhYmxlLCByZXNvbHZlLlxyXG4gICAgICAgICAgICByZXNvbHZlKGdhcGkuaWZyYW1lcy5nZXRDb250ZXh0KCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICghISgoX2MgPSBfd2luZG93KCkuZ2FwaSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmxvYWQpKSB7XHJcbiAgICAgICAgICAgIC8vIEdhcGkgbG9hZGVyIHJlYWR5LCBsb2FkIGdhcGkuaWZyYW1lcy5cclxuICAgICAgICAgICAgbG9hZEdhcGlJZnJhbWUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBpZnJhbWUgY2FsbGJhY2sgd2hlbiB0aGlzIGlzIGNhbGxlZCBzbyBhcyBub3QgdG8gb3ZlcndyaXRlXHJcbiAgICAgICAgICAgIC8vIGFueSBwcmV2aW91cyBkZWZpbmVkIGNhbGxiYWNrLiBUaGlzIGhhcHBlbnMgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkXHJcbiAgICAgICAgICAgIC8vIG11bHRpcGxlIHRpbWVzIGluIHBhcmFsbGVsIGFuZCBjb3VsZCByZXN1bHQgaW4gdGhlIGxhdGVyIGNhbGxiYWNrXHJcbiAgICAgICAgICAgIC8vIG92ZXJ3cml0aW5nIHRoZSBwcmV2aW91cyBvbmUuIFRoaXMgd291bGQgZW5kIHVwIHdpdGggYSBpZnJhbWVcclxuICAgICAgICAgICAgLy8gdGltZW91dC5cclxuICAgICAgICAgICAgY29uc3QgY2JOYW1lID0gX2dlbmVyYXRlQ2FsbGJhY2tOYW1lKCdpZnJhbWVmY2InKTtcclxuICAgICAgICAgICAgLy8gR0FwaSBsb2FkZXIgbm90IGF2YWlsYWJsZSwgZHluYW1pY2FsbHkgbG9hZCBwbGF0Zm9ybS5qcy5cclxuICAgICAgICAgICAgX3dpbmRvdygpW2NiTmFtZV0gPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBHQXBpIGxvYWRlciBzaG91bGQgYmUgcmVhZHkuXHJcbiAgICAgICAgICAgICAgICBpZiAoISFnYXBpLmxvYWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2FkR2FwaUlmcmFtZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gR2FwaSBsb2FkZXIgZmFpbGVkLCB0aHJvdyBlcnJvci5cclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoX2NyZWF0ZUVycm9yKGF1dGgsIFwibmV0d29yay1yZXF1ZXN0LWZhaWxlZFwiIC8qIE5FVFdPUktfUkVRVUVTVF9GQUlMRUQgKi8pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgLy8gTG9hZCBHQXBpIGxvYWRlci5cclxuICAgICAgICAgICAgcmV0dXJuIF9sb2FkSlMoYGh0dHBzOi8vYXBpcy5nb29nbGUuY29tL2pzL2FwaS5qcz9vbmxvYWQ9JHtjYk5hbWV9YCkuY2F0Y2goZSA9PiByZWplY3QoZSkpO1xyXG4gICAgICAgIH1cclxuICAgIH0pLmNhdGNoKGVycm9yID0+IHtcclxuICAgICAgICAvLyBSZXNldCBjYWNoZWQgcHJvbWlzZSB0byBhbGxvdyBmb3IgcmV0cmlhbC5cclxuICAgICAgICBjYWNoZWRHQXBpTG9hZGVyID0gbnVsbDtcclxuICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgIH0pO1xyXG59XHJcbmxldCBjYWNoZWRHQXBpTG9hZGVyID0gbnVsbDtcclxuZnVuY3Rpb24gX2xvYWRHYXBpKGF1dGgpIHtcclxuICAgIGNhY2hlZEdBcGlMb2FkZXIgPSBjYWNoZWRHQXBpTG9hZGVyIHx8IGxvYWRHYXBpKGF1dGgpO1xyXG4gICAgcmV0dXJuIGNhY2hlZEdBcGlMb2FkZXI7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IFBJTkdfVElNRU9VVCA9IG5ldyBEZWxheSg1MDAwLCAxNTAwMCk7XHJcbmNvbnN0IElGUkFNRV9QQVRIID0gJ19fL2F1dGgvaWZyYW1lJztcclxuY29uc3QgRU1VTEFURURfSUZSQU1FX1BBVEggPSAnZW11bGF0b3IvYXV0aC9pZnJhbWUnO1xyXG5jb25zdCBJRlJBTUVfQVRUUklCVVRFUyA9IHtcclxuICAgIHN0eWxlOiB7XHJcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXHJcbiAgICAgICAgdG9wOiAnLTEwMHB4JyxcclxuICAgICAgICB3aWR0aDogJzFweCcsXHJcbiAgICAgICAgaGVpZ2h0OiAnMXB4J1xyXG4gICAgfSxcclxuICAgICdhcmlhLWhpZGRlbic6ICd0cnVlJyxcclxuICAgIHRhYmluZGV4OiAnLTEnXHJcbn07XHJcbi8vIE1hcCBmcm9tIGFwaUhvc3QgdG8gZW5kcG9pbnQgSUQgZm9yIHBhc3NpbmcgaW50byBpZnJhbWUuIEluIGN1cnJlbnQgU0RLLCBhcGlIb3N0IGNhbiBiZSBzZXQgdG9cclxuLy8gYW55dGhpbmcgKG5vdCBmcm9tIGEgbGlzdCBvZiBlbmRwb2ludHMgd2l0aCBJRHMgYXMgaW4gbGVnYWN5KSwgc28gdGhpcyBpcyB0aGUgY2xvc2VzdCB3ZSBjYW4gZ2V0LlxyXG5jb25zdCBFSURfRlJPTV9BUElIT1NUID0gbmV3IE1hcChbXHJcbiAgICBbXCJpZGVudGl0eXRvb2xraXQuZ29vZ2xlYXBpcy5jb21cIiAvKiBBUElfSE9TVCAqLywgJ3AnXSxcclxuICAgIFsnc3RhZ2luZy1pZGVudGl0eXRvb2xraXQuc2FuZGJveC5nb29nbGVhcGlzLmNvbScsICdzJ10sXHJcbiAgICBbJ3Rlc3QtaWRlbnRpdHl0b29sa2l0LnNhbmRib3guZ29vZ2xlYXBpcy5jb20nLCAndCddIC8vIHRlc3RcclxuXSk7XHJcbmZ1bmN0aW9uIGdldElmcmFtZVVybChhdXRoKSB7XHJcbiAgICBjb25zdCBjb25maWcgPSBhdXRoLmNvbmZpZztcclxuICAgIF9hc3NlcnQoY29uZmlnLmF1dGhEb21haW4sIGF1dGgsIFwiYXV0aC1kb21haW4tY29uZmlnLXJlcXVpcmVkXCIgLyogTUlTU0lOR19BVVRIX0RPTUFJTiAqLyk7XHJcbiAgICBjb25zdCB1cmwgPSBjb25maWcuZW11bGF0b3JcclxuICAgICAgICA/IF9lbXVsYXRvclVybChjb25maWcsIEVNVUxBVEVEX0lGUkFNRV9QQVRIKVxyXG4gICAgICAgIDogYGh0dHBzOi8vJHthdXRoLmNvbmZpZy5hdXRoRG9tYWlufS8ke0lGUkFNRV9QQVRIfWA7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICAgYXBpS2V5OiBjb25maWcuYXBpS2V5LFxyXG4gICAgICAgIGFwcE5hbWU6IGF1dGgubmFtZSxcclxuICAgICAgICB2OiBTREtfVkVSU0lPTlxyXG4gICAgfTtcclxuICAgIGNvbnN0IGVpZCA9IEVJRF9GUk9NX0FQSUhPU1QuZ2V0KGF1dGguY29uZmlnLmFwaUhvc3QpO1xyXG4gICAgaWYgKGVpZCkge1xyXG4gICAgICAgIHBhcmFtcy5laWQgPSBlaWQ7XHJcbiAgICB9XHJcbiAgICBjb25zdCBmcmFtZXdvcmtzID0gYXV0aC5fZ2V0RnJhbWV3b3JrcygpO1xyXG4gICAgaWYgKGZyYW1ld29ya3MubGVuZ3RoKSB7XHJcbiAgICAgICAgcGFyYW1zLmZ3ID0gZnJhbWV3b3Jrcy5qb2luKCcsJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYCR7dXJsfT8ke3F1ZXJ5c3RyaW5nKHBhcmFtcykuc2xpY2UoMSl9YDtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBfb3BlbklmcmFtZShhdXRoKSB7XHJcbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgX2xvYWRHYXBpKGF1dGgpO1xyXG4gICAgY29uc3QgZ2FwaSA9IF93aW5kb3coKS5nYXBpO1xyXG4gICAgX2Fzc2VydChnYXBpLCBhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgcmV0dXJuIGNvbnRleHQub3Blbih7XHJcbiAgICAgICAgd2hlcmU6IGRvY3VtZW50LmJvZHksXHJcbiAgICAgICAgdXJsOiBnZXRJZnJhbWVVcmwoYXV0aCksXHJcbiAgICAgICAgbWVzc2FnZUhhbmRsZXJzRmlsdGVyOiBnYXBpLmlmcmFtZXMuQ1JPU1NfT1JJR0lOX0lGUkFNRVNfRklMVEVSLFxyXG4gICAgICAgIGF0dHJpYnV0ZXM6IElGUkFNRV9BVFRSSUJVVEVTLFxyXG4gICAgICAgIGRvbnRjbGVhcjogdHJ1ZVxyXG4gICAgfSwgKGlmcmFtZSkgPT4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIGF3YWl0IGlmcmFtZS5yZXN0eWxlKHtcclxuICAgICAgICAgICAgLy8gUHJldmVudCBpZnJhbWUgZnJvbSBjbG9zaW5nIG9uIG1vdXNlIG91dC5cclxuICAgICAgICAgICAgc2V0SGlkZU9uTGVhdmU6IGZhbHNlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3QgbmV0d29ya0Vycm9yID0gX2NyZWF0ZUVycm9yKGF1dGgsIFwibmV0d29yay1yZXF1ZXN0LWZhaWxlZFwiIC8qIE5FVFdPUktfUkVRVUVTVF9GQUlMRUQgKi8pO1xyXG4gICAgICAgIC8vIENvbmZpcm0gaWZyYW1lIGlzIGNvcnJlY3RseSBsb2FkZWQuXHJcbiAgICAgICAgLy8gVG8gZmFsbGJhY2sgb24gZmFpbHVyZSwgc2V0IGEgdGltZW91dC5cclxuICAgICAgICBjb25zdCBuZXR3b3JrRXJyb3JUaW1lciA9IF93aW5kb3coKS5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgcmVqZWN0KG5ldHdvcmtFcnJvcik7XHJcbiAgICAgICAgfSwgUElOR19USU1FT1VULmdldCgpKTtcclxuICAgICAgICAvLyBDbGVhciB0aW1lciBhbmQgcmVzb2x2ZSBwZW5kaW5nIGlmcmFtZSByZWFkeSBwcm9taXNlLlxyXG4gICAgICAgIGZ1bmN0aW9uIGNsZWFyVGltZXJBbmRSZXNvbHZlKCkge1xyXG4gICAgICAgICAgICBfd2luZG93KCkuY2xlYXJUaW1lb3V0KG5ldHdvcmtFcnJvclRpbWVyKTtcclxuICAgICAgICAgICAgcmVzb2x2ZShpZnJhbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBUaGlzIHJldHVybnMgYW4gSVRoZW5hYmxlLiBIb3dldmVyIHRoZSByZWplY3QgcGFydCBkb2VzIG5vdCBjYWxsXHJcbiAgICAgICAgLy8gd2hlbiB0aGUgaWZyYW1lIGlzIG5vdCBsb2FkZWQuXHJcbiAgICAgICAgaWZyYW1lLnBpbmcoY2xlYXJUaW1lckFuZFJlc29sdmUpLnRoZW4oY2xlYXJUaW1lckFuZFJlc29sdmUsICgpID0+IHtcclxuICAgICAgICAgICAgcmVqZWN0KG5ldHdvcmtFcnJvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IEJBU0VfUE9QVVBfT1BUSU9OUyA9IHtcclxuICAgIGxvY2F0aW9uOiAneWVzJyxcclxuICAgIHJlc2l6YWJsZTogJ3llcycsXHJcbiAgICBzdGF0dXNiYXI6ICd5ZXMnLFxyXG4gICAgdG9vbGJhcjogJ25vJ1xyXG59O1xyXG5jb25zdCBERUZBVUxUX1dJRFRIID0gNTAwO1xyXG5jb25zdCBERUZBVUxUX0hFSUdIVCA9IDYwMDtcclxuY29uc3QgVEFSR0VUX0JMQU5LID0gJ19ibGFuayc7XHJcbmNvbnN0IEZJUkVGT1hfRU1QVFlfVVJMID0gJ2h0dHA6Ly9sb2NhbGhvc3QnO1xyXG5jbGFzcyBBdXRoUG9wdXAge1xyXG4gICAgY29uc3RydWN0b3Iod2luZG93KSB7XHJcbiAgICAgICAgdGhpcy53aW5kb3cgPSB3aW5kb3c7XHJcbiAgICAgICAgdGhpcy5hc3NvY2lhdGVkRXZlbnQgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgY2xvc2UoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMud2luZG93KSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLndpbmRvdy5jbG9zZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7IH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gX29wZW4oYXV0aCwgdXJsLCBuYW1lLCB3aWR0aCA9IERFRkFVTFRfV0lEVEgsIGhlaWdodCA9IERFRkFVTFRfSEVJR0hUKSB7XHJcbiAgICBjb25zdCB0b3AgPSBNYXRoLm1heCgod2luZG93LnNjcmVlbi5hdmFpbEhlaWdodCAtIGhlaWdodCkgLyAyLCAwKS50b1N0cmluZygpO1xyXG4gICAgY29uc3QgbGVmdCA9IE1hdGgubWF4KCh3aW5kb3cuc2NyZWVuLmF2YWlsV2lkdGggLSB3aWR0aCkgLyAyLCAwKS50b1N0cmluZygpO1xyXG4gICAgbGV0IHRhcmdldCA9ICcnO1xyXG4gICAgY29uc3Qgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgQkFTRV9QT1BVUF9PUFRJT05TKSwgeyB3aWR0aDogd2lkdGgudG9TdHJpbmcoKSwgaGVpZ2h0OiBoZWlnaHQudG9TdHJpbmcoKSwgdG9wLFxyXG4gICAgICAgIGxlZnQgfSk7XHJcbiAgICAvLyBDaHJvbWUgaU9TIDcgYW5kIDggaXMgcmV0dXJuaW5nIGFuIHVuZGVmaW5lZCBwb3B1cCB3aW4gd2hlbiB0YXJnZXQgaXNcclxuICAgIC8vIHNwZWNpZmllZCwgZXZlbiB0aG91Z2ggdGhlIHBvcHVwIGlzIG5vdCBuZWNlc3NhcmlseSBibG9ja2VkLlxyXG4gICAgY29uc3QgdWEgPSBnZXRVQSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBpZiAobmFtZSkge1xyXG4gICAgICAgIHRhcmdldCA9IF9pc0Nocm9tZUlPUyh1YSkgPyBUQVJHRVRfQkxBTksgOiBuYW1lO1xyXG4gICAgfVxyXG4gICAgaWYgKF9pc0ZpcmVmb3godWEpKSB7XHJcbiAgICAgICAgLy8gRmlyZWZveCBjb21wbGFpbnMgd2hlbiBpbnZhbGlkIFVSTHMgYXJlIHBvcHBlZCBvdXQuIEhhY2t5IHdheSB0byBieXBhc3MuXHJcbiAgICAgICAgdXJsID0gdXJsIHx8IEZJUkVGT1hfRU1QVFlfVVJMO1xyXG4gICAgICAgIC8vIEZpcmVmb3ggZGlzYWJsZXMgYnkgZGVmYXVsdCBzY3JvbGxpbmcgb24gcG9wdXAgd2luZG93cywgd2hpY2ggY2FuIGNyZWF0ZVxyXG4gICAgICAgIC8vIGlzc3VlcyB3aGVuIHRoZSB1c2VyIGhhcyBtYW55IEdvb2dsZSBhY2NvdW50cywgZm9yIGluc3RhbmNlLlxyXG4gICAgICAgIG9wdGlvbnMuc2Nyb2xsYmFycyA9ICd5ZXMnO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgb3B0aW9uc1N0cmluZyA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMpLnJlZHVjZSgoYWNjdW0sIFtrZXksIHZhbHVlXSkgPT4gYCR7YWNjdW19JHtrZXl9PSR7dmFsdWV9LGAsICcnKTtcclxuICAgIGlmIChfaXNJT1NTdGFuZGFsb25lKHVhKSAmJiB0YXJnZXQgIT09ICdfc2VsZicpIHtcclxuICAgICAgICBvcGVuQXNOZXdXaW5kb3dJT1ModXJsIHx8ICcnLCB0YXJnZXQpO1xyXG4gICAgICAgIHJldHVybiBuZXcgQXV0aFBvcHVwKG51bGwpO1xyXG4gICAgfVxyXG4gICAgLy8gYWJvdXQ6YmxhbmsgZ2V0dGluZyBzYW5pdGl6ZWQgY2F1c2luZyBicm93c2VycyBsaWtlIElFL0VkZ2UgdG8gZGlzcGxheVxyXG4gICAgLy8gYnJpZWYgZXJyb3IgbWVzc2FnZSBiZWZvcmUgcmVkaXJlY3RpbmcgdG8gaGFuZGxlci5cclxuICAgIGNvbnN0IG5ld1dpbiA9IHdpbmRvdy5vcGVuKHVybCB8fCAnJywgdGFyZ2V0LCBvcHRpb25zU3RyaW5nKTtcclxuICAgIF9hc3NlcnQobmV3V2luLCBhdXRoLCBcInBvcHVwLWJsb2NrZWRcIiAvKiBQT1BVUF9CTE9DS0VEICovKTtcclxuICAgIC8vIEZsYWt5IG9uIElFIGVkZ2UsIGVuY2Fwc3VsYXRlIHdpdGggYSB0cnkgYW5kIGNhdGNoLlxyXG4gICAgdHJ5IHtcclxuICAgICAgICBuZXdXaW4uZm9jdXMoKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlKSB7IH1cclxuICAgIHJldHVybiBuZXcgQXV0aFBvcHVwKG5ld1dpbik7XHJcbn1cclxuZnVuY3Rpb24gb3BlbkFzTmV3V2luZG93SU9TKHVybCwgdGFyZ2V0KSB7XHJcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGVsLmhyZWYgPSB1cmw7XHJcbiAgICBlbC50YXJnZXQgPSB0YXJnZXQ7XHJcbiAgICBjb25zdCBjbGljayA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdNb3VzZUV2ZW50Jyk7XHJcbiAgICBjbGljay5pbml0TW91c2VFdmVudCgnY2xpY2snLCB0cnVlLCB0cnVlLCB3aW5kb3csIDEsIDAsIDAsIDAsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAxLCBudWxsKTtcclxuICAgIGVsLmRpc3BhdGNoRXZlbnQoY2xpY2spO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBVUkwgZm9yIEF1dGhlbnRpY2F0aW9uIHdpZGdldCB3aGljaCB3aWxsIGluaXRpYXRlIHRoZSBPQXV0aCBoYW5kc2hha2VcclxuICpcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5jb25zdCBXSURHRVRfUEFUSCA9ICdfXy9hdXRoL2hhbmRsZXInO1xyXG4vKipcclxuICogVVJMIGZvciBlbXVsYXRlZCBlbnZpcm9ubWVudFxyXG4gKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmNvbnN0IEVNVUxBVE9SX1dJREdFVF9QQVRIID0gJ2VtdWxhdG9yL2F1dGgvaGFuZGxlcic7XHJcbmZ1bmN0aW9uIF9nZXRSZWRpcmVjdFVybChhdXRoLCBwcm92aWRlciwgYXV0aFR5cGUsIHJlZGlyZWN0VXJsLCBldmVudElkLCBhZGRpdGlvbmFsUGFyYW1zKSB7XHJcbiAgICBfYXNzZXJ0KGF1dGguY29uZmlnLmF1dGhEb21haW4sIGF1dGgsIFwiYXV0aC1kb21haW4tY29uZmlnLXJlcXVpcmVkXCIgLyogTUlTU0lOR19BVVRIX0RPTUFJTiAqLyk7XHJcbiAgICBfYXNzZXJ0KGF1dGguY29uZmlnLmFwaUtleSwgYXV0aCwgXCJpbnZhbGlkLWFwaS1rZXlcIiAvKiBJTlZBTElEX0FQSV9LRVkgKi8pO1xyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAgIGFwaUtleTogYXV0aC5jb25maWcuYXBpS2V5LFxyXG4gICAgICAgIGFwcE5hbWU6IGF1dGgubmFtZSxcclxuICAgICAgICBhdXRoVHlwZSxcclxuICAgICAgICByZWRpcmVjdFVybCxcclxuICAgICAgICB2OiBTREtfVkVSU0lPTixcclxuICAgICAgICBldmVudElkXHJcbiAgICB9O1xyXG4gICAgaWYgKHByb3ZpZGVyIGluc3RhbmNlb2YgRmVkZXJhdGVkQXV0aFByb3ZpZGVyKSB7XHJcbiAgICAgICAgcHJvdmlkZXIuc2V0RGVmYXVsdExhbmd1YWdlKGF1dGgubGFuZ3VhZ2VDb2RlKTtcclxuICAgICAgICBwYXJhbXMucHJvdmlkZXJJZCA9IHByb3ZpZGVyLnByb3ZpZGVySWQgfHwgJyc7XHJcbiAgICAgICAgaWYgKCFpc0VtcHR5KHByb3ZpZGVyLmdldEN1c3RvbVBhcmFtZXRlcnMoKSkpIHtcclxuICAgICAgICAgICAgcGFyYW1zLmN1c3RvbVBhcmFtZXRlcnMgPSBKU09OLnN0cmluZ2lmeShwcm92aWRlci5nZXRDdXN0b21QYXJhbWV0ZXJzKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBUT0RPIHNldCBhZGRpdGlvbmFsUGFyYW1zIGZyb20gdGhlIHByb3ZpZGVyIGFzIHdlbGw/XHJcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYWRkaXRpb25hbFBhcmFtcyB8fCB7fSkpIHtcclxuICAgICAgICAgICAgcGFyYW1zW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAocHJvdmlkZXIgaW5zdGFuY2VvZiBCYXNlT0F1dGhQcm92aWRlcikge1xyXG4gICAgICAgIGNvbnN0IHNjb3BlcyA9IHByb3ZpZGVyLmdldFNjb3BlcygpLmZpbHRlcihzY29wZSA9PiBzY29wZSAhPT0gJycpO1xyXG4gICAgICAgIGlmIChzY29wZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwYXJhbXMuc2NvcGVzID0gc2NvcGVzLmpvaW4oJywnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoYXV0aC50ZW5hbnRJZCkge1xyXG4gICAgICAgIHBhcmFtcy50aWQgPSBhdXRoLnRlbmFudElkO1xyXG4gICAgfVxyXG4gICAgLy8gVE9ETzogbWF5YmUgc2V0IGVpZCBhcyBlbmRpcG9pbnRJZFxyXG4gICAgLy8gVE9ETzogbWF5YmUgc2V0IGZ3IGFzIEZyYW1ld29ya3Muam9pbihcIixcIilcclxuICAgIGNvbnN0IHBhcmFtc0RpY3QgPSBwYXJhbXM7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhwYXJhbXNEaWN0KSkge1xyXG4gICAgICAgIGlmIChwYXJhbXNEaWN0W2tleV0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBkZWxldGUgcGFyYW1zRGljdFtrZXldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBgJHtnZXRIYW5kbGVyQmFzZShhdXRoKX0/JHtxdWVyeXN0cmluZyhwYXJhbXNEaWN0KS5zbGljZSgxKX1gO1xyXG59XHJcbmZ1bmN0aW9uIGdldEhhbmRsZXJCYXNlKHsgY29uZmlnIH0pIHtcclxuICAgIGlmICghY29uZmlnLmVtdWxhdG9yKSB7XHJcbiAgICAgICAgcmV0dXJuIGBodHRwczovLyR7Y29uZmlnLmF1dGhEb21haW59LyR7V0lER0VUX1BBVEh9YDtcclxuICAgIH1cclxuICAgIHJldHVybiBfZW11bGF0b3JVcmwoY29uZmlnLCBFTVVMQVRPUl9XSURHRVRfUEFUSCk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFRoZSBzcGVjaWFsIHdlYiBzdG9yYWdlIGV2ZW50XHJcbiAqXHJcbiAqL1xyXG5jb25zdCBXRUJfU1RPUkFHRV9TVVBQT1JUX0tFWSA9ICd3ZWJTdG9yYWdlU3VwcG9ydCc7XHJcbmNsYXNzIEJyb3dzZXJQb3B1cFJlZGlyZWN0UmVzb2x2ZXIge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5ldmVudE1hbmFnZXJzID0ge307XHJcbiAgICAgICAgdGhpcy5pZnJhbWVzID0ge307XHJcbiAgICAgICAgdGhpcy5vcmlnaW5WYWxpZGF0aW9uUHJvbWlzZXMgPSB7fTtcclxuICAgICAgICB0aGlzLl9yZWRpcmVjdFBlcnNpc3RlbmNlID0gYnJvd3NlclNlc3Npb25QZXJzaXN0ZW5jZTtcclxuICAgICAgICB0aGlzLl9jb21wbGV0ZVJlZGlyZWN0Rm4gPSBfZ2V0UmVkaXJlY3RSZXN1bHQ7XHJcbiAgICB9XHJcbiAgICAvLyBXcmFwcGluZyBpbiBhc3luYyBldmVuIHRob3VnaCB3ZSBkb24ndCBhd2FpdCBhbnl3aGVyZSBpbiBvcmRlclxyXG4gICAgLy8gdG8gbWFrZSBzdXJlIGVycm9ycyBhcmUgcmFpc2VkIGFzIHByb21pc2UgcmVqZWN0aW9uc1xyXG4gICAgYXN5bmMgX29wZW5Qb3B1cChhdXRoLCBwcm92aWRlciwgYXV0aFR5cGUsIGV2ZW50SWQpIHtcclxuICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgZGVidWdBc3NlcnQoKF9hID0gdGhpcy5ldmVudE1hbmFnZXJzW2F1dGguX2tleSgpXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm1hbmFnZXIsICdfaW5pdGlhbGl6ZSgpIG5vdCBjYWxsZWQgYmVmb3JlIF9vcGVuUG9wdXAoKScpO1xyXG4gICAgICAgIGNvbnN0IHVybCA9IF9nZXRSZWRpcmVjdFVybChhdXRoLCBwcm92aWRlciwgYXV0aFR5cGUsIF9nZXRDdXJyZW50VXJsKCksIGV2ZW50SWQpO1xyXG4gICAgICAgIHJldHVybiBfb3BlbihhdXRoLCB1cmwsIF9nZW5lcmF0ZUV2ZW50SWQoKSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBfb3BlblJlZGlyZWN0KGF1dGgsIHByb3ZpZGVyLCBhdXRoVHlwZSwgZXZlbnRJZCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX29yaWdpblZhbGlkYXRpb24oYXV0aCk7XHJcbiAgICAgICAgX3NldFdpbmRvd0xvY2F0aW9uKF9nZXRSZWRpcmVjdFVybChhdXRoLCBwcm92aWRlciwgYXV0aFR5cGUsIF9nZXRDdXJyZW50VXJsKCksIGV2ZW50SWQpKTtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKCkgPT4geyB9KTtcclxuICAgIH1cclxuICAgIF9pbml0aWFsaXplKGF1dGgpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBhdXRoLl9rZXkoKTtcclxuICAgICAgICBpZiAodGhpcy5ldmVudE1hbmFnZXJzW2tleV0pIHtcclxuICAgICAgICAgICAgY29uc3QgeyBtYW5hZ2VyLCBwcm9taXNlIH0gPSB0aGlzLmV2ZW50TWFuYWdlcnNba2V5XTtcclxuICAgICAgICAgICAgaWYgKG1hbmFnZXIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWFuYWdlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkZWJ1Z0Fzc2VydChwcm9taXNlLCAnSWYgbWFuYWdlciBpcyBub3Qgc2V0LCBwcm9taXNlIHNob3VsZCBiZScpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuaW5pdEFuZEdldE1hbmFnZXIoYXV0aCk7XHJcbiAgICAgICAgdGhpcy5ldmVudE1hbmFnZXJzW2tleV0gPSB7IHByb21pc2UgfTtcclxuICAgICAgICAvLyBJZiB0aGUgcHJvbWlzZSBpcyByZWplY3RlZCwgdGhlIGtleSBzaG91bGQgYmUgcmVtb3ZlZCBzbyB0aGF0IHRoZVxyXG4gICAgICAgIC8vIG9wZXJhdGlvbiBjYW4gYmUgcmV0cmllZCBsYXRlci5cclxuICAgICAgICBwcm9taXNlLmNhdGNoKCgpID0+IHtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuZXZlbnRNYW5hZ2Vyc1trZXldO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBwcm9taXNlO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgaW5pdEFuZEdldE1hbmFnZXIoYXV0aCkge1xyXG4gICAgICAgIGNvbnN0IGlmcmFtZSA9IGF3YWl0IF9vcGVuSWZyYW1lKGF1dGgpO1xyXG4gICAgICAgIGNvbnN0IG1hbmFnZXIgPSBuZXcgQXV0aEV2ZW50TWFuYWdlcihhdXRoKTtcclxuICAgICAgICBpZnJhbWUucmVnaXN0ZXIoJ2F1dGhFdmVudCcsIChpZnJhbWVFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICBfYXNzZXJ0KGlmcmFtZUV2ZW50ID09PSBudWxsIHx8IGlmcmFtZUV2ZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpZnJhbWVFdmVudC5hdXRoRXZlbnQsIGF1dGgsIFwiaW52YWxpZC1hdXRoLWV2ZW50XCIgLyogSU5WQUxJRF9BVVRIX0VWRU5UICovKTtcclxuICAgICAgICAgICAgLy8gVE9ETzogQ29uc2lkZXIgc3BsaXR0aW5nIHJlZGlyZWN0IGFuZCBwb3B1cCBldmVudHMgZWFybGllciBvblxyXG4gICAgICAgICAgICBjb25zdCBoYW5kbGVkID0gbWFuYWdlci5vbkV2ZW50KGlmcmFtZUV2ZW50LmF1dGhFdmVudCk7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogaGFuZGxlZCA/IFwiQUNLXCIgLyogQUNLICovIDogXCJFUlJPUlwiIC8qIEVSUk9SICovIH07XHJcbiAgICAgICAgfSwgZ2FwaS5pZnJhbWVzLkNST1NTX09SSUdJTl9JRlJBTUVTX0ZJTFRFUik7XHJcbiAgICAgICAgdGhpcy5ldmVudE1hbmFnZXJzW2F1dGguX2tleSgpXSA9IHsgbWFuYWdlciB9O1xyXG4gICAgICAgIHRoaXMuaWZyYW1lc1thdXRoLl9rZXkoKV0gPSBpZnJhbWU7XHJcbiAgICAgICAgcmV0dXJuIG1hbmFnZXI7XHJcbiAgICB9XHJcbiAgICBfaXNJZnJhbWVXZWJTdG9yYWdlU3VwcG9ydGVkKGF1dGgsIGNiKSB7XHJcbiAgICAgICAgY29uc3QgaWZyYW1lID0gdGhpcy5pZnJhbWVzW2F1dGguX2tleSgpXTtcclxuICAgICAgICBpZnJhbWUuc2VuZChXRUJfU1RPUkFHRV9TVVBQT1JUX0tFWSwgeyB0eXBlOiBXRUJfU1RPUkFHRV9TVVBQT1JUX0tFWSB9LCByZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzU3VwcG9ydGVkID0gKF9hID0gcmVzdWx0ID09PSBudWxsIHx8IHJlc3VsdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVzdWx0WzBdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FbV0VCX1NUT1JBR0VfU1VQUE9SVF9LRVldO1xyXG4gICAgICAgICAgICBpZiAoaXNTdXBwb3J0ZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY2IoISFpc1N1cHBvcnRlZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgX2ZhaWwoYXV0aCwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovKTtcclxuICAgICAgICB9LCBnYXBpLmlmcmFtZXMuQ1JPU1NfT1JJR0lOX0lGUkFNRVNfRklMVEVSKTtcclxuICAgIH1cclxuICAgIF9vcmlnaW5WYWxpZGF0aW9uKGF1dGgpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBhdXRoLl9rZXkoKTtcclxuICAgICAgICBpZiAoIXRoaXMub3JpZ2luVmFsaWRhdGlvblByb21pc2VzW2tleV0pIHtcclxuICAgICAgICAgICAgdGhpcy5vcmlnaW5WYWxpZGF0aW9uUHJvbWlzZXNba2V5XSA9IF92YWxpZGF0ZU9yaWdpbihhdXRoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luVmFsaWRhdGlvblByb21pc2VzW2tleV07XHJcbiAgICB9XHJcbiAgICBnZXQgX3Nob3VsZEluaXRQcm9hY3RpdmVseSgpIHtcclxuICAgICAgICAvLyBNb2JpbGUgYnJvd3NlcnMgYW5kIFNhZmFyaSBuZWVkIHRvIG9wdGltaXN0aWNhbGx5IGluaXRpYWxpemVcclxuICAgICAgICByZXR1cm4gX2lzTW9iaWxlQnJvd3NlcigpIHx8IF9pc1NhZmFyaSgpIHx8IF9pc0lPUygpO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgUG9wdXBSZWRpcmVjdFJlc29sdmVyfSBzdWl0YWJsZSBmb3IgYnJvd3NlclxyXG4gKiBiYXNlZCBhcHBsaWNhdGlvbnMuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNvbnN0IGJyb3dzZXJQb3B1cFJlZGlyZWN0UmVzb2x2ZXIgPSBCcm93c2VyUG9wdXBSZWRpcmVjdFJlc29sdmVyO1xuXG5jbGFzcyBNdWx0aUZhY3RvckFzc2VydGlvbkltcGwge1xyXG4gICAgY29uc3RydWN0b3IoZmFjdG9ySWQpIHtcclxuICAgICAgICB0aGlzLmZhY3RvcklkID0gZmFjdG9ySWQ7XHJcbiAgICB9XHJcbiAgICBfcHJvY2VzcyhhdXRoLCBzZXNzaW9uLCBkaXNwbGF5TmFtZSkge1xyXG4gICAgICAgIHN3aXRjaCAoc2Vzc2lvbi50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJlbnJvbGxcIiAvKiBFTlJPTEwgKi86XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZmluYWxpemVFbnJvbGwoYXV0aCwgc2Vzc2lvbi5jcmVkZW50aWFsLCBkaXNwbGF5TmFtZSk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJzaWduaW5cIiAvKiBTSUdOX0lOICovOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmFsaXplU2lnbkluKGF1dGgsIHNlc3Npb24uY3JlZGVudGlhbCk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVidWdGYWlsKCd1bmV4cGVjdGVkIE11bHRpRmFjdG9yU2Vzc2lvblR5cGUnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIHtAaW5oZXJpdGRvYyBQaG9uZU11bHRpRmFjdG9yQXNzZXJ0aW9ufVxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jbGFzcyBQaG9uZU11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbCBleHRlbmRzIE11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbCB7XHJcbiAgICBjb25zdHJ1Y3RvcihjcmVkZW50aWFsKSB7XHJcbiAgICAgICAgc3VwZXIoXCJwaG9uZVwiIC8qIFBIT05FICovKTtcclxuICAgICAgICB0aGlzLmNyZWRlbnRpYWwgPSBjcmVkZW50aWFsO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc3RhdGljIF9mcm9tQ3JlZGVudGlhbChjcmVkZW50aWFsKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQaG9uZU11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbChjcmVkZW50aWFsKTtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF9maW5hbGl6ZUVucm9sbChhdXRoLCBpZFRva2VuLCBkaXNwbGF5TmFtZSkge1xyXG4gICAgICAgIHJldHVybiBmaW5hbGl6ZUVucm9sbFBob25lTWZhKGF1dGgsIHtcclxuICAgICAgICAgICAgaWRUb2tlbixcclxuICAgICAgICAgICAgZGlzcGxheU5hbWUsXHJcbiAgICAgICAgICAgIHBob25lVmVyaWZpY2F0aW9uSW5mbzogdGhpcy5jcmVkZW50aWFsLl9tYWtlVmVyaWZpY2F0aW9uUmVxdWVzdCgpXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBfZmluYWxpemVTaWduSW4oYXV0aCwgbWZhUGVuZGluZ0NyZWRlbnRpYWwpIHtcclxuICAgICAgICByZXR1cm4gZmluYWxpemVTaWduSW5QaG9uZU1mYShhdXRoLCB7XHJcbiAgICAgICAgICAgIG1mYVBlbmRpbmdDcmVkZW50aWFsLFxyXG4gICAgICAgICAgICBwaG9uZVZlcmlmaWNhdGlvbkluZm86IHRoaXMuY3JlZGVudGlhbC5fbWFrZVZlcmlmaWNhdGlvblJlcXVlc3QoKVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBQcm92aWRlciBmb3IgZ2VuZXJhdGluZyBhIHtAbGluayBQaG9uZU11bHRpRmFjdG9yQXNzZXJ0aW9ufS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY2xhc3MgUGhvbmVNdWx0aUZhY3RvckdlbmVyYXRvciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm92aWRlcyBhIHtAbGluayBQaG9uZU11bHRpRmFjdG9yQXNzZXJ0aW9ufSB0byBjb25maXJtIG93bmVyc2hpcCBvZiB0aGUgcGhvbmUgc2Vjb25kIGZhY3Rvci5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gcGhvbmVBdXRoQ3JlZGVudGlhbCAtIEEgY3JlZGVudGlhbCBwcm92aWRlZCBieSB7QGxpbmsgUGhvbmVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbH0uXHJcbiAgICAgKiBAcmV0dXJucyBBIHtAbGluayBQaG9uZU11bHRpRmFjdG9yQXNzZXJ0aW9ufSB3aGljaCBjYW4gYmUgdXNlZCB3aXRoXHJcbiAgICAgKiB7QGxpbmsgTXVsdGlGYWN0b3JSZXNvbHZlci5yZXNvbHZlU2lnbklufVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgYXNzZXJ0aW9uKGNyZWRlbnRpYWwpIHtcclxuICAgICAgICByZXR1cm4gUGhvbmVNdWx0aUZhY3RvckFzc2VydGlvbkltcGwuX2Zyb21DcmVkZW50aWFsKGNyZWRlbnRpYWwpO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGhvbmUgc2Vjb25kIGZhY3RvcjogYHBob25lYC5cclxuICovXHJcblBob25lTXVsdGlGYWN0b3JHZW5lcmF0b3IuRkFDVE9SX0lEID0gJ3Bob25lJztcblxudmFyIG5hbWUgPSBcIkBmaXJlYmFzZS9hdXRoXCI7XG52YXIgdmVyc2lvbiA9IFwiMC4xOS4xMFwiO1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jbGFzcyBBdXRoSW50ZXJvcCB7XHJcbiAgICBjb25zdHJ1Y3RvcihhdXRoKSB7XHJcbiAgICAgICAgdGhpcy5hdXRoID0gYXV0aDtcclxuICAgICAgICB0aGlzLmludGVybmFsTGlzdGVuZXJzID0gbmV3IE1hcCgpO1xyXG4gICAgfVxyXG4gICAgZ2V0VWlkKCkge1xyXG4gICAgICAgIHZhciBfYTtcclxuICAgICAgICB0aGlzLmFzc2VydEF1dGhDb25maWd1cmVkKCk7XHJcbiAgICAgICAgcmV0dXJuICgoX2EgPSB0aGlzLmF1dGguY3VycmVudFVzZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS51aWQpIHx8IG51bGw7XHJcbiAgICB9XHJcbiAgICBhc3luYyBnZXRUb2tlbihmb3JjZVJlZnJlc2gpIHtcclxuICAgICAgICB0aGlzLmFzc2VydEF1dGhDb25maWd1cmVkKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5hdXRoLl9pbml0aWFsaXphdGlvblByb21pc2U7XHJcbiAgICAgICAgaWYgKCF0aGlzLmF1dGguY3VycmVudFVzZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgdGhpcy5hdXRoLmN1cnJlbnRVc2VyLmdldElkVG9rZW4oZm9yY2VSZWZyZXNoKTtcclxuICAgICAgICByZXR1cm4geyBhY2Nlc3NUb2tlbiB9O1xyXG4gICAgfVxyXG4gICAgYWRkQXV0aFRva2VuTGlzdGVuZXIobGlzdGVuZXIpIHtcclxuICAgICAgICB0aGlzLmFzc2VydEF1dGhDb25maWd1cmVkKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJuYWxMaXN0ZW5lcnMuaGFzKGxpc3RlbmVyKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gdGhpcy5hdXRoLm9uSWRUb2tlbkNoYW5nZWQodXNlciA9PiB7XHJcbiAgICAgICAgICAgIHZhciBfYTtcclxuICAgICAgICAgICAgbGlzdGVuZXIoKChfYSA9IHVzZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zdHNUb2tlbk1hbmFnZXIuYWNjZXNzVG9rZW4pIHx8IG51bGwpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxMaXN0ZW5lcnMuc2V0KGxpc3RlbmVyLCB1bnN1YnNjcmliZSk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVQcm9hY3RpdmVSZWZyZXNoKCk7XHJcbiAgICB9XHJcbiAgICByZW1vdmVBdXRoVG9rZW5MaXN0ZW5lcihsaXN0ZW5lcikge1xyXG4gICAgICAgIHRoaXMuYXNzZXJ0QXV0aENvbmZpZ3VyZWQoKTtcclxuICAgICAgICBjb25zdCB1bnN1YnNjcmliZSA9IHRoaXMuaW50ZXJuYWxMaXN0ZW5lcnMuZ2V0KGxpc3RlbmVyKTtcclxuICAgICAgICBpZiAoIXVuc3Vic2NyaWJlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbExpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xyXG4gICAgICAgIHVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVQcm9hY3RpdmVSZWZyZXNoKCk7XHJcbiAgICB9XHJcbiAgICBhc3NlcnRBdXRoQ29uZmlndXJlZCgpIHtcclxuICAgICAgICBfYXNzZXJ0KHRoaXMuYXV0aC5faW5pdGlhbGl6YXRpb25Qcm9taXNlLCBcImRlcGVuZGVudC1zZGstaW5pdGlhbGl6ZWQtYmVmb3JlLWF1dGhcIiAvKiBERVBFTkRFTlRfU0RLX0lOSVRfQkVGT1JFX0FVVEggKi8pO1xyXG4gICAgfVxyXG4gICAgdXBkYXRlUHJvYWN0aXZlUmVmcmVzaCgpIHtcclxuICAgICAgICBpZiAodGhpcy5pbnRlcm5hbExpc3RlbmVycy5zaXplID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmF1dGguX3N0YXJ0UHJvYWN0aXZlUmVmcmVzaCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5hdXRoLl9zdG9wUHJvYWN0aXZlUmVmcmVzaCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRWZXJzaW9uRm9yUGxhdGZvcm0oY2xpZW50UGxhdGZvcm0pIHtcclxuICAgIHN3aXRjaCAoY2xpZW50UGxhdGZvcm0pIHtcclxuICAgICAgICBjYXNlIFwiTm9kZVwiIC8qIE5PREUgKi86XHJcbiAgICAgICAgICAgIHJldHVybiAnbm9kZSc7XHJcbiAgICAgICAgY2FzZSBcIlJlYWN0TmF0aXZlXCIgLyogUkVBQ1RfTkFUSVZFICovOlxyXG4gICAgICAgICAgICByZXR1cm4gJ3JuJztcclxuICAgICAgICBjYXNlIFwiV29ya2VyXCIgLyogV09SS0VSICovOlxyXG4gICAgICAgICAgICByZXR1cm4gJ3dlYndvcmtlcic7XHJcbiAgICAgICAgY2FzZSBcIkNvcmRvdmFcIiAvKiBDT1JET1ZBICovOlxyXG4gICAgICAgICAgICByZXR1cm4gJ2NvcmRvdmEnO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbn1cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5mdW5jdGlvbiByZWdpc3RlckF1dGgoY2xpZW50UGxhdGZvcm0pIHtcclxuICAgIF9yZWdpc3RlckNvbXBvbmVudChuZXcgQ29tcG9uZW50KFwiYXV0aFwiIC8qIEFVVEggKi8sIChjb250YWluZXIsIHsgb3B0aW9uczogZGVwcyB9KSA9PiB7XHJcbiAgICAgICAgY29uc3QgYXBwID0gY29udGFpbmVyLmdldFByb3ZpZGVyKCdhcHAnKS5nZXRJbW1lZGlhdGUoKTtcclxuICAgICAgICBjb25zdCBoZWFydGJlYXRTZXJ2aWNlUHJvdmlkZXIgPSBjb250YWluZXIuZ2V0UHJvdmlkZXIoJ2hlYXJ0YmVhdCcpO1xyXG4gICAgICAgIGNvbnN0IHsgYXBpS2V5LCBhdXRoRG9tYWluIH0gPSBhcHAub3B0aW9ucztcclxuICAgICAgICByZXR1cm4gKChhcHAsIGhlYXJ0YmVhdFNlcnZpY2VQcm92aWRlcikgPT4ge1xyXG4gICAgICAgICAgICBfYXNzZXJ0KGFwaUtleSAmJiAhYXBpS2V5LmluY2x1ZGVzKCc6JyksIFwiaW52YWxpZC1hcGkta2V5XCIgLyogSU5WQUxJRF9BUElfS0VZICovLCB7IGFwcE5hbWU6IGFwcC5uYW1lIH0pO1xyXG4gICAgICAgICAgICAvLyBBdXRoIGRvbWFpbiBpcyBvcHRpb25hbCBpZiBJZFAgc2lnbiBpbiBpc24ndCBiZWluZyB1c2VkXHJcbiAgICAgICAgICAgIF9hc3NlcnQoIShhdXRoRG9tYWluID09PSBudWxsIHx8IGF1dGhEb21haW4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGF1dGhEb21haW4uaW5jbHVkZXMoJzonKSksIFwiYXJndW1lbnQtZXJyb3JcIiAvKiBBUkdVTUVOVF9FUlJPUiAqLywge1xyXG4gICAgICAgICAgICAgICAgYXBwTmFtZTogYXBwLm5hbWVcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHtcclxuICAgICAgICAgICAgICAgIGFwaUtleSxcclxuICAgICAgICAgICAgICAgIGF1dGhEb21haW4sXHJcbiAgICAgICAgICAgICAgICBjbGllbnRQbGF0Zm9ybSxcclxuICAgICAgICAgICAgICAgIGFwaUhvc3Q6IFwiaWRlbnRpdHl0b29sa2l0Lmdvb2dsZWFwaXMuY29tXCIgLyogQVBJX0hPU1QgKi8sXHJcbiAgICAgICAgICAgICAgICB0b2tlbkFwaUhvc3Q6IFwic2VjdXJldG9rZW4uZ29vZ2xlYXBpcy5jb21cIiAvKiBUT0tFTl9BUElfSE9TVCAqLyxcclxuICAgICAgICAgICAgICAgIGFwaVNjaGVtZTogXCJodHRwc1wiIC8qIEFQSV9TQ0hFTUUgKi8sXHJcbiAgICAgICAgICAgICAgICBzZGtDbGllbnRWZXJzaW9uOiBfZ2V0Q2xpZW50VmVyc2lvbihjbGllbnRQbGF0Zm9ybSlcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY29uc3QgYXV0aEluc3RhbmNlID0gbmV3IEF1dGhJbXBsKGFwcCwgaGVhcnRiZWF0U2VydmljZVByb3ZpZGVyLCBjb25maWcpO1xyXG4gICAgICAgICAgICBfaW5pdGlhbGl6ZUF1dGhJbnN0YW5jZShhdXRoSW5zdGFuY2UsIGRlcHMpO1xyXG4gICAgICAgICAgICByZXR1cm4gYXV0aEluc3RhbmNlO1xyXG4gICAgICAgIH0pKGFwcCwgaGVhcnRiZWF0U2VydmljZVByb3ZpZGVyKTtcclxuICAgIH0sIFwiUFVCTElDXCIgLyogUFVCTElDICovKVxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEF1dGggY2FuIG9ubHkgYmUgaW5pdGlhbGl6ZWQgYnkgZXhwbGljaXRseSBjYWxsaW5nIGdldEF1dGgoKSBvciBpbml0aWFsaXplQXV0aCgpXHJcbiAgICAgICAgICogRm9yIHdoeSB3ZSBkbyB0aGlzLCBTZWUgZ28vZmlyZWJhc2UtbmV4dC1hdXRoLWluaXRcclxuICAgICAgICAgKi9cclxuICAgICAgICAuc2V0SW5zdGFudGlhdGlvbk1vZGUoXCJFWFBMSUNJVFwiIC8qIEVYUExJQ0lUICovKVxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEJlY2F1c2UgYWxsIGZpcmViYXNlIHByb2R1Y3RzIHRoYXQgZGVwZW5kIG9uIGF1dGggZGVwZW5kIG9uIGF1dGgtaW50ZXJuYWwgZGlyZWN0bHksXHJcbiAgICAgICAgICogd2UgbmVlZCB0byBpbml0aWFsaXplIGF1dGgtaW50ZXJuYWwgYWZ0ZXIgYXV0aCBpcyBpbml0aWFsaXplZCB0byBtYWtlIGl0IGF2YWlsYWJsZSB0byBvdGhlciBmaXJlYmFzZSBwcm9kdWN0cy5cclxuICAgICAgICAgKi9cclxuICAgICAgICAuc2V0SW5zdGFuY2VDcmVhdGVkQ2FsbGJhY2soKGNvbnRhaW5lciwgX2luc3RhbmNlSWRlbnRpZmllciwgX2luc3RhbmNlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYXV0aEludGVybmFsUHJvdmlkZXIgPSBjb250YWluZXIuZ2V0UHJvdmlkZXIoXCJhdXRoLWludGVybmFsXCIgLyogQVVUSF9JTlRFUk5BTCAqLyk7XHJcbiAgICAgICAgYXV0aEludGVybmFsUHJvdmlkZXIuaW5pdGlhbGl6ZSgpO1xyXG4gICAgfSkpO1xyXG4gICAgX3JlZ2lzdGVyQ29tcG9uZW50KG5ldyBDb21wb25lbnQoXCJhdXRoLWludGVybmFsXCIgLyogQVVUSF9JTlRFUk5BTCAqLywgY29udGFpbmVyID0+IHtcclxuICAgICAgICBjb25zdCBhdXRoID0gX2Nhc3RBdXRoKGNvbnRhaW5lci5nZXRQcm92aWRlcihcImF1dGhcIiAvKiBBVVRIICovKS5nZXRJbW1lZGlhdGUoKSk7XHJcbiAgICAgICAgcmV0dXJuIChhdXRoID0+IG5ldyBBdXRoSW50ZXJvcChhdXRoKSkoYXV0aCk7XHJcbiAgICB9LCBcIlBSSVZBVEVcIiAvKiBQUklWQVRFICovKS5zZXRJbnN0YW50aWF0aW9uTW9kZShcIkVYUExJQ0lUXCIgLyogRVhQTElDSVQgKi8pKTtcclxuICAgIHJlZ2lzdGVyVmVyc2lvbihuYW1lLCB2ZXJzaW9uLCBnZXRWZXJzaW9uRm9yUGxhdGZvcm0oY2xpZW50UGxhdGZvcm0pKTtcclxuICAgIC8vIEJVSUxEX1RBUkdFVCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHZhbHVlcyBsaWtlIGVzbTUsIGVzbTIwMTcsIGNqczUsIGV0YyBkdXJpbmcgdGhlIGNvbXBpbGF0aW9uXHJcbiAgICByZWdpc3RlclZlcnNpb24obmFtZSwgdmVyc2lvbiwgJ2VzbTIwMTcnKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogUmV0dXJucyB0aGUgQXV0aCBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkIHtAbGluayBAZmlyZWJhc2UvYXBwI0ZpcmViYXNlQXBwfS5cclxuICogSWYgbm8gaW5zdGFuY2UgZXhpc3RzLCBpbml0aWFsaXplcyBhbiBBdXRoIGluc3RhbmNlIHdpdGggcGxhdGZvcm0tc3BlY2lmaWMgZGVmYXVsdCBkZXBlbmRlbmNpZXMuXHJcbiAqXHJcbiAqIEBwYXJhbSBhcHAgLSBUaGUgRmlyZWJhc2UgQXBwLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRBdXRoKGFwcCA9IGdldEFwcCgpKSB7XHJcbiAgICBjb25zdCBwcm92aWRlciA9IF9nZXRQcm92aWRlcihhcHAsICdhdXRoJyk7XHJcbiAgICBpZiAocHJvdmlkZXIuaXNJbml0aWFsaXplZCgpKSB7XHJcbiAgICAgICAgcmV0dXJuIHByb3ZpZGVyLmdldEltbWVkaWF0ZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGluaXRpYWxpemVBdXRoKGFwcCwge1xyXG4gICAgICAgIHBvcHVwUmVkaXJlY3RSZXNvbHZlcjogYnJvd3NlclBvcHVwUmVkaXJlY3RSZXNvbHZlcixcclxuICAgICAgICBwZXJzaXN0ZW5jZTogW1xyXG4gICAgICAgICAgICBpbmRleGVkREJMb2NhbFBlcnNpc3RlbmNlLFxyXG4gICAgICAgICAgICBicm93c2VyTG9jYWxQZXJzaXN0ZW5jZSxcclxuICAgICAgICAgICAgYnJvd3NlclNlc3Npb25QZXJzaXN0ZW5jZVxyXG4gICAgICAgIF1cclxuICAgIH0pO1xyXG59XHJcbnJlZ2lzdGVyQXV0aChcIkJyb3dzZXJcIiAvKiBCUk9XU0VSICovKTtcblxuZXhwb3J0IHsgc2VuZFBhc3N3b3JkUmVzZXRFbWFpbCBhcyAkLCBBY3Rpb25Db2RlT3BlcmF0aW9uIGFzIEEsIHByb2RFcnJvck1hcCBhcyBCLCBBVVRIX0VSUk9SX0NPREVTX01BUF9ET19OT1RfVVNFX0lOVEVSTkFMTFkgYXMgQywgaW5pdGlhbGl6ZUF1dGggYXMgRCwgY29ubmVjdEF1dGhFbXVsYXRvciBhcyBFLCBGYWN0b3JJZCBhcyBGLCBBdXRoQ3JlZGVudGlhbCBhcyBHLCBFbWFpbEF1dGhDcmVkZW50aWFsIGFzIEgsIE9BdXRoQ3JlZGVudGlhbCBhcyBJLCBQaG9uZUF1dGhDcmVkZW50aWFsIGFzIEosIGluTWVtb3J5UGVyc2lzdGVuY2UgYXMgSywgRW1haWxBdXRoUHJvdmlkZXIgYXMgTCwgRmFjZWJvb2tBdXRoUHJvdmlkZXIgYXMgTSwgR29vZ2xlQXV0aFByb3ZpZGVyIGFzIE4sIE9wZXJhdGlvblR5cGUgYXMgTywgUGhvbmVBdXRoUHJvdmlkZXIgYXMgUCwgR2l0aHViQXV0aFByb3ZpZGVyIGFzIFEsIFJlY2FwdGNoYVZlcmlmaWVyIGFzIFIsIFNpZ25Jbk1ldGhvZCBhcyBTLCBPQXV0aFByb3ZpZGVyIGFzIFQsIFNBTUxBdXRoUHJvdmlkZXIgYXMgVSwgVHdpdHRlckF1dGhQcm92aWRlciBhcyBWLCBzaWduSW5Bbm9ueW1vdXNseSBhcyBXLCBzaWduSW5XaXRoQ3JlZGVudGlhbCBhcyBYLCBsaW5rV2l0aENyZWRlbnRpYWwgYXMgWSwgcmVhdXRoZW50aWNhdGVXaXRoQ3JlZGVudGlhbCBhcyBaLCBzaWduSW5XaXRoQ3VzdG9tVG9rZW4gYXMgXywgYnJvd3NlclNlc3Npb25QZXJzaXN0ZW5jZSBhcyBhLCBjb25maXJtUGFzc3dvcmRSZXNldCBhcyBhMCwgYXBwbHlBY3Rpb25Db2RlIGFzIGExLCBjaGVja0FjdGlvbkNvZGUgYXMgYTIsIHZlcmlmeVBhc3N3b3JkUmVzZXRDb2RlIGFzIGEzLCBjcmVhdGVVc2VyV2l0aEVtYWlsQW5kUGFzc3dvcmQgYXMgYTQsIHNpZ25JbldpdGhFbWFpbEFuZFBhc3N3b3JkIGFzIGE1LCBzZW5kU2lnbkluTGlua1RvRW1haWwgYXMgYTYsIGlzU2lnbkluV2l0aEVtYWlsTGluayBhcyBhNywgc2lnbkluV2l0aEVtYWlsTGluayBhcyBhOCwgZmV0Y2hTaWduSW5NZXRob2RzRm9yRW1haWwgYXMgYTksIF9nZXRSZWRpcmVjdFJlc3VsdCBhcyBhQSwgX2NsZWFyUmVkaXJlY3RPdXRjb21lcyBhcyBhQiwgX2Nhc3RBdXRoIGFzIGFDLCBVc2VySW1wbCBhcyBhRCwgQXV0aEltcGwgYXMgYUUsIF9nZXRDbGllbnRWZXJzaW9uIGFzIGFGLCBfZ2VuZXJhdGVFdmVudElkIGFzIGFHLCBBdXRoUG9wdXAgYXMgYUgsIEZldGNoUHJvdmlkZXIgYXMgYUksIFNBTUxBdXRoQ3JlZGVudGlhbCBhcyBhSiwgc2VuZEVtYWlsVmVyaWZpY2F0aW9uIGFzIGFhLCB2ZXJpZnlCZWZvcmVVcGRhdGVFbWFpbCBhcyBhYiwgQWN0aW9uQ29kZVVSTCBhcyBhYywgcGFyc2VBY3Rpb25Db2RlVVJMIGFzIGFkLCB1cGRhdGVQcm9maWxlIGFzIGFlLCB1cGRhdGVFbWFpbCBhcyBhZiwgdXBkYXRlUGFzc3dvcmQgYXMgYWcsIGdldElkVG9rZW4gYXMgYWgsIGdldElkVG9rZW5SZXN1bHQgYXMgYWksIHVubGluayBhcyBhaiwgZ2V0QWRkaXRpb25hbFVzZXJJbmZvIGFzIGFrLCByZWxvYWQgYXMgYWwsIGdldE11bHRpRmFjdG9yUmVzb2x2ZXIgYXMgYW0sIG11bHRpRmFjdG9yIGFzIGFuLCBfaXNJT1M3T3I4IGFzIGFvLCBkZWJ1Z0Fzc2VydCBhcyBhcCwgX2lzSU9TIGFzIGFxLCBfaXNBbmRyb2lkIGFzIGFyLCBfZmFpbCBhcyBhcywgX2dldFJlZGlyZWN0VXJsIGFzIGF0LCBfZ2V0UHJvamVjdENvbmZpZyBhcyBhdSwgX2NyZWF0ZUVycm9yIGFzIGF2LCBfYXNzZXJ0IGFzIGF3LCBfZ2V0SW5zdGFuY2UgYXMgYXgsIF9wZXJzaXN0ZW5jZUtleU5hbWUgYXMgYXksIEF1dGhFdmVudE1hbmFnZXIgYXMgYXosIGJyb3dzZXJMb2NhbFBlcnNpc3RlbmNlIGFzIGIsIHNpZ25JbldpdGhQb3B1cCBhcyBjLCBsaW5rV2l0aFBvcHVwIGFzIGQsIHJlYXV0aGVudGljYXRlV2l0aFBvcHVwIGFzIGUsIHNpZ25JbldpdGhSZWRpcmVjdCBhcyBmLCBsaW5rV2l0aFJlZGlyZWN0IGFzIGcsIHJlYXV0aGVudGljYXRlV2l0aFJlZGlyZWN0IGFzIGgsIGluZGV4ZWREQkxvY2FsUGVyc2lzdGVuY2UgYXMgaSwgZ2V0UmVkaXJlY3RSZXN1bHQgYXMgaiwgYnJvd3NlclBvcHVwUmVkaXJlY3RSZXNvbHZlciBhcyBrLCBsaW5rV2l0aFBob25lTnVtYmVyIGFzIGwsIFBob25lTXVsdGlGYWN0b3JHZW5lcmF0b3IgYXMgbSwgZ2V0QXV0aCBhcyBuLCBQcm92aWRlcklkIGFzIG8sIHNldFBlcnNpc3RlbmNlIGFzIHAsIG9uSWRUb2tlbkNoYW5nZWQgYXMgcSwgcmVhdXRoZW50aWNhdGVXaXRoUGhvbmVOdW1iZXIgYXMgciwgc2lnbkluV2l0aFBob25lTnVtYmVyIGFzIHMsIG9uQXV0aFN0YXRlQ2hhbmdlZCBhcyB0LCB1cGRhdGVQaG9uZU51bWJlciBhcyB1LCB1c2VEZXZpY2VMYW5ndWFnZSBhcyB2LCB1cGRhdGVDdXJyZW50VXNlciBhcyB3LCBzaWduT3V0IGFzIHgsIGRlbGV0ZVVzZXIgYXMgeSwgZGVidWdFcnJvck1hcCBhcyB6IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC1mNjlhMjhkOC5qcy5tYXBcbiIsImV4cG9ydCB7IEEgYXMgQWN0aW9uQ29kZU9wZXJhdGlvbiwgYWMgYXMgQWN0aW9uQ29kZVVSTCwgRyBhcyBBdXRoQ3JlZGVudGlhbCwgQyBhcyBBdXRoRXJyb3JDb2RlcywgSCBhcyBFbWFpbEF1dGhDcmVkZW50aWFsLCBMIGFzIEVtYWlsQXV0aFByb3ZpZGVyLCBNIGFzIEZhY2Vib29rQXV0aFByb3ZpZGVyLCBGIGFzIEZhY3RvcklkLCBRIGFzIEdpdGh1YkF1dGhQcm92aWRlciwgTiBhcyBHb29nbGVBdXRoUHJvdmlkZXIsIEkgYXMgT0F1dGhDcmVkZW50aWFsLCBUIGFzIE9BdXRoUHJvdmlkZXIsIE8gYXMgT3BlcmF0aW9uVHlwZSwgSiBhcyBQaG9uZUF1dGhDcmVkZW50aWFsLCBQIGFzIFBob25lQXV0aFByb3ZpZGVyLCBtIGFzIFBob25lTXVsdGlGYWN0b3JHZW5lcmF0b3IsIG8gYXMgUHJvdmlkZXJJZCwgUiBhcyBSZWNhcHRjaGFWZXJpZmllciwgVSBhcyBTQU1MQXV0aFByb3ZpZGVyLCBTIGFzIFNpZ25Jbk1ldGhvZCwgViBhcyBUd2l0dGVyQXV0aFByb3ZpZGVyLCBhMSBhcyBhcHBseUFjdGlvbkNvZGUsIGIgYXMgYnJvd3NlckxvY2FsUGVyc2lzdGVuY2UsIGsgYXMgYnJvd3NlclBvcHVwUmVkaXJlY3RSZXNvbHZlciwgYSBhcyBicm93c2VyU2Vzc2lvblBlcnNpc3RlbmNlLCBhMiBhcyBjaGVja0FjdGlvbkNvZGUsIGEwIGFzIGNvbmZpcm1QYXNzd29yZFJlc2V0LCBFIGFzIGNvbm5lY3RBdXRoRW11bGF0b3IsIGE0IGFzIGNyZWF0ZVVzZXJXaXRoRW1haWxBbmRQYXNzd29yZCwgeiBhcyBkZWJ1Z0Vycm9yTWFwLCB5IGFzIGRlbGV0ZVVzZXIsIGE5IGFzIGZldGNoU2lnbkluTWV0aG9kc0ZvckVtYWlsLCBhayBhcyBnZXRBZGRpdGlvbmFsVXNlckluZm8sIG4gYXMgZ2V0QXV0aCwgYWggYXMgZ2V0SWRUb2tlbiwgYWkgYXMgZ2V0SWRUb2tlblJlc3VsdCwgYW0gYXMgZ2V0TXVsdGlGYWN0b3JSZXNvbHZlciwgaiBhcyBnZXRSZWRpcmVjdFJlc3VsdCwgSyBhcyBpbk1lbW9yeVBlcnNpc3RlbmNlLCBpIGFzIGluZGV4ZWREQkxvY2FsUGVyc2lzdGVuY2UsIEQgYXMgaW5pdGlhbGl6ZUF1dGgsIGE3IGFzIGlzU2lnbkluV2l0aEVtYWlsTGluaywgWSBhcyBsaW5rV2l0aENyZWRlbnRpYWwsIGwgYXMgbGlua1dpdGhQaG9uZU51bWJlciwgZCBhcyBsaW5rV2l0aFBvcHVwLCBnIGFzIGxpbmtXaXRoUmVkaXJlY3QsIGFuIGFzIG11bHRpRmFjdG9yLCB0IGFzIG9uQXV0aFN0YXRlQ2hhbmdlZCwgcSBhcyBvbklkVG9rZW5DaGFuZ2VkLCBhZCBhcyBwYXJzZUFjdGlvbkNvZGVVUkwsIEIgYXMgcHJvZEVycm9yTWFwLCBaIGFzIHJlYXV0aGVudGljYXRlV2l0aENyZWRlbnRpYWwsIHIgYXMgcmVhdXRoZW50aWNhdGVXaXRoUGhvbmVOdW1iZXIsIGUgYXMgcmVhdXRoZW50aWNhdGVXaXRoUG9wdXAsIGggYXMgcmVhdXRoZW50aWNhdGVXaXRoUmVkaXJlY3QsIGFsIGFzIHJlbG9hZCwgYWEgYXMgc2VuZEVtYWlsVmVyaWZpY2F0aW9uLCAkIGFzIHNlbmRQYXNzd29yZFJlc2V0RW1haWwsIGE2IGFzIHNlbmRTaWduSW5MaW5rVG9FbWFpbCwgcCBhcyBzZXRQZXJzaXN0ZW5jZSwgVyBhcyBzaWduSW5Bbm9ueW1vdXNseSwgWCBhcyBzaWduSW5XaXRoQ3JlZGVudGlhbCwgXyBhcyBzaWduSW5XaXRoQ3VzdG9tVG9rZW4sIGE1IGFzIHNpZ25JbldpdGhFbWFpbEFuZFBhc3N3b3JkLCBhOCBhcyBzaWduSW5XaXRoRW1haWxMaW5rLCBzIGFzIHNpZ25JbldpdGhQaG9uZU51bWJlciwgYyBhcyBzaWduSW5XaXRoUG9wdXAsIGYgYXMgc2lnbkluV2l0aFJlZGlyZWN0LCB4IGFzIHNpZ25PdXQsIGFqIGFzIHVubGluaywgdyBhcyB1cGRhdGVDdXJyZW50VXNlciwgYWYgYXMgdXBkYXRlRW1haWwsIGFnIGFzIHVwZGF0ZVBhc3N3b3JkLCB1IGFzIHVwZGF0ZVBob25lTnVtYmVyLCBhZSBhcyB1cGRhdGVQcm9maWxlLCB2IGFzIHVzZURldmljZUxhbmd1YWdlLCBhYiBhcyB2ZXJpZnlCZWZvcmVVcGRhdGVFbWFpbCwgYTMgYXMgdmVyaWZ5UGFzc3dvcmRSZXNldENvZGUgfSBmcm9tICcuL2luZGV4LWY2OWEyOGQ4LmpzJztcbmltcG9ydCAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0ICdAZmlyZWJhc2UvYXBwJztcbmltcG9ydCAndHNsaWInO1xuaW1wb3J0ICdAZmlyZWJhc2UvbG9nZ2VyJztcbmltcG9ydCAnQGZpcmViYXNlL2NvbXBvbmVudCc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcbiIsImltcG9ydCB7IF9yZWdpc3RlckNvbXBvbmVudCwgcmVnaXN0ZXJWZXJzaW9uLCBfZ2V0UHJvdmlkZXIsIGdldEFwcCwgX3JlbW92ZVNlcnZpY2VJbnN0YW5jZSwgU0RLX1ZFUlNJT04gfSBmcm9tICdAZmlyZWJhc2UvYXBwJztcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0BmaXJlYmFzZS9jb21wb25lbnQnO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dMZXZlbCB9IGZyb20gJ0BmaXJlYmFzZS9sb2dnZXInO1xuaW1wb3J0IHsgRmlyZWJhc2VFcnJvciwgY3JlYXRlTW9ja1VzZXJUb2tlbiwgZ2V0TW9kdWxhckluc3RhbmNlLCBkZWVwRXF1YWwsIGdldFVBLCBpc0luZGV4ZWREQkF2YWlsYWJsZSwgaXNTYWZhcmksIGlzTW9iaWxlQ29yZG92YSwgaXNSZWFjdE5hdGl2ZSwgaXNFbGVjdHJvbiwgaXNJRSwgaXNVV1AsIGlzQnJvd3NlckV4dGVuc2lvbiB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7IFhocklvLCBFdmVudFR5cGUsIEVycm9yQ29kZSwgY3JlYXRlV2ViQ2hhbm5lbFRyYW5zcG9ydCwgZ2V0U3RhdEV2ZW50VGFyZ2V0LCBGZXRjaFhtbEh0dHBGYWN0b3J5LCBXZWJDaGFubmVsLCBFdmVudCwgU3RhdCB9IGZyb20gJ0BmaXJlYmFzZS93ZWJjaGFubmVsLXdyYXBwZXInO1xuXG5jb25zdCBEID0gXCJAZmlyZWJhc2UvZmlyZXN0b3JlXCI7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFNpbXBsZSB3cmFwcGVyIGFyb3VuZCBhIG51bGxhYmxlIFVJRC4gTW9zdGx5IGV4aXN0cyB0byBtYWtlIGNvZGUgbW9yZVxuICogcmVhZGFibGUuXG4gKi9cbmNsYXNzIEMge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy51aWQgPSB0O1xuICAgIH1cbiAgICBpc0F1dGhlbnRpY2F0ZWQoKSB7XG4gICAgICAgIHJldHVybiBudWxsICE9IHRoaXMudWlkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEga2V5IHJlcHJlc2VudGluZyB0aGlzIHVzZXIsIHN1aXRhYmxlIGZvciBpbmNsdXNpb24gaW4gYVxuICAgICAqIGRpY3Rpb25hcnkuXG4gICAgICovICAgIHRvS2V5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0F1dGhlbnRpY2F0ZWQoKSA/IFwidWlkOlwiICsgdGhpcy51aWQgOiBcImFub255bW91cy11c2VyXCI7XG4gICAgfVxuICAgIGlzRXF1YWwodCkge1xuICAgICAgICByZXR1cm4gdC51aWQgPT09IHRoaXMudWlkO1xuICAgIH1cbn1cblxuLyoqIEEgdXNlciB3aXRoIGEgbnVsbCBVSUQuICovIEMuVU5BVVRIRU5USUNBVEVEID0gbmV3IEMobnVsbCksIFxuLy8gVE9ETyhtaWtlbGVoZW4pOiBMb29rIGludG8gZ2V0dGluZyBhIHByb3BlciB1aWQtZXF1aXZhbGVudCBmb3Jcbi8vIG5vbi1GaXJlYmFzZUF1dGggcHJvdmlkZXJzLlxuQy5HT09HTEVfQ1JFREVOVElBTFMgPSBuZXcgQyhcImdvb2dsZS1jcmVkZW50aWFscy11aWRcIiksIEMuRklSU1RfUEFSVFkgPSBuZXcgQyhcImZpcnN0LXBhcnR5LXVpZFwiKSwgXG5DLk1PQ0tfVVNFUiA9IG5ldyBDKFwibW9jay11c2VyXCIpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xubGV0IHggPSBcIjkuNi45XCI7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5jb25zdCBOID0gbmV3IExvZ2dlcihcIkBmaXJlYmFzZS9maXJlc3RvcmVcIik7XG5cbi8vIEhlbHBlciBtZXRob2RzIGFyZSBuZWVkZWQgYmVjYXVzZSB2YXJpYWJsZXMgY2FuJ3QgYmUgZXhwb3J0ZWQgYXMgcmVhZC93cml0ZVxuZnVuY3Rpb24gaygpIHtcbiAgICByZXR1cm4gTi5sb2dMZXZlbDtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSB2ZXJib3NpdHkgb2YgQ2xvdWQgRmlyZXN0b3JlIGxvZ3MgKGRlYnVnLCBlcnJvciwgb3Igc2lsZW50KS5cbiAqXG4gKiBAcGFyYW0gbG9nTGV2ZWwgLSBUaGUgdmVyYm9zaXR5IHlvdSBzZXQgZm9yIGFjdGl2aXR5IGFuZCBlcnJvciBsb2dnaW5nLiBDYW5cbiAqICAgYmUgYW55IG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOlxuICpcbiAqICAgPHVsPlxuICogICAgIDxsaT5gZGVidWdgIGZvciB0aGUgbW9zdCB2ZXJib3NlIGxvZ2dpbmcgbGV2ZWwsIHByaW1hcmlseSBmb3JcbiAqICAgICBkZWJ1Z2dpbmcuPC9saT5cbiAqICAgICA8bGk+YGVycm9yYCB0byBsb2cgZXJyb3JzIG9ubHkuPC9saT5cbiAqICAgICA8bGk+PGNvZGU+YHNpbGVudGAgdG8gdHVybiBvZmYgbG9nZ2luZy48L2xpPlxuICogICA8L3VsPlxuICovIGZ1bmN0aW9uIE0odCkge1xuICAgIE4uc2V0TG9nTGV2ZWwodCk7XG59XG5cbmZ1bmN0aW9uIE8odCwgLi4uZSkge1xuICAgIGlmIChOLmxvZ0xldmVsIDw9IExvZ0xldmVsLkRFQlVHKSB7XG4gICAgICAgIGNvbnN0IG4gPSBlLm1hcChCKTtcbiAgICAgICAgTi5kZWJ1ZyhgRmlyZXN0b3JlICgke3h9KTogJHt0fWAsIC4uLm4pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gJCh0LCAuLi5lKSB7XG4gICAgaWYgKE4ubG9nTGV2ZWwgPD0gTG9nTGV2ZWwuRVJST1IpIHtcbiAgICAgICAgY29uc3QgbiA9IGUubWFwKEIpO1xuICAgICAgICBOLmVycm9yKGBGaXJlc3RvcmUgKCR7eH0pOiAke3R9YCwgLi4ubik7XG4gICAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovIGZ1bmN0aW9uIEYodCwgLi4uZSkge1xuICAgIGlmIChOLmxvZ0xldmVsIDw9IExvZ0xldmVsLldBUk4pIHtcbiAgICAgICAgY29uc3QgbiA9IGUubWFwKEIpO1xuICAgICAgICBOLndhcm4oYEZpcmVzdG9yZSAoJHt4fSk6ICR7dH1gLCAuLi5uKTtcbiAgICB9XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gYWRkaXRpb25hbCBsb2cgcGFyYW1ldGVyIHRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uLlxuICovIGZ1bmN0aW9uIEIodCkge1xuICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiB0KSByZXR1cm4gdDtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZSA9IHQsIEpTT04uc3RyaW5naWZ5KGUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gQ29udmVydGluZyB0byBKU09OIGZhaWxlZCwganVzdCBsb2cgdGhlIG9iamVjdCBkaXJlY3RseVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9XG4gICAgLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbiAgICAvKiogRm9ybWF0cyBhbiBvYmplY3QgYXMgYSBKU09OIHN0cmluZywgc3VpdGFibGUgZm9yIGxvZ2dpbmcuICovXG4gICAgdmFyIGU7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFVuY29uZGl0aW9uYWxseSBmYWlscywgdGhyb3dpbmcgYW4gRXJyb3Igd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS5cbiAqIE1lc3NhZ2VzIGFyZSBzdHJpcHBlZCBpbiBwcm9kdWN0aW9uIGJ1aWxkcy5cbiAqXG4gKiBSZXR1cm5zIGBuZXZlcmAgYW5kIGNhbiBiZSB1c2VkIGluIGV4cHJlc3Npb25zOlxuICogQGV4YW1wbGVcbiAqIGxldCBmdXR1cmVWYXIgPSBmYWlsKCdub3QgaW1wbGVtZW50ZWQgeWV0Jyk7XG4gKi8gZnVuY3Rpb24gTCh0ID0gXCJVbmV4cGVjdGVkIHN0YXRlXCIpIHtcbiAgICAvLyBMb2cgdGhlIGZhaWx1cmUgaW4gYWRkaXRpb24gdG8gdGhyb3cgYW4gZXhjZXB0aW9uLCBqdXN0IGluIGNhc2UgdGhlXG4gICAgLy8gZXhjZXB0aW9uIGlzIHN3YWxsb3dlZC5cbiAgICBjb25zdCBlID0gYEZJUkVTVE9SRSAoJHt4fSkgSU5URVJOQUwgQVNTRVJUSU9OIEZBSUxFRDogYCArIHQ7XG4gICAgLy8gTk9URTogV2UgZG9uJ3QgdXNlIEZpcmVzdG9yZUVycm9yIGhlcmUgYmVjYXVzZSB0aGVzZSBhcmUgaW50ZXJuYWwgZmFpbHVyZXNcbiAgICAvLyB0aGF0IGNhbm5vdCBiZSBoYW5kbGVkIGJ5IHRoZSB1c2VyLiAoQWxzbyBpdCB3b3VsZCBjcmVhdGUgYSBjaXJjdWxhclxuICAgIC8vIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGUgZXJyb3IgYW5kIGFzc2VydCBtb2R1bGVzIHdoaWNoIGRvZXNuJ3Qgd29yay4pXG4gICAgdGhyb3cgJChlKSwgbmV3IEVycm9yKGUpO1xufVxuXG4vKipcbiAqIEZhaWxzIGlmIHRoZSBnaXZlbiBhc3NlcnRpb24gY29uZGl0aW9uIGlzIGZhbHNlLCB0aHJvd2luZyBhbiBFcnJvciB3aXRoIHRoZVxuICogZ2l2ZW4gbWVzc2FnZSBpZiBpdCBkaWQuXG4gKlxuICogTWVzc2FnZXMgYXJlIHN0cmlwcGVkIGluIHByb2R1Y3Rpb24gYnVpbGRzLlxuICovIGZ1bmN0aW9uIHEodCwgZSkge1xuICAgIHQgfHwgTCgpO1xufVxuXG4vKipcbiAqIEZhaWxzIGlmIHRoZSBnaXZlbiBhc3NlcnRpb24gY29uZGl0aW9uIGlzIGZhbHNlLCB0aHJvd2luZyBhbiBFcnJvciB3aXRoIHRoZVxuICogZ2l2ZW4gbWVzc2FnZSBpZiBpdCBkaWQuXG4gKlxuICogVGhlIGNvZGUgb2YgY2FsbHNpdGVzIGludm9raW5nIHRoaXMgZnVuY3Rpb24gYXJlIHN0cmlwcGVkIG91dCBpbiBwcm9kdWN0aW9uXG4gKiBidWlsZHMuIEFueSBzaWRlLWVmZmVjdHMgb2YgY29kZSB3aXRoaW4gdGhlIGRlYnVnQXNzZXJ0KCkgaW52b2NhdGlvbiB3aWxsIG5vdFxuICogaGFwcGVuIGluIHRoaXMgY2FzZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqLyBmdW5jdGlvbiBVKHQsIGUpIHtcbiAgICB0IHx8IEwoKTtcbn1cblxuLyoqXG4gKiBDYXN0cyBgb2JqYCB0byBgVGAuIEluIG5vbi1wcm9kdWN0aW9uIGJ1aWxkcywgdmVyaWZpZXMgdGhhdCBgb2JqYCBpcyBhblxuICogaW5zdGFuY2Ugb2YgYFRgIGJlZm9yZSBjYXN0aW5nLlxuICovIGZ1bmN0aW9uIEsodCwgXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZSkge1xuICAgIHJldHVybiB0O1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjb25zdCBHID0ge1xuICAgIC8vIENhdXNlcyBhcmUgY29waWVkIGZyb206XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2dycGMvZ3JwYy9ibG9iL2JjZWVjOTRlYTRmYzVmMDA4NWQ4MTIzNWQ4ZTFjMDY3OThkYzM0MWEvaW5jbHVkZS9ncnBjJTJCJTJCL2ltcGwvY29kZWdlbi9zdGF0dXNfY29kZV9lbnVtLmhcbiAgICAvKiogTm90IGFuIGVycm9yOyByZXR1cm5lZCBvbiBzdWNjZXNzLiAqL1xuICAgIE9LOiBcIm9rXCIsXG4gICAgLyoqIFRoZSBvcGVyYXRpb24gd2FzIGNhbmNlbGxlZCAodHlwaWNhbGx5IGJ5IHRoZSBjYWxsZXIpLiAqL1xuICAgIENBTkNFTExFRDogXCJjYW5jZWxsZWRcIixcbiAgICAvKiogVW5rbm93biBlcnJvciBvciBhbiBlcnJvciBmcm9tIGEgZGlmZmVyZW50IGVycm9yIGRvbWFpbi4gKi9cbiAgICBVTktOT1dOOiBcInVua25vd25cIixcbiAgICAvKipcbiAgICAgKiBDbGllbnQgc3BlY2lmaWVkIGFuIGludmFsaWQgYXJndW1lbnQuIE5vdGUgdGhhdCB0aGlzIGRpZmZlcnMgZnJvbVxuICAgICAqIEZBSUxFRF9QUkVDT05ESVRJT04uIElOVkFMSURfQVJHVU1FTlQgaW5kaWNhdGVzIGFyZ3VtZW50cyB0aGF0IGFyZVxuICAgICAqIHByb2JsZW1hdGljIHJlZ2FyZGxlc3Mgb2YgdGhlIHN0YXRlIG9mIHRoZSBzeXN0ZW0gKGUuZy4sIGEgbWFsZm9ybWVkIGZpbGVcbiAgICAgKiBuYW1lKS5cbiAgICAgKi9cbiAgICBJTlZBTElEX0FSR1VNRU5UOiBcImludmFsaWQtYXJndW1lbnRcIixcbiAgICAvKipcbiAgICAgKiBEZWFkbGluZSBleHBpcmVkIGJlZm9yZSBvcGVyYXRpb24gY291bGQgY29tcGxldGUuIEZvciBvcGVyYXRpb25zIHRoYXRcbiAgICAgKiBjaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZSBzeXN0ZW0sIHRoaXMgZXJyb3IgbWF5IGJlIHJldHVybmVkIGV2ZW4gaWYgdGhlXG4gICAgICogb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiBGb3IgZXhhbXBsZSwgYSBzdWNjZXNzZnVsIHJlc3BvbnNlXG4gICAgICogZnJvbSBhIHNlcnZlciBjb3VsZCBoYXZlIGJlZW4gZGVsYXllZCBsb25nIGVub3VnaCBmb3IgdGhlIGRlYWRsaW5lIHRvXG4gICAgICogZXhwaXJlLlxuICAgICAqL1xuICAgIERFQURMSU5FX0VYQ0VFREVEOiBcImRlYWRsaW5lLWV4Y2VlZGVkXCIsXG4gICAgLyoqIFNvbWUgcmVxdWVzdGVkIGVudGl0eSAoZS5nLiwgZmlsZSBvciBkaXJlY3RvcnkpIHdhcyBub3QgZm91bmQuICovXG4gICAgTk9UX0ZPVU5EOiBcIm5vdC1mb3VuZFwiLFxuICAgIC8qKlxuICAgICAqIFNvbWUgZW50aXR5IHRoYXQgd2UgYXR0ZW1wdGVkIHRvIGNyZWF0ZSAoZS5nLiwgZmlsZSBvciBkaXJlY3RvcnkpIGFscmVhZHlcbiAgICAgKiBleGlzdHMuXG4gICAgICovXG4gICAgQUxSRUFEWV9FWElTVFM6IFwiYWxyZWFkeS1leGlzdHNcIixcbiAgICAvKipcbiAgICAgKiBUaGUgY2FsbGVyIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBleGVjdXRlIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uLlxuICAgICAqIFBFUk1JU1NJT05fREVOSUVEIG11c3Qgbm90IGJlIHVzZWQgZm9yIHJlamVjdGlvbnMgY2F1c2VkIGJ5IGV4aGF1c3RpbmdcbiAgICAgKiBzb21lIHJlc291cmNlICh1c2UgUkVTT1VSQ0VfRVhIQVVTVEVEIGluc3RlYWQgZm9yIHRob3NlIGVycm9ycykuXG4gICAgICogUEVSTUlTU0lPTl9ERU5JRUQgbXVzdCBub3QgYmUgdXNlZCBpZiB0aGUgY2FsbGVyIGNhbiBub3QgYmUgaWRlbnRpZmllZFxuICAgICAqICh1c2UgVU5BVVRIRU5USUNBVEVEIGluc3RlYWQgZm9yIHRob3NlIGVycm9ycykuXG4gICAgICovXG4gICAgUEVSTUlTU0lPTl9ERU5JRUQ6IFwicGVybWlzc2lvbi1kZW5pZWRcIixcbiAgICAvKipcbiAgICAgKiBUaGUgcmVxdWVzdCBkb2VzIG5vdCBoYXZlIHZhbGlkIGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIGZvciB0aGVcbiAgICAgKiBvcGVyYXRpb24uXG4gICAgICovXG4gICAgVU5BVVRIRU5USUNBVEVEOiBcInVuYXV0aGVudGljYXRlZFwiLFxuICAgIC8qKlxuICAgICAqIFNvbWUgcmVzb3VyY2UgaGFzIGJlZW4gZXhoYXVzdGVkLCBwZXJoYXBzIGEgcGVyLXVzZXIgcXVvdGEsIG9yIHBlcmhhcHMgdGhlXG4gICAgICogZW50aXJlIGZpbGUgc3lzdGVtIGlzIG91dCBvZiBzcGFjZS5cbiAgICAgKi9cbiAgICBSRVNPVVJDRV9FWEhBVVNURUQ6IFwicmVzb3VyY2UtZXhoYXVzdGVkXCIsXG4gICAgLyoqXG4gICAgICogT3BlcmF0aW9uIHdhcyByZWplY3RlZCBiZWNhdXNlIHRoZSBzeXN0ZW0gaXMgbm90IGluIGEgc3RhdGUgcmVxdWlyZWQgZm9yXG4gICAgICogdGhlIG9wZXJhdGlvbidzIGV4ZWN1dGlvbi4gRm9yIGV4YW1wbGUsIGRpcmVjdG9yeSB0byBiZSBkZWxldGVkIG1heSBiZVxuICAgICAqIG5vbi1lbXB0eSwgYW4gcm1kaXIgb3BlcmF0aW9uIGlzIGFwcGxpZWQgdG8gYSBub24tZGlyZWN0b3J5LCBldGMuXG4gICAgICpcbiAgICAgKiBBIGxpdG11cyB0ZXN0IHRoYXQgbWF5IGhlbHAgYSBzZXJ2aWNlIGltcGxlbWVudG9yIGluIGRlY2lkaW5nXG4gICAgICogYmV0d2VlbiBGQUlMRURfUFJFQ09ORElUSU9OLCBBQk9SVEVELCBhbmQgVU5BVkFJTEFCTEU6XG4gICAgICogIChhKSBVc2UgVU5BVkFJTEFCTEUgaWYgdGhlIGNsaWVudCBjYW4gcmV0cnkganVzdCB0aGUgZmFpbGluZyBjYWxsLlxuICAgICAqICAoYikgVXNlIEFCT1JURUQgaWYgdGhlIGNsaWVudCBzaG91bGQgcmV0cnkgYXQgYSBoaWdoZXItbGV2ZWxcbiAgICAgKiAgICAgIChlLmcuLCByZXN0YXJ0aW5nIGEgcmVhZC1tb2RpZnktd3JpdGUgc2VxdWVuY2UpLlxuICAgICAqICAoYykgVXNlIEZBSUxFRF9QUkVDT05ESVRJT04gaWYgdGhlIGNsaWVudCBzaG91bGQgbm90IHJldHJ5IHVudGlsXG4gICAgICogICAgICB0aGUgc3lzdGVtIHN0YXRlIGhhcyBiZWVuIGV4cGxpY2l0bHkgZml4ZWQuIEUuZy4sIGlmIGFuIFwicm1kaXJcIlxuICAgICAqICAgICAgZmFpbHMgYmVjYXVzZSB0aGUgZGlyZWN0b3J5IGlzIG5vbi1lbXB0eSwgRkFJTEVEX1BSRUNPTkRJVElPTlxuICAgICAqICAgICAgc2hvdWxkIGJlIHJldHVybmVkIHNpbmNlIHRoZSBjbGllbnQgc2hvdWxkIG5vdCByZXRyeSB1bmxlc3NcbiAgICAgKiAgICAgIHRoZXkgaGF2ZSBmaXJzdCBmaXhlZCB1cCB0aGUgZGlyZWN0b3J5IGJ5IGRlbGV0aW5nIGZpbGVzIGZyb20gaXQuXG4gICAgICogIChkKSBVc2UgRkFJTEVEX1BSRUNPTkRJVElPTiBpZiB0aGUgY2xpZW50IHBlcmZvcm1zIGNvbmRpdGlvbmFsXG4gICAgICogICAgICBSRVNUIEdldC9VcGRhdGUvRGVsZXRlIG9uIGEgcmVzb3VyY2UgYW5kIHRoZSByZXNvdXJjZSBvbiB0aGVcbiAgICAgKiAgICAgIHNlcnZlciBkb2VzIG5vdCBtYXRjaCB0aGUgY29uZGl0aW9uLiBFLmcuLCBjb25mbGljdGluZ1xuICAgICAqICAgICAgcmVhZC1tb2RpZnktd3JpdGUgb24gdGhlIHNhbWUgcmVzb3VyY2UuXG4gICAgICovXG4gICAgRkFJTEVEX1BSRUNPTkRJVElPTjogXCJmYWlsZWQtcHJlY29uZGl0aW9uXCIsXG4gICAgLyoqXG4gICAgICogVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZCwgdHlwaWNhbGx5IGR1ZSB0byBhIGNvbmN1cnJlbmN5IGlzc3VlIGxpa2VcbiAgICAgKiBzZXF1ZW5jZXIgY2hlY2sgZmFpbHVyZXMsIHRyYW5zYWN0aW9uIGFib3J0cywgZXRjLlxuICAgICAqXG4gICAgICogU2VlIGxpdG11cyB0ZXN0IGFib3ZlIGZvciBkZWNpZGluZyBiZXR3ZWVuIEZBSUxFRF9QUkVDT05ESVRJT04sIEFCT1JURUQsXG4gICAgICogYW5kIFVOQVZBSUxBQkxFLlxuICAgICAqL1xuICAgIEFCT1JURUQ6IFwiYWJvcnRlZFwiLFxuICAgIC8qKlxuICAgICAqIE9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIHBhc3QgdGhlIHZhbGlkIHJhbmdlLiBFLmcuLCBzZWVraW5nIG9yIHJlYWRpbmdcbiAgICAgKiBwYXN0IGVuZCBvZiBmaWxlLlxuICAgICAqXG4gICAgICogVW5saWtlIElOVkFMSURfQVJHVU1FTlQsIHRoaXMgZXJyb3IgaW5kaWNhdGVzIGEgcHJvYmxlbSB0aGF0IG1heSBiZSBmaXhlZFxuICAgICAqIGlmIHRoZSBzeXN0ZW0gc3RhdGUgY2hhbmdlcy4gRm9yIGV4YW1wbGUsIGEgMzItYml0IGZpbGUgc3lzdGVtIHdpbGxcbiAgICAgKiBnZW5lcmF0ZSBJTlZBTElEX0FSR1VNRU5UIGlmIGFza2VkIHRvIHJlYWQgYXQgYW4gb2Zmc2V0IHRoYXQgaXMgbm90IGluIHRoZVxuICAgICAqIHJhbmdlIFswLDJeMzItMV0sIGJ1dCBpdCB3aWxsIGdlbmVyYXRlIE9VVF9PRl9SQU5HRSBpZiBhc2tlZCB0byByZWFkIGZyb21cbiAgICAgKiBhbiBvZmZzZXQgcGFzdCB0aGUgY3VycmVudCBmaWxlIHNpemUuXG4gICAgICpcbiAgICAgKiBUaGVyZSBpcyBhIGZhaXIgYml0IG9mIG92ZXJsYXAgYmV0d2VlbiBGQUlMRURfUFJFQ09ORElUSU9OIGFuZFxuICAgICAqIE9VVF9PRl9SQU5HRS4gV2UgcmVjb21tZW5kIHVzaW5nIE9VVF9PRl9SQU5HRSAodGhlIG1vcmUgc3BlY2lmaWMgZXJyb3IpXG4gICAgICogd2hlbiBpdCBhcHBsaWVzIHNvIHRoYXQgY2FsbGVycyB3aG8gYXJlIGl0ZXJhdGluZyB0aHJvdWdoIGEgc3BhY2UgY2FuXG4gICAgICogZWFzaWx5IGxvb2sgZm9yIGFuIE9VVF9PRl9SQU5HRSBlcnJvciB0byBkZXRlY3Qgd2hlbiB0aGV5IGFyZSBkb25lLlxuICAgICAqL1xuICAgIE9VVF9PRl9SQU5HRTogXCJvdXQtb2YtcmFuZ2VcIixcbiAgICAvKiogT3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBvciBub3Qgc3VwcG9ydGVkL2VuYWJsZWQgaW4gdGhpcyBzZXJ2aWNlLiAqL1xuICAgIFVOSU1QTEVNRU5URUQ6IFwidW5pbXBsZW1lbnRlZFwiLFxuICAgIC8qKlxuICAgICAqIEludGVybmFsIGVycm9ycy4gTWVhbnMgc29tZSBpbnZhcmlhbnRzIGV4cGVjdGVkIGJ5IHVuZGVybHlpbmcgU3lzdGVtIGhhc1xuICAgICAqIGJlZW4gYnJva2VuLiBJZiB5b3Ugc2VlIG9uZSBvZiB0aGVzZSBlcnJvcnMsIFNvbWV0aGluZyBpcyB2ZXJ5IGJyb2tlbi5cbiAgICAgKi9cbiAgICBJTlRFUk5BTDogXCJpbnRlcm5hbFwiLFxuICAgIC8qKlxuICAgICAqIFRoZSBzZXJ2aWNlIGlzIGN1cnJlbnRseSB1bmF2YWlsYWJsZS4gVGhpcyBpcyBhIG1vc3QgbGlrZWx5IGEgdHJhbnNpZW50XG4gICAgICogY29uZGl0aW9uIGFuZCBtYXkgYmUgY29ycmVjdGVkIGJ5IHJldHJ5aW5nIHdpdGggYSBiYWNrb2ZmLlxuICAgICAqXG4gICAgICogU2VlIGxpdG11cyB0ZXN0IGFib3ZlIGZvciBkZWNpZGluZyBiZXR3ZWVuIEZBSUxFRF9QUkVDT05ESVRJT04sIEFCT1JURUQsXG4gICAgICogYW5kIFVOQVZBSUxBQkxFLlxuICAgICAqL1xuICAgIFVOQVZBSUxBQkxFOiBcInVuYXZhaWxhYmxlXCIsXG4gICAgLyoqIFVucmVjb3ZlcmFibGUgZGF0YSBsb3NzIG9yIGNvcnJ1cHRpb24uICovXG4gICAgREFUQV9MT1NTOiBcImRhdGEtbG9zc1wiXG59O1xuXG4vKiogQW4gZXJyb3IgcmV0dXJuZWQgYnkgYSBGaXJlc3RvcmUgb3BlcmF0aW9uLiAqLyBjbGFzcyBRIGV4dGVuZHMgRmlyZWJhc2VFcnJvciB7XG4gICAgLyoqIEBoaWRlY29uc3RydWN0b3IgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBUaGUgYmFja2VuZCBlcnJvciBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVycm9yLlxuICAgICAqL1xuICAgIHQsIFxuICAgIC8qKlxuICAgICAqIEEgY3VzdG9tIGVycm9yIGRlc2NyaXB0aW9uLlxuICAgICAqL1xuICAgIGUpIHtcbiAgICAgICAgc3VwZXIodCwgZSksIHRoaXMuY29kZSA9IHQsIHRoaXMubWVzc2FnZSA9IGUsIFxuICAgICAgICAvLyBIQUNLOiBXZSB3cml0ZSBhIHRvU3RyaW5nIHByb3BlcnR5IGRpcmVjdGx5IGJlY2F1c2UgRXJyb3IgaXMgbm90IGEgcmVhbFxuICAgICAgICAvLyBjbGFzcyBhbmQgc28gaW5oZXJpdGFuY2UgZG9lcyBub3Qgd29yayBjb3JyZWN0bHkuIFdlIGNvdWxkIGFsdGVybmF0aXZlbHlcbiAgICAgICAgLy8gZG8gdGhlIHNhbWUgXCJiYWNrLWRvb3IgaW5oZXJpdGFuY2VcIiB0cmljayB0aGF0IEZpcmViYXNlRXJyb3IgZG9lcy5cbiAgICAgICAgdGhpcy50b1N0cmluZyA9ICgpID0+IGAke3RoaXMubmFtZX06IFtjb2RlPSR7dGhpcy5jb2RlfV06ICR7dGhpcy5tZXNzYWdlfWA7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjbGFzcyBqIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKCh0LCBlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmUgPSB0LCB0aGlzLnJlamVjdCA9IGU7XG4gICAgICAgIH0pKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGNsYXNzIFcge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy51c2VyID0gZSwgdGhpcy50eXBlID0gXCJPQXV0aFwiLCB0aGlzLmhlYWRlcnMgPSBuZXcgTWFwLCB0aGlzLmhlYWRlcnMuc2V0KFwiQXV0aG9yaXphdGlvblwiLCBgQmVhcmVyICR7dH1gKTtcbiAgICB9XG59XG5cbi8qKlxuICogQSBDcmVkZW50aWFsc1Byb3ZpZGVyIHRoYXQgYWx3YXlzIHlpZWxkcyBhbiBlbXB0eSB0b2tlbi5cbiAqIEBpbnRlcm5hbFxuICovIGNsYXNzIHoge1xuICAgIGdldFRva2VuKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICAgIH1cbiAgICBpbnZhbGlkYXRlVG9rZW4oKSB7fVxuICAgIHN0YXJ0KHQsIGUpIHtcbiAgICAgICAgLy8gRmlyZSB3aXRoIGluaXRpYWwgdXNlci5cbiAgICAgICAgdC5lbnF1ZXVlUmV0cnlhYmxlKCgoKSA9PiBlKEMuVU5BVVRIRU5USUNBVEVEKSkpO1xuICAgIH1cbiAgICBzaHV0ZG93bigpIHt9XG59XG5cbi8qKlxuICogQSBDcmVkZW50aWFsc1Byb3ZpZGVyIHRoYXQgYWx3YXlzIHJldHVybnMgYSBjb25zdGFudCB0b2tlbi4gVXNlZCBmb3JcbiAqIGVtdWxhdG9yIHRva2VuIG1vY2tpbmcuXG4gKi8gY2xhc3MgSCB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLnRva2VuID0gdCwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTdG9yZXMgdGhlIGxpc3RlbmVyIHJlZ2lzdGVyZWQgd2l0aCBzZXRDaGFuZ2VMaXN0ZW5lcigpXG4gICAgICAgICAqIFRoaXMgaXNuJ3QgYWN0dWFsbHkgbmVjZXNzYXJ5IHNpbmNlIHRoZSBVSUQgbmV2ZXIgY2hhbmdlcywgYnV0IHdlIHVzZSB0aGlzXG4gICAgICAgICAqIHRvIHZlcmlmeSB0aGUgbGlzdGVuIGNvbnRyYWN0IGlzIGFkaGVyZWQgdG8gaW4gdGVzdHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNoYW5nZUxpc3RlbmVyID0gbnVsbDtcbiAgICB9XG4gICAgZ2V0VG9rZW4oKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy50b2tlbik7XG4gICAgfVxuICAgIGludmFsaWRhdGVUb2tlbigpIHt9XG4gICAgc3RhcnQodCwgZSkge1xuICAgICAgICB0aGlzLmNoYW5nZUxpc3RlbmVyID0gZSwgXG4gICAgICAgIC8vIEZpcmUgd2l0aCBpbml0aWFsIHVzZXIuXG4gICAgICAgIHQuZW5xdWV1ZVJldHJ5YWJsZSgoKCkgPT4gZSh0aGlzLnRva2VuLnVzZXIpKSk7XG4gICAgfVxuICAgIHNodXRkb3duKCkge1xuICAgICAgICB0aGlzLmNoYW5nZUxpc3RlbmVyID0gbnVsbDtcbiAgICB9XG59XG5cbmNsYXNzIEoge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy50ID0gdCwgXG4gICAgICAgIC8qKiBUcmFja3MgdGhlIGN1cnJlbnQgVXNlci4gKi9cbiAgICAgICAgdGhpcy5jdXJyZW50VXNlciA9IEMuVU5BVVRIRU5USUNBVEVELCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvdW50ZXIgdXNlZCB0byBkZXRlY3QgaWYgdGhlIHRva2VuIGNoYW5nZWQgd2hpbGUgYSBnZXRUb2tlbiByZXF1ZXN0IHdhc1xuICAgICAgICAgKiBvdXRzdGFuZGluZy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaSA9IDAsIHRoaXMuZm9yY2VSZWZyZXNoID0gITEsIHRoaXMuYXV0aCA9IG51bGw7XG4gICAgfVxuICAgIHN0YXJ0KHQsIGUpIHtcbiAgICAgICAgbGV0IG4gPSB0aGlzLmk7XG4gICAgICAgIC8vIEEgY2hhbmdlIGxpc3RlbmVyIHRoYXQgcHJldmVudHMgZG91YmxlLWZpcmluZyBmb3IgdGhlIHNhbWUgdG9rZW4gY2hhbmdlLlxuICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB0ID0+IHRoaXMuaSAhPT0gbiA/IChuID0gdGhpcy5pLCBlKHQpKSA6IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAvLyBBIHByb21pc2UgdGhhdCBjYW4gYmUgd2FpdGVkIG9uIHRvIGJsb2NrIG9uIHRoZSBuZXh0IHRva2VuIGNoYW5nZS5cbiAgICAgICAgLy8gVGhpcyBwcm9taXNlIGlzIHJlLWNyZWF0ZWQgYWZ0ZXIgZWFjaCBjaGFuZ2UuXG4gICAgICAgICAgICAgICAgbGV0IGkgPSBuZXcgajtcbiAgICAgICAgdGhpcy5vID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pKyssIHRoaXMuY3VycmVudFVzZXIgPSB0aGlzLnUoKSwgaS5yZXNvbHZlKCksIGkgPSBuZXcgaiwgdC5lbnF1ZXVlUmV0cnlhYmxlKCgoKSA9PiBzKHRoaXMuY3VycmVudFVzZXIpKSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHIgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlID0gaTtcbiAgICAgICAgICAgIHQuZW5xdWV1ZVJldHJ5YWJsZSgoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IGUucHJvbWlzZSwgYXdhaXQgcyh0aGlzLmN1cnJlbnRVc2VyKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSwgbyA9IHQgPT4ge1xuICAgICAgICAgICAgTyhcIkZpcmViYXNlQXV0aENyZWRlbnRpYWxzUHJvdmlkZXJcIiwgXCJBdXRoIGRldGVjdGVkXCIpLCB0aGlzLmF1dGggPSB0LCB0aGlzLmF1dGguYWRkQXV0aFRva2VuTGlzdGVuZXIodGhpcy5vKSwgXG4gICAgICAgICAgICByKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudC5vbkluaXQoKHQgPT4gbyh0KSkpLCBcbiAgICAgICAgLy8gT3VyIHVzZXJzIGNhbiBpbml0aWFsaXplIEF1dGggcmlnaHQgYWZ0ZXIgRmlyZXN0b3JlLCBzbyB3ZSBnaXZlIGl0XG4gICAgICAgIC8vIGEgY2hhbmNlIHRvIHJlZ2lzdGVyIGl0c2VsZiB3aXRoIHRoZSBjb21wb25lbnQgZnJhbWV3b3JrIGJlZm9yZSB3ZVxuICAgICAgICAvLyBkZXRlcm1pbmUgd2hldGhlciB0byBzdGFydCB1cCBpbiB1bmF1dGhlbnRpY2F0ZWQgbW9kZS5cbiAgICAgICAgc2V0VGltZW91dCgoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmF1dGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy50LmdldEltbWVkaWF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsOiAhMFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHQgPyBvKHQpIDogKFxuICAgICAgICAgICAgICAgIC8vIElmIGF1dGggaXMgc3RpbGwgbm90IGF2YWlsYWJsZSwgcHJvY2VlZCB3aXRoIGBudWxsYCB1c2VyXG4gICAgICAgICAgICAgICAgTyhcIkZpcmViYXNlQXV0aENyZWRlbnRpYWxzUHJvdmlkZXJcIiwgXCJBdXRoIG5vdCB5ZXQgZGV0ZWN0ZWRcIiksIGkucmVzb2x2ZSgpLCBpID0gbmV3IGopO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSwgMCksIHIoKTtcbiAgICB9XG4gICAgZ2V0VG9rZW4oKSB7XG4gICAgICAgIC8vIFRha2Ugbm90ZSBvZiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgdG9rZW5Db3VudGVyIHNvIHRoYXQgdGhpcyBtZXRob2RcbiAgICAgICAgLy8gY2FuIGZhaWwgKHdpdGggYW4gQUJPUlRFRCBlcnJvcikgaWYgdGhlcmUgaXMgYSB0b2tlbiBjaGFuZ2Ugd2hpbGUgdGhlXG4gICAgICAgIC8vIHJlcXVlc3QgaXMgb3V0c3RhbmRpbmcuXG4gICAgICAgIGNvbnN0IHQgPSB0aGlzLmksIGUgPSB0aGlzLmZvcmNlUmVmcmVzaDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9yY2VSZWZyZXNoID0gITEsIHRoaXMuYXV0aCA/IHRoaXMuYXV0aC5nZXRUb2tlbihlKS50aGVuKChlID0+IFxuICAgICAgICAvLyBDYW5jZWwgdGhlIHJlcXVlc3Qgc2luY2UgdGhlIHRva2VuIGNoYW5nZWQgd2hpbGUgdGhlIHJlcXVlc3Qgd2FzXG4gICAgICAgIC8vIG91dHN0YW5kaW5nIHNvIHRoZSByZXNwb25zZSBpcyBwb3RlbnRpYWxseSBmb3IgYSBwcmV2aW91cyB1c2VyICh3aGljaFxuICAgICAgICAvLyB1c2VyLCB3ZSBjYW4ndCBiZSBzdXJlKS5cbiAgICAgICAgdGhpcy5pICE9PSB0ID8gKE8oXCJGaXJlYmFzZUF1dGhDcmVkZW50aWFsc1Byb3ZpZGVyXCIsIFwiZ2V0VG9rZW4gYWJvcnRlZCBkdWUgdG8gdG9rZW4gY2hhbmdlLlwiKSwgXG4gICAgICAgIHRoaXMuZ2V0VG9rZW4oKSkgOiBlID8gKHEoXCJzdHJpbmdcIiA9PSB0eXBlb2YgZS5hY2Nlc3NUb2tlbiksIG5ldyBXKGUuYWNjZXNzVG9rZW4sIHRoaXMuY3VycmVudFVzZXIpKSA6IG51bGwpKSA6IFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICB9XG4gICAgaW52YWxpZGF0ZVRva2VuKCkge1xuICAgICAgICB0aGlzLmZvcmNlUmVmcmVzaCA9ICEwO1xuICAgIH1cbiAgICBzaHV0ZG93bigpIHtcbiAgICAgICAgdGhpcy5hdXRoICYmIHRoaXMuYXV0aC5yZW1vdmVBdXRoVG9rZW5MaXN0ZW5lcih0aGlzLm8pO1xuICAgIH1cbiAgICAvLyBBdXRoLmdldFVpZCgpIGNhbiByZXR1cm4gbnVsbCBldmVuIHdpdGggYSB1c2VyIGxvZ2dlZCBpbi4gSXQgaXMgYmVjYXVzZVxuICAgIC8vIGdldFVpZCgpIGlzIHN5bmNocm9ub3VzLCBidXQgdGhlIGF1dGggY29kZSBwb3B1bGF0aW5nIFVpZCBpcyBhc3luY2hyb25vdXMuXG4gICAgLy8gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGluIHRoZSBBdXRoVG9rZW5MaXN0ZW5lciBjYWxsYmFja1xuICAgIC8vIHRvIGd1YXJhbnRlZSB0byBnZXQgdGhlIGFjdHVhbCB1c2VyLlxuICAgIHUoKSB7XG4gICAgICAgIGNvbnN0IHQgPSB0aGlzLmF1dGggJiYgdGhpcy5hdXRoLmdldFVpZCgpO1xuICAgICAgICByZXR1cm4gcShudWxsID09PSB0IHx8IFwic3RyaW5nXCIgPT0gdHlwZW9mIHQpLCBuZXcgQyh0KTtcbiAgICB9XG59XG5cbi8qXG4gKiBGaXJzdFBhcnR5VG9rZW4gcHJvdmlkZXMgYSBmcmVzaCB0b2tlbiBlYWNoIHRpbWUgaXRzIHZhbHVlXG4gKiBpcyByZXF1ZXN0ZWQsIGJlY2F1c2UgaWYgdGhlIHRva2VuIGlzIHRvbyBvbGQsIHJlcXVlc3RzIHdpbGwgYmUgcmVqZWN0ZWQuXG4gKiBUZWNobmljYWxseSB0aGlzIG1heSBubyBsb25nZXIgYmUgbmVjZXNzYXJ5IHNpbmNlIHRoZSBTREsgc2hvdWxkIGdyYWNlZnVsbHlcbiAqIHJlY292ZXIgZnJvbSB1bmF1dGhlbnRpY2F0ZWQgZXJyb3JzIChzZWUgYi8zMzE0NzgxOCBmb3IgY29udGV4dCksIGJ1dCBpdCdzXG4gKiBzYWZlciB0byBrZWVwIHRoZSBpbXBsZW1lbnRhdGlvbiBhcy1pcy5cbiAqLyBjbGFzcyBZIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IFwiRmlyc3RQYXJ0eVwiLCB0aGlzLnVzZXIgPSBDLkZJUlNUX1BBUlRZLCB0aGlzLmhlYWRlcnMgPSBuZXcgTWFwLCB0aGlzLmhlYWRlcnMuc2V0KFwiWC1Hb29nLUF1dGhVc2VyXCIsIGUpO1xuICAgICAgICBjb25zdCBzID0gdC5hdXRoLmdldEF1dGhIZWFkZXJWYWx1ZUZvckZpcnN0UGFydHkoW10pO1xuICAgICAgICBzICYmIHRoaXMuaGVhZGVycy5zZXQoXCJBdXRob3JpemF0aW9uXCIsIHMpLCBuICYmIHRoaXMuaGVhZGVycy5zZXQoXCJYLUdvb2ctSWFtLUF1dGhvcml6YXRpb24tVG9rZW5cIiwgbik7XG4gICAgfVxufVxuXG4vKlxuICogUHJvdmlkZXMgdXNlciBjcmVkZW50aWFscyByZXF1aXJlZCBmb3IgdGhlIEZpcmVzdG9yZSBKYXZhU2NyaXB0IFNES1xuICogdG8gYXV0aGVudGljYXRlIHRoZSB1c2VyLCB1c2luZyB0ZWNobmlxdWUgdGhhdCBpcyBvbmx5IGF2YWlsYWJsZVxuICogdG8gYXBwbGljYXRpb25zIGhvc3RlZCBieSBHb29nbGUuXG4gKi8gY2xhc3MgWCB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbikge1xuICAgICAgICB0aGlzLmggPSB0LCB0aGlzLmwgPSBlLCB0aGlzLm0gPSBuO1xuICAgIH1cbiAgICBnZXRUb2tlbigpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgWSh0aGlzLmgsIHRoaXMubCwgdGhpcy5tKSk7XG4gICAgfVxuICAgIHN0YXJ0KHQsIGUpIHtcbiAgICAgICAgLy8gRmlyZSB3aXRoIGluaXRpYWwgdWlkLlxuICAgICAgICB0LmVucXVldWVSZXRyeWFibGUoKCgpID0+IGUoQy5GSVJTVF9QQVJUWSkpKTtcbiAgICB9XG4gICAgc2h1dGRvd24oKSB7fVxuICAgIGludmFsaWRhdGVUb2tlbigpIHt9XG59XG5cbmNsYXNzIFoge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHQsIHRoaXMudHlwZSA9IFwiQXBwQ2hlY2tcIiwgdGhpcy5oZWFkZXJzID0gbmV3IE1hcCwgdCAmJiB0Lmxlbmd0aCA+IDAgJiYgdGhpcy5oZWFkZXJzLnNldChcIngtZmlyZWJhc2UtYXBwY2hlY2tcIiwgdGhpcy52YWx1ZSk7XG4gICAgfVxufVxuXG5jbGFzcyB0dCB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLmcgPSB0LCB0aGlzLmZvcmNlUmVmcmVzaCA9ICExLCB0aGlzLmFwcENoZWNrID0gbnVsbCwgdGhpcy5wID0gbnVsbDtcbiAgICB9XG4gICAgc3RhcnQodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gdCA9PiB7XG4gICAgICAgICAgICBudWxsICE9IHQuZXJyb3IgJiYgTyhcIkZpcmViYXNlQXBwQ2hlY2tUb2tlblByb3ZpZGVyXCIsIGBFcnJvciBnZXR0aW5nIEFwcCBDaGVjayB0b2tlbjsgdXNpbmcgcGxhY2Vob2xkZXIgdG9rZW4gaW5zdGVhZC4gRXJyb3I6ICR7dC5lcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgY29uc3QgbiA9IHQudG9rZW4gIT09IHRoaXMucDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnAgPSB0LnRva2VuLCBPKFwiRmlyZWJhc2VBcHBDaGVja1Rva2VuUHJvdmlkZXJcIiwgYFJlY2VpdmVkICR7biA/IFwibmV3XCIgOiBcImV4aXN0aW5nXCJ9IHRva2VuLmApLCBcbiAgICAgICAgICAgIG4gPyBlKHQudG9rZW4pIDogUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubyA9IGUgPT4ge1xuICAgICAgICAgICAgdC5lbnF1ZXVlUmV0cnlhYmxlKCgoKSA9PiBuKGUpKSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHMgPSB0ID0+IHtcbiAgICAgICAgICAgIE8oXCJGaXJlYmFzZUFwcENoZWNrVG9rZW5Qcm92aWRlclwiLCBcIkFwcENoZWNrIGRldGVjdGVkXCIpLCB0aGlzLmFwcENoZWNrID0gdCwgdGhpcy5hcHBDaGVjay5hZGRUb2tlbkxpc3RlbmVyKHRoaXMubyk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZy5vbkluaXQoKHQgPT4gcyh0KSkpLCBcbiAgICAgICAgLy8gT3VyIHVzZXJzIGNhbiBpbml0aWFsaXplIEFwcENoZWNrIGFmdGVyIEZpcmVzdG9yZSwgc28gd2UgZ2l2ZSBpdFxuICAgICAgICAvLyBhIGNoYW5jZSB0byByZWdpc3RlciBpdHNlbGYgd2l0aCB0aGUgY29tcG9uZW50IGZyYW1ld29yay5cbiAgICAgICAgc2V0VGltZW91dCgoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFwcENoZWNrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuZy5nZXRJbW1lZGlhdGUoe1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25hbDogITBcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0ID8gcyh0KSA6IFxuICAgICAgICAgICAgICAgIC8vIElmIEFwcENoZWNrIGlzIHN0aWxsIG5vdCBhdmFpbGFibGUsIHByb2NlZWQgd2l0aG91dCBpdC5cbiAgICAgICAgICAgICAgICBPKFwiRmlyZWJhc2VBcHBDaGVja1Rva2VuUHJvdmlkZXJcIiwgXCJBcHBDaGVjayBub3QgeWV0IGRldGVjdGVkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSwgMCk7XG4gICAgfVxuICAgIGdldFRva2VuKCkge1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5mb3JjZVJlZnJlc2g7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcmNlUmVmcmVzaCA9ICExLCB0aGlzLmFwcENoZWNrID8gdGhpcy5hcHBDaGVjay5nZXRUb2tlbih0KS50aGVuKCh0ID0+IHQgPyAocShcInN0cmluZ1wiID09IHR5cGVvZiB0LnRva2VuKSwgXG4gICAgICAgIHRoaXMucCA9IHQudG9rZW4sIG5ldyBaKHQudG9rZW4pKSA6IG51bGwpKSA6IFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICB9XG4gICAgaW52YWxpZGF0ZVRva2VuKCkge1xuICAgICAgICB0aGlzLmZvcmNlUmVmcmVzaCA9ICEwO1xuICAgIH1cbiAgICBzaHV0ZG93bigpIHtcbiAgICAgICAgdGhpcy5hcHBDaGVjayAmJiB0aGlzLmFwcENoZWNrLnJlbW92ZVRva2VuTGlzdGVuZXIodGhpcy5vKTtcbiAgICB9XG59XG5cbi8qKlxuICogQW4gQXBwQ2hlY2sgdG9rZW4gcHJvdmlkZXIgdGhhdCBhbHdheXMgeWllbGRzIGFuIGVtcHR5IHRva2VuLlxuICogQGludGVybmFsXG4gKi8gY2xhc3MgZXQge1xuICAgIGdldFRva2VuKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBaKFwiXCIpKTtcbiAgICB9XG4gICAgaW52YWxpZGF0ZVRva2VuKCkge31cbiAgICBzdGFydCh0LCBlKSB7fVxuICAgIHNodXRkb3duKCkge31cbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBDcmVkZW50aWFsc1Byb3ZpZGVyIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZlxuICogdGhlIGNyZWRlbnRpYWxzIHBhc3NlZCBpbi5cbiAqL1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogYExpc3RlblNlcXVlbmNlYCBpcyBhIG1vbm90b25pYyBzZXF1ZW5jZS4gSXQgaXMgaW5pdGlhbGl6ZWQgd2l0aCBhIG1pbmltdW0gdmFsdWUgdG9cbiAqIGV4Y2VlZC4gQWxsIHN1YnNlcXVlbnQgY2FsbHMgdG8gbmV4dCB3aWxsIHJldHVybiBpbmNyZWFzaW5nIHZhbHVlcy4gSWYgcHJvdmlkZWQgd2l0aCBhXG4gKiBgU2VxdWVuY2VOdW1iZXJTeW5jZXJgLCBpdCB3aWxsIGFkZGl0aW9uYWxseSBidW1wIGl0cyBuZXh0IHZhbHVlIHdoZW4gdG9sZCBvZiBhIG5ldyB2YWx1ZSwgYXNcbiAqIHdlbGwgYXMgd3JpdGUgb3V0IHNlcXVlbmNlIG51bWJlcnMgdGhhdCBpdCBwcm9kdWNlcyB2aWEgYG5leHQoKWAuXG4gKi9cbmNsYXNzIG50IHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMucHJldmlvdXNWYWx1ZSA9IHQsIGUgJiYgKGUuc2VxdWVuY2VOdW1iZXJIYW5kbGVyID0gdCA9PiB0aGlzLkkodCksIHRoaXMuVCA9IHQgPT4gZS53cml0ZVNlcXVlbmNlTnVtYmVyKHQpKTtcbiAgICB9XG4gICAgSSh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXZpb3VzVmFsdWUgPSBNYXRoLm1heCh0LCB0aGlzLnByZXZpb3VzVmFsdWUpLCB0aGlzLnByZXZpb3VzVmFsdWU7XG4gICAgfVxuICAgIG5leHQoKSB7XG4gICAgICAgIGNvbnN0IHQgPSArK3RoaXMucHJldmlvdXNWYWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuVCAmJiB0aGlzLlQodCksIHQ7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBHZW5lcmF0ZXMgYG5CeXRlc2Agb2YgcmFuZG9tIGJ5dGVzLlxuICpcbiAqIElmIGBuQnl0ZXMgPCAwYCAsIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICovXG5mdW5jdGlvbiBzdCh0KSB7XG4gICAgLy8gUG9seWZpbGxzIGZvciBJRSBhbmQgV2ViV29ya2VyIGJ5IHVzaW5nIGBzZWxmYCBhbmQgYG1zQ3J5cHRvYCB3aGVuIGBjcnlwdG9gIGlzIG5vdCBhdmFpbGFibGUuXG4gICAgY29uc3QgZSA9IFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2Ygc2VsZiAmJiAoc2VsZi5jcnlwdG8gfHwgc2VsZi5tc0NyeXB0byksIG4gPSBuZXcgVWludDhBcnJheSh0KTtcbiAgICBpZiAoZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGUuZ2V0UmFuZG9tVmFsdWVzKSBlLmdldFJhbmRvbVZhbHVlcyhuKTsgZWxzZSBcbiAgICAvLyBGYWxscyBiYWNrIHRvIE1hdGgucmFuZG9tXG4gICAgZm9yIChsZXQgZSA9IDA7IGUgPCB0OyBlKyspIG5bZV0gPSBNYXRoLmZsb29yKDI1NiAqIE1hdGgucmFuZG9tKCkpO1xuICAgIHJldHVybiBuO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBudC5BID0gLTE7XG5cbmNsYXNzIGl0IHtcbiAgICBzdGF0aWMgUigpIHtcbiAgICAgICAgLy8gQWxwaGFudW1lcmljIGNoYXJhY3RlcnNcbiAgICAgICAgY29uc3QgdCA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODlcIiwgZSA9IE1hdGguZmxvb3IoMjU2IC8gdC5sZW5ndGgpICogdC5sZW5ndGg7XG4gICAgICAgIC8vIFRoZSBsYXJnZXN0IGJ5dGUgdmFsdWUgdGhhdCBpcyBhIG11bHRpcGxlIG9mIGBjaGFyLmxlbmd0aGAuXG4gICAgICAgICAgICAgICAgbGV0IG4gPSBcIlwiO1xuICAgICAgICBmb3IgKDtuLmxlbmd0aCA8IDIwOyApIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBzdCg0MCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHMubGVuZ3RoOyArK2kpIFxuICAgICAgICAgICAgLy8gT25seSBhY2NlcHQgdmFsdWVzIHRoYXQgYXJlIFswLCBtYXhNdWx0aXBsZSksIHRoaXMgZW5zdXJlcyB0aGV5IGNhblxuICAgICAgICAgICAgLy8gYmUgZXZlbmx5IG1hcHBlZCB0byBpbmRpY2VzIG9mIGBjaGFyc2AgdmlhIGEgbW9kdWxvIG9wZXJhdGlvbi5cbiAgICAgICAgICAgIG4ubGVuZ3RoIDwgMjAgJiYgc1tpXSA8IGUgJiYgKG4gKz0gdC5jaGFyQXQoc1tpXSAlIHQubGVuZ3RoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG47XG4gICAgfVxufVxuXG5mdW5jdGlvbiBydCh0LCBlKSB7XG4gICAgcmV0dXJuIHQgPCBlID8gLTEgOiB0ID4gZSA/IDEgOiAwO1xufVxuXG4vKiogSGVscGVyIHRvIGNvbXBhcmUgYXJyYXlzIHVzaW5nIGlzRXF1YWwoKS4gKi8gZnVuY3Rpb24gb3QodCwgZSwgbikge1xuICAgIHJldHVybiB0Lmxlbmd0aCA9PT0gZS5sZW5ndGggJiYgdC5ldmVyeSgoKHQsIHMpID0+IG4odCwgZVtzXSkpKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbW1lZGlhdGUgbGV4aWNvZ3JhcGhpY2FsbHktZm9sbG93aW5nIHN0cmluZy4gVGhpcyBpcyB1c2VmdWwgdG9cbiAqIGNvbnN0cnVjdCBhbiBpbmNsdXNpdmUgcmFuZ2UgZm9yIGluZGV4ZWRkYiBpdGVyYXRvcnMuXG4gKi8gZnVuY3Rpb24gYXQodCkge1xuICAgIC8vIFJldHVybiB0aGUgaW5wdXQgc3RyaW5nLCB3aXRoIGFuIGFkZGl0aW9uYWwgTlVMIGJ5dGUgYXBwZW5kZWQuXG4gICAgcmV0dXJuIHQgKyBcIlxcMFwiO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLy8gVGhlIGVhcmxpZXN0IGRhdGUgc3VwcG9ydGVkIGJ5IEZpcmVzdG9yZSB0aW1lc3RhbXBzICgwMDAxLTAxLTAxVDAwOjAwOjAwWikuXG4vKipcbiAqIEEgYFRpbWVzdGFtcGAgcmVwcmVzZW50cyBhIHBvaW50IGluIHRpbWUgaW5kZXBlbmRlbnQgb2YgYW55IHRpbWUgem9uZSBvclxuICogY2FsZW5kYXIsIHJlcHJlc2VudGVkIGFzIHNlY29uZHMgYW5kIGZyYWN0aW9ucyBvZiBzZWNvbmRzIGF0IG5hbm9zZWNvbmRcbiAqIHJlc29sdXRpb24gaW4gVVRDIEVwb2NoIHRpbWUuXG4gKlxuICogSXQgaXMgZW5jb2RlZCB1c2luZyB0aGUgUHJvbGVwdGljIEdyZWdvcmlhbiBDYWxlbmRhciB3aGljaCBleHRlbmRzIHRoZVxuICogR3JlZ29yaWFuIGNhbGVuZGFyIGJhY2t3YXJkcyB0byB5ZWFyIG9uZS4gSXQgaXMgZW5jb2RlZCBhc3N1bWluZyBhbGwgbWludXRlc1xuICogYXJlIDYwIHNlY29uZHMgbG9uZywgaS5lLiBsZWFwIHNlY29uZHMgYXJlIFwic21lYXJlZFwiIHNvIHRoYXQgbm8gbGVhcCBzZWNvbmRcbiAqIHRhYmxlIGlzIG5lZWRlZCBmb3IgaW50ZXJwcmV0YXRpb24uIFJhbmdlIGlzIGZyb20gMDAwMS0wMS0wMVQwMDowMDowMFogdG9cbiAqIDk5OTktMTItMzFUMjM6NTk6NTkuOTk5OTk5OTk5Wi5cbiAqXG4gKiBGb3IgZXhhbXBsZXMgYW5kIGZ1cnRoZXIgc3BlY2lmaWNhdGlvbnMsIHJlZmVyIHRvIHRoZVxuICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvcHJvdG9idWYvYmxvYi9tYXN0ZXIvc3JjL2dvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucHJvdG8gfCBUaW1lc3RhbXAgZGVmaW5pdGlvbn0uXG4gKi9cbmNsYXNzIHV0IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHRpbWVzdGFtcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzZWNvbmRzIC0gVGhlIG51bWJlciBvZiBzZWNvbmRzIG9mIFVUQyB0aW1lIHNpbmNlIFVuaXggZXBvY2hcbiAgICAgKiAgICAgMTk3MC0wMS0wMVQwMDowMDowMFouIE11c3QgYmUgZnJvbSAwMDAxLTAxLTAxVDAwOjAwOjAwWiB0b1xuICAgICAqICAgICA5OTk5LTEyLTMxVDIzOjU5OjU5WiBpbmNsdXNpdmUuXG4gICAgICogQHBhcmFtIG5hbm9zZWNvbmRzIC0gVGhlIG5vbi1uZWdhdGl2ZSBmcmFjdGlvbnMgb2YgYSBzZWNvbmQgYXQgbmFub3NlY29uZFxuICAgICAqICAgICByZXNvbHV0aW9uLiBOZWdhdGl2ZSBzZWNvbmQgdmFsdWVzIHdpdGggZnJhY3Rpb25zIG11c3Qgc3RpbGwgaGF2ZVxuICAgICAqICAgICBub24tbmVnYXRpdmUgbmFub3NlY29uZHMgdmFsdWVzIHRoYXQgY291bnQgZm9yd2FyZCBpbiB0aW1lLiBNdXN0IGJlXG4gICAgICogICAgIGZyb20gMCB0byA5OTksOTk5LDk5OSBpbmNsdXNpdmUuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBzZWNvbmRzIG9mIFVUQyB0aW1lIHNpbmNlIFVuaXggZXBvY2ggMTk3MC0wMS0wMVQwMDowMDowMFouXG4gICAgICovXG4gICAgdCwgXG4gICAgLyoqXG4gICAgICogVGhlIGZyYWN0aW9ucyBvZiBhIHNlY29uZCBhdCBuYW5vc2Vjb25kIHJlc29sdXRpb24uKlxuICAgICAqL1xuICAgIGUpIHtcbiAgICAgICAgaWYgKHRoaXMuc2Vjb25kcyA9IHQsIHRoaXMubmFub3NlY29uZHMgPSBlLCBlIDwgMCkgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBcIlRpbWVzdGFtcCBuYW5vc2Vjb25kcyBvdXQgb2YgcmFuZ2U6IFwiICsgZSk7XG4gICAgICAgIGlmIChlID49IDFlOSkgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBcIlRpbWVzdGFtcCBuYW5vc2Vjb25kcyBvdXQgb2YgcmFuZ2U6IFwiICsgZSk7XG4gICAgICAgIGlmICh0IDwgLTYyMTM1NTk2ODAwKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIFwiVGltZXN0YW1wIHNlY29uZHMgb3V0IG9mIHJhbmdlOiBcIiArIHQpO1xuICAgICAgICAvLyBUaGlzIHdpbGwgYnJlYWsgaW4gdGhlIHllYXIgMTAsMDAwLlxuICAgICAgICAgICAgICAgIGlmICh0ID49IDI1MzQwMjMwMDgwMCkgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBcIlRpbWVzdGFtcCBzZWNvbmRzIG91dCBvZiByYW5nZTogXCIgKyB0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyB0aW1lc3RhbXAgd2l0aCB0aGUgY3VycmVudCBkYXRlLCB3aXRoIG1pbGxpc2Vjb25kIHByZWNpc2lvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGEgbmV3IHRpbWVzdGFtcCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgZGF0ZS5cbiAgICAgKi8gICAgc3RhdGljIG5vdygpIHtcbiAgICAgICAgcmV0dXJuIHV0LmZyb21NaWxsaXMoRGF0ZS5ub3coKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgdGltZXN0YW1wIGZyb20gdGhlIGdpdmVuIGRhdGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGluaXRpYWxpemUgdGhlIGBUaW1lc3RhbXBgIGZyb20uXG4gICAgICogQHJldHVybnMgQSBuZXcgYFRpbWVzdGFtcGAgcmVwcmVzZW50aW5nIHRoZSBzYW1lIHBvaW50IGluIHRpbWUgYXMgdGhlIGdpdmVuXG4gICAgICogICAgIGRhdGUuXG4gICAgICovICAgIHN0YXRpYyBmcm9tRGF0ZSh0KSB7XG4gICAgICAgIHJldHVybiB1dC5mcm9tTWlsbGlzKHQuZ2V0VGltZSgpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyB0aW1lc3RhbXAgZnJvbSB0aGUgZ2l2ZW4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtaWxsaXNlY29uZHMgLSBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIFVuaXggZXBvY2hcbiAgICAgKiAgICAgMTk3MC0wMS0wMVQwMDowMDowMFouXG4gICAgICogQHJldHVybnMgQSBuZXcgYFRpbWVzdGFtcGAgcmVwcmVzZW50aW5nIHRoZSBzYW1lIHBvaW50IGluIHRpbWUgYXMgdGhlIGdpdmVuXG4gICAgICogICAgIG51bWJlciBvZiBtaWxsaXNlY29uZHMuXG4gICAgICovICAgIHN0YXRpYyBmcm9tTWlsbGlzKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IE1hdGguZmxvb3IodCAvIDFlMyksIG4gPSBNYXRoLmZsb29yKDFlNiAqICh0IC0gMWUzICogZSkpO1xuICAgICAgICByZXR1cm4gbmV3IHV0KGUsIG4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhIGBUaW1lc3RhbXBgIHRvIGEgSmF2YVNjcmlwdCBgRGF0ZWAgb2JqZWN0LiBUaGlzIGNvbnZlcnNpb25cbiAgICAgKiBjYXVzZXMgYSBsb3NzIG9mIHByZWNpc2lvbiBzaW5jZSBgRGF0ZWAgb2JqZWN0cyBvbmx5IHN1cHBvcnQgbWlsbGlzZWNvbmRcbiAgICAgKiBwcmVjaXNpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBKYXZhU2NyaXB0IGBEYXRlYCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzYW1lIHBvaW50IGluIHRpbWUgYXNcbiAgICAgKiAgICAgdGhpcyBgVGltZXN0YW1wYCwgd2l0aCBtaWxsaXNlY29uZCBwcmVjaXNpb24uXG4gICAgICovICAgIHRvRGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMudG9NaWxsaXMoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEgYFRpbWVzdGFtcGAgdG8gYSBudW1lcmljIHRpbWVzdGFtcCAoaW4gbWlsbGlzZWNvbmRzIHNpbmNlXG4gICAgICogZXBvY2gpLiBUaGlzIG9wZXJhdGlvbiBjYXVzZXMgYSBsb3NzIG9mIHByZWNpc2lvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBwb2ludCBpbiB0aW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyB0aW1lc3RhbXAsIHJlcHJlc2VudGVkIGFzXG4gICAgICogICAgIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIFVuaXggZXBvY2ggMTk3MC0wMS0wMVQwMDowMDowMFouXG4gICAgICovICAgIHRvTWlsbGlzKCkge1xuICAgICAgICByZXR1cm4gMWUzICogdGhpcy5zZWNvbmRzICsgdGhpcy5uYW5vc2Vjb25kcyAvIDFlNjtcbiAgICB9XG4gICAgX2NvbXBhcmVUbyh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlY29uZHMgPT09IHQuc2Vjb25kcyA/IHJ0KHRoaXMubmFub3NlY29uZHMsIHQubmFub3NlY29uZHMpIDogcnQodGhpcy5zZWNvbmRzLCB0LnNlY29uZHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBgVGltZXN0YW1wYCBpcyBlcXVhbCB0byB0aGUgcHJvdmlkZWQgb25lLlxuICAgICAqXG4gICAgICogQHBhcmFtIG90aGVyIC0gVGhlIGBUaW1lc3RhbXBgIHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoaXMgYFRpbWVzdGFtcGAgaXMgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIG9uZS5cbiAgICAgKi8gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIHJldHVybiB0LnNlY29uZHMgPT09IHRoaXMuc2Vjb25kcyAmJiB0Lm5hbm9zZWNvbmRzID09PSB0aGlzLm5hbm9zZWNvbmRzO1xuICAgIH1cbiAgICAvKiogUmV0dXJucyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBgVGltZXN0YW1wYC4gKi8gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBcIlRpbWVzdGFtcChzZWNvbmRzPVwiICsgdGhpcy5zZWNvbmRzICsgXCIsIG5hbm9zZWNvbmRzPVwiICsgdGhpcy5uYW5vc2Vjb25kcyArIFwiKVwiO1xuICAgIH1cbiAgICAvKiogUmV0dXJucyBhIEpTT04tc2VyaWFsaXphYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgYFRpbWVzdGFtcGAuICovICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNlY29uZHM6IHRoaXMuc2Vjb25kcyxcbiAgICAgICAgICAgIG5hbm9zZWNvbmRzOiB0aGlzLm5hbm9zZWNvbmRzXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgcHJpbWl0aXZlIHN0cmluZywgd2hpY2ggYWxsb3dzIGBUaW1lc3RhbXBgIG9iamVjdHNcbiAgICAgKiB0byBiZSBjb21wYXJlZCB1c2luZyB0aGUgYD5gLCBgPD1gLCBgPj1gIGFuZCBgPmAgb3BlcmF0b3JzLlxuICAgICAqLyAgICB2YWx1ZU9mKCkge1xuICAgICAgICAvLyBUaGlzIG1ldGhvZCByZXR1cm5zIGEgc3RyaW5nIG9mIHRoZSBmb3JtIDxzZWNvbmRzPi48bmFub3NlY29uZHM+IHdoZXJlXG4gICAgICAgIC8vIDxzZWNvbmRzPiBpcyB0cmFuc2xhdGVkIHRvIGhhdmUgYSBub24tbmVnYXRpdmUgdmFsdWUgYW5kIGJvdGggPHNlY29uZHM+XG4gICAgICAgIC8vIGFuZCA8bmFub3NlY29uZHM+IGFyZSBsZWZ0LXBhZGRlZCB3aXRoIHplcm9lcyB0byBiZSBhIGNvbnNpc3RlbnQgbGVuZ3RoLlxuICAgICAgICAvLyBTdHJpbmdzIHdpdGggdGhpcyBmb3JtYXQgdGhlbiBoYXZlIGEgbGV4aW9ncmFwaGljYWwgb3JkZXJpbmcgdGhhdCBtYXRjaGVzXG4gICAgICAgIC8vIHRoZSBleHBlY3RlZCBvcmRlcmluZy4gVGhlIDxzZWNvbmRzPiB0cmFuc2xhdGlvbiBpcyBkb25lIHRvIGF2b2lkIGhhdmluZ1xuICAgICAgICAvLyBhIGxlYWRpbmcgbmVnYXRpdmUgc2lnbiAoaS5lLiBhIGxlYWRpbmcgJy0nIGNoYXJhY3RlcikgaW4gaXRzIHN0cmluZ1xuICAgICAgICAvLyByZXByZXNlbnRhdGlvbiwgd2hpY2ggd291bGQgYWZmZWN0IGl0cyBsZXhpb2dyYXBoaWNhbCBvcmRlcmluZy5cbiAgICAgICAgY29uc3QgdCA9IHRoaXMuc2Vjb25kcyAtIC02MjEzNTU5NjgwMDtcbiAgICAgICAgLy8gTm90ZTogVXAgdG8gMTIgZGVjaW1hbCBkaWdpdHMgYXJlIHJlcXVpcmVkIHRvIHJlcHJlc2VudCBhbGwgdmFsaWRcbiAgICAgICAgLy8gJ3NlY29uZHMnIHZhbHVlcy5cbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHQpLnBhZFN0YXJ0KDEyLCBcIjBcIikgKyBcIi5cIiArIFN0cmluZyh0aGlzLm5hbm9zZWNvbmRzKS5wYWRTdGFydCg5LCBcIjBcIik7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIHZlcnNpb24gb2YgYSBkb2N1bWVudCBpbiBGaXJlc3RvcmUuIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIHZlcnNpb25cbiAqIHRpbWVzdGFtcCwgc3VjaCBhcyB1cGRhdGVfdGltZSBvciByZWFkX3RpbWUuXG4gKi8gY2xhc3MgY3Qge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy50aW1lc3RhbXAgPSB0O1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbVRpbWVzdGFtcCh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgY3QodCk7XG4gICAgfVxuICAgIHN0YXRpYyBtaW4oKSB7XG4gICAgICAgIHJldHVybiBuZXcgY3QobmV3IHV0KDAsIDApKTtcbiAgICB9XG4gICAgY29tcGFyZVRvKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGltZXN0YW1wLl9jb21wYXJlVG8odC50aW1lc3RhbXApO1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGltZXN0YW1wLmlzRXF1YWwodC50aW1lc3RhbXApO1xuICAgIH1cbiAgICAvKiogUmV0dXJucyBhIG51bWJlciByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVyc2lvbiBmb3IgdXNlIGluIHNwZWMgdGVzdHMuICovICAgIHRvTWljcm9zZWNvbmRzKCkge1xuICAgICAgICAvLyBDb252ZXJ0IHRvIG1pY3Jvc2Vjb25kcy5cbiAgICAgICAgcmV0dXJuIDFlNiAqIHRoaXMudGltZXN0YW1wLnNlY29uZHMgKyB0aGlzLnRpbWVzdGFtcC5uYW5vc2Vjb25kcyAvIDFlMztcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBcIlNuYXBzaG90VmVyc2lvbihcIiArIHRoaXMudGltZXN0YW1wLnRvU3RyaW5nKCkgKyBcIilcIjtcbiAgICB9XG4gICAgdG9UaW1lc3RhbXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRpbWVzdGFtcDtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGZ1bmN0aW9uIGh0KHQpIHtcbiAgICBsZXQgZSA9IDA7XG4gICAgZm9yIChjb25zdCBuIGluIHQpIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiBlKys7XG4gICAgcmV0dXJuIGU7XG59XG5cbmZ1bmN0aW9uIGx0KHQsIGUpIHtcbiAgICBmb3IgKGNvbnN0IG4gaW4gdCkgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIGUobiwgdFtuXSk7XG59XG5cbmZ1bmN0aW9uIGZ0KHQpIHtcbiAgICBmb3IgKGNvbnN0IGUgaW4gdCkgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBlKSkgcmV0dXJuICExO1xuICAgIHJldHVybiAhMDtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogUGF0aCByZXByZXNlbnRzIGFuIG9yZGVyZWQgc2VxdWVuY2Ugb2Ygc3RyaW5nIHNlZ21lbnRzLlxuICovXG5jbGFzcyBkdCB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbikge1xuICAgICAgICB2b2lkIDAgPT09IGUgPyBlID0gMCA6IGUgPiB0Lmxlbmd0aCAmJiBMKCksIHZvaWQgMCA9PT0gbiA/IG4gPSB0Lmxlbmd0aCAtIGUgOiBuID4gdC5sZW5ndGggLSBlICYmIEwoKSwgXG4gICAgICAgIHRoaXMuc2VnbWVudHMgPSB0LCB0aGlzLm9mZnNldCA9IGUsIHRoaXMubGVuID0gbjtcbiAgICB9XG4gICAgZ2V0IGxlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVuO1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIDAgPT09IGR0LmNvbXBhcmF0b3IodGhpcywgdCk7XG4gICAgfVxuICAgIGNoaWxkKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMuc2VnbWVudHMuc2xpY2UodGhpcy5vZmZzZXQsIHRoaXMubGltaXQoKSk7XG4gICAgICAgIHJldHVybiB0IGluc3RhbmNlb2YgZHQgPyB0LmZvckVhY2goKHQgPT4ge1xuICAgICAgICAgICAgZS5wdXNoKHQpO1xuICAgICAgICB9KSkgOiBlLnB1c2godCksIHRoaXMuY29uc3RydWN0KGUpO1xuICAgIH1cbiAgICAvKiogVGhlIGluZGV4IG9mIG9uZSBwYXN0IHRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIHBhdGguICovICAgIGxpbWl0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vZmZzZXQgKyB0aGlzLmxlbmd0aDtcbiAgICB9XG4gICAgcG9wRmlyc3QodCkge1xuICAgICAgICByZXR1cm4gdCA9IHZvaWQgMCA9PT0gdCA/IDEgOiB0LCB0aGlzLmNvbnN0cnVjdCh0aGlzLnNlZ21lbnRzLCB0aGlzLm9mZnNldCArIHQsIHRoaXMubGVuZ3RoIC0gdCk7XG4gICAgfVxuICAgIHBvcExhc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdCh0aGlzLnNlZ21lbnRzLCB0aGlzLm9mZnNldCwgdGhpcy5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgZmlyc3RTZWdtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWdtZW50c1t0aGlzLm9mZnNldF07XG4gICAgfVxuICAgIGxhc3RTZWdtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXQodGhpcy5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgZ2V0KHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VnbWVudHNbdGhpcy5vZmZzZXQgKyB0XTtcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIDAgPT09IHRoaXMubGVuZ3RoO1xuICAgIH1cbiAgICBpc1ByZWZpeE9mKHQpIHtcbiAgICAgICAgaWYgKHQubGVuZ3RoIDwgdGhpcy5sZW5ndGgpIHJldHVybiAhMTtcbiAgICAgICAgZm9yIChsZXQgZSA9IDA7IGUgPCB0aGlzLmxlbmd0aDsgZSsrKSBpZiAodGhpcy5nZXQoZSkgIT09IHQuZ2V0KGUpKSByZXR1cm4gITE7XG4gICAgICAgIHJldHVybiAhMDtcbiAgICB9XG4gICAgaXNJbW1lZGlhdGVQYXJlbnRPZih0KSB7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCArIDEgIT09IHQubGVuZ3RoKSByZXR1cm4gITE7XG4gICAgICAgIGZvciAobGV0IGUgPSAwOyBlIDwgdGhpcy5sZW5ndGg7IGUrKykgaWYgKHRoaXMuZ2V0KGUpICE9PSB0LmdldChlKSkgcmV0dXJuICExO1xuICAgICAgICByZXR1cm4gITA7XG4gICAgfVxuICAgIGZvckVhY2godCkge1xuICAgICAgICBmb3IgKGxldCBlID0gdGhpcy5vZmZzZXQsIG4gPSB0aGlzLmxpbWl0KCk7IGUgPCBuOyBlKyspIHQodGhpcy5zZWdtZW50c1tlXSk7XG4gICAgfVxuICAgIHRvQXJyYXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlZ21lbnRzLnNsaWNlKHRoaXMub2Zmc2V0LCB0aGlzLmxpbWl0KCkpO1xuICAgIH1cbiAgICBzdGF0aWMgY29tcGFyYXRvcih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBNYXRoLm1pbih0Lmxlbmd0aCwgZS5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBzID0gMDsgcyA8IG47IHMrKykge1xuICAgICAgICAgICAgY29uc3QgbiA9IHQuZ2V0KHMpLCBpID0gZS5nZXQocyk7XG4gICAgICAgICAgICBpZiAobiA8IGkpIHJldHVybiAtMTtcbiAgICAgICAgICAgIGlmIChuID4gaSkgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQubGVuZ3RoIDwgZS5sZW5ndGggPyAtMSA6IHQubGVuZ3RoID4gZS5sZW5ndGggPyAxIDogMDtcbiAgICB9XG59XG5cbi8qKlxuICogQSBzbGFzaC1zZXBhcmF0ZWQgcGF0aCBmb3IgbmF2aWdhdGluZyByZXNvdXJjZXMgKGRvY3VtZW50cyBhbmQgY29sbGVjdGlvbnMpXG4gKiB3aXRoaW4gRmlyZXN0b3JlLlxuICpcbiAqIEBpbnRlcm5hbFxuICovIGNsYXNzIF90IGV4dGVuZHMgZHQge1xuICAgIGNvbnN0cnVjdCh0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiBuZXcgX3QodCwgZSwgbik7XG4gICAgfVxuICAgIGNhbm9uaWNhbFN0cmluZygpIHtcbiAgICAgICAgLy8gTk9URTogVGhlIGNsaWVudCBpcyBpZ25vcmFudCBvZiBhbnkgcGF0aCBzZWdtZW50cyBjb250YWluaW5nIGVzY2FwZVxuICAgICAgICAvLyBzZXF1ZW5jZXMgKGUuZy4gX19pZDEyM19fKSBhbmQganVzdCBwYXNzZXMgdGhlbSB0aHJvdWdoIHJhdyAodGhleSBleGlzdFxuICAgICAgICAvLyBmb3IgbGVnYWN5IHJlYXNvbnMgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBmcmVxdWVudGx5KS5cbiAgICAgICAgcmV0dXJuIHRoaXMudG9BcnJheSgpLmpvaW4oXCIvXCIpO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2Fub25pY2FsU3RyaW5nKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSByZXNvdXJjZSBwYXRoIGZyb20gdGhlIGdpdmVuIHNsYXNoLWRlbGltaXRlZCBzdHJpbmcuIElmIG11bHRpcGxlXG4gICAgICogYXJndW1lbnRzIGFyZSBwcm92aWRlZCwgYWxsIGNvbXBvbmVudHMgYXJlIGNvbWJpbmVkLiBMZWFkaW5nIGFuZCB0cmFpbGluZ1xuICAgICAqIHNsYXNoZXMgZnJvbSBhbGwgY29tcG9uZW50cyBhcmUgaWdub3JlZC5cbiAgICAgKi8gICAgc3RhdGljIGZyb21TdHJpbmcoLi4udCkge1xuICAgICAgICAvLyBOT1RFOiBUaGUgY2xpZW50IGlzIGlnbm9yYW50IG9mIGFueSBwYXRoIHNlZ21lbnRzIGNvbnRhaW5pbmcgZXNjYXBlXG4gICAgICAgIC8vIHNlcXVlbmNlcyAoZS5nLiBfX2lkMTIzX18pIGFuZCBqdXN0IHBhc3NlcyB0aGVtIHRocm91Z2ggcmF3ICh0aGV5IGV4aXN0XG4gICAgICAgIC8vIGZvciBsZWdhY3kgcmVhc29ucyBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGZyZXF1ZW50bHkpLlxuICAgICAgICBjb25zdCBlID0gW107XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiB0KSB7XG4gICAgICAgICAgICBpZiAobi5pbmRleE9mKFwiLy9cIikgPj0gMCkgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBgSW52YWxpZCBzZWdtZW50ICgke259KS4gUGF0aHMgbXVzdCBub3QgY29udGFpbiAvLyBpbiB0aGVtLmApO1xuICAgICAgICAgICAgLy8gU3RyaXAgbGVhZGluZyBhbmQgdHJhbGluZyBzbGFzaGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgZS5wdXNoKC4uLm4uc3BsaXQoXCIvXCIpLmZpbHRlcigodCA9PiB0Lmxlbmd0aCA+IDApKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBfdChlKTtcbiAgICB9XG4gICAgc3RhdGljIGVtcHR5UGF0aCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBfdChbXSk7XG4gICAgfVxufVxuXG5jb25zdCB3dCA9IC9eW19hLXpBLVpdW19hLXpBLVowLTldKiQvO1xuXG4vKipcbiAqIEEgZG90LXNlcGFyYXRlZCBwYXRoIGZvciBuYXZpZ2F0aW5nIHN1Yi1vYmplY3RzIHdpdGhpbiBhIGRvY3VtZW50LlxuICogQGludGVybmFsXG4gKi8gY2xhc3MgbXQgZXh0ZW5kcyBkdCB7XG4gICAgY29uc3RydWN0KHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBtdCh0LCBlLCBuKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdHJpbmcgY291bGQgYmUgdXNlZCBhcyBhIHNlZ21lbnQgaW4gYSBmaWVsZCBwYXRoXG4gICAgICogd2l0aG91dCBlc2NhcGluZy5cbiAgICAgKi8gICAgc3RhdGljIGlzVmFsaWRJZGVudGlmaWVyKHQpIHtcbiAgICAgICAgcmV0dXJuIHd0LnRlc3QodCk7XG4gICAgfVxuICAgIGNhbm9uaWNhbFN0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9BcnJheSgpLm1hcCgodCA9PiAodCA9IHQucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpLnJlcGxhY2UoL2AvZywgXCJcXFxcYFwiKSwgXG4gICAgICAgIG10LmlzVmFsaWRJZGVudGlmaWVyKHQpIHx8ICh0ID0gXCJgXCIgKyB0ICsgXCJgXCIpLCB0KSkpLmpvaW4oXCIuXCIpO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2Fub25pY2FsU3RyaW5nKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGZpZWxkIHJlZmVyZW5jZXMgdGhlIGtleSBvZiBhIGRvY3VtZW50LlxuICAgICAqLyAgICBpc0tleUZpZWxkKCkge1xuICAgICAgICByZXR1cm4gMSA9PT0gdGhpcy5sZW5ndGggJiYgXCJfX25hbWVfX1wiID09PSB0aGlzLmdldCgwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGZpZWxkIGRlc2lnbmF0aW5nIHRoZSBrZXkgb2YgYSBkb2N1bWVudC5cbiAgICAgKi8gICAgc3RhdGljIGtleUZpZWxkKCkge1xuICAgICAgICByZXR1cm4gbmV3IG10KFsgXCJfX25hbWVfX1wiIF0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSBmaWVsZCBzdHJpbmcgZnJvbSB0aGUgZ2l2ZW4gc2VydmVyLWZvcm1hdHRlZCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiAtIFNwbGl0dGluZyB0aGUgZW1wdHkgc3RyaW5nIGlzIG5vdCBhbGxvd2VkIChmb3Igbm93IGF0IGxlYXN0KS5cbiAgICAgKiAtIEVtcHR5IHNlZ21lbnRzIHdpdGhpbiB0aGUgc3RyaW5nIChlLmcuIGlmIHRoZXJlIGFyZSB0d28gY29uc2VjdXRpdmVcbiAgICAgKiAgIHNlcGFyYXRvcnMpIGFyZSBub3QgYWxsb3dlZC5cbiAgICAgKlxuICAgICAqIFRPRE8oYi8zNzI0NDE1Nyk6IHdlIHNob3VsZCBtYWtlIHRoaXMgbW9yZSBzdHJpY3QuIFJpZ2h0IG5vdywgaXQgYWxsb3dzXG4gICAgICogbm9uLWlkZW50aWZpZXIgcGF0aCBjb21wb25lbnRzLCBldmVuIGlmIHRoZXkgYXJlbid0IGVzY2FwZWQuXG4gICAgICovICAgIHN0YXRpYyBmcm9tU2VydmVyRm9ybWF0KHQpIHtcbiAgICAgICAgY29uc3QgZSA9IFtdO1xuICAgICAgICBsZXQgbiA9IFwiXCIsIHMgPSAwO1xuICAgICAgICBjb25zdCBpID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKDAgPT09IG4ubGVuZ3RoKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIGBJbnZhbGlkIGZpZWxkIHBhdGggKCR7dH0pLiBQYXRocyBtdXN0IG5vdCBiZSBlbXB0eSwgYmVnaW4gd2l0aCAnLicsIGVuZCB3aXRoICcuJywgb3IgY29udGFpbiAnLi4nYCk7XG4gICAgICAgICAgICBlLnB1c2gobiksIG4gPSBcIlwiO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgciA9ICExO1xuICAgICAgICBmb3IgKDtzIDwgdC5sZW5ndGg7ICkge1xuICAgICAgICAgICAgY29uc3QgZSA9IHRbc107XG4gICAgICAgICAgICBpZiAoXCJcXFxcXCIgPT09IGUpIHtcbiAgICAgICAgICAgICAgICBpZiAocyArIDEgPT09IHQubGVuZ3RoKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIFwiUGF0aCBoYXMgdHJhaWxpbmcgZXNjYXBlIGNoYXJhY3RlcjogXCIgKyB0KTtcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gdFtzICsgMV07XG4gICAgICAgICAgICAgICAgaWYgKFwiXFxcXFwiICE9PSBlICYmIFwiLlwiICE9PSBlICYmIFwiYFwiICE9PSBlKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIFwiUGF0aCBoYXMgaW52YWxpZCBlc2NhcGUgc2VxdWVuY2U6IFwiICsgdCk7XG4gICAgICAgICAgICAgICAgbiArPSBlLCBzICs9IDI7XG4gICAgICAgICAgICB9IGVsc2UgXCJgXCIgPT09IGUgPyAociA9ICFyLCBzKyspIDogXCIuXCIgIT09IGUgfHwgciA/IChuICs9IGUsIHMrKykgOiAoaSgpLCBzKyspO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpKCksIHIpIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgXCJVbnRlcm1pbmF0ZWQgYCBpbiBwYXRoOiBcIiArIHQpO1xuICAgICAgICByZXR1cm4gbmV3IG10KGUpO1xuICAgIH1cbiAgICBzdGF0aWMgZW1wdHlQYXRoKCkge1xuICAgICAgICByZXR1cm4gbmV3IG10KFtdKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFByb3ZpZGVzIGEgc2V0IG9mIGZpZWxkcyB0aGF0IGNhbiBiZSB1c2VkIHRvIHBhcnRpYWxseSBwYXRjaCBhIGRvY3VtZW50LlxuICogRmllbGRNYXNrIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBPYmplY3RWYWx1ZS5cbiAqIEV4YW1wbGVzOlxuICogICBmb28gLSBPdmVyd3JpdGVzIGZvbyBlbnRpcmVseSB3aXRoIHRoZSBwcm92aWRlZCB2YWx1ZS4gSWYgZm9vIGlzIG5vdFxuICogICAgICAgICBwcmVzZW50IGluIHRoZSBjb21wYW5pb24gT2JqZWN0VmFsdWUsIHRoZSBmaWVsZCBpcyBkZWxldGVkLlxuICogICBmb28uYmFyIC0gT3ZlcndyaXRlcyBvbmx5IHRoZSBmaWVsZCBiYXIgb2YgdGhlIG9iamVjdCBmb28uXG4gKiAgICAgICAgICAgICBJZiBmb28gaXMgbm90IGFuIG9iamVjdCwgZm9vIGlzIHJlcGxhY2VkIHdpdGggYW4gb2JqZWN0XG4gKiAgICAgICAgICAgICBjb250YWluaW5nIGZvb1xuICovIGNsYXNzIGd0IHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMuZmllbGRzID0gdCwgXG4gICAgICAgIC8vIFRPRE8oZGltb25kKTogdmFsaWRhdGlvbiBvZiBGaWVsZE1hc2tcbiAgICAgICAgLy8gU29ydCB0aGUgZmllbGQgbWFzayB0byBzdXBwb3J0IGBGaWVsZE1hc2suaXNFcXVhbCgpYCBhbmQgYXNzZXJ0IGJlbG93LlxuICAgICAgICB0LnNvcnQobXQuY29tcGFyYXRvcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFZlcmlmaWVzIHRoYXQgYGZpZWxkUGF0aGAgaXMgaW5jbHVkZWQgYnkgYXQgbGVhc3Qgb25lIGZpZWxkIGluIHRoaXMgZmllbGRcbiAgICAgKiBtYXNrLlxuICAgICAqXG4gICAgICogVGhpcyBpcyBhbiBPKG4pIG9wZXJhdGlvbiwgd2hlcmUgYG5gIGlzIHRoZSBzaXplIG9mIHRoZSBmaWVsZCBtYXNrLlxuICAgICAqLyAgICBjb3ZlcnModCkge1xuICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdGhpcy5maWVsZHMpIGlmIChlLmlzUHJlZml4T2YodCkpIHJldHVybiAhMDtcbiAgICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIG90KHRoaXMuZmllbGRzLCB0LmZpZWxkcywgKCh0LCBlKSA9PiB0LmlzRXF1YWwoZSkpKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogQ29udmVydHMgYSBCYXNlNjQgZW5jb2RlZCBzdHJpbmcgdG8gYSBiaW5hcnkgc3RyaW5nLiAqL1xuLyoqIFRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIEJhc2U2NCBjb252ZXJzaW9uIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlLiAqL1xuZnVuY3Rpb24geXQoKSB7XG4gICAgcmV0dXJuIFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIGF0b2I7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEltbXV0YWJsZSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgYSBcInByb3RvXCIgYnl0ZSBzdHJpbmcuXG4gKlxuICogUHJvdG8gYnl0ZSBzdHJpbmdzIGNhbiBlaXRoZXIgYmUgQmFzZTY0LWVuY29kZWQgc3RyaW5ncyBvciBVaW50OEFycmF5cyB3aGVuXG4gKiBzZW50IG9uIHRoZSB3aXJlLiBUaGlzIGNsYXNzIGFic3RyYWN0cyBhd2F5IHRoaXMgZGlmZmVyZW50aWF0aW9uIGJ5IGhvbGRpbmdcbiAqIHRoZSBwcm90byBieXRlIHN0cmluZyBpbiBhIGNvbW1vbiBjbGFzcyB0aGF0IG11c3QgYmUgY29udmVydGVkIGludG8gYSBzdHJpbmdcbiAqIGJlZm9yZSBiZWluZyBzZW50IGFzIGEgcHJvdG8uXG4gKiBAaW50ZXJuYWxcbiAqLyBjbGFzcyBwdCB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLmJpbmFyeVN0cmluZyA9IHQ7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tQmFzZTY0U3RyaW5nKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IGF0b2IodCk7XG4gICAgICAgIHJldHVybiBuZXcgcHQoZSk7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tVWludDhBcnJheSh0KSB7XG4gICAgICAgIC8vIFRPRE8oaW5kZXhpbmcpOyBSZW1vdmUgdGhlIGNvcHkgb2YgdGhlIGJ5dGUgc3RyaW5nIGhlcmUgYXMgdGhpcyBtZXRob2RcbiAgICAgICAgLy8gaXMgZnJlcXVlbnRseSBjYWxsZWQgZHVyaW5nIGluZGV4aW5nLlxuICAgICAgICBjb25zdCBlID0gXG4gICAgICAgIC8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGNvbnZlcnQgYW4gVWludDhhcnJheSB0byBhIGJpbmFyeSBzdHJpbmcuXG4gKi9cbiAgICAgICAgZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgbGV0IGUgPSBcIlwiO1xuICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCB0Lmxlbmd0aDsgKytuKSBlICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodFtuXSk7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBjb252ZXJ0IGEgYmluYXJ5IHN0cmluZyB0byBhbiBVaW50OEFycmF5LlxuICovICh0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBwdChlKTtcbiAgICB9XG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIGxldCB0ID0gMDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHQgPCB0aGlzLmJpbmFyeVN0cmluZy5sZW5ndGggPyB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuYmluYXJ5U3RyaW5nLmNoYXJDb2RlQXQodCsrKSxcbiAgICAgICAgICAgICAgICBkb25lOiAhMVxuICAgICAgICAgICAgfSA6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogdm9pZCAwLFxuICAgICAgICAgICAgICAgIGRvbmU6ICEwXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIHRvQmFzZTY0KCkge1xuICAgICAgICByZXR1cm4gdCA9IHRoaXMuYmluYXJ5U3RyaW5nLCBidG9hKHQpO1xuICAgICAgICAvKiogQ29udmVydHMgYSBiaW5hcnkgc3RyaW5nIHRvIGEgQmFzZTY0IGVuY29kZWQgc3RyaW5nLiAqL1xuICAgICAgICB2YXIgdDtcbiAgICB9XG4gICAgdG9VaW50OEFycmF5KCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBVaW50OEFycmF5KHQubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdC5sZW5ndGg7IG4rKykgZVtuXSA9IHQuY2hhckNvZGVBdChuKTtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4gICAgICAgIC8vIEEgUmVnRXhwIG1hdGNoaW5nIElTTyA4NjAxIFVUQyB0aW1lc3RhbXBzIHdpdGggb3B0aW9uYWwgZnJhY3Rpb24uXG4gICAgICAgICh0aGlzLmJpbmFyeVN0cmluZyk7XG4gICAgfVxuICAgIGFwcHJveGltYXRlQnl0ZVNpemUoKSB7XG4gICAgICAgIHJldHVybiAyICogdGhpcy5iaW5hcnlTdHJpbmcubGVuZ3RoO1xuICAgIH1cbiAgICBjb21wYXJlVG8odCkge1xuICAgICAgICByZXR1cm4gcnQodGhpcy5iaW5hcnlTdHJpbmcsIHQuYmluYXJ5U3RyaW5nKTtcbiAgICB9XG4gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbmFyeVN0cmluZyA9PT0gdC5iaW5hcnlTdHJpbmc7XG4gICAgfVxufVxuXG5wdC5FTVBUWV9CWVRFX1NUUklORyA9IG5ldyBwdChcIlwiKTtcblxuY29uc3QgSXQgPSBuZXcgUmVnRXhwKC9eXFxkezR9LVxcZFxcZC1cXGRcXGRUXFxkXFxkOlxcZFxcZDpcXGRcXGQoPzpcXC4oXFxkKykpP1okLyk7XG5cbi8qKlxuICogQ29udmVydHMgdGhlIHBvc3NpYmxlIFByb3RvIHZhbHVlcyBmb3IgYSB0aW1lc3RhbXAgdmFsdWUgaW50byBhIFwic2Vjb25kcyBhbmRcbiAqIG5hbm9zXCIgcmVwcmVzZW50YXRpb24uXG4gKi8gZnVuY3Rpb24gVHQodCkge1xuICAgIC8vIFRoZSBqc29uIGludGVyZmFjZSAoZm9yIHRoZSBicm93c2VyKSB3aWxsIHJldHVybiBhbiBpc28gdGltZXN0YW1wIHN0cmluZyxcbiAgICAvLyB3aGlsZSB0aGUgcHJvdG8ganMgbGlicmFyeSAoZm9yIG5vZGUpIHdpbGwgcmV0dXJuIGFcbiAgICAvLyBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wIGluc3RhbmNlLlxuICAgIGlmIChxKCEhdCksIFwic3RyaW5nXCIgPT0gdHlwZW9mIHQpIHtcbiAgICAgICAgLy8gVGhlIGRhdGUgc3RyaW5nIGNhbiBoYXZlIGhpZ2hlciBwcmVjaXNpb24gKG5hbm9zKSB0aGFuIHRoZSBEYXRlIGNsYXNzXG4gICAgICAgIC8vIChtaWxsaXMpLCBzbyB3ZSBkbyBzb21lIGN1c3RvbSBwYXJzaW5nIGhlcmUuXG4gICAgICAgIC8vIFBhcnNlIHRoZSBuYW5vcyByaWdodCBvdXQgb2YgdGhlIHN0cmluZy5cbiAgICAgICAgbGV0IGUgPSAwO1xuICAgICAgICBjb25zdCBuID0gSXQuZXhlYyh0KTtcbiAgICAgICAgaWYgKHEoISFuKSwgblsxXSkge1xuICAgICAgICAgICAgLy8gUGFkIHRoZSBmcmFjdGlvbiBvdXQgdG8gOSBkaWdpdHMgKG5hbm9zKS5cbiAgICAgICAgICAgIGxldCB0ID0gblsxXTtcbiAgICAgICAgICAgIHQgPSAodCArIFwiMDAwMDAwMDAwXCIpLnN1YnN0cigwLCA5KSwgZSA9IE51bWJlcih0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQYXJzZSB0aGUgZGF0ZSB0byBnZXQgdGhlIHNlY29uZHMuXG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IG5ldyBEYXRlKHQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2Vjb25kczogTWF0aC5mbG9vcihzLmdldFRpbWUoKSAvIDFlMyksXG4gICAgICAgICAgICBuYW5vczogZVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBzZWNvbmRzOiBFdCh0LnNlY29uZHMpLFxuICAgICAgICBuYW5vczogRXQodC5uYW5vcylcbiAgICB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBwb3NzaWJsZSBQcm90byB0eXBlcyBmb3IgbnVtYmVycyBpbnRvIGEgSmF2YVNjcmlwdCBudW1iZXIuXG4gKiBSZXR1cm5zIDAgaWYgdGhlIHZhbHVlIGlzIG5vdCBudW1lcmljLlxuICovIGZ1bmN0aW9uIEV0KHQpIHtcbiAgICAvLyBUT0RPKGJqb3JuaWNrKTogSGFuZGxlIGludDY0IGdyZWF0ZXIgdGhhbiA1MyBiaXRzLlxuICAgIHJldHVybiBcIm51bWJlclwiID09IHR5cGVvZiB0ID8gdCA6IFwic3RyaW5nXCIgPT0gdHlwZW9mIHQgPyBOdW1iZXIodCkgOiAwO1xufVxuXG4vKiogQ29udmVydHMgdGhlIHBvc3NpYmxlIFByb3RvIHR5cGVzIGZvciBCbG9icyBpbnRvIGEgQnl0ZVN0cmluZy4gKi8gZnVuY3Rpb24gQXQodCkge1xuICAgIHJldHVybiBcInN0cmluZ1wiID09IHR5cGVvZiB0ID8gcHQuZnJvbUJhc2U2NFN0cmluZyh0KSA6IHB0LmZyb21VaW50OEFycmF5KHQpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgbG9jYWxseS1hcHBsaWVkIFNlcnZlclRpbWVzdGFtcC5cbiAqXG4gKiBTZXJ2ZXIgVGltZXN0YW1wcyBhcmUgYmFja2VkIGJ5IE1hcFZhbHVlcyB0aGF0IGNvbnRhaW4gYW4gaW50ZXJuYWwgZmllbGRcbiAqIGBfX3R5cGVfX2Agd2l0aCBhIHZhbHVlIG9mIGBzZXJ2ZXJfdGltZXN0YW1wYC4gVGhlIHByZXZpb3VzIHZhbHVlIGFuZCBsb2NhbFxuICogd3JpdGUgdGltZSBhcmUgc3RvcmVkIGluIGl0cyBgX19wcmV2aW91c192YWx1ZV9fYCBhbmQgYF9fbG9jYWxfd3JpdGVfdGltZV9fYFxuICogZmllbGRzIHJlc3BlY3RpdmVseS5cbiAqXG4gKiBOb3RlczpcbiAqIC0gU2VydmVyVGltZXN0YW1wVmFsdWUgaW5zdGFuY2VzIGFyZSBjcmVhdGVkIGFzIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgYVxuICogICB0cmFuc2Zvcm0uIFRoZXkgY2FuIG9ubHkgZXhpc3QgaW4gdGhlIGxvY2FsIHZpZXcgb2YgYSBkb2N1bWVudC4gVGhlcmVmb3JlXG4gKiAgIHRoZXkgZG8gbm90IG5lZWQgdG8gYmUgcGFyc2VkIG9yIHNlcmlhbGl6ZWQuXG4gKiAtIFdoZW4gZXZhbHVhdGVkIGxvY2FsbHkgKGUuZy4gZm9yIHNuYXBzaG90LmRhdGEoKSksIHRoZXkgYnkgZGVmYXVsdFxuICogICBldmFsdWF0ZSB0byBgbnVsbGAuIFRoaXMgYmVoYXZpb3IgY2FuIGJlIGNvbmZpZ3VyZWQgYnkgcGFzc2luZyBjdXN0b21cbiAqICAgRmllbGRWYWx1ZU9wdGlvbnMgdG8gdmFsdWUoKS5cbiAqIC0gV2l0aCByZXNwZWN0IHRvIG90aGVyIFNlcnZlclRpbWVzdGFtcFZhbHVlcywgdGhleSBzb3J0IGJ5IHRoZWlyXG4gKiAgIGxvY2FsV3JpdGVUaW1lLlxuICovIGZ1bmN0aW9uIFJ0KHQpIHtcbiAgICB2YXIgZSwgbjtcbiAgICByZXR1cm4gXCJzZXJ2ZXJfdGltZXN0YW1wXCIgPT09IChudWxsID09PSAobiA9ICgobnVsbCA9PT0gKGUgPSBudWxsID09IHQgPyB2b2lkIDAgOiB0Lm1hcFZhbHVlKSB8fCB2b2lkIDAgPT09IGUgPyB2b2lkIDAgOiBlLmZpZWxkcykgfHwge30pLl9fdHlwZV9fKSB8fCB2b2lkIDAgPT09IG4gPyB2b2lkIDAgOiBuLnN0cmluZ1ZhbHVlKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFNlcnZlclRpbWVzdGFtcCBwcm90byB2YWx1ZSAodXNpbmcgdGhlIGludGVybmFsIGZvcm1hdCkuXG4gKi9cbi8qKlxuICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIGJlZm9yZSB0aGlzIFNlcnZlclRpbWVzdGFtcCB3YXMgc2V0LlxuICpcbiAqIFByZXNlcnZpbmcgdGhlIHByZXZpb3VzIHZhbHVlcyBhbGxvd3MgdGhlIHVzZXIgdG8gZGlzcGxheSB0aGUgbGFzdCByZXNvbGVkXG4gKiB2YWx1ZSB1bnRpbCB0aGUgYmFja2VuZCByZXNwb25kcyB3aXRoIHRoZSB0aW1lc3RhbXAuXG4gKi9cbmZ1bmN0aW9uIGJ0KHQpIHtcbiAgICBjb25zdCBlID0gdC5tYXBWYWx1ZS5maWVsZHMuX19wcmV2aW91c192YWx1ZV9fO1xuICAgIHJldHVybiBSdChlKSA/IGJ0KGUpIDogZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsb2NhbCB0aW1lIGF0IHdoaWNoIHRoaXMgdGltZXN0YW1wIHdhcyBmaXJzdCBzZXQuXG4gKi8gZnVuY3Rpb24gUHQodCkge1xuICAgIGNvbnN0IGUgPSBUdCh0Lm1hcFZhbHVlLmZpZWxkcy5fX2xvY2FsX3dyaXRlX3RpbWVfXy50aW1lc3RhbXBWYWx1ZSk7XG4gICAgcmV0dXJuIG5ldyB1dChlLnNlY29uZHMsIGUubmFub3MpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjbGFzcyBWdCB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIERhdGFiYXNlSW5mbyB1c2luZyB0aGUgcHJvdmlkZWQgaG9zdCwgZGF0YWJhc2VJZCBhbmRcbiAgICAgKiBwZXJzaXN0ZW5jZUtleS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRhYmFzZUlkIC0gVGhlIGRhdGFiYXNlIHRvIHVzZS5cbiAgICAgKiBAcGFyYW0gYXBwSWQgLSBUaGUgRmlyZWJhc2UgQXBwIElkLlxuICAgICAqIEBwYXJhbSBwZXJzaXN0ZW5jZUtleSAtIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgRmlyZXN0b3JlJ3MgbG9jYWxcbiAgICAgKiBzdG9yYWdlICh1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGRhdGFiYXNlSWQpLlxuICAgICAqIEBwYXJhbSBob3N0IC0gVGhlIEZpcmVzdG9yZSBiYWNrZW5kIGhvc3QgdG8gY29ubmVjdCB0by5cbiAgICAgKiBAcGFyYW0gc3NsIC0gV2hldGhlciB0byB1c2UgU1NMIHdoZW4gY29ubmVjdGluZy5cbiAgICAgKiBAcGFyYW0gZm9yY2VMb25nUG9sbGluZyAtIFdoZXRoZXIgdG8gdXNlIHRoZSBmb3JjZUxvbmdQb2xsaW5nIG9wdGlvblxuICAgICAqIHdoZW4gdXNpbmcgV2ViQ2hhbm5lbCBhcyB0aGUgbmV0d29yayB0cmFuc3BvcnQuXG4gICAgICogQHBhcmFtIGF1dG9EZXRlY3RMb25nUG9sbGluZyAtIFdoZXRoZXIgdG8gdXNlIHRoZSBkZXRlY3RCdWZmZXJpbmdQcm94eVxuICAgICAqIG9wdGlvbiB3aGVuIHVzaW5nIFdlYkNoYW5uZWwgYXMgdGhlIG5ldHdvcmsgdHJhbnNwb3J0LlxuICAgICAqIEBwYXJhbSB1c2VGZXRjaFN0cmVhbXMgV2hldGhlciB0byB1c2UgdGhlIEZldGNoIEFQSSBpbnN0ZWFkIG9mXG4gICAgICogWE1MSFRUUFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuLCBzLCBpLCByLCBvLCBhKSB7XG4gICAgICAgIHRoaXMuZGF0YWJhc2VJZCA9IHQsIHRoaXMuYXBwSWQgPSBlLCB0aGlzLnBlcnNpc3RlbmNlS2V5ID0gbiwgdGhpcy5ob3N0ID0gcywgdGhpcy5zc2wgPSBpLCBcbiAgICAgICAgdGhpcy5mb3JjZUxvbmdQb2xsaW5nID0gciwgdGhpcy5hdXRvRGV0ZWN0TG9uZ1BvbGxpbmcgPSBvLCB0aGlzLnVzZUZldGNoU3RyZWFtcyA9IGE7XG4gICAgfVxufVxuXG4vKiogVGhlIGRlZmF1bHQgZGF0YWJhc2UgbmFtZSBmb3IgYSBwcm9qZWN0LiAqL1xuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBkYXRhYmFzZSBJRCBhIEZpcmVzdG9yZSBjbGllbnQgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICogQGludGVybmFsXG4gKi9cbmNsYXNzIHZ0IHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMucHJvamVjdElkID0gdCwgdGhpcy5kYXRhYmFzZSA9IGUgfHwgXCIoZGVmYXVsdClcIjtcbiAgICB9XG4gICAgc3RhdGljIGVtcHR5KCkge1xuICAgICAgICByZXR1cm4gbmV3IHZ0KFwiXCIsIFwiXCIpO1xuICAgIH1cbiAgICBnZXQgaXNEZWZhdWx0RGF0YWJhc2UoKSB7XG4gICAgICAgIHJldHVybiBcIihkZWZhdWx0KVwiID09PSB0aGlzLmRhdGFiYXNlO1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgaW5zdGFuY2VvZiB2dCAmJiB0LnByb2plY3RJZCA9PT0gdGhpcy5wcm9qZWN0SWQgJiYgdC5kYXRhYmFzZSA9PT0gdGhpcy5kYXRhYmFzZTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogU2VudGluZWwgdmFsdWUgdGhhdCBzb3J0cyBiZWZvcmUgYW55IE11dGF0aW9uIEJhdGNoIElELiAqL1xuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgYSB2YXJpYWJsZSBpcyBlaXRoZXIgdW5kZWZpbmVkIG9yIG51bGwuXG4gKi9cbmZ1bmN0aW9uIFN0KHQpIHtcbiAgICByZXR1cm4gbnVsbCA9PSB0O1xufVxuXG4vKiogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSByZXByZXNlbnRzIC0wLiAqLyBmdW5jdGlvbiBEdCh0KSB7XG4gICAgLy8gRGV0ZWN0IGlmIHRoZSB2YWx1ZSBpcyAtMC4wLiBCYXNlZCBvbiBwb2x5ZmlsbCBmcm9tXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzXG4gICAgcmV0dXJuIDAgPT09IHQgJiYgMSAvIHQgPT0gLTEgLyAwO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBhIHZhbHVlIGlzIGFuIGludGVnZXIgYW5kIGluIHRoZSBzYWZlIGludGVnZXIgcmFuZ2VcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB0ZXN0IGZvciBiZWluZyBhbiBpbnRlZ2VyIGFuZCBpbiB0aGUgc2FmZSByYW5nZVxuICovIGZ1bmN0aW9uIEN0KHQpIHtcbiAgICByZXR1cm4gXCJudW1iZXJcIiA9PSB0eXBlb2YgdCAmJiBOdW1iZXIuaXNJbnRlZ2VyKHQpICYmICFEdCh0KSAmJiB0IDw9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSICYmIHQgPj0gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVI7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBpbnRlcm5hbFxuICovIGNsYXNzIHh0IHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMucGF0aCA9IHQ7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tUGF0aCh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgeHQoX3QuZnJvbVN0cmluZyh0KSk7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tTmFtZSh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgeHQoX3QuZnJvbVN0cmluZyh0KS5wb3BGaXJzdCg1KSk7XG4gICAgfVxuICAgIHN0YXRpYyBlbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB4dChfdC5lbXB0eVBhdGgoKSk7XG4gICAgfVxuICAgIGdldCBjb2xsZWN0aW9uR3JvdXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhdGgucG9wTGFzdCgpLmxhc3RTZWdtZW50KCk7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRvY3VtZW50IGlzIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbklkLiAqLyAgICBoYXNDb2xsZWN0aW9uSWQodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXRoLmxlbmd0aCA+PSAyICYmIHRoaXMucGF0aC5nZXQodGhpcy5wYXRoLmxlbmd0aCAtIDIpID09PSB0O1xuICAgIH1cbiAgICAvKiogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBncm91cCAoaS5lLiB0aGUgbmFtZSBvZiB0aGUgcGFyZW50IGNvbGxlY3Rpb24pIGZvciB0aGlzIGtleS4gKi8gICAgZ2V0Q29sbGVjdGlvbkdyb3VwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXRoLmdldCh0aGlzLnBhdGgubGVuZ3RoIC0gMik7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIHRoZSBmdWxseSBxdWFsaWZpZWQgcGF0aCB0byB0aGUgcGFyZW50IGNvbGxlY3Rpb24uICovICAgIGdldENvbGxlY3Rpb25QYXRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXRoLnBvcExhc3QoKTtcbiAgICB9XG4gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIHJldHVybiBudWxsICE9PSB0ICYmIDAgPT09IF90LmNvbXBhcmF0b3IodGhpcy5wYXRoLCB0LnBhdGgpO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGF0aC50b1N0cmluZygpO1xuICAgIH1cbiAgICBzdGF0aWMgY29tcGFyYXRvcih0LCBlKSB7XG4gICAgICAgIHJldHVybiBfdC5jb21wYXJhdG9yKHQucGF0aCwgZS5wYXRoKTtcbiAgICB9XG4gICAgc3RhdGljIGlzRG9jdW1lbnRLZXkodCkge1xuICAgICAgICByZXR1cm4gdC5sZW5ndGggJSAyID09IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgZG9jdW1lbnQga2V5IHdpdGggdGhlIGdpdmVuIHNlZ21lbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNlZ21lbnRzIC0gVGhlIHNlZ21lbnRzIG9mIHRoZSBwYXRoIHRvIHRoZSBkb2N1bWVudFxuICAgICAqIEByZXR1cm5zIEEgbmV3IGluc3RhbmNlIG9mIERvY3VtZW50S2V5XG4gICAgICovICAgIHN0YXRpYyBmcm9tU2VnbWVudHModCkge1xuICAgICAgICByZXR1cm4gbmV3IHh0KG5ldyBfdCh0LnNsaWNlKCkpKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGNvbnN0IE50ID0ge1xuICAgIG1hcFZhbHVlOiB7XG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgX190eXBlX186IHtcbiAgICAgICAgICAgICAgICBzdHJpbmdWYWx1ZTogXCJfX21heF9fXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0sIGt0ID0ge1xuICAgIG51bGxWYWx1ZTogXCJOVUxMX1ZBTFVFXCJcbn07XG5cbi8qKiBFeHRyYWN0cyB0aGUgYmFja2VuZCdzIHR5cGUgb3JkZXIgZm9yIHRoZSBwcm92aWRlZCB2YWx1ZS4gKi9cbmZ1bmN0aW9uIE10KHQpIHtcbiAgICByZXR1cm4gXCJudWxsVmFsdWVcIiBpbiB0ID8gMCAvKiBOdWxsVmFsdWUgKi8gOiBcImJvb2xlYW5WYWx1ZVwiIGluIHQgPyAxIC8qIEJvb2xlYW5WYWx1ZSAqLyA6IFwiaW50ZWdlclZhbHVlXCIgaW4gdCB8fCBcImRvdWJsZVZhbHVlXCIgaW4gdCA/IDIgLyogTnVtYmVyVmFsdWUgKi8gOiBcInRpbWVzdGFtcFZhbHVlXCIgaW4gdCA/IDMgLyogVGltZXN0YW1wVmFsdWUgKi8gOiBcInN0cmluZ1ZhbHVlXCIgaW4gdCA/IDUgLyogU3RyaW5nVmFsdWUgKi8gOiBcImJ5dGVzVmFsdWVcIiBpbiB0ID8gNiAvKiBCbG9iVmFsdWUgKi8gOiBcInJlZmVyZW5jZVZhbHVlXCIgaW4gdCA/IDcgLyogUmVmVmFsdWUgKi8gOiBcImdlb1BvaW50VmFsdWVcIiBpbiB0ID8gOCAvKiBHZW9Qb2ludFZhbHVlICovIDogXCJhcnJheVZhbHVlXCIgaW4gdCA/IDkgLyogQXJyYXlWYWx1ZSAqLyA6IFwibWFwVmFsdWVcIiBpbiB0ID8gUnQodCkgPyA0IC8qIFNlcnZlclRpbWVzdGFtcFZhbHVlICovIDogSHQodCkgPyA5IC8qIEFycmF5VmFsdWUgKi8gOiAxMCAvKiBPYmplY3RWYWx1ZSAqLyA6IEwoKTtcbn1cblxuLyoqIFRlc3RzIGBsZWZ0YCBhbmQgYHJpZ2h0YCBmb3IgZXF1YWxpdHkgYmFzZWQgb24gdGhlIGJhY2tlbmQgc2VtYW50aWNzLiAqLyBmdW5jdGlvbiBPdCh0LCBlKSB7XG4gICAgaWYgKHQgPT09IGUpIHJldHVybiAhMDtcbiAgICBjb25zdCBuID0gTXQodCk7XG4gICAgaWYgKG4gIT09IE10KGUpKSByZXR1cm4gITE7XG4gICAgc3dpdGNoIChuKSB7XG4gICAgICBjYXNlIDAgLyogTnVsbFZhbHVlICovIDpcbiAgICAgIGNhc2UgOTAwNzE5OTI1NDc0MDk5MSAvKiBNYXhWYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiAhMDtcblxuICAgICAgY2FzZSAxIC8qIEJvb2xlYW5WYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiB0LmJvb2xlYW5WYWx1ZSA9PT0gZS5ib29sZWFuVmFsdWU7XG5cbiAgICAgIGNhc2UgNCAvKiBTZXJ2ZXJUaW1lc3RhbXBWYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiBQdCh0KS5pc0VxdWFsKFB0KGUpKTtcblxuICAgICAgY2FzZSAzIC8qIFRpbWVzdGFtcFZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiB0LnRpbWVzdGFtcFZhbHVlICYmIFwic3RyaW5nXCIgPT0gdHlwZW9mIGUudGltZXN0YW1wVmFsdWUgJiYgdC50aW1lc3RhbXBWYWx1ZS5sZW5ndGggPT09IGUudGltZXN0YW1wVmFsdWUubGVuZ3RoKSBcbiAgICAgICAgICAgIC8vIFVzZSBzdHJpbmcgZXF1YWxpdHkgZm9yIElTTyA4NjAxIHRpbWVzdGFtcHNcbiAgICAgICAgICAgIHJldHVybiB0LnRpbWVzdGFtcFZhbHVlID09PSBlLnRpbWVzdGFtcFZhbHVlO1xuICAgICAgICAgICAgY29uc3QgbiA9IFR0KHQudGltZXN0YW1wVmFsdWUpLCBzID0gVHQoZS50aW1lc3RhbXBWYWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gbi5zZWNvbmRzID09PSBzLnNlY29uZHMgJiYgbi5uYW5vcyA9PT0gcy5uYW5vcztcbiAgICAgICAgfSh0LCBlKTtcblxuICAgICAgY2FzZSA1IC8qIFN0cmluZ1ZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIHQuc3RyaW5nVmFsdWUgPT09IGUuc3RyaW5nVmFsdWU7XG5cbiAgICAgIGNhc2UgNiAvKiBCbG9iVmFsdWUgKi8gOlxuICAgICAgICByZXR1cm4gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgcmV0dXJuIEF0KHQuYnl0ZXNWYWx1ZSkuaXNFcXVhbChBdChlLmJ5dGVzVmFsdWUpKTtcbiAgICAgICAgfSh0LCBlKTtcblxuICAgICAgY2FzZSA3IC8qIFJlZlZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIHQucmVmZXJlbmNlVmFsdWUgPT09IGUucmVmZXJlbmNlVmFsdWU7XG5cbiAgICAgIGNhc2UgOCAvKiBHZW9Qb2ludFZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIHJldHVybiBFdCh0Lmdlb1BvaW50VmFsdWUubGF0aXR1ZGUpID09PSBFdChlLmdlb1BvaW50VmFsdWUubGF0aXR1ZGUpICYmIEV0KHQuZ2VvUG9pbnRWYWx1ZS5sb25naXR1ZGUpID09PSBFdChlLmdlb1BvaW50VmFsdWUubG9uZ2l0dWRlKTtcbiAgICAgICAgfSh0LCBlKTtcblxuICAgICAgY2FzZSAyIC8qIE51bWJlclZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGlmIChcImludGVnZXJWYWx1ZVwiIGluIHQgJiYgXCJpbnRlZ2VyVmFsdWVcIiBpbiBlKSByZXR1cm4gRXQodC5pbnRlZ2VyVmFsdWUpID09PSBFdChlLmludGVnZXJWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoXCJkb3VibGVWYWx1ZVwiIGluIHQgJiYgXCJkb3VibGVWYWx1ZVwiIGluIGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuID0gRXQodC5kb3VibGVWYWx1ZSksIHMgPSBFdChlLmRvdWJsZVZhbHVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbiA9PT0gcyA/IER0KG4pID09PSBEdChzKSA6IGlzTmFOKG4pICYmIGlzTmFOKHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICB9KHQsIGUpO1xuXG4gICAgICBjYXNlIDkgLyogQXJyYXlWYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiBvdCh0LmFycmF5VmFsdWUudmFsdWVzIHx8IFtdLCBlLmFycmF5VmFsdWUudmFsdWVzIHx8IFtdLCBPdCk7XG5cbiAgICAgIGNhc2UgMTAgLyogT2JqZWN0VmFsdWUgKi8gOlxuICAgICAgICByZXR1cm4gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHQubWFwVmFsdWUuZmllbGRzIHx8IHt9LCBzID0gZS5tYXBWYWx1ZS5maWVsZHMgfHwge307XG4gICAgICAgICAgICBpZiAoaHQobikgIT09IGh0KHMpKSByZXR1cm4gITE7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgaW4gbikgaWYgKG4uaGFzT3duUHJvcGVydHkodCkgJiYgKHZvaWQgMCA9PT0gc1t0XSB8fCAhT3Qoblt0XSwgc1t0XSkpKSByZXR1cm4gITE7XG4gICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQXJyYXlWYWx1ZSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuICovICh0LCBlKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIEwoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uICR0KHQsIGUpIHtcbiAgICByZXR1cm4gdm9pZCAwICE9PSAodC52YWx1ZXMgfHwgW10pLmZpbmQoKHQgPT4gT3QodCwgZSkpKTtcbn1cblxuZnVuY3Rpb24gRnQodCwgZSkge1xuICAgIGlmICh0ID09PSBlKSByZXR1cm4gMDtcbiAgICBjb25zdCBuID0gTXQodCksIHMgPSBNdChlKTtcbiAgICBpZiAobiAhPT0gcykgcmV0dXJuIHJ0KG4sIHMpO1xuICAgIHN3aXRjaCAobikge1xuICAgICAgY2FzZSAwIC8qIE51bGxWYWx1ZSAqLyA6XG4gICAgICBjYXNlIDkwMDcxOTkyNTQ3NDA5OTEgLyogTWF4VmFsdWUgKi8gOlxuICAgICAgICByZXR1cm4gMDtcblxuICAgICAgY2FzZSAxIC8qIEJvb2xlYW5WYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiBydCh0LmJvb2xlYW5WYWx1ZSwgZS5ib29sZWFuVmFsdWUpO1xuXG4gICAgICBjYXNlIDIgLyogTnVtYmVyVmFsdWUgKi8gOlxuICAgICAgICByZXR1cm4gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IEV0KHQuaW50ZWdlclZhbHVlIHx8IHQuZG91YmxlVmFsdWUpLCBzID0gRXQoZS5pbnRlZ2VyVmFsdWUgfHwgZS5kb3VibGVWYWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gbiA8IHMgPyAtMSA6IG4gPiBzID8gMSA6IG4gPT09IHMgPyAwIDogXG4gICAgICAgICAgICAvLyBvbmUgb3IgYm90aCBhcmUgTmFOLlxuICAgICAgICAgICAgaXNOYU4obikgPyBpc05hTihzKSA/IDAgOiAtMSA6IDE7XG4gICAgICAgIH0odCwgZSk7XG5cbiAgICAgIGNhc2UgMyAvKiBUaW1lc3RhbXBWYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiBCdCh0LnRpbWVzdGFtcFZhbHVlLCBlLnRpbWVzdGFtcFZhbHVlKTtcblxuICAgICAgY2FzZSA0IC8qIFNlcnZlclRpbWVzdGFtcFZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIEJ0KFB0KHQpLCBQdChlKSk7XG5cbiAgICAgIGNhc2UgNSAvKiBTdHJpbmdWYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiBydCh0LnN0cmluZ1ZhbHVlLCBlLnN0cmluZ1ZhbHVlKTtcblxuICAgICAgY2FzZSA2IC8qIEJsb2JWYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gQXQodCksIHMgPSBBdChlKTtcbiAgICAgICAgICAgIHJldHVybiBuLmNvbXBhcmVUbyhzKTtcbiAgICAgICAgfSh0LmJ5dGVzVmFsdWUsIGUuYnl0ZXNWYWx1ZSk7XG5cbiAgICAgIGNhc2UgNyAvKiBSZWZWYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdC5zcGxpdChcIi9cIiksIHMgPSBlLnNwbGl0KFwiL1wiKTtcbiAgICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgbi5sZW5ndGggJiYgdCA8IHMubGVuZ3RoOyB0KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gcnQoblt0XSwgc1t0XSk7XG4gICAgICAgICAgICAgICAgaWYgKDAgIT09IGUpIHJldHVybiBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJ0KG4ubGVuZ3RoLCBzLmxlbmd0aCk7XG4gICAgICAgIH0odC5yZWZlcmVuY2VWYWx1ZSwgZS5yZWZlcmVuY2VWYWx1ZSk7XG5cbiAgICAgIGNhc2UgOCAvKiBHZW9Qb2ludFZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBydChFdCh0LmxhdGl0dWRlKSwgRXQoZS5sYXRpdHVkZSkpO1xuICAgICAgICAgICAgaWYgKDAgIT09IG4pIHJldHVybiBuO1xuICAgICAgICAgICAgcmV0dXJuIHJ0KEV0KHQubG9uZ2l0dWRlKSwgRXQoZS5sb25naXR1ZGUpKTtcbiAgICAgICAgfSh0Lmdlb1BvaW50VmFsdWUsIGUuZ2VvUG9pbnRWYWx1ZSk7XG5cbiAgICAgIGNhc2UgOSAvKiBBcnJheVZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0LnZhbHVlcyB8fCBbXSwgcyA9IGUudmFsdWVzIHx8IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCBuLmxlbmd0aCAmJiB0IDwgcy5sZW5ndGg7ICsrdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBGdChuW3RdLCBzW3RdKTtcbiAgICAgICAgICAgICAgICBpZiAoZSkgcmV0dXJuIGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcnQobi5sZW5ndGgsIHMubGVuZ3RoKTtcbiAgICAgICAgfSh0LmFycmF5VmFsdWUsIGUuYXJyYXlWYWx1ZSk7XG5cbiAgICAgIGNhc2UgMTAgLyogT2JqZWN0VmFsdWUgKi8gOlxuICAgICAgICByZXR1cm4gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHQuZmllbGRzIHx8IHt9LCBzID0gT2JqZWN0LmtleXMobiksIGkgPSBlLmZpZWxkcyB8fCB7fSwgciA9IE9iamVjdC5rZXlzKGkpO1xuICAgICAgICAgICAgLy8gRXZlbiB0aG91Z2ggTWFwVmFsdWVzIGFyZSBsaWtlbHkgc29ydGVkIGNvcnJlY3RseSBiYXNlZCBvbiB0aGVpciBpbnNlcnRpb25cbiAgICAgICAgICAgIC8vIG9yZGVyIChlLmcuIHdoZW4gcmVjZWl2ZWQgZnJvbSB0aGUgYmFja2VuZCksIGxvY2FsIG1vZGlmaWNhdGlvbnMgY2FuIGJyaW5nXG4gICAgICAgICAgICAvLyBlbGVtZW50cyBvdXQgb2Ygb3JkZXIuIFdlIG5lZWQgdG8gcmUtc29ydCB0aGUgZWxlbWVudHMgdG8gZW5zdXJlIHRoYXRcbiAgICAgICAgICAgIC8vIGNhbm9uaWNhbCBJRHMgYXJlIGluZGVwZW5kZW50IG9mIGluc2VydGlvbiBvcmRlci5cbiAgICAgICAgICAgIHMuc29ydCgpLCByLnNvcnQoKTtcbiAgICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgcy5sZW5ndGggJiYgdCA8IHIubGVuZ3RoOyArK3QpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gcnQoc1t0XSwgclt0XSk7XG4gICAgICAgICAgICAgICAgaWYgKDAgIT09IGUpIHJldHVybiBlO1xuICAgICAgICAgICAgICAgIGNvbnN0IG8gPSBGdChuW3NbdF1dLCBpW3JbdF1dKTtcbiAgICAgICAgICAgICAgICBpZiAoMCAhPT0gbykgcmV0dXJuIG87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcnQocy5sZW5ndGgsIHIubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAqIEdlbmVyYXRlcyB0aGUgY2Fub25pY2FsIElEIGZvciB0aGUgcHJvdmlkZWQgZmllbGQgdmFsdWUgKGFzIHVzZWQgaW4gVGFyZ2V0XG4gKiBzZXJpYWxpemF0aW9uKS5cbiAqLyAodC5tYXBWYWx1ZSwgZS5tYXBWYWx1ZSk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IEwoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIEJ0KHQsIGUpIHtcbiAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCAmJiBcInN0cmluZ1wiID09IHR5cGVvZiBlICYmIHQubGVuZ3RoID09PSBlLmxlbmd0aCkgcmV0dXJuIHJ0KHQsIGUpO1xuICAgIGNvbnN0IG4gPSBUdCh0KSwgcyA9IFR0KGUpLCBpID0gcnQobi5zZWNvbmRzLCBzLnNlY29uZHMpO1xuICAgIHJldHVybiAwICE9PSBpID8gaSA6IHJ0KG4ubmFub3MsIHMubmFub3MpO1xufVxuXG5mdW5jdGlvbiBMdCh0KSB7XG4gICAgcmV0dXJuIHF0KHQpO1xufVxuXG5mdW5jdGlvbiBxdCh0KSB7XG4gICAgcmV0dXJuIFwibnVsbFZhbHVlXCIgaW4gdCA/IFwibnVsbFwiIDogXCJib29sZWFuVmFsdWVcIiBpbiB0ID8gXCJcIiArIHQuYm9vbGVhblZhbHVlIDogXCJpbnRlZ2VyVmFsdWVcIiBpbiB0ID8gXCJcIiArIHQuaW50ZWdlclZhbHVlIDogXCJkb3VibGVWYWx1ZVwiIGluIHQgPyBcIlwiICsgdC5kb3VibGVWYWx1ZSA6IFwidGltZXN0YW1wVmFsdWVcIiBpbiB0ID8gZnVuY3Rpb24odCkge1xuICAgICAgICBjb25zdCBlID0gVHQodCk7XG4gICAgICAgIHJldHVybiBgdGltZSgke2Uuc2Vjb25kc30sJHtlLm5hbm9zfSlgO1xuICAgIH0odC50aW1lc3RhbXBWYWx1ZSkgOiBcInN0cmluZ1ZhbHVlXCIgaW4gdCA/IHQuc3RyaW5nVmFsdWUgOiBcImJ5dGVzVmFsdWVcIiBpbiB0ID8gQXQodC5ieXRlc1ZhbHVlKS50b0Jhc2U2NCgpIDogXCJyZWZlcmVuY2VWYWx1ZVwiIGluIHQgPyAobiA9IHQucmVmZXJlbmNlVmFsdWUsIFxuICAgIHh0LmZyb21OYW1lKG4pLnRvU3RyaW5nKCkpIDogXCJnZW9Qb2ludFZhbHVlXCIgaW4gdCA/IGBnZW8oJHsoZSA9IHQuZ2VvUG9pbnRWYWx1ZSkubGF0aXR1ZGV9LCR7ZS5sb25naXR1ZGV9KWAgOiBcImFycmF5VmFsdWVcIiBpbiB0ID8gZnVuY3Rpb24odCkge1xuICAgICAgICBsZXQgZSA9IFwiW1wiLCBuID0gITA7XG4gICAgICAgIGZvciAoY29uc3QgcyBvZiB0LnZhbHVlcyB8fCBbXSkgbiA/IG4gPSAhMSA6IGUgKz0gXCIsXCIsIGUgKz0gcXQocyk7XG4gICAgICAgIHJldHVybiBlICsgXCJdXCI7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHZhbHVlIGZvciB0aGUgcHJvdmlkZWQgZGF0YWJhc2UgYW5kIGtleS4gKi8gKHQuYXJyYXlWYWx1ZSkgOiBcIm1hcFZhbHVlXCIgaW4gdCA/IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgLy8gSXRlcmF0aW9uIG9yZGVyIGluIEphdmFTY3JpcHQgaXMgbm90IGd1YXJhbnRlZWQuIFRvIGVuc3VyZSB0aGF0IHdlIGdlbmVyYXRlXG4gICAgICAgIC8vIG1hdGNoaW5nIGNhbm9uaWNhbCBJRHMgZm9yIGlkZW50aWNhbCBtYXBzLCB3ZSBuZWVkIHRvIHNvcnQgdGhlIGtleXMuXG4gICAgICAgIGNvbnN0IGUgPSBPYmplY3Qua2V5cyh0LmZpZWxkcyB8fCB7fSkuc29ydCgpO1xuICAgICAgICBsZXQgbiA9IFwie1wiLCBzID0gITA7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiBlKSBzID8gcyA9ICExIDogbiArPSBcIixcIiwgbiArPSBgJHtpfToke3F0KHQuZmllbGRzW2ldKX1gO1xuICAgICAgICByZXR1cm4gbiArIFwifVwiO1xuICAgIH0odC5tYXBWYWx1ZSkgOiBMKCk7XG4gICAgdmFyIGUsIG47XG59XG5cbmZ1bmN0aW9uIFV0KHQsIGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICByZWZlcmVuY2VWYWx1ZTogYHByb2plY3RzLyR7dC5wcm9qZWN0SWR9L2RhdGFiYXNlcy8ke3QuZGF0YWJhc2V9L2RvY3VtZW50cy8ke2UucGF0aC5jYW5vbmljYWxTdHJpbmcoKX1gXG4gICAgfTtcbn1cblxuLyoqIFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIGFuIEludGVnZXJWYWx1ZSAuICovIGZ1bmN0aW9uIEt0KHQpIHtcbiAgICByZXR1cm4gISF0ICYmIFwiaW50ZWdlclZhbHVlXCIgaW4gdDtcbn1cblxuLyoqIFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIGEgRG91YmxlVmFsdWUuICovXG4vKiogUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgYW4gQXJyYXlWYWx1ZS4gKi9cbmZ1bmN0aW9uIEd0KHQpIHtcbiAgICByZXR1cm4gISF0ICYmIFwiYXJyYXlWYWx1ZVwiIGluIHQ7XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBhIE51bGxWYWx1ZS4gKi8gZnVuY3Rpb24gUXQodCkge1xuICAgIHJldHVybiAhIXQgJiYgXCJudWxsVmFsdWVcIiBpbiB0O1xufVxuXG4vKiogUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgTmFOLiAqLyBmdW5jdGlvbiBqdCh0KSB7XG4gICAgcmV0dXJuICEhdCAmJiBcImRvdWJsZVZhbHVlXCIgaW4gdCAmJiBpc05hTihOdW1iZXIodC5kb3VibGVWYWx1ZSkpO1xufVxuXG4vKiogUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgYSBNYXBWYWx1ZS4gKi8gZnVuY3Rpb24gV3QodCkge1xuICAgIHJldHVybiAhIXQgJiYgXCJtYXBWYWx1ZVwiIGluIHQ7XG59XG5cbi8qKiBDcmVhdGVzIGEgZGVlcCBjb3B5IG9mIGBzb3VyY2VgLiAqLyBmdW5jdGlvbiB6dCh0KSB7XG4gICAgaWYgKHQuZ2VvUG9pbnRWYWx1ZSkgcmV0dXJuIHtcbiAgICAgICAgZ2VvUG9pbnRWYWx1ZTogT2JqZWN0LmFzc2lnbih7fSwgdC5nZW9Qb2ludFZhbHVlKVxuICAgIH07XG4gICAgaWYgKHQudGltZXN0YW1wVmFsdWUgJiYgXCJvYmplY3RcIiA9PSB0eXBlb2YgdC50aW1lc3RhbXBWYWx1ZSkgcmV0dXJuIHtcbiAgICAgICAgdGltZXN0YW1wVmFsdWU6IE9iamVjdC5hc3NpZ24oe30sIHQudGltZXN0YW1wVmFsdWUpXG4gICAgfTtcbiAgICBpZiAodC5tYXBWYWx1ZSkge1xuICAgICAgICBjb25zdCBlID0ge1xuICAgICAgICAgICAgbWFwVmFsdWU6IHtcbiAgICAgICAgICAgICAgICBmaWVsZHM6IHt9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBsdCh0Lm1hcFZhbHVlLmZpZWxkcywgKCh0LCBuKSA9PiBlLm1hcFZhbHVlLmZpZWxkc1t0XSA9IHp0KG4pKSksIGU7XG4gICAgfVxuICAgIGlmICh0LmFycmF5VmFsdWUpIHtcbiAgICAgICAgY29uc3QgZSA9IHtcbiAgICAgICAgICAgIGFycmF5VmFsdWU6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IFtdXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgKHQuYXJyYXlWYWx1ZS52YWx1ZXMgfHwgW10pLmxlbmd0aDsgKytuKSBlLmFycmF5VmFsdWUudmFsdWVzW25dID0genQodC5hcnJheVZhbHVlLnZhbHVlc1tuXSk7XG4gICAgICAgIHJldHVybiBlO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdCk7XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIFZhbHVlIHJlcHJlc2VudHMgdGhlIGNhbm9uaWNhbCB7QGxpbmsgI01BWF9WQUxVRX0gLiAqLyBmdW5jdGlvbiBIdCh0KSB7XG4gICAgcmV0dXJuIFwiX19tYXhfX1wiID09PSAoKCh0Lm1hcFZhbHVlIHx8IHt9KS5maWVsZHMgfHwge30pLl9fdHlwZV9fIHx8IHt9KS5zdHJpbmdWYWx1ZTtcbn1cblxuLyoqIFJldHVybnMgdGhlIGxvd2VzdCB2YWx1ZSBmb3IgdGhlIGdpdmVuIHZhbHVlIHR5cGUgKGluY2x1c2l2ZSkuICovIGZ1bmN0aW9uIEp0KHQsIGUpIHtcbiAgICByZXR1cm4gdm9pZCAwID09PSB0ID8gZSA6IHZvaWQgMCA9PT0gZSB8fCBGdCh0LCBlKSA+IDAgPyB0IDogZTtcbn1cblxuZnVuY3Rpb24gWXQodCwgZSkge1xuICAgIHJldHVybiB2b2lkIDAgPT09IHQgPyBlIDogdm9pZCAwID09PSBlIHx8IEZ0KHQsIGUpIDwgMCA/IHQgOiBlO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBbiBPYmplY3RWYWx1ZSByZXByZXNlbnRzIGEgTWFwVmFsdWUgaW4gdGhlIEZpcmVzdG9yZSBQcm90byBhbmQgb2ZmZXJzIHRoZVxuICogYWJpbGl0eSB0byBhZGQgYW5kIHJlbW92ZSBmaWVsZHMgKHZpYSB0aGUgT2JqZWN0VmFsdWVCdWlsZGVyKS5cbiAqLyBjbGFzcyBYdCB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdDtcbiAgICB9XG4gICAgc3RhdGljIGVtcHR5KCkge1xuICAgICAgICByZXR1cm4gbmV3IFh0KHtcbiAgICAgICAgICAgIG1hcFZhbHVlOiB7fVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIHBhdGggb3IgbnVsbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXRoIC0gdGhlIHBhdGggdG8gc2VhcmNoXG4gICAgICogQHJldHVybnMgVGhlIHZhbHVlIGF0IHRoZSBwYXRoIG9yIG51bGwgaWYgdGhlIHBhdGggaXMgbm90IHNldC5cbiAgICAgKi8gICAgZmllbGQodCkge1xuICAgICAgICBpZiAodC5pc0VtcHR5KCkpIHJldHVybiB0aGlzLnZhbHVlO1xuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgZSA9IHRoaXMudmFsdWU7XG4gICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHQubGVuZ3RoIC0gMTsgKytuKSBpZiAoZSA9IChlLm1hcFZhbHVlLmZpZWxkcyB8fCB7fSlbdC5nZXQobildLCBcbiAgICAgICAgICAgICFXdChlKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gZSA9IChlLm1hcFZhbHVlLmZpZWxkcyB8fCB7fSlbdC5sYXN0U2VnbWVudCgpXSwgZSB8fCBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGZpZWxkIHRvIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXRoIC0gVGhlIGZpZWxkIHBhdGggdG8gc2V0LlxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICovICAgIHNldCh0LCBlKSB7XG4gICAgICAgIHRoaXMuZ2V0RmllbGRzTWFwKHQucG9wTGFzdCgpKVt0Lmxhc3RTZWdtZW50KCldID0genQoZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHByb3ZpZGVkIGZpZWxkcyB0byB0aGUgcHJvdmlkZWQgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRhdGEgLSBBIG1hcCBvZiBmaWVsZHMgdG8gdmFsdWVzIChvciBudWxsIGZvciBkZWxldGVzKS5cbiAgICAgKi8gICAgc2V0QWxsKHQpIHtcbiAgICAgICAgbGV0IGUgPSBtdC5lbXB0eVBhdGgoKSwgbiA9IHt9LCBzID0gW107XG4gICAgICAgIHQuZm9yRWFjaCgoKHQsIGkpID0+IHtcbiAgICAgICAgICAgIGlmICghZS5pc0ltbWVkaWF0ZVBhcmVudE9mKGkpKSB7XG4gICAgICAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSBhY2N1bXVsYXRlZCBjaGFuZ2VzIGF0IHRoaXMgcGFyZW50IGxvY2F0aW9uXG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuZ2V0RmllbGRzTWFwKGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlDaGFuZ2VzKHQsIG4sIHMpLCBuID0ge30sIHMgPSBbXSwgZSA9IGkucG9wTGFzdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdCA/IG5baS5sYXN0U2VnbWVudCgpXSA9IHp0KHQpIDogcy5wdXNoKGkubGFzdFNlZ21lbnQoKSk7XG4gICAgICAgIH0pKTtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMuZ2V0RmllbGRzTWFwKGUpO1xuICAgICAgICB0aGlzLmFwcGx5Q2hhbmdlcyhpLCBuLCBzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgZmllbGQgYXQgdGhlIHNwZWNpZmllZCBwYXRoLiBJZiB0aGVyZSBpcyBubyBmaWVsZCBhdCB0aGVcbiAgICAgKiBzcGVjaWZpZWQgcGF0aCwgbm90aGluZyBpcyBjaGFuZ2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhdGggLSBUaGUgZmllbGQgcGF0aCB0byByZW1vdmUuXG4gICAgICovICAgIGRlbGV0ZSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLmZpZWxkKHQucG9wTGFzdCgpKTtcbiAgICAgICAgV3QoZSkgJiYgZS5tYXBWYWx1ZS5maWVsZHMgJiYgZGVsZXRlIGUubWFwVmFsdWUuZmllbGRzW3QubGFzdFNlZ21lbnQoKV07XG4gICAgfVxuICAgIGlzRXF1YWwodCkge1xuICAgICAgICByZXR1cm4gT3QodGhpcy52YWx1ZSwgdC52YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1hcCB0aGF0IGNvbnRhaW5zIHRoZSBsZWFmIGVsZW1lbnQgb2YgYHBhdGhgLiBJZiB0aGUgcGFyZW50XG4gICAgICogZW50cnkgZG9lcyBub3QgeWV0IGV4aXN0LCBvciBpZiBpdCBpcyBub3QgYSBtYXAsIGEgbmV3IG1hcCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAgICovICAgIGdldEZpZWxkc01hcCh0KSB7XG4gICAgICAgIGxldCBlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgZS5tYXBWYWx1ZS5maWVsZHMgfHwgKGUubWFwVmFsdWUgPSB7XG4gICAgICAgICAgICBmaWVsZHM6IHt9XG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHQubGVuZ3RoOyArK24pIHtcbiAgICAgICAgICAgIGxldCBzID0gZS5tYXBWYWx1ZS5maWVsZHNbdC5nZXQobildO1xuICAgICAgICAgICAgV3QocykgJiYgcy5tYXBWYWx1ZS5maWVsZHMgfHwgKHMgPSB7XG4gICAgICAgICAgICAgICAgbWFwVmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRzOiB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIGUubWFwVmFsdWUuZmllbGRzW3QuZ2V0KG4pXSA9IHMpLCBlID0gcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZS5tYXBWYWx1ZS5maWVsZHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1vZGlmaWVzIGBmaWVsZHNNYXBgIGJ5IGFkZGluZywgcmVwbGFjaW5nIG9yIGRlbGV0aW5nIHRoZSBzcGVjaWZpZWRcbiAgICAgKiBlbnRyaWVzLlxuICAgICAqLyAgICBhcHBseUNoYW5nZXModCwgZSwgbikge1xuICAgICAgICBsdChlLCAoKGUsIG4pID0+IHRbZV0gPSBuKSk7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiBuKSBkZWxldGUgdFtlXTtcbiAgICB9XG4gICAgY2xvbmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgWHQoenQodGhpcy52YWx1ZSkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgRmllbGRNYXNrIGJ1aWx0IGZyb20gYWxsIGZpZWxkcyBpbiBhIE1hcFZhbHVlLlxuICovIGZ1bmN0aW9uIFp0KHQpIHtcbiAgICBjb25zdCBlID0gW107XG4gICAgcmV0dXJuIGx0KHQuZmllbGRzLCAoKHQsIG4pID0+IHtcbiAgICAgICAgY29uc3QgcyA9IG5ldyBtdChbIHQgXSk7XG4gICAgICAgIGlmIChXdChuKSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IFp0KG4ubWFwVmFsdWUpLmZpZWxkcztcbiAgICAgICAgICAgIGlmICgwID09PSB0Lmxlbmd0aCkgXG4gICAgICAgICAgICAvLyBQcmVzZXJ2ZSB0aGUgZW1wdHkgbWFwIGJ5IGFkZGluZyBpdCB0byB0aGUgRmllbGRNYXNrLlxuICAgICAgICAgICAgZS5wdXNoKHMpOyBlbHNlIFxuICAgICAgICAgICAgLy8gRm9yIG5lc3RlZCBhbmQgbm9uLWVtcHR5IE9iamVjdFZhbHVlcywgYWRkIHRoZSBGaWVsZFBhdGggb2YgdGhlXG4gICAgICAgICAgICAvLyBsZWFmIG5vZGVzLlxuICAgICAgICAgICAgZm9yIChjb25zdCBuIG9mIHQpIGUucHVzaChzLmNoaWxkKG4pKTtcbiAgICAgICAgfSBlbHNlIFxuICAgICAgICAvLyBGb3IgbmVzdGVkIGFuZCBub24tZW1wdHkgT2JqZWN0VmFsdWVzLCBhZGQgdGhlIEZpZWxkUGF0aCBvZiB0aGUgbGVhZlxuICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgZS5wdXNoKHMpO1xuICAgIH0pKSwgbmV3IGd0KGUpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgZG9jdW1lbnQgaW4gRmlyZXN0b3JlIHdpdGggYSBrZXksIHZlcnNpb24sIGRhdGEgYW5kIHdoZXRoZXIgaXRcbiAqIGhhcyBsb2NhbCBtdXRhdGlvbnMgYXBwbGllZCB0byBpdC5cbiAqXG4gKiBEb2N1bWVudHMgY2FuIHRyYW5zaXRpb24gYmV0d2VlbiBzdGF0ZXMgdmlhIGBjb252ZXJ0VG9Gb3VuZERvY3VtZW50KClgLFxuICogYGNvbnZlcnRUb05vRG9jdW1lbnQoKWAgYW5kIGBjb252ZXJ0VG9Vbmtub3duRG9jdW1lbnQoKWAuIElmIGEgZG9jdW1lbnQgZG9lc1xuICogbm90IHRyYW5zaXRpb24gdG8gb25lIG9mIHRoZXNlIHN0YXRlcyBldmVuIGFmdGVyIGFsbCBtdXRhdGlvbnMgaGF2ZSBiZWVuXG4gKiBhcHBsaWVkLCBgaXNWYWxpZERvY3VtZW50KClgIHJldHVybnMgZmFsc2UgYW5kIHRoZSBkb2N1bWVudCBzaG91bGQgYmUgcmVtb3ZlZFxuICogZnJvbSBhbGwgdmlld3MuXG4gKi8gY2xhc3MgdGUge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMsIGksIHIpIHtcbiAgICAgICAgdGhpcy5rZXkgPSB0LCB0aGlzLmRvY3VtZW50VHlwZSA9IGUsIHRoaXMudmVyc2lvbiA9IG4sIHRoaXMucmVhZFRpbWUgPSBzLCB0aGlzLmRhdGEgPSBpLCBcbiAgICAgICAgdGhpcy5kb2N1bWVudFN0YXRlID0gcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGRvY3VtZW50IHdpdGggbm8ga25vd24gdmVyc2lvbiBvciBkYXRhLCBidXQgd2hpY2ggY2FuIHNlcnZlIGFzXG4gICAgICogYmFzZSBkb2N1bWVudCBmb3IgbXV0YXRpb25zLlxuICAgICAqLyAgICBzdGF0aWMgbmV3SW52YWxpZERvY3VtZW50KHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB0ZSh0LCAwIC8qIElOVkFMSUQgKi8gLCBjdC5taW4oKSwgY3QubWluKCksIFh0LmVtcHR5KCksIDAgLyogU1lOQ0VEICovKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCB0aGF0IGlzIGtub3duIHRvIGV4aXN0IHdpdGggdGhlIGdpdmVuIGRhdGEgYXQgdGhlXG4gICAgICogZ2l2ZW4gdmVyc2lvbi5cbiAgICAgKi8gICAgc3RhdGljIG5ld0ZvdW5kRG9jdW1lbnQodCwgZSwgbikge1xuICAgICAgICByZXR1cm4gbmV3IHRlKHQsIDEgLyogRk9VTkRfRE9DVU1FTlQgKi8gLCBlLCBjdC5taW4oKSwgbiwgMCAvKiBTWU5DRUQgKi8pO1xuICAgIH1cbiAgICAvKiogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCB0aGF0IGlzIGtub3duIHRvIG5vdCBleGlzdCBhdCB0aGUgZ2l2ZW4gdmVyc2lvbi4gKi8gICAgc3RhdGljIG5ld05vRG9jdW1lbnQodCwgZSkge1xuICAgICAgICByZXR1cm4gbmV3IHRlKHQsIDIgLyogTk9fRE9DVU1FTlQgKi8gLCBlLCBjdC5taW4oKSwgWHQuZW1wdHkoKSwgMCAvKiBTWU5DRUQgKi8pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IHRoYXQgaXMga25vd24gdG8gZXhpc3QgYXQgdGhlIGdpdmVuIHZlcnNpb24gYnV0XG4gICAgICogd2hvc2UgZGF0YSBpcyBub3Qga25vd24gKGUuZy4gYSBkb2N1bWVudCB0aGF0IHdhcyB1cGRhdGVkIHdpdGhvdXQgYSBrbm93blxuICAgICAqIGJhc2UgZG9jdW1lbnQpLlxuICAgICAqLyAgICBzdGF0aWMgbmV3VW5rbm93bkRvY3VtZW50KHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB0ZSh0LCAzIC8qIFVOS05PV05fRE9DVU1FTlQgKi8gLCBlLCBjdC5taW4oKSwgWHQuZW1wdHkoKSwgMiAvKiBIQVNfQ09NTUlUVEVEX01VVEFUSU9OUyAqLyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIGRvY3VtZW50IHR5cGUgdG8gaW5kaWNhdGUgdGhhdCBpdCBleGlzdHMgYW5kIHRoYXQgaXRzIHZlcnNpb25cbiAgICAgKiBhbmQgZGF0YSBhcmUga25vd24uXG4gICAgICovICAgIGNvbnZlcnRUb0ZvdW5kRG9jdW1lbnQodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy52ZXJzaW9uID0gdCwgdGhpcy5kb2N1bWVudFR5cGUgPSAxIC8qIEZPVU5EX0RPQ1VNRU5UICovICwgdGhpcy5kYXRhID0gZSwgXG4gICAgICAgIHRoaXMuZG9jdW1lbnRTdGF0ZSA9IDAgLyogU1lOQ0VEICovICwgdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyB0aGUgZG9jdW1lbnQgdHlwZSB0byBpbmRpY2F0ZSB0aGF0IGl0IGRvZXNuJ3QgZXhpc3QgYXQgdGhlIGdpdmVuXG4gICAgICogdmVyc2lvbi5cbiAgICAgKi8gICAgY29udmVydFRvTm9Eb2N1bWVudCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcnNpb24gPSB0LCB0aGlzLmRvY3VtZW50VHlwZSA9IDIgLyogTk9fRE9DVU1FTlQgKi8gLCB0aGlzLmRhdGEgPSBYdC5lbXB0eSgpLCBcbiAgICAgICAgdGhpcy5kb2N1bWVudFN0YXRlID0gMCAvKiBTWU5DRUQgKi8gLCB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIHRoZSBkb2N1bWVudCB0eXBlIHRvIGluZGljYXRlIHRoYXQgaXQgZXhpc3RzIGF0IGEgZ2l2ZW4gdmVyc2lvbiBidXRcbiAgICAgKiB0aGF0IGl0cyBkYXRhIGlzIG5vdCBrbm93biAoZS5nLiBhIGRvY3VtZW50IHRoYXQgd2FzIHVwZGF0ZWQgd2l0aG91dCBhIGtub3duXG4gICAgICogYmFzZSBkb2N1bWVudCkuXG4gICAgICovICAgIGNvbnZlcnRUb1Vua25vd25Eb2N1bWVudCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcnNpb24gPSB0LCB0aGlzLmRvY3VtZW50VHlwZSA9IDMgLyogVU5LTk9XTl9ET0NVTUVOVCAqLyAsIHRoaXMuZGF0YSA9IFh0LmVtcHR5KCksIFxuICAgICAgICB0aGlzLmRvY3VtZW50U3RhdGUgPSAyIC8qIEhBU19DT01NSVRURURfTVVUQVRJT05TICovICwgdGhpcztcbiAgICB9XG4gICAgc2V0SGFzQ29tbWl0dGVkTXV0YXRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudFN0YXRlID0gMiAvKiBIQVNfQ09NTUlUVEVEX01VVEFUSU9OUyAqLyAsIHRoaXM7XG4gICAgfVxuICAgIHNldEhhc0xvY2FsTXV0YXRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudFN0YXRlID0gMSAvKiBIQVNfTE9DQUxfTVVUQVRJT05TICovICwgdGhpcztcbiAgICB9XG4gICAgc2V0UmVhZFRpbWUodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkVGltZSA9IHQsIHRoaXM7XG4gICAgfVxuICAgIGdldCBoYXNMb2NhbE11dGF0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIDEgLyogSEFTX0xPQ0FMX01VVEFUSU9OUyAqLyA9PT0gdGhpcy5kb2N1bWVudFN0YXRlO1xuICAgIH1cbiAgICBnZXQgaGFzQ29tbWl0dGVkTXV0YXRpb25zKCkge1xuICAgICAgICByZXR1cm4gMiAvKiBIQVNfQ09NTUlUVEVEX01VVEFUSU9OUyAqLyA9PT0gdGhpcy5kb2N1bWVudFN0YXRlO1xuICAgIH1cbiAgICBnZXQgaGFzUGVuZGluZ1dyaXRlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzTG9jYWxNdXRhdGlvbnMgfHwgdGhpcy5oYXNDb21taXR0ZWRNdXRhdGlvbnM7XG4gICAgfVxuICAgIGlzVmFsaWREb2N1bWVudCgpIHtcbiAgICAgICAgcmV0dXJuIDAgLyogSU5WQUxJRCAqLyAhPT0gdGhpcy5kb2N1bWVudFR5cGU7XG4gICAgfVxuICAgIGlzRm91bmREb2N1bWVudCgpIHtcbiAgICAgICAgcmV0dXJuIDEgLyogRk9VTkRfRE9DVU1FTlQgKi8gPT09IHRoaXMuZG9jdW1lbnRUeXBlO1xuICAgIH1cbiAgICBpc05vRG9jdW1lbnQoKSB7XG4gICAgICAgIHJldHVybiAyIC8qIE5PX0RPQ1VNRU5UICovID09PSB0aGlzLmRvY3VtZW50VHlwZTtcbiAgICB9XG4gICAgaXNVbmtub3duRG9jdW1lbnQoKSB7XG4gICAgICAgIHJldHVybiAzIC8qIFVOS05PV05fRE9DVU1FTlQgKi8gPT09IHRoaXMuZG9jdW1lbnRUeXBlO1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgaW5zdGFuY2VvZiB0ZSAmJiB0aGlzLmtleS5pc0VxdWFsKHQua2V5KSAmJiB0aGlzLnZlcnNpb24uaXNFcXVhbCh0LnZlcnNpb24pICYmIHRoaXMuZG9jdW1lbnRUeXBlID09PSB0LmRvY3VtZW50VHlwZSAmJiB0aGlzLmRvY3VtZW50U3RhdGUgPT09IHQuZG9jdW1lbnRTdGF0ZSAmJiB0aGlzLmRhdGEuaXNFcXVhbCh0LmRhdGEpO1xuICAgIH1cbiAgICBtdXRhYmxlQ29weSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB0ZSh0aGlzLmtleSwgdGhpcy5kb2N1bWVudFR5cGUsIHRoaXMudmVyc2lvbiwgdGhpcy5yZWFkVGltZSwgdGhpcy5kYXRhLmNsb25lKCksIHRoaXMuZG9jdW1lbnRTdGF0ZSk7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gYERvY3VtZW50KCR7dGhpcy5rZXl9LCAke3RoaXMudmVyc2lvbn0sICR7SlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLnZhbHVlKX0sIHtkb2N1bWVudFR5cGU6ICR7dGhpcy5kb2N1bWVudFR5cGV9fSksIHtkb2N1bWVudFN0YXRlOiAke3RoaXMuZG9jdW1lbnRTdGF0ZX19KWA7XG4gICAgfVxufVxuXG4vKipcbiAqIENvbXBhcmVzIHRoZSB2YWx1ZSBmb3IgZmllbGQgYGZpZWxkYCBpbiB0aGUgcHJvdmlkZWQgZG9jdW1lbnRzLiBUaHJvd3MgaWZcbiAqIHRoZSBmaWVsZCBkb2VzIG5vdCBleGlzdCBpbiBib3RoIGRvY3VtZW50cy5cbiAqL1xuLyoqXG4gKiBBbiBpbmRleCBkZWZpbml0aW9uIGZvciBmaWVsZCBpbmRleGVzIGluIEZpcmVzdG9yZS5cbiAqXG4gKiBFdmVyeSBpbmRleCBpcyBhc3NvY2lhdGVkIHdpdGggYSBjb2xsZWN0aW9uLiBUaGUgZGVmaW5pdGlvbiBjb250YWlucyBhIGxpc3RcbiAqIG9mIGZpZWxkcyBhbmQgdGhlaXIgaW5kZXgga2luZCAod2hpY2ggY2FuIGJlIGBBU0NFTkRJTkdgLCBgREVTQ0VORElOR2Agb3JcbiAqIGBDT05UQUlOU2AgZm9yIEFycmF5Q29udGFpbnMvQXJyYXlDb250YWluc0FueSBxdWVyaWVzKS5cbiAqXG4gKiBVbmxpa2UgdGhlIGJhY2tlbmQsIHRoZSBTREsgZG9lcyBub3QgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGNvbGxlY3Rpb24gb3JcbiAqIGNvbGxlY3Rpb24gZ3JvdXAtc2NvcGVkIGluZGljZXMuIEV2ZXJ5IGluZGV4IGNhbiBiZSB1c2VkIGZvciBib3RoIHNpbmdsZVxuICogY29sbGVjdGlvbiBhbmQgY29sbGVjdGlvbiBncm91cCBxdWVyaWVzLlxuICovXG5jbGFzcyBlZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogVGhlIGluZGV4IElELiBSZXR1cm5zIC0xIGlmIHRoZSBpbmRleCBJRCBpcyBub3QgYXZhaWxhYmxlIChlLmcuIHRoZSBpbmRleFxuICAgICAqIGhhcyBub3QgeWV0IGJlZW4gcGVyc2lzdGVkKS5cbiAgICAgKi9cbiAgICB0LCBcbiAgICAvKiogVGhlIGNvbGxlY3Rpb24gSUQgdGhpcyBpbmRleCBhcHBsaWVzIHRvLiAqL1xuICAgIGUsIFxuICAgIC8qKiBUaGUgZmllbGQgc2VnbWVudHMgZm9yIHRoaXMgaW5kZXguICovXG4gICAgbiwgXG4gICAgLyoqIFNob3dzIGhvdyB1cC10by1kYXRlIHRoZSBpbmRleCBpcyBmb3IgdGhlIGN1cnJlbnQgdXNlci4gKi9cbiAgICBzKSB7XG4gICAgICAgIHRoaXMuaW5kZXhJZCA9IHQsIHRoaXMuY29sbGVjdGlvbkdyb3VwID0gZSwgdGhpcy5maWVsZHMgPSBuLCB0aGlzLmluZGV4U3RhdGUgPSBzO1xuICAgIH1cbn1cblxuLyoqIEFuIElEIGZvciBhbiBpbmRleCB0aGF0IGhhcyBub3QgeWV0IGJlZW4gYWRkZWQgdG8gcGVyc2lzdGVuY2UuICAqL1xuLyoqIFJldHVybnMgdGhlIEFycmF5Q29udGFpbnMvQXJyYXlDb250YWluc0FueSBzZWdtZW50IGZvciB0aGlzIGluZGV4LiAqL1xuZnVuY3Rpb24gbmUodCkge1xuICAgIHJldHVybiB0LmZpZWxkcy5maW5kKCh0ID0+IDIgLyogQ09OVEFJTlMgKi8gPT09IHQua2luZCkpO1xufVxuXG4vKiogUmV0dXJucyBhbGwgZGlyZWN0aW9uYWwgKGFzY2VuZGluZy9kZXNjZW5kaW5nKSBzZWdtZW50cyBmb3IgdGhpcyBpbmRleC4gKi8gZnVuY3Rpb24gc2UodCkge1xuICAgIHJldHVybiB0LmZpZWxkcy5maWx0ZXIoKHQgPT4gMiAvKiBDT05UQUlOUyAqLyAhPT0gdC5raW5kKSk7XG59XG5cbi8qKiBSZXR1cm5zIGEgZGVidWcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZpZWxkIGluZGV4ICovIGVlLlVOS05PV05fSUQgPSAtMTtcblxuLyoqIEFuIGluZGV4IGNvbXBvbmVudCBjb25zaXN0aW5nIG9mIGZpZWxkIHBhdGggYW5kIGluZGV4IHR5cGUuICAqL1xuY2xhc3MgaWUge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKiBUaGUgZmllbGQgcGF0aCBvZiB0aGUgY29tcG9uZW50LiAqL1xuICAgIHQsIFxuICAgIC8qKiBUaGUgZmllbGRzIHNvcnRpbmcgb3JkZXIuICovXG4gICAgZSkge1xuICAgICAgICB0aGlzLmZpZWxkUGF0aCA9IHQsIHRoaXMua2luZCA9IGU7XG4gICAgfVxufVxuXG4vKipcbiAqIFN0b3JlcyB0aGUgXCJoaWdoIHdhdGVyIG1hcmtcIiB0aGF0IGluZGljYXRlcyBob3cgdXBkYXRlZCB0aGUgSW5kZXggaXMgZm9yIHRoZVxuICogY3VycmVudCB1c2VyLlxuICovIGNsYXNzIHJlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hlbiB0aGUgaW5kZXggd2FzIGxhc3QgdXBkYXRlZCAocmVsYXRpdmUgdG8gb3RoZXIgaW5kZXhlcykuXG4gICAgICovXG4gICAgdCwgXG4gICAgLyoqIFRoZSB0aGUgbGF0ZXN0IGluZGV4ZWQgcmVhZCB0aW1lLCBkb2N1bWVudCBhbmQgYmF0Y2ggaWQuICovXG4gICAgZSkge1xuICAgICAgICB0aGlzLnNlcXVlbmNlTnVtYmVyID0gdCwgdGhpcy5vZmZzZXQgPSBlO1xuICAgIH1cbiAgICAvKiogVGhlIHN0YXRlIG9mIGFuIGluZGV4IHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBiYWNrZmlsbGVkLiAqLyAgICBzdGF0aWMgZW1wdHkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgcmUoMCwgb2UubWluKCkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBTdG9yZXMgdGhlIGxhdGVzdCByZWFkIHRpbWUsIGRvY3VtZW50IGFuZCBiYXRjaCBJRCB0aGF0IHdlcmUgcHJvY2Vzc2VkIGZvciBhblxuICogaW5kZXguXG4gKi8gY2xhc3Mgb2Uge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIFRoZSBsYXRlc3QgcmVhZCB0aW1lIHZlcnNpb24gdGhhdCBoYXMgYmVlbiBpbmRleGVkIGJ5IEZpcmVzdG9yZSBmb3IgdGhpc1xuICAgICAqIGZpZWxkIGluZGV4LlxuICAgICAqL1xuICAgIHQsIFxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgb2YgdGhlIGxhc3QgZG9jdW1lbnQgdGhhdCB3YXMgaW5kZXhlZCBmb3IgdGhpcyBxdWVyeS4gVXNlXG4gICAgICogYERvY3VtZW50S2V5LmVtcHR5KClgIGlmIG5vIGRvY3VtZW50IGhhcyBiZWVuIGluZGV4ZWQuXG4gICAgICovXG4gICAgZSwgXG4gICAgLypcbiAgICAgKiBUaGUgbGFyZ2VzdCBtdXRhdGlvbiBiYXRjaCBpZCB0aGF0J3MgYmVlbiBwcm9jZXNzZWQgYnkgRmlyZXN0b3JlLlxuICAgICAqL1xuICAgIG4pIHtcbiAgICAgICAgdGhpcy5yZWFkVGltZSA9IHQsIHRoaXMuZG9jdW1lbnRLZXkgPSBlLCB0aGlzLmxhcmdlc3RCYXRjaElkID0gbjtcbiAgICB9XG4gICAgLyoqIFRoZSBzdGF0ZSBvZiBhbiBpbmRleCB0aGF0IGhhcyBub3QgeWV0IGJlZW4gYmFja2ZpbGxlZC4gKi8gICAgc3RhdGljIG1pbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBvZShjdC5taW4oKSwgeHQuZW1wdHkoKSwgLTEpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8vIFZpc2libGUgZm9yIHRlc3RpbmdcbmNsYXNzIGFlIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlID0gbnVsbCwgbiA9IFtdLCBzID0gW10sIGkgPSBudWxsLCByID0gbnVsbCwgbyA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5wYXRoID0gdCwgdGhpcy5jb2xsZWN0aW9uR3JvdXAgPSBlLCB0aGlzLm9yZGVyQnkgPSBuLCB0aGlzLmZpbHRlcnMgPSBzLCB0aGlzLmxpbWl0ID0gaSwgXG4gICAgICAgIHRoaXMuc3RhcnRBdCA9IHIsIHRoaXMuZW5kQXQgPSBvLCB0aGlzLlAgPSBudWxsO1xuICAgIH1cbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyBhIFRhcmdldCB3aXRoIGEgcGF0aCBhbmQgb3B0aW9uYWwgYWRkaXRpb25hbCBxdWVyeSBjb25zdHJhaW50cy5cbiAqIFBhdGggbXVzdCBjdXJyZW50bHkgYmUgZW1wdHkgaWYgdGhpcyBpcyBhIGNvbGxlY3Rpb24gZ3JvdXAgcXVlcnkuXG4gKlxuICogTk9URTogeW91IHNob3VsZCBhbHdheXMgY29uc3RydWN0IGBUYXJnZXRgIGZyb20gYFF1ZXJ5LnRvVGFyZ2V0YCBpbnN0ZWFkIG9mXG4gKiB1c2luZyB0aGlzIGZhY3RvcnkgbWV0aG9kLCBiZWNhdXNlIGBRdWVyeWAgcHJvdmlkZXMgYW4gaW1wbGljaXQgYG9yZGVyQnlgXG4gKiBwcm9wZXJ0eS5cbiAqLyBmdW5jdGlvbiB1ZSh0LCBlID0gbnVsbCwgbiA9IFtdLCBzID0gW10sIGkgPSBudWxsLCByID0gbnVsbCwgbyA9IG51bGwpIHtcbiAgICByZXR1cm4gbmV3IGFlKHQsIGUsIG4sIHMsIGksIHIsIG8pO1xufVxuXG5mdW5jdGlvbiBjZSh0KSB7XG4gICAgY29uc3QgZSA9IEsodCk7XG4gICAgaWYgKG51bGwgPT09IGUuUCkge1xuICAgICAgICBsZXQgdCA9IGUucGF0aC5jYW5vbmljYWxTdHJpbmcoKTtcbiAgICAgICAgbnVsbCAhPT0gZS5jb2xsZWN0aW9uR3JvdXAgJiYgKHQgKz0gXCJ8Y2c6XCIgKyBlLmNvbGxlY3Rpb25Hcm91cCksIHQgKz0gXCJ8ZjpcIiwgdCArPSBlLmZpbHRlcnMubWFwKCh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoZSA9IHQpLmZpZWxkLmNhbm9uaWNhbFN0cmluZygpICsgZS5vcC50b1N0cmluZygpICsgTHQoZS52YWx1ZSk7XG4gICAgICAgICAgICB2YXIgZTtcbiAgICAgICAgfSkpLmpvaW4oXCIsXCIpLCB0ICs9IFwifG9iOlwiLCB0ICs9IGUub3JkZXJCeS5tYXAoKHQgPT4gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgLy8gVE9ETyhiLzI5MTgzMTY1KTogTWFrZSB0aGlzIGNvbGxpc2lvbiByb2J1c3QuXG4gICAgICAgICAgICByZXR1cm4gdC5maWVsZC5jYW5vbmljYWxTdHJpbmcoKSArIHQuZGlyO1xuICAgICAgICB9KHQpKSkuam9pbihcIixcIiksIFN0KGUubGltaXQpIHx8ICh0ICs9IFwifGw6XCIsIHQgKz0gZS5saW1pdCksIGUuc3RhcnRBdCAmJiAodCArPSBcInxsYjpcIiwgXG4gICAgICAgIHQgKz0gZS5zdGFydEF0LmluY2x1c2l2ZSA/IFwiYjpcIiA6IFwiYTpcIiwgdCArPSBlLnN0YXJ0QXQucG9zaXRpb24ubWFwKCh0ID0+IEx0KHQpKSkuam9pbihcIixcIikpLCBcbiAgICAgICAgZS5lbmRBdCAmJiAodCArPSBcInx1YjpcIiwgdCArPSBlLmVuZEF0LmluY2x1c2l2ZSA/IFwiYTpcIiA6IFwiYjpcIiwgdCArPSBlLmVuZEF0LnBvc2l0aW9uLm1hcCgodCA9PiBMdCh0KSkpLmpvaW4oXCIsXCIpKSwgXG4gICAgICAgIGUuUCA9IHQ7XG4gICAgfVxuICAgIHJldHVybiBlLlA7XG59XG5cbmZ1bmN0aW9uIGhlKHQpIHtcbiAgICBsZXQgZSA9IHQucGF0aC5jYW5vbmljYWxTdHJpbmcoKTtcbiAgICByZXR1cm4gbnVsbCAhPT0gdC5jb2xsZWN0aW9uR3JvdXAgJiYgKGUgKz0gXCIgY29sbGVjdGlvbkdyb3VwPVwiICsgdC5jb2xsZWN0aW9uR3JvdXApLCBcbiAgICB0LmZpbHRlcnMubGVuZ3RoID4gMCAmJiAoZSArPSBgLCBmaWx0ZXJzOiBbJHt0LmZpbHRlcnMubWFwKCh0ID0+IHtcbiAgICAgICAgcmV0dXJuIGAkeyhlID0gdCkuZmllbGQuY2Fub25pY2FsU3RyaW5nKCl9ICR7ZS5vcH0gJHtMdChlLnZhbHVlKX1gO1xuICAgICAgICAvKiogUmV0dXJucyBhIGRlYnVnIGRlc2NyaXB0aW9uIGZvciBgZmlsdGVyYC4gKi9cbiAgICAgICAgdmFyIGU7XG4gICAgICAgIC8qKiBGaWx0ZXIgdGhhdCBtYXRjaGVzIG9uIGtleSBmaWVsZHMgKGkuZS4gJ19fbmFtZV9fJykuICovICAgIH0pKS5qb2luKFwiLCBcIil9XWApLCBcbiAgICBTdCh0LmxpbWl0KSB8fCAoZSArPSBcIiwgbGltaXQ6IFwiICsgdC5saW1pdCksIHQub3JkZXJCeS5sZW5ndGggPiAwICYmIChlICs9IGAsIG9yZGVyQnk6IFske3Qub3JkZXJCeS5tYXAoKHQgPT4gZnVuY3Rpb24odCkge1xuICAgICAgICByZXR1cm4gYCR7dC5maWVsZC5jYW5vbmljYWxTdHJpbmcoKX0gKCR7dC5kaXJ9KWA7XG4gICAgfSh0KSkpLmpvaW4oXCIsIFwiKX1dYCksIHQuc3RhcnRBdCAmJiAoZSArPSBcIiwgc3RhcnRBdDogXCIsIGUgKz0gdC5zdGFydEF0LmluY2x1c2l2ZSA/IFwiYjpcIiA6IFwiYTpcIiwgXG4gICAgZSArPSB0LnN0YXJ0QXQucG9zaXRpb24ubWFwKCh0ID0+IEx0KHQpKSkuam9pbihcIixcIikpLCB0LmVuZEF0ICYmIChlICs9IFwiLCBlbmRBdDogXCIsIFxuICAgIGUgKz0gdC5lbmRBdC5pbmNsdXNpdmUgPyBcImE6XCIgOiBcImI6XCIsIGUgKz0gdC5lbmRBdC5wb3NpdGlvbi5tYXAoKHQgPT4gTHQodCkpKS5qb2luKFwiLFwiKSksIFxuICAgIGBUYXJnZXQoJHtlfSlgO1xufVxuXG5mdW5jdGlvbiBsZSh0LCBlKSB7XG4gICAgaWYgKHQubGltaXQgIT09IGUubGltaXQpIHJldHVybiAhMTtcbiAgICBpZiAodC5vcmRlckJ5Lmxlbmd0aCAhPT0gZS5vcmRlckJ5Lmxlbmd0aCkgcmV0dXJuICExO1xuICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdC5vcmRlckJ5Lmxlbmd0aDsgbisrKSBpZiAoIWJlKHQub3JkZXJCeVtuXSwgZS5vcmRlckJ5W25dKSkgcmV0dXJuICExO1xuICAgIGlmICh0LmZpbHRlcnMubGVuZ3RoICE9PSBlLmZpbHRlcnMubGVuZ3RoKSByZXR1cm4gITE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0LmZpbHRlcnMubGVuZ3RoOyBpKyspIGlmIChuID0gdC5maWx0ZXJzW2ldLCBzID0gZS5maWx0ZXJzW2ldLCBcbiAgICBuLm9wICE9PSBzLm9wIHx8ICFuLmZpZWxkLmlzRXF1YWwocy5maWVsZCkgfHwgIU90KG4udmFsdWUsIHMudmFsdWUpKSByZXR1cm4gITE7XG4gICAgdmFyIG4sIHM7XG4gICAgcmV0dXJuIHQuY29sbGVjdGlvbkdyb3VwID09PSBlLmNvbGxlY3Rpb25Hcm91cCAmJiAoISF0LnBhdGguaXNFcXVhbChlLnBhdGgpICYmICghIVZlKHQuc3RhcnRBdCwgZS5zdGFydEF0KSAmJiBWZSh0LmVuZEF0LCBlLmVuZEF0KSkpO1xufVxuXG5mdW5jdGlvbiBmZSh0KSB7XG4gICAgcmV0dXJuIHh0LmlzRG9jdW1lbnRLZXkodC5wYXRoKSAmJiBudWxsID09PSB0LmNvbGxlY3Rpb25Hcm91cCAmJiAwID09PSB0LmZpbHRlcnMubGVuZ3RoO1xufVxuXG4vKiogUmV0dXJucyB0aGUgZmllbGQgZmlsdGVycyB0aGF0IHRhcmdldCB0aGUgZ2l2ZW4gZmllbGQgcGF0aC4gKi8gZnVuY3Rpb24gZGUodCwgZSkge1xuICAgIHJldHVybiB0LmZpbHRlcnMuZmlsdGVyKCh0ID0+IHQgaW5zdGFuY2VvZiBfZSAmJiB0LmZpZWxkLmlzRXF1YWwoZSkpKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZXMgdGhhdCBhcmUgdXNlZCBpbiBBUlJBWV9DT05UQUlOUyBvciBBUlJBWV9DT05UQUlOU19BTllcbiAqIGZpbHRlcnMuIFJldHVybnMgYG51bGxgIGlmIHRoZXJlIGFyZSBubyBzdWNoIGZpbHRlcnMuXG4gKi8gY2xhc3MgX2UgZXh0ZW5kcyBjbGFzcyB7fSB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbikge1xuICAgICAgICBzdXBlcigpLCB0aGlzLmZpZWxkID0gdCwgdGhpcy5vcCA9IGUsIHRoaXMudmFsdWUgPSBuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZmlsdGVyIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAgICovICAgIHN0YXRpYyBjcmVhdGUodCwgZSwgbikge1xuICAgICAgICByZXR1cm4gdC5pc0tleUZpZWxkKCkgPyBcImluXCIgLyogSU4gKi8gPT09IGUgfHwgXCJub3QtaW5cIiAvKiBOT1RfSU4gKi8gPT09IGUgPyB0aGlzLlYodCwgZSwgbikgOiBuZXcgd2UodCwgZSwgbikgOiBcImFycmF5LWNvbnRhaW5zXCIgLyogQVJSQVlfQ09OVEFJTlMgKi8gPT09IGUgPyBuZXcgcGUodCwgbikgOiBcImluXCIgLyogSU4gKi8gPT09IGUgPyBuZXcgSWUodCwgbikgOiBcIm5vdC1pblwiIC8qIE5PVF9JTiAqLyA9PT0gZSA/IG5ldyBUZSh0LCBuKSA6IFwiYXJyYXktY29udGFpbnMtYW55XCIgLyogQVJSQVlfQ09OVEFJTlNfQU5ZICovID09PSBlID8gbmV3IEVlKHQsIG4pIDogbmV3IF9lKHQsIGUsIG4pO1xuICAgIH1cbiAgICBzdGF0aWMgVih0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiBcImluXCIgLyogSU4gKi8gPT09IGUgPyBuZXcgbWUodCwgbikgOiBuZXcgZ2UodCwgbik7XG4gICAgfVxuICAgIG1hdGNoZXModCkge1xuICAgICAgICBjb25zdCBlID0gdC5kYXRhLmZpZWxkKHRoaXMuZmllbGQpO1xuICAgICAgICAvLyBUeXBlcyBkbyBub3QgaGF2ZSB0byBtYXRjaCBpbiBOT1RfRVFVQUwgZmlsdGVycy5cbiAgICAgICAgICAgICAgICByZXR1cm4gXCIhPVwiIC8qIE5PVF9FUVVBTCAqLyA9PT0gdGhpcy5vcCA/IG51bGwgIT09IGUgJiYgdGhpcy52KEZ0KGUsIHRoaXMudmFsdWUpKSA6IG51bGwgIT09IGUgJiYgTXQodGhpcy52YWx1ZSkgPT09IE10KGUpICYmIHRoaXMudihGdChlLCB0aGlzLnZhbHVlKSk7XG4gICAgICAgIC8vIE9ubHkgY29tcGFyZSB0eXBlcyB3aXRoIG1hdGNoaW5nIGJhY2tlbmQgb3JkZXIgKHN1Y2ggYXMgZG91YmxlIGFuZCBpbnQpLlxuICAgICAgICB9XG4gICAgdih0KSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5vcCkge1xuICAgICAgICAgIGNhc2UgXCI8XCIgLyogTEVTU19USEFOICovIDpcbiAgICAgICAgICAgIHJldHVybiB0IDwgMDtcblxuICAgICAgICAgIGNhc2UgXCI8PVwiIC8qIExFU1NfVEhBTl9PUl9FUVVBTCAqLyA6XG4gICAgICAgICAgICByZXR1cm4gdCA8PSAwO1xuXG4gICAgICAgICAgY2FzZSBcIj09XCIgLyogRVFVQUwgKi8gOlxuICAgICAgICAgICAgcmV0dXJuIDAgPT09IHQ7XG5cbiAgICAgICAgICBjYXNlIFwiIT1cIiAvKiBOT1RfRVFVQUwgKi8gOlxuICAgICAgICAgICAgcmV0dXJuIDAgIT09IHQ7XG5cbiAgICAgICAgICBjYXNlIFwiPlwiIC8qIEdSRUFURVJfVEhBTiAqLyA6XG4gICAgICAgICAgICByZXR1cm4gdCA+IDA7XG5cbiAgICAgICAgICBjYXNlIFwiPj1cIiAvKiBHUkVBVEVSX1RIQU5fT1JfRVFVQUwgKi8gOlxuICAgICAgICAgICAgcmV0dXJuIHQgPj0gMDtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gTCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFMoKSB7XG4gICAgICAgIHJldHVybiBbIFwiPFwiIC8qIExFU1NfVEhBTiAqLyAsIFwiPD1cIiAvKiBMRVNTX1RIQU5fT1JfRVFVQUwgKi8gLCBcIj5cIiAvKiBHUkVBVEVSX1RIQU4gKi8gLCBcIj49XCIgLyogR1JFQVRFUl9USEFOX09SX0VRVUFMICovICwgXCIhPVwiIC8qIE5PVF9FUVVBTCAqLyAsIFwibm90LWluXCIgLyogTk9UX0lOICovIF0uaW5kZXhPZih0aGlzLm9wKSA+PSAwO1xuICAgIH1cbn1cblxuY2xhc3Mgd2UgZXh0ZW5kcyBfZSB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbikge1xuICAgICAgICBzdXBlcih0LCBlLCBuKSwgdGhpcy5rZXkgPSB4dC5mcm9tTmFtZShuLnJlZmVyZW5jZVZhbHVlKTtcbiAgICB9XG4gICAgbWF0Y2hlcyh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB4dC5jb21wYXJhdG9yKHQua2V5LCB0aGlzLmtleSk7XG4gICAgICAgIHJldHVybiB0aGlzLnYoZSk7XG4gICAgfVxufVxuXG4vKiogRmlsdGVyIHRoYXQgbWF0Y2hlcyBvbiBrZXkgZmllbGRzIHdpdGhpbiBhbiBhcnJheS4gKi8gY2xhc3MgbWUgZXh0ZW5kcyBfZSB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICBzdXBlcih0LCBcImluXCIgLyogSU4gKi8gLCBlKSwgdGhpcy5rZXlzID0geWUoXCJpblwiIC8qIElOICovICwgZSk7XG4gICAgfVxuICAgIG1hdGNoZXModCkge1xuICAgICAgICByZXR1cm4gdGhpcy5rZXlzLnNvbWUoKGUgPT4gZS5pc0VxdWFsKHQua2V5KSkpO1xuICAgIH1cbn1cblxuLyoqIEZpbHRlciB0aGF0IG1hdGNoZXMgb24ga2V5IGZpZWxkcyBub3QgcHJlc2VudCB3aXRoaW4gYW4gYXJyYXkuICovIGNsYXNzIGdlIGV4dGVuZHMgX2Uge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgc3VwZXIodCwgXCJub3QtaW5cIiAvKiBOT1RfSU4gKi8gLCBlKSwgdGhpcy5rZXlzID0geWUoXCJub3QtaW5cIiAvKiBOT1RfSU4gKi8gLCBlKTtcbiAgICB9XG4gICAgbWF0Y2hlcyh0KSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5rZXlzLnNvbWUoKGUgPT4gZS5pc0VxdWFsKHQua2V5KSkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24geWUodCwgZSkge1xuICAgIHZhciBuO1xuICAgIHJldHVybiAoKG51bGwgPT09IChuID0gZS5hcnJheVZhbHVlKSB8fCB2b2lkIDAgPT09IG4gPyB2b2lkIDAgOiBuLnZhbHVlcykgfHwgW10pLm1hcCgodCA9PiB4dC5mcm9tTmFtZSh0LnJlZmVyZW5jZVZhbHVlKSkpO1xufVxuXG4vKiogQSBGaWx0ZXIgdGhhdCBpbXBsZW1lbnRzIHRoZSBhcnJheS1jb250YWlucyBvcGVyYXRvci4gKi8gY2xhc3MgcGUgZXh0ZW5kcyBfZSB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICBzdXBlcih0LCBcImFycmF5LWNvbnRhaW5zXCIgLyogQVJSQVlfQ09OVEFJTlMgKi8gLCBlKTtcbiAgICB9XG4gICAgbWF0Y2hlcyh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0LmRhdGEuZmllbGQodGhpcy5maWVsZCk7XG4gICAgICAgIHJldHVybiBHdChlKSAmJiAkdChlLmFycmF5VmFsdWUsIHRoaXMudmFsdWUpO1xuICAgIH1cbn1cblxuLyoqIEEgRmlsdGVyIHRoYXQgaW1wbGVtZW50cyB0aGUgSU4gb3BlcmF0b3IuICovIGNsYXNzIEllIGV4dGVuZHMgX2Uge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgc3VwZXIodCwgXCJpblwiIC8qIElOICovICwgZSk7XG4gICAgfVxuICAgIG1hdGNoZXModCkge1xuICAgICAgICBjb25zdCBlID0gdC5kYXRhLmZpZWxkKHRoaXMuZmllbGQpO1xuICAgICAgICByZXR1cm4gbnVsbCAhPT0gZSAmJiAkdCh0aGlzLnZhbHVlLmFycmF5VmFsdWUsIGUpO1xuICAgIH1cbn1cblxuLyoqIEEgRmlsdGVyIHRoYXQgaW1wbGVtZW50cyB0aGUgbm90LWluIG9wZXJhdG9yLiAqLyBjbGFzcyBUZSBleHRlbmRzIF9lIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKHQsIFwibm90LWluXCIgLyogTk9UX0lOICovICwgZSk7XG4gICAgfVxuICAgIG1hdGNoZXModCkge1xuICAgICAgICBpZiAoJHQodGhpcy52YWx1ZS5hcnJheVZhbHVlLCB7XG4gICAgICAgICAgICBudWxsVmFsdWU6IFwiTlVMTF9WQUxVRVwiXG4gICAgICAgIH0pKSByZXR1cm4gITE7XG4gICAgICAgIGNvbnN0IGUgPSB0LmRhdGEuZmllbGQodGhpcy5maWVsZCk7XG4gICAgICAgIHJldHVybiBudWxsICE9PSBlICYmICEkdCh0aGlzLnZhbHVlLmFycmF5VmFsdWUsIGUpO1xuICAgIH1cbn1cblxuLyoqIEEgRmlsdGVyIHRoYXQgaW1wbGVtZW50cyB0aGUgYXJyYXktY29udGFpbnMtYW55IG9wZXJhdG9yLiAqLyBjbGFzcyBFZSBleHRlbmRzIF9lIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKHQsIFwiYXJyYXktY29udGFpbnMtYW55XCIgLyogQVJSQVlfQ09OVEFJTlNfQU5ZICovICwgZSk7XG4gICAgfVxuICAgIG1hdGNoZXModCkge1xuICAgICAgICBjb25zdCBlID0gdC5kYXRhLmZpZWxkKHRoaXMuZmllbGQpO1xuICAgICAgICByZXR1cm4gISghR3QoZSkgfHwgIWUuYXJyYXlWYWx1ZS52YWx1ZXMpICYmIGUuYXJyYXlWYWx1ZS52YWx1ZXMuc29tZSgodCA9PiAkdCh0aGlzLnZhbHVlLmFycmF5VmFsdWUsIHQpKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBib3VuZCBvZiBhIHF1ZXJ5LlxuICpcbiAqIFRoZSBib3VuZCBpcyBzcGVjaWZpZWQgd2l0aCB0aGUgZ2l2ZW4gY29tcG9uZW50cyByZXByZXNlbnRpbmcgYSBwb3NpdGlvbiBhbmRcbiAqIHdoZXRoZXIgaXQncyBqdXN0IGJlZm9yZSBvciBqdXN0IGFmdGVyIHRoZSBwb3NpdGlvbiAocmVsYXRpdmUgdG8gd2hhdGV2ZXIgdGhlXG4gKiBxdWVyeSBvcmRlciBpcykuXG4gKlxuICogVGhlIHBvc2l0aW9uIHJlcHJlc2VudHMgYSBsb2dpY2FsIGluZGV4IHBvc2l0aW9uIGZvciBhIHF1ZXJ5LiBJdCdzIGEgcHJlZml4XG4gKiBvZiB2YWx1ZXMgZm9yIHRoZSAocG90ZW50aWFsbHkgaW1wbGljaXQpIG9yZGVyIGJ5IGNsYXVzZXMgb2YgYSBxdWVyeS5cbiAqXG4gKiBCb3VuZCBwcm92aWRlcyBhIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIGEgZG9jdW1lbnQgY29tZXMgYmVmb3JlIG9yXG4gKiBhZnRlciBhIGJvdW5kLiBUaGlzIGlzIGluZmx1ZW5jZWQgYnkgd2hldGhlciB0aGUgcG9zaXRpb24gaXMganVzdCBiZWZvcmUgb3JcbiAqIGp1c3QgYWZ0ZXIgdGhlIHByb3ZpZGVkIHZhbHVlcy5cbiAqLyBjbGFzcyBBZSB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gdCwgdGhpcy5pbmNsdXNpdmUgPSBlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBbiBvcmRlcmluZyBvbiBhIGZpZWxkLCBpbiBzb21lIERpcmVjdGlvbi4gRGlyZWN0aW9uIGRlZmF1bHRzIHRvIEFTQ0VORElORy5cbiAqLyBjbGFzcyBSZSB7XG4gICAgY29uc3RydWN0b3IodCwgZSA9IFwiYXNjXCIgLyogQVNDRU5ESU5HICovKSB7XG4gICAgICAgIHRoaXMuZmllbGQgPSB0LCB0aGlzLmRpciA9IGU7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBiZSh0LCBlKSB7XG4gICAgcmV0dXJuIHQuZGlyID09PSBlLmRpciAmJiB0LmZpZWxkLmlzRXF1YWwoZS5maWVsZCk7XG59XG5cbmZ1bmN0aW9uIFBlKHQsIGUsIG4pIHtcbiAgICBsZXQgcyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0LnBvc2l0aW9uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHIgPSBlW2ldLCBvID0gdC5wb3NpdGlvbltpXTtcbiAgICAgICAgaWYgKHIuZmllbGQuaXNLZXlGaWVsZCgpKSBzID0geHQuY29tcGFyYXRvcih4dC5mcm9tTmFtZShvLnJlZmVyZW5jZVZhbHVlKSwgbi5rZXkpOyBlbHNlIHtcbiAgICAgICAgICAgIHMgPSBGdChvLCBuLmRhdGEuZmllbGQoci5maWVsZCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcImRlc2NcIiAvKiBERVNDRU5ESU5HICovID09PSByLmRpciAmJiAocyAqPSAtMSksIDAgIT09IHMpIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gcztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYSBkb2N1bWVudCBzb3J0cyBhZnRlciBhIGJvdW5kIHVzaW5nIHRoZSBwcm92aWRlZCBzb3J0XG4gKiBvcmRlci5cbiAqLyBmdW5jdGlvbiBWZSh0LCBlKSB7XG4gICAgaWYgKG51bGwgPT09IHQpIHJldHVybiBudWxsID09PSBlO1xuICAgIGlmIChudWxsID09PSBlKSByZXR1cm4gITE7XG4gICAgaWYgKHQuaW5jbHVzaXZlICE9PSBlLmluY2x1c2l2ZSB8fCB0LnBvc2l0aW9uLmxlbmd0aCAhPT0gZS5wb3NpdGlvbi5sZW5ndGgpIHJldHVybiAhMTtcbiAgICBmb3IgKGxldCBuID0gMDsgbiA8IHQucG9zaXRpb24ubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgaWYgKCFPdCh0LnBvc2l0aW9uW25dLCBlLnBvc2l0aW9uW25dKSkgcmV0dXJuICExO1xuICAgIH1cbiAgICByZXR1cm4gITA7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFF1ZXJ5IGVuY2Fwc3VsYXRlcyBhbGwgdGhlIHF1ZXJ5IGF0dHJpYnV0ZXMgd2Ugc3VwcG9ydCBpbiB0aGUgU0RLLiBJdCBjYW5cbiAqIGJlIHJ1biBhZ2FpbnN0IHRoZSBMb2NhbFN0b3JlLCBhcyB3ZWxsIGFzIGJlIGNvbnZlcnRlZCB0byBhIGBUYXJnZXRgIHRvXG4gKiBxdWVyeSB0aGUgUmVtb3RlU3RvcmUgcmVzdWx0cy5cbiAqXG4gKiBWaXNpYmxlIGZvciB0ZXN0aW5nLlxuICovIGNsYXNzIHZlIHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyBhIFF1ZXJ5IHdpdGggYSBwYXRoIGFuZCBvcHRpb25hbCBhZGRpdGlvbmFsIHF1ZXJ5IGNvbnN0cmFpbnRzLlxuICAgICAqIFBhdGggbXVzdCBjdXJyZW50bHkgYmUgZW1wdHkgaWYgdGhpcyBpcyBhIGNvbGxlY3Rpb24gZ3JvdXAgcXVlcnkuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodCwgZSA9IG51bGwsIG4gPSBbXSwgcyA9IFtdLCBpID0gbnVsbCwgciA9IFwiRlwiIC8qIEZpcnN0ICovICwgbyA9IG51bGwsIGEgPSBudWxsKSB7XG4gICAgICAgIHRoaXMucGF0aCA9IHQsIHRoaXMuY29sbGVjdGlvbkdyb3VwID0gZSwgdGhpcy5leHBsaWNpdE9yZGVyQnkgPSBuLCB0aGlzLmZpbHRlcnMgPSBzLCBcbiAgICAgICAgdGhpcy5saW1pdCA9IGksIHRoaXMubGltaXRUeXBlID0gciwgdGhpcy5zdGFydEF0ID0gbywgdGhpcy5lbmRBdCA9IGEsIHRoaXMuRCA9IG51bGwsIFxuICAgICAgICAvLyBUaGUgY29ycmVzcG9uZGluZyBgVGFyZ2V0YCBvZiB0aGlzIGBRdWVyeWAgaW5zdGFuY2UuXG4gICAgICAgIHRoaXMuQyA9IG51bGwsIHRoaXMuc3RhcnRBdCwgdGhpcy5lbmRBdDtcbiAgICB9XG59XG5cbi8qKiBDcmVhdGVzIGEgbmV3IFF1ZXJ5IGluc3RhbmNlIHdpdGggdGhlIG9wdGlvbnMgcHJvdmlkZWQuICovIGZ1bmN0aW9uIFNlKHQsIGUsIG4sIHMsIGksIHIsIG8sIGEpIHtcbiAgICByZXR1cm4gbmV3IHZlKHQsIGUsIG4sIHMsIGksIHIsIG8sIGEpO1xufVxuXG4vKiogQ3JlYXRlcyBhIG5ldyBRdWVyeSBmb3IgYSBxdWVyeSB0aGF0IG1hdGNoZXMgYWxsIGRvY3VtZW50cyBhdCBgcGF0aGAgKi8gZnVuY3Rpb24gRGUodCkge1xuICAgIHJldHVybiBuZXcgdmUodCk7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGNvbnZlcnQgYSBjb2xsZWN0aW9uIGdyb3VwIHF1ZXJ5IGludG8gYSBjb2xsZWN0aW9uIHF1ZXJ5IGF0IGFcbiAqIHNwZWNpZmljIHBhdGguIFRoaXMgaXMgdXNlZCB3aGVuIGV4ZWN1dGluZyBjb2xsZWN0aW9uIGdyb3VwIHF1ZXJpZXMsIHNpbmNlXG4gKiB3ZSBoYXZlIHRvIHNwbGl0IHRoZSBxdWVyeSBpbnRvIGEgc2V0IG9mIGNvbGxlY3Rpb24gcXVlcmllcyBhdCBtdWx0aXBsZVxuICogcGF0aHMuXG4gKi8gZnVuY3Rpb24gQ2UodCkge1xuICAgIHJldHVybiAhU3QodC5saW1pdCkgJiYgXCJGXCIgLyogRmlyc3QgKi8gPT09IHQubGltaXRUeXBlO1xufVxuXG5mdW5jdGlvbiB4ZSh0KSB7XG4gICAgcmV0dXJuICFTdCh0LmxpbWl0KSAmJiBcIkxcIiAvKiBMYXN0ICovID09PSB0LmxpbWl0VHlwZTtcbn1cblxuZnVuY3Rpb24gTmUodCkge1xuICAgIHJldHVybiB0LmV4cGxpY2l0T3JkZXJCeS5sZW5ndGggPiAwID8gdC5leHBsaWNpdE9yZGVyQnlbMF0uZmllbGQgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBrZSh0KSB7XG4gICAgZm9yIChjb25zdCBlIG9mIHQuZmlsdGVycykgaWYgKGUuUygpKSByZXR1cm4gZS5maWVsZDtcbiAgICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYW55IG9mIHRoZSBwcm92aWRlZCBPcGVyYXRvcnMgYXJlIGluY2x1ZGVkIGluIHRoZSBxdWVyeSBhbmRcbiAqIHJldHVybnMgdGhlIGZpcnN0IG9uZSB0aGF0IGlzLCBvciBudWxsIGlmIG5vbmUgYXJlLlxuICovXG4vKipcbiAqIFJldHVybnMgd2hldGhlciB0aGUgcXVlcnkgbWF0Y2hlcyBhIGNvbGxlY3Rpb24gZ3JvdXAgcmF0aGVyIHRoYW4gYSBzcGVjaWZpY1xuICogY29sbGVjdGlvbi5cbiAqL1xuZnVuY3Rpb24gTWUodCkge1xuICAgIHJldHVybiBudWxsICE9PSB0LmNvbGxlY3Rpb25Hcm91cDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbXBsaWNpdCBvcmRlciBieSBjb25zdHJhaW50IHRoYXQgaXMgdXNlZCB0byBleGVjdXRlIHRoZSBRdWVyeSxcbiAqIHdoaWNoIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkZXIgYnkgY29uc3RyYWludHMgdGhlIHVzZXIgcHJvdmlkZWQgKGUuZy5cbiAqIHRoZSBTREsgYW5kIGJhY2tlbmQgYWx3YXlzIG9yZGVycyBieSBgX19uYW1lX19gKS5cbiAqLyBmdW5jdGlvbiBPZSh0KSB7XG4gICAgY29uc3QgZSA9IEsodCk7XG4gICAgaWYgKG51bGwgPT09IGUuRCkge1xuICAgICAgICBlLkQgPSBbXTtcbiAgICAgICAgY29uc3QgdCA9IGtlKGUpLCBuID0gTmUoZSk7XG4gICAgICAgIGlmIChudWxsICE9PSB0ICYmIG51bGwgPT09IG4pIFxuICAgICAgICAvLyBJbiBvcmRlciB0byBpbXBsaWNpdGx5IGFkZCBrZXkgb3JkZXJpbmcsIHdlIG11c3QgYWxzbyBhZGQgdGhlXG4gICAgICAgIC8vIGluZXF1YWxpdHkgZmlsdGVyIGZpZWxkIGZvciBpdCB0byBiZSBhIHZhbGlkIHF1ZXJ5LlxuICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIGRlZmF1bHQgaW5lcXVhbGl0eSBmaWVsZCBhbmQga2V5IG9yZGVyaW5nIGlzIGFzY2VuZGluZy5cbiAgICAgICAgdC5pc0tleUZpZWxkKCkgfHwgZS5ELnB1c2gobmV3IFJlKHQpKSwgZS5ELnB1c2gobmV3IFJlKG10LmtleUZpZWxkKCksIFwiYXNjXCIgLyogQVNDRU5ESU5HICovKSk7IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHQgPSAhMTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbiBvZiBlLmV4cGxpY2l0T3JkZXJCeSkgZS5ELnB1c2gobiksIG4uZmllbGQuaXNLZXlGaWVsZCgpICYmICh0ID0gITApO1xuICAgICAgICAgICAgaWYgKCF0KSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIG9yZGVyIG9mIHRoZSBpbXBsaWNpdCBrZXkgb3JkZXJpbmcgYWx3YXlzIG1hdGNoZXMgdGhlIGxhc3RcbiAgICAgICAgICAgICAgICAvLyBleHBsaWNpdCBvcmRlciBieVxuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBlLmV4cGxpY2l0T3JkZXJCeS5sZW5ndGggPiAwID8gZS5leHBsaWNpdE9yZGVyQnlbZS5leHBsaWNpdE9yZGVyQnkubGVuZ3RoIC0gMV0uZGlyIDogXCJhc2NcIiAvKiBBU0NFTkRJTkcgKi87XG4gICAgICAgICAgICAgICAgZS5ELnB1c2gobmV3IFJlKG10LmtleUZpZWxkKCksIHQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZS5EO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRoaXMgYFF1ZXJ5YCBpbnN0YW5jZSB0byBpdCdzIGNvcnJlc3BvbmRpbmcgYFRhcmdldGAgcmVwcmVzZW50YXRpb24uXG4gKi8gZnVuY3Rpb24gJGUodCkge1xuICAgIGNvbnN0IGUgPSBLKHQpO1xuICAgIGlmICghZS5DKSBpZiAoXCJGXCIgLyogRmlyc3QgKi8gPT09IGUubGltaXRUeXBlKSBlLkMgPSB1ZShlLnBhdGgsIGUuY29sbGVjdGlvbkdyb3VwLCBPZShlKSwgZS5maWx0ZXJzLCBlLmxpbWl0LCBlLnN0YXJ0QXQsIGUuZW5kQXQpOyBlbHNlIHtcbiAgICAgICAgLy8gRmxpcCB0aGUgb3JkZXJCeSBkaXJlY3Rpb25zIHNpbmNlIHdlIHdhbnQgdGhlIGxhc3QgcmVzdWx0c1xuICAgICAgICBjb25zdCB0ID0gW107XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiBPZShlKSkge1xuICAgICAgICAgICAgY29uc3QgZSA9IFwiZGVzY1wiIC8qIERFU0NFTkRJTkcgKi8gPT09IG4uZGlyID8gXCJhc2NcIiAvKiBBU0NFTkRJTkcgKi8gOiBcImRlc2NcIiAvKiBERVNDRU5ESU5HICovO1xuICAgICAgICAgICAgdC5wdXNoKG5ldyBSZShuLmZpZWxkLCBlKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgbmVlZCB0byBzd2FwIHRoZSBjdXJzb3JzIHRvIG1hdGNoIHRoZSBub3ctZmxpcHBlZCBxdWVyeSBvcmRlcmluZy5cbiAgICAgICAgICAgICAgICBjb25zdCBuID0gZS5lbmRBdCA/IG5ldyBBZShlLmVuZEF0LnBvc2l0aW9uLCAhZS5lbmRBdC5pbmNsdXNpdmUpIDogbnVsbCwgcyA9IGUuc3RhcnRBdCA/IG5ldyBBZShlLnN0YXJ0QXQucG9zaXRpb24sICFlLnN0YXJ0QXQuaW5jbHVzaXZlKSA6IG51bGw7XG4gICAgICAgIC8vIE5vdyByZXR1cm4gYXMgYSBMaW1pdFR5cGUuRmlyc3QgcXVlcnkuXG4gICAgICAgIGUuQyA9IHVlKGUucGF0aCwgZS5jb2xsZWN0aW9uR3JvdXAsIHQsIGUuZmlsdGVycywgZS5saW1pdCwgbiwgcyk7XG4gICAgfVxuICAgIHJldHVybiBlLkM7XG59XG5cbmZ1bmN0aW9uIEZlKHQsIGUsIG4pIHtcbiAgICByZXR1cm4gbmV3IHZlKHQucGF0aCwgdC5jb2xsZWN0aW9uR3JvdXAsIHQuZXhwbGljaXRPcmRlckJ5LnNsaWNlKCksIHQuZmlsdGVycy5zbGljZSgpLCBlLCBuLCB0LnN0YXJ0QXQsIHQuZW5kQXQpO1xufVxuXG5mdW5jdGlvbiBCZSh0LCBlKSB7XG4gICAgcmV0dXJuIGxlKCRlKHQpLCAkZShlKSkgJiYgdC5saW1pdFR5cGUgPT09IGUubGltaXRUeXBlO1xufVxuXG4vLyBUT0RPKGIvMjkxODMxNjUpOiBUaGlzIGlzIHVzZWQgdG8gZ2V0IGEgdW5pcXVlIHN0cmluZyBmcm9tIGEgcXVlcnkgdG8sIGZvclxuLy8gZXhhbXBsZSwgdXNlIGFzIGEgZGljdGlvbmFyeSBrZXksIGJ1dCB0aGUgaW1wbGVtZW50YXRpb24gaXMgc3ViamVjdCB0b1xuLy8gY29sbGlzaW9ucy4gTWFrZSBpdCBjb2xsaXNpb24tZnJlZS5cbmZ1bmN0aW9uIExlKHQpIHtcbiAgICByZXR1cm4gYCR7Y2UoJGUodCkpfXxsdDoke3QubGltaXRUeXBlfWA7XG59XG5cbmZ1bmN0aW9uIHFlKHQpIHtcbiAgICByZXR1cm4gYFF1ZXJ5KHRhcmdldD0ke2hlKCRlKHQpKX07IGxpbWl0VHlwZT0ke3QubGltaXRUeXBlfSlgO1xufVxuXG4vKiogUmV0dXJucyB3aGV0aGVyIGBkb2NgIG1hdGNoZXMgdGhlIGNvbnN0cmFpbnRzIG9mIGBxdWVyeWAuICovIGZ1bmN0aW9uIFVlKHQsIGUpIHtcbiAgICByZXR1cm4gZS5pc0ZvdW5kRG9jdW1lbnQoKSAmJiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBlLmtleS5wYXRoO1xuICAgICAgICByZXR1cm4gbnVsbCAhPT0gdC5jb2xsZWN0aW9uR3JvdXAgPyBlLmtleS5oYXNDb2xsZWN0aW9uSWQodC5jb2xsZWN0aW9uR3JvdXApICYmIHQucGF0aC5pc1ByZWZpeE9mKG4pIDogeHQuaXNEb2N1bWVudEtleSh0LnBhdGgpID8gdC5wYXRoLmlzRXF1YWwobikgOiB0LnBhdGguaXNJbW1lZGlhdGVQYXJlbnRPZihuKTtcbiAgICB9XG4gICAgLyoqXG4gKiBBIGRvY3VtZW50IG11c3QgaGF2ZSBhIHZhbHVlIGZvciBldmVyeSBvcmRlcmluZyBjbGF1c2UgaW4gb3JkZXIgdG8gc2hvdyB1cFxuICogaW4gdGhlIHJlc3VsdHMuXG4gKi8gKHQsIGUpICYmIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgZm9yIChjb25zdCBuIG9mIHQuZXhwbGljaXRPcmRlckJ5KSBcbiAgICAgICAgLy8gb3JkZXIgYnkga2V5IGFsd2F5cyBtYXRjaGVzXG4gICAgICAgIGlmICghbi5maWVsZC5pc0tleUZpZWxkKCkgJiYgbnVsbCA9PT0gZS5kYXRhLmZpZWxkKG4uZmllbGQpKSByZXR1cm4gITE7XG4gICAgICAgIHJldHVybiAhMDtcbiAgICB9KHQsIGUpICYmIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgZm9yIChjb25zdCBuIG9mIHQuZmlsdGVycykgaWYgKCFuLm1hdGNoZXMoZSkpIHJldHVybiAhMTtcbiAgICAgICAgcmV0dXJuICEwO1xuICAgIH1cbiAgICAvKiogTWFrZXMgc3VyZSBhIGRvY3VtZW50IGlzIHdpdGhpbiB0aGUgYm91bmRzLCBpZiBwcm92aWRlZC4gKi8gKHQsIGUpICYmIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgaWYgKHQuc3RhcnRBdCAmJiAhXG4gICAgICAgIC8qKlxuICogUmV0dXJucyB0cnVlIGlmIGEgZG9jdW1lbnQgc29ydHMgYmVmb3JlIGEgYm91bmQgdXNpbmcgdGhlIHByb3ZpZGVkIHNvcnRcbiAqIG9yZGVyLlxuICovXG4gICAgICAgIGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBQZSh0LCBlLCBuKTtcbiAgICAgICAgICAgIHJldHVybiB0LmluY2x1c2l2ZSA/IHMgPD0gMCA6IHMgPCAwO1xuICAgICAgICB9KHQuc3RhcnRBdCwgT2UodCksIGUpKSByZXR1cm4gITE7XG4gICAgICAgIGlmICh0LmVuZEF0ICYmICFmdW5jdGlvbih0LCBlLCBuKSB7XG4gICAgICAgICAgICBjb25zdCBzID0gUGUodCwgZSwgbik7XG4gICAgICAgICAgICByZXR1cm4gdC5pbmNsdXNpdmUgPyBzID49IDAgOiBzID4gMDtcbiAgICAgICAgfSh0LmVuZEF0LCBPZSh0KSwgZSkpIHJldHVybiAhMTtcbiAgICAgICAgcmV0dXJuICEwO1xuICAgIH1cbiAgICAvKipcbiAqIFJldHVybnMgYSBuZXcgY29tcGFyYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbXBhcmUgdHdvIGRvY3VtZW50c1xuICogYmFzZWQgb24gdGhlIFF1ZXJ5J3Mgb3JkZXJpbmcgY29uc3RyYWludC5cbiAqLyAodCwgZSk7XG59XG5cbmZ1bmN0aW9uIEtlKHQpIHtcbiAgICByZXR1cm4gKGUsIG4pID0+IHtcbiAgICAgICAgbGV0IHMgPSAhMTtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIE9lKHQpKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gR2UoaSwgZSwgbik7XG4gICAgICAgICAgICBpZiAoMCAhPT0gdCkgcmV0dXJuIHQ7XG4gICAgICAgICAgICBzID0gcyB8fCBpLmZpZWxkLmlzS2V5RmllbGQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBHZSh0LCBlLCBuKSB7XG4gICAgY29uc3QgcyA9IHQuZmllbGQuaXNLZXlGaWVsZCgpID8geHQuY29tcGFyYXRvcihlLmtleSwgbi5rZXkpIDogZnVuY3Rpb24odCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gZS5kYXRhLmZpZWxkKHQpLCBpID0gbi5kYXRhLmZpZWxkKHQpO1xuICAgICAgICByZXR1cm4gbnVsbCAhPT0gcyAmJiBudWxsICE9PSBpID8gRnQocywgaSkgOiBMKCk7XG4gICAgfVxuICAgIC8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4gICAgLyoqXG4gKiBUaGUgaW5pdGlhbCBtdXRhdGlvbiBiYXRjaCBpZCBmb3IgZWFjaCBpbmRleC4gR2V0cyB1cGRhdGVkIGR1cmluZyBpbmRleFxuICogYmFja2ZpbGwuXG4gKi8gKHQuZmllbGQsIGUsIG4pO1xuICAgIHN3aXRjaCAodC5kaXIpIHtcbiAgICAgIGNhc2UgXCJhc2NcIiAvKiBBU0NFTkRJTkcgKi8gOlxuICAgICAgICByZXR1cm4gcztcblxuICAgICAgY2FzZSBcImRlc2NcIiAvKiBERVNDRU5ESU5HICovIDpcbiAgICAgICAgcmV0dXJuIC0xICogcztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIEwoKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFJldHVybnMgYW4gRG91YmxlVmFsdWUgZm9yIGB2YWx1ZWAgdGhhdCBpcyBlbmNvZGVkIGJhc2VkIHRoZSBzZXJpYWxpemVyJ3NcbiAqIGB1c2VQcm90bzNKc29uYCBzZXR0aW5nLlxuICovIGZ1bmN0aW9uIFFlKHQsIGUpIHtcbiAgICBpZiAodC5OKSB7XG4gICAgICAgIGlmIChpc05hTihlKSkgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvdWJsZVZhbHVlOiBcIk5hTlwiXG4gICAgICAgIH07XG4gICAgICAgIGlmIChlID09PSAxIC8gMCkgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvdWJsZVZhbHVlOiBcIkluZmluaXR5XCJcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGUgPT09IC0xIC8gMCkgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvdWJsZVZhbHVlOiBcIi1JbmZpbml0eVwiXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGRvdWJsZVZhbHVlOiBEdChlKSA/IFwiLTBcIiA6IGVcbiAgICB9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYW4gSW50ZWdlclZhbHVlIGZvciBgdmFsdWVgLlxuICovIGZ1bmN0aW9uIGplKHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbnRlZ2VyVmFsdWU6IFwiXCIgKyB0XG4gICAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgdmFsdWUgZm9yIGEgbnVtYmVyIHRoYXQncyBhcHByb3ByaWF0ZSB0byBwdXQgaW50byBhIHByb3RvLlxuICogVGhlIHJldHVybiB2YWx1ZSBpcyBhbiBJbnRlZ2VyVmFsdWUgaWYgaXQgY2FuIHNhZmVseSByZXByZXNlbnQgdGhlIHZhbHVlLFxuICogb3RoZXJ3aXNlIGEgRG91YmxlVmFsdWUgaXMgcmV0dXJuZWQuXG4gKi8gZnVuY3Rpb24gV2UodCwgZSkge1xuICAgIHJldHVybiBDdChlKSA/IGplKGUpIDogUWUodCwgZSk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogVXNlZCB0byByZXByZXNlbnQgYSBmaWVsZCB0cmFuc2Zvcm0gb24gYSBtdXRhdGlvbi4gKi8gY2xhc3MgemUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgc3RydWN0dXJhbCB0eXBlIG9mIGBUcmFuc2Zvcm1PcGVyYXRpb25gIGlzIHVuaXF1ZS5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTQ1MVxuICAgICAgICB0aGlzLl8gPSB2b2lkIDA7XG4gICAgfVxufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBsb2NhbCB0cmFuc2Zvcm0gcmVzdWx0IGFnYWluc3QgdGhlIHByb3ZpZGVkIGBwcmV2aW91c1ZhbHVlYCxcbiAqIG9wdGlvbmFsbHkgdXNpbmcgdGhlIHByb3ZpZGVkIGxvY2FsV3JpdGVUaW1lLlxuICovIGZ1bmN0aW9uIEhlKHQsIGUsIG4pIHtcbiAgICByZXR1cm4gdCBpbnN0YW5jZW9mIFhlID8gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICBjb25zdCBuID0ge1xuICAgICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICAgICAgX190eXBlX186IHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IFwic2VydmVyX3RpbWVzdGFtcFwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBfX2xvY2FsX3dyaXRlX3RpbWVfXzoge1xuICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBWYWx1ZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kczogdC5zZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFub3M6IHQubmFub3NlY29uZHNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGUgJiYgKG4uZmllbGRzLl9fcHJldmlvdXNfdmFsdWVfXyA9IGUpLCB7XG4gICAgICAgICAgICBtYXBWYWx1ZTogblxuICAgICAgICB9O1xuICAgIH0obiwgZSkgOiB0IGluc3RhbmNlb2YgWmUgPyB0bih0LCBlKSA6IHQgaW5zdGFuY2VvZiBlbiA/IG5uKHQsIGUpIDogZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAvLyBQT1JUSU5HIE5PVEU6IFNpbmNlIEphdmFTY3JpcHQncyBpbnRlZ2VyIGFyaXRobWV0aWMgaXMgbGltaXRlZCB0byA1MyBiaXRcbiAgICAgICAgLy8gcHJlY2lzaW9uIGFuZCByZXNvbHZlcyBvdmVyZmxvd3MgYnkgcmVkdWNpbmcgcHJlY2lzaW9uLCB3ZSBkbyBub3RcbiAgICAgICAgLy8gbWFudWFsbHkgY2FwIG92ZXJmbG93cyBhdCAyXjYzLlxuICAgICAgICBjb25zdCBuID0gWWUodCwgZSksIHMgPSBybihuKSArIHJuKHQuayk7XG4gICAgICAgIHJldHVybiBLdChuKSAmJiBLdCh0LmspID8gamUocykgOiBRZSh0Lk0sIHMpO1xuICAgIH0odCwgZSk7XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgYSBmaW5hbCB0cmFuc2Zvcm0gcmVzdWx0IGFmdGVyIHRoZSB0cmFuc2Zvcm0gaGFzIGJlZW4gYWNrbm93bGVkZ2VkXG4gKiBieSB0aGUgc2VydmVyLCBwb3RlbnRpYWxseSB1c2luZyB0aGUgc2VydmVyLXByb3ZpZGVkIHRyYW5zZm9ybVJlc3VsdC5cbiAqLyBmdW5jdGlvbiBKZSh0LCBlLCBuKSB7XG4gICAgLy8gVGhlIHNlcnZlciBqdXN0IHNlbmRzIG51bGwgYXMgdGhlIHRyYW5zZm9ybSByZXN1bHQgZm9yIGFycmF5IG9wZXJhdGlvbnMsXG4gICAgLy8gc28gd2UgaGF2ZSB0byBjYWxjdWxhdGUgYSByZXN1bHQgdGhlIHNhbWUgYXMgd2UgZG8gZm9yIGxvY2FsXG4gICAgLy8gYXBwbGljYXRpb25zLlxuICAgIHJldHVybiB0IGluc3RhbmNlb2YgWmUgPyB0bih0LCBlKSA6IHQgaW5zdGFuY2VvZiBlbiA/IG5uKHQsIGUpIDogbjtcbn1cblxuLyoqXG4gKiBJZiB0aGlzIHRyYW5zZm9ybSBvcGVyYXRpb24gaXMgbm90IGlkZW1wb3RlbnQsIHJldHVybnMgdGhlIGJhc2UgdmFsdWUgdG9cbiAqIHBlcnNpc3QgZm9yIHRoaXMgdHJhbnNmb3JtLiBJZiBhIGJhc2UgdmFsdWUgaXMgcmV0dXJuZWQsIHRoZSB0cmFuc2Zvcm1cbiAqIG9wZXJhdGlvbiBpcyBhbHdheXMgYXBwbGllZCB0byB0aGlzIGJhc2UgdmFsdWUsIGV2ZW4gaWYgZG9jdW1lbnQgaGFzXG4gKiBhbHJlYWR5IGJlZW4gdXBkYXRlZC5cbiAqXG4gKiBCYXNlIHZhbHVlcyBwcm92aWRlIGNvbnNpc3RlbnQgYmVoYXZpb3IgZm9yIG5vbi1pZGVtcG90ZW50IHRyYW5zZm9ybXMgYW5kXG4gKiBhbGxvdyB1cyB0byByZXR1cm4gdGhlIHNhbWUgbGF0ZW5jeS1jb21wZW5zYXRlZCB2YWx1ZSBldmVuIGlmIHRoZSBiYWNrZW5kXG4gKiBoYXMgYWxyZWFkeSBhcHBsaWVkIHRoZSB0cmFuc2Zvcm0gb3BlcmF0aW9uLiBUaGUgYmFzZSB2YWx1ZSBpcyBudWxsIGZvclxuICogaWRlbXBvdGVudCB0cmFuc2Zvcm1zLCBhcyB0aGV5IGNhbiBiZSByZS1wbGF5ZWQgZXZlbiBpZiB0aGUgYmFja2VuZCBoYXNcbiAqIGFscmVhZHkgYXBwbGllZCB0aGVtLlxuICpcbiAqIEByZXR1cm5zIGEgYmFzZSB2YWx1ZSB0byBzdG9yZSBhbG9uZyB3aXRoIHRoZSBtdXRhdGlvbiwgb3IgbnVsbCBmb3JcbiAqIGlkZW1wb3RlbnQgdHJhbnNmb3Jtcy5cbiAqLyBmdW5jdGlvbiBZZSh0LCBlKSB7XG4gICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBzbiA/IEt0KG4gPSBlKSB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIHJldHVybiAhIXQgJiYgXCJkb3VibGVWYWx1ZVwiIGluIHQ7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBlaXRoZXIgYW4gSW50ZWdlclZhbHVlIG9yIGEgRG91YmxlVmFsdWUuICovIChuKSA/IGUgOiB7XG4gICAgICAgIGludGVnZXJWYWx1ZTogMFxuICAgIH0gOiBudWxsO1xuICAgIHZhciBuO1xufVxuXG4vKiogVHJhbnNmb3JtcyBhIHZhbHVlIGludG8gYSBzZXJ2ZXItZ2VuZXJhdGVkIHRpbWVzdGFtcC4gKi9cbmNsYXNzIFhlIGV4dGVuZHMgemUge31cblxuLyoqIFRyYW5zZm9ybXMgYW4gYXJyYXkgdmFsdWUgdmlhIGEgdW5pb24gb3BlcmF0aW9uLiAqLyBjbGFzcyBaZSBleHRlbmRzIHplIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMuZWxlbWVudHMgPSB0O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdG4odCwgZSkge1xuICAgIGNvbnN0IG4gPSBvbihlKTtcbiAgICBmb3IgKGNvbnN0IGUgb2YgdC5lbGVtZW50cykgbi5zb21lKCh0ID0+IE90KHQsIGUpKSkgfHwgbi5wdXNoKGUpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGFycmF5VmFsdWU6IHtcbiAgICAgICAgICAgIHZhbHVlczogblxuICAgICAgICB9XG4gICAgfTtcbn1cblxuLyoqIFRyYW5zZm9ybXMgYW4gYXJyYXkgdmFsdWUgdmlhIGEgcmVtb3ZlIG9wZXJhdGlvbi4gKi8gY2xhc3MgZW4gZXh0ZW5kcyB6ZSB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICBzdXBlcigpLCB0aGlzLmVsZW1lbnRzID0gdDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG5uKHQsIGUpIHtcbiAgICBsZXQgbiA9IG9uKGUpO1xuICAgIGZvciAoY29uc3QgZSBvZiB0LmVsZW1lbnRzKSBuID0gbi5maWx0ZXIoKHQgPT4gIU90KHQsIGUpKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYXJyYXlWYWx1ZToge1xuICAgICAgICAgICAgdmFsdWVzOiBuXG4gICAgICAgIH1cbiAgICB9O1xufVxuXG4vKipcbiAqIEltcGxlbWVudHMgdGhlIGJhY2tlbmQgc2VtYW50aWNzIGZvciBsb2NhbGx5IGNvbXB1dGVkIE5VTUVSSUNfQUREIChpbmNyZW1lbnQpXG4gKiB0cmFuc2Zvcm1zLiBDb252ZXJ0cyBhbGwgZmllbGQgdmFsdWVzIHRvIGludGVnZXJzIG9yIGRvdWJsZXMsIGJ1dCB1bmxpa2UgdGhlXG4gKiBiYWNrZW5kIGRvZXMgbm90IGNhcCBpbnRlZ2VyIHZhbHVlcyBhdCAyXjYzLiBJbnN0ZWFkLCBKYXZhU2NyaXB0IG51bWJlclxuICogYXJpdGhtZXRpYyBpcyB1c2VkIGFuZCBwcmVjaXNpb24gbG9zcyBjYW4gb2NjdXIgZm9yIHZhbHVlcyBncmVhdGVyIHRoYW4gMl41My5cbiAqLyBjbGFzcyBzbiBleHRlbmRzIHplIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMuTSA9IHQsIHRoaXMuayA9IGU7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBybih0KSB7XG4gICAgcmV0dXJuIEV0KHQuaW50ZWdlclZhbHVlIHx8IHQuZG91YmxlVmFsdWUpO1xufVxuXG5mdW5jdGlvbiBvbih0KSB7XG4gICAgcmV0dXJuIEd0KHQpICYmIHQuYXJyYXlWYWx1ZS52YWx1ZXMgPyB0LmFycmF5VmFsdWUudmFsdWVzLnNsaWNlKCkgOiBbXTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKiBBIGZpZWxkIHBhdGggYW5kIHRoZSBUcmFuc2Zvcm1PcGVyYXRpb24gdG8gcGVyZm9ybSB1cG9uIGl0LiAqLyBjbGFzcyBhbiB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLmZpZWxkID0gdCwgdGhpcy50cmFuc2Zvcm0gPSBlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdW4odCwgZSkge1xuICAgIHJldHVybiB0LmZpZWxkLmlzRXF1YWwoZS5maWVsZCkgJiYgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICByZXR1cm4gdCBpbnN0YW5jZW9mIFplICYmIGUgaW5zdGFuY2VvZiBaZSB8fCB0IGluc3RhbmNlb2YgZW4gJiYgZSBpbnN0YW5jZW9mIGVuID8gb3QodC5lbGVtZW50cywgZS5lbGVtZW50cywgT3QpIDogdCBpbnN0YW5jZW9mIHNuICYmIGUgaW5zdGFuY2VvZiBzbiA/IE90KHQuaywgZS5rKSA6IHQgaW5zdGFuY2VvZiBYZSAmJiBlIGluc3RhbmNlb2YgWGU7XG4gICAgfSh0LnRyYW5zZm9ybSwgZS50cmFuc2Zvcm0pO1xufVxuXG4vKiogVGhlIHJlc3VsdCBvZiBzdWNjZXNzZnVsbHkgYXBwbHlpbmcgYSBtdXRhdGlvbiB0byB0aGUgYmFja2VuZC4gKi9cbmNsYXNzIGNuIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyc2lvbiBhdCB3aGljaCB0aGUgbXV0YXRpb24gd2FzIGNvbW1pdHRlZDpcbiAgICAgKlxuICAgICAqIC0gRm9yIG1vc3Qgb3BlcmF0aW9ucywgdGhpcyBpcyB0aGUgdXBkYXRlVGltZSBpbiB0aGUgV3JpdGVSZXN1bHQuXG4gICAgICogLSBGb3IgZGVsZXRlcywgdGhlIGNvbW1pdFRpbWUgb2YgdGhlIFdyaXRlUmVzcG9uc2UgKGJlY2F1c2UgZGVsZXRlcyBhcmVcbiAgICAgKiAgIG5vdCBzdG9yZWQgYW5kIGhhdmUgbm8gdXBkYXRlVGltZSkuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdGhlc2UgdmVyc2lvbnMgY2FuIGJlIGRpZmZlcmVudDogTm8tb3Agd3JpdGVzIHdpbGwgbm90IGNoYW5nZVxuICAgICAqIHRoZSB1cGRhdGVUaW1lIGV2ZW4gdGhvdWdoIHRoZSBjb21taXRUaW1lIGFkdmFuY2VzLlxuICAgICAqL1xuICAgIHQsIFxuICAgIC8qKlxuICAgICAqIFRoZSByZXN1bHRpbmcgZmllbGRzIHJldHVybmVkIGZyb20gdGhlIGJhY2tlbmQgYWZ0ZXIgYSBtdXRhdGlvblxuICAgICAqIGNvbnRhaW5pbmcgZmllbGQgdHJhbnNmb3JtcyBoYXMgYmVlbiBjb21taXR0ZWQuIENvbnRhaW5zIG9uZSBGaWVsZFZhbHVlXG4gICAgICogZm9yIGVhY2ggRmllbGRUcmFuc2Zvcm0gdGhhdCB3YXMgaW4gdGhlIG11dGF0aW9uLlxuICAgICAqXG4gICAgICogV2lsbCBiZSBlbXB0eSBpZiB0aGUgbXV0YXRpb24gZGlkIG5vdCBjb250YWluIGFueSBmaWVsZCB0cmFuc2Zvcm1zLlxuICAgICAqL1xuICAgIGUpIHtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gdCwgdGhpcy50cmFuc2Zvcm1SZXN1bHRzID0gZTtcbiAgICB9XG59XG5cbi8qKlxuICogRW5jb2RlcyBhIHByZWNvbmRpdGlvbiBmb3IgYSBtdXRhdGlvbi4gVGhpcyBmb2xsb3dzIHRoZSBtb2RlbCB0aGF0IHRoZVxuICogYmFja2VuZCBhY2NlcHRzIHdpdGggdGhlIHNwZWNpYWwgY2FzZSBvZiBhbiBleHBsaWNpdCBcImVtcHR5XCIgcHJlY29uZGl0aW9uXG4gKiAobWVhbmluZyBubyBwcmVjb25kaXRpb24pLlxuICovIGNsYXNzIGhuIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMudXBkYXRlVGltZSA9IHQsIHRoaXMuZXhpc3RzID0gZTtcbiAgICB9XG4gICAgLyoqIENyZWF0ZXMgYSBuZXcgZW1wdHkgUHJlY29uZGl0aW9uLiAqLyAgICBzdGF0aWMgbm9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBobjtcbiAgICB9XG4gICAgLyoqIENyZWF0ZXMgYSBuZXcgUHJlY29uZGl0aW9uIHdpdGggYW4gZXhpc3RzIGZsYWcuICovICAgIHN0YXRpYyBleGlzdHModCkge1xuICAgICAgICByZXR1cm4gbmV3IGhuKHZvaWQgMCwgdCk7XG4gICAgfVxuICAgIC8qKiBDcmVhdGVzIGEgbmV3IFByZWNvbmRpdGlvbiBiYXNlZCBvbiBhIHZlcnNpb24gYSBkb2N1bWVudCBleGlzdHMgYXQuICovICAgIHN0YXRpYyB1cGRhdGVUaW1lKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBobih0KTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgd2hldGhlciB0aGlzIFByZWNvbmRpdGlvbiBpcyBlbXB0eS4gKi8gICAgZ2V0IGlzTm9uZSgpIHtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gdGhpcy51cGRhdGVUaW1lICYmIHZvaWQgMCA9PT0gdGhpcy5leGlzdHM7XG4gICAgfVxuICAgIGlzRXF1YWwodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5leGlzdHMgPT09IHQuZXhpc3RzICYmICh0aGlzLnVwZGF0ZVRpbWUgPyAhIXQudXBkYXRlVGltZSAmJiB0aGlzLnVwZGF0ZVRpbWUuaXNFcXVhbCh0LnVwZGF0ZVRpbWUpIDogIXQudXBkYXRlVGltZSk7XG4gICAgfVxufVxuXG4vKiogUmV0dXJucyB0cnVlIGlmIHRoZSBwcmVjb25kaXRpb25zIGlzIHZhbGlkIGZvciB0aGUgZ2l2ZW4gZG9jdW1lbnQuICovIGZ1bmN0aW9uIGxuKHQsIGUpIHtcbiAgICByZXR1cm4gdm9pZCAwICE9PSB0LnVwZGF0ZVRpbWUgPyBlLmlzRm91bmREb2N1bWVudCgpICYmIGUudmVyc2lvbi5pc0VxdWFsKHQudXBkYXRlVGltZSkgOiB2b2lkIDAgPT09IHQuZXhpc3RzIHx8IHQuZXhpc3RzID09PSBlLmlzRm91bmREb2N1bWVudCgpO1xufVxuXG4vKipcbiAqIEEgbXV0YXRpb24gZGVzY3JpYmVzIGEgc2VsZi1jb250YWluZWQgY2hhbmdlIHRvIGEgZG9jdW1lbnQuIE11dGF0aW9ucyBjYW5cbiAqIGNyZWF0ZSwgcmVwbGFjZSwgZGVsZXRlLCBhbmQgdXBkYXRlIHN1YnNldHMgb2YgZG9jdW1lbnRzLlxuICpcbiAqIE11dGF0aW9ucyBub3Qgb25seSBhY3Qgb24gdGhlIHZhbHVlIG9mIHRoZSBkb2N1bWVudCBidXQgYWxzbyBpdHMgdmVyc2lvbi5cbiAqXG4gKiBGb3IgbG9jYWwgbXV0YXRpb25zIChtdXRhdGlvbnMgdGhhdCBoYXZlbid0IGJlZW4gY29tbWl0dGVkIHlldCksIHdlIHByZXNlcnZlXG4gKiB0aGUgZXhpc3RpbmcgdmVyc2lvbiBmb3IgU2V0IGFuZCBQYXRjaCBtdXRhdGlvbnMuIEZvciBEZWxldGUgbXV0YXRpb25zLCB3ZVxuICogcmVzZXQgdGhlIHZlcnNpb24gdG8gMC5cbiAqXG4gKiBIZXJlJ3MgdGhlIGV4cGVjdGVkIHRyYW5zaXRpb24gdGFibGUuXG4gKlxuICogTVVUQVRJT04gICAgICAgICAgIEFQUExJRUQgVE8gICAgICAgICAgICBSRVNVTFRTIElOXG4gKlxuICogU2V0TXV0YXRpb24gICAgICAgIERvY3VtZW50KHYzKSAgICAgICAgICBEb2N1bWVudCh2MylcbiAqIFNldE11dGF0aW9uICAgICAgICBOb0RvY3VtZW50KHYzKSAgICAgICAgRG9jdW1lbnQodjApXG4gKiBTZXRNdXRhdGlvbiAgICAgICAgSW52YWxpZERvY3VtZW50KHYwKSAgIERvY3VtZW50KHYwKVxuICogUGF0Y2hNdXRhdGlvbiAgICAgIERvY3VtZW50KHYzKSAgICAgICAgICBEb2N1bWVudCh2MylcbiAqIFBhdGNoTXV0YXRpb24gICAgICBOb0RvY3VtZW50KHYzKSAgICAgICAgTm9Eb2N1bWVudCh2MylcbiAqIFBhdGNoTXV0YXRpb24gICAgICBJbnZhbGlkRG9jdW1lbnQodjApICAgVW5rbm93bkRvY3VtZW50KHYzKVxuICogRGVsZXRlTXV0YXRpb24gICAgIERvY3VtZW50KHYzKSAgICAgICAgICBOb0RvY3VtZW50KHYwKVxuICogRGVsZXRlTXV0YXRpb24gICAgIE5vRG9jdW1lbnQodjMpICAgICAgICBOb0RvY3VtZW50KHYwKVxuICogRGVsZXRlTXV0YXRpb24gICAgIEludmFsaWREb2N1bWVudCh2MCkgICBOb0RvY3VtZW50KHYwKVxuICpcbiAqIEZvciBhY2tub3dsZWRnZWQgbXV0YXRpb25zLCB3ZSB1c2UgdGhlIHVwZGF0ZVRpbWUgb2YgdGhlIFdyaXRlUmVzcG9uc2UgYXNcbiAqIHRoZSByZXN1bHRpbmcgdmVyc2lvbiBmb3IgU2V0IGFuZCBQYXRjaCBtdXRhdGlvbnMuIEFzIGRlbGV0ZXMgaGF2ZSBub1xuICogZXhwbGljaXQgdXBkYXRlIHRpbWUsIHdlIHVzZSB0aGUgY29tbWl0VGltZSBvZiB0aGUgV3JpdGVSZXNwb25zZSBmb3JcbiAqIERlbGV0ZSBtdXRhdGlvbnMuXG4gKlxuICogSWYgYSBtdXRhdGlvbiBpcyBhY2tub3dsZWRnZWQgYnkgdGhlIGJhY2tlbmQgYnV0IGZhaWxzIHRoZSBwcmVjb25kaXRpb24gY2hlY2tcbiAqIGxvY2FsbHksIHdlIHRyYW5zaXRpb24gdG8gYW4gYFVua25vd25Eb2N1bWVudGAgYW5kIHJlbHkgb24gV2F0Y2ggdG8gc2VuZCB1c1xuICogdGhlIHVwZGF0ZWQgdmVyc2lvbi5cbiAqXG4gKiBGaWVsZCB0cmFuc2Zvcm1zIGFyZSB1c2VkIG9ubHkgd2l0aCBQYXRjaCBhbmQgU2V0IE11dGF0aW9ucy4gV2UgdXNlIHRoZVxuICogYHVwZGF0ZVRyYW5zZm9ybXNgIG1lc3NhZ2UgdG8gc3RvcmUgdHJhbnNmb3JtcywgcmF0aGVyIHRoYW4gdGhlIGB0cmFuc2Zvcm1zYHNcbiAqIG1lc3NhZ2VzLlxuICpcbiAqICMjIFN1YmNsYXNzaW5nIE5vdGVzXG4gKlxuICogRXZlcnkgdHlwZSBvZiBtdXRhdGlvbiBuZWVkcyB0byBpbXBsZW1lbnQgaXRzIG93biBhcHBseVRvUmVtb3RlRG9jdW1lbnQoKSBhbmRcbiAqIGFwcGx5VG9Mb2NhbFZpZXcoKSB0byBpbXBsZW1lbnQgdGhlIGFjdHVhbCBiZWhhdmlvciBvZiBhcHBseWluZyB0aGUgbXV0YXRpb25cbiAqIHRvIHNvbWUgc291cmNlIGRvY3VtZW50IChzZWUgYHNldE11dGF0aW9uQXBwbHlUb1JlbW90ZURvY3VtZW50KClgIGZvciBhblxuICogZXhhbXBsZSkuXG4gKi8gY2xhc3MgZm4ge31cblxuLyoqXG4gKiBBcHBsaWVzIHRoaXMgbXV0YXRpb24gdG8gdGhlIGdpdmVuIGRvY3VtZW50IGZvciB0aGUgcHVycG9zZXMgb2YgY29tcHV0aW5nIGFcbiAqIG5ldyByZW1vdGUgZG9jdW1lbnQuIElmIHRoZSBpbnB1dCBkb2N1bWVudCBkb2Vzbid0IG1hdGNoIHRoZSBleHBlY3RlZCBzdGF0ZVxuICogKGUuZy4gaXQgaXMgaW52YWxpZCBvciBvdXRkYXRlZCksIHRoZSBkb2N1bWVudCB0eXBlIG1heSB0cmFuc2l0aW9uIHRvXG4gKiB1bmtub3duLlxuICpcbiAqIEBwYXJhbSBtdXRhdGlvbiAtIFRoZSBtdXRhdGlvbiB0byBhcHBseS5cbiAqIEBwYXJhbSBkb2N1bWVudCAtIFRoZSBkb2N1bWVudCB0byBtdXRhdGUuIFRoZSBpbnB1dCBkb2N1bWVudCBjYW4gYmUgYW5cbiAqICAgICBpbnZhbGlkIGRvY3VtZW50IGlmIHRoZSBjbGllbnQgaGFzIG5vIGtub3dsZWRnZSBvZiB0aGUgcHJlLW11dGF0aW9uIHN0YXRlXG4gKiAgICAgb2YgdGhlIGRvY3VtZW50LlxuICogQHBhcmFtIG11dGF0aW9uUmVzdWx0IC0gVGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgbXV0YXRpb24gZnJvbSB0aGUgYmFja2VuZC5cbiAqLyBmdW5jdGlvbiBkbih0LCBlLCBuKSB7XG4gICAgdCBpbnN0YW5jZW9mIHluID8gZnVuY3Rpb24odCwgZSwgbikge1xuICAgICAgICAvLyBVbmxpa2Ugc2V0TXV0YXRpb25BcHBseVRvTG9jYWxWaWV3LCBpZiB3ZSdyZSBhcHBseWluZyBhIG11dGF0aW9uIHRvIGFcbiAgICAgICAgLy8gcmVtb3RlIGRvY3VtZW50IHRoZSBzZXJ2ZXIgaGFzIGFjY2VwdGVkIHRoZSBtdXRhdGlvbiBzbyB0aGUgcHJlY29uZGl0aW9uXG4gICAgICAgIC8vIG11c3QgaGF2ZSBoZWxkLlxuICAgICAgICBjb25zdCBzID0gdC52YWx1ZS5jbG9uZSgpLCBpID0gVG4odC5maWVsZFRyYW5zZm9ybXMsIGUsIG4udHJhbnNmb3JtUmVzdWx0cyk7XG4gICAgICAgIHMuc2V0QWxsKGkpLCBlLmNvbnZlcnRUb0ZvdW5kRG9jdW1lbnQobi52ZXJzaW9uLCBzKS5zZXRIYXNDb21taXR0ZWRNdXRhdGlvbnMoKTtcbiAgICB9KHQsIGUsIG4pIDogdCBpbnN0YW5jZW9mIHBuID8gZnVuY3Rpb24odCwgZSwgbikge1xuICAgICAgICBpZiAoIWxuKHQucHJlY29uZGl0aW9uLCBlKSkgXG4gICAgICAgIC8vIFNpbmNlIHRoZSBtdXRhdGlvbiB3YXMgbm90IHJlamVjdGVkLCB3ZSBrbm93IHRoYXQgdGhlIHByZWNvbmRpdGlvblxuICAgICAgICAvLyBtYXRjaGVkIG9uIHRoZSBiYWNrZW5kLiBXZSB0aGVyZWZvcmUgbXVzdCBub3QgaGF2ZSB0aGUgZXhwZWN0ZWQgdmVyc2lvblxuICAgICAgICAvLyBvZiB0aGUgZG9jdW1lbnQgaW4gb3VyIGNhY2hlIGFuZCBjb252ZXJ0IHRvIGFuIFVua25vd25Eb2N1bWVudCB3aXRoIGFcbiAgICAgICAgLy8ga25vd24gdXBkYXRlVGltZS5cbiAgICAgICAgcmV0dXJuIHZvaWQgZS5jb252ZXJ0VG9Vbmtub3duRG9jdW1lbnQobi52ZXJzaW9uKTtcbiAgICAgICAgY29uc3QgcyA9IFRuKHQuZmllbGRUcmFuc2Zvcm1zLCBlLCBuLnRyYW5zZm9ybVJlc3VsdHMpLCBpID0gZS5kYXRhO1xuICAgICAgICBpLnNldEFsbChJbih0KSksIGkuc2V0QWxsKHMpLCBlLmNvbnZlcnRUb0ZvdW5kRG9jdW1lbnQobi52ZXJzaW9uLCBpKS5zZXRIYXNDb21taXR0ZWRNdXRhdGlvbnMoKTtcbiAgICB9KHQsIGUsIG4pIDogZnVuY3Rpb24odCwgZSwgbikge1xuICAgICAgICAvLyBVbmxpa2UgYXBwbHlUb0xvY2FsVmlldywgaWYgd2UncmUgYXBwbHlpbmcgYSBtdXRhdGlvbiB0byBhIHJlbW90ZVxuICAgICAgICAvLyBkb2N1bWVudCB0aGUgc2VydmVyIGhhcyBhY2NlcHRlZCB0aGUgbXV0YXRpb24gc28gdGhlIHByZWNvbmRpdGlvbiBtdXN0XG4gICAgICAgIC8vIGhhdmUgaGVsZC5cbiAgICAgICAgZS5jb252ZXJ0VG9Ob0RvY3VtZW50KG4udmVyc2lvbikuc2V0SGFzQ29tbWl0dGVkTXV0YXRpb25zKCk7XG4gICAgfSgwLCBlLCBuKTtcbn1cblxuLyoqXG4gKiBBcHBsaWVzIHRoaXMgbXV0YXRpb24gdG8gdGhlIGdpdmVuIGRvY3VtZW50IGZvciB0aGUgcHVycG9zZXMgb2YgY29tcHV0aW5nXG4gKiB0aGUgbmV3IGxvY2FsIHZpZXcgb2YgYSBkb2N1bWVudC4gSWYgdGhlIGlucHV0IGRvY3VtZW50IGRvZXNuJ3QgbWF0Y2ggdGhlXG4gKiBleHBlY3RlZCBzdGF0ZSwgdGhlIGRvY3VtZW50IGlzIG5vdCBtb2RpZmllZC5cbiAqXG4gKiBAcGFyYW0gbXV0YXRpb24gLSBUaGUgbXV0YXRpb24gdG8gYXBwbHkuXG4gKiBAcGFyYW0gZG9jdW1lbnQgLSBUaGUgZG9jdW1lbnQgdG8gbXV0YXRlLiBUaGUgaW5wdXQgZG9jdW1lbnQgY2FuIGJlIGFuXG4gKiAgICAgaW52YWxpZCBkb2N1bWVudCBpZiB0aGUgY2xpZW50IGhhcyBubyBrbm93bGVkZ2Ugb2YgdGhlIHByZS1tdXRhdGlvbiBzdGF0ZVxuICogICAgIG9mIHRoZSBkb2N1bWVudC5cbiAqIEBwYXJhbSBsb2NhbFdyaXRlVGltZSAtIEEgdGltZXN0YW1wIGluZGljYXRpbmcgdGhlIGxvY2FsIHdyaXRlIHRpbWUgb2YgdGhlXG4gKiAgICAgYmF0Y2ggdGhpcyBtdXRhdGlvbiBpcyBhIHBhcnQgb2YuXG4gKi8gZnVuY3Rpb24gX24odCwgZSwgbikge1xuICAgIHQgaW5zdGFuY2VvZiB5biA/IGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgaWYgKCFsbih0LnByZWNvbmRpdGlvbiwgZSkpIFxuICAgICAgICAvLyBUaGUgbXV0YXRpb24gZmFpbGVkIHRvIGFwcGx5IChlLmcuIGEgZG9jdW1lbnQgSUQgY3JlYXRlZCB3aXRoIGFkZCgpXG4gICAgICAgIC8vIGNhdXNlZCBhIG5hbWUgY29sbGlzaW9uKS5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCBzID0gdC52YWx1ZS5jbG9uZSgpLCBpID0gRW4odC5maWVsZFRyYW5zZm9ybXMsIG4sIGUpO1xuICAgICAgICBzLnNldEFsbChpKSwgZS5jb252ZXJ0VG9Gb3VuZERvY3VtZW50KGduKGUpLCBzKS5zZXRIYXNMb2NhbE11dGF0aW9ucygpO1xuICAgIH1cbiAgICAvKipcbiAqIEEgbXV0YXRpb24gdGhhdCBtb2RpZmllcyBmaWVsZHMgb2YgdGhlIGRvY3VtZW50IGF0IHRoZSBnaXZlbiBrZXkgd2l0aCB0aGVcbiAqIGdpdmVuIHZhbHVlcy4gVGhlIHZhbHVlcyBhcmUgYXBwbGllZCB0aHJvdWdoIGEgZmllbGQgbWFzazpcbiAqXG4gKiAgKiBXaGVuIGEgZmllbGQgaXMgaW4gYm90aCB0aGUgbWFzayBhbmQgdGhlIHZhbHVlcywgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGRcbiAqICAgIGlzIHVwZGF0ZWQuXG4gKiAgKiBXaGVuIGEgZmllbGQgaXMgaW4gbmVpdGhlciB0aGUgbWFzayBub3IgdGhlIHZhbHVlcywgdGhlIGNvcnJlc3BvbmRpbmdcbiAqICAgIGZpZWxkIGlzIHVubW9kaWZpZWQuXG4gKiAgKiBXaGVuIGEgZmllbGQgaXMgaW4gdGhlIG1hc2sgYnV0IG5vdCBpbiB0aGUgdmFsdWVzLCB0aGUgY29ycmVzcG9uZGluZyBmaWVsZFxuICogICAgaXMgZGVsZXRlZC5cbiAqICAqIFdoZW4gYSBmaWVsZCBpcyBub3QgaW4gdGhlIG1hc2sgYnV0IGlzIGluIHRoZSB2YWx1ZXMsIHRoZSB2YWx1ZXMgbWFwIGlzXG4gKiAgICBpZ25vcmVkLlxuICovICh0LCBlLCBuKSA6IHQgaW5zdGFuY2VvZiBwbiA/IGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgaWYgKCFsbih0LnByZWNvbmRpdGlvbiwgZSkpIHJldHVybjtcbiAgICAgICAgY29uc3QgcyA9IEVuKHQuZmllbGRUcmFuc2Zvcm1zLCBuLCBlKSwgaSA9IGUuZGF0YTtcbiAgICAgICAgaS5zZXRBbGwoSW4odCkpLCBpLnNldEFsbChzKSwgZS5jb252ZXJ0VG9Gb3VuZERvY3VtZW50KGduKGUpLCBpKS5zZXRIYXNMb2NhbE11dGF0aW9ucygpO1xuICAgIH1cbiAgICAvKipcbiAqIFJldHVybnMgYSBGaWVsZFBhdGgvVmFsdWUgbWFwIHdpdGggdGhlIGNvbnRlbnQgb2YgdGhlIFBhdGNoTXV0YXRpb24uXG4gKi8gKHQsIGUsIG4pIDogZnVuY3Rpb24odCwgZSkge1xuICAgICAgICBsbih0LnByZWNvbmRpdGlvbiwgZSkgJiYgXG4gICAgICAgIC8vIFdlIGRvbid0IGNhbGwgYHNldEhhc0xvY2FsTXV0YXRpb25zKClgIHNpbmNlIHdlIHdhbnQgdG8gYmUgYmFja3dhcmRzXG4gICAgICAgIC8vIGNvbXBhdGlibGUgd2l0aCB0aGUgZXhpc3RpbmcgU0RLIGJlaGF2aW9yLlxuICAgICAgICBlLmNvbnZlcnRUb05vRG9jdW1lbnQoY3QubWluKCkpO1xuICAgIH1cbiAgICAvKipcbiAqIEEgbXV0YXRpb24gdGhhdCB2ZXJpZmllcyB0aGUgZXhpc3RlbmNlIG9mIHRoZSBkb2N1bWVudCBhdCB0aGUgZ2l2ZW4ga2V5IHdpdGhcbiAqIHRoZSBwcm92aWRlZCBwcmVjb25kaXRpb24uXG4gKlxuICogVGhlIGB2ZXJpZnlgIG9wZXJhdGlvbiBpcyBvbmx5IHVzZWQgaW4gVHJhbnNhY3Rpb25zLCBhbmQgdGhpcyBjbGFzcyBzZXJ2ZXNcbiAqIHByaW1hcmlseSB0byBmYWNpbGl0YXRlIHNlcmlhbGl6YXRpb24gaW50byBwcm90b3MuXG4gKi8gKHQsIGUpO1xufVxuXG4vKipcbiAqIElmIHRoaXMgbXV0YXRpb24gaXMgbm90IGlkZW1wb3RlbnQsIHJldHVybnMgdGhlIGJhc2UgdmFsdWUgdG8gcGVyc2lzdCB3aXRoXG4gKiB0aGlzIG11dGF0aW9uLiBJZiBhIGJhc2UgdmFsdWUgaXMgcmV0dXJuZWQsIHRoZSBtdXRhdGlvbiBpcyBhbHdheXMgYXBwbGllZFxuICogdG8gdGhpcyBiYXNlIHZhbHVlLCBldmVuIGlmIGRvY3VtZW50IGhhcyBhbHJlYWR5IGJlZW4gdXBkYXRlZC5cbiAqXG4gKiBUaGUgYmFzZSB2YWx1ZSBpcyBhIHNwYXJzZSBvYmplY3QgdGhhdCBjb25zaXN0cyBvZiBvbmx5IHRoZSBkb2N1bWVudFxuICogZmllbGRzIGZvciB3aGljaCB0aGlzIG11dGF0aW9uIGNvbnRhaW5zIGEgbm9uLWlkZW1wb3RlbnQgdHJhbnNmb3JtYXRpb25cbiAqIChlLmcuIGEgbnVtZXJpYyBpbmNyZW1lbnQpLiBUaGUgcHJvdmlkZWQgdmFsdWUgZ3VhcmFudGVlcyBjb25zaXN0ZW50XG4gKiBiZWhhdmlvciBmb3Igbm9uLWlkZW1wb3RlbnQgdHJhbnNmb3JtcyBhbmQgYWxsb3cgdXMgdG8gcmV0dXJuIHRoZSBzYW1lXG4gKiBsYXRlbmN5LWNvbXBlbnNhdGVkIHZhbHVlIGV2ZW4gaWYgdGhlIGJhY2tlbmQgaGFzIGFscmVhZHkgYXBwbGllZCB0aGVcbiAqIG11dGF0aW9uLiBUaGUgYmFzZSB2YWx1ZSBpcyBudWxsIGZvciBpZGVtcG90ZW50IG11dGF0aW9ucywgYXMgdGhleSBjYW4gYmVcbiAqIHJlLXBsYXllZCBldmVuIGlmIHRoZSBiYWNrZW5kIGhhcyBhbHJlYWR5IGFwcGxpZWQgdGhlbS5cbiAqXG4gKiBAcmV0dXJucyBhIGJhc2UgdmFsdWUgdG8gc3RvcmUgYWxvbmcgd2l0aCB0aGUgbXV0YXRpb24sIG9yIG51bGwgZm9yXG4gKiBpZGVtcG90ZW50IG11dGF0aW9ucy5cbiAqLyBmdW5jdGlvbiB3bih0LCBlKSB7XG4gICAgbGV0IG4gPSBudWxsO1xuICAgIGZvciAoY29uc3QgcyBvZiB0LmZpZWxkVHJhbnNmb3Jtcykge1xuICAgICAgICBjb25zdCB0ID0gZS5kYXRhLmZpZWxkKHMuZmllbGQpLCBpID0gWWUocy50cmFuc2Zvcm0sIHQgfHwgbnVsbCk7XG4gICAgICAgIG51bGwgIT0gaSAmJiAobnVsbCA9PSBuICYmIChuID0gWHQuZW1wdHkoKSksIG4uc2V0KHMuZmllbGQsIGkpKTtcbiAgICB9XG4gICAgcmV0dXJuIG4gfHwgbnVsbDtcbn1cblxuZnVuY3Rpb24gbW4odCwgZSkge1xuICAgIHJldHVybiB0LnR5cGUgPT09IGUudHlwZSAmJiAoISF0LmtleS5pc0VxdWFsKGUua2V5KSAmJiAoISF0LnByZWNvbmRpdGlvbi5pc0VxdWFsKGUucHJlY29uZGl0aW9uKSAmJiAoISFmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIHJldHVybiB2b2lkIDAgPT09IHQgJiYgdm9pZCAwID09PSBlIHx8ICEoIXQgfHwgIWUpICYmIG90KHQsIGUsICgodCwgZSkgPT4gdW4odCwgZSkpKTtcbiAgICB9KHQuZmllbGRUcmFuc2Zvcm1zLCBlLmZpZWxkVHJhbnNmb3JtcykgJiYgKDAgLyogU2V0ICovID09PSB0LnR5cGUgPyB0LnZhbHVlLmlzRXF1YWwoZS52YWx1ZSkgOiAxIC8qIFBhdGNoICovICE9PSB0LnR5cGUgfHwgdC5kYXRhLmlzRXF1YWwoZS5kYXRhKSAmJiB0LmZpZWxkTWFzay5pc0VxdWFsKGUuZmllbGRNYXNrKSkpKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdmVyc2lvbiBmcm9tIHRoZSBnaXZlbiBkb2N1bWVudCBmb3IgdXNlIGFzIHRoZSByZXN1bHQgb2YgYVxuICogbXV0YXRpb24uIE11dGF0aW9ucyBhcmUgZGVmaW5lZCB0byByZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIGJhc2UgZG9jdW1lbnRcbiAqIG9ubHkgaWYgaXQgaXMgYW4gZXhpc3RpbmcgZG9jdW1lbnQuIERlbGV0ZWQgYW5kIHVua25vd24gZG9jdW1lbnRzIGhhdmUgYVxuICogcG9zdC1tdXRhdGlvbiB2ZXJzaW9uIG9mIFNuYXBzaG90VmVyc2lvbi5taW4oKS5cbiAqLyBmdW5jdGlvbiBnbih0KSB7XG4gICAgcmV0dXJuIHQuaXNGb3VuZERvY3VtZW50KCkgPyB0LnZlcnNpb24gOiBjdC5taW4oKTtcbn1cblxuLyoqXG4gKiBBIG11dGF0aW9uIHRoYXQgY3JlYXRlcyBvciByZXBsYWNlcyB0aGUgZG9jdW1lbnQgYXQgdGhlIGdpdmVuIGtleSB3aXRoIHRoZVxuICogb2JqZWN0IHZhbHVlIGNvbnRlbnRzLlxuICovIGNsYXNzIHluIGV4dGVuZHMgZm4ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMgPSBbXSkge1xuICAgICAgICBzdXBlcigpLCB0aGlzLmtleSA9IHQsIHRoaXMudmFsdWUgPSBlLCB0aGlzLnByZWNvbmRpdGlvbiA9IG4sIHRoaXMuZmllbGRUcmFuc2Zvcm1zID0gcywgXG4gICAgICAgIHRoaXMudHlwZSA9IDAgLyogU2V0ICovO1xuICAgIH1cbn1cblxuY2xhc3MgcG4gZXh0ZW5kcyBmbiB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgcywgaSA9IFtdKSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMua2V5ID0gdCwgdGhpcy5kYXRhID0gZSwgdGhpcy5maWVsZE1hc2sgPSBuLCB0aGlzLnByZWNvbmRpdGlvbiA9IHMsIFxuICAgICAgICB0aGlzLmZpZWxkVHJhbnNmb3JtcyA9IGksIHRoaXMudHlwZSA9IDEgLyogUGF0Y2ggKi87XG4gICAgfVxufVxuXG5mdW5jdGlvbiBJbih0KSB7XG4gICAgY29uc3QgZSA9IG5ldyBNYXA7XG4gICAgcmV0dXJuIHQuZmllbGRNYXNrLmZpZWxkcy5mb3JFYWNoKChuID0+IHtcbiAgICAgICAgaWYgKCFuLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgY29uc3QgcyA9IHQuZGF0YS5maWVsZChuKTtcbiAgICAgICAgICAgIGUuc2V0KG4sIHMpO1xuICAgICAgICB9XG4gICAgfSkpLCBlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsaXN0IG9mIFwidHJhbnNmb3JtIHJlc3VsdHNcIiAoYSB0cmFuc2Zvcm0gcmVzdWx0IGlzIGEgZmllbGQgdmFsdWVcbiAqIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIGEgdHJhbnNmb3JtKSBmb3IgdXNlIGFmdGVyIGEgbXV0YXRpb25cbiAqIGNvbnRhaW5pbmcgdHJhbnNmb3JtcyBoYXMgYmVlbiBhY2tub3dsZWRnZWQgYnkgdGhlIHNlcnZlci5cbiAqXG4gKiBAcGFyYW0gZmllbGRUcmFuc2Zvcm1zIC0gVGhlIGZpZWxkIHRyYW5zZm9ybXMgdG8gYXBwbHkgdGhlIHJlc3VsdCB0by5cbiAqIEBwYXJhbSBtdXRhYmxlRG9jdW1lbnQgLSBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZG9jdW1lbnQgYWZ0ZXIgYXBwbHlpbmcgYWxsXG4gKiBwcmV2aW91cyBtdXRhdGlvbnMuXG4gKiBAcGFyYW0gc2VydmVyVHJhbnNmb3JtUmVzdWx0cyAtIFRoZSB0cmFuc2Zvcm0gcmVzdWx0cyByZWNlaXZlZCBieSB0aGUgc2VydmVyLlxuICogQHJldHVybnMgVGhlIHRyYW5zZm9ybSByZXN1bHRzIGxpc3QuXG4gKi8gZnVuY3Rpb24gVG4odCwgZSwgbikge1xuICAgIGNvbnN0IHMgPSBuZXcgTWFwO1xuICAgIHEodC5sZW5ndGggPT09IG4ubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgciA9IHRbaV0sIG8gPSByLnRyYW5zZm9ybSwgYSA9IGUuZGF0YS5maWVsZChyLmZpZWxkKTtcbiAgICAgICAgcy5zZXQoci5maWVsZCwgSmUobywgYSwgbltpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gcztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbGlzdCBvZiBcInRyYW5zZm9ybSByZXN1bHRzXCIgKGEgdHJhbnNmb3JtIHJlc3VsdCBpcyBhIGZpZWxkIHZhbHVlXG4gKiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdCBvZiBhcHBseWluZyBhIHRyYW5zZm9ybSkgZm9yIHVzZSB3aGVuIGFwcGx5aW5nIGFcbiAqIHRyYW5zZm9ybSBsb2NhbGx5LlxuICpcbiAqIEBwYXJhbSBmaWVsZFRyYW5zZm9ybXMgLSBUaGUgZmllbGQgdHJhbnNmb3JtcyB0byBhcHBseSB0aGUgcmVzdWx0IHRvLlxuICogQHBhcmFtIGxvY2FsV3JpdGVUaW1lIC0gVGhlIGxvY2FsIHRpbWUgb2YgdGhlIG11dGF0aW9uICh1c2VkIHRvXG4gKiAgICAgZ2VuZXJhdGUgU2VydmVyVGltZXN0YW1wVmFsdWVzKS5cbiAqIEBwYXJhbSBtdXRhYmxlRG9jdW1lbnQgLSBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZG9jdW1lbnQgYWZ0ZXIgYXBwbHlpbmcgYWxsXG4gKiAgICAgcHJldmlvdXMgbXV0YXRpb25zLlxuICogQHJldHVybnMgVGhlIHRyYW5zZm9ybSByZXN1bHRzIGxpc3QuXG4gKi8gZnVuY3Rpb24gRW4odCwgZSwgbikge1xuICAgIGNvbnN0IHMgPSBuZXcgTWFwO1xuICAgIGZvciAoY29uc3QgaSBvZiB0KSB7XG4gICAgICAgIGNvbnN0IHQgPSBpLnRyYW5zZm9ybSwgciA9IG4uZGF0YS5maWVsZChpLmZpZWxkKTtcbiAgICAgICAgcy5zZXQoaS5maWVsZCwgSGUodCwgciwgZSkpO1xuICAgIH1cbiAgICByZXR1cm4gcztcbn1cblxuLyoqIEEgbXV0YXRpb24gdGhhdCBkZWxldGVzIHRoZSBkb2N1bWVudCBhdCB0aGUgZ2l2ZW4ga2V5LiAqLyBjbGFzcyBBbiBleHRlbmRzIGZuIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMua2V5ID0gdCwgdGhpcy5wcmVjb25kaXRpb24gPSBlLCB0aGlzLnR5cGUgPSAyIC8qIERlbGV0ZSAqLyAsIHRoaXMuZmllbGRUcmFuc2Zvcm1zID0gW107XG4gICAgfVxufVxuXG5jbGFzcyBSbiBleHRlbmRzIGZuIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMua2V5ID0gdCwgdGhpcy5wcmVjb25kaXRpb24gPSBlLCB0aGlzLnR5cGUgPSAzIC8qIFZlcmlmeSAqLyAsIHRoaXMuZmllbGRUcmFuc2Zvcm1zID0gW107XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjbGFzcyBibiB7XG4gICAgLy8gVE9ETyhiLzMzMDc4MTYzKToganVzdCB1c2Ugc2ltcGxlc3QgZm9ybSBvZiBleGlzdGVuY2UgZmlsdGVyIGZvciBub3dcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMuY291bnQgPSB0O1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogRXJyb3IgQ29kZXMgZGVzY3JpYmluZyB0aGUgZGlmZmVyZW50IHdheXMgR1JQQyBjYW4gZmFpbC4gVGhlc2UgYXJlIGNvcGllZFxuICogZGlyZWN0bHkgZnJvbSBHUlBDJ3Mgc291cmNlcyBoZXJlOlxuICpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ncnBjL2dycGMvYmxvYi9iY2VlYzk0ZWE0ZmM1ZjAwODVkODEyMzVkOGUxYzA2Nzk4ZGMzNDFhL2luY2x1ZGUvZ3JwYyUyQiUyQi9pbXBsL2NvZGVnZW4vc3RhdHVzX2NvZGVfZW51bS5oXG4gKlxuICogSW1wb3J0YW50ISBUaGUgbmFtZXMgb2YgdGhlc2UgaWRlbnRpZmllcnMgbWF0dGVyIGJlY2F1c2UgdGhlIHN0cmluZyBmb3Jtc1xuICogYXJlIHVzZWQgZm9yIHJldmVyc2UgbG9va3VwcyBmcm9tIHRoZSB3ZWJjaGFubmVsIHN0cmVhbS4gRG8gTk9UIGNoYW5nZSB0aGVcbiAqIG5hbWVzIG9mIHRoZXNlIGlkZW50aWZpZXJzIG9yIGNoYW5nZSB0aGlzIGludG8gYSBjb25zdCBlbnVtLlxuICovIHZhciBQbiwgVm47XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGVycm9yIGNvZGUgcmVwcmVzZW50cyBhIHBlcm1hbmVudCBlcnJvciB3aGVuIHJlY2VpdmVkXG4gKiBpbiByZXNwb25zZSB0byBhIG5vbi13cml0ZSBvcGVyYXRpb24uXG4gKlxuICogU2VlIGlzUGVybWFuZW50V3JpdGVFcnJvciBmb3IgY2xhc3NpZnlpbmcgd3JpdGUgZXJyb3JzLlxuICovXG5mdW5jdGlvbiB2bih0KSB7XG4gICAgc3dpdGNoICh0KSB7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gTCgpO1xuXG4gICAgICBjYXNlIEcuQ0FOQ0VMTEVEOlxuICAgICAgY2FzZSBHLlVOS05PV046XG4gICAgICBjYXNlIEcuREVBRExJTkVfRVhDRUVERUQ6XG4gICAgICBjYXNlIEcuUkVTT1VSQ0VfRVhIQVVTVEVEOlxuICAgICAgY2FzZSBHLklOVEVSTkFMOlxuICAgICAgY2FzZSBHLlVOQVZBSUxBQkxFOlxuIC8vIFVuYXV0aGVudGljYXRlZCBtZWFucyBzb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIG91ciB0b2tlbiBhbmQgd2UgbmVlZFxuICAgICAgICAvLyB0byByZXRyeSB3aXRoIG5ldyBjcmVkZW50aWFscyB3aGljaCB3aWxsIGhhcHBlbiBhdXRvbWF0aWNhbGx5LlxuICAgICAgICAgICAgICBjYXNlIEcuVU5BVVRIRU5USUNBVEVEOlxuICAgICAgICByZXR1cm4gITE7XG5cbiAgICAgIGNhc2UgRy5JTlZBTElEX0FSR1VNRU5UOlxuICAgICAgY2FzZSBHLk5PVF9GT1VORDpcbiAgICAgIGNhc2UgRy5BTFJFQURZX0VYSVNUUzpcbiAgICAgIGNhc2UgRy5QRVJNSVNTSU9OX0RFTklFRDpcbiAgICAgIGNhc2UgRy5GQUlMRURfUFJFQ09ORElUSU9OOlxuIC8vIEFib3J0ZWQgbWlnaHQgYmUgcmV0cmllZCBpbiBzb21lIHNjZW5hcmlvcywgYnV0IHRoYXQgaXMgZGVwZW5kYW50IG9uXG4gICAgICAgIC8vIHRoZSBjb250ZXh0IGFuZCBzaG91bGQgaGFuZGxlZCBpbmRpdmlkdWFsbHkgYnkgdGhlIGNhbGxpbmcgY29kZS5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS9hcGlzL2Rlc2lnbi9lcnJvcnMuXG4gICAgICAgICAgICAgIGNhc2UgRy5BQk9SVEVEOlxuICAgICAgY2FzZSBHLk9VVF9PRl9SQU5HRTpcbiAgICAgIGNhc2UgRy5VTklNUExFTUVOVEVEOlxuICAgICAgY2FzZSBHLkRBVEFfTE9TUzpcbiAgICAgICAgcmV0dXJuICEwO1xuICAgIH1cbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gZXJyb3IgY29kZSByZXByZXNlbnRzIGEgcGVybWFuZW50IGVycm9yIHdoZW4gcmVjZWl2ZWRcbiAqIGluIHJlc3BvbnNlIHRvIGEgd3JpdGUgb3BlcmF0aW9uLlxuICpcbiAqIFdyaXRlIG9wZXJhdGlvbnMgbXVzdCBiZSBoYW5kbGVkIHNwZWNpYWxseSBiZWNhdXNlIGFzIG9mIGIvMTE5NDM3NzY0LCBBQk9SVEVEXG4gKiBlcnJvcnMgb24gdGhlIHdyaXRlIHN0cmVhbSBzaG91bGQgYmUgcmV0cmllZCB0b28gKGV2ZW4gdGhvdWdoIEFCT1JURUQgZXJyb3JzXG4gKiBhcmUgbm90IGdlbmVyYWxseSByZXRyeWFibGUpLlxuICpcbiAqIE5vdGUgdGhhdCBkdXJpbmcgdGhlIGluaXRpYWwgaGFuZHNoYWtlIG9uIHRoZSB3cml0ZSBzdHJlYW0gYW4gQUJPUlRFRCBlcnJvclxuICogc2lnbmFscyB0aGF0IHdlIHNob3VsZCBkaXNjYXJkIG91ciBzdHJlYW0gdG9rZW4gKGkuZS4gaXQgaXMgcGVybWFuZW50KS4gVGhpc1xuICogbWVhbnMgYSBoYW5kc2hha2UgZXJyb3Igc2hvdWxkIGJlIGNsYXNzaWZpZWQgd2l0aCBpc1Blcm1hbmVudEVycm9yLCBhYm92ZS5cbiAqL1xuLyoqXG4gKiBNYXBzIGFuIGVycm9yIENvZGUgZnJvbSBHUlBDIHN0YXR1cyBjb2RlIG51bWJlciwgbGlrZSAwLCAxLCBvciAxNC4gVGhlc2VcbiAqIGFyZSBub3QgdGhlIHNhbWUgYXMgSFRUUCBzdGF0dXMgY29kZXMuXG4gKlxuICogQHJldHVybnMgVGhlIENvZGUgZXF1aXZhbGVudCB0byB0aGUgZ2l2ZW4gR1JQQyBzdGF0dXMgY29kZS4gRmFpbHMgaWYgdGhlcmVcbiAqICAgICBpcyBubyBtYXRjaC5cbiAqL1xuZnVuY3Rpb24gU24odCkge1xuICAgIGlmICh2b2lkIDAgPT09IHQpIFxuICAgIC8vIFRoaXMgc2hvdWxkbid0IG5vcm1hbGx5IGhhcHBlbiwgYnV0IGluIGNlcnRhaW4gZXJyb3IgY2FzZXMgKGxpa2UgdHJ5aW5nXG4gICAgLy8gdG8gc2VuZCBpbnZhbGlkIHByb3RvIG1lc3NhZ2VzKSB3ZSBtYXkgZ2V0IGFuIGVycm9yIHdpdGggbm8gR1JQQyBjb2RlLlxuICAgIHJldHVybiAkKFwiR1JQQyBlcnJvciBoYXMgbm8gLmNvZGVcIiksIEcuVU5LTk9XTjtcbiAgICBzd2l0Y2ggKHQpIHtcbiAgICAgIGNhc2UgUG4uT0s6XG4gICAgICAgIHJldHVybiBHLk9LO1xuXG4gICAgICBjYXNlIFBuLkNBTkNFTExFRDpcbiAgICAgICAgcmV0dXJuIEcuQ0FOQ0VMTEVEO1xuXG4gICAgICBjYXNlIFBuLlVOS05PV046XG4gICAgICAgIHJldHVybiBHLlVOS05PV047XG5cbiAgICAgIGNhc2UgUG4uREVBRExJTkVfRVhDRUVERUQ6XG4gICAgICAgIHJldHVybiBHLkRFQURMSU5FX0VYQ0VFREVEO1xuXG4gICAgICBjYXNlIFBuLlJFU09VUkNFX0VYSEFVU1RFRDpcbiAgICAgICAgcmV0dXJuIEcuUkVTT1VSQ0VfRVhIQVVTVEVEO1xuXG4gICAgICBjYXNlIFBuLklOVEVSTkFMOlxuICAgICAgICByZXR1cm4gRy5JTlRFUk5BTDtcblxuICAgICAgY2FzZSBQbi5VTkFWQUlMQUJMRTpcbiAgICAgICAgcmV0dXJuIEcuVU5BVkFJTEFCTEU7XG5cbiAgICAgIGNhc2UgUG4uVU5BVVRIRU5USUNBVEVEOlxuICAgICAgICByZXR1cm4gRy5VTkFVVEhFTlRJQ0FURUQ7XG5cbiAgICAgIGNhc2UgUG4uSU5WQUxJRF9BUkdVTUVOVDpcbiAgICAgICAgcmV0dXJuIEcuSU5WQUxJRF9BUkdVTUVOVDtcblxuICAgICAgY2FzZSBQbi5OT1RfRk9VTkQ6XG4gICAgICAgIHJldHVybiBHLk5PVF9GT1VORDtcblxuICAgICAgY2FzZSBQbi5BTFJFQURZX0VYSVNUUzpcbiAgICAgICAgcmV0dXJuIEcuQUxSRUFEWV9FWElTVFM7XG5cbiAgICAgIGNhc2UgUG4uUEVSTUlTU0lPTl9ERU5JRUQ6XG4gICAgICAgIHJldHVybiBHLlBFUk1JU1NJT05fREVOSUVEO1xuXG4gICAgICBjYXNlIFBuLkZBSUxFRF9QUkVDT05ESVRJT046XG4gICAgICAgIHJldHVybiBHLkZBSUxFRF9QUkVDT05ESVRJT047XG5cbiAgICAgIGNhc2UgUG4uQUJPUlRFRDpcbiAgICAgICAgcmV0dXJuIEcuQUJPUlRFRDtcblxuICAgICAgY2FzZSBQbi5PVVRfT0ZfUkFOR0U6XG4gICAgICAgIHJldHVybiBHLk9VVF9PRl9SQU5HRTtcblxuICAgICAgY2FzZSBQbi5VTklNUExFTUVOVEVEOlxuICAgICAgICByZXR1cm4gRy5VTklNUExFTUVOVEVEO1xuXG4gICAgICBjYXNlIFBuLkRBVEFfTE9TUzpcbiAgICAgICAgcmV0dXJuIEcuREFUQV9MT1NTO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gTCgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBIVFRQIHJlc3BvbnNlJ3MgZXJyb3Igc3RhdHVzIHRvIHRoZSBlcXVpdmFsZW50IGVycm9yIGNvZGUuXG4gKlxuICogQHBhcmFtIHN0YXR1cyAtIEFuIEhUVFAgZXJyb3IgcmVzcG9uc2Ugc3RhdHVzIChcIkZBSUxFRF9QUkVDT05ESVRJT05cIixcbiAqIFwiVU5LTk9XTlwiLCBldGMuKVxuICogQHJldHVybnMgVGhlIGVxdWl2YWxlbnQgQ29kZS4gTm9uLW1hdGNoaW5nIHJlc3BvbnNlcyBhcmUgbWFwcGVkIHRvXG4gKiAgICAgQ29kZS5VTktOT1dOLlxuICovIChWbiA9IFBuIHx8IChQbiA9IHt9KSlbVm4uT0sgPSAwXSA9IFwiT0tcIiwgVm5bVm4uQ0FOQ0VMTEVEID0gMV0gPSBcIkNBTkNFTExFRFwiLCBcblZuW1ZuLlVOS05PV04gPSAyXSA9IFwiVU5LTk9XTlwiLCBWbltWbi5JTlZBTElEX0FSR1VNRU5UID0gM10gPSBcIklOVkFMSURfQVJHVU1FTlRcIiwgXG5WbltWbi5ERUFETElORV9FWENFRURFRCA9IDRdID0gXCJERUFETElORV9FWENFRURFRFwiLCBWbltWbi5OT1RfRk9VTkQgPSA1XSA9IFwiTk9UX0ZPVU5EXCIsIFxuVm5bVm4uQUxSRUFEWV9FWElTVFMgPSA2XSA9IFwiQUxSRUFEWV9FWElTVFNcIiwgVm5bVm4uUEVSTUlTU0lPTl9ERU5JRUQgPSA3XSA9IFwiUEVSTUlTU0lPTl9ERU5JRURcIiwgXG5WbltWbi5VTkFVVEhFTlRJQ0FURUQgPSAxNl0gPSBcIlVOQVVUSEVOVElDQVRFRFwiLCBWbltWbi5SRVNPVVJDRV9FWEhBVVNURUQgPSA4XSA9IFwiUkVTT1VSQ0VfRVhIQVVTVEVEXCIsIFxuVm5bVm4uRkFJTEVEX1BSRUNPTkRJVElPTiA9IDldID0gXCJGQUlMRURfUFJFQ09ORElUSU9OXCIsIFZuW1ZuLkFCT1JURUQgPSAxMF0gPSBcIkFCT1JURURcIiwgXG5WbltWbi5PVVRfT0ZfUkFOR0UgPSAxMV0gPSBcIk9VVF9PRl9SQU5HRVwiLCBWbltWbi5VTklNUExFTUVOVEVEID0gMTJdID0gXCJVTklNUExFTUVOVEVEXCIsIFxuVm5bVm4uSU5URVJOQUwgPSAxM10gPSBcIklOVEVSTkFMXCIsIFZuW1ZuLlVOQVZBSUxBQkxFID0gMTRdID0gXCJVTkFWQUlMQUJMRVwiLCBWbltWbi5EQVRBX0xPU1MgPSAxNV0gPSBcIkRBVEFfTE9TU1wiO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIG1hcCBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgb2JqZWN0cyBhcyBrZXlzLiBPYmplY3RzIG11c3QgaGF2ZSBhblxuICogYXNzb2NpYXRlZCBlcXVhbHMgZnVuY3Rpb24gYW5kIG11c3QgYmUgaW1tdXRhYmxlLiBFbnRyaWVzIGluIHRoZSBtYXAgYXJlXG4gKiBzdG9yZWQgdG9nZXRoZXIgd2l0aCB0aGUga2V5IGJlaW5nIHByb2R1Y2VkIGZyb20gdGhlIG1hcEtleUZuLiBUaGlzIG1hcFxuICogYXV0b21hdGljYWxseSBoYW5kbGVzIGNvbGxpc2lvbnMgb2Yga2V5cy5cbiAqL1xuY2xhc3MgRG4ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5tYXBLZXlGbiA9IHQsIHRoaXMuZXF1YWxzRm4gPSBlLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBpbm5lciBtYXAgZm9yIGEga2V5L3ZhbHVlIHBhaXIuIER1ZSB0byB0aGUgcG9zc2liaWxpdHkgb2YgY29sbGlzaW9ucyB3ZVxuICAgICAgICAgKiBrZWVwIGEgbGlzdCBvZiBlbnRyaWVzIHRoYXQgd2UgZG8gYSBsaW5lYXIgc2VhcmNoIHRocm91Z2ggdG8gZmluZCBhbiBhY3R1YWxcbiAgICAgICAgICogbWF0Y2guIE5vdGUgdGhhdCBjb2xsaXNpb25zIHNob3VsZCBiZSByYXJlLCBzbyB3ZSBzdGlsbCBleHBlY3QgbmVhclxuICAgICAgICAgKiBjb25zdGFudCB0aW1lIGxvb2t1cHMgaW4gcHJhY3RpY2UuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlubmVyID0ge30sIFxuICAgICAgICAvKiogVGhlIG51bWJlciBvZiBlbnRyaWVzIHN0b3JlZCBpbiB0aGUgbWFwICovXG4gICAgICAgIHRoaXMuaW5uZXJTaXplID0gMDtcbiAgICB9XG4gICAgLyoqIEdldCBhIHZhbHVlIGZvciB0aGlzIGtleSwgb3IgdW5kZWZpbmVkIGlmIGl0IGRvZXMgbm90IGV4aXN0LiAqLyAgICBnZXQodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5tYXBLZXlGbih0KSwgbiA9IHRoaXMuaW5uZXJbZV07XG4gICAgICAgIGlmICh2b2lkIDAgIT09IG4pIGZvciAoY29uc3QgW2UsIHNdIG9mIG4pIGlmICh0aGlzLmVxdWFsc0ZuKGUsIHQpKSByZXR1cm4gcztcbiAgICB9XG4gICAgaGFzKHQpIHtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gdGhpcy5nZXQodCk7XG4gICAgfVxuICAgIC8qKiBQdXQgdGhpcyBrZXkgYW5kIHZhbHVlIGluIHRoZSBtYXAuICovICAgIHNldCh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLm1hcEtleUZuKHQpLCBzID0gdGhpcy5pbm5lcltuXTtcbiAgICAgICAgaWYgKHZvaWQgMCA9PT0gcykgcmV0dXJuIHRoaXMuaW5uZXJbbl0gPSBbIFsgdCwgZSBdIF0sIHZvaWQgdGhpcy5pbm5lclNpemUrKztcbiAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBzLmxlbmd0aDsgbisrKSBpZiAodGhpcy5lcXVhbHNGbihzW25dWzBdLCB0KSkgXG4gICAgICAgIC8vIFRoaXMgaXMgdXBkYXRpbmcgYW4gZXhpc3RpbmcgZW50cnkgYW5kIGRvZXMgbm90IGluY3JlYXNlIGBpbm5lclNpemVgLlxuICAgICAgICByZXR1cm4gdm9pZCAoc1tuXSA9IFsgdCwgZSBdKTtcbiAgICAgICAgcy5wdXNoKFsgdCwgZSBdKSwgdGhpcy5pbm5lclNpemUrKztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHRoaXMga2V5IGZyb20gdGhlIG1hcC4gUmV0dXJucyBhIGJvb2xlYW4gaWYgYW55dGhpbmcgd2FzIGRlbGV0ZWQuXG4gICAgICovICAgIGRlbGV0ZSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLm1hcEtleUZuKHQpLCBuID0gdGhpcy5pbm5lcltlXTtcbiAgICAgICAgaWYgKHZvaWQgMCA9PT0gbikgcmV0dXJuICExO1xuICAgICAgICBmb3IgKGxldCBzID0gMDsgcyA8IG4ubGVuZ3RoOyBzKyspIGlmICh0aGlzLmVxdWFsc0ZuKG5bc11bMF0sIHQpKSByZXR1cm4gMSA9PT0gbi5sZW5ndGggPyBkZWxldGUgdGhpcy5pbm5lcltlXSA6IG4uc3BsaWNlKHMsIDEpLCBcbiAgICAgICAgdGhpcy5pbm5lclNpemUtLSwgITA7XG4gICAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgZm9yRWFjaCh0KSB7XG4gICAgICAgIGx0KHRoaXMuaW5uZXIsICgoZSwgbikgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbZSwgc10gb2YgbikgdChlLCBzKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gZnQodGhpcy5pbm5lcik7XG4gICAgfVxuICAgIHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlubmVyU2l6ZTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vLyBBbiBpbW11dGFibGUgc29ydGVkIG1hcCBpbXBsZW1lbnRhdGlvbiwgYmFzZWQgb24gYSBMZWZ0LWxlYW5pbmcgUmVkLUJsYWNrXG4vLyB0cmVlLlxuY2xhc3MgQ24ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5jb21wYXJhdG9yID0gdCwgdGhpcy5yb290ID0gZSB8fCBObi5FTVBUWTtcbiAgICB9XG4gICAgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIG1hcCwgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS92YWx1ZSBhZGRlZCBvciByZXBsYWNlZC5cbiAgICBpbnNlcnQodCwgZSkge1xuICAgICAgICByZXR1cm4gbmV3IENuKHRoaXMuY29tcGFyYXRvciwgdGhpcy5yb290Lmluc2VydCh0LCBlLCB0aGlzLmNvbXBhcmF0b3IpLmNvcHkobnVsbCwgbnVsbCwgTm4uQkxBQ0ssIG51bGwsIG51bGwpKTtcbiAgICB9XG4gICAgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIG1hcCwgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSByZW1vdmVkLlxuICAgIHJlbW92ZSh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgQ24odGhpcy5jb21wYXJhdG9yLCB0aGlzLnJvb3QucmVtb3ZlKHQsIHRoaXMuY29tcGFyYXRvcikuY29weShudWxsLCBudWxsLCBObi5CTEFDSywgbnVsbCwgbnVsbCkpO1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgbm9kZSB3aXRoIHRoZSBnaXZlbiBrZXksIG9yIG51bGwuXG4gICAgZ2V0KHQpIHtcbiAgICAgICAgbGV0IGUgPSB0aGlzLnJvb3Q7XG4gICAgICAgIGZvciAoOyFlLmlzRW1wdHkoKTsgKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdGhpcy5jb21wYXJhdG9yKHQsIGUua2V5KTtcbiAgICAgICAgICAgIGlmICgwID09PSBuKSByZXR1cm4gZS52YWx1ZTtcbiAgICAgICAgICAgIG4gPCAwID8gZSA9IGUubGVmdCA6IG4gPiAwICYmIChlID0gZS5yaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IGluIHRoaXMgc29ydGVkIG1hcCwgb3IgLTEgaWYgaXQgZG9lc24ndFxuICAgIC8vIGV4aXN0LlxuICAgIGluZGV4T2YodCkge1xuICAgICAgICAvLyBOdW1iZXIgb2Ygbm9kZXMgdGhhdCB3ZXJlIHBydW5lZCB3aGVuIGRlc2NlbmRpbmcgcmlnaHRcbiAgICAgICAgbGV0IGUgPSAwLCBuID0gdGhpcy5yb290O1xuICAgICAgICBmb3IgKDshbi5pc0VtcHR5KCk7ICkge1xuICAgICAgICAgICAgY29uc3QgcyA9IHRoaXMuY29tcGFyYXRvcih0LCBuLmtleSk7XG4gICAgICAgICAgICBpZiAoMCA9PT0gcykgcmV0dXJuIGUgKyBuLmxlZnQuc2l6ZTtcbiAgICAgICAgICAgIHMgPCAwID8gbiA9IG4ubGVmdCA6IChcbiAgICAgICAgICAgIC8vIENvdW50IGFsbCBub2RlcyBsZWZ0IG9mIHRoZSBub2RlIHBsdXMgdGhlIG5vZGUgaXRzZWxmXG4gICAgICAgICAgICBlICs9IG4ubGVmdC5zaXplICsgMSwgbiA9IG4ucmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vZGUgbm90IGZvdW5kXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb290LmlzRW1wdHkoKTtcbiAgICB9XG4gICAgLy8gUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBtYXAuXG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvb3Quc2l6ZTtcbiAgICB9XG4gICAgLy8gUmV0dXJucyB0aGUgbWluaW11bSBrZXkgaW4gdGhlIG1hcC5cbiAgICBtaW5LZXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvb3QubWluS2V5KCk7XG4gICAgfVxuICAgIC8vIFJldHVybnMgdGhlIG1heGltdW0ga2V5IGluIHRoZSBtYXAuXG4gICAgbWF4S2V5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb290Lm1heEtleSgpO1xuICAgIH1cbiAgICAvLyBUcmF2ZXJzZXMgdGhlIG1hcCBpbiBrZXkgb3JkZXIgYW5kIGNhbGxzIHRoZSBzcGVjaWZpZWQgYWN0aW9uIGZ1bmN0aW9uXG4gICAgLy8gZm9yIGVhY2gga2V5L3ZhbHVlIHBhaXIuIElmIGFjdGlvbiByZXR1cm5zIHRydWUsIHRyYXZlcnNhbCBpcyBhYm9ydGVkLlxuICAgIC8vIFJldHVybnMgdGhlIGZpcnN0IHRydXRoeSB2YWx1ZSByZXR1cm5lZCBieSBhY3Rpb24sIG9yIHRoZSBsYXN0IGZhbHNleVxuICAgIC8vIHZhbHVlIHJldHVybmVkIGJ5IGFjdGlvbi5cbiAgICBpbm9yZGVyVHJhdmVyc2FsKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5pbm9yZGVyVHJhdmVyc2FsKHQpO1xuICAgIH1cbiAgICBmb3JFYWNoKHQpIHtcbiAgICAgICAgdGhpcy5pbm9yZGVyVHJhdmVyc2FsKCgoZSwgbikgPT4gKHQoZSwgbiksICExKSkpO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgY29uc3QgdCA9IFtdO1xuICAgICAgICByZXR1cm4gdGhpcy5pbm9yZGVyVHJhdmVyc2FsKCgoZSwgbikgPT4gKHQucHVzaChgJHtlfToke259YCksICExKSkpLCBgeyR7dC5qb2luKFwiLCBcIil9fWA7XG4gICAgfVxuICAgIC8vIFRyYXZlcnNlcyB0aGUgbWFwIGluIHJldmVyc2Uga2V5IG9yZGVyIGFuZCBjYWxscyB0aGUgc3BlY2lmaWVkIGFjdGlvblxuICAgIC8vIGZ1bmN0aW9uIGZvciBlYWNoIGtleS92YWx1ZSBwYWlyLiBJZiBhY3Rpb24gcmV0dXJucyB0cnVlLCB0cmF2ZXJzYWwgaXNcbiAgICAvLyBhYm9ydGVkLlxuICAgIC8vIFJldHVybnMgdGhlIGZpcnN0IHRydXRoeSB2YWx1ZSByZXR1cm5lZCBieSBhY3Rpb24sIG9yIHRoZSBsYXN0IGZhbHNleVxuICAgIC8vIHZhbHVlIHJldHVybmVkIGJ5IGFjdGlvbi5cbiAgICByZXZlcnNlVHJhdmVyc2FsKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5yZXZlcnNlVHJhdmVyc2FsKHQpO1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIFNvcnRlZE1hcC5cbiAgICBnZXRJdGVyYXRvcigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB4bih0aGlzLnJvb3QsIG51bGwsIHRoaXMuY29tcGFyYXRvciwgITEpO1xuICAgIH1cbiAgICBnZXRJdGVyYXRvckZyb20odCkge1xuICAgICAgICByZXR1cm4gbmV3IHhuKHRoaXMucm9vdCwgdCwgdGhpcy5jb21wYXJhdG9yLCAhMSk7XG4gICAgfVxuICAgIGdldFJldmVyc2VJdGVyYXRvcigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB4bih0aGlzLnJvb3QsIG51bGwsIHRoaXMuY29tcGFyYXRvciwgITApO1xuICAgIH1cbiAgICBnZXRSZXZlcnNlSXRlcmF0b3JGcm9tKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB4bih0aGlzLnJvb3QsIHQsIHRoaXMuY29tcGFyYXRvciwgITApO1xuICAgIH1cbn1cblxuIC8vIGVuZCBTb3J0ZWRNYXBcbi8vIEFuIGl0ZXJhdG9yIG92ZXIgYW4gTExSQk5vZGUuXG5jbGFzcyB4biB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgcykge1xuICAgICAgICB0aGlzLmlzUmV2ZXJzZSA9IHMsIHRoaXMubm9kZVN0YWNrID0gW107XG4gICAgICAgIGxldCBpID0gMTtcbiAgICAgICAgZm9yICg7IXQuaXNFbXB0eSgpOyApIGlmIChpID0gZSA/IG4odC5rZXksIGUpIDogMSwgXG4gICAgICAgIC8vIGZsaXAgdGhlIGNvbXBhcmlzb24gaWYgd2UncmUgZ29pbmcgaW4gcmV2ZXJzZVxuICAgICAgICBlICYmIHMgJiYgKGkgKj0gLTEpLCBpIDwgMCkgXG4gICAgICAgIC8vIFRoaXMgbm9kZSBpcyBsZXNzIHRoYW4gb3VyIHN0YXJ0IGtleS4gaWdub3JlIGl0XG4gICAgICAgIHQgPSB0aGlzLmlzUmV2ZXJzZSA/IHQubGVmdCA6IHQucmlnaHQ7IGVsc2Uge1xuICAgICAgICAgICAgaWYgKDAgPT09IGkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIG5vZGUgaXMgZXhhY3RseSBlcXVhbCB0byBvdXIgc3RhcnQga2V5LiBQdXNoIGl0IG9uIHRoZSBzdGFjayxcbiAgICAgICAgICAgICAgICAvLyBidXQgc3RvcCBpdGVyYXRpbmc7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlU3RhY2sucHVzaCh0KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoaXMgbm9kZSBpcyBncmVhdGVyIHRoYW4gb3VyIHN0YXJ0IGtleSwgYWRkIGl0IHRvIHRoZSBzdGFjayBhbmQgbW92ZVxuICAgICAgICAgICAgLy8gdG8gdGhlIG5leHQgb25lXG4gICAgICAgICAgICB0aGlzLm5vZGVTdGFjay5wdXNoKHQpLCB0ID0gdGhpcy5pc1JldmVyc2UgPyB0LnJpZ2h0IDogdC5sZWZ0O1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldE5leHQoKSB7XG4gICAgICAgIGxldCB0ID0gdGhpcy5ub2RlU3RhY2sucG9wKCk7XG4gICAgICAgIGNvbnN0IGUgPSB7XG4gICAgICAgICAgICBrZXk6IHQua2V5LFxuICAgICAgICAgICAgdmFsdWU6IHQudmFsdWVcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuaXNSZXZlcnNlKSBmb3IgKHQgPSB0LmxlZnQ7ICF0LmlzRW1wdHkoKTsgKSB0aGlzLm5vZGVTdGFjay5wdXNoKHQpLCB0ID0gdC5yaWdodDsgZWxzZSBmb3IgKHQgPSB0LnJpZ2h0OyAhdC5pc0VtcHR5KCk7ICkgdGhpcy5ub2RlU3RhY2sucHVzaCh0KSwgXG4gICAgICAgIHQgPSB0LmxlZnQ7XG4gICAgICAgIHJldHVybiBlO1xuICAgIH1cbiAgICBoYXNOZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlU3RhY2subGVuZ3RoID4gMDtcbiAgICB9XG4gICAgcGVlaygpIHtcbiAgICAgICAgaWYgKDAgPT09IHRoaXMubm9kZVN0YWNrLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IHQgPSB0aGlzLm5vZGVTdGFja1t0aGlzLm5vZGVTdGFjay5sZW5ndGggLSAxXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtleTogdC5rZXksXG4gICAgICAgICAgICB2YWx1ZTogdC52YWx1ZVxuICAgICAgICB9O1xuICAgIH1cbn1cblxuIC8vIGVuZCBTb3J0ZWRNYXBJdGVyYXRvclxuLy8gUmVwcmVzZW50cyBhIG5vZGUgaW4gYSBMZWZ0LWxlYW5pbmcgUmVkLUJsYWNrIHRyZWUuXG5jbGFzcyBObiB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgcywgaSkge1xuICAgICAgICB0aGlzLmtleSA9IHQsIHRoaXMudmFsdWUgPSBlLCB0aGlzLmNvbG9yID0gbnVsbCAhPSBuID8gbiA6IE5uLlJFRCwgdGhpcy5sZWZ0ID0gbnVsbCAhPSBzID8gcyA6IE5uLkVNUFRZLCBcbiAgICAgICAgdGhpcy5yaWdodCA9IG51bGwgIT0gaSA/IGkgOiBObi5FTVBUWSwgdGhpcy5zaXplID0gdGhpcy5sZWZ0LnNpemUgKyAxICsgdGhpcy5yaWdodC5zaXplO1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgY3VycmVudCBub2RlLCBvcHRpb25hbGx5IHJlcGxhY2luZyBwaWVjZXMgb2YgaXQuXG4gICAgY29weSh0LCBlLCBuLCBzLCBpKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm4obnVsbCAhPSB0ID8gdCA6IHRoaXMua2V5LCBudWxsICE9IGUgPyBlIDogdGhpcy52YWx1ZSwgbnVsbCAhPSBuID8gbiA6IHRoaXMuY29sb3IsIG51bGwgIT0gcyA/IHMgOiB0aGlzLmxlZnQsIG51bGwgIT0gaSA/IGkgOiB0aGlzLnJpZ2h0KTtcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgICAvLyBUcmF2ZXJzZXMgdGhlIHRyZWUgaW4ga2V5IG9yZGVyIGFuZCBjYWxscyB0aGUgc3BlY2lmaWVkIGFjdGlvbiBmdW5jdGlvblxuICAgIC8vIGZvciBlYWNoIG5vZGUuIElmIGFjdGlvbiByZXR1cm5zIHRydWUsIHRyYXZlcnNhbCBpcyBhYm9ydGVkLlxuICAgIC8vIFJldHVybnMgdGhlIGZpcnN0IHRydXRoeSB2YWx1ZSByZXR1cm5lZCBieSBhY3Rpb24sIG9yIHRoZSBsYXN0IGZhbHNleVxuICAgIC8vIHZhbHVlIHJldHVybmVkIGJ5IGFjdGlvbi5cbiAgICBpbm9yZGVyVHJhdmVyc2FsKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVmdC5pbm9yZGVyVHJhdmVyc2FsKHQpIHx8IHQodGhpcy5rZXksIHRoaXMudmFsdWUpIHx8IHRoaXMucmlnaHQuaW5vcmRlclRyYXZlcnNhbCh0KTtcbiAgICB9XG4gICAgLy8gVHJhdmVyc2VzIHRoZSB0cmVlIGluIHJldmVyc2Uga2V5IG9yZGVyIGFuZCBjYWxscyB0aGUgc3BlY2lmaWVkIGFjdGlvblxuICAgIC8vIGZ1bmN0aW9uIGZvciBlYWNoIG5vZGUuIElmIGFjdGlvbiByZXR1cm5zIHRydWUsIHRyYXZlcnNhbCBpcyBhYm9ydGVkLlxuICAgIC8vIFJldHVybnMgdGhlIGZpcnN0IHRydXRoeSB2YWx1ZSByZXR1cm5lZCBieSBhY3Rpb24sIG9yIHRoZSBsYXN0IGZhbHNleVxuICAgIC8vIHZhbHVlIHJldHVybmVkIGJ5IGFjdGlvbi5cbiAgICByZXZlcnNlVHJhdmVyc2FsKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmlnaHQucmV2ZXJzZVRyYXZlcnNhbCh0KSB8fCB0KHRoaXMua2V5LCB0aGlzLnZhbHVlKSB8fCB0aGlzLmxlZnQucmV2ZXJzZVRyYXZlcnNhbCh0KTtcbiAgICB9XG4gICAgLy8gUmV0dXJucyB0aGUgbWluaW11bSBub2RlIGluIHRoZSB0cmVlLlxuICAgIG1pbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVmdC5pc0VtcHR5KCkgPyB0aGlzIDogdGhpcy5sZWZ0Lm1pbigpO1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIHRoZSBtYXhpbXVtIGtleSBpbiB0aGUgdHJlZS5cbiAgICBtaW5LZXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbigpLmtleTtcbiAgICB9XG4gICAgLy8gUmV0dXJucyB0aGUgbWF4aW11bSBrZXkgaW4gdGhlIHRyZWUuXG4gICAgbWF4S2V5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yaWdodC5pc0VtcHR5KCkgPyB0aGlzLmtleSA6IHRoaXMucmlnaHQubWF4S2V5KCk7XG4gICAgfVxuICAgIC8vIFJldHVybnMgbmV3IHRyZWUsIHdpdGggdGhlIGtleS92YWx1ZSBhZGRlZC5cbiAgICBpbnNlcnQodCwgZSwgbikge1xuICAgICAgICBsZXQgcyA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGkgPSBuKHQsIHMua2V5KTtcbiAgICAgICAgcmV0dXJuIHMgPSBpIDwgMCA/IHMuY29weShudWxsLCBudWxsLCBudWxsLCBzLmxlZnQuaW5zZXJ0KHQsIGUsIG4pLCBudWxsKSA6IDAgPT09IGkgPyBzLmNvcHkobnVsbCwgZSwgbnVsbCwgbnVsbCwgbnVsbCkgOiBzLmNvcHkobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgcy5yaWdodC5pbnNlcnQodCwgZSwgbikpLCBcbiAgICAgICAgcy5maXhVcCgpO1xuICAgIH1cbiAgICByZW1vdmVNaW4oKSB7XG4gICAgICAgIGlmICh0aGlzLmxlZnQuaXNFbXB0eSgpKSByZXR1cm4gTm4uRU1QVFk7XG4gICAgICAgIGxldCB0ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHQubGVmdC5pc1JlZCgpIHx8IHQubGVmdC5sZWZ0LmlzUmVkKCkgfHwgKHQgPSB0Lm1vdmVSZWRMZWZ0KCkpLCB0ID0gdC5jb3B5KG51bGwsIG51bGwsIG51bGwsIHQubGVmdC5yZW1vdmVNaW4oKSwgbnVsbCksIFxuICAgICAgICB0LmZpeFVwKCk7XG4gICAgfVxuICAgIC8vIFJldHVybnMgbmV3IHRyZWUsIHdpdGggdGhlIHNwZWNpZmllZCBpdGVtIHJlbW92ZWQuXG4gICAgcmVtb3ZlKHQsIGUpIHtcbiAgICAgICAgbGV0IG4sIHMgPSB0aGlzO1xuICAgICAgICBpZiAoZSh0LCBzLmtleSkgPCAwKSBzLmxlZnQuaXNFbXB0eSgpIHx8IHMubGVmdC5pc1JlZCgpIHx8IHMubGVmdC5sZWZ0LmlzUmVkKCkgfHwgKHMgPSBzLm1vdmVSZWRMZWZ0KCkpLCBcbiAgICAgICAgcyA9IHMuY29weShudWxsLCBudWxsLCBudWxsLCBzLmxlZnQucmVtb3ZlKHQsIGUpLCBudWxsKTsgZWxzZSB7XG4gICAgICAgICAgICBpZiAocy5sZWZ0LmlzUmVkKCkgJiYgKHMgPSBzLnJvdGF0ZVJpZ2h0KCkpLCBzLnJpZ2h0LmlzRW1wdHkoKSB8fCBzLnJpZ2h0LmlzUmVkKCkgfHwgcy5yaWdodC5sZWZ0LmlzUmVkKCkgfHwgKHMgPSBzLm1vdmVSZWRSaWdodCgpKSwgXG4gICAgICAgICAgICAwID09PSBlKHQsIHMua2V5KSkge1xuICAgICAgICAgICAgICAgIGlmIChzLnJpZ2h0LmlzRW1wdHkoKSkgcmV0dXJuIE5uLkVNUFRZO1xuICAgICAgICAgICAgICAgIG4gPSBzLnJpZ2h0Lm1pbigpLCBzID0gcy5jb3B5KG4ua2V5LCBuLnZhbHVlLCBudWxsLCBudWxsLCBzLnJpZ2h0LnJlbW92ZU1pbigpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHMgPSBzLmNvcHkobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgcy5yaWdodC5yZW1vdmUodCwgZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzLmZpeFVwKCk7XG4gICAgfVxuICAgIGlzUmVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2xvcjtcbiAgICB9XG4gICAgLy8gUmV0dXJucyBuZXcgdHJlZSBhZnRlciBwZXJmb3JtaW5nIGFueSBuZWVkZWQgcm90YXRpb25zLlxuICAgIGZpeFVwKCkge1xuICAgICAgICBsZXQgdCA9IHRoaXM7XG4gICAgICAgIHJldHVybiB0LnJpZ2h0LmlzUmVkKCkgJiYgIXQubGVmdC5pc1JlZCgpICYmICh0ID0gdC5yb3RhdGVMZWZ0KCkpLCB0LmxlZnQuaXNSZWQoKSAmJiB0LmxlZnQubGVmdC5pc1JlZCgpICYmICh0ID0gdC5yb3RhdGVSaWdodCgpKSwgXG4gICAgICAgIHQubGVmdC5pc1JlZCgpICYmIHQucmlnaHQuaXNSZWQoKSAmJiAodCA9IHQuY29sb3JGbGlwKCkpLCB0O1xuICAgIH1cbiAgICBtb3ZlUmVkTGVmdCgpIHtcbiAgICAgICAgbGV0IHQgPSB0aGlzLmNvbG9yRmxpcCgpO1xuICAgICAgICByZXR1cm4gdC5yaWdodC5sZWZ0LmlzUmVkKCkgJiYgKHQgPSB0LmNvcHkobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgdC5yaWdodC5yb3RhdGVSaWdodCgpKSwgXG4gICAgICAgIHQgPSB0LnJvdGF0ZUxlZnQoKSwgdCA9IHQuY29sb3JGbGlwKCkpLCB0O1xuICAgIH1cbiAgICBtb3ZlUmVkUmlnaHQoKSB7XG4gICAgICAgIGxldCB0ID0gdGhpcy5jb2xvckZsaXAoKTtcbiAgICAgICAgcmV0dXJuIHQubGVmdC5sZWZ0LmlzUmVkKCkgJiYgKHQgPSB0LnJvdGF0ZVJpZ2h0KCksIHQgPSB0LmNvbG9yRmxpcCgpKSwgdDtcbiAgICB9XG4gICAgcm90YXRlTGVmdCgpIHtcbiAgICAgICAgY29uc3QgdCA9IHRoaXMuY29weShudWxsLCBudWxsLCBObi5SRUQsIG51bGwsIHRoaXMucmlnaHQubGVmdCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJpZ2h0LmNvcHkobnVsbCwgbnVsbCwgdGhpcy5jb2xvciwgdCwgbnVsbCk7XG4gICAgfVxuICAgIHJvdGF0ZVJpZ2h0KCkge1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5jb3B5KG51bGwsIG51bGwsIE5uLlJFRCwgdGhpcy5sZWZ0LnJpZ2h0LCBudWxsKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVmdC5jb3B5KG51bGwsIG51bGwsIHRoaXMuY29sb3IsIG51bGwsIHQpO1xuICAgIH1cbiAgICBjb2xvckZsaXAoKSB7XG4gICAgICAgIGNvbnN0IHQgPSB0aGlzLmxlZnQuY29weShudWxsLCBudWxsLCAhdGhpcy5sZWZ0LmNvbG9yLCBudWxsLCBudWxsKSwgZSA9IHRoaXMucmlnaHQuY29weShudWxsLCBudWxsLCAhdGhpcy5yaWdodC5jb2xvciwgbnVsbCwgbnVsbCk7XG4gICAgICAgIHJldHVybiB0aGlzLmNvcHkobnVsbCwgbnVsbCwgIXRoaXMuY29sb3IsIHQsIGUpO1xuICAgIH1cbiAgICAvLyBGb3IgdGVzdGluZy5cbiAgICBjaGVja01heERlcHRoKCkge1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5jaGVjaygpO1xuICAgICAgICByZXR1cm4gTWF0aC5wb3coMiwgdCkgPD0gdGhpcy5zaXplICsgMTtcbiAgICB9XG4gICAgLy8gSW4gYSBiYWxhbmNlZCBSQiB0cmVlLCB0aGUgYmxhY2stZGVwdGggKG51bWJlciBvZiBibGFjayBub2RlcykgZnJvbSByb290IHRvXG4gICAgLy8gbGVhdmVzIGlzIGVxdWFsIG9uIGJvdGggc2lkZXMuICBUaGlzIGZ1bmN0aW9uIHZlcmlmaWVzIHRoYXQgb3IgYXNzZXJ0cy5cbiAgICBjaGVjaygpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNSZWQoKSAmJiB0aGlzLmxlZnQuaXNSZWQoKSkgdGhyb3cgTCgpO1xuICAgICAgICBpZiAodGhpcy5yaWdodC5pc1JlZCgpKSB0aHJvdyBMKCk7XG4gICAgICAgIGNvbnN0IHQgPSB0aGlzLmxlZnQuY2hlY2soKTtcbiAgICAgICAgaWYgKHQgIT09IHRoaXMucmlnaHQuY2hlY2soKSkgdGhyb3cgTCgpO1xuICAgICAgICByZXR1cm4gdCArICh0aGlzLmlzUmVkKCkgPyAwIDogMSk7XG4gICAgfVxufVxuXG4gLy8gZW5kIExMUkJOb2RlXG4vLyBFbXB0eSBub2RlIGlzIHNoYXJlZCBiZXR3ZWVuIGFsbCBMTFJCIHRyZWVzLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbk5uLkVNUFRZID0gbnVsbCwgTm4uUkVEID0gITAsIE5uLkJMQUNLID0gITE7XG5cbi8vIGVuZCBMTFJCRW1wdHlOb2RlXG5Obi5FTVBUWSA9IG5ldyBcbi8vIFJlcHJlc2VudHMgYW4gZW1wdHkgbm9kZSAoYSBsZWFmIG5vZGUgaW4gdGhlIFJlZC1CbGFjayBUcmVlKS5cbmNsYXNzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5zaXplID0gMDtcbiAgICB9XG4gICAgZ2V0IGtleSgpIHtcbiAgICAgICAgdGhyb3cgTCgpO1xuICAgIH1cbiAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIHRocm93IEwoKTtcbiAgICB9XG4gICAgZ2V0IGNvbG9yKCkge1xuICAgICAgICB0aHJvdyBMKCk7XG4gICAgfVxuICAgIGdldCBsZWZ0KCkge1xuICAgICAgICB0aHJvdyBMKCk7XG4gICAgfVxuICAgIGdldCByaWdodCgpIHtcbiAgICAgICAgdGhyb3cgTCgpO1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgY3VycmVudCBub2RlLlxuICAgIGNvcHkodCwgZSwgbiwgcywgaSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIHRyZWUsIHdpdGggdGhlIHNwZWNpZmllZCBrZXkvdmFsdWUgYWRkZWQuXG4gICAgaW5zZXJ0KHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBObih0LCBlKTtcbiAgICB9XG4gICAgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIHRyZWUsIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgcmVtb3ZlZC5cbiAgICByZW1vdmUodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICEwO1xuICAgIH1cbiAgICBpbm9yZGVyVHJhdmVyc2FsKHQpIHtcbiAgICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgICByZXZlcnNlVHJhdmVyc2FsKHQpIHtcbiAgICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgICBtaW5LZXkoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBtYXhLZXkoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpc1JlZCgpIHtcbiAgICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgICAvLyBGb3IgdGVzdGluZy5cbiAgICBjaGVja01heERlcHRoKCkge1xuICAgICAgICByZXR1cm4gITA7XG4gICAgfVxuICAgIGNoZWNrKCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG59O1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBTb3J0ZWRTZXQgaXMgYW4gaW1tdXRhYmxlIChjb3B5LW9uLXdyaXRlKSBjb2xsZWN0aW9uIHRoYXQgaG9sZHMgZWxlbWVudHNcbiAqIGluIG9yZGVyIHNwZWNpZmllZCBieSB0aGUgcHJvdmlkZWQgY29tcGFyYXRvci5cbiAqXG4gKiBOT1RFOiBpZiBwcm92aWRlZCBjb21wYXJhdG9yIHJldHVybnMgMCBmb3IgdHdvIGVsZW1lbnRzLCB3ZSBjb25zaWRlciB0aGVtIHRvXG4gKiBiZSBlcXVhbCFcbiAqL1xuY2xhc3Mga24ge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5jb21wYXJhdG9yID0gdCwgdGhpcy5kYXRhID0gbmV3IENuKHRoaXMuY29tcGFyYXRvcik7XG4gICAgfVxuICAgIGhhcyh0KSB7XG4gICAgICAgIHJldHVybiBudWxsICE9PSB0aGlzLmRhdGEuZ2V0KHQpO1xuICAgIH1cbiAgICBmaXJzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5taW5LZXkoKTtcbiAgICB9XG4gICAgbGFzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5tYXhLZXkoKTtcbiAgICB9XG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuc2l6ZTtcbiAgICB9XG4gICAgaW5kZXhPZih0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuaW5kZXhPZih0KTtcbiAgICB9XG4gICAgLyoqIEl0ZXJhdGVzIGVsZW1lbnRzIGluIG9yZGVyIGRlZmluZWQgYnkgXCJjb21wYXJhdG9yXCIgKi8gICAgZm9yRWFjaCh0KSB7XG4gICAgICAgIHRoaXMuZGF0YS5pbm9yZGVyVHJhdmVyc2FsKCgoZSwgbikgPT4gKHQoZSksICExKSkpO1xuICAgIH1cbiAgICAvKiogSXRlcmF0ZXMgb3ZlciBgZWxlbWBzIHN1Y2ggdGhhdDogcmFuZ2VbMF0gJmx0Oz0gZWxlbSAmbHQ7IHJhbmdlWzFdLiAqLyAgICBmb3JFYWNoSW5SYW5nZSh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLmRhdGEuZ2V0SXRlcmF0b3JGcm9tKHRbMF0pO1xuICAgICAgICBmb3IgKDtuLmhhc05leHQoKTsgKSB7XG4gICAgICAgICAgICBjb25zdCBzID0gbi5nZXROZXh0KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5jb21wYXJhdG9yKHMua2V5LCB0WzFdKSA+PSAwKSByZXR1cm47XG4gICAgICAgICAgICBlKHMua2V5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGBlbGVtYHMgc3VjaCB0aGF0OiBzdGFydCAmbHQ7PSBlbGVtIHVudGlsIGZhbHNlIGlzIHJldHVybmVkLlxuICAgICAqLyAgICBmb3JFYWNoV2hpbGUodCwgZSkge1xuICAgICAgICBsZXQgbjtcbiAgICAgICAgZm9yIChuID0gdm9pZCAwICE9PSBlID8gdGhpcy5kYXRhLmdldEl0ZXJhdG9yRnJvbShlKSA6IHRoaXMuZGF0YS5nZXRJdGVyYXRvcigpOyBuLmhhc05leHQoKTsgKSB7XG4gICAgICAgICAgICBpZiAoIXQobi5nZXROZXh0KCkua2V5KSkgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKiBGaW5kcyB0aGUgbGVhc3QgZWxlbWVudCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYGVsZW1gLiAqLyAgICBmaXJzdEFmdGVyT3JFcXVhbCh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLmRhdGEuZ2V0SXRlcmF0b3JGcm9tKHQpO1xuICAgICAgICByZXR1cm4gZS5oYXNOZXh0KCkgPyBlLmdldE5leHQoKS5rZXkgOiBudWxsO1xuICAgIH1cbiAgICBnZXRJdGVyYXRvcigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNbih0aGlzLmRhdGEuZ2V0SXRlcmF0b3IoKSk7XG4gICAgfVxuICAgIGdldEl0ZXJhdG9yRnJvbSh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgTW4odGhpcy5kYXRhLmdldEl0ZXJhdG9yRnJvbSh0KSk7XG4gICAgfVxuICAgIC8qKiBJbnNlcnRzIG9yIHVwZGF0ZXMgYW4gZWxlbWVudCAqLyAgICBhZGQodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb3B5KHRoaXMuZGF0YS5yZW1vdmUodCkuaW5zZXJ0KHQsICEwKSk7XG4gICAgfVxuICAgIC8qKiBEZWxldGVzIGFuIGVsZW1lbnQgKi8gICAgZGVsZXRlKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzKHQpID8gdGhpcy5jb3B5KHRoaXMuZGF0YS5yZW1vdmUodCkpIDogdGhpcztcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5pc0VtcHR5KCk7XG4gICAgfVxuICAgIHVuaW9uV2l0aCh0KSB7XG4gICAgICAgIGxldCBlID0gdGhpcztcbiAgICAgICAgLy8gTWFrZSBzdXJlIGByZXN1bHRgIGFsd2F5cyByZWZlcnMgdG8gdGhlIGxhcmdlciBvbmUgb2YgdGhlIHR3byBzZXRzLlxuICAgICAgICAgICAgICAgIHJldHVybiBlLnNpemUgPCB0LnNpemUgJiYgKGUgPSB0LCB0ID0gdGhpcyksIHQuZm9yRWFjaCgodCA9PiB7XG4gICAgICAgICAgICBlID0gZS5hZGQodCk7XG4gICAgICAgIH0pKSwgZTtcbiAgICB9XG4gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIGlmICghKHQgaW5zdGFuY2VvZiBrbikpIHJldHVybiAhMTtcbiAgICAgICAgaWYgKHRoaXMuc2l6ZSAhPT0gdC5zaXplKSByZXR1cm4gITE7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLmRhdGEuZ2V0SXRlcmF0b3IoKSwgbiA9IHQuZGF0YS5nZXRJdGVyYXRvcigpO1xuICAgICAgICBmb3IgKDtlLmhhc05leHQoKTsgKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZS5nZXROZXh0KCkua2V5LCBzID0gbi5nZXROZXh0KCkua2V5O1xuICAgICAgICAgICAgaWYgKDAgIT09IHRoaXMuY29tcGFyYXRvcih0LCBzKSkgcmV0dXJuICExO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhMDtcbiAgICB9XG4gICAgdG9BcnJheSgpIHtcbiAgICAgICAgY29uc3QgdCA9IFtdO1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JFYWNoKChlID0+IHtcbiAgICAgICAgICAgIHQucHVzaChlKTtcbiAgICAgICAgfSkpLCB0O1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgY29uc3QgdCA9IFtdO1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JFYWNoKChlID0+IHQucHVzaChlKSkpLCBcIlNvcnRlZFNldChcIiArIHQudG9TdHJpbmcoKSArIFwiKVwiO1xuICAgIH1cbiAgICBjb3B5KHQpIHtcbiAgICAgICAgY29uc3QgZSA9IG5ldyBrbih0aGlzLmNvbXBhcmF0b3IpO1xuICAgICAgICByZXR1cm4gZS5kYXRhID0gdCwgZTtcbiAgICB9XG59XG5cbmNsYXNzIE1uIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMuaXRlciA9IHQ7XG4gICAgfVxuICAgIGdldE5leHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZXIuZ2V0TmV4dCgpLmtleTtcbiAgICB9XG4gICAgaGFzTmV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlci5oYXNOZXh0KCk7XG4gICAgfVxufVxuXG4vKipcbiAqIENvbXBhcmVzIHR3byBzb3J0ZWQgc2V0cyBmb3IgZXF1YWxpdHkgdXNpbmcgdGhlaXIgbmF0dXJhbCBvcmRlcmluZy4gVGhlXG4gKiBtZXRob2QgY29tcHV0ZXMgdGhlIGludGVyc2VjdGlvbiBhbmQgaW52b2tlcyBgb25BZGRgIGZvciBldmVyeSBlbGVtZW50IHRoYXRcbiAqIGlzIGluIGBhZnRlcmAgYnV0IG5vdCBgYmVmb3JlYC4gYG9uUmVtb3ZlYCBpcyBpbnZva2VkIGZvciBldmVyeSBlbGVtZW50IGluXG4gKiBgYmVmb3JlYCBidXQgbWlzc2luZyBmcm9tIGBhZnRlcmAuXG4gKlxuICogVGhlIG1ldGhvZCBjcmVhdGVzIGEgY29weSBvZiBib3RoIGBiZWZvcmVgIGFuZCBgYWZ0ZXJgIGFuZCBydW5zIGluIE8obiBsb2dcbiAqIG4pLCB3aGVyZSBuIGlzIHRoZSBzaXplIG9mIHRoZSB0d28gbGlzdHMuXG4gKlxuICogQHBhcmFtIGJlZm9yZSAtIFRoZSBlbGVtZW50cyB0aGF0IGV4aXN0IGluIHRoZSBvcmlnaW5hbCBzZXQuXG4gKiBAcGFyYW0gYWZ0ZXIgLSBUaGUgZWxlbWVudHMgdG8gZGlmZiBhZ2FpbnN0IHRoZSBvcmlnaW5hbCBzZXQuXG4gKiBAcGFyYW0gY29tcGFyYXRvciAtIFRoZSBjb21wYXJhdG9yIGZvciB0aGUgZWxlbWVudHMgaW4gYmVmb3JlIGFuZCBhZnRlci5cbiAqIEBwYXJhbSBvbkFkZCAtIEEgZnVuY3Rpb24gdG8gaW52b2tlIGZvciBldmVyeSBlbGVtZW50IHRoYXQgaXMgcGFydCBvZiBgXG4gKiBhZnRlcmAgYnV0IG5vdCBgYmVmb3JlYC5cbiAqIEBwYXJhbSBvblJlbW92ZSAtIEEgZnVuY3Rpb24gdG8gaW52b2tlIGZvciBldmVyeSBlbGVtZW50IHRoYXQgaXMgcGFydCBvZlxuICogYGJlZm9yZWAgYnV0IG5vdCBgYWZ0ZXJgLlxuICovXG4vKipcbiAqIFJldHVybnMgdGhlIG5leHQgZWxlbWVudCBmcm9tIHRoZSBpdGVyYXRvciBvciBgdW5kZWZpbmVkYCBpZiBub25lIGF2YWlsYWJsZS5cbiAqL1xuZnVuY3Rpb24gT24odCkge1xuICAgIHJldHVybiB0Lmhhc05leHQoKSA/IHQuZ2V0TmV4dCgpIDogdm9pZCAwO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjb25zdCAkbiA9IG5ldyBDbih4dC5jb21wYXJhdG9yKTtcblxuZnVuY3Rpb24gRm4oKSB7XG4gICAgcmV0dXJuICRuO1xufVxuXG5jb25zdCBCbiA9IG5ldyBDbih4dC5jb21wYXJhdG9yKTtcblxuZnVuY3Rpb24gTG4oKSB7XG4gICAgcmV0dXJuIEJuO1xufVxuXG5mdW5jdGlvbiBxbigpIHtcbiAgICByZXR1cm4gbmV3IERuKCh0ID0+IHQudG9TdHJpbmcoKSksICgodCwgZSkgPT4gdC5pc0VxdWFsKGUpKSk7XG59XG5cbmNvbnN0IFVuID0gbmV3IENuKHh0LmNvbXBhcmF0b3IpO1xuXG5jb25zdCBLbiA9IG5ldyBrbih4dC5jb21wYXJhdG9yKTtcblxuZnVuY3Rpb24gR24oLi4udCkge1xuICAgIGxldCBlID0gS247XG4gICAgZm9yIChjb25zdCBuIG9mIHQpIGUgPSBlLmFkZChuKTtcbiAgICByZXR1cm4gZTtcbn1cblxuY29uc3QgUW4gPSBuZXcga24ocnQpO1xuXG5mdW5jdGlvbiBqbigpIHtcbiAgICByZXR1cm4gUW47XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEFuIGV2ZW50IGZyb20gdGhlIFJlbW90ZVN0b3JlLiBJdCBpcyBzcGxpdCBpbnRvIHRhcmdldENoYW5nZXMgKGNoYW5nZXMgdG8gdGhlXG4gKiBzdGF0ZSBvciB0aGUgc2V0IG9mIGRvY3VtZW50cyBpbiBvdXIgd2F0Y2hlZCB0YXJnZXRzKSBhbmQgZG9jdW1lbnRVcGRhdGVzXG4gKiAoY2hhbmdlcyB0byB0aGUgYWN0dWFsIGRvY3VtZW50cykuXG4gKi8gY2xhc3MgV24ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIFRoZSBzbmFwc2hvdCB2ZXJzaW9uIHRoaXMgZXZlbnQgYnJpbmdzIHVzIHVwIHRvLCBvciBNSU4gaWYgbm90IHNldC5cbiAgICAgKi9cbiAgICB0LCBcbiAgICAvKipcbiAgICAgKiBBIG1hcCBmcm9tIHRhcmdldCB0byBjaGFuZ2VzIHRvIHRoZSB0YXJnZXQuIFNlZSBUYXJnZXRDaGFuZ2UuXG4gICAgICovXG4gICAgZSwgXG4gICAgLyoqXG4gICAgICogQSBzZXQgb2YgdGFyZ2V0cyB0aGF0IGlzIGtub3duIHRvIGJlIGluY29uc2lzdGVudC4gTGlzdGVucyBmb3IgdGhlc2VcbiAgICAgKiB0YXJnZXRzIHNob3VsZCBiZSByZS1lc3RhYmxpc2hlZCB3aXRob3V0IHJlc3VtZSB0b2tlbnMuXG4gICAgICovXG4gICAgbiwgXG4gICAgLyoqXG4gICAgICogQSBzZXQgb2Ygd2hpY2ggZG9jdW1lbnRzIGhhdmUgY2hhbmdlZCBvciBiZWVuIGRlbGV0ZWQsIGFsb25nIHdpdGggdGhlXG4gICAgICogZG9jJ3MgbmV3IHZhbHVlcyAoaWYgbm90IGRlbGV0ZWQpLlxuICAgICAqL1xuICAgIHMsIFxuICAgIC8qKlxuICAgICAqIEEgc2V0IG9mIHdoaWNoIGRvY3VtZW50IHVwZGF0ZXMgYXJlIGR1ZSBvbmx5IHRvIGxpbWJvIHJlc29sdXRpb24gdGFyZ2V0cy5cbiAgICAgKi9cbiAgICBpKSB7XG4gICAgICAgIHRoaXMuc25hcHNob3RWZXJzaW9uID0gdCwgdGhpcy50YXJnZXRDaGFuZ2VzID0gZSwgdGhpcy50YXJnZXRNaXNtYXRjaGVzID0gbiwgdGhpcy5kb2N1bWVudFVwZGF0ZXMgPSBzLCBcbiAgICAgICAgdGhpcy5yZXNvbHZlZExpbWJvRG9jdW1lbnRzID0gaTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSEFDSzogVmlld3MgcmVxdWlyZSBSZW1vdGVFdmVudHMgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHZpZXcgaXNcbiAgICAgKiBDVVJSRU5ULCBidXQgc2Vjb25kYXJ5IHRhYnMgZG9uJ3QgcmVjZWl2ZSByZW1vdGUgZXZlbnRzLiBTbyB0aGlzIG1ldGhvZCBpc1xuICAgICAqIHVzZWQgdG8gY3JlYXRlIGEgc3ludGhlc2l6ZWQgUmVtb3RlRXZlbnQgdGhhdCBjYW4gYmUgdXNlZCB0byBhcHBseSBhXG4gICAgICogQ1VSUkVOVCBzdGF0dXMgY2hhbmdlIHRvIGEgVmlldywgZm9yIHF1ZXJpZXMgZXhlY3V0ZWQgaW4gYSBkaWZmZXJlbnQgdGFiLlxuICAgICAqL1xuICAgIC8vIFBPUlRJTkcgTk9URTogTXVsdGktdGFiIG9ubHlcbiAgICBzdGF0aWMgY3JlYXRlU3ludGhlc2l6ZWRSZW1vdGVFdmVudEZvckN1cnJlbnRDaGFuZ2UodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gbmV3IE1hcDtcbiAgICAgICAgcmV0dXJuIG4uc2V0KHQsIHpuLmNyZWF0ZVN5bnRoZXNpemVkVGFyZ2V0Q2hhbmdlRm9yQ3VycmVudENoYW5nZSh0LCBlKSksIG5ldyBXbihjdC5taW4oKSwgbiwgam4oKSwgRm4oKSwgR24oKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgVGFyZ2V0Q2hhbmdlIHNwZWNpZmllcyB0aGUgc2V0IG9mIGNoYW5nZXMgZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IGFzIHBhcnQgb2ZcbiAqIGEgUmVtb3RlRXZlbnQuIFRoZXNlIGNoYW5nZXMgdHJhY2sgd2hpY2ggZG9jdW1lbnRzIGFyZSBhZGRlZCwgbW9kaWZpZWQgb3JcbiAqIHJlbW92ZWQsIGFzIHdlbGwgYXMgdGhlIHRhcmdldCdzIHJlc3VtZSB0b2tlbiBhbmQgd2hldGhlciB0aGUgdGFyZ2V0IGlzXG4gKiBtYXJrZWQgQ1VSUkVOVC5cbiAqIFRoZSBhY3R1YWwgY2hhbmdlcyAqdG8qIGRvY3VtZW50cyBhcmUgbm90IHBhcnQgb2YgdGhlIFRhcmdldENoYW5nZSBzaW5jZVxuICogZG9jdW1lbnRzIG1heSBiZSBwYXJ0IG9mIG11bHRpcGxlIHRhcmdldHMuXG4gKi8gY2xhc3Mgem4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIEFuIG9wYXF1ZSwgc2VydmVyLWFzc2lnbmVkIHRva2VuIHRoYXQgYWxsb3dzIHdhdGNoaW5nIGEgcXVlcnkgdG8gYmUgcmVzdW1lZFxuICAgICAqIGFmdGVyIGRpc2Nvbm5lY3Rpbmcgd2l0aG91dCByZXRyYW5zbWl0dGluZyBhbGwgdGhlIGRhdGEgdGhhdCBtYXRjaGVzIHRoZVxuICAgICAqIHF1ZXJ5LiBUaGUgcmVzdW1lIHRva2VuIGVzc2VudGlhbGx5IGlkZW50aWZpZXMgYSBwb2ludCBpbiB0aW1lIGZyb20gd2hpY2hcbiAgICAgKiB0aGUgc2VydmVyIHNob3VsZCByZXN1bWUgc2VuZGluZyByZXN1bHRzLlxuICAgICAqL1xuICAgIHQsIFxuICAgIC8qKlxuICAgICAqIFRoZSBcImN1cnJlbnRcIiAoc3luY2VkKSBzdGF0dXMgb2YgdGhpcyB0YXJnZXQuIE5vdGUgdGhhdCBcImN1cnJlbnRcIlxuICAgICAqIGhhcyBzcGVjaWFsIG1lYW5pbmcgaW4gdGhlIFJQQyBwcm90b2NvbCB0aGF0IGltcGxpZXMgdGhhdCBhIHRhcmdldCBpc1xuICAgICAqIGJvdGggdXAtdG8tZGF0ZSBhbmQgY29uc2lzdGVudCB3aXRoIHRoZSByZXN0IG9mIHRoZSB3YXRjaCBzdHJlYW0uXG4gICAgICovXG4gICAgZSwgXG4gICAgLyoqXG4gICAgICogVGhlIHNldCBvZiBkb2N1bWVudHMgdGhhdCB3ZXJlIG5ld2x5IGFzc2lnbmVkIHRvIHRoaXMgdGFyZ2V0IGFzIHBhcnQgb2ZcbiAgICAgKiB0aGlzIHJlbW90ZSBldmVudC5cbiAgICAgKi9cbiAgICBuLCBcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIGRvY3VtZW50cyB0aGF0IHdlcmUgYWxyZWFkeSBhc3NpZ25lZCB0byB0aGlzIHRhcmdldCBidXQgcmVjZWl2ZWRcbiAgICAgKiBhbiB1cGRhdGUgZHVyaW5nIHRoaXMgcmVtb3RlIGV2ZW50LlxuICAgICAqL1xuICAgIHMsIFxuICAgIC8qKlxuICAgICAqIFRoZSBzZXQgb2YgZG9jdW1lbnRzIHRoYXQgd2VyZSByZW1vdmVkIGZyb20gdGhpcyB0YXJnZXQgYXMgcGFydCBvZiB0aGlzXG4gICAgICogcmVtb3RlIGV2ZW50LlxuICAgICAqL1xuICAgIGkpIHtcbiAgICAgICAgdGhpcy5yZXN1bWVUb2tlbiA9IHQsIHRoaXMuY3VycmVudCA9IGUsIHRoaXMuYWRkZWREb2N1bWVudHMgPSBuLCB0aGlzLm1vZGlmaWVkRG9jdW1lbnRzID0gcywgXG4gICAgICAgIHRoaXMucmVtb3ZlZERvY3VtZW50cyA9IGk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY3JlYXRlIGEgc3ludGhlc2l6ZWQgVGFyZ2V0Q2hhbmdlcyB0aGF0IGNhbiBiZSB1c2VkIHRvXG4gICAgICogYXBwbHkgYSBDVVJSRU5UIHN0YXR1cyBjaGFuZ2UgdG8gYSBWaWV3IChmb3IgcXVlcmllcyBleGVjdXRlZCBpbiBhIGRpZmZlcmVudFxuICAgICAqIHRhYikgb3IgZm9yIG5ldyBxdWVyaWVzICh0byByYWlzZSBzbmFwc2hvdHMgd2l0aCBjb3JyZWN0IENVUlJFTlQgc3RhdHVzKS5cbiAgICAgKi8gICAgc3RhdGljIGNyZWF0ZVN5bnRoZXNpemVkVGFyZ2V0Q2hhbmdlRm9yQ3VycmVudENoYW5nZSh0LCBlKSB7XG4gICAgICAgIHJldHVybiBuZXcgem4ocHQuRU1QVFlfQllURV9TVFJJTkcsIGUsIEduKCksIEduKCksIEduKCkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogUmVwcmVzZW50cyBhIGNoYW5nZWQgZG9jdW1lbnQgYW5kIGEgbGlzdCBvZiB0YXJnZXQgaWRzIHRvIHdoaWNoIHRoaXMgY2hhbmdlXG4gKiBhcHBsaWVzLlxuICpcbiAqIElmIGRvY3VtZW50IGhhcyBiZWVuIGRlbGV0ZWQgTm9Eb2N1bWVudCB3aWxsIGJlIHByb3ZpZGVkLlxuICovIGNsYXNzIEhuIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKiogVGhlIG5ldyBkb2N1bWVudCBhcHBsaWVzIHRvIGFsbCBvZiB0aGVzZSB0YXJnZXRzLiAqL1xuICAgIHQsIFxuICAgIC8qKiBUaGUgbmV3IGRvY3VtZW50IGlzIHJlbW92ZWQgZnJvbSBhbGwgb2YgdGhlc2UgdGFyZ2V0cy4gKi9cbiAgICBlLCBcbiAgICAvKiogVGhlIGtleSBvZiB0aGUgZG9jdW1lbnQgZm9yIHRoaXMgY2hhbmdlLiAqL1xuICAgIG4sIFxuICAgIC8qKlxuICAgICAqIFRoZSBuZXcgZG9jdW1lbnQgb3IgTm9Eb2N1bWVudCBpZiBpdCB3YXMgZGVsZXRlZC4gSXMgbnVsbCBpZiB0aGVcbiAgICAgKiBkb2N1bWVudCB3ZW50IG91dCBvZiB2aWV3IHdpdGhvdXQgdGhlIHNlcnZlciBzZW5kaW5nIGEgbmV3IGRvY3VtZW50LlxuICAgICAqL1xuICAgIHMpIHtcbiAgICAgICAgdGhpcy5PID0gdCwgdGhpcy5yZW1vdmVkVGFyZ2V0SWRzID0gZSwgdGhpcy5rZXkgPSBuLCB0aGlzLiQgPSBzO1xuICAgIH1cbn1cblxuY2xhc3MgSm4ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy50YXJnZXRJZCA9IHQsIHRoaXMuRiA9IGU7XG4gICAgfVxufVxuXG5jbGFzcyBZbiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqIFdoYXQga2luZCBvZiBjaGFuZ2Ugb2NjdXJyZWQgdG8gdGhlIHdhdGNoIHRhcmdldC4gKi9cbiAgICB0LCBcbiAgICAvKiogVGhlIHRhcmdldCBJRHMgdGhhdCB3ZXJlIGFkZGVkL3JlbW92ZWQvc2V0LiAqL1xuICAgIGUsIFxuICAgIC8qKlxuICAgICAqIEFuIG9wYXF1ZSwgc2VydmVyLWFzc2lnbmVkIHRva2VuIHRoYXQgYWxsb3dzIHdhdGNoaW5nIGEgdGFyZ2V0IHRvIGJlXG4gICAgICogcmVzdW1lZCBhZnRlciBkaXNjb25uZWN0aW5nIHdpdGhvdXQgcmV0cmFuc21pdHRpbmcgYWxsIHRoZSBkYXRhIHRoYXRcbiAgICAgKiBtYXRjaGVzIHRoZSB0YXJnZXQuIFRoZSByZXN1bWUgdG9rZW4gZXNzZW50aWFsbHkgaWRlbnRpZmllcyBhIHBvaW50IGluXG4gICAgICogdGltZSBmcm9tIHdoaWNoIHRoZSBzZXJ2ZXIgc2hvdWxkIHJlc3VtZSBzZW5kaW5nIHJlc3VsdHMuXG4gICAgICovXG4gICAgbiA9IHB0LkVNUFRZX0JZVEVfU1RSSU5HXG4gICAgLyoqIEFuIFJQQyBlcnJvciBpbmRpY2F0aW5nIHdoeSB0aGUgd2F0Y2ggZmFpbGVkLiAqLyAsIHMgPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB0LCB0aGlzLnRhcmdldElkcyA9IGUsIHRoaXMucmVzdW1lVG9rZW4gPSBuLCB0aGlzLmNhdXNlID0gcztcbiAgICB9XG59XG5cbi8qKiBUcmFja3MgdGhlIGludGVybmFsIHN0YXRlIG9mIGEgV2F0Y2ggdGFyZ2V0LiAqLyBjbGFzcyBYbiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgbnVtYmVyIG9mIHBlbmRpbmcgcmVzcG9uc2VzIChhZGRzIG9yIHJlbW92ZXMpIHRoYXQgd2UgYXJlIHdhaXRpbmcgb24uXG4gICAgICAgICAqIFdlIG9ubHkgY29uc2lkZXIgdGFyZ2V0cyBhY3RpdmUgdGhhdCBoYXZlIG5vIHBlbmRpbmcgcmVzcG9uc2VzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5CID0gMCwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBLZWVwcyB0cmFjayBvZiB0aGUgZG9jdW1lbnQgY2hhbmdlcyBzaW5jZSB0aGUgbGFzdCByYWlzZWQgc25hcHNob3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZXNlIGNoYW5nZXMgYXJlIGNvbnRpbnVvdXNseSB1cGRhdGVkIGFzIHdlIHJlY2VpdmUgZG9jdW1lbnQgdXBkYXRlcyBhbmRcbiAgICAgICAgICogYWx3YXlzIHJlZmxlY3QgdGhlIGN1cnJlbnQgc2V0IG9mIGNoYW5nZXMgYWdhaW5zdCB0aGUgbGFzdCBpc3N1ZWQgc25hcHNob3QuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLkwgPSBlcygpLCBcbiAgICAgICAgLyoqIFNlZSBwdWJsaWMgZ2V0dGVycyBmb3IgZXhwbGFuYXRpb25zIG9mIHRoZXNlIGZpZWxkcy4gKi9cbiAgICAgICAgdGhpcy5xID0gcHQuRU1QVFlfQllURV9TVFJJTkcsIHRoaXMuVSA9ICExLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZXRoZXIgdGhpcyB0YXJnZXQgc3RhdGUgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBuZXh0IHNuYXBzaG90LiBXZVxuICAgICAgICAgKiBpbml0aWFsaXplIHRvIHRydWUgc28gdGhhdCBuZXdseS1hZGRlZCB0YXJnZXRzIGFyZSBpbmNsdWRlZCBpbiB0aGUgbmV4dFxuICAgICAgICAgKiBSZW1vdGVFdmVudC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuSyA9ICEwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoaXMgdGFyZ2V0IGhhcyBiZWVuIG1hcmtlZCAnY3VycmVudCcuXG4gICAgICpcbiAgICAgKiAnQ3VycmVudCcgaGFzIHNwZWNpYWwgbWVhbmluZyBpbiB0aGUgUlBDIHByb3RvY29sOiBJdCBpbXBsaWVzIHRoYXQgdGhlXG4gICAgICogV2F0Y2ggYmFja2VuZCBoYXMgc2VudCB1cyBhbGwgY2hhbmdlcyB1cCB0byB0aGUgcG9pbnQgYXQgd2hpY2ggdGhlIHRhcmdldFxuICAgICAqIHdhcyBhZGRlZCBhbmQgdGhhdCB0aGUgdGFyZ2V0IGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVzdCBvZiB0aGUgd2F0Y2hcbiAgICAgKiBzdHJlYW0uXG4gICAgICovICAgIGdldCBjdXJyZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5VO1xuICAgIH1cbiAgICAvKiogVGhlIGxhc3QgcmVzdW1lIHRva2VuIHNlbnQgdG8gdXMgZm9yIHRoaXMgdGFyZ2V0LiAqLyAgICBnZXQgcmVzdW1lVG9rZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnE7XG4gICAgfVxuICAgIC8qKiBXaGV0aGVyIHRoaXMgdGFyZ2V0IGhhcyBwZW5kaW5nIHRhcmdldCBhZGRzIG9yIHRhcmdldCByZW1vdmVzLiAqLyAgICBnZXQgRygpIHtcbiAgICAgICAgcmV0dXJuIDAgIT09IHRoaXMuQjtcbiAgICB9XG4gICAgLyoqIFdoZXRoZXIgd2UgaGF2ZSBtb2RpZmllZCBhbnkgc3RhdGUgdGhhdCBzaG91bGQgdHJpZ2dlciBhIHNuYXBzaG90LiAqLyAgICBnZXQgaigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuSztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXBwbGllcyB0aGUgcmVzdW1lIHRva2VuIHRvIHRoZSBUYXJnZXRDaGFuZ2UsIGJ1dCBvbmx5IHdoZW4gaXQgaGFzIGEgbmV3XG4gICAgICogdmFsdWUuIEVtcHR5IHJlc3VtZVRva2VucyBhcmUgZGlzY2FyZGVkLlxuICAgICAqLyAgICBXKHQpIHtcbiAgICAgICAgdC5hcHByb3hpbWF0ZUJ5dGVTaXplKCkgPiAwICYmICh0aGlzLksgPSAhMCwgdGhpcy5xID0gdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB0YXJnZXQgY2hhbmdlIGZyb20gdGhlIGN1cnJlbnQgc2V0IG9mIGNoYW5nZXMuXG4gICAgICpcbiAgICAgKiBUbyByZXNldCB0aGUgZG9jdW1lbnQgY2hhbmdlcyBhZnRlciByYWlzaW5nIHRoaXMgc25hcHNob3QsIGNhbGxcbiAgICAgKiBgY2xlYXJQZW5kaW5nQ2hhbmdlcygpYC5cbiAgICAgKi8gICAgSCgpIHtcbiAgICAgICAgbGV0IHQgPSBHbigpLCBlID0gR24oKSwgbiA9IEduKCk7XG4gICAgICAgIHJldHVybiB0aGlzLkwuZm9yRWFjaCgoKHMsIGkpID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAoaSkge1xuICAgICAgICAgICAgICBjYXNlIDAgLyogQWRkZWQgKi8gOlxuICAgICAgICAgICAgICAgIHQgPSB0LmFkZChzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlIDIgLyogTW9kaWZpZWQgKi8gOlxuICAgICAgICAgICAgICAgIGUgPSBlLmFkZChzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlIDEgLyogUmVtb3ZlZCAqLyA6XG4gICAgICAgICAgICAgICAgbiA9IG4uYWRkKHMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgTCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSksIG5ldyB6bih0aGlzLnEsIHRoaXMuVSwgdCwgZSwgbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgZG9jdW1lbnQgY2hhbmdlcyBhbmQgc2V0cyBgaGFzUGVuZGluZ0NoYW5nZXNgIHRvIGZhbHNlLlxuICAgICAqLyAgICBKKCkge1xuICAgICAgICB0aGlzLksgPSAhMSwgdGhpcy5MID0gZXMoKTtcbiAgICB9XG4gICAgWSh0LCBlKSB7XG4gICAgICAgIHRoaXMuSyA9ICEwLCB0aGlzLkwgPSB0aGlzLkwuaW5zZXJ0KHQsIGUpO1xuICAgIH1cbiAgICBYKHQpIHtcbiAgICAgICAgdGhpcy5LID0gITAsIHRoaXMuTCA9IHRoaXMuTC5yZW1vdmUodCk7XG4gICAgfVxuICAgIFooKSB7XG4gICAgICAgIHRoaXMuQiArPSAxO1xuICAgIH1cbiAgICB0dCgpIHtcbiAgICAgICAgdGhpcy5CIC09IDE7XG4gICAgfVxuICAgIGV0KCkge1xuICAgICAgICB0aGlzLksgPSAhMCwgdGhpcy5VID0gITA7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgaGVscGVyIGNsYXNzIHRvIGFjY3VtdWxhdGUgd2F0Y2ggY2hhbmdlcyBpbnRvIGEgUmVtb3RlRXZlbnQuXG4gKi9cbmNsYXNzIFpuIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMubnQgPSB0LCBcbiAgICAgICAgLyoqIFRoZSBpbnRlcm5hbCBzdGF0ZSBvZiBhbGwgdHJhY2tlZCB0YXJnZXRzLiAqL1xuICAgICAgICB0aGlzLnN0ID0gbmV3IE1hcCwgXG4gICAgICAgIC8qKiBLZWVwcyB0cmFjayBvZiB0aGUgZG9jdW1lbnRzIHRvIHVwZGF0ZSBzaW5jZSB0aGUgbGFzdCByYWlzZWQgc25hcHNob3QuICovXG4gICAgICAgIHRoaXMuaXQgPSBGbigpLCBcbiAgICAgICAgLyoqIEEgbWFwcGluZyBvZiBkb2N1bWVudCBrZXlzIHRvIHRoZWlyIHNldCBvZiB0YXJnZXQgSURzLiAqL1xuICAgICAgICB0aGlzLnJ0ID0gdHMoKSwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGxpc3Qgb2YgdGFyZ2V0cyB3aXRoIGV4aXN0ZW5jZSBmaWx0ZXIgbWlzbWF0Y2hlcy4gVGhlc2UgdGFyZ2V0cyBhcmVcbiAgICAgICAgICoga25vd24gdG8gYmUgaW5jb25zaXN0ZW50IGFuZCB0aGVpciBsaXN0ZW5zIG5lZWRzIHRvIGJlIHJlLWVzdGFibGlzaGVkIGJ5XG4gICAgICAgICAqIFJlbW90ZVN0b3JlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vdCA9IG5ldyBrbihydCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBhbmQgYWRkcyB0aGUgRG9jdW1lbnRXYXRjaENoYW5nZSB0byB0aGUgY3VycmVudCBzZXQgb2YgY2hhbmdlcy5cbiAgICAgKi8gICAgYXQodCkge1xuICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdC5PKSB0LiQgJiYgdC4kLmlzRm91bmREb2N1bWVudCgpID8gdGhpcy51dChlLCB0LiQpIDogdGhpcy5jdChlLCB0LmtleSwgdC4kKTtcbiAgICAgICAgZm9yIChjb25zdCBlIG9mIHQucmVtb3ZlZFRhcmdldElkcykgdGhpcy5jdChlLCB0LmtleSwgdC4kKTtcbiAgICB9XG4gICAgLyoqIFByb2Nlc3NlcyBhbmQgYWRkcyB0aGUgV2F0Y2hUYXJnZXRDaGFuZ2UgdG8gdGhlIGN1cnJlbnQgc2V0IG9mIGNoYW5nZXMuICovICAgIGh0KHQpIHtcbiAgICAgICAgdGhpcy5mb3JFYWNoVGFyZ2V0KHQsIChlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLmx0KGUpO1xuICAgICAgICAgICAgc3dpdGNoICh0LnN0YXRlKSB7XG4gICAgICAgICAgICAgIGNhc2UgMCAvKiBOb0NoYW5nZSAqLyA6XG4gICAgICAgICAgICAgICAgdGhpcy5mdChlKSAmJiBuLlcodC5yZXN1bWVUb2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSAxIC8qIEFkZGVkICovIDpcbiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGRlY3JlbWVudCB0aGUgbnVtYmVyIG9mIHBlbmRpbmcgYWNrcyBuZWVkZWQgZnJvbSB3YXRjaFxuICAgICAgICAgICAgICAgIC8vIGZvciB0aGlzIHRhcmdldElkLlxuICAgICAgICAgICAgICAgIG4udHQoKSwgbi5HIHx8IFxuICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBmcmVzaGx5IGFkZGVkIHRhcmdldCwgc28gd2UgbmVlZCB0byByZXNldCBhbnkgc3RhdGVcbiAgICAgICAgICAgICAgICAvLyB0aGF0IHdlIGhhZCBwcmV2aW91c2x5LiBUaGlzIGNhbiBoYXBwZW4gZS5nLiB3aGVuIHJlbW92ZSBhbmQgYWRkXG4gICAgICAgICAgICAgICAgLy8gYmFjayBhIHRhcmdldCBmb3IgZXhpc3RlbmNlIGZpbHRlciBtaXNtYXRjaGVzLlxuICAgICAgICAgICAgICAgIG4uSigpLCBuLlcodC5yZXN1bWVUb2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSAyIC8qIFJlbW92ZWQgKi8gOlxuICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiByZW1vdmVkIHRhcmdldHMgdG8gd2UgY2FuIHBvc3QtZmlsdGVyIGFuZFxuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBhbnkgdGFyZ2V0IGNoYW5nZXMuXG4gICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBkZWNyZW1lbnQgdGhlIG51bWJlciBvZiBwZW5kaW5nIGFja3MgbmVlZGVkIGZyb20gd2F0Y2hcbiAgICAgICAgICAgICAgICAvLyBmb3IgdGhpcyB0YXJnZXRJZC5cbiAgICAgICAgICAgICAgICBuLnR0KCksIG4uRyB8fCB0aGlzLnJlbW92ZVRhcmdldChlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlIDMgLyogQ3VycmVudCAqLyA6XG4gICAgICAgICAgICAgICAgdGhpcy5mdChlKSAmJiAobi5ldCgpLCBuLlcodC5yZXN1bWVUb2tlbikpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgNCAvKiBSZXNldCAqLyA6XG4gICAgICAgICAgICAgICAgdGhpcy5mdChlKSAmJiAoXG4gICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHRhcmdldCBhbmQgc3ludGhlc2l6ZXMgcmVtb3ZlcyBmb3IgYWxsIGV4aXN0aW5nXG4gICAgICAgICAgICAgICAgLy8gZG9jdW1lbnRzLiBUaGUgYmFja2VuZCB3aWxsIHJlLWFkZCBhbnkgZG9jdW1lbnRzIHRoYXQgc3RpbGxcbiAgICAgICAgICAgICAgICAvLyBtYXRjaCB0aGUgdGFyZ2V0IGJlZm9yZSBpdCBzZW5kcyB0aGUgbmV4dCBnbG9iYWwgc25hcHNob3QuXG4gICAgICAgICAgICAgICAgdGhpcy5kdChlKSwgbi5XKHQucmVzdW1lVG9rZW4pKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIEwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGFsbCB0YXJnZXRJZHMgdGhhdCB0aGUgd2F0Y2ggY2hhbmdlIGFwcGxpZXMgdG86IGVpdGhlciB0aGVcbiAgICAgKiB0YXJnZXRJZHMgZXhwbGljaXRseSBsaXN0ZWQgaW4gdGhlIGNoYW5nZSBvciB0aGUgdGFyZ2V0SWRzIG9mIGFsbCBjdXJyZW50bHlcbiAgICAgKiBhY3RpdmUgdGFyZ2V0cy5cbiAgICAgKi8gICAgZm9yRWFjaFRhcmdldCh0LCBlKSB7XG4gICAgICAgIHQudGFyZ2V0SWRzLmxlbmd0aCA+IDAgPyB0LnRhcmdldElkcy5mb3JFYWNoKGUpIDogdGhpcy5zdC5mb3JFYWNoKCgodCwgbikgPT4ge1xuICAgICAgICAgICAgdGhpcy5mdChuKSAmJiBlKG4pO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgZXhpc3RlbmNlIGZpbHRlcnMgYW5kIHN5bnRoZXNpemVzIGRlbGV0ZXMgZm9yIGZpbHRlciBtaXNtYXRjaGVzLlxuICAgICAqIFRhcmdldHMgdGhhdCBhcmUgaW52YWxpZGF0ZWQgYnkgZmlsdGVyIG1pc21hdGNoZXMgYXJlIGFkZGVkIHRvXG4gICAgICogYHBlbmRpbmdUYXJnZXRSZXNldHNgLlxuICAgICAqLyAgICBfdCh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0LnRhcmdldElkLCBuID0gdC5GLmNvdW50LCBzID0gdGhpcy53dChlKTtcbiAgICAgICAgaWYgKHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBzLnRhcmdldDtcbiAgICAgICAgICAgIGlmIChmZSh0KSkgaWYgKDAgPT09IG4pIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgZXhpc3RlbmNlIGZpbHRlciB0b2xkIHVzIHRoZSBkb2N1bWVudCBkb2VzIG5vdCBleGlzdC4gV2UgZGVkdWNlXG4gICAgICAgICAgICAgICAgLy8gdGhhdCB0aGlzIGRvY3VtZW50IGRvZXMgbm90IGV4aXN0IGFuZCBhcHBseSBhIGRlbGV0ZWQgZG9jdW1lbnQgdG9cbiAgICAgICAgICAgICAgICAvLyBvdXIgdXBkYXRlcy4gV2l0aG91dCBhcHBseWluZyB0aGlzIGRlbGV0ZWQgZG9jdW1lbnQgdGhlcmUgbWlnaHQgYmVcbiAgICAgICAgICAgICAgICAvLyBhbm90aGVyIHF1ZXJ5IHRoYXQgd2lsbCByYWlzZSB0aGlzIGRvY3VtZW50IGFzIHBhcnQgb2YgYSBzbmFwc2hvdFxuICAgICAgICAgICAgICAgIC8vIHVudGlsIGl0IGlzIHJlc29sdmVkLCBlc3NlbnRpYWxseSBleHBvc2luZyBpbmNvbnNpc3RlbmN5IGJldHdlZW5cbiAgICAgICAgICAgICAgICAvLyBxdWVyaWVzLlxuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBuZXcgeHQodC5wYXRoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmN0KGUsIG4sIHRlLm5ld05vRG9jdW1lbnQobiwgY3QubWluKCkpKTtcbiAgICAgICAgICAgIH0gZWxzZSBxKDEgPT09IG4pOyBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmd0KGUpICE9PSBuICYmIChcbiAgICAgICAgICAgICAgICAvLyBFeGlzdGVuY2UgZmlsdGVyIG1pc21hdGNoOiBXZSByZXNldCB0aGUgbWFwcGluZyBhbmQgcmFpc2UgYSBuZXdcbiAgICAgICAgICAgICAgICAvLyBzbmFwc2hvdCB3aXRoIGBpc0Zyb21DYWNoZTp0cnVlYC5cbiAgICAgICAgICAgICAgICB0aGlzLmR0KGUpLCB0aGlzLm90ID0gdGhpcy5vdC5hZGQoZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBjdXJyZW50bHkgYWNjdW11bGF0ZWQgc3RhdGUgaW50byBhIHJlbW90ZSBldmVudCBhdCB0aGVcbiAgICAgKiBwcm92aWRlZCBzbmFwc2hvdCB2ZXJzaW9uLiBSZXNldHMgdGhlIGFjY3VtdWxhdGVkIGNoYW5nZXMgYmVmb3JlIHJldHVybmluZy5cbiAgICAgKi8gICAgeXQodCkge1xuICAgICAgICBjb25zdCBlID0gbmV3IE1hcDtcbiAgICAgICAgdGhpcy5zdC5mb3JFYWNoKCgobiwgcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMud3Qocyk7XG4gICAgICAgICAgICBpZiAoaSkge1xuICAgICAgICAgICAgICAgIGlmIChuLmN1cnJlbnQgJiYgZmUoaS50YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIERvY3VtZW50IHF1ZXJpZXMgZm9yIGRvY3VtZW50IHRoYXQgZG9uJ3QgZXhpc3QgY2FuIHByb2R1Y2UgYW4gZW1wdHlcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVzdWx0IHNldC4gVG8gdXBkYXRlIG91ciBsb2NhbCBjYWNoZSwgd2Ugc3ludGhlc2l6ZSBhIGRvY3VtZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBpZiB3ZSBoYXZlIG5vdCBwcmV2aW91c2x5IHJlY2VpdmVkIHRoZSBkb2N1bWVudC4gVGhpc1xuICAgICAgICAgICAgICAgICAgICAvLyByZXNvbHZlcyB0aGUgbGltYm8gc3RhdGUgb2YgdGhlIGRvY3VtZW50LCByZW1vdmluZyBpdCBmcm9tXG4gICAgICAgICAgICAgICAgICAgIC8vIGxpbWJvRG9jdW1lbnRSZWZzLlxuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGRpbW9uZCk6IElkZWFsbHkgd2Ugd291bGQgaGF2ZSBhbiBleHBsaWNpdCBsb29rdXAgdGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgcmVzdWx0aW5nIGluIGFuIGV4cGxpY2l0IGRlbGV0ZSBtZXNzYWdlIGFuZCB3ZSBjb3VsZFxuICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgdGhpcyBzcGVjaWFsIGxvZ2ljLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gbmV3IHh0KGkudGFyZ2V0LnBhdGgpO1xuICAgICAgICAgICAgICAgICAgICBudWxsICE9PSB0aGlzLml0LmdldChlKSB8fCB0aGlzLkl0KHMsIGUpIHx8IHRoaXMuY3QocywgZSwgdGUubmV3Tm9Eb2N1bWVudChlLCB0KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG4uaiAmJiAoZS5zZXQocywgbi5IKCkpLCBuLkooKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICAgICAgbGV0IG4gPSBHbigpO1xuICAgICAgICAvLyBXZSBleHRyYWN0IHRoZSBzZXQgb2YgbGltYm8tb25seSBkb2N1bWVudCB1cGRhdGVzIGFzIHRoZSBHQyBsb2dpY1xuICAgICAgICAvLyBzcGVjaWFsLWNhc2VzIGRvY3VtZW50cyB0aGF0IGRvIG5vdCBhcHBlYXIgaW4gdGhlIHRhcmdldCBjYWNoZS5cbiAgICAgICAgXG4gICAgICAgIC8vIFRPRE8oZ3NvbHRpcyk6IEV4cGFuZCBvbiB0aGlzIGNvbW1lbnQgb25jZSBHQyBpcyBhdmFpbGFibGUgaW4gdGhlIEpTXG4gICAgICAgIC8vIGNsaWVudC5cbiAgICAgICAgICAgICAgICB0aGlzLnJ0LmZvckVhY2goKCh0LCBlKSA9PiB7XG4gICAgICAgICAgICBsZXQgcyA9ICEwO1xuICAgICAgICAgICAgZS5mb3JFYWNoV2hpbGUoKHQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLnd0KHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiAhZSB8fCAyIC8qIExpbWJvUmVzb2x1dGlvbiAqLyA9PT0gZS5wdXJwb3NlIHx8IChzID0gITEsICExKTtcbiAgICAgICAgICAgIH0pKSwgcyAmJiAobiA9IG4uYWRkKHQpKTtcbiAgICAgICAgfSkpLCB0aGlzLml0LmZvckVhY2goKChlLCBuKSA9PiBuLnNldFJlYWRUaW1lKHQpKSk7XG4gICAgICAgIGNvbnN0IHMgPSBuZXcgV24odCwgZSwgdGhpcy5vdCwgdGhpcy5pdCwgbik7XG4gICAgICAgIHJldHVybiB0aGlzLml0ID0gRm4oKSwgdGhpcy5ydCA9IHRzKCksIHRoaXMub3QgPSBuZXcga24ocnQpLCBzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBwcm92aWRlZCBkb2N1bWVudCB0byB0aGUgaW50ZXJuYWwgbGlzdCBvZiBkb2N1bWVudCB1cGRhdGVzIGFuZFxuICAgICAqIGl0cyBkb2N1bWVudCBrZXkgdG8gdGhlIGdpdmVuIHRhcmdldCdzIG1hcHBpbmcuXG4gICAgICovXG4gICAgLy8gVmlzaWJsZSBmb3IgdGVzdGluZy5cbiAgICB1dCh0LCBlKSB7XG4gICAgICAgIGlmICghdGhpcy5mdCh0KSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBuID0gdGhpcy5JdCh0LCBlLmtleSkgPyAyIC8qIE1vZGlmaWVkICovIDogMCAvKiBBZGRlZCAqLztcbiAgICAgICAgdGhpcy5sdCh0KS5ZKGUua2V5LCBuKSwgdGhpcy5pdCA9IHRoaXMuaXQuaW5zZXJ0KGUua2V5LCBlKSwgdGhpcy5ydCA9IHRoaXMucnQuaW5zZXJ0KGUua2V5LCB0aGlzLlR0KGUua2V5KS5hZGQodCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBwcm92aWRlZCBkb2N1bWVudCBmcm9tIHRoZSB0YXJnZXQgbWFwcGluZy4gSWYgdGhlXG4gICAgICogZG9jdW1lbnQgbm8gbG9uZ2VyIG1hdGNoZXMgdGhlIHRhcmdldCwgYnV0IHRoZSBkb2N1bWVudCdzIHN0YXRlIGlzIHN0aWxsXG4gICAgICoga25vd24gKGUuZy4gd2Uga25vdyB0aGF0IHRoZSBkb2N1bWVudCB3YXMgZGVsZXRlZCBvciB3ZSByZWNlaXZlZCB0aGUgY2hhbmdlXG4gICAgICogdGhhdCBjYXVzZWQgdGhlIGZpbHRlciBtaXNtYXRjaCksIHRoZSBuZXcgZG9jdW1lbnQgY2FuIGJlIHByb3ZpZGVkXG4gICAgICogdG8gdXBkYXRlIHRoZSByZW1vdGUgZG9jdW1lbnQgY2FjaGUuXG4gICAgICovXG4gICAgLy8gVmlzaWJsZSBmb3IgdGVzdGluZy5cbiAgICBjdCh0LCBlLCBuKSB7XG4gICAgICAgIGlmICghdGhpcy5mdCh0KSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBzID0gdGhpcy5sdCh0KTtcbiAgICAgICAgdGhpcy5JdCh0LCBlKSA/IHMuWShlLCAxIC8qIFJlbW92ZWQgKi8pIDogXG4gICAgICAgIC8vIFRoZSBkb2N1bWVudCBtYXkgaGF2ZSBlbnRlcmVkIGFuZCBsZWZ0IHRoZSB0YXJnZXQgYmVmb3JlIHdlIHJhaXNlZCBhXG4gICAgICAgIC8vIHNuYXBzaG90LCBzbyB3ZSBjYW4ganVzdCBpZ25vcmUgdGhlIGNoYW5nZS5cbiAgICAgICAgcy5YKGUpLCB0aGlzLnJ0ID0gdGhpcy5ydC5pbnNlcnQoZSwgdGhpcy5UdChlKS5kZWxldGUodCkpLCBuICYmICh0aGlzLml0ID0gdGhpcy5pdC5pbnNlcnQoZSwgbikpO1xuICAgIH1cbiAgICByZW1vdmVUYXJnZXQodCkge1xuICAgICAgICB0aGlzLnN0LmRlbGV0ZSh0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBjb3VudCBvZiBkb2N1bWVudHMgaW4gdGhlIHRhcmdldC4gVGhpcyBpbmNsdWRlcyBib3RoXG4gICAgICogdGhlIG51bWJlciBvZiBkb2N1bWVudHMgdGhhdCB0aGUgTG9jYWxTdG9yZSBjb25zaWRlcnMgdG8gYmUgcGFydCBvZiB0aGVcbiAgICAgKiB0YXJnZXQgYXMgd2VsbCBhcyBhbnkgYWNjdW11bGF0ZWQgY2hhbmdlcy5cbiAgICAgKi8gICAgZ3QodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5sdCh0KS5IKCk7XG4gICAgICAgIHJldHVybiB0aGlzLm50LmdldFJlbW90ZUtleXNGb3JUYXJnZXQodCkuc2l6ZSArIGUuYWRkZWREb2N1bWVudHMuc2l6ZSAtIGUucmVtb3ZlZERvY3VtZW50cy5zaXplO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbmNyZW1lbnQgdGhlIG51bWJlciBvZiBhY2tzIG5lZWRlZCBmcm9tIHdhdGNoIGJlZm9yZSB3ZSBjYW4gY29uc2lkZXIgdGhlXG4gICAgICogc2VydmVyIHRvIGJlICdpbi1zeW5jJyB3aXRoIHRoZSBjbGllbnQncyBhY3RpdmUgdGFyZ2V0cy5cbiAgICAgKi8gICAgWih0KSB7XG4gICAgICAgIHRoaXMubHQodCkuWigpO1xuICAgIH1cbiAgICBsdCh0KSB7XG4gICAgICAgIGxldCBlID0gdGhpcy5zdC5nZXQodCk7XG4gICAgICAgIHJldHVybiBlIHx8IChlID0gbmV3IFhuLCB0aGlzLnN0LnNldCh0LCBlKSksIGU7XG4gICAgfVxuICAgIFR0KHQpIHtcbiAgICAgICAgbGV0IGUgPSB0aGlzLnJ0LmdldCh0KTtcbiAgICAgICAgcmV0dXJuIGUgfHwgKGUgPSBuZXcga24ocnQpLCB0aGlzLnJ0ID0gdGhpcy5ydC5pbnNlcnQodCwgZSkpLCBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBWZXJpZmllcyB0aGF0IHRoZSB1c2VyIGlzIHN0aWxsIGludGVyZXN0ZWQgaW4gdGhpcyB0YXJnZXQgKGJ5IGNhbGxpbmdcbiAgICAgKiBgZ2V0VGFyZ2V0RGF0YUZvclRhcmdldCgpYCkgYW5kIHRoYXQgd2UgYXJlIG5vdCB3YWl0aW5nIGZvciBwZW5kaW5nIEFERHNcbiAgICAgKiBmcm9tIHdhdGNoLlxuICAgICAqLyAgICBmdCh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBudWxsICE9PSB0aGlzLnd0KHQpO1xuICAgICAgICByZXR1cm4gZSB8fCBPKFwiV2F0Y2hDaGFuZ2VBZ2dyZWdhdG9yXCIsIFwiRGV0ZWN0ZWQgaW5hY3RpdmUgdGFyZ2V0XCIsIHQpLCBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBUYXJnZXREYXRhIGZvciBhbiBhY3RpdmUgdGFyZ2V0IChpLmUuIGEgdGFyZ2V0IHRoYXQgdGhlIHVzZXJcbiAgICAgKiBpcyBzdGlsbCBpbnRlcmVzdGVkIGluIHRoYXQgaGFzIG5vIG91dHN0YW5kaW5nIHRhcmdldCBjaGFuZ2UgcmVxdWVzdHMpLlxuICAgICAqLyAgICB3dCh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLnN0LmdldCh0KTtcbiAgICAgICAgcmV0dXJuIGUgJiYgZS5HID8gbnVsbCA6IHRoaXMubnQuRXQodCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgc3RhdGUgb2YgYSBXYXRjaCB0YXJnZXQgdG8gaXRzIGluaXRpYWwgc3RhdGUgKGUuZy4gc2V0c1xuICAgICAqICdjdXJyZW50JyB0byBmYWxzZSwgY2xlYXJzIHRoZSByZXN1bWUgdG9rZW4gYW5kIHJlbW92ZXMgaXRzIHRhcmdldCBtYXBwaW5nXG4gICAgICogZnJvbSBhbGwgZG9jdW1lbnRzKS5cbiAgICAgKi8gICAgZHQodCkge1xuICAgICAgICB0aGlzLnN0LnNldCh0LCBuZXcgWG4pO1xuICAgICAgICB0aGlzLm50LmdldFJlbW90ZUtleXNGb3JUYXJnZXQodCkuZm9yRWFjaCgoZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmN0KHQsIGUsIC8qdXBkYXRlZERvY3VtZW50PSovIG51bGwpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgTG9jYWxTdG9yZSBjb25zaWRlcnMgdGhlIGRvY3VtZW50IHRvIGJlIHBhcnQgb2YgdGhlXG4gICAgICogc3BlY2lmaWVkIHRhcmdldC5cbiAgICAgKi8gICAgSXQodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5udC5nZXRSZW1vdGVLZXlzRm9yVGFyZ2V0KHQpLmhhcyhlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHRzKCkge1xuICAgIHJldHVybiBuZXcgQ24oeHQuY29tcGFyYXRvcik7XG59XG5cbmZ1bmN0aW9uIGVzKCkge1xuICAgIHJldHVybiBuZXcgQ24oeHQuY29tcGFyYXRvcik7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGNvbnN0IG5zID0gKCgpID0+IHtcbiAgICBjb25zdCB0ID0ge1xuICAgICAgICBhc2M6IFwiQVNDRU5ESU5HXCIsXG4gICAgICAgIGRlc2M6IFwiREVTQ0VORElOR1wiXG4gICAgfTtcbiAgICByZXR1cm4gdDtcbn0pKCksIHNzID0gKCgpID0+IHtcbiAgICBjb25zdCB0ID0ge1xuICAgICAgICBcIjxcIjogXCJMRVNTX1RIQU5cIixcbiAgICAgICAgXCI8PVwiOiBcIkxFU1NfVEhBTl9PUl9FUVVBTFwiLFxuICAgICAgICBcIj5cIjogXCJHUkVBVEVSX1RIQU5cIixcbiAgICAgICAgXCI+PVwiOiBcIkdSRUFURVJfVEhBTl9PUl9FUVVBTFwiLFxuICAgICAgICBcIj09XCI6IFwiRVFVQUxcIixcbiAgICAgICAgXCIhPVwiOiBcIk5PVF9FUVVBTFwiLFxuICAgICAgICBcImFycmF5LWNvbnRhaW5zXCI6IFwiQVJSQVlfQ09OVEFJTlNcIixcbiAgICAgICAgaW46IFwiSU5cIixcbiAgICAgICAgXCJub3QtaW5cIjogXCJOT1RfSU5cIixcbiAgICAgICAgXCJhcnJheS1jb250YWlucy1hbnlcIjogXCJBUlJBWV9DT05UQUlOU19BTllcIlxuICAgIH07XG4gICAgcmV0dXJuIHQ7XG59KSgpO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgZ2VuZXJhdGVzIEpzb25PYmplY3QgdmFsdWVzIGZvciB0aGUgRGF0YXN0b3JlIEFQSSBzdWl0YWJsZSBmb3JcbiAqIHNlbmRpbmcgdG8gZWl0aGVyIEdSUEMgc3R1YiBtZXRob2RzIG9yIHZpYSB0aGUgSlNPTi9IVFRQIFJFU1QgQVBJLlxuICpcbiAqIFRoZSBzZXJpYWxpemVyIHN1cHBvcnRzIGJvdGggUHJvdG9idWYuanMgYW5kIFByb3RvMyBKU09OIGZvcm1hdHMuIEJ5XG4gKiBzZXR0aW5nIGB1c2VQcm90bzNKc29uYCB0byB0cnVlLCB0aGUgc2VyaWFsaXplciB3aWxsIHVzZSB0aGUgUHJvdG8zIEpTT05cbiAqIGZvcm1hdC5cbiAqXG4gKiBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgUHJvdG8zIEpTT04gZm9ybWF0IGNoZWNrXG4gKiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAqXG4gKiBUT0RPKGtsaW10KTogV2UgY2FuIHJlbW92ZSB0aGUgZGF0YWJhc2VJZCBhcmd1bWVudCBpZiB3ZSBrZWVwIHRoZSBmdWxsXG4gKiByZXNvdXJjZSBuYW1lIGluIGRvY3VtZW50cy5cbiAqL1xuY2xhc3MgaXMge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5kYXRhYmFzZUlkID0gdCwgdGhpcy5OID0gZTtcbiAgICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHZhbHVlIGZvciBhIERhdGUgdGhhdCdzIGFwcHJvcHJpYXRlIHRvIHB1dCBpbnRvIGEgcHJvdG8uXG4gKi9cbmZ1bmN0aW9uIHJzKHQsIGUpIHtcbiAgICBpZiAodC5OKSB7XG4gICAgICAgIHJldHVybiBgJHtuZXcgRGF0ZSgxZTMgKiBlLnNlY29uZHMpLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvXFwuXFxkKi8sIFwiXCIpLnJlcGxhY2UoXCJaXCIsIFwiXCIpfS4keyhcIjAwMDAwMDAwMFwiICsgZS5uYW5vc2Vjb25kcykuc2xpY2UoLTkpfVpgO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBzZWNvbmRzOiBcIlwiICsgZS5zZWNvbmRzLFxuICAgICAgICBuYW5vczogZS5uYW5vc2Vjb25kc1xuICAgIH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHZhbHVlIGZvciBieXRlcyB0aGF0J3MgYXBwcm9wcmlhdGUgdG8gcHV0IGluIGEgcHJvdG8uXG4gKlxuICogVmlzaWJsZSBmb3IgdGVzdGluZy5cbiAqL1xuZnVuY3Rpb24gb3ModCwgZSkge1xuICAgIHJldHVybiB0Lk4gPyBlLnRvQmFzZTY0KCkgOiBlLnRvVWludDhBcnJheSgpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBCeXRlU3RyaW5nIGJhc2VkIG9uIHRoZSBwcm90byBzdHJpbmcgdmFsdWUuXG4gKi8gZnVuY3Rpb24gYXModCwgZSkge1xuICAgIHJldHVybiBycyh0LCBlLnRvVGltZXN0YW1wKCkpO1xufVxuXG5mdW5jdGlvbiB1cyh0KSB7XG4gICAgcmV0dXJuIHEoISF0KSwgY3QuZnJvbVRpbWVzdGFtcChmdW5jdGlvbih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBUdCh0KTtcbiAgICAgICAgcmV0dXJuIG5ldyB1dChlLnNlY29uZHMsIGUubmFub3MpO1xuICAgIH0odCkpO1xufVxuXG5mdW5jdGlvbiBjcyh0LCBlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBfdChbIFwicHJvamVjdHNcIiwgdC5wcm9qZWN0SWQsIFwiZGF0YWJhc2VzXCIsIHQuZGF0YWJhc2UgXSk7XG4gICAgfSh0KS5jaGlsZChcImRvY3VtZW50c1wiKS5jaGlsZChlKS5jYW5vbmljYWxTdHJpbmcoKTtcbn1cblxuZnVuY3Rpb24gaHModCkge1xuICAgIGNvbnN0IGUgPSBfdC5mcm9tU3RyaW5nKHQpO1xuICAgIHJldHVybiBxKE9zKGUpKSwgZTtcbn1cblxuZnVuY3Rpb24gbHModCwgZSkge1xuICAgIHJldHVybiBjcyh0LmRhdGFiYXNlSWQsIGUucGF0aCk7XG59XG5cbmZ1bmN0aW9uIGZzKHQsIGUpIHtcbiAgICBjb25zdCBuID0gaHMoZSk7XG4gICAgaWYgKG4uZ2V0KDEpICE9PSB0LmRhdGFiYXNlSWQucHJvamVjdElkKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIFwiVHJpZWQgdG8gZGVzZXJpYWxpemUga2V5IGZyb20gZGlmZmVyZW50IHByb2plY3Q6IFwiICsgbi5nZXQoMSkgKyBcIiB2cyBcIiArIHQuZGF0YWJhc2VJZC5wcm9qZWN0SWQpO1xuICAgIGlmIChuLmdldCgzKSAhPT0gdC5kYXRhYmFzZUlkLmRhdGFiYXNlKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIFwiVHJpZWQgdG8gZGVzZXJpYWxpemUga2V5IGZyb20gZGlmZmVyZW50IGRhdGFiYXNlOiBcIiArIG4uZ2V0KDMpICsgXCIgdnMgXCIgKyB0LmRhdGFiYXNlSWQuZGF0YWJhc2UpO1xuICAgIHJldHVybiBuZXcgeHQobXMobikpO1xufVxuXG5mdW5jdGlvbiBkcyh0LCBlKSB7XG4gICAgcmV0dXJuIGNzKHQuZGF0YWJhc2VJZCwgZSk7XG59XG5cbmZ1bmN0aW9uIF9zKHQpIHtcbiAgICBjb25zdCBlID0gaHModCk7XG4gICAgLy8gSW4gdjFiZXRhMSBxdWVyaWVzIGZvciBjb2xsZWN0aW9ucyBhdCB0aGUgcm9vdCBkaWQgbm90IGhhdmUgYSB0cmFpbGluZ1xuICAgIC8vIFwiL2RvY3VtZW50c1wiLiBJbiB2MSBhbGwgcmVzb3VyY2UgcGF0aHMgY29udGFpbiBcIi9kb2N1bWVudHNcIi4gUHJlc2VydmUgdGhlXG4gICAgLy8gYWJpbGl0eSB0byByZWFkIHRoZSB2MWJldGExIGZvcm0gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBxdWVyaWVzIHBlcnNpc3RlZFxuICAgIC8vIGluIHRoZSBsb2NhbCB0YXJnZXQgY2FjaGUuXG4gICAgICAgIHJldHVybiA0ID09PSBlLmxlbmd0aCA/IF90LmVtcHR5UGF0aCgpIDogbXMoZSk7XG59XG5cbmZ1bmN0aW9uIHdzKHQpIHtcbiAgICByZXR1cm4gbmV3IF90KFsgXCJwcm9qZWN0c1wiLCB0LmRhdGFiYXNlSWQucHJvamVjdElkLCBcImRhdGFiYXNlc1wiLCB0LmRhdGFiYXNlSWQuZGF0YWJhc2UgXSkuY2Fub25pY2FsU3RyaW5nKCk7XG59XG5cbmZ1bmN0aW9uIG1zKHQpIHtcbiAgICByZXR1cm4gcSh0Lmxlbmd0aCA+IDQgJiYgXCJkb2N1bWVudHNcIiA9PT0gdC5nZXQoNCkpLCB0LnBvcEZpcnN0KDUpO1xufVxuXG4vKiogQ3JlYXRlcyBhIERvY3VtZW50IHByb3RvIGZyb20ga2V5IGFuZCBmaWVsZHMgKGJ1dCBubyBjcmVhdGUvdXBkYXRlIHRpbWUpICovIGZ1bmN0aW9uIGdzKHQsIGUsIG4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBscyh0LCBlKSxcbiAgICAgICAgZmllbGRzOiBuLnZhbHVlLm1hcFZhbHVlLmZpZWxkc1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIHlzKHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gZnModCwgZS5uYW1lKSwgaSA9IHVzKGUudXBkYXRlVGltZSksIHIgPSBuZXcgWHQoe1xuICAgICAgICBtYXBWYWx1ZToge1xuICAgICAgICAgICAgZmllbGRzOiBlLmZpZWxkc1xuICAgICAgICB9XG4gICAgfSksIG8gPSB0ZS5uZXdGb3VuZERvY3VtZW50KHMsIGksIHIpO1xuICAgIHJldHVybiBuICYmIG8uc2V0SGFzQ29tbWl0dGVkTXV0YXRpb25zKCksIG4gPyBvLnNldEhhc0NvbW1pdHRlZE11dGF0aW9ucygpIDogbztcbn1cblxuZnVuY3Rpb24gcHModCwgZSkge1xuICAgIHJldHVybiBcImZvdW5kXCIgaW4gZSA/IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgcSghIWUuZm91bmQpLCBlLmZvdW5kLm5hbWUsIGUuZm91bmQudXBkYXRlVGltZTtcbiAgICAgICAgY29uc3QgbiA9IGZzKHQsIGUuZm91bmQubmFtZSksIHMgPSB1cyhlLmZvdW5kLnVwZGF0ZVRpbWUpLCBpID0gbmV3IFh0KHtcbiAgICAgICAgICAgIG1hcFZhbHVlOiB7XG4gICAgICAgICAgICAgICAgZmllbGRzOiBlLmZvdW5kLmZpZWxkc1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRlLm5ld0ZvdW5kRG9jdW1lbnQobiwgcywgaSk7XG4gICAgfSh0LCBlKSA6IFwibWlzc2luZ1wiIGluIGUgPyBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIHEoISFlLm1pc3NpbmcpLCBxKCEhZS5yZWFkVGltZSk7XG4gICAgICAgIGNvbnN0IG4gPSBmcyh0LCBlLm1pc3NpbmcpLCBzID0gdXMoZS5yZWFkVGltZSk7XG4gICAgICAgIHJldHVybiB0ZS5uZXdOb0RvY3VtZW50KG4sIHMpO1xuICAgIH0odCwgZSkgOiBMKCk7XG59XG5cbmZ1bmN0aW9uIElzKHQsIGUpIHtcbiAgICBsZXQgbjtcbiAgICBpZiAoXCJ0YXJnZXRDaGFuZ2VcIiBpbiBlKSB7XG4gICAgICAgIGUudGFyZ2V0Q2hhbmdlO1xuICAgICAgICAvLyBwcm90bzMgZGVmYXVsdCB2YWx1ZSBpcyB1bnNldCBpbiBKU09OICh1bmRlZmluZWQpLCBzbyB1c2UgJ05PX0NIQU5HRSdcbiAgICAgICAgLy8gaWYgdW5zZXRcbiAgICAgICAgY29uc3QgcyA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHJldHVybiBcIk5PX0NIQU5HRVwiID09PSB0ID8gMCAvKiBOb0NoYW5nZSAqLyA6IFwiQUREXCIgPT09IHQgPyAxIC8qIEFkZGVkICovIDogXCJSRU1PVkVcIiA9PT0gdCA/IDIgLyogUmVtb3ZlZCAqLyA6IFwiQ1VSUkVOVFwiID09PSB0ID8gMyAvKiBDdXJyZW50ICovIDogXCJSRVNFVFwiID09PSB0ID8gNCAvKiBSZXNldCAqLyA6IEwoKTtcbiAgICAgICAgfShlLnRhcmdldENoYW5nZS50YXJnZXRDaGFuZ2VUeXBlIHx8IFwiTk9fQ0hBTkdFXCIpLCBpID0gZS50YXJnZXRDaGFuZ2UudGFyZ2V0SWRzIHx8IFtdLCByID0gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgcmV0dXJuIHQuTiA/IChxKHZvaWQgMCA9PT0gZSB8fCBcInN0cmluZ1wiID09IHR5cGVvZiBlKSwgcHQuZnJvbUJhc2U2NFN0cmluZyhlIHx8IFwiXCIpKSA6IChxKHZvaWQgMCA9PT0gZSB8fCBlIGluc3RhbmNlb2YgVWludDhBcnJheSksIFxuICAgICAgICAgICAgcHQuZnJvbVVpbnQ4QXJyYXkoZSB8fCBuZXcgVWludDhBcnJheSkpO1xuICAgICAgICB9KHQsIGUudGFyZ2V0Q2hhbmdlLnJlc3VtZVRva2VuKSwgbyA9IGUudGFyZ2V0Q2hhbmdlLmNhdXNlLCBhID0gbyAmJiBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdm9pZCAwID09PSB0LmNvZGUgPyBHLlVOS05PV04gOiBTbih0LmNvZGUpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBRKGUsIHQubWVzc2FnZSB8fCBcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAqIFJldHVybnMgYSB2YWx1ZSBmb3IgYSBudW1iZXIgKG9yIG51bGwpIHRoYXQncyBhcHByb3ByaWF0ZSB0byBwdXQgaW50b1xuICogYSBnb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZSBwcm90by5cbiAqIERPIE5PVCBVU0UgVEhJUyBGT1IgQU5ZVEhJTkcgRUxTRS5cbiAqIFRoaXMgbWV0aG9kIGNoZWF0cy4gSXQncyB0eXBlZCBhcyByZXR1cm5pbmcgXCJudW1iZXJcIiBiZWNhdXNlIHRoYXQncyB3aGF0XG4gKiBvdXIgZ2VuZXJhdGVkIHByb3RvIGludGVyZmFjZXMgc2F5IEludDMyVmFsdWUgbXVzdCBiZS4gQnV0IEdSUEMgYWN0dWFsbHlcbiAqIGV4cGVjdHMgYSB7IHZhbHVlOiA8bnVtYmVyPiB9IHN0cnVjdC5cbiAqLyAobyk7XG4gICAgICAgIG4gPSBuZXcgWW4ocywgaSwgciwgYSB8fCBudWxsKTtcbiAgICB9IGVsc2UgaWYgKFwiZG9jdW1lbnRDaGFuZ2VcIiBpbiBlKSB7XG4gICAgICAgIGUuZG9jdW1lbnRDaGFuZ2U7XG4gICAgICAgIGNvbnN0IHMgPSBlLmRvY3VtZW50Q2hhbmdlO1xuICAgICAgICBzLmRvY3VtZW50LCBzLmRvY3VtZW50Lm5hbWUsIHMuZG9jdW1lbnQudXBkYXRlVGltZTtcbiAgICAgICAgY29uc3QgaSA9IGZzKHQsIHMuZG9jdW1lbnQubmFtZSksIHIgPSB1cyhzLmRvY3VtZW50LnVwZGF0ZVRpbWUpLCBvID0gbmV3IFh0KHtcbiAgICAgICAgICAgIG1hcFZhbHVlOiB7XG4gICAgICAgICAgICAgICAgZmllbGRzOiBzLmRvY3VtZW50LmZpZWxkc1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSwgYSA9IHRlLm5ld0ZvdW5kRG9jdW1lbnQoaSwgciwgbyksIHUgPSBzLnRhcmdldElkcyB8fCBbXSwgYyA9IHMucmVtb3ZlZFRhcmdldElkcyB8fCBbXTtcbiAgICAgICAgbiA9IG5ldyBIbih1LCBjLCBhLmtleSwgYSk7XG4gICAgfSBlbHNlIGlmIChcImRvY3VtZW50RGVsZXRlXCIgaW4gZSkge1xuICAgICAgICBlLmRvY3VtZW50RGVsZXRlO1xuICAgICAgICBjb25zdCBzID0gZS5kb2N1bWVudERlbGV0ZTtcbiAgICAgICAgcy5kb2N1bWVudDtcbiAgICAgICAgY29uc3QgaSA9IGZzKHQsIHMuZG9jdW1lbnQpLCByID0gcy5yZWFkVGltZSA/IHVzKHMucmVhZFRpbWUpIDogY3QubWluKCksIG8gPSB0ZS5uZXdOb0RvY3VtZW50KGksIHIpLCBhID0gcy5yZW1vdmVkVGFyZ2V0SWRzIHx8IFtdO1xuICAgICAgICBuID0gbmV3IEhuKFtdLCBhLCBvLmtleSwgbyk7XG4gICAgfSBlbHNlIGlmIChcImRvY3VtZW50UmVtb3ZlXCIgaW4gZSkge1xuICAgICAgICBlLmRvY3VtZW50UmVtb3ZlO1xuICAgICAgICBjb25zdCBzID0gZS5kb2N1bWVudFJlbW92ZTtcbiAgICAgICAgcy5kb2N1bWVudDtcbiAgICAgICAgY29uc3QgaSA9IGZzKHQsIHMuZG9jdW1lbnQpLCByID0gcy5yZW1vdmVkVGFyZ2V0SWRzIHx8IFtdO1xuICAgICAgICBuID0gbmV3IEhuKFtdLCByLCBpLCBudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIShcImZpbHRlclwiIGluIGUpKSByZXR1cm4gTCgpO1xuICAgICAgICB7XG4gICAgICAgICAgICBlLmZpbHRlcjtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBlLmZpbHRlcjtcbiAgICAgICAgICAgIHQudGFyZ2V0SWQ7XG4gICAgICAgICAgICBjb25zdCBzID0gdC5jb3VudCB8fCAwLCBpID0gbmV3IGJuKHMpLCByID0gdC50YXJnZXRJZDtcbiAgICAgICAgICAgIG4gPSBuZXcgSm4ociwgaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG47XG59XG5cbmZ1bmN0aW9uIFRzKHQsIGUpIHtcbiAgICBsZXQgbjtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIHluKSBuID0ge1xuICAgICAgICB1cGRhdGU6IGdzKHQsIGUua2V5LCBlLnZhbHVlKVxuICAgIH07IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBBbikgbiA9IHtcbiAgICAgICAgZGVsZXRlOiBscyh0LCBlLmtleSlcbiAgICB9OyBlbHNlIGlmIChlIGluc3RhbmNlb2YgcG4pIG4gPSB7XG4gICAgICAgIHVwZGF0ZTogZ3ModCwgZS5rZXksIGUuZGF0YSksXG4gICAgICAgIHVwZGF0ZU1hc2s6IE1zKGUuZmllbGRNYXNrKVxuICAgIH07IGVsc2Uge1xuICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgUm4pKSByZXR1cm4gTCgpO1xuICAgICAgICBuID0ge1xuICAgICAgICAgICAgdmVyaWZ5OiBscyh0LCBlLmtleSlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGUuZmllbGRUcmFuc2Zvcm1zLmxlbmd0aCA+IDAgJiYgKG4udXBkYXRlVHJhbnNmb3JtcyA9IGUuZmllbGRUcmFuc2Zvcm1zLm1hcCgodCA9PiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBlLnRyYW5zZm9ybTtcbiAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBYZSkgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpZWxkUGF0aDogZS5maWVsZC5jYW5vbmljYWxTdHJpbmcoKSxcbiAgICAgICAgICAgIHNldFRvU2VydmVyVmFsdWU6IFwiUkVRVUVTVF9USU1FXCJcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBaZSkgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpZWxkUGF0aDogZS5maWVsZC5jYW5vbmljYWxTdHJpbmcoKSxcbiAgICAgICAgICAgIGFwcGVuZE1pc3NpbmdFbGVtZW50czoge1xuICAgICAgICAgICAgICAgIHZhbHVlczogbi5lbGVtZW50c1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAobiBpbnN0YW5jZW9mIGVuKSByZXR1cm4ge1xuICAgICAgICAgICAgZmllbGRQYXRoOiBlLmZpZWxkLmNhbm9uaWNhbFN0cmluZygpLFxuICAgICAgICAgICAgcmVtb3ZlQWxsRnJvbUFycmF5OiB7XG4gICAgICAgICAgICAgICAgdmFsdWVzOiBuLmVsZW1lbnRzXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGlmIChuIGluc3RhbmNlb2Ygc24pIHJldHVybiB7XG4gICAgICAgICAgICBmaWVsZFBhdGg6IGUuZmllbGQuY2Fub25pY2FsU3RyaW5nKCksXG4gICAgICAgICAgICBpbmNyZW1lbnQ6IG4ua1xuICAgICAgICB9O1xuICAgICAgICB0aHJvdyBMKCk7XG4gICAgfSgwLCB0KSkpKSwgZS5wcmVjb25kaXRpb24uaXNOb25lIHx8IChuLmN1cnJlbnREb2N1bWVudCA9IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gZS51cGRhdGVUaW1lID8ge1xuICAgICAgICAgICAgdXBkYXRlVGltZTogYXModCwgZS51cGRhdGVUaW1lKVxuICAgICAgICB9IDogdm9pZCAwICE9PSBlLmV4aXN0cyA/IHtcbiAgICAgICAgICAgIGV4aXN0czogZS5leGlzdHNcbiAgICAgICAgfSA6IEwoKTtcbiAgICB9KHQsIGUucHJlY29uZGl0aW9uKSksIG47XG59XG5cbmZ1bmN0aW9uIEVzKHQsIGUpIHtcbiAgICBjb25zdCBuID0gZS5jdXJyZW50RG9jdW1lbnQgPyBmdW5jdGlvbih0KSB7XG4gICAgICAgIHJldHVybiB2b2lkIDAgIT09IHQudXBkYXRlVGltZSA/IGhuLnVwZGF0ZVRpbWUodXModC51cGRhdGVUaW1lKSkgOiB2b2lkIDAgIT09IHQuZXhpc3RzID8gaG4uZXhpc3RzKHQuZXhpc3RzKSA6IGhuLm5vbmUoKTtcbiAgICB9KGUuY3VycmVudERvY3VtZW50KSA6IGhuLm5vbmUoKSwgcyA9IGUudXBkYXRlVHJhbnNmb3JtcyA/IGUudXBkYXRlVHJhbnNmb3Jtcy5tYXAoKGUgPT4gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICBsZXQgbiA9IG51bGw7XG4gICAgICAgIGlmIChcInNldFRvU2VydmVyVmFsdWVcIiBpbiBlKSBxKFwiUkVRVUVTVF9USU1FXCIgPT09IGUuc2V0VG9TZXJ2ZXJWYWx1ZSksIG4gPSBuZXcgWGU7IGVsc2UgaWYgKFwiYXBwZW5kTWlzc2luZ0VsZW1lbnRzXCIgaW4gZSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGUuYXBwZW5kTWlzc2luZ0VsZW1lbnRzLnZhbHVlcyB8fCBbXTtcbiAgICAgICAgICAgIG4gPSBuZXcgWmUodCk7XG4gICAgICAgIH0gZWxzZSBpZiAoXCJyZW1vdmVBbGxGcm9tQXJyYXlcIiBpbiBlKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZS5yZW1vdmVBbGxGcm9tQXJyYXkudmFsdWVzIHx8IFtdO1xuICAgICAgICAgICAgbiA9IG5ldyBlbih0KTtcbiAgICAgICAgfSBlbHNlIFwiaW5jcmVtZW50XCIgaW4gZSA/IG4gPSBuZXcgc24odCwgZS5pbmNyZW1lbnQpIDogTCgpO1xuICAgICAgICBjb25zdCBzID0gbXQuZnJvbVNlcnZlckZvcm1hdChlLmZpZWxkUGF0aCk7XG4gICAgICAgIHJldHVybiBuZXcgYW4ocywgbik7XG4gICAgfSh0LCBlKSkpIDogW107XG4gICAgaWYgKGUudXBkYXRlKSB7XG4gICAgICAgIGUudXBkYXRlLm5hbWU7XG4gICAgICAgIGNvbnN0IGkgPSBmcyh0LCBlLnVwZGF0ZS5uYW1lKSwgciA9IG5ldyBYdCh7XG4gICAgICAgICAgICBtYXBWYWx1ZToge1xuICAgICAgICAgICAgICAgIGZpZWxkczogZS51cGRhdGUuZmllbGRzXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZS51cGRhdGVNYXNrKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0LmZpZWxkUGF0aHMgfHwgW107XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBndChlLm1hcCgodCA9PiBtdC5mcm9tU2VydmVyRm9ybWF0KHQpKSkpO1xuICAgICAgICAgICAgfShlLnVwZGF0ZU1hc2spO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBwbihpLCByLCB0LCBuLCBzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IHluKGksIHIsIG4sIHMpO1xuICAgIH1cbiAgICBpZiAoZS5kZWxldGUpIHtcbiAgICAgICAgY29uc3QgcyA9IGZzKHQsIGUuZGVsZXRlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBbihzLCBuKTtcbiAgICB9XG4gICAgaWYgKGUudmVyaWZ5KSB7XG4gICAgICAgIGNvbnN0IHMgPSBmcyh0LCBlLnZlcmlmeSk7XG4gICAgICAgIHJldHVybiBuZXcgUm4ocywgbik7XG4gICAgfVxuICAgIHJldHVybiBMKCk7XG59XG5cbmZ1bmN0aW9uIEFzKHQsIGUpIHtcbiAgICByZXR1cm4gdCAmJiB0Lmxlbmd0aCA+IDAgPyAocSh2b2lkIDAgIT09IGUpLCB0Lm1hcCgodCA9PiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIC8vIE5PVEU6IERlbGV0ZXMgZG9uJ3QgaGF2ZSBhbiB1cGRhdGVUaW1lLlxuICAgICAgICBsZXQgbiA9IHQudXBkYXRlVGltZSA/IHVzKHQudXBkYXRlVGltZSkgOiB1cyhlKTtcbiAgICAgICAgcmV0dXJuIG4uaXNFcXVhbChjdC5taW4oKSkgJiYgKFxuICAgICAgICAvLyBUaGUgRmlyZXN0b3JlIEVtdWxhdG9yIGN1cnJlbnRseSByZXR1cm5zIGFuIHVwZGF0ZSB0aW1lIG9mIDAgZm9yXG4gICAgICAgIC8vIGRlbGV0ZXMgb2Ygbm9uLWV4aXN0aW5nIGRvY3VtZW50cyAocmF0aGVyIHRoYW4gbnVsbCkuIFRoaXMgYnJlYWtzIHRoZVxuICAgICAgICAvLyB0ZXN0IFwiZ2V0IGRlbGV0ZWQgZG9jIHdoaWxlIG9mZmxpbmUgd2l0aCBzb3VyY2U9Y2FjaGVcIiBhcyBOb0RvY3VtZW50c1xuICAgICAgICAvLyB3aXRoIHZlcnNpb24gMCBhcmUgZmlsdGVyZWQgYnkgSW5kZXhlZERiJ3MgUmVtb3RlRG9jdW1lbnRDYWNoZS5cbiAgICAgICAgLy8gVE9ETygjMjE0OSk6IFJlbW92ZSB0aGlzIHdoZW4gRW11bGF0b3IgaXMgZml4ZWRcbiAgICAgICAgbiA9IHVzKGUpKSwgbmV3IGNuKG4sIHQudHJhbnNmb3JtUmVzdWx0cyB8fCBbXSk7XG4gICAgfSh0LCBlKSkpKSA6IFtdO1xufVxuXG5mdW5jdGlvbiBScyh0LCBlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZG9jdW1lbnRzOiBbIGRzKHQsIGUucGF0aCkgXVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGJzKHQsIGUpIHtcbiAgICAvLyBEaXNzZWN0IHRoZSBwYXRoIGludG8gcGFyZW50LCBjb2xsZWN0aW9uSWQsIGFuZCBvcHRpb25hbCBrZXkgZmlsdGVyLlxuICAgIGNvbnN0IG4gPSB7XG4gICAgICAgIHN0cnVjdHVyZWRRdWVyeToge31cbiAgICB9LCBzID0gZS5wYXRoO1xuICAgIG51bGwgIT09IGUuY29sbGVjdGlvbkdyb3VwID8gKG4ucGFyZW50ID0gZHModCwgcyksIG4uc3RydWN0dXJlZFF1ZXJ5LmZyb20gPSBbIHtcbiAgICAgICAgY29sbGVjdGlvbklkOiBlLmNvbGxlY3Rpb25Hcm91cCxcbiAgICAgICAgYWxsRGVzY2VuZGFudHM6ICEwXG4gICAgfSBdKSA6IChuLnBhcmVudCA9IGRzKHQsIHMucG9wTGFzdCgpKSwgbi5zdHJ1Y3R1cmVkUXVlcnkuZnJvbSA9IFsge1xuICAgICAgICBjb2xsZWN0aW9uSWQ6IHMubGFzdFNlZ21lbnQoKVxuICAgIH0gXSk7XG4gICAgY29uc3QgaSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgaWYgKDAgPT09IHQubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGUgPSB0Lm1hcCgodCA9PiBcbiAgICAgICAgLy8gdmlzaWJsZSBmb3IgdGVzdGluZ1xuICAgICAgICBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBpZiAoXCI9PVwiIC8qIEVRVUFMICovID09PSB0Lm9wKSB7XG4gICAgICAgICAgICAgICAgaWYgKGp0KHQudmFsdWUpKSByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB1bmFyeUZpbHRlcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IENzKHQuZmllbGQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3A6IFwiSVNfTkFOXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKFF0KHQudmFsdWUpKSByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB1bmFyeUZpbHRlcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IENzKHQuZmllbGQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3A6IFwiSVNfTlVMTFwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcIiE9XCIgLyogTk9UX0VRVUFMICovID09PSB0Lm9wKSB7XG4gICAgICAgICAgICAgICAgaWYgKGp0KHQudmFsdWUpKSByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB1bmFyeUZpbHRlcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IENzKHQuZmllbGQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3A6IFwiSVNfTk9UX05BTlwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChRdCh0LnZhbHVlKSkgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdW5hcnlGaWx0ZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBDcyh0LmZpZWxkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wOiBcIklTX05PVF9OVUxMXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZpZWxkRmlsdGVyOiB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBDcyh0LmZpZWxkKSxcbiAgICAgICAgICAgICAgICAgICAgb3A6IERzKHQub3ApLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdC52YWx1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0odCkpKTtcbiAgICAgICAgaWYgKDEgPT09IGUubGVuZ3RoKSByZXR1cm4gZVswXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZpbHRlcjoge1xuICAgICAgICAgICAgICAgIG9wOiBcIkFORFwiLFxuICAgICAgICAgICAgICAgIGZpbHRlcnM6IGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9KGUuZmlsdGVycyk7XG4gICAgaSAmJiAobi5zdHJ1Y3R1cmVkUXVlcnkud2hlcmUgPSBpKTtcbiAgICBjb25zdCByID0gZnVuY3Rpb24odCkge1xuICAgICAgICBpZiAoMCA9PT0gdC5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgcmV0dXJuIHQubWFwKCh0ID0+IFxuICAgICAgICAvLyB2aXNpYmxlIGZvciB0ZXN0aW5nXG4gICAgICAgIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZmllbGQ6IENzKHQuZmllbGQpLFxuICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogU3ModC5kaXIpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KHQpKSk7XG4gICAgfShlLm9yZGVyQnkpO1xuICAgIHIgJiYgKG4uc3RydWN0dXJlZFF1ZXJ5Lm9yZGVyQnkgPSByKTtcbiAgICBjb25zdCBvID0gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICByZXR1cm4gdC5OIHx8IFN0KGUpID8gZSA6IHtcbiAgICAgICAgICAgIHZhbHVlOiBlXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICogUmV0dXJucyBhIG51bWJlciAob3IgbnVsbCkgZnJvbSBhIGdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlIHByb3RvLlxuICovICh0LCBlLmxpbWl0KTtcbiAgICB2YXIgYTtcbiAgICByZXR1cm4gbnVsbCAhPT0gbyAmJiAobi5zdHJ1Y3R1cmVkUXVlcnkubGltaXQgPSBvKSwgZS5zdGFydEF0ICYmIChuLnN0cnVjdHVyZWRRdWVyeS5zdGFydEF0ID0ge1xuICAgICAgICBiZWZvcmU6IChhID0gZS5zdGFydEF0KS5pbmNsdXNpdmUsXG4gICAgICAgIHZhbHVlczogYS5wb3NpdGlvblxuICAgIH0pLCBlLmVuZEF0ICYmIChuLnN0cnVjdHVyZWRRdWVyeS5lbmRBdCA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJlZm9yZTogIXQuaW5jbHVzaXZlLFxuICAgICAgICAgICAgdmFsdWVzOiB0LnBvc2l0aW9uXG4gICAgICAgIH07XG4gICAgfShlLmVuZEF0KSksIG47XG59XG5cbmZ1bmN0aW9uIFBzKHQpIHtcbiAgICBsZXQgZSA9IF9zKHQucGFyZW50KTtcbiAgICBjb25zdCBuID0gdC5zdHJ1Y3R1cmVkUXVlcnksIHMgPSBuLmZyb20gPyBuLmZyb20ubGVuZ3RoIDogMDtcbiAgICBsZXQgaSA9IG51bGw7XG4gICAgaWYgKHMgPiAwKSB7XG4gICAgICAgIHEoMSA9PT0gcyk7XG4gICAgICAgIGNvbnN0IHQgPSBuLmZyb21bMF07XG4gICAgICAgIHQuYWxsRGVzY2VuZGFudHMgPyBpID0gdC5jb2xsZWN0aW9uSWQgOiBlID0gZS5jaGlsZCh0LmNvbGxlY3Rpb25JZCk7XG4gICAgfVxuICAgIGxldCByID0gW107XG4gICAgbi53aGVyZSAmJiAociA9IHZzKG4ud2hlcmUpKTtcbiAgICBsZXQgbyA9IFtdO1xuICAgIG4ub3JkZXJCeSAmJiAobyA9IG4ub3JkZXJCeS5tYXAoKHQgPT4gZnVuY3Rpb24odCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlKHhzKHQuZmllbGQpLCBcbiAgICAgICAgLy8gdmlzaWJsZSBmb3IgdGVzdGluZ1xuICAgICAgICBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgY2FzZSBcIkFTQ0VORElOR1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcImFzY1wiIC8qIEFTQ0VORElORyAqLztcblxuICAgICAgICAgICAgICBjYXNlIFwiREVTQ0VORElOR1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcImRlc2NcIiAvKiBERVNDRU5ESU5HICovO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHZpc2libGUgZm9yIHRlc3RpbmdcbiAgICAgICAgKHQuZGlyZWN0aW9uKSk7XG4gICAgfSh0KSkpKTtcbiAgICBsZXQgYSA9IG51bGw7XG4gICAgbi5saW1pdCAmJiAoYSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgbGV0IGU7XG4gICAgICAgIHJldHVybiBlID0gXCJvYmplY3RcIiA9PSB0eXBlb2YgdCA/IHQudmFsdWUgOiB0LCBTdChlKSA/IG51bGwgOiBlO1xuICAgIH0obi5saW1pdCkpO1xuICAgIGxldCB1ID0gbnVsbDtcbiAgICBuLnN0YXJ0QXQgJiYgKHUgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSAhIXQuYmVmb3JlLCBuID0gdC52YWx1ZXMgfHwgW107XG4gICAgICAgIHJldHVybiBuZXcgQWUobiwgZSk7XG4gICAgfShuLnN0YXJ0QXQpKTtcbiAgICBsZXQgYyA9IG51bGw7XG4gICAgcmV0dXJuIG4uZW5kQXQgJiYgKGMgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSAhdC5iZWZvcmUsIG4gPSB0LnZhbHVlcyB8fCBbXTtcbiAgICAgICAgcmV0dXJuIG5ldyBBZShuLCBlKTtcbiAgICB9XG4gICAgLy8gdmlzaWJsZSBmb3IgdGVzdGluZ1xuICAgIChuLmVuZEF0KSksIFNlKGUsIGksIG8sIHIsIGEsIFwiRlwiIC8qIEZpcnN0ICovICwgdSwgYyk7XG59XG5cbmZ1bmN0aW9uIFZzKHQsIGUpIHtcbiAgICBjb25zdCBuID0gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICBzd2l0Y2ggKGUpIHtcbiAgICAgICAgICBjYXNlIDAgLyogTGlzdGVuICovIDpcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgY2FzZSAxIC8qIEV4aXN0ZW5jZUZpbHRlck1pc21hdGNoICovIDpcbiAgICAgICAgICAgIHJldHVybiBcImV4aXN0ZW5jZS1maWx0ZXItbWlzbWF0Y2hcIjtcblxuICAgICAgICAgIGNhc2UgMiAvKiBMaW1ib1Jlc29sdXRpb24gKi8gOlxuICAgICAgICAgICAgcmV0dXJuIFwibGltYm8tZG9jdW1lbnRcIjtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gTCgpO1xuICAgICAgICB9XG4gICAgfSgwLCBlLnB1cnBvc2UpO1xuICAgIHJldHVybiBudWxsID09IG4gPyBudWxsIDoge1xuICAgICAgICBcImdvb2ctbGlzdGVuLXRhZ3NcIjogblxuICAgIH07XG59XG5cbmZ1bmN0aW9uIHZzKHQpIHtcbiAgICByZXR1cm4gdCA/IHZvaWQgMCAhPT0gdC51bmFyeUZpbHRlciA/IFsga3ModCkgXSA6IHZvaWQgMCAhPT0gdC5maWVsZEZpbHRlciA/IFsgTnModCkgXSA6IHZvaWQgMCAhPT0gdC5jb21wb3NpdGVGaWx0ZXIgPyB0LmNvbXBvc2l0ZUZpbHRlci5maWx0ZXJzLm1hcCgodCA9PiB2cyh0KSkpLnJlZHVjZSgoKHQsIGUpID0+IHQuY29uY2F0KGUpKSkgOiBMKCkgOiBbXTtcbn1cblxuZnVuY3Rpb24gU3ModCkge1xuICAgIHJldHVybiBuc1t0XTtcbn1cblxuZnVuY3Rpb24gRHModCkge1xuICAgIHJldHVybiBzc1t0XTtcbn1cblxuZnVuY3Rpb24gQ3ModCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGZpZWxkUGF0aDogdC5jYW5vbmljYWxTdHJpbmcoKVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIHhzKHQpIHtcbiAgICByZXR1cm4gbXQuZnJvbVNlcnZlckZvcm1hdCh0LmZpZWxkUGF0aCk7XG59XG5cbmZ1bmN0aW9uIE5zKHQpIHtcbiAgICByZXR1cm4gX2UuY3JlYXRlKHhzKHQuZmllbGRGaWx0ZXIuZmllbGQpLCBmdW5jdGlvbih0KSB7XG4gICAgICAgIHN3aXRjaCAodCkge1xuICAgICAgICAgIGNhc2UgXCJFUVVBTFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiPT1cIiAvKiBFUVVBTCAqLztcblxuICAgICAgICAgIGNhc2UgXCJOT1RfRVFVQUxcIjpcbiAgICAgICAgICAgIHJldHVybiBcIiE9XCIgLyogTk9UX0VRVUFMICovO1xuXG4gICAgICAgICAgY2FzZSBcIkdSRUFURVJfVEhBTlwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiPlwiIC8qIEdSRUFURVJfVEhBTiAqLztcblxuICAgICAgICAgIGNhc2UgXCJHUkVBVEVSX1RIQU5fT1JfRVFVQUxcIjpcbiAgICAgICAgICAgIHJldHVybiBcIj49XCIgLyogR1JFQVRFUl9USEFOX09SX0VRVUFMICovO1xuXG4gICAgICAgICAgY2FzZSBcIkxFU1NfVEhBTlwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiPFwiIC8qIExFU1NfVEhBTiAqLztcblxuICAgICAgICAgIGNhc2UgXCJMRVNTX1RIQU5fT1JfRVFVQUxcIjpcbiAgICAgICAgICAgIHJldHVybiBcIjw9XCIgLyogTEVTU19USEFOX09SX0VRVUFMICovO1xuXG4gICAgICAgICAgY2FzZSBcIkFSUkFZX0NPTlRBSU5TXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJhcnJheS1jb250YWluc1wiIC8qIEFSUkFZX0NPTlRBSU5TICovO1xuXG4gICAgICAgICAgY2FzZSBcIklOXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJpblwiIC8qIElOICovO1xuXG4gICAgICAgICAgY2FzZSBcIk5PVF9JTlwiOlxuICAgICAgICAgICAgcmV0dXJuIFwibm90LWluXCIgLyogTk9UX0lOICovO1xuXG4gICAgICAgICAgY2FzZSBcIkFSUkFZX0NPTlRBSU5TX0FOWVwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiYXJyYXktY29udGFpbnMtYW55XCIgLyogQVJSQVlfQ09OVEFJTlNfQU5ZICovO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBMKCk7XG4gICAgICAgIH1cbiAgICB9KHQuZmllbGRGaWx0ZXIub3ApLCB0LmZpZWxkRmlsdGVyLnZhbHVlKTtcbn1cblxuZnVuY3Rpb24ga3ModCkge1xuICAgIHN3aXRjaCAodC51bmFyeUZpbHRlci5vcCkge1xuICAgICAgY2FzZSBcIklTX05BTlwiOlxuICAgICAgICBjb25zdCBlID0geHModC51bmFyeUZpbHRlci5maWVsZCk7XG4gICAgICAgIHJldHVybiBfZS5jcmVhdGUoZSwgXCI9PVwiIC8qIEVRVUFMICovICwge1xuICAgICAgICAgICAgZG91YmxlVmFsdWU6IE5hTlxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSBcIklTX05VTExcIjpcbiAgICAgICAgY29uc3QgbiA9IHhzKHQudW5hcnlGaWx0ZXIuZmllbGQpO1xuICAgICAgICByZXR1cm4gX2UuY3JlYXRlKG4sIFwiPT1cIiAvKiBFUVVBTCAqLyAsIHtcbiAgICAgICAgICAgIG51bGxWYWx1ZTogXCJOVUxMX1ZBTFVFXCJcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgXCJJU19OT1RfTkFOXCI6XG4gICAgICAgIGNvbnN0IHMgPSB4cyh0LnVuYXJ5RmlsdGVyLmZpZWxkKTtcbiAgICAgICAgcmV0dXJuIF9lLmNyZWF0ZShzLCBcIiE9XCIgLyogTk9UX0VRVUFMICovICwge1xuICAgICAgICAgICAgZG91YmxlVmFsdWU6IE5hTlxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSBcIklTX05PVF9OVUxMXCI6XG4gICAgICAgIGNvbnN0IGkgPSB4cyh0LnVuYXJ5RmlsdGVyLmZpZWxkKTtcbiAgICAgICAgcmV0dXJuIF9lLmNyZWF0ZShpLCBcIiE9XCIgLyogTk9UX0VRVUFMICovICwge1xuICAgICAgICAgICAgbnVsbFZhbHVlOiBcIk5VTExfVkFMVUVcIlxuICAgICAgICB9KTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIEwoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIE1zKHQpIHtcbiAgICBjb25zdCBlID0gW107XG4gICAgcmV0dXJuIHQuZmllbGRzLmZvckVhY2goKHQgPT4gZS5wdXNoKHQuY2Fub25pY2FsU3RyaW5nKCkpKSksIHtcbiAgICAgICAgZmllbGRQYXRoczogZVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIE9zKHQpIHtcbiAgICAvLyBSZXNvdXJjZSBuYW1lcyBoYXZlIGF0IGxlYXN0IDQgY29tcG9uZW50cyAocHJvamVjdCBJRCwgZGF0YWJhc2UgSUQpXG4gICAgcmV0dXJuIHQubGVuZ3RoID49IDQgJiYgXCJwcm9qZWN0c1wiID09PSB0LmdldCgwKSAmJiBcImRhdGFiYXNlc1wiID09PSB0LmdldCgyKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogRW5jb2RlcyBhIHJlc291cmNlIHBhdGggaW50byBhIEluZGV4ZWREYi1jb21wYXRpYmxlIHN0cmluZyBmb3JtLlxuICovXG5mdW5jdGlvbiAkcyh0KSB7XG4gICAgbGV0IGUgPSBcIlwiO1xuICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdC5sZW5ndGg7IG4rKykgZS5sZW5ndGggPiAwICYmIChlID0gQnMoZSkpLCBlID0gRnModC5nZXQobiksIGUpO1xuICAgIHJldHVybiBCcyhlKTtcbn1cblxuLyoqIEVuY29kZXMgYSBzaW5nbGUgc2VnbWVudCBvZiBhIHJlc291cmNlIHBhdGggaW50byB0aGUgZ2l2ZW4gcmVzdWx0ICovIGZ1bmN0aW9uIEZzKHQsIGUpIHtcbiAgICBsZXQgbiA9IGU7XG4gICAgY29uc3QgcyA9IHQubGVuZ3RoO1xuICAgIGZvciAobGV0IGUgPSAwOyBlIDwgczsgZSsrKSB7XG4gICAgICAgIGNvbnN0IHMgPSB0LmNoYXJBdChlKTtcbiAgICAgICAgc3dpdGNoIChzKSB7XG4gICAgICAgICAgY2FzZSBcIlxcMFwiOlxuICAgICAgICAgICAgbiArPSBcIlx1MDAwMVx1MDAxMFwiO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiXHUwMDAxXCI6XG4gICAgICAgICAgICBuICs9IFwiXHUwMDAxXHUwMDExXCI7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBuICs9IHM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG47XG59XG5cbi8qKiBFbmNvZGVzIGEgcGF0aCBzZXBhcmF0b3IgaW50byB0aGUgZ2l2ZW4gcmVzdWx0ICovIGZ1bmN0aW9uIEJzKHQpIHtcbiAgICByZXR1cm4gdCArIFwiXHUwMDAxXHUwMDAxXCI7XG59XG5cbi8qKlxuICogRGVjb2RlcyB0aGUgZ2l2ZW4gSW5kZXhlZERiLWNvbXBhdGlibGUgc3RyaW5nIGZvcm0gb2YgYSByZXNvdXJjZSBwYXRoIGludG9cbiAqIGEgUmVzb3VyY2VQYXRoIGluc3RhbmNlLiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgaXMgbm90IHN1aXRhYmxlIGZvciB1c2Ugd2l0aFxuICogZGVjb2RpbmcgcmVzb3VyY2UgbmFtZXMgZnJvbSB0aGUgc2VydmVyOyB0aG9zZSBhcmUgT25lIFBsYXRmb3JtIGZvcm1hdFxuICogc3RyaW5ncy5cbiAqLyBmdW5jdGlvbiBMcyh0KSB7XG4gICAgLy8gRXZlbnQgdGhlIGVtcHR5IHBhdGggbXVzdCBlbmNvZGUgYXMgYSBwYXRoIG9mIGF0IGxlYXN0IGxlbmd0aCAyLiBBIHBhdGhcbiAgICAvLyB3aXRoIGV4YWN0bHkgMiBtdXN0IGJlIHRoZSBlbXB0eSBwYXRoLlxuICAgIGNvbnN0IGUgPSB0Lmxlbmd0aDtcbiAgICBpZiAocShlID49IDIpLCAyID09PSBlKSByZXR1cm4gcShcIlx1MDAwMVwiID09PSB0LmNoYXJBdCgwKSAmJiBcIlx1MDAwMVwiID09PSB0LmNoYXJBdCgxKSksIF90LmVtcHR5UGF0aCgpO1xuICAgIC8vIEVzY2FwZSBjaGFyYWN0ZXJzIGNhbm5vdCBleGlzdCBwYXN0IHRoZSBzZWNvbmQtdG8tbGFzdCBwb3NpdGlvbiBpbiB0aGVcbiAgICAvLyBzb3VyY2UgdmFsdWUuXG4gICAgICAgIGNvbnN0IG4gPSBlIC0gMiwgcyA9IFtdO1xuICAgIGxldCBpID0gXCJcIjtcbiAgICBmb3IgKGxldCByID0gMDsgciA8IGU7ICkge1xuICAgICAgICAvLyBUaGUgbGFzdCB0d28gY2hhcmFjdGVycyBvZiBhIHZhbGlkIGVuY29kZWQgcGF0aCBtdXN0IGJlIGEgc2VwYXJhdG9yLCBzb1xuICAgICAgICAvLyB0aGVyZSBtdXN0IGJlIGFuIGVuZCB0byB0aGlzIHNlZ21lbnQuXG4gICAgICAgIGNvbnN0IGUgPSB0LmluZGV4T2YoXCJcdTAwMDFcIiwgcik7XG4gICAgICAgIChlIDwgMCB8fCBlID4gbikgJiYgTCgpO1xuICAgICAgICBzd2l0Y2ggKHQuY2hhckF0KGUgKyAxKSkge1xuICAgICAgICAgIGNhc2UgXCJcdTAwMDFcIjpcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0LnN1YnN0cmluZyhyLCBlKTtcbiAgICAgICAgICAgIGxldCBvO1xuICAgICAgICAgICAgMCA9PT0gaS5sZW5ndGggPyBcbiAgICAgICAgICAgIC8vIEF2b2lkIGNvcHlpbmcgZm9yIHRoZSBjb21tb24gY2FzZSBvZiBhIHNlZ21lbnQgdGhhdCBleGNsdWRlcyBcXDBcbiAgICAgICAgICAgIC8vIGFuZCBcXDAwMVxuICAgICAgICAgICAgbyA9IG4gOiAoaSArPSBuLCBvID0gaSwgaSA9IFwiXCIpLCBzLnB1c2gobyk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJcdTAwMTBcIjpcbiAgICAgICAgICAgIGkgKz0gdC5zdWJzdHJpbmcociwgZSksIGkgKz0gXCJcXDBcIjtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcIlx1MDAxMVwiOlxuICAgICAgICAgICAgLy8gVGhlIGVzY2FwZSBjaGFyYWN0ZXIgY2FuIGJlIHVzZWQgaW4gdGhlIG91dHB1dCB0byBlbmNvZGUgaXRzZWxmLlxuICAgICAgICAgICAgaSArPSB0LnN1YnN0cmluZyhyLCBlICsgMSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBMKCk7XG4gICAgICAgIH1cbiAgICAgICAgciA9IGUgKyAyO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IF90KHMpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBOYW1lIG9mIHRoZSBJbmRleGVkRGIgb2JqZWN0IHN0b3JlLlxuICpcbiAqIE5vdGUgdGhhdCB0aGUgbmFtZSAnb3duZXInIGlzIGNob3NlbiB0byBlbnN1cmUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aFxuICogb2xkZXIgY2xpZW50cyB0aGF0IG9ubHkgc3VwcG9ydGVkIHNpbmdsZSBsb2NrZWQgYWNjZXNzIHRvIHRoZSBwZXJzaXN0ZW5jZVxuICogbGF5ZXIuXG4gKi8gY29uc3QgcXMgPSBbIFwidXNlcklkXCIsIFwiYmF0Y2hJZFwiIF07XG5cbi8qKlxuICogVGhlIGtleSBzdHJpbmcgdXNlZCBmb3IgdGhlIHNpbmdsZSBvYmplY3QgdGhhdCBleGlzdHMgaW4gdGhlXG4gKiBEYlByaW1hcnlDbGllbnQgc3RvcmUuXG4gKi9cbi8qKlxuICogQ3JlYXRlcyBhIFt1c2VySWQsIGVuY29kZWRQYXRoXSBrZXkgZm9yIHVzZSBpbiB0aGUgRGJEb2N1bWVudE11dGF0aW9uc1xuICogaW5kZXggdG8gaXRlcmF0ZSBvdmVyIGFsbCBhdCBkb2N1bWVudCBtdXRhdGlvbnMgZm9yIGEgZ2l2ZW4gcGF0aCBvciBsb3dlci5cbiAqL1xuZnVuY3Rpb24gVXModCwgZSkge1xuICAgIHJldHVybiBbIHQsICRzKGUpIF07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bGwgaW5kZXgga2V5IG9mIFt1c2VySWQsIGVuY29kZWRQYXRoLCBiYXRjaElkXSBmb3IgaW5zZXJ0aW5nXG4gKiBhbmQgZGVsZXRpbmcgaW50byB0aGUgRGJEb2N1bWVudE11dGF0aW9ucyBpbmRleC5cbiAqLyBmdW5jdGlvbiBLcyh0LCBlLCBuKSB7XG4gICAgcmV0dXJuIFsgdCwgJHMoZSksIG4gXTtcbn1cblxuLyoqXG4gKiBCZWNhdXNlIHdlIHN0b3JlIGFsbCB0aGUgdXNlZnVsIGluZm9ybWF0aW9uIGZvciB0aGlzIHN0b3JlIGluIHRoZSBrZXksXG4gKiB0aGVyZSBpcyBubyB1c2VmdWwgaW5mb3JtYXRpb24gdG8gc3RvcmUgYXMgdGhlIHZhbHVlLiBUaGUgcmF3ICh1bmVuY29kZWQpXG4gKiBwYXRoIGNhbm5vdCBiZSBzdG9yZWQgYmVjYXVzZSBJbmRleGVkRGIgZG9lc24ndCBzdG9yZSBwcm90b3R5cGVcbiAqIGluZm9ybWF0aW9uLlxuICovIGNvbnN0IEdzID0ge30sIFFzID0gWyBcInBhcmVudFBhdGhcIiwgXCJyZWFkVGltZVwiIF0sIGpzID0gWyBcImNhbm9uaWNhbElkXCIsIFwidGFyZ2V0SWRcIiBdLCBXcyA9IFsgXCJ0YXJnZXRJZFwiLCBcInBhdGhcIiBdLCB6cyA9IFsgXCJwYXRoXCIsIFwidGFyZ2V0SWRcIiBdLCBIcyA9IFsgXCJjb2xsZWN0aW9uSWRcIiwgXCJwYXJlbnRcIiBdLCBKcyA9IFsgXCJpbmRleElkXCIsIFwidWlkXCIgXSwgWXMgPSBbIFwidWlkXCIsIFwic2VxdWVuY2VOdW1iZXJcIiBdLCBYcyA9IFsgXCJpbmRleElkXCIsIFwidWlkXCIsIFwiYXJyYXlWYWx1ZVwiLCBcImRpcmVjdGlvbmFsVmFsdWVcIiwgXCJkb2N1bWVudEtleVwiIF0sIFpzID0gWyBcImluZGV4SWRcIiwgXCJ1aWRcIiwgXCJkb2N1bWVudEtleVwiIF0sIHRpID0gWyBcInVzZXJJZFwiLCBcImNvbGxlY3Rpb25QYXRoXCIsIFwiZG9jdW1lbnRJZFwiIF0sIGVpID0gWyBcInVzZXJJZFwiLCBcImNvbGxlY3Rpb25QYXRoXCIsIFwibGFyZ2VzdEJhdGNoSWRcIiBdLCBuaSA9IFsgXCJ1c2VySWRcIiwgXCJjb2xsZWN0aW9uR3JvdXBcIiwgXCJsYXJnZXN0QmF0Y2hJZFwiIF0sIHNpID0gWyAuLi5bIC4uLlsgLi4uWyAuLi5bIFwibXV0YXRpb25RdWV1ZXNcIiwgXCJtdXRhdGlvbnNcIiwgXCJkb2N1bWVudE11dGF0aW9uc1wiLCBcInJlbW90ZURvY3VtZW50c1wiLCBcInRhcmdldHNcIiwgXCJvd25lclwiLCBcInRhcmdldEdsb2JhbFwiLCBcInRhcmdldERvY3VtZW50c1wiIF0sIFwiY2xpZW50TWV0YWRhdGFcIiBdLCBcInJlbW90ZURvY3VtZW50R2xvYmFsXCIgXSwgXCJjb2xsZWN0aW9uUGFyZW50c1wiIF0sIFwiYnVuZGxlc1wiLCBcIm5hbWVkUXVlcmllc1wiIF0sIGlpID0gWyAuLi5zaSwgXCJkb2N1bWVudE92ZXJsYXlzXCIgXSwgcmkgPSBbIC4uLmlpLCBcImluZGV4Q29uZmlndXJhdGlvblwiLCBcImluZGV4U3RhdGVcIiwgXCJpbmRleEVudHJpZXNcIiBdO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuY29uc3Qgb2kgPSBcIlRoZSBjdXJyZW50IHRhYiBpcyBub3QgaW4gdGhlIHJlcXVpcmVkIHN0YXRlIHRvIHBlcmZvcm0gdGhpcyBvcGVyYXRpb24uIEl0IG1pZ2h0IGJlIG5lY2Vzc2FyeSB0byByZWZyZXNoIHRoZSBicm93c2VyIHRhYi5cIjtcblxuLyoqXG4gKiBBIGJhc2UgY2xhc3MgcmVwcmVzZW50aW5nIGEgcGVyc2lzdGVuY2UgdHJhbnNhY3Rpb24sIGVuY2Fwc3VsYXRpbmcgYm90aCB0aGVcbiAqIHRyYW5zYWN0aW9uJ3Mgc2VxdWVuY2UgbnVtYmVycyBhcyB3ZWxsIGFzIGEgbGlzdCBvZiBvbkNvbW1pdHRlZCBsaXN0ZW5lcnMuXG4gKlxuICogV2hlbiB5b3UgY2FsbCBQZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbigpLCBpdCB3aWxsIGNyZWF0ZSBhIHRyYW5zYWN0aW9uIGFuZFxuICogcGFzcyBpdCB0byB5b3VyIGNhbGxiYWNrLiBZb3UgdGhlbiBwYXNzIGl0IHRvIGFueSBtZXRob2QgdGhhdCBvcGVyYXRlc1xuICogb24gcGVyc2lzdGVuY2UuXG4gKi8gY2xhc3MgYWkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm9uQ29tbWl0dGVkTGlzdGVuZXJzID0gW107XG4gICAgfVxuICAgIGFkZE9uQ29tbWl0dGVkTGlzdGVuZXIodCkge1xuICAgICAgICB0aGlzLm9uQ29tbWl0dGVkTGlzdGVuZXJzLnB1c2godCk7XG4gICAgfVxuICAgIHJhaXNlT25Db21taXR0ZWRFdmVudCgpIHtcbiAgICAgICAgdGhpcy5vbkNvbW1pdHRlZExpc3RlbmVycy5mb3JFYWNoKCh0ID0+IHQoKSkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogUGVyc2lzdGVuY2VQcm9taXNlIGlzIGVzc2VudGlhbGx5IGEgcmUtaW1wbGVtZW50YXRpb24gb2YgUHJvbWlzZSBleGNlcHRcbiAqIGl0IGhhcyBhIC5uZXh0KCkgbWV0aG9kIGluc3RlYWQgb2YgLnRoZW4oKSBhbmQgLm5leHQoKSBhbmQgLmNhdGNoKCkgY2FsbGJhY2tzXG4gKiBhcmUgZXhlY3V0ZWQgc3luY2hyb25vdXNseSB3aGVuIGEgUGVyc2lzdGVuY2VQcm9taXNlIHJlc29sdmVzIHJhdGhlciB0aGFuXG4gKiBhc3luY2hyb25vdXNseSAoUHJvbWlzZSBpbXBsZW1lbnRhdGlvbnMgdXNlIHNldEltbWVkaWF0ZSgpIG9yIHNpbWlsYXIpLlxuICpcbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGludGVyb3BlcmF0ZSB3aXRoIEluZGV4ZWREQiB3aGljaCB3aWxsIGF1dG9tYXRpY2FsbHlcbiAqIGNvbW1pdCB0cmFuc2FjdGlvbnMgaWYgY29udHJvbCBpcyByZXR1cm5lZCB0byB0aGUgZXZlbnQgbG9vcCB3aXRob3V0XG4gKiBzeW5jaHJvbm91c2x5IGluaXRpYXRpbmcgYW5vdGhlciBvcGVyYXRpb24gb24gdGhlIHRyYW5zYWN0aW9uLlxuICpcbiAqIE5PVEU6IC50aGVuKCkgYW5kIC5jYXRjaCgpIG9ubHkgYWxsb3cgYSBzaW5nbGUgY29uc3VtZXIsIHVubGlrZSBub3JtYWxcbiAqIFByb21pc2VzLlxuICovIGNsYXNzIHVpIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIC8vIE5PVEU6IG5leHQvY2F0Y2hDYWxsYmFjayB3aWxsIGFsd2F5cyBwb2ludCB0byBvdXIgb3duIHdyYXBwZXIgZnVuY3Rpb25zLFxuICAgICAgICAvLyBub3QgdGhlIHVzZXIncyByYXcgbmV4dCgpIG9yIGNhdGNoKCkgY2FsbGJhY2tzLlxuICAgICAgICB0aGlzLm5leHRDYWxsYmFjayA9IG51bGwsIHRoaXMuY2F0Y2hDYWxsYmFjayA9IG51bGwsIFxuICAgICAgICAvLyBXaGVuIHRoZSBvcGVyYXRpb24gcmVzb2x2ZXMsIHdlJ2xsIHNldCByZXN1bHQgb3IgZXJyb3IgYW5kIG1hcmsgaXNEb25lLlxuICAgICAgICB0aGlzLnJlc3VsdCA9IHZvaWQgMCwgdGhpcy5lcnJvciA9IHZvaWQgMCwgdGhpcy5pc0RvbmUgPSAhMSwgXG4gICAgICAgIC8vIFNldCB0byB0cnVlIHdoZW4gLnRoZW4oKSBvciAuY2F0Y2goKSBhcmUgY2FsbGVkIGFuZCBwcmV2ZW50cyBhZGRpdGlvbmFsXG4gICAgICAgIC8vIGNoYWluaW5nLlxuICAgICAgICB0aGlzLmNhbGxiYWNrQXR0YWNoZWQgPSAhMSwgdCgodCA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzRG9uZSA9ICEwLCB0aGlzLnJlc3VsdCA9IHQsIHRoaXMubmV4dENhbGxiYWNrICYmIFxuICAgICAgICAgICAgLy8gdmFsdWUgc2hvdWxkIGJlIGRlZmluZWQgdW5sZXNzIFQgaXMgVm9pZCwgYnV0IHdlIGNhbid0IGV4cHJlc3NcbiAgICAgICAgICAgIC8vIHRoYXQgaW4gdGhlIHR5cGUgc3lzdGVtLlxuICAgICAgICAgICAgdGhpcy5uZXh0Q2FsbGJhY2sodCk7XG4gICAgICAgIH0pLCAodCA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzRG9uZSA9ICEwLCB0aGlzLmVycm9yID0gdCwgdGhpcy5jYXRjaENhbGxiYWNrICYmIHRoaXMuY2F0Y2hDYWxsYmFjayh0KTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBjYXRjaCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHQodm9pZCAwLCB0KTtcbiAgICB9XG4gICAgbmV4dCh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxiYWNrQXR0YWNoZWQgJiYgTCgpLCB0aGlzLmNhbGxiYWNrQXR0YWNoZWQgPSAhMCwgdGhpcy5pc0RvbmUgPyB0aGlzLmVycm9yID8gdGhpcy53cmFwRmFpbHVyZShlLCB0aGlzLmVycm9yKSA6IHRoaXMud3JhcFN1Y2Nlc3ModCwgdGhpcy5yZXN1bHQpIDogbmV3IHVpKCgobiwgcykgPT4ge1xuICAgICAgICAgICAgdGhpcy5uZXh0Q2FsbGJhY2sgPSBlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLndyYXBTdWNjZXNzKHQsIGUpLm5leHQobiwgcyk7XG4gICAgICAgICAgICB9LCB0aGlzLmNhdGNoQ2FsbGJhY2sgPSB0ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLndyYXBGYWlsdXJlKGUsIHQpLm5leHQobiwgcyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIHRvUHJvbWlzZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKCgodCwgZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5uZXh0KHQsIGUpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIHdyYXBVc2VyRnVuY3Rpb24odCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZSA9IHQoKTtcbiAgICAgICAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgdWkgPyBlIDogdWkucmVzb2x2ZShlKTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgcmV0dXJuIHVpLnJlamVjdCh0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB3cmFwU3VjY2Vzcyh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0ID8gdGhpcy53cmFwVXNlckZ1bmN0aW9uKCgoKSA9PiB0KGUpKSkgOiB1aS5yZXNvbHZlKGUpO1xuICAgIH1cbiAgICB3cmFwRmFpbHVyZSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0ID8gdGhpcy53cmFwVXNlckZ1bmN0aW9uKCgoKSA9PiB0KGUpKSkgOiB1aS5yZWplY3QoZSk7XG4gICAgfVxuICAgIHN0YXRpYyByZXNvbHZlKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB1aSgoKGUsIG4pID0+IHtcbiAgICAgICAgICAgIGUodCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgc3RhdGljIHJlamVjdCh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgdWkoKChlLCBuKSA9PiB7XG4gICAgICAgICAgICBuKHQpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIHN0YXRpYyB3YWl0Rm9yKFxuICAgIC8vIEFjY2VwdCBhbGwgUHJvbWlzZSB0eXBlcyBpbiB3YWl0Rm9yKCkuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICB0KSB7XG4gICAgICAgIHJldHVybiBuZXcgdWkoKChlLCBuKSA9PiB7XG4gICAgICAgICAgICBsZXQgcyA9IDAsIGkgPSAwLCByID0gITE7XG4gICAgICAgICAgICB0LmZvckVhY2goKHQgPT4ge1xuICAgICAgICAgICAgICAgICsrcywgdC5uZXh0KCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICsraSwgciAmJiBpID09PSBzICYmIGUoKTtcbiAgICAgICAgICAgICAgICB9KSwgKHQgPT4gbih0KSkpO1xuICAgICAgICAgICAgfSkpLCByID0gITAsIGkgPT09IHMgJiYgZSgpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdpdmVuIGFuIGFycmF5IG9mIHByZWRpY2F0ZSBmdW5jdGlvbnMgdGhhdCBhc3luY2hyb25vdXNseSBldmFsdWF0ZSB0byBhXG4gICAgICogYm9vbGVhbiwgaW1wbGVtZW50cyBhIHNob3J0LWNpcmN1aXRpbmcgYG9yYCBiZXR3ZWVuIHRoZSByZXN1bHRzLiBQcmVkaWNhdGVzXG4gICAgICogd2lsbCBiZSBldmFsdWF0ZWQgdW50aWwgb25lIG9mIHRoZW0gcmV0dXJucyBgdHJ1ZWAsIHRoZW4gc3RvcC4gVGhlIGZpbmFsXG4gICAgICogcmVzdWx0IHdpbGwgYmUgd2hldGhlciBhbnkgb2YgdGhlbSByZXR1cm5lZCBgdHJ1ZWAuXG4gICAgICovICAgIHN0YXRpYyBvcih0KSB7XG4gICAgICAgIGxldCBlID0gdWkucmVzb2x2ZSghMSk7XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiB0KSBlID0gZS5uZXh0KCh0ID0+IHQgPyB1aS5yZXNvbHZlKHQpIDogbigpKSk7XG4gICAgICAgIHJldHVybiBlO1xuICAgIH1cbiAgICBzdGF0aWMgZm9yRWFjaCh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBbXTtcbiAgICAgICAgcmV0dXJuIHQuZm9yRWFjaCgoKHQsIHMpID0+IHtcbiAgICAgICAgICAgIG4ucHVzaChlLmNhbGwodGhpcywgdCwgcykpO1xuICAgICAgICB9KSksIHRoaXMud2FpdEZvcihuKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vLyBSZWZlcmVuY2VzIHRvIGB3aW5kb3dgIGFyZSBndWFyZGVkIGJ5IFNpbXBsZURiLmlzQXZhaWxhYmxlKClcbi8qIGVzbGludC1kaXNhYmxlIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscyAqL1xuLyoqXG4gKiBXcmFwcyBhbiBJREJUcmFuc2FjdGlvbiBhbmQgZXhwb3NlcyBhIHN0b3JlKCkgbWV0aG9kIHRvIGdldCBhIGhhbmRsZSB0byBhXG4gKiBzcGVjaWZpYyBvYmplY3Qgc3RvcmUuXG4gKi9cbmNsYXNzIGNpIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMuYWN0aW9uID0gdCwgdGhpcy50cmFuc2FjdGlvbiA9IGUsIHRoaXMuYWJvcnRlZCA9ICExLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgYFByb21pc2VgIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBJbmRleGVkRGIgdHJhbnNhY3Rpb24uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLkF0ID0gbmV3IGosIHRoaXMudHJhbnNhY3Rpb24ub25jb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuQXQucmVzb2x2ZSgpO1xuICAgICAgICB9LCB0aGlzLnRyYW5zYWN0aW9uLm9uYWJvcnQgPSAoKSA9PiB7XG4gICAgICAgICAgICBlLmVycm9yID8gdGhpcy5BdC5yZWplY3QobmV3IGZpKHQsIGUuZXJyb3IpKSA6IHRoaXMuQXQucmVzb2x2ZSgpO1xuICAgICAgICB9LCB0aGlzLnRyYW5zYWN0aW9uLm9uZXJyb3IgPSBlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBnaShlLnRhcmdldC5lcnJvcik7XG4gICAgICAgICAgICB0aGlzLkF0LnJlamVjdChuZXcgZmkodCwgbikpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBzdGF0aWMgb3Blbih0LCBlLCBuLCBzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGNpKGUsIHQudHJhbnNhY3Rpb24ocywgbikpO1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgZmkoZSwgdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IFJ0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5BdC5wcm9taXNlO1xuICAgIH1cbiAgICBhYm9ydCh0KSB7XG4gICAgICAgIHQgJiYgdGhpcy5BdC5yZWplY3QodCksIHRoaXMuYWJvcnRlZCB8fCAoTyhcIlNpbXBsZURiXCIsIFwiQWJvcnRpbmcgdHJhbnNhY3Rpb246XCIsIHQgPyB0Lm1lc3NhZ2UgOiBcIkNsaWVudC1pbml0aWF0ZWQgYWJvcnRcIiksIFxuICAgICAgICB0aGlzLmFib3J0ZWQgPSAhMCwgdGhpcy50cmFuc2FjdGlvbi5hYm9ydCgpKTtcbiAgICB9XG4gICAgYnQoKSB7XG4gICAgICAgIC8vIElmIHRoZSBicm93c2VyIHN1cHBvcnRzIFYzIEluZGV4ZWREQiwgd2UgaW52b2tlIGNvbW1pdCgpIGV4cGxpY2l0bHkgdG9cbiAgICAgICAgLy8gc3BlZWQgdXAgaW5kZXggREIgcHJvY2Vzc2luZyBpZiB0aGUgZXZlbnQgbG9vcCByZW1haW5zIGJsb2Nrcy5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgY29uc3QgdCA9IHRoaXMudHJhbnNhY3Rpb247XG4gICAgICAgIHRoaXMuYWJvcnRlZCB8fCBcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIHQuY29tbWl0IHx8IHQuY29tbWl0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBTaW1wbGVEYlN0b3JlPEtleVR5cGUsIFZhbHVlVHlwZT4gZm9yIHRoZSBzcGVjaWZpZWQgc3RvcmUuIEFsbFxuICAgICAqIG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSBTaW1wbGVEYlN0b3JlIGhhcHBlbiB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhpc1xuICAgICAqIHRyYW5zYWN0aW9uIGFuZCBpdCBjYW5ub3QgYmUgdXNlZCBhbnltb3JlIG9uY2UgdGhlIHRyYW5zYWN0aW9uIGlzXG4gICAgICogY29tcGxldGVkLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHdlIGNhbid0IGFjdHVhbGx5IGVuZm9yY2UgdGhhdCB0aGUgS2V5VHlwZSBhbmQgVmFsdWVUeXBlIGFyZVxuICAgICAqIGNvcnJlY3QsIGJ1dCB0aGV5IGFsbG93IHR5cGUgc2FmZXR5IHRocm91Z2ggdGhlIHJlc3Qgb2YgdGhlIGNvbnN1bWluZyBjb2RlLlxuICAgICAqLyAgICBzdG9yZSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLnRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHQpO1xuICAgICAgICByZXR1cm4gbmV3IF9pKGUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQcm92aWRlcyBhIHdyYXBwZXIgYXJvdW5kIEluZGV4ZWREYiB3aXRoIGEgc2ltcGxpZmllZCBpbnRlcmZhY2UgdGhhdCB1c2VzXG4gKiBQcm9taXNlLWxpa2UgcmV0dXJuIHZhbHVlcyB0byBjaGFpbiBvcGVyYXRpb25zLiBSZWFsIHByb21pc2VzIGNhbm5vdCBiZSB1c2VkXG4gKiBzaW5jZSAudGhlbigpIGNvbnRpbnVhdGlvbnMgYXJlIGV4ZWN1dGVkIGFzeW5jaHJvbm91c2x5IChlLmcuIHZpYVxuICogLnNldEltbWVkaWF0ZSksIHdoaWNoIHdvdWxkIGNhdXNlIEluZGV4ZWREQiB0byBlbmQgdGhlIHRyYW5zYWN0aW9uLlxuICogU2VlIFBlcnNpc3RlbmNlUHJvbWlzZSBmb3IgbW9yZSBkZXRhaWxzLlxuICovIGNsYXNzIGhpIHtcbiAgICAvKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgU2ltcGxlRGIgd3JhcHBlciBmb3IgSW5kZXhlZERiIGRhdGFiYXNlIGBuYW1lYC5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCBgdmVyc2lvbmAgbXVzdCBub3QgYmUgYSBkb3duZ3JhZGUuIEluZGV4ZWREQiBkb2VzIG5vdCBzdXBwb3J0XG4gICAgICogZG93bmdyYWRpbmcgdGhlIHNjaGVtYSB2ZXJzaW9uLiBXZSBjdXJyZW50bHkgZG8gbm90IHN1cHBvcnQgYW55IHdheSB0byBkb1xuICAgICAqIHZlcnNpb25pbmcgb3V0c2lkZSBvZiBJbmRleGVkREIncyB2ZXJzaW9uaW5nIG1lY2hhbmlzbSwgYXMgb25seVxuICAgICAqIHZlcnNpb24tdXBncmFkZSB0cmFuc2FjdGlvbnMgYXJlIGFsbG93ZWQgdG8gZG8gdGhpbmdzIGxpa2UgY3JlYXRlXG4gICAgICogb2JqZWN0c3RvcmVzLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy5uYW1lID0gdCwgdGhpcy52ZXJzaW9uID0gZSwgdGhpcy5QdCA9IG47XG4gICAgICAgIC8vIE5PVEU6IEFjY29yZGluZyB0byBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTk3MDUwLCB0aGVcbiAgICAgICAgLy8gYnVnIHdlJ3JlIGNoZWNraW5nIGZvciBzaG91bGQgZXhpc3QgaW4gaU9TID49IDEyLjIgYW5kIDwgMTMsIGJ1dCBmb3JcbiAgICAgICAgLy8gd2hhdGV2ZXIgcmVhc29uIGl0J3MgbXVjaCBoYXJkZXIgdG8gaGl0IGFmdGVyIDEyLjIgc28gd2Ugb25seSBwcm9hY3RpdmVseVxuICAgICAgICAvLyBsb2cgb24gMTIuMi5cbiAgICAgICAgMTIuMiA9PT0gaGkuVnQoZ2V0VUEoKSkgJiYgJChcIkZpcmVzdG9yZSBwZXJzaXN0ZW5jZSBzdWZmZXJzIGZyb20gYSBidWcgaW4gaU9TIDEyLjIgU2FmYXJpIHRoYXQgbWF5IGNhdXNlIHlvdXIgYXBwIHRvIHN0b3Agd29ya2luZy4gU2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcS81NjQ5NjI5Ni8xMTA5MTUgZm9yIGRldGFpbHMgYW5kIGEgcG90ZW50aWFsIHdvcmthcm91bmQuXCIpO1xuICAgIH1cbiAgICAvKiogRGVsZXRlcyB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlLiAqLyAgICBzdGF0aWMgZGVsZXRlKHQpIHtcbiAgICAgICAgcmV0dXJuIE8oXCJTaW1wbGVEYlwiLCBcIlJlbW92aW5nIGRhdGFiYXNlOlwiLCB0KSwgd2kod2luZG93LmluZGV4ZWREQi5kZWxldGVEYXRhYmFzZSh0KSkudG9Qcm9taXNlKCk7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgSW5kZXhlZERCIGlzIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudC4gKi8gICAgc3RhdGljIHZ0KCkge1xuICAgICAgICBpZiAoIWlzSW5kZXhlZERCQXZhaWxhYmxlKCkpIHJldHVybiAhMTtcbiAgICAgICAgaWYgKGhpLlN0KCkpIHJldHVybiAhMDtcbiAgICAgICAgLy8gV2UgZXh0ZW5zaXZlbHkgdXNlIGluZGV4ZWQgYXJyYXkgdmFsdWVzIGFuZCBjb21wb3VuZCBrZXlzLFxuICAgICAgICAvLyB3aGljaCBJRSBhbmQgRWRnZSBkbyBub3Qgc3VwcG9ydC4gSG93ZXZlciwgdGhleSBzdGlsbCBoYXZlIGluZGV4ZWREQlxuICAgICAgICAvLyBkZWZpbmVkIG9uIHRoZSB3aW5kb3csIHNvIHdlIG5lZWQgdG8gY2hlY2sgZm9yIHRoZW0gaGVyZSBhbmQgbWFrZSBzdXJlXG4gICAgICAgIC8vIHRvIHJldHVybiB0aGF0IHBlcnNpc3RlbmNlIGlzIG5vdCBlbmFibGVkIGZvciB0aG9zZSBicm93c2Vycy5cbiAgICAgICAgLy8gRm9yIHRyYWNraW5nIHN1cHBvcnQgb2YgdGhpcyBmZWF0dXJlLCBzZWUgaGVyZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9lbi11cy9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9zdGF0dXMvaW5kZXhlZGRiYXJyYXlzYW5kbXVsdGllbnRyeXN1cHBvcnQvXG4gICAgICAgIC8vIENoZWNrIHRoZSBVQSBzdHJpbmcgdG8gZmluZCBvdXQgdGhlIGJyb3dzZXIuXG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IGdldFVBKCksIGUgPSBoaS5WdCh0KSwgbiA9IDAgPCBlICYmIGUgPCAxMCwgcyA9IGhpLkR0KHQpLCBpID0gMCA8IHMgJiYgcyA8IDQuNTtcbiAgICAgICAgLy8gSUUgMTBcbiAgICAgICAgLy8gdWEgPSAnTW96aWxsYS81LjAgKGNvbXBhdGlibGU7IE1TSUUgMTAuMDsgV2luZG93cyBOVCA2LjI7IFRyaWRlbnQvNi4wKSc7XG4gICAgICAgIC8vIElFIDExXG4gICAgICAgIC8vIHVhID0gJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDYuMzsgVHJpZGVudC83LjA7IHJ2OjExLjApIGxpa2UgR2Vja28nO1xuICAgICAgICAvLyBFZGdlXG4gICAgICAgIC8vIHVhID0gJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdPVzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLFxuICAgICAgICAvLyBsaWtlIEdlY2tvKSBDaHJvbWUvMzkuMC4yMTcxLjcxIFNhZmFyaS81MzcuMzYgRWRnZS8xMi4wJztcbiAgICAgICAgLy8gaU9TIFNhZmFyaTogRGlzYWJsZSBmb3IgdXNlcnMgcnVubmluZyBpT1MgdmVyc2lvbiA8IDEwLlxuICAgICAgICAgICAgICAgIHJldHVybiAhKHQuaW5kZXhPZihcIk1TSUUgXCIpID4gMCB8fCB0LmluZGV4T2YoXCJUcmlkZW50L1wiKSA+IDAgfHwgdC5pbmRleE9mKFwiRWRnZS9cIikgPiAwIHx8IG4gfHwgaSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYmFja2luZyBJbmRleGVkREIgc3RvcmUgaXMgdGhlIE5vZGUgSW5kZXhlZERCU2hpbVxuICAgICAqIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL2F4ZW1jbGlvbi9JbmRleGVkREJTaGltKS5cbiAgICAgKi8gICAgc3RhdGljIFN0KCkge1xuICAgICAgICB2YXIgdDtcbiAgICAgICAgcmV0dXJuIFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIHByb2Nlc3MgJiYgXCJZRVNcIiA9PT0gKG51bGwgPT09ICh0ID0gcHJvY2Vzcy5lbnYpIHx8IHZvaWQgMCA9PT0gdCA/IHZvaWQgMCA6IHQuQ3QpO1xuICAgIH1cbiAgICAvKiogSGVscGVyIHRvIGdldCBhIHR5cGVkIFNpbXBsZURiU3RvcmUgZnJvbSBhIHRyYW5zYWN0aW9uLiAqLyAgICBzdGF0aWMgeHQodCwgZSkge1xuICAgICAgICByZXR1cm4gdC5zdG9yZShlKTtcbiAgICB9XG4gICAgLy8gdmlzaWJsZSBmb3IgdGVzdGluZ1xuICAgIC8qKiBQYXJzZSBVc2VyIEFnZW50IHRvIGRldGVybWluZSBpT1MgdmVyc2lvbi4gUmV0dXJucyAtMSBpZiBub3QgZm91bmQuICovXG4gICAgc3RhdGljIFZ0KHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQubWF0Y2goL2koPzpwaG9uZXxwYWR8cG9kKSBvcyAoW1xcZF9dKykvaSksIG4gPSBlID8gZVsxXS5zcGxpdChcIl9cIikuc2xpY2UoMCwgMikuam9pbihcIi5cIikgOiBcIi0xXCI7XG4gICAgICAgIHJldHVybiBOdW1iZXIobik7XG4gICAgfVxuICAgIC8vIHZpc2libGUgZm9yIHRlc3RpbmdcbiAgICAvKiogUGFyc2UgVXNlciBBZ2VudCB0byBkZXRlcm1pbmUgQW5kcm9pZCB2ZXJzaW9uLiBSZXR1cm5zIC0xIGlmIG5vdCBmb3VuZC4gKi9cbiAgICBzdGF0aWMgRHQodCkge1xuICAgICAgICBjb25zdCBlID0gdC5tYXRjaCgvQW5kcm9pZCAoW1xcZC5dKykvaSksIG4gPSBlID8gZVsxXS5zcGxpdChcIi5cIikuc2xpY2UoMCwgMikuam9pbihcIi5cIikgOiBcIi0xXCI7XG4gICAgICAgIHJldHVybiBOdW1iZXIobik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9wZW5zIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2UsIGNyZWF0aW5nIG9yIHVwZ3JhZGluZyBpdCBpZiBuZWNlc3NhcnkuXG4gICAgICovICAgIGFzeW5jIE50KHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGIgfHwgKE8oXCJTaW1wbGVEYlwiLCBcIk9wZW5pbmcgZGF0YWJhc2U6XCIsIHRoaXMubmFtZSksIHRoaXMuZGIgPSBhd2FpdCBuZXcgUHJvbWlzZSgoKGUsIG4pID0+IHtcbiAgICAgICAgICAgIC8vIFRPRE8obWlrZWxlaGVuKTogSW52ZXN0aWdhdGUgYnJvd3NlciBjb21wYXRpYmlsaXR5LlxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0luZGV4ZWREQl9BUEkvVXNpbmdfSW5kZXhlZERCXG4gICAgICAgICAgICAvLyBzdWdnZXN0cyBJRTkgYW5kIG9sZGVyIFdlYktpdCBicm93c2VycyBoYW5kbGUgdXBncmFkZVxuICAgICAgICAgICAgLy8gZGlmZmVyZW50bHkuIFRoZXkgZXhwZWN0IHNldFZlcnNpb24sIGFzIGRlc2NyaWJlZCBoZXJlOlxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0lEQlZlcnNpb25DaGFuZ2VSZXF1ZXN0L3NldFZlcnNpb25cbiAgICAgICAgICAgIGNvbnN0IHMgPSBpbmRleGVkREIub3Blbih0aGlzLm5hbWUsIHRoaXMudmVyc2lvbik7XG4gICAgICAgICAgICBzLm9uc3VjY2VzcyA9IHQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0LnRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgZShuKTtcbiAgICAgICAgICAgIH0sIHMub25ibG9ja2VkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIG4obmV3IGZpKHQsIFwiQ2Fubm90IHVwZ3JhZGUgSW5kZXhlZERCIHNjaGVtYSB3aGlsZSBhbm90aGVyIHRhYiBpcyBvcGVuLiBDbG9zZSBhbGwgdGFicyB0aGF0IGFjY2VzcyBGaXJlc3RvcmUgYW5kIHJlbG9hZCB0aGlzIHBhZ2UgdG8gcHJvY2VlZC5cIikpO1xuICAgICAgICAgICAgfSwgcy5vbmVycm9yID0gZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IGUudGFyZ2V0LmVycm9yO1xuICAgICAgICAgICAgICAgIFwiVmVyc2lvbkVycm9yXCIgPT09IHMubmFtZSA/IG4obmV3IFEoRy5GQUlMRURfUFJFQ09ORElUSU9OLCBcIkEgbmV3ZXIgdmVyc2lvbiBvZiB0aGUgRmlyZXN0b3JlIFNESyB3YXMgcHJldmlvdXNseSB1c2VkIGFuZCBzbyB0aGUgcGVyc2lzdGVkIGRhdGEgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiBvZiB0aGUgU0RLIHlvdSBhcmUgbm93IHVzaW5nLiBUaGUgU0RLIHdpbGwgb3BlcmF0ZSB3aXRoIHBlcnNpc3RlbmNlIGRpc2FibGVkLiBJZiB5b3UgbmVlZCBwZXJzaXN0ZW5jZSwgcGxlYXNlIHJlLXVwZ3JhZGUgdG8gYSBuZXdlciB2ZXJzaW9uIG9mIHRoZSBTREsgb3IgZWxzZSBjbGVhciB0aGUgcGVyc2lzdGVkIEluZGV4ZWREQiBkYXRhIGZvciB5b3VyIGFwcCB0byBzdGFydCBmcmVzaC5cIikpIDogXCJJbnZhbGlkU3RhdGVFcnJvclwiID09PSBzLm5hbWUgPyBuKG5ldyBRKEcuRkFJTEVEX1BSRUNPTkRJVElPTiwgXCJVbmFibGUgdG8gb3BlbiBhbiBJbmRleGVkREIgY29ubmVjdGlvbi4gVGhpcyBjb3VsZCBiZSBkdWUgdG8gcnVubmluZyBpbiBhIHByaXZhdGUgYnJvd3Npbmcgc2Vzc2lvbiBvbiBhIGJyb3dzZXIgd2hvc2UgcHJpdmF0ZSBicm93c2luZyBzZXNzaW9ucyBkbyBub3Qgc3VwcG9ydCBJbmRleGVkREI6IFwiICsgcykpIDogbihuZXcgZmkodCwgcykpO1xuICAgICAgICAgICAgfSwgcy5vbnVwZ3JhZGVuZWVkZWQgPSB0ID0+IHtcbiAgICAgICAgICAgICAgICBPKFwiU2ltcGxlRGJcIiwgJ0RhdGFiYXNlIFwiJyArIHRoaXMubmFtZSArICdcIiByZXF1aXJlcyB1cGdyYWRlIGZyb20gdmVyc2lvbjonLCB0Lm9sZFZlcnNpb24pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0LnRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgdGhpcy5QdC5rdChlLCBzLnRyYW5zYWN0aW9uLCB0Lm9sZFZlcnNpb24sIHRoaXMudmVyc2lvbikubmV4dCgoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBPKFwiU2ltcGxlRGJcIiwgXCJEYXRhYmFzZSB1cGdyYWRlIHRvIHZlcnNpb24gXCIgKyB0aGlzLnZlcnNpb24gKyBcIiBjb21wbGV0ZVwiKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSkpLCB0aGlzLk10ICYmICh0aGlzLmRiLm9udmVyc2lvbmNoYW5nZSA9IHQgPT4gdGhpcy5NdCh0KSksIHRoaXMuZGI7XG4gICAgfVxuICAgIE90KHQpIHtcbiAgICAgICAgdGhpcy5NdCA9IHQsIHRoaXMuZGIgJiYgKHRoaXMuZGIub252ZXJzaW9uY2hhbmdlID0gZSA9PiB0KGUpKTtcbiAgICB9XG4gICAgYXN5bmMgcnVuVHJhbnNhY3Rpb24odCwgZSwgbiwgcykge1xuICAgICAgICBjb25zdCBpID0gXCJyZWFkb25seVwiID09PSBlO1xuICAgICAgICBsZXQgciA9IDA7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICsrcjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYiA9IGF3YWl0IHRoaXMuTnQodCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IGNpLm9wZW4odGhpcy5kYiwgdCwgaSA/IFwicmVhZG9ubHlcIiA6IFwicmVhZHdyaXRlXCIsIG4pLCByID0gcyhlKS5uZXh0KCh0ID0+IChlLmJ0KCksIFxuICAgICAgICAgICAgICAgIHQpKSkuY2F0Y2goKHQgPT4gKFxuICAgICAgICAgICAgICAgIC8vIEFib3J0IHRoZSB0cmFuc2FjdGlvbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IuXG4gICAgICAgICAgICAgICAgZS5hYm9ydCh0KSwgdWkucmVqZWN0KHQpKSkpLnRvUHJvbWlzZSgpO1xuICAgICAgICAgICAgICAgIC8vIEFzIG5vdGVkIGFib3ZlLCBlcnJvcnMgYXJlIHByb3BhZ2F0ZWQgYnkgYWJvcnRpbmcgdGhlIHRyYW5zYWN0aW9uLiBTb1xuICAgICAgICAgICAgICAgIC8vIHdlIHN3YWxsb3cgYW55IGVycm9yIGhlcmUgdG8gYXZvaWQgdGhlIGJyb3dzZXIgbG9nZ2luZyBpdCBhcyB1bmhhbmRsZWQuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHIuY2F0Y2goKCgpID0+IHt9KSksIFxuICAgICAgICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSB0cmFuc2FjdGlvbiB0byBjb21wbGV0ZSAoaS5lLiBJbmRleGVkRGIncyBvbnN1Y2Nlc3MgZXZlbnQgdG9cbiAgICAgICAgICAgICAgICAvLyBmaXJlKSwgYnV0IHN0aWxsIHJldHVybiB0aGUgb3JpZ2luYWwgdHJhbnNhY3Rpb25GblJlc3VsdCBiYWNrIHRvIHRoZVxuICAgICAgICAgICAgICAgIC8vIGNhbGxlci5cbiAgICAgICAgICAgICAgICBhd2FpdCBlLlJ0LCByO1xuICAgICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgICAgIC8vIFRPRE8oc2NobWlkdC1zZWJhc3RpYW4pOiBXZSBjb3VsZCBwcm9iYWJseSBiZSBzbWFydGVyIGFib3V0IHRoaXMgYW5kXG4gICAgICAgICAgICAgICAgLy8gbm90IHJldHJ5IGV4Y2VwdGlvbnMgdGhhdCBhcmUgbGlrZWx5IHVucmVjb3ZlcmFibGUgKHN1Y2ggYXMgcXVvdGFcbiAgICAgICAgICAgICAgICAvLyBleGNlZWRlZCBlcnJvcnMpLlxuICAgICAgICAgICAgICAgIC8vIE5vdGU6IFdlIGNhbm5vdCB1c2UgYW4gaW5zdGFuY2VvZiBjaGVjayBmb3IgRmlyZXN0b3JlRXhjZXB0aW9uLCBzaW5jZSB0aGVcbiAgICAgICAgICAgICAgICAvLyBleGNlcHRpb24gaXMgd3JhcHBlZCBpbiBhIGdlbmVyaWMgZXJyb3IgYnkgb3VyIGFzeW5jL2F3YWl0IGhhbmRsaW5nLlxuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBcIkZpcmViYXNlRXJyb3JcIiAhPT0gdC5uYW1lICYmIHIgPCAzO1xuICAgICAgICAgICAgICAgIGlmIChPKFwiU2ltcGxlRGJcIiwgXCJUcmFuc2FjdGlvbiBmYWlsZWQgd2l0aCBlcnJvcjpcIiwgdC5tZXNzYWdlLCBcIlJldHJ5aW5nOlwiLCBlKSwgXG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpLCAhZSkgcmV0dXJuIFByb21pc2UucmVqZWN0KHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNsb3NlKCkge1xuICAgICAgICB0aGlzLmRiICYmIHRoaXMuZGIuY2xvc2UoKSwgdGhpcy5kYiA9IHZvaWQgMDtcbiAgICB9XG59XG5cbi8qKlxuICogQSBjb250cm9sbGVyIGZvciBpdGVyYXRpbmcgb3ZlciBhIGtleSByYW5nZSBvciBpbmRleC4gSXQgYWxsb3dzIGFuIGl0ZXJhdGVcbiAqIGNhbGxiYWNrIHRvIGRlbGV0ZSB0aGUgY3VycmVudGx5LXJlZmVyZW5jZWQgb2JqZWN0LCBvciBqdW1wIHRvIGEgbmV3IGtleVxuICogd2l0aGluIHRoZSBrZXkgcmFuZ2Ugb3IgaW5kZXguXG4gKi8gY2xhc3MgbGkge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy4kdCA9IHQsIHRoaXMuRnQgPSAhMSwgdGhpcy5CdCA9IG51bGw7XG4gICAgfVxuICAgIGdldCBpc0RvbmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkZ0O1xuICAgIH1cbiAgICBnZXQgTHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJ0O1xuICAgIH1cbiAgICBzZXQgY3Vyc29yKHQpIHtcbiAgICAgICAgdGhpcy4kdCA9IHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCB0byBzdG9wIGl0ZXJhdGlvbiBhdCBhbnkgcG9pbnQuXG4gICAgICovICAgIGRvbmUoKSB7XG4gICAgICAgIHRoaXMuRnQgPSAhMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIHRvIHNraXAgdG8gdGhhdCBuZXh0IGtleSwgd2hpY2ggY291bGQgYmVcbiAgICAgKiBhbiBpbmRleCBvciBhIHByaW1hcnkga2V5LlxuICAgICAqLyAgICBxdCh0KSB7XG4gICAgICAgIHRoaXMuQnQgPSB0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxldGUgdGhlIGN1cnJlbnQgY3Vyc29yIHZhbHVlIGZyb20gdGhlIG9iamVjdCBzdG9yZS5cbiAgICAgKlxuICAgICAqIE5PVEU6IFlvdSBDQU5OT1QgZG8gdGhpcyB3aXRoIGEga2V5c09ubHkgcXVlcnkuXG4gICAgICovICAgIGRlbGV0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHdpKHRoaXMuJHQuZGVsZXRlKCkpO1xuICAgIH1cbn1cblxuLyoqIEFuIGVycm9yIHRoYXQgd3JhcHMgZXhjZXB0aW9ucyB0aGF0IHRocm93biBkdXJpbmcgSW5kZXhlZERCIGV4ZWN1dGlvbi4gKi8gY2xhc3MgZmkgZXh0ZW5kcyBRIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKEcuVU5BVkFJTEFCTEUsIGBJbmRleGVkREIgdHJhbnNhY3Rpb24gJyR7dH0nIGZhaWxlZDogJHtlfWApLCB0aGlzLm5hbWUgPSBcIkluZGV4ZWREYlRyYW5zYWN0aW9uRXJyb3JcIjtcbiAgICB9XG59XG5cbi8qKiBWZXJpZmllcyB3aGV0aGVyIGBlYCBpcyBhbiBJbmRleGVkRGJUcmFuc2FjdGlvbkVycm9yLiAqLyBmdW5jdGlvbiBkaSh0KSB7XG4gICAgLy8gVXNlIG5hbWUgZXF1YWxpdHksIGFzIGluc3RhbmNlb2YgY2hlY2tzIG9uIGVycm9ycyBkb24ndCB3b3JrIHdpdGggZXJyb3JzXG4gICAgLy8gdGhhdCB3cmFwIG90aGVyIGVycm9ycy5cbiAgICByZXR1cm4gXCJJbmRleGVkRGJUcmFuc2FjdGlvbkVycm9yXCIgPT09IHQubmFtZTtcbn1cblxuLyoqXG4gKiBBIHdyYXBwZXIgYXJvdW5kIGFuIElEQk9iamVjdFN0b3JlIHByb3ZpZGluZyBhbiBBUEkgdGhhdDpcbiAqXG4gKiAxKSBIYXMgZ2VuZXJpYyBLZXlUeXBlIC8gVmFsdWVUeXBlIHBhcmFtZXRlcnMgdG8gcHJvdmlkZSBzdHJvbmdseS10eXBlZFxuICogbWV0aG9kcyBmb3IgYWN0aW5nIGFnYWluc3QgdGhlIG9iamVjdCBzdG9yZS5cbiAqIDIpIERlYWxzIHdpdGggSW5kZXhlZERCJ3Mgb25zdWNjZXNzIC8gb25lcnJvciBldmVudCBjYWxsYmFja3MsIG1ha2luZyBldmVyeVxuICogbWV0aG9kIHJldHVybiBhIFBlcnNpc3RlbmNlUHJvbWlzZSBpbnN0ZWFkLlxuICogMykgUHJvdmlkZXMgYSBoaWdoZXItbGV2ZWwgQVBJIHRvIGF2b2lkIG5lZWRpbmcgdG8gZG8gZXhjZXNzaXZlIHdyYXBwaW5nIG9mXG4gKiBpbnRlcm1lZGlhdGUgSW5kZXhlZERCIHR5cGVzIChJREJDdXJzb3JXaXRoVmFsdWUsIGV0Yy4pXG4gKi8gY2xhc3MgX2kge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5zdG9yZSA9IHQ7XG4gICAgfVxuICAgIHB1dCh0LCBlKSB7XG4gICAgICAgIGxldCBuO1xuICAgICAgICByZXR1cm4gdm9pZCAwICE9PSBlID8gKE8oXCJTaW1wbGVEYlwiLCBcIlBVVFwiLCB0aGlzLnN0b3JlLm5hbWUsIHQsIGUpLCBuID0gdGhpcy5zdG9yZS5wdXQoZSwgdCkpIDogKE8oXCJTaW1wbGVEYlwiLCBcIlBVVFwiLCB0aGlzLnN0b3JlLm5hbWUsIFwiPGF1dG8ta2V5PlwiLCB0KSwgXG4gICAgICAgIG4gPSB0aGlzLnN0b3JlLnB1dCh0KSksIHdpKG4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgbmV3IHZhbHVlIGludG8gYW4gT2JqZWN0IFN0b3JlIGFuZCByZXR1cm5zIHRoZSBuZXcga2V5LiBTaW1pbGFyIHRvXG4gICAgICogSW5kZXhlZERiJ3MgYGFkZCgpYCwgdGhpcyBtZXRob2Qgd2lsbCBmYWlsIG9uIHByaW1hcnkga2V5IGNvbGxpc2lvbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgb2JqZWN0IHRvIHdyaXRlLlxuICAgICAqIEByZXR1cm5zIFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGFkZC5cbiAgICAgKi8gICAgYWRkKHQpIHtcbiAgICAgICAgTyhcIlNpbXBsZURiXCIsIFwiQUREXCIsIHRoaXMuc3RvcmUubmFtZSwgdCwgdCk7XG4gICAgICAgIHJldHVybiB3aSh0aGlzLnN0b3JlLmFkZCh0KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhlIHNwZWNpZmllZCBzdG9yZSwgb3IgbnVsbFxuICAgICAqIGlmIG5vIG9iamVjdCBleGlzdHMgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS5cbiAgICAgKlxuICAgICAqIEBrZXkgVGhlIGtleSBvZiB0aGUgb2JqZWN0IHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyBUaGUgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBrZXkgb3IgbnVsbCBpZiBubyBvYmplY3QgZXhpc3RzLlxuICAgICAqLyAgICBnZXQodCkge1xuICAgICAgICAvLyBXZSdyZSBkb2luZyBhbiB1bnNhZmUgY2FzdCB0byBWYWx1ZVR5cGUuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHJldHVybiB3aSh0aGlzLnN0b3JlLmdldCh0KSkubmV4dCgoZSA9PiAoXG4gICAgICAgIC8vIE5vcm1hbGl6ZSBub25leGlzdGVuY2UgdG8gbnVsbC5cbiAgICAgICAgdm9pZCAwID09PSBlICYmIChlID0gbnVsbCksIE8oXCJTaW1wbGVEYlwiLCBcIkdFVFwiLCB0aGlzLnN0b3JlLm5hbWUsIHQsIGUpLCBlKSkpO1xuICAgIH1cbiAgICBkZWxldGUodCkge1xuICAgICAgICBPKFwiU2ltcGxlRGJcIiwgXCJERUxFVEVcIiwgdGhpcy5zdG9yZS5uYW1lLCB0KTtcbiAgICAgICAgcmV0dXJuIHdpKHRoaXMuc3RvcmUuZGVsZXRlKHQpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgd2UgZXZlciBuZWVkIG1vcmUgb2YgdGhlIGNvdW50IHZhcmlhbnRzLCB3ZSBjYW4gYWRkIG92ZXJsb2Fkcy4gRm9yIG5vdyxcbiAgICAgKiBhbGwgd2UgbmVlZCBpcyB0byBjb3VudCBldmVyeXRoaW5nIGluIGEgc3RvcmUuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgc3RvcmUuXG4gICAgICovICAgIGNvdW50KCkge1xuICAgICAgICBPKFwiU2ltcGxlRGJcIiwgXCJDT1VOVFwiLCB0aGlzLnN0b3JlLm5hbWUpO1xuICAgICAgICByZXR1cm4gd2kodGhpcy5zdG9yZS5jb3VudCgpKTtcbiAgICB9XG4gICAgVXQodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gdGhpcy5vcHRpb25zKHQsIGUpO1xuICAgICAgICAvLyBVc2UgYGdldEFsbCgpYCBpZiB0aGUgYnJvd3NlciBzdXBwb3J0cyBJbmRleGVkREIgdjMsIGFzIGl0IGlzIHJvdWdobHlcbiAgICAgICAgLy8gMjAlIGZhc3Rlci4gVW5mb3J0dW5hdGVseSwgZ2V0QWxsKCkgZG9lcyBub3Qgc3VwcG9ydCBjdXN0b20gaW5kaWNlcy5cbiAgICAgICAgICAgICAgICBpZiAobi5pbmRleCB8fCBcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIHRoaXMuc3RvcmUuZ2V0QWxsKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5jdXJzb3IobiksIGUgPSBbXTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLkt0KHQsICgodCwgbikgPT4ge1xuICAgICAgICAgICAgICAgIGUucHVzaChuKTtcbiAgICAgICAgICAgIH0pKS5uZXh0KCgoKSA9PiBlKSk7XG4gICAgICAgIH1cbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuc3RvcmUuZ2V0QWxsKG4ucmFuZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyB1aSgoKGUsIG4pID0+IHtcbiAgICAgICAgICAgICAgICB0Lm9uZXJyb3IgPSB0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbih0LnRhcmdldC5lcnJvcik7XG4gICAgICAgICAgICAgICAgfSwgdC5vbnN1Y2Nlc3MgPSB0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZSh0LnRhcmdldC5yZXN1bHQpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIGZpcnN0IGBjb3VudGAgZWxlbWVudHMgZnJvbSB0aGUgcHJvdmlkZWQgaW5kZXggcmFuZ2UuIExvYWRzIGFsbFxuICAgICAqIGVsZW1lbnRzIGlmIG5vIGxpbWl0IGlzIHByb3ZpZGVkLlxuICAgICAqLyAgICBHdCh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLnN0b3JlLmdldEFsbCh0LCBudWxsID09PSBlID8gdm9pZCAwIDogZSk7XG4gICAgICAgIHJldHVybiBuZXcgdWkoKCh0LCBlKSA9PiB7XG4gICAgICAgICAgICBuLm9uZXJyb3IgPSB0ID0+IHtcbiAgICAgICAgICAgICAgICBlKHQudGFyZ2V0LmVycm9yKTtcbiAgICAgICAgICAgIH0sIG4ub25zdWNjZXNzID0gZSA9PiB7XG4gICAgICAgICAgICAgICAgdChlLnRhcmdldC5yZXN1bHQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBRdCh0LCBlKSB7XG4gICAgICAgIE8oXCJTaW1wbGVEYlwiLCBcIkRFTEVURSBBTExcIiwgdGhpcy5zdG9yZS5uYW1lKTtcbiAgICAgICAgY29uc3QgbiA9IHRoaXMub3B0aW9ucyh0LCBlKTtcbiAgICAgICAgbi5qdCA9ICExO1xuICAgICAgICBjb25zdCBzID0gdGhpcy5jdXJzb3Iobik7XG4gICAgICAgIHJldHVybiB0aGlzLkt0KHMsICgodCwgZSwgbikgPT4gbi5kZWxldGUoKSkpO1xuICAgIH1cbiAgICBXdCh0LCBlKSB7XG4gICAgICAgIGxldCBuO1xuICAgICAgICBlID8gbiA9IHQgOiAobiA9IHt9LCBlID0gdCk7XG4gICAgICAgIGNvbnN0IHMgPSB0aGlzLmN1cnNvcihuKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuS3QocywgZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgYSBzdG9yZSwgYnV0IHdhaXRzIGZvciB0aGUgZ2l2ZW4gY2FsbGJhY2sgdG8gY29tcGxldGUgZm9yXG4gICAgICogZWFjaCBlbnRyeSBiZWZvcmUgaXRlcmF0aW5nIHRoZSBuZXh0IGVudHJ5LiBUaGlzIGFsbG93cyB0aGUgY2FsbGJhY2sgdG8gZG9cbiAgICAgKiBhc3luY2hyb25vdXMgd29yayB0byBkZXRlcm1pbmUgaWYgdGhpcyBpdGVyYXRpb24gc2hvdWxkIGNvbnRpbnVlLlxuICAgICAqXG4gICAgICogVGhlIHByb3ZpZGVkIGNhbGxiYWNrIHNob3VsZCByZXR1cm4gYHRydWVgIHRvIGNvbnRpbnVlIGl0ZXJhdGlvbiwgYW5kXG4gICAgICogYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICovICAgIHp0KHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMuY3Vyc29yKHt9KTtcbiAgICAgICAgcmV0dXJuIG5ldyB1aSgoKG4sIHMpID0+IHtcbiAgICAgICAgICAgIGUub25lcnJvciA9IHQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBnaSh0LnRhcmdldC5lcnJvcik7XG4gICAgICAgICAgICAgICAgcyhlKTtcbiAgICAgICAgICAgIH0sIGUub25zdWNjZXNzID0gZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICAgICAgICBzID8gdChzLnByaW1hcnlLZXksIHMudmFsdWUpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0ID8gcy5jb250aW51ZSgpIDogbigpO1xuICAgICAgICAgICAgICAgIH0pKSA6IG4oKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgS3QodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gW107XG4gICAgICAgIHJldHVybiBuZXcgdWkoKChzLCBpKSA9PiB7XG4gICAgICAgICAgICB0Lm9uZXJyb3IgPSB0ID0+IHtcbiAgICAgICAgICAgICAgICBpKHQudGFyZ2V0LmVycm9yKTtcbiAgICAgICAgICAgIH0sIHQub25zdWNjZXNzID0gdCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaSA9IHQudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoIWkpIHJldHVybiB2b2lkIHMoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByID0gbmV3IGxpKGkpLCBvID0gZShpLnByaW1hcnlLZXksIGkudmFsdWUsIHIpO1xuICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgdWkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IG8uY2F0Y2goKHQgPT4gKHIuZG9uZSgpLCB1aS5yZWplY3QodCkpKSk7XG4gICAgICAgICAgICAgICAgICAgIG4ucHVzaCh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgci5pc0RvbmUgPyBzKCkgOiBudWxsID09PSByLkx0ID8gaS5jb250aW51ZSgpIDogaS5jb250aW51ZShyLkx0KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiB1aS53YWl0Rm9yKG4pKSk7XG4gICAgfVxuICAgIG9wdGlvbnModCwgZSkge1xuICAgICAgICBsZXQgbjtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gdCAmJiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCA/IG4gPSB0IDogZSA9IHQpLCB7XG4gICAgICAgICAgICBpbmRleDogbixcbiAgICAgICAgICAgIHJhbmdlOiBlXG4gICAgICAgIH07XG4gICAgfVxuICAgIGN1cnNvcih0KSB7XG4gICAgICAgIGxldCBlID0gXCJuZXh0XCI7XG4gICAgICAgIGlmICh0LnJldmVyc2UgJiYgKGUgPSBcInByZXZcIiksIHQuaW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLnN0b3JlLmluZGV4KHQuaW5kZXgpO1xuICAgICAgICAgICAgcmV0dXJuIHQuanQgPyBuLm9wZW5LZXlDdXJzb3IodC5yYW5nZSwgZSkgOiBuLm9wZW5DdXJzb3IodC5yYW5nZSwgZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUub3BlbkN1cnNvcih0LnJhbmdlLCBlKTtcbiAgICB9XG59XG5cbi8qKlxuICogV3JhcHMgYW4gSURCUmVxdWVzdCBpbiBhIFBlcnNpc3RlbmNlUHJvbWlzZSwgdXNpbmcgdGhlIG9uc3VjY2VzcyAvIG9uZXJyb3JcbiAqIGhhbmRsZXJzIHRvIHJlc29sdmUgLyByZWplY3QgdGhlIFBlcnNpc3RlbmNlUHJvbWlzZSBhcyBhcHByb3ByaWF0ZS5cbiAqLyBmdW5jdGlvbiB3aSh0KSB7XG4gICAgcmV0dXJuIG5ldyB1aSgoKGUsIG4pID0+IHtcbiAgICAgICAgdC5vbnN1Y2Nlc3MgPSB0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0LnRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICBlKG4pO1xuICAgICAgICB9LCB0Lm9uZXJyb3IgPSB0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBnaSh0LnRhcmdldC5lcnJvcik7XG4gICAgICAgICAgICBuKGUpO1xuICAgICAgICB9O1xuICAgIH0pKTtcbn1cblxuLy8gR3VhcmQgc28gd2Ugb25seSByZXBvcnQgdGhlIGVycm9yIG9uY2UuXG5sZXQgbWkgPSAhMTtcblxuZnVuY3Rpb24gZ2kodCkge1xuICAgIGNvbnN0IGUgPSBoaS5WdChnZXRVQSgpKTtcbiAgICBpZiAoZSA+PSAxMi4yICYmIGUgPCAxMykge1xuICAgICAgICBjb25zdCBlID0gXCJBbiBpbnRlcm5hbCBlcnJvciB3YXMgZW5jb3VudGVyZWQgaW4gdGhlIEluZGV4ZWQgRGF0YWJhc2Ugc2VydmVyXCI7XG4gICAgICAgIGlmICh0Lm1lc3NhZ2UuaW5kZXhPZihlKSA+PSAwKSB7XG4gICAgICAgICAgICAvLyBXcmFwIGVycm9yIGluIGEgbW9yZSBkZXNjcmlwdGl2ZSBvbmUuXG4gICAgICAgICAgICBjb25zdCB0ID0gbmV3IFEoXCJpbnRlcm5hbFwiLCBgSU9TX0lOREVYRUREQl9CVUcxOiBJbmRleGVkRGIgaGFzIHRocm93biAnJHtlfScuIFRoaXMgaXMgbGlrZWx5IGR1ZSB0byBhbiB1bmF2b2lkYWJsZSBidWcgaW4gaU9TLiBTZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xLzU2NDk2Mjk2LzExMDkxNSBmb3IgZGV0YWlscyBhbmQgYSBwb3RlbnRpYWwgd29ya2Fyb3VuZC5gKTtcbiAgICAgICAgICAgIHJldHVybiBtaSB8fCAobWkgPSAhMCwgXG4gICAgICAgICAgICAvLyBUaHJvdyBhIGdsb2JhbCBleGNlcHRpb24gb3V0c2lkZSBvZiB0aGlzIHByb21pc2UgY2hhaW4sIGZvciB0aGUgdXNlciB0b1xuICAgICAgICAgICAgLy8gcG90ZW50aWFsbHkgY2F0Y2guXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhyb3cgdDtcbiAgICAgICAgICAgIH0pLCAwKSksIHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHQ7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGNsYXNzIHlpIGV4dGVuZHMgYWkge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgc3VwZXIoKSwgdGhpcy5IdCA9IHQsIHRoaXMuY3VycmVudFNlcXVlbmNlTnVtYmVyID0gZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHBpKHQsIGUpIHtcbiAgICBjb25zdCBuID0gSyh0KTtcbiAgICByZXR1cm4gaGkueHQobi5IdCwgZSk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEEgYmF0Y2ggb2YgbXV0YXRpb25zIHRoYXQgd2lsbCBiZSBzZW50IGFzIG9uZSB1bml0IHRvIHRoZSBiYWNrZW5kLlxuICovIGNsYXNzIElpIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYmF0Y2hJZCAtIFRoZSB1bmlxdWUgSUQgb2YgdGhpcyBtdXRhdGlvbiBiYXRjaC5cbiAgICAgKiBAcGFyYW0gbG9jYWxXcml0ZVRpbWUgLSBUaGUgb3JpZ2luYWwgd3JpdGUgdGltZSBvZiB0aGlzIG11dGF0aW9uLlxuICAgICAqIEBwYXJhbSBiYXNlTXV0YXRpb25zIC0gTXV0YXRpb25zIHRoYXQgYXJlIHVzZWQgdG8gcG9wdWxhdGUgdGhlIGJhc2VcbiAgICAgKiB2YWx1ZXMgd2hlbiB0aGlzIG11dGF0aW9uIGlzIGFwcGxpZWQgbG9jYWxseS4gVGhpcyBjYW4gYmUgdXNlZCB0byBsb2NhbGx5XG4gICAgICogb3ZlcndyaXRlIHZhbHVlcyB0aGF0IGFyZSBwZXJzaXN0ZWQgaW4gdGhlIHJlbW90ZSBkb2N1bWVudCBjYWNoZS4gQmFzZVxuICAgICAqIG11dGF0aW9ucyBhcmUgbmV2ZXIgc2VudCB0byB0aGUgYmFja2VuZC5cbiAgICAgKiBAcGFyYW0gbXV0YXRpb25zIC0gVGhlIHVzZXItcHJvdmlkZWQgbXV0YXRpb25zIGluIHRoaXMgbXV0YXRpb24gYmF0Y2guXG4gICAgICogVXNlci1wcm92aWRlZCBtdXRhdGlvbnMgYXJlIGFwcGxpZWQgYm90aCBsb2NhbGx5IGFuZCByZW1vdGVseSBvbiB0aGVcbiAgICAgKiBiYWNrZW5kLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgdGhpcy5iYXRjaElkID0gdCwgdGhpcy5sb2NhbFdyaXRlVGltZSA9IGUsIHRoaXMuYmFzZU11dGF0aW9ucyA9IG4sIHRoaXMubXV0YXRpb25zID0gcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXBwbGllcyBhbGwgdGhlIG11dGF0aW9ucyBpbiB0aGlzIE11dGF0aW9uQmF0Y2ggdG8gdGhlIHNwZWNpZmllZCBkb2N1bWVudFxuICAgICAqIHRvIGNvbXB1dGUgdGhlIHN0YXRlIG9mIHRoZSByZW1vdGUgZG9jdW1lbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBkb2N1bWVudCAtIFRoZSBkb2N1bWVudCB0byBhcHBseSBtdXRhdGlvbnMgdG8uXG4gICAgICogQHBhcmFtIGJhdGNoUmVzdWx0IC0gVGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgTXV0YXRpb25CYXRjaCB0byB0aGVcbiAgICAgKiBiYWNrZW5kLlxuICAgICAqLyAgICBhcHBseVRvUmVtb3RlRG9jdW1lbnQodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gZS5tdXRhdGlvblJlc3VsdHM7XG4gICAgICAgIGZvciAobGV0IGUgPSAwOyBlIDwgdGhpcy5tdXRhdGlvbnMubGVuZ3RoOyBlKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLm11dGF0aW9uc1tlXTtcbiAgICAgICAgICAgIGlmIChzLmtleS5pc0VxdWFsKHQua2V5KSkge1xuICAgICAgICAgICAgICAgIGRuKHMsIHQsIG5bZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBsb2NhbCB2aWV3IG9mIGEgZG9jdW1lbnQgZ2l2ZW4gYWxsIHRoZSBtdXRhdGlvbnMgaW4gdGhpc1xuICAgICAqIGJhdGNoLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRvY3VtZW50IC0gVGhlIGRvY3VtZW50IHRvIGFwcGx5IG11dGF0aW9ucyB0by5cbiAgICAgKi8gICAgYXBwbHlUb0xvY2FsVmlldyh0KSB7XG4gICAgICAgIC8vIEZpcnN0LCBhcHBseSB0aGUgYmFzZSBzdGF0ZS4gVGhpcyBhbGxvd3MgdXMgdG8gYXBwbHkgbm9uLWlkZW1wb3RlbnRcbiAgICAgICAgLy8gdHJhbnNmb3JtIGFnYWluc3QgYSBjb25zaXN0ZW50IHNldCBvZiB2YWx1ZXMuXG4gICAgICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLmJhc2VNdXRhdGlvbnMpIGUua2V5LmlzRXF1YWwodC5rZXkpICYmIF9uKGUsIHQsIHRoaXMubG9jYWxXcml0ZVRpbWUpO1xuICAgICAgICAvLyBTZWNvbmQsIGFwcGx5IGFsbCB1c2VyLXByb3ZpZGVkIG11dGF0aW9ucy5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdGhpcy5tdXRhdGlvbnMpIGUua2V5LmlzRXF1YWwodC5rZXkpICYmIF9uKGUsIHQsIHRoaXMubG9jYWxXcml0ZVRpbWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgbG9jYWwgdmlldyBmb3IgYWxsIHByb3ZpZGVkIGRvY3VtZW50cyBnaXZlbiB0aGUgbXV0YXRpb25zIGluXG4gICAgICogdGhpcyBiYXRjaC5cbiAgICAgKi8gICAgYXBwbHlUb0xvY2FsRG9jdW1lbnRTZXQodCkge1xuICAgICAgICAvLyBUT0RPKG1yc2NobWlkdCk6IFRoaXMgaW1wbGVtZW50YXRpb24gaXMgTyhuXjIpLiBJZiB3ZSBhcHBseSB0aGUgbXV0YXRpb25zXG4gICAgICAgIC8vIGRpcmVjdGx5IChhcyBkb25lIGluIGBhcHBseVRvTG9jYWxWaWV3KClgKSwgd2UgY2FuIHJlZHVjZSB0aGUgY29tcGxleGl0eVxuICAgICAgICAvLyB0byBPKG4pLlxuICAgICAgICB0aGlzLm11dGF0aW9ucy5mb3JFYWNoKChlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0LmdldChlLmtleSksIHMgPSBuO1xuICAgICAgICAgICAgLy8gVE9ETyhtdXRhYmxlZG9jdW1lbnRzKTogVGhpcyBtZXRob2Qgc2hvdWxkIHRha2UgYSBNdXRhYmxlRG9jdW1lbnRNYXBcbiAgICAgICAgICAgIC8vIGFuZCB3ZSBzaG91bGQgcmVtb3ZlIHRoaXMgY2FzdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlUb0xvY2FsVmlldyhzKSwgbi5pc1ZhbGlkRG9jdW1lbnQoKSB8fCBzLmNvbnZlcnRUb05vRG9jdW1lbnQoY3QubWluKCkpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGtleXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm11dGF0aW9ucy5yZWR1Y2UoKCh0LCBlKSA9PiB0LmFkZChlLmtleSkpLCBHbigpKTtcbiAgICB9XG4gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhdGNoSWQgPT09IHQuYmF0Y2hJZCAmJiBvdCh0aGlzLm11dGF0aW9ucywgdC5tdXRhdGlvbnMsICgodCwgZSkgPT4gbW4odCwgZSkpKSAmJiBvdCh0aGlzLmJhc2VNdXRhdGlvbnMsIHQuYmFzZU11dGF0aW9ucywgKCh0LCBlKSA9PiBtbih0LCBlKSkpO1xuICAgIH1cbn1cblxuLyoqIFRoZSByZXN1bHQgb2YgYXBwbHlpbmcgYSBtdXRhdGlvbiBiYXRjaCB0byB0aGUgYmFja2VuZC4gKi8gY2xhc3MgVGkge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIFxuICAgIC8qKlxuICAgICAqIEEgcHJlLWNvbXB1dGVkIG1hcHBpbmcgZnJvbSBlYWNoIG11dGF0ZWQgZG9jdW1lbnQgdG8gdGhlIHJlc3VsdGluZ1xuICAgICAqIHZlcnNpb24uXG4gICAgICovXG4gICAgcykge1xuICAgICAgICB0aGlzLmJhdGNoID0gdCwgdGhpcy5jb21taXRWZXJzaW9uID0gZSwgdGhpcy5tdXRhdGlvblJlc3VsdHMgPSBuLCB0aGlzLmRvY1ZlcnNpb25zID0gcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBNdXRhdGlvbkJhdGNoUmVzdWx0IGZvciB0aGUgZ2l2ZW4gYmF0Y2ggYW5kIHJlc3VsdHMuIFRoZXJlXG4gICAgICogbXVzdCBiZSBvbmUgcmVzdWx0IGZvciBlYWNoIG11dGF0aW9uIGluIHRoZSBiYXRjaC4gVGhpcyBzdGF0aWMgZmFjdG9yeVxuICAgICAqIGNhY2hlcyBhIGRvY3VtZW50PSZndDt2ZXJzaW9uIG1hcHBpbmcgKGRvY1ZlcnNpb25zKS5cbiAgICAgKi8gICAgc3RhdGljIGZyb20odCwgZSwgbikge1xuICAgICAgICBxKHQubXV0YXRpb25zLmxlbmd0aCA9PT0gbi5sZW5ndGgpO1xuICAgICAgICBsZXQgcyA9IFVuO1xuICAgICAgICBjb25zdCBpID0gdC5tdXRhdGlvbnM7XG4gICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgaS5sZW5ndGg7IHQrKykgcyA9IHMuaW5zZXJ0KGlbdF0ua2V5LCBuW3RdLnZlcnNpb24pO1xuICAgICAgICByZXR1cm4gbmV3IFRpKHQsIGUsIG4sIHMpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogUmVwcmVzZW50YXRpb24gb2YgYW4gb3ZlcmxheSBjb21wdXRlZCBieSBGaXJlc3RvcmUuXG4gKlxuICogSG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgYSBtdXRhdGlvbiBhbmQgdGhlIGxhcmdlc3QgYmF0Y2ggaWQgaW4gRmlyZXN0b3JlIHdoZW5cbiAqIHRoZSBtdXRhdGlvbiB3YXMgY3JlYXRlZC5cbiAqLyBjbGFzcyBFaSB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLmxhcmdlc3RCYXRjaElkID0gdCwgdGhpcy5tdXRhdGlvbiA9IGU7XG4gICAgfVxuICAgIGdldEtleSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXV0YXRpb24ua2V5O1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIG51bGwgIT09IHQgJiYgdGhpcy5tdXRhdGlvbiA9PT0gdC5tdXRhdGlvbjtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgT3ZlcmxheXtcXG4gICAgICBsYXJnZXN0QmF0Y2hJZDogJHt0aGlzLmxhcmdlc3RCYXRjaElkfSxcXG4gICAgICBtdXRhdGlvbjogJHt0aGlzLm11dGF0aW9uLnRvU3RyaW5nKCl9XFxuICAgIH1gO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQW4gaW1tdXRhYmxlIHNldCBvZiBtZXRhZGF0YSB0aGF0IHRoZSBsb2NhbCBzdG9yZSB0cmFja3MgZm9yIGVhY2ggdGFyZ2V0LlxuICovIGNsYXNzIEFpIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKiogVGhlIHRhcmdldCBiZWluZyBsaXN0ZW5lZCB0by4gKi9cbiAgICB0LCBcbiAgICAvKipcbiAgICAgKiBUaGUgdGFyZ2V0IElEIHRvIHdoaWNoIHRoZSB0YXJnZXQgY29ycmVzcG9uZHM7IEFzc2lnbmVkIGJ5IHRoZVxuICAgICAqIExvY2FsU3RvcmUgZm9yIHVzZXIgbGlzdGVucyBhbmQgYnkgdGhlIFN5bmNFbmdpbmUgZm9yIGxpbWJvIHdhdGNoZXMuXG4gICAgICovXG4gICAgZSwgXG4gICAgLyoqIFRoZSBwdXJwb3NlIG9mIHRoZSB0YXJnZXQuICovXG4gICAgbiwgXG4gICAgLyoqXG4gICAgICogVGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgbGFzdCB0cmFuc2FjdGlvbiBkdXJpbmcgd2hpY2ggdGhpcyB0YXJnZXQgZGF0YVxuICAgICAqIHdhcyBtb2RpZmllZC5cbiAgICAgKi9cbiAgICBzLCBcbiAgICAvKiogVGhlIGxhdGVzdCBzbmFwc2hvdCB2ZXJzaW9uIHNlZW4gZm9yIHRoaXMgdGFyZ2V0LiAqL1xuICAgIGkgPSBjdC5taW4oKVxuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIHNuYXBzaG90IHZlcnNpb24gYXQgd2hpY2ggdGhlIGFzc29jaWF0ZWQgdmlld1xuICAgICAqIGNvbnRhaW5lZCBubyBsaW1ibyBkb2N1bWVudHMuXG4gICAgICovICwgciA9IGN0Lm1pbigpXG4gICAgLyoqXG4gICAgICogQW4gb3BhcXVlLCBzZXJ2ZXItYXNzaWduZWQgdG9rZW4gdGhhdCBhbGxvd3Mgd2F0Y2hpbmcgYSB0YXJnZXQgdG8gYmVcbiAgICAgKiByZXN1bWVkIGFmdGVyIGRpc2Nvbm5lY3Rpbmcgd2l0aG91dCByZXRyYW5zbWl0dGluZyBhbGwgdGhlIGRhdGEgdGhhdFxuICAgICAqIG1hdGNoZXMgdGhlIHRhcmdldC4gVGhlIHJlc3VtZSB0b2tlbiBlc3NlbnRpYWxseSBpZGVudGlmaWVzIGEgcG9pbnQgaW5cbiAgICAgKiB0aW1lIGZyb20gd2hpY2ggdGhlIHNlcnZlciBzaG91bGQgcmVzdW1lIHNlbmRpbmcgcmVzdWx0cy5cbiAgICAgKi8gLCBvID0gcHQuRU1QVFlfQllURV9TVFJJTkcpIHtcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0LCB0aGlzLnRhcmdldElkID0gZSwgdGhpcy5wdXJwb3NlID0gbiwgdGhpcy5zZXF1ZW5jZU51bWJlciA9IHMsIHRoaXMuc25hcHNob3RWZXJzaW9uID0gaSwgXG4gICAgICAgIHRoaXMubGFzdExpbWJvRnJlZVNuYXBzaG90VmVyc2lvbiA9IHIsIHRoaXMucmVzdW1lVG9rZW4gPSBvO1xuICAgIH1cbiAgICAvKiogQ3JlYXRlcyBhIG5ldyB0YXJnZXQgZGF0YSBpbnN0YW5jZSB3aXRoIGFuIHVwZGF0ZWQgc2VxdWVuY2UgbnVtYmVyLiAqLyAgICB3aXRoU2VxdWVuY2VOdW1iZXIodCkge1xuICAgICAgICByZXR1cm4gbmV3IEFpKHRoaXMudGFyZ2V0LCB0aGlzLnRhcmdldElkLCB0aGlzLnB1cnBvc2UsIHQsIHRoaXMuc25hcHNob3RWZXJzaW9uLCB0aGlzLmxhc3RMaW1ib0ZyZWVTbmFwc2hvdFZlcnNpb24sIHRoaXMucmVzdW1lVG9rZW4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHRhcmdldCBkYXRhIGluc3RhbmNlIHdpdGggYW4gdXBkYXRlZCByZXN1bWUgdG9rZW4gYW5kXG4gICAgICogc25hcHNob3QgdmVyc2lvbi5cbiAgICAgKi8gICAgd2l0aFJlc3VtZVRva2VuKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBaSh0aGlzLnRhcmdldCwgdGhpcy50YXJnZXRJZCwgdGhpcy5wdXJwb3NlLCB0aGlzLnNlcXVlbmNlTnVtYmVyLCBlLCB0aGlzLmxhc3RMaW1ib0ZyZWVTbmFwc2hvdFZlcnNpb24sIHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHRhcmdldCBkYXRhIGluc3RhbmNlIHdpdGggYW4gdXBkYXRlZCBsYXN0IGxpbWJvIGZyZWVcbiAgICAgKiBzbmFwc2hvdCB2ZXJzaW9uIG51bWJlci5cbiAgICAgKi8gICAgd2l0aExhc3RMaW1ib0ZyZWVTbmFwc2hvdFZlcnNpb24odCkge1xuICAgICAgICByZXR1cm4gbmV3IEFpKHRoaXMudGFyZ2V0LCB0aGlzLnRhcmdldElkLCB0aGlzLnB1cnBvc2UsIHRoaXMuc2VxdWVuY2VOdW1iZXIsIHRoaXMuc25hcHNob3RWZXJzaW9uLCB0LCB0aGlzLnJlc3VtZVRva2VuKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogU2VyaWFsaXplciBmb3IgdmFsdWVzIHN0b3JlZCBpbiB0aGUgTG9jYWxTdG9yZS4gKi8gY2xhc3MgUmkge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5KdCA9IHQ7XG4gICAgfVxufVxuXG4vKiogRGVjb2RlcyBhIHJlbW90ZSBkb2N1bWVudCBmcm9tIHN0b3JhZ2UgbG9jYWxseSB0byBhIERvY3VtZW50LiAqLyBmdW5jdGlvbiBiaSh0LCBlKSB7XG4gICAgbGV0IG47XG4gICAgaWYgKGUuZG9jdW1lbnQpIG4gPSB5cyh0Lkp0LCBlLmRvY3VtZW50LCAhIWUuaGFzQ29tbWl0dGVkTXV0YXRpb25zKTsgZWxzZSBpZiAoZS5ub0RvY3VtZW50KSB7XG4gICAgICAgIGNvbnN0IHQgPSB4dC5mcm9tU2VnbWVudHMoZS5ub0RvY3VtZW50LnBhdGgpLCBzID0gRGkoZS5ub0RvY3VtZW50LnJlYWRUaW1lKTtcbiAgICAgICAgbiA9IHRlLm5ld05vRG9jdW1lbnQodCwgcyksIGUuaGFzQ29tbWl0dGVkTXV0YXRpb25zICYmIG4uc2V0SGFzQ29tbWl0dGVkTXV0YXRpb25zKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFlLnVua25vd25Eb2N1bWVudCkgcmV0dXJuIEwoKTtcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdCA9IHh0LmZyb21TZWdtZW50cyhlLnVua25vd25Eb2N1bWVudC5wYXRoKSwgcyA9IERpKGUudW5rbm93bkRvY3VtZW50LnZlcnNpb24pO1xuICAgICAgICAgICAgbiA9IHRlLm5ld1Vua25vd25Eb2N1bWVudCh0LCBzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZS5yZWFkVGltZSAmJiBuLnNldFJlYWRUaW1lKHZpKGUucmVhZFRpbWUpKSwgbjtcbn1cblxuLyoqIEVuY29kZXMgYSBkb2N1bWVudCBmb3Igc3RvcmFnZSBsb2NhbGx5LiAqLyBmdW5jdGlvbiBQaSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IGUua2V5LnBhdGgucG9wTGFzdCgpLnRvQXJyYXkoKSwgcyA9IFZpKGUucmVhZFRpbWUpO1xuICAgIGlmIChlLmlzRm91bmREb2N1bWVudCgpKSB7XG4gICAgICAgIGNvbnN0IGkgPSBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IGxzKHQsIGUua2V5KSxcbiAgICAgICAgICAgICAgICBmaWVsZHM6IGUuZGF0YS52YWx1ZS5tYXBWYWx1ZS5maWVsZHMsXG4gICAgICAgICAgICAgICAgdXBkYXRlVGltZTogcnModCwgZS52ZXJzaW9uLnRvVGltZXN0YW1wKCkpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KHQuSnQsIGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZG9jdW1lbnQ6IGksXG4gICAgICAgICAgICBoYXNDb21taXR0ZWRNdXRhdGlvbnM6IGUuaGFzQ29tbWl0dGVkTXV0YXRpb25zLFxuICAgICAgICAgICAgcmVhZFRpbWU6IHMsXG4gICAgICAgICAgICBwYXJlbnRQYXRoOiBuXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChlLmlzTm9Eb2N1bWVudCgpKSB7XG4gICAgICAgIGNvbnN0IHQgPSBlLmtleS5wYXRoLnRvQXJyYXkoKSwgaSA9IGUuaGFzQ29tbWl0dGVkTXV0YXRpb25zO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbm9Eb2N1bWVudDoge1xuICAgICAgICAgICAgICAgIHBhdGg6IHQsXG4gICAgICAgICAgICAgICAgcmVhZFRpbWU6IFNpKGUudmVyc2lvbilcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoYXNDb21taXR0ZWRNdXRhdGlvbnM6IGksXG4gICAgICAgICAgICByZWFkVGltZTogcyxcbiAgICAgICAgICAgIHBhcmVudFBhdGg6IG5cbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGUuaXNVbmtub3duRG9jdW1lbnQoKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdW5rbm93bkRvY3VtZW50OiB7XG4gICAgICAgICAgICAgICAgcGF0aDogZS5rZXkucGF0aC50b0FycmF5KCksXG4gICAgICAgICAgICAgICAgdmVyc2lvbjogU2koZS52ZXJzaW9uKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhhc0NvbW1pdHRlZE11dGF0aW9uczogITAsXG4gICAgICAgICAgICByZWFkVGltZTogcyxcbiAgICAgICAgICAgIHBhcmVudFBhdGg6IG5cbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIEwoKTtcbn1cblxuZnVuY3Rpb24gVmkodCkge1xuICAgIGNvbnN0IGUgPSB0LnRvVGltZXN0YW1wKCk7XG4gICAgcmV0dXJuIFsgZS5zZWNvbmRzLCBlLm5hbm9zZWNvbmRzIF07XG59XG5cbmZ1bmN0aW9uIHZpKHQpIHtcbiAgICBjb25zdCBlID0gbmV3IHV0KHRbMF0sIHRbMV0pO1xuICAgIHJldHVybiBjdC5mcm9tVGltZXN0YW1wKGUpO1xufVxuXG5mdW5jdGlvbiBTaSh0KSB7XG4gICAgY29uc3QgZSA9IHQudG9UaW1lc3RhbXAoKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBzZWNvbmRzOiBlLnNlY29uZHMsXG4gICAgICAgIG5hbm9zZWNvbmRzOiBlLm5hbm9zZWNvbmRzXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gRGkodCkge1xuICAgIGNvbnN0IGUgPSBuZXcgdXQodC5zZWNvbmRzLCB0Lm5hbm9zZWNvbmRzKTtcbiAgICByZXR1cm4gY3QuZnJvbVRpbWVzdGFtcChlKTtcbn1cblxuLyoqIEVuY29kZXMgYSBiYXRjaCBvZiBtdXRhdGlvbnMgaW50byBhIERiTXV0YXRpb25CYXRjaCBmb3IgbG9jYWwgc3RvcmFnZS4gKi9cbi8qKiBEZWNvZGVzIGEgRGJNdXRhdGlvbkJhdGNoIGludG8gYSBNdXRhdGlvbkJhdGNoICovXG5mdW5jdGlvbiBDaSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IChlLmJhc2VNdXRhdGlvbnMgfHwgW10pLm1hcCgoZSA9PiBFcyh0Lkp0LCBlKSkpO1xuICAgIC8vIFNxdWFzaCBvbGQgdHJhbnNmb3JtIG11dGF0aW9ucyBpbnRvIGV4aXN0aW5nIHBhdGNoIG9yIHNldCBtdXRhdGlvbnMuXG4gICAgLy8gVGhlIHJlcGxhY2VtZW50IG9mIHJlcHJlc2VudGluZyBgdHJhbnNmb3Jtc2Agd2l0aCBgdXBkYXRlX3RyYW5zZm9ybXNgXG4gICAgLy8gb24gdGhlIFNESyBtZWFucyB0aGF0IG9sZCBgdHJhbnNmb3JtYCBtdXRhdGlvbnMgc3RvcmVkIGluIEluZGV4ZWREQiBuZWVkXG4gICAgLy8gdG8gYmUgdXBkYXRlZCB0byBgdXBkYXRlX3RyYW5zZm9ybXNgLlxuICAgIC8vIFRPRE8oYi8xNzQ2MDgzNzQpOiBSZW1vdmUgdGhpcyBjb2RlIG9uY2Ugd2UgcGVyZm9ybSBhIHNjaGVtYSBtaWdyYXRpb24uXG4gICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgZS5tdXRhdGlvbnMubGVuZ3RoIC0gMTsgKyt0KSB7XG4gICAgICAgIGNvbnN0IG4gPSBlLm11dGF0aW9uc1t0XTtcbiAgICAgICAgaWYgKHQgKyAxIDwgZS5tdXRhdGlvbnMubGVuZ3RoICYmIHZvaWQgMCAhPT0gZS5tdXRhdGlvbnNbdCArIDFdLnRyYW5zZm9ybSkge1xuICAgICAgICAgICAgY29uc3QgcyA9IGUubXV0YXRpb25zW3QgKyAxXTtcbiAgICAgICAgICAgIG4udXBkYXRlVHJhbnNmb3JtcyA9IHMudHJhbnNmb3JtLmZpZWxkVHJhbnNmb3JtcywgZS5tdXRhdGlvbnMuc3BsaWNlKHQgKyAxLCAxKSwgXG4gICAgICAgICAgICArK3Q7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcyA9IGUubXV0YXRpb25zLm1hcCgoZSA9PiBFcyh0Lkp0LCBlKSkpLCBpID0gdXQuZnJvbU1pbGxpcyhlLmxvY2FsV3JpdGVUaW1lTXMpO1xuICAgIHJldHVybiBuZXcgSWkoZS5iYXRjaElkLCBpLCBuLCBzKTtcbn1cblxuLyoqIERlY29kZXMgYSBEYlRhcmdldCBpbnRvIFRhcmdldERhdGEgKi8gZnVuY3Rpb24geGkodCkge1xuICAgIGNvbnN0IGUgPSBEaSh0LnJlYWRUaW1lKSwgbiA9IHZvaWQgMCAhPT0gdC5sYXN0TGltYm9GcmVlU25hcHNob3RWZXJzaW9uID8gRGkodC5sYXN0TGltYm9GcmVlU25hcHNob3RWZXJzaW9uKSA6IGN0Lm1pbigpO1xuICAgIGxldCBzO1xuICAgIHZhciBpO1xuICAgIHJldHVybiB2b2lkIDAgIT09IHQucXVlcnkuZG9jdW1lbnRzID8gKHEoMSA9PT0gKGkgPSB0LnF1ZXJ5KS5kb2N1bWVudHMubGVuZ3RoKSwgXG4gICAgcyA9ICRlKERlKF9zKGkuZG9jdW1lbnRzWzBdKSkpKSA6IHMgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgIHJldHVybiAkZShQcyh0KSk7XG4gICAgfSh0LnF1ZXJ5KSwgbmV3IEFpKHMsIHQudGFyZ2V0SWQsIDAgLyogTGlzdGVuICovICwgdC5sYXN0TGlzdGVuU2VxdWVuY2VOdW1iZXIsIGUsIG4sIHB0LmZyb21CYXNlNjRTdHJpbmcodC5yZXN1bWVUb2tlbikpO1xufVxuXG4vKiogRW5jb2RlcyBUYXJnZXREYXRhIGludG8gYSBEYlRhcmdldCBmb3Igc3RvcmFnZSBsb2NhbGx5LiAqLyBmdW5jdGlvbiBOaSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IFNpKGUuc25hcHNob3RWZXJzaW9uKSwgcyA9IFNpKGUubGFzdExpbWJvRnJlZVNuYXBzaG90VmVyc2lvbik7XG4gICAgbGV0IGk7XG4gICAgaSA9IGZlKGUudGFyZ2V0KSA/IFJzKHQuSnQsIGUudGFyZ2V0KSA6IGJzKHQuSnQsIGUudGFyZ2V0KTtcbiAgICAvLyBXZSBjYW4ndCBzdG9yZSB0aGUgcmVzdW1lVG9rZW4gYXMgYSBCeXRlU3RyaW5nIGluIEluZGV4ZWREYiwgc28gd2VcbiAgICAvLyBjb252ZXJ0IGl0IHRvIGEgYmFzZTY0IHN0cmluZyBmb3Igc3RvcmFnZS5cbiAgICAgICAgY29uc3QgciA9IGUucmVzdW1lVG9rZW4udG9CYXNlNjQoKTtcbiAgICAvLyBsYXN0TGlzdGVuU2VxdWVuY2VOdW1iZXIgaXMgYWx3YXlzIDAgdW50aWwgd2UgZG8gcmVhbCBHQy5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0SWQ6IGUudGFyZ2V0SWQsXG4gICAgICAgIGNhbm9uaWNhbElkOiBjZShlLnRhcmdldCksXG4gICAgICAgIHJlYWRUaW1lOiBuLFxuICAgICAgICByZXN1bWVUb2tlbjogcixcbiAgICAgICAgbGFzdExpc3RlblNlcXVlbmNlTnVtYmVyOiBlLnNlcXVlbmNlTnVtYmVyLFxuICAgICAgICBsYXN0TGltYm9GcmVlU25hcHNob3RWZXJzaW9uOiBzLFxuICAgICAgICBxdWVyeTogaVxuICAgIH07XG59XG5cbi8qKlxuICogQSBoZWxwZXIgZnVuY3Rpb24gZm9yIGZpZ3VyaW5nIG91dCB3aGF0IGtpbmQgb2YgcXVlcnkgaGFzIGJlZW4gc3RvcmVkLlxuICovXG4vKipcbiAqIEVuY29kZXMgYSBgQnVuZGxlZFF1ZXJ5YCBmcm9tIGJ1bmRsZSBwcm90byB0byBhIFF1ZXJ5IG9iamVjdC5cbiAqXG4gKiBUaGlzIHJlY29uc3RydWN0cyB0aGUgb3JpZ2luYWwgcXVlcnkgdXNlZCB0byBidWlsZCB0aGUgYnVuZGxlIGJlaW5nIGxvYWRlZCxcbiAqIGluY2x1ZGluZyBmZWF0dXJlcyBleGlzdHMgb25seSBpbiBTREtzIChmb3IgZXhhbXBsZTogbGltaXQtdG8tbGFzdCkuXG4gKi9cbmZ1bmN0aW9uIGtpKHQpIHtcbiAgICBjb25zdCBlID0gUHMoe1xuICAgICAgICBwYXJlbnQ6IHQucGFyZW50LFxuICAgICAgICBzdHJ1Y3R1cmVkUXVlcnk6IHQuc3RydWN0dXJlZFF1ZXJ5XG4gICAgfSk7XG4gICAgcmV0dXJuIFwiTEFTVFwiID09PSB0LmxpbWl0VHlwZSA/IEZlKGUsIGUubGltaXQsIFwiTFwiIC8qIExhc3QgKi8pIDogZTtcbn1cblxuLyoqIEVuY29kZXMgYSBOYW1lZFF1ZXJ5IHByb3RvIG9iamVjdCB0byBhIE5hbWVkUXVlcnkgbW9kZWwgb2JqZWN0LiAqL1xuLyoqIEVuY29kZXMgYSBEYkRvY3VtZW50T3ZlcmxheSBvYmplY3QgdG8gYW4gT3ZlcmxheSBtb2RlbCBvYmplY3QuICovXG5mdW5jdGlvbiBNaSh0LCBlKSB7XG4gICAgcmV0dXJuIG5ldyBFaShlLmxhcmdlc3RCYXRjaElkLCBFcyh0Lkp0LCBlLm92ZXJsYXlNdXRhdGlvbikpO1xufVxuXG4vKiogRGVjb2RlcyBhbiBPdmVybGF5IG1vZGVsIG9iamVjdCBpbnRvIGEgRGJEb2N1bWVudE92ZXJsYXkgb2JqZWN0LiAqL1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBEYkRvY3VtZW50T3ZlcmxheUtleSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiB1c2VyIGFuZFxuICogZG9jdW1lbnQga2V5LlxuICovXG5mdW5jdGlvbiBPaSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IGUucGF0aC5sYXN0U2VnbWVudCgpO1xuICAgIHJldHVybiBbIHQsICRzKGUucGF0aC5wb3BMYXN0KCkpLCBuIF07XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5jbGFzcyAkaSB7XG4gICAgZ2V0QnVuZGxlTWV0YWRhdGEodCwgZSkge1xuICAgICAgICByZXR1cm4gRmkodCkuZ2V0KGUpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgaWYgKHQpIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaWQ6IChlID0gdCkuYnVuZGxlSWQsXG4gICAgICAgICAgICAgICAgY3JlYXRlVGltZTogRGkoZS5jcmVhdGVUaW1lKSxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiBlLnZlcnNpb25cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvKiogRW5jb2RlcyBhIERiQnVuZGxlIHRvIGEgQnVuZGxlTWV0YWRhdGEgb2JqZWN0LiAqL1xuICAgICAgICAgICAgdmFyIGU7XG4gICAgICAgICAgICAvKiogRW5jb2RlcyBhIEJ1bmRsZU1ldGFkYXRhIHRvIGEgRGJCdW5kbGUuICovICAgICAgICB9KSk7XG4gICAgfVxuICAgIHNhdmVCdW5kbGVNZXRhZGF0YSh0LCBlKSB7XG4gICAgICAgIHJldHVybiBGaSh0KS5wdXQoe1xuICAgICAgICAgICAgYnVuZGxlSWQ6IChuID0gZSkuaWQsXG4gICAgICAgICAgICBjcmVhdGVUaW1lOiBTaSh1cyhuLmNyZWF0ZVRpbWUpKSxcbiAgICAgICAgICAgIHZlcnNpb246IG4udmVyc2lvblxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIG47XG4gICAgICAgIC8qKiBFbmNvZGVzIGEgRGJOYW1lZFF1ZXJ5IHRvIGEgTmFtZWRRdWVyeS4gKi8gICAgfVxuICAgIGdldE5hbWVkUXVlcnkodCwgZSkge1xuICAgICAgICByZXR1cm4gQmkodCkuZ2V0KGUpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgaWYgKHQpIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogKGUgPSB0KS5uYW1lLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiBraShlLmJ1bmRsZWRRdWVyeSksXG4gICAgICAgICAgICAgICAgcmVhZFRpbWU6IERpKGUucmVhZFRpbWUpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIGU7XG4gICAgICAgICAgICAvKiogRW5jb2RlcyBhIE5hbWVkUXVlcnkgZnJvbSBhIGJ1bmRsZSBwcm90byB0byBhIERiTmFtZWRRdWVyeS4gKi8gICAgICAgIH0pKTtcbiAgICB9XG4gICAgc2F2ZU5hbWVkUXVlcnkodCwgZSkge1xuICAgICAgICByZXR1cm4gQmkodCkucHV0KGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogdC5uYW1lLFxuICAgICAgICAgICAgICAgIHJlYWRUaW1lOiBTaSh1cyh0LnJlYWRUaW1lKSksXG4gICAgICAgICAgICAgICAgYnVuZGxlZFF1ZXJ5OiB0LmJ1bmRsZWRRdWVyeVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfShlKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEhlbHBlciB0byBnZXQgYSB0eXBlZCBTaW1wbGVEYlN0b3JlIGZvciB0aGUgYnVuZGxlcyBvYmplY3Qgc3RvcmUuXG4gKi8gZnVuY3Rpb24gRmkodCkge1xuICAgIHJldHVybiBwaSh0LCBcImJ1bmRsZXNcIik7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGdldCBhIHR5cGVkIFNpbXBsZURiU3RvcmUgZm9yIHRoZSBuYW1lZFF1ZXJpZXMgb2JqZWN0IHN0b3JlLlxuICovIGZ1bmN0aW9uIEJpKHQpIHtcbiAgICByZXR1cm4gcGkodCwgXCJuYW1lZFF1ZXJpZXNcIik7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIERvY3VtZW50T3ZlcmxheUNhY2hlIHVzaW5nIEluZGV4ZWREYi5cbiAqLyBjbGFzcyBMaSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHNlcmlhbGl6ZXIgLSBUaGUgZG9jdW1lbnQgc2VyaWFsaXplci5cbiAgICAgKiBAcGFyYW0gdXNlcklkIC0gVGhlIHVzZXJJZCBmb3Igd2hpY2ggd2UgYXJlIGFjY2Vzc2luZyBvdmVybGF5cy5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMuTSA9IHQsIHRoaXMudXNlcklkID0gZTtcbiAgICB9XG4gICAgc3RhdGljIFl0KHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IGUudWlkIHx8IFwiXCI7XG4gICAgICAgIHJldHVybiBuZXcgTGkodCwgbik7XG4gICAgfVxuICAgIGdldE92ZXJsYXkodCwgZSkge1xuICAgICAgICByZXR1cm4gcWkodCkuZ2V0KE9pKHRoaXMudXNlcklkLCBlKSkubmV4dCgodCA9PiB0ID8gTWkodGhpcy5NLCB0KSA6IG51bGwpKTtcbiAgICB9XG4gICAgc2F2ZU92ZXJsYXlzKHQsIGUsIG4pIHtcbiAgICAgICAgY29uc3QgcyA9IFtdO1xuICAgICAgICByZXR1cm4gbi5mb3JFYWNoKCgobiwgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgciA9IG5ldyBFaShlLCBpKTtcbiAgICAgICAgICAgIHMucHVzaCh0aGlzLlh0KHQsIHIpKTtcbiAgICAgICAgfSkpLCB1aS53YWl0Rm9yKHMpO1xuICAgIH1cbiAgICByZW1vdmVPdmVybGF5c0ZvckJhdGNoSWQodCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gbmV3IFNldDtcbiAgICAgICAgLy8gR2V0IHRoZSBzZXQgb2YgdW5pcXVlIGNvbGxlY3Rpb24gcGF0aHMuXG4gICAgICAgICAgICAgICAgZS5mb3JFYWNoKCh0ID0+IHMuYWRkKCRzKHQuZ2V0Q29sbGVjdGlvblBhdGgoKSkpKSk7XG4gICAgICAgIGNvbnN0IGkgPSBbXTtcbiAgICAgICAgcmV0dXJuIHMuZm9yRWFjaCgoZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzID0gSURCS2V5UmFuZ2UuYm91bmQoWyB0aGlzLnVzZXJJZCwgZSwgbiBdLCBbIHRoaXMudXNlcklkLCBlLCBuICsgMSBdLCBcbiAgICAgICAgICAgIC8qbG93ZXJPcGVuPSovICExLCBcbiAgICAgICAgICAgIC8qdXBwZXJPcGVuPSovICEwKTtcbiAgICAgICAgICAgIGkucHVzaChxaSh0KS5RdChcImNvbGxlY3Rpb25QYXRoT3ZlcmxheUluZGV4XCIsIHMpKTtcbiAgICAgICAgfSkpLCB1aS53YWl0Rm9yKGkpO1xuICAgIH1cbiAgICBnZXRPdmVybGF5c0ZvckNvbGxlY3Rpb24odCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gcW4oKSwgaSA9ICRzKGUpLCByID0gSURCS2V5UmFuZ2UuYm91bmQoWyB0aGlzLnVzZXJJZCwgaSwgbiBdLCBbIHRoaXMudXNlcklkLCBpLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgXSwgXG4gICAgICAgIC8qbG93ZXJPcGVuPSovICEwKTtcbiAgICAgICAgcmV0dXJuIHFpKHQpLlV0KFwiY29sbGVjdGlvblBhdGhPdmVybGF5SW5kZXhcIiwgcikubmV4dCgodCA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBNaSh0aGlzLk0sIGUpO1xuICAgICAgICAgICAgICAgIHMuc2V0KHQuZ2V0S2V5KCksIHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgZ2V0T3ZlcmxheXNGb3JDb2xsZWN0aW9uR3JvdXAodCwgZSwgbiwgcykge1xuICAgICAgICBjb25zdCBpID0gcW4oKTtcbiAgICAgICAgbGV0IHI7XG4gICAgICAgIC8vIFdlIHdhbnQgYmF0Y2ggSURzIGxhcmdlciB0aGFuIGBzaW5jZUJhdGNoSWRgLCBhbmQgc28gdGhlIGxvd2VyIGJvdW5kXG4gICAgICAgIC8vIGlzIG5vdCBpbmNsdXNpdmUuXG4gICAgICAgICAgICAgICAgY29uc3QgbyA9IElEQktleVJhbmdlLmJvdW5kKFsgdGhpcy51c2VySWQsIGUsIG4gXSwgWyB0aGlzLnVzZXJJZCwgZSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIF0sIFxuICAgICAgICAvKmxvd2VyT3Blbj0qLyAhMCk7XG4gICAgICAgIHJldHVybiBxaSh0KS5XdCh7XG4gICAgICAgICAgICBpbmRleDogXCJjb2xsZWN0aW9uR3JvdXBPdmVybGF5SW5kZXhcIixcbiAgICAgICAgICAgIHJhbmdlOiBvXG4gICAgICAgIH0sICgodCwgZSwgbikgPT4ge1xuICAgICAgICAgICAgLy8gV2UgZG8gbm90IHdhbnQgdG8gcmV0dXJuIHBhcnRpYWwgYmF0Y2ggb3ZlcmxheXMsIGV2ZW4gaWYgdGhlIHNpemVcbiAgICAgICAgICAgIC8vIG9mIHRoZSByZXN1bHQgc2V0IGV4Y2VlZHMgdGhlIGdpdmVuIGBjb3VudGAgYXJndW1lbnQuIFRoZXJlZm9yZSwgd2VcbiAgICAgICAgICAgIC8vIGNvbnRpbnVlIHRvIGFnZ3JlZ2F0ZSByZXN1bHRzIGV2ZW4gYWZ0ZXIgdGhlIHJlc3VsdCBzaXplIGV4Y2VlZHNcbiAgICAgICAgICAgIC8vIGBjb3VudGAgaWYgdGhlcmUgYXJlIG1vcmUgb3ZlcmxheXMgZnJvbSB0aGUgYGN1cnJlbnRCYXRjaElkYC5cbiAgICAgICAgICAgIGNvbnN0IG8gPSBNaSh0aGlzLk0sIGUpO1xuICAgICAgICAgICAgaS5zaXplKCkgPCBzIHx8IG8ubGFyZ2VzdEJhdGNoSWQgPT09IHIgPyAoaS5zZXQoby5nZXRLZXkoKSwgbyksIHIgPSBvLmxhcmdlc3RCYXRjaElkKSA6IG4uZG9uZSgpO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4gaSkpO1xuICAgIH1cbiAgICBYdCh0LCBlKSB7XG4gICAgICAgIHJldHVybiBxaSh0KS5wdXQoZnVuY3Rpb24odCwgZSwgbikge1xuICAgICAgICAgICAgY29uc3QgW3MsIGksIHJdID0gT2koZSwgbi5tdXRhdGlvbi5rZXkpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1c2VySWQ6IGUsXG4gICAgICAgICAgICAgICAgY29sbGVjdGlvblBhdGg6IGksXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRJZDogcixcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uR3JvdXA6IG4ubXV0YXRpb24ua2V5LmdldENvbGxlY3Rpb25Hcm91cCgpLFxuICAgICAgICAgICAgICAgIGxhcmdlc3RCYXRjaElkOiBuLmxhcmdlc3RCYXRjaElkLFxuICAgICAgICAgICAgICAgIG92ZXJsYXlNdXRhdGlvbjogVHModC5KdCwgbi5tdXRhdGlvbilcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0odGhpcy5NLCB0aGlzLnVzZXJJZCwgZSkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gZ2V0IGEgdHlwZWQgU2ltcGxlRGJTdG9yZSBmb3IgdGhlIGRvY3VtZW50IG92ZXJsYXkgb2JqZWN0IHN0b3JlLlxuICovIGZ1bmN0aW9uIHFpKHQpIHtcbiAgICByZXR1cm4gcGkodCwgXCJkb2N1bWVudE92ZXJsYXlzXCIpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLy8gTm90ZTogVGhpcyBjb2RlIGlzIGNvcGllZCBmcm9tIHRoZSBiYWNrZW5kLiBDb2RlIHRoYXQgaXMgbm90IHVzZWQgYnlcbi8vIEZpcmVzdG9yZSB3YXMgcmVtb3ZlZC5cbi8qKiBGaXJlc3RvcmUgaW5kZXggdmFsdWUgd3JpdGVyLiAgKi9cbmNsYXNzIFVpIHtcbiAgICBjb25zdHJ1Y3RvcigpIHt9XG4gICAgLy8gVGhlIHdyaXRlIG1ldGhvZHMgYmVsb3cgc2hvcnQtY2lyY3VpdCB3cml0aW5nIHRlcm1pbmF0b3JzIGZvciB2YWx1ZXNcbiAgICAvLyBjb250YWluaW5nIGEgKHRlcm1pbmF0aW5nKSB0cnVuY2F0ZWQgdmFsdWUuXG4gICAgLy8gQXMgYW4gZXhhbXBsZSwgY29uc2lkZXIgdGhlIHJlc3VsdGluZyBlbmNvZGluZyBmb3I6XG4gICAgLy8gW1wiYmFyXCIsIFsyLCBcImZvb1wiXV0gLT4gKFNUUklORywgXCJiYXJcIiwgVEVSTSwgQVJSQVksIE5VTUJFUiwgMiwgU1RSSU5HLCBcImZvb1wiLCBURVJNLCBURVJNLCBURVJNKVxuICAgIC8vIFtcImJhclwiLCBbMiwgdHJ1bmNhdGVkKFwiZm9vXCIpXV0gLT4gKFNUUklORywgXCJiYXJcIiwgVEVSTSwgQVJSQVksIE5VTUJFUiwgMiwgU1RSSU5HLCBcImZvb1wiLCBUUlVOQylcbiAgICAvLyBbXCJiYXJcIiwgdHJ1bmNhdGVkKFtcImZvb1wiXSldIC0+IChTVFJJTkcsIFwiYmFyXCIsIFRFUk0sIEFSUkFZLiBTVFJJTkcsIFwiZm9vXCIsIFRFUk0sIFRSVU5DKVxuICAgIC8qKiBXcml0ZXMgYW4gaW5kZXggdmFsdWUuICAqL1xuICAgIFp0KHQsIGUpIHtcbiAgICAgICAgdGhpcy50ZSh0LCBlKSwgXG4gICAgICAgIC8vIFdyaXRlIHNlcGFyYXRvciB0byBzcGxpdCBpbmRleCB2YWx1ZXNcbiAgICAgICAgLy8gKHNlZSBnby9maXJlc3RvcmUtc3RvcmFnZS1mb3JtYXQjZW5jb2RpbmdzKS5cbiAgICAgICAgZS5lZSgpO1xuICAgIH1cbiAgICB0ZSh0LCBlKSB7XG4gICAgICAgIGlmIChcIm51bGxWYWx1ZVwiIGluIHQpIHRoaXMubmUoZSwgNSk7IGVsc2UgaWYgKFwiYm9vbGVhblZhbHVlXCIgaW4gdCkgdGhpcy5uZShlLCAxMCksIFxuICAgICAgICBlLnNlKHQuYm9vbGVhblZhbHVlID8gMSA6IDApOyBlbHNlIGlmIChcImludGVnZXJWYWx1ZVwiIGluIHQpIHRoaXMubmUoZSwgMTUpLCBlLnNlKEV0KHQuaW50ZWdlclZhbHVlKSk7IGVsc2UgaWYgKFwiZG91YmxlVmFsdWVcIiBpbiB0KSB7XG4gICAgICAgICAgICBjb25zdCBuID0gRXQodC5kb3VibGVWYWx1ZSk7XG4gICAgICAgICAgICBpc05hTihuKSA/IHRoaXMubmUoZSwgMTMpIDogKHRoaXMubmUoZSwgMTUpLCBEdChuKSA/IFxuICAgICAgICAgICAgLy8gLTAuMCwgMCBhbmQgMC4wIGFyZSBhbGwgY29uc2lkZXJlZCB0aGUgc2FtZVxuICAgICAgICAgICAgZS5zZSgwKSA6IGUuc2UobikpO1xuICAgICAgICB9IGVsc2UgaWYgKFwidGltZXN0YW1wVmFsdWVcIiBpbiB0KSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdC50aW1lc3RhbXBWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMubmUoZSwgMjApLCBcInN0cmluZ1wiID09IHR5cGVvZiBuID8gZS5pZShuKSA6IChlLmllKGAke24uc2Vjb25kcyB8fCBcIlwifWApLCBlLnNlKG4ubmFub3MgfHwgMCkpO1xuICAgICAgICB9IGVsc2UgaWYgKFwic3RyaW5nVmFsdWVcIiBpbiB0KSB0aGlzLnJlKHQuc3RyaW5nVmFsdWUsIGUpLCB0aGlzLm9lKGUpOyBlbHNlIGlmIChcImJ5dGVzVmFsdWVcIiBpbiB0KSB0aGlzLm5lKGUsIDMwKSwgXG4gICAgICAgIGUuYWUoQXQodC5ieXRlc1ZhbHVlKSksIHRoaXMub2UoZSk7IGVsc2UgaWYgKFwicmVmZXJlbmNlVmFsdWVcIiBpbiB0KSB0aGlzLnVlKHQucmVmZXJlbmNlVmFsdWUsIGUpOyBlbHNlIGlmIChcImdlb1BvaW50VmFsdWVcIiBpbiB0KSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdC5nZW9Qb2ludFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5uZShlLCA0NSksIGUuc2Uobi5sYXRpdHVkZSB8fCAwKSwgZS5zZShuLmxvbmdpdHVkZSB8fCAwKTtcbiAgICAgICAgfSBlbHNlIFwibWFwVmFsdWVcIiBpbiB0ID8gSHQodCkgPyB0aGlzLm5lKGUsIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSA6ICh0aGlzLmNlKHQubWFwVmFsdWUsIGUpLCBcbiAgICAgICAgdGhpcy5vZShlKSkgOiBcImFycmF5VmFsdWVcIiBpbiB0ID8gKHRoaXMuaGUodC5hcnJheVZhbHVlLCBlKSwgdGhpcy5vZShlKSkgOiBMKCk7XG4gICAgfVxuICAgIHJlKHQsIGUpIHtcbiAgICAgICAgdGhpcy5uZShlLCAyNSksIHRoaXMubGUodCwgZSk7XG4gICAgfVxuICAgIGxlKHQsIGUpIHtcbiAgICAgICAgZS5pZSh0KTtcbiAgICB9XG4gICAgY2UodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gdC5maWVsZHMgfHwge307XG4gICAgICAgIHRoaXMubmUoZSwgNTUpO1xuICAgICAgICBmb3IgKGNvbnN0IHQgb2YgT2JqZWN0LmtleXMobikpIHRoaXMucmUodCwgZSksIHRoaXMudGUoblt0XSwgZSk7XG4gICAgfVxuICAgIGhlKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IHQudmFsdWVzIHx8IFtdO1xuICAgICAgICB0aGlzLm5lKGUsIDUwKTtcbiAgICAgICAgZm9yIChjb25zdCB0IG9mIG4pIHRoaXMudGUodCwgZSk7XG4gICAgfVxuICAgIHVlKHQsIGUpIHtcbiAgICAgICAgdGhpcy5uZShlLCAzNyk7XG4gICAgICAgIHh0LmZyb21OYW1lKHQpLnBhdGguZm9yRWFjaCgodCA9PiB7XG4gICAgICAgICAgICB0aGlzLm5lKGUsIDYwKSwgdGhpcy5sZSh0LCBlKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBuZSh0LCBlKSB7XG4gICAgICAgIHQuc2UoZSk7XG4gICAgfVxuICAgIG9lKHQpIHtcbiAgICAgICAgLy8gV2hpbGUgdGhlIFNESyBkb2VzIG5vdCBpbXBsZW1lbnQgdHJ1bmNhdGlvbiwgdGhlIHRydW5jYXRpb24gbWFya2VyIGlzXG4gICAgICAgIC8vIHVzZWQgdG8gdGVybWluYXRlIGFsbCB2YXJpYWJsZSBsZW5ndGggdmFsdWVzICh3aGljaCBhcmUgc3RyaW5ncywgYnl0ZXMsXG4gICAgICAgIC8vIHJlZmVyZW5jZXMsIGFycmF5cyBhbmQgbWFwcykuXG4gICAgICAgIHQuc2UoMik7XG4gICAgfVxufVxuXG5VaS5mZSA9IG5ldyBVaTtcblxuLyoqXG4gKiBDb3VudHMgdGhlIG51bWJlciBvZiB6ZXJvcyBpbiBhIGJ5dGUuXG4gKlxuICogVmlzaWJsZSBmb3IgdGVzdGluZy5cbiAqL1xuZnVuY3Rpb24gS2kodCkge1xuICAgIGlmICgwID09PSB0KSByZXR1cm4gODtcbiAgICBsZXQgZSA9IDA7XG4gICAgcmV0dXJuIHQgPj4gNCA9PSAwICYmIChcbiAgICAvLyBUZXN0IGlmIHRoZSBmaXJzdCBmb3VyIGJpdHMgYXJlIHplcm8uXG4gICAgZSArPSA0LCB0IDw8PSA0KSwgdCA+PiA2ID09IDAgJiYgKFxuICAgIC8vIFRlc3QgaWYgdGhlIGZpcnN0IHR3byAob3IgbmV4dCB0d28pIGJpdHMgYXJlIHplcm8uXG4gICAgZSArPSAyLCB0IDw8PSAyKSwgdCA+PiA3ID09IDAgJiYgKFxuICAgIC8vIFRlc3QgaWYgdGhlIHJlbWFpbmluZyBiaXQgaXMgemVyby5cbiAgICBlICs9IDEpLCBlO1xufVxuXG4vKiogQ291bnRzIHRoZSBudW1iZXIgb2YgbGVhZGluZyB6ZXJvcyBpbiB0aGUgZ2l2ZW4gYnl0ZSBhcnJheS4gKi9cbi8qKlxuICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIHN0b3JlIFwidmFsdWVcIi4gTGVhZGluZyB6ZXJvIGJ5dGVzXG4gKiBhcmUgc2tpcHBlZC5cbiAqL1xuZnVuY3Rpb24gR2kodCkge1xuICAgIC8vIFRoaXMgaXMganVzdCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGZvciB0aGUgdW5zaWduZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIG51bWJlci5cbiAgICBjb25zdCBlID0gNjQgLSBmdW5jdGlvbih0KSB7XG4gICAgICAgIGxldCBlID0gMDtcbiAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCA4OyArK24pIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBLaSgyNTUgJiB0W25dKTtcbiAgICAgICAgICAgIGlmIChlICs9IHMsIDggIT09IHMpIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlO1xuICAgIH0odCk7XG4gICAgcmV0dXJuIE1hdGguY2VpbChlIC8gOCk7XG59XG5cbi8qKlxuICogT3JkZXJlZENvZGVXcml0ZXIgaXMgYSBtaW5pbWFsLWFsbG9jYXRpb24gaW1wbGVtZW50YXRpb24gb2YgdGhlIHdyaXRpbmdcbiAqIGJlaGF2aW9yIGRlZmluZWQgYnkgdGhlIGJhY2tlbmQuXG4gKlxuICogVGhlIGNvZGUgaXMgcG9ydGVkIGZyb20gaXRzIEphdmEgY291bnRlcnBhcnQuXG4gKi8gY2xhc3MgUWkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDEwMjQpLCB0aGlzLnBvc2l0aW9uID0gMDtcbiAgICB9XG4gICAgZGUodCkge1xuICAgICAgICBjb25zdCBlID0gdFtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICAgIGxldCBuID0gZS5uZXh0KCk7XG4gICAgICAgIGZvciAoOyFuLmRvbmU7ICkgdGhpcy5fZShuLnZhbHVlKSwgbiA9IGUubmV4dCgpO1xuICAgICAgICB0aGlzLndlKCk7XG4gICAgfVxuICAgIG1lKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHRbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgICBsZXQgbiA9IGUubmV4dCgpO1xuICAgICAgICBmb3IgKDshbi5kb25lOyApIHRoaXMuZ2Uobi52YWx1ZSksIG4gPSBlLm5leHQoKTtcbiAgICAgICAgdGhpcy55ZSgpO1xuICAgIH1cbiAgICAvKiogV3JpdGVzIHV0ZjggYnl0ZXMgaW50byB0aGlzIGJ5dGUgc2VxdWVuY2UsIGFzY2VuZGluZy4gKi8gICAgcGUodCkge1xuICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdCkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGUuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICAgIGlmICh0IDwgMTI4KSB0aGlzLl9lKHQpOyBlbHNlIGlmICh0IDwgMjA0OCkgdGhpcy5fZSg5NjAgfCB0ID4+PiA2KSwgdGhpcy5fZSgxMjggfCA2MyAmIHQpOyBlbHNlIGlmIChlIDwgXCJcXHVkODAwXCIgfHwgXCJcXHVkYmZmXCIgPCBlKSB0aGlzLl9lKDQ4MCB8IHQgPj4+IDEyKSwgXG4gICAgICAgICAgICB0aGlzLl9lKDEyOCB8IDYzICYgdCA+Pj4gNiksIHRoaXMuX2UoMTI4IHwgNjMgJiB0KTsgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IGUuY29kZVBvaW50QXQoMCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZSgyNDAgfCB0ID4+PiAxOCksIHRoaXMuX2UoMTI4IHwgNjMgJiB0ID4+PiAxMiksIHRoaXMuX2UoMTI4IHwgNjMgJiB0ID4+PiA2KSwgXG4gICAgICAgICAgICAgICAgdGhpcy5fZSgxMjggfCA2MyAmIHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMud2UoKTtcbiAgICB9XG4gICAgLyoqIFdyaXRlcyB1dGY4IGJ5dGVzIGludG8gdGhpcyBieXRlIHNlcXVlbmNlLCBkZXNjZW5kaW5nICovICAgIEllKHQpIHtcbiAgICAgICAgZm9yIChjb25zdCBlIG9mIHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBlLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICBpZiAodCA8IDEyOCkgdGhpcy5nZSh0KTsgZWxzZSBpZiAodCA8IDIwNDgpIHRoaXMuZ2UoOTYwIHwgdCA+Pj4gNiksIHRoaXMuZ2UoMTI4IHwgNjMgJiB0KTsgZWxzZSBpZiAoZSA8IFwiXFx1ZDgwMFwiIHx8IFwiXFx1ZGJmZlwiIDwgZSkgdGhpcy5nZSg0ODAgfCB0ID4+PiAxMiksIFxuICAgICAgICAgICAgdGhpcy5nZSgxMjggfCA2MyAmIHQgPj4+IDYpLCB0aGlzLmdlKDEyOCB8IDYzICYgdCk7IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBlLmNvZGVQb2ludEF0KDApO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2UoMjQwIHwgdCA+Pj4gMTgpLCB0aGlzLmdlKDEyOCB8IDYzICYgdCA+Pj4gMTIpLCB0aGlzLmdlKDEyOCB8IDYzICYgdCA+Pj4gNiksIFxuICAgICAgICAgICAgICAgIHRoaXMuZ2UoMTI4IHwgNjMgJiB0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnllKCk7XG4gICAgfVxuICAgIFRlKHQpIHtcbiAgICAgICAgLy8gVmFsdWVzIGFyZSBlbmNvZGVkIHdpdGggYSBzaW5nbGUgYnl0ZSBsZW5ndGggcHJlZml4LCBmb2xsb3dlZCBieSB0aGVcbiAgICAgICAgLy8gYWN0dWFsIHZhbHVlIGluIGJpZy1lbmRpYW4gZm9ybWF0IHdpdGggbGVhZGluZyAwIGJ5dGVzIGRyb3BwZWQuXG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLkVlKHQpLCBuID0gR2koZSk7XG4gICAgICAgIHRoaXMuQWUoMSArIG4pLCB0aGlzLmJ1ZmZlclt0aGlzLnBvc2l0aW9uKytdID0gMjU1ICYgbjtcbiAgICAgICAgLy8gV3JpdGUgdGhlIGxlbmd0aFxuICAgICAgICBmb3IgKGxldCB0ID0gZS5sZW5ndGggLSBuOyB0IDwgZS5sZW5ndGg7ICsrdCkgdGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbisrXSA9IDI1NSAmIGVbdF07XG4gICAgfVxuICAgIFJlKHQpIHtcbiAgICAgICAgLy8gVmFsdWVzIGFyZSBlbmNvZGVkIHdpdGggYSBzaW5nbGUgYnl0ZSBsZW5ndGggcHJlZml4LCBmb2xsb3dlZCBieSB0aGVcbiAgICAgICAgLy8gaW52ZXJ0ZWQgdmFsdWUgaW4gYmlnLWVuZGlhbiBmb3JtYXQgd2l0aCBsZWFkaW5nIDAgYnl0ZXMgZHJvcHBlZC5cbiAgICAgICAgY29uc3QgZSA9IHRoaXMuRWUodCksIG4gPSBHaShlKTtcbiAgICAgICAgdGhpcy5BZSgxICsgbiksIHRoaXMuYnVmZmVyW3RoaXMucG9zaXRpb24rK10gPSB+KDI1NSAmIG4pO1xuICAgICAgICAvLyBXcml0ZSB0aGUgbGVuZ3RoXG4gICAgICAgIGZvciAobGV0IHQgPSBlLmxlbmd0aCAtIG47IHQgPCBlLmxlbmd0aDsgKyt0KSB0aGlzLmJ1ZmZlclt0aGlzLnBvc2l0aW9uKytdID0gfigyNTUgJiBlW3RdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIHRoZSBcImluZmluaXR5XCIgYnl0ZSBzZXF1ZW5jZSB0aGF0IHNvcnRzIGFmdGVyIGFsbCBvdGhlciBieXRlXG4gICAgICogc2VxdWVuY2VzIHdyaXR0ZW4gaW4gYXNjZW5kaW5nIG9yZGVyLlxuICAgICAqLyAgICBiZSgpIHtcbiAgICAgICAgdGhpcy5QZSgyNTUpLCB0aGlzLlBlKDI1NSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyB0aGUgXCJpbmZpbml0eVwiIGJ5dGUgc2VxdWVuY2UgdGhhdCBzb3J0cyBiZWZvcmUgYWxsIG90aGVyIGJ5dGVcbiAgICAgKiBzZXF1ZW5jZXMgd3JpdHRlbiBpbiBkZXNjZW5kaW5nIG9yZGVyLlxuICAgICAqLyAgICBWZSgpIHtcbiAgICAgICAgdGhpcy52ZSgyNTUpLCB0aGlzLnZlKDI1NSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgYnVmZmVyIHN1Y2ggdGhhdCBpdCBpcyB0aGUgc2FtZSBhcyB3aGVuIGl0IHdhcyBuZXdseVxuICAgICAqIGNvbnN0cnVjdGVkLlxuICAgICAqLyAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IDA7XG4gICAgfVxuICAgIHNlZWQodCkge1xuICAgICAgICB0aGlzLkFlKHQubGVuZ3RoKSwgdGhpcy5idWZmZXIuc2V0KHQsIHRoaXMucG9zaXRpb24pLCB0aGlzLnBvc2l0aW9uICs9IHQubGVuZ3RoO1xuICAgIH1cbiAgICAvKiogTWFrZXMgYSBjb3B5IG9mIHRoZSBlbmNvZGVkIGJ5dGVzIGluIHRoaXMgYnVmZmVyLiAgKi8gICAgU2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5zbGljZSgwLCB0aGlzLnBvc2l0aW9uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5jb2RlcyBgdmFsYCBpbnRvIGFuIGVuY29kaW5nIHNvIHRoYXQgdGhlIG9yZGVyIG1hdGNoZXMgdGhlIElFRUUgNzU0XG4gICAgICogZmxvYXRpbmctcG9pbnQgY29tcGFyaXNvbiByZXN1bHRzIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb25zOlxuICAgICAqICAgLTAuMCA8IDAuMFxuICAgICAqICAgYWxsIG5vbi1OYU4gPCBOYU5cbiAgICAgKiAgIE5hTiA9IE5hTlxuICAgICAqLyAgICBFZSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBcbiAgICAgICAgLyoqIENvbnZlcnRzIGEgSmF2YVNjcmlwdCBudW1iZXIgdG8gYSBieXRlIGFycmF5ICh1c2luZyBiaWcgZW5kaWFuIGVuY29kaW5nKS4gKi9cbiAgICAgICAgZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoOCkpO1xuICAgICAgICAgICAgcmV0dXJuIGUuc2V0RmxvYXQ2NCgwLCB0LCAvKiBsaXR0bGVFbmRpYW49ICovICExKSwgbmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIpO1xuICAgICAgICB9KHQpLCBuID0gMCAhPSAoMTI4ICYgZVswXSk7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBmaXJzdCBiaXQgaXMgc2V0LiBXZSB1c2UgYSBiaXQgbWFzayBzaW5jZSB2YWx1ZVswXSBpc1xuICAgICAgICAvLyBlbmNvZGVkIGFzIGEgbnVtYmVyIGZyb20gMCB0byAyNTUuXG4gICAgICAgICAgICAgICAgLy8gUmV2ZXJ0IHRoZSB0d28gY29tcGxlbWVudCB0byBnZXQgbmF0dXJhbCBvcmRlcmluZ1xuICAgICAgICBlWzBdIF49IG4gPyAyNTUgOiAxMjg7XG4gICAgICAgIGZvciAobGV0IHQgPSAxOyB0IDwgZS5sZW5ndGg7ICsrdCkgZVt0XSBePSBuID8gMjU1IDogMDtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgfVxuICAgIC8qKiBXcml0ZXMgYSBzaW5nbGUgYnl0ZSBhc2NlbmRpbmcgdG8gdGhlIGJ1ZmZlci4gKi8gICAgX2UodCkge1xuICAgICAgICBjb25zdCBlID0gMjU1ICYgdDtcbiAgICAgICAgMCA9PT0gZSA/ICh0aGlzLlBlKDApLCB0aGlzLlBlKDI1NSkpIDogMjU1ID09PSBlID8gKHRoaXMuUGUoMjU1KSwgdGhpcy5QZSgwKSkgOiB0aGlzLlBlKGUpO1xuICAgIH1cbiAgICAvKiogV3JpdGVzIGEgc2luZ2xlIGJ5dGUgZGVzY2VuZGluZyB0byB0aGUgYnVmZmVyLiAgKi8gICAgZ2UodCkge1xuICAgICAgICBjb25zdCBlID0gMjU1ICYgdDtcbiAgICAgICAgMCA9PT0gZSA/ICh0aGlzLnZlKDApLCB0aGlzLnZlKDI1NSkpIDogMjU1ID09PSBlID8gKHRoaXMudmUoMjU1KSwgdGhpcy52ZSgwKSkgOiB0aGlzLnZlKHQpO1xuICAgIH1cbiAgICB3ZSgpIHtcbiAgICAgICAgdGhpcy5QZSgwKSwgdGhpcy5QZSgxKTtcbiAgICB9XG4gICAgeWUoKSB7XG4gICAgICAgIHRoaXMudmUoMCksIHRoaXMudmUoMSk7XG4gICAgfVxuICAgIFBlKHQpIHtcbiAgICAgICAgdGhpcy5BZSgxKSwgdGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbisrXSA9IHQ7XG4gICAgfVxuICAgIHZlKHQpIHtcbiAgICAgICAgdGhpcy5BZSgxKSwgdGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbisrXSA9IH50O1xuICAgIH1cbiAgICBBZSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0ICsgdGhpcy5wb3NpdGlvbjtcbiAgICAgICAgaWYgKGUgPD0gdGhpcy5idWZmZXIubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIC8vIFRyeSBkb3VibGluZy5cbiAgICAgICAgICAgICAgICBsZXQgbiA9IDIgKiB0aGlzLmJ1ZmZlci5sZW5ndGg7XG4gICAgICAgIC8vIFN0aWxsIG5vdCBiaWcgZW5vdWdoPyBKdXN0IGFsbG9jYXRlIHRoZSByaWdodCBzaXplLlxuICAgICAgICAgICAgICAgIG4gPCBlICYmIChuID0gZSk7XG4gICAgICAgIC8vIENyZWF0ZSB0aGUgbmV3IGJ1ZmZlci5cbiAgICAgICAgICAgICAgICBjb25zdCBzID0gbmV3IFVpbnQ4QXJyYXkobik7XG4gICAgICAgIHMuc2V0KHRoaXMuYnVmZmVyKSwgLy8gY29weSBvbGQgZGF0YVxuICAgICAgICB0aGlzLmJ1ZmZlciA9IHM7XG4gICAgfVxufVxuXG5jbGFzcyBqaSB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLkRlID0gdDtcbiAgICB9XG4gICAgYWUodCkge1xuICAgICAgICB0aGlzLkRlLmRlKHQpO1xuICAgIH1cbiAgICBpZSh0KSB7XG4gICAgICAgIHRoaXMuRGUucGUodCk7XG4gICAgfVxuICAgIHNlKHQpIHtcbiAgICAgICAgdGhpcy5EZS5UZSh0KTtcbiAgICB9XG4gICAgZWUoKSB7XG4gICAgICAgIHRoaXMuRGUuYmUoKTtcbiAgICB9XG59XG5cbmNsYXNzIFdpIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMuRGUgPSB0O1xuICAgIH1cbiAgICBhZSh0KSB7XG4gICAgICAgIHRoaXMuRGUubWUodCk7XG4gICAgfVxuICAgIGllKHQpIHtcbiAgICAgICAgdGhpcy5EZS5JZSh0KTtcbiAgICB9XG4gICAgc2UodCkge1xuICAgICAgICB0aGlzLkRlLlJlKHQpO1xuICAgIH1cbiAgICBlZSgpIHtcbiAgICAgICAgdGhpcy5EZS5WZSgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIGBEaXJlY3Rpb25hbEluZGV4Qnl0ZUVuY29kZXJgIHVzaW5nIGBPcmRlcmVkQ29kZVdyaXRlcmAgZm9yIHRoZVxuICogYWN0dWFsIGVuY29kaW5nLlxuICovIGNsYXNzIHppIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5EZSA9IG5ldyBRaSwgdGhpcy5DZSA9IG5ldyBqaSh0aGlzLkRlKSwgdGhpcy54ZSA9IG5ldyBXaSh0aGlzLkRlKTtcbiAgICB9XG4gICAgc2VlZCh0KSB7XG4gICAgICAgIHRoaXMuRGUuc2VlZCh0KTtcbiAgICB9XG4gICAgTmUodCkge1xuICAgICAgICByZXR1cm4gMCAvKiBBU0NFTkRJTkcgKi8gPT09IHQgPyB0aGlzLkNlIDogdGhpcy54ZTtcbiAgICB9XG4gICAgU2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkRlLlNlKCk7XG4gICAgfVxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLkRlLnJlc2V0KCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqIFJlcHJlc2VudHMgYW4gaW5kZXggZW50cnkgc2F2ZWQgYnkgdGhlIFNESyBpbiBwZXJzaXN0ZWQgc3RvcmFnZS4gKi8gY2xhc3MgSGkge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgdGhpcy5pbmRleElkID0gdCwgdGhpcy5kb2N1bWVudEtleSA9IGUsIHRoaXMuYXJyYXlWYWx1ZSA9IG4sIHRoaXMuZGlyZWN0aW9uYWxWYWx1ZSA9IHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gSW5kZXhFbnRyeSBlbnRyeSB0aGF0IHNvcnRzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjdXJyZW50XG4gICAgICogZGlyZWN0aW9uYWwgdmFsdWUuXG4gICAgICovICAgIGtlKCkge1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5kaXJlY3Rpb25hbFZhbHVlLmxlbmd0aCwgZSA9IDAgPT09IHQgfHwgMjU1ID09PSB0aGlzLmRpcmVjdGlvbmFsVmFsdWVbdCAtIDFdID8gdCArIDEgOiB0LCBuID0gbmV3IFVpbnQ4QXJyYXkoZSk7XG4gICAgICAgIHJldHVybiBuLnNldCh0aGlzLmRpcmVjdGlvbmFsVmFsdWUsIDApLCBlICE9PSB0ID8gbi5zZXQoWyAwIF0sIHRoaXMuZGlyZWN0aW9uYWxWYWx1ZS5sZW5ndGgpIDogKytuW24ubGVuZ3RoIC0gMV0sIFxuICAgICAgICBuZXcgSGkodGhpcy5pbmRleElkLCB0aGlzLmRvY3VtZW50S2V5LCB0aGlzLmFycmF5VmFsdWUsIG4pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gSmkodCwgZSkge1xuICAgIGxldCBuID0gdC5pbmRleElkIC0gZS5pbmRleElkO1xuICAgIHJldHVybiAwICE9PSBuID8gbiA6IChuID0gWWkodC5hcnJheVZhbHVlLCBlLmFycmF5VmFsdWUpLCAwICE9PSBuID8gbiA6IChuID0gWWkodC5kaXJlY3Rpb25hbFZhbHVlLCBlLmRpcmVjdGlvbmFsVmFsdWUpLCBcbiAgICAwICE9PSBuID8gbiA6IHh0LmNvbXBhcmF0b3IodC5kb2N1bWVudEtleSwgZS5kb2N1bWVudEtleSkpKTtcbn1cblxuZnVuY3Rpb24gWWkodCwgZSkge1xuICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdC5sZW5ndGggJiYgbiA8IGUubGVuZ3RoOyArK24pIHtcbiAgICAgICAgY29uc3QgcyA9IHRbbl0gLSBlW25dO1xuICAgICAgICBpZiAoMCAhPT0gcykgcmV0dXJuIHM7XG4gICAgfVxuICAgIHJldHVybiB0Lmxlbmd0aCAtIGUubGVuZ3RoO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIGxpZ2h0IHF1ZXJ5IHBsYW5uZXIgZm9yIEZpcmVzdG9yZS5cbiAqXG4gKiBUaGlzIGNsYXNzIG1hdGNoZXMgYSBgRmllbGRJbmRleGAgYWdhaW5zdCBhIEZpcmVzdG9yZSBRdWVyeSBgVGFyZ2V0YC4gSXRcbiAqIGRldGVybWluZXMgd2hldGhlciBhIGdpdmVuIGluZGV4IGNhbiBiZSB1c2VkIHRvIHNlcnZlIHRoZSBzcGVjaWZpZWQgdGFyZ2V0LlxuICpcbiAqIFRoZSBmb2xsb3dpbmcgdGFibGUgc2hvd2Nhc2VzIHNvbWUgcG9zc2libGUgaW5kZXggY29uZmlndXJhdGlvbnM6XG4gKlxuICogUXVlcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSW5kZXhcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiB3aGVyZSgnYScsICc9PScsICdhJykud2hlcmUoJ2InLCAnPT0nLCAnYicpICAgICAgICAgfCBhIEFTQywgYiBERVNDXG4gKiB3aGVyZSgnYScsICc9PScsICdhJykud2hlcmUoJ2InLCAnPT0nLCAnYicpICAgICAgICAgfCBhIEFTQ1xuICogd2hlcmUoJ2EnLCAnPT0nLCAnYScpLndoZXJlKCdiJywgJz09JywgJ2InKSAgICAgICAgIHwgYiBERVNDXG4gKiB3aGVyZSgnYScsICc+PScsICdhJykub3JkZXJCeSgnYScpICAgICAgICAgICAgICAgICAgfCBhIEFTQ1xuICogd2hlcmUoJ2EnLCAnPj0nLCAnYScpLm9yZGVyQnkoJ2EnLCAnZGVzYycpICAgICAgICAgIHwgYSBERVNDXG4gKiB3aGVyZSgnYScsICc+PScsICdhJykub3JkZXJCeSgnYScpLm9yZGVyQnkoJ2InKSAgICAgfCBhIEFTQywgYiBBU0NcbiAqIHdoZXJlKCdhJywgJz49JywgJ2EnKS5vcmRlckJ5KCdhJykub3JkZXJCeSgnYicpICAgICB8IGEgQVNDXG4gKiB3aGVyZSgnYScsICdhcnJheS1jb250YWlucycsICdhJykub3JkZXJCeSgnYicpICAgICAgfCBhIENPTlRBSU5TLCBiIEFTQ0VORElOR1xuICogd2hlcmUoJ2EnLCAnYXJyYXktY29udGFpbnMnLCAnYScpLm9yZGVyQnkoJ2InKSAgICAgIHwgYSBDT05UQUlOU1xuICovIGNsYXNzIFhpIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMuY29sbGVjdGlvbklkID0gbnVsbCAhPSB0LmNvbGxlY3Rpb25Hcm91cCA/IHQuY29sbGVjdGlvbkdyb3VwIDogdC5wYXRoLmxhc3RTZWdtZW50KCksIFxuICAgICAgICB0aGlzLk1lID0gdC5vcmRlckJ5LCB0aGlzLk9lID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiB0LmZpbHRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBlO1xuICAgICAgICAgICAgdC5TKCkgPyB0aGlzLiRlID0gdCA6IHRoaXMuT2UucHVzaCh0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGluZGV4IGNhbiBiZSB1c2VkIHRvIHNlcnZlIHRoZSBUYXJnZXRJbmRleE1hdGNoZXInc1xuICAgICAqIHRhcmdldC5cbiAgICAgKlxuICAgICAqIEFuIGluZGV4IGlzIGNvbnNpZGVyZWQgY2FwYWJsZSBvZiBzZXJ2aW5nIHRoZSB0YXJnZXQgd2hlbjpcbiAgICAgKiAtIFRoZSB0YXJnZXQgdXNlcyBhbGwgaW5kZXggc2VnbWVudHMgZm9yIGl0cyBmaWx0ZXJzIGFuZCBvcmRlckJ5IGNsYXVzZXMuXG4gICAgICogICBUaGUgdGFyZ2V0IGNhbiBoYXZlIGFkZGl0aW9uYWwgZmlsdGVyIGFuZCBvcmRlckJ5IGNsYXVzZXMsIGJ1dCBub3RcbiAgICAgKiAgIGZld2VyLlxuICAgICAqIC0gSWYgYW4gQXJyYXlDb250YWlucy9BcnJheUNvbnRhaW5zQW55ZmlsdGVyIGlzIHVzZWQsIHRoZSBpbmRleCBtdXN0IGFsc29cbiAgICAgKiAgIGhhdmUgYSBjb3JyZXNwb25kaW5nIGBDT05UQUlOU2Agc2VnbWVudC5cbiAgICAgKiAtIEFsbCBkaXJlY3Rpb25hbCBpbmRleCBzZWdtZW50cyBjYW4gYmUgbWFwcGVkIHRvIHRoZSB0YXJnZXQgYXMgYSBzZXJpZXMgb2ZcbiAgICAgKiAgIGVxdWFsaXR5IGZpbHRlcnMsIGEgc2luZ2xlIGluZXF1YWxpdHkgZmlsdGVyIGFuZCBhIHNlcmllcyBvZiBvcmRlckJ5XG4gICAgICogICBjbGF1c2VzLlxuICAgICAqIC0gVGhlIHNlZ21lbnRzIHRoYXQgcmVwcmVzZW50IHRoZSBlcXVhbGl0eSBmaWx0ZXJzIG1heSBhcHBlYXIgb3V0IG9mIG9yZGVyLlxuICAgICAqIC0gVGhlIG9wdGlvbmFsIHNlZ21lbnQgZm9yIHRoZSBpbmVxdWFsaXR5IGZpbHRlciBtdXN0IGFwcGVhciBhZnRlciBhbGxcbiAgICAgKiAgIGVxdWFsaXR5IHNlZ21lbnRzLlxuICAgICAqIC0gVGhlIHNlZ21lbnRzIHRoYXQgcmVwcmVzZW50IHRoYXQgb3JkZXJCeSBjbGF1c2Ugb2YgdGhlIHRhcmdldCBtdXN0IGFwcGVhclxuICAgICAqICAgaW4gb3JkZXIgYWZ0ZXIgYWxsIGVxdWFsaXR5IGFuZCBpbmVxdWFsaXR5IHNlZ21lbnRzLiBTaW5nbGUgb3JkZXJCeVxuICAgICAqICAgY2xhdXNlcyBjYW5ub3QgYmUgc2tpcHBlZCwgYnV0IGEgY29udGludW91cyBvcmRlckJ5IHN1ZmZpeCBtYXkgYmVcbiAgICAgKiAgIG9taXR0ZWQuXG4gICAgICovICAgIEZlKHQpIHtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgYW4gYXJyYXkgZWxlbWVudCwgZmluZCBhIG1hdGNoaW5nIGZpbHRlci5cbiAgICAgICAgY29uc3QgZSA9IG5lKHQpO1xuICAgICAgICBpZiAodm9pZCAwICE9PSBlICYmICF0aGlzLkJlKGUpKSByZXR1cm4gITE7XG4gICAgICAgIGNvbnN0IG4gPSBzZSh0KTtcbiAgICAgICAgbGV0IHMgPSAwLCBpID0gMDtcbiAgICAgICAgLy8gUHJvY2VzcyBhbGwgZXF1YWxpdGllcyBmaXJzdC4gRXF1YWxpdGllcyBjYW4gYXBwZWFyIG91dCBvZiBvcmRlci5cbiAgICAgICAgZm9yICg7cyA8IG4ubGVuZ3RoICYmIHRoaXMuQmUobltzXSk7ICsrcykgO1xuICAgICAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgcHJvY2Vzc2VkIGFsbCBzZWdtZW50cywgYWxsIHNlZ21lbnRzIGFyZSB1c2VkIHRvIHNlcnZlXG4gICAgICAgIC8vIHRoZSBlcXVhbGl0eSBmaWx0ZXJzIGFuZCB3ZSBkbyBub3QgbmVlZCB0byBtYXAgYW55IHNlZ21lbnRzIHRvIHRoZVxuICAgICAgICAvLyB0YXJnZXQncyBpbmVxdWFsaXR5IGFuZCBvcmRlckJ5IGNsYXVzZXMuXG4gICAgICAgICAgICAgICAgaWYgKHMgPT09IG4ubGVuZ3RoKSByZXR1cm4gITA7XG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGFuIGluZXF1YWxpdHkgZmlsdGVyLCB0aGUgbmV4dCBzZWdtZW50IG11c3QgbWF0Y2ggYm90aCB0aGVcbiAgICAgICAgLy8gZmlsdGVyIGFuZCB0aGUgZmlyc3Qgb3JkZXJCeSBjbGF1c2UuXG4gICAgICAgICAgICAgICAgaWYgKHZvaWQgMCAhPT0gdGhpcy4kZSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IG5bc107XG4gICAgICAgICAgICBpZiAoIXRoaXMuTGUodGhpcy4kZSwgdCkgfHwgIXRoaXMucWUodGhpcy5NZVtpKytdLCB0KSkgcmV0dXJuICExO1xuICAgICAgICAgICAgKytzO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFsbCByZW1haW5pbmcgc2VnbWVudHMgbmVlZCB0byByZXByZXNlbnQgdGhlIHByZWZpeCBvZiB0aGUgdGFyZ2V0J3NcbiAgICAgICAgLy8gb3JkZXJCeS5cbiAgICAgICAgICAgICAgICBmb3IgKDtzIDwgbi5sZW5ndGg7ICsrcykge1xuICAgICAgICAgICAgY29uc3QgdCA9IG5bc107XG4gICAgICAgICAgICBpZiAoaSA+PSB0aGlzLk1lLmxlbmd0aCB8fCAhdGhpcy5xZSh0aGlzLk1lW2krK10sIHQpKSByZXR1cm4gITE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICEwO1xuICAgIH1cbiAgICBCZSh0KSB7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLk9lKSBpZiAodGhpcy5MZShlLCB0KSkgcmV0dXJuICEwO1xuICAgICAgICByZXR1cm4gITE7XG4gICAgfVxuICAgIExlKHQsIGUpIHtcbiAgICAgICAgaWYgKHZvaWQgMCA9PT0gdCB8fCAhdC5maWVsZC5pc0VxdWFsKGUuZmllbGRQYXRoKSkgcmV0dXJuICExO1xuICAgICAgICBjb25zdCBuID0gXCJhcnJheS1jb250YWluc1wiIC8qIEFSUkFZX0NPTlRBSU5TICovID09PSB0Lm9wIHx8IFwiYXJyYXktY29udGFpbnMtYW55XCIgLyogQVJSQVlfQ09OVEFJTlNfQU5ZICovID09PSB0Lm9wO1xuICAgICAgICByZXR1cm4gMiAvKiBDT05UQUlOUyAqLyA9PT0gZS5raW5kID09PSBuO1xuICAgIH1cbiAgICBxZSh0LCBlKSB7XG4gICAgICAgIHJldHVybiAhIXQuZmllbGQuaXNFcXVhbChlLmZpZWxkUGF0aCkgJiYgKDAgLyogQVNDRU5ESU5HICovID09PSBlLmtpbmQgJiYgXCJhc2NcIiAvKiBBU0NFTkRJTkcgKi8gPT09IHQuZGlyIHx8IDEgLyogREVTQ0VORElORyAqLyA9PT0gZS5raW5kICYmIFwiZGVzY1wiIC8qIERFU0NFTkRJTkcgKi8gPT09IHQuZGlyKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEFuIGluLW1lbW9yeSBpbXBsZW1lbnRhdGlvbiBvZiBJbmRleE1hbmFnZXIuXG4gKi8gY2xhc3MgWmkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLlVlID0gbmV3IHRyO1xuICAgIH1cbiAgICBhZGRUb0NvbGxlY3Rpb25QYXJlbnRJbmRleCh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLlVlLmFkZChlKSwgdWkucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBnZXRDb2xsZWN0aW9uUGFyZW50cyh0LCBlKSB7XG4gICAgICAgIHJldHVybiB1aS5yZXNvbHZlKHRoaXMuVWUuZ2V0RW50cmllcyhlKSk7XG4gICAgfVxuICAgIGFkZEZpZWxkSW5kZXgodCwgZSkge1xuICAgICAgICAvLyBGaWVsZCBpbmRpY2VzIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggbWVtb3J5IHBlcnNpc3RlbmNlLlxuICAgICAgICByZXR1cm4gdWkucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBkZWxldGVGaWVsZEluZGV4KHQsIGUpIHtcbiAgICAgICAgLy8gRmllbGQgaW5kaWNlcyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIG1lbW9yeSBwZXJzaXN0ZW5jZS5cbiAgICAgICAgcmV0dXJuIHVpLnJlc29sdmUoKTtcbiAgICB9XG4gICAgZ2V0RG9jdW1lbnRzTWF0Y2hpbmdUYXJnZXQodCwgZSkge1xuICAgICAgICAvLyBGaWVsZCBpbmRpY2VzIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggbWVtb3J5IHBlcnNpc3RlbmNlLlxuICAgICAgICByZXR1cm4gdWkucmVzb2x2ZShudWxsKTtcbiAgICB9XG4gICAgZ2V0RmllbGRJbmRleCh0LCBlKSB7XG4gICAgICAgIC8vIEZpZWxkIGluZGljZXMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBtZW1vcnkgcGVyc2lzdGVuY2UuXG4gICAgICAgIHJldHVybiB1aS5yZXNvbHZlKG51bGwpO1xuICAgIH1cbiAgICBnZXRGaWVsZEluZGV4ZXModCwgZSkge1xuICAgICAgICAvLyBGaWVsZCBpbmRpY2VzIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggbWVtb3J5IHBlcnNpc3RlbmNlLlxuICAgICAgICByZXR1cm4gdWkucmVzb2x2ZShbXSk7XG4gICAgfVxuICAgIGdldE5leHRDb2xsZWN0aW9uR3JvdXBUb1VwZGF0ZSh0KSB7XG4gICAgICAgIC8vIEZpZWxkIGluZGljZXMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBtZW1vcnkgcGVyc2lzdGVuY2UuXG4gICAgICAgIHJldHVybiB1aS5yZXNvbHZlKG51bGwpO1xuICAgIH1cbiAgICB1cGRhdGVDb2xsZWN0aW9uR3JvdXAodCwgZSwgbikge1xuICAgICAgICAvLyBGaWVsZCBpbmRpY2VzIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggbWVtb3J5IHBlcnNpc3RlbmNlLlxuICAgICAgICByZXR1cm4gdWkucmVzb2x2ZSgpO1xuICAgIH1cbiAgICB1cGRhdGVJbmRleEVudHJpZXModCwgZSkge1xuICAgICAgICAvLyBGaWVsZCBpbmRpY2VzIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggbWVtb3J5IHBlcnNpc3RlbmNlLlxuICAgICAgICByZXR1cm4gdWkucmVzb2x2ZSgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29sbGVjdGlvbi1wYXJlbnQgaW5kZXggZXhwb3NlZCBieSBNZW1vcnlJbmRleE1hbmFnZXIuXG4gKiBBbHNvIHVzZWQgZm9yIGluLW1lbW9yeSBjYWNoaW5nIGJ5IEluZGV4ZWREYkluZGV4TWFuYWdlciBhbmQgaW5pdGlhbCBpbmRleCBwb3B1bGF0aW9uXG4gKiBpbiBpbmRleGVkZGJfc2NoZW1hLnRzXG4gKi8gY2xhc3MgdHIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmluZGV4ID0ge307XG4gICAgfVxuICAgIC8vIFJldHVybnMgZmFsc2UgaWYgdGhlIGVudHJ5IGFscmVhZHkgZXhpc3RlZC5cbiAgICBhZGQodCkge1xuICAgICAgICBjb25zdCBlID0gdC5sYXN0U2VnbWVudCgpLCBuID0gdC5wb3BMYXN0KCksIHMgPSB0aGlzLmluZGV4W2VdIHx8IG5ldyBrbihfdC5jb21wYXJhdG9yKSwgaSA9ICFzLmhhcyhuKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXhbZV0gPSBzLmFkZChuKSwgaTtcbiAgICB9XG4gICAgaGFzKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQubGFzdFNlZ21lbnQoKSwgbiA9IHQucG9wTGFzdCgpLCBzID0gdGhpcy5pbmRleFtlXTtcbiAgICAgICAgcmV0dXJuIHMgJiYgcy5oYXMobik7XG4gICAgfVxuICAgIGdldEVudHJpZXModCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuaW5kZXhbdF0gfHwgbmV3IGtuKF90LmNvbXBhcmF0b3IpKS50b0FycmF5KCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjb25zdCBlciA9IG5ldyBVaW50OEFycmF5KDApO1xuXG4vKipcbiAqIEEgcGVyc2lzdGVkIGltcGxlbWVudGF0aW9uIG9mIEluZGV4TWFuYWdlci5cbiAqXG4gKiBQT1JUSU5HIE5PVEU6IFVubGlrZSBpT1MgYW5kIEFuZHJvaWQsIHRoZSBXZWIgU0RLIGRvZXMgbm90IG1lbW9pemUgaW5kZXhcbiAqIGRhdGEgYXMgaXQgc3VwcG9ydHMgbXVsdGktdGFiIGFjY2Vzcy5cbiAqL1xuY2xhc3MgbnIge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy51c2VyID0gdCwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBpbi1tZW1vcnkgY29weSBvZiB0aGUgaW5kZXggZW50cmllcyB3ZSd2ZSBhbHJlYWR5IHdyaXR0ZW4gc2luY2UgdGhlIFNES1xuICAgICAgICAgKiBsYXVuY2hlZC4gVXNlZCB0byBhdm9pZCByZS13cml0aW5nIHRoZSBzYW1lIGVudHJ5IHJlcGVhdGVkbHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgaXMgKk5PVCogYSBjb21wbGV0ZSBjYWNoZSBvZiB3aGF0J3MgaW4gcGVyc2lzdGVuY2UgYW5kIHNvIGNhbiBuZXZlciBiZVxuICAgICAgICAgKiB1c2VkIHRvIHNhdGlzZnkgcmVhZHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLktlID0gbmV3IHRyLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1hcHMgZnJvbSBhIHRhcmdldCB0byBpdHMgZXF1aXZhbGVudCBsaXN0IG9mIHN1Yi10YXJnZXRzLiBFYWNoIHN1Yi10YXJnZXRcbiAgICAgICAgICogY29udGFpbnMgb25seSBvbmUgdGVybSBmcm9tIHRoZSB0YXJnZXQncyBkaXNqdW5jdGl2ZSBub3JtYWwgZm9ybSAoRE5GKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuR2UgPSBuZXcgRG4oKHQgPT4gY2UodCkpLCAoKHQsIGUpID0+IGxlKHQsIGUpKSksIHRoaXMudWlkID0gdC51aWQgfHwgXCJcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIG5ldyBlbnRyeSB0byB0aGUgY29sbGVjdGlvbiBwYXJlbnQgaW5kZXguXG4gICAgICpcbiAgICAgKiBSZXBlYXRlZCBjYWxscyBmb3IgdGhlIHNhbWUgY29sbGVjdGlvblBhdGggc2hvdWxkIGJlIGF2b2lkZWQgd2l0aGluIGFcbiAgICAgKiB0cmFuc2FjdGlvbiBhcyBJbmRleGVkRGJJbmRleE1hbmFnZXIgb25seSBjYWNoZXMgd3JpdGVzIG9uY2UgYSB0cmFuc2FjdGlvblxuICAgICAqIGhhcyBiZWVuIGNvbW1pdHRlZC5cbiAgICAgKi8gICAgYWRkVG9Db2xsZWN0aW9uUGFyZW50SW5kZXgodCwgZSkge1xuICAgICAgICBpZiAoIXRoaXMuS2UuaGFzKGUpKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gZS5sYXN0U2VnbWVudCgpLCBzID0gZS5wb3BMYXN0KCk7XG4gICAgICAgICAgICB0LmFkZE9uQ29tbWl0dGVkTGlzdGVuZXIoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGNvbGxlY3Rpb24gdG8gdGhlIGluIG1lbW9yeSBjYWNoZSBvbmx5IGlmIHRoZSB0cmFuc2FjdGlvbiB3YXNcbiAgICAgICAgICAgICAgICAvLyBzdWNjZXNzZnVsbHkgY29tbWl0dGVkLlxuICAgICAgICAgICAgICAgIHRoaXMuS2UuYWRkKGUpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgY29uc3QgaSA9IHtcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uSWQ6IG4sXG4gICAgICAgICAgICAgICAgcGFyZW50OiAkcyhzKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBzcih0KS5wdXQoaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVpLnJlc29sdmUoKTtcbiAgICB9XG4gICAgZ2V0Q29sbGVjdGlvblBhcmVudHModCwgZSkge1xuICAgICAgICBjb25zdCBuID0gW10sIHMgPSBJREJLZXlSYW5nZS5ib3VuZChbIGUsIFwiXCIgXSwgWyBhdChlKSwgXCJcIiBdLCBcbiAgICAgICAgLypsb3dlck9wZW49Ki8gITEsIFxuICAgICAgICAvKnVwcGVyT3Blbj0qLyAhMCk7XG4gICAgICAgIHJldHVybiBzcih0KS5VdChzKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcyBvZiB0KSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBjb2xsZWN0aW9uSWQgZ3VhcmQgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSAoYW5kIGlzbid0IGFzIGxvbmdcbiAgICAgICAgICAgICAgICAvLyBhcyB3ZSdyZSBydW5uaW5nIGluIGEgcmVhbCBicm93c2VyKSwgYnV0IHRoZXJlJ3MgYSBidWcgaW5cbiAgICAgICAgICAgICAgICAvLyBpbmRleGVkZGJzaGltIHRoYXQgYnJlYWtzIG91ciByYW5nZSBpbiBvdXIgdGVzdHMgcnVubmluZyBpbiBub2RlOlxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9heGVtY2xpb24vSW5kZXhlZERCU2hpbS9pc3N1ZXMvMzM0XG4gICAgICAgICAgICAgICAgaWYgKHMuY29sbGVjdGlvbklkICE9PSBlKSBicmVhaztcbiAgICAgICAgICAgICAgICBuLnB1c2goTHMocy5wYXJlbnQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGFkZEZpZWxkSW5kZXgodCwgZSkge1xuICAgICAgICAvLyBUT0RPKGluZGV4aW5nKTogVmVyaWZ5IHRoYXQgdGhlIGF1dG8taW5jcmVtZW50aW5nIGluZGV4IElEIHdvcmtzIGluXG4gICAgICAgIC8vIFNhZmFyaSAmIEZpcmVmb3guXG4gICAgICAgIGNvbnN0IG4gPSBycih0KSwgcyA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaW5kZXhJZDogdC5pbmRleElkLFxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25Hcm91cDogdC5jb2xsZWN0aW9uR3JvdXAsXG4gICAgICAgICAgICAgICAgZmllbGRzOiB0LmZpZWxkcy5tYXAoKHQgPT4gWyB0LmZpZWxkUGF0aC5jYW5vbmljYWxTdHJpbmcoKSwgdC5raW5kIF0pKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfShlKTtcbiAgICAgICAgLy8gYGluZGV4SWRgIGlzIGF1dG8tcG9wdWxhdGVkIGJ5IEluZGV4ZWREYlxuICAgICAgICByZXR1cm4gZGVsZXRlIHMuaW5kZXhJZCwgbi5hZGQocykubmV4dCgpO1xuICAgIH1cbiAgICBkZWxldGVGaWVsZEluZGV4KHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IHJyKHQpLCBzID0gb3IodCksIGkgPSBpcih0KTtcbiAgICAgICAgcmV0dXJuIG4uZGVsZXRlKGUuaW5kZXhJZCkubmV4dCgoKCkgPT4gcy5kZWxldGUoSURCS2V5UmFuZ2UuYm91bmQoWyBlLmluZGV4SWQgXSwgWyBlLmluZGV4SWQgKyAxIF0sIFxuICAgICAgICAvKmxvd2VyT3Blbj0qLyAhMSwgXG4gICAgICAgIC8qdXBwZXJPcGVuPSovICEwKSkpKS5uZXh0KCgoKSA9PiBpLmRlbGV0ZShJREJLZXlSYW5nZS5ib3VuZChbIGUuaW5kZXhJZCBdLCBbIGUuaW5kZXhJZCArIDEgXSwgXG4gICAgICAgIC8qbG93ZXJPcGVuPSovICExLCBcbiAgICAgICAgLyp1cHBlck9wZW49Ki8gITApKSkpO1xuICAgIH1cbiAgICBnZXREb2N1bWVudHNNYXRjaGluZ1RhcmdldCh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBpcih0KTtcbiAgICAgICAgbGV0IHMgPSAhMDtcbiAgICAgICAgY29uc3QgaSA9IG5ldyBNYXA7XG4gICAgICAgIHJldHVybiB1aS5mb3JFYWNoKHRoaXMuUWUoZSksIChlID0+IHRoaXMuZ2V0RmllbGRJbmRleCh0LCBlKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgIHMgJiYgKHMgPSAhIXQpLCBpLnNldChlLCB0KTtcbiAgICAgICAgfSkpKSkubmV4dCgoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgdCA9IEduKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVpLmZvckVhY2goaSwgKChzLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByO1xuICAgICAgICAgICAgICAgICAgICBPKFwiSW5kZXhlZERiSW5kZXhNYW5hZ2VyXCIsIGBVc2luZyBpbmRleCAke3IgPSBzLCBgaWQ9JHtyLmluZGV4SWR9fGNnPSR7ci5jb2xsZWN0aW9uR3JvdXB9fGY9JHtyLmZpZWxkcy5tYXAoKHQgPT4gYCR7dC5maWVsZFBhdGh9OiR7dC5raW5kfWApKS5qb2luKFwiLFwiKX1gfSB0byBleGVjdXRlICR7Y2UoZSl9YCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG8gPSBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gbmUoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSBuKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBkZSh0LCBuLmZpZWxkUGF0aCkpIHN3aXRjaCAoZS5vcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYXJyYXktY29udGFpbnMtYW55XCIgLyogQVJSQVlfQ09OVEFJTlNfQU5ZICovIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS52YWx1ZS5hcnJheVZhbHVlLnZhbHVlcyB8fCBbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYXJyYXktY29udGFpbnNcIiAvKiBBUlJBWV9DT05UQUlOUyAqLyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgZS52YWx1ZSBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbWFpbmluZyBmaWx0ZXJzIGFyZSBub3QgYXJyYXkgZmlsdGVycy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICogUmV0dXJucyB0aGUgbGlzdCBvZiB2YWx1ZXMgdGhhdCBhcmUgdXNlZCBpbiAhPSBvciBOT1RfSU4gZmlsdGVycy4gUmV0dXJuc1xuICogYG51bGxgIGlmIHRoZXJlIGFyZSBubyBzdWNoIGZpbHRlcnMuXG4gKi8gKGksIHMpLCBhID0gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IG5ldyBNYXA7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHMgb2Ygc2UoZSkpIGZvciAoY29uc3QgZSBvZiBkZSh0LCBzLmZpZWxkUGF0aCkpIHN3aXRjaCAoZS5vcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiPT1cIiAvKiBFUVVBTCAqLyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpblwiIC8qIElOICovIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbmNvZGUgZXF1YWxpdHkgcHJlZml4LCB3aGljaCBpcyBlbmNvZGVkIGluIHRoZSBpbmRleCB2YWx1ZSBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5lcXVhbGl0eSAoZS5nLiBgYSA9PSAnYScgJiYgYiAhPSAnYidgIGlzIGVuY29kZWQgdG9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgdmFsdWUgIT0gJ2FiJ2ApLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uc2V0KHMuZmllbGRQYXRoLmNhbm9uaWNhbFN0cmluZygpLCBlLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwibm90LWluXCIgLyogTk9UX0lOICovIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIiE9XCIgLyogTk9UX0VRVUFMICovIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RJbi9Ob3RFcXVhbCBpcyBhbHdheXMgYSBzdWZmaXguIFRoZXJlIGNhbm5vdCBiZSBhbnkgcmVtYWluaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VnbWVudHMgYW5kIGhlbmNlIHdlIGNhbiByZXR1cm4gZWFybHkgaGVyZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5zZXQocy5maWVsZFBhdGguY2Fub25pY2FsU3RyaW5nKCksIGUudmFsdWUpLCBBcnJheS5mcm9tKG4udmFsdWVzKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbWFpbmluZyBmaWx0ZXJzIGNhbm5vdCBiZSB1c2VkIGFzIG5vdEluIGJvdW5kcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICogUmV0dXJucyBhIGxvd2VyIGJvdW5kIG9mIGZpZWxkIHZhbHVlcyB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgc3RhcnRpbmcgcG9pbnQgdG9cbiAqIHNjYW4gdGhlIGluZGV4IGRlZmluZWQgYnkgYGZpZWxkSW5kZXhgLiBSZXR1cm5zIGBudWxsYCBpZiBubyBsb3dlciBib3VuZFxuICogZXhpc3RzLlxuICovIChpLCBzKSwgdSA9IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzID0gITA7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZWFjaCBzZWdtZW50LCByZXRyaWV2ZSBhIGxvd2VyIGJvdW5kIGlmIHRoZXJlIGlzIGEgc3VpdGFibGUgZmlsdGVyIG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydEF0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCByIG9mIHNlKGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGUsIG8gPSAhMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGFsbCBmaWx0ZXJzIHRvIGZpbmQgYSB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgZmllbGQgc2VnbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbiBvZiBkZSh0LCByLmZpZWxkUGF0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHQsIHMgPSAhMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChuLm9wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIjxcIiAvKiBMRVNTX1RIQU4gKi8gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCI8PVwiIC8qIExFU1NfVEhBTl9PUl9FUVVBTCAqLyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gXCJudWxsVmFsdWVcIiBpbiAoaSA9IG4udmFsdWUpID8ga3QgOiBcImJvb2xlYW5WYWx1ZVwiIGluIGkgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhblZhbHVlOiAhMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IFwiaW50ZWdlclZhbHVlXCIgaW4gaSB8fCBcImRvdWJsZVZhbHVlXCIgaW4gaSA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGVWYWx1ZTogTmFOXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogXCJ0aW1lc3RhbXBWYWx1ZVwiIGluIGkgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wVmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kczogTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogXCJzdHJpbmdWYWx1ZVwiIGluIGkgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOiBcImJ5dGVzVmFsdWVcIiBpbiBpID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzVmFsdWU6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOiBcInJlZmVyZW5jZVZhbHVlXCIgaW4gaSA/IFV0KHZ0LmVtcHR5KCksIHh0LmVtcHR5KCkpIDogXCJnZW9Qb2ludFZhbHVlXCIgaW4gaSA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9Qb2ludFZhbHVlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlOiAtOTAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdpdHVkZTogLTE4MFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOiBcImFycmF5VmFsdWVcIiBpbiBpID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5VmFsdWU6IHt9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogXCJtYXBWYWx1ZVwiIGluIGkgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwVmFsdWU6IHt9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogTCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiPT1cIiAvKiBFUVVBTCAqLyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImluXCIgLyogSU4gKi8gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCI+PVwiIC8qIEdSRUFURVJfVEhBTl9PUl9FUVVBTCAqLyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gbi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIj5cIiAvKiBHUkVBVEVSX1RIQU4gKi8gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IG4udmFsdWUsIHMgPSAhMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIiE9XCIgLyogTk9UX0VRVUFMICovIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwibm90LWluXCIgLyogTk9UX0lOICovIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBrdDtcbiAvLyBSZW1haW5pbmcgZmlsdGVycyBjYW5ub3QgYmUgdXNlZCBhcyBsb3dlciBib3VuZHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKdChlLCB0KSA9PT0gdCAmJiAoZSA9IHQsIG8gPSBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBzdGFydEF0IGJvdW5kLCBjb21wYXJlIHRoZSB2YWx1ZXMgYWdhaW5zdCB0aGUgZXhpc3RpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3VuZGFyeSB0byBzZWUgaWYgd2UgY2FuIG5hcnJvdyB0aGUgc2NvcGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSB0LnN0YXJ0QXQpIGZvciAobGV0IG4gPSAwOyBuIDwgdC5vcmRlckJ5Lmxlbmd0aDsgKytuKSBpZiAodC5vcmRlckJ5W25dLmZpZWxkLmlzRXF1YWwoci5maWVsZFBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB0LnN0YXJ0QXQucG9zaXRpb25bbl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEp0KGUsIHMpID09PSBzICYmIChlID0gcywgbyA9IHQuc3RhcnRBdC5pbmNsdXNpdmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gZSkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gbG93ZXIgYm91bmQgZXhpc3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5wdXNoKGUpLCBzICYmIChzID0gbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBSZXR1cm5zIHRoZSBsYXJnZXN0IHZhbHVlIGZvciB0aGUgZ2l2ZW4gdmFsdWUgdHlwZSAoZXhjbHVzaXZlKS4gKi8gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFlKG4sIHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICogUmV0dXJucyBhbiB1cHBlciBib3VuZCBvZiBmaWVsZCB2YWx1ZXMgdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBlbmRpbmcgcG9pbnRcbiAqIHdoZW4gc2Nhbm5pbmcgdGhlIGluZGV4IGRlZmluZWQgYnkgYGZpZWxkSW5kZXhgLiBSZXR1cm5zIGBudWxsYCBpZiBub1xuICogdXBwZXIgYm91bmQgZXhpc3RzLlxuICovIChpLCBzKSwgYyA9IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzID0gITA7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZWFjaCBzZWdtZW50LCByZXRyaWV2ZSBhbiB1cHBlciBib3VuZCBpZiB0aGVyZSBpcyBhIHN1aXRhYmxlIGZpbHRlciBvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5kQXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHIgb2Ygc2UoZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZSwgbyA9ICEwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgYWxsIGZpbHRlcnMgdG8gZmluZCBhIHZhbHVlIGZvciB0aGUgY3VycmVudCBmaWVsZCBzZWdtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBuIG9mIGRlKHQsIHIuZmllbGRQYXRoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdCwgcyA9ICEwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG4ub3ApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiPj1cIiAvKiBHUkVBVEVSX1RIQU5fT1JfRVFVQUwgKi8gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCI+XCIgLyogR1JFQVRFUl9USEFOICovIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBcIm51bGxWYWx1ZVwiIGluIChpID0gbi52YWx1ZSkgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhblZhbHVlOiAhMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IFwiYm9vbGVhblZhbHVlXCIgaW4gaSA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGVWYWx1ZTogTmFOXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogXCJpbnRlZ2VyVmFsdWVcIiBpbiBpIHx8IFwiZG91YmxlVmFsdWVcIiBpbiBpID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcFZhbHVlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHM6IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IFwidGltZXN0YW1wVmFsdWVcIiBpbiBpID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBcIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogXCJzdHJpbmdWYWx1ZVwiIGluIGkgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNWYWx1ZTogXCJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IFwiYnl0ZXNWYWx1ZVwiIGluIGkgPyBVdCh2dC5lbXB0eSgpLCB4dC5lbXB0eSgpKSA6IFwicmVmZXJlbmNlVmFsdWVcIiBpbiBpID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb1BvaW50VmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0aXR1ZGU6IC05MCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ2l0dWRlOiAtMTgwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IFwiZ2VvUG9pbnRWYWx1ZVwiIGluIGkgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlWYWx1ZToge31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOiBcImFycmF5VmFsdWVcIiBpbiBpID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcFZhbHVlOiB7fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IFwibWFwVmFsdWVcIiBpbiBpID8gTnQgOiBMKCksIHMgPSAhMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIj09XCIgLyogRVFVQUwgKi8gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpblwiIC8qIElOICovIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiPD1cIiAvKiBMRVNTX1RIQU5fT1JfRVFVQUwgKi8gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IG4udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCI8XCIgLyogTEVTU19USEFOICovIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBuLnZhbHVlLCBzID0gITE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCIhPVwiIC8qIE5PVF9FUVVBTCAqLyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm5vdC1pblwiIC8qIE5PVF9JTiAqLyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gTnQ7XG4gLy8gUmVtYWluaW5nIGZpbHRlcnMgY2Fubm90IGJlIHVzZWQgYXMgdXBwZXIgYm91bmRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWXQoZSwgdCkgPT09IHQgJiYgKGUgPSB0LCBvID0gcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgZW5kQXQgYm91bmQsIGNvbXBhcmUgdGhlIHZhbHVlcyBhZ2FpbnN0IHRoZSBleGlzdGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdW5kYXJ5IHRvIHNlZSBpZiB3ZSBjYW4gbmFycm93IHRoZSBzY29wZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IHQuZW5kQXQpIGZvciAobGV0IG4gPSAwOyBuIDwgdC5vcmRlckJ5Lmxlbmd0aDsgKytuKSBpZiAodC5vcmRlckJ5W25dLmZpZWxkLmlzRXF1YWwoci5maWVsZFBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB0LmVuZEF0LnBvc2l0aW9uW25dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZdChlLCBzKSA9PT0gcyAmJiAoZSA9IHMsIG8gPSB0LmVuZEF0LmluY2x1c2l2ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSBlKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyB1cHBlciBib3VuZCBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnB1c2goZSksIHMgJiYgKHMgPSBvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBZShuLCBzKTtcbiAgICAgICAgICAgICAgICAgICAgfShpLCBzKSwgaCA9IHRoaXMuamUocywgaSwgdSksIGwgPSB0aGlzLmplKHMsIGksIGMpLCBmID0gdGhpcy5XZShzLCBpLCBhKSwgZCA9IHRoaXMuemUocy5pbmRleElkLCBvLCBoLCAhIXUgJiYgdS5pbmNsdXNpdmUsIGwsICEhYyAmJiBjLmluY2x1c2l2ZSwgZik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1aS5mb3JFYWNoKGQsIChzID0+IG4uR3QocywgZS5saW1pdCkubmV4dCgoZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLmZvckVhY2goKGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0LmFkZChuZXcgeHQoTHMoZS5kb2N1bWVudEtleSkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgfSkpKSk7XG4gICAgICAgICAgICAgICAgfSkpLm5leHQoKCgpID0+IHQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1aS5yZXNvbHZlKG51bGwpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIFFlKHQpIHtcbiAgICAgICAgbGV0IGUgPSB0aGlzLkdlLmdldCh0KTtcbiAgICAgICAgcmV0dXJuIGUgfHwgKFxuICAgICAgICAvLyBUT0RPKG9ycXVlcnkpOiBJbXBsZW1lbnQgRE5GIHRyYW5zZm9ybVxuICAgICAgICBlID0gWyB0IF0sIHRoaXMuR2Uuc2V0KHQsIGUpLCBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIGtleSByYW5nZSBxdWVyeSBvbiBgRGJJbmRleEVudHJ5U3RvcmVgIHRoYXQgdW5pb25zIGFsbFxuICAgICAqIGJvdW5kcy5cbiAgICAgKi8gICAgemUodCwgZSwgbiwgcywgaSwgciwgbykge1xuICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIHRvdGFsIGluZGV4IHNjYW5zIHdlIHVuaW9uIHRvZ2V0aGVyLiBUaGlzIGlzIHNpbWlsYXIgdG8gYVxuICAgICAgICAvLyBkaXN0cmlidXRlZCBub3JtYWwgZm9ybSwgYnV0IGFkYXB0ZWQgZm9yIGFycmF5IHZhbHVlcy4gV2UgY3JlYXRlIGEgc2luZ2xlXG4gICAgICAgIC8vIGluZGV4IHJhbmdlIHBlciB2YWx1ZSBpbiBhbiBBUlJBWV9DT05UQUlOUyBvciBBUlJBWV9DT05UQUlOU19BTlkgZmlsdGVyXG4gICAgICAgIC8vIGNvbWJpbmVkIHdpdGggdGhlIHZhbHVlcyBmcm9tIHRoZSBxdWVyeSBib3VuZHMuXG4gICAgICAgIGNvbnN0IGEgPSAobnVsbCAhPSBlID8gZS5sZW5ndGggOiAxKSAqIE1hdGgubWF4KG51bGwgIT0gbiA/IG4ubGVuZ3RoIDogMSwgbnVsbCAhPSBpID8gaS5sZW5ndGggOiAxKSwgdSA9IGEgLyAobnVsbCAhPSBlID8gZS5sZW5ndGggOiAxKSwgYyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBoID0gMDsgaCA8IGE7ICsraCkge1xuICAgICAgICAgICAgY29uc3QgYSA9IGUgPyB0aGlzLkhlKGVbaCAvIHVdKSA6IGVyLCBsID0gbiA/IHRoaXMuSmUodCwgYSwgbltoICUgdV0sIHMpIDogdGhpcy5ZZSh0KSwgZiA9IGkgPyB0aGlzLlhlKHQsIGEsIGlbaCAlIHVdLCByKSA6IHRoaXMuWWUodCArIDEpO1xuICAgICAgICAgICAgYy5wdXNoKC4uLnRoaXMuY3JlYXRlUmFuZ2UobCwgZiwgby5tYXAoKGUgPT4gdGhpcy5KZSh0LCBhLCBlLCBcbiAgICAgICAgICAgIC8qIGluY2x1c2l2ZT0gKi8gITApKSkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYztcbiAgICB9XG4gICAgLyoqIEdlbmVyYXRlcyB0aGUgbG93ZXIgYm91bmQgZm9yIGBhcnJheVZhbHVlYCBhbmQgYGRpcmVjdGlvbmFsVmFsdWVgLiAqLyAgICBKZSh0LCBlLCBuLCBzKSB7XG4gICAgICAgIGNvbnN0IGkgPSBuZXcgSGkodCwgeHQuZW1wdHkoKSwgZSwgbik7XG4gICAgICAgIHJldHVybiBzID8gaSA6IGkua2UoKTtcbiAgICB9XG4gICAgLyoqIEdlbmVyYXRlcyB0aGUgdXBwZXIgYm91bmQgZm9yIGBhcnJheVZhbHVlYCBhbmQgYGRpcmVjdGlvbmFsVmFsdWVgLiAqLyAgICBYZSh0LCBlLCBuLCBzKSB7XG4gICAgICAgIGNvbnN0IGkgPSBuZXcgSGkodCwgeHQuZW1wdHkoKSwgZSwgbik7XG4gICAgICAgIHJldHVybiBzID8gaS5rZSgpIDogaTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIGFuIGVtcHR5IGJvdW5kIHRoYXQgc2NvcGVzIHRoZSBpbmRleCBzY2FuIHRvIHRoZSBjdXJyZW50IGluZGV4XG4gICAgICogYW5kIHVzZXIuXG4gICAgICovICAgIFllKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBIaSh0LCB4dC5lbXB0eSgpLCBlciwgZXIpO1xuICAgIH1cbiAgICBnZXRGaWVsZEluZGV4KHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IG5ldyBYaShlKSwgcyA9IG51bGwgIT0gZS5jb2xsZWN0aW9uR3JvdXAgPyBlLmNvbGxlY3Rpb25Hcm91cCA6IGUucGF0aC5sYXN0U2VnbWVudCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRGaWVsZEluZGV4ZXModCwgcykubmV4dCgodCA9PiB7XG4gICAgICAgICAgICBjb25zdCBlID0gdC5maWx0ZXIoKHQgPT4gbi5GZSh0KSkpO1xuICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBpbmRleCB0aGF0IG1hdGNoZXMgdGhlIG1vc3QgbnVtYmVyIG9mIHNlZ21lbnRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc29ydCgoKHQsIGUpID0+IGUuZmllbGRzLmxlbmd0aCAtIHQuZmllbGRzLmxlbmd0aCkpLCBlLmxlbmd0aCA+IDAgPyBlWzBdIDogbnVsbDtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBieXRlIGVuY29kZWQgZm9ybSBvZiB0aGUgZGlyZWN0aW9uYWwgdmFsdWVzIGluIHRoZSBmaWVsZCBpbmRleC5cbiAgICAgKiBSZXR1cm5zIGBudWxsYCBpZiB0aGUgZG9jdW1lbnQgZG9lcyBub3QgaGF2ZSBhbGwgZmllbGRzIHNwZWNpZmllZCBpbiB0aGVcbiAgICAgKiBpbmRleC5cbiAgICAgKi8gICAgWmUodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gbmV3IHppO1xuICAgICAgICBmb3IgKGNvbnN0IHMgb2Ygc2UodCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBlLmRhdGEuZmllbGQocy5maWVsZFBhdGgpO1xuICAgICAgICAgICAgaWYgKG51bGwgPT0gdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBpID0gbi5OZShzLmtpbmQpO1xuICAgICAgICAgICAgVWkuZmUuWnQodCwgaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG4uU2UoKTtcbiAgICB9XG4gICAgLyoqIEVuY29kZXMgYSBzaW5nbGUgdmFsdWUgdG8gdGhlIGFzY2VuZGluZyBpbmRleCBmb3JtYXQuICovICAgIEhlKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IG5ldyB6aTtcbiAgICAgICAgcmV0dXJuIFVpLmZlLlp0KHQsIGUuTmUoMCAvKiBBU0NFTkRJTkcgKi8pKSwgZS5TZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmNvZGVzIHRoZSBnaXZlbiBmaWVsZCB2YWx1ZXMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uIGluIGB0YXJnZXRgLlxuICAgICAqIEZvciBJTiBxdWVyaWVzLCBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzIGlzIHJldHVybmVkLlxuICAgICAqLyAgICBXZSh0LCBlLCBuKSB7XG4gICAgICAgIGlmIChudWxsID09PSBuKSByZXR1cm4gW107XG4gICAgICAgIGxldCBzID0gW107XG4gICAgICAgIHMucHVzaChuZXcgemkpO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgciBvZiBzZSh0KSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IG5baSsrXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbiBvZiBzKSBpZiAodGhpcy50bihlLCByLmZpZWxkUGF0aCkgJiYgR3QodCkpIHMgPSB0aGlzLmVuKHMsIHIsIHQpOyBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gbi5OZShyLmtpbmQpO1xuICAgICAgICAgICAgICAgIFVpLmZlLlp0KHQsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm5uKHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmNvZGVzIHRoZSBnaXZlbiBib3VuZHMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uIGluIGB0YXJnZXRgLiBGb3IgSU5cbiAgICAgKiBxdWVyaWVzLCBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzIGlzIHJldHVybmVkLlxuICAgICAqLyAgICBqZSh0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiBudWxsID09IG4gPyBudWxsIDogdGhpcy5XZSh0LCBlLCBuLnBvc2l0aW9uKTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgdGhlIGJ5dGUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBwcm92aWRlZCBlbmNvZGVycy4gKi8gICAgbm4odCkge1xuICAgICAgICBjb25zdCBlID0gW107XG4gICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdC5sZW5ndGg7ICsrbikgZVtuXSA9IHRbbl0uU2UoKTtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzZXBhcmF0ZSBlbmNvZGVyIGZvciBlYWNoIGVsZW1lbnQgb2YgYW4gYXJyYXkuXG4gICAgICpcbiAgICAgKiBUaGUgbWV0aG9kIGFwcGVuZHMgZWFjaCB2YWx1ZSB0byBhbGwgZXhpc3RpbmcgZW5jb2RlcnMgKGUuZy4gZmlsdGVyKFwiYVwiLFxuICAgICAqIFwiPT1cIiwgXCJhMVwiKS5maWx0ZXIoXCJiXCIsIFwiaW5cIiwgW1wiYjFcIiwgXCJiMlwiXSkgYmVjb21lcyBbXCJhMSxiMVwiLCBcImExLGIyXCJdKS4gQVxuICAgICAqIGxpc3Qgb2YgbmV3IGVuY29kZXJzIGlzIHJldHVybmVkLlxuICAgICAqLyAgICBlbih0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSBbIC4uLnQgXSwgaSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHQgb2Ygbi5hcnJheVZhbHVlLnZhbHVlcyB8fCBbXSkgZm9yIChjb25zdCBuIG9mIHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBuZXcgemk7XG4gICAgICAgICAgICBzLnNlZWQobi5TZSgpKSwgVWkuZmUuWnQodCwgcy5OZShlLmtpbmQpKSwgaS5wdXNoKHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgICB0bih0LCBlKSB7XG4gICAgICAgIHJldHVybiAhIXQuZmlsdGVycy5maW5kKCh0ID0+IHQgaW5zdGFuY2VvZiBfZSAmJiB0LmZpZWxkLmlzRXF1YWwoZSkgJiYgKFwiaW5cIiAvKiBJTiAqLyA9PT0gdC5vcCB8fCBcIm5vdC1pblwiIC8qIE5PVF9JTiAqLyA9PT0gdC5vcCkpKTtcbiAgICB9XG4gICAgZ2V0RmllbGRJbmRleGVzKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IHJyKHQpLCBzID0gb3IodCk7XG4gICAgICAgIHJldHVybiAoZSA/IG4uVXQoXCJjb2xsZWN0aW9uR3JvdXBJbmRleFwiLCBJREJLZXlSYW5nZS5ib3VuZChlLCBlKSkgOiBuLlV0KCkpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgY29uc3QgZSA9IFtdO1xuICAgICAgICAgICAgcmV0dXJuIHVpLmZvckVhY2godCwgKHQgPT4gcy5nZXQoWyB0LmluZGV4SWQsIHRoaXMudWlkIF0pLm5leHQoKG4gPT4ge1xuICAgICAgICAgICAgICAgIGUucHVzaChmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBlID8gbmV3IHJlKGUuc2VxdWVuY2VOdW1iZXIsIG5ldyBvZShEaShlLnJlYWRUaW1lKSwgbmV3IHh0KExzKGUuZG9jdW1lbnRLZXkpKSwgZS5sYXJnZXN0QmF0Y2hJZCkpIDogcmUuZW1wdHkoKSwgcyA9IHQuZmllbGRzLm1hcCgoKFt0LCBlXSkgPT4gbmV3IGllKG10LmZyb21TZXJ2ZXJGb3JtYXQodCksIGUpKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgZWUodC5pbmRleElkLCB0LmNvbGxlY3Rpb25Hcm91cCwgcywgbik7XG4gICAgICAgICAgICAgICAgfSh0LCBuKSk7XG4gICAgICAgICAgICB9KSkpKS5uZXh0KCgoKSA9PiBlKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgZ2V0TmV4dENvbGxlY3Rpb25Hcm91cFRvVXBkYXRlKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmllbGRJbmRleGVzKHQpLm5leHQoKHQgPT4gMCA9PT0gdC5sZW5ndGggPyBudWxsIDogKHQuc29ydCgoKHQsIGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0LmluZGV4U3RhdGUuc2VxdWVuY2VOdW1iZXIgLSBlLmluZGV4U3RhdGUuc2VxdWVuY2VOdW1iZXI7XG4gICAgICAgICAgICByZXR1cm4gMCAhPT0gbiA/IG4gOiBydCh0LmNvbGxlY3Rpb25Hcm91cCwgZS5jb2xsZWN0aW9uR3JvdXApO1xuICAgICAgICB9KSksIHRbMF0uY29sbGVjdGlvbkdyb3VwKSkpO1xuICAgIH1cbiAgICB1cGRhdGVDb2xsZWN0aW9uR3JvdXAodCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gcnIodCksIGkgPSBvcih0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc24odCkubmV4dCgodCA9PiBzLlV0KFwiY29sbGVjdGlvbkdyb3VwSW5kZXhcIiwgSURCS2V5UmFuZ2UuYm91bmQoZSwgZSkpLm5leHQoKGUgPT4gdWkuZm9yRWFjaChlLCAoZSA9PiBpLnB1dChmdW5jdGlvbih0LCBlLCBuLCBzKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGluZGV4SWQ6IHQsXG4gICAgICAgICAgICAgICAgdWlkOiBlLnVpZCB8fCBcIlwiLFxuICAgICAgICAgICAgICAgIHNlcXVlbmNlTnVtYmVyOiBuLFxuICAgICAgICAgICAgICAgIHJlYWRUaW1lOiBTaShzLnJlYWRUaW1lKSxcbiAgICAgICAgICAgICAgICBkb2N1bWVudEtleTogJHMocy5kb2N1bWVudEtleS5wYXRoKSxcbiAgICAgICAgICAgICAgICBsYXJnZXN0QmF0Y2hJZDogcy5sYXJnZXN0QmF0Y2hJZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfShlLmluZGV4SWQsIHRoaXMudXNlciwgdCwgbikpKSkpKSkpO1xuICAgIH1cbiAgICB1cGRhdGVJbmRleEVudHJpZXModCwgZSkge1xuICAgICAgICAvLyBQb3J0aW5nIE5vdGU6IGBnZXRGaWVsZEluZGV4ZXMoKWAgb24gV2ViIGRvZXMgbm90IGNhY2hlIGluZGV4IGxvb2t1cHMgYXNcbiAgICAgICAgLy8gaXQgY291bGQgYmUgdXNlZCBhY3Jvc3MgZGlmZmVyZW50IEluZGV4ZWREQiB0cmFuc2FjdGlvbnMuIEFzIGFueSBjYWNoZWRcbiAgICAgICAgLy8gZGF0YSBtaWdodCBiZSBpbnZhbGlkYXRlZCBieSBvdGhlciBtdWx0aS10YWIgY2xpZW50cywgd2UgY2FuIG9ubHkgdHJ1c3RcbiAgICAgICAgLy8gZGF0YSB3aXRoaW4gYSBzaW5nbGUgSW5kZXhlZERCIHRyYW5zYWN0aW9uLiBXZSB0aGVyZWZvcmUgYWRkIGEgY2FjaGVcbiAgICAgICAgLy8gaGVyZS5cbiAgICAgICAgY29uc3QgbiA9IG5ldyBNYXA7XG4gICAgICAgIHJldHVybiB1aS5mb3JFYWNoKGUsICgoZSwgcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgaSA9IG4uZ2V0KGUuY29sbGVjdGlvbkdyb3VwKTtcbiAgICAgICAgICAgIHJldHVybiAoaSA/IHVpLnJlc29sdmUoaSkgOiB0aGlzLmdldEZpZWxkSW5kZXhlcyh0LCBlLmNvbGxlY3Rpb25Hcm91cCkpLm5leHQoKGkgPT4gKG4uc2V0KGUuY29sbGVjdGlvbkdyb3VwLCBpKSwgXG4gICAgICAgICAgICB1aS5mb3JFYWNoKGksIChuID0+IHRoaXMucm4odCwgZSwgbikubmV4dCgoZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMub24ocywgbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaXNFcXVhbChpKSA/IHVpLnJlc29sdmUoKSA6IHRoaXMuYW4odCwgcywgZSwgaSk7XG4gICAgICAgICAgICB9KSkpKSkpKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICB1bih0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiBpcih0KS5wdXQoe1xuICAgICAgICAgICAgaW5kZXhJZDogbi5pbmRleElkLFxuICAgICAgICAgICAgdWlkOiB0aGlzLnVpZCxcbiAgICAgICAgICAgIGFycmF5VmFsdWU6IG4uYXJyYXlWYWx1ZSxcbiAgICAgICAgICAgIGRpcmVjdGlvbmFsVmFsdWU6IG4uZGlyZWN0aW9uYWxWYWx1ZSxcbiAgICAgICAgICAgIGRvY3VtZW50S2V5OiAkcyhlLmtleS5wYXRoKVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY24odCwgZSwgbikge1xuICAgICAgICByZXR1cm4gaXIodCkuZGVsZXRlKFsgbi5pbmRleElkLCB0aGlzLnVpZCwgbi5hcnJheVZhbHVlLCBuLmRpcmVjdGlvbmFsVmFsdWUsICRzKGUua2V5LnBhdGgpIF0pO1xuICAgIH1cbiAgICBybih0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSBpcih0KTtcbiAgICAgICAgbGV0IGkgPSBuZXcga24oSmkpO1xuICAgICAgICByZXR1cm4gcy5XdCh7XG4gICAgICAgICAgICBpbmRleDogXCJkb2N1bWVudEtleUluZGV4XCIsXG4gICAgICAgICAgICByYW5nZTogSURCS2V5UmFuZ2Uub25seShbIG4uaW5kZXhJZCwgdGhpcy51aWQsICRzKGUucGF0aCkgXSlcbiAgICAgICAgfSwgKCh0LCBzKSA9PiB7XG4gICAgICAgICAgICBpID0gaS5hZGQobmV3IEhpKG4uaW5kZXhJZCwgZSwgcy5hcnJheVZhbHVlLCBzLmRpcmVjdGlvbmFsVmFsdWUpKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IGkpKTtcbiAgICB9XG4gICAgLyoqIENyZWF0ZXMgdGhlIGluZGV4IGVudHJpZXMgZm9yIHRoZSBnaXZlbiBkb2N1bWVudC4gKi8gICAgb24odCwgZSkge1xuICAgICAgICBsZXQgbiA9IG5ldyBrbihKaSk7XG4gICAgICAgIGNvbnN0IHMgPSB0aGlzLlplKGUsIHQpO1xuICAgICAgICBpZiAobnVsbCA9PSBzKSByZXR1cm4gbjtcbiAgICAgICAgY29uc3QgaSA9IG5lKGUpO1xuICAgICAgICBpZiAobnVsbCAhPSBpKSB7XG4gICAgICAgICAgICBjb25zdCByID0gdC5kYXRhLmZpZWxkKGkuZmllbGRQYXRoKTtcbiAgICAgICAgICAgIGlmIChHdChyKSkgZm9yIChjb25zdCBpIG9mIHIuYXJyYXlWYWx1ZS52YWx1ZXMgfHwgW10pIG4gPSBuLmFkZChuZXcgSGkoZS5pbmRleElkLCB0LmtleSwgdGhpcy5IZShpKSwgcykpO1xuICAgICAgICB9IGVsc2UgbiA9IG4uYWRkKG5ldyBIaShlLmluZGV4SWQsIHQua2V5LCBlciwgcykpO1xuICAgICAgICByZXR1cm4gbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgaW5kZXggZW50cmllcyBmb3IgdGhlIHByb3ZpZGVkIGRvY3VtZW50IGJ5IGRlbGV0aW5nIGVudHJpZXNcbiAgICAgKiB0aGF0IGFyZSBubyBsb25nZXIgcmVmZXJlbmNlZCBpbiBgbmV3RW50cmllc2AgYW5kIGFkZGluZyBhbGwgbmV3bHkgYWRkZWRcbiAgICAgKiBlbnRyaWVzLlxuICAgICAqLyAgICBhbih0LCBlLCBuLCBzKSB7XG4gICAgICAgIE8oXCJJbmRleGVkRGJJbmRleE1hbmFnZXJcIiwgXCJVcGRhdGluZyBpbmRleCBlbnRyaWVzIGZvciBkb2N1bWVudCAnJXMnXCIsIGUua2V5KTtcbiAgICAgICAgY29uc3QgaSA9IFtdO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24odCwgZSwgbiwgcywgaSkge1xuICAgICAgICAgICAgY29uc3QgciA9IHQuZ2V0SXRlcmF0b3IoKSwgbyA9IGUuZ2V0SXRlcmF0b3IoKTtcbiAgICAgICAgICAgIGxldCBhID0gT24ociksIHUgPSBPbihvKTtcbiAgICAgICAgICAgIC8vIFdhbGsgdGhyb3VnaCB0aGUgdHdvIHNldHMgYXQgdGhlIHNhbWUgdGltZSwgdXNpbmcgdGhlIG9yZGVyaW5nIGRlZmluZWQgYnlcbiAgICAgICAgICAgIC8vIGBjb21wYXJhdG9yYC5cbiAgICAgICAgICAgIGZvciAoO2EgfHwgdTsgKSB7XG4gICAgICAgICAgICAgICAgbGV0IHQgPSAhMSwgZSA9ICExO1xuICAgICAgICAgICAgICAgIGlmIChhICYmIHUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IG4oYSwgdSk7XG4gICAgICAgICAgICAgICAgICAgIHMgPCAwID8gXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBlbGVtZW50IHdhcyByZW1vdmVkIGlmIHRoZSBuZXh0IGVsZW1lbnQgaW4gb3VyIG9yZGVyZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gd2Fsa3Rocm91Z2ggaXMgb25seSBpbiBgYmVmb3JlYC5cbiAgICAgICAgICAgICAgICAgICAgZSA9ICEwIDogcyA+IDAgJiYgKFxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZWxlbWVudCB3YXMgYWRkZWQgaWYgdGhlIG5leHQgZWxlbWVudCBpbiBvdXIgb3JkZXJlZCB3YWxrdGhyb3VnaFxuICAgICAgICAgICAgICAgICAgICAvLyBpcyBvbmx5IGluIGBhZnRlcmAuXG4gICAgICAgICAgICAgICAgICAgIHQgPSAhMCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIG51bGwgIT0gYSA/IGUgPSAhMCA6IHQgPSAhMDtcbiAgICAgICAgICAgICAgICB0ID8gKHModSksIHUgPSBPbihvKSkgOiBlID8gKGkoYSksIGEgPSBPbihyKSkgOiAoYSA9IE9uKHIpLCB1ID0gT24obykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KG4sIHMsIEppLCAoXG4gICAgICAgIC8qIG9uQWRkPSAqLyBuID0+IHtcbiAgICAgICAgICAgIGkucHVzaCh0aGlzLnVuKHQsIGUsIG4pKTtcbiAgICAgICAgfSksIChcbiAgICAgICAgLyogb25SZW1vdmU9ICovIG4gPT4ge1xuICAgICAgICAgICAgaS5wdXNoKHRoaXMuY24odCwgZSwgbikpO1xuICAgICAgICB9KSksIHVpLndhaXRGb3IoaSk7XG4gICAgfVxuICAgIHNuKHQpIHtcbiAgICAgICAgbGV0IGUgPSAxO1xuICAgICAgICByZXR1cm4gb3IodCkuV3Qoe1xuICAgICAgICAgICAgaW5kZXg6IFwic2VxdWVuY2VOdW1iZXJJbmRleFwiLFxuICAgICAgICAgICAgcmV2ZXJzZTogITAsXG4gICAgICAgICAgICByYW5nZTogSURCS2V5UmFuZ2UudXBwZXJCb3VuZChbIHRoaXMudWlkLCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiBdKVxuICAgICAgICB9LCAoKHQsIG4sIHMpID0+IHtcbiAgICAgICAgICAgIHMuZG9uZSgpLCBlID0gbi5zZXF1ZW5jZU51bWJlciArIDE7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiBlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBuZXcgc2V0IG9mIElEQiByYW5nZXMgdGhhdCBzcGxpdHMgdGhlIGV4aXN0aW5nIHJhbmdlIGFuZCBleGNsdWRlc1xuICAgICAqIGFueSB2YWx1ZXMgdGhhdCBtYXRjaCB0aGUgYG5vdEluVmFsdWVgIGZyb20gdGhlc2UgcmFuZ2VzLiBBcyBhbiBleGFtcGxlLFxuICAgICAqICdbZm9vID4gMiAmJiBmb28gIT0gM11gIGJlY29tZXMgIGBbZm9vID4gMiAmJiA8IDMsIGZvbyA+IDNdYC5cbiAgICAgKi8gICAgY3JlYXRlUmFuZ2UodCwgZSwgbikge1xuICAgICAgICAvLyBUaGUgbm90SWIgdmFsdWVzIG5lZWQgdG8gYmUgc29ydGVkIGFuZCB1bmlxdWUgc28gdGhhdCB3ZSBjYW4gcmV0dXJuIGFcbiAgICAgICAgLy8gc29ydGVkIHNldCBvZiBub24tb3ZlcmxhcHBpbmcgcmFuZ2VzLlxuICAgICAgICBuID0gbi5zb3J0KCgodCwgZSkgPT4gSmkodCwgZSkpKS5maWx0ZXIoKCh0LCBlLCBuKSA9PiAhZSB8fCAwICE9PSBKaSh0LCBuW2UgLSAxXSkpKTtcbiAgICAgICAgY29uc3QgcyA9IFtdO1xuICAgICAgICBzLnB1c2godCk7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiBuKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gSmkoaSwgdCksIHIgPSBKaShpLCBlKTtcbiAgICAgICAgICAgIGlmICgwID09PSBuKSBcbiAgICAgICAgICAgIC8vIGBub3RJblZhbHVlYCBpcyB0aGUgbG93ZXIgYm91bmQuIFdlIHRoZXJlZm9yZSBuZWVkIHRvIHJhaXNlIHRoZSBib3VuZFxuICAgICAgICAgICAgLy8gdG8gdGhlIG5leHQgdmFsdWUuXG4gICAgICAgICAgICBzWzBdID0gdC5rZSgpOyBlbHNlIGlmIChuID4gMCAmJiByIDwgMCkgXG4gICAgICAgICAgICAvLyBgbm90SW5WYWx1ZWAgaXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgcmFuZ2VcbiAgICAgICAgICAgIHMucHVzaChpKSwgcy5wdXNoKGkua2UoKSk7IGVsc2UgaWYgKHIgPiAwKSBcbiAgICAgICAgICAgIC8vIGBub3RJblZhbHVlYCAoYW5kIGFsbCBmb2xsb3dpbmcgdmFsdWVzKSBhcmUgb3V0IG9mIHRoZSByYW5nZVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcy5wdXNoKGUpO1xuICAgICAgICBjb25zdCBpID0gW107XG4gICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgcy5sZW5ndGg7IHQgKz0gMikgaS5wdXNoKElEQktleVJhbmdlLmJvdW5kKFsgc1t0XS5pbmRleElkLCB0aGlzLnVpZCwgc1t0XS5hcnJheVZhbHVlLCBzW3RdLmRpcmVjdGlvbmFsVmFsdWUsIFwiXCIgXSwgWyBzW3QgKyAxXS5pbmRleElkLCB0aGlzLnVpZCwgc1t0ICsgMV0uYXJyYXlWYWx1ZSwgc1t0ICsgMV0uZGlyZWN0aW9uYWxWYWx1ZSwgXCJcIiBdKSk7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gZ2V0IGEgdHlwZWQgU2ltcGxlRGJTdG9yZSBmb3IgdGhlIGNvbGxlY3Rpb25QYXJlbnRzXG4gKiBkb2N1bWVudCBzdG9yZS5cbiAqLyBmdW5jdGlvbiBzcih0KSB7XG4gICAgcmV0dXJuIHBpKHQsIFwiY29sbGVjdGlvblBhcmVudHNcIik7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGdldCBhIHR5cGVkIFNpbXBsZURiU3RvcmUgZm9yIHRoZSBpbmRleCBlbnRyeSBvYmplY3Qgc3RvcmUuXG4gKi8gZnVuY3Rpb24gaXIodCkge1xuICAgIHJldHVybiBwaSh0LCBcImluZGV4RW50cmllc1wiKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gZ2V0IGEgdHlwZWQgU2ltcGxlRGJTdG9yZSBmb3IgdGhlIGluZGV4IGNvbmZpZ3VyYXRpb24gb2JqZWN0IHN0b3JlLlxuICovIGZ1bmN0aW9uIHJyKHQpIHtcbiAgICByZXR1cm4gcGkodCwgXCJpbmRleENvbmZpZ3VyYXRpb25cIik7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGdldCBhIHR5cGVkIFNpbXBsZURiU3RvcmUgZm9yIHRoZSBpbmRleCBzdGF0ZSBvYmplY3Qgc3RvcmUuXG4gKi8gZnVuY3Rpb24gb3IodCkge1xuICAgIHJldHVybiBwaSh0LCBcImluZGV4U3RhdGVcIik7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGNvbnN0IGFyID0ge1xuICAgIGRpZFJ1bjogITEsXG4gICAgc2VxdWVuY2VOdW1iZXJzQ29sbGVjdGVkOiAwLFxuICAgIHRhcmdldHNSZW1vdmVkOiAwLFxuICAgIGRvY3VtZW50c1JlbW92ZWQ6IDBcbn07XG5cbmNsYXNzIHVyIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvLyBXaGVuIHdlIGF0dGVtcHQgdG8gY29sbGVjdCwgd2Ugd2lsbCBvbmx5IGRvIHNvIGlmIHRoZSBjYWNoZSBzaXplIGlzIGdyZWF0ZXIgdGhhbiB0aGlzXG4gICAgLy8gdGhyZXNob2xkLiBQYXNzaW5nIGBDT0xMRUNUSU9OX0RJU0FCTEVEYCBoZXJlIHdpbGwgY2F1c2UgY29sbGVjdGlvbiB0byBhbHdheXMgYmUgc2tpcHBlZC5cbiAgICB0LCBcbiAgICAvLyBUaGUgcGVyY2VudGFnZSBvZiBzZXF1ZW5jZSBudW1iZXJzIHRoYXQgd2Ugd2lsbCBhdHRlbXB0IHRvIGNvbGxlY3RcbiAgICBlLCBcbiAgICAvLyBBIGNhcCBvbiB0aGUgdG90YWwgbnVtYmVyIG9mIHNlcXVlbmNlIG51bWJlcnMgdGhhdCB3aWxsIGJlIGNvbGxlY3RlZC4gVGhpcyBwcmV2ZW50c1xuICAgIC8vIHVzIGZyb20gY29sbGVjdGluZyBhIGh1Z2UgbnVtYmVyIG9mIHNlcXVlbmNlIG51bWJlcnMgaWYgdGhlIGNhY2hlIGhhcyBncm93biB2ZXJ5IGxhcmdlLlxuICAgIG4pIHtcbiAgICAgICAgdGhpcy5jYWNoZVNpemVDb2xsZWN0aW9uVGhyZXNob2xkID0gdCwgdGhpcy5wZXJjZW50aWxlVG9Db2xsZWN0ID0gZSwgdGhpcy5tYXhpbXVtU2VxdWVuY2VOdW1iZXJzVG9Db2xsZWN0ID0gbjtcbiAgICB9XG4gICAgc3RhdGljIHdpdGhDYWNoZVNpemUodCkge1xuICAgICAgICByZXR1cm4gbmV3IHVyKHQsIHVyLkRFRkFVTFRfQ09MTEVDVElPTl9QRVJDRU5USUxFLCB1ci5ERUZBVUxUX01BWF9TRVFVRU5DRV9OVU1CRVJTX1RPX0NPTExFQ1QpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogRGVsZXRlIGEgbXV0YXRpb24gYmF0Y2ggYW5kIHRoZSBhc3NvY2lhdGVkIGRvY3VtZW50IG11dGF0aW9ucy5cbiAqIEByZXR1cm5zIEEgUGVyc2lzdGVuY2VQcm9taXNlIG9mIHRoZSBkb2N1bWVudCBtdXRhdGlvbnMgdGhhdCB3ZXJlIHJlbW92ZWQuXG4gKi9cbmZ1bmN0aW9uIGNyKHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gdC5zdG9yZShcIm11dGF0aW9uc1wiKSwgaSA9IHQuc3RvcmUoXCJkb2N1bWVudE11dGF0aW9uc1wiKSwgciA9IFtdLCBvID0gSURCS2V5UmFuZ2Uub25seShuLmJhdGNoSWQpO1xuICAgIGxldCBhID0gMDtcbiAgICBjb25zdCB1ID0gcy5XdCh7XG4gICAgICAgIHJhbmdlOiBvXG4gICAgfSwgKCh0LCBlLCBuKSA9PiAoYSsrLCBuLmRlbGV0ZSgpKSkpO1xuICAgIHIucHVzaCh1Lm5leHQoKCgpID0+IHtcbiAgICAgICAgcSgxID09PSBhKTtcbiAgICB9KSkpO1xuICAgIGNvbnN0IGMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHQgb2Ygbi5tdXRhdGlvbnMpIHtcbiAgICAgICAgY29uc3QgcyA9IEtzKGUsIHQua2V5LnBhdGgsIG4uYmF0Y2hJZCk7XG4gICAgICAgIHIucHVzaChpLmRlbGV0ZShzKSksIGMucHVzaCh0LmtleSk7XG4gICAgfVxuICAgIHJldHVybiB1aS53YWl0Rm9yKHIpLm5leHQoKCgpID0+IGMpKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFwcHJveGltYXRlIHNpemUgZm9yIHRoZSBnaXZlbiBkb2N1bWVudC5cbiAqLyBmdW5jdGlvbiBocih0KSB7XG4gICAgaWYgKCF0KSByZXR1cm4gMDtcbiAgICBsZXQgZTtcbiAgICBpZiAodC5kb2N1bWVudCkgZSA9IHQuZG9jdW1lbnQ7IGVsc2UgaWYgKHQudW5rbm93bkRvY3VtZW50KSBlID0gdC51bmtub3duRG9jdW1lbnQ7IGVsc2Uge1xuICAgICAgICBpZiAoIXQubm9Eb2N1bWVudCkgdGhyb3cgTCgpO1xuICAgICAgICBlID0gdC5ub0RvY3VtZW50O1xuICAgIH1cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSkubGVuZ3RoO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqIEEgbXV0YXRpb24gcXVldWUgZm9yIGEgc3BlY2lmaWMgdXNlciwgYmFja2VkIGJ5IEluZGV4ZWREQi4gKi8gdXIuREVGQVVMVF9DT0xMRUNUSU9OX1BFUkNFTlRJTEUgPSAxMCwgXG51ci5ERUZBVUxUX01BWF9TRVFVRU5DRV9OVU1CRVJTX1RPX0NPTExFQ1QgPSAxZTMsIHVyLkRFRkFVTFQgPSBuZXcgdXIoNDE5NDMwNDAsIHVyLkRFRkFVTFRfQ09MTEVDVElPTl9QRVJDRU5USUxFLCB1ci5ERUZBVUxUX01BWF9TRVFVRU5DRV9OVU1CRVJTX1RPX0NPTExFQ1QpLCBcbnVyLkRJU0FCTEVEID0gbmV3IHVyKC0xLCAwLCAwKTtcblxuY2xhc3MgbHIge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIFRoZSBub3JtYWxpemVkIHVzZXJJZCAoZS5nLiBudWxsIFVJRCA9PiBcIlwiIHVzZXJJZCkgdXNlZCB0byBzdG9yZSAvXG4gICAgICogcmV0cmlldmUgbXV0YXRpb25zLlxuICAgICAqL1xuICAgIHQsIGUsIG4sIHMpIHtcbiAgICAgICAgdGhpcy51c2VySWQgPSB0LCB0aGlzLk0gPSBlLCB0aGlzLmluZGV4TWFuYWdlciA9IG4sIHRoaXMucmVmZXJlbmNlRGVsZWdhdGUgPSBzLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhY2hlcyB0aGUgZG9jdW1lbnQga2V5cyBmb3IgcGVuZGluZyBtdXRhdGlvbiBiYXRjaGVzLiBJZiB0aGUgbXV0YXRpb25cbiAgICAgICAgICogaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIEluZGV4ZWREYiwgdGhlIGNhY2hlZCB2YWx1ZSBtYXkgY29udGludWUgdG9cbiAgICAgICAgICogYmUgdXNlZCB0byByZXRyaWV2ZSB0aGUgYmF0Y2gncyBkb2N1bWVudCBrZXlzLiBUbyByZW1vdmUgYSBjYWNoZWQgdmFsdWVcbiAgICAgICAgICogbG9jYWxseSwgYHJlbW92ZUNhY2hlZE11dGF0aW9uS2V5cygpYCBzaG91bGQgYmUgaW52b2tlZCBlaXRoZXIgZGlyZWN0bHlcbiAgICAgICAgICogb3IgdGhyb3VnaCBgcmVtb3ZlTXV0YXRpb25CYXRjaGVzKClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBXaXRoIG11bHRpLXRhYiwgd2hlbiB0aGUgcHJpbWFyeSBjbGllbnQgYWNrbm93bGVkZ2VzIG9yIHJlamVjdHMgYSBtdXRhdGlvbixcbiAgICAgICAgICogdGhpcyBjYWNoZSBpcyB1c2VkIGJ5IHNlY29uZGFyeSBjbGllbnRzIHRvIGludmFsaWRhdGUgdGhlIGxvY2FsXG4gICAgICAgICAqIHZpZXcgb2YgdGhlIGRvY3VtZW50cyB0aGF0IHdlcmUgcHJldmlvdXNseSBhZmZlY3RlZCBieSB0aGUgbXV0YXRpb24uXG4gICAgICAgICAqL1xuICAgICAgICAvLyBQT1JUSU5HIE5PVEU6IE11bHRpLXRhYiBvbmx5LlxuICAgICAgICB0aGlzLmhuID0ge307XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgbXV0YXRpb24gcXVldWUgZm9yIHRoZSBnaXZlbiB1c2VyLlxuICAgICAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIgZm9yIHdoaWNoIHRvIGNyZWF0ZSBhIG11dGF0aW9uIHF1ZXVlLlxuICAgICAqIEBwYXJhbSBzZXJpYWxpemVyIC0gVGhlIHNlcmlhbGl6ZXIgdG8gdXNlIHdoZW4gcGVyc2lzdGluZyB0byBJbmRleGVkRGIuXG4gICAgICovICAgIHN0YXRpYyBZdCh0LCBlLCBuLCBzKSB7XG4gICAgICAgIC8vIFRPRE8obWNnKTogRmlndXJlIG91dCB3aGF0IGNvbnN0cmFpbnRzIHRoZXJlIGFyZSBvbiB1c2VySURzXG4gICAgICAgIC8vIEluIHBhcnRpY3VsYXIsIGFyZSB0aGVyZSBhbnkgcmVzZXJ2ZWQgY2hhcmFjdGVycz8gYXJlIGVtcHR5IGlkcyBhbGxvd2VkP1xuICAgICAgICAvLyBGb3IgdGhlIG1vbWVudCBzdG9yZSB0aGVzZSB0b2dldGhlciBpbiB0aGUgc2FtZSBtdXRhdGlvbnMgdGFibGUgYXNzdW1pbmdcbiAgICAgICAgLy8gdGhhdCBlbXB0eSB1c2VySURzIGFyZW4ndCBhbGxvd2VkLlxuICAgICAgICBxKFwiXCIgIT09IHQudWlkKTtcbiAgICAgICAgY29uc3QgaSA9IHQuaXNBdXRoZW50aWNhdGVkKCkgPyB0LnVpZCA6IFwiXCI7XG4gICAgICAgIHJldHVybiBuZXcgbHIoaSwgZSwgbiwgcyk7XG4gICAgfVxuICAgIGNoZWNrRW1wdHkodCkge1xuICAgICAgICBsZXQgZSA9ICEwO1xuICAgICAgICBjb25zdCBuID0gSURCS2V5UmFuZ2UuYm91bmQoWyB0aGlzLnVzZXJJZCwgTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZIF0sIFsgdGhpcy51c2VySWQsIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSBdKTtcbiAgICAgICAgcmV0dXJuIGRyKHQpLld0KHtcbiAgICAgICAgICAgIGluZGV4OiBcInVzZXJNdXRhdGlvbnNJbmRleFwiLFxuICAgICAgICAgICAgcmFuZ2U6IG5cbiAgICAgICAgfSwgKCh0LCBuLCBzKSA9PiB7XG4gICAgICAgICAgICBlID0gITEsIHMuZG9uZSgpO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4gZSkpO1xuICAgIH1cbiAgICBhZGRNdXRhdGlvbkJhdGNoKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgY29uc3QgaSA9IF9yKHQpLCByID0gZHIodCk7XG4gICAgICAgIC8vIFRoZSBJbmRleGVkRGIgaW1wbGVtZW50YXRpb24gaW4gQ2hyb21lIChhbmQgRmlyZWZveCkgZG9lcyBub3QgaGFuZGxlXG4gICAgICAgIC8vIGNvbXBvdW5kIGluZGljZXMgdGhhdCBpbmNsdWRlIGF1dG8tZ2VuZXJhdGVkIGtleXMgY29ycmVjdGx5LiBUbyBlbnN1cmVcbiAgICAgICAgLy8gdGhhdCB0aGUgaW5kZXggZW50cnkgaXMgYWRkZWQgY29ycmVjdGx5IGluIGFsbCBicm93c2Vycywgd2UgcGVyZm9ybSB0d29cbiAgICAgICAgLy8gd3JpdGVzOiBUaGUgZmlyc3Qgd3JpdGUgaXMgdXNlZCB0byByZXRyaWV2ZSB0aGUgbmV4dCBhdXRvLWdlbmVyYXRlZCBCYXRjaFxuICAgICAgICAvLyBJRCwgYW5kIHRoZSBzZWNvbmQgd3JpdGUgcG9wdWxhdGVzIHRoZSBpbmRleCBhbmQgc3RvcmVzIHRoZSBhY3R1YWxcbiAgICAgICAgLy8gbXV0YXRpb24gYmF0Y2guXG4gICAgICAgIC8vIFNlZTogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NzAxOTcyXG4gICAgICAgIC8vIFdlIHdyaXRlIGFuIGVtcHR5IG9iamVjdCB0byBvYnRhaW4ga2V5XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHJldHVybiByLmFkZCh7fSkubmV4dCgobyA9PiB7XG4gICAgICAgICAgICBxKFwibnVtYmVyXCIgPT0gdHlwZW9mIG8pO1xuICAgICAgICAgICAgY29uc3QgYSA9IG5ldyBJaShvLCBlLCBuLCBzKSwgdSA9IGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzID0gbi5iYXNlTXV0YXRpb25zLm1hcCgoZSA9PiBUcyh0Lkp0LCBlKSkpLCBpID0gbi5tdXRhdGlvbnMubWFwKChlID0+IFRzKHQuSnQsIGUpKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdXNlcklkOiBlLFxuICAgICAgICAgICAgICAgICAgICBiYXRjaElkOiBuLmJhdGNoSWQsXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsV3JpdGVUaW1lTXM6IG4ubG9jYWxXcml0ZVRpbWUudG9NaWxsaXMoKSxcbiAgICAgICAgICAgICAgICAgICAgYmFzZU11dGF0aW9uczogcyxcbiAgICAgICAgICAgICAgICAgICAgbXV0YXRpb25zOiBpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0odGhpcy5NLCB0aGlzLnVzZXJJZCwgYSksIGMgPSBbXTtcbiAgICAgICAgICAgIGxldCBoID0gbmV3IGtuKCgodCwgZSkgPT4gcnQodC5jYW5vbmljYWxTdHJpbmcoKSwgZS5jYW5vbmljYWxTdHJpbmcoKSkpKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IEtzKHRoaXMudXNlcklkLCB0LmtleS5wYXRoLCBvKTtcbiAgICAgICAgICAgICAgICBoID0gaC5hZGQodC5rZXkucGF0aC5wb3BMYXN0KCkpLCBjLnB1c2goci5wdXQodSkpLCBjLnB1c2goaS5wdXQoZSwgR3MpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBoLmZvckVhY2goKGUgPT4ge1xuICAgICAgICAgICAgICAgIGMucHVzaCh0aGlzLmluZGV4TWFuYWdlci5hZGRUb0NvbGxlY3Rpb25QYXJlbnRJbmRleCh0LCBlKSk7XG4gICAgICAgICAgICB9KSksIHQuYWRkT25Db21taXR0ZWRMaXN0ZW5lcigoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaG5bb10gPSBhLmtleXMoKTtcbiAgICAgICAgICAgIH0pKSwgdWkud2FpdEZvcihjKS5uZXh0KCgoKSA9PiBhKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgbG9va3VwTXV0YXRpb25CYXRjaCh0LCBlKSB7XG4gICAgICAgIHJldHVybiBkcih0KS5nZXQoZSkubmV4dCgodCA9PiB0ID8gKHEodC51c2VySWQgPT09IHRoaXMudXNlcklkKSwgQ2kodGhpcy5NLCB0KSkgOiBudWxsKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRvY3VtZW50IGtleXMgZm9yIHRoZSBtdXRhdGlvbiBiYXRjaCB3aXRoIHRoZSBnaXZlbiBiYXRjaElkLlxuICAgICAqIEZvciBwcmltYXJ5IGNsaWVudHMsIHRoaXMgbWV0aG9kIHJldHVybnMgYG51bGxgIGFmdGVyXG4gICAgICogYHJlbW92ZU11dGF0aW9uQmF0Y2hlcygpYCBoYXMgYmVlbiBjYWxsZWQuIFNlY29uZGFyeSBjbGllbnRzIHJldHVybiBhXG4gICAgICogY2FjaGVkIHJlc3VsdCB1bnRpbCBgcmVtb3ZlQ2FjaGVkTXV0YXRpb25LZXlzKClgIGlzIGludm9rZWQuXG4gICAgICovXG4gICAgLy8gUE9SVElORyBOT1RFOiBNdWx0aS10YWIgb25seS5cbiAgICBsbih0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhuW2VdID8gdWkucmVzb2x2ZSh0aGlzLmhuW2VdKSA6IHRoaXMubG9va3VwTXV0YXRpb25CYXRjaCh0LCBlKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgIGlmICh0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbiA9IHQua2V5cygpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhuW2VdID0gbiwgbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGdldE5leHRNdXRhdGlvbkJhdGNoQWZ0ZXJCYXRjaElkKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IGUgKyAxLCBzID0gSURCS2V5UmFuZ2UubG93ZXJCb3VuZChbIHRoaXMudXNlcklkLCBuIF0pO1xuICAgICAgICBsZXQgaSA9IG51bGw7XG4gICAgICAgIHJldHVybiBkcih0KS5XdCh7XG4gICAgICAgICAgICBpbmRleDogXCJ1c2VyTXV0YXRpb25zSW5kZXhcIixcbiAgICAgICAgICAgIHJhbmdlOiBzXG4gICAgICAgIH0sICgodCwgZSwgcykgPT4ge1xuICAgICAgICAgICAgZS51c2VySWQgPT09IHRoaXMudXNlcklkICYmIChxKGUuYmF0Y2hJZCA+PSBuKSwgaSA9IENpKHRoaXMuTSwgZSkpLCBzLmRvbmUoKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IGkpKTtcbiAgICB9XG4gICAgZ2V0SGlnaGVzdFVuYWNrbm93bGVkZ2VkQmF0Y2hJZCh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBJREJLZXlSYW5nZS51cHBlckJvdW5kKFsgdGhpcy51c2VySWQsIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSBdKTtcbiAgICAgICAgbGV0IG4gPSAtMTtcbiAgICAgICAgcmV0dXJuIGRyKHQpLld0KHtcbiAgICAgICAgICAgIGluZGV4OiBcInVzZXJNdXRhdGlvbnNJbmRleFwiLFxuICAgICAgICAgICAgcmFuZ2U6IGUsXG4gICAgICAgICAgICByZXZlcnNlOiAhMFxuICAgICAgICB9LCAoKHQsIGUsIHMpID0+IHtcbiAgICAgICAgICAgIG4gPSBlLmJhdGNoSWQsIHMuZG9uZSgpO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4gbikpO1xuICAgIH1cbiAgICBnZXRBbGxNdXRhdGlvbkJhdGNoZXModCkge1xuICAgICAgICBjb25zdCBlID0gSURCS2V5UmFuZ2UuYm91bmQoWyB0aGlzLnVzZXJJZCwgLTEgXSwgWyB0aGlzLnVzZXJJZCwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIF0pO1xuICAgICAgICByZXR1cm4gZHIodCkuVXQoXCJ1c2VyTXV0YXRpb25zSW5kZXhcIiwgZSkubmV4dCgodCA9PiB0Lm1hcCgodCA9PiBDaSh0aGlzLk0sIHQpKSkpKTtcbiAgICB9XG4gICAgZ2V0QWxsTXV0YXRpb25CYXRjaGVzQWZmZWN0aW5nRG9jdW1lbnRLZXkodCwgZSkge1xuICAgICAgICAvLyBTY2FuIHRoZSBkb2N1bWVudC1tdXRhdGlvbiBpbmRleCBzdGFydGluZyB3aXRoIGEgcHJlZml4IHN0YXJ0aW5nIHdpdGhcbiAgICAgICAgLy8gdGhlIGdpdmVuIGRvY3VtZW50S2V5LlxuICAgICAgICBjb25zdCBuID0gVXModGhpcy51c2VySWQsIGUucGF0aCksIHMgPSBJREJLZXlSYW5nZS5sb3dlckJvdW5kKG4pLCBpID0gW107XG4gICAgICAgIHJldHVybiBfcih0KS5XdCh7XG4gICAgICAgICAgICByYW5nZTogc1xuICAgICAgICB9LCAoKG4sIHMsIHIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFtvLCBhLCB1XSA9IG4sIGMgPSBMcyhhKTtcbiAgICAgICAgICAgIC8vIE9ubHkgY29uc2lkZXIgcm93cyBtYXRjaGluZyBleGFjdGx5IHRoZSBzcGVjaWZpYyBrZXkgb2ZcbiAgICAgICAgICAgIC8vIGludGVyZXN0LiBOb3RlIHRoYXQgYmVjYXVzZSB3ZSBvcmRlciBieSBwYXRoIGZpcnN0LCBhbmQgd2VcbiAgICAgICAgICAgIC8vIG9yZGVyIHRlcm1pbmF0b3JzIGJlZm9yZSBwYXRoIHNlcGFyYXRvcnMsIHdlJ2xsIGVuY291bnRlciBhbGxcbiAgICAgICAgICAgIC8vIHRoZSBpbmRleCByb3dzIGZvciBkb2N1bWVudEtleSBjb250aWd1b3VzbHkuIEluIHBhcnRpY3VsYXIsIGFsbFxuICAgICAgICAgICAgLy8gdGhlIHJvd3MgZm9yIGRvY3VtZW50S2V5IHdpbGwgb2NjdXIgYmVmb3JlIGFueSByb3dzIGZvclxuICAgICAgICAgICAgLy8gZG9jdW1lbnRzIG5lc3RlZCBpbiBhIHN1YmNvbGxlY3Rpb24gYmVuZWF0aCBkb2N1bWVudEtleSBzbyB3ZVxuICAgICAgICAgICAgLy8gY2FuIHN0b3AgYXMgc29vbiBhcyB3ZSBoaXQgYW55IHN1Y2ggcm93LlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gPT09IHRoaXMudXNlcklkICYmIGUucGF0aC5pc0VxdWFsKGMpKSBcbiAgICAgICAgICAgIC8vIExvb2sgdXAgdGhlIG11dGF0aW9uIGJhdGNoIGluIHRoZSBzdG9yZS5cbiAgICAgICAgICAgIHJldHVybiBkcih0KS5nZXQodSkubmV4dCgodCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0KSB0aHJvdyBMKCk7XG4gICAgICAgICAgICAgICAgcSh0LnVzZXJJZCA9PT0gdGhpcy51c2VySWQpLCBpLnB1c2goQ2kodGhpcy5NLCB0KSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByLmRvbmUoKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IGkpKTtcbiAgICB9XG4gICAgZ2V0QWxsTXV0YXRpb25CYXRjaGVzQWZmZWN0aW5nRG9jdW1lbnRLZXlzKHQsIGUpIHtcbiAgICAgICAgbGV0IG4gPSBuZXcga24ocnQpO1xuICAgICAgICBjb25zdCBzID0gW107XG4gICAgICAgIHJldHVybiBlLmZvckVhY2goKGUgPT4ge1xuICAgICAgICAgICAgY29uc3QgaSA9IFVzKHRoaXMudXNlcklkLCBlLnBhdGgpLCByID0gSURCS2V5UmFuZ2UubG93ZXJCb3VuZChpKSwgbyA9IF9yKHQpLld0KHtcbiAgICAgICAgICAgICAgICByYW5nZTogclxuICAgICAgICAgICAgfSwgKCh0LCBzLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW3IsIG8sIGFdID0gdCwgdSA9IExzKG8pO1xuICAgICAgICAgICAgICAgIC8vIE9ubHkgY29uc2lkZXIgcm93cyBtYXRjaGluZyBleGFjdGx5IHRoZSBzcGVjaWZpYyBrZXkgb2ZcbiAgICAgICAgICAgICAgICAvLyBpbnRlcmVzdC4gTm90ZSB0aGF0IGJlY2F1c2Ugd2Ugb3JkZXIgYnkgcGF0aCBmaXJzdCwgYW5kIHdlXG4gICAgICAgICAgICAgICAgLy8gb3JkZXIgdGVybWluYXRvcnMgYmVmb3JlIHBhdGggc2VwYXJhdG9ycywgd2UnbGwgZW5jb3VudGVyIGFsbFxuICAgICAgICAgICAgICAgIC8vIHRoZSBpbmRleCByb3dzIGZvciBkb2N1bWVudEtleSBjb250aWd1b3VzbHkuIEluIHBhcnRpY3VsYXIsIGFsbFxuICAgICAgICAgICAgICAgIC8vIHRoZSByb3dzIGZvciBkb2N1bWVudEtleSB3aWxsIG9jY3VyIGJlZm9yZSBhbnkgcm93cyBmb3JcbiAgICAgICAgICAgICAgICAvLyBkb2N1bWVudHMgbmVzdGVkIGluIGEgc3ViY29sbGVjdGlvbiBiZW5lYXRoIGRvY3VtZW50S2V5IHNvIHdlXG4gICAgICAgICAgICAgICAgLy8gY2FuIHN0b3AgYXMgc29vbiBhcyB3ZSBoaXQgYW55IHN1Y2ggcm93LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID09PSB0aGlzLnVzZXJJZCAmJiBlLnBhdGguaXNFcXVhbCh1KSA/IG4gPSBuLmFkZChhKSA6IGkuZG9uZSgpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcy5wdXNoKG8pO1xuICAgICAgICB9KSksIHVpLndhaXRGb3IocykubmV4dCgoKCkgPT4gdGhpcy5mbih0LCBuKSkpO1xuICAgIH1cbiAgICBnZXRBbGxNdXRhdGlvbkJhdGNoZXNBZmZlY3RpbmdRdWVyeSh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBlLnBhdGgsIHMgPSBuLmxlbmd0aCArIDEsIGkgPSBVcyh0aGlzLnVzZXJJZCwgbiksIHIgPSBJREJLZXlSYW5nZS5sb3dlckJvdW5kKGkpO1xuICAgICAgICAvLyBDb2xsZWN0IHVwIHVuaXF1ZSBiYXRjaElEcyBlbmNvdW50ZXJlZCBkdXJpbmcgYSBzY2FuIG9mIHRoZSBpbmRleC4gVXNlIGFcbiAgICAgICAgLy8gU29ydGVkU2V0IHRvIGFjY3VtdWxhdGUgYmF0Y2ggSURzIHNvIHRoZXkgY2FuIGJlIHRyYXZlcnNlZCBpbiBvcmRlciBpbiBhXG4gICAgICAgIC8vIHNjYW4gb2YgdGhlIG1haW4gdGFibGUuXG4gICAgICAgIGxldCBvID0gbmV3IGtuKHJ0KTtcbiAgICAgICAgcmV0dXJuIF9yKHQpLld0KHtcbiAgICAgICAgICAgIHJhbmdlOiByXG4gICAgICAgIH0sICgodCwgZSwgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgW3IsIGEsIHVdID0gdCwgYyA9IExzKGEpO1xuICAgICAgICAgICAgciA9PT0gdGhpcy51c2VySWQgJiYgbi5pc1ByZWZpeE9mKGMpID8gXG4gICAgICAgICAgICAvLyBSb3dzIHdpdGggZG9jdW1lbnQga2V5cyBtb3JlIHRoYW4gb25lIHNlZ21lbnQgbG9uZ2VyIHRoYW4gdGhlXG4gICAgICAgICAgICAvLyBxdWVyeSBwYXRoIGNhbid0IGJlIG1hdGNoZXMuIEZvciBleGFtcGxlLCBhIHF1ZXJ5IG9uICdyb29tcydcbiAgICAgICAgICAgIC8vIGNhbid0IG1hdGNoIHRoZSBkb2N1bWVudCAvcm9vbXMvYWJjL21lc3NhZ2VzL3h5eC5cbiAgICAgICAgICAgIC8vIFRPRE8obWNnKTogd2UnbGwgbmVlZCBhIGRpZmZlcmVudCBzY2FubmVyIHdoZW4gd2UgaW1wbGVtZW50XG4gICAgICAgICAgICAvLyBhbmNlc3RvciBxdWVyaWVzLlxuICAgICAgICAgICAgYy5sZW5ndGggPT09IHMgJiYgKG8gPSBvLmFkZCh1KSkgOiBpLmRvbmUoKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IHRoaXMuZm4odCwgbykpKTtcbiAgICB9XG4gICAgZm4odCwgZSkge1xuICAgICAgICBjb25zdCBuID0gW10sIHMgPSBbXTtcbiAgICAgICAgLy8gVE9ETyhyb2Nrd29vZCk6IEltcGxlbWVudCB0aGlzIHVzaW5nIGl0ZXJhdGUuXG4gICAgICAgIHJldHVybiBlLmZvckVhY2goKGUgPT4ge1xuICAgICAgICAgICAgcy5wdXNoKGRyKHQpLmdldChlKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gdCkgdGhyb3cgTCgpO1xuICAgICAgICAgICAgICAgIHEodC51c2VySWQgPT09IHRoaXMudXNlcklkKSwgbi5wdXNoKENpKHRoaXMuTSwgdCkpO1xuICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgfSkpLCB1aS53YWl0Rm9yKHMpLm5leHQoKCgpID0+IG4pKTtcbiAgICB9XG4gICAgcmVtb3ZlTXV0YXRpb25CYXRjaCh0LCBlKSB7XG4gICAgICAgIHJldHVybiBjcih0Lkh0LCB0aGlzLnVzZXJJZCwgZSkubmV4dCgobiA9PiAodC5hZGRPbkNvbW1pdHRlZExpc3RlbmVyKCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRuKGUuYmF0Y2hJZCk7XG4gICAgICAgIH0pKSwgdWkuZm9yRWFjaChuLCAoZSA9PiB0aGlzLnJlZmVyZW5jZURlbGVnYXRlLm1hcmtQb3RlbnRpYWxseU9ycGhhbmVkKHQsIGUpKSkpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgY2FjaGVkIGtleXMgZm9yIGEgbXV0YXRpb24gYmF0Y2guIFRoaXMgbWV0aG9kIHNob3VsZCBiZVxuICAgICAqIGNhbGxlZCBieSBzZWNvbmRhcnkgY2xpZW50cyBhZnRlciB0aGV5IHByb2Nlc3MgbXV0YXRpb24gdXBkYXRlcy5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBkb2VzIG5vdCBoYXZlIHRvIGJlIGNhbGxlZCBmcm9tIHByaW1hcnkgY2xpZW50cyBhc1xuICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIGNhY2hlIGVudHJpZXMgYXJlIGNsZWFyZWQgd2hlbiBhbiBhY2tub3dsZWRnZWQgb3JcbiAgICAgKiByZWplY3RlZCBiYXRjaCBpcyByZW1vdmVkIGZyb20gdGhlIG11dGF0aW9uIHF1ZXVlLlxuICAgICAqL1xuICAgIC8vIFBPUlRJTkcgTk9URTogTXVsdGktdGFiIG9ubHlcbiAgICBkbih0KSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmhuW3RdO1xuICAgIH1cbiAgICBwZXJmb3JtQ29uc2lzdGVuY3lDaGVjayh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoZWNrRW1wdHkodCkubmV4dCgoZSA9PiB7XG4gICAgICAgICAgICBpZiAoIWUpIHJldHVybiB1aS5yZXNvbHZlKCk7XG4gICAgICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGVyZSBhcmUgbm8gZW50cmllcyBpbiB0aGUgZG9jdW1lbnRNdXRhdGlvbnMgaW5kZXggaWZcbiAgICAgICAgICAgIC8vIHRoZSBxdWV1ZSBpcyBlbXB0eS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBJREJLZXlSYW5nZS5sb3dlckJvdW5kKFsgdGhpcy51c2VySWQgXSk7XG4gICAgICAgICAgICBjb25zdCBzID0gW107XG4gICAgICAgICAgICByZXR1cm4gX3IodCkuV3Qoe1xuICAgICAgICAgICAgICAgIHJhbmdlOiBuXG4gICAgICAgICAgICB9LCAoKHQsIGUsIG4pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodFswXSA9PT0gdGhpcy51c2VySWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IExzKHRbMV0pO1xuICAgICAgICAgICAgICAgICAgICBzLnB1c2goZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIG4uZG9uZSgpO1xuICAgICAgICAgICAgfSkpLm5leHQoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBxKDAgPT09IHMubGVuZ3RoKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBjb250YWluc0tleSh0LCBlKSB7XG4gICAgICAgIHJldHVybiBmcih0LCB0aGlzLnVzZXJJZCwgZSk7XG4gICAgfVxuICAgIC8vIFBPUlRJTkcgTk9URTogTXVsdGktdGFiIG9ubHkgKHN0YXRlIGlzIGhlbGQgaW4gbWVtb3J5IGluIG90aGVyIGNsaWVudHMpLlxuICAgIC8qKiBSZXR1cm5zIHRoZSBtdXRhdGlvbiBxdWV1ZSdzIG1ldGFkYXRhIGZyb20gSW5kZXhlZERiLiAqL1xuICAgIF9uKHQpIHtcbiAgICAgICAgcmV0dXJuIHdyKHQpLmdldCh0aGlzLnVzZXJJZCkubmV4dCgodCA9PiB0IHx8IHtcbiAgICAgICAgICAgIHVzZXJJZDogdGhpcy51c2VySWQsXG4gICAgICAgICAgICBsYXN0QWNrbm93bGVkZ2VkQmF0Y2hJZDogLTEsXG4gICAgICAgICAgICBsYXN0U3RyZWFtVG9rZW46IFwiXCJcbiAgICAgICAgfSkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBtdXRhdGlvbiBxdWV1ZSBmb3IgdGhlIGdpdmVuIHVzZXIgY29udGFpbnMgYSBwZW5kaW5nXG4gKiAgICAgICAgIG11dGF0aW9uIGZvciB0aGUgZ2l2ZW4ga2V5LlxuICovIGZ1bmN0aW9uIGZyKHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gVXMoZSwgbi5wYXRoKSwgaSA9IHNbMV0sIHIgPSBJREJLZXlSYW5nZS5sb3dlckJvdW5kKHMpO1xuICAgIGxldCBvID0gITE7XG4gICAgcmV0dXJuIF9yKHQpLld0KHtcbiAgICAgICAgcmFuZ2U6IHIsXG4gICAgICAgIGp0OiAhMFxuICAgIH0sICgodCwgbiwgcykgPT4ge1xuICAgICAgICBjb25zdCBbciwgYSwgLypiYXRjaElEKi8gdV0gPSB0O1xuICAgICAgICByID09PSBlICYmIGEgPT09IGkgJiYgKG8gPSAhMCksIHMuZG9uZSgpO1xuICAgIH0pKS5uZXh0KCgoKSA9PiBvKSk7XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgYW55IG11dGF0aW9uIHF1ZXVlIGNvbnRhaW5zIHRoZSBnaXZlbiBkb2N1bWVudC4gKi9cbi8qKlxuICogSGVscGVyIHRvIGdldCBhIHR5cGVkIFNpbXBsZURiU3RvcmUgZm9yIHRoZSBtdXRhdGlvbnMgb2JqZWN0IHN0b3JlLlxuICovXG5mdW5jdGlvbiBkcih0KSB7XG4gICAgcmV0dXJuIHBpKHQsIFwibXV0YXRpb25zXCIpO1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBnZXQgYSB0eXBlZCBTaW1wbGVEYlN0b3JlIGZvciB0aGUgbXV0YXRpb25RdWV1ZXMgb2JqZWN0IHN0b3JlLlxuICovIGZ1bmN0aW9uIF9yKHQpIHtcbiAgICByZXR1cm4gcGkodCwgXCJkb2N1bWVudE11dGF0aW9uc1wiKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gZ2V0IGEgdHlwZWQgU2ltcGxlRGJTdG9yZSBmb3IgdGhlIG11dGF0aW9uUXVldWVzIG9iamVjdCBzdG9yZS5cbiAqLyBmdW5jdGlvbiB3cih0KSB7XG4gICAgcmV0dXJuIHBpKHQsIFwibXV0YXRpb25RdWV1ZXNcIik7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogT2Zmc2V0IHRvIGVuc3VyZSBub24tb3ZlcmxhcHBpbmcgdGFyZ2V0IGlkcy4gKi9cbi8qKlxuICogR2VuZXJhdGVzIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyB0YXJnZXQgSURzIGZvciBzZW5kaW5nIHRhcmdldHMgdG8gdGhlXG4gKiB3YXRjaCBzdHJlYW0uXG4gKlxuICogVGhlIGNsaWVudCBjb25zdHJ1Y3RzIHR3byBnZW5lcmF0b3JzLCBvbmUgZm9yIHRoZSB0YXJnZXQgY2FjaGUsIGFuZCBvbmUgZm9yXG4gKiBmb3IgdGhlIHN5bmMgZW5naW5lICh0byBnZW5lcmF0ZSBsaW1ibyBkb2N1bWVudHMgdGFyZ2V0cykuIFRoZXNlXG4gKiBnZW5lcmF0b3JzIHByb2R1Y2Ugbm9uLW92ZXJsYXBwaW5nIElEcyAoYnkgdXNpbmcgZXZlbiBhbmQgb2RkIElEc1xuICogcmVzcGVjdGl2ZWx5KS5cbiAqXG4gKiBCeSBzZXBhcmF0aW5nIHRoZSB0YXJnZXQgSUQgc3BhY2UsIHRoZSBxdWVyeSBjYWNoZSBjYW4gZ2VuZXJhdGUgdGFyZ2V0IElEc1xuICogdGhhdCBwZXJzaXN0IGFjcm9zcyBjbGllbnQgcmVzdGFydHMsIHdoaWxlIHN5bmMgZW5naW5lIGNhbiBpbmRlcGVuZGVudGx5XG4gKiBnZW5lcmF0ZSBpbi1tZW1vcnkgdGFyZ2V0IElEcyB0aGF0IGFyZSB0cmFuc2llbnQgYW5kIGNhbiBiZSByZXVzZWQgYWZ0ZXIgYVxuICogcmVzdGFydC5cbiAqL1xuY2xhc3MgbXIge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy53biA9IHQ7XG4gICAgfVxuICAgIG5leHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnduICs9IDIsIHRoaXMud247XG4gICAgfVxuICAgIHN0YXRpYyBtbigpIHtcbiAgICAgICAgLy8gVGhlIHRhcmdldCBjYWNoZSBnZW5lcmF0b3IgbXVzdCByZXR1cm4gJzInIGluIGl0cyBmaXJzdCBjYWxsIHRvIGBuZXh0KClgXG4gICAgICAgIC8vIGFzIHRoZXJlIGlzIG5vIGRpZmZlcmVudGlhdGlvbiBpbiB0aGUgcHJvdG9jb2wgbGF5ZXIgYmV0d2VlbiBhbiB1bnNldFxuICAgICAgICAvLyBudW1iZXIgYW5kIHRoZSBudW1iZXIgJzAnLiBJZiB3ZSB3ZXJlIHRvIHNlbnQgYSB0YXJnZXQgd2l0aCB0YXJnZXQgSURcbiAgICAgICAgLy8gJzAnLCB0aGUgYmFja2VuZCB3b3VsZCBjb25zaWRlciBpdCB1bnNldCBhbmQgcmVwbGFjZSBpdCB3aXRoIGl0cyBvd24gSUQuXG4gICAgICAgIHJldHVybiBuZXcgbXIoMCk7XG4gICAgfVxuICAgIHN0YXRpYyBnbigpIHtcbiAgICAgICAgLy8gU3luYyBlbmdpbmUgYXNzaWducyB0YXJnZXQgSURzIGZvciBsaW1ibyBkb2N1bWVudCBkZXRlY3Rpb24uXG4gICAgICAgIHJldHVybiBuZXcgbXIoLTEpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gY2xhc3MgZ3Ige1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5yZWZlcmVuY2VEZWxlZ2F0ZSA9IHQsIHRoaXMuTSA9IGU7XG4gICAgfVxuICAgIC8vIFBPUlRJTkcgTk9URTogV2UgZG9uJ3QgY2FjaGUgZ2xvYmFsIG1ldGFkYXRhIGZvciB0aGUgdGFyZ2V0IGNhY2hlLCBzaW5jZVxuICAgIC8vIHNvbWUgb2YgaXQgKGluIHBhcnRpY3VsYXIgYGhpZ2hlc3RUYXJnZXRJZGApIGNhbiBiZSBtb2RpZmllZCBieSBzZWNvbmRhcnlcbiAgICAvLyB0YWJzLiBXZSBjb3VsZCBwZXJoYXBzIGJlIG1vcmUgZ3JhbnVsYXIgKGFuZCBlLmcuIHN0aWxsIGNhY2hlXG4gICAgLy8gYGxhc3RSZW1vdGVTbmFwc2hvdFZlcnNpb25gIGluIG1lbW9yeSkgYnV0IGZvciBzaW1wbGljaXR5IHdlIGN1cnJlbnRseSBnb1xuICAgIC8vIHRvIEluZGV4ZWREYiB3aGVuZXZlciB3ZSBuZWVkIHRvIHJlYWQgbWV0YWRhdGEuIFdlIGNhbiByZXZpc2l0IGlmIGl0IHR1cm5zXG4gICAgLy8gb3V0IHRvIGhhdmUgYSBtZWFuaW5nZnVsIHBlcmZvcm1hbmNlIGltcGFjdC5cbiAgICBhbGxvY2F0ZVRhcmdldElkKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueW4odCkubmV4dCgoZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuID0gbmV3IG1yKGUuaGlnaGVzdFRhcmdldElkKTtcbiAgICAgICAgICAgIHJldHVybiBlLmhpZ2hlc3RUYXJnZXRJZCA9IG4ubmV4dCgpLCB0aGlzLnBuKHQsIGUpLm5leHQoKCgpID0+IGUuaGlnaGVzdFRhcmdldElkKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgZ2V0TGFzdFJlbW90ZVNuYXBzaG90VmVyc2lvbih0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnluKHQpLm5leHQoKHQgPT4gY3QuZnJvbVRpbWVzdGFtcChuZXcgdXQodC5sYXN0UmVtb3RlU25hcHNob3RWZXJzaW9uLnNlY29uZHMsIHQubGFzdFJlbW90ZVNuYXBzaG90VmVyc2lvbi5uYW5vc2Vjb25kcykpKSk7XG4gICAgfVxuICAgIGdldEhpZ2hlc3RTZXF1ZW5jZU51bWJlcih0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnluKHQpLm5leHQoKHQgPT4gdC5oaWdoZXN0TGlzdGVuU2VxdWVuY2VOdW1iZXIpKTtcbiAgICB9XG4gICAgc2V0VGFyZ2V0c01ldGFkYXRhKHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueW4odCkubmV4dCgocyA9PiAocy5oaWdoZXN0TGlzdGVuU2VxdWVuY2VOdW1iZXIgPSBlLCBuICYmIChzLmxhc3RSZW1vdGVTbmFwc2hvdFZlcnNpb24gPSBuLnRvVGltZXN0YW1wKCkpLCBcbiAgICAgICAgZSA+IHMuaGlnaGVzdExpc3RlblNlcXVlbmNlTnVtYmVyICYmIChzLmhpZ2hlc3RMaXN0ZW5TZXF1ZW5jZU51bWJlciA9IGUpLCB0aGlzLnBuKHQsIHMpKSkpO1xuICAgIH1cbiAgICBhZGRUYXJnZXREYXRhKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuSW4odCwgZSkubmV4dCgoKCkgPT4gdGhpcy55bih0KS5uZXh0KChuID0+IChuLnRhcmdldENvdW50ICs9IDEsIHRoaXMuVG4oZSwgbiksIFxuICAgICAgICB0aGlzLnBuKHQsIG4pKSkpKSk7XG4gICAgfVxuICAgIHVwZGF0ZVRhcmdldERhdGEodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5Jbih0LCBlKTtcbiAgICB9XG4gICAgcmVtb3ZlVGFyZ2V0RGF0YSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbW92ZU1hdGNoaW5nS2V5c0ZvclRhcmdldElkKHQsIGUudGFyZ2V0SWQpLm5leHQoKCgpID0+IHlyKHQpLmRlbGV0ZShlLnRhcmdldElkKSkpLm5leHQoKCgpID0+IHRoaXMueW4odCkpKS5uZXh0KChlID0+IChxKGUudGFyZ2V0Q291bnQgPiAwKSwgXG4gICAgICAgIGUudGFyZ2V0Q291bnQgLT0gMSwgdGhpcy5wbih0LCBlKSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRHJvcHMgYW55IHRhcmdldHMgd2l0aCBzZXF1ZW5jZSBudW1iZXIgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSB1cHBlciBib3VuZCwgZXhjZXB0aW5nIHRob3NlXG4gICAgICogcHJlc2VudCBpbiBgYWN0aXZlVGFyZ2V0SWRzYC4gRG9jdW1lbnQgYXNzb2NpYXRpb25zIGZvciB0aGUgcmVtb3ZlZCB0YXJnZXRzIGFyZSBhbHNvIHJlbW92ZWQuXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRhcmdldHMgcmVtb3ZlZC5cbiAgICAgKi8gICAgcmVtb3ZlVGFyZ2V0cyh0LCBlLCBuKSB7XG4gICAgICAgIGxldCBzID0gMDtcbiAgICAgICAgY29uc3QgaSA9IFtdO1xuICAgICAgICByZXR1cm4geXIodCkuV3QoKChyLCBvKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0geGkobyk7XG4gICAgICAgICAgICBhLnNlcXVlbmNlTnVtYmVyIDw9IGUgJiYgbnVsbCA9PT0gbi5nZXQoYS50YXJnZXRJZCkgJiYgKHMrKywgaS5wdXNoKHRoaXMucmVtb3ZlVGFyZ2V0RGF0YSh0LCBhKSkpO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4gdWkud2FpdEZvcihpKSkpLm5leHQoKCgpID0+IHMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbCBwcm92aWRlZCBmdW5jdGlvbiB3aXRoIGVhY2ggYFRhcmdldERhdGFgIHRoYXQgd2UgaGF2ZSBjYWNoZWQuXG4gICAgICovICAgIGZvckVhY2hUYXJnZXQodCwgZSkge1xuICAgICAgICByZXR1cm4geXIodCkuV3QoKCh0LCBuKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzID0geGkobik7XG4gICAgICAgICAgICBlKHMpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIHluKHQpIHtcbiAgICAgICAgcmV0dXJuIHByKHQpLmdldChcInRhcmdldEdsb2JhbEtleVwiKS5uZXh0KCh0ID0+IChxKG51bGwgIT09IHQpLCB0KSkpO1xuICAgIH1cbiAgICBwbih0LCBlKSB7XG4gICAgICAgIHJldHVybiBwcih0KS5wdXQoXCJ0YXJnZXRHbG9iYWxLZXlcIiwgZSk7XG4gICAgfVxuICAgIEluKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHlyKHQpLnB1dChOaSh0aGlzLk0sIGUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW4tcGxhY2UgdXBkYXRlcyB0aGUgcHJvdmlkZWQgbWV0YWRhdGEgdG8gYWNjb3VudCBmb3IgdmFsdWVzIGluIHRoZSBnaXZlblxuICAgICAqIFRhcmdldERhdGEuIFNhdmluZyBpcyBkb25lIHNlcGFyYXRlbHkuIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSB3ZXJlIGFueVxuICAgICAqIGNoYW5nZXMgdG8gdGhlIG1ldGFkYXRhLlxuICAgICAqLyAgICBUbih0LCBlKSB7XG4gICAgICAgIGxldCBuID0gITE7XG4gICAgICAgIHJldHVybiB0LnRhcmdldElkID4gZS5oaWdoZXN0VGFyZ2V0SWQgJiYgKGUuaGlnaGVzdFRhcmdldElkID0gdC50YXJnZXRJZCwgbiA9ICEwKSwgXG4gICAgICAgIHQuc2VxdWVuY2VOdW1iZXIgPiBlLmhpZ2hlc3RMaXN0ZW5TZXF1ZW5jZU51bWJlciAmJiAoZS5oaWdoZXN0TGlzdGVuU2VxdWVuY2VOdW1iZXIgPSB0LnNlcXVlbmNlTnVtYmVyLCBcbiAgICAgICAgbiA9ICEwKSwgbjtcbiAgICB9XG4gICAgZ2V0VGFyZ2V0Q291bnQodCkge1xuICAgICAgICByZXR1cm4gdGhpcy55bih0KS5uZXh0KCh0ID0+IHQudGFyZ2V0Q291bnQpKTtcbiAgICB9XG4gICAgZ2V0VGFyZ2V0RGF0YSh0LCBlKSB7XG4gICAgICAgIC8vIEl0ZXJhdGluZyBieSB0aGUgY2Fub25pY2FsSWQgbWF5IHlpZWxkIG1vcmUgdGhhbiBvbmUgcmVzdWx0IGJlY2F1c2VcbiAgICAgICAgLy8gY2Fub25pY2FsSWQgdmFsdWVzIGFyZSBub3QgcmVxdWlyZWQgdG8gYmUgdW5pcXVlIHBlciB0YXJnZXQuIFRoaXMgcXVlcnlcbiAgICAgICAgLy8gZGVwZW5kcyBvbiB0aGUgcXVlcnlUYXJnZXRzIGluZGV4IHRvIGJlIGVmZmljaWVudC5cbiAgICAgICAgY29uc3QgbiA9IGNlKGUpLCBzID0gSURCS2V5UmFuZ2UuYm91bmQoWyBuLCBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgXSwgWyBuLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgXSk7XG4gICAgICAgIGxldCBpID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHlyKHQpLld0KHtcbiAgICAgICAgICAgIHJhbmdlOiBzLFxuICAgICAgICAgICAgaW5kZXg6IFwicXVlcnlUYXJnZXRzSW5kZXhcIlxuICAgICAgICB9LCAoKHQsIG4sIHMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHIgPSB4aShuKTtcbiAgICAgICAgICAgIC8vIEFmdGVyIGZpbmRpbmcgYSBwb3RlbnRpYWwgbWF0Y2gsIGNoZWNrIHRoYXQgdGhlIHRhcmdldCBpc1xuICAgICAgICAgICAgLy8gYWN0dWFsbHkgZXF1YWwgdG8gdGhlIHJlcXVlc3RlZCB0YXJnZXQuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZShlLCByLnRhcmdldCkgJiYgKGkgPSByLCBzLmRvbmUoKSk7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiBpKSk7XG4gICAgfVxuICAgIGFkZE1hdGNoaW5nS2V5cyh0LCBlLCBuKSB7XG4gICAgICAgIC8vIFBPUlRJTkcgTk9URTogVGhlIHJldmVyc2UgaW5kZXggKGRvY3VtZW50c1RhcmdldHMpIGlzIG1haW50YWluZWQgYnlcbiAgICAgICAgLy8gSW5kZXhlZERiLlxuICAgICAgICBjb25zdCBzID0gW10sIGkgPSBJcih0KTtcbiAgICAgICAgcmV0dXJuIGUuZm9yRWFjaCgoZSA9PiB7XG4gICAgICAgICAgICBjb25zdCByID0gJHMoZS5wYXRoKTtcbiAgICAgICAgICAgIHMucHVzaChpLnB1dCh7XG4gICAgICAgICAgICAgICAgdGFyZ2V0SWQ6IG4sXG4gICAgICAgICAgICAgICAgcGF0aDogclxuICAgICAgICAgICAgfSkpLCBzLnB1c2godGhpcy5yZWZlcmVuY2VEZWxlZ2F0ZS5hZGRSZWZlcmVuY2UodCwgbiwgZSkpO1xuICAgICAgICB9KSksIHVpLndhaXRGb3Iocyk7XG4gICAgfVxuICAgIHJlbW92ZU1hdGNoaW5nS2V5cyh0LCBlLCBuKSB7XG4gICAgICAgIC8vIFBPUlRJTkcgTk9URTogVGhlIHJldmVyc2UgaW5kZXggKGRvY3VtZW50c1RhcmdldHMpIGlzIG1haW50YWluZWQgYnlcbiAgICAgICAgLy8gSW5kZXhlZERiLlxuICAgICAgICBjb25zdCBzID0gSXIodCk7XG4gICAgICAgIHJldHVybiB1aS5mb3JFYWNoKGUsIChlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSAkcyhlLnBhdGgpO1xuICAgICAgICAgICAgcmV0dXJuIHVpLndhaXRGb3IoWyBzLmRlbGV0ZShbIG4sIGkgXSksIHRoaXMucmVmZXJlbmNlRGVsZWdhdGUucmVtb3ZlUmVmZXJlbmNlKHQsIG4sIGUpIF0pO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIHJlbW92ZU1hdGNoaW5nS2V5c0ZvclRhcmdldElkKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IElyKHQpLCBzID0gSURCS2V5UmFuZ2UuYm91bmQoWyBlIF0sIFsgZSArIDEgXSwgXG4gICAgICAgIC8qbG93ZXJPcGVuPSovICExLCBcbiAgICAgICAgLyp1cHBlck9wZW49Ki8gITApO1xuICAgICAgICByZXR1cm4gbi5kZWxldGUocyk7XG4gICAgfVxuICAgIGdldE1hdGNoaW5nS2V5c0ZvclRhcmdldElkKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IElEQktleVJhbmdlLmJvdW5kKFsgZSBdLCBbIGUgKyAxIF0sIFxuICAgICAgICAvKmxvd2VyT3Blbj0qLyAhMSwgXG4gICAgICAgIC8qdXBwZXJPcGVuPSovICEwKSwgcyA9IElyKHQpO1xuICAgICAgICBsZXQgaSA9IEduKCk7XG4gICAgICAgIHJldHVybiBzLld0KHtcbiAgICAgICAgICAgIHJhbmdlOiBuLFxuICAgICAgICAgICAganQ6ICEwXG4gICAgICAgIH0sICgodCwgZSwgbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgcyA9IExzKHRbMV0pLCByID0gbmV3IHh0KHMpO1xuICAgICAgICAgICAgaSA9IGkuYWRkKHIpO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4gaSkpO1xuICAgIH1cbiAgICBjb250YWluc0tleSh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSAkcyhlLnBhdGgpLCBzID0gSURCS2V5UmFuZ2UuYm91bmQoWyBuIF0sIFsgYXQobikgXSwgXG4gICAgICAgIC8qbG93ZXJPcGVuPSovICExLCBcbiAgICAgICAgLyp1cHBlck9wZW49Ki8gITApO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIHJldHVybiBJcih0KS5XdCh7XG4gICAgICAgICAgICBpbmRleDogXCJkb2N1bWVudFRhcmdldHNJbmRleFwiLFxuICAgICAgICAgICAganQ6ICEwLFxuICAgICAgICAgICAgcmFuZ2U6IHNcbiAgICAgICAgfSwgKChbdCwgZV0sIG4sIHMpID0+IHtcbiAgICAgICAgICAgIC8vIEhhdmluZyBhIHNlbnRpbmVsIHJvdyBmb3IgYSBkb2N1bWVudCBkb2VzIG5vdCBjb3VudCBhcyBjb250YWluaW5nIHRoYXQgZG9jdW1lbnQ7XG4gICAgICAgICAgICAvLyBGb3IgdGhlIHRhcmdldCBjYWNoZSwgY29udGFpbmluZyB0aGUgZG9jdW1lbnQgbWVhbnMgdGhlIGRvY3VtZW50IGlzIHBhcnQgb2Ygc29tZVxuICAgICAgICAgICAgLy8gdGFyZ2V0LlxuICAgICAgICAgICAgMCAhPT0gdCAmJiAoaSsrLCBzLmRvbmUoKSk7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiBpID4gMCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb29rcyB1cCBhIFRhcmdldERhdGEgZW50cnkgYnkgdGFyZ2V0IElELlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhcmdldElkIC0gVGhlIHRhcmdldCBJRCBvZiB0aGUgVGFyZ2V0RGF0YSBlbnRyeSB0byBsb29rIHVwLlxuICAgICAqIEByZXR1cm5zIFRoZSBjYWNoZWQgVGFyZ2V0RGF0YSBlbnRyeSwgb3IgbnVsbCBpZiB0aGUgY2FjaGUgaGFzIG5vIGVudHJ5IGZvclxuICAgICAqIHRoZSB0YXJnZXQuXG4gICAgICovXG4gICAgLy8gUE9SVElORyBOT1RFOiBNdWx0aS10YWIgb25seS5cbiAgICBFdCh0LCBlKSB7XG4gICAgICAgIHJldHVybiB5cih0KS5nZXQoZSkubmV4dCgodCA9PiB0ID8geGkodCkgOiBudWxsKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEhlbHBlciB0byBnZXQgYSB0eXBlZCBTaW1wbGVEYlN0b3JlIGZvciB0aGUgcXVlcmllcyBvYmplY3Qgc3RvcmUuXG4gKi8gZnVuY3Rpb24geXIodCkge1xuICAgIHJldHVybiBwaSh0LCBcInRhcmdldHNcIik7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGdldCBhIHR5cGVkIFNpbXBsZURiU3RvcmUgZm9yIHRoZSB0YXJnZXQgZ2xvYmFscyBvYmplY3Qgc3RvcmUuXG4gKi8gZnVuY3Rpb24gcHIodCkge1xuICAgIHJldHVybiBwaSh0LCBcInRhcmdldEdsb2JhbFwiKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gZ2V0IGEgdHlwZWQgU2ltcGxlRGJTdG9yZSBmb3IgdGhlIGRvY3VtZW50IHRhcmdldCBvYmplY3Qgc3RvcmUuXG4gKi8gZnVuY3Rpb24gSXIodCkge1xuICAgIHJldHVybiBwaSh0LCBcInRhcmdldERvY3VtZW50c1wiKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogVmVyaWZpZXMgdGhlIGVycm9yIHRocm93biBieSBhIExvY2FsU3RvcmUgb3BlcmF0aW9uLiBJZiBhIExvY2FsU3RvcmVcbiAqIG9wZXJhdGlvbiBmYWlscyBiZWNhdXNlIHRoZSBwcmltYXJ5IGxlYXNlIGhhcyBiZWVuIHRha2VuIGJ5IGFub3RoZXIgY2xpZW50LFxuICogd2UgaWdub3JlIHRoZSBlcnJvciAodGhlIHBlcnNpc3RlbmNlIGxheWVyIHdpbGwgaW1tZWRpYXRlbHkgY2FsbFxuICogYGFwcGx5UHJpbWFyeUxlYXNlYCB0byBwcm9wYWdhdGUgdGhlIHByaW1hcnkgc3RhdGUgY2hhbmdlKS4gQWxsIG90aGVyIGVycm9yc1xuICogYXJlIHJlLXRocm93bi5cbiAqXG4gKiBAcGFyYW0gZXJyIC0gQW4gZXJyb3IgcmV0dXJuZWQgYnkgYSBMb2NhbFN0b3JlIG9wZXJhdGlvbi5cbiAqIEByZXR1cm5zIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHdlIHJlY292ZXJlZCwgb3IgdGhlIG9yaWdpbmFsIGVycm9yLlxuICovIGFzeW5jIGZ1bmN0aW9uIFRyKHQpIHtcbiAgICBpZiAodC5jb2RlICE9PSBHLkZBSUxFRF9QUkVDT05ESVRJT04gfHwgdC5tZXNzYWdlICE9PSBvaSkgdGhyb3cgdDtcbiAgICBPKFwiTG9jYWxTdG9yZVwiLCBcIlVuZXhwZWN0ZWRseSBsb3N0IHByaW1hcnkgbGVhc2VcIik7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGZ1bmN0aW9uIEVyKFt0LCBlXSwgW24sIHNdKSB7XG4gICAgY29uc3QgaSA9IHJ0KHQsIG4pO1xuICAgIHJldHVybiAwID09PSBpID8gcnQoZSwgcykgOiBpO1xufVxuXG4vKipcbiAqIFVzZWQgdG8gY2FsY3VsYXRlIHRoZSBudGggc2VxdWVuY2UgbnVtYmVyLiBLZWVwcyBhIHJvbGxpbmcgYnVmZmVyIG9mIHRoZVxuICogbG93ZXN0IG4gdmFsdWVzIHBhc3NlZCB0byBgYWRkRWxlbWVudGAsIGFuZCBmaW5hbGx5IHJlcG9ydHMgdGhlIGxhcmdlc3Qgb2ZcbiAqIHRoZW0gaW4gYG1heFZhbHVlYC5cbiAqLyBjbGFzcyBBciB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLkVuID0gdCwgdGhpcy5idWZmZXIgPSBuZXcga24oRXIpLCB0aGlzLkFuID0gMDtcbiAgICB9XG4gICAgUm4oKSB7XG4gICAgICAgIHJldHVybiArK3RoaXMuQW47XG4gICAgfVxuICAgIGJuKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IFsgdCwgdGhpcy5SbigpIF07XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlci5zaXplIDwgdGhpcy5FbikgdGhpcy5idWZmZXIgPSB0aGlzLmJ1ZmZlci5hZGQoZSk7IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuYnVmZmVyLmxhc3QoKTtcbiAgICAgICAgICAgIEVyKGUsIHQpIDwgMCAmJiAodGhpcy5idWZmZXIgPSB0aGlzLmJ1ZmZlci5kZWxldGUodCkuYWRkKGUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgbWF4VmFsdWUoKSB7XG4gICAgICAgIC8vIEd1YXJhbnRlZWQgdG8gYmUgbm9uLWVtcHR5LiBJZiB3ZSBkZWNpZGUgd2UgYXJlIG5vdCBjb2xsZWN0aW5nIGFueVxuICAgICAgICAvLyBzZXF1ZW5jZSBudW1iZXJzLCBudGhTZXF1ZW5jZU51bWJlciBiZWxvdyBzaG9ydC1jaXJjdWl0cy4gSWYgd2UgaGF2ZVxuICAgICAgICAvLyBkZWNpZGVkIHRoYXQgd2UgYXJlIGNvbGxlY3RpbmcgbiBzZXF1ZW5jZSBudW1iZXJzLCBpdCdzIGJlY2F1c2UgbiBpcyBzb21lXG4gICAgICAgIC8vIHBlcmNlbnRhZ2Ugb2YgdGhlIGV4aXN0aW5nIHNlcXVlbmNlIG51bWJlcnMuIFRoYXQgbWVhbnMgd2Ugc2hvdWxkIG5ldmVyXG4gICAgICAgIC8vIGJlIGluIGEgc2l0dWF0aW9uIHdoZXJlIHdlIGFyZSBjb2xsZWN0aW5nIHNlcXVlbmNlIG51bWJlcnMgYnV0IGRvbid0XG4gICAgICAgIC8vIGFjdHVhbGx5IGhhdmUgYW55LlxuICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIubGFzdCgpWzBdO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgc2NoZWR1bGluZyBvZiBMUlUgZ2FyYmFnZSBjb2xsZWN0aW9uLiBJdCBoYW5kbGVzIGNoZWNraW5nXG4gKiB3aGV0aGVyIG9yIG5vdCBHQyBpcyBlbmFibGVkLCBhcyB3ZWxsIGFzIHdoaWNoIGRlbGF5IHRvIHVzZSBiZWZvcmUgdGhlIG5leHQgcnVuLlxuICovIGNsYXNzIFJyIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMuZ2FyYmFnZUNvbGxlY3RvciA9IHQsIHRoaXMuYXN5bmNRdWV1ZSA9IGUsIHRoaXMuUG4gPSAhMSwgdGhpcy5WbiA9IG51bGw7XG4gICAgfVxuICAgIHN0YXJ0KHQpIHtcbiAgICAgICAgLTEgIT09IHRoaXMuZ2FyYmFnZUNvbGxlY3Rvci5wYXJhbXMuY2FjaGVTaXplQ29sbGVjdGlvblRocmVzaG9sZCAmJiB0aGlzLnZuKHQpO1xuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICB0aGlzLlZuICYmICh0aGlzLlZuLmNhbmNlbCgpLCB0aGlzLlZuID0gbnVsbCk7XG4gICAgfVxuICAgIGdldCBzdGFydGVkKCkge1xuICAgICAgICByZXR1cm4gbnVsbCAhPT0gdGhpcy5WbjtcbiAgICB9XG4gICAgdm4odCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5QbiA/IDNlNSA6IDZlNDtcbiAgICAgICAgTyhcIkxydUdhcmJhZ2VDb2xsZWN0b3JcIiwgYEdhcmJhZ2UgY29sbGVjdGlvbiBzY2hlZHVsZWQgaW4gJHtlfW1zYCksIHRoaXMuVm4gPSB0aGlzLmFzeW5jUXVldWUuZW5xdWV1ZUFmdGVyRGVsYXkoXCJscnVfZ2FyYmFnZV9jb2xsZWN0aW9uXCIgLyogTHJ1R2FyYmFnZUNvbGxlY3Rpb24gKi8gLCBlLCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5WbiA9IG51bGwsIHRoaXMuUG4gPSAhMDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdC5jb2xsZWN0R2FyYmFnZSh0aGlzLmdhcmJhZ2VDb2xsZWN0b3IpO1xuICAgICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgICAgIGRpKHQpID8gTyhcIkxydUdhcmJhZ2VDb2xsZWN0b3JcIiwgXCJJZ25vcmluZyBJbmRleGVkREIgZXJyb3IgZHVyaW5nIGdhcmJhZ2UgY29sbGVjdGlvbjogXCIsIHQpIDogYXdhaXQgVHIodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnZuKHQpO1xuICAgICAgICB9KSk7XG4gICAgfVxufVxuXG4vKiogSW1wbGVtZW50cyB0aGUgc3RlcHMgZm9yIExSVSBnYXJiYWdlIGNvbGxlY3Rpb24uICovIGNsYXNzIGJyIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMuU24gPSB0LCB0aGlzLnBhcmFtcyA9IGU7XG4gICAgfVxuICAgIGNhbGN1bGF0ZVRhcmdldENvdW50KHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuU24uRG4odCkubmV4dCgodCA9PiBNYXRoLmZsb29yKGUgLyAxMDAgKiB0KSkpO1xuICAgIH1cbiAgICBudGhTZXF1ZW5jZU51bWJlcih0LCBlKSB7XG4gICAgICAgIGlmICgwID09PSBlKSByZXR1cm4gdWkucmVzb2x2ZShudC5BKTtcbiAgICAgICAgY29uc3QgbiA9IG5ldyBBcihlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuU24uZm9yRWFjaFRhcmdldCh0LCAodCA9PiBuLmJuKHQuc2VxdWVuY2VOdW1iZXIpKSkubmV4dCgoKCkgPT4gdGhpcy5Tbi5Dbih0LCAodCA9PiBuLmJuKHQpKSkpKS5uZXh0KCgoKSA9PiBuLm1heFZhbHVlKSk7XG4gICAgfVxuICAgIHJlbW92ZVRhcmdldHModCwgZSwgbikge1xuICAgICAgICByZXR1cm4gdGhpcy5Tbi5yZW1vdmVUYXJnZXRzKHQsIGUsIG4pO1xuICAgIH1cbiAgICByZW1vdmVPcnBoYW5lZERvY3VtZW50cyh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLlNuLnJlbW92ZU9ycGhhbmVkRG9jdW1lbnRzKHQsIGUpO1xuICAgIH1cbiAgICBjb2xsZWN0KHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIC0xID09PSB0aGlzLnBhcmFtcy5jYWNoZVNpemVDb2xsZWN0aW9uVGhyZXNob2xkID8gKE8oXCJMcnVHYXJiYWdlQ29sbGVjdG9yXCIsIFwiR2FyYmFnZSBjb2xsZWN0aW9uIHNraXBwZWQ7IGRpc2FibGVkXCIpLCBcbiAgICAgICAgdWkucmVzb2x2ZShhcikpIDogdGhpcy5nZXRDYWNoZVNpemUodCkubmV4dCgobiA9PiBuIDwgdGhpcy5wYXJhbXMuY2FjaGVTaXplQ29sbGVjdGlvblRocmVzaG9sZCA/IChPKFwiTHJ1R2FyYmFnZUNvbGxlY3RvclwiLCBgR2FyYmFnZSBjb2xsZWN0aW9uIHNraXBwZWQ7IENhY2hlIHNpemUgJHtufSBpcyBsb3dlciB0aGFuIHRocmVzaG9sZCAke3RoaXMucGFyYW1zLmNhY2hlU2l6ZUNvbGxlY3Rpb25UaHJlc2hvbGR9YCksIFxuICAgICAgICBhcikgOiB0aGlzLnhuKHQsIGUpKSk7XG4gICAgfVxuICAgIGdldENhY2hlU2l6ZSh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLlNuLmdldENhY2hlU2l6ZSh0KTtcbiAgICB9XG4gICAgeG4odCwgZSkge1xuICAgICAgICBsZXQgbiwgcywgaSwgciwgbywgdSwgYztcbiAgICAgICAgY29uc3QgaCA9IERhdGUubm93KCk7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZVRhcmdldENvdW50KHQsIHRoaXMucGFyYW1zLnBlcmNlbnRpbGVUb0NvbGxlY3QpLm5leHQoKGUgPT4gKFxuICAgICAgICAvLyBDYXAgYXQgdGhlIGNvbmZpZ3VyZWQgbWF4XG4gICAgICAgIGUgPiB0aGlzLnBhcmFtcy5tYXhpbXVtU2VxdWVuY2VOdW1iZXJzVG9Db2xsZWN0ID8gKE8oXCJMcnVHYXJiYWdlQ29sbGVjdG9yXCIsIGBDYXBwaW5nIHNlcXVlbmNlIG51bWJlcnMgdG8gY29sbGVjdCBkb3duIHRvIHRoZSBtYXhpbXVtIG9mICR7dGhpcy5wYXJhbXMubWF4aW11bVNlcXVlbmNlTnVtYmVyc1RvQ29sbGVjdH0gZnJvbSAke2V9YCksIFxuICAgICAgICBzID0gdGhpcy5wYXJhbXMubWF4aW11bVNlcXVlbmNlTnVtYmVyc1RvQ29sbGVjdCkgOiBzID0gZSwgciA9IERhdGUubm93KCksIHRoaXMubnRoU2VxdWVuY2VOdW1iZXIodCwgcykpKSkubmV4dCgocyA9PiAobiA9IHMsIFxuICAgICAgICBvID0gRGF0ZS5ub3coKSwgdGhpcy5yZW1vdmVUYXJnZXRzKHQsIG4sIGUpKSkpLm5leHQoKGUgPT4gKGkgPSBlLCB1ID0gRGF0ZS5ub3coKSwgXG4gICAgICAgIHRoaXMucmVtb3ZlT3JwaGFuZWREb2N1bWVudHModCwgbikpKSkubmV4dCgodCA9PiB7XG4gICAgICAgICAgICBpZiAoYyA9IERhdGUubm93KCksIGsoKSA8PSBMb2dMZXZlbC5ERUJVRykge1xuICAgICAgICAgICAgICAgIE8oXCJMcnVHYXJiYWdlQ29sbGVjdG9yXCIsIGBMUlUgR2FyYmFnZSBDb2xsZWN0aW9uXFxuXFx0Q291bnRlZCB0YXJnZXRzIGluICR7ciAtIGh9bXNcXG5cXHREZXRlcm1pbmVkIGxlYXN0IHJlY2VudGx5IHVzZWQgJHtzfSBpbiBgICsgKG8gLSByKSArIFwibXNcXG5cIiArIGBcXHRSZW1vdmVkICR7aX0gdGFyZ2V0cyBpbiBgICsgKHUgLSBvKSArIFwibXNcXG5cIiArIGBcXHRSZW1vdmVkICR7dH0gZG9jdW1lbnRzIGluIGAgKyAoYyAtIHUpICsgXCJtc1xcblwiICsgYFRvdGFsIER1cmF0aW9uOiAke2MgLSBofW1zYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdWkucmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgZGlkUnVuOiAhMCxcbiAgICAgICAgICAgICAgICBzZXF1ZW5jZU51bWJlcnNDb2xsZWN0ZWQ6IHMsXG4gICAgICAgICAgICAgICAgdGFyZ2V0c1JlbW92ZWQ6IGksXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRzUmVtb3ZlZDogdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogUHJvdmlkZXMgTFJVIGZ1bmN0aW9uYWxpdHkgZm9yIEluZGV4ZWREQiBwZXJzaXN0ZW5jZS4gKi9cbmNsYXNzIFByIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMuZGIgPSB0LCB0aGlzLmdhcmJhZ2VDb2xsZWN0b3IgPSBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGJyKHQsIGUpO1xuICAgICAgICB9KHRoaXMsIGUpO1xuICAgIH1cbiAgICBEbih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLk5uKHQpO1xuICAgICAgICByZXR1cm4gdGhpcy5kYi5nZXRUYXJnZXRDYWNoZSgpLmdldFRhcmdldENvdW50KHQpLm5leHQoKHQgPT4gZS5uZXh0KChlID0+IHQgKyBlKSkpKTtcbiAgICB9XG4gICAgTm4odCkge1xuICAgICAgICBsZXQgZSA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzLkNuKHQsICh0ID0+IHtcbiAgICAgICAgICAgIGUrKztcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IGUpKTtcbiAgICB9XG4gICAgZm9yRWFjaFRhcmdldCh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRiLmdldFRhcmdldENhY2hlKCkuZm9yRWFjaFRhcmdldCh0LCBlKTtcbiAgICB9XG4gICAgQ24odCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5rbih0LCAoKHQsIG4pID0+IGUobikpKTtcbiAgICB9XG4gICAgYWRkUmVmZXJlbmNlKHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIFZyKHQsIG4pO1xuICAgIH1cbiAgICByZW1vdmVSZWZlcmVuY2UodCwgZSwgbikge1xuICAgICAgICByZXR1cm4gVnIodCwgbik7XG4gICAgfVxuICAgIHJlbW92ZVRhcmdldHModCwgZSwgbikge1xuICAgICAgICByZXR1cm4gdGhpcy5kYi5nZXRUYXJnZXRDYWNoZSgpLnJlbW92ZVRhcmdldHModCwgZSwgbik7XG4gICAgfVxuICAgIG1hcmtQb3RlbnRpYWxseU9ycGhhbmVkKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIFZyKHQsIGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgYW55dGhpbmcgd291bGQgcHJldmVudCB0aGlzIGRvY3VtZW50IGZyb20gYmVpbmcgZ2FyYmFnZVxuICAgICAqIGNvbGxlY3RlZCwgZ2l2ZW4gdGhhdCB0aGUgZG9jdW1lbnQgaW4gcXVlc3Rpb24gaXMgbm90IHByZXNlbnQgaW4gYW55XG4gICAgICogdGFyZ2V0cyBhbmQgaGFzIGEgc2VxdWVuY2UgbnVtYmVyIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgdXBwZXIgYm91bmQgZm9yXG4gICAgICogdGhlIGNvbGxlY3Rpb24gcnVuLlxuICAgICAqLyAgICBNbih0LCBlKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBsZXQgbiA9ICExO1xuICAgICAgICAgICAgcmV0dXJuIHdyKHQpLnp0KChzID0+IGZyKHQsIHMsIGUpLm5leHQoKHQgPT4gKHQgJiYgKG4gPSAhMCksIHVpLnJlc29sdmUoIXQpKSkpKSkubmV4dCgoKCkgPT4gbikpO1xuICAgICAgICB9KHQsIGUpO1xuICAgIH1cbiAgICByZW1vdmVPcnBoYW5lZERvY3VtZW50cyh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLmRiLmdldFJlbW90ZURvY3VtZW50Q2FjaGUoKS5uZXdDaGFuZ2VCdWZmZXIoKSwgcyA9IFtdO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzLmtuKHQsICgociwgbykgPT4ge1xuICAgICAgICAgICAgaWYgKG8gPD0gZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLk1uKHQsIHIpLm5leHQoKGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWUpIFxuICAgICAgICAgICAgICAgICAgICAvLyBPdXIgc2l6ZSBhY2NvdW50aW5nIHJlcXVpcmVzIHVzIHRvIHJlYWQgYWxsIGRvY3VtZW50cyBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZpbmcgdGhlbS5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkrKywgbi5nZXRFbnRyeSh0LCByKS5uZXh0KCgoKSA9PiAobi5yZW1vdmVFbnRyeShyLCBjdC5taW4oKSksIElyKHQpLmRlbGV0ZShbIDAsICRzKHIucGF0aCkgXSkpKSk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIHMucHVzaChlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpLm5leHQoKCgpID0+IHVpLndhaXRGb3IocykpKS5uZXh0KCgoKSA9PiBuLmFwcGx5KHQpKSkubmV4dCgoKCkgPT4gaSkpO1xuICAgIH1cbiAgICByZW1vdmVUYXJnZXQodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gZS53aXRoU2VxdWVuY2VOdW1iZXIodC5jdXJyZW50U2VxdWVuY2VOdW1iZXIpO1xuICAgICAgICByZXR1cm4gdGhpcy5kYi5nZXRUYXJnZXRDYWNoZSgpLnVwZGF0ZVRhcmdldERhdGEodCwgbik7XG4gICAgfVxuICAgIHVwZGF0ZUxpbWJvRG9jdW1lbnQodCwgZSkge1xuICAgICAgICByZXR1cm4gVnIodCwgZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGwgcHJvdmlkZWQgZnVuY3Rpb24gZm9yIGVhY2ggZG9jdW1lbnQgaW4gdGhlIGNhY2hlIHRoYXQgaXMgJ29ycGhhbmVkJy4gT3JwaGFuZWRcbiAgICAgKiBtZWFucyBub3QgYSBwYXJ0IG9mIGFueSB0YXJnZXQsIHNvIHRoZSBvbmx5IGVudHJ5IGluIHRoZSB0YXJnZXQtZG9jdW1lbnQgaW5kZXggZm9yXG4gICAgICogdGhhdCBkb2N1bWVudCB3aWxsIGJlIHRoZSBzZW50aW5lbCByb3cgKHRhcmdldElkIDApLCB3aGljaCB3aWxsIGFsc28gaGF2ZSB0aGUgc2VxdWVuY2VcbiAgICAgKiBudW1iZXIgZm9yIHRoZSBsYXN0IHRpbWUgdGhlIGRvY3VtZW50IHdhcyBhY2Nlc3NlZC5cbiAgICAgKi8gICAga24odCwgZSkge1xuICAgICAgICBjb25zdCBuID0gSXIodCk7XG4gICAgICAgIGxldCBzLCBpID0gbnQuQTtcbiAgICAgICAgcmV0dXJuIG4uV3Qoe1xuICAgICAgICAgICAgaW5kZXg6IFwiZG9jdW1lbnRUYXJnZXRzSW5kZXhcIlxuICAgICAgICB9LCAoKFt0LCBuXSwge3BhdGg6IHIsIHNlcXVlbmNlTnVtYmVyOiBvfSkgPT4ge1xuICAgICAgICAgICAgMCA9PT0gdCA/IChcbiAgICAgICAgICAgIC8vIGlmIG5leHRUb1JlcG9ydCBpcyB2YWxpZCwgcmVwb3J0IGl0LCB0aGlzIGlzIGEgbmV3IGtleSBzbyB0aGVcbiAgICAgICAgICAgIC8vIGxhc3Qgb25lIG11c3Qgbm90IGJlIGEgbWVtYmVyIG9mIGFueSB0YXJnZXRzLlxuICAgICAgICAgICAgaSAhPT0gbnQuQSAmJiBlKG5ldyB4dChMcyhzKSksIGkpLCBcbiAgICAgICAgICAgIC8vIHNldCBuZXh0VG9SZXBvcnQgdG8gYmUgdGhpcyBzZXF1ZW5jZSBudW1iZXIuIEl0J3MgdGhlIG5leHQgb25lIHdlXG4gICAgICAgICAgICAvLyBtaWdodCByZXBvcnQsIGlmIHdlIGRvbid0IGZpbmQgYW55IHRhcmdldHMgZm9yIHRoaXMgZG9jdW1lbnQuXG4gICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIHNlcXVlbmNlIG51bWJlciBtdXN0IGJlIGRlZmluZWQgd2hlbiB0aGUgdGFyZ2V0SWRcbiAgICAgICAgICAgIC8vIGlzIDAuXG4gICAgICAgICAgICBpID0gbywgcyA9IHIpIDogXG4gICAgICAgICAgICAvLyBzZXQgbmV4dFRvUmVwb3J0IHRvIGJlIGludmFsaWQsIHdlIGtub3cgd2UgZG9uJ3QgbmVlZCB0byByZXBvcnRcbiAgICAgICAgICAgIC8vIHRoaXMgb25lIHNpbmNlIHdlIGZvdW5kIGEgdGFyZ2V0IGZvciBpdC5cbiAgICAgICAgICAgIGkgPSBudC5BO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4ge1xuICAgICAgICAgICAgLy8gU2luY2Ugd2UgcmVwb3J0IHNlcXVlbmNlIG51bWJlcnMgYWZ0ZXIgZ2V0dGluZyB0byB0aGUgbmV4dCBrZXksIHdlXG4gICAgICAgICAgICAvLyBuZWVkIHRvIGNoZWNrIGlmIHRoZSBsYXN0IGtleSB3ZSBpdGVyYXRlZCBvdmVyIHdhcyBhbiBvcnBoYW5lZFxuICAgICAgICAgICAgLy8gZG9jdW1lbnQgYW5kIHJlcG9ydCBpdC5cbiAgICAgICAgICAgIGkgIT09IG50LkEgJiYgZShuZXcgeHQoTHMocykpLCBpKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBnZXRDYWNoZVNpemUodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYi5nZXRSZW1vdGVEb2N1bWVudENhY2hlKCkuZ2V0U2l6ZSh0KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIFZyKHQsIGUpIHtcbiAgICByZXR1cm4gSXIodCkucHV0KFxuICAgIC8qKlxuICogQHJldHVybnMgQSB2YWx1ZSBzdWl0YWJsZSBmb3Igd3JpdGluZyBhIHNlbnRpbmVsIHJvdyBpbiB0aGUgdGFyZ2V0LWRvY3VtZW50XG4gKiBzdG9yZS5cbiAqL1xuICAgIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRhcmdldElkOiAwLFxuICAgICAgICAgICAgcGF0aDogJHModC5wYXRoKSxcbiAgICAgICAgICAgIHNlcXVlbmNlTnVtYmVyOiBlXG4gICAgICAgIH07XG4gICAgfShlLCB0LmN1cnJlbnRTZXF1ZW5jZU51bWJlcikpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBbiBpbi1tZW1vcnkgYnVmZmVyIG9mIGVudHJpZXMgdG8gYmUgd3JpdHRlbiB0byBhIFJlbW90ZURvY3VtZW50Q2FjaGUuXG4gKiBJdCBjYW4gYmUgdXNlZCB0byBiYXRjaCB1cCBhIHNldCBvZiBjaGFuZ2VzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGNhY2hlLCBidXRcbiAqIGFkZGl0aW9uYWxseSBzdXBwb3J0cyByZWFkaW5nIGVudHJpZXMgYmFjayB3aXRoIHRoZSBgZ2V0RW50cnkoKWAgbWV0aG9kLFxuICogZmFsbGluZyBiYWNrIHRvIHRoZSB1bmRlcmx5aW5nIFJlbW90ZURvY3VtZW50Q2FjaGUgaWYgbm8gZW50cnkgaXNcbiAqIGJ1ZmZlcmVkLlxuICpcbiAqIEVudHJpZXMgYWRkZWQgdG8gdGhlIGNhY2hlICptdXN0KiBiZSByZWFkIGZpcnN0LiBUaGlzIGlzIHRvIGZhY2lsaXRhdGVcbiAqIGNhbGN1bGF0aW5nIHRoZSBzaXplIGRlbHRhIG9mIHRoZSBwZW5kaW5nIGNoYW5nZXMuXG4gKlxuICogUE9SVElORyBOT1RFOiBUaGlzIGNsYXNzIHdhcyBpbXBsZW1lbnRlZCB0aGVuIHJlbW92ZWQgZnJvbSBvdGhlciBwbGF0Zm9ybXMuXG4gKiBJZiBieXRlLWNvdW50aW5nIGVuZHMgdXAgYmVpbmcgbmVlZGVkIG9uIHRoZSBvdGhlciBwbGF0Zm9ybXMsIGNvbnNpZGVyXG4gKiBwb3J0aW5nIHRoaXMgY2xhc3MgYXMgcGFydCBvZiB0aGF0IGltcGxlbWVudGF0aW9uIHdvcmsuXG4gKi8gY2xhc3MgdnIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBBIG1hcHBpbmcgb2YgZG9jdW1lbnQga2V5IHRvIHRoZSBuZXcgY2FjaGUgZW50cnkgdGhhdCBzaG91bGQgYmUgd3JpdHRlbi5cbiAgICAgICAgdGhpcy5jaGFuZ2VzID0gbmV3IERuKCh0ID0+IHQudG9TdHJpbmcoKSksICgodCwgZSkgPT4gdC5pc0VxdWFsKGUpKSksIHRoaXMuY2hhbmdlc0FwcGxpZWQgPSAhMTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQnVmZmVycyBhIGBSZW1vdGVEb2N1bWVudENhY2hlLmFkZEVudHJ5KClgIGNhbGwuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIG9ubHkgbW9kaWZ5IGRvY3VtZW50cyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHJldHJpZXZlZCB2aWFcbiAgICAgKiBgZ2V0RW50cnkoKS9nZXRFbnRyaWVzKClgIChlbmZvcmNlZCB2aWEgSW5kZXhlZERicyBgYXBwbHkoKWApLlxuICAgICAqLyAgICBhZGRFbnRyeSh0KSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QXBwbGllZCgpLCB0aGlzLmNoYW5nZXMuc2V0KHQua2V5LCB0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQnVmZmVycyBhIGBSZW1vdGVEb2N1bWVudENhY2hlLnJlbW92ZUVudHJ5KClgIGNhbGwuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIG9ubHkgcmVtb3ZlIGRvY3VtZW50cyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHJldHJpZXZlZCB2aWFcbiAgICAgKiBgZ2V0RW50cnkoKS9nZXRFbnRyaWVzKClgIChlbmZvcmNlZCB2aWEgSW5kZXhlZERicyBgYXBwbHkoKWApLlxuICAgICAqLyAgICByZW1vdmVFbnRyeSh0LCBlKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QXBwbGllZCgpLCB0aGlzLmNoYW5nZXMuc2V0KHQsIHRlLm5ld0ludmFsaWREb2N1bWVudCh0KS5zZXRSZWFkVGltZShlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvb2tzIHVwIGFuIGVudHJ5IGluIHRoZSBjYWNoZS4gVGhlIGJ1ZmZlcmVkIGNoYW5nZXMgd2lsbCBmaXJzdCBiZSBjaGVja2VkLFxuICAgICAqIGFuZCBpZiBubyBidWZmZXJlZCBjaGFuZ2UgYXBwbGllcywgdGhpcyB3aWxsIGZvcndhcmQgdG9cbiAgICAgKiBgUmVtb3RlRG9jdW1lbnRDYWNoZS5nZXRFbnRyeSgpYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbiAtIFRoZSB0cmFuc2FjdGlvbiBpbiB3aGljaCB0byBwZXJmb3JtIGFueSBwZXJzaXN0ZW5jZVxuICAgICAqICAgICBvcGVyYXRpb25zLlxuICAgICAqIEBwYXJhbSBkb2N1bWVudEtleSAtIFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGxvb2sgdXAuXG4gICAgICogQHJldHVybnMgVGhlIGNhY2hlZCBkb2N1bWVudCBvciBhbiBpbnZhbGlkIGRvY3VtZW50IGlmIHdlIGhhdmUgbm90aGluZ1xuICAgICAqIGNhY2hlZC5cbiAgICAgKi8gICAgZ2V0RW50cnkodCwgZSkge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEFwcGxpZWQoKTtcbiAgICAgICAgY29uc3QgbiA9IHRoaXMuY2hhbmdlcy5nZXQoZSk7XG4gICAgICAgIHJldHVybiB2b2lkIDAgIT09IG4gPyB1aS5yZXNvbHZlKG4pIDogdGhpcy5nZXRGcm9tQ2FjaGUodCwgZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvb2tzIHVwIHNldmVyYWwgZW50cmllcyBpbiB0aGUgY2FjaGUsIGZvcndhcmRpbmcgdG9cbiAgICAgKiBgUmVtb3RlRG9jdW1lbnRDYWNoZS5nZXRFbnRyeSgpYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbiAtIFRoZSB0cmFuc2FjdGlvbiBpbiB3aGljaCB0byBwZXJmb3JtIGFueSBwZXJzaXN0ZW5jZVxuICAgICAqICAgICBvcGVyYXRpb25zLlxuICAgICAqIEBwYXJhbSBkb2N1bWVudEtleXMgLSBUaGUga2V5cyBvZiB0aGUgZW50cmllcyB0byBsb29rIHVwLlxuICAgICAqIEByZXR1cm5zIEEgbWFwIG9mIGNhY2hlZCBkb2N1bWVudHMsIGluZGV4ZWQgYnkga2V5LiBJZiBhbiBlbnRyeSBjYW5ub3QgYmVcbiAgICAgKiAgICAgZm91bmQsIHRoZSBjb3JyZXNwb25kaW5nIGtleSB3aWxsIGJlIG1hcHBlZCB0byBhbiBpbnZhbGlkIGRvY3VtZW50LlxuICAgICAqLyAgICBnZXRFbnRyaWVzKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWxsRnJvbUNhY2hlKHQsIGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIGJ1ZmZlcmVkIGNoYW5nZXMgdG8gdGhlIHVuZGVybHlpbmcgUmVtb3RlRG9jdW1lbnRDYWNoZSwgdXNpbmdcbiAgICAgKiB0aGUgcHJvdmlkZWQgdHJhbnNhY3Rpb24uXG4gICAgICovICAgIGFwcGx5KHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXNzZXJ0Tm90QXBwbGllZCgpLCB0aGlzLmNoYW5nZXNBcHBsaWVkID0gITAsIHRoaXMuYXBwbHlDaGFuZ2VzKHQpO1xuICAgIH1cbiAgICAvKiogSGVscGVyIHRvIGFzc2VydCB0aGlzLmNoYW5nZXMgaXMgbm90IG51bGwgICovICAgIGFzc2VydE5vdEFwcGxpZWQoKSB7fVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBUaGUgUmVtb3RlRG9jdW1lbnRDYWNoZSBmb3IgSW5kZXhlZERiLiBUbyBjb25zdHJ1Y3QsIGludm9rZVxuICogYG5ld0luZGV4ZWREYlJlbW90ZURvY3VtZW50Q2FjaGUoKWAuXG4gKi8gY2xhc3MgU3Ige1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5NID0gdDtcbiAgICB9XG4gICAgc2V0SW5kZXhNYW5hZ2VyKHQpIHtcbiAgICAgICAgdGhpcy5pbmRleE1hbmFnZXIgPSB0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBzdXBwbGllZCBlbnRyaWVzIHRvIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEFsbCBjYWxscyBvZiBgYWRkRW50cnlgIGFyZSByZXF1aXJlZCB0byBnbyB0aHJvdWdoIHRoZSBSZW1vdGVEb2N1bWVudENoYW5nZUJ1ZmZlclxuICAgICAqIHJldHVybmVkIGJ5IGBuZXdDaGFuZ2VCdWZmZXIoKWAgdG8gZW5zdXJlIHByb3BlciBhY2NvdW50aW5nIG9mIG1ldGFkYXRhLlxuICAgICAqLyAgICBhZGRFbnRyeSh0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiB4cih0KS5wdXQoTnIoZSksIG4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgZG9jdW1lbnQgZnJvbSB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBBbGwgY2FsbHMgb2YgYHJlbW92ZUVudHJ5YCAgYXJlIHJlcXVpcmVkIHRvIGdvIHRocm91Z2ggdGhlIFJlbW90ZURvY3VtZW50Q2hhbmdlQnVmZmVyXG4gICAgICogcmV0dXJuZWQgYnkgYG5ld0NoYW5nZUJ1ZmZlcigpYCB0byBlbnN1cmUgcHJvcGVyIGFjY291bnRpbmcgb2YgbWV0YWRhdGEuXG4gICAgICovICAgIHJlbW92ZUVudHJ5KHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IHhyKHQpLCBzID0gTnIoZSk7XG4gICAgICAgIHJldHVybiBuLmRlbGV0ZShzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgY3VycmVudCBjYWNoZSBzaXplLlxuICAgICAqXG4gICAgICogQ2FsbGVycyB0byBgYWRkRW50cnkoKWAgYW5kIGByZW1vdmVFbnRyeSgpYCAqbXVzdCogY2FsbCB0aGlzIGFmdGVyd2FyZHMgdG8gdXBkYXRlIHRoZVxuICAgICAqIGNhY2hlJ3MgbWV0YWRhdGEuXG4gICAgICovICAgIHVwZGF0ZU1ldGFkYXRhKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWV0YWRhdGEodCkubmV4dCgobiA9PiAobi5ieXRlU2l6ZSArPSBlLCB0aGlzLk9uKHQsIG4pKSkpO1xuICAgIH1cbiAgICBnZXRFbnRyeSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB4cih0KS5nZXQoTnIoZSkpLm5leHQoKHQgPT4gdGhpcy4kbihlLCB0KSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb29rcyB1cCBhbiBlbnRyeSBpbiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZG9jdW1lbnRLZXkgLSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBsb29rIHVwLlxuICAgICAqIEByZXR1cm5zIFRoZSBjYWNoZWQgZG9jdW1lbnQgZW50cnkgYW5kIGl0cyBzaXplLlxuICAgICAqLyAgICBGbih0LCBlKSB7XG4gICAgICAgIHJldHVybiB4cih0KS5nZXQoTnIoZSkpLm5leHQoKHQgPT4gKHtcbiAgICAgICAgICAgIGRvY3VtZW50OiB0aGlzLiRuKGUsIHQpLFxuICAgICAgICAgICAgc2l6ZTogaHIodClcbiAgICAgICAgfSkpKTtcbiAgICB9XG4gICAgZ2V0RW50cmllcyh0LCBlKSB7XG4gICAgICAgIGxldCBuID0gRm4oKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuQm4odCwgZSwgKCh0LCBlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzID0gdGhpcy4kbih0LCBlKTtcbiAgICAgICAgICAgIG4gPSBuLmluc2VydCh0LCBzKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IG4pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9va3MgdXAgc2V2ZXJhbCBlbnRyaWVzIGluIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkb2N1bWVudEtleXMgLSBUaGUgc2V0IG9mIGtleXMgZW50cmllcyB0byBsb29rIHVwLlxuICAgICAqIEByZXR1cm5zIEEgbWFwIG9mIGRvY3VtZW50cyBpbmRleGVkIGJ5IGtleSBhbmQgYSBtYXAgb2Ygc2l6ZXMgaW5kZXhlZCBieVxuICAgICAqICAgICBrZXkgKHplcm8gaWYgdGhlIGRvY3VtZW50IGRvZXMgbm90IGV4aXN0KS5cbiAgICAgKi8gICAgTG4odCwgZSkge1xuICAgICAgICBsZXQgbiA9IEZuKCksIHMgPSBuZXcgQ24oeHQuY29tcGFyYXRvcik7XG4gICAgICAgIHJldHVybiB0aGlzLkJuKHQsIGUsICgodCwgZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuJG4odCwgZSk7XG4gICAgICAgICAgICBuID0gbi5pbnNlcnQodCwgaSksIHMgPSBzLmluc2VydCh0LCBocihlKSk7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiAoe1xuICAgICAgICAgICAgZG9jdW1lbnRzOiBuLFxuICAgICAgICAgICAgcW46IHNcbiAgICAgICAgfSkpKTtcbiAgICB9XG4gICAgQm4odCwgZSwgbikge1xuICAgICAgICBpZiAoZS5pc0VtcHR5KCkpIHJldHVybiB1aS5yZXNvbHZlKCk7XG4gICAgICAgIGNvbnN0IHMgPSBJREJLZXlSYW5nZS5ib3VuZChlLmZpcnN0KCkucGF0aC50b0FycmF5KCksIGUubGFzdCgpLnBhdGgudG9BcnJheSgpKSwgaSA9IGUuZ2V0SXRlcmF0b3IoKTtcbiAgICAgICAgbGV0IHIgPSBpLmdldE5leHQoKTtcbiAgICAgICAgcmV0dXJuIHhyKHQpLld0KHtcbiAgICAgICAgICAgIHJhbmdlOiBzXG4gICAgICAgIH0sICgodCwgZSwgcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbyA9IHh0LmZyb21TZWdtZW50cyh0KTtcbiAgICAgICAgICAgIC8vIEdvIHRocm91Z2gga2V5cyBub3QgZm91bmQgaW4gY2FjaGUuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDtyICYmIHh0LmNvbXBhcmF0b3IociwgbykgPCAwOyApIG4ociwgbnVsbCksIHIgPSBpLmdldE5leHQoKTtcbiAgICAgICAgICAgIHIgJiYgci5pc0VxdWFsKG8pICYmIChcbiAgICAgICAgICAgIC8vIEtleSBmb3VuZCBpbiBjYWNoZS5cbiAgICAgICAgICAgIG4ociwgZSksIHIgPSBpLmhhc05leHQoKSA/IGkuZ2V0TmV4dCgpIDogbnVsbCksIFxuICAgICAgICAgICAgLy8gU2tpcCB0byB0aGUgbmV4dCBrZXkgKGlmIHRoZXJlIGlzIG9uZSkuXG4gICAgICAgICAgICByID8gcy5xdChyLnBhdGgudG9BcnJheSgpKSA6IHMuZG9uZSgpO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4ge1xuICAgICAgICAgICAgLy8gVGhlIHJlc3Qgb2YgdGhlIGtleXMgYXJlIG5vdCBpbiB0aGUgY2FjaGUuIE9uZSBjYXNlIHdoZXJlIGBpdGVyYXRlYFxuICAgICAgICAgICAgLy8gYWJvdmUgd29uJ3QgZ28gdGhyb3VnaCB0aGVtIGlzIHdoZW4gdGhlIGNhY2hlIGlzIGVtcHR5LlxuICAgICAgICAgICAgZm9yICg7cjsgKSBuKHIsIG51bGwpLCByID0gaS5oYXNOZXh0KCkgPyBpLmdldE5leHQoKSA6IG51bGw7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgZ2V0QWxsKHQsIGUsIG4pIHtcbiAgICAgICAgbGV0IHMgPSBGbigpO1xuICAgICAgICBjb25zdCBpID0gZS5sZW5ndGggKyAxLCByID0ge307XG4gICAgICAgIGlmIChuLmlzRXF1YWwoY3QubWluKCkpKSB7XG4gICAgICAgICAgICAvLyBEb2N1bWVudHMgYXJlIG9yZGVyZWQgYnkga2V5LCBzbyB3ZSBjYW4gdXNlIGEgcHJlZml4IHNjYW4gdG8gbmFycm93XG4gICAgICAgICAgICAvLyBkb3duIHRoZSBkb2N1bWVudHMgd2UgbmVlZCB0byBtYXRjaCB0aGUgcXVlcnkgYWdhaW5zdC5cbiAgICAgICAgICAgIGNvbnN0IHQgPSBlLnRvQXJyYXkoKTtcbiAgICAgICAgICAgIHIucmFuZ2UgPSBJREJLZXlSYW5nZS5sb3dlckJvdW5kKHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRXhlY3V0ZSBhbiBpbmRleC1mcmVlIHF1ZXJ5IGFuZCBmaWx0ZXIgYnkgcmVhZCB0aW1lLiBUaGlzIGlzIHNhZmVcbiAgICAgICAgICAgIC8vIHNpbmNlIGFsbCBkb2N1bWVudCBjaGFuZ2VzIHRvIHF1ZXJpZXMgdGhhdCBoYXZlIGFcbiAgICAgICAgICAgIC8vIGxhc3RMaW1ib0ZyZWVTbmFwc2hvdFZlcnNpb24gKGBzaW5jZVJlYWRUaW1lYCkgaGF2ZSBhIHJlYWQgdGltZSBzZXQuXG4gICAgICAgICAgICBjb25zdCB0ID0gZS50b0FycmF5KCksIHMgPSBWaShuKTtcbiAgICAgICAgICAgIHIucmFuZ2UgPSBJREJLZXlSYW5nZS5sb3dlckJvdW5kKFsgdCwgcyBdLCBcbiAgICAgICAgICAgIC8qIG9wZW49ICovICEwKSwgci5pbmRleCA9IFwiY29sbGVjdGlvblJlYWRUaW1lSW5kZXhcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geHIodCkuV3QociwgKCh0LCBuLCByKSA9PiB7XG4gICAgICAgICAgICAvLyBUaGUgcXVlcnkgaXMgYWN0dWFsbHkgcmV0dXJuaW5nIGFueSBwYXRoIHRoYXQgc3RhcnRzIHdpdGggdGhlIHF1ZXJ5XG4gICAgICAgICAgICAvLyBwYXRoIHByZWZpeCB3aGljaCBtYXkgaW5jbHVkZSBkb2N1bWVudHMgaW4gc3ViY29sbGVjdGlvbnMuIEZvclxuICAgICAgICAgICAgLy8gZXhhbXBsZSwgYSBxdWVyeSBvbiAncm9vbXMnIHdpbGwgcmV0dXJuIHJvb21zL2FiYy9tZXNzYWdlcy94eXggYnV0IHdlXG4gICAgICAgICAgICAvLyBzaG91bGRuJ3QgbWF0Y2ggaXQuIEZpeCB0aGlzIGJ5IGRpc2NhcmRpbmcgcm93cyB3aXRoIGRvY3VtZW50IGtleXNcbiAgICAgICAgICAgIC8vIG1vcmUgdGhhbiBvbmUgc2VnbWVudCBsb25nZXIgdGhhbiB0aGUgcXVlcnkgcGF0aC5cbiAgICAgICAgICAgIGlmICh0Lmxlbmd0aCAhPT0gaSkgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgbyA9IHRoaXMuJG4oeHQuZnJvbVNlZ21lbnRzKHQpLCBuKTtcbiAgICAgICAgICAgIGUuaXNQcmVmaXhPZihvLmtleS5wYXRoKSA/IHMgPSBzLmluc2VydChvLmtleSwgbykgOiByLmRvbmUoKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IHMpKTtcbiAgICB9XG4gICAgbmV3Q2hhbmdlQnVmZmVyKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEcih0aGlzLCAhIXQgJiYgdC50cmFja1JlbW92YWxzKTtcbiAgICB9XG4gICAgZ2V0U2l6ZSh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE1ldGFkYXRhKHQpLm5leHQoKHQgPT4gdC5ieXRlU2l6ZSkpO1xuICAgIH1cbiAgICBnZXRNZXRhZGF0YSh0KSB7XG4gICAgICAgIHJldHVybiBDcih0KS5nZXQoXCJyZW1vdGVEb2N1bWVudEdsb2JhbEtleVwiKS5uZXh0KCh0ID0+IChxKCEhdCksIHQpKSk7XG4gICAgfVxuICAgIE9uKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIENyKHQpLnB1dChcInJlbW90ZURvY3VtZW50R2xvYmFsS2V5XCIsIGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWNvZGVzIGBkYlJlbW90ZURvY2AgYW5kIHJldHVybnMgdGhlIGRvY3VtZW50IChvciBhbiBpbnZhbGlkIGRvY3VtZW50IGlmXG4gICAgICogdGhlIGRvY3VtZW50IGNvcnJlc3BvbmRzIHRvIHRoZSBmb3JtYXQgdXNlZCBmb3Igc2VudGluZWwgZGVsZXRlcykuXG4gICAgICovICAgICRuKHQsIGUpIHtcbiAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBiaSh0aGlzLk0sIGUpO1xuICAgICAgICAgICAgLy8gV2hldGhlciB0aGUgZG9jdW1lbnQgaXMgYSBzZW50aW5lbCByZW1vdmFsIGFuZCBzaG91bGQgb25seSBiZSB1c2VkIGluIHRoZVxuICAgICAgICAgICAgLy8gYGdldE5ld0RvY3VtZW50Q2hhbmdlcygpYFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodC5pc05vRG9jdW1lbnQoKSAmJiB0LnZlcnNpb24uaXNFcXVhbChjdC5taW4oKSkpKSByZXR1cm4gdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGUubmV3SW52YWxpZERvY3VtZW50KHQpO1xuICAgIH1cbn1cblxuLyoqIENyZWF0ZXMgYSBuZXcgSW5kZXhlZERiUmVtb3RlRG9jdW1lbnRDYWNoZS4gKi9cbi8qKlxuICogSGFuZGxlcyB0aGUgZGV0YWlscyBvZiBhZGRpbmcgYW5kIHVwZGF0aW5nIGRvY3VtZW50cyBpbiB0aGUgSW5kZXhlZERiUmVtb3RlRG9jdW1lbnRDYWNoZS5cbiAqXG4gKiBVbmxpa2UgdGhlIE1lbW9yeVJlbW90ZURvY3VtZW50Q2hhbmdlQnVmZmVyLCB0aGUgSW5kZXhlZERiIGltcGxlbWVudGF0aW9uIGNvbXB1dGVzIHRoZSBzaXplXG4gKiBkZWx0YSBmb3IgYWxsIHN1Ym1pdHRlZCBjaGFuZ2VzLiBUaGlzIGF2b2lkcyBoYXZpbmcgdG8gcmUtcmVhZCBhbGwgZG9jdW1lbnRzIGZyb20gSW5kZXhlZERiXG4gKiB3aGVuIHdlIGFwcGx5IHRoZSBjaGFuZ2VzLlxuICovXG5jbGFzcyBEciBleHRlbmRzIHZyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZG9jdW1lbnRDYWNoZSAtIFRoZSBJbmRleGVkRGJSZW1vdGVEb2N1bWVudENhY2hlIHRvIGFwcGx5IHRoZSBjaGFuZ2VzIHRvLlxuICAgICAqIEBwYXJhbSB0cmFja1JlbW92YWxzIC0gV2hldGhlciB0byBjcmVhdGUgc2VudGluZWwgZGVsZXRlcyB0aGF0IGNhbiBiZSB0cmFja2VkIGJ5XG4gICAgICogYGdldE5ld0RvY3VtZW50Q2hhbmdlcygpYC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMuVW4gPSB0LCB0aGlzLnRyYWNrUmVtb3ZhbHMgPSBlLCBcbiAgICAgICAgLy8gQSBtYXAgb2YgZG9jdW1lbnQgc2l6ZXMgcHJpb3IgdG8gYXBwbHlpbmcgdGhlIGNoYW5nZXMgaW4gdGhpcyBidWZmZXIuXG4gICAgICAgIHRoaXMuS24gPSBuZXcgRG4oKHQgPT4gdC50b1N0cmluZygpKSwgKCh0LCBlKSA9PiB0LmlzRXF1YWwoZSkpKTtcbiAgICB9XG4gICAgYXBwbHlDaGFuZ2VzKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IFtdO1xuICAgICAgICBsZXQgbiA9IDAsIHMgPSBuZXcga24oKCh0LCBlKSA9PiBydCh0LmNhbm9uaWNhbFN0cmluZygpLCBlLmNhbm9uaWNhbFN0cmluZygpKSkpO1xuICAgICAgICByZXR1cm4gdGhpcy5jaGFuZ2VzLmZvckVhY2goKChpLCByKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvID0gdGhpcy5Lbi5nZXQoaSk7XG4gICAgICAgICAgICBpZiAoci5pc1ZhbGlkRG9jdW1lbnQoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGEgPSBQaSh0aGlzLlVuLk0sIHIpO1xuICAgICAgICAgICAgICAgIHMgPSBzLmFkZChpLnBhdGgucG9wTGFzdCgpKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1ID0gaHIoYSk7XG4gICAgICAgICAgICAgICAgbiArPSB1IC0gbywgZS5wdXNoKHRoaXMuVW4uYWRkRW50cnkodCwgaSwgYSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChuIC09IG8sIHRoaXMudHJhY2tSZW1vdmFscykge1xuICAgICAgICAgICAgICAgIC8vIEluIG9yZGVyIHRvIHRyYWNrIHJlbW92YWxzLCB3ZSBzdG9yZSBhIFwic2VudGluZWwgZGVsZXRlXCIgaW4gdGhlXG4gICAgICAgICAgICAgICAgLy8gUmVtb3RlRG9jdW1lbnRDYWNoZS4gVGhpcyBlbnRyeSBpcyByZXByZXNlbnRlZCBieSBhIE5vRG9jdW1lbnRcbiAgICAgICAgICAgICAgICAvLyB3aXRoIGEgdmVyc2lvbiBvZiAwIGFuZCBpZ25vcmVkIGJ5IGBtYXliZURlY29kZURvY3VtZW50KClgIGJ1dFxuICAgICAgICAgICAgICAgIC8vIHByZXNlcnZlZCBpbiBgZ2V0TmV3RG9jdW1lbnRDaGFuZ2VzKClgLlxuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBQaSh0aGlzLlVuLk0sIHIuY29udmVydFRvTm9Eb2N1bWVudChjdC5taW4oKSkpO1xuICAgICAgICAgICAgICAgIGUucHVzaCh0aGlzLlVuLmFkZEVudHJ5KHQsIGksIG4pKTtcbiAgICAgICAgICAgIH0gZWxzZSBlLnB1c2godGhpcy5Vbi5yZW1vdmVFbnRyeSh0LCBpKSk7XG4gICAgICAgIH0pKSwgcy5mb3JFYWNoKChuID0+IHtcbiAgICAgICAgICAgIGUucHVzaCh0aGlzLlVuLmluZGV4TWFuYWdlci5hZGRUb0NvbGxlY3Rpb25QYXJlbnRJbmRleCh0LCBuKSk7XG4gICAgICAgIH0pKSwgZS5wdXNoKHRoaXMuVW4udXBkYXRlTWV0YWRhdGEodCwgbikpLCB1aS53YWl0Rm9yKGUpO1xuICAgIH1cbiAgICBnZXRGcm9tQ2FjaGUodCwgZSkge1xuICAgICAgICAvLyBSZWNvcmQgdGhlIHNpemUgb2YgZXZlcnl0aGluZyB3ZSBsb2FkIGZyb20gdGhlIGNhY2hlIHNvIHdlIGNhbiBjb21wdXRlIGEgZGVsdGEgbGF0ZXIuXG4gICAgICAgIHJldHVybiB0aGlzLlVuLkZuKHQsIGUpLm5leHQoKHQgPT4gKHRoaXMuS24uc2V0KGUsIHQuc2l6ZSksIHQuZG9jdW1lbnQpKSk7XG4gICAgfVxuICAgIGdldEFsbEZyb21DYWNoZSh0LCBlKSB7XG4gICAgICAgIC8vIFJlY29yZCB0aGUgc2l6ZSBvZiBldmVyeXRoaW5nIHdlIGxvYWQgZnJvbSB0aGUgY2FjaGUgc28gd2UgY2FuIGNvbXB1dGVcbiAgICAgICAgLy8gYSBkZWx0YSBsYXRlci5cbiAgICAgICAgcmV0dXJuIHRoaXMuVW4uTG4odCwgZSkubmV4dCgoKHtkb2N1bWVudHM6IHQsIHFuOiBlfSkgPT4gKFxuICAgICAgICAvLyBOb3RlOiBgZ2V0QWxsRnJvbUNhY2hlYCByZXR1cm5zIHR3byBtYXBzIGluc3RlYWQgb2YgYSBzaW5nbGUgbWFwIGZyb21cbiAgICAgICAgLy8ga2V5cyB0byBgRG9jdW1lbnRTaXplRW50cnlgcy4gVGhpcyBpcyB0byBhbGxvdyByZXR1cm5pbmcgdGhlXG4gICAgICAgIC8vIGBNdXRhYmxlRG9jdW1lbnRNYXBgIGRpcmVjdGx5LCB3aXRob3V0IGEgY29udmVyc2lvbi5cbiAgICAgICAgZS5mb3JFYWNoKCgodCwgZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5Lbi5zZXQodCwgZSk7XG4gICAgICAgIH0pKSwgdCkpKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIENyKHQpIHtcbiAgICByZXR1cm4gcGkodCwgXCJyZW1vdGVEb2N1bWVudEdsb2JhbFwiKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gZ2V0IGEgdHlwZWQgU2ltcGxlRGJTdG9yZSBmb3IgdGhlIHJlbW90ZURvY3VtZW50cyBvYmplY3Qgc3RvcmUuXG4gKi8gZnVuY3Rpb24geHIodCkge1xuICAgIHJldHVybiBwaSh0LCBcInJlbW90ZURvY3VtZW50c1wiKTtcbn1cblxuZnVuY3Rpb24gTnIodCkge1xuICAgIHJldHVybiB0LnBhdGgudG9BcnJheSgpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLy8gVE9ETyhpbmRleGluZyk6IFJlbW92ZSB0aGlzIGNvbnN0YW50XG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqIFBlcmZvcm1zIGRhdGFiYXNlIGNyZWF0aW9uIGFuZCBzY2hlbWEgdXBncmFkZXMuICovXG5jbGFzcyBrciB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLk0gPSB0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBkYXRhYmFzZSBjcmVhdGlvbiBhbmQgc2NoZW1hIHVwZ3JhZGVzLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IGluIHByb2R1Y3Rpb24sIHRoaXMgbWV0aG9kIGlzIG9ubHkgZXZlciB1c2VkIHRvIHVwZ3JhZGUgdGhlIHNjaGVtYVxuICAgICAqIHRvIFNDSEVNQV9WRVJTSU9OLiBEaWZmZXJlbnQgdmFsdWVzIG9mIHRvVmVyc2lvbiBhcmUgb25seSB1c2VkIGZvciB0ZXN0aW5nXG4gICAgICogYW5kIGxvY2FsIGZlYXR1cmUgZGV2ZWxvcG1lbnQuXG4gICAgICovICAgIGt0KHQsIGUsIG4sIHMpIHtcbiAgICAgICAgY29uc3QgaSA9IG5ldyBjaShcImNyZWF0ZU9yVXBncmFkZVwiLCBlKTtcbiAgICAgICAgbiA8IDEgJiYgcyA+PSAxICYmIChmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICB0LmNyZWF0ZU9iamVjdFN0b3JlKFwib3duZXJcIik7XG4gICAgICAgIH0odCksIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHQuY3JlYXRlT2JqZWN0U3RvcmUoXCJtdXRhdGlvblF1ZXVlc1wiLCB7XG4gICAgICAgICAgICAgICAga2V5UGF0aDogXCJ1c2VySWRcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0LmNyZWF0ZU9iamVjdFN0b3JlKFwibXV0YXRpb25zXCIsIHtcbiAgICAgICAgICAgICAgICBrZXlQYXRoOiBcImJhdGNoSWRcIixcbiAgICAgICAgICAgICAgICBhdXRvSW5jcmVtZW50OiAhMFxuICAgICAgICAgICAgfSkuY3JlYXRlSW5kZXgoXCJ1c2VyTXV0YXRpb25zSW5kZXhcIiwgcXMsIHtcbiAgICAgICAgICAgICAgICB1bmlxdWU6ICEwXG4gICAgICAgICAgICB9KSwgdC5jcmVhdGVPYmplY3RTdG9yZShcImRvY3VtZW50TXV0YXRpb25zXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICogVXBncmFkZSBmdW5jdGlvbiB0byBtaWdyYXRlIHRoZSAnbXV0YXRpb25zJyBzdG9yZSBmcm9tIFYxIHRvIFYzLiBMb2Fkc1xuICogYW5kIHJld3JpdGVzIGFsbCBkYXRhLlxuICovICh0KSwgTXIodCksIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHQuY3JlYXRlT2JqZWN0U3RvcmUoXCJyZW1vdGVEb2N1bWVudHNcIik7XG4gICAgICAgIH0odCkpO1xuICAgICAgICAvLyBNaWdyYXRpb24gMiB0byBwb3B1bGF0ZSB0aGUgdGFyZ2V0R2xvYmFsIG9iamVjdCBubyBsb25nZXIgbmVlZGVkIHNpbmNlXG4gICAgICAgIC8vIG1pZ3JhdGlvbiAzIHVuY29uZGl0aW9uYWxseSBjbGVhcnMgaXQuXG4gICAgICAgICAgICAgICAgbGV0IHIgPSB1aS5yZXNvbHZlKCk7XG4gICAgICAgIHJldHVybiBuIDwgMyAmJiBzID49IDMgJiYgKFxuICAgICAgICAvLyBCcmFuZCBuZXcgY2xpZW50cyBkb24ndCBuZWVkIHRvIGRyb3AgYW5kIHJlY3JlYXRlLS1vbmx5IGNsaWVudHMgdGhhdFxuICAgICAgICAvLyBwb3RlbnRpYWxseSBoYXZlIGNvcnJ1cHQgZGF0YS5cbiAgICAgICAgMCAhPT0gbiAmJiAoIWZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHQuZGVsZXRlT2JqZWN0U3RvcmUoXCJ0YXJnZXREb2N1bWVudHNcIiksIHQuZGVsZXRlT2JqZWN0U3RvcmUoXCJ0YXJnZXRzXCIpLCB0LmRlbGV0ZU9iamVjdFN0b3JlKFwidGFyZ2V0R2xvYmFsXCIpO1xuICAgICAgICB9KHQpLCBNcih0KSksIHIgPSByLm5leHQoKCgpID0+IFxuICAgICAgICAvKipcbiAqIENyZWF0ZXMgdGhlIHRhcmdldCBnbG9iYWwgc2luZ2xldG9uIHJvdy5cbiAqXG4gKiBAcGFyYW0gdHhuIC0gVGhlIHZlcnNpb24gdXBncmFkZSB0cmFuc2FjdGlvbiBmb3IgaW5kZXhlZGRiXG4gKi9cbiAgICAgICAgZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IHQuc3RvcmUoXCJ0YXJnZXRHbG9iYWxcIiksIG4gPSB7XG4gICAgICAgICAgICAgICAgaGlnaGVzdFRhcmdldElkOiAwLFxuICAgICAgICAgICAgICAgIGhpZ2hlc3RMaXN0ZW5TZXF1ZW5jZU51bWJlcjogMCxcbiAgICAgICAgICAgICAgICBsYXN0UmVtb3RlU25hcHNob3RWZXJzaW9uOiBjdC5taW4oKS50b1RpbWVzdGFtcCgpLFxuICAgICAgICAgICAgICAgIHRhcmdldENvdW50OiAwXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGUucHV0KFwidGFyZ2V0R2xvYmFsS2V5XCIsIG4pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICogQ3JlYXRlcyBpbmRpY2VzIG9uIHRoZSBSZW1vdGVEb2N1bWVudHMgc3RvcmUgdXNlZCBmb3IgYm90aCBtdWx0aS10YWJcbiAqIGFuZCBJbmRleC1GcmVlIHF1ZXJpZXMuXG4gKi8gKGkpKSkpLCBuIDwgNCAmJiBzID49IDQgJiYgKDAgIT09IG4gJiYgKFxuICAgICAgICAvLyBTY2hlbWEgdmVyc2lvbiAzIHVzZXMgYXV0by1nZW5lcmF0ZWQga2V5cyB0byBnZW5lcmF0ZSBnbG9iYWxseSB1bmlxdWVcbiAgICAgICAgLy8gbXV0YXRpb24gYmF0Y2ggSURzICh0aGlzIHdhcyBwcmV2aW91c2x5IGVuc3VyZWQgaW50ZXJuYWxseSBieSB0aGVcbiAgICAgICAgLy8gY2xpZW50KS4gVG8gbWlncmF0ZSB0byB0aGUgbmV3IHNjaGVtYSwgd2UgaGF2ZSB0byByZWFkIGFsbCBtdXRhdGlvbnNcbiAgICAgICAgLy8gYW5kIHdyaXRlIHRoZW0gYmFjayBvdXQuIFdlIHByZXNlcnZlIHRoZSBleGlzdGluZyBiYXRjaCBJRHMgdG8gZ3VhcmFudGVlXG4gICAgICAgIC8vIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIgb2JqZWN0IHN0b3Jlcy4gQW55IGZ1cnRoZXIgbXV0YXRpb24gYmF0Y2ggSURzIHdpbGxcbiAgICAgICAgLy8gYmUgYXV0by1nZW5lcmF0ZWQuXG4gICAgICAgIHIgPSByLm5leHQoKCgpID0+IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIHJldHVybiBlLnN0b3JlKFwibXV0YXRpb25zXCIpLlV0KCkubmV4dCgobiA9PiB7XG4gICAgICAgICAgICAgICAgdC5kZWxldGVPYmplY3RTdG9yZShcIm11dGF0aW9uc1wiKTtcbiAgICAgICAgICAgICAgICB0LmNyZWF0ZU9iamVjdFN0b3JlKFwibXV0YXRpb25zXCIsIHtcbiAgICAgICAgICAgICAgICAgICAga2V5UGF0aDogXCJiYXRjaElkXCIsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9JbmNyZW1lbnQ6ICEwXG4gICAgICAgICAgICAgICAgfSkuY3JlYXRlSW5kZXgoXCJ1c2VyTXV0YXRpb25zSW5kZXhcIiwgcXMsIHtcbiAgICAgICAgICAgICAgICAgICAgdW5pcXVlOiAhMFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBlLnN0b3JlKFwibXV0YXRpb25zXCIpLCBpID0gbi5tYXAoKHQgPT4gcy5wdXQodCkpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdWkud2FpdEZvcihpKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSh0LCBpKSkpKSwgciA9IHIubmV4dCgoKCkgPT4ge1xuICAgICAgICAgICAgIWZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICB0LmNyZWF0ZU9iamVjdFN0b3JlKFwiY2xpZW50TWV0YWRhdGFcIiwge1xuICAgICAgICAgICAgICAgICAgICBrZXlQYXRoOiBcImNsaWVudElkXCJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0odCk7XG4gICAgICAgIH0pKSksIG4gPCA1ICYmIHMgPj0gNSAmJiAociA9IHIubmV4dCgoKCkgPT4gdGhpcy5HbihpKSkpKSwgbiA8IDYgJiYgcyA+PSA2ICYmIChyID0gci5uZXh0KCgoKSA9PiAoZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgdC5jcmVhdGVPYmplY3RTdG9yZShcInJlbW90ZURvY3VtZW50R2xvYmFsXCIpO1xuICAgICAgICB9KHQpLCB0aGlzLlFuKGkpKSkpKSwgbiA8IDcgJiYgcyA+PSA3ICYmIChyID0gci5uZXh0KCgoKSA9PiB0aGlzLmpuKGkpKSkpLCBuIDwgOCAmJiBzID49IDggJiYgKHIgPSByLm5leHQoKCgpID0+IHRoaXMuV24odCwgaSkpKSksIFxuICAgICAgICBuIDwgOSAmJiBzID49IDkgJiYgKHIgPSByLm5leHQoKCgpID0+IHtcbiAgICAgICAgICAgIC8vIE11bHRpLVRhYiB1c2VkIHRvIG1hbmFnZSBpdHMgb3duIGNoYW5nZWxvZywgYnV0IHRoaXMgaGFzIGJlZW4gbW92ZWRcbiAgICAgICAgICAgIC8vIHRvIHRoZSBEYlJlbW90ZURvY3VtZW50IG9iamVjdCBzdG9yZSBpdHNlbGYuIFNpbmNlIHRoZSBwcmV2aW91cyBjaGFuZ2VcbiAgICAgICAgICAgIC8vIGxvZyBvbmx5IGNvbnRhaW5lZCB0cmFuc2llbnQgZGF0YSwgd2UgY2FuIGRyb3AgaXRzIG9iamVjdCBzdG9yZS5cbiAgICAgICAgICAgICFmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgdC5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKFwicmVtb3RlRG9jdW1lbnRDaGFuZ2VzXCIpICYmIHQuZGVsZXRlT2JqZWN0U3RvcmUoXCJyZW1vdGVEb2N1bWVudENoYW5nZXNcIik7XG4gICAgICAgICAgICB9KHQpLCBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IHQub2JqZWN0U3RvcmUoXCJyZW1vdGVEb2N1bWVudHNcIik7XG4gICAgICAgICAgICAgICAgZS5jcmVhdGVJbmRleChcInJlYWRUaW1lSW5kZXhcIiwgXCJyZWFkVGltZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHVuaXF1ZTogITFcbiAgICAgICAgICAgICAgICB9KSwgZS5jcmVhdGVJbmRleChcImNvbGxlY3Rpb25SZWFkVGltZUluZGV4XCIsIFFzLCB7XG4gICAgICAgICAgICAgICAgICAgIHVuaXF1ZTogITFcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0oZSk7XG4gICAgICAgIH0pKSksIG4gPCAxMCAmJiBzID49IDEwICYmIChyID0gci5uZXh0KCgoKSA9PiB0aGlzLnpuKGkpKSkpLCBuIDwgMTEgJiYgcyA+PSAxMSAmJiAociA9IHIubmV4dCgoKCkgPT4ge1xuICAgICAgICAgICAgIWZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICB0LmNyZWF0ZU9iamVjdFN0b3JlKFwiYnVuZGxlc1wiLCB7XG4gICAgICAgICAgICAgICAgICAgIGtleVBhdGg6IFwiYnVuZGxlSWRcIlxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSh0KSwgZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIHQuY3JlYXRlT2JqZWN0U3RvcmUoXCJuYW1lZFF1ZXJpZXNcIiwge1xuICAgICAgICAgICAgICAgICAgICBrZXlQYXRoOiBcIm5hbWVcIlxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSh0KTtcbiAgICAgICAgfSkpKSwgbiA8IDEyICYmIHMgPj0gMTIgJiYgKHIgPSByLm5leHQoKCgpID0+IHtcbiAgICAgICAgICAgICFmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IHQuY3JlYXRlT2JqZWN0U3RvcmUoXCJkb2N1bWVudE92ZXJsYXlzXCIsIHtcbiAgICAgICAgICAgICAgICAgICAga2V5UGF0aDogdGlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBlLmNyZWF0ZUluZGV4KFwiY29sbGVjdGlvblBhdGhPdmVybGF5SW5kZXhcIiwgZWksIHtcbiAgICAgICAgICAgICAgICAgICAgdW5pcXVlOiAhMVxuICAgICAgICAgICAgICAgIH0pLCBlLmNyZWF0ZUluZGV4KFwiY29sbGVjdGlvbkdyb3VwT3ZlcmxheUluZGV4XCIsIG5pLCB7XG4gICAgICAgICAgICAgICAgICAgIHVuaXF1ZTogITFcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovICh0KTtcbiAgICAgICAgfSkpKSwgbiA8IDEzICYmIHMgPj0gMTMgJiYgKHIgPSByLm5leHQoKCgpID0+IHtcbiAgICAgICAgICAgICFmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgdC5jcmVhdGVPYmplY3RTdG9yZShcImluZGV4Q29uZmlndXJhdGlvblwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGtleVBhdGg6IFwiaW5kZXhJZFwiLFxuICAgICAgICAgICAgICAgICAgICBhdXRvSW5jcmVtZW50OiAhMFxuICAgICAgICAgICAgICAgIH0pLmNyZWF0ZUluZGV4KFwiY29sbGVjdGlvbkdyb3VwSW5kZXhcIiwgXCJjb2xsZWN0aW9uR3JvdXBcIiwge1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWU6ICExXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdC5jcmVhdGVPYmplY3RTdG9yZShcImluZGV4U3RhdGVcIiwge1xuICAgICAgICAgICAgICAgICAgICBrZXlQYXRoOiBKc1xuICAgICAgICAgICAgICAgIH0pLmNyZWF0ZUluZGV4KFwic2VxdWVuY2VOdW1iZXJJbmRleFwiLCBZcywge1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWU6ICExXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdC5jcmVhdGVPYmplY3RTdG9yZShcImluZGV4RW50cmllc1wiLCB7XG4gICAgICAgICAgICAgICAgICAgIGtleVBhdGg6IFhzXG4gICAgICAgICAgICAgICAgfSkuY3JlYXRlSW5kZXgoXCJkb2N1bWVudEtleUluZGV4XCIsIFpzLCB7XG4gICAgICAgICAgICAgICAgICAgIHVuaXF1ZTogITFcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0odCk7XG4gICAgICAgIH0pKSksIHI7XG4gICAgfVxuICAgIFFuKHQpIHtcbiAgICAgICAgbGV0IGUgPSAwO1xuICAgICAgICByZXR1cm4gdC5zdG9yZShcInJlbW90ZURvY3VtZW50c1wiKS5XdCgoKHQsIG4pID0+IHtcbiAgICAgICAgICAgIGUgKz0gaHIobik7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuID0ge1xuICAgICAgICAgICAgICAgIGJ5dGVTaXplOiBlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHQuc3RvcmUoXCJyZW1vdGVEb2N1bWVudEdsb2JhbFwiKS5wdXQoXCJyZW1vdGVEb2N1bWVudEdsb2JhbEtleVwiLCBuKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBHbih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0LnN0b3JlKFwibXV0YXRpb25RdWV1ZXNcIiksIG4gPSB0LnN0b3JlKFwibXV0YXRpb25zXCIpO1xuICAgICAgICByZXR1cm4gZS5VdCgpLm5leHQoKGUgPT4gdWkuZm9yRWFjaChlLCAoZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzID0gSURCS2V5UmFuZ2UuYm91bmQoWyBlLnVzZXJJZCwgLTEgXSwgWyBlLnVzZXJJZCwgZS5sYXN0QWNrbm93bGVkZ2VkQmF0Y2hJZCBdKTtcbiAgICAgICAgICAgIHJldHVybiBuLlV0KFwidXNlck11dGF0aW9uc0luZGV4XCIsIHMpLm5leHQoKG4gPT4gdWkuZm9yRWFjaChuLCAobiA9PiB7XG4gICAgICAgICAgICAgICAgcShuLnVzZXJJZCA9PT0gZS51c2VySWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBDaSh0aGlzLk0sIG4pO1xuICAgICAgICAgICAgICAgIHJldHVybiBjcih0LCBlLnVzZXJJZCwgcykubmV4dCgoKCkgPT4ge30pKTtcbiAgICAgICAgICAgIH0pKSkpO1xuICAgICAgICB9KSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5zdXJlcyB0aGF0IGV2ZXJ5IGRvY3VtZW50IGluIHRoZSByZW1vdGUgZG9jdW1lbnQgY2FjaGUgaGFzIGEgY29ycmVzcG9uZGluZyBzZW50aW5lbCByb3dcbiAgICAgKiB3aXRoIGEgc2VxdWVuY2UgbnVtYmVyLiBNaXNzaW5nIHJvd3MgYXJlIGdpdmVuIHRoZSBtb3N0IHJlY2VudGx5IHVzZWQgc2VxdWVuY2UgbnVtYmVyLlxuICAgICAqLyAgICBqbih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0LnN0b3JlKFwidGFyZ2V0RG9jdW1lbnRzXCIpLCBuID0gdC5zdG9yZShcInJlbW90ZURvY3VtZW50c1wiKTtcbiAgICAgICAgcmV0dXJuIHQuc3RvcmUoXCJ0YXJnZXRHbG9iYWxcIikuZ2V0KFwidGFyZ2V0R2xvYmFsS2V5XCIpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgY29uc3QgcyA9IFtdO1xuICAgICAgICAgICAgcmV0dXJuIG4uV3QoKChuLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgciA9IG5ldyBfdChuKSwgbyA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgMCwgJHModCkgXTtcbiAgICAgICAgICAgICAgICB9KHIpO1xuICAgICAgICAgICAgICAgIHMucHVzaChlLmdldChvKS5uZXh0KChuID0+IG4gPyB1aS5yZXNvbHZlKCkgOiAobiA9PiBlLnB1dCh7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldElkOiAwLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiAkcyhuKSxcbiAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VOdW1iZXI6IHQuaGlnaGVzdExpc3RlblNlcXVlbmNlTnVtYmVyXG4gICAgICAgICAgICAgICAgfSkpKHIpKSkpO1xuICAgICAgICAgICAgfSkpLm5leHQoKCgpID0+IHVpLndhaXRGb3IocykpKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBXbih0LCBlKSB7XG4gICAgICAgIC8vIENyZWF0ZSB0aGUgaW5kZXguXG4gICAgICAgIHQuY3JlYXRlT2JqZWN0U3RvcmUoXCJjb2xsZWN0aW9uUGFyZW50c1wiLCB7XG4gICAgICAgICAgICBrZXlQYXRoOiBIc1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgbiA9IGUuc3RvcmUoXCJjb2xsZWN0aW9uUGFyZW50c1wiKSwgcyA9IG5ldyB0ciwgaSA9IHQgPT4ge1xuICAgICAgICAgICAgaWYgKHMuYWRkKHQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IHQubGFzdFNlZ21lbnQoKSwgcyA9IHQucG9wTGFzdCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuLnB1dCh7XG4gICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25JZDogZSxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiAkcyhzKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBIZWxwZXIgdG8gYWRkIGFuIGluZGV4IGVudHJ5IGlmZiB3ZSBoYXZlbid0IGFscmVhZHkgd3JpdHRlbiBpdC5cbiAgICAgICAgICAgICAgICAvLyBJbmRleCBleGlzdGluZyByZW1vdGUgZG9jdW1lbnRzLlxuICAgICAgICByZXR1cm4gZS5zdG9yZShcInJlbW90ZURvY3VtZW50c1wiKS5XdCh7XG4gICAgICAgICAgICBqdDogITBcbiAgICAgICAgfSwgKCh0LCBlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuID0gbmV3IF90KHQpO1xuICAgICAgICAgICAgcmV0dXJuIGkobi5wb3BMYXN0KCkpO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4gZS5zdG9yZShcImRvY3VtZW50TXV0YXRpb25zXCIpLld0KHtcbiAgICAgICAgICAgIGp0OiAhMFxuICAgICAgICB9LCAoKFt0LCBlLCBuXSwgcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgciA9IExzKGUpO1xuICAgICAgICAgICAgcmV0dXJuIGkoci5wb3BMYXN0KCkpO1xuICAgICAgICB9KSkpKTtcbiAgICB9XG4gICAgem4odCkge1xuICAgICAgICBjb25zdCBlID0gdC5zdG9yZShcInRhcmdldHNcIik7XG4gICAgICAgIHJldHVybiBlLld0KCgodCwgbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgcyA9IHhpKG4pLCBpID0gTmkodGhpcy5NLCBzKTtcbiAgICAgICAgICAgIHJldHVybiBlLnB1dChpKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gTXIodCkge1xuICAgIHQuY3JlYXRlT2JqZWN0U3RvcmUoXCJ0YXJnZXREb2N1bWVudHNcIiwge1xuICAgICAgICBrZXlQYXRoOiBXc1xuICAgIH0pLmNyZWF0ZUluZGV4KFwiZG9jdW1lbnRUYXJnZXRzSW5kZXhcIiwgenMsIHtcbiAgICAgICAgdW5pcXVlOiAhMFxuICAgIH0pO1xuICAgIC8vIE5PVEU6IFRoaXMgaXMgdW5pcXVlIG9ubHkgYmVjYXVzZSB0aGUgVGFyZ2V0SWQgaXMgdGhlIHN1ZmZpeC5cbiAgICB0LmNyZWF0ZU9iamVjdFN0b3JlKFwidGFyZ2V0c1wiLCB7XG4gICAgICAgIGtleVBhdGg6IFwidGFyZ2V0SWRcIlxuICAgIH0pLmNyZWF0ZUluZGV4KFwicXVlcnlUYXJnZXRzSW5kZXhcIiwganMsIHtcbiAgICAgICAgdW5pcXVlOiAhMFxuICAgIH0pLCB0LmNyZWF0ZU9iamVjdFN0b3JlKFwidGFyZ2V0R2xvYmFsXCIpO1xufVxuXG5jb25zdCBPciA9IFwiRmFpbGVkIHRvIG9idGFpbiBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSBwZXJzaXN0ZW5jZSBsYXllci4gVG8gYWxsb3cgc2hhcmVkIGFjY2VzcywgbXVsdGktdGFiIHN5bmNocm9uaXphdGlvbiBoYXMgdG8gYmUgZW5hYmxlZCBpbiBhbGwgdGFicy4gSWYgeW91IGFyZSB1c2luZyBgZXhwZXJpbWVudGFsRm9yY2VPd25pbmdUYWI6dHJ1ZWAsIG1ha2Ugc3VyZSB0aGF0IG9ubHkgb25lIHRhYiBoYXMgcGVyc2lzdGVuY2UgZW5hYmxlZCBhdCBhbnkgZ2l2ZW4gdGltZS5cIjtcblxuLyoqXG4gKiBPbGRlc3QgYWNjZXB0YWJsZSBhZ2UgaW4gbWlsbGlzZWNvbmRzIGZvciBjbGllbnQgbWV0YWRhdGEgYmVmb3JlIHRoZSBjbGllbnRcbiAqIGlzIGNvbnNpZGVyZWQgaW5hY3RpdmUgYW5kIGl0cyBhc3NvY2lhdGVkIGRhdGEgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuXG4gKi9cbi8qKlxuICogQW4gSW5kZXhlZERCLWJhY2tlZCBpbnN0YW5jZSBvZiBQZXJzaXN0ZW5jZS4gRGF0YSBpcyBzdG9yZWQgcGVyc2lzdGVudGx5XG4gKiBhY3Jvc3Mgc2Vzc2lvbnMuXG4gKlxuICogT24gV2ViIG9ubHksIHRoZSBGaXJlc3RvcmUgU0RLcyBzdXBwb3J0IHNoYXJlZCBhY2Nlc3MgdG8gaXRzIHBlcnNpc3RlbmNlXG4gKiBsYXllci4gVGhpcyBhbGxvd3MgbXVsdGlwbGUgYnJvd3NlciB0YWJzIHRvIHJlYWQgYW5kIHdyaXRlIHRvIEluZGV4ZWREYiBhbmRcbiAqIHRvIHN5bmNocm9uaXplIHN0YXRlIGV2ZW4gd2l0aG91dCBuZXR3b3JrIGNvbm5lY3Rpdml0eS4gU2hhcmVkIGFjY2VzcyBpc1xuICogY3VycmVudGx5IG9wdGlvbmFsIGFuZCBub3QgZW5hYmxlZCB1bmxlc3MgYWxsIGNsaWVudHMgaW52b2tlXG4gKiBgZW5hYmxlUGVyc2lzdGVuY2UoKWAgd2l0aCBge3N5bmNocm9uaXplVGFiczp0cnVlfWAuXG4gKlxuICogSW4gbXVsdGktdGFiIG1vZGUsIGlmIG11bHRpcGxlIGNsaWVudHMgYXJlIGFjdGl2ZSBhdCB0aGUgc2FtZSB0aW1lLCB0aGUgU0RLXG4gKiB3aWxsIGRlc2lnbmF0ZSBvbmUgY2xpZW50IGFzIHRoZSDigJxwcmltYXJ5IGNsaWVudOKAnS4gQW4gZWZmb3J0IGlzIG1hZGUgdG8gcGlja1xuICogYSB2aXNpYmxlLCBuZXR3b3JrLWNvbm5lY3RlZCBhbmQgYWN0aXZlIGNsaWVudCwgYW5kIHRoaXMgY2xpZW50IGlzXG4gKiByZXNwb25zaWJsZSBmb3IgbGV0dGluZyBvdGhlciBjbGllbnRzIGtub3cgYWJvdXQgaXRzIHByZXNlbmNlLiBUaGUgcHJpbWFyeVxuICogY2xpZW50IHdyaXRlcyBhIHVuaXF1ZSBjbGllbnQtZ2VuZXJhdGVkIGlkZW50aWZpZXIgKHRoZSBjbGllbnQgSUQpIHRvXG4gKiBJbmRleGVkRGLigJlzIOKAnG93bmVy4oCdIHN0b3JlIGV2ZXJ5IDQgc2Vjb25kcy4gSWYgdGhlIHByaW1hcnkgY2xpZW50IGZhaWxzIHRvXG4gKiB1cGRhdGUgdGhpcyBlbnRyeSwgYW5vdGhlciBjbGllbnQgY2FuIGFjcXVpcmUgdGhlIGxlYXNlIGFuZCB0YWtlIG92ZXIgYXNcbiAqIHByaW1hcnkuXG4gKlxuICogU29tZSBwZXJzaXN0ZW5jZSBvcGVyYXRpb25zIGluIHRoZSBTREsgYXJlIGRlc2lnbmF0ZWQgYXMgcHJpbWFyeS1jbGllbnQgb25seVxuICogb3BlcmF0aW9ucy4gVGhpcyBpbmNsdWRlcyB0aGUgYWNrbm93bGVkZ21lbnQgb2YgbXV0YXRpb25zIGFuZCBhbGwgdXBkYXRlcyBvZlxuICogcmVtb3RlIGRvY3VtZW50cy4gVGhlIGVmZmVjdHMgb2YgdGhlc2Ugb3BlcmF0aW9ucyBhcmUgd3JpdHRlbiB0byBwZXJzaXN0ZW5jZVxuICogYW5kIHRoZW4gYnJvYWRjYXN0IHRvIG90aGVyIHRhYnMgdmlhIExvY2FsU3RvcmFnZSAoc2VlXG4gKiBgV2ViU3RvcmFnZVNoYXJlZENsaWVudFN0YXRlYCksIHdoaWNoIHRoZW4gcmVmcmVzaCB0aGVpciBzdGF0ZSBmcm9tXG4gKiBwZXJzaXN0ZW5jZS5cbiAqXG4gKiBTaW1pbGFybHksIHRoZSBwcmltYXJ5IGNsaWVudCBsaXN0ZW5zIHRvIG5vdGlmaWNhdGlvbnMgc2VudCBieSBzZWNvbmRhcnlcbiAqIGNsaWVudHMgdG8gZGlzY292ZXIgcGVyc2lzdGVuY2UgY2hhbmdlcyB3cml0dGVuIGJ5IHNlY29uZGFyeSBjbGllbnRzLCBzdWNoIGFzXG4gKiB0aGUgYWRkaXRpb24gb2YgbmV3IG11dGF0aW9ucyBhbmQgcXVlcnkgdGFyZ2V0cy5cbiAqXG4gKiBJZiBtdWx0aS10YWIgaXMgbm90IGVuYWJsZWQgYW5kIGFub3RoZXIgdGFiIGFscmVhZHkgb2J0YWluZWQgdGhlIHByaW1hcnlcbiAqIGxlYXNlLCBJbmRleGVkRGJQZXJzaXN0ZW5jZSBlbnRlcnMgYSBmYWlsZWQgc3RhdGUgYW5kIGFsbCBzdWJzZXF1ZW50XG4gKiBvcGVyYXRpb25zIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLlxuICpcbiAqIEFkZGl0aW9uYWxseSwgdGhlcmUgaXMgYW4gb3B0aW1pemF0aW9uIHNvIHRoYXQgd2hlbiBhIHRhYiBpcyBjbG9zZWQsIHRoZVxuICogcHJpbWFyeSBsZWFzZSBpcyByZWxlYXNlZCBpbW1lZGlhdGVseSAodGhpcyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudCB0byBtYWtlXG4gKiBzdXJlIHRoYXQgYSByZWZyZXNoZWQgdGFiIGlzIGFibGUgdG8gaW1tZWRpYXRlbHkgcmUtYWNxdWlyZSB0aGUgcHJpbWFyeVxuICogbGVhc2UpLiBVbmZvcnR1bmF0ZWx5LCBJbmRleGVkREIgY2Fubm90IGJlIHJlbGlhYmx5IHVzZWQgaW4gd2luZG93LnVubG9hZFxuICogc2luY2UgaXQgaXMgYW4gYXN5bmNocm9ub3VzIEFQSS4gU28gaW4gYWRkaXRpb24gdG8gYXR0ZW1wdGluZyB0byBnaXZlIHVwIHRoZVxuICogbGVhc2UsIHRoZSBsZWFzZWhvbGRlciB3cml0ZXMgaXRzIGNsaWVudCBJRCB0byBhIFwiem9tYmllZENsaWVudFwiIGVudHJ5IGluXG4gKiBMb2NhbFN0b3JhZ2Ugd2hpY2ggYWN0cyBhcyBhbiBpbmRpY2F0b3IgdGhhdCBhbm90aGVyIHRhYiBzaG91bGQgZ28gYWhlYWQgYW5kXG4gKiB0YWtlIHRoZSBwcmltYXJ5IGxlYXNlIGltbWVkaWF0ZWx5IHJlZ2FyZGxlc3Mgb2YgdGhlIGN1cnJlbnQgbGVhc2UgdGltZXN0YW1wLlxuICpcbiAqIFRPRE8oYi8xMTQyMjYyMzQpOiBSZW1vdmUgYHN5bmNocm9uaXplVGFic2Agc2VjdGlvbiB3aGVuIG11bHRpLXRhYiBpcyBub1xuICogbG9uZ2VyIG9wdGlvbmFsLlxuICovXG5jbGFzcyAkciB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBzeW5jaHJvbml6ZSB0aGUgaW4tbWVtb3J5IHN0YXRlIG9mIG11bHRpcGxlIHRhYnMgYW5kIHNoYXJlXG4gICAgICogYWNjZXNzIHRvIGxvY2FsIHBlcnNpc3RlbmNlLlxuICAgICAqL1xuICAgIHQsIGUsIG4sIHMsIGksIHIsIG8sIGEsIHUsIFxuICAgIC8qKlxuICAgICAqIElmIHNldCB0byB0cnVlLCBmb3JjZWZ1bGx5IG9idGFpbnMgZGF0YWJhc2UgYWNjZXNzLiBFeGlzdGluZyB0YWJzIHdpbGxcbiAgICAgKiBubyBsb25nZXIgYmUgYWJsZSB0byBhY2Nlc3MgSW5kZXhlZERCLlxuICAgICAqL1xuICAgIGMsIGggPSAxMikge1xuICAgICAgICBpZiAodGhpcy5hbGxvd1RhYlN5bmNocm9uaXphdGlvbiA9IHQsIHRoaXMucGVyc2lzdGVuY2VLZXkgPSBlLCB0aGlzLmNsaWVudElkID0gbiwgXG4gICAgICAgIHRoaXMuSG4gPSBpLCB0aGlzLndpbmRvdyA9IHIsIHRoaXMuZG9jdW1lbnQgPSBvLCB0aGlzLkpuID0gdSwgdGhpcy5ZbiA9IGMsIHRoaXMuWG4gPSBoLCBcbiAgICAgICAgdGhpcy5abiA9IG51bGwsIHRoaXMudHMgPSAhMSwgdGhpcy5pc1ByaW1hcnkgPSAhMSwgdGhpcy5uZXR3b3JrRW5hYmxlZCA9ICEwLCBcbiAgICAgICAgLyoqIE91ciB3aW5kb3cudW5sb2FkIGhhbmRsZXIsIGlmIHJlZ2lzdGVyZWQuICovXG4gICAgICAgIHRoaXMuZXMgPSBudWxsLCB0aGlzLmluRm9yZWdyb3VuZCA9ICExLCBcbiAgICAgICAgLyoqIE91ciAndmlzaWJpbGl0eWNoYW5nZScgbGlzdGVuZXIgaWYgcmVnaXN0ZXJlZC4gKi9cbiAgICAgICAgdGhpcy5ucyA9IG51bGwsIFxuICAgICAgICAvKiogVGhlIGNsaWVudCBtZXRhZGF0YSByZWZyZXNoIHRhc2suICovXG4gICAgICAgIHRoaXMuc3MgPSBudWxsLCBcbiAgICAgICAgLyoqIFRoZSBsYXN0IHRpbWUgd2UgZ2FyYmFnZSBjb2xsZWN0ZWQgdGhlIGNsaWVudCBtZXRhZGF0YSBvYmplY3Qgc3RvcmUuICovXG4gICAgICAgIHRoaXMucnMgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksIFxuICAgICAgICAvKiogQSBsaXN0ZW5lciB0byBub3RpZnkgb24gcHJpbWFyeSBzdGF0ZSBjaGFuZ2VzLiAqL1xuICAgICAgICB0aGlzLm9zID0gdCA9PiBQcm9taXNlLnJlc29sdmUoKSwgISRyLnZ0KCkpIHRocm93IG5ldyBRKEcuVU5JTVBMRU1FTlRFRCwgXCJUaGlzIHBsYXRmb3JtIGlzIGVpdGhlciBtaXNzaW5nIEluZGV4ZWREQiBvciBpcyBrbm93biB0byBoYXZlIGFuIGluY29tcGxldGUgaW1wbGVtZW50YXRpb24uIE9mZmxpbmUgcGVyc2lzdGVuY2UgaGFzIGJlZW4gZGlzYWJsZWQuXCIpO1xuICAgICAgICB0aGlzLnJlZmVyZW5jZURlbGVnYXRlID0gbmV3IFByKHRoaXMsIHMpLCB0aGlzLnVzID0gZSArIFwibWFpblwiLCB0aGlzLk0gPSBuZXcgUmkoYSksIFxuICAgICAgICB0aGlzLmNzID0gbmV3IGhpKHRoaXMudXMsIHRoaXMuWG4sIG5ldyBrcih0aGlzLk0pKSwgdGhpcy5ocyA9IG5ldyBncih0aGlzLnJlZmVyZW5jZURlbGVnYXRlLCB0aGlzLk0pLCBcbiAgICAgICAgdGhpcy5scyA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU3IodCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gKiBSZXR1cm5zIHRoZSBzZXQgb2YgZG9jdW1lbnRzIHRoYXQgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBzcGVjaWZpZWQgcmVhZFxuICogdGltZS5cbiAqL1xuICAgICAgICAvLyBQT1JUSU5HIE5PVEU6IFRoaXMgaXMgb25seSB1c2VkIGZvciBtdWx0aS10YWIgc3luY2hyb25pemF0aW9uLlxuICAgICAgICAodGhpcy5NKSwgdGhpcy5mcyA9IG5ldyAkaSwgdGhpcy53aW5kb3cgJiYgdGhpcy53aW5kb3cubG9jYWxTdG9yYWdlID8gdGhpcy5kcyA9IHRoaXMud2luZG93LmxvY2FsU3RvcmFnZSA6ICh0aGlzLmRzID0gbnVsbCwgXG4gICAgICAgICExID09PSBjICYmICQoXCJJbmRleGVkRGJQZXJzaXN0ZW5jZVwiLCBcIkxvY2FsU3RvcmFnZSBpcyB1bmF2YWlsYWJsZS4gQXMgYSByZXN1bHQsIHBlcnNpc3RlbmNlIG1heSBub3Qgd29yayByZWxpYWJseS4gSW4gcGFydGljdWxhciBlbmFibGVQZXJzaXN0ZW5jZSgpIGNvdWxkIGZhaWwgaW1tZWRpYXRlbHkgYWZ0ZXIgcmVmcmVzaGluZyB0aGUgcGFnZS5cIikpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBdHRlbXB0IHRvIHN0YXJ0IEluZGV4ZWREYiBwZXJzaXN0ZW5jZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgcGVyc2lzdGVuY2Ugd2FzIGVuYWJsZWQuXG4gICAgICovICAgIHN0YXJ0KCkge1xuICAgICAgICAvLyBOT1RFOiBUaGlzIGlzIGV4cGVjdGVkIHRvIGZhaWwgc29tZXRpbWVzIChpbiB0aGUgY2FzZSBvZiBhbm90aGVyIHRhYlxuICAgICAgICAvLyBhbHJlYWR5IGhhdmluZyB0aGUgcGVyc2lzdGVuY2UgbG9jayksIHNvIGl0J3MgdGhlIGZpcnN0IHRoaW5nIHdlIHNob3VsZFxuICAgICAgICAvLyBkby5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3MoKS50aGVuKCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNQcmltYXJ5ICYmICF0aGlzLmFsbG93VGFiU3luY2hyb25pemF0aW9uKSBcbiAgICAgICAgICAgIC8vIEZhaWwgYHN0YXJ0KClgIGlmIGBzeW5jaHJvbml6ZVRhYnNgIGlzIGRpc2FibGVkIGFuZCB3ZSBjYW5ub3RcbiAgICAgICAgICAgIC8vIG9idGFpbiB0aGUgcHJpbWFyeSBsZWFzZS5cbiAgICAgICAgICAgIHRocm93IG5ldyBRKEcuRkFJTEVEX1BSRUNPTkRJVElPTiwgT3IpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMud3MoKSwgdGhpcy5ncygpLCB0aGlzLnlzKCksIHRoaXMucnVuVHJhbnNhY3Rpb24oXCJnZXRIaWdoZXN0TGlzdGVuU2VxdWVuY2VOdW1iZXJcIiwgXCJyZWFkb25seVwiLCAodCA9PiB0aGlzLmhzLmdldEhpZ2hlc3RTZXF1ZW5jZU51bWJlcih0KSkpO1xuICAgICAgICB9KSkudGhlbigodCA9PiB7XG4gICAgICAgICAgICB0aGlzLlpuID0gbmV3IG50KHQsIHRoaXMuSm4pO1xuICAgICAgICB9KSkudGhlbigoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50cyA9ICEwO1xuICAgICAgICB9KSkuY2F0Y2goKHQgPT4gKHRoaXMuY3MgJiYgdGhpcy5jcy5jbG9zZSgpLCBQcm9taXNlLnJlamVjdCh0KSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGEgbGlzdGVuZXIgdGhhdCBnZXRzIGNhbGxlZCB3aGVuIHRoZSBwcmltYXJ5IHN0YXRlIG9mIHRoZVxuICAgICAqIGluc3RhbmNlIGNoYW5nZXMuIFVwb24gcmVnaXN0ZXJpbmcsIHRoaXMgbGlzdGVuZXIgaXMgaW52b2tlZCBpbW1lZGlhdGVseVxuICAgICAqIHdpdGggdGhlIGN1cnJlbnQgcHJpbWFyeSBzdGF0ZS5cbiAgICAgKlxuICAgICAqIFBPUlRJTkcgTk9URTogVGhpcyBpcyBvbmx5IHVzZWQgZm9yIFdlYiBtdWx0aS10YWIuXG4gICAgICovICAgIHBzKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3MgPSBhc3luYyBlID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXJ0ZWQpIHJldHVybiB0KGUpO1xuICAgICAgICB9LCB0KHRoaXMuaXNQcmltYXJ5KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGEgbGlzdGVuZXIgdGhhdCBnZXRzIGNhbGxlZCB3aGVuIHRoZSBkYXRhYmFzZSByZWNlaXZlcyBhXG4gICAgICogdmVyc2lvbiBjaGFuZ2UgZXZlbnQgaW5kaWNhdGluZyB0aGF0IGl0IGhhcyBkZWxldGVkLlxuICAgICAqXG4gICAgICogUE9SVElORyBOT1RFOiBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgV2ViIG11bHRpLXRhYi5cbiAgICAgKi8gICAgc2V0RGF0YWJhc2VEZWxldGVkTGlzdGVuZXIodCkge1xuICAgICAgICB0aGlzLmNzLk90KChhc3luYyBlID0+IHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBkZWxldGUgSW5kZXhlZERCLlxuICAgICAgICAgICAgbnVsbCA9PT0gZS5uZXdWZXJzaW9uICYmIGF3YWl0IHQoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGp1c3RzIHRoZSBjdXJyZW50IG5ldHdvcmsgc3RhdGUgaW4gdGhlIGNsaWVudCdzIG1ldGFkYXRhLCBwb3RlbnRpYWxseVxuICAgICAqIGFmZmVjdGluZyB0aGUgcHJpbWFyeSBsZWFzZS5cbiAgICAgKlxuICAgICAqIFBPUlRJTkcgTk9URTogVGhpcyBpcyBvbmx5IHVzZWQgZm9yIFdlYiBtdWx0aS10YWIuXG4gICAgICovICAgIHNldE5ldHdvcmtFbmFibGVkKHQpIHtcbiAgICAgICAgdGhpcy5uZXR3b3JrRW5hYmxlZCAhPT0gdCAmJiAodGhpcy5uZXR3b3JrRW5hYmxlZCA9IHQsIFxuICAgICAgICAvLyBTY2hlZHVsZSBhIHByaW1hcnkgbGVhc2UgcmVmcmVzaCBmb3IgaW1tZWRpYXRlIGV4ZWN1dGlvbi4gVGhlIGV2ZW50dWFsXG4gICAgICAgIC8vIGxlYXNlIHVwZGF0ZSB3aWxsIGJlIHByb3BhZ2F0ZWQgdmlhIGBwcmltYXJ5U3RhdGVMaXN0ZW5lcmAuXG4gICAgICAgIHRoaXMuSG4uZW5xdWV1ZUFuZEZvcmdldCgoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdGFydGVkICYmIGF3YWl0IHRoaXMuX3MoKTtcbiAgICAgICAgfSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgY2xpZW50IG1ldGFkYXRhIGluIEluZGV4ZWREYiBhbmQgYXR0ZW1wdHMgdG8gZWl0aGVyIG9idGFpbiBvclxuICAgICAqIGV4dGVuZCB0aGUgcHJpbWFyeSBsZWFzZSBmb3IgdGhlIGxvY2FsIGNsaWVudC4gQXN5bmNocm9ub3VzbHkgbm90aWZpZXMgdGhlXG4gICAgICogcHJpbWFyeSBzdGF0ZSBsaXN0ZW5lciBpZiB0aGUgY2xpZW50IGVpdGhlciBuZXdseSBvYnRhaW5lZCBvciByZWxlYXNlZCBpdHNcbiAgICAgKiBwcmltYXJ5IGxlYXNlLlxuICAgICAqLyAgICBfcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVuVHJhbnNhY3Rpb24oXCJ1cGRhdGVDbGllbnRNZXRhZGF0YUFuZFRyeUJlY29tZVByaW1hcnlcIiwgXCJyZWFkd3JpdGVcIiwgKHQgPT4gQnIodCkucHV0KHtcbiAgICAgICAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxuICAgICAgICAgICAgdXBkYXRlVGltZU1zOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgbmV0d29ya0VuYWJsZWQ6IHRoaXMubmV0d29ya0VuYWJsZWQsXG4gICAgICAgICAgICBpbkZvcmVncm91bmQ6IHRoaXMuaW5Gb3JlZ3JvdW5kXG4gICAgICAgIH0pLm5leHQoKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzUHJpbWFyeSkgcmV0dXJuIHRoaXMuSXModCkubmV4dCgodCA9PiB7XG4gICAgICAgICAgICAgICAgdCB8fCAodGhpcy5pc1ByaW1hcnkgPSAhMSwgdGhpcy5Ibi5lbnF1ZXVlUmV0cnlhYmxlKCgoKSA9PiB0aGlzLm9zKCExKSkpKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IHRoaXMuVHModCkpKS5uZXh0KChlID0+IHRoaXMuaXNQcmltYXJ5ICYmICFlID8gdGhpcy5Fcyh0KS5uZXh0KCgoKSA9PiAhMSkpIDogISFlICYmIHRoaXMuQXModCkubmV4dCgoKCkgPT4gITApKSkpKSkuY2F0Y2goKHQgPT4ge1xuICAgICAgICAgICAgaWYgKGRpKHQpKSBcbiAgICAgICAgICAgIC8vIFByb2NlZWQgd2l0aCB0aGUgZXhpc3Rpbmcgc3RhdGUuIEFueSBzdWJzZXF1ZW50IGFjY2VzcyB0b1xuICAgICAgICAgICAgLy8gSW5kZXhlZERCIHdpbGwgdmVyaWZ5IHRoZSBsZWFzZS5cbiAgICAgICAgICAgIHJldHVybiBPKFwiSW5kZXhlZERiUGVyc2lzdGVuY2VcIiwgXCJGYWlsZWQgdG8gZXh0ZW5kIG93bmVyIGxlYXNlOiBcIiwgdCksIHRoaXMuaXNQcmltYXJ5O1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFsbG93VGFiU3luY2hyb25pemF0aW9uKSB0aHJvdyB0O1xuICAgICAgICAgICAgcmV0dXJuIE8oXCJJbmRleGVkRGJQZXJzaXN0ZW5jZVwiLCBcIlJlbGVhc2luZyBvd25lciBsZWFzZSBhZnRlciBlcnJvciBkdXJpbmcgbGVhc2UgcmVmcmVzaFwiLCB0KSwgXG4gICAgICAgICAgICAvKiBpc1ByaW1hcnk9ICovICExO1xuICAgICAgICB9KSkudGhlbigodCA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzUHJpbWFyeSAhPT0gdCAmJiB0aGlzLkhuLmVucXVldWVSZXRyeWFibGUoKCgpID0+IHRoaXMub3ModCkpKSwgdGhpcy5pc1ByaW1hcnkgPSB0O1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIElzKHQpIHtcbiAgICAgICAgcmV0dXJuIEZyKHQpLmdldChcIm93bmVyXCIpLm5leHQoKHQgPT4gdWkucmVzb2x2ZSh0aGlzLlJzKHQpKSkpO1xuICAgIH1cbiAgICBicyh0KSB7XG4gICAgICAgIHJldHVybiBCcih0KS5kZWxldGUodGhpcy5jbGllbnRJZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIHRoZSBnYXJiYWdlIGNvbGxlY3Rpb24gdGhyZXNob2xkIGhhcyBwYXNzZWQsIHBydW5lcyB0aGVcbiAgICAgKiBSZW1vdGVEb2N1bWVudENoYW5nZXMgYW5kIHRoZSBDbGllbnRNZXRhZGF0YSBzdG9yZSBiYXNlZCBvbiB0aGUgbGFzdCB1cGRhdGVcbiAgICAgKiB0aW1lIG9mIGFsbCBjbGllbnRzLlxuICAgICAqLyAgICBhc3luYyBQcygpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNQcmltYXJ5ICYmICF0aGlzLlZzKHRoaXMucnMsIDE4ZTUpKSB7XG4gICAgICAgICAgICB0aGlzLnJzID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBhd2FpdCB0aGlzLnJ1blRyYW5zYWN0aW9uKFwibWF5YmVHYXJiYWdlQ29sbGVjdE11bHRpQ2xpZW50U3RhdGVcIiwgXCJyZWFkd3JpdGUtcHJpbWFyeVwiLCAodCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IHBpKHQsIFwiY2xpZW50TWV0YWRhdGFcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuVXQoKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IHRoaXMudnModCwgMThlNSksIHMgPSB0LmZpbHRlcigodCA9PiAtMSA9PT0gbi5pbmRleE9mKHQpKSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIERlbGV0ZSBtZXRhZGF0YSBmb3IgY2xpZW50cyB0aGF0IGFyZSBubyBsb25nZXIgY29uc2lkZXJlZCBhY3RpdmUuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1aS5mb3JFYWNoKHMsICh0ID0+IGUuZGVsZXRlKHQuY2xpZW50SWQpKSkubmV4dCgoKCkgPT4gcykpO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH0pKS5jYXRjaCgoKCkgPT4gW10pKTtcbiAgICAgICAgICAgIC8vIERlbGV0ZSBwb3RlbnRpYWwgbGVmdG92ZXIgZW50cmllcyB0aGF0IG1heSBjb250aW51ZSB0byBtYXJrIHRoZVxuICAgICAgICAgICAgLy8gaW5hY3RpdmUgY2xpZW50cyBhcyB6b21iaWVkIGluIExvY2FsU3RvcmFnZS5cbiAgICAgICAgICAgIC8vIElkZWFsbHkgd2UnZCBkZWxldGUgdGhlIEluZGV4ZWREYiBhbmQgTG9jYWxTdG9yYWdlIHpvbWJpZSBlbnRyaWVzIGZvclxuICAgICAgICAgICAgLy8gdGhlIGNsaWVudCBhdG9taWNhbGx5LCBidXQgd2UgY2FuJ3QuIFNvIHdlIG9wdCB0byBkZWxldGUgdGhlIEluZGV4ZWREYlxuICAgICAgICAgICAgLy8gZW50cmllcyBmaXJzdCB0byBhdm9pZCBwb3RlbnRpYWxseSByZXZpdmluZyBhIHpvbWJpZWQgY2xpZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZHMpIGZvciAoY29uc3QgZSBvZiB0KSB0aGlzLmRzLnJlbW92ZUl0ZW0odGhpcy5TcyhlLmNsaWVudElkKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2NoZWR1bGVzIGEgcmVjdXJyaW5nIHRpbWVyIHRvIHVwZGF0ZSB0aGUgY2xpZW50IG1ldGFkYXRhIGFuZCB0byBlaXRoZXJcbiAgICAgKiBleHRlbmQgb3IgYWNxdWlyZSB0aGUgcHJpbWFyeSBsZWFzZSBpZiB0aGUgY2xpZW50IGlzIGVsaWdpYmxlLlxuICAgICAqLyAgICB5cygpIHtcbiAgICAgICAgdGhpcy5zcyA9IHRoaXMuSG4uZW5xdWV1ZUFmdGVyRGVsYXkoXCJjbGllbnRfbWV0YWRhdGFfcmVmcmVzaFwiIC8qIENsaWVudE1ldGFkYXRhUmVmcmVzaCAqLyAsIDRlMywgKCgpID0+IHRoaXMuX3MoKS50aGVuKCgoKSA9PiB0aGlzLlBzKCkpKS50aGVuKCgoKSA9PiB0aGlzLnlzKCkpKSkpO1xuICAgIH1cbiAgICAvKiogQ2hlY2tzIHdoZXRoZXIgYGNsaWVudGAgaXMgdGhlIGxvY2FsIGNsaWVudC4gKi8gICAgUnModCkge1xuICAgICAgICByZXR1cm4gISF0ICYmIHQub3duZXJJZCA9PT0gdGhpcy5jbGllbnRJZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXZhbHVhdGUgdGhlIHN0YXRlIG9mIGFsbCBhY3RpdmUgY2xpZW50cyBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGxvY2FsXG4gICAgICogY2xpZW50IGlzIG9yIGNhbiBhY3QgYXMgdGhlIGhvbGRlciBvZiB0aGUgcHJpbWFyeSBsZWFzZS4gUmV0dXJucyB3aGV0aGVyXG4gICAgICogdGhlIGNsaWVudCBpcyBlbGlnaWJsZSBmb3IgdGhlIGxlYXNlLCBidXQgZG9lcyBub3QgYWN0dWFsbHkgYWNxdWlyZSBpdC5cbiAgICAgKiBNYXkgcmV0dXJuICdmYWxzZScgZXZlbiBpZiB0aGVyZSBpcyBubyBhY3RpdmUgbGVhc2Vob2xkZXIgYW5kIGFub3RoZXJcbiAgICAgKiAoZm9yZWdyb3VuZCkgY2xpZW50IHNob3VsZCBiZWNvbWUgbGVhc2Vob2xkZXIgaW5zdGVhZC5cbiAgICAgKi8gICAgVHModCkge1xuICAgICAgICBpZiAodGhpcy5ZbikgcmV0dXJuIHVpLnJlc29sdmUoITApO1xuICAgICAgICByZXR1cm4gRnIodCkuZ2V0KFwib3duZXJcIikubmV4dCgoZSA9PiB7XG4gICAgICAgICAgICAvLyBBIGNsaWVudCBpcyBlbGlnaWJsZSBmb3IgdGhlIHByaW1hcnkgbGVhc2UgaWY6XG4gICAgICAgICAgICAvLyAtIGl0cyBuZXR3b3JrIGlzIGVuYWJsZWQgYW5kIHRoZSBjbGllbnQncyB0YWIgaXMgaW4gdGhlIGZvcmVncm91bmQuXG4gICAgICAgICAgICAvLyAtIGl0cyBuZXR3b3JrIGlzIGVuYWJsZWQgYW5kIG5vIG90aGVyIGNsaWVudCdzIHRhYiBpcyBpbiB0aGVcbiAgICAgICAgICAgIC8vICAgZm9yZWdyb3VuZC5cbiAgICAgICAgICAgIC8vIC0gZXZlcnkgY2xpZW50cyBuZXR3b3JrIGlzIGRpc2FibGVkIGFuZCB0aGUgY2xpZW50J3MgdGFiIGlzIGluIHRoZVxuICAgICAgICAgICAgLy8gICBmb3JlZ3JvdW5kLlxuICAgICAgICAgICAgLy8gLSBldmVyeSBjbGllbnRzIG5ldHdvcmsgaXMgZGlzYWJsZWQgYW5kIG5vIG90aGVyIGNsaWVudCdzIHRhYiBpcyBpblxuICAgICAgICAgICAgLy8gICB0aGUgZm9yZWdyb3VuZC5cbiAgICAgICAgICAgIC8vIC0gdGhlIGBmb3JjZU93bmluZ1RhYmAgc2V0dGluZyB3YXMgcGFzc2VkIGluLlxuICAgICAgICAgICAgaWYgKG51bGwgIT09IGUgJiYgdGhpcy5WcyhlLmxlYXNlVGltZXN0YW1wTXMsIDVlMykgJiYgIXRoaXMuRHMoZS5vd25lcklkKSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLlJzKGUpICYmIHRoaXMubmV0d29ya0VuYWJsZWQpIHJldHVybiAhMDtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuUnMoZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlLmFsbG93VGFiU3luY2hyb25pemF0aW9uKSBcbiAgICAgICAgICAgICAgICAgICAgLy8gRmFpbCB0aGUgYGNhbkFjdEFzUHJpbWFyeWAgY2hlY2sgaWYgdGhlIGN1cnJlbnQgbGVhc2Vob2xkZXIgaGFzXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vdCBvcHRlZCBpbnRvIG11bHRpLXRhYiBzeW5jaHJvbml6YXRpb24uIElmIHRoaXMgaGFwcGVucyBhdFxuICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgc3RhcnR1cCwgd2UgcmVqZWN0IHRoZSBQcm9taXNlIHJldHVybmVkIGJ5XG4gICAgICAgICAgICAgICAgICAgIC8vIGBlbmFibGVQZXJzaXN0ZW5jZSgpYCBhbmQgdGhlIHVzZXIgY2FuIGNvbnRpbnVlIHRvIHVzZSBGaXJlc3RvcmVcbiAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBpbi1tZW1vcnkgcGVyc2lzdGVuY2UuXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgZmFpbHMgZHVyaW5nIGEgbGVhc2UgcmVmcmVzaCwgd2Ugd2lsbCBpbnN0ZWFkIGJsb2NrIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBBc3luY1F1ZXVlIGZyb20gZXhlY3V0aW5nIGZ1cnRoZXIgb3BlcmF0aW9ucy4gTm90ZSB0aGF0IHRoaXMgaXNcbiAgICAgICAgICAgICAgICAgICAgLy8gYWNjZXB0YWJsZSBzaW5jZSBtaXhpbmcgJiBtYXRjaGluZyBkaWZmZXJlbnQgYHN5bmNocm9uaXplVGFic2BcbiAgICAgICAgICAgICAgICAgICAgLy8gc2V0dGluZ3MgaXMgbm90IHN1cHBvcnRlZC5cbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhiLzExNDIyNjIzNCk6IFJlbW92ZSB0aGlzIGNoZWNrIHdoZW4gYHN5bmNocm9uaXplVGFic2AgY2FuXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vIGxvbmdlciBiZSB0dXJuZWQgb2ZmLlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUShHLkZBSUxFRF9QUkVDT05ESVRJT04sIE9yKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAhKCF0aGlzLm5ldHdvcmtFbmFibGVkIHx8ICF0aGlzLmluRm9yZWdyb3VuZCkgfHwgQnIodCkuVXQoKS5uZXh0KCh0ID0+IHZvaWQgMCA9PT0gdGhpcy52cyh0LCA1ZTMpLmZpbmQoKHQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNsaWVudElkICE9PSB0LmNsaWVudElkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSAhdGhpcy5uZXR3b3JrRW5hYmxlZCAmJiB0Lm5ldHdvcmtFbmFibGVkLCBuID0gIXRoaXMuaW5Gb3JlZ3JvdW5kICYmIHQuaW5Gb3JlZ3JvdW5kLCBzID0gdGhpcy5uZXR3b3JrRW5hYmxlZCA9PT0gdC5uZXR3b3JrRW5hYmxlZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUgfHwgbiAmJiBzKSByZXR1cm4gITA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgICAgIH0pKSkpO1xuICAgICAgICB9KSkubmV4dCgodCA9PiAodGhpcy5pc1ByaW1hcnkgIT09IHQgJiYgTyhcIkluZGV4ZWREYlBlcnNpc3RlbmNlXCIsIGBDbGllbnQgJHt0ID8gXCJpc1wiIDogXCJpcyBub3RcIn0gZWxpZ2libGUgZm9yIGEgcHJpbWFyeSBsZWFzZS5gKSwgXG4gICAgICAgIHQpKSk7XG4gICAgfVxuICAgIGFzeW5jIHNodXRkb3duKCkge1xuICAgICAgICAvLyBUaGUgc2h1dGRvd24oKSBvcGVyYXRpb25zIGFyZSBpZGVtcG90ZW50IGFuZCBjYW4gYmUgY2FsbGVkIGV2ZW4gd2hlblxuICAgICAgICAvLyBzdGFydCgpIGFib3J0ZWQgKGUuZy4gYmVjYXVzZSBpdCBjb3VsZG4ndCBhY3F1aXJlIHRoZSBwZXJzaXN0ZW5jZSBsZWFzZSkuXG4gICAgICAgIHRoaXMudHMgPSAhMSwgdGhpcy5DcygpLCB0aGlzLnNzICYmICh0aGlzLnNzLmNhbmNlbCgpLCB0aGlzLnNzID0gbnVsbCksIHRoaXMueHMoKSwgXG4gICAgICAgIHRoaXMuTnMoKSwgXG4gICAgICAgIC8vIFVzZSBgU2ltcGxlRGIucnVuVHJhbnNhY3Rpb25gIGRpcmVjdGx5IHRvIGF2b2lkIGZhaWxpbmcgaWYgYW5vdGhlciB0YWJcbiAgICAgICAgLy8gaGFzIG9idGFpbmVkIHRoZSBwcmltYXJ5IGxlYXNlLlxuICAgICAgICBhd2FpdCB0aGlzLmNzLnJ1blRyYW5zYWN0aW9uKFwic2h1dGRvd25cIiwgXCJyZWFkd3JpdGVcIiwgWyBcIm93bmVyXCIsIFwiY2xpZW50TWV0YWRhdGFcIiBdLCAodCA9PiB7XG4gICAgICAgICAgICBjb25zdCBlID0gbmV3IHlpKHQsIG50LkEpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuRXMoZSkubmV4dCgoKCkgPT4gdGhpcy5icyhlKSkpO1xuICAgICAgICB9KSksIHRoaXMuY3MuY2xvc2UoKSwgXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgZW50cnkgbWFya2luZyB0aGUgY2xpZW50IGFzIHpvbWJpZWQgZnJvbSBMb2NhbFN0b3JhZ2Ugc2luY2VcbiAgICAgICAgLy8gd2Ugc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgaXRzIG1ldGFkYXRhIGZyb20gSW5kZXhlZERiLlxuICAgICAgICB0aGlzLmtzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgY2xpZW50cyB0aGF0IGFyZSBub3Qgem9tYmllZCBhbmQgaGF2ZSBhbiB1cGRhdGVUaW1lIHdpdGhpbiB0aGVcbiAgICAgKiBwcm92aWRlZCB0aHJlc2hvbGQuXG4gICAgICovICAgIHZzKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHQuZmlsdGVyKCh0ID0+IHRoaXMuVnModC51cGRhdGVUaW1lTXMsIGUpICYmICF0aGlzLkRzKHQuY2xpZW50SWQpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIElEcyBvZiB0aGUgY2xpZW50cyB0aGF0IGFyZSBjdXJyZW50bHkgYWN0aXZlLiBJZiBtdWx0aS10YWJcbiAgICAgKiBpcyBub3Qgc3VwcG9ydGVkLCByZXR1cm5zIGFuIGFycmF5IHRoYXQgb25seSBjb250YWlucyB0aGUgbG9jYWwgY2xpZW50J3NcbiAgICAgKiBJRC5cbiAgICAgKlxuICAgICAqIFBPUlRJTkcgTk9URTogVGhpcyBpcyBvbmx5IHVzZWQgZm9yIFdlYiBtdWx0aS10YWIuXG4gICAgICovICAgIE1zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ydW5UcmFuc2FjdGlvbihcImdldEFjdGl2ZUNsaWVudHNcIiwgXCJyZWFkb25seVwiLCAodCA9PiBCcih0KS5VdCgpLm5leHQoKHQgPT4gdGhpcy52cyh0LCAxOGU1KS5tYXAoKHQgPT4gdC5jbGllbnRJZCkpKSkpKTtcbiAgICB9XG4gICAgZ2V0IHN0YXJ0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRzO1xuICAgIH1cbiAgICBnZXRNdXRhdGlvblF1ZXVlKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIGxyLll0KHQsIHRoaXMuTSwgZSwgdGhpcy5yZWZlcmVuY2VEZWxlZ2F0ZSk7XG4gICAgfVxuICAgIGdldFRhcmdldENhY2hlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ocztcbiAgICB9XG4gICAgZ2V0UmVtb3RlRG9jdW1lbnRDYWNoZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubHM7XG4gICAgfVxuICAgIGdldEluZGV4TWFuYWdlcih0KSB7XG4gICAgICAgIHJldHVybiBuZXcgbnIodCk7XG4gICAgfVxuICAgIGdldERvY3VtZW50T3ZlcmxheUNhY2hlKHQpIHtcbiAgICAgICAgcmV0dXJuIExpLll0KHRoaXMuTSwgdCk7XG4gICAgfVxuICAgIGdldEJ1bmRsZUNhY2hlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mcztcbiAgICB9XG4gICAgcnVuVHJhbnNhY3Rpb24odCwgZSwgbikge1xuICAgICAgICBPKFwiSW5kZXhlZERiUGVyc2lzdGVuY2VcIiwgXCJTdGFydGluZyB0cmFuc2FjdGlvbjpcIiwgdCk7XG4gICAgICAgIGNvbnN0IHMgPSBcInJlYWRvbmx5XCIgPT09IGUgPyBcInJlYWRvbmx5XCIgOiBcInJlYWR3cml0ZVwiLCBpID0gMTMgPT09IChyID0gdGhpcy5YbikgPyByaSA6IDEyID09PSByID8gaWkgOiAxMSA9PT0gciA/IHNpIDogdm9pZCBMKCk7XG4gICAgICAgIC8qKiBSZXR1cm5zIHRoZSBvYmplY3Qgc3RvcmVzIGZvciB0aGUgcHJvdmlkZWQgc2NoZW1hLiAqL1xuICAgICAgICB2YXIgcjtcbiAgICAgICAgbGV0IG87XG4gICAgICAgIC8vIERvIGFsbCB0cmFuc2FjdGlvbnMgYXMgcmVhZHdyaXRlIGFnYWluc3QgYWxsIG9iamVjdCBzdG9yZXMsIHNpbmNlIHdlXG4gICAgICAgIC8vIGFyZSB0aGUgb25seSByZWFkZXIvd3JpdGVyLlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNzLnJ1blRyYW5zYWN0aW9uKHQsIHMsIGksIChzID0+IChvID0gbmV3IHlpKHMsIHRoaXMuWm4gPyB0aGlzLlpuLm5leHQoKSA6IG50LkEpLCBcbiAgICAgICAgXCJyZWFkd3JpdGUtcHJpbWFyeVwiID09PSBlID8gdGhpcy5JcyhvKS5uZXh0KCh0ID0+ICEhdCB8fCB0aGlzLlRzKG8pKSkubmV4dCgoZSA9PiB7XG4gICAgICAgICAgICBpZiAoIWUpIHRocm93ICQoYEZhaWxlZCB0byBvYnRhaW4gcHJpbWFyeSBsZWFzZSBmb3IgYWN0aW9uICcke3R9Jy5gKSwgdGhpcy5pc1ByaW1hcnkgPSAhMSwgXG4gICAgICAgICAgICB0aGlzLkhuLmVucXVldWVSZXRyeWFibGUoKCgpID0+IHRoaXMub3MoITEpKSksIG5ldyBRKEcuRkFJTEVEX1BSRUNPTkRJVElPTiwgb2kpO1xuICAgICAgICAgICAgcmV0dXJuIG4obyk7XG4gICAgICAgIH0pKS5uZXh0KCh0ID0+IHRoaXMuQXMobykubmV4dCgoKCkgPT4gdCkpKSkgOiB0aGlzLk9zKG8pLm5leHQoKCgpID0+IG4obykpKSkpKS50aGVuKCh0ID0+IChvLnJhaXNlT25Db21taXR0ZWRFdmVudCgpLCBcbiAgICAgICAgdCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVmVyaWZpZXMgdGhhdCB0aGUgY3VycmVudCB0YWIgaXMgdGhlIHByaW1hcnkgbGVhc2Vob2xkZXIgb3IgYWx0ZXJuYXRpdmVseVxuICAgICAqIHRoYXQgdGhlIGxlYXNlaG9sZGVyIGhhcyBvcHRlZCBpbnRvIG11bHRpLXRhYiBzeW5jaHJvbml6YXRpb24uXG4gICAgICovXG4gICAgLy8gVE9ETyhiLzExNDIyNjIzNCk6IFJlbW92ZSB0aGlzIGNoZWNrIHdoZW4gYHN5bmNocm9uaXplVGFic2AgY2FuIG5vIGxvbmdlclxuICAgIC8vIGJlIHR1cm5lZCBvZmYuXG4gICAgT3ModCkge1xuICAgICAgICByZXR1cm4gRnIodCkuZ2V0KFwib3duZXJcIikubmV4dCgodCA9PiB7XG4gICAgICAgICAgICBpZiAobnVsbCAhPT0gdCAmJiB0aGlzLlZzKHQubGVhc2VUaW1lc3RhbXBNcywgNWUzKSAmJiAhdGhpcy5Ecyh0Lm93bmVySWQpICYmICF0aGlzLlJzKHQpICYmICEodGhpcy5ZbiB8fCB0aGlzLmFsbG93VGFiU3luY2hyb25pemF0aW9uICYmIHQuYWxsb3dUYWJTeW5jaHJvbml6YXRpb24pKSB0aHJvdyBuZXcgUShHLkZBSUxFRF9QUkVDT05ESVRJT04sIE9yKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPYnRhaW5zIG9yIGV4dGVuZHMgdGhlIG5ldyBwcmltYXJ5IGxlYXNlIGZvciB0aGUgbG9jYWwgY2xpZW50LiBUaGlzXG4gICAgICogbWV0aG9kIGRvZXMgbm90IHZlcmlmeSB0aGF0IHRoZSBjbGllbnQgaXMgZWxpZ2libGUgZm9yIHRoaXMgbGVhc2UuXG4gICAgICovICAgIEFzKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHtcbiAgICAgICAgICAgIG93bmVySWQ6IHRoaXMuY2xpZW50SWQsXG4gICAgICAgICAgICBhbGxvd1RhYlN5bmNocm9uaXphdGlvbjogdGhpcy5hbGxvd1RhYlN5bmNocm9uaXphdGlvbixcbiAgICAgICAgICAgIGxlYXNlVGltZXN0YW1wTXM6IERhdGUubm93KClcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIEZyKHQpLnB1dChcIm93bmVyXCIsIGUpO1xuICAgIH1cbiAgICBzdGF0aWMgdnQoKSB7XG4gICAgICAgIHJldHVybiBoaS52dCgpO1xuICAgIH1cbiAgICAvKiogQ2hlY2tzIHRoZSBwcmltYXJ5IGxlYXNlIGFuZCByZW1vdmVzIGl0IGlmIHdlIGFyZSB0aGUgY3VycmVudCBwcmltYXJ5LiAqLyAgICBFcyh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBGcih0KTtcbiAgICAgICAgcmV0dXJuIGUuZ2V0KFwib3duZXJcIikubmV4dCgodCA9PiB0aGlzLlJzKHQpID8gKE8oXCJJbmRleGVkRGJQZXJzaXN0ZW5jZVwiLCBcIlJlbGVhc2luZyBwcmltYXJ5IGxlYXNlLlwiKSwgXG4gICAgICAgIGUuZGVsZXRlKFwib3duZXJcIikpIDogdWkucmVzb2x2ZSgpKSk7XG4gICAgfVxuICAgIC8qKiBWZXJpZmllcyB0aGF0IGB1cGRhdGVUaW1lTXNgIGlzIHdpdGhpbiBgbWF4QWdlTXNgLiAqLyAgICBWcyh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBEYXRlLm5vdygpO1xuICAgICAgICByZXR1cm4gISh0IDwgbiAtIGUpICYmICghKHQgPiBuKSB8fCAoJChgRGV0ZWN0ZWQgYW4gdXBkYXRlIHRpbWUgdGhhdCBpcyBpbiB0aGUgZnV0dXJlOiAke3R9ID4gJHtufWApLCBcbiAgICAgICAgITEpKTtcbiAgICB9XG4gICAgd3MoKSB7XG4gICAgICAgIG51bGwgIT09IHRoaXMuZG9jdW1lbnQgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiB0aGlzLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgJiYgKHRoaXMubnMgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLkhuLmVucXVldWVBbmRGb3JnZXQoKCgpID0+ICh0aGlzLmluRm9yZWdyb3VuZCA9IFwidmlzaWJsZVwiID09PSB0aGlzLmRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSwgXG4gICAgICAgICAgICB0aGlzLl9zKCkpKSk7XG4gICAgICAgIH0sIHRoaXMuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInZpc2liaWxpdHljaGFuZ2VcIiwgdGhpcy5ucyksIHRoaXMuaW5Gb3JlZ3JvdW5kID0gXCJ2aXNpYmxlXCIgPT09IHRoaXMuZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlKTtcbiAgICB9XG4gICAgeHMoKSB7XG4gICAgICAgIHRoaXMubnMgJiYgKHRoaXMuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInZpc2liaWxpdHljaGFuZ2VcIiwgdGhpcy5ucyksIHRoaXMubnMgPSBudWxsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXR0YWNoZXMgYSB3aW5kb3cudW5sb2FkIGhhbmRsZXIgdGhhdCB3aWxsIHN5bmNocm9ub3VzbHkgd3JpdGUgb3VyXG4gICAgICogY2xpZW50SWQgdG8gYSBcInpvbWJpZSBjbGllbnQgaWRcIiBsb2NhdGlvbiBpbiBMb2NhbFN0b3JhZ2UuIFRoaXMgY2FuIGJlIHVzZWRcbiAgICAgKiBieSB0YWJzIHRyeWluZyB0byBhY3F1aXJlIHRoZSBwcmltYXJ5IGxlYXNlIHRvIGRldGVybWluZSB0aGF0IHRoZSBsZWFzZVxuICAgICAqIGlzIG5vIGxvbmdlciB2YWxpZCBldmVuIGlmIHRoZSB0aW1lc3RhbXAgaXMgcmVjZW50LiBUaGlzIGlzIHBhcnRpY3VsYXJseVxuICAgICAqIGltcG9ydGFudCBmb3IgdGhlIHJlZnJlc2ggY2FzZSAoc28gdGhlIHRhYiBjb3JyZWN0bHkgcmUtYWNxdWlyZXMgdGhlXG4gICAgICogcHJpbWFyeSBsZWFzZSkuIExvY2FsU3RvcmFnZSBpcyB1c2VkIGZvciB0aGlzIHJhdGhlciB0aGFuIEluZGV4ZWREYiBiZWNhdXNlXG4gICAgICogaXQgaXMgYSBzeW5jaHJvbm91cyBBUEkgYW5kIHNvIGNhbiBiZSB1c2VkIHJlbGlhYmx5IGZyb20gIGFuIHVubG9hZFxuICAgICAqIGhhbmRsZXIuXG4gICAgICovICAgIGdzKCkge1xuICAgICAgICB2YXIgdDtcbiAgICAgICAgXCJmdW5jdGlvblwiID09IHR5cGVvZiAobnVsbCA9PT0gKHQgPSB0aGlzLndpbmRvdykgfHwgdm9pZCAwID09PSB0ID8gdm9pZCAwIDogdC5hZGRFdmVudExpc3RlbmVyKSAmJiAodGhpcy5lcyA9ICgpID0+IHtcbiAgICAgICAgICAgIC8vIE5vdGU6IEluIHRoZW9yeSwgdGhpcyBzaG91bGQgYmUgc2NoZWR1bGVkIG9uIHRoZSBBc3luY1F1ZXVlIHNpbmNlIGl0XG4gICAgICAgICAgICAvLyBhY2Nlc3NlcyBpbnRlcm5hbCBzdGF0ZS4gV2UgZXhlY3V0ZSB0aGlzIGNvZGUgZGlyZWN0bHkgZHVyaW5nIHNodXRkb3duXG4gICAgICAgICAgICAvLyB0byBtYWtlIHN1cmUgaXQgZ2V0cyBhIGNoYW5jZSB0byBydW4uXG4gICAgICAgICAgICB0aGlzLkNzKCksIGlzU2FmYXJpKCkgJiYgbmF2aWdhdG9yLmFwcFZlcnNpb24ubWF0Y2goL1ZlcnNpb25cXC8xWzQ1XS8pICYmIFxuICAgICAgICAgICAgLy8gT24gU2FmYXJpIDE0IGFuZCAxNSwgd2UgZG8gbm90IHJ1biBhbnkgY2xlYW51cCBhY3Rpb25zIGFzIGl0IG1pZ2h0XG4gICAgICAgICAgICAvLyB0cmlnZ2VyIGEgYnVnIHRoYXQgcHJldmVudHMgU2FmYXJpIGZyb20gcmUtb3BlbmluZyBJbmRleGVkREIgZHVyaW5nXG4gICAgICAgICAgICAvLyB0aGUgbmV4dCBwYWdlIGxvYWQuXG4gICAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIyNjU0N1xuICAgICAgICAgICAgdGhpcy5Ibi5lbnRlclJlc3RyaWN0ZWRNb2RlKC8qIHB1cmdlRXhpc3RpbmdUYXNrcz0gKi8gITApLCB0aGlzLkhuLmVucXVldWVBbmRGb3JnZXQoKCgpID0+IHRoaXMuc2h1dGRvd24oKSkpO1xuICAgICAgICB9LCB0aGlzLndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGFnZWhpZGVcIiwgdGhpcy5lcykpO1xuICAgIH1cbiAgICBOcygpIHtcbiAgICAgICAgdGhpcy5lcyAmJiAodGhpcy53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBhZ2VoaWRlXCIsIHRoaXMuZXMpLCB0aGlzLmVzID0gbnVsbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciBhIGNsaWVudCBpcyBcInpvbWJpZWRcIiBiYXNlZCBvbiBpdHMgTG9jYWxTdG9yYWdlIGVudHJ5LlxuICAgICAqIENsaWVudHMgYmVjb21lIHpvbWJpZWQgd2hlbiB0aGVpciB0YWIgY2xvc2VzIHdpdGhvdXQgcnVubmluZyBhbGwgb2YgdGhlXG4gICAgICogY2xlYW51cCBsb2dpYyBpbiBgc2h1dGRvd24oKWAuXG4gICAgICovICAgIERzKHQpIHtcbiAgICAgICAgdmFyIGU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBuID0gbnVsbCAhPT0gKG51bGwgPT09IChlID0gdGhpcy5kcykgfHwgdm9pZCAwID09PSBlID8gdm9pZCAwIDogZS5nZXRJdGVtKHRoaXMuU3ModCkpKTtcbiAgICAgICAgICAgIHJldHVybiBPKFwiSW5kZXhlZERiUGVyc2lzdGVuY2VcIiwgYENsaWVudCAnJHt0fScgJHtuID8gXCJpc1wiIDogXCJpcyBub3RcIn0gem9tYmllZCBpbiBMb2NhbFN0b3JhZ2VgKSwgXG4gICAgICAgICAgICBuO1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICAvLyBHcmFjZWZ1bGx5IGhhbmRsZSBpZiBMb2NhbFN0b3JhZ2UgaXNuJ3Qgd29ya2luZy5cbiAgICAgICAgICAgIHJldHVybiAkKFwiSW5kZXhlZERiUGVyc2lzdGVuY2VcIiwgXCJGYWlsZWQgdG8gZ2V0IHpvbWJpZWQgY2xpZW50IGlkLlwiLCB0KSwgITE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVjb3JkIGNsaWVudCBhcyB6b21iaWVkIChhIGNsaWVudCB0aGF0IGhhZCBpdHMgdGFiIGNsb3NlZCkuIFpvbWJpZWRcbiAgICAgKiBjbGllbnRzIGFyZSBpZ25vcmVkIGR1cmluZyBwcmltYXJ5IHRhYiBzZWxlY3Rpb24uXG4gICAgICovICAgIENzKCkge1xuICAgICAgICBpZiAodGhpcy5kcykgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuZHMuc2V0SXRlbSh0aGlzLlNzKHRoaXMuY2xpZW50SWQpLCBTdHJpbmcoRGF0ZS5ub3coKSkpO1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICAvLyBHcmFjZWZ1bGx5IGhhbmRsZSBpZiBMb2NhbFN0b3JhZ2UgaXNuJ3QgYXZhaWxhYmxlIC8gd29ya2luZy5cbiAgICAgICAgICAgICQoXCJGYWlsZWQgdG8gc2V0IHpvbWJpZSBjbGllbnQgaWQuXCIsIHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKiBSZW1vdmVzIHRoZSB6b21iaWVkIGNsaWVudCBlbnRyeSBpZiBpdCBleGlzdHMuICovICAgIGtzKCkge1xuICAgICAgICBpZiAodGhpcy5kcykgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuZHMucmVtb3ZlSXRlbSh0aGlzLlNzKHRoaXMuY2xpZW50SWQpKTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgLy8gSWdub3JlXG4gICAgICAgIH1cbiAgICB9XG4gICAgU3ModCkge1xuICAgICAgICByZXR1cm4gYGZpcmVzdG9yZV96b21iaWVfJHt0aGlzLnBlcnNpc3RlbmNlS2V5fV8ke3R9YDtcbiAgICB9XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGdldCBhIHR5cGVkIFNpbXBsZURiU3RvcmUgZm9yIHRoZSBwcmltYXJ5IGNsaWVudCBvYmplY3Qgc3RvcmUuXG4gKi8gZnVuY3Rpb24gRnIodCkge1xuICAgIHJldHVybiBwaSh0LCBcIm93bmVyXCIpO1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBnZXQgYSB0eXBlZCBTaW1wbGVEYlN0b3JlIGZvciB0aGUgY2xpZW50IG1ldGFkYXRhIG9iamVjdCBzdG9yZS5cbiAqLyBmdW5jdGlvbiBCcih0KSB7XG4gICAgcmV0dXJuIHBpKHQsIFwiY2xpZW50TWV0YWRhdGFcIik7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgc3RyaW5nIHVzZWQgYXMgYSBwcmVmaXggd2hlbiBzdG9yaW5nIGRhdGEgaW4gSW5kZXhlZERCIGFuZFxuICogTG9jYWxTdG9yYWdlLlxuICovIGZ1bmN0aW9uIExyKHQsIGUpIHtcbiAgICAvLyBVc2UgdHdvIGRpZmZlcmVudCBwcmVmaXggZm9ybWF0czpcbiAgICAvLyAgICogZmlyZXN0b3JlIC8gcGVyc2lzdGVuY2VLZXkgLyBwcm9qZWN0SUQgLiBkYXRhYmFzZUlEIC8gLi4uXG4gICAgLy8gICAqIGZpcmVzdG9yZSAvIHBlcnNpc3RlbmNlS2V5IC8gcHJvamVjdElEIC8gLi4uXG4gICAgLy8gcHJvamVjdElEcyBhcmUgRE5TLWNvbXBhdGlibGUgbmFtZXMgYW5kIGNhbm5vdCBjb250YWluIGRvdHNcbiAgICAvLyBzbyB0aGVyZSdzIG5vIGRhbmdlciBvZiBjb2xsaXNpb25zLlxuICAgIGxldCBuID0gdC5wcm9qZWN0SWQ7XG4gICAgcmV0dXJuIHQuaXNEZWZhdWx0RGF0YWJhc2UgfHwgKG4gKz0gXCIuXCIgKyB0LmRhdGFiYXNlKSwgXCJmaXJlc3RvcmUvXCIgKyBlICsgXCIvXCIgKyBuICsgXCIvXCI7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5jbGFzcyBxciB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLnByb2dyZXNzID0gdCwgdGhpcy4kcyA9IGU7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIHJlYWRvbmx5IHZpZXcgb2YgdGhlIGxvY2FsIHN0YXRlIG9mIGFsbCBkb2N1bWVudHMgd2UncmUgdHJhY2tpbmcgKGkuZS4gd2VcbiAqIGhhdmUgYSBjYWNoZWQgdmVyc2lvbiBpbiByZW1vdGVEb2N1bWVudENhY2hlIG9yIGxvY2FsIG11dGF0aW9ucyBmb3IgdGhlXG4gKiBkb2N1bWVudCkuIFRoZSB2aWV3IGlzIGNvbXB1dGVkIGJ5IGFwcGx5aW5nIHRoZSBtdXRhdGlvbnMgaW4gdGhlXG4gKiBNdXRhdGlvblF1ZXVlIHRvIHRoZSBSZW1vdGVEb2N1bWVudENhY2hlLlxuICovIGNsYXNzIFVyIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgIHRoaXMubHMgPSB0LCB0aGlzLkZzID0gZSwgdGhpcy5pbmRleE1hbmFnZXIgPSBuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGxvY2FsIHZpZXcgb2YgdGhlIGRvY3VtZW50IGlkZW50aWZpZWQgYnkgYGtleWAuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBMb2NhbCB2aWV3IG9mIHRoZSBkb2N1bWVudCBvciBudWxsIGlmIHdlIGRvbid0IGhhdmUgYW55IGNhY2hlZFxuICAgICAqIHN0YXRlIGZvciBpdC5cbiAgICAgKi8gICAgQnModCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5Gcy5nZXRBbGxNdXRhdGlvbkJhdGNoZXNBZmZlY3RpbmdEb2N1bWVudEtleSh0LCBlKS5uZXh0KChuID0+IHRoaXMuTHModCwgZSwgbikpKTtcbiAgICB9XG4gICAgLyoqIEludGVybmFsIHZlcnNpb24gb2YgYGdldERvY3VtZW50YCB0aGF0IGFsbG93cyByZXVzaW5nIGJhdGNoZXMuICovICAgIExzKHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubHMuZ2V0RW50cnkodCwgZSkubmV4dCgodCA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgbikgZS5hcHBseVRvTG9jYWxWaWV3KHQpO1xuICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLy8gUmV0dXJucyB0aGUgdmlldyBvZiB0aGUgZ2l2ZW4gYGRvY3NgIGFzIHRoZXkgd291bGQgYXBwZWFyIGFmdGVyIGFwcGx5aW5nXG4gICAgLy8gYWxsIG11dGF0aW9ucyBpbiB0aGUgZ2l2ZW4gYGJhdGNoZXNgLlxuICAgIHFzKHQsIGUpIHtcbiAgICAgICAgdC5mb3JFYWNoKCgodCwgbikgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIGUpIHQuYXBwbHlUb0xvY2FsVmlldyhuKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsb2NhbCB2aWV3IG9mIHRoZSBkb2N1bWVudHMgaWRlbnRpZmllZCBieSBga2V5c2AuXG4gICAgICpcbiAgICAgKiBJZiB3ZSBkb24ndCBoYXZlIGNhY2hlZCBzdGF0ZSBmb3IgYSBkb2N1bWVudCBpbiBga2V5c2AsIGEgTm9Eb2N1bWVudCB3aWxsXG4gICAgICogYmUgc3RvcmVkIGZvciB0aGF0IGtleSBpbiB0aGUgcmVzdWx0aW5nIHNldC5cbiAgICAgKi8gICAgVXModCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5scy5nZXRFbnRyaWVzKHQsIGUpLm5leHQoKGUgPT4gdGhpcy5Lcyh0LCBlKS5uZXh0KCgoKSA9PiBlKSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXBwbGllcyB0aGUgbG9jYWwgdmlldyB0aGUgZ2l2ZW4gYGJhc2VEb2NzYCB3aXRob3V0IHJldHJpZXZpbmcgZG9jdW1lbnRzXG4gICAgICogZnJvbSB0aGUgbG9jYWwgc3RvcmUuXG4gICAgICovICAgIEtzKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuRnMuZ2V0QWxsTXV0YXRpb25CYXRjaGVzQWZmZWN0aW5nRG9jdW1lbnRLZXlzKHQsIGUpLm5leHQoKHQgPT4gdGhpcy5xcyhlLCB0KSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhIHF1ZXJ5IGFnYWluc3QgdGhlIGxvY2FsIHZpZXcgb2YgYWxsIGRvY3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbiAtIFRoZSBwZXJzaXN0ZW5jZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAcGFyYW0gcXVlcnkgLSBUaGUgcXVlcnkgdG8gbWF0Y2ggZG9jdW1lbnRzIGFnYWluc3QuXG4gICAgICogQHBhcmFtIHNpbmNlUmVhZFRpbWUgLSBJZiBub3Qgc2V0IHRvIFNuYXBzaG90VmVyc2lvbi5taW4oKSwgcmV0dXJuIG9ubHlcbiAgICAgKiAgICAgZG9jdW1lbnRzIHRoYXQgaGF2ZSBiZWVuIHJlYWQgc2luY2UgdGhpcyBzbmFwc2hvdCB2ZXJzaW9uIChleGNsdXNpdmUpLlxuICAgICAqLyAgICBHcyh0LCBlLCBuKSB7XG4gICAgICAgIC8qKlxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBxdWVyeSBtYXRjaGVzIGEgc2luZ2xlIGRvY3VtZW50IGJ5IHBhdGggKHJhdGhlciB0aGFuIGFcbiAqIGNvbGxlY3Rpb24pLlxuICovXG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICByZXR1cm4geHQuaXNEb2N1bWVudEtleSh0LnBhdGgpICYmIG51bGwgPT09IHQuY29sbGVjdGlvbkdyb3VwICYmIDAgPT09IHQuZmlsdGVycy5sZW5ndGg7XG4gICAgICAgIH0oZSkgPyB0aGlzLlFzKHQsIGUucGF0aCkgOiBNZShlKSA/IHRoaXMuanModCwgZSwgbikgOiB0aGlzLldzKHQsIGUsIG4pO1xuICAgIH1cbiAgICBRcyh0LCBlKSB7XG4gICAgICAgIC8vIEp1c3QgZG8gYSBzaW1wbGUgZG9jdW1lbnQgbG9va3VwLlxuICAgICAgICByZXR1cm4gdGhpcy5Ccyh0LCBuZXcgeHQoZSkpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgbGV0IGUgPSBMbigpO1xuICAgICAgICAgICAgcmV0dXJuIHQuaXNGb3VuZERvY3VtZW50KCkgJiYgKGUgPSBlLmluc2VydCh0LmtleSwgdCkpLCBlO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGpzKHQsIGUsIG4pIHtcbiAgICAgICAgY29uc3QgcyA9IGUuY29sbGVjdGlvbkdyb3VwO1xuICAgICAgICBsZXQgaSA9IExuKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4TWFuYWdlci5nZXRDb2xsZWN0aW9uUGFyZW50cyh0LCBzKS5uZXh0KChyID0+IHVpLmZvckVhY2gociwgKHIgPT4ge1xuICAgICAgICAgICAgY29uc3QgbyA9IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHZlKGUsIFxuICAgICAgICAgICAgICAgIC8qY29sbGVjdGlvbkdyb3VwPSovIG51bGwsIHQuZXhwbGljaXRPcmRlckJ5LnNsaWNlKCksIHQuZmlsdGVycy5zbGljZSgpLCB0LmxpbWl0LCB0LmxpbWl0VHlwZSwgdC5zdGFydEF0LCB0LmVuZEF0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcXVlcnkgZG9lcyBub3Qgc3BlY2lmeSBhbnkgcXVlcnkgY29uc3RyYWludHMgdGhhdFxuICogY291bGQgcmVtb3ZlIHJlc3VsdHMuXG4gKi8gKGUsIHIuY2hpbGQocykpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuV3ModCwgbywgbikubmV4dCgodCA9PiB7XG4gICAgICAgICAgICAgICAgdC5mb3JFYWNoKCgodCwgZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpID0gaS5pbnNlcnQodCwgZSk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4gaSkpKSk7XG4gICAgfVxuICAgIFdzKHQsIGUsIG4pIHtcbiAgICAgICAgLy8gUXVlcnkgdGhlIHJlbW90ZSBkb2N1bWVudHMgYW5kIG92ZXJsYXkgbXV0YXRpb25zLlxuICAgICAgICBsZXQgcztcbiAgICAgICAgcmV0dXJuIHRoaXMubHMuZ2V0QWxsKHQsIGUucGF0aCwgbikubmV4dCgobiA9PiAocyA9IG4sIHRoaXMuRnMuZ2V0QWxsTXV0YXRpb25CYXRjaGVzQWZmZWN0aW5nUXVlcnkodCwgZSkpKSkubmV4dCgodCA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdCkgZm9yIChjb25zdCB0IG9mIGUubXV0YXRpb25zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbiA9IHQua2V5O1xuICAgICAgICAgICAgICAgIGxldCBpID0gcy5nZXQobik7XG4gICAgICAgICAgICAgICAgbnVsbCA9PSBpICYmIChcbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgaW52YWxpZCBkb2N1bWVudCB0byBhcHBseSBtdXRhdGlvbnMgb24gdG9wIG9mXG4gICAgICAgICAgICAgICAgaSA9IHRlLm5ld0ludmFsaWREb2N1bWVudChuKSwgcyA9IHMuaW5zZXJ0KG4sIGkpKSwgX24odCwgaSwgZS5sb2NhbFdyaXRlVGltZSksIGkuaXNGb3VuZERvY3VtZW50KCkgfHwgKHMgPSBzLnJlbW92ZShuKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiAoXG4gICAgICAgIC8vIEZpbmFsbHksIGZpbHRlciBvdXQgYW55IGRvY3VtZW50cyB0aGF0IGRvbid0IGFjdHVhbGx5IG1hdGNoXG4gICAgICAgIC8vIHRoZSBxdWVyeS5cbiAgICAgICAgcy5mb3JFYWNoKCgodCwgbikgPT4ge1xuICAgICAgICAgICAgVWUoZSwgbikgfHwgKHMgPSBzLnJlbW92ZSh0KSk7XG4gICAgICAgIH0pKSwgcykpKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEEgc2V0IG9mIGNoYW5nZXMgdG8gd2hhdCBkb2N1bWVudHMgYXJlIGN1cnJlbnRseSBpbiB2aWV3IGFuZCBvdXQgb2YgdmlldyBmb3JcbiAqIGEgZ2l2ZW4gcXVlcnkuIFRoZXNlIGNoYW5nZXMgYXJlIHNlbnQgdG8gdGhlIExvY2FsU3RvcmUgYnkgdGhlIFZpZXcgKHZpYVxuICogdGhlIFN5bmNFbmdpbmUpIGFuZCBhcmUgdXNlZCB0byBwaW4gLyB1bnBpbiBkb2N1bWVudHMgYXMgYXBwcm9wcmlhdGUuXG4gKi8gY2xhc3MgS3Ige1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgdGhpcy50YXJnZXRJZCA9IHQsIHRoaXMuZnJvbUNhY2hlID0gZSwgdGhpcy56cyA9IG4sIHRoaXMuSHMgPSBzO1xuICAgIH1cbiAgICBzdGF0aWMgSnModCwgZSkge1xuICAgICAgICBsZXQgbiA9IEduKCksIHMgPSBHbigpO1xuICAgICAgICBmb3IgKGNvbnN0IHQgb2YgZS5kb2NDaGFuZ2VzKSBzd2l0Y2ggKHQudHlwZSkge1xuICAgICAgICAgIGNhc2UgMCAvKiBBZGRlZCAqLyA6XG4gICAgICAgICAgICBuID0gbi5hZGQodC5kb2Mua2V5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAxIC8qIFJlbW92ZWQgKi8gOlxuICAgICAgICAgICAgcyA9IHMuYWRkKHQuZG9jLmtleSk7XG4gLy8gZG8gbm90aGluZ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBLcih0LCBlLmZyb21DYWNoZSwgbiwgcyk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIHF1ZXJ5IGVuZ2luZSB0aGF0IHRha2VzIGFkdmFudGFnZSBvZiB0aGUgdGFyZ2V0IGRvY3VtZW50IG1hcHBpbmcgaW4gdGhlXG4gKiBRdWVyeUNhY2hlLiBRdWVyeSBleGVjdXRpb24gaXMgb3B0aW1pemVkIGJ5IG9ubHkgcmVhZGluZyB0aGUgZG9jdW1lbnRzIHRoYXRcbiAqIHByZXZpb3VzbHkgbWF0Y2hlZCBhIHF1ZXJ5IHBsdXMgYW55IGRvY3VtZW50cyB0aGF0IHdlcmUgZWRpdGVkIGFmdGVyIHRoZVxuICogcXVlcnkgd2FzIGxhc3QgbGlzdGVuZWQgdG8uXG4gKlxuICogVGhlcmUgYXJlIHNvbWUgY2FzZXMgd2hlbiB0aGlzIG9wdGltaXphdGlvbiBpcyBub3QgZ3VhcmFudGVlZCB0byBwcm9kdWNlXG4gKiB0aGUgc2FtZSByZXN1bHRzIGFzIGZ1bGwgY29sbGVjdGlvbiBzY2Fucy4gSW4gdGhlc2UgY2FzZXMsIHF1ZXJ5XG4gKiBwcm9jZXNzaW5nIGZhbGxzIGJhY2sgdG8gZnVsbCBzY2Fucy4gVGhlc2UgY2FzZXMgYXJlOlxuICpcbiAqIC0gTGltaXQgcXVlcmllcyB3aGVyZSBhIGRvY3VtZW50IHRoYXQgbWF0Y2hlZCB0aGUgcXVlcnkgcHJldmlvdXNseSBubyBsb25nZXJcbiAqICAgbWF0Y2hlcyB0aGUgcXVlcnkuXG4gKlxuICogLSBMaW1pdCBxdWVyaWVzIHdoZXJlIGEgZG9jdW1lbnQgZWRpdCBtYXkgY2F1c2UgdGhlIGRvY3VtZW50IHRvIHNvcnQgYmVsb3dcbiAqICAgYW5vdGhlciBkb2N1bWVudCB0aGF0IGlzIGluIHRoZSBsb2NhbCBjYWNoZS5cbiAqXG4gKiAtIFF1ZXJpZXMgdGhhdCBoYXZlIG5ldmVyIGJlZW4gQ1VSUkVOVCBvciBmcmVlIG9mIGxpbWJvIGRvY3VtZW50cy5cbiAqLyBjbGFzcyBHciB7XG4gICAgLyoqIFNldHMgdGhlIGRvY3VtZW50IHZpZXcgdG8gcXVlcnkgYWdhaW5zdC4gKi9cbiAgICBZcyh0KSB7XG4gICAgICAgIHRoaXMuWHMgPSB0O1xuICAgIH1cbiAgICAvKiogUmV0dXJucyBhbGwgbG9jYWwgZG9jdW1lbnRzIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgcXVlcnkuICovICAgIEdzKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgLy8gUXVlcmllcyB0aGF0IG1hdGNoIGFsbCBkb2N1bWVudHMgZG9uJ3QgYmVuZWZpdCBmcm9tIHVzaW5nXG4gICAgICAgIC8vIGtleS1iYXNlZCBsb29rdXBzLiBJdCBpcyBtb3JlIGVmZmljaWVudCB0byBzY2FuIGFsbCBkb2N1bWVudHMgaW4gYVxuICAgICAgICAvLyBjb2xsZWN0aW9uLCByYXRoZXIgdGhhbiB0byBwZXJmb3JtIGluZGl2aWR1YWwgbG9va3Vwcy5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHJldHVybiAwID09PSB0LmZpbHRlcnMubGVuZ3RoICYmIG51bGwgPT09IHQubGltaXQgJiYgbnVsbCA9PSB0LnN0YXJ0QXQgJiYgbnVsbCA9PSB0LmVuZEF0ICYmICgwID09PSB0LmV4cGxpY2l0T3JkZXJCeS5sZW5ndGggfHwgMSA9PT0gdC5leHBsaWNpdE9yZGVyQnkubGVuZ3RoICYmIHQuZXhwbGljaXRPcmRlckJ5WzBdLmZpZWxkLmlzS2V5RmllbGQoKSk7XG4gICAgICAgIH0oZSkgfHwgbi5pc0VxdWFsKGN0Lm1pbigpKSA/IHRoaXMuWnModCwgZSkgOiB0aGlzLlhzLlVzKHQsIHMpLm5leHQoKGkgPT4ge1xuICAgICAgICAgICAgY29uc3QgciA9IHRoaXMudGkoZSwgaSk7XG4gICAgICAgICAgICByZXR1cm4gKENlKGUpIHx8IHhlKGUpKSAmJiB0aGlzLmVpKGUubGltaXRUeXBlLCByLCBzLCBuKSA/IHRoaXMuWnModCwgZSkgOiAoaygpIDw9IExvZ0xldmVsLkRFQlVHICYmIE8oXCJRdWVyeUVuZ2luZVwiLCBcIlJlLXVzaW5nIHByZXZpb3VzIHJlc3VsdCBmcm9tICVzIHRvIGV4ZWN1dGUgcXVlcnk6ICVzXCIsIG4udG9TdHJpbmcoKSwgcWUoZSkpLCBcbiAgICAgICAgICAgIHRoaXMuWHMuR3ModCwgZSwgbikubmV4dCgodCA9PiAoXG4gICAgICAgICAgICAvLyBXZSBtZXJnZSBgcHJldmlvdXNSZXN1bHRzYCBpbnRvIGB1cGRhdGVSZXN1bHRzYCwgc2luY2VcbiAgICAgICAgICAgIC8vIGB1cGRhdGVSZXN1bHRzYCBpcyBhbHJlYWR5IGEgRG9jdW1lbnRNYXAuIElmIGEgZG9jdW1lbnQgaXNcbiAgICAgICAgICAgIC8vIGNvbnRhaW5lZCBpbiBib3RoIGxpc3RzLCB0aGVuIGl0cyBjb250ZW50cyBhcmUgdGhlIHNhbWUuXG4gICAgICAgICAgICByLmZvckVhY2goKGUgPT4ge1xuICAgICAgICAgICAgICAgIHQgPSB0Lmluc2VydChlLmtleSwgZSk7XG4gICAgICAgICAgICB9KSksIHQpKSkpO1xuICAgICAgICB9KSk7XG4gICAgICAgIC8vIFF1ZXJpZXMgdGhhdCBoYXZlIG5ldmVyIHNlZW4gYSBzbmFwc2hvdCB3aXRob3V0IGxpbWJvIGZyZWUgZG9jdW1lbnRzXG4gICAgICAgIC8vIHNob3VsZCBhbHNvIGJlIHJ1biBhcyBhIGZ1bGwgY29sbGVjdGlvbiBzY2FuLlxuICAgICAgICB9XG4gICAgLyoqIEFwcGxpZXMgdGhlIHF1ZXJ5IGZpbHRlciBhbmQgc29ydGluZyB0byB0aGUgcHJvdmlkZWQgZG9jdW1lbnRzLiAgKi8gICAgdGkodCwgZSkge1xuICAgICAgICAvLyBTb3J0IHRoZSBkb2N1bWVudHMgYW5kIHJlLWFwcGx5IHRoZSBxdWVyeSBmaWx0ZXIgc2luY2UgcHJldmlvdXNseVxuICAgICAgICAvLyBtYXRjaGluZyBkb2N1bWVudHMgZG8gbm90IG5lY2Vzc2FyaWx5IHN0aWxsIG1hdGNoIHRoZSBxdWVyeS5cbiAgICAgICAgbGV0IG4gPSBuZXcga24oS2UodCkpO1xuICAgICAgICByZXR1cm4gZS5mb3JFYWNoKCgoZSwgcykgPT4ge1xuICAgICAgICAgICAgVWUodCwgcykgJiYgKG4gPSBuLmFkZChzKSk7XG4gICAgICAgIH0pKSwgbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiBhIGxpbWl0IHF1ZXJ5IG5lZWRzIHRvIGJlIHJlZmlsbGVkIGZyb20gY2FjaGUsIG1ha2luZyBpdFxuICAgICAqIGluZWxpZ2libGUgZm9yIGluZGV4LWZyZWUgZXhlY3V0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNvcnRlZFByZXZpb3VzUmVzdWx0cyAtIFRoZSBkb2N1bWVudHMgdGhhdCBtYXRjaGVkIHRoZSBxdWVyeSB3aGVuIGl0XG4gICAgICogd2FzIGxhc3Qgc3luY2hyb25pemVkLCBzb3J0ZWQgYnkgdGhlIHF1ZXJ5J3MgY29tcGFyYXRvci5cbiAgICAgKiBAcGFyYW0gcmVtb3RlS2V5cyAtIFRoZSBkb2N1bWVudCBrZXlzIHRoYXQgbWF0Y2hlZCB0aGUgcXVlcnkgYXQgdGhlIGxhc3RcbiAgICAgKiBzbmFwc2hvdC5cbiAgICAgKiBAcGFyYW0gbGltYm9GcmVlU25hcHNob3RWZXJzaW9uIC0gVGhlIHZlcnNpb24gb2YgdGhlIHNuYXBzaG90IHdoZW4gdGhlXG4gICAgICogcXVlcnkgd2FzIGxhc3Qgc3luY2hyb25pemVkLlxuICAgICAqLyAgICBlaSh0LCBlLCBuLCBzKSB7XG4gICAgICAgIC8vIFRoZSBxdWVyeSBuZWVkcyB0byBiZSByZWZpbGxlZCBpZiBhIHByZXZpb3VzbHkgbWF0Y2hpbmcgZG9jdW1lbnQgbm9cbiAgICAgICAgLy8gbG9uZ2VyIG1hdGNoZXMuXG4gICAgICAgIGlmIChuLnNpemUgIT09IGUuc2l6ZSkgcmV0dXJuICEwO1xuICAgICAgICAvLyBMaW1pdCBxdWVyaWVzIGFyZSBub3QgZWxpZ2libGUgZm9yIGluZGV4LWZyZWUgcXVlcnkgZXhlY3V0aW9uIGlmIHRoZXJlIGlzXG4gICAgICAgIC8vIGEgcG90ZW50aWFsIHRoYXQgYW4gb2xkZXIgZG9jdW1lbnQgZnJvbSBjYWNoZSBub3cgc29ydHMgYmVmb3JlIGEgZG9jdW1lbnRcbiAgICAgICAgLy8gdGhhdCB3YXMgcHJldmlvdXNseSBwYXJ0IG9mIHRoZSBsaW1pdC4gVGhpcywgaG93ZXZlciwgY2FuIG9ubHkgaGFwcGVuIGlmXG4gICAgICAgIC8vIHRoZSBkb2N1bWVudCBhdCB0aGUgZWRnZSBvZiB0aGUgbGltaXQgZ29lcyBvdXQgb2YgbGltaXQuXG4gICAgICAgIC8vIElmIGEgZG9jdW1lbnQgdGhhdCBpcyBub3QgdGhlIGxpbWl0IGJvdW5kYXJ5IHNvcnRzIGRpZmZlcmVudGx5LFxuICAgICAgICAvLyB0aGUgYm91bmRhcnkgb2YgdGhlIGxpbWl0IGl0c2VsZiBkaWQgbm90IGNoYW5nZSBhbmQgZG9jdW1lbnRzIGZyb20gY2FjaGVcbiAgICAgICAgLy8gd2lsbCBjb250aW51ZSB0byBiZSBcInJlamVjdGVkXCIgYnkgdGhpcyBib3VuZGFyeS4gVGhlcmVmb3JlLCB3ZSBjYW4gaWdub3JlXG4gICAgICAgIC8vIGFueSBtb2RpZmljYXRpb25zIHRoYXQgZG9uJ3QgYWZmZWN0IHRoZSBsYXN0IGRvY3VtZW50LlxuICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBcIkZcIiAvKiBGaXJzdCAqLyA9PT0gdCA/IGUubGFzdCgpIDogZS5maXJzdCgpO1xuICAgICAgICByZXR1cm4gISFpICYmIChpLmhhc1BlbmRpbmdXcml0ZXMgfHwgaS52ZXJzaW9uLmNvbXBhcmVUbyhzKSA+IDApO1xuICAgIH1cbiAgICBacyh0LCBlKSB7XG4gICAgICAgIHJldHVybiBrKCkgPD0gTG9nTGV2ZWwuREVCVUcgJiYgTyhcIlF1ZXJ5RW5naW5lXCIsIFwiVXNpbmcgZnVsbCBjb2xsZWN0aW9uIHNjYW4gdG8gZXhlY3V0ZSBxdWVyeTpcIiwgcWUoZSkpLCBcbiAgICAgICAgdGhpcy5Ycy5Hcyh0LCBlLCBjdC5taW4oKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBJbXBsZW1lbnRzIGBMb2NhbFN0b3JlYCBpbnRlcmZhY2UuXG4gKlxuICogTm90ZTogc29tZSBmaWVsZCBkZWZpbmVkIGluIHRoaXMgY2xhc3MgbWlnaHQgaGF2ZSBwdWJsaWMgYWNjZXNzIGxldmVsLCBidXRcbiAqIHRoZSBjbGFzcyBpcyBub3QgZXhwb3J0ZWQgc28gdGhleSBhcmUgb25seSBhY2Nlc3NpYmxlIGZyb20gdGhpcyBtb2R1bGUuXG4gKiBUaGlzIGlzIHVzZWZ1bCB0byBpbXBsZW1lbnQgb3B0aW9uYWwgZmVhdHVyZXMgKGxpa2UgYnVuZGxlcykgaW4gZnJlZVxuICogZnVuY3Rpb25zLCBzdWNoIHRoYXQgdGhleSBhcmUgdHJlZS1zaGFrZWFibGUuXG4gKi9cbmNsYXNzIFFyIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKiogTWFuYWdlcyBvdXIgaW4tbWVtb3J5IG9yIGR1cmFibGUgcGVyc2lzdGVuY2UuICovXG4gICAgdCwgZSwgbiwgcykge1xuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlID0gdCwgdGhpcy5uaSA9IGUsIHRoaXMuTSA9IHMsIFxuICAgICAgICAvKipcbiAgICAgICAgICogTWFwcyBhIHRhcmdldElEIHRvIGRhdGEgYWJvdXQgaXRzIHRhcmdldC5cbiAgICAgICAgICpcbiAgICAgICAgICogUE9SVElORyBOT1RFOiBXZSBhcmUgdXNpbmcgYW4gaW1tdXRhYmxlIGRhdGEgc3RydWN0dXJlIG9uIFdlYiB0byBtYWtlIHJlLXJ1bnNcbiAgICAgICAgICogb2YgYGFwcGx5UmVtb3RlRXZlbnQoKWAgaWRlbXBvdGVudC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2kgPSBuZXcgQ24ocnQpLCBcbiAgICAgICAgLyoqIE1hcHMgYSB0YXJnZXQgdG8gaXRzIHRhcmdldElELiAqL1xuICAgICAgICAvLyBUT0RPKHd1YW5keSk6IEV2YWx1YXRlIGlmIFRhcmdldElkIGNhbiBiZSBwYXJ0IG9mIFRhcmdldC5cbiAgICAgICAgdGhpcy5paSA9IG5ldyBEbigodCA9PiBjZSh0KSksIGxlKSwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcmVhZCB0aW1lIG9mIHRoZSBsYXN0IGVudHJ5IHByb2Nlc3NlZCBieSBgZ2V0TmV3RG9jdW1lbnRDaGFuZ2VzKClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBQT1JUSU5HIE5PVEU6IFRoaXMgaXMgb25seSB1c2VkIGZvciBtdWx0aS10YWIgc3luY2hyb25pemF0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yaSA9IGN0Lm1pbigpLCB0aGlzLm9pID0gdC5nZXRSZW1vdGVEb2N1bWVudENhY2hlKCksIHRoaXMuaHMgPSB0LmdldFRhcmdldENhY2hlKCksIFxuICAgICAgICB0aGlzLmZzID0gdC5nZXRCdW5kbGVDYWNoZSgpLCB0aGlzLmFpKG4pO1xuICAgIH1cbiAgICBhaSh0KSB7XG4gICAgICAgIC8vIFRPRE8oaW5kZXhpbmcpOiBBZGQgc3BlYyB0ZXN0cyB0aGF0IHRlc3QgdGhlc2UgY29tcG9uZW50cyBjaGFuZ2UgYWZ0ZXIgYVxuICAgICAgICAvLyB1c2VyIGNoYW5nZVxuICAgICAgICB0aGlzLmluZGV4TWFuYWdlciA9IHRoaXMucGVyc2lzdGVuY2UuZ2V0SW5kZXhNYW5hZ2VyKHQpLCB0aGlzLkZzID0gdGhpcy5wZXJzaXN0ZW5jZS5nZXRNdXRhdGlvblF1ZXVlKHQsIHRoaXMuaW5kZXhNYW5hZ2VyKSwgXG4gICAgICAgIHRoaXMudWkgPSBuZXcgVXIodGhpcy5vaSwgdGhpcy5GcywgdGhpcy5pbmRleE1hbmFnZXIpLCB0aGlzLm9pLnNldEluZGV4TWFuYWdlcih0aGlzLmluZGV4TWFuYWdlciksIFxuICAgICAgICB0aGlzLm5pLllzKHRoaXMudWkpO1xuICAgIH1cbiAgICBjb2xsZWN0R2FyYmFnZSh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlLnJ1blRyYW5zYWN0aW9uKFwiQ29sbGVjdCBnYXJiYWdlXCIsIFwicmVhZHdyaXRlLXByaW1hcnlcIiwgKGUgPT4gdC5jb2xsZWN0KGUsIHRoaXMuc2kpKSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBqcihcbi8qKiBNYW5hZ2VzIG91ciBpbi1tZW1vcnkgb3IgZHVyYWJsZSBwZXJzaXN0ZW5jZS4gKi9cbnQsIGUsIG4sIHMpIHtcbiAgICByZXR1cm4gbmV3IFFyKHQsIGUsIG4sIHMpO1xufVxuXG4vKipcbiAqIFRlbGxzIHRoZSBMb2NhbFN0b3JlIHRoYXQgdGhlIGN1cnJlbnRseSBhdXRoZW50aWNhdGVkIHVzZXIgaGFzIGNoYW5nZWQuXG4gKlxuICogSW4gcmVzcG9uc2UgdGhlIGxvY2FsIHN0b3JlIHN3aXRjaGVzIHRoZSBtdXRhdGlvbiBxdWV1ZSB0byB0aGUgbmV3IHVzZXIgYW5kXG4gKiByZXR1cm5zIGFueSByZXN1bHRpbmcgZG9jdW1lbnQgY2hhbmdlcy5cbiAqL1xuLy8gUE9SVElORyBOT1RFOiBBbmRyb2lkIGFuZCBpT1Mgb25seSByZXR1cm4gdGhlIGRvY3VtZW50cyBhZmZlY3RlZCBieSB0aGVcbi8vIGNoYW5nZS5cbmFzeW5jIGZ1bmN0aW9uIFdyKHQsIGUpIHtcbiAgICBjb25zdCBuID0gSyh0KTtcbiAgICByZXR1cm4gYXdhaXQgbi5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIkhhbmRsZSB1c2VyIGNoYW5nZVwiLCBcInJlYWRvbmx5XCIsICh0ID0+IHtcbiAgICAgICAgLy8gU3dhcCBvdXQgdGhlIG11dGF0aW9uIHF1ZXVlLCBncmFiYmluZyB0aGUgcGVuZGluZyBtdXRhdGlvbiBiYXRjaGVzXG4gICAgICAgIC8vIGJlZm9yZSBhbmQgYWZ0ZXIuXG4gICAgICAgIGxldCBzO1xuICAgICAgICByZXR1cm4gbi5Gcy5nZXRBbGxNdXRhdGlvbkJhdGNoZXModCkubmV4dCgoaSA9PiAocyA9IGksIG4uYWkoZSksIG4uRnMuZ2V0QWxsTXV0YXRpb25CYXRjaGVzKHQpKSkpLm5leHQoKGUgPT4ge1xuICAgICAgICAgICAgY29uc3QgaSA9IFtdLCByID0gW107XG4gICAgICAgICAgICAvLyBVbmlvbiB0aGUgb2xkL25ldyBjaGFuZ2VkIGtleXMuXG4gICAgICAgICAgICBsZXQgbyA9IEduKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2Ygcykge1xuICAgICAgICAgICAgICAgIGkucHVzaCh0LmJhdGNoSWQpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0Lm11dGF0aW9ucykgbyA9IG8uYWRkKGUua2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBlKSB7XG4gICAgICAgICAgICAgICAgci5wdXNoKHQuYmF0Y2hJZCk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIHQubXV0YXRpb25zKSBvID0gby5hZGQoZS5rZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBzZXQgb2YgYWxsIChwb3RlbnRpYWxseSkgY2hhbmdlZCBkb2N1bWVudHMgYW5kIHRoZSBsaXN0XG4gICAgICAgICAgICAvLyBvZiBtdXRhdGlvbiBiYXRjaCBJRHMgdGhhdCB3ZXJlIGFmZmVjdGVkIGJ5IGNoYW5nZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLnVpLlVzKHQsIG8pLm5leHQoKHQgPT4gKHtcbiAgICAgICAgICAgICAgICBjaTogdCxcbiAgICAgICAgICAgICAgICByZW1vdmVkQmF0Y2hJZHM6IGksXG4gICAgICAgICAgICAgICAgYWRkZWRCYXRjaElkczogclxuICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgfSkpO1xuICAgIH0pKTtcbn1cblxuLyogQWNjZXB0cyBsb2NhbGx5IGdlbmVyYXRlZCBNdXRhdGlvbnMgYW5kIGNvbW1pdCB0aGVtIHRvIHN0b3JhZ2UuICovXG4vKipcbiAqIEFja25vd2xlZGdlcyB0aGUgZ2l2ZW4gYmF0Y2guXG4gKlxuICogT24gdGhlIGhhcHB5IHBhdGggd2hlbiBhIGJhdGNoIGlzIGFja25vd2xlZGdlZCwgdGhlIGxvY2FsIHN0b3JlIHdpbGxcbiAqXG4gKiAgKyByZW1vdmUgdGhlIGJhdGNoIGZyb20gdGhlIG11dGF0aW9uIHF1ZXVlO1xuICogICsgYXBwbHkgdGhlIGNoYW5nZXMgdG8gdGhlIHJlbW90ZSBkb2N1bWVudCBjYWNoZTtcbiAqICArIHJlY2FsY3VsYXRlIHRoZSBsYXRlbmN5IGNvbXBlbnNhdGVkIHZpZXcgaW1wbGllZCBieSB0aG9zZSBjaGFuZ2VzICh0aGVyZVxuICogICAgbWF5IGJlIG11dGF0aW9ucyBpbiB0aGUgcXVldWUgdGhhdCBhZmZlY3QgdGhlIGRvY3VtZW50cyBidXQgaGF2ZW4ndCBiZWVuXG4gKiAgICBhY2tub3dsZWRnZWQgeWV0KTsgYW5kXG4gKiAgKyBnaXZlIHRoZSBjaGFuZ2VkIGRvY3VtZW50cyBiYWNrIHRoZSBzeW5jIGVuZ2luZVxuICpcbiAqIEByZXR1cm5zIFRoZSByZXN1bHRpbmcgKG1vZGlmaWVkKSBkb2N1bWVudHMuXG4gKi9cbmZ1bmN0aW9uIHpyKHQsIGUpIHtcbiAgICBjb25zdCBuID0gSyh0KTtcbiAgICByZXR1cm4gbi5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIkFja25vd2xlZGdlIGJhdGNoXCIsIFwicmVhZHdyaXRlLXByaW1hcnlcIiwgKHQgPT4ge1xuICAgICAgICBjb25zdCBzID0gZS5iYXRjaC5rZXlzKCksIGkgPSBuLm9pLm5ld0NoYW5nZUJ1ZmZlcih7XG4gICAgICAgICAgICB0cmFja1JlbW92YWxzOiAhMFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBuLmJhdGNoLCByID0gaS5rZXlzKCk7XG4gICAgICAgICAgICBsZXQgbyA9IHVpLnJlc29sdmUoKTtcbiAgICAgICAgICAgIHJldHVybiByLmZvckVhY2goKHQgPT4ge1xuICAgICAgICAgICAgICAgIG8gPSBvLm5leHQoKCgpID0+IHMuZ2V0RW50cnkoZSwgdCkpKS5uZXh0KChlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgciA9IG4uZG9jVmVyc2lvbnMuZ2V0KHQpO1xuICAgICAgICAgICAgICAgICAgICBxKG51bGwgIT09IHIpLCBlLnZlcnNpb24uY29tcGFyZVRvKHIpIDwgMCAmJiAoaS5hcHBseVRvUmVtb3RlRG9jdW1lbnQoZSwgbiksIGUuaXNWYWxpZERvY3VtZW50KCkgJiYgKFxuICAgICAgICAgICAgICAgICAgICAvLyBXZSB1c2UgdGhlIGNvbW1pdFZlcnNpb24gYXMgdGhlIHJlYWRUaW1lIHJhdGhlciB0aGFuIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBkb2N1bWVudCdzIHVwZGF0ZVRpbWUgc2luY2UgdGhlIHVwZGF0ZVRpbWUgaXMgbm90IGFkdmFuY2VkXG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciB1cGRhdGVzIHRoYXQgZG8gbm90IG1vZGlmeSB0aGUgdW5kZXJseWluZyBkb2N1bWVudC5cbiAgICAgICAgICAgICAgICAgICAgZS5zZXRSZWFkVGltZShuLmNvbW1pdFZlcnNpb24pLCBzLmFkZEVudHJ5KGUpKSk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSkpLCBvLm5leHQoKCgpID0+IHQuRnMucmVtb3ZlTXV0YXRpb25CYXRjaChlLCBpKSkpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBSZXR1cm5zIHRoZSBsb2NhbCB2aWV3IG9mIHRoZSBkb2N1bWVudHMgYWZmZWN0ZWQgYnkgYSBtdXRhdGlvbiBiYXRjaC4gKi9cbiAgICAgICAgLy8gUE9SVElORyBOT1RFOiBNdWx0aS1UYWIgb25seS5cbiAgICAgICAgKG4sIHQsIGUsIGkpLm5leHQoKCgpID0+IGkuYXBwbHkodCkpKS5uZXh0KCgoKSA9PiBuLkZzLnBlcmZvcm1Db25zaXN0ZW5jeUNoZWNrKHQpKSkubmV4dCgoKCkgPT4gbi51aS5Vcyh0LCBzKSkpO1xuICAgIH0pKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIG11dGF0aW9ucyBmcm9tIHRoZSBNdXRhdGlvblF1ZXVlIGZvciB0aGUgc3BlY2lmaWVkIGJhdGNoO1xuICogTG9jYWxEb2N1bWVudHMgd2lsbCBiZSByZWNhbGN1bGF0ZWQuXG4gKlxuICogQHJldHVybnMgVGhlIHJlc3VsdGluZyBtb2RpZmllZCBkb2N1bWVudHMuXG4gKi9cbi8qKlxuICogUmV0dXJucyB0aGUgbGFzdCBjb25zaXN0ZW50IHNuYXBzaG90IHByb2Nlc3NlZCAodXNlZCBieSB0aGUgUmVtb3RlU3RvcmUgdG9cbiAqIGRldGVybWluZSB3aGV0aGVyIHRvIGJ1ZmZlciBpbmNvbWluZyBzbmFwc2hvdHMgZnJvbSB0aGUgYmFja2VuZCkuXG4gKi9cbmZ1bmN0aW9uIEhyKHQpIHtcbiAgICBjb25zdCBlID0gSyh0KTtcbiAgICByZXR1cm4gZS5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIkdldCBsYXN0IHJlbW90ZSBzbmFwc2hvdCB2ZXJzaW9uXCIsIFwicmVhZG9ubHlcIiwgKHQgPT4gZS5ocy5nZXRMYXN0UmVtb3RlU25hcHNob3RWZXJzaW9uKHQpKSk7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgXCJncm91bmQtc3RhdGVcIiAocmVtb3RlKSBkb2N1bWVudHMuIFdlIGFzc3VtZSB0aGF0IHRoZSByZW1vdGVcbiAqIGV2ZW50IHJlZmxlY3RzIGFueSB3cml0ZSBiYXRjaGVzIHRoYXQgaGF2ZSBiZWVuIGFja25vd2xlZGdlZCBvciByZWplY3RlZFxuICogKGkuZS4gd2UgZG8gbm90IHJlLWFwcGx5IGxvY2FsIG11dGF0aW9ucyB0byB1cGRhdGVzIGZyb20gdGhpcyBldmVudCkuXG4gKlxuICogTG9jYWxEb2N1bWVudHMgYXJlIHJlLWNhbGN1bGF0ZWQgaWYgdGhlcmUgYXJlIHJlbWFpbmluZyBtdXRhdGlvbnMgaW4gdGhlXG4gKiBxdWV1ZS5cbiAqLyBmdW5jdGlvbiBKcih0LCBlKSB7XG4gICAgY29uc3QgbiA9IEsodCksIHMgPSBlLnNuYXBzaG90VmVyc2lvbjtcbiAgICBsZXQgaSA9IG4uc2k7XG4gICAgcmV0dXJuIG4ucGVyc2lzdGVuY2UucnVuVHJhbnNhY3Rpb24oXCJBcHBseSByZW1vdGUgZXZlbnRcIiwgXCJyZWFkd3JpdGUtcHJpbWFyeVwiLCAodCA9PiB7XG4gICAgICAgIGNvbnN0IHIgPSBuLm9pLm5ld0NoYW5nZUJ1ZmZlcih7XG4gICAgICAgICAgICB0cmFja1JlbW92YWxzOiAhMFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gUmVzZXQgbmV3VGFyZ2V0RGF0YUJ5VGFyZ2V0TWFwIGluIGNhc2UgdGhpcyB0cmFuc2FjdGlvbiBnZXRzIHJlLXJ1bi5cbiAgICAgICAgICAgICAgICBpID0gbi5zaTtcbiAgICAgICAgY29uc3QgbyA9IFtdO1xuICAgICAgICBlLnRhcmdldENoYW5nZXMuZm9yRWFjaCgoKHIsIGEpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHUgPSBpLmdldChhKTtcbiAgICAgICAgICAgIGlmICghdSkgcmV0dXJuO1xuICAgICAgICAgICAgLy8gT25seSB1cGRhdGUgdGhlIHJlbW90ZSBrZXlzIGlmIHRoZSB0YXJnZXQgaXMgc3RpbGwgYWN0aXZlLiBUaGlzXG4gICAgICAgICAgICAvLyBlbnN1cmVzIHRoYXQgd2UgY2FuIHBlcnNpc3QgdGhlIHVwZGF0ZWQgdGFyZ2V0IGRhdGEgYWxvbmcgd2l0aFxuICAgICAgICAgICAgLy8gdGhlIHVwZGF0ZWQgYXNzaWdubWVudC5cbiAgICAgICAgICAgICAgICAgICAgICAgIG8ucHVzaChuLmhzLnJlbW92ZU1hdGNoaW5nS2V5cyh0LCByLnJlbW92ZWREb2N1bWVudHMsIGEpLm5leHQoKCgpID0+IG4uaHMuYWRkTWF0Y2hpbmdLZXlzKHQsIHIuYWRkZWREb2N1bWVudHMsIGEpKSkpO1xuICAgICAgICAgICAgbGV0IGMgPSB1LndpdGhTZXF1ZW5jZU51bWJlcih0LmN1cnJlbnRTZXF1ZW5jZU51bWJlcik7XG4gICAgICAgICAgICBlLnRhcmdldE1pc21hdGNoZXMuaGFzKGEpID8gYyA9IGMud2l0aFJlc3VtZVRva2VuKHB0LkVNUFRZX0JZVEVfU1RSSU5HLCBjdC5taW4oKSkud2l0aExhc3RMaW1ib0ZyZWVTbmFwc2hvdFZlcnNpb24oY3QubWluKCkpIDogci5yZXN1bWVUb2tlbi5hcHByb3hpbWF0ZUJ5dGVTaXplKCkgPiAwICYmIChjID0gYy53aXRoUmVzdW1lVG9rZW4oci5yZXN1bWVUb2tlbiwgcykpLCBcbiAgICAgICAgICAgIGkgPSBpLmluc2VydChhLCBjKSwgXG4gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHRhcmdldCBkYXRhIGlmIHRoZXJlIGFyZSB0YXJnZXQgY2hhbmdlcyAob3IgaWZcbiAgICAgICAgICAgIC8vIHN1ZmZpY2llbnQgdGltZSBoYXMgcGFzc2VkIHNpbmNlIHRoZSBsYXN0IHVwZGF0ZSkuXG4gICAgICAgICAgICAvKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbmV3VGFyZ2V0RGF0YSBzaG91bGQgYmUgcGVyc2lzdGVkIGR1cmluZyBhbiB1cGRhdGUgb2ZcbiAqIGFuIGFjdGl2ZSB0YXJnZXQuIFRhcmdldERhdGEgc2hvdWxkIGFsd2F5cyBiZSBwZXJzaXN0ZWQgd2hlbiBhIHRhcmdldCBpc1xuICogYmVpbmcgcmVsZWFzZWQgYW5kIHNob3VsZCBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLlxuICpcbiAqIFdoaWxlIHRoZSB0YXJnZXQgaXMgYWN0aXZlLCBUYXJnZXREYXRhIHVwZGF0ZXMgY2FuIGJlIG9taXR0ZWQgd2hlbiBub3RoaW5nXG4gKiBhYm91dCB0aGUgdGFyZ2V0IGhhcyBjaGFuZ2VkIGV4Y2VwdCBtZXRhZGF0YSBsaWtlIHRoZSByZXN1bWUgdG9rZW4gb3JcbiAqIHNuYXBzaG90IHZlcnNpb24uIE9jY2FzaW9uYWxseSBpdCdzIHdvcnRoIHRoZSBleHRyYSB3cml0ZSB0byBwcmV2ZW50IHRoZXNlXG4gKiB2YWx1ZXMgZnJvbSBnZXR0aW5nIHRvbyBzdGFsZSBhZnRlciBhIGNyYXNoLCBidXQgdGhpcyBkb2Vzbid0IGhhdmUgdG8gYmVcbiAqIHRvbyBmcmVxdWVudC5cbiAqL1xuICAgICAgICAgICAgZnVuY3Rpb24odCwgZSwgbikge1xuICAgICAgICAgICAgICAgIC8vIEFsd2F5cyBwZXJzaXN0IHRhcmdldCBkYXRhIGlmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBhIHJlc3VtZSB0b2tlbi5cbiAgICAgICAgICAgICAgICBpZiAoMCA9PT0gdC5yZXN1bWVUb2tlbi5hcHByb3hpbWF0ZUJ5dGVTaXplKCkpIHJldHVybiAhMDtcbiAgICAgICAgICAgICAgICAvLyBEb24ndCBhbGxvdyByZXN1bWUgdG9rZW4gY2hhbmdlcyB0byBiZSBidWZmZXJlZCBpbmRlZmluaXRlbHkuIFRoaXNcbiAgICAgICAgICAgICAgICAvLyBhbGxvd3MgdXMgdG8gYmUgcmVhc29uYWJseSB1cC10by1kYXRlIGFmdGVyIGEgY3Jhc2ggYW5kIGF2b2lkcyBuZWVkaW5nXG4gICAgICAgICAgICAgICAgLy8gdG8gbG9vcCBvdmVyIGFsbCBhY3RpdmUgcXVlcmllcyBvbiBzaHV0ZG93bi4gRXNwZWNpYWxseSBpbiB0aGUgYnJvd3NlclxuICAgICAgICAgICAgICAgIC8vIHdlIG1heSBub3QgZ2V0IHRpbWUgdG8gZG8gYW55dGhpbmcgaW50ZXJlc3Rpbmcgd2hpbGUgdGhlIGN1cnJlbnQgdGFiIGlzXG4gICAgICAgICAgICAgICAgLy8gY2xvc2luZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuc25hcHNob3RWZXJzaW9uLnRvTWljcm9zZWNvbmRzKCkgLSB0LnNuYXBzaG90VmVyc2lvbi50b01pY3Jvc2Vjb25kcygpID49IDNlOCkgcmV0dXJuICEwO1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBpZiB0aGUgb25seSB0aGluZyB0aGF0IGhhcyBjaGFuZ2VkIGFib3V0IGEgdGFyZ2V0IGlzIGl0cyByZXN1bWVcbiAgICAgICAgICAgICAgICAvLyB0b2tlbiBpdCdzIG5vdCB3b3J0aCBwZXJzaXN0aW5nLiBOb3RlIHRoYXQgdGhlIFJlbW90ZVN0b3JlIGtlZXBzIGFuXG4gICAgICAgICAgICAgICAgLy8gaW4tbWVtb3J5IHZpZXcgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgdGFyZ2V0cyB3aGljaCBpbmNsdWRlcyB0aGUgY3VycmVudFxuICAgICAgICAgICAgICAgIC8vIHJlc3VtZSB0b2tlbiwgc28gc3RyZWFtIGZhaWx1cmUgb3IgdXNlciBjaGFuZ2VzIHdpbGwgc3RpbGwgdXNlIGFuXG4gICAgICAgICAgICAgICAgLy8gdXAtdG8tZGF0ZSByZXN1bWUgdG9rZW4gcmVnYXJkbGVzcyBvZiB3aGF0IHdlIGRvIGhlcmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmFkZGVkRG9jdW1lbnRzLnNpemUgKyBuLm1vZGlmaWVkRG9jdW1lbnRzLnNpemUgKyBuLnJlbW92ZWREb2N1bWVudHMuc2l6ZSA+IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKipcbiAqIE5vdGlmaWVzIGxvY2FsIHN0b3JlIG9mIHRoZSBjaGFuZ2VkIHZpZXdzIHRvIGxvY2FsbHkgcGluIGRvY3VtZW50cy5cbiAqLyAodSwgYywgcikgJiYgby5wdXNoKG4uaHMudXBkYXRlVGFyZ2V0RGF0YSh0LCBjKSk7XG4gICAgICAgIH0pKTtcbiAgICAgICAgbGV0IGEgPSBGbigpO1xuICAgICAgICAvLyBIQUNLOiBUaGUgb25seSByZWFzb24gd2UgYWxsb3cgYSBudWxsIHNuYXBzaG90IHZlcnNpb24gaXMgc28gdGhhdCB3ZVxuICAgICAgICAvLyBjYW4gc3ludGhlc2l6ZSByZW1vdGUgZXZlbnRzIHdoZW4gd2UgZ2V0IHBlcm1pc3Npb24gZGVuaWVkIGVycm9ycyB3aGlsZVxuICAgICAgICAvLyB0cnlpbmcgdG8gcmVzb2x2ZSB0aGUgc3RhdGUgb2YgYSBsb2NhbGx5IGNhY2hlZCBkb2N1bWVudCB0aGF0IGlzIGluXG4gICAgICAgIC8vIGxpbWJvLlxuICAgICAgICBpZiAoZS5kb2N1bWVudFVwZGF0ZXMuZm9yRWFjaCgocyA9PiB7XG4gICAgICAgICAgICBlLnJlc29sdmVkTGltYm9Eb2N1bWVudHMuaGFzKHMpICYmIG8ucHVzaChuLnBlcnNpc3RlbmNlLnJlZmVyZW5jZURlbGVnYXRlLnVwZGF0ZUxpbWJvRG9jdW1lbnQodCwgcykpO1xuICAgICAgICB9KSksIFxuICAgICAgICAvLyBFYWNoIGxvb3AgaXRlcmF0aW9uIG9ubHkgYWZmZWN0cyBpdHMgXCJvd25cIiBkb2MsIHNvIGl0J3Mgc2FmZSB0byBnZXQgYWxsIHRoZSByZW1vdGVcbiAgICAgICAgLy8gZG9jdW1lbnRzIGluIGFkdmFuY2UgaW4gYSBzaW5nbGUgY2FsbC5cbiAgICAgICAgby5wdXNoKFlyKHQsIHIsIGUuZG9jdW1lbnRVcGRhdGVzKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgIGEgPSB0O1xuICAgICAgICB9KSkpLCAhcy5pc0VxdWFsKGN0Lm1pbigpKSkge1xuICAgICAgICAgICAgY29uc3QgZSA9IG4uaHMuZ2V0TGFzdFJlbW90ZVNuYXBzaG90VmVyc2lvbih0KS5uZXh0KChlID0+IG4uaHMuc2V0VGFyZ2V0c01ldGFkYXRhKHQsIHQuY3VycmVudFNlcXVlbmNlTnVtYmVyLCBzKSkpO1xuICAgICAgICAgICAgby5wdXNoKGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1aS53YWl0Rm9yKG8pLm5leHQoKCgpID0+IHIuYXBwbHkodCkpKS5uZXh0KCgoKSA9PiBuLnVpLktzKHQsIGEpKSkubmV4dCgoKCkgPT4gYSkpO1xuICAgIH0pKS50aGVuKCh0ID0+IChuLnNpID0gaSwgdCkpKTtcbn1cblxuLyoqXG4gKiBQb3B1bGF0ZXMgZG9jdW1lbnQgY2hhbmdlIGJ1ZmZlciB3aXRoIGRvY3VtZW50cyBmcm9tIGJhY2tlbmQgb3IgYSBidW5kbGUuXG4gKiBSZXR1cm5zIHRoZSBkb2N1bWVudCBjaGFuZ2VzIHJlc3VsdGluZyBmcm9tIGFwcGx5aW5nIHRob3NlIGRvY3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gdHhuIC0gVHJhbnNhY3Rpb24gdG8gdXNlIHRvIHJlYWQgZXhpc3RpbmcgZG9jdW1lbnRzIGZyb20gc3RvcmFnZS5cbiAqIEBwYXJhbSBkb2N1bWVudEJ1ZmZlciAtIERvY3VtZW50IGJ1ZmZlciB0byBjb2xsZWN0IHRoZSByZXN1bHRlZCBjaGFuZ2VzIHRvIGJlXG4gKiAgICAgICAgYXBwbGllZCB0byBzdG9yYWdlLlxuICogQHBhcmFtIGRvY3VtZW50cyAtIERvY3VtZW50cyB0byBiZSBhcHBsaWVkLlxuICogQHBhcmFtIGdsb2JhbFZlcnNpb24gLSBBIGBTbmFwc2hvdFZlcnNpb25gIHJlcHJlc2VudGluZyB0aGUgcmVhZCB0aW1lIGlmIGFsbFxuICogICAgICAgIGRvY3VtZW50cyBoYXZlIHRoZSBzYW1lIHJlYWQgdGltZS5cbiAqIEBwYXJhbSBkb2N1bWVudFZlcnNpb25zIC0gQSBEb2N1bWVudEtleS10by1TbmFwc2hvdFZlcnNpb24gbWFwIGlmIGRvY3VtZW50c1xuICogICAgICAgIGhhdmUgdGhlaXIgb3duIHJlYWQgdGltZS5cbiAqXG4gKiBOb3RlOiB0aGlzIGZ1bmN0aW9uIHdpbGwgdXNlIGBkb2N1bWVudFZlcnNpb25zYCBpZiBpdCBpcyBkZWZpbmVkO1xuICogd2hlbiBpdCBpcyBub3QgZGVmaW5lZCwgcmVzb3J0cyB0byBgZ2xvYmFsVmVyc2lvbmAuXG4gKi8gZnVuY3Rpb24gWXIodCwgZSwgbikge1xuICAgIGxldCBzID0gR24oKTtcbiAgICByZXR1cm4gbi5mb3JFYWNoKCh0ID0+IHMgPSBzLmFkZCh0KSkpLCBlLmdldEVudHJpZXModCwgcykubmV4dCgodCA9PiB7XG4gICAgICAgIGxldCBzID0gRm4oKTtcbiAgICAgICAgcmV0dXJuIG4uZm9yRWFjaCgoKG4sIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHIgPSB0LmdldChuKTtcbiAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBvcmRlciBvZiB0aGUgc3RlcHMgYmVsb3cgaXMgaW1wb3J0YW50LCBzaW5jZSB3ZSB3YW50XG4gICAgICAgICAgICAvLyB0byBlbnN1cmUgdGhhdCByZWplY3RlZCBsaW1ibyByZXNvbHV0aW9ucyAod2hpY2ggZmFicmljYXRlXG4gICAgICAgICAgICAvLyBOb0RvY3VtZW50cyB3aXRoIFNuYXBzaG90VmVyc2lvbi5taW4oKSkgbmV2ZXIgYWRkIGRvY3VtZW50cyB0b1xuICAgICAgICAgICAgLy8gY2FjaGUuXG4gICAgICAgICAgICAgICAgICAgICAgICBpLmlzTm9Eb2N1bWVudCgpICYmIGkudmVyc2lvbi5pc0VxdWFsKGN0Lm1pbigpKSA/IChcbiAgICAgICAgICAgIC8vIE5vRG9jdW1lbnRzIHdpdGggU25hcHNob3RWZXJzaW9uLm1pbigpIGFyZSB1c2VkIGluIG1hbnVmYWN0dXJlZFxuICAgICAgICAgICAgLy8gZXZlbnRzLiBXZSByZW1vdmUgdGhlc2UgZG9jdW1lbnRzIGZyb20gY2FjaGUgc2luY2Ugd2UgbG9zdFxuICAgICAgICAgICAgLy8gYWNjZXNzLlxuICAgICAgICAgICAgZS5yZW1vdmVFbnRyeShuLCBpLnJlYWRUaW1lKSwgcyA9IHMuaW5zZXJ0KG4sIGkpKSA6ICFyLmlzVmFsaWREb2N1bWVudCgpIHx8IGkudmVyc2lvbi5jb21wYXJlVG8oci52ZXJzaW9uKSA+IDAgfHwgMCA9PT0gaS52ZXJzaW9uLmNvbXBhcmVUbyhyLnZlcnNpb24pICYmIHIuaGFzUGVuZGluZ1dyaXRlcyA/IChlLmFkZEVudHJ5KGkpLCBcbiAgICAgICAgICAgIHMgPSBzLmluc2VydChuLCBpKSkgOiBPKFwiTG9jYWxTdG9yZVwiLCBcIklnbm9yaW5nIG91dGRhdGVkIHdhdGNoIHVwZGF0ZSBmb3IgXCIsIG4sIFwiLiBDdXJyZW50IHZlcnNpb246XCIsIHIudmVyc2lvbiwgXCIgV2F0Y2ggdmVyc2lvbjpcIiwgaS52ZXJzaW9uKTtcbiAgICAgICAgfSkpLCBzO1xuICAgIH0pKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBtdXRhdGlvbiBiYXRjaCBhZnRlciB0aGUgcGFzc2VkIGluIGJhdGNoSWQgaW4gdGhlIG11dGF0aW9uIHF1ZXVlXG4gKiBvciBudWxsIGlmIGVtcHR5LlxuICogQHBhcmFtIGFmdGVyQmF0Y2hJZCAtIElmIHByb3ZpZGVkLCB0aGUgYmF0Y2ggdG8gc2VhcmNoIGFmdGVyLlxuICogQHJldHVybnMgVGhlIG5leHQgbXV0YXRpb24gb3IgbnVsbCBpZiB0aGVyZSB3YXNuJ3Qgb25lLlxuICovXG5mdW5jdGlvbiBYcih0LCBlKSB7XG4gICAgY29uc3QgbiA9IEsodCk7XG4gICAgcmV0dXJuIG4ucGVyc2lzdGVuY2UucnVuVHJhbnNhY3Rpb24oXCJHZXQgbmV4dCBtdXRhdGlvbiBiYXRjaFwiLCBcInJlYWRvbmx5XCIsICh0ID0+ICh2b2lkIDAgPT09IGUgJiYgKGUgPSAtMSksIFxuICAgIG4uRnMuZ2V0TmV4dE11dGF0aW9uQmF0Y2hBZnRlckJhdGNoSWQodCwgZSkpKSk7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgYSBEb2N1bWVudCB3aXRoIGEgZ2l2ZW4ga2V5IG9yIG51bGwgaWYgbm90XG4gKiBmb3VuZCAtIHVzZWQgZm9yIHRlc3RpbmcuXG4gKi9cbi8qKlxuICogQXNzaWducyB0aGUgZ2l2ZW4gdGFyZ2V0IGFuIGludGVybmFsIElEIHNvIHRoYXQgaXRzIHJlc3VsdHMgY2FuIGJlIHBpbm5lZCBzb1xuICogdGhleSBkb24ndCBnZXQgR0MnZC4gQSB0YXJnZXQgbXVzdCBiZSBhbGxvY2F0ZWQgaW4gdGhlIGxvY2FsIHN0b3JlIGJlZm9yZVxuICogdGhlIHN0b3JlIGNhbiBiZSB1c2VkIHRvIG1hbmFnZSBpdHMgdmlldy5cbiAqXG4gKiBBbGxvY2F0aW5nIGFuIGFscmVhZHkgYWxsb2NhdGVkIGBUYXJnZXRgIHdpbGwgcmV0dXJuIHRoZSBleGlzdGluZyBgVGFyZ2V0RGF0YWBcbiAqIGZvciB0aGF0IGBUYXJnZXRgLlxuICovXG5mdW5jdGlvbiBacih0LCBlKSB7XG4gICAgY29uc3QgbiA9IEsodCk7XG4gICAgcmV0dXJuIG4ucGVyc2lzdGVuY2UucnVuVHJhbnNhY3Rpb24oXCJBbGxvY2F0ZSB0YXJnZXRcIiwgXCJyZWFkd3JpdGVcIiwgKHQgPT4ge1xuICAgICAgICBsZXQgcztcbiAgICAgICAgcmV0dXJuIG4uaHMuZ2V0VGFyZ2V0RGF0YSh0LCBlKS5uZXh0KChpID0+IGkgPyAoXG4gICAgICAgIC8vIFRoaXMgdGFyZ2V0IGhhcyBiZWVuIGxpc3RlbmVkIHRvIHByZXZpb3VzbHksIHNvIHJldXNlIHRoZVxuICAgICAgICAvLyBwcmV2aW91cyB0YXJnZXRJRC5cbiAgICAgICAgLy8gVE9ETyhtY2cpOiBmcmVzaGVuIGxhc3QgYWNjZXNzZWQgZGF0ZT9cbiAgICAgICAgcyA9IGksIHVpLnJlc29sdmUocykpIDogbi5ocy5hbGxvY2F0ZVRhcmdldElkKHQpLm5leHQoKGkgPT4gKHMgPSBuZXcgQWkoZSwgaSwgMCAvKiBMaXN0ZW4gKi8gLCB0LmN1cnJlbnRTZXF1ZW5jZU51bWJlciksIFxuICAgICAgICBuLmhzLmFkZFRhcmdldERhdGEodCwgcykubmV4dCgoKCkgPT4gcykpKSkpKSk7XG4gICAgfSkpLnRoZW4oKHQgPT4ge1xuICAgICAgICAvLyBJZiBNdWx0aS1UYWIgaXMgZW5hYmxlZCwgdGhlIGV4aXN0aW5nIHRhcmdldCBkYXRhIG1heSBiZSBuZXdlciB0aGFuXG4gICAgICAgIC8vIHRoZSBpbi1tZW1vcnkgZGF0YVxuICAgICAgICBjb25zdCBzID0gbi5zaS5nZXQodC50YXJnZXRJZCk7XG4gICAgICAgIHJldHVybiAobnVsbCA9PT0gcyB8fCB0LnNuYXBzaG90VmVyc2lvbi5jb21wYXJlVG8ocy5zbmFwc2hvdFZlcnNpb24pID4gMCkgJiYgKG4uc2kgPSBuLnNpLmluc2VydCh0LnRhcmdldElkLCB0KSwgXG4gICAgICAgIG4uaWkuc2V0KGUsIHQudGFyZ2V0SWQpKSwgdDtcbiAgICB9KSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgVGFyZ2V0RGF0YSBhcyBzZWVuIGJ5IHRoZSBMb2NhbFN0b3JlLCBpbmNsdWRpbmcgdXBkYXRlcyB0aGF0IG1heVxuICogaGF2ZSBub3QgeWV0IGJlZW4gcGVyc2lzdGVkIHRvIHRoZSBUYXJnZXRDYWNoZS5cbiAqL1xuLy8gVmlzaWJsZSBmb3IgdGVzdGluZy5cbi8qKlxuICogVW5waW5zIGFsbCB0aGUgZG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gdGFyZ2V0LiBJZlxuICogYGtlZXBQZXJzaXN0ZWRUYXJnZXREYXRhYCBpcyBzZXQgdG8gZmFsc2UgYW5kIEVhZ2VyIEdDIGVuYWJsZWQsIHRoZSBtZXRob2RcbiAqIGRpcmVjdGx5IHJlbW92ZXMgdGhlIGFzc29jaWF0ZWQgdGFyZ2V0IGRhdGEgZnJvbSB0aGUgdGFyZ2V0IGNhY2hlLlxuICpcbiAqIFJlbGVhc2luZyBhIG5vbi1leGlzdGluZyBgVGFyZ2V0YCBpcyBhIG5vLW9wLlxuICovXG4vLyBQT1JUSU5HIE5PVEU6IGBrZWVwUGVyc2lzdGVkVGFyZ2V0RGF0YWAgaXMgbXVsdGktdGFiIG9ubHkuXG5hc3luYyBmdW5jdGlvbiB0byh0LCBlLCBuKSB7XG4gICAgY29uc3QgcyA9IEsodCksIGkgPSBzLnNpLmdldChlKSwgciA9IG4gPyBcInJlYWR3cml0ZVwiIDogXCJyZWFkd3JpdGUtcHJpbWFyeVwiO1xuICAgIHRyeSB7XG4gICAgICAgIG4gfHwgYXdhaXQgcy5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIlJlbGVhc2UgdGFyZ2V0XCIsIHIsICh0ID0+IHMucGVyc2lzdGVuY2UucmVmZXJlbmNlRGVsZWdhdGUucmVtb3ZlVGFyZ2V0KHQsIGkpKSk7XG4gICAgfSBjYXRjaCAodCkge1xuICAgICAgICBpZiAoIWRpKHQpKSB0aHJvdyB0O1xuICAgICAgICAvLyBBbGwgYHJlbGVhc2VUYXJnZXRgIGRvZXMgaXMgcmVjb3JkIHRoZSBmaW5hbCBtZXRhZGF0YSBzdGF0ZSBmb3IgdGhlXG4gICAgICAgIC8vIHRhcmdldCwgYnV0IHdlJ3ZlIGJlZW4gcmVjb3JkaW5nIHRoaXMgcGVyaW9kaWNhbGx5IGR1cmluZyB0YXJnZXRcbiAgICAgICAgLy8gYWN0aXZpdHkuIElmIHdlIGxvc2UgdGhpcyB3cml0ZSB0aGlzIGNvdWxkIGNhdXNlIGEgdmVyeSBzbGlnaHRcbiAgICAgICAgLy8gZGlmZmVyZW5jZSBpbiB0aGUgb3JkZXIgb2YgdGFyZ2V0IGRlbGV0aW9uIGR1cmluZyBHQywgYnV0IHdlXG4gICAgICAgIC8vIGRvbid0IGRlZmluZSBleGFjdCBMUlUgc2VtYW50aWNzIHNvIHRoaXMgaXMgYWNjZXB0YWJsZS5cbiAgICAgICAgTyhcIkxvY2FsU3RvcmVcIiwgYEZhaWxlZCB0byB1cGRhdGUgc2VxdWVuY2UgbnVtYmVycyBmb3IgdGFyZ2V0ICR7ZX06ICR7dH1gKTtcbiAgICB9XG4gICAgcy5zaSA9IHMuc2kucmVtb3ZlKGUpLCBzLmlpLmRlbGV0ZShpLnRhcmdldCk7XG59XG5cbi8qKlxuICogUnVucyB0aGUgc3BlY2lmaWVkIHF1ZXJ5IGFnYWluc3QgdGhlIGxvY2FsIHN0b3JlIGFuZCByZXR1cm5zIHRoZSByZXN1bHRzLFxuICogcG90ZW50aWFsbHkgdGFraW5nIGFkdmFudGFnZSBvZiBxdWVyeSBkYXRhIGZyb20gcHJldmlvdXMgZXhlY3V0aW9ucyAoc3VjaFxuICogYXMgdGhlIHNldCBvZiByZW1vdGUga2V5cykuXG4gKlxuICogQHBhcmFtIHVzZVByZXZpb3VzUmVzdWx0cyAtIFdoZXRoZXIgcmVzdWx0cyBmcm9tIHByZXZpb3VzIGV4ZWN1dGlvbnMgY2FuXG4gKiBiZSB1c2VkIHRvIG9wdGltaXplIHRoaXMgcXVlcnkgZXhlY3V0aW9uLlxuICovIGZ1bmN0aW9uIGVvKHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gSyh0KTtcbiAgICBsZXQgaSA9IGN0Lm1pbigpLCByID0gR24oKTtcbiAgICByZXR1cm4gcy5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIkV4ZWN1dGUgcXVlcnlcIiwgXCJyZWFkb25seVwiLCAodCA9PiBmdW5jdGlvbih0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSBLKHQpLCBpID0gcy5paS5nZXQobik7XG4gICAgICAgIHJldHVybiB2b2lkIDAgIT09IGkgPyB1aS5yZXNvbHZlKHMuc2kuZ2V0KGkpKSA6IHMuaHMuZ2V0VGFyZ2V0RGF0YShlLCBuKTtcbiAgICB9KHMsIHQsICRlKGUpKS5uZXh0KChlID0+IHtcbiAgICAgICAgaWYgKGUpIHJldHVybiBpID0gZS5sYXN0TGltYm9GcmVlU25hcHNob3RWZXJzaW9uLCBzLmhzLmdldE1hdGNoaW5nS2V5c0ZvclRhcmdldElkKHQsIGUudGFyZ2V0SWQpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgciA9IHQ7XG4gICAgICAgIH0pKTtcbiAgICB9KSkubmV4dCgoKCkgPT4gcy5uaS5Hcyh0LCBlLCBuID8gaSA6IGN0Lm1pbigpLCBuID8gciA6IEduKCkpKSkubmV4dCgodCA9PiAoe1xuICAgICAgICBkb2N1bWVudHM6IHQsXG4gICAgICAgIGhpOiByXG4gICAgfSkpKSkpO1xufVxuXG4vLyBQT1JUSU5HIE5PVEU6IE11bHRpLVRhYiBvbmx5LlxuZnVuY3Rpb24gbm8odCwgZSkge1xuICAgIGNvbnN0IG4gPSBLKHQpLCBzID0gSyhuLmhzKSwgaSA9IG4uc2kuZ2V0KGUpO1xuICAgIHJldHVybiBpID8gUHJvbWlzZS5yZXNvbHZlKGkudGFyZ2V0KSA6IG4ucGVyc2lzdGVuY2UucnVuVHJhbnNhY3Rpb24oXCJHZXQgdGFyZ2V0IGRhdGFcIiwgXCJyZWFkb25seVwiLCAodCA9PiBzLkV0KHQsIGUpLm5leHQoKHQgPT4gdCA/IHQudGFyZ2V0IDogbnVsbCkpKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc2V0IG9mIGRvY3VtZW50cyB0aGF0IGhhdmUgYmVlbiB1cGRhdGVkIHNpbmNlIHRoZSBsYXN0IGNhbGwuXG4gKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsLCByZXR1cm5zIHRoZSBzZXQgb2YgY2hhbmdlcyBzaW5jZSBjbGllbnRcbiAqIGluaXRpYWxpemF0aW9uLiBGdXJ0aGVyIGludm9jYXRpb25zIHdpbGwgcmV0dXJuIGRvY3VtZW50IHRoYXQgaGF2ZSBjaGFuZ2VkXG4gKiBzaW5jZSB0aGUgcHJpb3IgY2FsbC5cbiAqL1xuLy8gUE9SVElORyBOT1RFOiBNdWx0aS1UYWIgb25seS5cbmZ1bmN0aW9uIHNvKHQpIHtcbiAgICBjb25zdCBlID0gSyh0KTtcbiAgICByZXR1cm4gZS5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIkdldCBuZXcgZG9jdW1lbnQgY2hhbmdlc1wiLCBcInJlYWRvbmx5XCIsICh0ID0+IGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgY29uc3QgcyA9IEsodCk7XG4gICAgICAgIGxldCBpID0gRm4oKSwgciA9IFZpKG4pO1xuICAgICAgICBjb25zdCBvID0geHIoZSksIGEgPSBJREJLZXlSYW5nZS5sb3dlckJvdW5kKHIsICEwKTtcbiAgICAgICAgcmV0dXJuIG8uV3Qoe1xuICAgICAgICAgICAgaW5kZXg6IFwicmVhZFRpbWVJbmRleFwiLFxuICAgICAgICAgICAgcmFuZ2U6IGFcbiAgICAgICAgfSwgKCh0LCBlKSA9PiB7XG4gICAgICAgICAgICAvLyBVbmxpa2UgYGdldEVudHJ5KClgIGFuZCBvdGhlcnMsIGBnZXROZXdEb2N1bWVudENoYW5nZXMoKWAgcGFyc2VzXG4gICAgICAgICAgICAvLyB0aGUgZG9jdW1lbnRzIGRpcmVjdGx5IHNpbmNlIHdlIHdhbnQgdG8ga2VlcCBzZW50aW5lbCBkZWxldGVzLlxuICAgICAgICAgICAgY29uc3QgbiA9IGJpKHMuTSwgZSk7XG4gICAgICAgICAgICBpID0gaS5pbnNlcnQobi5rZXksIG4pLCByID0gZS5yZWFkVGltZTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+ICh7XG4gICAgICAgICAgICAkczogaSxcbiAgICAgICAgICAgIHJlYWRUaW1lOiB2aShyKVxuICAgICAgICB9KSkpO1xuICAgIH1cbiAgICAvKipcbiAqIFJldHVybnMgdGhlIHJlYWQgdGltZSBvZiB0aGUgbW9zdCByZWNlbnRseSByZWFkIGRvY3VtZW50IGluIHRoZSBjYWNoZSwgb3JcbiAqIFNuYXBzaG90VmVyc2lvbi5taW4oKSBpZiBub3QgYXZhaWxhYmxlLlxuICovXG4gICAgLy8gUE9SVElORyBOT1RFOiBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgbXVsdGktdGFiIHN5bmNocm9uaXphdGlvbi5cbiAgICAoZS5vaSwgdCwgZS5yaSkpKS50aGVuKCgoeyRzOiB0LCByZWFkVGltZTogbn0pID0+IChlLnJpID0gbiwgdCkpKTtcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgbmV3ZXN0IGRvY3VtZW50IGNoYW5nZSBmcm9tIHBlcnNpc3RlbmNlIGFuZCBtb3ZlcyB0aGUgaW50ZXJuYWxcbiAqIHN5bmNocm9uaXphdGlvbiBtYXJrZXIgZm9yd2FyZCBzbyB0aGF0IGNhbGxzIHRvIGBnZXROZXdEb2N1bWVudENoYW5nZXMoKWBcbiAqIG9ubHkgcmV0dXJuIGNoYW5nZXMgdGhhdCBoYXBwZW5lZCBhZnRlciBjbGllbnQgaW5pdGlhbGl6YXRpb24uXG4gKi9cbi8vIFBPUlRJTkcgTk9URTogTXVsdGktVGFiIG9ubHkuXG5hc3luYyBmdW5jdGlvbiBpbyh0KSB7XG4gICAgY29uc3QgZSA9IEsodCk7XG4gICAgcmV0dXJuIGUucGVyc2lzdGVuY2UucnVuVHJhbnNhY3Rpb24oXCJTeW5jaHJvbml6ZSBsYXN0IGRvY3VtZW50IGNoYW5nZSByZWFkIHRpbWVcIiwgXCJyZWFkb25seVwiLCAodCA9PiBmdW5jdGlvbih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB4cih0KTtcbiAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGV4aXN0aW5nIGVudHJpZXMsIHdlIHJldHVybiBTbmFwc2hvdFZlcnNpb24ubWluKCkuXG4gICAgICAgICAgICAgICAgbGV0IG4gPSBjdC5taW4oKTtcbiAgICAgICAgcmV0dXJuIGUuV3Qoe1xuICAgICAgICAgICAgaW5kZXg6IFwicmVhZFRpbWVJbmRleFwiLFxuICAgICAgICAgICAgcmV2ZXJzZTogITBcbiAgICAgICAgfSwgKCh0LCBlLCBzKSA9PiB7XG4gICAgICAgICAgICBlLnJlYWRUaW1lICYmIChuID0gdmkoZS5yZWFkVGltZSkpLCBzLmRvbmUoKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IG4pKTtcbiAgICB9KHQpKSkudGhlbigodCA9PiB7XG4gICAgICAgIGUucmkgPSB0O1xuICAgIH0pKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHRhcmdldCB1c2luZyB0aGUgZ2l2ZW4gYnVuZGxlIG5hbWUsIHdoaWNoIHdpbGwgYmUgdXNlZCB0b1xuICogaG9sZCB0aGUga2V5cyBvZiBhbGwgZG9jdW1lbnRzIGZyb20gdGhlIGJ1bmRsZSBpbiBxdWVyeS1kb2N1bWVudCBtYXBwaW5ncy5cbiAqIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBsb2FkZWQgZG9jdW1lbnRzIGRvIG5vdCBnZXQgZ2FyYmFnZSBjb2xsZWN0ZWRcbiAqIHJpZ2h0IGF3YXkuXG4gKi9cbi8qKlxuICogQXBwbGllcyB0aGUgZG9jdW1lbnRzIGZyb20gYSBidW5kbGUgdG8gdGhlIFwiZ3JvdW5kLXN0YXRlXCIgKHJlbW90ZSlcbiAqIGRvY3VtZW50cy5cbiAqXG4gKiBMb2NhbERvY3VtZW50cyBhcmUgcmUtY2FsY3VsYXRlZCBpZiB0aGVyZSBhcmUgcmVtYWluaW5nIG11dGF0aW9ucyBpbiB0aGVcbiAqIHF1ZXVlLlxuICovXG5hc3luYyBmdW5jdGlvbiBybyh0LCBlLCBuLCBzKSB7XG4gICAgY29uc3QgaSA9IEsodCk7XG4gICAgbGV0IHIgPSBHbigpLCBvID0gRm4oKTtcbiAgICBmb3IgKGNvbnN0IHQgb2Ygbikge1xuICAgICAgICBjb25zdCBuID0gZS5saSh0Lm1ldGFkYXRhLm5hbWUpO1xuICAgICAgICB0LmRvY3VtZW50ICYmIChyID0gci5hZGQobikpO1xuICAgICAgICBjb25zdCBzID0gZS5maSh0KTtcbiAgICAgICAgcy5zZXRSZWFkVGltZShlLmRpKHQubWV0YWRhdGEucmVhZFRpbWUpKSwgbyA9IG8uaW5zZXJ0KG4sIHMpO1xuICAgIH1cbiAgICBjb25zdCBhID0gaS5vaS5uZXdDaGFuZ2VCdWZmZXIoe1xuICAgICAgICB0cmFja1JlbW92YWxzOiAhMFxuICAgIH0pLCB1ID0gYXdhaXQgWnIoaSwgZnVuY3Rpb24odCkge1xuICAgICAgICAvLyBJdCBpcyBPSyB0aGF0IHRoZSBwYXRoIHVzZWQgZm9yIHRoZSBxdWVyeSBpcyBub3QgdmFsaWQsIGJlY2F1c2UgdGhpcyB3aWxsXG4gICAgICAgIC8vIG5vdCBiZSByZWFkIGFuZCBxdWVyaWVkLlxuICAgICAgICByZXR1cm4gJGUoRGUoX3QuZnJvbVN0cmluZyhgX19idW5kbGVfXy9kb2NzLyR7dH1gKSkpO1xuICAgIH0ocykpO1xuICAgIC8vIEFsbG9jYXRlcyBhIHRhcmdldCB0byBob2xkIGFsbCBkb2N1bWVudCBrZXlzIGZyb20gdGhlIGJ1bmRsZSwgc3VjaCB0aGF0XG4gICAgLy8gdGhleSB3aWxsIG5vdCBnZXQgZ2FyYmFnZSBjb2xsZWN0ZWQgcmlnaHQgYXdheS5cbiAgICAgICAgcmV0dXJuIGkucGVyc2lzdGVuY2UucnVuVHJhbnNhY3Rpb24oXCJBcHBseSBidW5kbGUgZG9jdW1lbnRzXCIsIFwicmVhZHdyaXRlXCIsICh0ID0+IFlyKHQsIGEsIG8pLm5leHQoKGUgPT4gKGEuYXBwbHkodCksIFxuICAgIGUpKSkubmV4dCgoZSA9PiBpLmhzLnJlbW92ZU1hdGNoaW5nS2V5c0ZvclRhcmdldElkKHQsIHUudGFyZ2V0SWQpLm5leHQoKCgpID0+IGkuaHMuYWRkTWF0Y2hpbmdLZXlzKHQsIHIsIHUudGFyZ2V0SWQpKSkubmV4dCgoKCkgPT4gaS51aS5Lcyh0LCBlKSkpLm5leHQoKCgpID0+IGUpKSkpKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHByb21pc2Ugb2YgYSBib29sZWFuIHRvIGluZGljYXRlIGlmIHRoZSBnaXZlbiBidW5kbGUgaGFzIGFscmVhZHlcbiAqIGJlZW4gbG9hZGVkIGFuZCB0aGUgY3JlYXRlIHRpbWUgaXMgbmV3ZXIgdGhhbiB0aGUgY3VycmVudCBsb2FkaW5nIGJ1bmRsZS5cbiAqL1xuLyoqXG4gKiBTYXZlcyB0aGUgZ2l2ZW4gYE5hbWVkUXVlcnlgIHRvIGxvY2FsIHBlcnNpc3RlbmNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBvbyh0LCBlLCBuID0gR24oKSkge1xuICAgIC8vIEFsbG9jYXRlIGEgdGFyZ2V0IGZvciB0aGUgbmFtZWQgcXVlcnkgc3VjaCB0aGF0IGl0IGNhbiBiZSByZXN1bWVkXG4gICAgLy8gZnJvbSBhc3NvY2lhdGVkIHJlYWQgdGltZSBpZiB1c2VycyB1c2UgaXQgdG8gbGlzdGVuLlxuICAgIC8vIE5PVEU6IHRoaXMgYWxzbyBtZWFucyBpZiBubyBjb3JyZXNwb25kaW5nIHRhcmdldCBleGlzdHMsIHRoZSBuZXcgdGFyZ2V0XG4gICAgLy8gd2lsbCByZW1haW4gYWN0aXZlIGFuZCB3aWxsIG5vdCBnZXQgY29sbGVjdGVkLCB1bmxlc3MgdXNlcnMgaGFwcGVuIHRvXG4gICAgLy8gdW5saXN0ZW4gdGhlIHF1ZXJ5IHNvbWVob3cuXG4gICAgY29uc3QgcyA9IGF3YWl0IFpyKHQsICRlKGtpKGUuYnVuZGxlZFF1ZXJ5KSkpLCBpID0gSyh0KTtcbiAgICByZXR1cm4gaS5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIlNhdmUgbmFtZWQgcXVlcnlcIiwgXCJyZWFkd3JpdGVcIiwgKHQgPT4ge1xuICAgICAgICBjb25zdCByID0gdXMoZS5yZWFkVGltZSk7XG4gICAgICAgIC8vIFNpbXBseSBzYXZlIHRoZSBxdWVyeSBpdHNlbGYgaWYgaXQgaXMgb2xkZXIgdGhhbiB3aGF0IHRoZSBTREsgYWxyZWFkeVxuICAgICAgICAvLyBoYXMuXG4gICAgICAgICAgICAgICAgaWYgKHMuc25hcHNob3RWZXJzaW9uLmNvbXBhcmVUbyhyKSA+PSAwKSByZXR1cm4gaS5mcy5zYXZlTmFtZWRRdWVyeSh0LCBlKTtcbiAgICAgICAgLy8gVXBkYXRlIGV4aXN0aW5nIHRhcmdldCBkYXRhIGJlY2F1c2UgdGhlIHF1ZXJ5IGZyb20gdGhlIGJ1bmRsZSBpcyBuZXdlci5cbiAgICAgICAgICAgICAgICBjb25zdCBvID0gcy53aXRoUmVzdW1lVG9rZW4ocHQuRU1QVFlfQllURV9TVFJJTkcsIHIpO1xuICAgICAgICByZXR1cm4gaS5zaSA9IGkuc2kuaW5zZXJ0KG8udGFyZ2V0SWQsIG8pLCBpLmhzLnVwZGF0ZVRhcmdldERhdGEodCwgbykubmV4dCgoKCkgPT4gaS5ocy5yZW1vdmVNYXRjaGluZ0tleXNGb3JUYXJnZXRJZCh0LCBzLnRhcmdldElkKSkpLm5leHQoKCgpID0+IGkuaHMuYWRkTWF0Y2hpbmdLZXlzKHQsIG4sIHMudGFyZ2V0SWQpKSkubmV4dCgoKCkgPT4gaS5mcy5zYXZlTmFtZWRRdWVyeSh0LCBlKSkpO1xuICAgIH0pKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gY2xhc3MgYW8ge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5NID0gdCwgdGhpcy5faSA9IG5ldyBNYXAsIHRoaXMud2kgPSBuZXcgTWFwO1xuICAgIH1cbiAgICBnZXRCdW5kbGVNZXRhZGF0YSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB1aS5yZXNvbHZlKHRoaXMuX2kuZ2V0KGUpKTtcbiAgICB9XG4gICAgc2F2ZUJ1bmRsZU1ldGFkYXRhKHQsIGUpIHtcbiAgICAgICAgLyoqIERlY29kZXMgYSBCdW5kbGVNZXRhZGF0YSBwcm90byBpbnRvIGEgQnVuZGxlTWV0YWRhdGEgb2JqZWN0LiAqL1xuICAgICAgICB2YXIgbjtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2kuc2V0KGUuaWQsIHtcbiAgICAgICAgICAgIGlkOiAobiA9IGUpLmlkLFxuICAgICAgICAgICAgdmVyc2lvbjogbi52ZXJzaW9uLFxuICAgICAgICAgICAgY3JlYXRlVGltZTogdXMobi5jcmVhdGVUaW1lKVxuICAgICAgICB9KSwgdWkucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBnZXROYW1lZFF1ZXJ5KHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHVpLnJlc29sdmUodGhpcy53aS5nZXQoZSkpO1xuICAgIH1cbiAgICBzYXZlTmFtZWRRdWVyeSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndpLnNldChlLm5hbWUsIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogdC5uYW1lLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiBraSh0LmJ1bmRsZWRRdWVyeSksXG4gICAgICAgICAgICAgICAgcmVhZFRpbWU6IHVzKHQucmVhZFRpbWUpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KGUpKSwgdWkucmVzb2x2ZSgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQW4gaW4tbWVtb3J5IGltcGxlbWVudGF0aW9uIG9mIERvY3VtZW50T3ZlcmxheUNhY2hlLlxuICovIGNsYXNzIHVvIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy8gQSBtYXAgc29ydGVkIGJ5IERvY3VtZW50S2V5LCB3aG9zZSB2YWx1ZSBpcyBhIHBhaXIgb2YgdGhlIGxhcmdlc3QgYmF0Y2ggaWRcbiAgICAgICAgLy8gZm9yIHRoZSBvdmVybGF5IGFuZCB0aGUgb3ZlcmxheSBpdHNlbGYuXG4gICAgICAgIHRoaXMub3ZlcmxheXMgPSBuZXcgQ24oeHQuY29tcGFyYXRvciksIHRoaXMubWkgPSBuZXcgTWFwO1xuICAgIH1cbiAgICBnZXRPdmVybGF5KHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHVpLnJlc29sdmUodGhpcy5vdmVybGF5cy5nZXQoZSkpO1xuICAgIH1cbiAgICBzYXZlT3ZlcmxheXModCwgZSwgbikge1xuICAgICAgICByZXR1cm4gbi5mb3JFYWNoKCgobiwgcykgPT4ge1xuICAgICAgICAgICAgdGhpcy5YdCh0LCBlLCBzKTtcbiAgICAgICAgfSkpLCB1aS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIHJlbW92ZU92ZXJsYXlzRm9yQmF0Y2hJZCh0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSB0aGlzLm1pLmdldChuKTtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gcyAmJiAocy5mb3JFYWNoKCh0ID0+IHRoaXMub3ZlcmxheXMgPSB0aGlzLm92ZXJsYXlzLnJlbW92ZSh0KSkpLCBcbiAgICAgICAgdGhpcy5taS5kZWxldGUobikpLCB1aS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGdldE92ZXJsYXlzRm9yQ29sbGVjdGlvbih0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSBxbigpLCBpID0gZS5sZW5ndGggKyAxLCByID0gbmV3IHh0KGUuY2hpbGQoXCJcIikpLCBvID0gdGhpcy5vdmVybGF5cy5nZXRJdGVyYXRvckZyb20ocik7XG4gICAgICAgIGZvciAoO28uaGFzTmV4dCgpOyApIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBvLmdldE5leHQoKS52YWx1ZSwgciA9IHQuZ2V0S2V5KCk7XG4gICAgICAgICAgICBpZiAoIWUuaXNQcmVmaXhPZihyLnBhdGgpKSBicmVhaztcbiAgICAgICAgICAgIC8vIERvY3VtZW50cyBmcm9tIHN1Yi1jb2xsZWN0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgci5wYXRoLmxlbmd0aCA9PT0gaSAmJiAodC5sYXJnZXN0QmF0Y2hJZCA+IG4gJiYgcy5zZXQodC5nZXRLZXkoKSwgdCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1aS5yZXNvbHZlKHMpO1xuICAgIH1cbiAgICBnZXRPdmVybGF5c0ZvckNvbGxlY3Rpb25Hcm91cCh0LCBlLCBuLCBzKSB7XG4gICAgICAgIGxldCBpID0gbmV3IENuKCgodCwgZSkgPT4gdCAtIGUpKTtcbiAgICAgICAgY29uc3QgciA9IHRoaXMub3ZlcmxheXMuZ2V0SXRlcmF0b3IoKTtcbiAgICAgICAgZm9yICg7ci5oYXNOZXh0KCk7ICkge1xuICAgICAgICAgICAgY29uc3QgdCA9IHIuZ2V0TmV4dCgpLnZhbHVlO1xuICAgICAgICAgICAgaWYgKHQuZ2V0S2V5KCkuZ2V0Q29sbGVjdGlvbkdyb3VwKCkgPT09IGUgJiYgdC5sYXJnZXN0QmF0Y2hJZCA+IG4pIHtcbiAgICAgICAgICAgICAgICBsZXQgZSA9IGkuZ2V0KHQubGFyZ2VzdEJhdGNoSWQpO1xuICAgICAgICAgICAgICAgIG51bGwgPT09IGUgJiYgKGUgPSBxbigpLCBpID0gaS5pbnNlcnQodC5sYXJnZXN0QmF0Y2hJZCwgZSkpLCBlLnNldCh0LmdldEtleSgpLCB0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvID0gcW4oKSwgYSA9IGkuZ2V0SXRlcmF0b3IoKTtcbiAgICAgICAgZm9yICg7YS5oYXNOZXh0KCk7ICkge1xuICAgICAgICAgICAgaWYgKGEuZ2V0TmV4dCgpLnZhbHVlLmZvckVhY2goKCh0LCBlKSA9PiBvLnNldCh0LCBlKSkpLCBvLnNpemUoKSA+PSBzKSBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdWkucmVzb2x2ZShvKTtcbiAgICB9XG4gICAgWHQodCwgZSwgbikge1xuICAgICAgICBpZiAobnVsbCA9PT0gbikgcmV0dXJuO1xuICAgICAgICAvLyBSZW1vdmUgdGhlIGFzc29jaWF0aW9uIG9mIHRoZSBvdmVybGF5IHRvIGl0cyBiYXRjaCBpZC5cbiAgICAgICAgICAgICAgICBjb25zdCBzID0gdGhpcy5vdmVybGF5cy5nZXQobi5rZXkpO1xuICAgICAgICBpZiAobnVsbCAhPT0gcykge1xuICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMubWkuZ2V0KHMubGFyZ2VzdEJhdGNoSWQpLmRlbGV0ZShuLmtleSk7XG4gICAgICAgICAgICB0aGlzLm1pLnNldChzLmxhcmdlc3RCYXRjaElkLCB0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm92ZXJsYXlzID0gdGhpcy5vdmVybGF5cy5pbnNlcnQobi5rZXksIG5ldyBFaShlLCBuKSk7XG4gICAgICAgIC8vIENyZWF0ZSB0aGUgYXNzb2NpYXRpb24gb2YgdGhpcyBvdmVybGF5IHRvIHRoZSBnaXZlbiBsYXJnZXN0QmF0Y2hJZC5cbiAgICAgICAgbGV0IGkgPSB0aGlzLm1pLmdldChlKTtcbiAgICAgICAgdm9pZCAwID09PSBpICYmIChpID0gR24oKSwgdGhpcy5taS5zZXQoZSwgaSkpLCB0aGlzLm1pLnNldChlLCBpLmFkZChuLmtleSkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHJlZmVyZW5jZXMgdG8gYSBkb2N1bWVudCBmcm9tIHNvbWUga2luZCBvZiBudW1iZXJlZCBlbnRpdHlcbiAqIChlaXRoZXIgYSB0YXJnZXQgSUQgb3IgYmF0Y2ggSUQpLiBBcyByZWZlcmVuY2VzIGFyZSBhZGRlZCB0byBvciByZW1vdmVkIGZyb21cbiAqIHRoZSBzZXQgY29ycmVzcG9uZGluZyBldmVudHMgYXJlIGVtaXR0ZWQgdG8gYSByZWdpc3RlcmVkIGdhcmJhZ2UgY29sbGVjdG9yLlxuICpcbiAqIEVhY2ggcmVmZXJlbmNlIGlzIHJlcHJlc2VudGVkIGJ5IGEgRG9jdW1lbnRSZWZlcmVuY2Ugb2JqZWN0LiBFYWNoIG9mIHRoZW1cbiAqIGNvbnRhaW5zIGVub3VnaCBpbmZvcm1hdGlvbiB0byB1bmlxdWVseSBpZGVudGlmeSB0aGUgcmVmZXJlbmNlLiBUaGV5IGFyZSBhbGxcbiAqIHN0b3JlZCBwcmltYXJpbHkgaW4gYSBzZXQgc29ydGVkIGJ5IGtleS4gQSBkb2N1bWVudCBpcyBjb25zaWRlcmVkIGdhcmJhZ2UgaWZcbiAqIHRoZXJlJ3Mgbm8gcmVmZXJlbmNlcyBpbiB0aGF0IHNldCAodGhpcyBjYW4gYmUgZWZmaWNpZW50bHkgY2hlY2tlZCB0aGFua3MgdG9cbiAqIHNvcnRpbmcgYnkga2V5KS5cbiAqXG4gKiBSZWZlcmVuY2VTZXQgYWxzbyBrZWVwcyBhIHNlY29uZGFyeSBzZXQgdGhhdCBjb250YWlucyByZWZlcmVuY2VzIHNvcnRlZCBieVxuICogSURzLiBUaGlzIG9uZSBpcyB1c2VkIHRvIGVmZmljaWVudGx5IGltcGxlbWVudCByZW1vdmFsIG9mIGFsbCByZWZlcmVuY2VzIGJ5XG4gKiBzb21lIHRhcmdldCBJRC5cbiAqLyBjbGFzcyBjbyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vIEEgc2V0IG9mIG91dHN0YW5kaW5nIHJlZmVyZW5jZXMgdG8gYSBkb2N1bWVudCBzb3J0ZWQgYnkga2V5LlxuICAgICAgICB0aGlzLmdpID0gbmV3IGtuKGhvLnlpKSwgXG4gICAgICAgIC8vIEEgc2V0IG9mIG91dHN0YW5kaW5nIHJlZmVyZW5jZXMgdG8gYSBkb2N1bWVudCBzb3J0ZWQgYnkgdGFyZ2V0IGlkLlxuICAgICAgICB0aGlzLnBpID0gbmV3IGtuKGhvLklpKTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVmZXJlbmNlIHNldCBjb250YWlucyBubyByZWZlcmVuY2VzLiAqLyAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5naS5pc0VtcHR5KCk7XG4gICAgfVxuICAgIC8qKiBBZGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBnaXZlbiBkb2N1bWVudCBrZXkgZm9yIHRoZSBnaXZlbiBJRC4gKi8gICAgYWRkUmVmZXJlbmNlKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IG5ldyBobyh0LCBlKTtcbiAgICAgICAgdGhpcy5naSA9IHRoaXMuZ2kuYWRkKG4pLCB0aGlzLnBpID0gdGhpcy5waS5hZGQobik7XG4gICAgfVxuICAgIC8qKiBBZGQgcmVmZXJlbmNlcyB0byB0aGUgZ2l2ZW4gZG9jdW1lbnQga2V5cyBmb3IgdGhlIGdpdmVuIElELiAqLyAgICBUaSh0LCBlKSB7XG4gICAgICAgIHQuZm9yRWFjaCgodCA9PiB0aGlzLmFkZFJlZmVyZW5jZSh0LCBlKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgcmVmZXJlbmNlIHRvIHRoZSBnaXZlbiBkb2N1bWVudCBrZXkgZm9yIHRoZSBnaXZlblxuICAgICAqIElELlxuICAgICAqLyAgICByZW1vdmVSZWZlcmVuY2UodCwgZSkge1xuICAgICAgICB0aGlzLkVpKG5ldyBobyh0LCBlKSk7XG4gICAgfVxuICAgIEFpKHQsIGUpIHtcbiAgICAgICAgdC5mb3JFYWNoKCh0ID0+IHRoaXMucmVtb3ZlUmVmZXJlbmNlKHQsIGUpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFycyBhbGwgcmVmZXJlbmNlcyB3aXRoIGEgZ2l2ZW4gSUQuIENhbGxzIHJlbW92ZVJlZigpIGZvciBlYWNoIGtleVxuICAgICAqIHJlbW92ZWQuXG4gICAgICovICAgIFJpKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IG5ldyB4dChuZXcgX3QoW10pKSwgbiA9IG5ldyBobyhlLCB0KSwgcyA9IG5ldyBobyhlLCB0ICsgMSksIGkgPSBbXTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGkuZm9yRWFjaEluUmFuZ2UoWyBuLCBzIF0sICh0ID0+IHtcbiAgICAgICAgICAgIHRoaXMuRWkodCksIGkucHVzaCh0LmtleSk7XG4gICAgICAgIH0pKSwgaTtcbiAgICB9XG4gICAgYmkoKSB7XG4gICAgICAgIHRoaXMuZ2kuZm9yRWFjaCgodCA9PiB0aGlzLkVpKHQpKSk7XG4gICAgfVxuICAgIEVpKHQpIHtcbiAgICAgICAgdGhpcy5naSA9IHRoaXMuZ2kuZGVsZXRlKHQpLCB0aGlzLnBpID0gdGhpcy5waS5kZWxldGUodCk7XG4gICAgfVxuICAgIFBpKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IG5ldyB4dChuZXcgX3QoW10pKSwgbiA9IG5ldyBobyhlLCB0KSwgcyA9IG5ldyBobyhlLCB0ICsgMSk7XG4gICAgICAgIGxldCBpID0gR24oKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGkuZm9yRWFjaEluUmFuZ2UoWyBuLCBzIF0sICh0ID0+IHtcbiAgICAgICAgICAgIGkgPSBpLmFkZCh0LmtleSk7XG4gICAgICAgIH0pKSwgaTtcbiAgICB9XG4gICAgY29udGFpbnNLZXkodCkge1xuICAgICAgICBjb25zdCBlID0gbmV3IGhvKHQsIDApLCBuID0gdGhpcy5naS5maXJzdEFmdGVyT3JFcXVhbChlKTtcbiAgICAgICAgcmV0dXJuIG51bGwgIT09IG4gJiYgdC5pc0VxdWFsKG4ua2V5KTtcbiAgICB9XG59XG5cbmNsYXNzIGhvIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMua2V5ID0gdCwgdGhpcy5WaSA9IGU7XG4gICAgfVxuICAgIC8qKiBDb21wYXJlIGJ5IGtleSB0aGVuIGJ5IElEICovICAgIHN0YXRpYyB5aSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB4dC5jb21wYXJhdG9yKHQua2V5LCBlLmtleSkgfHwgcnQodC5WaSwgZS5WaSk7XG4gICAgfVxuICAgIC8qKiBDb21wYXJlIGJ5IElEIHRoZW4gYnkga2V5ICovICAgIHN0YXRpYyBJaSh0LCBlKSB7XG4gICAgICAgIHJldHVybiBydCh0LlZpLCBlLlZpKSB8fCB4dC5jb21wYXJhdG9yKHQua2V5LCBlLmtleSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjbGFzcyBsbyB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLmluZGV4TWFuYWdlciA9IHQsIHRoaXMucmVmZXJlbmNlRGVsZWdhdGUgPSBlLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBzZXQgb2YgYWxsIG11dGF0aW9ucyB0aGF0IGhhdmUgYmVlbiBzZW50IGJ1dCBub3QgeWV0IGJlZW4gYXBwbGllZCB0b1xuICAgICAgICAgKiB0aGUgYmFja2VuZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuRnMgPSBbXSwgXG4gICAgICAgIC8qKiBOZXh0IHZhbHVlIHRvIHVzZSB3aGVuIGFzc2lnbmluZyBzZXF1ZW50aWFsIElEcyB0byBlYWNoIG11dGF0aW9uIGJhdGNoLiAqL1xuICAgICAgICB0aGlzLnZpID0gMSwgXG4gICAgICAgIC8qKiBBbiBvcmRlcmVkIG1hcHBpbmcgYmV0d2VlbiBkb2N1bWVudHMgYW5kIHRoZSBtdXRhdGlvbnMgYmF0Y2ggSURzLiAqL1xuICAgICAgICB0aGlzLlNpID0gbmV3IGtuKGhvLnlpKTtcbiAgICB9XG4gICAgY2hlY2tFbXB0eSh0KSB7XG4gICAgICAgIHJldHVybiB1aS5yZXNvbHZlKDAgPT09IHRoaXMuRnMubGVuZ3RoKTtcbiAgICB9XG4gICAgYWRkTXV0YXRpb25CYXRjaCh0LCBlLCBuLCBzKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLnZpO1xuICAgICAgICB0aGlzLnZpKyssIHRoaXMuRnMubGVuZ3RoID4gMCAmJiB0aGlzLkZzW3RoaXMuRnMubGVuZ3RoIC0gMV07XG4gICAgICAgIGNvbnN0IHIgPSBuZXcgSWkoaSwgZSwgbiwgcyk7XG4gICAgICAgIHRoaXMuRnMucHVzaChyKTtcbiAgICAgICAgLy8gVHJhY2sgcmVmZXJlbmNlcyBieSBkb2N1bWVudCBrZXkgYW5kIGluZGV4IGNvbGxlY3Rpb24gcGFyZW50cy5cbiAgICAgICAgZm9yIChjb25zdCBlIG9mIHMpIHRoaXMuU2kgPSB0aGlzLlNpLmFkZChuZXcgaG8oZS5rZXksIGkpKSwgdGhpcy5pbmRleE1hbmFnZXIuYWRkVG9Db2xsZWN0aW9uUGFyZW50SW5kZXgodCwgZS5rZXkucGF0aC5wb3BMYXN0KCkpO1xuICAgICAgICByZXR1cm4gdWkucmVzb2x2ZShyKTtcbiAgICB9XG4gICAgbG9va3VwTXV0YXRpb25CYXRjaCh0LCBlKSB7XG4gICAgICAgIHJldHVybiB1aS5yZXNvbHZlKHRoaXMuRGkoZSkpO1xuICAgIH1cbiAgICBnZXROZXh0TXV0YXRpb25CYXRjaEFmdGVyQmF0Y2hJZCh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBlICsgMSwgcyA9IHRoaXMuQ2kobiksIGkgPSBzIDwgMCA/IDAgOiBzO1xuICAgICAgICAvLyBUaGUgcmVxdWVzdGVkIGJhdGNoSWQgbWF5IHN0aWxsIGJlIG91dCBvZiByYW5nZSBzbyBub3JtYWxpemUgaXQgdG8gdGhlXG4gICAgICAgIC8vIHN0YXJ0IG9mIHRoZSBxdWV1ZS5cbiAgICAgICAgICAgICAgICByZXR1cm4gdWkucmVzb2x2ZSh0aGlzLkZzLmxlbmd0aCA+IGkgPyB0aGlzLkZzW2ldIDogbnVsbCk7XG4gICAgfVxuICAgIGdldEhpZ2hlc3RVbmFja25vd2xlZGdlZEJhdGNoSWQoKSB7XG4gICAgICAgIHJldHVybiB1aS5yZXNvbHZlKDAgPT09IHRoaXMuRnMubGVuZ3RoID8gLTEgOiB0aGlzLnZpIC0gMSk7XG4gICAgfVxuICAgIGdldEFsbE11dGF0aW9uQmF0Y2hlcyh0KSB7XG4gICAgICAgIHJldHVybiB1aS5yZXNvbHZlKHRoaXMuRnMuc2xpY2UoKSk7XG4gICAgfVxuICAgIGdldEFsbE11dGF0aW9uQmF0Y2hlc0FmZmVjdGluZ0RvY3VtZW50S2V5KHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IG5ldyBobyhlLCAwKSwgcyA9IG5ldyBobyhlLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpLCBpID0gW107XG4gICAgICAgIHJldHVybiB0aGlzLlNpLmZvckVhY2hJblJhbmdlKFsgbiwgcyBdLCAodCA9PiB7XG4gICAgICAgICAgICBjb25zdCBlID0gdGhpcy5EaSh0LlZpKTtcbiAgICAgICAgICAgIGkucHVzaChlKTtcbiAgICAgICAgfSkpLCB1aS5yZXNvbHZlKGkpO1xuICAgIH1cbiAgICBnZXRBbGxNdXRhdGlvbkJhdGNoZXNBZmZlY3RpbmdEb2N1bWVudEtleXModCwgZSkge1xuICAgICAgICBsZXQgbiA9IG5ldyBrbihydCk7XG4gICAgICAgIHJldHVybiBlLmZvckVhY2goKHQgPT4ge1xuICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBobyh0LCAwKSwgcyA9IG5ldyBobyh0LCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuICAgICAgICAgICAgdGhpcy5TaS5mb3JFYWNoSW5SYW5nZShbIGUsIHMgXSwgKHQgPT4ge1xuICAgICAgICAgICAgICAgIG4gPSBuLmFkZCh0LlZpKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSkpLCB1aS5yZXNvbHZlKHRoaXMueGkobikpO1xuICAgIH1cbiAgICBnZXRBbGxNdXRhdGlvbkJhdGNoZXNBZmZlY3RpbmdRdWVyeSh0LCBlKSB7XG4gICAgICAgIC8vIFVzZSB0aGUgcXVlcnkgcGF0aCBhcyBhIHByZWZpeCBmb3IgdGVzdGluZyBpZiBhIGRvY3VtZW50IG1hdGNoZXMgdGhlXG4gICAgICAgIC8vIHF1ZXJ5LlxuICAgICAgICBjb25zdCBuID0gZS5wYXRoLCBzID0gbi5sZW5ndGggKyAxO1xuICAgICAgICAvLyBDb25zdHJ1Y3QgYSBkb2N1bWVudCByZWZlcmVuY2UgZm9yIGFjdHVhbGx5IHNjYW5uaW5nIHRoZSBpbmRleC4gVW5saWtlXG4gICAgICAgIC8vIHRoZSBwcmVmaXggdGhlIGRvY3VtZW50IGtleSBpbiB0aGlzIHJlZmVyZW5jZSBtdXN0IGhhdmUgYW4gZXZlbiBudW1iZXIgb2ZcbiAgICAgICAgLy8gc2VnbWVudHMuIFRoZSBlbXB0eSBzZWdtZW50IGNhbiBiZSB1c2VkIGEgc3VmZml4IG9mIHRoZSBxdWVyeSBwYXRoXG4gICAgICAgIC8vIGJlY2F1c2UgaXQgcHJlY2VkZXMgYWxsIG90aGVyIHNlZ21lbnRzIGluIGFuIG9yZGVyZWQgdHJhdmVyc2FsLlxuICAgICAgICBsZXQgaSA9IG47XG4gICAgICAgIHh0LmlzRG9jdW1lbnRLZXkoaSkgfHwgKGkgPSBpLmNoaWxkKFwiXCIpKTtcbiAgICAgICAgY29uc3QgciA9IG5ldyBobyhuZXcgeHQoaSksIDApO1xuICAgICAgICAvLyBGaW5kIHVuaXF1ZSBiYXRjaElEcyByZWZlcmVuY2VkIGJ5IGFsbCBkb2N1bWVudHMgcG90ZW50aWFsbHkgbWF0Y2hpbmcgdGhlXG4gICAgICAgIC8vIHF1ZXJ5LlxuICAgICAgICAgICAgICAgIGxldCBvID0gbmV3IGtuKHJ0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuU2kuZm9yRWFjaFdoaWxlKCh0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0LmtleS5wYXRoO1xuICAgICAgICAgICAgcmV0dXJuICEhbi5pc1ByZWZpeE9mKGUpICYmIChcbiAgICAgICAgICAgIC8vIFJvd3Mgd2l0aCBkb2N1bWVudCBrZXlzIG1vcmUgdGhhbiBvbmUgc2VnbWVudCBsb25nZXIgdGhhbiB0aGUgcXVlcnlcbiAgICAgICAgICAgIC8vIHBhdGggY2FuJ3QgYmUgbWF0Y2hlcy4gRm9yIGV4YW1wbGUsIGEgcXVlcnkgb24gJ3Jvb21zJyBjYW4ndCBtYXRjaFxuICAgICAgICAgICAgLy8gdGhlIGRvY3VtZW50IC9yb29tcy9hYmMvbWVzc2FnZXMveHl4LlxuICAgICAgICAgICAgLy8gVE9ETyhtY2cpOiB3ZSdsbCBuZWVkIGEgZGlmZmVyZW50IHNjYW5uZXIgd2hlbiB3ZSBpbXBsZW1lbnRcbiAgICAgICAgICAgIC8vIGFuY2VzdG9yIHF1ZXJpZXMuXG4gICAgICAgICAgICBlLmxlbmd0aCA9PT0gcyAmJiAobyA9IG8uYWRkKHQuVmkpKSwgITApO1xuICAgICAgICB9KSwgciksIHVpLnJlc29sdmUodGhpcy54aShvKSk7XG4gICAgfVxuICAgIHhpKHQpIHtcbiAgICAgICAgLy8gQ29uc3RydWN0IGFuIGFycmF5IG9mIG1hdGNoaW5nIGJhdGNoZXMsIHNvcnRlZCBieSBiYXRjaElEIHRvIGVuc3VyZSB0aGF0XG4gICAgICAgIC8vIG11bHRpcGxlIG11dGF0aW9ucyBhZmZlY3RpbmcgdGhlIHNhbWUgZG9jdW1lbnQga2V5IGFyZSBhcHBsaWVkIGluIG9yZGVyLlxuICAgICAgICBjb25zdCBlID0gW107XG4gICAgICAgIHJldHVybiB0LmZvckVhY2goKHQgPT4ge1xuICAgICAgICAgICAgY29uc3QgbiA9IHRoaXMuRGkodCk7XG4gICAgICAgICAgICBudWxsICE9PSBuICYmIGUucHVzaChuKTtcbiAgICAgICAgfSkpLCBlO1xuICAgIH1cbiAgICByZW1vdmVNdXRhdGlvbkJhdGNoKHQsIGUpIHtcbiAgICAgICAgcSgwID09PSB0aGlzLk5pKGUuYmF0Y2hJZCwgXCJyZW1vdmVkXCIpKSwgdGhpcy5Gcy5zaGlmdCgpO1xuICAgICAgICBsZXQgbiA9IHRoaXMuU2k7XG4gICAgICAgIHJldHVybiB1aS5mb3JFYWNoKGUubXV0YXRpb25zLCAocyA9PiB7XG4gICAgICAgICAgICBjb25zdCBpID0gbmV3IGhvKHMua2V5LCBlLmJhdGNoSWQpO1xuICAgICAgICAgICAgcmV0dXJuIG4gPSBuLmRlbGV0ZShpKSwgdGhpcy5yZWZlcmVuY2VEZWxlZ2F0ZS5tYXJrUG90ZW50aWFsbHlPcnBoYW5lZCh0LCBzLmtleSk7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLlNpID0gbjtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBkbih0KSB7XG4gICAgICAgIC8vIE5vLW9wIHNpbmNlIHRoZSBtZW1vcnkgbXV0YXRpb24gcXVldWUgZG9lcyBub3QgbWFpbnRhaW4gYSBzZXBhcmF0ZSBjYWNoZS5cbiAgICB9XG4gICAgY29udGFpbnNLZXkodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gbmV3IGhvKGUsIDApLCBzID0gdGhpcy5TaS5maXJzdEFmdGVyT3JFcXVhbChuKTtcbiAgICAgICAgcmV0dXJuIHVpLnJlc29sdmUoZS5pc0VxdWFsKHMgJiYgcy5rZXkpKTtcbiAgICB9XG4gICAgcGVyZm9ybUNvbnNpc3RlbmN5Q2hlY2sodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5Gcy5sZW5ndGgsIHVpLnJlc29sdmUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBiYXRjaElkIGluIHRoZSBtdXRhdGlvbiBxdWV1ZSBhbmQgYXNzZXJ0cyB0aGF0XG4gICAgICogdGhlIHJlc3VsdGluZyBpbmRleCBpcyB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGUgcXVldWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYmF0Y2hJZCAtIFRoZSBiYXRjaElkIHRvIHNlYXJjaCBmb3JcbiAgICAgKiBAcGFyYW0gYWN0aW9uIC0gQSBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoZSBjYWxsZXIgaXMgZG9pbmcsIHBocmFzZWQgaW4gcGFzc2l2ZVxuICAgICAqIGZvcm0gKGUuZy4gXCJhY2tub3dsZWRnZWRcIiBpbiBhIHJvdXRpbmUgdGhhdCBhY2tub3dsZWRnZXMgYmF0Y2hlcykuXG4gICAgICovICAgIE5pKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQ2kodCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSBpbmRleCBvZiB0aGUgZ2l2ZW4gYmF0Y2hJZCBpbiB0aGUgbXV0YXRpb24gcXVldWUuIFRoaXMgb3BlcmF0aW9uXG4gICAgICogaXMgTygxKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBjb21wdXRlZCBpbmRleCBvZiB0aGUgYmF0Y2ggd2l0aCB0aGUgZ2l2ZW4gYmF0Y2hJZCwgYmFzZWQgb25cbiAgICAgKiB0aGUgc3RhdGUgb2YgdGhlIHF1ZXVlLiBOb3RlIHRoaXMgaW5kZXggY2FuIGJlIG5lZ2F0aXZlIGlmIHRoZSByZXF1ZXN0ZWRcbiAgICAgKiBiYXRjaElkIGhhcyBhbHJlYWR5IGJlZW4gcmVtdm9lZCBmcm9tIHRoZSBxdWV1ZSBvciBwYXN0IHRoZSBlbmQgb2YgdGhlXG4gICAgICogcXVldWUgaWYgdGhlIGJhdGNoSWQgaXMgbGFyZ2VyIHRoYW4gdGhlIGxhc3QgYWRkZWQgYmF0Y2guXG4gICAgICovICAgIENpKHQpIHtcbiAgICAgICAgaWYgKDAgPT09IHRoaXMuRnMubGVuZ3RoKSBcbiAgICAgICAgLy8gQXMgYW4gaW5kZXggdGhpcyBpcyBwYXN0IHRoZSBlbmQgb2YgdGhlIHF1ZXVlXG4gICAgICAgIHJldHVybiAwO1xuICAgICAgICAvLyBFeGFtaW5lIHRoZSBmcm9udCBvZiB0aGUgcXVldWUgdG8gZmlndXJlIG91dCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZVxuICAgICAgICAvLyBiYXRjaElkIGFuZCBpbmRleGVzIGluIHRoZSBhcnJheS4gTm90ZSB0aGF0IHNpbmNlIHRoZSBxdWV1ZSBpcyBvcmRlcmVkXG4gICAgICAgIC8vIGJ5IGJhdGNoSWQsIGlmIHRoZSBmaXJzdCBiYXRjaCBoYXMgYSBsYXJnZXIgYmF0Y2hJZCB0aGVuIHRoZSByZXF1ZXN0ZWRcbiAgICAgICAgLy8gYmF0Y2hJZCBkb2Vzbid0IGV4aXN0IGluIHRoZSBxdWV1ZS5cbiAgICAgICAgICAgICAgICByZXR1cm4gdCAtIHRoaXMuRnNbMF0uYmF0Y2hJZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSB2ZXJzaW9uIG9mIGxvb2t1cE11dGF0aW9uQmF0Y2ggdGhhdCBkb2Vzbid0IHJldHVybiBhIHByb21pc2UsIHRoaXMgbWFrZXNcbiAgICAgKiBvdGhlciBmdW5jdGlvbnMgdGhhdCB1c2VzIHRoaXMgY29kZSBlYXNpZXIgdG8gcmVhZCBhbmQgbW9yZSBlZmZpY2VudC5cbiAgICAgKi8gICAgRGkodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5DaSh0KTtcbiAgICAgICAgaWYgKGUgPCAwIHx8IGUgPj0gdGhpcy5Gcy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy5Gc1tlXTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFRoZSBtZW1vcnktb25seSBSZW1vdGVEb2N1bWVudENhY2hlIGZvciBJbmRleGVkRGIuIFRvIGNvbnN0cnVjdCwgaW52b2tlXG4gKiBgbmV3TWVtb3J5UmVtb3RlRG9jdW1lbnRDYWNoZSgpYC5cbiAqL1xuY2xhc3MgZm8ge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBzaXplciAtIFVzZWQgdG8gYXNzZXNzIHRoZSBzaXplIG9mIGEgZG9jdW1lbnQuIEZvciBlYWdlciBHQywgdGhpcyBpc1xuICAgICAqIGV4cGVjdGVkIHRvIGp1c3QgcmV0dXJuIDAgdG8gYXZvaWQgdW5uZWNlc3NhcmlseSBkb2luZyB0aGUgd29yayBvZlxuICAgICAqIGNhbGN1bGF0aW5nIHRoZSBzaXplLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5raSA9IHQsIFxuICAgICAgICAvKiogVW5kZXJseWluZyBjYWNoZSBvZiBkb2N1bWVudHMgYW5kIHRoZWlyIHJlYWQgdGltZXMuICovXG4gICAgICAgIHRoaXMuZG9jcyA9IG5ldyBDbih4dC5jb21wYXJhdG9yKSwgXG4gICAgICAgIC8qKiBTaXplIG9mIGFsbCBjYWNoZWQgZG9jdW1lbnRzLiAqL1xuICAgICAgICB0aGlzLnNpemUgPSAwO1xuICAgIH1cbiAgICBzZXRJbmRleE1hbmFnZXIodCkge1xuICAgICAgICB0aGlzLmluZGV4TWFuYWdlciA9IHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIHN1cHBsaWVkIGVudHJ5IHRvIHRoZSBjYWNoZSBhbmQgdXBkYXRlcyB0aGUgY2FjaGUgc2l6ZSBhcyBhcHByb3ByaWF0ZS5cbiAgICAgKlxuICAgICAqIEFsbCBjYWxscyBvZiBgYWRkRW50cnlgICBhcmUgcmVxdWlyZWQgdG8gZ28gdGhyb3VnaCB0aGUgUmVtb3RlRG9jdW1lbnRDaGFuZ2VCdWZmZXJcbiAgICAgKiByZXR1cm5lZCBieSBgbmV3Q2hhbmdlQnVmZmVyKClgLlxuICAgICAqLyAgICBhZGRFbnRyeSh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBlLmtleSwgcyA9IHRoaXMuZG9jcy5nZXQobiksIGkgPSBzID8gcy5zaXplIDogMCwgciA9IHRoaXMua2koZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmRvY3MgPSB0aGlzLmRvY3MuaW5zZXJ0KG4sIHtcbiAgICAgICAgICAgIGRvY3VtZW50OiBlLm11dGFibGVDb3B5KCksXG4gICAgICAgICAgICBzaXplOiByXG4gICAgICAgIH0pLCB0aGlzLnNpemUgKz0gciAtIGksIHRoaXMuaW5kZXhNYW5hZ2VyLmFkZFRvQ29sbGVjdGlvblBhcmVudEluZGV4KHQsIG4ucGF0aC5wb3BMYXN0KCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgZW50cnkgZnJvbSB0aGUgY2FjaGUgYW5kIHVwZGF0ZXMgdGhlIGNhY2hlIHNpemUgYXMgYXBwcm9wcmlhdGUuXG4gICAgICpcbiAgICAgKiBBbGwgY2FsbHMgb2YgYHJlbW92ZUVudHJ5YCBhcmUgcmVxdWlyZWQgdG8gZ28gdGhyb3VnaCB0aGUgUmVtb3RlRG9jdW1lbnRDaGFuZ2VCdWZmZXJcbiAgICAgKiByZXR1cm5lZCBieSBgbmV3Q2hhbmdlQnVmZmVyKClgLlxuICAgICAqLyAgICByZW1vdmVFbnRyeSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLmRvY3MuZ2V0KHQpO1xuICAgICAgICBlICYmICh0aGlzLmRvY3MgPSB0aGlzLmRvY3MucmVtb3ZlKHQpLCB0aGlzLnNpemUgLT0gZS5zaXplKTtcbiAgICB9XG4gICAgZ2V0RW50cnkodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gdGhpcy5kb2NzLmdldChlKTtcbiAgICAgICAgcmV0dXJuIHVpLnJlc29sdmUobiA/IG4uZG9jdW1lbnQubXV0YWJsZUNvcHkoKSA6IHRlLm5ld0ludmFsaWREb2N1bWVudChlKSk7XG4gICAgfVxuICAgIGdldEVudHJpZXModCwgZSkge1xuICAgICAgICBsZXQgbiA9IEZuKCk7XG4gICAgICAgIHJldHVybiBlLmZvckVhY2goKHQgPT4ge1xuICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMuZG9jcy5nZXQodCk7XG4gICAgICAgICAgICBuID0gbi5pbnNlcnQodCwgZSA/IGUuZG9jdW1lbnQubXV0YWJsZUNvcHkoKSA6IHRlLm5ld0ludmFsaWREb2N1bWVudCh0KSk7XG4gICAgICAgIH0pKSwgdWkucmVzb2x2ZShuKTtcbiAgICB9XG4gICAgZ2V0QWxsKHQsIGUsIG4pIHtcbiAgICAgICAgbGV0IHMgPSBGbigpO1xuICAgICAgICAvLyBEb2N1bWVudHMgYXJlIG9yZGVyZWQgYnkga2V5LCBzbyB3ZSBjYW4gdXNlIGEgcHJlZml4IHNjYW4gdG8gbmFycm93IGRvd25cbiAgICAgICAgLy8gdGhlIGRvY3VtZW50cyB3ZSBuZWVkIHRvIG1hdGNoIHRoZSBxdWVyeSBhZ2FpbnN0LlxuICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBuZXcgeHQoZS5jaGlsZChcIlwiKSksIHIgPSB0aGlzLmRvY3MuZ2V0SXRlcmF0b3JGcm9tKGkpO1xuICAgICAgICBmb3IgKDtyLmhhc05leHQoKTsgKSB7XG4gICAgICAgICAgICBjb25zdCB7a2V5OiB0LCB2YWx1ZToge2RvY3VtZW50OiBpfX0gPSByLmdldE5leHQoKTtcbiAgICAgICAgICAgIGlmICghZS5pc1ByZWZpeE9mKHQucGF0aCkpIGJyZWFrO1xuICAgICAgICAgICAgdC5wYXRoLmxlbmd0aCA+IGUubGVuZ3RoICsgMSB8fCAoaS5yZWFkVGltZS5jb21wYXJlVG8obikgPD0gMCB8fCAocyA9IHMuaW5zZXJ0KGkua2V5LCBpLm11dGFibGVDb3B5KCkpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVpLnJlc29sdmUocyk7XG4gICAgfVxuICAgIE1pKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHVpLmZvckVhY2godGhpcy5kb2NzLCAodCA9PiBlKHQpKSk7XG4gICAgfVxuICAgIG5ld0NoYW5nZUJ1ZmZlcih0KSB7XG4gICAgICAgIC8vIGB0cmFja1JlbW92YWxzYCBpcyBpZ25vcmVzIHNpbmNlIHRoZSBNZW1vcnlSZW1vdGVEb2N1bWVudENhY2hlIGtlZXBzXG4gICAgICAgIC8vIGEgc2VwYXJhdGUgY2hhbmdlbG9nIGFuZCBkb2VzIG5vdCBuZWVkIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHJlbW92YWxzLlxuICAgICAgICByZXR1cm4gbmV3IF9vKHRoaXMpO1xuICAgIH1cbiAgICBnZXRTaXplKHQpIHtcbiAgICAgICAgcmV0dXJuIHVpLnJlc29sdmUodGhpcy5zaXplKTtcbiAgICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBtZW1vcnktb25seSBSZW1vdGVEb2N1bWVudENhY2hlLlxuICpcbiAqIEBwYXJhbSBzaXplciAtIFVzZWQgdG8gYXNzZXNzIHRoZSBzaXplIG9mIGEgZG9jdW1lbnQuIEZvciBlYWdlciBHQywgdGhpcyBpc1xuICogZXhwZWN0ZWQgdG8ganVzdCByZXR1cm4gMCB0byBhdm9pZCB1bm5lY2Vzc2FyaWx5IGRvaW5nIHRoZSB3b3JrIG9mXG4gKiBjYWxjdWxhdGluZyB0aGUgc2l6ZS5cbiAqL1xuLyoqXG4gKiBIYW5kbGVzIHRoZSBkZXRhaWxzIG9mIGFkZGluZyBhbmQgdXBkYXRpbmcgZG9jdW1lbnRzIGluIHRoZSBNZW1vcnlSZW1vdGVEb2N1bWVudENhY2hlLlxuICovXG5jbGFzcyBfbyBleHRlbmRzIHZyIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMuVW4gPSB0O1xuICAgIH1cbiAgICBhcHBseUNoYW5nZXModCkge1xuICAgICAgICBjb25zdCBlID0gW107XG4gICAgICAgIHJldHVybiB0aGlzLmNoYW5nZXMuZm9yRWFjaCgoKG4sIHMpID0+IHtcbiAgICAgICAgICAgIHMuaXNWYWxpZERvY3VtZW50KCkgPyBlLnB1c2godGhpcy5Vbi5hZGRFbnRyeSh0LCBzKSkgOiB0aGlzLlVuLnJlbW92ZUVudHJ5KG4pO1xuICAgICAgICB9KSksIHVpLndhaXRGb3IoZSk7XG4gICAgfVxuICAgIGdldEZyb21DYWNoZSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLlVuLmdldEVudHJ5KHQsIGUpO1xuICAgIH1cbiAgICBnZXRBbGxGcm9tQ2FjaGUodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5Vbi5nZXRFbnRyaWVzKHQsIGUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gY2xhc3Mgd28ge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5wZXJzaXN0ZW5jZSA9IHQsIFxuICAgICAgICAvKipcbiAgICAgICAgICogTWFwcyBhIHRhcmdldCB0byB0aGUgZGF0YSBhYm91dCB0aGF0IHRhcmdldFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5PaSA9IG5ldyBEbigodCA9PiBjZSh0KSksIGxlKSwgXG4gICAgICAgIC8qKiBUaGUgbGFzdCByZWNlaXZlZCBzbmFwc2hvdCB2ZXJzaW9uLiAqL1xuICAgICAgICB0aGlzLmxhc3RSZW1vdGVTbmFwc2hvdFZlcnNpb24gPSBjdC5taW4oKSwgXG4gICAgICAgIC8qKiBUaGUgaGlnaGVzdCBudW1iZXJlZCB0YXJnZXQgSUQgZW5jb3VudGVyZWQuICovXG4gICAgICAgIHRoaXMuaGlnaGVzdFRhcmdldElkID0gMCwgXG4gICAgICAgIC8qKiBUaGUgaGlnaGVzdCBzZXF1ZW5jZSBudW1iZXIgZW5jb3VudGVyZWQuICovXG4gICAgICAgIHRoaXMuJGkgPSAwLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgb3JkZXJlZCBiaWRpcmVjdGlvbmFsIG1hcHBpbmcgYmV0d2VlbiBkb2N1bWVudHMgYW5kIHRoZSByZW1vdGUgdGFyZ2V0XG4gICAgICAgICAqIElEcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuRmkgPSBuZXcgY28sIHRoaXMudGFyZ2V0Q291bnQgPSAwLCB0aGlzLkJpID0gbXIubW4oKTtcbiAgICB9XG4gICAgZm9yRWFjaFRhcmdldCh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLk9pLmZvckVhY2goKCh0LCBuKSA9PiBlKG4pKSksIHVpLnJlc29sdmUoKTtcbiAgICB9XG4gICAgZ2V0TGFzdFJlbW90ZVNuYXBzaG90VmVyc2lvbih0KSB7XG4gICAgICAgIHJldHVybiB1aS5yZXNvbHZlKHRoaXMubGFzdFJlbW90ZVNuYXBzaG90VmVyc2lvbik7XG4gICAgfVxuICAgIGdldEhpZ2hlc3RTZXF1ZW5jZU51bWJlcih0KSB7XG4gICAgICAgIHJldHVybiB1aS5yZXNvbHZlKHRoaXMuJGkpO1xuICAgIH1cbiAgICBhbGxvY2F0ZVRhcmdldElkKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGlnaGVzdFRhcmdldElkID0gdGhpcy5CaS5uZXh0KCksIHVpLnJlc29sdmUodGhpcy5oaWdoZXN0VGFyZ2V0SWQpO1xuICAgIH1cbiAgICBzZXRUYXJnZXRzTWV0YWRhdGEodCwgZSwgbikge1xuICAgICAgICByZXR1cm4gbiAmJiAodGhpcy5sYXN0UmVtb3RlU25hcHNob3RWZXJzaW9uID0gbiksIGUgPiB0aGlzLiRpICYmICh0aGlzLiRpID0gZSksIFxuICAgICAgICB1aS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIEluKHQpIHtcbiAgICAgICAgdGhpcy5PaS5zZXQodC50YXJnZXQsIHQpO1xuICAgICAgICBjb25zdCBlID0gdC50YXJnZXRJZDtcbiAgICAgICAgZSA+IHRoaXMuaGlnaGVzdFRhcmdldElkICYmICh0aGlzLkJpID0gbmV3IG1yKGUpLCB0aGlzLmhpZ2hlc3RUYXJnZXRJZCA9IGUpLCB0LnNlcXVlbmNlTnVtYmVyID4gdGhpcy4kaSAmJiAodGhpcy4kaSA9IHQuc2VxdWVuY2VOdW1iZXIpO1xuICAgIH1cbiAgICBhZGRUYXJnZXREYXRhKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuSW4oZSksIHRoaXMudGFyZ2V0Q291bnQgKz0gMSwgdWkucmVzb2x2ZSgpO1xuICAgIH1cbiAgICB1cGRhdGVUYXJnZXREYXRhKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuSW4oZSksIHVpLnJlc29sdmUoKTtcbiAgICB9XG4gICAgcmVtb3ZlVGFyZ2V0RGF0YSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLk9pLmRlbGV0ZShlLnRhcmdldCksIHRoaXMuRmkuUmkoZS50YXJnZXRJZCksIHRoaXMudGFyZ2V0Q291bnQgLT0gMSwgXG4gICAgICAgIHVpLnJlc29sdmUoKTtcbiAgICB9XG4gICAgcmVtb3ZlVGFyZ2V0cyh0LCBlLCBuKSB7XG4gICAgICAgIGxldCBzID0gMDtcbiAgICAgICAgY29uc3QgaSA9IFtdO1xuICAgICAgICByZXR1cm4gdGhpcy5PaS5mb3JFYWNoKCgociwgbykgPT4ge1xuICAgICAgICAgICAgby5zZXF1ZW5jZU51bWJlciA8PSBlICYmIG51bGwgPT09IG4uZ2V0KG8udGFyZ2V0SWQpICYmICh0aGlzLk9pLmRlbGV0ZShyKSwgaS5wdXNoKHRoaXMucmVtb3ZlTWF0Y2hpbmdLZXlzRm9yVGFyZ2V0SWQodCwgby50YXJnZXRJZCkpLCBcbiAgICAgICAgICAgIHMrKyk7XG4gICAgICAgIH0pKSwgdWkud2FpdEZvcihpKS5uZXh0KCgoKSA9PiBzKSk7XG4gICAgfVxuICAgIGdldFRhcmdldENvdW50KHQpIHtcbiAgICAgICAgcmV0dXJuIHVpLnJlc29sdmUodGhpcy50YXJnZXRDb3VudCk7XG4gICAgfVxuICAgIGdldFRhcmdldERhdGEodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gdGhpcy5PaS5nZXQoZSkgfHwgbnVsbDtcbiAgICAgICAgcmV0dXJuIHVpLnJlc29sdmUobik7XG4gICAgfVxuICAgIGFkZE1hdGNoaW5nS2V5cyh0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkZpLlRpKGUsIG4pLCB1aS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIHJlbW92ZU1hdGNoaW5nS2V5cyh0LCBlLCBuKSB7XG4gICAgICAgIHRoaXMuRmkuQWkoZSwgbik7XG4gICAgICAgIGNvbnN0IHMgPSB0aGlzLnBlcnNpc3RlbmNlLnJlZmVyZW5jZURlbGVnYXRlLCBpID0gW107XG4gICAgICAgIHJldHVybiBzICYmIGUuZm9yRWFjaCgoZSA9PiB7XG4gICAgICAgICAgICBpLnB1c2gocy5tYXJrUG90ZW50aWFsbHlPcnBoYW5lZCh0LCBlKSk7XG4gICAgICAgIH0pKSwgdWkud2FpdEZvcihpKTtcbiAgICB9XG4gICAgcmVtb3ZlTWF0Y2hpbmdLZXlzRm9yVGFyZ2V0SWQodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5GaS5SaShlKSwgdWkucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBnZXRNYXRjaGluZ0tleXNGb3JUYXJnZXRJZCh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLkZpLlBpKGUpO1xuICAgICAgICByZXR1cm4gdWkucmVzb2x2ZShuKTtcbiAgICB9XG4gICAgY29udGFpbnNLZXkodCwgZSkge1xuICAgICAgICByZXR1cm4gdWkucmVzb2x2ZSh0aGlzLkZpLmNvbnRhaW5zS2V5KGUpKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEEgbWVtb3J5LWJhY2tlZCBpbnN0YW5jZSBvZiBQZXJzaXN0ZW5jZS4gRGF0YSBpcyBzdG9yZWQgb25seSBpbiBSQU0gYW5kXG4gKiBub3QgcGVyc2lzdGVkIGFjcm9zcyBzZXNzaW9ucy5cbiAqL1xuY2xhc3MgbW8ge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIGEgZmFjdG9yeSBmb3IgY3JlYXRpbmcgYSByZWZlcmVuY2UgZGVsZWdhdGUuIFRoaXNcbiAgICAgKiBhbGxvd3MgYm90aCB0aGUgZGVsZWdhdGUgYW5kIHRoaXMgaW5zdGFuY2UgdG8gaGF2ZSBzdHJvbmcgcmVmZXJlbmNlcyB0b1xuICAgICAqIGVhY2ggb3RoZXIgd2l0aG91dCBoYXZpbmcgbnVsbGFibGUgZmllbGRzIHRoYXQgd291bGQgdGhlbiBuZWVkIHRvIGJlXG4gICAgICogY2hlY2tlZCBvciBhc3NlcnRlZCBvbiBldmVyeSBhY2Nlc3MuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLkxpID0ge30sIHRoaXMub3ZlcmxheXMgPSB7fSwgdGhpcy5abiA9IG5ldyBudCgwKSwgdGhpcy50cyA9ICExLCB0aGlzLnRzID0gITAsIFxuICAgICAgICB0aGlzLnJlZmVyZW5jZURlbGVnYXRlID0gdCh0aGlzKSwgdGhpcy5ocyA9IG5ldyB3byh0aGlzKTtcbiAgICAgICAgdGhpcy5pbmRleE1hbmFnZXIgPSBuZXcgWmksIHRoaXMubHMgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGZvKHQpO1xuICAgICAgICB9KCh0ID0+IHRoaXMucmVmZXJlbmNlRGVsZWdhdGUucWkodCkpKSwgdGhpcy5NID0gbmV3IFJpKGUpLCB0aGlzLmZzID0gbmV3IGFvKHRoaXMuTSk7XG4gICAgfVxuICAgIHN0YXJ0KCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIHNodXRkb3duKCkge1xuICAgICAgICAvLyBObyBkdXJhYmxlIHN0YXRlIHRvIGVuc3VyZSBpcyBjbG9zZWQgb24gc2h1dGRvd24uXG4gICAgICAgIHJldHVybiB0aGlzLnRzID0gITEsIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBnZXQgc3RhcnRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHM7XG4gICAgfVxuICAgIHNldERhdGFiYXNlRGVsZXRlZExpc3RlbmVyKCkge1xuICAgICAgICAvLyBObyBvcC5cbiAgICB9XG4gICAgc2V0TmV0d29ya0VuYWJsZWQoKSB7XG4gICAgICAgIC8vIE5vIG9wLlxuICAgIH1cbiAgICBnZXRJbmRleE1hbmFnZXIodCkge1xuICAgICAgICAvLyBXZSBkbyBub3QgY3VycmVudGx5IHN1cHBvcnQgaW5kaWNlcyBmb3IgbWVtb3J5IHBlcnNpc3RlbmNlLCBzbyB3ZSBjYW5cbiAgICAgICAgLy8gcmV0dXJuIHRoZSBzYW1lIHNoYXJlZCBpbnN0YW5jZSBvZiB0aGUgbWVtb3J5IGluZGV4IG1hbmFnZXIuXG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4TWFuYWdlcjtcbiAgICB9XG4gICAgZ2V0RG9jdW1lbnRPdmVybGF5Q2FjaGUodCkge1xuICAgICAgICBsZXQgZSA9IHRoaXMub3ZlcmxheXNbdC50b0tleSgpXTtcbiAgICAgICAgcmV0dXJuIGUgfHwgKGUgPSBuZXcgdW8sIHRoaXMub3ZlcmxheXNbdC50b0tleSgpXSA9IGUpLCBlO1xuICAgIH1cbiAgICBnZXRNdXRhdGlvblF1ZXVlKHQsIGUpIHtcbiAgICAgICAgbGV0IG4gPSB0aGlzLkxpW3QudG9LZXkoKV07XG4gICAgICAgIHJldHVybiBuIHx8IChuID0gbmV3IGxvKGUsIHRoaXMucmVmZXJlbmNlRGVsZWdhdGUpLCB0aGlzLkxpW3QudG9LZXkoKV0gPSBuKSwgbjtcbiAgICB9XG4gICAgZ2V0VGFyZ2V0Q2FjaGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhzO1xuICAgIH1cbiAgICBnZXRSZW1vdGVEb2N1bWVudENhY2hlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5scztcbiAgICB9XG4gICAgZ2V0QnVuZGxlQ2FjaGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZzO1xuICAgIH1cbiAgICBydW5UcmFuc2FjdGlvbih0LCBlLCBuKSB7XG4gICAgICAgIE8oXCJNZW1vcnlQZXJzaXN0ZW5jZVwiLCBcIlN0YXJ0aW5nIHRyYW5zYWN0aW9uOlwiLCB0KTtcbiAgICAgICAgY29uc3QgcyA9IG5ldyBnbyh0aGlzLlpuLm5leHQoKSk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZURlbGVnYXRlLlVpKCksIG4ocykubmV4dCgodCA9PiB0aGlzLnJlZmVyZW5jZURlbGVnYXRlLktpKHMpLm5leHQoKCgpID0+IHQpKSkpLnRvUHJvbWlzZSgpLnRoZW4oKHQgPT4gKHMucmFpc2VPbkNvbW1pdHRlZEV2ZW50KCksIFxuICAgICAgICB0KSkpO1xuICAgIH1cbiAgICBHaSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB1aS5vcihPYmplY3QudmFsdWVzKHRoaXMuTGkpLm1hcCgobiA9PiAoKSA9PiBuLmNvbnRhaW5zS2V5KHQsIGUpKSkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBNZW1vcnkgcGVyc2lzdGVuY2UgaXMgbm90IGFjdHVhbGx5IHRyYW5zYWN0aW9uYWwsIGJ1dCBmdXR1cmUgaW1wbGVtZW50YXRpb25zXG4gKiBtYXkgaGF2ZSB0cmFuc2FjdGlvbi1zY29wZWQgc3RhdGUuXG4gKi8gY2xhc3MgZ28gZXh0ZW5kcyBhaSB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICBzdXBlcigpLCB0aGlzLmN1cnJlbnRTZXF1ZW5jZU51bWJlciA9IHQ7XG4gICAgfVxufVxuXG5jbGFzcyB5byB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlID0gdCwgXG4gICAgICAgIC8qKiBUcmFja3MgYWxsIGRvY3VtZW50cyB0aGF0IGFyZSBhY3RpdmUgaW4gUXVlcnkgdmlld3MuICovXG4gICAgICAgIHRoaXMuUWkgPSBuZXcgY28sIFxuICAgICAgICAvKiogVGhlIGxpc3Qgb2YgZG9jdW1lbnRzIHRoYXQgYXJlIHBvdGVudGlhbGx5IEdDZWQgYWZ0ZXIgZWFjaCB0cmFuc2FjdGlvbi4gKi9cbiAgICAgICAgdGhpcy5qaSA9IG51bGw7XG4gICAgfVxuICAgIHN0YXRpYyBXaSh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgeW8odCk7XG4gICAgfVxuICAgIGdldCB6aSgpIHtcbiAgICAgICAgaWYgKHRoaXMuamkpIHJldHVybiB0aGlzLmppO1xuICAgICAgICB0aHJvdyBMKCk7XG4gICAgfVxuICAgIGFkZFJlZmVyZW5jZSh0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLlFpLmFkZFJlZmVyZW5jZShuLCBlKSwgdGhpcy56aS5kZWxldGUobi50b1N0cmluZygpKSwgdWkucmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZW1vdmVSZWZlcmVuY2UodCwgZSwgbikge1xuICAgICAgICByZXR1cm4gdGhpcy5RaS5yZW1vdmVSZWZlcmVuY2UobiwgZSksIHRoaXMuemkuYWRkKG4udG9TdHJpbmcoKSksIHVpLnJlc29sdmUoKTtcbiAgICB9XG4gICAgbWFya1BvdGVudGlhbGx5T3JwaGFuZWQodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy56aS5hZGQoZS50b1N0cmluZygpKSwgdWkucmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZW1vdmVUYXJnZXQodCwgZSkge1xuICAgICAgICB0aGlzLlFpLlJpKGUudGFyZ2V0SWQpLmZvckVhY2goKHQgPT4gdGhpcy56aS5hZGQodC50b1N0cmluZygpKSkpO1xuICAgICAgICBjb25zdCBuID0gdGhpcy5wZXJzaXN0ZW5jZS5nZXRUYXJnZXRDYWNoZSgpO1xuICAgICAgICByZXR1cm4gbi5nZXRNYXRjaGluZ0tleXNGb3JUYXJnZXRJZCh0LCBlLnRhcmdldElkKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgIHQuZm9yRWFjaCgodCA9PiB0aGlzLnppLmFkZCh0LnRvU3RyaW5nKCkpKSk7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiBuLnJlbW92ZVRhcmdldERhdGEodCwgZSkpKTtcbiAgICB9XG4gICAgVWkoKSB7XG4gICAgICAgIHRoaXMuamkgPSBuZXcgU2V0O1xuICAgIH1cbiAgICBLaSh0KSB7XG4gICAgICAgIC8vIFJlbW92ZSBuZXdseSBvcnBoYW5lZCBkb2N1bWVudHMuXG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLnBlcnNpc3RlbmNlLmdldFJlbW90ZURvY3VtZW50Q2FjaGUoKS5uZXdDaGFuZ2VCdWZmZXIoKTtcbiAgICAgICAgcmV0dXJuIHVpLmZvckVhY2godGhpcy56aSwgKG4gPT4ge1xuICAgICAgICAgICAgY29uc3QgcyA9IHh0LmZyb21QYXRoKG4pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuSGkodCwgcykubmV4dCgodCA9PiB7XG4gICAgICAgICAgICAgICAgdCB8fCBlLnJlbW92ZUVudHJ5KHMsIGN0Lm1pbigpKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+ICh0aGlzLmppID0gbnVsbCwgZS5hcHBseSh0KSkpKTtcbiAgICB9XG4gICAgdXBkYXRlTGltYm9Eb2N1bWVudCh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkhpKHQsIGUpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgdCA/IHRoaXMuemkuZGVsZXRlKGUudG9TdHJpbmcoKSkgOiB0aGlzLnppLmFkZChlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIHFpKHQpIHtcbiAgICAgICAgLy8gRm9yIGVhZ2VyIEdDLCB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSBkb2N1bWVudCBzaXplLCB0aGVyZSBhcmUgbm8gc2l6ZSB0aHJlc2hvbGRzLlxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgSGkodCwgZSkge1xuICAgICAgICByZXR1cm4gdWkub3IoWyAoKSA9PiB1aS5yZXNvbHZlKHRoaXMuUWkuY29udGFpbnNLZXkoZSkpLCAoKSA9PiB0aGlzLnBlcnNpc3RlbmNlLmdldFRhcmdldENhY2hlKCkuY29udGFpbnNLZXkodCwgZSksICgpID0+IHRoaXMucGVyc2lzdGVuY2UuR2kodCwgZSkgXSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLy8gVGhlIGZvcm1hdCBvZiB0aGUgTG9jYWxTdG9yYWdlIGtleSB0aGF0IHN0b3JlcyB0aGUgY2xpZW50IHN0YXRlIGlzOlxuLy8gICAgIGZpcmVzdG9yZV9jbGllbnRzXzxwZXJzaXN0ZW5jZV9wcmVmaXg+XzxpbnN0YW5jZV9rZXk+XG4vKiogQXNzZW1ibGVzIHRoZSBrZXkgZm9yIGEgY2xpZW50IHN0YXRlIGluIFdlYlN0b3JhZ2UgKi9cbmZ1bmN0aW9uIHBvKHQsIGUpIHtcbiAgICByZXR1cm4gYGZpcmVzdG9yZV9jbGllbnRzXyR7dH1fJHtlfWA7XG59XG5cbi8vIFRoZSBmb3JtYXQgb2YgdGhlIFdlYlN0b3JhZ2Uga2V5IHRoYXQgc3RvcmVzIHRoZSBtdXRhdGlvbiBzdGF0ZSBpczpcbi8vICAgICBmaXJlc3RvcmVfbXV0YXRpb25zXzxwZXJzaXN0ZW5jZV9wcmVmaXg+XzxiYXRjaF9pZD5cbi8vICAgICAoZm9yIHVuYXV0aGVudGljYXRlZCB1c2Vycylcbi8vIG9yOiBmaXJlc3RvcmVfbXV0YXRpb25zXzxwZXJzaXN0ZW5jZV9wcmVmaXg+XzxiYXRjaF9pZD5fPHVzZXJfdWlkPlxuXG4vLyAndXNlcl91aWQnIGlzIGxhc3QgdG8gYXZvaWQgbmVlZGluZyB0byBlc2NhcGUgJ18nIGNoYXJhY3RlcnMgdGhhdCBpdCBtaWdodFxuLy8gY29udGFpbi5cbi8qKiBBc3NlbWJsZXMgdGhlIGtleSBmb3IgYSBtdXRhdGlvbiBiYXRjaCBpbiBXZWJTdG9yYWdlICovXG5mdW5jdGlvbiBJbyh0LCBlLCBuKSB7XG4gICAgbGV0IHMgPSBgZmlyZXN0b3JlX211dGF0aW9uc18ke3R9XyR7bn1gO1xuICAgIHJldHVybiBlLmlzQXV0aGVudGljYXRlZCgpICYmIChzICs9IGBfJHtlLnVpZH1gKSwgcztcbn1cblxuLy8gVGhlIGZvcm1hdCBvZiB0aGUgV2ViU3RvcmFnZSBrZXkgdGhhdCBzdG9yZXMgYSBxdWVyeSB0YXJnZXQncyBtZXRhZGF0YSBpczpcbi8vICAgICBmaXJlc3RvcmVfdGFyZ2V0c188cGVyc2lzdGVuY2VfcHJlZml4Pl88dGFyZ2V0X2lkPlxuLyoqIEFzc2VtYmxlcyB0aGUga2V5IGZvciBhIHF1ZXJ5IHN0YXRlIGluIFdlYlN0b3JhZ2UgKi9cbmZ1bmN0aW9uIFRvKHQsIGUpIHtcbiAgICByZXR1cm4gYGZpcmVzdG9yZV90YXJnZXRzXyR7dH1fJHtlfWA7XG59XG5cbi8vIFRoZSBXZWJTdG9yYWdlIHByZWZpeCB0aGF0IHN0b3JlcyB0aGUgcHJpbWFyeSB0YWIncyBvbmxpbmUgc3RhdGUuIFRoZVxuLy8gZm9ybWF0IG9mIHRoZSBrZXkgaXM6XG4vLyAgICAgZmlyZXN0b3JlX29ubGluZV9zdGF0ZV88cGVyc2lzdGVuY2VfcHJlZml4PlxuLyoqXG4gKiBIb2xkcyB0aGUgc3RhdGUgb2YgYSBtdXRhdGlvbiBiYXRjaCwgaW5jbHVkaW5nIGl0cyB1c2VyIElELCBiYXRjaCBJRCBhbmRcbiAqIHdoZXRoZXIgdGhlIGJhdGNoIGlzICdwZW5kaW5nJywgJ2Fja25vd2xlZGdlZCcgb3IgJ3JlamVjdGVkJy5cbiAqL1xuLy8gVmlzaWJsZSBmb3IgdGVzdGluZ1xuY2xhc3MgRW8ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgdGhpcy51c2VyID0gdCwgdGhpcy5iYXRjaElkID0gZSwgdGhpcy5zdGF0ZSA9IG4sIHRoaXMuZXJyb3IgPSBzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSBNdXRhdGlvbk1ldGFkYXRhIGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24gaW4gV2ViU3RvcmFnZS5cbiAgICAgKiBMb2dzIGEgd2FybmluZyBhbmQgcmV0dXJucyBudWxsIGlmIHRoZSBmb3JtYXQgb2YgdGhlIGRhdGEgaXMgbm90IHZhbGlkLlxuICAgICAqLyAgICBzdGF0aWMgSmkodCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gSlNPTi5wYXJzZShuKTtcbiAgICAgICAgbGV0IGksIHIgPSBcIm9iamVjdFwiID09IHR5cGVvZiBzICYmIC0xICE9PSBbIFwicGVuZGluZ1wiLCBcImFja25vd2xlZGdlZFwiLCBcInJlamVjdGVkXCIgXS5pbmRleE9mKHMuc3RhdGUpICYmICh2b2lkIDAgPT09IHMuZXJyb3IgfHwgXCJvYmplY3RcIiA9PSB0eXBlb2Ygcy5lcnJvcik7XG4gICAgICAgIHJldHVybiByICYmIHMuZXJyb3IgJiYgKHIgPSBcInN0cmluZ1wiID09IHR5cGVvZiBzLmVycm9yLm1lc3NhZ2UgJiYgXCJzdHJpbmdcIiA9PSB0eXBlb2Ygcy5lcnJvci5jb2RlLCBcbiAgICAgICAgciAmJiAoaSA9IG5ldyBRKHMuZXJyb3IuY29kZSwgcy5lcnJvci5tZXNzYWdlKSkpLCByID8gbmV3IEVvKHQsIGUsIHMuc3RhdGUsIGkpIDogKCQoXCJTaGFyZWRDbGllbnRTdGF0ZVwiLCBgRmFpbGVkIHRvIHBhcnNlIG11dGF0aW9uIHN0YXRlIGZvciBJRCAnJHtlfSc6ICR7bn1gKSwgXG4gICAgICAgIG51bGwpO1xuICAgIH1cbiAgICBZaSgpIHtcbiAgICAgICAgY29uc3QgdCA9IHtcbiAgICAgICAgICAgIHN0YXRlOiB0aGlzLnN0YXRlLFxuICAgICAgICAgICAgdXBkYXRlVGltZU1zOiBEYXRlLm5vdygpXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yICYmICh0LmVycm9yID0ge1xuICAgICAgICAgICAgY29kZTogdGhpcy5lcnJvci5jb2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5lcnJvci5tZXNzYWdlXG4gICAgICAgIH0pLCBKU09OLnN0cmluZ2lmeSh0KTtcbiAgICB9XG59XG5cbi8qKlxuICogSG9sZHMgdGhlIHN0YXRlIG9mIGEgcXVlcnkgdGFyZ2V0LCBpbmNsdWRpbmcgaXRzIHRhcmdldCBJRCBhbmQgd2hldGhlciB0aGVcbiAqIHRhcmdldCBpcyAnbm90LWN1cnJlbnQnLCAnY3VycmVudCcgb3IgJ3JlamVjdGVkJy5cbiAqL1xuLy8gVmlzaWJsZSBmb3IgdGVzdGluZ1xuY2xhc3MgQW8ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy50YXJnZXRJZCA9IHQsIHRoaXMuc3RhdGUgPSBlLCB0aGlzLmVycm9yID0gbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2VzIGEgUXVlcnlUYXJnZXRNZXRhZGF0YSBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uIGluIFdlYlN0b3JhZ2UuXG4gICAgICogTG9ncyBhIHdhcm5pbmcgYW5kIHJldHVybnMgbnVsbCBpZiB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhIGlzIG5vdCB2YWxpZC5cbiAgICAgKi8gICAgc3RhdGljIEppKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IEpTT04ucGFyc2UoZSk7XG4gICAgICAgIGxldCBzLCBpID0gXCJvYmplY3RcIiA9PSB0eXBlb2YgbiAmJiAtMSAhPT0gWyBcIm5vdC1jdXJyZW50XCIsIFwiY3VycmVudFwiLCBcInJlamVjdGVkXCIgXS5pbmRleE9mKG4uc3RhdGUpICYmICh2b2lkIDAgPT09IG4uZXJyb3IgfHwgXCJvYmplY3RcIiA9PSB0eXBlb2Ygbi5lcnJvcik7XG4gICAgICAgIHJldHVybiBpICYmIG4uZXJyb3IgJiYgKGkgPSBcInN0cmluZ1wiID09IHR5cGVvZiBuLmVycm9yLm1lc3NhZ2UgJiYgXCJzdHJpbmdcIiA9PSB0eXBlb2Ygbi5lcnJvci5jb2RlLCBcbiAgICAgICAgaSAmJiAocyA9IG5ldyBRKG4uZXJyb3IuY29kZSwgbi5lcnJvci5tZXNzYWdlKSkpLCBpID8gbmV3IEFvKHQsIG4uc3RhdGUsIHMpIDogKCQoXCJTaGFyZWRDbGllbnRTdGF0ZVwiLCBgRmFpbGVkIHRvIHBhcnNlIHRhcmdldCBzdGF0ZSBmb3IgSUQgJyR7dH0nOiAke2V9YCksIFxuICAgICAgICBudWxsKTtcbiAgICB9XG4gICAgWWkoKSB7XG4gICAgICAgIGNvbnN0IHQgPSB7XG4gICAgICAgICAgICBzdGF0ZTogdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIHVwZGF0ZVRpbWVNczogRGF0ZS5ub3coKVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvciAmJiAodC5lcnJvciA9IHtcbiAgICAgICAgICAgIGNvZGU6IHRoaXMuZXJyb3IuY29kZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMuZXJyb3IubWVzc2FnZVxuICAgICAgICB9KSwgSlNPTi5zdHJpbmdpZnkodCk7XG4gICAgfVxufVxuXG4vKipcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgaW1tdXRhYmxlIENsaWVudFN0YXRlIGZvciBhIGNsaWVudCByZWFkIGZyb21cbiAqIFdlYlN0b3JhZ2UsIGNvbnRhaW5pbmcgdGhlIGxpc3Qgb2YgYWN0aXZlIHF1ZXJ5IHRhcmdldHMuXG4gKi8gY2xhc3MgUm8ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5jbGllbnRJZCA9IHQsIHRoaXMuYWN0aXZlVGFyZ2V0SWRzID0gZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2VzIGEgUmVtb3RlQ2xpZW50U3RhdGUgZnJvbSB0aGUgSlNPTiByZXByZXNlbnRhdGlvbiBpbiBXZWJTdG9yYWdlLlxuICAgICAqIExvZ3MgYSB3YXJuaW5nIGFuZCByZXR1cm5zIG51bGwgaWYgdGhlIGZvcm1hdCBvZiB0aGUgZGF0YSBpcyBub3QgdmFsaWQuXG4gICAgICovICAgIHN0YXRpYyBKaSh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBKU09OLnBhcnNlKGUpO1xuICAgICAgICBsZXQgcyA9IFwib2JqZWN0XCIgPT0gdHlwZW9mIG4gJiYgbi5hY3RpdmVUYXJnZXRJZHMgaW5zdGFuY2VvZiBBcnJheSwgaSA9IGpuKCk7XG4gICAgICAgIGZvciAobGV0IHQgPSAwOyBzICYmIHQgPCBuLmFjdGl2ZVRhcmdldElkcy5sZW5ndGg7ICsrdCkgcyA9IEN0KG4uYWN0aXZlVGFyZ2V0SWRzW3RdKSwgXG4gICAgICAgIGkgPSBpLmFkZChuLmFjdGl2ZVRhcmdldElkc1t0XSk7XG4gICAgICAgIHJldHVybiBzID8gbmV3IFJvKHQsIGkpIDogKCQoXCJTaGFyZWRDbGllbnRTdGF0ZVwiLCBgRmFpbGVkIHRvIHBhcnNlIGNsaWVudCBkYXRhIGZvciBpbnN0YW5jZSAnJHt0fSc6ICR7ZX1gKSwgXG4gICAgICAgIG51bGwpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG9ubGluZSBzdGF0ZSBmb3IgYWxsIGNsaWVudHMgcGFydGljaXBhdGluZyBpblxuICogbXVsdGktdGFiLiBUaGUgb25saW5lIHN0YXRlIGlzIG9ubHkgd3JpdHRlbiB0byBieSB0aGUgcHJpbWFyeSBjbGllbnQsIGFuZFxuICogdXNlZCBpbiBzZWNvbmRhcnkgY2xpZW50cyB0byB1cGRhdGUgdGhlaXIgcXVlcnkgdmlld3MuXG4gKi8gY2xhc3MgYm8ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5jbGllbnRJZCA9IHQsIHRoaXMub25saW5lU3RhdGUgPSBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSBTaGFyZWRPbmxpbmVTdGF0ZSBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uIGluIFdlYlN0b3JhZ2UuXG4gICAgICogTG9ncyBhIHdhcm5pbmcgYW5kIHJldHVybnMgbnVsbCBpZiB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhIGlzIG5vdCB2YWxpZC5cbiAgICAgKi8gICAgc3RhdGljIEppKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IEpTT04ucGFyc2UodCk7XG4gICAgICAgIHJldHVybiBcIm9iamVjdFwiID09IHR5cGVvZiBlICYmIC0xICE9PSBbIFwiVW5rbm93blwiLCBcIk9ubGluZVwiLCBcIk9mZmxpbmVcIiBdLmluZGV4T2YoZS5vbmxpbmVTdGF0ZSkgJiYgXCJzdHJpbmdcIiA9PSB0eXBlb2YgZS5jbGllbnRJZCA/IG5ldyBibyhlLmNsaWVudElkLCBlLm9ubGluZVN0YXRlKSA6ICgkKFwiU2hhcmVkQ2xpZW50U3RhdGVcIiwgYEZhaWxlZCB0byBwYXJzZSBvbmxpbmUgc3RhdGU6ICR7dH1gKSwgXG4gICAgICAgIG51bGwpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBNZXRhZGF0YSBzdGF0ZSBvZiB0aGUgbG9jYWwgY2xpZW50LiBVbmxpa2UgYFJlbW90ZUNsaWVudFN0YXRlYCwgdGhpcyBjbGFzcyBpc1xuICogbXV0YWJsZSBhbmQga2VlcHMgdHJhY2sgb2YgYWxsIHBlbmRpbmcgbXV0YXRpb25zLCB3aGljaCBhbGxvd3MgdXMgdG9cbiAqIHVwZGF0ZSB0aGUgcmFuZ2Ugb2YgcGVuZGluZyBtdXRhdGlvbiBiYXRjaCBJRHMgYXMgbmV3IG11dGF0aW9ucyBhcmUgYWRkZWQgb3JcbiAqIHJlbW92ZWQuXG4gKlxuICogVGhlIGRhdGEgaW4gYExvY2FsQ2xpZW50U3RhdGVgIGlzIG5vdCByZWFkIGZyb20gV2ViU3RvcmFnZSBhbmQgaW5zdGVhZFxuICogdXBkYXRlZCB2aWEgaXRzIGluc3RhbmNlIG1ldGhvZHMuIFRoZSB1cGRhdGVkIHN0YXRlIGNhbiBiZSBzZXJpYWxpemVkIHZpYVxuICogYHRvV2ViU3RvcmFnZUpTT04oKWAuXG4gKi9cbi8vIFZpc2libGUgZm9yIHRlc3RpbmcuXG5jbGFzcyBQbyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlVGFyZ2V0SWRzID0gam4oKTtcbiAgICB9XG4gICAgWGkodCkge1xuICAgICAgICB0aGlzLmFjdGl2ZVRhcmdldElkcyA9IHRoaXMuYWN0aXZlVGFyZ2V0SWRzLmFkZCh0KTtcbiAgICB9XG4gICAgWmkodCkge1xuICAgICAgICB0aGlzLmFjdGl2ZVRhcmdldElkcyA9IHRoaXMuYWN0aXZlVGFyZ2V0SWRzLmRlbGV0ZSh0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhpcyBlbnRyeSBpbnRvIGEgSlNPTi1lbmNvZGVkIGZvcm1hdCB3ZSBjYW4gdXNlIGZvciBXZWJTdG9yYWdlLlxuICAgICAqIERvZXMgbm90IGVuY29kZSBgY2xpZW50SWRgIGFzIGl0IGlzIHBhcnQgb2YgdGhlIGtleSBpbiBXZWJTdG9yYWdlLlxuICAgICAqLyAgICBZaSgpIHtcbiAgICAgICAgY29uc3QgdCA9IHtcbiAgICAgICAgICAgIGFjdGl2ZVRhcmdldElkczogdGhpcy5hY3RpdmVUYXJnZXRJZHMudG9BcnJheSgpLFxuICAgICAgICAgICAgdXBkYXRlVGltZU1zOiBEYXRlLm5vdygpXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0KTtcbiAgICB9XG59XG5cbi8qKlxuICogYFdlYlN0b3JhZ2VTaGFyZWRDbGllbnRTdGF0ZWAgdXNlcyBXZWJTdG9yYWdlICh3aW5kb3cubG9jYWxTdG9yYWdlKSBhcyB0aGVcbiAqIGJhY2tpbmcgc3RvcmUgZm9yIHRoZSBTaGFyZWRDbGllbnRTdGF0ZS4gSXQga2VlcHMgdHJhY2sgb2YgYWxsIGFjdGl2ZVxuICogY2xpZW50cyBhbmQgc3VwcG9ydHMgbW9kaWZpY2F0aW9ucyBvZiB0aGUgbG9jYWwgY2xpZW50J3MgZGF0YS5cbiAqLyBjbGFzcyBWbyB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgcywgaSkge1xuICAgICAgICB0aGlzLndpbmRvdyA9IHQsIHRoaXMuSG4gPSBlLCB0aGlzLnBlcnNpc3RlbmNlS2V5ID0gbiwgdGhpcy50ciA9IHMsIHRoaXMuc3luY0VuZ2luZSA9IG51bGwsIFxuICAgICAgICB0aGlzLm9ubGluZVN0YXRlSGFuZGxlciA9IG51bGwsIHRoaXMuc2VxdWVuY2VOdW1iZXJIYW5kbGVyID0gbnVsbCwgdGhpcy5lciA9IHRoaXMubnIuYmluZCh0aGlzKSwgXG4gICAgICAgIHRoaXMuc3IgPSBuZXcgQ24ocnQpLCB0aGlzLnN0YXJ0ZWQgPSAhMSwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYXB0dXJlcyBXZWJTdG9yYWdlIGV2ZW50cyB0aGF0IG9jY3VyIGJlZm9yZSBgc3RhcnQoKWAgaXMgY2FsbGVkLiBUaGVzZVxuICAgICAgICAgKiBldmVudHMgYXJlIHJlcGxheWVkIG9uY2UgYFdlYlN0b3JhZ2VTaGFyZWRDbGllbnRTdGF0ZWAgaXMgc3RhcnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXIgPSBbXTtcbiAgICAgICAgLy8gRXNjYXBlIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMgbWVudGlvbmVkIGhlcmU6XG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvR3VpZGUvUmVndWxhcl9FeHByZXNzaW9uc1xuICAgICAgICBjb25zdCByID0gbi5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIik7XG4gICAgICAgIHRoaXMuc3RvcmFnZSA9IHRoaXMud2luZG93LmxvY2FsU3RvcmFnZSwgdGhpcy5jdXJyZW50VXNlciA9IGksIHRoaXMucnIgPSBwbyh0aGlzLnBlcnNpc3RlbmNlS2V5LCB0aGlzLnRyKSwgXG4gICAgICAgIHRoaXMuYXIgPSBcbiAgICAgICAgLyoqIEFzc2VtYmxlcyB0aGUga2V5IGZvciB0aGUgY3VycmVudCBzZXF1ZW5jZSBudW1iZXIuICovXG4gICAgICAgIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHJldHVybiBgZmlyZXN0b3JlX3NlcXVlbmNlX251bWJlcl8ke3R9YDtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyAodGhpcy5wZXJzaXN0ZW5jZUtleSksIHRoaXMuc3IgPSB0aGlzLnNyLmluc2VydCh0aGlzLnRyLCBuZXcgUG8pLCB0aGlzLnVyID0gbmV3IFJlZ0V4cChgXmZpcmVzdG9yZV9jbGllbnRzXyR7cn1fKFteX10qKSRgKSwgXG4gICAgICAgIHRoaXMuY3IgPSBuZXcgUmVnRXhwKGBeZmlyZXN0b3JlX211dGF0aW9uc18ke3J9XyhcXFxcZCspKD86XyguKikpPyRgKSwgdGhpcy5ociA9IG5ldyBSZWdFeHAoYF5maXJlc3RvcmVfdGFyZ2V0c18ke3J9XyhcXFxcZCspJGApLCBcbiAgICAgICAgdGhpcy5sciA9IFxuICAgICAgICAvKiogQXNzZW1ibGVzIHRoZSBrZXkgZm9yIHRoZSBvbmxpbmUgc3RhdGUgb2YgdGhlIHByaW1hcnkgdGFiLiAqL1xuICAgICAgICBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICByZXR1cm4gYGZpcmVzdG9yZV9vbmxpbmVfc3RhdGVfJHt0fWA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIFdlYlN0b3JhZ2UgcHJlZml4IHRoYXQgcGxheXMgYXMgYSBldmVudCB0byBpbmRpY2F0ZSB0aGUgcmVtb3RlIGRvY3VtZW50c1xuICAgICAgICAvLyBtaWdodCBoYXZlIGNoYW5nZWQgZHVlIHRvIHNvbWUgc2Vjb25kYXJ5IHRhYnMgbG9hZGluZyBhIGJ1bmRsZS5cbiAgICAgICAgLy8gZm9ybWF0IG9mIHRoZSBrZXkgaXM6XG4gICAgICAgIC8vICAgICBmaXJlc3RvcmVfYnVuZGxlX2xvYWRlZF88cGVyc2lzdGVuY2VLZXk+XG4gICAgICAgICh0aGlzLnBlcnNpc3RlbmNlS2V5KSwgdGhpcy5kciA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHJldHVybiBgZmlyZXN0b3JlX2J1bmRsZV9sb2FkZWRfJHt0fWA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIFdlYlN0b3JhZ2Uga2V5IHByZWZpeCBmb3IgdGhlIGtleSB0aGF0IHN0b3JlcyB0aGUgbGFzdCBzZXF1ZW5jZSBudW1iZXIgYWxsb2NhdGVkLiBUaGUga2V5XG4gICAgICAgIC8vIGxvb2tzIGxpa2UgJ2ZpcmVzdG9yZV9zZXF1ZW5jZV9udW1iZXJfPHBlcnNpc3RlbmNlX3ByZWZpeD4nLlxuICAgICAgICAodGhpcy5wZXJzaXN0ZW5jZUtleSksIFxuICAgICAgICAvLyBSYXRoZXIgdGhhbiBhZGRpbmcgdGhlIHN0b3JhZ2Ugb2JzZXJ2ZXIgZHVyaW5nIHN0YXJ0KCksIHdlIGFkZCB0aGVcbiAgICAgICAgLy8gc3RvcmFnZSBvYnNlcnZlciBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIFRoaXMgZW5zdXJlcyB0aGF0IHdlIGNvbGxlY3RcbiAgICAgICAgLy8gZXZlbnRzIGJlZm9yZSBvdGhlciBjb21wb25lbnRzIHBvcHVsYXRlIHRoZWlyIGluaXRpYWwgc3RhdGUgKGR1cmluZyB0aGVpclxuICAgICAgICAvLyByZXNwZWN0aXZlIHN0YXJ0KCkgY2FsbHMpLiBPdGhlcndpc2UsIHdlIG1pZ2h0IGZvciBleGFtcGxlIG1pc3MgYVxuICAgICAgICAvLyBtdXRhdGlvbiB0aGF0IGlzIGFkZGVkIGFmdGVyIExvY2FsU3RvcmUncyBzdGFydCgpIHByb2Nlc3NlZCB0aGUgZXhpc3RpbmdcbiAgICAgICAgLy8gbXV0YXRpb25zIGJ1dCBiZWZvcmUgd2Ugb2JzZXJ2ZSBXZWJTdG9yYWdlIGV2ZW50cy5cbiAgICAgICAgdGhpcy53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInN0b3JhZ2VcIiwgdGhpcy5lcik7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zICd0cnVlJyBpZiBXZWJTdG9yYWdlIGlzIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudC4gKi8gICAgc3RhdGljIHZ0KHQpIHtcbiAgICAgICAgcmV0dXJuICEoIXQgfHwgIXQubG9jYWxTdG9yYWdlKTtcbiAgICB9XG4gICAgYXN5bmMgc3RhcnQoKSB7XG4gICAgICAgIC8vIFJldHJpZXZlIHRoZSBsaXN0IG9mIGV4aXN0aW5nIGNsaWVudHMgdG8gYmFja2ZpbGwgdGhlIGRhdGEgaW5cbiAgICAgICAgLy8gU2hhcmVkQ2xpZW50U3RhdGUuXG4gICAgICAgIGNvbnN0IHQgPSBhd2FpdCB0aGlzLnN5bmNFbmdpbmUuTXMoKTtcbiAgICAgICAgZm9yIChjb25zdCBlIG9mIHQpIHtcbiAgICAgICAgICAgIGlmIChlID09PSB0aGlzLnRyKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmdldEl0ZW0ocG8odGhpcy5wZXJzaXN0ZW5jZUtleSwgZSkpO1xuICAgICAgICAgICAgaWYgKHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuID0gUm8uSmkoZSwgdCk7XG4gICAgICAgICAgICAgICAgbiAmJiAodGhpcy5zciA9IHRoaXMuc3IuaW5zZXJ0KG4uY2xpZW50SWQsIG4pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yKCk7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIG9ubGluZSBzdGF0ZSBhbmQgY2FsbCB0aGUgY2FsbGJhY2sgaGFuZGxlclxuICAgICAgICAvLyBpZiBhcHBsaWNhYmxlLlxuICAgICAgICBjb25zdCBlID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0odGhpcy5scik7XG4gICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy53cihlKTtcbiAgICAgICAgICAgIHQgJiYgdGhpcy5tcih0KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5pcikgdGhpcy5ucih0KTtcbiAgICAgICAgdGhpcy5pciA9IFtdLCBcbiAgICAgICAgLy8gUmVnaXN0ZXIgYSB3aW5kb3cgdW5sb2FkIGhvb2sgdG8gcmVtb3ZlIHRoZSBjbGllbnQgbWV0YWRhdGEgZW50cnkgZnJvbVxuICAgICAgICAvLyBXZWJTdG9yYWdlIGV2ZW4gaWYgYHNodXRkb3duKClgIHdhcyBub3QgY2FsbGVkLlxuICAgICAgICB0aGlzLndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGFnZWhpZGVcIiwgKCgpID0+IHRoaXMuc2h1dGRvd24oKSkpLCB0aGlzLnN0YXJ0ZWQgPSAhMDtcbiAgICB9XG4gICAgd3JpdGVTZXF1ZW5jZU51bWJlcih0KSB7XG4gICAgICAgIHRoaXMuc2V0SXRlbSh0aGlzLmFyLCBKU09OLnN0cmluZ2lmeSh0KSk7XG4gICAgfVxuICAgIGdldEFsbEFjdGl2ZVF1ZXJ5VGFyZ2V0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3IodGhpcy5zcik7XG4gICAgfVxuICAgIGlzQWN0aXZlUXVlcnlUYXJnZXQodCkge1xuICAgICAgICBsZXQgZSA9ICExO1xuICAgICAgICByZXR1cm4gdGhpcy5zci5mb3JFYWNoKCgobiwgcykgPT4ge1xuICAgICAgICAgICAgcy5hY3RpdmVUYXJnZXRJZHMuaGFzKHQpICYmIChlID0gITApO1xuICAgICAgICB9KSksIGU7XG4gICAgfVxuICAgIGFkZFBlbmRpbmdNdXRhdGlvbih0KSB7XG4gICAgICAgIHRoaXMueXIodCwgXCJwZW5kaW5nXCIpO1xuICAgIH1cbiAgICB1cGRhdGVNdXRhdGlvblN0YXRlKHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy55cih0LCBlLCBuKSwgXG4gICAgICAgIC8vIE9uY2UgYSBmaW5hbCBtdXRhdGlvbiByZXN1bHQgaXMgb2JzZXJ2ZWQgYnkgb3RoZXIgY2xpZW50cywgdGhleSBubyBsb25nZXJcbiAgICAgICAgLy8gYWNjZXNzIHRoZSBtdXRhdGlvbidzIG1ldGFkYXRhIGVudHJ5LiBTaW5jZSBXZWJTdG9yYWdlIHJlcGxheXMgZXZlbnRzXG4gICAgICAgIC8vIGluIG9yZGVyLCBpdCBpcyBzYWZlIHRvIGRlbGV0ZSB0aGUgZW50cnkgcmlnaHQgYWZ0ZXIgdXBkYXRpbmcgaXQuXG4gICAgICAgIHRoaXMucHIodCk7XG4gICAgfVxuICAgIGFkZExvY2FsUXVlcnlUYXJnZXQodCkge1xuICAgICAgICBsZXQgZSA9IFwibm90LWN1cnJlbnRcIjtcbiAgICAgICAgLy8gTG9va3VwIGFuIGV4aXN0aW5nIHF1ZXJ5IHN0YXRlIGlmIHRoZSB0YXJnZXQgSUQgd2FzIGFscmVhZHkgcmVnaXN0ZXJlZFxuICAgICAgICAvLyBieSBhbm90aGVyIHRhYlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQWN0aXZlUXVlcnlUYXJnZXQodCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLnN0b3JhZ2UuZ2V0SXRlbShUbyh0aGlzLnBlcnNpc3RlbmNlS2V5LCB0KSk7XG4gICAgICAgICAgICBpZiAobikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBBby5KaSh0LCBuKTtcbiAgICAgICAgICAgICAgICBzICYmIChlID0gcy5zdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuSXIuWGkodCksIHRoaXMuX3IoKSwgZTtcbiAgICB9XG4gICAgcmVtb3ZlTG9jYWxRdWVyeVRhcmdldCh0KSB7XG4gICAgICAgIHRoaXMuSXIuWmkodCksIHRoaXMuX3IoKTtcbiAgICB9XG4gICAgaXNMb2NhbFF1ZXJ5VGFyZ2V0KHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuSXIuYWN0aXZlVGFyZ2V0SWRzLmhhcyh0KTtcbiAgICB9XG4gICAgY2xlYXJRdWVyeVN0YXRlKHQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVJdGVtKFRvKHRoaXMucGVyc2lzdGVuY2VLZXksIHQpKTtcbiAgICB9XG4gICAgdXBkYXRlUXVlcnlTdGF0ZSh0LCBlLCBuKSB7XG4gICAgICAgIHRoaXMuVHIodCwgZSwgbik7XG4gICAgfVxuICAgIGhhbmRsZVVzZXJDaGFuZ2UodCwgZSwgbikge1xuICAgICAgICBlLmZvckVhY2goKHQgPT4ge1xuICAgICAgICAgICAgdGhpcy5wcih0KTtcbiAgICAgICAgfSkpLCB0aGlzLmN1cnJlbnRVc2VyID0gdCwgbi5mb3JFYWNoKCh0ID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWRkUGVuZGluZ011dGF0aW9uKHQpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIHNldE9ubGluZVN0YXRlKHQpIHtcbiAgICAgICAgdGhpcy5Fcih0KTtcbiAgICB9XG4gICAgbm90aWZ5QnVuZGxlTG9hZGVkKCkge1xuICAgICAgICB0aGlzLkFyKCk7XG4gICAgfVxuICAgIHNodXRkb3duKCkge1xuICAgICAgICB0aGlzLnN0YXJ0ZWQgJiYgKHRoaXMud2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzdG9yYWdlXCIsIHRoaXMuZXIpLCB0aGlzLnJlbW92ZUl0ZW0odGhpcy5yciksIFxuICAgICAgICB0aGlzLnN0YXJ0ZWQgPSAhMSk7XG4gICAgfVxuICAgIGdldEl0ZW0odCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0odCk7XG4gICAgICAgIHJldHVybiBPKFwiU2hhcmVkQ2xpZW50U3RhdGVcIiwgXCJSRUFEXCIsIHQsIGUpLCBlO1xuICAgIH1cbiAgICBzZXRJdGVtKHQsIGUpIHtcbiAgICAgICAgTyhcIlNoYXJlZENsaWVudFN0YXRlXCIsIFwiU0VUXCIsIHQsIGUpLCB0aGlzLnN0b3JhZ2Uuc2V0SXRlbSh0LCBlKTtcbiAgICB9XG4gICAgcmVtb3ZlSXRlbSh0KSB7XG4gICAgICAgIE8oXCJTaGFyZWRDbGllbnRTdGF0ZVwiLCBcIlJFTU9WRVwiLCB0KSwgdGhpcy5zdG9yYWdlLnJlbW92ZUl0ZW0odCk7XG4gICAgfVxuICAgIG5yKHQpIHtcbiAgICAgICAgLy8gTm90ZTogVGhlIGZ1bmN0aW9uIGlzIHR5cGVkIHRvIHRha2UgRXZlbnQgdG8gYmUgaW50ZXJmYWNlLWNvbXBhdGlibGUgd2l0aFxuICAgICAgICAvLyBgV2luZG93LmFkZEV2ZW50TGlzdGVuZXJgLlxuICAgICAgICBjb25zdCBlID0gdDtcbiAgICAgICAgaWYgKGUuc3RvcmFnZUFyZWEgPT09IHRoaXMuc3RvcmFnZSkge1xuICAgICAgICAgICAgaWYgKE8oXCJTaGFyZWRDbGllbnRTdGF0ZVwiLCBcIkVWRU5UXCIsIGUua2V5LCBlLm5ld1ZhbHVlKSwgZS5rZXkgPT09IHRoaXMucnIpIHJldHVybiB2b2lkICQoXCJSZWNlaXZlZCBXZWJTdG9yYWdlIG5vdGlmaWNhdGlvbiBmb3IgbG9jYWwgY2hhbmdlLiBBbm90aGVyIGNsaWVudCBtaWdodCBoYXZlIGdhcmJhZ2UtY29sbGVjdGVkIG91ciBzdGF0ZVwiKTtcbiAgICAgICAgICAgIHRoaXMuSG4uZW5xdWV1ZVJldHJ5YWJsZSgoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IGUua2V5KSBpZiAodGhpcy51ci50ZXN0KGUua2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gZS5uZXdWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLlJyKGUua2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5icih0LCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5QcihlLmtleSwgZS5uZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHJldHVybiB0aGlzLmJyKHQuY2xpZW50SWQsIHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY3IudGVzdChlLmtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSBlLm5ld1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuVnIoZS5rZXksIGUubmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KSByZXR1cm4gdGhpcy52cih0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmhyLnRlc3QoZS5rZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gZS5uZXdWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLlNyKGUua2V5LCBlLm5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkgcmV0dXJuIHRoaXMuRHIodCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IHRoaXMubHIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSBlLm5ld1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMud3IoZS5uZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHJldHVybiB0aGlzLm1yKHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSB0aGlzLmFyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlID0gbnQuQTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSB0KSB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gSlNPTi5wYXJzZSh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcShcIm51bWJlclwiID09IHR5cGVvZiBuKSwgZSA9IG47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKFwiU2hhcmVkQ2xpZW50U3RhdGVcIiwgXCJGYWlsZWQgdG8gcmVhZCBzZXF1ZW5jZSBudW1iZXIgZnJvbSBXZWJTdG9yYWdlXCIsIHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8qKlxuICogYE1lbW9yeVNoYXJlZENsaWVudFN0YXRlYCBpcyBhIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBTaGFyZWRDbGllbnRTdGF0ZSBmb3JcbiAqIGNsaWVudHMgdXNpbmcgbWVtb3J5IHBlcnNpc3RlbmNlLiBUaGUgc3RhdGUgaW4gdGhpcyBjbGFzcyByZW1haW5zIGZ1bGx5XG4gKiBpc29sYXRlZCBhbmQgbm8gc3luY2hyb25pemF0aW9uIGlzIHBlcmZvcm1lZC5cbiAqLyAoZS5uZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ICE9PSBudC5BICYmIHRoaXMuc2VxdWVuY2VOdW1iZXJIYW5kbGVyKHQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSB0aGlzLmRyKSByZXR1cm4gdGhpcy5zeW5jRW5naW5lLkNyKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHRoaXMuaXIucHVzaChlKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgSXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNyLmdldCh0aGlzLnRyKTtcbiAgICB9XG4gICAgX3IoKSB7XG4gICAgICAgIHRoaXMuc2V0SXRlbSh0aGlzLnJyLCB0aGlzLklyLllpKCkpO1xuICAgIH1cbiAgICB5cih0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSBuZXcgRW8odGhpcy5jdXJyZW50VXNlciwgdCwgZSwgbiksIGkgPSBJbyh0aGlzLnBlcnNpc3RlbmNlS2V5LCB0aGlzLmN1cnJlbnRVc2VyLCB0KTtcbiAgICAgICAgdGhpcy5zZXRJdGVtKGksIHMuWWkoKSk7XG4gICAgfVxuICAgIHByKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IElvKHRoaXMucGVyc2lzdGVuY2VLZXksIHRoaXMuY3VycmVudFVzZXIsIHQpO1xuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oZSk7XG4gICAgfVxuICAgIEVyKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHtcbiAgICAgICAgICAgIGNsaWVudElkOiB0aGlzLnRyLFxuICAgICAgICAgICAgb25saW5lU3RhdGU6IHRcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldEl0ZW0odGhpcy5sciwgSlNPTi5zdHJpbmdpZnkoZSkpO1xuICAgIH1cbiAgICBUcih0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSBUbyh0aGlzLnBlcnNpc3RlbmNlS2V5LCB0KSwgaSA9IG5ldyBBbyh0LCBlLCBuKTtcbiAgICAgICAgdGhpcy5zZXRJdGVtKHMsIGkuWWkoKSk7XG4gICAgfVxuICAgIEFyKCkge1xuICAgICAgICB0aGlzLnNldEl0ZW0odGhpcy5kciwgXCJ2YWx1ZS1ub3QtdXNlZFwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2VzIGEgY2xpZW50IHN0YXRlIGtleSBpbiBXZWJTdG9yYWdlLiBSZXR1cm5zIG51bGwgaWYgdGhlIGtleSBkb2VzIG5vdFxuICAgICAqIG1hdGNoIHRoZSBleHBlY3RlZCBrZXkgZm9ybWF0LlxuICAgICAqLyAgICBScih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLnVyLmV4ZWModCk7XG4gICAgICAgIHJldHVybiBlID8gZVsxXSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIGNsaWVudCBzdGF0ZSBpbiBXZWJTdG9yYWdlLiBSZXR1cm5zICdudWxsJyBpZiB0aGUgdmFsdWUgY291bGQgbm90XG4gICAgICogYmUgcGFyc2VkLlxuICAgICAqLyAgICBQcih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLlJyKHQpO1xuICAgICAgICByZXR1cm4gUm8uSmkobiwgZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIG11dGF0aW9uIGJhdGNoIHN0YXRlIGluIFdlYlN0b3JhZ2UuIFJldHVybnMgJ251bGwnIGlmIHRoZSB2YWx1ZVxuICAgICAqIGNvdWxkIG5vdCBiZSBwYXJzZWQuXG4gICAgICovICAgIFZyKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IHRoaXMuY3IuZXhlYyh0KSwgcyA9IE51bWJlcihuWzFdKSwgaSA9IHZvaWQgMCAhPT0gblsyXSA/IG5bMl0gOiBudWxsO1xuICAgICAgICByZXR1cm4gRW8uSmkobmV3IEMoaSksIHMsIGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSBxdWVyeSB0YXJnZXQgc3RhdGUgZnJvbSBXZWJTdG9yYWdlLiBSZXR1cm5zICdudWxsJyBpZiB0aGUgdmFsdWVcbiAgICAgKiBjb3VsZCBub3QgYmUgcGFyc2VkLlxuICAgICAqLyAgICBTcih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLmhyLmV4ZWModCksIHMgPSBOdW1iZXIoblsxXSk7XG4gICAgICAgIHJldHVybiBBby5KaShzLCBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2VzIGFuIG9ubGluZSBzdGF0ZSBmcm9tIFdlYlN0b3JhZ2UuIFJldHVybnMgJ251bGwnIGlmIHRoZSB2YWx1ZVxuICAgICAqIGNvdWxkIG5vdCBiZSBwYXJzZWQuXG4gICAgICovICAgIHdyKHQpIHtcbiAgICAgICAgcmV0dXJuIGJvLkppKHQpO1xuICAgIH1cbiAgICBhc3luYyB2cih0KSB7XG4gICAgICAgIGlmICh0LnVzZXIudWlkID09PSB0aGlzLmN1cnJlbnRVc2VyLnVpZCkgcmV0dXJuIHRoaXMuc3luY0VuZ2luZS5Ocih0LmJhdGNoSWQsIHQuc3RhdGUsIHQuZXJyb3IpO1xuICAgICAgICBPKFwiU2hhcmVkQ2xpZW50U3RhdGVcIiwgYElnbm9yaW5nIG11dGF0aW9uIGZvciBub24tYWN0aXZlIHVzZXIgJHt0LnVzZXIudWlkfWApO1xuICAgIH1cbiAgICBEcih0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmNFbmdpbmUua3IodC50YXJnZXRJZCwgdC5zdGF0ZSwgdC5lcnJvcik7XG4gICAgfVxuICAgIGJyKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IGUgPyB0aGlzLnNyLmluc2VydCh0LCBlKSA6IHRoaXMuc3IucmVtb3ZlKHQpLCBzID0gdGhpcy5ncih0aGlzLnNyKSwgaSA9IHRoaXMuZ3IobiksIHIgPSBbXSwgbyA9IFtdO1xuICAgICAgICByZXR1cm4gaS5mb3JFYWNoKCh0ID0+IHtcbiAgICAgICAgICAgIHMuaGFzKHQpIHx8IHIucHVzaCh0KTtcbiAgICAgICAgfSkpLCBzLmZvckVhY2goKHQgPT4ge1xuICAgICAgICAgICAgaS5oYXModCkgfHwgby5wdXNoKHQpO1xuICAgICAgICB9KSksIHRoaXMuc3luY0VuZ2luZS5NcihyLCBvKS50aGVuKCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNyID0gbjtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBtcih0KSB7XG4gICAgICAgIC8vIFdlIGNoZWNrIHdoZXRoZXIgdGhlIGNsaWVudCB0aGF0IHdyb3RlIHRoaXMgb25saW5lIHN0YXRlIGlzIHN0aWxsIGFjdGl2ZVxuICAgICAgICAvLyBieSBjb21wYXJpbmcgaXRzIGNsaWVudCBJRCB0byB0aGUgbGlzdCBvZiBjbGllbnRzIGtlcHQgYWN0aXZlIGluXG4gICAgICAgIC8vIEluZGV4ZWREYi4gSWYgYSBjbGllbnQgZG9lcyBub3QgdXBkYXRlIHRoZWlyIEluZGV4ZWREYiBjbGllbnQgc3RhdGVcbiAgICAgICAgLy8gd2l0aGluIDUgc2Vjb25kcywgaXQgaXMgY29uc2lkZXJlZCBpbmFjdGl2ZSBhbmQgd2UgZG9uJ3QgZW1pdCBhbiBvbmxpbmVcbiAgICAgICAgLy8gc3RhdGUgZXZlbnQuXG4gICAgICAgIHRoaXMuc3IuZ2V0KHQuY2xpZW50SWQpICYmIHRoaXMub25saW5lU3RhdGVIYW5kbGVyKHQub25saW5lU3RhdGUpO1xuICAgIH1cbiAgICBncih0KSB7XG4gICAgICAgIGxldCBlID0gam4oKTtcbiAgICAgICAgcmV0dXJuIHQuZm9yRWFjaCgoKHQsIG4pID0+IHtcbiAgICAgICAgICAgIGUgPSBlLnVuaW9uV2l0aChuLmFjdGl2ZVRhcmdldElkcyk7XG4gICAgICAgIH0pKSwgZTtcbiAgICB9XG59XG5cbmNsYXNzIHZvIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5PciA9IG5ldyBQbywgdGhpcy4kciA9IHt9LCB0aGlzLm9ubGluZVN0YXRlSGFuZGxlciA9IG51bGwsIHRoaXMuc2VxdWVuY2VOdW1iZXJIYW5kbGVyID0gbnVsbDtcbiAgICB9XG4gICAgYWRkUGVuZGluZ011dGF0aW9uKHQpIHtcbiAgICAgICAgLy8gTm8gb3AuXG4gICAgfVxuICAgIHVwZGF0ZU11dGF0aW9uU3RhdGUodCwgZSwgbikge1xuICAgICAgICAvLyBObyBvcC5cbiAgICB9XG4gICAgYWRkTG9jYWxRdWVyeVRhcmdldCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLk9yLlhpKHQpLCB0aGlzLiRyW3RdIHx8IFwibm90LWN1cnJlbnRcIjtcbiAgICB9XG4gICAgdXBkYXRlUXVlcnlTdGF0ZSh0LCBlLCBuKSB7XG4gICAgICAgIHRoaXMuJHJbdF0gPSBlO1xuICAgIH1cbiAgICByZW1vdmVMb2NhbFF1ZXJ5VGFyZ2V0KHQpIHtcbiAgICAgICAgdGhpcy5Pci5aaSh0KTtcbiAgICB9XG4gICAgaXNMb2NhbFF1ZXJ5VGFyZ2V0KHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuT3IuYWN0aXZlVGFyZ2V0SWRzLmhhcyh0KTtcbiAgICB9XG4gICAgY2xlYXJRdWVyeVN0YXRlKHQpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuJHJbdF07XG4gICAgfVxuICAgIGdldEFsbEFjdGl2ZVF1ZXJ5VGFyZ2V0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuT3IuYWN0aXZlVGFyZ2V0SWRzO1xuICAgIH1cbiAgICBpc0FjdGl2ZVF1ZXJ5VGFyZ2V0KHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuT3IuYWN0aXZlVGFyZ2V0SWRzLmhhcyh0KTtcbiAgICB9XG4gICAgc3RhcnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLk9yID0gbmV3IFBvLCBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgaGFuZGxlVXNlckNoYW5nZSh0LCBlLCBuKSB7XG4gICAgICAgIC8vIE5vIG9wLlxuICAgIH1cbiAgICBzZXRPbmxpbmVTdGF0ZSh0KSB7XG4gICAgICAgIC8vIE5vIG9wLlxuICAgIH1cbiAgICBzaHV0ZG93bigpIHt9XG4gICAgd3JpdGVTZXF1ZW5jZU51bWJlcih0KSB7fVxuICAgIG5vdGlmeUJ1bmRsZUxvYWRlZCgpIHtcbiAgICAgICAgLy8gTm8gb3AuXG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjbGFzcyBTbyB7XG4gICAgRnIodCkge1xuICAgICAgICAvLyBOby1vcC5cbiAgICB9XG4gICAgc2h1dGRvd24oKSB7XG4gICAgICAgIC8vIE5vLW9wLlxuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8vIFJlZmVyZW5jZXMgdG8gYHdpbmRvd2AgYXJlIGd1YXJkZWQgYnkgQnJvd3NlckNvbm5lY3Rpdml0eU1vbml0b3IuaXNBdmFpbGFibGUoKVxuLyogZXNsaW50LWRpc2FibGUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzICovXG4vKipcbiAqIEJyb3dzZXIgaW1wbGVtZW50YXRpb24gb2YgQ29ubmVjdGl2aXR5TW9uaXRvci5cbiAqL1xuY2xhc3MgRG8ge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLkJyID0gKCkgPT4gdGhpcy5McigpLCB0aGlzLnFyID0gKCkgPT4gdGhpcy5VcigpLCB0aGlzLktyID0gW10sIHRoaXMuR3IoKTtcbiAgICB9XG4gICAgRnIodCkge1xuICAgICAgICB0aGlzLktyLnB1c2godCk7XG4gICAgfVxuICAgIHNodXRkb3duKCkge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm9ubGluZVwiLCB0aGlzLkJyKSwgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJvZmZsaW5lXCIsIHRoaXMucXIpO1xuICAgIH1cbiAgICBHcigpIHtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJvbmxpbmVcIiwgdGhpcy5CciksIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwib2ZmbGluZVwiLCB0aGlzLnFyKTtcbiAgICB9XG4gICAgTHIoKSB7XG4gICAgICAgIE8oXCJDb25uZWN0aXZpdHlNb25pdG9yXCIsIFwiTmV0d29yayBjb25uZWN0aXZpdHkgY2hhbmdlZDogQVZBSUxBQkxFXCIpO1xuICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5LcikgdCgwIC8qIEFWQUlMQUJMRSAqLyk7XG4gICAgfVxuICAgIFVyKCkge1xuICAgICAgICBPKFwiQ29ubmVjdGl2aXR5TW9uaXRvclwiLCBcIk5ldHdvcmsgY29ubmVjdGl2aXR5IGNoYW5nZWQ6IFVOQVZBSUxBQkxFXCIpO1xuICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5LcikgdCgxIC8qIFVOQVZBSUxBQkxFICovKTtcbiAgICB9XG4gICAgLy8gVE9ETyhjaGVuYnJpYW4pOiBDb25zaWRlciBwYXNzaW5nIGluIHdpbmRvdyBlaXRoZXIgaW50byB0aGlzIGNvbXBvbmVudCBvclxuICAgIC8vIGhlcmUgZm9yIHRlc3RpbmcgdmlhIEZha2VXaW5kb3cuXG4gICAgLyoqIENoZWNrcyB0aGF0IGFsbCB1c2VkIGF0dHJpYnV0ZXMgb2Ygd2luZG93IGFyZSBhdmFpbGFibGUuICovXG4gICAgc3RhdGljIHZ0KCkge1xuICAgICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2Ygd2luZG93ICYmIHZvaWQgMCAhPT0gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIgJiYgdm9pZCAwICE9PSB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcjtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGNvbnN0IENvID0ge1xuICAgIEJhdGNoR2V0RG9jdW1lbnRzOiBcImJhdGNoR2V0XCIsXG4gICAgQ29tbWl0OiBcImNvbW1pdFwiLFxuICAgIFJ1blF1ZXJ5OiBcInJ1blF1ZXJ5XCJcbn07XG5cbi8qKlxuICogTWFwcyBSUEMgbmFtZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgUkVTVCBlbmRwb2ludCBuYW1lLlxuICpcbiAqIFdlIHVzZSBhcnJheSBub3RhdGlvbiB0byBhdm9pZCBtYW5nbGluZy5cbiAqL1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogUHJvdmlkZXMgYSBzaW1wbGUgaGVscGVyIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgU3RyZWFtIGludGVyZmFjZSB0b1xuICogYnJpZGdlIHRvIG90aGVyIGltcGxlbWVudGF0aW9ucyB0aGF0IGFyZSBzdHJlYW1zIGJ1dCBkbyBub3QgaW1wbGVtZW50IHRoZVxuICogaW50ZXJmYWNlLiBUaGUgc3RyZWFtIGNhbGxiYWNrcyBhcmUgaW52b2tlZCB3aXRoIHRoZSBjYWxsT24uLi4gbWV0aG9kcy5cbiAqL1xuY2xhc3MgeG8ge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5RciA9IHQuUXIsIHRoaXMuanIgPSB0LmpyO1xuICAgIH1cbiAgICBXcih0KSB7XG4gICAgICAgIHRoaXMuenIgPSB0O1xuICAgIH1cbiAgICBIcih0KSB7XG4gICAgICAgIHRoaXMuSnIgPSB0O1xuICAgIH1cbiAgICBvbk1lc3NhZ2UodCkge1xuICAgICAgICB0aGlzLllyID0gdDtcbiAgICB9XG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMuanIoKTtcbiAgICB9XG4gICAgc2VuZCh0KSB7XG4gICAgICAgIHRoaXMuUXIodCk7XG4gICAgfVxuICAgIFhyKCkge1xuICAgICAgICB0aGlzLnpyKCk7XG4gICAgfVxuICAgIFpyKHQpIHtcbiAgICAgICAgdGhpcy5Kcih0KTtcbiAgICB9XG4gICAgZW8odCkge1xuICAgICAgICB0aGlzLllyKHQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gY2xhc3MgTm8gZXh0ZW5kcyBcbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgYWxsIFJlc3QtYmFzZWQgY29ubmVjdGlvbnMgdG8gdGhlIGJhY2tlbmQgKFdlYkNoYW5uZWwgYW5kXG4gKiBIVFRQKS5cbiAqL1xuY2xhc3Mge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5kYXRhYmFzZUluZm8gPSB0LCB0aGlzLmRhdGFiYXNlSWQgPSB0LmRhdGFiYXNlSWQ7XG4gICAgICAgIGNvbnN0IGUgPSB0LnNzbCA/IFwiaHR0cHNcIiA6IFwiaHR0cFwiO1xuICAgICAgICB0aGlzLm5vID0gZSArIFwiOi8vXCIgKyB0Lmhvc3QsIHRoaXMuc28gPSBcInByb2plY3RzL1wiICsgdGhpcy5kYXRhYmFzZUlkLnByb2plY3RJZCArIFwiL2RhdGFiYXNlcy9cIiArIHRoaXMuZGF0YWJhc2VJZC5kYXRhYmFzZSArIFwiL2RvY3VtZW50c1wiO1xuICAgIH1cbiAgICBpbyh0LCBlLCBuLCBzLCBpKSB7XG4gICAgICAgIGNvbnN0IHIgPSB0aGlzLnJvKHQsIGUpO1xuICAgICAgICBPKFwiUmVzdENvbm5lY3Rpb25cIiwgXCJTZW5kaW5nOiBcIiwgciwgbik7XG4gICAgICAgIGNvbnN0IG8gPSB7fTtcbiAgICAgICAgcmV0dXJuIHRoaXMub28obywgcywgaSksIHRoaXMuYW8odCwgciwgbywgbikudGhlbigodCA9PiAoTyhcIlJlc3RDb25uZWN0aW9uXCIsIFwiUmVjZWl2ZWQ6IFwiLCB0KSwgXG4gICAgICAgIHQpKSwgKGUgPT4ge1xuICAgICAgICAgICAgdGhyb3cgRihcIlJlc3RDb25uZWN0aW9uXCIsIGAke3R9IGZhaWxlZCB3aXRoIGVycm9yOiBgLCBlLCBcInVybDogXCIsIHIsIFwicmVxdWVzdDpcIiwgbiksIFxuICAgICAgICAgICAgZTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICB1byh0LCBlLCBuLCBzLCBpKSB7XG4gICAgICAgIC8vIFRoZSBSRVNUIEFQSSBhdXRvbWF0aWNhbGx5IGFnZ3JlZ2F0ZXMgYWxsIG9mIHRoZSBzdHJlYW1lZCByZXN1bHRzLCBzbyB3ZVxuICAgICAgICAvLyBjYW4ganVzdCB1c2UgdGhlIG5vcm1hbCBpbnZva2UoKSBtZXRob2QuXG4gICAgICAgIHJldHVybiB0aGlzLmlvKHQsIGUsIG4sIHMsIGkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNb2RpZmllcyB0aGUgaGVhZGVycyBmb3IgYSByZXF1ZXN0LCBhZGRpbmcgYW55IGF1dGhvcml6YXRpb24gdG9rZW4gaWZcbiAgICAgKiBwcmVzZW50IGFuZCBhbnkgYWRkaXRpb25hbCBoZWFkZXJzIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKi8gICAgb28odCwgZSwgbikge1xuICAgICAgICB0W1wiWC1Hb29nLUFwaS1DbGllbnRcIl0gPSBcImdsLWpzLyBmaXJlL1wiICsgeCwgXG4gICAgICAgIC8vIENvbnRlbnQtVHlwZTogdGV4dC9wbGFpbiB3aWxsIGF2b2lkIHByZWZsaWdodCByZXF1ZXN0cyB3aGljaCBtaWdodFxuICAgICAgICAvLyBtZXNzIHdpdGggQ09SUyBhbmQgcmVkaXJlY3RzIGJ5IHByb3hpZXMuIElmIHdlIGFkZCBjdXN0b20gaGVhZGVyc1xuICAgICAgICAvLyB3ZSB3aWxsIG5lZWQgdG8gY2hhbmdlIHRoaXMgY29kZSB0byBwb3RlbnRpYWxseSB1c2UgdGhlICRodHRwT3ZlcndyaXRlXG4gICAgICAgIC8vIHBhcmFtZXRlciBzdXBwb3J0ZWQgYnkgRVNGIHRvIGF2b2lkIHRyaWdnZXJpbmcgcHJlZmxpZ2h0IHJlcXVlc3RzLlxuICAgICAgICB0W1wiQ29udGVudC1UeXBlXCJdID0gXCJ0ZXh0L3BsYWluXCIsIHRoaXMuZGF0YWJhc2VJbmZvLmFwcElkICYmICh0W1wiWC1GaXJlYmFzZS1HTVBJRFwiXSA9IHRoaXMuZGF0YWJhc2VJbmZvLmFwcElkKSwgXG4gICAgICAgIGUgJiYgZS5oZWFkZXJzLmZvckVhY2goKChlLCBuKSA9PiB0W25dID0gZSkpLCBuICYmIG4uaGVhZGVycy5mb3JFYWNoKCgoZSwgbikgPT4gdFtuXSA9IGUpKTtcbiAgICB9XG4gICAgcm8odCwgZSkge1xuICAgICAgICBjb25zdCBuID0gQ29bdF07XG4gICAgICAgIHJldHVybiBgJHt0aGlzLm5vfS92MS8ke2V9OiR7bn1gO1xuICAgIH1cbn0ge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgc3VwZXIodCksIHRoaXMuZm9yY2VMb25nUG9sbGluZyA9IHQuZm9yY2VMb25nUG9sbGluZywgdGhpcy5hdXRvRGV0ZWN0TG9uZ1BvbGxpbmcgPSB0LmF1dG9EZXRlY3RMb25nUG9sbGluZywgXG4gICAgICAgIHRoaXMudXNlRmV0Y2hTdHJlYW1zID0gdC51c2VGZXRjaFN0cmVhbXM7XG4gICAgfVxuICAgIGFvKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKCgoaSwgcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgbyA9IG5ldyBYaHJJbztcbiAgICAgICAgICAgIG8ubGlzdGVuT25jZShFdmVudFR5cGUuQ09NUExFVEUsICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvLmdldExhc3RFcnJvckNvZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2RlLk5PX0VSUk9SOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IG8uZ2V0UmVzcG9uc2VKc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBPKFwiQ29ubmVjdGlvblwiLCBcIlhIUiByZWNlaXZlZDpcIiwgSlNPTi5zdHJpbmdpZnkoZSkpLCBpKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIEVycm9yQ29kZS5USU1FT1VUOlxuICAgICAgICAgICAgICAgICAgICAgICAgTyhcIkNvbm5lY3Rpb25cIiwgJ1JQQyBcIicgKyB0ICsgJ1wiIHRpbWVkIG91dCcpLCByKG5ldyBRKEcuREVBRExJTkVfRVhDRUVERUQsIFwiUmVxdWVzdCB0aW1lIG91dFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2RlLkhUVFBfRVJST1I6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gby5nZXRTdGF0dXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPKFwiQ29ubmVjdGlvblwiLCAnUlBDIFwiJyArIHQgKyAnXCIgZmFpbGVkIHdpdGggc3RhdHVzOicsIG4sIFwicmVzcG9uc2UgdGV4dDpcIiwgby5nZXRSZXNwb25zZVRleHQoKSksIFxuICAgICAgICAgICAgICAgICAgICAgICAgbiA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gby5nZXRSZXNwb25zZUpzb24oKS5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiB0LnN0YXR1cyAmJiB0Lm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXy9nLCBcIi1cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhHKS5pbmRleE9mKGUpID49IDAgPyBlIDogRy5VTktOT1dOO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHQuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcihuZXcgUShlLCB0Lm1lc3NhZ2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgcihuZXcgUShHLlVOS05PV04sIFwiU2VydmVyIHJlc3BvbmRlZCB3aXRoIHN0YXR1cyBcIiArIG8uZ2V0U3RhdHVzKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIHJlY2VpdmVkIGFuIEhUVFBfRVJST1IgYnV0IHRoZXJlJ3Mgbm8gc3RhdHVzIGNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIG1vc3QgcHJvYmFibHkgYSBjb25uZWN0aW9uIGlzc3VlXG4gICAgICAgICAgICAgICAgICAgICAgICByKG5ldyBRKEcuVU5BVkFJTEFCTEUsIFwiQ29ubmVjdGlvbiBmYWlsZWQuXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIEwoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIE8oXCJDb25uZWN0aW9uXCIsICdSUEMgXCInICsgdCArICdcIiBjb21wbGV0ZWQuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgY29uc3QgYSA9IEpTT04uc3RyaW5naWZ5KHMpO1xuICAgICAgICAgICAgby5zZW5kKGUsIFwiUE9TVFwiLCBhLCBuLCAxNSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgY28odCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gWyB0aGlzLm5vLCBcIi9cIiwgXCJnb29nbGUuZmlyZXN0b3JlLnYxLkZpcmVzdG9yZVwiLCBcIi9cIiwgdCwgXCIvY2hhbm5lbFwiIF0sIGkgPSBjcmVhdGVXZWJDaGFubmVsVHJhbnNwb3J0KCksIHIgPSBnZXRTdGF0RXZlbnRUYXJnZXQoKSwgbyA9IHtcbiAgICAgICAgICAgIC8vIFJlcXVpcmVkIGZvciBiYWNrZW5kIHN0aWNraW5lc3MsIHJvdXRpbmcgYmVoYXZpb3IgaXMgYmFzZWQgb24gdGhpc1xuICAgICAgICAgICAgLy8gcGFyYW1ldGVyLlxuICAgICAgICAgICAgaHR0cFNlc3Npb25JZFBhcmFtOiBcImdzZXNzaW9uaWRcIixcbiAgICAgICAgICAgIGluaXRNZXNzYWdlSGVhZGVyczoge30sXG4gICAgICAgICAgICBtZXNzYWdlVXJsUGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBwYXJhbSBpcyB1c2VkIHRvIGltcHJvdmUgcm91dGluZyBhbmQgcHJvamVjdCBpc29sYXRpb24gYnkgdGhlXG4gICAgICAgICAgICAgICAgLy8gYmFja2VuZCBhbmQgbXVzdCBiZSBpbmNsdWRlZCBpbiBldmVyeSByZXF1ZXN0LlxuICAgICAgICAgICAgICAgIGRhdGFiYXNlOiBgcHJvamVjdHMvJHt0aGlzLmRhdGFiYXNlSWQucHJvamVjdElkfS9kYXRhYmFzZXMvJHt0aGlzLmRhdGFiYXNlSWQuZGF0YWJhc2V9YFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlbmRSYXdKc29uOiAhMCxcbiAgICAgICAgICAgIHN1cHBvcnRzQ3Jvc3NEb21haW5YaHI6ICEwLFxuICAgICAgICAgICAgaW50ZXJuYWxDaGFubmVsUGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgLy8gT3ZlcnJpZGUgdGhlIGRlZmF1bHQgdGltZW91dCAocmFuZG9taXplZCBiZXR3ZWVuIDEwLTIwIHNlY29uZHMpIHNpbmNlXG4gICAgICAgICAgICAgICAgLy8gYSBsYXJnZSB3cml0ZSBiYXRjaCBvbiBhIHNsb3cgaW50ZXJuZXQgY29ubmVjdGlvbiBtYXkgdGFrZSBhIGxvbmdcbiAgICAgICAgICAgICAgICAvLyB0aW1lIHRvIHNlbmQgdG8gdGhlIGJhY2tlbmQuIFJhdGhlciB0aGFuIGhhdmUgV2ViQ2hhbm5lbCBpbXBvc2UgYVxuICAgICAgICAgICAgICAgIC8vIHRpZ2h0IHRpbWVvdXQgd2hpY2ggY291bGQgbGVhZCB0byBpbmZpbml0ZSB0aW1lb3V0cyBhbmQgcmV0cmllcywgd2VcbiAgICAgICAgICAgICAgICAvLyBzZXQgaXQgdmVyeSBsYXJnZSAoNS0xMCBtaW51dGVzKSBhbmQgcmVseSBvbiB0aGUgYnJvd3NlcidzIGJ1aWx0aW5cbiAgICAgICAgICAgICAgICAvLyB0aW1lb3V0cyB0byBraWNrIGluIGlmIHRoZSByZXF1ZXN0IGlzbid0IHdvcmtpbmcuXG4gICAgICAgICAgICAgICAgZm9yd2FyZENoYW5uZWxSZXF1ZXN0VGltZW91dE1zOiA2ZTVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmb3JjZUxvbmdQb2xsaW5nOiB0aGlzLmZvcmNlTG9uZ1BvbGxpbmcsXG4gICAgICAgICAgICBkZXRlY3RCdWZmZXJpbmdQcm94eTogdGhpcy5hdXRvRGV0ZWN0TG9uZ1BvbGxpbmdcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy51c2VGZXRjaFN0cmVhbXMgJiYgKG8ueG1sSHR0cEZhY3RvcnkgPSBuZXcgRmV0Y2hYbWxIdHRwRmFjdG9yeSh7fSkpLCB0aGlzLm9vKG8uaW5pdE1lc3NhZ2VIZWFkZXJzLCBlLCBuKSwgXG4gICAgICAgIC8vIFNlbmRpbmcgdGhlIGN1c3RvbSBoZWFkZXJzIHdlIGp1c3QgYWRkZWQgdG8gcmVxdWVzdC5pbml0TWVzc2FnZUhlYWRlcnNcbiAgICAgICAgLy8gKEF1dGhvcml6YXRpb24sIGV0Yy4pIHdpbGwgdHJpZ2dlciB0aGUgYnJvd3NlciB0byBtYWtlIGEgQ09SUyBwcmVmbGlnaHRcbiAgICAgICAgLy8gcmVxdWVzdCBiZWNhdXNlIHRoZSBYSFIgd2lsbCBubyBsb25nZXIgbWVldCB0aGUgY3JpdGVyaWEgZm9yIGEgXCJzaW1wbGVcIlxuICAgICAgICAvLyBDT1JTIHJlcXVlc3Q6XG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvQ09SUyNTaW1wbGVfcmVxdWVzdHNcbiAgICAgICAgLy8gVGhlcmVmb3JlIHRvIGF2b2lkIHRoZSBDT1JTIHByZWZsaWdodCByZXF1ZXN0IChhbiBleHRyYSBuZXR3b3JrXG4gICAgICAgIC8vIHJvdW5kdHJpcCksIHdlIHVzZSB0aGUgaHR0cEhlYWRlcnNPdmVyd3JpdGVQYXJhbSBvcHRpb24gdG8gc3BlY2lmeSB0aGF0XG4gICAgICAgIC8vIHRoZSBoZWFkZXJzIHNob3VsZCBpbnN0ZWFkIGJlIGVuY29kZWQgaW50byBhIHNwZWNpYWwgXCIkaHR0cEhlYWRlcnNcIiBxdWVyeVxuICAgICAgICAvLyBwYXJhbWV0ZXIsIHdoaWNoIGlzIHJlY29nbml6ZWQgYnkgdGhlIHdlYmNoYW5uZWwgYmFja2VuZC4gVGhpcyBpc1xuICAgICAgICAvLyBmb3JtYWxseSBkZWZpbmVkIGhlcmU6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1saWJyYXJ5L2Jsb2IvYjBlMTgxNWIxM2ZiOTJhNDZkN2M5YjNjMzBkZTVkNmEzOTZhMzI0NS9jbG9zdXJlL2dvb2cvbmV0L3JwYy9odHRwY29ycy5qcyNMMzJcbiAgICAgICAgLy8gVE9ETyhiLzE0NTYyNDc1Nik6IFRoZXJlIGlzIGEgYmFja2VuZCBidWcgd2hlcmUgJGh0dHBIZWFkZXJzIGlzbid0IHJlc3BlY3RlZCBpZiB0aGUgcmVxdWVzdFxuICAgICAgICAvLyBkb2Vzbid0IGhhdmUgYW4gT3JpZ2luIGhlYWRlci4gU28gd2UgaGF2ZSB0byBleGNsdWRlIGEgZmV3IGJyb3dzZXIgZW52aXJvbm1lbnRzIHRoYXQgYXJlXG4gICAgICAgIC8vIGtub3duIHRvIChzb21ldGltZXMpIG5vdCBpbmNsdWRlIGFuIE9yaWdpbi4gU2VlXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9maXJlYmFzZS9maXJlYmFzZS1qcy1zZGsvaXNzdWVzLzE0OTEuXG4gICAgICAgIGlzTW9iaWxlQ29yZG92YSgpIHx8IGlzUmVhY3ROYXRpdmUoKSB8fCBpc0VsZWN0cm9uKCkgfHwgaXNJRSgpIHx8IGlzVVdQKCkgfHwgaXNCcm93c2VyRXh0ZW5zaW9uKCkgfHwgKG8uaHR0cEhlYWRlcnNPdmVyd3JpdGVQYXJhbSA9IFwiJGh0dHBIZWFkZXJzXCIpO1xuICAgICAgICBjb25zdCBhID0gcy5qb2luKFwiXCIpO1xuICAgICAgICBPKFwiQ29ubmVjdGlvblwiLCBcIkNyZWF0aW5nIFdlYkNoYW5uZWw6IFwiICsgYSwgbyk7XG4gICAgICAgIGNvbnN0IHUgPSBpLmNyZWF0ZVdlYkNoYW5uZWwoYSwgbyk7XG4gICAgICAgIC8vIFdlYkNoYW5uZWwgc3VwcG9ydHMgc2VuZGluZyB0aGUgZmlyc3QgbWVzc2FnZSB3aXRoIHRoZSBoYW5kc2hha2UgLSBzYXZpbmdcbiAgICAgICAgLy8gYSBuZXR3b3JrIHJvdW5kIHRyaXAuIEhvd2V2ZXIsIGl0IHdpbGwgaGF2ZSB0byBjYWxsIHNlbmQgaW4gdGhlIHNhbWVcbiAgICAgICAgLy8gSlMgZXZlbnQgbG9vcCBhcyBvcGVuLiBJbiBvcmRlciB0byBlbmZvcmNlIHRoaXMsIHdlIGRlbGF5IGFjdHVhbGx5XG4gICAgICAgIC8vIG9wZW5pbmcgdGhlIFdlYkNoYW5uZWwgdW50aWwgc2VuZCBpcyBjYWxsZWQuIFdoZXRoZXIgd2UgaGF2ZSBjYWxsZWRcbiAgICAgICAgLy8gb3BlbiBpcyB0cmFja2VkIHdpdGggdGhpcyB2YXJpYWJsZS5cbiAgICAgICAgICAgICAgICBsZXQgYyA9ICExLCBoID0gITE7XG4gICAgICAgIC8vIEEgZmxhZyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgc3RyZWFtIHdhcyBjbG9zZWQgKGJ5IHVzIG9yIHRocm91Z2ggYW5cbiAgICAgICAgLy8gZXJyb3IvY2xvc2UgZXZlbnQpIHRvIGF2b2lkIGRlbGl2ZXJpbmcgbXVsdGlwbGUgY2xvc2UgZXZlbnRzIG9yIHNlbmRpbmdcbiAgICAgICAgLy8gb24gYSBjbG9zZWQgc3RyZWFtXG4gICAgICAgICAgICAgICAgY29uc3QgbCA9IG5ldyB4byh7XG4gICAgICAgICAgICBRcjogdCA9PiB7XG4gICAgICAgICAgICAgICAgaCA/IE8oXCJDb25uZWN0aW9uXCIsIFwiTm90IHNlbmRpbmcgYmVjYXVzZSBXZWJDaGFubmVsIGlzIGNsb3NlZDpcIiwgdCkgOiAoYyB8fCAoTyhcIkNvbm5lY3Rpb25cIiwgXCJPcGVuaW5nIFdlYkNoYW5uZWwgdHJhbnNwb3J0LlwiKSwgXG4gICAgICAgICAgICAgICAgdS5vcGVuKCksIGMgPSAhMCksIE8oXCJDb25uZWN0aW9uXCIsIFwiV2ViQ2hhbm5lbCBzZW5kaW5nOlwiLCB0KSwgdS5zZW5kKHQpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBqcjogKCkgPT4gdS5jbG9zZSgpXG4gICAgICAgIH0pLCB5ID0gKHQsIGUsIG4pID0+IHtcbiAgICAgICAgICAgIC8vIFRPRE8oZGltb25kKTogY2xvc3VyZSB0eXBpbmcgc2VlbXMgYnJva2VuIGJlY2F1c2UgV2ViQ2hhbm5lbCBkb2VzXG4gICAgICAgICAgICAvLyBub3QgaW1wbGVtZW50IGdvb2cuZXZlbnRzLkxpc3RlbmFibGVcbiAgICAgICAgICAgIHQubGlzdGVuKGUsICh0ID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBuKHQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdDtcbiAgICAgICAgICAgICAgICAgICAgfSksIDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gQ2xvc3VyZSBldmVudHMgYXJlIGd1YXJkZWQgYW5kIGV4Y2VwdGlvbnMgYXJlIHN3YWxsb3dlZCwgc28gY2F0Y2ggYW55XG4gICAgICAgIC8vIGV4Y2VwdGlvbiBhbmQgcmV0aHJvdyB1c2luZyBhIHNldFRpbWVvdXQgc28gdGhleSBiZWNvbWUgdmlzaWJsZSBhZ2Fpbi5cbiAgICAgICAgLy8gTm90ZSB0aGF0IGV2ZW50dWFsbHkgdGhpcyBmdW5jdGlvbiBjb3VsZCBnbyBhd2F5IGlmIHdlIGFyZSBjb25maWRlbnRcbiAgICAgICAgLy8gZW5vdWdoIHRoZSBjb2RlIGlzIGV4Y2VwdGlvbiBmcmVlLlxuICAgICAgICAgICAgICAgIHJldHVybiB5KHUsIFdlYkNoYW5uZWwuRXZlbnRUeXBlLk9QRU4sICgoKSA9PiB7XG4gICAgICAgICAgICBoIHx8IE8oXCJDb25uZWN0aW9uXCIsIFwiV2ViQ2hhbm5lbCB0cmFuc3BvcnQgb3BlbmVkLlwiKTtcbiAgICAgICAgfSkpLCB5KHUsIFdlYkNoYW5uZWwuRXZlbnRUeXBlLkNMT1NFLCAoKCkgPT4ge1xuICAgICAgICAgICAgaCB8fCAoaCA9ICEwLCBPKFwiQ29ubmVjdGlvblwiLCBcIldlYkNoYW5uZWwgdHJhbnNwb3J0IGNsb3NlZFwiKSwgbC5acigpKTtcbiAgICAgICAgfSkpLCB5KHUsIFdlYkNoYW5uZWwuRXZlbnRUeXBlLkVSUk9SLCAodCA9PiB7XG4gICAgICAgICAgICBoIHx8IChoID0gITAsIEYoXCJDb25uZWN0aW9uXCIsIFwiV2ViQ2hhbm5lbCB0cmFuc3BvcnQgZXJyb3JlZDpcIiwgdCksIGwuWnIobmV3IFEoRy5VTkFWQUlMQUJMRSwgXCJUaGUgb3BlcmF0aW9uIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWRcIikpKTtcbiAgICAgICAgfSkpLCB5KHUsIFdlYkNoYW5uZWwuRXZlbnRUeXBlLk1FU1NBR0UsICh0ID0+IHtcbiAgICAgICAgICAgIHZhciBlO1xuICAgICAgICAgICAgaWYgKCFoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbiA9IHQuZGF0YVswXTtcbiAgICAgICAgICAgICAgICBxKCEhbik7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyhiLzM1MTQzODkxKTogVGhlcmUgaXMgYSBidWcgaW4gT25lIFBsYXRmb3JtIHRoYXQgY2F1c2VkIGVycm9yc1xuICAgICAgICAgICAgICAgIC8vIChhbmQgb25seSBlcnJvcnMpIHRvIGJlIHdyYXBwZWQgaW4gYW4gZXh0cmEgYXJyYXkuIFRvIGJlIGZvcndhcmRcbiAgICAgICAgICAgICAgICAvLyBjb21wYXRpYmxlIHdpdGggdGhlIGJ1ZyB3ZSBuZWVkIHRvIGNoZWNrIGVpdGhlciBjb25kaXRpb24uIFRoZSBsYXR0ZXJcbiAgICAgICAgICAgICAgICAvLyBjYW4gYmUgcmVtb3ZlZCBvbmNlIHRoZSBmaXggaGFzIGJlZW4gcm9sbGVkIG91dC5cbiAgICAgICAgICAgICAgICAvLyBVc2UgYW55IGJlY2F1c2UgbXNnRGF0YS5lcnJvciBpcyBub3QgdHlwZWQuXG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IG4sIGkgPSBzLmVycm9yIHx8IChudWxsID09PSAoZSA9IHNbMF0pIHx8IHZvaWQgMCA9PT0gZSA/IHZvaWQgMCA6IGUuZXJyb3IpO1xuICAgICAgICAgICAgICAgIGlmIChpKSB7XG4gICAgICAgICAgICAgICAgICAgIE8oXCJDb25uZWN0aW9uXCIsIFwiV2ViQ2hhbm5lbCByZWNlaXZlZCBlcnJvcjpcIiwgaSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVycm9yLnN0YXR1cyB3aWxsIGJlIGEgc3RyaW5nIGxpa2UgJ09LJyBvciAnTk9UX0ZPVU5EJy5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGkuc3RhdHVzO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZSA9IFxuICAgICAgICAgICAgICAgICAgICAvKipcbiAqIE1hcHMgYW4gZXJyb3IgQ29kZSBmcm9tIGEgR1JQQyBzdGF0dXMgaWRlbnRpZmllciBsaWtlICdOT1RfRk9VTkQnLlxuICpcbiAqIEByZXR1cm5zIFRoZSBDb2RlIGVxdWl2YWxlbnQgdG8gdGhlIGdpdmVuIHN0YXR1cyBzdHJpbmcgb3IgdW5kZWZpbmVkIGlmXG4gKiAgICAgdGhlcmUgaXMgbm8gbWF0Y2guXG4gKi9cbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9va3VwIGJ5IHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBQblt0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgIT09IGUpIHJldHVybiBTbihlKTtcbiAgICAgICAgICAgICAgICAgICAgfSh0KSwgbiA9IGkubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgdm9pZCAwID09PSBlICYmIChlID0gRy5JTlRFUk5BTCwgbiA9IFwiVW5rbm93biBlcnJvciBzdGF0dXM6IFwiICsgdCArIFwiIHdpdGggbWVzc2FnZSBcIiArIGkubWVzc2FnZSksIFxuICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIGNsb3NlZCBzbyBubyBmdXJ0aGVyIGV2ZW50cyBhcmUgcHJvcGFnYXRlZFxuICAgICAgICAgICAgICAgICAgICBoID0gITAsIGwuWnIobmV3IFEoZSwgbikpLCB1LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIE8oXCJDb25uZWN0aW9uXCIsIFwiV2ViQ2hhbm5lbCByZWNlaXZlZDpcIiwgbiksIGwuZW8obik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKSwgeShyLCBFdmVudC5TVEFUX0VWRU5ULCAodCA9PiB7XG4gICAgICAgICAgICB0LnN0YXQgPT09IFN0YXQuUFJPWFkgPyBPKFwiQ29ubmVjdGlvblwiLCBcIkRldGVjdGVkIGJ1ZmZlcmluZyBwcm94eVwiKSA6IHQuc3RhdCA9PT0gU3RhdC5OT1BST1hZICYmIE8oXCJDb25uZWN0aW9uXCIsIFwiRGV0ZWN0ZWQgbm8gYnVmZmVyaW5nIHByb3h5XCIpO1xuICAgICAgICB9KSksIHNldFRpbWVvdXQoKCgpID0+IHtcbiAgICAgICAgICAgIC8vIFRlY2huaWNhbGx5IHdlIGNvdWxkL3Nob3VsZCB3YWl0IGZvciB0aGUgV2ViQ2hhbm5lbCBvcGVuZWQgZXZlbnQsXG4gICAgICAgICAgICAvLyBidXQgYmVjYXVzZSB3ZSB3YW50IHRvIHNlbmQgdGhlIGZpcnN0IG1lc3NhZ2Ugd2l0aCB0aGUgV2ViQ2hhbm5lbFxuICAgICAgICAgICAgLy8gaGFuZHNoYWtlIHdlIHByZXRlbmQgdGhlIGNoYW5uZWwgb3BlbmVkIGhlcmUgKGFzeW5jaHJvbm91c2x5KSwgYW5kXG4gICAgICAgICAgICAvLyB0aGVuIGRlbGF5IHRoZSBhY3R1YWwgb3BlbiB1bnRpbCB0aGUgZmlyc3QgbWVzc2FnZSBpcyBzZW50LlxuICAgICAgICAgICAgbC5YcigpO1xuICAgICAgICB9KSwgMCksIGw7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqIEluaXRpYWxpemVzIHRoZSBXZWJDaGFubmVsQ29ubmVjdGlvbiBmb3IgdGhlIGJyb3dzZXIuICovXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqIFRoZSBQbGF0Zm9ybSdzICd3aW5kb3cnIGltcGxlbWVudGF0aW9uIG9yIG51bGwgaWYgbm90IGF2YWlsYWJsZS4gKi9cbmZ1bmN0aW9uIGtvKCkge1xuICAgIC8vIGB3aW5kb3dgIGlzIG5vdCBhbHdheXMgYXZhaWxhYmxlLCBlLmcuIGluIFJlYWN0TmF0aXZlIGFuZCBXZWJXb3JrZXJzLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHNcbiAgICByZXR1cm4gXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2Ygd2luZG93ID8gd2luZG93IDogbnVsbDtcbn1cblxuLyoqIFRoZSBQbGF0Zm9ybSdzICdkb2N1bWVudCcgaW1wbGVtZW50YXRpb24gb3IgbnVsbCBpZiBub3QgYXZhaWxhYmxlLiAqLyBmdW5jdGlvbiBNbygpIHtcbiAgICAvLyBgZG9jdW1lbnRgIGlzIG5vdCBhbHdheXMgYXZhaWxhYmxlLCBlLmcuIGluIFJlYWN0TmF0aXZlIGFuZCBXZWJXb3JrZXJzLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHNcbiAgICByZXR1cm4gXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgZG9jdW1lbnQgPyBkb2N1bWVudCA6IG51bGw7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGZ1bmN0aW9uIE9vKHQpIHtcbiAgICByZXR1cm4gbmV3IGlzKHQsIC8qIHVzZVByb3RvM0pzb249ICovICEwKTtcbn1cblxuLyoqXG4gKiBBbiBpbnN0YW5jZSBvZiB0aGUgUGxhdGZvcm0ncyAnVGV4dEVuY29kZXInIGltcGxlbWVudGF0aW9uLlxuICovXG4vKipcbiAqIEEgaGVscGVyIGZvciBydW5uaW5nIGRlbGF5ZWQgdGFza3MgZm9sbG93aW5nIGFuIGV4cG9uZW50aWFsIGJhY2tvZmYgY3VydmVcbiAqIGJldHdlZW4gYXR0ZW1wdHMuXG4gKlxuICogRWFjaCBkZWxheSBpcyBtYWRlIHVwIG9mIGEgXCJiYXNlXCIgZGVsYXkgd2hpY2ggZm9sbG93cyB0aGUgZXhwb25lbnRpYWxcbiAqIGJhY2tvZmYgY3VydmUsIGFuZCBhICsvLSA1MCUgXCJqaXR0ZXJcIiB0aGF0IGlzIGNhbGN1bGF0ZWQgYW5kIGFkZGVkIHRvIHRoZVxuICogYmFzZSBkZWxheS4gVGhpcyBwcmV2ZW50cyBjbGllbnRzIGZyb20gYWNjaWRlbnRhbGx5IHN5bmNocm9uaXppbmcgdGhlaXJcbiAqIGRlbGF5cyBjYXVzaW5nIHNwaWtlcyBvZiBsb2FkIHRvIHRoZSBiYWNrZW5kLlxuICovXG5jbGFzcyAkbyB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogVGhlIEFzeW5jUXVldWUgdG8gcnVuIGJhY2tvZmYgb3BlcmF0aW9ucyBvbi5cbiAgICAgKi9cbiAgICB0LCBcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgdG8gdXNlIHdoZW4gc2NoZWR1bGluZyBiYWNrb2ZmIG9wZXJhdGlvbnMgb24gdGhlIEFzeW5jUXVldWUuXG4gICAgICovXG4gICAgZSwgXG4gICAgLyoqXG4gICAgICogVGhlIGluaXRpYWwgZGVsYXkgKHVzZWQgYXMgdGhlIGJhc2UgZGVsYXkgb24gdGhlIGZpcnN0IHJldHJ5IGF0dGVtcHQpLlxuICAgICAqIE5vdGUgdGhhdCBqaXR0ZXIgd2lsbCBzdGlsbCBiZSBhcHBsaWVkLCBzbyB0aGUgYWN0dWFsIGRlbGF5IGNvdWxkIGJlIGFzXG4gICAgICogbGl0dGxlIGFzIDAuNSppbml0aWFsRGVsYXlNcy5cbiAgICAgKi9cbiAgICBuID0gMWUzXG4gICAgLyoqXG4gICAgICogVGhlIG11bHRpcGxpZXIgdG8gdXNlIHRvIGRldGVybWluZSB0aGUgZXh0ZW5kZWQgYmFzZSBkZWxheSBhZnRlciBlYWNoXG4gICAgICogYXR0ZW1wdC5cbiAgICAgKi8gLCBzID0gMS41XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gYmFzZSBkZWxheSBhZnRlciB3aGljaCBubyBmdXJ0aGVyIGJhY2tvZmYgaXMgcGVyZm9ybWVkLlxuICAgICAqIE5vdGUgdGhhdCBqaXR0ZXIgd2lsbCBzdGlsbCBiZSBhcHBsaWVkLCBzbyB0aGUgYWN0dWFsIGRlbGF5IGNvdWxkIGJlIGFzXG4gICAgICogbXVjaCBhcyAxLjUqbWF4RGVsYXlNcy5cbiAgICAgKi8gLCBpID0gNmU0KSB7XG4gICAgICAgIHRoaXMuSG4gPSB0LCB0aGlzLnRpbWVySWQgPSBlLCB0aGlzLmhvID0gbiwgdGhpcy5sbyA9IHMsIHRoaXMuZm8gPSBpLCB0aGlzLl9vID0gMCwgXG4gICAgICAgIHRoaXMud28gPSBudWxsLCBcbiAgICAgICAgLyoqIFRoZSBsYXN0IGJhY2tvZmYgYXR0ZW1wdCwgYXMgZXBvY2ggbWlsbGlzZWNvbmRzLiAqL1xuICAgICAgICB0aGlzLm1vID0gRGF0ZS5ub3coKSwgdGhpcy5yZXNldCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIGJhY2tvZmYgZGVsYXkuXG4gICAgICpcbiAgICAgKiBUaGUgdmVyeSBuZXh0IGJhY2tvZmZBbmRXYWl0KCkgd2lsbCBoYXZlIG5vIGRlbGF5LiBJZiBpdCBpcyBjYWxsZWQgYWdhaW5cbiAgICAgKiAoaS5lLiBkdWUgdG8gYW4gZXJyb3IpLCBpbml0aWFsRGVsYXlNcyAocGx1cyBqaXR0ZXIpIHdpbGwgYmUgdXNlZCwgYW5kXG4gICAgICogc3Vic2VxdWVudCBvbmVzIHdpbGwgaW5jcmVhc2UgYWNjb3JkaW5nIHRvIHRoZSBiYWNrb2ZmRmFjdG9yLlxuICAgICAqLyAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5fbyA9IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgYmFja29mZiBkZWxheSB0byB0aGUgbWF4aW11bSBkZWxheSAoZS5nLiBmb3IgdXNlIGFmdGVyIGFcbiAgICAgKiBSRVNPVVJDRV9FWEhBVVNURUQgZXJyb3IpLlxuICAgICAqLyAgICB5bygpIHtcbiAgICAgICAgdGhpcy5fbyA9IHRoaXMuZm87XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgY3VycmVudERlbGF5TXMsIGFuZCBpbmNyZWFzZXMgdGhlXG4gICAgICogZGVsYXkgZm9yIGFueSBzdWJzZXF1ZW50IGF0dGVtcHRzLiBJZiB0aGVyZSB3YXMgYSBwZW5kaW5nIGJhY2tvZmYgb3BlcmF0aW9uXG4gICAgICogYWxyZWFkeSwgaXQgd2lsbCBiZSBjYW5jZWxlZC5cbiAgICAgKi8gICAgcG8odCkge1xuICAgICAgICAvLyBDYW5jZWwgYW55IHBlbmRpbmcgYmFja29mZiBvcGVyYXRpb24uXG4gICAgICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgICAgIC8vIEZpcnN0IHNjaGVkdWxlIHVzaW5nIHRoZSBjdXJyZW50IGJhc2UgKHdoaWNoIG1heSBiZSAwIGFuZCBzaG91bGQgYmVcbiAgICAgICAgLy8gaG9ub3JlZCBhcyBzdWNoKS5cbiAgICAgICAgY29uc3QgZSA9IE1hdGguZmxvb3IodGhpcy5fbyArIHRoaXMuSW8oKSksIG4gPSBNYXRoLm1heCgwLCBEYXRlLm5vdygpIC0gdGhpcy5tbyksIHMgPSBNYXRoLm1heCgwLCBlIC0gbik7XG4gICAgICAgIC8vIEd1YXJkIGFnYWluc3QgbGFzdEF0dGVtcHRUaW1lIGJlaW5nIGluIHRoZSBmdXR1cmUgZHVlIHRvIGEgY2xvY2sgY2hhbmdlLlxuICAgICAgICAgICAgICAgIHMgPiAwICYmIE8oXCJFeHBvbmVudGlhbEJhY2tvZmZcIiwgYEJhY2tpbmcgb2ZmIGZvciAke3N9IG1zIChiYXNlIGRlbGF5OiAke3RoaXMuX299IG1zLCBkZWxheSB3aXRoIGppdHRlcjogJHtlfSBtcywgbGFzdCBhdHRlbXB0OiAke259IG1zIGFnbylgKSwgXG4gICAgICAgIHRoaXMud28gPSB0aGlzLkhuLmVucXVldWVBZnRlckRlbGF5KHRoaXMudGltZXJJZCwgcywgKCgpID0+ICh0aGlzLm1vID0gRGF0ZS5ub3coKSwgXG4gICAgICAgIHQoKSkpKSwgXG4gICAgICAgIC8vIEFwcGx5IGJhY2tvZmYgZmFjdG9yIHRvIGRldGVybWluZSBuZXh0IGRlbGF5IGFuZCBlbnN1cmUgaXQgaXMgd2l0aGluXG4gICAgICAgIC8vIGJvdW5kcy5cbiAgICAgICAgdGhpcy5fbyAqPSB0aGlzLmxvLCB0aGlzLl9vIDwgdGhpcy5obyAmJiAodGhpcy5fbyA9IHRoaXMuaG8pLCB0aGlzLl9vID4gdGhpcy5mbyAmJiAodGhpcy5fbyA9IHRoaXMuZm8pO1xuICAgIH1cbiAgICBUbygpIHtcbiAgICAgICAgbnVsbCAhPT0gdGhpcy53byAmJiAodGhpcy53by5za2lwRGVsYXkoKSwgdGhpcy53byA9IG51bGwpO1xuICAgIH1cbiAgICBjYW5jZWwoKSB7XG4gICAgICAgIG51bGwgIT09IHRoaXMud28gJiYgKHRoaXMud28uY2FuY2VsKCksIHRoaXMud28gPSBudWxsKTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgYSByYW5kb20gdmFsdWUgaW4gdGhlIHJhbmdlIFstY3VycmVudEJhc2VNcy8yLCBjdXJyZW50QmFzZU1zLzJdICovICAgIElvKCkge1xuICAgICAgICByZXR1cm4gKE1hdGgucmFuZG9tKCkgLSAuNSkgKiB0aGlzLl9vO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQSBQZXJzaXN0ZW50U3RyZWFtIGlzIGFuIGFic3RyYWN0IGJhc2UgY2xhc3MgdGhhdCByZXByZXNlbnRzIGEgc3RyZWFtaW5nIFJQQ1xuICogdG8gdGhlIEZpcmVzdG9yZSBiYWNrZW5kLiBJdCdzIGJ1aWx0IG9uIHRvcCBvZiB0aGUgY29ubmVjdGlvbnMgb3duIHN1cHBvcnRcbiAqIGZvciBzdHJlYW1pbmcgUlBDcywgYW5kIGFkZHMgc2V2ZXJhbCBjcml0aWNhbCBmZWF0dXJlcyBmb3Igb3VyIGNsaWVudHM6XG4gKlxuICogICAtIEV4cG9uZW50aWFsIGJhY2tvZmYgb24gZmFpbHVyZVxuICogICAtIEF1dGhlbnRpY2F0aW9uIHZpYSBDcmVkZW50aWFsc1Byb3ZpZGVyXG4gKiAgIC0gRGlzcGF0Y2hpbmcgYWxsIGNhbGxiYWNrcyBpbnRvIHRoZSBzaGFyZWQgd29ya2VyIHF1ZXVlXG4gKiAgIC0gQ2xvc2luZyBpZGxlIHN0cmVhbXMgYWZ0ZXIgNjAgc2Vjb25kcyBvZiBpbmFjdGl2aXR5XG4gKlxuICogU3ViY2xhc3NlcyBvZiBQZXJzaXN0ZW50U3RyZWFtIGltcGxlbWVudCBzZXJpYWxpemF0aW9uIG9mIG1vZGVscyB0byBhbmRcbiAqIGZyb20gdGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb3RvY29sIGJ1ZmZlcnMgZm9yIGEgc3BlY2lmaWNcbiAqIHN0cmVhbWluZyBSUEMuXG4gKlxuICogIyMgU3RhcnRpbmcgYW5kIFN0b3BwaW5nXG4gKlxuICogU3RyZWFtaW5nIFJQQ3MgYXJlIHN0YXRlZnVsIGFuZCBuZWVkIHRvIGJlIHN0YXJ0KCllZCBiZWZvcmUgbWVzc2FnZXMgY2FuXG4gKiBiZSBzZW50IGFuZCByZWNlaXZlZC4gVGhlIFBlcnNpc3RlbnRTdHJlYW0gd2lsbCBjYWxsIHRoZSBvbk9wZW4oKSBmdW5jdGlvblxuICogb2YgdGhlIGxpc3RlbmVyIG9uY2UgdGhlIHN0cmVhbSBpcyByZWFkeSB0byBhY2NlcHQgcmVxdWVzdHMuXG4gKlxuICogU2hvdWxkIGEgc3RhcnQoKSBmYWlsLCBQZXJzaXN0ZW50U3RyZWFtIHdpbGwgY2FsbCB0aGUgcmVnaXN0ZXJlZCBvbkNsb3NlKClcbiAqIGxpc3RlbmVyIHdpdGggYSBGaXJlc3RvcmVFcnJvciBpbmRpY2F0aW5nIHdoYXQgd2VudCB3cm9uZy5cbiAqXG4gKiBBIFBlcnNpc3RlbnRTdHJlYW0gY2FuIGJlIHN0YXJ0ZWQgYW5kIHN0b3BwZWQgcmVwZWF0ZWRseS5cbiAqXG4gKiBHZW5lcmljIHR5cGVzOlxuICogIFNlbmRUeXBlOiBUaGUgdHlwZSBvZiB0aGUgb3V0Z29pbmcgbWVzc2FnZSBvZiB0aGUgdW5kZXJseWluZ1xuICogICAgY29ubmVjdGlvbiBzdHJlYW1cbiAqICBSZWNlaXZlVHlwZTogVGhlIHR5cGUgb2YgdGhlIGluY29taW5nIG1lc3NhZ2Ugb2YgdGhlIHVuZGVybHlpbmdcbiAqICAgIGNvbm5lY3Rpb24gc3RyZWFtXG4gKiAgTGlzdGVuZXJUeXBlOiBUaGUgdHlwZSBvZiB0aGUgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIGNhbGxiYWNrc1xuICovXG5jbGFzcyBGbyB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgcywgaSwgciwgbywgYSkge1xuICAgICAgICB0aGlzLkhuID0gdCwgdGhpcy5FbyA9IG4sIHRoaXMuQW8gPSBzLCB0aGlzLlJvID0gaSwgdGhpcy5hdXRoQ3JlZGVudGlhbHNQcm92aWRlciA9IHIsIFxuICAgICAgICB0aGlzLmFwcENoZWNrQ3JlZGVudGlhbHNQcm92aWRlciA9IG8sIHRoaXMubGlzdGVuZXIgPSBhLCB0aGlzLnN0YXRlID0gMCAvKiBJbml0aWFsICovICwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGNsb3NlIGNvdW50IHRoYXQncyBpbmNyZW1lbnRlZCBldmVyeSB0aW1lIHRoZSBzdHJlYW0gaXMgY2xvc2VkOyB1c2VkIGJ5XG4gICAgICAgICAqIGdldENsb3NlR3VhcmRlZERpc3BhdGNoZXIoKSB0byBpbnZhbGlkYXRlIGNhbGxiYWNrcyB0aGF0IGhhcHBlbiBhZnRlclxuICAgICAgICAgKiBjbG9zZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYm8gPSAwLCB0aGlzLlBvID0gbnVsbCwgdGhpcy5WbyA9IG51bGwsIHRoaXMuc3RyZWFtID0gbnVsbCwgdGhpcy52byA9IG5ldyAkbyh0LCBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHN0YXJ0KCkgaGFzIGJlZW4gY2FsbGVkIGFuZCBubyBlcnJvciBoYXMgb2NjdXJyZWQuIFRydWVcbiAgICAgKiBpbmRpY2F0ZXMgdGhlIHN0cmVhbSBpcyBvcGVuIG9yIGluIHRoZSBwcm9jZXNzIG9mIG9wZW5pbmcgKHdoaWNoXG4gICAgICogZW5jb21wYXNzZXMgcmVzcGVjdGluZyBiYWNrb2ZmLCBnZXR0aW5nIGF1dGggdG9rZW5zLCBhbmQgc3RhcnRpbmcgdGhlXG4gICAgICogYWN0dWFsIFJQQykuIFVzZSBpc09wZW4oKSB0byBkZXRlcm1pbmUgaWYgdGhlIHN0cmVhbSBpcyBvcGVuIGFuZCByZWFkeSBmb3JcbiAgICAgKiBvdXRib3VuZCByZXF1ZXN0cy5cbiAgICAgKi8gICAgU28oKSB7XG4gICAgICAgIHJldHVybiAxIC8qIFN0YXJ0aW5nICovID09PSB0aGlzLnN0YXRlIHx8IDUgLyogQmFja29mZiAqLyA9PT0gdGhpcy5zdGF0ZSB8fCB0aGlzLkRvKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdW5kZXJseWluZyBSUEMgaXMgb3BlbiAodGhlIG9uT3BlbigpIGxpc3RlbmVyIGhhcyBiZWVuXG4gICAgICogY2FsbGVkKSBhbmQgdGhlIHN0cmVhbSBpcyByZWFkeSBmb3Igb3V0Ym91bmQgcmVxdWVzdHMuXG4gICAgICovICAgIERvKCkge1xuICAgICAgICByZXR1cm4gMiAvKiBPcGVuICovID09PSB0aGlzLnN0YXRlIHx8IDMgLyogSGVhbHRoeSAqLyA9PT0gdGhpcy5zdGF0ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnRzIHRoZSBSUEMuIE9ubHkgYWxsb3dlZCBpZiBpc1N0YXJ0ZWQoKSByZXR1cm5zIGZhbHNlLiBUaGUgc3RyZWFtIGlzXG4gICAgICogbm90IGltbWVkaWF0ZWx5IHJlYWR5IGZvciB1c2U6IG9uT3BlbigpIHdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSBSUEMgaXNcbiAgICAgKiByZWFkeSBmb3Igb3V0Ym91bmQgcmVxdWVzdHMsIGF0IHdoaWNoIHBvaW50IGlzT3BlbigpIHdpbGwgcmV0dXJuIHRydWUuXG4gICAgICpcbiAgICAgKiBXaGVuIHN0YXJ0IHJldHVybnMsIGlzU3RhcnRlZCgpIHdpbGwgcmV0dXJuIHRydWUuXG4gICAgICovICAgIHN0YXJ0KCkge1xuICAgICAgICA0IC8qIEVycm9yICovICE9PSB0aGlzLnN0YXRlID8gdGhpcy5hdXRoKCkgOiB0aGlzLkNvKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0b3BzIHRoZSBSUEMuIFRoaXMgY2FsbCBpcyBpZGVtcG90ZW50IGFuZCBhbGxvd2VkIHJlZ2FyZGxlc3Mgb2YgdGhlXG4gICAgICogY3VycmVudCBpc1N0YXJ0ZWQoKSBzdGF0ZS5cbiAgICAgKlxuICAgICAqIFdoZW4gc3RvcCByZXR1cm5zLCBpc1N0YXJ0ZWQoKSBhbmQgaXNPcGVuKCkgd2lsbCBib3RoIHJldHVybiBmYWxzZS5cbiAgICAgKi8gICAgYXN5bmMgc3RvcCgpIHtcbiAgICAgICAgdGhpcy5TbygpICYmIGF3YWl0IHRoaXMuY2xvc2UoMCAvKiBJbml0aWFsICovKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWZ0ZXIgYW4gZXJyb3IgdGhlIHN0cmVhbSB3aWxsIHVzdWFsbHkgYmFjayBvZmYgb24gdGhlIG5leHQgYXR0ZW1wdCB0b1xuICAgICAqIHN0YXJ0IGl0LiBJZiB0aGUgZXJyb3Igd2FycmFudHMgYW4gaW1tZWRpYXRlIHJlc3RhcnQgb2YgdGhlIHN0cmVhbSwgdGhlXG4gICAgICogc2VuZGVyIGNhbiB1c2UgdGhpcyB0byBpbmRpY2F0ZSB0aGF0IHRoZSByZWNlaXZlciBzaG91bGQgbm90IGJhY2sgb2ZmLlxuICAgICAqXG4gICAgICogRWFjaCBlcnJvciB3aWxsIGNhbGwgdGhlIG9uQ2xvc2UoKSBsaXN0ZW5lci4gVGhhdCBmdW5jdGlvbiBjYW4gZGVjaWRlIHRvXG4gICAgICogaW5oaWJpdCBiYWNrb2ZmIGlmIHJlcXVpcmVkLlxuICAgICAqLyAgICB4bygpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IDAgLyogSW5pdGlhbCAqLyAsIHRoaXMudm8ucmVzZXQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFya3MgdGhpcyBzdHJlYW0gYXMgaWRsZS4gSWYgbm8gZnVydGhlciBhY3Rpb25zIGFyZSBwZXJmb3JtZWQgb24gdGhlXG4gICAgICogc3RyZWFtIGZvciBvbmUgbWludXRlLCB0aGUgc3RyZWFtIHdpbGwgYXV0b21hdGljYWxseSBjbG9zZSBpdHNlbGYgYW5kXG4gICAgICogbm90aWZ5IHRoZSBzdHJlYW0ncyBvbkNsb3NlKCkgaGFuZGxlciB3aXRoIFN0YXR1cy5PSy4gVGhlIHN0cmVhbSB3aWxsIHRoZW5cbiAgICAgKiBiZSBpbiBhICFpc1N0YXJ0ZWQoKSBzdGF0ZSwgcmVxdWlyaW5nIHRoZSBjYWxsZXIgdG8gc3RhcnQgdGhlIHN0cmVhbSBhZ2FpblxuICAgICAqIGJlZm9yZSBmdXJ0aGVyIHVzZS5cbiAgICAgKlxuICAgICAqIE9ubHkgc3RyZWFtcyB0aGF0IGFyZSBpbiBzdGF0ZSAnT3BlbicgY2FuIGJlIG1hcmtlZCBpZGxlLCBhcyBhbGwgb3RoZXJcbiAgICAgKiBzdGF0ZXMgaW1wbHkgcGVuZGluZyBuZXR3b3JrIG9wZXJhdGlvbnMuXG4gICAgICovICAgIE5vKCkge1xuICAgICAgICAvLyBTdGFydHMgdGhlIGlkbGUgdGltZSBpZiB3ZSBhcmUgaW4gc3RhdGUgJ09wZW4nIGFuZCBhcmUgbm90IHlldCBhbHJlYWR5XG4gICAgICAgIC8vIHJ1bm5pbmcgYSB0aW1lciAoaW4gd2hpY2ggY2FzZSB0aGUgcHJldmlvdXMgaWRsZSB0aW1lb3V0IHN0aWxsIGFwcGxpZXMpLlxuICAgICAgICB0aGlzLkRvKCkgJiYgbnVsbCA9PT0gdGhpcy5QbyAmJiAodGhpcy5QbyA9IHRoaXMuSG4uZW5xdWV1ZUFmdGVyRGVsYXkodGhpcy5FbywgNmU0LCAoKCkgPT4gdGhpcy5rbygpKSkpO1xuICAgIH1cbiAgICAvKiogU2VuZHMgYSBtZXNzYWdlIHRvIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4gKi8gICAgTW8odCkge1xuICAgICAgICB0aGlzLk9vKCksIHRoaXMuc3RyZWFtLnNlbmQodCk7XG4gICAgfVxuICAgIC8qKiBDYWxsZWQgYnkgdGhlIGlkbGUgdGltZXIgd2hlbiB0aGUgc3RyZWFtIHNob3VsZCBjbG9zZSBkdWUgdG8gaW5hY3Rpdml0eS4gKi8gICAgYXN5bmMga28oKSB7XG4gICAgICAgIGlmICh0aGlzLkRvKCkpIFxuICAgICAgICAvLyBXaGVuIHRpbWluZyBvdXQgYW4gaWRsZSBzdHJlYW0gdGhlcmUncyBubyByZWFzb24gdG8gZm9yY2UgdGhlIHN0cmVhbSBpbnRvIGJhY2tvZmYgd2hlblxuICAgICAgICAvLyBpdCByZXN0YXJ0cyBzbyBzZXQgdGhlIHN0cmVhbSBzdGF0ZSB0byBJbml0aWFsIGluc3RlYWQgb2YgRXJyb3IuXG4gICAgICAgIHJldHVybiB0aGlzLmNsb3NlKDAgLyogSW5pdGlhbCAqLyk7XG4gICAgfVxuICAgIC8qKiBNYXJrcyB0aGUgc3RyZWFtIGFzIGFjdGl2ZSBhZ2Fpbi4gKi8gICAgT28oKSB7XG4gICAgICAgIHRoaXMuUG8gJiYgKHRoaXMuUG8uY2FuY2VsKCksIHRoaXMuUG8gPSBudWxsKTtcbiAgICB9XG4gICAgLyoqIENhbmNlbHMgdGhlIGhlYWx0aCBjaGVjayBkZWxheWVkIG9wZXJhdGlvbi4gKi8gICAgJG8oKSB7XG4gICAgICAgIHRoaXMuVm8gJiYgKHRoaXMuVm8uY2FuY2VsKCksIHRoaXMuVm8gPSBudWxsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBzdHJlYW0gYW5kIGNsZWFucyB1cCBhcyBuZWNlc3Nhcnk6XG4gICAgICpcbiAgICAgKiAqIGNsb3NlcyB0aGUgdW5kZXJseWluZyBHUlBDIHN0cmVhbTtcbiAgICAgKiAqIGNhbGxzIHRoZSBvbkNsb3NlIGhhbmRsZXIgd2l0aCB0aGUgZ2l2ZW4gJ2Vycm9yJztcbiAgICAgKiAqIHNldHMgaW50ZXJuYWwgc3RyZWFtIHN0YXRlIHRvICdmaW5hbFN0YXRlJztcbiAgICAgKiAqIGFkanVzdHMgdGhlIGJhY2tvZmYgdGltZXIgYmFzZWQgb24gdGhlIGVycm9yXG4gICAgICpcbiAgICAgKiBBIG5ldyBzdHJlYW0gY2FuIGJlIG9wZW5lZCBieSBjYWxsaW5nIHN0YXJ0KCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmluYWxTdGF0ZSAtIHRoZSBpbnRlbmRlZCBzdGF0ZSBvZiB0aGUgc3RyZWFtIGFmdGVyIGNsb3NpbmcuXG4gICAgICogQHBhcmFtIGVycm9yIC0gdGhlIGVycm9yIHRoZSBjb25uZWN0aW9uIHdhcyBjbG9zZWQgd2l0aC5cbiAgICAgKi8gICAgYXN5bmMgY2xvc2UodCwgZSkge1xuICAgICAgICAvLyBDYW5jZWwgYW55IG91dHN0YW5kaW5nIHRpbWVycyAodGhleSdyZSBndWFyYW50ZWVkIG5vdCB0byBleGVjdXRlKS5cbiAgICAgICAgdGhpcy5PbygpLCB0aGlzLiRvKCksIHRoaXMudm8uY2FuY2VsKCksIFxuICAgICAgICAvLyBJbnZhbGlkYXRlcyBhbnkgc3RyZWFtLXJlbGF0ZWQgY2FsbGJhY2tzIChlLmcuIGZyb20gYXV0aCBvciB0aGVcbiAgICAgICAgLy8gdW5kZXJseWluZyBzdHJlYW0pLCBndWFyYW50ZWVpbmcgdGhleSB3b24ndCBleGVjdXRlLlxuICAgICAgICB0aGlzLmJvKyssIDQgLyogRXJyb3IgKi8gIT09IHQgPyBcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiBpbnRlbnRpb25hbCBjbG9zZSBlbnN1cmUgd2UgZG9uJ3QgZGVsYXkgb3VyIG5leHQgY29ubmVjdGlvbiBhdHRlbXB0LlxuICAgICAgICB0aGlzLnZvLnJlc2V0KCkgOiBlICYmIGUuY29kZSA9PT0gRy5SRVNPVVJDRV9FWEhBVVNURUQgPyAoXG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3IuIChQcm9iYWJseSBlaXRoZXIgJ3F1b3RhIGV4Y2VlZGVkJyBvciAnbWF4IHF1ZXVlIGxlbmd0aCByZWFjaGVkJy4pXG4gICAgICAgICQoZS50b1N0cmluZygpKSwgJChcIlVzaW5nIG1heGltdW0gYmFja29mZiBkZWxheSB0byBwcmV2ZW50IG92ZXJsb2FkaW5nIHRoZSBiYWNrZW5kLlwiKSwgXG4gICAgICAgIHRoaXMudm8ueW8oKSkgOiBlICYmIGUuY29kZSA9PT0gRy5VTkFVVEhFTlRJQ0FURUQgJiYgMyAvKiBIZWFsdGh5ICovICE9PSB0aGlzLnN0YXRlICYmIChcbiAgICAgICAgLy8gXCJ1bmF1dGhlbnRpY2F0ZWRcIiBlcnJvciBtZWFucyB0aGUgdG9rZW4gd2FzIHJlamVjdGVkLiBUaGlzIHNob3VsZCByYXJlbHlcbiAgICAgICAgLy8gaGFwcGVuIHNpbmNlIGJvdGggQXV0aCBhbmQgQXBwQ2hlY2sgZW5zdXJlIGEgc3VmZmljaWVudCBUVEwgd2hlbiB3ZVxuICAgICAgICAvLyByZXF1ZXN0IGEgdG9rZW4uIElmIGEgdXNlciBtYW51YWxseSByZXNldHMgdGhlaXIgc3lzdGVtIGNsb2NrIHRoaXMgY2FuXG4gICAgICAgIC8vIGZhaWwsIGhvd2V2ZXIuIEluIHRoaXMgY2FzZSwgd2Ugc2hvdWxkIGdldCBhIENvZGUuVU5BVVRIRU5USUNBVEVEIGVycm9yXG4gICAgICAgIC8vIGJlZm9yZSB3ZSByZWNlaXZlZCB0aGUgZmlyc3QgbWVzc2FnZSBhbmQgd2UgbmVlZCB0byBpbnZhbGlkYXRlIHRoZSB0b2tlblxuICAgICAgICAvLyB0byBlbnN1cmUgdGhhdCB3ZSBmZXRjaCBhIG5ldyB0b2tlbi5cbiAgICAgICAgdGhpcy5hdXRoQ3JlZGVudGlhbHNQcm92aWRlci5pbnZhbGlkYXRlVG9rZW4oKSwgdGhpcy5hcHBDaGVja0NyZWRlbnRpYWxzUHJvdmlkZXIuaW52YWxpZGF0ZVRva2VuKCkpLCBcbiAgICAgICAgLy8gQ2xlYW4gdXAgdGhlIHVuZGVybHlpbmcgc3RyZWFtIGJlY2F1c2Ugd2UgYXJlIG5vIGxvbmdlciBpbnRlcmVzdGVkIGluIGV2ZW50cy5cbiAgICAgICAgbnVsbCAhPT0gdGhpcy5zdHJlYW0gJiYgKHRoaXMuRm8oKSwgdGhpcy5zdHJlYW0uY2xvc2UoKSwgdGhpcy5zdHJlYW0gPSBudWxsKSwgXG4gICAgICAgIC8vIFRoaXMgc3RhdGUgbXVzdCBiZSBhc3NpZ25lZCBiZWZvcmUgY2FsbGluZyBvbkNsb3NlKCkgdG8gYWxsb3cgdGhlIGNhbGxiYWNrIHRvXG4gICAgICAgIC8vIGluaGliaXQgYmFja29mZiBvciBvdGhlcndpc2UgbWFuaXB1bGF0ZSB0aGUgc3RhdGUgaW4gaXRzIG5vbi1zdGFydGVkIHN0YXRlLlxuICAgICAgICB0aGlzLnN0YXRlID0gdCwgXG4gICAgICAgIC8vIE5vdGlmeSB0aGUgbGlzdGVuZXIgdGhhdCB0aGUgc3RyZWFtIGNsb3NlZC5cbiAgICAgICAgYXdhaXQgdGhpcy5saXN0ZW5lci5IcihlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FuIGJlIG92ZXJyaWRkZW4gdG8gcGVyZm9ybSBhZGRpdGlvbmFsIGNsZWFudXAgYmVmb3JlIHRoZSBzdHJlYW0gaXMgY2xvc2VkLlxuICAgICAqIENhbGxpbmcgc3VwZXIudGVhckRvd24oKSBpcyBub3QgcmVxdWlyZWQuXG4gICAgICovICAgIEZvKCkge31cbiAgICBhdXRoKCkge1xuICAgICAgICB0aGlzLnN0YXRlID0gMSAvKiBTdGFydGluZyAqLztcbiAgICAgICAgY29uc3QgdCA9IHRoaXMuQm8odGhpcy5ibyksIGUgPSB0aGlzLmJvO1xuICAgICAgICAvLyBUT0RPKG1pa2VsZWhlbik6IEp1c3QgdXNlIGRpc3BhdGNoSWZOb3RDbG9zZWQsIGJ1dCBzZWUgVE9ETyBiZWxvdy5cbiAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChbIHRoaXMuYXV0aENyZWRlbnRpYWxzUHJvdmlkZXIuZ2V0VG9rZW4oKSwgdGhpcy5hcHBDaGVja0NyZWRlbnRpYWxzUHJvdmlkZXIuZ2V0VG9rZW4oKSBdKS50aGVuKCgoW3QsIG5dKSA9PiB7XG4gICAgICAgICAgICAvLyBTdHJlYW0gY2FuIGJlIHN0b3BwZWQgd2hpbGUgd2FpdGluZyBmb3IgYXV0aGVudGljYXRpb24uXG4gICAgICAgICAgICAvLyBUT0RPKG1pa2VsZWhlbik6IFdlIHJlYWxseSBzaG91bGQganVzdCB1c2UgZGlzcGF0Y2hJZk5vdENsb3NlZFxuICAgICAgICAgICAgLy8gYW5kIGxldCB0aGlzIGRpc3BhdGNoIG9udG8gdGhlIHF1ZXVlLCBidXQgdGhhdCBvcGVuZWQgYSBzcGVjIHRlc3QgY2FuXG4gICAgICAgICAgICAvLyBvZiB3b3JtcyB0aGF0IEkgZG9uJ3Qgd2FudCB0byBkZWFsIHdpdGggaW4gdGhpcyBQUi5cbiAgICAgICAgICAgIHRoaXMuYm8gPT09IGUgJiYgXG4gICAgICAgICAgICAvLyBOb3JtYWxseSB3ZSdkIGhhdmUgdG8gc2NoZWR1bGUgdGhlIGNhbGxiYWNrIG9uIHRoZSBBc3luY1F1ZXVlLlxuICAgICAgICAgICAgLy8gSG93ZXZlciwgdGhlIGZvbGxvd2luZyBjYWxscyBhcmUgc2FmZSB0byBiZSBjYWxsZWQgb3V0c2lkZSB0aGVcbiAgICAgICAgICAgIC8vIEFzeW5jUXVldWUgc2luY2UgdGhleSBkb24ndCBjaGFpbiBhc3luY2hyb25vdXMgY2FsbHNcbiAgICAgICAgICAgIHRoaXMuTG8odCwgbik7XG4gICAgICAgIH0pLCAoZSA9PiB7XG4gICAgICAgICAgICB0KCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IG5ldyBRKEcuVU5LTk9XTiwgXCJGZXRjaGluZyBhdXRoIHRva2VuIGZhaWxlZDogXCIgKyBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnFvKHQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIExvKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IHRoaXMuQm8odGhpcy5ibyk7XG4gICAgICAgIHRoaXMuc3RyZWFtID0gdGhpcy5Vbyh0LCBlKSwgdGhpcy5zdHJlYW0uV3IoKCgpID0+IHtcbiAgICAgICAgICAgIG4oKCgpID0+ICh0aGlzLnN0YXRlID0gMiAvKiBPcGVuICovICwgdGhpcy5WbyA9IHRoaXMuSG4uZW5xdWV1ZUFmdGVyRGVsYXkodGhpcy5BbywgMWU0LCAoKCkgPT4gKHRoaXMuRG8oKSAmJiAodGhpcy5zdGF0ZSA9IDMgLyogSGVhbHRoeSAqLyksIFxuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkpKSksIHRoaXMubGlzdGVuZXIuV3IoKSkpKTtcbiAgICAgICAgfSkpLCB0aGlzLnN0cmVhbS5IcigodCA9PiB7XG4gICAgICAgICAgICBuKCgoKSA9PiB0aGlzLnFvKHQpKSk7XG4gICAgICAgIH0pKSwgdGhpcy5zdHJlYW0ub25NZXNzYWdlKCh0ID0+IHtcbiAgICAgICAgICAgIG4oKCgpID0+IHRoaXMub25NZXNzYWdlKHQpKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgQ28oKSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSA1IC8qIEJhY2tvZmYgKi8gLCB0aGlzLnZvLnBvKChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gMCAvKiBJbml0aWFsICovICwgdGhpcy5zdGFydCgpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8vIFZpc2libGUgZm9yIHRlc3RzXG4gICAgcW8odCkge1xuICAgICAgICAvLyBJbiB0aGVvcnkgdGhlIHN0cmVhbSBjb3VsZCBjbG9zZSBjbGVhbmx5LCBob3dldmVyLCBpbiBvdXIgY3VycmVudCBtb2RlbFxuICAgICAgICAvLyB3ZSBuZXZlciBleHBlY3QgdGhpcyB0byBoYXBwZW4gYmVjYXVzZSBpZiB3ZSBzdG9wIGEgc3RyZWFtIG91cnNlbHZlcyxcbiAgICAgICAgLy8gdGhpcyBjYWxsYmFjayB3aWxsIG5ldmVyIGJlIGNhbGxlZC4gVG8gcHJldmVudCBjYXNlcyB3aGVyZSB3ZSByZXRyeVxuICAgICAgICAvLyB3aXRob3V0IGEgYmFja29mZiBhY2NpZGVudGFsbHksIHdlIHNldCB0aGUgc3RyZWFtIHRvIGVycm9yIGluIGFsbCBjYXNlcy5cbiAgICAgICAgcmV0dXJuIE8oXCJQZXJzaXN0ZW50U3RyZWFtXCIsIGBjbG9zZSB3aXRoIGVycm9yOiAke3R9YCksIHRoaXMuc3RyZWFtID0gbnVsbCwgdGhpcy5jbG9zZSg0IC8qIEVycm9yICovICwgdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBcImRpc3BhdGNoZXJcIiBmdW5jdGlvbiB0aGF0IGRpc3BhdGNoZXMgb3BlcmF0aW9ucyBvbnRvIHRoZVxuICAgICAqIEFzeW5jUXVldWUgYnV0IG9ubHkgcnVucyB0aGVtIGlmIGNsb3NlQ291bnQgcmVtYWlucyB1bmNoYW5nZWQuIFRoaXMgYWxsb3dzXG4gICAgICogdXMgdG8gdHVybiBhdXRoIC8gc3RyZWFtIGNhbGxiYWNrcyBpbnRvIG5vLW9wcyBpZiB0aGUgc3RyZWFtIGlzIGNsb3NlZCAvXG4gICAgICogcmUtb3BlbmVkLCBldGMuXG4gICAgICovICAgIEJvKHQpIHtcbiAgICAgICAgcmV0dXJuIGUgPT4ge1xuICAgICAgICAgICAgdGhpcy5Ibi5lbnF1ZXVlQW5kRm9yZ2V0KCgoKSA9PiB0aGlzLmJvID09PSB0ID8gZSgpIDogKE8oXCJQZXJzaXN0ZW50U3RyZWFtXCIsIFwic3RyZWFtIGNhbGxiYWNrIHNraXBwZWQgYnkgZ2V0Q2xvc2VHdWFyZGVkRGlzcGF0Y2hlci5cIiksIFxuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkpKSk7XG4gICAgICAgIH07XG4gICAgfVxufVxuXG4vKipcbiAqIEEgUGVyc2lzdGVudFN0cmVhbSB0aGF0IGltcGxlbWVudHMgdGhlIExpc3RlbiBSUEMuXG4gKlxuICogT25jZSB0aGUgTGlzdGVuIHN0cmVhbSBoYXMgY2FsbGVkIHRoZSBvbk9wZW4oKSBsaXN0ZW5lciwgYW55IG51bWJlciBvZlxuICogbGlzdGVuKCkgYW5kIHVubGlzdGVuKCkgY2FsbHMgY2FuIGJlIG1hZGUgdG8gY29udHJvbCB3aGF0IGNoYW5nZXMgd2lsbCBiZVxuICogc2VudCBmcm9tIHRoZSBzZXJ2ZXIgZm9yIExpc3RlblJlc3BvbnNlcy5cbiAqLyBjbGFzcyBCbyBleHRlbmRzIEZvIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuLCBzLCBpLCByKSB7XG4gICAgICAgIHN1cGVyKHQsIFwibGlzdGVuX3N0cmVhbV9jb25uZWN0aW9uX2JhY2tvZmZcIiAvKiBMaXN0ZW5TdHJlYW1Db25uZWN0aW9uQmFja29mZiAqLyAsIFwibGlzdGVuX3N0cmVhbV9pZGxlXCIgLyogTGlzdGVuU3RyZWFtSWRsZSAqLyAsIFwiaGVhbHRoX2NoZWNrX3RpbWVvdXRcIiAvKiBIZWFsdGhDaGVja1RpbWVvdXQgKi8gLCBlLCBuLCBzLCByKSwgXG4gICAgICAgIHRoaXMuTSA9IGk7XG4gICAgfVxuICAgIFVvKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuUm8uY28oXCJMaXN0ZW5cIiwgdCwgZSk7XG4gICAgfVxuICAgIG9uTWVzc2FnZSh0KSB7XG4gICAgICAgIC8vIEEgc3VjY2Vzc2Z1bCByZXNwb25zZSBtZWFucyB0aGUgc3RyZWFtIGlzIGhlYWx0aHlcbiAgICAgICAgdGhpcy52by5yZXNldCgpO1xuICAgICAgICBjb25zdCBlID0gSXModGhpcy5NLCB0KSwgbiA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIC8vIFdlIGhhdmUgb25seSByZWFjaGVkIGEgY29uc2lzdGVudCBzbmFwc2hvdCBmb3IgdGhlIGVudGlyZSBzdHJlYW0gaWYgdGhlcmVcbiAgICAgICAgICAgIC8vIGlzIGEgcmVhZF90aW1lIHNldCBhbmQgaXQgYXBwbGllcyB0byBhbGwgdGFyZ2V0cyAoaS5lLiB0aGUgbGlzdCBvZlxuICAgICAgICAgICAgLy8gdGFyZ2V0cyBpcyBlbXB0eSkuIFRoZSBiYWNrZW5kIGlzIGd1YXJhbnRlZWQgdG8gc2VuZCBzdWNoIHJlc3BvbnNlcy5cbiAgICAgICAgICAgIGlmICghKFwidGFyZ2V0Q2hhbmdlXCIgaW4gdCkpIHJldHVybiBjdC5taW4oKTtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0LnRhcmdldENoYW5nZTtcbiAgICAgICAgICAgIHJldHVybiBlLnRhcmdldElkcyAmJiBlLnRhcmdldElkcy5sZW5ndGggPyBjdC5taW4oKSA6IGUucmVhZFRpbWUgPyB1cyhlLnJlYWRUaW1lKSA6IGN0Lm1pbigpO1xuICAgICAgICB9KHQpO1xuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5LbyhlLCBuKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGludGVyZXN0IGluIHRoZSByZXN1bHRzIG9mIHRoZSBnaXZlbiB0YXJnZXQuIElmIHRoZSB0YXJnZXRcbiAgICAgKiBpbmNsdWRlcyBhIHJlc3VtZVRva2VuIGl0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHJlcXVlc3QuIFJlc3VsdHMgdGhhdFxuICAgICAqIGFmZmVjdCB0aGUgdGFyZ2V0IHdpbGwgYmUgc3RyZWFtZWQgYmFjayBhcyBXYXRjaENoYW5nZSBtZXNzYWdlcyB0aGF0XG4gICAgICogcmVmZXJlbmNlIHRoZSB0YXJnZXRJZC5cbiAgICAgKi8gICAgR28odCkge1xuICAgICAgICBjb25zdCBlID0ge307XG4gICAgICAgIGUuZGF0YWJhc2UgPSB3cyh0aGlzLk0pLCBlLmFkZFRhcmdldCA9IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGxldCBuO1xuICAgICAgICAgICAgY29uc3QgcyA9IGUudGFyZ2V0O1xuICAgICAgICAgICAgcmV0dXJuIG4gPSBmZShzKSA/IHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudHM6IFJzKHQsIHMpXG4gICAgICAgICAgICB9IDoge1xuICAgICAgICAgICAgICAgIHF1ZXJ5OiBicyh0LCBzKVxuICAgICAgICAgICAgfSwgbi50YXJnZXRJZCA9IGUudGFyZ2V0SWQsIGUucmVzdW1lVG9rZW4uYXBwcm94aW1hdGVCeXRlU2l6ZSgpID4gMCA/IG4ucmVzdW1lVG9rZW4gPSBvcyh0LCBlLnJlc3VtZVRva2VuKSA6IGUuc25hcHNob3RWZXJzaW9uLmNvbXBhcmVUbyhjdC5taW4oKSkgPiAwICYmIChcbiAgICAgICAgICAgIC8vIFRPRE8od3VhbmR5KTogQ29uc2lkZXIgcmVtb3ZpbmcgYWJvdmUgY2hlY2sgYmVjYXVzZSBpdCBpcyBtb3N0IGxpa2VseSB0cnVlLlxuICAgICAgICAgICAgLy8gUmlnaHQgbm93LCBtYW55IHRlc3RzIGRlcGVuZCBvbiB0aGlzIGJlaGF2aW91ciB0aG91Z2ggKGxlYXZpbmcgbWluKCkgb3V0XG4gICAgICAgICAgICAvLyBvZiBzZXJpYWxpemF0aW9uKS5cbiAgICAgICAgICAgIG4ucmVhZFRpbWUgPSBycyh0LCBlLnNuYXBzaG90VmVyc2lvbi50b1RpbWVzdGFtcCgpKSksIG47XG4gICAgICAgIH0odGhpcy5NLCB0KTtcbiAgICAgICAgY29uc3QgbiA9IFZzKHRoaXMuTSwgdCk7XG4gICAgICAgIG4gJiYgKGUubGFiZWxzID0gbiksIHRoaXMuTW8oZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVucmVnaXN0ZXJzIGludGVyZXN0IGluIHRoZSByZXN1bHRzIG9mIHRoZSB0YXJnZXQgYXNzb2NpYXRlZCB3aXRoIHRoZVxuICAgICAqIGdpdmVuIHRhcmdldElkLlxuICAgICAqLyAgICBRbyh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB7fTtcbiAgICAgICAgZS5kYXRhYmFzZSA9IHdzKHRoaXMuTSksIGUucmVtb3ZlVGFyZ2V0ID0gdCwgdGhpcy5NbyhlKTtcbiAgICB9XG59XG5cbi8qKlxuICogQSBTdHJlYW0gdGhhdCBpbXBsZW1lbnRzIHRoZSBXcml0ZSBSUEMuXG4gKlxuICogVGhlIFdyaXRlIFJQQyByZXF1aXJlcyB0aGUgY2FsbGVyIHRvIG1haW50YWluIHNwZWNpYWwgc3RyZWFtVG9rZW5cbiAqIHN0YXRlIGluIGJldHdlZW4gY2FsbHMsIHRvIGhlbHAgdGhlIHNlcnZlciB1bmRlcnN0YW5kIHdoaWNoIHJlc3BvbnNlcyB0aGVcbiAqIGNsaWVudCBoYXMgcHJvY2Vzc2VkIGJ5IHRoZSB0aW1lIHRoZSBuZXh0IHJlcXVlc3QgaXMgbWFkZS4gRXZlcnkgcmVzcG9uc2VcbiAqIHdpbGwgY29udGFpbiBhIHN0cmVhbVRva2VuOyB0aGlzIHZhbHVlIG11c3QgYmUgcGFzc2VkIHRvIHRoZSBuZXh0XG4gKiByZXF1ZXN0LlxuICpcbiAqIEFmdGVyIGNhbGxpbmcgc3RhcnQoKSBvbiB0aGlzIHN0cmVhbSwgdGhlIG5leHQgcmVxdWVzdCBtdXN0IGJlIGEgaGFuZHNoYWtlLFxuICogY29udGFpbmluZyB3aGF0ZXZlciBzdHJlYW1Ub2tlbiBpcyBvbiBoYW5kLiBPbmNlIGEgcmVzcG9uc2UgdG8gdGhpc1xuICogcmVxdWVzdCBpcyByZWNlaXZlZCwgYWxsIHBlbmRpbmcgbXV0YXRpb25zIG1heSBiZSBzdWJtaXR0ZWQuIFdoZW5cbiAqIHN1Ym1pdHRpbmcgbXVsdGlwbGUgYmF0Y2hlcyBvZiBtdXRhdGlvbnMgYXQgdGhlIHNhbWUgdGltZSwgaXQnc1xuICogb2theSB0byB1c2UgdGhlIHNhbWUgc3RyZWFtVG9rZW4gZm9yIHRoZSBjYWxscyB0byB3cml0ZU11dGF0aW9ucy5cbiAqXG4gKiBUT0RPKGIvMzMyNzEyMzUpOiBVc2UgcHJvdG8gdHlwZXNcbiAqLyBjbGFzcyBMbyBleHRlbmRzIEZvIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuLCBzLCBpLCByKSB7XG4gICAgICAgIHN1cGVyKHQsIFwid3JpdGVfc3RyZWFtX2Nvbm5lY3Rpb25fYmFja29mZlwiIC8qIFdyaXRlU3RyZWFtQ29ubmVjdGlvbkJhY2tvZmYgKi8gLCBcIndyaXRlX3N0cmVhbV9pZGxlXCIgLyogV3JpdGVTdHJlYW1JZGxlICovICwgXCJoZWFsdGhfY2hlY2tfdGltZW91dFwiIC8qIEhlYWx0aENoZWNrVGltZW91dCAqLyAsIGUsIG4sIHMsIHIpLCBcbiAgICAgICAgdGhpcy5NID0gaSwgdGhpcy5qbyA9ICExO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcmFja3Mgd2hldGhlciBvciBub3QgYSBoYW5kc2hha2UgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGV4Y2hhbmdlZCBhbmRcbiAgICAgKiB0aGUgc3RyZWFtIGlzIHJlYWR5IHRvIGFjY2VwdCBtdXRhdGlvbnMuXG4gICAgICovICAgIGdldCBXbygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam87XG4gICAgfVxuICAgIC8vIE92ZXJyaWRlIG9mIFBlcnNpc3RlbnRTdHJlYW0uc3RhcnRcbiAgICBzdGFydCgpIHtcbiAgICAgICAgdGhpcy5qbyA9ICExLCB0aGlzLmxhc3RTdHJlYW1Ub2tlbiA9IHZvaWQgMCwgc3VwZXIuc3RhcnQoKTtcbiAgICB9XG4gICAgRm8oKSB7XG4gICAgICAgIHRoaXMuam8gJiYgdGhpcy56byhbXSk7XG4gICAgfVxuICAgIFVvKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuUm8uY28oXCJXcml0ZVwiLCB0LCBlKTtcbiAgICB9XG4gICAgb25NZXNzYWdlKHQpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAvLyBBbHdheXMgY2FwdHVyZSB0aGUgbGFzdCBzdHJlYW0gdG9rZW4uXG4gICAgICAgIHEoISF0LnN0cmVhbVRva2VuKSwgdGhpcy5sYXN0U3RyZWFtVG9rZW4gPSB0LnN0cmVhbVRva2VuLCB0aGlzLmpvKSB7XG4gICAgICAgICAgICAvLyBBIHN1Y2Nlc3NmdWwgZmlyc3Qgd3JpdGUgcmVzcG9uc2UgbWVhbnMgdGhlIHN0cmVhbSBpcyBoZWFsdGh5LFxuICAgICAgICAgICAgLy8gTm90ZSwgdGhhdCB3ZSBjb3VsZCBjb25zaWRlciBhIHN1Y2Nlc3NmdWwgaGFuZHNoYWtlIGhlYWx0aHksIGhvd2V2ZXIsXG4gICAgICAgICAgICAvLyB0aGUgd3JpdGUgaXRzZWxmIG1pZ2h0IGJlIGNhdXNpbmcgYW4gZXJyb3Igd2Ugd2FudCB0byBiYWNrIG9mZiBmcm9tLlxuICAgICAgICAgICAgdGhpcy52by5yZXNldCgpO1xuICAgICAgICAgICAgY29uc3QgZSA9IEFzKHQud3JpdGVSZXN1bHRzLCB0LmNvbW1pdFRpbWUpLCBuID0gdXModC5jb21taXRUaW1lKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyLkhvKG4sIGUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBmaXJzdCByZXNwb25zZSBpcyBhbHdheXMgdGhlIGhhbmRzaGFrZSByZXNwb25zZVxuICAgICAgICByZXR1cm4gcSghdC53cml0ZVJlc3VsdHMgfHwgMCA9PT0gdC53cml0ZVJlc3VsdHMubGVuZ3RoKSwgdGhpcy5qbyA9ICEwLCB0aGlzLmxpc3RlbmVyLkpvKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGFuIGluaXRpYWwgc3RyZWFtVG9rZW4gdG8gdGhlIHNlcnZlciwgcGVyZm9ybWluZyB0aGUgaGFuZHNoYWtlXG4gICAgICogcmVxdWlyZWQgdG8gbWFrZSB0aGUgU3RyZWFtaW5nV3JpdGUgUlBDIHdvcmsuIFN1YnNlcXVlbnRcbiAgICAgKiBjYWxscyBzaG91bGQgd2FpdCB1bnRpbCBvbkhhbmRzaGFrZUNvbXBsZXRlIHdhcyBjYWxsZWQuXG4gICAgICovICAgIFlvKCkge1xuICAgICAgICAvLyBUT0RPKGRpbW9uZCk6IFN1cHBvcnQgc3RyZWFtIHJlc3VtcHRpb24uIFdlIGludGVudGlvbmFsbHkgZG8gbm90IHNldCB0aGVcbiAgICAgICAgLy8gc3RyZWFtIHRva2VuIG9uIHRoZSBoYW5kc2hha2UsIGlnbm9yaW5nIGFueSBzdHJlYW0gdG9rZW4gd2UgbWlnaHQgaGF2ZS5cbiAgICAgICAgY29uc3QgdCA9IHt9O1xuICAgICAgICB0LmRhdGFiYXNlID0gd3ModGhpcy5NKSwgdGhpcy5Nbyh0KTtcbiAgICB9XG4gICAgLyoqIFNlbmRzIGEgZ3JvdXAgb2YgbXV0YXRpb25zIHRvIHRoZSBGaXJlc3RvcmUgYmFja2VuZCB0byBhcHBseS4gKi8gICAgem8odCkge1xuICAgICAgICBjb25zdCBlID0ge1xuICAgICAgICAgICAgc3RyZWFtVG9rZW46IHRoaXMubGFzdFN0cmVhbVRva2VuLFxuICAgICAgICAgICAgd3JpdGVzOiB0Lm1hcCgodCA9PiBUcyh0aGlzLk0sIHQpKSlcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5NbyhlKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIERhdGFzdG9yZSBhbmQgaXRzIHJlbGF0ZWQgbWV0aG9kcyBhcmUgYSB3cmFwcGVyIGFyb3VuZCB0aGUgZXh0ZXJuYWwgR29vZ2xlXG4gKiBDbG91ZCBEYXRhc3RvcmUgZ3JwYyBBUEksIHdoaWNoIHByb3ZpZGVzIGFuIGludGVyZmFjZSB0aGF0IGlzIG1vcmUgY29udmVuaWVudFxuICogZm9yIHRoZSByZXN0IG9mIHRoZSBjbGllbnQgU0RLIGFyY2hpdGVjdHVyZSB0byBjb25zdW1lLlxuICovXG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIERhdGFzdG9yZSB0aGF0IGV4cG9zZXMgYWRkaXRpb25hbCBzdGF0ZSBmb3IgaW50ZXJuYWxcbiAqIGNvbnN1bXB0aW9uLlxuICovXG5jbGFzcyBxbyBleHRlbmRzIGNsYXNzIHt9IHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuLCBzKSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMuYXV0aENyZWRlbnRpYWxzID0gdCwgdGhpcy5hcHBDaGVja0NyZWRlbnRpYWxzID0gZSwgdGhpcy5SbyA9IG4sIHRoaXMuTSA9IHMsIFxuICAgICAgICB0aGlzLlhvID0gITE7XG4gICAgfVxuICAgIFpvKCkge1xuICAgICAgICBpZiAodGhpcy5YbykgdGhyb3cgbmV3IFEoRy5GQUlMRURfUFJFQ09ORElUSU9OLCBcIlRoZSBjbGllbnQgaGFzIGFscmVhZHkgYmVlbiB0ZXJtaW5hdGVkLlwiKTtcbiAgICB9XG4gICAgLyoqIEludm9rZXMgdGhlIHByb3ZpZGVkIFJQQyB3aXRoIGF1dGggYW5kIEFwcENoZWNrIHRva2Vucy4gKi8gICAgaW8odCwgZSwgbikge1xuICAgICAgICByZXR1cm4gdGhpcy5abygpLCBQcm9taXNlLmFsbChbIHRoaXMuYXV0aENyZWRlbnRpYWxzLmdldFRva2VuKCksIHRoaXMuYXBwQ2hlY2tDcmVkZW50aWFscy5nZXRUb2tlbigpIF0pLnRoZW4oKChbcywgaV0pID0+IHRoaXMuUm8uaW8odCwgZSwgbiwgcywgaSkpKS5jYXRjaCgodCA9PiB7XG4gICAgICAgICAgICB0aHJvdyBcIkZpcmViYXNlRXJyb3JcIiA9PT0gdC5uYW1lID8gKHQuY29kZSA9PT0gRy5VTkFVVEhFTlRJQ0FURUQgJiYgKHRoaXMuYXV0aENyZWRlbnRpYWxzLmludmFsaWRhdGVUb2tlbigpLCBcbiAgICAgICAgICAgIHRoaXMuYXBwQ2hlY2tDcmVkZW50aWFscy5pbnZhbGlkYXRlVG9rZW4oKSksIHQpIDogbmV3IFEoRy5VTktOT1dOLCB0LnRvU3RyaW5nKCkpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKiBJbnZva2VzIHRoZSBwcm92aWRlZCBSUEMgd2l0aCBzdHJlYW1lZCByZXN1bHRzIHdpdGggYXV0aCBhbmQgQXBwQ2hlY2sgdG9rZW5zLiAqLyAgICB1byh0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLlpvKCksIFByb21pc2UuYWxsKFsgdGhpcy5hdXRoQ3JlZGVudGlhbHMuZ2V0VG9rZW4oKSwgdGhpcy5hcHBDaGVja0NyZWRlbnRpYWxzLmdldFRva2VuKCkgXSkudGhlbigoKFtzLCBpXSkgPT4gdGhpcy5Sby51byh0LCBlLCBuLCBzLCBpKSkpLmNhdGNoKCh0ID0+IHtcbiAgICAgICAgICAgIHRocm93IFwiRmlyZWJhc2VFcnJvclwiID09PSB0Lm5hbWUgPyAodC5jb2RlID09PSBHLlVOQVVUSEVOVElDQVRFRCAmJiAodGhpcy5hdXRoQ3JlZGVudGlhbHMuaW52YWxpZGF0ZVRva2VuKCksIFxuICAgICAgICAgICAgdGhpcy5hcHBDaGVja0NyZWRlbnRpYWxzLmludmFsaWRhdGVUb2tlbigpKSwgdCkgOiBuZXcgUShHLlVOS05PV04sIHQudG9TdHJpbmcoKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgdGVybWluYXRlKCkge1xuICAgICAgICB0aGlzLlhvID0gITA7XG4gICAgfVxufVxuXG4vLyBUT0RPKGZpcmVzdG9yZXhwKTogTWFrZSBzdXJlIHRoZXJlIGlzIG9ubHkgb25lIERhdGFzdG9yZSBpbnN0YW5jZSBwZXJcbi8vIGZpcmVzdG9yZS1leHAgY2xpZW50LlxuLyoqXG4gKiBBIGNvbXBvbmVudCB1c2VkIGJ5IHRoZSBSZW1vdGVTdG9yZSB0byB0cmFjayB0aGUgT25saW5lU3RhdGUgKHRoYXQgaXMsXG4gKiB3aGV0aGVyIG9yIG5vdCB0aGUgY2xpZW50IGFzIGEgd2hvbGUgc2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gYmUgb25saW5lIG9yXG4gKiBvZmZsaW5lKSwgaW1wbGVtZW50aW5nIHRoZSBhcHByb3ByaWF0ZSBoZXVyaXN0aWNzLlxuICpcbiAqIEluIHBhcnRpY3VsYXIsIHdoZW4gdGhlIGNsaWVudCBpcyB0cnlpbmcgdG8gY29ubmVjdCB0byB0aGUgYmFja2VuZCwgd2VcbiAqIGFsbG93IHVwIHRvIE1BWF9XQVRDSF9TVFJFQU1fRkFJTFVSRVMgd2l0aGluIE9OTElORV9TVEFURV9USU1FT1VUX01TIGZvclxuICogYSBjb25uZWN0aW9uIHRvIHN1Y2NlZWQuIElmIHdlIGhhdmUgdG9vIG1hbnkgZmFpbHVyZXMgb3IgdGhlIHRpbWVvdXQgZWxhcHNlcyxcbiAqIHRoZW4gd2Ugc2V0IHRoZSBPbmxpbmVTdGF0ZSB0byBPZmZsaW5lLCBhbmQgdGhlIGNsaWVudCB3aWxsIGJlaGF2ZSBhcyBpZlxuICogaXQgaXMgb2ZmbGluZSAoZ2V0KClzIHdpbGwgcmV0dXJuIGNhY2hlZCBkYXRhLCBldGMuKS5cbiAqL1xuY2xhc3MgVW8ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5hc3luY1F1ZXVlID0gdCwgdGhpcy5vbmxpbmVTdGF0ZUhhbmRsZXIgPSBlLCBcbiAgICAgICAgLyoqIFRoZSBjdXJyZW50IE9ubGluZVN0YXRlLiAqL1xuICAgICAgICB0aGlzLnN0YXRlID0gXCJVbmtub3duXCIgLyogVW5rbm93biAqLyAsIFxuICAgICAgICAvKipcbiAgICAgICAgICogQSBjb3VudCBvZiBjb25zZWN1dGl2ZSBmYWlsdXJlcyB0byBvcGVuIHRoZSBzdHJlYW0uIElmIGl0IHJlYWNoZXMgdGhlXG4gICAgICAgICAqIG1heGltdW0gZGVmaW5lZCBieSBNQVhfV0FUQ0hfU1RSRUFNX0ZBSUxVUkVTLCB3ZSdsbCBzZXQgdGhlIE9ubGluZVN0YXRlIHRvXG4gICAgICAgICAqIE9mZmxpbmUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRhID0gMCwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHRpbWVyIHRoYXQgZWxhcHNlcyBhZnRlciBPTkxJTkVfU1RBVEVfVElNRU9VVF9NUywgYXQgd2hpY2ggcG9pbnQgd2VcbiAgICAgICAgICogdHJhbnNpdGlvbiBmcm9tIE9ubGluZVN0YXRlLlVua25vd24gdG8gT25saW5lU3RhdGUuT2ZmbGluZSB3aXRob3V0IHdhaXRpbmdcbiAgICAgICAgICogZm9yIHRoZSBzdHJlYW0gdG8gYWN0dWFsbHkgZmFpbCAoTUFYX1dBVENIX1NUUkVBTV9GQUlMVVJFUyB0aW1lcykuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmVhID0gbnVsbCwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGV0aGVyIHRoZSBjbGllbnQgc2hvdWxkIGxvZyBhIHdhcm5pbmcgbWVzc2FnZSBpZiBpdCBmYWlscyB0byBjb25uZWN0IHRvXG4gICAgICAgICAqIHRoZSBiYWNrZW5kIChpbml0aWFsbHkgdHJ1ZSwgY2xlYXJlZCBhZnRlciBhIHN1Y2Nlc3NmdWwgc3RyZWFtLCBvciBpZiB3ZSd2ZVxuICAgICAgICAgKiBsb2dnZWQgdGhlIG1lc3NhZ2UgYWxyZWFkeSkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm5hID0gITA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCBieSBSZW1vdGVTdG9yZSB3aGVuIGEgd2F0Y2ggc3RyZWFtIGlzIHN0YXJ0ZWQgKGluY2x1ZGluZyBvbiBlYWNoXG4gICAgICogYmFja29mZiBhdHRlbXB0KS5cbiAgICAgKlxuICAgICAqIElmIHRoaXMgaXMgdGhlIGZpcnN0IGF0dGVtcHQsIGl0IHNldHMgdGhlIE9ubGluZVN0YXRlIHRvIFVua25vd24gYW5kIHN0YXJ0c1xuICAgICAqIHRoZSBvbmxpbmVTdGF0ZVRpbWVyLlxuICAgICAqLyAgICBzYSgpIHtcbiAgICAgICAgMCA9PT0gdGhpcy50YSAmJiAodGhpcy5pYShcIlVua25vd25cIiAvKiBVbmtub3duICovKSwgdGhpcy5lYSA9IHRoaXMuYXN5bmNRdWV1ZS5lbnF1ZXVlQWZ0ZXJEZWxheShcIm9ubGluZV9zdGF0ZV90aW1lb3V0XCIgLyogT25saW5lU3RhdGVUaW1lb3V0ICovICwgMWU0LCAoKCkgPT4gKHRoaXMuZWEgPSBudWxsLCBcbiAgICAgICAgdGhpcy5yYShcIkJhY2tlbmQgZGlkbid0IHJlc3BvbmQgd2l0aGluIDEwIHNlY29uZHMuXCIpLCB0aGlzLmlhKFwiT2ZmbGluZVwiIC8qIE9mZmxpbmUgKi8pLCBcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkpKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIG91ciBPbmxpbmVTdGF0ZSBhcyBhcHByb3ByaWF0ZSBhZnRlciB0aGUgd2F0Y2ggc3RyZWFtIHJlcG9ydHMgYVxuICAgICAqIGZhaWx1cmUuIFRoZSBmaXJzdCBmYWlsdXJlIG1vdmVzIHVzIHRvIHRoZSAnVW5rbm93bicgc3RhdGUuIFdlIHRoZW4gbWF5XG4gICAgICogYWxsb3cgbXVsdGlwbGUgZmFpbHVyZXMgKGJhc2VkIG9uIE1BWF9XQVRDSF9TVFJFQU1fRkFJTFVSRVMpIGJlZm9yZSB3ZVxuICAgICAqIGFjdHVhbGx5IHRyYW5zaXRpb24gdG8gdGhlICdPZmZsaW5lJyBzdGF0ZS5cbiAgICAgKi8gICAgb2EodCkge1xuICAgICAgICBcIk9ubGluZVwiIC8qIE9ubGluZSAqLyA9PT0gdGhpcy5zdGF0ZSA/IHRoaXMuaWEoXCJVbmtub3duXCIgLyogVW5rbm93biAqLykgOiAodGhpcy50YSsrLCBcbiAgICAgICAgdGhpcy50YSA+PSAxICYmICh0aGlzLmFhKCksIHRoaXMucmEoYENvbm5lY3Rpb24gZmFpbGVkIDEgdGltZXMuIE1vc3QgcmVjZW50IGVycm9yOiAke3QudG9TdHJpbmcoKX1gKSwgXG4gICAgICAgIHRoaXMuaWEoXCJPZmZsaW5lXCIgLyogT2ZmbGluZSAqLykpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhwbGljaXRseSBzZXRzIHRoZSBPbmxpbmVTdGF0ZSB0byB0aGUgc3BlY2lmaWVkIHN0YXRlLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHRoaXMgcmVzZXRzIG91ciB0aW1lcnMgLyBmYWlsdXJlIGNvdW50ZXJzLCBldGMuIHVzZWQgYnkgb3VyXG4gICAgICogT2ZmbGluZSBoZXVyaXN0aWNzLCBzbyBtdXN0IG5vdCBiZSB1c2VkIGluIHBsYWNlIG9mXG4gICAgICogaGFuZGxlV2F0Y2hTdHJlYW1TdGFydCgpIGFuZCBoYW5kbGVXYXRjaFN0cmVhbUZhaWx1cmUoKS5cbiAgICAgKi8gICAgc2V0KHQpIHtcbiAgICAgICAgdGhpcy5hYSgpLCB0aGlzLnRhID0gMCwgXCJPbmxpbmVcIiAvKiBPbmxpbmUgKi8gPT09IHQgJiYgKFxuICAgICAgICAvLyBXZSd2ZSBjb25uZWN0ZWQgdG8gd2F0Y2ggYXQgbGVhc3Qgb25jZS4gRG9uJ3Qgd2FybiB0aGUgZGV2ZWxvcGVyXG4gICAgICAgIC8vIGFib3V0IGJlaW5nIG9mZmxpbmUgZ29pbmcgZm9yd2FyZC5cbiAgICAgICAgdGhpcy5uYSA9ICExKSwgdGhpcy5pYSh0KTtcbiAgICB9XG4gICAgaWEodCkge1xuICAgICAgICB0ICE9PSB0aGlzLnN0YXRlICYmICh0aGlzLnN0YXRlID0gdCwgdGhpcy5vbmxpbmVTdGF0ZUhhbmRsZXIodCkpO1xuICAgIH1cbiAgICByYSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBgQ291bGQgbm90IHJlYWNoIENsb3VkIEZpcmVzdG9yZSBiYWNrZW5kLiAke3R9XFxuVGhpcyB0eXBpY2FsbHkgaW5kaWNhdGVzIHRoYXQgeW91ciBkZXZpY2UgZG9lcyBub3QgaGF2ZSBhIGhlYWx0aHkgSW50ZXJuZXQgY29ubmVjdGlvbiBhdCB0aGUgbW9tZW50LiBUaGUgY2xpZW50IHdpbGwgb3BlcmF0ZSBpbiBvZmZsaW5lIG1vZGUgdW50aWwgaXQgaXMgYWJsZSB0byBzdWNjZXNzZnVsbHkgY29ubmVjdCB0byB0aGUgYmFja2VuZC5gO1xuICAgICAgICB0aGlzLm5hID8gKCQoZSksIHRoaXMubmEgPSAhMSkgOiBPKFwiT25saW5lU3RhdGVUcmFja2VyXCIsIGUpO1xuICAgIH1cbiAgICBhYSgpIHtcbiAgICAgICAgbnVsbCAhPT0gdGhpcy5lYSAmJiAodGhpcy5lYS5jYW5jZWwoKSwgdGhpcy5lYSA9IG51bGwpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gY2xhc3MgS28ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIFRoZSBsb2NhbCBzdG9yZSwgdXNlZCB0byBmaWxsIHRoZSB3cml0ZSBwaXBlbGluZSB3aXRoIG91dGJvdW5kIG11dGF0aW9ucy5cbiAgICAgKi9cbiAgICB0LCBcbiAgICAvKiogVGhlIGNsaWVudC1zaWRlIHByb3h5IGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBiYWNrZW5kLiAqL1xuICAgIGUsIG4sIHMsIGkpIHtcbiAgICAgICAgdGhpcy5sb2NhbFN0b3JlID0gdCwgdGhpcy5kYXRhc3RvcmUgPSBlLCB0aGlzLmFzeW5jUXVldWUgPSBuLCB0aGlzLnJlbW90ZVN5bmNlciA9IHt9LCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgbGlzdCBvZiB1cCB0byBNQVhfUEVORElOR19XUklURVMgd3JpdGVzIHRoYXQgd2UgaGF2ZSBmZXRjaGVkIGZyb20gdGhlXG4gICAgICAgICAqIExvY2FsU3RvcmUgdmlhIGZpbGxXcml0ZVBpcGVsaW5lKCkgYW5kIGhhdmUgb3Igd2lsbCBzZW5kIHRvIHRoZSB3cml0ZVxuICAgICAgICAgKiBzdHJlYW0uXG4gICAgICAgICAqXG4gICAgICAgICAqIFdoZW5ldmVyIHdyaXRlUGlwZWxpbmUubGVuZ3RoID4gMCB0aGUgUmVtb3RlU3RvcmUgd2lsbCBhdHRlbXB0IHRvIHN0YXJ0IG9yXG4gICAgICAgICAqIHJlc3RhcnQgdGhlIHdyaXRlIHN0cmVhbS4gV2hlbiB0aGUgc3RyZWFtIGlzIGVzdGFibGlzaGVkIHRoZSB3cml0ZXMgaW4gdGhlXG4gICAgICAgICAqIHBpcGVsaW5lIHdpbGwgYmUgc2VudCBpbiBvcmRlci5cbiAgICAgICAgICpcbiAgICAgICAgICogV3JpdGVzIHJlbWFpbiBpbiB3cml0ZVBpcGVsaW5lIHVudGlsIHRoZXkgYXJlIGFja25vd2xlZGdlZCBieSB0aGUgYmFja2VuZFxuICAgICAgICAgKiBhbmQgdGh1cyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgcmUtc2VudCBpZiB0aGUgc3RyZWFtIGlzIGludGVycnVwdGVkIC9cbiAgICAgICAgICogcmVzdGFydGVkIGJlZm9yZSB0aGV5J3JlIGFja25vd2xlZGdlZC5cbiAgICAgICAgICpcbiAgICAgICAgICogV3JpdGUgcmVzcG9uc2VzIGZyb20gdGhlIGJhY2tlbmQgYXJlIGxpbmtlZCB0byB0aGVpciBvcmlnaW5hdGluZyByZXF1ZXN0XG4gICAgICAgICAqIHB1cmVseSBiYXNlZCBvbiBvcmRlciwgYW5kIHNvIHdlIGNhbiBqdXN0IHNoaWZ0KCkgd3JpdGVzIGZyb20gdGhlIGZyb250IG9mXG4gICAgICAgICAqIHRoZSB3cml0ZVBpcGVsaW5lIGFzIHdlIHJlY2VpdmUgcmVzcG9uc2VzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy51YSA9IFtdLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgbWFwcGluZyBvZiB3YXRjaGVkIHRhcmdldHMgdGhhdCB0aGUgY2xpZW50IGNhcmVzIGFib3V0IHRyYWNraW5nIGFuZCB0aGVcbiAgICAgICAgICogdXNlciBoYXMgZXhwbGljaXRseSBjYWxsZWQgYSAnbGlzdGVuJyBmb3IgdGhpcyB0YXJnZXQuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZXNlIHRhcmdldHMgbWF5IG9yIG1heSBub3QgaGF2ZSBiZWVuIHNlbnQgdG8gb3IgYWNrbm93bGVkZ2VkIGJ5IHRoZVxuICAgICAgICAgKiBzZXJ2ZXIuIE9uIHJlLWVzdGFibGlzaGluZyB0aGUgbGlzdGVuIHN0cmVhbSwgdGhlc2UgdGFyZ2V0cyBzaG91bGQgYmUgc2VudFxuICAgICAgICAgKiB0byB0aGUgc2VydmVyLiBUaGUgdGFyZ2V0cyByZW1vdmVkIHdpdGggdW5saXN0ZW5zIGFyZSByZW1vdmVkIGVhZ2VybHlcbiAgICAgICAgICogd2l0aG91dCB3YWl0aW5nIGZvciBjb25maXJtYXRpb24gZnJvbSB0aGUgbGlzdGVuIHN0cmVhbS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2EgPSBuZXcgTWFwLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgc2V0IG9mIHJlYXNvbnMgZm9yIHdoeSB0aGUgUmVtb3RlU3RvcmUgbWF5IGJlIG9mZmxpbmUuIElmIGVtcHR5LCB0aGVcbiAgICAgICAgICogUmVtb3RlU3RvcmUgbWF5IHN0YXJ0IGl0cyBuZXR3b3JrIGNvbm5lY3Rpb25zLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5oYSA9IG5ldyBTZXQsIFxuICAgICAgICAvKipcbiAgICAgICAgICogRXZlbnQgaGFuZGxlcnMgdGhhdCBnZXQgY2FsbGVkIHdoZW4gdGhlIG5ldHdvcmsgaXMgZGlzYWJsZWQgb3IgZW5hYmxlZC5cbiAgICAgICAgICpcbiAgICAgICAgICogUE9SVElORyBOT1RFOiBUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgb24gdGhlIFdlYiBjbGllbnQgdG8gY3JlYXRlIHRoZVxuICAgICAgICAgKiB1bmRlcmx5aW5nIHN0cmVhbXMgKHRvIHN1cHBvcnQgdHJlZS1zaGFrZWFibGUgc3RyZWFtcykuIE9uIEFuZHJvaWQgYW5kIGlPUyxcbiAgICAgICAgICogdGhlIHN0cmVhbXMgYXJlIGNyZWF0ZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiBvZiBSZW1vdGVTdG9yZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubGEgPSBbXSwgdGhpcy5mYSA9IGksIHRoaXMuZmEuRnIoKHQgPT4ge1xuICAgICAgICAgICAgbi5lbnF1ZXVlQW5kRm9yZ2V0KChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gUG9ydGluZyBOb3RlOiBVbmxpa2UgaU9TLCBgcmVzdGFydE5ldHdvcmsoKWAgaXMgY2FsbGVkIGV2ZW4gd2hlbiB0aGVcbiAgICAgICAgICAgICAgICAvLyBuZXR3b3JrIGJlY29tZXMgdW5yZWFjaGFibGUgYXMgd2UgZG9uJ3QgaGF2ZSBhbnkgb3RoZXIgd2F5IHRvIHRlYXJcbiAgICAgICAgICAgICAgICAvLyBkb3duIG91ciBzdHJlYW1zLlxuICAgICAgICAgICAgICAgIFhvKHRoaXMpICYmIChPKFwiUmVtb3RlU3RvcmVcIiwgXCJSZXN0YXJ0aW5nIHN0cmVhbXMgZm9yIG5ldHdvcmsgcmVhY2hhYmlsaXR5IGNoYW5nZS5cIiksIFxuICAgICAgICAgICAgICAgIGF3YWl0IGFzeW5jIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IEsodCk7XG4gICAgICAgICAgICAgICAgICAgIGUuaGEuYWRkKDQgLyogQ29ubmVjdGl2aXR5Q2hhbmdlICovKSwgYXdhaXQgUW8oZSksIGUuZGEuc2V0KFwiVW5rbm93blwiIC8qIFVua25vd24gKi8pLCBcbiAgICAgICAgICAgICAgICAgICAgZS5oYS5kZWxldGUoNCAvKiBDb25uZWN0aXZpdHlDaGFuZ2UgKi8pLCBhd2FpdCBHbyhlKTtcbiAgICAgICAgICAgICAgICB9KHRoaXMpKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSkpLCB0aGlzLmRhID0gbmV3IFVvKG4sIHMpO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gR28odCkge1xuICAgIGlmIChYbyh0KSkgZm9yIChjb25zdCBlIG9mIHQubGEpIGF3YWl0IGUoLyogZW5hYmxlZD0gKi8gITApO1xufVxuXG4vKipcbiAqIFRlbXBvcmFyaWx5IGRpc2FibGVzIHRoZSBuZXR3b3JrLiBUaGUgbmV0d29yayBjYW4gYmUgcmUtZW5hYmxlZCB1c2luZ1xuICogZW5hYmxlTmV0d29yaygpLlxuICovIGFzeW5jIGZ1bmN0aW9uIFFvKHQpIHtcbiAgICBmb3IgKGNvbnN0IGUgb2YgdC5sYSkgYXdhaXQgZSgvKiBlbmFibGVkPSAqLyAhMSk7XG59XG5cbi8qKlxuICogU3RhcnRzIG5ldyBsaXN0ZW4gZm9yIHRoZSBnaXZlbiB0YXJnZXQuIFVzZXMgcmVzdW1lIHRva2VuIGlmIHByb3ZpZGVkLiBJdFxuICogaXMgYSBuby1vcCBpZiB0aGUgdGFyZ2V0IG9mIGdpdmVuIGBUYXJnZXREYXRhYCBpcyBhbHJlYWR5IGJlaW5nIGxpc3RlbmVkIHRvLlxuICovXG5mdW5jdGlvbiBqbyh0LCBlKSB7XG4gICAgY29uc3QgbiA9IEsodCk7XG4gICAgbi5jYS5oYXMoZS50YXJnZXRJZCkgfHwgKFxuICAgIC8vIE1hcmsgdGhpcyBhcyBzb21ldGhpbmcgdGhlIGNsaWVudCBpcyBjdXJyZW50bHkgbGlzdGVuaW5nIGZvci5cbiAgICBuLmNhLnNldChlLnRhcmdldElkLCBlKSwgWW8obikgPyBcbiAgICAvLyBUaGUgbGlzdGVuIHdpbGwgYmUgc2VudCBpbiBvbldhdGNoU3RyZWFtT3BlblxuICAgIEpvKG4pIDogbWEobikuRG8oKSAmJiB6byhuLCBlKSk7XG59XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgbGlzdGVuIGZyb20gc2VydmVyLiBJdCBpcyBhIG5vLW9wIGlmIHRoZSBnaXZlbiB0YXJnZXQgaWQgaXNcbiAqIG5vdCBiZWluZyBsaXN0ZW5lZCB0by5cbiAqLyBmdW5jdGlvbiBXbyh0LCBlKSB7XG4gICAgY29uc3QgbiA9IEsodCksIHMgPSBtYShuKTtcbiAgICBuLmNhLmRlbGV0ZShlKSwgcy5EbygpICYmIEhvKG4sIGUpLCAwID09PSBuLmNhLnNpemUgJiYgKHMuRG8oKSA/IHMuTm8oKSA6IFhvKG4pICYmIFxuICAgIC8vIFJldmVydCB0byBPbmxpbmVTdGF0ZS5Vbmtub3duIGlmIHRoZSB3YXRjaCBzdHJlYW0gaXMgbm90IG9wZW4gYW5kIHdlXG4gICAgLy8gaGF2ZSBubyBsaXN0ZW5lcnMsIHNpbmNlIHdpdGhvdXQgYW55IGxpc3RlbnMgdG8gc2VuZCB3ZSBjYW5ub3RcbiAgICAvLyBjb25maXJtIGlmIHRoZSBzdHJlYW0gaXMgaGVhbHRoeSBhbmQgdXBncmFkZSB0byBPbmxpbmVTdGF0ZS5PbmxpbmUuXG4gICAgbi5kYS5zZXQoXCJVbmtub3duXCIgLyogVW5rbm93biAqLykpO1xufVxuXG4vKipcbiAqIFdlIG5lZWQgdG8gaW5jcmVtZW50IHRoZSB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIHBlbmRpbmcgcmVzcG9uc2VzIHdlJ3JlIGR1ZVxuICogZnJvbSB3YXRjaCBzbyB3ZSB3YWl0IGZvciB0aGUgYWNrIHRvIHByb2Nlc3MgYW55IG1lc3NhZ2VzIGZyb20gdGhpcyB0YXJnZXQuXG4gKi8gZnVuY3Rpb24gem8odCwgZSkge1xuICAgIHQuX2EuWihlLnRhcmdldElkKSwgbWEodCkuR28oZSk7XG59XG5cbi8qKlxuICogV2UgbmVlZCB0byBpbmNyZW1lbnQgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBwZW5kaW5nIHJlc3BvbnNlcyB3ZSdyZSBkdWVcbiAqIGZyb20gd2F0Y2ggc28gd2Ugd2FpdCBmb3IgdGhlIHJlbW92YWwgb24gdGhlIHNlcnZlciBiZWZvcmUgd2UgcHJvY2VzcyBhbnlcbiAqIG1lc3NhZ2VzIGZyb20gdGhpcyB0YXJnZXQuXG4gKi8gZnVuY3Rpb24gSG8odCwgZSkge1xuICAgIHQuX2EuWihlKSwgbWEodCkuUW8oZSk7XG59XG5cbmZ1bmN0aW9uIEpvKHQpIHtcbiAgICB0Ll9hID0gbmV3IFpuKHtcbiAgICAgICAgZ2V0UmVtb3RlS2V5c0ZvclRhcmdldDogZSA9PiB0LnJlbW90ZVN5bmNlci5nZXRSZW1vdGVLZXlzRm9yVGFyZ2V0KGUpLFxuICAgICAgICBFdDogZSA9PiB0LmNhLmdldChlKSB8fCBudWxsXG4gICAgfSksIG1hKHQpLnN0YXJ0KCksIHQuZGEuc2EoKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHdhdGNoIHN0cmVhbSBzaG91bGQgYmUgc3RhcnRlZCBiZWNhdXNlIGl0J3MgbmVjZXNzYXJ5XG4gKiBhbmQgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkLlxuICovIGZ1bmN0aW9uIFlvKHQpIHtcbiAgICByZXR1cm4gWG8odCkgJiYgIW1hKHQpLlNvKCkgJiYgdC5jYS5zaXplID4gMDtcbn1cblxuZnVuY3Rpb24gWG8odCkge1xuICAgIHJldHVybiAwID09PSBLKHQpLmhhLnNpemU7XG59XG5cbmZ1bmN0aW9uIFpvKHQpIHtcbiAgICB0Ll9hID0gdm9pZCAwO1xufVxuXG5hc3luYyBmdW5jdGlvbiB0YSh0KSB7XG4gICAgdC5jYS5mb3JFYWNoKCgoZSwgbikgPT4ge1xuICAgICAgICB6byh0LCBlKTtcbiAgICB9KSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGVhKHQsIGUpIHtcbiAgICBabyh0KSwgXG4gICAgLy8gSWYgd2Ugc3RpbGwgbmVlZCB0aGUgd2F0Y2ggc3RyZWFtLCByZXRyeSB0aGUgY29ubmVjdGlvbi5cbiAgICBZbyh0KSA/ICh0LmRhLm9hKGUpLCBKbyh0KSkgOiBcbiAgICAvLyBObyBuZWVkIHRvIHJlc3RhcnQgd2F0Y2ggc3RyZWFtIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGFjdGl2ZSB0YXJnZXRzLlxuICAgIC8vIFRoZSBvbmxpbmUgc3RhdGUgaXMgc2V0IHRvIHVua25vd24gYmVjYXVzZSB0aGVyZSBpcyBubyBhY3RpdmUgYXR0ZW1wdFxuICAgIC8vIGF0IGVzdGFibGlzaGluZyBhIGNvbm5lY3Rpb25cbiAgICB0LmRhLnNldChcIlVua25vd25cIiAvKiBVbmtub3duICovKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbmEodCwgZSwgbikge1xuICAgIGlmIChcbiAgICAvLyBNYXJrIHRoZSBjbGllbnQgYXMgb25saW5lIHNpbmNlIHdlIGdvdCBhIG1lc3NhZ2UgZnJvbSB0aGUgc2VydmVyXG4gICAgdC5kYS5zZXQoXCJPbmxpbmVcIiAvKiBPbmxpbmUgKi8pLCBlIGluc3RhbmNlb2YgWW4gJiYgMiAvKiBSZW1vdmVkICovID09PSBlLnN0YXRlICYmIGUuY2F1c2UpIFxuICAgIC8vIFRoZXJlIHdhcyBhbiBlcnJvciBvbiBhIHRhcmdldCwgZG9uJ3Qgd2FpdCBmb3IgYSBjb25zaXN0ZW50IHNuYXBzaG90XG4gICAgLy8gdG8gcmFpc2UgZXZlbnRzXG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgXG4gICAgICAgIC8qKiBIYW5kbGVzIGFuIGVycm9yIG9uIGEgdGFyZ2V0ICovXG4gICAgICAgIGFzeW5jIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBlLmNhdXNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzIG9mIGUudGFyZ2V0SWRzKSBcbiAgICAgICAgICAgIC8vIEEgd2F0Y2hlZCB0YXJnZXQgbWlnaHQgaGF2ZSBiZWVuIHJlbW92ZWQgYWxyZWFkeS5cbiAgICAgICAgICAgIHQuY2EuaGFzKHMpICYmIChhd2FpdCB0LnJlbW90ZVN5bmNlci5yZWplY3RMaXN0ZW4ocywgbiksIHQuY2EuZGVsZXRlKHMpLCB0Ll9hLnJlbW92ZVRhcmdldChzKSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gKiBBdHRlbXB0cyB0byBmaWxsIG91ciB3cml0ZSBwaXBlbGluZSB3aXRoIHdyaXRlcyBmcm9tIHRoZSBMb2NhbFN0b3JlLlxuICpcbiAqIENhbGxlZCBpbnRlcm5hbGx5IHRvIGJvb3RzdHJhcCBvciByZWZpbGwgdGhlIHdyaXRlIHBpcGVsaW5lIGFuZCBieVxuICogU3luY0VuZ2luZSB3aGVuZXZlciB0aGVyZSBhcmUgbmV3IG11dGF0aW9ucyB0byBwcm9jZXNzLlxuICpcbiAqIFN0YXJ0cyB0aGUgd3JpdGUgc3RyZWFtIGlmIG5lY2Vzc2FyeS5cbiAqLyAodCwgZSk7XG4gICAgfSBjYXRjaCAobikge1xuICAgICAgICBPKFwiUmVtb3RlU3RvcmVcIiwgXCJGYWlsZWQgdG8gcmVtb3ZlIHRhcmdldHMgJXM6ICVzIFwiLCBlLnRhcmdldElkcy5qb2luKFwiLFwiKSwgbiksIFxuICAgICAgICBhd2FpdCBzYSh0LCBuKTtcbiAgICB9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBIbiA/IHQuX2EuYXQoZSkgOiBlIGluc3RhbmNlb2YgSm4gPyB0Ll9hLl90KGUpIDogdC5fYS5odChlKSwgXG4gICAgIW4uaXNFcXVhbChjdC5taW4oKSkpIHRyeSB7XG4gICAgICAgIGNvbnN0IGUgPSBhd2FpdCBIcih0LmxvY2FsU3RvcmUpO1xuICAgICAgICBuLmNvbXBhcmVUbyhlKSA+PSAwICYmIFxuICAgICAgICAvLyBXZSBoYXZlIHJlY2VpdmVkIGEgdGFyZ2V0IGNoYW5nZSB3aXRoIGEgZ2xvYmFsIHNuYXBzaG90IGlmIHRoZSBzbmFwc2hvdFxuICAgICAgICAvLyB2ZXJzaW9uIGlzIG5vdCBlcXVhbCB0byBTbmFwc2hvdFZlcnNpb24ubWluKCkuXG4gICAgICAgIGF3YWl0IFxuICAgICAgICAvKipcbiAqIFRha2VzIGEgYmF0Y2ggb2YgY2hhbmdlcyBmcm9tIHRoZSBEYXRhc3RvcmUsIHJlcGFja2FnZXMgdGhlbSBhcyBhXG4gKiBSZW1vdGVFdmVudCwgYW5kIHBhc3NlcyB0aGF0IG9uIHRvIHRoZSBsaXN0ZW5lciwgd2hpY2ggaXMgdHlwaWNhbGx5IHRoZVxuICogU3luY0VuZ2luZS5cbiAqL1xuICAgICAgICBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdC5fYS55dChlKTtcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBpbi1tZW1vcnkgcmVzdW1lIHRva2Vucy4gTG9jYWxTdG9yZSB3aWxsIHVwZGF0ZSB0aGVcbiAgICAgICAgICAgIC8vIHBlcnNpc3RlbnQgdmlldyBvZiB0aGVzZSB3aGVuIGFwcGx5aW5nIHRoZSBjb21wbGV0ZWQgUmVtb3RlRXZlbnQuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi50YXJnZXRDaGFuZ2VzLmZvckVhY2goKChuLCBzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG4ucmVzdW1lVG9rZW4uYXBwcm94aW1hdGVCeXRlU2l6ZSgpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdC5jYS5nZXQocyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEEgd2F0Y2hlZCB0YXJnZXQgbWlnaHQgaGF2ZSBiZWVuIHJlbW92ZWQgYWxyZWFkeS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICYmIHQuY2Euc2V0KHMsIGkud2l0aFJlc3VtZVRva2VuKG4ucmVzdW1lVG9rZW4sIGUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSksIFxuICAgICAgICAgICAgLy8gUmUtZXN0YWJsaXNoIGxpc3RlbnMgZm9yIHRoZSB0YXJnZXRzIHRoYXQgaGF2ZSBiZWVuIGludmFsaWRhdGVkIGJ5XG4gICAgICAgICAgICAvLyBleGlzdGVuY2UgZmlsdGVyIG1pc21hdGNoZXMuXG4gICAgICAgICAgICBuLnRhcmdldE1pc21hdGNoZXMuZm9yRWFjaCgoZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbiA9IHQuY2EuZ2V0KGUpO1xuICAgICAgICAgICAgICAgIGlmICghbikgXG4gICAgICAgICAgICAgICAgLy8gQSB3YXRjaGVkIHRhcmdldCBtaWdodCBoYXZlIGJlZW4gcmVtb3ZlZCBhbHJlYWR5LlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgcmVzdW1lIHRva2VuIGZvciB0aGUgdGFyZ2V0LCBzaW5jZSB3ZSdyZSBpbiBhIGtub3duIG1pc21hdGNoXG4gICAgICAgICAgICAgICAgLy8gc3RhdGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuY2Euc2V0KGUsIG4ud2l0aFJlc3VtZVRva2VuKHB0LkVNUFRZX0JZVEVfU1RSSU5HLCBuLnNuYXBzaG90VmVyc2lvbikpLCBcbiAgICAgICAgICAgICAgICAvLyBDYXVzZSBhIGhhcmQgcmVzZXQgYnkgdW53YXRjaGluZyBhbmQgcmV3YXRjaGluZyBpbW1lZGlhdGVseSwgYnV0XG4gICAgICAgICAgICAgICAgLy8gZGVsaWJlcmF0ZWx5IGRvbid0IHNlbmQgYSByZXN1bWUgdG9rZW4gc28gdGhhdCB3ZSBnZXQgYSBmdWxsIHVwZGF0ZS5cbiAgICAgICAgICAgICAgICBIbyh0LCBlKTtcbiAgICAgICAgICAgICAgICAvLyBNYXJrIHRoZSB0YXJnZXQgd2Ugc2VuZCBhcyBiZWluZyBvbiBiZWhhbGYgb2YgYW4gZXhpc3RlbmNlIGZpbHRlclxuICAgICAgICAgICAgICAgIC8vIG1pc21hdGNoLCBidXQgZG9uJ3QgYWN0dWFsbHkgcmV0YWluIHRoYXQgaW4gbGlzdGVuVGFyZ2V0cy4gVGhpcyBlbnN1cmVzXG4gICAgICAgICAgICAgICAgLy8gdGhhdCB3ZSBmbGFnIHRoZSBmaXJzdCByZS1saXN0ZW4gdGhpcyB3YXkgd2l0aG91dCBpbXBhY3RpbmcgZnV0dXJlXG4gICAgICAgICAgICAgICAgLy8gbGlzdGVucyBvZiB0aGlzIHRhcmdldCAodGhhdCBtaWdodCBoYXBwZW4gZS5nLiBvbiByZWNvbm5lY3QpLlxuICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBuZXcgQWkobi50YXJnZXQsIGUsIDEgLyogRXhpc3RlbmNlRmlsdGVyTWlzbWF0Y2ggKi8gLCBuLnNlcXVlbmNlTnVtYmVyKTtcbiAgICAgICAgICAgICAgICB6byh0LCBzKTtcbiAgICAgICAgICAgIH0pKSwgdC5yZW1vdGVTeW5jZXIuYXBwbHlSZW1vdGVFdmVudChuKTtcbiAgICAgICAgfSh0LCBuKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIE8oXCJSZW1vdGVTdG9yZVwiLCBcIkZhaWxlZCB0byByYWlzZSBzbmFwc2hvdDpcIiwgZSksIGF3YWl0IHNhKHQsIGUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZWNvdmVyeSBsb2dpYyBmb3IgSW5kZXhlZERCIGVycm9ycyB0aGF0IHRha2VzIHRoZSBuZXR3b3JrIG9mZmxpbmUgdW50aWxcbiAqIGBvcGAgc3VjY2VlZHMuIFJldHJpZXMgYXJlIHNjaGVkdWxlZCB3aXRoIGJhY2tvZmYgdXNpbmdcbiAqIGBlbnF1ZXVlUmV0cnlhYmxlKClgLiBJZiBgb3AoKWAgaXMgbm90IHByb3ZpZGVkLCBJbmRleGVkREIgYWNjZXNzIGlzXG4gKiB2YWxpZGF0ZWQgdmlhIGEgZ2VuZXJpYyBvcGVyYXRpb24uXG4gKlxuICogVGhlIHJldHVybmVkIFByb21pc2UgaXMgcmVzb2x2ZWQgb25jZSB0aGUgbmV0d29yayBpcyBkaXNhYmxlZCBhbmQgYmVmb3JlXG4gKiBhbnkgcmV0cnkgYXR0ZW1wdC5cbiAqLyBhc3luYyBmdW5jdGlvbiBzYSh0LCBlLCBuKSB7XG4gICAgaWYgKCFkaShlKSkgdGhyb3cgZTtcbiAgICB0LmhhLmFkZCgxIC8qIEluZGV4ZWREYkZhaWxlZCAqLyksIFxuICAgIC8vIERpc2FibGUgbmV0d29yayBhbmQgcmFpc2Ugb2ZmbGluZSBzbmFwc2hvdHNcbiAgICBhd2FpdCBRbyh0KSwgdC5kYS5zZXQoXCJPZmZsaW5lXCIgLyogT2ZmbGluZSAqLyksIG4gfHwgKFxuICAgIC8vIFVzZSBhIHNpbXBsZSByZWFkIG9wZXJhdGlvbiB0byBkZXRlcm1pbmUgaWYgSW5kZXhlZERCIHJlY292ZXJlZC5cbiAgICAvLyBJZGVhbGx5LCB3ZSB3b3VsZCBleHBvc2UgYSBoZWFsdGggY2hlY2sgZGlyZWN0bHkgb24gU2ltcGxlRGIsIGJ1dFxuICAgIC8vIFJlbW90ZVN0b3JlIG9ubHkgaGFzIGFjY2VzcyB0byBwZXJzaXN0ZW5jZSB0aHJvdWdoIExvY2FsU3RvcmUuXG4gICAgbiA9ICgpID0+IEhyKHQubG9jYWxTdG9yZSkpLCBcbiAgICAvLyBQcm9iZSBJbmRleGVkREIgcGVyaW9kaWNhbGx5IGFuZCByZS1lbmFibGUgbmV0d29ya1xuICAgIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlUmV0cnlhYmxlKChhc3luYyAoKSA9PiB7XG4gICAgICAgIE8oXCJSZW1vdGVTdG9yZVwiLCBcIlJldHJ5aW5nIEluZGV4ZWREQiBhY2Nlc3NcIiksIGF3YWl0IG4oKSwgdC5oYS5kZWxldGUoMSAvKiBJbmRleGVkRGJGYWlsZWQgKi8pLCBcbiAgICAgICAgYXdhaXQgR28odCk7XG4gICAgfSkpO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIGBvcGAuIElmIGBvcGAgZmFpbHMsIHRha2VzIHRoZSBuZXR3b3JrIG9mZmxpbmUgdW50aWwgYG9wYFxuICogc3VjY2VlZHMuIFJldHVybnMgYWZ0ZXIgdGhlIGZpcnN0IGF0dGVtcHQuXG4gKi8gZnVuY3Rpb24gaWEodCwgZSkge1xuICAgIHJldHVybiBlKCkuY2F0Y2goKG4gPT4gc2EodCwgbiwgZSkpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmEodCkge1xuICAgIGNvbnN0IGUgPSBLKHQpLCBuID0gZ2EoZSk7XG4gICAgbGV0IHMgPSBlLnVhLmxlbmd0aCA+IDAgPyBlLnVhW2UudWEubGVuZ3RoIC0gMV0uYmF0Y2hJZCA6IC0xO1xuICAgIGZvciAoO29hKGUpOyApIHRyeSB7XG4gICAgICAgIGNvbnN0IHQgPSBhd2FpdCBYcihlLmxvY2FsU3RvcmUsIHMpO1xuICAgICAgICBpZiAobnVsbCA9PT0gdCkge1xuICAgICAgICAgICAgMCA9PT0gZS51YS5sZW5ndGggJiYgbi5ObygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcyA9IHQuYmF0Y2hJZCwgYWEoZSwgdCk7XG4gICAgfSBjYXRjaCAodCkge1xuICAgICAgICBhd2FpdCBzYShlLCB0KTtcbiAgICB9XG4gICAgdWEoZSkgJiYgY2EoZSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHdlIGNhbiBhZGQgdG8gdGhlIHdyaXRlIHBpcGVsaW5lIChpLmUuIHRoZSBuZXR3b3JrIGlzXG4gKiBlbmFibGVkIGFuZCB0aGUgd3JpdGUgcGlwZWxpbmUgaXMgbm90IGZ1bGwpLlxuICovIGZ1bmN0aW9uIG9hKHQpIHtcbiAgICByZXR1cm4gWG8odCkgJiYgdC51YS5sZW5ndGggPCAxMDtcbn1cblxuLyoqXG4gKiBRdWV1ZXMgYWRkaXRpb25hbCB3cml0ZXMgdG8gYmUgc2VudCB0byB0aGUgd3JpdGUgc3RyZWFtLCBzZW5kaW5nIHRoZW1cbiAqIGltbWVkaWF0ZWx5IGlmIHRoZSB3cml0ZSBzdHJlYW0gaXMgZXN0YWJsaXNoZWQuXG4gKi8gZnVuY3Rpb24gYWEodCwgZSkge1xuICAgIHQudWEucHVzaChlKTtcbiAgICBjb25zdCBuID0gZ2EodCk7XG4gICAgbi5EbygpICYmIG4uV28gJiYgbi56byhlLm11dGF0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIHVhKHQpIHtcbiAgICByZXR1cm4gWG8odCkgJiYgIWdhKHQpLlNvKCkgJiYgdC51YS5sZW5ndGggPiAwO1xufVxuXG5mdW5jdGlvbiBjYSh0KSB7XG4gICAgZ2EodCkuc3RhcnQoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGEodCkge1xuICAgIGdhKHQpLllvKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxhKHQpIHtcbiAgICBjb25zdCBlID0gZ2EodCk7XG4gICAgLy8gU2VuZCB0aGUgd3JpdGUgcGlwZWxpbmUgbm93IHRoYXQgdGhlIHN0cmVhbSBpcyBlc3RhYmxpc2hlZC5cbiAgICAgICAgZm9yIChjb25zdCBuIG9mIHQudWEpIGUuem8obi5tdXRhdGlvbnMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmYSh0LCBlLCBuKSB7XG4gICAgY29uc3QgcyA9IHQudWEuc2hpZnQoKSwgaSA9IFRpLmZyb20ocywgZSwgbik7XG4gICAgYXdhaXQgaWEodCwgKCgpID0+IHQucmVtb3RlU3luY2VyLmFwcGx5U3VjY2Vzc2Z1bFdyaXRlKGkpKSksIFxuICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3aXRoIHRoZSBjb21wbGV0aW9uIG9mIHRoaXMgbXV0YXRpb24gYW5vdGhlclxuICAgIC8vIHNsb3QgaGFzIGZyZWVkIHVwLlxuICAgIGF3YWl0IHJhKHQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkYSh0LCBlKSB7XG4gICAgLy8gSWYgdGhlIHdyaXRlIHN0cmVhbSBjbG9zZWQgYWZ0ZXIgdGhlIHdyaXRlIGhhbmRzaGFrZSBjb21wbGV0ZXMsIGEgd3JpdGVcbiAgICAvLyBvcGVyYXRpb24gZmFpbGVkIGFuZCB3ZSBmYWlsIHRoZSBwZW5kaW5nIG9wZXJhdGlvbi5cbiAgICBlICYmIGdhKHQpLldvICYmIFxuICAgIC8vIFRoaXMgZXJyb3IgYWZmZWN0cyB0aGUgYWN0dWFsIHdyaXRlLlxuICAgIGF3YWl0IGFzeW5jIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgLy8gT25seSBoYW5kbGUgcGVybWFuZW50IGVycm9ycyBoZXJlLiBJZiBpdCdzIHRyYW5zaWVudCwganVzdCBsZXQgdGhlIHJldHJ5XG4gICAgICAgIC8vIGxvZ2ljIGtpY2sgaW4uXG4gICAgICAgIGlmIChuID0gZS5jb2RlLCB2bihuKSAmJiBuICE9PSBHLkFCT1JURUQpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgd2FzIGEgcGVybWFuZW50IGVycm9yLCB0aGUgcmVxdWVzdCBpdHNlbGYgd2FzIHRoZSBwcm9ibGVtXG4gICAgICAgICAgICAvLyBzbyBpdCdzIG5vdCBnb2luZyB0byBzdWNjZWVkIGlmIHdlIHJlc2VuZCBpdC5cbiAgICAgICAgICAgIGNvbnN0IG4gPSB0LnVhLnNoaWZ0KCk7XG4gICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UgaXQncyBhbHNvIHVubGlrZWx5IHRoYXQgdGhlIHNlcnZlciBpdHNlbGYgaXMgbWVsdGluZ1xuICAgICAgICAgICAgLy8gZG93biAtLSB0aGlzIHdhcyBqdXN0IGEgYmFkIHJlcXVlc3Qgc28gaW5oaWJpdCBiYWNrb2ZmIG9uIHRoZSBuZXh0XG4gICAgICAgICAgICAvLyByZXN0YXJ0LlxuICAgICAgICAgICAgICAgICAgICAgICAgZ2EodCkueG8oKSwgYXdhaXQgaWEodCwgKCgpID0+IHQucmVtb3RlU3luY2VyLnJlamVjdEZhaWxlZFdyaXRlKG4uYmF0Y2hJZCwgZSkpKSwgXG4gICAgICAgICAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgd2l0aCB0aGUgY29tcGxldGlvbiBvZiB0aGlzIG11dGF0aW9uXG4gICAgICAgICAgICAvLyBhbm90aGVyIHNsb3QgaGFzIGZyZWVkIHVwLlxuICAgICAgICAgICAgYXdhaXQgcmEodCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG47XG4gICAgfSh0LCBlKSwgXG4gICAgLy8gVGhlIHdyaXRlIHN0cmVhbSBtaWdodCBoYXZlIGJlZW4gc3RhcnRlZCBieSByZWZpbGxpbmcgdGhlIHdyaXRlXG4gICAgLy8gcGlwZWxpbmUgZm9yIGZhaWxlZCB3cml0ZXNcbiAgICB1YSh0KSAmJiBjYSh0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX2EodCwgZSkge1xuICAgIGNvbnN0IG4gPSBLKHQpO1xuICAgIG4uYXN5bmNRdWV1ZS52ZXJpZnlPcGVyYXRpb25JblByb2dyZXNzKCksIE8oXCJSZW1vdGVTdG9yZVwiLCBcIlJlbW90ZVN0b3JlIHJlY2VpdmVkIG5ldyBjcmVkZW50aWFsc1wiKTtcbiAgICBjb25zdCBzID0gWG8obik7XG4gICAgLy8gVGVhciBkb3duIGFuZCByZS1jcmVhdGUgb3VyIG5ldHdvcmsgc3RyZWFtcy4gVGhpcyB3aWxsIGVuc3VyZSB3ZSBnZXQgYVxuICAgIC8vIGZyZXNoIGF1dGggdG9rZW4gZm9yIHRoZSBuZXcgdXNlciBhbmQgcmUtZmlsbCB0aGUgd3JpdGUgcGlwZWxpbmUgd2l0aFxuICAgIC8vIG5ldyBtdXRhdGlvbnMgZnJvbSB0aGUgTG9jYWxTdG9yZSAoc2luY2UgbXV0YXRpb25zIGFyZSBwZXItdXNlcikuXG4gICAgICAgIG4uaGEuYWRkKDMgLyogQ3JlZGVudGlhbENoYW5nZSAqLyksIGF3YWl0IFFvKG4pLCBzICYmIFxuICAgIC8vIERvbid0IHNldCB0aGUgbmV0d29yayBzdGF0dXMgdG8gVW5rbm93biBpZiB3ZSBhcmUgb2ZmbGluZS5cbiAgICBuLmRhLnNldChcIlVua25vd25cIiAvKiBVbmtub3duICovKSwgYXdhaXQgbi5yZW1vdGVTeW5jZXIuaGFuZGxlQ3JlZGVudGlhbENoYW5nZShlKSwgXG4gICAgbi5oYS5kZWxldGUoMyAvKiBDcmVkZW50aWFsQ2hhbmdlICovKSwgYXdhaXQgR28obik7XG59XG5cbi8qKlxuICogVG9nZ2xlcyB0aGUgbmV0d29yayBzdGF0ZSB3aGVuIHRoZSBjbGllbnQgZ2FpbnMgb3IgbG9zZXMgaXRzIHByaW1hcnkgbGVhc2UuXG4gKi8gYXN5bmMgZnVuY3Rpb24gd2EodCwgZSkge1xuICAgIGNvbnN0IG4gPSBLKHQpO1xuICAgIGUgPyAobi5oYS5kZWxldGUoMiAvKiBJc1NlY29uZGFyeSAqLyksIGF3YWl0IEdvKG4pKSA6IGUgfHwgKG4uaGEuYWRkKDIgLyogSXNTZWNvbmRhcnkgKi8pLCBcbiAgICBhd2FpdCBRbyhuKSwgbi5kYS5zZXQoXCJVbmtub3duXCIgLyogVW5rbm93biAqLykpO1xufVxuXG4vKipcbiAqIElmIG5vdCB5ZXQgaW5pdGlhbGl6ZWQsIHJlZ2lzdGVycyB0aGUgV2F0Y2hTdHJlYW0gYW5kIGl0cyBuZXR3b3JrIHN0YXRlXG4gKiBjYWxsYmFjayB3aXRoIGByZW1vdGVTdG9yZUltcGxgLiBSZXR1cm5zIHRoZSBleGlzdGluZyBzdHJlYW0gaWYgb25lIGlzXG4gKiBhbHJlYWR5IGF2YWlsYWJsZS5cbiAqXG4gKiBQT1JUSU5HIE5PVEU6IE9uIGlPUyBhbmQgQW5kcm9pZCwgdGhlIFdhdGNoU3RyZWFtIGdldHMgcmVnaXN0ZXJlZCBvbiBzdGFydHVwLlxuICogVGhpcyBpcyBub3QgZG9uZSBvbiBXZWIgdG8gYWxsb3cgaXQgdG8gYmUgdHJlZS1zaGFrZW4uXG4gKi8gZnVuY3Rpb24gbWEodCkge1xuICAgIHJldHVybiB0LndhIHx8IChcbiAgICAvLyBDcmVhdGUgc3RyZWFtIChidXQgbm90ZSB0aGF0IGl0IGlzIG5vdCBzdGFydGVkIHlldCkuXG4gICAgdC53YSA9IGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgY29uc3QgcyA9IEsodCk7XG4gICAgICAgIHJldHVybiBzLlpvKCksIG5ldyBCbyhlLCBzLlJvLCBzLmF1dGhDcmVkZW50aWFscywgcy5hcHBDaGVja0NyZWRlbnRpYWxzLCBzLk0sIG4pO1xuICAgIH1cbiAgICAvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyAodC5kYXRhc3RvcmUsIHQuYXN5bmNRdWV1ZSwge1xuICAgICAgICBXcjogdGEuYmluZChudWxsLCB0KSxcbiAgICAgICAgSHI6IGVhLmJpbmQobnVsbCwgdCksXG4gICAgICAgIEtvOiBuYS5iaW5kKG51bGwsIHQpXG4gICAgfSksIHQubGEucHVzaCgoYXN5bmMgZSA9PiB7XG4gICAgICAgIGUgPyAodC53YS54bygpLCBZbyh0KSA/IEpvKHQpIDogdC5kYS5zZXQoXCJVbmtub3duXCIgLyogVW5rbm93biAqLykpIDogKGF3YWl0IHQud2Euc3RvcCgpLCBcbiAgICAgICAgWm8odCkpO1xuICAgIH0pKSksIHQud2E7XG59XG5cbi8qKlxuICogSWYgbm90IHlldCBpbml0aWFsaXplZCwgcmVnaXN0ZXJzIHRoZSBXcml0ZVN0cmVhbSBhbmQgaXRzIG5ldHdvcmsgc3RhdGVcbiAqIGNhbGxiYWNrIHdpdGggYHJlbW90ZVN0b3JlSW1wbGAuIFJldHVybnMgdGhlIGV4aXN0aW5nIHN0cmVhbSBpZiBvbmUgaXNcbiAqIGFscmVhZHkgYXZhaWxhYmxlLlxuICpcbiAqIFBPUlRJTkcgTk9URTogT24gaU9TIGFuZCBBbmRyb2lkLCB0aGUgV3JpdGVTdHJlYW0gZ2V0cyByZWdpc3RlcmVkIG9uIHN0YXJ0dXAuXG4gKiBUaGlzIGlzIG5vdCBkb25lIG9uIFdlYiB0byBhbGxvdyBpdCB0byBiZSB0cmVlLXNoYWtlbi5cbiAqLyBmdW5jdGlvbiBnYSh0KSB7XG4gICAgcmV0dXJuIHQubWEgfHwgKFxuICAgIC8vIENyZWF0ZSBzdHJlYW0gKGJ1dCBub3RlIHRoYXQgaXQgaXMgbm90IHN0YXJ0ZWQgeWV0KS5cbiAgICB0Lm1hID0gZnVuY3Rpb24odCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gSyh0KTtcbiAgICAgICAgcmV0dXJuIHMuWm8oKSwgbmV3IExvKGUsIHMuUm8sIHMuYXV0aENyZWRlbnRpYWxzLCBzLmFwcENoZWNrQ3JlZGVudGlhbHMsIHMuTSwgbik7XG4gICAgfSh0LmRhdGFzdG9yZSwgdC5hc3luY1F1ZXVlLCB7XG4gICAgICAgIFdyOiBoYS5iaW5kKG51bGwsIHQpLFxuICAgICAgICBIcjogZGEuYmluZChudWxsLCB0KSxcbiAgICAgICAgSm86IGxhLmJpbmQobnVsbCwgdCksXG4gICAgICAgIEhvOiBmYS5iaW5kKG51bGwsIHQpXG4gICAgfSksIHQubGEucHVzaCgoYXN5bmMgZSA9PiB7XG4gICAgICAgIGUgPyAodC5tYS54bygpLCBcbiAgICAgICAgLy8gVGhpcyB3aWxsIHN0YXJ0IHRoZSB3cml0ZSBzdHJlYW0gaWYgbmVjZXNzYXJ5LlxuICAgICAgICBhd2FpdCByYSh0KSkgOiAoYXdhaXQgdC5tYS5zdG9wKCksIHQudWEubGVuZ3RoID4gMCAmJiAoTyhcIlJlbW90ZVN0b3JlXCIsIGBTdG9wcGluZyB3cml0ZSBzdHJlYW0gd2l0aCAke3QudWEubGVuZ3RofSBwZW5kaW5nIHdyaXRlc2ApLCBcbiAgICAgICAgdC51YSA9IFtdKSk7XG4gICAgfSkpKSwgdC5tYTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogUmVwcmVzZW50cyBhbiBvcGVyYXRpb24gc2NoZWR1bGVkIHRvIGJlIHJ1biBpbiB0aGUgZnV0dXJlIG9uIGFuIEFzeW5jUXVldWUuXG4gKlxuICogSXQgaXMgY3JlYXRlZCB2aWEgRGVsYXllZE9wZXJhdGlvbi5jcmVhdGVBbmRTY2hlZHVsZSgpLlxuICpcbiAqIFN1cHBvcnRzIGNhbmNlbGxhdGlvbiAodmlhIGNhbmNlbCgpKSBhbmQgZWFybHkgZXhlY3V0aW9uICh2aWEgc2tpcERlbGF5KCkpLlxuICpcbiAqIE5vdGU6IFdlIGltcGxlbWVudCBgUHJvbWlzZUxpa2VgIGluc3RlYWQgb2YgYFByb21pc2VgLCBhcyB0aGUgYFByb21pc2VgIHR5cGVcbiAqIGluIG5ld2VyIHZlcnNpb25zIG9mIFR5cGVTY3JpcHQgZGVmaW5lcyBgZmluYWxseWAsIHdoaWNoIGlzIG5vdCBhdmFpbGFibGUgaW5cbiAqIElFLlxuICovXG5jbGFzcyB5YSB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgcywgaSkge1xuICAgICAgICB0aGlzLmFzeW5jUXVldWUgPSB0LCB0aGlzLnRpbWVySWQgPSBlLCB0aGlzLnRhcmdldFRpbWVNcyA9IG4sIHRoaXMub3AgPSBzLCB0aGlzLnJlbW92YWxDYWxsYmFjayA9IGksIFxuICAgICAgICB0aGlzLmRlZmVycmVkID0gbmV3IGosIHRoaXMudGhlbiA9IHRoaXMuZGVmZXJyZWQucHJvbWlzZS50aGVuLmJpbmQodGhpcy5kZWZlcnJlZC5wcm9taXNlKSwgXG4gICAgICAgIC8vIEl0J3Mgbm9ybWFsIGZvciB0aGUgZGVmZXJyZWQgcHJvbWlzZSB0byBiZSBjYW5jZWxlZCAoZHVlIHRvIGNhbmNlbGxhdGlvbilcbiAgICAgICAgLy8gYW5kIHNvIHdlIGF0dGFjaCBhIGR1bW15IGNhdGNoIGNhbGxiYWNrIHRvIGF2b2lkXG4gICAgICAgIC8vICdVbmhhbmRsZWRQcm9taXNlUmVqZWN0aW9uV2FybmluZycgbG9nIHNwYW0uXG4gICAgICAgIHRoaXMuZGVmZXJyZWQucHJvbWlzZS5jYXRjaCgodCA9PiB7fSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgRGVsYXllZE9wZXJhdGlvbiB0aGF0IGhhcyBiZWVuIHNjaGVkdWxlZCB0byBiZVxuICAgICAqIGV4ZWN1dGVkIG9uIHRoZSBwcm92aWRlZCBhc3luY1F1ZXVlIGFmdGVyIHRoZSBwcm92aWRlZCBkZWxheU1zLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFzeW5jUXVldWUgLSBUaGUgcXVldWUgdG8gc2NoZWR1bGUgdGhlIG9wZXJhdGlvbiBvbi5cbiAgICAgKiBAcGFyYW0gaWQgLSBBIFRpbWVyIElEIGlkZW50aWZ5aW5nIHRoZSB0eXBlIG9mIG9wZXJhdGlvbiB0aGlzIGlzLlxuICAgICAqIEBwYXJhbSBkZWxheU1zIC0gVGhlIGRlbGF5IChtcykgYmVmb3JlIHRoZSBvcGVyYXRpb24gc2hvdWxkIGJlIHNjaGVkdWxlZC5cbiAgICAgKiBAcGFyYW0gb3AgLSBUaGUgb3BlcmF0aW9uIHRvIHJ1bi5cbiAgICAgKiBAcGFyYW0gcmVtb3ZhbENhbGxiYWNrIC0gQSBjYWxsYmFjayB0byBiZSBjYWxsZWQgc3luY2hyb25vdXNseSBvbmNlIHRoZVxuICAgICAqICAgb3BlcmF0aW9uIGlzIGV4ZWN1dGVkIG9yIGNhbmNlbGVkLCBub3RpZnlpbmcgdGhlIEFzeW5jUXVldWUgdG8gcmVtb3ZlIGl0XG4gICAgICogICBmcm9tIGl0cyBkZWxheWVkT3BlcmF0aW9ucyBsaXN0LlxuICAgICAqICAgUE9SVElORyBOT1RFOiBUaGlzIGV4aXN0cyB0byBwcmV2ZW50IG1ha2luZyByZW1vdmVEZWxheWVkT3BlcmF0aW9uKCkgYW5kXG4gICAgICogICB0aGUgRGVsYXllZE9wZXJhdGlvbiBjbGFzcyBwdWJsaWMuXG4gICAgICovICAgIHN0YXRpYyBjcmVhdGVBbmRTY2hlZHVsZSh0LCBlLCBuLCBzLCBpKSB7XG4gICAgICAgIGNvbnN0IHIgPSBEYXRlLm5vdygpICsgbiwgbyA9IG5ldyB5YSh0LCBlLCByLCBzLCBpKTtcbiAgICAgICAgcmV0dXJuIG8uc3RhcnQobiksIG87XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXJ0cyB0aGUgdGltZXIuIFRoaXMgaXMgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGNvbnN0cnVjdGlvbiBieVxuICAgICAqIGNyZWF0ZUFuZFNjaGVkdWxlKCkuXG4gICAgICovICAgIHN0YXJ0KHQpIHtcbiAgICAgICAgdGhpcy50aW1lckhhbmRsZSA9IHNldFRpbWVvdXQoKCgpID0+IHRoaXMuaGFuZGxlRGVsYXlFbGFwc2VkKCkpLCB0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUXVldWVzIHRoZSBvcGVyYXRpb24gdG8gcnVuIGltbWVkaWF0ZWx5IChpZiBpdCBoYXNuJ3QgYWxyZWFkeSBiZWVuIHJ1biBvclxuICAgICAqIGNhbmNlbGVkKS5cbiAgICAgKi8gICAgc2tpcERlbGF5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVEZWxheUVsYXBzZWQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FuY2VscyB0aGUgb3BlcmF0aW9uIGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgb3IgY2FuY2VsZWQuIFRoZVxuICAgICAqIHByb21pc2Ugd2lsbCBiZSByZWplY3RlZC5cbiAgICAgKlxuICAgICAqIEFzIGxvbmcgYXMgdGhlIG9wZXJhdGlvbiBoYXMgbm90IHlldCBiZWVuIHJ1biwgY2FsbGluZyBjYW5jZWwoKSBwcm92aWRlcyBhXG4gICAgICogZ3VhcmFudGVlIHRoYXQgdGhlIG9wZXJhdGlvbiB3aWxsIG5vdCBiZSBydW4uXG4gICAgICovICAgIGNhbmNlbCh0KSB7XG4gICAgICAgIG51bGwgIT09IHRoaXMudGltZXJIYW5kbGUgJiYgKHRoaXMuY2xlYXJUaW1lb3V0KCksIHRoaXMuZGVmZXJyZWQucmVqZWN0KG5ldyBRKEcuQ0FOQ0VMTEVELCBcIk9wZXJhdGlvbiBjYW5jZWxsZWRcIiArICh0ID8gXCI6IFwiICsgdCA6IFwiXCIpKSkpO1xuICAgIH1cbiAgICBoYW5kbGVEZWxheUVsYXBzZWQoKSB7XG4gICAgICAgIHRoaXMuYXN5bmNRdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0KCgoKSA9PiBudWxsICE9PSB0aGlzLnRpbWVySGFuZGxlID8gKHRoaXMuY2xlYXJUaW1lb3V0KCksIFxuICAgICAgICB0aGlzLm9wKCkudGhlbigodCA9PiB0aGlzLmRlZmVycmVkLnJlc29sdmUodCkpKSkgOiBQcm9taXNlLnJlc29sdmUoKSkpO1xuICAgIH1cbiAgICBjbGVhclRpbWVvdXQoKSB7XG4gICAgICAgIG51bGwgIT09IHRoaXMudGltZXJIYW5kbGUgJiYgKHRoaXMucmVtb3ZhbENhbGxiYWNrKHRoaXMpLCBjbGVhclRpbWVvdXQodGhpcy50aW1lckhhbmRsZSksIFxuICAgICAgICB0aGlzLnRpbWVySGFuZGxlID0gbnVsbCk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBGaXJlc3RvcmVFcnJvciB0aGF0IGNhbiBiZSBzdXJmYWNlZCB0byB0aGUgdXNlciBpZiB0aGUgcHJvdmlkZWRcbiAqIGVycm9yIGlzIGFuIEluZGV4ZWREYlRyYW5zYWN0aW9uRXJyb3IuIFJlLXRocm93cyB0aGUgZXJyb3Igb3RoZXJ3aXNlLlxuICovIGZ1bmN0aW9uIHBhKHQsIGUpIHtcbiAgICBpZiAoJChcIkFzeW5jUXVldWVcIiwgYCR7ZX06ICR7dH1gKSwgZGkodCkpIHJldHVybiBuZXcgUShHLlVOQVZBSUxBQkxFLCBgJHtlfTogJHt0fWApO1xuICAgIHRocm93IHQ7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIERvY3VtZW50U2V0IGlzIGFuIGltbXV0YWJsZSAoY29weS1vbi13cml0ZSkgY29sbGVjdGlvbiB0aGF0IGhvbGRzIGRvY3VtZW50c1xuICogaW4gb3JkZXIgc3BlY2lmaWVkIGJ5IHRoZSBwcm92aWRlZCBjb21wYXJhdG9yLiBXZSBhbHdheXMgYWRkIGEgZG9jdW1lbnQga2V5XG4gKiBjb21wYXJhdG9yIG9uIHRvcCBvZiB3aGF0IGlzIHByb3ZpZGVkIHRvIGd1YXJhbnRlZSBkb2N1bWVudCBlcXVhbGl0eSBiYXNlZCBvblxuICogdGhlIGtleS5cbiAqLyBjbGFzcyBJYSB7XG4gICAgLyoqIFRoZSBkZWZhdWx0IG9yZGVyaW5nIGlzIGJ5IGtleSBpZiB0aGUgY29tcGFyYXRvciBpcyBvbWl0dGVkICovXG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAvLyBXZSBhcmUgYWRkaW5nIGRvY3VtZW50IGtleSBjb21wYXJhdG9yIHRvIHRoZSBlbmQgYXMgaXQncyB0aGUgb25seVxuICAgICAgICAvLyBndWFyYW50ZWVkIHVuaXF1ZSBwcm9wZXJ0eSBvZiBhIGRvY3VtZW50LlxuICAgICAgICB0aGlzLmNvbXBhcmF0b3IgPSB0ID8gKGUsIG4pID0+IHQoZSwgbikgfHwgeHQuY29tcGFyYXRvcihlLmtleSwgbi5rZXkpIDogKHQsIGUpID0+IHh0LmNvbXBhcmF0b3IodC5rZXksIGUua2V5KSwgXG4gICAgICAgIHRoaXMua2V5ZWRNYXAgPSBMbigpLCB0aGlzLnNvcnRlZFNldCA9IG5ldyBDbih0aGlzLmNvbXBhcmF0b3IpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IGNvcHkgb2YgdGhlIGV4aXN0aW5nIERvY3VtZW50U2V0LCB1c2luZyB0aGUgc2FtZVxuICAgICAqIGNvbXBhcmF0b3IuXG4gICAgICovICAgIHN0YXRpYyBlbXB0eVNldCh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgSWEodC5jb21wYXJhdG9yKTtcbiAgICB9XG4gICAgaGFzKHQpIHtcbiAgICAgICAgcmV0dXJuIG51bGwgIT0gdGhpcy5rZXllZE1hcC5nZXQodCk7XG4gICAgfVxuICAgIGdldCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmtleWVkTWFwLmdldCh0KTtcbiAgICB9XG4gICAgZmlyc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvcnRlZFNldC5taW5LZXkoKTtcbiAgICB9XG4gICAgbGFzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc29ydGVkU2V0Lm1heEtleSgpO1xuICAgIH1cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3J0ZWRTZXQuaXNFbXB0eSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgcHJvdmlkZWQga2V5IGluIHRoZSBkb2N1bWVudCBzZXQsIG9yIC0xIGlmIHRoZVxuICAgICAqIGRvY3VtZW50IGtleSBpcyBub3QgcHJlc2VudCBpbiB0aGUgc2V0O1xuICAgICAqLyAgICBpbmRleE9mKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMua2V5ZWRNYXAuZ2V0KHQpO1xuICAgICAgICByZXR1cm4gZSA/IHRoaXMuc29ydGVkU2V0LmluZGV4T2YoZSkgOiAtMTtcbiAgICB9XG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvcnRlZFNldC5zaXplO1xuICAgIH1cbiAgICAvKiogSXRlcmF0ZXMgZG9jdW1lbnRzIGluIG9yZGVyIGRlZmluZWQgYnkgXCJjb21wYXJhdG9yXCIgKi8gICAgZm9yRWFjaCh0KSB7XG4gICAgICAgIHRoaXMuc29ydGVkU2V0Lmlub3JkZXJUcmF2ZXJzYWwoKChlLCBuKSA9PiAodChlKSwgITEpKSk7XG4gICAgfVxuICAgIC8qKiBJbnNlcnRzIG9yIHVwZGF0ZXMgYSBkb2N1bWVudCB3aXRoIHRoZSBzYW1lIGtleSAqLyAgICBhZGQodCkge1xuICAgICAgICAvLyBGaXJzdCByZW1vdmUgdGhlIGVsZW1lbnQgaWYgd2UgaGF2ZSBpdC5cbiAgICAgICAgY29uc3QgZSA9IHRoaXMuZGVsZXRlKHQua2V5KTtcbiAgICAgICAgcmV0dXJuIGUuY29weShlLmtleWVkTWFwLmluc2VydCh0LmtleSwgdCksIGUuc29ydGVkU2V0Lmluc2VydCh0LCBudWxsKSk7XG4gICAgfVxuICAgIC8qKiBEZWxldGVzIGEgZG9jdW1lbnQgd2l0aCBhIGdpdmVuIGtleSAqLyAgICBkZWxldGUodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5nZXQodCk7XG4gICAgICAgIHJldHVybiBlID8gdGhpcy5jb3B5KHRoaXMua2V5ZWRNYXAucmVtb3ZlKHQpLCB0aGlzLnNvcnRlZFNldC5yZW1vdmUoZSkpIDogdGhpcztcbiAgICB9XG4gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIGlmICghKHQgaW5zdGFuY2VvZiBJYSkpIHJldHVybiAhMTtcbiAgICAgICAgaWYgKHRoaXMuc2l6ZSAhPT0gdC5zaXplKSByZXR1cm4gITE7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLnNvcnRlZFNldC5nZXRJdGVyYXRvcigpLCBuID0gdC5zb3J0ZWRTZXQuZ2V0SXRlcmF0b3IoKTtcbiAgICAgICAgZm9yICg7ZS5oYXNOZXh0KCk7ICkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGUuZ2V0TmV4dCgpLmtleSwgcyA9IG4uZ2V0TmV4dCgpLmtleTtcbiAgICAgICAgICAgIGlmICghdC5pc0VxdWFsKHMpKSByZXR1cm4gITE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICEwO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgY29uc3QgdCA9IFtdO1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JFYWNoKChlID0+IHtcbiAgICAgICAgICAgIHQucHVzaChlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9KSksIDAgPT09IHQubGVuZ3RoID8gXCJEb2N1bWVudFNldCAoKVwiIDogXCJEb2N1bWVudFNldCAoXFxuICBcIiArIHQuam9pbihcIiAgXFxuXCIpICsgXCJcXG4pXCI7XG4gICAgfVxuICAgIGNvcHkodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gbmV3IElhO1xuICAgICAgICByZXR1cm4gbi5jb21wYXJhdG9yID0gdGhpcy5jb21wYXJhdG9yLCBuLmtleWVkTWFwID0gdCwgbi5zb3J0ZWRTZXQgPSBlLCBuO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogRG9jdW1lbnRDaGFuZ2VTZXQga2VlcHMgdHJhY2sgb2YgYSBzZXQgb2YgY2hhbmdlcyB0byBkb2NzIGluIGEgcXVlcnksIG1lcmdpbmdcbiAqIGR1cGxpY2F0ZSBldmVudHMgZm9yIHRoZSBzYW1lIGRvYy5cbiAqLyBjbGFzcyBUYSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZ2EgPSBuZXcgQ24oeHQuY29tcGFyYXRvcik7XG4gICAgfVxuICAgIHRyYWNrKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQuZG9jLmtleSwgbiA9IHRoaXMuZ2EuZ2V0KGUpO1xuICAgICAgICBuID8gXG4gICAgICAgIC8vIE1lcmdlIHRoZSBuZXcgY2hhbmdlIHdpdGggdGhlIGV4aXN0aW5nIGNoYW5nZS5cbiAgICAgICAgMCAvKiBBZGRlZCAqLyAhPT0gdC50eXBlICYmIDMgLyogTWV0YWRhdGEgKi8gPT09IG4udHlwZSA/IHRoaXMuZ2EgPSB0aGlzLmdhLmluc2VydChlLCB0KSA6IDMgLyogTWV0YWRhdGEgKi8gPT09IHQudHlwZSAmJiAxIC8qIFJlbW92ZWQgKi8gIT09IG4udHlwZSA/IHRoaXMuZ2EgPSB0aGlzLmdhLmluc2VydChlLCB7XG4gICAgICAgICAgICB0eXBlOiBuLnR5cGUsXG4gICAgICAgICAgICBkb2M6IHQuZG9jXG4gICAgICAgIH0pIDogMiAvKiBNb2RpZmllZCAqLyA9PT0gdC50eXBlICYmIDIgLyogTW9kaWZpZWQgKi8gPT09IG4udHlwZSA/IHRoaXMuZ2EgPSB0aGlzLmdhLmluc2VydChlLCB7XG4gICAgICAgICAgICB0eXBlOiAyIC8qIE1vZGlmaWVkICovICxcbiAgICAgICAgICAgIGRvYzogdC5kb2NcbiAgICAgICAgfSkgOiAyIC8qIE1vZGlmaWVkICovID09PSB0LnR5cGUgJiYgMCAvKiBBZGRlZCAqLyA9PT0gbi50eXBlID8gdGhpcy5nYSA9IHRoaXMuZ2EuaW5zZXJ0KGUsIHtcbiAgICAgICAgICAgIHR5cGU6IDAgLyogQWRkZWQgKi8gLFxuICAgICAgICAgICAgZG9jOiB0LmRvY1xuICAgICAgICB9KSA6IDEgLyogUmVtb3ZlZCAqLyA9PT0gdC50eXBlICYmIDAgLyogQWRkZWQgKi8gPT09IG4udHlwZSA/IHRoaXMuZ2EgPSB0aGlzLmdhLnJlbW92ZShlKSA6IDEgLyogUmVtb3ZlZCAqLyA9PT0gdC50eXBlICYmIDIgLyogTW9kaWZpZWQgKi8gPT09IG4udHlwZSA/IHRoaXMuZ2EgPSB0aGlzLmdhLmluc2VydChlLCB7XG4gICAgICAgICAgICB0eXBlOiAxIC8qIFJlbW92ZWQgKi8gLFxuICAgICAgICAgICAgZG9jOiBuLmRvY1xuICAgICAgICB9KSA6IDAgLyogQWRkZWQgKi8gPT09IHQudHlwZSAmJiAxIC8qIFJlbW92ZWQgKi8gPT09IG4udHlwZSA/IHRoaXMuZ2EgPSB0aGlzLmdhLmluc2VydChlLCB7XG4gICAgICAgICAgICB0eXBlOiAyIC8qIE1vZGlmaWVkICovICxcbiAgICAgICAgICAgIGRvYzogdC5kb2NcbiAgICAgICAgfSkgOiBcbiAgICAgICAgLy8gVGhpcyBpbmNsdWRlcyB0aGVzZSBjYXNlcywgd2hpY2ggZG9uJ3QgbWFrZSBzZW5zZTpcbiAgICAgICAgLy8gQWRkZWQtPkFkZGVkXG4gICAgICAgIC8vIFJlbW92ZWQtPlJlbW92ZWRcbiAgICAgICAgLy8gTW9kaWZpZWQtPkFkZGVkXG4gICAgICAgIC8vIFJlbW92ZWQtPk1vZGlmaWVkXG4gICAgICAgIC8vIE1ldGFkYXRhLT5BZGRlZFxuICAgICAgICAvLyBSZW1vdmVkLT5NZXRhZGF0YVxuICAgICAgICBMKCkgOiB0aGlzLmdhID0gdGhpcy5nYS5pbnNlcnQoZSwgdCk7XG4gICAgfVxuICAgIHlhKCkge1xuICAgICAgICBjb25zdCB0ID0gW107XG4gICAgICAgIHJldHVybiB0aGlzLmdhLmlub3JkZXJUcmF2ZXJzYWwoKChlLCBuKSA9PiB7XG4gICAgICAgICAgICB0LnB1c2gobik7XG4gICAgICAgIH0pKSwgdDtcbiAgICB9XG59XG5cbmNsYXNzIEVhIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuLCBzLCBpLCByLCBvLCBhKSB7XG4gICAgICAgIHRoaXMucXVlcnkgPSB0LCB0aGlzLmRvY3MgPSBlLCB0aGlzLm9sZERvY3MgPSBuLCB0aGlzLmRvY0NoYW5nZXMgPSBzLCB0aGlzLm11dGF0ZWRLZXlzID0gaSwgXG4gICAgICAgIHRoaXMuZnJvbUNhY2hlID0gciwgdGhpcy5zeW5jU3RhdGVDaGFuZ2VkID0gbywgdGhpcy5leGNsdWRlc01ldGFkYXRhQ2hhbmdlcyA9IGE7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIGEgdmlldyBzbmFwc2hvdCBhcyBpZiBhbGwgZG9jdW1lbnRzIGluIHRoZSBzbmFwc2hvdCB3ZXJlIGFkZGVkLiAqLyAgICBzdGF0aWMgZnJvbUluaXRpYWxEb2N1bWVudHModCwgZSwgbiwgcykge1xuICAgICAgICBjb25zdCBpID0gW107XG4gICAgICAgIHJldHVybiBlLmZvckVhY2goKHQgPT4ge1xuICAgICAgICAgICAgaS5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAwIC8qIEFkZGVkICovICxcbiAgICAgICAgICAgICAgICBkb2M6IHRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KSksIG5ldyBFYSh0LCBlLCBJYS5lbXB0eVNldChlKSwgaSwgbiwgcywgXG4gICAgICAgIC8qIHN5bmNTdGF0ZUNoYW5nZWQ9ICovICEwLCBcbiAgICAgICAgLyogZXhjbHVkZXNNZXRhZGF0YUNoYW5nZXM9ICovICExKTtcbiAgICB9XG4gICAgZ2V0IGhhc1BlbmRpbmdXcml0ZXMoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5tdXRhdGVkS2V5cy5pc0VtcHR5KCk7XG4gICAgfVxuICAgIGlzRXF1YWwodCkge1xuICAgICAgICBpZiAoISh0aGlzLmZyb21DYWNoZSA9PT0gdC5mcm9tQ2FjaGUgJiYgdGhpcy5zeW5jU3RhdGVDaGFuZ2VkID09PSB0LnN5bmNTdGF0ZUNoYW5nZWQgJiYgdGhpcy5tdXRhdGVkS2V5cy5pc0VxdWFsKHQubXV0YXRlZEtleXMpICYmIEJlKHRoaXMucXVlcnksIHQucXVlcnkpICYmIHRoaXMuZG9jcy5pc0VxdWFsKHQuZG9jcykgJiYgdGhpcy5vbGREb2NzLmlzRXF1YWwodC5vbGREb2NzKSkpIHJldHVybiAhMTtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMuZG9jQ2hhbmdlcywgbiA9IHQuZG9jQ2hhbmdlcztcbiAgICAgICAgaWYgKGUubGVuZ3RoICE9PSBuLmxlbmd0aCkgcmV0dXJuICExO1xuICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IGUubGVuZ3RoOyB0KyspIGlmIChlW3RdLnR5cGUgIT09IG5bdF0udHlwZSB8fCAhZVt0XS5kb2MuaXNFcXVhbChuW3RdLmRvYykpIHJldHVybiAhMTtcbiAgICAgICAgcmV0dXJuICEwO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogSG9sZHMgdGhlIGxpc3RlbmVycyBhbmQgdGhlIGxhc3QgcmVjZWl2ZWQgVmlld1NuYXBzaG90IGZvciBhIHF1ZXJ5IGJlaW5nXG4gKiB0cmFja2VkIGJ5IEV2ZW50TWFuYWdlci5cbiAqLyBjbGFzcyBBYSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucGEgPSB2b2lkIDAsIHRoaXMubGlzdGVuZXJzID0gW107XG4gICAgfVxufVxuXG5jbGFzcyBSYSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucXVlcmllcyA9IG5ldyBEbigodCA9PiBMZSh0KSksIEJlKSwgdGhpcy5vbmxpbmVTdGF0ZSA9IFwiVW5rbm93blwiIC8qIFVua25vd24gKi8gLCBcbiAgICAgICAgdGhpcy5JYSA9IG5ldyBTZXQ7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBiYSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IEsodCksIHMgPSBlLnF1ZXJ5O1xuICAgIGxldCBpID0gITEsIHIgPSBuLnF1ZXJpZXMuZ2V0KHMpO1xuICAgIGlmIChyIHx8IChpID0gITAsIHIgPSBuZXcgQWEpLCBpKSB0cnkge1xuICAgICAgICByLnBhID0gYXdhaXQgbi5vbkxpc3RlbihzKTtcbiAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgIGNvbnN0IG4gPSBwYSh0LCBgSW5pdGlhbGl6YXRpb24gb2YgcXVlcnkgJyR7cWUoZS5xdWVyeSl9JyBmYWlsZWRgKTtcbiAgICAgICAgcmV0dXJuIHZvaWQgZS5vbkVycm9yKG4pO1xuICAgIH1cbiAgICBpZiAobi5xdWVyaWVzLnNldChzLCByKSwgci5saXN0ZW5lcnMucHVzaChlKSwgXG4gICAgLy8gUnVuIGdsb2JhbCBzbmFwc2hvdCBsaXN0ZW5lcnMgaWYgYSBjb25zaXN0ZW50IHNuYXBzaG90IGhhcyBiZWVuIGVtaXR0ZWQuXG4gICAgZS5UYShuLm9ubGluZVN0YXRlKSwgci5wYSkge1xuICAgICAgICBlLkVhKHIucGEpICYmIFNhKG4pO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gUGEodCwgZSkge1xuICAgIGNvbnN0IG4gPSBLKHQpLCBzID0gZS5xdWVyeTtcbiAgICBsZXQgaSA9ICExO1xuICAgIGNvbnN0IHIgPSBuLnF1ZXJpZXMuZ2V0KHMpO1xuICAgIGlmIChyKSB7XG4gICAgICAgIGNvbnN0IHQgPSByLmxpc3RlbmVycy5pbmRleE9mKGUpO1xuICAgICAgICB0ID49IDAgJiYgKHIubGlzdGVuZXJzLnNwbGljZSh0LCAxKSwgaSA9IDAgPT09IHIubGlzdGVuZXJzLmxlbmd0aCk7XG4gICAgfVxuICAgIGlmIChpKSByZXR1cm4gbi5xdWVyaWVzLmRlbGV0ZShzKSwgbi5vblVubGlzdGVuKHMpO1xufVxuXG5mdW5jdGlvbiBWYSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IEsodCk7XG4gICAgbGV0IHMgPSAhMTtcbiAgICBmb3IgKGNvbnN0IHQgb2YgZSkge1xuICAgICAgICBjb25zdCBlID0gdC5xdWVyeSwgaSA9IG4ucXVlcmllcy5nZXQoZSk7XG4gICAgICAgIGlmIChpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgaS5saXN0ZW5lcnMpIGUuRWEodCkgJiYgKHMgPSAhMCk7XG4gICAgICAgICAgICBpLnBhID0gdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzICYmIFNhKG4pO1xufVxuXG5mdW5jdGlvbiB2YSh0LCBlLCBuKSB7XG4gICAgY29uc3QgcyA9IEsodCksIGkgPSBzLnF1ZXJpZXMuZ2V0KGUpO1xuICAgIGlmIChpKSBmb3IgKGNvbnN0IHQgb2YgaS5saXN0ZW5lcnMpIHQub25FcnJvcihuKTtcbiAgICAvLyBSZW1vdmUgYWxsIGxpc3RlbmVycy4gTk9URTogV2UgZG9uJ3QgbmVlZCB0byBjYWxsIHN5bmNFbmdpbmUudW5saXN0ZW4oKVxuICAgIC8vIGFmdGVyIGFuIGVycm9yLlxuICAgICAgICBzLnF1ZXJpZXMuZGVsZXRlKGUpO1xufVxuXG4vLyBDYWxsIGFsbCBnbG9iYWwgc25hcHNob3QgbGlzdGVuZXJzIHRoYXQgaGF2ZSBiZWVuIHNldC5cbmZ1bmN0aW9uIFNhKHQpIHtcbiAgICB0LklhLmZvckVhY2goKHQgPT4ge1xuICAgICAgICB0Lm5leHQoKTtcbiAgICB9KSk7XG59XG5cbi8qKlxuICogUXVlcnlMaXN0ZW5lciB0YWtlcyBhIHNlcmllcyBvZiBpbnRlcm5hbCB2aWV3IHNuYXBzaG90cyBhbmQgZGV0ZXJtaW5lc1xuICogd2hlbiB0byByYWlzZSB0aGUgZXZlbnQuXG4gKlxuICogSXQgdXNlcyBhbiBPYnNlcnZlciB0byBkaXNwYXRjaCBldmVudHMuXG4gKi8gY2xhc3MgRGEge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy5xdWVyeSA9IHQsIHRoaXMuQWEgPSBlLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluaXRpYWwgc25hcHNob3RzIChlLmcuIGZyb20gY2FjaGUpIG1heSBub3QgYmUgcHJvcGFnYXRlZCB0byB0aGUgd3JhcHBlZFxuICAgICAgICAgKiBvYnNlcnZlci4gVGhpcyBmbGFnIGlzIHNldCB0byB0cnVlIG9uY2Ugd2UndmUgYWN0dWFsbHkgcmFpc2VkIGFuIGV2ZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5SYSA9ICExLCB0aGlzLmJhID0gbnVsbCwgdGhpcy5vbmxpbmVTdGF0ZSA9IFwiVW5rbm93blwiIC8qIFVua25vd24gKi8gLCB0aGlzLm9wdGlvbnMgPSBuIHx8IHt9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIHRoZSBuZXcgVmlld1NuYXBzaG90IHRvIHRoaXMgbGlzdGVuZXIsIHJhaXNpbmcgYSB1c2VyLWZhY2luZyBldmVudFxuICAgICAqIGlmIGFwcGxpY2FibGUgKGRlcGVuZGluZyBvbiB3aGF0IGNoYW5nZWQsIHdoZXRoZXIgdGhlIHVzZXIgaGFzIG9wdGVkIGludG9cbiAgICAgKiBtZXRhZGF0YS1vbmx5IGNoYW5nZXMsIGV0Yy4pLiBSZXR1cm5zIHRydWUgaWYgYSB1c2VyLWZhY2luZyBldmVudCB3YXNcbiAgICAgKiBpbmRlZWQgcmFpc2VkLlxuICAgICAqLyAgICBFYSh0KSB7XG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLmluY2x1ZGVNZXRhZGF0YUNoYW5nZXMpIHtcbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgbWV0YWRhdGEgb25seSBjaGFuZ2VzLlxuICAgICAgICAgICAgY29uc3QgZSA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBuIG9mIHQuZG9jQ2hhbmdlcykgMyAvKiBNZXRhZGF0YSAqLyAhPT0gbi50eXBlICYmIGUucHVzaChuKTtcbiAgICAgICAgICAgIHQgPSBuZXcgRWEodC5xdWVyeSwgdC5kb2NzLCB0Lm9sZERvY3MsIGUsIHQubXV0YXRlZEtleXMsIHQuZnJvbUNhY2hlLCB0LnN5bmNTdGF0ZUNoYW5nZWQsIFxuICAgICAgICAgICAgLyogZXhjbHVkZXNNZXRhZGF0YUNoYW5nZXM9ICovICEwKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZSA9ICExO1xuICAgICAgICByZXR1cm4gdGhpcy5SYSA/IHRoaXMuUGEodCkgJiYgKHRoaXMuQWEubmV4dCh0KSwgZSA9ICEwKSA6IHRoaXMuVmEodCwgdGhpcy5vbmxpbmVTdGF0ZSkgJiYgKHRoaXMudmEodCksIFxuICAgICAgICBlID0gITApLCB0aGlzLmJhID0gdCwgZTtcbiAgICB9XG4gICAgb25FcnJvcih0KSB7XG4gICAgICAgIHRoaXMuQWEuZXJyb3IodCk7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgYSBzbmFwc2hvdCB3YXMgcmFpc2VkLiAqLyAgICBUYSh0KSB7XG4gICAgICAgIHRoaXMub25saW5lU3RhdGUgPSB0O1xuICAgICAgICBsZXQgZSA9ICExO1xuICAgICAgICByZXR1cm4gdGhpcy5iYSAmJiAhdGhpcy5SYSAmJiB0aGlzLlZhKHRoaXMuYmEsIHQpICYmICh0aGlzLnZhKHRoaXMuYmEpLCBlID0gITApLCBcbiAgICAgICAgZTtcbiAgICB9XG4gICAgVmEodCwgZSkge1xuICAgICAgICAvLyBBbHdheXMgcmFpc2UgdGhlIGZpcnN0IGV2ZW50IHdoZW4gd2UncmUgc3luY2VkXG4gICAgICAgIGlmICghdC5mcm9tQ2FjaGUpIHJldHVybiAhMDtcbiAgICAgICAgLy8gTk9URTogV2UgY29uc2lkZXIgT25saW5lU3RhdGUuVW5rbm93biBhcyBvbmxpbmUgKGl0IHNob3VsZCBiZWNvbWUgT2ZmbGluZVxuICAgICAgICAvLyBvciBPbmxpbmUgaWYgd2Ugd2FpdCBsb25nIGVub3VnaCkuXG4gICAgICAgICAgICAgICAgY29uc3QgbiA9IFwiT2ZmbGluZVwiIC8qIE9mZmxpbmUgKi8gIT09IGU7XG4gICAgICAgIC8vIERvbid0IHJhaXNlIHRoZSBldmVudCBpZiB3ZSdyZSBvbmxpbmUsIGFyZW4ndCBzeW5jZWQgeWV0IChjaGVja2VkXG4gICAgICAgIC8vIGFib3ZlKSBhbmQgYXJlIHdhaXRpbmcgZm9yIGEgc3luYy5cbiAgICAgICAgICAgICAgICByZXR1cm4gKCF0aGlzLm9wdGlvbnMuU2EgfHwgIW4pICYmICghdC5kb2NzLmlzRW1wdHkoKSB8fCBcIk9mZmxpbmVcIiAvKiBPZmZsaW5lICovID09PSBlKTtcbiAgICAgICAgLy8gUmFpc2UgZGF0YSBmcm9tIGNhY2hlIGlmIHdlIGhhdmUgYW55IGRvY3VtZW50cyBvciB3ZSBhcmUgb2ZmbGluZVxuICAgICAgICB9XG4gICAgUGEodCkge1xuICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGhhbmRsZSBpbmNsdWRlRG9jdW1lbnRNZXRhZGF0YUNoYW5nZXMgaGVyZSBiZWNhdXNlXG4gICAgICAgIC8vIHRoZSBNZXRhZGF0YSBvbmx5IGNoYW5nZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc3RyaXBwZWQgb3V0IGlmIG5lZWRlZC5cbiAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgb25seSBjaGFuZ2VzIHdlIHdpbGwgc2VlIGFyZSB0aGUgb25lcyB3ZSBzaG91bGRcbiAgICAgICAgLy8gcHJvcGFnYXRlLlxuICAgICAgICBpZiAodC5kb2NDaGFuZ2VzLmxlbmd0aCA+IDApIHJldHVybiAhMDtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMuYmEgJiYgdGhpcy5iYS5oYXNQZW5kaW5nV3JpdGVzICE9PSB0Lmhhc1BlbmRpbmdXcml0ZXM7XG4gICAgICAgIHJldHVybiAhKCF0LnN5bmNTdGF0ZUNoYW5nZWQgJiYgIWUpICYmICEwID09PSB0aGlzLm9wdGlvbnMuaW5jbHVkZU1ldGFkYXRhQ2hhbmdlcztcbiAgICAgICAgLy8gR2VuZXJhbGx5IHdlIHNob3VsZCBoYXZlIGhpdCBvbmUgb2YgdGhlIGNhc2VzIGFib3ZlLCBidXQgaXQncyBwb3NzaWJsZVxuICAgICAgICAvLyB0byBnZXQgaGVyZSBpZiB0aGVyZSB3ZXJlIG9ubHkgbWV0YWRhdGEgZG9jQ2hhbmdlcyBhbmQgdGhleSBnb3RcbiAgICAgICAgLy8gc3RyaXBwZWQgb3V0LlxuICAgICAgICB9XG4gICAgdmEodCkge1xuICAgICAgICB0ID0gRWEuZnJvbUluaXRpYWxEb2N1bWVudHModC5xdWVyeSwgdC5kb2NzLCB0Lm11dGF0ZWRLZXlzLCB0LmZyb21DYWNoZSksIHRoaXMuUmEgPSAhMCwgXG4gICAgICAgIHRoaXMuQWEubmV4dCh0KTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEEgY29tcGxldGUgZWxlbWVudCBpbiB0aGUgYnVuZGxlIHN0cmVhbSwgdG9nZXRoZXIgd2l0aCB0aGUgYnl0ZSBsZW5ndGggaXRcbiAqIG9jY3VwaWVzIGluIHRoZSBzdHJlYW0uXG4gKi8gY2xhc3MgQ2Ege1xuICAgIGNvbnN0cnVjdG9yKHQsIFxuICAgIC8vIEhvdyBtYW55IGJ5dGVzIHRoaXMgZWxlbWVudCB0YWtlcyB0byBzdG9yZSBpbiB0aGUgYnVuZGxlLlxuICAgIGUpIHtcbiAgICAgICAgdGhpcy5wYXlsb2FkID0gdCwgdGhpcy5ieXRlTGVuZ3RoID0gZTtcbiAgICB9XG4gICAgRGEoKSB7XG4gICAgICAgIHJldHVybiBcIm1ldGFkYXRhXCIgaW4gdGhpcy5wYXlsb2FkO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogSGVscGVyIHRvIGNvbnZlcnQgb2JqZWN0cyBmcm9tIGJ1bmRsZXMgdG8gbW9kZWwgb2JqZWN0cyBpbiB0aGUgU0RLLlxuICovIGNsYXNzIHhhIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMuTSA9IHQ7XG4gICAgfVxuICAgIGxpKHQpIHtcbiAgICAgICAgcmV0dXJuIGZzKHRoaXMuTSwgdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEgQnVuZGxlRG9jdW1lbnQgdG8gYSBNdXRhYmxlRG9jdW1lbnQuXG4gICAgICovICAgIGZpKHQpIHtcbiAgICAgICAgcmV0dXJuIHQubWV0YWRhdGEuZXhpc3RzID8geXModGhpcy5NLCB0LmRvY3VtZW50LCAhMSkgOiB0ZS5uZXdOb0RvY3VtZW50KHRoaXMubGkodC5tZXRhZGF0YS5uYW1lKSwgdGhpcy5kaSh0Lm1ldGFkYXRhLnJlYWRUaW1lKSk7XG4gICAgfVxuICAgIGRpKHQpIHtcbiAgICAgICAgcmV0dXJuIHVzKHQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBIGNsYXNzIHRvIHByb2Nlc3MgdGhlIGVsZW1lbnRzIGZyb20gYSBidW5kbGUsIGxvYWQgdGhlbSBpbnRvIGxvY2FsXG4gKiBzdG9yYWdlIGFuZCBwcm92aWRlIHByb2dyZXNzIHVwZGF0ZSB3aGlsZSBsb2FkaW5nLlxuICovIGNsYXNzIE5hIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgIHRoaXMuQ2EgPSB0LCB0aGlzLmxvY2FsU3RvcmUgPSBlLCB0aGlzLk0gPSBuLCBcbiAgICAgICAgLyoqIEJhdGNoZWQgcXVlcmllcyB0byBiZSBzYXZlZCBpbnRvIHN0b3JhZ2UgKi9cbiAgICAgICAgdGhpcy5xdWVyaWVzID0gW10sIFxuICAgICAgICAvKiogQmF0Y2hlZCBkb2N1bWVudHMgdG8gYmUgc2F2ZWQgaW50byBzdG9yYWdlICovXG4gICAgICAgIHRoaXMuZG9jdW1lbnRzID0gW10sIHRoaXMucHJvZ3Jlc3MgPSBrYSh0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBlbGVtZW50IGZyb20gdGhlIGJ1bmRsZSB0byB0aGUgbG9hZGVyLlxuICAgICAqXG4gICAgICogUmV0dXJucyBhIG5ldyBwcm9ncmVzcyBpZiBhZGRpbmcgdGhlIGVsZW1lbnQgbGVhZHMgdG8gYSBuZXcgcHJvZ3Jlc3MsXG4gICAgICogb3RoZXJ3aXNlIHJldHVybnMgbnVsbC5cbiAgICAgKi8gICAgeGEodCkge1xuICAgICAgICB0aGlzLnByb2dyZXNzLmJ5dGVzTG9hZGVkICs9IHQuYnl0ZUxlbmd0aDtcbiAgICAgICAgbGV0IGUgPSB0aGlzLnByb2dyZXNzLmRvY3VtZW50c0xvYWRlZDtcbiAgICAgICAgcmV0dXJuIHQucGF5bG9hZC5uYW1lZFF1ZXJ5ID8gdGhpcy5xdWVyaWVzLnB1c2godC5wYXlsb2FkLm5hbWVkUXVlcnkpIDogdC5wYXlsb2FkLmRvY3VtZW50TWV0YWRhdGEgPyAodGhpcy5kb2N1bWVudHMucHVzaCh7XG4gICAgICAgICAgICBtZXRhZGF0YTogdC5wYXlsb2FkLmRvY3VtZW50TWV0YWRhdGFcbiAgICAgICAgfSksIHQucGF5bG9hZC5kb2N1bWVudE1ldGFkYXRhLmV4aXN0cyB8fCArK2UpIDogdC5wYXlsb2FkLmRvY3VtZW50ICYmICh0aGlzLmRvY3VtZW50c1t0aGlzLmRvY3VtZW50cy5sZW5ndGggLSAxXS5kb2N1bWVudCA9IHQucGF5bG9hZC5kb2N1bWVudCwgXG4gICAgICAgICsrZSksIGUgIT09IHRoaXMucHJvZ3Jlc3MuZG9jdW1lbnRzTG9hZGVkID8gKHRoaXMucHJvZ3Jlc3MuZG9jdW1lbnRzTG9hZGVkID0gZSwgXG4gICAgICAgIE9iamVjdC5hc3NpZ24oe30sIHRoaXMucHJvZ3Jlc3MpKSA6IG51bGw7XG4gICAgfVxuICAgIE5hKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IG5ldyBNYXAsIG4gPSBuZXcgeGEodGhpcy5NKTtcbiAgICAgICAgZm9yIChjb25zdCBzIG9mIHQpIGlmIChzLm1ldGFkYXRhLnF1ZXJpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBuLmxpKHMubWV0YWRhdGEubmFtZSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG4gb2Ygcy5tZXRhZGF0YS5xdWVyaWVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IChlLmdldChuKSB8fCBHbigpKS5hZGQodCk7XG4gICAgICAgICAgICAgICAgZS5zZXQobiwgcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgcHJvZ3Jlc3MgdG8gJ1N1Y2Nlc3MnIGFuZCByZXR1cm4gdGhlIHVwZGF0ZWQgcHJvZ3Jlc3MuXG4gICAgICovICAgIGFzeW5jIGNvbXBsZXRlKCkge1xuICAgICAgICBjb25zdCB0ID0gYXdhaXQgcm8odGhpcy5sb2NhbFN0b3JlLCBuZXcgeGEodGhpcy5NKSwgdGhpcy5kb2N1bWVudHMsIHRoaXMuQ2EuaWQpLCBlID0gdGhpcy5OYSh0aGlzLmRvY3VtZW50cyk7XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLnF1ZXJpZXMpIGF3YWl0IG9vKHRoaXMubG9jYWxTdG9yZSwgdCwgZS5nZXQodC5uYW1lKSk7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2dyZXNzLnRhc2tTdGF0ZSA9IFwiU3VjY2Vzc1wiLCBuZXcgcXIoT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wcm9ncmVzcyksIHQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgYExvYWRCdW5kbGVUYXNrUHJvZ3Jlc3NgIHJlcHJlc2VudGluZyB0aGUgaW5pdGlhbCBwcm9ncmVzcyBvZlxuICogbG9hZGluZyBhIGJ1bmRsZS5cbiAqLyBmdW5jdGlvbiBrYSh0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdGFza1N0YXRlOiBcIlJ1bm5pbmdcIixcbiAgICAgICAgZG9jdW1lbnRzTG9hZGVkOiAwLFxuICAgICAgICBieXRlc0xvYWRlZDogMCxcbiAgICAgICAgdG90YWxEb2N1bWVudHM6IHQudG90YWxEb2N1bWVudHMsXG4gICAgICAgIHRvdGFsQnl0ZXM6IHQudG90YWxCeXRlc1xuICAgIH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGBMb2FkQnVuZGxlVGFza1Byb2dyZXNzYCByZXByZXNlbnRpbmcgdGhlIHByb2dyZXNzIHRoYXQgdGhlIGxvYWRpbmdcbiAqIGhhcyBzdWNjZWVkZWQuXG4gKi9cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5jbGFzcyBNYSB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLmtleSA9IHQ7XG4gICAgfVxufVxuXG5jbGFzcyBPYSB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLmtleSA9IHQ7XG4gICAgfVxufVxuXG4vKipcbiAqIFZpZXcgaXMgcmVzcG9uc2libGUgZm9yIGNvbXB1dGluZyB0aGUgZmluYWwgbWVyZ2VkIHRydXRoIG9mIHdoYXQgZG9jcyBhcmUgaW5cbiAqIGEgcXVlcnkuIEl0IGdldHMgbm90aWZpZWQgb2YgbG9jYWwgYW5kIHJlbW90ZSBjaGFuZ2VzIHRvIGRvY3MsIGFuZCBhcHBsaWVzXG4gKiB0aGUgcXVlcnkgZmlsdGVycyBhbmQgbGltaXRzIHRvIGRldGVybWluZSB0aGUgbW9zdCBjb3JyZWN0IHBvc3NpYmxlIHJlc3VsdHMuXG4gKi8gY2xhc3MgJGEge1xuICAgIGNvbnN0cnVjdG9yKHQsIFxuICAgIC8qKiBEb2N1bWVudHMgaW5jbHVkZWQgaW4gdGhlIHJlbW90ZSB0YXJnZXQgKi9cbiAgICBlKSB7XG4gICAgICAgIHRoaXMucXVlcnkgPSB0LCB0aGlzLmthID0gZSwgdGhpcy5NYSA9IG51bGwsIFxuICAgICAgICAvKipcbiAgICAgICAgICogQSBmbGFnIHdoZXRoZXIgdGhlIHZpZXcgaXMgY3VycmVudCB3aXRoIHRoZSBiYWNrZW5kLiBBIHZpZXcgaXMgY29uc2lkZXJlZFxuICAgICAgICAgKiBjdXJyZW50IGFmdGVyIGl0IGhhcyBzZWVuIHRoZSBjdXJyZW50IGZsYWcgZnJvbSB0aGUgYmFja2VuZCBhbmQgZGlkIG5vdFxuICAgICAgICAgKiBsb3NlIGNvbnNpc3RlbmN5IHdpdGhpbiB0aGUgd2F0Y2ggc3RyZWFtIChlLmcuIGJlY2F1c2Ugb2YgYW4gZXhpc3RlbmNlXG4gICAgICAgICAqIGZpbHRlciBtaXNtYXRjaCkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSAhMSwgXG4gICAgICAgIC8qKiBEb2N1bWVudHMgaW4gdGhlIHZpZXcgYnV0IG5vdCBpbiB0aGUgcmVtb3RlIHRhcmdldCAqL1xuICAgICAgICB0aGlzLk9hID0gR24oKSwgXG4gICAgICAgIC8qKiBEb2N1bWVudCBLZXlzIHRoYXQgaGF2ZSBsb2NhbCBjaGFuZ2VzICovXG4gICAgICAgIHRoaXMubXV0YXRlZEtleXMgPSBHbigpLCB0aGlzLiRhID0gS2UodCksIHRoaXMuRmEgPSBuZXcgSWEodGhpcy4kYSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBzZXQgb2YgcmVtb3RlIGRvY3VtZW50cyB0aGF0IHRoZSBzZXJ2ZXIgaGFzIHRvbGQgdXMgYmVsb25ncyB0byB0aGUgdGFyZ2V0IGFzc29jaWF0ZWQgd2l0aFxuICAgICAqIHRoaXMgdmlldy5cbiAgICAgKi8gICAgZ2V0IEJhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5rYTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBhIHNldCBvZiBkb2MgY2hhbmdlcywgYXBwbGllcyB0aGUgcXVlcnkgbGltaXQsIGFuZCBjb21wdXRlc1xuICAgICAqIHdoYXQgdGhlIG5ldyByZXN1bHRzIHNob3VsZCBiZSwgd2hhdCB0aGUgY2hhbmdlcyB3ZXJlLCBhbmQgd2hldGhlciB3ZSBtYXlcbiAgICAgKiBuZWVkIHRvIGdvIGJhY2sgdG8gdGhlIGxvY2FsIGNhY2hlIGZvciBtb3JlIHJlc3VsdHMuIERvZXMgbm90IG1ha2UgYW55XG4gICAgICogY2hhbmdlcyB0byB0aGUgdmlldy5cbiAgICAgKiBAcGFyYW0gZG9jQ2hhbmdlcyAtIFRoZSBkb2MgY2hhbmdlcyB0byBhcHBseSB0byB0aGlzIHZpZXcuXG4gICAgICogQHBhcmFtIHByZXZpb3VzQ2hhbmdlcyAtIElmIHRoaXMgaXMgYmVpbmcgY2FsbGVkIHdpdGggYSByZWZpbGwsIHRoZW4gc3RhcnRcbiAgICAgKiAgICAgICAgd2l0aCB0aGlzIHNldCBvZiBkb2NzIGFuZCBjaGFuZ2VzIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgdmlldy5cbiAgICAgKiBAcmV0dXJucyBhIG5ldyBzZXQgb2YgZG9jcywgY2hhbmdlcywgYW5kIHJlZmlsbCBmbGFnLlxuICAgICAqLyAgICBMYSh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBlID8gZS5xYSA6IG5ldyBUYSwgcyA9IGUgPyBlLkZhIDogdGhpcy5GYTtcbiAgICAgICAgbGV0IGkgPSBlID8gZS5tdXRhdGVkS2V5cyA6IHRoaXMubXV0YXRlZEtleXMsIHIgPSBzLCBvID0gITE7XG4gICAgICAgIC8vIFRyYWNrIHRoZSBsYXN0IGRvYyBpbiBhIChmdWxsKSBsaW1pdC4gVGhpcyBpcyBuZWNlc3NhcnksIGJlY2F1c2Ugc29tZVxuICAgICAgICAvLyB1cGRhdGUgKGEgZGVsZXRlLCBvciBhbiB1cGRhdGUgbW92aW5nIGEgZG9jIHBhc3QgdGhlIG9sZCBsaW1pdCkgbWlnaHRcbiAgICAgICAgLy8gbWVhbiB0aGVyZSBpcyBzb21lIG90aGVyIGRvY3VtZW50IGluIHRoZSBsb2NhbCBjYWNoZSB0aGF0IGVpdGhlciBzaG91bGRcbiAgICAgICAgLy8gY29tZSAoMSkgYmV0d2VlbiB0aGUgb2xkIGxhc3QgbGltaXQgZG9jIGFuZCB0aGUgbmV3IGxhc3QgZG9jdW1lbnQsIGluIHRoZVxuICAgICAgICAvLyBjYXNlIG9mIHVwZGF0ZXMsIG9yICgyKSBhZnRlciB0aGUgbmV3IGxhc3QgZG9jdW1lbnQsIGluIHRoZSBjYXNlIG9mXG4gICAgICAgIC8vIGRlbGV0ZXMuIFNvIHdlIGtlZXAgdGhpcyBkb2MgYXQgdGhlIG9sZCBsaW1pdCB0byBjb21wYXJlIHRoZSB1cGRhdGVzIHRvLlxuICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBzaG91bGQgbmV2ZXIgZ2V0IHVzZWQgaW4gYSByZWZpbGwgKHdoZW4gcHJldmlvdXNDaGFuZ2VzIGlzXG4gICAgICAgIC8vIHNldCksIGJlY2F1c2UgdGhlcmUgd2lsbCBvbmx5IGJlIGFkZHMgLS0gbm8gZGVsZXRlcyBvciB1cGRhdGVzLlxuICAgICAgICBjb25zdCBhID0gQ2UodGhpcy5xdWVyeSkgJiYgcy5zaXplID09PSB0aGlzLnF1ZXJ5LmxpbWl0ID8gcy5sYXN0KCkgOiBudWxsLCB1ID0geGUodGhpcy5xdWVyeSkgJiYgcy5zaXplID09PSB0aGlzLnF1ZXJ5LmxpbWl0ID8gcy5maXJzdCgpIDogbnVsbDtcbiAgICAgICAgLy8gRHJvcCBkb2N1bWVudHMgb3V0IHRvIG1lZXQgbGltaXQvbGltaXRUb0xhc3QgcmVxdWlyZW1lbnQuXG4gICAgICAgIGlmICh0Lmlub3JkZXJUcmF2ZXJzYWwoKCh0LCBlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjID0gcy5nZXQodCksIGggPSBVZSh0aGlzLnF1ZXJ5LCBlKSA/IGUgOiBudWxsLCBsID0gISFjICYmIHRoaXMubXV0YXRlZEtleXMuaGFzKGMua2V5KSwgZiA9ICEhaCAmJiAoaC5oYXNMb2NhbE11dGF0aW9ucyB8fCBcbiAgICAgICAgICAgIC8vIFdlIG9ubHkgY29uc2lkZXIgY29tbWl0dGVkIG11dGF0aW9ucyBmb3IgZG9jdW1lbnRzIHRoYXQgd2VyZVxuICAgICAgICAgICAgLy8gbXV0YXRlZCBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoZSB2aWV3LlxuICAgICAgICAgICAgdGhpcy5tdXRhdGVkS2V5cy5oYXMoaC5rZXkpICYmIGguaGFzQ29tbWl0dGVkTXV0YXRpb25zKTtcbiAgICAgICAgICAgIGxldCBkID0gITE7XG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgY2hhbmdlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAmJiBoKSB7XG4gICAgICAgICAgICAgICAgYy5kYXRhLmlzRXF1YWwoaC5kYXRhKSA/IGwgIT09IGYgJiYgKG4udHJhY2soe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAzIC8qIE1ldGFkYXRhICovICxcbiAgICAgICAgICAgICAgICAgICAgZG9jOiBoXG4gICAgICAgICAgICAgICAgfSksIGQgPSAhMCkgOiB0aGlzLlVhKGMsIGgpIHx8IChuLnRyYWNrKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogMiAvKiBNb2RpZmllZCAqLyAsXG4gICAgICAgICAgICAgICAgICAgIGRvYzogaFxuICAgICAgICAgICAgICAgIH0pLCBkID0gITAsIChhICYmIHRoaXMuJGEoaCwgYSkgPiAwIHx8IHUgJiYgdGhpcy4kYShoLCB1KSA8IDApICYmIChcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGRvYyBtb3ZlZCBmcm9tIGluc2lkZSB0aGUgbGltaXQgdG8gb3V0c2lkZSB0aGUgbGltaXQuXG4gICAgICAgICAgICAgICAgLy8gVGhhdCBtZWFucyB0aGVyZSBtYXkgYmUgc29tZSBvdGhlciBkb2MgaW4gdGhlIGxvY2FsIGNhY2hlXG4gICAgICAgICAgICAgICAgLy8gdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW5zdGVhZC5cbiAgICAgICAgICAgICAgICBvID0gITApKTtcbiAgICAgICAgICAgIH0gZWxzZSAhYyAmJiBoID8gKG4udHJhY2soe1xuICAgICAgICAgICAgICAgIHR5cGU6IDAgLyogQWRkZWQgKi8gLFxuICAgICAgICAgICAgICAgIGRvYzogaFxuICAgICAgICAgICAgfSksIGQgPSAhMCkgOiBjICYmICFoICYmIChuLnRyYWNrKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAxIC8qIFJlbW92ZWQgKi8gLFxuICAgICAgICAgICAgICAgIGRvYzogY1xuICAgICAgICAgICAgfSksIGQgPSAhMCwgKGEgfHwgdSkgJiYgKFxuICAgICAgICAgICAgLy8gQSBkb2Mgd2FzIHJlbW92ZWQgZnJvbSBhIGZ1bGwgbGltaXQgcXVlcnkuIFdlJ2xsIG5lZWQgdG9cbiAgICAgICAgICAgIC8vIHJlcXVlcnkgZnJvbSB0aGUgbG9jYWwgY2FjaGUgdG8gc2VlIGlmIHdlIGtub3cgYWJvdXQgc29tZSBvdGhlclxuICAgICAgICAgICAgLy8gZG9jIHRoYXQgc2hvdWxkIGJlIGluIHRoZSByZXN1bHRzLlxuICAgICAgICAgICAgbyA9ICEwKSk7XG4gICAgICAgICAgICBkICYmIChoID8gKHIgPSByLmFkZChoKSwgaSA9IGYgPyBpLmFkZCh0KSA6IGkuZGVsZXRlKHQpKSA6IChyID0gci5kZWxldGUodCksIGkgPSBpLmRlbGV0ZSh0KSkpO1xuICAgICAgICB9KSksIENlKHRoaXMucXVlcnkpIHx8IHhlKHRoaXMucXVlcnkpKSBmb3IgKDtyLnNpemUgPiB0aGlzLnF1ZXJ5LmxpbWl0OyApIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBDZSh0aGlzLnF1ZXJ5KSA/IHIubGFzdCgpIDogci5maXJzdCgpO1xuICAgICAgICAgICAgciA9IHIuZGVsZXRlKHQua2V5KSwgaSA9IGkuZGVsZXRlKHQua2V5KSwgbi50cmFjayh7XG4gICAgICAgICAgICAgICAgdHlwZTogMSAvKiBSZW1vdmVkICovICxcbiAgICAgICAgICAgICAgICBkb2M6IHRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBGYTogcixcbiAgICAgICAgICAgIHFhOiBuLFxuICAgICAgICAgICAgZWk6IG8sXG4gICAgICAgICAgICBtdXRhdGVkS2V5czogaVxuICAgICAgICB9O1xuICAgIH1cbiAgICBVYSh0LCBlKSB7XG4gICAgICAgIC8vIFdlIHN1cHByZXNzIHRoZSBpbml0aWFsIGNoYW5nZSBldmVudCBmb3IgZG9jdW1lbnRzIHRoYXQgd2VyZSBtb2RpZmllZCBhc1xuICAgICAgICAvLyBwYXJ0IG9mIGEgd3JpdGUgYWNrbm93bGVkZ21lbnQgKGUuZy4gd2hlbiB0aGUgdmFsdWUgb2YgYSBzZXJ2ZXIgdHJhbnNmb3JtXG4gICAgICAgIC8vIGlzIGFwcGxpZWQpIGFzIFdhdGNoIHdpbGwgc2VuZCB1cyB0aGUgc2FtZSBkb2N1bWVudCBhZ2Fpbi5cbiAgICAgICAgLy8gQnkgc3VwcHJlc3NpbmcgdGhlIGV2ZW50LCB3ZSBvbmx5IHJhaXNlIHR3byB1c2VyIHZpc2libGUgZXZlbnRzIChvbmUgd2l0aFxuICAgICAgICAvLyBgaGFzUGVuZGluZ1dyaXRlc2AgYW5kIHRoZSBmaW5hbCBzdGF0ZSBvZiB0aGUgZG9jdW1lbnQpIGluc3RlYWQgb2YgdGhyZWVcbiAgICAgICAgLy8gKG9uZSB3aXRoIGBoYXNQZW5kaW5nV3JpdGVzYCwgdGhlIG1vZGlmaWVkIGRvY3VtZW50IHdpdGhcbiAgICAgICAgLy8gYGhhc1BlbmRpbmdXcml0ZXNgIGFuZCB0aGUgZmluYWwgc3RhdGUgb2YgdGhlIGRvY3VtZW50KS5cbiAgICAgICAgcmV0dXJuIHQuaGFzTG9jYWxNdXRhdGlvbnMgJiYgZS5oYXNDb21taXR0ZWRNdXRhdGlvbnMgJiYgIWUuaGFzTG9jYWxNdXRhdGlvbnM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIHZpZXcgd2l0aCB0aGUgZ2l2ZW4gVmlld0RvY3VtZW50Q2hhbmdlcyBhbmQgb3B0aW9uYWxseSB1cGRhdGVzXG4gICAgICogbGltYm8gZG9jcyBhbmQgc3luYyBzdGF0ZSBmcm9tIHRoZSBwcm92aWRlZCB0YXJnZXQgY2hhbmdlLlxuICAgICAqIEBwYXJhbSBkb2NDaGFuZ2VzIC0gVGhlIHNldCBvZiBjaGFuZ2VzIHRvIG1ha2UgdG8gdGhlIHZpZXcncyBkb2NzLlxuICAgICAqIEBwYXJhbSB1cGRhdGVMaW1ib0RvY3VtZW50cyAtIFdoZXRoZXIgdG8gdXBkYXRlIGxpbWJvIGRvY3VtZW50cyBiYXNlZCBvblxuICAgICAqICAgICAgICB0aGlzIGNoYW5nZS5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0Q2hhbmdlIC0gQSB0YXJnZXQgY2hhbmdlIHRvIGFwcGx5IGZvciBjb21wdXRpbmcgbGltYm8gZG9jcyBhbmRcbiAgICAgKiAgICAgICAgc3luYyBzdGF0ZS5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBWaWV3Q2hhbmdlIHdpdGggdGhlIGdpdmVuIGRvY3MsIGNoYW5nZXMsIGFuZCBzeW5jIHN0YXRlLlxuICAgICAqL1xuICAgIC8vIFBPUlRJTkcgTk9URTogVGhlIGlPUy9BbmRyb2lkIGNsaWVudHMgYWx3YXlzIGNvbXB1dGUgbGltYm8gZG9jdW1lbnQgY2hhbmdlcy5cbiAgICBhcHBseUNoYW5nZXModCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gdGhpcy5GYTtcbiAgICAgICAgdGhpcy5GYSA9IHQuRmEsIHRoaXMubXV0YXRlZEtleXMgPSB0Lm11dGF0ZWRLZXlzO1xuICAgICAgICAvLyBTb3J0IGNoYW5nZXMgYmFzZWQgb24gdHlwZSBhbmQgcXVlcnkgY29tcGFyYXRvclxuICAgICAgICBjb25zdCBpID0gdC5xYS55YSgpO1xuICAgICAgICBpLnNvcnQoKCh0LCBlKSA9PiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdCA9PiB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0KSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIDAgLyogQWRkZWQgKi8gOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTtcblxuICAgICAgICAgICAgICAgICAgY2FzZSAyIC8qIE1vZGlmaWVkICovIDpcbiAgICAgICAgICAgICAgICAgIGNhc2UgMyAvKiBNZXRhZGF0YSAqLyA6XG4gICAgICAgICAgICAgICAgICAgIC8vIEEgbWV0YWRhdGEgY2hhbmdlIGlzIGNvbnZlcnRlZCB0byBhIG1vZGlmaWVkIGNoYW5nZSBhdCB0aGUgcHVibGljXG4gICAgICAgICAgICAgICAgICAgIC8vIGFwaSBsYXllci4gIFNpbmNlIHdlIHNvcnQgYnkgZG9jdW1lbnQga2V5IGFuZCB0aGVuIGNoYW5nZSB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAvLyBtZXRhZGF0YSBhbmQgbW9kaWZpZWQgY2hhbmdlcyBtdXN0IGJlIHNvcnRlZCBlcXVpdmFsZW50bHkuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAyO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIDEgLyogUmVtb3ZlZCAqLyA6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuXG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gTCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gbih0KSAtIG4oZSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gKHQudHlwZSwgZS50eXBlKSB8fCB0aGlzLiRhKHQuZG9jLCBlLmRvYykpKSwgdGhpcy5LYShuKTtcbiAgICAgICAgY29uc3QgciA9IGUgPyB0aGlzLkdhKCkgOiBbXSwgbyA9IDAgPT09IHRoaXMuT2Euc2l6ZSAmJiB0aGlzLmN1cnJlbnQgPyAxIC8qIFN5bmNlZCAqLyA6IDAgLyogTG9jYWwgKi8gLCBhID0gbyAhPT0gdGhpcy5NYTtcbiAgICAgICAgaWYgKHRoaXMuTWEgPSBvLCAwICE9PSBpLmxlbmd0aCB8fCBhKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHNuYXBzaG90OiBuZXcgRWEodGhpcy5xdWVyeSwgdC5GYSwgcywgaSwgdC5tdXRhdGVkS2V5cywgMCAvKiBMb2NhbCAqLyA9PT0gbywgYSwgXG4gICAgICAgICAgICAgICAgLyogZXhjbHVkZXNNZXRhZGF0YUNoYW5nZXM9ICovICExKSxcbiAgICAgICAgICAgICAgICBRYTogclxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBubyBjaGFuZ2VzXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBRYTogclxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIGFuIE9ubGluZVN0YXRlIGNoYW5nZSB0byB0aGUgdmlldywgcG90ZW50aWFsbHkgZ2VuZXJhdGluZyBhXG4gICAgICogVmlld0NoYW5nZSBpZiB0aGUgdmlldydzIHN5bmNTdGF0ZSBjaGFuZ2VzIGFzIGEgcmVzdWx0LlxuICAgICAqLyAgICBUYSh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQgJiYgXCJPZmZsaW5lXCIgLyogT2ZmbGluZSAqLyA9PT0gdCA/IChcbiAgICAgICAgLy8gSWYgd2UncmUgb2ZmbGluZSwgc2V0IGBjdXJyZW50YCB0byBmYWxzZSBhbmQgdGhlbiBjYWxsIGFwcGx5Q2hhbmdlcygpXG4gICAgICAgIC8vIHRvIHJlZnJlc2ggb3VyIHN5bmNTdGF0ZSBhbmQgZ2VuZXJhdGUgYSBWaWV3Q2hhbmdlIGFzIGFwcHJvcHJpYXRlLiBXZVxuICAgICAgICAvLyBhcmUgZ3VhcmFudGVlZCB0byBnZXQgYSBuZXcgVGFyZ2V0Q2hhbmdlIHRoYXQgc2V0cyBgY3VycmVudGAgYmFjayB0b1xuICAgICAgICAvLyB0cnVlIG9uY2UgdGhlIGNsaWVudCBpcyBiYWNrIG9ubGluZS5cbiAgICAgICAgdGhpcy5jdXJyZW50ID0gITEsIHRoaXMuYXBwbHlDaGFuZ2VzKHtcbiAgICAgICAgICAgIEZhOiB0aGlzLkZhLFxuICAgICAgICAgICAgcWE6IG5ldyBUYSxcbiAgICAgICAgICAgIG11dGF0ZWRLZXlzOiB0aGlzLm11dGF0ZWRLZXlzLFxuICAgICAgICAgICAgZWk6ICExXG4gICAgICAgIH0sIFxuICAgICAgICAvKiB1cGRhdGVMaW1ib0RvY3VtZW50cz0gKi8gITEpKSA6IHtcbiAgICAgICAgICAgIFFhOiBbXVxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGRvYyBmb3IgdGhlIGdpdmVuIGtleSBzaG91bGQgYmUgaW4gbGltYm8uXG4gICAgICovICAgIGphKHQpIHtcbiAgICAgICAgLy8gSWYgdGhlIHJlbW90ZSBlbmQgc2F5cyBpdCdzIHBhcnQgb2YgdGhpcyBxdWVyeSwgaXQncyBub3QgaW4gbGltYm8uXG4gICAgICAgIHJldHVybiAhdGhpcy5rYS5oYXModCkgJiYgKFxuICAgICAgICAvLyBUaGUgbG9jYWwgc3RvcmUgZG9lc24ndCB0aGluayBpdCdzIGEgcmVzdWx0LCBzbyBpdCBzaG91bGRuJ3QgYmUgaW4gbGltYm8uXG4gICAgICAgICEhdGhpcy5GYS5oYXModCkgJiYgIXRoaXMuRmEuZ2V0KHQpLmhhc0xvY2FsTXV0YXRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBzeW5jZWREb2N1bWVudHMsIGN1cnJlbnQsIGFuZCBsaW1ibyBkb2NzIGJhc2VkIG9uIHRoZSBnaXZlbiBjaGFuZ2UuXG4gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBjaGFuZ2VzIHRvIHdoaWNoIGRvY3MgYXJlIGluIGxpbWJvLlxuICAgICAqLyAgICBLYSh0KSB7XG4gICAgICAgIHQgJiYgKHQuYWRkZWREb2N1bWVudHMuZm9yRWFjaCgodCA9PiB0aGlzLmthID0gdGhpcy5rYS5hZGQodCkpKSwgdC5tb2RpZmllZERvY3VtZW50cy5mb3JFYWNoKCh0ID0+IHt9KSksIFxuICAgICAgICB0LnJlbW92ZWREb2N1bWVudHMuZm9yRWFjaCgodCA9PiB0aGlzLmthID0gdGhpcy5rYS5kZWxldGUodCkpKSwgdGhpcy5jdXJyZW50ID0gdC5jdXJyZW50KTtcbiAgICB9XG4gICAgR2EoKSB7XG4gICAgICAgIC8vIFdlIGNhbiBvbmx5IGRldGVybWluZSBsaW1ibyBkb2N1bWVudHMgd2hlbiB3ZSdyZSBpbi1zeW5jIHdpdGggdGhlIHNlcnZlci5cbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnQpIHJldHVybiBbXTtcbiAgICAgICAgLy8gVE9ETyhrbGltdCk6IERvIHRoaXMgaW5jcmVtZW50YWxseSBzbyB0aGF0IGl0J3Mgbm90IHF1YWRyYXRpYyB3aGVuXG4gICAgICAgIC8vIHVwZGF0aW5nIG1hbnkgZG9jdW1lbnRzLlxuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLk9hO1xuICAgICAgICB0aGlzLk9hID0gR24oKSwgdGhpcy5GYS5mb3JFYWNoKCh0ID0+IHtcbiAgICAgICAgICAgIHRoaXMuamEodC5rZXkpICYmICh0aGlzLk9hID0gdGhpcy5PYS5hZGQodC5rZXkpKTtcbiAgICAgICAgfSkpO1xuICAgICAgICAvLyBEaWZmIHRoZSBuZXcgbGltYm8gZG9jcyB3aXRoIHRoZSBvbGQgbGltYm8gZG9jcy5cbiAgICAgICAgY29uc3QgZSA9IFtdO1xuICAgICAgICByZXR1cm4gdC5mb3JFYWNoKCh0ID0+IHtcbiAgICAgICAgICAgIHRoaXMuT2EuaGFzKHQpIHx8IGUucHVzaChuZXcgT2EodCkpO1xuICAgICAgICB9KSksIHRoaXMuT2EuZm9yRWFjaCgobiA9PiB7XG4gICAgICAgICAgICB0LmhhcyhuKSB8fCBlLnB1c2gobmV3IE1hKG4pKTtcbiAgICAgICAgfSkpLCBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGluLW1lbW9yeSBzdGF0ZSBvZiB0aGUgY3VycmVudCB2aWV3IHdpdGggdGhlIHN0YXRlIHJlYWQgZnJvbVxuICAgICAqIHBlcnNpc3RlbmNlLlxuICAgICAqXG4gICAgICogV2UgdXBkYXRlIHRoZSBxdWVyeSB2aWV3IHdoZW5ldmVyIGEgY2xpZW50J3MgcHJpbWFyeSBzdGF0dXMgY2hhbmdlczpcbiAgICAgKiAtIFdoZW4gYSBjbGllbnQgdHJhbnNpdGlvbnMgZnJvbSBwcmltYXJ5IHRvIHNlY29uZGFyeSwgaXQgY2FuIG1pc3NcbiAgICAgKiAgIExvY2FsU3RvcmFnZSB1cGRhdGVzIGFuZCBpdHMgcXVlcnkgdmlld3MgbWF5IHRlbXBvcmFyaWx5IG5vdCBiZVxuICAgICAqICAgc3luY2hyb25pemVkIHdpdGggdGhlIHN0YXRlIG9uIGRpc2suXG4gICAgICogLSBGb3Igc2Vjb25kYXJ5IHRvIHByaW1hcnkgdHJhbnNpdGlvbnMsIHRoZSBjbGllbnQgbmVlZHMgdG8gdXBkYXRlIHRoZSBsaXN0XG4gICAgICogICBvZiBgc3luY2VkRG9jdW1lbnRzYCBzaW5jZSBzZWNvbmRhcnkgY2xpZW50cyB1cGRhdGUgdGhlaXIgcXVlcnkgdmlld3NcbiAgICAgKiAgIGJhc2VkIHB1cmVseSBvbiBzeW50aGVzaXplZCBSZW1vdGVFdmVudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcXVlcnlSZXN1bHQuZG9jdW1lbnRzIC0gVGhlIGRvY3VtZW50cyB0aGF0IG1hdGNoIHRoZSBxdWVyeSBhY2NvcmRpbmdcbiAgICAgKiB0byB0aGUgTG9jYWxTdG9yZS5cbiAgICAgKiBAcGFyYW0gcXVlcnlSZXN1bHQucmVtb3RlS2V5cyAtIFRoZSBrZXlzIG9mIHRoZSBkb2N1bWVudHMgdGhhdCBtYXRjaCB0aGVcbiAgICAgKiBxdWVyeSBhY2NvcmRpbmcgdG8gdGhlIGJhY2tlbmQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgVmlld0NoYW5nZSB0aGF0IHJlc3VsdGVkIGZyb20gdGhpcyBzeW5jaHJvbml6YXRpb24uXG4gICAgICovXG4gICAgLy8gUE9SVElORyBOT1RFOiBNdWx0aS10YWIgb25seS5cbiAgICBXYSh0KSB7XG4gICAgICAgIHRoaXMua2EgPSB0LmhpLCB0aGlzLk9hID0gR24oKTtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMuTGEodC5kb2N1bWVudHMpO1xuICAgICAgICByZXR1cm4gdGhpcy5hcHBseUNoYW5nZXMoZSwgLyp1cGRhdGVMaW1ib0RvY3VtZW50cz0qLyAhMCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB2aWV3IHNuYXBzaG90IGFzIGlmIHRoaXMgcXVlcnkgd2FzIGp1c3QgbGlzdGVuZWQgdG8uIENvbnRhaW5zXG4gICAgICogYSBkb2N1bWVudCBhZGQgZm9yIGV2ZXJ5IGV4aXN0aW5nIGRvY3VtZW50IGFuZCB0aGUgYGZyb21DYWNoZWAgYW5kXG4gICAgICogYGhhc1BlbmRpbmdXcml0ZXNgIHN0YXR1cyBvZiB0aGUgYWxyZWFkeSBlc3RhYmxpc2hlZCB2aWV3LlxuICAgICAqL1xuICAgIC8vIFBPUlRJTkcgTk9URTogTXVsdGktdGFiIG9ubHkuXG4gICAgemEoKSB7XG4gICAgICAgIHJldHVybiBFYS5mcm9tSW5pdGlhbERvY3VtZW50cyh0aGlzLnF1ZXJ5LCB0aGlzLkZhLCB0aGlzLm11dGF0ZWRLZXlzLCAwIC8qIExvY2FsICovID09PSB0aGlzLk1hKTtcbiAgICB9XG59XG5cbi8qKlxuICogUXVlcnlWaWV3IGNvbnRhaW5zIGFsbCBvZiB0aGUgZGF0YSB0aGF0IFN5bmNFbmdpbmUgbmVlZHMgdG8ga2VlcCB0cmFjayBvZiBmb3JcbiAqIGEgcGFydGljdWxhciBxdWVyeS5cbiAqL1xuY2xhc3MgRmEge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIFRoZSBxdWVyeSBpdHNlbGYuXG4gICAgICovXG4gICAgdCwgXG4gICAgLyoqXG4gICAgICogVGhlIHRhcmdldCBudW1iZXIgY3JlYXRlZCBieSB0aGUgY2xpZW50IHRoYXQgaXMgdXNlZCBpbiB0aGUgd2F0Y2hcbiAgICAgKiBzdHJlYW0gdG8gaWRlbnRpZnkgdGhpcyBxdWVyeS5cbiAgICAgKi9cbiAgICBlLCBcbiAgICAvKipcbiAgICAgKiBUaGUgdmlldyBpcyByZXNwb25zaWJsZSBmb3IgY29tcHV0aW5nIHRoZSBmaW5hbCBtZXJnZWQgdHJ1dGggb2Ygd2hhdFxuICAgICAqIGRvY3MgYXJlIGluIHRoZSBxdWVyeS4gSXQgZ2V0cyBub3RpZmllZCBvZiBsb2NhbCBhbmQgcmVtb3RlIGNoYW5nZXMsXG4gICAgICogYW5kIGFwcGxpZXMgdGhlIHF1ZXJ5IGZpbHRlcnMgYW5kIGxpbWl0cyB0byBkZXRlcm1pbmUgdGhlIG1vc3QgY29ycmVjdFxuICAgICAqIHBvc3NpYmxlIHJlc3VsdHMuXG4gICAgICovXG4gICAgbikge1xuICAgICAgICB0aGlzLnF1ZXJ5ID0gdCwgdGhpcy50YXJnZXRJZCA9IGUsIHRoaXMudmlldyA9IG47XG4gICAgfVxufVxuXG4vKiogVHJhY2tzIGEgbGltYm8gcmVzb2x1dGlvbi4gKi8gY2xhc3MgQmEge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5rZXkgPSB0LCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldCB0byB0cnVlIG9uY2Ugd2UndmUgcmVjZWl2ZWQgYSBkb2N1bWVudC4gVGhpcyBpcyB1c2VkIGluXG4gICAgICAgICAqIGdldFJlbW90ZUtleXNGb3JUYXJnZXQoKSBhbmQgdWx0aW1hdGVseSB1c2VkIGJ5IFdhdGNoQ2hhbmdlQWdncmVnYXRvciB0b1xuICAgICAgICAgKiBkZWNpZGUgd2hldGhlciBpdCBuZWVkcyB0byBtYW51ZmFjdHVyZSBhIGRlbGV0ZSBldmVudCBmb3IgdGhlIHRhcmdldCBvbmNlXG4gICAgICAgICAqIHRoZSB0YXJnZXQgaXMgQ1VSUkVOVC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuSGEgPSAhMTtcbiAgICB9XG59XG5cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgYFN5bmNFbmdpbmVgIGNvb3JkaW5hdGluZyB3aXRoIG90aGVyIHBhcnRzIG9mIFNESy5cbiAqXG4gKiBUaGUgcGFydHMgb2YgU3luY0VuZ2luZSB0aGF0IGFjdCBhcyBhIGNhbGxiYWNrIHRvIFJlbW90ZVN0b3JlIG5lZWQgdG8gYmVcbiAqIHJlZ2lzdGVyZWQgaW5kaXZpZHVhbGx5LiBUaGlzIGlzIGRvbmUgaW4gYHN5bmNFbmdpbmVXcml0ZSgpYCBhbmRcbiAqIGBzeW5jRW5naW5lTGlzdGVuKClgIChhcyB3ZWxsIGFzIGBhcHBseVByaW1hcnlTdGF0ZSgpYCkgYXMgdGhlc2UgbWV0aG9kc1xuICogc2VydmUgYXMgZW50cnkgcG9pbnRzIHRvIFJlbW90ZVN0b3JlJ3MgZnVuY3Rpb25hbGl0eS5cbiAqXG4gKiBOb3RlOiBzb21lIGZpZWxkIGRlZmluZWQgaW4gdGhpcyBjbGFzcyBtaWdodCBoYXZlIHB1YmxpYyBhY2Nlc3MgbGV2ZWwsIGJ1dFxuICogdGhlIGNsYXNzIGlzIG5vdCBleHBvcnRlZCBzbyB0aGV5IGFyZSBvbmx5IGFjY2Vzc2libGUgZnJvbSB0aGlzIG1vZHVsZS5cbiAqIFRoaXMgaXMgdXNlZnVsIHRvIGltcGxlbWVudCBvcHRpb25hbCBmZWF0dXJlcyAobGlrZSBidW5kbGVzKSBpbiBmcmVlXG4gKiBmdW5jdGlvbnMsIHN1Y2ggdGhhdCB0aGV5IGFyZSB0cmVlLXNoYWtlYWJsZS5cbiAqLyBjbGFzcyBMYSB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgXG4gICAgLy8gUE9SVElORyBOT1RFOiBNYW5hZ2VzIHN0YXRlIHN5bmNocm9uaXphdGlvbiBpbiBtdWx0aS10YWIgZW52aXJvbm1lbnRzLlxuICAgIHMsIGksIHIpIHtcbiAgICAgICAgdGhpcy5sb2NhbFN0b3JlID0gdCwgdGhpcy5yZW1vdGVTdG9yZSA9IGUsIHRoaXMuZXZlbnRNYW5hZ2VyID0gbiwgdGhpcy5zaGFyZWRDbGllbnRTdGF0ZSA9IHMsIFxuICAgICAgICB0aGlzLmN1cnJlbnRVc2VyID0gaSwgdGhpcy5tYXhDb25jdXJyZW50TGltYm9SZXNvbHV0aW9ucyA9IHIsIHRoaXMuSmEgPSB7fSwgdGhpcy5ZYSA9IG5ldyBEbigodCA9PiBMZSh0KSksIEJlKSwgXG4gICAgICAgIHRoaXMuWGEgPSBuZXcgTWFwLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBrZXlzIG9mIGRvY3VtZW50cyB0aGF0IGFyZSBpbiBsaW1ibyBmb3Igd2hpY2ggd2UgaGF2ZW4ndCB5ZXQgc3RhcnRlZCBhXG4gICAgICAgICAqIGxpbWJvIHJlc29sdXRpb24gcXVlcnkuIFRoZSBzdHJpbmdzIGluIHRoaXMgc2V0IGFyZSB0aGUgcmVzdWx0IG9mIGNhbGxpbmdcbiAgICAgICAgICogYGtleS5wYXRoLmNhbm9uaWNhbFN0cmluZygpYCB3aGVyZSBga2V5YCBpcyBhIGBEb2N1bWVudEtleWAgb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgYFNldGAgdHlwZSB3YXMgY2hvc2VuIGJlY2F1c2UgaXQgcHJvdmlkZXMgZWZmaWNpZW50IGxvb2t1cCBhbmQgcmVtb3ZhbFxuICAgICAgICAgKiBvZiBhcmJpdHJhcnkgZWxlbWVudHMgYW5kIGl0IGFsc28gbWFpbnRhaW5zIGluc2VydGlvbiBvcmRlciwgcHJvdmlkaW5nIHRoZVxuICAgICAgICAgKiBkZXNpcmVkIHF1ZXVlLWxpa2UgRklGTyBzZW1hbnRpY3MuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLlphID0gbmV3IFNldCwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBLZWVwcyB0cmFjayBvZiB0aGUgdGFyZ2V0IElEIGZvciBlYWNoIGRvY3VtZW50IHRoYXQgaXMgaW4gbGltYm8gd2l0aCBhblxuICAgICAgICAgKiBhY3RpdmUgdGFyZ2V0LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50dSA9IG5ldyBDbih4dC5jb21wYXJhdG9yKSwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBLZWVwcyB0cmFjayBvZiB0aGUgaW5mb3JtYXRpb24gYWJvdXQgYW4gYWN0aXZlIGxpbWJvIHJlc29sdXRpb24gZm9yIGVhY2hcbiAgICAgICAgICogYWN0aXZlIHRhcmdldCBJRCB0aGF0IHdhcyBzdGFydGVkIGZvciB0aGUgcHVycG9zZSBvZiBsaW1ibyByZXNvbHV0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5ldSA9IG5ldyBNYXAsIHRoaXMubnUgPSBuZXcgY28sIFxuICAgICAgICAvKiogU3RvcmVzIHVzZXIgY29tcGxldGlvbiBoYW5kbGVycywgaW5kZXhlZCBieSBVc2VyIGFuZCBCYXRjaElkLiAqL1xuICAgICAgICB0aGlzLnN1ID0ge30sIFxuICAgICAgICAvKiogU3RvcmVzIHVzZXIgY2FsbGJhY2tzIHdhaXRpbmcgZm9yIGFsbCBwZW5kaW5nIHdyaXRlcyB0byBiZSBhY2tub3dsZWRnZWQuICovXG4gICAgICAgIHRoaXMuaXUgPSBuZXcgTWFwLCB0aGlzLnJ1ID0gbXIuZ24oKSwgdGhpcy5vbmxpbmVTdGF0ZSA9IFwiVW5rbm93blwiIC8qIFVua25vd24gKi8gLCBcbiAgICAgICAgLy8gVGhlIHByaW1hcnkgc3RhdGUgaXMgc2V0IHRvIGB0cnVlYCBvciBgZmFsc2VgIGltbWVkaWF0ZWx5IGFmdGVyIEZpcmVzdG9yZVxuICAgICAgICAvLyBzdGFydHVwLiBJbiB0aGUgaW50ZXJpbSwgYSBjbGllbnQgc2hvdWxkIG9ubHkgYmUgY29uc2lkZXJlZCBwcmltYXJ5IGlmXG4gICAgICAgIC8vIGBpc1ByaW1hcnlgIGlzIHRydWUuXG4gICAgICAgIHRoaXMub3UgPSB2b2lkIDA7XG4gICAgfVxuICAgIGdldCBpc1ByaW1hcnlDbGllbnQoKSB7XG4gICAgICAgIHJldHVybiAhMCA9PT0gdGhpcy5vdTtcbiAgICB9XG59XG5cbi8qKlxuICogSW5pdGlhdGVzIHRoZSBuZXcgbGlzdGVuLCByZXNvbHZlcyBwcm9taXNlIHdoZW4gbGlzdGVuIGVucXVldWVkIHRvIHRoZVxuICogc2VydmVyLiBBbGwgdGhlIHN1YnNlcXVlbnQgdmlldyBzbmFwc2hvdHMgb3IgZXJyb3JzIGFyZSBzZW50IHRvIHRoZVxuICogc3Vic2NyaWJlZCBoYW5kbGVycy4gUmV0dXJucyB0aGUgaW5pdGlhbCBzbmFwc2hvdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcWEodCwgZSkge1xuICAgIGNvbnN0IG4gPSBtdSh0KTtcbiAgICBsZXQgcywgaTtcbiAgICBjb25zdCByID0gbi5ZYS5nZXQoZSk7XG4gICAgaWYgKHIpIFxuICAgIC8vIFBPUlRJTkcgTk9URTogV2l0aCBNdWx0aS1UYWIgV2ViLCBpdCBpcyBwb3NzaWJsZSB0aGF0IGEgcXVlcnkgdmlld1xuICAgIC8vIGFscmVhZHkgZXhpc3RzIHdoZW4gRXZlbnRNYW5hZ2VyIGNhbGxzIHVzIGZvciB0aGUgZmlyc3QgdGltZS4gVGhpc1xuICAgIC8vIGhhcHBlbnMgd2hlbiB0aGUgcHJpbWFyeSB0YWIgaXMgYWxyZWFkeSBsaXN0ZW5pbmcgdG8gdGhpcyBxdWVyeSBvblxuICAgIC8vIGJlaGFsZiBvZiBhbm90aGVyIHRhYiBhbmQgdGhlIHVzZXIgb2YgdGhlIHByaW1hcnkgYWxzbyBzdGFydHMgbGlzdGVuaW5nXG4gICAgLy8gdG8gdGhlIHF1ZXJ5LiBFdmVudE1hbmFnZXIgd2lsbCBub3QgaGF2ZSBhbiBhc3NpZ25lZCB0YXJnZXQgSUQgaW4gdGhpc1xuICAgIC8vIGNhc2UgYW5kIGNhbGxzIGBsaXN0ZW5gIHRvIG9idGFpbiB0aGlzIElELlxuICAgIHMgPSByLnRhcmdldElkLCBuLnNoYXJlZENsaWVudFN0YXRlLmFkZExvY2FsUXVlcnlUYXJnZXQocyksIGkgPSByLnZpZXcuemEoKTsgZWxzZSB7XG4gICAgICAgIGNvbnN0IHQgPSBhd2FpdCBacihuLmxvY2FsU3RvcmUsICRlKGUpKTtcbiAgICAgICAgbi5pc1ByaW1hcnlDbGllbnQgJiYgam8obi5yZW1vdGVTdG9yZSwgdCk7XG4gICAgICAgIGNvbnN0IHIgPSBuLnNoYXJlZENsaWVudFN0YXRlLmFkZExvY2FsUXVlcnlUYXJnZXQodC50YXJnZXRJZCk7XG4gICAgICAgIHMgPSB0LnRhcmdldElkLCBpID0gYXdhaXQgVWEobiwgZSwgcywgXCJjdXJyZW50XCIgPT09IHIpO1xuICAgIH1cbiAgICByZXR1cm4gaTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSB2aWV3IGZvciBhIHByZXZpb3VzbHkgdW5rbm93biBxdWVyeSBhbmQgY29tcHV0ZXMgaXRzIGluaXRpYWxcbiAqIHNuYXBzaG90LlxuICovIGFzeW5jIGZ1bmN0aW9uIFVhKHQsIGUsIG4sIHMpIHtcbiAgICAvLyBQT1JUSU5HIE5PVEU6IE9uIFdlYiBvbmx5LCB3ZSBpbmplY3QgdGhlIGNvZGUgdGhhdCByZWdpc3RlcnMgbmV3IExpbWJvXG4gICAgLy8gdGFyZ2V0cyBiYXNlZCBvbiB2aWV3IGNoYW5nZXMuIFRoaXMgYWxsb3dzIHVzIHRvIG9ubHkgZGVwZW5kIG9uIExpbWJvXG4gICAgLy8gY2hhbmdlcyB3aGVuIHVzZXIgY29kZSBpbmNsdWRlcyBxdWVyaWVzLlxuICAgIHQuYXUgPSAoZSwgbiwgcykgPT4gYXN5bmMgZnVuY3Rpb24odCwgZSwgbiwgcykge1xuICAgICAgICBsZXQgaSA9IGUudmlldy5MYShuKTtcbiAgICAgICAgaS5laSAmJiAoXG4gICAgICAgIC8vIFRoZSBxdWVyeSBoYXMgYSBsaW1pdCBhbmQgc29tZSBkb2NzIHdlcmUgcmVtb3ZlZCwgc28gd2UgbmVlZFxuICAgICAgICAvLyB0byByZS1ydW4gdGhlIHF1ZXJ5IGFnYWluc3QgdGhlIGxvY2FsIHN0b3JlIHRvIG1ha2Ugc3VyZSB3ZVxuICAgICAgICAvLyBkaWRuJ3QgbG9zZSBhbnkgZ29vZCBkb2NzIHRoYXQgaGFkIGJlZW4gcGFzdCB0aGUgbGltaXQuXG4gICAgICAgIGkgPSBhd2FpdCBlbyh0LmxvY2FsU3RvcmUsIGUucXVlcnksIFxuICAgICAgICAvKiB1c2VQcmV2aW91c1Jlc3VsdHM9ICovICExKS50aGVuKCgoe2RvY3VtZW50czogdH0pID0+IGUudmlldy5MYSh0LCBpKSkpKTtcbiAgICAgICAgY29uc3QgciA9IHMgJiYgcy50YXJnZXRDaGFuZ2VzLmdldChlLnRhcmdldElkKSwgbyA9IGUudmlldy5hcHBseUNoYW5nZXMoaSwgXG4gICAgICAgIC8qIHVwZGF0ZUxpbWJvRG9jdW1lbnRzPSAqLyB0LmlzUHJpbWFyeUNsaWVudCwgcik7XG4gICAgICAgIHJldHVybiBldSh0LCBlLnRhcmdldElkLCBvLlFhKSwgby5zbmFwc2hvdDtcbiAgICB9KHQsIGUsIG4sIHMpO1xuICAgIGNvbnN0IGkgPSBhd2FpdCBlbyh0LmxvY2FsU3RvcmUsIGUsIFxuICAgIC8qIHVzZVByZXZpb3VzUmVzdWx0cz0gKi8gITApLCByID0gbmV3ICRhKGUsIGkuaGkpLCBvID0gci5MYShpLmRvY3VtZW50cyksIGEgPSB6bi5jcmVhdGVTeW50aGVzaXplZFRhcmdldENoYW5nZUZvckN1cnJlbnRDaGFuZ2UobiwgcyAmJiBcIk9mZmxpbmVcIiAvKiBPZmZsaW5lICovICE9PSB0Lm9ubGluZVN0YXRlKSwgdSA9IHIuYXBwbHlDaGFuZ2VzKG8sIFxuICAgIC8qIHVwZGF0ZUxpbWJvRG9jdW1lbnRzPSAqLyB0LmlzUHJpbWFyeUNsaWVudCwgYSk7XG4gICAgZXUodCwgbiwgdS5RYSk7XG4gICAgY29uc3QgYyA9IG5ldyBGYShlLCBuLCByKTtcbiAgICByZXR1cm4gdC5ZYS5zZXQoZSwgYyksIHQuWGEuaGFzKG4pID8gdC5YYS5nZXQobikucHVzaChlKSA6IHQuWGEuc2V0KG4sIFsgZSBdKSwgdS5zbmFwc2hvdDtcbn1cblxuLyoqIFN0b3BzIGxpc3RlbmluZyB0byB0aGUgcXVlcnkuICovIGFzeW5jIGZ1bmN0aW9uIEthKHQsIGUpIHtcbiAgICBjb25zdCBuID0gSyh0KSwgcyA9IG4uWWEuZ2V0KGUpLCBpID0gbi5YYS5nZXQocy50YXJnZXRJZCk7XG4gICAgaWYgKGkubGVuZ3RoID4gMSkgcmV0dXJuIG4uWGEuc2V0KHMudGFyZ2V0SWQsIGkuZmlsdGVyKCh0ID0+ICFCZSh0LCBlKSkpKSwgdm9pZCBuLllhLmRlbGV0ZShlKTtcbiAgICAvLyBObyBvdGhlciBxdWVyaWVzIGFyZSBtYXBwZWQgdG8gdGhlIHRhcmdldCwgY2xlYW4gdXAgdGhlIHF1ZXJ5IGFuZCB0aGUgdGFyZ2V0LlxuICAgICAgICBpZiAobi5pc1ByaW1hcnlDbGllbnQpIHtcbiAgICAgICAgLy8gV2UgbmVlZCB0byByZW1vdmUgdGhlIGxvY2FsIHF1ZXJ5IHRhcmdldCBmaXJzdCB0byBhbGxvdyB1cyB0byB2ZXJpZnlcbiAgICAgICAgLy8gd2hldGhlciBhbnkgb3RoZXIgY2xpZW50IGlzIHN0aWxsIGludGVyZXN0ZWQgaW4gdGhpcyB0YXJnZXQuXG4gICAgICAgIG4uc2hhcmVkQ2xpZW50U3RhdGUucmVtb3ZlTG9jYWxRdWVyeVRhcmdldChzLnRhcmdldElkKTtcbiAgICAgICAgbi5zaGFyZWRDbGllbnRTdGF0ZS5pc0FjdGl2ZVF1ZXJ5VGFyZ2V0KHMudGFyZ2V0SWQpIHx8IGF3YWl0IHRvKG4ubG9jYWxTdG9yZSwgcy50YXJnZXRJZCwgXG4gICAgICAgIC8qa2VlcFBlcnNpc3RlZFRhcmdldERhdGE9Ki8gITEpLnRoZW4oKCgpID0+IHtcbiAgICAgICAgICAgIG4uc2hhcmVkQ2xpZW50U3RhdGUuY2xlYXJRdWVyeVN0YXRlKHMudGFyZ2V0SWQpLCBXbyhuLnJlbW90ZVN0b3JlLCBzLnRhcmdldElkKSwgXG4gICAgICAgICAgICBaYShuLCBzLnRhcmdldElkKTtcbiAgICAgICAgfSkpLmNhdGNoKFRyKTtcbiAgICB9IGVsc2UgWmEobiwgcy50YXJnZXRJZCksIGF3YWl0IHRvKG4ubG9jYWxTdG9yZSwgcy50YXJnZXRJZCwgXG4gICAgLyprZWVwUGVyc2lzdGVkVGFyZ2V0RGF0YT0qLyAhMCk7XG59XG5cbi8qKlxuICogSW5pdGlhdGVzIHRoZSB3cml0ZSBvZiBsb2NhbCBtdXRhdGlvbiBiYXRjaCB3aGljaCBpbnZvbHZlcyBhZGRpbmcgdGhlXG4gKiB3cml0ZXMgdG8gdGhlIG11dGF0aW9uIHF1ZXVlLCBub3RpZnlpbmcgdGhlIHJlbW90ZSBzdG9yZSBhYm91dCBuZXdcbiAqIG11dGF0aW9ucyBhbmQgcmFpc2luZyBldmVudHMgZm9yIGFueSBjaGFuZ2VzIHRoaXMgd3JpdGUgY2F1c2VkLlxuICpcbiAqIFRoZSBwcm9taXNlIHJldHVybmVkIGJ5IHRoaXMgY2FsbCBpcyByZXNvbHZlZCB3aGVuIHRoZSBhYm92ZSBzdGVwc1xuICogaGF2ZSBjb21wbGV0ZWQsICpub3QqIHdoZW4gdGhlIHdyaXRlIHdhcyBhY2tlZCBieSB0aGUgYmFja2VuZC4gVGhlXG4gKiB1c2VyQ2FsbGJhY2sgaXMgcmVzb2x2ZWQgb25jZSB0aGUgd3JpdGUgd2FzIGFja2VkL3JlamVjdGVkIGJ5IHRoZVxuICogYmFja2VuZCAob3IgZmFpbGVkIGxvY2FsbHkgZm9yIGFueSBvdGhlciByZWFzb24pLlxuICovIGFzeW5jIGZ1bmN0aW9uIEdhKHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gZ3UodCk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdCA9IGF3YWl0IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBLKHQpLCBzID0gdXQubm93KCksIGkgPSBlLnJlZHVjZSgoKHQsIGUpID0+IHQuYWRkKGUua2V5KSksIEduKCkpO1xuICAgICAgICAgICAgbGV0IHI7XG4gICAgICAgICAgICByZXR1cm4gbi5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIkxvY2FsbHkgd3JpdGUgbXV0YXRpb25zXCIsIFwicmVhZHdyaXRlXCIsICh0ID0+IG4udWkuVXModCwgaSkubmV4dCgoaSA9PiB7XG4gICAgICAgICAgICAgICAgciA9IGk7XG4gICAgICAgICAgICAgICAgLy8gRm9yIG5vbi1pZGVtcG90ZW50IG11dGF0aW9ucyAoc3VjaCBhcyBgRmllbGRWYWx1ZS5pbmNyZW1lbnQoKWApLFxuICAgICAgICAgICAgICAgIC8vIHdlIHJlY29yZCB0aGUgYmFzZSBzdGF0ZSBpbiBhIHNlcGFyYXRlIHBhdGNoIG11dGF0aW9uLiBUaGlzIGlzXG4gICAgICAgICAgICAgICAgLy8gbGF0ZXIgdXNlZCB0byBndWFyYW50ZWUgY29uc2lzdGVudCB2YWx1ZXMgYW5kIHByZXZlbnRzIGZsaWNrZXJcbiAgICAgICAgICAgICAgICAvLyBldmVuIGlmIHRoZSBiYWNrZW5kIHNlbmRzIHVzIGFuIHVwZGF0ZSB0aGF0IGFscmVhZHkgaW5jbHVkZXMgb3VyXG4gICAgICAgICAgICAgICAgLy8gdHJhbnNmb3JtLlxuICAgICAgICAgICAgICAgIGNvbnN0IG8gPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gd24odCwgci5nZXQodC5rZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSBlICYmIFxuICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBUaGUgYmFzZSBzdGF0ZSBzaG91bGQgb25seSBiZSBhcHBsaWVkIGlmIHRoZXJlJ3Mgc29tZVxuICAgICAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBkb2N1bWVudCB0byBvdmVycmlkZSwgc28gdXNlIGEgUHJlY29uZGl0aW9uIG9mXG4gICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0cz10cnVlXG4gICAgICAgICAgICAgICAgICAgIG8ucHVzaChuZXcgcG4odC5rZXksIGUsIFp0KGUudmFsdWUubWFwVmFsdWUpLCBobi5leGlzdHMoITApKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuLkZzLmFkZE11dGF0aW9uQmF0Y2godCwgcywgbywgZSk7XG4gICAgICAgICAgICB9KSkpKS50aGVuKCh0ID0+ICh0LmFwcGx5VG9Mb2NhbERvY3VtZW50U2V0KHIpLCB7XG4gICAgICAgICAgICAgICAgYmF0Y2hJZDogdC5iYXRjaElkLFxuICAgICAgICAgICAgICAgIGNoYW5nZXM6IHJcbiAgICAgICAgICAgIH0pKSk7XG4gICAgICAgIH0ocy5sb2NhbFN0b3JlLCBlKTtcbiAgICAgICAgcy5zaGFyZWRDbGllbnRTdGF0ZS5hZGRQZW5kaW5nTXV0YXRpb24odC5iYXRjaElkKSwgZnVuY3Rpb24odCwgZSwgbikge1xuICAgICAgICAgICAgbGV0IHMgPSB0LnN1W3QuY3VycmVudFVzZXIudG9LZXkoKV07XG4gICAgICAgICAgICBzIHx8IChzID0gbmV3IENuKHJ0KSk7XG4gICAgICAgICAgICBzID0gcy5pbnNlcnQoZSwgbiksIHQuc3VbdC5jdXJyZW50VXNlci50b0tleSgpXSA9IHM7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gKiBSZXNvbHZlcyBvciByZWplY3RzIHRoZSB1c2VyIGNhbGxiYWNrIGZvciB0aGUgZ2l2ZW4gYmF0Y2ggYW5kIHRoZW4gZGlzY2FyZHNcbiAqIGl0LlxuICovIChzLCB0LmJhdGNoSWQsIG4pLCBhd2FpdCBpdShzLCB0LmNoYW5nZXMpLCBhd2FpdCByYShzLnJlbW90ZVN0b3JlKTtcbiAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgIC8vIElmIHdlIGNhbid0IHBlcnNpc3QgdGhlIG11dGF0aW9uLCB3ZSByZWplY3QgdGhlIHVzZXIgY2FsbGJhY2sgYW5kXG4gICAgICAgIC8vIGRvbid0IHNlbmQgdGhlIG11dGF0aW9uLiBUaGUgdXNlciBjYW4gdGhlbiByZXRyeSB0aGUgd3JpdGUuXG4gICAgICAgIGNvbnN0IGUgPSBwYSh0LCBcIkZhaWxlZCB0byBwZXJzaXN0IHdyaXRlXCIpO1xuICAgICAgICBuLnJlamVjdChlKTtcbiAgICB9XG59XG5cbi8qKlxuICogQXBwbGllcyBvbmUgcmVtb3RlIGV2ZW50IHRvIHRoZSBzeW5jIGVuZ2luZSwgbm90aWZ5aW5nIGFueSB2aWV3cyBvZiB0aGVcbiAqIGNoYW5nZXMsIGFuZCByZWxlYXNpbmcgYW55IHBlbmRpbmcgbXV0YXRpb24gYmF0Y2hlcyB0aGF0IHdvdWxkIGJlY29tZVxuICogdmlzaWJsZSBiZWNhdXNlIG9mIHRoZSBzbmFwc2hvdCB2ZXJzaW9uIHRoZSByZW1vdGUgZXZlbnQgY29udGFpbnMuXG4gKi8gYXN5bmMgZnVuY3Rpb24gUWEodCwgZSkge1xuICAgIGNvbnN0IG4gPSBLKHQpO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHQgPSBhd2FpdCBKcihuLmxvY2FsU3RvcmUsIGUpO1xuICAgICAgICAvLyBVcGRhdGUgYHJlY2VpdmVkRG9jdW1lbnRgIGFzIGFwcHJvcHJpYXRlIGZvciBhbnkgbGltYm8gdGFyZ2V0cy5cbiAgICAgICAgICAgICAgICBlLnRhcmdldENoYW5nZXMuZm9yRWFjaCgoKHQsIGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBuLmV1LmdldChlKTtcbiAgICAgICAgICAgIHMgJiYgKFxuICAgICAgICAgICAgLy8gU2luY2UgdGhpcyBpcyBhIGxpbWJvIHJlc29sdXRpb24gbG9va3VwLCBpdCdzIGZvciBhIHNpbmdsZSBkb2N1bWVudFxuICAgICAgICAgICAgLy8gYW5kIGl0IGNvdWxkIGJlIGFkZGVkLCBtb2RpZmllZCwgb3IgcmVtb3ZlZCwgYnV0IG5vdCBhIGNvbWJpbmF0aW9uLlxuICAgICAgICAgICAgcSh0LmFkZGVkRG9jdW1lbnRzLnNpemUgKyB0Lm1vZGlmaWVkRG9jdW1lbnRzLnNpemUgKyB0LnJlbW92ZWREb2N1bWVudHMuc2l6ZSA8PSAxKSwgXG4gICAgICAgICAgICB0LmFkZGVkRG9jdW1lbnRzLnNpemUgPiAwID8gcy5IYSA9ICEwIDogdC5tb2RpZmllZERvY3VtZW50cy5zaXplID4gMCA/IHEocy5IYSkgOiB0LnJlbW92ZWREb2N1bWVudHMuc2l6ZSA+IDAgJiYgKHEocy5IYSksIFxuICAgICAgICAgICAgcy5IYSA9ICExKSk7XG4gICAgICAgIH0pKSwgYXdhaXQgaXUobiwgdCwgZSk7XG4gICAgfSBjYXRjaCAodCkge1xuICAgICAgICBhd2FpdCBUcih0KTtcbiAgICB9XG59XG5cbi8qKlxuICogQXBwbGllcyBhbiBPbmxpbmVTdGF0ZSBjaGFuZ2UgdG8gdGhlIHN5bmMgZW5naW5lIGFuZCBub3RpZmllcyBhbnkgdmlld3Mgb2ZcbiAqIHRoZSBjaGFuZ2UuXG4gKi8gZnVuY3Rpb24gamEodCwgZSwgbikge1xuICAgIGNvbnN0IHMgPSBLKHQpO1xuICAgIC8vIElmIHdlIGFyZSB0aGUgc2Vjb25kYXJ5IGNsaWVudCwgd2UgZXhwbGljaXRseSBpZ25vcmUgdGhlIHJlbW90ZSBzdG9yZSdzXG4gICAgLy8gb25saW5lIHN0YXRlICh0aGUgbG9jYWwgY2xpZW50IG1heSBnbyBvZmZsaW5lLCBldmVuIHRob3VnaCB0aGUgcHJpbWFyeVxuICAgIC8vIHRhYiByZW1haW5zIG9ubGluZSkgYW5kIG9ubHkgYXBwbHkgdGhlIHByaW1hcnkgdGFiJ3Mgb25saW5lIHN0YXRlIGZyb21cbiAgICAvLyBTaGFyZWRDbGllbnRTdGF0ZS5cbiAgICAgICAgaWYgKHMuaXNQcmltYXJ5Q2xpZW50ICYmIDAgLyogUmVtb3RlU3RvcmUgKi8gPT09IG4gfHwgIXMuaXNQcmltYXJ5Q2xpZW50ICYmIDEgLyogU2hhcmVkQ2xpZW50U3RhdGUgKi8gPT09IG4pIHtcbiAgICAgICAgY29uc3QgdCA9IFtdO1xuICAgICAgICBzLllhLmZvckVhY2goKChuLCBzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpID0gcy52aWV3LlRhKGUpO1xuICAgICAgICAgICAgaS5zbmFwc2hvdCAmJiB0LnB1c2goaS5zbmFwc2hvdCk7XG4gICAgICAgIH0pKSwgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IEsodCk7XG4gICAgICAgICAgICBuLm9ubGluZVN0YXRlID0gZTtcbiAgICAgICAgICAgIGxldCBzID0gITE7XG4gICAgICAgICAgICBuLnF1ZXJpZXMuZm9yRWFjaCgoKHQsIG4pID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2Ygbi5saXN0ZW5lcnMpIFxuICAgICAgICAgICAgICAgIC8vIFJ1biBnbG9iYWwgc25hcHNob3QgbGlzdGVuZXJzIGlmIGEgY29uc2lzdGVudCBzbmFwc2hvdCBoYXMgYmVlbiBlbWl0dGVkLlxuICAgICAgICAgICAgICAgIHQuVGEoZSkgJiYgKHMgPSAhMCk7XG4gICAgICAgICAgICB9KSksIHMgJiYgU2Eobik7XG4gICAgICAgIH0ocy5ldmVudE1hbmFnZXIsIGUpLCB0Lmxlbmd0aCAmJiBzLkphLktvKHQpLCBzLm9ubGluZVN0YXRlID0gZSwgcy5pc1ByaW1hcnlDbGllbnQgJiYgcy5zaGFyZWRDbGllbnRTdGF0ZS5zZXRPbmxpbmVTdGF0ZShlKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmVqZWN0cyB0aGUgbGlzdGVuIGZvciB0aGUgZ2l2ZW4gdGFyZ2V0SUQuIFRoaXMgY2FuIGJlIHRyaWdnZXJlZCBieSB0aGVcbiAqIGJhY2tlbmQgZm9yIGFueSBhY3RpdmUgdGFyZ2V0LlxuICpcbiAqIEBwYXJhbSBzeW5jRW5naW5lIC0gVGhlIHN5bmMgZW5naW5lIGltcGxlbWVudGF0aW9uLlxuICogQHBhcmFtIHRhcmdldElkIC0gVGhlIHRhcmdldElEIGNvcnJlc3BvbmRzIHRvIG9uZSBwcmV2aW91c2x5IGluaXRpYXRlZCBieSB0aGVcbiAqIHVzZXIgYXMgcGFydCBvZiBUYXJnZXREYXRhIHBhc3NlZCB0byBsaXN0ZW4oKSBvbiBSZW1vdGVTdG9yZS5cbiAqIEBwYXJhbSBlcnIgLSBBIGRlc2NyaXB0aW9uIG9mIHRoZSBjb25kaXRpb24gdGhhdCBoYXMgZm9yY2VkIHRoZSByZWplY3Rpb24uXG4gKiBOZWFybHkgYWx3YXlzIHRoaXMgd2lsbCBiZSBhbiBpbmRpY2F0aW9uIHRoYXQgdGhlIHVzZXIgaXMgbm8gbG9uZ2VyXG4gKiBhdXRob3JpemVkIHRvIHNlZSB0aGUgZGF0YSBtYXRjaGluZyB0aGUgdGFyZ2V0LlxuICovIGFzeW5jIGZ1bmN0aW9uIFdhKHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gSyh0KTtcbiAgICAvLyBQT1JUSU5HIE5PVEU6IE11bHRpLXRhYiBvbmx5LlxuICAgICAgICBzLnNoYXJlZENsaWVudFN0YXRlLnVwZGF0ZVF1ZXJ5U3RhdGUoZSwgXCJyZWplY3RlZFwiLCBuKTtcbiAgICBjb25zdCBpID0gcy5ldS5nZXQoZSksIHIgPSBpICYmIGkua2V5O1xuICAgIGlmIChyKSB7XG4gICAgICAgIC8vIFRPRE8oa2xpbXQpOiBXZSByZWFsbHkgb25seSBzaG91bGQgZG8gdGhlIGZvbGxvd2luZyBvbiBwZXJtaXNzaW9uXG4gICAgICAgIC8vIGRlbmllZCBlcnJvcnMsIGJ1dCB3ZSBkb24ndCBoYXZlIHRoZSBjYXVzZSBjb2RlIGhlcmUuXG4gICAgICAgIC8vIEl0J3MgYSBsaW1ibyBkb2MuIENyZWF0ZSBhIHN5bnRoZXRpYyBldmVudCBzYXlpbmcgaXQgd2FzIGRlbGV0ZWQuXG4gICAgICAgIC8vIFRoaXMgaXMga2luZCBvZiBhIGhhY2suIElkZWFsbHksIHdlIHdvdWxkIGhhdmUgYSBtZXRob2QgaW4gdGhlIGxvY2FsXG4gICAgICAgIC8vIHN0b3JlIHRvIHB1cmdlIGEgZG9jdW1lbnQuIEhvd2V2ZXIsIGl0IHdvdWxkIGJlIHRyaWNreSB0byBrZWVwIGFsbCBvZlxuICAgICAgICAvLyB0aGUgbG9jYWwgc3RvcmUncyBpbnZhcmlhbnRzIHdpdGggYW5vdGhlciBtZXRob2QuXG4gICAgICAgIGxldCB0ID0gbmV3IENuKHh0LmNvbXBhcmF0b3IpO1xuICAgICAgICAvLyBUT0RPKGIvMjE3MTg5MjE2KTogVGhpcyBsaW1ibyBkb2N1bWVudCBzaG91bGQgaWRlYWxseSBoYXZlIGEgcmVhZCB0aW1lLFxuICAgICAgICAvLyBzbyB0aGF0IGl0IGlzIHBpY2tlZCB1cCBieSBhbnkgcmVhZC10aW1lIGJhc2VkIHNjYW5zLiBUaGUgYmFja2VuZCxcbiAgICAgICAgLy8gaG93ZXZlciwgZG9lcyBub3Qgc2VuZCBhIHJlYWQgdGltZSBmb3IgdGFyZ2V0IHJlbW92YWxzLlxuICAgICAgICAgICAgICAgIHQgPSB0Lmluc2VydChyLCB0ZS5uZXdOb0RvY3VtZW50KHIsIGN0Lm1pbigpKSk7XG4gICAgICAgIGNvbnN0IG4gPSBHbigpLmFkZChyKSwgaSA9IG5ldyBXbihjdC5taW4oKSwgXG4gICAgICAgIC8qIHRhcmdldENoYW5nZXM9ICovIG5ldyBNYXAsIFxuICAgICAgICAvKiB0YXJnZXRNaXNtYXRjaGVzPSAqLyBuZXcga24ocnQpLCB0LCBuKTtcbiAgICAgICAgYXdhaXQgUWEocywgaSksIFxuICAgICAgICAvLyBTaW5jZSB0aGlzIHF1ZXJ5IGZhaWxlZCwgd2Ugd29uJ3Qgd2FudCB0byBtYW51YWxseSB1bmxpc3RlbiB0byBpdC5cbiAgICAgICAgLy8gV2Ugb25seSByZW1vdmUgaXQgZnJvbSBib29ra2VlcGluZyBhZnRlciB3ZSBzdWNjZXNzZnVsbHkgYXBwbGllZCB0aGVcbiAgICAgICAgLy8gUmVtb3RlRXZlbnQuIElmIGBhcHBseVJlbW90ZUV2ZW50KClgIHRocm93cywgd2Ugd2FudCB0byByZS1saXN0ZW4gdG9cbiAgICAgICAgLy8gdGhpcyBxdWVyeSB3aGVuIHRoZSBSZW1vdGVTdG9yZSByZXN0YXJ0cyB0aGUgV2F0Y2ggc3RyZWFtLCB3aGljaCBzaG91bGRcbiAgICAgICAgLy8gcmUtdHJpZ2dlciB0aGUgdGFyZ2V0IGZhaWx1cmUuXG4gICAgICAgIHMudHUgPSBzLnR1LnJlbW92ZShyKSwgcy5ldS5kZWxldGUoZSksIHN1KHMpO1xuICAgIH0gZWxzZSBhd2FpdCB0byhzLmxvY2FsU3RvcmUsIGUsIFxuICAgIC8qIGtlZXBQZXJzaXN0ZWRUYXJnZXREYXRhICovICExKS50aGVuKCgoKSA9PiBaYShzLCBlLCBuKSkpLmNhdGNoKFRyKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gemEodCwgZSkge1xuICAgIGNvbnN0IG4gPSBLKHQpLCBzID0gZS5iYXRjaC5iYXRjaElkO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHQgPSBhd2FpdCB6cihuLmxvY2FsU3RvcmUsIGUpO1xuICAgICAgICAvLyBUaGUgbG9jYWwgc3RvcmUgbWF5IG9yIG1heSBub3QgYmUgYWJsZSB0byBhcHBseSB0aGUgd3JpdGUgcmVzdWx0IGFuZFxuICAgICAgICAvLyByYWlzZSBldmVudHMgaW1tZWRpYXRlbHkgKGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSB3YXRjaGVyIGlzIGNhdWdodFxuICAgICAgICAvLyB1cCksIHNvIHdlIHJhaXNlIHVzZXIgY2FsbGJhY2tzIGZpcnN0IHNvIHRoYXQgdGhleSBjb25zaXN0ZW50bHkgaGFwcGVuXG4gICAgICAgIC8vIGJlZm9yZSBsaXN0ZW4gZXZlbnRzLlxuICAgICAgICAgICAgICAgIFhhKG4sIHMsIC8qZXJyb3I9Ki8gbnVsbCksIFlhKG4sIHMpLCBuLnNoYXJlZENsaWVudFN0YXRlLnVwZGF0ZU11dGF0aW9uU3RhdGUocywgXCJhY2tub3dsZWRnZWRcIiksIFxuICAgICAgICBhd2FpdCBpdShuLCB0KTtcbiAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgIGF3YWl0IFRyKHQpO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gSGEodCwgZSwgbikge1xuICAgIGNvbnN0IHMgPSBLKHQpO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHQgPSBhd2FpdCBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gSyh0KTtcbiAgICAgICAgICAgIHJldHVybiBuLnBlcnNpc3RlbmNlLnJ1blRyYW5zYWN0aW9uKFwiUmVqZWN0IGJhdGNoXCIsIFwicmVhZHdyaXRlLXByaW1hcnlcIiwgKHQgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBzO1xuICAgICAgICAgICAgICAgIHJldHVybiBuLkZzLmxvb2t1cE11dGF0aW9uQmF0Y2godCwgZSkubmV4dCgoZSA9PiAocShudWxsICE9PSBlKSwgcyA9IGUua2V5cygpLCBuLkZzLnJlbW92ZU11dGF0aW9uQmF0Y2godCwgZSkpKSkubmV4dCgoKCkgPT4gbi5Gcy5wZXJmb3JtQ29uc2lzdGVuY3lDaGVjayh0KSkpLm5leHQoKCgpID0+IG4udWkuVXModCwgcykpKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAqIFJldHVybnMgdGhlIGxhcmdlc3QgKGxhdGVzdCkgYmF0Y2ggaWQgaW4gbXV0YXRpb24gcXVldWUgdGhhdCBpcyBwZW5kaW5nXG4gKiBzZXJ2ZXIgcmVzcG9uc2UuXG4gKlxuICogUmV0dXJucyBgQkFUQ0hJRF9VTktOT1dOYCBpZiB0aGUgcXVldWUgaXMgZW1wdHkuXG4gKi8gKHMubG9jYWxTdG9yZSwgZSk7XG4gICAgICAgIC8vIFRoZSBsb2NhbCBzdG9yZSBtYXkgb3IgbWF5IG5vdCBiZSBhYmxlIHRvIGFwcGx5IHRoZSB3cml0ZSByZXN1bHQgYW5kXG4gICAgICAgIC8vIHJhaXNlIGV2ZW50cyBpbW1lZGlhdGVseSAoZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHdhdGNoZXIgaXMgY2F1Z2h0IHVwKSxcbiAgICAgICAgLy8gc28gd2UgcmFpc2UgdXNlciBjYWxsYmFja3MgZmlyc3Qgc28gdGhhdCB0aGV5IGNvbnNpc3RlbnRseSBoYXBwZW4gYmVmb3JlXG4gICAgICAgIC8vIGxpc3RlbiBldmVudHMuXG4gICAgICAgICAgICAgICAgWGEocywgZSwgbiksIFlhKHMsIGUpLCBzLnNoYXJlZENsaWVudFN0YXRlLnVwZGF0ZU11dGF0aW9uU3RhdGUoZSwgXCJyZWplY3RlZFwiLCBuKSwgXG4gICAgICAgIGF3YWl0IGl1KHMsIHQpO1xuICAgIH0gY2F0Y2ggKG4pIHtcbiAgICAgICAgYXdhaXQgVHIobik7XG4gICAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhIHVzZXIgY2FsbGJhY2sgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBwZW5kaW5nIG11dGF0aW9ucyBhdCB0aGUgbW9tZW50IG9mIGNhbGxpbmdcbiAqIGFyZSBhY2tub3dsZWRnZWQgLlxuICovIGFzeW5jIGZ1bmN0aW9uIEphKHQsIGUpIHtcbiAgICBjb25zdCBuID0gSyh0KTtcbiAgICBYbyhuLnJlbW90ZVN0b3JlKSB8fCBPKFwiU3luY0VuZ2luZVwiLCBcIlRoZSBuZXR3b3JrIGlzIGRpc2FibGVkLiBUaGUgdGFzayByZXR1cm5lZCBieSAnYXdhaXRQZW5kaW5nV3JpdGVzKCknIHdpbGwgbm90IGNvbXBsZXRlIHVudGlsIHRoZSBuZXR3b3JrIGlzIGVuYWJsZWQuXCIpO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHQgPSBhd2FpdCBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBjb25zdCBlID0gSyh0KTtcbiAgICAgICAgICAgIHJldHVybiBlLnBlcnNpc3RlbmNlLnJ1blRyYW5zYWN0aW9uKFwiR2V0IGhpZ2hlc3QgdW5hY2tub3dsZWRnZWQgYmF0Y2ggaWRcIiwgXCJyZWFkb25seVwiLCAodCA9PiBlLkZzLmdldEhpZ2hlc3RVbmFja25vd2xlZGdlZEJhdGNoSWQodCkpKTtcbiAgICAgICAgfShuLmxvY2FsU3RvcmUpO1xuICAgICAgICBpZiAoLTEgPT09IHQpIFxuICAgICAgICAvLyBUcmlnZ2VyIHRoZSBjYWxsYmFjayByaWdodCBhd2F5IGlmIHRoZXJlIGlzIG5vIHBlbmRpbmcgd3JpdGVzIGF0IHRoZSBtb21lbnQuXG4gICAgICAgIHJldHVybiB2b2lkIGUucmVzb2x2ZSgpO1xuICAgICAgICBjb25zdCBzID0gbi5pdS5nZXQodCkgfHwgW107XG4gICAgICAgIHMucHVzaChlKSwgbi5pdS5zZXQodCwgcyk7XG4gICAgfSBjYXRjaCAodCkge1xuICAgICAgICBjb25zdCBuID0gcGEodCwgXCJJbml0aWFsaXphdGlvbiBvZiB3YWl0Rm9yUGVuZGluZ1dyaXRlcygpIG9wZXJhdGlvbiBmYWlsZWRcIik7XG4gICAgICAgIGUucmVqZWN0KG4pO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUcmlnZ2VycyB0aGUgY2FsbGJhY2tzIHRoYXQgYXJlIHdhaXRpbmcgZm9yIHRoaXMgYmF0Y2ggaWQgdG8gZ2V0IGFja25vd2xlZGdlZCBieSBzZXJ2ZXIsXG4gKiBpZiB0aGVyZSBhcmUgYW55LlxuICovIGZ1bmN0aW9uIFlhKHQsIGUpIHtcbiAgICAodC5pdS5nZXQoZSkgfHwgW10pLmZvckVhY2goKHQgPT4ge1xuICAgICAgICB0LnJlc29sdmUoKTtcbiAgICB9KSksIHQuaXUuZGVsZXRlKGUpO1xufVxuXG4vKiogUmVqZWN0IGFsbCBvdXRzdGFuZGluZyBjYWxsYmFja3Mgd2FpdGluZyBmb3IgcGVuZGluZyB3cml0ZXMgdG8gY29tcGxldGUuICovIGZ1bmN0aW9uIFhhKHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gSyh0KTtcbiAgICBsZXQgaSA9IHMuc3Vbcy5jdXJyZW50VXNlci50b0tleSgpXTtcbiAgICAvLyBOT1RFOiBNdXRhdGlvbnMgcmVzdG9yZWQgZnJvbSBwZXJzaXN0ZW5jZSB3b24ndCBoYXZlIGNhbGxiYWNrcywgc28gaXQnc1xuICAgIC8vIG9rYXkgZm9yIHRoZXJlIHRvIGJlIG5vIGNhbGxiYWNrIGZvciB0aGlzIElELlxuICAgICAgICBpZiAoaSkge1xuICAgICAgICBjb25zdCB0ID0gaS5nZXQoZSk7XG4gICAgICAgIHQgJiYgKG4gPyB0LnJlamVjdChuKSA6IHQucmVzb2x2ZSgpLCBpID0gaS5yZW1vdmUoZSkpLCBzLnN1W3MuY3VycmVudFVzZXIudG9LZXkoKV0gPSBpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gWmEodCwgZSwgbiA9IG51bGwpIHtcbiAgICB0LnNoYXJlZENsaWVudFN0YXRlLnJlbW92ZUxvY2FsUXVlcnlUYXJnZXQoZSk7XG4gICAgZm9yIChjb25zdCBzIG9mIHQuWGEuZ2V0KGUpKSB0LllhLmRlbGV0ZShzKSwgbiAmJiB0LkphLnV1KHMsIG4pO1xuICAgIGlmICh0LlhhLmRlbGV0ZShlKSwgdC5pc1ByaW1hcnlDbGllbnQpIHtcbiAgICAgICAgdC5udS5SaShlKS5mb3JFYWNoKChlID0+IHtcbiAgICAgICAgICAgIHQubnUuY29udGFpbnNLZXkoZSkgfHwgXG4gICAgICAgICAgICAvLyBXZSByZW1vdmVkIHRoZSBsYXN0IHJlZmVyZW5jZSBmb3IgdGhpcyBrZXlcbiAgICAgICAgICAgIHR1KHQsIGUpO1xuICAgICAgICB9KSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB0dSh0LCBlKSB7XG4gICAgdC5aYS5kZWxldGUoZS5wYXRoLmNhbm9uaWNhbFN0cmluZygpKTtcbiAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHRhcmdldCBhbHJlYWR5IGdvdCByZW1vdmVkIGJlY2F1c2UgdGhlIHF1ZXJ5IGZhaWxlZC4gSW4gdGhhdCBjYXNlLFxuICAgIC8vIHRoZSBrZXkgd29uJ3QgZXhpc3QgaW4gYGxpbWJvVGFyZ2V0c0J5S2V5YC4gT25seSBkbyB0aGUgY2xlYW51cCBpZiB3ZSBzdGlsbCBoYXZlIHRoZSB0YXJnZXQuXG4gICAgY29uc3QgbiA9IHQudHUuZ2V0KGUpO1xuICAgIG51bGwgIT09IG4gJiYgKFdvKHQucmVtb3RlU3RvcmUsIG4pLCB0LnR1ID0gdC50dS5yZW1vdmUoZSksIHQuZXUuZGVsZXRlKG4pLCBzdSh0KSk7XG59XG5cbmZ1bmN0aW9uIGV1KHQsIGUsIG4pIHtcbiAgICBmb3IgKGNvbnN0IHMgb2YgbikgaWYgKHMgaW5zdGFuY2VvZiBNYSkgdC5udS5hZGRSZWZlcmVuY2Uocy5rZXksIGUpLCBudSh0LCBzKTsgZWxzZSBpZiAocyBpbnN0YW5jZW9mIE9hKSB7XG4gICAgICAgIE8oXCJTeW5jRW5naW5lXCIsIFwiRG9jdW1lbnQgbm8gbG9uZ2VyIGluIGxpbWJvOiBcIiArIHMua2V5KSwgdC5udS5yZW1vdmVSZWZlcmVuY2Uocy5rZXksIGUpO1xuICAgICAgICB0Lm51LmNvbnRhaW5zS2V5KHMua2V5KSB8fCBcbiAgICAgICAgLy8gV2UgcmVtb3ZlZCB0aGUgbGFzdCByZWZlcmVuY2UgZm9yIHRoaXMga2V5XG4gICAgICAgIHR1KHQsIHMua2V5KTtcbiAgICB9IGVsc2UgTCgpO1xufVxuXG5mdW5jdGlvbiBudSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IGUua2V5LCBzID0gbi5wYXRoLmNhbm9uaWNhbFN0cmluZygpO1xuICAgIHQudHUuZ2V0KG4pIHx8IHQuWmEuaGFzKHMpIHx8IChPKFwiU3luY0VuZ2luZVwiLCBcIk5ldyBkb2N1bWVudCBpbiBsaW1ibzogXCIgKyBuKSwgdC5aYS5hZGQocyksIFxuICAgIHN1KHQpKTtcbn1cblxuLyoqXG4gKiBTdGFydHMgbGlzdGVucyBmb3IgZG9jdW1lbnRzIGluIGxpbWJvIHRoYXQgYXJlIGVucXVldWVkIGZvciByZXNvbHV0aW9uLFxuICogc3ViamVjdCB0byBhIG1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnQgcmVzb2x1dGlvbnMuXG4gKlxuICogV2l0aG91dCBib3VuZGluZyB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgcmVzb2x1dGlvbnMsIHRoZSBzZXJ2ZXIgY2FuIGZhaWxcbiAqIHdpdGggXCJyZXNvdXJjZSBleGhhdXN0ZWRcIiBlcnJvcnMgd2hpY2ggY2FuIGxlYWQgdG8gcGF0aG9sb2dpY2FsIGNsaWVudFxuICogYmVoYXZpb3IgYXMgc2VlbiBpbiBodHRwczovL2dpdGh1Yi5jb20vZmlyZWJhc2UvZmlyZWJhc2UtanMtc2RrL2lzc3Vlcy8yNjgzLlxuICovIGZ1bmN0aW9uIHN1KHQpIHtcbiAgICBmb3IgKDt0LlphLnNpemUgPiAwICYmIHQudHUuc2l6ZSA8IHQubWF4Q29uY3VycmVudExpbWJvUmVzb2x1dGlvbnM7ICkge1xuICAgICAgICBjb25zdCBlID0gdC5aYS52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICAgIHQuWmEuZGVsZXRlKGUpO1xuICAgICAgICBjb25zdCBuID0gbmV3IHh0KF90LmZyb21TdHJpbmcoZSkpLCBzID0gdC5ydS5uZXh0KCk7XG4gICAgICAgIHQuZXUuc2V0KHMsIG5ldyBCYShuKSksIHQudHUgPSB0LnR1Lmluc2VydChuLCBzKSwgam8odC5yZW1vdGVTdG9yZSwgbmV3IEFpKCRlKERlKG4ucGF0aCkpLCBzLCAyIC8qIExpbWJvUmVzb2x1dGlvbiAqLyAsIG50LkEpKTtcbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGl1KHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gSyh0KSwgaSA9IFtdLCByID0gW10sIG8gPSBbXTtcbiAgICBzLllhLmlzRW1wdHkoKSB8fCAocy5ZYS5mb3JFYWNoKCgodCwgYSkgPT4ge1xuICAgICAgICBvLnB1c2gocy5hdShhLCBlLCBuKS50aGVuKCh0ID0+IHtcbiAgICAgICAgICAgIGlmICh0KSB7XG4gICAgICAgICAgICAgICAgcy5pc1ByaW1hcnlDbGllbnQgJiYgcy5zaGFyZWRDbGllbnRTdGF0ZS51cGRhdGVRdWVyeVN0YXRlKGEudGFyZ2V0SWQsIHQuZnJvbUNhY2hlID8gXCJub3QtY3VycmVudFwiIDogXCJjdXJyZW50XCIpLCBcbiAgICAgICAgICAgICAgICBpLnB1c2godCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IEtyLkpzKGEudGFyZ2V0SWQsIHQpO1xuICAgICAgICAgICAgICAgIHIucHVzaChlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpKTtcbiAgICB9KSksIGF3YWl0IFByb21pc2UuYWxsKG8pLCBzLkphLktvKGkpLCBhd2FpdCBhc3luYyBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBLKHQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgbi5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIm5vdGlmeUxvY2FsVmlld0NoYW5nZXNcIiwgXCJyZWFkd3JpdGVcIiwgKHQgPT4gdWkuZm9yRWFjaChlLCAoZSA9PiB1aS5mb3JFYWNoKGUuenMsIChzID0+IG4ucGVyc2lzdGVuY2UucmVmZXJlbmNlRGVsZWdhdGUuYWRkUmVmZXJlbmNlKHQsIGUudGFyZ2V0SWQsIHMpKSkubmV4dCgoKCkgPT4gdWkuZm9yRWFjaChlLkhzLCAocyA9PiBuLnBlcnNpc3RlbmNlLnJlZmVyZW5jZURlbGVnYXRlLnJlbW92ZVJlZmVyZW5jZSh0LCBlLnRhcmdldElkLCBzKSkpKSkpKSkpO1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICBpZiAoIWRpKHQpKSB0aHJvdyB0O1xuICAgICAgICAgICAgLy8gSWYgYG5vdGlmeUxvY2FsVmlld0NoYW5nZXNgIGZhaWxzLCB3ZSBkaWQgbm90IGFkdmFuY2UgdGhlIHNlcXVlbmNlXG4gICAgICAgICAgICAvLyBudW1iZXIgZm9yIHRoZSBkb2N1bWVudHMgdGhhdCB3ZXJlIGluY2x1ZGVkIGluIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgICAgICAgICAvLyBUaGlzIG1pZ2h0IHRyaWdnZXIgdGhlbSB0byBiZSBkZWxldGVkIGVhcmxpZXIgdGhhbiB0aGV5IG90aGVyd2lzZVxuICAgICAgICAgICAgLy8gd291bGQgaGF2ZSwgYnV0IGl0IHNob3VsZCBub3QgaW52YWxpZGF0ZSB0aGUgaW50ZWdyaXR5IG9mIHRoZSBkYXRhLlxuICAgICAgICAgICAgTyhcIkxvY2FsU3RvcmVcIiwgXCJGYWlsZWQgdG8gdXBkYXRlIHNlcXVlbmNlIG51bWJlcnM6IFwiICsgdCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB0IG9mIGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0LnRhcmdldElkO1xuICAgICAgICAgICAgaWYgKCF0LmZyb21DYWNoZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBuLnNpLmdldChlKSwgcyA9IHQuc25hcHNob3RWZXJzaW9uLCBpID0gdC53aXRoTGFzdExpbWJvRnJlZVNuYXBzaG90VmVyc2lvbihzKTtcbiAgICAgICAgICAgICAgICAvLyBBZHZhbmNlIHRoZSBsYXN0IGxpbWJvIGZyZWUgc25hcHNob3QgdmVyc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnNpID0gbi5zaS5pbnNlcnQoZSwgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KHMubG9jYWxTdG9yZSwgcikpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IEsodCk7XG4gICAgaWYgKCFuLmN1cnJlbnRVc2VyLmlzRXF1YWwoZSkpIHtcbiAgICAgICAgTyhcIlN5bmNFbmdpbmVcIiwgXCJVc2VyIGNoYW5nZS4gTmV3IHVzZXI6XCIsIGUudG9LZXkoKSk7XG4gICAgICAgIGNvbnN0IHQgPSBhd2FpdCBXcihuLmxvY2FsU3RvcmUsIGUpO1xuICAgICAgICBuLmN1cnJlbnRVc2VyID0gZSwgXG4gICAgICAgIC8vIEZhaWxzIHRhc2tzIHdhaXRpbmcgZm9yIHBlbmRpbmcgd3JpdGVzIHJlcXVlc3RlZCBieSBwcmV2aW91cyB1c2VyLlxuICAgICAgICBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICB0Lml1LmZvckVhY2goKHQgPT4ge1xuICAgICAgICAgICAgICAgIHQuZm9yRWFjaCgodCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHQucmVqZWN0KG5ldyBRKEcuQ0FOQ0VMTEVELCBlKSk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSkpLCB0Lml1LmNsZWFyKCk7XG4gICAgICAgIH0obiwgXCInd2FpdEZvclBlbmRpbmdXcml0ZXMnIHByb21pc2UgaXMgcmVqZWN0ZWQgZHVlIHRvIGEgdXNlciBjaGFuZ2UuXCIpLCBcbiAgICAgICAgLy8gVE9ETyhiLzExNDIyNjQxNyk6IENvbnNpZGVyIGNhbGxpbmcgdGhpcyBvbmx5IGluIHRoZSBwcmltYXJ5IHRhYi5cbiAgICAgICAgbi5zaGFyZWRDbGllbnRTdGF0ZS5oYW5kbGVVc2VyQ2hhbmdlKGUsIHQucmVtb3ZlZEJhdGNoSWRzLCB0LmFkZGVkQmF0Y2hJZHMpLCBhd2FpdCBpdShuLCB0LmNpKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG91KHQsIGUpIHtcbiAgICBjb25zdCBuID0gSyh0KSwgcyA9IG4uZXUuZ2V0KGUpO1xuICAgIGlmIChzICYmIHMuSGEpIHJldHVybiBHbigpLmFkZChzLmtleSk7XG4gICAge1xuICAgICAgICBsZXQgdCA9IEduKCk7XG4gICAgICAgIGNvbnN0IHMgPSBuLlhhLmdldChlKTtcbiAgICAgICAgaWYgKCFzKSByZXR1cm4gdDtcbiAgICAgICAgZm9yIChjb25zdCBlIG9mIHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBuLllhLmdldChlKTtcbiAgICAgICAgICAgIHQgPSB0LnVuaW9uV2l0aChzLnZpZXcuQmEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZWNvbmNpbGUgdGhlIGxpc3Qgb2Ygc3luY2VkIGRvY3VtZW50cyBpbiBhbiBleGlzdGluZyB2aWV3IHdpdGggdGhvc2VcbiAqIGZyb20gcGVyc2lzdGVuY2UuXG4gKi8gYXN5bmMgZnVuY3Rpb24gYXUodCwgZSkge1xuICAgIGNvbnN0IG4gPSBLKHQpLCBzID0gYXdhaXQgZW8obi5sb2NhbFN0b3JlLCBlLnF1ZXJ5LCBcbiAgICAvKiB1c2VQcmV2aW91c1Jlc3VsdHM9ICovICEwKSwgaSA9IGUudmlldy5XYShzKTtcbiAgICByZXR1cm4gbi5pc1ByaW1hcnlDbGllbnQgJiYgZXUobiwgZS50YXJnZXRJZCwgaS5RYSksIGk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIG5ld2x5IGNoYW5nZWQgZG9jdW1lbnRzIGZyb20gcmVtb3RlIGRvY3VtZW50IGNhY2hlIGFuZCByYWlzZXNcbiAqIHNuYXBzaG90cyBpZiBuZWVkZWQuXG4gKi9cbi8vIFBPUlRJTkcgTk9URTogTXVsdGktVGFiIG9ubHkuXG5hc3luYyBmdW5jdGlvbiB1dSh0KSB7XG4gICAgY29uc3QgZSA9IEsodCk7XG4gICAgcmV0dXJuIHNvKGUubG9jYWxTdG9yZSkudGhlbigodCA9PiBpdShlLCB0KSkpO1xufVxuXG4vKiogQXBwbGllcyBhIG11dGF0aW9uIHN0YXRlIHRvIGFuIGV4aXN0aW5nIGJhdGNoLiAgKi9cbi8vIFBPUlRJTkcgTk9URTogTXVsdGktVGFiIG9ubHkuXG5hc3luYyBmdW5jdGlvbiBjdSh0LCBlLCBuLCBzKSB7XG4gICAgY29uc3QgaSA9IEsodCksIHIgPSBhd2FpdCBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBLKHQpLCBzID0gSyhuLkZzKTtcbiAgICAgICAgcmV0dXJuIG4ucGVyc2lzdGVuY2UucnVuVHJhbnNhY3Rpb24oXCJMb29rdXAgbXV0YXRpb24gZG9jdW1lbnRzXCIsIFwicmVhZG9ubHlcIiwgKHQgPT4gcy5sbih0LCBlKS5uZXh0KChlID0+IGUgPyBuLnVpLlVzKHQsIGUpIDogdWkucmVzb2x2ZShudWxsKSkpKSk7XG4gICAgfVxuICAgIC8vIFBPUlRJTkcgTk9URTogTXVsdGktVGFiIG9ubHkuXG4gICAgKGkubG9jYWxTdG9yZSwgZSk7XG4gICAgbnVsbCAhPT0gciA/IChcInBlbmRpbmdcIiA9PT0gbiA/IFxuICAgIC8vIElmIHdlIGFyZSB0aGUgcHJpbWFyeSBjbGllbnQsIHdlIG5lZWQgdG8gc2VuZCB0aGlzIHdyaXRlIHRvIHRoZVxuICAgIC8vIGJhY2tlbmQuIFNlY29uZGFyeSBjbGllbnRzIHdpbGwgaWdub3JlIHRoZXNlIHdyaXRlcyBzaW5jZSB0aGVpciByZW1vdGVcbiAgICAvLyBjb25uZWN0aW9uIGlzIGRpc2FibGVkLlxuICAgIGF3YWl0IHJhKGkucmVtb3RlU3RvcmUpIDogXCJhY2tub3dsZWRnZWRcIiA9PT0gbiB8fCBcInJlamVjdGVkXCIgPT09IG4gPyAoXG4gICAgLy8gTk9URTogQm90aCB0aGVzZSBtZXRob2RzIGFyZSBuby1vcHMgZm9yIGJhdGNoZXMgdGhhdCBvcmlnaW5hdGVkIGZyb21cbiAgICAvLyBvdGhlciBjbGllbnRzLlxuICAgIFhhKGksIGUsIHMgfHwgbnVsbCksIFlhKGksIGUpLCBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIEsoSyh0KS5GcykuZG4oZSk7XG4gICAgfVxuICAgIC8vIFBPUlRJTkcgTk9URTogTXVsdGktVGFiIG9ubHkuXG4gICAgKGkubG9jYWxTdG9yZSwgZSkpIDogTCgpLCBhd2FpdCBpdShpLCByKSkgOiBcbiAgICAvLyBBIHRocm90dGxlZCB0YWIgbWF5IG5vdCBoYXZlIHNlZW4gdGhlIG11dGF0aW9uIGJlZm9yZSBpdCB3YXMgY29tcGxldGVkXG4gICAgLy8gYW5kIHJlbW92ZWQgZnJvbSB0aGUgbXV0YXRpb24gcXVldWUsIGluIHdoaWNoIGNhc2Ugd2Ugd29uJ3QgaGF2ZSBjYWNoZWRcbiAgICAvLyB0aGUgYWZmZWN0ZWQgZG9jdW1lbnRzLiBJbiB0aGlzIGNhc2Ugd2UgY2FuIHNhZmVseSBpZ25vcmUgdGhlIHVwZGF0ZVxuICAgIC8vIHNpbmNlIHRoYXQgbWVhbnMgd2UgZGlkbid0IGFwcGx5IHRoZSBtdXRhdGlvbiBsb2NhbGx5IGF0IGFsbCAoaWYgd2VcbiAgICAvLyBoYWQsIHdlIHdvdWxkIGhhdmUgY2FjaGVkIHRoZSBhZmZlY3RlZCBkb2N1bWVudHMpLCBhbmQgc28gd2Ugd2lsbCBqdXN0XG4gICAgLy8gc2VlIGFueSByZXN1bHRpbmcgZG9jdW1lbnQgY2hhbmdlcyB2aWEgbm9ybWFsIHJlbW90ZSBkb2N1bWVudCB1cGRhdGVzXG4gICAgLy8gYXMgYXBwbGljYWJsZS5cbiAgICBPKFwiU3luY0VuZ2luZVwiLCBcIkNhbm5vdCBhcHBseSBtdXRhdGlvbiBiYXRjaCB3aXRoIGlkOiBcIiArIGUpO1xufVxuXG4vKiogQXBwbGllcyBhIHF1ZXJ5IHRhcmdldCBjaGFuZ2UgZnJvbSBhIGRpZmZlcmVudCB0YWIuICovXG4vLyBQT1JUSU5HIE5PVEU6IE11bHRpLVRhYiBvbmx5LlxuYXN5bmMgZnVuY3Rpb24gaHUodCwgZSkge1xuICAgIGNvbnN0IG4gPSBLKHQpO1xuICAgIGlmIChtdShuKSwgZ3UobiksICEwID09PSBlICYmICEwICE9PSBuLm91KSB7XG4gICAgICAgIC8vIFNlY29uZGFyeSB0YWJzIG9ubHkgbWFpbnRhaW4gVmlld3MgZm9yIHRoZWlyIGxvY2FsIGxpc3RlbmVycyBhbmQgdGhlXG4gICAgICAgIC8vIFZpZXdzIGludGVybmFsIHN0YXRlIG1heSBub3QgYmUgMTAwJSBwb3B1bGF0ZWQgKGluIHBhcnRpY3VsYXJcbiAgICAgICAgLy8gc2Vjb25kYXJ5IHRhYnMgZG9uJ3QgdHJhY2sgc3luY2VkRG9jdW1lbnRzLCB0aGUgc2V0IG9mIGRvY3VtZW50cyB0aGVcbiAgICAgICAgLy8gc2VydmVyIGNvbnNpZGVycyB0byBiZSBpbiB0aGUgdGFyZ2V0KS4gU28gd2hlbiBhIHNlY29uZGFyeSBiZWNvbWVzXG4gICAgICAgIC8vIHByaW1hcnksIHdlIG5lZWQgdG8gbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBhbGwgdmlld3MgZm9yIGFsbCB0YXJnZXRzXG4gICAgICAgIC8vIG1hdGNoIHRoZSBzdGF0ZSBvbiBkaXNrLlxuICAgICAgICBjb25zdCB0ID0gbi5zaGFyZWRDbGllbnRTdGF0ZS5nZXRBbGxBY3RpdmVRdWVyeVRhcmdldHMoKSwgZSA9IGF3YWl0IGx1KG4sIHQudG9BcnJheSgpKTtcbiAgICAgICAgbi5vdSA9ICEwLCBhd2FpdCB3YShuLnJlbW90ZVN0b3JlLCAhMCk7XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiBlKSBqbyhuLnJlbW90ZVN0b3JlLCB0KTtcbiAgICB9IGVsc2UgaWYgKCExID09PSBlICYmICExICE9PSBuLm91KSB7XG4gICAgICAgIGNvbnN0IHQgPSBbXTtcbiAgICAgICAgbGV0IGUgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgbi5YYS5mb3JFYWNoKCgocywgaSkgPT4ge1xuICAgICAgICAgICAgbi5zaGFyZWRDbGllbnRTdGF0ZS5pc0xvY2FsUXVlcnlUYXJnZXQoaSkgPyB0LnB1c2goaSkgOiBlID0gZS50aGVuKCgoKSA9PiAoWmEobiwgaSksIFxuICAgICAgICAgICAgdG8obi5sb2NhbFN0b3JlLCBpLCBcbiAgICAgICAgICAgIC8qa2VlcFBlcnNpc3RlZFRhcmdldERhdGE9Ki8gITApKSkpLCBXbyhuLnJlbW90ZVN0b3JlLCBpKTtcbiAgICAgICAgfSkpLCBhd2FpdCBlLCBhd2FpdCBsdShuLCB0KSwgXG4gICAgICAgIC8vIFBPUlRJTkcgTk9URTogTXVsdGktVGFiIG9ubHkuXG4gICAgICAgIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBLKHQpO1xuICAgICAgICAgICAgZS5ldS5mb3JFYWNoKCgodCwgbikgPT4ge1xuICAgICAgICAgICAgICAgIFdvKGUucmVtb3RlU3RvcmUsIG4pO1xuICAgICAgICAgICAgfSkpLCBlLm51LmJpKCksIGUuZXUgPSBuZXcgTWFwLCBlLnR1ID0gbmV3IENuKHh0LmNvbXBhcmF0b3IpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICogUmVjb25jaWxlIHRoZSBxdWVyeSB2aWV3cyBvZiB0aGUgcHJvdmlkZWQgcXVlcnkgdGFyZ2V0cyB3aXRoIHRoZSBzdGF0ZSBmcm9tXG4gKiBwZXJzaXN0ZW5jZS4gUmFpc2VzIHNuYXBzaG90cyBmb3IgYW55IGNoYW5nZXMgdGhhdCBhZmZlY3QgdGhlIGxvY2FsXG4gKiBjbGllbnQgYW5kIHJldHVybnMgdGhlIHVwZGF0ZWQgc3RhdGUgb2YgYWxsIHRhcmdldCdzIHF1ZXJ5IGRhdGEuXG4gKlxuICogQHBhcmFtIHN5bmNFbmdpbmUgLSBUaGUgc3luYyBlbmdpbmUgaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSB0YXJnZXRzIC0gdGhlIGxpc3Qgb2YgdGFyZ2V0cyB3aXRoIHZpZXdzIHRoYXQgbmVlZCB0byBiZSByZWNvbXB1dGVkXG4gKiBAcGFyYW0gdHJhbnNpdGlvblRvUHJpbWFyeSAtIGB0cnVlYCBpZmYgdGhlIHRhYiB0cmFuc2l0aW9ucyBmcm9tIGEgc2Vjb25kYXJ5XG4gKiB0YWIgdG8gYSBwcmltYXJ5IHRhYlxuICovXG4gICAgICAgIC8vIFBPUlRJTkcgTk9URTogTXVsdGktVGFiIG9ubHkuXG4gICAgICAgIChuKSwgbi5vdSA9ICExLCBhd2FpdCB3YShuLnJlbW90ZVN0b3JlLCAhMSk7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBsdSh0LCBlLCBuKSB7XG4gICAgY29uc3QgcyA9IEsodCksIGkgPSBbXSwgciA9IFtdO1xuICAgIGZvciAoY29uc3QgdCBvZiBlKSB7XG4gICAgICAgIGxldCBlO1xuICAgICAgICBjb25zdCBuID0gcy5YYS5nZXQodCk7XG4gICAgICAgIGlmIChuICYmIDAgIT09IG4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBGb3IgcXVlcmllcyB0aGF0IGhhdmUgYSBsb2NhbCBWaWV3LCB3ZSBmZXRjaCB0aGVpciBjdXJyZW50IHN0YXRlXG4gICAgICAgICAgICAvLyBmcm9tIExvY2FsU3RvcmUgKGFzIHRoZSByZXN1bWUgdG9rZW4gYW5kIHRoZSBzbmFwc2hvdCB2ZXJzaW9uXG4gICAgICAgICAgICAvLyBtaWdodCBoYXZlIGNoYW5nZWQpIGFuZCByZWNvbmNpbGUgdGhlaXIgdmlld3Mgd2l0aCB0aGUgcGVyc2lzdGVkXG4gICAgICAgICAgICAvLyBzdGF0ZSAodGhlIGxpc3Qgb2Ygc3luY2VkRG9jdW1lbnRzIG1heSBoYXZlIGdvdHRlbiBvdXQgb2Ygc3luYykuXG4gICAgICAgICAgICBlID0gYXdhaXQgWnIocy5sb2NhbFN0b3JlLCAkZShuWzBdKSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2Ygbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBzLllhLmdldCh0KSwgbiA9IGF3YWl0IGF1KHMsIGUpO1xuICAgICAgICAgICAgICAgIG4uc25hcHNob3QgJiYgci5wdXNoKG4uc25hcHNob3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRm9yIHF1ZXJpZXMgdGhhdCBuZXZlciBleGVjdXRlZCBvbiB0aGlzIGNsaWVudCwgd2UgbmVlZCB0b1xuICAgICAgICAgICAgLy8gYWxsb2NhdGUgdGhlIHRhcmdldCBpbiBMb2NhbFN0b3JlIGFuZCBpbml0aWFsaXplIGEgbmV3IFZpZXcuXG4gICAgICAgICAgICBjb25zdCBuID0gYXdhaXQgbm8ocy5sb2NhbFN0b3JlLCB0KTtcbiAgICAgICAgICAgIGUgPSBhd2FpdCBacihzLmxvY2FsU3RvcmUsIG4pLCBhd2FpdCBVYShzLCBmdShuKSwgdCwgXG4gICAgICAgICAgICAvKmN1cnJlbnQ9Ki8gITEpO1xuICAgICAgICB9XG4gICAgICAgIGkucHVzaChlKTtcbiAgICB9XG4gICAgcmV0dXJuIHMuSmEuS28ociksIGk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGBRdWVyeWAgb2JqZWN0IGZyb20gdGhlIHNwZWNpZmllZCBgVGFyZ2V0YC4gVGhlcmUgaXMgbm8gd2F5IHRvXG4gKiBvYnRhaW4gdGhlIG9yaWdpbmFsIGBRdWVyeWAsIHNvIHdlIHN5bnRoZXNpemUgYSBgUXVlcnlgIGZyb20gdGhlIGBUYXJnZXRgXG4gKiBvYmplY3QuXG4gKlxuICogVGhlIHN5bnRoZXNpemVkIHJlc3VsdCBtaWdodCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgYFF1ZXJ5YCwgYnV0XG4gKiBzaW5jZSB0aGUgc3ludGhlc2l6ZWQgYFF1ZXJ5YCBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlXG4gKiBvcmlnaW5hbCBvbmUgKG9ubHkgdGhlIHByZXNlbnRhdGlvbiBvZiByZXN1bHRzIG1pZ2h0IGRpZmZlciksIHRoZSBwb3RlbnRpYWxcbiAqIGRpZmZlcmVuY2Ugd2lsbCBub3QgY2F1c2UgaXNzdWVzLlxuICovXG4vLyBQT1JUSU5HIE5PVEU6IE11bHRpLVRhYiBvbmx5LlxuZnVuY3Rpb24gZnUodCkge1xuICAgIHJldHVybiBTZSh0LnBhdGgsIHQuY29sbGVjdGlvbkdyb3VwLCB0Lm9yZGVyQnksIHQuZmlsdGVycywgdC5saW1pdCwgXCJGXCIgLyogRmlyc3QgKi8gLCB0LnN0YXJ0QXQsIHQuZW5kQXQpO1xufVxuXG4vKiogUmV0dXJucyB0aGUgSURzIG9mIHRoZSBjbGllbnRzIHRoYXQgYXJlIGN1cnJlbnRseSBhY3RpdmUuICovXG4vLyBQT1JUSU5HIE5PVEU6IE11bHRpLVRhYiBvbmx5LlxuZnVuY3Rpb24gZHUodCkge1xuICAgIGNvbnN0IGUgPSBLKHQpO1xuICAgIHJldHVybiBLKEsoZS5sb2NhbFN0b3JlKS5wZXJzaXN0ZW5jZSkuTXMoKTtcbn1cblxuLyoqIEFwcGxpZXMgYSBxdWVyeSB0YXJnZXQgY2hhbmdlIGZyb20gYSBkaWZmZXJlbnQgdGFiLiAqL1xuLy8gUE9SVElORyBOT1RFOiBNdWx0aS1UYWIgb25seS5cbmFzeW5jIGZ1bmN0aW9uIF91KHQsIGUsIG4sIHMpIHtcbiAgICBjb25zdCBpID0gSyh0KTtcbiAgICBpZiAoaS5vdSkgXG4gICAgLy8gSWYgd2UgcmVjZWl2ZSBhIHRhcmdldCBzdGF0ZSBub3RpZmljYXRpb24gdmlhIFdlYlN0b3JhZ2UsIHdlIGFyZVxuICAgIC8vIGVpdGhlciBhbHJlYWR5IHNlY29uZGFyeSBvciBhbm90aGVyIHRhYiBoYXMgdGFrZW4gdGhlIHByaW1hcnkgbGVhc2UuXG4gICAgTyhcIlN5bmNFbmdpbmVcIiwgXCJJZ25vcmluZyB1bmV4cGVjdGVkIHF1ZXJ5IHN0YXRlIG5vdGlmaWNhdGlvbi5cIik7IGVsc2UgaWYgKGkuWGEuaGFzKGUpKSBzd2l0Y2ggKG4pIHtcbiAgICAgIGNhc2UgXCJjdXJyZW50XCI6XG4gICAgICBjYXNlIFwibm90LWN1cnJlbnRcIjpcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdCA9IGF3YWl0IHNvKGkubG9jYWxTdG9yZSksIHMgPSBXbi5jcmVhdGVTeW50aGVzaXplZFJlbW90ZUV2ZW50Rm9yQ3VycmVudENoYW5nZShlLCBcImN1cnJlbnRcIiA9PT0gbik7XG4gICAgICAgICAgICBhd2FpdCBpdShpLCB0LCBzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJyZWplY3RlZFwiOlxuICAgICAgICBhd2FpdCB0byhpLmxvY2FsU3RvcmUsIGUsIFxuICAgICAgICAvKiBrZWVwUGVyc2lzdGVkVGFyZ2V0RGF0YSAqLyAhMCksIFphKGksIGUsIHMpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgTCgpO1xuICAgIH1cbn1cblxuLyoqIEFkZHMgb3IgcmVtb3ZlcyBXYXRjaCB0YXJnZXRzIGZvciBxdWVyaWVzIGZyb20gZGlmZmVyZW50IHRhYnMuICovIGFzeW5jIGZ1bmN0aW9uIHd1KHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gbXUodCk7XG4gICAgaWYgKHMub3UpIHtcbiAgICAgICAgZm9yIChjb25zdCB0IG9mIGUpIHtcbiAgICAgICAgICAgIGlmIChzLlhhLmhhcyh0KSkge1xuICAgICAgICAgICAgICAgIC8vIEEgdGFyZ2V0IG1pZ2h0IGhhdmUgYmVlbiBhZGRlZCBpbiBhIHByZXZpb3VzIGF0dGVtcHRcbiAgICAgICAgICAgICAgICBPKFwiU3luY0VuZ2luZVwiLCBcIkFkZGluZyBhbiBhbHJlYWR5IGFjdGl2ZSB0YXJnZXQgXCIgKyB0KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGUgPSBhd2FpdCBubyhzLmxvY2FsU3RvcmUsIHQpLCBuID0gYXdhaXQgWnIocy5sb2NhbFN0b3JlLCBlKTtcbiAgICAgICAgICAgIGF3YWl0IFVhKHMsIGZ1KGUpLCBuLnRhcmdldElkLCBcbiAgICAgICAgICAgIC8qY3VycmVudD0qLyAhMSksIGpvKHMucmVtb3RlU3RvcmUsIG4pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiBuKSBcbiAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgdGFyZ2V0IGlzIHN0aWxsIGFjdGl2ZSBzaW5jZSB0aGUgdGFyZ2V0IG1pZ2h0IGhhdmUgYmVlblxuICAgICAgICAvLyByZW1vdmVkIGlmIGl0IGhhcyBiZWVuIHJlamVjdGVkIGJ5IHRoZSBiYWNrZW5kLlxuICAgICAgICBzLlhhLmhhcyh0KSAmJiBcbiAgICAgICAgLy8gUmVsZWFzZSBxdWVyaWVzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZS5cbiAgICAgICAgYXdhaXQgdG8ocy5sb2NhbFN0b3JlLCB0LCBcbiAgICAgICAgLyoga2VlcFBlcnNpc3RlZFRhcmdldERhdGEgKi8gITEpLnRoZW4oKCgpID0+IHtcbiAgICAgICAgICAgIFdvKHMucmVtb3RlU3RvcmUsIHQpLCBaYShzLCB0KTtcbiAgICAgICAgfSkpLmNhdGNoKFRyKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG11KHQpIHtcbiAgICBjb25zdCBlID0gSyh0KTtcbiAgICByZXR1cm4gZS5yZW1vdGVTdG9yZS5yZW1vdGVTeW5jZXIuYXBwbHlSZW1vdGVFdmVudCA9IFFhLmJpbmQobnVsbCwgZSksIGUucmVtb3RlU3RvcmUucmVtb3RlU3luY2VyLmdldFJlbW90ZUtleXNGb3JUYXJnZXQgPSBvdS5iaW5kKG51bGwsIGUpLCBcbiAgICBlLnJlbW90ZVN0b3JlLnJlbW90ZVN5bmNlci5yZWplY3RMaXN0ZW4gPSBXYS5iaW5kKG51bGwsIGUpLCBlLkphLktvID0gVmEuYmluZChudWxsLCBlLmV2ZW50TWFuYWdlciksIFxuICAgIGUuSmEudXUgPSB2YS5iaW5kKG51bGwsIGUuZXZlbnRNYW5hZ2VyKSwgZTtcbn1cblxuZnVuY3Rpb24gZ3UodCkge1xuICAgIGNvbnN0IGUgPSBLKHQpO1xuICAgIHJldHVybiBlLnJlbW90ZVN0b3JlLnJlbW90ZVN5bmNlci5hcHBseVN1Y2Nlc3NmdWxXcml0ZSA9IHphLmJpbmQobnVsbCwgZSksIGUucmVtb3RlU3RvcmUucmVtb3RlU3luY2VyLnJlamVjdEZhaWxlZFdyaXRlID0gSGEuYmluZChudWxsLCBlKSwgXG4gICAgZTtcbn1cblxuLyoqXG4gKiBMb2FkcyBhIEZpcmVzdG9yZSBidW5kbGUgaW50byB0aGUgU0RLLiBUaGUgcmV0dXJuZWQgcHJvbWlzZSByZXNvbHZlcyB3aGVuXG4gKiB0aGUgYnVuZGxlIGZpbmlzaGVkIGxvYWRpbmcuXG4gKlxuICogQHBhcmFtIHN5bmNFbmdpbmUgLSBTeW5jRW5naW5lIHRvIHVzZS5cbiAqIEBwYXJhbSBidW5kbGVSZWFkZXIgLSBCdW5kbGUgdG8gbG9hZCBpbnRvIHRoZSBTREsuXG4gKiBAcGFyYW0gdGFzayAtIExvYWRCdW5kbGVUYXNrIHVzZWQgdG8gdXBkYXRlIHRoZSBsb2FkaW5nIHByb2dyZXNzIHRvIHB1YmxpYyBBUEkuXG4gKi8gZnVuY3Rpb24geXUodCwgZSwgbikge1xuICAgIGNvbnN0IHMgPSBLKHQpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgICAgKGFzeW5jIGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBhd2FpdCBlLmdldE1ldGFkYXRhKCk7XG4gICAgICAgICAgICBpZiAoYXdhaXQgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBLKHQpLCBzID0gdXMoZS5jcmVhdGVUaW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbi5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcImhhc05ld2VyQnVuZGxlXCIsIFwicmVhZG9ubHlcIiwgKHQgPT4gbi5mcy5nZXRCdW5kbGVNZXRhZGF0YSh0LCBlLmlkKSkpLnRoZW4oKHQgPT4gISF0ICYmIHQuY3JlYXRlVGltZS5jb21wYXJlVG8ocykgPj0gMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyoqXG4gKiBTYXZlcyB0aGUgZ2l2ZW4gYEJ1bmRsZU1ldGFkYXRhYCB0byBsb2NhbCBwZXJzaXN0ZW5jZS5cbiAqLyAodC5sb2NhbFN0b3JlLCBzKSkgcmV0dXJuIGF3YWl0IGUuY2xvc2UoKSwgdm9pZCBuLl9jb21wbGV0ZVdpdGgoZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHRhc2tTdGF0ZTogXCJTdWNjZXNzXCIsXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50c0xvYWRlZDogdC50b3RhbERvY3VtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgYnl0ZXNMb2FkZWQ6IHQudG90YWxCeXRlcyxcbiAgICAgICAgICAgICAgICAgICAgdG90YWxEb2N1bWVudHM6IHQudG90YWxEb2N1bWVudHMsXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXM6IHQudG90YWxCeXRlc1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KHMpKTtcbiAgICAgICAgICAgIG4uX3VwZGF0ZVByb2dyZXNzKGthKHMpKTtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBuZXcgTmEocywgdC5sb2NhbFN0b3JlLCBlLk0pO1xuICAgICAgICAgICAgbGV0IHIgPSBhd2FpdCBlLmN1KCk7XG4gICAgICAgICAgICBmb3IgKDtyOyApIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ID0gYXdhaXQgaS54YShyKTtcbiAgICAgICAgICAgICAgICB0ICYmIG4uX3VwZGF0ZVByb2dyZXNzKHQpLCByID0gYXdhaXQgZS5jdSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbyA9IGF3YWl0IGkuY29tcGxldGUoKTtcbiAgICAgICAgICAgIC8vIFRPRE8oYi8xNjA4NzY0NDMpOiBUaGlzIGN1cnJlbnRseSByYWlzZXMgc25hcHNob3RzIHdpdGhcbiAgICAgICAgICAgIC8vIGBmcm9tQ2FjaGU9ZmFsc2VgIGlmIHVzZXJzIGFscmVhZHkgbGlzdGVuIHRvIHNvbWUgcXVlcmllcyBhbmQgYnVuZGxlc1xuICAgICAgICAgICAgLy8gaGFzIG5ld2VyIHZlcnNpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBpdSh0LCBvLiRzLCBcbiAgICAgICAgICAgIC8qIHJlbW90ZUV2ZW50ICovIHZvaWQgMCksIFxuICAgICAgICAgICAgLy8gU2F2ZSBtZXRhZGF0YSwgc28gbG9hZGluZyB0aGUgc2FtZSBidW5kbGUgd2lsbCBza2lwLlxuICAgICAgICAgICAgYXdhaXQgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBLKHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuLnBlcnNpc3RlbmNlLnJ1blRyYW5zYWN0aW9uKFwiU2F2ZSBidW5kbGVcIiwgXCJyZWFkd3JpdGVcIiwgKHQgPT4gbi5mcy5zYXZlQnVuZGxlTWV0YWRhdGEodCwgZSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICogUmV0dXJucyBhIHByb21pc2Ugb2YgYSBgTmFtZWRRdWVyeWAgYXNzb2NpYXRlZCB3aXRoIGdpdmVuIHF1ZXJ5IG5hbWUuIFByb21pc2VcbiAqIHJlc29sdmVzIHRvIHVuZGVmaW5lZCBpZiBubyBwZXJzaXN0ZWQgZGF0YSBjYW4gYmUgZm91bmQuXG4gKi8gKHQubG9jYWxTdG9yZSwgcyksIG4uX2NvbXBsZXRlV2l0aChvLnByb2dyZXNzKTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgRihcIlN5bmNFbmdpbmVcIiwgYExvYWRpbmcgYnVuZGxlIGZhaWxlZCB3aXRoICR7dH1gKSwgbi5fZmFpbFdpdGgodCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbiAgICAvKipcbiAqIFByb3ZpZGVzIGFsbCBjb21wb25lbnRzIG5lZWRlZCBmb3IgRmlyZXN0b3JlIHdpdGggaW4tbWVtb3J5IHBlcnNpc3RlbmNlLlxuICogVXNlcyBFYWdlckdDIGdhcmJhZ2UgY29sbGVjdGlvbi5cbiAqLykocywgZSwgbikudGhlbigoKCkgPT4ge1xuICAgICAgICBzLnNoYXJlZENsaWVudFN0YXRlLm5vdGlmeUJ1bmRsZUxvYWRlZCgpO1xuICAgIH0pKTtcbn1cblxuY2xhc3MgcHUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnN5bmNocm9uaXplVGFicyA9ICExO1xuICAgIH1cbiAgICBhc3luYyBpbml0aWFsaXplKHQpIHtcbiAgICAgICAgdGhpcy5NID0gT28odC5kYXRhYmFzZUluZm8uZGF0YWJhc2VJZCksIHRoaXMuc2hhcmVkQ2xpZW50U3RhdGUgPSB0aGlzLmh1KHQpLCB0aGlzLnBlcnNpc3RlbmNlID0gdGhpcy5sdSh0KSwgXG4gICAgICAgIGF3YWl0IHRoaXMucGVyc2lzdGVuY2Uuc3RhcnQoKSwgdGhpcy5nY1NjaGVkdWxlciA9IHRoaXMuZnUodCksIHRoaXMubG9jYWxTdG9yZSA9IHRoaXMuZHUodCk7XG4gICAgfVxuICAgIGZ1KHQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGR1KHQpIHtcbiAgICAgICAgcmV0dXJuIGpyKHRoaXMucGVyc2lzdGVuY2UsIG5ldyBHciwgdC5pbml0aWFsVXNlciwgdGhpcy5NKTtcbiAgICB9XG4gICAgbHUodCkge1xuICAgICAgICByZXR1cm4gbmV3IG1vKHlvLldpLCB0aGlzLk0pO1xuICAgIH1cbiAgICBodSh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgdm87XG4gICAgfVxuICAgIGFzeW5jIHRlcm1pbmF0ZSgpIHtcbiAgICAgICAgdGhpcy5nY1NjaGVkdWxlciAmJiB0aGlzLmdjU2NoZWR1bGVyLnN0b3AoKSwgYXdhaXQgdGhpcy5zaGFyZWRDbGllbnRTdGF0ZS5zaHV0ZG93bigpLCBcbiAgICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZS5zaHV0ZG93bigpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQcm92aWRlcyBhbGwgY29tcG9uZW50cyBuZWVkZWQgZm9yIEZpcmVzdG9yZSB3aXRoIEluZGV4ZWREQiBwZXJzaXN0ZW5jZS5cbiAqLyBjbGFzcyBJdSBleHRlbmRzIHB1IHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMuX3UgPSB0LCB0aGlzLmNhY2hlU2l6ZUJ5dGVzID0gZSwgdGhpcy5mb3JjZU93bmVyc2hpcCA9IG4sIHRoaXMuc3luY2hyb25pemVUYWJzID0gITE7XG4gICAgfVxuICAgIGFzeW5jIGluaXRpYWxpemUodCkge1xuICAgICAgICBhd2FpdCBzdXBlci5pbml0aWFsaXplKHQpLCBhd2FpdCBpbyh0aGlzLmxvY2FsU3RvcmUpLCBhd2FpdCB0aGlzLl91LmluaXRpYWxpemUodGhpcywgdCksIFxuICAgICAgICAvLyBFbnF1ZXVlIHdyaXRlcyBmcm9tIGEgcHJldmlvdXMgc2Vzc2lvblxuICAgICAgICBhd2FpdCBndSh0aGlzLl91LnN5bmNFbmdpbmUpLCBhd2FpdCByYSh0aGlzLl91LnJlbW90ZVN0b3JlKSwgXG4gICAgICAgIC8vIE5PVEU6IFRoaXMgd2lsbCBpbW1lZGlhdGVseSBjYWxsIHRoZSBsaXN0ZW5lciwgc28gd2UgbWFrZSBzdXJlIHRvXG4gICAgICAgIC8vIHNldCBpdCBhZnRlciBsb2NhbFN0b3JlIC8gcmVtb3RlU3RvcmUgYXJlIHN0YXJ0ZWQuXG4gICAgICAgIGF3YWl0IHRoaXMucGVyc2lzdGVuY2UucHMoKCgpID0+ICh0aGlzLmdjU2NoZWR1bGVyICYmICF0aGlzLmdjU2NoZWR1bGVyLnN0YXJ0ZWQgJiYgdGhpcy5nY1NjaGVkdWxlci5zdGFydCh0aGlzLmxvY2FsU3RvcmUpLCBcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkpKSk7XG4gICAgfVxuICAgIGR1KHQpIHtcbiAgICAgICAgcmV0dXJuIGpyKHRoaXMucGVyc2lzdGVuY2UsIG5ldyBHciwgdC5pbml0aWFsVXNlciwgdGhpcy5NKTtcbiAgICB9XG4gICAgZnUodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5wZXJzaXN0ZW5jZS5yZWZlcmVuY2VEZWxlZ2F0ZS5nYXJiYWdlQ29sbGVjdG9yO1xuICAgICAgICByZXR1cm4gbmV3IFJyKGUsIHQuYXN5bmNRdWV1ZSk7XG4gICAgfVxuICAgIGx1KHQpIHtcbiAgICAgICAgY29uc3QgZSA9IExyKHQuZGF0YWJhc2VJbmZvLmRhdGFiYXNlSWQsIHQuZGF0YWJhc2VJbmZvLnBlcnNpc3RlbmNlS2V5KSwgbiA9IHZvaWQgMCAhPT0gdGhpcy5jYWNoZVNpemVCeXRlcyA/IHVyLndpdGhDYWNoZVNpemUodGhpcy5jYWNoZVNpemVCeXRlcykgOiB1ci5ERUZBVUxUO1xuICAgICAgICByZXR1cm4gbmV3ICRyKHRoaXMuc3luY2hyb25pemVUYWJzLCBlLCB0LmNsaWVudElkLCBuLCB0LmFzeW5jUXVldWUsIGtvKCksIE1vKCksIHRoaXMuTSwgdGhpcy5zaGFyZWRDbGllbnRTdGF0ZSwgISF0aGlzLmZvcmNlT3duZXJzaGlwKTtcbiAgICB9XG4gICAgaHUodCkge1xuICAgICAgICByZXR1cm4gbmV3IHZvO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQcm92aWRlcyBhbGwgY29tcG9uZW50cyBuZWVkZWQgZm9yIEZpcmVzdG9yZSB3aXRoIG11bHRpLXRhYiBJbmRleGVkREJcbiAqIHBlcnNpc3RlbmNlLlxuICpcbiAqIEluIHRoZSBsZWdhY3kgY2xpZW50LCB0aGlzIHByb3ZpZGVyIGlzIHVzZWQgdG8gcHJvdmlkZSBib3RoIG11bHRpLXRhYiBhbmRcbiAqIG5vbi1tdWx0aS10YWIgcGVyc2lzdGVuY2Ugc2luY2Ugd2UgY2Fubm90IHRlbGwgYXQgYnVpbGQgdGltZSB3aGV0aGVyXG4gKiBgc3luY2hyb25pemVUYWJzYCB3aWxsIGJlIGVuYWJsZWQuXG4gKi8gY2xhc3MgVHUgZXh0ZW5kcyBJdSB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICBzdXBlcih0LCBlLCAvKiBmb3JjZU93bmVyc2hpcD0gKi8gITEpLCB0aGlzLl91ID0gdCwgdGhpcy5jYWNoZVNpemVCeXRlcyA9IGUsIHRoaXMuc3luY2hyb25pemVUYWJzID0gITA7XG4gICAgfVxuICAgIGFzeW5jIGluaXRpYWxpemUodCkge1xuICAgICAgICBhd2FpdCBzdXBlci5pbml0aWFsaXplKHQpO1xuICAgICAgICBjb25zdCBlID0gdGhpcy5fdS5zeW5jRW5naW5lO1xuICAgICAgICB0aGlzLnNoYXJlZENsaWVudFN0YXRlIGluc3RhbmNlb2YgVm8gJiYgKHRoaXMuc2hhcmVkQ2xpZW50U3RhdGUuc3luY0VuZ2luZSA9IHtcbiAgICAgICAgICAgIE5yOiBjdS5iaW5kKG51bGwsIGUpLFxuICAgICAgICAgICAga3I6IF91LmJpbmQobnVsbCwgZSksXG4gICAgICAgICAgICBNcjogd3UuYmluZChudWxsLCBlKSxcbiAgICAgICAgICAgIE1zOiBkdS5iaW5kKG51bGwsIGUpLFxuICAgICAgICAgICAgQ3I6IHV1LmJpbmQobnVsbCwgZSlcbiAgICAgICAgfSwgYXdhaXQgdGhpcy5zaGFyZWRDbGllbnRTdGF0ZS5zdGFydCgpKSwgXG4gICAgICAgIC8vIE5PVEU6IFRoaXMgd2lsbCBpbW1lZGlhdGVseSBjYWxsIHRoZSBsaXN0ZW5lciwgc28gd2UgbWFrZSBzdXJlIHRvXG4gICAgICAgIC8vIHNldCBpdCBhZnRlciBsb2NhbFN0b3JlIC8gcmVtb3RlU3RvcmUgYXJlIHN0YXJ0ZWQuXG4gICAgICAgIGF3YWl0IHRoaXMucGVyc2lzdGVuY2UucHMoKGFzeW5jIHQgPT4ge1xuICAgICAgICAgICAgYXdhaXQgaHUodGhpcy5fdS5zeW5jRW5naW5lLCB0KSwgdGhpcy5nY1NjaGVkdWxlciAmJiAodCAmJiAhdGhpcy5nY1NjaGVkdWxlci5zdGFydGVkID8gdGhpcy5nY1NjaGVkdWxlci5zdGFydCh0aGlzLmxvY2FsU3RvcmUpIDogdCB8fCB0aGlzLmdjU2NoZWR1bGVyLnN0b3AoKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgaHUodCkge1xuICAgICAgICBjb25zdCBlID0ga28oKTtcbiAgICAgICAgaWYgKCFWby52dChlKSkgdGhyb3cgbmV3IFEoRy5VTklNUExFTUVOVEVELCBcIkluZGV4ZWREQiBwZXJzaXN0ZW5jZSBpcyBvbmx5IGF2YWlsYWJsZSBvbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IExvY2FsU3RvcmFnZS5cIik7XG4gICAgICAgIGNvbnN0IG4gPSBMcih0LmRhdGFiYXNlSW5mby5kYXRhYmFzZUlkLCB0LmRhdGFiYXNlSW5mby5wZXJzaXN0ZW5jZUtleSk7XG4gICAgICAgIHJldHVybiBuZXcgVm8oZSwgdC5hc3luY1F1ZXVlLCBuLCB0LmNsaWVudElkLCB0LmluaXRpYWxVc2VyKTtcbiAgICB9XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgYW5kIHdpcmVzIHRoZSBjb21wb25lbnRzIHRoYXQgYXJlIG5lZWRlZCB0byBpbnRlcmZhY2Ugd2l0aCB0aGVcbiAqIG5ldHdvcmsuXG4gKi8gY2xhc3MgRXUge1xuICAgIGFzeW5jIGluaXRpYWxpemUodCwgZSkge1xuICAgICAgICB0aGlzLmxvY2FsU3RvcmUgfHwgKHRoaXMubG9jYWxTdG9yZSA9IHQubG9jYWxTdG9yZSwgdGhpcy5zaGFyZWRDbGllbnRTdGF0ZSA9IHQuc2hhcmVkQ2xpZW50U3RhdGUsIFxuICAgICAgICB0aGlzLmRhdGFzdG9yZSA9IHRoaXMuY3JlYXRlRGF0YXN0b3JlKGUpLCB0aGlzLnJlbW90ZVN0b3JlID0gdGhpcy5jcmVhdGVSZW1vdGVTdG9yZShlKSwgXG4gICAgICAgIHRoaXMuZXZlbnRNYW5hZ2VyID0gdGhpcy5jcmVhdGVFdmVudE1hbmFnZXIoZSksIHRoaXMuc3luY0VuZ2luZSA9IHRoaXMuY3JlYXRlU3luY0VuZ2luZShlLCBcbiAgICAgICAgLyogc3RhcnRBc1ByaW1hcnk9Ki8gIXQuc3luY2hyb25pemVUYWJzKSwgdGhpcy5zaGFyZWRDbGllbnRTdGF0ZS5vbmxpbmVTdGF0ZUhhbmRsZXIgPSB0ID0+IGphKHRoaXMuc3luY0VuZ2luZSwgdCwgMSAvKiBTaGFyZWRDbGllbnRTdGF0ZSAqLyksIFxuICAgICAgICB0aGlzLnJlbW90ZVN0b3JlLnJlbW90ZVN5bmNlci5oYW5kbGVDcmVkZW50aWFsQ2hhbmdlID0gcnUuYmluZChudWxsLCB0aGlzLnN5bmNFbmdpbmUpLCBcbiAgICAgICAgYXdhaXQgd2EodGhpcy5yZW1vdGVTdG9yZSwgdGhpcy5zeW5jRW5naW5lLmlzUHJpbWFyeUNsaWVudCkpO1xuICAgIH1cbiAgICBjcmVhdGVFdmVudE1hbmFnZXIodCkge1xuICAgICAgICByZXR1cm4gbmV3IFJhO1xuICAgIH1cbiAgICBjcmVhdGVEYXRhc3RvcmUodCkge1xuICAgICAgICBjb25zdCBlID0gT28odC5kYXRhYmFzZUluZm8uZGF0YWJhc2VJZCksIG4gPSAocyA9IHQuZGF0YWJhc2VJbmZvLCBuZXcgTm8ocykpO1xuICAgICAgICB2YXIgcztcbiAgICAgICAgLyoqIFJldHVybiB0aGUgUGxhdGZvcm0tc3BlY2lmaWMgY29ubmVjdGl2aXR5IG1vbml0b3IuICovICAgICAgICByZXR1cm4gZnVuY3Rpb24odCwgZSwgbiwgcykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBxbyh0LCBlLCBuLCBzKTtcbiAgICAgICAgfSh0LmF1dGhDcmVkZW50aWFscywgdC5hcHBDaGVja0NyZWRlbnRpYWxzLCBuLCBlKTtcbiAgICB9XG4gICAgY3JlYXRlUmVtb3RlU3RvcmUodCkge1xuICAgICAgICByZXR1cm4gZSA9IHRoaXMubG9jYWxTdG9yZSwgbiA9IHRoaXMuZGF0YXN0b3JlLCBzID0gdC5hc3luY1F1ZXVlLCBpID0gdCA9PiBqYSh0aGlzLnN5bmNFbmdpbmUsIHQsIDAgLyogUmVtb3RlU3RvcmUgKi8pLCBcbiAgICAgICAgciA9IERvLnZ0KCkgPyBuZXcgRG8gOiBuZXcgU28sIG5ldyBLbyhlLCBuLCBzLCBpLCByKTtcbiAgICAgICAgdmFyIGUsIG4sIHMsIGksIHI7XG4gICAgICAgIC8qKiBSZS1lbmFibGVzIHRoZSBuZXR3b3JrLiBJZGVtcG90ZW50LiAqLyAgICB9XG4gICAgY3JlYXRlU3luY0VuZ2luZSh0LCBlKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlLCBuLCBcbiAgICAgICAgLy8gUE9SVElORyBOT1RFOiBNYW5hZ2VzIHN0YXRlIHN5bmNocm9uaXphdGlvbiBpbiBtdWx0aS10YWIgZW52aXJvbm1lbnRzLlxuICAgICAgICBzLCBpLCByLCBvKSB7XG4gICAgICAgICAgICBjb25zdCBhID0gbmV3IExhKHQsIGUsIG4sIHMsIGksIHIpO1xuICAgICAgICAgICAgcmV0dXJuIG8gJiYgKGEub3UgPSAhMCksIGE7XG4gICAgICAgIH0odGhpcy5sb2NhbFN0b3JlLCB0aGlzLnJlbW90ZVN0b3JlLCB0aGlzLmV2ZW50TWFuYWdlciwgdGhpcy5zaGFyZWRDbGllbnRTdGF0ZSwgdC5pbml0aWFsVXNlciwgdC5tYXhDb25jdXJyZW50TGltYm9SZXNvbHV0aW9ucywgZSk7XG4gICAgfVxuICAgIHRlcm1pbmF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBLKHQpO1xuICAgICAgICAgICAgTyhcIlJlbW90ZVN0b3JlXCIsIFwiUmVtb3RlU3RvcmUgc2h1dHRpbmcgZG93bi5cIiksIGUuaGEuYWRkKDUgLyogU2h1dGRvd24gKi8pLCBhd2FpdCBRbyhlKSwgXG4gICAgICAgICAgICBlLmZhLnNodXRkb3duKCksIFxuICAgICAgICAgICAgLy8gU2V0IHRoZSBPbmxpbmVTdGF0ZSB0byBVbmtub3duIChyYXRoZXIgdGhhbiBPZmZsaW5lKSB0byBhdm9pZCBwb3RlbnRpYWxseVxuICAgICAgICAgICAgLy8gdHJpZ2dlcmluZyBzcHVyaW91cyBsaXN0ZW5lciBldmVudHMgd2l0aCBjYWNoZWQgZGF0YSwgZXRjLlxuICAgICAgICAgICAgZS5kYS5zZXQoXCJVbmtub3duXCIgLyogVW5rbm93biAqLyk7XG4gICAgICAgIH0odGhpcy5yZW1vdGVTdG9yZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBIb3cgbWFueSBieXRlcyB0byByZWFkIGVhY2ggdGltZSB3aGVuIGBSZWFkYWJsZVN0cmVhbVJlYWRlci5yZWFkKClgIGlzXG4gKiBjYWxsZWQuIE9ubHkgYXBwbGljYWJsZSBmb3IgYnl0ZSBzdHJlYW1zIHRoYXQgd2UgY29udHJvbCAoZS5nLiB0aG9zZSBiYWNrZWRcbiAqIGJ5IGFuIFVJbnQ4QXJyYXkpLlxuICovXG4vKipcbiAqIEJ1aWxkcyBhIGBCeXRlU3RyZWFtUmVhZGVyYCBmcm9tIGEgVUludDhBcnJheS5cbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgZGF0YSBzb3VyY2UgdG8gdXNlLlxuICogQHBhcmFtIGJ5dGVzUGVyUmVhZCAtIEhvdyBtYW55IGJ5dGVzIGVhY2ggYHJlYWQoKWAgZnJvbSB0aGUgcmV0dXJuZWQgcmVhZGVyXG4gKiAgICAgICAgd2lsbCByZWFkLlxuICovXG5mdW5jdGlvbiBBdSh0LCBlID0gMTAyNDApIHtcbiAgICBsZXQgbiA9IDA7XG4gICAgLy8gVGhlIFR5cGVTY3JpcHQgZGVmaW5pdGlvbiBmb3IgUmVhZGFibGVTdHJlYW1SZWFkZXIgY2hhbmdlZC4gV2UgdXNlXG4gICAgLy8gYGFueWAgaGVyZSB0byBhbGxvdyB0aGlzIGNvZGUgdG8gY29tcGlsZSB3aXRoIGRpZmZlcmVudCB2ZXJzaW9ucy5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy80Mjk3MFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGFzeW5jIHJlYWQoKSB7XG4gICAgICAgICAgICBpZiAobiA8IHQuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0LnNsaWNlKG4sIG4gKyBlKSxcbiAgICAgICAgICAgICAgICAgICAgZG9uZTogITFcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBuICs9IGUsIHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRvbmU6ICEwXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyBjYW5jZWwoKSB7fSxcbiAgICAgICAgcmVsZWFzZUxvY2soKSB7fSxcbiAgICAgICAgY2xvc2VkOiBQcm9taXNlLnJlamVjdChcInVuaW1wbGVtZW50ZWRcIilcbiAgICB9O1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBPbiB3ZWIsIGEgYFJlYWRhYmxlU3RyZWFtYCBpcyB3cmFwcGVkIGFyb3VuZCBieSBhIGBCeXRlU3RyZWFtUmVhZGVyYC5cbiAqL1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qXG4gKiBBIHdyYXBwZXIgaW1wbGVtZW50YXRpb24gb2YgT2JzZXJ2ZXI8VD4gdGhhdCB3aWxsIGRpc3BhdGNoIGV2ZW50c1xuICogYXN5bmNocm9ub3VzbHkuIFRvIGFsbG93IGltbWVkaWF0ZSBzaWxlbmNpbmcsIGEgbXV0ZSBjYWxsIGlzIGFkZGVkIHdoaWNoXG4gKiBjYXVzZXMgZXZlbnRzIHNjaGVkdWxlZCB0byBubyBsb25nZXIgYmUgcmFpc2VkLlxuICovXG5jbGFzcyBSdSB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLm9ic2VydmVyID0gdCwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGVuIHNldCB0byB0cnVlLCB3aWxsIG5vdCByYWlzZSBmdXR1cmUgZXZlbnRzLiBOZWNlc3NhcnkgdG8gZGVhbCB3aXRoXG4gICAgICAgICAqIGFzeW5jIGRldGFjaG1lbnQgb2YgbGlzdGVuZXIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm11dGVkID0gITE7XG4gICAgfVxuICAgIG5leHQodCkge1xuICAgICAgICB0aGlzLm9ic2VydmVyLm5leHQgJiYgdGhpcy53dSh0aGlzLm9ic2VydmVyLm5leHQsIHQpO1xuICAgIH1cbiAgICBlcnJvcih0KSB7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIuZXJyb3IgPyB0aGlzLnd1KHRoaXMub2JzZXJ2ZXIuZXJyb3IsIHQpIDogY29uc29sZS5lcnJvcihcIlVuY2F1Z2h0IEVycm9yIGluIHNuYXBzaG90IGxpc3RlbmVyOlwiLCB0KTtcbiAgICB9XG4gICAgbXUoKSB7XG4gICAgICAgIHRoaXMubXV0ZWQgPSAhMDtcbiAgICB9XG4gICAgd3UodCwgZSkge1xuICAgICAgICB0aGlzLm11dGVkIHx8IHNldFRpbWVvdXQoKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubXV0ZWQgfHwgdChlKTtcbiAgICAgICAgfSksIDApO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQSBjbGFzcyByZXByZXNlbnRpbmcgYSBidW5kbGUuXG4gKlxuICogVGFrZXMgYSBidW5kbGUgc3RyZWFtIG9yIGJ1ZmZlciwgYW5kIHByZXNlbnRzIGFic3RyYWN0aW9ucyB0byByZWFkIGJ1bmRsZWRcbiAqIGVsZW1lbnRzIG91dCBvZiB0aGUgdW5kZXJseWluZyBjb250ZW50LlxuICovIGNsYXNzIGJ1IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKiogVGhlIHJlYWRlciB0byByZWFkIGZyb20gdW5kZXJseWluZyBiaW5hcnkgYnVuZGxlIGRhdGEgc291cmNlLiAqL1xuICAgIHQsIGUpIHtcbiAgICAgICAgdGhpcy5ndSA9IHQsIHRoaXMuTSA9IGUsIFxuICAgICAgICAvKiogQ2FjaGVkIGJ1bmRsZSBtZXRhZGF0YS4gKi9cbiAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG5ldyBqLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEludGVybmFsIGJ1ZmZlciB0byBob2xkIGJ1bmRsZSBjb250ZW50LCBhY2N1bXVsYXRpbmcgaW5jb21wbGV0ZSBlbGVtZW50XG4gICAgICAgICAqIGNvbnRlbnQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBVaW50OEFycmF5LCB0aGlzLnl1ID0gbmV3IFRleHREZWNvZGVyKFwidXRmLThcIiksIFxuICAgICAgICAvLyBSZWFkIHRoZSBtZXRhZGF0YSAod2hpY2ggaXMgdGhlIGZpcnN0IGVsZW1lbnQpLlxuICAgICAgICB0aGlzLnB1KCkudGhlbigodCA9PiB7XG4gICAgICAgICAgICB0ICYmIHQuRGEoKSA/IHRoaXMubWV0YWRhdGEucmVzb2x2ZSh0LnBheWxvYWQubWV0YWRhdGEpIDogdGhpcy5tZXRhZGF0YS5yZWplY3QobmV3IEVycm9yKGBUaGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgYnVuZGxlIGlzIG5vdCBhIG1ldGFkYXRhLCBpdCBpc1xcbiAgICAgICAgICAgICAke0pTT04uc3RyaW5naWZ5KG51bGwgPT0gdCA/IHZvaWQgMCA6IHQucGF5bG9hZCl9YCkpO1xuICAgICAgICB9KSwgKHQgPT4gdGhpcy5tZXRhZGF0YS5yZWplY3QodCkpKTtcbiAgICB9XG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmd1LmNhbmNlbCgpO1xuICAgIH1cbiAgICBhc3luYyBnZXRNZXRhZGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0YWRhdGEucHJvbWlzZTtcbiAgICB9XG4gICAgYXN5bmMgY3UoKSB7XG4gICAgICAgIC8vIE1ha2VzIHN1cmUgbWV0YWRhdGEgaXMgcmVhZCBiZWZvcmUgcHJvY2VlZGluZy5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0TWV0YWRhdGEoKSwgdGhpcy5wdSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBmcm9tIHRoZSBoZWFkIG9mIGludGVybmFsIGJ1ZmZlciwgYW5kIHB1bGxpbmcgbW9yZSBkYXRhIGZyb21cbiAgICAgKiB1bmRlcmx5aW5nIHN0cmVhbSBpZiBhIGNvbXBsZXRlIGVsZW1lbnQgY2Fubm90IGJlIGZvdW5kLCB1bnRpbCBhblxuICAgICAqIGVsZW1lbnQoaW5jbHVkaW5nIHRoZSBwcmVmaXhlZCBsZW5ndGggYW5kIHRoZSBKU09OIHN0cmluZykgaXMgZm91bmQuXG4gICAgICpcbiAgICAgKiBPbmNlIGEgY29tcGxldGUgZWxlbWVudCBpcyByZWFkLCBpdCBpcyBkcm9wcGVkIGZyb20gaW50ZXJuYWwgYnVmZmVyLlxuICAgICAqXG4gICAgICogUmV0dXJucyBlaXRoZXIgdGhlIGJ1bmRsZWQgZWxlbWVudCwgb3IgbnVsbCBpZiB3ZSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZlxuICAgICAqIHRoZSBzdHJlYW0uXG4gICAgICovICAgIGFzeW5jIHB1KCkge1xuICAgICAgICBjb25zdCB0ID0gYXdhaXQgdGhpcy5JdSgpO1xuICAgICAgICBpZiAobnVsbCA9PT0gdCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLnl1LmRlY29kZSh0KSwgbiA9IE51bWJlcihlKTtcbiAgICAgICAgaXNOYU4obikgJiYgdGhpcy5UdShgbGVuZ3RoIHN0cmluZyAoJHtlfSkgaXMgbm90IHZhbGlkIG51bWJlcmApO1xuICAgICAgICBjb25zdCBzID0gYXdhaXQgdGhpcy5FdShuKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDYShKU09OLnBhcnNlKHMpLCB0Lmxlbmd0aCArIG4pO1xuICAgIH1cbiAgICAvKiogRmlyc3QgaW5kZXggb2YgJ3snIGZyb20gdGhlIHVuZGVybHlpbmcgYnVmZmVyLiAqLyAgICBBdSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLmZpbmRJbmRleCgodCA9PiB0ID09PSBcIntcIi5jaGFyQ29kZUF0KDApKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW50ZXJuYWwgYnVmZmVyLCB1bnRpbCB0aGUgZmlyc3QgJ3snLCBhbmRcbiAgICAgKiByZXR1cm4gdGhlIGNvbnRlbnQuXG4gICAgICpcbiAgICAgKiBJZiByZWFjaGVkIGVuZCBvZiB0aGUgc3RyZWFtLCByZXR1cm5zIGEgbnVsbC5cbiAgICAgKi8gICAgYXN5bmMgSXUoKSB7XG4gICAgICAgIGZvciAoO3RoaXMuQXUoKSA8IDA7ICkge1xuICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuUnUoKSkgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQnJva2Ugb3V0IG9mIHRoZSBsb29wIGJlY2F1c2UgdW5kZXJseWluZyBzdHJlYW0gaXMgY2xvc2VkLCBhbmQgdGhlcmVcbiAgICAgICAgLy8gaGFwcGVucyB0byBiZSBubyBtb3JlIGRhdGEgdG8gcHJvY2Vzcy5cbiAgICAgICAgICAgICAgICBpZiAoMCA9PT0gdGhpcy5idWZmZXIubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgdCA9IHRoaXMuQXUoKTtcbiAgICAgICAgLy8gQnJva2Ugb3V0IG9mIHRoZSBsb29wIGJlY2F1c2UgdW5kZXJseWluZyBzdHJlYW0gaXMgY2xvc2VkLCBidXQgc3RpbGxcbiAgICAgICAgLy8gY2Fubm90IGZpbmQgYW4gb3BlbiBicmFja2V0LlxuICAgICAgICAgICAgICAgIHQgPCAwICYmIHRoaXMuVHUoXCJSZWFjaGVkIHRoZSBlbmQgb2YgYnVuZGxlIHdoZW4gYSBsZW5ndGggc3RyaW5nIGlzIGV4cGVjdGVkLlwiKTtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMuYnVmZmVyLnNsaWNlKDAsIHQpO1xuICAgICAgICAvLyBVcGRhdGUgdGhlIGludGVybmFsIGJ1ZmZlciB0byBkcm9wIHRoZSByZWFkIGxlbmd0aC5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIgPSB0aGlzLmJ1ZmZlci5zbGljZSh0KSwgZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgZnJvbSBhIHNwZWNpZmllZCBwb3NpdGlvbiBmcm9tIHRoZSBpbnRlcm5hbCBidWZmZXIsIGZvciBhIHNwZWNpZmllZFxuICAgICAqIG51bWJlciBvZiBieXRlcywgcHVsbGluZyBtb3JlIGRhdGEgZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0gaWYgbmVlZGVkLlxuICAgICAqXG4gICAgICogUmV0dXJucyBhIHN0cmluZyBkZWNvZGVkIGZyb20gdGhlIHJlYWQgYnl0ZXMuXG4gICAgICovICAgIGFzeW5jIEV1KHQpIHtcbiAgICAgICAgZm9yICg7dGhpcy5idWZmZXIubGVuZ3RoIDwgdDsgKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLlJ1KCkgJiYgdGhpcy5UdShcIlJlYWNoZWQgdGhlIGVuZCBvZiBidW5kbGUgd2hlbiBtb3JlIGlzIGV4cGVjdGVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlID0gdGhpcy55dS5kZWNvZGUodGhpcy5idWZmZXIuc2xpY2UoMCwgdCkpO1xuICAgICAgICAvLyBVcGRhdGUgdGhlIGludGVybmFsIGJ1ZmZlciB0byBkcm9wIHRoZSByZWFkIGpzb24gc3RyaW5nLlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlciA9IHRoaXMuYnVmZmVyLnNsaWNlKHQpLCBlO1xuICAgIH1cbiAgICBUdSh0KSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgICAgdGhyb3cgdGhpcy5ndS5jYW5jZWwoKSwgbmV3IEVycm9yKGBJbnZhbGlkIGJ1bmRsZSBmb3JtYXQ6ICR7dH1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHVsbHMgbW9yZSBkYXRhIGZyb20gdW5kZXJseWluZyBzdHJlYW0gdG8gaW50ZXJuYWwgYnVmZmVyLlxuICAgICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgc3RyZWFtIGlzIGZpbmlzaGVkLlxuICAgICAqLyAgICBhc3luYyBSdSgpIHtcbiAgICAgICAgY29uc3QgdCA9IGF3YWl0IHRoaXMuZ3UucmVhZCgpO1xuICAgICAgICBpZiAoIXQuZG9uZSkge1xuICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBVaW50OEFycmF5KHRoaXMuYnVmZmVyLmxlbmd0aCArIHQudmFsdWUubGVuZ3RoKTtcbiAgICAgICAgICAgIGUuc2V0KHRoaXMuYnVmZmVyKSwgZS5zZXQodC52YWx1ZSwgdGhpcy5idWZmZXIubGVuZ3RoKSwgdGhpcy5idWZmZXIgPSBlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0LmRvbmU7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBJbnRlcm5hbCB0cmFuc2FjdGlvbiBvYmplY3QgcmVzcG9uc2libGUgZm9yIGFjY3VtdWxhdGluZyB0aGUgbXV0YXRpb25zIHRvXG4gKiBwZXJmb3JtIGFuZCB0aGUgYmFzZSB2ZXJzaW9ucyBmb3IgYW55IGRvY3VtZW50cyByZWFkLlxuICovXG5jbGFzcyBQdSB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLmRhdGFzdG9yZSA9IHQsIFxuICAgICAgICAvLyBUaGUgdmVyc2lvbiBvZiBlYWNoIGRvY3VtZW50IHRoYXQgd2FzIHJlYWQgZHVyaW5nIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgICAgIHRoaXMucmVhZFZlcnNpb25zID0gbmV3IE1hcCwgdGhpcy5tdXRhdGlvbnMgPSBbXSwgdGhpcy5jb21taXR0ZWQgPSAhMSwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGRlZmVycmVkIHVzYWdlIGVycm9yIHRoYXQgb2NjdXJyZWQgcHJldmlvdXNseSBpbiB0aGlzIHRyYW5zYWN0aW9uIHRoYXRcbiAgICAgICAgICogd2lsbCBjYXVzZSB0aGUgdHJhbnNhY3Rpb24gdG8gZmFpbCBvbmNlIGl0IGFjdHVhbGx5IGNvbW1pdHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmxhc3RXcml0ZUVycm9yID0gbnVsbCwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZXQgb2YgZG9jdW1lbnRzIHRoYXQgaGF2ZSBiZWVuIHdyaXR0ZW4gaW4gdGhlIHRyYW5zYWN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBXaGVuIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZSB3cml0ZSB0byB0aGUgc2FtZSBrZXkgaW4gYSB0cmFuc2FjdGlvbiwgYW55XG4gICAgICAgICAqIHdyaXRlcyBhZnRlciB0aGUgZmlyc3QgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLndyaXR0ZW5Eb2NzID0gbmV3IFNldDtcbiAgICB9XG4gICAgYXN5bmMgbG9va3VwKHQpIHtcbiAgICAgICAgaWYgKHRoaXMuZW5zdXJlQ29tbWl0Tm90Q2FsbGVkKCksIHRoaXMubXV0YXRpb25zLmxlbmd0aCA+IDApIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgXCJGaXJlc3RvcmUgdHJhbnNhY3Rpb25zIHJlcXVpcmUgYWxsIHJlYWRzIHRvIGJlIGV4ZWN1dGVkIGJlZm9yZSBhbGwgd3JpdGVzLlwiKTtcbiAgICAgICAgY29uc3QgZSA9IGF3YWl0IGFzeW5jIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBLKHQpLCBzID0gd3Mobi5NKSArIFwiL2RvY3VtZW50c1wiLCBpID0ge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50czogZS5tYXAoKHQgPT4gbHMobi5NLCB0KSkpXG4gICAgICAgICAgICB9LCByID0gYXdhaXQgbi51byhcIkJhdGNoR2V0RG9jdW1lbnRzXCIsIHMsIGkpLCBvID0gbmV3IE1hcDtcbiAgICAgICAgICAgIHIuZm9yRWFjaCgodCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IHBzKG4uTSwgdCk7XG4gICAgICAgICAgICAgICAgby5zZXQoZS5rZXkudG9TdHJpbmcoKSwgZSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBjb25zdCBhID0gW107XG4gICAgICAgICAgICByZXR1cm4gZS5mb3JFYWNoKCh0ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gby5nZXQodC50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICBxKCEhZSksIGEucHVzaChlKTtcbiAgICAgICAgICAgIH0pKSwgYTtcbiAgICAgICAgfSh0aGlzLmRhdGFzdG9yZSwgdCk7XG4gICAgICAgIHJldHVybiBlLmZvckVhY2goKHQgPT4gdGhpcy5yZWNvcmRWZXJzaW9uKHQpKSksIGU7XG4gICAgfVxuICAgIHNldCh0LCBlKSB7XG4gICAgICAgIHRoaXMud3JpdGUoZS50b011dGF0aW9uKHQsIHRoaXMucHJlY29uZGl0aW9uKHQpKSksIHRoaXMud3JpdHRlbkRvY3MuYWRkKHQudG9TdHJpbmcoKSk7XG4gICAgfVxuICAgIHVwZGF0ZSh0LCBlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlKGUudG9NdXRhdGlvbih0LCB0aGlzLnByZWNvbmRpdGlvbkZvclVwZGF0ZSh0KSkpO1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RXcml0ZUVycm9yID0gdDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndyaXR0ZW5Eb2NzLmFkZCh0LnRvU3RyaW5nKCkpO1xuICAgIH1cbiAgICBkZWxldGUodCkge1xuICAgICAgICB0aGlzLndyaXRlKG5ldyBBbih0LCB0aGlzLnByZWNvbmRpdGlvbih0KSkpLCB0aGlzLndyaXR0ZW5Eb2NzLmFkZCh0LnRvU3RyaW5nKCkpO1xuICAgIH1cbiAgICBhc3luYyBjb21taXQoKSB7XG4gICAgICAgIGlmICh0aGlzLmVuc3VyZUNvbW1pdE5vdENhbGxlZCgpLCB0aGlzLmxhc3RXcml0ZUVycm9yKSB0aHJvdyB0aGlzLmxhc3RXcml0ZUVycm9yO1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5yZWFkVmVyc2lvbnM7XG4gICAgICAgIC8vIEZvciBlYWNoIG11dGF0aW9uLCBub3RlIHRoYXQgdGhlIGRvYyB3YXMgd3JpdHRlbi5cbiAgICAgICAgICAgICAgICB0aGlzLm11dGF0aW9ucy5mb3JFYWNoKChlID0+IHtcbiAgICAgICAgICAgIHQuZGVsZXRlKGUua2V5LnRvU3RyaW5nKCkpO1xuICAgICAgICB9KSksIFxuICAgICAgICAvLyBGb3IgZWFjaCBkb2N1bWVudCB0aGF0IHdhcyByZWFkIGJ1dCBub3Qgd3JpdHRlbiB0bywgd2Ugd2FudCB0byBwZXJmb3JtXG4gICAgICAgIC8vIGEgYHZlcmlmeWAgb3BlcmF0aW9uLlxuICAgICAgICB0LmZvckVhY2goKCh0LCBlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuID0geHQuZnJvbVBhdGgoZSk7XG4gICAgICAgICAgICB0aGlzLm11dGF0aW9ucy5wdXNoKG5ldyBSbihuLCB0aGlzLnByZWNvbmRpdGlvbihuKSkpO1xuICAgICAgICB9KSksIGF3YWl0IGFzeW5jIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBLKHQpLCBzID0gd3Mobi5NKSArIFwiL2RvY3VtZW50c1wiLCBpID0ge1xuICAgICAgICAgICAgICAgIHdyaXRlczogZS5tYXAoKHQgPT4gVHMobi5NLCB0KSkpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXdhaXQgbi5pbyhcIkNvbW1pdFwiLCBzLCBpKTtcbiAgICAgICAgfSh0aGlzLmRhdGFzdG9yZSwgdGhpcy5tdXRhdGlvbnMpLCB0aGlzLmNvbW1pdHRlZCA9ICEwO1xuICAgIH1cbiAgICByZWNvcmRWZXJzaW9uKHQpIHtcbiAgICAgICAgbGV0IGU7XG4gICAgICAgIGlmICh0LmlzRm91bmREb2N1bWVudCgpKSBlID0gdC52ZXJzaW9uOyBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdC5pc05vRG9jdW1lbnQoKSkgdGhyb3cgTCgpO1xuICAgICAgICAgICAgLy8gRm9yIGRlbGV0ZWQgZG9jcywgd2UgbXVzdCB1c2UgYmFzZVZlcnNpb24gMCB3aGVuIHdlIG92ZXJ3cml0ZSB0aGVtLlxuICAgICAgICAgICAgZSA9IGN0Lm1pbigpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLnJlYWRWZXJzaW9ucy5nZXQodC5rZXkudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChuKSB7XG4gICAgICAgICAgICBpZiAoIWUuaXNFcXVhbChuKSkgXG4gICAgICAgICAgICAvLyBUaGlzIHRyYW5zYWN0aW9uIHdpbGwgZmFpbCBubyBtYXR0ZXIgd2hhdC5cbiAgICAgICAgICAgIHRocm93IG5ldyBRKEcuQUJPUlRFRCwgXCJEb2N1bWVudCB2ZXJzaW9uIGNoYW5nZWQgYmV0d2VlbiB0d28gcmVhZHMuXCIpO1xuICAgICAgICB9IGVsc2UgdGhpcy5yZWFkVmVyc2lvbnMuc2V0KHQua2V5LnRvU3RyaW5nKCksIGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQgd2hlbiBpdCB3YXMgcmVhZCBpbiB0aGlzIHRyYW5zYWN0aW9uLFxuICAgICAqIGFzIGEgcHJlY29uZGl0aW9uLCBvciBubyBwcmVjb25kaXRpb24gaWYgaXQgd2FzIG5vdCByZWFkLlxuICAgICAqLyAgICBwcmVjb25kaXRpb24odCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5yZWFkVmVyc2lvbnMuZ2V0KHQudG9TdHJpbmcoKSk7XG4gICAgICAgIHJldHVybiAhdGhpcy53cml0dGVuRG9jcy5oYXModC50b1N0cmluZygpKSAmJiBlID8gaG4udXBkYXRlVGltZShlKSA6IGhuLm5vbmUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcHJlY29uZGl0aW9uIGZvciBhIGRvY3VtZW50IGlmIHRoZSBvcGVyYXRpb24gaXMgYW4gdXBkYXRlLlxuICAgICAqLyAgICBwcmVjb25kaXRpb25Gb3JVcGRhdGUodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5yZWFkVmVyc2lvbnMuZ2V0KHQudG9TdHJpbmcoKSk7XG4gICAgICAgIC8vIFRoZSBmaXJzdCB0aW1lIGEgZG9jdW1lbnQgaXMgd3JpdHRlbiwgd2Ugd2FudCB0byB0YWtlIGludG8gYWNjb3VudCB0aGVcbiAgICAgICAgLy8gcmVhZCB0aW1lIGFuZCBleGlzdGVuY2VcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMud3JpdHRlbkRvY3MuaGFzKHQudG9TdHJpbmcoKSkgJiYgZSkge1xuICAgICAgICAgICAgaWYgKGUuaXNFcXVhbChjdC5taW4oKSkpIFxuICAgICAgICAgICAgLy8gVGhlIGRvY3VtZW50IGRvZXNuJ3QgZXhpc3QsIHNvIGZhaWwgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAgICAgICAgLy8gVGhpcyBoYXMgdG8gYmUgdmFsaWRhdGVkIGxvY2FsbHkgYmVjYXVzZSB5b3UgY2FuJ3Qgc2VuZCBhXG4gICAgICAgICAgICAvLyBwcmVjb25kaXRpb24gdGhhdCBhIGRvY3VtZW50IGRvZXMgbm90IGV4aXN0IHdpdGhvdXQgY2hhbmdpbmcgdGhlXG4gICAgICAgICAgICAvLyBzZW1hbnRpY3Mgb2YgdGhlIGJhY2tlbmQgd3JpdGUgdG8gYmUgYW4gaW5zZXJ0LiBUaGlzIGlzIHRoZSByZXZlcnNlXG4gICAgICAgICAgICAvLyBvZiB3aGF0IHdlIHdhbnQsIHNpbmNlIHdlIHdhbnQgdG8gYXNzZXJ0IHRoYXQgdGhlIGRvY3VtZW50IGRvZXNuJ3RcbiAgICAgICAgICAgIC8vIGV4aXN0IGJ1dCB0aGVuIHNlbmQgdGhlIHVwZGF0ZSBhbmQgaGF2ZSBpdCBmYWlsLiBTaW5jZSB3ZSBjYW4ndFxuICAgICAgICAgICAgLy8gZXhwcmVzcyB0aGF0IHRvIHRoZSBiYWNrZW5kLCB3ZSBoYXZlIHRvIHZhbGlkYXRlIGxvY2FsbHkuXG4gICAgICAgICAgICAvLyBOb3RlOiB0aGlzIGNhbiBjaGFuZ2Ugb25jZSB3ZSBjYW4gc2VuZCBzZXBhcmF0ZSB2ZXJpZnkgd3JpdGVzIGluIHRoZVxuICAgICAgICAgICAgLy8gdHJhbnNhY3Rpb24uXG4gICAgICAgICAgICB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIFwiQ2FuJ3QgdXBkYXRlIGEgZG9jdW1lbnQgdGhhdCBkb2Vzbid0IGV4aXN0LlwiKTtcbiAgICAgICAgICAgIC8vIERvY3VtZW50IGV4aXN0cywgYmFzZSBwcmVjb25kaXRpb24gb24gZG9jdW1lbnQgdXBkYXRlIHRpbWUuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaG4udXBkYXRlVGltZShlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBEb2N1bWVudCB3YXMgbm90IHJlYWQsIHNvIHdlIGp1c3QgdXNlIHRoZSBwcmVjb25kaXRpb25zIGZvciBhIGJsaW5kXG4gICAgICAgIC8vIHVwZGF0ZS5cbiAgICAgICAgcmV0dXJuIGhuLmV4aXN0cyghMCk7XG4gICAgfVxuICAgIHdyaXRlKHQpIHtcbiAgICAgICAgdGhpcy5lbnN1cmVDb21taXROb3RDYWxsZWQoKSwgdGhpcy5tdXRhdGlvbnMucHVzaCh0KTtcbiAgICB9XG4gICAgZW5zdXJlQ29tbWl0Tm90Q2FsbGVkKCkge31cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogVHJhbnNhY3Rpb25SdW5uZXIgZW5jYXBzdWxhdGVzIHRoZSBsb2dpYyBuZWVkZWQgdG8gcnVuIGFuZCByZXRyeSB0cmFuc2FjdGlvbnNcbiAqIHdpdGggYmFja29mZi5cbiAqL1xuY2xhc3MgVnUge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgdGhpcy5hc3luY1F1ZXVlID0gdCwgdGhpcy5kYXRhc3RvcmUgPSBlLCB0aGlzLnVwZGF0ZUZ1bmN0aW9uID0gbiwgdGhpcy5kZWZlcnJlZCA9IHMsIFxuICAgICAgICB0aGlzLmJ1ID0gNSwgdGhpcy52byA9IG5ldyAkbyh0aGlzLmFzeW5jUXVldWUsIFwidHJhbnNhY3Rpb25fcmV0cnlcIiAvKiBUcmFuc2FjdGlvblJldHJ5ICovKTtcbiAgICB9XG4gICAgLyoqIFJ1bnMgdGhlIHRyYW5zYWN0aW9uIGFuZCBzZXRzIHRoZSByZXN1bHQgb24gZGVmZXJyZWQuICovICAgIHJ1bigpIHtcbiAgICAgICAgdGhpcy5idSAtPSAxLCB0aGlzLlB1KCk7XG4gICAgfVxuICAgIFB1KCkge1xuICAgICAgICB0aGlzLnZvLnBvKChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0ID0gbmV3IFB1KHRoaXMuZGF0YXN0b3JlKSwgZSA9IHRoaXMuVnUodCk7XG4gICAgICAgICAgICBlICYmIGUudGhlbigoZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hc3luY1F1ZXVlLmVucXVldWVBbmRGb3JnZXQoKCgpID0+IHQuY29tbWl0KCkudGhlbigoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmVycmVkLnJlc29sdmUoZSk7XG4gICAgICAgICAgICAgICAgfSkpLmNhdGNoKCh0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52dSh0KTtcbiAgICAgICAgICAgICAgICB9KSkpKTtcbiAgICAgICAgICAgIH0pKS5jYXRjaCgodCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy52dSh0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBWdSh0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdGhpcy51cGRhdGVGdW5jdGlvbih0KTtcbiAgICAgICAgICAgIHJldHVybiAhU3QoZSkgJiYgZS5jYXRjaCAmJiBlLnRoZW4gPyBlIDogKHRoaXMuZGVmZXJyZWQucmVqZWN0KEVycm9yKFwiVHJhbnNhY3Rpb24gY2FsbGJhY2sgbXVzdCByZXR1cm4gYSBQcm9taXNlXCIpKSwgXG4gICAgICAgICAgICBudWxsKTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgLy8gRG8gbm90IHJldHJ5IGVycm9ycyB0aHJvd24gYnkgdXNlciBwcm92aWRlZCB1cGRhdGVGdW5jdGlvbi5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmVycmVkLnJlamVjdCh0KSwgbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2dSh0KSB7XG4gICAgICAgIHRoaXMuYnUgPiAwICYmIHRoaXMuU3UodCkgPyAodGhpcy5idSAtPSAxLCB0aGlzLmFzeW5jUXVldWUuZW5xdWV1ZUFuZEZvcmdldCgoKCkgPT4gKHRoaXMuUHUoKSwgXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpKSkpKSA6IHRoaXMuZGVmZXJyZWQucmVqZWN0KHQpO1xuICAgIH1cbiAgICBTdSh0KSB7XG4gICAgICAgIGlmIChcIkZpcmViYXNlRXJyb3JcIiA9PT0gdC5uYW1lKSB7XG4gICAgICAgICAgICAvLyBJbiB0cmFuc2FjdGlvbnMsIHRoZSBiYWNrZW5kIHdpbGwgZmFpbCBvdXRkYXRlZCByZWFkcyB3aXRoIEZBSUxFRF9QUkVDT05ESVRJT04gYW5kXG4gICAgICAgICAgICAvLyBub24tbWF0Y2hpbmcgZG9jdW1lbnQgdmVyc2lvbnMgd2l0aCBBQk9SVEVELiBUaGVzZSBlcnJvcnMgc2hvdWxkIGJlIHJldHJpZWQuXG4gICAgICAgICAgICBjb25zdCBlID0gdC5jb2RlO1xuICAgICAgICAgICAgcmV0dXJuIFwiYWJvcnRlZFwiID09PSBlIHx8IFwiZmFpbGVkLXByZWNvbmRpdGlvblwiID09PSBlIHx8ICF2bihlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gITE7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBGaXJlc3RvcmVDbGllbnQgaXMgYSB0b3AtbGV2ZWwgY2xhc3MgdGhhdCBjb25zdHJ1Y3RzIGFuZCBvd25zIGFsbCBvZiB0aGVcbiAqIHBpZWNlcyBvZiB0aGUgY2xpZW50IFNESyBhcmNoaXRlY3R1cmUuIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGVcbiAqIGFzeW5jIHF1ZXVlIHRoYXQgaXMgc2hhcmVkIGJ5IGFsbCBvZiB0aGUgb3RoZXIgY29tcG9uZW50cyBpbiB0aGUgc3lzdGVtLlxuICovXG5jbGFzcyB2dSB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgXG4gICAgLyoqXG4gICAgICogQXN5bmNocm9ub3VzIHF1ZXVlIHJlc3BvbnNpYmxlIGZvciBhbGwgb2Ygb3VyIGludGVybmFsIHByb2Nlc3NpbmcuIFdoZW5cbiAgICAgKiB3ZSBnZXQgaW5jb21pbmcgd29yayBmcm9tIHRoZSB1c2VyICh2aWEgcHVibGljIEFQSSkgb3IgdGhlIG5ldHdvcmtcbiAgICAgKiAoaW5jb21pbmcgR1JQQyBtZXNzYWdlcyksIHdlIHNob3VsZCBhbHdheXMgc2NoZWR1bGUgb250byB0aGlzIHF1ZXVlLlxuICAgICAqIFRoaXMgZW5zdXJlcyBhbGwgb2Ygb3VyIHdvcmsgaXMgcHJvcGVybHkgc2VyaWFsaXplZCAoZS5nLiB3ZSBkb24ndFxuICAgICAqIHN0YXJ0IHByb2Nlc3NpbmcgYSBuZXcgb3BlcmF0aW9uIHdoaWxlIHRoZSBwcmV2aW91cyBvbmUgaXMgd2FpdGluZyBmb3JcbiAgICAgKiBhbiBhc3luYyBJL08gdG8gY29tcGxldGUpLlxuICAgICAqL1xuICAgIG4sIHMpIHtcbiAgICAgICAgdGhpcy5hdXRoQ3JlZGVudGlhbHMgPSB0LCB0aGlzLmFwcENoZWNrQ3JlZGVudGlhbHMgPSBlLCB0aGlzLmFzeW5jUXVldWUgPSBuLCB0aGlzLmRhdGFiYXNlSW5mbyA9IHMsIFxuICAgICAgICB0aGlzLnVzZXIgPSBDLlVOQVVUSEVOVElDQVRFRCwgdGhpcy5jbGllbnRJZCA9IGl0LlIoKSwgdGhpcy5hdXRoQ3JlZGVudGlhbExpc3RlbmVyID0gKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCksIFxuICAgICAgICB0aGlzLmFwcENoZWNrQ3JlZGVudGlhbExpc3RlbmVyID0gKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCksIHRoaXMuYXV0aENyZWRlbnRpYWxzLnN0YXJ0KG4sIChhc3luYyB0ID0+IHtcbiAgICAgICAgICAgIE8oXCJGaXJlc3RvcmVDbGllbnRcIiwgXCJSZWNlaXZlZCB1c2VyPVwiLCB0LnVpZCksIGF3YWl0IHRoaXMuYXV0aENyZWRlbnRpYWxMaXN0ZW5lcih0KSwgXG4gICAgICAgICAgICB0aGlzLnVzZXIgPSB0O1xuICAgICAgICB9KSksIHRoaXMuYXBwQ2hlY2tDcmVkZW50aWFscy5zdGFydChuLCAodCA9PiAoTyhcIkZpcmVzdG9yZUNsaWVudFwiLCBcIlJlY2VpdmVkIG5ldyBhcHAgY2hlY2sgdG9rZW49XCIsIHQpLCBcbiAgICAgICAgdGhpcy5hcHBDaGVja0NyZWRlbnRpYWxMaXN0ZW5lcih0LCB0aGlzLnVzZXIpKSkpO1xuICAgIH1cbiAgICBhc3luYyBnZXRDb25maWd1cmF0aW9uKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYXN5bmNRdWV1ZTogdGhpcy5hc3luY1F1ZXVlLFxuICAgICAgICAgICAgZGF0YWJhc2VJbmZvOiB0aGlzLmRhdGFiYXNlSW5mbyxcbiAgICAgICAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxuICAgICAgICAgICAgYXV0aENyZWRlbnRpYWxzOiB0aGlzLmF1dGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgIGFwcENoZWNrQ3JlZGVudGlhbHM6IHRoaXMuYXBwQ2hlY2tDcmVkZW50aWFscyxcbiAgICAgICAgICAgIGluaXRpYWxVc2VyOiB0aGlzLnVzZXIsXG4gICAgICAgICAgICBtYXhDb25jdXJyZW50TGltYm9SZXNvbHV0aW9uczogMTAwXG4gICAgICAgIH07XG4gICAgfVxuICAgIHNldENyZWRlbnRpYWxDaGFuZ2VMaXN0ZW5lcih0KSB7XG4gICAgICAgIHRoaXMuYXV0aENyZWRlbnRpYWxMaXN0ZW5lciA9IHQ7XG4gICAgfVxuICAgIHNldEFwcENoZWNrVG9rZW5DaGFuZ2VMaXN0ZW5lcih0KSB7XG4gICAgICAgIHRoaXMuYXBwQ2hlY2tDcmVkZW50aWFsTGlzdGVuZXIgPSB0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgdGhhdCB0aGUgY2xpZW50IGhhcyBub3QgYmVlbiB0ZXJtaW5hdGVkLiBFbnN1cmVzIHRoYXQgb3RoZXIgbWV0aG9kcyBvblxuICAgICAqIHRoaXMgY2xhc3MgY2Fubm90IGJlIGNhbGxlZCBhZnRlciB0aGUgY2xpZW50IGlzIHRlcm1pbmF0ZWQuXG4gICAgICovICAgIHZlcmlmeU5vdFRlcm1pbmF0ZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLmFzeW5jUXVldWUuaXNTaHV0dGluZ0Rvd24pIHRocm93IG5ldyBRKEcuRkFJTEVEX1BSRUNPTkRJVElPTiwgXCJUaGUgY2xpZW50IGhhcyBhbHJlYWR5IGJlZW4gdGVybWluYXRlZC5cIik7XG4gICAgfVxuICAgIHRlcm1pbmF0ZSgpIHtcbiAgICAgICAgdGhpcy5hc3luY1F1ZXVlLmVudGVyUmVzdHJpY3RlZE1vZGUoKTtcbiAgICAgICAgY29uc3QgdCA9IG5ldyBqO1xuICAgICAgICByZXR1cm4gdGhpcy5hc3luY1F1ZXVlLmVucXVldWVBbmRGb3JnZXRFdmVuV2hpbGVSZXN0cmljdGVkKChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMub25saW5lQ29tcG9uZW50cyAmJiBhd2FpdCB0aGlzLm9ubGluZUNvbXBvbmVudHMudGVybWluYXRlKCksIHRoaXMub2ZmbGluZUNvbXBvbmVudHMgJiYgYXdhaXQgdGhpcy5vZmZsaW5lQ29tcG9uZW50cy50ZXJtaW5hdGUoKSwgXG4gICAgICAgICAgICAgICAgLy8gVGhlIGNyZWRlbnRpYWxzIHByb3ZpZGVyIG11c3QgYmUgdGVybWluYXRlZCBhZnRlciBzaHV0dGluZyBkb3duIHRoZVxuICAgICAgICAgICAgICAgIC8vIFJlbW90ZVN0b3JlIGFzIGl0IHdpbGwgcHJldmVudCB0aGUgUmVtb3RlU3RvcmUgZnJvbSByZXRyaWV2aW5nIGF1dGhcbiAgICAgICAgICAgICAgICAvLyB0b2tlbnMuXG4gICAgICAgICAgICAgICAgdGhpcy5hdXRoQ3JlZGVudGlhbHMuc2h1dGRvd24oKSwgdGhpcy5hcHBDaGVja0NyZWRlbnRpYWxzLnNodXRkb3duKCksIHQucmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBwYShlLCBcIkZhaWxlZCB0byBzaHV0ZG93biBwZXJzaXN0ZW5jZVwiKTtcbiAgICAgICAgICAgICAgICB0LnJlamVjdChuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpLCB0LnByb21pc2U7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBTdSh0LCBlKSB7XG4gICAgdC5hc3luY1F1ZXVlLnZlcmlmeU9wZXJhdGlvbkluUHJvZ3Jlc3MoKSwgTyhcIkZpcmVzdG9yZUNsaWVudFwiLCBcIkluaXRpYWxpemluZyBPZmZsaW5lQ29tcG9uZW50UHJvdmlkZXJcIik7XG4gICAgY29uc3QgbiA9IGF3YWl0IHQuZ2V0Q29uZmlndXJhdGlvbigpO1xuICAgIGF3YWl0IGUuaW5pdGlhbGl6ZShuKTtcbiAgICBsZXQgcyA9IG4uaW5pdGlhbFVzZXI7XG4gICAgdC5zZXRDcmVkZW50aWFsQ2hhbmdlTGlzdGVuZXIoKGFzeW5jIHQgPT4ge1xuICAgICAgICBzLmlzRXF1YWwodCkgfHwgKGF3YWl0IFdyKGUubG9jYWxTdG9yZSwgdCksIHMgPSB0KTtcbiAgICB9KSksIFxuICAgIC8vIFdoZW4gYSB1c2VyIGNhbGxzIGNsZWFyUGVyc2lzdGVuY2UoKSBpbiBvbmUgY2xpZW50LCBhbGwgb3RoZXIgY2xpZW50c1xuICAgIC8vIG5lZWQgdG8gYmUgdGVybWluYXRlZCB0byBhbGxvdyB0aGUgZGVsZXRlIHRvIHN1Y2NlZWQuXG4gICAgZS5wZXJzaXN0ZW5jZS5zZXREYXRhYmFzZURlbGV0ZWRMaXN0ZW5lcigoKCkgPT4gdC50ZXJtaW5hdGUoKSkpLCB0Lm9mZmxpbmVDb21wb25lbnRzID0gZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gRHUodCwgZSkge1xuICAgIHQuYXN5bmNRdWV1ZS52ZXJpZnlPcGVyYXRpb25JblByb2dyZXNzKCk7XG4gICAgY29uc3QgbiA9IGF3YWl0IEN1KHQpO1xuICAgIE8oXCJGaXJlc3RvcmVDbGllbnRcIiwgXCJJbml0aWFsaXppbmcgT25saW5lQ29tcG9uZW50UHJvdmlkZXJcIik7XG4gICAgY29uc3QgcyA9IGF3YWl0IHQuZ2V0Q29uZmlndXJhdGlvbigpO1xuICAgIGF3YWl0IGUuaW5pdGlhbGl6ZShuLCBzKSwgXG4gICAgLy8gVGhlIENyZWRlbnRpYWxDaGFuZ2VMaXN0ZW5lciBvZiB0aGUgb25saW5lIGNvbXBvbmVudCBwcm92aWRlciB0YWtlc1xuICAgIC8vIHByZWNlZGVuY2Ugb3ZlciB0aGUgb2ZmbGluZSBjb21wb25lbnQgcHJvdmlkZXIuXG4gICAgdC5zZXRDcmVkZW50aWFsQ2hhbmdlTGlzdGVuZXIoKHQgPT4gX2EoZS5yZW1vdGVTdG9yZSwgdCkpKSwgdC5zZXRBcHBDaGVja1Rva2VuQ2hhbmdlTGlzdGVuZXIoKCh0LCBuKSA9PiBfYShlLnJlbW90ZVN0b3JlLCBuKSkpLCBcbiAgICB0Lm9ubGluZUNvbXBvbmVudHMgPSBlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBDdSh0KSB7XG4gICAgcmV0dXJuIHQub2ZmbGluZUNvbXBvbmVudHMgfHwgKE8oXCJGaXJlc3RvcmVDbGllbnRcIiwgXCJVc2luZyBkZWZhdWx0IE9mZmxpbmVDb21wb25lbnRQcm92aWRlclwiKSwgXG4gICAgYXdhaXQgU3UodCwgbmV3IHB1KSksIHQub2ZmbGluZUNvbXBvbmVudHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHh1KHQpIHtcbiAgICByZXR1cm4gdC5vbmxpbmVDb21wb25lbnRzIHx8IChPKFwiRmlyZXN0b3JlQ2xpZW50XCIsIFwiVXNpbmcgZGVmYXVsdCBPbmxpbmVDb21wb25lbnRQcm92aWRlclwiKSwgXG4gICAgYXdhaXQgRHUodCwgbmV3IEV1KSksIHQub25saW5lQ29tcG9uZW50cztcbn1cblxuZnVuY3Rpb24gTnUodCkge1xuICAgIHJldHVybiBDdSh0KS50aGVuKCh0ID0+IHQucGVyc2lzdGVuY2UpKTtcbn1cblxuZnVuY3Rpb24ga3UodCkge1xuICAgIHJldHVybiBDdSh0KS50aGVuKCh0ID0+IHQubG9jYWxTdG9yZSkpO1xufVxuXG5mdW5jdGlvbiBNdSh0KSB7XG4gICAgcmV0dXJuIHh1KHQpLnRoZW4oKHQgPT4gdC5yZW1vdGVTdG9yZSkpO1xufVxuXG5mdW5jdGlvbiBPdSh0KSB7XG4gICAgcmV0dXJuIHh1KHQpLnRoZW4oKHQgPT4gdC5zeW5jRW5naW5lKSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uICR1KHQpIHtcbiAgICBjb25zdCBlID0gYXdhaXQgeHUodCksIG4gPSBlLmV2ZW50TWFuYWdlcjtcbiAgICByZXR1cm4gbi5vbkxpc3RlbiA9IHFhLmJpbmQobnVsbCwgZS5zeW5jRW5naW5lKSwgbi5vblVubGlzdGVuID0gS2EuYmluZChudWxsLCBlLnN5bmNFbmdpbmUpLCBcbiAgICBuO1xufVxuXG4vKiogRW5hYmxlcyB0aGUgbmV0d29yayBjb25uZWN0aW9uIGFuZCByZS1lbnF1ZXVlcyBhbGwgcGVuZGluZyBvcGVyYXRpb25zLiAqLyBmdW5jdGlvbiBGdSh0KSB7XG4gICAgcmV0dXJuIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlKChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGUgPSBhd2FpdCBOdSh0KSwgbiA9IGF3YWl0IE11KHQpO1xuICAgICAgICByZXR1cm4gZS5zZXROZXR3b3JrRW5hYmxlZCghMCksIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBLKHQpO1xuICAgICAgICAgICAgcmV0dXJuIGUuaGEuZGVsZXRlKDAgLyogVXNlckRpc2FibGVkICovKSwgR28oZSk7XG4gICAgICAgIH0obik7XG4gICAgfSkpO1xufVxuXG4vKiogRGlzYWJsZXMgdGhlIG5ldHdvcmsgY29ubmVjdGlvbi4gUGVuZGluZyBvcGVyYXRpb25zIHdpbGwgbm90IGNvbXBsZXRlLiAqLyBmdW5jdGlvbiBCdSh0KSB7XG4gICAgcmV0dXJuIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlKChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGUgPSBhd2FpdCBOdSh0KSwgbiA9IGF3YWl0IE11KHQpO1xuICAgICAgICByZXR1cm4gZS5zZXROZXR3b3JrRW5hYmxlZCghMSksIGFzeW5jIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBLKHQpO1xuICAgICAgICAgICAgZS5oYS5hZGQoMCAvKiBVc2VyRGlzYWJsZWQgKi8pLCBhd2FpdCBRbyhlKSwgXG4gICAgICAgICAgICAvLyBTZXQgdGhlIE9ubGluZVN0YXRlIHRvIE9mZmxpbmUgc28gZ2V0KClzIHJldHVybiBmcm9tIGNhY2hlLCBldGMuXG4gICAgICAgICAgICBlLmRhLnNldChcIk9mZmxpbmVcIiAvKiBPZmZsaW5lICovKTtcbiAgICAgICAgfShuKTtcbiAgICB9KSk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCB3cml0ZXMgdGhhdCB3ZXJlIHBlbmRpbmcgYXQgdGhlIHRpbWVcbiAqIHRoaXMgbWV0aG9kIHdhcyBjYWxsZWQgcmVjZWl2ZWQgc2VydmVyIGFja25vd2xlZGdlbWVudC4gQW4gYWNrbm93bGVkZ2VtZW50XG4gKiBjYW4gYmUgZWl0aGVyIGFjY2VwdGFuY2Ugb3IgcmVqZWN0aW9uLlxuICovIGZ1bmN0aW9uIEx1KHQsIGUpIHtcbiAgICBjb25zdCBuID0gbmV3IGo7XG4gICAgcmV0dXJuIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0KChhc3luYyAoKSA9PiBhc3luYyBmdW5jdGlvbih0LCBlLCBuKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzID0gYXdhaXQgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBLKHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuLnBlcnNpc3RlbmNlLnJ1blRyYW5zYWN0aW9uKFwicmVhZCBkb2N1bWVudFwiLCBcInJlYWRvbmx5XCIsICh0ID0+IG4udWkuQnModCwgZSkpKTtcbiAgICAgICAgICAgIH0odCwgZSk7XG4gICAgICAgICAgICBzLmlzRm91bmREb2N1bWVudCgpID8gbi5yZXNvbHZlKHMpIDogcy5pc05vRG9jdW1lbnQoKSA/IG4ucmVzb2x2ZShudWxsKSA6IG4ucmVqZWN0KG5ldyBRKEcuVU5BVkFJTEFCTEUsIFwiRmFpbGVkIHRvIGdldCBkb2N1bWVudCBmcm9tIGNhY2hlLiAoSG93ZXZlciwgdGhpcyBkb2N1bWVudCBtYXkgZXhpc3Qgb24gdGhlIHNlcnZlci4gUnVuIGFnYWluIHdpdGhvdXQgc2V0dGluZyAnc291cmNlJyBpbiB0aGUgR2V0T3B0aW9ucyB0byBhdHRlbXB0IHRvIHJldHJpZXZlIHRoZSBkb2N1bWVudCBmcm9tIHRoZSBzZXJ2ZXIuKVwiKSk7XG4gICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBwYSh0LCBgRmFpbGVkIHRvIGdldCBkb2N1bWVudCAnJHtlfSBmcm9tIGNhY2hlYCk7XG4gICAgICAgICAgICBuLnJlamVjdChzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAqIFJldHJpZXZlcyBhIGxhdGVuY3ktY29tcGVuc2F0ZWQgZG9jdW1lbnQgZnJvbSB0aGUgYmFja2VuZCB2aWEgYVxuICogU25hcHNob3RMaXN0ZW5lci5cbiAqLyAoYXdhaXQga3UodCksIGUsIG4pKSksIG4ucHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gcXUodCwgZSwgbiA9IHt9KSB7XG4gICAgY29uc3QgcyA9IG5ldyBqO1xuICAgIHJldHVybiB0LmFzeW5jUXVldWUuZW5xdWV1ZUFuZEZvcmdldCgoYXN5bmMgKCkgPT4gZnVuY3Rpb24odCwgZSwgbiwgcywgaSkge1xuICAgICAgICBjb25zdCByID0gbmV3IFJ1KHtcbiAgICAgICAgICAgIG5leHQ6IHIgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBxdWVyeSBmaXJzdCBiZWZvcmUgcGFzc2luZyBldmVudCB0byB1c2VyIHRvIGF2b2lkXG4gICAgICAgICAgICAgICAgLy8gdXNlciBhY3Rpb25zIGFmZmVjdGluZyB0aGUgbm93IHN0YWxlIHF1ZXJ5LlxuICAgICAgICAgICAgICAgIGUuZW5xdWV1ZUFuZEZvcmdldCgoKCkgPT4gUGEodCwgbykpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhID0gci5kb2NzLmhhcyhuKTtcbiAgICAgICAgICAgICAgICAhYSAmJiByLmZyb21DYWNoZSA/IFxuICAgICAgICAgICAgICAgIC8vIFRPRE8oZGltb25kKTogSWYgd2UncmUgb25saW5lIGFuZCB0aGUgZG9jdW1lbnQgZG9lc24ndFxuICAgICAgICAgICAgICAgIC8vIGV4aXN0IHRoZW4gd2UgcmVzb2x2ZSB3aXRoIGEgZG9jLmV4aXN0cyBzZXQgdG8gZmFsc2UuIElmXG4gICAgICAgICAgICAgICAgLy8gd2UncmUgb2ZmbGluZSBob3dldmVyLCB3ZSByZWplY3QgdGhlIFByb21pc2UgaW4gdGhpc1xuICAgICAgICAgICAgICAgIC8vIGNhc2UuIFR3byBvcHRpb25zOiAxKSBDYWNoZSB0aGUgbmVnYXRpdmUgcmVzcG9uc2UgZnJvbVxuICAgICAgICAgICAgICAgIC8vIHRoZSBzZXJ2ZXIgc28gd2UgY2FuIGRlbGl2ZXIgdGhhdCBldmVuIHdoZW4geW91J3JlXG4gICAgICAgICAgICAgICAgLy8gb2ZmbGluZSAyKSBBY3R1YWxseSByZWplY3QgdGhlIFByb21pc2UgaW4gdGhlIG9ubGluZSBjYXNlXG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIGRvY3VtZW50IGRvZXNuJ3QgZXhpc3QuXG4gICAgICAgICAgICAgICAgaS5yZWplY3QobmV3IFEoRy5VTkFWQUlMQUJMRSwgXCJGYWlsZWQgdG8gZ2V0IGRvY3VtZW50IGJlY2F1c2UgdGhlIGNsaWVudCBpcyBvZmZsaW5lLlwiKSkgOiBhICYmIHIuZnJvbUNhY2hlICYmIHMgJiYgXCJzZXJ2ZXJcIiA9PT0gcy5zb3VyY2UgPyBpLnJlamVjdChuZXcgUShHLlVOQVZBSUxBQkxFLCAnRmFpbGVkIHRvIGdldCBkb2N1bWVudCBmcm9tIHNlcnZlci4gKEhvd2V2ZXIsIHRoaXMgZG9jdW1lbnQgZG9lcyBleGlzdCBpbiB0aGUgbG9jYWwgY2FjaGUuIFJ1biBhZ2FpbiB3aXRob3V0IHNldHRpbmcgc291cmNlIHRvIFwic2VydmVyXCIgdG8gcmV0cmlldmUgdGhlIGNhY2hlZCBkb2N1bWVudC4pJykpIDogaS5yZXNvbHZlKHIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiB0ID0+IGkucmVqZWN0KHQpXG4gICAgICAgIH0pLCBvID0gbmV3IERhKERlKG4ucGF0aCksIHIsIHtcbiAgICAgICAgICAgIGluY2x1ZGVNZXRhZGF0YUNoYW5nZXM6ICEwLFxuICAgICAgICAgICAgU2E6ICEwXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYmEodCwgbyk7XG4gICAgfShhd2FpdCAkdSh0KSwgdC5hc3luY1F1ZXVlLCBlLCBuLCBzKSkpLCBzLnByb21pc2U7XG59XG5cbmZ1bmN0aW9uIFV1KHQsIGUpIHtcbiAgICBjb25zdCBuID0gbmV3IGo7XG4gICAgcmV0dXJuIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0KChhc3luYyAoKSA9PiBhc3luYyBmdW5jdGlvbih0LCBlLCBuKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzID0gYXdhaXQgZW8odCwgZSwgXG4gICAgICAgICAgICAvKiB1c2VQcmV2aW91c1Jlc3VsdHM9ICovICEwKSwgaSA9IG5ldyAkYShlLCBzLmhpKSwgciA9IGkuTGEocy5kb2N1bWVudHMpLCBvID0gaS5hcHBseUNoYW5nZXMociwgXG4gICAgICAgICAgICAvKiB1cGRhdGVMaW1ib0RvY3VtZW50cz0gKi8gITEpO1xuICAgICAgICAgICAgbi5yZXNvbHZlKG8uc25hcHNob3QpO1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICBjb25zdCBzID0gcGEodCwgYEZhaWxlZCB0byBleGVjdXRlIHF1ZXJ5ICcke2V9IGFnYWluc3QgY2FjaGVgKTtcbiAgICAgICAgICAgIG4ucmVqZWN0KHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICogUmV0cmlldmVzIGEgbGF0ZW5jeS1jb21wZW5zYXRlZCBxdWVyeSBzbmFwc2hvdCBmcm9tIHRoZSBiYWNrZW5kIHZpYSBhXG4gKiBTbmFwc2hvdExpc3RlbmVyLlxuICovIChhd2FpdCBrdSh0KSwgZSwgbikpKSwgbi5wcm9taXNlO1xufVxuXG5mdW5jdGlvbiBLdSh0LCBlLCBuID0ge30pIHtcbiAgICBjb25zdCBzID0gbmV3IGo7XG4gICAgcmV0dXJuIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0KChhc3luYyAoKSA9PiBmdW5jdGlvbih0LCBlLCBuLCBzLCBpKSB7XG4gICAgICAgIGNvbnN0IHIgPSBuZXcgUnUoe1xuICAgICAgICAgICAgbmV4dDogbiA9PiB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHF1ZXJ5IGZpcnN0IGJlZm9yZSBwYXNzaW5nIGV2ZW50IHRvIHVzZXIgdG8gYXZvaWRcbiAgICAgICAgICAgICAgICAvLyB1c2VyIGFjdGlvbnMgYWZmZWN0aW5nIHRoZSBub3cgc3RhbGUgcXVlcnkuXG4gICAgICAgICAgICAgICAgZS5lbnF1ZXVlQW5kRm9yZ2V0KCgoKSA9PiBQYSh0LCBvKSkpLCBuLmZyb21DYWNoZSAmJiBcInNlcnZlclwiID09PSBzLnNvdXJjZSA/IGkucmVqZWN0KG5ldyBRKEcuVU5BVkFJTEFCTEUsICdGYWlsZWQgdG8gZ2V0IGRvY3VtZW50cyBmcm9tIHNlcnZlci4gKEhvd2V2ZXIsIHRoZXNlIGRvY3VtZW50cyBtYXkgZXhpc3QgaW4gdGhlIGxvY2FsIGNhY2hlLiBSdW4gYWdhaW4gd2l0aG91dCBzZXR0aW5nIHNvdXJjZSB0byBcInNlcnZlclwiIHRvIHJldHJpZXZlIHRoZSBjYWNoZWQgZG9jdW1lbnRzLiknKSkgOiBpLnJlc29sdmUobik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6IHQgPT4gaS5yZWplY3QodClcbiAgICAgICAgfSksIG8gPSBuZXcgRGEobiwgciwge1xuICAgICAgICAgICAgaW5jbHVkZU1ldGFkYXRhQ2hhbmdlczogITAsXG4gICAgICAgICAgICBTYTogITBcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBiYSh0LCBvKTtcbiAgICB9KGF3YWl0ICR1KHQpLCB0LmFzeW5jUXVldWUsIGUsIG4sIHMpKSksIHMucHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gR3UodCwgZSkge1xuICAgIGNvbnN0IG4gPSBuZXcgUnUoZSk7XG4gICAgcmV0dXJuIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0KChhc3luYyAoKSA9PiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIEsodCkuSWEuYWRkKGUpLCBcbiAgICAgICAgLy8gSW1tZWRpYXRlbHkgZmlyZSBhbiBpbml0aWFsIGV2ZW50LCBpbmRpY2F0aW5nIGFsbCBleGlzdGluZyBsaXN0ZW5lcnNcbiAgICAgICAgLy8gYXJlIGluLXN5bmMuXG4gICAgICAgIGUubmV4dCgpO1xuICAgIH0oYXdhaXQgJHUodCksIG4pKSksICgpID0+IHtcbiAgICAgICAgbi5tdSgpLCB0LmFzeW5jUXVldWUuZW5xdWV1ZUFuZEZvcmdldCgoYXN5bmMgKCkgPT4gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgSyh0KS5JYS5kZWxldGUoZSk7XG4gICAgICAgIH0oYXdhaXQgJHUodCksIG4pKSk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBUYWtlcyBhbiB1cGRhdGVGdW5jdGlvbiBpbiB3aGljaCBhIHNldCBvZiByZWFkcyBhbmQgd3JpdGVzIGNhbiBiZSBwZXJmb3JtZWRcbiAqIGF0b21pY2FsbHkuIEluIHRoZSB1cGRhdGVGdW5jdGlvbiwgdGhlIGNsaWVudCBjYW4gcmVhZCBhbmQgd3JpdGUgdmFsdWVzXG4gKiB1c2luZyB0aGUgc3VwcGxpZWQgdHJhbnNhY3Rpb24gb2JqZWN0LiBBZnRlciB0aGUgdXBkYXRlRnVuY3Rpb24sIGFsbFxuICogY2hhbmdlcyB3aWxsIGJlIGNvbW1pdHRlZC4gSWYgYSByZXRyeWFibGUgZXJyb3Igb2NjdXJzIChleDogc29tZSBvdGhlclxuICogY2xpZW50IGhhcyBjaGFuZ2VkIGFueSBvZiB0aGUgZGF0YSByZWZlcmVuY2VkKSwgdGhlbiB0aGUgdXBkYXRlRnVuY3Rpb25cbiAqIHdpbGwgYmUgY2FsbGVkIGFnYWluIGFmdGVyIGEgYmFja29mZi4gSWYgdGhlIHVwZGF0ZUZ1bmN0aW9uIHN0aWxsIGZhaWxzXG4gKiBhZnRlciBhbGwgcmV0cmllcywgdGhlbiB0aGUgdHJhbnNhY3Rpb24gd2lsbCBiZSByZWplY3RlZC5cbiAqXG4gKiBUaGUgdHJhbnNhY3Rpb24gb2JqZWN0IHBhc3NlZCB0byB0aGUgdXBkYXRlRnVuY3Rpb24gY29udGFpbnMgbWV0aG9kcyBmb3JcbiAqIGFjY2Vzc2luZyBkb2N1bWVudHMgYW5kIGNvbGxlY3Rpb25zLiBVbmxpa2Ugb3RoZXIgZGF0YXN0b3JlIGFjY2VzcywgZGF0YVxuICogYWNjZXNzZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24gd2lsbCBub3QgcmVmbGVjdCBsb2NhbCBjaGFuZ2VzIHRoYXQgaGF2ZSBub3RcbiAqIGJlZW4gY29tbWl0dGVkLiBGb3IgdGhpcyByZWFzb24sIGl0IGlzIHJlcXVpcmVkIHRoYXQgYWxsIHJlYWRzIGFyZVxuICogcGVyZm9ybWVkIGJlZm9yZSBhbnkgd3JpdGVzLiBUcmFuc2FjdGlvbnMgbXVzdCBiZSBwZXJmb3JtZWQgd2hpbGUgb25saW5lLlxuICovIGZ1bmN0aW9uIFF1KHQsIGUpIHtcbiAgICBjb25zdCBuID0gbmV3IGo7XG4gICAgcmV0dXJuIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0KChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHMgPSBhd2FpdCBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICByZXR1cm4geHUodCkudGhlbigodCA9PiB0LmRhdGFzdG9yZSkpO1xuICAgICAgICB9KHQpO1xuICAgICAgICBuZXcgVnUodC5hc3luY1F1ZXVlLCBzLCBlLCBuKS5ydW4oKTtcbiAgICB9KSksIG4ucHJvbWlzZTtcbn1cblxuZnVuY3Rpb24ganUodCwgZSwgbiwgcykge1xuICAgIGNvbnN0IGkgPSBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIGxldCBuO1xuICAgICAgICBuID0gXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCA/IChuZXcgVGV4dEVuY29kZXIpLmVuY29kZSh0KSA6IHQ7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGJ1KHQsIGUpO1xuICAgICAgICB9KGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgVWludDhBcnJheSkgcmV0dXJuIEF1KHQsIGUpO1xuICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgcmV0dXJuIEF1KG5ldyBVaW50OEFycmF5KHQpLCBlKTtcbiAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgUmVhZGFibGVTdHJlYW0pIHJldHVybiB0LmdldFJlYWRlcigpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU291cmNlIG9mIGB0b0J5dGVTdHJlYW1SZWFkZXJgIGhhcyB0byBiZSBhIEFycmF5QnVmZmVyIG9yIFJlYWRhYmxlU3RyZWFtXCIpO1xuICAgICAgICB9KG4pLCBlKTtcbiAgICB9XG4gICAgLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gKG4sIE9vKGUpKTtcbiAgICB0LmFzeW5jUXVldWUuZW5xdWV1ZUFuZEZvcmdldCgoYXN5bmMgKCkgPT4ge1xuICAgICAgICB5dShhd2FpdCBPdSh0KSwgaSwgcyk7XG4gICAgfSkpO1xufVxuXG5mdW5jdGlvbiBXdSh0LCBlKSB7XG4gICAgcmV0dXJuIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlKChhc3luYyAoKSA9PiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBLKHQpO1xuICAgICAgICByZXR1cm4gbi5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIkdldCBuYW1lZCBxdWVyeVwiLCBcInJlYWRvbmx5XCIsICh0ID0+IG4uZnMuZ2V0TmFtZWRRdWVyeSh0LCBlKSkpO1xuICAgIH0oYXdhaXQga3UodCksIGUpKSk7XG59XG5cbmNvbnN0IHp1ID0gbmV3IE1hcDtcblxuLyoqXG4gKiBBbiBpbnN0YW5jZSBtYXAgdGhhdCBlbnN1cmVzIG9ubHkgb25lIERhdGFzdG9yZSBleGlzdHMgcGVyIEZpcmVzdG9yZVxuICogaW5zdGFuY2UuXG4gKi9cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5mdW5jdGlvbiBIdSh0LCBlLCBuKSB7XG4gICAgaWYgKCFuKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIGBGdW5jdGlvbiAke3R9KCkgY2Fubm90IGJlIGNhbGxlZCB3aXRoIGFuIGVtcHR5ICR7ZX0uYCk7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoYXQgdHdvIGJvb2xlYW4gb3B0aW9ucyBhcmUgbm90IHNldCBhdCB0aGUgc2FtZSB0aW1lLlxuICogQGludGVybmFsXG4gKi8gZnVuY3Rpb24gSnUodCwgZSwgbiwgcykge1xuICAgIGlmICghMCA9PT0gZSAmJiAhMCA9PT0gcykgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBgJHt0fSBhbmQgJHtufSBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci5gKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhhdCBgcGF0aGAgcmVmZXJzIHRvIGEgZG9jdW1lbnQgKGluZGljYXRlZCBieSB0aGUgZmFjdCBpdCBjb250YWluc1xuICogYW4gZXZlbiBudW1iZXJzIG9mIHNlZ21lbnRzKS5cbiAqLyBmdW5jdGlvbiBZdSh0KSB7XG4gICAgaWYgKCF4dC5pc0RvY3VtZW50S2V5KHQpKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIGBJbnZhbGlkIGRvY3VtZW50IHJlZmVyZW5jZS4gRG9jdW1lbnQgcmVmZXJlbmNlcyBtdXN0IGhhdmUgYW4gZXZlbiBudW1iZXIgb2Ygc2VnbWVudHMsIGJ1dCAke3R9IGhhcyAke3QubGVuZ3RofS5gKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhhdCBgcGF0aGAgcmVmZXJzIHRvIGEgY29sbGVjdGlvbiAoaW5kaWNhdGVkIGJ5IHRoZSBmYWN0IGl0XG4gKiBjb250YWlucyBhbiBvZGQgbnVtYmVycyBvZiBzZWdtZW50cykuXG4gKi8gZnVuY3Rpb24gWHUodCkge1xuICAgIGlmICh4dC5pc0RvY3VtZW50S2V5KHQpKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIGBJbnZhbGlkIGNvbGxlY3Rpb24gcmVmZXJlbmNlLiBDb2xsZWN0aW9uIHJlZmVyZW5jZXMgbXVzdCBoYXZlIGFuIG9kZCBudW1iZXIgb2Ygc2VnbWVudHMsIGJ1dCAke3R9IGhhcyAke3QubGVuZ3RofS5gKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgaXQncyBhIG5vbi1udWxsIG9iamVjdCB3aXRob3V0IGEgY3VzdG9tIHByb3RvdHlwZVxuICogKGkuZS4gZXhjbHVkZXMgQXJyYXksIERhdGUsIGV0Yy4pLlxuICovXG4vKiogUmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSB0eXBlIC8gdmFsdWUgb2YgdGhlIHByb3ZpZGVkIGlucHV0LiAqL1xuZnVuY3Rpb24gWnUodCkge1xuICAgIGlmICh2b2lkIDAgPT09IHQpIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICAgIGlmIChudWxsID09PSB0KSByZXR1cm4gXCJudWxsXCI7XG4gICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIHQpIHJldHVybiB0Lmxlbmd0aCA+IDIwICYmICh0ID0gYCR7dC5zdWJzdHJpbmcoMCwgMjApfS4uLmApLCBcbiAgICBKU09OLnN0cmluZ2lmeSh0KTtcbiAgICBpZiAoXCJudW1iZXJcIiA9PSB0eXBlb2YgdCB8fCBcImJvb2xlYW5cIiA9PSB0eXBlb2YgdCkgcmV0dXJuIFwiXCIgKyB0O1xuICAgIGlmIChcIm9iamVjdFwiID09IHR5cGVvZiB0KSB7XG4gICAgICAgIGlmICh0IGluc3RhbmNlb2YgQXJyYXkpIHJldHVybiBcImFuIGFycmF5XCI7XG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBcbiAgICAgICAgICAgIC8qKiB0cnkgdG8gZ2V0IHRoZSBjb25zdHJ1Y3RvciBuYW1lIGZvciBhbiBvYmplY3QuICovXG4gICAgICAgICAgICBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHQuY29uc3RydWN0b3IpIHJldHVybiB0LmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKipcbiAqIENhc3RzIGBvYmpgIHRvIGBUYCwgb3B0aW9uYWxseSB1bndyYXBwaW5nIENvbXBhdCB0eXBlcyB0byBleHBvc2UgdGhlXG4gKiB1bmRlcmx5aW5nIGluc3RhbmNlLiBUaHJvd3MgaWYgIGBvYmpgIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBgVGAuXG4gKlxuICogVGhpcyBjYXN0IGlzIHVzZWQgaW4gdGhlIExpdGUgYW5kIEZ1bGwgU0RLIHRvIHZlcmlmeSBpbnN0YW5jZSB0eXBlcyBmb3JcbiAqIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIHB1YmxpYyBBUEkuXG4gKiBAaW50ZXJuYWxcbiAqLyAodCk7XG4gICAgICAgICAgICByZXR1cm4gZSA/IGBhIGN1c3RvbSAke2V9IG9iamVjdGAgOiBcImFuIG9iamVjdFwiO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIHQgPyBcImEgZnVuY3Rpb25cIiA6IEwoKTtcbn1cblxuZnVuY3Rpb24gdGModCwgXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZSkge1xuICAgIGlmIChcIl9kZWxlZ2F0ZVwiIGluIHQgJiYgKFxuICAgIC8vIFVud3JhcCBDb21wYXQgdHlwZXNcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHQgPSB0Ll9kZWxlZ2F0ZSksICEodCBpbnN0YW5jZW9mIGUpKSB7XG4gICAgICAgIGlmIChlLm5hbWUgPT09IHQuY29uc3RydWN0b3IubmFtZSkgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBcIlR5cGUgZG9lcyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkIGluc3RhbmNlLiBEaWQgeW91IHBhc3MgYSByZWZlcmVuY2UgZnJvbSBhIGRpZmZlcmVudCBGaXJlc3RvcmUgU0RLP1wiKTtcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgbiA9IFp1KHQpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBgRXhwZWN0ZWQgdHlwZSAnJHtlLm5hbWV9JywgYnV0IGl0IHdhczogJHtufWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0O1xufVxuXG5mdW5jdGlvbiBlYyh0LCBlKSB7XG4gICAgaWYgKGUgPD0gMCkgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBgRnVuY3Rpb24gJHt0fSgpIHJlcXVpcmVzIGEgcG9zaXRpdmUgbnVtYmVyLCBidXQgaXQgd2FzOiAke2V9LmApO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLy8gc2V0dGluZ3MoKSBkZWZhdWx0czpcbi8qKlxuICogQSBjb25jcmV0ZSB0eXBlIGRlc2NyaWJpbmcgYWxsIHRoZSB2YWx1ZXMgdGhhdCBjYW4gYmUgYXBwbGllZCB2aWEgYVxuICogdXNlci1zdXBwbGllZCBgRmlyZXN0b3JlU2V0dGluZ3NgIG9iamVjdC4gVGhpcyBpcyBhIHNlcGFyYXRlIHR5cGUgc28gdGhhdFxuICogZGVmYXVsdHMgY2FuIGJlIHN1cHBsaWVkIGFuZCB0aGUgdmFsdWUgY2FuIGJlIGNoZWNrZWQgZm9yIGVxdWFsaXR5LlxuICovXG5jbGFzcyBuYyB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB2YXIgZTtcbiAgICAgICAgaWYgKHZvaWQgMCA9PT0gdC5ob3N0KSB7XG4gICAgICAgICAgICBpZiAodm9pZCAwICE9PSB0LnNzbCkgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBcIkNhbid0IHByb3ZpZGUgc3NsIG9wdGlvbiBpZiBob3N0IG9wdGlvbiBpcyBub3Qgc2V0XCIpO1xuICAgICAgICAgICAgdGhpcy5ob3N0ID0gXCJmaXJlc3RvcmUuZ29vZ2xlYXBpcy5jb21cIiwgdGhpcy5zc2wgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgdGhpcy5ob3N0ID0gdC5ob3N0LCB0aGlzLnNzbCA9IG51bGwgPT09IChlID0gdC5zc2wpIHx8IHZvaWQgMCA9PT0gZSB8fCBlO1xuICAgICAgICBpZiAodGhpcy5jcmVkZW50aWFscyA9IHQuY3JlZGVudGlhbHMsIHRoaXMuaWdub3JlVW5kZWZpbmVkUHJvcGVydGllcyA9ICEhdC5pZ25vcmVVbmRlZmluZWRQcm9wZXJ0aWVzLCBcbiAgICAgICAgdm9pZCAwID09PSB0LmNhY2hlU2l6ZUJ5dGVzKSB0aGlzLmNhY2hlU2l6ZUJ5dGVzID0gNDE5NDMwNDA7IGVsc2Uge1xuICAgICAgICAgICAgaWYgKC0xICE9PSB0LmNhY2hlU2l6ZUJ5dGVzICYmIHQuY2FjaGVTaXplQnl0ZXMgPCAxMDQ4NTc2KSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIFwiY2FjaGVTaXplQnl0ZXMgbXVzdCBiZSBhdCBsZWFzdCAxMDQ4NTc2XCIpO1xuICAgICAgICAgICAgdGhpcy5jYWNoZVNpemVCeXRlcyA9IHQuY2FjaGVTaXplQnl0ZXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5leHBlcmltZW50YWxGb3JjZUxvbmdQb2xsaW5nID0gISF0LmV4cGVyaW1lbnRhbEZvcmNlTG9uZ1BvbGxpbmcsIHRoaXMuZXhwZXJpbWVudGFsQXV0b0RldGVjdExvbmdQb2xsaW5nID0gISF0LmV4cGVyaW1lbnRhbEF1dG9EZXRlY3RMb25nUG9sbGluZywgXG4gICAgICAgIHRoaXMudXNlRmV0Y2hTdHJlYW1zID0gISF0LnVzZUZldGNoU3RyZWFtcywgSnUoXCJleHBlcmltZW50YWxGb3JjZUxvbmdQb2xsaW5nXCIsIHQuZXhwZXJpbWVudGFsRm9yY2VMb25nUG9sbGluZywgXCJleHBlcmltZW50YWxBdXRvRGV0ZWN0TG9uZ1BvbGxpbmdcIiwgdC5leHBlcmltZW50YWxBdXRvRGV0ZWN0TG9uZ1BvbGxpbmcpO1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9zdCA9PT0gdC5ob3N0ICYmIHRoaXMuc3NsID09PSB0LnNzbCAmJiB0aGlzLmNyZWRlbnRpYWxzID09PSB0LmNyZWRlbnRpYWxzICYmIHRoaXMuY2FjaGVTaXplQnl0ZXMgPT09IHQuY2FjaGVTaXplQnl0ZXMgJiYgdGhpcy5leHBlcmltZW50YWxGb3JjZUxvbmdQb2xsaW5nID09PSB0LmV4cGVyaW1lbnRhbEZvcmNlTG9uZ1BvbGxpbmcgJiYgdGhpcy5leHBlcmltZW50YWxBdXRvRGV0ZWN0TG9uZ1BvbGxpbmcgPT09IHQuZXhwZXJpbWVudGFsQXV0b0RldGVjdExvbmdQb2xsaW5nICYmIHRoaXMuaWdub3JlVW5kZWZpbmVkUHJvcGVydGllcyA9PT0gdC5pZ25vcmVVbmRlZmluZWRQcm9wZXJ0aWVzICYmIHRoaXMudXNlRmV0Y2hTdHJlYW1zID09PSB0LnVzZUZldGNoU3RyZWFtcztcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFRoZSBDbG91ZCBGaXJlc3RvcmUgc2VydmljZSBpbnRlcmZhY2UuXG4gKlxuICogRG8gbm90IGNhbGwgdGhpcyBjb25zdHJ1Y3RvciBkaXJlY3RseS4gSW5zdGVhZCwgdXNlIHtAbGluayBnZXRGaXJlc3RvcmV9LlxuICovIGNsYXNzIHNjIHtcbiAgICAvKiogQGhpZGVjb25zdHJ1Y3RvciAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy5fYXV0aENyZWRlbnRpYWxzID0gZSwgdGhpcy5fYXBwQ2hlY2tDcmVkZW50aWFscyA9IG4sIFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hldGhlciBpdCdzIGEgRmlyZXN0b3JlIG9yIEZpcmVzdG9yZSBMaXRlIGluc3RhbmNlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50eXBlID0gXCJmaXJlc3RvcmUtbGl0ZVwiLCB0aGlzLl9wZXJzaXN0ZW5jZUtleSA9IFwiKGxpdGUpXCIsIHRoaXMuX3NldHRpbmdzID0gbmV3IG5jKHt9KSwgXG4gICAgICAgIHRoaXMuX3NldHRpbmdzRnJvemVuID0gITEsIHQgaW5zdGFuY2VvZiB2dCA/IHRoaXMuX2RhdGFiYXNlSWQgPSB0IDogKHRoaXMuX2FwcCA9IHQsIFxuICAgICAgICB0aGlzLl9kYXRhYmFzZUlkID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmFwcGx5KHQub3B0aW9ucywgWyBcInByb2plY3RJZFwiIF0pKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsICdcInByb2plY3RJZFwiIG5vdCBwcm92aWRlZCBpbiBmaXJlYmFzZS5pbml0aWFsaXplQXBwLicpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyB2dCh0Lm9wdGlvbnMucHJvamVjdElkKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAqIE1vZGlmeSB0aGlzIGluc3RhbmNlIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIENsb3VkIEZpcmVzdG9yZSBlbXVsYXRvci5cbiAqXG4gKiBOb3RlOiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGlzIGluc3RhbmNlIGhhcyBiZWVuIHVzZWQgdG8gZG8gYW55XG4gKiBvcGVyYXRpb25zLlxuICpcbiAqIEBwYXJhbSBmaXJlc3RvcmUgLSBUaGUgYEZpcmVzdG9yZWAgaW5zdGFuY2UgdG8gY29uZmlndXJlIHRvIGNvbm5lY3QgdG8gdGhlXG4gKiBlbXVsYXRvci5cbiAqIEBwYXJhbSBob3N0IC0gdGhlIGVtdWxhdG9yIGhvc3QgKGV4OiBsb2NhbGhvc3QpLlxuICogQHBhcmFtIHBvcnQgLSB0aGUgZW11bGF0b3IgcG9ydCAoZXg6IDkwMDApLlxuICogQHBhcmFtIG9wdGlvbnMubW9ja1VzZXJUb2tlbiAtIHRoZSBtb2NrIGF1dGggdG9rZW4gdG8gdXNlIGZvciB1bml0IHRlc3RpbmdcbiAqIFNlY3VyaXR5IFJ1bGVzLlxuICovICh0KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSB7QGxpbmsgQGZpcmViYXNlL2FwcCNGaXJlYmFzZUFwcH0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgYEZpcmVzdG9yZWAgc2VydmljZVxuICAgICAqIGluc3RhbmNlLlxuICAgICAqLyAgICBnZXQgYXBwKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2FwcCkgdGhyb3cgbmV3IFEoRy5GQUlMRURfUFJFQ09ORElUSU9OLCBcIkZpcmVzdG9yZSB3YXMgbm90IGluaXRpYWxpemVkIHVzaW5nIHRoZSBGaXJlYmFzZSBTREsuICdhcHAnIGlzIG5vdCBhdmFpbGFibGVcIik7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcHA7XG4gICAgfVxuICAgIGdldCBfaW5pdGlhbGl6ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc0Zyb3plbjtcbiAgICB9XG4gICAgZ2V0IF90ZXJtaW5hdGVkKCkge1xuICAgICAgICByZXR1cm4gdm9pZCAwICE9PSB0aGlzLl90ZXJtaW5hdGVUYXNrO1xuICAgIH1cbiAgICBfc2V0U2V0dGluZ3ModCkge1xuICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3NGcm96ZW4pIHRocm93IG5ldyBRKEcuRkFJTEVEX1BSRUNPTkRJVElPTiwgXCJGaXJlc3RvcmUgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkIGFuZCBpdHMgc2V0dGluZ3MgY2FuIG5vIGxvbmdlciBiZSBjaGFuZ2VkLiBZb3UgY2FuIG9ubHkgbW9kaWZ5IHNldHRpbmdzIGJlZm9yZSBjYWxsaW5nIGFueSBvdGhlciBtZXRob2RzIG9uIGEgRmlyZXN0b3JlIG9iamVjdC5cIik7XG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gbmV3IG5jKHQpLCB2b2lkIDAgIT09IHQuY3JlZGVudGlhbHMgJiYgKHRoaXMuX2F1dGhDcmVkZW50aWFscyA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIGlmICghdCkgcmV0dXJuIG5ldyB6O1xuICAgICAgICAgICAgc3dpdGNoICh0LnR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBcImdhcGlcIjpcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gdC5jbGllbnQ7XG4gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoaXMgcmVhbGx5IGlzIGEgR2FwaSBjbGllbnQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBxKCEoXCJvYmplY3RcIiAhPSB0eXBlb2YgZSB8fCBudWxsID09PSBlIHx8ICFlLmF1dGggfHwgIWUuYXV0aC5nZXRBdXRoSGVhZGVyVmFsdWVGb3JGaXJzdFBhcnR5KSksIFxuICAgICAgICAgICAgICAgIG5ldyBYKGUsIHQuc2Vzc2lvbkluZGV4IHx8IFwiMFwiLCB0LmlhbVRva2VuIHx8IG51bGwpO1xuXG4gICAgICAgICAgICAgIGNhc2UgXCJwcm92aWRlclwiOlxuICAgICAgICAgICAgICAgIHJldHVybiB0LmNsaWVudDtcblxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgXCJtYWtlQXV0aENyZWRlbnRpYWxzUHJvdmlkZXIgZmFpbGVkIGR1ZSB0byBpbnZhbGlkIGNyZWRlbnRpYWwgdHlwZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSh0LmNyZWRlbnRpYWxzKSk7XG4gICAgfVxuICAgIF9nZXRTZXR0aW5ncygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzO1xuICAgIH1cbiAgICBfZnJlZXplU2V0dGluZ3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc0Zyb3plbiA9ICEwLCB0aGlzLl9zZXR0aW5ncztcbiAgICB9XG4gICAgX2RlbGV0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Rlcm1pbmF0ZVRhc2sgfHwgKHRoaXMuX3Rlcm1pbmF0ZVRhc2sgPSB0aGlzLl90ZXJtaW5hdGUoKSksIHRoaXMuX3Rlcm1pbmF0ZVRhc2s7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIGEgSlNPTi1zZXJpYWxpemFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBgRmlyZXN0b3JlYCBpbnN0YW5jZS4gKi8gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYXBwOiB0aGlzLl9hcHAsXG4gICAgICAgICAgICBkYXRhYmFzZUlkOiB0aGlzLl9kYXRhYmFzZUlkLFxuICAgICAgICAgICAgc2V0dGluZ3M6IHRoaXMuX3NldHRpbmdzXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRlcm1pbmF0ZXMgYWxsIGNvbXBvbmVudHMgdXNlZCBieSB0aGlzIGNsaWVudC4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGVcbiAgICAgKiB0aGlzIG1ldGhvZCB0byBjbGVhbiB1cCB0aGVpciBvd24gZGVwZW5kZW5jaWVzLCBidXQgbXVzdCBhbHNvIGNhbGwgdGhpc1xuICAgICAqIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIE9ubHkgZXZlciBjYWxsZWQgb25jZS5cbiAgICAgKi8gICAgX3Rlcm1pbmF0ZSgpIHtcbiAgICAgICAgLyoqXG4gKiBSZW1vdmVzIGFsbCBjb21wb25lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgaW5zdGFuY2UuIE11c3QgYmUgY2FsbGVkXG4gKiB3aGVuIHRoZSBgRmlyZXN0b3JlYCBpbnN0YW5jZSBpcyB0ZXJtaW5hdGVkLlxuICovXG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBjb25zdCBlID0genUuZ2V0KHQpO1xuICAgICAgICAgICAgZSAmJiAoTyhcIkNvbXBvbmVudFByb3ZpZGVyXCIsIFwiUmVtb3ZpbmcgRGF0YXN0b3JlXCIpLCB6dS5kZWxldGUodCksIGUudGVybWluYXRlKCkpO1xuICAgICAgICB9KHRoaXMpLCBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGljKHQsIGUsIG4sIHMgPSB7fSkge1xuICAgIHZhciBpO1xuICAgIGNvbnN0IHIgPSAodCA9IHRjKHQsIHNjKSkuX2dldFNldHRpbmdzKCk7XG4gICAgaWYgKFwiZmlyZXN0b3JlLmdvb2dsZWFwaXMuY29tXCIgIT09IHIuaG9zdCAmJiByLmhvc3QgIT09IGUgJiYgRihcIkhvc3QgaGFzIGJlZW4gc2V0IGluIGJvdGggc2V0dGluZ3MoKSBhbmQgdXNlRW11bGF0b3IoKSwgZW11bGF0b3IgaG9zdCB3aWxsIGJlIHVzZWRcIiksIFxuICAgIHQuX3NldFNldHRpbmdzKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgciksIHtcbiAgICAgICAgaG9zdDogYCR7ZX06JHtufWAsXG4gICAgICAgIHNzbDogITFcbiAgICB9KSksIHMubW9ja1VzZXJUb2tlbikge1xuICAgICAgICBsZXQgZSwgbjtcbiAgICAgICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIHMubW9ja1VzZXJUb2tlbikgZSA9IHMubW9ja1VzZXJUb2tlbiwgbiA9IEMuTU9DS19VU0VSOyBlbHNlIHtcbiAgICAgICAgICAgIC8vIExldCBjcmVhdGVNb2NrVXNlclRva2VuIHZhbGlkYXRlIGZpcnN0IChjYXRjaGVzIGNvbW1vbiBtaXN0YWtlcyBsaWtlXG4gICAgICAgICAgICAvLyBpbnZhbGlkIGZpZWxkIFwidWlkXCIgYW5kIG1pc3NpbmcgZmllbGQgXCJzdWJcIiAvIFwidXNlcl9pZFwiLilcbiAgICAgICAgICAgIGUgPSBjcmVhdGVNb2NrVXNlclRva2VuKHMubW9ja1VzZXJUb2tlbiwgbnVsbCA9PT0gKGkgPSB0Ll9hcHApIHx8IHZvaWQgMCA9PT0gaSA/IHZvaWQgMCA6IGkub3B0aW9ucy5wcm9qZWN0SWQpO1xuICAgICAgICAgICAgY29uc3QgciA9IHMubW9ja1VzZXJUb2tlbi5zdWIgfHwgcy5tb2NrVXNlclRva2VuLnVzZXJfaWQ7XG4gICAgICAgICAgICBpZiAoIXIpIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgXCJtb2NrVXNlclRva2VuIG11c3QgY29udGFpbiAnc3ViJyBvciAndXNlcl9pZCcgZmllbGQhXCIpO1xuICAgICAgICAgICAgbiA9IG5ldyBDKHIpO1xuICAgICAgICB9XG4gICAgICAgIHQuX2F1dGhDcmVkZW50aWFscyA9IG5ldyBIKG5ldyBXKGUsIG4pKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEEgYERvY3VtZW50UmVmZXJlbmNlYCByZWZlcnMgdG8gYSBkb2N1bWVudCBsb2NhdGlvbiBpbiBhIEZpcmVzdG9yZSBkYXRhYmFzZVxuICogYW5kIGNhbiBiZSB1c2VkIHRvIHdyaXRlLCByZWFkLCBvciBsaXN0ZW4gdG8gdGhlIGxvY2F0aW9uLiBUaGUgZG9jdW1lbnQgYXRcbiAqIHRoZSByZWZlcmVuY2VkIGxvY2F0aW9uIG1heSBvciBtYXkgbm90IGV4aXN0LlxuICovIGNsYXNzIHJjIHtcbiAgICAvKiogQGhpZGVjb25zdHJ1Y3RvciAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIFxuICAgIC8qKlxuICAgICAqIElmIHByb3ZpZGVkLCB0aGUgYEZpcmVzdG9yZURhdGFDb252ZXJ0ZXJgIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGUsIG4pIHtcbiAgICAgICAgdGhpcy5jb252ZXJ0ZXIgPSBlLCB0aGlzLl9rZXkgPSBuLCBcbiAgICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoaXMgRmlyZXN0b3JlIHJlZmVyZW5jZS4gKi9cbiAgICAgICAgdGhpcy50eXBlID0gXCJkb2N1bWVudFwiLCB0aGlzLmZpcmVzdG9yZSA9IHQ7XG4gICAgfVxuICAgIGdldCBfcGF0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2tleS5wYXRoO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZG9jdW1lbnQncyBpZGVudGlmaWVyIHdpdGhpbiBpdHMgY29sbGVjdGlvbi5cbiAgICAgKi8gICAgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fa2V5LnBhdGgubGFzdFNlZ21lbnQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXRoIG9mIHRoZSByZWZlcmVuY2VkIGRvY3VtZW50IChyZWxhdGl2ZVxuICAgICAqIHRvIHRoZSByb290IG9mIHRoZSBkYXRhYmFzZSkuXG4gICAgICovICAgIGdldCBwYXRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fa2V5LnBhdGguY2Fub25pY2FsU3RyaW5nKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBjb2xsZWN0aW9uIHRoaXMgYERvY3VtZW50UmVmZXJlbmNlYCBiZWxvbmdzIHRvLlxuICAgICAqLyAgICBnZXQgcGFyZW50KCkge1xuICAgICAgICByZXR1cm4gbmV3IGFjKHRoaXMuZmlyZXN0b3JlLCB0aGlzLmNvbnZlcnRlciwgdGhpcy5fa2V5LnBhdGgucG9wTGFzdCgpKTtcbiAgICB9XG4gICAgd2l0aENvbnZlcnRlcih0KSB7XG4gICAgICAgIHJldHVybiBuZXcgcmModGhpcy5maXJlc3RvcmUsIHQsIHRoaXMuX2tleSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgYFF1ZXJ5YCByZWZlcnMgdG8gYSBxdWVyeSB3aGljaCB5b3UgY2FuIHJlYWQgb3IgbGlzdGVuIHRvLiBZb3UgY2FuIGFsc29cbiAqIGNvbnN0cnVjdCByZWZpbmVkIGBRdWVyeWAgb2JqZWN0cyBieSBhZGRpbmcgZmlsdGVycyBhbmQgb3JkZXJpbmcuXG4gKi8gY2xhc3Mgb2Mge1xuICAgIC8vIFRoaXMgaXMgdGhlIGxpdGUgdmVyc2lvbiBvZiB0aGUgUXVlcnkgY2xhc3MgaW4gdGhlIG1haW4gU0RLLlxuICAgIC8qKiBAaGlkZWNvbnN0cnVjdG9yIHByb3RlY3RlZCAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIFxuICAgIC8qKlxuICAgICAqIElmIHByb3ZpZGVkLCB0aGUgYEZpcmVzdG9yZURhdGFDb252ZXJ0ZXJgIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGUsIG4pIHtcbiAgICAgICAgdGhpcy5jb252ZXJ0ZXIgPSBlLCB0aGlzLl9xdWVyeSA9IG4sIFxuICAgICAgICAvKiogVGhlIHR5cGUgb2YgdGhpcyBGaXJlc3RvcmUgcmVmZXJlbmNlLiAqL1xuICAgICAgICB0aGlzLnR5cGUgPSBcInF1ZXJ5XCIsIHRoaXMuZmlyZXN0b3JlID0gdDtcbiAgICB9XG4gICAgd2l0aENvbnZlcnRlcih0KSB7XG4gICAgICAgIHJldHVybiBuZXcgb2ModGhpcy5maXJlc3RvcmUsIHQsIHRoaXMuX3F1ZXJ5KTtcbiAgICB9XG59XG5cbi8qKlxuICogQSBgQ29sbGVjdGlvblJlZmVyZW5jZWAgb2JqZWN0IGNhbiBiZSB1c2VkIGZvciBhZGRpbmcgZG9jdW1lbnRzLCBnZXR0aW5nXG4gKiBkb2N1bWVudCByZWZlcmVuY2VzLCBhbmQgcXVlcnlpbmcgZm9yIGRvY3VtZW50cyAodXNpbmcge0BsaW5rIHF1ZXJ5fSkuXG4gKi8gY2xhc3MgYWMgZXh0ZW5kcyBvYyB7XG4gICAgLyoqIEBoaWRlY29uc3RydWN0b3IgKi9cbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgIHN1cGVyKHQsIGUsIERlKG4pKSwgdGhpcy5fcGF0aCA9IG4sIFxuICAgICAgICAvKiogVGhlIHR5cGUgb2YgdGhpcyBGaXJlc3RvcmUgcmVmZXJlbmNlLiAqL1xuICAgICAgICB0aGlzLnR5cGUgPSBcImNvbGxlY3Rpb25cIjtcbiAgICB9XG4gICAgLyoqIFRoZSBjb2xsZWN0aW9uJ3MgaWRlbnRpZmllci4gKi8gICAgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcXVlcnkucGF0aC5sYXN0U2VnbWVudCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBhdGggb2YgdGhlIHJlZmVyZW5jZWQgY29sbGVjdGlvbiAocmVsYXRpdmVcbiAgICAgKiB0byB0aGUgcm9vdCBvZiB0aGUgZGF0YWJhc2UpLlxuICAgICAqLyAgICBnZXQgcGF0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3F1ZXJ5LnBhdGguY2Fub25pY2FsU3RyaW5nKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBjb250YWluaW5nIGBEb2N1bWVudFJlZmVyZW5jZWAgaWYgdGhpcyBpcyBhXG4gICAgICogc3ViY29sbGVjdGlvbi4gSWYgdGhpcyBpc24ndCBhIHN1YmNvbGxlY3Rpb24sIHRoZSByZWZlcmVuY2UgaXMgbnVsbC5cbiAgICAgKi8gICAgZ2V0IHBhcmVudCgpIHtcbiAgICAgICAgY29uc3QgdCA9IHRoaXMuX3BhdGgucG9wTGFzdCgpO1xuICAgICAgICByZXR1cm4gdC5pc0VtcHR5KCkgPyBudWxsIDogbmV3IHJjKHRoaXMuZmlyZXN0b3JlLCBcbiAgICAgICAgLyogY29udmVydGVyPSAqLyBudWxsLCBuZXcgeHQodCkpO1xuICAgIH1cbiAgICB3aXRoQ29udmVydGVyKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBhYyh0aGlzLmZpcmVzdG9yZSwgdCwgdGhpcy5fcGF0aCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB1Yyh0LCBlLCAuLi5uKSB7XG4gICAgaWYgKHQgPSBnZXRNb2R1bGFySW5zdGFuY2UodCksIEh1KFwiY29sbGVjdGlvblwiLCBcInBhdGhcIiwgZSksIHQgaW5zdGFuY2VvZiBzYykge1xuICAgICAgICBjb25zdCBzID0gX3QuZnJvbVN0cmluZyhlLCAuLi5uKTtcbiAgICAgICAgcmV0dXJuIFh1KHMpLCBuZXcgYWModCwgLyogY29udmVydGVyPSAqLyBudWxsLCBzKTtcbiAgICB9XG4gICAge1xuICAgICAgICBpZiAoISh0IGluc3RhbmNlb2YgcmMgfHwgdCBpbnN0YW5jZW9mIGFjKSkgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBcIkV4cGVjdGVkIGZpcnN0IGFyZ3VtZW50IHRvIGNvbGxlY3Rpb24oKSB0byBiZSBhIENvbGxlY3Rpb25SZWZlcmVuY2UsIGEgRG9jdW1lbnRSZWZlcmVuY2Ugb3IgRmlyZWJhc2VGaXJlc3RvcmVcIik7XG4gICAgICAgIGNvbnN0IHMgPSB0Ll9wYXRoLmNoaWxkKF90LmZyb21TdHJpbmcoZSwgLi4ubikpO1xuICAgICAgICByZXR1cm4gWHUocyksIG5ldyBhYyh0LmZpcmVzdG9yZSwgXG4gICAgICAgIC8qIGNvbnZlcnRlcj0gKi8gbnVsbCwgcyk7XG4gICAgfVxufVxuXG4vLyBUT0RPKGZpcmVzdG9yZWxpdGUpOiBDb25zaWRlciB1c2luZyBFcnJvckZhY3RvcnkgLVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZpcmViYXNlL2ZpcmViYXNlLWpzLXNkay9ibG9iLzAxMzFlMWYvcGFja2FnZXMvdXRpbC9zcmMvZXJyb3JzLnRzI0wxMDZcbi8qKlxuICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBgUXVlcnlgIGluc3RhbmNlIHRoYXQgaW5jbHVkZXMgYWxsIGRvY3VtZW50cyBpbiB0aGVcbiAqIGRhdGFiYXNlIHRoYXQgYXJlIGNvbnRhaW5lZCBpbiBhIGNvbGxlY3Rpb24gb3Igc3ViY29sbGVjdGlvbiB3aXRoIHRoZVxuICogZ2l2ZW4gYGNvbGxlY3Rpb25JZGAuXG4gKlxuICogQHBhcmFtIGZpcmVzdG9yZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSByb290IGBGaXJlc3RvcmVgIGluc3RhbmNlLlxuICogQHBhcmFtIGNvbGxlY3Rpb25JZCAtIElkZW50aWZpZXMgdGhlIGNvbGxlY3Rpb25zIHRvIHF1ZXJ5IG92ZXIuIEV2ZXJ5XG4gKiBjb2xsZWN0aW9uIG9yIHN1YmNvbGxlY3Rpb24gd2l0aCB0aGlzIElEIGFzIHRoZSBsYXN0IHNlZ21lbnQgb2YgaXRzIHBhdGhcbiAqIHdpbGwgYmUgaW5jbHVkZWQuIENhbm5vdCBjb250YWluIGEgc2xhc2guXG4gKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBgUXVlcnlgLlxuICovIGZ1bmN0aW9uIGNjKHQsIGUpIHtcbiAgICBpZiAodCA9IHRjKHQsIHNjKSwgSHUoXCJjb2xsZWN0aW9uR3JvdXBcIiwgXCJjb2xsZWN0aW9uIGlkXCIsIGUpLCBlLmluZGV4T2YoXCIvXCIpID49IDApIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgYEludmFsaWQgY29sbGVjdGlvbiBJRCAnJHtlfScgcGFzc2VkIHRvIGZ1bmN0aW9uIGNvbGxlY3Rpb25Hcm91cCgpLiBDb2xsZWN0aW9uIElEcyBtdXN0IG5vdCBjb250YWluICcvJy5gKTtcbiAgICByZXR1cm4gbmV3IG9jKHQsIFxuICAgIC8qIGNvbnZlcnRlcj0gKi8gbnVsbCwgXG4gICAgLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFF1ZXJ5IGZvciBhIGNvbGxlY3Rpb24gZ3JvdXAgcXVlcnkgdGhhdCBtYXRjaGVzIGFsbCBkb2N1bWVudHNcbiAqIHdpdGhpbiB0aGUgcHJvdmlkZWQgY29sbGVjdGlvbiBncm91cC5cbiAqL1xuICAgIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB2ZShfdC5lbXB0eVBhdGgoKSwgdCk7XG4gICAgfShlKSk7XG59XG5cbmZ1bmN0aW9uIGhjKHQsIGUsIC4uLm4pIHtcbiAgICBpZiAodCA9IGdldE1vZHVsYXJJbnN0YW5jZSh0KSwgXG4gICAgLy8gV2UgYWxsb3cgb21pc3Npb24gb2YgJ3BhdGhTdHJpbmcnIGJ1dCBleHBsaWNpdGx5IHByb2hpYml0IHBhc3NpbmcgaW4gYm90aFxuICAgIC8vICd1bmRlZmluZWQnIGFuZCAnbnVsbCcuXG4gICAgMSA9PT0gYXJndW1lbnRzLmxlbmd0aCAmJiAoZSA9IGl0LlIoKSksIEh1KFwiZG9jXCIsIFwicGF0aFwiLCBlKSwgdCBpbnN0YW5jZW9mIHNjKSB7XG4gICAgICAgIGNvbnN0IHMgPSBfdC5mcm9tU3RyaW5nKGUsIC4uLm4pO1xuICAgICAgICByZXR1cm4gWXUocyksIG5ldyByYyh0LCBcbiAgICAgICAgLyogY29udmVydGVyPSAqLyBudWxsLCBuZXcgeHQocykpO1xuICAgIH1cbiAgICB7XG4gICAgICAgIGlmICghKHQgaW5zdGFuY2VvZiByYyB8fCB0IGluc3RhbmNlb2YgYWMpKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIFwiRXhwZWN0ZWQgZmlyc3QgYXJndW1lbnQgdG8gY29sbGVjdGlvbigpIHRvIGJlIGEgQ29sbGVjdGlvblJlZmVyZW5jZSwgYSBEb2N1bWVudFJlZmVyZW5jZSBvciBGaXJlYmFzZUZpcmVzdG9yZVwiKTtcbiAgICAgICAgY29uc3QgcyA9IHQuX3BhdGguY2hpbGQoX3QuZnJvbVN0cmluZyhlLCAuLi5uKSk7XG4gICAgICAgIHJldHVybiBZdShzKSwgbmV3IHJjKHQuZmlyZXN0b3JlLCB0IGluc3RhbmNlb2YgYWMgPyB0LmNvbnZlcnRlciA6IG51bGwsIG5ldyB4dChzKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvdmlkZWQgcmVmZXJlbmNlcyBhcmUgZXF1YWwuXG4gKlxuICogQHBhcmFtIGxlZnQgLSBBIHJlZmVyZW5jZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHJpZ2h0IC0gQSByZWZlcmVuY2UgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHJlZmVyZW5jZXMgcG9pbnQgdG8gdGhlIHNhbWUgbG9jYXRpb24gaW4gdGhlIHNhbWVcbiAqIEZpcmVzdG9yZSBkYXRhYmFzZS5cbiAqLyBmdW5jdGlvbiBsYyh0LCBlKSB7XG4gICAgcmV0dXJuIHQgPSBnZXRNb2R1bGFySW5zdGFuY2UodCksIGUgPSBnZXRNb2R1bGFySW5zdGFuY2UoZSksICh0IGluc3RhbmNlb2YgcmMgfHwgdCBpbnN0YW5jZW9mIGFjKSAmJiAoZSBpbnN0YW5jZW9mIHJjIHx8IGUgaW5zdGFuY2VvZiBhYykgJiYgKHQuZmlyZXN0b3JlID09PSBlLmZpcmVzdG9yZSAmJiB0LnBhdGggPT09IGUucGF0aCAmJiB0LmNvbnZlcnRlciA9PT0gZS5jb252ZXJ0ZXIpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvdmlkZWQgcXVlcmllcyBwb2ludCB0byB0aGUgc2FtZSBjb2xsZWN0aW9uIGFuZCBhcHBseVxuICogdGhlIHNhbWUgY29uc3RyYWludHMuXG4gKlxuICogQHBhcmFtIGxlZnQgLSBBIGBRdWVyeWAgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSByaWdodCAtIEEgYFF1ZXJ5YCB0byBjb21wYXJlLlxuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgcmVmZXJlbmNlcyBwb2ludCB0byB0aGUgc2FtZSBsb2NhdGlvbiBpbiB0aGUgc2FtZVxuICogRmlyZXN0b3JlIGRhdGFiYXNlLlxuICovIGZ1bmN0aW9uIGZjKHQsIGUpIHtcbiAgICByZXR1cm4gdCA9IGdldE1vZHVsYXJJbnN0YW5jZSh0KSwgZSA9IGdldE1vZHVsYXJJbnN0YW5jZShlKSwgdCBpbnN0YW5jZW9mIG9jICYmIGUgaW5zdGFuY2VvZiBvYyAmJiAodC5maXJlc3RvcmUgPT09IGUuZmlyZXN0b3JlICYmIEJlKHQuX3F1ZXJ5LCBlLl9xdWVyeSkgJiYgdC5jb252ZXJ0ZXIgPT09IGUuY29udmVydGVyKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gY2xhc3MgZGMge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBUaGUgbGFzdCBwcm9taXNlIGluIHRoZSBxdWV1ZS5cbiAgICAgICAgdGhpcy5EdSA9IFByb21pc2UucmVzb2x2ZSgpLCBcbiAgICAgICAgLy8gQSBsaXN0IG9mIHJldHJ5YWJsZSBvcGVyYXRpb25zLiBSZXRyeWFibGUgb3BlcmF0aW9ucyBhcmUgcnVuIGluIG9yZGVyIGFuZFxuICAgICAgICAvLyByZXRyaWVkIHdpdGggYmFja29mZi5cbiAgICAgICAgdGhpcy5DdSA9IFtdLCBcbiAgICAgICAgLy8gSXMgdGhpcyBBc3luY1F1ZXVlIGJlaW5nIHNodXQgZG93bj8gT25jZSBpdCBpcyBzZXQgdG8gdHJ1ZSwgaXQgd2lsbCBub3RcbiAgICAgICAgLy8gYmUgY2hhbmdlZCBhZ2Fpbi5cbiAgICAgICAgdGhpcy54dSA9ICExLCBcbiAgICAgICAgLy8gT3BlcmF0aW9ucyBzY2hlZHVsZWQgdG8gYmUgcXVldWVkIGluIHRoZSBmdXR1cmUuIE9wZXJhdGlvbnMgYXJlXG4gICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBhZnRlciB0aGV5IGFyZSBydW4gb3IgY2FuY2VsZWQuXG4gICAgICAgIHRoaXMuTnUgPSBbXSwgXG4gICAgICAgIC8vIHZpc2libGUgZm9yIHRlc3RpbmdcbiAgICAgICAgdGhpcy5rdSA9IG51bGwsIFxuICAgICAgICAvLyBGbGFnIHNldCB3aGlsZSB0aGVyZSdzIGFuIG91dHN0YW5kaW5nIEFzeW5jUXVldWUgb3BlcmF0aW9uLCB1c2VkIGZvclxuICAgICAgICAvLyBhc3NlcnRpb24gc2FuaXR5LWNoZWNrcy5cbiAgICAgICAgdGhpcy5NdSA9ICExLCBcbiAgICAgICAgLy8gRW5hYmxlZCBkdXJpbmcgc2h1dGRvd24gb24gU2FmYXJpIHRvIHByZXZlbnQgZnV0dXJlIGFjY2VzcyB0byBJbmRleGVkREIuXG4gICAgICAgIHRoaXMuT3UgPSAhMSwgXG4gICAgICAgIC8vIExpc3Qgb2YgVGltZXJJZHMgdG8gZmFzdC1mb3J3YXJkIGRlbGF5cyBmb3IuXG4gICAgICAgIHRoaXMuJHUgPSBbXSwgXG4gICAgICAgIC8vIEJhY2tvZmYgdGltZXIgdXNlZCB0byBzY2hlZHVsZSByZXRyaWVzIGZvciByZXRyeWFibGUgb3BlcmF0aW9uc1xuICAgICAgICB0aGlzLnZvID0gbmV3ICRvKHRoaXMsIFwiYXN5bmNfcXVldWVfcmV0cnlcIiAvKiBBc3luY1F1ZXVlUmV0cnkgKi8pLCBcbiAgICAgICAgLy8gVmlzaWJpbGl0eSBoYW5kbGVyIHRoYXQgdHJpZ2dlcnMgYW4gaW1tZWRpYXRlIHJldHJ5IG9mIGFsbCByZXRyeWFibGVcbiAgICAgICAgLy8gb3BlcmF0aW9ucy4gTWVhbnQgdG8gc3BlZWQgdXAgcmVjb3Zlcnkgd2hlbiB3ZSByZWdhaW4gZmlsZSBzeXN0ZW0gYWNjZXNzXG4gICAgICAgIC8vIGFmdGVyIHBhZ2UgY29tZXMgaW50byBmb3JlZ3JvdW5kLlxuICAgICAgICB0aGlzLkZ1ID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdCA9IE1vKCk7XG4gICAgICAgICAgICB0ICYmIE8oXCJBc3luY1F1ZXVlXCIsIFwiVmlzaWJpbGl0eSBzdGF0ZSBjaGFuZ2VkIHRvIFwiICsgdC52aXNpYmlsaXR5U3RhdGUpLCB0aGlzLnZvLlRvKCk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHQgPSBNbygpO1xuICAgICAgICB0ICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgdC5hZGRFdmVudExpc3RlbmVyICYmIHQuYWRkRXZlbnRMaXN0ZW5lcihcInZpc2liaWxpdHljaGFuZ2VcIiwgdGhpcy5GdSk7XG4gICAgfVxuICAgIGdldCBpc1NodXR0aW5nRG93bigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueHU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBuZXcgb3BlcmF0aW9uIHRvIHRoZSBxdWV1ZSB3aXRob3V0IHdhaXRpbmcgZm9yIGl0IHRvIGNvbXBsZXRlIChpLmUuXG4gICAgICogd2UgaWdub3JlIHRoZSBQcm9taXNlIHJlc3VsdCkuXG4gICAgICovICAgIGVucXVldWVBbmRGb3JnZXQodCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICAgIHRoaXMuZW5xdWV1ZSh0KTtcbiAgICB9XG4gICAgZW5xdWV1ZUFuZEZvcmdldEV2ZW5XaGlsZVJlc3RyaWN0ZWQodCkge1xuICAgICAgICB0aGlzLkJ1KCksIFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICAgIHRoaXMuTHUodCk7XG4gICAgfVxuICAgIGVudGVyUmVzdHJpY3RlZE1vZGUodCkge1xuICAgICAgICBpZiAoIXRoaXMueHUpIHtcbiAgICAgICAgICAgIHRoaXMueHUgPSAhMCwgdGhpcy5PdSA9IHQgfHwgITE7XG4gICAgICAgICAgICBjb25zdCBlID0gTW8oKTtcbiAgICAgICAgICAgIGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBlLnJlbW92ZUV2ZW50TGlzdGVuZXIgJiYgZS5yZW1vdmVFdmVudExpc3RlbmVyKFwidmlzaWJpbGl0eWNoYW5nZVwiLCB0aGlzLkZ1KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbnF1ZXVlKHQpIHtcbiAgICAgICAgaWYgKHRoaXMuQnUoKSwgdGhpcy54dSkgXG4gICAgICAgIC8vIFJldHVybiBhIFByb21pc2Ugd2hpY2ggbmV2ZXIgcmVzb2x2ZXMuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoKCkgPT4ge30pKTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgZGVmZXJyZWQgUHJvbWlzZSB0aGF0IHdlIGNhbiByZXR1cm4gdG8gdGhlIGNhbGxlZS4gVGhpc1xuICAgICAgICAvLyBhbGxvd3MgdXMgdG8gcmV0dXJuIGEgXCJoYW5naW5nIFByb21pc2VcIiBvbmx5IHRvIHRoZSBjYWxsZWUgYW5kIHN0aWxsXG4gICAgICAgIC8vIGFkdmFuY2UgdGhlIHF1ZXVlIGV2ZW4gd2hlbiB0aGUgb3BlcmF0aW9uIGlzIG5vdCBydW4uXG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBqO1xuICAgICAgICByZXR1cm4gdGhpcy5MdSgoKCkgPT4gdGhpcy54dSAmJiB0aGlzLk91ID8gUHJvbWlzZS5yZXNvbHZlKCkgOiAodCgpLnRoZW4oZS5yZXNvbHZlLCBlLnJlamVjdCksIFxuICAgICAgICBlLnByb21pc2UpKSkudGhlbigoKCkgPT4gZS5wcm9taXNlKSk7XG4gICAgfVxuICAgIGVucXVldWVSZXRyeWFibGUodCkge1xuICAgICAgICB0aGlzLmVucXVldWVBbmRGb3JnZXQoKCgpID0+ICh0aGlzLkN1LnB1c2godCksIHRoaXMucXUoKSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUnVucyB0aGUgbmV4dCBvcGVyYXRpb24gZnJvbSB0aGUgcmV0cnlhYmxlIHF1ZXVlLiBJZiB0aGUgb3BlcmF0aW9uIGZhaWxzLFxuICAgICAqIHJlc2NoZWR1bGVzIHdpdGggYmFja29mZi5cbiAgICAgKi8gICAgYXN5bmMgcXUoKSB7XG4gICAgICAgIGlmICgwICE9PSB0aGlzLkN1Lmxlbmd0aCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLkN1WzBdKCksIHRoaXMuQ3Uuc2hpZnQoKSwgdGhpcy52by5yZXNldCgpO1xuICAgICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgICAgIGlmICghZGkodCkpIHRocm93IHQ7XG4gLy8gRmFpbHVyZSB3aWxsIGJlIGhhbmRsZWQgYnkgQXN5bmNRdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPKFwiQXN5bmNRdWV1ZVwiLCBcIk9wZXJhdGlvbiBmYWlsZWQgd2l0aCByZXRyeWFibGUgZXJyb3I6IFwiICsgdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLkN1Lmxlbmd0aCA+IDAgJiYgXG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgYWRkaXRpb25hbCBvcGVyYXRpb25zLCB3ZSByZS1zY2hlZHVsZSBgcmV0cnlOZXh0T3AoKWAuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSB0byBydW4gcmV0cnlhYmxlIG9wZXJhdGlvbnMgdGhhdCBmYWlsZWQgZHVyaW5nXG4gICAgICAgICAgICAvLyB0aGVpciBpbml0aWFsIGF0dGVtcHQgc2luY2Ugd2UgZG9uJ3Qga25vdyB3aGV0aGVyIHRoZXkgYXJlIGFscmVhZHlcbiAgICAgICAgICAgIC8vIGVucXVldWVkLiBJZiwgZm9yIGV4YW1wbGUsIGBvcDFgLCBgb3AyYCwgYG9wM2AgYXJlIGVucXVldWVkIGFuZCBgb3AxYFxuICAgICAgICAgICAgLy8gbmVlZHMgdG8gIGJlIHJlLXJ1biwgd2Ugd2lsbCBydW4gYG9wMWAsIGBvcDFgLCBgb3AyYCB1c2luZyB0aGVcbiAgICAgICAgICAgIC8vIGFscmVhZHkgZW5xdWV1ZWQgY2FsbHMgdG8gYHJldHJ5TmV4dE9wKClgLiBgb3AzKClgIHdpbGwgdGhlbiBydW4gaW4gdGhlXG4gICAgICAgICAgICAvLyBjYWxsIHNjaGVkdWxlZCBoZXJlLlxuICAgICAgICAgICAgLy8gU2luY2UgYGJhY2tvZmZBbmRSdW4oKWAgY2FuY2VscyBhbiBleGlzdGluZyBiYWNrb2ZmIGFuZCBzY2hlZHVsZXMgYVxuICAgICAgICAgICAgLy8gbmV3IGJhY2tvZmYgb24gZXZlcnkgY2FsbCwgdGhlcmUgaXMgb25seSBldmVyIGEgc2luZ2xlIGFkZGl0aW9uYWxcbiAgICAgICAgICAgIC8vIG9wZXJhdGlvbiBpbiB0aGUgcXVldWUuXG4gICAgICAgICAgICB0aGlzLnZvLnBvKCgoKSA9PiB0aGlzLnF1KCkpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBMdSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLkR1LnRoZW4oKCgpID0+ICh0aGlzLk11ID0gITAsIHQoKS5jYXRjaCgodCA9PiB7XG4gICAgICAgICAgICB0aGlzLmt1ID0gdCwgdGhpcy5NdSA9ICExO1xuICAgICAgICAgICAgY29uc3QgZSA9IFxuICAgICAgICAgICAgLyoqXG4gKiBDaHJvbWUgaW5jbHVkZXMgRXJyb3IubWVzc2FnZSBpbiBFcnJvci5zdGFjay4gT3RoZXIgYnJvd3NlcnMgZG8gbm90LlxuICogVGhpcyByZXR1cm5zIGV4cGVjdGVkIG91dHB1dCBvZiBtZXNzYWdlICsgc3RhY2sgd2hlbiBhdmFpbGFibGUuXG4gKiBAcGFyYW0gZXJyb3IgLSBFcnJvciBvciBGaXJlc3RvcmVFcnJvclxuICovXG4gICAgICAgICAgICBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGUgPSB0Lm1lc3NhZ2UgfHwgXCJcIjtcbiAgICAgICAgICAgICAgICB0LnN0YWNrICYmIChlID0gdC5zdGFjay5pbmNsdWRlcyh0Lm1lc3NhZ2UpID8gdC5zdGFjayA6IHQubWVzc2FnZSArIFwiXFxuXCIgKyB0LnN0YWNrKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovICh0KTtcbiAgICAgICAgICAgIC8vIFJlLXRocm93IHRoZSBlcnJvciBzbyB0aGF0IHRoaXMudGFpbCBiZWNvbWVzIGEgcmVqZWN0ZWQgUHJvbWlzZSBhbmRcbiAgICAgICAgICAgIC8vIGFsbCBmdXJ0aGVyIGF0dGVtcHRzIHRvIGNoYWluICh2aWEgLnRoZW4pIHdpbGwganVzdCBzaG9ydC1jaXJjdWl0XG4gICAgICAgICAgICAvLyBhbmQgcmV0dXJuIHRoZSByZWplY3RlZCBQcm9taXNlLlxuICAgICAgICAgICAgdGhyb3cgJChcIklOVEVSTkFMIFVOSEFORExFRCBFUlJPUjogXCIsIGUpLCB0O1xuICAgICAgICB9KSkudGhlbigodCA9PiAodGhpcy5NdSA9ICExLCB0KSkpKSkpO1xuICAgICAgICByZXR1cm4gdGhpcy5EdSA9IGUsIGU7XG4gICAgfVxuICAgIGVucXVldWVBZnRlckRlbGF5KHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy5CdSgpLCBcbiAgICAgICAgLy8gRmFzdC1mb3J3YXJkIGRlbGF5cyBmb3IgdGltZXJJZHMgdGhhdCBoYXZlIGJlZW4gb3ZlcnJpZGVuLlxuICAgICAgICB0aGlzLiR1LmluZGV4T2YodCkgPiAtMSAmJiAoZSA9IDApO1xuICAgICAgICBjb25zdCBzID0geWEuY3JlYXRlQW5kU2NoZWR1bGUodGhpcywgdCwgZSwgbiwgKHQgPT4gdGhpcy5VdSh0KSkpO1xuICAgICAgICByZXR1cm4gdGhpcy5OdS5wdXNoKHMpLCBzO1xuICAgIH1cbiAgICBCdSgpIHtcbiAgICAgICAgdGhpcy5rdSAmJiBMKCk7XG4gICAgfVxuICAgIHZlcmlmeU9wZXJhdGlvbkluUHJvZ3Jlc3MoKSB7fVxuICAgIC8qKlxuICAgICAqIFdhaXRzIHVudGlsIGFsbCBjdXJyZW50bHkgcXVldWVkIHRhc2tzIGFyZSBmaW5pc2hlZCBleGVjdXRpbmcuIERlbGF5ZWRcbiAgICAgKiBvcGVyYXRpb25zIGFyZSBub3QgcnVuLlxuICAgICAqLyAgICBhc3luYyBLdSgpIHtcbiAgICAgICAgLy8gT3BlcmF0aW9ucyBpbiB0aGUgcXVldWUgcHJpb3IgdG8gZHJhaW5pbmcgbWF5IGhhdmUgZW5xdWV1ZWQgYWRkaXRpb25hbFxuICAgICAgICAvLyBvcGVyYXRpb25zLiBLZWVwIGRyYWluaW5nIHRoZSBxdWV1ZSB1bnRpbCB0aGUgdGFpbCBpcyBubyBsb25nZXIgYWR2YW5jZWQsXG4gICAgICAgIC8vIHdoaWNoIGluZGljYXRlcyB0aGF0IG5vIG1vcmUgbmV3IG9wZXJhdGlvbnMgd2VyZSBlbnF1ZXVlZCBhbmQgdGhhdCBhbGxcbiAgICAgICAgLy8gb3BlcmF0aW9ucyB3ZXJlIGV4ZWN1dGVkLlxuICAgICAgICBsZXQgdDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgdCA9IHRoaXMuRHUsIGF3YWl0IHQ7XG4gICAgICAgIH0gd2hpbGUgKHQgIT09IHRoaXMuRHUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgVGVzdHM6IERldGVybWluZSBpZiBhIGRlbGF5ZWQgb3BlcmF0aW9uIHdpdGggYSBwYXJ0aWN1bGFyIFRpbWVySWRcbiAgICAgKiBleGlzdHMuXG4gICAgICovICAgIEd1KHQpIHtcbiAgICAgICAgZm9yIChjb25zdCBlIG9mIHRoaXMuTnUpIGlmIChlLnRpbWVySWQgPT09IHQpIHJldHVybiAhMDtcbiAgICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgVGVzdHM6IFJ1bnMgc29tZSBvciBhbGwgZGVsYXllZCBvcGVyYXRpb25zIGVhcmx5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGxhc3RUaW1lcklkIC0gRGVsYXllZCBvcGVyYXRpb25zIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhpcyBUaW1lcklkXG4gICAgICogd2lsbCBiZSBkcmFpbmVkLiBQYXNzIFRpbWVySWQuQWxsIHRvIHJ1biBhbGwgZGVsYXllZCBvcGVyYXRpb25zLlxuICAgICAqIEByZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIG9uY2UgYWxsIG9wZXJhdGlvbnMgaGF2ZSBiZWVuIHJ1bi5cbiAgICAgKi8gICAgUXUodCkge1xuICAgICAgICAvLyBOb3RlIHRoYXQgZHJhaW5pbmcgbWF5IGdlbmVyYXRlIG1vcmUgZGVsYXllZCBvcHMsIHNvIHdlIGRvIHRoYXQgZmlyc3QuXG4gICAgICAgIHJldHVybiB0aGlzLkt1KCkudGhlbigoKCkgPT4ge1xuICAgICAgICAgICAgLy8gUnVuIG9wcyBpbiB0aGUgc2FtZSBvcmRlciB0aGV5J2QgcnVuIGlmIHRoZXkgcmFuIG5hdHVyYWxseS5cbiAgICAgICAgICAgIHRoaXMuTnUuc29ydCgoKHQsIGUpID0+IHQudGFyZ2V0VGltZU1zIC0gZS50YXJnZXRUaW1lTXMpKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLk51KSBpZiAoZS5za2lwRGVsYXkoKSwgXCJhbGxcIiAvKiBBbGwgKi8gIT09IHQgJiYgZS50aW1lcklkID09PSB0KSBicmVhaztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLkt1KCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRm9yIFRlc3RzOiBTa2lwIGFsbCBzdWJzZXF1ZW50IGRlbGF5cyBmb3IgYSB0aW1lciBpZC5cbiAgICAgKi8gICAganUodCkge1xuICAgICAgICB0aGlzLiR1LnB1c2godCk7XG4gICAgfVxuICAgIC8qKiBDYWxsZWQgb25jZSBhIERlbGF5ZWRPcGVyYXRpb24gaXMgcnVuIG9yIGNhbmNlbGVkLiAqLyAgICBVdSh0KSB7XG4gICAgICAgIC8vIE5PVEU6IGluZGV4T2YgLyBzbGljZSBhcmUgTyhuKSwgYnV0IGRlbGF5ZWRPcGVyYXRpb25zIGlzIGV4cGVjdGVkIHRvIGJlIHNtYWxsLlxuICAgICAgICBjb25zdCBlID0gdGhpcy5OdS5pbmRleE9mKHQpO1xuICAgICAgICB0aGlzLk51LnNwbGljZShlLCAxKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIF9jKHQpIHtcbiAgICAvKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBvYmogaXMgYW4gb2JqZWN0IGFuZCBjb250YWlucyBhdCBsZWFzdCBvbmUgb2YgdGhlIHNwZWNpZmllZFxuICogbWV0aG9kcy5cbiAqL1xuICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIGlmIChcIm9iamVjdFwiICE9IHR5cGVvZiB0IHx8IG51bGwgPT09IHQpIHJldHVybiAhMTtcbiAgICAgICAgY29uc3QgbiA9IHQ7XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiBlKSBpZiAodCBpbiBuICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2Ygblt0XSkgcmV0dXJuICEwO1xuICAgICAgICByZXR1cm4gITE7XG4gICAgfVxuICAgIC8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4gICAgLyoqXG4gKiBSZXByZXNlbnRzIHRoZSB0YXNrIG9mIGxvYWRpbmcgYSBGaXJlc3RvcmUgYnVuZGxlLiBJdCBwcm92aWRlcyBwcm9ncmVzcyBvZiBidW5kbGVcbiAqIGxvYWRpbmcsIGFzIHdlbGwgYXMgdGFzayBjb21wbGV0aW9uIGFuZCBlcnJvciBldmVudHMuXG4gKlxuICogVGhlIEFQSSBpcyBjb21wYXRpYmxlIHdpdGggYFByb21pc2U8TG9hZEJ1bmRsZVRhc2tQcm9ncmVzcz5gLlxuICovICh0LCBbIFwibmV4dFwiLCBcImVycm9yXCIsIFwiY29tcGxldGVcIiBdKTtcbn1cblxuY2xhc3Mgd2Mge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl9wcm9ncmVzc09ic2VydmVyID0ge30sIHRoaXMuX3Rhc2tDb21wbGV0aW9uUmVzb2x2ZXIgPSBuZXcgaiwgdGhpcy5fbGFzdFByb2dyZXNzID0ge1xuICAgICAgICAgICAgdGFza1N0YXRlOiBcIlJ1bm5pbmdcIixcbiAgICAgICAgICAgIHRvdGFsQnl0ZXM6IDAsXG4gICAgICAgICAgICB0b3RhbERvY3VtZW50czogMCxcbiAgICAgICAgICAgIGJ5dGVzTG9hZGVkOiAwLFxuICAgICAgICAgICAgZG9jdW1lbnRzTG9hZGVkOiAwXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVycyBmdW5jdGlvbnMgdG8gbGlzdGVuIHRvIGJ1bmRsZSBsb2FkaW5nIHByb2dyZXNzIGV2ZW50cy5cbiAgICAgKiBAcGFyYW0gbmV4dCAtIENhbGxlZCB3aGVuIHRoZXJlIGlzIGEgcHJvZ3Jlc3MgdXBkYXRlIGZyb20gYnVuZGxlIGxvYWRpbmcuIFR5cGljYWxseSBgbmV4dGAgY2FsbHMgb2NjdXJcbiAgICAgKiAgIGVhY2ggdGltZSBhIEZpcmVzdG9yZSBkb2N1bWVudCBpcyBsb2FkZWQgZnJvbSB0aGUgYnVuZGxlLlxuICAgICAqIEBwYXJhbSBlcnJvciAtIENhbGxlZCB3aGVuIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgYnVuZGxlIGxvYWRpbmcuIFRoZSB0YXNrIGFib3J0cyBhZnRlciByZXBvcnRpbmcgdGhlXG4gICAgICogICBlcnJvciwgYW5kIHRoZXJlIHNob3VsZCBiZSBubyBtb3JlIHVwZGF0ZXMgYWZ0ZXIgdGhpcy5cbiAgICAgKiBAcGFyYW0gY29tcGxldGUgLSBDYWxsZWQgd2hlbiB0aGUgbG9hZGluZyB0YXNrIGlzIGNvbXBsZXRlLlxuICAgICAqLyAgICBvblByb2dyZXNzKHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy5fcHJvZ3Jlc3NPYnNlcnZlciA9IHtcbiAgICAgICAgICAgIG5leHQ6IHQsXG4gICAgICAgICAgICBlcnJvcjogZSxcbiAgICAgICAgICAgIGNvbXBsZXRlOiBuXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEltcGxlbWVudHMgdGhlIGBQcm9taXNlPExvYWRCdW5kbGVUYXNrUHJvZ3Jlc3M+LmNhdGNoYCBpbnRlcmZhY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb25SZWplY3RlZCAtIENhbGxlZCB3aGVuIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgYnVuZGxlIGxvYWRpbmcuXG4gICAgICovICAgIGNhdGNoKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Rhc2tDb21wbGV0aW9uUmVzb2x2ZXIucHJvbWlzZS5jYXRjaCh0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW1wbGVtZW50cyB0aGUgYFByb21pc2U8TG9hZEJ1bmRsZVRhc2tQcm9ncmVzcz4udGhlbmAgaW50ZXJmYWNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9uRnVsZmlsbGVkIC0gQ2FsbGVkIG9uIHRoZSBjb21wbGV0aW9uIG9mIHRoZSBsb2FkaW5nIHRhc2sgd2l0aCBhIGZpbmFsIGBMb2FkQnVuZGxlVGFza1Byb2dyZXNzYCB1cGRhdGUuXG4gICAgICogICBUaGUgdXBkYXRlIHdpbGwgYWx3YXlzIGhhdmUgaXRzIGB0YXNrU3RhdGVgIHNldCB0byBgXCJTdWNjZXNzXCJgLlxuICAgICAqIEBwYXJhbSBvblJlamVjdGVkIC0gQ2FsbGVkIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBidW5kbGUgbG9hZGluZy5cbiAgICAgKi8gICAgdGhlbih0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YXNrQ29tcGxldGlvblJlc29sdmVyLnByb21pc2UudGhlbih0LCBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTm90aWZpZXMgYWxsIG9ic2VydmVycyB0aGF0IGJ1bmRsZSBsb2FkaW5nIGhhcyBjb21wbGV0ZWQsIHdpdGggYSBwcm92aWRlZFxuICAgICAqIGBMb2FkQnVuZGxlVGFza1Byb2dyZXNzYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqLyAgICBfY29tcGxldGVXaXRoKHQpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlUHJvZ3Jlc3ModCksIHRoaXMuX3Byb2dyZXNzT2JzZXJ2ZXIuY29tcGxldGUgJiYgdGhpcy5fcHJvZ3Jlc3NPYnNlcnZlci5jb21wbGV0ZSgpLCBcbiAgICAgICAgdGhpcy5fdGFza0NvbXBsZXRpb25SZXNvbHZlci5yZXNvbHZlKHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOb3RpZmllcyBhbGwgb2JzZXJ2ZXJzIHRoYXQgYnVuZGxlIGxvYWRpbmcgaGFzIGZhaWxlZCwgd2l0aCBhIHByb3ZpZGVkXG4gICAgICogYEVycm9yYCBhcyB0aGUgcmVhc29uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi8gICAgX2ZhaWxXaXRoKHQpIHtcbiAgICAgICAgdGhpcy5fbGFzdFByb2dyZXNzLnRhc2tTdGF0ZSA9IFwiRXJyb3JcIiwgdGhpcy5fcHJvZ3Jlc3NPYnNlcnZlci5uZXh0ICYmIHRoaXMuX3Byb2dyZXNzT2JzZXJ2ZXIubmV4dCh0aGlzLl9sYXN0UHJvZ3Jlc3MpLCBcbiAgICAgICAgdGhpcy5fcHJvZ3Jlc3NPYnNlcnZlci5lcnJvciAmJiB0aGlzLl9wcm9ncmVzc09ic2VydmVyLmVycm9yKHQpLCB0aGlzLl90YXNrQ29tcGxldGlvblJlc29sdmVyLnJlamVjdCh0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTm90aWZpZXMgYSBwcm9ncmVzcyB1cGRhdGUgb2YgbG9hZGluZyBhIGJ1bmRsZS5cbiAgICAgKiBAcGFyYW0gcHJvZ3Jlc3MgLSBUaGUgbmV3IHByb2dyZXNzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi8gICAgX3VwZGF0ZVByb2dyZXNzKHQpIHtcbiAgICAgICAgdGhpcy5fbGFzdFByb2dyZXNzID0gdCwgdGhpcy5fcHJvZ3Jlc3NPYnNlcnZlci5uZXh0ICYmIHRoaXMuX3Byb2dyZXNzT2JzZXJ2ZXIubmV4dCh0KTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogRE9NRXhjZXB0aW9uIGVycm9yIGNvZGUgY29uc3RhbnRzLiAqLyBjb25zdCBtYyA9IC0xO1xuXG4vKipcbiAqIFRoZSBDbG91ZCBGaXJlc3RvcmUgc2VydmljZSBpbnRlcmZhY2UuXG4gKlxuICogRG8gbm90IGNhbGwgdGhpcyBjb25zdHJ1Y3RvciBkaXJlY3RseS4gSW5zdGVhZCwgdXNlIHtAbGluayBnZXRGaXJlc3RvcmV9LlxuICovXG5jbGFzcyBnYyBleHRlbmRzIHNjIHtcbiAgICAvKiogQGhpZGVjb25zdHJ1Y3RvciAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgc3VwZXIodCwgZSwgbiksIFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hldGhlciBpdCdzIGEge0BsaW5rIEZpcmVzdG9yZX0gb3IgRmlyZXN0b3JlIExpdGUgaW5zdGFuY2UuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnR5cGUgPSBcImZpcmVzdG9yZVwiLCB0aGlzLl9xdWV1ZSA9IG5ldyBkYywgdGhpcy5fcGVyc2lzdGVuY2VLZXkgPSBcIm5hbWVcIiBpbiB0ID8gdC5uYW1lIDogXCJbREVGQVVMVF1cIjtcbiAgICB9XG4gICAgX3Rlcm1pbmF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpcmVzdG9yZUNsaWVudCB8fCBcbiAgICAgICAgLy8gVGhlIGNsaWVudCBtdXN0IGJlIGluaXRpYWxpemVkIHRvIGVuc3VyZSB0aGF0IGFsbCBzdWJzZXF1ZW50IEFQSVxuICAgICAgICAvLyB1c2FnZSB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuICAgICAgICBUYyh0aGlzKSwgdGhpcy5fZmlyZXN0b3JlQ2xpZW50LnRlcm1pbmF0ZSgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgRmlyZXN0b3JlfSB3aXRoIHRoZSBwcm92aWRlZCBzZXR0aW5ncy5cbiAqIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIGZ1bmN0aW9uLCBpbmNsdWRpbmdcbiAqIHtAbGluayBnZXRGaXJlc3RvcmV9LiBJZiB0aGUgY3VzdG9tIHNldHRpbmdzIGFyZSBlbXB0eSwgdGhpcyBmdW5jdGlvbiBpc1xuICogZXF1aXZhbGVudCB0byBjYWxsaW5nIHtAbGluayBnZXRGaXJlc3RvcmV9LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUge0BsaW5rIEBmaXJlYmFzZS9hcHAjRmlyZWJhc2VBcHB9IHdpdGggd2hpY2ggdGhlIHtAbGluayBGaXJlc3RvcmV9IGluc3RhbmNlIHdpbGxcbiAqIGJlIGFzc29jaWF0ZWQuXG4gKiBAcGFyYW0gc2V0dGluZ3MgLSBBIHNldHRpbmdzIG9iamVjdCB0byBjb25maWd1cmUgdGhlIHtAbGluayBGaXJlc3RvcmV9IGluc3RhbmNlLlxuICogQHJldHVybnMgQSBuZXdseSBpbml0aWFsaXplZCB7QGxpbmsgRmlyZXN0b3JlfSBpbnN0YW5jZS5cbiAqLyBmdW5jdGlvbiB5Yyh0LCBlKSB7XG4gICAgY29uc3QgbiA9IF9nZXRQcm92aWRlcih0LCBcImZpcmVzdG9yZVwiKTtcbiAgICBpZiAobi5pc0luaXRpYWxpemVkKCkpIHtcbiAgICAgICAgY29uc3QgdCA9IG4uZ2V0SW1tZWRpYXRlKCksIHMgPSBuLmdldE9wdGlvbnMoKTtcbiAgICAgICAgaWYgKGRlZXBFcXVhbChzLCBlKSkgcmV0dXJuIHQ7XG4gICAgICAgIHRocm93IG5ldyBRKEcuRkFJTEVEX1BSRUNPTkRJVElPTiwgXCJpbml0aWFsaXplRmlyZXN0b3JlKCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgd2l0aCBkaWZmZXJlbnQgb3B0aW9ucy4gVG8gYXZvaWQgdGhpcyBlcnJvciwgY2FsbCBpbml0aWFsaXplRmlyZXN0b3JlKCkgd2l0aCB0aGUgc2FtZSBvcHRpb25zIGFzIHdoZW4gaXQgd2FzIG9yaWdpbmFsbHkgY2FsbGVkLCBvciBjYWxsIGdldEZpcmVzdG9yZSgpIHRvIHJldHVybiB0aGUgYWxyZWFkeSBpbml0aWFsaXplZCBpbnN0YW5jZS5cIik7XG4gICAgfVxuICAgIGlmICh2b2lkIDAgIT09IGUuY2FjaGVTaXplQnl0ZXMgJiYgLTEgIT09IGUuY2FjaGVTaXplQnl0ZXMgJiYgZS5jYWNoZVNpemVCeXRlcyA8IDEwNDg1NzYpIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgXCJjYWNoZVNpemVCeXRlcyBtdXN0IGJlIGF0IGxlYXN0IDEwNDg1NzZcIik7XG4gICAgcmV0dXJuIG4uaW5pdGlhbGl6ZSh7XG4gICAgICAgIG9wdGlvbnM6IGVcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBleGlzdGluZyB7QGxpbmsgRmlyZXN0b3JlfSBpbnN0YW5jZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGVcbiAqIHByb3ZpZGVkIHtAbGluayBAZmlyZWJhc2UvYXBwI0ZpcmViYXNlQXBwfS4gSWYgbm8gaW5zdGFuY2UgZXhpc3RzLCBpbml0aWFsaXplcyBhIG5ld1xuICogaW5zdGFuY2Ugd2l0aCBkZWZhdWx0IHNldHRpbmdzLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUge0BsaW5rIEBmaXJlYmFzZS9hcHAjRmlyZWJhc2VBcHB9IGluc3RhbmNlIHRoYXQgdGhlIHJldHVybmVkIHtAbGluayBGaXJlc3RvcmV9XG4gKiBpbnN0YW5jZSBpcyBhc3NvY2lhdGVkIHdpdGguXG4gKiBAcmV0dXJucyBUaGUge0BsaW5rIEZpcmVzdG9yZX0gaW5zdGFuY2Ugb2YgdGhlIHByb3ZpZGVkIGFwcC5cbiAqLyBmdW5jdGlvbiBwYyhlID0gZ2V0QXBwKCkpIHtcbiAgICByZXR1cm4gX2dldFByb3ZpZGVyKGUsIFwiZmlyZXN0b3JlXCIpLmdldEltbWVkaWF0ZSgpO1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovIGZ1bmN0aW9uIEljKHQpIHtcbiAgICByZXR1cm4gdC5fZmlyZXN0b3JlQ2xpZW50IHx8IFRjKHQpLCB0Ll9maXJlc3RvcmVDbGllbnQudmVyaWZ5Tm90VGVybWluYXRlZCgpLCB0Ll9maXJlc3RvcmVDbGllbnQ7XG59XG5cbmZ1bmN0aW9uIFRjKHQpIHtcbiAgICB2YXIgZTtcbiAgICBjb25zdCBuID0gdC5fZnJlZXplU2V0dGluZ3MoKSwgcyA9IGZ1bmN0aW9uKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWdCh0LCBlLCBuLCBzLmhvc3QsIHMuc3NsLCBzLmV4cGVyaW1lbnRhbEZvcmNlTG9uZ1BvbGxpbmcsIHMuZXhwZXJpbWVudGFsQXV0b0RldGVjdExvbmdQb2xsaW5nLCBzLnVzZUZldGNoU3RyZWFtcyk7XG4gICAgfSh0Ll9kYXRhYmFzZUlkLCAobnVsbCA9PT0gKGUgPSB0Ll9hcHApIHx8IHZvaWQgMCA9PT0gZSA/IHZvaWQgMCA6IGUub3B0aW9ucy5hcHBJZCkgfHwgXCJcIiwgdC5fcGVyc2lzdGVuY2VLZXksIG4pO1xuICAgIHQuX2ZpcmVzdG9yZUNsaWVudCA9IG5ldyB2dSh0Ll9hdXRoQ3JlZGVudGlhbHMsIHQuX2FwcENoZWNrQ3JlZGVudGlhbHMsIHQuX3F1ZXVlLCBzKTtcbn1cblxuLyoqXG4gKiBBdHRlbXB0cyB0byBlbmFibGUgcGVyc2lzdGVudCBzdG9yYWdlLCBpZiBwb3NzaWJsZS5cbiAqXG4gKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIGZ1bmN0aW9ucyAob3RoZXIgdGhhblxuICoge0BsaW5rIGluaXRpYWxpemVGaXJlc3RvcmV9LCB7QGxpbmsgZ2V0RmlyZXN0b3JlfSBvclxuICoge0BsaW5rIGNsZWFySW5kZXhlZERiUGVyc2lzdGVuY2V9LlxuICpcbiAqIElmIHRoaXMgZmFpbHMsIGBlbmFibGVJbmRleGVkRGJQZXJzaXN0ZW5jZSgpYCB3aWxsIHJlamVjdCB0aGUgcHJvbWlzZSBpdFxuICogcmV0dXJucy4gTm90ZSB0aGF0IGV2ZW4gYWZ0ZXIgdGhpcyBmYWlsdXJlLCB0aGUge0BsaW5rIEZpcmVzdG9yZX0gaW5zdGFuY2Ugd2lsbFxuICogcmVtYWluIHVzYWJsZSwgaG93ZXZlciBvZmZsaW5lIHBlcnNpc3RlbmNlIHdpbGwgYmUgZGlzYWJsZWQuXG4gKlxuICogVGhlcmUgYXJlIHNldmVyYWwgcmVhc29ucyB3aHkgdGhpcyBjYW4gZmFpbCwgd2hpY2ggY2FuIGJlIGlkZW50aWZpZWQgYnlcbiAqIHRoZSBgY29kZWAgb24gdGhlIGVycm9yLlxuICpcbiAqICAgKiBmYWlsZWQtcHJlY29uZGl0aW9uOiBUaGUgYXBwIGlzIGFscmVhZHkgb3BlbiBpbiBhbm90aGVyIGJyb3dzZXIgdGFiLlxuICogICAqIHVuaW1wbGVtZW50ZWQ6IFRoZSBicm93c2VyIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBvZmZsaW5lXG4gKiAgICAgcGVyc2lzdGVuY2UgaW1wbGVtZW50YXRpb24uXG4gKlxuICogQHBhcmFtIGZpcmVzdG9yZSAtIFRoZSB7QGxpbmsgRmlyZXN0b3JlfSBpbnN0YW5jZSB0byBlbmFibGUgcGVyc2lzdGVuY2UgZm9yLlxuICogQHBhcmFtIHBlcnNpc3RlbmNlU2V0dGluZ3MgLSBPcHRpb25hbCBzZXR0aW5ncyBvYmplY3QgdG8gY29uZmlndXJlXG4gKiBwZXJzaXN0ZW5jZS5cbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIHRoYXQgcmVwcmVzZW50cyBzdWNjZXNzZnVsbHkgZW5hYmxpbmcgcGVyc2lzdGVudCBzdG9yYWdlLlxuICovIGZ1bmN0aW9uIEVjKHQsIGUpIHtcbiAgICB4Yyh0ID0gdGModCwgZ2MpKTtcbiAgICBjb25zdCBuID0gSWModCksIHMgPSB0Ll9mcmVlemVTZXR0aW5ncygpLCBpID0gbmV3IEV1O1xuICAgIHJldHVybiBSYyhuLCBpLCBuZXcgSXUoaSwgcy5jYWNoZVNpemVCeXRlcywgbnVsbCA9PSBlID8gdm9pZCAwIDogZS5mb3JjZU93bmVyc2hpcCkpO1xufVxuXG4vKipcbiAqIEF0dGVtcHRzIHRvIGVuYWJsZSBtdWx0aS10YWIgcGVyc2lzdGVudCBzdG9yYWdlLCBpZiBwb3NzaWJsZS4gSWYgZW5hYmxlZFxuICogYWNyb3NzIGFsbCB0YWJzLCBhbGwgb3BlcmF0aW9ucyBzaGFyZSBhY2Nlc3MgdG8gbG9jYWwgcGVyc2lzdGVuY2UsIGluY2x1ZGluZ1xuICogc2hhcmVkIGV4ZWN1dGlvbiBvZiBxdWVyaWVzIGFuZCBsYXRlbmN5LWNvbXBlbnNhdGVkIGxvY2FsIGRvY3VtZW50IHVwZGF0ZXNcbiAqIGFjcm9zcyBhbGwgY29ubmVjdGVkIGluc3RhbmNlcy5cbiAqXG4gKiBJZiB0aGlzIGZhaWxzLCBgZW5hYmxlTXVsdGlUYWJJbmRleGVkRGJQZXJzaXN0ZW5jZSgpYCB3aWxsIHJlamVjdCB0aGUgcHJvbWlzZVxuICogaXQgcmV0dXJucy4gTm90ZSB0aGF0IGV2ZW4gYWZ0ZXIgdGhpcyBmYWlsdXJlLCB0aGUge0BsaW5rIEZpcmVzdG9yZX0gaW5zdGFuY2Ugd2lsbFxuICogcmVtYWluIHVzYWJsZSwgaG93ZXZlciBvZmZsaW5lIHBlcnNpc3RlbmNlIHdpbGwgYmUgZGlzYWJsZWQuXG4gKlxuICogVGhlcmUgYXJlIHNldmVyYWwgcmVhc29ucyB3aHkgdGhpcyBjYW4gZmFpbCwgd2hpY2ggY2FuIGJlIGlkZW50aWZpZWQgYnlcbiAqIHRoZSBgY29kZWAgb24gdGhlIGVycm9yLlxuICpcbiAqICAgKiBmYWlsZWQtcHJlY29uZGl0aW9uOiBUaGUgYXBwIGlzIGFscmVhZHkgb3BlbiBpbiBhbm90aGVyIGJyb3dzZXIgdGFiIGFuZFxuICogICAgIG11bHRpLXRhYiBpcyBub3QgZW5hYmxlZC5cbiAqICAgKiB1bmltcGxlbWVudGVkOiBUaGUgYnJvd3NlciBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgb2ZmbGluZVxuICogICAgIHBlcnNpc3RlbmNlIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEBwYXJhbSBmaXJlc3RvcmUgLSBUaGUge0BsaW5rIEZpcmVzdG9yZX0gaW5zdGFuY2UgdG8gZW5hYmxlIHBlcnNpc3RlbmNlIGZvci5cbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIHRoYXQgcmVwcmVzZW50cyBzdWNjZXNzZnVsbHkgZW5hYmxpbmcgcGVyc2lzdGVudFxuICogc3RvcmFnZS5cbiAqLyBmdW5jdGlvbiBBYyh0KSB7XG4gICAgeGModCA9IHRjKHQsIGdjKSk7XG4gICAgY29uc3QgZSA9IEljKHQpLCBuID0gdC5fZnJlZXplU2V0dGluZ3MoKSwgcyA9IG5ldyBFdTtcbiAgICByZXR1cm4gUmMoZSwgcywgbmV3IFR1KHMsIG4uY2FjaGVTaXplQnl0ZXMpKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYm90aCB0aGUgYE9mZmxpbmVDb21wb25lbnRQcm92aWRlcmAgYW5kIGBPbmxpbmVDb21wb25lbnRQcm92aWRlcmAuXG4gKiBJZiB0aGUgb3BlcmF0aW9uIGZhaWxzIHdpdGggYSByZWNvdmVyYWJsZSBlcnJvciAoc2VlXG4gKiBgY2FuUmVjb3ZlckZyb21JbmRleGVkRGJFcnJvcigpYCBiZWxvdyksIHRoZSByZXR1cm5lZCBQcm9taXNlIGlzIHJlamVjdGVkXG4gKiBidXQgdGhlIGNsaWVudCByZW1haW5zIHVzYWJsZS5cbiAqLyBmdW5jdGlvbiBSYyh0LCBlLCBuKSB7XG4gICAgY29uc3QgcyA9IG5ldyBqO1xuICAgIHJldHVybiB0LmFzeW5jUXVldWUuZW5xdWV1ZSgoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgU3UodCwgbiksIGF3YWl0IER1KHQsIGUpLCBzLnJlc29sdmUoKTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgaWYgKCFcbiAgICAgICAgICAgIC8qKlxuICogRGVjaWRlcyB3aGV0aGVyIHRoZSBwcm92aWRlZCBlcnJvciBhbGxvd3MgdXMgdG8gZ3JhY2VmdWxseSBkaXNhYmxlXG4gKiBwZXJzaXN0ZW5jZSAoYXMgb3Bwb3NlZCB0byBjcmFzaGluZyB0aGUgY2xpZW50KS5cbiAqL1xuICAgICAgICAgICAgZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIGlmIChcIkZpcmViYXNlRXJyb3JcIiA9PT0gdC5uYW1lKSByZXR1cm4gdC5jb2RlID09PSBHLkZBSUxFRF9QUkVDT05ESVRJT04gfHwgdC5jb2RlID09PSBHLlVOSU1QTEVNRU5URUQ7XG4gICAgICAgICAgICAgICAgaWYgKFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIERPTUV4Y2VwdGlvbiAmJiB0IGluc3RhbmNlb2YgRE9NRXhjZXB0aW9uKSBcbiAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgYSBmZXcga25vd24gY2lyY3Vtc3RhbmNlcyB3aGVyZSB3ZSBjYW4gb3BlbiBJbmRleGVkRGIgYnV0XG4gICAgICAgICAgICAgICAgLy8gdHJ5aW5nIHRvIHJlYWQvd3JpdGUgd2lsbCBmYWlsIChlLmcuIHF1b3RhIGV4Y2VlZGVkKS4gRm9yXG4gICAgICAgICAgICAgICAgLy8gd2VsbC11bmRlcnN0b29kIGNhc2VzLCB3ZSBhdHRlbXB0IHRvIGRldGVjdCB0aGVzZSBhbmQgdGhlbiBncmFjZWZ1bGx5XG4gICAgICAgICAgICAgICAgLy8gZmFsbCBiYWNrIHRvIG1lbW9yeSBwZXJzaXN0ZW5jZS5cbiAgICAgICAgICAgICAgICAvLyBOT1RFOiBSYXRoZXIgdGhhbiBjb250aW51ZSB0byBhZGQgdG8gdGhpcyBsaXN0LCB3ZSBjb3VsZCBkZWNpZGUgdG9cbiAgICAgICAgICAgICAgICAvLyBhbHdheXMgZmFsbCBiYWNrLCB3aXRoIHRoZSByaXNrIHRoYXQgd2UgbWlnaHQgYWNjaWRlbnRhbGx5IGhpZGUgZXJyb3JzXG4gICAgICAgICAgICAgICAgLy8gcmVwcmVzZW50aW5nIGFjdHVhbCBTREsgYnVncy5cbiAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBicm93c2VyIGlzIG91dCBvZiBxdW90YSB3ZSBjb3VsZCBnZXQgZWl0aGVyIHF1b3RhIGV4Y2VlZGVkXG4gICAgICAgICAgICAgICAgLy8gb3IgYW4gYWJvcnRlZCBlcnJvciBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgZXJyb3IgaGFwcGVuZWQgZHVyaW5nXG4gICAgICAgICAgICAgICAgLy8gc2NoZW1hIG1pZ3JhdGlvbi5cbiAgICAgICAgICAgICAgICByZXR1cm4gMjIgPT09IHQuY29kZSB8fCAyMCA9PT0gdC5jb2RlIHx8IFxuICAgICAgICAgICAgICAgIC8vIEZpcmVmb3ggUHJpdmF0ZSBCcm93c2luZyBtb2RlIGRpc2FibGVzIEluZGV4ZWREYiBhbmQgcmV0dXJuc1xuICAgICAgICAgICAgICAgIC8vIElOVkFMSURfU1RBVEUgZm9yIGFueSB1c2FnZS5cbiAgICAgICAgICAgICAgICAxMSA9PT0gdC5jb2RlO1xuICAgICAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICogQ2xlYXJzIHRoZSBwZXJzaXN0ZW50IHN0b3JhZ2UuIFRoaXMgaW5jbHVkZXMgcGVuZGluZyB3cml0ZXMgYW5kIGNhY2hlZFxuICogZG9jdW1lbnRzLlxuICpcbiAqIE11c3QgYmUgY2FsbGVkIHdoaWxlIHRoZSB7QGxpbmsgRmlyZXN0b3JlfSBpbnN0YW5jZSBpcyBub3Qgc3RhcnRlZCAoYWZ0ZXIgdGhlIGFwcCBpc1xuICogdGVybWluYXRlZCBvciB3aGVuIHRoZSBhcHAgaXMgZmlyc3QgaW5pdGlhbGl6ZWQpLiBPbiBzdGFydHVwLCB0aGlzIGZ1bmN0aW9uXG4gKiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgb3RoZXIgZnVuY3Rpb25zIChvdGhlciB0aGFuIHtAbGlua1xuICogaW5pdGlhbGl6ZUZpcmVzdG9yZX0gb3Ige0BsaW5rIGdldEZpcmVzdG9yZX0pKS4gSWYgdGhlIHtAbGluayBGaXJlc3RvcmV9XG4gKiBpbnN0YW5jZSBpcyBzdGlsbCBydW5uaW5nLCB0aGUgcHJvbWlzZSB3aWxsIGJlIHJlamVjdGVkIHdpdGggdGhlIGVycm9yIGNvZGVcbiAqIG9mIGBmYWlsZWQtcHJlY29uZGl0aW9uYC5cbiAqXG4gKiBOb3RlOiBgY2xlYXJJbmRleGVkRGJQZXJzaXN0ZW5jZSgpYCBpcyBwcmltYXJpbHkgaW50ZW5kZWQgdG8gaGVscCB3cml0ZVxuICogcmVsaWFibGUgdGVzdHMgdGhhdCB1c2UgQ2xvdWQgRmlyZXN0b3JlLiBJdCB1c2VzIGFuIGVmZmljaWVudCBtZWNoYW5pc20gZm9yXG4gKiBkcm9wcGluZyBleGlzdGluZyBkYXRhIGJ1dCBkb2VzIG5vdCBhdHRlbXB0IHRvIHNlY3VyZWx5IG92ZXJ3cml0ZSBvclxuICogb3RoZXJ3aXNlIG1ha2UgY2FjaGVkIGRhdGEgdW5yZWNvdmVyYWJsZS4gRm9yIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBzZW5zaXRpdmVcbiAqIHRvIHRoZSBkaXNjbG9zdXJlIG9mIGNhY2hlZCBkYXRhIGluIGJldHdlZW4gdXNlciBzZXNzaW9ucywgd2Ugc3Ryb25nbHlcbiAqIHJlY29tbWVuZCBub3QgZW5hYmxpbmcgcGVyc2lzdGVuY2UgYXQgYWxsLlxuICpcbiAqIEBwYXJhbSBmaXJlc3RvcmUgLSBUaGUge0BsaW5rIEZpcmVzdG9yZX0gaW5zdGFuY2UgdG8gY2xlYXIgcGVyc2lzdGVuY2UgZm9yLlxuICogQHJldHVybnMgQSBgUHJvbWlzZWAgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSBwZXJzaXN0ZW50IHN0b3JhZ2UgaXNcbiAqIGNsZWFyZWQuIE90aGVyd2lzZSwgdGhlIHByb21pc2UgaXMgcmVqZWN0ZWQgd2l0aCBhbiBlcnJvci5cbiAqLyAodCkpIHRocm93IHQ7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJFcnJvciBlbmFibGluZyBvZmZsaW5lIHBlcnNpc3RlbmNlLiBGYWxsaW5nIGJhY2sgdG8gcGVyc2lzdGVuY2UgZGlzYWJsZWQ6IFwiICsgdCksIFxuICAgICAgICAgICAgcy5yZWplY3QodCk7XG4gICAgICAgIH1cbiAgICB9KSkudGhlbigoKCkgPT4gcy5wcm9taXNlKSk7XG59XG5cbmZ1bmN0aW9uIGJjKHQpIHtcbiAgICBpZiAodC5faW5pdGlhbGl6ZWQgJiYgIXQuX3Rlcm1pbmF0ZWQpIHRocm93IG5ldyBRKEcuRkFJTEVEX1BSRUNPTkRJVElPTiwgXCJQZXJzaXN0ZW5jZSBjYW4gb25seSBiZSBjbGVhcmVkIGJlZm9yZSBhIEZpcmVzdG9yZSBpbnN0YW5jZSBpcyBpbml0aWFsaXplZCBvciBhZnRlciBpdCBpcyB0ZXJtaW5hdGVkLlwiKTtcbiAgICBjb25zdCBlID0gbmV3IGo7XG4gICAgcmV0dXJuIHQuX3F1ZXVlLmVucXVldWVBbmRGb3JnZXRFdmVuV2hpbGVSZXN0cmljdGVkKChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBhc3luYyBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFoaS52dCgpKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IHQgKyBcIm1haW5cIjtcbiAgICAgICAgICAgICAgICBhd2FpdCBoaS5kZWxldGUoZSk7XG4gICAgICAgICAgICB9KExyKHQuX2RhdGFiYXNlSWQsIHQuX3BlcnNpc3RlbmNlS2V5KSksIGUucmVzb2x2ZSgpO1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICBlLnJlamVjdCh0KTtcbiAgICAgICAgfVxuICAgIH0pKSwgZS5wcm9taXNlO1xufVxuXG4vKipcbiAqIFdhaXRzIHVudGlsIGFsbCBjdXJyZW50bHkgcGVuZGluZyB3cml0ZXMgZm9yIHRoZSBhY3RpdmUgdXNlciBoYXZlIGJlZW5cbiAqIGFja25vd2xlZGdlZCBieSB0aGUgYmFja2VuZC5cbiAqXG4gKiBUaGUgcmV0dXJuZWQgcHJvbWlzZSByZXNvbHZlcyBpbW1lZGlhdGVseSBpZiB0aGVyZSBhcmUgbm8gb3V0c3RhbmRpbmcgd3JpdGVzLlxuICogT3RoZXJ3aXNlLCB0aGUgcHJvbWlzZSB3YWl0cyBmb3IgYWxsIHByZXZpb3VzbHkgaXNzdWVkIHdyaXRlcyAoaW5jbHVkaW5nXG4gKiB0aG9zZSB3cml0dGVuIGluIGEgcHJldmlvdXMgYXBwIHNlc3Npb24pLCBidXQgaXQgZG9lcyBub3Qgd2FpdCBmb3Igd3JpdGVzXG4gKiB0aGF0IHdlcmUgYWRkZWQgYWZ0ZXIgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4gSWYgeW91IHdhbnQgdG8gd2FpdCBmb3JcbiAqIGFkZGl0aW9uYWwgd3JpdGVzLCBjYWxsIGB3YWl0Rm9yUGVuZGluZ1dyaXRlcygpYCBhZ2Fpbi5cbiAqXG4gKiBBbnkgb3V0c3RhbmRpbmcgYHdhaXRGb3JQZW5kaW5nV3JpdGVzKClgIHByb21pc2VzIGFyZSByZWplY3RlZCBkdXJpbmcgdXNlclxuICogY2hhbmdlcy5cbiAqXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCB3aGljaCByZXNvbHZlcyB3aGVuIGFsbCBjdXJyZW50bHkgcGVuZGluZyB3cml0ZXMgaGF2ZSBiZWVuXG4gKiBhY2tub3dsZWRnZWQgYnkgdGhlIGJhY2tlbmQuXG4gKi8gZnVuY3Rpb24gUGModCkge1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBuZXcgajtcbiAgICAgICAgcmV0dXJuIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0KChhc3luYyAoKSA9PiBKYShhd2FpdCBPdSh0KSwgZSkpKSwgZS5wcm9taXNlO1xuICAgIH0oSWModCA9IHRjKHQsIGdjKSkpO1xufVxuXG4vKipcbiAqIFJlLWVuYWJsZXMgdXNlIG9mIHRoZSBuZXR3b3JrIGZvciB0aGlzIHtAbGluayBGaXJlc3RvcmV9IGluc3RhbmNlIGFmdGVyIGEgcHJpb3JcbiAqIGNhbGwgdG8ge0BsaW5rIGRpc2FibGVOZXR3b3JrfS5cbiAqXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCB0aGF0IGlzIHJlc29sdmVkIG9uY2UgdGhlIG5ldHdvcmsgaGFzIGJlZW4gZW5hYmxlZC5cbiAqLyBmdW5jdGlvbiBWYyh0KSB7XG4gICAgcmV0dXJuIEZ1KEljKHQgPSB0Yyh0LCBnYykpKTtcbn1cblxuLyoqXG4gKiBEaXNhYmxlcyBuZXR3b3JrIHVzYWdlIGZvciB0aGlzIGluc3RhbmNlLiBJdCBjYW4gYmUgcmUtZW5hYmxlZCB2aWEge0BsaW5rXG4gKiBlbmFibGVOZXR3b3JrfS4gV2hpbGUgdGhlIG5ldHdvcmsgaXMgZGlzYWJsZWQsIGFueSBzbmFwc2hvdCBsaXN0ZW5lcnMsXG4gKiBgZ2V0RG9jKClgIG9yIGBnZXREb2NzKClgIGNhbGxzIHdpbGwgcmV0dXJuIHJlc3VsdHMgZnJvbSBjYWNoZSwgYW5kIGFueSB3cml0ZVxuICogb3BlcmF0aW9ucyB3aWxsIGJlIHF1ZXVlZCB1bnRpbCB0aGUgbmV0d29yayBpcyByZXN0b3JlZC5cbiAqXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCB0aGF0IGlzIHJlc29sdmVkIG9uY2UgdGhlIG5ldHdvcmsgaGFzIGJlZW4gZGlzYWJsZWQuXG4gKi8gZnVuY3Rpb24gdmModCkge1xuICAgIHJldHVybiBCdShJYyh0ID0gdGModCwgZ2MpKSk7XG59XG5cbi8qKlxuICogVGVybWluYXRlcyB0aGUgcHJvdmlkZWQge0BsaW5rIEZpcmVzdG9yZX0gaW5zdGFuY2UuXG4gKlxuICogQWZ0ZXIgY2FsbGluZyBgdGVybWluYXRlKClgIG9ubHkgdGhlIGBjbGVhckluZGV4ZWREYlBlcnNpc3RlbmNlKClgIGZ1bmN0aW9uXG4gKiBtYXkgYmUgdXNlZC4gQW55IG90aGVyIGZ1bmN0aW9uIHdpbGwgdGhyb3cgYSBgRmlyZXN0b3JlRXJyb3JgLlxuICpcbiAqIFRvIHJlc3RhcnQgYWZ0ZXIgdGVybWluYXRpb24sIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBGaXJlYmFzZUZpcmVzdG9yZSB3aXRoXG4gKiB7QGxpbmsgZ2V0RmlyZXN0b3JlfS5cbiAqXG4gKiBUZXJtaW5hdGlvbiBkb2VzIG5vdCBjYW5jZWwgYW55IHBlbmRpbmcgd3JpdGVzLCBhbmQgYW55IHByb21pc2VzIHRoYXQgYXJlXG4gKiBhd2FpdGluZyBhIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciB3aWxsIG5vdCBiZSByZXNvbHZlZC4gSWYgeW91IGhhdmVcbiAqIHBlcnNpc3RlbmNlIGVuYWJsZWQsIHRoZSBuZXh0IHRpbWUgeW91IHN0YXJ0IHRoaXMgaW5zdGFuY2UsIGl0IHdpbGwgcmVzdW1lXG4gKiBzZW5kaW5nIHRoZXNlIHdyaXRlcyB0byB0aGUgc2VydmVyLlxuICpcbiAqIE5vdGU6IFVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLCBjYWxsaW5nIGB0ZXJtaW5hdGUoKWAgaXMgbm90IHJlcXVpcmVkLiBUaGlzXG4gKiBmdW5jdGlvbiBpcyB1c2VmdWwgb25seSB3aGVuIHlvdSB3YW50IHRvIGZvcmNlIHRoaXMgaW5zdGFuY2UgdG8gcmVsZWFzZSBhbGxcbiAqIG9mIGl0cyByZXNvdXJjZXMgb3IgaW4gY29tYmluYXRpb24gd2l0aCBgY2xlYXJJbmRleGVkRGJQZXJzaXN0ZW5jZSgpYCB0b1xuICogZW5zdXJlIHRoYXQgYWxsIGxvY2FsIHN0YXRlIGlzIGRlc3Ryb3llZCBiZXR3ZWVuIHRlc3QgcnVucy5cbiAqXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIGluc3RhbmNlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseVxuICogdGVybWluYXRlZC5cbiAqLyBmdW5jdGlvbiBTYyh0KSB7XG4gICAgcmV0dXJuIF9yZW1vdmVTZXJ2aWNlSW5zdGFuY2UodC5hcHAsIFwiZmlyZXN0b3JlXCIpLCB0Ll9kZWxldGUoKTtcbn1cblxuLyoqXG4gKiBMb2FkcyBhIEZpcmVzdG9yZSBidW5kbGUgaW50byB0aGUgbG9jYWwgY2FjaGUuXG4gKlxuICogQHBhcmFtIGZpcmVzdG9yZSAtIFRoZSB7QGxpbmsgRmlyZXN0b3JlfSBpbnN0YW5jZSB0byBsb2FkIGJ1bmRsZXMgZm9yLlxuICogQHBhcmFtIGJ1bmRsZURhdGEgLSBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBidW5kbGUgdG8gYmUgbG9hZGVkLiBWYWxpZFxuICogb2JqZWN0cyBhcmUgYEFycmF5QnVmZmVyYCwgYFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+YCBvciBgc3RyaW5nYC5cbiAqXG4gKiBAcmV0dXJucyBBIGBMb2FkQnVuZGxlVGFza2Agb2JqZWN0LCB3aGljaCBub3RpZmllcyBjYWxsZXJzIHdpdGggcHJvZ3Jlc3NcbiAqIHVwZGF0ZXMsIGFuZCBjb21wbGV0aW9uIG9yIGVycm9yIGV2ZW50cy4gSXQgY2FuIGJlIHVzZWQgYXMgYVxuICogYFByb21pc2U8TG9hZEJ1bmRsZVRhc2tQcm9ncmVzcz5gLlxuICovIGZ1bmN0aW9uIERjKHQsIGUpIHtcbiAgICBjb25zdCBuID0gSWModCA9IHRjKHQsIGdjKSksIHMgPSBuZXcgd2M7XG4gICAgcmV0dXJuIGp1KG4sIHQuX2RhdGFiYXNlSWQsIGUsIHMpLCBzO1xufVxuXG4vKipcbiAqIFJlYWRzIGEgRmlyZXN0b3JlIHtAbGluayBRdWVyeX0gZnJvbSBsb2NhbCBjYWNoZSwgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW5cbiAqIG5hbWUuXG4gKlxuICogVGhlIG5hbWVkIHF1ZXJpZXMgYXJlIHBhY2thZ2VkICBpbnRvIGJ1bmRsZXMgb24gdGhlIHNlcnZlciBzaWRlIChhbG9uZ1xuICogd2l0aCByZXN1bHRpbmcgZG9jdW1lbnRzKSwgYW5kIGxvYWRlZCB0byBsb2NhbCBjYWNoZSB1c2luZyBgbG9hZEJ1bmRsZWAuIE9uY2VcbiAqIGluIGxvY2FsIGNhY2hlLCB1c2UgdGhpcyBtZXRob2QgdG8gZXh0cmFjdCBhIHtAbGluayBRdWVyeX0gYnkgbmFtZS5cbiAqXG4gKiBAcGFyYW0gZmlyZXN0b3JlIC0gVGhlIHtAbGluayBGaXJlc3RvcmV9IGluc3RhbmNlIHRvIHJlYWQgdGhlIHF1ZXJ5IGZyb20uXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBxdWVyeS5cbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgUXVlcnkgb3IgYG51bGxgLlxuICovIGZ1bmN0aW9uIENjKHQsIGUpIHtcbiAgICByZXR1cm4gV3UoSWModCA9IHRjKHQsIGdjKSksIGUpLnRoZW4oKGUgPT4gZSA/IG5ldyBvYyh0LCBudWxsLCBlLnF1ZXJ5KSA6IG51bGwpKTtcbn1cblxuZnVuY3Rpb24geGModCkge1xuICAgIGlmICh0Ll9pbml0aWFsaXplZCB8fCB0Ll90ZXJtaW5hdGVkKSB0aHJvdyBuZXcgUShHLkZBSUxFRF9QUkVDT05ESVRJT04sIFwiRmlyZXN0b3JlIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZCBhbmQgcGVyc2lzdGVuY2UgY2FuIG5vIGxvbmdlciBiZSBlbmFibGVkLiBZb3UgY2FuIG9ubHkgZW5hYmxlIHBlcnNpc3RlbmNlIGJlZm9yZSBjYWxsaW5nIGFueSBvdGhlciBtZXRob2RzIG9uIGEgRmlyZXN0b3JlIG9iamVjdC5cIik7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIGBGaWVsZFBhdGhgIHJlZmVycyB0byBhIGZpZWxkIGluIGEgZG9jdW1lbnQuIFRoZSBwYXRoIG1heSBjb25zaXN0IG9mIGFcbiAqIHNpbmdsZSBmaWVsZCBuYW1lIChyZWZlcnJpbmcgdG8gYSB0b3AtbGV2ZWwgZmllbGQgaW4gdGhlIGRvY3VtZW50KSwgb3IgYVxuICogbGlzdCBvZiBmaWVsZCBuYW1lcyAocmVmZXJyaW5nIHRvIGEgbmVzdGVkIGZpZWxkIGluIHRoZSBkb2N1bWVudCkuXG4gKlxuICogQ3JlYXRlIGEgYEZpZWxkUGF0aGAgYnkgcHJvdmlkaW5nIGZpZWxkIG5hbWVzLiBJZiBtb3JlIHRoYW4gb25lIGZpZWxkXG4gKiBuYW1lIGlzIHByb3ZpZGVkLCB0aGUgcGF0aCB3aWxsIHBvaW50IHRvIGEgbmVzdGVkIGZpZWxkIGluIGEgZG9jdW1lbnQuXG4gKi9cbmNsYXNzIE5jIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYEZpZWxkUGF0aGAgZnJvbSB0aGUgcHJvdmlkZWQgZmllbGQgbmFtZXMuIElmIG1vcmUgdGhhbiBvbmUgZmllbGRcbiAgICAgKiBuYW1lIGlzIHByb3ZpZGVkLCB0aGUgcGF0aCB3aWxsIHBvaW50IHRvIGEgbmVzdGVkIGZpZWxkIGluIGEgZG9jdW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmllbGROYW1lcyAtIEEgbGlzdCBvZiBmaWVsZCBuYW1lcy5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciguLi50KSB7XG4gICAgICAgIGZvciAobGV0IGUgPSAwOyBlIDwgdC5sZW5ndGg7ICsrZSkgaWYgKDAgPT09IHRbZV0ubGVuZ3RoKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIFwiSW52YWxpZCBmaWVsZCBuYW1lIGF0IGFyZ3VtZW50ICQoaSArIDEpLiBGaWVsZCBuYW1lcyBtdXN0IG5vdCBiZSBlbXB0eS5cIik7XG4gICAgICAgIHRoaXMuX2ludGVybmFsUGF0aCA9IG5ldyBtdCh0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgYEZpZWxkUGF0aGAgaXMgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIG9uZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvdGhlciAtIFRoZSBgRmllbGRQYXRoYCB0byBjb21wYXJlIGFnYWluc3QuXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGlzIGBGaWVsZFBhdGhgIGlzIGVxdWFsIHRvIHRoZSBwcm92aWRlZCBvbmUuXG4gICAgICovICAgIGlzRXF1YWwodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW50ZXJuYWxQYXRoLmlzRXF1YWwodC5faW50ZXJuYWxQYXRoKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHNwZWNpYWwgc2VudGluZWwgYEZpZWxkUGF0aGAgdG8gcmVmZXIgdG8gdGhlIElEIG9mIGEgZG9jdW1lbnQuXG4gKiBJdCBjYW4gYmUgdXNlZCBpbiBxdWVyaWVzIHRvIHNvcnQgb3IgZmlsdGVyIGJ5IHRoZSBkb2N1bWVudCBJRC5cbiAqLyBmdW5jdGlvbiBrYygpIHtcbiAgICByZXR1cm4gbmV3IE5jKFwiX19uYW1lX19cIik7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEFuIGltbXV0YWJsZSBvYmplY3QgcmVwcmVzZW50aW5nIGFuIGFycmF5IG9mIGJ5dGVzLlxuICovIGNsYXNzIE1jIHtcbiAgICAvKiogQGhpZGVjb25zdHJ1Y3RvciAqL1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5fYnl0ZVN0cmluZyA9IHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYEJ5dGVzYCBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gQmFzZTY0IHN0cmluZywgY29udmVydGluZyBpdCB0b1xuICAgICAqIGJ5dGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGJhc2U2NCAtIFRoZSBCYXNlNjQgc3RyaW5nIHVzZWQgdG8gY3JlYXRlIHRoZSBgQnl0ZXNgIG9iamVjdC5cbiAgICAgKi8gICAgc3RhdGljIGZyb21CYXNlNjRTdHJpbmcodCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNYyhwdC5mcm9tQmFzZTY0U3RyaW5nKHQpKTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBcIkZhaWxlZCB0byBjb25zdHJ1Y3QgZGF0YSBmcm9tIEJhc2U2NCBzdHJpbmc6IFwiICsgdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBgQnl0ZXNgIG9iamVjdCBmcm9tIHRoZSBnaXZlbiBVaW50OEFycmF5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGFycmF5IC0gVGhlIFVpbnQ4QXJyYXkgdXNlZCB0byBjcmVhdGUgdGhlIGBCeXRlc2Agb2JqZWN0LlxuICAgICAqLyAgICBzdGF0aWMgZnJvbVVpbnQ4QXJyYXkodCkge1xuICAgICAgICByZXR1cm4gbmV3IE1jKHB0LmZyb21VaW50OEFycmF5KHQpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyBieXRlcyBhcyBhIEJhc2U2NC1lbmNvZGVkIHN0cmluZy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBCYXNlNjQtZW5jb2RlZCBzdHJpbmcgY3JlYXRlZCBmcm9tIHRoZSBgQnl0ZXNgIG9iamVjdC5cbiAgICAgKi8gICAgdG9CYXNlNjQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ieXRlU3RyaW5nLnRvQmFzZTY0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgYnl0ZXMgaW4gYSBuZXcgYFVpbnQ4QXJyYXlgLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIFVpbnQ4QXJyYXkgY3JlYXRlZCBmcm9tIHRoZSBgQnl0ZXNgIG9iamVjdC5cbiAgICAgKi8gICAgdG9VaW50OEFycmF5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYnl0ZVN0cmluZy50b1VpbnQ4QXJyYXkoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYEJ5dGVzYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYEJ5dGVzYCBvYmplY3QuXG4gICAgICovICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gXCJCeXRlcyhiYXNlNjQ6IFwiICsgdGhpcy50b0Jhc2U2NCgpICsgXCIpXCI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGBCeXRlc2Agb2JqZWN0IGlzIGVxdWFsIHRvIHRoZSBwcm92aWRlZCBvbmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3RoZXIgLSBUaGUgYEJ5dGVzYCBvYmplY3QgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhpcyBgQnl0ZXNgIG9iamVjdCBpcyBlcXVhbCB0byB0aGUgcHJvdmlkZWQgb25lLlxuICAgICAqLyAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2J5dGVTdHJpbmcuaXNFcXVhbCh0Ll9ieXRlU3RyaW5nKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFNlbnRpbmVsIHZhbHVlcyB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gd3JpdGluZyBkb2N1bWVudCBmaWVsZHMgd2l0aCBgc2V0KClgXG4gKiBvciBgdXBkYXRlKClgLlxuICovIGNsYXNzIE9jIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gX21ldGhvZE5hbWUgLSBUaGUgcHVibGljIEFQSSBlbmRwb2ludCB0aGF0IHJldHVybnMgdGhpcyBjbGFzcy5cbiAgICAgKiBAaGlkZWNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLl9tZXRob2ROYW1lID0gdDtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEFuIGltbXV0YWJsZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgZ2VvZ3JhcGhpYyBsb2NhdGlvbiBpbiBGaXJlc3RvcmUuIFRoZVxuICogbG9jYXRpb24gaXMgcmVwcmVzZW50ZWQgYXMgbGF0aXR1ZGUvbG9uZ2l0dWRlIHBhaXIuXG4gKlxuICogTGF0aXR1ZGUgdmFsdWVzIGFyZSBpbiB0aGUgcmFuZ2Ugb2YgWy05MCwgOTBdLlxuICogTG9uZ2l0dWRlIHZhbHVlcyBhcmUgaW4gdGhlIHJhbmdlIG9mIFstMTgwLCAxODBdLlxuICovIGNsYXNzICRjIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGltbXV0YWJsZSBgR2VvUG9pbnRgIG9iamVjdCB3aXRoIHRoZSBwcm92aWRlZCBsYXRpdHVkZSBhbmRcbiAgICAgKiBsb25naXR1ZGUgdmFsdWVzLlxuICAgICAqIEBwYXJhbSBsYXRpdHVkZSAtIFRoZSBsYXRpdHVkZSBhcyBudW1iZXIgYmV0d2VlbiAtOTAgYW5kIDkwLlxuICAgICAqIEBwYXJhbSBsb25naXR1ZGUgLSBUaGUgbG9uZ2l0dWRlIGFzIG51bWJlciBiZXR3ZWVuIC0xODAgYW5kIDE4MC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIGlmICghaXNGaW5pdGUodCkgfHwgdCA8IC05MCB8fCB0ID4gOTApIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgXCJMYXRpdHVkZSBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gLTkwIGFuZCA5MCwgYnV0IHdhczogXCIgKyB0KTtcbiAgICAgICAgaWYgKCFpc0Zpbml0ZShlKSB8fCBlIDwgLTE4MCB8fCBlID4gMTgwKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIFwiTG9uZ2l0dWRlIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAtMTgwIGFuZCAxODAsIGJ1dCB3YXM6IFwiICsgZSk7XG4gICAgICAgIHRoaXMuX2xhdCA9IHQsIHRoaXMuX2xvbmcgPSBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbGF0aXR1ZGUgb2YgdGhpcyBgR2VvUG9pbnRgIGluc3RhbmNlLlxuICAgICAqLyAgICBnZXQgbGF0aXR1ZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBsb25naXR1ZGUgb2YgdGhpcyBgR2VvUG9pbnRgIGluc3RhbmNlLlxuICAgICAqLyAgICBnZXQgbG9uZ2l0dWRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9uZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgYEdlb1BvaW50YCBpcyBlcXVhbCB0byB0aGUgcHJvdmlkZWQgb25lLlxuICAgICAqXG4gICAgICogQHBhcmFtIG90aGVyIC0gVGhlIGBHZW9Qb2ludGAgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhpcyBgR2VvUG9pbnRgIGlzIGVxdWFsIHRvIHRoZSBwcm92aWRlZCBvbmUuXG4gICAgICovICAgIGlzRXF1YWwodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGF0ID09PSB0Ll9sYXQgJiYgdGhpcy5fbG9uZyA9PT0gdC5fbG9uZztcbiAgICB9XG4gICAgLyoqIFJldHVybnMgYSBKU09OLXNlcmlhbGl6YWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEdlb1BvaW50LiAqLyAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsYXRpdHVkZTogdGhpcy5fbGF0LFxuICAgICAgICAgICAgbG9uZ2l0dWRlOiB0aGlzLl9sb25nXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFjdHVhbGx5IHByaXZhdGUgdG8gSlMgY29uc3VtZXJzIG9mIG91ciBBUEksIHNvIHRoaXMgZnVuY3Rpb24gaXMgcHJlZml4ZWRcbiAgICAgKiB3aXRoIGFuIHVuZGVyc2NvcmUuXG4gICAgICovICAgIF9jb21wYXJlVG8odCkge1xuICAgICAgICByZXR1cm4gcnQodGhpcy5fbGF0LCB0Ll9sYXQpIHx8IHJ0KHRoaXMuX2xvbmcsIHQuX2xvbmcpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gY29uc3QgRmMgPSAvXl9fLipfXyQvO1xuXG4vKiogVGhlIHJlc3VsdCBvZiBwYXJzaW5nIGRvY3VtZW50IGRhdGEgKGUuZy4gZm9yIGEgc2V0RGF0YSBjYWxsKS4gKi8gY2xhc3MgQmMge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy5kYXRhID0gdCwgdGhpcy5maWVsZE1hc2sgPSBlLCB0aGlzLmZpZWxkVHJhbnNmb3JtcyA9IG47XG4gICAgfVxuICAgIHRvTXV0YXRpb24odCwgZSkge1xuICAgICAgICByZXR1cm4gbnVsbCAhPT0gdGhpcy5maWVsZE1hc2sgPyBuZXcgcG4odCwgdGhpcy5kYXRhLCB0aGlzLmZpZWxkTWFzaywgZSwgdGhpcy5maWVsZFRyYW5zZm9ybXMpIDogbmV3IHluKHQsIHRoaXMuZGF0YSwgZSwgdGhpcy5maWVsZFRyYW5zZm9ybXMpO1xuICAgIH1cbn1cblxuLyoqIFRoZSByZXN1bHQgb2YgcGFyc2luZyBcInVwZGF0ZVwiIGRhdGEgKGkuZS4gZm9yIGFuIHVwZGF0ZURhdGEgY2FsbCkuICovIGNsYXNzIExjIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBcbiAgICAvLyBUaGUgZmllbGRNYXNrIGRvZXMgbm90IGluY2x1ZGUgZG9jdW1lbnQgdHJhbnNmb3Jtcy5cbiAgICBlLCBuKSB7XG4gICAgICAgIHRoaXMuZGF0YSA9IHQsIHRoaXMuZmllbGRNYXNrID0gZSwgdGhpcy5maWVsZFRyYW5zZm9ybXMgPSBuO1xuICAgIH1cbiAgICB0b011dGF0aW9uKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBwbih0LCB0aGlzLmRhdGEsIHRoaXMuZmllbGRNYXNrLCBlLCB0aGlzLmZpZWxkVHJhbnNmb3Jtcyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBxYyh0KSB7XG4gICAgc3dpdGNoICh0KSB7XG4gICAgICBjYXNlIDAgLyogU2V0ICovIDpcbiAvLyBmYWxsIHRocm91Z2hcbiAgICAgICAgICAgICAgY2FzZSAyIC8qIE1lcmdlU2V0ICovIDpcbiAvLyBmYWxsIHRocm91Z2hcbiAgICAgICAgICAgICAgY2FzZSAxIC8qIFVwZGF0ZSAqLyA6XG4gICAgICAgIHJldHVybiAhMDtcblxuICAgICAgY2FzZSAzIC8qIEFyZ3VtZW50ICovIDpcbiAgICAgIGNhc2UgNCAvKiBBcnJheUFyZ3VtZW50ICovIDpcbiAgICAgICAgcmV0dXJuICExO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBMKCk7XG4gICAgfVxufVxuXG4vKiogQSBcImNvbnRleHRcIiBvYmplY3QgcGFzc2VkIGFyb3VuZCB3aGlsZSBwYXJzaW5nIHVzZXIgZGF0YS4gKi8gY2xhc3MgVWMge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIGEgUGFyc2VDb250ZXh0IHdpdGggdGhlIGdpdmVuIHNvdXJjZSBhbmQgcGF0aC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBzZXR0aW5ncyBmb3IgdGhlIHBhcnNlci5cbiAgICAgKiBAcGFyYW0gZGF0YWJhc2VJZCAtIFRoZSBkYXRhYmFzZSBJRCBvZiB0aGUgRmlyZXN0b3JlIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBzZXJpYWxpemVyIC0gVGhlIHNlcmlhbGl6ZXIgdG8gdXNlIHRvIGdlbmVyYXRlIHRoZSBWYWx1ZSBwcm90by5cbiAgICAgKiBAcGFyYW0gaWdub3JlVW5kZWZpbmVkUHJvcGVydGllcyAtIFdoZXRoZXIgdG8gaWdub3JlIHVuZGVmaW5lZCBwcm9wZXJ0aWVzXG4gICAgICogcmF0aGVyIHRoYW4gdGhyb3cuXG4gICAgICogQHBhcmFtIGZpZWxkVHJhbnNmb3JtcyAtIEEgbXV0YWJsZSBsaXN0IG9mIGZpZWxkIHRyYW5zZm9ybXMgZW5jb3VudGVyZWRcbiAgICAgKiB3aGlsZSBwYXJzaW5nIHRoZSBkYXRhLlxuICAgICAqIEBwYXJhbSBmaWVsZE1hc2sgLSBBIG11dGFibGUgbGlzdCBvZiBmaWVsZCBwYXRocyBlbmNvdW50ZXJlZCB3aGlsZSBwYXJzaW5nXG4gICAgICogdGhlIGRhdGEuXG4gICAgICpcbiAgICAgKiBUT0RPKGIvMzQ4NzExMzEpOiBXZSBkb24ndCBzdXBwb3J0IGFycmF5IHBhdGhzIHJpZ2h0IG5vdywgc28gcGF0aCBjYW4gYmVcbiAgICAgKiBudWxsIHRvIGluZGljYXRlIHRoZSBjb250ZXh0IHJlcHJlc2VudHMgYW55IGxvY2F0aW9uIHdpdGhpbiBhbiBhcnJheSAoaW5cbiAgICAgKiB3aGljaCBjYXNlIGNlcnRhaW4gZmVhdHVyZXMgd2lsbCBub3Qgd29yayBhbmQgZXJyb3JzIHdpbGwgYmUgc29tZXdoYXRcbiAgICAgKiBjb21wcm9taXNlZCkuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgcywgaSwgcikge1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gdCwgdGhpcy5kYXRhYmFzZUlkID0gZSwgdGhpcy5NID0gbiwgdGhpcy5pZ25vcmVVbmRlZmluZWRQcm9wZXJ0aWVzID0gcywgXG4gICAgICAgIC8vIE1pbm9yIGhhY2s6IElmIGZpZWxkVHJhbnNmb3JtcyBpcyB1bmRlZmluZWQsIHdlIGFzc3VtZSB0aGlzIGlzIGFuXG4gICAgICAgIC8vIGV4dGVybmFsIGNhbGwgYW5kIHdlIG5lZWQgdG8gdmFsaWRhdGUgdGhlIGVudGlyZSBwYXRoLlxuICAgICAgICB2b2lkIDAgPT09IGkgJiYgdGhpcy5XdSgpLCB0aGlzLmZpZWxkVHJhbnNmb3JtcyA9IGkgfHwgW10sIHRoaXMuZmllbGRNYXNrID0gciB8fCBbXTtcbiAgICB9XG4gICAgZ2V0IHBhdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLnBhdGg7XG4gICAgfVxuICAgIGdldCB6dSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MuenU7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIGEgbmV3IGNvbnRleHQgd2l0aCB0aGUgc3BlY2lmaWVkIHNldHRpbmdzIG92ZXJ3cml0dGVuLiAqLyAgICBIdSh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgVWMoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0aGlzLnNldHRpbmdzKSwgdCksIHRoaXMuZGF0YWJhc2VJZCwgdGhpcy5NLCB0aGlzLmlnbm9yZVVuZGVmaW5lZFByb3BlcnRpZXMsIHRoaXMuZmllbGRUcmFuc2Zvcm1zLCB0aGlzLmZpZWxkTWFzayk7XG4gICAgfVxuICAgIEp1KHQpIHtcbiAgICAgICAgdmFyIGU7XG4gICAgICAgIGNvbnN0IG4gPSBudWxsID09PSAoZSA9IHRoaXMucGF0aCkgfHwgdm9pZCAwID09PSBlID8gdm9pZCAwIDogZS5jaGlsZCh0KSwgcyA9IHRoaXMuSHUoe1xuICAgICAgICAgICAgcGF0aDogbixcbiAgICAgICAgICAgIFl1OiAhMVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHMuWHUodCksIHM7XG4gICAgfVxuICAgIFp1KHQpIHtcbiAgICAgICAgdmFyIGU7XG4gICAgICAgIGNvbnN0IG4gPSBudWxsID09PSAoZSA9IHRoaXMucGF0aCkgfHwgdm9pZCAwID09PSBlID8gdm9pZCAwIDogZS5jaGlsZCh0KSwgcyA9IHRoaXMuSHUoe1xuICAgICAgICAgICAgcGF0aDogbixcbiAgICAgICAgICAgIFl1OiAhMVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHMuV3UoKSwgcztcbiAgICB9XG4gICAgdGModCkge1xuICAgICAgICAvLyBUT0RPKGIvMzQ4NzExMzEpOiBXZSBkb24ndCBzdXBwb3J0IGFycmF5IHBhdGhzIHJpZ2h0IG5vdzsgc28gbWFrZSBwYXRoXG4gICAgICAgIC8vIHVuZGVmaW5lZC5cbiAgICAgICAgcmV0dXJuIHRoaXMuSHUoe1xuICAgICAgICAgICAgcGF0aDogdm9pZCAwLFxuICAgICAgICAgICAgWXU6ICEwXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlYyh0KSB7XG4gICAgICAgIHJldHVybiB1aCh0LCB0aGlzLnNldHRpbmdzLm1ldGhvZE5hbWUsIHRoaXMuc2V0dGluZ3MubmMgfHwgITEsIHRoaXMucGF0aCwgdGhpcy5zZXR0aW5ncy5zYyk7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zICd0cnVlJyBpZiAnZmllbGRQYXRoJyB3YXMgdHJhdmVyc2VkIHdoZW4gY3JlYXRpbmcgdGhpcyBjb250ZXh0LiAqLyAgICBjb250YWlucyh0KSB7XG4gICAgICAgIHJldHVybiB2b2lkIDAgIT09IHRoaXMuZmllbGRNYXNrLmZpbmQoKGUgPT4gdC5pc1ByZWZpeE9mKGUpKSkgfHwgdm9pZCAwICE9PSB0aGlzLmZpZWxkVHJhbnNmb3Jtcy5maW5kKChlID0+IHQuaXNQcmVmaXhPZihlLmZpZWxkKSkpO1xuICAgIH1cbiAgICBXdSgpIHtcbiAgICAgICAgLy8gVE9ETyhiLzM0ODcxMTMxKTogUmVtb3ZlIG51bGwgY2hlY2sgb25jZSB3ZSBoYXZlIHByb3BlciBwYXRocyBmb3IgZmllbGRzXG4gICAgICAgIC8vIHdpdGhpbiBhcnJheXMuXG4gICAgICAgIGlmICh0aGlzLnBhdGgpIGZvciAobGV0IHQgPSAwOyB0IDwgdGhpcy5wYXRoLmxlbmd0aDsgdCsrKSB0aGlzLlh1KHRoaXMucGF0aC5nZXQodCkpO1xuICAgIH1cbiAgICBYdSh0KSB7XG4gICAgICAgIGlmICgwID09PSB0Lmxlbmd0aCkgdGhyb3cgdGhpcy5lYyhcIkRvY3VtZW50IGZpZWxkcyBtdXN0IG5vdCBiZSBlbXB0eVwiKTtcbiAgICAgICAgaWYgKHFjKHRoaXMuenUpICYmIEZjLnRlc3QodCkpIHRocm93IHRoaXMuZWMoJ0RvY3VtZW50IGZpZWxkcyBjYW5ub3QgYmVnaW4gYW5kIGVuZCB3aXRoIFwiX19cIicpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZm9yIHBhcnNpbmcgcmF3IHVzZXIgaW5wdXQgKHByb3ZpZGVkIHZpYSB0aGUgQVBJKSBpbnRvIGludGVybmFsIG1vZGVsXG4gKiBjbGFzc2VzLlxuICovIGNsYXNzIEtjIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgIHRoaXMuZGF0YWJhc2VJZCA9IHQsIHRoaXMuaWdub3JlVW5kZWZpbmVkUHJvcGVydGllcyA9IGUsIHRoaXMuTSA9IG4gfHwgT28odCk7XG4gICAgfVxuICAgIC8qKiBDcmVhdGVzIGEgbmV3IHRvcC1sZXZlbCBwYXJzZSBjb250ZXh0LiAqLyAgICBpYyh0LCBlLCBuLCBzID0gITEpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVYyh7XG4gICAgICAgICAgICB6dTogdCxcbiAgICAgICAgICAgIG1ldGhvZE5hbWU6IGUsXG4gICAgICAgICAgICBzYzogbixcbiAgICAgICAgICAgIHBhdGg6IG10LmVtcHR5UGF0aCgpLFxuICAgICAgICAgICAgWXU6ICExLFxuICAgICAgICAgICAgbmM6IHNcbiAgICAgICAgfSwgdGhpcy5kYXRhYmFzZUlkLCB0aGlzLk0sIHRoaXMuaWdub3JlVW5kZWZpbmVkUHJvcGVydGllcyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBHYyh0KSB7XG4gICAgY29uc3QgZSA9IHQuX2ZyZWV6ZVNldHRpbmdzKCksIG4gPSBPbyh0Ll9kYXRhYmFzZUlkKTtcbiAgICByZXR1cm4gbmV3IEtjKHQuX2RhdGFiYXNlSWQsICEhZS5pZ25vcmVVbmRlZmluZWRQcm9wZXJ0aWVzLCBuKTtcbn1cblxuLyoqIFBhcnNlIGRvY3VtZW50IGRhdGEgZnJvbSBhIHNldCgpIGNhbGwuICovIGZ1bmN0aW9uIFFjKHQsIGUsIG4sIHMsIGksIHIgPSB7fSkge1xuICAgIGNvbnN0IG8gPSB0LmljKHIubWVyZ2UgfHwgci5tZXJnZUZpZWxkcyA/IDIgLyogTWVyZ2VTZXQgKi8gOiAwIC8qIFNldCAqLyAsIGUsIG4sIGkpO1xuICAgIGloKFwiRGF0YSBtdXN0IGJlIGFuIG9iamVjdCwgYnV0IGl0IHdhczpcIiwgbywgcyk7XG4gICAgY29uc3QgYSA9IG5oKHMsIG8pO1xuICAgIGxldCB1LCBjO1xuICAgIGlmIChyLm1lcmdlKSB1ID0gbmV3IGd0KG8uZmllbGRNYXNrKSwgYyA9IG8uZmllbGRUcmFuc2Zvcm1zOyBlbHNlIGlmIChyLm1lcmdlRmllbGRzKSB7XG4gICAgICAgIGNvbnN0IHQgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBzIG9mIHIubWVyZ2VGaWVsZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSByaChlLCBzLCBuKTtcbiAgICAgICAgICAgIGlmICghby5jb250YWlucyhpKSkgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBgRmllbGQgJyR7aX0nIGlzIHNwZWNpZmllZCBpbiB5b3VyIGZpZWxkIG1hc2sgYnV0IG1pc3NpbmcgZnJvbSB5b3VyIGlucHV0IGRhdGEuYCk7XG4gICAgICAgICAgICBjaCh0LCBpKSB8fCB0LnB1c2goaSk7XG4gICAgICAgIH1cbiAgICAgICAgdSA9IG5ldyBndCh0KSwgYyA9IG8uZmllbGRUcmFuc2Zvcm1zLmZpbHRlcigodCA9PiB1LmNvdmVycyh0LmZpZWxkKSkpO1xuICAgIH0gZWxzZSB1ID0gbnVsbCwgYyA9IG8uZmllbGRUcmFuc2Zvcm1zO1xuICAgIHJldHVybiBuZXcgQmMobmV3IFh0KGEpLCB1LCBjKTtcbn1cblxuY2xhc3MgamMgZXh0ZW5kcyBPYyB7XG4gICAgX3RvRmllbGRUcmFuc2Zvcm0odCkge1xuICAgICAgICBpZiAoMiAvKiBNZXJnZVNldCAqLyAhPT0gdC56dSkgdGhyb3cgMSAvKiBVcGRhdGUgKi8gPT09IHQuenUgPyB0LmVjKGAke3RoaXMuX21ldGhvZE5hbWV9KCkgY2FuIG9ubHkgYXBwZWFyIGF0IHRoZSB0b3AgbGV2ZWwgb2YgeW91ciB1cGRhdGUgZGF0YWApIDogdC5lYyhgJHt0aGlzLl9tZXRob2ROYW1lfSgpIGNhbm5vdCBiZSB1c2VkIHdpdGggc2V0KCkgdW5sZXNzIHlvdSBwYXNzIHttZXJnZTp0cnVlfWApO1xuICAgICAgICAvLyBObyB0cmFuc2Zvcm0gdG8gYWRkIGZvciBhIGRlbGV0ZSwgYnV0IHdlIG5lZWQgdG8gYWRkIGl0IHRvIG91clxuICAgICAgICAvLyBmaWVsZE1hc2sgc28gaXQgZ2V0cyBkZWxldGVkLlxuICAgICAgICByZXR1cm4gdC5maWVsZE1hc2sucHVzaCh0LnBhdGgpLCBudWxsO1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBqYztcbiAgICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNoaWxkIGNvbnRleHQgZm9yIHBhcnNpbmcgU2VyaWFsaXphYmxlRmllbGRWYWx1ZXMuXG4gKlxuICogVGhpcyBpcyBkaWZmZXJlbnQgdGhhbiBjYWxsaW5nIGBQYXJzZUNvbnRleHQuY29udGV4dFdpdGhgIGJlY2F1c2UgaXQga2VlcHNcbiAqIHRoZSBmaWVsZFRyYW5zZm9ybXMgYW5kIGZpZWxkTWFzayBzZXBhcmF0ZS5cbiAqXG4gKiBUaGUgY3JlYXRlZCBjb250ZXh0IGhhcyBpdHMgYGRhdGFTb3VyY2VgIHNldCB0byBgVXNlckRhdGFTb3VyY2UuQXJndW1lbnRgLlxuICogQWx0aG91Z2ggdGhlc2UgdmFsdWVzIGFyZSB1c2VkIHdpdGggd3JpdGVzLCBhbnkgZWxlbWVudHMgaW4gdGhlc2UgRmllbGRWYWx1ZXNcbiAqIGFyZSBub3QgY29uc2lkZXJlZCB3cml0ZXMgc2luY2UgdGhleSBjYW5ub3QgY29udGFpbiBhbnkgRmllbGRWYWx1ZSBzZW50aW5lbHMsXG4gKiBldGMuXG4gKlxuICogQHBhcmFtIGZpZWxkVmFsdWUgLSBUaGUgc2VudGluZWwgRmllbGRWYWx1ZSBmb3Igd2hpY2ggdG8gY3JlYXRlIGEgY2hpbGRcbiAqICAgICBjb250ZXh0LlxuICogQHBhcmFtIGNvbnRleHQgLSBUaGUgcGFyZW50IGNvbnRleHQuXG4gKiBAcGFyYW0gYXJyYXlFbGVtZW50IC0gV2hldGhlciBvciBub3QgdGhlIEZpZWxkVmFsdWUgaGFzIGFuIGFycmF5LlxuICovIGZ1bmN0aW9uIFdjKHQsIGUsIG4pIHtcbiAgICByZXR1cm4gbmV3IFVjKHtcbiAgICAgICAgenU6IDMgLyogQXJndW1lbnQgKi8gLFxuICAgICAgICBzYzogZS5zZXR0aW5ncy5zYyxcbiAgICAgICAgbWV0aG9kTmFtZTogdC5fbWV0aG9kTmFtZSxcbiAgICAgICAgWXU6IG5cbiAgICB9LCBlLmRhdGFiYXNlSWQsIGUuTSwgZS5pZ25vcmVVbmRlZmluZWRQcm9wZXJ0aWVzKTtcbn1cblxuY2xhc3MgemMgZXh0ZW5kcyBPYyB7XG4gICAgX3RvRmllbGRUcmFuc2Zvcm0odCkge1xuICAgICAgICByZXR1cm4gbmV3IGFuKHQucGF0aCwgbmV3IFhlKTtcbiAgICB9XG4gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIHJldHVybiB0IGluc3RhbmNlb2YgemM7XG4gICAgfVxufVxuXG5jbGFzcyBIYyBleHRlbmRzIE9jIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKHQpLCB0aGlzLnJjID0gZTtcbiAgICB9XG4gICAgX3RvRmllbGRUcmFuc2Zvcm0odCkge1xuICAgICAgICBjb25zdCBlID0gV2ModGhpcywgdCwgXG4gICAgICAgIC8qYXJyYXk9Ki8gITApLCBuID0gdGhpcy5yYy5tYXAoKHQgPT4gZWgodCwgZSkpKSwgcyA9IG5ldyBaZShuKTtcbiAgICAgICAgcmV0dXJuIG5ldyBhbih0LnBhdGgsIHMpO1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgLy8gVE9ETyhtcnNjaG1pZHQpOiBJbXBsZW1lbnQgaXNFcXVhbHNcbiAgICAgICAgcmV0dXJuIHRoaXMgPT09IHQ7XG4gICAgfVxufVxuXG5jbGFzcyBKYyBleHRlbmRzIE9jIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKHQpLCB0aGlzLnJjID0gZTtcbiAgICB9XG4gICAgX3RvRmllbGRUcmFuc2Zvcm0odCkge1xuICAgICAgICBjb25zdCBlID0gV2ModGhpcywgdCwgXG4gICAgICAgIC8qYXJyYXk9Ki8gITApLCBuID0gdGhpcy5yYy5tYXAoKHQgPT4gZWgodCwgZSkpKSwgcyA9IG5ldyBlbihuKTtcbiAgICAgICAgcmV0dXJuIG5ldyBhbih0LnBhdGgsIHMpO1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgLy8gVE9ETyhtcnNjaG1pZHQpOiBJbXBsZW1lbnQgaXNFcXVhbHNcbiAgICAgICAgcmV0dXJuIHRoaXMgPT09IHQ7XG4gICAgfVxufVxuXG5jbGFzcyBZYyBleHRlbmRzIE9jIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKHQpLCB0aGlzLm9jID0gZTtcbiAgICB9XG4gICAgX3RvRmllbGRUcmFuc2Zvcm0odCkge1xuICAgICAgICBjb25zdCBlID0gbmV3IHNuKHQuTSwgV2UodC5NLCB0aGlzLm9jKSk7XG4gICAgICAgIHJldHVybiBuZXcgYW4odC5wYXRoLCBlKTtcbiAgICB9XG4gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIC8vIFRPRE8obXJzY2htaWR0KTogSW1wbGVtZW50IGlzRXF1YWxzXG4gICAgICAgIHJldHVybiB0aGlzID09PSB0O1xuICAgIH1cbn1cblxuLyoqIFBhcnNlIHVwZGF0ZSBkYXRhIGZyb20gYW4gdXBkYXRlKCkgY2FsbC4gKi8gZnVuY3Rpb24gWGModCwgZSwgbiwgcykge1xuICAgIGNvbnN0IGkgPSB0LmljKDEgLyogVXBkYXRlICovICwgZSwgbik7XG4gICAgaWgoXCJEYXRhIG11c3QgYmUgYW4gb2JqZWN0LCBidXQgaXQgd2FzOlwiLCBpLCBzKTtcbiAgICBjb25zdCByID0gW10sIG8gPSBYdC5lbXB0eSgpO1xuICAgIGx0KHMsICgodCwgcykgPT4ge1xuICAgICAgICBjb25zdCBhID0gYWgoZSwgdCwgbik7XG4gICAgICAgIC8vIEZvciBDb21wYXQgdHlwZXMsIHdlIGhhdmUgdG8gXCJleHRyYWN0XCIgdGhlIHVuZGVybHlpbmcgdHlwZXMgYmVmb3JlXG4gICAgICAgIC8vIHBlcmZvcm1pbmcgdmFsaWRhdGlvbi5cbiAgICAgICAgICAgICAgICBzID0gZ2V0TW9kdWxhckluc3RhbmNlKHMpO1xuICAgICAgICBjb25zdCB1ID0gaS5adShhKTtcbiAgICAgICAgaWYgKHMgaW5zdGFuY2VvZiBqYykgXG4gICAgICAgIC8vIEFkZCBpdCB0byB0aGUgZmllbGQgbWFzaywgYnV0IGRvbid0IGFkZCBhbnl0aGluZyB0byB1cGRhdGVEYXRhLlxuICAgICAgICByLnB1c2goYSk7IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdCA9IGVoKHMsIHUpO1xuICAgICAgICAgICAgbnVsbCAhPSB0ICYmIChyLnB1c2goYSksIG8uc2V0KGEsIHQpKTtcbiAgICAgICAgfVxuICAgIH0pKTtcbiAgICBjb25zdCBhID0gbmV3IGd0KHIpO1xuICAgIHJldHVybiBuZXcgTGMobywgYSwgaS5maWVsZFRyYW5zZm9ybXMpO1xufVxuXG4vKiogUGFyc2UgdXBkYXRlIGRhdGEgZnJvbSBhIGxpc3Qgb2YgZmllbGQvdmFsdWUgYXJndW1lbnRzLiAqLyBmdW5jdGlvbiBaYyh0LCBlLCBuLCBzLCBpLCByKSB7XG4gICAgY29uc3QgbyA9IHQuaWMoMSAvKiBVcGRhdGUgKi8gLCBlLCBuKSwgYSA9IFsgcmgoZSwgcywgbikgXSwgdSA9IFsgaSBdO1xuICAgIGlmIChyLmxlbmd0aCAlIDIgIT0gMCkgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBgRnVuY3Rpb24gJHtlfSgpIG5lZWRzIHRvIGJlIGNhbGxlZCB3aXRoIGFuIGV2ZW4gbnVtYmVyIG9mIGFyZ3VtZW50cyB0aGF0IGFsdGVybmF0ZSBiZXR3ZWVuIGZpZWxkIG5hbWVzIGFuZCB2YWx1ZXMuYCk7XG4gICAgZm9yIChsZXQgdCA9IDA7IHQgPCByLmxlbmd0aDsgdCArPSAyKSBhLnB1c2gocmgoZSwgclt0XSkpLCB1LnB1c2goclt0ICsgMV0pO1xuICAgIGNvbnN0IGMgPSBbXSwgaCA9IFh0LmVtcHR5KCk7XG4gICAgLy8gV2UgaXRlcmF0ZSBpbiByZXZlcnNlIG9yZGVyIHRvIHBpY2sgdGhlIGxhc3QgdmFsdWUgZm9yIGEgZmllbGQgaWYgdGhlXG4gICAgLy8gdXNlciBzcGVjaWZpZWQgdGhlIGZpZWxkIG11bHRpcGxlIHRpbWVzLlxuICAgIGZvciAobGV0IHQgPSBhLmxlbmd0aCAtIDE7IHQgPj0gMDsgLS10KSBpZiAoIWNoKGMsIGFbdF0pKSB7XG4gICAgICAgIGNvbnN0IGUgPSBhW3RdO1xuICAgICAgICBsZXQgbiA9IHVbdF07XG4gICAgICAgIC8vIEZvciBDb21wYXQgdHlwZXMsIHdlIGhhdmUgdG8gXCJleHRyYWN0XCIgdGhlIHVuZGVybHlpbmcgdHlwZXMgYmVmb3JlXG4gICAgICAgIC8vIHBlcmZvcm1pbmcgdmFsaWRhdGlvbi5cbiAgICAgICAgICAgICAgICBuID0gZ2V0TW9kdWxhckluc3RhbmNlKG4pO1xuICAgICAgICBjb25zdCBzID0gby5adShlKTtcbiAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBqYykgXG4gICAgICAgIC8vIEFkZCBpdCB0byB0aGUgZmllbGQgbWFzaywgYnV0IGRvbid0IGFkZCBhbnl0aGluZyB0byB1cGRhdGVEYXRhLlxuICAgICAgICBjLnB1c2goZSk7IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdCA9IGVoKG4sIHMpO1xuICAgICAgICAgICAgbnVsbCAhPSB0ICYmIChjLnB1c2goZSksIGguc2V0KGUsIHQpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBsID0gbmV3IGd0KGMpO1xuICAgIHJldHVybiBuZXcgTGMoaCwgbCwgby5maWVsZFRyYW5zZm9ybXMpO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgXCJxdWVyeSB2YWx1ZVwiIChlLmcuIHZhbHVlIGluIGEgd2hlcmUgZmlsdGVyIG9yIGEgdmFsdWUgaW4gYSBjdXJzb3JcbiAqIGJvdW5kKS5cbiAqXG4gKiBAcGFyYW0gYWxsb3dBcnJheXMgLSBXaGV0aGVyIHRoZSBxdWVyeSB2YWx1ZSBpcyBhbiBhcnJheSB0aGF0IG1heSBkaXJlY3RseVxuICogY29udGFpbiBhZGRpdGlvbmFsIGFycmF5cyAoZS5nLiB0aGUgb3BlcmFuZCBvZiBhbiBgaW5gIHF1ZXJ5KS5cbiAqLyBmdW5jdGlvbiB0aCh0LCBlLCBuLCBzID0gITEpIHtcbiAgICByZXR1cm4gZWgobiwgdC5pYyhzID8gNCAvKiBBcnJheUFyZ3VtZW50ICovIDogMyAvKiBBcmd1bWVudCAqLyAsIGUpKTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgdXNlciBkYXRhIHRvIFByb3RvYnVmIFZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gaW5wdXQgLSBEYXRhIHRvIGJlIHBhcnNlZC5cbiAqIEBwYXJhbSBjb250ZXh0IC0gQSBjb250ZXh0IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgcGF0aCBiZWluZyBwYXJzZWQsXG4gKiB0aGUgc291cmNlIG9mIHRoZSBkYXRhIGJlaW5nIHBhcnNlZCwgZXRjLlxuICogQHJldHVybnMgVGhlIHBhcnNlZCB2YWx1ZSwgb3IgbnVsbCBpZiB0aGUgdmFsdWUgd2FzIGEgRmllbGRWYWx1ZSBzZW50aW5lbFxuICogdGhhdCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgcGFyc2VkIGRhdGEuXG4gKi8gZnVuY3Rpb24gZWgodCwgZSkge1xuICAgIGlmIChzaChcbiAgICAvLyBVbndyYXAgdGhlIEFQSSB0eXBlIGZyb20gdGhlIENvbXBhdCBTREsuIFRoaXMgd2lsbCByZXR1cm4gdGhlIEFQSSB0eXBlXG4gICAgLy8gZnJvbSBmaXJlc3RvcmUtZXhwLlxuICAgIHQgPSBnZXRNb2R1bGFySW5zdGFuY2UodCkpKSByZXR1cm4gaWgoXCJVbnN1cHBvcnRlZCBmaWVsZCB2YWx1ZTpcIiwgZSwgdCksIG5oKHQsIGUpO1xuICAgIGlmICh0IGluc3RhbmNlb2YgT2MpIFxuICAgIC8vIEZpZWxkVmFsdWVzIHVzdWFsbHkgcGFyc2UgaW50byB0cmFuc2Zvcm1zIChleGNlcHQgZGVsZXRlRmllbGQoKSlcbiAgICAvLyBpbiB3aGljaCBjYXNlIHdlIGRvIG5vdCB3YW50IHRvIGluY2x1ZGUgdGhpcyBmaWVsZCBpbiBvdXIgcGFyc2VkIGRhdGFcbiAgICAvLyAoYXMgZG9pbmcgc28gd2lsbCBvdmVyd3JpdGUgdGhlIGZpZWxkIGRpcmVjdGx5IHByaW9yIHRvIHRoZSB0cmFuc2Zvcm1cbiAgICAvLyB0cnlpbmcgdG8gdHJhbnNmb3JtIGl0KS4gU28gd2UgZG9uJ3QgYWRkIHRoaXMgbG9jYXRpb24gdG9cbiAgICAvLyBjb250ZXh0LmZpZWxkTWFzayBhbmQgd2UgcmV0dXJuIG51bGwgYXMgb3VyIHBhcnNpbmcgcmVzdWx0LlxuICAgIC8qKlxuICogXCJQYXJzZXNcIiB0aGUgcHJvdmlkZWQgRmllbGRWYWx1ZUltcGwsIGFkZGluZyBhbnkgbmVjZXNzYXJ5IHRyYW5zZm9ybXMgdG9cbiAqIGNvbnRleHQuZmllbGRUcmFuc2Zvcm1zLlxuICovXG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgLy8gU2VudGluZWxzIGFyZSBvbmx5IHN1cHBvcnRlZCB3aXRoIHdyaXRlcywgYW5kIG5vdCB3aXRoaW4gYXJyYXlzLlxuICAgICAgICBpZiAoIXFjKGUuenUpKSB0aHJvdyBlLmVjKGAke3QuX21ldGhvZE5hbWV9KCkgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIHVwZGF0ZSgpIGFuZCBzZXQoKWApO1xuICAgICAgICBpZiAoIWUucGF0aCkgdGhyb3cgZS5lYyhgJHt0Ll9tZXRob2ROYW1lfSgpIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluc2lkZSBhcnJheXNgKTtcbiAgICAgICAgY29uc3QgbiA9IHQuX3RvRmllbGRUcmFuc2Zvcm0oZSk7XG4gICAgICAgIG4gJiYgZS5maWVsZFRyYW5zZm9ybXMucHVzaChuKTtcbiAgICB9XG4gICAgLyoqXG4gKiBIZWxwZXIgdG8gcGFyc2UgYSBzY2FsYXIgdmFsdWUgKGkuZS4gbm90IGFuIE9iamVjdCwgQXJyYXksIG9yIEZpZWxkVmFsdWUpXG4gKlxuICogQHJldHVybnMgVGhlIHBhcnNlZCB2YWx1ZVxuICovICh0LCBlKSwgbnVsbDtcbiAgICBpZiAodm9pZCAwID09PSB0ICYmIGUuaWdub3JlVW5kZWZpbmVkUHJvcGVydGllcykgXG4gICAgLy8gSWYgdGhlIGlucHV0IGlzIHVuZGVmaW5lZCBpdCBjYW4gbmV2ZXIgcGFydGljaXBhdGUgaW4gdGhlIGZpZWxkTWFzaywgc29cbiAgICAvLyBkb24ndCBoYW5kbGUgdGhpcyBiZWxvdy4gSWYgYGlnbm9yZVVuZGVmaW5lZFByb3BlcnRpZXNgIGlzIGZhbHNlLFxuICAgIC8vIGBwYXJzZVNjYWxhclZhbHVlYCB3aWxsIHJlamVjdCBhbiB1bmRlZmluZWQgdmFsdWUuXG4gICAgcmV0dXJuIG51bGw7XG4gICAgaWYgKFxuICAgIC8vIElmIGNvbnRleHQucGF0aCBpcyBudWxsIHdlIGFyZSBpbnNpZGUgYW4gYXJyYXkgYW5kIHdlIGRvbid0IHN1cHBvcnRcbiAgICAvLyBmaWVsZCBtYXNrIHBhdGhzIG1vcmUgZ3JhbnVsYXIgdGhhbiB0aGUgdG9wLWxldmVsIGFycmF5LlxuICAgIGUucGF0aCAmJiBlLmZpZWxkTWFzay5wdXNoKGUucGF0aCksIHQgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAvLyBUT0RPKGIvMzQ4NzExMzEpOiBJbmNsdWRlIHRoZSBwYXRoIGNvbnRhaW5pbmcgdGhlIGFycmF5IGluIHRoZSBlcnJvclxuICAgICAgICAvLyBtZXNzYWdlLlxuICAgICAgICAvLyBJbiB0aGUgY2FzZSBvZiBJTiBxdWVyaWVzLCB0aGUgcGFyc2VkIGRhdGEgaXMgYW4gYXJyYXkgKHJlcHJlc2VudGluZ1xuICAgICAgICAvLyB0aGUgc2V0IG9mIHZhbHVlcyB0byBiZSBpbmNsdWRlZCBmb3IgdGhlIElOIHF1ZXJ5KSB0aGF0IG1heSBkaXJlY3RseVxuICAgICAgICAvLyBjb250YWluIGFkZGl0aW9uYWwgYXJyYXlzIChlYWNoIHJlcHJlc2VudGluZyBhbiBpbmRpdmlkdWFsIGZpZWxkXG4gICAgICAgIC8vIHZhbHVlKSwgc28gd2UgZGlzYWJsZSB0aGlzIHZhbGlkYXRpb24uXG4gICAgICAgIGlmIChlLnNldHRpbmdzLll1ICYmIDQgLyogQXJyYXlBcmd1bWVudCAqLyAhPT0gZS56dSkgdGhyb3cgZS5lYyhcIk5lc3RlZCBhcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gW107XG4gICAgICAgICAgICBsZXQgcyA9IDA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdCkge1xuICAgICAgICAgICAgICAgIGxldCB0ID0gZWgoaSwgZS50YyhzKSk7XG4gICAgICAgICAgICAgICAgbnVsbCA9PSB0ICYmIChcbiAgICAgICAgICAgICAgICAvLyBKdXN0IGluY2x1ZGUgbnVsbHMgaW4gdGhlIGFycmF5IGZvciBmaWVsZHMgYmVpbmcgcmVwbGFjZWQgd2l0aCBhXG4gICAgICAgICAgICAgICAgLy8gc2VudGluZWwuXG4gICAgICAgICAgICAgICAgdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgbnVsbFZhbHVlOiBcIk5VTExfVkFMVUVcIlxuICAgICAgICAgICAgICAgIH0pLCBuLnB1c2godCksIHMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYXJyYXlWYWx1ZToge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KHQsIGUpO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICBpZiAobnVsbCA9PT0gKHQgPSBnZXRNb2R1bGFySW5zdGFuY2UodCkpKSByZXR1cm4ge1xuICAgICAgICAgICAgbnVsbFZhbHVlOiBcIk5VTExfVkFMVUVcIlxuICAgICAgICB9O1xuICAgICAgICBpZiAoXCJudW1iZXJcIiA9PSB0eXBlb2YgdCkgcmV0dXJuIFdlKGUuTSwgdCk7XG4gICAgICAgIGlmIChcImJvb2xlYW5cIiA9PSB0eXBlb2YgdCkgcmV0dXJuIHtcbiAgICAgICAgICAgIGJvb2xlYW5WYWx1ZTogdFxuICAgICAgICB9O1xuICAgICAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCkgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiB0XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0IGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHV0LmZyb21EYXRlKHQpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXBWYWx1ZTogcnMoZS5NLCBuKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodCBpbnN0YW5jZW9mIHV0KSB7XG4gICAgICAgICAgICAvLyBGaXJlc3RvcmUgYmFja2VuZCB0cnVuY2F0ZXMgcHJlY2lzaW9uIGRvd24gdG8gbWljcm9zZWNvbmRzLiBUbyBlbnN1cmVcbiAgICAgICAgICAgIC8vIG9mZmxpbmUgbW9kZSB3b3JrcyB0aGUgc2FtZSB3aXRoIHJlZ2FyZHMgdG8gdHJ1bmNhdGlvbiwgcGVyZm9ybSB0aGVcbiAgICAgICAgICAgIC8vIHRydW5jYXRpb24gaW1tZWRpYXRlbHkgd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgYmFja2VuZCB0byBkbyB0aGF0LlxuICAgICAgICAgICAgY29uc3QgbiA9IG5ldyB1dCh0LnNlY29uZHMsIDFlMyAqIE1hdGguZmxvb3IodC5uYW5vc2Vjb25kcyAvIDFlMykpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXBWYWx1ZTogcnMoZS5NLCBuKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodCBpbnN0YW5jZW9mICRjKSByZXR1cm4ge1xuICAgICAgICAgICAgZ2VvUG9pbnRWYWx1ZToge1xuICAgICAgICAgICAgICAgIGxhdGl0dWRlOiB0LmxhdGl0dWRlLFxuICAgICAgICAgICAgICAgIGxvbmdpdHVkZTogdC5sb25naXR1ZGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBNYykgcmV0dXJuIHtcbiAgICAgICAgICAgIGJ5dGVzVmFsdWU6IG9zKGUuTSwgdC5fYnl0ZVN0cmluZylcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiByYykge1xuICAgICAgICAgICAgY29uc3QgbiA9IGUuZGF0YWJhc2VJZCwgcyA9IHQuZmlyZXN0b3JlLl9kYXRhYmFzZUlkO1xuICAgICAgICAgICAgaWYgKCFzLmlzRXF1YWwobikpIHRocm93IGUuZWMoYERvY3VtZW50IHJlZmVyZW5jZSBpcyBmb3IgZGF0YWJhc2UgJHtzLnByb2plY3RJZH0vJHtzLmRhdGFiYXNlfSBidXQgc2hvdWxkIGJlIGZvciBkYXRhYmFzZSAke24ucHJvamVjdElkfS8ke24uZGF0YWJhc2V9YCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZVZhbHVlOiBjcyh0LmZpcmVzdG9yZS5fZGF0YWJhc2VJZCB8fCBlLmRhdGFiYXNlSWQsIHQuX2tleS5wYXRoKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlLmVjKGBVbnN1cHBvcnRlZCBmaWVsZCB2YWx1ZTogJHtadSh0KX1gKTtcbiAgICB9XG4gICAgLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhbiBvYmplY3QgbG9va3MgbGlrZSBhIEpTT04gb2JqZWN0IHRoYXQgc2hvdWxkIGJlIGNvbnZlcnRlZFxuICogaW50byBhIHN0cnVjdC4gTm9ybWFsIGNsYXNzL3Byb3RvdHlwZSBpbnN0YW5jZXMgYXJlIGNvbnNpZGVyZWQgdG8gbG9vayBsaWtlXG4gKiBKU09OIG9iamVjdHMgc2luY2UgdGhleSBzaG91bGQgYmUgY29udmVydGVkIHRvIGEgc3RydWN0IHZhbHVlLiBBcnJheXMsIERhdGVzLFxuICogR2VvUG9pbnRzLCBldGMuIGFyZSBub3QgY29uc2lkZXJlZCB0byBsb29rIGxpa2UgSlNPTiBvYmplY3RzIHNpbmNlIHRoZXkgbWFwXG4gKiB0byBzcGVjaWZpYyBGaWVsZFZhbHVlIHR5cGVzIG90aGVyIHRoYW4gT2JqZWN0VmFsdWUuXG4gKi8gKHQsIGUpO1xufVxuXG5mdW5jdGlvbiBuaCh0LCBlKSB7XG4gICAgY29uc3QgbiA9IHt9O1xuICAgIHJldHVybiBmdCh0KSA/IFxuICAgIC8vIElmIHdlIGVuY291bnRlciBhbiBlbXB0eSBvYmplY3QsIHdlIGV4cGxpY2l0bHkgYWRkIGl0IHRvIHRoZSB1cGRhdGVcbiAgICAvLyBtYXNrIHRvIGVuc3VyZSB0aGF0IHRoZSBzZXJ2ZXIgY3JlYXRlcyBhIG1hcCBlbnRyeS5cbiAgICBlLnBhdGggJiYgZS5wYXRoLmxlbmd0aCA+IDAgJiYgZS5maWVsZE1hc2sucHVzaChlLnBhdGgpIDogbHQodCwgKCh0LCBzKSA9PiB7XG4gICAgICAgIGNvbnN0IGkgPSBlaChzLCBlLkp1KHQpKTtcbiAgICAgICAgbnVsbCAhPSBpICYmIChuW3RdID0gaSk7XG4gICAgfSkpLCB7XG4gICAgICAgIG1hcFZhbHVlOiB7XG4gICAgICAgICAgICBmaWVsZHM6IG5cbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIHNoKHQpIHtcbiAgICByZXR1cm4gIShcIm9iamVjdFwiICE9IHR5cGVvZiB0IHx8IG51bGwgPT09IHQgfHwgdCBpbnN0YW5jZW9mIEFycmF5IHx8IHQgaW5zdGFuY2VvZiBEYXRlIHx8IHQgaW5zdGFuY2VvZiB1dCB8fCB0IGluc3RhbmNlb2YgJGMgfHwgdCBpbnN0YW5jZW9mIE1jIHx8IHQgaW5zdGFuY2VvZiByYyB8fCB0IGluc3RhbmNlb2YgT2MpO1xufVxuXG5mdW5jdGlvbiBpaCh0LCBlLCBuKSB7XG4gICAgaWYgKCFzaChuKSB8fCAhZnVuY3Rpb24odCkge1xuICAgICAgICByZXR1cm4gXCJvYmplY3RcIiA9PSB0eXBlb2YgdCAmJiBudWxsICE9PSB0ICYmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkgPT09IE9iamVjdC5wcm90b3R5cGUgfHwgbnVsbCA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKTtcbiAgICB9KG4pKSB7XG4gICAgICAgIGNvbnN0IHMgPSBadShuKTtcbiAgICAgICAgdGhyb3cgXCJhbiBvYmplY3RcIiA9PT0gcyA/IGUuZWModCArIFwiIGEgY3VzdG9tIG9iamVjdFwiKSA6IGUuZWModCArIFwiIFwiICsgcyk7XG4gICAgfVxufVxuXG4vKipcbiAqIEhlbHBlciB0aGF0IGNhbGxzIGZyb21Eb3RTZXBhcmF0ZWRTdHJpbmcoKSBidXQgd3JhcHMgYW55IGVycm9yIHRocm93bi5cbiAqLyBmdW5jdGlvbiByaCh0LCBlLCBuKSB7XG4gICAgaWYgKChcbiAgICAvLyBJZiByZXF1aXJlZCwgcmVwbGFjZSB0aGUgRmllbGRQYXRoIENvbXBhdCBjbGFzcyB3aXRoIHdpdGggdGhlIGZpcmVzdG9yZS1leHBcbiAgICAvLyBGaWVsZFBhdGguXG4gICAgZSA9IGdldE1vZHVsYXJJbnN0YW5jZShlKSkgaW5zdGFuY2VvZiBOYykgcmV0dXJuIGUuX2ludGVybmFsUGF0aDtcbiAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgZSkgcmV0dXJuIGFoKHQsIGUpO1xuICAgIHRocm93IHVoKFwiRmllbGQgcGF0aCBhcmd1bWVudHMgbXVzdCBiZSBvZiB0eXBlIHN0cmluZyBvciBcIiwgdCwgXG4gICAgLyogaGFzQ29udmVydGVyPSAqLyAhMSwgXG4gICAgLyogcGF0aD0gKi8gdm9pZCAwLCBuKTtcbn1cblxuLyoqXG4gKiBNYXRjaGVzIGFueSBjaGFyYWN0ZXJzIGluIGEgZmllbGQgcGF0aCBzdHJpbmcgdGhhdCBhcmUgcmVzZXJ2ZWQuXG4gKi8gY29uc3Qgb2ggPSBuZXcgUmVnRXhwKFwiW35cXFxcKi9cXFxcW1xcXFxdXVwiKTtcblxuLyoqXG4gKiBXcmFwcyBmcm9tRG90U2VwYXJhdGVkU3RyaW5nIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBhYm91dCB0aGUgbWV0aG9kIHRoYXRcbiAqIHdhcyB0aHJvd24uXG4gKiBAcGFyYW0gbWV0aG9kTmFtZSAtIFRoZSBwdWJsaWNseSB2aXNpYmxlIG1ldGhvZCBuYW1lXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBkb3Qtc2VwYXJhdGVkIHN0cmluZyBmb3JtIG9mIGEgZmllbGQgcGF0aCB3aGljaCB3aWxsIGJlXG4gKiBzcGxpdCBvbiBkb3RzLlxuICogQHBhcmFtIHRhcmdldERvYyAtIFRoZSBkb2N1bWVudCBhZ2FpbnN0IHdoaWNoIHRoZSBmaWVsZCBwYXRoIHdpbGwgYmVcbiAqIGV2YWx1YXRlZC5cbiAqLyBmdW5jdGlvbiBhaCh0LCBlLCBuKSB7XG4gICAgaWYgKGUuc2VhcmNoKG9oKSA+PSAwKSB0aHJvdyB1aChgSW52YWxpZCBmaWVsZCBwYXRoICgke2V9KS4gUGF0aHMgbXVzdCBub3QgY29udGFpbiAnficsICcqJywgJy8nLCAnWycsIG9yICddJ2AsIHQsIFxuICAgIC8qIGhhc0NvbnZlcnRlcj0gKi8gITEsIFxuICAgIC8qIHBhdGg9ICovIHZvaWQgMCwgbik7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG5ldyBOYyguLi5lLnNwbGl0KFwiLlwiKSkuX2ludGVybmFsUGF0aDtcbiAgICB9IGNhdGNoIChzKSB7XG4gICAgICAgIHRocm93IHVoKGBJbnZhbGlkIGZpZWxkIHBhdGggKCR7ZX0pLiBQYXRocyBtdXN0IG5vdCBiZSBlbXB0eSwgYmVnaW4gd2l0aCAnLicsIGVuZCB3aXRoICcuJywgb3IgY29udGFpbiAnLi4nYCwgdCwgXG4gICAgICAgIC8qIGhhc0NvbnZlcnRlcj0gKi8gITEsIFxuICAgICAgICAvKiBwYXRoPSAqLyB2b2lkIDAsIG4pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdWgodCwgZSwgbiwgcywgaSkge1xuICAgIGNvbnN0IHIgPSBzICYmICFzLmlzRW1wdHkoKSwgbyA9IHZvaWQgMCAhPT0gaTtcbiAgICBsZXQgYSA9IGBGdW5jdGlvbiAke2V9KCkgY2FsbGVkIHdpdGggaW52YWxpZCBkYXRhYDtcbiAgICBuICYmIChhICs9IFwiICh2aWEgYHRvRmlyZXN0b3JlKClgKVwiKSwgYSArPSBcIi4gXCI7XG4gICAgbGV0IHUgPSBcIlwiO1xuICAgIHJldHVybiAociB8fCBvKSAmJiAodSArPSBcIiAoZm91bmRcIiwgciAmJiAodSArPSBgIGluIGZpZWxkICR7c31gKSwgbyAmJiAodSArPSBgIGluIGRvY3VtZW50ICR7aX1gKSwgXG4gICAgdSArPSBcIilcIiksIG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgYSArIHQgKyB1KTtcbn1cblxuLyoqIENoZWNrcyBgaGF5c3RhY2tgIGlmIEZpZWxkUGF0aCBgbmVlZGxlYCBpcyBwcmVzZW50LiBSdW5zIGluIE8obikuICovIGZ1bmN0aW9uIGNoKHQsIGUpIHtcbiAgICByZXR1cm4gdC5zb21lKCh0ID0+IHQuaXNFcXVhbChlKSkpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIGBEb2N1bWVudFNuYXBzaG90YCBjb250YWlucyBkYXRhIHJlYWQgZnJvbSBhIGRvY3VtZW50IGluIHlvdXIgRmlyZXN0b3JlXG4gKiBkYXRhYmFzZS4gVGhlIGRhdGEgY2FuIGJlIGV4dHJhY3RlZCB3aXRoIGAuZGF0YSgpYCBvciBgLmdldCg8ZmllbGQ+KWAgdG9cbiAqIGdldCBhIHNwZWNpZmljIGZpZWxkLlxuICpcbiAqIEZvciBhIGBEb2N1bWVudFNuYXBzaG90YCB0aGF0IHBvaW50cyB0byBhIG5vbi1leGlzdGluZyBkb2N1bWVudCwgYW55IGRhdGFcbiAqIGFjY2VzcyB3aWxsIHJldHVybiAndW5kZWZpbmVkJy4gWW91IGNhbiB1c2UgdGhlIGBleGlzdHMoKWAgbWV0aG9kIHRvXG4gKiBleHBsaWNpdGx5IHZlcmlmeSBhIGRvY3VtZW50J3MgZXhpc3RlbmNlLlxuICovIGNsYXNzIGhoIHtcbiAgICAvLyBOb3RlOiBUaGlzIGNsYXNzIGlzIHN0cmlwcGVkIGRvd24gdmVyc2lvbiBvZiB0aGUgRG9jdW1lbnRTbmFwc2hvdCBpblxuICAgIC8vIHRoZSBsZWdhY3kgU0RLLiBUaGUgY2hhbmdlcyBhcmU6XG4gICAgLy8gLSBObyBzdXBwb3J0IGZvciBTbmFwc2hvdE1ldGFkYXRhLlxuICAgIC8vIC0gTm8gc3VwcG9ydCBmb3IgU25hcHNob3RPcHRpb25zLlxuICAgIC8qKiBAaGlkZWNvbnN0cnVjdG9yIHByb3RlY3RlZCAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMsIGkpIHtcbiAgICAgICAgdGhpcy5fZmlyZXN0b3JlID0gdCwgdGhpcy5fdXNlckRhdGFXcml0ZXIgPSBlLCB0aGlzLl9rZXkgPSBuLCB0aGlzLl9kb2N1bWVudCA9IHMsIFxuICAgICAgICB0aGlzLl9jb252ZXJ0ZXIgPSBpO1xuICAgIH1cbiAgICAvKiogUHJvcGVydHkgb2YgdGhlIGBEb2N1bWVudFNuYXBzaG90YCB0aGF0IHByb3ZpZGVzIHRoZSBkb2N1bWVudCdzIElELiAqLyAgICBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9rZXkucGF0aC5sYXN0U2VnbWVudCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgYERvY3VtZW50UmVmZXJlbmNlYCBmb3IgdGhlIGRvY3VtZW50IGluY2x1ZGVkIGluIHRoZSBgRG9jdW1lbnRTbmFwc2hvdGAuXG4gICAgICovICAgIGdldCByZWYoKSB7XG4gICAgICAgIHJldHVybiBuZXcgcmModGhpcy5fZmlyZXN0b3JlLCB0aGlzLl9jb252ZXJ0ZXIsIHRoaXMuX2tleSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpZ25hbHMgd2hldGhlciBvciBub3QgdGhlIGRvY3VtZW50IGF0IHRoZSBzbmFwc2hvdCdzIGxvY2F0aW9uIGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGRvY3VtZW50IGV4aXN0cy5cbiAgICAgKi8gICAgZXhpc3RzKCkge1xuICAgICAgICByZXR1cm4gbnVsbCAhPT0gdGhpcy5fZG9jdW1lbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyBhbGwgZmllbGRzIGluIHRoZSBkb2N1bWVudCBhcyBhbiBgT2JqZWN0YC4gUmV0dXJucyBgdW5kZWZpbmVkYCBpZlxuICAgICAqIHRoZSBkb2N1bWVudCBkb2Vzbid0IGV4aXN0LlxuICAgICAqXG4gICAgICogQHJldHVybnMgQW4gYE9iamVjdGAgY29udGFpbmluZyBhbGwgZmllbGRzIGluIHRoZSBkb2N1bWVudCBvciBgdW5kZWZpbmVkYFxuICAgICAqIGlmIHRoZSBkb2N1bWVudCBkb2Vzbid0IGV4aXN0LlxuICAgICAqLyAgICBkYXRhKCkge1xuICAgICAgICBpZiAodGhpcy5fZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jb252ZXJ0ZXIpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBvbmx5IHdhbnQgdG8gdXNlIHRoZSBjb252ZXJ0ZXIgYW5kIGNyZWF0ZSBhIG5ldyBEb2N1bWVudFNuYXBzaG90XG4gICAgICAgICAgICAgICAgLy8gaWYgYSBjb252ZXJ0ZXIgaGFzIGJlZW4gcHJvdmlkZWQuXG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IG5ldyBsaCh0aGlzLl9maXJlc3RvcmUsIHRoaXMuX3VzZXJEYXRhV3JpdGVyLCB0aGlzLl9rZXksIHRoaXMuX2RvY3VtZW50LCBcbiAgICAgICAgICAgICAgICAvKiBjb252ZXJ0ZXI9ICovIG51bGwpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0ZXIuZnJvbUZpcmVzdG9yZSh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91c2VyRGF0YVdyaXRlci5jb252ZXJ0VmFsdWUodGhpcy5fZG9jdW1lbnQuZGF0YS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBmaWVsZCBzcGVjaWZpZWQgYnkgYGZpZWxkUGF0aGAuIFJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhlXG4gICAgICogZG9jdW1lbnQgb3IgZmllbGQgZG9lc24ndCBleGlzdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWVsZFBhdGggLSBUaGUgcGF0aCAoZm9yIGV4YW1wbGUgJ2Zvbycgb3IgJ2Zvby5iYXInKSB0byBhIHNwZWNpZmljXG4gICAgICogZmllbGQuXG4gICAgICogQHJldHVybnMgVGhlIGRhdGEgYXQgdGhlIHNwZWNpZmllZCBmaWVsZCBsb2NhdGlvbiBvciB1bmRlZmluZWQgaWYgbm8gc3VjaFxuICAgICAqIGZpZWxkIGV4aXN0cyBpbiB0aGUgZG9jdW1lbnQuXG4gICAgICovXG4gICAgLy8gV2UgYXJlIHVzaW5nIGBhbnlgIGhlcmUgdG8gYXZvaWQgYW4gZXhwbGljaXQgY2FzdCBieSBvdXIgdXNlcnMuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBnZXQodCkge1xuICAgICAgICBpZiAodGhpcy5fZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLl9kb2N1bWVudC5kYXRhLmZpZWxkKGZoKFwiRG9jdW1lbnRTbmFwc2hvdC5nZXRcIiwgdCkpO1xuICAgICAgICAgICAgaWYgKG51bGwgIT09IGUpIHJldHVybiB0aGlzLl91c2VyRGF0YVdyaXRlci5jb252ZXJ0VmFsdWUoZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQSBgUXVlcnlEb2N1bWVudFNuYXBzaG90YCBjb250YWlucyBkYXRhIHJlYWQgZnJvbSBhIGRvY3VtZW50IGluIHlvdXJcbiAqIEZpcmVzdG9yZSBkYXRhYmFzZSBhcyBwYXJ0IG9mIGEgcXVlcnkuIFRoZSBkb2N1bWVudCBpcyBndWFyYW50ZWVkIHRvIGV4aXN0XG4gKiBhbmQgaXRzIGRhdGEgY2FuIGJlIGV4dHJhY3RlZCB3aXRoIGAuZGF0YSgpYCBvciBgLmdldCg8ZmllbGQ+KWAgdG8gZ2V0IGFcbiAqIHNwZWNpZmljIGZpZWxkLlxuICpcbiAqIEEgYFF1ZXJ5RG9jdW1lbnRTbmFwc2hvdGAgb2ZmZXJzIHRoZSBzYW1lIEFQSSBzdXJmYWNlIGFzIGFcbiAqIGBEb2N1bWVudFNuYXBzaG90YC4gU2luY2UgcXVlcnkgcmVzdWx0cyBjb250YWluIG9ubHkgZXhpc3RpbmcgZG9jdW1lbnRzLCB0aGVcbiAqIGBleGlzdHNgIHByb3BlcnR5IHdpbGwgYWx3YXlzIGJlIHRydWUgYW5kIGBkYXRhKClgIHdpbGwgbmV2ZXIgcmV0dXJuXG4gKiAndW5kZWZpbmVkJy5cbiAqLyBjbGFzcyBsaCBleHRlbmRzIGhoIHtcbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgYWxsIGZpZWxkcyBpbiB0aGUgZG9jdW1lbnQgYXMgYW4gYE9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKiBAcmV0dXJucyBBbiBgT2JqZWN0YCBjb250YWluaW5nIGFsbCBmaWVsZHMgaW4gdGhlIGRvY3VtZW50LlxuICAgICAqL1xuICAgIGRhdGEoKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5kYXRhKCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEhlbHBlciB0aGF0IGNhbGxzIGBmcm9tRG90U2VwYXJhdGVkU3RyaW5nKClgIGJ1dCB3cmFwcyBhbnkgZXJyb3IgdGhyb3duLlxuICovIGZ1bmN0aW9uIGZoKHQsIGUpIHtcbiAgICByZXR1cm4gXCJzdHJpbmdcIiA9PSB0eXBlb2YgZSA/IGFoKHQsIGUpIDogZSBpbnN0YW5jZW9mIE5jID8gZS5faW50ZXJuYWxQYXRoIDogZS5fZGVsZWdhdGUuX2ludGVybmFsUGF0aDtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogTWV0YWRhdGEgYWJvdXQgYSBzbmFwc2hvdCwgZGVzY3JpYmluZyB0aGUgc3RhdGUgb2YgdGhlIHNuYXBzaG90LlxuICovIGNsYXNzIGRoIHtcbiAgICAvKiogQGhpZGVjb25zdHJ1Y3RvciAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5oYXNQZW5kaW5nV3JpdGVzID0gdCwgdGhpcy5mcm9tQ2FjaGUgPSBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBgU25hcHNob3RNZXRhZGF0YWAgaXMgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIG9uZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvdGhlciAtIFRoZSBgU25hcHNob3RNZXRhZGF0YWAgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhpcyBgU25hcHNob3RNZXRhZGF0YWAgaXMgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIG9uZS5cbiAgICAgKi8gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc1BlbmRpbmdXcml0ZXMgPT09IHQuaGFzUGVuZGluZ1dyaXRlcyAmJiB0aGlzLmZyb21DYWNoZSA9PT0gdC5mcm9tQ2FjaGU7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgYERvY3VtZW50U25hcHNob3RgIGNvbnRhaW5zIGRhdGEgcmVhZCBmcm9tIGEgZG9jdW1lbnQgaW4geW91ciBGaXJlc3RvcmVcbiAqIGRhdGFiYXNlLiBUaGUgZGF0YSBjYW4gYmUgZXh0cmFjdGVkIHdpdGggYC5kYXRhKClgIG9yIGAuZ2V0KDxmaWVsZD4pYCB0b1xuICogZ2V0IGEgc3BlY2lmaWMgZmllbGQuXG4gKlxuICogRm9yIGEgYERvY3VtZW50U25hcHNob3RgIHRoYXQgcG9pbnRzIHRvIGEgbm9uLWV4aXN0aW5nIGRvY3VtZW50LCBhbnkgZGF0YVxuICogYWNjZXNzIHdpbGwgcmV0dXJuICd1bmRlZmluZWQnLiBZb3UgY2FuIHVzZSB0aGUgYGV4aXN0cygpYCBtZXRob2QgdG9cbiAqIGV4cGxpY2l0bHkgdmVyaWZ5IGEgZG9jdW1lbnQncyBleGlzdGVuY2UuXG4gKi8gY2xhc3MgX2ggZXh0ZW5kcyBoaCB7XG4gICAgLyoqIEBoaWRlY29uc3RydWN0b3IgcHJvdGVjdGVkICovXG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgcywgaSwgcikge1xuICAgICAgICBzdXBlcih0LCBlLCBuLCBzLCByKSwgdGhpcy5fZmlyZXN0b3JlID0gdCwgdGhpcy5fZmlyZXN0b3JlSW1wbCA9IHQsIHRoaXMubWV0YWRhdGEgPSBpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBkYXRhIGV4aXN0cy4gVHJ1ZSBpZiB0aGUgZG9jdW1lbnQgZXhpc3RzLlxuICAgICAqLyAgICBleGlzdHMoKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5leGlzdHMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIGFsbCBmaWVsZHMgaW4gdGhlIGRvY3VtZW50IGFzIGFuIGBPYmplY3RgLiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmXG4gICAgICogdGhlIGRvY3VtZW50IGRvZXNuJ3QgZXhpc3QuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0LCBgc2VydmVyVGltZXN0YW1wKClgIHZhbHVlcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuXG4gICAgICogc2V0IHRvIHRoZWlyIGZpbmFsIHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQgYXMgYG51bGxgLiBZb3UgY2FuIG92ZXJyaWRlXG4gICAgICogdGhpcyBieSBwYXNzaW5nIGFuIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvcHRpb25zIG9iamVjdCB0byBjb25maWd1cmUgaG93IGRhdGEgaXMgcmV0cmlldmVkIGZyb21cbiAgICAgKiB0aGUgc25hcHNob3QgKGZvciBleGFtcGxlIHRoZSBkZXNpcmVkIGJlaGF2aW9yIGZvciBzZXJ2ZXIgdGltZXN0YW1wcyB0aGF0XG4gICAgICogaGF2ZSBub3QgeWV0IGJlZW4gc2V0IHRvIHRoZWlyIGZpbmFsIHZhbHVlKS5cbiAgICAgKiBAcmV0dXJucyBBbiBgT2JqZWN0YCBjb250YWluaW5nIGFsbCBmaWVsZHMgaW4gdGhlIGRvY3VtZW50IG9yIGB1bmRlZmluZWRgIGlmXG4gICAgICogdGhlIGRvY3VtZW50IGRvZXNuJ3QgZXhpc3QuXG4gICAgICovICAgIGRhdGEodCA9IHt9KSB7XG4gICAgICAgIGlmICh0aGlzLl9kb2N1bWVudCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnZlcnRlcikge1xuICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgd2FudCB0byB1c2UgdGhlIGNvbnZlcnRlciBhbmQgY3JlYXRlIGEgbmV3IERvY3VtZW50U25hcHNob3RcbiAgICAgICAgICAgICAgICAvLyBpZiBhIGNvbnZlcnRlciBoYXMgYmVlbiBwcm92aWRlZC5cbiAgICAgICAgICAgICAgICBjb25zdCBlID0gbmV3IHdoKHRoaXMuX2ZpcmVzdG9yZSwgdGhpcy5fdXNlckRhdGFXcml0ZXIsIHRoaXMuX2tleSwgdGhpcy5fZG9jdW1lbnQsIHRoaXMubWV0YWRhdGEsIFxuICAgICAgICAgICAgICAgIC8qIGNvbnZlcnRlcj0gKi8gbnVsbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRlci5mcm9tRmlyZXN0b3JlKGUsIHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJEYXRhV3JpdGVyLmNvbnZlcnRWYWx1ZSh0aGlzLl9kb2N1bWVudC5kYXRhLnZhbHVlLCB0LnNlcnZlclRpbWVzdGFtcHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgZmllbGQgc3BlY2lmaWVkIGJ5IGBmaWVsZFBhdGhgLiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZVxuICAgICAqIGRvY3VtZW50IG9yIGZpZWxkIGRvZXNuJ3QgZXhpc3QuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0LCBhIGBzZXJ2ZXJUaW1lc3RhbXAoKWAgdGhhdCBoYXMgbm90IHlldCBiZWVuIHNldCB0b1xuICAgICAqIGl0cyBmaW5hbCB2YWx1ZSB3aWxsIGJlIHJldHVybmVkIGFzIGBudWxsYC4gWW91IGNhbiBvdmVycmlkZSB0aGlzIGJ5XG4gICAgICogcGFzc2luZyBhbiBvcHRpb25zIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWVsZFBhdGggLSBUaGUgcGF0aCAoZm9yIGV4YW1wbGUgJ2Zvbycgb3IgJ2Zvby5iYXInKSB0byBhIHNwZWNpZmljXG4gICAgICogZmllbGQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvcHRpb25zIG9iamVjdCB0byBjb25maWd1cmUgaG93IHRoZSBmaWVsZCBpcyByZXRyaWV2ZWRcbiAgICAgKiBmcm9tIHRoZSBzbmFwc2hvdCAoZm9yIGV4YW1wbGUgdGhlIGRlc2lyZWQgYmVoYXZpb3IgZm9yIHNlcnZlciB0aW1lc3RhbXBzXG4gICAgICogdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBzZXQgdG8gdGhlaXIgZmluYWwgdmFsdWUpLlxuICAgICAqIEByZXR1cm5zIFRoZSBkYXRhIGF0IHRoZSBzcGVjaWZpZWQgZmllbGQgbG9jYXRpb24gb3IgdW5kZWZpbmVkIGlmIG5vIHN1Y2hcbiAgICAgKiBmaWVsZCBleGlzdHMgaW4gdGhlIGRvY3VtZW50LlxuICAgICAqL1xuICAgIC8vIFdlIGFyZSB1c2luZyBgYW55YCBoZXJlIHRvIGF2b2lkIGFuIGV4cGxpY2l0IGNhc3QgYnkgb3VyIHVzZXJzLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgZ2V0KHQsIGUgPSB7fSkge1xuICAgICAgICBpZiAodGhpcy5fZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLl9kb2N1bWVudC5kYXRhLmZpZWxkKGZoKFwiRG9jdW1lbnRTbmFwc2hvdC5nZXRcIiwgdCkpO1xuICAgICAgICAgICAgaWYgKG51bGwgIT09IG4pIHJldHVybiB0aGlzLl91c2VyRGF0YVdyaXRlci5jb252ZXJ0VmFsdWUobiwgZS5zZXJ2ZXJUaW1lc3RhbXBzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBBIGBRdWVyeURvY3VtZW50U25hcHNob3RgIGNvbnRhaW5zIGRhdGEgcmVhZCBmcm9tIGEgZG9jdW1lbnQgaW4geW91clxuICogRmlyZXN0b3JlIGRhdGFiYXNlIGFzIHBhcnQgb2YgYSBxdWVyeS4gVGhlIGRvY3VtZW50IGlzIGd1YXJhbnRlZWQgdG8gZXhpc3RcbiAqIGFuZCBpdHMgZGF0YSBjYW4gYmUgZXh0cmFjdGVkIHdpdGggYC5kYXRhKClgIG9yIGAuZ2V0KDxmaWVsZD4pYCB0byBnZXQgYVxuICogc3BlY2lmaWMgZmllbGQuXG4gKlxuICogQSBgUXVlcnlEb2N1bWVudFNuYXBzaG90YCBvZmZlcnMgdGhlIHNhbWUgQVBJIHN1cmZhY2UgYXMgYVxuICogYERvY3VtZW50U25hcHNob3RgLiBTaW5jZSBxdWVyeSByZXN1bHRzIGNvbnRhaW4gb25seSBleGlzdGluZyBkb2N1bWVudHMsIHRoZVxuICogYGV4aXN0c2AgcHJvcGVydHkgd2lsbCBhbHdheXMgYmUgdHJ1ZSBhbmQgYGRhdGEoKWAgd2lsbCBuZXZlciByZXR1cm5cbiAqICd1bmRlZmluZWQnLlxuICovIGNsYXNzIHdoIGV4dGVuZHMgX2gge1xuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyBhbGwgZmllbGRzIGluIHRoZSBkb2N1bWVudCBhcyBhbiBgT2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEJ5IGRlZmF1bHQsIGBzZXJ2ZXJUaW1lc3RhbXAoKWAgdmFsdWVzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW5cbiAgICAgKiBzZXQgdG8gdGhlaXIgZmluYWwgdmFsdWUgd2lsbCBiZSByZXR1cm5lZCBhcyBgbnVsbGAuIFlvdSBjYW4gb3ZlcnJpZGVcbiAgICAgKiB0aGlzIGJ5IHBhc3NpbmcgYW4gb3B0aW9ucyBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9wdGlvbnMgb2JqZWN0IHRvIGNvbmZpZ3VyZSBob3cgZGF0YSBpcyByZXRyaWV2ZWQgZnJvbVxuICAgICAqIHRoZSBzbmFwc2hvdCAoZm9yIGV4YW1wbGUgdGhlIGRlc2lyZWQgYmVoYXZpb3IgZm9yIHNlcnZlciB0aW1lc3RhbXBzIHRoYXRcbiAgICAgKiBoYXZlIG5vdCB5ZXQgYmVlbiBzZXQgdG8gdGhlaXIgZmluYWwgdmFsdWUpLlxuICAgICAqIEByZXR1cm5zIEFuIGBPYmplY3RgIGNvbnRhaW5pbmcgYWxsIGZpZWxkcyBpbiB0aGUgZG9jdW1lbnQuXG4gICAgICovXG4gICAgZGF0YSh0ID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmRhdGEodCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgYFF1ZXJ5U25hcHNob3RgIGNvbnRhaW5zIHplcm8gb3IgbW9yZSBgRG9jdW1lbnRTbmFwc2hvdGAgb2JqZWN0c1xuICogcmVwcmVzZW50aW5nIHRoZSByZXN1bHRzIG9mIGEgcXVlcnkuIFRoZSBkb2N1bWVudHMgY2FuIGJlIGFjY2Vzc2VkIGFzIGFuXG4gKiBhcnJheSB2aWEgdGhlIGBkb2NzYCBwcm9wZXJ0eSBvciBlbnVtZXJhdGVkIHVzaW5nIHRoZSBgZm9yRWFjaGAgbWV0aG9kLiBUaGVcbiAqIG51bWJlciBvZiBkb2N1bWVudHMgY2FuIGJlIGRldGVybWluZWQgdmlhIHRoZSBgZW1wdHlgIGFuZCBgc2l6ZWBcbiAqIHByb3BlcnRpZXMuXG4gKi8gY2xhc3MgbWgge1xuICAgIC8qKiBAaGlkZWNvbnN0cnVjdG9yICovXG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgcykge1xuICAgICAgICB0aGlzLl9maXJlc3RvcmUgPSB0LCB0aGlzLl91c2VyRGF0YVdyaXRlciA9IGUsIHRoaXMuX3NuYXBzaG90ID0gcywgdGhpcy5tZXRhZGF0YSA9IG5ldyBkaChzLmhhc1BlbmRpbmdXcml0ZXMsIHMuZnJvbUNhY2hlKSwgXG4gICAgICAgIHRoaXMucXVlcnkgPSBuO1xuICAgIH1cbiAgICAvKiogQW4gYXJyYXkgb2YgYWxsIHRoZSBkb2N1bWVudHMgaW4gdGhlIGBRdWVyeVNuYXBzaG90YC4gKi8gICAgZ2V0IGRvY3MoKSB7XG4gICAgICAgIGNvbnN0IHQgPSBbXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9yRWFjaCgoZSA9PiB0LnB1c2goZSkpKSwgdDtcbiAgICB9XG4gICAgLyoqIFRoZSBudW1iZXIgb2YgZG9jdW1lbnRzIGluIHRoZSBgUXVlcnlTbmFwc2hvdGAuICovICAgIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc25hcHNob3QuZG9jcy5zaXplO1xuICAgIH1cbiAgICAvKiogVHJ1ZSBpZiB0aGVyZSBhcmUgbm8gZG9jdW1lbnRzIGluIHRoZSBgUXVlcnlTbmFwc2hvdGAuICovICAgIGdldCBlbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIDAgPT09IHRoaXMuc2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW51bWVyYXRlcyBhbGwgb2YgdGhlIGRvY3VtZW50cyBpbiB0aGUgYFF1ZXJ5U25hcHNob3RgLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNhbGxiYWNrIC0gQSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2l0aCBhIGBRdWVyeURvY3VtZW50U25hcHNob3RgIGZvclxuICAgICAqIGVhY2ggZG9jdW1lbnQgaW4gdGhlIHNuYXBzaG90LlxuICAgICAqIEBwYXJhbSB0aGlzQXJnIC0gVGhlIGB0aGlzYCBiaW5kaW5nIGZvciB0aGUgY2FsbGJhY2suXG4gICAgICovICAgIGZvckVhY2godCwgZSkge1xuICAgICAgICB0aGlzLl9zbmFwc2hvdC5kb2NzLmZvckVhY2goKG4gPT4ge1xuICAgICAgICAgICAgdC5jYWxsKGUsIG5ldyB3aCh0aGlzLl9maXJlc3RvcmUsIHRoaXMuX3VzZXJEYXRhV3JpdGVyLCBuLmtleSwgbiwgbmV3IGRoKHRoaXMuX3NuYXBzaG90Lm11dGF0ZWRLZXlzLmhhcyhuLmtleSksIHRoaXMuX3NuYXBzaG90LmZyb21DYWNoZSksIHRoaXMucXVlcnkuY29udmVydGVyKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgZG9jdW1lbnRzIGNoYW5nZXMgc2luY2UgdGhlIGxhc3Qgc25hcHNob3QuIElmIHRoaXNcbiAgICAgKiBpcyB0aGUgZmlyc3Qgc25hcHNob3QsIGFsbCBkb2N1bWVudHMgd2lsbCBiZSBpbiB0aGUgbGlzdCBhcyAnYWRkZWQnXG4gICAgICogY2hhbmdlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gYFNuYXBzaG90TGlzdGVuT3B0aW9uc2AgdGhhdCBjb250cm9sIHdoZXRoZXIgbWV0YWRhdGEtb25seVxuICAgICAqIGNoYW5nZXMgKGkuZS4gb25seSBgRG9jdW1lbnRTbmFwc2hvdC5tZXRhZGF0YWAgY2hhbmdlZCkgc2hvdWxkIHRyaWdnZXJcbiAgICAgKiBzbmFwc2hvdCBldmVudHMuXG4gICAgICovICAgIGRvY0NoYW5nZXModCA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGUgPSAhIXQuaW5jbHVkZU1ldGFkYXRhQ2hhbmdlcztcbiAgICAgICAgaWYgKGUgJiYgdGhpcy5fc25hcHNob3QuZXhjbHVkZXNNZXRhZGF0YUNoYW5nZXMpIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgXCJUbyBpbmNsdWRlIG1ldGFkYXRhIGNoYW5nZXMgd2l0aCB5b3VyIGRvY3VtZW50IGNoYW5nZXMsIHlvdSBtdXN0IGFsc28gcGFzcyB7IGluY2x1ZGVNZXRhZGF0YUNoYW5nZXM6dHJ1ZSB9IHRvIG9uU25hcHNob3QoKS5cIik7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWNoZWRDaGFuZ2VzICYmIHRoaXMuX2NhY2hlZENoYW5nZXNJbmNsdWRlTWV0YWRhdGFDaGFuZ2VzID09PSBlIHx8ICh0aGlzLl9jYWNoZWRDaGFuZ2VzID0gXG4gICAgICAgIC8qKiBDYWxjdWxhdGVzIHRoZSBhcnJheSBvZiBgRG9jdW1lbnRDaGFuZ2VgcyBmb3IgYSBnaXZlbiBgVmlld1NuYXBzaG90YC4gKi9cbiAgICAgICAgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgaWYgKHQuX3NuYXBzaG90Lm9sZERvY3MuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGUgPSAwO1xuICAgICAgICAgICAgICAgIHJldHVybiB0Ll9zbmFwc2hvdC5kb2NDaGFuZ2VzLm1hcCgobiA9PiAoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImFkZGVkXCIsXG4gICAgICAgICAgICAgICAgICAgIGRvYzogbmV3IHdoKHQuX2ZpcmVzdG9yZSwgdC5fdXNlckRhdGFXcml0ZXIsIG4uZG9jLmtleSwgbi5kb2MsIG5ldyBkaCh0Ll9zbmFwc2hvdC5tdXRhdGVkS2V5cy5oYXMobi5kb2Mua2V5KSwgdC5fc25hcHNob3QuZnJvbUNhY2hlKSwgdC5xdWVyeS5jb252ZXJ0ZXIpLFxuICAgICAgICAgICAgICAgICAgICBvbGRJbmRleDogLTEsXG4gICAgICAgICAgICAgICAgICAgIG5ld0luZGV4OiBlKytcbiAgICAgICAgICAgICAgICB9KSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIEEgYERvY3VtZW50U2V0YCB0aGF0IGlzIHVwZGF0ZWQgaW5jcmVtZW50YWxseSBhcyBjaGFuZ2VzIGFyZSBhcHBsaWVkIHRvIHVzZVxuICAgICAgICAgICAgICAgIC8vIHRvIGxvb2t1cCB0aGUgaW5kZXggb2YgYSBkb2N1bWVudC5cbiAgICAgICAgICAgICAgICBsZXQgbiA9IHQuX3NuYXBzaG90Lm9sZERvY3M7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQuX3NuYXBzaG90LmRvY0NoYW5nZXMuZmlsdGVyKCh0ID0+IGUgfHwgMyAvKiBNZXRhZGF0YSAqLyAhPT0gdC50eXBlKSkubWFwKChlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IG5ldyB3aCh0Ll9maXJlc3RvcmUsIHQuX3VzZXJEYXRhV3JpdGVyLCBlLmRvYy5rZXksIGUuZG9jLCBuZXcgZGgodC5fc25hcHNob3QubXV0YXRlZEtleXMuaGFzKGUuZG9jLmtleSksIHQuX3NuYXBzaG90LmZyb21DYWNoZSksIHQucXVlcnkuY29udmVydGVyKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSAtMSwgciA9IC0xO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBBZGRlZCAqLyAhPT0gZS50eXBlICYmIChpID0gbi5pbmRleE9mKGUuZG9jLmtleSksIG4gPSBuLmRlbGV0ZShlLmRvYy5rZXkpKSwgXG4gICAgICAgICAgICAgICAgICAgIDEgLyogUmVtb3ZlZCAqLyAhPT0gZS50eXBlICYmIChuID0gbi5hZGQoZS5kb2MpLCByID0gbi5pbmRleE9mKGUuZG9jLmtleSkpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBnaChlLnR5cGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jOiBzLFxuICAgICAgICAgICAgICAgICAgICAgICAgb2xkSW5kZXg6IGksXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdJbmRleDogclxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSh0aGlzLCBlKSwgdGhpcy5fY2FjaGVkQ2hhbmdlc0luY2x1ZGVNZXRhZGF0YUNoYW5nZXMgPSBlKSwgdGhpcy5fY2FjaGVkQ2hhbmdlcztcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdoKHQpIHtcbiAgICBzd2l0Y2ggKHQpIHtcbiAgICAgIGNhc2UgMCAvKiBBZGRlZCAqLyA6XG4gICAgICAgIHJldHVybiBcImFkZGVkXCI7XG5cbiAgICAgIGNhc2UgMiAvKiBNb2RpZmllZCAqLyA6XG4gICAgICBjYXNlIDMgLyogTWV0YWRhdGEgKi8gOlxuICAgICAgICByZXR1cm4gXCJtb2RpZmllZFwiO1xuXG4gICAgICBjYXNlIDEgLyogUmVtb3ZlZCAqLyA6XG4gICAgICAgIHJldHVybiBcInJlbW92ZWRcIjtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIEwoKTtcbiAgICB9XG59XG5cbi8vIFRPRE8oZmlyZXN0b3JlZXhwKTogQWRkIHRlc3RzIGZvciBzbmFwc2hvdEVxdWFsIHdpdGggZGlmZmVyZW50IHNuYXBzaG90XG4vLyBtZXRhZGF0YVxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3ZpZGVkIHNuYXBzaG90cyBhcmUgZXF1YWwuXG4gKlxuICogQHBhcmFtIGxlZnQgLSBBIHNuYXBzaG90IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0gcmlnaHQgLSBBIHNuYXBzaG90IHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBzbmFwc2hvdHMgYXJlIGVxdWFsLlxuICovIGZ1bmN0aW9uIHloKHQsIGUpIHtcbiAgICByZXR1cm4gdCBpbnN0YW5jZW9mIF9oICYmIGUgaW5zdGFuY2VvZiBfaCA/IHQuX2ZpcmVzdG9yZSA9PT0gZS5fZmlyZXN0b3JlICYmIHQuX2tleS5pc0VxdWFsKGUuX2tleSkgJiYgKG51bGwgPT09IHQuX2RvY3VtZW50ID8gbnVsbCA9PT0gZS5fZG9jdW1lbnQgOiB0Ll9kb2N1bWVudC5pc0VxdWFsKGUuX2RvY3VtZW50KSkgJiYgdC5fY29udmVydGVyID09PSBlLl9jb252ZXJ0ZXIgOiB0IGluc3RhbmNlb2YgbWggJiYgZSBpbnN0YW5jZW9mIG1oICYmICh0Ll9maXJlc3RvcmUgPT09IGUuX2ZpcmVzdG9yZSAmJiBmYyh0LnF1ZXJ5LCBlLnF1ZXJ5KSAmJiB0Lm1ldGFkYXRhLmlzRXF1YWwoZS5tZXRhZGF0YSkgJiYgdC5fc25hcHNob3QuaXNFcXVhbChlLl9zbmFwc2hvdCkpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBmdW5jdGlvbiBwaCh0KSB7XG4gICAgaWYgKHhlKHQpICYmIDAgPT09IHQuZXhwbGljaXRPcmRlckJ5Lmxlbmd0aCkgdGhyb3cgbmV3IFEoRy5VTklNUExFTUVOVEVELCBcImxpbWl0VG9MYXN0KCkgcXVlcmllcyByZXF1aXJlIHNwZWNpZnlpbmcgYXQgbGVhc3Qgb25lIG9yZGVyQnkoKSBjbGF1c2VcIik7XG59XG5cbi8qKlxuICogQSBgUXVlcnlDb25zdHJhaW50YCBpcyB1c2VkIHRvIG5hcnJvdyB0aGUgc2V0IG9mIGRvY3VtZW50cyByZXR1cm5lZCBieSBhXG4gKiBGaXJlc3RvcmUgcXVlcnkuIGBRdWVyeUNvbnN0cmFpbnRgcyBhcmUgY3JlYXRlZCBieSBpbnZva2luZyB7QGxpbmsgd2hlcmV9LFxuICoge0BsaW5rIG9yZGVyQnl9LCB7QGxpbmsgKHN0YXJ0QXQ6MSl9LCB7QGxpbmsgKHN0YXJ0QWZ0ZXI6MSl9LCB7QGxpbmtcbiAqIGVuZEJlZm9yZToxfSwge0BsaW5rIChlbmRBdDoxKX0sIHtAbGluayBsaW1pdH0gb3Ige0BsaW5rIGxpbWl0VG9MYXN0fSBhbmRcbiAqIGNhbiB0aGVuIGJlIHBhc3NlZCB0byB7QGxpbmsgcXVlcnl9IHRvIGNyZWF0ZSBhIG5ldyBxdWVyeSBpbnN0YW5jZSB0aGF0XG4gKiBhbHNvIGNvbnRhaW5zIHRoaXMgYFF1ZXJ5Q29uc3RyYWludGAuXG4gKi8gY2xhc3MgSWgge31cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGltbXV0YWJsZSBpbnN0YW5jZSBvZiB7QGxpbmsgUXVlcnl9IHRoYXQgaXMgZXh0ZW5kZWQgdG8gYWxzbyBpbmNsdWRlXG4gKiBhZGRpdGlvbmFsIHF1ZXJ5IGNvbnN0cmFpbnRzLlxuICpcbiAqIEBwYXJhbSBxdWVyeSAtIFRoZSB7QGxpbmsgUXVlcnl9IGluc3RhbmNlIHRvIHVzZSBhcyBhIGJhc2UgZm9yIHRoZSBuZXcgY29uc3RyYWludHMuXG4gKiBAcGFyYW0gcXVlcnlDb25zdHJhaW50cyAtIFRoZSBsaXN0IG9mIHtAbGluayBRdWVyeUNvbnN0cmFpbnR9cyB0byBhcHBseS5cbiAqIEB0aHJvd3MgaWYgYW55IG9mIHRoZSBwcm92aWRlZCBxdWVyeSBjb25zdHJhaW50cyBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCB0aGVcbiAqIGV4aXN0aW5nIG9yIG5ldyBjb25zdHJhaW50cy5cbiAqLyBmdW5jdGlvbiBUaCh0LCAuLi5lKSB7XG4gICAgZm9yIChjb25zdCBuIG9mIGUpIHQgPSBuLl9hcHBseSh0KTtcbiAgICByZXR1cm4gdDtcbn1cblxuY2xhc3MgRWggZXh0ZW5kcyBJaCB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbikge1xuICAgICAgICBzdXBlcigpLCB0aGlzLmFjID0gdCwgdGhpcy51YyA9IGUsIHRoaXMuY2MgPSBuLCB0aGlzLnR5cGUgPSBcIndoZXJlXCI7XG4gICAgfVxuICAgIF9hcHBseSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBHYyh0LmZpcmVzdG9yZSksIG4gPSBmdW5jdGlvbih0LCBlLCBuLCBzLCBpLCByLCBvKSB7XG4gICAgICAgICAgICBsZXQgYTtcbiAgICAgICAgICAgIGlmIChpLmlzS2V5RmllbGQoKSkge1xuICAgICAgICAgICAgICAgIGlmIChcImFycmF5LWNvbnRhaW5zXCIgLyogQVJSQVlfQ09OVEFJTlMgKi8gPT09IHIgfHwgXCJhcnJheS1jb250YWlucy1hbnlcIiAvKiBBUlJBWV9DT05UQUlOU19BTlkgKi8gPT09IHIpIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgYEludmFsaWQgUXVlcnkuIFlvdSBjYW4ndCBwZXJmb3JtICcke3J9JyBxdWVyaWVzIG9uIGRvY3VtZW50SWQoKS5gKTtcbiAgICAgICAgICAgICAgICBpZiAoXCJpblwiIC8qIElOICovID09PSByIHx8IFwibm90LWluXCIgLyogTk9UX0lOICovID09PSByKSB7XG4gICAgICAgICAgICAgICAgICAgICRoKG8sIHIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbiBvZiBvKSBlLnB1c2goT2gocywgdCwgbikpO1xuICAgICAgICAgICAgICAgICAgICBhID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlWYWx1ZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBhID0gT2gocywgdCwgbyk7XG4gICAgICAgICAgICB9IGVsc2UgXCJpblwiIC8qIElOICovICE9PSByICYmIFwibm90LWluXCIgLyogTk9UX0lOICovICE9PSByICYmIFwiYXJyYXktY29udGFpbnMtYW55XCIgLyogQVJSQVlfQ09OVEFJTlNfQU5ZICovICE9PSByIHx8ICRoKG8sIHIpLCBcbiAgICAgICAgICAgIGEgPSB0aChuLCBlLCBvLCBcbiAgICAgICAgICAgIC8qIGFsbG93QXJyYXlzPSAqLyBcImluXCIgLyogSU4gKi8gPT09IHIgfHwgXCJub3QtaW5cIiAvKiBOT1RfSU4gKi8gPT09IHIpO1xuICAgICAgICAgICAgY29uc3QgdSA9IF9lLmNyZWF0ZShpLCByLCBhKTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuUygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBrZSh0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IG4gJiYgIW4uaXNFcXVhbChlLmZpZWxkKSkgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBgSW52YWxpZCBxdWVyeS4gQWxsIHdoZXJlIGZpbHRlcnMgd2l0aCBhbiBpbmVxdWFsaXR5ICg8LCA8PSwgIT0sIG5vdC1pbiwgPiwgb3IgPj0pIG11c3QgYmUgb24gdGhlIHNhbWUgZmllbGQuIEJ1dCB5b3UgaGF2ZSBpbmVxdWFsaXR5IGZpbHRlcnMgb24gJyR7bi50b1N0cmluZygpfScgYW5kICcke2UuZmllbGQudG9TdHJpbmcoKX0nYCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBOZSh0KTtcbiAgICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gcyAmJiBGaCh0LCBlLmZpZWxkLCBzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbiA9IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBuIG9mIHQuZmlsdGVycykgaWYgKGUuaW5kZXhPZihuLm9wKSA+PSAwKSByZXR1cm4gbi5vcDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfSh0LCBcbiAgICAgICAgICAgICAgICAvKipcbiAqIEdpdmVuIGFuIG9wZXJhdG9yLCByZXR1cm5zIHRoZSBzZXQgb2Ygb3BlcmF0b3JzIHRoYXQgY2Fubm90IGJlIHVzZWQgd2l0aCBpdC5cbiAqXG4gKiBPcGVyYXRvcnMgaW4gYSBxdWVyeSBtdXN0IGFkaGVyZSB0byB0aGUgZm9sbG93aW5nIHNldCBvZiBydWxlczpcbiAqIDEuIE9ubHkgb25lIGFycmF5IG9wZXJhdG9yIGlzIGFsbG93ZWQuXG4gKiAyLiBPbmx5IG9uZSBkaXNqdW5jdGl2ZSBvcGVyYXRvciBpcyBhbGxvd2VkLlxuICogMy4gYE5PVF9FUVVBTGAgY2Fubm90IGJlIHVzZWQgd2l0aCBhbm90aGVyIGBOT1RfRVFVQUxgIG9wZXJhdG9yLlxuICogNC4gYE5PVF9JTmAgY2Fubm90IGJlIHVzZWQgd2l0aCBhcnJheSwgZGlzanVuY3RpdmUsIG9yIGBOT1RfRVFVQUxgIG9wZXJhdG9ycy5cbiAqXG4gKiBBcnJheSBvcGVyYXRvcnM6IGBBUlJBWV9DT05UQUlOU2AsIGBBUlJBWV9DT05UQUlOU19BTllgXG4gKiBEaXNqdW5jdGl2ZSBvcGVyYXRvcnM6IGBJTmAsIGBBUlJBWV9DT05UQUlOU19BTllgLCBgTk9UX0lOYFxuICovXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiIT1cIiAvKiBOT1RfRVFVQUwgKi8gOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgXCIhPVwiIC8qIE5PVF9FUVVBTCAqLyAsIFwibm90LWluXCIgLyogTk9UX0lOICovIF07XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYXJyYXktY29udGFpbnNcIiAvKiBBUlJBWV9DT05UQUlOUyAqLyA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWyBcImFycmF5LWNvbnRhaW5zXCIgLyogQVJSQVlfQ09OVEFJTlMgKi8gLCBcImFycmF5LWNvbnRhaW5zLWFueVwiIC8qIEFSUkFZX0NPTlRBSU5TX0FOWSAqLyAsIFwibm90LWluXCIgLyogTk9UX0lOICovIF07XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiaW5cIiAvKiBJTiAqLyA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWyBcImFycmF5LWNvbnRhaW5zLWFueVwiIC8qIEFSUkFZX0NPTlRBSU5TX0FOWSAqLyAsIFwiaW5cIiAvKiBJTiAqLyAsIFwibm90LWluXCIgLyogTk9UX0lOICovIF07XG5cbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYXJyYXktY29udGFpbnMtYW55XCIgLyogQVJSQVlfQ09OVEFJTlNfQU5ZICovIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbIFwiYXJyYXktY29udGFpbnNcIiAvKiBBUlJBWV9DT05UQUlOUyAqLyAsIFwiYXJyYXktY29udGFpbnMtYW55XCIgLyogQVJSQVlfQ09OVEFJTlNfQU5ZICovICwgXCJpblwiIC8qIElOICovICwgXCJub3QtaW5cIiAvKiBOT1RfSU4gKi8gXTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJub3QtaW5cIiAvKiBOT1RfSU4gKi8gOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgXCJhcnJheS1jb250YWluc1wiIC8qIEFSUkFZX0NPTlRBSU5TICovICwgXCJhcnJheS1jb250YWlucy1hbnlcIiAvKiBBUlJBWV9DT05UQUlOU19BTlkgKi8gLCBcImluXCIgLyogSU4gKi8gLCBcIm5vdC1pblwiIC8qIE5PVF9JTiAqLyAsIFwiIT1cIiAvKiBOT1RfRVFVQUwgKi8gXTtcblxuICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KGUub3ApKTtcbiAgICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gbikgXG4gICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIHdoZW4gaXQncyBhIGR1cGxpY2F0ZSBvcCB0byBnaXZlIGEgc2xpZ2h0bHkgY2xlYXJlciBlcnJvciBtZXNzYWdlLlxuICAgICAgICAgICAgICAgIHRocm93IG4gPT09IGUub3AgPyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIGBJbnZhbGlkIHF1ZXJ5LiBZb3UgY2Fubm90IHVzZSBtb3JlIHRoYW4gb25lICcke2Uub3AudG9TdHJpbmcoKX0nIGZpbHRlci5gKSA6IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgYEludmFsaWQgcXVlcnkuIFlvdSBjYW5ub3QgdXNlICcke2Uub3AudG9TdHJpbmcoKX0nIGZpbHRlcnMgd2l0aCAnJHtuLnRvU3RyaW5nKCl9JyBmaWx0ZXJzLmApO1xuICAgICAgICAgICAgfSh0LCB1KSwgdTtcbiAgICAgICAgfSh0Ll9xdWVyeSwgXCJ3aGVyZVwiLCBlLCB0LmZpcmVzdG9yZS5fZGF0YWJhc2VJZCwgdGhpcy5hYywgdGhpcy51YywgdGhpcy5jYyk7XG4gICAgICAgIHJldHVybiBuZXcgb2ModC5maXJlc3RvcmUsIHQuY29udmVydGVyLCBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdC5maWx0ZXJzLmNvbmNhdChbIGUgXSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHZlKHQucGF0aCwgdC5jb2xsZWN0aW9uR3JvdXAsIHQuZXhwbGljaXRPcmRlckJ5LnNsaWNlKCksIG4sIHQubGltaXQsIHQubGltaXRUeXBlLCB0LnN0YXJ0QXQsIHQuZW5kQXQpO1xuICAgICAgICB9KHQuX3F1ZXJ5LCBuKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgUXVlcnlDb25zdHJhaW50fSB0aGF0IGVuZm9yY2VzIHRoYXQgZG9jdW1lbnRzIG11c3QgY29udGFpbiB0aGVcbiAqIHNwZWNpZmllZCBmaWVsZCBhbmQgdGhhdCB0aGUgdmFsdWUgc2hvdWxkIHNhdGlzZnkgdGhlIHJlbGF0aW9uIGNvbnN0cmFpbnRcbiAqIHByb3ZpZGVkLlxuICpcbiAqIEBwYXJhbSBmaWVsZFBhdGggLSBUaGUgcGF0aCB0byBjb21wYXJlXG4gKiBAcGFyYW0gb3BTdHIgLSBUaGUgb3BlcmF0aW9uIHN0cmluZyAoZS5nIFwiJmx0O1wiLCBcIiZsdDs9XCIsIFwiPT1cIiwgXCImbHQ7XCIsXG4gKiAgIFwiJmx0Oz1cIiwgXCIhPVwiKS5cbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSBmb3IgY29tcGFyaXNvblxuICogQHJldHVybnMgVGhlIGNyZWF0ZWQge0BsaW5rIFF1ZXJ5fS5cbiAqLyBmdW5jdGlvbiBBaCh0LCBlLCBuKSB7XG4gICAgY29uc3QgcyA9IGUsIGkgPSBmaChcIndoZXJlXCIsIHQpO1xuICAgIHJldHVybiBuZXcgRWgoaSwgcywgbik7XG59XG5cbmNsYXNzIFJoIGV4dGVuZHMgSWgge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgc3VwZXIoKSwgdGhpcy5hYyA9IHQsIHRoaXMuaGMgPSBlLCB0aGlzLnR5cGUgPSBcIm9yZGVyQnlcIjtcbiAgICB9XG4gICAgX2FwcGx5KHQpIHtcbiAgICAgICAgY29uc3QgZSA9IGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgICAgIGlmIChudWxsICE9PSB0LnN0YXJ0QXQpIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgXCJJbnZhbGlkIHF1ZXJ5LiBZb3UgbXVzdCBub3QgY2FsbCBzdGFydEF0KCkgb3Igc3RhcnRBZnRlcigpIGJlZm9yZSBjYWxsaW5nIG9yZGVyQnkoKS5cIik7XG4gICAgICAgICAgICBpZiAobnVsbCAhPT0gdC5lbmRBdCkgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBcIkludmFsaWQgcXVlcnkuIFlvdSBtdXN0IG5vdCBjYWxsIGVuZEF0KCkgb3IgZW5kQmVmb3JlKCkgYmVmb3JlIGNhbGxpbmcgb3JkZXJCeSgpLlwiKTtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBuZXcgUmUoZSwgbik7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgICAgIGlmIChudWxsID09PSBOZSh0KSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBvcmRlciBieS4gSXQgbXVzdCBtYXRjaCBhbnkgaW5lcXVhbGl0eS5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IGtlKHQpO1xuICAgICAgICAgICAgICAgICAgICBudWxsICE9PSBuICYmIEZoKHQsIG4sIGUuZmllbGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0odCwgcyksIHM7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gKiBDcmVhdGUgYSBgQm91bmRgIGZyb20gYSBxdWVyeSBhbmQgYSBkb2N1bWVudC5cbiAqXG4gKiBOb3RlIHRoYXQgdGhlIGBCb3VuZGAgd2lsbCBhbHdheXMgaW5jbHVkZSB0aGUga2V5IG9mIHRoZSBkb2N1bWVudFxuICogYW5kIHNvIG9ubHkgdGhlIHByb3ZpZGVkIGRvY3VtZW50IHdpbGwgY29tcGFyZSBlcXVhbCB0byB0aGUgcmV0dXJuZWRcbiAqIHBvc2l0aW9uLlxuICpcbiAqIFdpbGwgdGhyb3cgaWYgdGhlIGRvY3VtZW50IGRvZXMgbm90IGNvbnRhaW4gYWxsIGZpZWxkcyBvZiB0aGUgb3JkZXIgYnlcbiAqIG9mIHRoZSBxdWVyeSBvciBpZiBhbnkgb2YgdGhlIGZpZWxkcyBpbiB0aGUgb3JkZXIgYnkgYXJlIGFuIHVuY29tbWl0dGVkXG4gKiBzZXJ2ZXIgdGltZXN0YW1wLlxuICovICh0Ll9xdWVyeSwgdGhpcy5hYywgdGhpcy5oYyk7XG4gICAgICAgIHJldHVybiBuZXcgb2ModC5maXJlc3RvcmUsIHQuY29udmVydGVyLCBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICAvLyBUT0RPKGRpbW9uZCk6IHZhbGlkYXRlIHRoYXQgb3JkZXJCeSBkb2VzIG5vdCBsaXN0IHRoZSBzYW1lIGtleSB0d2ljZS5cbiAgICAgICAgICAgIGNvbnN0IG4gPSB0LmV4cGxpY2l0T3JkZXJCeS5jb25jYXQoWyBlIF0pO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyB2ZSh0LnBhdGgsIHQuY29sbGVjdGlvbkdyb3VwLCBuLCB0LmZpbHRlcnMuc2xpY2UoKSwgdC5saW1pdCwgdC5saW1pdFR5cGUsIHQuc3RhcnRBdCwgdC5lbmRBdCk7XG4gICAgICAgIH0odC5fcXVlcnksIGUpKTtcbiAgICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHtAbGluayBRdWVyeUNvbnN0cmFpbnR9IHRoYXQgc29ydHMgdGhlIHF1ZXJ5IHJlc3VsdCBieSB0aGVcbiAqIHNwZWNpZmllZCBmaWVsZCwgb3B0aW9uYWxseSBpbiBkZXNjZW5kaW5nIG9yZGVyIGluc3RlYWQgb2YgYXNjZW5kaW5nLlxuICpcbiAqIEBwYXJhbSBmaWVsZFBhdGggLSBUaGUgZmllbGQgdG8gc29ydCBieS5cbiAqIEBwYXJhbSBkaXJlY3Rpb25TdHIgLSBPcHRpb25hbCBkaXJlY3Rpb24gdG8gc29ydCBieSAoJ2FzYycgb3IgJ2Rlc2MnKS4gSWZcbiAqIG5vdCBzcGVjaWZpZWQsIG9yZGVyIHdpbGwgYmUgYXNjZW5kaW5nLlxuICogQHJldHVybnMgVGhlIGNyZWF0ZWQge0BsaW5rIFF1ZXJ5fS5cbiAqLyBmdW5jdGlvbiBiaCh0LCBlID0gXCJhc2NcIikge1xuICAgIGNvbnN0IG4gPSBlLCBzID0gZmgoXCJvcmRlckJ5XCIsIHQpO1xuICAgIHJldHVybiBuZXcgUmgocywgbik7XG59XG5cbmNsYXNzIFBoIGV4dGVuZHMgSWgge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgc3VwZXIoKSwgdGhpcy50eXBlID0gdCwgdGhpcy5sYyA9IGUsIHRoaXMuZmMgPSBuO1xuICAgIH1cbiAgICBfYXBwbHkodCkge1xuICAgICAgICByZXR1cm4gbmV3IG9jKHQuZmlyZXN0b3JlLCB0LmNvbnZlcnRlciwgRmUodC5fcXVlcnksIHRoaXMubGMsIHRoaXMuZmMpKTtcbiAgICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHtAbGluayBRdWVyeUNvbnN0cmFpbnR9IHRoYXQgb25seSByZXR1cm5zIHRoZSBmaXJzdCBtYXRjaGluZyBkb2N1bWVudHMuXG4gKlxuICogQHBhcmFtIGxpbWl0IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRvIHJldHVybi5cbiAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIHtAbGluayBRdWVyeX0uXG4gKi8gZnVuY3Rpb24gVmgodCkge1xuICAgIHJldHVybiBlYyhcImxpbWl0XCIsIHQpLCBuZXcgUGgoXCJsaW1pdFwiLCB0LCBcIkZcIiAvKiBGaXJzdCAqLyk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHtAbGluayBRdWVyeUNvbnN0cmFpbnR9IHRoYXQgb25seSByZXR1cm5zIHRoZSBsYXN0IG1hdGNoaW5nIGRvY3VtZW50cy5cbiAqXG4gKiBZb3UgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBgb3JkZXJCeWAgY2xhdXNlIGZvciBgbGltaXRUb0xhc3RgIHF1ZXJpZXMsXG4gKiBvdGhlcndpc2UgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGR1cmluZyBleGVjdXRpb24uXG4gKlxuICogQHBhcmFtIGxpbWl0IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRvIHJldHVybi5cbiAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIHtAbGluayBRdWVyeX0uXG4gKi8gZnVuY3Rpb24gdmgodCkge1xuICAgIHJldHVybiBlYyhcImxpbWl0VG9MYXN0XCIsIHQpLCBuZXcgUGgoXCJsaW1pdFRvTGFzdFwiLCB0LCBcIkxcIiAvKiBMYXN0ICovKTtcbn1cblxuY2xhc3MgU2ggZXh0ZW5kcyBJaCB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbikge1xuICAgICAgICBzdXBlcigpLCB0aGlzLnR5cGUgPSB0LCB0aGlzLmRjID0gZSwgdGhpcy5fYyA9IG47XG4gICAgfVxuICAgIF9hcHBseSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBNaCh0LCB0aGlzLnR5cGUsIHRoaXMuZGMsIHRoaXMuX2MpO1xuICAgICAgICByZXR1cm4gbmV3IG9jKHQuZmlyZXN0b3JlLCB0LmNvbnZlcnRlciwgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyB2ZSh0LnBhdGgsIHQuY29sbGVjdGlvbkdyb3VwLCB0LmV4cGxpY2l0T3JkZXJCeS5zbGljZSgpLCB0LmZpbHRlcnMuc2xpY2UoKSwgdC5saW1pdCwgdC5saW1pdFR5cGUsIGUsIHQuZW5kQXQpO1xuICAgICAgICB9KHQuX3F1ZXJ5LCBlKSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBEaCguLi50KSB7XG4gICAgcmV0dXJuIG5ldyBTaChcInN0YXJ0QXRcIiwgdCwgXG4gICAgLyppbmNsdXNpdmU9Ki8gITApO1xufVxuXG5mdW5jdGlvbiBDaCguLi50KSB7XG4gICAgcmV0dXJuIG5ldyBTaChcInN0YXJ0QWZ0ZXJcIiwgdCwgXG4gICAgLyppbmNsdXNpdmU9Ki8gITEpO1xufVxuXG5jbGFzcyB4aCBleHRlbmRzIEloIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMudHlwZSA9IHQsIHRoaXMuZGMgPSBlLCB0aGlzLl9jID0gbjtcbiAgICB9XG4gICAgX2FwcGx5KHQpIHtcbiAgICAgICAgY29uc3QgZSA9IE1oKHQsIHRoaXMudHlwZSwgdGhpcy5kYywgdGhpcy5fYyk7XG4gICAgICAgIHJldHVybiBuZXcgb2ModC5maXJlc3RvcmUsIHQuY29udmVydGVyLCBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHZlKHQucGF0aCwgdC5jb2xsZWN0aW9uR3JvdXAsIHQuZXhwbGljaXRPcmRlckJ5LnNsaWNlKCksIHQuZmlsdGVycy5zbGljZSgpLCB0LmxpbWl0LCB0LmxpbWl0VHlwZSwgdC5zdGFydEF0LCBlKTtcbiAgICAgICAgfSh0Ll9xdWVyeSwgZSkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gTmgoLi4udCkge1xuICAgIHJldHVybiBuZXcgeGgoXCJlbmRCZWZvcmVcIiwgdCwgXG4gICAgLyppbmNsdXNpdmU9Ki8gITEpO1xufVxuXG5mdW5jdGlvbiBraCguLi50KSB7XG4gICAgcmV0dXJuIG5ldyB4aChcImVuZEF0XCIsIHQsIC8qaW5jbHVzaXZlPSovICEwKTtcbn1cblxuLyoqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBib3VuZCBmcm9tIGEgZG9jdW1lbnQgb3IgZmllbGRzICovIGZ1bmN0aW9uIE1oKHQsIGUsIG4sIHMpIHtcbiAgICBpZiAoblswXSA9IGdldE1vZHVsYXJJbnN0YW5jZShuWzBdKSwgblswXSBpbnN0YW5jZW9mIGhoKSByZXR1cm4gZnVuY3Rpb24odCwgZSwgbiwgcywgaSkge1xuICAgICAgICBpZiAoIXMpIHRocm93IG5ldyBRKEcuTk9UX0ZPVU5ELCBgQ2FuJ3QgdXNlIGEgRG9jdW1lbnRTbmFwc2hvdCB0aGF0IGRvZXNuJ3QgZXhpc3QgZm9yICR7bn0oKS5gKTtcbiAgICAgICAgY29uc3QgciA9IFtdO1xuICAgICAgICAvLyBCZWNhdXNlIHBlb3BsZSBleHBlY3QgdG8gY29udGludWUvZW5kIGEgcXVlcnkgYXQgdGhlIGV4YWN0IGRvY3VtZW50XG4gICAgICAgIC8vIHByb3ZpZGVkLCB3ZSBuZWVkIHRvIHVzZSB0aGUgaW1wbGljaXQgc29ydCBvcmRlciByYXRoZXIgdGhhbiB0aGUgZXhwbGljaXRcbiAgICAgICAgLy8gc29ydCBvcmRlciwgYmVjYXVzZSBpdCdzIGd1YXJhbnRlZWQgdG8gY29udGFpbiB0aGUgZG9jdW1lbnQga2V5LiBUaGF0IHdheVxuICAgICAgICAvLyB0aGUgcG9zaXRpb24gYmVjb21lcyB1bmFtYmlndW91cyBhbmQgdGhlIHF1ZXJ5IGNvbnRpbnVlcy9lbmRzIGV4YWN0bHkgYXRcbiAgICAgICAgLy8gdGhlIHByb3ZpZGVkIGRvY3VtZW50LiBXaXRob3V0IHRoZSBrZXkgKGJ5IHVzaW5nIHRoZSBleHBsaWNpdCBzb3J0XG4gICAgICAgIC8vIG9yZGVycyksIG11bHRpcGxlIGRvY3VtZW50cyBjb3VsZCBtYXRjaCB0aGUgcG9zaXRpb24sIHlpZWxkaW5nIGR1cGxpY2F0ZVxuICAgICAgICAvLyByZXN1bHRzLlxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbiBvZiBPZSh0KSkgaWYgKG4uZmllbGQuaXNLZXlGaWVsZCgpKSByLnB1c2goVXQoZSwgcy5rZXkpKTsgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gcy5kYXRhLmZpZWxkKG4uZmllbGQpO1xuICAgICAgICAgICAgaWYgKFJ0KHQpKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsICdJbnZhbGlkIHF1ZXJ5LiBZb3UgYXJlIHRyeWluZyB0byBzdGFydCBvciBlbmQgYSBxdWVyeSB1c2luZyBhIGRvY3VtZW50IGZvciB3aGljaCB0aGUgZmllbGQgXCInICsgbi5maWVsZCArICdcIiBpcyBhbiB1bmNvbW1pdHRlZCBzZXJ2ZXIgdGltZXN0YW1wLiAoU2luY2UgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgaXMgdW5rbm93biwgeW91IGNhbm5vdCBzdGFydC9lbmQgYSBxdWVyeSB3aXRoIGl0LiknKTtcbiAgICAgICAgICAgIGlmIChudWxsID09PSB0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IG4uZmllbGQuY2Fub25pY2FsU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBgSW52YWxpZCBxdWVyeS4gWW91IGFyZSB0cnlpbmcgdG8gc3RhcnQgb3IgZW5kIGEgcXVlcnkgdXNpbmcgYSBkb2N1bWVudCBmb3Igd2hpY2ggdGhlIGZpZWxkICcke3R9JyAodXNlZCBhcyB0aGUgb3JkZXJCeSkgZG9lcyBub3QgZXhpc3QuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByLnB1c2godCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBBZShyLCBpKTtcbiAgICB9XG4gICAgLyoqXG4gKiBDb252ZXJ0cyBhIGxpc3Qgb2YgZmllbGQgdmFsdWVzIHRvIGEgYEJvdW5kYCBmb3IgdGhlIGdpdmVuIHF1ZXJ5LlxuICovICh0Ll9xdWVyeSwgdC5maXJlc3RvcmUuX2RhdGFiYXNlSWQsIGUsIG5bMF0uX2RvY3VtZW50LCBzKTtcbiAgICB7XG4gICAgICAgIGNvbnN0IGkgPSBHYyh0LmZpcmVzdG9yZSk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlLCBuLCBzLCBpLCByKSB7XG4gICAgICAgICAgICAvLyBVc2UgZXhwbGljaXQgb3JkZXIgYnkncyBiZWNhdXNlIGl0IGhhcyB0byBtYXRjaCB0aGUgcXVlcnkgdGhlIHVzZXIgbWFkZVxuICAgICAgICAgICAgY29uc3QgbyA9IHQuZXhwbGljaXRPcmRlckJ5O1xuICAgICAgICAgICAgaWYgKGkubGVuZ3RoID4gby5sZW5ndGgpIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgYFRvbyBtYW55IGFyZ3VtZW50cyBwcm92aWRlZCB0byAke3N9KCkuIFRoZSBudW1iZXIgb2YgYXJndW1lbnRzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2Ygb3JkZXJCeSgpIGNsYXVzZXNgKTtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IHIgPSAwOyByIDwgaS5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHUgPSBpW3JdO1xuICAgICAgICAgICAgICAgIGlmIChvW3JdLmZpZWxkLmlzS2V5RmllbGQoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXCJzdHJpbmdcIiAhPSB0eXBlb2YgdSkgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBgSW52YWxpZCBxdWVyeS4gRXhwZWN0ZWQgYSBzdHJpbmcgZm9yIGRvY3VtZW50IElEIGluICR7c30oKSwgYnV0IGdvdCBhICR7dHlwZW9mIHV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghTWUodCkgJiYgLTEgIT09IHUuaW5kZXhPZihcIi9cIikpIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgYEludmFsaWQgcXVlcnkuIFdoZW4gcXVlcnlpbmcgYSBjb2xsZWN0aW9uIGFuZCBvcmRlcmluZyBieSBkb2N1bWVudElkKCksIHRoZSB2YWx1ZSBwYXNzZWQgdG8gJHtzfSgpIG11c3QgYmUgYSBwbGFpbiBkb2N1bWVudCBJRCwgYnV0ICcke3V9JyBjb250YWlucyBhIHNsYXNoLmApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gdC5wYXRoLmNoaWxkKF90LmZyb21TdHJpbmcodSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXh0LmlzRG9jdW1lbnRLZXkobikpIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgYEludmFsaWQgcXVlcnkuIFdoZW4gcXVlcnlpbmcgYSBjb2xsZWN0aW9uIGdyb3VwIGFuZCBvcmRlcmluZyBieSBkb2N1bWVudElkKCksIHRoZSB2YWx1ZSBwYXNzZWQgdG8gJHtzfSgpIG11c3QgcmVzdWx0IGluIGEgdmFsaWQgZG9jdW1lbnQgcGF0aCwgYnV0ICcke259JyBpcyBub3QgYmVjYXVzZSBpdCBjb250YWlucyBhbiBvZGQgbnVtYmVyIG9mIHNlZ21lbnRzLmApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gbmV3IHh0KG4pO1xuICAgICAgICAgICAgICAgICAgICBhLnB1c2goVXQoZSwgaSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aChuLCBzLCB1KTtcbiAgICAgICAgICAgICAgICAgICAgYS5wdXNoKHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgQWUoYSwgcik7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gKiBQYXJzZXMgdGhlIGdpdmVuIGBkb2N1bWVudElkVmFsdWVgIGludG8gYSBgUmVmZXJlbmNlVmFsdWVgLCB0aHJvd2luZ1xuICogYXBwcm9wcmlhdGUgZXJyb3JzIGlmIHRoZSB2YWx1ZSBpcyBhbnl0aGluZyBvdGhlciB0aGFuIGEgYERvY3VtZW50UmVmZXJlbmNlYFxuICogb3IgYHN0cmluZ2AsIG9yIGlmIHRoZSBzdHJpbmcgaXMgbWFsZm9ybWVkLlxuICovICh0Ll9xdWVyeSwgdC5maXJlc3RvcmUuX2RhdGFiYXNlSWQsIGksIGUsIG4sIHMpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gT2godCwgZSwgbikge1xuICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiAobiA9IGdldE1vZHVsYXJJbnN0YW5jZShuKSkpIHtcbiAgICAgICAgaWYgKFwiXCIgPT09IG4pIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgXCJJbnZhbGlkIHF1ZXJ5LiBXaGVuIHF1ZXJ5aW5nIHdpdGggZG9jdW1lbnRJZCgpLCB5b3UgbXVzdCBwcm92aWRlIGEgdmFsaWQgZG9jdW1lbnQgSUQsIGJ1dCBpdCB3YXMgYW4gZW1wdHkgc3RyaW5nLlwiKTtcbiAgICAgICAgaWYgKCFNZShlKSAmJiAtMSAhPT0gbi5pbmRleE9mKFwiL1wiKSkgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBgSW52YWxpZCBxdWVyeS4gV2hlbiBxdWVyeWluZyBhIGNvbGxlY3Rpb24gYnkgZG9jdW1lbnRJZCgpLCB5b3UgbXVzdCBwcm92aWRlIGEgcGxhaW4gZG9jdW1lbnQgSUQsIGJ1dCAnJHtufScgY29udGFpbnMgYSAnLycgY2hhcmFjdGVyLmApO1xuICAgICAgICBjb25zdCBzID0gZS5wYXRoLmNoaWxkKF90LmZyb21TdHJpbmcobikpO1xuICAgICAgICBpZiAoIXh0LmlzRG9jdW1lbnRLZXkocykpIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgYEludmFsaWQgcXVlcnkuIFdoZW4gcXVlcnlpbmcgYSBjb2xsZWN0aW9uIGdyb3VwIGJ5IGRvY3VtZW50SWQoKSwgdGhlIHZhbHVlIHByb3ZpZGVkIG11c3QgcmVzdWx0IGluIGEgdmFsaWQgZG9jdW1lbnQgcGF0aCwgYnV0ICcke3N9JyBpcyBub3QgYmVjYXVzZSBpdCBoYXMgYW4gb2RkIG51bWJlciBvZiBzZWdtZW50cyAoJHtzLmxlbmd0aH0pLmApO1xuICAgICAgICByZXR1cm4gVXQodCwgbmV3IHh0KHMpKTtcbiAgICB9XG4gICAgaWYgKG4gaW5zdGFuY2VvZiByYykgcmV0dXJuIFV0KHQsIG4uX2tleSk7XG4gICAgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBgSW52YWxpZCBxdWVyeS4gV2hlbiBxdWVyeWluZyB3aXRoIGRvY3VtZW50SWQoKSwgeW91IG11c3QgcHJvdmlkZSBhIHZhbGlkIHN0cmluZyBvciBhIERvY3VtZW50UmVmZXJlbmNlLCBidXQgaXQgd2FzOiAke1p1KG4pfS5gKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhhdCB0aGUgdmFsdWUgcGFzc2VkIGludG8gYSBkaXNqdW5jdGl2ZSBmaWx0ZXIgc2F0aXNmaWVzIGFsbFxuICogYXJyYXkgcmVxdWlyZW1lbnRzLlxuICovIGZ1bmN0aW9uICRoKHQsIGUpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodCkgfHwgMCA9PT0gdC5sZW5ndGgpIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgYEludmFsaWQgUXVlcnkuIEEgbm9uLWVtcHR5IGFycmF5IGlzIHJlcXVpcmVkIGZvciAnJHtlLnRvU3RyaW5nKCl9JyBmaWx0ZXJzLmApO1xuICAgIGlmICh0Lmxlbmd0aCA+IDEwKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIGBJbnZhbGlkIFF1ZXJ5LiAnJHtlLnRvU3RyaW5nKCl9JyBmaWx0ZXJzIHN1cHBvcnQgYSBtYXhpbXVtIG9mIDEwIGVsZW1lbnRzIGluIHRoZSB2YWx1ZSBhcnJheS5gKTtcbn1cblxuZnVuY3Rpb24gRmgodCwgZSwgbikge1xuICAgIGlmICghbi5pc0VxdWFsKGUpKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIGBJbnZhbGlkIHF1ZXJ5LiBZb3UgaGF2ZSBhIHdoZXJlIGZpbHRlciB3aXRoIGFuIGluZXF1YWxpdHkgKDwsIDw9LCAhPSwgbm90LWluLCA+LCBvciA+PSkgb24gZmllbGQgJyR7ZS50b1N0cmluZygpfScgYW5kIHNvIHlvdSBtdXN0IGFsc28gdXNlICcke2UudG9TdHJpbmcoKX0nIGFzIHlvdXIgZmlyc3QgYXJndW1lbnQgdG8gb3JkZXJCeSgpLCBidXQgeW91ciBmaXJzdCBvcmRlckJ5KCkgaXMgb24gZmllbGQgJyR7bi50b1N0cmluZygpfScgaW5zdGVhZC5gKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQ29udmVydHMgRmlyZXN0b3JlJ3MgaW50ZXJuYWwgdHlwZXMgdG8gdGhlIEphdmFTY3JpcHQgdHlwZXMgdGhhdCB3ZSBleHBvc2VcbiAqIHRvIHRoZSB1c2VyLlxuICpcbiAqIEBpbnRlcm5hbFxuICovIGNsYXNzIEJoIHtcbiAgICBjb252ZXJ0VmFsdWUodCwgZSA9IFwibm9uZVwiKSB7XG4gICAgICAgIHN3aXRjaCAoTXQodCkpIHtcbiAgICAgICAgICBjYXNlIDAgLyogTnVsbFZhbHVlICovIDpcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgY2FzZSAxIC8qIEJvb2xlYW5WYWx1ZSAqLyA6XG4gICAgICAgICAgICByZXR1cm4gdC5ib29sZWFuVmFsdWU7XG5cbiAgICAgICAgICBjYXNlIDIgLyogTnVtYmVyVmFsdWUgKi8gOlxuICAgICAgICAgICAgcmV0dXJuIEV0KHQuaW50ZWdlclZhbHVlIHx8IHQuZG91YmxlVmFsdWUpO1xuXG4gICAgICAgICAgY2FzZSAzIC8qIFRpbWVzdGFtcFZhbHVlICovIDpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRUaW1lc3RhbXAodC50aW1lc3RhbXBWYWx1ZSk7XG5cbiAgICAgICAgICBjYXNlIDQgLyogU2VydmVyVGltZXN0YW1wVmFsdWUgKi8gOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydFNlcnZlclRpbWVzdGFtcCh0LCBlKTtcblxuICAgICAgICAgIGNhc2UgNSAvKiBTdHJpbmdWYWx1ZSAqLyA6XG4gICAgICAgICAgICByZXR1cm4gdC5zdHJpbmdWYWx1ZTtcblxuICAgICAgICAgIGNhc2UgNiAvKiBCbG9iVmFsdWUgKi8gOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydEJ5dGVzKEF0KHQuYnl0ZXNWYWx1ZSkpO1xuXG4gICAgICAgICAgY2FzZSA3IC8qIFJlZlZhbHVlICovIDpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRSZWZlcmVuY2UodC5yZWZlcmVuY2VWYWx1ZSk7XG5cbiAgICAgICAgICBjYXNlIDggLyogR2VvUG9pbnRWYWx1ZSAqLyA6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0R2VvUG9pbnQodC5nZW9Qb2ludFZhbHVlKTtcblxuICAgICAgICAgIGNhc2UgOSAvKiBBcnJheVZhbHVlICovIDpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRBcnJheSh0LmFycmF5VmFsdWUsIGUpO1xuXG4gICAgICAgICAgY2FzZSAxMCAvKiBPYmplY3RWYWx1ZSAqLyA6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0T2JqZWN0KHQubWFwVmFsdWUsIGUpO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IEwoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb252ZXJ0T2JqZWN0KHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IHt9O1xuICAgICAgICByZXR1cm4gbHQodC5maWVsZHMsICgodCwgcykgPT4ge1xuICAgICAgICAgICAgblt0XSA9IHRoaXMuY29udmVydFZhbHVlKHMsIGUpO1xuICAgICAgICB9KSksIG47XG4gICAgfVxuICAgIGNvbnZlcnRHZW9Qb2ludCh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgJGMoRXQodC5sYXRpdHVkZSksIEV0KHQubG9uZ2l0dWRlKSk7XG4gICAgfVxuICAgIGNvbnZlcnRBcnJheSh0LCBlKSB7XG4gICAgICAgIHJldHVybiAodC52YWx1ZXMgfHwgW10pLm1hcCgodCA9PiB0aGlzLmNvbnZlcnRWYWx1ZSh0LCBlKSkpO1xuICAgIH1cbiAgICBjb252ZXJ0U2VydmVyVGltZXN0YW1wKHQsIGUpIHtcbiAgICAgICAgc3dpdGNoIChlKSB7XG4gICAgICAgICAgY2FzZSBcInByZXZpb3VzXCI6XG4gICAgICAgICAgICBjb25zdCBuID0gYnQodCk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbCA9PSBuID8gbnVsbCA6IHRoaXMuY29udmVydFZhbHVlKG4sIGUpO1xuXG4gICAgICAgICAgY2FzZSBcImVzdGltYXRlXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0VGltZXN0YW1wKFB0KHQpKTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb252ZXJ0VGltZXN0YW1wKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IFR0KHQpO1xuICAgICAgICByZXR1cm4gbmV3IHV0KGUuc2Vjb25kcywgZS5uYW5vcyk7XG4gICAgfVxuICAgIGNvbnZlcnREb2N1bWVudEtleSh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBfdC5mcm9tU3RyaW5nKHQpO1xuICAgICAgICBxKE9zKG4pKTtcbiAgICAgICAgY29uc3QgcyA9IG5ldyB2dChuLmdldCgxKSwgbi5nZXQoMykpLCBpID0gbmV3IHh0KG4ucG9wRmlyc3QoNSkpO1xuICAgICAgICByZXR1cm4gcy5pc0VxdWFsKGUpIHx8IFxuICAgICAgICAvLyBUT0RPKGIvNjQxMzAyMDIpOiBTb21laG93IHN1cHBvcnQgZm9yZWlnbiByZWZlcmVuY2VzLlxuICAgICAgICAkKGBEb2N1bWVudCAke2l9IGNvbnRhaW5zIGEgZG9jdW1lbnQgcmVmZXJlbmNlIHdpdGhpbiBhIGRpZmZlcmVudCBkYXRhYmFzZSAoJHtzLnByb2plY3RJZH0vJHtzLmRhdGFiYXNlfSkgd2hpY2ggaXMgbm90IHN1cHBvcnRlZC4gSXQgd2lsbCBiZSB0cmVhdGVkIGFzIGEgcmVmZXJlbmNlIGluIHRoZSBjdXJyZW50IGRhdGFiYXNlICgke2UucHJvamVjdElkfS8ke2UuZGF0YWJhc2V9KSBpbnN0ZWFkLmApLCBcbiAgICAgICAgaTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIENvbnZlcnRzIGN1c3RvbSBtb2RlbCBvYmplY3Qgb2YgdHlwZSBUIGludG8gYERvY3VtZW50RGF0YWAgYnkgYXBwbHlpbmcgdGhlXG4gKiBjb252ZXJ0ZXIgaWYgaXQgZXhpc3RzLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIGNvbnZlcnRpbmcgdXNlciBvYmplY3RzIHRvIGBEb2N1bWVudERhdGFgXG4gKiBiZWNhdXNlIHdlIHdhbnQgdG8gcHJvdmlkZSB0aGUgdXNlciB3aXRoIGEgbW9yZSBzcGVjaWZpYyBlcnJvciBtZXNzYWdlIGlmXG4gKiB0aGVpciBgc2V0KClgIG9yIGZhaWxzIGR1ZSB0byBpbnZhbGlkIGRhdGEgb3JpZ2luYXRpbmcgZnJvbSBhIGB0b0ZpcmVzdG9yZSgpYFxuICogY2FsbC5cbiAqLyBmdW5jdGlvbiBMaCh0LCBlLCBuKSB7XG4gICAgbGV0IHM7XG4gICAgLy8gQ2FzdCB0byBgYW55YCBpbiBvcmRlciB0byBzYXRpc2Z5IHRoZSB1bmlvbiB0eXBlIGNvbnN0cmFpbnQgb25cbiAgICAvLyB0b0ZpcmVzdG9yZSgpLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcmV0dXJuIHMgPSB0ID8gbiAmJiAobi5tZXJnZSB8fCBuLm1lcmdlRmllbGRzKSA/IHQudG9GaXJlc3RvcmUoZSwgbikgOiB0LnRvRmlyZXN0b3JlKGUpIDogZSwgXG4gICAgcztcbn1cblxuY2xhc3MgcWggZXh0ZW5kcyBCaCB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICBzdXBlcigpLCB0aGlzLmZpcmVzdG9yZSA9IHQ7XG4gICAgfVxuICAgIGNvbnZlcnRCeXRlcyh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgTWModCk7XG4gICAgfVxuICAgIGNvbnZlcnRSZWZlcmVuY2UodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5jb252ZXJ0RG9jdW1lbnRLZXkodCwgdGhpcy5maXJlc3RvcmUuX2RhdGFiYXNlSWQpO1xuICAgICAgICByZXR1cm4gbmV3IHJjKHRoaXMuZmlyZXN0b3JlLCAvKiBjb252ZXJ0ZXI9ICovIG51bGwsIGUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQSB3cml0ZSBiYXRjaCwgdXNlZCB0byBwZXJmb3JtIG11bHRpcGxlIHdyaXRlcyBhcyBhIHNpbmdsZSBhdG9taWMgdW5pdC5cbiAqXG4gKiBBIGBXcml0ZUJhdGNoYCBvYmplY3QgY2FuIGJlIGFjcXVpcmVkIGJ5IGNhbGxpbmcge0BsaW5rIHdyaXRlQmF0Y2h9LiBJdFxuICogcHJvdmlkZXMgbWV0aG9kcyBmb3IgYWRkaW5nIHdyaXRlcyB0byB0aGUgd3JpdGUgYmF0Y2guIE5vbmUgb2YgdGhlIHdyaXRlc1xuICogd2lsbCBiZSBjb21taXR0ZWQgKG9yIHZpc2libGUgbG9jYWxseSkgdW50aWwge0BsaW5rIFdyaXRlQmF0Y2guY29tbWl0fSBpc1xuICogY2FsbGVkLlxuICovIGNsYXNzIFVoIHtcbiAgICAvKiogQGhpZGVjb25zdHJ1Y3RvciAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5fZmlyZXN0b3JlID0gdCwgdGhpcy5fY29tbWl0SGFuZGxlciA9IGUsIHRoaXMuX211dGF0aW9ucyA9IFtdLCB0aGlzLl9jb21taXR0ZWQgPSAhMSwgXG4gICAgICAgIHRoaXMuX2RhdGFSZWFkZXIgPSBHYyh0KTtcbiAgICB9XG4gICAgc2V0KHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy5fdmVyaWZ5Tm90Q29tbWl0dGVkKCk7XG4gICAgICAgIGNvbnN0IHMgPSBLaCh0LCB0aGlzLl9maXJlc3RvcmUpLCBpID0gTGgocy5jb252ZXJ0ZXIsIGUsIG4pLCByID0gUWModGhpcy5fZGF0YVJlYWRlciwgXCJXcml0ZUJhdGNoLnNldFwiLCBzLl9rZXksIGksIG51bGwgIT09IHMuY29udmVydGVyLCBuKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX211dGF0aW9ucy5wdXNoKHIudG9NdXRhdGlvbihzLl9rZXksIGhuLm5vbmUoKSkpLCB0aGlzO1xuICAgIH1cbiAgICB1cGRhdGUodCwgZSwgbiwgLi4ucykge1xuICAgICAgICB0aGlzLl92ZXJpZnlOb3RDb21taXR0ZWQoKTtcbiAgICAgICAgY29uc3QgaSA9IEtoKHQsIHRoaXMuX2ZpcmVzdG9yZSk7XG4gICAgICAgIC8vIEZvciBDb21wYXQgdHlwZXMsIHdlIGhhdmUgdG8gXCJleHRyYWN0XCIgdGhlIHVuZGVybHlpbmcgdHlwZXMgYmVmb3JlXG4gICAgICAgIC8vIHBlcmZvcm1pbmcgdmFsaWRhdGlvbi5cbiAgICAgICAgICAgICAgICBsZXQgcjtcbiAgICAgICAgcmV0dXJuIHIgPSBcInN0cmluZ1wiID09IHR5cGVvZiAoZSA9IGdldE1vZHVsYXJJbnN0YW5jZShlKSkgfHwgZSBpbnN0YW5jZW9mIE5jID8gWmModGhpcy5fZGF0YVJlYWRlciwgXCJXcml0ZUJhdGNoLnVwZGF0ZVwiLCBpLl9rZXksIGUsIG4sIHMpIDogWGModGhpcy5fZGF0YVJlYWRlciwgXCJXcml0ZUJhdGNoLnVwZGF0ZVwiLCBpLl9rZXksIGUpLCBcbiAgICAgICAgdGhpcy5fbXV0YXRpb25zLnB1c2goci50b011dGF0aW9uKGkuX2tleSwgaG4uZXhpc3RzKCEwKSkpLCB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxldGVzIHRoZSBkb2N1bWVudCByZWZlcnJlZCB0byBieSB0aGUgcHJvdmlkZWQge0BsaW5rIERvY3VtZW50UmVmZXJlbmNlfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkb2N1bWVudFJlZiAtIEEgcmVmZXJlbmNlIHRvIHRoZSBkb2N1bWVudCB0byBiZSBkZWxldGVkLlxuICAgICAqIEByZXR1cm5zIFRoaXMgYFdyaXRlQmF0Y2hgIGluc3RhbmNlLiBVc2VkIGZvciBjaGFpbmluZyBtZXRob2QgY2FsbHMuXG4gICAgICovICAgIGRlbGV0ZSh0KSB7XG4gICAgICAgIHRoaXMuX3ZlcmlmeU5vdENvbW1pdHRlZCgpO1xuICAgICAgICBjb25zdCBlID0gS2godCwgdGhpcy5fZmlyZXN0b3JlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX211dGF0aW9ucyA9IHRoaXMuX211dGF0aW9ucy5jb25jYXQobmV3IEFuKGUuX2tleSwgaG4ubm9uZSgpKSksIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbW1pdHMgYWxsIG9mIHRoZSB3cml0ZXMgaW4gdGhpcyB3cml0ZSBiYXRjaCBhcyBhIHNpbmdsZSBhdG9taWMgdW5pdC5cbiAgICAgKlxuICAgICAqIFRoZSByZXN1bHQgb2YgdGhlc2Ugd3JpdGVzIHdpbGwgb25seSBiZSByZWZsZWN0ZWQgaW4gZG9jdW1lbnQgcmVhZHMgdGhhdFxuICAgICAqIG9jY3VyIGFmdGVyIHRoZSByZXR1cm5lZCBwcm9taXNlIHJlc29sdmVzLiBJZiB0aGUgY2xpZW50IGlzIG9mZmxpbmUsIHRoZVxuICAgICAqIHdyaXRlIGZhaWxzLiBJZiB5b3Ugd291bGQgbGlrZSB0byBzZWUgbG9jYWwgbW9kaWZpY2F0aW9ucyBvciBidWZmZXIgd3JpdGVzXG4gICAgICogdW50aWwgdGhlIGNsaWVudCBpcyBvbmxpbmUsIHVzZSB0aGUgZnVsbCBGaXJlc3RvcmUgU0RLLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBgUHJvbWlzZWAgcmVzb2x2ZWQgb25jZSBhbGwgb2YgdGhlIHdyaXRlcyBpbiB0aGUgYmF0Y2ggaGF2ZSBiZWVuXG4gICAgICogc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4gdG8gdGhlIGJhY2tlbmQgYXMgYW4gYXRvbWljIHVuaXQgKG5vdGUgdGhhdCBpdCB3b24ndFxuICAgICAqIHJlc29sdmUgd2hpbGUgeW91J3JlIG9mZmxpbmUpLlxuICAgICAqLyAgICBjb21taXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92ZXJpZnlOb3RDb21taXR0ZWQoKSwgdGhpcy5fY29tbWl0dGVkID0gITAsIHRoaXMuX211dGF0aW9ucy5sZW5ndGggPiAwID8gdGhpcy5fY29tbWl0SGFuZGxlcih0aGlzLl9tdXRhdGlvbnMpIDogUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIF92ZXJpZnlOb3RDb21taXR0ZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jb21taXR0ZWQpIHRocm93IG5ldyBRKEcuRkFJTEVEX1BSRUNPTkRJVElPTiwgXCJBIHdyaXRlIGJhdGNoIGNhbiBubyBsb25nZXIgYmUgdXNlZCBhZnRlciBjb21taXQoKSBoYXMgYmVlbiBjYWxsZWQuXCIpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gS2godCwgZSkge1xuICAgIGlmICgodCA9IGdldE1vZHVsYXJJbnN0YW5jZSh0KSkuZmlyZXN0b3JlICE9PSBlKSB0aHJvdyBuZXcgUShHLklOVkFMSURfQVJHVU1FTlQsIFwiUHJvdmlkZWQgZG9jdW1lbnQgcmVmZXJlbmNlIGlzIGZyb20gYSBkaWZmZXJlbnQgRmlyZXN0b3JlIGluc3RhbmNlLlwiKTtcbiAgICByZXR1cm4gdDtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8vIFRPRE8obXJzY2htaWR0KSBDb25zaWRlciB1c2luZyBgQmFzZVRyYW5zYWN0aW9uYCBhcyB0aGUgYmFzZSBjbGFzcyBpbiB0aGVcbi8vIGxlZ2FjeSBTREsuXG4vKipcbiAqIEEgcmVmZXJlbmNlIHRvIGEgdHJhbnNhY3Rpb24uXG4gKlxuICogVGhlIGBUcmFuc2FjdGlvbmAgb2JqZWN0IHBhc3NlZCB0byBhIHRyYW5zYWN0aW9uJ3MgYHVwZGF0ZUZ1bmN0aW9uYCBwcm92aWRlc1xuICogdGhlIG1ldGhvZHMgdG8gcmVhZCBhbmQgd3JpdGUgZGF0YSB3aXRoaW4gdGhlIHRyYW5zYWN0aW9uIGNvbnRleHQuIFNlZVxuICoge0BsaW5rIHJ1blRyYW5zYWN0aW9ufS5cbiAqL1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogUmVhZHMgdGhlIGRvY3VtZW50IHJlZmVycmVkIHRvIGJ5IHRoaXMgYERvY3VtZW50UmVmZXJlbmNlYC5cbiAqXG4gKiBOb3RlOiBgZ2V0RG9jKClgIGF0dGVtcHRzIHRvIHByb3ZpZGUgdXAtdG8tZGF0ZSBkYXRhIHdoZW4gcG9zc2libGUgYnkgd2FpdGluZ1xuICogZm9yIGRhdGEgZnJvbSB0aGUgc2VydmVyLCBidXQgaXQgbWF5IHJldHVybiBjYWNoZWQgZGF0YSBvciBmYWlsIGlmIHlvdSBhcmVcbiAqIG9mZmxpbmUgYW5kIHRoZSBzZXJ2ZXIgY2Fubm90IGJlIHJlYWNoZWQuIFRvIHNwZWNpZnkgdGhpcyBiZWhhdmlvciwgaW52b2tlXG4gKiB7QGxpbmsgZ2V0RG9jRnJvbUNhY2hlfSBvciB7QGxpbmsgZ2V0RG9jRnJvbVNlcnZlcn0uXG4gKlxuICogQHBhcmFtIHJlZmVyZW5jZSAtIFRoZSByZWZlcmVuY2Ugb2YgdGhlIGRvY3VtZW50IHRvIGZldGNoLlxuICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmVkIHdpdGggYSBgRG9jdW1lbnRTbmFwc2hvdGAgY29udGFpbmluZyB0aGVcbiAqIGN1cnJlbnQgZG9jdW1lbnQgY29udGVudHMuXG4gKi9cbmZ1bmN0aW9uIEdoKHQpIHtcbiAgICB0ID0gdGModCwgcmMpO1xuICAgIGNvbnN0IGUgPSB0Yyh0LmZpcmVzdG9yZSwgZ2MpO1xuICAgIHJldHVybiBxdShJYyhlKSwgdC5fa2V5KS50aGVuKChuID0+IGlsKGUsIHQsIG4pKSk7XG59XG5cbmNsYXNzIFFoIGV4dGVuZHMgQmgge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgc3VwZXIoKSwgdGhpcy5maXJlc3RvcmUgPSB0O1xuICAgIH1cbiAgICBjb252ZXJ0Qnl0ZXModCkge1xuICAgICAgICByZXR1cm4gbmV3IE1jKHQpO1xuICAgIH1cbiAgICBjb252ZXJ0UmVmZXJlbmNlKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMuY29udmVydERvY3VtZW50S2V5KHQsIHRoaXMuZmlyZXN0b3JlLl9kYXRhYmFzZUlkKTtcbiAgICAgICAgcmV0dXJuIG5ldyByYyh0aGlzLmZpcmVzdG9yZSwgLyogY29udmVydGVyPSAqLyBudWxsLCBlKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGRvY3VtZW50IHJlZmVycmVkIHRvIGJ5IHRoaXMgYERvY3VtZW50UmVmZXJlbmNlYCBmcm9tIGNhY2hlLlxuICogUmV0dXJucyBhbiBlcnJvciBpZiB0aGUgZG9jdW1lbnQgaXMgbm90IGN1cnJlbnRseSBjYWNoZWQuXG4gKlxuICogQHJldHVybnMgQSBgUHJvbWlzZWAgcmVzb2x2ZWQgd2l0aCBhIGBEb2N1bWVudFNuYXBzaG90YCBjb250YWluaW5nIHRoZVxuICogY3VycmVudCBkb2N1bWVudCBjb250ZW50cy5cbiAqLyBmdW5jdGlvbiBqaCh0KSB7XG4gICAgdCA9IHRjKHQsIHJjKTtcbiAgICBjb25zdCBlID0gdGModC5maXJlc3RvcmUsIGdjKSwgbiA9IEljKGUpLCBzID0gbmV3IFFoKGUpO1xuICAgIHJldHVybiBMdShuLCB0Ll9rZXkpLnRoZW4oKG4gPT4gbmV3IF9oKGUsIHMsIHQuX2tleSwgbiwgbmV3IGRoKG51bGwgIT09IG4gJiYgbi5oYXNMb2NhbE11dGF0aW9ucywgXG4gICAgLyogZnJvbUNhY2hlPSAqLyAhMCksIHQuY29udmVydGVyKSkpO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBkb2N1bWVudCByZWZlcnJlZCB0byBieSB0aGlzIGBEb2N1bWVudFJlZmVyZW5jZWAgZnJvbSB0aGUgc2VydmVyLlxuICogUmV0dXJucyBhbiBlcnJvciBpZiB0aGUgbmV0d29yayBpcyBub3QgYXZhaWxhYmxlLlxuICpcbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIHJlc29sdmVkIHdpdGggYSBgRG9jdW1lbnRTbmFwc2hvdGAgY29udGFpbmluZyB0aGVcbiAqIGN1cnJlbnQgZG9jdW1lbnQgY29udGVudHMuXG4gKi8gZnVuY3Rpb24gV2godCkge1xuICAgIHQgPSB0Yyh0LCByYyk7XG4gICAgY29uc3QgZSA9IHRjKHQuZmlyZXN0b3JlLCBnYyk7XG4gICAgcmV0dXJuIHF1KEljKGUpLCB0Ll9rZXksIHtcbiAgICAgICAgc291cmNlOiBcInNlcnZlclwiXG4gICAgfSkudGhlbigobiA9PiBpbChlLCB0LCBuKSkpO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0cyBhcyBhIGBRdWVyeVNuYXBzaG90YC5cbiAqXG4gKiBOb3RlOiBgZ2V0RG9jcygpYCBhdHRlbXB0cyB0byBwcm92aWRlIHVwLXRvLWRhdGUgZGF0YSB3aGVuIHBvc3NpYmxlIGJ5XG4gKiB3YWl0aW5nIGZvciBkYXRhIGZyb20gdGhlIHNlcnZlciwgYnV0IGl0IG1heSByZXR1cm4gY2FjaGVkIGRhdGEgb3IgZmFpbCBpZlxuICogeW91IGFyZSBvZmZsaW5lIGFuZCB0aGUgc2VydmVyIGNhbm5vdCBiZSByZWFjaGVkLiBUbyBzcGVjaWZ5IHRoaXMgYmVoYXZpb3IsXG4gKiBpbnZva2Uge0BsaW5rIGdldERvY3NGcm9tQ2FjaGV9IG9yIHtAbGluayBnZXREb2NzRnJvbVNlcnZlcn0uXG4gKlxuICogQHJldHVybnMgQSBgUHJvbWlzZWAgdGhhdCB3aWxsIGJlIHJlc29sdmVkIHdpdGggdGhlIHJlc3VsdHMgb2YgdGhlIHF1ZXJ5LlxuICovIGZ1bmN0aW9uIHpoKHQpIHtcbiAgICB0ID0gdGModCwgb2MpO1xuICAgIGNvbnN0IGUgPSB0Yyh0LmZpcmVzdG9yZSwgZ2MpLCBuID0gSWMoZSksIHMgPSBuZXcgUWgoZSk7XG4gICAgcmV0dXJuIHBoKHQuX3F1ZXJ5KSwgS3UobiwgdC5fcXVlcnkpLnRoZW4oKG4gPT4gbmV3IG1oKGUsIHMsIHQsIG4pKSk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSByZXN1bHRzIGFzIGEgYFF1ZXJ5U25hcHNob3RgIGZyb20gY2FjaGUuXG4gKiBSZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBkb2N1bWVudCBpcyBub3QgY3VycmVudGx5IGNhY2hlZC5cbiAqXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0cyBvZiB0aGUgcXVlcnkuXG4gKi8gZnVuY3Rpb24gSGgodCkge1xuICAgIHQgPSB0Yyh0LCBvYyk7XG4gICAgY29uc3QgZSA9IHRjKHQuZmlyZXN0b3JlLCBnYyksIG4gPSBJYyhlKSwgcyA9IG5ldyBRaChlKTtcbiAgICByZXR1cm4gVXUobiwgdC5fcXVlcnkpLnRoZW4oKG4gPT4gbmV3IG1oKGUsIHMsIHQsIG4pKSk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSByZXN1bHRzIGFzIGEgYFF1ZXJ5U25hcHNob3RgIGZyb20gdGhlXG4gKiBzZXJ2ZXIuIFJldHVybnMgYW4gZXJyb3IgaWYgdGhlIG5ldHdvcmsgaXMgbm90IGF2YWlsYWJsZS5cbiAqXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0cyBvZiB0aGUgcXVlcnkuXG4gKi8gZnVuY3Rpb24gSmgodCkge1xuICAgIHQgPSB0Yyh0LCBvYyk7XG4gICAgY29uc3QgZSA9IHRjKHQuZmlyZXN0b3JlLCBnYyksIG4gPSBJYyhlKSwgcyA9IG5ldyBRaChlKTtcbiAgICByZXR1cm4gS3UobiwgdC5fcXVlcnksIHtcbiAgICAgICAgc291cmNlOiBcInNlcnZlclwiXG4gICAgfSkudGhlbigobiA9PiBuZXcgbWgoZSwgcywgdCwgbikpKTtcbn1cblxuZnVuY3Rpb24gWWgodCwgZSwgbikge1xuICAgIHQgPSB0Yyh0LCByYyk7XG4gICAgY29uc3QgcyA9IHRjKHQuZmlyZXN0b3JlLCBnYyksIGkgPSBMaCh0LmNvbnZlcnRlciwgZSwgbik7XG4gICAgcmV0dXJuIHNsKHMsIFsgUWMoR2MocyksIFwic2V0RG9jXCIsIHQuX2tleSwgaSwgbnVsbCAhPT0gdC5jb252ZXJ0ZXIsIG4pLnRvTXV0YXRpb24odC5fa2V5LCBobi5ub25lKCkpIF0pO1xufVxuXG5mdW5jdGlvbiBYaCh0LCBlLCBuLCAuLi5zKSB7XG4gICAgdCA9IHRjKHQsIHJjKTtcbiAgICBjb25zdCBpID0gdGModC5maXJlc3RvcmUsIGdjKSwgciA9IEdjKGkpO1xuICAgIGxldCBvO1xuICAgIG8gPSBcInN0cmluZ1wiID09IHR5cGVvZiAoXG4gICAgLy8gRm9yIENvbXBhdCB0eXBlcywgd2UgaGF2ZSB0byBcImV4dHJhY3RcIiB0aGUgdW5kZXJseWluZyB0eXBlcyBiZWZvcmVcbiAgICAvLyBwZXJmb3JtaW5nIHZhbGlkYXRpb24uXG4gICAgZSA9IGdldE1vZHVsYXJJbnN0YW5jZShlKSkgfHwgZSBpbnN0YW5jZW9mIE5jID8gWmMociwgXCJ1cGRhdGVEb2NcIiwgdC5fa2V5LCBlLCBuLCBzKSA6IFhjKHIsIFwidXBkYXRlRG9jXCIsIHQuX2tleSwgZSk7XG4gICAgcmV0dXJuIHNsKGksIFsgby50b011dGF0aW9uKHQuX2tleSwgaG4uZXhpc3RzKCEwKSkgXSk7XG59XG5cbi8qKlxuICogRGVsZXRlcyB0aGUgZG9jdW1lbnQgcmVmZXJyZWQgdG8gYnkgdGhlIHNwZWNpZmllZCBgRG9jdW1lbnRSZWZlcmVuY2VgLlxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2UgLSBBIHJlZmVyZW5jZSB0byB0aGUgZG9jdW1lbnQgdG8gZGVsZXRlLlxuICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGRvY3VtZW50IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseVxuICogZGVsZXRlZCBmcm9tIHRoZSBiYWNrZW5kIChub3RlIHRoYXQgaXQgd29uJ3QgcmVzb2x2ZSB3aGlsZSB5b3UncmUgb2ZmbGluZSkuXG4gKi8gZnVuY3Rpb24gWmgodCkge1xuICAgIHJldHVybiBzbCh0Yyh0LmZpcmVzdG9yZSwgZ2MpLCBbIG5ldyBBbih0Ll9rZXksIGhuLm5vbmUoKSkgXSk7XG59XG5cbi8qKlxuICogQWRkIGEgbmV3IGRvY3VtZW50IHRvIHNwZWNpZmllZCBgQ29sbGVjdGlvblJlZmVyZW5jZWAgd2l0aCB0aGUgZ2l2ZW4gZGF0YSxcbiAqIGFzc2lnbmluZyBpdCBhIGRvY3VtZW50IElEIGF1dG9tYXRpY2FsbHkuXG4gKlxuICogQHBhcmFtIHJlZmVyZW5jZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjb2xsZWN0aW9uIHRvIGFkZCB0aGlzIGRvY3VtZW50IHRvLlxuICogQHBhcmFtIGRhdGEgLSBBbiBPYmplY3QgY29udGFpbmluZyB0aGUgZGF0YSBmb3IgdGhlIG5ldyBkb2N1bWVudC5cbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIHJlc29sdmVkIHdpdGggYSBgRG9jdW1lbnRSZWZlcmVuY2VgIHBvaW50aW5nIHRvIHRoZVxuICogbmV3bHkgY3JlYXRlZCBkb2N1bWVudCBhZnRlciBpdCBoYXMgYmVlbiB3cml0dGVuIHRvIHRoZSBiYWNrZW5kIChOb3RlIHRoYXQgaXRcbiAqIHdvbid0IHJlc29sdmUgd2hpbGUgeW91J3JlIG9mZmxpbmUpLlxuICovIGZ1bmN0aW9uIHRsKHQsIGUpIHtcbiAgICBjb25zdCBuID0gdGModC5maXJlc3RvcmUsIGdjKSwgcyA9IGhjKHQpLCBpID0gTGgodC5jb252ZXJ0ZXIsIGUpO1xuICAgIHJldHVybiBzbChuLCBbIFFjKEdjKHQuZmlyZXN0b3JlKSwgXCJhZGREb2NcIiwgcy5fa2V5LCBpLCBudWxsICE9PSB0LmNvbnZlcnRlciwge30pLnRvTXV0YXRpb24ocy5fa2V5LCBobi5leGlzdHMoITEpKSBdKS50aGVuKCgoKSA9PiBzKSk7XG59XG5cbmZ1bmN0aW9uIGVsKHQsIC4uLmUpIHtcbiAgICB2YXIgbiwgcywgaTtcbiAgICB0ID0gZ2V0TW9kdWxhckluc3RhbmNlKHQpO1xuICAgIGxldCByID0ge1xuICAgICAgICBpbmNsdWRlTWV0YWRhdGFDaGFuZ2VzOiAhMVxuICAgIH0sIG8gPSAwO1xuICAgIFwib2JqZWN0XCIgIT0gdHlwZW9mIGVbb10gfHwgX2MoZVtvXSkgfHwgKHIgPSBlW29dLCBvKyspO1xuICAgIGNvbnN0IGEgPSB7XG4gICAgICAgIGluY2x1ZGVNZXRhZGF0YUNoYW5nZXM6IHIuaW5jbHVkZU1ldGFkYXRhQ2hhbmdlc1xuICAgIH07XG4gICAgaWYgKF9jKGVbb10pKSB7XG4gICAgICAgIGNvbnN0IHQgPSBlW29dO1xuICAgICAgICBlW29dID0gbnVsbCA9PT0gKG4gPSB0Lm5leHQpIHx8IHZvaWQgMCA9PT0gbiA/IHZvaWQgMCA6IG4uYmluZCh0KSwgZVtvICsgMV0gPSBudWxsID09PSAocyA9IHQuZXJyb3IpIHx8IHZvaWQgMCA9PT0gcyA/IHZvaWQgMCA6IHMuYmluZCh0KSwgXG4gICAgICAgIGVbbyArIDJdID0gbnVsbCA9PT0gKGkgPSB0LmNvbXBsZXRlKSB8fCB2b2lkIDAgPT09IGkgPyB2b2lkIDAgOiBpLmJpbmQodCk7XG4gICAgfVxuICAgIGxldCB1LCBjLCBoO1xuICAgIGlmICh0IGluc3RhbmNlb2YgcmMpIGMgPSB0Yyh0LmZpcmVzdG9yZSwgZ2MpLCBoID0gRGUodC5fa2V5LnBhdGgpLCB1ID0ge1xuICAgICAgICBuZXh0OiBuID0+IHtcbiAgICAgICAgICAgIGVbb10gJiYgZVtvXShpbChjLCB0LCBuKSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBlW28gKyAxXSxcbiAgICAgICAgY29tcGxldGU6IGVbbyArIDJdXG4gICAgfTsgZWxzZSB7XG4gICAgICAgIGNvbnN0IG4gPSB0Yyh0LCBvYyk7XG4gICAgICAgIGMgPSB0YyhuLmZpcmVzdG9yZSwgZ2MpLCBoID0gbi5fcXVlcnk7XG4gICAgICAgIGNvbnN0IHMgPSBuZXcgUWgoYyk7XG4gICAgICAgIHUgPSB7XG4gICAgICAgICAgICBuZXh0OiB0ID0+IHtcbiAgICAgICAgICAgICAgICBlW29dICYmIGVbb10obmV3IG1oKGMsIHMsIG4sIHQpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogZVtvICsgMV0sXG4gICAgICAgICAgICBjb21wbGV0ZTogZVtvICsgMl1cbiAgICAgICAgfSwgcGgodC5fcXVlcnkpO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24odCwgZSwgbiwgcykge1xuICAgICAgICBjb25zdCBpID0gbmV3IFJ1KHMpLCByID0gbmV3IERhKGUsIGksIG4pO1xuICAgICAgICByZXR1cm4gdC5hc3luY1F1ZXVlLmVucXVldWVBbmRGb3JnZXQoKGFzeW5jICgpID0+IGJhKGF3YWl0ICR1KHQpLCByKSkpLCAoKSA9PiB7XG4gICAgICAgICAgICBpLm11KCksIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0KChhc3luYyAoKSA9PiBQYShhd2FpdCAkdSh0KSwgcikpKTtcbiAgICAgICAgfTtcbiAgICB9KEljKGMpLCBoLCBhLCB1KTtcbn1cblxuZnVuY3Rpb24gbmwodCwgZSkge1xuICAgIHJldHVybiBHdShJYyh0ID0gdGModCwgZ2MpKSwgX2MoZSkgPyBlIDoge1xuICAgICAgICBuZXh0OiBlXG4gICAgfSk7XG59XG5cbi8qKlxuICogTG9jYWxseSB3cml0ZXMgYG11dGF0aW9uc2Agb24gdGhlIGFzeW5jIHF1ZXVlLlxuICogQGludGVybmFsXG4gKi8gZnVuY3Rpb24gc2wodCwgZSkge1xuICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBuZXcgajtcbiAgICAgICAgcmV0dXJuIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0KChhc3luYyAoKSA9PiBHYShhd2FpdCBPdSh0KSwgZSwgbikpKSwgbi5wcm9taXNlO1xuICAgIH0oSWModCksIGUpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEge0BsaW5rIFZpZXdTbmFwc2hvdH0gdGhhdCBjb250YWlucyB0aGUgc2luZ2xlIGRvY3VtZW50IHNwZWNpZmllZCBieSBgcmVmYFxuICogdG8gYSB7QGxpbmsgRG9jdW1lbnRTbmFwc2hvdH0uXG4gKi8gZnVuY3Rpb24gaWwodCwgZSwgbikge1xuICAgIGNvbnN0IHMgPSBuLmRvY3MuZ2V0KGUuX2tleSksIGkgPSBuZXcgUWgodCk7XG4gICAgcmV0dXJuIG5ldyBfaCh0LCBpLCBlLl9rZXksIHMsIG5ldyBkaChuLmhhc1BlbmRpbmdXcml0ZXMsIG4uZnJvbUNhY2hlKSwgZS5jb252ZXJ0ZXIpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIHJlZmVyZW5jZSB0byBhIHRyYW5zYWN0aW9uLlxuICpcbiAqIFRoZSBgVHJhbnNhY3Rpb25gIG9iamVjdCBwYXNzZWQgdG8gYSB0cmFuc2FjdGlvbidzIGB1cGRhdGVGdW5jdGlvbmAgcHJvdmlkZXNcbiAqIHRoZSBtZXRob2RzIHRvIHJlYWQgYW5kIHdyaXRlIGRhdGEgd2l0aGluIHRoZSB0cmFuc2FjdGlvbiBjb250ZXh0LiBTZWVcbiAqIHtAbGluayBydW5UcmFuc2FjdGlvbn0uXG4gKi8gY2xhc3MgcmwgZXh0ZW5kcyBjbGFzcyB7XG4gICAgLyoqIEBoaWRlY29uc3RydWN0b3IgKi9cbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMuX2ZpcmVzdG9yZSA9IHQsIHRoaXMuX3RyYW5zYWN0aW9uID0gZSwgdGhpcy5fZGF0YVJlYWRlciA9IEdjKHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgcHJvdmlkZWQge0BsaW5rIERvY3VtZW50UmVmZXJlbmNlfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkb2N1bWVudFJlZiAtIEEgcmVmZXJlbmNlIHRvIHRoZSBkb2N1bWVudCB0byBiZSByZWFkLlxuICAgICAqIEByZXR1cm5zIEEgYERvY3VtZW50U25hcHNob3RgIHdpdGggdGhlIHJlYWQgZGF0YS5cbiAgICAgKi8gICAgZ2V0KHQpIHtcbiAgICAgICAgY29uc3QgZSA9IEtoKHQsIHRoaXMuX2ZpcmVzdG9yZSksIG4gPSBuZXcgcWgodGhpcy5fZmlyZXN0b3JlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uLmxvb2t1cChbIGUuX2tleSBdKS50aGVuKCh0ID0+IHtcbiAgICAgICAgICAgIGlmICghdCB8fCAxICE9PSB0Lmxlbmd0aCkgcmV0dXJuIEwoKTtcbiAgICAgICAgICAgIGNvbnN0IHMgPSB0WzBdO1xuICAgICAgICAgICAgaWYgKHMuaXNGb3VuZERvY3VtZW50KCkpIHJldHVybiBuZXcgaGgodGhpcy5fZmlyZXN0b3JlLCBuLCBzLmtleSwgcywgZS5jb252ZXJ0ZXIpO1xuICAgICAgICAgICAgaWYgKHMuaXNOb0RvY3VtZW50KCkpIHJldHVybiBuZXcgaGgodGhpcy5fZmlyZXN0b3JlLCBuLCBlLl9rZXksIG51bGwsIGUuY29udmVydGVyKTtcbiAgICAgICAgICAgIHRocm93IEwoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBzZXQodCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gS2godCwgdGhpcy5fZmlyZXN0b3JlKSwgaSA9IExoKHMuY29udmVydGVyLCBlLCBuKSwgciA9IFFjKHRoaXMuX2RhdGFSZWFkZXIsIFwiVHJhbnNhY3Rpb24uc2V0XCIsIHMuX2tleSwgaSwgbnVsbCAhPT0gcy5jb252ZXJ0ZXIsIG4pO1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb24uc2V0KHMuX2tleSwgciksIHRoaXM7XG4gICAgfVxuICAgIHVwZGF0ZSh0LCBlLCBuLCAuLi5zKSB7XG4gICAgICAgIGNvbnN0IGkgPSBLaCh0LCB0aGlzLl9maXJlc3RvcmUpO1xuICAgICAgICAvLyBGb3IgQ29tcGF0IHR5cGVzLCB3ZSBoYXZlIHRvIFwiZXh0cmFjdFwiIHRoZSB1bmRlcmx5aW5nIHR5cGVzIGJlZm9yZVxuICAgICAgICAvLyBwZXJmb3JtaW5nIHZhbGlkYXRpb24uXG4gICAgICAgICAgICAgICAgbGV0IHI7XG4gICAgICAgIHJldHVybiByID0gXCJzdHJpbmdcIiA9PSB0eXBlb2YgKGUgPSBnZXRNb2R1bGFySW5zdGFuY2UoZSkpIHx8IGUgaW5zdGFuY2VvZiBOYyA/IFpjKHRoaXMuX2RhdGFSZWFkZXIsIFwiVHJhbnNhY3Rpb24udXBkYXRlXCIsIGkuX2tleSwgZSwgbiwgcykgOiBYYyh0aGlzLl9kYXRhUmVhZGVyLCBcIlRyYW5zYWN0aW9uLnVwZGF0ZVwiLCBpLl9rZXksIGUpLCBcbiAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb24udXBkYXRlKGkuX2tleSwgciksIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlbGV0ZXMgdGhlIGRvY3VtZW50IHJlZmVycmVkIHRvIGJ5IHRoZSBwcm92aWRlZCB7QGxpbmsgRG9jdW1lbnRSZWZlcmVuY2V9LlxuICAgICAqXG4gICAgICogQHBhcmFtIGRvY3VtZW50UmVmIC0gQSByZWZlcmVuY2UgdG8gdGhlIGRvY3VtZW50IHRvIGJlIGRlbGV0ZWQuXG4gICAgICogQHJldHVybnMgVGhpcyBgVHJhbnNhY3Rpb25gIGluc3RhbmNlLiBVc2VkIGZvciBjaGFpbmluZyBtZXRob2QgY2FsbHMuXG4gICAgICovICAgIGRlbGV0ZSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBLaCh0LCB0aGlzLl9maXJlc3RvcmUpO1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb24uZGVsZXRlKGUuX2tleSksIHRoaXM7XG4gICAgfVxufSB7XG4gICAgLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBzYW1lIGxvZ2ljIGFzIHRoZSBUcmFuc2FjdGlvbiBBUEkgaW4gdGhlIExpdGUgU0RLXG4gICAgLy8gYnV0IGlzIHN1YmNsYXNzZWQgaW4gb3JkZXIgdG8gcmV0dXJuIGl0cyBvd24gRG9jdW1lbnRTbmFwc2hvdCB0eXBlcy5cbiAgICAvKiogQGhpZGVjb25zdHJ1Y3RvciAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgc3VwZXIodCwgZSksIHRoaXMuX2ZpcmVzdG9yZSA9IHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIHRoZSBkb2N1bWVudCByZWZlcmVuY2VkIGJ5IHRoZSBwcm92aWRlZCB7QGxpbmsgRG9jdW1lbnRSZWZlcmVuY2V9LlxuICAgICAqXG4gICAgICogQHBhcmFtIGRvY3VtZW50UmVmIC0gQSByZWZlcmVuY2UgdG8gdGhlIGRvY3VtZW50IHRvIGJlIHJlYWQuXG4gICAgICogQHJldHVybnMgQSBgRG9jdW1lbnRTbmFwc2hvdGAgd2l0aCB0aGUgcmVhZCBkYXRhLlxuICAgICAqLyAgICBnZXQodCkge1xuICAgICAgICBjb25zdCBlID0gS2godCwgdGhpcy5fZmlyZXN0b3JlKSwgbiA9IG5ldyBRaCh0aGlzLl9maXJlc3RvcmUpO1xuICAgICAgICByZXR1cm4gc3VwZXIuZ2V0KHQpLnRoZW4oKHQgPT4gbmV3IF9oKHRoaXMuX2ZpcmVzdG9yZSwgbiwgZS5fa2V5LCB0Ll9kb2N1bWVudCwgbmV3IGRoKFxuICAgICAgICAvKiBoYXNQZW5kaW5nV3JpdGVzPSAqLyAhMSwgXG4gICAgICAgIC8qIGZyb21DYWNoZT0gKi8gITEpLCBlLmNvbnZlcnRlcikpKTtcbiAgICB9XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgdGhlIGdpdmVuIGB1cGRhdGVGdW5jdGlvbmAgYW5kIHRoZW4gYXR0ZW1wdHMgdG8gY29tbWl0IHRoZSBjaGFuZ2VzXG4gKiBhcHBsaWVkIHdpdGhpbiB0aGUgdHJhbnNhY3Rpb24uIElmIGFueSBkb2N1bWVudCByZWFkIHdpdGhpbiB0aGUgdHJhbnNhY3Rpb25cbiAqIGhhcyBjaGFuZ2VkLCBDbG91ZCBGaXJlc3RvcmUgcmV0cmllcyB0aGUgYHVwZGF0ZUZ1bmN0aW9uYC4gSWYgaXQgZmFpbHMgdG9cbiAqIGNvbW1pdCBhZnRlciA1IGF0dGVtcHRzLCB0aGUgdHJhbnNhY3Rpb24gZmFpbHMuXG4gKlxuICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHdyaXRlcyBhbGxvd2VkIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uIGlzIDUwMC5cbiAqXG4gKiBAcGFyYW0gZmlyZXN0b3JlIC0gQSByZWZlcmVuY2UgdG8gdGhlIEZpcmVzdG9yZSBkYXRhYmFzZSB0byBydW4gdGhpc1xuICogdHJhbnNhY3Rpb24gYWdhaW5zdC5cbiAqIEBwYXJhbSB1cGRhdGVGdW5jdGlvbiAtIFRoZSBmdW5jdGlvbiB0byBleGVjdXRlIHdpdGhpbiB0aGUgdHJhbnNhY3Rpb25cbiAqIGNvbnRleHQuXG4gKiBAcmV0dXJucyBJZiB0aGUgdHJhbnNhY3Rpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBvciB3YXMgZXhwbGljaXRseSBhYm9ydGVkXG4gKiAodGhlIGB1cGRhdGVGdW5jdGlvbmAgcmV0dXJuZWQgYSBmYWlsZWQgcHJvbWlzZSksIHRoZSBwcm9taXNlIHJldHVybmVkIGJ5IHRoZVxuICogYHVwZGF0ZUZ1bmN0aW9uIGBpcyByZXR1cm5lZCBoZXJlLiBPdGhlcndpc2UsIGlmIHRoZSB0cmFuc2FjdGlvbiBmYWlsZWQsIGFcbiAqIHJlamVjdGVkIHByb21pc2Ugd2l0aCB0aGUgY29ycmVzcG9uZGluZyBmYWlsdXJlIGVycm9yIGlzIHJldHVybmVkLlxuICovIGZ1bmN0aW9uIG9sKHQsIGUpIHtcbiAgICByZXR1cm4gUXUoSWModCA9IHRjKHQsIGdjKSksIChuID0+IGUobmV3IHJsKHQsIG4pKSkpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBSZXR1cm5zIGEgc2VudGluZWwgZm9yIHVzZSB3aXRoIHtAbGluayBAZmlyZWJhc2UvZmlyZXN0b3JlL2xpdGUjKHVwZGF0ZURvYzoxKX0gb3JcbiAqIHtAbGluayBAZmlyZWJhc2UvZmlyZXN0b3JlL2xpdGUjKHNldERvYzoxKX0gd2l0aCBge21lcmdlOiB0cnVlfWAgdG8gbWFyayBhIGZpZWxkIGZvciBkZWxldGlvbi5cbiAqLyBmdW5jdGlvbiBhbCgpIHtcbiAgICByZXR1cm4gbmV3IGpjKFwiZGVsZXRlRmllbGRcIik7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHNlbnRpbmVsIHVzZWQgd2l0aCB7QGxpbmsgQGZpcmViYXNlL2ZpcmVzdG9yZS9saXRlIyhzZXREb2M6MSl9IG9yIHtAbGluayBAZmlyZWJhc2UvZmlyZXN0b3JlL2xpdGUjKHVwZGF0ZURvYzoxKX0gdG9cbiAqIGluY2x1ZGUgYSBzZXJ2ZXItZ2VuZXJhdGVkIHRpbWVzdGFtcCBpbiB0aGUgd3JpdHRlbiBkYXRhLlxuICovIGZ1bmN0aW9uIHVsKCkge1xuICAgIHJldHVybiBuZXcgemMoXCJzZXJ2ZXJUaW1lc3RhbXBcIik7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHNwZWNpYWwgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIHtAbGluayBAZmlyZWJhc2UvZmlyZXN0b3JlL2xpdGUjKHNldERvYzoxKX0gb3Ige0BsaW5rXG4gKiBAZmlyZWJhc2UvZmlyZXN0b3JlL2xpdGUjKHVwZGF0ZURvYzoxKX0gdGhhdCB0ZWxscyB0aGUgc2VydmVyIHRvIHVuaW9uIHRoZSBnaXZlbiBlbGVtZW50cyB3aXRoIGFueSBhcnJheVxuICogdmFsdWUgdGhhdCBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgc2VydmVyLiBFYWNoIHNwZWNpZmllZCBlbGVtZW50IHRoYXQgZG9lc24ndFxuICogYWxyZWFkeSBleGlzdCBpbiB0aGUgYXJyYXkgd2lsbCBiZSBhZGRlZCB0byB0aGUgZW5kLiBJZiB0aGUgZmllbGQgYmVpbmdcbiAqIG1vZGlmaWVkIGlzIG5vdCBhbHJlYWR5IGFuIGFycmF5IGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2l0aCBhbiBhcnJheVxuICogY29udGFpbmluZyBleGFjdGx5IHRoZSBzcGVjaWZpZWQgZWxlbWVudHMuXG4gKlxuICogQHBhcmFtIGVsZW1lbnRzIC0gVGhlIGVsZW1lbnRzIHRvIHVuaW9uIGludG8gdGhlIGFycmF5LlxuICogQHJldHVybnMgVGhlIGBGaWVsZFZhbHVlYCBzZW50aW5lbCBmb3IgdXNlIGluIGEgY2FsbCB0byBgc2V0RG9jKClgIG9yXG4gKiBgdXBkYXRlRG9jKClgLlxuICovIGZ1bmN0aW9uIGNsKC4uLnQpIHtcbiAgICAvLyBOT1RFOiBXZSBkb24ndCBhY3R1YWxseSBwYXJzZSB0aGUgZGF0YSB1bnRpbCBpdCdzIHVzZWQgaW4gc2V0KCkgb3JcbiAgICAvLyB1cGRhdGUoKSBzaW5jZSB3ZSdkIG5lZWQgdGhlIEZpcmVzdG9yZSBpbnN0YW5jZSB0byBkbyB0aGlzLlxuICAgIHJldHVybiBuZXcgSGMoXCJhcnJheVVuaW9uXCIsIHQpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBzcGVjaWFsIHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCB7QGxpbmsgKHNldERvYzoxKX0gb3Ige0BsaW5rXG4gKiB1cGRhdGVEb2M6MX0gdGhhdCB0ZWxscyB0aGUgc2VydmVyIHRvIHJlbW92ZSB0aGUgZ2l2ZW4gZWxlbWVudHMgZnJvbSBhbnlcbiAqIGFycmF5IHZhbHVlIHRoYXQgYWxyZWFkeSBleGlzdHMgb24gdGhlIHNlcnZlci4gQWxsIGluc3RhbmNlcyBvZiBlYWNoIGVsZW1lbnRcbiAqIHNwZWNpZmllZCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgYXJyYXkuIElmIHRoZSBmaWVsZCBiZWluZyBtb2RpZmllZCBpcyBub3RcbiAqIGFscmVhZHkgYW4gYXJyYXkgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIGFuIGVtcHR5IGFycmF5LlxuICpcbiAqIEBwYXJhbSBlbGVtZW50cyAtIFRoZSBlbGVtZW50cyB0byByZW1vdmUgZnJvbSB0aGUgYXJyYXkuXG4gKiBAcmV0dXJucyBUaGUgYEZpZWxkVmFsdWVgIHNlbnRpbmVsIGZvciB1c2UgaW4gYSBjYWxsIHRvIGBzZXREb2MoKWAgb3JcbiAqIGB1cGRhdGVEb2MoKWBcbiAqLyBmdW5jdGlvbiBobCguLi50KSB7XG4gICAgLy8gTk9URTogV2UgZG9uJ3QgYWN0dWFsbHkgcGFyc2UgdGhlIGRhdGEgdW50aWwgaXQncyB1c2VkIGluIHNldCgpIG9yXG4gICAgLy8gdXBkYXRlKCkgc2luY2Ugd2UnZCBuZWVkIHRoZSBGaXJlc3RvcmUgaW5zdGFuY2UgdG8gZG8gdGhpcy5cbiAgICByZXR1cm4gbmV3IEpjKFwiYXJyYXlSZW1vdmVcIiwgdCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHNwZWNpYWwgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIHtAbGluayBAZmlyZWJhc2UvZmlyZXN0b3JlL2xpdGUjKHNldERvYzoxKX0gb3Ige0BsaW5rXG4gKiBAZmlyZWJhc2UvZmlyZXN0b3JlL2xpdGUjKHVwZGF0ZURvYzoxKX0gdGhhdCB0ZWxscyB0aGUgc2VydmVyIHRvIGluY3JlbWVudCB0aGUgZmllbGQncyBjdXJyZW50IHZhbHVlIGJ5XG4gKiB0aGUgZ2l2ZW4gdmFsdWUuXG4gKlxuICogSWYgZWl0aGVyIHRoZSBvcGVyYW5kIG9yIHRoZSBjdXJyZW50IGZpZWxkIHZhbHVlIHVzZXMgZmxvYXRpbmcgcG9pbnRcbiAqIHByZWNpc2lvbiwgYWxsIGFyaXRobWV0aWMgZm9sbG93cyBJRUVFIDc1NCBzZW1hbnRpY3MuIElmIGJvdGggdmFsdWVzIGFyZVxuICogaW50ZWdlcnMsIHZhbHVlcyBvdXRzaWRlIG9mIEphdmFTY3JpcHQncyBzYWZlIG51bWJlciByYW5nZVxuICogKGBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUmAgdG8gYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYCkgYXJlIGFsc28gc3ViamVjdCB0b1xuICogcHJlY2lzaW9uIGxvc3MuIEZ1cnRoZXJtb3JlLCBvbmNlIHByb2Nlc3NlZCBieSB0aGUgRmlyZXN0b3JlIGJhY2tlbmQsIGFsbFxuICogaW50ZWdlciBvcGVyYXRpb25zIGFyZSBjYXBwZWQgYmV0d2VlbiAtMl42MyBhbmQgMl42My0xLlxuICpcbiAqIElmIHRoZSBjdXJyZW50IGZpZWxkIHZhbHVlIGlzIG5vdCBvZiB0eXBlIGBudW1iZXJgLCBvciBpZiB0aGUgZmllbGQgZG9lcyBub3RcbiAqIHlldCBleGlzdCwgdGhlIHRyYW5zZm9ybWF0aW9uIHNldHMgdGhlIGZpZWxkIHRvIHRoZSBnaXZlbiB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gbiAtIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgYnkuXG4gKiBAcmV0dXJucyBUaGUgYEZpZWxkVmFsdWVgIHNlbnRpbmVsIGZvciB1c2UgaW4gYSBjYWxsIHRvIGBzZXREb2MoKWAgb3JcbiAqIGB1cGRhdGVEb2MoKWBcbiAqLyBmdW5jdGlvbiBsbCh0KSB7XG4gICAgcmV0dXJuIG5ldyBZYyhcImluY3JlbWVudFwiLCB0KTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQ3JlYXRlcyBhIHdyaXRlIGJhdGNoLCB1c2VkIGZvciBwZXJmb3JtaW5nIG11bHRpcGxlIHdyaXRlcyBhcyBhIHNpbmdsZVxuICogYXRvbWljIG9wZXJhdGlvbi4gVGhlIG1heGltdW0gbnVtYmVyIG9mIHdyaXRlcyBhbGxvd2VkIGluIGEgc2luZ2xlIHtAbGluayBXcml0ZUJhdGNofVxuICogaXMgNTAwLlxuICpcbiAqIFVubGlrZSB0cmFuc2FjdGlvbnMsIHdyaXRlIGJhdGNoZXMgYXJlIHBlcnNpc3RlZCBvZmZsaW5lIGFuZCB0aGVyZWZvcmUgYXJlXG4gKiBwcmVmZXJhYmxlIHdoZW4geW91IGRvbid0IG5lZWQgdG8gY29uZGl0aW9uIHlvdXIgd3JpdGVzIG9uIHJlYWQgZGF0YS5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBXcml0ZUJhdGNofSB0aGF0IGNhbiBiZSB1c2VkIHRvIGF0b21pY2FsbHkgZXhlY3V0ZSBtdWx0aXBsZVxuICogd3JpdGVzLlxuICovIGZ1bmN0aW9uIGZsKHQpIHtcbiAgICByZXR1cm4gSWModCA9IHRjKHQsIGdjKSksIG5ldyBVaCh0LCAoZSA9PiBzbCh0LCBlKSkpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBmdW5jdGlvbiBkbCh0LCBlKSB7XG4gICAgSWModCA9IHRjKHQsIGdjKSk7XG4gICAgY29uc3QgbiA9IFwic3RyaW5nXCIgPT0gdHlwZW9mIGUgPyBmdW5jdGlvbih0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0KTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFEoRy5JTlZBTElEX0FSR1VNRU5ULCBcIkZhaWxlZCB0byBwYXJzZSBKU09OOlwiICsgdC5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH0oZSkgOiBlLCBzID0gW107XG4gICAgLy8gUE9SVElORyBOT1RFOiBXZSBkb24ndCByZXR1cm4gYW4gZXJyb3IgaWYgdGhlIHVzZXIgaGFzIG5vdCBlbmFibGVkXG4gICAgLy8gcGVyc2lzdGVuY2Ugc2luY2UgYGVuYWJsZUluZGV4ZWRkYlBlcnNpc3RlbmNlKClgIGNhbiBmYWlsIG9uIHRoZSBXZWIuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobi5pbmRleGVzKSkgZm9yIChjb25zdCB0IG9mIG4uaW5kZXhlcykge1xuICAgICAgICBjb25zdCBlID0gX2wodCwgXCJjb2xsZWN0aW9uR3JvdXBcIiksIG4gPSBbXTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodC5maWVsZHMpKSBmb3IgKGNvbnN0IGUgb2YgdC5maWVsZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBhaChcInNldEluZGV4Q29uZmlndXJhdGlvblwiLCBfbChlLCBcImZpZWxkUGF0aFwiKSk7XG4gICAgICAgICAgICBcIkNPTlRBSU5TXCIgPT09IGUuYXJyYXlDb25maWcgPyBuLnB1c2gobmV3IGllKHQsIDIgLyogQ09OVEFJTlMgKi8pKSA6IFwiQVNDRU5ESU5HXCIgPT09IGUub3JkZXIgPyBuLnB1c2gobmV3IGllKHQsIDAgLyogQVNDRU5ESU5HICovKSkgOiBcIkRFU0NFTkRJTkdcIiA9PT0gZS5vcmRlciAmJiBuLnB1c2gobmV3IGllKHQsIDEgLyogREVTQ0VORElORyAqLykpO1xuICAgICAgICB9XG4gICAgICAgIHMucHVzaChuZXcgZWUoZWUuVU5LTk9XTl9JRCwgZSwgbiwgcmUuZW1wdHkoKSkpO1xuICAgIH1cbiAgICAvLyBUT0RPKGluZGV4aW5nKTogQ29uZmlndXJlIGluZGV4ZXNcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufVxuXG5mdW5jdGlvbiBfbCh0LCBlKSB7XG4gICAgaWYgKFwic3RyaW5nXCIgIT0gdHlwZW9mIHRbZV0pIHRocm93IG5ldyBRKEcuSU5WQUxJRF9BUkdVTUVOVCwgXCJNaXNzaW5nIHN0cmluZyB2YWx1ZSBmb3I6IFwiICsgZSk7XG4gICAgcmV0dXJuIHRbZV07XG59XG5cbi8qKlxuICogQ2xvdWQgRmlyZXN0b3JlXG4gKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKi8gIWZ1bmN0aW9uKHQsIGUgPSAhMCkge1xuICAgICFmdW5jdGlvbih0KSB7XG4gICAgICAgIHggPSB0O1xuICAgIH0oU0RLX1ZFUlNJT04pLCBfcmVnaXN0ZXJDb21wb25lbnQobmV3IENvbXBvbmVudChcImZpcmVzdG9yZVwiLCAoKHQsIHtvcHRpb25zOiBufSkgPT4ge1xuICAgICAgICBjb25zdCBzID0gdC5nZXRQcm92aWRlcihcImFwcFwiKS5nZXRJbW1lZGlhdGUoKSwgaSA9IG5ldyBnYyhzLCBuZXcgSih0LmdldFByb3ZpZGVyKFwiYXV0aC1pbnRlcm5hbFwiKSksIG5ldyB0dCh0LmdldFByb3ZpZGVyKFwiYXBwLWNoZWNrLWludGVybmFsXCIpKSk7XG4gICAgICAgIHJldHVybiBuID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICB1c2VGZXRjaFN0cmVhbXM6IGVcbiAgICAgICAgfSwgbiksIGkuX3NldFNldHRpbmdzKG4pLCBpO1xuICAgIH0pLCBcIlBVQkxJQ1wiKSksIHJlZ2lzdGVyVmVyc2lvbihELCBcIjMuNC42XCIsIHQpLCBcbiAgICAvLyBCVUlMRF9UQVJHRVQgd2lsbCBiZSByZXBsYWNlZCBieSB2YWx1ZXMgbGlrZSBlc201LCBlc20yMDE3LCBjanM1LCBldGMgZHVyaW5nIHRoZSBjb21waWxhdGlvblxuICAgIHJlZ2lzdGVyVmVyc2lvbihELCBcIjMuNC42XCIsIFwiZXNtMjAxN1wiKTtcbn0oKTtcblxuZXhwb3J0IHsgQmggYXMgQWJzdHJhY3RVc2VyRGF0YVdyaXRlciwgTWMgYXMgQnl0ZXMsIG1jIGFzIENBQ0hFX1NJWkVfVU5MSU1JVEVELCBhYyBhcyBDb2xsZWN0aW9uUmVmZXJlbmNlLCByYyBhcyBEb2N1bWVudFJlZmVyZW5jZSwgX2ggYXMgRG9jdW1lbnRTbmFwc2hvdCwgTmMgYXMgRmllbGRQYXRoLCBPYyBhcyBGaWVsZFZhbHVlLCBnYyBhcyBGaXJlc3RvcmUsIFEgYXMgRmlyZXN0b3JlRXJyb3IsICRjIGFzIEdlb1BvaW50LCB3YyBhcyBMb2FkQnVuZGxlVGFzaywgb2MgYXMgUXVlcnksIEloIGFzIFF1ZXJ5Q29uc3RyYWludCwgd2ggYXMgUXVlcnlEb2N1bWVudFNuYXBzaG90LCBtaCBhcyBRdWVyeVNuYXBzaG90LCBkaCBhcyBTbmFwc2hvdE1ldGFkYXRhLCB1dCBhcyBUaW1lc3RhbXAsIHJsIGFzIFRyYW5zYWN0aW9uLCBVaCBhcyBXcml0ZUJhdGNoLCB2dCBhcyBfRGF0YWJhc2VJZCwgeHQgYXMgX0RvY3VtZW50S2V5LCBldCBhcyBfRW1wdHlBcHBDaGVja1Rva2VuUHJvdmlkZXIsIHogYXMgX0VtcHR5QXV0aENyZWRlbnRpYWxzUHJvdmlkZXIsIG10IGFzIF9GaWVsZFBhdGgsIHRjIGFzIF9jYXN0LCBVIGFzIF9kZWJ1Z0Fzc2VydCwgeXQgYXMgX2lzQmFzZTY0QXZhaWxhYmxlLCBGIGFzIF9sb2dXYXJuLCBkbCBhcyBfc2V0SW5kZXhDb25maWd1cmF0aW9uLCBKdSBhcyBfdmFsaWRhdGVJc05vdFVzZWRUb2dldGhlciwgdGwgYXMgYWRkRG9jLCBobCBhcyBhcnJheVJlbW92ZSwgY2wgYXMgYXJyYXlVbmlvbiwgYmMgYXMgY2xlYXJJbmRleGVkRGJQZXJzaXN0ZW5jZSwgdWMgYXMgY29sbGVjdGlvbiwgY2MgYXMgY29sbGVjdGlvbkdyb3VwLCBpYyBhcyBjb25uZWN0RmlyZXN0b3JlRW11bGF0b3IsIFpoIGFzIGRlbGV0ZURvYywgYWwgYXMgZGVsZXRlRmllbGQsIHZjIGFzIGRpc2FibGVOZXR3b3JrLCBoYyBhcyBkb2MsIGtjIGFzIGRvY3VtZW50SWQsIEVjIGFzIGVuYWJsZUluZGV4ZWREYlBlcnNpc3RlbmNlLCBBYyBhcyBlbmFibGVNdWx0aVRhYkluZGV4ZWREYlBlcnNpc3RlbmNlLCBWYyBhcyBlbmFibGVOZXR3b3JrLCBraCBhcyBlbmRBdCwgTmggYXMgZW5kQmVmb3JlLCBJYyBhcyBlbnN1cmVGaXJlc3RvcmVDb25maWd1cmVkLCBzbCBhcyBleGVjdXRlV3JpdGUsIEdoIGFzIGdldERvYywgamggYXMgZ2V0RG9jRnJvbUNhY2hlLCBXaCBhcyBnZXREb2NGcm9tU2VydmVyLCB6aCBhcyBnZXREb2NzLCBIaCBhcyBnZXREb2NzRnJvbUNhY2hlLCBKaCBhcyBnZXREb2NzRnJvbVNlcnZlciwgcGMgYXMgZ2V0RmlyZXN0b3JlLCBsbCBhcyBpbmNyZW1lbnQsIHljIGFzIGluaXRpYWxpemVGaXJlc3RvcmUsIFZoIGFzIGxpbWl0LCB2aCBhcyBsaW1pdFRvTGFzdCwgRGMgYXMgbG9hZEJ1bmRsZSwgQ2MgYXMgbmFtZWRRdWVyeSwgZWwgYXMgb25TbmFwc2hvdCwgbmwgYXMgb25TbmFwc2hvdHNJblN5bmMsIGJoIGFzIG9yZGVyQnksIFRoIGFzIHF1ZXJ5LCBmYyBhcyBxdWVyeUVxdWFsLCBsYyBhcyByZWZFcXVhbCwgb2wgYXMgcnVuVHJhbnNhY3Rpb24sIHVsIGFzIHNlcnZlclRpbWVzdGFtcCwgWWggYXMgc2V0RG9jLCBNIGFzIHNldExvZ0xldmVsLCB5aCBhcyBzbmFwc2hvdEVxdWFsLCBDaCBhcyBzdGFydEFmdGVyLCBEaCBhcyBzdGFydEF0LCBTYyBhcyB0ZXJtaW5hdGUsIFhoIGFzIHVwZGF0ZURvYywgUGMgYXMgd2FpdEZvclBlbmRpbmdXcml0ZXMsIEFoIGFzIHdoZXJlLCBmbCBhcyB3cml0ZUJhdGNoIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5lc20yMDE3LmpzLm1hcFxuIiwiLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIEBmaWxlb3ZlcnZpZXcgRmlyZWJhc2UgY29uc3RhbnRzLiAgU29tZSBvZiB0aGVzZSAoQGRlZmluZXMpIGNhbiBiZSBvdmVycmlkZGVuIGF0IGNvbXBpbGUtdGltZS5cclxuICovXHJcbmNvbnN0IENPTlNUQU5UUyA9IHtcclxuICAgIC8qKlxyXG4gICAgICogQGRlZmluZSB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIGlzIHRoZSBjbGllbnQgTm9kZS5qcyBTREsuXHJcbiAgICAgKi9cclxuICAgIE5PREVfQ0xJRU5UOiBmYWxzZSxcclxuICAgIC8qKlxyXG4gICAgICogQGRlZmluZSB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIGlzIHRoZSBBZG1pbiBOb2RlLmpzIFNESy5cclxuICAgICAqL1xyXG4gICAgTk9ERV9BRE1JTjogZmFsc2UsXHJcbiAgICAvKipcclxuICAgICAqIEZpcmViYXNlIFNESyBWZXJzaW9uXHJcbiAgICAgKi9cclxuICAgIFNES19WRVJTSU9OOiAnJHtKU0NPUkVfVkVSU0lPTn0nXHJcbn07XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHByb3ZpZGVkIGFzc2VydGlvbiBpcyBmYWxzeVxyXG4gKi9cclxuY29uc3QgYXNzZXJ0ID0gZnVuY3Rpb24gKGFzc2VydGlvbiwgbWVzc2FnZSkge1xyXG4gICAgaWYgKCFhc3NlcnRpb24pIHtcclxuICAgICAgICB0aHJvdyBhc3NlcnRpb25FcnJvcihtZXNzYWdlKTtcclxuICAgIH1cclxufTtcclxuLyoqXHJcbiAqIFJldHVybnMgYW4gRXJyb3Igb2JqZWN0IHN1aXRhYmxlIGZvciB0aHJvd2luZy5cclxuICovXHJcbmNvbnN0IGFzc2VydGlvbkVycm9yID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcclxuICAgIHJldHVybiBuZXcgRXJyb3IoJ0ZpcmViYXNlIERhdGFiYXNlICgnICtcclxuICAgICAgICBDT05TVEFOVFMuU0RLX1ZFUlNJT04gK1xyXG4gICAgICAgICcpIElOVEVSTkFMIEFTU0VSVCBGQUlMRUQ6ICcgK1xyXG4gICAgICAgIG1lc3NhZ2UpO1xyXG59O1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBzdHJpbmdUb0J5dGVBcnJheSQxID0gZnVuY3Rpb24gKHN0cikge1xyXG4gICAgLy8gVE9ETyh1c2VyKTogVXNlIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbnMgaWYvd2hlbiBhdmFpbGFibGVcclxuICAgIGNvbnN0IG91dCA9IFtdO1xyXG4gICAgbGV0IHAgPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgYyA9IHN0ci5jaGFyQ29kZUF0KGkpO1xyXG4gICAgICAgIGlmIChjIDwgMTI4KSB7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gYztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYyA8IDIwNDgpIHtcclxuICAgICAgICAgICAgb3V0W3ArK10gPSAoYyA+PiA2KSB8IDE5MjtcclxuICAgICAgICAgICAgb3V0W3ArK10gPSAoYyAmIDYzKSB8IDEyODtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoKGMgJiAweGZjMDApID09PSAweGQ4MDAgJiZcclxuICAgICAgICAgICAgaSArIDEgPCBzdHIubGVuZ3RoICYmXHJcbiAgICAgICAgICAgIChzdHIuY2hhckNvZGVBdChpICsgMSkgJiAweGZjMDApID09PSAweGRjMDApIHtcclxuICAgICAgICAgICAgLy8gU3Vycm9nYXRlIFBhaXJcclxuICAgICAgICAgICAgYyA9IDB4MTAwMDAgKyAoKGMgJiAweDAzZmYpIDw8IDEwKSArIChzdHIuY2hhckNvZGVBdCgrK2kpICYgMHgwM2ZmKTtcclxuICAgICAgICAgICAgb3V0W3ArK10gPSAoYyA+PiAxOCkgfCAyNDA7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gKChjID4+IDEyKSAmIDYzKSB8IDEyODtcclxuICAgICAgICAgICAgb3V0W3ArK10gPSAoKGMgPj4gNikgJiA2MykgfCAxMjg7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gKGMgJiA2MykgfCAxMjg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvdXRbcCsrXSA9IChjID4+IDEyKSB8IDIyNDtcclxuICAgICAgICAgICAgb3V0W3ArK10gPSAoKGMgPj4gNikgJiA2MykgfCAxMjg7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gKGMgJiA2MykgfCAxMjg7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG91dDtcclxufTtcclxuLyoqXHJcbiAqIFR1cm5zIGFuIGFycmF5IG9mIG51bWJlcnMgaW50byB0aGUgc3RyaW5nIGdpdmVuIGJ5IHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZVxyXG4gKiBjaGFyYWN0ZXJzIHRvIHdoaWNoIHRoZSBudW1iZXJzIGNvcnJlc3BvbmQuXHJcbiAqIEBwYXJhbSBieXRlcyBBcnJheSBvZiBudW1iZXJzIHJlcHJlc2VudGluZyBjaGFyYWN0ZXJzLlxyXG4gKiBAcmV0dXJuIFN0cmluZ2lmaWNhdGlvbiBvZiB0aGUgYXJyYXkuXHJcbiAqL1xyXG5jb25zdCBieXRlQXJyYXlUb1N0cmluZyA9IGZ1bmN0aW9uIChieXRlcykge1xyXG4gICAgLy8gVE9ETyh1c2VyKTogVXNlIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbnMgaWYvd2hlbiBhdmFpbGFibGVcclxuICAgIGNvbnN0IG91dCA9IFtdO1xyXG4gICAgbGV0IHBvcyA9IDAsIGMgPSAwO1xyXG4gICAgd2hpbGUgKHBvcyA8IGJ5dGVzLmxlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IGMxID0gYnl0ZXNbcG9zKytdO1xyXG4gICAgICAgIGlmIChjMSA8IDEyOCkge1xyXG4gICAgICAgICAgICBvdXRbYysrXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoYzEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjMSA+IDE5MSAmJiBjMSA8IDIyNCkge1xyXG4gICAgICAgICAgICBjb25zdCBjMiA9IGJ5dGVzW3BvcysrXTtcclxuICAgICAgICAgICAgb3V0W2MrK10gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCgoYzEgJiAzMSkgPDwgNikgfCAoYzIgJiA2MykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjMSA+IDIzOSAmJiBjMSA8IDM2NSkge1xyXG4gICAgICAgICAgICAvLyBTdXJyb2dhdGUgUGFpclxyXG4gICAgICAgICAgICBjb25zdCBjMiA9IGJ5dGVzW3BvcysrXTtcclxuICAgICAgICAgICAgY29uc3QgYzMgPSBieXRlc1twb3MrK107XHJcbiAgICAgICAgICAgIGNvbnN0IGM0ID0gYnl0ZXNbcG9zKytdO1xyXG4gICAgICAgICAgICBjb25zdCB1ID0gKCgoYzEgJiA3KSA8PCAxOCkgfCAoKGMyICYgNjMpIDw8IDEyKSB8ICgoYzMgJiA2MykgPDwgNikgfCAoYzQgJiA2MykpIC1cclxuICAgICAgICAgICAgICAgIDB4MTAwMDA7XHJcbiAgICAgICAgICAgIG91dFtjKytdID0gU3RyaW5nLmZyb21DaGFyQ29kZSgweGQ4MDAgKyAodSA+PiAxMCkpO1xyXG4gICAgICAgICAgICBvdXRbYysrXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhkYzAwICsgKHUgJiAxMDIzKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBjMiA9IGJ5dGVzW3BvcysrXTtcclxuICAgICAgICAgICAgY29uc3QgYzMgPSBieXRlc1twb3MrK107XHJcbiAgICAgICAgICAgIG91dFtjKytdID0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMxICYgMTUpIDw8IDEyKSB8ICgoYzIgJiA2MykgPDwgNikgfCAoYzMgJiA2MykpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBvdXQuam9pbignJyk7XHJcbn07XHJcbi8vIFdlIGRlZmluZSBpdCBhcyBhbiBvYmplY3QgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgY2xhc3MgYmVjYXVzZSBhIGNsYXNzIGNvbXBpbGVkIGRvd24gdG8gZXM1IGNhbid0XHJcbi8vIGJlIHRyZWVzaGFrZWQuIGh0dHBzOi8vZ2l0aHViLmNvbS9yb2xsdXAvcm9sbHVwL2lzc3Vlcy8xNjkxXHJcbi8vIFN0YXRpYyBsb29rdXAgbWFwcywgbGF6aWx5IHBvcHVsYXRlZCBieSBpbml0XygpXHJcbmNvbnN0IGJhc2U2NCA9IHtcclxuICAgIC8qKlxyXG4gICAgICogTWFwcyBieXRlcyB0byBjaGFyYWN0ZXJzLlxyXG4gICAgICovXHJcbiAgICBieXRlVG9DaGFyTWFwXzogbnVsbCxcclxuICAgIC8qKlxyXG4gICAgICogTWFwcyBjaGFyYWN0ZXJzIHRvIGJ5dGVzLlxyXG4gICAgICovXHJcbiAgICBjaGFyVG9CeXRlTWFwXzogbnVsbCxcclxuICAgIC8qKlxyXG4gICAgICogTWFwcyBieXRlcyB0byB3ZWJzYWZlIGNoYXJhY3RlcnMuXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBieXRlVG9DaGFyTWFwV2ViU2FmZV86IG51bGwsXHJcbiAgICAvKipcclxuICAgICAqIE1hcHMgd2Vic2FmZSBjaGFyYWN0ZXJzIHRvIGJ5dGVzLlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgY2hhclRvQnl0ZU1hcFdlYlNhZmVfOiBudWxsLFxyXG4gICAgLyoqXHJcbiAgICAgKiBPdXIgZGVmYXVsdCBhbHBoYWJldCwgc2hhcmVkIGJldHdlZW5cclxuICAgICAqIEVOQ09ERURfVkFMUyBhbmQgRU5DT0RFRF9WQUxTX1dFQlNBRkVcclxuICAgICAqL1xyXG4gICAgRU5DT0RFRF9WQUxTX0JBU0U6ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgKyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICsgJzAxMjM0NTY3ODknLFxyXG4gICAgLyoqXHJcbiAgICAgKiBPdXIgZGVmYXVsdCBhbHBoYWJldC4gVmFsdWUgNjQgKD0pIGlzIHNwZWNpYWw7IGl0IG1lYW5zIFwibm90aGluZy5cIlxyXG4gICAgICovXHJcbiAgICBnZXQgRU5DT0RFRF9WQUxTKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLkVOQ09ERURfVkFMU19CQVNFICsgJysvPSc7XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiBPdXIgd2Vic2FmZSBhbHBoYWJldC5cclxuICAgICAqL1xyXG4gICAgZ2V0IEVOQ09ERURfVkFMU19XRUJTQUZFKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLkVOQ09ERURfVkFMU19CQVNFICsgJy1fLic7XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIHRoaXMgYnJvd3NlciBzdXBwb3J0cyB0aGUgYXRvYiBhbmQgYnRvYSBmdW5jdGlvbnMuIFRoaXMgZXh0ZW5zaW9uXHJcbiAgICAgKiBzdGFydGVkIGF0IE1vemlsbGEgYnV0IGlzIG5vdyBpbXBsZW1lbnRlZCBieSBtYW55IGJyb3dzZXJzLiBXZSB1c2UgdGhlXHJcbiAgICAgKiBBU1NVTUVfKiB2YXJpYWJsZXMgdG8gYXZvaWQgcHVsbGluZyBpbiB0aGUgZnVsbCB1c2VyYWdlbnQgZGV0ZWN0aW9uIGxpYnJhcnlcclxuICAgICAqIGJ1dCBzdGlsbCBhbGxvd2luZyB0aGUgc3RhbmRhcmQgcGVyLWJyb3dzZXIgY29tcGlsYXRpb25zLlxyXG4gICAgICpcclxuICAgICAqL1xyXG4gICAgSEFTX05BVElWRV9TVVBQT1JUOiB0eXBlb2YgYXRvYiA9PT0gJ2Z1bmN0aW9uJyxcclxuICAgIC8qKlxyXG4gICAgICogQmFzZTY0LWVuY29kZSBhbiBhcnJheSBvZiBieXRlcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaW5wdXQgQW4gYXJyYXkgb2YgYnl0ZXMgKG51bWJlcnMgd2l0aFxyXG4gICAgICogICAgIHZhbHVlIGluIFswLCAyNTVdKSB0byBlbmNvZGUuXHJcbiAgICAgKiBAcGFyYW0gd2ViU2FmZSBCb29sZWFuIGluZGljYXRpbmcgd2Ugc2hvdWxkIHVzZSB0aGVcclxuICAgICAqICAgICBhbHRlcm5hdGl2ZSBhbHBoYWJldC5cclxuICAgICAqIEByZXR1cm4gVGhlIGJhc2U2NCBlbmNvZGVkIHN0cmluZy5cclxuICAgICAqL1xyXG4gICAgZW5jb2RlQnl0ZUFycmF5KGlucHV0LCB3ZWJTYWZlKSB7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0KSkge1xyXG4gICAgICAgICAgICB0aHJvdyBFcnJvcignZW5jb2RlQnl0ZUFycmF5IHRha2VzIGFuIGFycmF5IGFzIGEgcGFyYW1ldGVyJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaW5pdF8oKTtcclxuICAgICAgICBjb25zdCBieXRlVG9DaGFyTWFwID0gd2ViU2FmZVxyXG4gICAgICAgICAgICA/IHRoaXMuYnl0ZVRvQ2hhck1hcFdlYlNhZmVfXHJcbiAgICAgICAgICAgIDogdGhpcy5ieXRlVG9DaGFyTWFwXztcclxuICAgICAgICBjb25zdCBvdXRwdXQgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSArPSAzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ5dGUxID0gaW5wdXRbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IGhhdmVCeXRlMiA9IGkgKyAxIDwgaW5wdXQubGVuZ3RoO1xyXG4gICAgICAgICAgICBjb25zdCBieXRlMiA9IGhhdmVCeXRlMiA/IGlucHV0W2kgKyAxXSA6IDA7XHJcbiAgICAgICAgICAgIGNvbnN0IGhhdmVCeXRlMyA9IGkgKyAyIDwgaW5wdXQubGVuZ3RoO1xyXG4gICAgICAgICAgICBjb25zdCBieXRlMyA9IGhhdmVCeXRlMyA/IGlucHV0W2kgKyAyXSA6IDA7XHJcbiAgICAgICAgICAgIGNvbnN0IG91dEJ5dGUxID0gYnl0ZTEgPj4gMjtcclxuICAgICAgICAgICAgY29uc3Qgb3V0Qnl0ZTIgPSAoKGJ5dGUxICYgMHgwMykgPDwgNCkgfCAoYnl0ZTIgPj4gNCk7XHJcbiAgICAgICAgICAgIGxldCBvdXRCeXRlMyA9ICgoYnl0ZTIgJiAweDBmKSA8PCAyKSB8IChieXRlMyA+PiA2KTtcclxuICAgICAgICAgICAgbGV0IG91dEJ5dGU0ID0gYnl0ZTMgJiAweDNmO1xyXG4gICAgICAgICAgICBpZiAoIWhhdmVCeXRlMykge1xyXG4gICAgICAgICAgICAgICAgb3V0Qnl0ZTQgPSA2NDtcclxuICAgICAgICAgICAgICAgIGlmICghaGF2ZUJ5dGUyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3V0Qnl0ZTMgPSA2NDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvdXRwdXQucHVzaChieXRlVG9DaGFyTWFwW291dEJ5dGUxXSwgYnl0ZVRvQ2hhck1hcFtvdXRCeXRlMl0sIGJ5dGVUb0NoYXJNYXBbb3V0Qnl0ZTNdLCBieXRlVG9DaGFyTWFwW291dEJ5dGU0XSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvdXRwdXQuam9pbignJyk7XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiBCYXNlNjQtZW5jb2RlIGEgc3RyaW5nLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBpbnB1dCBBIHN0cmluZyB0byBlbmNvZGUuXHJcbiAgICAgKiBAcGFyYW0gd2ViU2FmZSBJZiB0cnVlLCB3ZSBzaG91bGQgdXNlIHRoZVxyXG4gICAgICogICAgIGFsdGVybmF0aXZlIGFscGhhYmV0LlxyXG4gICAgICogQHJldHVybiBUaGUgYmFzZTY0IGVuY29kZWQgc3RyaW5nLlxyXG4gICAgICovXHJcbiAgICBlbmNvZGVTdHJpbmcoaW5wdXQsIHdlYlNhZmUpIHtcclxuICAgICAgICAvLyBTaG9ydGN1dCBmb3IgTW96aWxsYSBicm93c2VycyB0aGF0IGltcGxlbWVudFxyXG4gICAgICAgIC8vIGEgbmF0aXZlIGJhc2U2NCBlbmNvZGVyIGluIHRoZSBmb3JtIG9mIFwiYnRvYS9hdG9iXCJcclxuICAgICAgICBpZiAodGhpcy5IQVNfTkFUSVZFX1NVUFBPUlQgJiYgIXdlYlNhZmUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGJ0b2EoaW5wdXQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGVCeXRlQXJyYXkoc3RyaW5nVG9CeXRlQXJyYXkkMShpbnB1dCksIHdlYlNhZmUpO1xyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICogQmFzZTY0LWRlY29kZSBhIHN0cmluZy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaW5wdXQgdG8gZGVjb2RlLlxyXG4gICAgICogQHBhcmFtIHdlYlNhZmUgVHJ1ZSBpZiB3ZSBzaG91bGQgdXNlIHRoZVxyXG4gICAgICogICAgIGFsdGVybmF0aXZlIGFscGhhYmV0LlxyXG4gICAgICogQHJldHVybiBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkZWNvZGVkIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBkZWNvZGVTdHJpbmcoaW5wdXQsIHdlYlNhZmUpIHtcclxuICAgICAgICAvLyBTaG9ydGN1dCBmb3IgTW96aWxsYSBicm93c2VycyB0aGF0IGltcGxlbWVudFxyXG4gICAgICAgIC8vIGEgbmF0aXZlIGJhc2U2NCBlbmNvZGVyIGluIHRoZSBmb3JtIG9mIFwiYnRvYS9hdG9iXCJcclxuICAgICAgICBpZiAodGhpcy5IQVNfTkFUSVZFX1NVUFBPUlQgJiYgIXdlYlNhZmUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGF0b2IoaW5wdXQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYnl0ZUFycmF5VG9TdHJpbmcodGhpcy5kZWNvZGVTdHJpbmdUb0J5dGVBcnJheShpbnB1dCwgd2ViU2FmZSkpO1xyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICogQmFzZTY0LWRlY29kZSBhIHN0cmluZy5cclxuICAgICAqXHJcbiAgICAgKiBJbiBiYXNlLTY0IGRlY29kaW5nLCBncm91cHMgb2YgZm91ciBjaGFyYWN0ZXJzIGFyZSBjb252ZXJ0ZWQgaW50byB0aHJlZVxyXG4gICAgICogYnl0ZXMuICBJZiB0aGUgZW5jb2RlciBkaWQgbm90IGFwcGx5IHBhZGRpbmcsIHRoZSBpbnB1dCBsZW5ndGggbWF5IG5vdFxyXG4gICAgICogYmUgYSBtdWx0aXBsZSBvZiA0LlxyXG4gICAgICpcclxuICAgICAqIEluIHRoaXMgY2FzZSwgdGhlIGxhc3QgZ3JvdXAgd2lsbCBoYXZlIGZld2VyIHRoYW4gNCBjaGFyYWN0ZXJzLCBhbmRcclxuICAgICAqIHBhZGRpbmcgd2lsbCBiZSBpbmZlcnJlZC4gIElmIHRoZSBncm91cCBoYXMgb25lIG9yIHR3byBjaGFyYWN0ZXJzLCBpdCBkZWNvZGVzXHJcbiAgICAgKiB0byBvbmUgYnl0ZS4gIElmIHRoZSBncm91cCBoYXMgdGhyZWUgY2hhcmFjdGVycywgaXQgZGVjb2RlcyB0byB0d28gYnl0ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGlucHV0IElucHV0IHRvIGRlY29kZS5cclxuICAgICAqIEBwYXJhbSB3ZWJTYWZlIFRydWUgaWYgd2Ugc2hvdWxkIHVzZSB0aGUgd2ViLXNhZmUgYWxwaGFiZXQuXHJcbiAgICAgKiBAcmV0dXJuIGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgZGVjb2RlZCB2YWx1ZS5cclxuICAgICAqL1xyXG4gICAgZGVjb2RlU3RyaW5nVG9CeXRlQXJyYXkoaW5wdXQsIHdlYlNhZmUpIHtcclxuICAgICAgICB0aGlzLmluaXRfKCk7XHJcbiAgICAgICAgY29uc3QgY2hhclRvQnl0ZU1hcCA9IHdlYlNhZmVcclxuICAgICAgICAgICAgPyB0aGlzLmNoYXJUb0J5dGVNYXBXZWJTYWZlX1xyXG4gICAgICAgICAgICA6IHRoaXMuY2hhclRvQnl0ZU1hcF87XHJcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ5dGUxID0gY2hhclRvQnl0ZU1hcFtpbnB1dC5jaGFyQXQoaSsrKV07XHJcbiAgICAgICAgICAgIGNvbnN0IGhhdmVCeXRlMiA9IGkgPCBpbnB1dC5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ5dGUyID0gaGF2ZUJ5dGUyID8gY2hhclRvQnl0ZU1hcFtpbnB1dC5jaGFyQXQoaSldIDogMDtcclxuICAgICAgICAgICAgKytpO1xyXG4gICAgICAgICAgICBjb25zdCBoYXZlQnl0ZTMgPSBpIDwgaW5wdXQubGVuZ3RoO1xyXG4gICAgICAgICAgICBjb25zdCBieXRlMyA9IGhhdmVCeXRlMyA/IGNoYXJUb0J5dGVNYXBbaW5wdXQuY2hhckF0KGkpXSA6IDY0O1xyXG4gICAgICAgICAgICArK2k7XHJcbiAgICAgICAgICAgIGNvbnN0IGhhdmVCeXRlNCA9IGkgPCBpbnB1dC5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ5dGU0ID0gaGF2ZUJ5dGU0ID8gY2hhclRvQnl0ZU1hcFtpbnB1dC5jaGFyQXQoaSldIDogNjQ7XHJcbiAgICAgICAgICAgICsraTtcclxuICAgICAgICAgICAgaWYgKGJ5dGUxID09IG51bGwgfHwgYnl0ZTIgPT0gbnVsbCB8fCBieXRlMyA9PSBudWxsIHx8IGJ5dGU0ID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3Qgb3V0Qnl0ZTEgPSAoYnl0ZTEgPDwgMikgfCAoYnl0ZTIgPj4gNCk7XHJcbiAgICAgICAgICAgIG91dHB1dC5wdXNoKG91dEJ5dGUxKTtcclxuICAgICAgICAgICAgaWYgKGJ5dGUzICE9PSA2NCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0Qnl0ZTIgPSAoKGJ5dGUyIDw8IDQpICYgMHhmMCkgfCAoYnl0ZTMgPj4gMik7XHJcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChvdXRCeXRlMik7XHJcbiAgICAgICAgICAgICAgICBpZiAoYnl0ZTQgIT09IDY0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0Qnl0ZTMgPSAoKGJ5dGUzIDw8IDYpICYgMHhjMCkgfCBieXRlNDtcclxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChvdXRCeXRlMyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIExhenkgc3RhdGljIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLiBDYWxsZWQgYmVmb3JlXHJcbiAgICAgKiBhY2Nlc3NpbmcgYW55IG9mIHRoZSBzdGF0aWMgbWFwIHZhcmlhYmxlcy5cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIGluaXRfKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5ieXRlVG9DaGFyTWFwXykge1xyXG4gICAgICAgICAgICB0aGlzLmJ5dGVUb0NoYXJNYXBfID0ge307XHJcbiAgICAgICAgICAgIHRoaXMuY2hhclRvQnl0ZU1hcF8gPSB7fTtcclxuICAgICAgICAgICAgdGhpcy5ieXRlVG9DaGFyTWFwV2ViU2FmZV8gPSB7fTtcclxuICAgICAgICAgICAgdGhpcy5jaGFyVG9CeXRlTWFwV2ViU2FmZV8gPSB7fTtcclxuICAgICAgICAgICAgLy8gV2Ugd2FudCBxdWljayBtYXBwaW5ncyBiYWNrIGFuZCBmb3J0aCwgc28gd2UgcHJlY29tcHV0ZSB0d28gbWFwcy5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLkVOQ09ERURfVkFMUy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ieXRlVG9DaGFyTWFwX1tpXSA9IHRoaXMuRU5DT0RFRF9WQUxTLmNoYXJBdChpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhclRvQnl0ZU1hcF9bdGhpcy5ieXRlVG9DaGFyTWFwX1tpXV0gPSBpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ieXRlVG9DaGFyTWFwV2ViU2FmZV9baV0gPSB0aGlzLkVOQ09ERURfVkFMU19XRUJTQUZFLmNoYXJBdChpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhclRvQnl0ZU1hcFdlYlNhZmVfW3RoaXMuYnl0ZVRvQ2hhck1hcFdlYlNhZmVfW2ldXSA9IGk7XHJcbiAgICAgICAgICAgICAgICAvLyBCZSBmb3JnaXZpbmcgd2hlbiBkZWNvZGluZyBhbmQgY29ycmVjdGx5IGRlY29kZSBib3RoIGVuY29kaW5ncy5cclxuICAgICAgICAgICAgICAgIGlmIChpID49IHRoaXMuRU5DT0RFRF9WQUxTX0JBU0UubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFyVG9CeXRlTWFwX1t0aGlzLkVOQ09ERURfVkFMU19XRUJTQUZFLmNoYXJBdChpKV0gPSBpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhclRvQnl0ZU1hcFdlYlNhZmVfW3RoaXMuRU5DT0RFRF9WQUxTLmNoYXJBdChpKV0gPSBpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG4vKipcclxuICogVVJMLXNhZmUgYmFzZTY0IGVuY29kaW5nXHJcbiAqL1xyXG5jb25zdCBiYXNlNjRFbmNvZGUgPSBmdW5jdGlvbiAoc3RyKSB7XHJcbiAgICBjb25zdCB1dGY4Qnl0ZXMgPSBzdHJpbmdUb0J5dGVBcnJheSQxKHN0cik7XHJcbiAgICByZXR1cm4gYmFzZTY0LmVuY29kZUJ5dGVBcnJheSh1dGY4Qnl0ZXMsIHRydWUpO1xyXG59O1xyXG4vKipcclxuICogVVJMLXNhZmUgYmFzZTY0IGVuY29kaW5nICh3aXRob3V0IFwiLlwiIHBhZGRpbmcgaW4gdGhlIGVuZCkuXHJcbiAqIGUuZy4gVXNlZCBpbiBKU09OIFdlYiBUb2tlbiAoSldUKSBwYXJ0cy5cclxuICovXHJcbmNvbnN0IGJhc2U2NHVybEVuY29kZVdpdGhvdXRQYWRkaW5nID0gZnVuY3Rpb24gKHN0cikge1xyXG4gICAgLy8gVXNlIGJhc2U2NHVybCBlbmNvZGluZyBhbmQgcmVtb3ZlIHBhZGRpbmcgaW4gdGhlIGVuZCAoZG90IGNoYXJhY3RlcnMpLlxyXG4gICAgcmV0dXJuIGJhc2U2NEVuY29kZShzdHIpLnJlcGxhY2UoL1xcLi9nLCAnJyk7XHJcbn07XHJcbi8qKlxyXG4gKiBVUkwtc2FmZSBiYXNlNjQgZGVjb2RpbmdcclxuICpcclxuICogTk9URTogRE8gTk9UIHVzZSB0aGUgZ2xvYmFsIGF0b2IoKSBmdW5jdGlvbiAtIGl0IGRvZXMgTk9UIHN1cHBvcnQgdGhlXHJcbiAqIGJhc2U2NFVybCB2YXJpYW50IGVuY29kaW5nLlxyXG4gKlxyXG4gKiBAcGFyYW0gc3RyIFRvIGJlIGRlY29kZWRcclxuICogQHJldHVybiBEZWNvZGVkIHJlc3VsdCwgaWYgcG9zc2libGVcclxuICovXHJcbmNvbnN0IGJhc2U2NERlY29kZSA9IGZ1bmN0aW9uIChzdHIpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgcmV0dXJuIGJhc2U2NC5kZWNvZGVTdHJpbmcoc3RyLCB0cnVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignYmFzZTY0RGVjb2RlIGZhaWxlZDogJywgZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxufTtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIERvIGEgZGVlcC1jb3B5IG9mIGJhc2ljIEphdmFTY3JpcHQgT2JqZWN0cyBvciBBcnJheXMuXHJcbiAqL1xyXG5mdW5jdGlvbiBkZWVwQ29weSh2YWx1ZSkge1xyXG4gICAgcmV0dXJuIGRlZXBFeHRlbmQodW5kZWZpbmVkLCB2YWx1ZSk7XHJcbn1cclxuLyoqXHJcbiAqIENvcHkgcHJvcGVydGllcyBmcm9tIHNvdXJjZSB0byB0YXJnZXQgKHJlY3Vyc2l2ZWx5IGFsbG93cyBleHRlbnNpb25cclxuICogb2YgT2JqZWN0cyBhbmQgQXJyYXlzKS4gIFNjYWxhciB2YWx1ZXMgaW4gdGhlIHRhcmdldCBhcmUgb3Zlci13cml0dGVuLlxyXG4gKiBJZiB0YXJnZXQgaXMgdW5kZWZpbmVkLCBhbiBvYmplY3Qgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUgd2lsbCBiZSBjcmVhdGVkXHJcbiAqIChhbmQgcmV0dXJuZWQpLlxyXG4gKlxyXG4gKiBXZSByZWN1cnNpdmVseSBjb3B5IGFsbCBjaGlsZCBwcm9wZXJ0aWVzIG9mIHBsYWluIE9iamVjdHMgaW4gdGhlIHNvdXJjZS0gc29cclxuICogdGhhdCBuYW1lc3BhY2UtIGxpa2UgZGljdGlvbmFyaWVzIGFyZSBtZXJnZWQuXHJcbiAqXHJcbiAqIE5vdGUgdGhhdCB0aGUgdGFyZ2V0IGNhbiBiZSBhIGZ1bmN0aW9uLCBpbiB3aGljaCBjYXNlIHRoZSBwcm9wZXJ0aWVzIGluXHJcbiAqIHRoZSBzb3VyY2UgT2JqZWN0IGFyZSBjb3BpZWQgb250byBpdCBhcyBzdGF0aWMgcHJvcGVydGllcyBvZiB0aGUgRnVuY3Rpb24uXHJcbiAqXHJcbiAqIE5vdGU6IHdlIGRvbid0IG1lcmdlIF9fcHJvdG9fXyB0byBwcmV2ZW50IHByb3RvdHlwZSBwb2xsdXRpb25cclxuICovXHJcbmZ1bmN0aW9uIGRlZXBFeHRlbmQodGFyZ2V0LCBzb3VyY2UpIHtcclxuICAgIGlmICghKHNvdXJjZSBpbnN0YW5jZW9mIE9iamVjdCkpIHtcclxuICAgICAgICByZXR1cm4gc291cmNlO1xyXG4gICAgfVxyXG4gICAgc3dpdGNoIChzb3VyY2UuY29uc3RydWN0b3IpIHtcclxuICAgICAgICBjYXNlIERhdGU6XHJcbiAgICAgICAgICAgIC8vIFRyZWF0IERhdGVzIGxpa2Ugc2NhbGFyczsgaWYgdGhlIHRhcmdldCBkYXRlIG9iamVjdCBoYWQgYW55IGNoaWxkXHJcbiAgICAgICAgICAgIC8vIHByb3BlcnRpZXMgLSB0aGV5IHdpbGwgYmUgbG9zdCFcclxuICAgICAgICAgICAgY29uc3QgZGF0ZVZhbHVlID0gc291cmNlO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoZGF0ZVZhbHVlLmdldFRpbWUoKSk7XHJcbiAgICAgICAgY2FzZSBPYmplY3Q6XHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0ge307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBBcnJheTpcclxuICAgICAgICAgICAgLy8gQWx3YXlzIGNvcHkgdGhlIGFycmF5IHNvdXJjZSBhbmQgb3ZlcndyaXRlIHRoZSB0YXJnZXQuXHJcbiAgICAgICAgICAgIHRhcmdldCA9IFtdO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAvLyBOb3QgYSBwbGFpbiBPYmplY3QgLSB0cmVhdCBpdCBhcyBhIHNjYWxhci5cclxuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZTtcclxuICAgIH1cclxuICAgIGZvciAoY29uc3QgcHJvcCBpbiBzb3VyY2UpIHtcclxuICAgICAgICAvLyB1c2UgaXNWYWxpZEtleSB0byBndWFyZCBhZ2FpbnN0IHByb3RvdHlwZSBwb2xsdXRpb24uIFNlZSBodHRwczovL3NueWsuaW8vdnVsbi9TTllLLUpTLUxPREFTSC00NTAyMDJcclxuICAgICAgICBpZiAoIXNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSB8fCAhaXNWYWxpZEtleShwcm9wKSkge1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGFyZ2V0W3Byb3BdID0gZGVlcEV4dGVuZCh0YXJnZXRbcHJvcF0sIHNvdXJjZVtwcm9wXSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGFyZ2V0O1xyXG59XHJcbmZ1bmN0aW9uIGlzVmFsaWRLZXkoa2V5KSB7XHJcbiAgICByZXR1cm4ga2V5ICE9PSAnX19wcm90b19fJztcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jbGFzcyBEZWZlcnJlZCB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLnJlamVjdCA9ICgpID0+IHsgfTtcclxuICAgICAgICB0aGlzLnJlc29sdmUgPSAoKSA9PiB7IH07XHJcbiAgICAgICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlO1xyXG4gICAgICAgICAgICB0aGlzLnJlamVjdCA9IHJlamVjdDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogT3VyIEFQSSBpbnRlcm5hbHMgYXJlIG5vdCBwcm9taXNlaWZpZWQgYW5kIGNhbm5vdCBiZWNhdXNlIG91ciBjYWxsYmFjayBBUElzIGhhdmUgc3VidGxlIGV4cGVjdGF0aW9ucyBhcm91bmRcclxuICAgICAqIGludm9raW5nIHByb21pc2VzIGlubGluZSwgd2hpY2ggUHJvbWlzZXMgYXJlIGZvcmJpZGRlbiB0byBkby4gVGhpcyBtZXRob2QgYWNjZXB0cyBhbiBvcHRpb25hbCBub2RlLXN0eWxlIGNhbGxiYWNrXHJcbiAgICAgKiBhbmQgcmV0dXJucyBhIG5vZGUtc3R5bGUgY2FsbGJhY2sgd2hpY2ggd2lsbCByZXNvbHZlIG9yIHJlamVjdCB0aGUgRGVmZXJyZWQncyBwcm9taXNlLlxyXG4gICAgICovXHJcbiAgICB3cmFwQ2FsbGJhY2soY2FsbGJhY2spIHtcclxuICAgICAgICByZXR1cm4gKGVycm9yLCB2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgLy8gQXR0YWNoaW5nIG5vb3AgaGFuZGxlciBqdXN0IGluIGNhc2UgZGV2ZWxvcGVyIHdhc24ndCBleHBlY3RpbmdcclxuICAgICAgICAgICAgICAgIC8vIHByb21pc2VzXHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuY2F0Y2goKCkgPT4geyB9KTtcclxuICAgICAgICAgICAgICAgIC8vIFNvbWUgb2Ygb3VyIGNhbGxiYWNrcyBkb24ndCBleHBlY3QgYSB2YWx1ZSBhbmQgb3VyIG93biB0ZXN0c1xyXG4gICAgICAgICAgICAgICAgLy8gYXNzZXJ0IHRoYXQgdGhlIHBhcmFtZXRlciBsZW5ndGggaXMgMVxyXG4gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycm9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycm9yLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIGNyZWF0ZU1vY2tVc2VyVG9rZW4odG9rZW4sIHByb2plY3RJZCkge1xyXG4gICAgaWYgKHRva2VuLnVpZCkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIFwidWlkXCIgZmllbGQgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBieSBtb2NrVXNlclRva2VuLiBQbGVhc2UgdXNlIFwic3ViXCIgaW5zdGVhZCBmb3IgRmlyZWJhc2UgQXV0aCBVc2VyIElELicpO1xyXG4gICAgfVxyXG4gICAgLy8gVW5zZWN1cmVkIEpXVHMgdXNlIFwibm9uZVwiIGFzIHRoZSBhbGdvcml0aG0uXHJcbiAgICBjb25zdCBoZWFkZXIgPSB7XHJcbiAgICAgICAgYWxnOiAnbm9uZScsXHJcbiAgICAgICAgdHlwZTogJ0pXVCdcclxuICAgIH07XHJcbiAgICBjb25zdCBwcm9qZWN0ID0gcHJvamVjdElkIHx8ICdkZW1vLXByb2plY3QnO1xyXG4gICAgY29uc3QgaWF0ID0gdG9rZW4uaWF0IHx8IDA7XHJcbiAgICBjb25zdCBzdWIgPSB0b2tlbi5zdWIgfHwgdG9rZW4udXNlcl9pZDtcclxuICAgIGlmICghc3ViKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibW9ja1VzZXJUb2tlbiBtdXN0IGNvbnRhaW4gJ3N1Yicgb3IgJ3VzZXJfaWQnIGZpZWxkIVwiKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHBheWxvYWQgPSBPYmplY3QuYXNzaWduKHsgXHJcbiAgICAgICAgLy8gU2V0IGFsbCByZXF1aXJlZCBmaWVsZHMgdG8gZGVjZW50IGRlZmF1bHRzXHJcbiAgICAgICAgaXNzOiBgaHR0cHM6Ly9zZWN1cmV0b2tlbi5nb29nbGUuY29tLyR7cHJvamVjdH1gLCBhdWQ6IHByb2plY3QsIGlhdCwgZXhwOiBpYXQgKyAzNjAwLCBhdXRoX3RpbWU6IGlhdCwgc3ViLCB1c2VyX2lkOiBzdWIsIGZpcmViYXNlOiB7XHJcbiAgICAgICAgICAgIHNpZ25faW5fcHJvdmlkZXI6ICdjdXN0b20nLFxyXG4gICAgICAgICAgICBpZGVudGl0aWVzOiB7fVxyXG4gICAgICAgIH0gfSwgdG9rZW4pO1xyXG4gICAgLy8gVW5zZWN1cmVkIEpXVHMgdXNlIHRoZSBlbXB0eSBzdHJpbmcgYXMgYSBzaWduYXR1cmUuXHJcbiAgICBjb25zdCBzaWduYXR1cmUgPSAnJztcclxuICAgIHJldHVybiBbXHJcbiAgICAgICAgYmFzZTY0dXJsRW5jb2RlV2l0aG91dFBhZGRpbmcoSlNPTi5zdHJpbmdpZnkoaGVhZGVyKSksXHJcbiAgICAgICAgYmFzZTY0dXJsRW5jb2RlV2l0aG91dFBhZGRpbmcoSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpLFxyXG4gICAgICAgIHNpZ25hdHVyZVxyXG4gICAgXS5qb2luKCcuJyk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFJldHVybnMgbmF2aWdhdG9yLnVzZXJBZ2VudCBzdHJpbmcgb3IgJycgaWYgaXQncyBub3QgZGVmaW5lZC5cclxuICogQHJldHVybiB1c2VyIGFnZW50IHN0cmluZ1xyXG4gKi9cclxuZnVuY3Rpb24gZ2V0VUEoKSB7XHJcbiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiZcclxuICAgICAgICB0eXBlb2YgbmF2aWdhdG9yWyd1c2VyQWdlbnQnXSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICByZXR1cm4gbmF2aWdhdG9yWyd1c2VyQWdlbnQnXTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxufVxyXG4vKipcclxuICogRGV0ZWN0IENvcmRvdmEgLyBQaG9uZUdhcCAvIElvbmljIGZyYW1ld29ya3Mgb24gYSBtb2JpbGUgZGV2aWNlLlxyXG4gKlxyXG4gKiBEZWxpYmVyYXRlbHkgZG9lcyBub3QgcmVseSBvbiBjaGVja2luZyBgZmlsZTovL2AgVVJMcyAoYXMgdGhpcyBmYWlscyBQaG9uZUdhcFxyXG4gKiBpbiB0aGUgUmlwcGxlIGVtdWxhdG9yKSBub3IgQ29yZG92YSBgb25EZXZpY2VSZWFkeWAsIHdoaWNoIHdvdWxkIG5vcm1hbGx5XHJcbiAqIHdhaXQgZm9yIGEgY2FsbGJhY2suXHJcbiAqL1xyXG5mdW5jdGlvbiBpc01vYmlsZUNvcmRvdmEoKSB7XHJcbiAgICByZXR1cm4gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBTZXR0aW5nIHVwIGFuIGJyb2FkbHkgYXBwbGljYWJsZSBpbmRleCBzaWduYXR1cmUgZm9yIFdpbmRvd1xyXG4gICAgICAgIC8vIGp1c3QgdG8gZGVhbCB3aXRoIHRoaXMgY2FzZSB3b3VsZCBwcm9iYWJseSBiZSBhIGJhZCBpZGVhLlxyXG4gICAgICAgICEhKHdpbmRvd1snY29yZG92YSddIHx8IHdpbmRvd1sncGhvbmVnYXAnXSB8fCB3aW5kb3dbJ1Bob25lR2FwJ10pICYmXHJcbiAgICAgICAgL2lvc3xpcGhvbmV8aXBvZHxpcGFkfGFuZHJvaWR8YmxhY2tiZXJyeXxpZW1vYmlsZS9pLnRlc3QoZ2V0VUEoKSkpO1xyXG59XHJcbi8qKlxyXG4gKiBEZXRlY3QgTm9kZS5qcy5cclxuICpcclxuICogQHJldHVybiB0cnVlIGlmIE5vZGUuanMgZW52aXJvbm1lbnQgaXMgZGV0ZWN0ZWQuXHJcbiAqL1xyXG4vLyBOb2RlIGRldGVjdGlvbiBsb2dpYyBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vaWxpYWthbi9kZXRlY3Qtbm9kZS9cclxuZnVuY3Rpb24gaXNOb2RlKCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChnbG9iYWwucHJvY2VzcykgPT09ICdbb2JqZWN0IHByb2Nlc3NdJyk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogRGV0ZWN0IEJyb3dzZXIgRW52aXJvbm1lbnRcclxuICovXHJcbmZ1bmN0aW9uIGlzQnJvd3NlcigpIHtcclxuICAgIHJldHVybiB0eXBlb2Ygc2VsZiA9PT0gJ29iamVjdCcgJiYgc2VsZi5zZWxmID09PSBzZWxmO1xyXG59XHJcbmZ1bmN0aW9uIGlzQnJvd3NlckV4dGVuc2lvbigpIHtcclxuICAgIGNvbnN0IHJ1bnRpbWUgPSB0eXBlb2YgY2hyb21lID09PSAnb2JqZWN0J1xyXG4gICAgICAgID8gY2hyb21lLnJ1bnRpbWVcclxuICAgICAgICA6IHR5cGVvZiBicm93c2VyID09PSAnb2JqZWN0J1xyXG4gICAgICAgICAgICA/IGJyb3dzZXIucnVudGltZVxyXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcclxuICAgIHJldHVybiB0eXBlb2YgcnVudGltZSA9PT0gJ29iamVjdCcgJiYgcnVudGltZS5pZCAhPT0gdW5kZWZpbmVkO1xyXG59XHJcbi8qKlxyXG4gKiBEZXRlY3QgUmVhY3QgTmF0aXZlLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHRydWUgaWYgUmVhY3ROYXRpdmUgZW52aXJvbm1lbnQgaXMgZGV0ZWN0ZWQuXHJcbiAqL1xyXG5mdW5jdGlvbiBpc1JlYWN0TmF0aXZlKCkge1xyXG4gICAgcmV0dXJuICh0eXBlb2YgbmF2aWdhdG9yID09PSAnb2JqZWN0JyAmJiBuYXZpZ2F0b3JbJ3Byb2R1Y3QnXSA9PT0gJ1JlYWN0TmF0aXZlJyk7XHJcbn1cclxuLyoqIERldGVjdHMgRWxlY3Ryb24gYXBwcy4gKi9cclxuZnVuY3Rpb24gaXNFbGVjdHJvbigpIHtcclxuICAgIHJldHVybiBnZXRVQSgpLmluZGV4T2YoJ0VsZWN0cm9uLycpID49IDA7XHJcbn1cclxuLyoqIERldGVjdHMgSW50ZXJuZXQgRXhwbG9yZXIuICovXHJcbmZ1bmN0aW9uIGlzSUUoKSB7XHJcbiAgICBjb25zdCB1YSA9IGdldFVBKCk7XHJcbiAgICByZXR1cm4gdWEuaW5kZXhPZignTVNJRSAnKSA+PSAwIHx8IHVhLmluZGV4T2YoJ1RyaWRlbnQvJykgPj0gMDtcclxufVxyXG4vKiogRGV0ZWN0cyBVbml2ZXJzYWwgV2luZG93cyBQbGF0Zm9ybSBhcHBzLiAqL1xyXG5mdW5jdGlvbiBpc1VXUCgpIHtcclxuICAgIHJldHVybiBnZXRVQSgpLmluZGV4T2YoJ01TQXBwSG9zdC8nKSA+PSAwO1xyXG59XHJcbi8qKlxyXG4gKiBEZXRlY3Qgd2hldGhlciB0aGUgY3VycmVudCBTREsgYnVpbGQgaXMgdGhlIE5vZGUgdmVyc2lvbi5cclxuICpcclxuICogQHJldHVybiB0cnVlIGlmIGl0J3MgdGhlIE5vZGUgU0RLIGJ1aWxkLlxyXG4gKi9cclxuZnVuY3Rpb24gaXNOb2RlU2RrKCkge1xyXG4gICAgcmV0dXJuIENPTlNUQU5UUy5OT0RFX0NMSUVOVCA9PT0gdHJ1ZSB8fCBDT05TVEFOVFMuTk9ERV9BRE1JTiA9PT0gdHJ1ZTtcclxufVxyXG4vKiogUmV0dXJucyB0cnVlIGlmIHdlIGFyZSBydW5uaW5nIGluIFNhZmFyaS4gKi9cclxuZnVuY3Rpb24gaXNTYWZhcmkoKSB7XHJcbiAgICByZXR1cm4gKCFpc05vZGUoKSAmJlxyXG4gICAgICAgIG5hdmlnYXRvci51c2VyQWdlbnQuaW5jbHVkZXMoJ1NhZmFyaScpICYmXHJcbiAgICAgICAgIW5hdmlnYXRvci51c2VyQWdlbnQuaW5jbHVkZXMoJ0Nocm9tZScpKTtcclxufVxyXG4vKipcclxuICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIGluZGV4ZWREQiBpcyBzdXBwb3J0ZWQgYnkgY3VycmVudCBicm93c2VyL3NlcnZpY2Ugd29ya2VyIGNvbnRleHRcclxuICogQHJldHVybiB0cnVlIGlmIGluZGV4ZWREQiBpcyBzdXBwb3J0ZWQgYnkgY3VycmVudCBicm93c2VyL3NlcnZpY2Ugd29ya2VyIGNvbnRleHRcclxuICovXHJcbmZ1bmN0aW9uIGlzSW5kZXhlZERCQXZhaWxhYmxlKCkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiBpbmRleGVkREIgPT09ICdvYmplY3QnO1xyXG59XHJcbi8qKlxyXG4gKiBUaGlzIG1ldGhvZCB2YWxpZGF0ZXMgYnJvd3Nlci9zdyBjb250ZXh0IGZvciBpbmRleGVkREIgYnkgb3BlbmluZyBhIGR1bW15IGluZGV4ZWREQiBkYXRhYmFzZSBhbmQgcmVqZWN0XHJcbiAqIGlmIGVycm9ycyBvY2N1ciBkdXJpbmcgdGhlIGRhdGFiYXNlIG9wZW4gb3BlcmF0aW9uLlxyXG4gKlxyXG4gKiBAdGhyb3dzIGV4Y2VwdGlvbiBpZiBjdXJyZW50IGJyb3dzZXIvc3cgY29udGV4dCBjYW4ndCBydW4gaWRiLm9wZW4gKGV4OiBTYWZhcmkgaWZyYW1lLCBGaXJlZm94XHJcbiAqIHByaXZhdGUgYnJvd3NpbmcpXHJcbiAqL1xyXG5mdW5jdGlvbiB2YWxpZGF0ZUluZGV4ZWREQk9wZW5hYmxlKCkge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgcHJlRXhpc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICBjb25zdCBEQl9DSEVDS19OQU1FID0gJ3ZhbGlkYXRlLWJyb3dzZXItY29udGV4dC1mb3ItaW5kZXhlZGRiLWFuYWx5dGljcy1tb2R1bGUnO1xyXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gc2VsZi5pbmRleGVkREIub3BlbihEQl9DSEVDS19OQU1FKTtcclxuICAgICAgICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0LnJlc3VsdC5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgLy8gZGVsZXRlIGRhdGFiYXNlIG9ubHkgd2hlbiBpdCBkb2Vzbid0IHByZS1leGlzdFxyXG4gICAgICAgICAgICAgICAgaWYgKCFwcmVFeGlzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuaW5kZXhlZERCLmRlbGV0ZURhdGFiYXNlKERCX0NIRUNLX05BTUUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBwcmVFeGlzdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoKChfYSA9IHJlcXVlc3QuZXJyb3IpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tZXNzYWdlKSB8fCAnJyk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59XHJcbi8qKlxyXG4gKlxyXG4gKiBUaGlzIG1ldGhvZCBjaGVja3Mgd2hldGhlciBjb29raWUgaXMgZW5hYmxlZCB3aXRoaW4gY3VycmVudCBicm93c2VyXHJcbiAqIEByZXR1cm4gdHJ1ZSBpZiBjb29raWUgaXMgZW5hYmxlZCB3aXRoaW4gY3VycmVudCBicm93c2VyXHJcbiAqL1xyXG5mdW5jdGlvbiBhcmVDb29raWVzRW5hYmxlZCgpIHtcclxuICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSAndW5kZWZpbmVkJyB8fCAhbmF2aWdhdG9yLmNvb2tpZUVuYWJsZWQpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG4vKipcclxuICogUG9seWZpbGwgZm9yIGBnbG9iYWxUaGlzYCBvYmplY3QuXHJcbiAqIEByZXR1cm5zIHRoZSBgZ2xvYmFsVGhpc2Agb2JqZWN0IGZvciB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRHbG9iYWwoKSB7XHJcbiAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgcmV0dXJuIHNlbGY7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICByZXR1cm4gd2luZG93O1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgcmV0dXJuIGdsb2JhbDtcclxuICAgIH1cclxuICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGxvY2F0ZSBnbG9iYWwgb2JqZWN0LicpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBAZmlsZW92ZXJ2aWV3IFN0YW5kYXJkaXplZCBGaXJlYmFzZSBFcnJvci5cclxuICpcclxuICogVXNhZ2U6XHJcbiAqXHJcbiAqICAgLy8gVHlwZXNjcmlwdCBzdHJpbmcgbGl0ZXJhbHMgZm9yIHR5cGUtc2FmZSBjb2Rlc1xyXG4gKiAgIHR5cGUgRXJyID1cclxuICogICAgICd1bmtub3duJyB8XHJcbiAqICAgICAnb2JqZWN0LW5vdC1mb3VuZCdcclxuICogICAgIDtcclxuICpcclxuICogICAvLyBDbG9zdXJlIGVudW0gZm9yIHR5cGUtc2FmZSBlcnJvciBjb2Rlc1xyXG4gKiAgIC8vIGF0LWVudW0ge3N0cmluZ31cclxuICogICB2YXIgRXJyID0ge1xyXG4gKiAgICAgVU5LTk9XTjogJ3Vua25vd24nLFxyXG4gKiAgICAgT0JKRUNUX05PVF9GT1VORDogJ29iamVjdC1ub3QtZm91bmQnLFxyXG4gKiAgIH1cclxuICpcclxuICogICBsZXQgZXJyb3JzOiBNYXA8RXJyLCBzdHJpbmc+ID0ge1xyXG4gKiAgICAgJ2dlbmVyaWMtZXJyb3InOiBcIlVua25vd24gZXJyb3JcIixcclxuICogICAgICdmaWxlLW5vdC1mb3VuZCc6IFwiQ291bGQgbm90IGZpbmQgZmlsZTogeyRmaWxlfVwiLFxyXG4gKiAgIH07XHJcbiAqXHJcbiAqICAgLy8gVHlwZS1zYWZlIGZ1bmN0aW9uIC0gbXVzdCBwYXNzIGEgdmFsaWQgZXJyb3IgY29kZSBhcyBwYXJhbS5cclxuICogICBsZXQgZXJyb3IgPSBuZXcgRXJyb3JGYWN0b3J5PEVycj4oJ3NlcnZpY2UnLCAnU2VydmljZScsIGVycm9ycyk7XHJcbiAqXHJcbiAqICAgLi4uXHJcbiAqICAgdGhyb3cgZXJyb3IuY3JlYXRlKEVyci5HRU5FUklDKTtcclxuICogICAuLi5cclxuICogICB0aHJvdyBlcnJvci5jcmVhdGUoRXJyLkZJTEVfTk9UX0ZPVU5ELCB7J2ZpbGUnOiBmaWxlTmFtZX0pO1xyXG4gKiAgIC4uLlxyXG4gKiAgIC8vIFNlcnZpY2U6IENvdWxkIG5vdCBmaWxlIGZpbGU6IGZvby50eHQgKHNlcnZpY2UvZmlsZS1ub3QtZm91bmQpLlxyXG4gKlxyXG4gKiAgIGNhdGNoIChlKSB7XHJcbiAqICAgICBhc3NlcnQoZS5tZXNzYWdlID09PSBcIkNvdWxkIG5vdCBmaW5kIGZpbGU6IGZvby50eHQuXCIpO1xyXG4gKiAgICAgaWYgKGUuY29kZSA9PT0gJ3NlcnZpY2UvZmlsZS1ub3QtZm91bmQnKSB7XHJcbiAqICAgICAgIGNvbnNvbGUubG9nKFwiQ291bGQgbm90IHJlYWQgZmlsZTogXCIgKyBlWydmaWxlJ10pO1xyXG4gKiAgICAgfVxyXG4gKiAgIH1cclxuICovXHJcbmNvbnN0IEVSUk9SX05BTUUgPSAnRmlyZWJhc2VFcnJvcic7XHJcbi8vIEJhc2VkIG9uIGNvZGUgZnJvbTpcclxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRXJyb3IjQ3VzdG9tX0Vycm9yX1R5cGVzXHJcbmNsYXNzIEZpcmViYXNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgIC8qKiBUaGUgZXJyb3IgY29kZSBmb3IgdGhpcyBlcnJvci4gKi9cclxuICAgIGNvZGUsIG1lc3NhZ2UsIFxyXG4gICAgLyoqIEN1c3RvbSBkYXRhIGZvciB0aGlzIGVycm9yLiAqL1xyXG4gICAgY3VzdG9tRGF0YSkge1xyXG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xyXG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XHJcbiAgICAgICAgdGhpcy5jdXN0b21EYXRhID0gY3VzdG9tRGF0YTtcclxuICAgICAgICAvKiogVGhlIGN1c3RvbSBuYW1lIGZvciBhbGwgRmlyZWJhc2VFcnJvcnMuICovXHJcbiAgICAgICAgdGhpcy5uYW1lID0gRVJST1JfTkFNRTtcclxuICAgICAgICAvLyBGaXggRm9yIEVTNVxyXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC13aWtpL2Jsb2IvbWFzdGVyL0JyZWFraW5nLUNoYW5nZXMubWQjZXh0ZW5kaW5nLWJ1aWx0LWlucy1saWtlLWVycm9yLWFycmF5LWFuZC1tYXAtbWF5LW5vLWxvbmdlci13b3JrXHJcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIEZpcmViYXNlRXJyb3IucHJvdG90eXBlKTtcclxuICAgICAgICAvLyBNYWludGFpbnMgcHJvcGVyIHN0YWNrIHRyYWNlIGZvciB3aGVyZSBvdXIgZXJyb3Igd2FzIHRocm93bi5cclxuICAgICAgICAvLyBPbmx5IGF2YWlsYWJsZSBvbiBWOC5cclxuICAgICAgICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcclxuICAgICAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgRXJyb3JGYWN0b3J5LnByb3RvdHlwZS5jcmVhdGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5jbGFzcyBFcnJvckZhY3Rvcnkge1xyXG4gICAgY29uc3RydWN0b3Ioc2VydmljZSwgc2VydmljZU5hbWUsIGVycm9ycykge1xyXG4gICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lO1xyXG4gICAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xyXG4gICAgfVxyXG4gICAgY3JlYXRlKGNvZGUsIC4uLmRhdGEpIHtcclxuICAgICAgICBjb25zdCBjdXN0b21EYXRhID0gZGF0YVswXSB8fCB7fTtcclxuICAgICAgICBjb25zdCBmdWxsQ29kZSA9IGAke3RoaXMuc2VydmljZX0vJHtjb2RlfWA7XHJcbiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSB0aGlzLmVycm9yc1tjb2RlXTtcclxuICAgICAgICBjb25zdCBtZXNzYWdlID0gdGVtcGxhdGUgPyByZXBsYWNlVGVtcGxhdGUodGVtcGxhdGUsIGN1c3RvbURhdGEpIDogJ0Vycm9yJztcclxuICAgICAgICAvLyBTZXJ2aWNlIE5hbWU6IEVycm9yIG1lc3NhZ2UgKHNlcnZpY2UvY29kZSkuXHJcbiAgICAgICAgY29uc3QgZnVsbE1lc3NhZ2UgPSBgJHt0aGlzLnNlcnZpY2VOYW1lfTogJHttZXNzYWdlfSAoJHtmdWxsQ29kZX0pLmA7XHJcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRmlyZWJhc2VFcnJvcihmdWxsQ29kZSwgZnVsbE1lc3NhZ2UsIGN1c3RvbURhdGEpO1xyXG4gICAgICAgIHJldHVybiBlcnJvcjtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiByZXBsYWNlVGVtcGxhdGUodGVtcGxhdGUsIGRhdGEpIHtcclxuICAgIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKFBBVFRFUk4sIChfLCBrZXkpID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGFba2V5XTtcclxuICAgICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCA/IFN0cmluZyh2YWx1ZSkgOiBgPCR7a2V5fT8+YDtcclxuICAgIH0pO1xyXG59XHJcbmNvbnN0IFBBVFRFUk4gPSAvXFx7XFwkKFtefV0rKX0vZztcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIEV2YWx1YXRlcyBhIEpTT04gc3RyaW5nIGludG8gYSBqYXZhc2NyaXB0IG9iamVjdC5cclxuICpcclxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciBBIHN0cmluZyBjb250YWluaW5nIEpTT04uXHJcbiAqIEByZXR1cm4geyp9IFRoZSBqYXZhc2NyaXB0IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNwZWNpZmllZCBKU09OLlxyXG4gKi9cclxuZnVuY3Rpb24ganNvbkV2YWwoc3RyKSB7XHJcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzdHIpO1xyXG59XHJcbi8qKlxyXG4gKiBSZXR1cm5zIEpTT04gcmVwcmVzZW50aW5nIGEgamF2YXNjcmlwdCBvYmplY3QuXHJcbiAqIEBwYXJhbSB7Kn0gZGF0YSBKYXZhc2NyaXB0IG9iamVjdCB0byBiZSBzdHJpbmdpZmllZC5cclxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgSlNPTiBjb250ZW50cyBvZiB0aGUgb2JqZWN0LlxyXG4gKi9cclxuZnVuY3Rpb24gc3RyaW5naWZ5KGRhdGEpIHtcclxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogRGVjb2RlcyBhIEZpcmViYXNlIGF1dGguIHRva2VuIGludG8gY29uc3RpdHVlbnQgcGFydHMuXHJcbiAqXHJcbiAqIE5vdGVzOlxyXG4gKiAtIE1heSByZXR1cm4gd2l0aCBpbnZhbGlkIC8gaW5jb21wbGV0ZSBjbGFpbXMgaWYgdGhlcmUncyBubyBuYXRpdmUgYmFzZTY0IGRlY29kaW5nIHN1cHBvcnQuXHJcbiAqIC0gRG9lc24ndCBjaGVjayBpZiB0aGUgdG9rZW4gaXMgYWN0dWFsbHkgdmFsaWQuXHJcbiAqL1xyXG5jb25zdCBkZWNvZGUgPSBmdW5jdGlvbiAodG9rZW4pIHtcclxuICAgIGxldCBoZWFkZXIgPSB7fSwgY2xhaW1zID0ge30sIGRhdGEgPSB7fSwgc2lnbmF0dXJlID0gJyc7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHBhcnRzID0gdG9rZW4uc3BsaXQoJy4nKTtcclxuICAgICAgICBoZWFkZXIgPSBqc29uRXZhbChiYXNlNjREZWNvZGUocGFydHNbMF0pIHx8ICcnKTtcclxuICAgICAgICBjbGFpbXMgPSBqc29uRXZhbChiYXNlNjREZWNvZGUocGFydHNbMV0pIHx8ICcnKTtcclxuICAgICAgICBzaWduYXR1cmUgPSBwYXJ0c1syXTtcclxuICAgICAgICBkYXRhID0gY2xhaW1zWydkJ10gfHwge307XHJcbiAgICAgICAgZGVsZXRlIGNsYWltc1snZCddO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHsgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBoZWFkZXIsXHJcbiAgICAgICAgY2xhaW1zLFxyXG4gICAgICAgIGRhdGEsXHJcbiAgICAgICAgc2lnbmF0dXJlXHJcbiAgICB9O1xyXG59O1xyXG4vKipcclxuICogRGVjb2RlcyBhIEZpcmViYXNlIGF1dGguIHRva2VuIGFuZCBjaGVja3MgdGhlIHZhbGlkaXR5IG9mIGl0cyB0aW1lLWJhc2VkIGNsYWltcy4gV2lsbCByZXR1cm4gdHJ1ZSBpZiB0aGVcclxuICogdG9rZW4gaXMgd2l0aGluIHRoZSB0aW1lIHdpbmRvdyBhdXRob3JpemVkIGJ5IHRoZSAnbmJmJyAobm90LWJlZm9yZSkgYW5kICdpYXQnIChpc3N1ZWQtYXQpIGNsYWltcy5cclxuICpcclxuICogTm90ZXM6XHJcbiAqIC0gTWF5IHJldHVybiBhIGZhbHNlIG5lZ2F0aXZlIGlmIHRoZXJlJ3Mgbm8gbmF0aXZlIGJhc2U2NCBkZWNvZGluZyBzdXBwb3J0LlxyXG4gKiAtIERvZXNuJ3QgY2hlY2sgaWYgdGhlIHRva2VuIGlzIGFjdHVhbGx5IHZhbGlkLlxyXG4gKi9cclxuY29uc3QgaXNWYWxpZFRpbWVzdGFtcCA9IGZ1bmN0aW9uICh0b2tlbikge1xyXG4gICAgY29uc3QgY2xhaW1zID0gZGVjb2RlKHRva2VuKS5jbGFpbXM7XHJcbiAgICBjb25zdCBub3cgPSBNYXRoLmZsb29yKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMCk7XHJcbiAgICBsZXQgdmFsaWRTaW5jZSA9IDAsIHZhbGlkVW50aWwgPSAwO1xyXG4gICAgaWYgKHR5cGVvZiBjbGFpbXMgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgaWYgKGNsYWltcy5oYXNPd25Qcm9wZXJ0eSgnbmJmJykpIHtcclxuICAgICAgICAgICAgdmFsaWRTaW5jZSA9IGNsYWltc1snbmJmJ107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNsYWltcy5oYXNPd25Qcm9wZXJ0eSgnaWF0JykpIHtcclxuICAgICAgICAgICAgdmFsaWRTaW5jZSA9IGNsYWltc1snaWF0J107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjbGFpbXMuaGFzT3duUHJvcGVydHkoJ2V4cCcpKSB7XHJcbiAgICAgICAgICAgIHZhbGlkVW50aWwgPSBjbGFpbXNbJ2V4cCddO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gdG9rZW4gd2lsbCBleHBpcmUgYWZ0ZXIgMjRoIGJ5IGRlZmF1bHRcclxuICAgICAgICAgICAgdmFsaWRVbnRpbCA9IHZhbGlkU2luY2UgKyA4NjQwMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gKCEhbm93ICYmXHJcbiAgICAgICAgISF2YWxpZFNpbmNlICYmXHJcbiAgICAgICAgISF2YWxpZFVudGlsICYmXHJcbiAgICAgICAgbm93ID49IHZhbGlkU2luY2UgJiZcclxuICAgICAgICBub3cgPD0gdmFsaWRVbnRpbCk7XHJcbn07XHJcbi8qKlxyXG4gKiBEZWNvZGVzIGEgRmlyZWJhc2UgYXV0aC4gdG9rZW4gYW5kIHJldHVybnMgaXRzIGlzc3VlZCBhdCB0aW1lIGlmIHZhbGlkLCBudWxsIG90aGVyd2lzZS5cclxuICpcclxuICogTm90ZXM6XHJcbiAqIC0gTWF5IHJldHVybiBudWxsIGlmIHRoZXJlJ3Mgbm8gbmF0aXZlIGJhc2U2NCBkZWNvZGluZyBzdXBwb3J0LlxyXG4gKiAtIERvZXNuJ3QgY2hlY2sgaWYgdGhlIHRva2VuIGlzIGFjdHVhbGx5IHZhbGlkLlxyXG4gKi9cclxuY29uc3QgaXNzdWVkQXRUaW1lID0gZnVuY3Rpb24gKHRva2VuKSB7XHJcbiAgICBjb25zdCBjbGFpbXMgPSBkZWNvZGUodG9rZW4pLmNsYWltcztcclxuICAgIGlmICh0eXBlb2YgY2xhaW1zID09PSAnb2JqZWN0JyAmJiBjbGFpbXMuaGFzT3duUHJvcGVydHkoJ2lhdCcpKSB7XHJcbiAgICAgICAgcmV0dXJuIGNsYWltc1snaWF0J107XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxufTtcclxuLyoqXHJcbiAqIERlY29kZXMgYSBGaXJlYmFzZSBhdXRoLiB0b2tlbiBhbmQgY2hlY2tzIHRoZSB2YWxpZGl0eSBvZiBpdHMgZm9ybWF0LiBFeHBlY3RzIGEgdmFsaWQgaXNzdWVkLWF0IHRpbWUuXHJcbiAqXHJcbiAqIE5vdGVzOlxyXG4gKiAtIE1heSByZXR1cm4gYSBmYWxzZSBuZWdhdGl2ZSBpZiB0aGVyZSdzIG5vIG5hdGl2ZSBiYXNlNjQgZGVjb2Rpbmcgc3VwcG9ydC5cclxuICogLSBEb2Vzbid0IGNoZWNrIGlmIHRoZSB0b2tlbiBpcyBhY3R1YWxseSB2YWxpZC5cclxuICovXHJcbmNvbnN0IGlzVmFsaWRGb3JtYXQgPSBmdW5jdGlvbiAodG9rZW4pIHtcclxuICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGUodG9rZW4pLCBjbGFpbXMgPSBkZWNvZGVkLmNsYWltcztcclxuICAgIHJldHVybiAhIWNsYWltcyAmJiB0eXBlb2YgY2xhaW1zID09PSAnb2JqZWN0JyAmJiBjbGFpbXMuaGFzT3duUHJvcGVydHkoJ2lhdCcpO1xyXG59O1xyXG4vKipcclxuICogQXR0ZW1wdHMgdG8gcGVlciBpbnRvIGFuIGF1dGggdG9rZW4gYW5kIGRldGVybWluZSBpZiBpdCdzIGFuIGFkbWluIGF1dGggdG9rZW4gYnkgbG9va2luZyBhdCB0aGUgY2xhaW1zIHBvcnRpb24uXHJcbiAqXHJcbiAqIE5vdGVzOlxyXG4gKiAtIE1heSByZXR1cm4gYSBmYWxzZSBuZWdhdGl2ZSBpZiB0aGVyZSdzIG5vIG5hdGl2ZSBiYXNlNjQgZGVjb2Rpbmcgc3VwcG9ydC5cclxuICogLSBEb2Vzbid0IGNoZWNrIGlmIHRoZSB0b2tlbiBpcyBhY3R1YWxseSB2YWxpZC5cclxuICovXHJcbmNvbnN0IGlzQWRtaW4gPSBmdW5jdGlvbiAodG9rZW4pIHtcclxuICAgIGNvbnN0IGNsYWltcyA9IGRlY29kZSh0b2tlbikuY2xhaW1zO1xyXG4gICAgcmV0dXJuIHR5cGVvZiBjbGFpbXMgPT09ICdvYmplY3QnICYmIGNsYWltc1snYWRtaW4nXSA9PT0gdHJ1ZTtcclxufTtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gY29udGFpbnMob2JqLCBrZXkpIHtcclxuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpO1xyXG59XHJcbmZ1bmN0aW9uIHNhZmVHZXQob2JqLCBrZXkpIHtcclxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XHJcbiAgICAgICAgcmV0dXJuIG9ialtrZXldO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBpc0VtcHR5KG9iaikge1xyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XHJcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcbmZ1bmN0aW9uIG1hcChvYmosIGZuLCBjb250ZXh0T2JqKSB7XHJcbiAgICBjb25zdCByZXMgPSB7fTtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xyXG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XHJcbiAgICAgICAgICAgIHJlc1trZXldID0gZm4uY2FsbChjb250ZXh0T2JqLCBvYmpba2V5XSwga2V5LCBvYmopO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbn1cclxuLyoqXHJcbiAqIERlZXAgZXF1YWwgdHdvIG9iamVjdHMuIFN1cHBvcnQgQXJyYXlzIGFuZCBPYmplY3RzLlxyXG4gKi9cclxuZnVuY3Rpb24gZGVlcEVxdWFsKGEsIGIpIHtcclxuICAgIGlmIChhID09PSBiKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBjb25zdCBhS2V5cyA9IE9iamVjdC5rZXlzKGEpO1xyXG4gICAgY29uc3QgYktleXMgPSBPYmplY3Qua2V5cyhiKTtcclxuICAgIGZvciAoY29uc3QgayBvZiBhS2V5cykge1xyXG4gICAgICAgIGlmICghYktleXMuaW5jbHVkZXMoaykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBhUHJvcCA9IGFba107XHJcbiAgICAgICAgY29uc3QgYlByb3AgPSBiW2tdO1xyXG4gICAgICAgIGlmIChpc09iamVjdChhUHJvcCkgJiYgaXNPYmplY3QoYlByb3ApKSB7XHJcbiAgICAgICAgICAgIGlmICghZGVlcEVxdWFsKGFQcm9wLCBiUHJvcCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChhUHJvcCAhPT0gYlByb3ApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZvciAoY29uc3QgayBvZiBiS2V5cykge1xyXG4gICAgICAgIGlmICghYUtleXMuaW5jbHVkZXMoaykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcbmZ1bmN0aW9uIGlzT2JqZWN0KHRoaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpbmcgIT09IG51bGwgJiYgdHlwZW9mIHRoaW5nID09PSAnb2JqZWN0JztcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogUmV0dXJucyBhIHF1ZXJ5c3RyaW5nLWZvcm1hdHRlZCBzdHJpbmcgKGUuZy4gJmFyZz12YWwmYXJnMj12YWwyKSBmcm9tIGFcclxuICogcGFyYW1zIG9iamVjdCAoZS5nLiB7YXJnOiAndmFsJywgYXJnMjogJ3ZhbDInfSlcclxuICogTm90ZTogWW91IG11c3QgcHJlcGVuZCBpdCB3aXRoID8gd2hlbiBhZGRpbmcgaXQgdG8gYSBVUkwuXHJcbiAqL1xyXG5mdW5jdGlvbiBxdWVyeXN0cmluZyhxdWVyeXN0cmluZ1BhcmFtcykge1xyXG4gICAgY29uc3QgcGFyYW1zID0gW107XHJcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhxdWVyeXN0cmluZ1BhcmFtcykpIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgdmFsdWUuZm9yRWFjaChhcnJheVZhbCA9PiB7XHJcbiAgICAgICAgICAgICAgICBwYXJhbXMucHVzaChlbmNvZGVVUklDb21wb25lbnQoa2V5KSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChhcnJheVZhbCkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHBhcmFtcy5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBhcmFtcy5sZW5ndGggPyAnJicgKyBwYXJhbXMuam9pbignJicpIDogJyc7XHJcbn1cclxuLyoqXHJcbiAqIERlY29kZXMgYSBxdWVyeXN0cmluZyAoZS5nLiA/YXJnPXZhbCZhcmcyPXZhbDIpIGludG8gYSBwYXJhbXMgb2JqZWN0XHJcbiAqIChlLmcuIHthcmc6ICd2YWwnLCBhcmcyOiAndmFsMid9KVxyXG4gKi9cclxuZnVuY3Rpb24gcXVlcnlzdHJpbmdEZWNvZGUocXVlcnlzdHJpbmcpIHtcclxuICAgIGNvbnN0IG9iaiA9IHt9O1xyXG4gICAgY29uc3QgdG9rZW5zID0gcXVlcnlzdHJpbmcucmVwbGFjZSgvXlxcPy8sICcnKS5zcGxpdCgnJicpO1xyXG4gICAgdG9rZW5zLmZvckVhY2godG9rZW4gPT4ge1xyXG4gICAgICAgIGlmICh0b2tlbikge1xyXG4gICAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSB0b2tlbi5zcGxpdCgnPScpO1xyXG4gICAgICAgICAgICBvYmpbZGVjb2RlVVJJQ29tcG9uZW50KGtleSldID0gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBvYmo7XHJcbn1cclxuLyoqXHJcbiAqIEV4dHJhY3QgdGhlIHF1ZXJ5IHN0cmluZyBwYXJ0IG9mIGEgVVJMLCBpbmNsdWRpbmcgdGhlIGxlYWRpbmcgcXVlc3Rpb24gbWFyayAoaWYgcHJlc2VudCkuXHJcbiAqL1xyXG5mdW5jdGlvbiBleHRyYWN0UXVlcnlzdHJpbmcodXJsKSB7XHJcbiAgICBjb25zdCBxdWVyeVN0YXJ0ID0gdXJsLmluZGV4T2YoJz8nKTtcclxuICAgIGlmICghcXVlcnlTdGFydCkge1xyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuICAgIGNvbnN0IGZyYWdtZW50U3RhcnQgPSB1cmwuaW5kZXhPZignIycsIHF1ZXJ5U3RhcnQpO1xyXG4gICAgcmV0dXJuIHVybC5zdWJzdHJpbmcocXVlcnlTdGFydCwgZnJhZ21lbnRTdGFydCA+IDAgPyBmcmFnbWVudFN0YXJ0IDogdW5kZWZpbmVkKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogQGZpbGVvdmVydmlldyBTSEEtMSBjcnlwdG9ncmFwaGljIGhhc2guXHJcbiAqIFZhcmlhYmxlIG5hbWVzIGZvbGxvdyB0aGUgbm90YXRpb24gaW4gRklQUyBQVUIgMTgwLTM6XHJcbiAqIGh0dHA6Ly9jc3JjLm5pc3QuZ292L3B1YmxpY2F0aW9ucy9maXBzL2ZpcHMxODAtMy9maXBzMTgwLTNfZmluYWwucGRmLlxyXG4gKlxyXG4gKiBVc2FnZTpcclxuICogICB2YXIgc2hhMSA9IG5ldyBzaGExKCk7XHJcbiAqICAgc2hhMS51cGRhdGUoYnl0ZXMpO1xyXG4gKiAgIHZhciBoYXNoID0gc2hhMS5kaWdlc3QoKTtcclxuICpcclxuICogUGVyZm9ybWFuY2U6XHJcbiAqICAgQ2hyb21lIDIzOiAgIH40MDAgTWJpdC9zXHJcbiAqICAgRmlyZWZveCAxNjogIH4yNTAgTWJpdC9zXHJcbiAqXHJcbiAqL1xyXG4vKipcclxuICogU0hBLTEgY3J5cHRvZ3JhcGhpYyBoYXNoIGNvbnN0cnVjdG9yLlxyXG4gKlxyXG4gKiBUaGUgcHJvcGVydGllcyBkZWNsYXJlZCBoZXJlIGFyZSBkaXNjdXNzZWQgaW4gdGhlIGFib3ZlIGFsZ29yaXRobSBkb2N1bWVudC5cclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBmaW5hbFxyXG4gKiBAc3RydWN0XHJcbiAqL1xyXG5jbGFzcyBTaGExIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEhvbGRzIHRoZSBwcmV2aW91cyB2YWx1ZXMgb2YgYWNjdW11bGF0ZWQgdmFyaWFibGVzIGEtZSBpbiB0aGUgY29tcHJlc3NfXHJcbiAgICAgICAgICogZnVuY3Rpb24uXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNoYWluXyA9IFtdO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgYnVmZmVyIGhvbGRpbmcgdGhlIHBhcnRpYWxseSBjb21wdXRlZCBoYXNoIHJlc3VsdC5cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYnVmXyA9IFtdO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGFycmF5IG9mIDgwIGJ5dGVzLCBlYWNoIGEgcGFydCBvZiB0aGUgbWVzc2FnZSB0byBiZSBoYXNoZWQuICBSZWZlcnJlZCB0b1xyXG4gICAgICAgICAqIGFzIHRoZSBtZXNzYWdlIHNjaGVkdWxlIGluIHRoZSBkb2NzLlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5XXyA9IFtdO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIENvbnRhaW5zIGRhdGEgbmVlZGVkIHRvIHBhZCBtZXNzYWdlcyBsZXNzIHRoYW4gNjQgYnl0ZXMuXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBhZF8gPSBbXTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHJpdmF0ZSB7bnVtYmVyfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaW5idWZfID0gMDtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHJpdmF0ZSB7bnVtYmVyfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudG90YWxfID0gMDtcclxuICAgICAgICB0aGlzLmJsb2NrU2l6ZSA9IDUxMiAvIDg7XHJcbiAgICAgICAgdGhpcy5wYWRfWzBdID0gMTI4O1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5ibG9ja1NpemU7ICsraSkge1xyXG4gICAgICAgICAgICB0aGlzLnBhZF9baV0gPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJlc2V0KCk7XHJcbiAgICB9XHJcbiAgICByZXNldCgpIHtcclxuICAgICAgICB0aGlzLmNoYWluX1swXSA9IDB4Njc0NTIzMDE7XHJcbiAgICAgICAgdGhpcy5jaGFpbl9bMV0gPSAweGVmY2RhYjg5O1xyXG4gICAgICAgIHRoaXMuY2hhaW5fWzJdID0gMHg5OGJhZGNmZTtcclxuICAgICAgICB0aGlzLmNoYWluX1szXSA9IDB4MTAzMjU0NzY7XHJcbiAgICAgICAgdGhpcy5jaGFpbl9bNF0gPSAweGMzZDJlMWYwO1xyXG4gICAgICAgIHRoaXMuaW5idWZfID0gMDtcclxuICAgICAgICB0aGlzLnRvdGFsXyA9IDA7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIGNvbXByZXNzIGhlbHBlciBmdW5jdGlvbi5cclxuICAgICAqIEBwYXJhbSBidWYgQmxvY2sgdG8gY29tcHJlc3MuXHJcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IE9mZnNldCBvZiB0aGUgYmxvY2sgaW4gdGhlIGJ1ZmZlci5cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIGNvbXByZXNzXyhidWYsIG9mZnNldCkge1xyXG4gICAgICAgIGlmICghb2Zmc2V0KSB7XHJcbiAgICAgICAgICAgIG9mZnNldCA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IFcgPSB0aGlzLldfO1xyXG4gICAgICAgIC8vIGdldCAxNiBiaWcgZW5kaWFuIHdvcmRzXHJcbiAgICAgICAgaWYgKHR5cGVvZiBidWYgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgLy8gVE9ETyh1c2VyKTogW2J1ZyA4MTQwMTIyXSBSZWNlbnQgdmVyc2lvbnMgb2YgU2FmYXJpIGZvciBNYWMgT1MgYW5kIGlPU1xyXG4gICAgICAgICAgICAgICAgLy8gaGF2ZSBhIGJ1ZyB0aGF0IHR1cm5zIHRoZSBwb3N0LWluY3JlbWVudCArKyBvcGVyYXRvciBpbnRvIHByZS1pbmNyZW1lbnRcclxuICAgICAgICAgICAgICAgIC8vIGR1cmluZyBKSVQgY29tcGlsYXRpb24uICBXZSBoYXZlIGNvZGUgdGhhdCBkZXBlbmRzIGhlYXZpbHkgb24gU0hBLTEgZm9yXHJcbiAgICAgICAgICAgICAgICAvLyBjb3JyZWN0bmVzcyBhbmQgd2hpY2ggaXMgYWZmZWN0ZWQgYnkgdGhpcyBidWcsIHNvIEkndmUgcmVtb3ZlZCBhbGwgdXNlc1xyXG4gICAgICAgICAgICAgICAgLy8gb2YgcG9zdC1pbmNyZW1lbnQgKysgaW4gd2hpY2ggdGhlIHJlc3VsdCB2YWx1ZSBpcyB1c2VkLiAgV2UgY2FuIHJldmVydFxyXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBjaGFuZ2Ugb25jZSB0aGUgU2FmYXJpIGJ1Z1xyXG4gICAgICAgICAgICAgICAgLy8gKGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMDkwMzYpIGhhcyBiZWVuIGZpeGVkIGFuZFxyXG4gICAgICAgICAgICAgICAgLy8gbW9zdCBjbGllbnRzIGhhdmUgYmVlbiB1cGRhdGVkLlxyXG4gICAgICAgICAgICAgICAgV1tpXSA9XHJcbiAgICAgICAgICAgICAgICAgICAgKGJ1Zi5jaGFyQ29kZUF0KG9mZnNldCkgPDwgMjQpIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGJ1Zi5jaGFyQ29kZUF0KG9mZnNldCArIDEpIDw8IDE2KSB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChidWYuY2hhckNvZGVBdChvZmZzZXQgKyAyKSA8PCA4KSB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5jaGFyQ29kZUF0KG9mZnNldCArIDMpO1xyXG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgV1tpXSA9XHJcbiAgICAgICAgICAgICAgICAgICAgKGJ1ZltvZmZzZXRdIDw8IDI0KSB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChidWZbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZltvZmZzZXQgKyAyXSA8PCA4KSB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZltvZmZzZXQgKyAzXTtcclxuICAgICAgICAgICAgICAgIG9mZnNldCArPSA0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGV4cGFuZCB0byA4MCB3b3Jkc1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAxNjsgaSA8IDgwOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgdCA9IFdbaSAtIDNdIF4gV1tpIC0gOF0gXiBXW2kgLSAxNF0gXiBXW2kgLSAxNl07XHJcbiAgICAgICAgICAgIFdbaV0gPSAoKHQgPDwgMSkgfCAodCA+Pj4gMzEpKSAmIDB4ZmZmZmZmZmY7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBhID0gdGhpcy5jaGFpbl9bMF07XHJcbiAgICAgICAgbGV0IGIgPSB0aGlzLmNoYWluX1sxXTtcclxuICAgICAgICBsZXQgYyA9IHRoaXMuY2hhaW5fWzJdO1xyXG4gICAgICAgIGxldCBkID0gdGhpcy5jaGFpbl9bM107XHJcbiAgICAgICAgbGV0IGUgPSB0aGlzLmNoYWluX1s0XTtcclxuICAgICAgICBsZXQgZiwgaztcclxuICAgICAgICAvLyBUT0RPKHVzZXIpOiBUcnkgdG8gdW5yb2xsIHRoaXMgbG9vcCB0byBzcGVlZCB1cCB0aGUgY29tcHV0YXRpb24uXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA4MDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChpIDwgNDApIHtcclxuICAgICAgICAgICAgICAgIGlmIChpIDwgMjApIHtcclxuICAgICAgICAgICAgICAgICAgICBmID0gZCBeIChiICYgKGMgXiBkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgayA9IDB4NWE4Mjc5OTk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBmID0gYiBeIGMgXiBkO1xyXG4gICAgICAgICAgICAgICAgICAgIGsgPSAweDZlZDllYmExO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGkgPCA2MCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGYgPSAoYiAmIGMpIHwgKGQgJiAoYiB8IGMpKTtcclxuICAgICAgICAgICAgICAgICAgICBrID0gMHg4ZjFiYmNkYztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGYgPSBiIF4gYyBeIGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgayA9IDB4Y2E2MmMxZDY7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgdCA9ICgoKGEgPDwgNSkgfCAoYSA+Pj4gMjcpKSArIGYgKyBlICsgayArIFdbaV0pICYgMHhmZmZmZmZmZjtcclxuICAgICAgICAgICAgZSA9IGQ7XHJcbiAgICAgICAgICAgIGQgPSBjO1xyXG4gICAgICAgICAgICBjID0gKChiIDw8IDMwKSB8IChiID4+PiAyKSkgJiAweGZmZmZmZmZmO1xyXG4gICAgICAgICAgICBiID0gYTtcclxuICAgICAgICAgICAgYSA9IHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2hhaW5fWzBdID0gKHRoaXMuY2hhaW5fWzBdICsgYSkgJiAweGZmZmZmZmZmO1xyXG4gICAgICAgIHRoaXMuY2hhaW5fWzFdID0gKHRoaXMuY2hhaW5fWzFdICsgYikgJiAweGZmZmZmZmZmO1xyXG4gICAgICAgIHRoaXMuY2hhaW5fWzJdID0gKHRoaXMuY2hhaW5fWzJdICsgYykgJiAweGZmZmZmZmZmO1xyXG4gICAgICAgIHRoaXMuY2hhaW5fWzNdID0gKHRoaXMuY2hhaW5fWzNdICsgZCkgJiAweGZmZmZmZmZmO1xyXG4gICAgICAgIHRoaXMuY2hhaW5fWzRdID0gKHRoaXMuY2hhaW5fWzRdICsgZSkgJiAweGZmZmZmZmZmO1xyXG4gICAgfVxyXG4gICAgdXBkYXRlKGJ5dGVzLCBsZW5ndGgpIHtcclxuICAgICAgICAvLyBUT0RPKGpvaG5sZW56KTogdGlnaHRlbiB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlIGFuZCByZW1vdmUgdGhpcyBjaGVja1xyXG4gICAgICAgIGlmIChieXRlcyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGxlbmd0aCA9IGJ5dGVzLmxlbmd0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoTWludXNCbG9jayA9IGxlbmd0aCAtIHRoaXMuYmxvY2tTaXplO1xyXG4gICAgICAgIGxldCBuID0gMDtcclxuICAgICAgICAvLyBVc2luZyBsb2NhbCBpbnN0ZWFkIG9mIG1lbWJlciB2YXJpYWJsZXMgZ2l2ZXMgfjUlIHNwZWVkdXAgb24gRmlyZWZveCAxNi5cclxuICAgICAgICBjb25zdCBidWYgPSB0aGlzLmJ1Zl87XHJcbiAgICAgICAgbGV0IGluYnVmID0gdGhpcy5pbmJ1Zl87XHJcbiAgICAgICAgLy8gVGhlIG91dGVyIHdoaWxlIGxvb3Agc2hvdWxkIGV4ZWN1dGUgYXQgbW9zdCB0d2ljZS5cclxuICAgICAgICB3aGlsZSAobiA8IGxlbmd0aCkge1xyXG4gICAgICAgICAgICAvLyBXaGVuIHdlIGhhdmUgbm8gZGF0YSBpbiB0aGUgYmxvY2sgdG8gdG9wIHVwLCB3ZSBjYW4gZGlyZWN0bHkgcHJvY2VzcyB0aGVcclxuICAgICAgICAgICAgLy8gaW5wdXQgYnVmZmVyIChhc3N1bWluZyBpdCBjb250YWlucyBzdWZmaWNpZW50IGRhdGEpLiBUaGlzIGdpdmVzIH4yNSVcclxuICAgICAgICAgICAgLy8gc3BlZWR1cCBvbiBDaHJvbWUgMjMgYW5kIH4xNSUgc3BlZWR1cCBvbiBGaXJlZm94IDE2LCBidXQgcmVxdWlyZXMgdGhhdFxyXG4gICAgICAgICAgICAvLyB0aGUgZGF0YSBpcyBwcm92aWRlZCBpbiBsYXJnZSBjaHVua3MgKG9yIGluIG11bHRpcGxlcyBvZiA2NCBieXRlcykuXHJcbiAgICAgICAgICAgIGlmIChpbmJ1ZiA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKG4gPD0gbGVuZ3RoTWludXNCbG9jaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcHJlc3NfKGJ5dGVzLCBuKTtcclxuICAgICAgICAgICAgICAgICAgICBuICs9IHRoaXMuYmxvY2tTaXplO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAobiA8IGxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJ1ZltpbmJ1Zl0gPSBieXRlcy5jaGFyQ29kZUF0KG4pO1xyXG4gICAgICAgICAgICAgICAgICAgICsraW5idWY7XHJcbiAgICAgICAgICAgICAgICAgICAgKytuO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmJ1ZiA9PT0gdGhpcy5ibG9ja1NpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wcmVzc18oYnVmKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5idWYgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBKdW1wIHRvIHRoZSBvdXRlciBsb29wIHNvIHdlIHVzZSB0aGUgZnVsbC1ibG9jayBvcHRpbWl6YXRpb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChuIDwgbGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnVmW2luYnVmXSA9IGJ5dGVzW25dO1xyXG4gICAgICAgICAgICAgICAgICAgICsraW5idWY7XHJcbiAgICAgICAgICAgICAgICAgICAgKytuO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmJ1ZiA9PT0gdGhpcy5ibG9ja1NpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wcmVzc18oYnVmKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5idWYgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBKdW1wIHRvIHRoZSBvdXRlciBsb29wIHNvIHdlIHVzZSB0aGUgZnVsbC1ibG9jayBvcHRpbWl6YXRpb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmluYnVmXyA9IGluYnVmO1xyXG4gICAgICAgIHRoaXMudG90YWxfICs9IGxlbmd0aDtcclxuICAgIH1cclxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cclxuICAgIGRpZ2VzdCgpIHtcclxuICAgICAgICBjb25zdCBkaWdlc3QgPSBbXTtcclxuICAgICAgICBsZXQgdG90YWxCaXRzID0gdGhpcy50b3RhbF8gKiA4O1xyXG4gICAgICAgIC8vIEFkZCBwYWQgMHg4MCAweDAwKi5cclxuICAgICAgICBpZiAodGhpcy5pbmJ1Zl8gPCA1Nikge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSh0aGlzLnBhZF8sIDU2IC0gdGhpcy5pbmJ1Zl8pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGUodGhpcy5wYWRfLCB0aGlzLmJsb2NrU2l6ZSAtICh0aGlzLmluYnVmXyAtIDU2KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEFkZCAjIGJpdHMuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuYmxvY2tTaXplIC0gMTsgaSA+PSA1NjsgaS0tKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYnVmX1tpXSA9IHRvdGFsQml0cyAmIDI1NTtcclxuICAgICAgICAgICAgdG90YWxCaXRzIC89IDI1NjsgLy8gRG9uJ3QgdXNlIGJpdC1zaGlmdGluZyBoZXJlIVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNvbXByZXNzXyh0aGlzLmJ1Zl8pO1xyXG4gICAgICAgIGxldCBuID0gMDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDU7IGkrKykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMjQ7IGogPj0gMDsgaiAtPSA4KSB7XHJcbiAgICAgICAgICAgICAgICBkaWdlc3Rbbl0gPSAodGhpcy5jaGFpbl9baV0gPj4gaikgJiAyNTU7XHJcbiAgICAgICAgICAgICAgICArK247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRpZ2VzdDtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogSGVscGVyIHRvIG1ha2UgYSBTdWJzY3JpYmUgZnVuY3Rpb24gKGp1c3QgbGlrZSBQcm9taXNlIGhlbHBzIG1ha2UgYVxyXG4gKiBUaGVuYWJsZSkuXHJcbiAqXHJcbiAqIEBwYXJhbSBleGVjdXRvciBGdW5jdGlvbiB3aGljaCBjYW4gbWFrZSBjYWxscyB0byBhIHNpbmdsZSBPYnNlcnZlclxyXG4gKiAgICAgYXMgYSBwcm94eS5cclxuICogQHBhcmFtIG9uTm9PYnNlcnZlcnMgQ2FsbGJhY2sgd2hlbiBjb3VudCBvZiBPYnNlcnZlcnMgZ29lcyB0byB6ZXJvLlxyXG4gKi9cclxuZnVuY3Rpb24gY3JlYXRlU3Vic2NyaWJlKGV4ZWN1dG9yLCBvbk5vT2JzZXJ2ZXJzKSB7XHJcbiAgICBjb25zdCBwcm94eSA9IG5ldyBPYnNlcnZlclByb3h5KGV4ZWN1dG9yLCBvbk5vT2JzZXJ2ZXJzKTtcclxuICAgIHJldHVybiBwcm94eS5zdWJzY3JpYmUuYmluZChwcm94eSk7XHJcbn1cclxuLyoqXHJcbiAqIEltcGxlbWVudCBmYW4tb3V0IGZvciBhbnkgbnVtYmVyIG9mIE9ic2VydmVycyBhdHRhY2hlZCB2aWEgYSBzdWJzY3JpYmVcclxuICogZnVuY3Rpb24uXHJcbiAqL1xyXG5jbGFzcyBPYnNlcnZlclByb3h5IHtcclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIGV4ZWN1dG9yIEZ1bmN0aW9uIHdoaWNoIGNhbiBtYWtlIGNhbGxzIHRvIGEgc2luZ2xlIE9ic2VydmVyXHJcbiAgICAgKiAgICAgYXMgYSBwcm94eS5cclxuICAgICAqIEBwYXJhbSBvbk5vT2JzZXJ2ZXJzIENhbGxiYWNrIHdoZW4gY291bnQgb2YgT2JzZXJ2ZXJzIGdvZXMgdG8gemVyby5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoZXhlY3V0b3IsIG9uTm9PYnNlcnZlcnMpIHtcclxuICAgICAgICB0aGlzLm9ic2VydmVycyA9IFtdO1xyXG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmVzID0gW107XHJcbiAgICAgICAgdGhpcy5vYnNlcnZlckNvdW50ID0gMDtcclxuICAgICAgICAvLyBNaWNyby10YXNrIHNjaGVkdWxpbmcgYnkgY2FsbGluZyB0YXNrLnRoZW4oKS5cclxuICAgICAgICB0aGlzLnRhc2sgPSBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICB0aGlzLmZpbmFsaXplZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMub25Ob09ic2VydmVycyA9IG9uTm9PYnNlcnZlcnM7XHJcbiAgICAgICAgLy8gQ2FsbCB0aGUgZXhlY3V0b3IgYXN5bmNocm9ub3VzbHkgc28gc3Vic2NyaWJlcnMgdGhhdCBhcmUgY2FsbGVkXHJcbiAgICAgICAgLy8gc3luY2hyb25vdXNseSBhZnRlciB0aGUgY3JlYXRpb24gb2YgdGhlIHN1YnNjcmliZSBmdW5jdGlvblxyXG4gICAgICAgIC8vIGNhbiBzdGlsbCByZWNlaXZlIHRoZSB2ZXJ5IGZpcnN0IHZhbHVlIGdlbmVyYXRlZCBpbiB0aGUgZXhlY3V0b3IuXHJcbiAgICAgICAgdGhpcy50YXNrXHJcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgZXhlY3V0b3IodGhpcyk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAgICAgLmNhdGNoKGUgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yKGUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgbmV4dCh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuZm9yRWFjaE9ic2VydmVyKChvYnNlcnZlcikgPT4ge1xyXG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KHZhbHVlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGVycm9yKGVycm9yKSB7XHJcbiAgICAgICAgdGhpcy5mb3JFYWNoT2JzZXJ2ZXIoKG9ic2VydmVyKSA9PiB7XHJcbiAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGVycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmNsb3NlKGVycm9yKTtcclxuICAgIH1cclxuICAgIGNvbXBsZXRlKCkge1xyXG4gICAgICAgIHRoaXMuZm9yRWFjaE9ic2VydmVyKChvYnNlcnZlcikgPT4ge1xyXG4gICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU3Vic2NyaWJlIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gYWRkIGFuIE9ic2VydmVyIHRvIHRoZSBmYW4tb3V0IGxpc3QuXHJcbiAgICAgKlxyXG4gICAgICogLSBXZSByZXF1aXJlIHRoYXQgbm8gZXZlbnQgaXMgc2VudCB0byBhIHN1YnNjcmliZXIgc3ljaHJvbm91c2x5IHRvIHRoZWlyXHJcbiAgICAgKiAgIGNhbGwgdG8gc3Vic2NyaWJlKCkuXHJcbiAgICAgKi9cclxuICAgIHN1YnNjcmliZShuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlKSB7XHJcbiAgICAgICAgbGV0IG9ic2VydmVyO1xyXG4gICAgICAgIGlmIChuZXh0T3JPYnNlcnZlciA9PT0gdW5kZWZpbmVkICYmXHJcbiAgICAgICAgICAgIGVycm9yID09PSB1bmRlZmluZWQgJiZcclxuICAgICAgICAgICAgY29tcGxldGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgT2JzZXJ2ZXIuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEFzc2VtYmxlIGFuIE9ic2VydmVyIG9iamVjdCB3aGVuIHBhc3NlZCBhcyBjYWxsYmFjayBmdW5jdGlvbnMuXHJcbiAgICAgICAgaWYgKGltcGxlbWVudHNBbnlNZXRob2RzKG5leHRPck9ic2VydmVyLCBbXHJcbiAgICAgICAgICAgICduZXh0JyxcclxuICAgICAgICAgICAgJ2Vycm9yJyxcclxuICAgICAgICAgICAgJ2NvbXBsZXRlJ1xyXG4gICAgICAgIF0pKSB7XHJcbiAgICAgICAgICAgIG9ic2VydmVyID0gbmV4dE9yT2JzZXJ2ZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvYnNlcnZlciA9IHtcclxuICAgICAgICAgICAgICAgIG5leHQ6IG5leHRPck9ic2VydmVyLFxyXG4gICAgICAgICAgICAgICAgZXJyb3IsXHJcbiAgICAgICAgICAgICAgICBjb21wbGV0ZVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob2JzZXJ2ZXIubmV4dCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQgPSBub29wO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob2JzZXJ2ZXIuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBvYnNlcnZlci5lcnJvciA9IG5vb3A7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvYnNlcnZlci5jb21wbGV0ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlID0gbm9vcDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdW5zdWIgPSB0aGlzLnVuc3Vic2NyaWJlT25lLmJpbmQodGhpcywgdGhpcy5vYnNlcnZlcnMubGVuZ3RoKTtcclxuICAgICAgICAvLyBBdHRlbXB0IHRvIHN1YnNjcmliZSB0byBhIHRlcm1pbmF0ZWQgT2JzZXJ2YWJsZSAtIHdlXHJcbiAgICAgICAgLy8ganVzdCByZXNwb25kIHRvIHRoZSBPYnNlcnZlciB3aXRoIHRoZSBmaW5hbCBlcnJvciBvciBjb21wbGV0ZVxyXG4gICAgICAgIC8vIGV2ZW50LlxyXG4gICAgICAgIGlmICh0aGlzLmZpbmFsaXplZCkge1xyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXHJcbiAgICAgICAgICAgIHRoaXMudGFzay50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmluYWxFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcih0aGlzLmZpbmFsRXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmdcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2gob2JzZXJ2ZXIpO1xyXG4gICAgICAgIHJldHVybiB1bnN1YjtcclxuICAgIH1cclxuICAgIC8vIFVuc3Vic2NyaWJlIGlzIHN5bmNocm9ub3VzIC0gd2UgZ3VhcmFudGVlIHRoYXQgbm8gZXZlbnRzIGFyZSBzZW50IHRvXHJcbiAgICAvLyBhbnkgdW5zdWJzY3JpYmVkIE9ic2VydmVyLlxyXG4gICAgdW5zdWJzY3JpYmVPbmUoaSkge1xyXG4gICAgICAgIGlmICh0aGlzLm9ic2VydmVycyA9PT0gdW5kZWZpbmVkIHx8IHRoaXMub2JzZXJ2ZXJzW2ldID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkZWxldGUgdGhpcy5vYnNlcnZlcnNbaV07XHJcbiAgICAgICAgdGhpcy5vYnNlcnZlckNvdW50IC09IDE7XHJcbiAgICAgICAgaWYgKHRoaXMub2JzZXJ2ZXJDb3VudCA9PT0gMCAmJiB0aGlzLm9uTm9PYnNlcnZlcnMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm9uTm9PYnNlcnZlcnModGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZm9yRWFjaE9ic2VydmVyKGZuKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZmluYWxpemVkKSB7XHJcbiAgICAgICAgICAgIC8vIEFscmVhZHkgY2xvc2VkIGJ5IHByZXZpb3VzIGV2ZW50Li4uLmp1c3QgZWF0IHRoZSBhZGRpdGlvbmFsIHZhbHVlcy5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBTaW5jZSBzZW5kT25lIGNhbGxzIGFzeW5jaHJvbm91c2x5IC0gdGhlcmUgaXMgbm8gY2hhbmNlIHRoYXRcclxuICAgICAgICAvLyB0aGlzLm9ic2VydmVycyB3aWxsIGJlY29tZSB1bmRlZmluZWQuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9ic2VydmVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLnNlbmRPbmUoaSwgZm4pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIENhbGwgdGhlIE9ic2VydmVyIHZpYSBvbmUgb2YgaXQncyBjYWxsYmFjayBmdW5jdGlvbi4gV2UgYXJlIGNhcmVmdWwgdG9cclxuICAgIC8vIGNvbmZpcm0gdGhhdCB0aGUgb2JzZXJ2ZSBoYXMgbm90IGJlZW4gdW5zdWJzY3JpYmVkIHNpbmNlIHRoaXMgYXN5bmNocm9ub3VzXHJcbiAgICAvLyBmdW5jdGlvbiBoYWQgYmVlbiBxdWV1ZWQuXHJcbiAgICBzZW5kT25lKGksIGZuKSB7XHJcbiAgICAgICAgLy8gRXhlY3V0ZSB0aGUgY2FsbGJhY2sgYXN5bmNocm9ub3VzbHlcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXHJcbiAgICAgICAgdGhpcy50YXNrLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vYnNlcnZlcnMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLm9ic2VydmVyc1tpXSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZuKHRoaXMub2JzZXJ2ZXJzW2ldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGV4Y2VwdGlvbnMgcmFpc2VkIGluIE9ic2VydmVycyBvciBtaXNzaW5nIG1ldGhvZHMgb2YgYW5cclxuICAgICAgICAgICAgICAgICAgICAvLyBPYnNlcnZlci5cclxuICAgICAgICAgICAgICAgICAgICAvLyBMb2cgZXJyb3IgdG8gY29uc29sZS4gYi8zMTQwNDgwNlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgY29uc29sZS5lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgY2xvc2UoZXJyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZmluYWxpemVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5maW5hbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChlcnIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmZpbmFsRXJyb3IgPSBlcnI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFByb3h5IGlzIG5vIGxvbmdlciBuZWVkZWQgLSBnYXJiYWdlIGNvbGxlY3QgcmVmZXJlbmNlc1xyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcclxuICAgICAgICB0aGlzLnRhc2sudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXJzID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB0aGlzLm9uTm9PYnNlcnZlcnMgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuLyoqIFR1cm4gc3luY2hyb25vdXMgZnVuY3Rpb24gaW50byBvbmUgY2FsbGVkIGFzeW5jaHJvbm91c2x5LiAqL1xyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xyXG5mdW5jdGlvbiBhc3luYyhmbiwgb25FcnJvcikge1xyXG4gICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XHJcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHRydWUpXHJcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgZm4oLi4uYXJncyk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICBpZiAob25FcnJvcikge1xyXG4gICAgICAgICAgICAgICAgb25FcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH07XHJcbn1cclxuLyoqXHJcbiAqIFJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgcGFzc2VkIGluIGltcGxlbWVudHMgYW55IG9mIHRoZSBuYW1lZCBtZXRob2RzLlxyXG4gKi9cclxuZnVuY3Rpb24gaW1wbGVtZW50c0FueU1ldGhvZHMob2JqLCBtZXRob2RzKSB7XHJcbiAgICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgb2JqID09PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCBtZXRob2Qgb2YgbWV0aG9kcykge1xyXG4gICAgICAgIGlmIChtZXRob2QgaW4gb2JqICYmIHR5cGVvZiBvYmpbbWV0aG9kXSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn1cclxuZnVuY3Rpb24gbm9vcCgpIHtcclxuICAgIC8vIGRvIG5vdGhpbmdcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgYXJndW1lbnRzIGFyZSBwcm92aWRlZCBmb3IgYSBwdWJsaWMgZnVuY3Rpb24uXHJcbiAqIFRocm93cyBhbiBlcnJvciBpZiBpdCBmYWlscy5cclxuICpcclxuICogQHBhcmFtIGZuTmFtZSBUaGUgZnVuY3Rpb24gbmFtZVxyXG4gKiBAcGFyYW0gbWluQ291bnQgVGhlIG1pbmltdW0gbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBhbGxvdyBmb3IgdGhlIGZ1bmN0aW9uIGNhbGxcclxuICogQHBhcmFtIG1heENvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiBhcmd1bWVudCB0byBhbGxvdyBmb3IgdGhlIGZ1bmN0aW9uIGNhbGxcclxuICogQHBhcmFtIGFyZ0NvdW50IFRoZSBhY3R1YWwgbnVtYmVyIG9mIGFyZ3VtZW50cyBwcm92aWRlZC5cclxuICovXHJcbmNvbnN0IHZhbGlkYXRlQXJnQ291bnQgPSBmdW5jdGlvbiAoZm5OYW1lLCBtaW5Db3VudCwgbWF4Q291bnQsIGFyZ0NvdW50KSB7XHJcbiAgICBsZXQgYXJnRXJyb3I7XHJcbiAgICBpZiAoYXJnQ291bnQgPCBtaW5Db3VudCkge1xyXG4gICAgICAgIGFyZ0Vycm9yID0gJ2F0IGxlYXN0ICcgKyBtaW5Db3VudDtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGFyZ0NvdW50ID4gbWF4Q291bnQpIHtcclxuICAgICAgICBhcmdFcnJvciA9IG1heENvdW50ID09PSAwID8gJ25vbmUnIDogJ25vIG1vcmUgdGhhbiAnICsgbWF4Q291bnQ7XHJcbiAgICB9XHJcbiAgICBpZiAoYXJnRXJyb3IpIHtcclxuICAgICAgICBjb25zdCBlcnJvciA9IGZuTmFtZSArXHJcbiAgICAgICAgICAgICcgZmFpbGVkOiBXYXMgY2FsbGVkIHdpdGggJyArXHJcbiAgICAgICAgICAgIGFyZ0NvdW50ICtcclxuICAgICAgICAgICAgKGFyZ0NvdW50ID09PSAxID8gJyBhcmd1bWVudC4nIDogJyBhcmd1bWVudHMuJykgK1xyXG4gICAgICAgICAgICAnIEV4cGVjdHMgJyArXHJcbiAgICAgICAgICAgIGFyZ0Vycm9yICtcclxuICAgICAgICAgICAgJy4nO1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbn07XHJcbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSBzdHJpbmcgdG8gcHJlZml4IGFuIGVycm9yIG1lc3NhZ2UgYWJvdXQgZmFpbGVkIGFyZ3VtZW50IHZhbGlkYXRpb25cclxuICpcclxuICogQHBhcmFtIGZuTmFtZSBUaGUgZnVuY3Rpb24gbmFtZVxyXG4gKiBAcGFyYW0gYXJnTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXJndW1lbnRcclxuICogQHJldHVybiBUaGUgcHJlZml4IHRvIGFkZCB0byB0aGUgZXJyb3IgdGhyb3duIGZvciB2YWxpZGF0aW9uLlxyXG4gKi9cclxuZnVuY3Rpb24gZXJyb3JQcmVmaXgoZm5OYW1lLCBhcmdOYW1lKSB7XHJcbiAgICByZXR1cm4gYCR7Zm5OYW1lfSBmYWlsZWQ6ICR7YXJnTmFtZX0gYXJndW1lbnQgYDtcclxufVxyXG4vKipcclxuICogQHBhcmFtIGZuTmFtZVxyXG4gKiBAcGFyYW0gYXJndW1lbnROdW1iZXJcclxuICogQHBhcmFtIG5hbWVzcGFjZVxyXG4gKiBAcGFyYW0gb3B0aW9uYWxcclxuICovXHJcbmZ1bmN0aW9uIHZhbGlkYXRlTmFtZXNwYWNlKGZuTmFtZSwgbmFtZXNwYWNlLCBvcHRpb25hbCkge1xyXG4gICAgaWYgKG9wdGlvbmFsICYmICFuYW1lc3BhY2UpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIG5hbWVzcGFjZSAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAvL1RPRE86IEkgc2hvdWxkIGRvIG1vcmUgdmFsaWRhdGlvbiBoZXJlLiBXZSBvbmx5IGFsbG93IGNlcnRhaW4gY2hhcnMgaW4gbmFtZXNwYWNlcy5cclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JQcmVmaXgoZm5OYW1lLCAnbmFtZXNwYWNlJykgKyAnbXVzdCBiZSBhIHZhbGlkIGZpcmViYXNlIG5hbWVzcGFjZS4nKTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiB2YWxpZGF0ZUNhbGxiYWNrKGZuTmFtZSwgYXJndW1lbnROYW1lLCBcclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcclxuY2FsbGJhY2ssIG9wdGlvbmFsKSB7XHJcbiAgICBpZiAob3B0aW9uYWwgJiYgIWNhbGxiYWNrKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvclByZWZpeChmbk5hbWUsIGFyZ3VtZW50TmFtZSkgKyAnbXVzdCBiZSBhIHZhbGlkIGZ1bmN0aW9uLicpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHZhbGlkYXRlQ29udGV4dE9iamVjdChmbk5hbWUsIGFyZ3VtZW50TmFtZSwgY29udGV4dCwgb3B0aW9uYWwpIHtcclxuICAgIGlmIChvcHRpb25hbCAmJiAhY29udGV4dCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgY29udGV4dCAhPT0gJ29iamVjdCcgfHwgY29udGV4dCA9PT0gbnVsbCkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvclByZWZpeChmbk5hbWUsIGFyZ3VtZW50TmFtZSkgKyAnbXVzdCBiZSBhIHZhbGlkIGNvbnRleHQgb2JqZWN0LicpO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8vIENvZGUgb3JpZ2luYWxseSBjYW1lIGZyb20gZ29vZy5jcnlwdC5zdHJpbmdUb1V0ZjhCeXRlQXJyYXksIGJ1dCBmb3Igc29tZSByZWFzb24gdGhleVxyXG4vLyBhdXRvbWF0aWNhbGx5IHJlcGxhY2VkICdcXHJcXG4nIHdpdGggJ1xcbicsIGFuZCB0aGV5IGRpZG4ndCBoYW5kbGUgc3Vycm9nYXRlIHBhaXJzLFxyXG4vLyBzbyBpdCdzIGJlZW4gbW9kaWZpZWQuXHJcbi8vIE5vdGUgdGhhdCBub3QgYWxsIFVuaWNvZGUgY2hhcmFjdGVycyBhcHBlYXIgYXMgc2luZ2xlIGNoYXJhY3RlcnMgaW4gSmF2YVNjcmlwdCBzdHJpbmdzLlxyXG4vLyBmcm9tQ2hhckNvZGUgcmV0dXJucyB0aGUgVVRGLTE2IGVuY29kaW5nIG9mIGEgY2hhcmFjdGVyIC0gc28gc29tZSBVbmljb2RlIGNoYXJhY3RlcnNcclxuLy8gdXNlIDIgY2hhcmFjdGVycyBpbiBKYXZhc2NyaXB0LiAgQWxsIDQtYnl0ZSBVVEYtOCBjaGFyYWN0ZXJzIGJlZ2luIHdpdGggYSBmaXJzdFxyXG4vLyBjaGFyYWN0ZXIgaW4gdGhlIHJhbmdlIDB4RDgwMCAtIDB4REJGRiAodGhlIGZpcnN0IGNoYXJhY3RlciBvZiBhIHNvLWNhbGxlZCBzdXJyb2dhdGVcclxuLy8gcGFpcikuXHJcbi8vIFNlZSBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtMTUuMS4zXHJcbi8qKlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXHJcbiAqIEByZXR1cm4ge0FycmF5fVxyXG4gKi9cclxuY29uc3Qgc3RyaW5nVG9CeXRlQXJyYXkgPSBmdW5jdGlvbiAoc3RyKSB7XHJcbiAgICBjb25zdCBvdXQgPSBbXTtcclxuICAgIGxldCBwID0gMDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGMgPSBzdHIuY2hhckNvZGVBdChpKTtcclxuICAgICAgICAvLyBJcyB0aGlzIHRoZSBsZWFkIHN1cnJvZ2F0ZSBpbiBhIHN1cnJvZ2F0ZSBwYWlyP1xyXG4gICAgICAgIGlmIChjID49IDB4ZDgwMCAmJiBjIDw9IDB4ZGJmZikge1xyXG4gICAgICAgICAgICBjb25zdCBoaWdoID0gYyAtIDB4ZDgwMDsgLy8gdGhlIGhpZ2ggMTAgYml0cy5cclxuICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICBhc3NlcnQoaSA8IHN0ci5sZW5ndGgsICdTdXJyb2dhdGUgcGFpciBtaXNzaW5nIHRyYWlsIHN1cnJvZ2F0ZS4nKTtcclxuICAgICAgICAgICAgY29uc3QgbG93ID0gc3RyLmNoYXJDb2RlQXQoaSkgLSAweGRjMDA7IC8vIHRoZSBsb3cgMTAgYml0cy5cclxuICAgICAgICAgICAgYyA9IDB4MTAwMDAgKyAoaGlnaCA8PCAxMCkgKyBsb3c7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjIDwgMTI4KSB7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gYztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYyA8IDIwNDgpIHtcclxuICAgICAgICAgICAgb3V0W3ArK10gPSAoYyA+PiA2KSB8IDE5MjtcclxuICAgICAgICAgICAgb3V0W3ArK10gPSAoYyAmIDYzKSB8IDEyODtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYyA8IDY1NTM2KSB7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gKGMgPj4gMTIpIHwgMjI0O1xyXG4gICAgICAgICAgICBvdXRbcCsrXSA9ICgoYyA+PiA2KSAmIDYzKSB8IDEyODtcclxuICAgICAgICAgICAgb3V0W3ArK10gPSAoYyAmIDYzKSB8IDEyODtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gKGMgPj4gMTgpIHwgMjQwO1xyXG4gICAgICAgICAgICBvdXRbcCsrXSA9ICgoYyA+PiAxMikgJiA2MykgfCAxMjg7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gKChjID4+IDYpICYgNjMpIHwgMTI4O1xyXG4gICAgICAgICAgICBvdXRbcCsrXSA9IChjICYgNjMpIHwgMTI4O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBvdXQ7XHJcbn07XHJcbi8qKlxyXG4gKiBDYWxjdWxhdGUgbGVuZ3RoIHdpdGhvdXQgYWN0dWFsbHkgY29udmVydGluZzsgdXNlZnVsIGZvciBkb2luZyBjaGVhcGVyIHZhbGlkYXRpb24uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcclxuICogQHJldHVybiB7bnVtYmVyfVxyXG4gKi9cclxuY29uc3Qgc3RyaW5nTGVuZ3RoID0gZnVuY3Rpb24gKHN0cikge1xyXG4gICAgbGV0IHAgPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBjID0gc3RyLmNoYXJDb2RlQXQoaSk7XHJcbiAgICAgICAgaWYgKGMgPCAxMjgpIHtcclxuICAgICAgICAgICAgcCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjIDwgMjA0OCkge1xyXG4gICAgICAgICAgICBwICs9IDI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGMgPj0gMHhkODAwICYmIGMgPD0gMHhkYmZmKSB7XHJcbiAgICAgICAgICAgIC8vIExlYWQgc3Vycm9nYXRlIG9mIGEgc3Vycm9nYXRlIHBhaXIuICBUaGUgcGFpciB0b2dldGhlciB3aWxsIHRha2UgNCBieXRlcyB0byByZXByZXNlbnQuXHJcbiAgICAgICAgICAgIHAgKz0gNDtcclxuICAgICAgICAgICAgaSsrOyAvLyBza2lwIHRyYWlsIHN1cnJvZ2F0ZS5cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHAgKz0gMztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcDtcclxufTtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFRoZSBhbW91bnQgb2YgbWlsbGlzZWNvbmRzIHRvIGV4cG9uZW50aWFsbHkgaW5jcmVhc2UuXHJcbiAqL1xyXG5jb25zdCBERUZBVUxUX0lOVEVSVkFMX01JTExJUyA9IDEwMDA7XHJcbi8qKlxyXG4gKiBUaGUgZmFjdG9yIHRvIGJhY2tvZmYgYnkuXHJcbiAqIFNob3VsZCBiZSBhIG51bWJlciBncmVhdGVyIHRoYW4gMS5cclxuICovXHJcbmNvbnN0IERFRkFVTFRfQkFDS09GRl9GQUNUT1IgPSAyO1xyXG4vKipcclxuICogVGhlIG1heGltdW0gbWlsbGlzZWNvbmRzIHRvIGluY3JlYXNlIHRvLlxyXG4gKlxyXG4gKiA8cD5WaXNpYmxlIGZvciB0ZXN0aW5nXHJcbiAqL1xyXG5jb25zdCBNQVhfVkFMVUVfTUlMTElTID0gNCAqIDYwICogNjAgKiAxMDAwOyAvLyBGb3VyIGhvdXJzLCBsaWtlIGlPUyBhbmQgQW5kcm9pZC5cclxuLyoqXHJcbiAqIFRoZSBwZXJjZW50YWdlIG9mIGJhY2tvZmYgdGltZSB0byByYW5kb21pemUgYnkuXHJcbiAqIFNlZVxyXG4gKiBodHRwOi8vZ28vc2FmZS1jbGllbnQtYmVoYXZpb3Ijc3RlcC0xLWRldGVybWluZS10aGUtYXBwcm9wcmlhdGUtcmV0cnktaW50ZXJ2YWwtdG8taGFuZGxlLXNwaWtlLXRyYWZmaWNcclxuICogZm9yIGNvbnRleHQuXHJcbiAqXHJcbiAqIDxwPlZpc2libGUgZm9yIHRlc3RpbmdcclxuICovXHJcbmNvbnN0IFJBTkRPTV9GQUNUT1IgPSAwLjU7XHJcbi8qKlxyXG4gKiBCYXNlZCBvbiB0aGUgYmFja29mZiBtZXRob2QgZnJvbVxyXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtbGlicmFyeS9ibG9iL21hc3Rlci9jbG9zdXJlL2dvb2cvbWF0aC9leHBvbmVudGlhbGJhY2tvZmYuanMuXHJcbiAqIEV4dHJhY3RlZCBoZXJlIHNvIHdlIGRvbid0IG5lZWQgdG8gcGFzcyBtZXRhZGF0YSBhbmQgYSBzdGF0ZWZ1bCBFeHBvbmVudGlhbEJhY2tvZmYgb2JqZWN0IGFyb3VuZC5cclxuICovXHJcbmZ1bmN0aW9uIGNhbGN1bGF0ZUJhY2tvZmZNaWxsaXMoYmFja29mZkNvdW50LCBpbnRlcnZhbE1pbGxpcyA9IERFRkFVTFRfSU5URVJWQUxfTUlMTElTLCBiYWNrb2ZmRmFjdG9yID0gREVGQVVMVF9CQUNLT0ZGX0ZBQ1RPUikge1xyXG4gICAgLy8gQ2FsY3VsYXRlcyBhbiBleHBvbmVudGlhbGx5IGluY3JlYXNpbmcgdmFsdWUuXHJcbiAgICAvLyBEZXZpYXRpb246IGNhbGN1bGF0ZXMgdmFsdWUgZnJvbSBjb3VudCBhbmQgYSBjb25zdGFudCBpbnRlcnZhbCwgc28gd2Ugb25seSBuZWVkIHRvIHNhdmUgdmFsdWVcclxuICAgIC8vIGFuZCBjb3VudCB0byByZXN0b3JlIHN0YXRlLlxyXG4gICAgY29uc3QgY3VyckJhc2VWYWx1ZSA9IGludGVydmFsTWlsbGlzICogTWF0aC5wb3coYmFja29mZkZhY3RvciwgYmFja29mZkNvdW50KTtcclxuICAgIC8vIEEgcmFuZG9tIFwiZnV6elwiIHRvIGF2b2lkIHdhdmVzIG9mIHJldHJpZXMuXHJcbiAgICAvLyBEZXZpYXRpb246IHJhbmRvbUZhY3RvciBpcyByZXF1aXJlZC5cclxuICAgIGNvbnN0IHJhbmRvbVdhaXQgPSBNYXRoLnJvdW5kKFxyXG4gICAgLy8gQSBmcmFjdGlvbiBvZiB0aGUgYmFja29mZiB2YWx1ZSB0byBhZGQvc3VidHJhY3QuXHJcbiAgICAvLyBEZXZpYXRpb246IGNoYW5nZXMgbXVsdGlwbGljYXRpb24gb3JkZXIgdG8gaW1wcm92ZSByZWFkYWJpbGl0eS5cclxuICAgIFJBTkRPTV9GQUNUT1IgKlxyXG4gICAgICAgIGN1cnJCYXNlVmFsdWUgKlxyXG4gICAgICAgIC8vIEEgcmFuZG9tIGZsb2F0IChyb3VuZGVkIHRvIGludCBieSBNYXRoLnJvdW5kIGFib3ZlKSBpbiB0aGUgcmFuZ2UgWy0xLCAxXS4gRGV0ZXJtaW5lc1xyXG4gICAgICAgIC8vIGlmIHdlIGFkZCBvciBzdWJ0cmFjdC5cclxuICAgICAgICAoTWF0aC5yYW5kb20oKSAtIDAuNSkgKlxyXG4gICAgICAgIDIpO1xyXG4gICAgLy8gTGltaXRzIGJhY2tvZmYgdG8gbWF4IHRvIGF2b2lkIGVmZmVjdGl2ZWx5IHBlcm1hbmVudCBiYWNrb2ZmLlxyXG4gICAgcmV0dXJuIE1hdGgubWluKE1BWF9WQUxVRV9NSUxMSVMsIGN1cnJCYXNlVmFsdWUgKyByYW5kb21XYWl0KTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogUHJvdmlkZSBFbmdsaXNoIG9yZGluYWwgbGV0dGVycyBhZnRlciBhIG51bWJlclxyXG4gKi9cclxuZnVuY3Rpb24gb3JkaW5hbChpKSB7XHJcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShpKSkge1xyXG4gICAgICAgIHJldHVybiBgJHtpfWA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaSArIGluZGljYXRvcihpKTtcclxufVxyXG5mdW5jdGlvbiBpbmRpY2F0b3IoaSkge1xyXG4gICAgaSA9IE1hdGguYWJzKGkpO1xyXG4gICAgY29uc3QgY2VudCA9IGkgJSAxMDA7XHJcbiAgICBpZiAoY2VudCA+PSAxMCAmJiBjZW50IDw9IDIwKSB7XHJcbiAgICAgICAgcmV0dXJuICd0aCc7XHJcbiAgICB9XHJcbiAgICBjb25zdCBkZWMgPSBpICUgMTA7XHJcbiAgICBpZiAoZGVjID09PSAxKSB7XHJcbiAgICAgICAgcmV0dXJuICdzdCc7XHJcbiAgICB9XHJcbiAgICBpZiAoZGVjID09PSAyKSB7XHJcbiAgICAgICAgcmV0dXJuICduZCc7XHJcbiAgICB9XHJcbiAgICBpZiAoZGVjID09PSAzKSB7XHJcbiAgICAgICAgcmV0dXJuICdyZCc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJ3RoJztcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRNb2R1bGFySW5zdGFuY2Uoc2VydmljZSkge1xyXG4gICAgaWYgKHNlcnZpY2UgJiYgc2VydmljZS5fZGVsZWdhdGUpIHtcclxuICAgICAgICByZXR1cm4gc2VydmljZS5fZGVsZWdhdGU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gc2VydmljZTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9taXNpZnlSZXF1ZXN0KHJlcXVlc3QsIGVycm9yTWVzc2FnZSkge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9IGV2ZW50ID0+IHtcclxuICAgICAgICAgICAgcmVzb2x2ZShldmVudC50YXJnZXQucmVzdWx0KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlcXVlc3Qub25lcnJvciA9IGV2ZW50ID0+IHtcclxuICAgICAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgICAgICByZWplY3QoYCR7ZXJyb3JNZXNzYWdlfTogJHsoX2EgPSBldmVudC50YXJnZXQuZXJyb3IpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tZXNzYWdlfWApO1xyXG4gICAgICAgIH07XHJcbiAgICB9KTtcclxufVxyXG5jbGFzcyBEQldyYXBwZXIge1xyXG4gICAgY29uc3RydWN0b3IoX2RiKSB7XHJcbiAgICAgICAgdGhpcy5fZGIgPSBfZGI7XHJcbiAgICAgICAgdGhpcy5vYmplY3RTdG9yZU5hbWVzID0gdGhpcy5fZGIub2JqZWN0U3RvcmVOYW1lcztcclxuICAgIH1cclxuICAgIHRyYW5zYWN0aW9uKHN0b3JlTmFtZXMsIG1vZGUpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uV3JhcHBlcih0aGlzLl9kYi50cmFuc2FjdGlvbi5jYWxsKHRoaXMuX2RiLCBzdG9yZU5hbWVzLCBtb2RlKSk7XHJcbiAgICB9XHJcbiAgICBjcmVhdGVPYmplY3RTdG9yZShzdG9yZU5hbWUsIG9wdGlvbnMpIHtcclxuICAgICAgICByZXR1cm4gbmV3IE9iamVjdFN0b3JlV3JhcHBlcih0aGlzLl9kYi5jcmVhdGVPYmplY3RTdG9yZShzdG9yZU5hbWUsIG9wdGlvbnMpKTtcclxuICAgIH1cclxuICAgIGNsb3NlKCkge1xyXG4gICAgICAgIHRoaXMuX2RiLmNsb3NlKCk7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgVHJhbnNhY3Rpb25XcmFwcGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKF90cmFuc2FjdGlvbikge1xyXG4gICAgICAgIHRoaXMuX3RyYW5zYWN0aW9uID0gX3RyYW5zYWN0aW9uO1xyXG4gICAgICAgIHRoaXMuY29tcGxldGUgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zYWN0aW9uLm9uY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zYWN0aW9uLm9uZXJyb3IgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QodGhpcy5fdHJhbnNhY3Rpb24uZXJyb3IpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLl90cmFuc2FjdGlvbi5vbmFib3J0ID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KHRoaXMuX3RyYW5zYWN0aW9uLmVycm9yKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIG9iamVjdFN0b3JlKHN0b3JlTmFtZSkge1xyXG4gICAgICAgIHJldHVybiBuZXcgT2JqZWN0U3RvcmVXcmFwcGVyKHRoaXMuX3RyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHN0b3JlTmFtZSkpO1xyXG4gICAgfVxyXG59XHJcbmNsYXNzIE9iamVjdFN0b3JlV3JhcHBlciB7XHJcbiAgICBjb25zdHJ1Y3Rvcihfc3RvcmUpIHtcclxuICAgICAgICB0aGlzLl9zdG9yZSA9IF9zdG9yZTtcclxuICAgIH1cclxuICAgIGluZGV4KG5hbWUpIHtcclxuICAgICAgICByZXR1cm4gbmV3IEluZGV4V3JhcHBlcih0aGlzLl9zdG9yZS5pbmRleChuYW1lKSk7XHJcbiAgICB9XHJcbiAgICBjcmVhdGVJbmRleChuYW1lLCBrZXlwYXRoLCBvcHRpb25zKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBJbmRleFdyYXBwZXIodGhpcy5fc3RvcmUuY3JlYXRlSW5kZXgobmFtZSwga2V5cGF0aCwgb3B0aW9ucykpO1xyXG4gICAgfVxyXG4gICAgZ2V0KGtleSkge1xyXG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLl9zdG9yZS5nZXQoa2V5KTtcclxuICAgICAgICByZXR1cm4gcHJvbWlzaWZ5UmVxdWVzdChyZXF1ZXN0LCAnRXJyb3IgcmVhZGluZyBmcm9tIEluZGV4ZWREQicpO1xyXG4gICAgfVxyXG4gICAgcHV0KHZhbHVlLCBrZXkpIHtcclxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5fc3RvcmUucHV0KHZhbHVlLCBrZXkpO1xyXG4gICAgICAgIHJldHVybiBwcm9taXNpZnlSZXF1ZXN0KHJlcXVlc3QsICdFcnJvciB3cml0aW5nIHRvIEluZGV4ZWREQicpO1xyXG4gICAgfVxyXG4gICAgZGVsZXRlKGtleSkge1xyXG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLl9zdG9yZS5kZWxldGUoa2V5KTtcclxuICAgICAgICByZXR1cm4gcHJvbWlzaWZ5UmVxdWVzdChyZXF1ZXN0LCAnRXJyb3IgZGVsZXRpbmcgZnJvbSBJbmRleGVkREInKTtcclxuICAgIH1cclxuICAgIGNsZWFyKCkge1xyXG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLl9zdG9yZS5jbGVhcigpO1xyXG4gICAgICAgIHJldHVybiBwcm9taXNpZnlSZXF1ZXN0KHJlcXVlc3QsICdFcnJvciBjbGVhcmluZyBJbmRleGVkREIgb2JqZWN0IHN0b3JlJyk7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgSW5kZXhXcmFwcGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKF9pbmRleCkge1xyXG4gICAgICAgIHRoaXMuX2luZGV4ID0gX2luZGV4O1xyXG4gICAgfVxyXG4gICAgZ2V0KGtleSkge1xyXG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLl9pbmRleC5nZXQoa2V5KTtcclxuICAgICAgICByZXR1cm4gcHJvbWlzaWZ5UmVxdWVzdChyZXF1ZXN0LCAnRXJyb3IgcmVhZGluZyBmcm9tIEluZGV4ZWREQicpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIG9wZW5EQihkYk5hbWUsIGRiVmVyc2lvbiwgdXBncmFkZUNhbGxiYWNrKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihkYk5hbWUsIGRiVmVyc2lvbik7XHJcbiAgICAgICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgREJXcmFwcGVyKGV2ZW50LnRhcmdldC5yZXN1bHQpKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGBFcnJvciBvcGVuaW5nIGluZGV4ZWREQjogJHsoX2EgPSBldmVudC50YXJnZXQuZXJyb3IpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tZXNzYWdlfWApO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IGV2ZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIHVwZ3JhZGVDYWxsYmFjayhuZXcgREJXcmFwcGVyKHJlcXVlc3QucmVzdWx0KSwgZXZlbnQub2xkVmVyc2lvbiwgZXZlbnQubmV3VmVyc2lvbiwgbmV3IFRyYW5zYWN0aW9uV3JhcHBlcihyZXF1ZXN0LnRyYW5zYWN0aW9uKSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHJlamVjdChgRXJyb3Igb3BlbmluZyBpbmRleGVkREI6ICR7ZS5tZXNzYWdlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZURCKGRiTmFtZSkge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLmRlbGV0ZURhdGFiYXNlKGRiTmFtZSk7XHJcbiAgICAgICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSBldmVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoYEVycm9yIGRlbGV0aW5nIGluZGV4ZWREQiBkYXRhYmFzZSBcIiR7ZGJOYW1lfVwiOiAkeyhfYSA9IGV2ZW50LnRhcmdldC5lcnJvcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm1lc3NhZ2V9YCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHJlamVjdChgRXJyb3IgZGVsZXRpbmcgaW5kZXhlZERCIGRhdGFiYXNlIFwiJHtkYk5hbWV9XCI6ICR7ZS5tZXNzYWdlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59XG5cbmV4cG9ydCB7IENPTlNUQU5UUywgREJXcmFwcGVyLCBEZWZlcnJlZCwgRXJyb3JGYWN0b3J5LCBGaXJlYmFzZUVycm9yLCBNQVhfVkFMVUVfTUlMTElTLCBSQU5ET01fRkFDVE9SLCBTaGExLCBhcmVDb29raWVzRW5hYmxlZCwgYXNzZXJ0LCBhc3NlcnRpb25FcnJvciwgYXN5bmMsIGJhc2U2NCwgYmFzZTY0RGVjb2RlLCBiYXNlNjRFbmNvZGUsIGJhc2U2NHVybEVuY29kZVdpdGhvdXRQYWRkaW5nLCBjYWxjdWxhdGVCYWNrb2ZmTWlsbGlzLCBjb250YWlucywgY3JlYXRlTW9ja1VzZXJUb2tlbiwgY3JlYXRlU3Vic2NyaWJlLCBkZWNvZGUsIGRlZXBDb3B5LCBkZWVwRXF1YWwsIGRlZXBFeHRlbmQsIGRlbGV0ZURCLCBlcnJvclByZWZpeCwgZXh0cmFjdFF1ZXJ5c3RyaW5nLCBnZXRHbG9iYWwsIGdldE1vZHVsYXJJbnN0YW5jZSwgZ2V0VUEsIGlzQWRtaW4sIGlzQnJvd3NlciwgaXNCcm93c2VyRXh0ZW5zaW9uLCBpc0VsZWN0cm9uLCBpc0VtcHR5LCBpc0lFLCBpc0luZGV4ZWREQkF2YWlsYWJsZSwgaXNNb2JpbGVDb3Jkb3ZhLCBpc05vZGUsIGlzTm9kZVNkaywgaXNSZWFjdE5hdGl2ZSwgaXNTYWZhcmksIGlzVVdQLCBpc1ZhbGlkRm9ybWF0LCBpc1ZhbGlkVGltZXN0YW1wLCBpc3N1ZWRBdFRpbWUsIGpzb25FdmFsLCBtYXAsIG9wZW5EQiwgb3JkaW5hbCwgcXVlcnlzdHJpbmcsIHF1ZXJ5c3RyaW5nRGVjb2RlLCBzYWZlR2V0LCBzdHJpbmdMZW5ndGgsIHN0cmluZ1RvQnl0ZUFycmF5LCBzdHJpbmdpZnksIHZhbGlkYXRlQXJnQ291bnQsIHZhbGlkYXRlQ2FsbGJhY2ssIHZhbGlkYXRlQ29udGV4dE9iamVjdCwgdmFsaWRhdGVJbmRleGVkREJPcGVuYWJsZSwgdmFsaWRhdGVOYW1lc3BhY2UgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmVzbTIwMTcuanMubWFwXG4iLCJ2YXIgY29tbW9uanNHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fTtcblxudmFyIGVzbSA9IHt9O1xuXG4vKlxuXG4gQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy5cbiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuKi9cbnZhciBrLGdvb2c9Z29vZ3x8e30sbD1jb21tb25qc0dsb2JhbHx8c2VsZjtmdW5jdGlvbiBhYSgpe31mdW5jdGlvbiBiYShhKXt2YXIgYj10eXBlb2YgYTtiPVwib2JqZWN0XCIhPWI/YjphP0FycmF5LmlzQXJyYXkoYSk/XCJhcnJheVwiOmI6XCJudWxsXCI7cmV0dXJuIFwiYXJyYXlcIj09Ynx8XCJvYmplY3RcIj09YiYmXCJudW1iZXJcIj09dHlwZW9mIGEubGVuZ3RofWZ1bmN0aW9uIHAoYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIFwib2JqZWN0XCI9PWImJm51bGwhPWF8fFwiZnVuY3Rpb25cIj09Yn1mdW5jdGlvbiBkYShhKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsZWEpJiZhW2VhXXx8KGFbZWFdPSsrZmEpfXZhciBlYT1cImNsb3N1cmVfdWlkX1wiKygxRTkqTWF0aC5yYW5kb20oKT4+PjApLGZhPTA7ZnVuY3Rpb24gaGEoYSxiLGMpe3JldHVybiBhLmNhbGwuYXBwbHkoYS5iaW5kLGFyZ3VtZW50cyl9XG5mdW5jdGlvbiBpYShhLGIsYyl7aWYoIWEpdGhyb3cgRXJyb3IoKTtpZigyPGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBkPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywyKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO0FycmF5LnByb3RvdHlwZS51bnNoaWZ0LmFwcGx5KGUsZCk7cmV0dXJuIGEuYXBwbHkoYixlKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkoYixhcmd1bWVudHMpfX1mdW5jdGlvbiBxKGEsYixjKXtGdW5jdGlvbi5wcm90b3R5cGUuYmluZCYmLTEhPUZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLnRvU3RyaW5nKCkuaW5kZXhPZihcIm5hdGl2ZSBjb2RlXCIpP3E9aGE6cT1pYTtyZXR1cm4gcS5hcHBseShudWxsLGFyZ3VtZW50cyl9XG5mdW5jdGlvbiBqYShhLGIpe3ZhciBjPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD1jLnNsaWNlKCk7ZC5wdXNoLmFwcGx5KGQsYXJndW1lbnRzKTtyZXR1cm4gYS5hcHBseSh0aGlzLGQpfX1mdW5jdGlvbiB0KGEsYil7ZnVuY3Rpb24gYygpe31jLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLlo9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGM7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YTthLlZiPWZ1bmN0aW9uKGQsZSxmKXtmb3IodmFyIGg9QXJyYXkoYXJndW1lbnRzLmxlbmd0aC0yKSxuPTI7bjxhcmd1bWVudHMubGVuZ3RoO24rKyloW24tMl09YXJndW1lbnRzW25dO3JldHVybiBiLnByb3RvdHlwZVtlXS5hcHBseShkLGgpfTt9ZnVuY3Rpb24gdigpe3RoaXMucz10aGlzLnM7dGhpcy5vPXRoaXMubzt9dmFyIGthPTAsbGE9e307di5wcm90b3R5cGUucz0hMTt2LnByb3RvdHlwZS5uYT1mdW5jdGlvbigpe2lmKCF0aGlzLnMmJih0aGlzLnM9ITAsdGhpcy5NKCksMCE9a2EpKXt2YXIgYT1kYSh0aGlzKTtkZWxldGUgbGFbYV07fX07di5wcm90b3R5cGUuTT1mdW5jdGlvbigpe2lmKHRoaXMubylmb3IoO3RoaXMuby5sZW5ndGg7KXRoaXMuby5zaGlmdCgpKCk7fTtjb25zdCBtYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKFwic3RyaW5nXCI9PT10eXBlb2YgYSlyZXR1cm4gXCJzdHJpbmdcIiE9PXR5cGVvZiBifHwxIT1iLmxlbmd0aD8tMTphLmluZGV4T2YoYiwwKTtmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKylpZihjIGluIGEmJmFbY109PT1iKXJldHVybiBjO3JldHVybiAtMX0sbmE9QXJyYXkucHJvdG90eXBlLmZvckVhY2g/ZnVuY3Rpb24oYSxiLGMpe0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYSxiLGMpO306ZnVuY3Rpb24oYSxiLGMpe2NvbnN0IGQ9YS5sZW5ndGgsZT1cInN0cmluZ1wiPT09dHlwZW9mIGE/YS5zcGxpdChcIlwiKTphO2ZvcihsZXQgZj0wO2Y8ZDtmKyspZiBpbiBlJiZiLmNhbGwoYyxlW2ZdLGYsYSk7fTtcbmZ1bmN0aW9uIG9hKGEpe2E6e3ZhciBiPXBhO2NvbnN0IGM9YS5sZW5ndGgsZD1cInN0cmluZ1wiPT09dHlwZW9mIGE/YS5zcGxpdChcIlwiKTphO2ZvcihsZXQgZT0wO2U8YztlKyspaWYoZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKSl7Yj1lO2JyZWFrIGF9Yj0tMTt9cmV0dXJuIDA+Yj9udWxsOlwic3RyaW5nXCI9PT10eXBlb2YgYT9hLmNoYXJBdChiKTphW2JdfWZ1bmN0aW9uIHFhKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGFyZ3VtZW50cyl9ZnVuY3Rpb24gcmEoYSl7Y29uc3QgYj1hLmxlbmd0aDtpZigwPGIpe2NvbnN0IGM9QXJyYXkoYik7Zm9yKGxldCBkPTA7ZDxiO2QrKyljW2RdPWFbZF07cmV0dXJuIGN9cmV0dXJuIFtdfWZ1bmN0aW9uIHNhKGEpe3JldHVybiAvXltcXHNcXHhhMF0qJC8udGVzdChhKX12YXIgdGE9U3RyaW5nLnByb3RvdHlwZS50cmltP2Z1bmN0aW9uKGEpe3JldHVybiBhLnRyaW0oKX06ZnVuY3Rpb24oYSl7cmV0dXJuIC9eW1xcc1xceGEwXSooW1xcc1xcU10qPylbXFxzXFx4YTBdKiQvLmV4ZWMoYSlbMV19O2Z1bmN0aW9uIHcoYSxiKXtyZXR1cm4gLTEhPWEuaW5kZXhPZihiKX1mdW5jdGlvbiB1YShhLGIpe3JldHVybiBhPGI/LTE6YT5iPzE6MH12YXIgeDthOnt2YXIgdmE9bC5uYXZpZ2F0b3I7aWYodmEpe3ZhciB3YT12YS51c2VyQWdlbnQ7aWYod2Epe3g9d2E7YnJlYWsgYX19eD1cIlwiO31mdW5jdGlvbiB4YShhLGIsYyl7Zm9yKGNvbnN0IGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSk7fWZ1bmN0aW9uIHlhKGEpe2NvbnN0IGI9e307Zm9yKGNvbnN0IGMgaW4gYSliW2NdPWFbY107cmV0dXJuIGJ9dmFyIHphPVwiY29uc3RydWN0b3IgaGFzT3duUHJvcGVydHkgaXNQcm90b3R5cGVPZiBwcm9wZXJ0eUlzRW51bWVyYWJsZSB0b0xvY2FsZVN0cmluZyB0b1N0cmluZyB2YWx1ZU9mXCIuc3BsaXQoXCIgXCIpO2Z1bmN0aW9uIEFhKGEsYil7bGV0IGMsZDtmb3IobGV0IGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXtkPWFyZ3VtZW50c1tlXTtmb3IoYyBpbiBkKWFbY109ZFtjXTtmb3IobGV0IGY9MDtmPHphLmxlbmd0aDtmKyspYz16YVtmXSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCxjKSYmKGFbY109ZFtjXSk7fX1mdW5jdGlvbiBDYShhKXtDYVtcIiBcIl0oYSk7cmV0dXJuIGF9Q2FbXCIgXCJdPWFhO2Z1bmN0aW9uIEZhKGEpe3ZhciBiPUdhO3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiw5KT9iWzldOmJbOV09YSg5KX12YXIgSGE9dyh4LFwiT3BlcmFcIikseT13KHgsXCJUcmlkZW50XCIpfHx3KHgsXCJNU0lFXCIpLElhPXcoeCxcIkVkZ2VcIiksSmE9SWF8fHksS2E9dyh4LFwiR2Vja29cIikmJiEodyh4LnRvTG93ZXJDYXNlKCksXCJ3ZWJraXRcIikmJiF3KHgsXCJFZGdlXCIpKSYmISh3KHgsXCJUcmlkZW50XCIpfHx3KHgsXCJNU0lFXCIpKSYmIXcoeCxcIkVkZ2VcIiksTGE9dyh4LnRvTG93ZXJDYXNlKCksXCJ3ZWJraXRcIikmJiF3KHgsXCJFZGdlXCIpO2Z1bmN0aW9uIE1hKCl7dmFyIGE9bC5kb2N1bWVudDtyZXR1cm4gYT9hLmRvY3VtZW50TW9kZTp2b2lkIDB9dmFyIE5hO1xuYTp7dmFyIE9hPVwiXCIsUGE9ZnVuY3Rpb24oKXt2YXIgYT14O2lmKEthKXJldHVybiAvcnY6KFteXFwpO10rKShcXCl8OykvLmV4ZWMoYSk7aWYoSWEpcmV0dXJuIC9FZGdlXFwvKFtcXGRcXC5dKykvLmV4ZWMoYSk7aWYoeSlyZXR1cm4gL1xcYig/Ok1TSUV8cnYpWzogXShbXlxcKTtdKykoXFwpfDspLy5leGVjKGEpO2lmKExhKXJldHVybiAvV2ViS2l0XFwvKFxcUyspLy5leGVjKGEpO2lmKEhhKXJldHVybiAvKD86VmVyc2lvbilbIFxcL10/KFxcUyspLy5leGVjKGEpfSgpO1BhJiYoT2E9UGE/UGFbMV06XCJcIik7aWYoeSl7dmFyIFFhPU1hKCk7aWYobnVsbCE9UWEmJlFhPnBhcnNlRmxvYXQoT2EpKXtOYT1TdHJpbmcoUWEpO2JyZWFrIGF9fU5hPU9hO312YXIgR2E9e307XG5mdW5jdGlvbiBSYSgpe3JldHVybiBGYShmdW5jdGlvbigpe2xldCBhPTA7Y29uc3QgYj10YShTdHJpbmcoTmEpKS5zcGxpdChcIi5cIiksYz10YShcIjlcIikuc3BsaXQoXCIuXCIpLGQ9TWF0aC5tYXgoYi5sZW5ndGgsYy5sZW5ndGgpO2ZvcihsZXQgaD0wOzA9PWEmJmg8ZDtoKyspe3ZhciBlPWJbaF18fFwiXCIsZj1jW2hdfHxcIlwiO2Rve2U9LyhcXGQqKShcXEQqKSguKikvLmV4ZWMoZSl8fFtcIlwiLFwiXCIsXCJcIixcIlwiXTtmPS8oXFxkKikoXFxEKikoLiopLy5leGVjKGYpfHxbXCJcIixcIlwiLFwiXCIsXCJcIl07aWYoMD09ZVswXS5sZW5ndGgmJjA9PWZbMF0ubGVuZ3RoKWJyZWFrO2E9dWEoMD09ZVsxXS5sZW5ndGg/MDpwYXJzZUludChlWzFdLDEwKSwwPT1mWzFdLmxlbmd0aD8wOnBhcnNlSW50KGZbMV0sMTApKXx8dWEoMD09ZVsyXS5sZW5ndGgsMD09ZlsyXS5sZW5ndGgpfHx1YShlWzJdLGZbMl0pO2U9ZVszXTtmPWZbM107fXdoaWxlKDA9PWEpfXJldHVybiAwPD1hfSl9dmFyIFNhO1xuaWYobC5kb2N1bWVudCYmeSl7dmFyIFRhPU1hKCk7U2E9VGE/VGE6cGFyc2VJbnQoTmEsMTApfHx2b2lkIDA7fWVsc2UgU2E9dm9pZCAwO3ZhciBVYT1TYTt2YXIgVmE9ZnVuY3Rpb24oKXtpZighbC5hZGRFdmVudExpc3RlbmVyfHwhT2JqZWN0LmRlZmluZVByb3BlcnR5KXJldHVybiAhMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSxcInBhc3NpdmVcIix7Z2V0OmZ1bmN0aW9uKCl7YT0hMDt9fSk7dHJ5e2wuYWRkRXZlbnRMaXN0ZW5lcihcInRlc3RcIixhYSxiKSxsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0ZXN0XCIsYWEsYik7fWNhdGNoKGMpe31yZXR1cm4gYX0oKTtmdW5jdGlvbiB6KGEsYil7dGhpcy50eXBlPWE7dGhpcy5nPXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPSExO316LnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7dGhpcy5kZWZhdWx0UHJldmVudGVkPSEwO307ZnVuY3Rpb24gQShhLGIpe3ouY2FsbCh0aGlzLGE/YS50eXBlOlwiXCIpO3RoaXMucmVsYXRlZFRhcmdldD10aGlzLmc9dGhpcy50YXJnZXQ9bnVsbDt0aGlzLmJ1dHRvbj10aGlzLnNjcmVlblk9dGhpcy5zY3JlZW5YPXRoaXMuY2xpZW50WT10aGlzLmNsaWVudFg9MDt0aGlzLmtleT1cIlwiO3RoaXMubWV0YUtleT10aGlzLnNoaWZ0S2V5PXRoaXMuYWx0S2V5PXRoaXMuY3RybEtleT0hMTt0aGlzLnN0YXRlPW51bGw7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPVwiXCI7dGhpcy5pPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMuZz1iO2lmKGI9YS5yZWxhdGVkVGFyZ2V0KXtpZihLYSl7YTp7dHJ5e0NhKGIubm9kZU5hbWUpO3ZhciBlPSEwO2JyZWFrIGF9Y2F0Y2goZil7fWU9XG4hMTt9ZXx8KGI9bnVsbCk7fX1lbHNlIFwibW91c2VvdmVyXCI9PWM/Yj1hLmZyb21FbGVtZW50OlwibW91c2VvdXRcIj09YyYmKGI9YS50b0VsZW1lbnQpO3RoaXMucmVsYXRlZFRhcmdldD1iO2Q/KHRoaXMuY2xpZW50WD12b2lkIDAhPT1kLmNsaWVudFg/ZC5jbGllbnRYOmQucGFnZVgsdGhpcy5jbGllbnRZPXZvaWQgMCE9PWQuY2xpZW50WT9kLmNsaWVudFk6ZC5wYWdlWSx0aGlzLnNjcmVlblg9ZC5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1kLnNjcmVlbll8fDApOih0aGlzLmNsaWVudFg9dm9pZCAwIT09YS5jbGllbnRYP2EuY2xpZW50WDphLnBhZ2VYLHRoaXMuY2xpZW50WT12b2lkIDAhPT1hLmNsaWVudFk/YS5jbGllbnRZOmEucGFnZVksdGhpcy5zY3JlZW5YPWEuc2NyZWVuWHx8MCx0aGlzLnNjcmVlblk9YS5zY3JlZW5ZfHwwKTt0aGlzLmJ1dHRvbj1hLmJ1dHRvbjt0aGlzLmtleT1hLmtleXx8XCJcIjt0aGlzLmN0cmxLZXk9YS5jdHJsS2V5O3RoaXMuYWx0S2V5PWEuYWx0S2V5O3RoaXMuc2hpZnRLZXk9XG5hLnNoaWZ0S2V5O3RoaXMubWV0YUtleT1hLm1ldGFLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1cInN0cmluZ1wiPT09dHlwZW9mIGEucG9pbnRlclR5cGU/YS5wb2ludGVyVHlwZTpXYVthLnBvaW50ZXJUeXBlXXx8XCJcIjt0aGlzLnN0YXRlPWEuc3RhdGU7dGhpcy5pPWE7YS5kZWZhdWx0UHJldmVudGVkJiZBLlouaC5jYWxsKHRoaXMpO319dChBLHopO3ZhciBXYT17MjpcInRvdWNoXCIsMzpcInBlblwiLDQ6XCJtb3VzZVwifTtBLnByb3RvdHlwZS5oPWZ1bmN0aW9uKCl7QS5aLmguY2FsbCh0aGlzKTt2YXIgYT10aGlzLmk7YS5wcmV2ZW50RGVmYXVsdD9hLnByZXZlbnREZWZhdWx0KCk6YS5yZXR1cm5WYWx1ZT0hMTt9O3ZhciBCPVwiY2xvc3VyZV9saXN0ZW5hYmxlX1wiKygxRTYqTWF0aC5yYW5kb20oKXwwKTt2YXIgWGE9MDtmdW5jdGlvbiBZYShhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMuaWE9ZTt0aGlzLmtleT0rK1hhO3RoaXMuY2E9dGhpcy5mYT0hMTt9ZnVuY3Rpb24gWmEoYSl7YS5jYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5pYT1udWxsO31mdW5jdGlvbiAkYShhKXt0aGlzLnNyYz1hO3RoaXMuZz17fTt0aGlzLmg9MDt9JGEucHJvdG90eXBlLmFkZD1mdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWEudG9TdHJpbmcoKTthPXRoaXMuZ1tmXTthfHwoYT10aGlzLmdbZl09W10sdGhpcy5oKyspO3ZhciBoPWFiKGEsYixkLGUpOy0xPGg/KGI9YVtoXSxjfHwoYi5mYT0hMSkpOihiPW5ldyBZYShiLHRoaXMuc3JjLGYsISFkLGUpLGIuZmE9YyxhLnB1c2goYikpO3JldHVybiBifTtmdW5jdGlvbiBiYihhLGIpe3ZhciBjPWIudHlwZTtpZihjIGluIGEuZyl7dmFyIGQ9YS5nW2NdLGU9bWEoZCxiKSxmOyhmPTA8PWUpJiZBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoZCxlLDEpO2YmJihaYShiKSwwPT1hLmdbY10ubGVuZ3RoJiYoZGVsZXRlIGEuZ1tjXSxhLmgtLSkpO319XG5mdW5jdGlvbiBhYihhLGIsYyxkKXtmb3IodmFyIGU9MDtlPGEubGVuZ3RoOysrZSl7dmFyIGY9YVtlXTtpZighZi5jYSYmZi5saXN0ZW5lcj09YiYmZi5jYXB0dXJlPT0hIWMmJmYuaWE9PWQpcmV0dXJuIGV9cmV0dXJuIC0xfXZhciBjYj1cImNsb3N1cmVfbG1fXCIrKDFFNipNYXRoLnJhbmRvbSgpfDApLGRiPXt9O2Z1bmN0aW9uIGZiKGEsYixjLGQsZSl7aWYoZCYmZC5vbmNlKXJldHVybiBnYihhLGIsYyxkLGUpO2lmKEFycmF5LmlzQXJyYXkoYikpe2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWZiKGEsYltmXSxjLGQsZSk7cmV0dXJuIG51bGx9Yz1oYihjKTtyZXR1cm4gYSYmYVtCXT9hLk4oYixjLHAoZCk/ISFkLmNhcHR1cmU6ISFkLGUpOmliKGEsYixjLCExLGQsZSl9XG5mdW5jdGlvbiBpYihhLGIsYyxkLGUsZil7aWYoIWIpdGhyb3cgRXJyb3IoXCJJbnZhbGlkIGV2ZW50IHR5cGVcIik7dmFyIGg9cChlKT8hIWUuY2FwdHVyZTohIWUsbj1qYihhKTtufHwoYVtjYl09bj1uZXcgJGEoYSkpO2M9bi5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9a2IoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKVZhfHwoZT1oKSx2b2lkIDA9PT1lJiYoZT0hMSksYS5hZGRFdmVudExpc3RlbmVyKGIudG9TdHJpbmcoKSxkLGUpO2Vsc2UgaWYoYS5hdHRhY2hFdmVudClhLmF0dGFjaEV2ZW50KGxiKGIudG9TdHJpbmcoKSksZCk7ZWxzZSBpZihhLmFkZExpc3RlbmVyJiZhLnJlbW92ZUxpc3RlbmVyKWEuYWRkTGlzdGVuZXIoZCk7ZWxzZSB0aHJvdyBFcnJvcihcImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS5cIik7cmV0dXJuIGN9XG5mdW5jdGlvbiBrYigpe2Z1bmN0aW9uIGEoYyl7cmV0dXJuIGIuY2FsbChhLnNyYyxhLmxpc3RlbmVyLGMpfXZhciBiPW1iO3JldHVybiBhfWZ1bmN0aW9uIGdiKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSl7Zm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspZ2IoYSxiW2ZdLGMsZCxlKTtyZXR1cm4gbnVsbH1jPWhiKGMpO3JldHVybiBhJiZhW0JdP2EuTyhiLGMscChkKT8hIWQuY2FwdHVyZTohIWQsZSk6aWIoYSxiLGMsITAsZCxlKX1cbmZ1bmN0aW9uIG5iKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyluYihhLGJbZl0sYyxkLGUpO2Vsc2UgKGQ9cChkKT8hIWQuY2FwdHVyZTohIWQsYz1oYihjKSxhJiZhW0JdKT8oYT1hLmksYj1TdHJpbmcoYikudG9TdHJpbmcoKSxiIGluIGEuZyYmKGY9YS5nW2JdLGM9YWIoZixjLGQsZSksLTE8YyYmKFphKGZbY10pLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChmLGMsMSksMD09Zi5sZW5ndGgmJihkZWxldGUgYS5nW2JdLGEuaC0tKSkpKTphJiYoYT1qYihhKSkmJihiPWEuZ1tiLnRvU3RyaW5nKCldLGE9LTEsYiYmKGE9YWIoYixjLGQsZSkpLChjPS0xPGE/YlthXTpudWxsKSYmb2IoYykpO31cbmZ1bmN0aW9uIG9iKGEpe2lmKFwibnVtYmVyXCIhPT10eXBlb2YgYSYmYSYmIWEuY2Epe3ZhciBiPWEuc3JjO2lmKGImJmJbQl0pYmIoYi5pLGEpO2Vsc2Uge3ZhciBjPWEudHlwZSxkPWEucHJveHk7Yi5yZW1vdmVFdmVudExpc3RlbmVyP2IucmVtb3ZlRXZlbnRMaXN0ZW5lcihjLGQsYS5jYXB0dXJlKTpiLmRldGFjaEV2ZW50P2IuZGV0YWNoRXZlbnQobGIoYyksZCk6Yi5hZGRMaXN0ZW5lciYmYi5yZW1vdmVMaXN0ZW5lciYmYi5yZW1vdmVMaXN0ZW5lcihkKTsoYz1qYihiKSk/KGJiKGMsYSksMD09Yy5oJiYoYy5zcmM9bnVsbCxiW2NiXT1udWxsKSk6WmEoYSk7fX19ZnVuY3Rpb24gbGIoYSl7cmV0dXJuIGEgaW4gZGI/ZGJbYV06ZGJbYV09XCJvblwiK2F9ZnVuY3Rpb24gbWIoYSxiKXtpZihhLmNhKWE9ITA7ZWxzZSB7Yj1uZXcgQShiLHRoaXMpO3ZhciBjPWEubGlzdGVuZXIsZD1hLmlhfHxhLnNyYzthLmZhJiZvYihhKTthPWMuY2FsbChkLGIpO31yZXR1cm4gYX1cbmZ1bmN0aW9uIGpiKGEpe2E9YVtjYl07cmV0dXJuIGEgaW5zdGFuY2VvZiAkYT9hOm51bGx9dmFyIHBiPVwiX19jbG9zdXJlX2V2ZW50c19mbl9cIisoMUU5Kk1hdGgucmFuZG9tKCk+Pj4wKTtmdW5jdGlvbiBoYihhKXtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYSlyZXR1cm4gYTthW3BiXXx8KGFbcGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbcGJdfWZ1bmN0aW9uIEMoKXt2LmNhbGwodGhpcyk7dGhpcy5pPW5ldyAkYSh0aGlzKTt0aGlzLlA9dGhpczt0aGlzLkk9bnVsbDt9dChDLHYpO0MucHJvdG90eXBlW0JdPSEwO0MucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7bmIodGhpcyxhLGIsYyxkKTt9O1xuZnVuY3Rpb24gRChhLGIpe3ZhciBjLGQ9YS5JO2lmKGQpZm9yKGM9W107ZDtkPWQuSSljLnB1c2goZCk7YT1hLlA7ZD1iLnR5cGV8fGI7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBiKWI9bmV3IHooYixhKTtlbHNlIGlmKGIgaW5zdGFuY2VvZiB6KWIudGFyZ2V0PWIudGFyZ2V0fHxhO2Vsc2Uge3ZhciBlPWI7Yj1uZXcgeihkLGEpO0FhKGIsZSk7fWU9ITA7aWYoYylmb3IodmFyIGY9Yy5sZW5ndGgtMTswPD1mO2YtLSl7dmFyIGg9Yi5nPWNbZl07ZT1xYihoLGQsITAsYikmJmU7fWg9Yi5nPWE7ZT1xYihoLGQsITAsYikmJmU7ZT1xYihoLGQsITEsYikmJmU7aWYoYylmb3IoZj0wO2Y8Yy5sZW5ndGg7ZisrKWg9Yi5nPWNbZl0sZT1xYihoLGQsITEsYikmJmU7fVxuQy5wcm90b3R5cGUuTT1mdW5jdGlvbigpe0MuWi5NLmNhbGwodGhpcyk7aWYodGhpcy5pKXt2YXIgYT10aGlzLmksYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKVphKGRbZV0pO2RlbGV0ZSBhLmdbY107YS5oLS07fX10aGlzLkk9bnVsbDt9O0MucHJvdG90eXBlLk49ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMuaS5hZGQoU3RyaW5nKGEpLGIsITEsYyxkKX07Qy5wcm90b3R5cGUuTz1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5pLmFkZChTdHJpbmcoYSksYiwhMCxjLGQpfTtcbmZ1bmN0aW9uIHFiKGEsYixjLGQpe2I9YS5pLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4gITA7Yj1iLmNvbmNhdCgpO2Zvcih2YXIgZT0hMCxmPTA7ZjxiLmxlbmd0aDsrK2Ype3ZhciBoPWJbZl07aWYoaCYmIWguY2EmJmguY2FwdHVyZT09Yyl7dmFyIG49aC5saXN0ZW5lcix1PWguaWF8fGguc3JjO2guZmEmJmJiKGEuaSxoKTtlPSExIT09bi5jYWxsKHUsZCkmJmU7fX1yZXR1cm4gZSYmIWQuZGVmYXVsdFByZXZlbnRlZH12YXIgcmI9bC5KU09OLnN0cmluZ2lmeTtmdW5jdGlvbiBzYigpe3ZhciBhPXRiO2xldCBiPW51bGw7YS5nJiYoYj1hLmcsYS5nPWEuZy5uZXh0LGEuZ3x8KGEuaD1udWxsKSxiLm5leHQ9bnVsbCk7cmV0dXJuIGJ9Y2xhc3MgdWJ7Y29uc3RydWN0b3IoKXt0aGlzLmg9dGhpcy5nPW51bGw7fWFkZChhLGIpe2NvbnN0IGM9dmIuZ2V0KCk7Yy5zZXQoYSxiKTt0aGlzLmg/dGhpcy5oLm5leHQ9Yzp0aGlzLmc9Yzt0aGlzLmg9Yzt9fXZhciB2Yj1uZXcgY2xhc3N7Y29uc3RydWN0b3IoYSxiKXt0aGlzLmk9YTt0aGlzLmo9Yjt0aGlzLmg9MDt0aGlzLmc9bnVsbDt9Z2V0KCl7bGV0IGE7MDx0aGlzLmg/KHRoaXMuaC0tLGE9dGhpcy5nLHRoaXMuZz1hLm5leHQsYS5uZXh0PW51bGwpOmE9dGhpcy5pKCk7cmV0dXJuIGF9fSgoKT0+bmV3IHdiLGE9PmEucmVzZXQoKSk7XG5jbGFzcyB3Yntjb25zdHJ1Y3Rvcigpe3RoaXMubmV4dD10aGlzLmc9dGhpcy5oPW51bGw7fXNldChhLGIpe3RoaXMuaD1hO3RoaXMuZz1iO3RoaXMubmV4dD1udWxsO31yZXNldCgpe3RoaXMubmV4dD10aGlzLmc9dGhpcy5oPW51bGw7fX1mdW5jdGlvbiB5YihhKXtsLnNldFRpbWVvdXQoKCk9Pnt0aHJvdyBhO30sMCk7fWZ1bmN0aW9uIHpiKGEsYil7QWJ8fEJiKCk7Q2J8fChBYigpLENiPSEwKTt0Yi5hZGQoYSxiKTt9dmFyIEFiO2Z1bmN0aW9uIEJiKCl7dmFyIGE9bC5Qcm9taXNlLnJlc29sdmUodm9pZCAwKTtBYj1mdW5jdGlvbigpe2EudGhlbihEYik7fTt9dmFyIENiPSExLHRiPW5ldyB1YjtmdW5jdGlvbiBEYigpe2Zvcih2YXIgYTthPXNiKCk7KXt0cnl7YS5oLmNhbGwoYS5nKTt9Y2F0Y2goYyl7eWIoYyk7fXZhciBiPXZiO2IuaihhKTsxMDA+Yi5oJiYoYi5oKyssYS5uZXh0PWIuZyxiLmc9YSk7fUNiPSExO31mdW5jdGlvbiBFYihhLGIpe0MuY2FsbCh0aGlzKTt0aGlzLmg9YXx8MTt0aGlzLmc9Ynx8bDt0aGlzLmo9cSh0aGlzLmtiLHRoaXMpO3RoaXMubD1EYXRlLm5vdygpO310KEViLEMpO2s9RWIucHJvdG90eXBlO2suZGE9ITE7ay5TPW51bGw7ay5rYj1mdW5jdGlvbigpe2lmKHRoaXMuZGEpe3ZhciBhPURhdGUubm93KCktdGhpcy5sOzA8YSYmYTwuOCp0aGlzLmg/dGhpcy5TPXRoaXMuZy5zZXRUaW1lb3V0KHRoaXMuaix0aGlzLmgtYSk6KHRoaXMuUyYmKHRoaXMuZy5jbGVhclRpbWVvdXQodGhpcy5TKSx0aGlzLlM9bnVsbCksRCh0aGlzLFwidGlja1wiKSx0aGlzLmRhJiYoRmIodGhpcyksdGhpcy5zdGFydCgpKSk7fX07ay5zdGFydD1mdW5jdGlvbigpe3RoaXMuZGE9ITA7dGhpcy5TfHwodGhpcy5TPXRoaXMuZy5zZXRUaW1lb3V0KHRoaXMuaix0aGlzLmgpLHRoaXMubD1EYXRlLm5vdygpKTt9O1xuZnVuY3Rpb24gRmIoYSl7YS5kYT0hMTthLlMmJihhLmcuY2xlYXJUaW1lb3V0KGEuUyksYS5TPW51bGwpO31rLk09ZnVuY3Rpb24oKXtFYi5aLk0uY2FsbCh0aGlzKTtGYih0aGlzKTtkZWxldGUgdGhpcy5nO307ZnVuY3Rpb24gR2IoYSxiLGMpe2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBhKWMmJihhPXEoYSxjKSk7ZWxzZSBpZihhJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBhLmhhbmRsZUV2ZW50KWE9cShhLmhhbmRsZUV2ZW50LGEpO2Vsc2UgdGhyb3cgRXJyb3IoXCJJbnZhbGlkIGxpc3RlbmVyIGFyZ3VtZW50XCIpO3JldHVybiAyMTQ3NDgzNjQ3PE51bWJlcihiKT8tMTpsLnNldFRpbWVvdXQoYSxifHwwKX1mdW5jdGlvbiBIYihhKXthLmc9R2IoKCk9PnthLmc9bnVsbDthLmkmJihhLmk9ITEsSGIoYSkpO30sYS5qKTtjb25zdCBiPWEuaDthLmg9bnVsbDthLm0uYXBwbHkobnVsbCxiKTt9Y2xhc3MgSWIgZXh0ZW5kcyB2e2NvbnN0cnVjdG9yKGEsYil7c3VwZXIoKTt0aGlzLm09YTt0aGlzLmo9Yjt0aGlzLmg9bnVsbDt0aGlzLmk9ITE7dGhpcy5nPW51bGw7fWwoYSl7dGhpcy5oPWFyZ3VtZW50czt0aGlzLmc/dGhpcy5pPSEwOkhiKHRoaXMpO31NKCl7c3VwZXIuTSgpO3RoaXMuZyYmKGwuY2xlYXJUaW1lb3V0KHRoaXMuZyksdGhpcy5nPW51bGwsdGhpcy5pPSExLHRoaXMuaD1udWxsKTt9fWZ1bmN0aW9uIEUoYSl7di5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fTt9dChFLHYpO3ZhciBKYj1bXTtmdW5jdGlvbiBLYihhLGIsYyxkKXtBcnJheS5pc0FycmF5KGMpfHwoYyYmKEpiWzBdPWMudG9TdHJpbmcoKSksYz1KYik7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWZiKGIsY1tlXSxkfHxhLmhhbmRsZUV2ZW50LCExLGEuaHx8YSk7aWYoIWYpYnJlYWs7YS5nW2Yua2V5XT1mO319ZnVuY3Rpb24gTGIoYSl7eGEoYS5nLGZ1bmN0aW9uKGIsYyl7dGhpcy5nLmhhc093blByb3BlcnR5KGMpJiZvYihiKTt9LGEpO2EuZz17fTt9RS5wcm90b3R5cGUuTT1mdW5jdGlvbigpe0UuWi5NLmNhbGwodGhpcyk7TGIodGhpcyk7fTtFLnByb3RvdHlwZS5oYW5kbGVFdmVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKFwiRXZlbnRIYW5kbGVyLmhhbmRsZUV2ZW50IG5vdCBpbXBsZW1lbnRlZFwiKTt9O2Z1bmN0aW9uIE1iKCl7dGhpcy5nPSEwO31NYi5wcm90b3R5cGUuQWE9ZnVuY3Rpb24oKXt0aGlzLmc9ITE7fTtmdW5jdGlvbiBOYihhLGIsYyxkLGUsZil7YS5pbmZvKGZ1bmN0aW9uKCl7aWYoYS5nKWlmKGYpe3ZhciBoPVwiXCI7Zm9yKHZhciBuPWYuc3BsaXQoXCImXCIpLHU9MDt1PG4ubGVuZ3RoO3UrKyl7dmFyIG09blt1XS5zcGxpdChcIj1cIik7aWYoMTxtLmxlbmd0aCl7dmFyIHI9bVswXTttPW1bMV07dmFyIEc9ci5zcGxpdChcIl9cIik7aD0yPD1HLmxlbmd0aCYmXCJ0eXBlXCI9PUdbMV0/aCsocitcIj1cIittK1wiJlwiKTpoKyhyK1wiPXJlZGFjdGVkJlwiKTt9fX1lbHNlIGg9bnVsbDtlbHNlIGg9ZjtyZXR1cm4gXCJYTUxIVFRQIFJFUSAoXCIrZCtcIikgW2F0dGVtcHQgXCIrZStcIl06IFwiK2IrXCJcXG5cIitjK1wiXFxuXCIraH0pO31cbmZ1bmN0aW9uIE9iKGEsYixjLGQsZSxmLGgpe2EuaW5mbyhmdW5jdGlvbigpe3JldHVybiBcIlhNTEhUVFAgUkVTUCAoXCIrZCtcIikgWyBhdHRlbXB0IFwiK2UrXCJdOiBcIitiK1wiXFxuXCIrYytcIlxcblwiK2YrXCIgXCIraH0pO31mdW5jdGlvbiBGKGEsYixjLGQpe2EuaW5mbyhmdW5jdGlvbigpe3JldHVybiBcIlhNTEhUVFAgVEVYVCAoXCIrYitcIik6IFwiK1BiKGEsYykrKGQ/XCIgXCIrZDpcIlwiKX0pO31mdW5jdGlvbiBRYihhLGIpe2EuaW5mbyhmdW5jdGlvbigpe3JldHVybiBcIlRJTUVPVVQ6IFwiK2J9KTt9TWIucHJvdG90eXBlLmluZm89ZnVuY3Rpb24oKXt9O1xuZnVuY3Rpb24gUGIoYSxiKXtpZighYS5nKXJldHVybiBiO2lmKCFiKXJldHVybiBudWxsO3RyeXt2YXIgYz1KU09OLnBhcnNlKGIpO2lmKGMpZm9yKGE9MDthPGMubGVuZ3RoO2ErKylpZihBcnJheS5pc0FycmF5KGNbYV0pKXt2YXIgZD1jW2FdO2lmKCEoMj5kLmxlbmd0aCkpe3ZhciBlPWRbMV07aWYoQXJyYXkuaXNBcnJheShlKSYmISgxPmUubGVuZ3RoKSl7dmFyIGY9ZVswXTtpZihcIm5vb3BcIiE9ZiYmXCJzdG9wXCIhPWYmJlwiY2xvc2VcIiE9Zilmb3IodmFyIGg9MTtoPGUubGVuZ3RoO2grKyllW2hdPVwiXCI7fX19cmV0dXJuIHJiKGMpfWNhdGNoKG4pe3JldHVybiBifX12YXIgSD17fSxSYj1udWxsO2Z1bmN0aW9uIFNiKCl7cmV0dXJuIFJiPVJifHxuZXcgQ31ILk1hPVwic2VydmVycmVhY2hhYmlsaXR5XCI7ZnVuY3Rpb24gVGIoYSl7ei5jYWxsKHRoaXMsSC5NYSxhKTt9dChUYix6KTtmdW5jdGlvbiBJKGEpe2NvbnN0IGI9U2IoKTtEKGIsbmV3IFRiKGIsYSkpO31ILlNUQVRfRVZFTlQ9XCJzdGF0ZXZlbnRcIjtmdW5jdGlvbiBVYihhLGIpe3ouY2FsbCh0aGlzLEguU1RBVF9FVkVOVCxhKTt0aGlzLnN0YXQ9Yjt9dChVYix6KTtmdW5jdGlvbiBKKGEpe2NvbnN0IGI9U2IoKTtEKGIsbmV3IFViKGIsYSkpO31ILk5hPVwidGltaW5nZXZlbnRcIjtmdW5jdGlvbiBWYihhLGIpe3ouY2FsbCh0aGlzLEguTmEsYSk7dGhpcy5zaXplPWI7fXQoVmIseik7XG5mdW5jdGlvbiBLKGEsYil7aWYoXCJmdW5jdGlvblwiIT09dHlwZW9mIGEpdGhyb3cgRXJyb3IoXCJGbiBtdXN0IG5vdCBiZSBudWxsIGFuZCBtdXN0IGJlIGEgZnVuY3Rpb25cIik7cmV0dXJuIGwuc2V0VGltZW91dChmdW5jdGlvbigpe2EoKTt9LGIpfXZhciBXYj17Tk9fRVJST1I6MCxsYjoxLHliOjIseGI6MyxzYjo0LHdiOjUsemI6NixKYTo3LFRJTUVPVVQ6OCxDYjo5fTt2YXIgWGI9e3FiOlwiY29tcGxldGVcIixNYjpcInN1Y2Nlc3NcIixLYTpcImVycm9yXCIsSmE6XCJhYm9ydFwiLEViOlwicmVhZHlcIixGYjpcInJlYWR5c3RhdGVjaGFuZ2VcIixUSU1FT1VUOlwidGltZW91dFwiLEFiOlwiaW5jcmVtZW50YWxkYXRhXCIsRGI6XCJwcm9ncmVzc1wiLHRiOlwiZG93bmxvYWRwcm9ncmVzc1wiLFViOlwidXBsb2FkcHJvZ3Jlc3NcIn07ZnVuY3Rpb24gWWIoKXt9WWIucHJvdG90eXBlLmg9bnVsbDtmdW5jdGlvbiBaYihhKXtyZXR1cm4gYS5ofHwoYS5oPWEuaSgpKX1mdW5jdGlvbiAkYigpe312YXIgTD17T1BFTjpcImFcIixwYjpcImJcIixLYTpcImNcIixCYjpcImRcIn07ZnVuY3Rpb24gYWMoKXt6LmNhbGwodGhpcyxcImRcIik7fXQoYWMseik7ZnVuY3Rpb24gYmMoKXt6LmNhbGwodGhpcyxcImNcIik7fXQoYmMseik7dmFyIGNjO2Z1bmN0aW9uIGRjKCl7fXQoZGMsWWIpO2RjLnByb3RvdHlwZS5nPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdH07ZGMucHJvdG90eXBlLmk9ZnVuY3Rpb24oKXtyZXR1cm4ge319O2NjPW5ldyBkYztmdW5jdGlvbiBNKGEsYixjLGQpe3RoaXMubD1hO3RoaXMuaj1iO3RoaXMubT1jO3RoaXMuWD1kfHwxO3RoaXMuVj1uZXcgRSh0aGlzKTt0aGlzLlA9ZWM7YT1KYT8xMjU6dm9pZCAwO3RoaXMuVz1uZXcgRWIoYSk7dGhpcy5IPW51bGw7dGhpcy5pPSExO3RoaXMucz10aGlzLkE9dGhpcy52PXRoaXMuSz10aGlzLkY9dGhpcy5ZPXRoaXMuQj1udWxsO3RoaXMuRD1bXTt0aGlzLmc9bnVsbDt0aGlzLkM9MDt0aGlzLm89dGhpcy51PW51bGw7dGhpcy5OPS0xO3RoaXMuST0hMTt0aGlzLk89MDt0aGlzLkw9bnVsbDt0aGlzLmFhPXRoaXMuSj10aGlzLiQ9dGhpcy5VPSExO3RoaXMuaD1uZXcgZmM7fWZ1bmN0aW9uIGZjKCl7dGhpcy5pPW51bGw7dGhpcy5nPVwiXCI7dGhpcy5oPSExO312YXIgZWM9NDVFMyxnYz17fSxoYz17fTtrPU0ucHJvdG90eXBlO2suc2V0VGltZW91dD1mdW5jdGlvbihhKXt0aGlzLlA9YTt9O1xuZnVuY3Rpb24gaWMoYSxiLGMpe2EuSz0xO2Eudj1qYyhOKGIpKTthLnM9YzthLlU9ITA7a2MoYSxudWxsKTt9ZnVuY3Rpb24ga2MoYSxiKXthLkY9RGF0ZS5ub3coKTtsYyhhKTthLkE9TihhLnYpO3ZhciBjPWEuQSxkPWEuWDtBcnJheS5pc0FycmF5KGQpfHwoZD1bU3RyaW5nKGQpXSk7bWMoYy5oLFwidFwiLGQpO2EuQz0wO2M9YS5sLkg7YS5oPW5ldyBmYzthLmc9bmMoYS5sLGM/YjpudWxsLCFhLnMpOzA8YS5PJiYoYS5MPW5ldyBJYihxKGEuSWEsYSxhLmcpLGEuTykpO0tiKGEuVixhLmcsXCJyZWFkeXN0YXRlY2hhbmdlXCIsYS5nYik7Yj1hLkg/eWEoYS5IKTp7fTthLnM/KGEudXx8KGEudT1cIlBPU1RcIiksYltcIkNvbnRlbnQtVHlwZVwiXT1cImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiLGEuZy5lYShhLkEsYS51LGEucyxiKSk6KGEudT1cIkdFVFwiLGEuZy5lYShhLkEsYS51LG51bGwsYikpO0koMSk7TmIoYS5qLGEudSxhLkEsYS5tLGEuWCxhLnMpO31cbmsuZ2I9ZnVuY3Rpb24oYSl7YT1hLnRhcmdldDtjb25zdCBiPXRoaXMuTDtiJiYzPT1PKGEpP2IubCgpOnRoaXMuSWEoYSk7fTtcbmsuSWE9ZnVuY3Rpb24oYSl7dHJ5e2lmKGE9PXRoaXMuZylhOntjb25zdCByPU8odGhpcy5nKTt2YXIgYj10aGlzLmcuRGEoKTtjb25zdCBHPXRoaXMuZy5iYSgpO2lmKCEoMz5yKSYmKDMhPXJ8fEphfHx0aGlzLmcmJih0aGlzLmguaHx8dGhpcy5nLmdhKCl8fG9jKHRoaXMuZykpKSl7dGhpcy5JfHw0IT1yfHw3PT1ifHwoOD09Ynx8MD49Rz9JKDMpOkkoMikpO3BjKHRoaXMpO3ZhciBjPXRoaXMuZy5iYSgpO3RoaXMuTj1jO2I6aWYocWModGhpcykpe3ZhciBkPW9jKHRoaXMuZyk7YT1cIlwiO3ZhciBlPWQubGVuZ3RoLGY9ND09Tyh0aGlzLmcpO2lmKCF0aGlzLmguaSl7aWYoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiBUZXh0RGVjb2Rlcil7UCh0aGlzKTtyYyh0aGlzKTt2YXIgaD1cIlwiO2JyZWFrIGJ9dGhpcy5oLmk9bmV3IGwuVGV4dERlY29kZXI7fWZvcihiPTA7YjxlO2IrKyl0aGlzLmguaD0hMCxhKz10aGlzLmguaS5kZWNvZGUoZFtiXSx7c3RyZWFtOmYmJmI9PWUtMX0pO2Quc3BsaWNlKDAsXG5lKTt0aGlzLmguZys9YTt0aGlzLkM9MDtoPXRoaXMuaC5nO31lbHNlIGg9dGhpcy5nLmdhKCk7dGhpcy5pPTIwMD09YztPYih0aGlzLmosdGhpcy51LHRoaXMuQSx0aGlzLm0sdGhpcy5YLHIsYyk7aWYodGhpcy5pKXtpZih0aGlzLiQmJiF0aGlzLkope2I6e2lmKHRoaXMuZyl7dmFyIG4sdT10aGlzLmc7aWYoKG49dS5nP3UuZy5nZXRSZXNwb25zZUhlYWRlcihcIlgtSFRUUC1Jbml0aWFsLVJlc3BvbnNlXCIpOm51bGwpJiYhc2Eobikpe3ZhciBtPW47YnJlYWsgYn19bT1udWxsO31pZihjPW0pRih0aGlzLmosdGhpcy5tLGMsXCJJbml0aWFsIGhhbmRzaGFrZSByZXNwb25zZSB2aWEgWC1IVFRQLUluaXRpYWwtUmVzcG9uc2VcIiksdGhpcy5KPSEwLHNjKHRoaXMsYyk7ZWxzZSB7dGhpcy5pPSExO3RoaXMubz0zO0ooMTIpO1AodGhpcyk7cmModGhpcyk7YnJlYWsgYX19dGhpcy5VPyh0Yyh0aGlzLHIsaCksSmEmJnRoaXMuaSYmMz09ciYmKEtiKHRoaXMuVix0aGlzLlcsXCJ0aWNrXCIsdGhpcy5mYiksXG50aGlzLlcuc3RhcnQoKSkpOihGKHRoaXMuaix0aGlzLm0saCxudWxsKSxzYyh0aGlzLGgpKTs0PT1yJiZQKHRoaXMpO3RoaXMuaSYmIXRoaXMuSSYmKDQ9PXI/dWModGhpcy5sLHRoaXMpOih0aGlzLmk9ITEsbGModGhpcykpKTt9ZWxzZSA0MDA9PWMmJjA8aC5pbmRleE9mKFwiVW5rbm93biBTSURcIik/KHRoaXMubz0zLEooMTIpKToodGhpcy5vPTAsSigxMykpLFAodGhpcykscmModGhpcyk7fX19Y2F0Y2gocil7fWZpbmFsbHl7fX07ZnVuY3Rpb24gcWMoYSl7cmV0dXJuIGEuZz9cIkdFVFwiPT1hLnUmJjIhPWEuSyYmYS5sLkJhOiExfVxuZnVuY3Rpb24gdGMoYSxiLGMpe2xldCBkPSEwLGU7Zm9yKDshYS5JJiZhLkM8Yy5sZW5ndGg7KWlmKGU9dmMoYSxjKSxlPT1oYyl7ND09YiYmKGEubz00LEooMTQpLGQ9ITEpO0YoYS5qLGEubSxudWxsLFwiW0luY29tcGxldGUgUmVzcG9uc2VdXCIpO2JyZWFrfWVsc2UgaWYoZT09Z2Mpe2Eubz00O0ooMTUpO0YoYS5qLGEubSxjLFwiW0ludmFsaWQgQ2h1bmtdXCIpO2Q9ITE7YnJlYWt9ZWxzZSBGKGEuaixhLm0sZSxudWxsKSxzYyhhLGUpO3FjKGEpJiZlIT1oYyYmZSE9Z2MmJihhLmguZz1cIlwiLGEuQz0wKTs0IT1ifHwwIT1jLmxlbmd0aHx8YS5oLmh8fChhLm89MSxKKDE2KSxkPSExKTthLmk9YS5pJiZkO2Q/MDxjLmxlbmd0aCYmIWEuYWEmJihhLmFhPSEwLGI9YS5sLGIuZz09YSYmYi4kJiYhYi5MJiYoYi5oLmluZm8oXCJHcmVhdCwgbm8gYnVmZmVyaW5nIHByb3h5IGRldGVjdGVkLiBCeXRlcyByZWNlaXZlZDogXCIrYy5sZW5ndGgpLHdjKGIpLGIuTD0hMCxKKDExKSkpOihGKGEuaixhLm0sXG5jLFwiW0ludmFsaWQgQ2h1bmtlZCBSZXNwb25zZV1cIiksUChhKSxyYyhhKSk7fWsuZmI9ZnVuY3Rpb24oKXtpZih0aGlzLmcpe3ZhciBhPU8odGhpcy5nKSxiPXRoaXMuZy5nYSgpO3RoaXMuQzxiLmxlbmd0aCYmKHBjKHRoaXMpLHRjKHRoaXMsYSxiKSx0aGlzLmkmJjQhPWEmJmxjKHRoaXMpKTt9fTtmdW5jdGlvbiB2YyhhLGIpe3ZhciBjPWEuQyxkPWIuaW5kZXhPZihcIlxcblwiLGMpO2lmKC0xPT1kKXJldHVybiBoYztjPU51bWJlcihiLnN1YnN0cmluZyhjLGQpKTtpZihpc05hTihjKSlyZXR1cm4gZ2M7ZCs9MTtpZihkK2M+Yi5sZW5ndGgpcmV0dXJuIGhjO2I9Yi5zdWJzdHIoZCxjKTthLkM9ZCtjO3JldHVybiBifWsuY2FuY2VsPWZ1bmN0aW9uKCl7dGhpcy5JPSEwO1AodGhpcyk7fTtmdW5jdGlvbiBsYyhhKXthLlk9RGF0ZS5ub3coKSthLlA7eGMoYSxhLlApO31cbmZ1bmN0aW9uIHhjKGEsYil7aWYobnVsbCE9YS5CKXRocm93IEVycm9yKFwiV2F0Y2hEb2cgdGltZXIgbm90IG51bGxcIik7YS5CPUsocShhLmViLGEpLGIpO31mdW5jdGlvbiBwYyhhKXthLkImJihsLmNsZWFyVGltZW91dChhLkIpLGEuQj1udWxsKTt9ay5lYj1mdW5jdGlvbigpe3RoaXMuQj1udWxsO2NvbnN0IGE9RGF0ZS5ub3coKTswPD1hLXRoaXMuWT8oUWIodGhpcy5qLHRoaXMuQSksMiE9dGhpcy5LJiYoSSgzKSxKKDE3KSksUCh0aGlzKSx0aGlzLm89MixyYyh0aGlzKSk6eGModGhpcyx0aGlzLlktYSk7fTtmdW5jdGlvbiByYyhhKXswPT1hLmwuR3x8YS5JfHx1YyhhLmwsYSk7fWZ1bmN0aW9uIFAoYSl7cGMoYSk7dmFyIGI9YS5MO2ImJlwiZnVuY3Rpb25cIj09dHlwZW9mIGIubmEmJmIubmEoKTthLkw9bnVsbDtGYihhLlcpO0xiKGEuVik7YS5nJiYoYj1hLmcsYS5nPW51bGwsYi5hYm9ydCgpLGIubmEoKSk7fVxuZnVuY3Rpb24gc2MoYSxiKXt0cnl7dmFyIGM9YS5sO2lmKDAhPWMuRyYmKGMuZz09YXx8eWMoYy5pLGEpKSlpZihjLkk9YS5OLCFhLkomJnljKGMuaSxhKSYmMz09Yy5HKXt0cnl7dmFyIGQ9Yy5DYS5nLnBhcnNlKGIpO31jYXRjaChtKXtkPW51bGw7fWlmKEFycmF5LmlzQXJyYXkoZCkmJjM9PWQubGVuZ3RoKXt2YXIgZT1kO2lmKDA9PWVbMF0pYTp7aWYoIWMudSl7aWYoYy5nKWlmKGMuZy5GKzNFMzxhLkYpemMoYyksQWMoYyk7ZWxzZSBicmVhayBhO0JjKGMpO0ooMTgpO319ZWxzZSBjLnRhPWVbMV0sMDxjLnRhLWMuVSYmMzc1MDA+ZVsyXSYmYy5OJiYwPT1jLkEmJiFjLnYmJihjLnY9SyhxKGMuYWIsYyksNkUzKSk7aWYoMT49Q2MoYy5pKSYmYy5rYSl7dHJ5e2Mua2EoKTt9Y2F0Y2gobSl7fWMua2E9dm9pZCAwO319ZWxzZSBRKGMsMTEpO31lbHNlIGlmKChhLkp8fGMuZz09YSkmJnpjKGMpLCFzYShiKSlmb3IoZT1jLkNhLmcucGFyc2UoYiksYj0wO2I8ZS5sZW5ndGg7YisrKXtsZXQgbT1lW2JdO1xuYy5VPW1bMF07bT1tWzFdO2lmKDI9PWMuRylpZihcImNcIj09bVswXSl7Yy5KPW1bMV07Yy5sYT1tWzJdO2NvbnN0IHI9bVszXTtudWxsIT1yJiYoYy5tYT1yLGMuaC5pbmZvKFwiVkVSPVwiK2MubWEpKTtjb25zdCBHPW1bNF07bnVsbCE9RyYmKGMuemE9RyxjLmguaW5mbyhcIlNWRVI9XCIrYy56YSkpO2NvbnN0IERhPW1bNV07bnVsbCE9RGEmJlwibnVtYmVyXCI9PT10eXBlb2YgRGEmJjA8RGEmJihkPTEuNSpEYSxjLks9ZCxjLmguaW5mbyhcImJhY2tDaGFubmVsUmVxdWVzdFRpbWVvdXRNc189XCIrZCkpO2Q9Yztjb25zdCBjYT1hLmc7aWYoY2Epe2NvbnN0IEVhPWNhLmc/Y2EuZy5nZXRSZXNwb25zZUhlYWRlcihcIlgtQ2xpZW50LVdpcmUtUHJvdG9jb2xcIik6bnVsbDtpZihFYSl7dmFyIGY9ZC5pOyFmLmcmJih3KEVhLFwic3BkeVwiKXx8dyhFYSxcInF1aWNcIil8fHcoRWEsXCJoMlwiKSkmJihmLmo9Zi5sLGYuZz1uZXcgU2V0LGYuaCYmKERjKGYsZi5oKSxmLmg9bnVsbCkpO31pZihkLkQpe2NvbnN0IHhiPVxuY2EuZz9jYS5nLmdldFJlc3BvbnNlSGVhZGVyKFwiWC1IVFRQLVNlc3Npb24tSWRcIik6bnVsbDt4YiYmKGQuc2E9eGIsUihkLkYsZC5ELHhiKSk7fX1jLkc9MztjLmomJmMuai54YSgpO2MuJCYmKGMuTz1EYXRlLm5vdygpLWEuRixjLmguaW5mbyhcIkhhbmRzaGFrZSBSVFQ6IFwiK2MuTytcIm1zXCIpKTtkPWM7dmFyIGg9YTtkLm9hPUVjKGQsZC5IP2QubGE6bnVsbCxkLlcpO2lmKGguSil7RmMoZC5pLGgpO3ZhciBuPWgsdT1kLks7dSYmbi5zZXRUaW1lb3V0KHUpO24uQiYmKHBjKG4pLGxjKG4pKTtkLmc9aDt9ZWxzZSBHYyhkKTswPGMubC5sZW5ndGgmJkhjKGMpO31lbHNlIFwic3RvcFwiIT1tWzBdJiZcImNsb3NlXCIhPW1bMF18fFEoYyw3KTtlbHNlIDM9PWMuRyYmKFwic3RvcFwiPT1tWzBdfHxcImNsb3NlXCI9PW1bMF0/XCJzdG9wXCI9PW1bMF0/UShjLDcpOkljKGMpOlwibm9vcFwiIT1tWzBdJiZjLmomJmMuai53YShtKSxjLkE9MCk7fUkoNCk7fWNhdGNoKG0pe319ZnVuY3Rpb24gSmMoYSl7aWYoYS5SJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBhLlIpcmV0dXJuIGEuUigpO2lmKFwic3RyaW5nXCI9PT10eXBlb2YgYSlyZXR1cm4gYS5zcGxpdChcIlwiKTtpZihiYShhKSl7Zm9yKHZhciBiPVtdLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspYi5wdXNoKGFbZF0pO3JldHVybiBifWI9W107Yz0wO2ZvcihkIGluIGEpYltjKytdPWFbZF07cmV0dXJuIGJ9XG5mdW5jdGlvbiBLYyhhLGIpe2lmKGEuZm9yRWFjaCYmXCJmdW5jdGlvblwiPT10eXBlb2YgYS5mb3JFYWNoKWEuZm9yRWFjaChiLHZvaWQgMCk7ZWxzZSBpZihiYShhKXx8XCJzdHJpbmdcIj09PXR5cGVvZiBhKW5hKGEsYix2b2lkIDApO2Vsc2Uge2lmKGEuVCYmXCJmdW5jdGlvblwiPT10eXBlb2YgYS5UKXZhciBjPWEuVCgpO2Vsc2UgaWYoYS5SJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBhLlIpYz12b2lkIDA7ZWxzZSBpZihiYShhKXx8XCJzdHJpbmdcIj09PXR5cGVvZiBhKXtjPVtdO2Zvcih2YXIgZD1hLmxlbmd0aCxlPTA7ZTxkO2UrKyljLnB1c2goZSk7fWVsc2UgZm9yKGUgaW4gYz1bXSxkPTAsYSljW2QrK109ZTtkPUpjKGEpO2U9ZC5sZW5ndGg7Zm9yKHZhciBmPTA7ZjxlO2YrKyliLmNhbGwodm9pZCAwLGRbZl0sYyYmY1tmXSxhKTt9fWZ1bmN0aW9uIFMoYSxiKXt0aGlzLmg9e307dGhpcy5nPVtdO3RoaXMuaT0wO3ZhciBjPWFyZ3VtZW50cy5sZW5ndGg7aWYoMTxjKXtpZihjJTIpdGhyb3cgRXJyb3IoXCJVbmV2ZW4gbnVtYmVyIG9mIGFyZ3VtZW50c1wiKTtmb3IodmFyIGQ9MDtkPGM7ZCs9Mil0aGlzLnNldChhcmd1bWVudHNbZF0sYXJndW1lbnRzW2QrMV0pO31lbHNlIGlmKGEpaWYoYSBpbnN0YW5jZW9mIFMpZm9yKGM9YS5UKCksZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMuc2V0KGNbZF0sYS5nZXQoY1tkXSkpO2Vsc2UgZm9yKGQgaW4gYSl0aGlzLnNldChkLGFbZF0pO31rPVMucHJvdG90eXBlO2suUj1mdW5jdGlvbigpe0xjKHRoaXMpO2Zvcih2YXIgYT1bXSxiPTA7Yjx0aGlzLmcubGVuZ3RoO2IrKylhLnB1c2godGhpcy5oW3RoaXMuZ1tiXV0pO3JldHVybiBhfTtrLlQ9ZnVuY3Rpb24oKXtMYyh0aGlzKTtyZXR1cm4gdGhpcy5nLmNvbmNhdCgpfTtcbmZ1bmN0aW9uIExjKGEpe2lmKGEuaSE9YS5nLmxlbmd0aCl7Zm9yKHZhciBiPTAsYz0wO2I8YS5nLmxlbmd0aDspe3ZhciBkPWEuZ1tiXTtUKGEuaCxkKSYmKGEuZ1tjKytdPWQpO2IrKzt9YS5nLmxlbmd0aD1jO31pZihhLmkhPWEuZy5sZW5ndGgpe3ZhciBlPXt9O2ZvcihjPWI9MDtiPGEuZy5sZW5ndGg7KWQ9YS5nW2JdLFQoZSxkKXx8KGEuZ1tjKytdPWQsZVtkXT0xKSxiKys7YS5nLmxlbmd0aD1jO319ay5nZXQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVCh0aGlzLmgsYSk/dGhpcy5oW2FdOmJ9O2suc2V0PWZ1bmN0aW9uKGEsYil7VCh0aGlzLmgsYSl8fCh0aGlzLmkrKyx0aGlzLmcucHVzaChhKSk7dGhpcy5oW2FdPWI7fTtrLmZvckVhY2g9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9dGhpcy5UKCksZD0wO2Q8Yy5sZW5ndGg7ZCsrKXt2YXIgZT1jW2RdLGY9dGhpcy5nZXQoZSk7YS5jYWxsKGIsZixlLHRoaXMpO319O1xuZnVuY3Rpb24gVChhLGIpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxiKX12YXIgTWM9L14oPzooW146Lz8jLl0rKTopPyg/OlxcL1xcLyg/OihbXlxcXFwvPyNdKilAKT8oW15cXFxcLz8jXSo/KSg/OjooWzAtOV0rKSk/KD89W1xcXFwvPyNdfCQpKT8oW14/I10rKT8oPzpcXD8oW14jXSopKT8oPzojKFtcXHNcXFNdKikpPyQvO2Z1bmN0aW9uIE5jKGEsYil7aWYoYSl7YT1hLnNwbGl0KFwiJlwiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXS5pbmRleE9mKFwiPVwiKSxlPW51bGw7aWYoMDw9ZCl7dmFyIGY9YVtjXS5zdWJzdHJpbmcoMCxkKTtlPWFbY10uc3Vic3RyaW5nKGQrMSk7fWVsc2UgZj1hW2NdO2IoZixlP2RlY29kZVVSSUNvbXBvbmVudChlLnJlcGxhY2UoL1xcKy9nLFwiIFwiKSk6XCJcIik7fX19ZnVuY3Rpb24gVShhLGIpe3RoaXMuaT10aGlzLnM9dGhpcy5qPVwiXCI7dGhpcy5tPW51bGw7dGhpcy5vPXRoaXMubD1cIlwiO3RoaXMuZz0hMTtpZihhIGluc3RhbmNlb2YgVSl7dGhpcy5nPXZvaWQgMCE9PWI/YjphLmc7T2ModGhpcyxhLmopO3RoaXMucz1hLnM7UGModGhpcyxhLmkpO1FjKHRoaXMsYS5tKTt0aGlzLmw9YS5sO2I9YS5oO3ZhciBjPW5ldyBSYztjLmk9Yi5pO2IuZyYmKGMuZz1uZXcgUyhiLmcpLGMuaD1iLmgpO1NjKHRoaXMsYyk7dGhpcy5vPWEubzt9ZWxzZSBhJiYoYz1TdHJpbmcoYSkubWF0Y2goTWMpKT8odGhpcy5nPSEhYixPYyh0aGlzLGNbMV18fFwiXCIsITApLHRoaXMucz1UYyhjWzJdfHxcIlwiKSxQYyh0aGlzLGNbM118fFwiXCIsITApLFFjKHRoaXMsY1s0XSksdGhpcy5sPVRjKGNbNV18fFwiXCIsITApLFNjKHRoaXMsY1s2XXx8XCJcIiwhMCksdGhpcy5vPVRjKGNbN118fFwiXCIpKToodGhpcy5nPSEhYix0aGlzLmg9bmV3IFJjKG51bGwsdGhpcy5nKSk7fVxuVS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgYT1bXSxiPXRoaXMuajtiJiZhLnB1c2goVWMoYixWYywhMCksXCI6XCIpO3ZhciBjPXRoaXMuaTtpZihjfHxcImZpbGVcIj09YilhLnB1c2goXCIvL1wiKSwoYj10aGlzLnMpJiZhLnB1c2goVWMoYixWYywhMCksXCJAXCIpLGEucHVzaChlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGMpKS5yZXBsYWNlKC8lMjUoWzAtOWEtZkEtRl17Mn0pL2csXCIlJDFcIikpLGM9dGhpcy5tLG51bGwhPWMmJmEucHVzaChcIjpcIixTdHJpbmcoYykpO2lmKGM9dGhpcy5sKXRoaXMuaSYmXCIvXCIhPWMuY2hhckF0KDApJiZhLnB1c2goXCIvXCIpLGEucHVzaChVYyhjLFwiL1wiPT1jLmNoYXJBdCgwKT9XYzpYYywhMCkpOyhjPXRoaXMuaC50b1N0cmluZygpKSYmYS5wdXNoKFwiP1wiLGMpOyhjPXRoaXMubykmJmEucHVzaChcIiNcIixVYyhjLFljKSk7cmV0dXJuIGEuam9pbihcIlwiKX07ZnVuY3Rpb24gTihhKXtyZXR1cm4gbmV3IFUoYSl9XG5mdW5jdGlvbiBPYyhhLGIsYyl7YS5qPWM/VGMoYiwhMCk6YjthLmomJihhLmo9YS5qLnJlcGxhY2UoLzokLyxcIlwiKSk7fWZ1bmN0aW9uIFBjKGEsYixjKXthLmk9Yz9UYyhiLCEwKTpiO31mdW5jdGlvbiBRYyhhLGIpe2lmKGIpe2I9TnVtYmVyKGIpO2lmKGlzTmFOKGIpfHwwPmIpdGhyb3cgRXJyb3IoXCJCYWQgcG9ydCBudW1iZXIgXCIrYik7YS5tPWI7fWVsc2UgYS5tPW51bGw7fWZ1bmN0aW9uIFNjKGEsYixjKXtiIGluc3RhbmNlb2YgUmM/KGEuaD1iLFpjKGEuaCxhLmcpKTooY3x8KGI9VWMoYiwkYykpLGEuaD1uZXcgUmMoYixhLmcpKTt9ZnVuY3Rpb24gUihhLGIsYyl7YS5oLnNldChiLGMpO31mdW5jdGlvbiBqYyhhKXtSKGEsXCJ6eFwiLE1hdGguZmxvb3IoMjE0NzQ4MzY0OCpNYXRoLnJhbmRvbSgpKS50b1N0cmluZygzNikrTWF0aC5hYnMoTWF0aC5mbG9vcigyMTQ3NDgzNjQ4Kk1hdGgucmFuZG9tKCkpXkRhdGUubm93KCkpLnRvU3RyaW5nKDM2KSk7cmV0dXJuIGF9XG5mdW5jdGlvbiBhZChhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFU/TihhKTpuZXcgVShhLHZvaWQgMCl9ZnVuY3Rpb24gYmQoYSxiLGMsZCl7dmFyIGU9bmV3IFUobnVsbCx2b2lkIDApO2EmJk9jKGUsYSk7YiYmUGMoZSxiKTtjJiZRYyhlLGMpO2QmJihlLmw9ZCk7cmV0dXJuIGV9ZnVuY3Rpb24gVGMoYSxiKXtyZXR1cm4gYT9iP2RlY29kZVVSSShhLnJlcGxhY2UoLyUyNS9nLFwiJTI1MjVcIikpOmRlY29kZVVSSUNvbXBvbmVudChhKTpcIlwifWZ1bmN0aW9uIFVjKGEsYixjKXtyZXR1cm4gXCJzdHJpbmdcIj09PXR5cGVvZiBhPyhhPWVuY29kZVVSSShhKS5yZXBsYWNlKGIsY2QpLGMmJihhPWEucmVwbGFjZSgvJTI1KFswLTlhLWZBLUZdezJ9KS9nLFwiJSQxXCIpKSxhKTpudWxsfWZ1bmN0aW9uIGNkKGEpe2E9YS5jaGFyQ29kZUF0KDApO3JldHVybiBcIiVcIisoYT4+NCYxNSkudG9TdHJpbmcoMTYpKyhhJjE1KS50b1N0cmluZygxNil9XG52YXIgVmM9L1sjXFwvXFw/QF0vZyxYYz0vWyNcXD86XS9nLFdjPS9bI1xcP10vZywkYz0vWyNcXD9AXS9nLFljPS8jL2c7ZnVuY3Rpb24gUmMoYSxiKXt0aGlzLmg9dGhpcy5nPW51bGw7dGhpcy5pPWF8fG51bGw7dGhpcy5qPSEhYjt9ZnVuY3Rpb24gVihhKXthLmd8fChhLmc9bmV3IFMsYS5oPTAsYS5pJiZOYyhhLmksZnVuY3Rpb24oYixjKXthLmFkZChkZWNvZGVVUklDb21wb25lbnQoYi5yZXBsYWNlKC9cXCsvZyxcIiBcIikpLGMpO30pKTt9az1SYy5wcm90b3R5cGU7ay5hZGQ9ZnVuY3Rpb24oYSxiKXtWKHRoaXMpO3RoaXMuaT1udWxsO2E9Vyh0aGlzLGEpO3ZhciBjPXRoaXMuZy5nZXQoYSk7Y3x8dGhpcy5nLnNldChhLGM9W10pO2MucHVzaChiKTt0aGlzLmgrPTE7cmV0dXJuIHRoaXN9O1xuZnVuY3Rpb24gZGQoYSxiKXtWKGEpO2I9VyhhLGIpO1QoYS5nLmgsYikmJihhLmk9bnVsbCxhLmgtPWEuZy5nZXQoYikubGVuZ3RoLGE9YS5nLFQoYS5oLGIpJiYoZGVsZXRlIGEuaFtiXSxhLmktLSxhLmcubGVuZ3RoPjIqYS5pJiZMYyhhKSkpO31mdW5jdGlvbiBlZChhLGIpe1YoYSk7Yj1XKGEsYik7cmV0dXJuIFQoYS5nLmgsYil9ay5mb3JFYWNoPWZ1bmN0aW9uKGEsYil7Vih0aGlzKTt0aGlzLmcuZm9yRWFjaChmdW5jdGlvbihjLGQpe25hKGMsZnVuY3Rpb24oZSl7YS5jYWxsKGIsZSxkLHRoaXMpO30sdGhpcyk7fSx0aGlzKTt9O2suVD1mdW5jdGlvbigpe1YodGhpcyk7Zm9yKHZhciBhPXRoaXMuZy5SKCksYj10aGlzLmcuVCgpLGM9W10sZD0wO2Q8Yi5sZW5ndGg7ZCsrKWZvcih2YXIgZT1hW2RdLGY9MDtmPGUubGVuZ3RoO2YrKyljLnB1c2goYltkXSk7cmV0dXJuIGN9O1xuay5SPWZ1bmN0aW9uKGEpe1YodGhpcyk7dmFyIGI9W107aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKWVkKHRoaXMsYSkmJihiPXFhKGIsdGhpcy5nLmdldChXKHRoaXMsYSkpKSk7ZWxzZSB7YT10aGlzLmcuUigpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9cWEoYixhW2NdKTt9cmV0dXJuIGJ9O2suc2V0PWZ1bmN0aW9uKGEsYil7Vih0aGlzKTt0aGlzLmk9bnVsbDthPVcodGhpcyxhKTtlZCh0aGlzLGEpJiYodGhpcy5oLT10aGlzLmcuZ2V0KGEpLmxlbmd0aCk7dGhpcy5nLnNldChhLFtiXSk7dGhpcy5oKz0xO3JldHVybiB0aGlzfTtrLmdldD1mdW5jdGlvbihhLGIpe2lmKCFhKXJldHVybiBiO2E9dGhpcy5SKGEpO3JldHVybiAwPGEubGVuZ3RoP1N0cmluZyhhWzBdKTpifTtmdW5jdGlvbiBtYyhhLGIsYyl7ZGQoYSxiKTswPGMubGVuZ3RoJiYoYS5pPW51bGwsYS5nLnNldChXKGEsYikscmEoYykpLGEuaCs9Yy5sZW5ndGgpO31cbmsudG9TdHJpbmc9ZnVuY3Rpb24oKXtpZih0aGlzLmkpcmV0dXJuIHRoaXMuaTtpZighdGhpcy5nKXJldHVybiBcIlwiO2Zvcih2YXIgYT1bXSxiPXRoaXMuZy5UKCksYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD1iW2NdLGU9ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhkKSk7ZD10aGlzLlIoZCk7Zm9yKHZhciBmPTA7ZjxkLmxlbmd0aDtmKyspe3ZhciBoPWU7XCJcIiE9PWRbZl0mJihoKz1cIj1cIitlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGRbZl0pKSk7YS5wdXNoKGgpO319cmV0dXJuIHRoaXMuaT1hLmpvaW4oXCImXCIpfTtmdW5jdGlvbiBXKGEsYil7Yj1TdHJpbmcoYik7YS5qJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBifWZ1bmN0aW9uIFpjKGEsYil7YiYmIWEuaiYmKFYoYSksYS5pPW51bGwsYS5nLmZvckVhY2goZnVuY3Rpb24oYyxkKXt2YXIgZT1kLnRvTG93ZXJDYXNlKCk7ZCE9ZSYmKGRkKHRoaXMsZCksbWModGhpcyxlLGMpKTt9LGEpKTthLmo9Yjt9dmFyIGZkPWNsYXNze2NvbnN0cnVjdG9yKGEsYil7dGhpcy5oPWE7dGhpcy5nPWI7fX07ZnVuY3Rpb24gZ2QoYSl7dGhpcy5sPWF8fGhkO2wuUGVyZm9ybWFuY2VOYXZpZ2F0aW9uVGltaW5nPyhhPWwucGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5VHlwZShcIm5hdmlnYXRpb25cIiksYT0wPGEubGVuZ3RoJiYoXCJocVwiPT1hWzBdLm5leHRIb3BQcm90b2NvbHx8XCJoMlwiPT1hWzBdLm5leHRIb3BQcm90b2NvbCkpOmE9ISEobC5nJiZsLmcuRWEmJmwuZy5FYSgpJiZsLmcuRWEoKS5aYik7dGhpcy5qPWE/dGhpcy5sOjE7dGhpcy5nPW51bGw7MTx0aGlzLmomJih0aGlzLmc9bmV3IFNldCk7dGhpcy5oPW51bGw7dGhpcy5pPVtdO312YXIgaGQ9MTA7ZnVuY3Rpb24gaWQoYSl7cmV0dXJuIGEuaD8hMDphLmc/YS5nLnNpemU+PWEuajohMX1mdW5jdGlvbiBDYyhhKXtyZXR1cm4gYS5oPzE6YS5nP2EuZy5zaXplOjB9ZnVuY3Rpb24geWMoYSxiKXtyZXR1cm4gYS5oP2EuaD09YjphLmc/YS5nLmhhcyhiKTohMX1mdW5jdGlvbiBEYyhhLGIpe2EuZz9hLmcuYWRkKGIpOmEuaD1iO31cbmZ1bmN0aW9uIEZjKGEsYil7YS5oJiZhLmg9PWI/YS5oPW51bGw6YS5nJiZhLmcuaGFzKGIpJiZhLmcuZGVsZXRlKGIpO31nZC5wcm90b3R5cGUuY2FuY2VsPWZ1bmN0aW9uKCl7dGhpcy5pPWpkKHRoaXMpO2lmKHRoaXMuaCl0aGlzLmguY2FuY2VsKCksdGhpcy5oPW51bGw7ZWxzZSBpZih0aGlzLmcmJjAhPT10aGlzLmcuc2l6ZSl7Zm9yKGNvbnN0IGEgb2YgdGhpcy5nLnZhbHVlcygpKWEuY2FuY2VsKCk7dGhpcy5nLmNsZWFyKCk7fX07ZnVuY3Rpb24gamQoYSl7aWYobnVsbCE9YS5oKXJldHVybiBhLmkuY29uY2F0KGEuaC5EKTtpZihudWxsIT1hLmcmJjAhPT1hLmcuc2l6ZSl7bGV0IGI9YS5pO2Zvcihjb25zdCBjIG9mIGEuZy52YWx1ZXMoKSliPWIuY29uY2F0KGMuRCk7cmV0dXJuIGJ9cmV0dXJuIHJhKGEuaSl9ZnVuY3Rpb24ga2QoKXt9a2QucHJvdG90eXBlLnN0cmluZ2lmeT1mdW5jdGlvbihhKXtyZXR1cm4gbC5KU09OLnN0cmluZ2lmeShhLHZvaWQgMCl9O2tkLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihhKXtyZXR1cm4gbC5KU09OLnBhcnNlKGEsdm9pZCAwKX07ZnVuY3Rpb24gbGQoKXt0aGlzLmc9bmV3IGtkO31mdW5jdGlvbiBtZChhLGIsYyl7Y29uc3QgZD1jfHxcIlwiO3RyeXtLYyhhLGZ1bmN0aW9uKGUsZil7bGV0IGg9ZTtwKGUpJiYoaD1yYihlKSk7Yi5wdXNoKGQrZitcIj1cIitlbmNvZGVVUklDb21wb25lbnQoaCkpO30pO31jYXRjaChlKXt0aHJvdyBiLnB1c2goZCtcInR5cGU9XCIrZW5jb2RlVVJJQ29tcG9uZW50KFwiX2JhZG1hcFwiKSksZTt9fWZ1bmN0aW9uIG5kKGEsYil7Y29uc3QgYz1uZXcgTWI7aWYobC5JbWFnZSl7Y29uc3QgZD1uZXcgSW1hZ2U7ZC5vbmxvYWQ9amEob2QsYyxkLFwiVGVzdExvYWRJbWFnZTogbG9hZGVkXCIsITAsYik7ZC5vbmVycm9yPWphKG9kLGMsZCxcIlRlc3RMb2FkSW1hZ2U6IGVycm9yXCIsITEsYik7ZC5vbmFib3J0PWphKG9kLGMsZCxcIlRlc3RMb2FkSW1hZ2U6IGFib3J0XCIsITEsYik7ZC5vbnRpbWVvdXQ9amEob2QsYyxkLFwiVGVzdExvYWRJbWFnZTogdGltZW91dFwiLCExLGIpO2wuc2V0VGltZW91dChmdW5jdGlvbigpe2lmKGQub250aW1lb3V0KWQub250aW1lb3V0KCk7fSwxRTQpO2Quc3JjPWE7fWVsc2UgYighMSk7fWZ1bmN0aW9uIG9kKGEsYixjLGQsZSl7dHJ5e2Iub25sb2FkPW51bGwsYi5vbmVycm9yPW51bGwsYi5vbmFib3J0PW51bGwsYi5vbnRpbWVvdXQ9bnVsbCxlKGQpO31jYXRjaChmKXt9fWZ1bmN0aW9uIHBkKGEpe3RoaXMubD1hLiRifHxudWxsO3RoaXMuaj1hLmlifHwhMTt9dChwZCxZYik7cGQucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHFkKHRoaXMubCx0aGlzLmopfTtwZC5wcm90b3R5cGUuaT1mdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYX19KHt9KTtmdW5jdGlvbiBxZChhLGIpe0MuY2FsbCh0aGlzKTt0aGlzLkQ9YTt0aGlzLnU9Yjt0aGlzLm09dm9pZCAwO3RoaXMucmVhZHlTdGF0ZT1yZDt0aGlzLnN0YXR1cz0wO3RoaXMucmVzcG9uc2VUeXBlPXRoaXMucmVzcG9uc2VUZXh0PXRoaXMucmVzcG9uc2U9dGhpcy5zdGF0dXNUZXh0PVwiXCI7dGhpcy5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbDt0aGlzLnY9bmV3IEhlYWRlcnM7dGhpcy5oPW51bGw7dGhpcy5DPVwiR0VUXCI7dGhpcy5CPVwiXCI7dGhpcy5nPSExO3RoaXMuQT10aGlzLmo9dGhpcy5sPW51bGw7fXQocWQsQyk7dmFyIHJkPTA7az1xZC5wcm90b3R5cGU7XG5rLm9wZW49ZnVuY3Rpb24oYSxiKXtpZih0aGlzLnJlYWR5U3RhdGUhPXJkKXRocm93IHRoaXMuYWJvcnQoKSxFcnJvcihcIkVycm9yIHJlb3BlbmluZyBhIGNvbm5lY3Rpb25cIik7dGhpcy5DPWE7dGhpcy5CPWI7dGhpcy5yZWFkeVN0YXRlPTE7c2QodGhpcyk7fTtrLnNlbmQ9ZnVuY3Rpb24oYSl7aWYoMSE9dGhpcy5yZWFkeVN0YXRlKXRocm93IHRoaXMuYWJvcnQoKSxFcnJvcihcIm5lZWQgdG8gY2FsbCBvcGVuKCkgZmlyc3QuIFwiKTt0aGlzLmc9ITA7Y29uc3QgYj17aGVhZGVyczp0aGlzLnYsbWV0aG9kOnRoaXMuQyxjcmVkZW50aWFsczp0aGlzLm0sY2FjaGU6dm9pZCAwfTthJiYoYi5ib2R5PWEpOyh0aGlzLkR8fGwpLmZldGNoKG5ldyBSZXF1ZXN0KHRoaXMuQixiKSkudGhlbih0aGlzLlZhLmJpbmQodGhpcyksdGhpcy5oYS5iaW5kKHRoaXMpKTt9O1xuay5hYm9ydD1mdW5jdGlvbigpe3RoaXMucmVzcG9uc2U9dGhpcy5yZXNwb25zZVRleHQ9XCJcIjt0aGlzLnY9bmV3IEhlYWRlcnM7dGhpcy5zdGF0dXM9MDt0aGlzLmomJnRoaXMuai5jYW5jZWwoXCJSZXF1ZXN0IHdhcyBhYm9ydGVkLlwiKTsxPD10aGlzLnJlYWR5U3RhdGUmJnRoaXMuZyYmNCE9dGhpcy5yZWFkeVN0YXRlJiYodGhpcy5nPSExLHRkKHRoaXMpKTt0aGlzLnJlYWR5U3RhdGU9cmQ7fTtcbmsuVmE9ZnVuY3Rpb24oYSl7aWYodGhpcy5nJiYodGhpcy5sPWEsdGhpcy5ofHwodGhpcy5zdGF0dXM9dGhpcy5sLnN0YXR1cyx0aGlzLnN0YXR1c1RleHQ9dGhpcy5sLnN0YXR1c1RleHQsdGhpcy5oPWEuaGVhZGVycyx0aGlzLnJlYWR5U3RhdGU9MixzZCh0aGlzKSksdGhpcy5nJiYodGhpcy5yZWFkeVN0YXRlPTMsc2QodGhpcyksdGhpcy5nKSkpaWYoXCJhcnJheWJ1ZmZlclwiPT09dGhpcy5yZXNwb25zZVR5cGUpYS5hcnJheUJ1ZmZlcigpLnRoZW4odGhpcy5UYS5iaW5kKHRoaXMpLHRoaXMuaGEuYmluZCh0aGlzKSk7ZWxzZSBpZihcInVuZGVmaW5lZFwiIT09dHlwZW9mIGwuUmVhZGFibGVTdHJlYW0mJlwiYm9keVwiaW4gYSl7dGhpcy5qPWEuYm9keS5nZXRSZWFkZXIoKTtpZih0aGlzLnUpe2lmKHRoaXMucmVzcG9uc2VUeXBlKXRocm93IEVycm9yKCdyZXNwb25zZVR5cGUgbXVzdCBiZSBlbXB0eSBmb3IgXCJzdHJlYW1CaW5hcnlDaHVua3NcIiBtb2RlIHJlc3BvbnNlcy4nKTt0aGlzLnJlc3BvbnNlPVxuW107fWVsc2UgdGhpcy5yZXNwb25zZT10aGlzLnJlc3BvbnNlVGV4dD1cIlwiLHRoaXMuQT1uZXcgVGV4dERlY29kZXI7dWQodGhpcyk7fWVsc2UgYS50ZXh0KCkudGhlbih0aGlzLlVhLmJpbmQodGhpcyksdGhpcy5oYS5iaW5kKHRoaXMpKTt9O2Z1bmN0aW9uIHVkKGEpe2Euai5yZWFkKCkudGhlbihhLlNhLmJpbmQoYSkpLmNhdGNoKGEuaGEuYmluZChhKSk7fWsuU2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5nKXtpZih0aGlzLnUmJmEudmFsdWUpdGhpcy5yZXNwb25zZS5wdXNoKGEudmFsdWUpO2Vsc2UgaWYoIXRoaXMudSl7dmFyIGI9YS52YWx1ZT9hLnZhbHVlOm5ldyBVaW50OEFycmF5KDApO2lmKGI9dGhpcy5BLmRlY29kZShiLHtzdHJlYW06IWEuZG9uZX0pKXRoaXMucmVzcG9uc2U9dGhpcy5yZXNwb25zZVRleHQrPWI7fWEuZG9uZT90ZCh0aGlzKTpzZCh0aGlzKTszPT10aGlzLnJlYWR5U3RhdGUmJnVkKHRoaXMpO319O1xuay5VYT1mdW5jdGlvbihhKXt0aGlzLmcmJih0aGlzLnJlc3BvbnNlPXRoaXMucmVzcG9uc2VUZXh0PWEsdGQodGhpcykpO307ay5UYT1mdW5jdGlvbihhKXt0aGlzLmcmJih0aGlzLnJlc3BvbnNlPWEsdGQodGhpcykpO307ay5oYT1mdW5jdGlvbigpe3RoaXMuZyYmdGQodGhpcyk7fTtmdW5jdGlvbiB0ZChhKXthLnJlYWR5U3RhdGU9NDthLmw9bnVsbDthLmo9bnVsbDthLkE9bnVsbDtzZChhKTt9ay5zZXRSZXF1ZXN0SGVhZGVyPWZ1bmN0aW9uKGEsYil7dGhpcy52LmFwcGVuZChhLGIpO307ay5nZXRSZXNwb25zZUhlYWRlcj1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5oP3RoaXMuaC5nZXQoYS50b0xvd2VyQ2FzZSgpKXx8XCJcIjpcIlwifTtcbmsuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzPWZ1bmN0aW9uKCl7aWYoIXRoaXMuaClyZXR1cm4gXCJcIjtjb25zdCBhPVtdLGI9dGhpcy5oLmVudHJpZXMoKTtmb3IodmFyIGM9Yi5uZXh0KCk7IWMuZG9uZTspYz1jLnZhbHVlLGEucHVzaChjWzBdK1wiOiBcIitjWzFdKSxjPWIubmV4dCgpO3JldHVybiBhLmpvaW4oXCJcXHJcXG5cIil9O2Z1bmN0aW9uIHNkKGEpe2Eub25yZWFkeXN0YXRlY2hhbmdlJiZhLm9ucmVhZHlzdGF0ZWNoYW5nZS5jYWxsKGEpO31PYmplY3QuZGVmaW5lUHJvcGVydHkocWQucHJvdG90eXBlLFwid2l0aENyZWRlbnRpYWxzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBcImluY2x1ZGVcIj09PXRoaXMubX0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubT1hP1wiaW5jbHVkZVwiOlwic2FtZS1vcmlnaW5cIjt9fSk7dmFyIHZkPWwuSlNPTi5wYXJzZTtmdW5jdGlvbiBYKGEpe0MuY2FsbCh0aGlzKTt0aGlzLmhlYWRlcnM9bmV3IFM7dGhpcy51PWF8fG51bGw7dGhpcy5oPSExO3RoaXMuQz10aGlzLmc9bnVsbDt0aGlzLkg9XCJcIjt0aGlzLm09MDt0aGlzLmo9XCJcIjt0aGlzLmw9dGhpcy5GPXRoaXMudj10aGlzLkQ9ITE7dGhpcy5CPTA7dGhpcy5BPW51bGw7dGhpcy5KPXdkO3RoaXMuSz10aGlzLkw9ITE7fXQoWCxDKTt2YXIgd2Q9XCJcIix4ZD0vXmh0dHBzPyQvaSx5ZD1bXCJQT1NUXCIsXCJQVVRcIl07az1YLnByb3RvdHlwZTtcbmsuZWE9ZnVuY3Rpb24oYSxiLGMsZCl7aWYodGhpcy5nKXRocm93IEVycm9yKFwiW2dvb2cubmV0LlhocklvXSBPYmplY3QgaXMgYWN0aXZlIHdpdGggYW5vdGhlciByZXF1ZXN0PVwiK3RoaXMuSCtcIjsgbmV3VXJpPVwiK2EpO2I9Yj9iLnRvVXBwZXJDYXNlKCk6XCJHRVRcIjt0aGlzLkg9YTt0aGlzLmo9XCJcIjt0aGlzLm09MDt0aGlzLkQ9ITE7dGhpcy5oPSEwO3RoaXMuZz10aGlzLnU/dGhpcy51LmcoKTpjYy5nKCk7dGhpcy5DPXRoaXMudT9aYih0aGlzLnUpOlpiKGNjKTt0aGlzLmcub25yZWFkeXN0YXRlY2hhbmdlPXEodGhpcy5GYSx0aGlzKTt0cnl7dGhpcy5GPSEwLHRoaXMuZy5vcGVuKGIsU3RyaW5nKGEpLCEwKSx0aGlzLkY9ITE7fWNhdGNoKGYpe3pkKHRoaXMsZik7cmV0dXJufWE9Y3x8XCJcIjtjb25zdCBlPW5ldyBTKHRoaXMuaGVhZGVycyk7ZCYmS2MoZCxmdW5jdGlvbihmLGgpe2Uuc2V0KGgsZik7fSk7ZD1vYShlLlQoKSk7Yz1sLkZvcm1EYXRhJiZhIGluc3RhbmNlb2YgbC5Gb3JtRGF0YTtcbiEoMDw9bWEoeWQsYikpfHxkfHxjfHxlLnNldChcIkNvbnRlbnQtVHlwZVwiLFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLThcIik7ZS5mb3JFYWNoKGZ1bmN0aW9uKGYsaCl7dGhpcy5nLnNldFJlcXVlc3RIZWFkZXIoaCxmKTt9LHRoaXMpO3RoaXMuSiYmKHRoaXMuZy5yZXNwb25zZVR5cGU9dGhpcy5KKTtcIndpdGhDcmVkZW50aWFsc1wiaW4gdGhpcy5nJiZ0aGlzLmcud2l0aENyZWRlbnRpYWxzIT09dGhpcy5MJiYodGhpcy5nLndpdGhDcmVkZW50aWFscz10aGlzLkwpO3RyeXtBZCh0aGlzKSwwPHRoaXMuQiYmKCh0aGlzLks9QmQodGhpcy5nKSk/KHRoaXMuZy50aW1lb3V0PXRoaXMuQix0aGlzLmcub250aW1lb3V0PXEodGhpcy5wYSx0aGlzKSk6dGhpcy5BPUdiKHRoaXMucGEsdGhpcy5CLHRoaXMpKSx0aGlzLnY9ITAsdGhpcy5nLnNlbmQoYSksdGhpcy52PSExO31jYXRjaChmKXt6ZCh0aGlzLGYpO319O1xuZnVuY3Rpb24gQmQoYSl7cmV0dXJuIHkmJlJhKCkmJlwibnVtYmVyXCI9PT10eXBlb2YgYS50aW1lb3V0JiZ2b2lkIDAhPT1hLm9udGltZW91dH1mdW5jdGlvbiBwYShhKXtyZXR1cm4gXCJjb250ZW50LXR5cGVcIj09YS50b0xvd2VyQ2FzZSgpfWsucGE9ZnVuY3Rpb24oKXtcInVuZGVmaW5lZFwiIT10eXBlb2YgZ29vZyYmdGhpcy5nJiYodGhpcy5qPVwiVGltZWQgb3V0IGFmdGVyIFwiK3RoaXMuQitcIm1zLCBhYm9ydGluZ1wiLHRoaXMubT04LEQodGhpcyxcInRpbWVvdXRcIiksdGhpcy5hYm9ydCg4KSk7fTtmdW5jdGlvbiB6ZChhLGIpe2EuaD0hMTthLmcmJihhLmw9ITAsYS5nLmFib3J0KCksYS5sPSExKTthLmo9YjthLm09NTtDZChhKTtEZChhKTt9ZnVuY3Rpb24gQ2QoYSl7YS5EfHwoYS5EPSEwLEQoYSxcImNvbXBsZXRlXCIpLEQoYSxcImVycm9yXCIpKTt9XG5rLmFib3J0PWZ1bmN0aW9uKGEpe3RoaXMuZyYmdGhpcy5oJiYodGhpcy5oPSExLHRoaXMubD0hMCx0aGlzLmcuYWJvcnQoKSx0aGlzLmw9ITEsdGhpcy5tPWF8fDcsRCh0aGlzLFwiY29tcGxldGVcIiksRCh0aGlzLFwiYWJvcnRcIiksRGQodGhpcykpO307ay5NPWZ1bmN0aW9uKCl7dGhpcy5nJiYodGhpcy5oJiYodGhpcy5oPSExLHRoaXMubD0hMCx0aGlzLmcuYWJvcnQoKSx0aGlzLmw9ITEpLERkKHRoaXMsITApKTtYLlouTS5jYWxsKHRoaXMpO307ay5GYT1mdW5jdGlvbigpe3RoaXMuc3x8KHRoaXMuRnx8dGhpcy52fHx0aGlzLmw/RWQodGhpcyk6dGhpcy5jYigpKTt9O2suY2I9ZnVuY3Rpb24oKXtFZCh0aGlzKTt9O1xuZnVuY3Rpb24gRWQoYSl7aWYoYS5oJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgZ29vZyYmKCFhLkNbMV18fDQhPU8oYSl8fDIhPWEuYmEoKSkpaWYoYS52JiY0PT1PKGEpKUdiKGEuRmEsMCxhKTtlbHNlIGlmKEQoYSxcInJlYWR5c3RhdGVjaGFuZ2VcIiksND09TyhhKSl7YS5oPSExO3RyeXtjb25zdCBuPWEuYmEoKTthOnN3aXRjaChuKXtjYXNlIDIwMDpjYXNlIDIwMTpjYXNlIDIwMjpjYXNlIDIwNDpjYXNlIDIwNjpjYXNlIDMwNDpjYXNlIDEyMjM6dmFyIGI9ITA7YnJlYWsgYTtkZWZhdWx0OmI9ITE7fXZhciBjO2lmKCEoYz1iKSl7dmFyIGQ7aWYoZD0wPT09bil7dmFyIGU9U3RyaW5nKGEuSCkubWF0Y2goTWMpWzFdfHxudWxsO2lmKCFlJiZsLnNlbGYmJmwuc2VsZi5sb2NhdGlvbil7dmFyIGY9bC5zZWxmLmxvY2F0aW9uLnByb3RvY29sO2U9Zi5zdWJzdHIoMCxmLmxlbmd0aC0xKTt9ZD0heGQudGVzdChlP2UudG9Mb3dlckNhc2UoKTpcIlwiKTt9Yz1kO31pZihjKUQoYSxcImNvbXBsZXRlXCIpLEQoYSxcblwic3VjY2Vzc1wiKTtlbHNlIHthLm09Njt0cnl7dmFyIGg9MjxPKGEpP2EuZy5zdGF0dXNUZXh0OlwiXCI7fWNhdGNoKHUpe2g9XCJcIjt9YS5qPWgrXCIgW1wiK2EuYmEoKStcIl1cIjtDZChhKTt9fWZpbmFsbHl7RGQoYSk7fX19ZnVuY3Rpb24gRGQoYSxiKXtpZihhLmcpe0FkKGEpO2NvbnN0IGM9YS5nLGQ9YS5DWzBdP2FhOm51bGw7YS5nPW51bGw7YS5DPW51bGw7Ynx8RChhLFwicmVhZHlcIik7dHJ5e2Mub25yZWFkeXN0YXRlY2hhbmdlPWQ7fWNhdGNoKGUpe319fWZ1bmN0aW9uIEFkKGEpe2EuZyYmYS5LJiYoYS5nLm9udGltZW91dD1udWxsKTthLkEmJihsLmNsZWFyVGltZW91dChhLkEpLGEuQT1udWxsKTt9ZnVuY3Rpb24gTyhhKXtyZXR1cm4gYS5nP2EuZy5yZWFkeVN0YXRlOjB9ay5iYT1mdW5jdGlvbigpe3RyeXtyZXR1cm4gMjxPKHRoaXMpP3RoaXMuZy5zdGF0dXM6LTF9Y2F0Y2goYSl7cmV0dXJuIC0xfX07XG5rLmdhPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiB0aGlzLmc/dGhpcy5nLnJlc3BvbnNlVGV4dDpcIlwifWNhdGNoKGEpe3JldHVybiBcIlwifX07ay5RYT1mdW5jdGlvbihhKXtpZih0aGlzLmcpe3ZhciBiPXRoaXMuZy5yZXNwb25zZVRleHQ7YSYmMD09Yi5pbmRleE9mKGEpJiYoYj1iLnN1YnN0cmluZyhhLmxlbmd0aCkpO3JldHVybiB2ZChiKX19O2Z1bmN0aW9uIG9jKGEpe3RyeXtpZighYS5nKXJldHVybiBudWxsO2lmKFwicmVzcG9uc2VcImluIGEuZylyZXR1cm4gYS5nLnJlc3BvbnNlO3N3aXRjaChhLkope2Nhc2Ugd2Q6Y2FzZSBcInRleHRcIjpyZXR1cm4gYS5nLnJlc3BvbnNlVGV4dDtjYXNlIFwiYXJyYXlidWZmZXJcIjppZihcIm1velJlc3BvbnNlQXJyYXlCdWZmZXJcImluIGEuZylyZXR1cm4gYS5nLm1velJlc3BvbnNlQXJyYXlCdWZmZXJ9cmV0dXJuIG51bGx9Y2F0Y2goYil7cmV0dXJuIG51bGx9fWsuRGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tfTtcbmsuTGE9ZnVuY3Rpb24oKXtyZXR1cm4gXCJzdHJpbmdcIj09PXR5cGVvZiB0aGlzLmo/dGhpcy5qOlN0cmluZyh0aGlzLmopfTtmdW5jdGlvbiBGZChhKXtsZXQgYj1cIlwiO3hhKGEsZnVuY3Rpb24oYyxkKXtiKz1kO2IrPVwiOlwiO2IrPWM7Yis9XCJcXHJcXG5cIjt9KTtyZXR1cm4gYn1mdW5jdGlvbiBHZChhLGIsYyl7YTp7Zm9yKGQgaW4gYyl7dmFyIGQ9ITE7YnJlYWsgYX1kPSEwO31kfHwoYz1GZChjKSxcInN0cmluZ1wiPT09dHlwZW9mIGE/KG51bGwhPWMmJmVuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoYykpKTpSKGEsYixjKSk7fWZ1bmN0aW9uIEhkKGEsYixjKXtyZXR1cm4gYyYmYy5pbnRlcm5hbENoYW5uZWxQYXJhbXM/Yy5pbnRlcm5hbENoYW5uZWxQYXJhbXNbYV18fGI6Yn1cbmZ1bmN0aW9uIElkKGEpe3RoaXMuemE9MDt0aGlzLmw9W107dGhpcy5oPW5ldyBNYjt0aGlzLmxhPXRoaXMub2E9dGhpcy5GPXRoaXMuVz10aGlzLmc9dGhpcy5zYT10aGlzLkQ9dGhpcy5hYT10aGlzLm89dGhpcy5QPXRoaXMucz1udWxsO3RoaXMuWmE9dGhpcy5WPTA7dGhpcy5YYT1IZChcImZhaWxGYXN0XCIsITEsYSk7dGhpcy5OPXRoaXMudj10aGlzLnU9dGhpcy5tPXRoaXMuaj1udWxsO3RoaXMuWD0hMDt0aGlzLkk9dGhpcy50YT10aGlzLlU9LTE7dGhpcy5ZPXRoaXMuQT10aGlzLkM9MDt0aGlzLlBhPUhkKFwiYmFzZVJldHJ5RGVsYXlNc1wiLDVFMyxhKTt0aGlzLiRhPUhkKFwicmV0cnlEZWxheVNlZWRNc1wiLDFFNCxhKTt0aGlzLllhPUhkKFwiZm9yd2FyZENoYW5uZWxNYXhSZXRyaWVzXCIsMixhKTt0aGlzLnJhPUhkKFwiZm9yd2FyZENoYW5uZWxSZXF1ZXN0VGltZW91dE1zXCIsMkU0LGEpO3RoaXMucWE9YSYmYS54bWxIdHRwRmFjdG9yeXx8dm9pZCAwO3RoaXMuQmE9YSYmYS5ZYnx8ITE7XG50aGlzLks9dm9pZCAwO3RoaXMuSD1hJiZhLnN1cHBvcnRzQ3Jvc3NEb21haW5YaHJ8fCExO3RoaXMuSj1cIlwiO3RoaXMuaT1uZXcgZ2QoYSYmYS5jb25jdXJyZW50UmVxdWVzdExpbWl0KTt0aGlzLkNhPW5ldyBsZDt0aGlzLmphPWEmJmEuZmFzdEhhbmRzaGFrZXx8ITE7dGhpcy5SYT1hJiZhLldifHwhMTthJiZhLkFhJiZ0aGlzLmguQWEoKTthJiZhLmZvcmNlTG9uZ1BvbGxpbmcmJih0aGlzLlg9ITEpO3RoaXMuJD0hdGhpcy5qYSYmdGhpcy5YJiZhJiZhLmRldGVjdEJ1ZmZlcmluZ1Byb3h5fHwhMTt0aGlzLmthPXZvaWQgMDt0aGlzLk89MDt0aGlzLkw9ITE7dGhpcy5CPW51bGw7dGhpcy5XYT0hYXx8ITEhPT1hLlhiO31rPUlkLnByb3RvdHlwZTtrLm1hPTg7ay5HPTE7XG5mdW5jdGlvbiBJYyhhKXtKZChhKTtpZigzPT1hLkcpe3ZhciBiPWEuVisrLGM9TihhLkYpO1IoYyxcIlNJRFwiLGEuSik7UihjLFwiUklEXCIsYik7UihjLFwiVFlQRVwiLFwidGVybWluYXRlXCIpO0tkKGEsYyk7Yj1uZXcgTShhLGEuaCxiLHZvaWQgMCk7Yi5LPTI7Yi52PWpjKE4oYykpO2M9ITE7bC5uYXZpZ2F0b3ImJmwubmF2aWdhdG9yLnNlbmRCZWFjb24mJihjPWwubmF2aWdhdG9yLnNlbmRCZWFjb24oYi52LnRvU3RyaW5nKCksXCJcIikpOyFjJiZsLkltYWdlJiYoKG5ldyBJbWFnZSkuc3JjPWIudixjPSEwKTtjfHwoYi5nPW5jKGIubCxudWxsKSxiLmcuZWEoYi52KSk7Yi5GPURhdGUubm93KCk7bGMoYik7fUxkKGEpO31rLmhiPWZ1bmN0aW9uKGEpe3RyeXt0aGlzLmguaW5mbyhcIk9yaWdpbiBUcmlhbHMgaW52b2tlZDogXCIrYSk7fWNhdGNoKGIpe319O2Z1bmN0aW9uIEFjKGEpe2EuZyYmKHdjKGEpLGEuZy5jYW5jZWwoKSxhLmc9bnVsbCk7fVxuZnVuY3Rpb24gSmQoYSl7QWMoYSk7YS51JiYobC5jbGVhclRpbWVvdXQoYS51KSxhLnU9bnVsbCk7emMoYSk7YS5pLmNhbmNlbCgpO2EubSYmKFwibnVtYmVyXCI9PT10eXBlb2YgYS5tJiZsLmNsZWFyVGltZW91dChhLm0pLGEubT1udWxsKTt9ZnVuY3Rpb24gTWQoYSxiKXthLmwucHVzaChuZXcgZmQoYS5aYSsrLGIpKTszPT1hLkcmJkhjKGEpO31mdW5jdGlvbiBIYyhhKXtpZChhLmkpfHxhLm18fChhLm09ITAsemIoYS5IYSxhKSxhLkM9MCk7fWZ1bmN0aW9uIE5kKGEsYil7aWYoQ2MoYS5pKT49YS5pLmotKGEubT8xOjApKXJldHVybiAhMTtpZihhLm0pcmV0dXJuIGEubD1iLkQuY29uY2F0KGEubCksITA7aWYoMT09YS5HfHwyPT1hLkd8fGEuQz49KGEuWGE/MDphLllhKSlyZXR1cm4gITE7YS5tPUsocShhLkhhLGEsYiksT2QoYSxhLkMpKTthLkMrKztyZXR1cm4gITB9XG5rLkhhPWZ1bmN0aW9uKGEpe2lmKHRoaXMubSlpZih0aGlzLm09bnVsbCwxPT10aGlzLkcpe2lmKCFhKXt0aGlzLlY9TWF0aC5mbG9vcigxRTUqTWF0aC5yYW5kb20oKSk7YT10aGlzLlYrKztjb25zdCBlPW5ldyBNKHRoaXMsdGhpcy5oLGEsdm9pZCAwKTtsZXQgZj10aGlzLnM7dGhpcy5QJiYoZj8oZj15YShmKSxBYShmLHRoaXMuUCkpOmY9dGhpcy5QKTtudWxsPT09dGhpcy5vJiYoZS5IPWYpO2lmKHRoaXMuamEpYTp7dmFyIGI9MDtmb3IodmFyIGM9MDtjPHRoaXMubC5sZW5ndGg7YysrKXtiOnt2YXIgZD10aGlzLmxbY107aWYoXCJfX2RhdGFfX1wiaW4gZC5nJiYoZD1kLmcuX19kYXRhX18sXCJzdHJpbmdcIj09PXR5cGVvZiBkKSl7ZD1kLmxlbmd0aDticmVhayBifWQ9dm9pZCAwO31pZih2b2lkIDA9PT1kKWJyZWFrO2IrPWQ7aWYoNDA5NjxiKXtiPWM7YnJlYWsgYX1pZig0MDk2PT09Ynx8Yz09PXRoaXMubC5sZW5ndGgtMSl7Yj1jKzE7YnJlYWsgYX19Yj0xRTM7fWVsc2UgYj0xRTM7Yj1cblBkKHRoaXMsZSxiKTtjPU4odGhpcy5GKTtSKGMsXCJSSURcIixhKTtSKGMsXCJDVkVSXCIsMjIpO3RoaXMuRCYmUihjLFwiWC1IVFRQLVNlc3Npb24tSWRcIix0aGlzLkQpO0tkKHRoaXMsYyk7dGhpcy5vJiZmJiZHZChjLHRoaXMubyxmKTtEYyh0aGlzLmksZSk7dGhpcy5SYSYmUihjLFwiVFlQRVwiLFwiaW5pdFwiKTt0aGlzLmphPyhSKGMsXCIkcmVxXCIsYiksUihjLFwiU0lEXCIsXCJudWxsXCIpLGUuJD0hMCxpYyhlLGMsbnVsbCkpOmljKGUsYyxiKTt0aGlzLkc9Mjt9fWVsc2UgMz09dGhpcy5HJiYoYT9RZCh0aGlzLGEpOjA9PXRoaXMubC5sZW5ndGh8fGlkKHRoaXMuaSl8fFFkKHRoaXMpKTt9O1xuZnVuY3Rpb24gUWQoYSxiKXt2YXIgYztiP2M9Yi5tOmM9YS5WKys7Y29uc3QgZD1OKGEuRik7UihkLFwiU0lEXCIsYS5KKTtSKGQsXCJSSURcIixjKTtSKGQsXCJBSURcIixhLlUpO0tkKGEsZCk7YS5vJiZhLnMmJkdkKGQsYS5vLGEucyk7Yz1uZXcgTShhLGEuaCxjLGEuQysxKTtudWxsPT09YS5vJiYoYy5IPWEucyk7YiYmKGEubD1iLkQuY29uY2F0KGEubCkpO2I9UGQoYSxjLDFFMyk7Yy5zZXRUaW1lb3V0KE1hdGgucm91bmQoLjUqYS5yYSkrTWF0aC5yb3VuZCguNSphLnJhKk1hdGgucmFuZG9tKCkpKTtEYyhhLmksYyk7aWMoYyxkLGIpO31mdW5jdGlvbiBLZChhLGIpe2EuaiYmS2Moe30sZnVuY3Rpb24oYyxkKXtSKGIsZCxjKTt9KTt9XG5mdW5jdGlvbiBQZChhLGIsYyl7Yz1NYXRoLm1pbihhLmwubGVuZ3RoLGMpO3ZhciBkPWEuaj9xKGEuai5PYSxhLmosYSk6bnVsbDthOnt2YXIgZT1hLmw7bGV0IGY9LTE7Zm9yKDs7KXtjb25zdCBoPVtcImNvdW50PVwiK2NdOy0xPT1mPzA8Yz8oZj1lWzBdLmgsaC5wdXNoKFwib2ZzPVwiK2YpKTpmPTA6aC5wdXNoKFwib2ZzPVwiK2YpO2xldCBuPSEwO2ZvcihsZXQgdT0wO3U8Yzt1Kyspe2xldCBtPWVbdV0uaDtjb25zdCByPWVbdV0uZzttLT1mO2lmKDA+bSlmPU1hdGgubWF4KDAsZVt1XS5oLTEwMCksbj0hMTtlbHNlIHRyeXttZChyLGgsXCJyZXFcIittK1wiX1wiKTt9Y2F0Y2goRyl7ZCYmZChyKTt9fWlmKG4pe2Q9aC5qb2luKFwiJlwiKTticmVhayBhfX19YT1hLmwuc3BsaWNlKDAsYyk7Yi5EPWE7cmV0dXJuIGR9ZnVuY3Rpb24gR2MoYSl7YS5nfHxhLnV8fChhLlk9MSx6YihhLkdhLGEpLGEuQT0wKTt9XG5mdW5jdGlvbiBCYyhhKXtpZihhLmd8fGEudXx8Mzw9YS5BKXJldHVybiAhMTthLlkrKzthLnU9SyhxKGEuR2EsYSksT2QoYSxhLkEpKTthLkErKztyZXR1cm4gITB9ay5HYT1mdW5jdGlvbigpe3RoaXMudT1udWxsO1JkKHRoaXMpO2lmKHRoaXMuJCYmISh0aGlzLkx8fG51bGw9PXRoaXMuZ3x8MD49dGhpcy5PKSl7dmFyIGE9Mip0aGlzLk87dGhpcy5oLmluZm8oXCJCUCBkZXRlY3Rpb24gdGltZXIgZW5hYmxlZDogXCIrYSk7dGhpcy5CPUsocSh0aGlzLmJiLHRoaXMpLGEpO319O2suYmI9ZnVuY3Rpb24oKXt0aGlzLkImJih0aGlzLkI9bnVsbCx0aGlzLmguaW5mbyhcIkJQIGRldGVjdGlvbiB0aW1lb3V0IHJlYWNoZWQuXCIpLHRoaXMuaC5pbmZvKFwiQnVmZmVyaW5nIHByb3h5IGRldGVjdGVkIGFuZCBzd2l0Y2ggdG8gbG9uZy1wb2xsaW5nIVwiKSx0aGlzLk49ITEsdGhpcy5MPSEwLEooMTApLEFjKHRoaXMpLFJkKHRoaXMpKTt9O1xuZnVuY3Rpb24gd2MoYSl7bnVsbCE9YS5CJiYobC5jbGVhclRpbWVvdXQoYS5CKSxhLkI9bnVsbCk7fWZ1bmN0aW9uIFJkKGEpe2EuZz1uZXcgTShhLGEuaCxcInJwY1wiLGEuWSk7bnVsbD09PWEubyYmKGEuZy5IPWEucyk7YS5nLk89MDt2YXIgYj1OKGEub2EpO1IoYixcIlJJRFwiLFwicnBjXCIpO1IoYixcIlNJRFwiLGEuSik7UihiLFwiQ0lcIixhLk4/XCIwXCI6XCIxXCIpO1IoYixcIkFJRFwiLGEuVSk7S2QoYSxiKTtSKGIsXCJUWVBFXCIsXCJ4bWxodHRwXCIpO2EubyYmYS5zJiZHZChiLGEubyxhLnMpO2EuSyYmYS5nLnNldFRpbWVvdXQoYS5LKTt2YXIgYz1hLmc7YT1hLmxhO2MuSz0xO2Mudj1qYyhOKGIpKTtjLnM9bnVsbDtjLlU9ITA7a2MoYyxhKTt9ay5hYj1mdW5jdGlvbigpe251bGwhPXRoaXMudiYmKHRoaXMudj1udWxsLEFjKHRoaXMpLEJjKHRoaXMpLEooMTkpKTt9O2Z1bmN0aW9uIHpjKGEpe251bGwhPWEudiYmKGwuY2xlYXJUaW1lb3V0KGEudiksYS52PW51bGwpO31cbmZ1bmN0aW9uIHVjKGEsYil7dmFyIGM9bnVsbDtpZihhLmc9PWIpe3pjKGEpO3djKGEpO2EuZz1udWxsO3ZhciBkPTI7fWVsc2UgaWYoeWMoYS5pLGIpKWM9Yi5ELEZjKGEuaSxiKSxkPTE7ZWxzZSByZXR1cm47YS5JPWIuTjtpZigwIT1hLkcpaWYoYi5pKWlmKDE9PWQpe2M9Yi5zP2Iucy5sZW5ndGg6MDtiPURhdGUubm93KCktYi5GO3ZhciBlPWEuQztkPVNiKCk7RChkLG5ldyBWYihkLGMsYixlKSk7SGMoYSk7fWVsc2UgR2MoYSk7ZWxzZSBpZihlPWIubywzPT1lfHwwPT1lJiYwPGEuSXx8ISgxPT1kJiZOZChhLGIpfHwyPT1kJiZCYyhhKSkpc3dpdGNoKGMmJjA8Yy5sZW5ndGgmJihiPWEuaSxiLmk9Yi5pLmNvbmNhdChjKSksZSl7Y2FzZSAxOlEoYSw1KTticmVhaztjYXNlIDQ6UShhLDEwKTticmVhaztjYXNlIDM6UShhLDYpO2JyZWFrO2RlZmF1bHQ6UShhLDIpO319XG5mdW5jdGlvbiBPZChhLGIpe2xldCBjPWEuUGErTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmEuJGEpO2Euanx8KGMqPTIpO3JldHVybiBjKmJ9ZnVuY3Rpb24gUShhLGIpe2EuaC5pbmZvKFwiRXJyb3IgY29kZSBcIitiKTtpZigyPT1iKXt2YXIgYz1udWxsO2EuaiYmKGM9bnVsbCk7dmFyIGQ9cShhLmpiLGEpO2N8fChjPW5ldyBVKFwiLy93d3cuZ29vZ2xlLmNvbS9pbWFnZXMvY2xlYXJkb3QuZ2lmXCIpLGwubG9jYXRpb24mJlwiaHR0cFwiPT1sLmxvY2F0aW9uLnByb3RvY29sfHxPYyhjLFwiaHR0cHNcIiksamMoYykpO25kKGMudG9TdHJpbmcoKSxkKTt9ZWxzZSBKKDIpO2EuRz0wO2EuaiYmYS5qLnZhKGIpO0xkKGEpO0pkKGEpO31rLmpiPWZ1bmN0aW9uKGEpe2E/KHRoaXMuaC5pbmZvKFwiU3VjY2Vzc2Z1bGx5IHBpbmdlZCBnb29nbGUuY29tXCIpLEooMikpOih0aGlzLmguaW5mbyhcIkZhaWxlZCB0byBwaW5nIGdvb2dsZS5jb21cIiksSigxKSk7fTtcbmZ1bmN0aW9uIExkKGEpe2EuRz0wO2EuST0tMTtpZihhLmope2lmKDAhPWpkKGEuaSkubGVuZ3RofHwwIT1hLmwubGVuZ3RoKWEuaS5pLmxlbmd0aD0wLHJhKGEubCksYS5sLmxlbmd0aD0wO2Euai51YSgpO319ZnVuY3Rpb24gRWMoYSxiLGMpe2xldCBkPWFkKGMpO2lmKFwiXCIhPWQuaSliJiZQYyhkLGIrXCIuXCIrZC5pKSxRYyhkLGQubSk7ZWxzZSB7Y29uc3QgZT1sLmxvY2F0aW9uO2Q9YmQoZS5wcm90b2NvbCxiP2IrXCIuXCIrZS5ob3N0bmFtZTplLmhvc3RuYW1lLCtlLnBvcnQsYyk7fWEuYWEmJnhhKGEuYWEsZnVuY3Rpb24oZSxmKXtSKGQsZixlKTt9KTtiPWEuRDtjPWEuc2E7YiYmYyYmUihkLGIsYyk7UihkLFwiVkVSXCIsYS5tYSk7S2QoYSxkKTtyZXR1cm4gZH1cbmZ1bmN0aW9uIG5jKGEsYixjKXtpZihiJiYhYS5IKXRocm93IEVycm9yKFwiQ2FuJ3QgY3JlYXRlIHNlY29uZGFyeSBkb21haW4gY2FwYWJsZSBYaHJJbyBvYmplY3QuXCIpO2I9YyYmYS5CYSYmIWEucWE/bmV3IFgobmV3IHBkKHtpYjohMH0pKTpuZXcgWChhLnFhKTtiLkw9YS5IO3JldHVybiBifWZ1bmN0aW9uIFNkKCl7fWs9U2QucHJvdG90eXBlO2sueGE9ZnVuY3Rpb24oKXt9O2sud2E9ZnVuY3Rpb24oKXt9O2sudmE9ZnVuY3Rpb24oKXt9O2sudWE9ZnVuY3Rpb24oKXt9O2suT2E9ZnVuY3Rpb24oKXt9O2Z1bmN0aW9uIFRkKCl7aWYoeSYmISgxMDw9TnVtYmVyKFVhKSkpdGhyb3cgRXJyb3IoXCJFbnZpcm9ubWVudGFsIGVycm9yOiBubyBhdmFpbGFibGUgdHJhbnNwb3J0LlwiKTt9VGQucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IFkoYSxiKX07XG5mdW5jdGlvbiBZKGEsYil7Qy5jYWxsKHRoaXMpO3RoaXMuZz1uZXcgSWQoYik7dGhpcy5sPWE7dGhpcy5oPWImJmIubWVzc2FnZVVybFBhcmFtc3x8bnVsbDthPWImJmIubWVzc2FnZUhlYWRlcnN8fG51bGw7YiYmYi5jbGllbnRQcm90b2NvbEhlYWRlclJlcXVpcmVkJiYoYT9hW1wiWC1DbGllbnQtUHJvdG9jb2xcIl09XCJ3ZWJjaGFubmVsXCI6YT17XCJYLUNsaWVudC1Qcm90b2NvbFwiOlwid2ViY2hhbm5lbFwifSk7dGhpcy5nLnM9YTthPWImJmIuaW5pdE1lc3NhZ2VIZWFkZXJzfHxudWxsO2ImJmIubWVzc2FnZUNvbnRlbnRUeXBlJiYoYT9hW1wiWC1XZWJDaGFubmVsLUNvbnRlbnQtVHlwZVwiXT1iLm1lc3NhZ2VDb250ZW50VHlwZTphPXtcIlgtV2ViQ2hhbm5lbC1Db250ZW50LVR5cGVcIjpiLm1lc3NhZ2VDb250ZW50VHlwZX0pO2ImJmIueWEmJihhP2FbXCJYLVdlYkNoYW5uZWwtQ2xpZW50LVByb2ZpbGVcIl09Yi55YTphPXtcIlgtV2ViQ2hhbm5lbC1DbGllbnQtUHJvZmlsZVwiOmIueWF9KTt0aGlzLmcuUD1cbmE7KGE9YiYmYi5odHRwSGVhZGVyc092ZXJ3cml0ZVBhcmFtKSYmIXNhKGEpJiYodGhpcy5nLm89YSk7dGhpcy5BPWImJmIuc3VwcG9ydHNDcm9zc0RvbWFpblhocnx8ITE7dGhpcy52PWImJmIuc2VuZFJhd0pzb258fCExOyhiPWImJmIuaHR0cFNlc3Npb25JZFBhcmFtKSYmIXNhKGIpJiYodGhpcy5nLkQ9YixhPXRoaXMuaCxudWxsIT09YSYmYiBpbiBhJiYoYT10aGlzLmgsYiBpbiBhJiZkZWxldGUgYVtiXSkpO3RoaXMuaj1uZXcgWih0aGlzKTt9dChZLEMpO1kucHJvdG90eXBlLm09ZnVuY3Rpb24oKXt0aGlzLmcuaj10aGlzLmo7dGhpcy5BJiYodGhpcy5nLkg9ITApO3ZhciBhPXRoaXMuZyxiPXRoaXMubCxjPXRoaXMuaHx8dm9pZCAwO2EuV2EmJihhLmguaW5mbyhcIk9yaWdpbiBUcmlhbHMgZW5hYmxlZC5cIiksemIocShhLmhiLGEsYikpKTtKKDApO2EuVz1iO2EuYWE9Y3x8e307YS5OPWEuWDthLkY9RWMoYSxudWxsLGEuVyk7SGMoYSk7fTtZLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe0ljKHRoaXMuZyk7fTtcblkucHJvdG90eXBlLnU9ZnVuY3Rpb24oYSl7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKXt2YXIgYj17fTtiLl9fZGF0YV9fPWE7TWQodGhpcy5nLGIpO31lbHNlIHRoaXMudj8oYj17fSxiLl9fZGF0YV9fPXJiKGEpLE1kKHRoaXMuZyxiKSk6TWQodGhpcy5nLGEpO307WS5wcm90b3R5cGUuTT1mdW5jdGlvbigpe3RoaXMuZy5qPW51bGw7ZGVsZXRlIHRoaXMuajtJYyh0aGlzLmcpO2RlbGV0ZSB0aGlzLmc7WS5aLk0uY2FsbCh0aGlzKTt9O2Z1bmN0aW9uIFVkKGEpe2FjLmNhbGwodGhpcyk7dmFyIGI9YS5fX3NtX187aWYoYil7YTp7Zm9yKGNvbnN0IGMgaW4gYil7YT1jO2JyZWFrIGF9YT12b2lkIDA7fWlmKHRoaXMuaT1hKWE9dGhpcy5pLGI9bnVsbCE9PWImJmEgaW4gYj9iW2FdOnZvaWQgMDt0aGlzLmRhdGE9Yjt9ZWxzZSB0aGlzLmRhdGE9YTt9dChVZCxhYyk7ZnVuY3Rpb24gVmQoKXtiYy5jYWxsKHRoaXMpO3RoaXMuc3RhdHVzPTE7fXQoVmQsYmMpO2Z1bmN0aW9uIFooYSl7dGhpcy5nPWE7fVxudChaLFNkKTtaLnByb3RvdHlwZS54YT1mdW5jdGlvbigpe0QodGhpcy5nLFwiYVwiKTt9O1oucHJvdG90eXBlLndhPWZ1bmN0aW9uKGEpe0QodGhpcy5nLG5ldyBVZChhKSk7fTtaLnByb3RvdHlwZS52YT1mdW5jdGlvbihhKXtEKHRoaXMuZyxuZXcgVmQoYSkpO307Wi5wcm90b3R5cGUudWE9ZnVuY3Rpb24oKXtEKHRoaXMuZyxcImJcIik7fTsvKlxuXG4gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuXG4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuVGQucHJvdG90eXBlLmNyZWF0ZVdlYkNoYW5uZWw9VGQucHJvdG90eXBlLmc7WS5wcm90b3R5cGUuc2VuZD1ZLnByb3RvdHlwZS51O1kucHJvdG90eXBlLm9wZW49WS5wcm90b3R5cGUubTtZLnByb3RvdHlwZS5jbG9zZT1ZLnByb3RvdHlwZS5jbG9zZTtXYi5OT19FUlJPUj0wO1diLlRJTUVPVVQ9ODtXYi5IVFRQX0VSUk9SPTY7WGIuQ09NUExFVEU9XCJjb21wbGV0ZVwiOyRiLkV2ZW50VHlwZT1MO0wuT1BFTj1cImFcIjtMLkNMT1NFPVwiYlwiO0wuRVJST1I9XCJjXCI7TC5NRVNTQUdFPVwiZFwiO0MucHJvdG90eXBlLmxpc3Rlbj1DLnByb3RvdHlwZS5OO1gucHJvdG90eXBlLmxpc3Rlbk9uY2U9WC5wcm90b3R5cGUuTztYLnByb3RvdHlwZS5nZXRMYXN0RXJyb3I9WC5wcm90b3R5cGUuTGE7WC5wcm90b3R5cGUuZ2V0TGFzdEVycm9yQ29kZT1YLnByb3RvdHlwZS5EYTtYLnByb3RvdHlwZS5nZXRTdGF0dXM9WC5wcm90b3R5cGUuYmE7WC5wcm90b3R5cGUuZ2V0UmVzcG9uc2VKc29uPVgucHJvdG90eXBlLlFhO1xuWC5wcm90b3R5cGUuZ2V0UmVzcG9uc2VUZXh0PVgucHJvdG90eXBlLmdhO1gucHJvdG90eXBlLnNlbmQ9WC5wcm90b3R5cGUuZWE7dmFyIGNyZWF0ZVdlYkNoYW5uZWxUcmFuc3BvcnQgPSBlc20uY3JlYXRlV2ViQ2hhbm5lbFRyYW5zcG9ydD1mdW5jdGlvbigpe3JldHVybiBuZXcgVGR9O3ZhciBnZXRTdGF0RXZlbnRUYXJnZXQgPSBlc20uZ2V0U3RhdEV2ZW50VGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIFNiKCl9O3ZhciBFcnJvckNvZGUgPSBlc20uRXJyb3JDb2RlPVdiO3ZhciBFdmVudFR5cGUgPSBlc20uRXZlbnRUeXBlPVhiO3ZhciBFdmVudCA9IGVzbS5FdmVudD1IO3ZhciBTdGF0ID0gZXNtLlN0YXQ9e3JiOjAsdWI6MSx2YjoyLE9iOjMsVGI6NCxRYjo1LFJiOjYsUGI6NyxOYjo4LFNiOjksUFJPWFk6MTAsTk9QUk9YWToxMSxMYjoxMixIYjoxMyxJYjoxNCxHYjoxNSxKYjoxNixLYjoxNyxuYjoxOCxtYjoxOSxvYjoyMH07dmFyIEZldGNoWG1sSHR0cEZhY3RvcnkgPSBlc20uRmV0Y2hYbWxIdHRwRmFjdG9yeT1wZDt2YXIgV2ViQ2hhbm5lbCA9IGVzbS5XZWJDaGFubmVsPSRiO1xudmFyIFhocklvID0gZXNtLlhocklvPVg7XG5cbmV4cG9ydCB7IEVycm9yQ29kZSwgRXZlbnQsIEV2ZW50VHlwZSwgRmV0Y2hYbWxIdHRwRmFjdG9yeSwgU3RhdCwgV2ViQ2hhbm5lbCwgWGhySW8sIGNyZWF0ZVdlYkNoYW5uZWxUcmFuc3BvcnQsIGVzbSBhcyBkZWZhdWx0LCBnZXRTdGF0RXZlbnRUYXJnZXQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmVzbTIwMTcuanMubWFwXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvcHJlZmVyLWRlZmF1bHQtZXhwb3J0ICovXG5pbXBvcnQgeyBpbml0aWFsaXplQXBwIH0gZnJvbSAnZmlyZWJhc2UvYXBwJztcbmltcG9ydCB7IGdldEZpcmVzdG9yZSwgZG9jIH0gZnJvbSAnZmlyZWJhc2UvZmlyZXN0b3JlJztcblxuY29uc3QgZmlyZWJhc2VDb25maWcgPSB7XG4gIGFwaUtleTogJ0FJemFTeUNYOVdSLWo5eXYxZ2lZZUZzTXBiamoyRzNwN2pOSHhJVScsXG4gIGF1dGhEb21haW46ICdnc2UteWVhdG1hbmxhYi5maXJlYmFzZWFwcC5jb20nLFxuICBwcm9qZWN0SWQ6ICdnc2UteWVhdG1hbmxhYicsXG4gIHN0b3JhZ2VCdWNrZXQ6ICdnc2UteWVhdG1hbmxhYi5hcHBzcG90LmNvbScsXG4gIG1lc3NhZ2luZ1NlbmRlcklkOiAnMjkyMzMxMDAwNDI2JyxcbiAgYXBwSWQ6ICcxOjI5MjMzMTAwMDQyNjp3ZWI6OTFhMDQyMjA5OTFlMzQwNTczNzAxMycsXG4gIG1lYXN1cmVtZW50SWQ6ICdHLTBUQlRNRFM5OTMnLFxufTtcblxuY29uc3QgZmlyZWJhc2VBcHAgPSBpbml0aWFsaXplQXBwKGZpcmViYXNlQ29uZmlnKTtcbmNvbnN0IGRiID0gZ2V0RmlyZXN0b3JlKGZpcmViYXNlQXBwKTtcbmV4cG9ydCBjb25zdCByb290RG9jID0gZG9jKGRiLCAnZGV2JywgJ3JpY2hmb3JkLTIwMjIwMjE3Jyk7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBmdW5jLW5hbWVzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBvYmplY3Qtc2hvcnRoYW5kICovXG5pbXBvcnQgeyBpbml0SnNQc3ljaCB9IGZyb20gJ2pzcHN5Y2gnO1xuaW1wb3J0IHN1cnZleVRleHQgZnJvbSAnQGpzcHN5Y2gvcGx1Z2luLXN1cnZleS10ZXh0JztcbmltcG9ydCBmdWxsU2NyZWVuIGZyb20gJ0Bqc3BzeWNoL3BsdWdpbi1mdWxsc2NyZWVuJztcbmltcG9ydCBodG1sS2V5Ym9hcmRSZXNwb25zZSBmcm9tICdAanNwc3ljaC9wbHVnaW4taHRtbC1rZXlib2FyZC1yZXNwb25zZSc7XG4vLyBpbXBvcnQgaW1hZ2VLZXlib2FyZFJlc3BvbnNlIGZyb20gJ0Bqc3BzeWNoL3BsdWdpbi1pbWFnZS1rZXlib2FyZC1yZXNwb25zZSc7XG5pbXBvcnQgdmlkZW9LZXlib2FyZFJlc3BvbnNlIGZyb20gJ0Bqc3BzeWNoL3BsdWdpbi12aWRlby1rZXlib2FyZC1yZXNwb25zZSc7XG5pbXBvcnQganNQc3ljaFJkayBmcm9tICdAanNwc3ljaC1jb250cmliL3BsdWdpbi1yZGsnO1xuaW1wb3J0ICdqc3BzeWNoL2Nzcy9qc3BzeWNoLmNzcyc7XG5pbXBvcnQgJ3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZSc7XG5pbXBvcnQgeyBSb2FyRmlyZWtpdCB9IGZyb20gJ0BiZGVsYWIvcm9hci1maXJla2l0JztcblxuLy8gaW1wb3J0IGJ1bGxzRXllIGZyb20gJy4vaW1nL2J1bGxzRXllLnBuZyc7XG5pbXBvcnQgYXN0ZXJvaWRBdHRhY2tJbnRybyBmcm9tICcuL3ZpZGVvL0FzdGVyb2lkX0F0dGFja19JbnRyby5tcDQnO1xuaW1wb3J0IGFzdGVyb2lkQXR0YWNrRW5kIGZyb20gJy4vdmlkZW8vQXN0ZXJvaWRfQXR0YWNrX0VuZC5tcDQnO1xuaW1wb3J0IGFzdGVyb2lkQXR0YWNrTGV2ZWxVcDEgZnJvbSAnLi92aWRlby9Bc3Rlcm9pZF9BdHRhY2tfTGV2ZWxfVXBfMS5tcDQnO1xuaW1wb3J0IGFzdGVyb2lkQXR0YWNrTGV2ZWxVcDIgZnJvbSAnLi92aWRlby9Bc3Rlcm9pZF9BdHRhY2tfTGV2ZWxfVXBfMi5tcDQnO1xuaW1wb3J0IGFzdGVyb2lkQXR0YWNrTGV2ZWxVcDMgZnJvbSAnLi92aWRlby9Bc3Rlcm9pZF9BdHRhY2tfTGV2ZWxfVXBfMy5tcDQnO1xuaW1wb3J0IGFzdGVyb2lkQXR0YWNrTGV2ZWxVcDQgZnJvbSAnLi92aWRlby9Bc3Rlcm9pZF9BdHRhY2tfTGV2ZWxfVXBfNC5tcDQnO1xuaW1wb3J0IGFzdGVyb2lkQXR0YWNrTGV2ZWxVcDUgZnJvbSAnLi92aWRlby9Bc3Rlcm9pZF9BdHRhY2tfTGV2ZWxfVXBfNS5tcDQnO1xuaW1wb3J0IHsgcm9vdERvYyB9IGZyb20gJy4vZmlyZWJhc2VDb25maWcnO1xuaW1wb3J0IHsganNQc3ljaFBhdmxvdmlhIH0gZnJvbSAnLi9qc1BzeWNoUGF2bG92aWEnO1xuXG4vLyBTZXQgdXAgYWxsIGV4cGVyaW1lbnQgcmVsYXRlZCBpbmZvIGhlcmVcbmNvbnN0IGpzUHN5Y2hGb3JVUkwgPSBpbml0SnNQc3ljaCgpO1xubGV0IHBhcnRpY2lwYW50SWQgPSBqc1BzeWNoRm9yVVJMLmRhdGEuZ2V0VVJMVmFyaWFibGUoJ3BhcnRpY2lwYW50SWQnKTtcbmxldCBncmFkZTtcbmNvbnN0IHNjaG9vbElkID0ganNQc3ljaEZvclVSTC5kYXRhLmdldFVSTFZhcmlhYmxlKCdzY2hvb2xJZCcpO1xuXG5sZXQgZmlyZWtpdDtcblxuY29uc3QgdGFza0luZm8gPSB7XG4gIHRhc2tJZDogJ2FzdGVyb2lkLWF0dGFjaycsXG4gIHRhc2tOYW1lOiAnQXN0ZXJvaWQgQXR0YWNrJyxcbiAgdmFyaWFudE5hbWU6ICdkZWZhdWx0JyxcbiAgdGFza0Rlc2NyaXB0aW9uOlxuICAgIFwiSW4gdGhpcyBnYW1lIHBhcnRpY2lwYW50cyBhcmUgb24gYSB0cmlwIHRvIHRoZSBtb29uIGFuZCBnYWxheHkgb2Ygc3RhcnMgYXJlIG9uIHRoZWlyIHdheSBwdXNoaW5nIHRoZW0gdG8gdGhlIGxlZnQgb3IgcmlnaHQuIFRvIGFkdmFuY2UsIHBhcnRpY2lwYW50cyBhcmUgYXNrZWQgdG8gcmVwb3J0IHdoaWNoIHdheSB0aGUgZ2FsYXh5IG9mIHN0YXJzIG1vdmluZy4gVGhleSBjYW4gbW92ZSB0b3dhcmRzIHRoZSBsZWZ0IG9yIHJpZ2h0IGFuZCBwYXJ0aWNpcGFudHMgbmVlZCB0byBkZXRlcm1pbmUgd2hpY2ggd2F5IHRoZSBzdGFycyBhcmUgZ29pbmcgYnkgcHJlc3NpbmcgJ2EnIGZvciBsZWZ0IGFuZCAnbCcgZm9yIHJpZ2h0LlwiLFxuICB2YXJpYW50RGVzY3JpcHRpb246ICdEZWZhdWx0JyxcbiAgYmxvY2tzOiBbXG4gICAge1xuICAgICAgYmxvY2tOdW1iZXI6IDEsXG4gICAgICB0cmlhbE1ldGhvZDogJzk2JSBjb2hlcmVuY2UnLFxuICAgICAgY29ycHVzOiAnUkRLJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGJsb2NrTnVtYmVyOiAyLFxuICAgICAgdHJpYWxNZXRob2Q6ICdyZXBlYXQnLFxuICAgICAgY29ycHVzOiAnUkRLJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGJsb2NrTnVtYmVyOiAzLFxuICAgICAgdHJpYWxNZXRob2Q6ICdyZXBlYXQnLFxuICAgICAgY29ycHVzOiAnUkRLJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGJsb2NrTnVtYmVyOiA0LFxuICAgICAgdHJpYWxNZXRob2Q6ICdyZXBlYXQnLFxuICAgICAgY29ycHVzOiAnUkRLJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGJsb2NrTnVtYmVyOiA1LFxuICAgICAgdHJpYWxNZXRob2Q6ICdyZXBlYXQnLFxuICAgICAgY29ycHVzOiAnUkRLJyxcbiAgICB9LFxuICBdLFxufTtcblxuaWYgKHBhcnRpY2lwYW50SWQgIT09IHVuZGVmaW5lZCkge1xuICBjb25zdCBtaW5pbWFsVXNlckluZm8gPSB7IGlkOiBwYXJ0aWNpcGFudElkLCBzY2hvb2xJZCB9O1xuXG4gIGZpcmVraXQgPSBuZXcgUm9hckZpcmVraXQoe1xuICAgIHJvb3REb2MsXG4gICAgdXNlckluZm86IG1pbmltYWxVc2VySW5mbyxcbiAgICB0YXNrSW5mbyxcbiAgfSk7XG5cbiAgYXdhaXQgZmlyZWtpdC5zdGFydFJ1bigpO1xufVxuXG5jb25zdCBqc1BzeWNoID0gaW5pdEpzUHN5Y2goKTtcblxuY29uc3QgdGltZWxpbmUgPSBbXTtcblxuLyogaW5pdCBjb25uZWN0aW9uIHdpdGggcGF2bG92aWEub3JnICovXG5jb25zdCBwYXZsb3ZpYUluaXQgPSB7XG4gIHR5cGU6IGpzUHN5Y2hQYXZsb3ZpYShqc1BzeWNoKSxcbiAgY29tbWFuZDogJ2luaXQnLFxufTtcbnRpbWVsaW5lLnB1c2gocGF2bG92aWFJbml0KTtcblxuY29uc3QgZ2V0UGlkID0ge1xuICB0eXBlOiBzdXJ2ZXlUZXh0LFxuICBxdWVzdGlvbnM6IFtcbiAgICB7XG4gICAgICBwcm9tcHQ6ICdJRDonLFxuICAgICAgbmFtZTogJ3BhcnRpY2lwYW50X2luZm8nLFxuICAgICAgcGxhY2Vob2xkZXI6ICcwMDAwJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvbXB0OiAnR3JhZGU6JyxcbiAgICAgIG5hbWU6ICdHcmFkZScsXG4gICAgICBwbGFjZWhvbGRlcjogJ0tHL0cxJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0sXG4gIF0sXG4gIG9uX2ZpbmlzaDogKGRhdGEpID0+IHtcbiAgICBwYXJ0aWNpcGFudElkID0gZGF0YS5yZXNwb25zZS5wYXJ0aWNpcGFudF9pbmZvO1xuICAgIGdyYWRlID0gZGF0YS5yZXNwb25zZS5HcmFkZTtcbiAgfSxcbn07XG5cbmNvbnN0IGlmR2V0UGlkID0ge1xuICB0aW1lbGluZTogW2dldFBpZF0sXG4gIGNvbmRpdGlvbmFsX2Z1bmN0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICFwYXJ0aWNpcGFudElkO1xuICB9LFxuICBvbl90aW1lbGluZV9maW5pc2g6IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBtaW5pbWFsVXNlckluZm8gPSB7IGlkOiBwYXJ0aWNpcGFudElkLCBzY2hvb2xJZCwgY2xhc3NJZDogZ3JhZGUgfTtcblxuICAgIGZpcmVraXQgPSBuZXcgUm9hckZpcmVraXQoe1xuICAgICAgcm9vdERvYyxcbiAgICAgIHVzZXJJbmZvOiBtaW5pbWFsVXNlckluZm8sXG4gICAgICB0YXNrSW5mbyxcbiAgICB9KTtcblxuICAgIGF3YWl0IGZpcmVraXQuc3RhcnRSdW4oKTtcbiAgfSxcbn07XG5cbnRpbWVsaW5lLnB1c2goaWZHZXRQaWQpO1xuXG4vLyBzdG9yZSBpbmZvIGFib3V0IHRoZSBleHBlcmltZW50IHNlc3Npb246XG50aW1lbGluZS5wdXNoKHtcbiAgdHlwZTogZnVsbFNjcmVlbixcbiAgZnVsbHNjcmVlbl9tb2RlOiB0cnVlLFxufSk7XG5cbmNvbnN0IHNldEh0bWxCZ0dyYXkgPSAoKSA9PiB7XG4gIGRvY3VtZW50LmJvZHkuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ2dyYXknO1xufTtcblxuY29uc3Qgd2VsY29tZSA9IHtcbiAgdHlwZTogaHRtbEtleWJvYXJkUmVzcG9uc2UsXG4gIG9uX3N0YXJ0OiBzZXRIdG1sQmdHcmF5LFxuICBzdGltdWx1czogJzxwIHN0eWxlPVwiZm9udC1zaXplOjQ4cHg7IGNvbG9yOmdyZWVuO1wiPldlbGNvbWUgdG8gc3BhY2UhIDwvcD4nLFxuICBjaG9pY2VzOiAnTk9fS0VZUycsXG4gIHRyaWFsX2R1cmF0aW9uOiA1MDAsXG59O1xudGltZWxpbmUucHVzaCh3ZWxjb21lKTtcblxuLy8gLS0tLS0tLS0tQ3JlYXRlIGluc3RydWN0aW9ucy0tLS0tLS0tLVxuY29uc3QgaW50cm8xID0ge1xuICB0eXBlOiB2aWRlb0tleWJvYXJkUmVzcG9uc2UsXG4gIC8vIG9uX3N0YXJ0OiBzZXRIdG1sQmdHcmF5LFxuICBzdGltdWx1czogW2FzdGVyb2lkQXR0YWNrSW50cm9dLFxuICBjaG9pY2VzOiBbJyAnXSxcbiAgcmVzcG9uc2VfYWxsb3dlZF93aGlsZV9wbGF5aW5nOiBmYWxzZSxcbiAgdHJpYWxfZHVyYXRpb246IG51bGwsXG4gIHdpZHRoOiAxMjM4LFxuICBoZWlnaHQ6IDgwMCxcbn07XG50aW1lbGluZS5wdXNoKGludHJvMSk7XG5cbi8vIGNvbnN0IGZpeGF0aW9uID0ge1xuLy8gICB0eXBlOiBpbWFnZUtleWJvYXJkUmVzcG9uc2UsXG4vLyAgIHN0aW11bHVzOiBidWxsc0V5ZSxcbi8vICAgY2hvaWNlczogJ05PX0tFWVMnLFxuLy8gICB0cmlhbF9kdXJhdGlvbjogMTAwMDAsXG4vLyB9O1xuLy8gdGltZWxpbmUucHVzaChmaXhhdGlvbik7XG5cbi8vIC0tLS0tLS0tLUNyZWF0ZSB0cmlhbHMtLS0tLS0tLS1cbi8vIFRoZSB0ZXN0IGJsb2NrIHdoZXJlIGFsbCB0aGUgdHJpYWxzIGFyZSBuZXN0ZWQuIFRoZSBwcm9wZXJ0aWVzIGhlcmUgd2lsbFxuLy8gdHJpY2tsZSBkb3duIHRvIGFsbCB0cmlhbHMgaW4gdGhlIHRpbWVsaW5lIHVubGVzcyB0aGV5IGhhdmUgdGhlaXIgb3duXG4vLyBwcm9wZXJ0aWVzIGRlZmluZWRcbmNvbnN0IHRlc3RCbG9jayA9IHtcbiAgdHlwZToganNQc3ljaFJkayxcbiAgLy8gVGhlIEludGVyIFRyaWFsIEludGVydmFsLiBZb3UgY2FuIGVpdGhlciBoYXZlIG5vIElUSSwgb3IgY2hhbmdlIHRoZSBkaXNwbGF5XG4gIC8vIGVsZW1lbnQgdG8gYmUgdGhlIHNhbWUgY29sb3IgYXMgdGhlIHN0aW11bGkgYmFja2dyb3VuZCB0byBwcmV2ZW50IGZsYXNoaW5nXG4gIC8vIGJldHdlZW4gdHJpYWxzXG4gIHRpbWluZ19wb3N0X3RyaWFsOiAxMDAwLFxuICBudW1iZXJfb2ZfZG90czogMTUwLCAvLyBUb3RhbCBudW1iZXIgb2YgZG90cyBpbiB0aGUgYXBlcnR1cmVcbiAgY29oZXJlbnRfZGlyZWN0aW9uOiBqc1BzeWNoLnRpbWVsaW5lVmFyaWFibGUoJ2NvaGVyZW50X2RpcmVjdGlvbicpLFxuICBjb2hlcmVuY2U6IGpzUHN5Y2gudGltZWxpbmVWYXJpYWJsZSgnY29oZXJlbmNlJyksXG4gIGNvcnJlY3RfY2hvaWNlOiBbanNQc3ljaC50aW1lbGluZVZhcmlhYmxlKCdjb3JyZWN0X2Nob2ljZScpXSxcbiAgUkRLX3R5cGU6IDMsIC8vIFRoZSB0eXBlIG9mIFJESyB1c2VkXG4gIGFwZXJ0dXJlX3R5cGU6IDEsIC8vIENpcmNsZVxuICBhcGVydHVyZV9jZW50ZXJfeDogOTYwLCAvLyB3aW5kb3cuaW5uZXJXaWR0aC8yLFxuICBhcGVydHVyZV9jZW50ZXJfeTogNTQwLCAvLyB3aW5kb3cuaW5uZXJIZWlnaHQvMixcbiAgYXBlcnR1cmVfd2lkdGg6IDcwMCwgLy8gTWF0Y2hlcyAxNGRlZyBkaWFtZXRlclxuICBjaG9pY2VzOiBbJ2EnLCAnbCddLCAvLyBDaG9pY2VzIGF2YWlsYWJsZSB0byBiZSBrZXllZCBpbiBieSBwYXJ0aWNpcGFudFxuICB0cmlhbF9kdXJhdGlvbjogMTAwMDAsIC8vIER1cmF0aW9uIG9mIGVhY2ggdHJpYWwgaW4gbXNcbiAgZml4YXRpb25fY3Jvc3M6IHRydWUsXG4gIC8vIG5vdCBzdXJlIGlmIHRoaXMgaXMgdGhlIGNvcnJlY3Qgc2NhbGUgLSBkbyB0aGUgdmlydHVhbCBjaGluIHRvIGNhbGlicmF0XG4gIGZpeGF0aW9uX2Nyb3NzX3dpZHRoOiA0MCxcbiAgZml4YXRpb25fY3Jvc3NfaGVpZ2h0OiA0MCxcbiAgZml4YXRpb25fY3Jvc3NfdGhpY2tuZXNzOiA3LFxuICBkb3RfY29sb3I6ICdibGFjaycsXG4gIGRvdF9yYWRpdXM6IDMsIC8vIDMuNCwgbWF0Y2hpbmcgNSBwaXhlbHMgZnJvbSBFbGxlJ3MgcGFwZXJcbiAgbW92ZV9kaXN0YW5jZTogNiwgLy8gU3BlZWQgcGFyYW1ldGVyIDYgc2VlbXMgdGhlIGNhbGN1bGF0ZWQgc3BlZWQgYnV0IHZpc3VhbGx5IGlzIG5vdCBhcHBlYWxpbmdcbiAgLy8gTm90IHN1cmUgd2hlcmUgdGhpcyBudW1iZXIgY29tZXMgZnJvbSAyMDBtcyBpcyB3aGF0IHdlIHdhbnQgdGhlIG1heGltdW0gZG90IGxpZmUgdG8gYmVcbiAgZG90X2xpZmU6IDEyLFxuICByZWluc2VydF90eXBlOiAxLFxuICBvbl9maW5pc2g6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduLCBlcWVxZXFcbiAgICBkYXRhLmFjY3VyYWN5ID0gZGF0YS5jb3JyZWN0X2Nob2ljZSA9PSBkYXRhLnJlc3BvbnNlO1xuICAgIGZpcmVraXQud3JpdGVUcmlhbCh7XG4gICAgICAuLi5kYXRhLFxuICAgICAgZ3JhZGUsXG4gICAgICBjb25kaXRpb246IGpzUHN5Y2gudGltZWxpbmVWYXJpYWJsZSgnY29uZGl0aW9uJyksXG4gICAgICBibG9ja1R5cGU6ICd0ZXN0JyxcbiAgICAgIHBhcnRpY2lwYW50OiBwYXJ0aWNpcGFudElkLFxuICAgIH0pO1xuICB9LFxufTtcblxuLy8gY3JlYXRlIHByYWN0aWNlIGJsb2NrXG5jb25zdCBwcmFjdGljZUJsb2NrID0ge1xuICB0eXBlOiBqc1BzeWNoUmRrLFxuICAvLyBUaGUgSW50ZXIgVHJpYWwgSW50ZXJ2YWwuIFlvdSBjYW4gZWl0aGVyIGhhdmUgbm8gSVRJLCBvciBjaGFuZ2UgdGhlIGRpc3BsYXlcbiAgLy8gZWxlbWVudCB0byBiZSB0aGUgc2FtZSBjb2xvciBhcyB0aGUgc3RpbXVsaSBiYWNrZ3JvdW5kIHRvIHByZXZlbnQgZmxhc2hpbmdcbiAgLy8gYmV0d2VlbiB0cmlhbHNcbiAgdGltaW5nX3Bvc3RfdHJpYWw6IDEwMDAsXG4gIG51bWJlcl9vZl9kb3RzOiAxNTAsIC8vIFRvdGFsIG51bWJlciBvZiBkb3RzIGluIHRoZSBhcGVydHVyZVxuICBjb2hlcmVudF9kaXJlY3Rpb246IGpzUHN5Y2gudGltZWxpbmVWYXJpYWJsZSgnY29oZXJlbnRfZGlyZWN0aW9uJyksXG4gIGNvaGVyZW5jZToganNQc3ljaC50aW1lbGluZVZhcmlhYmxlKCdjb2hlcmVuY2UnKSxcbiAgY29ycmVjdF9jaG9pY2U6IFtqc1BzeWNoLnRpbWVsaW5lVmFyaWFibGUoJ2NvcnJlY3RfY2hvaWNlJyldLFxuICBSREtfdHlwZTogMywgLy8gVGhlIHR5cGUgb2YgUkRLIHVzZWRcbiAgYXBlcnR1cmVfdHlwZTogMSwgLy8gQ2lyY2xlXG4gIGFwZXJ0dXJlX2NlbnRlcl94OiA5NjAsIC8vIHdpbmRvdy5pbm5lcldpZHRoLzIsXG4gIGFwZXJ0dXJlX2NlbnRlcl95OiA1NDAsIC8vIHdpbmRvdy5pbm5lckhlaWdodC8yLFxuICBhcGVydHVyZV93aWR0aDogNzAwLCAvLyBNYXRjaGVzIDE0ZGVnIGRpYW1ldGVyXG4gIGNob2ljZXM6IFsnYScsICdsJ10sIC8vIENob2ljZXMgYXZhaWxhYmxlIHRvIGJlIGtleWVkIGluIGJ5IHBhcnRpY2lwYW50XG4gIHRyaWFsX2R1cmF0aW9uOiAyMDAwMCwgLy8gRHVyYXRpb24gb2YgZWFjaCB0cmlhbCBpbiBtc1xuICBmaXhhdGlvbl9jcm9zczogdHJ1ZSxcbiAgLy8gbm90IHN1cmUgaWYgdGhpcyBpcyB0aGUgY29ycmVjdCBzY2FsZSAtIGRvIHRoZSB2aXJ0dWFsIGNoaW4gdG8gY2FsaWJyYXRlXG4gIGZpeGF0aW9uX2Nyb3NzX3dpZHRoOiA0MCxcbiAgZml4YXRpb25fY3Jvc3NfaGVpZ2h0OiA0MCxcbiAgZml4YXRpb25fY3Jvc3NfdGhpY2tuZXNzOiA3LFxuICBkb3RfY29sb3I6ICdibGFjaycsXG4gIGRvdF9yYWRpdXM6IDMsIC8vIDMuNCwgbWF0Y2hpbmcgNXBpeGVscyBmcm9tIEVsbGUncyBwYXBlclxuICBtb3ZlX2Rpc3RhbmNlOiA2LCAvLyBTcGVlZCBwYXJhbWV0ZXIgNiBzZWVtcyB0aGUgY2FsY3VsYXRlZCBzcGVlZCBidXQgdmlzdWFsbHkgaXMgbm90IGFwcGVhbGluZ1xuICAvLyBOb3Qgc3VyZSB3aGVyZSBkb3RfbGlmZSBjb21lcyBmcm9tIDIwMG1zIGlzIHdoYXQgd2Ugd2FudCB0aGUgbWF4aW11bSBkb3QgbGlmZSB0byBiZVxuICBkb3RfbGlmZTogMTIsXG4gIHJlaW5zZXJ0X3R5cGU6IDEsXG4gIG9uX2ZpbmlzaDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ24sIGVxZXFlcVxuICAgIGRhdGEuYWNjdXJhY3kgPSBkYXRhLmNvcnJlY3RfY2hvaWNlID09IGRhdGEucmVzcG9uc2U7XG4gICAgZmlyZWtpdC53cml0ZVRyaWFsKHtcbiAgICAgIC4uLmRhdGEsXG4gICAgICBncmFkZSxcbiAgICAgIGNvbmRpdGlvbjoganNQc3ljaC50aW1lbGluZVZhcmlhYmxlKCdjb25kaXRpb24nKSxcbiAgICAgIGJsb2NrVHlwZTogJ3ByYWN0aWNlJyxcbiAgICAgIHBhcnRpY2lwYW50OiBwYXJ0aWNpcGFudElkLFxuICAgIH0pO1xuICB9LFxufTtcblxuLy8gQ3JlYXRlIGFuIGFycmF5IG9mIDIgZGlmZmVyZW50IHRyaWFscyAoZGlmZmVyZW50IGNvbmRpdGlvbnMpXG5jb25zdCBwcmFjdGljZVRyaWFscyA9IFtcbiAge1xuICAgIC8vIENvbmRpdGlvbiBQcmFjdGljZVxuICAgIGNvcnJlY3RfY2hvaWNlOiAnbCcsXG4gICAgY29oZXJlbnRfZGlyZWN0aW9uOiAwLFxuICAgIGNvaGVyZW5jZTogMC45NixcbiAgICBjb25kaXRpb246ICc5NiUgUmlnaHQnLFxuICB9LFxuICB7XG4gICAgLy8gQ29uZGl0aW9uIFByYWN0aWNlXG4gICAgY29ycmVjdF9jaG9pY2U6ICdhJyxcbiAgICBjb2hlcmVudF9kaXJlY3Rpb246IDE4MCxcbiAgICBjb2hlcmVuY2U6IDAuOTYsXG4gICAgY29uZGl0aW9uOiAnOTYlIExlZnQnLFxuICB9LFxuXTtcbmNvbnN0IHByYWN0aWNlSW5mbyA9IGpzUHN5Y2gucmFuZG9taXphdGlvbi5yZXBlYXQocHJhY3RpY2VUcmlhbHMsIDYpO1xuXG5jb25zdCB0cmlhbHMgPSBbXG4gIHtcbiAgICAvLyBDb25kaXRpb24gMVxuICAgIGNvcnJlY3RfY2hvaWNlOiAnYScsIC8vIFRoZSBjb3JyZWN0IGFuc3dlciBmb3IgQ29uZGl0aW9uIDFcbiAgICBjb2hlcmVudF9kaXJlY3Rpb246IDE4MCwgLy8gVGhlIGNvaGVyZW50IGRpcmVjdGlvbiBmb3IgQ29uZGl0aW9uIDEgKGRvdHMgbW92ZSBsZWZ0KVxuICAgIGNvaGVyZW5jZTogMC4wNixcbiAgICBjb25kaXRpb246ICc2JSBMZWZ0JyxcbiAgfSxcbiAge1xuICAgIC8vIENvbmRpdGlvbiAyXG4gICAgY29ycmVjdF9jaG9pY2U6ICdsJyxcbiAgICBjb2hlcmVudF9kaXJlY3Rpb246IDAsXG4gICAgY29oZXJlbmNlOiAwLjA2LFxuICAgIGNvbmRpdGlvbjogJzYlIFJpZ2h0JyxcbiAgfSxcbiAge1xuICAgIC8vIENvbmRpdGlvbiAzXG4gICAgY29ycmVjdF9jaG9pY2U6ICdhJyxcbiAgICBjb2hlcmVudF9kaXJlY3Rpb246IDE4MCxcbiAgICBjb2hlcmVuY2U6IDAuMTIsXG4gICAgY29uZGl0aW9uOiAnMTIlIExlZnQnLFxuICB9LFxuICB7XG4gICAgLy8gQ29uZGl0aW9uIDRcbiAgICBjb3JyZWN0X2Nob2ljZTogJ2wnLFxuICAgIGNvaGVyZW50X2RpcmVjdGlvbjogMCxcbiAgICBjb2hlcmVuY2U6IDAuMTIsXG4gICAgY29uZGl0aW9uOiAnMTIlIFJpZ2h0JyxcbiAgfSxcbiAge1xuICAgIC8vIENvbmRpdGlvbiA1XG4gICAgY29ycmVjdF9jaG9pY2U6ICdhJyxcbiAgICBjb2hlcmVudF9kaXJlY3Rpb246IDE4MCxcbiAgICBjb2hlcmVuY2U6IDAuMjQsXG4gICAgY29uZGl0aW9uOiAnMjQlIExlZnQnLFxuICB9LFxuICB7XG4gICAgLy8gQ29uZGl0aW9uIDZcbiAgICBjb3JyZWN0X2Nob2ljZTogJ2wnLFxuICAgIGNvaGVyZW50X2RpcmVjdGlvbjogMCxcbiAgICBjb2hlcmVuY2U6IDAuMjQsXG4gICAgY29uZGl0aW9uOiAnMjQlIFJpZ2h0JyxcbiAgfSxcbiAge1xuICAgIC8vIENvbmRpdGlvbiA3XG4gICAgY29ycmVjdF9jaG9pY2U6ICdhJyxcbiAgICBjb2hlcmVudF9kaXJlY3Rpb246IDE4MCxcbiAgICBjb2hlcmVuY2U6IDAuNDgsXG4gICAgY29uZGl0aW9uOiAnNDglIExlZnQnLFxuICB9LFxuICB7XG4gICAgLy8gQ29uZGl0aW9uIDhcbiAgICBjb3JyZWN0X2Nob2ljZTogJ2wnLFxuICAgIGNvaGVyZW50X2RpcmVjdGlvbjogMCxcbiAgICBjb2hlcmVuY2U6IDAuNDgsXG4gICAgY29uZGl0aW9uOiAnNDglIFJpZ2h0JyxcbiAgfSxcbiAge1xuICAgIC8vIENvbmRpdGlvbiA5XG4gICAgY29ycmVjdF9jaG9pY2U6ICdhJyxcbiAgICBjb2hlcmVudF9kaXJlY3Rpb246IDE4MCxcbiAgICBjb2hlcmVuY2U6IDAuOTYsXG4gICAgY29uZGl0aW9uOiAnOTYlIExlZnQnLFxuICB9LFxuICB7XG4gICAgLy8gQ29uZGl0aW9uIDEwXG4gICAgY29ycmVjdF9jaG9pY2U6ICdsJyxcbiAgICBjb2hlcmVudF9kaXJlY3Rpb246IDAsXG4gICAgY29oZXJlbmNlOiAwLjk2LFxuICAgIGNvbmRpdGlvbjogJzk2JSBSaWdodCcsXG4gIH0sXG5dO1xuXG4vLyBNdWx0aXBseSBiYXNlZCBvbiBob3cgbWFueSB0cmlhbHMgeW91IG5lZWQgYW5kIHJhbmRvbWl6ZSB0aGUgdHJpYWwgb3JkZXJcbi8vIDYqOD00OCB0cmlhbHMgYSBibG9jayBpbiB0b3RhbCAyNDAgdHJpYWxzXG4vLyBEb3VibGUgdGhlIG51bWJlciBvZiB0cmlhbHMgYW5kIHNodWZmbGUgdGhlbVxuY29uc3QgdHJpYWxJbmZvID0ganNQc3ljaC5yYW5kb21pemF0aW9uLnJlcGVhdCh0cmlhbHMsIDIpO1xuXG5jb25zdCBmZWVkYmFja0Jsb2NrID0ge1xuICB0eXBlOiBodG1sS2V5Ym9hcmRSZXNwb25zZSxcbiAgb25fc3RhcnQ6IHNldEh0bWxCZ0dyYXksXG4gIHN0aW11bHVzOiBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgbGFzdFRyaWFsQWNjdXJhY3kgPSBqc1BzeWNoLmRhdGFcbiAgICAgIC5nZXRMYXN0VHJpYWxEYXRhKClcbiAgICAgIC52YWx1ZXMoKVswXS5hY2N1cmFjeTtcblxuICAgIGlmIChsYXN0VHJpYWxBY2N1cmFjeSkge1xuICAgICAgcmV0dXJuICc8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTo0MHB4O2NvbG9yOmdyZWVuO1wiPiszISE8L3NwYW4+JztcbiAgICB9XG4gICAgcmV0dXJuICc8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTo0MHB4O2NvbG9yOnJlZDtcIj4rMTwvc3Bhbj4nO1xuICB9LFxuICBjaG9pY2VzOiAnTk9fS0VZUycsXG4gIHRyaWFsX2R1cmF0aW9uOiAxMDAwLFxufTtcblxuLy8gSW50ZXIgYmxvY2sgaW50ZXJ2YWwgaW1hZ2VcbmNvbnN0IElCSTEgPSB7XG4gIHR5cGU6IHZpZGVvS2V5Ym9hcmRSZXNwb25zZSxcbiAgLy8gb25fc3RhcnQ6IHNldEh0bWxCZ0dyYXksXG4gIHN0aW11bHVzOiBbYXN0ZXJvaWRBdHRhY2tMZXZlbFVwMV0sXG4gIHByb21wdDpcbiAgICAnPHA+UHJlc3MgdGhlIFNwYWNlYmFyIHdoZW4geW91IGFyZSByZWFkeSB0byBwcm9jZWVkLiBSZW1lbWJlciB0byBzaXQgYXQgb25lIGFybSBkaXN0YW5jZSBmcm9tIHRoZSBzY3JlZW4uPC9wPicsXG4gIGNob2ljZXM6IFsnICddLFxuICByZXNwb25zZV9hbGxvd2VkX3doaWxlX3BsYXlpbmc6IHRydWUsXG4gIHRyaWFsX2R1cmF0aW9uOiBudWxsLFxuICB3aWR0aDogMTIzOCxcbiAgaGVpZ2h0OiA4MDAsXG59O1xuXG5jb25zdCBJQkkyID0ge1xuICB0eXBlOiB2aWRlb0tleWJvYXJkUmVzcG9uc2UsXG4gIC8vIG9uX3N0YXJ0OiBzZXRIdG1sQmdHcmF5LFxuICBzdGltdWx1czogW2FzdGVyb2lkQXR0YWNrTGV2ZWxVcDJdLFxuICBwcm9tcHQ6XG4gICAgJzxwPlByZXNzIHRoZSBTcGFjZWJhciB3aGVuIHlvdSBhcmUgcmVhZHkgdG8gcHJvY2VlZC4gUmVtZW1iZXIgdG8gc2l0IGF0IG9uZSBhcm0gZGlzdGFuY2UgZnJvbSB0aGUgc2NyZWVuLjwvcD4nLFxuICBjaG9pY2VzOiBbJyAnXSxcbiAgcmVzcG9uc2VfYWxsb3dlZF93aGlsZV9wbGF5aW5nOiB0cnVlLFxuICB0cmlhbF9kdXJhdGlvbjogbnVsbCxcbiAgd2lkdGg6IDEyMzgsXG4gIGhlaWdodDogODAwLFxufTtcblxuY29uc3QgSUJJMyA9IHtcbiAgdHlwZTogdmlkZW9LZXlib2FyZFJlc3BvbnNlLFxuICAvLyBvbl9zdGFydDogc2V0SHRtbEJnR3JheSxcbiAgc3RpbXVsdXM6IFthc3Rlcm9pZEF0dGFja0xldmVsVXAzXSxcbiAgcHJvbXB0OlxuICAgICc8cD5QcmVzcyB0aGUgU3BhY2ViYXIgd2hlbiB5b3UgYXJlIHJlYWR5IHRvIHByb2NlZWQuIFJlbWVtYmVyIHRvIHNpdCBhdCBvbmUgYXJtIGRpc3RhbmNlIGZyb20gdGhlIHNjcmVlbi48L3A+JyxcbiAgY2hvaWNlczogWycgJ10sXG4gIHJlc3BvbnNlX2FsbG93ZWRfd2hpbGVfcGxheWluZzogdHJ1ZSxcbiAgdHJpYWxfZHVyYXRpb246IG51bGwsXG4gIHdpZHRoOiAxMjM4LFxuICBoZWlnaHQ6IDgwMCxcbn07XG5cbmNvbnN0IElCSTQgPSB7XG4gIHR5cGU6IHZpZGVvS2V5Ym9hcmRSZXNwb25zZSxcbiAgb25fc3RhcnQ6IHNldEh0bWxCZ0dyYXksXG4gIHN0aW11bHVzOiBbYXN0ZXJvaWRBdHRhY2tMZXZlbFVwNF0sXG4gIHByb21wdDpcbiAgICAnPHA+UHJlc3MgdGhlIFNwYWNlYmFyIHdoZW4geW91IGFyZSByZWFkeSB0byBwcm9jZWVkLiBSZW1lbWJlciB0byBzaXQgYXQgb25lIGFybSBkaXN0YW5jZSBmcm9tIHRoZSBzY3JlZW4uPC9wPicsXG4gIGNob2ljZXM6IFsnICddLFxuICByZXNwb25zZV9hbGxvd2VkX3doaWxlX3BsYXlpbmc6IHRydWUsXG4gIHdpZHRoOiAxMjM4LFxuICBoZWlnaHQ6IDgwMCxcbn07XG5cbmNvbnN0IElCSTUgPSB7XG4gIHR5cGU6IHZpZGVvS2V5Ym9hcmRSZXNwb25zZSxcbiAgLy8gb25fc3RhcnQ6IHNldEh0bWxCZ0dyYXksXG4gIHN0aW11bHVzOiBbYXN0ZXJvaWRBdHRhY2tMZXZlbFVwNV0sXG4gIHByb21wdDpcbiAgICAnPHA+UHJlc3MgdGhlIFNwYWNlYmFyIHdoZW4geW91IGFyZSByZWFkeSB0byBwcm9jZWVkLiBSZW1lbWJlciB0byBzaXQgYXQgb25lIGFybSBkaXN0YW5jZSBmcm9tIHRoZSBzY3JlZW4uPC9wPicsXG4gIGNob2ljZXM6IFsnICddLFxuICByZXNwb25zZV9hbGxvd2VkX3doaWxlX3BsYXlpbmc6IHRydWUsXG4gIHRyaWFsX2R1cmF0aW9uOiBudWxsLFxuICB3aWR0aDogMTIzOCxcbiAgaGVpZ2h0OiA4MDAsXG59O1xuXG5jb25zdCBJQklFbmQgPSB7XG4gIHR5cGU6IHZpZGVvS2V5Ym9hcmRSZXNwb25zZSxcbiAgLy8gb25fc3RhcnQ6IHNldEh0bWxCZ0dyYXksXG4gIHN0aW11bHVzOiBbYXN0ZXJvaWRBdHRhY2tFbmRdLFxuICByZXNwb25zZV9hbGxvd2VkX3doaWxlX3BsYXlpbmc6IHRydWUsXG4gIGNob2ljZXM6IFsnICddLFxuICB0cmlhbF9kdXJhdGlvbjogbnVsbCxcbiAgd2lkdGg6IDEyMzgsXG4gIGhlaWdodDogODAwLFxuICBvbl9maW5pc2g6IGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBmaXJla2l0LmZpbmlzaFJ1bigpO1xuICB9LFxufTtcblxuLy8gLS0tLS0tLS0tUHJlcGFyZSB0aGUgbWFpbiB0aW1lbGluZS0tLS0tLS0tLVxuY29uc3QgUHJhY3RpY2VQcm9jZWR1cmUgPSB7XG4gIHRpbWVsaW5lOiBbcHJhY3RpY2VCbG9jaywgZmVlZGJhY2tCbG9ja10sXG4gIHRpbWVsaW5lX3ZhcmlhYmxlczogcHJhY3RpY2VJbmZvLFxuICByYW5kb21pemVfb3JkZXI6IHRydWUsXG4gIHJlcGV0aXRpb246IDEsXG59O1xuXG5jb25zdCBNb3Rpb25Db2hQcm9jZWR1cmUgPSB7XG4gIHRpbWVsaW5lOiBbdGVzdEJsb2NrLCBmZWVkYmFja0Jsb2NrXSxcbiAgdGltZWxpbmVfdmFyaWFibGVzOiB0cmlhbEluZm8sXG4gIHJhbmRvbWl6ZV9vcmRlcjogdHJ1ZSxcbiAgcmVwZXRpdGlvbjogMSxcbn07XG5cbnRpbWVsaW5lLnB1c2goUHJhY3RpY2VQcm9jZWR1cmUpO1xudGltZWxpbmUucHVzaChJQkkxKTtcbnRpbWVsaW5lLnB1c2goTW90aW9uQ29oUHJvY2VkdXJlKTtcbnRpbWVsaW5lLnB1c2goSUJJMik7XG50aW1lbGluZS5wdXNoKE1vdGlvbkNvaFByb2NlZHVyZSk7XG50aW1lbGluZS5wdXNoKElCSTMpO1xudGltZWxpbmUucHVzaChNb3Rpb25Db2hQcm9jZWR1cmUpO1xudGltZWxpbmUucHVzaChJQkk0KTtcbnRpbWVsaW5lLnB1c2goTW90aW9uQ29oUHJvY2VkdXJlKTtcbnRpbWVsaW5lLnB1c2goSUJJNSk7XG50aW1lbGluZS5wdXNoKE1vdGlvbkNvaFByb2NlZHVyZSk7XG50aW1lbGluZS5wdXNoKElCSUVuZCk7XG5cbi8qIGZpbmlzaCBjb25uZWN0aW9uIHdpdGggcGF2bG92aWEub3JnICovXG5jb25zdCBwYXZsb3ZpYUZpbmlzaCA9IHtcbiAgdHlwZToganNQc3ljaFBhdmxvdmlhKGpzUHN5Y2gpLFxuICBjb21tYW5kOiAnZmluaXNoJyxcbiAgcGFydGljaXBhbnRJZCxcbn07XG50aW1lbGluZS5wdXNoKHBhdmxvdmlhRmluaXNoKTtcblxuLy8gLS0tLS0tLS0tUnVuIHRoZSBleHBlcmltZW50LS0tLS0tLS0tXG5qc1BzeWNoLnJ1bih0aW1lbGluZSk7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyoqXG4gKiBqc1BzeWNoIHBsdWdpbiAodmVyc2lvbiA+IDcuMCkgZm9yIHBhdmxvdmlhLm9yZ1xuICpcbiAqIFRoaXMgcGx1Z2luIGhhbmRsZXMgY29tbXVuaWNhdGlvbnMgd2l0aCB0aGUgcGF2bG92aWEub3JnIHNlcnZlcjogaXQgb3BlbnMgYW5kIGNsb3NlcyBzZXNzaW9ucyxcbiAqIGFuZCB1cGxvYWRzIGRhdGEgdG8gdGhlIHNlcnZlci5cbiAqXG4gKiBAYXV0aG9yIEFsYWluIFBpdGlvdFxuICogQHZlcnNpb24gMjAyMi4xLjFcbiAqIEBjb3B5cmlnaHQgKGMpIDIwMTctMjAyMCBJbGl4YSBMdGQuIChodHRwOi8vaWxpeGEuY29tKSAoYykgMjAyMC0yMDIxIE9wZW4gU2NpZW5jZSBUb29scyBMdGQuXG4gKiAgIChodHRwczovL29wZW5zY2llbmNldG9vbHMub3JnKVxuICogQGxpY2Vuc2UgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNSVQgTGljZW5zZVxuICovXG5cbmV4cG9ydCBjb25zdCBqc1BzeWNoUGF2bG92aWEgPSAoanNQc3ljaCkgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLyoqXG4gICAqICoqcGF2bG92aWEqKlxuICAgKlxuICAgKiBUaGlzIHBsdWdpbiBoYW5kbGVzIGNvbW11bmljYXRpb25zIHdpdGggdGhlIHBhdmxvdmlhLm9yZyBzZXJ2ZXI6IGl0IG9wZW5zIGFuZCBjbG9zZXMgc2Vzc2lvbnMsXG4gICAqIGFuZCB1cGxvYWRzIGRhdGEgdG8gdGhlIHNlcnZlci5cbiAgICpcbiAgICogQGF1dGhvciBBbGFpbiBQaXRpb3RcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9wYXZsb3ZpYS5vcmcvZG9jcy9leHBlcmltZW50cy9jcmVhdGUtanNQc3ljaCBSdW5uaW5nIGpzUHN5Y2ggZXhwZXJpbWVudHMgZnJvbSBQYXZsb3ZpYX1cbiAgICovXG4gIGNsYXNzIFBhdmxvdmlhUGx1Z2luIHtcbiAgICBjb25zdHJ1Y3Rvcihqc1BzeWNoKSB7XG4gICAgICB0aGlzLl9qc1BzeWNoID0ganNQc3ljaDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSdW4gdGhlIHBsdWdpbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGRpc3BsYXlfZWxlbWVudCAtIHRoZSBIVE1MIERPTSBlbGVtZW50IHdoZXJlIGpzUHN5Y2ggY29udGVudFxuICAgICAqIFx0aXMgcmVuZGVyZWRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdHJpYWwgLSB0aGUganNQc3ljaCB0cmlhbFxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBhc3luYyB0cmlhbChkaXNwbGF5X2VsZW1lbnQsIHRyaWFsKSB7XG4gICAgICAvLyBleGVjdXRlIHRoZSBjb21tYW5kOlxuICAgICAgc3dpdGNoICh0cmlhbC5jb21tYW5kLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgY2FzZSAnaW5pdCc6XG4gICAgICAgICAgYXdhaXQgdGhpcy5faW5pdCh0cmlhbCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnZmluaXNoJzpcbiAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5fanNQc3ljaC5kYXRhLmdldCgpLmNzdigpO1xuICAgICAgICAgIGF3YWl0IHRoaXMuX2ZpbmlzaCh0cmlhbCwgZGF0YSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0cmlhbC5lcnJvckNhbGxiYWNrKCd1bmtub3duIGNvbW1hbmQ6ICcgKyB0cmlhbC5jb21tYW5kKTtcbiAgICAgIH1cblxuICAgICAgLy8gZW5kIHRyaWFsXG4gICAgICB0aGlzLl9qc1BzeWNoLmZpbmlzaFRyaWFsKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgZXJyb3IgY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBFcnJvciBtZXNzYWdlcyBhcmUgZGlzcGxheWVkIGluIHRoZSBib2R5IG9mIHRoZSBkb2N1bWVudCBhbmQgaW4gdGhlIGJyb3dzZXIncyBjb25zb2xlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVycm9yIC0gdGhlIGVycm9yIGpzb24gb2JqZWN0IHRvIGJlIGRpc3BsYXllZC5cbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgc3RhdGljIGRlZmF1bHRFcnJvckNhbGxiYWNrKGVycm9yKSB7XG4gICAgICAvLyBvdXRwdXQgdGhlIGVycm9yIHRvIHRoZSBjb25zb2xlOlxuICAgICAgY29uc29sZS5lcnJvcignW3BhdmxvdmlhICcgKyBQYXZsb3ZpYVBsdWdpbi52ZXJzaW9uICsgJ10nLCBlcnJvcik7XG5cbiAgICAgIC8vIG91dHB1dCB0aGUgZXJyb3IgdG8gdGhlIGh0bWwgYm9keTpcbiAgICAgIGxldCBodG1sQ29kZSA9XG4gICAgICAgICc8aDM+W2pzcHN5Y2gtcGF2bG92aWEgcGx1Z2luICcgK1xuICAgICAgICBQYXZsb3ZpYVBsdWdpbi52ZXJzaW9uICtcbiAgICAgICAgJ10gRXJyb3I8L2gzPjx1bD4nO1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgJ2NvbnRleHQnIGluIGVycm9yKSB7XG4gICAgICAgICAgaHRtbENvZGUgKz0gJzxsaT4nICsgZXJyb3IuY29udGV4dCArICc8L2xpPic7XG4gICAgICAgICAgZXJyb3IgPSBlcnJvci5lcnJvcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBodG1sQ29kZSArPSAnPGxpPjxiPicgKyBlcnJvciArICc8L2I+PC9saT4nO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBodG1sQ29kZSArPSAnPC91bD4nO1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keScpLmlubmVySFRNTCA9IGh0bWxDb2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IGRhdGEgZmlsdGVyLCBhcHBsaWVkIHRvIHRoZSBkYXRhIGdhdGhlcmVkIGJ5IGpzUHN5Y2gsIGJlZm9yZSB0aGV5IGFyZVxuICAgICAqIHVwbG9hZGVkIHRvIHRoZSBzZXJ2ZXIuXG4gICAgICpcbiAgICAgKiBUaGUgZmlsdGVyIHR5cGljYWxseSBwcnVuZXMgYW5kIHJlZm9ybWF0IGpzUHN5Y2guZGF0YS5nZXQoKS5jc3YoKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gaW5wdXQgZGF0YSwgdHlwaWNhbGx5IGZyb20ganNQc3ljaC5kYXRhLmdldCgpLmNzdigpXG4gICAgICogQHJldHVybnMgZmlsdGVyZWQgZGF0YSwgcmVhZHkgZm9yIHVwbG9hZCB0byB0aGUgc2VydmVyXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIHN0YXRpYyBkZWZhdWx0RGF0YUZpbHRlcihkYXRhKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXNlIHRoZSBjb25uZWN0aW9uIHdpdGggcGF2bG92aWEub3JnOiBjb25maWd1cmUgdGhlIHBsdWdpbiBhbmQgb3BlbiBhIG5ldyBzZXNzaW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHRyaWFsIC0gdGhlIGpzUHN5Y2ggdHJpYWxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NvbmZpZ1VSTD0gXCJjb25maWcuanNvblwiXSAtIHRoZSBVUkwgb2YgdGhlIHBhdmxvdmlhLm9yZyBqc29uIGNvbmZpZ3VyYXRpb24gZmlsZVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgYXN5bmMgX2luaXQodHJpYWwsIGNvbmZpZ1VSTCA9ICdjb25maWcuanNvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGNvbmZpZ3VyZTpcbiAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fY29uZmlndXJlKGNvbmZpZ1VSTCk7XG4gICAgICAgIFBhdmxvdmlhUGx1Z2luLl9jb25maWcgPSByZXNwb25zZS5jb25maWc7XG4gICAgICAgIHRoaXMuX2xvZygnaW5pdCB8IF9jb25maWd1cmUucmVzcG9uc2U9JywgcmVzcG9uc2UpO1xuXG4gICAgICAgIC8vIG9wZW4gYSBuZXcgc2Vzc2lvbjpcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9vcGVuU2Vzc2lvbigpO1xuICAgICAgICAvLyBfY29uZmlnLmV4cGVyaW1lbnQudG9rZW4gPSByZXNwb25zZS50b2tlbjtcbiAgICAgICAgdGhpcy5fbG9nKCdpbml0IHwgX29wZW5TZXNzaW9uLnJlc3BvbnNlPScsIHJlc3BvbnNlKTtcblxuICAgICAgICAvLyB3YXJuIHRoZSB1c2VyIHdoZW4gdGhleSBhdHRlbXB0IHRvIGNsb3NlIHRoZSB0YWIgb3IgYnJvd3NlcjpcbiAgICAgICAgY29uc3QgX2JlZm9yZXVubG9hZENhbGxiYWNrID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgLy8gcHJldmVudERlZmF1bHQgc2hvdWxkIGVuc3VyZSB0aGF0IHRoZSB1c2VyIGdldHMgcHJvbXB0ZWQ6XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgIC8vIENocm9tZSByZXF1aXJlcyByZXR1cm5WYWx1ZSB0byBiZSBzZXQ6XG4gICAgICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSAnJztcbiAgICAgICAgfTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIF9iZWZvcmV1bmxvYWRDYWxsYmFjayk7XG5cbiAgICAgICAgLy8gd2hlbiB0aGUgdXNlciBjbG9zZXMgdGhlIHRhYiBvciBicm93c2VyLCB3ZSBhdHRlbXB0IHRvIGNsb3NlIHRoZSBzZXNzaW9uXG4gICAgICAgIC8vIGFuZCBvcHRpb25hbGx5IHNhdmUgdGhlIHJlc3VsdHNcbiAgICAgICAgLy8gbm90ZTogd2UgY29tbXVuaWNhdGUgd2l0aCB0aGUgc2VydmVyIHVzaW5nIHRoZSBCZWFjb24gQVBJXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd1bmxvYWQnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoUGF2bG92aWFQbHVnaW4uX2NvbmZpZy5zZXNzaW9uLnN0YXR1cyA9PT0gJ09QRU4nKSB7XG4gICAgICAgICAgICAvLyBnZXQgYW5kIHNhdmUgdGhlIGluY29tcGxldGUgcmVzdWx0cyBpZiBuZWVkIGJlOlxuICAgICAgICAgICAgaWYgKFBhdmxvdmlhUGx1Z2luLl9jb25maWcuZXhwZXJpbWVudC5zYXZlSW5jb21wbGV0ZVJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuX2pzUHN5Y2guZGF0YS5nZXQoKS5jc3YoKTtcbiAgICAgICAgICAgICAgdGhpcy5fc2F2ZSh0cmlhbCwgZGF0YSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNsb3NlIHRoZSBzZXNzaW9uOlxuICAgICAgICAgICAgdGhpcy5fY2xvc2VTZXNzaW9uKGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdHJpYWwuZXJyb3JDYWxsYmFjayhlcnJvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluaXNoIHRoZSBjb25uZWN0aW9uIHdpdGggcGF2bG92aWEub3JnOiB1cGxvYWQgdGhlIGNvbGxlY3RlZCBkYXRhIGFuZCBjbG9zZSB0aGUgc2Vzc2lvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0cmlhbCAtIHRoZSBqc1BzeWNoIHRyaWFsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSB0aGUgZXhwZXJpbWVudCBkYXRhIHRvIGJlIHVwbG9hZGVkXG4gICAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBhc3luYyBfZmluaXNoKHRyaWFsLCBkYXRhKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyByZW1vdmUgdGhlIGJlZm9yZXVubG9hZCBsaXN0ZW5lcjpcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgJ2JlZm9yZXVubG9hZCcsXG4gICAgICAgICAgUGF2bG92aWFQbHVnaW4uX2JlZm9yZXVubG9hZENhbGxiYWNrXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gdGVsbCB0aGUgcGFydGljaXBhbnQgdGhhdCB0aGUgZGF0YSBpcyBiZWluZyB1cGxvYWRlZDpcbiAgICAgICAgY29uc3QgbXNnID1cbiAgICAgICAgICAnUGxlYXNlIHdhaXQgYSBtb21lbnQgd2hpbGUgdGhlIGRhdGEgYXJlIHVwbG9hZGVkIHRvIHRoZSBwYXZsb3ZpYS5vcmcgc2VydmVyLi4uJztcbiAgICAgICAgY29uc3QgZGlzcGxheUVsZW1lbnQgPSB0aGlzLl9qc1BzeWNoLmdldERpc3BsYXlFbGVtZW50KCk7XG4gICAgICAgIGRpc3BsYXlFbGVtZW50LmlubmVySFRNTCA9ICc8cHJlIGlkPVwicGF2bG92aWEtZGF0YS11cGxvYWRcIj48L3ByZT4nO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGF2bG92aWEtZGF0YS11cGxvYWQnKS50ZXh0Q29udGVudCA9IG1zZztcblxuICAgICAgICAvLyB1cGxvYWQgdGhlIGRhdGEgdG8gcGF2bG92aWEub3JnOlxuICAgICAgICBjb25zdCBzeW5jID0gdHlwZW9mIHRyaWFsLnN5bmMgIT09ICd1bmRlZmluZWQnID8gdHJpYWwuc3luYyA6IGZhbHNlO1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zYXZlKHRyaWFsLCBkYXRhLCBzeW5jKTtcbiAgICAgICAgdGhpcy5fbG9nKCdmaW5pc2ggfCBfc2F2ZS5yZXNwb25zZT0nLCByZXNwb25zZSk7XG5cbiAgICAgICAgLy8gY2hlY2sgZm9yIGVycm9yczpcbiAgICAgICAgaWYgKCdzZXJ2ZXJEYXRhJyBpbiByZXNwb25zZSAmJiAnZXJyb3InIGluIHJlc3BvbnNlLnNlcnZlckRhdGEpIHtcbiAgICAgICAgICB0aHJvdyByZXNwb25zZS5zZXJ2ZXJEYXRhO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2xvc2UgdGhlIHNlc3Npb246XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fY2xvc2VTZXNzaW9uKHRydWUsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fbG9nKCdmaW5pc2ggfCBfY2xvc2VTZXNzaW9uLnJlc3BvbnNlPScsIHJlc3BvbnNlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRyaWFsLmVycm9yQ2FsbGJhY2soZXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSB0aGUgcGx1Z2luIGJ5IHJlYWRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBjcmVhdGVkIHVwb24gYWN0aXZhdGlvblxuICAgICAqIG9mIHRoZSBleHBlcmltZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjb25maWdVUkw9IFwiY29uZmlnLmpzb25cIl0gLSB0aGUgVVJMIG9mIHRoZSBwYXZsb3ZpYS5vcmcganNvblxuICAgICAqIFx0Y29uZmlndXJhdGlvbiBmaWxlXG4gICAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGFzeW5jIF9jb25maWd1cmUoY29uZmlnVVJMKSB7XG4gICAgICBsZXQgcmVzcG9uc2UgPSB7XG4gICAgICAgIG9yaWdpbjogJ19jb25maWd1cmUnLFxuICAgICAgICBjb250ZXh0OiAnd2hlbiBjb25maWd1cmluZyB0aGUgcGx1Z2luJyxcbiAgICAgIH07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZ3VyYXRpb25SZXNwb25zZSA9IGF3YWl0IHRoaXMuX2dldENvbmZpZ3VyYXRpb24oY29uZmlnVVJMKTtcblxuICAgICAgICAvLyBsZWdhY3kgZXhwZXJpbWVudHMgaGFkIGEgcHN5Y2hvSnNNYW5hZ2VyIGJsb2NrIGluc3RlYWQgb2YgYSBwYXZsb3ZpYSBibG9jaywgYW5kIHRoZSBVUkxcbiAgICAgICAgLy8gcG9pbnRlZCB0byBodHRwczovL3BhdmxvdmlhLm9yZy9zZXJ2ZXJcbiAgICAgICAgaWYgKCdwc3ljaG9Kc01hbmFnZXInIGluIGNvbmZpZ3VyYXRpb25SZXNwb25zZS5jb25maWcpIHtcbiAgICAgICAgICBkZWxldGUgY29uZmlndXJhdGlvblJlc3BvbnNlLmNvbmZpZy5wc3ljaG9Kc01hbmFnZXI7XG4gICAgICAgICAgY29uZmlndXJhdGlvblJlc3BvbnNlLmNvbmZpZy5wYXZsb3ZpYSA9IHtcbiAgICAgICAgICAgIFVSTDogJ2h0dHBzOi8vcGF2bG92aWEub3JnJyxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGVzdHMgZm9yIHRoZSBwcmVzZW5jZSBvZiBlc3NlbnRpYWwgYmxvY2tzIGluIHRoZSBjb25maWd1cmF0aW9uOlxuICAgICAgICBpZiAoISgnZXhwZXJpbWVudCcgaW4gY29uZmlndXJhdGlvblJlc3BvbnNlLmNvbmZpZykpIHtcbiAgICAgICAgICB0aHJvdyAnbWlzc2luZyBleHBlcmltZW50IGJsb2NrIGluIGNvbmZpZ3VyYXRpb24nO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKCduYW1lJyBpbiBjb25maWd1cmF0aW9uUmVzcG9uc2UuY29uZmlnLmV4cGVyaW1lbnQpKSB7XG4gICAgICAgICAgdGhyb3cgJ21pc3NpbmcgbmFtZSBpbiBleHBlcmltZW50IGJsb2NrIGluIGNvbmZpZ3VyYXRpb24nO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKCdmdWxscGF0aCcgaW4gY29uZmlndXJhdGlvblJlc3BvbnNlLmNvbmZpZy5leHBlcmltZW50KSkge1xuICAgICAgICAgIHRocm93ICdtaXNzaW5nIGZ1bGxwYXRoIGluIGV4cGVyaW1lbnQgYmxvY2sgaW4gY29uZmlndXJhdGlvbic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoJ3BhdmxvdmlhJyBpbiBjb25maWd1cmF0aW9uUmVzcG9uc2UuY29uZmlnKSkge1xuICAgICAgICAgIHRocm93ICdtaXNzaW5nIHBhdmxvdmlhIGJsb2NrIGluIGNvbmZpZ3VyYXRpb24nO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKCdVUkwnIGluIGNvbmZpZ3VyYXRpb25SZXNwb25zZS5jb25maWcucGF2bG92aWEpKSB7XG4gICAgICAgICAgdGhyb3cgJ21pc3NpbmcgVVJMIGluIHBhdmxvdmlhIGJsb2NrIGluIGNvbmZpZ3VyYXRpb24nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZ2V0IHRoZSBzZXJ2ZXIgcGFyYW1ldGVycyAodGhvc2Ugc3RhcnRpbmcgd2l0aCBhIGRvdWJsZSB1bmRlcnNjb3JlKTpcbiAgICAgICAgY29uc3QgdXJsUXVlcnkgPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoLnNsaWNlKDEpO1xuICAgICAgICBjb25zdCB1cmxQYXJhbWV0ZXJzID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh1cmxRdWVyeSk7XG4gICAgICAgIHVybFBhcmFtZXRlcnMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgIGlmIChrZXkuaW5kZXhPZignX18nKSA9PT0gMCkge1xuICAgICAgICAgICAgUGF2bG92aWFQbHVnaW4uX3NlcnZlck1zZy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvblJlc3BvbnNlO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgeyAuLi5yZXNwb25zZSwgZXJyb3IgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHBhdmxvdmlhLm9yZyBqc29uIGNvbmZpZ3VyYXRpb24gZmlsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb25maWdVUkwgLSB0aGUgVVJMIG9mIHRoZSBwYXZsb3ZpYS5vcmcganNvbiBjb25maWd1cmF0aW9uIGZpbGVcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2dldENvbmZpZ3VyYXRpb24oY29uZmlnVVJMKSB7XG4gICAgICBsZXQgcmVzcG9uc2UgPSB7XG4gICAgICAgIG9yaWdpbjogJ19nZXRDb25maWd1cmF0aW9uJyxcbiAgICAgICAgY29udGV4dDogJ3doZW4gcmVhZGluZyB0aGUgY29uZmlndXJhdGlvbiBmaWxlOiAnICsgY29uZmlnVVJMLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBxdWVyeSB0aGUgcGF2bG92aWEgc2VydmVyOlxuICAgICAgICAgIGNvbnN0IHNlcnZlclJlc3BvbnNlID0gYXdhaXQgZmV0Y2goY29uZmlnVVJMLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgbW9kZTogJ2NvcnMnLFxuICAgICAgICAgICAgY2FjaGU6ICduby1jYWNoZScsXG4gICAgICAgICAgICBjcmVkZW50aWFsczogJ3NhbWUtb3JpZ2luJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWRpcmVjdDogJ2ZvbGxvdycsXG4gICAgICAgICAgICByZWZlcnJlclBvbGljeTogJ25vLXJlZmVycmVyJyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBzZXJ2ZXJEYXRhID0gYXdhaXQgc2VydmVyUmVzcG9uc2UuanNvbigpO1xuXG4gICAgICAgICAgcmVzb2x2ZSh7IC4uLnJlc3BvbnNlLCBjb25maWc6IHNlcnZlckRhdGEgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgcmVqZWN0KHsgLi4ucmVzcG9uc2UsIGVycm9yIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVuIGEgbmV3IHNlc3Npb24gZm9yIHRoaXMgZXhwZXJpbWVudCBvbiBwYXZsb3ZpYS5vcmcuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX29wZW5TZXNzaW9uKCkge1xuICAgICAgbGV0IHJlc3BvbnNlID0ge1xuICAgICAgICBvcmlnaW46ICdfb3BlblNlc3Npb24nLFxuICAgICAgICBjb250ZXh0OlxuICAgICAgICAgICd3aGVuIG9wZW5pbmcgYSBzZXNzaW9uIGZvciBleHBlcmltZW50OiAnICtcbiAgICAgICAgICBQYXZsb3ZpYVBsdWdpbi5fY29uZmlnLmV4cGVyaW1lbnQuZnVsbHBhdGgsXG4gICAgICB9O1xuXG4gICAgICAvLyBwcmVwYXJlIGEgUE9TVCBxdWVyeTpcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICBpZiAoUGF2bG92aWFQbHVnaW4uX3NlcnZlck1zZy5oYXMoJ19fcGlsb3RUb2tlbicpKSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChcbiAgICAgICAgICAncGlsb3RUb2tlbicsXG4gICAgICAgICAgUGF2bG92aWFQbHVnaW4uX3NlcnZlck1zZy5nZXQoJ19fcGlsb3RUb2tlbicpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIHF1ZXJ5IHBhdmxvdmlhIHNlcnZlcjpcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke1BhdmxvdmlhUGx1Z2luLl9jb25maWcucGF2bG92aWEuVVJMfS9hcGkvdjIvZXhwZXJpbWVudHMvJHtQYXZsb3ZpYVBsdWdpbi5fY29uZmlnLmdpdGxhYi5wcm9qZWN0SWR9L3Nlc3Npb25zYDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBxdWVyeSB0aGUgcGF2bG92aWEgc2VydmVyOlxuICAgICAgICAgIGNvbnN0IHNlcnZlclJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIG1vZGU6ICdjb3JzJyxcbiAgICAgICAgICAgIGNhY2hlOiAnbm8tY2FjaGUnLFxuICAgICAgICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVkaXJlY3Q6ICdmb2xsb3cnLFxuICAgICAgICAgICAgcmVmZXJyZXJQb2xpY3k6ICduby1yZWZlcnJlcicsXG4gICAgICAgICAgICBib2R5OiBmb3JtRGF0YSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBzZXJ2ZXJEYXRhID0gYXdhaXQgc2VydmVyUmVzcG9uc2UuanNvbigpO1xuXG4gICAgICAgICAgLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGF0dHJpYnV0ZXM6XG4gICAgICAgICAgaWYgKCEoJ3Rva2VuJyBpbiBzZXJ2ZXJEYXRhKSkge1xuICAgICAgICAgICAgcmVqZWN0KFxuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHJlc3BvbnNlLCB7XG4gICAgICAgICAgICAgICAgZXJyb3I6ICd1bmV4cGVjdGVkIGFuc3dlciBmcm9tIHNlcnZlcjogbm8gdG9rZW4nLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCEoJ2V4cGVyaW1lbnQnIGluIHNlcnZlckRhdGEpKSB7XG4gICAgICAgICAgICByZWplY3QoXG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ocmVzcG9uc2UsIHtcbiAgICAgICAgICAgICAgICBlcnJvcjogJ3VuZXhwZWN0ZWQgYW5zd2VyIGZyb20gc2VydmVyOiBubyBleHBlcmltZW50JyxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBjb25maWd1cmF0aW9uOlxuICAgICAgICAgIFBhdmxvdmlhUGx1Z2luLl9jb25maWcuc2Vzc2lvbiA9IHtcbiAgICAgICAgICAgIHRva2VuOiBzZXJ2ZXJEYXRhLnRva2VuLFxuICAgICAgICAgICAgc3RhdHVzOiAnT1BFTicsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBQYXZsb3ZpYVBsdWdpbi5fY29uZmlnLmV4cGVyaW1lbnQuc3RhdHVzID1cbiAgICAgICAgICAgIHNlcnZlckRhdGEuZXhwZXJpbWVudC5zdGF0dXMyO1xuICAgICAgICAgIFBhdmxvdmlhUGx1Z2luLl9jb25maWcuZXhwZXJpbWVudC5zYXZlRm9ybWF0ID0gU3ltYm9sLmZvcihcbiAgICAgICAgICAgIHNlcnZlckRhdGEuZXhwZXJpbWVudC5zYXZlRm9ybWF0XG4gICAgICAgICAgKTtcbiAgICAgICAgICBQYXZsb3ZpYVBsdWdpbi5fY29uZmlnLmV4cGVyaW1lbnQuc2F2ZUluY29tcGxldGVSZXN1bHRzID1cbiAgICAgICAgICAgIHNlcnZlckRhdGEuZXhwZXJpbWVudC5zYXZlSW5jb21wbGV0ZVJlc3VsdHM7XG4gICAgICAgICAgUGF2bG92aWFQbHVnaW4uX2NvbmZpZy5leHBlcmltZW50LmxpY2Vuc2UgPVxuICAgICAgICAgICAgc2VydmVyRGF0YS5leHBlcmltZW50LmxpY2Vuc2U7XG4gICAgICAgICAgUGF2bG92aWFQbHVnaW4uX2NvbmZpZy5ydW5Nb2RlID0gc2VydmVyRGF0YS5leHBlcmltZW50LnJ1bk1vZGU7XG5cbiAgICAgICAgICByZXNvbHZlKFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihyZXNwb25zZSwge1xuICAgICAgICAgICAgICB0b2tlbjogc2VydmVyRGF0YS50b2tlbixcbiAgICAgICAgICAgICAgc3RhdHVzOiBzZXJ2ZXJEYXRhLmV4cGVyaW1lbnQuc3RhdHVzMixcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICByZWplY3QoeyAuLi5yZXNwb25zZSwgZXJyb3IgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlIHRoZSBwcmV2aW91c2x5IG9wZW5lZCBzZXNzaW9uIG9uIHBhdmxvdmlhLm9yZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNDb21wbGV0ZWQgLSB3aGV0aGVyIG9yIG5vdCB0aGUgcGFydGljaXBhbnQgY29tcGxldGVkIHRoZSBleHBlcmltZW50XG4gICAgICogQHBhcmFtIHtib29sZWFufSBbc3luYyA9IGZhbHNlXSAtIHdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgQmVhY29uIEFQSSB0byBjb21tdW5pY2F0ZVxuICAgICAqIFx0d2l0aCB0aGUgc2VydmVyXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfY2xvc2VTZXNzaW9uKGlzQ29tcGxldGVkID0gdHJ1ZSwgc3luYyA9IGZhbHNlKSB7XG4gICAgICBsZXQgcmVzcG9uc2UgPSB7XG4gICAgICAgIG9yaWdpbjogJ19jbG9zZVNlc3Npb24nLFxuICAgICAgICBjb250ZXh0OlxuICAgICAgICAgICd3aGVuIGNsb3NpbmcgdGhlIHNlc3Npb24gZm9yIGV4cGVyaW1lbnQ6ICcgK1xuICAgICAgICAgIFBhdmxvdmlhUGx1Z2luLl9jb25maWcuZXhwZXJpbWVudC5mdWxscGF0aCxcbiAgICAgIH07XG5cbiAgICAgIC8vIHByZXBhcmUgYSBERUxFVEUgcXVlcnk6XG4gICAgICBjb25zdCB1cmwgPVxuICAgICAgICBQYXZsb3ZpYVBsdWdpbi5fY29uZmlnLnBhdmxvdmlhLlVSTCArXG4gICAgICAgICcvYXBpL3YyL2V4cGVyaW1lbnRzLycgK1xuICAgICAgICBQYXZsb3ZpYVBsdWdpbi5fY29uZmlnLmdpdGxhYi5wcm9qZWN0SWQgK1xuICAgICAgICAnL3Nlc3Npb25zLycgK1xuICAgICAgICBQYXZsb3ZpYVBsdWdpbi5fY29uZmlnLnNlc3Npb24udG9rZW47XG4gICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgZm9ybURhdGEuYXBwZW5kKCdpc0NvbXBsZXRlZCcsIGlzQ29tcGxldGVkKTtcblxuICAgICAgLy8gc3luY2hyb25vdXNseSBxdWVyeSB0aGUgcGF2bG92aWEgc2VydmVyOlxuICAgICAgaWYgKHN5bmMpIHtcbiAgICAgICAgbmF2aWdhdG9yLnNlbmRCZWFjb24odXJsICsgJy9kZWxldGUnLCBmb3JtRGF0YSk7XG4gICAgICAgIFBhdmxvdmlhUGx1Z2luLl9jb25maWcuc2Vzc2lvbi5zdGF0dXMgPSAnQ0xPU0VEJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGFzeW5jaHJvbm91c2x5IHF1ZXJ5IHRoZSBwYXZsb3ZpYSBzZXJ2ZXI6XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIHF1ZXJ5IHRoZSBwYXZsb3ZpYSBzZXJ2ZXI6XG4gICAgICAgICAgICBjb25zdCBzZXJ2ZXJSZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICAgICAgICBtb2RlOiAnY29ycycsXG4gICAgICAgICAgICAgIGNhY2hlOiAnbm8tY2FjaGUnLFxuICAgICAgICAgICAgICBjcmVkZW50aWFsczogJ3NhbWUtb3JpZ2luJyxcbiAgICAgICAgICAgICAgcmVkaXJlY3Q6ICdmb2xsb3cnLFxuICAgICAgICAgICAgICByZWZlcnJlclBvbGljeTogJ25vLXJlZmVycmVyJyxcbiAgICAgICAgICAgICAgYm9keTogZm9ybURhdGEsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHNlcnZlckRhdGEgPSBhd2FpdCBzZXJ2ZXJSZXNwb25zZS5qc29uKCk7XG5cbiAgICAgICAgICAgIFBhdmxvdmlhUGx1Z2luLl9jb25maWcuc2Vzc2lvbi5zdGF0dXMgPSAnQ0xPU0VEJztcbiAgICAgICAgICAgIHJlc29sdmUoT2JqZWN0LmFzc2lnbihyZXNwb25zZSwgeyBzZXJ2ZXJEYXRhIH0pKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICByZWplY3QoeyAuLi5yZXNwb25zZSwgZXJyb3IgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGxvYWQgZGF0YSB0byB0aGUgcGF2bG92aWEub3JnIHNlcnZlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0cmlhbCAtIHRoZSBqc1BzeWNoIHRyaWFsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGEgLSB0aGUgZXhwZXJpbWVudCBkYXRhIHRvIGJlIHVwbG9hZGVkXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbc3luYyA9IGZhbHNlXSAtIHdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgQmVhY29uIEFQSSB0byBjb21tdW5pY2F0ZVxuICAgICAqIFx0d2l0aCB0aGUgc2VydmVyXG4gICAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgYXN5bmMgX3NhdmUodHJpYWwsIGRhdGEsIHN5bmMgPSBmYWxzZSkge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICBsZXQgZGF0ZVN0cmluZyA9XG4gICAgICAgIGRhdGUuZ2V0RnVsbFllYXIoKSArXG4gICAgICAgICctJyArXG4gICAgICAgICgnMCcgKyAoMSArIGRhdGUuZ2V0TW9udGgoKSkpLnNsaWNlKC0yKSArXG4gICAgICAgICctJyArXG4gICAgICAgICgnMCcgKyBkYXRlLmdldERhdGUoKSkuc2xpY2UoLTIpICtcbiAgICAgICAgJ18nO1xuICAgICAgZGF0ZVN0cmluZyArPVxuICAgICAgICAoJzAnICsgZGF0ZS5nZXRIb3VycygpKS5zbGljZSgtMikgK1xuICAgICAgICAnaCcgK1xuICAgICAgICAoJzAnICsgZGF0ZS5nZXRNaW51dGVzKCkpLnNsaWNlKC0yKSArXG4gICAgICAgICcuJyArXG4gICAgICAgICgnMCcgKyBkYXRlLmdldFNlY29uZHMoKSkuc2xpY2UoLTIpICtcbiAgICAgICAgJy4nICtcbiAgICAgICAgZGF0ZS5nZXRNaWxsaXNlY29uZHMoKTtcblxuICAgICAgY29uc3Qga2V5ID1cbiAgICAgICAgUGF2bG92aWFQbHVnaW4uX2NvbmZpZy5leHBlcmltZW50Lm5hbWUgK1xuICAgICAgICAnXycgK1xuICAgICAgICB0cmlhbC5wYXJ0aWNpcGFudElkICtcbiAgICAgICAgJ18nICtcbiAgICAgICAgJ1NFU1NJT04nICtcbiAgICAgICAgJ18nICtcbiAgICAgICAgZGF0ZVN0cmluZyArXG4gICAgICAgICcuY3N2JztcbiAgICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IHRyaWFsLmRhdGFGaWx0ZXIoZGF0YSk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgUGF2bG92aWFQbHVnaW4uX2NvbmZpZy5leHBlcmltZW50LnN0YXR1cyA9PT0gJ1JVTk5JTkcnICYmXG4gICAgICAgICFQYXZsb3ZpYVBsdWdpbi5fc2VydmVyTXNnLmhhcygnX19waWxvdFRva2VuJylcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fdXBsb2FkRGF0YShrZXksIGZpbHRlcmVkRGF0YSwgc3luYyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9vZmZlckRhdGFGb3JEb3dubG9hZChrZXksIGZpbHRlcmVkRGF0YSwgJ3RleHQvY3N2Jyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgb3JpZ2luOiAnX3NhdmUnLFxuICAgICAgICAgIGNvbnRleHQ6XG4gICAgICAgICAgICAnd2hlbiBzYXZpbmcgcmVzdWx0cyBmb3IgZXhwZXJpbWVudDogJyArXG4gICAgICAgICAgICBQYXZsb3ZpYVBsdWdpbi5fY29uZmlnLmV4cGVyaW1lbnQuZnVsbHBhdGgsXG4gICAgICAgICAgbWVzc2FnZTogJ29mZmVyZWQgdGhlIC5jc3YgZmlsZSBmb3IgZG93bmxvYWQnLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwbG9hZCBkYXRhIChhIGtleS92YWx1ZSBwYWlyKSB0byBwYXZsb3ZpYS5vcmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gdGhlIGtleVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIHRoZSB2YWx1ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3N5bmMgPSBmYWxzZV0gLSB3aGV0aGVyIG9yIG5vdCB0byB1cGxvYWQgdGhlIGRhdGEgdXNpbmcgdGhlIEJlYWNvbiBBUElcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3VwbG9hZERhdGEoa2V5LCB2YWx1ZSwgc3luYyA9IGZhbHNlKSB7XG4gICAgICBsZXQgcmVzcG9uc2UgPSB7XG4gICAgICAgIG9yaWdpbjogJ191cGxvYWREYXRhJyxcbiAgICAgICAgY29udGV4dDpcbiAgICAgICAgICBcIndoZW4gdXBsb2FkaW5nIHBhcnRpY2lwYW50JyByZXN1bHRzIGZvciBleHBlcmltZW50OiBcIiArXG4gICAgICAgICAgUGF2bG92aWFQbHVnaW4uX2NvbmZpZy5leHBlcmltZW50LmZ1bGxwYXRoLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdXJsID1cbiAgICAgICAgUGF2bG92aWFQbHVnaW4uX2NvbmZpZy5wYXZsb3ZpYS5VUkwgK1xuICAgICAgICAnL2FwaS92Mi9leHBlcmltZW50cy8nICtcbiAgICAgICAgUGF2bG92aWFQbHVnaW4uX2NvbmZpZy5naXRsYWIucHJvamVjdElkICtcbiAgICAgICAgJy9zZXNzaW9ucy8nICtcbiAgICAgICAgUGF2bG92aWFQbHVnaW4uX2NvbmZpZy5zZXNzaW9uLnRva2VuICtcbiAgICAgICAgJy9yZXN1bHRzJztcblxuICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgna2V5Jywga2V5KTtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgndmFsdWUnLCB2YWx1ZSk7XG5cbiAgICAgIC8vIHN5bmNocm9ub3VzIHF1ZXJ5IHRoZSBwYXZsb3ZpYSBzZXJ2ZXI6XG4gICAgICBpZiAoc3luYykge1xuICAgICAgICBuYXZpZ2F0b3Iuc2VuZEJlYWNvbih1cmwsIGZvcm1EYXRhKTtcbiAgICAgIH1cbiAgICAgIC8vIGFzeW5jaHJvbm91c2x5IHF1ZXJ5IHRoZSBwYXZsb3ZpYSBzZXJ2ZXI6XG4gICAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgc2VydmVyUmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgIG1vZGU6ICdjb3JzJyxcbiAgICAgICAgICAgICAgY2FjaGU6ICduby1jYWNoZScsXG4gICAgICAgICAgICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLFxuICAgICAgICAgICAgICByZWRpcmVjdDogJ2ZvbGxvdycsXG4gICAgICAgICAgICAgIHJlZmVycmVyUG9saWN5OiAnbm8tcmVmZXJyZXInLFxuICAgICAgICAgICAgICBib2R5OiBmb3JtRGF0YSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qgc2VydmVyRGF0YSA9IGF3YWl0IHNlcnZlclJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgICAgICAgcmVzb2x2ZShPYmplY3QuYXNzaWduKHJlc3BvbnNlLCB7IHNlcnZlckRhdGEgfSkpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHJlamVjdCh7IC4uLnJlc3BvbnNlLCBlcnJvciB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvZyBtZXNzYWdlcyB0byB0aGUgYnJvd3NlcidzIGNvbnNvbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gey4uLip9IG1lc3NhZ2VzIC0gdGhlIG1lc3NhZ2VzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgYnJvd3NlcidzIGNvbnNvbGVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9sb2coLi4ubWVzc2FnZXMpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdbcGF2bG92aWEgJyArIFBhdmxvdmlhUGx1Z2luLnZlcnNpb24gKyAnXScsIC4uLm1lc3NhZ2VzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPZmZlciBkYXRhIGFzIGRvd25sb2FkIGluIHRoZSBicm93c2VyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gYmUgZG93bmxvYWRlZFxuICAgICAqIEBwYXJhbSB7Kn0gZGF0YSAtIHRoZSBkYXRhXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSB0aGUgTUlNRSB0eXBlIG9mIHRoZSBkYXRhLCBlLmcuICd0ZXh0L2Nzdicgb3IgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfb2ZmZXJEYXRhRm9yRG93bmxvYWQoZmlsZW5hbWUsIGRhdGEsIHR5cGUpIHtcbiAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbZGF0YV0sIHsgdHlwZSB9KTtcblxuICAgICAgaWYgKHdpbmRvdy5uYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYikge1xuICAgICAgICB3aW5kb3cubmF2aWdhdG9yLm1zU2F2ZUJsb2IoYmxvYiwgZmlsZW5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZWxlbSA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgIGVsZW0uaHJlZiA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICBlbGVtLmRvd25sb2FkID0gZmlsZW5hbWU7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWxlbSk7XG4gICAgICAgIGVsZW0uY2xpY2soKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChlbGVtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGx1Z2luIHZlcnNpb246XG4gICAqIEBwdWJsaWNcbiAgICovXG4gIFBhdmxvdmlhUGx1Z2luLnZlcnNpb24gPSAnMjAyMi4xLjEnO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF2bG92aWEub3JnIGNvbmZpZ3VyYXRpb24gKHVzdWFsbHkgcmVhZCBmcm9tIHRoZSBjb25maWcuanNvbiBjb25maWd1cmF0aW9uIGZpbGUpLlxuICAgKlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgUGF2bG92aWFQbHVnaW4uX2NvbmZpZyA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgZm9yIHRoZSBiZWZvcmV1bmxvYWQgZXZlbnQsIHdoaWNoIGlzIHRyaWdnZXJlZCB3aGVuIHRoZSBwYXJ0aWNpcGFudFxuICAgKiB0cmllcyB0byBsZWF2ZSB0aGUgZXhwZXJpbWVudCBieSBjbG9zaW5nIHRoZSB0YWIgb3IgYnJvd3Nlci5cbiAgICpcbiAgICogQHR5cGUge251bGx9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBQYXZsb3ZpYVBsdWdpbi5fYmVmb3JldW5sb2FkQ2FsbGJhY2sgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VydmVyIHBhcmFtZXRlcnMgKHRob3NlIHN0YXJ0aW5nIHdpdGggYSBkb3VibGUgdW5kZXJzY29yZSkuXG4gICAqXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBQYXZsb3ZpYVBsdWdpbi5fc2VydmVyTXNnID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICAgKiBQbHVnaW4gaW5mb3JtYXRpb24uXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIFBhdmxvdmlhUGx1Z2luLmluZm8gPSB7XG4gICAgbmFtZTogJ3BhdmxvdmlhJyxcbiAgICBkZXNjcmlwdGlvbjogJ2NvbW11bmljYXRpb24gd2l0aCBwYXZsb3ZpYS5vcmcnLFxuICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgIGNvbW1hbmQ6IHtcbiAgICAgICAgdHlwZToganNQc3ljaC5QYXJhbWV0ZXJUeXBlLlNUUklORyxcbiAgICAgICAgcHJldHR5X25hbWU6ICdDb21tYW5kJyxcbiAgICAgICAgZGVmYXVsdDogJ2luaXQnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBwYXZsb3ZpYSBjb21tYW5kOiBcImluaXRcIiAoZGVmYXVsdCkgb3IgXCJmaW5pc2hcIicsXG4gICAgICB9LFxuICAgICAgcGFydGljaXBhbnRJZDoge1xuICAgICAgICB0eXBlOiBqc1BzeWNoLlBhcmFtZXRlclR5cGUuU1RSSU5HLFxuICAgICAgICBwcmV0dHlfbmFtZTogJ1BhcnRpY2lwYW50IElkJyxcbiAgICAgICAgZGVmYXVsdDogJ1BBUlRJQ0lQQU5UJyxcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgJ1RoZSBwYXJ0aWNpcGFudCBJZDogXCJQQVJUSUNJUEFOVFwiIChkZWZhdWx0KSBvciBhbnkgc3RyaW5nJyxcbiAgICAgIH0sXG4gICAgICBlcnJvckNhbGxiYWNrOiB7XG4gICAgICAgIHR5cGU6IGpzUHN5Y2guUGFyYW1ldGVyVHlwZS5GVU5DVElPTixcbiAgICAgICAgcHJldHR5X25hbWU6ICdFcnJvckNhbGxiYWNrJyxcbiAgICAgICAgZGVmYXVsdDogUGF2bG92aWFQbHVnaW4uZGVmYXVsdEVycm9yQ2FsbGJhY2ssXG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICdUaGUgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIHdoZW5ldmVyIGFuIGVycm9yIGhhcyBvY2N1cnJlZCcsXG4gICAgICB9LFxuICAgICAgZGF0YUZpbHRlcjoge1xuICAgICAgICB0eXBlOiBqc1BzeWNoLlBhcmFtZXRlclR5cGUuRlVOQ1RJT04sXG4gICAgICAgIHByZXR0eV9uYW1lOiAnRGF0YUZpbHRlcicsXG4gICAgICAgIGRlZmF1bHQ6IFBhdmxvdmlhUGx1Z2luLmRlZmF1bHREYXRhRmlsdGVyLFxuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAnVGhlIGZpbHRlciBhcHBsaWVkIHRvIHRoZSBkYXRhIGdhdGhlcmVkIGJ5IGpzUHN5Y2ggYmVmb3JlIHVwbG9hZCB0byB0aGUgc2VydmVyJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gUGF2bG92aWFQbHVnaW47XG59O1xuIiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2dldFVybC5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8wX19fID0gbmV3IFVSTChcImRhdGE6Zm9udC93b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBRW1NQUJJQUFBQUFpSndBQUVrbUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR2xvYml6NGNQQVpnUDFOVVFWUmFBRndJZ2pnSm54UVJFQXFCeUJDQnJtZ0xnekFBQVRZQ0pBT0dWQVFnQllSY0J5QU1oaFliRFhrVjdOaVR3TVlCQnB1MUFTbUtZT1BBWTRLbVpQOS9PdURHMEdsZ1ZuL0lpVU5aRzk1aEd0c2o5cmxkNmlkWWFXTTdocXArV3QxVVBOMTRxVlE0RUpVcmVYRVZuVXpGMk5EOElkb1VYVHZzY0NKb1JlUGh4Unc2YjFYRkdaaDN6Vis1cVJYaWptNE9uQmhhb09RWURZMGtKbnpTMkZjdnFVcjZ6eEdnUlNLalNKNWJZWTQwTWRoVE03UDlmM1ZWLy84RXF5dEhqbjdSRVFNb0drUlZEb1FjS0VjOFV0bExIUGNFdnZ2NmNObHJEY0EyUlh0b1k0RWdZY2FzSUpSV2tFZ1RwY1VBUVJHN3BqMmQwNmtZc3hiNk9mKzU4RjgrRnYzY2UvR292VWNBckRQRmUzcDBpUE9oenJUV085bjZGSEJ1cDcxekZVdUo5SytIc0ovQXRvcXJzejRRRjVDZCtxKzJjdVlvUUhPcFRuTGdXNy8wYm1yQ1dRd3M2Zkk5SVh0UktUcXVJLzEwelhQUVY0WXMwcXRwMnRDMStQUms3K1hjNXdTWWY1M2FsK1VJdnVBRENkZ2d4M0lpUnlxcDZDc1Fid2MwVERRdW5QUTZMQjJiRE5POUdqU3VEcUVvYWc3bWcweUNTOW1VTitieHhXbVBpdXpJc3V6RXVkd1k2M2VNaGJvQkt1QVBvS093c0pqMS8welYydGtkVUZnUkRvUkYyOUJGOHU2Y1lsR0p2SlNMOW5KNzNlNmZuWjJkbVYxb3NTQXRMa0NUSUVRSFV0SjdnREpBUDRzTGl2Y0FCZWRZdWJzWVNDcllwRE1kUXlpdkM2bG9jbEdVTWJaWGxOVzE1enRmMysrUklPNWFRVnlDU1kwcVZPTWEzNlhPLy9hTngwb05DcGR3WTVsMUd3ZmFmdnZzTURhL1B4d3NYc1l0eFVSRm9sVjA3MzR1VEVEa2Njb1BXMGF6S0NBRkUwckltT09WYU9QN3FZa2ZvU3Qra1ErS2YrWUJaaURIZ1cza1J1S2FGaEdBMG1tdnd4SVlXQngzQXBVRlFGeXJWNWVreEkxcXNUSnhrMWlrVHR4V1dGbTZHK2IvZVZBcm9SZDQ5VG1BL2UyMzNyVURYR29BUTVlYVdkSlpzUTJXTmNDbmpEUFJSZEl6Qm1BSWhtSVN6bnlrQ2prZTZNQUhOUmpCaTd3b0RrV1VoeTVxWlcvU0hKM1JIeU54TkdiMXRpNkhNZGJpZEp5TEMzRVFOK0tqZUJBZng3UDRMbjZJM3h6Z3NQU0l2eE5BYldwcjZwd2U2WlUrTHMrZ2pNallUTTZTeENZeHM1S1ZnaXhJU1g1SjFWbWQ5ZG1hM1RtWVl6bWRKM0k1Ti9Kc25zK0xlU3ZmZTdoMzNjbEgrV2wrbGMvenAvd2ovNVdwbWJXWnZabUxJRUxJVHlHS1VyeFNsUzZ5Nk9Jb1J5TEpWS3BLMWFoUjdlclZrQ1kwb3dXdGFrczczVjlxWGRNSHVxY24rbHpmNktWKzBaLzYzK2JtUUhOSHV4bHExQURuMHRFdWQ2TFJ4cHRxaG5uT2M3RVY2MnRMNTFvM3U5UDlIdkZSejlyb05aLzJPVXlzcVIxTU5HRWlKb0l2UFhtLy9FczRCc2ZnNFBpZ2lSaUoyVWh1ckhBcFhtbnc2ZytucDdib2NoZlo3WGF1QjI0SjArT3lNZEJ3b3BIKytJSFN2VnFTRU1MNDRQY2hvb2FndGsvbi94Ui8zaTd5RUtudnBsUFJDd2FwTjlQNXJhTEdwUlcyNEE0WnhES0E1QmMxTUEyZmtaOFF2aWFqNnVHTGNwZndJbjRzbTZHVzF1Y1YzeVljeXhzNEU3dktBZUN2SlpneEc2OWl1dHlBWkRFbTREdnFvNFRSbzg1M3dQQXhFV1F6Y0tFOHpyZ0dQOFZ0K0ZOSmhycGZiKytZZ2tVeFlvSTBjQWFtUnpZV2Q0Q0IrSUxLaWVVektRVXVFK2V0c2J3aUlwZDZReEtLR1Q1YWRrTmpRcGdVM095UDVqakF1RVk4UTB6dTRxOGxscytsRVhoSC9GcWpYb2Q4S1NpVzA0S0lXRXJVL0ZqV3kvSUFxUU5wemRlV1p1M3hoZ3BJTzdHRWwvRUtNb0VEYWU0eUFyV3dUWmJoZ0ZqVTJ5UHRwRVgxVEV0SnFrTXM4M0crUEFrOElyOEc3cEczZ2NYeUErQVh1QWdMbEtrRkxRa3d3ZjBjREh4OE91SkkwSis0aXBWTitGWlFkaWplRFpPMVMrYkVHZStNOTFBMjZqUEhKWEJ5YUI2YzN4R0ViNHRmV21lNno2bmJuOXd0RTNFUURzSkIwYUJCdHhQYmpCakVBcWhEL2Y3OGpLUHl0Wm5JOTRuS0lWQ2IyWGsrOFV3YXdhVEpCUVZhOUswdUIxaXN6UjRBc2VZRmc1TnFoK0diUXVKblA5Y2dONXZIM1EvVEI2K3JsSm1ZQU9EQkcyV1ZKaUEvZUV5Ym1IOG5aSWVDR3NUTFFMWVl3SGZXTGltZ01RZ2duMU9DZ3kySnI0WlZsU2h4Y3lxQzliRExZK2x1ZHJzSHZGbWdZUytncjNLTE96M2swL09OMXdBc3YrZ2RlN3ZOdXAzb2N4NXdsM3Z0Z2szdDRIYTJDeE54QVRDZmk1ZVNXZXMyUDdHNDY5THhBc0FrNGpOVWZDZkFLUmJ2bExHR0JSb005SFV4eEptOE9KYzVCdWxPeGEyTWN3TUZqVjlQRTFNWTBiUEVKSDIwV1VZZXBnZGpQS1FqTEFCcU5oamN3VGpIWEdhTnVJRzI4UVk1eWd3THJGTkRPd1BxdVoxbmxSdUlLVVZQQTkxTUlFRkhvekphSHlOTU00dVJrMVBReFJIV2ZZcVIzeVErYkpLNnRzVlQxTkZLdDNHMFNZNnp4RlYram9mcm9JVk8rMmhIdzhLRUNKcHFPckpnbEduOWtiUldRTUR3dnF5YUdaOHpXanFLUFBuWStGaEhlMXRyUzNOVFkwTjlYYTJoUmw5ZHBkTldhbFRWRmVWbHBhb1NwVUl1azByRXhVV2l3b0w4dk53Y29ZRFA0M0xZTEdZMm5aYVZTYVdRU1VRQ1BnRHVXS2hPT2pQS1FjOHQ1Z2Vya3pOYnhhRHJsZGg3cDJZS2IwN01ZbGlYQnZXT29NWmloeE9wSHhwcnZXRUxCVjNVcjN2R3BZWVhiYS9rUllFUHMveWFobE1lamh1aFdnZUFjYW1hSGJHczVOVjA2N3NFVkR3VGxEazdlSVBMR1ZRcVFpQlppUnVWQ2RDZzhab0VtdkROVmliaDEvaEc4WmRPMUR2UHlEcTJMQ3RkU2JMQno1K0ZCODBVZjdTU2RVSEZsQVBJdW5uaE04NElTaG9CRzFqN25uSTJrTURMUXRNTUMvbmIvUVVLWUNFUlRNSHprV2grZ2dOc2p1TVQ0YkV6UnZPNUplOXo3bHZvNmhwaTIyNGxncUxFOFh4alV1WDU1a1p5QUFrNzN5SmZDYWs0M1BlcHdLOTdFTU5LSllCd29MTG1vcnFzbnFoMnpwdXMwbkFrOVJNQ1o0Y1o0UkhiNkVoRGlKQVROS0pLdzZ0UVJFK3Fnb29lc1NOUjNSVEZWb01Gam9BUWtwMzU1Q2RReWtSM1R4cnF1RHFoVGxPS3hpVTg1Vjl4eE04UXdFRjQzOGNVU2lqQ2s5d25HQTNxMGlZVGNTZDNTZ1RuT0NJUDlRU0RhN0U3UjdQWFZhM1VEMnh0NUpzUEtSejNia1RGL2FldjBtN1ZpZW9jNjdUdU9rQkNRSmdQM3ZBaDBqaFpQZVJQcFZoUE1OYlBubjlZQm9ZMVNSSmVHZlpwK0hEZFVhY2dlRERVNG5Galp1Ung0WlRaazhHcHZvR1dkWEIxM1paQUUvMEZkMEs0aDZHTG1mZlBIWXREUWp1ck5OWitxanBhWmhBaUpoNk1IQzZ5SmhMcW9seFZyQnBFTXYzRTVhdjc4UGo5MU1iVnhXclZSRlluY0tUQWIrR2FhenA0b3lIUGlhQkdzakZySDhGQ0tJN1ErWDJUZENpeTFoK1VNMXRVSjZoekQ5dXQ0VGlwcDI3MFhDNEltMGpqRXVyZmtYRVIxNHM4dElhdFhqNGhMM25vQzl1MTlSS2w0U0dxMVo3VXhWa1l0NVFqTGFIRzBBVUJtbm4xbTZiNFpaazFvdjRhWHZKVWtycXJHVnBFUXd0dnRITWg3TnpEZHF1Y1VWRzFHNWdvRk9UdWdWaXNud3RuQnRuQTh4Tnd6SXFQSzl3a2ZLMElKVDRQbWlLZkdQdTBpdXRsRkY3dFNQdlFpaWRpYWVuMUpRME5JV1A1Y3N5SXN3bWFxTGxMZytWSGRXaWd3VWVoeVhvWTNTQTZyODBCdXJoQ29DK3AxbVVzTmhsczhRNC9Wa1NVSldVQlgrYzNVbExwb2k0M3Zwa29qSjVKbUdabm5KVEIwaVJ6WXoxMG1abFVZOVBST0xKV2pvaHRyajdpVCtmSEZyRWcwWmRTUkEwVVBJWGdRWTJlTlIvRnlOQTZhaGI0WEdmRVNtYlVDTU5CMU9ZeUFkYlRaMkMxU0pLMzRnSmh6NlVYS1NnRm1oMXZBR2dXd0xnNDVuR0NuUmZlU1N3aEdCS203TDloVjdiRGNWeUJEYlJsTTRCcVJvcWpnZ0ZDZTV1YXJSZU5Dc1FJWE10bmd1emJ1UStWWndpOXdjRVErem8wWmt1MTR3aDZxeUpoVFl2RDROaFNSUjJTc3hmTkFUZ2crc0R6TjhETXBUbUNWQ1V2eTBoc2RhbjNtRGd6UWR0Mmw3UGVsb3NUb0VuUWdCZFdBbzlGT3gxbzFOVUE5RHlQVFkxd1hwZ0JBWEJlUDVRZzVWdFQwYWF3YkZtNWVsWFJMK2VZTTFvR0FQRzV3ajVadEdLUE5pak5GK3dqQjluZU5nZDZEc1VKcXk4V09kaERoODNpU0hOMmRoNVcwSXhMcWFvaHd3R1VFcXQwY3lpRXpvUFNNeXJ5YTRISnVXL29zdmlCZ1c2aGFXazNBb1ZKdlZMWDBGdTRYYm5OQjBobEw2b24rdDBQWDVKdUlpeXFJSjMycDhiZ09oTmNOdWUrRVJwWjB4Mms3cTZKenc1SlhRNnRSUnVjWlFWM0wzZ0hSQXZPMG1JY2FaUThGMnZaSGhzbktHVEhvdDVtcHlGYnptZUJPb1BBWUN6N29yS01peklZc0F4R1FnSzhvbnpMRlN4QjhrQTJXcGJ4VndLMCtkVXRjbktKMEpMRlNFOVVVSjN4NDVEbnRyQWNwSXRIQWxneTdxWUZUZ2huQldvVisvelNBaTJ5TzI2blUxOTZKZlk3QXlidmdHVlE3SGZIcENWRVlhY25GUkV1a3BMU0pBRHZrS3o4ZUlYRElMWWJRcmIwWG9RRFNDQTZGUEw0bmJNdEhXY2dxN2JCRmxFK2NMQURkL1kxOW11WjFIdldPUU5mN3Z1S3o4TVYxMkE1b0pDSXBmK0lBelEwSyswenN2Vm4wZ3ZYazFsS25CSjVwWk8vOWRyWUt4WXlwU2tBdTJ6TzVXZ21CVTBPUUFLUEJsT2NWUkVNRXhMdVNYUmVlUmhFQjFBbmNrODVhSzBmOEZuZHlJR1hDcGlaWEJNTThnNFRvMGRlUW50Nk05a1p0OXNKVjFJRlRWd1hwUzFyYmgwOVhSYmMwSktxZ2FoTFl5LzBBNXh6QktDS2llVlJRcWVlZkROdzFMVmJHdHVwMUJVZVQ1Rm5FRlZ3TXZWSkxsQmI2SGVMNFJYSExqQXVDVWY2aTF5QklUNzlEemNIMWdYYjVGVG5WclN1QTlnaFQ3Z0IyYXBXSjlHNjZJWktxL2hNUG9HUWd2L0lqNEtaa3ZaVkdMNUJTOFM4MjdlN1NhNzRwRmgrOHFmZ2ZlZU0za1RveFNYM0I4SStZQmxTR2t3OFhLQnhSaER4dHptSHNRL0lIMDRpNDdWTkcrR0t5aFhGaW5GekdickVLQkNDTGtRb3YrYUJBem4zSHpSVWtZRlBkRitMWnNwWXRTOFBVRFlVbU1FWjN0SmJ5ZWZ6bUdES0FzWmk5RzF4WEFRb0x6dE5jZlVVdWx5TTJTZUpueVEydXpyRTk2YmpCRlV0Qi9JTUcvaXRGVU5SaGo1K1o2VWlCbU12Sk1VRDlFVzFGN3pHYkJKOElaVStsSGVDUVlqbXdJVGtBRkcyS0pwUXl5Zklmd2FhWUNiblhobTViVE42QXUwbjMwbTkxYXUzdmg3MHpjZnVkN0pORzF0czlwSUVlQ2VNTTIyM1dIdTBpeTBIeE1SSFNnc2NvendvQ1oxUmI1SWYvY2Uwd1lVVVdMa0pnaWYvZDI3UVd3Mys4RWJlZDFwQnJVYlBOZnhURzdGc05oQ2dla29heEdBYk15VmRDdlBLSEZleEkwUUE2NThZWTVFRmlGWVdqaWk0M2tXWlZXVnUxbUFvUm16cFpLNE0yb3hhVEJvYWxXK3BuWUVZaG8yd0xkUW43V1BvMXBXN1o1YWJVMjN2K3JHdzU2eE1XZTRlT01zeXQrbkduM0xYTjgxMXQ2SWRUMk0vK2V1OXRoUjBmSkdyaFhUV1pMM3JQdkxvMllndWhyN1ROL3BGUCtuL1BCZGVIcmxwaytSRmxnbHhuZVpkS2d2dUovbHNsdkpmZ3pOWlNlbXNHVVYreGZ6MlZzdTdxUGlVL0pCNVRZZjk5bTI1SWVkUi9nWERJMm1kVDh0NTNLSDMzRS9RaCs1bE5sbkVNY2JGTkl0S3RIVjNGYlJkbGxIcTJjRi9ZNmRQdGp2SGg2cWF6N0w4Mk41eFFmMmNoNEpuVU5CYWpDQlBaZURtVStMQVg3QzZFbnBnY3Z2eThPRkRtM3JINXA4Sm1PQTJMaURxYk9xTTYveUZqV1hjazR5MHZyVmhtTnRBMk9SL3ByZXdUWFBxSjdvUHlsSlVlTi9PeE5nY3FOdDFHeUxrMTNJL0VnV0dJT0JsbVEyNUt5WU1GOHVTK09OVWdFRExTVktjajZqSlh2Z2VFSzVxZzZjaGdMeEFBYUQwQkVDWWxQckdGUitycUdFOE9mdk9RdkZOUVVDTFFEV1lCVE5yRmtzMlRBRmpHMkRsSHN5REc5U3pmTlNKZFhBQlhqTDJJMnVON3kxaWJQNDNDZ0FEV25oZzVBYUdwTTdUQS9NcWNMbTEzYWV5UDZnYmFETlMrQVk4UlF1QmEwQ29xOFI3YVFQcmVSd09BcWl0S1BKcWpRZ0tEWUp4UzE3WW5uQjB2TkNCNHVsQkoxUFE0bHh2aFhKUkxxQVZBbXMwenZKdnM0eFBhUzc1TkhWTGZReGJIM2tqRm1XOUh5Rlc5VTB6cURtN1VocnpQVFhCVzhkSGZPK0RrUnBXUTZjM2dvTlZxR2t3ZzIwSmNZaEptRlFmQUFUOUIyRDU4c215bkg5ZlJMcjE0YUx4U1lITjJTZjhUSmhOeUkvY0l3Q3lRSE85c0RzTXQwNDdHYTVSU2RaSkhaSFpDeTFxRFRnQTBLZkFHN0lCMGkzbkV5cmllb0xOcUhJRm12Z3haMzUyTXZZVGE2TUN0TlBUaHo1a3c4QkZwUUFWU2xUckNXUDQrdGdwOTVqNE82dWRtaytOUVlLU0tkaEZRQ2FmUXNNVUJVRFBRVjJGdHpaYXFvd0lrMkloR0dCTXV4OFNvam5KdTRZdW8vTTZxdDZpUkJOdVFZVjdXendpMGY5aUo0NkIyajBVam5KY0ZOamxudlQ4NU9sU2NIejhtSTBIdHVOdzBEQ3U5L0VvamN0VElmNi9mc1VDeFJ4TzZLWlVET0I4ZHhoT3BheVUrUURmL0JIbzQzeWNBbG9Ram5EeUxxZFNRVzRYVzFXcVNKZzlpMnN5L2NiVkYveTZxQWFMMm0zNHlyMVlqSHRXN2xHY2sxbDB1aGxUaVdRNGtFRkRCNXlWL0JrSnlDTzJnQVlERmV2NjA0YnhJTHNhSnlSUUU5bm1DZ0dtbzQvYTFXQm92U29vM0FNQjFRVm1oaEp5Qk9tVzc4dWhUT1VJNWtIcDl0NGxjWklYcU9BK093ZjVkSlRBMHNTcmRkcXloLyt3dk1nQUpEQXpVcWFOSGdUTGw1K0JCZHY1MHFpMlphLzlsYk5hU0o2bUE1WkVaWlpHOTNtaE96TkUxRFJzT0lUS3VjZVVTdkJaaHhGZ1V5U2NjZWNrbC9mUS94emJabkh1SWlEYXhZbWdZekY5MUt4TjBnd3lxSDVwQlFzWDJaMzVDVGFIVmtCeUZSTUd2enkzYVZLVGFUb3Y0K3BFTDVadnRFaHp2Y0RjSldDM2krMXRGMk8wRk04aXppNllQeFR1SFBrNkxwOWxoVGhNcE5qb3h3cm9GTEVRUk1SNDNJNUtoN2dVOXc2MzdaQWNBZVFmb3FnNU9uVndkc0d6MWw3RGM0cDlrR2l2K3JhOTE4YklWVmRtd21EZklqZ0htM2diK0VOMUE1WHBocEM3cm9FcDA1OUxzdmdSRVRueFlIRXlianR5UGUrTVFsS1RVeTBFaXR4TVMyQnhSbit3UXJuMVpZek1jOHo0ZzhqeEdBYzlSV3R2UFNDd0lZRnZMeDhFV0JzZnBoRHdpeGowRUJVcWpZM3l5Y2RhRDFyTE9Wa1prS1RiZk5VdTJsN2ZsSlZ0dk4yeE5kWEQ4b0VSNFZITFlzdTRwV29acmFxcWtyUCsyU2VjbzJRZll2U3EvU1dnWmM5UllmNTdla0FtL3hTZUU1MFRYRHd0NWU2RjlCemY5dzRUbC9ZNnpzSGl5L3U3eEFNdmNaUUtqUko3OE9Sc1pISUo4Wm1WWk84d1ZsMnNTSTJnMVRDcUhqM3FPTVMzVmFqWVorWEF5R2c1cXd3dmpDdHRDaWRxM29vbXlKL1ZyTFBUeHJxWU0yZGx1ZjhXUU5BRzZ5ek9GOW5hdm1wVUVzWFFJcDhFVXROYk5BcG1BWldCd1lTTUZ4b1dacG9NOXdLSGxKUmlGZHpQTEk3SmJKWDMwV0NuY1hLRE5FVklmQlNKNUZFUlZTYW8zSmhZc0UydllwOVFOT1NoOWxTS0JGWU5PTEVZRnVway9wcDgwdFpjM1hlSWluWjVhUThMR0VPc3d0OWNOSmFxOVBzc2tKbUQ1TUpPajBTRmUxREhvTjIwOFpCZ01SWWN4NVVuTjVGTVNVek51NXlHUlNUZXdSRVVXRkhFWnd0NVh1aTZNL3JCUGFDM1FTOW9QcjFqd0lTWjFOV2g5TVdUTU1Ec25BRkFyZ29CVEVxU3hYbUkwbHdKY2ZGQmJocEw3SloxMXdxWStNT2tOblBWY3dNQm9naE5YamNhZnVKWWNLQllnYVVpdzZtWTVQdEpSN3RheUNURGJhMDVHcVRWTHZzVFpqbENEa1hMVkU0OXFXVk9qVE5qY3dNTVphU2dwUUsydHBCTER6WWJ3bGo1QWdRdG1DdGpKZGVnMjlSNEc3UFNPb3I3K3dkMlRuQVZiSDFRV3lCdHE1ZzBmVUsxRm1ORFV5UktaYkFWT0dSbk0rWmpYR0ZXVjJJeXNvS0d5dzkxbUJOZHRHdW5LNUFBQWtpcHM1eGRPMThlUWE4czVRbHQyVmMzMDhuU0VYUThmWDArR0NmUjlSb2MxWVBQYmVIZm55MjI3SnBQOVdkVzZLZzhXN2kwV01IaHpVcGhCUHFNTm54UUxMbUJRYXJ5N2RzNEk2WFovY3JFTHBVa0JvUGw5bDRvbXVUQUJYcVh0alN1b0I0S0V6STVNMTRPVTdhd2NRM0pRVkJ6TE1sWVJCRHBMczlvQ0VYdXZUblc0SEJ4eEwvSHo3dFJ6UTBjUUtoaWFHbXR6Kzd6MUNwZFZDY3R0RFdRUllNaXlxVkd4QUJrazFFUkVJSkVESk1RaVBHeE4wTHJCak5oS2tONjd5SlllcTJnTlZYYzQwc2JYSWdKWjdISWZKSEZqYnAxbmlIQzBBSkVEOS9hREVDQUJJYVdvelFLWG1UQUV4bmVLeFhCNTJUVm95eEFxTnpBZUlVaXFRYXN6aEQxdDByenlkaU4rS1ZURnZ1NWdDR1BYQWV3SzJKUnY3QVBvWGRSdDdCSEFlQUJSeHJmYmNuYlgzRTVyVmJzTDRQQVBONHI0SVhuMUpKeEMyRE9ZTmorcEQxVjlLWnFHSVpwdGxRMTgxTHd2UlZrSWd4ZlVWSzhRZW9zUC9ueGhHMXJIMEs2MUFOUE1hd2xkNjFHamk0U1FXM0RxaEtHTUI0ZTVJSjVjMUQzcUFrSjZwTHI5N0VWTStZVkFlNlJXSHZGSFZOUG55TDBrTFhNUkNxNExreFJVaC9rd1dXWEc5WnFqckpTQi9BVzluaXdrOGhFY010Q0sxWS9nU3I1bThYbjBkVDZLVUt5cnJCWm01bW54WGVBeUdYUThSN01LbmFqVm5WVHNRdU0rQUc1SkE1d016c3orQ2N2aHNSRHhrTDZQNHlnT0pTN3JKWVZ0VmtDOGVyOUJNZzlHNFpiNmc2NXJVbjlRSU4vTVhPT2d3K3ZTOFhQNlVFWXdhWHVpS0VPM2RzeFd0Y25jOTUwMVh2MXJrZ3hXWHFwODdwRzFGeTduSHV3Y1JlYWE1bHpXSFIyVzJONjJiZ3ZMTHVKNjdmZEJUZytCVEdSRjMzdC9zZ0RhcUpjZDA3WmpPNHNKZHorNi9XT0tCdjNZMW1TSExaTU1pemhGTG94aEFXZUFzMS8wMkg0ZTcwenpiNytwM2ZPLzZzOEpsdnpwd1JnZTJlNkEvaUdLN3lob3dYWEk1NVZYcno4NlRyM0JKSUtIc24wWEVBNGNrRHNuYS9obzhuRmp6eWd3MkFOTkFVK0N1YUF0RHRHOSs4NDJ5M1Exazg5K2pmcmRTSGZzeitxWDV1dmV5Kzk4ZytYQ0FlOS96ZTBENnZXanRkZHpWQ1BjSTRrNlpTQ0l5a2I4RXZpYTI5L3NzUVpqdGZMY2diU05oQlg1SzNzZCtiRmp2RTZYd2Z2d1pXZDcxNTl0KzlmTkZxT2NPOEI4ZHZZcENXOVB1cXozUDNXZ1VWYUFia2tqaWpBQXROT05kaTNFdHRnZDYxdmF1UmRHSSt1ekxIeTZvdnc2citCb21CcFNYMGVUb3ZOMCtHbWZkNHExT1RxQXY4QzFlemtGRzkzYUtNZUZtNzNkSndtS3dpOWtNNndudUVLT0VZNElsU2NTTGhkeFU2cUtjZlFTSTMrVC91VnZkNk92U0JCRzVOa3JOV0ZmeXJZYnhsY3Bvc3pWWEZFSGhhWWE4Tng1RzlTU3hkZGpDNWRrTHRXLzVYTDI5TGN1OElMUW9Vc21pYTVCem5GVklqcnlqTXFNM0wxNkJuVTJSeU5VQmY0RThod1NwUjNycW1OQ2hqNDZJYWhmbnlxWGNlazlzeElmb2szK2prRmcxb2JSaHBwdlNGVW53RVNjalFvMk9EUmVEK2tTY0tKcHhDeU10cFlKWFBnUkJlamk1RTdYT01tY0Jmc0FZc1Y4bjZDZ0ZPVGdxM0o5YmVoOXd3Y1h6cHlhcnJCZzBTazBTa0x4ZDJQZkRiRXoyQi9PdFJ2U3dyZWJwS0YzdUNmYmUxZXoxSTJucFVVdk5Nc0Nibk9PLzZmNUEyYXFDdTE3TEJRaE8zMzJWWmhRdlhpTERaZWw1QXJSdytnVHVhM05BdzZOb09ZaGhSc05TL0VsbEU3T0xzOGNxYkdHZ3NoRUxQb2xBVng3eE9mRGZFWEMvYXR4QzdJM1VOTXBhS1BDRXQ0R1hueldvY1JBL1JsYUtWeHhkUk9ZQ3Q3bVJKMUNHTXpadEVlWlBsUlhHMWFSeDlSZGpyNGE4dVlvdkwyTGh3ay9yNmo5MlAva09qMHcvNTg3OWhQUjN5dis0Y2NUby95ZERaMWo3MWdxMDNNMk5tQ2phSWxqNkRRWVlnYW1nb2YvVjUwZXh0MXUxbXFHWDZMRmF3QzBhdllXR04xVGVRWHVmdE4vVE0wWVVaQkhGcUFBbUpPbGNBblk2a3JCUnJWOGRwR0pyWG5tT1RuZUdPSVNUQ29wV0cwTGJNM25JSWNvbnJQK1BMS2pDeC9MbUtpREhMSEtocW5rdFltdW5jbGxLRkZtc3dwZDhIZndNSmdLYitlZ2E3QTVtaHh4N3gzQ2l1emRLVS9lemJlRDJrVXMzQlphWWxadlN6VlhMcDk4VlBQZHFSbnU2MVArbU13Z1NObmxMNXowb1ZDcHZONU9mU1NyYzFmNFBERHVSZnNUbHdxNDJ3cmdtd2tTK3hqVzRKVDF3OHhFWHhNWld0Y3NZUE52T1NremJERXZoK3dreWRiOTlBV2YzRks5cE9iSnZlZHNjNlB5V09vdkF2SUJaRCtPSkZXbnkyaU5YYVNtSGFXYURCWHlTN1hkZTJtRnNuR2ZEQ281TWJsVmw5cXlUQkhuRmJBVWhvOGU3VDh3UUJXRG8wa0Z1bnlGNk16a0gzQ2M5SHdreS9FSDE5emV2dUQrUWpid3ZOS2k2VVM0SkNOMEY5ZE50Qmw0L3o3NUR6SVlyUWFlRkpTdHA3MkhBeWRYOTN6SVFyc2o3MzNnMmJaV3Z3eFhMVHhKdGpla1o0YlBqYy9mSzcrM1BYWnAvckhieXNmSDMxOFl2Sng3Mk5FTzBpMzc4Y0lPRUVNZXBSWUxoMkxFSEhDTmJqR1ZkMngyOUN1ZCtYbms3V2RhbG1kV0ZGd0JzdU9UZGRMMDU4UStyU0xkTjZRU0NHY1gxWld1Sm5UYmV1eWlHMTUrYVNGNFpvbjZYQy9NOTZjRFpPMkN4K0FOUTJiSjdIMnI4Q2o2cmdOam1tUDhlcUhOdTVGSkkzY2dTeUN3dktjVmhiRFdXNGg4VGxJUmpwZEhrSUFzZHhYZDJmMlhMa3ViTVY0ZkxuYi9KWDlvQU1HbzMxeXdVanh4RGJ3OEY3dkoxUkwrOUdrV240Z2tEQlZZcktzK0s4RGlIR2o4UmdTNmZXb2JLL1I5MWRCN0IzMzFxK1Y1UmJWNE5MRlBQcThwSlo1ZHFMeWRuekQ5T0IyVG85L0hpMmlPcnV1djdodTdiT3plUXozMzFTZUpTREpnaC9OZjBHdURLcjJJSjM0cHF2L0graEt0ZGVvMGd3QzAyV2VQU2FwRWszNTRUMkNla2llQjZIcTJXOGFhbjgvTlJManB2NXBlL3QvTVpnTmdyNGU4K2p3aWZNZzY5TDUydVFSMkZ4V1hmNjAwb3V6MDMyQUIvcXNyejk5RCtUaHRGejhkRkw4ZE02SlNWMDNERzBLdENpTXBZZFhCMXNNSm12VHVkcUVFZWhzWnAxZ1JvV3lNblpyQ0VCZjlkSEN6UE50N2w1K0s1TG5FN0xuSjBDNWpMUDF3MXZjdzdFZ2dkRzNmaXJMR0svZ05rVVRDN0ZVdnFCMkNONGp4cmQ1Y1ZsME5KZkNKVFdqYUtpSUJvYmZRcEJDM0o5RVVXZVRrelFWMUd3bmM2NXJnU1pmSnAxN1h3aWZ4YWJaRVgxYW4xbnBsUHkyYUxxZ0pqWFZJUEMzSzJ5Sy9YY3BGbmdXU0VDd0dUZ2lkWXJSZk5WMzNhUEthRDlDOVB3VVZEYU5aL2JJUSt4TFp1cTR5NUxQd1dxSGxQSmhMTGt4Unl4YzJSTzNkMkR5dk4rSDBrS1R3d241Q0ZLc3pQYXZtOEJNWkc1T3NWWmpYMGxjc2g4aHdrQWdSb2RYOXVnNUE0SllQTWtURzBHYUw2Qzk5NjNOcldYeDdlVllGazRINTBjMG5COEpLT2crbytDOTI2SHd2OG5jYUcwN1J3YUhqRHd1NjA1Q3EwaE8rTUNoOENEN0ZEbytYMVJIY3lrNTdweFgyTDFNZHE0QXhneFJCRDUxaC9xUjcyNTY3UjFTZ2FuaG5wNEtvR1Y0WG9MOG00d1FVL3loWWNmKy9VMnZkZXNpR0RNaEJGVnBYVFYvZTNEbHd3VFRVMmx1TjIwZEhoamZIUXNwSmJxR2VWa1pvQzBJTDNDQUZQT1hOOWdzM1BQWW90ZGxzOEp3WDRUYzhncTlEUDl4Z3FuRThZRnpvUkZtTk9NSEpIa2JySW9yTjRQNmhSRnZMMFplbmRFK0s1eGNtUWJqdzlaUTIxYlpCZjk0emRpUFpQM3BOZkE2N09GcStNTTIyRUJyZ3VYazVOdDh6cHhLUXpzOVhmMTE2bGpwVUVmK2xHOHBMVW5QcXVpUjljM0JBa0RhV1R5alR4WnFLenRXY09NTGFQK1hZWjhaUXo3emd2VjdrV2tlN1E2cHV2RjBZcE5RTGw0NktHenNSSXZnMkVRVVBaS3RvSmNuMXRrUjl3NWxJUXBsK1lHWkFKZUZyOXQwZjIzNG1aSmo4RWUybHEzaVhsS2FnV3BxK083ODZkL0ZrNUpOLzh3QWZHOXBYd0N2N0MxS2YwZnhhYWlrQWphaVlacVQvQTdlZmJTU3FMSlhlRWFNMEwzbVlmNHBzeTc2czRMaTdTNUlUSkM1N0NkSlB2NFg4MjRDcUtuNzhjT1dZVklYWkRtOHA2VWNqdUVOTU9XVE1Pa2plTy85eUVBd0k4bFFnYU5uVnZ2djlRczd2ZjAxTWVMdGNZZVliYU5pcTJaZzY5aklWa1BmbGhlTzRBczdIVFJnaFROSDI3ajZaNFV5TjVHQ0FCL2loemIzaUl0WnJ3cUtYMDJwWGhYQVhra3JmcmZCT2V2c2xYUmxDRE04TzVLRDVMQnlLMjJWcUNZZExMYU44aTFELzliVThGWlR6OWJwa2EyYUkxc1JWd2dvancxYk5yQU1iaG5BQ09WZWlFeTBIeUV1Rlg2UVl2L0JCNFFUMUZkNWtnYmxxL3pmRnV1b1Y5YXlWOUxLbjZPWWtiUkhOdytYcWVabWMrb3NUWDhCTjhJOEd6LzVwY3E2cGlCczNsd0p1YnJxY2QyQzdWUEtpc2wwSGo5WUhqMXd5SktHMDB0Q2NoOWREOUFJalFlOXdTVVhaUUdVSEcwdldYWG9XYkd6YU1wRnBDL090WlBTSW1xQnpERDZYRWltTlQ2WXpmVERsenRObGprUkNyMUpEQi84YVdad2E4TGgvM3dmN3d2Tml2Ri92d2Mzd2lDTkgvK2lPMVNkSDM3Q29zVGo2ckw3ZFRPMlh4a25KaFBnT0g2d01uYmdtQ2tMcFN1RGN4NitmK3JSVFc4eVh2dHdlT2hzNmhYaC9FRnZlQysvUnY1VjUyZkZqcUpqalRkRzBPY1I0eS9QQ3FkeHBSTSszNXZJOENOdVpXOWVrc2ZHa0JQZzh0OFBvOXFTRHI5SmpUUVpiY1R1bVhFVlpqWG1HYTJEK255WlRIc3BzZFV1Mi9vb29oWkRyTXh0V2EyYXUrWFpkWkY2QktFbFpsUnhGWFVpZWQ0V21oR1RybWZGbjhiSkRqMW4xY0k5dExGRXZpd2xVMXVSQ1E5NFYzbjVpZ3NzT3A0Z3d0bVdVVEgxUWlsL3dWaXFkVE9uMnpSbWtqdEVGZG56a3lWUGtqdUJLdXNhMkU4QnZzTlpDU1dXYWt0TUJoOGtpRE8yMHpsdWFFYS9kVUZoWmZ4aFlSUWxMVThWMncvUHRHWFpUd1FYQ0Zoa0VVTXo1TlVqSnJUQk9LeHNOSXVTZzI5QlphRWlHejZ1OVUrM2VrQlZJU0RhT0x3QUYwK3BWTk5nVlFlcXkyZGNBc25wMFVTaGg5aVFTMDdTcU1QamozYUdzN1F5cDc3MXlDZkVEaWV0UTMxa2d2KzVGTTdrSVVvTTMzNHBkdG84YWVrU3MzR0VlK0JlTGc4SmdiVnkzcGtYUHowbDhnMERUNkZmZ1hncHM3bGJzQWYrMjZGaFcxSVk2WTNVdmkzTGVVc25EWG1mLzViNVQrOG1vNmdqUlJXWms1L2U2Y3loeDhJOG1odUdDdjRudTZCYzlaV0QxWndlam1nU1hBQjAzVm15OU41bFdhdk01SURzLzRKS0lzdWJvZVRVWnRHaVBpdmZSemJXUlFCN2hhYkhabWhDaFVpWEdQQTMxaXppQ2xadHpUNDBaVlpnaWVMUmRqL2JFSWVKYUhwSkhNMTk0U3ZEWFhNM2hHTW8vaHpZN0xDbnJXMVhWVnhLT3FnYXVqTE8vMjVzZ3hlMzh2b1hlZElsSmlNOE52NURjeTFzZVVqdzNXeG56QnY1SjlNblAxUTIyTVhoSXpUbWJLZStncElqNUxPK3Q1VHEyQVdwa2dUaEVIeUN3di9UTTUxNjgxVDlsTlArdDBvVjBTdHlUUlpZalBVSkR2OGs4RDlGQkM5MUJIejBpeldCN3hueVFtbkhjSTdBK1N0TVVGUzR6dUVJWXZESlRJSDNXNFFGWmR0QUxoLzBPenFzL21kR281KzMyUktjbFk0dENtLzBtT1FXRUxwSTd0bDF2cWpJNlZ2c0ZHSmVYRDM4cUxDTWNjUTMzcDFvVHlQSVZGR0VOQ1ZLRXFaQ1lUemNxMEJabGFpQ3NGeFVmQ1F1NFhweXJCMmhGTnJ2Nkp6MkRWRUE5ellOamtWajRxTmlXU1dwdm02SlEzdDYzbWNUR3A4WHhNK1ZsL3VHMTVsU1RsY0ltTjc2UnZyRlVldXppdHVwSjZQZUFaOW5yTGJzOVREVlZDVi9jWjJ6SmxjUjJBWFRsYnBMOUJjQlA4dWtFVjI1NmJqWXZFQ3Y5TTd2K29PWjFYTkt4cTBoamQ4djFPL1Z0OGFtOW5obHJHcGZlbnlQZEphQkM5UzUyR2NScGFyRGVJd1NKUW1sTkE3V09lUENFYkFKTjdCeDlvU1MwT08za1FxL0lmT2czcTVCOFdrNDBZREhkSnFYMkVJM1haaDVvVnNSZm90L3BxSHJlR1p1dWdxWnpLNS9nSFlMUUFPVUdZekt1RUhvVVZKSHdVZ1JnUjN1UjhvMWtndmtBditZZEhVYVQ1MHlEaitWSjhOMDBPRjQ1KzZVNWpRTkJGdlFrSXRlcmlnTGVNSzYxRHh5bXFYaDFjZjlQOUFVaXdFQzdWNUlINDlhUGVoUy83YlltZVpRLy9OUzlOMGxHOG9VK3ZKN2RlWEpxc2U5NTEzZG5hQytGK0tIZXNDWm5NTFR6YkxnMi95OXppUG5XTHJGbkpMendMdFh6VW1zckVqTWpoYTZNL3FHUWRsbVZlazdxZUNGdEFxditmZUxvQXRZRFdSaE4wV0xPNWNHbThlcElRc2ZGRU1Yc1dyb2dpMzd5N1BtdkdLeHVGQWh0MlJScFJSVWRBcldTMGtkZnBxeXVjeVNuZnZkMVp5TFhyRW9yZG1DU1pGU3Q0R0IxeHpXQUhIeHRsaFVHUlY1K09EazN4Qjg2emhQOXlzMEZSVkxDcFNJcVFOVXpSdWloODFUY21LUlhHcHBPN3E1Um14NXYwNExoZkFiSmJIcXd6Z01Pb01XbFJWRmlDU2NEVVNua1VMbWxYdENBV0xYZnh0R09TTkNOSDZhVUh3T3kzWGZqd2hzOWpLanVyTDg5dzhSbTlkSElTdzRGOGwyRTV5Nm5hSEFGVDhRQ2swaUF6TDlXRDdNYi9IM1RQWjNKdE9IOVcwcTVuT2NNcjM0SWRNWlZGZnJXZVZtMGZ5RXg0Unc0V3hrQlZxVXUzN1pWeDFhV1p6and2Sy9jSWhrSFkrc2ZXNll0OEV4N1NibjJkWTdCeEU4d2sxQlBNOE9uTVJlNS84QjJjU3RUTUd1VkVIM0N0bC91L3E5NmtISWJadDBoYndQbjVOZGs1aFJMUXkwWmM5SFAwV0dPNFZNenZybTI4N3ZiWHh0WWYwZVkyTDNsNXd2eC82ZWNoSStQT20vcyt5M0U0a1lqa2hHalU5ZDRISG5TclhacDJlcXYwMFpWeHhwejUveUxjOUtOckFyKzhYOXg1RFBRVld6eE94ZWdDVE1YcjR4c0RZQnJwK01lVzJNZVcwRnFiZXNqZ0czTzZSVWplTklUVGx5OGRLN2hVMGRHQkVjbDRUS2pvd1BKeFo0VXhQcWJFbFYwMmpYSWtXZU53L0UzaUZPN2VmeVZqVlRMWTlxazdOT0dCTFpHOG9HMjR3QlBYcml3NTVncGhVQlA2bFBwTTVtQkdiMXlodjZLd2FYMGlJYzMzUCtWWjNtOEd2QzdXS1hQNkk2SWZlc1hwWEwydFBvZ2pZVzJWaXJDL3VVZjZGNWNJa3V6aXlOSmZPWmg2SWRkUjFGRDZieThaVVpPZFhvNDhnenVaVTUycHlJd3JDZktKVEVleDFEcnFpUDVIUjBqOENHUnZ2R1AvTWFqeXQ1dzRNUDhUdTZZVW5TYnlZZ2RlUFNaeGhZL3pTSkNZTFVPVW0rZ1J4N3d4dkJMa2VydEZDOGVBWmZXVU9kOVRtYnUzMzJ6aGxma2xsbGU4ZEU4TmI4RmphS0xyTjdUYkx5cmQzTnF1MVBQZEMxSjd3czI1L3B2a1pHa243REZFRGFwanR6a0NrRVRZeWdNTFVkUHA4eldETlRoVVJiUFM1OEZQdGRWU3lzLzFnNjdkdS9nNlJHa2VoZ1dPRi9JM3V6dm5XZDRwMDlWNXRsRUMwdlYveis0dk83S1JqelZqbklqM0draWx3OERaeDZ2T2NPRFpqbHJJWjZRZlVsckp3VVVjKzNicFRoeVRVSWo2bjhTSGJ0SlNZeHNka0dlazNXK3cvSEh5NFNiNUhWc1lQTEIrOS84Y2lRdmxIaEROK3Z6cXJtaUZFVnFDWDdWdUpDcVJYUTZpREFFenB6cHN3Q2ZzL0h0bWlvM3ZidzBIOCtPVk5YeHRFSG1TY2ZYeVp5Q2J3VDdZdnh4bEpyUCtzRElyZ3UrSUxFUisyakVkZ3lKdzN1UW5sekhNd1ZFL0RoVWYrM2x2M2V1dWcxdko5ZFhmSTJ1UFZ3NHFGL2dtUHIweW5QaHFQKzV4Yjh6OW1BRzJ3RzU0R09kL3hoRllIdmlWQVZxTUFmbmRnSUNtTDBsN0dES3djZnJxNmpEeCtPUC9UODBuWjRWK2pWRDFCWldWc2RCSHZXQmwrUW90UW96N1NtK3F5NnRjR3RxY0dKZm02bHRYU2F6OTdvSlBaYUtYZUZINzV0b05jTVMzN3lpTnpYNVZGNDAyZzd2emRXYWdXUG8rMHA5WUFmWWFNa0p5MWlpY0FzV0dLaEFmL0Qrcm0ydzd2THBhOHhHT1V5NEdtamU4YjBSSlVuVG40Q3J6TlFabjNPQ211WUczTjVPdDhNczZMMnpqVW5OcUxCUVNkK1N1OE96cmxuV0tEcTM4NnE2MCs5b2l2enY1NjVYdEU5SkRvVjdaMzZ4ZSs0SExEMm1GU0kwcklicXI5K1Z1dU5PWFM5Nk1HUzdabmR2MjFiZHBmdEY0Z1o0azllWXcvNVU5dGpwS3BFWTduQ1Q5ditvdmNsekxLWlhWSGYvYldITmc4NDhVTnprOG4rVElaNzA5Yzd4aS81cmVrR0NETnVjRWpvbHBTemhPbHBrSjZQLzJsb2dIdDVycWpjRFhreGlCUzhKMm1PZjExK2RVRmJ3cWtqWjV4b2x3Wjl5THZZY1NJblFma1VGWWkxKzJkNmoyTG5CTXFLckRoQzJrRHRDc2pnM09UQVNBR2JNQkZ3VThkRGpBY2xsQ2VtVkNCQWZUbU84VlhiWXNuVmthTEFBOVptUzhmWlRFMjR6RDRIMlhXRDVoak9xa2NMeXVJSElNZHB2SVRPY2lvRDh1c3poOEFPcGlCa1ZkRFZSYzlWdHJVMVNUQ1hhK1k0TVlTM3dKRHJWenZ1bnN1NC9qTTJvS0FqZW82ZUhJQ09DRTlQRFNsMjFjVGc0VXFmaWJxc3VuVW5NV0lDUHZvRU5qcmhVTms1VitycXpqOVNrNlhNemNxaVEzcFUvSmxlYTV3YmhVQ2h4RlFrS0NyWnA4QlZpaitNUnpiNnJMRWVCQXlkRXFPT1UxYnhkeUhONG1kNjhCZFdKL2d1OEhDeG9vM0lxZFMzSGRKWTFaYXArMG1jaHE3ZUhuOWJXZyt6VzBseFFoSGdrUE54SlcvQ1AxNUl2ejlVVEY3R3gxcGhIUzZZVWEzaHBMenRRQ0ltK2JSL09sbnl2WHNVcHA1V0ozN1U5RzNUZWQ4V0M0dXRremNUTGlUc0JwLzd0SGk5M0JXeHIyZm9zeTZleVQ5ejhlbmhsNkNWOVdPWnh5NWRnN3g5Zkw3TUVrRkYxdElOajUyMFhoT3c4VS9oNDBjZFdPME5UbXl2azA1aXhHS1pFeXk1b2laYitWanJMZ1JnckhCeWVVK0dnR1ZJd2RVSUFtMnphOHVkRXFEOTdyRCs2Q29maFRYV2pVeWkwYWdMNHA0blBodVNMNHpBWDBOTEtVN0lJRGprUExma2pXK3VpWHY1cVFZZUdYWTFzVUkxakNFWnVCQlZiYVhuY2psRUozSWg4NmlGeXQzZ0l0L1I5MWVkMkY0cmFoRHllMzIyL2hndXd5RWQxZnFUZFNyenJLcUtiMGhKcXhZRTJCWWVqLzF2T2Q1bUFVaUEwN054NUt4cFZ2TjEzdzAzbFVWZDcxTmxsakJzQXkraklaQmdnNDF0VEEwc0cwYVQ2d1JnZGw1VjJMSTJMRTdvUWhWUXhlU2NabUwyYTRNdjF1UEsxYTEzZUJhYjVwRHAzZmlIMVZVS2haL29GV05XRmZsSHcxQjNaNUFkODFpYzNWSXl2TWM2M1oyRXpjb3dUZk91U25MOXFsd3AySWExZWxSZm5mSERlUjd0cjVZNlBobDZrRnlwR2tBVDZ3U2VPU0lOY2xXRHBCUzdrcm5VZk5XNTRFTGZzVnZ3MkVHWDFXKzdkZit1SUN6UU5DSkFHWlRJd1FSN3NHampyejN3U04vTUNEZmZpYjQvTG0yK3pHM3RPcy9NbTVBcU9SczNhdms0TTExd1BPempteDhzTit6RjV2bE41ZnBjaW9LZXdXVTlCSWZPc1hGVnBMUUV0aUtZWExDQkhXMHB1K2k3QzlKdmlmTE9OYm5aK3VMTnBRRnhEQ3pLUFZzNC9Ob0Rpd3pBUnlJN0JyKzQwOUU2c0ZqYm1FWHFPcXI0TGVta253a0YxRm8zMHB3MUVFNUNEbEI4anZzakRlQ2FoMEh0RWw0U0t6M2p1dnFMaHZlWkdtcFp1L1B1VVA3emNiby92WXEvZWRzZ3h0aHhuZy9aaUpNUmVqT1N6SGxrbGZaUkEvL1drOVZjMXhvNVpyNkVQMFdHaVRRd252VitodE9lVFN5OHc0OWlScEFDZjMzR3dyWGpEd1JlZlVOdGNvK1pudEI1WWhRbjBuVlZsQ21mVTBJOVkzbWViMENLZ2VnNndZb2kvNXFhdkhiNTJrZHZuVnc0OUxCTi91VkVTL3gzcW5lT2QzNUVSbXIrUk1zZ2k5TWR1Y2hVb2paU21KZmFpbGpJSHpseXJEb0VCd3pLKzNESnZwaTRXR3B0YlgzdGwrKzVObE9DZ2xOSEZQNVhHZXYxemVza1pLU0o0V1hOdXBQWXF3RWl3dnhNK0pmd0hWd1EyaVRiSFJkcEExN0ZqY2FXUUZOeW94bnR3WHBQYXZMbHRDZXBueVU5OE1pOTZpU0duL25kQ1p5dnY2N2ZzRE83OEt6RkZTTUlKb2d6MWtPYVF4b1pCM210dFRnZStOejhrWGRkUVZHWllWZ0pidEcvS3F5RGZWM1pPbzNSWWVxYzdHdzF4dFZuRnZDYi96TmFJTkVuUXRudXVmYmhnL3VTcW9mZUs1cUE4WUZOVm45TmFpc2RieTAxT3IxTENuMjY1bVJTNTNuNU41ekVZL3Q0VndreWxhOW5NRTlCZTNJdnVjdCtYTEpmSUM3azNYUVQzVnl5WjhWQzJ4a0g2cnFqeWJDWXVkcVhocTNCVFVMUER0dHI5elVJL29uK3VuNWQrbVBGYTkvMnl0N0paNVp3YkUycDgxTGVQaGwyTGFGQ2NTU1ZYSmNEVVJScWZWY3F2U2tpMXdnZkhNMGJLOThMTHZRWi84QkIvOWU3bmwyRCtFeXZzaHhHTGR1VDREbzNySFVhZlZ0ZXhUSWtwZXVGZ2Jhc3FYaTc1V1N2YVd1Y0J4NmZTYVBQY2RwdStteTR5QmZ0VzRsaldYb0U2WlRoZWMyNnpiRGNQdDNUNEtGMDVUYWFoM3p0MEFUVTJsbUgyK1k1bDdscTVtM082R1pCN0owZkQ0MmN0UXFzUEd2bTVBcmYvczBKbVhCSmY3VjZwTjBBeXZZNTZvQTJSL3k2Mm1qTlhMR1V3WlljcVkwMXcvYXRoSWRXVjhyTnZhNlVmMityMlp2L3d0d2JDTFMxQlFKZmcwWjJCZHpKdklyY3pZLzAzTlMvZGRnUTM3MnRWN3VHajJLNC90Tk0xTTNva1kxditqVC9MVStSUGJwZlhGeDdudDh4VnJTSkcyb3QyMGZXMUYyM0NoOW5wMmtKc1JGY2VSUllEdnFyc0FibklPZWRqelpsOVFabit2YVQxeEFzcWQwUzVaNXJhcVA4NFN5dDZYcnNoNnJkR3gvOGdXeE9ISVVJdG4xNkRKV0NoUHZCZU4vWllHMVlJd1JiT2g2Zm14ZW9TNnVkSytzZEE3ZVlmb3VCajd0RDJ6My9PV3YyOWNhMktHTnRzUFVwMmZ2OGkvSkozLzJqM29YK0JqQkpQSlJhb0Fycno1WXdHc2FTcEZTUGl1Zi93THg2UC9QUS8yMHR0bHpPTFZwclZKUGU3UisremVDQUNhenZlZHNHdW1FeitsMnJRM0huYWdYSXFiR2FWajBlMGY0QVRBT3ZoQnd0czNDeXRTMW9RMHgvMnlNN0I0V3UzQzJHdGk1RzJTT1RoVWRTVVk2c1ZGbHVPUEs1VXV1MStrYXVRVDI3dnF5RXRQSkd3S0xQSkFNcG9jNHdQU2NjVVZqMW11eVkxUDB6ZVdjdWZYejRGV2g1YzBnYzVUcmt3dHhnQ3NxSmxWYXZ4YnNFOHBhTDE3akx0MklpNWQrSjdlRGpZRUJ5dXY2MUlDakxyOTlFSi85OGRMZFNlZS9kLzhBR3E2OWVyeEtiR0FFNWVpRElYZFYxTkg5a29UdlliVlhFWXIrWlE0K2NxQXpZYmo2WnllckpiWm9vaDZaZmRORjE1bmxscFRIWGVGVWxjelQrc2NyNW8xOTQ2TjZaYkZhY3RLK01Jd3BkYUZ3MkkwZFY3cTZTL3JnbWVlVlJLVExPOFIrUDhDdlRjY285UEw2bC9ZQ2tuSzVQRGMvTmkvTHVCL1hNWHR6UmhuN0szMjhlWE1vV1o1WEZrWGxZb05DVzdTZ2NwaW9YSFh6VWVRWlBWbllSVjZscWhyWmpVK1p4NllFZlhqcS8xVGJWNUtJNkZJR3VWbzJnZmJyQ0MwS0VUSm82dVFkNWpLV1ExWlhPaTJicjBUUElQOUQrbFJxY1B1dFNjaFRON0ZKNWNMSzg4WEg1elZFVk42RmQxK1c3eWVwT3Rjd2dWdVNkeGpLaTAvVVMzRU44dDlaSTV3Mko1SUw1UldXWnUyVXpSTkZTQWZiMmdSWFFjd1ZLWlJXa3VmRHVxdVFWdEVNK2Y0TGtHMS91VXRLWG1sSEZnWWE2Q1VSbzhTU2twNHpTaUtReHlXbE1laTZ4MVpjRWoycmdCQ3dIOE1TakNka1ZMRktpV3AzSmNyYmkyUWxsUEJBQ2dxZlR1YkxTWnM5V2JOb2lMdDJ6VzdLK2tPMGJhVktiYmRnaWMzVjlFR2xuMmNnUDBLNDdpclBwcWw2bFNDY3BJdFREdERHTDZmb2k3S2VrN3BwRkJudW9vQ3h2YmxsYzZtN090RkVURXpVVWhDMUo1SDl1dVFLRVlPcG91cU9SMzlYT1FCbEY2S0lweng0VnBRbEpaNUxUV1BRY1VndGRLbnREeVFpcStHY0VaTUd4SzFTeWZlMnBKQ2Y2bE1vTW9RdjZKSDRrTmhlYW1wL0E3QXN4ZUlzeS84NTBKTm5CdGZOMnpHL3RzSWNvRUJxTExWQXFxNkZOaFhlTnN1K2hIWXJGZVlxNllCVERiaXRHV2pNY3MyMUFhS0VyTFdvMzlrcjh4ZGhUWUdKWXMzeC9YQXBEMDEySytqQ1V4bnk0VllaT2k3b3o0czVSWnZFdUoyMkVORFBleldtdHhYTEI1ODRNM3JjQVJXV0dZNlhZSmYrcXNFN09kV1h6VkpvV1crdVVNbUFzazdnekdVeE9hV0VqdEEyWGFpUnkzZFhDNVFXaE4rTW5sOEl4REtldDJOdWFOSGY0ci9HbERScWYxS3JkVjI1NWg5QVFHb2N0VUtxcVBadnk3eTdUdXdibDRna0tpakRvSXU2blpnbnI5Q2xIQm1qWm96bUxmdjhQdjExVzZjRmlNTm1saFUxZXJlalVGUkxYWFoyelBDOUVuUVQ5QS9Gem5pSzZkMzEvYWZXWDNMNldxNkhjQVBRd0JiVVlxVmFjSTQvMmxGeEtlTm14dC9iaXlzRHBVdWtkeUlqYWF4VHBydmZvNWIwWTN2Z3NINHdFOVY5VHlxLzNsc1hja3ArY3JyK0ZyeTlkQ2NBSHBMVU1kWWJrNTQzSHFjV1ViajlqYmtmZnhzaHg0eVowRUEzcmZ1NlM1N2ZWLy9TK0JId0hWRGlCNGJZVkk0R0VJWnN6SlJQdzBZL2hvMGR0elJwTHJkRVFHcHN0VkpaVVE1c0s3aTZJR1F3OFNTQkU1RWtoRHBIR0tzQkowSDRQV0grc05yU3MzWjNKWWl6ZUNHdDdYQk81enV5azdqeFIzMkhQdzZDamx3dUZTMUpkNGVaNWViT3RwUlJaUFZWV2hKOXNrSy9FRnZHNjRlcmtZRzRWTnFZL3BTQzF4RHNiSHliRktkdGJwOC9DdXM0V0hFZnF5T2hxVHNWZzUxRDVUZ3pkWit6WEtwOGhkM2o4RjUySXFXOTcrUStobnF0M2lzQWRwNTFHdlRvaFJaaFhHWC9ndjRJTHRhT1MxdjBNQ0tVbFgweTlsL3drNFM0NDl3T25Oc1IwV3BnVEswMmVFdzQ1MVlHWWV0MnJYNEpDVjU5cElCMWJkbWJ2M0duMTRKWm9Va05KODdTR00xeVh0c05MVTZuZWpxeFVlVzQ0SW5uUGx4dmpMRGNyUmtUaDBkUVk5d0tTSmkyNE1oVWZKeXROc0NWNzRXdUh1K3ZodFgyN094RTBoSTUxWktZWDVBWFlRa2ErOTEza1J5ZVVMaUxkeFpmVHhYQVAyL2tDd3NDL1BaWnlTcWtWQ3BmdG44UGxDWkszUFE2a3ZGeUplSVIvN0lFRUhUelJ3U3ZWcEFRTU9pbHdHZW41UGNFMTJ3bThzV09QTkg5Q1VvVTJPRHBHV3BEZHZMeC9ENDVEWStJam8xaFN0SDJvK1hEQUpqeitYOXdadzVzdzd5SXE4VCtjeWVrYVovdW9lMSs3VjluRUZ6b0xvRE10Slloa3ZwckRjd2lHMTNpYUEzME9oMEN3OXFXc0d2OTJNQ21WT0p0YUFvWURnREt5WVEvaVMySUFmdkpmVVhaWmw1QklBd0N5UUV6THF5c1IyN1FiUGRobjJvOHg3UGdpemZteTlLQnAzNGZNaFpQMGdHT0tXQ1pHck5OUjFZMDBaK3hKWFpQdU5iTThZaHU0WGxrMVdJMll4R0FwVnFpcjFpMSthSnBXUDcyaFN3WmVQS1RPREpNalFQV0x1bUY4T1RKUzlVUkhqZWxJb3Buak5UWjFaUFZnZ0hCNjZpREJ5QTZORFk5amh3UHlSYmt4elI5bUkzV3JpRVdNL3gzYlMvRmY5M0xSQ0hpeEcydUlmeGVNU0p6NGRkZTdzUGJ5bDZLTHltUW11NUJ1TUVLeFIxMTFDamVtYWFHT0dScytkRmlrMUErN29jNFRQNVlJMUtlL2lVQmprZTRpTGZKR0xVU3pnZi9Ed1lOSVp4dzB3cndOMWp2c29LZlhpSThtbExRLy81eHZYc1NGdi8zc2U4TUp0VVB2V3BkU3REUDdBT3JlTVVnaEFCL1VTTWJXZ3BidTEvc1VyMldMSVhPNU9YOGZudzhQdWdIMEhiVXkvMStiN3NpNktWdFRwbk1ZODhvK24wcXhzcGwvQjREL0xpdFBwS2E5MmdXT2w0ZVNObWRPdGY4WmRmUHorYklmdDMwSjlXbCtScU5JY3dYQnRCTUdwaW0zN3N5ZVJQOVlPNFpuRTVGelVuN2Fxb2hSc2dkb1Fxb0FRSEdhWm1pTENNYkkrZitXSUhMNGlLNGhLWGkzVVd2Nk5oV2RlU1hLRFJBWW1qMG1xV3FtTFl2blQwYkU2djNkdmMwbDdLTjRJK2VVTmJCZHVFMkVWbXV0ekw0OWs5YUM3RndpMm5CZzZ1N2d3VkowSS9rZFFPMkN1Yk1BZkVodnFUNlRlSU9GdDJJdWFHMk5GYU1YK0VxN2tDelhqUll0T0dvRDFOVkdoQ3JHbUJTZzZSb3l0RU8vM3Z0SW9FTUU0dHJ1V0c4NnFibFdKVjluODQ0TTRCL09CUEltUTh1ZEZtSnRvZktPVldFd0UwNnBRWnFrWkJEWUFHcmI0d1FHY0NIQ0VDU3NSL3FKdnN1bUEwcUlKQ2lGVkQwSFU2LzFSdzNDTUUxTE51NldVbkMxd3dUSEtEM2REZElRVm9rYm9CRUVzQWRTQmRnVldVY0dONldoMmRlU2xpQ01Jb3piZ1ByUHdGL0ExSTlwN2dwTUtodEIrMWErYjlDNzlGN2ZseThWNHlIRGZxM3RKRWh3ZnM0YnFNVnVHcDFFVzV1eE0rQUN6TmJ3M2VuMFZwcUt4Z0Y5K0ZDWUhKcjZ3MWNmWmEvclRwd3dTWWkydkgyQnlnKzBEYWtpYXQ4MHU1UWZSbnlyLzEzcis2ak10Ym1IOSttZDBXSFgxSHF4WWt3N2o1ZzJFc3BQZGp5Q1BNRDRNNHE2VG9zQ1RMR0ptb2MrSFNTNE5NR01hVHNIcEdzSUxaR29OT3pJd3hoVUM5WjVYaWlxM1VVTWl3NUgxUDlxb3Z1Q0VJekJ2TkJoVWlTOHRCOTBRTWRrVlJsQVM3Qnd0NDY1TzVTb3Bwbkh2OWpsakRNYVM0TXl3dFM5TG0rbU8xcG9qTkNuZ0YwdWROdW1vVW5hUnl4Mk4vbjRPa1J1b0V6VHF6ZHZndDI2eHNyRXlmUG5UUzRROXNnYkZDUXFnRTV0N1ZaampNclUzS3dzcWhFOFB3L3RTRnRpREVtNG8wSmUrZ3FSZVEzZExYK05BRVNQUDY4bVp4b241TUF5dXF4WEsycy8rcnc3RTF3SUVUc1BNcWFhTVdlbWw2cWh2L0VTdWdYd2dpSWZRVkFCVzV1M2Mzd0lsVms5NFpEVDltdnFVWGVtYkRHYkNUODFUVXFxQXlvc0x2dC9kN1FtR2t6Z0JSRVIwNUY3emNIU21CaTJZdEVGblV4U2FsTWdRbW9pUmJITGcwU2FkbFVHWmRpSU1XY2QraVo5TU8vaHNoRTNrSzE1RlpndkdZZ21BRllNWE9nQXRtM1BkZGRUVFhNdVpXZ2gzS29ySmtJNlRYS3VsT1RlUm9jWmhIemJaQVNKZ3lDVWNDZjFsSUZoYThFV09aaWtxVjNPVk5aZFNyRlNJZ2pnUmpWM0RWR1l0RnIyNW5UM093K0ZIaS82YVFyT3VMNHRESWJHeUJVaWFyc3VUT2tnYUoyaTMzYmtKYWZUcnFaMmRPNVFhVWMwa1VreWdVV0orbUlJMUU0NjRWem9MQkVKZllhS2UwZlBUUGZsTXNsbVozSHRhaEQ0ZnltbGY3c3VGenBlNmZTZWNRT2YvV0V3WGc4Zjd0eTJ6T1REb2V1V3EvcnlwVEJFdjBxcGY5MFd0Zm4zNDhjR0ZIMUwraGd1WmJyWjFnNXhETzVPYStKenVMc29BdGV3eTZ6V0pzcHVLOUR3a3FYRG9CWExlaE1rZ1VxcDNNaHVTUXdnZTdETUZKczZPdHBldjBnMDZkandzOEV6QmM1dEV4dXJ0dDJtRkdXbklNdVNuUjU0NjUzRmlBd01tSlpaRmdOSEQ3azNQeURIZFRDNTk3Mk5GKzkxMkNrTnhxOFJuMGh4OXJpTzJ6ZHUvSHoxNXMyclY1ZjlJM1pCRExuZ1MvZTVheU5IRGdqOVQ2TzY4N1dEcDI5TXdQSm5jT2FZaWU5dVhyNSsvZHJseTBzSEFoaHluZDFmYmZYU1dCb1hXMUsrc1h2SElRWlZ5L3d3eVR4VlF6U1Y3enRoUkcwN0RGVFRmMWllNXlEcTRKL0hkZy9ZK2lTMjg5L25nVG1BSTRjaFJreW1wSjNlN2VZTVg3cm9NQ0NNM0crdnF3d2IwR2NCVUpQSlJ3Wm9MdjFCWUJLSEZBaEg4RWpBNE50MUU2ZHRkVUJBSnN6RkdvekZ5Z0VhUHJZS0FocEt5UmlsMkhiaHI5MDVaaDBHT3kzTXI0dzhnNEZQZmxSVnk2Z29nSE1UQjFhNGI3c0JXNEp4VzRtSUY5NWdaK1oraG41MExqT1QxbldibUtYZFhGWFIrOGFJdU83TUM2a2pZSVp4bEtaZ0xuT1FFS2E5aHNzNUZJc0VNcEp3eWhDK24xQVlya2M1aWc1OFk3QXhCUmJuRGFLRDNPVktiMmdKZXdZMncyRGwvRkhia25KaEFnVEVBWFFGOTZoRzA3RE5RRnFvSjNXMUNRSmIxYlU4Z1J6RFJhUTE2NldlaGYrWGEzRWZhNGJyQjJTWXdGQjhrUzNPcFR3SkNwWkhiWkVsQ1Q0eWUxcnRRS2NRcUtrWk9KSUVRQVZRTG9tZkhEV0N2SVlxVlJOaXMwWmJrOVRTZnRMYU9jc0tYZXg0WEE5ZlZxMmxuQVdLM2tzT0RJK1poQXZVNXpCY1JGbzEzM2Z4R3hsQmtwQnlBc0lZUlZxenN5Q2NrTFFvb2lBZVFVYkdVZE1oaFcwanlmTlFSVlVoQ3VmbzV6ZDJkb0t3T05wTVAxU2JZUUJrUmtOQ3MyWEl6aSt0NWErc1Ztcnl0dmo1RXljQWxZWmxWWlBzZmtlOXIyTjZ5VUtBTmF3bmpOcGR2LzNJUkQxUGtzYkVkRm95NXdpeDBhcERFZVkwWmhUMU5Ldmd1QlI0TE5QOE1xSm5pYjVPbkI3UzRGZ1dsc3EzUmI1Nm4rdE1FV2xqd0h3OGM2WVltM0lEUnIzSmdDVTBkRUUyUSt2SG9aUzZDQzk5UmxJOUpNZzErbUVCalhmVUFDaURGN01jR09ZdVVocEZLZ2lVTWl2dmcwZ0l0RVVCUWFHb0pjL2tDL0tQcmNiMUpvdVRKSTdkbEdKOS84U0dLSlliRUgwQTVDRGFZSUJyUjJYYVZkMkVDdytWMkRQcE92TThBMS9IT3BweDAyd1NCUGlLMFZpMHJYbW93R2VoaVFWSTJhYTVuQ1hHU2gwL2JsM20ybmVKam40MVFLeW9KK016M0ZhQmRaeG9YMGJRQzliYm1zYlVIcExxMnFlamtTZDJENFRQTzBzU1RvaU1WWlgwZmxIYWc0TTQ1bllSZ2NyWXArSDV6UWpjaXlpVVJEM1hla1ZPcFFrRk9nZXpRWVpKZU8zZTBHODdTVWJBRml5Q3pKSDdlNjhwNDBWVWhXREw3SHcxS0FpOGpUUUJXaWlsaTdSTUcydmxpK0lFbnk0YzlveXNFUVZaUk5CNmpRN1F0UFRhektKeVAxMmlYSFdqU0l3UUErWTAyblIzK01qd0x6UmozREVKd2hOaUFLbE9BUnQ5ZDlSYkI2aGdpdGE0Z3FIOUlMc0FlL2ZVUFdUT2RJdHQyTmpQNXNhTjF4cDBTa2Naa1cxTlQxTlFKcTNrd2NIWmRVY0pONTVzSkdreE9uSmZhUVRzdTg5M1JkSEdNMjFPR0Q4MXpnVU5Bb3pCZURUN0dqUTlCZnlvZ1JDU2hTRWhZR0xjV2krejlqazd1MmVXc1A0dUJYZVhsd0M5NGNUU2NXK29leGhpcDNjcE00UEE1bjJkYnRiTmsrNzkxR3R2aWl1Mkh4aUl1dFhMMVl6TjVuWHNiclpUa3N4SFEzUGFGT3RmYkR6SWlTSmFaZW9odElJMFJxbkZHQmppK3J3eUQ3R1UzcGdhNDBwMWEvOFhtZmhUd3NkbFRFZEFHbWptS1gzWGYrNHVETzlXRmxRMDZxQXBkb2ZvYzlETWU0MFd2Tys4cWlvRFMrL3NMZ3IxUTU0S1dRaTJLbU1kb0tWSTl1Ly9NOEtzTzIvMFhUZU0wNUV4cU5GcStxeWRmcWlNZE5YRzc5dllnYXhLVlo3SFV3Y001SzduMHhOMndLSmVyY0FrMlh5RHNRMTZValNmb1pJL25zalNmc3BhMHByb2NyeVlUaWZRbWc5c0I0MWlLM2EybFhNZ3RIWTN4OGpEV01jS2NLOFU2REROOG8vVkFsU0hSR1JpMmJybFZna091QnNOdmxwQkhRbGFQNnUrQjVyU2JXWWk1ZzdhWDlZUEMwUm1xYmlhT3F4em0wNm9zOG96TDNRd25Ja0VXZXZwYWJxYlBBZWQ3UkE2T0x2SXJyR0ZsMTBGQVdoVURWMmUzK29NWEZZOVJhSko3Y2RBVWZmbGRBcm1SRXlrU3VobW5WNjVqNUFITmt4NkdwNFYycHY4QWRsdGdqSnk2dTczUE1QSXpzYjdUVjR0U3greWovMlhnZlorTVNOZC9nZjhJcUh6Y0JpVzU2WWhka3lrUytWNHEvOGRvRnpsNjErd3RiQ2xIeWg0U1FBMHYyTWNrQlp0RnoyQUxUUUFmbnpBZjZQdFUybS91aVlKekdwU0VBSVRBRkcwNmN1SDlIeUg1UCt0YmF3QnQ4MWZ2L2ZLcDR6Ny9ZT1MvbSsxK3ZIUy9VVURwcGhuQnNCaC9pOGxiK2tlUlZ0eE9ZVys0ejU4YmovMSsxeHk3ZXp6V2NhTWdwUEJjT3BnR2QwTzhLWGJLZElzeFQ0dXBmOGk5alNKYnNwdm1Xa3F0RG1UWEJudjk4RHM2UkdLOGwyK0VZZVg5WXJyR2lPNTl1bnR1RGxqOHZ5L0p1QjRDSDBRZm04aTM3S25jZTc1K2JrNjUvL1dNbHVYYU5BS0xxNlAvc0hnWmlmUjdiTU1XQXEzbjhHcEpoTDl3ZXh6N0RUMmVVTDdJeFIxbnZLZE9USllKMXJMeW95ZU94cWF4MXREVytpZjlObFJ6MzVwTndyRlcxSkRXNFNuNmpzTkdZdkdNVVliVDFaTGU1M0l1T045U3RYNG51QmhKTGhPd3JKZDNBcVh3bkVRamU2QzUrUHpubTVCRmhnYjM0T25GOWhWSDVzemZYSis3cW50SWVVN2xqNXZFajJpOFJzeXZnYU9QaUtoM05oMVBkbFZBL1RoMWhvSWFLdmFDY2RyZU4xRlVsMWh6RGNvUGh6UWg2Zi9yZDd3WU9CTHFFMUVYcGdqanA1ZmRRYTdSWUJmUHZ4cUJUTUZGYVVpQTRkM21BYTBGd1pmSXd2b1BUaXNjRGhndDZmS1VoL2RrK1JLbVh0bXpJVXF5NVdidkVXVU94TTU4OUtqWE96THNLcWZlQjlFQk9KZ3NYWFlJVElRalgwVkFZWitJNDZ0Tm14WHpCK0RuWmFuTmdvUUh5YjBNRlVDakM2Y0l3R3hnYWhWRklnU1JLZE05K0hKZzhSWWtSaU5md3VRd1BOUGg4NFIzWjNiRGhQbFlhYVYzQmdYOVNxaXZvYmJZcE9mNmhValBzcjN1cy9FaUo5dnQyb2F4eXk4L3B6RUdtTE1PeFFXamwyZmhtTTZobGpib1JiTm1iZFJMRXhXMlR1ZmVTWmFBS3pzc3ZwbzlhZC9QMW01aXduQWx3emloZzRMaUlCd2pnTFF0aHUyWUtaazF1ZmhKdVZEYWRQSEFXeUJER1Z0QzhMbnF5MDBGbkJqQ3gzRy8xc1lqQTJ2TFV3bVJ2eGI4bGdRbkIyWUFHQzk2TjdDQk9ER21HdGVHNEFnRzhic1pZTmlIMnZnS0tNY1BXcmtTSkZSQ1lJb0loNENCS3lWSWc1b2xBc3ZSY0NrRUZ5VEFqcHFIMWVVWkpFandLQVZMbHRMdFNZQ0tobUpsMmRCSXVGM1dTbHl0VmlMaURDS1RGSlY0R1ZjTEtVRU1aSkxYcXB6VGNrdGErZHFwcFVGZHNCSjZDdWtCUG5sbk1PRUVYSFhuQVFCR2lkc3FKMU5OYUVZY3FTd3hqa1REQ0xsUFZVaDZnK2pKaHVhVElZaWkzYXRMQjlLaHRYaUpRSTdpVXUxWWhwNHFIRFoydjJjeTdJNHlTeURWRlVOR0lnMXJ0M3d3bldmR1RCL2V6aTVhYUk0dlpodjdEei9DNlBQdisvdkk0eWZ4emErSDhLUkJ6SDRrQWJ1c3JYK2V4TnZ0NjMxWGpWNHVUNHl1aTlaUEYyMjhYZ2hPaTVDKzJVVmQyZWk5V0NEbG9NTHJrOXZOQjFPYWp5ODBYQ1E2bzlVZHhScWp4MU85bExObnZRN3F0NDFIV3huN0c4RjdaWXExeWJzckgrbzExUWhXdm5HSzl1VVJ5amRWS3l0cUdUcDA1UkxUN0VnVGI3d1pBdTlRTHJvc0RMSFgxYmlPUlhQdHkzT1hWaVlPc3hQVkRDai9KbVVOMUx1S09VTUpHeC9DRnJpOThUckwzRTc0cHdaa2hxdUxyRXFZbFkvR05XTS9wcm9EZEVhS2F1T29yc2tha0dVbk1nSmtaSkx4RXdpWklSUEtlUGVSTG5ZcTFRY2tjMDBwWkl6a2hHN2RXcXV0aU9uWnJFUk1iM05Palhhb29oWURRZ0hlNFdDRmdTdEZPSVhnbjFGK0VJVzgxUnAwY0VEOGpkM2NEbFNjRHFjY0pqSk8yckZaSkF6Ti8rMnBIclVtNnhsTTM4c3FzUDFmS2ZJamM1MzVqdnk3YUxXWTFlVTJldnh6ZC9Rdk1FLzJzemhqZjF6M2FoMTJDT3EyWkVQZXdQK092em1mOWcvdGltZzgwNUFBNXVnZC9vUjg0MHdXWXBhc0JXVjdBVS8rUnVhTnVTUGFlYUkyVkZIV1ppY2k4R25XY0dVYytNTlk3aTFSTDkwS3pxZjlyMTZ1VGM2VzdEVkV6clhBUFlsUXQ2cE1PbS91TzJoUGdEc0dNcldvMHplYVFIV0F2NnBOTVdkSGRCc2xzZHFBTUUvZC9KN1A3Q0NEV3pJRndYVjhVd3V3Q2U4VWl4Smc1MGtJUnYyUk04WVlra3k3bHFESmVHdDJBb0FcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMV9fXyA9IG5ldyBVUkwoXCJkYXRhOmZvbnQvd29mZjI7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R01nQUJBQUFBQUMwY0FCSUFBQUFBVXJBQUFDeTRBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdqNGJJQnlCSWdaZ1AxTlVRVlJhQUlFQ0NJSTRDWjhVRVJBSzZXemRId3VDSkFBQk5nSWtBNFJFQkNBRmhGd0hJQXlHRmhzR1NoWHNtQ0VlQnlEbVRWd1V3Y1lCdFBIcUJmOS9PT0RHVU9qRHRBc21pVTBsRWtWUlFrVTdsK3BMbEdRd0xaTXhPTENMaGRNSVp5M2JSWTFRUVR1SFUzUHRxeDMwblVSR2Z4MGhhQlFLdHRBMUhRc21Ga0ZXcUtsWEsraERteTlXMFh4elQzNmJKOGlybUpWcklueUFPVUpqbitUNm56cXk5Ny9BTXV6R1M2eU5JK1VBQTFScHptRnlnTkVINU9QdU9td1ptbzZvNkhiNkF3L0F2Sm84aHJHYm1saW82WE1xRjFaaHpaaVl0VjZJMmVSVW5IRk94Y1pGY2E3VFI3bjR5RDZlLzl6N3Y1VmtKeGRYbXNlWjFvV3F6U0Vjd2pkakVJN3hDUE0xUXRNZjl4Q3R0aFEzSlVidmhSQS9pTjlycTFRdllSOGFaQ2k5Q2pWek1mQUFHbVpZNmpWSVEvY3VNbkdJNVN6NU12YUdwdGhSYUI5K2Y3NGkzSWF6TjVycEN5emxwYnlZci85cE0zZmIvNlRkY0VWdG8xai9MTms2d281a0s5anV0UW1ib0F3d21XWmNaOUROQ2hVa0NVUU1hSUNLY3hyT2hEY2ZwcCsySDFlVFpXbDd3M2FYYTFVbkhab09ibVpwRm5pV2praWVjYWUvWHNnVzZ1eS9JcC9QVkxPZHhaRGlrcGVJaXp4blhvVHNYSFNpSEVOUitibXBkdjdNY0habUZzQmdDVnBZS0pFQXJVZFFDUkNwQUNoaEZWNTJTS2tNc1NONUVlSTV4eXFuNmx5RjNMa28zUlR1aXhRNnUzVFJWWDRzRFlzNDRrMEpRVURPanZucW0yUm0vQm9KdnMySkZTdGk5LzUvWFBYd20yTlA0eXpkOUNtVllYY2hDSXhPTlBvK2FYV0pBb3FkYm1mWkovWHBsNGhucDRXM21QZVgyQUc5RW95Q3NWdDhnY1lGdUVCQ0ZlMUxvR2hYYjlmQTZkWVJENW9icWdEUlR4cWthZ0RscWJTaUFVWmVsbXRyMHZ5YjV6Vlg4eEVBcjd0c0xBTGdmejhsWVVURWVhZmVTS29Bb0dxODlaU3A3UXdOalhyRzYvN2N2bURJc0JHakJ0aEJZeU11bmpJU0dvNlMzY1k0QVdwMmR1c0RNN0JpdXRPWFQreUhOSU9NQ3d4NkxMdkpKTnAxQkRCNXpnei8zekFNLzk4SFkzcGpmUU55K2R3QmdPVm8wSm9BYlM5b2U0RDkxWWRhaFIza1hIMmkwTm9CK0M5MUp1d2NIV3pvRnVMbXZpaEFKUUFFazRhRDJsaU52d1ZZc2hQRTVRVlRDcFpnMWhGbmtuNWV5bnV2SlVCbWpoNk96TEJTbk5LTTU4eDUzL1lsdWtjZTZPNExVcEt4blA2QURrOGVRZzZOQitRaDVZQUErR2ZxbjcwUDFIcXF1VERCOHM4d01pMXZibXFINy9wK1F1SU4wSDV0dm9YVHUyLzlyMnNmcWZJTlFDMjFGS2Y1RXFLV3JCTnZhbmhORzROR3YwTzI1TllTeThZTXROWnVoejJpU3IxTk9zeXlhbVp6eERDenY5ZUVRZGEycDdjNUFZTGVCS0hrc1BrTlFpNXJZTzQxWnNhQ05TZTA2REhxZkc5WEhmV0lWSTFtYlFaTWs5RnJkeTAxekdMT0VxdGpOZWszanNFT3o2b2ZKejBSc0hvTHJiT011ZzJFbGo5aWtjMTlQOUVlNDEyR1JaZWFhVTUySkdoTmVzVmswcHozQituNEJBSjYxNjNSVXVsOVlZQzBvU2xIcGc5UDlmYVl1N3M2TzlyYlRNWldRMHR6VTZOZXA5VTAxTmZWMWxSWHFWVktoVndtclpSVWxKZVZpa3VLUlVXRlFnR2Z4K1VVc0pnTU9vMUtJWk9JaEVnNHk1OGZIVDZRcFRRcHViNCtlckNpVXBLKzNQR0QwNnVoUzBRZkM5WlpRaGc2MHgrNVprTWI0elViQkVqWDdMZkVsUnljRVBxUVZ1RVkrcnh1cUQvbS9yQncxSlI5bVNrblRWQkZLOTZtU0tRQ0xsdUNwYloxTCtreU5hUEx1M0poeGJRbG1ZRDEwaHhLRUU2dkI1M29SRzlWL2xSaG5mV01BNVlOdTNXa0xSbWNURTVDL2I0cVd5cWpOcmlrTWxjTHVuMDU1NUp5VytGZ3c4WjNRbld3UTd0Z1hHSXVmNDU5VUFGMlNRVHRlREZ3TWduYXh4clBqaHd2djEvTEpCdnl2bXh2TXV0bmlVMjFraGkxVkdRL2JFZ2hlMjVUNGNwY3dmNncyZjNNeEdXbytUVERFNmpFMHBCaGRBWG96TmhSdFNwYk5jcVlLYS9Mc0VKckt3YzQxQStXaEY5cXlLVlA2T01vVjVqeHpPRnhueXdFTGsvMm1iNjYveDdQWlBKNWwyQUNucUlXSjJ6UXVSNGZxWEFRRHNNSmQvQklvaUg5YzE3MGE0S0tDYjlrMUVGelV0UFIxSmRVZnhTWjBLWEUvT2pMcXpGR2EvNHp4T2dXR1BwQk9PQ2tMUXZaZjB2aGZzbHdTaU10NWpTMTJ0dXBWcHFKMTFyMjc0Qld3RzVLcUJhODVtNGlOR0VOWWV4NHBvTTJmblMrc1FOQk5rV08xLzV6K3RSN1hjNDFVNTdYKzFJT2k1RGpucll3N2QvendZcnZ3ZU1xbk4vRk5nalhYWElyV0tjWjBvMjZPNnNzWjVUREF5RjJOVWQ1UzVZR2g0bWxRLy83d3hZdWtYVFpRL1V3RWV2c3c2UlkxNUFXTllaTEg2bEhHVTJpRGFCKzlML0FUVzdTODgva0lDK0lFQWJ1cWQ3NENMdEU0QWhaMUhTU3FCbmpuOCtxRldvbXJMV05hcVUvVE9GTk83aHdDcUc3a1RTTGFXN0h4Mlc4N2RZd21vM1F2R3pSYUhqT3NJbnV3K0RYd1RuWTlCQ3JlVHE3aENPdEhPMURTRWZBSnI2S2k0TDM0NWtVVHJKRHZPS3hTK0d4N0tkbDFMVDBXcW9sOGxPTmFpVWJpVHBwTjB0Sk1CejdpVnR1VGd0THF4YUJGd09JMGlQK252WnBxVGZ1VkJselR5MXZVMnJJU202dW5IZ05ZemxBbENObmFPVjlwNFQxL3orT2xYcE5xaE9FVTdKSjhudTkvY1F5Nnk5QVBqd0tBOGRNNjNVMFFMcGJIR0pQQ2c0ek9LRnh5bHZhNVNMcUF5UTI1N3ZjNEVLOE5tbHJkVkd0RDhZa1pYUUlzb25YMjVmY1Foc1A2VDlTa01BTE1wT1Z4dWZER1NzYXFYVlgydXdNMk0yckhmVjZDcDVDVU1rR1p6VDNWSlUyMGN1UWZxUEJzcXFEd2kwK2liSnBoOEZPYW1oRW05MUNaYzFHeEpqMStHS0RZRUt2SHJESkFTUFNGUEloVllwdUxiVVJsSWYyM1RPZUhlY3N4elZzMEJ0YWdBeG1qd1FsU0ozVlRUYmV3Q293aFFOckpXUFJlTytYVWtUQzdtQ2gzQlhwRm50SHRsOWlkNjdNTjdTY0JjdUdjbXJSbXJ1b1JUakRkQXZuNzRHWU1CZzd5T0gxd3p4TzI3UjczNDJJb256V1Rob3lmazhDTmpxc3B6VlJpZC93dkpMd3dHMFRuRkNqallWYkJhT3pBK2hjTjhSSmlJMldFcExWYnE3eVVvN3Bpc2pyRVV3WGhmRzFqQm0zbTZaU3VkVjFtcEdZR0hmR1FyQU9GbFNZMTdoczlNRjR3VXRFZEg0bXFLQXlUd3daWlVNbkJKZzFpemdXTVJNRVFEVkVmbTNTWlhzanpVSWN1QWdRWmxpakVKeGNoWlViWm83UE14dVhnRUhWTTZudHppVTFiSlBTUnJhREJjc1NXNkFlQ3NVTlpYc0RRZHprRXd3YmhmcytPbVg4a2NQa1dMVGl6dTlsOG9SbzJZT1RIVjQ2Mmk2Y01XejI5ZFRqaFpHd3ljckJKVWJmb3h2MXNnUVREcUdzeGFvRkJSWDBLMW90T2htWlVoWlVTdUJyMWRQQlB6TXlVOXgra0hqWHhCUjlTUDFKcVNrL1BXa084bGdPcXdPN2RlQ0FCZnErQlU0eGNZVXRObGRTMUx6TmJuZGt4L3RPb0V4ZXRjR01GaWdWbUt1eFdZZ1FOWWFsS0FRTzVVS3Nsb1lXeWpNZmNEOEhHcU9VR0p2V1RWendyUFJzK0lPdmFIdWxvdDY2bFh0YkduU1A0b25ZanFWSmNkVzAreXhTazh4ZjBWdXZJbkYzRUZGWXl6R2F1MldCOVNaWU04SWY4Y1ROS0ordVg4a2RHM1Flc1gvNk9MdjJJcUt0WnNheldyWXY3UmRjd2hrbzhZdTZwSk5TRUtRb3RTK205YXJEMjdRS0VWRXNrUXoxZFBaWGFraU04Z2hVUlJhS0E3L0lrdEhyRXVGS0U3Y3pzdXVSZU1vaDNGMWNwLzB4SXRuSkl1TUZrYzhvd3B1a1NkOERnSzJYUUZDbnpCZUlTZ1lxdUczdHI0STBwb1BodEFlajlwVEl6UzZldGpFbzk4VmNVaUl0cnpGNFI1bllFK2JkZ25MZi9KdDdnRVlhQXpIMERDQ2VtNTZIeVg4bXljN2pNdm85T2RKLzdNaFZkdUsrQVdMSnYyRHVVVlY1ODJxMEM2R1ZoL3JrV1h2aU5kOXNzbjdpczJqZE45R3pDRmxtUmJ3djlDVTJVb2gxbnV3U2FmWlBUZXdTZjJmQzUwdmNIMTJTbHhnWGpuUEs3cXY3QmtTNS9ML1I1QWpTdVdubkhRL2FWN1pmTWZNV1B3Uk4rN1ZsSXBieUs1YUF6N3NLMm8rbjNTeFpMSTl0WjRMMnpFeGcxckkwN0ZoRXh3azNxOGFRL3A5WmVGVDBVVkYvdEo3bDErK25NeVNuRTFTVU9NYWZHMHhhU3V6aEw4eThoV0hwTFdkM2dOYXk1aVV2alNXbStGZFZucmtXcUFpUlIzQTZlWnI2QUI4Wk81VUhTSFk3NUVQYVg3YkhMQnY5QTQ5N1Y5RlRrTStnM3YrajhMMFM3ZXlpem40bDhOUVhBSVZCYkNadGFKVmRzb01ObXd3cTVhKzBDLzBrZ1JBWWx2bmhpQSs1bG5VQUFrU0FmVmt5b0JuOHk0bVE3c052M3gvMzIvNmdlRUxXZkRwWkFoaytXZXc4cVRDSm4xRVNWQm5HbHlWNnNSQU1WRDRtVWdEQncwSXRaQjB2U3FXQUZyZ29RU21UcHFmM1o0Zmx5QllWQWs1UlVaUk5vUzRHZnhKZHFDWGFocURxVkttRW5sMElYVHVxc0lvMXZxNmtzR0sveEtzUTQwVVpOeVU2WDVab1RMTlFxTGo2TE5GNmllZWhGSmk4U3Y2MFZCVDF3NXlFaDVQNGRJajJZOXlSdjkyZVBqRmM4ZDZvemkyZndZL2pDUzk0MlhldVZhVm9wbnY3ZkcxN1JOa0NTcFFYdkNIem94R2ZCZ011Z3R3ZnZnMm9yNkpvNVlEejZkRHhudDNGRVpBMDltNHJpd1UzTjkwYmd0bklrS2UrbHJJQkpJQjZhSFdDU0doeEM2bEttQkliU0NIWXJJTW5KN0xrUEhmeGtXcUU3bklFaFYyYndhOURpWWJTNmNKNGNIRGlsVEpWMURMWHEyTVo5K3AvK3d0ZjFiZjQrLzJ3QjhvRk9lbHQrM2UrQlNUckRDWno2L254RjUwWWNPL3drWlYwSVFSTjhvYTM5OUFqQ0gxUUNVOWhIWVVOYks5UmNUVzhERS9GeDJoYU44WkY1YllCQXZuQWc5RHdwT20xZlJjSTJnTFNQSnZKNnFsYUdEWkRqVDRQS08wVTVDeWU1bG9GVGEzaTQ0S0JZRzdJZnRwZHZQZWdYeXpCblk4WmR6K2s2TUMzUWVIZGpHV2JxVHVETExtNnJjK0F5NzNkdkdvU2JRUFVvaVNiV2hVQUNsR2NSaWdNczJNZjJET1JLb01nM3BnR1VGaFp5a1lCK3Q5eW9HUldCOTVJVTdiREhXd2w2SUpTTUJ1eE1uQ2ppSmtWckJZb3Y4alp4NGpZMitZRXVveUNISmZXbHlZUGJDQkdYdG94VFA1Mjd5czkrVm9TUS96S25FVzBzV1E2QW1sb0tLbkU4eXlERUtvSG5hckFEejJiT3VncHRNa3R2Wnp0bndnMDFDSjJmTWhWK1JDNGhYSUhUdkJMSzBxSGtWNlhEY0tTUDVaWnJwOVc0V1BZZlhWdXFoSk1RTGgzdWJmSWZ3SVZJRUhmK2VLRklMV3JNZ2NVUVF5bUF3MHdpbmlSc1pwaVQxeGlqUXJTWm0xaU1nYTNMaGtSNEZOYUZoejlYYktLT1RsejdEQ2VXdFR1WWNrY1lKY2U0V1RvQk82dFk4M0I3dTI0Y04weTRiWWpsdzdUMlFlTGZocHV6ci9LM0tnU0VhSWIveWEwUlNaeHg3eWtaQjhGRmVZR0ZvSVkzaWJRQjJZdllFaDFKdmplR0hmYjJHd096TElPZTlBRnRBekRWVndTT0JPbzVXdXdtaW1yNlVEd21VcUxEUXNmY1Z3UXNuTTJua3BsTnVFM2pVU25OK3Z0Q0U0eWt3VUVkdlBjWWdUVWl3c3JVK2tUZ1hzcDhsRHB5ZEhxSHR5ekt3T1VCSTlPSmVKcE1DUWNDMGRWUytFS3prTTNWQ0pQcng4QVhId0dpYmh3TFhCeVVjWlRXb3NDdVVYU0V1WG15Und3bVJWTlU3cG00bkR6SXUvRjZibHY1Rm4zMHJFL1ZjYWE0MlVmSTNTQXFCbk12QStMK3hsejkwb0tBOGIzeTZhbzNzZWo3a21mVU5GYVNPeGFIeENUSVJxVjBZN1Rnd0hkdm5yM1I3S0hPcjc4QUlUemFQenpEbGNlUWxGSEpRRnhOaFRDUnNheEduT2FCN2ViaEpkTTZ1R3BNZUlDV2FwWS9DUThSV2JNdzcvdlpNOWp5YTJ1MHJna0x4cVBGcHlhYjkwOTVmcFFEVzRRL1V6bk1rbkVpa3JsYWlrcWZpZWtKMjFKbnQ4K3VyZ3hBL1RDdkVuRFh0WUtOMEtuL09sUHAzNEtiNzZaaHZJYlhXK1BZNkdueWE5U2RZQ2Zjdm85eWZuTU5XOFJDQzB2M25TSmNCMzR4bU14eUNOdEkxajUxSkVQVUFVMnhSdElOL3lXeWEybnBZNzJaY0dFUTZ4R0Y2YWRVbjhPNkg0bm5VU0hGMUZqdU1oc1J6K2JZTkxUWHF0Y1R3ck5MdTRPeERNQnZmWHNVL0NYMHNwN2dVZzRhZWpaUHBwMkhJZDhUV2cwRHByUU1CeTNFR3BFdG5TbHR0c1BEU05Vcmd3T1FmaURXcXA4ZHRwVEtVb0JidFlBMitzR2w2NGxjNE1MSURGVmVhcmw4cmV2UHk2VjRCbERCbjZLY0R4VVQ0RFJTUVRQWnkrMTg0Q1V1azZtZFVkOElOTDFsUGlKbzNIWVczallIK1ZNeVphc09FRFM1TTlVaXo2bzhydHJFbjEyenJoTjd0Z3lYdi9yajljN2lzTVJYR2V5NTJrN3ZET2N5ckxHY3FGOENHK25wZThHUVRyZVVGbHcyRkltMmU4cURUUmJXcWJHSC8wblhYTVljOWR2RUVUOVVtV3ZlZmJINEtHL3krY3lTMXJFbFIzS2llZndXY2pxNTcyR3YwLzA1WUZNUDE2OTlLOTZYbkVjUlkzRURpME1SQllhYmdzUHpaUTlUUGhZZStQVyt5Y0VLMGdhMUVJUFhFTjRLVjc4TS9oa2R1VlQvNkFKcUNZb1J5cEJoVnJyWm5mTlhGZU45VEZsR3pzOU83WkErUkRkanJXOEorN3I3UWxjRDZYaitKOFVZQlJhbGtTdUJsdUc4UnViN1plRGVqUzJEWm83ZC9sSDd3Zlg3cXN1VVhldU9rQ2NkbzY2T3d5QkM1Q2pRZnFMam5GT25tYWdGT1NTdnQva1ArS0JjWWRNQnA2R25QNXhzUG5sQ1dQc1Y3elhUTWRYamZmeXRiOTdKM2cyb3o1bnZ0cDRmTkY0SDk5ZzRZOW42ZFZGNHprbjRUZWxENjY4WitOUHBEY3Jpa2Z6VGlKdUs3dDVWMWVsTS9xUENubjJlb2xnVTlQTXVyelk4UzEyYnJJWlBmM3FXTjh0dW1LaDJUUmNOMjcxTTBLcVYrRjRoTzJIemVRNnZCRmVnVXRYa3JNU2k2cTV3Z1JxYkZNRnZydFVScDNyVmgxUExkZHN4akVpMEtQR3VRUitYaFdpQUJOWGhzWWs4TVI0ZktRd3FWZEc3WkhWME5hR3EyNm1CbVdCcFlocCtPVHo0TWxwc0E0QnFRcnZjbkk2ZmV4eHhyV01pekVYL1A0OSs3VGppNDRBaE9VWlgxQkxxU2Y3blAzcGdESk5laHk2ZnhCU2FPYVJiYzNOaVIrVVhPOGVYV2VXVWFyU1NFVllZTjZaTmxBM3lSejhwc3RqamJJZjQ5OVBuNnBydWdGditodFlFU092TW9seE9xeFlqNXNMTzErdUtkRkgvUVZwMlNtdVBOZXJTOXdyUHpmWWU1YWlJZzRGOU1VUFR0VERNU0tMU0xXUzhYb2pMNnVsRHNNa3Q2TmVqS2lIUXIxK2hCak9WSWd2ZEpocGdOSFhIaGxNaDJkNzlCemE0SUxzNTNSckJEZ0cwdDFtYVdjT3hkTENSc25JeWVnWWczLzcyN0VkTW40NmxjakFtN2xWeTlCTWtJVmt3eStMKzJjdWtZd1k1R1pJZU96VnFDd2MzcXYzbTNDTW0ySzQvd2t5QmhNYlh3akNlbWsvV1BlNjg0TzNoRGJleGdoTy9SV1ZPNDJjcU9iaklmTCsyUFJCM3dRbVNWVTlKTDYyMGV5cTJkZGEyekJDNXJmMTkzY2RBSEtPRFM5dVRKd1pjc0hBY0VRNk5hVStRNlhsbllFMnFuNjNqcDhjZHNINkV6RXNha3BEbXJxeDhHSkFwL1RqdUNUUU5uMEMrb1k5UjZVYUlZbUVSalN1UlJEdlVhSWRuejh6c1RWMEtvaEFKVkxJeTVMK2Q4S1B5ejRPL05QVGRFNVdkcVZERWZlb2NMdDc0QVJEM2I0dHIzYTFVeGI3VVBqZnNaUE1pdjdjMmlSUkJYWWs3RncxSnE1Wnl1QVI5QmtsU3ZSb3lMSFNycll4cjVpdnZIOVA3QXQ0YTk5M2RZcWVQRmFSbVV1eHR1cmozeSs4MWpsbVkwbnBOYW1VUW81cnNwZStWL0xPYkNsQml5OXVRaThpdDBxMHhicmloUEo0RVplcHlSeEV6cktWS2xOVUxxUnlDbVdjWWE2azhYbDFjZW1zMUJnR095cy9naGF0RktRcUNHSlJ2NVZhSjdIRlBrbnBUamRIQ2NVMVBIS0VXMEVtSVNJZlZjTkdxeGhxcWVVS0xhZ1R3akhrWUp1RXNlN3MxckdsRGN0V2l3czJnRWhpc0tocjBxSG5ZU2VsSDYyQnVrbjlBVys2Y3RTcVlWSXc5ZDJrN3lBYnArYnA4emNmQnZ3WGUvVDZsbmdySU9QYmc0OGY5Rm94d0hDMlRwNVdTZXNEZHZNMnFJbXVHTGNwcDU1bzU5ZlNXdk42aDBtS3N6R2ZPYWRJNm5yNmNRSHBiM3VGUGtQRkp1Y25vUXBEVTkrM2hEOUV4U2JsSndidXQvZEx2ZVlPdXZNTVN1UXAyVFc3VjcxRkZGYVJVTVJxM1ovcHRmYmlTSkRSZ3Jwa2pid2tEelJXN3VlRURBZlVtRjI1U3ZVSVNjUTM1R0dNSlJIdWpJV0JFZHZvOHV5b1A1VmF3Q0t2eTRhZWhaMG9lek1LVlBraXNBY1oyT01lL1IxZndpYlJZQ2tDMUtlL1NvMmpZQjVpcXZ5NzdCVUxTZmh3MkhXM3B2cmVzSm4xc2Uyb2syVGJLWFRyUk5qVzRMNG42cHFiZ3pyS1J5c1huQnV1T0NWOFdGSUxmRE9xRmJCRGFlek1QQ0dWVWtlRzZCNk9CdWZ6ekNaejVrbHBDYkZ2aUM1M1FMZ24xbmxIMHoxU0ovdHdicUhFb3VRVXFRZlprMVBnZ29QenBXeFYyTndYbTJBekFnK2ZISVZQcmdpWHdUdGJNeE9oKzByMVlKNWZVOW44TkEwSm5JVWMvMnhRODYrdEw5ZkQ5TlBWUy8rcEYyVW5VSlJJN05COGY1U3c0Ukp0dEZkeU5sQ21DWnJVRjlpVEl6cDVGMWJMZFZrMUlGVWd3c0pSQnpSNlFOMzEwZStsVzFKTGduSkxNempEc1liUUN2cmZkQyt5QjF3MzIxR3R0MTBYczFha3JleHowN3JYMDl0b1lEeU1HeURCZklmL25mQXBYQlRmcWJ4K1dKN3N0YkVvR2tTSm1RbE5CY2JoU3RNRTNIMHRHMTNxdkc0MTI3L1plcjIwWUZYYXloRTFhMktNYitXTml5ZVVqUzgxcnhONEkxWEdJVW53WlVLL0FPc1crOWtOMmpvMlBSUGl4bDRRV0krV25EUzdVT0JDR1VzZE12ZEZNQkM0YVdBYmJCRGV6akd3R1hFRXpFTnNTSTBWcHNGSHdNTlB0dFF5S3ZibVRQZFhaZG50YVczbjhiRzdyVllDZDZUS3hNL2ZKZWltb1JhaUtHNjdqajlSMFZzY2ZwZ0Y1c0hPMTBPV21ZWkRMTU5mRUxLbjF1d1IydFI2Y0JablJjRXFUcjVVUDlpUlg1aTRzRHArNjVzdVBGeDYwZnpzaXZyWnpMT1ZJOCtHbmlGNklQcnJFZXpJRlZMMDA4dzYrVlJDQmYrQUJ0ZCtWRC8vZWxEL1hlV2xiRjFmZzhJb1ZaVnRZWG1wK2MzeS9PZkVZZDA2UzNpb1FpVmEzVkRYK3pxeTNJME1rbGxjU2w2YmFIbWVqMTZ2WlRjTzh5SjhOTGhqd2pHTGUvMjJzdktpRzQ0RHdzQkdndG92SjJSWjNnZ0FPdmtYYmVyT3JUdXZmUFQwK2J1M251eE43MEhYY3ZZVmlHN242TzAyWUQwK3pNU0xxYmZUYjZTZWdaTFc3OHZtc3c2SkY0TTMxdzl3ZldQVGk1SHNmSll5bGdqaCtoMjl1SERaUitETlV4MU9yL05kdlgwOStnNmIzWE5relVvTnpMblpXbUI0dmk5S3NBNks5bWZUMWdEeHc3WUpDYkRkakNiNUNKcmNXaGdGSk01VzJXMm8vdXNGWW55WlFyWk0vakN4QURhNWV4UW4vTGhpTHBQQy9MUnZNaHNVaDBuQXJVeER4V3NBdHF3VXRwbnhnN3FwZWtqZzkzaWJDQXA4OHVldTZrTzI2K0tDVlZrclo2dXZXeGc3YjdCTm5JSWlGWmdmYjh4MlE4emFNamQycmpoWTcyNmswbmo4ZzIxRzg0RjhqelZwdTM2SHBiR0xKZDRCTXZ5dGQ4YXZDaUpiaTJDaTFwVHE2Q1ovOHNybi9TUC9CRzAyd1NiVkRnSEJldnIydkt5eFlqYUM0Qjg5U0E2OEU5ZXc5SGxiNjI5bkxDbStEVCtlTy9lL0ZFby83WDNwa3htNS9XeVlmWDRJZGZ6MGh2TC93YXJCdy9vYXZ6NTE2cVB5Z1U5ZFlpRXRFWi9UWHRVY216SGR5SysyQ0VaejYrczRrMm1uQWk2TGQ4OCtYV1FQcG1zVXd0SHNrL0RiU2ozK3h1RTZKTlZobGgzZE1OM1ZMamh6cFBwK1lyMEprckp6cktQaXU5Y3FNbjVaYlV5NFVEQUFreE16OUlMNndZSGdyeURHRThyQ1hVc3g4aXZ5SC9xUHJKczFZZUtoVUd2SVhBQVAwb2Qzdll6Y2lYNkhFOXpYTGI4YjBzbktKRjV2Tk1qNytmZzFuU0h6TzhPTnV3MnQvWlJhTEwwbW9kZG5NTWNrYWhUUkJ3ZzFDdXlVZTIyaU9HNUV6a1NCSUpiTE5ZVVArN1FIZDh1T0RobTJjZFdheFZ4MlV5R0wyR0Fpc2IwY1MzeTBDaldOTTNkZE1kVmJyRXRQSzBsSlNTUG9Ra3RkZ1I1ZVM2TVRobCtlaGJWd2FSRXpqeStVUytaNTZpWDRJS1IwTHEya3FZeVpvMUZ3dTNMei9YbUl0anc4SXlNVmh4TVV6TVQrRzllZEQ5MU9yaGYxSjlHcmhZUTBaUm1ySlJ2blh4YldqeWJ6Y1BrVlRIbUd5bGNXOGZzRUhyNGFFL0FJb2wrVXNMWWF5Nkp1Y0k2MW1KZG9sWnphUkRLbjFOa3IzUFAvM3Q5SFVqVCtiMFcxK2gwSkpWc3VqeGI2UDVIRDNzdDdLcm5STjNHYUt4ck1VMmNXS29sRFNldWV3djNZZkhVNUdwdXBUQkdXWTh4aHk2SzY4a2trRHhMMHg1Ui9iMWlhUDBXZlg2akx0Z1F2TTR5bGMyb1lmMmZnRGdFWWR1TEVpM3NRZi9CRzVZc2owaGZMWUE3dGhPSFFxU0pkQ01iWkg5YkxrMElwdW55QkxzTVN0RVEzRmkxVWgreXpEbWlJd1BDR21YTDZKYk1mTEdKVDl2VzA0dXNWU0FsNzJ6UnhXcENVQ2lteWhwdG1HZFowbGFBam1WU09wUlVXdFI2Q0Qwb0pacGlBeTBJTHFBSnlad2d6SktHTkhiRVdyWktPWkZFYkNpaFptbnBhQWRoUjRGT21LVlhJbDNkRmNHQW1xSnUwVnVmcDd2bEdWSkF1K3I0MHBENEVPZ1M5c0RYMnRoTWtrWDRBSzhmYVVJM3hmZnlIVloxemVUcWNBWndEcWt6YzhIQzQra2EzdjZDS0lieVZkVEsyazMyM3VMc1Y2NU1OMGhLZTdsdlZPY0orMFgwRjRoS20rd2ZBcE5CREx4M3BFMXUzUzVMVldSNDQ1MG51NmdtOHFQMUJmMTM4MkxmOHNSVlVTZHFRL2VpcitCRnEra2J5ck1uem1MYm9UcC8wNEhYSitxVHBIdG5nVUhKNXB1VHlXYjlYUDNsRmxYSkhZVHRzdWtQUUF5UXZmS1Z1SEc2dDQyS0p6Skt3WFNMUEhhbW1mZUFzY2hoQ1M1UjUzY0hqUkVWdWZ6V0Y2QlNXK0hvTFMvMlE1eTJ5dzdqdzFZcGhuSWhyeU1HZGFiNHRnYUZPTXdNQlllcElzQUJmODNmd0VqYlBneFRXL2ZFK3ZiclFuTXdxYXNuTk5SU2hQTW83VXYrMXBRSzNnVVFFajQwajBXYlpuZmZEVC9nM1drRVdVbUF6cEsxL3NQT0FPN3QxZUdIejBKbFc0SVZ6SCtLMHJPMTE1S0s2dGsyY0dXcURrakdNUEpwZXBSZGUrdng4WkFPdGtmb0MzZ1FtVmFyTUpFR1dJRFFiaXl3aXVMVFcxZytUUTRWbldoanFoenhmRVFEakhDWlY5dVR6TlMxbWx3YVhWeE1KdEE0VkdDL1lhaGtoVEV2Yk0wdnZjR3RnSDhhUGdxR1RyemNnenFuU0JlZUhhZ3FITnQrcS93czFCYW1kSjNBSGxiR2dxb1h5QjBXd0VjRG1RMWVkWjFiREZJN2NVU3dwMnJnaTYrbkZsSVR1QnJOaXMrS0paVWhxbXNJZGVobklRQlFWeTZIdmI3bDBqc0NwR0FVYlJ5OW9nMmRPM1FTVzBsNHNGVzFlbG40aDR2YzdpQm1YZllCWWlpQ25LdHovZW54RVI1WVVWK28wSU8zMS82OUM4RmNRN1FxQk02U01BNmtXVElJTjVZZUZSazljNjJFeW9ZTXZLZCs0S3pQMzRpVWg2QndZS3k0eGlsd1d5Y2JvM2FFUFhWa0lucWpLRHdKaDk4SUtKaThZRUtUS0kwS3BGYUw1S0dqb2JSZEhGMFY2VHgyV2k5UERDeFBhTGxraXl3YTJWTUs3dlNyVVk4N0pidk1GQ2pRSDRYWGoxcmNYQWlBZUxvb2ZiUjc2Ly9OTDJ4Vm5PaHBuc3ZnZHg2cDRWMXZWTVU5NFowMjlWcHFvUDB1UndwUG1qQ0szbFByNkNTV2hIczJyeXhnUFd1Y1phcWVSQWRDZTIrYVZReDVoaklOa0dGcWN4Q0JrQVhvL2p4SlptVUZQTjFhSkZoTmtjeUF0YVYyODAwZmdSV2Z6RWRod0JybGVrbldaZFo3UjhDdFpGWmRSaUNrMVVwRHUwRy9DMFc1Tm96UEhrTkdZdVBoQ0R5endkc2pRS1g4eWhjbWlyRXNIbm9hZEZGKzFlV2xmVEoxNWYxOHEvTlFnTXJMTGwrRmFxRlFNWTBVQ1F5Nm10UVRseHB3RDNnNzFycUNQdHpFT0FQK0NHSGFLSlR1OTBwaGQ0YVcrOFl0Yy9kKzdUNTR6VHF1WlJ0UTlSd3k5RStrWlNFc3gxSkg1ckNiVU44T3RRNkZROTd6WHZGZWFlUHd1U3Arc2VJTnhJanJ2VnRhcDZFN1dYWEczQWNzUGVMQTExaVZJSHIrZG1IYm12Y3JlY1h4MWJxTjNhOW1ES0sxbmxtYlNwOGFJTDFPNnU4NUU0ZHU5QS9MVGdEbmpnSVRhdTdJZk4wSGJwUFd5eDNjckh0dmtILzZsOWN3T3paeXJzdDVlckpnRzNhMFVTVWxWKzFkYzN5b0xTK1J4UU9BL21HV083ckgxZlRHbzRoWGt1V0M1N055b2xiS2JTV0FwekN0eGZYVFQrTnlOMGl0ejdyY2ZlV1ZCcER0WGZTMTNOLzNNQVgxWDNFTHpwdGYrOFo3My9mWDVXMkFGcE5hbmRoWDRTOEp2Z1QxdkIvY3NnSnM2eDB6TW1FbGVVeHVCMjJpZU1tUWdSdWhkM2J5aTJoUjY4a0dobnpLRmhlYmdrcWpKaVFKL1pRb1R3d3VKdFR5ckhjaENWNVBCaEtoREI2SkJPU3hDYVlXUjZWMjF1RjljUHJCQjJROEVBb0hwdEVwdjJKUmZzMmZvMk9iT2w5OTllUjBsbWJRZ0VWUEI1RXI0NkRlMDJqOENqTCs3Y2drYmhOUjkrWjVYSEdndWNMTDRYQlFKazMwVzVVMEFCQmp0YWJXaC83dC9pSDArZ1p6LzVOSHQ4ZXFQSHM4TlJlSVAxblh6Qk1MNk9lS3JrVC82bTl6Y1I3cmN2L1U5RnlFbjVJYkc0MHJKcEZoUlduY25jVm5SUW4weU5IbVRyZWtYbW5GRnVyakQzRnJsdkRpMURYNjJyZmlLcWRWMHlBZlkvSTFrSStMa1RMNHlvc25mQVdRK2F6VWp4L2N6VG80MTJzeDdiNVhtd0JMMWlIMWc4UTJxaTM5L2IzU05ieFRJNk5WcDVFS2NLK2JMWFUvTGUvamhycXYzNXhubENXWHhJaDVEbXpXSW5DbFFWUmpyQ0RwOGNUTm1ZZnAyc1Vha2p3QUM3ZDQ2Q3VyNVZ2ZTQyRWR3QkNnQ2pHSzFXcEVpc21QdHliQXpJR1hNMDhRTCtrUmhDVFlhNWJOWTlrOEptbi9KRTlpVUxBTnFyZVRtTThqMFEycW9vckdkTERTaGdtWjBPdTJnMDJpWEhSTDNvRVNiVXdQYnY2TjlkSURtdEplTzJHRTJCY2VqUjFpZTY4bUthWFlRMkc2eTdTZGNNcnJ2MGg0Nm5oZHhMUW1sZ1pjOFVRYnF1TDZUL0NMS1oyUjZ2QSs4RHU5NFFDNzhyVG9IRC81aGRNMll3clovaUxSaVhUTGhJNnVzOVZkN3BLWkgzL2RGL1E3QTN2c2JJUGc4SG9Oa2ExMmUyekJ3dVl2YkdGUjltL0Q1R0sveDdMbVRuWmp0VzdCZjI5dDZXbkhxUWI5Zi8rZE0rbWFzNFNFNXlMRC8wLzZMZmVlY2VnTVFZa2wvQVVRNHFLN2UvVlI5T3p2bjdxUzZ4TXMvTzI2QW5CNjdLSHVmZUJaeVpiQXMzZzlFMHBTU0ZKTkNhVnpqcFA2T0VZZjAwVFF0RU9CUS9TZ1JFVWdDa0ErbG90N2FmWk9SSWdoaTNxblpUQUQ5ZEZxeHNuWkk5b2RVNXdCazZraVNiVHlhYjBpRTBaOFhrbnRFcm5VZW14L204SHZmZ3YzdmZZc2xlWUhYVmJnWmxqQTVKbVRMSnZtL0lQZ1QvYkhMRXMrTW8xenluVzAyWE5FL3g2S0VTLzZzL0dpeGk4YUFzT2NldUFadzQycDJlWGpaSEIyM3hOTnlhUzA0ZXZxRmRoZktWTU12TDlzQi94a2g1NkFaWm1zdFdEc0g2aGdUZ1dJVWljQ3NKZFIvZ1VOWVMvNGZQQm9BUExoNWJZS0RpSng1U2xpSnVWSHVWMzVOdFJwS0ljQ0VnNExGS0w0ckt6bnpZWlBGYURBdXF0SkdGcWQ5S1RISzBEYUtXOGdLcFVDVnMxQjZ6OUhUMzVSQkFPRGhzOHUzOXc5UUM4alVaNUxTZmc4dFM2V3lESGlackltV3JYSHk3QnErYVYwNU9FVlRtc3FDTGF5T2xEQU1hS2plZFVaZHhZWUR5QTh4MU5OZzcrOFU0dDFkUldsb2VUR2VwM2U0Q0xyeDVDOVkxSXpDNlpUYU1oQUFsYWEwdk51MmZiVTJ4bHFPZURYQnZpK3dLSk5TODRKamM5QWw5KzBvdXpMQkdILzd5SlJZaDRhelBLZlVKV2tYZTJhQXdEQXlJMThMM1pKVnNjaHZIeXFHaDZaeDBzNy9nZjRXSzVIWjNLL3FXaXVKZEg1RHd1YytzRjBzbk10dEwvemhaOGU2ZnoxZmdmQ1QvYURIMS90RWJyb3NKbzg4VGxQdFFRUDQzRG9mUVFzUzR6U0lTVzUydThqeVRGZ0w1c2FrSFpaaGlDa1RBRmdFNXdITTRYR1hnZjJ5YXNpc2tQc1FWTjBnWFJZaE84N0JtblpBVGVBbWRyQUFjVDJVUUxyV2JoaVBpalBLYlhkVCszNEdwUXZ1c3VOVzlTRW1YRkRFcElYT1BnYzFTSmVCcUZGWXg1M1crM2h0OUlhVFJwYVNoSkNUYTYyYTJ2M1dIVzQwbUpiaG5xVVNsWUVtaXRhUkVMZGx4N3prOE11Wk1VcEJOOXlSS3BsQXlUN1dEV29QeUc2SEFPVU5SZW5PdmVQR0lJSk9KQ3FRZ3VQNUhDdjBUSzM0OEM2MFk2SmhHbE1vUGl4L1hhUkp4RWdWRFpVL0hqR1h4SWl3ZjR3QUVWeHhIS1NkR2hOV2xDc2ZqblFveFZOME04OVF6aExTUlRLSWdhd0tkZTVjUGNVSTQ2TGIzNGdpbDhmT3dVbUVLQnJDWENqQ3NHdmRicUtJbEtDTkpHTmtvME1Xa0E5QnBwbnIzdDliQzRhVXdpeDR0cWRsR0U4dzh3WTRySzJyMVdRQ25sTFpFVlp2UkcyYTZJcHhaUmFxK0FsYWx1UTdmSHFDQkNQcmZYUnBPUGZnTmVUSzUxRlJ2SHo3RnR3dkZzTHE1M2Qzd1JQV0tKTjRQc1gzZlo5UGxKSU0wMm90QWNMbGNaWE9lR1lzdmU2SU9HZFM1R0dUQ2NPR3lacWtEaTRsVDJHOHNzZ21FMi9pQS9CK25pZmVjdjdpbHNmMVBlQTJ1NmsrOTIwTEFMbnh3aXVVejNYR3F1dWlCdFlzOGF0dnp0L01aNUFuS2pDTUhNMnRMUkRIU0Q4ejlTWTJueTR5bjJQZEQ0TzBoWXI0Umc4clhmN1l0TWtaR3VEeitRM3doU01uYUNyakNKZXduNkpZb01TZ0x3RnBqMXdRUTRDUmRXSzZhTUxXUXM4eGhORjZSR3lmcWVySHkzTElwTytMQXB4VGZ3Tng5Rzg1djRsc05yelZyTEkyeThiallqSG52UFo1T2NzcHBMa3J3MXRHdHZ3K25BUzVOanVhcGsvUWNnWDhLdE9rUXUvUHZkY2Z5TjNiMjl2VjN0NkptNFcvaVRpQUQwKzNIOVJxUG8vcVNDV3BhV0NBRFNQaVlpdm1xdUErdHQ5Y1ZnYVRaMCtKTDF1VncyeTVvWG5jTGpmLzkvRUpxYnhyY0dMNkNOc1ZIdFlMSXlSR1g0TVQ2bjYzczdtOC9ITFlwSS91YWZEMS96UDNuWjRZMS8zR0QvVkZpY2lJMDdlVWxRaUdJRjNPcGppR1JpNE5mOVluYm9qdm1pRWFETG80bEZLUE10TyttU2h1WkhqaGRrMlgyRE9MdG9sMFdvaGZYMDJKWWZiL2w1dVRjbUFMYit3TUIyVlNndzM4UGwxZUliZ2hOMC85L2U3a3BMeFBVM0s5OW54NFJXUEJqeWZkRzJmQ0JhZlcvUFFkT3U2cEdUZ25CQjc3dWhOeXJOUXorNGVMbXd1Z0dmM2wyNjAzQVQzL2VCZkIramZrLzd1dWJ4OXJZdy9kR1lBdC9yWEF4UmRjL3NINzljYVgzbGJiWDh1dW0ybXRZWjdMejdhcGhPVE1lc0llczBTUDJLK3RzN2p6ams1NnYyQnhBY3djLzd1WStMTDB1QmFUSHBLeHBITDhTOXFkQUl1NjAvOS8xMTh5TXljcEhTcXpXRzhORFhlNWQvM1lxM1BqVkdWRjIzWTcyTGRhRUd1LzYvUHhKdjZzcHV2L1piRlFMWGF4d2hKMHVSMVpGbXpSZFdYTG93N0dVRDFVLzB2QUIwTWo4TUpscS90ZUZpVmJWbG90aE9JbDArakJyYzJEZGNVYnZNSWZsNGw2ZGVFUjByQUVyNlZaNm04UDhGdTBpYnR0U3cxWHdGZUxGTkZhMmpoci83YVhxdE4xTG82Y2lFaERxNDFWaVJFZ21vNjFXaCtPdnZvL0JoN0YwbS9MREt1c2MxQjI3a25NajhnUUYrSkVoSWlxTnBra3NaVnlJNTdvTE9sSi9SWXNCZmkrOGVkTmJVRnBHNXU4RjFsbTB1cE5UY1FLQy94cXVWakRYVjAxamRpeXJ0NEVhdlMyRmlvaWN5TUlLOXNSY3RYVVJxSkRoU3kzVGp4WXBQQzVaRDIxeURCY1JOQmdydzdRZm5JamZmOWZNOGFYbmhNWXVRTm1BTVRJOFM0T3BHb0gza1pLMHJWZDlpN0F0WVJ1eDY5bFpQaitXb0U1SGwwcllmMS9yY0p3ZzEyck1kN1NyK25Fbk1hL0Z6c0FNaHE0MWc2UTBGVGVVUWVaQkZ4QVN5Ym9JNEgzRzA2dE9zMGFLTWtwYUNFa1N1Z1RCSzdpU1JPbU9xNXJJT0VvQjYxcENVdkREcTNTcllTZFlPaTRWbWkyZ1dZaVJWblRkV0tTNlFDcHlpbUp6TitvRUUvU1RQV1FjVjFiRzFXa1pNL2NHbG9hQjZSMlhyTTRVNVFaVFlaR3VTckt4OVlrOFJLNjBTeEVURTBVSkZjdFRvbkxSL1dYcG1sK2hTdXJ0SGNTUXVzNDVGVUFZcUUxQ21LMmRRNXR2S3l1NGdoTXkzM05UQVEwQWxSWGhSYWdyVnhhQnRsV0t5UnNVcC9XQ2JwY2F6Z0E3YS8wbGMxSjFIeUVkeDdxMy81My8vN2ZVZUZudHZFOXRLOGhHSnV4MGVZNUl4M0EyNWN6ZEJieGNuNHdCbUxCVTdieEdJTGUwTzR6d3QxTDBGMHp1bW9WMXcvUlViVExJdG9jWXlZbllYVFNUcDFSbk5qSFd1eEVzNDFvc2dWd1lHMWkzMHJic3hKYU13czc1aC9iWnFLZSs1c1dWMnZ4TksxYjNGZ3pTYTdLdU1OWEc1M0tnTDdTNEJRR2I5UElFTVZRRDI2Z2x4ZXAxRytqcHhlaXE5VmNSd3V1VEFldVZCZnh4UnBYb3VGK3NkcUpGT0JYRmE1UWhUbEMxYVdTY2grK215amxLRWhGUHk5MUhLa3pKeXR0SWlOekxEbDFUUG1HSm9aTWc0UkVjalF4K0ZTUm8vREJrZmt4RnhaNmNvaENnaUM0RmJ3L0FKY2pCYWVqQ0lzNUxXVTBOR0ZRODZpNmZ2cmtkRnIxbTBlN3dxWHFHcTRHYW9vQmxTSUZwWUlEQlVYRXltZ3lxUU5TSllkZGwzQ1dJUWFCWWtjaDVCc2g0QXZBWnhPaEdnbzFqcFVkcUhHUkRIN29XWlNMVFZab2xndExtdExtMDZzKzk2ZXpUcWE3czNhbUo5Vk9kUzd2N2t4RlRHdlA3dkdzbytuK3JMMXB0bGR0T2F1T3FyM3F2elcxR1A0OWRWZDlnRUQvcStRcWkyY2RUTGRuYlUwUHFxM3FuTzl1VFhXUnErM3dlSmUrcEZjLzNHejdaZFNPcUlqWFg0Q2UrOUNOd1d3WUZ0RGx2Y2FXNHNJbG9wZXJiMTk2Q1dPMVBsN2Q1SDRXdUdyeWlia2NtbndwMm1zZnFmdVZ0Zllqam9JbGEySW84OGxaeDg4RVJDOG44akhXa1NwWXFrWU8xRnlWUXJZYm8xSWx2VExQQXc9PVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yX19fID0gbmV3IFVSTChcImRhdGE6Zm9udC93b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBQThjQUJJQUFBQUFHNUFBQUE2N0FBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR2pJYmdTNGNQQVpnUDFOVVFWUmFBRHdJZ2pnSm54UVJFQXFDUklKSkN3b0FBVFlDSkFNUUJDQUZoRndISUF5R0ZodFNHcU9SRVd3Y0FJVG91d0Q0cTROc0RKVWEvUWRFSXBITWVhVTNuNjVPQmRzVzIxb05kZTlQMk9aMW5xSHlGMTBnakpCazlpZisxSGNmS1RIbmt0WnhnOG9aVkd1VlVqc2RSQjlCY0dtemwxSXhvUUJGQzJDMUNQUnErQ0RWdmd1K2FTNC90UHo5Zi8xWlNrUG8yZDJnQWsvbmhXV0h3WUFMcHBuUisxN1FOMDIyQ25HSlN0ZGNCZitVb1RwVm1TdmQvM1kzWjVFM0JQUDdFL1l3NmZDYkNXSVNRVXlDMktFbFRVZktQN1ROTDhwRTFaODIzOXFuWFR2ZUVQV0lSVWxkeXNwNld0bVczdTZQTEFkVzl1Y1Evcy9lNEFhd0E2eW9vdW1CRHhDclhIbFhYWGxGWGFjOW5RTTJSREZyS3dGK3FzZHc1ZUtpbFZFS3htMGYvUUdoR0l1b0wyWW5CYUhuaVFEV1pBckhpRUl3L3pYNjNJVmp1NE5IUmdKdlhLTXBBTjVjazVrUHZFVm11Z1o0bTdUeUl1QmhBQUFoUUFGQXFNSjFndkUyMzJwZ2lTV0FPTG9SaDBEaTR4QmRpSndoeEowNWgwTFdqSElEMk8zQVlhcWtmOWFHbk54TzU1YXZQd2RLNWpGRHBiWW1QemxPSlY3UjB4ZjRBbDlRRUJ3UmZUQ1REVWNUZ1FWc216bVhQb0RaY0dKbTRtK1VKNU5oWG8yL0x6MWtGRElFdGVCUitMN3V1SDhyQVhRZlZDOEFlbEs4YzhodUIvQVFJWnZSMTJRSmZSa1I2ajZtUEFjaGdLcDVUamtDUVAvQVUwT01sNXc1RzAwRFVORWZ4b0FMejlNRDBVUUE2aGZnc2hHZzdLeGhMbXNuQkU5a09BRUh1YkY4YUcrNGJINjQ3YUc5YkJvNE5UREliUWZydEpvZEtnN0lhOUZ2NGE3LzFtUk1XZVhKR3dDckloVkx2NFJ4cWNLeW0wMmZzRlFUbCswOUp0dFM2NWxra1ltMCs4OXVOOE5weUtQVnFNVWN5OVZZWVpaeE9rdzNSYS9sY1VOWHNPQ3Z5M1F0Ym9aNTNhR3VpWFU2L21rVHpUYmZVdXZVNmpUQkRFdXNkaG95RmFuUlJHdW1MSldhZFJwbnFya1dXbTZOR2owbW1XNis1ZFk1QStOTU1WTmwvcS9QT1JxMDA1cHFsZ1ZXT0FHZjBBME4yblNiWkhhd2FDajRxOVpsa21ubVdtQnRUaDhzODRjenRjU2Rtayt2OEI4K2ErYU02VjJkSGUxdHJTM05UWTBOOVhXMU5kVlZsUlhsWlpyU2t1S2l3b0w4dk55Y2JKL0ZjakdmVGZOdzYrYU42NU5NL09uSjhYZzA2Ris3ZXVWeXI5dHB0NXFQUFZqYTJWNmgwMjVTY20yeHM3S3NVcEtXWE50ZFdkYllLS0VKUHdRSEhjRVB2TzBOZmFOdXJCWERGaDZDRyttV2ZCNWJZa1U2bE9xMFVHcmVyRGZpM2lEejFJalZ4S3RuakRHU1o4M0xkTG1WZ01ydHNNUHRJeSt3TTdPZWJSZkxpTjB2WlFMMFk3aVVZSld4amQ0azNIaC9XZjUwR2dlZE1CckhsdjJDMzVRTTdJMk5RKzAxSW51WnBoYW9wQ0tIcWQ4OU8rVUNwNmJNdzFaTGFYZHNoQlZHMG05VXdBdjgrZmJYQ3JBdEVSVHp0Ty9qV0k4Vkc5ekVvZWMzcmswY0t5eUpGTU9oZ2N2dnhMWlNUZ1RWVk9BUGcrVDExMUhtaXh4Z3Z4N3pQeE5TR2FxU0Z1RkZCS3p2UGNJVkVaNmRydmJxdlVQUGRJb3BQTjN2UEVIeTJkZ1dDSGpmd0htQWtLTW96OHh6SEdXVUV5MWVnb21jeVhYNUpjeDRlWjl6V0VIQUxZeHNndHI1b0xkM3BOL3kyMzZQUmpRM0lWcjlQRi80WDRQU1EvZ2x3eEZDMFBuRHpuSGRKWDdORk5yaTRaTjFpR2VkZkk5YWdTT1ZWZVFLalQvdHVCWDdIOC84THhuczQxeUlzM1ExZWtDbDNFaDB3SEhUTHZvRXhBQmdkeERES0lnVWFUZjh5UE4zQldQRkdhbjNZd3Y3Z3VSNVlWalN0R254WGlQbGVhMFh5MEhXM3NTbmY2bzNYSEN4MldGalM3ajBxalloNHM2TW00SFd4UkRzVktlY3pFNW91aWE0dEl0S3pVaXAyemFYK0ZWd1o2S0lFd3JXYjZvM0U1TEsrcDFpVVVWYVZLbFQzbEp2ZVJ1Z1c0RXpQUCtLRzl5Z3UyL0hscWRFOEgxL1pwYVN3N2J3bkVNVVZaTUVWSzJWdTNXbFRJMEVWMTI5VXU0TmtyL20raE5mQlp4R01XeWpIV3N1bitYbkFYVnIyRWJ5amNXMnVraFZHbXA2ejFXQkZUUkVxRlFNdk85Mnpta09QNEJnQW93NHRWa205MlBHbVkvWkpaN3p5Q2YvZHF4cGxodWFpWW1uWjE3dnJGZksyb0U2YlgyRWtxdW1mdTk0dGd6NkZ4YW1nYWZJNjhOV3Q3T2VUV3JKek15V3Uxa0syTWZ0Y1E4MzVpeE1LL2s2SUNxSDN0SmNtczM5UXQ4dmhIRjUzRWlJT0lQMm1HL0U1SkZQZnE0VCs2dHI0WnB1cHRNREJEOHBWdXRJK1dFV053eHVpV043b3h4ZFE5SG0vQ29EUWdGclFVdkpKTlcxT1lpaDJoOHZzdTV3OGxOakJjSnBTMngxeGNscjVkeXV4UjJuOWcyWWdNZThCYkZKemVnT1VSQUtBWUhEeHBxWXlUb3Q4d2FHUTYvdTI4VERpWmtubDhlai9SYWtIM1ZCSC9Qa1pNRzJndmppRmRZQWx2TjlCWGNCSXc4d01SU2h4MW5sWmtPS0lCMlU2NEQ4cE80NXpoZXdWWjRWS3lqUHFWSDBFR3JjYmhwc2hXYUovWW5PNnk0SXBzQ2ZOWXRGVFRnZkhDUWZ4U25Ccm8rbnp1RkdTVUc0MlVsd2JLbEVUYXB1azVzS09rSjNKaU92U2NnY3hDeDBpT1F3aDlzdW5kOWtiRGl0dmVzRVJoazNtQUJEajBOc3BHZVFQZTQ3ME15WENlaUFCSTlrRHhLVlpSR3htRTdvQlcrdDBiQ1JRTWZtV0x4MFJ6dzJXQkE1cFNYeWJLbk1maW96SnBYNEdjUmd6QjBueFZiSm9yVkpKYjFpZTkwaEp3ZFJmTjhJUGpDN21LaWVqQU9pTG5oQkQ3OFMwUWdZZGNQbm5PNWppdUZncU05czRNbUtGSUZNWmlnbDFGTThvOUg0T0xkeEIxTExpWmRTeDR3TWlaS1pkTGs1THMwNlV6cS81TUZHTVJ6MG5qakxHMUxiSXY2K1o4cStCNWZoV2pTWGpEZEdjVWMwT3cyYURmWTRtaWJlV3JhYkJtRFVQeWNjZGJHMUwvcmVzMUYzaE9EWklhU2JySnFRYXdydVZBQnVhNkJUV2VBeUlDM29GUDlNb0UzeDhoWGkzb2xROTNyR2dMUlBhWDh2ek5pdERmTXY2NTU5RDNqWnZBNmpReUJtOFJzN1BIRU1HUHYxdVd0eTJhUWNubFlyT1FpWlNpdEgrUmUwYUc5cU14VWkzc1ZFU2hOQ09KOTdTL0l5QkpNaEdFb1RIVTlpUkxvRXQvV01WaXVwMFlVQW94WHRxdXR4eG41dFl4amU2dW44UVM5MW1UdkNlbDVBd3E5QWV5eXA4TStPVnc3UXo1NE1WbHp0MkJzVHAxVlg1VjFRbGZqMFovUG1KYllKaWd3bjNsd3hrUDh1SmFRaitNQVBQNUpGYWtDSzFyT1NwWnVwQ2gvZG5NTGV4QWZzWVpJZCtjdFp3RGJPUjJGWXd3cnh5ejVpclJKakV1cUhqZjNhM0hWQjRxaUVpRi8xYVpmYnhXYk54QTJrc2RwNUVxZzlodlE3QU5lZDU2RDgxUTdtZFVFaThrbmd0YXVVWXpBajZsbTNLTFIva2pVZDc4TWhRWGFKSFVtSnROeUhVVGxYeDQxZ3dKT1EvTTIvNDg1NUJEdkhrK2RCUkdtL0cyYnMwOG5JWEpMUE83aVN2M2IwWmVMWWY0UGVjditDaWhuV1dXZFRiZHlIT1lwMnZ1NnUyOWxWMzNBdDNxdmswYktXYnVjUXBTNXNGYmFkcmFtREh6SFF1UmhxUU9lYjRhRk01ZTVsZThNOTVMY1laWjVMcEY5WHJ4OFF4WHlzc1k4bkNQWkEraFVCVnNYd2F1Q1loWXZsVnRwakhLMHRIY0hOMFU0QjF2aTBmT1VGTVg0M0U1VGo1QmwvcncyQkZ5MUk3VkhvalNEY1VWbGxaNm1kVlQ3SXV1aS95MWswNlVnRGl3TGU1Yyt0UDNvVWNKTy9zRkFQaHJYWFBmVWxnQUt1M0NjeDJGc1hSMVMxRXc4SkJrQjR1bTZzN00rVVplRCtNeGtKZS84aDlsZ1hEQVpaTTlDV24zZWhCYXJFVm92MlViUlZaMk96c3lnQkVrbHRBSjkvby9zNzJCYUdsMlgrUGJXSjJuaGJ2aTFCY3oreVRJZ0Q0OFpHeHVIaFRmbGdRR2k2OUJuUlNRbVlpRVl4WXQwdE5jSllPVE5saHN4WFVmdzNwT3BXaGxhRjJ1dlhVY3VOWlFHRDNtZFU4OVZhZEMreWlEV3U2MnVuZmFINS8xb2QyckE3RlFaOTEwck5PMUt3Y3VIeHYzUWZORCtmVkU2ZENzMS9xbzBXR3ovMjFwQjFEYUpYVVJjYjF5NXBPQjVjL3QxU1psTGorRHprUXRYYUJRMG4xSnFwMFpPOEt2UGpKL21zeDRjeVQrNjl0eUo2aW50TlR1SUV2L1c4STdudFVmdVdaSm9haWI3ZTdPZnVsT2FRQXh1eWM5V1pJN09TSjVnTjE0dE9HT25TUDZSUmFQdlNpZjkzQ0tKMVdlNmJaWHh3aEtJU0FCV0FmdXdsaTNnQUFLdlN0NXlmN0xrUGJFQnJyRUR2Qk1LV1VDNXoyVUZUUGdZSVFUUmhSK2x2ck1PeWcvcjN0ekJzUmdDOEtramJDcW04ditsWnVabENMbFhJWEFBQm9BVTJMejFjbEdMaS9VM1hRQmNBQUc2ZFBYd0ZBT0JlbFVQb1g1dC9kL1d1Rlp1QXdrRUJBRURnaDJKRzc4UUkvbHJla1hucEdrUi9OcE05NXhCNzFQU0NKNnpLSnFCM0VBREdSTllxc1NpbXBHWUR1bUhTQnZSVU43SjRxNXJWMjFQWGd0bUl1Yld6S1liMno2WXBuWjdONFBrL205VS91TE01dU9FK3k1Z3lvaGREQUlhaG5ZMUFQNlpySmc4NVFmK3hzZkRIRFFUaldBdEJpcFdvb1pFclc0NXlQSEt5MVBGRVZsbW1DMUVTcXlKeEVkSkVsVzBWMnVlSzVXR1U4WElCS21LVlV5Y05qM2JTeUxjcXFUaFAwcnVlTFplTGM3ZW5rOGpZdXBEQ1kxVnMyd3RreXNybUxWS3VqRlRtRzVlZHorVmNFalZNM2p4TmdWd1pGQ1JrOFhRdlE0U29JWm1VSzUvUEVFL0h0QzNMbzZJTkxhTGNzcDNHeStkRWRFdnI1YmxSSnNQSFZHSWRTWFM2QWhKbG1tYXBFSU9ORkNPbGVsQXhHWTN4RjQzbXBFTHRMbHdtUjFWa0txMituUWJrcTcvZFhKQ0x2cU4vT3QxN1d0UzB1S2xxS1o2aTF1REo2alY0a3ByZ2llcHplRUp3UE0vNFlEVWVGelRQMkVCVDNCdjQ3OUFHZU9DZUFBM3VEaUM0SzJBTjdnekl4aDMrQkxmN0dPQTJIMHZjNmtlMCtLekJ6VDVFazg4NTNPaExOUGl1d2ZXK3czR2Q5emxjNjAzVWVCSFZYbXBjNVptTUt6M1g0QXBQb3R4OUVDNXpuNEkxN2tScEhKUjRtR0lQL0FWRkh2NjQwSTBvY08wUDhsMU5ubW9FdVNxVG8rTHRrNjBhanJPVThoNlpTbUtNVXJNR3psQTY0SFI1Zlo0ME9SRVU1cGFDSHlTN21Cc3VJMGlVbVlsWWdreHNSS3J6ZUdtelU4bXdFMzhpT2NOUmdrb3dGcGlSZ0RYUFVKQ013NFNtTC9MbW1xajdWWThXdXVCUnpzUmxKNkxuU0hUdGlJNWRzN2JET1R6RWdXamFFNDFnTmZiekNjRytQdEhZdzEyTlhWWEpXQ1d6NVNjcTZaZFJ5SkZFYm1HVC9DMWNiRnl3akQ4QVM4VWhXQ0xtWVRHZktBdlhjQUlmTEpEd3VJbk9QSFBzaElsSHVjT3hnNTBydHJlengzWmNnbDM0T0lIbnlWVW4ySnc4bkF6aSs2R3Y3eXhjektQTVhFeWp6T05NNDR6a21aU0xMRTdFVFdLYXhBZUdOaUhHcVR6UmNvVXBZQnlYeElYZU9QMGZaNEpESU8rcHQrb2Z2RTMvS3laWE9sNjNkYnk2YnVWNDYvVEs2VU42dXpKQlJibGE5Vyt2NDdqK2cyT3VWK2doZkFUaVF4UGdWL0JSNEZmNFFRYjFGWENjVFh4Qy9DWGYvdndKOTFkNytIUFUveHlCR2xTVlJGUU9mQkxSTDZsK3BKWXI1OXhISDZubEQ3eEVib3JkNjNRZEN3TENtRW9tUWNPYlZyTzh5RWhpc3llY0pERnpZanE3WksvNmJnPT1cIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfM19fXyA9IG5ldyBVUkwoXCJkYXRhOmZvbnQvd29mZjI7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R01nQUJBQUFBQUNTZ0FCSUFBQUFBUUxRQUFDUTdBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdtUWJoVG9jZ1JvR1lEOVRWRUZVV2dDQkRBaUNPQW1mRkJFUUNzSkV1bWNMZ1VnQUFUWUNKQU9EREFRZ0JZUmNCeUFNaGhZYjJEb1Y0MWlUZUJ4QURMOHNvaWdKcW04U1JZeHh3SWJNUnZiL3h3Uk5SZ3p3dTIxcVZZNlhpTFRHS05IcTJkcGI1MmhHNDkzZDZzTVZ1dWd5MTB2akxBK3ZBRjRQak9Ga3doVldnY1YySEhRSlJlUlN1VWxvbCtOdE01ejkzc2JSZk9ZYnVrZ2JIWlorUGw1bDljeXMvR1BGcjdvN1ZhNEhDTWRvYUNReC9hZWNXZTlYbFVwc3k0U1MyeTAxdU5GMmQ0QVVCaWR4c0dFSXRVUmVJQy9Da2RnaG1Ea3VBQnozeElmTFJnUGdybkl1UjVtWGxTUUtHZXZrSEx2UWxBb3RvNURLcU5nWk16SjJKSE9FdzFuSG5WdGovL0JqMzQrRjUvc08zN3V6YjVhQ3NRZ0dxRlJxb0tWVEI0bDRRSE04Z0VIK1lPUmtTYi90NWlZdENvMFJLQXpDS3h5NzkxOXQ1Y3hCQU9kU25lVEFkMzdwM2RTRXN4aFkwdVY3UXZhaVVuUmNSL3JwbXVlZ3J3d2xmd0tBMy85Yy90Yk9EWndWc3RKUE95OWNBSGpKRkczaXkveEJBL0JDRWxnMGdneTMxRnlKQW9kNzdnbnhRWE93Rll1U3RCWUFyYzB0MCtJZ0NBNkMwaEJJd3pjWk5aYmMzejg0RngvK2Z6YkxUNnU3QnJRekp0bWNXZWVZTU1nQVE0YytPUVpoMTYxU3FhdGV0NmJWV2xDTjFuTzByU1hOWWk5TGkxcVR4aWo3STJSMGNxQVpHWUNpOFg0TWdiT05mNUNHUDBwL0VJWWYrc2ViajQ3d0FmQm9lUGc1b0REelNKWk5zNFN6K2M0dmpTZGx4c2s5SjBwcWpPc0kxUmpqemw3WFo5bHRUVm5oakRnM1FZTDAxMnRzWlhBUitlcUlJQ0c3Z0tkODFKNGdUTUpnRG5pblM1K3VTN0p5dUx5QUt5cXR4UXEvT0tGYlhIYWhlRWx5Y1pYQWtOSEExQVFjUVVua053bG1ZOWdYM3dONCtLUXlBZmJYWlFYUzlmejdBcEhrL0FlUm9PRDhsN1NpbkgwSUFINFg0VjFzQU9nRGsxQU1SU1ZpeWM0ZHdLOGhWdEthSGtTN25ISEJreHpPSTF5a1BUMDNPbFRMazhSZThQTGh0ZHZTWThDWUdZZXQybkxLQmRmYzhjZ3Z2QmkvOGM2WHZ2UC9Ebi95djN0MVFEcW1XbW9yVWhlOTlETklyQVNwQTBCWGN1VXJOTnM4NVZaYVo3T2Q5anJraEZxWFhQZTRaNGFlemlWdmVNOG52dktEWC91RHYvbjNBTEFGb0xyUjBrRnphVzJoRTJOaXBpTGluM3k5QzBwWDc2aXZPejNkNlQvd3o5SlVuNlh3dmFPQWo5SVRUMXJ5eTZiclgvNktYNlFiQ3I5QXA0aTJxV2gzNE00STNJVlQ5V3hxWXV2ak0yeHdRL1c2OURrbDZnYWM2YlluU28rY2RwdXZkRE4xaG9HZXcvU29vV3pZMnp4ZE9UUmhvbjZtOTBTblFGSGcxN2l6ZjZ3KzBXdHhjKyszU2JoZ1BGd1BDQVF5YklzOHdlL1R4alpJWjJQc3RsUVlJcTJ5UFBuZDhiWG5GWHpYY2pmdXh0MG12ZlRRdy9aZURCTEE5R3lkc2Y1K1ZuSXdZUy9mZENuQW1Kcm1FQk5teDhoZUJaNjJkNEp3RmY4bjdOTUlubzV0VHRxYk9GVUFRZG1kdC92V2tEUVlxUG43K0ZZUHd4MEhUdEQrY3pwUlJ4RmxucHdkOTN3QWJUUGFBTkFQQUVDY3JpMEE4SWhtaWhwTzJmV1ZackN2ZDFHbWpnNEFiN2pQTE9xSS9xdXNyck8zMmJWcFk0MWZiOWp3R0FCNDRNK3dWWld4UHdCT0xGRzJENjRVSlpLaThNYmxLWE53eG14TmU5VHB6V1RtczVDVE9aVTdlWkFuM1EzL1RudWRSVTJtdmNObm5zNzlkMFNsUzZjcjFtNVZHellkNzFaVE90QWp0ekY3QzB0M3ZaQXdoL2diK3gydjI5VC8yVmo0eHJjQWZjMkRxdjFhd0RXK09ucDlaOHlvRWVpMDZMRVI1bmttcWJTNnZGSy9HN0pwT2FvcEROTXFNMmRRaHdaOTFOcG94MU9hQmhBUWFnS3lYYi9STEZXaVdLR2hxVEwwT3lpL3JGeWpMdldkVGp2c0JwRWNaV3EwR2lBbVY2dThjb2RlSXlab0xTclRvcHZ6WTdTVzNUd2J0WW5rZGZQRHFpaTFHcGNhTkc3T1ZULzdOUDd2VTY5WnQ2RUIxQ0dCVmFwSk40MFI0NVlhQk1pdUN5bHZRSTFsN2pFWTNPbnZhMnBzVUlMWDF5bHFhNnFyS2l2S3kwcEw1TVZGaFFYNWViazVNcWtrT3lzelF5d1NwZ3ZTVWxQNHZPU2t4QVF1aDgxaXhzY3k2TFFZYWpTRlRDSVNYQkRXUVhWQ255bXZtY1p1ZnJBNk1kc3FyaG5tYm41d2NyWlZqdVJ1cU4ybndYRkhDTWRpaHhPcEh4cHJ2V0dMRU1LdjU0MXhxZXV2aHQ1b2lvd1U4dTNQTlp6eWNOd0kxYm9DRVMyY0JVcXJYazNyUndOc3QzUFk1OXl4anUrdjdQaUJZOEFPS2l6SkJKelE0V01KM0UrMVE1UG8vc3JLN2k5OUhIZWVzZWJZc3F4c1hVbUQxWmlGQjZjSmE2blM2NEx0cHV4Z2JkNjIvb3d6b2FzUmVDdHIzek8yd1h4TWUwd3pscHB2L1FjSzhOYUpJSDJlajBRYkkxcGhFeFlud3FOWGpUYWFscnpQOGZrcUx4UGJkaXN4N0VwTitzREpGSllmT04xSWRqRHlQbkJHdmpKaXU4TjluOGJUUVlKNVBQUVova053NTN1bDRuQjVlT0pyTFc5eXlPTURFaytTdE5jejRTM1gyR0dCTU1ZaVI0Z2ZpS0RIeGtRMXBQVEVtRFkyR0ovME5OL1o3UkNNTUpxb2RacmdsRmU3ZTBJSmo0WEh3MVBNWnBWRXorYXJXZlErQVRyaGhrVTJVV3pBSjYyN05MaVdWamU1bG5neTl3WjR5d2R5T2NWd0xKZXczNmxHRC9TMFA3alh5RGNMTmxVT0ltcnZyMzlDdTFVbmRzeXhUd2RqQTh3bkdHWEJHNzVuM0pET0VFNkZibDB3MWcrSmY1aUhsdlV1U1hobDJLZHNWbCtxaytNOEdPcnVjZFBPNUdyUHRIb2tDRTc5RFY3VzRPcTY3Z0wzK3d2dWhQZDFET0VQcHY5c0xBN0loR3VKNHBpbnFxUDdXb1NOU1lKOCs1RzVuMGo0NWZaaSt6VmkwaG9aemRWOW1NMzd1V2Z2S0hiNGtxbHJRWG5FLzhnMTE3VC9SdGQ1VG9Sd0pCdXo5aEhlT2tLT0VNMzdKZ25zc3Ridmw3TXRxaE9PdVlmdDFuQ2N3cWR1OUZ3OFJoZVNEdmZRL0U0UUYzRzQxME5yMkdyMmR6ZjNQUFRVWWEyVFVaaGlRclJRZThuTE1QR0tlem5TRXVFWXdpZmdOQjlwMDlCL2xsa2phajNHUzU1S0N1L3FLaTJpb1lVMzJsK2czWHJZYnBVREt3WjJBMU9aV05iZG5iOVlUM3RtRDJ1QjUwOWZIOTdLNURFM3NWa245Q1VwRDBUSkU2ZU9IdUo2R2NVdWpIQUkzejBSUzB2dkx6OHVUc2pLbDdnaHRRbmM1enluenBhSGNSSkc0TmZSMFpOazhpbmIyWlVDaEg5RmtqUWdya2RaUEdQd25IZkZveUlHYTZTZXc5ZDVMeXQ2WGRZMXlqWTdXSTg5azVYdFRqeTh3WUVrYzJNOVJQQ3hxcTB0TU9KZWtmSzFlTUh4RzhFRU9pTVd6RzlLNFBJbktIZ0tJY0JPSnRhc25qSkw2K2haNkhQdHlCU3hGQnNoRi9WMG5zWEwwekZRendpcnNXSjd3MXZ5bU1JcEVQdEtBK0MwQUpYaHNEa2NVZDh6SFdZWFFRa2dnLzZDU2M5TGp1TUszb3FzMEpOZ0U1eElrVUZObTAzTjFwUENBa2VBbG1XR3RmMkpXdGZtS3VGeWNGRDhQVTBQdlUxNi9oQ1hxMklrZ3NWQmNHeXBvZzdaT1lubUJnQnNQMDc4RGFsS0ZYUmZzc3J0VVFHZWQrbnlVZitOaWxlKzZFcE9hY0crQkp3U25DZ21OV0ZLK0xMbldPSHFDeHFlMGFsR2dMY3lJS0FvNlljY0ZxYldNTFlKN0V3U2k0WHRWNHZORzFSUnNmVnIzMnBkdVZrV1NITExMYVl6TFhuQnllQUw4cEdpS2JvKzNLQ3dvbWM4ZWxsNXBCQVRVNjZ2VUxoREpidktWKytGVUo1Tk00U1JkenVaSEo4N0lYc2FPRTY5RjAyYUVGQkx2cVJETkJheng5ZGdRRzVsNjV2VVY3OHZpNHlFVkgyUnI1cXpVQUZkSTlmTThUblUxRkJOa1BzQTl6OTN5SEtYWTQrenA2SWxRM3drZUR1aUJRWVRqYjlvZEQwWGE5a2VyUkFlMnpNU1RqdGROeXY2akdnMENBeGlQNExLZlZ6c2cwSjZrTWNJelFQbHZsVjRJNElFVEUrV1BmeVZnYlRtMVRIVGQwMk0xQkhsZTZLZHF0UFdjSjJIbFdINUxwMGZDYkN4Y3BNR0VGWlA0VmI3K241cHR6T3lXOW5wKzB2Z1JXK3dKd1VIRkdvaWd1SmpWVVhSYXZHa1lpcGpralhnZ09UeGp6RjhHWWFhSUthUnViVjZMQVBSbHhBY20wZmIxbWtPSUk3UlZxMW1NQ0pCZDA1MTJLL05wc3RuT3FlemdyMVEvaHdNL3hyVUVScEtYT2JmNm9BVFlrbDdJOGZwVEJvUm16YXIrU2RKVTZYUmI3OFdWMDlsa2d3RkpzMGM3K29zS1JVQVNMRENWaFZwUnJSTUpNYUQ3ZXhNYUcwblZwMUlLR1poMngvd0s3eVpqdVE0QlRQTUNlL3lNZGVtSHBKRStyVm1zbFBaN2NNSXFBTDNyMk1aQnFWUjc0bHVmajFWRFh5RnNUa2RtcUVmWk1zaEVCYWZMTDh1K3ZyMGk4RGJYTHVsUTgzT2ZjeGpPWFI2VUhad2JKOVVSdmxWbURkMnc5ejkxY1hFRkt0YmY2OHJVUHhQLzhQTnN3Z2ZGRjk1RnZDY3VYMW9JYzhhQVZtempRZnNpZkduanA4V1ovSUpLTG4vcU5XajJRN3N6aHJZSUVtMjcxVXZ1ays1OXBOanpidCtoY04xUFhvVElYYVh6WFFsM0p5M1Nva0NaUS9uZExoSzJIaFYzMkhDZlVpSGt5L0d6ek50aENzcXR4WmJ2d25GL0JOakp5RUlYNGplYXg2MGt1T2RhcWhDbXZyZFhXNm1ubGZ0MGNHNld4cTBpdmRDVzg0bmZydU5DVEtnRUx0b1ZnNkhOTkM4NXhRYkhwNUNCRC9Hd2hOZ1RrRGwyOVVYL2ZsV2tTWFdYbEF6NHlsK2EzSElaVnpoZDViS01UenZoWEFTd004ZFBlOTE2UFcyK1VPcWZpQUhXY0NJTGVBVHlkQmdqWmJWRnZJVHMwNUNSN1NhNDhWcTA4cWNmQ2Q3Zzd4VWRSYlltMzhTL2xhamk2aTI0ajlBMTk0NFFsTUo4U3pMemVzbHZjQ1dYd3hHdTFicmdrZG1qSXBReGxlL09nZ2NHZ3pZVU9QWWhmWFVPZ28vWU9temdNb0I4OU1BMEVlUm5WZ3RyLy96TXd5UzlZejErZWs0L3NJODVsV1VhZ0xGejBiMEQ2cThyb0hhNnF5a2txNm9mYldPellzNEZ0M1NqSXhoV0phd2k3bGgwWVNoV2JxUnpWaTJrNGdUUys3K3BJVXRoTkNzb21GTXpHYktsV0xnekUzVnk1YVZiem5iM0VKcUpwZXUxQnEyUDdZOEs2M3RpVnJWbmNpSkNJRTZkemwxTmcxY2ZZQUFLWElLSFRQdWhpMnlxUUVtMUszME1lQkxWSk1FMUJjZGFVOTFOZ2tpd1NVSDlka3pNNHNESDJMZG5NRlNkaEZrN2FWSGxyR1EweGgzTEEvZEo0bTJod1JCc250QkIzakV0S253L01nejVLanliTVFqZXp0Wjhvbk9wcTJ2QUs3K1BSdW9zNnNsUkZJWmZ4ZWdQbFp4eHlNUXhabE83OVpWUityc1dOSXhKT05ZR0tWMHhNMktXODdHSk9wRk5sbWZlNFZVd1R3d1ZRU3hpcHNWNVFrVGsxV3Y0YTEyTEVNTHJERFIwYllvd2NBb3BXeTA0MG5USEFBN255amtJY1FZOWpCTTVlcURSamNKSGhwN0c3eEkrSklxSFpVVkxiTFREa21kbHdpenREYWc5WHROUGIrMlBJWU5iM1FCMWs1S3k3dzlQbklFM0J4dGY4ZmtVUGxWMDB4ZHovWWpBbU1yS29JNUFWYzZVU2pEZVZJRDRxOHl2U1ZnQjdDd2J4ZmRzWVN2d2pRN0VWREFWVWNEdUt6bDBCc0RUdU9jU3pMTVZiQWo1aEdsSFMwZVp4N3JYNXBobm1sL2FvTDhyRUJ5cUg3b1hJY1poeTByOWlQT0VUeGREUC9La0pySE1hWktEVENNNDBpRllhWmpjQTZMbnprd2VKT0RRTzNHcVYxcmlQNVhqTmtvSHZnVjV3TkFKRDViaFY3TUVyRXBaRmFQOWQzZmtJTHgzc2cxdGxiZ2NIdVp2cXJocXRVNVhrMURmTi9kQ3VVTWtTSEdGYXAwRHRXaVREYlk0Wm5yUGRoV1Y2MmZJdTF1cCszaDJIMWQ0MlpXZmxnWFhIZTN3Z0V1a0hnL1czdTk1S0RoejVoRzZLWlhueG9qSlZiTVY0YWR5dnBxYzAxWXdpc1ZNQk9wZzFRcEVqa0xZVk5wVFJzSGdWd2RnOGpLbHlxLzJnYXFRa1JHL3JFZWlUdkd6NzZ2eTg3YnpzbDhGZEVZL1NSSHhHY25QZ0JRS25zakowUHNURm14aFExL1psYUxJaENxWFZJcFV3VXJhQ3B1V25FaDk5YXdOVUhsRHZKT3JHQWNOdURMMXM0N2RqanlPOWw1enNvUUc1WUZlL1JTbktpaERSSUdlaGJMYmpXM0UwWlVrODRaQklhMUo4amw2NHY3cjZmNjRVeVhQUm1OWkRHSkl1ZkNUODlNRzNqNmlsaE8yMlJsdytNbzF5WU8rVHpGUklVSnpYMUx0RGFaRkhSY3hYNXkyaHRrTDRxeTFwdXFjem54VnFaVDdJTXkxZGl3bGlPaW1RT25EWWpZVmtNQU9wNlpxNUZlU0dpblo3d0Rybjh2Z0MzN3llVDlEVkpyM3BlK2tXT3lVY0NhZ1I4QTM5UlNNQUtQaGk4TnJQOW0xcWJYVUNmTTI4OG5uSkJLZGNQNEJ1UFRRWVcrRmx0cllNM1dYT0Q5di82NFQ4cnNkMmJxa1UxV2RmQjZpR2lHMW9NSlpVTllXK1hONXdpaTdnSmhiSDl2YXZwK0F4R3NvYmU4ci92R2Y2SVpYWldoZko2UTFDTEthbW9ZL2duZS9uZmFTQkN2bkM5VVpLbGZJS290L2dWQ0V5SjhabTJyaGhiYWhwNDFLTmZQTHloelJ1cHp0RlZyVHJVNlBJUlFsaXZlMGpwclNQME81d2Z1VnRWVG9tL1gxVmhDL0xmUmR6Y2F5MGt3Sm5rQ2Z6UlFudFozdlhSYUZ3TGNPbXlvMjI0VzY5QmxLOS9lNndrMGFRQ0pqUFVEOWxkYmR4cmhEQ0dhNVNMcnRyOWRBNlpaS0dFcVB3T2p3aWJJbnl2YzhTWVFaOHpiTDdNbzJBUTk5TE5haGF6KzFGYTIrNmpLWTRkMXIzcHB1dXBLVk5IdjVqNG1aZWd2NlhkTGxzYXJydUlMZXRuZHdYSkpZbmZvRWNSNTBiVlRyK2ZZNm9DeXpPU3U4Q1AyRjdPVXJOUFRJbE9WLzluSncyZDVuSVhDTXNiSmNjVjNFU09hTXV6QVhWWHpoWmpNc2JMcWpyeHVyVld3bWNoK0FLRjVBZGNNbUJYYlE2Uk85VURnNnVMTndET0IyKzdIcmY1ZGY2YjRTbUVUSUhjeVFha1d0cjcrL3V1ejZIUk5ucjJWT2JRdUtHcFlqZWpuV3ltRC9BWlAyL1ZEL3pTcDNoU25ubEprZXQ1SU9LcHNYYVpKYW84Mmx6dGRKL2E0enYyREhLRUxXc0p5TVVtQ2lFN0hUUm5PczB4RVl4SGtnYndzYkJkeU1hVytSbVVhOE5nVTlSenQ0UmVGUVNlZy9OLzBPbDB2L3RReFViNncvWHVzL004WUJoZ3JTZk1obGlZMDE0NDNlMkhJeTgrZk9PY2QvMDUvckpiZVpPUDg2RGtNNzVQcWsrRXUrbXZOOXUyaEZLSWtPbFBmR1BsWVlwSHBuM1V3MStlNCtjMjQ3RlFaNG5NaTZvV3poeC8rZ0dzUXl2L05PbEl3VEFHZDdlN0F3RjFvREJLeVA4V3Y3VFJZTTVHOThUcGs5ZWUyY3NDUktvOXYySGVybG1ZcXIwUVdmYmIwTVMxSGYwVy9VN280WG5VMXFyQ1gyeE5jSWszc0NUbGlkemI5MnNtM2h6bnF3TExNWkZYNE11SkNocEoxWmxyTWhzTzdvZTZFRi9wYWJLNkROemZuOW1HMjllbUdSM1RKQ0Vyc3ZDOGZjWEVGWWdQWGxDSTA0blc0V21Hblprb1JHbTk3VFFzM08rNS9EUjQyWTluM21ZbnNUZUhRVmljeExOU21nWWZRVEZrSG04UzhSbWdRSGhDZmR4MEd0M05rVnpvYUdCL21EZ1BUandKUkc4dU9HMjM3YmtseXpyY1ZVOTVQSGRjck9BWDBlY2ZMQlQxMHJRUnNVVXJxZ3BaRm91ak85aGlqdlJWNngraWxEVUZIUkR4aWMzdE1ocTQ5aG5mR2FPcDhMbnN6Mncwc25tT05yaWF1WFRlSXQwL0FGU2tQQ1UzQTArSkZzRnBzM0FuWTRtY3VXeGNMMzY5bC9tUlp5RHZkMS95SzBvZmtuM0V3TkFTQlFDRFRWa2o5ek9rVFpUN3ZrczdXZFV6VFUwdVVoWFowOEx3ZE51VmdzK1NnR3JObW5rQ0p6Y21FT0RuYkdUc0J5LytNTWtFR016eWQrSHVJKzQ1bHBkWUVXN1JRdTZWRnB4RWxmNE1sN3BuU1NsNVVVVVJ5Q1c0RXVabGF6Sk9qUEhjc25ER3dPdG1qeTFXVGhUUHgzQ0dKakRFN0xNMjN6ckpTVHd4bDR6YXFsY2ZJOHFJK0lyZVNzTVpqMVFTdzA5eXI4TldOQXhNRWVEczFzZDZMeFhLUkUzblpOVkpSUlRKK0VKSUUzaWgwNmZkRk03NDFZZm92RU9kZEdTQmw4QUtkejlTUEIzSjEyZWk5U0JiM3hEK0V0SFZIb1pObmZQUlMwQm9reWVvbFJMbWVtYlFxR2F6NXRETTA1a29LeUZTSmVBbWRzNHo4b2xYaXRZaVNmRlVZTjF1VUZ1Zm5SbWVRS2dnQlJZcW9HV2tCL21iejhGVnVUa3RjTFM2eDBIdVFVNTQwY0MvUllwSldVWWdmRWRZcVZOQVpTTms0aVY0ZEs2RFhOcFBqamZTd1VJNkVsU2R2MlE1THoreHp4Q0ZEYXVlVlRsU3BtaTBLVDJWS0ttQnR4UWtxRjJZeW5Td1N5Rk5tL2ZBT0hVbkgvUkNLa1M4WkhEVGROVmdRa29oS1ExZW1CcmRuMWtuK3VmcXZoZDVDMjk0S0lPMkRYZHNvdExxNzB2THZ0LzhvZCtzcExvSkVmRFNDWnA4ZkVacE1DdkVXVWRtWFRmTy9OYmswTm1LQXM0MmkwQmlVR1dIYk04Y2pvZzl6eHIya1p1aERVSHBXZGdjcGtWVWVHaW5uZWhrbUY1ck10TU5YSWRMZTVPaVRIY0VHaXYxS0k2ekxDWm1ENnVvcGNhbFF6WWs5TytaclVBNXBOYVU2cjBxZ3Fzc25Nd1V0SkRrMWRTRDJJMUtETVdHYkRFWU5KYXZnMzNzWmsweFVRWjFKWFR5aW5DTG9ZdHlESmtPeTJ6THI3RUNrbHFHM2N5T2Zra2JoZnQ2Um9VaWNrYVMyVldocGZPQW44ME1VWncrdUFjWHJjSTdCRUlEODl1enBsLy9tdGEraC9md2gvYUNrTUVtMHJXT1VSYjJXWW9BU0ZrVUVOWUl6OXZXYUhVQThzelRFZjY0K2RBdjJuYjZTTkVmVjdLT0EyM1VKeXRLVERyVXN0NHV6WHUvN3EzK01XUnVBbEl3Y283T2NhZTRoS2VGQ1ZKSkRSWEpJQTc5QXNIV3F1aEVPVExZcHJjeUk5TS9sY3l0QzhhYW9KTDJJU0hoYkRxd1dST2lHTm1DeTZhR1NLRkZYenJEQVZoRlg4VGFtZmFJbXdvMmJobzJGZjg3REV0SW9JVjdpYVBhV2Q4Q3FlVklxTHc3YTFkR3NVUmsrM0Y0dy9Majkyb2g0anZBRzF2bTRiU294MXNUQkVRbDkvbGx4bkdBRWQ5OHgvcFJwVXlON2VyRit0SEpSa0hDNmxZZSt6TmlxNmxsazVZaTdDSEp3RExURk5DN2NwVGNsdWpReW9UQkVEWitnTmNnRzViektKTnFjZFFHOXNMMEdCMU5xZXhuSmJpeDMxSTlVTnp5VUJHdElZYzNVcDN0ZFNWNXRhZG1pNVZNYmJBYTgyOVFGQ0R5OUdwc2lDMjlGYUVoSkJ3cEVGQ3I4eit3UWJBbzEyRk1jbmZEYzhuZVR6ZGVQdnM3enZwWTZxeW03Z2F2N3hhWWRaQnM0VmhPTFdxWk9sU21Xb3NVdDBmbitjUUtNMG5xRW1lb3kvSWxZdnNqSTdqcHdTanFoNkxQNERNbFRaU2xReG1uamNnK01FZUUwc1FiZXlTenhHUVhUN1AwTzRrSlJCS05LUlp2WTB1cFB5Tkh6SnhaY3dZbG1zWGtPYy9rd013WTR5YmxFTGhPbU5xVW56dnZmdFhtbGY1T203WUg2UnlIcnY3cmZaRnEwSTNnaU1aelBTTjF1N0lqK3R2ZStUSlFsU0dTVnI0VmVMSkJoRzZSWTNMNm1PdVRNMk1uUm51NkxSNlFlajFQT0RQUTk0clhwcHoxUXBBajNhZUl6RmVHanR0cVlHa3AyS0lXZWIxM2k4UDVicDQ5UjJBLzZWSmlubWZWZTI0cGhrZ2t5bDE5bmxPY2hHVXBZUThidngvOXVHSXRoaEZvMFFhcWJjRVpPc1R5aVo0VUJ6YWZxdWdxNStLM28xVFd6VTNlbWZRelRUa2lBYzFKUUR6Z0pYWkRiMVFMZS8zbHdHZ0xVbElJV3hibkw0ZDlBYmFjUG4zUWtKUnFQWHZtaGNGNWY5QXBSQVducnZLcXRDUDIvNkovWWtoVnlUdW12UkoyR3VuZ1JsaW5yaE5YaC9HYkM3QWk1UWFhTUNCYVdrTUVrZDNndG0yL1F1ZUFSSTlLTU1jbDRtc3ExZll4N25MYzJKeTBLNTN1R3hYN2h4MjFQN3AzLy8wWnp1Q1lybnQ4VGRLMitMdXo3MHVzcmZSL2lXalovN0piL08xbVArMVI2Y1dvc0piZ0FybUZaS3lWaG0rT05sOGpmdEpiUWpzMW0xV1hNUmRXV3M3WHVGN1BQRnYyWG5tS3RSQVNaWjNpeVlwWU5IdFBOUlg3WS90WFkvK0wwMDRDSnVrem5URXgrY0NrcTBxSWJJbXNqUjFUUnlTNTFNT3pmc0Jnay9Ic3J5N3dnZzVyL0NQczk2WFJ1VkJBeWw4TkdTQUtKTkJhYjF5bk8xQkl2dVo4RGtaZjI3TENLcG9xeTJLTmozT3l5TVRuOXhRRFVCdEpwVTZNMEVnVi9LL2pZYy9KcW51WEhqL2J1aUhYaElqOHM5aEE2SlNTUkxkRjZ1L25KVWNZZmV4YldkbHpwcVl1cE02em1iMEladVl4WTJ5RThzdUdCMWd3WjRibGJ4Mm5NUFY3elBLSllaZzQ5RG1rZVhGc1grVDBVM3NPbkdCcmp6eEtaN3dEMWpoOWVtU2lKU1loTGtjZWw2a0dPV0Z3c2hyQzhPVzFDYWtzNGh4eFFZVXB4T1R2cE1JdXBwcHZUSTVoaEFjazRZdjZCWHFpV0ZXRllQNzhWbGlpK0h2d29SMGJOUVgvYThYNEU0N05hN2NobWFNaVNFNkwySjdhRlcxd0syYWZla0kyL3N1Zk50dXQwcjBSckpnbktwZG9FUmxidE1Fdzhrd1EwN3k0VGZqektXUzFBbW4wTGZUcjFWZmZIZE1qNFZsazUrWnUxOTlneC85MVhxMW9mMWNkWkVjaXhkUEtVb09PWjgxcld4Mm5qR1ZLVDlVTURjVloyQ3o0aGxPbXIza2N6U1ROTlMxbGZoWnRjU0t3UVdBQUdrSXJzLy8vc2dnckNOL05tVEVEZ3JrcUtmUmJoT1FvK3h6L2NXZUtyM3hQQWVFWTVKMEVWdWdSWlFDRHI0OTNVNDN0Y0x0WnpVNEt0bkhQQmsxemhrcXRjNHpvM3VNa3RuaUM3T0plZFZEenBSUnBMVEtQcWJjMGtzbFZMRkhyLzFiRmRBODNtc3V5ak81aU9KOVBjNjRobm1LTU5kMFhxMGEwMHBWSGtsSW4vZVliM3plaDBTWWViOERTMnNaUExERFRqLy9QSC93bVRneFVBY1dPVDU4U0J1QU9BS0NwMzhEaDgra0hTc1FZb2srRldPaUFUTXNYKzFJaS82OUhkdHFoNS8vQUVKcy9oazZrTjlmdTZXY0xkQmx2R2I3S1hBa1dBZmFZQTdrcmxEWmNwMWhHaHQ4Q1lLK1FkaitsOUkrd3p0N3RPK1hrdWUvOEtiSHMzekdsaVAxa1I5MGEveDNyZVVYZW1oRngzUGY0dUxmSTEyTHBpenBZMlB6STNpZGJNT05pN2N5SEptd2hBT0hrNUNJL0ZQL0hFT2UzczA4cHZCTXVVdGdwaWE0V3UrTHppQjV1OFQ3cng4Yis1SStMWURRa3pRcXU5c0JoYW1pMGxpRVVDV3ZrNTEwcHRtdC9VSWJ1VHBsR3JWYXNJY0R4ajJwQjEwcHMyc1pRVVRZTllvQ2NZbDdoaFFONkVabTQ5SllsYW5OdGNGUXJOaEo2bUMxeTNKSGpLNXBteHcxeFpHRk41eG94RjdXMDY1STVyOGlnSC9SbGxkaVFzQ3dWUldxa3VYZFVpeVJnUENkOTJWUGpaRTRaS1FrQXlZaXl5eVpsR3JTQlJXUzNKdVhoc0pWV0Z4Z083b0MzY3FXK01zakRsbjM5RElwM05kenB0Q2VjbmJHbmN2MDR5c21BODEwMU5EZ2lZYjVkL3B2Tjh2VmkwbERlS0RYbHBDc1A3UDN5YkZRbWdzMmgxYjFQNk9tR2NmNU10bU92djlwdmZ6RUtTY2R3SmV1VVJvYzRaamFsRVA1b0UzZEJ0QVJZYStiMnQ2V21BcWhGY29IbEtsUFlESSs2aExtK0NodTlJS25Ec1NuSlYxUmlFWEtQcjRBV3QyZFNpNk4yMFNpWGJNSGswVml6bUNUcDIvTHc5d2dIVGwzUUttUXo1aktHZU4vU1VjcWlEVUhaVE9HU3AyaTkrY1o2cjUxaDJJOVJWSXN4cGM4NXA5ZHpaZVZWS09HNHcxUWpUcWFDek5teklQR1JxZHJZMlBnNVRYVXpLcmVmQWJMdGNMdWJNeUk1ME41dVlWU2hDZ3FFN1NkeFMrMEJMV0RaSFdwSE9KRkczc0FQc09hM0drVTltUkVHOU9yT1ExSStzZVI0S2pocE5qQ292M2s2M0M5bHNEa1FCOHdxVlZpMFpwWGlKbXNQNWhJeHNJMEcyVk84a3JNRHpNR3RUVk9ZaWlsRGx4Y2xudE5DZEhBM1pDc2xWUnRSSXFPaHZPbFNYTUVsR01OUkcrdjRLUmMvbGxVcTFXa3M2TXpOcUYxTlRxS2tqdERCWXdYUHJxWUp5TDIxcktXNVpDUm5wUmxUa3JRcGVMT0VYQ3Vta0dYbUtpcHpHYklRcEpyU21RQ210OHRYVEl3ekxkWFVaNWNhcVhHakxSRE1DTjhpaS9jVUZBM1Y4WUNyZGFKQnJSb1pkTTUyWE5kZWU3MHdPeUtSbDFNeVFnd1hGYWhicWRXZUpzRnpaVnZVTG5VeUd2QjBwUkNYTm1kWFdYRVJPRm9FcW8rcjhmQ2VaYkM5bnBEZk51NXRqZVZuMjBYU3FkbFB4YVJNR01sUmNYYjY4U1pnY3MzaVVLeFpMclJiUmkxT3VVOGdqREp1eGlLVE1sUm5kV1R1N3RIMzd4aURiSDRVOWN4UjVNSU5tWS81dDh4dzRCK1E1N1l6Rm93b0pEczVnRmtaVmYvUHB2Qm5aM2E3UmFNQ1FVYWxhTlNac09WR1VwU3llOW5PVUZyWVhCQ1V2NDVyUzVuTUVzRGpsejY5aUdxNWJyMU11bTlFbWlVWEpqcDhYYWdaRVM1bTByaGN1TUtJRWpTZVVDOThWQ0FESHJsbnRYUE5xTW42SC9QVEIrb0IxNmMvL0Z4NENYdkh2WDhIbzM4djNxeCtmTmV3aEVWQ0lEUFhSKzBSL1ZRcC84eC9JMXp6R1M2L25OdWRyRDJBbWxlM3dEWGFRYzY3ejRaWTdXRVZ1cmNQc1NYemVsK2hMRSt6NVA5dnhhbStNQUs4RTErK2lRSmdpYjgrRk51WU9BYWtZc3JTTEtmVXlwUWY0Zlo0aldQcUE0M1VQaGVYNW9vMW1jYVVqS0RrWjlWYk9oelhCcUx1eHI5QlhHN3F1bndYVkwxc290QXh0WkRuUWo2MEFXZjlMYjB0WmY4LzFQTm5hYzdXVFB2c0l5UWhCdFdiSHFZOUhSdHQvOHdpeHlZV3NaWE9NTkQwTEQ2RUZXMWhrZmxuVi9Cbmg3QUsySjhpeDBnTXo3bzAyTlNzZ3J0U2J0aEJCOUhicmZaYjJmb1dnQnV3UXhKKzYzL2E3VlBaSzJ2RU9oRmRXSEpMOFhKUGIvU0Z6L2Q4SzhqOGpBcXhUc2ZSNlFJeGozaGNCK001Vmo2NHlhL3ZTb3hZRGQ4NTNBQzRtYWQrNW1MRzhlakhYOVpPTEJjK2ppeFhsWVhleFZCOEJGeVYwQi90cU9nQllvL1ZpSFlBeCt1SzlwUUZtYytxWStHeTJKTVlTa1hMbEtWTWdTNFpNUmV5MUxjek9jeWJ5Uk82NFBERTVjS2Vsd1JRNmQwSkJuc2xPVVhxRzI2bFlUR1pNQlpxZExDU2N5UXRja1BseDlrbFpxckIwQkx5c095dExDREc1ZlVkS1JId3hPYm9yNUExVkx5N3NIOCsxQVVOR0o0MVUxbmtMeHB5RnNiVEZmblJEZkdpNzdoZDQ0a0czMUs4WmRvK05VRlpMZy9ibEgzcEp2V25WQzRYU1A3ZVV0eW55S21Xa2dzK1N5ZER5eHhGUWNWaC8vZzJIU2VpSVppQlpVUmRIcEpuaWgwbUxPN29RL3pZdjdrYjRHajVlYXZSenpkWTh2ZVdOVUZkQlR5M1NYYnVvNm5iWGt1aGMrSTQ3MnFjcG9tM3UwWnFCaUpZc2FNNWRtbktSeHN4b0dMc29BMXdmNW9pNmExY1JpOVRHYmszY3J1NjdWWDJSeWs2aHdtK1grMjVaMnkxdGVFcU1qOXdXS2JiZElvRWpDa1ZOZ2V6bUMzbHFycVluT1lwRmR1N09BT2x5SHBKbHM1ZUlyQ1V6bC9UVGswdUgzQ2U2V0R6ZWpSRjJJM2U5RzdocjdUaFcyekdwSFZNNk52aUw4aGFKNUFXVFpzR0ZXUlBtT2JqekEvZmMzSVVkeGw0WmJtODY0TXkwOGROcW5KcSs0cDVzeVppWkovU1puN3UwMXFKN2RNcExuUVRSRTFER0pZOWJQUkNrZ3hqRUVQd0ZmczllZDhlMjQrNzJiV2ZkVFJ2NWFYbnBpcnUwMEd4YzZ2TEZUanRSN2N6WS9SZUxZNHZ1UXFQaXpzOGVkK2RtUFhlMkVlUFIrcmJibXQ3bVRzOTU5VXRUWHRxZGRHUFE5VU51TUw3cyt1TytPMTZQUVMwMjNJdmU1dnJlaTJOZGM2dlcySkhjK2Mwc3BudXBSYWVYN2p0OXUyMzFsTGJvV1gzUlQ0cDNpUDlHTnhrbmVtYmI2S2x0MmFPcjZDWDZSbC8yZnlsL1hIdlFmeEh2d1BmQmV2K0ZjRUI2Vyt2eE51dHBmZFpQc25ldy81YXVBeDZHQ3QybGo0L090QTdmVmVOVGgwZjZpWXNqK3NESVA3MzJEOE03a3FmWFlGMjRlUDRhMFVmNzcvM0lSd0RmZFhqMDhkUG5yM084akQ0VjIzM3lDWUlmdTE2RDFyOXYzTHhHY0lDRFUzZUZRUnJ4Q3ZZNDZhZnlnZ09CbE5PRGl2bzdoU3J0YmhLYSt2ZTJDQT09XCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzRfX18gPSBuZXcgVVJMKFwiZGF0YTpmb250L3dvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFCNGtBQklBQUFBQU42QUFBQjI4QUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHazRiaGlvY2dXWUdZRDlUVkVGVVdnQ0JEQWlDT0FtZkZCRVFDckFZcUVrTGdSZ0FBVFlDSkFPQ0xBUWdCWVJjQnlBTWhoWWJBREtWQndBQUFIZ2NnS3pMUi9iL3h3TTZ4bjV5SUpwV2lCRWlVdFNjS3JXbVNwVFdadW85Nm5jbUhLN1FFWDU0dkZlR0VOMDNveElSSXRoWCthS2IzLzVFTzJrNGpoUGpvR01ackljVnQzZld5Q3ovQzhZYzc0QnhlNDB1citpTHZ0bkNyMlo1V3dadGxROWJaREJDa3RtZjU3ZjU1ejZpQlNRa0ZhT3dNUmFGalRFbFZZd0l4RXlZOWxLZHkveitXa1g1OTZNS0h2ckdhSDkyWjgrOENhYVJhdHJvVk5jV0xTUnZQRUx5UmlxWGtQRS8wMVJTclZJK2FRWk84cEdmamwyZjFjcVMyMUsyV1Fhb0ZJQmJaQjl1cVdkN2ZtNlhoMVFxdHdvMVBFM01zeXJ3NFVZUjNMYjN2NmIvTy9kdVQ4Sk02SGJmaEx1RHNQU2x0SjVRV2cybHJWQUlUeGZ1NHlUR0VJUDIxeDlDVWRTY3dBOHhDUzVsVTM0eFR3MFFGSUQrb1k3MkQweEpnN3BlZXkraVd5RFRyKzM2cWhKaEJ4RFlYSW9ETHVvaDN2OTN6Z0xGWHdnVTBpSG03VXBEMVVsOWVzWnV4bytOdWt0QWlvV212cTRHLzMrcTZuckFrU2JzRHRNcFRIZHR3NVpTbHkzTGlQc0hrTGc3UURxQ3luc0VaYXBSS2FSU1NFbFc2YlEwaUNtMWpMVlFjdWxsU3QvaUxjdWVZVnVjcmMzeGF6ajdlVmhNYUV1TWhnVTIzSDI1bDdQK1RmU3JicDN0bG9pUVNRU2puSFcvbGRhQVlPeUV2aU5NKzRoWXpMK0lDZzdTQVZpS2h5K0grZm9pNFN4SzZCUXFSbVV3a0RvU3cwQ3lNUHJjRU02ZVQ5U0Q3RXFMcVJKa04weEZGU0M3V1pSdkF0bmRQSE0xeU9BQndLWUQ3VzBFTW5naWdFQkh5RDRkWDl3bmN3cG1rWUNUam9nVkZvc1FUR1ZSMGxoNkpWM0pWWXFWeXVrbU9CT3JiNFowd3ZRREdNcFBRZFp2Z3FhMkRwNkYwRSsyZ2pCSXg5dldUV25uNlhyMGp1MzhLYVp5ZmpOM1lNcEliY25BRC9sWWpJNWZDbVFzUGdWN2RDcCs1RldQMTEzYnNpOTgxQVF1L0xsdnd6LzdjK3IvZ2I4YytTUHFkQmJpSTBuYUJYa3hIRkpkamhaRHVCMHB3ekVvTWF4RmFlbHNWQ2lEYTlOYlVhTXM3ZzFiMFZoNkxab1I0ZDNoZytpOThERjBKbndKM1FqZlEwL0NyOURIVTc1RTN5K0Rma1YvWTRBUkl4Z2RzODhpZEIvZ3JZK2pTSEhnb2s5Z0c3RmM1Mk96ZUpUbjhqeXNqbm5RbWh0bit6ZUM3aEZ5MVNNUllHSXovQituSHF2RjNJVVlrcDNpM1ZkRlVCZUFNT0hoV2xIbzRBYWNMdjV0aHV0d0M2L0lqWU9QRWloRVNrU1pGQitCTUY3dzM2SkdMTDRBUFErWGdaL3F6YmdrdFRHQnZnYjFhQVJleEIvNGpZakdFQmJnZVk1SGVENzFIbGFWdXhSSFEyY2lxSU9RcmZJdnhhNWdIRzJxMGFxTVh5WEVsR29CaCtFd0xBK0ZsVm92cFBsRUFGMjVVbFhyN1o0SmhZQUxYMkdVNHVsbEt4VTN1Y0JFbjBJZW9jQlFVRWdSQ2dtRmhzS0NDeGpGSGpxQlBTNGVBU0VSTVh4cVl3SUJFSTdrN1pvM2MwaWFhbmd6UlZzdG5LMEVtRk1YZXlrNUZ2V011VDhKTnZwdkx5RC9iOE1BdlFRQStJdmpDQUFaUEtTbk9Sd0Fia3F3ZWV6RlZYTXBRZ0JOTjByTkNBRDk3OXRxRUI0d1JQWmNTSnFPaFVpaGo0UE9ycEtZQU5obkVHUUFTakVIRmtNVjZLRGpOZnNpck52QlVzZXBjV1pjR0ZmSDF6djJFOFpTbGhOT2k3NXNFTjdTeW5ubG5pNW40VFZLYmluK3pLNDZmR0RQb0NuOWMvNlVQK1lQK1gxK0I0bTdFTmZReGhIOGFMbFU0UUxiMS96YlEvMy9WRjh5M3BuOEJwaDRoQ2I1bHdkdzRuWXR5dm9wTzNVUlpGZFo3WDIvTU1zMkU0YXFVOTF2Z3h2S0RlblVZNlBkV3V3eGJkU0E5ZFlZdGp1ZXNnUUJsQ3pXTnliczlDYTdNUFEyQXlkdndvek5kanFrMWFCeEcreXczdzFGcXJYb01tUktzVWJkaVpGR3JUVnJxOTBPR0grVlNXR1VLYnZaVGNIV3NFU2oyY0tOT3ZRYllsNklwbTJ4eDFVL29hYzY5TEdhTkJNRXBLTFV6R0xTT3JPMk9EaW93SjI0MEZ0cklXL3VlMDUyVEU5dFdHOFpIT2p2NiszcDdqcnZhRzlyYldsdWFtd3cxNXZxYW11cXF5b3J5c3Z5R1Y0K0xPYXphUlg4TjE5LzllVjk2ZXlMdStlVDhYRHd4ZWVmZmRydmRUdnQ0cU4zc3EzTlJocnI2cFp2NTF2TlJoS3IrckMzVllzVWRpTmN3YUZncnlIa29kWDlrYzFiU211bldDTkRTNTdjRldaeXZ0QjJUSllVZUxEMVY5Y2ZjMzlZV3NxbEIzSXJtV1FzVWVVUjN6cDFBbStjV0d3eGNtQ0F0OGJjQjl0V05tYjdpRXlBV3Nvc0FpZFVKcXRJeDQyYmpUOGZ4MTdqR09jTWE3WnpYcWZvc1RPYitOdHVURE5TU20zd1JxcGJWUGErNlF1dUNUcVZGckZmdUE0ekEweXdheld1RWNyZlh2YktJNTRuZ2hXdUJsWm12NmxubGRWSGxrY2ZsTXc2VGM3VjA5L0R6a2xpM1d4RXhrM3M2TTMrbU5NM0IwdGJ0MEQ4Zk1qK3dyUjA2MjljWEVZYkJJbzRxd3d1WEtseGVySXo3WTlVWCtkVW5mUHdLUFFOZFRQVG12Q0tQWHJVQ0FGMldpMXFJcVRDQVYyUkpSVWQ4SUV4dUZ6eGF0dmlFUmdsaU16WWk1aVVUVjF0clY1dFhHMWU3U3p0THFsSXQrd1hWZll2UWhJbytiV2gzVFNFUmp5cXEybjh3MHVvR3NVZFBTa2o1UEZJWDhZeEJpcXgzV3gyZXRoejY3c2ZMdTJ2RFhaSnBTVEpiK0l2YURieXlIc016Mm5ESnNFU1FOVGduZUpycEJqSkJ1U3hsYXYzU3J0VnVsWVpMS3hkSk10enhTNHVXaVIzOHRpMnQzM1pPQ3lYR1gxdEhZZTFEN3lSK1FhekxNblppZXdFSmQwcEZ6NWV6OUN5c3U1M2NucEh5ai9uelpHanJKQXRDNElIU1FuK3ROL3EvVWo2L2ZRaXVZakVhenVvdXZrTjZ1NkdPKzB5dVZRdGNpdEFTd2cvNEp4ek9ud2w1N2tpUWg3WUI3VndBZkU4TWdmbzdxWStLSTBicmQxaDJteFFIcEZrV3MxR2Z4anpGMlp3YjIrSXJpRXBMY3F0ZkJDbXdWK3BwUlZyS1g1OXQ2bmxwTzFjeXQ5WEhPYVRXdTZvS3NhQmpXN21RRFBrSWJRUW9PUERLMHY1L0VscHBibkFpeHpiNjJhdVpLQnBVRFIxU281UHlhNXJOUnZwaXBKaHF4dVQ1ZktsOWU3TGRQRnFYVWRVbnF1YkYwZnNvd2Q5QUxaZ0ZER1BlN3JvQVZOV2RuQStTMEppQjkxRGJSeFpUVE0zWHp5b3Q0d2hWcmcyWlFoS0ZOZEl1eW9USktKSTh5THkrOEVOdmVSRk10MUR5elBxZW9tVTl0TzRwbkREbWZMUkFzYUtKTFo4d3UrMHB0SkdiV2EyMURnTmR5WnVseDM1VW5vZHlWWktPK2owc0VJV202R0lIelB5UXR3eTZrWmhBaDJ5R2l4ZDZZeHhRTjZSOXdUYUw3Vnlpa25SSXN3c3VPZnlRVi9JUnk4dCtVRU9sbmt3cnA5NnVFTTJLemxuN1VGZU9FcGhVa0R2eG5xQXpnSmlLVngrcDhkdnJNanNSREFKTm5VL0VIVzVZempNRVh0VGRnUTBJem1PRUFOSTk2aWN0UXNTQXpUQ29EWFVqT3A5NTZmU0RZVFQzc0RJZ1N3b2NZVWNlMFJXbG1USTZWMm9KV3ZLcUtCeGxrRjVNQUM4QzlLZHdxeWtCYUZONmE1ZndrMFRUNisvbnpPaDZyYXBLRHhpV3dLMEZ2dktoWE9Rc2UvZWZGNTZGSUdPSitsQVdRczlTaDVVbWV6NkVwUTlyUnBtQ0h5SXVmcVpkK3M1S21mVkFlQXVWblhVVmx4YkdvWGQ0UVlGNU9VdEErT0pWY1pkVjZKNGNJRVdtL0pJT1hkYkR3N29jWW1yR3VHdm9CYWY4ODNQUW1nOUdoc3ZMN0NicCtwcDdydmRQYy9nT2FkYmVDMGdUZFVLOGFHejhQalFmaGlBRzl1cHRlaTJ2NmhJVkV3NGU0RnZkcWZVREhxVXVIUTl6WkVHdmhrQk42M2s5WXEwMWh5NmlLNDRzd2J1MnVidEUwMGI0eVdHMzJqSWUxdFl6M3BkQlJSdUhRZ0hqWnp2bC9PYVVLZTNNWkM5RDZVRkp3V00yd1g4QkhEdHBPOTFTUVJwQ1phaHRBdi93a2c5SDRVb05JOU02NkFsZDZLOGJIZEh6dk5hNVdlZjBvVURDeXhVWjJFWUNCNGNtRmIrNkw3VVFtOVgxWXFiTHlzU0hvK25TQ21VUmwxQ2tvY1Zqa1R1SVNUd1FFRllCRWlCUGZSR2cyZWhiR2hDWHRRN0hvQnVSTThnYlR3NXk2TlQzWVBlTzB1b3JHZUJ3WHIycE56WFV2SDAzdXIwbTNSQUZUNUJKY2R3Rml5a3RPUmVHRUN0Vi9nY0RiMko3WVJiajFsY3RvTXM0NG0vNXpXNUtnNVpvU1FnOHV0cCtwK2prblFBZ01FcjdLd3lxeUVzVEdETWFWNGt6RSs4QUhNVkVZRWEyQlZ2K0RIVktBQmJSVWtsSzRKUCtVcEdnNHlNSkRjM3NTdHExYUZLbEVISkNaVjJhcG56cGF5TVRuUWZxQVp4alpUdHJSL2Nwa2RBVHI2eWZGRVk1ZWFid0V2VGJFalptTWQ5MEEyTzJQV3NDYTdjUFVDQjlWSElWUnRSYi96V2hRVU9ENlBmN0JtTS9QUi94QTBCeGYwMmI1OEVLcW81aE4veWVMVWhSNXNGRTdvVXZMSnFSNS9ZbjRBay8zK3dVeWhsa2s2NEdqWXdSSmYzSGJmTlY3bjhwNGxsYjM4SzBtVWp2UXJRRzFQMmVuL3g0MEJNMHRBN25DOGxCSGc0bTkvRDJJZmE2NCsrTVY3RHVMU2NVWHFXbkgwbjVQS1BHSG1Xb01VR3VoNDdVRjlQL3c1dlZlQjQwazRLSmhKamRoQTJYSXNGb0FFZmh0YmlDODRiN3pSc2tpQTdHYXRLa1FITHUrd3N5YzR4ZFBwaHpON1NiRXZIdnJ0NjJsOU5HYWVtWFVGZGpWTCtWdE5RVUNPYnY5T2hBa2FNWDlxY0VZQmpXUG5VU2FHRmR6OUlKZTVzU2tzUW9VRDRpdVJ4WXlXTHBLVjhnK2gvUUg2blF6MTkwM2ZhWktnSE5kRlRoVHdhNW9aTFlMNTVkREtsWVVKcHVjeEN3TFVWNU5zeVd5aW41QVJyam5EQUhGOHRXeUNMN0tBbXRFWmRzMmxBY01pb0dFZ2xpK0p4Q2JUMTlsNEpDT2NCNlJOQWJ3RDhDbkJmQUNDdkVqdXRNdmNRV1BEWVZGeWdJY0Jwd0ZGeEZFcHcrRWU4ZDU4WFY0YkhDL2VFRTdxcUV3L296aDIzZDUwOWRmalE5ZWVIamh6WmN1ckdMU3UyOVlxOGRZbjV2Mm12MnowazBQUnFJZ3lnOFRrMURpc0dBNm1mOUx4Unl0ditKS0d5MDIxUmdoL0JiYUtnQkdXMHk0YzFjYVY4dlJ0TjFGTjIzZGlSdkNKUU9DdmdGTjY0MDNleGFvcDZ4bUJnVmJaZXAyNWpqMy80eWtlcGhCTWtveVFURmVaU3c0am52cTI0QXliZDc1WEFkMkJQMVIrN0daZ2lqeFFsdHdzNlFXS0hsblUwejFvMkxsbklvTTY3bnRzcXlDMmNwU0FvVWxsVEkzd2dyMHdRaFpseVViUDJEcEtIdTlwcDE3NFpCa05wa09SRFhXbFMxRE8vUmd5V0ZCcWtyNjgyNTVYdmRNT2FHZXFwRjJQelVXSkx5T3Z5ZzNwbG9CQU5FQzFLcFBoVHZHYnZLeXU1T0tOVFBsbHF3TTVSNVhGdXU5ckJyQ3BlRmE3MmJJSm84Q2x0SEtUcFkrNUZrenBSOXJCZklEMGZCWXRZWU9MV1FPcTNEZUw4dXBKU0QvcG82eURnS2R0RVRzRkdUR3NXMWQ5RFJFSEZEbU5jTnIyWDVwVUpzL0tnaDJHUHVxT1V4VjBQY3d0WmFFSEpGcUgzVmhQYzdQeDU3aWRLdXBncDN5NmlMU1hhSmprTkhlWlVxTnI2Zkg3eHNuSmVqMWZpUXAxV0dWVGFOanQ4UGR6Vm1qUnBqcTBybzl0NXFYTzBMVG84bm5TbW5IVVFNREM4M3BPVHU0VUFpa2NDak93eDkrQVBEZmJQY00zZ041ZmY1U0ZkU0VPWWZWdzc2RFdxd0dqbXpSazRhNHhYdU5SSS9NV2FwaVBZcE8vZVJUV3dhRU5VMUxVOExIZ1NaZnRXRzRuWnl1Ry8vLzFGQ1AzdDlNeVljMmFteSsrRG5kMDVsRUZPY0pzM2RTWWdBZFZaZVR5QmFKMTBZK2gwM3grMjVlUTRsQVJZamhzeGNUdnVnTGpNMWtleTlYcWwvZnU1b1B6ajBTVEs3L2Vvamx4d0svc1dzRUxybkt3cVdsM3hUVE9ETlpucDd1eGY3OGU4ZjZTUTBNWm5rVE51dHdkMlVjOWNhK2h3RXYrZ1JYajZ5OUlXTitpekZvTjh6VHRTU2JmKzI1NFkzbDhIVnYwdTE3SnZOVXJ4YXNCY08rcmE3UDAyTXZEUERnOXM2a2NoU2J3Y0F1RkJrUzNYU3I3MXFQVnd3dXk2dHQ5OVljakF6OHh3SVM2NkZHR1UyTFlQZElZSE9FTnlZaWJJTzhjRTVXeGVHdzZvVFpMdHdqTlhsd3dpaGxXb3YyWEVlbkltMUNmME1pc3gyRkk4M2JFeWdiVjd5ekhYTHo2ZFBmcFRkRFczc1BEcHJvS25kckUrdFF2V1JpM1YrLzY3ZDljSnQyOVptVXMranUvbWxlWmVkdlNTV00zVWVucDBHTnM5aXVNenprK1E2YkFpL01XM2txRjQ0aGd4b3UyQU9OTC9jY0thd0JnZTI3MHNobHJQV2lleGNvODYvaDRhdXVIREk4NnBHOU5OZXdYMWVYY3prcmplTHFHdUdzcGZrcEhuYVdSNVFwbDNXRXEwdENxWDRmcmF3cnROUFZLWTE3TlVORS83cEd1WGIvcnM4SkhGVjg1SnJlOEpXNW14YnRuWmlteUdrdlpKQjF0SUQxNFhIY1plRmh6cm1sUkRYcUI4UUp1aFM0ZXpTWnVvSGZpQTdzUGlpSURQRTljRUx1Q0tLa3dzK1M2MVpYdnRmQTcyN0ZEYXZnT2xaYzQ4dXlXdlgxQkFmSlNpRmtxczU0VnRMWW1wYi84OGZ0cDA1ZXAwVk9SSTJTeTJPeW1vbURSQXNoSkNxN2NKd3IzUGE4LzJUMHFsblhYMDRIWDdERjlZWFg3NnBDNU5Xa2tPQyt3bXFBbE1zNVgxUDhleXA5UXpkWkpqWHJyQXJ0MHUydEs5MzlwdEYyUFhFTGlNbDZzOVU2SklVUGN0SnN5clJnV2FJNEljVGlFdFg3NmNrMi9hVnh5WXdGc2JLUjIrV0NndUdWK3k0NGxzTW1FSnk4SmFhWmNnSHdpdWY2dlFkalhGdTJvMERpbDBYdVVENmk4TDk0MXRuVjVQdi9BTnkrM1VRVXF5cThxNUtpUkdOUmxSei9vUlg2UjJITS9aNTVDZE91YjdWTDY0amhUcDRjQldVQXNtODg0ZnU3ODVHYlBNYUxac1NrTjQvODgxRG1uSkkrSHo5L1N6L0VLM3VZT1VaSmNJY2NrbDd6cWY1Q1V0TENXTFc2U1Vqb2R6NSt5MWhUc2lMbi9tbGxGcjl2R2w1dTUwbTJPdFZGaHJITXByb3R6clpueFlobXMvcU1ZL1NKM2R0NGorbnVOWTFQRDFYN2xzMnE0cElnMlNMQmVXcEU1YXNlendZWG5oY21GS0ZiMWd4emZXSE9vT3FlOUNIazNHZkR1ZUpxa2loUVYxRTlWNHBxZDkvZm1XNHdWY1BqbVJFaVhha2Q1Tm9PSXBqTUYxTVdsMmp3M0V4VG5FWW8xSGk5S1ZvdDVFaTlRY0YxdFpHNjdHR0VQWmNva3VLdXhlQkwxVDhNSGp1SVZlUlB0UDVtVUZYOWlIWnMzU0RBUzFweGhUZU8vMzlITndRZ1hVcHRlaC95M29nUkxyem1LWHNoMkRMVUYrZElhN2wzN1RBdGRrTWtrNjJwUk9ERW5NZGp0OGhxLzFjMUFuRExac2M2NTFLYjRYd2J6TWFacUtOVFRJUm1LOGlTbU05QzN1N3c3YkNydnhrNXI3dGRMUlRQdys0Z3d1dG1FcUtzWHNzanBwQWFPREVlTzZ1L212WGJ0djZZd2oycTRsaFdZUHcxZStGc2RoWm50QWtsdE54SWswYWJBb0NpNzhLa3NkK052OVBidFlabFBnc0htTlUxeW9aTWhOYnRiWTcxK2d4ZU5QN3BGRTBQN1Z1azNXTG8wTlZlcW5SUHBEaW0ySC9JUzYrQTBGMXRmbFRRR3pwMFRTeVcrWWJpWTdGYlBCdjY5cTQ2Q3UwM3RyM1NiS2dGZFR1Q2RQZFRNcVZ1WjVLYlI5b2hRc2g4SXRLOFZ4Wm9HNS8yaG1hSExRM2lCaitmb2xuL2k0cjBsc2Q1eGd1cG1rUnpuTGEzRzVwQkN6eEpwS09VeEpTK3dNZmhrVk55bEsrMDAyeUxVdVRnM3NySXhLVCtyMjJWNVEvbnV2bDBrWjVKYXJYeEdMTG9aMFRKYUI1WkRTa2lSUzNXRlR3ZnYxRzhMVDZzeC9CNjBMTVpHdTVlaVBKNFVzZFJFR2ZjUDRWR2grUFVlS1pDWXZJLzZyWlB5K2ttMGFFNWowYS9ZYU5uQ3lFdGJVWCt0YUZzLzRNb3Y5bFNxZW9mdGFHaTJ4MWppZXUvZm90UFBsbzk5bGRjMTM1YW9Icjd1M3FrbGJWbmgwQnJnMm1LNnJOTHlFcUtvekk5d0NGeGJmbDI5ZU1KNTllMFYzV0VZOHgwdnBLclkrRmpRRjYxeDdYS0pkVkh2aThnSXEzWEt5MGdQcnZtWHQvSElmNjRNdkpTSDA0SFdoTVd4WDExL09XMHEremlWN0tqS3dLa0lDVGpxY1JoZ2poSGJ0NUVWNnVkNjQySmdzMkQ3K0FoZ3Fxb0cyamRqbkdhbzc0VVZPNDFiNmNsU2hXZTg3bFdUNmI4cndrMXVMVHNaR3g2dE9KWFZ4Sjlnc1NseThiNUhESUhHc3FITmhwSDZiT090ZzRPWkRDbkhheWgwRms3TnEzWm5HY2tkMURXdVJrNDU3ZElPb3A4amJKOXJGUkd4dm9IR1doYXNJNGRMaFl0S0gxQzM0Nk5JRDRodElYckpZMnA1TGo1emVjQTdKNnU3SythVktKeTJrS0x5eXNBaGFjQXhidDd3OVE5UGlKYVRHbTk3N2czUWYzK2NIdWVNQkJ6OXFEaWJkZjZVNTdXK2tNemYvNHRuU2NLSC8zMy8ycC9tK0p6clppZnBNT3NQejhWUHlTWmY4Q1VsSit2aUJrM3gvV2luTGM5bHhtNlVwWHIwY1QzekhuMU10WnFCSFUwMExRY2tHK2ZVaENYdDRxK1puT2RZVlBwVVFQVFNUY3R2M2MwYk95OFBOQkw0MGl2QTdkZmE4UkFmaWZ5ZWMwdmY3RnVCeHpFVVdhMzcvUUdQa1ExdHBXY0NjT1BrMG9mNENXMU85bHFYOFBDRy9Oc3JXVnJDMFkxc2psMUw0bFNMcGVQSnBuWWhNMFYrdm5PYjV6aWNpZmhzbzA0aVhQQWEwUjZScjBveEtaL2lWUHBUdnh4QlMva0ZBaFVPOEx2ZmMxWEc4aVptMGpKWFVzaDBrbDNtcFF6TDZpWGlVdk5PdVAyS0t2dU1zbzNScVJlR1lvSUZSLy8yTS9Ya2NKOXB1M2kvZnZwQXpjR1JYODA2MWJycmFoUlJuYWRmTldEb3lJZ1FWelZYMUF2YUh3ZTZZQjRnQUlrSE1XQWpEbVZteGRtQlZOL0FVM1hHMkJqRU9MdUtBSE42cm9QWWtVRFlqWkRsencxczA1RTJQRHN2L2Z3VXhmUlZvZ2ppZENib2dYaGo1QVVLaWxZTkNSRVMrNVFkSVl5ZlZMa1VDOXpwVUZ1RWNLd0swU0ZTQU5rakhXVUVHMXJwTUJHd0tzQk94RkZ4N1B0YTZYTkNOeUQ3STArc1FQdUFROGJDYVhBR0laZWlsd241aEVTV1F3QlU3K2hsSVFrU0VzaEUrTWd6SnRNM2phSzRDUkc4aTg1QWgvRVZrWksvbDFzSDJzdkp6UDRHR0NmL3ZqUWZvMlVadzF3aE90cWcvWVFRbldFZWhvaml3d2RZaTZ3RGQ0YURMY2V3b3ByZld0N2t2Ty9FUVhVYkhxZjljWEQvQjBkYVFmYjFqd0MzQSt4S2x0b05yQmdrQzI1STROdUt3b2dTVlN5aEhITDlTc2t3ZjVjUnRLYkpEQkpwdGpyTC9sM0hZSnRCaDAyWWlzNmZxMzdmRXFiWUg2RDZSdWFobk9ZVTJCS2t4N05sT0Y0UndydHRJVjNtalRrMVJudDBKSVRQd2s5dExmVk9MV28wZWpFRzJicWJweExhUjV4aUcxUkdqem43cHJndFBVNENtZ0tET204Q1lxWUdNTXBaekdsNDR3QWFnZWs0QXZ1TUVFTUtOZ2NZWUJwWXBNSjcwNXBzTGlUcUpHVnNicUkwUit6dGJmR1Rocnh2Sk12MDBMcHIyVnNpcjF0L25VR3BhTFJKL2NOZUhJeVM2VW04b3FtRlIvV2l1TEhjMGhDVElYVnhiVDBMMlAvMjJEM1BrMmUyd0diQzBNeE8rdjk5WGxSd3FKZ1liSzFFTGtxUVFVNW0yUlV4UWdZM3NzdzRqbEVmcnBUcnBTSm13bFdXcFVzaE9aWEVVS2dPTjhwVFhmcjQvbTgrUnFrblhSWVJuQ012SkxERmEySFJ0MHVabmd1czJzYXBCQzNYcXhRYmFscTljMCs1Mk1PNENyeDBid0JZeWdVWjdDTC9mSDBacWZEOGt2RTZjY2kxcTNveGsycURkbzB6RHNKM1NqbTFZTlBOdUlXVmdHMkFVd25vVGNHSHlIWXZQMWZnbm5rR2pVdnAvdXFGbFkvQ3JmZEdsUkJZdWVWM2xxSDdXNzMrM3M0cjlmcjB1TklmVGpNcTVCZ0RuYVlvd0JLOGo1OUtvb3hPR2NkeHVVMVQ3VENpZ3VzeHl4TVNaTzFnYzBjdTN2bXlpZUtBdm5mWDd2c2c4V2psQUQzeUlCQ0ZFb3FDRUU2Y3llZ0FFc0p2b0l2WlFlYVhvWVhDRktnTHlONHZ4WkFMQ1VIdW1kWVhEQWJEbUpvcjJnaTR2MlJGZ2ZrQkFBSEFpZmkvNTB4em0waTB5alF3QUFNKy9YbmdJQVBENmhXUHc3N3Z2VlhnODFRVkRoQUVBUU9Ddnl5VGxjVUs3M0EvMEx6MFdIM3hDM25ZK2grdGxycWpkVjFURXc3cDhpeDJ2MmJjVW1TZGoyV3hybkZGVjJIV3EzNmpUSG5wZnZORjhWYy9qWE0zUzFMM2NiNFYvNkVjZVVaNVRNdnRqaWt5dGszZlhuRCs4SHBlb0JxL3FVSlNBV1FxRG05ZnEvYXE2YlBvMk5ROU96S1JsYmxCVDBJY1J3ZjlmQXFBRXdNNFRMUnByYzFMT3N6RWJPREFPc2duUXdPTnRaN0tuK283NnhML0VSUlpCQUJKTTRHdEVnR0VKTUFOdzY0dDljQkFBaHUxUHZaSUNBQWNCbTQzWU96Z2JRM2RtTms2SUc3UHhaUDZmVFNBS3g5bEVqckZ3bHAyUVNGa01BZEJqYURZQ2FxeDM4ZGdBU0RReHRoNmVoRjBjRktsR3JSWW1aVXFVTXBOUkNFeDhHZjFOS2ZLVDFUcFdEVjhuRDZ4Kzk5Vk1aYXljRWdVTi9IQU5qcFhlaFVra3ZKQjhzMXJQWHl4Z1NaVW9FeEpPTnArL2dvcFhjWWhqTlNaYnFVanh3S3JUcko1eWE4eTU5ZjVEZVZ2QTRwRE5VNm1zYndybUwvQnQraEt4a2xuc2JzbkgvQkkvR0xSUHhTS1dZcUFub3N5bTRUTDhvV1BHZWsxOWtoQUYxSXJhWGdsL0xGYnBnQ1JXa2lwTUZpTlJxb3pTejFLbEtBeEVrb1NvUXJXMVNXSll3ODd5N2xrY2VQcnBWL3RXc3lyaEFXYjlIMTEzL3IyL1J4QS94emErRDhIa1FVd2NFdU83bTJkc3IrTnRtMmRrVmVGbC9YME1MV2s4TGR0NFhBakxJaGhjVm5FM0UvMERqYjZCaSt2SlJzOXdnTzdCUnRjZ29YTWtIYU9nZmV6Z3BKZlEycE9XampSM2RRN2FHZlpiUVVOTHpMVUJPL1VQcHByVU9hMjJrVFVOWGFhNktiRldrY3F5VEtzb1pYa2h0TEpDbGhicHZKS2lnNVVjc2lqM3l4VG0yeXptRGl5a2R6bWZRdVpta0RrWlQ4dE9aRmJpdE14WVpnVFEwZ05wak9ROGFkRWxxV0dIbEptQkVvWmRUOU83VXVjbTU5RzZNL1I3VXUxYm1ld1g1U1Y1WVhRN3AweTBvU1ZZTWw2SGpOTzVVbVhTODhTYUpNWTRtT2k5am1LK2wwSitoSFNxVGlJK1F6eGtOVS9seXBmTUlrUXlvclZzdjRuRUVrYklyRVBRMzB2QWI0TGZUSHk5QWg5UEhwNkF5VGpsbURSd2dYZ2FPM0RZRXJEYjdMQVppV3ZZakVtUk1kWi9pNmR5M2h2TVJTTy9LR3h4ZXdNN2lHV3dON0tNREFYZFFGRGdEWFFqM3NqRWQrRi93T09ZTnJ1VHBxQWFTQXFpQWVXQVljRklOUktOZDRrL0VERXdQb0F1NzBDNTR3ZkFzd0JSRkdRRFRvRVp5RWJNeU1TNnNCOHdIQXR3U2lVQkhVTVRjM3FmaEdNa203WnpqcUxPbUVQV09YZGRlckJLVGZvYzBUb0hoc3NaYWU4aU5HWWNHQjBGNmVtRXVRbGQybnM0NlBLTTcySllwQ2FpNFhHZEkrckJoODlobjNvSERBSUk2TkdDNGVnTkNpQ0VKRnBLZVJBSllEU0l4bGF1MkRPaEFyblhobUpXSEhJQkFBQUFcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfNV9fXyA9IG5ldyBVUkwoXCJkYXRhOmZvbnQvd29mZjI7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R01nQUJBQUFBQUJ3VUFCSUFBQUFBT3lnQUFCdXhBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdrb2JJQnc4Qm1BL1UxUkJWRm9BZkFpQ09BbWZGQkVRQ3J3SXRuRUxnZzRBQVRZQ0pBT0VHQVFnQllSY0J5QU1oaFliVERZbDdOZ3JBczRERXRMWmYrWWsvLzhoUVJzakJPMFByVTJraUNaRmpBS0xZc1JpT0VFUm1maFF6dG5OTjZKcnF6dWFWOUJQc1ZveEphMXJiSUdoaDBObjhhV3hmYWI2UFZ2bkRBWG5yK0ZjREF4NlZ4U0RZRGhFNTEvbU1ZaW5tVlNKWTN1QVlvUWtzenhFYzN5K1NXWjJjd0RnaU1vTzBGVlhBYkJRcHdxbzJmMEtXVjlXVldoazNmM3NUM092N3k3M2s2TVFmeXBnaWo5L2tDa0VDZVNuejVYVGR2TXNEUHF5R3VtQ0hyb04wRFk3TUxiZFlXT2lIbUJFWW1CUk5tRTBZQVlHVXd3d2h6WXU3TjdtTDdwZFZENytVODcwL2RGSWJFaEtwQTJRVStSWkpFUHFXU0F2RUdnVFZnSHdobExSNmFsSHdzc044TVFDZ1IyQzBJRDczL00vYTZWcUUvYWFBako4MVE5cnhtR2E3aUhEVU5aU3IwRnFtTTBlVGdFK2JkWFA3ZktVVS9zWWdtaHRkSjZDb0ZnMUdKZVpaa25iQmVYYUZ3OGVnbGhyb1QveFpVL01YajFoR2lxaDBSaWlsVUlvNGVMai8xVFQyZ0VHWTBKTHJaODJPV1FGT29XaU14MVN4ZElwVlM0cS9BOE1pWmtCZG9kWTZTMUJjaU9WRXFWTU9XR2R1RnFIbUNwWExxbDF5T0h1eXBBNzk5ZWw4cXFyQ3RYWGRtcUsrdnd4NW5mUFZmMnhEQW1GdUxXT3NWWTNpRnEvUGF3U0VnNklPQ21aK3oyM3JvQlpDbkU3MzViT2hZWVEwU0lkVGJpT0laU08yMmdkZDFYRWlPYnAyNzNwUWdDeDlVejBYK2YrQnh1eVdJOEFoalFwNk13K3k1MWNLK3hUSzdQak1IOXVkbUFNdXowLzBEZTcyOHU5ODVQam1ScjJ5MHhIK3hTZ2JzbnpZODFXc1dUelZCOXNQM1VxOWpzTjJLNTk4b1VmZXFTNW1tb0M2VzRzNHMwcHdMS3lGa0I4QlNBZnJ0WHJsR3hRaXVacXY3RFpSY2ozbnA0ZkptengzblBEOHdSQS9DOU5QOG1TTk1PRFIwZTd4OFU0OFF6eHhrdWpIVEQ5Q01oaHBWSlBTZ3JvQ29rZHNwN0ZCeW1MMzZjZUN1MElzOGlJNFZnNithbjlwZjJyT3p1a0VCTWx3elRTWXlnV1R3NmQvTnorcXZwSGp4SkRadjE1WFZ5ci9pOTRkT3lSK2FPYXRVc0FRdEhROW9QcUF4ckxveVFKR2pCZXk3Zmk2S29oL1Q4S2RWNTZBeWpGY0RMSmx5SW1SZU4zUXpKampBQ3dwRW1uN1ZKOXZHSHRtcWQ2b1Y1blpJYnZwMHFOYlNhVW03U0ZtSWhFbHhZVGNWTkR5T0c4QmhJVWNJbCt0NGZWd1NmNlRiZmJhc0NZZVJYcXRlazFhc1laWExuS0NUVGJMQlZQdFhwaTNmb01tVENyWEpNT2tyTXhJYzZPUlpkWjhkelhiMU5KcU5teEk5cGkwS1NUUGlGdXFsU25VWWV0SVVjMWZKUnAwS0ZIbjBGekJTSm9SK2FLNFRvTnpKTjNVNTdlM0N0UmFLZ1hDZXRxYTZvRlZlK2V2ZWJvclphY1l2RE9HcTJrY1BDMmE1czZoaWVQSHozY3E3eDdzUHZOWnIxYzNMOTM5ODU4TnAyTXkxZHU1V2RPSDg2U3ZaVHoxOTJaYTZDU3RiYisyYlJXQmkyaFgvZzhhTFlFc1hSbXZuTEZTQnZqTlJzSWNJclR3dGhLNGFMdkhVSTVJMmpOdk5COHpmTmw1YWlRSGdCeHdrYkNkZm8rVVBOU0NTeW5HRlYydW54T3F3dmNxRWtBclFWc2t3bFlpTitmY0hUdnFDWjBvaWV2cmVhZkVzM1dNL29zRzNhZGZiTmtGS2RrRTc0Kzd1UnNLNk14V0ZLZlZIVmQwVHpnbm1DenlzRU5Xejl4MUhCa0w0N3JySHU4eTkrWFAxS0EyeEJCZyt1Rmt4TFF4MXJXc1hJOGRkZFN3b2E4NzZQRDE1UHZpTTF3WUdUSVVCYnVwdDhhQ2pxZGFjc1hrd2pjMDluOE80eFllVStaRFBlTW5RRnhxVEFaY3F3dzNabW9wL3EwYVl6SVM0cENUejNGSzExZUt4UUpjbXFRc3piQllrSFNtcmtQaGdhek9CVVFERzRaZ1dmQURoaUdtVnpyTEJnaFdIcEZGR0p3WGs5WXFqQ0VLUndXWTVlRVZDM2VTUzAvSXNBa3ZPdFFqSHJFbyttUklubWh2ZitTSWxxWTNoZ2V5cGtIbHphR3l6Zm15NXZYK2FaY0VGdm0ydkx2T29qUkpRS1laRm54UEp6TDRhQkk3TFk4dHAxYUFxTkRhQ3g0elZWRUVSVEhJTlpPZnpSbzR4L2FqL3dZWWUrVEhIZWFmVHIzaWt3WEtabC9QWmZ5WlJWdjduN2QxSHZDWUdYYzRXZ3JjZjVSM0F3SzA0YkxvQnRsY0I1aXVsMXFkaW5GZmNHMlN5a3ZwU295WkRUUXVIYjl4T1BlUk5QZTdEUDFXYUtxT1lFVjNWZXc0eXRsOStmcWMxTWplaFcwRS84YkxyaWdadytrd0RVUnhNTHQ2NjJQY0JzSWp1RHhsVTY4bEJuam44MkdBeW9TN3RuUmNEQmZKbkhmTHZhY1NHZy9FcitDbGg0ek5qRmJiMlEwRzduODROMmprVGZ5aTZnRFlSWEJaQmZlYlZKdzV6VXJPVklMc1FTSGdEVzNVVldaZlpGTjVjVDVjOHRybDhRWDBrdE4xTlI0TGJJaGZXUTBIR1FQb3BxT3oxQ2N5enJ0WTVydGF0M2VWWFhndXZMdTRZYmxWdmRCYkkwSkZ2SE1waXRTV2lKMVhMUW1QUGt4WDB6SmxUUFUrbkh6YkxGd25hOTVkS29SRkN3TVNmSmpDU05Jc055TkJFTThOU3pMMDh3QXptMlhSMUxqbHpFWTFSajN0dDVVRVY0ZmladnpSM3ptTm1DTXlWaW9UZGtyeEFlVTFPSVBObzNaeTVLcnRmSGdsa0dpemtrZ0ZaemRGWk8yMlNtWVFNMFpNTHJrSE90YktIZ0tZVUFlYlRRMTFESnQ0d2pEUjY5Y2hBVHJqc3BSSENYamorQ24wU2owNXRTbGpvMkFjdWZtRFFENitacWNHYkIyZ0JaL3R3U1VpcFE3R2dpcTBKeWV3OUl3YlRsMmNJTkwzd1dhZ3pZUWdoQnhzUzdZK0M0VXBCTjdiNnhucGUvc2h5ckk3a2pvREJZcU83SlQzQThsL3hTUGNnVnVzeHNzRzhxcHBOdGRqRnJZUTl4OE90OS9QQnpVdGsxY0RQZDRHVEZoVStkSnBCN01uYkpYdEJsdVNNREtvYVdlMGhsUi9Sa3hac2NIQ3V5QkVyM1ZyUGpOaXFEVTBkUGdKU0l5R3FGR1lJMkZmQ3VuMTRkYVNyaWxTVitZSnU4enRibGxwUjJwUTB4aTZFa0xaeSt2SS9VdTVYR3hETytjbXhFbG5Pa0VSTFFYa3RKVXcxQlI1blJiN3prUk8wSFdZeENSVDZ2cFBqcTBjQ3dLREpIM2JaQ0dOVFR5bWxlU1lhZHhQYm5SSDZnc0hFMWJUcnVSdktRc0puWHZVTTI3TlZIdC9UeUIxVDQ2UkI1bWZJbktRWVhEaWNtbkhoa2d3MEZyR0o2WXhXT2lacWxRczN6RHNkbWVNNGJOU2QweDJMcVJrTEZTQ0M4NEpEYVl6UkRBTGtWWnlhcUV5aHR3VFFFOHljNUdGSUd5Qm91cHJJSC9Zb1dNM1I4c2lMbG1Zb01lMFA1QWVwSDgvRG0vd0ZJSTdiTjEvY0lCSCtoUCt0Z2p4RFRNcWNXaVpXRGpqcC9IZkw1Q0UwczJrbEhBV25rT1EzaUdYcDFNYVVCS2NPV0MwcEJRUURiNUtjUGJ3VGNzRWtQWlIybUNPeVBkQms5dGdxTTNxVElEUHcrT29JdFpSWWJUT2hMLzhWWk9uUmNtYWV5NE02cS9CSXNQb1ZmMDFLVm42Ym9GRnZhRklmSkZ0SEdkQ2UxYlYrUnNWK1IyOWZmNGhpMURKMXFnTldHSiswajYwYmtCN3drSXVJZUYxK0VJWG9SQ0VEN0w4aVRDVlpiZ1RTWUl4TUZqY3VZdjJDQW1zbkZxOUhHRCtHd2ZNQ3FYNkVUeGpUYnUySG5jdzVKeUtIeEU2YWhub1V0YWJsTzF6L3RNbGJBaDhlMlhBT1RMbmtJSjlRcnpidUdsc29RTnEzMFU0aHViY3F1bkZPcDh5Z2M2UEM5NkYvZzlzZFJLMlBrV1JrU3JORWZCZXJlaDhzdi84ODdOY0hySFZHOEdpbUxvV1Joem43Um01cnc1a3d5eTRmR1RqbzM3QmNtSy84ZEVEU3FYNWlSMS82RkROODduVGRsWHUvS1hBWlpIbXdSeVpLS0RDSjVaUkQyaEhMdVJITEM0RDdwWS9ONk9qRSs5OXpMK3N6bWFyOTRndjhpNmNweFQ5b242NUIxUnlCODFWbk1FanVzMGZ1aEJYeCs5dWo1bllSSXhQdFZ0eEtWOHArL1F0UzZCT2s3ME1WY3JscTlnZ3FZbU1Mak1GVjhYQTJnNFYvMzZOYmdmeXZ3eldaekpoWGRadC9xcFZCMUpHSTJnNlBFdGYyL29xT3Z4bUg4d3ZUcUdTdytkVmdOeTNkM3JYbnozTG5kL29PcmZkWUpiZ3hCNUExK1ozTWpyTXlFM0puSWxPZmNMSktEZVI3Tk5OcTVUZjVEdjNGS3ZySjF5N1BzNDdpTDZDZTZ4WHh2OTJnY0F0d2EydWZ0NjZaQTJOcXlRTi9mY0o1U1JDeFZ3MTJiWDY2c01DZ3hZaUVHUEJodkZ0SlA0Q2NnQmNLTlN5bzlvSHBUcVF5bDdsTkwrQkF3RUV0d1NQM0NKaWdxZ0hEeVZXeXBvL20rTmtwdURVMEx2Zmg3S0pRbkRuQkdaK2gxSnpNQnZ0MDNIR2ZHYmJXVGRzT3VQVGNhK3dNekl6eDN4MmFMY0ppWmZFZ3Y4a2ZRQmlzcFNpTGx4Z3dsZXUwYUgrRXAweGFpSnhEbDhCQ3JMYWU2V0VkczNpNE5COXo1RGV0ZjZtUzJWc3hIYk4wQi9BVkJmdjY0dERIYktQaVlncFdCdGdPYlZGTG9yb1Bnc3FDd3VpcVZDNXgrd2psZ2pvSmRkZzFaQXNnUGtqbFN5ZzFpMitTQUxQT1JrT211VWMwOWYzZVVTOEdVK2FEM1Y1MHF6Z0ZsazByd0p0cjdFYjc2UTlQYUxzNzBmR01mVkFGQjNCSG5TRHE1T0JTZENjYjJ4ZnEwVjFYekNHREh1Y2pHckFvcS9maXNCWWxEVmI1TVZac3hISE9RZEVEQzEyQlZLQkZsMU5RWHhNNlIzNjdyd0lYZ0VzdmdjUWF0RGdZNEszZC9XdkJ5R2hXSXBzQ0E2UkFkcGNNMlMwTS9IV0pMTDlHMEp6bHk1WVgzcEJ4b2ZiK2syVGFodjJUOXRBSmxEZnVQKytWWDVLZ3ZxTDhlR1hiM3BKZHRicXE4emlLTWgyajdkZlcyQndhWEplYlBnYkFyNVdzNlR5WElleklmS2hrYkVQUHJKQmlDTHVQbEs5SHF5THU4UlhjR0svc0VUT2JQOEdCb3hlVElPcW5SNlJhOFkvUzIwd0FzM3ZNNzlRR0lqdHBYZlVFem1xckVKYytiR0RYTWRhRjZjRkRDWHJGRDhQV25GRGpSaThqOUwyYnIwVEJEVEl5VzMzZWRKNWFJRFJITEpmYzhaeE9kc0s0NCtjNGM2UEZwZ09CaUR1Qm9iVzNkZFk0c29abHlZd055bFRsNmhiVHBEb2hNYzd3TXpIenpGM2ZQNE5SVFpxNjh1UXoycmsyNlgvL3B4bVpUZWEweVhKeXN0SVFMazRmcXdDVXU2TmxPTnNmb003dkhrM05MUzdkSXUwaVZ3a09PUzFZbjZGNDlhVWx2NjJGSXVuYSswZkpXN1ZEVTNXbm5Ddi9nNzJsYXAzT1I1ODhYU3VjSEtrd0dGM2N3T0QxNVdUQWRoQVQ0OGNHcmZ2OGw3WGE3bDZYRnQzZ3ZZb3lOQ3h2NVJyakpYVFhJeW5yMjkxZ0JLbm9TZWxFOURYMnJuSVRhMnZLdWhuVC9LNU16b1ZLRzI3NWhDSFQyQ0cybDcrWTZ2N01velVqSjRhSG8xN0hCZkhoeGo5K1JqTlhkN1lXcE5NTFhyc1kvZFpyTHlLQVZrOVpWUE5oa3UzRGx0MVJhMWFCR0RQRmxlYnIvV2VWRFlOaDZhUk1sMkljVVFRZTlRb0Nna2lmU3VHcDhYWlRUNWFqVUZTL0xMRHNGbHY4RVVpN1RzcWdTL0VtSUN6Ni9QOEwva29uaWUyVWMxL25KS3dxNGFFUTFvdTNTR1g5VzdyWjRYU1dzWlNQM3NPbUdzWXFFbUZIUlhoMjZ5cEJtMmtYRTk1aFo4cmVycmxqV3BURmRxVUVpQWlKNDlyTzJ1MkUyYXhMZURlcmIrUUpNRmJocHZaTG5mek1NdlFQbW5VdFhPMUtSOU5lbFdaK1FPWWZOOFNGYjFEdWtnKzJ0VExVL24vOC9rUW1oS2sxZWVRMndLc2RWd1o0NnZWVGszaEJISWM0dlA4R25EenliV0NkcVZhOVVpK1FSaVdaUWxLbUpqKzlCVTkvYUs5VVNkSUZKSUdIV011K21PNFFMMzBaZ2xKRFhwWERVeldabGlrcDdiMjJ2UGZ0THcyUmMwU3Bla3VYQm9qYUNRTVVXMTMrQUxTZVRxemVVdnVXejBiaENUMGxjc25tazNGdkxybS94MEZJL2QxZzVpWkVUa250OGZ4RkxDWXFKaXd6YXFNdXViZStIT1huRXZBN1M4M0V3U3RFRjgrMksveTVqYTBqRW12RTRhRWVXdXV0eGJlLzdnd3I3ZFhIa3F0cE1DZytEOWF0SDFkTW9FbjJmMVFCNnFmVGtaemczSmM2WkVFVUYzM1FmMFQ5U3VMdFdxckRUY00yNjhwMXU3VXFKY2ZMY3B1NnIvbDNjZzh0WnNzazJ5anFXSEZIbTA0UG9pc3RJcmN3T0xBK0lxZkFaeE8rS0s0bmdPRUdSWjhmZHVyNzltS2l1NzZOeFE2Wkh0dzI3VVRtK0lkdzdzUGxISjRXcmo2TGRKK1E3ZWJESWtadytzdXhNRUV4SVNBdjlrbXJieFNsVkZ6ajJWQ08rQ0dEY1BxeEI4Z05XUlN5MGR0WHpTMUNOOEM2TGQzYzNJZUg5clh6emV3alZiRXdTai90L0ZudnNGUHBsUitQQjI1YnlkSmJqR2JRdXRMczRhQXNxZE1BbG1MUHdIa2pzZVlrLzZTVjJiRllOQjIzbm82SWptT2s0U2ZwMmlkQmdmTDQ3SlV1czlrOGpkV1dPRTRneE9ybGNWRGtGMHVLSzVZMHZwS0QxdEZsUDk5S1czVDVtZnFJOGd1cGNyeEs2SVZNTElOZG5KVFQ1aGlvMUMzTWltbDYvNW1ERzJQei9XRkJWMmJsOU5DaW4wRTJmQ3pFaWlXN2xDL0FwUEpZeGFrNTNjN0IybUJGM2ZHSGMvaVpuQjAySzQvWGFFWGgvVzlPeU5ldHhQS1lmSDhlbjgwUENJZ3ZoRWRaMGNkUkNNRlltU2c1dll0bVFjdGFlVEtEbnh2OWxyWDd1ZFhwQVNFNS93ZmVhR1E1Sm43RENEaUV1SWljMXFpWDkvN1lqbWRIb2VibHhqbGs1T29PeUY2Lzg5MngvNXlUdlFqWlNuM3BnWFZIeEwvZDkzOHZxU2ZLY2Y2RzlrcEhkOHYzcnhTSWpzSjIxYW5DdkJOOEl2VU9rVXprNTRtMVRBM2syZXozQk1Jc3dxSWNLSmNiOXRENnhqVklNSVNTeGJONHNnUFJYOHBjdk1DWlBKdWhrRitYUUxzb0VqY0xwbGxwMW1wTjk5SjRSSElCWWh3akl5bTRJd1RwUjBBb2FZclYvWTF6WUVSRjFSV2U5R2cyMHhWQzcxTHVad2tVTkxDTDVGeU5ldFFMNzFDeVNRODR3YUJZRzhXMmdNcmwzaWVZckk4RC9qdVMvckVva2IvSXhNZFhlWXFIT09oS0NSV28xeGJsNCs5SUFBcFZPdzdZa2JWQU1KU1ZGMkhtYUJHRFg4dzBzdDlTVnN2WXlDZklZNURlZjRwVkhQZ3BhdFd2cFlsajRva2lsN2Z1VVVTY2VKTW53YnhuZjg4cnpuV3VINTc3UCtiRGVpWFdudlFiMUpQL1Y4YlE5aXBZSGNCd0dpSXd0NW1oS3NEVWV5RHpBMU9DQlRtVW8rVG1pRlFxYVlha3N1SFRHV1F0b1FsZStpL2h1S2ZzUGNoN2tsWnIzSUZnQUhLdlo4eWd5V0hLVUJOODVENnVweS92U1hzK1pGbHJ1U3YzTlhjaVZuTlg4Qm1wZWdkODJVczk1bFdNc1pvdHlrcUtiZTYzRmdMYzBUV0xsMXlkNjV6djNxM1BXU3lWM1B2ZGtiMlJ2Wm0zU1QrK2NOM2NTZ0V4V250ZzhRSWttbUl3UnNwdWFnUGxIT3dHWVJxK1J1QXNLREd2SW5zdTdsL01nbEErWFl6bGpoMEx3UnNsWUJ6WHpJV2dOd1UwNDdHd21lNkhHRjBVUmEweXNSbXhtY2YxQUVTcnh3QTVuZzAzTmFDREZLdFdUVHhiSlFQQlpDMmJpa2t3eEZKeXpaZEcxaEtOcHF5U2JWMlN1NXE3VTFlelZyRFVERmx1ejBvcWREekZCc2lkWlIvUzU3S3FQd25lM29oVndheitSU2UvbVFzMkFPdzNsRW05WWE4dmN6VGlLMVpqQnREZVVTcXM4VVdJUG5rT1l3Qlhva3hBWkI3Mlk0ZXB4aDZhTU1SMzh5TEMxaE9IcWFZU25OWTkyNURyNmxlZ3hIKzBKNUNRMnpGT2VYeGZqTGtLVnpoaWxTR3cvdW5CdWZDOXZ5UnRHamhrTzNmZC83QUpaTys4MTNQTVNBZkxJenNjZmJqSzhYQWdGMXFGWXhBZlBIbmNZZE1KK3ErOGJHMjZxVlJJRlZaT0M5N1Fma3I3MTllS3krckdyRERmRTZsbHBld2FhVitJekQ3ajdaMTZJbVR2YW9KL3I3UFVxckNkSjVLK3BRUWVlK0pkZ0ovZTBCZFAyNUNDck5YZGxGTjdHM3BSdTI1OG5GV2gyVTlUeXgyTExEVm5HNnk0VS9ZVElCaG82QUlKaFU1TVBuWW1RK2tIR1NEYkQ3bWozZXBwdTQ4K3RPMnlQTjYvNmU5V2gvUC9pNENVellleGRxdGRWb2hNNmU5bURQL0dVUlZCbGQyV1c2dDNVZWJ0aHA4KzZaN29EcGV4ODlxcHNjYW5YOHBQdnAxVU9TQTFWdG5jZFpLN0hKSWhrU2YwMnl4OGUySnQ2eklmVmZxajgwZ1E0SGh1M2FzUVJYcDlvRFNDK0NhbXBYZGpHOXQ3VTE3QjV0ckxjL21ncHVPTWJXbU5paVJYVWYwMEhVME9DZ2xxK01oZEN4cW1Bd0lVa3hSZGRFQW93eC93bFFkbWJxVXNPeE5TYTJhQmlqVG5SQzFOQXVSdXBTdm9yMk9qYTlWdWNsS1diWldpaE9MTnEzVWZlcHJEL0t0cUVIOWJ5a3BxNER3b29BVlZEMENyZWFyY3E1K2U3TUJxVkFHQk85REJCNzJ5NzNDMzZ4ZzQ3UVZBaE1CNlJ6UlJRcjU4WFBTd01SRFZPcWRJd2Q2TGdxWTFzUTBOenJIWkJHelcxQUFQN1RYblo4MWZ1TWZLNGNYZG1XTlRURURSV0VZWnFDdUY2NzVaMExza0QvSlIzUGd6Rm1xQVJFR3hzT0JFRzZBcDdMazNiSmRsTURJRURieVZoSFZQZVVOTXNjcDNsRWZoTXI0OElqa0VwZEdXRG4wbXYzcWdPalVhUDJta2V0YkszWnhKME81QTJNQkUzRjBsMmlIUzh0Rmllc2U0b2I3K1Y4M3VFcWkrTldFUEFFbEczTnp2WVhEblJIUm53SnlyUEFRL0tMM0dvZmhRaWhkL2NVL2RZZzV0dWhuU2xxb1dlVzZrc0ZsOUx4dE1OSGZxM01qaXR2bnViQXByVnMvMVE4a3FST21lMGlWeHV5NlBXR2RoaEczcmt0WDg3MFhTdUNTYUdwN3RER1hsWDl1TzVsMjR5bmNlT1l4SHF0UEI2RU1DS1NNQklPYzVVMUJaTWZsZ2ZwYW5Sa0lDQnA1NFNDV1JSSk0yU1paMzl2UFNSbmNDV0lMUjFvR0dXRVh2ZU82Ry9ZVTV5dWJFZktnWjJPKzJPcXN0N1ExV3NDc3FaVDE2NHc5SUVkS1U4WERNZE1TczdBQlRQcjZBRHZDMkhCbWNNMXRzN2E0Q1NsMHZSWkJteFhnakRUNFQvRm9YbU1USHRTN0xSa2pOR043VWc1c0hQR2ZWK2Y5WjJTbjZDbDNzZVpENVRUMmlWWEwrN1NWRTdiYnJnRitRazZxZmRSTGp3SzJpZHA4cTR0YUR1eEFPMXQrZTdQVzBFYTE2M3pOdUphbzVZZXpKYlpjVnhsZnduZVc0N213alhqdFBhZjJSNExzb0YwN2xFdjNXU3lHMCszaG9mdE9lWUl3WjNENEFXS3ZXVldUWTU3TTgrUkE5ZHhaS05tZ0xNUjFnaVNoOUk5QkZHNk1ZK1h5cmc5N0pveVFvOEROd2ZOaUVreVBpMGViZGRET1ZqSjNkYjJOSzRpVHhZdlBMUzlMNEFBQ0dCMjhXcUFSWGdzNGZrL2hRd1VNLy82L2NoVjREWC9lODg0N0YvOHY3OWJyaThDU1BxQ1VBM3c2MnU5NVUyRC9UZDR5dnpTZGV6MzQwYWVkemczRG5IaU1TY0x6RHBHVWpuR1VnRmZac01SeUt6Q0l1dXg1Ny9nVG5JNGx6VTQyYWRnWGh3ZWs0cTNGU1VRQTJ4dTJSK2tpSVg2Q0M2OGtKbzMwK1BRbmNNOXh3Wi9penBFa3MwNGRkbG1GM0loWUhNLzFuWXBZcGdZeWpYQzhxRUJDRHFLZnRLRmxGeXRqSWQvRllGVG1BZE8xMVdEUE0zalEvMGdGY0RONXpXTUJQTHlScHNLRU4zOEdpS0VMem9QQWR6UVRnT1BITXhoWXl0Z1ByYXJqb3hHZVlmM3BXS2FVODhQZ0F6aW1jdGcwdGVNcHU5TWh1ajZQOU9RaFg1RzF3N1hPWlorTUE5RGdPM2had2c4bmdpNUN3UnljWHU4OU1VdXBSaHY4Sk1uWDdsQ0dkS2tLNFpsei9ZVVk5RkZneHVIeXFjaUYzR2taSWlpU1lUNTRqeVpJOFhleHI1S3FFaVhWYUdPTkVXRVNlUUxzVHViZXpsTmhoWllsNlN3eHA1a2pnS295Q3RMc25HbE1wRnJFMFdqTU05dFdKUk5adWFKSUVNa3U3Zk13T2JBbXUxaHBvY2dvU0tJY2JOQ05zRUtyakMwcEk1Z0Z2aEN3RldlWnNITlZjSG13Zk9zVW9STnNjb1BUbGxqeHRtc0l5a0VTMzJvUURTc2tCOEd3V0tLUTVjSzBWUTU2SEVFcmtXVU1KRXNMNUVCNDJ0OXBENzJpaDNUb1lqeDF6eCsrV1gwRndGWDRPL2xtM0RuY2dOK2VEbDRhUGxIMjJMd3dPSUJXRHdmM0RmYkRYL05CdjcwTHZoeitpYmNPQjJjbW03QUo2ZlB3YUxKNFBqUXJodWV5OGM0Mmg2K2pqZU10b2JucTBiU2pkRXM2eU1LL09aOFJTTmRxYVhMZFFDbFZRSzhhcGFGU2pwZjZQRmVkREZiU0dlb1BWM3FxWExjWXJMMElTZVhqbWQrT3l2VG8ybXdNMUk5bk5wV0cwb3BwQ1o0bFlGRTJwOFV3azZNZVl2a0F5VkgwcDY0UlhkOFBpR1Vkb2F3NHdMZDd0cnRObGRMUHh3bzcxZHpqN2ZKa1luVUc0SmhDWGJXMGhuTGRLQzBsVUM0clZ1Yyt0dlE3SndQc2UwNG10SUdRMXF2UytzVWFhMVNUWTEyUGtpVFZxblN5a1VBN0QwODR6Vzh3cTFZNHB3KzRSVEk0a01pazNWc1AvamRzYitReEljUUh4S0lYWHozakxVcjRJcnRZZnVmbERYRThvVEJnNG50WU5EdUgrd3dWakpVUlVVWnRMdERrWHZCZmJDOHg1ZE0vdWIxY09OQjI0cEs3ZHFkdVoxcms3bExNcGZucjNOUXIrTTRrc3NFMytLL3BwS0k0dGpYV2VqWGFWQTNjbkZwU1UxKzNYNXRESElLVzNnYnd2MVZKa0htZFFiS2RReERNcGxnVyt6WFNVbENFVUtsSWowVVpGUDF2UjZscVlIWjBoN1E2V0J2Umxnc1d0c0NMYjluNU5yYTh5SFJBL0xFL2ZmanNySjU4RkFtLzQ2Q3RvVVBHU3R2ellkY1VXeGVOb2NVVXFuVTNBVVo1akI1Q2c3TmRBQklMTVBVenNzRFNoUUVkNWt2dURTWmV0QkxQQXNKbGx6SUN3RUFcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfNl9fXyA9IG5ldyBVUkwoXCJkYXRhOmZvbnQvd29mZjI7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R01nQUJBQUFBQURSSUFCSUFBQUFBWjlBQUFEUGhBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdvRVlHeUFjZ2lZR1lEOVRWRUZVV2dDQ0RnaUNPQW1mRkJFUUNvR0xlUDA0QzRRSUFBRTJBaVFEaUF3RUlBV0VYQWNnRElZV0cxRmRGZXlZSWVBOFFFak85dzUvRkJXa0c0OE1CQnNIa0cwM2xQMy83Ymd4QmpSb3RhOXRtU0RrZ3RGbFYxRkVnbDFVS0p5TmJ1dkc3ZFZqR1QvVDFtYXJ5ejRVeE9yVk5nMnFST1BDZWJsV21pNFBHeDhpOGlJcU1ObVhUS0VYd1Y4VW1nd0dsMHRtTURJV3NUaVdZYlBSRGxyWHlsNzVaUzZhUDBRTWJSSHlBeFpuZ0RzNW9oSG56L09uL3JsUFRlRVVTbDhxRDNDM2pCbWNwQUtUS1ZNaHB1RDIvMisvc2s3dzQvbi8xa0R2bTUzNW03Q0t6YWtqZEFDb1dvZWswTmFvYWlLWDFyRlNNYnF3LzAvZDYzdGlRd2xEeXFsU2dmOVkxTVVoN3Y5M2NZQUtSQzZRaTJPWHJTcmdzblFhTTR5R2ltNzN0M012SEJBRzVFRVNKa0c3QTdETjJ0b2hNaFVMQWJGUkFlZkVRSmxLbFlDVWdVaTJtQ2lJaWhHOVdYT3RDOWVYcTdySStyeHJlMWpYS3hURnc5d2V5WThrdUpSTmVXTitmK21zL3JXNjFkMXFrTmdDMjVMTk0rUHhhRTVlQWg4Z3BzZDlSRDdJQ0NxbklObmw4Q2hjNzhFbnlINFEvb3g0M3JhUjJrdHBoMyt5RUEzaTk5b3ExVXZZQjZnN3UvUXExTXpGUk5PRGhsMHU5UnFrb1hzWG1UakV5cUl2WTI5b3ltSXY2c1JrWThrZUliNUVpdVZRTXdCd3ErR2IzWWhROEl2OU5iOFZoWmpCRHVqRXQzdktWekk1UHY4Mi9XemZhS1QxR0krMS9nNndGaFgyRmwyUUt1cW9hZWJkTjAvejNwc1plelMydmlVWmVOZjJSOG5lSDBzZkJmOUhXa1lIcU51elZjSXlCQXdoeGlwYkJrc3F5cVFvS3NBdWRkb3VmUlAvZjN2VmNyajhEdWlHYmpWZG5YaXlTdjZmaEN6ZTdSNnF5bktxSWlOcmE2VE5nbm90M2VSSnczSTg4VysxL1R4U201VlJ0bWxYTEl3OFhINU0vbWJmb3czMVZVVXNDZ2tSNzg1OW5tMzlhNHorWHVtcFMvQ2xiSnFJaUdmU0Z3TUNETlJBeU5SUG9iWVplQkJzMmFJSXRuVWkyRUVSM1dtUDNJY29nZ05SQkljNkVRZ29vbTU2b21NbW9sT3VSSys1R2IzallmU3hWOUgzUG9oUG9JaCs4VFg2dys5blJvQURnSWJzUWdBYktvRXhEclR5SWRmdHdBSUNMbDBNZy90T0RWV0ZiRVMvMGhqc0MzWnZWTHY1UE83d3BsWVFmS3ZlVlliNmc5T1FoZ0RFeG52WDBtRDhKTThWZDdCNGlzaS9nOE56dkkyOU16K0NYRVZRQkRzWUI4TDNBNkV2R0lKTzYxWkREc0FIMEpFT3VSZ1FvQVFMcjk0Qm0yVFZVcGUzZXUrSEQzNzY2SmRQZmx0LzFqbm0yc0RWWVFKbHlxTi8wZFNBZ0c0OWpqb0dBUUg1eEI1NzRyMzN0NzU1NS90Yjc4ZGZoRWdFc1RVU0pBQTVZLzdUZCtxTVNqczE4dkxwNHlneFZRS01yeWFIdDNuTjA3dzFLQ2xRL1FzcjcvOE5BTmJ2a1FOUThjVTdlTzNxQWtBamNuVllXVHZzOWR2aUFJdDROZFFUSVlDSU56eERFUUQ2NmRFbkJCR0FBUVZhekNBQXdKQWhFUUFjRUdESU9CS0E5Vit0SVVBRVV0RFlTUjJrb2dSOGQyWWY5Q3RCTnk3WmtzTVJKaUZIVTVxV3ZNcmJNRmpUbUROMlgwU2N1emxwbkNMT2gvTHJIWFFGWFUzWGM3V3JPeGtHQkdoNnRrY1EwVWlzSk0xNTN2Vjk2TWVBY3hjbk1mcStmTFZ5clk2MEYvU3RtUjZYcE9iOU9Ka1hCMS9lMTh2ZEFMLy85TEg3bCs5TDc2KzR6N3QzNWQ2THV3MTM3UzRyd1ozZmNxa0NIajNOZnZyNWZTYlo3SkhYM3ZoYWJNcGtGMTE1bHJrV0d6RFAxVXMxWWQzODdrbWRUL3BGUVVwbWxxbWVLdUNreXFzbTdheVFRREdYNWFoMm5idGZLWW5zS1RmVlNSTzg2YU1UTDhsWlZhSlVPeTFQR3FsamNsVGxpb3lRc0ZRRzZXRHFIaWxVbVNJYUkrMGpKM0ZHa1FxTm9xVVRPNmxjblFsdS9FVkprTzBVZCtFU2paWHlIRmVnUkpYNmxNbHloTXd4clVwT2tqem1jc0lQKzVmdHJEaXBzaDEzV3JGcWYzaVhLK0treUhURW1aQm9yYVVpWlRqaWhBTEZHcFlTc0d0MGkrNjVYYlJWMzhNNmZlcWtOQ005TFRVbE9Ta3h3UnNYR3hNZEZSa1JIb1plNDZwMk91dzJxOFZzTWhyME9xMUdyVklxNUZXeVNtbEZlVm1wUkN3U2x2QjUzR0lPbThWazBHa3BDQnBCdVhGZ1Y3R1Z4Smw1TWR2WTNUSmY0K1F0TnNPQ1lsTmtRUnJlRzR4NGd0OFhOenFRcW1PZEM1WWRQSml0NU5scHFzZU5JamlsR1FpQzJINnQwU0dQOW11aFN1ZUJWalZISGR2WGQ5Zk9xd0tRckM3bzlud3MxM3Rzb3ZXV0FPbXpZRVVtQUYvTEV4bDIyOTZVdHhuTGpYbjJOc2VJRDR4Rno0NWw1aXZJQ3RMMm8vaGlPeWxkcVlqdGdXUzZXV2tXODU3anA5d2dGTlFDSGVlaDc1eUNYUmFyUlljTlpKc3ZtM2NvUWsrSUlDeVA5MFRiZ2ZQR2RxTUh3cXN2TkdrN093cWhxVWI0K0NQRXJ0M0tCRHF5S2JySHNpOWVINnVsV1dtQy9xa3V2eEFrMmZ6emtMZjB6UTdSdWc4UkVMUkNPbVlHaW9IeGtCb1B0dkgvMHd1SDlSaVpPdDRnNkxvaTV3WkNtTGdyOXhKeXRLdVJNTk05SlkyRmxWdEVSclpwS3JSeXdUbnNRZ2hqU3dRWjdzcG1UemU0Vno3eUtWbEdtakwyNVMraDRUOEVpQkMrcDdnTVc2VFF4OGYvWVBIVjE5L1VKUEhHWjFvQlBWeGcwVUxnMkoySS9HS2RkVTNqNUE5dTFQSnJDc3V3YVUxTjlWeThoSGFyeW1SNEp6L1NaazZEMkFiQnlSZ3N0d21WeEpQd2h4STNFYTBMTno5MHh2Qmt2WlVrUExNYzh0ckxlcVhLSzhzWEk4MzI2K2VNTFJmbmhSVVh2VDV1ZU1qU1hON25BbEE3bUhBMzdrOHdtTDNKUVptZW5GQVFpMDc2bnFleXE5MVBoRXJJaDRqenUweHRSbWFMUW5Qa0t4S1JodGpNbmlNeHo2MDdpc3pSa0NCeUdMaitpbitHSzY3bytpczl6bU1pK0QxNWFlY2hRVS9nT1lHWjV6WXo2SEF1WEM4d0xhb3ljSDJuM1JydFovKzIzenVUaXVBOVNNdE9tbDl5YVpMWXVUck9zbFB6Y3RQcGhHaFJzUis4UjBiVHFBTGJsZVRHYkJjbm1uWUw5OEVzQVlUOER1bzYvbjA1cWtYVEUyYktoNUw5VTEyZ1NiSTBDVmJ6eWRVZTc3UmJ4WTJZbXVVdkV5ZUt2TzhaTzVuZkZ6ZmFMRVllOS9CbWx0WFA4eVdTYzBjSkNuaTRMNlowbk5OK3JxWW1wRWlFNGlFMEd4ZEgwNkF1QWZCOVJwVTlIaENuQ05SQ0h0V1ZEMzVFa0JJNnZnNE5wMEhUR2RWOWlrVXdlNGVCd0JIVW94ek9XVndJdm4yMWhHS1JWSmQ4bjUvWlNLMUhlcEtYMmVKNGNreEs2QjN0YWNPbEpHUHJBcGo3c1ZlMXpReTBheE81Smk1NWVNeWQ1bU45d29IWXVSU2lHS1VZS0VZTEdmT2RGWTFuYVo0VUN5N1gzVnRLZHErV0JXZVNIaHNXUUxuOVRFRFdKNExTTTNZS1ZTZUlGRklCM28yR0FLRUFvR1ZwTkdDdXlXNWdBWUU3Q0RmWTRGaDB4WE9hUVVkU1FnUFRhSWlyZ2dHaVdWdXhDMDNLSUVad2JiSWhzUGo4bGg5WGt3Z3owWVBiQzdwYTlUMmRPQWRaYVFMV21weEV6NDVLNnRJNis4a3FjRUFOQ2o4OGdOWExpQ3lieWg2UGNMam84OHlxcmZCaTRMTHYyYUxjZ1FRUUNFYmJIYmtoWEZ5dE1tVERYUWRtUG9uams4SjVKVHdDMnZ4QkhDRStjSGJpRklIVU54NjdVWU54bnEwUUZoYk01U3AzbjJCVlR6aEdSenpxS1ltSThpOTVtTC93TmlYbmtrQ0hMMUJzRFNmVXZVbzl0c0RqVVdPSWUvRmJsdG5aalJVS1FUMmtudldKbi9helRUVmN0SzhnY21FeWNDdUZCWU10dUk3dU1GdWN6MS94QVkzMll5aFJBL3BMNjV4NG95UlRhT2J6cWVOY3R3VTMzRlREUXNPT0g5RTRRdTJQRnNsdGpwd2taOXpwQkcvRmUyZUlKdU1obXV4bkdnVm40aHk3VmFoQkk0c1Q0WmpYNDh0eWZ4U29PL1FNdERxQ0Nwb3gzZUNnQ0NJZ1FFSnY4VHh1ZE1Eb2czQlRVY1MvRUVCbDdoNUlsSjhKeW9EckhkRTY1VGF3UE01NlBFNkRkTzZlQUhCTkQ4M2doSW9lSVZkMXl5MHRFTWx5MDFLNXVwaFY2cmJYWUx5ZzFRYnF0ajMyU2lFcTFkeW5KYmpJUmhKQkJGNVFuUC9haEt1Z1ZKaUljcEpIRlJYTUUxMEp0M1p4RjFmSEhhN1Z3SEFCcVJ4S0hHSFBnWlp1TFp0bmRxd3prN29MdHR5TGlPMDlTQWtHbVZqRWczNEFmTHhLVmF4RGNDU3o4SkkxUzlwTm95empuTC9VbXJZMVNZVFROQURIVEZNeHA4d0hXaHpBQm5kNDVHMThJalFUR3htbzZqN0p1RlRkZ2x1UnQybWg5YW5IdDJHVENJOWxXdm9ZRW9LOHk4ajREejhqYjNVa1MwM0w1U0YyVklMYSs2S2NjSnVic3V2cmdkMTI2VUtja0ZFdEU5OFBzT3NjZG5pVFdGNG5sT3V2VndRZStuWkxTN1dzOFR6WEdwenRra3ZZQzNxemFyZ3B6TWRaU0xMY0JYRkpSYXVmZHdmY2Z2ZmZVWEVCbEM3YituMFpvTWZSNjFBK1Q4VWVPVEV0NHNpcHlKbnkyK2lSZkFjaFpmNExyVFRNam5OUHl2SU5oSmgrcHk3N0pGZDlKMW41ZEZkNDZVbjBLb0ZsYUlMNStKWFJpU0xwbURtNGpKWUxCcFUrcldzWWNUMEdvNFBNZUoxanRYQkp4UkZ6NkVySTQ3OFkrd21CV1drVTN3dkErVC9WTTc2dndqYXd2YWVjSTlWVVhqQ2JzdUFpY0NHODRDMXZkcmk2eHhDRUcwQXJ1aGpRY2dnWUw5b2k1Y0FobVBzekpqYWkzS0QyMWRVVi9yeXpUZEhVWXFCcHdNQmZPakhrL0lFcS9zcVpjZ3cwdlNNaFBxRE9LYjRWdE5TRk1uK2tCazdrQlMwRVNRWVNra3NVaTBNSnZKNS9FZUJQb0FFWC9sVDFmSFlrbTFwSlBmdm9MYzltZXZCNnFGdUFVeS9za2VhQllWTzRBQWxVMEQ0bm02dlRPc21PSGNvNjU0NnpncDlFRFNOQlRlZ1krMCt5dFZpZ0JLcWd3RERPbHdwL2FjWW9jU0kwR1Nxa29YM0pZTzB4U0JWRDdmcWRBUU5VbGhHc2dzNXRIcTVzcUJURE9Zb0x4NURMTUxwVnhpUHQ4YVE1bjJpUERhREs4Q3lOQjNzS0lJQ3NlSVVBbGYxaHZEUnpGSHpvOFIzMkF1Q25idG5zUTg4aTFvYUl2cnIwR0NrU2Fwb2wzeW1lYkhoNzVBaWk4cWpmalNwMUtJNEhSSWM2SUh2S09Hck55M0pTQ3FWMTVoUGY3N251dmxpVldvK2pWcVZpc3VtN2FyanRUNnBKSkpUS0k2VlVISk5JSzlVcXRDN2FVb1Zicml6SHN2bVpWNzJrRjAyMzBrclYwMFFJRXNaNWxKUmErVWtzWHBPdmlQdlVQWStyM3ZmSHkvejQ5Ny9mZmpINzhtV1U5TGNyVjY0bzUveGhSMzNpc2xMMjc1R0d4RC9vOUo5MndxdUhjb3orOEY5WTRwOHpkNVg0TldVZkpUbUVVbS9DdThPOUo1TUhsajJaK3hnZnJsK1dWd01nYjgyVUNteXlUbElJZE9WbTZDQnJrbnp5bmMyNUQxLzBKbXQ4ZHN0d0VPL0ViVVZZUXpUWmxCNmltR2ExQTZsZC9LNGdDMHR3QW1WeU52ZjhJRXNmTG5kejUwRUQrT1Mvemo0SVpjZ3lhNVZPL292Uk5DZjZBSG5PaFpSQ0FaSnNUZ3djdURobjQzK2xYK2FYVjBWbkM0YVBGOEhDSmg5UjFxSzRPU25DY3owRjNRbHZ5YXlLZEFtTEZSRCtvaFVoY1Q4NkkrbVdwN2J3NFU2L2tkTlpDZE8xNkJKQVFSTnVUcTRwMlkwdnIzYkhoL2g0bGtZR2U4cWxBWmc2UFJ6WmFZWUJlTE84ZGo1dmdkSmh3OVBwV1NOZmorYzQwOXNCa2pqTmwrd2FROE45aFVMOWdMWGtaUUJITkEwUmE4UWVHaXpQa1diNTJmUWlmbjFNQ2hiK0g3UHBhRTEwbGJydHc3dy9vRHhyYzVsUkRxNmorZWdReWVUTTMyU1JOK0FhRzdOM0JTclZFdlR2My8rdHNxQTk4Um5xaE85WlFYbXVUZ2xrcDEzaUFWblZTVXQrZ1IvLzNwVXRnYW85b1g5eExXMkQzbEg5a0hhNEU1ZXRoc0pvS2oyQzd3WnZOcEh3QzJXWkgvYnd5alRaQXVkZHRuWUNIR3QyTm9UNXRUZGQyalJaSTUwWmVna1FtUmpRcDFQV05EcUxWMkNicmhrd001SW1sUnl4THRteDNtcUhWVjRDRTBXMTExN2dtYVNxbXo3TURGMkw2Ym1ac3pzVnpuSE5qQXRXMlh6VHh6ZmVKSE13U1BJekJHdlNwQ2h1cXNJTEpPLzgxaGVQVXpmMWxTeHYwb3o0cjBPajZOVzQ0eEJwNmNIdi9mMXNHT25qRXNaQW1ydVlwVTFpdFd5dHpnQnZnbU1WTG1rMjBhU0NYem1QTGJsTmNVQnZJWUdsYzNJMlMxWDdscnU0bDJUa2xWK29ZR0FYaVBRZGNLWUpHT1JYM3Z4cXQ1ckRzc0R3TzVoN1puTkFkNm1oaE15eHdCMmNEdHV1dHU2OFZobUk0MmxKUjFhc0dlbDZBY0ZTeVdhTXljN2xIOTlmbFZyc3kvdDZxMHRrdjVNb3dNdjJtaEtCeHhieTVUVnBnakpkcUxMeEtkdHEyOUprUm9hZCs0c0VpMnhUK25GTlNqWUhnWVFicndYZlRudm1mczNHY0xtbEFUd29ZSTUyVjZaWXgvNVlXWlhuUmtCNEVHTkRlREdMQkdRTXZSWTVKWmFnaDBmVEpRS0E2SVdlQTIyQVlMV0hlenNrSFBBeWtHdGtMTUhXakF1eW5UMzZCS240d0dXWnQrOGVhZjFGTnN1akU3RlIxeGhVRDBUOTB2RkwzWTBXT1lCcmorcVFQN3B6TDRJWVYrK3IvYjh5RjlzOVFYbVFzRm1DN0x6YUZrK0VYRWoxUkkvSXJmT0NnRlRxSHFyV0l3VlBQR0ZmL0lSNEhpMjloa083OUcyWWxkY3JrK2NqckVpTVYyNFBnOG5hZU96eGxxOUY4Sk9HbXczVjNpR3VxbVVSTDQ3UkxxVWxUcllwRkRmQkpHeHFES0lXOXNRTnovS1RpbHE1Q3F0cFNRWUtpM0JwTWtDS2lPaVcybUNWaCt3SmE3NWsyMzhSQWYvSDlKOWdsUC81TmJidS9ubTRkVXlLWUgrNUFPUXZHUGNrdDNtOEszb0ZTVXo2a05Oa0ttbTRJcDFTTHBQMUpVNk16eG1PbzlyTXBsU2JCb1B2WXJxQU40TU5KL0dpWFFYZG1jUmxnRDZQUkluUVdFWElLTzNERmRjdmNTMWVIOGhoOTlMS3Y3eGRWRCtSSVlLcVlUeHVVcnlUZkk1NWIzVUhSZGdoQzJ1cVRBR1lsZFFDZmtKaFppckJzZ3FZdEZJNEo5NnBwSmU1M3J4ZkVPNUVsd3FUa3JPcWg1T200R3pXWjVXdXR4MEhaYlBhVnJQRUIySi9oWHlCcHpYMTZGRlBsUEhxeTgxT2ZUQzYra0JjdDhrWWEwUGQ4YlhzMTJpNmxrRXowVjVZUHo2aVhFanRBNzc1bnQ0Nm9uVVc0a1IyZWZ6ZmIvK1hNMVlkRnFuQjlLWjNoRUJDM1lkZzg5ZlJJc2djZU9YTHJxYmZ6M1FYZ2J3LzM3ejJwM25CY0JySlRpSDFML2FtbERlOVhEWTZxN2lmOFduTkN5L2RiaXhkanVOQXhvdWhxN0hCRXJCNFd3eEF4NlJPMGc4TXZQTzBNRVM4TVRPeTZuK0RzZHhoMjg1OXYrbkxELy90dnppZzhSZUlpU09hdDZOZ1l4QVhyT0R6bFFLNUR0NGRINzkzbVJuVCsvMUw5VDlYOXJYZnhWUWdDV09jK0swTVErdjcxYXV2U1dQUE5vaXVuVEsxbC9SRUhWVGNSQ1BHM3BoNXFUTHVXUnFpREN6ZVB1RzN6YmZiMXRuNDhlSE51VnNPUkFLdTNWNm5idzV3elpjaENqTHVHZm1WQlVnbDZMQk1hMGk3azdweG91ZzZyTk4xZklNRFpPUnQyNWgrNm1sbnNSKzN0VVNBYzY0aW4xN29kRE9nbDRJUWJVd0JZZ29rYWo2YVB4M3czd3hJdlhWek4zanY5a25nN3Y2UWtyZ2hXTjNWUFppOUJ6c0FXbEFBTHRRYk5SaEVCSUlub0gwYm5JZjk1OTVlWmJnZk9seFBCaVlVSGdWZm8vREVoM3VKSUZtb05iejZFdUMxck1oTjhPYlBmWTMvblBHZ3Z4RS84NTVlOGR5aDFQd3ZMT05nSS9KTDN0UDYwMHVldTlUcWNja0l2czVjTVZKd0Z2R2k5dDZORDQ1THhuQ05oc3Fob3JPeEx4djk0cHNyV203K3R4bmg0NDk2TGxtWW04c3Q3UWsvZFY1NVRmbVBUN240eTVaMklsMGx6bWhrdHd6clIxZmhIckIxQlVHTlBmN1RpU3dIMVlOUWtYRkdKajZ6d2lvcXkyQ2pHMVJVdjF6SG52ZWJUdWNvWFNjdzNHVENrR2MrUTFKa2lTMGhZaFFFWW9hNGlrcE5LY04yNmRpZE9odG5kY0R5WWc0TUg2S05uVVpNdkF1Zm1BNnBqUVZyd1RaSy85Z3ZiRTgyVno3OHJmS0RUMnVWUDN6V3FDeThJbW9zUXhLend0ZlVHY1lEMnkvVnFJejl6ZjFDL1BSVmpBWUgvL1JyRllZZkcxdG13K1NWOFpPY1Vidm5vL0hJSDdHcEQ4bTkyeC9XbGRhVmdhaXdYdjJwOTNiYnNPMEdIUC9yMnUyZy9WZFRQQzVSMk1ZMEdReDhENHFyU3pxWU1IeGkrK3Nmbmc0aDFST08yTWd3U0ZzK1pXNE1NVlVWNmMvUG1ya1pNd1c1V2dodFEwTGJBbUxIMzVHVTJsbE9admo1WHc0WmM3V25JYUY5NFBJT01mTjRZMlBtUjdMbi9VTnJQQVhMa3N1b0lBR0t0bHBBZmtZSC9MV0FoeTVqRHpHcXAzalMwZkFDb3VGM2dBcWx0M2lyeUxXa3FqcnlmT0pscFV0V2wvb2IyTDFkcWJuVVZadjVsdkpTWDlkNWxvbmVIOTJkM2pmbVJCQ2w0MUxUY3Q0cjlXSzgyMEhrTVgzSTl3Yk4vUW5CL2VDS0RpRnp2Ym51MEljVno3Y1BiL0MxeGRaY1Joa0pJQXVVQkplZjQ5ald3dGJEZXFKZjIvK1h3OWhSRk5selNJR1Jpbml1STMxeGMwS1QxdU9nMWxCbGpZVEYrSXVWTG1sZDZzL2dwaTFWMVpYV0RzNk9vV2NQWXJ4VGM1MTFRazdmb3U1ZnVQWGtFQlRZM3pMdTQvV2pPWWxEekxpSk5GUlRsTzhOZEt0T2dtUFR1ZFFPa2VVWTVNaDNMMTQ3Mm1FZW5sL0tFbHBTS0dwVmVlclB4UzNDSGFxc1hLMmR4SmNuc3c4d3F5TTFiNGZiSW9TN1ZNU0ZPNHJKck1vZDBKL1BHQkFxRlFuYjhmZmdlQzJ3UG1pS1JIZUtUTXBaYVFZMVlUdEozeUFkUk1ENU9Ga0JOREQ0bWo2T3QyL3BvRERFUWN0VEZnaTZwT0RQREpJNlNkR3dCQlZCMGtwSWthZ2lkUVpGbk9na3BvVVRhYStoODhQV3c5Wkx4OXdSRlpFVjF3RWFrM0dRWGlGeEY1RGNNbVFndjI5bzZmakkxbnhMRkpQQjQ3TlhOYjF2SjU3VmZnclBCNDB6anN2UEMvQ0xnQlF1S3U1RWZCTDZaaXFlVEEzdStpNkpHR2dZNkhrVWh5S2kwOHRCcE9DYWo5YUNiLzNFVm5OR1dyanduUDhnQy91U00rOCtoUXJHaGEySGJYUzV3L1ZKWTlCS3d4NW83TzEzTGxzNXJud2ZzT2pqZGNFTWVZZG50OE9BdVA3Y2RFTmVBMkMxcGs2R3BLYSs0NEJyZjdPOWVwQXBhZW5wYVQ4RUVKNGFXTm9ZMitvUElNYVE2Y1hzYkdlZXFVYThCYWszL1c5OTVPeEFBQ21LVHVTenM2dHp6ZlhsVjZQYnRKOWlzS0NMeFdPUVYzY0pUYVpCaHJUTVF5QzdTOU9EWkRVakMxdGpGL3JQd1doc09vdDVUTjN6WnRKcDNhZlFYdzk2TCtrVU4xb05tQWZsRi8yOVo3aG0zMFY5VHpmYmRPajdaWitFc3p4VlQ2RWRLMVdSQmhNdldZbVlSaTFYVEt2TGt4a0pRL0duNU8wdHc4R3MvNTl2MDNLVG04eVBlZk40d3ZoYUVwVFR5dFcxMDQ2RkNFMi9Rd3JCbWtta1o1YTNuQ3NST3pBNGZnNktLOEJUa2pscHh0SWNBNjFLMnJQT2RxaVBveDlsKzNFZHFXVlZOakV6T2JBa241Wk1RZG9FQkJQWHJCMi93WUU1d2RaaGd3K3huOUhwMDV3NHlMbEVyZjlLbmZOSE5NUUxhZFdaejhFenNhU0NaRXFReGRlbmlZQzNnWVZOQmFTR01qUlEwRHg4ZEdQOGdqdUFGRTFuY1Buc1ZXMy91NGxudForc2d2eU1udWpYRGdqTnBnRUdmSFgzSHNaS2FPVXV5NTR6ZWZ0L1E5c3k3QngwMDNsazFVN1c3aHM3V2Z0M1l0eTRuaGo2WDVtYmlOY1pkeEwxQ1R1VVMxOEJ3ZkhpTkhrTUVkVUl6ZnYrOE1ON0dldEVRSktnVnArcjRYUUQvT0lOZHVZQll1RGszczYwZmM5eW00dTZCaGlHODZndjltV3JIWjA5NUdoRWhBTzFVdjRaeERNRDhhZjlteG9aNVlIZzNnaE9lQWVKenFKZ2tlVUpPUitPSjkxSG9yR1VUR2pvcnNpYzU0Q2dXKzhZME1WR2dlM3h6VEFwaTE5Ukp1VTNoL0srZzBiczFtREhnblBaVWRYSkdBNktzRTkxM295dmd3a29yRUt5c2cwWFhKdFAzZDZFVHhCMGI4TmdZOUhWc0VMRXhEZXFWeTdGdjlLbWQ0MWRGcUVrbmIxVGlOR3BnYW1JKzNPdzdXUEhqcklRYi9OTnBRTm5zUFREMTZ3QnA2RjJKWmVjMTdsbWxVeHQvOVN1TmNlZTE5cG9XTXNrWVNVWXlTaStQZ0s5RDBkQ2pmOVBIeHRZYlVUOS8xYjZ5dFQxK2tQRmtyRzhSb05zT0NEOTNTS0cxV0NzWUg2OW1MVGU0RDc4aWV6NTFzRkZucFNxeUNWVXhBT0lXeGJFVEE3bmhNSmxYV3IyQ1RsOUM3cGZjT3ZvblNod2U4dEVSM0gvSVhiY0tDZGhNYW5Ndmk1Q2xzWk8yNk5mM1o5RnR1cWI4eU43OHV3RWxhdDRMckxpZDRBU3BTLzNDZ2hPVW1VdGVTRmhXMW5EcmJQOUF2VzlnZlpwUldSdVVUNjNYMlE5UnBsbWE3aTEvV0h4UHA0Qjg2RE1OUDVZOEpzVGQ1bGFOT3lHOXA5aFBSUTk2bkhwNWJhaE13SUx5NU93YzhmMk83QXlKYVUzYVZPZjZLMEd1TytMSUpkWFFDMGRMSGdlclQ1UHJpZjNKYXhKVVFCcU11RCtjeEE0QUM3dkZMSFdtK293SDVhLzBEWjh2RVRMdGVld3lraUEvUDBFQUVVTzhkVkhlVHlKMTlhU3I0MURQSlBCTmUvNWM5M2VtYUZJNytTNjhQSHpBclBCWTZQRkt0MkVwYmpoeWpvczlOOFZ5VmM1V3E2QW1LZFdDVzR2cFM3YTFEUURMcEVZRjdFR05uZHVPOVpjdmtwa25qMDBCRWhBV2RnYnNKN3IyYjl1eEsvdnVaeGZUMkovdlFIdGVSNlVpRDAxc2prM3Noa0lwczhkL200dU1UOTQ5YjBabUdjY2VXMDk1Wm9lNnRHRUN1TUhvbTBkQjBSRzh5QkRLbWtxSW5wa3lVRHVZdS9nOGFGamMwTlJiSFlKbjdtbTYzOG44WXppdGRUQVFNRHV0dUJBZnNiR2tZaUQzTlNCRC9kQTQ1M3JaeTBhQUFDQlJOWWR6c2JibnRRQzFPQ1R3NnYvNmNrejhWNVF2Vm1JbUlMaHZBSVhGV2Q0M0F4NE9XNTllTE9aa2FWLzNUdDVLeHJtZS9tZzVaQXd5THgzNkdzR0lJMmd6MkFaZ2dYd3orOHBTRUR5WUdPWVBldHlqeVpubjZQcmU2Y2orNkJqSUFwZ0JiNE1wbDZDZHRhZU9NbURRNzVMK201NjRNUjhYQm9SazE0ZVJBckVNdVlQRUdFVUZwZlBXdFgwaFJqdnVNdDhMOVJHMHdDalF1d3VJTmVWcFFlSytnTEp6REJWOFhBTEY4SEVwWUJBRlRrY1A3UVNGOU1MTS8rY0xKblBYeHdrdEJjNXVCTG5CTnVHREQ3RUFZWU8vV0Z2ZEhNdkxzQTltdnBXL1JmUy9EL014MDdTUmFFY0NBckNFUWIrSmUzNkx1bVBob0VaQzRKWVdSMVpHOUtSQ2V1U3p3NFIxZG5HeUNDMDl4b3RPQ20vSkNWTEVTd0llWU1TYVN0WmFCVUcrNzVMSmdSMkQ4dzB4eEZrenZCcTRHdTNoZ0lwandwZ1k5SGRpc1ZSc2hacmlQZ2I1WDFBRGs0dVZTbWkyeERUUDBDYWZ3Uis5cWFldFdUZUowQzQwTm5BSGdnalhkUHFyRkI2cWxXRk9aWFhBVmxmcmVXLzh1dHZjclpoUEJtL2p4blV6OWw4bjlLWHdyN2VtazBveXNraEZtVmxrcDJVL3dYOHRNOExKZ2pMK05JM25tazl0bGQ2NVNYeDkySXJSNnptcXR3T3RiYlZJYTFxaHBuL1FzdGttV1JpRm81U2NEaWJVSURMd2hOM1RJUVNoYVU4NmV2UE5HL2FLMzF5UlI0QUFBQ0FMcjRUa0dFM1cxeVBqbUx4Rm9LNkcyTG9rdVhReHU5NE5Gb0lQUEVkY0w2NVNEc0YwYTdMc3VuK3QzeWFHbHRBa2NOc2RYMFFEdEs4QisyTWczWUM0MFR2TUJ6WUlqVXpjRytnZHYrN2RFUkJWUlh0RDFQYzBKb25OQ0k3QUZtRnlqekN6b25SNUVEeEZDb1FRWGxYNFhab05UNTdoYkxKcnRKN0hGWHliR0pSVGc2cEtPc3dHUXMvQXBWZDUyaUsvLzA5aGJlcmR3MUplVVZWZnlvcll5UDlDYWJPZFNCSTgzNklvTWhaa1lmSGNPT3BtSmRnNkt3b2dqNWNRSFNXNStlbk11TXA2Y1Q0ZUJUT0VwbEllUWRDbHhnRnRwdW53dGdzZm5sWkpkK3l1ZkROaThCOEU1Nk1oYlpaWDc4ZGQ4eTFLaXliTlZ2NWEzTVdaNVF4Y3V6b3JJbDR3ZXUvekt5cm1hU1hOZE8yWk9JV25FU0o4bEM5bmROSGFmQitUa1Y3dWxpY1VrZVhtVm9zMnFaSzZneFlHbmpCbFRLVmlTekRSMmovaFJjVGVad3R5cWtJMm9WYUJGT3lxbHpMWUFKM0JsL2Nud1dQVzB1RnB5N2Y2bDJtdmYvOXo0Y0NMdTROVzhFRm5ZdjJuQU9GcFQxR1RLUTVJZnNRRTNzUGZ3YVA4c0R6ZytLaW92dFp3UVlPdVRWTTloTFVlenZ1N0lNWTc5Mk16Nk5jNW1QbnhGN2RWcWFDMEE2Y1BNU3FhL0ZGMWFFZU8yRmVlOUpaWjdUWEdjTER1amg4ei91SUtRd08zTEg5WlBSNlJjV3EwMFc3T2RyOU1YUDJpSnN3OXhSVnY0Q1hhWkhOeEthZXhyNmMxRXQ1bGlxYklEWkk4cmpZTkE0cVhxYXFidWtQdmYzRW9PV3hzSEd3SlJMMUNKbnd6MHhya0JpTTFZQkZmUlRoVE92UEh5dGhmemdMNURGUGYrRG5kM2w1V3A2VFZ0Z2g5NnZmUGJ2c3lJaXlsRFNXY1F5S2dGck5IZ3R0dHAzL3h4OEpwUGEzSndrd3NSdFZuS012ajQzVlBJNVM1bG15WFg4c2dsK2wyc3BxcndNUS9uZkNuMUhzWlhVbks2RjhuQ25MOVdja0FBQ1lURkExMkRUcUJvZXFzdDJoMVByc1ZWV1poTUxzN0J4a1pyMWQ3bG5RWStadmloTWZPQW1tc3ZpUzRXRDdwZHE0N3Jtemc3azVFUzJzSjg5S2Q1Ky9oZGpXdUptTVg5bkMxQm9BL1VKZFdMbWd0MTJqaU44UEtzZmVrYTRQTllPbkhzaTFsMXFUZ0pxbFo4alBnLzlvb0FqaDdoMlpxVjhSNlU5QmZjQUxGemJTN3JBRnBQekdJT241amhBK3M5V2k3Q0h3UWQzK3VPWCtyNytOZ2Q1Q250RWtUUUh5bjVvWXlXTHczdVZvdjBsSXltc01rcDJ2QytHeld5M0szaUwrd1VCczhYM2xIMkpxd3VkWHdpKzhJNERQeDZZOHpJWnJmMUYxM1k0M05QRktCRTZaUER6YUdtNEVYMnM3UTlOQ2UwNjBjdnRSeFVtRHJEVlF1dVpObGV4S2F3Zjd3dHp2Nm5tZmgxVkgrdDY4QU9mbHNoa1FBT0JhK0ovSGUyRDFhZ0lWdFVCQW5jb3E1M2FoTldKY0U4OHgxVDVidExQSkxZZHdhb1RXeHZVcTdlbW9HdURZOWpwdzdGcnMzTUNQUDZWdFZnNm02MHZKalFkWlpYaFY0RVNsY041bVpKenJhNzFMVC83OEcrZlhvVlhpM2hobUNCSjhPZ25oKzFrU25pYVFNelBhZ1JMcW5WMGZYazFkR1Rldmg1ano3WnpvUExMbkcvNUJqRlRGUFRSMHNFcVlrRHltaWcvNUR2TFdzcnY3QlpwMnBGcFRNald1VUljZTBFSTd4dDJUSXcvKzBxN0c2Yi96TndQck5talNIcTJ4cTJQdVozai83OHI1ZkptN1N0TnFISHMzOWhIc09CNjVmamNIdlg2Rm8rVUlXWXFWMmpLRlFzb1pKeWFXeElkZEJKczY3NmhYcndIOW1DZGIzd0NiWmxHN1JQbnlIY1piTWtOWm1zTlhiN3B0M2VwanhrY2s0VmRwRWdlVGlXZm54T2dpSUhnU05VQi9LMXFRWjhxcS9uTWg3Q1dLcmJUMkllamZHNU9tZ1N2UEJ4bW1pelNEVWJWQnJoOW5jMzdNY05QRFY3eVh6elB2MjFyREtsODRZNHZmeit4cUZzNTJlYVNrS0hPRDFSVVZjZ21iVktMMEkwQW5kaDFoeXVYcEhZV0pKWEhoRjNlYk9yZDF0VlF3S3dnQUtVQmZ6Qktnd25ybnVBcmtGdGtmYXFkZnY0SGpvZkVSWkNDd1lHdTlPUXgraityVGJCYkt1NzJKSDFPb1hueEpBMlBmQUxOWjNDRmxTZld5ZDRpVE9XemNHalEyNWVOeWEzcG5KTXhCdnpHc1MyVFo3NmZzbHlFSE1wNEc0cHF0MXFwckpaa1hBMlgyWTVKR1VlbU1xazlGMlovZTBQOUM5Z0FwalJIc3ArUWg5eEFna1lIYkMxY2FoQkdwZzBDa3hyVGY1OWMvUllFbXc2b0hma2JoZ3dwZVhDbktZNHFyejE5U2Y5L1BlSWpEWS9ENG9WS1RXYld2dnpHZ3MzZzFjTVRDN0FGTTNqZ0Q2eVpMM2NCWmZ1SGlEcXQ0aUFCNnBxYTcza0lRQjZVM0IzOTFrT1pTWnBCS2hBeWxhWW5aT0hvOUozZXZDMnRNNGVIVzVwNjM3M1gvNjhVZS8zajZmeFJUSmNQd2Fzd2dvVW9JeHFBbjU4T2lZTkFqWlpGTVpaVzVBV3RWem5ybEp5OVROWmNZYWN6UjZWUkRLaHJ6K293c1IzSTNqcGlDV25USVZWcXdxaU5yUkI4dC9LbTM5U1JaWUpCZ2V4dlYrMHNzMUxLWmM0ZTgzYXVzMTdIYXV3d2NPMllUeUZSamtESTFYblphTllLMjY5VnF4bnRTZjIzMHFGVjQ5dDZpS2NiaDdGSHJwbGZ0a1N6N1VpRDczSmY5U1pEOS9wQ0RhWktEdnFhUnlESVJRLytjc0pRZlBlUXpCSUtnRlh1SEFXMnFXbXpJYVFlZGF1dGdkZUVsMmpNbU93UTBPTHVsRUNPV0EybVNBMUZJTWxjSFh0c2I2WlJ2WEhmVHdzaW1DMjNHWlplYkhsS3E2ckhZeldvNXF3aURVbmVzL2FlYjNWZzZqRy9TWVNoSit5VFAyVHZxekVYUTlkRHJQb0l2YjdMMkpWVkdHUCtSMjlTWHIxWHBhamdaY0laMlpJaFJaL3RMN3V5Zmh6MjdOZXV5dFlmY2szTldWMnJ5dzJWV0dvZzZKcW1SZTZ4WHF5WjRRdFY4UUZmTjhaUTlzbHFmR2Y3SWNyVStReEN0NTVzcG9PQzI3Q2tkUkU4TXE3U091V0hVR3A4SVVlZHdMcTg3a1YvdG54RUtScytrV05iaWVLZG50bnRkNGhtdVNaWW5yZ1BUQ0p2cG83RnBmL21TNHR5NVB6RE1mOVA3ZXBpZXBuY1I1dXZQcHdDQXlTc2dWcFdjc0YreWZ3bmFic0hPSjAvaVRFRi9kVkdaM1QvM2tmYjJHelVGQ1JGbTlIOXhXUmQzZHhTdDg3cWExMTNYWUZrek1NY0hwQjZJNEY2MlpyR3REbGFYRkVjRWxwemJ0TWFXQUswN3YvdkJlcUx6T2dmWFhlT2c4SjZURTNkeENwVkRpODEwZjEzbU1OekQvUGIxSk15RE52L0FvMjFOVGhUWExtZ1IrZk1CWWJPLzJ2VWtMdDVkNmM2NDZicDFza1BKQjdBK2pRYSttRUZjd3dyZFpFclBXRjNkTE1vRXROY3pZK2ZoSHkwSTRzdy9ZamorTWFoOTZaTngvRzYwakZwUi9MaUl1VEtGVGJGM09iZC9sNWlMN096OU5SdmFZM1JuVzl2ZG1UQmVYWjcvdW01czI0ekp5UFk0c21hWG1IRUh3cW00eG9HbkVEUEVwTlFVTE5QRlBiY1ViUzhnL21MZXJKZGNjcUorUzlCTFFPMDdYMy9TSmRzbFE0M0YxU0J6QUJibGdNWm1ja2pmbmVVeDk3a252RndCLzY5bzF2MFNTMjlNaFhtcEVJdDFzZHE5ekRoaVkwMmFNcVYxY3g4aWk3U1NwVzBIbnZiVlpSMlc5TDIxVWkvUWxMVDl1MkpMVzRYV3RLc2d1Z3RlNjFacnlYY2NXSUwyblI5NUV2N1FXcWxkeDNkSjU4M2krZ2VGak5WbEhKUmdycjNhSmhVU09CWUtLRklNc0VGTTNGOHZjSVNXV0haZ2xxT1N2amR5cXJpazg3cVQxMTFkTE1aUjFEa0YxSjFkVXJtM1lndUt5NyticDNlUE1yTTcyT1VSSmNzVC9YWkxRMFJ5UWJodGVGbUt2S0RKazJoVTNNdzFDOG50bHRzZG5VR2xUWGZlLzM3VlRRSE1FZU5ZYlZ0ZHFibDJGNUU3WGw0YmR0MWkzYUo1ZkQ4dXhWWndoRVVrNWdtREkvVXcrZy9STUQxM3RxMGxSOGJJbkVEaXJKaGVaTnkzWFpCVis5ekRxejdRTGRWS1JOS2dMMWlYOURKdE1iRkt5Qm1NYkFzM3EwaURjMTlmOUFvRnZZTHYrekxsbWxKQWxpSEFEY3lhV1hDd1Byall2ZVJjSUxBcHdGbVVqWmFwSFZhQW1jNVBNWnR6SUJGSE5wVENrcVZYVmhYNHp1QjBKOC83UjdNdEZtY1p1akFsaG9VQStpQzRQTk5uUU13K3hta1ZZd0IxOHhNc1BTa3dJelpRTXVrd1BSamtXUnpHNkxYTHhZSEdPODlIbTlna2w5S29pVDQxVlR0NHdMbEtZcE1zRHplNWp1ZHBEVG10azR5cDhOeklWM04vTXg1VDZPVURPck5SRnpxTUcycFoyTUtZcVhsSW4ydnhXT2VqZmMwK3JUREtoOXlrQ2xsblBWaW9HQ0xZNHVQWm1kZXRSekVtbGtHTUFVZUpKL004ZndJUTFPdXpDYkZYd2dNRVVEL1lGR3NNNDYxSW1HVmI0N251Y0NpWWlaTWt6MEdPeEo2OU9EUEphaXdzTVlxa0xURTBUNmZQTU12emJyZGdxYW93aEtuanR0cnNOWCtyczNhV0pUZE4xVlZYVTd1MXM4VkdvM3NTZGdpOEh2N3hSVWluQnhjWHdLQXMzdU9NZFRwcUFRS1RnRGd5OUZqUUxra1FOVFhCN09KbDNNbERGVnlHeFBwZDdIc3Vrd1FFSFgyU3ByY0JLa1FnTEY3dk1sVlN6Z25HODNubCs1dzV6V1Zna3Uwc2JEZ21LTnJ0RXB4bFBXcURFNEFxeFhpc29IWnJURHl2SHdNSmNOdVd2dHoweGxHZlFwa3l3MERxeDJ0MUhjNTlYd3BOVGRyWXR4YkdiQ1pNaStQRjhxTHdmYTR6cGY3Skt4cGdWSXlGeVRTaS80NXlDeUZEQXJsdytKWnJqazRmU015ZG9oQXFyaFlHTGRpeENXa1hDczhFTG9QdlBLZzc2aUNNd29SRWtlL2EzQzBVV04rZ1Vwb29Bak9vYXhyZGh2MUMzT2xZVlFWdCs2a3ZNUjFyZnU5NnZsVjdJYW1zblJsUkNLRFhjVXpnKzQzQzNpSFRCQXZNOXUvQWVGZnNqRWJYZDd2SlRKcnd0dHQwbUU0M1gzcnBNN2lrYWZidEF3U1Fva29kMStlM3JXdHR6S2JiZ2N0bGlhQ1Fwdlk5eVFpcDVvbFpXUCtwMEJEbHhXckh0bUNWcTkxOWdSLysvZDRNL1Z0OTF0b2JBOEJkTU51emJGZkNGR25haldPUldXS3lyc25aL2Q1NEROekZzeE1LRkQ1bThKUmlzM1htbktEcTVzdGc3OFpHNjJqRk9Odlo4V0RWd2pCUlhMQmd3ZkZGV2MzdHlNakJiTjhMZmlwQjZPV1Ntb2Y4c1dQaGpRNFEwUEZHSldITVJXa1l4MzdFSGR2eUdUT0xpeHJMK25ra21ERkxDTnR6aDhPSUdodE14MGh0TmNzL2l4S0UwSmRrekxkR25DOXdOcEVkQk5IanFWNGlWQjhoQ211N2c2dXBNQnowaEFyRUpVOVJOR0ZZNVRTU0NPRDgvMzhFNHFiU0haMzU4WmFCaGJBZ3pPRWM3R0JqV2E3ak43YzRMT0hNTEFKTmlWY3lXN0VLTi9RYTAweHBHOHJFTWpFUHBZbHp6NkRURHNNZU0vbGdKcndHNHlIazNiMGxjZnRVVkt5bVR1OHY4ZVh0dVVGblg4R0szcXFxMnQzaytJazVUOWxPam0zbjNsQ3BFWHB2T3g5TGFia3U4N2dSbExKUWJKc0sxS2NSeXpLUnJHUWNCOXJqKzhGNXFBSzU4ZFpSSUNqV3FnYXpiK2RXZDgxcFg3djZFSmRGNXl6VVRoRDZuQjI1cDZXVittZXAweHQ5d1M5dmRvT2lZeVE3SnFyRHNkcExsVHFkMUtEY0tVaFhxeUFucUxyc1hNdEQwUUtPZXcydCt2MnloQ0xDVFhaaG1kM2JFVWRiZXpiWnNJdDB2aXQyZ21ESFUxVlJtM1NPd2kzVGp2V3VYNWU0Nm1iZTR1YkF0cGQvcEpJWTJKNHI3NTh1YUdvdXE5bGRVOXg5bDArN2p5amNma0RtTGFWUXlvOVYwUWhGMDR0aVhaN25Gb0o0bUs1aW1ObUNkcWRPbysrSWNFL3A4WlZLbmFZRnZ1NFkwdStVMVNoT0JlTTd4amFyTGtWTGtWWHVlQUVLc0lGWjFHM21zamkyd3hWeVhmQnlsTmZiT2dNK3ZaTk5VV1NKTkhvMEdnNWhiaU1Ecm9GWkZzbENIRmE3Q2Vtb1VoV0Z0M3ZHbDlmY1ZLVVlMcFd5V3RPd25YUXNnUWpEbk5zQWRlMVI3dUFqcEJHK2ZadWdUOUdVWVB1ZGJIV1Vjb2EyM2VPVjQwQVcyQVpOUVNXcWxpTzJrNldWMjY0YWp5ZVQ0UUQzTjFWeElOck50Y2tRVlBoRUt6bVFLZGZydHlGMHVLM3lNWVh0d0RhOVhoYzBXcS8yU1FVbjdaV0V1bGhQWFpXVzdEME9Ed05PYm0wZlhCbzdCMC90RWRNaENsWWhoWHF4ZG5rNkN0d1d1S2V4SGpncHYzZXgzdEJwczJBUFN0NWl0NTBPSU1uYzdXSThHUWtUZlE2bVNOSXlhaWJqTkkwUzRkc3lpSkl6NGp2SVNubmY2VmNpaS9vSkZSK053R3N4VTJYTmxhWG9uMFVOTzNxMWw2cWkvMjI4aklMSkpCejNmQitTbnBFcStKOFM1L2pWbHJsdyt6RE5MUk1VRXQyYlRQSmVaQm1xTVg1ekhsclVBZDl4amJWZVZaVWxTdUtJYjZEUXE5WUpBSlhJcVUvRHdpQmFlemJUUk5ZdnBtMHkybjR3M0wrL1pHWnpZejdYQURTVzYxcXp5RmpRMDRqbVpFdDBsNko2aDQzSExpUkRXTDZCVGpXN3RnbFJpSnZaRmJNbEdWcS84UUNoNFZBRXhMVGJHQVA0S3ZQcmY3MDJwK1FiTlIvVnNMSmNjSDVUd0hEWjl3dVM5eC8yanZ5YmhSenVZMys1TURvRkcvN2pKWGZMZjhTL2JqcVhlQUpZUUNVS09zRDYzeFI5eHhqR1QvYUw0cWR3Q2Jadk1jSmtEU01rOXY5NW5BYXBmUS9jUlFad2wvMU1jNDluNFI1cjFzQ2EvRytRMStBdS9NZDhUL1FrYkxlL212c0pwT1R6dUk4Y2h5bituOUorRXI2bHZ3a1FkNllxRE14bC9WSVd2WG80eG42bUUyNGxSTE5ZVWxiL3lXMWFkeGtGNWcrU2V2eitSOC9NSGVSRWZUTy90L0dNbVVTMDJacS9oVkRCeXUzbmoyN1E2aFc2TmZjQzVmVTlRdlBQMFBReXBiMjF4SjB6dTZ4ZTQvenJPT0ZNTXRNQ0RsZDJCRnZRVUJVeHk5bmJCTHVDVHRpSDFtcEc5ako0QkR0Vk1meURWVW9oUHZQeWZFa1kzV1F3emRRanQyUkIxZkFjL3NCM2VNUytuY3ZyOGxFcjAra3RiQjFYU0xhbGxPS0JsK1Y1Wkk2OU16VS9QbmhkbGhFcC9MZG9aL2UxaUJtUlZNVm53WDlyRytYV2FiM2FmcTFPMmVRQ0VaNFFRb1lRTjNLRXlPMDhJZnB5b3lONjZmRUhuaEFqRDhnQmdDell1ajVaMmw1czJyRWY1endlOTJPY2dGQ1lWd3p5cW11MHhlT043K1dzNmd1SHRVZmxkTHpYYTVlWWJjaVY2Y2x4ZXZiVG1UQjNtZ25jcmc4S2wrZHJWS2dIc3B6UTgwR051dTZmWWRLWlRiVGtLaFlHUWVEWGIvaEhjM1paZnZUVExLYTUvVll3eXMyTFp0UHRwemxMWlBWODEwYjgwNjlqUjV3NEZESTVPZXk3eGNkRXZXREpSRDhqcnBhYlhrR3F5VVZvK0t6OC9Ca0FQR3VlZVFudGtrSUFDQWNKWGVGSXdFQ0Rzek1BTnpxZkFnY0VBS3BRZGtPVkpCU243Z1p3T2dJdERhZGpvQUtEcCtNdzA4VHBCTkIrbjA2Q1lUaW5VOERKM05QVVlHYjQ5NFVBVkZEMjZRaVVrTlFqVWdPSVlUc3FlZCtNcWFFR0t3UUlGQ1dZRncrZVF0R21jNUVaMnZaS2M4dndCSXIwUjJhYnc1QWhrOXpzendUdzdqbkNlV2FaTUpHZXRSUHNVemFKNkNRRFZXWSs1MnZXZzVlWGV1WUVuQWduNVdlaElnUFNuQzgzN3NkNGY2RkNPUFBEZVNIcy9HeFBRSzZEUER4MHNCZWhHWnk0RkxFRjF1REpOUzhlYjdNNlI2aVlVNmxQOGhNeWNieE9xWlpPWDMxS08ydUx5WkFLMTlZSnpNcHhTaVY5QlZkSmVsaTVQS3U1MnNtSjZ5OTNzaVBpenFZSXh5K3AyR3JTSk1OZThuQTlod013SC9Oeks2anB4THY1WGZqOGV5ZSt2LzkzRFBpWmJYd1BhMlFJdzhNWk9oSTNlR0o0ZStQNmV3NHYvWjNSR3hlZXNvM0hFTHJDNnN3cTdoNkN2d0tsVkJpdTl6OWE2eFJmL2FQRngvSDZpY2ZQYXZhbmNlTGx1TDJrMFVNYVBERWN1UHZZZDdOcTNhVEdLY0NPODBlMWt6akZjTGg4dTZ2ZndPWUtZczFCTFBZeHcyejNUVFl5akxaM3cyRDdvYmVsc1dMOW9iVVNqWFViRTZzY1kzUHRqOHprS3l4b0lMZHdxa3hFWm9KUmFmU2xPcDlSb2ZQTERSUlhacmhVcWw4aUNaSmVqNXBhR1NLMUwxU2JjUUoxSHlXTno5Zm1Cand0aDZzeElhZjYrQndsRExiQ1lFbDlwdFRyTStUOU9McWMwR1R2Q1RVYVE4QlhnTjlYaDhzWmc5M1doODBvWWJyVzJmdFhsOFZjaDNsUnpIUk5ZaE9NREE4R1hRRjZuUWc2aHFBMUxKVGFCN1ZlSk95cVJBdFFnaUNGYWNpbGRzaWtNa2lGSk1IRW9DTnlDMk1kY1JYQ2Q3eUFDUWpwUnFhRjJyeXBnZVh4eFZDRzdkcVdtTmVXeEduTzhoWHNNVnVDcnFoQWphUzJJWmExRlRIT1FXTW5qM09SLzYrbFRTRC93RHcyWDRCQS93TXJEVWExTlRHdExZaFZUdklWNURGWmFyclNVTytYOFE5K0NuVS9hbVFsWUNNYW5RSytEdlp3dzc5YitoRGJXd3ppK2t3eTRvZjgrL2Z2QWQ0eHdxZGo4Z3VGdHdpVUp0bllqc0ZvNGZOUHpFN1l1ZE4vSXNEZ2RMSXNIR3FMZ2htZ0lMbVQyVEIyRFFLM2hhWFoxRWEyMGFhUndzYWxJM1VkQUE9PVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF83X19fID0gbmV3IFVSTChcImRhdGE6Zm9udC93b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBRVZvQUJJQUFBQUFnelFBQUVUOUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR29FQ0c0a09ISVZVQm1BL1UxUkJWRm9BZ2h3SWdqZ0pueFFSRUFxQnRXQ0JuME1MaENvQUFUWUNKQU9JVUFRZ0JZUmNCeUFNaGhZYnRIUVZZMXZXTUd3Y0FKaDNtL0ZSbEl6V3A0bWlmaExOUlBiLzF3TXFNdFlPMDMwL0tJb0tVU1VLVFJHdGJwL1pheFd6TFk0aEtuU08wREVVMUxyYjJ5bXBXaTE2K2I3eTJQRzIrQ2dPQ29obEtJS0NDcjQyUmNxeE1YUytvOGY0QWZqc3ZaYUZVTHplSlh6b2Y5LzdzYVNGMEowWUJZWUJobmdUZ0UyYzR1UnlsejNxRkNsZVcwV01EMUNjZ2VOODFGejRyL2VQLzliZTNYM3VGMGJLNkFoQTVRS0NiR0k1aHlyLzZZQ01IbTRQVDl2OGQ1UU1FUXVqOE95WTQyTWlCbTdPNksydENaaUJObUlsWm1BMXVtcGo5VjFFV2F2U283bXE2dTVxd0hUQ1E4bmM3c0J5RG9DTlBxRktQN2tYNnNESk0vYVYrQVlYOFRacEQ5ZjZBaW04bU12dVR4VXB0TVNML1B4UFc2VjZDWHN2MmlyZG5iL3FtelZ6TWZBQUhnMmUxR3VRaHN3YzRuZVdQQmw3UTFQc0tQUUFiTFAveFcwaU9xZWlVaW9XTWdVakFUR0liQ2tUREZSVTBHYVlXSE5SUnMyRkxsemY5ZXBxdTkydS92NHVNdDV2dXRmMzNoa29pZ3NZdXVoNlZ3QTZ5U0gyLzFJZDluZUJ3QVc2NHRobHE3dEZYWmNNbzQvWmxFODNxTGxzTVQyT2lqcmJVdE5sNmlyR2s2U1R6ZWYyZW9URHpyakROT0w4bEFScVZLK3ZtL3UwNkxpbUh4bTJUcDgvYk4zU3NTMHpjK1o5U1dmNi9sbTZTejVUYWR3N3lkWVpFb2VnQk9lb3VOcnRoa3dLYkxObFF1dlF4THBkVkxkaDZVcFUyMUxjbEg3Z2tBdlJvUDluYXRyT1lBRGVFbEFnSHBRU0ZPbk1jNnJQemlVZFl1bW0ydmt6TzdzenMwc3NGcUFQQzVDNkEza0pVQUlZc21Rc29FRHlUdS9SS1o5Vk9ZUkFVRlRnblJPbFREbmRjNlhueXVyczZ0UTVwS3B6MFdxZSs1bitwRldDam14dndodDRVRkZFNFo5RjR0cEdBNXBBMUhWVEIwYlM2UUdlMlFHZVdWR2tINWlld0VFc1VlWEJrVHFXcS9ySTB0a0tvYkljMk1xQXJXQUlZaU9JS3lGN2lHUWxKMEg5VnBlaGFtVVFQai9rRVJjakpFNy9Ob3hwVmoyNHVkTTB3OEZZeWd3Z2t2eFBSU0FnWVBSbHQ4M3FXQU5CVzJ0SUhEaUFqQ0FOa1pSR3dxNUI1RkM2cGF1b1R6Y3ltejdLQmZtZWdSQWZXQVBCT3JXK0RiNVNmMWtrZ08wQWJJQ0tJWTBrTkxBUHZnb0xuRUFmZjZLckQ0QXZUbzJMcUJkY0hoY2Fmc0VWb1VGeEYxd1RtQkExQXhRQUZoVTh4enpBWHBRRHFoVk1WSk45QWx1TkJ2Q0U0N2grYUZ3L0duUkM1TFY1RDJRN3NTRDJ4QVV6VHVVSEVsaG5neVJTK014UFMxaVhUYUVnSENRbWFTbEtOWWpTbHFIZFpONU9CVVYyY3BLcnZCU2dnd29SU3pGS2NrdGdvZlJZVks0S1ZWNjYxWWE4bXRRaHZvWmxuVW5ONlpRdTZJNUNlV05yZnFRWGVxYzE3ZjVWdncwUUE0RkhTRmhXZGlkWjNibzJ0c1h1VnJZMzNXNzI2YmJYaDMzRUVZNXppblRQTk1mRnJuU2RXOXdsMlg2UGVucjNZejdqUzc3aTVkM3YrWWxmK1lNM251eDMvdzBFRW9za0lJa2hIM0JvaG43Y2lNVXdCUW9rV2tCTUwrVnZzWkZVVE1SU1VucXVuMFl4SXpjTFNLditlMHRFdEVDUjg0UWRlNVpNL1pSUDZFV1FWK0ZjMGxQcHJFRlUyUWdjcjVQNlY5WDFla1pzbzVBWVFsOTJwSjVjSkE0eCthcitsZ094QzZtd0kwNWFEOFFxclZCbisrVHE1c1VSTmxYZzhuVEF0Q3Z0TjFIN2txZEhoY1Ixb0hPaDkyU1JQWnBPNjVpVS9ESkJEWWhVNHZRZkR2Skw4Mm45dEl3OEpkZTBVYVNGaUxUT1VLNG9EUldINGJRSStuRmFHTDJjTmhrY2ZhcHBIWVhNNjZHQ1lYV0xEdlFvU3VwaFVrdGpvVHhJVE1CUjhOOWM4bGV2YVBXQkxsZ2drTmF1U2JTMVRNcXJpQkF4NVV3dE8zaDFDNFcwYUZldkNhMlMzWXh5SE1xZzU1QVdtamlNT3BTWnJ5QkFMQWdOVm9OR3o2OWFkUUpiVXo1ZE5teFN3eUZOMEZxblFFY2JFTUNVdzF3SFBpVlB2cXczRVJFK1ZwSElLYVZZdDI4c0RZbThCQVRhMXZNa2NxWkRkTjB1aWswYjZXWXRvcmNsaFNkcGRZZ24yd0RpdUdOOFlGUlA4SGVFc1ZoTTNqaVY2SXNXaWhMVDBaRDdDZFREd0Y1eVhYUWtNTDBzTGpBWWtLOWhoZ1dDMzg2clJBQzZtK2QyWFdKa0hQQzU0VlFHZTIrQlBsd0s4cm9CRm1vUlJ3QkJFaFFScnVFaFFKcWFuMDBIS3l4eWovQzN5T3RzRHpHVURXWllrM0Vna0VCemI5UUlkNDZhU1FIcU5YUWJpWWs3N0lsaUxlRkJ1ZWRvMk85TUpjNEtWZ0JHYU16cXJYM2hLNStxaFBvSGN1RURIMWxobGJXc3o0Y281VVdReG5DUmNkdHhoY1gzdnVCZFlGUVZKT0haeTZSWDV1YnVwaEs2NlZVZ3Z1QWJtd0R1b0Zmd2JyUU5raUM4R3lSUlREVXh2UVdaWGFtUE5GSWhnNTZNa3ltaWlqYXJJSEhCbFRXZmRlY0RDUGtSN2NxODBqMFRmOExyK0ROZXh4dVpkYjZRcndvcXBmc1RvOUpMbGFBQmRYQmU3YWMwK1JJTmJzZWJ1aHJqUEVCMmR3Q3I4UjUvTEU0Nnk5MFp5Z0gwdnhWbHkvMkFGYk5MQUhvQ0FIbHlDUURzQmtvNmpLMEF0bkpiN2dQaTlrc1NHQkFFd08yWE14SWcyRytnRmlEVXJJMUlvTHIxWENoNVFrRHkzUkZTVkNYQWIyTlZnSkpXM05xc0d2SWFKYUkrc3VxZm5nUmdMWmxNTThNV2RFZmVQdUZMZnVCSHV4bGVDYStHdDRMbFlSS3NDbXZDWmpBRmRvQnZnVjgxcVVxb1NtMTJMM2REYVJxbUF3dGVuZGRWbTJGWldQRXRtY0wvL1o5UC9hMi82M09ZOWRtZTY5aFplN21YLy9pMzh1enhzN3ZQN2p3VG1ESnB6TEJPTFdxRTBYejEydWVmYkVJdmVRT0VXVEMyUXJnRVNOdmRrZzRSMEIvVWlxL08wcjA1a2xLMzBrZEF5V3Q3cU41NTBIbDZWMXpYMTBNV3BWWkVOVk45OHdFNnFhUzRObk9vWnhHV2JwMUpEczN3U2FXUFJzckl6NnhmUXdsODNhVkFhR0MzVVlQaXNKN1dLYzZSWnBPL1ZTVk50TkhEQ0dsd3FRaTMyODBnaTRRU1JTcFpGTlBBRVpMSURycVZVVXNMSGZBWkttRVJWV2JPWWI1Y1VsbVQwa2wxbTV2SmdFTnhzbHNqN2ZSeG1VKzZ1dy96S014M2F4SWFvbU5IQ2dWZHlLTWwva3NhTGh3Z2puT1IxbVMzUmQvUnFjWmZzd2Y4Z3dQOWZiMDkzVjBYR2Vuc3ROU1U1S1RFaFBpNDJKam9xTWlJY0Z2aHpUZGVmMjIxWE14bk1iejZ5c3N2blJYZVBabE94cVBCNDBjUEg5enY5N3FkZHV2NXAvSzkzVDFaQ29PRTY4dTl2UldWZ25ESnhkL2ZTMXdGSjRHN0UweGFnaDQ0MHgrNlprTWI0elViYUZpeStYRW9McVE0NnZoTXFTb0NPUGozMWg5eGYxQTRhc3B5UTRPVjR4MCtOSFMxVzJ4S29LUU5NV0RiMWhzeWFBTThGR25RTUcrNk1nR214RnhNd0dSc1hPdUV2MXZieVU4WkpxMW50Q3diZHN1OGVjbURnOTV4cUx1ZXFGdEdiVkJDWlF3emU5UDhDWmZZekNzYytQTEtkekxIZ1NUZXA0eEtPTXFmYng5VkFDK0k0RWllUFhiU1crRXk2OTMwMFBIR3VaWmVZY2o3c2o3THZUS1hVMUt0SklKYUV2akRkTkxabDdSd1pRemdYeHJ1WjBKS1FzMm5iWEV6Z2pqUk1RSUFWekdlVmFQWjZERG03ZmU2MUdtazFOWWVBK05GaVhCSVBIUnVJTVRKamJuRUZJMWlpbHRER2hGYmNTOWVKblpnTHhaUE9nZEN3QjEvRFJJNDVVUjM5Mnk5bzNmMUFiVlJSOEo5K2JOZTl6K0M4aEYraWJBTktWU1M0ZjRWTFAvbEZYVEp4QnMrNGhJT1NjbWVrd1N0VkJ5LzhVa3ZheXEvdUZtNFh5STR4STR2S3FyYTYvZXBWcHFKSml6N3RHbExJRWtnSEF0ZTg3K0lTVkpqMENPSFZnM2ErSXZ2RzNVUVdBK1JIQzgxKzdSK3ZkeHRwaml1OXlVWkZHSEdYcWFtZkVzRksvNEdYbGJpL0xxYUJ5YTdjMjRGdnNxdzVFVjJ6Nlg1bExUVHlxU3ZPdVV0R1FnSUZWc2ZOcTZQbThtRWxzeHVxOXNKeVltcVFDeHJDRVd0ODV3NzZrN01RZTRJY0tQQm4rWW1OK24wRFNsNFJnVDkyTDJtVno2Q0Y5QWNZWW1hVGhiVWpQR25XYlZDelFRVHRsR3Q5QWRKUDdLUHoxeUE4QW9TMDBmMURSWG44WHBhdzJnMmN2eDQwZGZ3eUU1VCtaWE9rVUUwbXA3UmtreHMyYytSRnRBRFdKSUFLYitDb2tCL0t1UENTWFNSRnp4eVNkK1ZuT1pSMDl4cnllYkczdCtvVnJJTFVzczJNNU1GRk1WN0tPZXI2OVNTd3l6d2JBOGlzKzNocXErMWNwVVJhUVB1OFdJL0JHc3l3czJGQ0I5T3hDVXNHVHBEQys4dkFVemxqTnM1WWs4Y0p6QkorWHFKVCs4a2tHcmFmd0twcm9CZFYxWHJJeHRneVNzTUJJcW92by9CZFkyYjN2WnZGRkcyU0hqTTEvbVRZZUkyYWt2N1dTNkxtSmlVRTNiMGhIdHp5YzIwOGJCVTRaQUVtNm1wYnd2NVdOeTI5Rmc2bllnTlowQnlLZzBvcHlqNGl3d1JOTzBiL2NCMm1WYlJzeURscXNkem9mZDA0U2lNa3RZRmtNVlBGVzdESlpXV2JEdzQxTjZrNEJUZ3UxVVBrRHBBaHhoaEtzd0MyVXFjUjdBVkhOVzl3OTJDdTViakVueFpsTU1CeUdpS0s0WUJSa2QwazQwbnFRRXpndGJHU29MWjUvYm5JbkxDUXJDdzVZbXNOZnlrWERpSGhWd2wzTnQ4R2l3YnlxbEZkdmFqOWtBRHF0djQvZ2J3VVlZdkdTbDd2NVhDTFpzV3R1V0JhSXAzN01pa3AyWVNZTVpocWwrN0xiS2RlMEZJbTY0eU1QRXhuQ21jNXBXVEVhRFA3NFlhcEFPakNjY0oxR2c5NjBsMThWeDlZT0ZBdzFLdU1xOUNWUkphSExYelRpTGtJOCsvYmNFc3NmcVVPeFhCRHJZZ01VZEh6TDBuUFZ3Qkg0ODZZN1lPL3dDV1duYnpwUkNrQjZlWGRlU1BCbDNXWndyT0JZRWJVd0Z2N1hFQlpFWlh5elZNRmg2Tzd1a0JPdTMzV0tpNzhrZU82YURWcnJyUXphZXowdGE2TUZ5bHJNOFlqVi96TytnY1pmTDdpTFJpRGwxQ1Y5MEZnYmVWdlVPaWVWK2grYURTbUhmbWpHR3pyUWxNVXlNaHRWTE15LzNlb0c0dk0xQjNHOHBhckZxd3dRTFlxQUNpazMzdVZ4eUlQa2p0eWhid3p3U1pKNjdlSW45aUluUXIzSmlJR3ZMREExUHdwUmdXaTNUell3YzRvVy9Tb0FubFg0RmIxZU8wTktuaE5qczJ2TCtZZ2Z2RW5scDlRYThOMUpONEhIS05xTHp1bkVEUUlzUFVEZ1A0Z3Zib093UWZBZU54UXA0TzM1WGZzRXowWWFpZFIzZmRPbTdQVnNYZUdsUFpzM0FIOFJ5SVNXdmx0SEFVbldHa1RtTE5GeERJYTNBdEtNak1VbjlwQVZOOHRYZkFib094bTRRWDJpd3Y5MG1aNStrLy9acSt4eTV5dEVhQXUwcFpiNm5NRUxrR29JVVhlT2Q5Z2hBQ0UxcnBVYlUrWkZoVnE3R2l5TnVQMEpWUnhyZHBJeC9lMi9Ua21CSXM4aTR6czNiOGhPcGtZN2ZSc2VrUktNckI1SFZUVnRVK1hOK1hVK3lacm9yWmlLNFhFK1orQURlY0EyaTFzdnlFa01uZWp3T3ZiTFVpeG12clhIV25ReDlDeThIZTRROC9ZcDBLOVNCQm1OUXVVSmFVYi8xSlYyRExiLzdOTjJDQTZMelp2dG0vR25iOUtieWNwNEtNTE1nU0NsMU9YRzEvbFI2N2I4Qkk0Yi93QTJPNWxQbFFXbThnaUlYMzhCMjd5bFhmT0ZhKyt5ajRHc2pwalFncnlVU3dITFloenltVDlpekJoV0p5UXNXLy9CekdPY1dnUDZ5TU54c1ZqblBLYnFxYitsekd1c1JvY0FSTE9tTGhOUTljTHV2MzNGekZGajdWL21nYUMrZjVDVzArSnEwRjV2aW9XNnRiODZGNUc0V2pFS2lqUzlFWUZGQjh3UUdaMFJFc2RUSG03S0hjUS92czZrUCtzN3RQRWVsQ29DamhLbjl1ekdDNjZpSi9ZYWdtQnVjdnVaUXVnQlVZditqRjhGMkpDNm5pMUgxQkQwSjBBRllrYThvV0t1cGF5WHNvZWhaU1lWN1dRN25DaU56MUZqK0J6WkE4bU9ZMVh3Ri9DM0R1aTcwWHRFRWJQd0VRVXRDekpiWlo1bVdXRFRPSzMrTEZVZ1YyRVFOTWtDYjJ5LzZuY2tPREk2SzdXUTlVVzMzbCtSNE95YThMWTB4dkRIelJFTWNiVldDOWFnNURnYlNycXpQa3VPZEtpMHdSaURLRzloQlVOTjJaRm82ejJQdDNyQkREYXF3TnBqKzNtOVFReGFYYkNOOHg2RXdPRWdJNG84VGRpOUpYRThKYmdyODZManBndHAzOHNHOFo0SXNJWkZYUi9QYXVOOTB5SUs3eFlDMVdNbitQRnRnMGR2QkhmNGl1WWRNOTdQZDczOWdXNmJ5bXdVZU5xTWZ3dFRDdWR1NVdZS0RiQmF5aUd0cFR5OXl5dGYxZHM4cTd4RHFEUm1OWTFMbTdsYnNsT1Q3MXZHMFlxMWppL2RGenMvZG5lbkJTRkh5ZmpHN0d1MHNZOTZlN1BJVDR0QWl4V1htQk1MUkt0bWxnRGhoVzE3UWRhTTZHSGtQR25NazJwZXkrUFBUSXNZWWhqREdPZFNvV0RtbGlDRXZFNEwyM1Q5Z1hxRFhlYlUzMDlrUXZROEN3cm5uSnBuUUx2MzZGY2RudUVtUVBhTFBSMmZ4aDdNeFpjU2NsWklxSjVpcU1OWnNVMmhScEEyS1pIcTdUNEg5eXFyOG1qMTNxeVNOaHdVajNqUTc2SkxSL2Z3YVFFZ29vL2ovQTJOblF6aUQrNDVOeU5JRUp1alRQcGhxd0lvZFN3U0ova0tjRG9qbkEzVDBhams5cHdSMWFMbEIyemhMRkEvNFFBcHhoWDFmdzNvblArSEFORTlXaDZrNjkwWHduQW9BUWN2dmZwMk5GSTA2RHhuWUltNk4yMEd0eUkvWnRpNXFoR0M4V0FaTmFtVW0wLzRYSkpmaDFJV1pEdmk0UFVFRW5velVQOW15LzJKRERVcHljYms2NzRNS3RrL3g2NkpCN2cydmR3ZlRtdGoxUm4wWXVWTDRaOG1FVGk4QmJocm9DZ09jSjNEZ2hMckdnUXdLN3pyaWxzUUNHVWRzb0x2UzZtZGdQczlJeWxleDkvTHhhUzJBektJamZOK1UyRW93NkhBRjg3UjRBTnFqV0h2QlBHbkQyV0lrcllBRHVxTlcrUVVzZmNNdjB6ZlV3Tk1GRU9IbkVxajRxVnhMd0loeWlzclMwRXFoUVRSU2dqaE1CNUJabXRyRGc4a08zdE5vc090eFZqcFY0S1VlaUtyUlpxZkZScGhZUTIrcVdBY0NPbkQ3Rm85eWZUTkg1eCtBVmhVemFBc0szTFhQZ3NLcTk5ODVDMm9iTURyN3dYbkw4dmpjK040dDdwWUlaUk5xT1RQU1AwVDBCaW5HdlQ1c0J0TXdYeElaYnpxMTU3dVAwU1lnQWM1aVkzVC9MamtLWGYyaUFZOTJZTWZBQmFsSEN0ckhrdUpXNy9qR015RDh2SXJPeTVRdVZNSE13YjJLS0R0SlNFdS9JVnNxNTEzbmdmKzZmd1VXOEdUZGtNQ1FJOUgzTTdMaHhJR0ZwUGlhUDRRZ1V1QzU5bXNnNjNLY0tYVERDOVlmNHMwVFVNdE5BdHlnS1NhcVRieUdMOXBqMERvTlBEVHBkQ00wQnFFTHR4b0xzTk56am80Y1VvN3BtV1VYRS9zdzQwVndCL0FScUpTTHNqc3dSMDZ3VE44YnNKTTFjSEp0bHl3QzdZMzhCMkVzZG9udjc2QTVnZkV6YWdCc0FCekxFNmdnM0RLRFdOK2w0ZThBbHdORzNRWm1zR0FLSFJHZStaUlJnNDlLMkNzTytGWjg5KzVsMHZSSStTYlBPTTUxY2ZoTm1JZ2RSQjhZOVE1eTJBRXpnZ21id0FXbG5MelViZEU3WkFyWkdRRUNQanRzaGY0OHViMTV4ZHRxZmF3dGk3amF6S05BMXNHeTg1b0FkMkhMNUlWQWhCUHRVNzVycU1qQkhNMDlsTVQ2Q2dFRHplaTVHUytMUjRnYlp5akZNSWZRYnBjSDQwRVVXd2tUL0QwRGVTZWQ5ME9DdDI2eXFRYmE4Njd1K0thNGVGQ2F5bEN4b0lHYlpXUFdTQ2RvangvSmNRMDNMVFhEcDhlZzJBQnNQalpKZmpKM050MFdPSlZ0dE96eWlmWEF5MFhCSkppWmpld0ExYkdwRmVuYjVqeTBrbmdOc3MyT2pkNVpKV0themhRSHlacFZCQ21BUjVpTmZvZ1c1Tmp3Y1NsdnhZZEFGYWIxRDBCMWxhTzhXOVc1WWx4Ri8wOFhVMHM2VEVFQml3UUJ4VUxOcnprdHlVSkQ2d0JJa1F6bzU0SHRNdWNOYkhPQndqWEFTbGJZSE9tekZWVVhpejJnWXdhN1pWQXF4L2Q2clB2U0s5S0xhS1lWTmZEaDlHTlV3N0dHL0NsSGI1cHR5MWV1ZmlqR0JVcndkekZSbjBWeU9WN2VqWUlHYmphKzRHSUJlZktSMUw5aWNYOHdrdGN2ZWxqeXRtWnJVYXFXK2sxTklQR0ZOYTZTbWV4Q2tOMXV0NEZmaHJYa01sa1BlR1R2b1FROXNXZGlHbjZmV1dyemErNWkzN0lwZEFlcEF3TytISEdqZDJJV3VSL2NLNnNlRjlBZjJNa253aEhXOW4vejQyYk16OEFqODUrT2NQZ2pvcW95SGUvMmd3cVBnV3B1clVZY3RHQm8wSHBDMldaT1ZXWnh4YXJ5UnE5dnhVYkRHOWNuOWdvN2RGT0RodHpzaDRneThVNUg1WkxKb1BIeUwzZWI3ajFnL3l0LzZPOHRBVVpjbWZ2RkMvUXpuNFdWckFWb0F0bkdBYlV0WnVDRVAvVEh4cG1pR2hPc2xNOUd5QmQ5MjJQaGVJbE13dWFENDJjV24yUjVDQkJPVG1sMTNsT2lvS0JUUyt5cDU1YVdSM0pMNGVGV2hmVTFyNXVvV0Jma3dCWGZnRjd5aVY0YUdaZVJvbFRFTjNxQXp1RTdaWG8rVXBIcXVqelFndU1FMjFybFc2SXpOeGZ5bmxETVF5T0lBdCtYVG9ER2tHTkVHNmVtODRNeXBrdnhhQVFqb25WZWEzRmlUZzE3RTRlTE43OEJMemdVdDlVM09YM2NwRWJSdXZESm5JYjJQU3FXK21WdUtkWHRrVXNDTHczZzc2cUZIa1JqUzRyYzcxRzBIdlM1My9DQWFyR2VIVy8xU09hdml5N1VTMS9SOGQ1SW96eEtZRFZ2cWtyTnREUG9RSmFwbHdvSDdTL1lxdmxRQlJSMlFPRm44N0ZkZzc4QmpneWpJSWgwVzhXT2lFZ21LSGlCZzBHejdKVDYzczRUYURQbHMvVVhobW03MWdDK3BtNCt5ci9XdmR5Z0p0bzNxRTZxQ1JldjZtVXpXM3NhM3gvR0FYMG42ZVI3MjZXYlpHUGEyS0gzZk1EdGhnTGo1VXBsaFZZZmJDTzVBb1VuQ2tlaHFlRTFiMmZYZjV3NncyRmFJZ0syNHdPVFQ3S3czNHB2WU90Zk9HaXZJWlNlQm1xaXRGZ0FISDdyK2gzSVhiNUZhTlB5YlgwZWljdmd1SFRmdGhSVlBnUk9qOFlaYlkreGZBVHN1SkV2UFpQQ05OWTF5U1pPemY4VWdOTWRRR3JtSFBucW5JOWZMY2p3eVIwZllUMUV1eDkxSUxCdXIyV1pnUEJ5ZDU5eEY2bmNmR1o1QzlZQi9rcWxhS3IyZEhVeGpOY1VwbU55WjU4QitxTUZSRWlKTWd5cDdGT1VyajZ0RGFCNWhnZ1RVUlQ2ZGx4eEFaZllSaGkyM0x0OVhWb3JudTdvRDJWanhwRW04ZnVOeUF5akMxN3dYKzV0MC9sa3o4dG5RbjM4MGxzemxSR2NZOSsxY2lvdSttSS91QUlaSUxoVjBPK1drMXB6bGxsV1lTSzI4bk1JWUVDTjVSY0F2Y1ZlaitTNDNjc1Y5dmxOZEFpOVVPdzBQbmJuNnUwT3IzV015NjkvbEZFdnB2ZWNJazlWa1ZmdGNvbnRzV05YWEM0VXZMd0lRN1k1YTdLdkxKN3dZcVo0MHVabEh6eXVqR2pnWVdqNk9Zb2xON1Z0bTc5M2k3YjJ3UzNTcmJpOWhJWFZzbDNDR2tsVWVHOWF1MTNFcDRMMlUxM1dwcCtNU0FKK21ZcGJIaDNuTk84OEZlcy9sK2M3TlorWHA1VGtscXBiY3gzTFV1c2JqUTY2b2F4akpkdE5GYjVKSFJITExtK3NPWDVjMWg2YVBkS2FlNWU0YTEzaTlMRCt6SzRPMlUzOWNrK0lWVnRTTFdocm5ubGNuaCtjKzRZV1RRMnJKSkNObDMzODBVNW5rcG1TY3NydHFlNG1laGtvbWtmSXp2NlRjRnZEcy9pT1lSM2tPakpmRnpCV3NLTVlIbExxbXRuRS9MbTYrNkl6cVFMK2U1OFVKQmNYZXBLR0lWRFVsbGxlRUZiR0szVW4raUF4OVdaRTBMLytPTTNWNnZEeDJQbjlGT2Q2djFEVjd4Z2Z4NERKVTNhTVEyNWswSEpHaXFzVHhpN0VDVnRIYkVkMlRvU2Nya0NHdmc1WWVYQjV6NlpZM0Jyd2xtZVN5UXpLSFp1bXNxZE0wVHVmM3FLcnFKaTg1YTR2Qmd4UkM1Y2xreVVxS1JERmw2MTI3SFg0eG9kY2tmTXpJRFBDOEdYVU1UdTQ1QVNxZ2svVG9HV1dPV3V5dFB5RXNuSmFCVTVld0ZSb2hyUkpiWkdOVjdHdEU3Zm1aNzRCNXd6Mm5HWWhKTjVMdnUyWXBqQjdrdGRDazFDTjFyVnQ3OG5XWXRFMDM3SDdoSEZJQ1BFeXJQMU00dWd3czlMV0NZMGh4WHdGUXdYNjljWllNcE0xbmNpcnd2Nmo0MGUyNzRwcnk0MXd0UlZQT2E1alJoU1IzMXh3NDVBZzNmYk1kaXBiRUhkMS9kRFd3ZXZ2bjgxUWd3bDhJNmNYYUlLMUJHUmRia3BqeUplTlNEZ3VJdlp2YytGRlNJNkJjSWFjd3Q0SnU1R1lXNUJOb2xVQ2Q2YStDd2Z4SFc3Z1hraFBYL2wyeEtYeGMrdEp3aGR0K1R1UFVCOHJVTGVqVHpvN0VQMnpmbXVlNXZETlN4U2k5aWFzYnBHMWszNGxidGpSYkZoelVabzZobjdtZTl6eDBYajlndnhDNUdCN2Y4eVErSzk2NTlPU0h3S2syWHVjZDFXclF6RlljSUtIc25WT0J5c2xoVTJkdUY5ZlE1SzR1clVteTRHTDREWExLWGY4c3o0cEVNV1Z1MDkxWnVOMVY3aUNFTEN2T3hwNEJ0VjdMNUtmTjBWSDNTOE5sZlpscWZyYVRKbWMwRHhKTWcvQkFnRGVTVVNjc2QzT05iUTZEY1o0a3dQTGNzckw3NHNLMkphRXNhS3pTckt3Nm0yTkNtNG5UOC8zSzhya2U3MTBYWlFWTFBCVS9VeWg1N1RUKy9JM1h5aldmTTcyU1B2dlNneDNKUVIxSGpiNGUwdS9iOUVDbENVUnFqYXBLdlRySHdLeGp0ZFdIY1pXV25INXU5MHl3ajFnYlE0bWtGOTg2M1k2WTNaczlxMVR2SWFSdTZFenJyY2F5YS82RFR6UXEyMEdKcHl0MXQzamh5Rzk0SDVOdWVMaXRUMGpPWmRxS3pHRWxLdU13OFI0YzV3UFBZSWpKblpCZ3BxQW5pM1B3NHJObm1lWDNmRDAzVGM1aHZvY3Fia0ZQQzFycmZTNWhEMDFSbWRBOFZ3akhRYXFLSmFwY3hKbGNXZW9iQ2RVOWtONWNXUUhvVjhuaVMyYlZvcVhXc0xqcDhXQm9RbVZXQTdlMWNmMTViV3JmdkpveklhMDFIamh1MTZZek1xcXNKZjBhVjgzMS8ydW9DemoyYzZtZERGcHVyVW5GUkJrVERrdlZ2UmJuYU1mWDF3K3A5VXVwTHE2bTJXSG1OSlpVMUhEMWVnOU1CQ3J2aXFvNExQSkE2ZFpGUmsvUThCam1oWW9Gc1QyWkROZFJwZWhVdXpwclVUN2NhVHVLMTNuV2JNbzcxUkhJSCtncllWZW96bTh3bkJ1eTJtTG1yek04K1ZvOWpIZ2Y3MmtxeWV1dVpIRUVuVVNwRXpNcGFYZjJJMENWK214S05pYVJTY1Rrby9NS3ltaW1pSi9Ud3JMelNITkltaGRyZzd3R1lXelp2TGc4YXRHV1U0QVRGRWxMK3RsSzVaVEIraDlQRzMvWW9CdnhKRUpmMkZ0d3lsOHlkNmpIaEZmazUvNjRDeFR4dGF6VWtMUngwVHRtQ0h2SmZjWjZOcDZVMTJpa053dTFEcnVKTzVWTFNTSjBpZEhQRlIrWWUzcit1SjQ2MDlldm8vRndha21PTHBMbDM4eW15b1hqb0YvQjRMeWthd2YvMkRlNVlmeGZ6N1FFTXZmanUwczYxZ3R2N3UzTmpWbXF5M2lHZTdTbW9hK1U0MUxYN3VaZ01XN2pWVGJYNEdTZ3N2Q1VNZEJ0UEZRZ01mU21GZXFzVWNRb2FScHhBRk9vd05KTWVUN29PSHZJL01GRGppRDRzOWNaWHNHcjlPOUZFOTMvL2ZCUDFMOW52RGVsMDU3NUlTWWp6Rlp3RGpWRzNhNjAzNXZoMGtVME5CVWYxbWpva3FLbS9OaXR6VENlWUFYLzRNL2ZIekFacytuUzNTelJEY2dSZzlnbFhNWklvWEtRYkt0OS83UDAwSWxHaTJoMjJsZ1pIV3BWR0podVB6Qng3MTlyejg1S2ZGSS9YUk93VnZrSGp2eWdWUHBYWUV1SnJsMXY2YW1hZWcvUkRGcjR6TS8rYTZTd0lzSzNjZkxZUCtHdGp0TW96ajd5eVBHaGZhcU9Gd0txRHh2dkdyOW9QblB1eVlqL2ZESVhPczJETHlaRmNwdTdESWdoWlJ4Z2hJN2VmNzFWWExaNmFHS3gveEd6YTZCK0MvdTQ0ODJUYXllbUVlcC9pdUNWV3Q2UlZaeUNOc1dYSFhMbzRUNU00Slc3b0ZERURLelBDYjRPMnBtaXVtdmVKWEhvbStlSE52YVg5TjNPMm9zaVRuRlRObk1kUFk4YmV4NXE0TE50MG12cjFYMmlBR1N2OFNRR01mWG8wRG10eXYxTVpTVkl0clhXWDMrMHIzN1oyVmVDRzBjdUFWQTV5TDIxak1NSjc4M09sZTZwUWszODNJbkxzTE1Wc09xaWFESnRkUzNzZXZ4ZzA4b3FOMXlPc2EwZWZOMmJ4K2E4bXBzVkJ5cStpbnI5QXJlZENYOE1pYkltbGlGbUkzeU9oZncrbEhNU29IUGhKbElTdlRVWWppd1ZGeVdQeDdkY2Zjb0F2VGNmRjBvQWtDVjhrTEU5VkR5SUJ4OWI1M3o4TC9PN0FxWDY0Y0hRS1p4cWN4SWMwb1MwbDNkUkNUcUp1dGpHUzhDYjVqSWJvSTBmU2xML04rTEZmQ203a1RtODRMM2xrUEFiMFhpdlIrc3p3ZlhrNFJQZTI0NXgwL0lKUWt1TmVxTHNMT0k1Ni95Snh5dCtVemlQUXp0ZWNUYnBoU3FPN09hQzFiaTNMdXZJTXpyRldwTkhlUDFFenpma2xoa1A4ZURyd2NMbmVZempIdCtvYTJJWlhQS2M5cEZMOWdlQVViQW1hZitOOHV1NVEvY3J5WExteUZLblBUSENldlZSUURXNDhxT2FLRDJiQ0lGL1RJZ2ZQSjJicVdWdHpIZjFwWDQvT1BmUXRKVnRPdjdqUk9oTXRsbVc2K0YwQmUyVGl3bGVVTjBDZ3BhMDh2MmF1WXZtUlpncHVDb1dJVjlkSjFYbWNqQnRabHEvd2NZNTJsOTl1dGpVdEpiRlR5ZU9lNC9teWl0cWswU2tMQ09SbEN2VDAyajdsQVYrRzJmUVZzOWRISzE5emtLUkVHVk5Pb2lZZVMrQmR6REtuUVN5Z2c3YzFnVmY2RTBOTS9XRnZVd2RDUHVTT3hJV0RIdW0vTUdPQmJubEZNd1hmbUY2TmZ6OE9aV3U4UysrWllzWmdiR0NsZDFxc3pKQVBiS0s4SlNOWVdWeDNiK2s4MXZIYzEvYWtremMrYXVBdndOWmcvQkVuVWE1WStKM2M1L1hEWUR0YkJ2YWNUTVJyVUhlQmw4dzBWb3V0SHNJOG5Cc0tzTzlkWG9uY2tFUGFRQUxPcnZSWnA1TVhUem9EandDMmJjTFBUNzBNdjRVL2lyNkN2aWZ5WHM5YjN2a2NTM0l2YW1WYTF0ZmZQdnV0RmJsakNzSkhBUHRMYUVlbVVMTTZzSDlKWVdIYmliT1FxTW80RnQvalpEMmZ4c2o5Zm4zcEtLSW95S3ZCZlh0UlM5Y1RZTUh2b3RCZjc2bVZEZ0NmdXV2Q0tGNmZOOVJZM3psMFduamw4SHZDVWR0NEwwb2VDOEFybjFYN3U5a043Qml6LzlveE1SYVQwT2poMEdxQVJscnhlUEpmMTkzdW45OFNXQmsxMktaYWpLd1lxSXJvcDgra1BBUXNCVFBESkFnQWQ0QlY5dXp5aWwvNGN4NjlscWZudUltNjFzb1I5TXVtNXAwTFJrSUVNOVZ6RkpSUWtuanZwamxtR1ZCNng2eWNpOUVqUVg4RThYb0p3cTBmaWw3cWFNbCs0bnFkRTl3VmVRSzBKdHAyamJpaWVRTHVtYXRXNXRyenRiSStFMGx3OGxIUkZYVnZvdy9KZE8ydEpaTGZuZisyNmFaWWY5NWRqVmpCTFkvZTNpcUFVSFNUR3VxNS9FUFduMEo3UzZTZ05XTityK3g4SkhVeUJHUWVrRENXdTVzeVhtaVB0MFhYQlZhZVhWWXBwSU0xQW5MeFZUbnVQVkxNY3N4QWRqRGtIOHh6SUVLY0NESG1LV1JDcHBLOWRVc3FiWjZYYlJtbXM1RFBKNXlVZHVrYWNuNFFaSzlhZFpmNlJuZ2J2dDEveDQ3Yy9iSVlJdUVPM3pjOWhPWm54NkZCdlYzVFhjTFJqRGN0SEZXOGt3bXVnUFMvUWlUWTVQak9BdytiVUJhT3dlMWZhMUZEZHRmdHRhWnhCYTVJYzRJaThNemU1d1dyV1NxNHF6RUlZVzRPWldiNzRpTHlNeDhqeWEyVDJiVXc3c2hkZC9JWkg1TDZQRUgxNG1PZG9tVFM3OSs3bjUxZmszdzZJbENTZTArYXFWWmxmSEQ3aXpKdGhaMTRhcjdBRUdWemdsbHhZRXQ3MGhGeFVsMm1LbkhiaG5yQ3JYYk9uNC9ac3JSYUtqNGJmK04xYnJEVzBWbTdSa04wbXJUWVUwdUxYVUxhVy9UakNFU2hEaGRHVHdzOHBnOVdiRDdoS2kzdUl1T041V0ovUnJReHc2L0ZubEZVSTZPSTF2bFpEQzZvaktYS2t0cklHWEdrdWdQOVNrdjZyb29wdHJqMUdEMWRXQUlxMnFNb1phM2w1SGJkYWd3WWNuNGlaV0p6YU5kRUJaVElPUXNXb2JlU1J1MWZxUkVpWmltcitpV2hIK0sxWFpESjYrbElERTNNd2dVV3FUL2F5UTF6RkVXZUNWWmo0VEpWa1dReFpyZjd4Vjc4WHRpTUhlaWk1OVEvSXVXeldPQk05T24wa0M0bU9XWVZYOTdyQjA1QmRjNm5vTERMNzE3UnpQbXlqZUF0bXlCUHo2UTNxckdyWmp3VFQwMCs2RVBnV2FoMVlOTWVYUHJRR2k4VUdkMDR4aEwzaFVJOU9VQUpVT2pKMWFuTmtjQVZCS0Z3ZU1VTmVDcm0yV2IwTmJxMy9oVlowY0I5cklNa3BCVDFJaXRhVlZkaGZWYVB6SXdpN2k0ZXdyNnhnNXZWdlVZVTZQMEVpbnRpdXc5dW9TSlk1dFRGMGJPeGRNNUREWnJyakx3Rm5MWTlwSENUMUhmak0xNG84ZVJkVTgxM1Q5MGhsL1RmYkhudU5scnc5eFZidFJaZ1RsUTdpelFtTWxqYVpmcVNGa2VLMTlHYjhIcnFvampLZXVHdnE1Z0pQckxtTyttaGJBM1ExWmpHSU1WUXZXQWxMM2NPVEUzNjFSdmNFVm81ZFVYczFXUzBFS3hGbi9sVzgySDVnY3c0YVFDU0h4SWFyNE11aDVPbElKVmZZQkhNYXdCb2xBektHVXRkN2h6bnFqUGNLcFdSVFp1TFphbEtnQ1NKcnl4Y2ZrY1E2NHhXeVBuTnhPR2t3OEx6ZGFCT3BxYnB2T1FYZzFXZFF0SzFOL2NEWWVxMnluQ3hMZFcxS2FYa0hCdUQ5L1dSNStMa2xUL0pXY0RzaHhBZVE4TDVyRnltU3NMSnl4Rzg4VUVham8zczBwUjdLRHJOWUZsanF0eUJmTktFUWMza0tIVTE4dFk2V0VpQ2oyZGlxb1hFNnY1TmRicEc5ejRCbEJkME5HTkNHRnl1eTFyZTExbmFLMmZCMXY4TFMvbmcvYllhczRsNUJlUXk5S3BlMnF6aHkxeENiMGdTVWNadVUySkNSZW5CMCt1VGw5b0I1RGxHVXkra0xOb0hYa3ZiZFQ2WVErQlF3L0FIb1o2aDFlUE1oTStBempRVjhrdDB0QUJUQ0pwdDVEU1NXaXZFYm5PSTZWTTBPSk9GTDA3V3J1akZuWG12NUEvOWFOeW5WeE14M21VZmpzYmVRUGFLYlRkSUEwWFNHVDhhenFPZUpONVNUMHNkWnNKWExFR1JLcktNZzJKSkxRSHpubHN0Z3JxUDNlTWQreTV1L0wvOUFlZnVhQy9BTU4vazdkMHA0QlBBaUs5M0hhc2hic2Z5UEZkNWVTSGtvUVBvTG02dSsvdlNLL3dqeklkNTlHZjd0NGU3Qm9NVUdDSU9CZDZRZld4WE1ZaGFIL216NDR5RUMvME1pVTRVOU9VRkVaS0tQakVrQUJoMk9pMnhFRHJpREsybWtLTnExTDZwckd1bFBpQXZvWWNWMGtueFRrYS9VMmdwN2lTOUJvK0RFREp5bm1pekk0aHlqSzR3M0dRYjdjWktnSll3cnJSdGhtcUNWN0cyRU4ySnNYWkd3ZWJvbmR4cFdoVlBIZ29PVHJ2ZzZvc0VOR0FWa0FERVVGNTJXUVRId0VrY1FvKzA5ZEFtRlUwYStLUW9CSEprRVhRYVRTd1MrZWR6WE5CeEJOMGhBbVNnL2RSVW1kaTJvdFk1YzB3QlpLWmFJQm1FYndVME5UUHFXUjJxUnNLajI2Ty9DUXBKa3dLQXkxWGpVMXppWFFqRzVPV2oweGdQcEc4Qk5KOTVGT2V2Yk1RblhWUE50bzVlRlN1QzAvcTk2U3RYbkJCUHM0dVhuQWxralRUbXBxNWtvZXRXWU9UTFl3ZTVLdGpwU1BKOHUwWmwyS2tZU09QSFRSdVM3UTYrNzA3Y2hsM25iM2orOXBQbkdWVU8xYnlONGg5b1lXbU1zMmtMU0ZJS1hYQ3ZNNmNkeUdaRHMvLzdxaFBKandIeSt0OTRGUXZMMnRNdjkrVEkxZjI5Q1lnNnlwS2tVNUVYNTlTM2RQM1E0eG1XWGw5K2dkOWVTcGxYOTkvV2pIbEZlbk9QYjI1VjB4TU40WGF5R0JTbTkxVUpyMkpTbWxtTWlpTlRaVENhdndlbEtJdkxXVUpGZC8xbFFnTnVURDc0YmZQWjFWZTJMa21uNVdadkpRSjg2RUllN0pVcHNLeFJWaHM3VzljQUljUHd0cnEwajhQN3AvUGx3eU1hV1VwczBvc000bVY1T0pYMVBBRWxLWTY0WHUyam1hV1dOT3p6dllZNXBGUDhwUEpzSUZrYXJFOWdVTEI0YlNNNmh3R29vRkRzblBvcGExMlBUSDVPMUlBM1dBS1BpdjB3RkZTcTl1Rldka1VlN2trNVJVbHBVUkJ5TTloMXBOZ3VFZVJhdStpOUF1cEJTaFZhdkdUYVkyN0tQMENhajQ4ZWdmWTR1bnc3WFl4QzlIT2V3dFJFdk1MenVoN2R5V2k1NDlGdWw1ZGpCZWZudy9YdVFkNTcrV2Y5d2NPdnpLWDBFL3VRWXhnbTZBbVdFN1g4TWJoazc3MVFINGp0TEI5bDEzQjlzekFGNGF4czVYZmxISDFYdzVOZldVcEhmbktNSHhXTDJ6ZFY4T1RmMElVWW4rV05CVVg1TmpZQ3ZTU3BNL0RFNUNZWlg5alUvY3JoZzlwOXJveExVRWNwQzJMbVkzbEluWFIrb3d5TEpPUUp5RGdLeE03U2ZRaUNxclEvZkUwanBzcEVtRTRhNzZ3dkx0QjRiaDZKU09wNXBnZVJuMG9MVHBZZ04wZllhUGczYlhRM050dk1yditXQm5xZWEyeTJQSmV0TGRlUk9jcEtObzZBTldzeTJMbXJPMVBXeTM4TnlLcGV4K2lHNkFRckRHTzg0UWpXaDEvWkp4dk5nVDVvaEdkdHRVUDhyUU5abE90VW11cE5WajkzRnFsc1RZeTZIL0JML2N4L0tzMWp5UWM4SUtQakFQNHNiZHpiVjJoQ1Z2NFBjSGNpSUtVcUQ4c01oVjZxM3Q0dEh4M1E0ZWUvODUwQmJnNUd2SUNnOVlXLzRYM1FBZXFyTHBLSXlLcktBb0R1RXBQTktVVjAvSUkxSExpZHRmQjFOY0s5ejBWTUpHSmFncUxOS1Y2cDlNQURhR0tjUzFVRWRkN21BR1BlUEcrbkxPc1Nsei82a21paGkxVUt6WEN6dWhma2JSM1Rsak13UU5GTlUyNEcvNng4bWViNHVjS0xKbmJRamJIYkhNKzN0WG5SRUx3dFlMMFRvdlpWQ1NXQTJsTXorS2lpYnZOa3pXRWxuZ3hsVjFPTWZYaUlpRVNjWDNJb2tyMzlSekFCU2E1VUpWNnVTVnNJUUlLbXdKVmp3d01pREpuWlI0ZlhkTFZOTlVnVEQ4azZ2Q3hlSllpZmxHeEJ0WlVMbWZ5eTR2RkJWZ2x2SkVvWlVzalBrajBGR1d4VG5VMzVYMjBoZjhYdlllZWJEOXVic3g3YTVJRWM2NSs4VTZyWTVmd2JCTGhUejdUWUVCSDVlTlY0bHpkWHVIT0taeXZXQ0FRSjR3WFNhVFF0allTWm9pMmR4UVZwMkNOOGVXSW1TL04vOCtvUHVnTmE1cTZMRVVuWkhoVk9UL3UwQ3hpY25aMDlzdlppUHJkSEhpU2pRamp4bHI3SE5BWlRhYmZFTDJ4MHFBMW1JMTN3dTA2WmtNbDVCMGhTekY2cG9DUmQ2M3VjNjI2MWdVc0JUKzRWQ2VmM2ZyK09MWG1NNzFPVXgxTCtlUUNlWlo4a3RENitkNHdyYUtyZmplc0dWMzBvSCsva04wOWU3MDFoeWVmd3FkVXV1Qm5ZaTVxVEhQV2t4ZWZmMjVYQy85M2N1UVpqV3ExMFNkOWVySHJPN3VtVVNyUjlLQ01jNHNkZWN6bkhhc1Bua0xzL3pydEQ2TmlxQVpCbHVuanFxTGNxZkdEcmVldkszcVBYeHZwWnVQcjFOTFlmeGw3Q0VtZnYrcTFzMExYYSt5dVg3ek1yOWNNSXM4ZTN2QVgwWDFkbmJwc09PWE1JNUVkdDViRXdKbVU3Qit1Q214emVRWFVhclpLM0VSZ3VLUGtVVVhRdURyUnNSNEpHQWpFNGZBaWtaTENWaGw1dWEwOTcwUGQ2WjZ4NHdJTnpZZ2xxbE9BcElsYXhLRmk3cHF4cWU1RVo3ZUVPM3pNOWlPWmo5bU9sdXpybWhuZ2plUndraWU1cWNlUlN1ZXlGS1ZJT3VpRXZSRmlUcXV6ZDVhQUEzZ24wZHpFT3dKVy80VXo2ZGxWUGpHeGdheDFVNDZsYnBtYStTMzFQeXBrUDhKa1c2VVVma1VKZjBSYU4wZDlpWS9BRThtVXN6cmRScWViOFdaQjd6T0dOcys0UFlFdTJ0NW0vWkVpQWppNXcvcHQ3Z3JqdjNWMXcvZUJPMjl1cXlpMWZwTzd1YXNCZmNQdFJuNHQrWi9iODd3dU9TQnNKeWpNMkZab1IzRVdWSVZqNnpBMDdTQlgzcHR4VXRwUU81RUc3SGhFRldYN1g5ai9QR2o0VGhuMW9hSCtRNUwxTytpVGQ1QWRRT3dQMHNDeDhOMGpNU25kQWtmV1BlWEh5RU1pN0V6YlVaMWw0YlQxL2FCWVJMV2pYMVhNOW82ZkVkZXl2YW5idHkyZnEwQm5vZzRoTit4cHZrWmcrNEtQM09XRmlLeDhkZ0tlM29vMzJDbkRxVXNhTkpDbStTeG5vL2NlTHZRZjM3MGxXcForRUlqOUY4MFlxQkFFRnA2NTRzNzYveS9Ocm01RlpPVTJGSE5Wa3RCb3NiWlBNZzh6OTBpajl4WXAvUXp3Z0ZGVmxROFp2aUcrOFVOeDZuOGp2SXJZanE4bXh6NHpsWERyUS85WlR1QVJyZThva0taZ0RmSEVwSmxOTEM4MHJUYjE4eXVpQ2FYVnBqQmMyTHF3ZjFMOW91RmJMMGQyWThHUzlkM2UyWnNmbmZ1aytiRWVHTnJnMTg4dTlxZFpXYzRIV1prOVM1MWRFdmJJRWRzUFpINzJkb0prWDg5TUwyOS9EaTlsMndRdjdRaFNMUi9MdDlyZzNBcmJIWFptZ04yS1YxZVZCUk0zS2xzYkpsdnBicnpXUVJ4Slh0VU9kMHdHdjAzSWVTc3J1MHFWVDZGUkJFR2g4MlJPeE1YN0FPUG9tdHFtVnpyTUNMWEV5djFRaDE5WFRKKys1UTJ4UXVPS0FLaUQ2UHhTVG5HaXBSaE9vTkxDRVE3dkhVNXpXUzNkVHJXcHcybTJlMTE2UXhHcG9yaVlYRkdZUi9HTmVEK0NFUEpJM0t1aVFZMG5aUEZUYUZuUHgrc1hRb2oyV0RHcFFWVlNrc0ZLb1dhVFVsTFF1Rm93OXQza0JsemlRWUMzdXo0QVV3M0RtcDIxd2l6NTRqYzRSOXkxanVzdDZzdnRUQXNQbVRxYjVzN2RwSzdIMFMrNEVZOTZNeTNsc3NKTlFxbnVuRTNLYVFqOTYvdFV4WklwRklGOExoOW1LUmZOZHhKdkJIQ0I5U3hKZkpUb3hMN0c3RTN5T3BpKzVVNWtLUllySmN0WG16QkVoNFFjaUFEQk1LSkVOdXZycXZzaGN1V3ZmY24xWGptMnhwUmZYbXJJeHRwbFVseXRxUUFBbU9MdkZCVzQ3UVdhSjM0OGh1Zm1pRVFZMFZwYnBOa3RGbUdFYTU3R3ZJL09iUk43UzNrdGFHZy95UGd1eWNGYkRlRmZUQTFDdllmUng2N1NabUJkeC9DcmwzN2I4RmZiaG5MdjhMaFBuQVlzL2FyS2Z5Rjc0QXk0NjBiYm5TYjk3bmh2ZFQ5NXFaZHZZSFlqVnFlVWs4bm9pVThlVEYwc1dDb1lmZERlQnQ1cHdvY3NteDI1WTRhTlJraUpxekZWRHhoS2pvZE1IZC9JOFBGaGdOSjVxYzQ5bDVUbEUvdkN0bUpmcktzMzQxNmE1UmVaNXk1SzJlOWYzbm40TEJ6eXM1TlZOZVJLVDZJVFdVSTM1UmFvU2hrNkppT1ZERVRyZWhiT2dsdUlwQS9OZnlqRmRuc2JDS2hHcWRaZmpJaG84bnYwWjB6T2xSaXRUYWlNaklSVDZFMWp6Ulo5WTAvRHZyUVNDWk5DZFhRUk5DM05icEdrdGtXUCtKd1Z4R1Z4M0tNVXVVT3diZGFIVWtTWHNnVHdXamtienlPUExENnkwOWs1SkZ3eG5jUEVZcy9GVlh4WVFWbFlLMWs0VmZMQ0thdnpNemh4T1pNckxzV1ZDa3U1VEdGNTBhRTNja3lQa1FzVWRFV0hOWEJqZGtGK0VVOUZpVFlweWI0c2JNVzdPWlJDT3FXUVUwcDJDU1BoUDlOMjE5QndRdzRtZUtId2hLTFh5NWUxdFU5TnltRWIySk5LWHdlTDBWS20wdUZuNFJ0U1ZhbTBGQzlYRU1ZVFQwbE1XRk5FZkRldHhyOS94RnZ5WWR2WUZXdFhHZ1Z3V2RIVlNnbE45KzNpU0VkaURBQmRJSWxuYk9xb0lhWjNDTXl0SmJRNmdxQmluNDFRVVVvdll3bVpDRjBTcWRRQWpRSFJVaWlBNWRRQUx4SmxDaGpFMHhIdWFDU3JnR0JvOU5TUjB0djUvMW9JVWEzZlA5NVo5bUhIMkdVTC9pSldYSmlqeHBJSVdpcEJXTDdQUmlDV1VlQ1lMNU5YblI4OGZ3eEFsYUd6UkFMV3ZIbjBuZlNKcW8rN0NUMTBQK1JoNkJGbWRZQ21LcFBtVDRXNGlackVUQVlpSHZHdGlLUnZ6UWhjcnJWQ3U3RHZ5TVhFV1NvQ0R3QTNXTWlSbFhtTkdva0M0M3Y5VGo3elcwS3RQN2hPZUxSYmJFQlN2cTNSMWRIa2NyVWQ0bzJ3T0x6ekxaMDdtYmRSdlRUcW01dVR2aEl4L1cwWVdBTkt2WjgwR3Y3cE9QSytpZUd2MnZtZGZ5dG11ekw4NGNKWHgyam1ic285RXBxN1ZDWXF6blpGZ1QwdUVVTm9JN0J1S0V0NGZxR3Z5VHZmMjlWcmQ4RWdCbUJDbkF3SG9jVmQ4d0JlUyt1ejg4L1JWUS9OV0JwOTFmcE1ncC9XRTN0Ky9rNFpJYzV5Zi9XRHBXRnJvZzdRQkdpQ0ZSME1UdEwxd1JkWkd6elBpOEVzL0xPWHRWMEJTQk9SVGJVaHdOTm1KMUlKYlhJdW9lMitnY1ZIUElqK3g5SjZBNE9URUF5KzJJOHlyTFluSnBsNVpSUFR3VFNkR1p6a3lNRVhWVFo0WHJrWkZqODhNZ05wU0pBSkxVRjJRMkdWa091ZVZhZWsxblhRaDNrQTBJT1RsRHY0SXZ6ejU2azdiZ0RXK21UbU1tdXVrOGdwUmNYcFJicVVoZHh1T0lObDE5MG1XUitSOTI5RWV6eVZkTFFsN3BvUWRJWTFYL0U4R3lNOW5sZEZNcDN3V241WW5YK1JuT01HbUw5MUw4bjZ3d3NvSmk4U0FhUTBFZUNPS2w0UTI0N3NUeWZ4U1NERDZreGtoT2gzU1lQTFljVGRMK1RkY3FvV240MFJjUXZOVWlGRnd2Uk43WGVHcTl3THJ3QlMyb1g4V0ZkbkJBbDNzakhZTmY4bDNGZXVsL1NzTTU5OTNXNUx3OW0wOWwwYTlSTENTbUlISXZPd2d6T1BPaUR6cGwzbFkvQVFmZ0lsNUcwRmcyU3JJZkhaelMwdDlURko2ZmVTTXAyVS9UUXA5MjFTL3Yya3dzOUZ4Ui9hMEF2cndWNFRRVi8wQUFxMG9aWkFrWXNBNUhVQThnWUFlUUdBOHo5ZnhCZ2dnWmtvQ3U2ajAwZmFIVUViN0hiM2IyMzEzNEFqZE05V2ptUEFUbXFLWFdQdFVvK1ZnSEhBV0dtWWVRWG9MVjEyY1c0M1ZTWXV6aHc3VldSZW1WeEhUNTZvT2QwZVVUY1RpNEJld2srY0c3THRWS0lpUmkzNmd0UnduQXIzQUtvM0RrWStYZXJGeVpXNlhxbGNhWU5FaGNBNVZIcmFnVlFBc2ljQnVRVUYzMU1lR0NvZzhNaWhlb3d6YTNrOURpRXpNY1p5UDZHU2oxTlpVSW5ubVhNRGx2UFVLQUNYZ1VxOEwxOEhJTjhCbVhYSmErc3hJYjJSc0xRQmdZZHNRTE8xMkY3Smc3VFJjZGlrWDF2T20xT0NnMlpCc3UzZlV3TElBTDg1aU9qM3E5TGxQUlhCajg3UkVYYWNOY3BlcG1YbXJiSnBLS00rbU9UaGFRZkVkd2NLd0RCUW9kZk5EUzU1ZGU4Y0ViMHl1OThSV1NENml3c2p1My9WclI2TWVJajkyVFVSalZwL3NxM1kyQUw1ZEVUMVp2L3Y3S3drakhENjl0bTlraTUxbFd1Z1E2ZU85ek5BcmtFdkFVUmlWSXIwMlpOcUZzMmFlZ2tJUWRvYXpwSG5LWGFvV2RkVkhNRVMzZXRzR1JCNm1YWHZkRkZVODdTcjF3bVp0dlh3Q29IOTl0L1hhYmkyQ1RUNk9IeGJoM1JkWnRadXNVT2NKTzNubjdWQWxlR3RZbmRMdUlPYll0SUo0Ung2WXB5Z3FoclIxcWRuQTBCSlZXcG01Y25Mek0weVdFMmw3YjB4c2xzbUNrT0V1SkxUQUF5dm1vbHFWN2RpRGRZY1hVRFJxZlg4NDB2V2VyNnNON3Q5V1dmUGRxdlRVMWQ0NEVrOGMxY1ZUdGg5UFFUbi90bmhEVldjUmVwZ25CaUxjdE0zMVExZnVhUlBiRGZjTXBmTGNMczhDbzhENDY2QnAwelFIbGlqTkRwaEo5cjZiaTBzb1E4NVg2UmRRakJYQkxXTlVmM1FKR2ZCUjZlUldhbTRpR0NZNTkzNGg3MnpVd1htVnU2eDMwNmhpcVpyT0djQWM2T3FTd1grVzZBZEVRd3BMWmkyVGxJSFloZmN6SmZFR2ljUnZLU0lLZm5FRmlCWFNXTHI5U0hvbDQzejdRdGhzU01FV0cxcnBQRXRMUVpPaDM1U3JucWxlRlZhRmwwZ1JFYW1ZQnBRVGJXOXArKzVuTWRaQmdZZmtzRm1EVkFmdUJoT1R2SWNOSFRQdmZWNHN5VTVGeXJxeGxaejJkbGd6Z2dQZVRMWmNwMENtNEV4bko4TEFlNm5yMTdmWnFxakp6QW1IWlJHWHgyVzltQjN3Y1FrRnlpVUZvTS9xRldXS0hXcTF3UDlVUW91UU1YYlRTWGViSFozQzB5K0V1eVlUKzVFSnJVZnhROGVaRStlUHovYzg3Tzl2Y3hYNFFubTlJNE56VEFMblhwVFl2THd4c092VGt4VXloOHFDSWFTSXhKMFp4cmZPMVBOTW5DSWt6cWkvUmxUNlFRdFBZdjZzay9wQ2NBeUs0MEJYR0hKUUhKeGxBRWJiRzZQVXdteUpXZ2R4MXNzbVI5SWh3TmFXZUVjcUZkamNnTVY4ekQ2b1BVMHVlempRcU5FSjFZNFNvNUJRb0JEeDBVWnhSZ3ZzN1Z0S2pHNXdzMkpUOXVZZkU4TFk3NTRDZ0g2MlpUd3JoanJ5MGdCdlBQWGJleGxIck5GRVNNczJwVmVwOHluVDU5YzV5TnZUNGR0ckpLT1d3akdxamFrZW85SGlObk1tRHJES1NPdzJ6V1FWR0RNdXJLc0pzRVdweWIxaE9aVEk2TE1uTTVTSDFEWk9IbEp5SXJnUmhUcmNnVllySVJBVGt6cnNjdzFTbGdBYkttazBVRUIzUXNQZVZXUmhwQTliTWFnVURLUk0vMXpBRERSeEFubFA2Z0FoTXJuSnNtbWp6QndFV1dkaXBST1Q1R214dmZqR0hoaGNNTytWRFdLOG4ySGczdTZCa2c3UWlrM204YXRibGlnWWswOFk0N0NaQU42ajBkbk1JRFZxVzBtVStXQW84WHpQdHV4SnhZMGhKTVROaWxhZVFwcEtBYmd4dUwzU0dXVVJwSC81SUI4L0tUZm5xMEx2ZHU5ODQybktGUHZ0bDBkZG0wVWdxZWV4R2k5WGhOTkRLZ0Y3byt0OWcwZW1hSWpRYlZ1YnJZV0ZWSEMrUDVDYmlmdEVkekE3b25NamFNREEwd29EZzlDdkw5R0lhNnZTODVOblduMnhVTjB6Ym5CblpEb1JvWmlHRVlzTCs4QnFORWhFVjJhMkJCbW1ZTXBmVVRzOXpBQXhsRm9VeFM3T1lsT2kramd3SVBwVXFuTkJua1VHL1MyMVUxVVlGSFFTQ0NlMGY4ZWZGN3M2eTBkeHRBZ0RkNWo3NWRaWTNMR0xpcnFPM096Y1k4TWpqb1R2bUNSSkp3NzJhdE9HY0ZITkgyVEtsOWh1VWMwVUtaZWpZTVZjYUx6Z3FYemxidXdqV2pzcUNGcVR3ZnA1YVduTGNQcm15amNDT3AyTEN1bnFzYTUxZGtSV1lRK2ppQTdLVzNXMUs3cS9qR1V5djF5WEVsbTFEYWFPRWQwbWdUTXpOWDNBcnhvdDFaT0crTGlxb0ptNnJud0RiQjJyUlMwTEdUYjdRZlRScFJHQUR0SzB5UVJqck1Ed0s0d1RKKzR2SFpqczl0QnZPcjRtWDNvaEYzUFZ6TnVBeDRPTmlhbHN0UmF4aXFVRXNKS3JDNkFwVnBMSjk3WThtWUFDLzVlRWJOZzRiMm45NEpLaDEwZVIvWXNvYUlJS3NJTEFtd3plckxxa0tBejc5ZWM3MVJTK2JEYmgrSFFNRTFXWFFXQkVNQ3VTMVlZMHVFTXpJbnhZd0V3VVNIajB0ajFUY0VKTHFiSUtodlFtWlRBaStqZjdoQ1RCSFRLZzFzcU9maW42bm5CYzh1YVovS1lBVHBUZWdmUCtJc1R4bWkxYzJ4UUNXMWJhNEJOMlRDQVgxYitDWGZiQzIwZElZZTlYYUNqcVRQQzBTNnRoN1g4UjhtSWFpVmtQa09zVXdrd2ExNzJaRmxWL1cwelM5cnBFNzlDRzJNdEl2eENQOEhkLzJhK1ljZ3dtTVl3RFJpQW1yd1NRUFZhajAxQldxc0tiSXpDM0Y0WGx0V1NjUXpyalQ5eTNJU3g3MitndXR4WFl3ZkZ3aVJnN0k5dWw2VVA2NW96YWRLdW9CVHZEV0h4S0l1dXEwY3MveGxlQnFxZE55TjlHQ0IwRU96WUF0S1ptR0d1QzhWNnZURk5ZS1VWeXBXbUNnU1QxbHZHMkw5S0hsaGVlRUhhWVFQVE5DNDgrWGJ4eFVNc1dLTGFTRXR1dkdVR1hGWm84ZFhqajQ5cnU4S0ozMXpDd0FDMm1VVWw1dzBSZFEyY0RHWWFDL0hpeWlqZGVUUFNyNDRRT2xLV3c1eHFPUzFFMm5OUTdtMURnbWZ0djl4aFNvZ3VURlNkYytWMDUwM1BpMHAvOVJoYWpqU3VYUHl2UjdGM2ltNTJ1dy96M0s4d1ZTOWUrTVpDM2Z2bXpYdSswelJYcjFwMlZyV0Q1VjNNWEZyZGVWUHBMeDlCcXlXcWN3dE5qL3I1TGcxMzd3cUg1MjZpOTliMlJ3V2NlcmF5RkszS3plU3c1Ti9PVGU2eERzNCszcnVOdE5CQngzbFVPOTlRODZYM1lRYjV4dG5sd1VJdzQwY0dTMHd6dDcyMnNXbys2RVJOWmpTcTgyYWtIeThnNjBpRWswZ3Zqb3JDdzZUVjhZalhCaTFMS2dPNnhlc2gvenNaQ2MrajdXQlNwcHltN1cwa2FFeFRZQmVjMXZybHNjYkZIcWFYVVFUc2lZV204T0NCcGVsOHNYQ2M5UUhWTjY5eGtWTTVKYVZyVm9kdE12OVBnZnVRU2xMMHVMQlN2d1BQVnh0SzFBWDhKN1pGeVVwa3RrVFppZFArR2UrWmw1ZWpzTTBvaDlFTHpPbFRZSzZUK1l5YkpjZXZxMHJYeXVJQURXUFF3bUkwMjlYbldhM2xiQmZRbXlUaktFVk1yZXdCWjEySGxKQzRPMjBRZ1JqV1NZL0hoOGVqc2R1dzVQMTJDeGFPUnBkbmZQYWxQRS9oajhaTGcwRDFoUmgwU2dBdFpHeFlvYnVyY3NkQ3o1NHJXd3NzRHNFeUJyODQ1dnlXYzlKMVdGVUtsdnBsWWpDcG9OWWdUMVJOa25QMVM2WDB4ZTRjaWJlMWZzQmwzaG1MeU9iMFN1aktrMVFESHRTcjVRQXdtQXRQNDlDNFlWaUNYN1poemJKRlkvRFRaQmM2ZXZaK3oyVzZYK0U2bHUwOWxZalN5azZzQmtGcnlDWFVQeitWblUzWCt3cmR4eDgrMEpUdTFNZUFaVldPYzhyWFR4N3E5QlVsK3pRZzdXaWwybThycjd2dWp0MjNmSnFiVlFWL0p2T0hBQWNtdUFrZkJyVlZWQ0pXbDNpVkEzOTV1S2dSbldZS1hTZzNOeXJpY1VSN1pTSFFUd2lDdDgvK3JmNXFQLy9mZUFNRWsvMXZkUzc0dUFtMi9PTDJuZjFYZGZuemJiZFhaSUVBMHdEVStQK1o4RmZlRkJoTFczMSt2T00yK25tMVZWN2xMTVBleWo2ZGE0QitpUE8wMUxGSkJqdkhmbm9yQkVmTjhkVE9lTmk1UXpPRWUxbERwZjcyaTg2QmJBVFE5N1h1empySkdOTHRCWXNOTUFHNzRsdzhndmZyd3lnanRsckxxYW9XdjgwSXAzMWNJakxUdXl5djRwZlQxRldBTzZwcXhNMTh4ZlJYeEJKZ3ZTWnJ6dThtZTRUdU5JMUpmS3BUblF2UmVCYmc1MUhOS1VzczBJcE5qbFlrUFhtRTAyT1pwMm5ZdFNrQ1RpYTFWK3piYTc3R1E5OStaSmJqR2VydFpBUHBKWmZnYkljU0hZVDRRd21PdjRRNnEyVlNxN3V5QllyUmRzRG1RcnlIYkhSMS9JSXlLcHRsVG02aGIrVTdPdnQ1RVEvZTNSeGc1N0V4UmxBZEpTSHU5a3lNdFdXVTlYUFBvNUNobHZOOFQvVE9aVy9ZV2swR0QxdTlQMlFFVXFvTSttSEZHM1prZ3E2T2ZrSTh5V0FjeFRPL25BazVmcGtnY3owaVNRd1hLVzBQM21seFZzcWFSU1BBZ0RyYml5WVoraWlUY3ljV3E2dU1qdjJNRHp1WUVkNzM1TzZveDBaRmw0d0E1SThvUUFTSEtnQW5STUhISUVkZFJZMGdvZ0V3cXZIc21QL0szVWtib3hZMHlCOVJnQWdPWlFsNzBSWWdCM1ZsUG9LSUJzQ293TU0yZE1yc0NubThvbTU4SVNRaythaG9ZUkJNeVlVbmIrSXU1R2tFc2dKSWJ3UFpldHR0dmtpNmVUUENlMXVCQUxlSEtORFhjVXBDaGdwYjRzbjJ4Q1M4dVgweXNCdUtLR2NFV1Y2a3J1RVQrRzMveVFRQW5TLzI1cTBBbksrOXNNZnlxdUs3OVRQWjF6ZjdtMUpnU3liejBEc2hFTHFmc3dqSWYyZE1rR2tVbEV0bnBBSW9MOThQSENQd0wwa0VxMG5iSG05dVRjaHMyTkhHdFF6cVo4a0FnRVd3NXZ5UXVFNU9zbkRBYzJ3WnIyTlB5UVFIWWk3bTQxbWNwS3JtUHdCYUtEdW1FbW1TUUlOQURDT2FBTEhqK2p5UVFBRFcwbldkejIzMTNGY0IxMEJJTUh3TkFqeW5ya0ZpenVJMUtHQTJyMEVqTDlJMUdFZ2lYMDNBWEg0dkFnR3dSc1hYUUFDbk9vM2k1a0R5WjZyanFTbEMwREEwb29raGxUaVloTUVnQVJoVGpHMEk0N1BEb2FFN01TNmpDTDBKUk1iWDBJTzRPY2thNmVDQ2tFcWlTOFpleDFGS200bFdHZE9GRkl6V2NoaE1rbVpxUVJnU1hGVmtncnFNTHJVSVFqbHlrVkZ4R0k4UnZKNFh2M2MwblFha0M3VkFJbUIrM0dDR0ljWVhXVXVjY1pmT0Y1RXY5bFlZb0dOUFVVcjZGZWhFTTF0YUJ2UGZFVTdSTmR1amdRNldWc2QwcFEyNVpJU0RTRElzYW5iSENWZjhUY2d2L1UySDdHdTNEQjNKR25vUkdzbkVpd3pjMTVDQS90cStSQXVtZ0wwbmVIVFhmWGdQNy8zLy9xckhiM2Z3VTBaVkNjR3l4cS8zRzd0UnZELzlSczRTWHM4NlEzSGlPVHQ0aXYzNStzUGdaZzMzbTlBL3d2cUdpSnUxcFdlR1pNK1dMaS9MNXlOZUh5UGRsOEtwaDlYdUlSNDNhWE5IY2VqcTRjREZTSFNSWmdjUHU0NWZjUTdTZ0JIajlKM09jVU9VTTRCMXUvYXJ0YkZxYkg2MVZZMHFxKyt3eGcxaDFoUm1GaDRrMUVJc2xoMk1MVEtNVE5admFDSkdzMjh3NXd5OTBkY1oxZEFhZkkwV1k2L1dWK210bjFKL3hWODNSeDRnblIxVlZXZjRxSHlKS3V6bnBlcWhxUGFGbXJhT1FNUGlxNDNJS204K1Y0SEJrUnRzaWMrU1pIMjZiTnlQSVNOMDZZUFFJbEg0dlhuNHZEVTRIZGJOWnUzQmFoQUxPNWJGdjBhenFRYlRxdWp6R1dFVUdXRVFjcURYNXFIVENxQVZFb3lhb2FmeVFxVVQ4RHRLd1FvVUlDaCtDaktKRFZLSkZCSStTVFVLMFJhNCtORzI2RHFHdjNxZTBNK24zeld1VkplTms4d25GM3p1RHc4ZFREWVBiVXdPc28zczJIcXpzWnJSWGpPK2YyaHZzbjFvYTVJdHFlWlJ0cGR0WmYrcHY0YkJ2NmZlcUwrZzZYK0ZzY3I4UXp1VDlVTnJrNTFzTFR1bU4ydXJqbGl0Njd1YnVJSy9xNGJ0bDI3OVloVCsxQm53U3lWVGQwUVBDamluYlVPek9ITUo4V2YyN1k4ZjBGWHI0M2ZxZm1ad2JmQ0pLQms4TUN3MlZ2dEk3ZjZjU1g3a29HR2ZWcDZ3c0R5N1lQZUFCMnM5eUZKd3FKVmkrN2JoVVhTWFl5amIyVk5GVmZSQW5RSUFBQUE9XCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzhfX18gPSBuZXcgVVJMKFwiZGF0YTpmb250L3dvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFFYThBQklBQUFBQWlUd0FBRVpVQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHbG9iaW5ZY1BBWmdQMU5VUVZSV0FGd0lnamdKbnhRUkVBcUJ5VkNCclhFTGd6QUFBVFlDSkFPR1ZBUWdCWVVHQnlBTWhoWWJkSGdWNDVpbHdNWUJnTDIxQ1JoRmZkYXpFbEVFR3djQUN2MU9zdisvSHRBaFE4TFdna3oxRDVrVjFaVmNGYWFrRUJValU5VElpVTByUHlmRWxpR0tvcEtCNllsV09MbFhEZzc2ZWtKc1oyL1UyckFjMzR0U1ZPNlZ3UTg5aDFVNG9zdUxacHVHZHoxVWpEUGI2YWY5VDRlOCtTOGEzdWprQ0kxOWtndi8vdS8zLzg0a0s5bm52bzlGSkFkTUVtMVZGYW9xQWxtV3lMcWp3dnpQSi9QcXFsZTJaZzB5U0d5Q3dSM1BydWZrSXgvT0I0UU9DTXVmT3E5UDBYMkNNdVh0aGxxaW9rbnFETUEyeFltSkNnb0dvaUlvSUJKbE5DMmlJaGpRQnFpSWdZa1JNWE5PNTZLY1RwMmZLNWZmM0Z6OWQzNWYxSHQzNjMrUmoxMy9VODBrbFNKMWxXWnd0ai9tTzJQM2FxVkVibkxZZERxQWNnQ1d1NnVUaXlyWGQvUGROQzdLQjBmS1hTeDYrOFQrNnUyZTZMVHowNW1aUktJVXBlUkRWWTIwdHl0aWxONkdKZE1LRVNjZExLU0xOdE1LU1NSZlZ1bC9jMUZxNjhqT3M4SStiYS83bmc3SW5uTUk5VWVSSmlXU0RBam5DeEJjZ0ZTbGRGR2xOSFJWcGsrYS9pWjFyVDIyNUZVeDF3ajQ5Q01tL1U0citJYVBZcG9HTXhPWC9Tdkx0aXpMM3ZYZVhtMnZ0SjlTQ2tvSEtJQVBRRWRoWUdvQnNCUUNqK1lXY3QySFBoZk01QVRKQUFKdUM1bVE5anRpVmhMNG44dG1rLytvQ1Myb1hZbVNXTGZiNy9Mb0gzT2xxNU9VNXM1SW5BVEhuQVBqUURqK0w2ZlZ0V1RaYlhWbktKTWVaUGNTblpNczBlQjlnUTVIMWE4cWwxU1NZa2wyWGl3cDZJYnRPQU4yMCtzNEE1RTdQYzl4ZWlDRGNKdTlJVGx1NG5SbmdXRVFic3Q0dU14cDcxZmc4NzYxMk0vUERMQmlhZWpkNFN0SVhVaSswcTh4clZzd3BadmljSGxOUVVNUWNFVlVUdm5haGpXdGxnUmpTcDFXTXlvaUFpb3FJTTN5dkh1TVlSSVNkMDkrZldZekl4SXpyb1gvR1c2aVBMeEZUWGlmN3ZDNTFidC80QTdtR0RJQWR1UnFkcjZCYXdBMStYcUpzeVJoY2ZhNThTa0E3MXVxU3d0MGNrZHBkbjV5WjdhdU5MbFhheXE4QWFqNXV0Y3BBaXhGNWFjQWgvdnVNYmNBbUlvaUtWRU9MSTBJdmpVY0RNMWdKL3ByQkhCTHpBREFIUjRRUXZSOU5Udm52YkVzMnVJdHlSU1dac1dXWlhsUlkvOTNoZFZaaTNWWnYyMkttbWl5Q2R0bFUzYkFEdHNKTzJzWDdWdTdibmZzSjN2bzkrSkIvR1pQN1M5N2IvODR3Q3d5TTVuVDNielUzZHpMZmQzZkwvdUtVejNJSTV3VE5SN2pDWjdpS3M5d3ZSZkVZeS8xS20vd051L3hHL0x6Rzc3WkI4L2xOdC9qK3pPOXIveG9ZLytVTHluSXhkL2M4MTk4elovN2EvL28vOFVHS25vcVZpcnVjQS92d0FZeDZCRVNVY0dMMkpDRUxEU2hDME1VaGduOWo2TWorbUk0eG1OSFRNWnNMTVJpbklrTGNSWDVJbGJqRnZ1ZHgvRXkzc2JuK0Y5QWFrWnFkcm5JUTJqNWlhd0FoWW1sYU1VclNRcWxLVXQ1S3NZc1pwWFdCYjFjUEdLbWtWTlpwSXpnbVlEY1E0aHNYL2txY3FCUGxtZmhYcThSbGpOTHFGT3gwbkpHNWxROXByZzNOcXJsRVMydGhKc29PamdwdFlpNHB3b2FJejNuWW9KaXFnTmZ3YWlSMGxzSTh4VWlXa2hEaWdVVVNiaWpDWUJBQWxsNU9JeFd4T3ZXUE9ZQ2o0aVRSbnFCbHhLZktWSzRLd2NoMGRDWVNrSEw2b1RYTnlJeVUrTVlSeHl3U2YyOUFPdWRQQlJLeXh2c1VvZ3loQ2VuWGxrb2lXMHFYQkJwMUE5TlQ2T0FlVGpnRTA2UW9TdWM5YUVyUmNFY1MxS25sbm5FREptekNsRC9vdEtTaXBXT09pamtBVXJJZ1NLMFBnVFlBZGcrcHFaektIa3hKL1UrRy8xVU9POXdrYUErUldLYUwrejRZZzdaMU5CU0xVMU85TjRYalUwaFdxYTRoQW9xRFdjcFoyRlJCN3pzS24vaEdJR3ozRHAxcUpnSmVpcVBrRDcxUDVCeUh3b2k0cjJMNXp4TFBMU0VZQVlLWHowZlg3eFhzQUtsbGQyeXV6M3NybmYzeG13K1cybWZPQWJuMjEyV1FCQ2tzZXZoOWw0c2hjQXo0WW04TnJtMllBSDNkQmo4NFEvL2JmK1ZlTDFrNDJld0FPUlJ1dGEvTXNFYWI1cnh2UWJkaDRHbmMzYjR2TXZFQXJQZHlram90SEh6ZmdEVDdMMEE3UFVTdmZOelVVQ0FONHlRclVNWVd5ZmF3U0xoaVZ0TkJqT3ovaWZ1TUpqTUJQbE54YlFaTUpRSERDOUxiRGRZV2NGL0FOaHVmbWFxbXhzb1l4WGhDZzJETlFLNTBWdU9FNjgzVWJJNk5LQ0RDYlYwaXJwUnJlclNzQTczK3I5ZkE5ajQyY2F2TjU1MldUTGUwSy9jNFNhM0NnWW9oM0JaUEpxU2dBSG81K0lsNjV0ZCt2K1k3dnpLdmdEUUxXQ0JpdUVwQmVLd3owaWI5NWpVaU5IZmJkZ1J0emlWM1FiMTZPSTJZNzRsVDZ5L2dXWmJUYWxtMmhZYnRYUFdONkxYMU55bGN5eXdvMU9BdERkbWV4TlYwVmhMKy9vR1RkaGgwcndhT2d4a3QzZXZXZCtTVFNIVk5OSmpuSjRLbWpJVGJiVEpOcnRNbWV1OGJrTlNiWk9tOU8rRVBzSXlLc3dXYjFWUG14N21SRnZzTk8wS2IreXU3N1hxNGs4ME1SWWtJMWhVMGVsNG83Ymx2NU1PMUJhaUxrUk5oMnpZRWRPbngyNFpIOXZjMmRIZTF0clMzTlRZVUY5WFcxTmRWVmxSYmlvckxTa3VLalFXNU5zVFh6Mjh2Si9QcHRVaytDKy8rUHl6dTlMWkY3ZlB4Nk5CLzlOUFB2Nm8xKzIwVzhYN2IyVWI2NDAwcHNrMVg4ODJtbzBrSnVscWJ6WURSeUJvUi9qZVlOZ1E3TURxM3REbU4wcHJwMWpEd3RQNWNWNllTbmxYYzB3OWFYQVJQTCt5M29oN2c5SlNMaXVBdllyeEJTOUtIZkRaT1F0dTF4NjZqQjQrazd0NVZLMG5iMXJ2aEV6QWlMaHBoTkN4MlZaRmVsMi8zLzdqTElhTlk2d2ExbXhudkVFeHdsWmo3SytuYWRsRUtiWEE3VlRubUp5blZDKzRKaGhVV3NpVnVXc3paNE0xRG91TWFwem1yOU1wZWNpU0NJSG1TZDlLWTVOV1dGMDJEaTNYTDVRMGxDYm42dnE4aTZyclI2VFppSXlycU9qMWFMVHA2L0hTMWprZ2YwN1luNWtXcnYyVmkwZmljQll4RWxhNGlBb3E4aVRwVDN0RGlhWk8xYllNRmIyck1scFVOV0dIeUR6dUVEYjRMTmNpSm85YTN2QXVyS0QxTnFLTmF2T29qU1IvOEFpbUJJc3F2b25vbEhVWEc4c1hheGZyRjFzTDJ3c3EwblgzWi9YaG40UWtwdVNYakxiVGtLa3duTlpVYmZGVTFVck9oMnRiRmJlb3lxMWpySmJ5UjJodXA3V3VlSTUrNkdScGY4bXdUU3JCV1hFVnY1Rm1JNDg4WkxoUHExc1dyQU9JY3Q0cHppS2hrOHpCanF4WW4xZmFIYmE3YVFQUG1pUlpuaWwyY2NjT2VaVEhQTC91U2Z1ZzlET3lXelFXSys5NkkvME5lbG1Xc3lNNUNFSjNLaTU4dW8vaDZVUHYzTFBWTFNsdGxZbWZlY29LNmZJSUVZaU5YZHU3TE42SjVMMlRuaVZua1hobEM0bWFYU0ZWVjl5WjU4bDVKRUJoSjJpWHd6L0RPZWUwL3lBbFQ0aGcrL1plelYyQUxHRTV3Rk5YS25xNDB0cnRwODBHNVJGRDVxYlo2QTJpL2RUMDc2eUg2RkFTZDBQNXBYZERGYWFMM1dqRld1NWZWM1hjT0dFdGwvYm1CVWYzV1NWM3BDeWRBK3Z0NUVCVDJBRThUY0E0UDkyeUZIOWZ4cVdWN0JwUGVXU2p2WkNDcXFDb2NrcG1LMmYzM2pRYjZZR1NpdVhBeENLeE1OdzlYYzAvRnEwbEpwNG5WekF3eSs2cTNoTjl6Z2dSbDd1NkNKT3BYL280bjJiaHFBVTZuV2dmV2sxVDExL1NHQWtaSTN1Z09jMG1DRjF5dCtRWEwyS0VGUjZ1UURidm8vaExVUndQOC9EME14SzVoa285aThZZGhYdk81TmNMcUNZa011Y2pQcEVucFJacTZmN2xWMVVZbVVUZ2QvZ21kZGRJZHFLMGcyY0tMOTZtS3V4eUk1ZkZBMU1lR1U4WHBBbXJ3Ym91QmFqNjVOMmgrd2dhdGJXeWt1L1RQUFFzR0hQTnZpMSt2N1FXZTBIRzJ3VGVQUDBLNFlRdHlzNVlPM0JyT0pkQ3A0RGU5WFdCY1F2c0Y4ZHVNNTMxOUtKd0VNRTNDRXpuQ3hZbGp3eUhHZVNLS1UwQzVIQ0pLWTRCUmZOVnp0b0ZjUWR1aEViTDFZekphZnNyVVFWaDBSdjRlaysyT1hsZVpoNnhtQ1VGSzZ0dXZXRk5HUlhVem5aUURqU0E2SUR0amtFZlVtSk5aTW5oVEFiM1RWeGNmZWVHUWVhaGVYQkdaSllrWU14aUpOOElDZksxeDU3SHV3OFNVUE1jalpXMjRVVVFFQ0RQN3ZnV1pGMnRKR2NUZUlKWTNrWjBuclBVRGZLaUFSbHpoWTZUV09XVWFUU0NnNXloR0VYMkF3TzFodVdKc0M1SmRaQkNoYWs0RXVianlnTUZQUlp4STc3bE03Nm5aeHY2dmhBcUQ1M3UyOERIQWxYWFMvWHljRDJES2tHM0VXa0JZVkt1SVZPb0xhekdqcG9CdVB3UVNVV24rdUY3UmtKRWlBcjRyRDZqL0VibmpndnFlc2xwWk1vV3dPMFMrdFdBWkVNT1hVZTN6S21FdFJLOFBhSnFDS2dhZktJeDZNNXF6WHBWQlNUV1F0T2NjU09sWGVZcmg1cmR3SUFmWjZLMDRLU0FINVZnVndLb2RucnFUU1NJYkxDTXB5WDhNeU9OK0dDTzRnVWoweXBvMTBoVWtHMXZTY2xIeGsvZlN4ZjNMWEJPbllTaElVUk1vVnZGaTNGcG9RbTdySlpjZjFFOTgyVjdHaWFCWEI2Smw4T3hMWFNpaVBncG1VQWpraWVOUUFFa1FNWmVrN2dFM0pvbUZCbnBRY1JBQXRIRk1HdHJjN0Yxekc1Ylpib0xTdlh1Q1FzWXpxNjRjYzJQaXp1RDA4dk1YcXo0Q1JKOWlQQUVoTVF0K1hjR0dORnJSRGRrN281dExheTB6Unk5R2RRem52Rlh2OGJ2VW9nQ1F3bkFJcWpyZGN4RWtEWUFFTmpCZ2VVeFNmQk1JTG9qVVJ4MXY0a0MyQ0N5TmdmbzZDemc4N0pSREljeU9Ta3VDZDdMbTZ5TVhkaVI1TWJHZGtrdE95U0dNZ2g5NUVyTmpIcm8ybklodVd2NGJzUkgzQzF1TS9SRE5QQUkyT1FqeXl2RXJGeTlOZkRlTkJ2aTFwcTRWZGM0eHZhRWRYQnFtOEVkOWxiSUorMUkyejkxZ1E5TEltNzl4WjdCMXovOEYyN0dlOXB1Y3EwT3JZanVmVVFoVHlRQk9Ta1hNK2hHN0ZaNTJqaTJQNENUdlArd1ZpSy9SaCtGYWpZd1JQeTcvYUg1S0ZmODBMSDY1KzhGeWFOS2VnancybE4yVjN6cXlZS1llQ0FqbkNjdUJFUjRSei9MR0ViYko3YzNESXhYTlNvdFo1U2VKQ2RxTE1PbUdBV1c0R2tiS0QxMG9KVzZmdVl5VmNUeWlkWmowVmlrelBiQ1EwUnVBeFg0MXJUc1lQRHZVNWdRR0FUOHdHdkdPUlRndkdSclFmcEg4TXhrVE5zZ2ZZUDQ2T29pcjVra1FiaWxJRlhqRm4rdHhWQlVZNG0vMGFFaWhwU2YyUkliV0lzR256cHhaSVNhU0tWdjdUTkpRSVNPZ1VkeXZtcUNpZzZPNWg4b3V3T3ltUloxUFpjclRUUCtDYjBrNzIxeVVMc25maFA2bTBQekEzMUlLNDAyK3h5Z21NQjNScmRZRm1TT05TZkVvUXZqQmI2alpzZ0p6RVJHeUVKOTNUVnNZQnVyZGNPNHVuL3QwYnFDZi9hdW56WkYvYS93SDRYK0sremtPVmlnSXNjMlh2RjNHcmY1T0x3ZXk2OHJHQ08wQXBEOG40ZmxJSit3WW9TRlh6R2dxNGt6SjhxeE9ZVmxyUkVuMDhsemVjQ29NUlM2V2pZb2YyWG9IQkNFNVFaaHRCQ2ZsTndJYUpmbm5xTjhPYXVkL1RDWDdwbzNCYS84aStCbDZYZkQ1RFBoaDY1N1BHeVpGa1VXbHZCNFI5OUlObmxRbTVYeTluUjc2TmRxTXpTREozaUFEL0FPL3Z1Z0RPck1MNGU4cXN0U3lodVBVNjVwYWhGdWN0V3NaUDhJcmxTcmxMZm5ESWNkRC91bnBib2R0MUJLbVBLZ0cwall2NjEzOUJLdXZ4SjhKMjJyV2JQSU5IN2YveFIvNUQvTXA2c3NJNlNlbFdtRGovNnBSWFlxUzhZQ3U0UnYvTnlaL3VEVTJMYUxlVm1kUEhGS3NyRFdxUlFsQXY3QUpiVkljbTRkcHlDNEN2RWJ1L1FxL3Z2bG5NTWVZdk9iUUJmMnJCRGQ3V002OEJaZ3FKdWFzQ0ZKREFZdWlwRWllUFVROFArZkVOS3R2UjlxRFBLeXFKQ3BmY1ZET1R2alZrV1VmQTJXZ0JZTHNQQlU2N1JtVjNxRVFvNUdlWkhmQXlSQWk1NWxDbkppRUQxK3lvWEIzVENRdTQwdkpKejJBUmpWd2FEV2FRRTFjcGtQQTh2Qk1YRGhpeU5FQmY2Ty9KRW9GM2wwSUtrNEF3QUVnUUNyUGxTZ05NaXpPK2dMNytSTnlpRDZxYlZrY3FIeHFYWHBOVlpVUEhRSW1jRGJsS1FjQ3lUak9zcW9wZnAwOXR2VUE4S1VWbkFuYWZkZGlBZWhqak12S3RsTTFzQjQva0lqb0NwQklxOGNGRUdoYkJNVDRpZXlMNDZqWEdwY2V1MUxrQ2hRaE5vRTB2ZmJCWG9GcTJEYS9TeTNUZGpLMFBpVjl5MnlkZEdVTW95enRFY1JMRDlocVdWKzRLSks2M3NUK1ovWDg5TTNFZ2dqUEp6YTBHN2VNVXdqanZ5T1ZWMGlnekxCT2pzRGxuK0p6b2ZTOWdsUXhONUk2eXJ1cVBCbjFTTi9na3FtRjQwdXBRN2VJN0RxUng1WDhkQllNR08vd3M2V3NQWCtwRFZkUEhKNmRuMmJXODFQUUliM2dQT0JsQU43WjBnd3RraFVSR3MybVJEaE1qenByeG9ObCtSQzdhazJaRXp2dHdxT3oyQzF1R1JDWmNGdXZXNklPZDNSeXJuSHNPZ2tVMFdXU0VqL3A0aGFaQ3JqRXJrb252Z2pnY1ZhUGNKKzhQQ25ZMzMxV0pZRjJXRjl1RjN1WUVKZnp4NTNieWlsY2JIZkt2bW9iM1pYdHJNeWZnZjNJY3Z4Y2dsTW1kc09LMnNmNHFJbjllL1A2OXVqNFBYQ01GNlJkcHdPZ245WFNZWHo1eHRXSDczL2lIN3ZIU1JEdzJyZ0JoZlpmemM2VXlwSWRycEtFQXhnVVRQbXdzbDBrTFd4WGhXNkR0VXZ3c0E4M1JzU1l0NXpncU0yci9abnFKd1huNWlhWEtpa0Rkd1lhcU1WQkVuWWtNMk9aME9WNTJvSkJybG1HeHg1eUFLbSsybTNmUytHREZ0a3ROcTJUM0k4UG1mNnRSNThQczZSK3lnbjE2Q21CRGtpdkl5dzR2UlJoeVRqZ2hkblFjdE9NV3QvN2IyNFNTMXVlZ2R5OTNaUFQvSHBBenNFaXVxUmR3aXlqZmxRRE5XVHZiMW95UzJWT29JVDJ1R2loN3pCVWVSQ0I4bndRcG9keHJOeVpibVFCRXZsZUZPb0p6VVJvLzZvY0NncXBkZUp4UGdNY3dTWVg0ZEU0NTNTTHJEK2wyWnJhT2k3RXA0YlFkQ045cTM3azNKTlNJL3hxQkhhaC9rNGw2bFFPZzJRUVlEdDMwamx5SG1FMWkrZ3RkR2hjRjVuOHE5bFZrZmlMUEtQUElqNjNUKzNsZjhWYUxhNjJuTEg4TWxsQ2RxZHF2TitkSHJUT1Q0cTBFNWdaVFoxZy9QcDk3WnM3cmhkL0czalhIcGlad1kwQ0VSemowTGJCN0gyS3BVWFQzUDN4ZmV0ZlY1RHhZVXI3SjI3dXc5ZjZOSWp2MUp1elA2RHQ5WUxSM1RhSHp6eHpVd1l1MnZKdGFMRHVVSEtzRG4vcHIxelhJaW5sdE1EOGRVVkdXTkJCbFlrYnNveDUzbVV6MUtXUzIrMERFZ1lIVDV3a0hiVWNyOUdUSzNWUXBkQ2Y4TTlNOHg5RHFXaTJDRkVWWFhRTGozOXdxQkpYTktLS2FHUng5TmNjcVRleXBBcXR5clYxWGJWNCtFTldXVldtd0Z0Qmh3ZjcxOThhN211WmRWU1c1WXJxamk5SVozeFlIQ3JHdDFsajZXOVY5ZVkrZ3k2WHBPdHlPSklvajZLMCt4TU5ucno5VUJ2ckYxMlNlZVp1MXArMlFqWjl0ckxpU2tMKzByakdlMVliMFkxL1VTeG5ZVGRYRlIyd0lGV2tsTzljczRxRTUvcFY5OWpSVUJndENLSWt6VGpKd0VOeEgzcllqUWk3ZUFPaFdZQ0ord0VhcGowSmdCd0FYdVpOYldOQjRYTkwwZnNjT0gzR0h6Uyt4aDBZOEVIdEhJSkRVa3ZsR3g1UDlsenFJNnR5WU13b20ydFNsY09Xa1orRG9JZGhkVEdHZElzUXA0cW1TaDd0RXdDUlJEQVlDQXBoRDRWRkF6TmJxSXJnNmNLRVFpc0dQQXNSaDRSUFRRZGVUTVVySTdhMW5lNXZkYWNzeWE2TlFHTERTRU1NL0V1Zk9oMkd0NVZLVW5sN1VLUjlQYjlNcVFKZGpmWjVNK0JVc2tUcFR4N0x2aTdxb2tWRlN3aHVCRCsxQkpQRkNqRTBrQXppd0pCSzlHQ1lJcXNjT1l5WVlvN1FmVEVKWkp0OTdvd21LbTkyZnJjREJ5cnd0d3VZcmlYV2E4blFpYStGNDBsVU50cFVWTzY5UWx4MjUwbjQ0WktDbU9RbTZabXA3UDNLV09Jbndjb3F1RmpiTU9pazYyajFnZGFSYzBZclE3MUtBWFN1cENZeEh0UHRjTlBSeXlZeHBQL0JyMmFEVlVwSk8zNmk3NmgvZzI2WWE2cGJxWnV6b1dVQ3UyTWRyY25ja3dTQnJYV1V0N21waEtVMkRhcGRKZ0NZSGZPL1lYaXErWTh3SG9sZFFOeUVGUTk1V2hCNjQ0d3hDWmRUNExVRWNJN0NWM2QzNFZrQWNVdkxsR1VPNXcxR01uK1Rad2RyUVVic04zZEl2TVVpK2JCRHZwVnN2TVc5MjJPL0FFdlNFaTcwblpsUE9kUTM1ZUhaNkZ1SEVTblh2azlya1FERWEvSi9XUWVCR1FzTVhkakhQYXY5am5sejZoVTlGdVlzN0hrOFVoaTdzUkdpOE96Tm9ZME56K1YxU2t3cE1uQklUUjRsUi9rTEJreStObVdPcDVCWVFVYm9LSnhtdDZ3dzZ1b0Y1eHRWUWpqcWF5eWc1R0tvRCtKVlhoMlJZRVpSOWF0TVZhRm1vc3liRlJTdzBGTEQ1c1dvQlFDZHJZdVVsMzdZdHM4U2lCWjUzSEprK2FFZE9ZVThhSk8rMVhRQjZCbWxxN1JMVFVVTi96K1ZsVWxnc2tKODd3L2lCUDl6aGlzcS9FeVhtUmVKZ3N2blBrNUY2REVZNVljeXl4RGVodm9aMlE2T3ZyZVZObnRrSWNPYUZSWUV1RnBvWWhHNlJhMVdIN0I3bDBrTGk3bFpqSzBJNTNQa3MyRFJ5RU5IVW9MRHlGd2JORWZIbEFBRElBY0xHWXR5TkRBRURVNjBQRkVLMWxmQzd0SmJDTnBMSUJGbm92VnFHQ0RhMFBoVDU2UTZldWRrNlphc04zVFc5dURiRll1d3RDTUVpNlAyY2pTWVBEQzRlc01reXc1MFp4ZlpnbWlaVFhBOGZZNEN4UnJsSmlVeUkreVIwMVN6UkRNb1RoUVZoaVdCL0NXZGhsamZUWHRBVzlHNEpYYXRybGNReCt4a3Q2cTlCbm13UnZSNFk2bitEb0VrVk4xZHFSd2xHdFFuZ3M3WEIzTFVlTEZwaFlvS01GdmhybnUvLzQrTGxuNk94WTJud24vQVduQ3l0amQ4NG8wQzFheTVXRWtzV2JWSEJ0dDNYdUp4cE5VZ3lmeDVTNHFXTE9HbVk2cnZTV3YwTnhxR2VWWUhxTUlGTXBtWGk1UjB4elRtcUhkZzBMODF0MGh2YVYxR3lxbnRtNE1wUEI0KzZ2SHBNVEdmQWhaUWxUN0ZGWE5jRGYxdTNDVWZqSW5ISmRVOFIzZWpSZENUeGZFVDJmaWU3c1BGSWVQM0tUNUFLQ0ROMjlmZGJJKzFCSlpFekJQcExsNW5sWCtVZDhUc3lEL0c2QThXaXkzQ1Z6RXU2cnZ6Nm45MGtYd3FuQ3JhcVFGbG1iOEV6NE1QZlJuWHhYZ1lIT1lWZVhyazZlL0dQZjJubWRrQkpUL0hlMjNLVmlUdVVWYzJDV1lSUitYVFhYdkdVMmU4VTlCQWErc0JFQUNvZEpGZXVBWFFLSDlPZWpMeitJcVFHRGJHZER5UlRxMGZkRnVDL1R3Nis3YWYvYVgrdjJSZExQaDJGem4vYmgyV3p2L3o1WFlaNUxiZFVkbk91N0ZGcGxIR0FucFNRbFZ3ZU5leDNNNzYzYlhNa3RwR1dwUmZmQVdqL2swYlhoYkNRZENxU0E3TEhlR05Jbkx4VExzM3M0S3N1c29OSEZBckRvMFVraStxMWhxMkxSTG1pYkk5WXNURmx1SDlEOTFXRXY3M1g3UXVqaFZXSUludjQzS3pZamJDcFpWV2tvb2dsZ05tNWdRd3RaUkcrQWJCWEt1QXY4MzFIUW1xZkRvU0RYdForM3BnWjZUb3RLc0hSZ2VTcjBteTBGeEJJV0o4ZDI0V1FYVFR4cFBDSXB2SnZQUUgvbSt1L0dRa3ZjNnZNbjR1NWFTeHRVUXVNTHQxcFlXY1NCZGQxdzJDVFlGZStRNGFGMnNFWmJnQTk5UzR1bGhLZjY1aUVLN0hKd2tOcDAraXY0dkFRcHR2WnhXZEc2b1R3emNjZTFwNVpZenAyWTdGQWtETy9Wdmd2WXlRR1lnVlU1dXVtSUFweVg5SWZjLzV2L3JCTWswU09Na1VxbUY5QkFqUDdrV2pvRk53VWloOWh1OVRLamllOVl0YWZGRmVFNUdVd0p6SUJNRFV1OXBxeU4xOVpYVXdwbnFJSjdSSkZtR1YyaFhQUzJnRFVzNUJVdnRsZVI3YVl2OUhWL0hWclo4YmNpNTFGZEt2S0UrMnR0eE5qYmpQVDJSemxUNVY3aDB4NFM2S3g0R0Jzc2ltTm40ZWxoYnBGcVlDdW1CWnRTTElnZDFHRkRaNlFZMXFhdFAyMXQ0SXIvQWxIalJyZnlia09Sd0srMHhiQlhrejlicjYwTTlMVjRFOFVBVnJ6ZmwrS1RYRnBLa2c3YThORnl3aFFob01NdjJzLzdCSXhtcm16YUhDL3piL2c4djNqUXlIKzBldXZZNVdFQ05GQ1ZJWWhoQ2NxUlFJRnY1dmgrNjFRdS9oRjF0Nkw1RmljVE4rQ1hoRTU4Z1ZNOCtVRGVrUnpiSUpZUitxS1pISXpyU1ZrNzVXZlYxL2NBMmlZcXZ4Y1RFM0FLRjlKOXhWSDdZR2lMZC9WVVRvOWNQaGdKQURpQkpha1YxL0N5ZGcvNGp3ZmM0Vldmc0Mzd0JUajFqUDJoYnJCQWE4WlMzeEhoS1ZESzE4TlVCMjNTcWhKM09KeVdFTUhXa0J0ZU5nblNoUkQzZElZVThoNEQ3eEJ2NXh6YmE0Vkx1dzUyVERFbEZyMmlPS2xsU3Jpb25NWi9sUFUreUliRm8vU09CREUwN0JKNytQai85VUs2M3RjNmVuWG9jbC9XTHB0YURUUlZub21NZGJibldIdE4vbDQ0cExSUjFnMXQ1OWtOOG9ZV2JLZnZNN3JhMTZERm45U0hVUTJqYkZVNVJTMFpHWXQxSWpCWnN6WVZyQ3lRMXJVTzNtRFhObDRoeGZ1cWZCVDRiU1VwWmFTZzNJSU9TMVVtOHNVbGs4bWF5S01HcVNHbmxWQkFIL1ZIb2V4NlBYSHFoWGYzRmVlV0g3YjdXd3B5bWRFSlRqaTdmUFY2dGtBSWRiek85SFMrRkMwR1ZJbFYzeEtvWDRnVHBnQmNueFhYM2ZmT3VzeERkS3JJZWU4VE9aWVppTXpjMGh4bWFjNXVMNGQvQVBveHdYQjFiOWQyODRyL2lmUjA2ZWdVYmk3TktwYTlTZFBIMTdxcGdxcEtaTlMwZTIwaC8wNmo5eXJ0UW1paElTMHBMTzhTV2h4UmNOOFYrbEIzcldOTG9KelJWdVR0UHAxUmJXZXRCWFFwK2U2SlJmR0JiMVlzbzVLQ3pIdmp3a2IyZTlaNjE1MjBwRjJHbHQxcXd3WVBmd1NzODZzSGNFdmsxaTNOL0E2V1ZnWDhGUGM0QlU4aDhUdzZCeFhhODVjVFlVc0hjczkvZjNVZHlWVjZWZ0ptMGxBNlBmbk5HajdDc29NYWdGaGthMVdSa2JsK2x1N0tveUplV2J4NGtoN0xFSEtGNENNOUg5dlRUb2RtTHJzUGRSNktDaWpsd1Y1OTF2S1kyK2ZqT21vZVJBOVF2ZkVtQkR6dlNVMHlTcHFkb1JlYzZTdlF3N3JjVllocGFkZDQzaVFUbVllcnhwZUFBMDF4eTVUNXNOU0xnQzlnRGJwOFQwbDBhTFZQMithbDl4Ujh5L0g2bFZoNTgwVmI1MzVHMklOdXlOMGZQL0dPRWwwSUpYS3N5OGw5MG5rdW9LcENYU3E1MjZZbE9GMmpaNk1ibjc1L0x3QkhUUHp5NDdZRHdtTXE4ampxbXRCMmVrN0hRMDNva3hramtXTFV4L2tLbnVJWmdUTlF0U0kvUnN0REZ6OTQvKzFhN2FDWTEvZXQrQjNmZ1Yra1hVUGpMUFE3UFRqdlFWWCtJeitpRGxsd2lySDdtb2s0RUdnVW1PRDhxSkZRZXJsZ2czcWlYbHJoMDBDaGN1b3c3UlpDZ0JRKzBtUHVVdXJKandZYXFyRVJldm9ramhGb251ZVRscHhlVlQ3L1RJTnVaNUg0WDViYzIrY29vUFNwQzNaekFIZFJod0dYZjBWK1RJdEhhWGpmbXI2RjhuVnA0RE5IaDNrQnlXRXREdklLT3pNb0V3MnAzbSt5VmppS1M5bEtWM2k1QzNSY2phVk1iTWsvZk1ZMzg0RHQ5eW9qeE8xcU5SejZOT1ZhSzQzQkRVcjV1QXN4Lzh6eTlvTEZ0SGpiL2hWUmhSZHdpUXJMQlJXWHkvemJMRFdZcklDWEYrNUJDTmNnZThVOUMzeWxpZnZGSlJkR2xQZVhrVytrTFF5MlhCSERTMGZ2VGgxWGNmcEU5RG00TE5nY0psV3lKcGlqUkxRZmlubCsyNjRiQ2ljUG81TXM5bWgwSGZaYkNYUGJEUXN4Y25KNkNGVGFnd1BMUXl0UVRKZVl4b0ZKWUpUaUI1akdNd2xzaFlSWnVoZmJxalR0ak8zc0NYOUFpM0UrdUd4ZXoxd2dlY3VJVnorK3MxR1lDTHllTWdXbmxpN09rSVlkOXZJOWErTGcvdDgrd3pJb3V4WSs4alFYdmNzd2l1RzhEdzhEL09WVmJzekpxM3BmZ3FMTjQydko0MW8rRzhlOHNYVm40RWVTWUxlZnpRYTlHKy9lUVg2bVBmc2Flb3duTmVLM1M2Tm5EUFhCWG4zMjhwalpGSHB2RVg3SWxENVNtSnI4YWhkRGhnMUxSU0NyR1RyTW83WHRKV1h2bGY1VkV2SW9rcjZHb3Y4M20yWExMdDRuRlhUSmQ5c21uRlZ0L29QRGhMMnBRSVd4T3NuZXk5WWxqK3ozcHJIaDhQQVQyMWN2ZXlpOXp6djRXbDlzcmFJcXdrYXFJTStqS3VqdEg5NzFPRzJ0YThSaStOdmgrVzRObEtSMWhXVnBCWmJ4VHdCY0lBK2MrMFQ5UkZXNkVWS0pqM0lBWnVBdStPUFoxbU9sTWN1R3hFVWRmOEhmYVZZckQrelNxWnY0Y3JubnN1d2VtdnF6dGJsaUt2akdGcGdjSU5YMDVsTi8wZHBZZ0psNHFJZ1RGTlpQNTZJL1J2cnZ3dUZyNjZKbHkwS1V6N3R3S1drTUZ2S09DRWxQaHNaeDEwMGFKdDJSYkNDM2lvWkcwWEtMbUoxUTlIcGFXRDdxWTVoS3lEeVBlQjg3WWgzKzJUMmM2MWV1UWFTc1ArZkZQTkErZmlOTHNWNEt2akVpTDRoUW51ZTJNc0lLanJMQnNxd2d3ejdwcHEweXkyd29VN1A1KzBUQU90OUljMWZPYUwvTjVvRnRwcmxFcmNPbUtRODZLeDVlVkFJY1ZhOTBLeldsaHhPc1JUZmF2QnpFanA2NWJrQXI1NVI2aWE1ZDcvL0hma3QyeWRZenRWa1hlcHdrdWwzMGNKUTBZNjdxYW9KWWFhOS9mZytNT1hsanh6U3d4NTR3UzlNZExTUnBWb1RGTTZMQmM0Snp6RXl4SFcveFlJUGR0dEpINVJ2M3ZRcWU1bitXcUw0RDBsMy8vaGdiY21YeHgrdVJqSDB4Z3Azd1AvN3QrQk5HMUM5NS80cmNFWkxZc2VKTjFmVWtvY09vMnZ1Y0NoZWN1WFkrNmRWVWJvbG0xYmErSWhKYVljVVlvbFZwdzhTRGZPZWRIS0wyOW8rV1lSNlFndnVkcUx0aDZEbnZpV0IvakRib1ZSdW4rVTQ5OW9taERQNndMM1VLQ09zemJ6Qm1MYzFNVmRYbkR6NUpQSXd3T0xjVG9VRGdmbnpVdEhQYmZxTERMc1lEQUZFWEVOMVpwOEVLOEVUd2FVeDBRQjU5NkhTMGl4NmVNbHVkNisrRkczOE5jNE52aU9FcVZjME1HcHptMktuZjNhVm0xbFhVMnFEdVozeUt0UzlzM3BmOHhwTTQrdzlZRUQvSEJiSXBrcFFNVndBQWUzL2xHOEozcnIrTmRBMlNUVnFuR1liNndSUlZQTHpmSTlnUVZnZ3BBSGNpWHdRSHlVUFAyTWx1VENtRWRqRFBlYWNEd2JEU1IybDR1SXNrNzZocThHV2poZ2haVGZsRWdTaW9OaWJ3OEUxc0l0UjM0ZnZUM2JSbXo0azg1WmRoazR1Z0VnWGNrZjhDR3hXUEQvZ2p5aFA4a1pGZlE5VHB4SDF6WmJ1L3RySTFvSytWVU5WUmJJaHc3RzNiWHNrcHBPazFDSTl4MyszL3RYL2hvMU5kaytZZDJnTldrRm11eFM0M1c5bFpxWG9ra1dCbkpNY0NEclQ0czRzd1pFaDlBQWVXRTI3ekU1ZURTWHozNkxhS2g3TVI0WmlrNUh2TGRaN210Tys0MU14RWo5RjREd2w5YlQ2YmhpRUkvUU4xNUc2ZkFtcEF1TjNxdWJtTnpURHIyMzJ0L2hRaGRQVjhpcnJpM1FoQjJkb2ZxSWxpUndmM3dpM3V5LzlzeklrTHQrdmhwWnNidEZqZUVGYzRLQTI1MFA3OGo4OE9PT3NxYnpIc1Q4N2ZLdXFDWDJlR2FsdFpNa2NRWTF1YzFsU0hCTk1la0NwcmZFZ21UdngvTFNwS1VCUGQ2YnBlcS9EcmpWTkg5RHdsK0xmaWd3c0RMeUQyb1MzK2R5dkU3SmRsVjB6Q1psQU8rZllsT25CN1pqN3p3NlZ3bVpqRmhlMlg5M21RRDVOeXRIbjNoQUI1UCs0bDlpaWp5MGpnWVFxS3grUzhWVjRuNHp0dlNjQzRoeVVOam4wNkpKZXN4WWRNeGtPVFkvR0s2SURJZlpTQVZvMWh3OXlZbmNRVktTMHBGQlpNNVFROENJaDNpR2tuOVlFZnhJMFdOTndaS0R1V3l3eGtoS2NVc0REWmc1OTF4by9tdVJ0L253bFhqekZEMU1VNUI3cmF3cllXL1BkSlNlRlFGT1Y0ZVdVa1ljcDFVYktuWW5VdEx3QktUZXdqSlBWb2xpcGJjS3RaMXM0NTRmNk5YVVV3Sm9SU3lEck1zK0oxSG04WHptODQyR1o1dXE4ZS9UZnl4K3ZqT3pvdXhwdWhtaklHRDUvUDJpYmpFajY2UXBMamNZa1owbEJGbElCV2hXSENQQmtjSnIvOEFXY0gzdzVpUXVQcklBWWhqeVNOVnBaZHZNREdjeXcrbEI2ZVVzRkh0WmtVem1yUkRnRWFNQkx6V0xYYlZ6VVJwbFRWK2l0U0gremxRejBoMUJETUxWKzFZemNpVEdJVGVFckl5R0lRTnN6K1RUS05RRWlpUmN2OUs1MzVBd3JRd0xSUTdlVC9rbnE3VVg1WS9JOU1kN3R0SWZaRzYyTll3eGM0c1BhTEZjTVNwdTZMWnRyWi92OGkrdjhQNmJyL3g0MlJyR0tqeXpja3pYNHg3bTFhbWxIdE1CTXQrNlVzS3V3VUgwV2MxRTcwVEE2UkU2eVR3ZzkzclBPUkYzbzlxMEdpYWZLNXBaUGJoNHZsTEU3QkJvVHBYNE81UFVMRkZrL0JJbVB0ZWZvM1gza3RLeE43b09vKzl4MElhWW82RnU3YXdKcVpkOGZmWUYxM3pDMlFuWFQ0TVZHVGw1dWdLQ2l5a0VrV2NGeU9TalZESDMvd3h0dDg0cTRSTVEwNW1mdjYrNHB3NFpCSExJNDl4eExaTU1rVHk5NHozb2w5WTltUGNDK1VtRTh5VXZnTXFORXMwR09LdW14OXdFMGdIUnpCVWJMdWQ0dDI0Vm90OFlBd3NwWE41M09nRWVnSkRRQk5NNGw4bkMwbDc4ay8vL2JrdW9ZR1JKQk8yakJ5a1RZR2V3OGJZOW5xK2k0YW00TTdaeFBUT2IwYWtJR1ZvcVl0MC9qZCtIamZycmxaclJzT0pjU2sreVU4RTNIL002TGdFVU1EaC84Ykw0MjIveTBsdm5ldnI0SlV1bHIwUGxDa0lPVktLMXJJdXFPWnZZTXZJcGt3dE5BVjcxbFpvSGE2ZHRaaDVFMnBYci9USDMvcmdXd2Rvd1VlY2NYZTlxeDgydUlPRDl3WVhvVWVzSjdKVk5UUmhScU9JTmFqRFFFYVdiMzNRSDQzL1FZckFVM25rSm9rSmRQQkZiUTc2TW96Y1RQZmUvRG40eXdmdnJkejVZQjBDbytpT1VWbkFMMENaQVNsK1hTRDVZbS9uRHI5THU4aS9rS2kvVUs1K1d0YWRVN21JYlk4L214aXp5UElLOFU2eXZscTJrd0hUd3NmbWZoV09INzZUbDNHdWNWZi8vY3J3WU5OOElydjdlTG8xZlZ1QmxTM1hzdDVoWVNuQU5KTVlYa2ZCS0VJMUdYTHRJSk4rZlE4THRNZkFCTEZwUjV6MXNZOGhNellVdGJ3OEtDWnhRS3c4UEdvazM1bGxlQzkycHFUelV2MVp3bmxyQ3dtMEN4SXZTT1ovU3hTSHNIV1VaWVFiZzRJbDUxQVRhT0hKQkFPaXlDNEhMNDdOb0FVMkpJOEZmUmx0eWlRSGZnRlVYZzhNL2hKWWwreUpVZTd1cFQ3djFWNWZDL2gwbkh6UGt2cmNVcjdiM1cyZGpMcG5BNSsyd3VPNHhTUzVOTExjZXpCcGNtaXUweWZHMHRlRUprR2xpd1ErUzNqdGt4cEVWQzlFRExSSjcweVUwWDdKdWpBeGVqTUYxZllodEFXMkQxeFk0QkxLMFJINENYZzkxQlNabjlLb2hqMTVKRzVZREFCS0gxTEFSNHRvRUtGK3BreDZyVk9GT2ljKzFObi9UWkpQVXNtc2VpWm1uRGlHYkJMNWZiSDg4b2YrblZpMWRramQwUUNmV0QwT2NnVWRHTE9jazRJUjB1dEYwWXcyL1Z4L3ZFTWlMWjhlRFc3cUdnd01ZczlxWm82QVY4ZFd2ZHdQNDlDY3g1eUNmK1B5UzUrQm5jZzNnK21EdmV1MXladms4RDZOWEdoMTNFcnhDM1dNL3FHckIvbHA2YjZvWVJBTU5DUXU1ZmtJWWVkMCtUZEVEelh1cTJPclBpb3dNSTFVYUxWa0pmbUQ2a2FNdFVLYjBIS2xIV05iKzdrdW4wQUhIcTA1NEVzem9vUHUwZEYrQmUxTUxEMGYrekNKaFFseEdBand3QjcveTN2UXUwaUhLZ05TZzdSVUgwWk00cU1tL2kvdzJsRmVnRm5sNEJ5aUpzSmJPV1IxOHlyaU51aVBhaUYxclpKRmpyZ1dCTXRzVmoyRGJLKzRHOFJyZDRlcDBDQytTeDc5TzVHQjdLSFV3UTNwS3lydGlsOWVJMVU1VHdLTlpEM3M3a253ckVQMEFXYkI0TFdqZEFJZG5oaWtJYTNVTlJub1pqVXBkNm1uWkE5QSt0dUZCWmV1UStPNVJXUkY3UXJrUUdJWmYxTzlJSVh3bUVmOUZBanc2T2tUbVBpOWdPalpmRVVESWlzUFJneTJ5ZTVNWlBxY0Zjem1Ed3dZam9UNk1NOS9ERzJCSFFNMzlETWtsYUVMZ3ZaV1I0T1dxN24xOStUK0pXdG5TZHZJU2ErbVRtWEgvMDFpWW9wVEVudHBJbmVCdmRBU04vMnVwZldmSTkxaDRLbzN4MDkreXRzUlcrNjhPZm1WaDhTUm9SNU9NSFlMRC9wZXlFanhIMUNvZUJ2QTc5NDlSNDZxUnFOL3J4M2JFNmZKR1JJbmJDMlJZMmRqZCtiMWNvTS9YdlJFOCswSjd6eHo3ZjdiT2hwdFpEUWkycG5lUCsxM1JwOGs1cm9OeVlOaHFmNFIxMk5pYXFsdWFVVXVnbzZUQmVuZjl1Y1JWelJIK2p1WFJmWDBHbGhKOUlPclhGc2ZibmFvSUlOVTVkd1VrWURNTG1VdnRTeDdlWld6NUlReGVXazdXOTIwczN0QUZyb3JyV2wwenpBVWZicnFoNkRuK2h0U1ViQVdXY1JBZDhQaFdkdnQ0L0UrRGdyZmxSbjFEQks4ZGpRanlPeHRrSm5XYnU5WmovNmRydkxFb2ZUQjF1VHNiQTlqRnBPOExGZ2ZSQXVRc3dYbFFWc2RsZW5YbHdySjcwTVpjcTZnSXVPa21NMURheDk5YTMrT0lic3BMS0dzcmdxYVo0M241R1czaG9uNmV1WTNZVURLUFdFZVpMd2QyZ3NCUDg3djZxSDB2VEM4c0FFR2pGOVpPSXY2VUdzWXJUcllMNUdMOVUzTGVlRWF5SjVWejR6TmVmVjZ5WmovL25tU05XNlJaNkh3dm5Yb3VYWC9UdStsd2RUQlhYVlNLMm5hTHhHL2ViTkxSZTlFdWh2VU5ycHRWNCszNEUyVitVTmxhdDRNTU9QWlpSNWVnUUNQVXIwdEhmaGg1SWhuaU9OUStpRDdBNEszMllxc3F5bWUyYU1PZ0pRdmlxditvYTU1SG12OExKL1dXbk5kdzJKcE1VV3VKTDM3WDZiMzlYQTdMdlV4RVVQS3NOenpRRDk2SUFGTG52MDdVZlNob2ZSQklKTmNDVStmc3dsajk4ZXE1am1vN2p4d1Q4c0thb2tLL1lMUEhXS1JzK1lqODJpc09vekZPY1lUREhQRFR5cVFlK2VjdmtlTThTaHlyNnY2dEhYZzRpKzlnWDkzazIvdDJETy82VGlmR2t1Z3JzV0czcnNiblIyODNjWGdibkF0eWtKVklFUWRxNHRpNkZWVTZiZEllb0Y1dEFES1RtREhpZ2Z4MGNqZWZtVFliN0RMcjdma0F5YWM4WllHNEZpNEpGOFVnVE42L0VkRXhXTFJyVFJiZkYvWHcxTzdYOGo2ZTAra2F2YVhscXFPZmQyQTVhemtnY3dkdDdmT1RlZ08rU2NoTjZUNFhzRkJrNnMwaXUzTzFRRjhKUmYzZEpYRXFtUVkwc1d0bUtlTDNMOWVnanpNbE1BR0ZqZUhTZmRRWGIzOXlaMUR4QlBRUHQzYmYzN1Z2R3Z1KzI3ajB6YVRlckRHZDJ3SDczNDl6eExoQkU3dWZ2NDBRTWhkeWZIYTRhTzJrRzRCUFhMZys3dURmemlvSGs2QzErU3hKNHRCVUpEYXRwN0owdTFPR3UwajlzN2lvM3B4U1ZiaUpxdE5idnd2aUxPMUZhMVhqNXJGZlU4MHdwTjhraUxGOGQ2K1pBT3J2ejAyanlTeGR5K3dzajJUOTUvWFFRNVhGLzg4blVlNnExM2VNbjVIZ2ZyelEzQVZwTm9ZVGk0a1VPVVZFOGxRSTZyaUNreTlGV2llL1lRb2QvWFZSekphbmJSUzNIQk9jMnd2RkJ5dU1SRFBxeWI3YXMveVVJeWhXWXNaT3dqd0tNVERGUEY3eExXUWVUaUw4MVhYbVdsQkdUN0cvcHYvcTU1N0VzVys0aUpDc1p5Nk1YQSs3SHYyVzUrZVZBalFxM3Z3QXI4NmVHL3dQV2k1L09HYVk2UTBJTW9RdWhXZGpkTHpqaWk2bXVNenlGeGI0dWVZQ2xmY0dEbURVTzhXVGV2THVON2FlWmt6YmpqdU13cmlxdjRIRnlHOTFzbEdGeGJjc1VIaW9nR0ZLWnJqbEx2Z2pYbC8yNktmc2ROb3ZkK0Y3ZisrcWtiODlDR3VIajVnR1ZlQVpNWm9XVkYxVGlyNVBzY0U4NEIxM0d0bHArc2FwcUk4QS96VHFtRExWZ0plTzBBTE9vTDhsdTN5ZS9kZEkwZXZqZjZaa1owdTNERDl2eUVobE90Sld3cGVqNWRxeHBzNE9OYno3bktmYS9hTzhjbnJBd1p6eVlQZWNieDlQRDhNSHRuajFZWnFkZGRMYlh3MkdlSG10NHpXNGVCODUxYlh0aVA5MDFDb2RIRVRFTWEzUWFmd3B3UHBiVVp4RTRmdURmNVo0d2NSK1E1ZHMzUnZEVVp0dUJrTXRORTNyZzU3VnI2SHM4UEZqSjBiampoWXduMGNEdGhCbThHUUloOWJXenM3Vzl0MVBucEprN0cvVkord2NLd2pJTzV4UHNMSmFkUEdmUVBHSTRRazVJWmszNnQrZFZmZWJ5NDIzOXNVYWxueCt2aVovNHc3emVJYkdQbzBjUXRDUEpHN0daVVJRVXFtRXcwdjREUFEwNmRsSFBWTHJ4R2lVWjFqeUdHMTVEVVY5U3RicnlpNXYxRnNEdkg5ckROMzNBczE4bE5xSUJLZkQ0eHd1L2pHMUFRdHZZZ1IrVm45MDB4c2N3OFUxWG9wSWlpcXlHU2pmdE1XNGtxTit2dWc5VmIvNVZ2N1pwMitQajFab3p5eHIzWXQwc2ZyVmVscC8xaGYyOVFhdk1tWnJHNmpTbFB3aFZHc29NelNVRlVuOFU1LzB5UHFVNW5mOG05TEpwdTlldGxlUTRmaTNyNHRqNVBxenlCNVB1WGRqSG9HOFFudEh4alZWeGM4K25jNlhoMU1Id1E2M0VwN1NQOTB2Q1gvOTY0ZVJ6dTdCNjhvR1E3L3Z0NXl5aFB6RTBWb3o0R0lDWjg2YjgxN0swN1VBbS9SNzUySVF6SGV2QmFPdkx4aXNIanJlN3FGdGgvQ3krZmNsM252dmErbzZaRThDOHFyVDd6MzYyakNMbGZoVTM0ajkxSEFsMysrRlpYa25SVjlkUHlIdVhFYVZ1R2RWWFBoSEhYdHlyRmpVdG5DWTFkRTd0cmxDOUhLTnV5TjJmSkFYWGE4WjkrT3U5RGN3M29UZFVEY1dQbGZZcE83NGhQcS9HTzBTVEo5c2dkWEF0UHVaL2Z6UWdkNFJmVnpHdmwwMFZjNzNyczBIc3Vvb0ZMc2I4RUNJeDFDbndkSEorcmRpcEw3QXJVM1BQdnFGczRuTGEvajJGNVUzb21BTDRIeXpsQ1JTVWxIc2I3M1dZV2VPdlhqbFhUY2luaXBlbUszV3MvVkVZVEM3ZFpPRmpFZzVmZEkvMkdEZ1hraFNtandGNFpFYUlEWEJIeW1jYUtJTngrZU9kazhtWUdKc2ZNb2pxMUNnZDRTQlA2aHNVU3RSNUZEU1pDRWt5NmtTRUpZT2xLRDIwYUJQRTVCNEJUREdnN0ZwWTBhNFp4b1Q2cS9NQTB2Zmt4K3NDTjdDMVdtVDJKS1JHTEZEbDVaeVExbDVPdkU4YVlUQ3QzV1RMMTg2M2E5QVc1alJKUTFGaUxjb003QkI1aUMrQnpud3VTK0lOME5qNzdhaGVVa0ROTWJWbjJJbjlHZERZS0NsSG1oaFVQRUc2M1NFbGdIZy9KUXpUM3duWS80elgzWkJTWGN5ZHBvd2RLOFJKQ3pUUkE3Z0JZYnAzYldSOEJwbktqeTBOSWtxTC9QcW1ld0NRVzU0L0JrWTRyeE1lUFZEN3drSTBwOWphT3FQY3VEUmllL3FsS3RtNFc4Q3BHYkpXc0Fsb2tZMk9uOXkyRDY0THVndnpVTnNKalVzTFFmeVNReWMwM3NCSmp0blplbFM0UUVwbGY4M3RYam5RZ042anZ0em84NkZmMlgySWM0bjJwZjlrOWpqZ3Y5K3pCK3N0NmxmV1dQblcrdk94bWJNMXFNQlNWOHMva0t4Q1dWdWtpZHBVd1EyeGp2S1g1ODhCUlNZYjFIVXVTak9nKzVSdnZ0d3pYSEpGMXEzQWxTMS91Q0MrenE5d0xvVmQ4UFMwaytTUXV3dXVPaTdQRVNBampkamdmVGhmRUIrN0ovaWlxUk5xYm9uWGNOMGkyRUZqYkJlbzlXNWZyVFJMcG1oTCtmUXpOcFFiQWdUbkNRUUtSM0s5TDA1dzU5RWdwaTRKMkgrWkR1NXlzTDlycnBwdXRCQ1lUU2Y5NE1CQlptVGNZME5FcW5DVXRabyszem80WmVXZkt3bzhvWWJMYUFQdVk1a2ZOK2N1YU5BaDRFN2JtYlZuTnh2Q2JrWHVIQ25xYmIvRmJqQlJvSFUvQ29zTWt2SmNaRWxxZUVteng3RXpTWnhlbTFWWFZRT1pEOFJ6Qnl1OS95ektPM1d2Z0hhT051WVB5S0xzanMveUN6b2gyZkdvMlF1dkdoUnVGN2gvZ1cybnRFTGh2WCtkdkxMeWMzUlpQWHZxYXV4YWV2eGpUZ2d6MDZOOHJaSUJtcjFHNG5JZGpRMGNjcHpmdnIyZ29uTDZvYUhhMU42THBOWmFYcDIzWmtuQ1drRit6RGRESHY5djMyLzJGbU5pUFo1WXdEUHFsZXZiZVgvcVpXTXU1WVM0bFJ4V3E2UkxXRkt4RnN0RjF3TzNiU0JSbjErMnRxZUJPVWp4KzJqdTVqdlExZkNadng0RFBIdStZbStma3ZrNHozajlWalZkbjAzcUQ1aU52OC83R2pxZUMyVGtMNGs3S3YyRDJJUFdJS3dxY1VaMmNmV3N4Mm1ZR0xid21wUHlmZUx3S0VEak5IdjFGN01vWUNBbWtaSjQ1S1lob1NrbU1ORFRRNzhDdGRIWWtOb1hobjdOemUvNEdkYzVLVEhPV2xjOUd1K2xhK1B2bWVla0poOThkVDh4S0xHcHdSODZoc2dxRVo3bmI1blQ0RVIwR3lsbXVzaDAzcG91dzhXVVEyMWhQWDNsbmRwOTBSMHlBSHFhUFBhejZ6ZDdKQ2JBSEIxdjdaRXQ5Y1BGc1p6eE5GRjI5aU94Q2VxNlVTaUtHQ0pOYUpCOE0wK3Z2dVJKYVNkK0p6MjByRzF2ZjlMcmlFWmpqS2tNUFlMRVNvdHIyZ0J1WWZ2ZWp1WUtuOElkcjF6NG5CUWx5ZnU5eHBneVVFQUVocWozMEpHV1FEdjllVUtlWlk2TDR3QUNBTFJGT1l4MUc3dExwa1pOK20zOWxoQ3dNR2tHKzRrYWJmMktLRkpFWUptQnVnd1ExUjY3VE5vakdzUlBhb0V1U0tMSmhhbmdITDY2S3l2VEJxMWtDdFpJV3FZaVgzMkpqUFhieWJsRUZrWlJvemwvRlIyOGlhMklqOFdYUlR4YitJOXNZV1F5N01jcnVaUkhCZ1NVQWc4b2tNYjJKMlZyWnZZdHlQd2pQR3lxY1FPVUMyYU1MODE3UmJvd29LcHkyUXoxaEJBbzAvVDFJMFdQenZlTXVUR0lCcm9pL1NMYUtXT3hvWktEbWdxcmlXSGh0ejc5UGd0NDdORFRDRFgya2h4T1ZmUnIwamsrVmhtWnhob2lpekdva1J3Vys1YTRuaEpralMrRWF5L09UREFaWVlMN2tIelArZTlQcTJDZUFBK0FDZ2ZzNUZLbWRZZVpZVEp3RHlpMUdOSG9EZUxCUzFNMnpKa05kUXpiQUZVMlhNQVl3UEJwTk9nUG9xbjRDZmhSYnlPK0N6aVA5VUpycExCaytQdCtoVVg1NldpLy9Sc3dKMFg4RmdhSys0U3JjV2pKZkhXTDgwTHgvTHhlU2hkaVZ2VlZBcCtnVGtBSDA2Tkh2dUtLQTlIdUFBRk5VVmxSSElqVzJKZnJYaENTZXRJVEVRZ3BtSWFUd2c5c1doQzBNRzNJNy9YSkNkcGJZZVFMelVkVGdQUUZTRGM5cDd0ajNIVGJlbDBGM3lHZ1l0aXN0UTVtaEtJS1FTcmNCV20rMEQrRjgyd3pTVUJ5Q3FZYlJwNDZnT0hoWEs5ZHA5Y0ppRStRWTJaK3ptYW5sd0toWW5GelBSdU8xRitxZGc0T3pIaEtLeTA3ZE9mZTFFeURFbXBBQ2Q3dWpZajhQMnhIY1VlYVFnMzJwYXFrV0hSVlVLTVZmWGhLRi9jeWVSM2xVb2xkZENyaXE1NEZrVkZyTmlKeHBEazFRY2dWakFmWCtkb2dRaFpaS0FrbXZUd2JERTZFWmxRRXJSQXJsUU5FT0E2WS9MRnhvblNWRU0ydmxIeHNDam15WkpuTk9ON3JDbXRNdjlCSU1nZ1owSkR0UlhsSXdNTDB2QnF6ZWxIRUdTcG9UUWdPSTNFVzVRR1NlMDlnVTJ0Vml3cXBWK1pkSG8wL3ZEa0grd25FdzVDYVAyUnBEZ01yWEdXVHAwcEpMb0M4TnZHRk9ZYjlGN3M5a3RSU0U3RCt6dXU2WGRRTk4vdk9xRm5ORDY5R2xLUXZUNXRjdFUrclhSeUJIMWo1Vzd2akROeE43NHNkSDMxTmJHT3FJUDVaM3BrUzVyalNUaTNMZzNtUTRLdForaG13aXlRTTN2VU5aOVVkZGdTV3dzbTlCbFl3c3VUUW5ueHNrRFhmWklIREZ3YnRpUmN4MW1KQnVDSUpTNzNjSTFGanFKZFA4RHhjOHJTZ2tCNnhyQ3BreVlNRjZvRXpZaGMyMEFtV0RKY1RWcmY2cHdwRlhBLy9oOTM1dE5Xb1BWaEhmMzZvSVY5TFF4R0VuSUFiOWY2UGRkUjR0aWpUcjhPUG5zUm9US1FsTVUxOTk4TXpoY0xrbGs0OHlsUzNZamtQcVJKMEFrWFFCTUpUd3RDY0ZOcWV4bGlLcEdFTmFKbStsSXJTMkZkbFRJMnVQdFRaVkJSOCtPUUFMU2p4TzZXbW1ldDdCQk1icWRXOWpXYm5wbHR4bFNTNWw1TDNSQ2tiR296UndXamNQZXp0bkxRdzg0OHdJRUxiQlZCU2N2cE9UTTRxS0J6TDVhMDQvMVp2bHFQcGRoNmJwU1ZDZE1LbHp3UjMyOElUMll3S25JbEVOVVFYZHhOQmVHcTFpeG9CSWxGZWtLWk1Kc0ZFcWNzaUJKV2U4S2d4Smk1VnlyVG9lbWpHb005M0VlSzc3UlhXS0JZcUNHQUZoejhFN0hxTzlIQWYzSURLMjF0YW1EWkM4NkprS1lKaG5IcEpsbkdRaEhVRSthN0pnaWNad29kRkl3eG5SMDRJcGNiTkpNTFZPUmNnOW1KSXBrSEtNRDYrUTlRbTN6bWxRM1U1OGVOWkV3UDhDN0dkaDBmRnBaRElOUlJaaW8xOXBNcVJDc1NERnNzMVVqYU4zdHpNM2VYMXJqaWhjcXo2ZW9hZC80WUFrVVRwZ3dMek5MUk1KdWdQbmVwUS9ZL3F0aDZBNVdOMXdmeCtIZlVRUy8yellyaUVjZ3ZTL2QwTXp1T0VydktlUkk2ejdQNUpOUjYvVm1lZTAxU1lKL1V3cCswOWRMKzU5Nzc3V2dHQ2lOSDRZTDFiT0VTNWFCWjY4MStTcjhVNXFDUjdQTGxWYWp6QjRua1gwSjJEajJpck1HQ3l5SlduTjZwUFVrUmhCOHZTNDcxamsrZmgyMHlnMloyazVjR0VmZy9URjNzZW43ZmNadzlSMlVWR1J6QVBiMjRJRXpReE5tVFZsbXdQTkRUdlFGTW53TXBuYzg1K0toSnlIY1VpYVRteEJUSlMrY2dyajFwcHRldXY3bW02Ky9mbDA5b2haRWtnditySy9vUGozSkY4TC83V2h2ZThyRC9ZL1pRUGszY2Y2a2pXZHZ2dmJHRzIrNDl0cTFCd0VzY3hOOHRkbXJKSDdNWE8xSjZjNGRQWThNT01yNlVSSDlHVW54VXZxVjU0eW83MGRMdGQvem5rVUZvdmErdURjb0FxbytpZjNxNDBWc1Q5RE1ZMGlUeVpTME9lamR3UGhublI0WmhOckQvcll0aVFXNGlvRUt2eklOc0V4cVQyQWJNU2xnanVCQ3dQREQ2cW5YOXpxaG9CSVdjZ1BTd2pLUUhsNC9pbU9XS01VNVk4VFY0VGM5ZUdZREFTZkR6STlGYnlEaGt6ZWQyNloxRGJ4ZmVIRFM4NzZmc0NlWTlGaEV2UEFFTzVyNURvYlorOHBNR291bUNVdjcxYmtjUW1kRWREZDErYzhhaEJPU0ZnVllxeG9raGEydTRYd21TMFFTV1czSVp3aWZOaWd0UCtLYVJTZWhNZmlFZzJURFkySldidHVMbTR5Q0V4WjI0K2pVK25IZjAyWmxBOFEwWWlKZFNCMFhDSkpORFdraExPcWppWUo2cFdKN1VuSThLU3F0MlJ3V1dQcnZzWllNT1RMOFlKSEJnMkhKUmE1NFg2b1JaQ3l2MkNGYjdTdE1zOXZWVHlDbFJGMWtrRUFTQUJOQXFhSmg4ZFFKc21LV0UwbkpsblMybE5UU1lkSG92VldGejU0amlNTDNJOVpTdG9CekNGSVRJMkFtYVFTNkhwWVVsVmJORFgzNFJoeElDbkZlZFVpUXBEWGJBaFdVRm5XZHhwa0psVXJIS0IxSmZKYThxcElvclVpaWNJYTh1T25nSURhTGRlYncwdTdHRVpDdDdNUTBKeVhaL0lCYTdyck5KdkxlbHJ4MCtqU2d4bEtzU3BxZTl6U0VHTkliTEFUWUVJM1pVSDhZOWgvYldDN3l2TE14ODBzR3JnZzdBeDlRdU5iUUlPcDJ1dVM1TlFRc2ZuNEpoVlZ5aUtXaGx5bHhQRTJXOG9laVVFT29zVkprM2ppZ2x5M3ppUE9ac0dERlF3bXNvT01MNTNtMFpwSW9CVVY0R3pKeS9KQWc2NFpwZzR4UHpBSm9qQmRYSEdMbjNxVWlUYU00amlMYmhaQkVVcUlqTmdnU1F6MjVrVGZJWGorYXhFT1o1WG1XK2FXRStoMTMzRVpCWm9qWUdTSVQ4d1lXcmgwM3Y2dXlNeGMyYnJrN29yVjlQd2ZmWkJDZDI2UmxnZ0FmTUo3THZyY3ZMZmc4c2JFQ0paM0t5eFlKaWFKVHA1eUhoZkY5RGpGc0xFUzFnWXpMQ2EwQzV6bzF2a294RzJ6M2pYaThQb3E3djJLbTQybTR3NDgwODZQa3VhQlVaVkdGR3Z6aXJJL0VXVGEweXhTVVQ3d2RRVGlZRUVGRzNVbHM0RnFqeUYxakl3S0RoN21WNFMyODZtQWE5b09pSm9nRGh5RFg1SVF4Nk5xY1ZHQk5DcXY1T1NBajhDVFNCdkFtaXFCSXozUndkcUVvcnZQcnkwZERUVmFLazJ4U1pLTkJGeVJiNmtqVFdMdHZsRWErK2xrcVRXU0F1Y3ppSGsyT0pYOGJPUmVlU1JKZVVBdFlkUW5ZNkh1WlZBN29nbW5HekExSzdWK1hkK0RUT251QzFKU1B0bXZuM3BrN1B6OHV3UkJCTkFGWmd0N05RRnUwVW5sZlg5Z3VqSERUbVU1UmluRlRQTklqMkdmUEpWMmp6anpmVjZUbWF4TkNzamdtQk16TjBkY3cveFNTNjhWU0twNGtsSUtGTmFuZVFNZFhvajVkcFNOMWY1cGFXT3Q3RUIxOGV1MzVnNWNEU2czbkRsbHRob0Y5aG1XeHQxN2tQVjhWQWIxcHZ0Zy9jeEQzSzlmcjV0MCt5OHpmKzZDaC9uZVdIOU02ckg5aTNKTWZraWpPSWtkQUJSbWNVMVl6SW9sckN0bzZJVW9GYzJhNWxjcGUvZDlsR2k2cG1MUTVNNEUxMFNwUStuNjRvaS9iZDVaR01QSG9kYzAwQkovRFJ0NHJ0UlRDRURqWEpvNGVOWjFsVTVjcXd4R2hWcVhlMXpobnN2LyszMjJNdW5ORzMyczd6aHlqdDhRNzgwb0hlR210TW12akRuM29RTmFEbzZyS1poNDRxRjNEWjZmZGhOVnlzd0ZlTW4wQzF3WVZLVnJNY2F1ZkdESzFuN1kxV0VGc09sN01abE5rM1ljeVM3Tk1pb050K1F3SXI5cXZPZk0wZzlnQUhqc0ZHR1pwN3JXZGdLcllON1d4YnQxNmR6bUpoeDUwWkxhQ2FSSlEzOUl3QUMzbGFXNGpFeDc2ZjhtRkJkSm1UdDZackEzKzFJbDBoWjI2ekdBNEZRbXkxc3Z0OUE5VkJRYlhJOUZ3ZnBmUHNZV25YUVV4NkZSTldTSTdZNGJjandTU3hBc2F5SEpSOGJtWnpjQ2EvcDRvVG1pLzJxQTltNmhpRnphOVNsN1N0QjhhVHVoaDV6V3BOL2E4SDFpQ29WVThiOU90cDZrUCtXejRuNEQzdkppUlR2ODl2b0ZBNTlFNFRzK3BKR1lYeXFkU3NqZCtESEIxZGY2TGJGbmk0RzhZdUlrRDZJaC9ESGFRRWU4WC94cUowQVNNNDBPK05mZUZjbTlFSjdtWkZIQkVBTkpQci8zaUhhLzk1bjlLZ3dmRWgvMzV6WmMvTStHL1QyQWwvNkUzLzNGeGUycmsrQlltQnlUb2Z6U3lGdzlubEUzaUZlSXB0NG0zOTJkZDQzeGEvcmZyRWJXU0VlZ0RNUEx1cTE0cnAzSWVWZnlNaWsxWCtSRzN3ZWlyV2tYQ2RabUtiTmZBdHpuMUQrYzd4d0gva0IzK1U1MGNEZ0pjVlZKWnI3dFZsOENYTFU3cEc1Q3A0OFREQ05RVEVPT3JmaWthY0MwemVVYnk0bWVRS3JMSTRjcmNWZEpaUzN5a20wUU9PSUVGQVB1a3F0czEyYTBqeTVVV0h2MXV6MnBQVDR6ZjBhNFNYZW9GMFhyU05KZ0YvSUR6VE1uZ1JOTFFNM3Z4ZjB5WmJ0dmxBQ1VoWjVyZ3RONHpsQ2JCQmNUZWJmc1Z3M2dHZmt5QnJ5RUMweHJQNm95Y1JiMlU2ZmVKbC91TUxGSEUwWDZmS2U2Q204RU1WYmZhQkJUc2NySXhoaDQ1ZWlLeVIxSHhzYTI5QzB6V3NyOFVZZ3NsaXpJR1RPR0JGcFNKbzlRemdoczk0VGcwSm5mMkc4QjB4M3NEUjUrZDNhdWp2YTBPczcvbGFQSS82bm95NmRwMGJqTXA4QWt4RlU1a3hnS0RiZ1VLK0p6c2h2NCtQeGpXeXhuZGwzSkNkUDhGQmc5Umc1YWRINEovR0pJYytBajRRWklsdXgxOEJud0R0K2c4MjhSSVFkSU1kMFdKU3ZvL1pmU1VMNEQvSkJudnBqQVEyeVdFUVBvTitGcFptc1NueERJWFI4SDRGZmdSN3hKd0Vmck8wWDByTWYxSklqSGI5UXpUQitCejhUdVhxcFB1Y21qTlRRNy83VjRlaEw0MGZpVndVTURrSDlTbUhSN09XZlpYUjVwT3dQTnJMWkNqWk8vbnlLWTYybVdkb1IxbUFMRHB4czB2TjEvYjlHalQ5NWdCK0oxQkxsUmdnUW1Cd2dSQTdMU3FGZk1DZndXL09qdGkwSHU5QlhDVUFlUEFVU2FLczBkQkxuRHJxQWxyZ3h5MVIycGhSMWtzTE9YSWtKTlc4M0FrZ09YV2RSUUp5TVowNmxoc1FSZEViT2Q5RThQYUx1QlNSREhWbEpKTERnWk1lRU9IZXZTOFNmR2tiRTlNc2RVTDRTV2poVjZtUFFtbGJYcGV6TWlVOE5pVVc5M2dHNlZGd2s4UjFucXg0NFZCTVg0T3VZV1kwNitEVEtZV1JnNjJlbEhYWDBBMitzVXJ4TVRXS2FEbXJMTHBXSGdFSG9laUZqM0wwNFd6cm4wTnpTVVRCbVNvKzhQQ0VTRFdCVE9UNU5NMkVvUmdtVmFPeEVBZ0l4dU1YTHlWM2dhWDN3aDNESjNxWlI2NDN5aTIzQ0NyMUFzc09GTFB5UldMaVNZZXVVeDJrUzZYSW1zV1ZtZ2tDQXZqSlRkNGw1a0QrajFKYjROTy9HNmUzcHRQSHBXT0tqZnhLY2dSZmlseW1EK0hIT0t2SXdmNTE2b0JuazNvNS9HUkc3a0pmUndJc3Bmem5kSEREa1YyczB1UlhleDFaQ2Q3RHRuQnprRzJzOWFSYlpFZzVMT1JNR1FMYy8yaGFkN21hTnJXYWR5dTBiQ3ZVNy9QVWJmSFVydGVvMlpkcDNwWnAycmhVem1uVVRIUFVUNnZZeG85a1dYakNLWGpPaVZXS1o3c29pbGVvM0JpWVJ6V0tlamJsUHplenV1RWt0dlpoaTVma05QRm9tK3hqdXgybmF5MmxNd1dpOVRWZm9LMlhpZWpzZE1ibnBKVzJhbVZVRFNscmM2Z3FESmJXY2dFUmRHRVBGOUtkcTZUYzVER2pwSVMyOGx4TmlFcFRpTXhzU1hwWW92VHBvS0VoSVlVUlZEaVF6dk93NDQxWjRIUU5CSGo0cmJBU1NYYXJvUC84cEhNU0RGUmtUSkNRMTRUQlFXbUVVajFRV2xhODQrdnJvWXVndzVGb3pRVm1vYWtvaEJJQ2trTW1lU05KS0hXSVJMbUlQaEhJdjNKM2w2YXlOc0o2WWRjQitjVkM5WTNDSW54eFNCOXZkYnhvYUdRYWhIbXhmL1I2d2czZWs4VTAydjk0elFuYVVDTEpFVHFwSVFvN2VuTHBVbVhkTGxTeWxYQUJMMlNPZHUvUTJNWmZVazY2Q1cxZEtRcmxVdktVbjV2dmFvTmVPZ0JRQ01Ic1haL0JRQ3V4bXloT1VtRDd0Sko2Y3BWR3hMOGxadXpZMzc2NlJabUl6YjRYZ29oN29UVmV0SkZDemFTYXhiTXV0N0RKSy9tc3hKVkM1YTAzUURwMVdyRklUT3ovS3ZhTjI0RWVKNFp0ekNZckRoc0RuZ1dLQTl0MktCN1JVSUJtdWM0WlFEQ04wYjFNZ3NVWmpBanJ3d3F6ZmJrRGpBNHNsekNnNFVCSUdUR1kzYkRKNXkwbWExYkEzQVNuZ3MzQUFBQVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF85X19fID0gbmV3IFVSTChcImRhdGE6Zm9udC93b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBQ3c0QUJJQUFBQUFVemdBQUN2VEFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR2o0YklCeUJJZ1pnUDFOVVFWUldBSUVDQ0lJNENaOFVFUkFLNmt6Y1ZRdUNKQUFCTmdJa0E0UkVCQ0FGaFFZSElBeUdGaHZpU1NYc21DRnVCNmcyL3Y2NWk2Sm03bEduQy83LzB3RW5ZK2MyMEdjSmpWM3VYQ2ltTExIdWlKVlQ0d3k0OHJwQ1hlclVuY2d0bDNYcXVEWGRzYnRUTEZxVFQrT2loWVoxMm9nYlZwRGQrS1pCOTNucmFCaWhTSlRJeUI1U1E0UmxSeUkrQ3krTFZtaDUrbXZQQXVpSUgzL3YvcS9NRGtvQmZkYS9oNDdRMkNlNS9uKzZYdTk3UTZLRlQ2eHZaU1lBTk9mSVRESXdyaDJXTVIxaFNSdkFPaFZSbCs2M29aNDBBTnNVWnlFNlpXS2hLS0NnUkN0RzA5S0NrcVVOUnM3Y3pGNlh1dEs1L0w1OWMzVmRsUGVSUHZlc1RhSndTbzdrbGZUczJTZUJJYnlpMWdHcUJaS0tTQmdLSWMzeC9iajVHZGg1Q1dSQWdIQUIvdVordVFuL3h1NWN3dFNZMDdYbXRqRzlFNnF0Y1hYMWUzT1Y4aEI2bGdJS2xGNGQxVDNuQmZUWWpZR21UQ1JQUUdyYXQrY0FIN0Z5dTN3RlBjY1FDTGd0eFYwTU1Ta0ovamVuV3MxTzB2L3hrRUcxRkV1eEN6aVB3STVPdWJwdk4wUk1Na0lUcDNteGJGa2UyZDgxQmtVSFVHaHh1M0J5bU4zUk5nbTV3WmVHaUU0MHVaeE04cm9LQWtpaXoyZlRLcTFXV1RNOXMyUXRlckx4b21hUGc0d2hDUytJVkwrcVhWMVYzVktyTGEvVjdmRWF0R0JyU0RMY1dScFNHOTZ6ZDN6QUVBSko4c3d5UmdlSTBZV2NjWGlYWFg1NUJKamZZNWtPRVcxNlNoVUJpVHRmK3hsTC9hRm9tcDVhZzRJY2l2QUVCRHlhYmY5NFdxcm5qYVRMb2o0T1VZSW9KZVB4NzF3UUdIVTAxQTNTamhLWk9HNnF2Y3M4cGxkZFlwYmJQZ0dnZVR2RkRiaTZDTU9pdUUyK0xzb0hBQ0VGaHRWNktkbk9XcTZLNTVVam5qZFdsUUZ3cjZzY3BRREJHNGUxQ3ZvK1dHcWNTZjdMNXpsMzJBZ0ErSW1jaVFDRXBTbW42eEhqckYyZmJXVUEvMUlIVFNlMTJzUFEwRVFyc0RvN1h6Qm95TEFSL2R6cTNWc29uNEtaVFRVUHViQmY0d21vTzdOY245alZMZHZSK2F2VCtyaUc1aUlmRUs5aTJnTXB6KzFnQU9ObndLSC9Kd3k5Ly9lQmtGNjlieUNuandVQXBEdzBOQUdBcHJ2VGNKTU5SMS9VRkxsQjF0SFhSVFZ1QVA0L2RRYmRQQXpZMlNuS21Bb05zdGVnSEJucjEwZ1dRN0l6S3luZFVEZmpnVDFSTDdCeTA3V0VUR1JOemt0dTlERmxMT2N1aHF5dm8xdGsxYzh2aXlHak9YdUw5bzQ5ZWorNkkvZTc5eFRnbjcvK0szd1NsQzJORXlOMGYxS0wxaG5FVjMwaXBCMUc3b3BpOVIzbzc3c1RSOU42bzZ0Z3Fmd0tvTXhvOU9UNHBrUlJkSlJaMjNxUGFHTXczV2ZjbkZ4dmNOQ28vbHJmYWJzSFN0SlZ0OXBpdDJNYUhiZlRrQzUvK3drRGpyVVZQYzBUdm1NSVNkRjJlemNJZVprbVhSKytVYnZzYzhTc3picU4yTzZ3VXg1d2NHclVwdDhPQmVxMHV6b05tYlRIQWNkTWw2alBXTXJ0c0k2cGQ1T2FDSmc2SGVwM2E5R3BQOVJwcC8yT3Urc1hXdEVRTDUzSDdHcWVORjIyQmoxaU5HV1A5OXRwWm9EUVBkL1pObGN5Nzl1T1h4UHMzTEY5VzA5M1YyZkgxaTN0YlRCYlc1cWJOamMyMU5mVjFsUlhWVmE0bk9WbHBTWEZSWVVGRHJ2TmFqR2JqQWE5VHF0UnE1U0svRHhacmxRaUZna0YvQndlRndQbkZzZ1A5bS9LVWh6bGZMRTZ1TG1sVWhRLzNjTThLNFBPWVhydkR1WlpnaDg3TTV5NHF0VEdlTTBHSHRKVzdVdmlValpTdUQ2a1ZEaUVGclhSY01yRGNlMm9rbldJS1d0blJNRld1TXZpRU1yZ3ZFYVlhbXZyalU2VDJKcWVRR1NHUUIyWmdQbFNia29RVnE5NG5lakJWYXY4bHdMenJHZHNzR3pZclNJTktjRFIrQ3hjQ0p1U1RobDF3VGsxVFRYbmV4YnZjME9vb1haSXc5cjNRaFd3UlhQT3RNSGQvQ1hwTmdXa0N5Sm95L09SazNIUU90Ymt6TVJ4OS9WYXh0bVE5MDExMDVRZkpqYnRWbUlVS2N0K1dwQjg5dlNpMmpWTmhmU254ZTVYSnM1RDRkTTFucHhLVXVwVERJeUhxYlJmemNwbVRWTEJ1TmVOWDZFdEkzczRybXhzQ0Y4MElOYzJvWWU5cHNLVVl3NkxlMlRlYzFteUoraHBwYSt6Z2xSejFqV1lnTHRvaEFrT3VycW5COHJ2K1gxL3hEVWVTdFNuZnMxdHZ5Q29rUEJiUWpXYWt4YWRqSDlHcmZjamc3cVI2RS9lclJhR2FJdC9ibVcwQ25SOUl5eXdhb2toK3krcDNXOEpqbW1vdzV5NmFMeWJkcXRLUE5leWYrZDRHV3luaENhRDEveVlDRVU0Q1Q5MVBCTkJHOThHdnR5QklCc254eXYvMWZyVWZVdjJWYW1aWHd3bEg5Y2h4ejF0YmxxLzQ0SVYzNFBIbFRtL2p3MFF0ci9nVHJCT01LUnRWWDlXWGx4U2pqWUVPNnBTM3BHcHdhRWpWNERlMXgwV05wRzAyV1AxT0JIcnBCMWxxd0p4VmpDYytrUTlTV2xpZG9KNndmODBWMXpSeXk5a0k4K0o0RWZ1dVY3N2lIUUJ6eEV5SzNTU0tJenhMMmZ0RmxVSmMyM1piZzNIeWI5clIxZE9JYlNkcEp4TTFTMFhGN0dlVnhyTlJtaGVOU3RMeitsV0dMUzlYd1duWFhrdVZ2RjBhZ3BIV2pvYXg1Q1dnRVU4Q3V1YTk1N01haWZKSmw3eTFDWC9WTmJUSW1wYWVDM0ZBdmp4c3QzS1dxSldiV2NwQjJ1Ty9jZ3UxbTl6bTFUTkE4OTdFS1dMZmwzbTgwS3QzWWtpNUlGYTNxVTBMVE81V2pyUmRpTWRJUEtKTTdUMHZoTmlmdjVZSnZVRFU0VWdySklMcGZtQW1DYVcyZkVTcEwwVmI5Nm1PKzMrQUduUE9RNGRLVGpNWUlmR0xtOXB1MFcwTnBDa09kL25iMXlJMVNWZHBRWnhhMk5NVWxxSElKdFlnNFhrNXRwNFNIZEtYZ0l2bDVrc0ozd3g3TEdpa1ZwbjBtSm53SFpaTldqTnArQmJGVlN5SURDNnQxUk02K2hsU0wvZXlLeDRWRHZqb3lpTGRtaHNwR2tOczlndGxGZHNSQXdaRHk4Y2hEbGMxUUJZNUlBaEtUTnBVNkdvemxJRFFUbG8xMy9IdldtZjViaENHcVoxVTRBTVp2Y0VKRWlkMGhVYmIyQUZrTUtDa3cxai91Mm1MeVNMaE5YQlF0a3o2WlQwbml5L3h1cGNtVGRhWEFiTGhuTHEwSm9IVVl1d2h1Nmp3RDhBTWNJT0xaZkRtNGM1N0xacDlhNGRFS2kwMTQ3YUdyaW5KbUNodzN4YWJRcDh1ZnVWaVB2dW1tQ0ZTVnBZdTFYUU9qdUFMdWlIT1BHaDBWSXFCRjVjK1BKRDkwWDRlZ0RqQmRLK2tUSURldFBZVVc1MGt5WWtKRUd3eDhKUTMxMDZiWlkxSUJza3pGN3dFdUh0WHdoS3FQU0pJYVg4OERDV2R2VWg5a1VzQkFFUSs4anRHdDFVTjc0N0lReU1jb2g1NkVBaE9JVUtMVFczRzk2T0hOZ0VETEtaaW5WL0tjbCtFeFhHNkE0V21DVmNJRjhraUNOTmRRTkFVWXM3R0VhRi9URTZuZmdqbThrMmI4bnQ3MlR5aUdoeGpOQmlmT2xvdUhMR3NOblZVNHZuUnNJaUt4dE45SDRFMXh0a0NTWWNRbG1IVlFjS2w5R3JlSnoxc21wY3BTQXFnc2VTME1TL01ySWd1L3RDd3BtSnliU3BOeW5WNU1kSDVVWnVTMkc1WTllUEhIQ2ZmbWlCVlhSWXdzWDZTSXFhdGRodEQyMTUzOGtwUTBkdE1LTURTb24xMGRqTUcwQjF3RktRQ2hibFFveVdoZzZLSSs5eHZ3REtRQ2tKVE56VUllSlo2Zmx3ZSsvZTVrcDVnM1VyRFRZbVVBT09PMkk3bERMRnhXbjFTYVJHaVR2VGEyOGdzdmRndU5BV0VGVlBXV0QrSEhRd0lGN0NtVnVRSDY5ZjBSNGFWQjR4Zi9zNEcxdUdhS09aY1krYmFsMS93U1dzZ1FKZmFEcDBqaFFFS1FybFNYZmFLcngwQjRtSVlva2thQ2F6djFSRFFoU0xVQlZZS0haOG55VUxZcEFJcjJubXRvYTJQU0pIT1lTOUQrdUVPNFNSQTNuQWVJSnhLVVg0UWluall3QjQxelhnMVNuekphS1FudmNIVHR0MlM4cWd4bkNaZTRQbXVIS2M3UjkzUmErekxhcFJqamkveHVDSTBxRW56RGlIc3QvOWY5Y0tqQ1FFb3U4NVFOejF5eTdJbTlSd3dWNHJJKzNJbHZTMnhjdk16SDBId0tML3diMUZzWEttcmJVTk1Ta1A5YUc5OXNTcnYzT3lPbjh1T3ZkUDlDSkM1bGtXcmd1a0tJMFVZZ2RQZHBHVTY2YzZQaEkvWjl5WEtSeE9Mc2xIbTlhT2M4b2Vxb2Y2WjQzenZGSGpDTks2YWZNOUQxclhWTithdk1WM1FkMXQxODBrcGZ6TXNwK2tOMERyOFlTZG5UZkRRM3VZb0IwekU5aXpKQ1U3akdnNjRuTFdGTkk5bWJrSHBBNUkvdEI2bnArN2tVNlRuR1pRMW1BYmYya2dxV3V3aHI4eTh6cEdTaDg0ZXdmZ004eDV6VXVaTXAwOVZaVXVYUWRVaE1odE9KMDhTMnNESHhsWnl6MGsrVEdrVGV1YmF0cXdtWDd6T2Vzb0NIbDV5NVdIdkJXK1Y2U1ZoMml5dndTZXluMUFOaU0yYzNTb2wxV3lnZzJiOU9pWG94Zkl4SmcvaEdCbUtma2Z1TG9HaUZDRHFTcW5hR3g1Vmk5TjBsZ0N4RzhEZFA2VXlWYzJ2V1ZIN3hiQjRkWFVzbGlTblBLSXpDQ0xYbEZWb2kxcXdZR1NENU11T29JUHRheWRjcUNRaytTRkRpd0pUWVdjSkh2eVkzMWJzYmlPa2dDZXdySzZMRkpQTWJrWStMdHBlWVo4Ukt1ZkNxWGkvQnpXdXBXTUcrcmJLWHF0MDhRa216WGRwMjE3NWFwdFFyNWNycE4xMktZRERPSFVwK1Nnb2p0MDROQVYzNVdMU25GeWxwYXNQclRKdDIxeWt0RXRLTGZqdlJlNVZOSmRrd3NqNS9DeFdNbEsxcDdaN0E0OEU1bUxlenZaUFJ1RkdvekFCUm1ndTU4NjBiUFFueG1zdzV5MXdFZHVkYS80RjNWWUhSZElsaWdWdC9HbE1YM0o3azkwQzdNK0xPYjVZZ3hOWkMxb3ZVdWk2Q2t3MDRBbkpYS1FObWNHTmZvWWdnOWFDa0o1U2p5VVhPTElFUnV6T0ZQZGlJUFJMVFMxbldnSUdib1RtN2xlR2xPZVpCbEZiTVAveHdHRmJoMFora0M1cUZibDlOLzNrVkp0Wmt4SzQ3bUozSlRGTnc4bXVhRitMVG1wZi9qeXJLQ2hPYm42VHFFQjFVQkNTTmQ3bUE1d1RTMTROZVkyNWZzUzNHVWRIV0JaZElNb0puZGpnb1ZVMEx2d1Vaamw3OUZQWU1rajFGclBCUVczbDJ1TnNGREFDZXdzb3JoUjlUblk4OHpSMS9HQXFXamkwQUIyNVhDeUt6bTBvZlU2MlROQngyS2pqRE1OMEJXRE5lMDErSHNDdDNscTlCeTRKTGJ5TGpZSzJIR0taQVBTRGdZR3EwQmFDbHR6aDFyUkU4SytWRlErR0Fjc29ScDBpR1d5UHBCc25YY1lPWmF6WHJNeVd1Vm1PTW14YkUwbkgvVk9GODBqbEVLRmpzQjA0NEdIS2ZGcGF0TGdWcVJBYWljR1pUQzlDM05XY2NxekRnb0FFOWdIVXZGd2k4cUczREZ2NjRkVzJuNDRNMVF3Z1J3NTdIMjhUTTNaQTRBcVJ0Zzg4SThWTXRNb0JBUGhVbUhPbnI5Q0lEZGk3eS9PWFQ5dy9WSkE5czg3VVV3anlUVmMwVmpzY0tSdlFEVVlVSTBrU0YwanR6VVBMMlB6VmJqTms2SERCWlZuRlQxOW1XSUl6TkJLTEhUcFY5RkFyMHBFd1Z4WUJSaGdGUEhpeEdvck82SzJzRHllMXVDOEFtZ3ZhRFZqaTRKS1ZTTU1rYk1IajM0cHF6V0ZURW1mRlg3TmxMQkRwbmRjVkY4R09KOW1haFpqclk5Ni9ZYXJMdGJncndrTG1sZzArMVJpNEE0RU1rOEpkVERob3Izd3NYMG1JUWRpMFRRY2NtUXZBUW9jeGYxUTllZk1OamcwNFlTamZ5ajB5MkI2azdldnhSbHVGUzZqa2FxL3lBbW1HL2ovYUlSaEpodTBHdHBxeHF2eVRhQjIycm5WVkVhT0I0RFAxZGJRc1BDaXc2SWlhOWNYVWdtWVJGVW5rc0xlSXVhTFdFbS9EWEEwamtIREdvdm9YZmNubFY1QTE2ZEkySE12clRGTXBhMldEQkNLRjkrQzFFUFFrNzBwMzBSMUlpVUFoNzEzb2lPOFN4MWlmd0VYYW5kSklkMW9VZVdTZVNCRGJuYStidnBNRmt4NkFLUFJwM0F6QjNpamNta3lNWmQyQ0huZWNONEIwNm56ckdMM2tZVUFTUW01Z0l2V25jbVI5REJmYWN3VVN2YnhxbDM0NGRGZWQvR3BtM1VrSkdZWWhFcFFJUTM5emN5TTF1ckJEL0VEc01BekFxeXBCYzlYNlZEdlZZRkh6WGdNYm83ekRJUGtYbW5hWVdDbVJCS1Z1a2VCckZTcGg2ZEdUeUprcWJYZW02aG1UbzNVOVdXKzdmRzFEcHBidFU0dTdqVDlDT051MmxaN3VCMjlPZWFKQk1xM0tqQXNqU1hKaDhsY25jUDRmYjRqb1RkUzF3YzBNUTdMeXNRbDUrZDR3UHhPQ29RdHI4RE1WN3g2cDAreVBad1p2TmR0T1R5UzlQUkVudmVzQjVjYWc1eHFSWkozemlUUFl2RU1FTGg1T2dXV3R3bEM1Zk1pMlE2YURNb3RaTk83blo5cDlZRGZETHUrTFkwS0IzTFNCSnNUZVBYS2MwRGlTRm9GdXhkcC9hQzk0YTFMbmswd0N2REs2MGsrK21vTnhKZE00NjIzcnI4WUxDY1hNYklrUEhiNTQxYXd5eStRU2pESmpIMkVPcGtsV1o4Q0hTVitYREtMbWEzdXc5cnJCc0xtYm56YWt5a0tXY2ZKYTZXRjJjTER6ZkRVcGZFQ1NGU01yVEtYdjlxd09VcVFxVWtvOEJUQmN0VG5maGtuVzFZY3o0OEw0bldKM2Q3anEraytxSkJMaXdKN2M1MnNLOU0zZmJaUHROckRyYmFWekdCNndwbVNMUmsvUUpMVjM2Q01hTVJOdi8vNUp5L1UrdEFYc0tHNjFXa2R4aVNHTnFSNU44STlZNm5sUDBEcEVNWENxY0ZIMlZYRHRUYkJqaUc3SXhob2c5WU5Pbzl0ZitwaE8zeG9mVEIwVVRNdFBMRTJYMytVOXNjVXZ5dzJUYzVrNTdHVk8rRGprSE0vRERZQXpweEw5YTcvK2ZMVjErV0hCMjdHbXhOcS8rRmlKcFAwdHAxU1p5L3ZWUFJGNWJHK1ExTjVKM0g1U0krN1N3bGd4ZGRJbzc4R0ZQNmp4TmNmU1JzQTlOSkQ1WWIwbFZaVENlV3V1aFVZaDhaRGFtOGZFVWpYZ2wvM2JKWWlRUHM2VnVwSFpWcm9MT2NtWmFEQ1RnMzhZeVRtZVBmeXN0RlBTdU9rUnhESEp6cWZjN3grTjRTTnp2bXowWHZqZHY3bmswMldROTJmbHdPRm9WTlJwemZsRFIrUDJBazUvM05mMDc4bnFqQmZ5SisxWHBqdVdSVjJnZng2L2wwZisyM3VpK2I1azkzdkNWenU2ZVY0azF6U2tMUWo2bUp4VC9QQnBxd3FxbGtuYmtuYUNaczFXdEk2SzVuR2ZLdnVPUCt5eFB4MjIxYlR6Wm4ycnpONzk1UjVneVo1dGVoNjAwU1Z1WHF6eWpJYU9naHhMcEMvRGRUU1RpZnI0NVdCZjZWaFVnZ2lDWVArYnBXTFAybTNjZzkyMUYvS3JxcThRZEZTeTc0Um93WlJIQ3c3QkhjMU5nSEh6ODNzeWswb2FVZ1lVbFlyVG01ejNVbUVnUUwrelpzVDNYNXRsVVg0YndwU20vWGZENWV6ZDNpV2VLb1J6MzAvRlU1SERVU0ZJK2RYZHhoS1pLN1c0S1Mza0E1ODBSWm80QlJFTmlMVm5wdHdrbGJVTjFvbkR5aU12R0tNa0Y4QlRCNyt4bi9OK05uR1VXQ0ZnVitKSmYyYVdXd1c3ZzVRMW52bGtua0NQWU1nU1daWUthM1FJWjZLcGNiK0E2bTVKbmZPVHpSU1A3SmNIZW0vTEs2eTcwT3prYm8xWlNHU3lYUEtSSDF4cDlSWkdJVUlueWphUW1KSC84bEJIY1NDSVpDT08wYlgyMk9EVW85OXk5L1U3N3gyNVZTM1dqS3l2K0NYeE1QeHZtN01MU3cycVVmaUxNUXZWTGdMdUU5MkVXdEdxVXdaaGVLa0paZHo4cHFnYVAvblJpTC84d3lzK1RaYm1jUkt4WWxsY1NucDZuaDJyc29LMXJ5aUdQMi8vZlhmQW9abFI5T0VWd0tlbnlLQkoxZUNIUG9UaDJ3UmRTODROVVRzNSsycm9JYytPR2Fob3pWVlV0M2FBQ2tCWXBuRmpxMnA0c0grMlVtMHIrNVFaek94YjdDeUNacmxTMDFRTVhpMWliczNhVXlQaWIxRDIrTlZMRjdkV3dwVVd4NFMwVHh6dXlScnhDWkw4QzNVSmJMTGEzSnZRZXZLVjI2RUo2VDFSbUhaamE1NjBudkdoZUh1dHdUMVc5OHFLbHdjckNJODFjMFBkRjhYbUgrbnlXaFpXbHhkU0Y5T1NyajZjM3FTTWozTGdXMEo2c3pROFExZzFxdmdBc0ZYNEpNK1pKMnFOakZITmlMVm5KOHFKNzEwN3QzWW4yOWlHM0RaL0ZtZzUzeElMMWpFeStNOElFaVRHVmF5RzcrejFOa3FKa1ZDVGN2REYwVzQvQXF4VW9FWjY0Q1U3b3RrUi84dHdPMGpLY2h5S0IwTDI1MlR3RWF6WTgweVdpRzN4ckh2dXF6TE1vZFgwS3d2RDNlU21WUXhrUkoraFlrZllrVVg1YWM1UmUzVk0wOVZzSDZJdVVXY01XcEYrMVpmYmRVUmV3Y3RBNHZQNXBUVnlHNkgxWHBFb0w3aGZYR01nb0tXbEVqN3grbWZJaGhWNHQvRTFxZVUzd2pjWm9XM0l0enpWU0xidCs3bnljSVlVNU9UcUJnRnNZMXhTWjVpanlJM0J3YjRCSllYYXozdUR1WGhPdCtrVlV4T3pITERVOWIrVHVKUk1zU1MzSng0UGltRHoxTXVrYmRGZDBSaHZ4TDgvTmVzUW9NbFJTTFgrcnRDbXlkM2FPMnkwa0Iwd05yTUlkeWRBOUVIaUlnRGVOd2QvRWRSVHFocUFOaWhGenF4VEV1YkpHdkVpZ2JwRHpWa0VwdWxxOWducEhPYzVQWkN4U2pXUDJHVjhMUzA1VW1uaVVSL0RjaHp5WjgwUllFNEZxaFVuRi9tMzRGZ0FvVHk4WVdOVDBjMXo2dDNsWHgyWTlKVHZNc1ROUWREemMxc2ZONXJlZFEwWXZyczRqNGZ4U2szeXFlWEhtMHR5dlhvVERBYWFGMHFOcm5Na1ZXNlFlblpsYVEzazdyeVdaUVNSNWJFRGVHWG1oMFVYeEM0OWMyWGJEQ0NrQTBqY3BjM2NqaE9hR0t6K051UmcxU3dSMklnNkYrT3llU0FYNjlkdlRBWm1TRUxyZ3ZyTWg4N0xrS0MwdlFKN1V2ZnpidVNsUExPNUNLYmNDdFVFSnp3T3FDZXRDdlMrMXE1dHFRS1NHVjByY2MvN2RGZEFWQS9HUVNicy9IK200YnZJZ2xTbE5TRnJ3am5aRjdoL2lpTkljeUs2aWpzbVJXSGZhNjJMZS9xL3ViUE0wWVdBdGJtMzhCcTBqOUxYMDZlaFdZelQvZGVPODVMWndUVzh4MHhHZGt3SlUxZ3pMV1V3MU4rVFIxbHJJRkM3ZjQ0bEljZlcyeG5HOXJ6cnU5ci9qaGo0RVp2OTBSZjl6K3Z6eG9yTW1sRldWS2ozRkllQXpUMncvTFpyVnR6QjJBZ3pmRzhnM1RieXh3UmlKN0lNYTZPSEl3RWdWSW5kU2UzUUJRTENURzF4TEZDYnR0TUJ5ditlNTlJZnczME5OYk1Tb0hqNHVhbS9JdjdOMytlTVNKNWJTOXR5cUE3MGhTbWZFc1o5UGJKa2VrdDRvb0p3SURyVW1UZmZnUDJtTDh5T2szV25RVHJUOUtuVC9nZFBuOHZwa0R6WThsL1RiOUZ0Y1RPK1lXY0pQdE1qMDJqeDZiRHBuTTRUMk0vVDkvMGNQdEQxTFlsM0JMaU1XVHFicXdnenR0QWUwaTJpbHJDdFVrVVRaYjl1SFQ3RU8yWE5zdHBoRk1oNHhubFJ1TTVoaXE1N0hHTjRFL2xoZTRiK29KZCtvYmkvVmZ6RzcyQlZiNjlhazZYckZ3NnM2ZmhWYWIxcmdJNlBuYzRzaVd5NlNhSWZEdW9hdEl1YVBUTXU5QTZXRXNBcTVKRzRzSkJBRmZIcG1IVGFxMjJ5QVBXQzNWazFRRHBXaUI3NzlGQ0RKUUZ5aW55TGtKbi9PcjlTUVQvQXFGV0IzemkrMVZoQUpuRWlXVGlzeG1ibmdmRzc2ekxPblFDRng2VGUwL1ZJRUVmOFZLTVQ5Mi9WaENSZXZDVTd1U1RGZmlJZzFFM0hnL3ZEL1dxbytRZ0YrTDEyaU1aeFlQMTRScVhDMFV0ZFU5VVFiS2xUTDUwRE11Qjl3L1RJSTZGMEFXbzFCTlVDL2ZUdWlwRmUxOURyZFJUdXBQMkF3QzIrV0RValNmRCt5TjJ4LzNHNnlpczJaVUN1NU5UK3g2TTFQRy9FbnFHMnN2emhXNlUxNXpjc2hoR1JxU1VlSXZGYjNlcnJFQWNDeEY4U3dwUG9LKzlzdERqa0lhYktEa3hnSTF1d1ZZRkpOUk01OVVmalcyTVNIZ2RNQXpkV0pqY1Y4VlZhZ1l4T3BUMER6UG1FMHI5bVZlZDlmL1BkU2FDcW4rWnYvWnZPVlQ2YWREeHRiN2FmMCtFSWp5RHV1cW81Nkd2TUM5a1k4M0w0MGMrTmd6KzkrYUd2emVqWGdsZTFNenQ2MXpLS1hTblcvQUtPYWVCdGlQaVluR1A4NkFyMlU1VjZqZ3RsSjNRV2FPRjNtbG5JbHZjUm5XcGhWTk54VGt6WXkwZnNpZSt5bFAvWjZ1ajFPNmpSRDRqbHVYMTkyU1pZWXhrWkY2U3Jra1M2UU5wdmVSd1BEOVdIL3VMK1BPYXhUM2JMUGpDM2JGbllXZENCY0FvdDcvM0JHOFBHZEJ2R3BMYUp1Rk5zZ1RHa2VJcVc0ZWFjYmk2amZQbjhMMFA2aHIveEl1b21TcUNLN1E1TXljeE41MXFTcFpJeC92OWkwanNDUHRDWENKa3g0dGk1LzNSQ3RwajI3bXB6a1hCNW9aNXJxUExuSjlaVXBiT0FRTnpBb3VMcmNhQ1F5L3NoNTZrU09Jd2JDSmhwdzRtSFBjSHNMRFFrZjdxZm1wdTFDeUp3a2lncDlyVEpLWHdLVWpCbVl6U2dXb0R1N2t5dHkrUkhXSkY2UEM3RWRnOVdadzJEQnZKZnk1QzNhZFZGSjVJdFhlNmpObk5sYkx4TkJuc0R4WDZPZ3IvVFc1cUJiUUUrOGNYK2RqVCtIQWZ5TGJyMWRxN3JkWEVkL0ozMXBWT0pDdTR4UlNSZkJ3SWpnUGRiN284U0hZR3Y1UDVRM2JvL2pEMXBiVTlKWkczYTZMV3NwNDU1b2U3THd0c3Y4Zkx5Smw1SkJlaTNZZjFMb1hOalNPVHhlZ01MczRXM014WEM2M0lLZ2llNVYxTitwSEdEa25SMHRrR1VtTklQOWZFc3pDaTI3NzcvVHRsUVByeEorKy84SStBSGJNOVJ0b2U3NFVXbXMvMmQ4emxsQk9ZM3AzeFAwYm5oeVp6ZCtyam1YSXMyZEVWMy83KzdVZDcxMG1ENmExaC8zQ1AwNloza08zL0VEdWdEdU5NYjhzNVR2d2dwSElSLy9CdkZ2SVN2WnhYQStWa0pxZW8wdFJuQ1U5YkZKVWgzVlF5aTZaa0hjUG5SdlBldDZCWHljM1ZGNUtLR3V3eWRta05rdzhCeWtOS1NrMnUydU8vNmVFZ3RQL3ZScExUKzZLMyttTktFRUcrVGpVSXFBWkNZb0VJZitmVWhjWnRKNW54TFdGYzZxRDVjVWZQSGVhT29vc3hVLzRKS1VUZlc3V2ZyMjJTV3czQ1M4UmVaQUY3VHQyN1JSUk05TDl0M0w5aHpzK3JSWXpmVElDSEY3SVpBeGFqUnBhOXdqdm95QTNQNkI0K0M4STZOMmFYd2lMVS8zV0hvcDgxYUdhSi9tdEdvbWxKYTFtQ0hueFYrTVVnK0VhTDVYYWpCcjlnUHJHbjV4UGxGRkF6QzllY2VRaDc3NTlydVRFemltUGJCNzh5SHdLYlZnZVdSblpyUFJ1VnZOYW92bFIyYkttUXFRSUtmRW9ZWEQybUJGeE15SXkxQ1JpTktBcHl6RFRLK0NPQ3ZRMjR5NkhkVE9XYjI4VFpvMVkwK0FKemx3LytSOEw2UlVmQndpNHFldnNqdTdKSXd5R2FCejZsbXN3Q1pMcHVpNFIxeHYwRlZMOUwrNW1ZRWQwOUxPdVRGSTVWeDc4UTBSM2VhczZ4STlvaEF3TXprMmcvL1Zobjh5UzJMMVZYblFyRnVaSXBPZ0pSTHJHeTlZLzdGNUNIUUJ5anFLQXRSWktxaXZvM0xtL1NCOHNvS2RpYUVxTThPR1llbFhuRHVBWEFQUVhheG5oK2RYTURwSmpwR1N1WlVoaTUzUjhHdmNqNURveDdIekorUmlHYU1LQjlWUXVxTVRObGJkQzZlS1VZeEtyZEs1WDJLcTJPeTkvVzdYNUM1a0pmYlVhaTcyUkhKU1Brd0hzWGRrVFNza1hRbnlBVHA1UzhjVjI0ajJPcDIwVzBMRFlVK0tYckJuTnlPM1ZGdHFzdmF5YWVvSTVmS1VkajVodXg4Rzl5TGxURk1WbkorVzg1blBFdzhxOFpXR0xpVit5dTIxSThWZkpNNzBsOXM0bHovaVJFSHZEU2hSTmZPNkZSRUVFbnpPZi81SVpZTWN1Rnp5c0swZGJnSHRqRGdrQThvbHdVUTB6UncvdWxIL0pSeHdpbEZaZlZyc1ZEdGFUbnByTmpXeGQ1VU1iUFFUZmYrK3lCUDlUL2tXV0pISUozL3liVW9qL1MwVERMTE8yYUx6VXM5bFhobnFybXU3b1hCTWJmY1RtME5DMzJZdDVSa2V3U1VNVHBxUTVNQ3lUL0JlRVlrRnNoZUxIdkIzOS8yUmdDbS94dEVadkV2MWI2RGpjTm84dTJDMGM2dGFmeHRtZis4MGFTZG44bWd5OVBiY2V4ci9BNUR1eTlka01xdEkwcVJoRzRDVWxjSnRJdittbUdVSWVHZGw5Qk0rVTEwbmV0R2lVRzNKNDVjSDE5eXJGMUVBT3EwcWZMMkZ4d3NlSGtJU3NaOU16MlUrWTVMMHhVNE4vVFhoc2NlMXZXL090bm1WNFlMN0tIQ0YyNEI0VitYbXdTVmlHT2UzS2JEL1hqWmdkTm5QYUtXM3hITTNiUTRpdTNHSGlYY0wzd0F1YWNwbmVyeUV4NlB6UDhoc04yRTh4eExTRTh3b0R1WVZQZkpWWi8wVUtrTUVKNzRGS3hIN3QyandjZGQybXhnSjN1MXkyVTBhR050UzZSQXp3OHNtNDJUak5MdEM1dUw5MG82KzBnZ2tBeFpEdmpod2haNDV1cmEzdkswb3BRL1Y4eDFmUU84cGlmRWNHZ2cydmlML1FhL0VUWGNUbUxFbEtOdWVqYlVRQ0d1cTZGQ0VaRnNRSzd3cmVESmQzTmZqMVhGa25hYUlQVUJ6Y2U2cXdaaWIwcWFmOUZmYjZwY2FxL1U0elpyK2tabFJjMlRHN3JFZU4zYTl1SEpjckRoRFFHeWdLMklvaHBzY1EwRnNvV1lFZVFFcUtKODZ2SHoydFp3K0tOY1ZCUVFJTE4wREJ5OVM1WldDRTR2TFQ2d0ZOMUlBaEVhYi9ramJBRU43alIvMVpQY3J1MFZxcU1QZHhqakV0d3c2WnNoQSsrU3ZMYTBIOXRnMDg5TDQ3QXh3SE1RejdCOFkxYWpJd1ZpeklHVXRZQ0U3MWlucDcvcHZnRi93RjU4TzN6ODRNRkR4ZUc2bkNQU3FydGRtM0hNZmxYcFBEdy9hQ3cxN3MyZmhXOE0wS0lRVVRWbFhPbENUeFNSVVAySGtlYmZIblh4SXJVK251S01qRk5HK1ZLMVVoTGVvWG9TbWZXc0VJdU1RU0R1bCsxSGtJTGtGNnBydGg2U0haUmh5bWlvUFVJekRRTXpNZ1hGeE81c3Q1OCtma2hKM2xGZmFObGNxOUN4M2ZFQ2ZodXYzZTQ1d0hzUnZTWjdROVdGVjRQY0Z4Q3FnaHZpM0w2dStKekJhWk1ralNaYVNYbkxlMkU2bGdRaUh4Y0pUeDFVVkM4S3VBR3h3TWdnMkVwVFMxU1JHYWs3ZW4xUXN3NlN4TW42SVBGSkJpRCtXa3NzeUpCMmFlY3g2WmtHTkRVU0s2ZlFxWnZhRUFWRGMxNG9SRVZOS0dUYUkwMmFJY1pFTGVnUk9zTGlPbkZUVStsZmJSSnUrbVFHV1RUVGVId25QbjVuZ3laWnZxQjZTU2JQc0lwdzhmZnRJdU8ranF1eVo5NkVWYklsNEZ3VDZsandrc3B4OUZuUFp0S2FEdHdjdjVuelNvYytBL3M3QkcxamIyVnRHU2RNbWJWRk5mSzFVNzI1U3A2Zm1uYlA4RjgraTlBOVNVS2orVHVpbnhwNldIbjltcUVyZStqSE8rSzN4Sy9OQlp5SUE3N2FvN3JoN3lmbDVrL0ExQm5DVHhyZEszdGhTMHZjQmwvQXFhZjYza3AwTjBKZWNoMFYvVVdxQ2JJK2MzeTNIK2grTC9qVnBJNkFkNlB0VzdtakhkcndHOGRkN1ZReWI1VVE0dHB1VTQrSDJObGJOQ1A0bGIrRkJwQTdvWTVkZTBJU2hHdnRQMWF0dWhmcmVycHNSaHJqOTk5QzRYc3R1bUI3bW5XUkFxTjlSeVk1RXN6S0dlSmJIcjgvN3ZVUitaRGNoMTBKMURVMHN6eWY4SnE5QnZsUGFSZEJwQWJlV1k1NE02aE1ZTXpJQ1ZxdXl6S0g0N3hZSzBxTEVjWElaSHRPM0cwZlRUczdENW5KZTlWeHFCelR6cFJQWTBQOHVpb0h2QWdJbUdKMGpGYnE2UEJETzdsUVRCTzlFdk84QjlNcU82QU43ZVQ3RnZhSHdDUisxblBZeGtqWWZxOE13cGxmbk83aVI5WTdVQzZXcEh6SmxzN1R1LzRNcDM3R09rWURRWitxdndjUjZ6NnpvbDdIeFREUjEyT2pmZFFuVjhoZGEvR1ZRdHR3QUlpLytqTHgvVldaZ21RKzJSZGR6S0Z5RlFwclZHUlpGVUEwOFZreFFjcU5RZFNvZ3M4cFlXVDJjS09SRFpLZExDMWUyckdXNUlxQTdCTkhGMWxUa3U1YzBYdU5odk93OGpGY0ZHcytJdWdqWjBQY0hXUmw4M2l0QkZOTk54UzE4WmJyUzNNc2p3M1JoSlNya1p5Tmlkb2xEcEpMQXVXelNKWDdDd1paK284ZUJEeTQ3Rk5ZQllxZFZseWJwT2tqUzNkREdEbzI0WXk1YlhKRXJXNThTRXB0b2VobC9ZOUJHb2hLNUg2OVlES2lkSGxISG8zMmZGcUhpNWh4c0s2WFBmOExUKzdETis3dmdMaHEvMmd4L3ZOWWpkYVI3a0lKMFdSV2NDNGVLVDVDRHFRR0JhSm1NZytQWXgwRjRreGFDZlBDNXRwR0dKeURzQXdndk1BVittNjFtaTdiQm94SytRK0VwY2I4dlVxWkM4bE91QTJsaVA0SEp0RUlIS1Fwa2k2eXR5ZTJWa3dPbTRQTm9QWGN4aDBjSmQ2cVZVUFljSUpWUzE2RG1hdlFvQnRQVjY4d2dyZDhzSTJmbkI4NHppNWdjZTE5cDNOZ1pySmkwZmF0cVBCMUVWYU1RK1JWK0FvR21ZMWJrdTk4SkxEcjlhRjRCeHRqVGFrVENaUXNpRGFLRjFBczBOZzZRMkYxSjV6bzZRaThCSkpJcERlakV3aEZYaTZVM3o0RnAwekZsQkVGSklQNWcvalVIbWlpc25LOWNkRmMwbElNdlJQRklpQUs0eXF0TFZSeFVqYThqSFlVb3cyTVNndFEwbkhWVXVWSWd5Y010L2x6aDI3dGtWV09Xa3NVTGFNek5BbTg0a2pHQ3U2UW5jN1ZqeFlYWWNFTzFKZ3ZXMFdWTGNqTFhUdjNHOFpnMWFjUTk5d3ZxV2RNQjRVK1FGdzJDeVh5K2tVUGFXeVJWYXZ6eC9pTnVDNWk3WVM2QjlOeFAyZDg3UUxHY3BZVkMwVFhQM2FlMkRqYzF4VmJ6OEtBT2R0SzZ4eWNINGUzS0dObkJQUHAvaTQvOHVXYzlhamFCNU1nSEI1Y25XZ2xqNG92T2thc0JSU25OMG1SWHVWN0lGQjdseFNub1Q0bWhNOW5Wb2JwT0tTV0paeGljeGZYUE93dThDb3B3NmxUODgyQitYQzFrTFM1NW9qdjZWeFFpTVN2L3pnL0xWeURweXF3TkMzc3pDbXdDd2ovRXgzVHF6ZGE3WFBLQnlIUVQ1Q0UrSHBOSXhhL0xIbWtQWEErZkhpT1Nyb3gyTVh3RHBxc1F5VmlrVjNIMkFRT0ZuTWEydUZNbFpNb0JvYUkrWVNYWWhXY0thNUo4cWZyQ2lCN0d4ZVZlaXk4QjFJdXVydHdZMDRWcWl1VkRmR2FEMlpWTzFDeXM3bmNvWmhRSm5NOE01ZU4zS3ozU2NCZW1hdEZRVWFnVGJKWEx0SmExUll5dVhjYTYrbDg1OW5uQzAzTmxaMkZ2NG00Z0RIN1pVc0Z3czhLUlYzS1VIUTRwTGlWd3BFSlVwUHBOaTBubFluNm9zajhWV2JlcVJ2OGZCMytZWTlxQ0FPcE5KVFBKbG96d0hlcnVHaGFmTWtwVkltYW8xUHUxMkdvNk9mMjBQeGwvWnJGM3QxRVN6SmczSDRodWI2UWtwd0lFNXVsR3RpVXF1enZ0Y2hKS2k3YVhucUU0RjQvWUxrVVRpeXNsMVlZK1NlVW9vZ3c4WHRiQ2VpcFcyZng4NUMwL3c1eERmTjFMOWoyUlVkK0J4dWdtMW41Tk15dDRHbmREaEVvQVhwekQrWnJGYjFiWUt6NjJjYmh4OCthQ3o4YzlXRmNTYWNzR2YwbFcrMzd5MTB0UUIzdlB6Z2oxNzVBYi8vUW1iNDByKzZ0SHhKSFQrcWQ5Ly9UMTcveG1peVAvWmhvMkNML3hrSWZPaXlaWWU5KzgyMmI3enc1Y1B4YkpiZEhGN1ZFL2tUUFY5cWloSjk3RUx2SStMN3NlUDZBc2xxUlNlZjNjaGt3Q2JMaWF6V1FKOW8yTnlrM1Q3aWRtcjd1aG42QVk2L1l3WjBYcWpUVUgrcnJtMzNoZUxWdTVKVmV4SlgxWEcxQTMzQzE5UTJtejhtNG9XN3h3Z096UjRMOGM5T1lMQUVYZGlSWmMrSmFyVlJyVnZ4ZlhBSjdzTzZCaStRalc5Vm1tVGovTGs2c2dnN0UwWndjN0hCeXB1M3l4OWs0Qkc2eUpDR0pYZ3Rqbys4MjYwdW5RRDFpVVV5WnE4Z3JsbjlXc1FKR0liVkVVZFdUaXZQdGpuYkMwRjVGRTNUT2wySENob0RINDkrQURyZjErSWtJdWJIcUJBSDRrS2NpQkJSRldjRUlMYnluMG84UlVmMFRpWExxR1RZNldlNUZtMVJGTXZBNStuNFJLMEpPVmhBUnZUaXNZaEhNNjQvMWlJUFVTdXNRSXRKdWlTeXFXMGVla0VWR2xmTGlBN0ZrVDNVbFE2aVFPdVdaQ1h6bURDK0tZSUdleFdBNm91WDlKWS9hMVNJT3A1Z05KSHRBaEJEcHgzY1NYRU5iMHlLTXF5bnZRMXdEcUhUekRtTVh0ZlBFWGpJODNNa2JtamdjeFFHVytvNUdxN2xuMTNIWFczemZSQ1EwTHZuRUNMNlFrazkvYVVhaFBRUDkyd01rSDdENGxLaFVaVmloWXJVUUtDaGpCRkN2bUk1SXFtS1hqa2h5bU1CVlYyalhGVTdWSWx1Yk95SW9iWlhSWnFwb21tTUtLdXFRb3hTa1ZsY3FKakkvTk5XSkxhcXkxSFdLMWVaTHVOUThGQk9yNnJXZlplMlg3MGNDV3NtWW5MRmxWMVIvTHV5U1BzWHM0bEhRaG42MC9CSUZVOXdST1NTSitaRVh0cngwbW9WU281c2lxMnZScWl2WEZHR0pCWlZyZUJSbUlvUURFbGVsZlVJVlJYNjZxVzRSRlE0OExpVUNyVjlUWW9iQ1ZPWHo2WDZ0RHRRL2M1ZjJ4NDBYKzZrcjIyWHB0NmIwa3h5eVBDSnFnbytYazNEeDZwMStOVnFtWkd5ejdwY2N1QkRGMWtYQy9EYmdRL2NWOUovcGNEN3JpcDQ3N1ZPenhYNTh1eStDdUZkNXpxZG15OGRXeEI4NjdIT2xtMmE5bTJkdG0yWjFuMmRsbjJhNWwxQTA3ck01bldkeG1XZGhvVkQvV3lrYnA2bWRsNm5ab3lFVjQ4VFZJM3JWSUpkTVFXdXlkUEdPV1ZUUHF4VDF1K3dTL3VncEV0MmNSY1VkZDZhd2s1QVFRdUJvNVhiMk5zcWJHMHMzRnByZ2FXR3dOeEFZR29pdHJFS0RGVnY2OHRBbDRHdHpRSk5nVm5xb2gxVnZrQjVydWVGS0dMUnpvK0R2TmlaSlkrTnlKSWdOK1dCTk4xUUkwbW9jSEVrQmFJQXR0QUhBZ01CMzhTQ0hPZko0cmwxdVBaS09DOEhucFVoSlRORFNVcHk2cFJJTjBLbnhDRDFyZnZiVjFaRFUwS0RSQ1AxVlRRVlRrRkd3TWxFS1NRaUFrNUVya1BBVDRQSFpjQnhKRVNVUGtJRXdqSHdkZUtpQk1TaUV1Rm9GQnFPaWxvbmhvcUU2MFJxRk9lUG5xUW9SeUt6SE4vSlgwSWxlanB1VDJmUkxHcDNKTlFkVWxMSW9pSFB5cjhpR2xVbnZpTmk3dEJvTFJUMUlpcDA4YjMrTlJsK3J6YWM4ZlF2NFNCOFIwRGN3WUtDaXdhZjViKzZhRUpVN0o5dTAyZDB0YjNZRGh0VFRZWUk1MStCbm03Yktaank0eHFhYmpLVzFGY3VFVjB1dnI5MENTUEZFRmNYdVY4RlJqVStNZWRqa3kxRlkvR0p1bEZaYXovcFViQmlGZCtJdkRvYitDRWdSdWNreDdGclZjUXF2d2drMlVYT1orM0JLVm1TbTM0WkFBPT1cIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMTBfX18gPSBuZXcgVVJMKFwiZGF0YTpmb250L3dvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFBOE1BQklBQUFBQUc3Z0FBQTZxQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHakliZ1M0Y1BBWmdQMU5VUVZSV0FEd0lnamdKbnhRUkVBcUNSSUpLQ3dvQUFUWUNKQU1RQkNBRmhRWUhJQXlHRmh0NUdqT2o5cEN6a2cvd1h5WndZd2pVUjNvajBFYUlFS3Iyb1dGSDlRVU9CdWN1SCtrSVVLbkJGUnkwVmhYMTVLWGxDWTN6NDFEMG5HN0R6cjhSVHFlRUVaTE0rcjA2OU4vcEpHTVNGM0JTbmlzVmdQVHFJb0VMNU9MWXVUTlBFOExZWmZaUGROcS9DUXBvTnEzamJpbHZVcG01KzVEelJRMFB3UDN5L1FvOFMvQUFURHVCcWtXYVRiQUJONXpwZlo5K2JwUHMrZC9lM0twb0d1cWRTT3EwUUkwd0J0eGtxUTlPRSsxLzF0SzZUVGhlSUMxODFWL1dUQmdHMERBVVcybzdpWHA2WVBGTWNFcnFwL1owZjFwczd3MXJwT28rblovdHJHU2ZmVVE5WWxGU2QyWGxtZFhLM2gzTEorK1IxdjU4aFAremRLaERTcmlpaWw1UFJOV2xUWlYwS2VvNlhWNTBpaXlNalgyYStBTzBxSS9oYW5YUlNnbUtjZHZIVUJEVzZjcjlLUWNZVWN0MG9DOFhjSVE0ak9XUFNVMlJpanVPakU4SGF0bkoxQU8xWlNycWdOcFZsREpBblVya2pVRGhBTkNTTUlCdzVucEE1MXhubThHSXlvQVEzY0VZbHVMRFNJeU1vNFZNWVNDaHlkS1VwSEx2QUJXRmNubzJ1U1RhcFRiNUcycFFlQituTU5XZXlGTEZJOGZyK3ZwOG4rL3pTL3pUZ3ZlV09KVjFIM0JCRHpuSzVnUFlnaE1ib1g4a0hTN0JzcEhnY3k5WUpFV2hRNXlBMzFlYi9lOENJTDZ5cGdIb1RmR0JPZmNPQUE4eGxabDh6YjJoenpNQzY2VmNYbzBRNE1LMldvNEE5QTg4Rm5HOHBFbzdIT0RBQXNxOWR3RFVaOTEzMW54SHNWOHhyMnBtZ3FkekRBRkQwcFEzS211dzd0cnRjMGliaFdtQlpuSUhtTVROT0ZVY3RGK0wrUmJ1L2QrRUhOUEdlZklOZ0ExQUhweG8rSEtscFFtblQ3RTI3VVEveXI1SlMyNnQ5Uzl3YU1IVS9yMUhySHRHclNsOUJtMDcwK25jcGxtajFpeWJkaGE4WVR6Z1FqQnVUWXRidDlzZDZKcmViZlRQdG1ETG5oUFhkUmt6YjkyeEs4K28wS2hUdnlrYktyVVpNR2JXaWgwSHppaDBtclJvelo0ejF6MXIxcklOYmZiN2IrczFZcXJqMzI3VHZuTlArb25lMEd2WWhFVmJBUmRGUTdBTzR4YXQyckh2V3FJQnZkTkhvaTdpemRwam53ZkhibTZzcjQyUGpZNE1EdzBPOVBmMTluUjNkWGEwdDhGV3VZeHBhVzVxYktpdnE2MnBycklzMDhrNEc2WCs4YU9ISjhlSnMwZUhENGFEWHZkZ2YyKzMwMjQxRy9YMzN5cXNyUmJqa0tVVnJreldTc1VvcEZtRksrdWxZZ3hUSVdKOEY2d3doTkN6dXRPM3RhclMyaW5XQ0JCWGkzZW5ZOW5EckRuVlVhZUZVZk42blFGM2VvbWxtdXljc1hycGtCTEtiTHJHVjFnQ3JyYkRmTE5QdjhDQzNIYWxoU0xqRnIwcUU5Q1ZaaHd3NzdBZFFRVkMzbDFYenpaaGhYR00zWVkxMndrL0ZXSnNkQTk5NVQwdWY3V1lHdUNLOGlJYStVUFpFZWMwcHhJTDY2ZXUyYkVEY3c3UmtFR095L3dsL3FVOGJFWUU0M2pVdGRJTjJzbUtOcjF2K2JWM0tlbG1UYzdsN2NOay9aVllsNHFCVVE1bC9IUlZDUEhUTlluTml3ajI2VnI3QzlOY3haZGRHSVJYRUxCKzhCaW5KSGgyYnJRazd2Uzl1TWVwUE5EOTJoTjJueDFaVHFEN01aeVdDUVd1RjhZOGo2amdnalJDQ2lHRnVGQVhoNGpZS3dhZFlvNGkzSUxBQnRUT2U5MWJXN3kzY20vMTNzYmM1cHdLUk5hL3pGZjhpeEFsRlAyYTAyWU1RZTMzZTNLcTMvTVBxWnlBRmRtaXBnZlU0WHNDNDNSbE5mY0lDbi9KZzFJY3V5Nnh2K2JZSkFVaHk1U0RaeWdWYTRHWEcyN2FGWitBSFFEVTU1MWlFaWhOMm9jd3NQSzlYbW5uWWxmdHB4YjJHY255UkxFTHZWK1FrN1ZRRkNvZHFYcEplNU9mb1dIWDBydmVTTE9qeHBadzRZYW1vRndyNDdxbjlUTEVPZDBxSjlraFRiZmJtN1NYQ25XaHRHeVdwdmhaZUNtd2VpZVF2QlBmaWU0RTRxVU5wT1drakt3c2MyZmRqZTU2QnFJT1VGL1AzK1VhMStpVmoyVVBqNGdRdW5hbXBpNkZ6UkE0aFpSbEZRUmxyZDByY2FsSXRZQjlVeTBWTzcwUURrejMyRmFCNXBBMFZkcS84RzZhcGVkaFZhMVlDL3VSWmJYcVVxVnFKTy91cFpsbmxXdE9xdFFNdk9zOFRtbU0wSU00QWdhYzJpUko5MzJHaVpWOEw0OTVZRU80Sjdzb1N4VmxUc21tek9zOTFWSXhkaEJkc2poQ3FjM005WHZuc21rd05MZlJ5UE9JK1BDdy9uYkYyYXluek54aXVXMVN3ajd0azhWY0c3TW9ycVhyT0ZYMXJhYXhhelpQRjEwN2NZSnIwdzZDY2dhNnBMaEpLUkpPUEE4ajcyWmI2U05UaitkNmlEc2pOK3RKK1NrYWh4V09PaVAyV2lucUVZa3Q4QTBHcEFMUmdJYldTYWJPVXJDRGFYOVlGTzJ4WkVkS080alhoclM2eXNSYTFkcERjZHlvZlEwbTBGcXJ3YTVJYWRSZDhvNjhSMkJWckZVc2RJdW1hUU9qb2RkMHk0VGg5TVNTUzJWTnY0WHJSNzJJMWxweU1tRmRJVG83MzFMdGtQbFAwd1lHRmxEU3NMeUxOMEZjdlNGRDBCN0d0MEE4bVpPRzB3bXN0MW16UXVtUldoY1BrY1o5cXNiYTBTdzdmNUx6K25MR0NQaTlNaWxUd2padm9OMk85QlI3WFRhZTRtRWhndmpzMEJ2V1ZLQTZWWGVjcWdvNXdyVG0yTjJVUUxpY09LbERScWQ0SEROaDIvSTcxR0RlY3NJa21CRDdrUVQwTFZhS2NiU0E3bmZLZ1B0ZEk1QURFbHFkWEN5VlphRkU0cGJ2aFdDMTByQ0R3R3VYU0Y2bWxUeFNWSkNDTVM3d2RKaG5QMU9HMlVSK0RnbkU4WEVqbFZZbFlxSWloWG9sdm5XbFNRY3FPbFVJSEdRdUlxNm5JMDlvaVp2d2c2OUVLZ1FNK2hCU2pvOVNlZnZReG1iVzgyeWR5d0xIeGlpVlZNOXlwa0xUNCtxeE80aGJqYnlNVzhYSXNUaGRPTW8zNHFwWWwydm5oeDVzNSsxRDNwTm5kU051cDNKUGVxYnFlN0FQRHRiSEthT2xVZHdSWmFkTldXK1BJM1ZzdFdhOXJBREJRMVBDR2lON3lsZC80dGw2ZTRUQTdDU0s2eHpWb2JjTVhvb0Fic1pBVDJSQkt3WnJLYzd3TDR3NDVtdFhTQVlHcG1WUTN3SHBxTUxtaHV4aHQ4V1B2Nno3ZHkxd1RkMkN5U0dRaU9TMVBjNGJCb1oyVVMyNHkwN2pjYUZhMlVNa0ZHNkk0aGMwSW0rYWVDNEozZVVNQm95RVVLNitrdkorYUZZTVFzeFp4QW0vS1Y2dVk4VmNmYjZTMm0wSVdKL1RydHVlRnVyWFZwcmhyUlcyYmZWU2wvc2RyUDl6U04xMVJKNXlLdjJ6LzZvQnV1WTVwc3FySGRyQ1JGblZOZDA2cUF0OC9ydDVZMGxFWUZoSjBzM2xMZm52S29WeUJBNzY0RkVpU2dOeFRMUm90MHc5MXY0MjlUbm9UVGdncHlnLzhsZE5RRUxMR1FRMnNVTDZzcSt6VmtXSkErbjdEZTJDV25SSVBSV2czQTJmOXZwMVJMVllwcEVtUis5NkdyaExtdlh2QU5vT25DSUswUTdtdzhJSjhZWEFOVk1xU3JQU3diM2lDb2MzVDZxbUc1dXdaS2d1c1QrdGtGWDdNRHJsbXFRUkREc0Q3Yjc3Zjl5NWd6am5lUG9PVUp5dVZ4Q1BmU1lkbWNQMFJRLzdpd2ZQdkU0ZjJ1L0lXKzUvY0N5b3BiMk9qWElmV1pUdGZPc0pzN09yditOYTNGS0owWnBFSDZlUUttYTcwK1BPcHRTQlJ3NTBUcG9VTUNrYUhNclVYbG0yMDk5RGZvTkJZcmxBOGEzbzFnRlJ4TWNhUjFtQ09BdGtyenZRenJ6OWlveFp0RnJYaVBzTnhWSmhCMDZMZlE2MEMzZk5LZ296L1JBVGpKZkVERDlicEpHbEVtUTI1bVRKQU9LUHltcHJTNit0NmtIV3ZYNWhSQXpweUlMS0hCL3hsOW9mL1hJODRxODAxSTloNmNSU1h3WElzZmU2azRhZXBqeWkybkpvSVJJQWduTXRwZDMrVERVTnZIRTVFMkhqSDhpN2VGZmVLZ2hyMjZXZjRBdUpOZVJSc1EzUHFObFoyZ0xKYUxQUzhqdXVBWndaTEN2Ny9XV3JiR2JOQlBQbVIrV0phTERWaHZpSHQvemVVWXg1ckdBTm0xaHVDVjBFRXdSUmpPa2xKczZKUXVSaWxtYithN0w2dkxqeDR1ZnkvWHY4MDQ5MW1mV2YvNlArdWpsNVJxeGc3ZStwekJYWlcrdi9yM1dqRzYwSGE4T3JZZjNURStKVm5uN3BmK2pQVSs0clh4ajRpOWcwdk9VLzJmMzNCZVA4U2VvcmZiY3J4dCtLRzlYUTR2L1o3cjlLZnEzbnRzdXhOMk9iMlA0TmdxTFV4QTZ2RGVYTzkzalBZWGNRNDFxY2w5RHJ0VW11djByOFJqNmhldHJpOUxjc0M1MXFiS3Z1VlRGK2NOMlVVVnYxbEdFTnFxNUpET0FuUlRzTGhWSUg1NlRQUzlsY3R2VnJyanh3Z29JekFNcEFYZThqYXdRQVBHdStWUTNrS3Q5cHNobGpVTDhId1VCQVMxM3ZaRmtCbWdqQmVvS1JlN0NPS3BkcmJXRmhxRFdBQUxhRzBVTTNDVzJoOXh5dDcwWkwzS1N1Z0FES25OZmw0TWtpWGYvZjFEVFZBQUIrL1Q3eUNnRHc3OFV4K1YvYi85NU5Yc3Y3Z2MxZ0FFRHdFN0U0dVdlVS96VjZRdlNsMXdTL3Q4UktEeWR2Nk01NllUN2VRNjlBQVBHY2lUWmNyQ0N4QlZSYmR4alljNnZEUzZ3WnErL1pyOEJDMHRPMWhheXZCeFlxTTd5NlVBd0w5QlpxQXdQZmhZWVAwaGQwbWhCMHJZUUFlWEREUWdScGNJL21ZTVhIdElVVVgveCtHTlNDZDRWcDBxd1RvMGFWYW5JVW1qUjJsUFNxcUhCSm1tUGRLQzVOaVdqWjFzbDlya2t0eG1VdkY2STExdFYxWm1TTXMwYmN1cm5pZkVtZXJTbzFVc2pkVjBxc2JKc0dEc2E2eWZiVnExQ1pMZGxJVGthaTdFYXk4OVZjY3VKQ05mWHVLMGVKTVYyU1oydVVjU01tRFpmZ0owb1NSZzAvRGRWelF6VG41ck9YOXV5V2RzaFVNWE5OdmkrbExKKy90ZEJENnR5V0thc0hidllBaTNXN2VtSVZURm9pU2FSNFdSTFdsYzdLdU55bk9jMmNtSW9iYUtIbGZXeG9mL1dQdHhQUnJ0OHdOR3UzVm8rck9Tc1JFcnc4TVhocFV1REZpZUNGU1lubngzaUp1VEVDenc1THpQUjZlTHIvYTB4MVBuaXlZL0JFUi9CNHA4QmpYUlVlYlFrZXFUVHhjR1dFaHhwaXNGSmdvQ0w2QTVTNEw1RG9EVlNnSnpBV2Qvc3JjWmMvMGVsSGRQaEY0SGJmUXR6bXEwQ3JMeUgzdHNZeTcyVXcza1JMWEc3MmladDg4RmRvOUFuR0RWNUV2V2QvdWM0enJ2VVk1UnFQdU5xRGQxU1ZSeXl1ZEpmL1ZoWHVSTGs3Zzh2Y0hYRXBIWXRMOXBRVHZpQWVGMHFQTXVKaHBuU1NFc2ZSc2lRaVhFTFlaTUJSVEJ5MlJEeERoajlnNkJNRGYxbmZMMFJLUUhSRDRpQlUyZzljY1lKSDdMcEV4eUhhSnRFeUJ6UnRwWVpOMUMyaU5rYmdvSUFrQkFaa3dzYzdBcDRlaGZDUTJ2SHlTN2J1L0lMT0JHMW95OHZQYkYyeGxHZUpKYUlraUVVVUZ2R0lva0RCOEFNd1gwelo1SHVVQVhiR3hIczJzWEMwOThRTzlnN1kzb1pnVng3T1UzMXRJdTYyRncrSk5TOEkvVHZYME5VZ1EzTFZ5NUJ6eEJ5T3ptdGE1am1TMDhYcGx4K0VyVXQwWm5RNm9rMHFRb1pPVHBwamNqNllId3dMWEJQMHc0MkNxUjhpQmVLRWppdWF4em1jMDhYcTV4K1lyWWY1RUxqb3JuZ0Jhd1Z4djRpa3h0MlVKRys1aVNiZ0J0RGRDaW01TjVrSklDTTNML3RtUW5OdTlNa1RXSWZPTnoxZmszMkxnc2c2OUhvenM4SldaZDhzN0RrWEtnTUJHSUZBcHZKbXdRU0tFMENYb2xBeU1KYXhFcEk4dWhsWTFFVUZpcG8vMGF5WXVaTkErVFYvTldZQVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xMV9fXyA9IG5ldyBVUkwoXCJkYXRhOmZvbnQvd29mZjI7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R01nQUJBQUFBQUNSY0FCSUFBQUFBUVJBQUFDUDNBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdtUWJoUzRjZ1JvR1lEOVRWRUZVVmdDQkRBaUNPQW1mRkJFUUNzTUV1a0lMZ1VnQUFUWUNKQU9EREFRZ0JZVUdCeUFNaGhZYnpUb1Y0MWlUd01ZQmpESDlSUkZGbGVvcm9xalBhcE9YL2YvdGdCc3lwSWIrdlNxWWRDeFg2TkhTV3RwYjA0TUpRV2tGbjJSVEh1RWJDdzVod1NIc0ZtNXVlQW9WanhuRjk4V3VmWkkraXFiUTc1cktlYlZIZTlWV3g0UXV5U2x0dTFEUTkrazE4Yis0MkhYOVpVWE5QVnZvZjJzZkttZ2NHbEx5ckl5Rmk2TzRZelEwa3BqK2w2N3kvZC9kNHBuU0FzN2R1YmZrYmdOUTEycUJTQ01EZ1F5a0lMSXpsMVBVR0NnNlo2R1RhQVpvbXgwVEhZSmlBQ29XMkZpQWdkZ29vWUFCSWxFaUJqWUdWazVGZTlvckYyVXZkVzYvZCtuMnNVanoyNStmTGh1VWJidG93ZE8zMyt1ZG5ka05BTHlpS3Y5YUlIeEpnVUFpcTlycXVpUXFxb3dLaGV5SlVQbmp2NXExbVFzWm1LTTZ5WVJ2L2RLNzFDbk9SdUx1NnZnZWtyMVJGRjJ1a1Q1ZDgwejBsYVRtQjFEc3Z6aW4wSFpHQXNLQktFbG5UeERFM0FnRno5eFBYTk15WGpzcGM3aFd6aVRaMENaTGRBZ1BBRUpWNmZFRjZaK0VMVHRYMXdSY3VONVhsNTliWlNrcHpLc2E2NElGQUY5VVhKUFhqZm56Qm9qMVVlWHoyYlJLcTdzTWJYbXBGejNaTGp2Y0NiSUZDbmVDZkNrSVZiK2FxcW9sbDlyMlRMZmIyRnF3UENRTnR3WTFrV1lCTUFJSzRVZ2F6NEk5Q3dEUkFVZUE4U1haQmVHOUM1TDRndXlDTURnL2Zwc1pDNUd1RitsZDlQMUQ0MEZJUkRKSmJGc0ljZWIyWHpJSiszeDduSzZrV3hIclNoQ1I5THAvMjJWc1JhclRCaU9QVFlmZWZ4OWphbzlpRWpPM3N5TElVQTR3U3J0L1N4Qk1tMWtzeENSa2NMMHlpR0ZRNkRGYUF6RU9PdGdkWE96cjhMZnZSV3FmSUxjTFVnVXBCVlFwZ0ZUUUUrMHBDSGdSNlR2VDBaKzNZR1VIMkYyVnJ6Ni9IZHFuZWVLNW9mMnE3cXREaDFOZWYzRWJ3QUQ0S3NLOXVBWVF3RXBXYkNKSUVvWnBlZ0h4Q0FZVm1HNEg3Tkl0RkV4TnFCMmxwalMyV1BycGdxNEJDZ2RNQVlNdS9YYmE1NGhKSjgyWmQ3WFgvT0NPUlQvNXc5OGVlK205cjRGQlVKQ0ZtSHJiVVd4L20zR0NGMzhKbGdpSmtsajVLRHdSaTBMYUpGMXlwRkRLcEVZYXBVMjJ5NkRzbGdNeUt0TnlXczRGZ0o3SU5ia2g5MlJaZnBFLzVWOTVLcS9sWXdCQTRSOVRBRkpwbkhQbXcwSExvV0xxUXFoTVpaUFRMS1diWkN1OFJEUFBsQmJxWEtCSzVRYlRhVkR2cTVWb1RnOXF1MExDWEI4TVQ1VlJBd1VuekJKNXNMbEpRVzFNNldod1lWdWVacU5IbGhXYXpQWkpHSHFjUGpVSmczS096aWNPeVFGa0VxcUJoS1FYRlovVVF5Z2UwK2UwM1B5MW9Ob1ZCamN3ZC9yWjVnbXN5RUY1R3BKc2hHWk96VDBBNVUwVXJuaGtUdk0zeEgwUDBMeFJxUWYxb0I3OWVPL1F4TE5YYlN6QWRIRW9XNzJGWGRtWjRNUEh5dWNCcHhRSmtDdjQ5WXlIbHhqQjFtMGs1eWcrVko5Rm92RWpqQVRBeGd2ejZBTTExVzc3Nyt5V21KM0RqK01iK3BrdldmbWU1bGV1ejlOQmJkYmwwdTdoOFlDZ0dEb0I2QkVBSUJmRk9RQm93R2JzQUtHR3cxSTNzK1hjN3RlZkpoQ0F0L1k5L2ZwQzBUL0pSZ2xzZG5JUWUrTlZzU1o5d3RVMEMvUFI0TkFlT3VCM1ZDUTJtTGVUU1V5elR4dHBoM2JwZ0E3cVFSM1hDZjFXNS9XT1B0QmwxMFZjS1J2YjdTRTliRXdlZTBIdnZ5dTllbXozblc1ZFR1b2t0T05sYWcwRW1yeEdZSEVPQzdlUzhVQUM5UCtYajJXdWFPRmZXYUJpdkFrd2JTSWtZL0l2Z3lvY1BSckR4eHhSejFCcjEyOG1iVXppb0Y0ZHJySFpEamZrME5KMWJMUEhxRXJHN05KTnExbHFRS2ZSVm1oTkgzQzBFbXRtYXJHM3llbGhWNk5OZSszKzZ2bDlPYWFLRmoxMk9HelNEU3J5cWFTZURqdGxVRWFERnQwR2pUaGcxSlJLMnZVWnRzK29ZMjdxTm1DbnNyRzFQV3BwNXU2RGR0bHZ6UGRldEpJblRkcjAzWGFuRDJJU1FRV3RTVEprcFA2SE5IMVFZRGhkMVNvUERQdDBiTmJnVzM3SGNHdUx0cG04cVhGYlEzMWRiVTExVldWRmVWbHBTYkdtcUxBZ1g1MlhtNU9kbFptaFNrOUxUVkVtSzVMa01xbEVMQklLK0lrSlhFNThYR3dNbThXTWpzSmhiSU5xTDd5NTdNVlJ6dmNXZTdlMGlsNFVmN2tPOXMxbVplUGw4SE0rQzlZZHdUMFZPeHhKZmQ5WTZ3MWJPRWhUSDY2TmN5MXpBeDhwaWdjUnZQcUxEY2M4Zk5vSTFYcUJXTkEyU2ZodmxTOFhlN2NZbktjSjVseTY3NVRPKzloWWFFSGx4Ykt1VE1DRzFvOG5DRU5WblVsMFhWcmxYdzZ4N2p5ajY5aXlMT0p5S1VBeU5RbjNpcjZrVzZtNzRKeHlpcTVmWHo3alRDalhDUFRGMHZjaXEyQ0QvUmJqakh1eXQ0OFBGYUJMSW5pR3AwOUVweHE2WUpPMFI4SUhMNHhPWlphOHovMy9iTU52aVcyN2xSalRLYU92TnBNcnY5cHVKS2RvOUZjNzhwV0o4M0RYcDJ2cElrRTBkU1lENDhuVXB4VEw1ZkxJREdhOXlZNUhLeVZUSEZmTFROalFnSnhZaEI0T1V5Nm1aYVRCUGJMc0NBM1pFL1JVdmRjYmdabHVkZ0ltTkxHempSS3NzdHp0UGVWMjNLNDc0QlozRXFYRlY5UHhYd0pDd204SnRRZ2pGUjNOL2sxVkwyN1U1RVpLbzZWUklVc3J2aTR3OW1VU0hMWk9xOXQybGQ5NXQ1RnZDVnJVT2JGTGVYZjdJdTFXblhqTnNVc1hmUXcyQ0tFc2VNUFBSQWpTR2R4WXlPYUNzZDVwZi84WmV0WjdKT0dGWVorR2gvWGxPcVhwdmFIbVQ1dCt4amRicG1MTEJxZnVCaWVMdWJxcWN4Q21QK05PT0o5alNPTkUveldlSFpOSnVzR3RDMVIxZEs1SHlFajR0VERhWTJFU1NWTStXanphSS9hU0pzb1dkeEZuZHd1UGY2eDR6UFNJUHdrYUJmeW5YSE5OUjIrMDVDa1IzQk5abWFXUDBDVWNSOGpzcmtrUzA5YjZvL0tXRnRVSmErNSt1elY4bXR4ajkrUzVCSVJPSnExbmFHSER4bG1jYkhYZkdyYWEvK2hzNXI0bkRtcXRHeGNqd3FWVmU4NUtNREkveTVIbVpQNHBwQ0ZnbTllb2FjZy96NlFSVFI3bk9ZOGx1ZHRhMEN3YW1ubWpoek93WisrM1c2VWpSZHVtWjNLeDVPR2VtTm15M3pKcmRBTlBVL2NQZlJGZjd3cUpaVVJMRVBHQUY3OVFxdWtTMS9OTEhJSm9keEg1U0N6TnZiczhVMnpJd2xjNEoxVUp3akNlMXZTaFJDOHh3K0IrdEhrSzl6OHRPNGRUQXFTNXhIRmtpZWxlRnM4YVBPOWQrY0VpcWk2cFR2a3FIM2xObzB1NlFzMFRWUmxISnVuMU8vWmlESFlrbVJyckllM05zdmEyb21GSFg4aTk4YUpqeDhmVFRXbEhMTmkwSlk5cWc0S25FQWl5cWEyWkREVkJ5K2hZR0hQbGs2NncwVzZFa3FqYnp5SWNEcDg1K0R2Q2loZHNEOGdxRHltc0FyNUxEWUJ0QVRwMW5kVU5IUWFpdzh3UmxJVm4reVBpcHBjZHh3WDBoYWhBUzlBeFRxakFvS0Y1VTdQMUtFc0FJN1NXWlViMytPNUx6UXJDYVhCUTVsQUhhLzJBSHB6Z3RDb1lpODJPZzJOTEZYWEl6RHFhQXpRZyswajdhOUtwWklXRzAvTDlYaFl2dUhTNmJUSU9HbnZKVlN3RWRsc0N0Z1FiNWNvUGlBcGVDUklldTN5Q2xtZTAxWWptcGVjUlVLYjc0UWx4a1RXVVZRTHZCQ1c1a3YxNm9jbTRkWUNrMzVyV1U1WEdMa2ZsN1dsQ1FoTG9GNTBzM25ITHBOOFdyems4SUxGRFRrVDRpdlFJd2FkRWhhWlM0UW0xNUtMWWVTK0U5R1Njd1VVKzFKbmN2OHFWSlFxTUl1OTVxNEFMaURsYnBSTzBGb3NiRHZTQVFuOXZ4cW92ZjB1ZWlnTGxxNHRpcHowSEtLMzd3S1c1ZnhVMFBuRmpGRTRKODNsQXVrT09QRUdlRHVjVXBTM3ZuUkROSUtYWjB5OGF1ZWRpTGR2dERtTHdscEd3N2JUc1Z2Z1owSERnR2RpeUI1VnpYTXhCNFNhTW9rRzJVQjVuQzkyUTFXRGRYemJ4VndZRjJlVVpDVGROVEg1RG95TlJYWFVxcVV0MlkySCtMdDM0UklEN085ZHhhRUtHSWV3cTN4eVhOdHVSemM3R29ic1VnL0F0Y3lwN1FxbUhHY2x1bG4wUVpZRDZsTTg1VWw0RE9DRzQ0UjJLdTZFT09KRkF4WHNaSXU2SjdvTGRXWWJyeGtrSGtPZHdyVkV4OEFnd25DT3R4N1dKZEhwNmNDYUpQYVFhenlJeVYrQjdLTWhoV1hqZkFSdDhWWkRoczJnaXJTakZKcXVZZlZSVWNlcTNXN085NFJOUEdRTEVhZTczVmVhRWpnWVFZSU85VStaUm9tY2lFTjdLemtHRVJuYVFNNGlZSWduMnJSN2ZaMDFDQlBzcEdXRkdlSmNmNGNhUTBJbjA0U2F5MGRrOFJHU3BnakJYb1p5eis0MS8xUHJnNlpHK05SWGhhYTFqM3crODlnUnd4U2ZMKzhXaHBuNFkrTUMxVzFvSHJjTHIzU2xRcHlMWHdpT3RDM0xjVjJFaHloSG5YMTFFakpHaDhUZTVCR1UrL1krbEFxQzEyMDc2ZGlEaTZTTUVQazlHSHRtajY3WGt5ZDZuOXgvYUUva0VrSkwvQ0pOQkU5SGFnelI2Z3lEZXY4ZGZjcDl5NVNmTGlrL2VoZFBaTmIySmtIbVpSUmZoa2VpQ0lobndFUzdSdWtCa3ZEdmZZWUlqR3cxSFg0d1BNVzZFS3lvZkxoNytKbFRpbnhoMVFwQkdrT1lySG5TUisvL2IraXFFa2VrZUdpYXFkWFdJRjZmTkJrRUZQdGV0VzZ3NHU1NEpuaVZnQzZ2SDZwb0VpamNkY0wwOGhyUS94b0k5Sy9hcy8rM3FUbjl6VTVrazJtWlFsdkUwdjdVd05HU2M4VHVMTlRDMGZpR2NMc0RmV0QzbnRkYWR6SDVJalIzTENTV0V5TzM0UkhLcnFrdEtMaC9JS1pMOEE5cFFrZnMvbk11c3lQNlB5VnY4VnRaRk1Ubi9wK0J1RlRvR1o4LytCc2lxOXpmSXBHQ3ZydGhHUGRFanRud2ltZHB2WEZXUUpIRFVoRFRtd1BKQWNEUVdqM0tuaG0xaEY5WWJ1bStBRWdXb09BTElBeUNyVnFlQi8vVGNHcHdRMXZJWWRMOWo3dUU0Y2drMTRZVzNoNkRXcmRPOEp3S2kzU1cvK01YK215Mmk5cVVMT2VwWUdkamNXdWVFYjhxMmMyUzFNN2JJblU4aTF3NlRaU204K0ozVXJyRjJ0WmQzdldhWjdHK0duWFBWVG5JM3F0UGRNdXNOSm40eFBkK1Q3ajRhOUVlcjB0b0pxSllFV21Hd0NnRUFWV3BnaERKRTBRazV3VDBnR3FVSzg5TkZ2bmVKLzRDR2NYdXhGZEFLUWNHdXVocHRabCtJVVFMbTV4UEt5V0dPeVNaZHNzbjIwZlFBWmh5UkJrcUMvNjEyZ21sOUFYdXdXQ1FPWDlrdFZwQzFUUmF4eVVoSmFtR2J3RmIvM3dBb2tsWkp6bE9WaTBjQmNFbkdqWXRRU0ZTbHc1QmkzQ3pvWUM2amRFaDgxazk1OFhoTmw0QlYzemF6QzVnTElBaVhrQlJpWVBVQUFiVlg2NmxrOU9oeXVBREFsUGlvNnRaSDNRTVlzV2p0N3JNNURIbTNFaFdhY1BDdEk5cnJ0eHMvdVBhMEd3bmFmbXJ0QmQxU2xWcGlTODBXSnlUU2VTOEh0cGxuYmVDTFU2UFJWb2VLWVdXcUYySy9wOXRPanRoLzNhczhFdDBMLzY0Mi9NSG5LR2RYU2hHd2Jsa1l4S0NOelVReHlaYXVYUmlNL2FkSWp5Wi9kSHd2NlNnMXRvUEE3RllMbnVZV0xNT1hOUjR3Z0ZVOVM4OEdKckVqUE1Ha2lHN2t0QVBBdHhhcnRrUCtHWlhqNEdTSTJlSmVIa1dONzY1UmtzeUxDcXJ2UTlvZ1ZRd24rQm1QUXRFWjhrVDhqMkk5b0ZoSzZDb015dkZZK0llSlQzRUR0V2dPWVlabkhoV1ZGbmt5VXYydU9mNFVnbGdNSjk0QUZQS3hQei93U2l3ZU5lNkVIbG9zcnU0TENLcGgwOGsxV01leHhkbW0rSCs2ZUZTRURkMHFtZXpOUWNhd1dDTFprZ0VUV01YSVhoOHFZUmxoZUVMMlcvbkprMWFDR2lwZFhUdUg5eHZVZ3RRejNnZnozRHdiWUFXbHh3ajh6eUw2czdySzd3UmQrbTJIV1Btbk02TUJDMnpwZmt2SFpFT1JlY3NtUjFjM2c3V3RETWthTDVOZG5keGFUY3FOS2FrNjRCdmZpcE55RzhWUHBuZllrVk1qWmZHbjB2M3hNMGY0Nm5FRHhxZURrK0taS2F1VnFsZ2JBNFY4VFRuVUM1aWNrajFuVmpDNllUK0RhTGxiWGEyS3RWQnFFeHFSY2xuNEJvcXlneTk1eHUvV1NNdWtOaC92SUdqckkxZi8rMGlyUGJKWDkvWkVHUFcvcjVYYm93VktibnI2SDN6cEtDbEJHZjZxYVhuRXJsN0EyalV2cEdNRTJBNkVsV1hmc1hqZDlnMnE4SzNjR1h3U1A5NUhkNTBGQWxhcHdaTkJ0cUcyNjBGYitiU1ZsNHN4dTlZZ1EwY3hhMmhBMnNvWVByZzZmc0t6NEZvT2FSaThqcXl1UTBpZDRlR2pxSGpOVlJTaU9SSnZ0SGprZFNWTktiSFdpNGpRV21YWWRvUlFhRFI0b1AxMGM5SzA4RlUrWkxwbUorVjVhR2s3aDU5NzhlYjFJWExwM3dXNGZmMGJrUGVsQndMSnA0dzFudXpwRjFIZzZGRjRvVWJzQVZ2cEg1V3Q5SWlhc1JZd1JBRnNXWFVoUFNHR0ljaFZRNnNKZjgyVkdwTG0zQzFsYTFNeVhISWN1aUprYXlWRzM5VkgvUVJOUWdqbUpydnVSbWkybDZheGQzYW5xMUNRTkhSWlYvN29qZ2ZndE1PSGRMTXhCVDdoS2RGeFVyNzhxTytiSVZhZWF3aVBTaytrQzNkaTZoM1dsL1FGbUdiOUd2RGxWMDRGUUhKME5xNElYWEhTNXhacnkxYmtMTm9QVVZwVUVkbzVvemZleTY0cmUrNk5QTTlPK05ieEErOEJwNGFSWjJoVGxCOEVJeG1Ham56RzJQYTVySHBuNEhTWHZXNjdQaGs2RGFyUmVvdHFTSXpsa1AxeHM4VHRZeFdYVUtIb0pFZ09xczI2LzV2K0dmT1gzMVdoQlowSGhSbkp6QnRRellkN1QxanVRcHgrM2w3OWNWeURlOFI3V0hkbXFuVXRSZ3MxOG5oZjd2b2ZkNmxtZHFKbGxWMmdGNnIyVE9iRlY1QjMycC9OYnEwNVdFM1IrQ2hsY2JYa1hiYkhGQ2toelVWVVV6SGY0TTdUeXpuS1MvV055VmVtRy80SmJ4dkoyd3FsR2RUSzJrSmlpN2h5cFNpbDF4SnFzakdyREFDOWRDSmwrV1lRcFpSUFQ3NkoyS21mb3kvR0xzTCtpSm15NzdTM0pwVGg0UXV0Z1EyY1VvN1E5WERyNGEvRk1zemxCK0xBRTR5L2JoejNJL0hSWTc2L0RxMlBxTHVjbVhkWlc0NWZWY3h0YjduQUxtKzhrSlY1dlV2ajlVQTIyOWx5a2ExODdadmdTNUY2bEZtME00T3N4WCtTeU1KUWlzcTlGdGtjSm1NbG1RWnR2Q2RIRThQaTRybE1QeFkrakJVdHZEVmQ0ZGhrNy83dm1wRUxmRkhoSGZCbTFxbGVIL0xESCtJWDcyeFYzTG5ENWRFc21iVVRmdzJEd0VseEtVNUp5N1pXNVlFaWlweVJYQURIQ2RUV1pNOGNuUHBuTUhLZXJSTG12S2FXK0RHSVlYRnhYQnFSaVE5alJRbC9UVlpzWUcwQXR4eTYzd3c4NlF0d3NuUHdHY1RzbDg0VzBLa0tqNzhGZHh1bWo5V3ZNcHFNYlFLTmE5ei81ZDJ1bXhpdldxSVc2OFZVKzZSSW8yc0lPeXdtcE8zYXFUcE9Bemt0bGRtRTF4MFBjbVRoN1pWeE1lWCtYK2JkTjRpdXhsK2ZGMExPekx2cHpkRGp3WmNBWGxNOGMweHR2VkNFOFBUVnRmcnJPaW9Ddm95UXY2akQ0d1FaSU1VOEVhR2E4N0dWMmR2K216WDFKTDZ3L3hENUIvSGZEdElYUXRnZnI1YjUvanFNRjRMNDJ4bmpCNzJTeGVMZE9ldVhCL1hqZHVzN3o5aWEzOTVwNDhXMmxMdlZQY25yWi9jWkNpWkJ4RC9PM1czTTRvS2IvUlZKdmxvUm5aQ25vdVJ1RWVwcnlYSWxYc3VuRVhOVWxIZ1FOa2h4eW1Uc2JtN3lxV3dzSk5VNE11bXNXL3B2OG1yYlNDSW56WkZ0QnFWQmJPV25NK00zRW1SMVZxV3FQOTN6OWExS1ZQTUhtemVpZHFCa3B4eU1qS0RaLzc2WmRpQ2FweGZ1YnlNK2tuL2IwSEtRbFpSWGt1TEdnb3krWTVoOXpRM3JDSjVBU0trVXZMdVJJOXpXUkRUelZDSkVCSWFuWXFuTWo1QVlQbHZqN2ZjeU1KRWFWb0pnL1dXeExZQkxTWTRrY0FNamxON1ZWbTNVMUVpNVUrUW1hampOcnF2dTI0ZUtQZTBYK1dsNzFLVzhveU5wQmVZVnFQN3g5bWpQWStwOTF6SjJxZHQ5enhZNXltNkVTejFDWXUzU2dsSUxCSEtDNzRzUWtnQWJGb2xWUnRCWjdIQWl4eU1zRzZtQVBzTGVVbVBkZ2pkTkUzM0hHT05lZk1nMXJwdnJLN2N0WEJBbjN0a1FIUjAvNlJMNzdpbk5zZmgxUkpuMFJ2QlpoTXp5Q1dMa2NvRmtSdFZYL3V2U1VKZFRaQUMvUjFCUnR1K0h1SnFHS3lFQy83SmxKcUdMeEFvV0IxSmMvbVZUWDBVSFpyWUc3cGEwY3RhR2Q2L3hNbCtUQkg3aE1vZXFhSFpBeWNhMWJIYWN5ck9Tem85TlF2K0phUDZlV3RDb1ZDYlVEREJUVENBMGRFb2V0NnFwYjVGU3RlMjZWd3hPOW11MFU3ZTNSS2dKb3ZrckNlbXRYZzhHNDBxd2xBZ0NXUm9tS0I4Tm9EcStaVGxmY2NmUXF2ekZ5Z0NKTzBaUDVLYndhQ3lrN3Nyc1ZqeVpYbnA4cHp0M3F3cHM5OVRuTnlQWE0vZEdrY0IzSDJrbnhjRmVDWndRWmhTMmlFWE41bEk5TmJ6c1VkUGdUUlBueXFKcU5FVVdRRmVYY0JmUVpTbDN2T0dMaWcza0hZZ0hOVXZWRUJ5dmJJaW45S1M1d0dTSDRCdlpkcHVJbnVuU21CdjFRYkFlOUVFRXoyMWZwcTVuOWp1bHRuNGlVL0RqUUlpaEZqVm9ub2pkbWJhbDkrS05MTTB2M25HQjFLTGdFemFsYW5pOFNWdWtnSnhxT1pOdEhHdmNHTVVoSlFkNng0WFFOYUhqNkVaRTg3NkNmaXNJL2ZlZEQ3eDNiOGpGUmk0UGNPNHM4OS9YLzI2MWc1TjdrWnpNMEpBS0k0bnREK2xiTzczUFpvNWMrUEw2QnRPVjdtSW9NMHlpUklaWVIvT2Qza3dxWWY3RmcvekVRL0FTMVJkb3ZLM29OQWIraXZIL1o3bTV6VXZJTllWYldLWllyOTVibk4zNk9nT1B1K1RuOHJDMzhYbnFtY01JV3BXL1VPa3ZjY2YwU2QzVDhRMkZvUjNDTXRtQnc2b2NHNGpDSWxmRG9SRlRSWXhTSXMyVUFTN1pHa2dpL3ZiQzY3NVZhSjFKcVpNOE5FQks0WlR5TlJsZTk2T2FKeUs0YWdiSmpSSHZQODF3S0dMUnN1RDlheVJRVFpHTlhmV1YxaDNKYW50ejJFS2xMK3hWNVhQYi9vV0VmZmlONTdtMitIaVlhNUd6MDNQZDJzTlNqRjNrSnB3ZTdEUmUvbVpGTzlOMkxpL3BhbU9sMTZwb3RxNzVNRE5kMkVodmdjUlo3ekxsaFZoRjN3amcwOFB5Y1kySVdoOVJaQ29sbUU4UDdiYklDOWhhRmVkbDA1NTVGTGp5dlBUOFg0VTZhazkrTW40aDZYUlAxK1dFS3RWdTNGZlpCcmtRR3hJb3h6TVRmTFBReGNHUlhud08yUzErNFJZd3hMVW5meTFYa2g3a1RoMnNYbzdVUnVKL3M0M3gzNXRKc3QvRkhtM3N2UzR0ZisyYlFLUUlQVFFXTGRGVWl3d2JPMGxEZkdLejIxRlJPaXNMWld2Ty8zdUlGUnByRzl2K0N3bVBpUnZ4R211OGx5SHVCYzZkYmY3Nyt0c1dPMHNFWXZtNys1UE9FRlptUTdKblEyWnFyalVuT3BhQjUrSm93b0JPMStzSThLajNMZ3RLbEd2bnYvKzBtWFp0WnEyWG0zNVRrdjFkeDVEZy80UGZGeVl0VE1UR0ZlNEpHVTFodXFwb0lUZlZlcDdYcnY5d2J2N0hmNi9YaDYyV25CaXZYMmJXNnlldkRkeGhRSE5wOGVtKzFWYXRkQTR1bFlTanhxT1VEbnFiYnE5cS9lT01ZdDBqUEJBRzBYNVBUbWFqU0xWMTNSWUgwSE9VZTdGT2p3eFlkNkJVSDAva0c5elQ0ekt6VUdGaGVHUVRQQk5uMVVCenZMeVpjdWMzMUszN2U5WCtzNDJWaVFWZ3N5VUsxdXg2Q0F0V0hpZHRENzFqYjNQT2U5cWV5cmM4dUtiWGR0RTA5UTdtRE9MRTlHK25XNm02Z3YvVVhBSXp0L1FkL1VzNXgxOGVHaGUvRFYwZTdtcEhjV1hXc3hFQm4vMTlFNk1vVlo1N0xZNkxlQ1lkOEVpN1UyWjk5R0VQQ0g5MTI4Z3hmbjVDbmc5VmFoc2cyNlAyeGYrRnVQdnI1VFpsTjFFdjFjcTlibVpjbVJoNUw1KzRET3BxZkRvMEV2ZFA3WkUrTlEyckR0QXJEVVlvL1RxYXhmdmNaOU56SW52cjJJcWt0b2prL09EdDZMM3h6WXlMYkdZd0FrTnluTUdWUXBTUUpianJzVThnL1pnM01JU0hIU3JMTjI0QXhVRzBUL0RpbWxnZXB1elZyajh0clBkamtCaXJGZThTZTFadWRqYmZENVgwWTcvT21qQk05ZVk1eDhUVDZrSk9XNVdkTmZ5bkxQZDBXa1BoelBkSlRUdm1taE1mOVptNVlJYUlHMXBVT1gwajYvcmcwQzIrV2RNckhNNnlKTHFHNHJYRE5wcEE5T0ZwL0QyOHY1UjhUOGEwS25wcFZKWkhlR3g3ck5pSGFWUkwvbnN3MEJJNzltNS9WSXE4dS9RNnU2bkVHWTNUYVpNRU44c2F4OVBOQmxhYzBRdWs3K20xQXFxaXF0eHZKSjZwN1I1THlLNnNVNk5sY0hWa1BQYW5CWGtWbUhMczIreWNxKzMvWkpLNEljRTV6cDFtKy9ra1A4eDc5d1RLaFBNWWwrTW5kOVA3bDdCaExURnRia2RaSWQ4SS9mOERGVmlFU3RUZUlRb2pGcU41TjEzb1NkdGZWbVljTSs5bjFUcnhlRjJGb011S1NaRkZacUtvTTYvT09QcHVvbGNPZlk1OWhtdVptM3MzNDgrQXBXMmlNdGplTGMycGtBaDBhSGdFa1psYkdudlZvakJsY1l6K1JhNmJuWURHOFVSeWI1SmZyR3NJTk53d0JoYVhRcVZnQUE5UUNyREZGV0JMZ0xZQ3lLS2xUc3hXQUFUTUtSbTREZ21zZzVjU3BFNllycXFBdjFiMWdPZXJSc0QwOFcwUXVURDhxd09HVE1KZEJoWm1TRkRGejBscUFHd0pWSStDcVFuVnB3WjBLNFZRUXdxbE1HcEU0Y3E0Ty9WcVprNFZNZlcwQjduSGVEZ3pBSkR6TktHTFpuWFBkTnNLY3huUzBRQ3I5V0tFR2trVVFVeDl4YVhOSElqTXhsS1k5bW5MTmdYazlIQzdKeEVRRFNNSjN6S005bTl6VnA2REkwd2FsQUNBVDc0aXdaZkFDdDBJQU5naC9UbmdydHB1OFFFWEFpeUFXSnN5T1NLMUY3UXI1NDhUWGY4MllGN3FLYXNrTFFVOEROTW1nMW1kZHNBNkJZbDdINUdSQWQxQ2VCSUQ4UWp4SThGbllLd0VDWmxrODJwL0hIZnEzMjRsandlQWNlTytjWjVRS3JwT2hKVTlydGJTcmZJU281V2wvdGpXREJTQW0wRTR4YVdJQktzREpRWVVNTXFQR1RlWVBSblljekMwS1I5Y1hEdk96d0FzQnBnem1LZGNveE1KWFhRWHZ5TEJkdzB3WHo5THNmaWVpNGZ5aTBkNEVzWWRIeDQ5T3UybEJBd2tRTyttRzNiU3E0T3JrendmaDNZdzZQZkJRbTh1am0xMmtsMWQwWndTYUEzaUFCTmdkZ3EzRnVSNWFQSDJ5bkc0dzdqS2xRaEkra3lVMVV6WFJqejFQTGVVVVBzckVTckRqamhpNDJxWGoxSE1xWVF3alNvYkl1ZWc1dVZMbFROS2syU01VeXlVSnpLOC9NZ3FGQUprd01LaEtXZWEyTkdKazljc09SZU1VS21xWUlGRHNiRStodGRTQWJING9SZEpsaDJjbkJ3TEdJcTh0RmR0UkpJRHU5aXJUdDhFbUhUYy9WYTVObXdhRndRdUhZb2lzNWoxUC9tZHRTS0FiSUJ4cCs5WWYrOHJIM3BsazhPckIvMS81Rm8xakhJcE1HZy95S1BoREtjSzhYdGNiRy8xTHJTRlZqNW1aN3NGcmZvQUhxQWRKY3pjUUloalVDYlBBMi85SVluQU1CZHpwVFFESWRjWW83MWlJNjRhbEwyWG5iYjFOdVEwYlpvS3dmRHd4M2VLRSthdm1kUjVqZ3ZHWUZoWk5ia1lkUUpROWlwcTBWQ1Z2M2UyRTAwVHkxNGVRNFdaT1dvL1BXbzRjbnpsUzY2UGMyeHlqMWtxeVYxY1BOeGxzN2MzbU04aGxoZXgyM3ZxaXVPdWEwb3E4QmY1MlF4dUNaQ2dtdUVOa3RLTzNEczY0VHlITEpDRnFBR3ZoeDNLNytzQmh5cEdXamJyNVZxeGFSNk14ekNXS0ZwTlcxKzh1dmQ2dUNnQnNaamtnREk3aUNubGFWWENRaVRKMndENVhMNS93QzNIWTdqRkkzVk1XQllvWGlsT280ZldKUnFLSHNweFM2MkVqT2JWcmtaQ0tKS2dYRzZFSDZ4dXhpUGU2L1g3Z3pqWjNWV25jTU1HTHN2RE5EUFl3SEZIMDFxNjEvWTY1YzVGa295bGhyVlRVaGN0NmpxTHcrbHhvSUR6SUZza0ZDczlFOUJtaXEwNzM4TzYwY2hJS21kT3RjQkxyUzF4amdMOUw2dzc2S01kMDJ3eXdWRklObG16clVSTkh4K2N4RHZrbWFSWmpnbFlRV1ZhRDRmV1lqVGZ5SjM2SnlkNWp1T05LYnphcHExWjNsbXlpMzhVckpMVVB6ZzRpZVArY2t4MmRaQzhUa2VsNjZMUjV2TERRVWV0SXVRNHFIeCtlNHZIZU9vNGxVM1Q3dXdndmpodWs0QmphODhZb1pTRlRrNis4TVhaL2YzbHN1ajJncG1KU0dPSXZXWjg4UG1BQStzQUwrcHp4Nm1IZ2dNUGVtYkdxZi9XMnlva2YzcHFKeE9JRXJYOWZtZUNuWUpscnBETzJhTEVUUGp4Y3RtTzh5S1ZuaS9od1VxcE95OFQydEZvT01TeXlQVWEyYi9LdzUrTUx3RG9LWGxtVEwzQ1VvUzkxWTROZjRGQUFNcno0enhuSkp2Yy9vT2tBWUJmbjE3OEJQdzdaei85ZC93djRWSlFENHFFQVlBQXNuK28xMlVuS3hia2s4Uy9pYzJTd3pzcDdUWlhoZ2s2R3VpMDloYVNDWmRXM0YwWGV2Q3pmMFNYUUdHa2hyaEN0YTNYdmcwSzQ3dm1uZGJFK1dYN2doMUhhZ1Z5d05iOWduWGlZZ1dCbEw0TFliVHprY0RrN3BGaHBYcFlTbFpxZXMxNEh2TjBEbFo0RG05Y2FEQVN2VEEyaU9WeTlXaHR0K3ZlK013OGZjbUNGWHU0alVDY3dnb29lNjFVVzJJaVQ3Y2hMNmJ2QTZuWjRHWkx1SVRuS08wcDVUallXNzlvYUVKc0ZuS3Rvck5nOWN5T2s2N2hENkZ4d0k5WUJobGxLWDk0ZGZFY0NsdG80YnJncGMvMEs0cGVBOG11bGxPVXlpUHA4VVpBRDBIK0R1Ti92bUlyZmpOMlVtcTdPZmUzb1lndTFHUnYvYmF0Kzd3VnRQTVgrUDJYOUxLZ0RIMllGQUs3QWFLanBnbTlTajIyK1A0eW1LR3pmd1FRTWNnME1hTmNKTUhETEpMa1JqRWx4YVFFazRjVmZ0RG1icWtLZ1FBa2NweEFRQ1RuQVM1WlIvVVYybUY5K3k4RFFuL0pLYUNRU2pSa2swa1dKV0R4aGVnRkN6L1RWTUtoVUpBUFNTUUZLSGJDUmRPR25CS25OVWdrcFlLc25EVTFoZXNVT3hRbUVnemhPR1dTWFkwMGN5cDQwcHhTRjJKQndUVG5vU0pqSy9tVXFFRkFOcTRwbm42NUd4QXFCUzFJejhEYUlDV3VzMG5ERHp6RW94TkNOSnc0dENHTjVkUjZZNFBEQjNsbXdDUkVCYzYyKzhZT3ZENmtmR0xTS1ZadzJ0UFBoUStjOFQyUko4a1RpY3pha2tNVXNZaTRlSWtnWWs1M200NGNyMWJxRlBNSDF2U0F2L1pQTkVMRS9BM044dCswb2Z0UVBqaWZnQmxZTlZuL09wWDFyVHA2MTl0Wno2SmorOExJdW1jZTFqV1pZanFuUDR5T01RalRQbXF5dGxGSDZ6aVZ0WXlabVhiUTBkekNYRzZSbU1aZXg3WjJpb1pXUjMxN203cE9SMjAzUlUzSHBycTVUVldqbzdMV1VWRXpLSzhVbEZWVGxGWTZTZ283VEhFeGdLYlFVU1JXWWFrTHluS0gvRElDZGE0akwydXpjak9kazVLVm5lcXN0RjZYbWJMSlNQQTZxa1JIZXFJaExYSEZwRWI1c0pSSWh6TFd5YkhPVW9RNktTUkxIbWlaQzB2cWFvblB3OFIrQXlKdkIrSGdYaVlDSzdINGxrNjBxc040bG9JRVczTWRyemxPVTEyODdZT0pNNk9PTldERjZKcXRvSTZsTk1EVXlzT2lOUjFSNnVzd2x2a1pKWXhEZUppUW9FQjBDeUFwSUJHZEhPU0ozdmwzSy9ZVjRvdHdkSkNIamo0WW9vTU5odUROQWUrTnhYZzc2UER5bk1MVEl3empnY2ZheTAyc09RYUgwZUZtejhiVk9RRGo0dXlDY2JiWDRlVGpnSkVKd2ZhTTc2aUxTZHpsUUNuK01YK3VQdWFDczQrcDRDSTVTZmFGeXJGZ0szUExhK3k4RFpuV09IeEZvWHhKSVpWdENLcno4anpsWDlOUUN1VEhxT2VFWWNTem5Vd0JoWVhTV2doTDg1RFhoUE5oS0dndGVtNVdsRUY2MEt6empQbVhPRy9ySzF2VjJ5YzNtckdKWVg1V1FrOWZXcnhyN2oyOW0vcEY3aDFxNzk3bE5tZnJlN0JXUEtEYzFyMzdRNWk3K29wbG1sRlA0ZmxMVHhRTEdBNk8zN2hvQngxeEIyWjQ3eW92WVJrQ0JPY2YzTXhmK0ZRR2JjNEw4S2wxbGxZPVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xMl9fXyA9IG5ldyBVUkwoXCJkYXRhOmZvbnQvd29mZjI7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R01nQUJBQUFBQUI0c0FCSUFBQUFBTitnQUFCM0hBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdrNGJoakFjZ1dZR1lEOVRWRUZVVmdDQkRBaUNPQW1mRkJFUUNyQTBxQ1FMZ1JnQUFUWUNKQU9DTEFRZ0JZVUdCeUFNaGhZYkJ6SUY3Tmc0NER4QUpiQjcvMGNVd2NaQlBBZTh5LzYvSEhCaktOVFE2aGNrMVVTUkZDbXFPMTNNcVdsdEFuT3E2WVF1TGltRW9sOWh3YUFvSG5zbFpsYVEwVE1IcnNRMU5vV0FnbnRGV0gyejhtbDJQOEVnWC9UYjg5dHBmNG1MN3cyWVl6UTBrcGorcCs0L3o3MEN5L0IydmNUNjQwZ0JJT1VENFlNQWdRUGtZTFdUZXV1QTAvM1pxZ3UxU1Uvb0Fkcm0vMUhHd1FFQ05rcWtPRWxqYzJGaTVRa29WbUJoWUtBc1VpZEc1YUxTbFV1VWwrMSt1TDFvNEluZXExNTFwck5INjFmd1FnZVJ5ZTBVei9kL3oyL1AzRE4vQmEwK2FHZ0pCRC9JSkVvRGpybjB6Vjl6bjI4aDlJSzdBZnhNbXlzY2tCRVJVUldTOUlIdStLdXhnRVpkcXlTT2IvL3ZJL1FGZ2MybE9PQ2lIdUxkLzZ5VmRpOWhyMDlUcGNCWC9iQm1mQVllUU5OQTFsKzlCbW5JNVhPQWovaHp1endGZTQraFdnQ01qLzh6bDdhek95QlduR3l6eGdsbm51V1VpazZoY3RPNUtYZis3TURPeklLSHZmTXpjK2lPcUFCS0hJcWd1TUlCSEZNVmN0R0ZoRUt1N3B4ekcyTG5wbmZSTlNwNmwvYWRyOG1Ua3R3YWJqQ3BNYTVPQ0dOVWR3MysyMFc4cWdkblVsTGVQY2F4T1RBdTd4UXVVUXJhejQxQk1IdFk2OU9Rb3laTzBPVnZGZ0VGMlVCdWVIMEpaRzdmTElnUGttM0xxQVloY0lJY1huVENEZkwzZzZsVkp3WUc2TzhOMVdVQS9WRmRVQXJRUHdweXF3SDZaMDZORnFCREErQlhCeDV2QU5pQUJpa1ZtekE2NDNDMjFyb08yWkVFRnBzNFllUzhuL2hvUU5QeldUVFdqYlp4ci9Gdytra29QdVhQcDIxZmhlUXRBS295Z2VCc1ZSdnMydXVYZDhOc3ZqYW03YnJlNXNKZTNvTzRXOWRhaWtUelRxOExBU01GV2xGbHI2bUZQcDhzQ1JOTEhidTd0K2EzUERWWll2SkhQaVovNXUrcC8wdmdIQ3BTWURwWk9SUjFLa2Z4Q1h1WG5sY0ZKS3RKV0xLUkpDV2JTZVpVSnlteDRIN0pJYkl6R1NHSGs1T2xMemxmcHBLcjVYaHl1MXhPSHBiN3lmTjFkZXAyUFd5RjN5WSsxOC9yMUo4TXUwaGNpbE8wVXhWaGlOYU9vZURwYkQrQjNXUW1wVEpoVjN6YzlBOU1Ed0srS3VLSWxIdzlyZkFQaVphWkNJd1RwVXluRWN0Rkt6NW5YM2I2eFFSU0VtcW04S0FvMExFRUVpbU5tNjQ2S1dvaGoxZTdGWUlpeFNVa3psOXhneGczdXhPRzVNRTZqTllHSjV2bFAyUlBPckg0bXBTMHdCdjJUOGJGemtMWGUxd1dBOUcwUzlrN0dTc0drSEtDNVZLaXlhYU5teDFJdk9lNURUNUkxbmVGVE1OSndMN1lGd3RpdnNPK05RSjRMaDA3bGxkK2MrYjJKRnVPWXRyRVY2QW9zRXdhblpRbEpFTkx6TWV1aWwwZHV5WjJYZXo2MkEzUkc3K2VHRUt4SDRVOUo4NWN1RUlIa3N4MU1FQ1Z6TXArYnY1VU5MZkRNNVhvSHRZWEJ3RHpqWTI4eFljanB1MXBQM3J0Y1VzQUpzZ1RBR2dKQUNEcjJZc0FzTkRRTTIwSmdJTXp3ZkdSUXp2VmFCQUlBTTg5TkRVSUFQUVB1UDBnMEFDajJjLzlWYnFJeFVVKzNDeGw3ZXZKWUJuWUNpRGJVRkswMFR5dmp5TVdIeld4MSsxTmUzZk96UHZYOWI2dlg4bXY0bGN2dEdnS3RWVTI3aGhYYllGZjdzSnFoUlQyYithTjgxcTlROTQrVC9Ka2lyK1QzK1JYK1NXZjg0bHc3dEdwWU8xRkhEYlhTeElVUVBPVGVCdXJWeG9OTXJkUHhYVk1IZUtUQ0g1Z29JTDVpekdRbUxPSG9ObWl4N2w4Wm9acFhZeXJyL3VnUVUvb3dXaTNmVVl0YUxCb1dMdERCdlJxdFZCbXNZVUJnbVlEMWNUTXg2dmNGcmJCb1orNnk0Z0pjMDVvMUtUVG9GbEhQYUV6clFaN0dBMHBWR2V2SnUzNmpKbXk0SmdHTGJvTkhJd0YvbFRtdlNaWjUzdGlHN1hMUVVaOWhrMWF0TXczdVdPMEF3N3JObElZUkFTQjlKcDE2emRtMHZFQmdZTzN1MmVFbHVNSlo3RmFnK0c1YzJiSHhrUkhSVWFFaDRXTzJiWFQwTmlncjYrcnJkRlZWMVZXYU12TFNrdUtOVVdGQlZrT3k4VThocGN2bmorN0tMMDhQZjk0TmgwL2Vmem80WVBSY05EdmRUOTR1empZdnl4UGFUTEFyZFhCNWZVc0plbkxITjZoMmlDSEhrQ1U4bkV3NHdoaExIWTBrVTdiV09zTld3UkkxOW1zaUV2dHBYbytrR2NKQVRUNy9rWlRIbzFMb1k2MkFYa056VzdZcy93MWZPWlVCQStjR3NNdTIzMkVSN0toTVJvQytUSFNYcG1BV2EzdVRoQ09xZ2VUNkhoME5mRExHbWFjWjNRZFc1WlZXRmN5T09xYmhWWTFMOXRiVGozd0FGVTU1dVBheFZPdUNIU1ZBdHRlKzM1Z0hleXczbWhhNFhyKzh2S2VBbXlQQ05yeC9JbG9YMDF0TnJmMlJIamZIYU45aFNYdnErWVlOZmlLMkRicWlkRk1CZjAwbDBMKzNrSXBWUTdZOXhibFZ5WWVDRTJmTHFBZEFsa2NUSVlRcmt5YnppYnlpWWxwS3Q1VXdRK1hVdDdSc042ckNBdHMwS1ZGaUxDZkt6RTlJUTJPeUh5Z05HVEVSTXJvUllZeDh3MHV3UVFnZHhra1ZNcXg3aDJvc0JmMnd4RzMrRVNpZS82ckdubWVrTVdFM3pKcUVZWktQS25zVXZsMTJMaXBwT1FtVTZPRVIxelNlWnl4dXhEUDkyNnVCNWFzMzNhcGxOOHlITk9KSFhHSzV2SVZHdlZPNG1uSGRkb1ppMkNISUtvRmIvZ2FDVTZ5aGpBVnVtb3cxb1B5N1RSb1dITWs0WlZobnc0ZTFNYzdLYzliSXgwWWw4Mk1MalpPblIwZm5OWTNxR1ZGTG03SUxnZzNXSEEzMktzTTZZQVBuc1hGT1NtdkcwaU9GaFZkSFc0UUlzSXZoTU9KaFVza1hYNG51NU9JZFZZbnhhcUp0R2hpVDd1YjNUVTFpcGFCRG52OEorNXdoMnF2dGNkeklvUW44c3FzZllUdElYQ0VMSm9tU1RTdDliVzhVYWRPd3JSck4rcWpjUXFQM1pNTGVTRzZrTFFhcE5hV2o0c1liOUsyaHEybVA3VVliSHRxcnlOVkhVSjRjRm9kVDBWeFJsWU5jYVFsMlQyR2RBUXM4QkdVSlgzN3JCVE43dVpCVGVWNm5IdmFvVVUwdFBCRzF4YmVyclFiOVJ4UU5yQTlNTEZRY0hmWGJyR2VOcTRzNW9IbmQwOE8yMFozK2dyd2RVQUlCanhVUlErWW1qck9uYVVUTmw3VTI0bUJpVmhhK3ZvU1lIYkl1SlVaRnFVNlFUakIwNXJmZWhNbG9ranhKRnJmRjhidUY5MU5Pa0M2cXpRTVBBbmR4ZUpCZzRlOUkrOHJvdXlTMnB4djhKWXlHajNVNDJxYkxIdXhaeEs2MlpHSE1keWFaRzZzaC9TUmVXMXNqaUwzckpZbjRsRW5iaDlNb0VXeFlKY1hwNnJNVXZEQUE0SG1sRFdyb1NacEhXc1c5TG5pU1ZISVlwZENPdXBDV29DMTdsTkZ0Q2hleFJYYkd6dzZ2ZXQ1c08rbzBnMkJCUUZPYUZWVU5hbUM2M3AyRVpTSDlvTUZVTS9qanVNS3RxM0xzeHo0aUkrdm5nRkpxMHlIclVlSkFUK0MwMm9WWTc2ZC9VS0xEbUVyT0NoM3B2c3JlN091WG1LcnlEejJ0emdQamkwVjFLVnlWdEhjd0FGaUFKUy95ZDFNVnV3b0wxM3Y0dkdJUzF1NzdzRUZFNCs1akhIak55ZGdYakJMbGhGRXludmlwZm5JTlF2a3ZFanpaUzVsS1FVUUpEVUlLU2dFMW5EV0Nid0ljM0ltQm15K2VXQXNBSVJmbWpaakswNlpRcW5YT0VNeE11cFJ4NTBZUmhKUlhqTHk0QUlHdS9SSStFOFlEd0dveVJIV1ZESmNBWk5ZNGQxWElSaVBwaldFeUpzMlV6VkhFMlFQQW9QQWU5WFNLQUZxS2xacURMbUZ5VjBiTndBMnV6WlRNVEEvbkNZVEtDS3JBTS95TTZ5Y252RmNxV3FPZW8zR0RBRjJTcmdmT3lUcmN1Z2VkTCsvNU1qdERONmFhRkdVYURIKzB1aTZFR3ZaN2hyRTRJMGpZY0ZwcjFqK2p4NzFod01EMlhlaXZNdFpGeXJzd2VFTUtQcjV0cEpaa0ZaZ0djdDcrRmRHYm9wckNZbzdFMU5VMCtHZXFLMDRQcXA2REJOaCtaS2UrVVNBbTh3dEhCd2g0Z0NxVlR6YkwyMndLTnNudG54OVdlYnhYSGxLdndOaUppUWtpY3hIWGhRR3hCVEdGRWd0QVhZQTczcVA0MUdvakNKa1pMb1dNYUFEMFNQd2UxTi9zM1JLUThpOXZ5R1ZEMGVBMEowRHJmcTF5YlIxMGpsMTVzK29tVmVRdU91SVJyQ1ErcVgxc2dObTFVcnpRSk5nSnJuSXBXVldjSWNvTDhMazMvV2FYSTBJYVdrb0FPbXEwZi9NS0YwSEFJUUZyQm1KY1VMREJNaTlGdDBORDUzb0FyY1RFWUV5V0ljSC9LeG9GQVBjQStFbUZnUXZlWitsc1J1VlNCNXZKbHNudGowU1R3V0V1K0ZMejVjOHVpdTl4WHBTNUUyRmVGcXJkT2lIY1BVbEVMSVB5eWZGbXQ2OUVYakZOZXBhbVJiMlR2Y3c4amhpRlp3L1B0QVUxaFpheVFEU2dXOFhIa05FWFBvZFY2SGNkLzhqb1R3UUxyWjcveUFRYUxvR00rU0paRURPOEVVOXVqZDYvNTREZXliZmdaZjAvK0RWb0VubDdVWVl0NEVtMnJ4dmZzeDk1SXJ2S3BhLzhTbllYZGZTNndnNWtCZEJPMXkwN1ZBZ0tXZ1BwN1hxSUNLZTNWOFlyNmFEMGVUTCtBRFRVcmlnL0ZaMjYwY294LzhZYlVLUVRwRGU2eDdVcnBwMzFLRUtnc0QxTmpObWFtMXhobmVyM1EvcTRPMUxkVlJLZmx6TEJPMHB5RTdhaWFxaUFjdDdqcmlhbUVMNnZ6SHZRUE1EbmYyNWV0aWZYVW9TeE5zTEtpcmN6MTlhUDh5b3NNMWZXV3dHdzlwbjRyTVhZQmRUYjNpdDdDQ0tQNm1KYzlrQkFSRzZDajVJN2xkMmFkR3BZYjVEMlQvUW1qcFZzNkVxck03WTYrZzVlc3JyeERGTHZ3L3FXMEFiTzVxTUcwdFh2d2tvakNCUHBuZW1idW82VzdZSXJPNExaZ3ZjSWp3d2dqSG1qR09EUUdCSWFCR3BoVHZMK0FUcnJQY2VBS29PUURRVmdKWUQ0RmNRaHdGQVVaNVBlMzY0Q3g3ZE43cnNvVkVJRkpnYzJMSFZFSlAvcVNmVGVkVG5QQjlmYTROalc0cWpjRHFxeXYxVjJlbncwYUYybGg2WHlHU1hiUHl6Tm5rUVl6YTUybXdPdVdkV3BrRVpnOGNjajkxanFTR1Z5UlM0OU5Ma25Zckw3SnVqTEpub0tsQkp5QnFkUk93N0t6aTZCaHBOcGxCdnBkbU1iVjJOUGJMcU5qd09ISnR5U3NmQ2N1T2FyM3IrQWJiVmJGYXFzL0tiK1dTb2NqbitHbGFCSnFvZVZJQzNUU2JJTUduMlBIYUw1NGhYa3VGSEp2NlNpYTRuR0RKUDN2VmZrTTFoQTFFODhRcmxhcEVNa0I2NzRWbjRzWk9QdmZERUtRbndNNU40NkxUVDBOU1U2bVdHUzJaN0d2TTNuSWRWU1p6QTJvVEwwU2ZSVnFINmN1T2FZbUx0OVVuTXJDd29mY29FWEhVK3NZcHROWWVjTWlzbnplWlp4TDYxM05YbUtNcExjYkQ5amd3Rm0zb1ZhRnJRWmFVMnBOVGhBc01rbFhodEplOXI2T3ljMkpYVmxIM1I5VG5HTllXeWY5NytnVndyNEphaldSeW1iaVhlV0dWTWh4eVdwRGo4SXhPa0xzV3JJUlVCMXFqeW9sZTMzREJvcXFLRnNnWjdSOFJQT3FEelJkQXc2WFRrTzVpWmNZR0dwNTMzN2dXWXpVcno2dmJIanU2aDYvRktiTmJvYk81WEhlWGVYUE1PN3VEejlTckQ3TWlhbUtDR2pqVEJlbEFKVFpwcFdZT2pXRzNFWWVTcWsxakI1UW1sUkhTYXFPSWM0OXFhMTVTWkJrV2w4YnpKVWFySFZjUk5vcVJvTmJzUW05RVQ0dUVRRXZieFBtRmwzaVd6SDl3SVphUStkWFZWbGdXbCszZHNNMzBCVnhsQ2NNdHgrVXUzblpaT0E4OTQ5RC8ya2NNS2JZVlpscUphQ29tdnRJQTl1M3JOMTFlNUdxSTNjcGJWamZEeEIxdGRpWm1KeEJ4QmJQb2kxWkFKTlNnV2w1ZDV5eml0NlFwK0J0NzU1cGhLUGFna1hGajFTU3VCTXZyNzdkODhJY0drR1hYY3hFK0ZDWU9qanBQbXlodnNyKzlZU2xTU1ljM1FhYy9Kc3IzSmlhbzNRSHJJMEQ1YUF3c09DdytSRDRmekk2OUFLVXRxNHoyQTRzUmo3TExaODVaWnBwZ1V4VG1qc1c1VFFhMW01UnR3dlJJa21Pd1JZSHZpU3RYeDFIUDBsR3VXZ2F5RzUxY1NxbzZPZy90c3BvcEpaVHdKcy9kR2Yra0o0RXM0UlZYR2pRRXN3bGcwZTFIb3BiQVNnbFB6UVNWMHZoSlVuZ1NFYzFiOVBRZFRlQWhYMzY4WDBCZUZWMlFySWRobjBBQklmVnZjVlFyQXVtaG1Yd0xLcXp4cVNnSU03UTA0VUs4ckJxemUxRGRBb29IUWw2Mm1xM0Jaay9YMlB3RlFUODE5QVFWN2xNdUw5SW54anVmUHgvOTFLQWJSZUFIZmsvK2hWNTZaRUNPcnl5NTdIKy94MllXTENYOGZuckY5ZUkwVmRUbnZsYnRNc2g1NVVDc1ZFM2tYdTVzVWVERTNGYVd4T245TzhsTUllQjZzYXI3QzYveUxGWkpNSkJFcEFjM2Fwc1l1NlRwRlNBdXk0YVZnMTlab2NjMEIyYnZJNnNTOW9WSUNSOC9mbElvdGsvNXZyQmdTNVhUeDQvTFQzR3dpalRqZDBuZm9tL2dEWlpsNy9GMnVZMUhiall5b1VuNlROcTlEdW03dHRjYUk0RHg5eTB0NkFyNi9admNSVnFlV2lvbkNiZlFUTWRoTjhHZjRKYUprWFFFdVFUUFdjZTNYUGFwd3pMQmtPeEtSWmh0M0NxdFRZOEJrdEJjWWduYkUyTW54UWpzZlBKWlY2MG1NOCt1TDNVZHB4VldCa25XZThDTkd1dGIwNTlITmRmOS9mVEs2enRNT1pXZVBlRkNIYmJacHhZUlVMMUhQbk5ROCt0c3VoTS9IS2s1aWRXcVI3di9QdXYvN0t2VkFoQzJmbFl3aTRiMkZSRHRTMzcxVy91NC9vQ3laRkZlKzB0UW9hbXI4REZmaTZRV0YvOGdKNThtQ1NyWjMvT085aHh4WFJRakRCcGM3QzNIeGF1ZFFOeC9pMSsra2IrWGhHR1pLcC9EekRVWmJ6SGE3YnJzVVFxelF1S1ZCNnBka3JFMWlaY01PS3RCZWRRR2JweEllcXZ2eUMxekxPdEg3WG5Pbms1aVVlSHpuZ2VDOXRuTHdxK3B1MlVZRWVBc3FUMnZuSXErRTFOcUcrem1TSkxaNU0wVDJIYnduV1hjSkw4ZkwzbGRKdSt2SElIV0FSaFFldnRWQWpHTWRIZHpqS0NURzd4elBZb1h0T0dBYkJuNlYyeTNkaU1YZHhXb3FGcmFSd3dSWmg3SjVJakMzbDdWRVV2bjJpU0s4NUx2TDFFemxJUmVpLzV2L3VrcjZpOThKL2RDamdtVnh4dk1mS0dnN0RPSkJQYmJKeG9nT1NldTBLK05sWlhOeUE2bmFIQnlxYVg3OVNPZTBqUWl5ZHNIOGZYWW15c3BEREtNUUJESHhYTWxiY3BxdHdzTXhxb2hKcUsreXNTWFpRRkZCMTZJMG1CQmtMVmRLMmh6cGtMZlpFeXBaQVpOdEJKTDEzNnBkTS9iN2srd3ZYei9nbDRwWi9pQm54NjZkZHNsRDlNYlA3UHE5TGhGS3JZdTlTUWlCVU1SeGRYUkhWdUxiQ1pGMi9WNjRiWkwxalBlT2tUWFZybTU4SERHdFVWZEVZOGRaOGFUL2IyNXY3Vi9jSUNCLzRaYSt4VzFQWHJYckk5WnVydllybVBBZGFkOThWTHFCTXhqRHNZckJKaHFwVFpVcnNCeEVKTnBOU1RjeXJjN2JIRWNuNzEySXl0ekpHVW1VNFhRdkdGTzdmenU5N2hORjFJYThKQ3lwM2IzME40Y1VRckoxTk0zZkVXNlJMM05KVTFWM0VtSTBMNmpHejNBYVFYRlNHVTBSSU4zZ0N1WVZoT1dLZGpSNzJvdXhHZG1HVnlnai9pTXRGcHdNRmh6em9ZUjROd2FXWkphTnhkLzluTzRXdjA1ZzZ3aVJoR3ArY3FTMmNIc1d6WndRZk1JZG9sTWxpTStjTU1jeVB3aEJhSkNERVVuN2xDNkNHZGVERXcvMVBqSGNXWTZxK05pVzBncVBmbFVWOVJDQnJYUDdpQ3h2UVZmWlVsWWwzeGVBSzdaRmZxa2NaS1J2cDFQdUhVb2VUczN4ZGxQSCtNbURDM21mY3E5VXV6alJXQzVCTjc0NWx2RlJLRXFESG94STJLTnljWjV4UFRqK1FPODdISE9xYW1acmtWWXlsdXVGTFhYUU1YU3crZy9aeDg3U2RUeWJ2L3RWcURVWjBWYjNlbTcremxwQ0RqbGRmYzRyNDZaOW5tcFNMajNXSTR6RHZIdG0vVlZuSS9RTjBTMUlzdTZOQ0VZaXJ1Y0tIOFNZblgwenVPR3hiVTdKS1ZRQkpaQzdMOEREcUhzYUVQci9RUC9mTHpkaUgyZGlQY005amQ0OThlZUVhaDkxR3B1S2NKYXM1M0l2Qld5ZDZ2N2djazZWZ0tWd2p0ZE9ic2w1Uzd6L1RrUTB2YVArMFZhL0ExYXdaUGptTHdxem0xU0RhckNKeEVqL2syTXpheFBjTnU1NC9NMld3RzgvajNmdUxmN21VQUJZZ09kWUpZTVpGMTk3VWh3RDZZOFRKZmxvZlEranZvUGRVSHdpeWo5bTI2SXMxVHJCUStEUXRKTWx3NldmVm9Zbk95ZU5VUE5PYkdlZERuVXZTRHlWMXpXVXFqSnA2aWxMcVRaQzJ0K2NFRUtBOE9QSFFpYkgrclpiWnM4SlNUaEdJbDB2QjU5Q042eFV0YWRwZlRuQ2lnQWVtRFNDN1Mzc1dlYWV3MkJLR1FnNDJKcnRQdFU5Y0l1Y0c5V3B6UmpZNUF3dVoza1N6ZjJTTEdzWDhiNmkrSDZROVJ0bmd5STlLZVJlcWg4U1BzYmpvNlFUUWc2UzR2ZjlYOXd2Zk03cUVIUGZxKzgvYWFzazJZU29QS0tmK2RmZi9DdUt0RjNFZVVmMis2QzhLbExFZTBweWp2cUIrZlkvOW9XbGxFS3RFd0pFQ2dMYjM4U3BEbkVnaVd0emFyb2tlSHpRNlpVVjNxRnRnaDdIZUF2dkt4b212c1UramVXOXNxL0NSVkY4OEs1Yi8zQTN5SkpPeWEzayszMmlyS0tJOHo1aWFwa1FhaXlkRUo2Z3lNWVJLdmp0LzBWS2lQZElISi8yRDV6elBySXYzQTF0dHBpemdzY3RxMWZQdmRhcVJRRVBoZkdvcFVqbUdodXdOb3g3YmI1WG1RNWRtaUlkRjNGV0w2ZlBjRGNjMGZVMTJlOVJ4alQzMVlXeVBLMUFmOU03akRBa3I4LzFxSjlsL29jZFVsMUhWbmR2N1JTM0w2MzBkMnI0ZzhVNzlqS29CaEo3b0xPWDhoMkt6blI2bk93cmlDdjVuZWZDNUcvcnozNmFsYkwySW0yLy9SdGY2bGtZbTdlcjIwc2VrUEd3Szg5Y1ZBRG4vMG1NdXVjTWx3dUFRb0RoMmN4RGxDMGNjUmwvRzF4SWZtUmJROGVDa0FBMnZHd2d0b3dJUFVvMlgzcFh0NkJORDlXYnEyY1VhZXNSUkZFWWlxTHhwZ2htckE4YVZraUx2eWxpTGE1ZWNyWUdQT3lEbk9KVzlBZzJWYjQ4b3ppcE5PVWdTSDg1UWhqcmlZamR1SFhrU01BVk9RcnNNdGFqOW5ZM0gwUWNVejdRN3B3VFpQNXJsblAya3FrTnNBdDlCUW1pcnZZM2NpSXJSQ1A2dmFFQUFIdjFIQSt6NlowQTNjUzFqM2RLeWJmYWwzdG9PSVBIZ3V2QUdOREtDSmxpbUx0bHZ6bnRZa0VqZVR1bCtZQTBialUzQUxpdUJWMG9pSlJJUDdXZjh2bkNtN1hiYlA4S2daY3Zpdk5pc3UrQi9YZytUbmI5QURuVnBleFZ5TjhxNjU2RUtEbE0yMnZRTmtWbGRUUVN2U2hTMll3UmV3U2dFbUx3RnRtbkpUVjNLTUJiUnYvY25nbXJjN0tXcmcxQTlmQTE2c21WSEdPQmJzTDdIY09zVUFqejRRMnMxTzR5UGI3Y0g2NnNFYVVUZE9KM0hTblZ5MXJVYXBVN1JKbm5IZU9SWVlDTmN3eXZMVTdlL081WUZzWk9JbHltRUY2eFJ6Z010RkJtSU4rRjFMNHdKQm9nZXl0RHh6UkhrTUNkd3hzUjluUmRvTDFvVHpjWFl2VmpQZDdLQURNRy9uaHU4SzN2dmJGQ1dyNktMUlRqbWlWQ0diL1daRXpURFpLUFlNVzNVRWpwUm4ya3NNYVoycTZDVkxjR2ZZeFJZY24xVnAyVXhaLzZLcjBIRW5jak9rRS82ZmFGNHp4OXFwUnM4aU9OV29sNkFKSVNJbVZFb1ZNTlU5Y0E0NndRZ01oYWxlbnh5akxDeTdNc1NWT0lwbWtGOEpUREcvSjRWOGZ0em1RNmhTTTFtYk1rd2d5U1VUS0xlVTQweTZCRmVOMTllRU90cXExRWVseUlJeFM2azFxYVVaV0VWQmprdmdIQUZ0S0JRcS9QZGJmYnQwdzdqdWZ4aWpqZXJjVDBWemV1TmpCN0gyUFBLeEpXR2x6M3M2aFNLWFJ0Ni9iNnVOeTRnZERDZlIwdjB2SWYvM3dvbGVFZnA2V2R6K1A3L2VKSUNScHVkclhhU2RWWnQvdmNRdDgvZmJwY3BycnVkTkVvaXlNR1FaSUFnUkExOG0rNHRqWTlMNHFLZ2tHdUtXVWNzcXRzeDdQUDZ4OUJ3eEY5MGJvamk0dzhVRGVWZGJ1eHpDS2FPVUxydnVrVVFDS0VRQkI2VldZT0lBSHNKam9FNzJxWEtYUG9MOUFrNFAzakVqSWFvZUJ2eXBJck9pZ0ErWE5GMFVMUTVxVkdpNWluT1lFQUVQVC8vUDY1YTB2WTloOHZvUTF3VG45ejhmZ05Qc1VQUTZjSmZ6UGpIc2EzbmtKQm9XRUFnTUJmeGxROFFMSCtwM3JaZWVzVzFKcklpbU8vYUxOT3VGNDZDM1ZMNURTT083U0pCbU1XWWFXNW9TeU5yaVZTSTdBejFEMFFzWDc5U0RaS3IzYStqVDQ2UFprdjZPdXd0aHpKTDJpV0h6UklMckk4MzF0RDIyWFpxdVhtTEdBMHVpT0dBdmhTOVBlM2RNT0U3dksrd2Q0RXpuaG0vUHA2d1hPb2d2L3ZCUFNrMEpDamtZMkQ0SXJFaHlDeU1JNHVBV3AxLytaUy9uV3ZjVWlLYjIvVmdnQ1kwTVZCSFF4TVRtUUVJRExlRDRDQ0FGcWMyKzhRc0FXQXp3RjBNYkhmOFl1WncyNWVMTGlONldMSkpVVzhXSEc4L0MvVytJSVg3dUc2YXJ3YUFrQW1KeTlHQUlsYzVXZ3BlcCs3SVByeWs5SFl5Q2RxcWxDcFFiVmlSVFJxMEVtSmc2YURDNk5BeDZ1TVhBdWRMQWRjdDlJSnF1dDRpU1R6S25TUTJzZzFwYXpXQkw4UldmSEtUUHNUWFVwRmlsWEgwc3dsbExjUzVRS0p2R0pxbGlsUWVPQmFYZXVJNFBybGROTmRlWFNnZzFYVU5QUFJSVTQ4SjIxYkxJK01rUGlTM2lwY1BBL2ZzOHJzbFBkQ0NQMmZaWCtIT29VQ3lPSitCK21PdDkwbDg4cXdxYVNUOS9yTHltY3VoUzExR1NFYjFkMGk4Y0xFVUNMekhuSGxJdkpmeTNCREdXZVc1WG5Hc1lrQ3pjL2gyY1pJclU5TVlXZWZ2dTgvWjcwemo2SzAzbU1BcmVmWVFQZWhkQjJYT25lbFk2OU5hOStVdGpVWnJYVlZqRXQ1V3NzeWdIWjRVWnFYRFRRdFhXbUhadVhnZ0kwY0tMVDlrMlhmY0l5OWcyWFBzTEo3dE93YWo3RnpqTUxRcnpUMmxvYk9vdS9rMUxlWjFMWEhxRzB0TmJVYlRWZjNVbDFicXFKVjJhaUtSaDZoYlFJcHJ5eGxaWjFWV3FxU2dxemlRbWtLdmEyb2lLSXd4eEVLY2t0K1hrMWV6cVhscHVWbGNsSkxkcWF5TXB1Vm1haU1oS3owV0trRFdHbUJTbzM0TXFwb0w4cHdLOFZzQ1l0SWNUTUxkbFd5cTE0bXljMGswVk1KZmhnUjc2L0VlUkphckpOVWpBMHIycktpZEJXcFcxV0VLVjhtM0xTRUdVZVE3M0phd1BaNGRteFhzR1V6NzgzWEp4TWZNWXVSbnFQdTJqT3BBaW1aZWZoWkpFd0pUY3h3cFltODRoRjYwV2xlRE1zbXoyTjRDcmJUQkVLNmU3cERKOUg0TkF2UFBRb3UyNWZHWVhOb2JIY0xTOEtncVlXL3UveG5MaVovZXpkR2dMdkZ3aGNlWkNNT1FTUGJvSFdWMDJpS04wN0xXNS9mODErYytmL3hqYTJ3TVpUZWtCZlFlQzIyZXZ0VC82VlRhRis2aC9kQy81Y0VRSll5RzZab1k3YTA5ZWs5L1VWWkFHTGhjRytiZHVuVGV0R05xcWlaakJEUFhvRGVxOTNDdkNxTVMraHgxbGdxTHlRUmZiejIvVWNmNFZSemhFOFg1RmVCK3phZm1BZkdOeXdwMnBxZlpKZG03c3cvaVpTRHpCRVQzSGt3djhBRHNLYUIzYVFTYkVSR2JNWE9yQWlQTHZMNXNHZ1dwdkJhMUFBPVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xM19fXyA9IG5ldyBVUkwoXCJkYXRhOmZvbnQvd29mZjI7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R01nQUJBQUFBQUJ1OEFCSUFBQUFBTzFBQUFCdFlBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdrb2JJQnc4Qm1BL1UxUkJWRllBZkFpQ09BbWZGQkVRQ3J3SXRsY0xnZzRBQVRZQ0pBT0VHQVFnQllVR0J5QU1oaFliV0RZVjdOZ0xzSEVBNWxtYk44SC9IdzYwT0t6bWVwZ0luVWFNTUZXdDFUQ09zMUZGMkFhRWluTjFublllRW0wcWFZeFFKN2ZoSHFGcnFEamZTZFdJd2Z1bE5yNTlPMnRlWVBuMGFwN050L0hqcEJ1Nm9DdGV2S2lKVUx2NVh6VkNrdG0vZE4vZWU3dUozeERNOXliczRsTHRUTTR0SjI0RXNhQWxSYStmanFHQ3B0VHBxVzU2Sk1QVE52OGROYnpqa0EzVUlRbzRUSXdhenR6TVFHU0FHRW0wMFpqRnlzNVZ1YWgwZm45MHliamw0YUgvKzlBNzc4L01TM2F3aENRbkdOckFsbTZMcjZBbEsybTF4eXRRN0gvL04xZittZEJRbUE0b2U1UmNJVzVkaGF1cnJoOWJtcEl3cE1SaGJKKy9yRkQxUzMrVjBoTCtZOXN5dEtwRHpWeVZzd01jUU5QUVd2cHJrSWF1TGpKeGlPMHNlVEwrRFUyeG85RCt3LzU4aGFJNG5OSDhFa3RjeWkvbUMyNnlGSjhTVTFEeXcwWHIvNWFtZEhaSFk2M2Q1ZHFWVmdEenBtRVRFR1NBOXMvZmtUU3p1NzdSM3QwNzdlbHlVWEVya3J2a3V1ZW04em1sZFJaa1dIcEthYXlpMGxpQ2d3TlFBQXNneHFFd0FTaiszdDliNXdJeGRXWlhUUWtCcEg3dGN4blQrdUJxTjVaRFNERWdZblQvV2hzQ0Fnd2dBMGxlczQ1RUFKdlJRTURTVnBXeVlaZmlpRThsU2t3bHE0a2dnSzIxQmJjeEVBRFMvVW1ZTHhCNWt5Z0VSSUFEQUNEYnlMSzRPZjRDNFEvSGZsVmRvZ1hjZHlVeURTYStsK1dYVFB5Y1Y2YnZ5NTNEQzNPY1lGeUdCOER3elNmckE2TlZ3ZkNORC9jWkIwZ3pCZUNENFFUZWRQRkRTZ3cwRXhqMkw2THAvekpnLzQvcEFYQ3E5V0pzcmJ6cjRSTHppSlczUzJrNEExUDV1a3dKWWF1bGQ4b3lDQUQ4ZjVwMkNNZFVhZ3ZtNVFFUVpLMFE0SlpGMXJpc016QWVEcWNBc3VRZXBLWndRQm50UVhHK1NBS0VoVGFIUzZoaUprNWMvTVQ4aGZrWCsvREdCb2lCS09FY3lwaU80eGZUekorWnY1cGYxenBmYlA5dS83RFg3OFYvdjMvRS9hanBnK2U4ZTZuSnBFSHdLeXpQbDBzQkdwQjlyYjVWeS91ZWpmOTlhV0VWdmdHMmRZS1hzYjdNdU1oYkdJekJVZk1hQU11N0hIRGFyczh5WTUvdVh0OXF5RU5xK21McU5SbXpxTnFTRVNadEJ2WHBzWmcxSGNHRFVCMEdpYUFvSng1dzZWSkdiZCsxZlVaTm1uZFVqWFo3RFpsenlFTXlldFVhZEJzbVY2RlJPNU4rNDZZdE9xeGFsLzBHVFZwMDFDTW1mWVpWeExCOFRKMVdPbksvRVZPVzNQTVR0T2I5OTdUb3ROOW84RkNzVUZVNjdEZGczSlFqZ3dHdGIyNDF5NThtdHlXRm9mRWp3ME9ESGUxdHJTM05UWTBOOVhXMXhwcnFxc3FLOHJMU2t1SWlnMTZuMWFoVlNvVmNWbGlRbjVlYms1MlZtU0ZObDRoRnU0VnBxZnlVNUtURWhQaTQySmhvWjVaL29UallQNk96NTBiY1hCMmNyYW5zZWhFM0Q4L1dOTXdJVnZGQlVPMElldVR0Y096YkxXTnRNR3lod1dXN3ZpUXRwYzhpRjBwU2xVT1liUjFyT09IaHFQVFVsbTRBcDk5VUszQnR0ekJDVXdCRlBVS1I2N3RXdERpYkd5VXhvS1dBSXpJQmFpVHR6OENrWDlVbTR3ZG5OcUtmWWxTN3dPaDFiTm12S2czWmhxUDhhV3dhZy93amFlcUNJcW9DTlI5WEw5N2tDcUdoOUJCeEhYcWxLcENFdk1Ha2dxdjh1ZTV0UllnRkVVeko4emU4NUFPNzJlaFRZODlIN3pHU3o1WkNxTEt2N013NVBwZDZMUk0wY3FoL3FNMWFQNjR2ZlJVb2lCOGEvTStFRk1WR3lNY3lqa3NFMVNhQllHYUtXYXBjbDQ5TnV4Uk1wZS9ReE9NTm1GZjdLb1FudGNtRmhaQWdQL0JvS2tnWWxPQlVBeGs4WWZ1SkV6dGgyR2F3M2dVUUFzNnVGR2FZb0JkNmRHRG9QYjJ2anlpUERtWnNrai9MWVQ4aktBZmhGeC96Y0UwU09pNTl3dVJqcGQxVWhNSDRaaVRjUkJOOERDSFl0Y1ZjdUxnRDBOS1l5TmFOcGYvRmgyTThxRUJTTmFSRDFHdnRURldPNTdjekZrQnlTYkFTZytHUENaUEVGZWlKZHlsSFk4TlZoOVlUZkpHOVFmSzhNaHp5cnFzeTNjNUIwUnhLTkNxWEhENDN6RDA3S2pxWmUzekdGYmk0d3cxZ3NyL2dUb3lXR1Z4ZVpYOVZXSnlSUkwzUnpWWlEwWkdpeGFHU2s0WTk1N3RtTWlPWCtvRjZrSkZNUCtlR3F3YThzSUVZKzFBOU5FMWk5UUQzc1A4bHQ3bE56enlWUHA0VFFiL2huNWgxU0JBTGFFN2dZY05rRGcxcnd6TzZYcU4yaGlyWHF0ZUdvNnhmZDIrY2U0ZmdUSkswZ0Zac3FiUkk1VVl0YTlpS3pjUERWaXM0NXRxc2N6b3ZZOUpxQjJ4WDh2S01oWnhvQ1QwQ2x3U281MWxZbHE0ZlpscDY4ZnQ1eVJPZjlTUHBvVVV5dEFoRzRnWHpwVmE5cHE5RXRXd2ZVaUpYdFBVanVWaS9iVmdKTlk4OGI3aDNpSGcrNEJPUTYzUk1oRHp3aXlyRjVWTEc3V1dTMTNPcGJjT2lzYmUwREhNbmhKcmpZdyt0NThVcWdVa3Z2UkxjMVRJRWdmMWVKRGVVSjRkVnB6NHJnc3VibUllS1BPeGtNV293SHB6dDBSS1NYaEpSOEIxK3dWYU1MdWxLWTlLZDlLVmRTcGxMRUJiRzRLVGs1OFlHY05XSnN2QWNBVHNiOEo2WWRHMGZoUW5ZNEMxSTlxc1JTUTNGUURHNnBGWmJvdzJqbTlacGx2SDlWNzJSRnJ5blNrOVJrdm9uUW9pM1VobFdnNzlSV0xFMXVja0wvUElKNGwwNDB3QlE3d0VISlEwbGg3RWpPN2VhQ0lhQ3FmcXZzRGROTzA0cmlCZzJKOEFwSU80TFM1eDBtV216RFFIWU9LZDhBQ3NWd2Z6bDlTOGtUSVNPNkdESVM3SkR4RzFwdVlDT1FvV1B0VGlMamkwVjFLRXgxOG1ZZkRCVUgzUzRDL2NOeTVGSWcvSk9DaE11ZCt4S2d3c2RVKzR0enliZmxBQjFIalcybnBVUm8yN0dnZmJlQ3ZGQktHQmQrZkw0aUlWZ2Ryb2Y2MFNIMXBCVUNkUWdBbjVYL1RZQ1l5QThZYW9nbVRZVE4vV0VkOCtVcVU4Y1l1dEpCK2Urc0ZOV3Z6TFVxT3VzY2E2RUJUTTlBZUkrQTBLWVJoQS9MSEs1U20wd1NkNFRNbkhld3NSNWphbXlMem5QWVdRSVEraUdzajJpSS9wUVV1S3c4ZXZBOXBCd1JGWTJQZFh2Uzd6WmM0V3lJa1NNNGlDbVFKeXlMQmFyN0F1RFdJb3pSMXpINVBlYlUydy9Na0NHL2FWenNIT1FSMFNMdlVpTDBUY2REZWZlV3JhN1ptblFob2xRNzZRdlJmOTdkdjNCSVFIR0RxUTdyRG93OGliWW93QmhUNytVbEFBMkRlS2tidUtmQ2JRZDNqb1JaOTFNYU9Wd3o2NVVVeHdmcFgxODdZakx6OWoxYjNqQURYTXZ3Z2RGT294VGZLeEZ4NEFHdjMxd0s4eWRIb1dsc2ZXVkFzRk1EZ240eUVLTFVXVkRVdmdGZ1pqRVJBVXc4Sjd6blpEYVhvbnRlYkp5QUErbE82RDJidjdtU0JVSDRLLytSZ0E1R0xuZ1d6dVVkSS9yemgwbkd6WHkxU1cvL2pKY2VSdld5S05Gamxhc08wQk5GNlR0aUZNNDlUMEt2UEhMeThPQUxDcmVuM01jNW9aRlROK2dZUzlXV1JZL09vbkJBT0pQMklXZElNRkZ5b1VNVFhYcU1wNnFBKzZHQWlJK2wrT0hmOVlQY2Jqb3c2cU5XK1dmOFgwbUZscWRrVjlzNnJjT2JnZTRpZ293ZVlmWHNqcUVaV3U1RlJ4dUtkTWcxQ3VwOTJXQTV5c3ZBTFQ2S3ZOZUlaYUdBalpjL0hGSWF1Y2hEcmhuOUk0TE1kbkJzZW8yaW5XeHdvM2dSZC9HeUpSWHpreFk1eVlNK2MyL1oyV3dFZWZBYmJvVnNIUHZNN0NQUCtVZXpoa0twc2dnRys0N1MwMzlONXl4NkY4TWJXQjNLVnVYNW5lSVFYR3BkMDY1cjNqVk41TXM3MzZXSzVjbGVwckFJeDJHM1ZFWGlVUWwySEczaXlUdFdhcjBrZnY5VE82WkZnN0gzeVFmWjFKNkxramZVL2UrS3dyNHg0MGFUK0RTTDV0dkIyQjNsZjFtSDFzOEMyVzNYamNWUWNXbFNLT0l5OEFlUERqZEdQZll0Sm9KcGtLREFVZUhwSGllUk5NUnBlVVRjUFdEV2U2Z3lZT1cvVTdyZHI4K2JhZUlwaGtZVmpETW4xdE9IS1BjeVYvWWRSMUQwRnMrcmdGSFhlWHpRVkl4cVBDSHF2WXpyNkFWUVhLQmYzVnlzNlRYalJ6dXp3M0UvdzJTdzU0cWU4Tm1HejU1aHl5aFpxRmNuZTNLaC9qY0M3Rk5RYm5kV0pmcURVRFlJVmlKR09xbFhWclpja2hHeER4RlhLZ25aSWhqeDh5K2J4VkFBQXVJQUFZbzJMU1JPUWNBQUI0Q0FFZ0NBSzRDN0J2QTFBSkdLOERzQWZNWEFBaEFBRkpRSTJwQzYyMUlxQ0s0WnRSazBmK3NHOW10R1FXQkRrLzAvTUFrbklVRnd3eEhvbE5aczllSjBxaE1Ka3FoT0ZCcFZHdTJCWnZxeExXaUlwaGxTV1ZRa0MvWWttR09RMkVqV2syU2tpUWFWRHI3aGdPZmVPMkZHRGNMeVJKVVNKS1lDeEVqV3FYcmZ2TUdhbHJMTG9DWVBnUHFkYnUwcDJFTzFQUUc3bDRNMU9xcWcyVGR6bzlQazBUQ1VqeUZXQTJhVTRObWFYN1Vaa3JFbTRYR3EvbVNCNFJPRksvM0JpbUlVd0o3QzBTTVZNRmkrRG9yY1N2QlZDRE1SZTY5OHc3R3N3aUcrNGZEYVRGNHlXd05OZk1wN3dFeGdvaTMrdXZDdWNsSWtXRGU5dElYelZ1eHhzbEJNeS8wUlppQnhnWm5MajFWY1lRVzdvUTlqRzhObWpXeHVncjQxR241YW9BS1J1aWFOY2tUQmN2TC9KRWNXRHpXb0tiUE1JMXZuVXMraEVXSTErY0J3eEpFQ0tkL0dIZWthVzZOSVNhSjBVRUtVenlzZjVrTDRCaWd0MmdYZXJSNkRIQnc2T1ZMN3ZQWGlVYktsV05XU09OSlRnamlHejNvSncvZXVtLzVJa1BtWlBYVGg5VDFuRDBnV09qZHorNXBsTjRlcUhCaWRZS0ZhKzdSSVRuZjBBNXVoTkU5bWhWUytCRlREQzJYT1I3RWh3UHZ4T2U1SjBiaFpXckVTMnZYb0taRGNQZnQ3ZERTK041REtLd1ptTkxGTnpzZml5eFloUkhJZEF6a2p3cEZoeFpoSHBtUjNZbXFRWHh1elp0MXhwN2RzN1BwSVU4NktLVUhBV2N2cU9JMUZzSjBVK0RGaTNEM1padWFvaGRwWEIyVkZtbGNmZHZBd2JoOVFVa2t2dmZvdUlMRmRwc2EvelB1eEYxNFFCNGFLOWJXZEJEekJ2SEZ0VUNyUU9RTi9IOWk5UHhzcGR5TXQrSmlsYkYrT01NNUo0bGVGYlNwbW9WMzlOWjlSK2RSZDYvNDhQNEQyZmY4L25zdld3WE1sQnVwNVNzKzFMWVYwZ2oxMUk5ZEgvNWVsczZmQ0Y3Vm56M2NzWjdRQnBPNGYxWTZmc1ZmclQxenNQMnRlQU0yV09lYUkwaXUyakhNUEtmcXFKMHg3aXJ4enMxSXF0c3hZbk0wT3krb3RUaWNra0VkZWlwVG5xOWxFL2dscElneGJ4Sm5LSC9LV3BTVmtaTmVGaEhUUVNza2NRWjhTSDJuMktQOVAvL1g1WGxXZUpCdmRmZzNwcFNuaUJ6bk9pbzhyQzVFMlBiNE1YdUlkbWZXaDdQVXFZWjZpeDFYN0dTdXlpYjZsZ0ZxNnQ0VTZjayt2Y2VhNUhwOS8vVHU3QmlWYzBKY0VkRi96NWZrVDdNL1F2Y1JpN0xpaWwwOGZ0NnB5azBZTXhkVkV2aWVNZkdaWVc3Si9tSDVYdlYwVTR3NFF1SkNwYmJjelRaYzI5K2JncHQ4OG1YbHlPV0xoOW9seVh1bjVELzV6ZmtpRUNKVnFISWtlNTN5M0Q4UmM4OXlQeGgxTDl2bkhaN3E1YVgzOGRkRnBSbnBEdVRYMmU3anI1Tlk5bFdvYUVkRUlEY3AxU2tnV09JYnlSZm5VL0RVK3VzSzdmVzJTbyszc2xmMnRGK0pyMnkrb2xUYzZTMXhlNWx4cHFmOWFuenVyejZwUHJ1azNBckxydGdBYThuSHZCMmk0RjB5bHpwYWEwaEdYQmFsbTVwYmx4U3lMOThCS2IxVW4rSGUyWnZYUTkrVjRSZWxMVXU5dmJVODcya0gvbzAvcHoxRnVHRnllVjJBTGY0YnYwaWs0c2YrOTV3Y285NTk5ejQ0TXR0cEJ6NEpwNFJrenNRWE5tbU8rVXRZZWd5MzlmK2dvdjYrbzlIVzVMSjF1a1d5TXRHd2taMlhwZ2xrMHNKVXpSWmViWnJKNzcrZWJ3VzlxQk1EWFl5aXQ3OS9kd3hLbmNqWVdCdFBocGRWSms0NVhKYk5ESXkwbE1iTHZ2UDc3M3ZBOEJRMXEwOGlQTjB0ZGJxZWNxcDY3MHlhUENyUE1TSmNUYVFtRWlNVHpkT2RuTzg2Ylp0MjN6WTk2bngzM1B6MmtTbjY0aElrOFhwM3I1KzUwUzRCTWE1U1d4bTV3QzAyVkJ6bnlmY09GYm5ydDlidUZDZElmQkVFaGp2N3Q3Wk5yOVlVdVFsU2duWGh5aVg2M2NLaFBjWVRCdjRDM2JGMXZkS1VFbEliWWVuaGRzejE5MGhyWG5LQm4zblVGZnIwMVJOYnlOdlhhSnJrRGtOb2xIY1M4NjlqRGVkbjBSRkxMYi9Uc0RQR080SDE1WEU3bHRWTEt4aWU4MzhTSjk3Vmh1V0Z4NXZNQ3oySHZBL2VmTkRENnpCTGMxc0ZBekJtd1o4UDNjRjR2K2lLeUhUSDhnbW5JUnRkMXV4WXBkRzFGaC9LV1JhL0d5T04ydmRRbzd4aVpCT2l0OVUwUVhsRTBsOFd4M096MFlsT1JXYVJua05iaGJ1SEd5dFBKSlJ0cWdwaGp3Ny9qT2xpZEZOekc1SkM5K1U3VU9iV29hME1HK0c4ZlFrYzJzNjNRWVEvOGY2VTlwVElEVlBLR3dOY09LOXZvUWMrQzZPOXc5MzZMNHVqZHBuL093djFxbW5MVHMvVWEzYlRxZEVXTUl4S3Uyb0FYUWlpUllnRDRuYlZBUDJWNWJXdVc2VXBDZ3VWWmp1RC9lVWhlUXRXbDJ5RUVpdWRLcjdzNTVzTE1tazE1VTg0TmxPZ0VLU3ozdmtqdjMzN202aTRvQ1FLK2NzVHJ0b3psRThmYnROVnRQU1V3TnFEK3BNVm5hZW9Fbi9KVHBVbWgvbkg4NU0zdjdaem4xUWd6YzJlRkp3Wkp2NmVmWjZaSE42V0UxSldGRUhpNzFSTHQvdjV2UDR0NVkwakorYWZsckxSVUp6bUZXRloydkxTMFlFNTYyRHplbDNkbHJwelNObS9uWmtRN3hLYVo4aGp4QXl5aHU1ZStCVkxsYVZYYmx0SCtpUVpoUVhWdGlZR0Rlb1BoR1BZUzNNeXkvelZkYTd1OUdaWVlGVnI5TTcraWgvbEI3OGhPckVIaTlKTHMzUWd5Q3dVdGpIOFNIOWVlRUlFeTBBZlhub1N2TS9pcnZNa1hqelhPci9pVEE1SGQ2NkpVVjZpVFBhNi9kblp0MWtjemQ1eDhmeSt3UU45WFA4azIxM0svT2dMZmF6V0czT3NQYS9HOTNweExGVGNEaVBLVFJjNWgxdjJ1NmZnVEVTTUl3Z0EzQVNzZlI4U2s1azFOZ0ZFQUJUQW85Z2lZNTFEQnEzQ0UyQVMrS0hobEVDSDZxR0VNVVR3Z1VIT0VkQWhFcHJBM0xZK0FCRG9vaHRYZWxzeFFnQzRlWjdIcEd2TE5pU0FtK2R4c05mTlg1Y243UFgyZW52RCtJWThHY0x4ZU5IWVEvY0NLOEJZSklTVzEyVDJ4djZOZ2V4Ti9ac3c5bVo3czcyRnRtUWl4TW5ySDR5aWNVd1RRQmNERE0vMFRBQnI2YWtBQTk0cTZ3eHVIY1drR2NZamVSZ0JNTjZYWTJ2emtkQzJEanYzcjh2c2RmWjZlNzI5WVZDRFlENDRNeDIwZ2NHSlUrWnRnRTNFQTJrbFdvZHVnejZXQWFGbENLMU00SWFPbnlBTjdkVUF0ekJwQXlQUlFZYWpiWXpVT295eDE5bnI3UFgyZW50RHNnRmgyUGhESTRDUldxOHlRcGxGY3d3SktPdGg1bEM0Ykg0aVZEeVdDQmJqU2R0WUFub1k0ZUtPUVljeUhnV1BOSk94NkhxQXp5aUZvV3phRlRTWG9mUnl3RTZFQW1aSHN4bWJGaks3NEphSVVWK3hIUmZVTm1Gbi9tQnN5bUYyOUVsQTBOS09CTG02eTBnWmlxRjVqSkZwYkVEWVNPYndNR1R6ak5BSU9Nai9DQzR6bG42eU50RHczckkyZ0g4NFcwalh0em5acmh3QXc3VlcrQUxNVi9KYkRUTTJHWmh5K1JxRk5PVGxHY2lMT1BPdVdiMUtkeHB1Zjl1dHRsMlFQWFVwMWNYSkxLVWYxek4vVi9QNnlTWnJybFhyWkRmZ3hsMlo2MmJURk9QU0FYOU1jdjg1OWtlaTBwb1VvSjZQWm5XWW9XMDM3dU1EK3NIY3lCTFpReWZoUUgvU3dxL1BBVUh5ZERDZUJna2ZqTWZHU1RqcXg5eVo4dEg3bTl4cFBFbUxqTHB1QWtnNDRnSVZFRCtFWUJLSXhnMHJnR1FpNzFKQUFFMWZRcTgvL2JveFhpdHJYYzgwTlkyeFdzUDF4SzBnekZMYld0K0tPSW1RdzgyNkl5NkJZK3UwcVpVRENMc0NodGtWQU9FazZDRi9jT3ZBZm1melRLN0l0QTVDQWcwY2xJc0FUSHJtYUswd0xNNVRtYjJzek44ZEd0THpldVpDVTBOM0YvWUUyTzhaTnlaWDVEQU9yS1k1Y0ZBcUhMaW9GOVd1V2xtbW5abTliTm52d2J5ZXlUOERNdkRiTDFkeEQyZTBGY1EyVFVCWTZrQWtET1BnejVmemRIVWRtR1VRQWpxamNtd0ErYmpDUERkWTJ5d3QxMlFNRkFlMlRzalI0c0h4dDhKQ3VvWUprU2JHUVhRNmI1VmJDR2p6aFJiZFVNd0ZCSEQ1Yml6V045OWdFakxwbWRKMW5QMTlac2tvanZNY2VCdmFud2FocUNGQVRSc0VjRXlqZm1hWDZXYlR3blZrU21DVjJuVk5OZTExQVFmdFpobWRrT2d6OHFMd1BCK2MvQ1djZ3ZGQWgxeVkwZ0szVWtIWDF5NldvVkNYemVmRHVWcFY0YmFGMHNDSWNaV2YvRDI4RDRyOHNEUEdicGoxZXJabHkyU1JwblVVc1F5azYxeGVScGIwM2VGaFBQNzA0Z2RrdWFFZDdnbkZDS0cvYncwM00wTTMvL1RlYjRpWGNaZkVYTUdaRUY2MHFSQ0YxYWxZNTRpZVpYR0pFbjA0R2t1RXJuTHErc2gzZ0NiSGRlODl4ZVFqR25FeU8vU2RCTTY0SnJ2cGpZSjUvZ09qaldXbmc1bDFSWHlqdWt6M0lGNFVjU2pGQjB3MlRTQ1ppN2VIbWZMb2NESkF0TGZUVUpDRGFJcHluZTYvSG9BNDdoNndXMWcwakc2RWZnMlF2SmxhRzBZL25VV0lydnMyaGl1YWJiL3A1LzBCdHZQa205Mm0zM1V2VEVNSHl1ZE5Vb3pDQXpWVnVPQm5Oalc4SSt5M3ErMmJZQ3FaVzYrcHE1bWdJOHhNK0w4UzBIck1xSFhHQjMwd2p1bTNzd2pSZGY4cWhyWWIwZmJDZEkxTytnazNNVm5PekpxWTkzT2xKa3ZhWU1wWjB6VjZwcDlReSs0SHc4OUlmT1ZtSFJ6T3d2Qkd2UGF0RStXcHFyY3VZcHFoUkFDWFU3R21jL0ZmOGZYbHhLNWRsZVlxZkc3M09DcjZvdU41TExZNDY5THordURBZlVVTUllQXhCby9reDQ5R1Q3YU9oODlsSTkvemhLRW84QU9KVy9uWnpuUWZVWkxmekhXRlNKc0QzNTNwZEZWK2hYWWxXeTlZWDNiVXFQMFNiQktocTQ4YWs0dFBEVjk4S05VSWJ3aEFBQUFENFg5SSsybk9lZkEvSWtJRTBxeHZ2MisrQWx2KytxTDQvMjc3NzkzRFlGTURMQ0FBRElBZUJPQnZyTFZUa3JMK3BUMWorOUlxOGQxNDJDZHVGR0hqUVlyd3hsNit0Y1pZSFV4dGNmRjlWL1RvQzVlOFFacmxwQ09YUXg0anpWV0dkRnFsbzg4WHBlWkFBMW11NHlxbjR5NElBTDI5eURkdHVuRFlsbjFDenluZVZic3psZ05wK3pMdEJEWHdiNTd1YkZSNXF2RHI3QitSU2MrQnRmNE0xenBubkpkOUtnUUhld2NaSGpPUTRXeXZJTU4xbndEYzdBZjhYUWIrZkFadWZmQS9YSUlRL3YwL1RhQVBtdzhDQUI3YXgxSUZQTUFBQ2srakFHT2N0OENpdXZQQXJDYVBNK3ZqM2dKcENHeHhKSTBCbHE2bXNTRFk2elFPY0lPU3hnUHJDRXdUZ0dNSTU1TEI5cWk1R0FTQUR4MUxRd0NHTGtxY3oyNUxhN0RuSDQ2RkNMM3Izc2VnU0xVU0tncEtaZGg4ZU5Vak5xRmp5S0lVUlZycUVhWEpneXp0a2wrTkROUytWM0NQd3BScnFmUzhFcHh5Sm9VdWk4d29rT2RRVkZBaG5menlmQjRLdXRJWlFVdkR0bHhMUm01SWZWYVcrb0VoZEZCYUR1UVNUUlRPVUY5ZWlDMXVrM25XMWlvRmZIbndxczBLRWlORnhoaUNKRnN1ZEljWTdEYmhQUWxXRkpHQnA0cTlsUjE4N3dObVdCSmxzVlRCVkhoRkxIZ2U5SkdXQnhzbGpaNVNSRXNrUm1hNnBOaFFoYnpHeWIxa1I2WFRaNE12eDVMOU9qN1d1SkgwTTlGcjhHcGdOaEQ2cFZFdC9ydUh2MDdZWDdLdmpMMVA5bndZbjBkNk00ZjNrRzdiOGVvOXZKaDBlRUs3bC9HNHBGVUl2b3VHdTluUXBNTTBha09EbTFIdklYVWVQayt0SjRGemwxWGowdFZPZW45VnpqQ09IUjBjT1NhVU8waVpqWU45Mno4bE5sS3NyU0s3TnRnemg5SGJmZGkwRXEzbENVdGowV296V1NxelZwcXpOUXB6QWtzbW5FWm1Jb1dtUFF4TkVnd00zbm42QnBKclBFeU9rWkd0SjFsNldKazZuYUd1V0ZLMVR0ZlNlU1RhRzhTYUxVUStTb0d5d3JTRUNwMm1TSjVIb09nZ3IveTM0cXRJaW9xUnJOUWpMU2VKTXBJZ0pmRWlFaWU2SVZiQ2lKR1FhREdKQ29YaGRXZmhjVmRndDRWaE1YZGcxZ241TGRPc3NHOFpEUlVZRmdYOGxsNmdoNDdQZ2xhZGhVYk5nNXBQM0pRVFhCVnVLRFE4Ymt2T1c0QU14SW1iZ0VSa2dWZ2tob2hMT0hvK21qd0hOOXdVYUV6ODZqbDhMNWNPOVkyK1BMdjBjakc3SElwd2ZPbG90bjFwYTNZVWI4V24vUGJXVnJKdDJjbnM4TkxCYlBmU3preDNxY2FUK0NEZWlmL3JyU1lJNzZuYjZnTm8rbDlsb0xSemFXKzJlV2xqdGhkdnhLZDBlMk5yc0VCdDZrZmIrQWxmNVJyY3NMS3ljVG1jbW5QZzQ1eWNLTXYwcUlUWlhqYzBsdWMrSTc2SXYzMytIQTQzaG5oVjczOW1NS3NKbVNnYWhTek9HaHNmcWRQS09mZVJCc0lLdW1zVTBLcHIyQWdhNjhJU3pmenNLNEdWa0lRaFhyaXdVT2MyRlJQeGszb0dBQUE9XCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzE0X19fID0gbmV3IFVSTChcImRhdGE6Zm9udC93b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBREtjQUJJQUFBQUFhRWdBQURJMUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR29FWUd5QWNnaVlHWUQ5VFZFRlVWZ0NDRGdpQ09BbWZGQkVRQ29HTVNQeGZDNFFJQUFFMkFpUURpQXdFSUFXRkJnY2dESVlXR3g1ZE5XTmJSc1BnUElEeTROcGYreWdxU0FPUEl0ZzRFSUtGbGV6Ly8zNmd4aGp5VHdkcTZiWjFBWUZCcXFTMFMwckhpRzRseSt5WXE1TzNRVWFPQzVaL1lxT0hLQXpwV1diSGtXRkdwbVRKZlo3ZzFqSXRYUkFJQVdZUXgvQVp5YTE3dVlxdlZqTXhYUjNJcGxqSUx4YVUvbVBXUmZQcDFGZXdZTWVxWEFzR0JmTm1YanM2aHA0by84UE9DM0RQdUFQWmI2UEV2M3kvQ29rSjJWcnVEQnpubytiNjhQdzIvMXplQlJsR3ZlRysrSkVGWWpTclNKYmhvcEFWUmdkR3JwakRXQ2JiOTdQbzlCRkVhNVRWTTkyelQ2VC9nekk2RHRBQlMyUVpGZVZSMkVpeVlSMFp0aXh2ZWdDMldYT0pnQmpnbERKUW9pUkttNGd3R3JFQnM4NkttWEdicm5TUnVuSzc3SlhuUlhyMzdyM2Q0aUozRzNTdUl0MFFRaHJhQVV2bHZQd24xMHIycjMzYS90ZEIrektJdy9qK3cvNThoYUk0bkpIK01rcDVLUy9tR3dDUUYwdnhVOW94TEVUeGNha3JkMWRvT0FpeGZod3BESlhtL1FTQnU1azR3T2dBT1lSTjZRQTJUZm8welJlbC9kSldyK1lJNXd3a1E2czYxTzZQZ1Jmb0RFdDFiczBacEtWZlB6WndpTzBzZVRMT2hhYjc2ZjYvbVVDQXdCQmlkbFh6L29wYmE2YzNxaTJ6VWxUVzllOVNWOXAzWDJtbElPTmFxN1AxQUd3SXRnOWRBS2tDWU1OTUtrckFQVnNWNWpScVFqdmlBNEZDVERyU2UxTGJYbmNWME45cm4zK2Q5clZQbHYyajRGa0ZQbkErWm9HS0RnQkxhaHJwUGozNXZTY3BrV1VucG9IQUVOZ2V0SWRNZjlaSlpvR2dSUWh1TW9CTGpPVnl5OVdlcmJZb0tvYWlxdFovWERxYnk4c1Z5TEZUNXJJSWozRGZ5WTVjVi9JWVl4cUx6S0VxSzRIWVJXU0tXOXdmZjliTFM1SmtiZlBwa3pHNzIvTklMeWtTZ21SRlVoSEpPLzY3N1oxL2tBUkdkWU9LRTZ4OTN6cnRwMzBQZzhtVzdtWmJDbUpFbWlnbzFaTE0vZDNXSU9EQkNoOUZpQmZiVTVxQVlOS3RFMHpSQ2FZWjZEUE1GblBSQ1ZRNndRS2RZSkdCdmxTRGZzSjUvVHFUZnRNZC9iNG4rak52OVU4KzYxOTkxYi83b2YvV3RpTUJBOERtWFJjQlRrMEVKMUprNkVOanAwSUlDZ0FjOXlJNnVuZ3pIZjVVc3BkcU42NkIrMnRsUzFkejV1dU9SUnVmcnJlek5xK0R0K2FOQWVpNGUwZks0UFN3YnF3TVhSNFJUSmZCOHduZE9CbTZYZ1JaajVBSWIxY0dkTTE3aTlmQWtWU1o2cEwxaEJHZ0VoWDVQRkNJMFBmMVZKSVFaaUhXdzMzeTIyZC9mUEhYVjIzaXQ5dERUMk9NdGRBaVJZcW52OWVzUUhGSWd5VEpDQ2ppeEh2bStmQ3FQL2pwbzErbnZ0WTYyMnhINmVUUmhBL3dsWG1wNzh2cUtSbGpQN2IvU1BKeHJBQ2N3bVI0bVVjOE9tRUVLUXlVZlNhTVBTa0hZZHVJQnBML3o1dHRaT2tCTWhURUdsczc3TGVYeFJOdjI4dWJWeEFDYkh0dHhXWUNrUDg5S2lFVVBBaGdsK1JlQUhqRTBaS2d6aVBPb3lrTFFrY1N2Nk1MSGRKMWlsOU9kOFAzbFRoOFkxSXNqTVd4TzVLaU1PcmpiWHdJamljWlBjYXM2MFI2dHpRMHpVcy9TMy9LWkxLU3ZDeXY2dG1YYlRudTJmTDlZMm9zaWlVbnZRVlJGNis2Zm8wT3ZaRGVKZDJqZjVKK1VZcVZTckl1NHBUdDM3NGRzbk9rM2FzOTkvZU5mYndQUWR0WE8vbVgrNC9TSG9rZTZSNXVQSHo5b1BvQjZZRU11UDk1L3JWd0M4aDRObzFsVE9KUVQ3M3ozby9GTXVmcmlYRnRPUmtMM0N2NXBvOXNNZGRXaWZhZWVnMVhRWFRMa1Y0MFVFenBxNlRwSlhZYnJJMlVaSC9NbjZkUWdxaVZIeUxkZWF2a2JiT0xWallkdFRLWllvVktreXlhTGt6Q2c0K0J3cVdwMCtseWo2d1Z1a2JvZXpwQmxqd2xhZ1FLRXk5ZHNVcm5MYldPMm01Uk1peXoxUjVoWXFYSVVVQ25pbHFrUkdtUG9oTVhhcEU4Y3JiYTVtZmJLVVRVWnlxY0xsTytNbWQ4REpQLyt5ZFloRVJad1NjakRiUmR1RVNwY3VTckxoSFlkWHdHZHMrUk44dnVHWjJaa1o0V0hoWWFFaHlrM2JONzE4NGRta0QxOW0wVVZaVVY1V1dsSlc2WHM3aW9zQ0EvTDllUlk4L095c3hJVDB0TlNVNUt0Rmt0WnBOQnI5TnExQ3FsUWk2VEVwd1M1ZEhoNGlKSFljcnQ5ZEdTaHNsaGxITDdlRW1qZ0V5aDh0Y0dvNTdnSitJdXA5THRXT2VDWlFjUGJydkZxclRTQTZVOEZBcnpJSUJzUHR2bGpDOG5sVkJYOXdMVEd6Yy9ZWmNHYnVQWmJ3cVU2alI2dkM3ZnFiMVJxUGFWQWRKdmdXbVpBSnUwT0ppQjJkQ1l0eGwvRGk3U1h6S00rc0RZNzlteHJNdUtzb2E0WXg3YjlXbnhkQVgxUVNuVlRiTndHNWZ2YzQyZ3FCS1l1QW1Ed2pFZ2k0K3RaaldzNFM4UHIxQ0VXUkpCV2w2TVJUdUFlOW1lNmxOaGY1OE5HSE1oaFZCWHgxQ0VieUYyelVZbTZNeEo4ZFBtN0lzbld5dXBtd2JtcDViOFNraHBiSVU4TjJ3QU1hb1BFU0NPUXFiWERCYUQwNUFlRHJiMmVXcnU4RE1LeHc3VUNLaXF5WTJHRUNhM0tTVGt6S0JDWWQ3dkNSVWUxdUU4TWwvUm9lWVdOMEFJNWIzMUZtUVlsVU05UGhMK3dCLzZFNnJSakl6bjRsZWM4aThDQkFqZllxd2hSM0oxT3Z3Yjh5OWxjVnR6OGFaUFNnNVV6ZWxMQzBFNUU1NjlyVTQzdEpYZnRWM0piekhVY01iZVRNclcyM05wTnJxWlJqemJ0T0ZTSU1zUUhJM0I4akZoZ21BVWZpWmtJOUc2WVAzUWVRYkhPa1VTWGxzT2VlSUxlcmFibTJYN1V0Tko1V2IwZGV1OGI4OUZyL1lHSzB0eGVSZUt3T3h3eWIwWUgyRndhOFh3bWxwZUVhYjNSNyt0bzdLblBRNGhFK0diQkpNek1adVIyK0toZVppUlpGeUd5YnFGS0dsaHV4K1pSeUZKMUJMZ1pJTy9oN3ZjcFZlZTZRRmVFTUdQNWFuZGhBU3poT2NFbnJSczV0RHBYSGlsYURhb20ySEVkNXFOeTBuMjcvbnh0WGdFTHlRdHVtamRqa3ZMdE4ybTR5dzdMWC9zcE5NSnhMd0xmdWxMUkV4cTNVQlpDV1lPMnMySlZ2QVRjRXVBcmJ3RlZVWCt1c3dyMGZnZ3IzZ20yVC9XZmJSTWxwYkJhclkwOW5DbjJTZ3NNUTI3aVlsQlNlR2V0c3ZOc0hWdHpDTHk0Z3lCV1JXZDhHa21OZ1VWV2NBalVmUmJ4YlU2d04xVkVnVlB0QnRMcCtKb0Zld2xnRTBwbzg0YTE0bGpCR1laTDlQbXZaTUltbWlhaDZQbEVkaDBWUGFLM2dodWIxRVlPR0s2ajhOeGk1UEJWOCtVa084bk5TWGY1VS9hVU9tVHZoQkxKaitRSXBPVWJtZGVsTkhPSkF2ckFyaTcyYS9PWnFCNWprcDVhSnoyN0dnOExjU1dPSkR0U2c3eVRSU0RGVEZBTnZ2T3pvckkwQ1paRm1LdU8rNUxabHhKajlOSnR6NExJQXVmRWFpV1pLWFc3RTVBbldCU2pBckVIbXdFMkNxQUdWb2tXbUxtaVY1bUVVRTRTRGVjY0Y5eTFuTmF3MFJaM0FqUW1UbXVHZ2FjMXRndXU4Q2FDbWFFMWtacmd2MmZKMzlBazBUWUZUMkV2ZER4YXU3b3RodllWWnFNMlpaWDBiT2prbm8wekg2eUoyaEFEb0VmN2dtcmxoWllTa3MvOW5BNDVmT3VmWXZZSUhIRzEyelJibnNDYkJGc3FuWlVSZ1EvNTZWcHl1MElPajZLV3lyUnZKUUpBVlgrTUQ0aFBuQ1djb3hBcmN6anozTFl6TE1JNFdGSlk2NTBiN2FxYXNRRU92SkRqVWxBdEgvYUMrTU9xNUtxS3pZL0hOQmlpNXd3OTF6cnNZRVlqN0FoNGNXakRMZnJaMnNxUk9zeDZobWZ1TWl4ZFhWVUwyc1FHUmdBMFZJTEFiSEYxdEV0T292SHliVWVnSTEraENJNWJIOWxtUk5tVWlrRlBPdk9lS0YxMjNEWnVqcHFOTHBsOThBdVpmYkhnR1FoUnc2Um8rNkt3dHRMM21taXBURUdaN0xTS0xvVzU5anRXMGFoclJOaHE5Y0QvWEovTktnN1Nnem11aGNWUFRZOUNGZ0NrdzBnR1JTZnc4WUF5UWRCVTFIQ3Z4S2dUbTdma2FBd0U2b1NKMGVpblBMMHBEakFOaEZYazNUK1dBRHI3WDBlbXBEQkJ1TXFMOGVsTFZxeU8yTW4ySXZoRFY3eERvdzlLcU5RWGduSGZtVkVxZkVEbWtPTHRDR1JSR0lQTVBrQnhZT2gwSUk4UFpJQkFrQVQwWVBnRHA3YzdjRnhSME9WR0cxeEZTT0hlNFJ6b0VWY3krUmRaOEdaanQxRktQODVoUFlPbElPQzFDejhaamlBVFdLbFJxempZQzZkOEtJaGk5bGpWcFJsenQ5MmJSNFZSYVJqQ1hDZnJTdE9aVXBvYVFBWlh2SEJxaGdsSEJPWkNDUjdoWWk5N0FFV1JONXhnSTZQRTM2VU5RbndVYVZpZ0JsaGt2ZVltM1h5c21TTTdWeDJadXdHaEk1S01IdlhsQ1B1R0tyMWRXTzBYYm1RSUxSTWl5ajFBNjYvQWZCbVlmbHdJZE96RndadStXWkRDMTNEVG5pQWNVNXpOc0xlNmJkVndueGhYWmdpU3RjdW1KZGtNUGpiM0lLdzMvMmZidTZYMjM1YjUvY0g3SDdaSzlBcFQ0WUoyYWFMT0hJNGNyVDZScC9MZHpCUytuK01XY0ZNT1ZkSXF6ZElvdTQ5ZU1ZdmN1VjNJeXZ1ZlJYMjEwcjBMSUduUlJMc2pZZTBTVlJvR2hyaDBscnNZMlQ2czY1aCtDc1VYRTVYeG5QTUt1R1NpdnZtL3BXUXg3Y1lPVUxnVnBqU093RzR0NjVlb2xJVk5vSHRGM2x6TlZSZThNYTh4WFBBZlhpb1c0WjNHTjNJQk9rSXpOWHNFbHFRUVBHU0V5b0daK0R1Wm93ZmtUaWk2TlhWQS8xNVVaVWsybEpnVXNOUi90S1pJYStHM2Z5VjQvSVloajZRSEIvZzV3Mi9IclF3SDVuY1NDV3VaSThLZ21RNUZpVDNsZThuSmJQRzh4bUp2d0l0Y1Y5ZFZiSFp5V3k2UzY3UTMzNTlOTlQxUHdKN0MzREhubjdFclNNYld3OUlXbUZlbWR4ODNhbmIyWEZFem41bHF1Q1UxTkVRclFrbDAvOGdtMDFEQ0RWUUZibGNzbjB6U2Y1QmFiSFFKaVJOdHpRUmEvWC81d0FCVnQwU3FvRXluTWUrbzZBV0NkdmgvVjZyb0NHcm5SNGdBdzhLSUo5SkVMbGxBR3VEZXlwNU05NFdCMUhUUUFDMUw0ZFpSYy9MVFg2dmtkd0oyYmJDc0ZIWmExQ0hIYkxwZlMxYjRwa1ZUZm1aRXB1blZMK3RhazV0M3V2eURMMVVpTDVqTTV2eVorYUMxeFpwT2s0aFdkc2tUcExrT0g2dVFITnJkM2t0UXdVL0paZzJWekxPeGh3U3RUa2lLZ29udDBSVkY5bXVEeWs3WXpQZmhleDducFpsemlmemVvYkdRd0kxejRvbVQ5S0lrbEpBR05FSWo5dGNWUXI3bkl4azlaaFczU3UvVFcyZUpBbEUwOEw0UG91Q1NCbDRuanFtMUh1Z0VaMUZhay9pNjMvWWRGUDZwcmFBaTBLSDZHNkdLSUZjZGNYcXRuK2F2dW0vQlFFSzV6cGdwNnNPZVJScmtTdGNuc3YxWHVpcU5wbGpIcndZUzZoM1E3QUxsWXFtY3A2RGVhd3JqdHhUYU1DVHR6K1N6V3Q5ZGdKaEFqaHgraHJrZXVYa3dBemhNTzFzazlqVXhtOVhBYkdGQVk2dExISzBpTzNNdTBFN0s3ZkVjcDdEZE5BbEN0ZG50Y21XdE1xeGI2OHV4c0g3eXErc1Z5MmY3L0ROaGxMdkdRb05kN29uZ2wzSk9VTURML2RFaUpXZHlnMFUzajRnWE1qTW1IZDI1ZmRKVHUzU21UbngvZjM4UHkrM1RPVDZJcnVTcHRXTWdpN1UzVnpURmRYazF6OU43am5GdEp4bk5OMUlmVU5MelBOTU1BTmNSdXk1a01SNHAvdG5RVVptdDNyOHgrSHd5ZGlxTUlwTkJ2RlFReDB2Wm5pckFHcTF6S0hWNXhFbUdqTUZnenhuQm1ub0dSUzNjWTNUdzMwb0RuYithcEkzVzB6Rm85Rk5mOXQzbWpQcU9PWkJFeWpqcDJaYmV1UklSNUR0OGNMcis0bldGcS84UDBjS2RRS213NzU0UW0va0hkbkphbi9CWENQVWlUMDdDRTZvZ3J4MG1BYm5uaTRUN1ZkNmdNcGlaS0NDM1ZxdURtZU9NVXNQSmxnalVsa0Z0K01uL04zNndYSlJWTTd0eG9aYkNnajZzNzZyU2tGZTVTUktYcnROdG4zYWx3RDZaVGcxL1BTN0tJT05oOUZxNHNoMmZYNmJTSFBEZnhYeTNpNWpQbXh3bGErbXluWmIxMnNTajZaY1U1WmtBT2xkQUNpUTY2RlN0a3ZuR3ZYSXczZWt0bFQxWXcyOTlScks4UFBFQnlabDFwODRMVU9PM0IrQ3ZMNWVQa2tuR2JPVVp0WjVaWjlrWk5UUlpsYkNObmFmMGNxcEt6WUpOTEVGUFg2SVhaNVFLakNmNVo0MVZhRGNuVGMyaFA2NkxybkZVeExnaHo0c1o1cWVNU2JvbHBLMFVya01MQ2VxSXladGxRaklMR2x6ek1Rck5wT0ZHb0ZLUmorMHBkQzJuNHZ2V0hHTXN2VmFXcGdrOHJEN3dWZnUzcVNDelgydlFHK1pZS1QvTlRiNncyTlprbDZ5M0RpZkxIaTNOU2EyTHFBOVJ4N1draVVIRDdKMHNCOS9PT3hBUm9EbWxrMERDVXppTTRxQWJLZ21meHlvcEI1TjRsdnArTVdwYVI1OUdtdjhEanQ4OXdJTkl5Q0JVcEN3RFV3U3g2V1JuL212MU85OUhKTU4wMEpwYW1lZHBGeWh5TXBUWGZGRU5obXlRRysxVU5lUE9wc0U3RGplQ0U3dDVxV3gzbk1yQkV6SVBRMnBHSmJoT09rWWJ1QnBMNUEybGFPZWdQNk1RMjlvVUpic0JzeEcxK09sYTdLUmc0UTNacXJBb0tJNkF4eG1IT2h5dWVaWXljNzc1MDJ5K2ltUlk1T2N2cC9LdVcvRHh6WWZxZUdKQWszeTNqWXZvVmY0MFlGSVhqU2dEcjFVMURDYWJCeFZmbjlPK0c1VGNHc0dLVFZmL3Z3WS8rdXRRREs2S0xCMTlVdVQxanNPb0QxREN5QVFaUzllVUYyeXZJeHQzUlE4WmxyenYzd1FTM1l6d2Exalh6OFdqeDhXNU9PNytIeGpmUnEwQXhUaGtOUkY4N0ZubTVycFpoVGRxeVJQaytoZmREQ0VJSS95SGFFS3NjQUZoK3dWQ1VaNFJESDZCR2FBRnBVVG9jUktaQVYzRU03ck9uTTFZRXV1ZkNDMW1ORWR4MjVnTXhIVmZGdElVL21YU1M1amxmbnV1V2x0TjRaUys0d1poUDVMVUtxTnp0ZGEzSTZUb1FMVnpySkR5MHA0WUFabGE5bWVLMWk3M1c5ZGZxVHhKRmMyckFHRC9CTzRJODEwZ0Vjbm0zb1dMZ0p2S29TY2EzY2dmNmFNKzhKM2RXQzU2Tzh3WFk2ZmFkN0NsZnRaWmxtdjRvaWVpRll0TVo5MFdqeUVwc2JjUkNsSkxUS1U5dkJjdVFwam83RFV3MzV2OVB1NXhheU1yTHdJemxvVTVKd2JHVVJSbFM3VzkvQTdXWmxLNFdaSHIreHk3dDJFYlk2bFhhYkdPSTdHOTVvL1RKU1ltN2J0TFBxTHViL0dla0V0RHNoU2JxQ2JVUGVUOTZyRlpZM1ZlZjBUOFRqWEd4c3pyaVBGNm9TT2tRT1JaNmxOM2pFUXl4R3JCMjVOa0E0U2JOWDU1K3JVSDJxdXp0NHR3Tms4NVV3ek5QMXJZZzZvaC9xbTdzTXhuQS9oSTlBTEQvdHJkcDNiSDMyZyt2RzFHOCtjUzMydnNETFpsWDlKQ1dPOFZQdTB6dFV0VzhGY3NSN3ZXUnczTFpQTW9YdmZlcC90dzRGYTF2cTk4RWl2NDhQZ25WKzlPZXRobUU5NXZ1eFlFRlpVcTEvRXJqdU9qRSszbFJOOExERTV6M1lKZlY5eW4zMlpyZG5GSWZnazlEa2FjM0JjNHQvei93L1BlV2N0bDc1QnkyYVcvUzNIajlGc1hXK1d0YTN6ZjZnb2pobHJWZVd6VkY3TGcwZ2duZ2ZyeUYvMjBLOHB3YXhTTmJFYlZqSitVeDFWRzJJWXpvSlcxbThUYU1jYXVMTW13ZUtkL0F5bkF6T0VXUnlSeTlmcVo4bGgrUDAyR0hhaTg0TVAwc0dVTDh2MEs3TWZ6ejB1TU56QS9HVzhyV3VRRkhzaWNZVStlOWZBSWNqaDJzZjJ3aVNlR0xQa3hPc1VPSFFKSXNiTzQ2Zi84UlNPT2VGNzdqb0Jxb0R4b0xPK3BrTW5HaDNFNFMvbUFBcjl1eEVqMTBZdStjSEhxUFdnMkFnRWdWUDhXdnpibDRiT0JVeERMejd1cWYvN1pCbmhlK09kcHRWVFhadXFEaUNZOUdjMTdvSCtYc1BsNWM1UGxlNDlzVTV5aGxGYnc1c0t1bExRMVhDa1BxR01rWm1pYWVSTm84NmtaOFcwbHdxTitCbWU5OFYvNjNjclRHZUdLbE9EOXhhclA2UlhWOUdCcjFHMWdseVVMRExjR20zTU1EaVU2SDZvYTQzMndDK1plVFl5bFdYMSt5T0dFRVZSYXdXYzk4cmNpckdjYk9tUnR1cXIvTExTbCtuSmpPSnRUWGgvdUlRb1BraTZnV09URlByNERqMjdzSVk5WUMyM0xFKzQzK1NpZ041Ymx6TzVIays1SGxuclA5YlFGT2praDQ3OHF3MGgrL1ZsWU5Fc0F4dzJtZjBpd3BxV2twRlVJWkoxd1hMQVllTk04T2kra0pteHA4K2VmSDdZZlc4dGVOZVNxOWwzMDB3SFFPckVhN2NDb0N5SWg0Z0YzWE9MYndRUUtJM1VhaXBzQ2NVaFZLNGxlMCtUUkkrS2RDZ0FidUNOQm9sRkh5SnBWUkdRMTdvaVczU1ZPaXR1cWFzcUlpQU8relo5OUdFdysvbEp3anYwNzM4eXM1L0RyNG5RZmR5Z1BrRG81YzJwdEVLRHU4bWZkelBVUWM1L0FlNDNEalVNNnBJdmpMb2lOaEpmYmhvN2JFbVhGUkJVaWhKQTVLRnR5RmI2dDE1RHdwSTBSU2t4NG1sOFFhWnExdHRhdlY5UGt5bFRCUlJ0cENDYjNnUWZrTmxFaWNTL29CWHJSdGZsMFZyR2wxazNCbnV2YWNweUZyRGkwSlF0YTE2b1VPWXlxSHZ3SzRrSkJJdWF6RlcvRUNIRy9DNEpQMEwwRWR4emNjejUwMlpPRjZXU1JZcDV3UDU5S2xCMmo4cEJoUjJIL2VBN0JDaEpWWlFTT1U5cGFtYTBtVlNBZElIejhIcGxobndpL2VzUENtMTdNOTM5MG5DL2J1L0NwZTNxNmZYcks1Mkoyc0VYYzU5d2wxZ2dEMUJ5WGtGRzRpQStpL3E5amJSSytucUdXakhFRUJyb2RCY3owaWt4MWNNbE94OXZUN1RuZG84TTA2VGhRcklzTWRjUndhZkhOU1pueHM1MXZuY3VvWVJvQXZWR1k0NmRJZFRXaGFaSFQrVk9yOFFWb1dIc3VRbEV3TTlmSkppN2ZZdTl1Z2NLaXZWTzAxRURUOFg2bkYzN3Zxa09xZnpoQWRhbnN6dU03M2V2eTFzQ3lLRFFSWlRvekVpL0pUMVRKU0hXYWtNZWZybE9Ec0J2VStTQm1WRittdGdrQ2haMkhFYU44aHFRVm9TV2ZBcG9WYW5kUkdGbWl6WmgwSTRGcFN5Mk4xQzcrMHZyNFFrcFhMR3pRdjhhdkNyclF6UVdjamVkNm40NUF5b2U4SzA4VVRSSlk4Qkh4U2F5eEhwYnRrL1NEajBkOHVEcDMzVVVVWXhocXE1NzMxMko4Qm5iZ0RsU1R5N2FrVlgzaUIybzlKZDVkRFV6d0JLZ3RnSmUveXp4eVI5c2gzNXRxVnFtU0VGVm1DREJBdCtnSDJFZmVwS0VlWTZtYUcxNVV3MjBFRUFVRmpoYW96WDl2V2ZHRkZWN1pnY3gyRGFCckpJNzY1dVU4Ykh5UUM5azJVU3lLdDh2c1oySXl1b0s5UFlEajl3SGJYbzVyL2psanVxSVQ5UFhEblhlVkZhMzNzelBlNk8vakhJNzVYSmY1eTFsNXE5TUF6TWhtVlIxc0VjZWhVajhqc096eGlZNGlJMnc5cmdVUlpxUHBOOUlJSXEwd0ZIUFZRUTY5Z3BDZjFNRVJ6b29GaHUvM2M5VzhBdmNBUzFhUUlzeGZ5cEpDeEVXbWhIT0lhSm01V3d4Vm96TE5ERHpwQldPaFZ1R2pxeExaQXN6Ky81U08wM0kwRkRwaU90QzhvQUlrMitPY2FsYnlrL2Z0cUdtb1IzejdwSEF4UFF5eEJScTVEVlQyODZyOUlkSXhoYWlEQkZCOFNROElSQ1ZmbDkvKzNzbkd0MEx6V3pVeEExbHQyZVYzMmhLYWNucTZ5c3ByakM4SGxqcFVkdjdwNG9reU0xdGpFS2YzOE5PaCsvNTJiajdpRm1hNTIxeUF6NjM5TWNBZWFEVVk5RE1DSHhJYktiVUgvanNaMVpvZUxweTN3R1NSKzNlcGhEd3J0a0J3YjF2RzRYY3Q4TVZnNm9laitXRlpkUzdxSllob0RnZHo5dW4yWnZ2NFNBQVBrR1pjTmtuOXNCbHBQYi9Za3JHUnM5SUVUVE1wZmlYQjVqYlA1UGU0cHkrUXQrR1IyMzl5WlBSNHpSYXZaeWxpSWhUeUt6dm41NkZhUXNpZm5EQmtJcE51TDgyWCsxK252Vk5OaGtkeVRtR0lqL3VEbDN2blh2U0t2SU93N3lhZzhCOG9RVmtURi9EeVJZTkpwVlk0T3hOOEttUE9yYW1ud3hidnNvc3psQ2tySHlXMHBRUjEyVFRremtOcGdIMlVldHJ0YytyS2FYallkWlg5ak9lV2FiTGFpYm9ZdnBxNGV6eTdhWk80UzdudDA1VVZBeEZpTWtyT1JQTkoyaG55a1RZYmNWcWZBa2wyNnl0alp3SnVscmdTL1ZSZjM5T0I3djNydW5KSzVsQXBxaUttWjJxYWViT0lNK21CNGlvaDZDcHZhbWFTKzJWdEMrVGJ6WU96dW1USlZsWXVmd3VLUExRdW0vU2I3T1JsaU5uSXhGNS9Pc1FHd1FCNmRPcWF0VXJUQ0htZTIzNEZYcTJzNSt6NDUyMjdqVWtLa2xVT0ltMHB4UTFMZDVFZHowNkRjeWc2d1VaRXFvMk1pR2IyaFF3SU10UTZGTk9wSzB2UjN6RjBWOVVOUm9XM3F3T2hlTUl5cEE3RXR1UTA1VC9TMmlySmlUOHVvVFFUOC8yWDZ1UlptNWNNc0h0WDg1QytIczZicHlBdEYwcmZ2MXRDQ0xHeG81UHdydGhsVndRQUFkOGU3T0JYclJQRzAwMFgrcE54citzdTFnN2VNU1VLOG5DaVlTRkFLZ2FJRlo3SitFSmIrSXhoNm1henl5amM5NnZuNTQ0M2d5cVJLV0xTbjlLa2hLalpPUmt0QU5pcDhqNU5nVk56K0JicWE3QWhuaGIwbVh4L3ZHdmJDZXZzakJSeE0zTHNtejhUcGR5aSt3eEdYVFV6eWdVY0tKZW9ZRU1tbUs3REZlZXZpOEc1RURDcVJjSWIxN0N2OElrdkxKQmhNRXZIbGRjaHNDb2E2VWMwSjNhamZCTGNoR3M5OWJwUmRLYmh6R0hxU0dIeWN0clIvNHl5QVczOVFIYTVxcGNSR0ZXc3paaE1Cc0xURjJzaWFjMjZGTFRtU3FPeEVWZTMyZ1pJb0pBT3FOeCtYbHhmN3NjMXJ3UDhQWTNTZlM5Z2dBQ0lSQmU3amZ6am5lK3FCcStRQ3Y4cTE5VCtDNzN1R1Z5RjRkUUNkbTN6enZlL2FvR3VDUWx0aGI5V3ZEdWp3MDk3UWh1cjlYOU13bnBYbjg5amVuQlpHVWVWbUtBQ1JEaFJnRElLOFd2NWVCaTZ0QlFxR1ZOR1hCbkUxZ0k3VUZNZnQycVduQTlqNkRSd1Z1M2s5R1llWUF3N25mNjA2aHFSUml5OVRRQUpHRytveVVCbDg0LzhTOUlXMTdNRGhaL1AyQ3dWZXdKYkRCOXkzMzJkVEpyRFpSU1p1MGMrZjhaTHpUdDVjcGRJYU1kaERmc0JDOG5QK1BNSHdRZXprN1FhQXAweVJ3VFhsNEN3dUF4MlE0dG85VS9POUR4eVhxL1JOKzkvNkc2bkF0TEVxZWtFcjVmOS9YN1R3aTRpakQraksvRUgrWklPN2xvOXpsVSt4VUJMVzA0aVJwYjEvbWEwRjNGQzRzU2w2U0NadTRvaVE3RXYvazVmZXNMc0dpaDRmOFRDSzZucmdxdlhBdHhkemU1aWtZYVhkSEU1QWpQVlI0UnJiaTNyS0JvUkhCMnFPYzRFWUNMdVRWK0MrZElkZ28xbTBUTXBsTDJlTGRiZVdyRUN1bWNGZGlxVmpVSmZzTXNybmJ6dFgvazZtNXl1MVQ1ampsTGhwdUwra2wyS3NWT0l0b3AxRDFlODFhZWFyRlNwSXpTRjZMdlc2ckRWVmhVUWpIcVlwM0MvQlB3TjNNbUQ5V2ZkK3VQd2RGam13bHhUa0grRmZoYjVUWHp4YjVjclRsVlVhRTcxaC9DM3FUY0xySy9Hb054N1p2VkE3cTRCdEhCQ01wWjh1OWlCRWRyNTNwTGJzSVAzenJ2Qjk5NndMZnhSTmJNSkF0QjVEOUcxZHV5d2FIaEcyMGNnalQ1OTg2Wmx2KzkrYnRWd3pXcjF2K1E3MTQxQkF4aGI4Q0t0RjF1dm9TaENmcnJiRkRZVSt2cGc4WDZibmU4aktFSzNqNFhHaHh3T3dCdjNvVDdHL09ON2tjTTMyU3JzU0E1ejFERTkrN0tsRzl3UC8va0RSYnMrRS9ZMGYxTk4rNmt6L2JjTXR0bm5aWEdZM04ydDErTi84akpIaG41akhQaDlkeHBady96U2lrbTVkMzRaRktNR20yUHluWmJVbW5NSnpFY1MwaWNJQ1NUTDFZbzQrazZVbHdCTEIzNGZjajd6aEM4NWY4UFlQL1NNWXhlY29GL0tsQ0NyZ3lXV281bUhLZXB3STk5OXF6N0lWbVBjY2pRQldUL2doREpmTXhGZTdhMXdCSzUrd2E3WEJqMEdtMmpzcC90a21XLzRqMzdVbklCRUhiQms3MHZGRXovYlNTRkowejJGYjhjZnU3bHdLcFhjR2RlZ3JlaStqc3V2R0t1Y3EwekpaaVMvNTJ1eE1YS3M5WFE5SUNTZE55WjFNQ3F0UEJ6R2VCNGk1cVhOY3pkUTQyQ2RxekZ6WHlVVlhpNW9jMzI5bUwzZDVKK28rc0FVTFNmeFM4TzBZc29CWEpWaGk1ZFRCZS9Yek5iMVFBSDhIdmpBdDMrQmJObGRkK2NadjcwbFByeEV3R1RRZ0tGYitCd3Z5M2VPVllVeE5MNGxoeE5TcnJZMlp5VWlpQy9EazVCRE13MkcrZU95R3Z5UmpYNklVZDc2clZML2EzQ1hVWmRialJUWU4rVDg5RytsdUZyVTVuZzF6S1ZCTUdNay96bEozQVNXcFVRRXJUMUFRSWZVVWgyZm82RU5janlMRVd2QU5IbVRmOSs2ZC9vS2hKUEszK21Cd0NCd0tFWmRsUHpDdkZIeFBrdmlnVlpRdVdBZHc1dGtySDg2anQ5bkM1UEUrV2FzZFlpOGtjUDU3S1NLNjBTSitFcTUvR1RLR2ZhNG14MVBibGhIejlzWGZsVlE1cWdvKzhXNWQrc0Q5a3Z2ZjA3ejFncDB2ekNncnV5S0ZYalN6ekZ0TWxBczJXcXBmcThxdUpBVFZ6SXpOVFQzVStTWG1obXM0WS9sSTMxV1FjKzl3RDM4N0FodkF6SWJ6b0dBSDdQU050dlRVRitia3NVTWV6dWExNGpUd1d3ejBtQi93YUhGUktQL3AzbVJhL3JTRTlLZFJWWjRGQ3AvekwweG8wSmxCeFNIaE9rbnBLWGZ6WXVLMklyVTkzMjFtemJPYURiczNmbnAxRk9pYm5PUnorcnJuUENnVURRWFBvdkJSOVdlQndqeGU4VmtFOVFEVEhaYUZra3pzSXpqK1JOd0Y4alBlL0tWeVlsMVNtMHd3Rk8wSjFHQnRpMGdMODE5OXMvQjZzTlZ5U05WYW94aUE2Mll3bHN6cGFPMkt1VWx3YXEzNHZGN2RtbWJTR1NmTnA3L0FOaHYxblpEenpjQjJPVG5OU1lkTEJDMGo0anRwSkZMMVpWZWFuV1dZRmR5ejk5NjRDS1U4bzVnbEpmbTNUMWwxVU1jd2Urc2JqUy94Ry83RkNsWFRrMWtPUHdCOWpoVmYydTQ1TzM5OXFYTnZOMjVuY3VxOXlNK0N5Wkp0bWNlb3o1MjdpaUdCZGpGSXBOWXV0VXlFM1VFTmcyUzJiUlJORU4weGxiSzlRNDVGa1NPMEo5eTRwVFcrV3BVa1FmVGNBOWhVOXhEV1RLRk8vajFHMzJ1Y2FvbGlLWGdxMTF0U3BxN0RzVTZ1OUUrV0FiTkYwcHJBeWpaNTFOMUdkYUNjS0RSTGNlVVBjNmtoZVVIenNJV0w4MDMxTDRLdVFWU0lWd042aHQ2ZCtXeG5qcllHQU5tRFg4SDlnNGlWczk5R1JuLytJNHRISnRWLys5VXN1Vklpckl2cHEvdGJzTTJiMWZnczV6bUhQKzltbmZ4Tm9WdVgzcFNlb3VubXdrV0ZsOEJHaFlUbTB2RDJiQmMwRUFZb2JHNkJNelE5aGh0U3NnZHpkNXg5Q3ZCVUgyeUhpS2lJTTZuZkFJeVhvT2thWXJkc0JRZURXQnc5RVRrTndoampZUHFwRE5vWkNHWUszaFRqSlFBaVg4Z3puamxEUmE2NE4wbi9CU1IwZEd2ZXpiU1E3K0NkRDArbE85T2RRbDQzQkZlOVBodUt1WEJwSFc4QXo1YitGakpNbGpvbXlLc2ROTjk3VUNnRnN1UWFjQjMzS1pnTWdWenE4OXVCOGtGSmpBTGpyUlNxZUZQcGlSTzlxSCtJMjlUQVo1cVJHL0p5RDVVS3czOVlFU1hVVVBFM3ZrMXZqdjcrVGEvR3l6bE9DZHdvNlFGdy80OTBFNkZxZ3BkQmVLRnZON0MwckVkaHRlb0pJeVp5VVliQU5FenRNbHl1QVJSVE42ZkpTcHg3a2VYY1VoWTloMG5nT2pBOUNLOXFIK0pFRDI3Rzd1U1E5b1VXQ284azdZUkF0LytHVTY2WjIwcUNKWEtOcEZlUHNBVUhnd3htUXZmRTNMazBOSjNoa0hqZVZOVEpjN2hZVGw2TEVvVUxoajlzSEtlVVlMdXdURHA4MTdSU0s3Uk1QQjVLdUxjNmFML292V3k2REs1YmppYWZxd2xtTHE4SThLKzE2eEFOcU1TbmdickRCeS9WTzBpVThyb3N0dnZwUGEwMURUSlRtWW9tMk5MMEloUXlHUGlwYU5zVVUydWxsdDBoeHRraTJSSTFzQzhsaHNxQi9UV2w0UFBET0tZaXlpM1dIaUlWMFJIR1JqWDlCa2JrcVEvUFBrUEhRam13TzI1TzR3ZVpMTkVTQ2JHUmNNZHJmRDFqL1R1OXA0YlB5S29hVXZ6ZldKeWNmK3RwMzhXc25vZjZMOGQvSm1ReWtldzUwNE5MUmJWVzVmc2hZNnN2U0lISG80aDcwVHV3ODNLMzRHMzJrNGI1b2oxTSt3STVJemQ2a04zQWlWWnhnTWU4ZlJjT1AydzI5aVlYdHdOMnRqY2d2cFNFL3lxQXg3OUlJYXF1RGErMENiNGlPQUxvUnV0Q3dMYnByT3YrV291REw4RWVPb3VFS1F6SDFBZ0hzeVJXdFJDUXZuTlZibHBMcmx6bFd4dW81WGJxOXZGdHJJOXJnZ0cxbXZaOWxwUFdycE9La1kwc08rQjBqeWJQVGoyOWk1djMvbjh2dituNTg1N2cvSHRUbnZ5UjZBY0QvK3ZBR0FDd1dxUHlobTk1dk1xMnJlL2VBSTFwWkhuODNTNk5Kcm14M09UVFRWV1BVNDFLT0hIYlE2VWxPLzBKcHo1cWZGZXN1Z1JHN29CdnlaaUswQ2hKeU1SK21sUVpyamdReTJpSUhNWm5EWGpMVEZhcHRsR3UvMmFxL2NtcThsMXJIZFFCR1BCRWM4SW1zSXErMCtiWFdKZVNNbDhNVHBwTlJFQ2N5RFkxazdoOUVzcTY0OUIrMlNWSFdYN2doZU0zUjU5Q2xSZUxIV1d5WjJzYU5oM3JOakRjTjdjZzJxTkhLTnZ2ZDNTK3d6OXgzcS9TdGdobGhxdXc4ZFhha1AvUUFQYmN4RGpha0VKTE9TNzZPTmx4UFExRm5UdkY0OHpHdGphbzBmMjhFTlg5MHVZQjkyYlc0YWtTdWdHTDgvaU1iTHlJQk1aVHdLSUxHOG90WnFBTFgwcm5sMGYxckVhRFdrT2NGVW9wMHZVUVp6dDVOWWJvemNRUWJuWTBUV2hlNzMyU3lkWGhjTUcyTUtjdE1vYkdoT2o1MkxkaDlxTEQwVk96RUJOVlk1cUNtS2FzM2N4WXFWdk1vNmxnbVFuZ1BMU3FVOSs2bzZITnkyUE5wUGlkUjluVzJIK3N4YXREcjZteFd0OU5wbXJ5MVZHc0RzZWU5T0VPaTVBWTAvSU5hYkdFaEUvdHcrQWJTK3V0QUl6R3NHZFUzWG1jVzZ4dFpNbFNRMFlSWVFhZk02TS91U3JxeDl4eVllblpXUmtVVDZxSDJxZWFpSFIrWk9TRDNTeXJGVDlNd3FFQWhhUFNST3lrL2RNTUE0MGZia3R0SVBwbXBGNUp0WHdpUExwckpDOTkxVUd4YXJJTEtNVkpackdPTm4xS1ZyQ0pscW9lMmdPQ0ZEWWltcFNEZFVIQjFWdGE4OTlxa24rc3hwMlprMGQ4dTZLOHU1NDZYNFlnblZ4a28rMkJKOXBIOXlncS83RzBoWklRQUR6MEY1S0ZSQmIrV3RmdkZ5bjJybU80aitGaXFLdWxlSnd0aC9xemRVQ25na0VvcE1jUVFUenhjWlNLck1EMjJ6MTlqZ3VlNEZpNEdtbDJrTjRub29zYjFTeUl0ZDIxQ3ZCSkRxS3pDeDBVenlFSVNjRkt2Zm90aUJ5bWl0OVppbGxtMjloSytkeFV6SUtucUFhSlhiN2ZZTHczelpQenpuUjg1WkN5Mk5NNHBKOWpnVm9Wc3lFeU1QbHMwSHFvenlMcTVLNVVVUXNBRFFVYU5KN1N0RjR4Sys4eWRpd2JEZEJMNG1EQjVWdWlXU3lGbWdtdE5IVmphWFlJd0hIcVVFeFJPRjBZOHVJY0JZaDlyemNOSU9FRUQrVVYwcFlMaVdRMitPNkYwY2J6WlErcUpNbWsxZ0dtSkg5MDR4c29wVURXMUU2cFlDbWcrSGU5aTB6VzYzeUtCRnhzQ2hHcjlmTUVOK3lvMiswVWplVHVpOTk4WERXRDNMN2ZaN0lsOEM5K3cvYTB6VmIvVWJMRXpWTjFaU0RnUGFBc0dYb084cGYvUm92ZUVvZkVsUW5KNkdxMjJHMEpWY3JQTlM0bUpwT0dqUitEUnJmZyt3SVFKaHVLaXBrekUzenRqdGxoRVN5RUxESlBiTjFoS0dlN3RGR3pCblRWT2pNWDBBbEhNemxodHFROFM0Yy9Vb3RPSHhEVEVudDh0N0hzenJ2cGRnM0FPOHJ5VlNLa2xDYmZ0cjdFQnBqSytvMGI1U3dyZGRpeEN0VTZ2K3loY2laZGp0b0c4c2luL1BGWGZhWkJ4YTR3QnJPNDRxcmt1dlhRdklrSmJhbzdsc20xQTVGbS9UV01LakcwL3lsa1Z4d3ZPYzRGREZId25CbHlSeVJFNlRnWlJ0ZEpYNnBXd1lyTVVDOUs3VGwvdU8xYjNGbTJjWlozd1IzQzhPSVVEZTZYZElFNklRU3c3b2JyeCtxL2dyTUhxQTkrM3dWWGVXRktIUHZ2cFlTcGR1ZnZQTmUvRGtLWFYxQlFhUVJaUjhkdWVYYldZZEw1TXppcFdaSTNTaEg1UFl5Q2VwQ2hwZzhYWG1pZUswZGwrMXJJMzJyRFM3OGEvNkcvNm52QXVlTFFDQXIxQmNtUFlDK3E2dWQ0V0FUU0RHeGhGWHJaYWpFWFQxcDhNTWloU1RYSk9hYlpkby82Q0hOdlRaNmJUMm1QbEszdTh4VEdJQkk2MmowaXA0MW5rOUwwdTNFVlA3S3RqUEplTHZGU1UzK0UvbDdKYXRFZHB4VE1PbGpMSE9oQ0E4aU1JZ1phelVKNlVDNjd1Uk1Da0RyVU1YYnpiYzh5SDR3VXVqZGxhNHd4SVIvNWRqYkFwMy9oUFp4THM1aWl1QzNsZEd2eUdCWURzenRrSnJFZDRtZ2I3dnRlQVRoaGsyYUJEZ3dQMkdkT09rUmlyMzVSa2FJTk5jUmtwQk9ObFlnZXNRZkVzazdXaG1TV2dxdmJteU5WSEVvWG5yQnRrUTVvbmxDeldWMm8vWFNvYzJZN252MjJTamt3YlZJY2E3NTJ4WTIwSFhSZ2MzeitjNGVNODg0K0pBcDRwYTFZWDJQTlhhZDhwYjdROHBGanBYaFhPTCtQZVJDRE1taUdQcGxOZEN5S2s0Nml1d244VmswOEJ5TWtWQm96aE9VcE5kZ0FGZU9Rc0VyZExXNFBmdEt1Z1psUmpvMFJ0NFhySVBzQzhyK0s4NjR1S2d6TlYvQmpmSHV0Q1hkM2tHNk5pYWpqMTFSSUV6UjBIdWxZOEFIWnEzYUw2L05vKzFyeHpPRm9qY2MxaGFyZElVZE56RzJjRHl1NWRENVBPTG1iK1pWV3o3QU84cFBZOXRsY3VrMlFLNDZiSmpybzgvblBMNTU2ODlkWE1XcnorU1pRRlo0aXI0cjQ1S1NTM0w0cldwNlBrdUVUMnZFR3Qvd1JTWVVCTWxjNVdlWTc1Q2QrWHRlRzRMTlhkTVRIT1l3Y0c1QnpkNGpCbnVMcDJheUV4RUJBNW5aZUtSVzFpK1J1MVIwbXhHQXl2aVV4dTVGRk5oVUJabGg4S3lLTnhzd2pnRzEySmJYdTR5cjdRUlQ3VmFqU1QwZHJzZERNRE5SUS9ZUTdHS3BGTWNCcnNKVmF5RkFuZ1Bqemg0VHozWFpSbXVHR1ZadHVGSVlSUm81SklwRlFKSW1WRE9UQ3BvTVgzN0lSY0RxRTIyMnE5a2JVQVViY0p3cVJaUkJBMTFQUjZBRnFwV0pJNHVscVp2eDdUYmpjZUR2cjA2b2MvMitOQkd2a0dtU0luVzRrRFV0U3BmQmhhcGtOcWRCMWZxK3VXeUN5eGZUNmFrb2xVNEdSaGJaZTJpWmNubTE4SDNZQzl1N1JSY09YY20xOCtZYVRlQ3lVN0FxSWV1SU1wVFhFRjhXcjZFYU1udm5jcTFxRzZHOG5xWmJXWjl2US9LbFhzbEdFNjIwSk1mUUpJbjZyR0UzKytXYVNaeWtoYTBTQlRvVnpFMTZCN2R5MTVGZllWSWJiZkFWZEl2VnMyMVI5SGZJUk9kdmRyblZEUDlIdDN3ZER4bW81d1FVT2EyNzlSTmlmTjh0V1VZRmg0dkE5c2xsWXpiNVg3Y3pMbmxoV1hpalZkV1M2cDNYR1BOdFZpa2FhVXNlSERFcVZlV0N3RFRZVTE5Q2RNZVJlTnVwWWxWUHovd1pIdms5ZWI2T3ZYOTZiaFlSQUJlWVlhMVFhOVlVRlBqTjNMbU0xTXkzdjNkRGtOSlF0Y2J1Q2lMYTV2UXdyeVptV1E0a3FIeTJCUnhzNEVwOTMxdk13Q0NWbjd4djlLZll2K2tYbVpoQ3R6M1k4b0FBb0RCNEQrVVVjWU02NzcvQzgyRkFJQ2IzeDIvRGdCMzMzZVorRytudjNkT3Q1N2FqWUVBUEFBQUFmN0hRNy9kUmt1TjlvZDk2dmxDcTQ4blRSaDZ5YkVTY0tINWxLWlc2WmJUZGF0UUoxblRqSGpLb2RzdCtid2ljdjhRYmJLTWpwaTB2UDlXeTM3Y2NvRHlDaGQ3S0RSa01FT083aE5UMmNOSGNyamxNYlBuWGJON2MyNHBuZHF4MlVvK0Z0Q0svWU5HLy9hUGZrQ0taZTJVcTdSb251TXdSMUxsdDI3QUdtOW5LbnJUTEdsakJrVEJTUFk4U3RydmNPdlFXa1ZlSmt2V0w3T3psc2NPc0tuYXNSYzgxRVhZT1Y3TElPV3oyUDlCekMyRWlMQlBYWVQ0c0pOTk5NcEpGMERyVTBIcmVVbDFvOHhqNUpFYk9kaS9Za2RFK0lMNE1XdjFsdDUzemdUa0lmVnUzY2JMQTRISXFpcjgwbUgvUm42SXVtcEhwb2pmb3FGdTVzZ1ptZFRYc2dNVTVXVVFLVmQwMHJrV3lIQy9FQ3FFdkZFalpHN1hDZGxYN1h1TnV5MmlLL3BoUXgxUUF3QlZzSDNsVHFQbjgzcjRHMnVGeDNOdHlPTkRDSGk2a0l6eFhUVExQVTRMUE05djNXSnI5Nm8rUnFMQnF0bmlMYmtDNklyK0lyaXBWd0p1dTVtOGs2MVo0VHhRWmR2UEd6VXFPMnQ1MFpUYzdLVVVXL1ZXd2Q5UGN3dmx5dXE5OEpqdU9VQkJoRld6Z2VZbzlZbGJ5ZmNmK3EwdnBmd2NZU1dubjJ2UVoySms1eVYvN1dRUWRIemU5Z21hVWZuNDNncUFQeThDTk91Tm9hSHJjQVFnREJLSWJjVUhEelo4WkFFanVSaU1BUUZnaWFLZk1kcHU5VlREcFFSMnFpL2xRYXpsVWdaOS9YY3BoWHZZWE1xSFkvUytWQUNYbUhxSkZicEc0TlVSd0lMVVhrb2dJZ1pCcThoSjRVams2dXZtVEVqdUVMZnVrdHF5Z3J6OGloQW0vVXM2eEp3VVIxcFhZc0pGMnBTRktGOUNQMCs3Q3l2SC9pNHRxRFNSbjUyeWtTUXNNcGNvQ2VsbzJwdk5LeGptVjJaSDJFZlNLWmdtM05mYVlrZnVJMXk5S0s4OHQ1MVgvalFaMFVGYTZENFJPVWtvUGlMTGR5MndzeUxvbjNwalpEb2grOXRLKzJtQWlnclUyckllZzZ6VkFhZkFiME9JNGY0d1ljR3dKMUdlRUw5VHNya1RzVklVRzRJVWVWMitUcXEycVoyUnNLbk1lVkc1ME5GT08wNXVHMzdOOXZTWHpsRWZYODFmdlA1M2pmOWYvVGVzeFUrMjhSMEd3eUVNWlRoNDF1ZlFoZkcyZmZwbkFpL3ptZEZyTzU2OGpVY1R1c3lnMHd1NGEwSzdRTUdDNGJxZXY2QlR0T2g1czN2WTVLRkdEME9ESjRFVDE3RE9SYlZPcW5HR2NlRG9ZTi9CVU9tZ0Noc0hPN1lmeW14VWFscUozWGZiNnlsY2RoL1dyRlJzT2RPS0xINmhXYlFDczU5djduUHl6QW5NbTFqRVlhSWMwelptVEJJTURMbFAzMENaUmovRE9OUFM5WDZhWHJSVW5aK2lSa3RXKzBsYTdaT292Y1NtMmNucUkwMGV5b3FnbVJXK1NkSDJNU282eUN0OXZlcnhkYXFqSEsxU2o3UWNUUzN6VlZKOHBXam5LRVNYeUNXMUw1T29KaFV2SWdtRjRYVm40WEZYWUxmNWRCWnpCMmFka044eWpZZERydEZRZ1dGYTBINVU2QVY2NlBnc2FOVlphTlE4cVBsRVVUS1FGVzRvTkR4dVM4NmJnZ3lFNXlZZ0VWa2dGb2toNGxLWW5vOG16OEVOTndXL0lYeldjL2hlTGhtbytJcnhiYnFpMldZWnlhS1ZSS3prNG94bkRYNkhqeVZyVkZpMFVsTXJCZHdENmxtWXllemZHbHNFNGN6Z21iRWtFTldWQ2xzWjBCbGxEYnBEWTRNMVljN3NIKy9pYjN4ZHR2eGxyYXFDQ3NHbWErQ1QwczcyYS95a2dxU1RobloxTFJueFpmYjlpeGN3cTNXSjExdmxWd1piVHNoRTZTU2ljVmJjK3NRc010NzdUMlprMkpuYXdqRFFXTHpURW55allKVVVoM3ZYWk5qWmJ3eXB6QzNRWDhEcmFleXM4azYrQWdBPVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xNV9fXyA9IG5ldyBVUkwoXCJkYXRhOmZvbnQvd29mZjI7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R01nQUJBQUFBQUVQUUFCSUFBQUFBZ3lBQUFFTm9BQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdvRUNHNGc0SElWVUJtQS9VMVJCVkZZQWdod0lnamdKbnhRUkVBcUJ0WHlCbmpvTGhDb0FBVFlDSkFPSVVBUWdCWVVHQnlBTWhoWWIrM01WN0pnaDREeUFJRXE3czluSVFPQThLSUtwZjBEMi8rY0RPZ1pvaXd1ZzZ1WXZFcFNXR1ZTcFZjcUpVb3YwdWV0MDBKVmhjMUVGMkVxcnJZeWI0Uy9qRzE5VHU2cXZUZTlqT2ZBekhBaG1oa3ZkK0JxWnRwd1MrTVU1V1NCMks4dk90bFJGaS9jMHkrK05ybUZvMjU4emtFU0w4SGsrUzhzUHZaRWRIb1J2L1ZkSWdNRXdCR2RnMjhpZm5KZUVMMXFMOTFWMXorekIvOEVMQURoV0FDQU1JRGtXS3F3WVZLSWlMRERmYlMvVVpVa0dCZWpaZFhtZytDb0dZSnZpZEk0WmhZV29LQW9DZ29TQzJFaWtWQ2lJcUtDTldUTmpWaTFjSml1WHJ1TzdpNGp2VVJ2U2FaNnNzdzUxSU1LUTdDUnkva3dQZXRRWENLWU54elUxRFZzbjIxdUJ0bDg3YkoyY3kvem0waUU4NUpFSENHa3lRb1VVTmVPQWhNSHpRSW9nYVc5VFpQeisxTDIrOXl5Yi84VUZEQ21uU2dYK1cxa1hCOGwzY1pLMkh3b0VMcENLWTVldEt1Q3lkQm96ak4vQ3VUb1FobVJobWg0Z1BETVlFNlVyOWQ3bjlJMzlQOC9zZ3ZWYzJaV0wzbFU3TUF1TGhGTHdoU2pRWEZLTHpsM01xYnpCbDZaV21wR21hWW9kTzhWcGRtNDNaWHV1bE00TzhBZEkrQnQ3Z0s0d2VKVDgxcHpucHlla3FKMUcwZ1hDQVNYNTNxYlkvN1NWcVpld2Q2T3BrdUdyZnFnWlZ6a2o3RUhiZDh0ZnZRZlNZRGs2NGhCL0ZqMGQ5b1pIV1h3dGN6SGp2UVFBUVdCektRNjRxSWQ0L3o5VHRYWUdRMUJMVUhyaVBqaVFsK0ZJWDZSOW9kYlJGenRlaU9VMTFjNmZXZXpPekM2NVdKSTJGZ0FsZ2xRQ25RZ0dNVnBIRU5RektEcFFGM1VocEM0a1FxSURSU2VLdHFKajZDN0VXRlN4VGtYbDFtM251eTUxVi9UZFFVeFJ5NWtrL05oOFJEb3NsMW9JWDhlbjlwbGVCeG42WWhGQ2hIakVjZ245YzYrLyszaS9iLzhkRkNadWxCT3BxT0M4cU0vZFljejlkeHErdVp1bUNWdGxDaWprL1lFSVFodXZ6a241anNSZ1FjSjdqaUdSS29RWUhlblNHWWJra0ZIMEhQb3N4dlJGSE5BUGNWcDhvcUVGbi9uRUVuNVEwWC95aDhCU0FHeHFlRDIxYWNkWUFsMGc0TEpuQk1PQ08reUlCRG5BOXN5cTRqeXRQYmZZbUZ0N25qR3R1UGFpMUZLVGo5VWV4dDlTd1YxTUFGUXYwaG1WTkIvcGJJMVF6VVl1bWdTdFpING85Zmtvd0V5SXVRcWNBd2tpWkVJalhKeDFjNzZqbEI5ODRScDYrTTAvQnNBb0sweVdEZXJLWGQ2QytheVFDakZlWVhaelJJb3FsZ0Y0bktSU1N5ZURWaXZIeFNyVXNGK28zSmRWdTRzbVQzYW9iMHhvY2xaK2c3WnBqdzdxb283cDlOSC91dTdxZ1o2dGR2ZEduL1NiL2phQStzR2phcEsrUGUzN3FJRkdHMi95NDBlYlpvNkZsdTh1eVhwbk9NL0ZIamlJVHJ2eXJIcTN1TXVKVVUydjlTYTZlanU4ejRkOXdtZDkyVGY5aXgvNW5WOVlIaGFSMk14S1FrS3lpSDlYeDJvMXJnaFJ0YzFDdFpGMHFJNWJ5aEFoUDJWVSs1WFNiU0tGU3JPbXZydlFoN3JvN0s2aGdEclBUSjFpa3lTMFpsaWgzb0VjSjQvSUExSks0dlhzbGlCZm9Ub21jWkJHa3E3N3RaTTE4ZTFXWGF3ZHF2U1ZRNGErZk5EV25Kbll0R2J4UUdvWVZENnZNaG5WUFFQcDFlcW5acTAxVlpQaUdiWFZrV2ZrZ2NvbTVWWFRoM1NvSHRMOTlZRHVvUHQxSzcyNDcxRi94MUlySjEyVnQxUEVLQmVCaW05Vk5qSmlnY3dvK0FZdzJGOUZGT3BjVWtIR3FlT2tZaXhXcWlhcXlpRmtQNnExVVg3U1RyVFZSL1BTNVVOM210dUVJNUZMTlUzUXdsYUFKYTNhc2xPenk3U0Z0WlZ3ZTA0ZFkrUy9PRndoSjhoNkNCN05oNDUxUWN1dGdoekZzajZXcUtMTnVPcm5GZDRZV0F5emlMZVJPNWpuYnpPZWx4NmU2NDY0THJZZVN3NDlXTzRIWUllcm1INkEvRGJFN1ZlQ3V5aVZJanpNeEp5RTJXV29ublZKUVQ3QS81emkxSFJBNkVYWm1hbUFYNk5MNXdGU3B4SFpsNVRsRndNS0w5dFNnUEtyb0dxbFlLZ1RZTG5TbWdnUWhyQkVJNmVKTnRhbGtTTlp6UWN1OGd2QjM2TDhkb3FWcGFERit1SHBydzZoRCtLNHd3ZVJSczcwZ0wyeVNBVWx5ZUhIWEt6MEk1Qnptb2VUNGx6NEZGZmx3S1NzMzBybWZ1Y1BmdFdyRWp4cGZPWTlIL2pJcDZaM1I2YnlMTk41empGdHEwd0wvSjhYdkwzdXNNZVNjZU50VXRQV2xnZTFzTHMrZzk3akh5Tm8rL1VCTDBacXFFOTRNUmpnWFYydStvRHdpbFROZzZSRFdib1VGdk1HQnBLUFdKSkdKdDlqTElmUExCRmZVSm5LMDNNYThWZjhBLy9HUC9EUDZBKytrNzhTcFhUY3MxWG1lNTZsUU5zcnI5UmpKdU5IWjl4WElIb1FiOThHM2tXYmczZXR6NUVuaXRnV2F3NnpWcFBlMVFrQWs5SGRBUFFRQU1pam1oa0EyMkpsSFZaTkE0dHB3VDFaY3UxWnBWa1dGZ0RYbnB0VmFnSDdWZEZXQzZ1bGx0SEg5OG5UTFhNTUJGdlQyM2llQkswcW5TUlppZ3Fqc2pKUUhkRHgzcmNHd0ZxR3M1ZjkvTlJNTXMvN3JILzFnMjJYK0UzOTVuNExsSUgweUlSc0tJd0tVSlhmb3QvaEtjeVVZRXIrcjFwVmdWUzNaVFUyTnlZOWRrT1VoclRQS1lUeS84S24rbEdmMXlsQzYyUWRyS0p4MTFXdGZsejk4TW1Ibjd6OXlWdWZ2SEx2UFhmZWRzM3BRek9mVEI2LzZ2eEhvNTd6Q2d2OHFMN0F0dTNIUFp3c3BSZ0NxTy9rRHpFN2Jsei9SOEx0bHZ3ZXdONUhwT1R3MFFFbFdQK0xSMnZXMFVESmRUTEkzajQvbVZVTTBLWDVMWXh4a1p4MmM5UXppaWsyVU1VR0p1aWxsVkdHNkdhRDd0R3VwUkRMQkVBY2pERlQ0aHI2RU1ZdE5NQWtzNnhqTzlXTXAzKzYxRG0yY0JFalVnWXhnc21NazBFWEl5ZmxlaGxtbXRWc1lPc2VUR0tsR0RXOFFWeHFZaWlseXZ2bVQxSEhXTHFTNVNaWXhVYk84VlgzeG1BTUhmbHlrMXFLcWNUU3c0UXVHR0Y2L3BXMHJkbUFZVDhWMVVXaDJkaDRVUFBFanJIUjlyYldsdWFteGhVTjUzVzFOZFZWbFJYbENNcEtTNHFMQ2d0TStYbTVPZGxabVJsR1EzcGFxajVGbDZ6VkpDV3FWVXFGWENZUmk0U0NCRDZQeTJHemtGQ29YMjZGTzRxdmNaU0o1N090blczek5ZcS83TzIxWDJHOXpQb2JEZ1dUbnFDUHhJMk9wWHBoblF1V0hUU1lyTUxHTk5YbVJqc2toU240MXR0OWQ2TVRIaDNWUXBYV1FJZVMwOHppV3U3VXpYVVNsR21BQWE4VFQ4aWdkWWlIQ29DSEdjb3lBY1JxVG1Td2xGRzN0aGxmTHV4bWJ3dE0rc0JvZUhZc3M5eUlIRURTY3hxZlh5cVRjZ1h2Z1RMZXBOQ3dzNW9YM0NCRzFBSmVtNGQrc2h1V1NMd1ljTklBU1h5WnJsVUVieExCa3p4K1c3VEhZazNZWEQ4Vzl1cnRnZUY5S1lTbWRWTGJlRE94NjdRelFXOFcrSG82NitMMWJDMU5DcGEvbnBOZkNDbXJQUXQ1VTJ3STRrU0hDTHdLd0VHSXg4eG9NVHFqQXRpa2JiU01sSXFkTU5EZGJCRHFKRUJYR2tJRk9TbVRrS0pSVEJXc1dVTmlWaEZVbE9FdE9BaWwvYTVnQ1lLOTUyOStCcVBzNmNtV3F3TWQ2b1FxMUo3eFZQeUNjLzVEZ0JEaGU0SVY1RkJKWmpyL1lQbFYxOXJlVUhGbm5uQUpkVkt5bHdqQlJDSjI4ZUNETHNsN1B6YXY1ZGNFS3RqK1RiUHkyZHRINmJTclRCUGIyYVlObHdSSkJtRlhESllQa1NQSUdpbi9ST0N5MGJydzhzS0xZK0JZZTBuQ004c2hyMTZ0VjZxY3BzOUhtaDNWYnNaZUIrYjZtb3BlN1Eyc0xNbmxQVHNDamh4TXVCdlRXUWFUTHpId2s1TnpRcnVocEVzUGxWMGRjQWlaeWhzRjdsL0prUm1aTEE2YncxK1J2TVJHWXZZTXNYaldlTVFSY3lUa0lUOERYS3Z3dTduaWlscHZ0TWxqSXVpM1pXSG5JWUUzb1RtQmlXYzJNK2gxTHJTS25XMnFNZ2o5aTA1N2RKVDFXLzd0U3drUVBvTFU5RkhQaWtxVGREUG9oYlBzOVB5Ymk3NFhBZHF1ckdlMVJzU3NWZ1ZHU2pDellEOG5ta0lmZ1VrQ3lIang2eHIrY0U1cjBlU0VtUEtKWlAxRTZ6UkpsaWJCYWpGUmR1ZUxUcnQ0SVZPeUdwbE1JTW5mQXptWmR3TWJEbzNJNHhQd3pFbnIyMTJVWXE0b0tIMGVzbUsvQkhNNnd0VTBDNTkyb25GT05pT09wc0ZlZkJESGpDbDJXQk50NHBRa3ZGYlRBMGRocEVqYjE2TDJORmh4Um5ZL1l4Rk0zbUxBVjBUMHBSek9XVndJdm4xWENXV0RsS2Q4ajc4WUl1NmhubkNuVk5sTWdVbDZia2M5UEJ4T01yWXVnS25DWm5VMkErbmU0ckl6TG5seUxKejJ4Ymw1QjVKRDZZVnlpbUo0aVJoQjA1NnpJM1pUTkUrV0JTRlh2ajBXT3VpMVVKQjA5cGdQaWY2VGhUODNMMHJPMk8yZ3JvSkt3U2pBZHFFaFFDWUFpREhDV0N3QzBSV09JTGdLbmhvTWNEL3FpdWMwQTYveHNqa0FIcFU0cWhpZ3RObFc3QUpMSzFBalNLMnJJV2g4TGIycG9rNDRHajFjZWFBckRkK244MWVRWEJyQjdpYm4wYk9qa3Jxa1p5L1pIVWhBRGdvdjNBZmVTUXNsdzJVZjR4UXUrbngwWGRhc291Mnk3eGdKMUpZRWtBcW0ycFZmSXRlK0dnUzA3azRDQnA3RW1ZVkdNUzM1Y05xOFFUeUN0TzhzcGsxcE5iZHhHYTRjb0RtMnhsQjR3VUt1ZEcveHZwTFlaS2k4RDVLZ0VBWGVKUTlHaWRrbS9hSEU2Y0VlQk9id3lIR3VDZzhiWU9OU1k4aFY4UUNRNUt5Wno0VWdQQmc5cFJOLzlySk42MFNiekg3a3dyREFXZ1ZNQUpxUlZYb0RnNFhIbVFNNVFLUDFFWXJWUVB5Q2N5b3FsZDlmYU9iRG1lWkszVkpjdW1tZFVCcS80ZmZRMk9ISUh6M1M5RGwwRXAxeHBoanVXdlFPaUNhdDBhbWpUTU83bElOWmR1dnRES2FCaVREcnRUa3U1MGVGT3NQSVFPZXRxQmdRWmdBdVNJSTd1RlRBVUZGMUdtNlJFcUN0dFIzRnZ4QmdJTzdjb2JCdkp2UXRyZzFFdmNyZHhEVDUxUmFuczNUKzJ3S2d0RC9nUVJJeTNJQlo1YTJ3MUU4dXErMHJoYjBZZ1hOYm4wcDlRNnNGNUcxL2JQYVZLSVBtWnEyWUZCbWk4aWpBTjVRemIyQzhDa3pBQ0FVcS9wQmh3U0xSSzZFMm5weGw3YVNIWUQvT0VsVXhkRkNDUC90cXdsb3FIOTN6emlCUkI3SDhRMFR5TG53SFBXUnFzUi9FZlJDelZVR04zZm1uTWdnMzFsbENick9pMUttLzdKcHVzWTg4WlNIZ1B0MjBmdmFaUVhJSlFBbXY4TUhiVEV6bW1GQ0tRTEw3S2VKZGRndlRpOXh0RDUyZVJIeUxOQXJoWTVLV0ZpWUVzN3pMMVBpUmw5RXVkaW9yN2F1RmpSU1ZjT1E5VldiVnR2WDNudTVQcnZKVnlFVzBWazBjK3dHY2NRVUFiUkxMMXdxSmV2TEp3RVBmYWFzSktvM2IzV2hRdTVWcFlMZnl5OCtZVTZFbnlteWM1UzZ3TE1sUSs0TnV3WlhmL1JkdmRtUnkzT3pVYUJ0eFpFdnRQT2JKS0NMSDhjSUtuUXFmbWJ4QlA1WHZRRW5CZjZBUlk4cFY3bE5hdVFFbjV0N3RsMzJTSzc4enJIajZWdkRka05PYkJKYWg4R3R4SC9BNktXbkxBbHlncHM3SXRPUFhNSGFML05GeFpqemZiQzFjVW5IUUhHeS9sakhYR0wyRXdLUXdvKzhHWU8xUDY2MDJWckdaVC9ZKzgwNlY4L0tBTjhaK0s0RjErMEsyWnJQaXV0RjN3Rk1RZEthM05tTmdvT2VqZHNpTW5vQ3AxWmk5UldLTHJLdXJWL2p6OWpaSnVLT0Jvb0VzL3RLcHdaaXpPdjdLY1hrQ25MOGpraktBZ3lDNEZ0VHdweFFycWJaeitZWVdoQWdQQ2Ntc3NnR0xmS2J6Q2JMN0R0UmkvVTlycXlnY3p4V051QUsyemViUnFFNDlFK3pOeDhWdjlrRi9COEIxVXl3RUNFRjlrMisrTHVrQ08wNUlFdmV2dkMvc0dCVkFCR0ZDUDZ6WVZ5bDM2V0V5cm9xS0k3bVlFb05kTDBpZVg1bFcvYXJCaHpYN01NMkx6R015Q0JERDloVktkUVJTMkdobWxveWgrQlZmclZERmVXdmlLdGJKdGdreGJFK053ZHhiVmtFT2lncWx5c2RqMGF3NDIwU0JvRm5JWERDVU5vTHhhQnJlaUxabXdNSms5c09KNlVHdndDQ3ppOUxwdlBmbE1oR3RhQjhDTmN2SXhxMW9QSllwUHJvcHBtTXgzR054dHd2UnBpcm5yWnRpZGtTdVQxK2w1NWI1VnFJaGJ4TTEyWGFUbTFmd1lpTGpYYitzTDNoZ1Q5NVJtcmVsZjFyNk5UODhEWUl6bUpzOG92dDk0QmZ2biszUlRWV3BFZS81U0hjWE1POU9MMVFNNldtVjhuZ1pSQm81VzhKNERPdEVhWG50VGpxM3JwSHJVMDExelRlbDFQemxYc0FQTFV5cHo3bHZjejN4K0RpbnRDQktNY1p3d0xFaTUranVCRk1NSjI2UkVxVlZxMm94bEZ2MDlTMlkxNlV1YmtOOEp5YTNKV21tVEpvaENDd3pxYzlKMEFFYmZwQkRpN1dreVhnV0pHa3ozT1pvOERlRnpIOUYyVGtJY3lwbEpMRHRabnFsMUZnRFpBNkRZM0xYejdlYXFYQmhTL2hLZFFYeTU1SmdYdU5GSC95VlFpMlozVldxQ21BWmJkOVJVRjY3WERHc0tIUG94RG1LMlBmTmx6OWZSeWdHcHV6SmpjNUdidlBnYmZhaDNydHVzRHdjdzBCVjNIZjcrYUI2dXdXQUNHVDdmZTlwcG13cndXSFEyQ0hpY1dLalZwTWJMclF0YXNaaVBEMEg4MXFaZWJUZnVjbDExYnM3RGlpVXBRMDFiaTRpSHdkNzRhOFU0UllSTmF4dnlXalpEOSsyNFFnNEtQb05jK0RleGRsdDBmRDYxYjNBTmtycEd5Ry9iSkNoWlh0ZVRHc0Nyc2Z4Y0tLZHoySnlKTEJEdzRlWm1nbG5vS2hSa2xKQXhjTGNPaXZLQXF2dDhSSTl3YWNFYkFRT3ZVMW4weldST2pEZU53OGZqM1dUMVc0WmI5TFcxM2VTK0s1Q09mTExvcmQwcGQ3K0FoNGJnbE1naC9iQjE2L3N5QjR1ek9UTVgrMWRrc0lkNjBKS0ZnMUtsRXR3bGcwTXUxY0cwRmlGR09jRm9IVFZMQk4xVm5pNUxKc284WDZlRTFVaGQzM2R3cStxOEhJektIcVBid29ERHV3M2JocWFQcW0xOGkwWWVxSy95T3VUQ2R0SzRNY1N1YlBlN29GVzJRTnkxZDd5Q2dicFVhOFJBME1ISHpOR2NiV3VVRXloRTIxSEpqbEVacmdBQVF3bU1XLzNONHhRaW1BTDFqYjdRMGxmWDRhem5DMFRGd0NYT1BjQ0pER2JmeEgvdFJ6WnZPMkRVaUhmK3J3ZjBENmt6MHAvS1ArUlE0dFRza1R1bSt1MEM5SXYxSHFuSmpPNXpyUU94cGUySEdVOHNEL255OFV4M0RPL0QzU05LaUR2bWNJQmd2Mzk0WmxoekUxZ0QvQU1OSW45dnArWkNtMVp4MUhxakxScTMvenpxRlByS1JFS09vZERTRVVtNzZ0SXloNms4UHJoK004S2l2VjRvR3UzWm1VM2JrN0w1S2w2dVRVMjZoM0JBbG43ajZmb3pjMXU5ZjB0bzBXN2l0VWUwY3NnSnQrenZoYW9abFQweEJSN2tXc0hMZjBlUy9lZC93Rkc4TUl5NDRQTzViT0w2OW8zWllQaEMrQStqR3VtT2xKblY5OWtrLzFsNWltdytGeWhQQ0FyaHE0K0VsblBNbmpBcWMyWllBRktZZS9mdWR3anhhZk1YaFJCcnpHNXZDQWFsSHZ3NEl4cE85MHZGMTdBQUdwRFFPRFpQWjZyalFaV3lKNWNpUlpkcnByUXEwS1huNFJ4d292TE9vTXp6T0hzNUFXNE5nQlR4MkxMUHg1ckNuRmp5OU9qM1hYcHNxbWplV05TZ0I5eFAwelJzV1pLZDIxQUFzbXJjUjl0cGJlK1E5OWFPeitIdkd0c2lIWnVRR2o3d0dGWjJLNTRZSGRybmgxcVZlR3gxaFNlVmdkTVUwNVJUbFFweHJ0cm1iTE5tSFVvYlp3a1grd29hc1hqQVNqVjJmNWRjREZJV2k4b0RFcFd2Nm5oN2xIWUJwUEozaE9PUzhPZWFROTBnbXk0RGlSVU12K2RsQXRVa3h4WjhNVkZzbnl1cUliWlpWYklMZ0tGVGdEVHpQY0IrZ3dqZC9EbjNMeFhKS3pMY3FlYllhanZDZjA3SzdmYWJVV3ZZVGtreXY1QVcxalpzbTdhR0g1SHF3NWUxRTlBdGlTbmRwbVpEZmhJUVEwc0J2c2R1ZDROOTROd0kxT3ZKRmR1Z2VpTExkMlBxZTVFQWFvelI2RVlsbE5ETFJkMk1HV2w4MHc1aldQMmhYT3RKNFhSUjR1ZDZWZDEwbzZ0ME41WTJGN2RTd2lIUVUzejhGaHpRTDhiNnZSUThZeVdnQ3lWYnNnKzBsampNVCt6VGlOckwrZDFHQlpXUFdjZlprbUdxbStJMWR0bjdUanJHTmt4VjJSSzRLVEc4U25kcGo3TGlVblA3L1NjZXdOMUNWcWc2VmZ1Y0tvVnovWks2MzJYZ2I1dkFCUHc4MHMyMU5QWnd5V1dNZlM2SjdBUzNhRGRVMEFSbndPMmYvVEQyOTNzZlBEcExKdE5uckE1bXhYWmpZeW1CcDhzd3ZYMGtZQ0syR2dabDNJSXdVU0I1c01OZnV1OW40a0MyR2ZHUlY5Tjg3cTdtOFRnYlRsS1B0S1Z5NmtaaThHNlVmdjIrbnhleDE4TUNBR0RXdjdkVXo1b2szcFRDaldOM2d0bnRtRWJYcXdURStXeXdFSXFUc1VkVk9kdWRsS0ZMdVBqMFVUMXduWWMvb3lUQlpoZm85K1daNS84dWhnU21KdEhkbE5Vb0prSTF4VGp0VW1PV1ZrWkYwVlQ0RGRYRlNZcHJhRlZMUUl0cDFTU0E1OE1pVXlEZXF0azU1WmxPTGVkS3ZJb1dTbm5va3pkWjZyZmVDZUE4N3hmbG85NHR6bitBVUVCQWtWUVEraTVKNmNCSjhKSUw3RjI3dzR6d3hFdmlhSVc1aU10RkNTYTArL0tHamNUOVJLT3ZmeEhqbU1CZGR4clQ2ZGgydVhSOThZM08zeXp0ZzdLMnZ6R1grTXlxMlFHK0xLWnBwQVA3WU5GQWduYkhlcTJvMTZYTzJIa0RheGZHNW81cEdqSHF0TmFXb0hyb3l3emZqK0taSHpxOWNOc0pER0VlY2xxbXhVc1VTWGYxUzVmUksrMjgzeWdvQUZNVjI5L2J3RWR0KyszUVZLaUtGSmtGdCtCSGkrUmxYMUdhM1lGemJBN212ZFhwUXR6YU9tVUEzdmx1TzZxZ3lJK1JRWDhWUlNQZmRJbHdWY3VGbFpXdlB1Z3F0RDJyZEtCL1hvNTRrY2s0MEdnNU9LeUlRcStEMVRuMnM1cDJsdHowZ3Y0ODNHMFpkd2x4aDZBd0R5NkRRdk5qbmhQc2dCVlNYWis2L3RYc3NlZGN1WFVpQ0ZUbVFDbWxGNEFwNUtLc1JhWEdKOEVWMVZxenFMd2VuRHE5dTc2QUUxaFJselR4SmdEdHMzbVcvdXl1bGZqZTA5M1hTWU40OEFTei9meHpjaHhoVnlYa0t3UHhnbThZR1lGWkUxVFluZm1SU2pPaDk5eERYL21Uc09PdlRKdWJHQWowdzlSRGsrNGpDK1l6ZVlENC9iVlFlWXc3ZnZDSzNub3orNlk3NmFaMC83REs0OURXMW5FYW9ZTE1EOWxtWkJDRFhZaTRDK0NDanhZc0pXK1FqV1BUQnJtNStnaTc5K1pUMXdjUW5xQmVobVg5WGhMNUFMU3RMMlVIWWdHaTZmVFYrZHMraTVKNHI3SmxWdVhGRnlCUk8vdFZRV0svckR4MmtTS1BDYmFQYlIybWxJZUNwdmZ1U1o2QXZ3dkxmSXZpampnZ0REV21ySFNzVWs1RzgrSE1IRkdmQU9nMkpSblExb2JoaFB4eXVwSWVsR0NENjNYcm1RdnZtS3drbU5ha0hUQmpsRnBrNzl0U25iUGwwbC9TeUdTMUNmM0VTb3pzS3oyUGtQMi9HRldmMkZob2RkL1Y3WG8vUDh2YkgzRWVZbHpiTDd4NjArWnFTTHpORFdGREFtZnFjak5kNE12Yk9BNnVvNDZKckVjM2NZY0hUWVVqbjF5dnVMR2ZQMnY4M1gvOHRIN3BhUG5Ta2J2bFl4K2RyN3V3WGk5eE9VS3FtVHNRZW5ZcWVLeHJjWXpqTmVuSTdQTGc4OW5MZDJKNHNKdEV0RFhHV1ZXckhpMS80Qk8zcGxXVTczMXJyNExDQnZ0OWh1Vkx1OUdzZUhacjd2clVIT3hhRTNBb0ZyUm1sbG8yUE5MNFE1YnhGbk53Wkh2d1Nob3NyaVN3U0wrQ0ppbllEMlgrNkZmTTVhYTM5UDNtN2xoWGYwYnh6bGVjMUhUK29hZWhKVE80ZFV6TEs4MVViTnBqYjNDaEtzK0lJVFNLOGZlUkNBYzg0RjhRVWk5c3gyS3lMaGQ1RG4zL3BVei9VcnZIVEd6cVRWZGJHM244TXdZejJ0RDFDcDlZM2VDK0FvS2daQ3JWWkNzcnpYOGF2aDMwUFhIQytaTS92UlVZMFVrbkFwdmpPc3FPcnlncTEyeFNzSHJraHFWTTNPVlJkaFQxaFFPc3djcXhpRDF5VHZ5cHVJWmwzMTE3RlJoMkNtcTdLZGY2TWp3dXZhRS9ROHJEaUdMUnNJWkhOVEdyUzBzak1HWEdoU3hCeG55d0pjWEV1S2hDYkliMmlEdm04cm1FWjJnamwvd3UySGFUWTF0OEQ5aVcxMXZuVmR1QnJZR2NUa0hzaUNYUTA4Rkp0b00wdjI2L2N0YkVYWFprRXZFZFc4SktvUXEyT0dieitaeWZLTDR0TnZWT1pjL21CckZCOGwydjhLZjBVSjlrN2Z6ZnhMMEtoRVlzemV1ZWJHNWNiR3hQN0MyUlFmanNnQXhZM2ZjVmsrV1Q3a2ZXNzQrWlQyT1o0UGNHUGFYM2V1MUFmZDYyVWllVFJKeHhCemsvdThqbTl1Z2F3di92VzBML0pmelBHKytyM00zUDFzM1JNNG9JZTJwYVlMK1MzdVZjYkt2M3l4Uy9VbVFzUmcxcEZYdzNTNTdKS2Jvak5oUXBZRFpIRFlYc04xNURiV1lYT2JVWUV1UEtmWTArT1JjQ2hGRWZqOVYzWEtYcFBrTHBEQzdFOUMzSDJ4VUM2dHFPQVkvRlpvdkVUSUpXajhqN2ZuS2k1bXFMK1V6QS91TmlyWGFwb0tiSjQvWEdPd2UybEJJbG00RG9LSnpDRzZRclJSL0psVExyZlJXUm9Va3hoQ3dna0pNZWhmMkFUZSt3U09USEpNWUh5V1FLRFY5OGZIMWwxS3BpK0kxSFh0VmlhTXBSdW5hbWR4aVYyQysyOVRLSGhWcmJyanB0UUQ2ZTJ5SUVQY1dIekFUYmhjNnRvWDRlVXRzeUZ2ZjhJZy81bnlyZmJQYmJWVU1mWlQvR0VqVTYxb1dPR3JQUmUybHBHbnJzUHdFLzJTOElNVzBJcWJZalpjcHVQcmdPM25wVzFWZzZWOUJCWHRrV1Z2Yml0bm5oc2RlS3Z3dFFiM0hpbEorbmE0SS9paDdVREhQWjlDaUprUUhnd3JqS2h5cmlUOTRtZmJFamxQR3B2UElFU0JVelN0QmM4WjJIVEVyUTY5V0hiNVcwZmM3UlVZSjEwRktZOWgwT1NOU0h4MnI2UTBKOFhGQ3U3QmxlVkJoaU91ZXNuRExhOGlUT0t2ZmZBdlErR1c5Y1dOMnRuajFWTGtKMmNCWDRrM01vdnhEOTB3ekhYczE2ckdrYk5WWWI1cllXNXFXRnRlaHl6V2RlRms1OFl5bEpxTlZoSWdnRll2NUlNSGJ5Q1BxWXNUcEtXZTNqMHBpTUZJU1F5aUlJM0V4Q0Y0SWw2NzNZb0xvemFCdWdMWUtRaStZNG1jMHhNMjRTb0VPY2xadUVMTnN6TWpaV1JBUG5lSk4xamNjRlRUWEhVclB1TE1sRC9hSytTaHpnY25aWm1TVzQzdkF5Ny9EcUtSWWlyYU9GZXRCOFZWUWNVU0tOSnljNUpWSFV2SVRvZTV6VUFWVFNTWUVKU1ZHOGhuaUJLWThOOThaRk9tU016clo4R3QzK0cyTU5zeUo4ZVJTckxPNTMzWisrY0tqcFV0enNiNFZkUC9wL1ZqbjFzV25pM1o1aDdaNmJvMytrcURKbTlyc1l2bkNXUmZSYXl5VGtHa1lHVDJJRmt4NXhPYXVwS2pSbWdjYXdtTmU0OTVMdTZZeWhBUHR4WXFJQTJ4OHJjSjNsMFBxdjdNZVJLZkRPNEZaZXc0bi9qVncySURiOStiYkRFUThmaHMvdU5idFRDcjZrSFIxWmRVa1F5Y3Vaem56YmRDME1sRks4ZVRBT2hsMmpicTNJWGR0VEtwcENubzJlMjZySTlVUDdnQU9UZ2lOU2NTVWVEVEV0V2N1M01sWlgzV1B2bXZGaWdQTU4xMDlHZStmOUpycnIySnlrWWYxOEZlaFRkRml3ekMwa3ZMUVZlN0Z5V1l4Qy8xcnljSWVVZzN1cGJsc09jbU04dERjMzZwQnBnakFsVkhMcXFCTEVZVDhqMkFTU0dIZTBuT05XdHhYbHM0Yjd6VVkzWURwNFBJZTA0YXhtMWJwYzJ0L3J2a0ZoTmhVdGlCSnJsMVAvREhDelVORVNXa01HVU01RGgwRTdmN1lVd25ZeVVVdXEvaHk2TWgvK1hQZEowUDFZV1Yvc1pERDRkcjBDWkdwZzcwRmRrQzVvWFB0aUd3eld1NXZkZTV5bUJPencrK3hENExZYjJDQzJ4NmRuYktRekdoK0xodG5hYVVWQ2F2Zzg4WTFJeFBOSlJDTEVVbi9BWHFwRDhuL1BSUlZBa2dscGgwU2ZtNzgyMTU1UC96Zis1WHhIbU9nbno0dzl4R21XK2U3cXpzZFV6Y1huY0dsRVl2LzVnUU40MVR0WjR1YjU2a3ZTL09paHB2NFdhRjgrODN4YU50d2k5QTFmNlg3UDhaQWFTY3JvKys5SkdHYmJDMi9CN2NpT0JSVVppYUNXczEyYmR2akZJNUoveUZFZGdSYUtvbHVjbGE2S0F3RWx4LzlBUnZicmx6UjJXRXVaK0xrMVBYcEw5bVNJN0MvcERkRnRjeTg1WkNtdms1V1pnQ3BIUFluSDdaeVpTNkh5WmtiRDh0ellLOERBejRUTlBIUDhvRGhmTERsN1h3ZzMyUEVkNGV6ckc4ajBnSkdOd1lKbU9QVzRUVjRhSEN2aS8wY1Zib3pwRGEyZGhxWEZXNHRjd003UFNaQWU3NTAxdnk5cVJqNVhIcXJmdi9XOXZ2OFZoczc5SjhWaUxmaU83WDdOcmY5d2l1d2pNNFBUcEVLSzhQSGZROWt0OWV1cVlrckp1ZzFncnJ3Q2UvdHV0U29saUthWFArRUdOOXpOMGQvdktFcDVlUzJGYTlqTzZiemx0blFyZXMwSFZFSlJXS3RYcFU2NEVGTzFlNW1XenRZcy90Rks0STlZRi9NMnpIVW9RMytyOE9iZnh2eStBclBmUEQvL08xUzJmYUJNaTNVS2kvaEtyNmlIRyt6Z0JYR1ozaXpLWUhLU0dtS3hNano2UUdaekxpM0xrbkVIUlJ0cU5MbGp5aGtCQ1pCR0UrNlZGekFIVGFrc2RZMFZ4eWtGaGVkd0NjUjh0NElBbnNDbVNpR08vb0lJZ3pORmNlMmlzTnlLc042bFNXS3phTUZaOG5lTm80djl1bkpGdC91V2FUTy94MkJOS0N4cThhc2c3VisxdUppTy9vVXdTNWdMRzJWbHpKWms1SllTbWUzdXhyc0FrYUlka043L0NhSHYvMzM1QlMrN01jMnlESzBFQVV3V3FTVGx6L3dUdzdTNjd5ZUYwYUhuREdEWGk2NVk0WUMwbjBGUzQ4dUV3RWhJb2I1bUFjbzFNR0NIZ3F5UExaVUNrUmk2ckFWV05jNWJ4S3l6SnprT0dHaHRpalZnWUJnU2ZpUUw0TitGVklXOTgvSFE5VHhwVGxMMVg2M2JaL3d0L3AyKzNyaHlrTWNGdG9wSzBSbElpVmlycjA4eENNR2ZoNC85QkVhOW5NVDhnTCsrUWQ1MkU5d0lOM2o3dC8zTVRmdnVaRGs5ekEzSGN6MkkyWXJoNlZtMnc0NjV1YWRNK0orK2graUEyd1pZczQ4N0V3M1A5NWVPVkRwY0lqdTAwMzI3UWI2NzdzL25wd2pLYWgzQ3ovcWJ3ek9hZ1M3aklBay9hS2szVU9ta0h2cUUvWERxeFU2ZGphU3p5MEVVdnJlT0x6UVBiVWZBQlltYzR0UUlkOWlzL1g4S1VkbGhiVVl4K1pwNHpGQ1Nud2F2aDdjeTFiUjFhaFVFQ3NieWVPc0FFYjB2WGJkNElxTmdYWkE4cUI1cjRIUkFvRWhoQ0hwRnlYdUhzNFArVVY5dkg1a2xYemxONHpvWUFqM2VhU21xbWg0SVNGS0hwd05NZGxsSWtVOFBlb3ZVT204MUxSdnFJcndNUFZJZjljaFFiRmhGczd3MTd4UVp2clQyQ1pKUW1mUUZuVWNVcEVRVEU1b0RHSEFmbWNHcmtFNURlUElQY1A1dDVKY1I5Y0cwN2t6UU91bGZOdTBUcjRSNjdyQjlhWHpBTEJReXkxQ2tiN2hFb2lSY2pUSHR3Z1M4MUpHZzFqL1BvSkF6V2QxQmNkWDlvaXNacSs4cVppWVA3eWxUUzNzWDVYeGxUd1hhbXRobTVTWm5hTHVEMHJGUGxlaDk2TWZUMkpMQndnMENSNXZJbEx5bWJJYU1PWTlYdWZ3OXR2ZlF6NHhHckdMMm03aHpKelBnRm5tTEhNemNycU44aGE0bEZrS3RoWTl2dndWR2NFVTJWS1BMdUpmUExBditlWnExRzVhbSs3UGZILzl6V2hMUnNmZ1Nod3JrQmJNVm1jWVE2ajRtTG9rZmZSMDI2V2RjWVVvbVcxWE4yejlkbVJWdGI4dWNqeGpZa3RNcm85cjJQU29sOGVuQjNIeUR1YzgrdzVxZko0NFg3Wk9FczRQWFF5cnVpeXJodkJldm9VN3RYVUVVRjN1dERzeWdTa1lQQjBUcWFlNHpJbUpmQ2FxU3VqMzhlRjhzRWZRR3d6SFV4L2hJb2hPeE1CMWVYZEUyUGY2bHZvWC9nSnMwaVVVb0dqNkZjSzQvblM0cldadFN5MjJvNmVvQmh5bklUUHlTOFVMNFBMVXF6NXdoOXM2ck50SFlPbGJxaktjSG9rV1NJSWlvdFdoRExFcXpTbFJKWmZqaldMQWlQekRqcmUzaERnTjN4dnlhNGVVMzRGV0lPN0xIdHF2OTFCNEpDaUJwMzlWZi8xRE5Jck5jeFZzcnNhN2hUcHB4L0I2dlhLOXVoeE55elRXUndwTDZpdEJPVUFVTGR2WUZDbm82ZG8rM0ZQU3VYdGJRcGdxbmwxR25uSk9UTG5lZTZnL0lsUkZaNWQ3TG1yS2RYdFlVdHN3MnM4NnlGSlEvWW5NdkJPdEZTRy82TXg5YlVkNUZVMUhzekxQOUJSamJtcjJkYmNkNCtsL0kwcUljVW5vY3ZkT1RvU1graGtwWEJrZFowVFZ1YmJFYUxqSlR2VDNiaG04VjA2YmwrTTBxakl5WjZwb2UwYmtYUmMyNEhjZ2haR01wbkszQTVlS1FSMU9DV3daOCtMVWVZUXNPQXRTRUVMOVpyemVjeVFsM25uK3haZUFNWEpCTnBiRjdSS3BwL2NqMGRPQ0JKd2wzenUzREI3K0lvNVBqSkNqczcwbVFRZEhIYVNFZjNhMkdGYTJzWWJNOVRSYXhmdi80RUlwUm94Q1JXMXhVV1YvQnh0QnViTStETmlmUFBSc2lBSW5CWk5RM2xPY01BYWNnZEJMaUptc1V1UHNNVWxyNnQ1Z0JUSHQ3bHdMamtZUVlQRmVoMm5CdlhSWWxqektsTENpWk50TmxmY0VxSFdtWU5CVHJTdjJHdmNlWEpBMXZ6K0Yvd2dodlBBcTlnckJMRWQrUmFKNExvK2YvdDdtNDlNRjB0Y0pZZ2JTNExZbFIrbzEySTZlMUc1VDFHZm1sVXBPZTVhNVdISC85VVBIWjJUVVJmaDhBYTdUQldHNG5rdkVGaXE0elc1Zk9WUjRIaW1odzAvclFMc3N3M1JneTAvU0pXdVdKUysvR1Z3YmxGSDB5b1BqeWJMb1h5YTErWWhxd05RcysvVlRxSCtnanJkMEdkcWl5cXJlenc3Z3VSWlpzUFNOTjhUd0tQcUpYM3l4NExzZzdTYitPNFpWcTFpbThGcjZuc3l3TGY4eW5CbVFVbVBDS2dac0dMcWc4S1VDcXl3TEl4SjR3MXVHU050b0NXYWpXLzZQS2h3ZTJzN3l3c0gyeHA3b0piNzVoRDVIMm5ZQS93YjhDLzNnVkZjK3JFNkxPTUNhZG1GbE16TXhMNnA3cEc3NmFHLzNESFhIS2thakhQK0VCOUNTbkJYeFNBOVRyeW5mSGlnRHl3cUZYdVVGQWJ0amtiWmtXbERrTS9lejF3SHU4YUliRGt5blAzTVN1V2tQS2svcW1kOVRrRyszdkVHQnlLdXNJSEJQeURKSkhDUVgrY1MvWmlTV1ZzQ0YxV29SQjhsYlFVeU9ONUdrTkpBdHRLZkdRTnlNaVoycm1JMmVsRXdlTk5zakpMS1c1Znphclo0c2lxcHcxeVA5aHJudW1LZ2FKdXcxWEJORzd5T0VXK3hrZWVQYjh1YzNyRjdVMFNWOGxqd25YNk5NeWU4RVVCTUlmNk1DT25aa1J3SDZxbXgzZGMrcXhGUjd2NWw1MkF6Vk90L2ZRL09TRmQ3N2IwNU1TZFJMK1p2SER3eGZQNUJKVnNqanJuYjRIOGYwY2N4c0o2RmI1Z25NNGduODcxNHJhdmFkU0c0MnpST1pzTUxYMjZvUUZINktDS1FKZVJHTVdReDJscmtaOGxvRnNINnlwVC9sK3YvMXRSdlNJYVJ3ZytmbTJ1cUJnZnJhYVVncW1leWQzcldpZm5Dd3ZuNVRCaVNVcFBkYXJGOHgwcmRpUlNja2d4enVsVFpkVzN1N25hUWtoQ3JDU0RaTVNTU0ZLWWhFaFJvY2tJSVFCZzk1OEcvZzduKzlPLzlGN0Q1OS9CMnFTRkFzQ1AvcjNTWEVpQ0EwTkdZanNXY2Y0Ulp4OXZ0MkhkL3NkdWtnMDNyazdpY3M5SzZZMURRTk04TDdFUk0zbndEUFYwZmswK2lFbkNUMW1VYUtrWkpwNmpuSnJUT3N4d21DSkNjS3VrTlZhS3FiQUlHV3hDdmdZbGl1T2l5UHhpY1hxQ1ErMGxCRFpHSEZ4QzJSdkVJZEo0K0c5d2xKWlZEWXNRQllwSVRpRmZIaXozQTJQa1lnRkhOQ3VTRXhYTGJ5Y2w0SGEvWkZIWmdkaWVvNjUySzZlTUhrTWpkZDZIVDVpblBwNm1rbjA1V0xwYzdyNWtZamVpQnlOcldBYjF5MXVOV3B2M20wc2pPdUdkb1QxUW5XUTRLcldyYU56WlJ1Yk1lVmVnWDBXUmtoR2FQMWkwa2IxeWMvNjFpaGVicHU2d045VS9Nanpmb05tdWNkSFluUDV0WS9Ub0lVdnFla0U2UEwwdW1JR1VsZmMxSnl2Q3pzSkJDUk9EbHpkQmlvV1M3U2gxdU5CdmFnT0JDNW5SaUs2OFloLzhCcVBQTEk1UEVnNThRTGwxMEdyaDZiZEJlMEpYL051SGlucjd4NjlNK2I5bVF2eHZNNDltS2U5YUlEM3F2VGVlTlViMnRxcXVtWGp6MkhUNmthMUU4enhDSXhsY3VoSmhxVzNRNitnNi9NWE5PK1g2MEFXNFFyNXJ3OTlqd1FrZzdPWHFOTW1qSWFMRzlOWW5iT0t2VU5HWWV2VW1ZZmpVK1NzbmxvOFZTTngvNm9Udm1MVHhjOVEydS82dklQRWJJc1ZBcGI3L2hyZkpoYWlLVWpVRUVCd2RvZ1R2bzBsN0l1S3I5dW9DNVZFVmRSbTVORVc1R2NoRHp2QW41T1Mrang4VHl4cGk2UXlUVkVSaUZnY1EydzJhUndzZWR1QkRJY0U2S0QvUzhaWVdISHNKcXM2aWl5bnB4Vmw1bmt2bHpxekVxS054VFY3WW1DT0pUZUI3c0pzeElLZm5ZNEo4bWt4aVNESk5mbHZHWG9HeFlRa3pJWmFpcU5QTjR6UkQxVFViYWVhTkFDbG5tdUJWaUxOL0RWNVVKK2p4YzdabXhTMGgwRFlLY01YckFIUW1ES3hDRUVlNjFFeG1mRTUzZkZPYmszUzJVOWozenoxb1k4KzZWSmtyRysvL2RydG52endBZmV0M2FNdGlmaVZxVlU5VEYxL2RWcmFtZ0I0L0wybGNxa3RYQmpvTW81QTArV0krRGxjQlhJZ0kwWWNWaWZlR3pxSWEzNVlieVFEVjk1N1dpSDI5SEZQWGp0MURzbFIvWVpTeVhoOFJqNUorSFBOdnd6YSs1TVlYOTdpWUp5amtWSGl1NHZHbUVjeGRYVWVtNDJQMXZaMnRuWFJLdzNpeitWakR3UzJvUkVtUzIvYXVwVFl1cFY0dUJGMm9WT1VxMnM5K2tiMXQyVW5yMDZUZktNSDBYcFQxQmIybk5SOWsxT2pPRHhtSkNSc2U0UkdQVHdHTElHTXpyeEhYbitwNWdvcmh6Rk0vRDdjOVpQUDY1MkhMRXZxMm0wdEhRZ2hCRzh4YkI2dXhmYU5LTUJON243WXdzeGFYSmhGV1hTOTJDMk05WXA0ZmxPa2V1ZGk3S3ZKNFdlUkhvNU1VMHJhQ0JQUW5ib1BPallmck5WNTBEQ0MvbmV1emtwYXpwYzM2czlKckFVbG8wMWtRbUZLSFZBRFRUOVBWeVRpMzRWeEtyRUlMM2ppd08rSzl2bVgycTMzdnkrYjBSSnJESm9lZWhZR2duaDZIZElLNDFOYTh2TXlkeDRPV1ZjTitoVC82V29PWmhsVEthRitkUnZEQmRHeXN0RWpGQmRNdmZVd2E5b1JLeVFvNURxWXdtR3c0NHZGanhNK2kyYjlSNDJRdDArOW4wZ2JaZFdzTGVsRFBjdzZXaGQvN1E0aVprSzUzQnUyMUw2NXAwVGYweFJGR3QycE5Qb3k5OURZYllPdHVMazhxcUVMVVFhN0xrdzhBQStMYitIOU40eGVkNSt3S1pRemMxSDRiNWhFbkN4TXJ6cDh6YWJGTHc0UG9XSkZWTGkwckQxSHIzc0ZLNVlzekg3Ym1ibzlYUGRBdFI0VmxsMFpLeWNjYnRwYmo2NXlsakg4N2V4bG9hdGJYdlZwQm82VjZDa0l1TExEdE45S3psekg1cjVZOGR6U015NEdhOWRodGJnYjRtWGVrWlB5UXFlWUhpWUtDSEs2RjRVRWVBZGs0MklUV2JFRnZ0MnNjUUNUYUROU0plY2w3NzRkUEZyVzRTRUxaWkxhQkVVS1UwdWxyTEREM3NyUlFwTklmcDJQQThZZTNMTGh3SUNHeExTeEt1SUw0YThaNm9HOG1WWjMvMmJCT25pclZvZFZ3eDU4OWQraXB3Y2s0UXNjQ3NKOVhKYmJqeXkwYUg1WnQ3cDh3NWVVYXF3Mk1TZ0F0Y3lzaTBRTWN6ZlQvcDdDQVdBUFpoNExXUTZFcmhSeTlmRGlUMDd6bDFQUTl3UW5xcVlXcTNKWUJyUTNCU3lDeWVoVUtWSEFmR3VOQzVOUng5M1ZxbVdpWU5FTkQzYzdoOE8rOUlaNlZqNTdjQ1J2M0pYYzVLQjIxRmgvd0d5ZjhzY1hsajkrVnBqNDJtSkZEdUs3QUtHdnl0Y2lBbXRyTndHd1RiVWxjS0hHNFA5Q2pydzVNV1ZDc3k5cFAyZHJZZTQ1VGt6VW53Q2kzdEcwYlNhQ245WkkrTzIzb2V1NUxSQWMrS2NZbWtiQlpMZjhBSmlkQkt5M0xXVG80Z3ZFSVJKb3FJTWlGcVg1aGdOSjdWa1BiYTAzK1E2Z1dLU3VLQjNkN1NhY25JTE1WSlJkRDR0YXlQNHJHR3NyMlpYZ1hnOUdQemlMVlVWVGxmcUV4Vkl1dHN3VnF4S3MvTVB2R2ZxcUM5d2Q3a3BkN0F1djNCbFEyNFBPaDJMU1VlajBqRllTd2VIc0h1dXVjTDJBaXFUSVBEOWE0ZHZ3RGZsTnZjOGNVZEJMSnZBaDc3WjZRLzF1T21CM0l0L0tVY0pqQjJENGwwQXZSbVc3VDFaQm1YSjUvU2JjTHluMDJGTmhHWnNUYUNkOWR4Sm1KaTVtN3JWaytuemJMUmlYY29HSE4vT3VHd0QvMEttNTh0RTAyOU0yUVFNN2F3cjVsTFVNKzV0YkFHekZ2VjBGOWdRN0pvRE03M0xmTUg2R1ZiZnhpcVh4QmlZNWQwR2ZSOHBHL0g4TlYwdncybno5cXIxdzV0TCtGMk5zUktSL1FZRlhTVkZndTVHS2hBSTJoRGk2RkhzYVBNK2VXZW5vNGx2dHYvbjYrUksvMkgrUUQ5anRxc0hqWjhwU1htOFpqeHdkd1BVV0VXclEreHNqOTUyNU5PbjZrN1RUQ2lmV1B2b1dTbzZtbHBFUzJrSTFHZ1JPN05rcllhQTRNRGRuaUpFbnB6TTRIWDdNN3lYWE4wRURaNTRjZVBFQ2ZRWjlKRWJ6V3VkclZLV0FhK2k4eGZReTZHV0V2dHRzUFJySm4vVGpYUlVYdnJpd1VVZ1pFN3FOMXJtdStOWGpGVkZhRGxzWTduZnFDcDJCM0t1ODl2MVlGOUxDRGlVeG1yM2ZHLzJyZkdQWUVpQzREUmtSRHdwM285amQ0QlBMMS90akR5UWp1NzZEWUVzNm12T2xVYlY1Nm9HTUZDN0llblZ2YU9JQXl0OWhxL2ZkZklKalJsYjFaNm1xNmpNQzRSRnFHSkVLbE5maEd5b3YweWpUczlTUTZrd1lTcFBtMUs5UGlacGhuUThPUGlnOHJFNG5vS2kxYytzWkdLOXZKRUJGa2cvcW52YzA3akl1YzJSYzFzaUY3WkU3eG1oU0dNNUNkSm9TclE0T29FamppVk4zTVFScDJna0ZVTlZaK3ljSDV0VDdvdGdCRWwyMC8zcnNlRng5M0dSWVN4NkdEK2FWaXgwOGhtS1VkV3pHRzBwUXM4dGxOWDZ4cjZFdE02UjJWRmpnSms1bGxIUUVoMTdGUjRwUk5hNjljUVFqdm5BS0R4MGhVY3ZBNy9Md1hlQjFyMWg5dzRoOW5qSnptdUZjOGhTdTB6MEVZb2NGSkdjeHc3UHVRM2NuVTZpRnhZMkd4TUlLNUpUbXNNRTI0T1BRTm5CZUFRcWROU0REY0ZkQnJzdTBKQlNtNHpERXhwN21LRTZocFVSYlAwekl6QUtpNW96MmcrN0pVdzZNYmF4djUzN29HLzJpcHp6Q0gzQWw0SEdYOGFoRHZ1eGczRUl5T2U2ZTRWdGEwa0RVc0hSc1ZROHgyUE9MVXM0RlJXbTN2NnNiWitmNnAxVWNJcEtpODBPTnlFS1lleVVQeGVjVG9zemZFbmh3clg3c29vOWU5ekVmWnlOaGRwdSt5dTdyN2lROTNGeTVodzNxQmtwNlVuZmV2TWV3dHI3WGVRV2R4NkkvL0JsRkt3S3Vhc0x1KytQRWZ1VERVWURySDJnSkd5N2NQM1hzMmhDZ1YvdHZCc3JPNzkxUGRZT3BnY1hyZzhHMXVnQ1lFQ1BIRE53NFo2L2dPZXE2OTc0VjNUc2t3RDBQdmZrSDJJZGtiVjhxcWVzcm96L2NGb0VzOWFyamxvK1l3U0JBRFJBZ2toU1owMjdkT09aenRIMElwK2FDa3lKWGxBYVFpQmlneXdISEtSNk5XL0NTTklRUmxwZ2VpU01ZSFpPcUE5bzJrVjcwM00xRVJWS1NRalJpNm9oeEtZSm1tM2E1WWpWNThRa1lTVWZnL3l0b0xTcmdMZ0NzUWxUTERBSk9lZEd6NVRVT0F5M2lVc0EzTkZkTXRpZGtyT3FUUy9TK0F6Q050RUwvTzZ3TEs3V2FKamo3blFjamdCY3VlUzRGQkU2ZWZzTUNmZFdkKzFqV2p1TEJDNHFqTCs0a3NGSS8zUnB4N0NVSkZSS3JiVHE0bmxXZDFjdEpYZkNhbEpRb1M2NWxDTENibzYyb1pwZmpyWWFlZ3JoRVBYT2E5ZnFKMXhScG10WCsySG5NM2JCMllSS1dpL1RydlJidW1kM1o4ZjRhbnBudU96T21mNDNDK2VRTDAwejI3NXdqdnRaNHZ3UEN4Qmo3NHF6ZkNvNnVOS2lIU1dPZHBZMitxU1NvazlMSDMxZnd2QXo5M21yL3FFU2N0WVk3QU9PaU9FakVTTWl4bjlFVEpZUjAvOGladXRFek4rUFdIelRacm5aR0dyaDdZTDE5c0d2TXhIQW9EK3BXekNHWEFSRjNBQWc3Z0JnTFJUN0VyYm1aZWpqKzRvSnQ5RHhBOEt3SnlBQmJucnJUdzdnRjloTm01emp0VFFicFpkUnh5d0EvYXhtOXJyNnYxOXNxQWY2USsxQ3RUNDQ3eDZxd2w5V2ZOcmROaGt5OHN6cmc3YWw3TVFHaG95TEZ0NnVRRnJRL1ZPaEdpMEJudDlvZ0ZWeGUvaHhjZWNNWHA4akYwTUdRK3BERzZlNHM2QnJtWVluaTRNU093eWdIWWpLMzNiT2RuOTBiT2tPQ0Z1aFBZOHlMdUpibHJpMEZqZVZpQlpxOWEzQUNZQXZCbFRGMGRqYlBUeDNkdURhOHpWdFZ5N1pubDZqWmFYVHJVQ0c5MHdoNXF3R1NzWkYxdldIc3JJMGJXNS9yNFdmNmE2QTYyVjdxQWdhWTBQT1JwdHo0cVNsNGhVODI5MDZPeFJvL0RHUUE1T0RLMDVhMWU0R2JtSHJldXNMMFlCbC9lK2F5S2tGN0QxOW1mcGNuM3dpNnVyRUVqc1dSZlc3ZmFVbFVHMzJqVWpESkJIQTdDTSsxRnVmcklKSEN4N2R3L0RzYmxmUUFpRTE1cnFXbDhlMFN5d1JtMEdpbnZleDQ1b1pONUVHemhEOVdZR0s4UDBZS29RQ0ZvamtkdG1ORGcxR3U4QktjL3lsN1lQaWlRaVNrK3ROQ1VJN1IwUXN2QjJoU0hCbW9yc0plWVJuUmIva3NoMGFzVm5jaW1pM1FHMEFFSDgxOHk2MVBrSmtwaWlXRnRDMmM3MHcwOWtHU0FiSitjRis4SDNoRndWc2hsckc2TDJaTGpKTEVVR2Vha21BNTlXOGtPM01Rdi82UnhOZGdXanA2b2JYZDhqcXVIVEcyeEgyTzdWZFRxZStEZ0M0RUIvNGQxWjdjWGZiQysvbDJlVkRHOCt5UkRBUFNtWEQraXd6VjNzL1ZMRFUrQlF2RnZGWmZSVmZSK2l1aDZjQ3BRSEJVdWp0eFoxZW1HZDE2d3JHSVE2ekNCZ0EwNExmaGpveWU5Y3JrV0ptUnlvWXF6R0Q1M2hnSDZ3NUJHazRMc1R1K3BrdDlkR1lrN2NLMEo1amRtVWhmZ3BzTXFpSTBLamRobzFFSURmQmJXZlBndzlxQ1dKS3JrbytzRkdVR3lQV2FsVUgrYkp1bnJ6SWJPMXBEWlpuUTBIb0lFWGY2K0FYVlhhMFZqY2pFb2lUUUtKa1pJd0sraVlYcmQ5KzRDdVZGZ1hvUWlnWW1SVkF2T0c4dTdrcFN6QjIxMnpNcDdPSjBScjdxT2E2R2k3T09ud2tlS2pFNUlUTEZPZzB6T244WEd0d1AyOGNiYlZyY3hTQUJoa2t0N0ZaVGVuQjhhaWRNaG9KclJUOVh4QkxyOGpJVkIwdkpNbGdMVUh0dkp5M1ordjF4VVhGaERWSWo5bmtJZmFaQ1pQMHJiZUs5ejc4OExJSmk2WXBRaHVlTUMwdkEyQWdqRUxiUEtRZVBEeHk5K3ZoUGx0ckQya0lucEN0QmFwVGpSZTV5aFlGMk1lSlh5RDlMWFlqUnNrc2krN0ZURkxKZ1diTWVBOVVTdkNnYUdabkdiREEvTElmYWxBVGxDSk5UemZNRG9TWEFsSXhaQWJiQ0c3WkVERldiWjBVR2lZWHZSc2RHWGhDNG9ZUzJ5QnNnMEc3Y1pTeGk2dm9Xam9WakozR1krTEQxb1pZR1VLWDkxNVNndGxva214Ym5YdXl4QUs2OTQ1N3NOY1JJbFJWempDdnB6T1pNcHYrOXZsMWZSVTBEbXhTVzVEZmdqTm1uUmVuZGJXSEdHYUwzZFJyVVJEc2JoYVVQakJxdzBSdEIxVHpVOStQK1hrMk5LSlRnbDJVMnRGYU9kQW9PS1pSZTE2c3lkRmdQb3RJV2l6bndBdEFIV2hBRURsREM2Tm54ajNnVmN0cWFDcXRMVGFXak1LWTJYTUxpcU5uOUNIekw2MEFJdjN0UEl1bTF6RHlxU2hIWkNtbnA5UkpFSVpwQ2lJM3VHWGZzdTFFMHpYN3ZmL3RZaERIQW8xWnJ3dW4vV1dPaWgySmpEcUtJd0dvT2h6c3BBS2tZbVUrSHhvUEhFaWF0MW1HM2JOMlV6bzVFWU9WUExBRVFmVUF0eWE3YTlvbmVaS0U3NDM1eDllZDIwZHk0YmJiTDBMMEZHYmdzMFZuNG03aGhXQ3BpM2puVml2dXhBS1pBUDdQNnZjWmtaU1ZNMzU3TE00bTg0WmJidngwdEpMRlJRTHV5SldabWJGam93QVJyRm9jTG9QSGVFMkkxOWUxVXRncDExc1pKUlZueHU1TmdjNFVoRjNYb1ZRL0FKQzlRUXBrYWRCOGNWRjRUQ0RpYmdlZkFNSk1hMjhwREE4elI5SmtQQTVnOE5EYTlacEdHQXRVTGRxelhLU3FJaEdtUEtML0pPeTgyclduRHZReEVnVFJZaTlSQk8vcm1uRzJFamUySEpTN3VXT0pNTHhIbW1WS0dkbHRwNHpKeGlwcUJqdDZvc1dPU3VJcTI0aUg3WFRtUG5qQnNTR1k2OFpzdEx5RzJEVVp3c3NwaDQyZzY1c2tIdmhtMFpVdHA5S2duT3ZzUUFQQkxQVWdLeWpOTjI1OW0vOUYxdGF6K1RpZEhSRGIxVTVySW5aaXc1RzYvSDRCSHJOZFdhZGp6am1wb0VwMVdQZ2FoTEN5RmlZaXNEYWJONmJHV2hvcEhsS2VaNW4ydkhNQVpPS1ZPK0Y2NWFkNHVvVjBOV1ZudElFWGR5MVBacHc1V0E3enZwVFJhRGhScWlGaklFMHB1d0NhOGloYy9KM05ieG9vLzkvM3hDZ1lmZS9wODZoMVlGdjZrVFZLeUNqOGhyTUNCNXZQUFZsMkZPVXkrT2tZNzJTVytiQzdaWGh1R2diU05sR2tOUWpybElDS3RGVUN4c1RZTVFmb2EwbHA0ME42NHpNeW9hVXNzd0daQ1FOOEVmM3hQZTRMd3RSNmNNc1dDdisyTTFid01pSGw2Yit0QVNKc3JJTkgvTEdGY2c2T1dWMlVXdHBtQ2pDdjZqcndpOVEvNGRYaWhiUTI4LzFPVm1RN2JtWGNXMHZySm1mK3RTS2kzSE1acVlqYU1nSXd5SmM5TVRxVS9SMXd6S21NVFZ5Rjh6NEVJdmhGZjRKWC82bTVaMU5EaDVYQkpmVmpTcVdOUlI5U1pvNmtnTmFlSkJVWWRjQnhjZE82YXVhTTgzSGNlbHROOHlqMS9UTm9sK3VtYjZEVXVzTXE5R2U1WlIvQ3RsWEMrUEtVc0JTZm50THNrZEpkbDQrWTl0TytTa1NMYnpQcjFGWFFRS2hvQ1ZDcnFJYXhqc2JWYWpBTVlEbGNLS2Y3TEJCVTJqTlJTdjNYeS9Xcmk0aTRSYll3VE8waWtqLzhpNGNOVUVDZzJwVXoyc2VnUEhCbWFCWDdmVSt2ald4bzBEZVhNQ21BazRLSVZtck9NYTloazhHUU1SZHZXL3BlRjk5bTFzdERCUTJSb05tWWNuV1pZM2sydzNKdktaSloxa2U4M0RMcDVjeEVUZlNLM1JTMmxTL1M2NnZIbFdsSTdZb3IvcjRXelpUZWJDL2VMc3V3WmVKOTlGR0ladXFxTjg5Zjhtdyt2M2ZQMUxNMEJoYlBLSG9aWFBGdGVuMzVxREpMWW91WFVGVGF5L2ZkZFBldTlsVHBaODRzaE5taEI3YTVtbEdLSG1vNTRzT2NQOFZ0eTJNWnJEN2MyNm9ueERCVnlxdnQ3MGlwdVhlWlVUazR1eHhQdFBDeFY3QmdZcFNNVHNkeS9xbTBmcU85dDhXM21YVi9VYkdHY0Zxa0Q5S2txZ0lteUI0T0xEV1lNS2N5b0Jab2xmelgxeWM2Q054SmgwVzVXdXF6TTRwUzVUa0lNODdFL0dWZjA2cGg4alJKUURoQ091RVBIaEFuVjVPSjRjeFB5TDU1am90WTFpRkpiMVViTExMRFh3ck1tMjJRb210ZFkzOG5IcTkyMmROcG9uL1RVSTNVQ0pyTlVWYmd0SDY3MXlxYTlTanNvNWFwY0lVNWVKY1VUMDE5eGMyQzQ0ZTFJNTZZcW9ZMldaakFTc3lQMVcxVW0zQzFDL0I1Um1reUdNdnN5MXgxYmJSbzZIalFCcE5ZbENmdFR3Z1BCN1JkaXhMalpnUG0zbERhS3o1ckxjOUQrTFVKOGlpeVk0V2RLd1VnaEVwMUNicXpYKzZZNjFsalphbkEySlNDVXZCTFVjeWZjRTA2aDJoR1dwVFpJa09KNnFoVktoNm84b3pXOXBmTnFSZkh3M3EyYVowOUxYUXJKNW1ONlVtSVJ5ZjVFTFRmTHVjRFFHQW0vRGIyWXorT2EvQkxldG9zV3ZST2NSaGs1YUtyUnpNdTBpVnEzeU5oRmtWVEVZbGRQQmtFcVNFTzI1OTkzbmRTYmthV0xObUhWOTFTN3VUSGdHUm1qc1BxVDk5NzI1RzNxTmh6RTlHR0hwU2pNdDEzM1QxN21QQkZpM2pLKzhZczN3WlBNTUI1ZE5mWkV5dWFxcnpFYlExNDVmSEVVRGt2TExtMmJtNXNva09IeVhzTGpyNUhZUE8yZk51M0Q4cm4vd1BSdzFVKzl1ZWJtdyt3akgvSHRnLytWMWNQZ2daL1o5SUFBdzl0bzQzL1p3ZHZlc1ZFV3k3ZVBkNXdCMzlTTGZJS0oybjNJdHpreDJBV3E3blFna0ZsRmdIOVBpVnRDd3pid0NXYjRkbGMrYWxsYXc2UmIwNU4yaEdLNWdOZGJjaUtlT3o5VWxYWHNEWitqU3lxS01YWk9FUVdFOGhBSGc5TGpHM005dnRvbS9WQWEvN09Qdm1TbXBialFnbUtTN1RXSGsyV2NUK2gzakRleTljUmdudURUY045VUx0SFRUNk42SEUyWTBCVkRuNVRhNmMzRDNKd0NPSmczcS91Yk9adzhtckJHMm94ZER4anpvck13aUZDaStVaDVVZWVKQ2tYZ01kRElObGw3TUgvMWs1TVhyMTVCN2oxWWYzNEQzV1ROOFFBTlQ5M1NQeWFiL2RDMTBiRUJUeUNRelVIVjVCZ01ycVFZUmxYMHhsVUpiR3VidmhlL1psWk91ZHEya1ptdTFmbTBXT3RhZlZiRmUyeWxOK3JlSTVyRm1oMTM0UWhyR0JoTnBEYURyWkRlWW9Fd0F1UlQyNDJnTkJ1WWs0Y3ZHNHhuczloak5ZVlFYS0gvWTBuYXIyaFA4WEt3ZDlHOWRmb1kxdWR0YnNvdEFFRkR3R3ozeUtPQW14c09UaGhVbVJ6aUZHWGhvZWdnQmpFL1h5YU5TNHRMdWEwL2pkejJ5a0RzNTlEV3VKaE9RdG5Vb0FkMUdYd1ExRGdBUEJRc1hqVHdDRkZGVTREaVpyQkFjcmpCcS8xUmRhMFhwRFl4UE80QjJyWUlYVTZTRW5ESEVmVVpGVFFidHlxNHUrNWw4Q1V2Z1d3R1l4S0NIVWVoMU1lSVBwK3lDemNPbzRBZ1ljRk40djU0RXZKcFFuNE9WcW4wVFVCVHRPbXNUaHVvY05kK2JUbTU1ZHMrNG9LN2NvQVVJLys1YlMyYitYRXRhcnBrSlpXQkEreXJCcFl3Si94Q2ZSN0ZhZ0treHYrY0c0KzkxSVJGOUF1VlV6NGVYK2piQ1VqblpaK3ppWkxrT1hFS01PemNDaXV4V0ZZZ2FmZzViaE5qbHYrUGhadlVRNlpBZHdwaDRQUUJjY2tnTmhpM1dZc1FZQzFyRjRuVWsyUGZBckE4WWcrMjQ0bmpEbDJQRU1rdDQ5bmNaZlQ4UnptaWp5ZXgxbnk0N1FKVlBWaklNQWFiVDhlUVYySEJSdUZ6d3B6d2pjUHp3YWdua0pIaHB4QktHbWpoVlk2c0lVSVBnUit5QWZjRklpUXU1QVN5S2hEdEdzZ1Jsa1RRcVFhQkVFOG5TNWFSNlhrSkZLSnFwQjNRVGk0MzFRbWJTek41T3J4SmwybHBFSmR5UGFjbUNhYUwwSTZGKzJSVzlEUGJUK2V5VzBBRVo4SXhEUU9nbHNRZGJleGJUUVFRQWo0VlN3S05qa2k1V0lLcmVObUx4U2c2Q3luMGlGZFRCTlUyN2lsdGgyM3ZZdGxERHVtQ2RWZ3Y1TFBYSGxyQ3JHRGthSmxsaThpbVV4S0pQNFFpUkpSalNjRmlpcTdXVXB5cTJPT0Flb1BlMXYzUThRZjRMdnIrcytQbkgvdjd4SEN6N0dONzRPejhpQU1IQnI2ZDYvWHQ5ZmhiYXZYczVyd3NuNWxkQzBaUEMzYmVGd0k3UXVuYlZuQTNVeG9HV3pSUExqaWV2cEo0N0NWRmNOUEdnYU4rcEdvR3ptMVl6TW52VVoxVDFSMVJHVlh4MEU3em43TEtXdUowbHJDVHYxRGNVMFV1VmJZZUFWTlBJZXBLYk5XRVhsbFRjc3R2WnlpYWRtRmwxWE1lMlVXemN6bmVNYThuOE9RYnpPVE96R2RqdDVVaXFmUDhGS3luS1pMdk9URU5XM3NhUUswcE1CTGpLU2VPcnBFRlE1VHpoVE1wTS90TkxucnlkeHBQYWs3VHBmbmlYMmJRK1JyQ0wwSTJweWJsMkNqOFMyTnAzdGNQZXR4ekxnZTJ5Ull4c0V3OXpxVUNoMFVDLzFrMG5Va0UrTWt3alkybWh2L1A3dXlhRDlScThwR0V6V0NNQk1RQ25RUURDZ0lNQUxqNHdSN0MvQUdGWG5VVVN4d2d3aVNtM0hhazNEWUhiRExSRUNFWVVSazVicGZYWWY0cXBkWVNhYXZ4djd0dzdPRDIrWFpZU2pEYm5VbmQ2c3JlVkt3b28wOVpzdmt0TFZFSGxlM2NyKzZsdU54eVBlS3FQQ0svM2JaRWhRZm1NZm1DMURwZjBPcHdiQzZrVHZWcFR3b3FHaWp4N1NzbmRRNFdxL2lIL3hrNS95bzhWc2Z2WTF3YWhINDJzclphYk0rcXVGdFN3WkZmU2taOFVQeC9mdjM0Tk03d3FkWitjV0JhNitRaWJMcEp4cHp1cDU5WXJaL2NpVStjWEJ3UXBWWFRKUVdLN1lCSWd0OEs2dkJtVExFVGl4dkZ0YVJSYzNGNVpxbWtBcFBaUXM9XCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzE2X19fID0gbmV3IFVSTChcImRhdGE6Zm9udC93b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBRVJrQUJJQUFBQUFnQmdBQUVQL0FBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR2xvYml4b2NQQVpnUDFOVVFWUmVBRndJZ1h3Sm54UVJFQXFCdUR5Qm5pY0xneklBQVRZQ0pBT0dXQVFnQllSNEJ5QU1oUjhiR1hBVjdOaVRnUE1BaEpUc2pxc282aFZwcFI1RnlWcE5CUDkvTytCa2lGQVhXblg3SFZDaUZOMmEzdXFOT21DeFBZcWYxcWc3MnNLQnRsZzBhZlVEWWJVcGg3VzJFNEhmam5EZXRXTmJvN242ckl0K1lIU0ZBVDZXK3FEWkh2djgyRy81dFdOYmMxZC9YQW9vNHppZXA2ZjhkUFFKUy8xZllKbnFDSTE5a3VzL2o1dit1YzhTZ2pRMUQyUEoxRHBQUDFNVEprWW42bVZpOWsyTkFkaW02RERuTnE5b295aGlCZWFjQ1lpWWhGaW9HSUNpWW1GaUJRWkdGR0J0MW9iMnJGbzV0M2FWL3hmNUhBL2ZMeDkzYm4yYkFqaU1Sa2k2WlpCRnRpcXhOa3BRbEtTclRQN3U1L2JmSjJOY0VtUkZ5L1d5QVo2b0Rtbmd2QTYraTF6WithbjJJbEFEVkVBSUNVa1dsa3ZWK1hENXpiL1phYTFzV1p1bk9XT20vM3ZHdk4xM2M2Wk1iUm16dUpicDVxNGpadlVFYVRwVUNPcnVQa0pQK2duN3lEYVlxNFN3K3QxY0Q1aUtMN01GWHdnUVFyQ1JGWjNkTCtiMUZmVTEzU3VxOFV0YitUTW1uRE9RREszcVVMdU9pWGIyRmd4TGRXNk5TVm9zQnhuSGRyV3o1TW4wZGVFbmVPaFBCWXY5bGZVeXhyQmV3SHFlNy9FQ1lGblNNak1yenVQRGZ4d3o3YzkvS2VZb0d6dEFZeWZuNXVRMUtTV3ZHU0hMVHJqYUtVZWtnRjNsNWs3dS8wdzEyd0ZBaWt2bFM1bThTSWRVZEFxVjNkbVYyOUNGMSsvOFA3T3pNN05MREJiZ2lWaFFGQWp4UFpPVTdnNEFTVDhDU2x4QWZObmhNaTNuTG9SRTRqSnhtVHJuV0lVUTlPUTJscTRhOTVXN2tGc1hYZUV5Rm8yZlp0WUFQcHBlTWNVWU1JbTBqKysrVmN1NGFwRkJCcmZjdXY3M3RaYlVRRERYTVVhbEJRUUVGQlE4Ti92YTJodEJZQWhna2VwcEw5SlFVbjJFUmx5RWJ5N1ZUNVhwWnluM1JaNi8rbFYzbkFDUkI3Sm95c0lNQXVqUSt3MFU2RUNrMFlldE9nSHlPV3ZDcUw3a2ErYmdrVXUrb1EyWXNPU0g4RWxqZGhGL0lhd2pRNzFDUTQ3ZzlPanYyUTZBL0FMSEd1OVg0dDJzdXdrNlNIeEtDdmQ5ejhJUTZ3OUFHYXB3USt1NUVLUW5uQUlkbmtHSWdDQUhOV0lpTWRJaU93cWpMS3FqTWRxak4zalZXdDB0U2NkakttWmpPVFppTDY3SDdYZ1liK0laSDllZjliOEEwcS8wTndNd3hjZWtGRXRLeGRaTXRkUksvVFJOcTN5WGlMVGo0OENrZHhLVGxHRVptWXhrWmtibXRpUmJtQlZabTgzWm1kOVovNSsva0VPZmR6SG5jeVczOGlBUDgyNCt5aGY1TGorRy9zMi9YSmpyUE1CVFNya2dwVjJHQlMrYmNpaFV1UmV1L0NxNElvcGU4WlZTbVpWZjdLcXMraG9Kc3JVRzVaOU1sS0FXYTYxMjZtb2QxZjE2VXEvcTl3YnluL25QTUg5SkdNSnMrVlp0emRadDQ3Wm8yM1pxZEhzMm9RT2EzTlNPNmNSTzYrd3U3TEt1N2tiRWo0NUF6QVFiczQyZDFaYXc2T2cwWmU1MjRVK2pPTmZCN1dKSkhoN2dNeTRqdm9jSXpYVGV3eVgwdzJBZHIreWxTcUpobWxsd2FvNHlqd29DWDhsR2w3eEthOUp2UjNsQTY0dCsyNTcwL1JiRWNXWHF4TzFzTTJsK2t4ZlZlVTRvT1pwd2tCV0pTY1R4SlREUEQ5Y3hIai9yVWllYXlaVGdHdE1zMHVEVGxrMVd6ZEhIcUk4NEsyUmdMRDdnRThSVURoT1J0dlAzU2dOODc4UGlUMUY1RzFIQXR6VjB4TGM2MDNGd0YrRSt4NmF4RDM5eWtiZlVqcXpPVytjd3FqTWNuNGp4YU15SGhJYjhNUThOMlp2MXB5YnJQRUUveFBENnh6RnVxQmM3cXpIaE5GaUw2and2aUZpQ2pBaGE4MmhGcDd3WUhmM042U2dVTUtKUVJLMXBxQ0R2cHpHVzJXSHk0SVRqeWN5cWwxd08yVUZ6ckJ6YUloTVRjcTJ6b003WEJ4RUpXMWpOaXJuTVpuNkpISDUyd0lzRGtMcmNzZGV4aFYwMVpPRlYwLzU2VVpnSXh2MXVydzgrR0UzajNsbU5NRWtwQTB6ZTFTWFJmeGNiSTNBRkQ4enpaNEV3WU42U2N5eU50ZUVOOG8vbDFPR1g1TDA3OVBwMW9BOTk2TmYwbnpoNHNSQnJvcFlFWkxXK0FvT3Rzcy80cy9Dc3h4c3dmSEhUajlvMnBaVU9HOW1yNnRVUTZQOHpEdEF1Uzd5cWlDY0M2UjZmT0RCRjlNdmpPbE8vbURTTWhNNU8vWHJZSk1MNFl1TjJVcjMzNzA5U0l0UVdScEFHeWIwY3BNMElXcjJkWGRVTks3bFBrazdsZXFXUXBCZG90dGNIUGZJeUllWTN1MnQ2ZkdURGY2Zm8xMFZkMXZVOWRkLy8zQVhnbi9YTHBaY0wzZGc5ZU1ucjdqaHlhMEhPZ3B5MmIzM09naUQrTmVSdjVkRkgydjIvblZLMXU3OEJ3R0ZIYldUK29QbnBHRnc5WG85VmpoamplU2hPaGExR3FyYk5ESU5XaEsyRnR0b3I2bnNscGdWR3BCbHdicWVqenJpMDNtZFgyMkpYYXU4UnNmeitnNDQ3SHNoVTZCcGxXbnNHQTJsMy85d1pCaHhUYklIbE5vZXQ4Zkl0c2FyZmY4QnNiRVUyRkgzNnBPOWx5RlZtWFdDdzVPUC9iYjJ0RHUxYVpZNGtVdTRDMWwwcStVN3ViYTB0emFYc2t1S2l3b0w4dk55YzdLeE1Wa1o2V21wS01qTXBNU0UramhFYkUwMlBpcVJSS1JIaFlhSGtrT0FnVW1DQXY1OHYwUWVQdzNwN2VYcTR1MkZjMGJycWtyODZJbEcrbktSR21CK3ZqaGkxaWtuaWZXNDVhclJjT2VHR29mMEoyanFDT3hZN25FamRNZFo2d3hZdWhGMS9ub3BMSFVqUjk2bFVwTGRCOFhyVmNNckRjU05VYXovVU1wNmVGYlpobTI5QU9nVjd3TUo5TDVxNC91UUpUWHNFelo1QTByeU5Yc2dFNERSS1RUanhpWDNjTlltK2ZGaUd2M2RIVytjWkF4eGJsbFhtcnFSRDZvTlplUHlxK2w1VVFyYkJ3cFROSW9KZnBMemdUT2l1Um1DRnRlK2xqa1A0RTd6Zk1NMndoTDR2K3E0QWEwRUVaZk44SkJvRTlXTlQ3Q2ZDTCs5dk5NaVd2TS94VmRYRDdIY3M3VlppUUtSUVdmWktjc3V5MXhySlpqSFJmT3NrUHhpeGNIamtVOG5JckNrVzlzb0NDUWUxbGhmUGxSNFQxWTk0azkwZEhDaEtJamxPeVlRWGRObXRXMlRad0d4UW5WYkFRQ3MydVV6R3RycU5WRW9iWDgzcmRpSHNNSEZwdjIxTDZLR1BQVGdpNGg1eU91eDBUTmpQc2hPVnBSL2x1Zk1XQU5oaE9pQS9yU1dDeVpGWkszSTdzOTFrZ1dWeU41RlFoVWg4TmlHZTVOZ1BITm9XR1BJMTVQNDNHdm5wd3ltWG5mc0NOS2dldmIyQmRxdE9ySTFqLzdiUFhqQjdTYWdRdk9IdmhFdWlBdHlwc0F3RVkvMW9mT2NPQ0xKN1NjSXJ3ejZsbk5GeGRUS3J4ME1OajV1UXc5ZlkxUCtBZG5EcWUrQnh2Vnpkb2dwd3U3L2didkFPTUlROXl2NnFkN0ZEeFIyUW9yTVJxcnJhSkRoVXhBYnk1enZON1VUQ0xoMEtoMGxpeWhjam9kVWplRU9QQUNjN0ZvNXhsMmg5b0RUbmY1cHJydW5DT3gzSWN5SzRJOW1ZdFkrd0ZuQTVRb1FlbVNTQXNOWmZLSTFhVkNkNHUwNjdOUnduOTdrYnZSU0RVQWRwRkVVais3VGpJaDdIZGF4aHF6VFBHK3AwUEtOYms0azV4V1VJV3JWSHZwS1hRNDA1MGpKUU9ZYXdDZkRoV2RBMHJNV3pSdFEzaUptWnlyekpBKzFQaTJobzRZMTJYemcrMzJtM3lwRVVNL1luS1U2VThOalAyb3Yxejloc0ZSR0I1eVV3U211KzV0eGd1UTVIY01DRFpqR2ZvR0Z0d2ZVeUNKOXVyUHZ4OEVRc0xiM3ZCTUNsajhPazNwSmNXbXU3a1g0MWJ4ZTJFaTMwT0lMR29rZ2JYWFUvT3dPRWZSMUo0RkFEaDFpTU1CamxIVzJqaUVnRXFWWHhMZjRMdWNTMnliYVVrekJDaVZGS3FSQ2tpOWhnSXNuY1dBL2hYTkt0Z1djWHFndUppekhHOGNiWVdrNmR4SUxaN1NwQ0JFZkJqektZcEwyeFJzWmtTT3ZvWlJCL3ZaRlo0YWdSNDdOUk85NmhNSkNHRGJST3N0RzdZcXRDbGZidWhSNENGWG9Id000eWdFcEZGS294b2U2RzdINHFDTktCY3ZxL2NLa2E1eml1WUFXNXJnVWdndm85ZFJJSUhUSTFXKytnRFZ3S0ZpeGtob2kvN2psRlE1SFFPemhJZTB1VDFMcXAzWFlSVWhWdXM5aFpqMlpMRlhXcHkwMDBLbGhEOVpIeHQ0SFZzTENOWXZEOUFBZWpYZXA5RUZiaG9NeFlWMnV0N3p3NUFRUkJPMXF0WVNMZDhVYVdwZDl3Z1JVSzFLR1JUbEFxT1FDZDZZYzhjUU5yaExqazFaME92aENqK2p4OFUwRkVpOEw0cSt5Ym8zZUM4c2ExZWsvNGlJZm9ab3dEZTUvVEthMWRqbWdvQXVVWksrSGUrSmJBQVpyMENSQ1hPbndGRG1vRllkTWl0QVFDSUhRamZ4YVpIRi9CRFN0QllHUVRxS0gxQm9FUm05QjZoSmJEYlg3ZEpnQVE3M0d2N3JjbFVxNE5yRFhkQWNMYU5rdDJnSEJpTHNkWEhJaEhmZ0hBVG01L0haMTgvSkhCWkppM1pQWU80RUtmYUpIQTA0dnhxcVBpcFZqTDlxREtNc2JHUmtKSHB3Tk45TDQ2MXhza0Nhb2NSQ1dhQ3pRazZZVThnSWRRVEpubGkyYUNhZ3BzTGdxcStBZURrSVp1bkVrdVQ0eTBtSlVXbFlxcTQxTFJ6M2pNaE9XRVhUb1N3RWJsamdlc29qd0g2R00xSlVhTklzcCtsWDJCdm1NYjN0U3UxVTRPS0FWUlU4ZG10K1pRcFVPU21vRkZrWXRXd2lBSGVQNUR6TmRCVkx4Um9tdnZ1L0lnVEVyWHdqbDA5L1oybERmb3RzeGdqd1E1NEhDQnNSMW9OTWFGcWZlSmtacjFPVnQyNlNrWTlrMW9ITFJGRjdteklnRndLbWk5QXMvQlRGcmtlN3N2WlI5MXlDcWovL1p4T285NVJPbHNNRnh5T2Y1TGYyUmkxZ0FNTDNobmRGd0lCaWxnNmF2cWZzcHdxaTdpSThvL09scG4rNUsvYUlaZ2VLOUJsV1N1TU9IN0xKZ1Zta1RVYkNiN1ZQWUh3bkNvQXJkdnVkVjFudExUamRaeGJ0Q2N1Q1NzWDZNbjV3RWdlM1lCMkJlTHpDT0NRQzE1UzJDMmE3YzBLdTRIekhtb1VoL1BlRy83cC9Lc2xBK0xFU01NYjNnZEEzT1U4bmpDdU91UTlwZi9VODlWQ050Q2NYa1Y0Slg5RjZDblAyVWtaMGRFcTBPR3RBNnJmVGhoSmwvQVlkbi9ZeWxqRkk1alA1V3hJVWpGVU84WjZ4YTg2a3N2eS9uWFF1NmhpZDVGaUhBSkRmcUZvcXdWS1VVUGpIWlpqWVl2VmZ6R3RqUHVoUm9NSjZ2a0c1azJ3aFdWZG9YZHBzam4vVWFSRUlRdHkrcWJIdFF2eDkrcXBpMDRCUGIyWjhsTUxhcTJQTFljZFFyVUg0dnN6Q0dhcTJ5eEU4b0JVNFYrTXhxRmd4RlZ4NFNqejAwaG5KMlplNlRLSTFWc3RLN3haZ002UldLcVFhRU1PciszTGluSklQTUh1eTVoV1BSSy9BYjRsbmhkOWhxRk1CWGFWYVYzSklkVWhJZ3BMRTZlTGhMQlJzQ3p1WVJJZlE4YUUrcWY0Nk0rVy9sdEJTUWRDN3IxWnJmdFI0SHZCZFF6aCtlMHNTeUROaE9BS3RRakhCMUt0WmYyWU1zdVpSSDlZbnBoTVltQUN5Z1diOENmOUExOVFFQUl2UDl2TU1CYjhDZGR5UzBML0d2RWY2ZWxmN1BncjViMXR5WGYzQTBnc0k1SmlDSUZQanJWT015UEVMQWxyQnFZV003L09rejhKRXc1azZOUk1VUFNaMUVCazVBRHJnbUlhT0ZBV2E0bVlwSWRPTVAxVWUwM3ppZ1FncWVNb2l3Um5abE9UbkY5TEZnaVBmRzU0cGQzRUpZNGIzUlQ0Y1cvSi9FVzFNbitNZERRMnJab0VwUHBOTER3Y2JJVWFaakRtNTNNVW5MQVgwMkRWdXNoUEFRdnRLR1AyZnZ6Ly9kbHNJNnNXeWRoV2xkVmtZdEhSWDZ6cDlPSURKbmxiTEMwWFZqR1VuTEVjN3hKcytxemZwYkZJeFMwNGhxMmlVWDl5K0ZOZmlXcWRUcmNHNlU2ZFRySG4vdmY0Qy85ci92OXFpaEt2N1owVWVPdFMreXRkWklFOWdvL0MzKzlNSnVZV2FXSGc3eGNMbWRwcXZ6ZTJpcGtMdDZOcFBzd0NmdlYwY2M0TmZBRUVuM0QwaUNSZ0VwTHlsWTBkR0UwZms3VVJyb3VXMUpabjl0UDhXbElWQXJkcEh4RktKVktiVHZnUnJIUHkxcGNUcytMRS8yb2tESFgrTmlRTFZsYUFrTUZmY05tbDVMZ2ZnaHJqcFpoTVpEWHJIa2dhYkVCTXBMV0N1VE1mbnNCQUxLOEczN0JNYUEzbmhqdE5wUHIvQmdMelo0S2VnY0p1Z0g1UWkzSnZ1Y0JpSHJHck9WVUY5VUEwLzVvVmhXRytIdFpvRjNHMXErOElaRUFza0hHWUo2bGhFa0xOMlI1NW9sM2NiOWhmbDcwRkIvWEtzemdpMGZhWTkwY2t2b3QyeWRVSDZQNTNSZTlBazUwTkV3dUxKU3hKVzIzaFQ1cEFXU21kaE4wZ3kyU0w4NnlxMW96S1RZb2dRUUZYc25uOXdqZmJsZGFwYTlwVVdibEZPbExWck42RDZ1QTNlQllySS9BeVRFZEdJMEdkaE5PZ0w1bnJ0MHR4UStzWVlqM3FxQlNFNmhJaXo3UnNya05PVHJrQTh2bWlQY1A2SkJLOTBrcUlHelpUMWtwT2NKZjVVSHJBa0xzdE5QNzIrSWhzMU5hOVlWWG5vSmFoc3NHNlpqRTFXZnU0S2ZVWEpmc0gyeStlWmtmVGo5OVVjNlNCYUUyYUV6ZU1ndlFlMEYrcG1tMllWcVZEMXJIcW1POFpCWXFWVHNrOXRDcEUwejdxK0RsRlZvMVpKZHBiWlZYTEp1MW9NSTJZWVo0eHdGNkJ6ZHFVcC9sMlZTWmNIR2ZjSWRzVFdNR2p5a1VwYVRVbHFjVkg2ODVaQlczdkRPenNTQVRlZE4wWm55aEMzK3R5YlNEQmk1ekZMK0xaUExZTWRBaktMeDNwcThQZE9wcW9GVjR1bjN3Sjc0M0dCajVHNzV0WnBCYWFlajREazh0U3RHd3dQcEE5and0NmRVeHdmeDY4em9PSTR5Um9VRlZUbTBydEZTVEdJMG9qd0pDUmw4Q3NNWjI0K2NvTWlSczRvR05SVGpaUTRCcDRJdFQzQTRqUlM2WlBSajdXRU84Vm1CUHEyVEkwakpKL2tpd0RHVng4Vmh2b0E0MTZ1Y3BHb1pPZXFMVEhRcWVZdUxVOU5kVWN0Y3UwQjFZVGVTUEtYTEZXRTZQZ0ZNSzV0OUdqWVRkL2dBQ1FUZWF3WmE5Ukl2b2t3WGdWSWwzcU5yQ1UvcSs5MlZSUVk3SzJ1TTBQRFR5Tmg2V1NHakdQdlIvY2tBM25qUVByNGxrTXQ5ZzVORzErNVd2ZUFINVR3cCtENFBjSHJ1YmFEdURiR3FvN2tCd2Y4ZXQzcW96VTBCNG0xTzlRWEdMM2RNTzI4dEZCeWRKd0trWFdDTGhjYnV5K1NUd21FcjJTelArZENoTVQwNTVEVmhtNzBzamFZZnVDUmZkTldxeVl2V3owdjF4dU5OVVdPdXBiQXB4M2ZWVE5URitRRWlnbjNlRk83N2xaWjFmZUFiWGIxZm9aV2VFT2ozQkl6UFNUYXNCVjBEM0FablhCQis3a0hmczJadkVlbUZ2QVkwZXVRYnFhVURGOEVBWWE0bmZETUdmWnBpTGJHejRnUkh4KzEvVXRZOWV3M2tGdXlkdE5TM0QrMG5lN0N0bjlyN01yMW45MlZZVVZNQlI4WGNOMEIrZEFwT054eHhub293NVNRRk5laW5ydTVpWDQ1OEJBVFFjMXF5K1ZJU0hoWHZGNS9ST3N0UWhlVHdHQ0VVenUyWlMwcW4xeFd5ZTdRV015eDdGK2ZCTU52dDVmakUyT3pUanlRUzFscDY3OHRoeDRkWUxXNWRiajgzcklmWFpKMGplaGFlNCtQa3liK1dYUHRHTW8yam1yZWNyaG5QTTVNODNnOVR5ZXV2R201Wlp6NHE1S0dWNG50MkV1RDkrVWs0b0FaYlU1c0x6UGJmcHgyWTROVWx3MmxORFpER1BsM0ZkOGtuanpod1NzTG5hWlR0dUppZnAzVzVURkNiakhqTEpHbzh4dzdPdFE1aWs4M2xXL09Db0lrTVMzK2xaZlRCWURPVi9wdzFZampWY29TY0pGQW5uL0w1ck1scEQ3ZkFEUklZdzY3alUrQmJHL3k4d0pLYnBJcktFYk5YMlNKMmdTQnQ5dEptZU1ndWh0UGs0VkNDRFRFeDVxRHZVUmhoaXZNYy9aV0YyVTF1S1F0bGZZVU42cWVFc1BrSlpYcWlzTllQYm1UVUhVdHphdzJUb1VGenY4ajBLMkwveXZDOU9kK2ZJWDRFK24yQUtJTFNxdi9iQWUwNzJEMUFZWWF3SVVxamc2NmcxcjhtZUVsQnkyckpuYzJaMEV0TjdOVHZRRENqRVVEMWM4NzJRUW5YM2hZdWJNaW5EblNieGZBNXgyRllIWkdwUGtEZ0swNUY2dFhwa0ZsNFkvQkFGWnYwU0daK1B0ck9YUm1uUGVYWUVnZ1NNV1p6S25zcmdrckNlcmdsUHVPdGU0cWlUeGhkNUJmQkNVNEh2a3h6ajZqME9jKzF0VFJqNzFkWnJjQmFpRGh1QnlQVVZPUERBSGRJbFQvUm9QQ2xEdjdGT0JmZWpQWVBGK1dKcllTbSs0SjhSbDBuRjN2TFUyejFOb1VzREhJaVhVR2VsNklsa3NTQnpGbWwyRGxoOFhEVHptdFNuQnE5OGgvUWYzeXVBOElIVVE2dWI2ei9UYkZ3aHRoUVN5OWpXeXdJa2xDWjk5NTdLbzVWMjVTQS9rSUhxSy9tL0N0aWR3SHhJNm5yYmwzU0tPbVpXbmhHM002U3UzUlJmbTAvaHRZQlA3ck9sRXNpelcrUTlHL3NQSzc0WjIzcmxiTDZYOEpKNEpXUUk4OVR3Z3dWUE5mTTRqWkZFWGIxcVRMeUJIcXhBdmRQQVhCRGRucmJjVVdqdGcwVTMvWGpCVkh5bGFwSVV3KzBxcERNYXhMaGpYQVc4aDNrMFlqa05tN04wSE5teTNrMmtwVU5SMjFzS3AwdDYwaWFCbzlDRFQrRG9iRnVVZkNYV0hXMkthaWhJS2E1L0tiZm1XZVRBM3pjaGZJL2RpMmY3QTFzWnhhb253WHpWMnpkRnR4cHFhYnZuTDNmRzRkQ2xrNDZISjJWd0RZWUx6YzNLZy9QM0VST3luNlpueFZ2RVdUWXNPdXBxMzZOakVGQ0dZNWJkTWRRVkhvVm9LbDZFeVhsRExkUWJYSXJTTzlMRWVMYnNaOWxPOTJudVdCV2RpeWFKdFNYVzhSMDlucU1zREI1c2ZKT3Y4VHVnWjduWklVdjlqdXpjcE9LQ0V4OWFwSzYzRjYzSkhKVU9Od2NMRWlVWlVNbGxpbzMwQUREVUVSczFHbDJUQzZMdTI3eGpRMlpPY1JIRXIvcmpwN2I0dEU0ZUpJVmhNWi9ocUhBbzVTU0ZDdlk3aUJOY1FmTmwzVWhhUkVjeEZBODFFRWx3QW9GWngwQ0o2L2xOV3hTNlRYdUZzWUJJTXhSTWpxbysvNU1GeTZJK2UvaEpaajd2NC9WVGpuWTFxbFROTlBRbmdmTHk1Q1BESy8rdnVHaUVzNDcyVkFYNTV0MGdndis2bXgzSGtCa0ZmZlppK2VaeVpCbm9NOTR4emFLdnViS1duMGNWbFE5ZWdlcnJCSm9yc21JbjhyMkxQTEV4bXAybzF4dy92ZVoyQzFYakV5cGJpaVlCQ0xZSDdvMWZNK203OTk5OStYU2Z1allHM1Z4c2c1WXNOa2VPSE9DVjhTcitGYTN5T0RsVSt2a0RGZk1tUzlZS2dkM3Blc3laWlo1KzBUQVdNUWJCS3paaXdlT3FyTWY2czQzNFY3eGdtYWx0SU9OSXdoVURnaTZ5eGtXZFp5ejkzUmdnSWpCdUxyNFgyaGdLTGxiYVVlVUkvLzhOVWtHM2o0ZDlRVU5iZjhWeVIvNk41VzBUNUlhZk5PQU5GNTdmMDUxcnhXRldYczVIbjduZk1EeHl0eUhxekx6Szd3Ny9qRHlvaTVHU3RydGIvSEJHTFRuUGVzUkVyYWgwWGtHcmtiU3hOTDc2bHFYZUovNkFnaXZVRGFXMnV3UlV4UTJlR0pjUVd4UkRybVFsSmZoMW1MbG93SFBjWUpjdFhlMTVvZ2RpL0ZRR09TbVFYRC9YMXcrbHlUWStaZVg4dGJ4ZC9POWJWaE9oRlNKdVZpRmJxSDZXMlJ6dXZzUXB3U3pVUnNUNWM3VEtHbVBaWUdrTDJldWZWUlJWZmtDdStoY1loWGgrbEhJUWl5MHh3d000RUZ1eFErd0pHVnRvN0ZBK1ViZTlxWGFqNHZGTVc4dTcvYjNtQnpBWU1iaHlPeXY2VVZQVU4rR1Z1ZDFoZWcvTVY2dWVvTld2a2REOUxyL2dyMHVUYWNKM09iV2xKVjNuVDNlZ0FPRzJqZWtFSlRrLzBBM2RFN2pDazBwMDd4SmRqK0lKbjREeHlyM0J5K1hacFFXWnRjRU8wNFgyUElBRHFhQ0Z0VXRkYmhiVnpYdW14UXM4aStzd04wc3ZzdjU5VnR6Vi9LUWsrMThMeUhTeHkycGRkREt6UHRwbHRiaklaYmt1S21XMCs2azBRQXN6OVNuTEZScXBFcElsZHNPOEgweDhrVGtOUG5vTG8xS2JhbkNSSnE2U3pTWEUxNW9PSkdQbndKeHpiY3F5TkNiY1hsdkhDMjdtcEtOdG1tY0t0NGRwaDhETmNOb3cwOU4wRS9EdjU2L2pheFA2M3dSSHpZUjdCbzBHWUlLSDJZMlptV1FETDR2Z2t1VXMyakZnVGZUbWlWM3VXaWUxRFliVHFzZHJkV3JRd3JxdE1tSjB2QXd4OGJFdHRySFVUcGZBcXJpNCtPWkhCQjV3VHN5MUtDZVJnZTgwZGRFMHozSFQzcktnRmd3R2FsTXRTT2RwZm82ZG9pdGlQYWtNTWlNd2lNUnh4ZFl3dGxWWmRVT1N2YjhCSWl3YkUvRG0razNoYkgrMkZCeXRBVHBwai9NTThNYXBoaW5lUnNZNEpuaU5WOFFRZitjSlVTZS9GRHlOdDF1dHJ2OUFuRjdpTFUzLzZjdHBPTGNTKzN6a2NYSEkyQ2F4QTdESWkrd0cvSmdIalJZOFU3K1NWMVlmVTJuZzRvOUFlZnFVd0h3VHg4eVI2ZzJQeDNXelh4OWZMTXVzenFDb1NJWmt4MldHazJQeUZ4QVpLWHh0bkpaOU1VS3RXb2VjbCtlREN4bkIxYXRiTnNzQVJGb3lKU1lqdzlZYXFqVCtVSy9ncXJQVlA1WmRxeGYrTjZkWC9FSC9neTZSRHlrbDM3Y2hnMXJ0RVpkNFBqUlJnR3pUOFAxd2JuUEpmSDFqY01OOGZlbmNCdTdqaHZPTGw0TXZFUzgyTkoyUFFwdG14dHFVeEthVkZxYnJDL0xYaEdKdnB0L1JDdFR2T3E0eGFKUkhiUjIwY21wK0w3eDlXTE5mdTRRZ1p4S1RlVmxzemlXMHJ6VSt1YTBCTmExTDc3Z1pIRGVnTHNVVjlIaVpDaVh5V09HZkxnNS9zYmNBc0lJZXBPV0pOSkVnQXpRSitOZnJpOHBZT1FGNFE4dWVrN2N3SGxKcUd5SE5HR1lHZ3l5ODRveDlJbUZFS01wcFh2bUVXYTY4SWtXTS9NV1BFUGxrYTRYMVlYS0szZzN6L0dzUGw2ZFJJNGFzL016NnJEWERkTDNkWVhCY2VQL2kzMjI5amFITnAyOThmeVVPV1AzeDBnaW5ta0pnOGt6ejd0Zy9tMG9iLytpaEF1WmEwa2FNVU9vdTFVVGRXd2JNY2VHWUkrcytFajEvZEFUWkxMM1BtMUQxQVRjUzVTYzBxZXc5dC9JYXpEWGhrcHZOTjhTVFd3dUs4cVlRU2tFV21HM1FuL0RseHdhR0hZYVBESmIvaE8rQVppN0xnanBBcTdJUTFjYmdyR2xFZUY0d0pUYVZyQ1NPU0dRZ25CajRZRXI5dmsrblY3bDBnbnBUaTR2R2dua2NzVVRiMjgvVjJZVllvUnZUVU1hcTRtTkRDUVU0RnFsY0M2dGhXK3dMVzRDcGc0NHdreUMxRTJqbWxBS2o5QjFnT25vaFFoUWVac0NRdlZjd0NpQWdKaHFWR002Z0R6djZXVDNrWVhqdmcyd25rZG5EcytQTnplQnhESC9Ec1BLaWkzOTVaS1JmMHl5K0VjTCtMYnZCUDRwVzdsMGdiOTMzTjRhSFVRbVhEU2tEajliZHJZSUdKUGJpU1R6UjdQTGwrbEpqZk43Z3VVcElpbEZwVzY4bW9lTnRjdUhQM2N2bC8zM05WckxUUGlsTzdWRGFnOG9wNkVTNGw0cEdicGVNNjR0bGhNWDVTRVludlpiMFdkc1VtSnJ0WGkyK1BTR3hpR0NFZXNZcW04Vkkzak50VmZPNWFuQVNuZElnVmFNMktUS09pS1Q1cE91ZVpZcjU3TStwZHIwbUxEd0ZsQXMrT1hvbmU2c1o3aE94SFhqa2RrTXBXT1lFUkMzc2hidjRka0JxVDNqS2NLZWVLM0VVTTZXRS8vYXp4WkdXK1lPaTVHZ20wak40Y29NWW5neTFvWXV1YWFLMU1NQjJhMFdxOG4xaHlrRWczd1hMT0d2UEZ2ZVl4TkwzSkVrc3FmdjdJR3VRUjJOSGd6V0RKNi9jK0J3VE5aKys4Zk9WM0x2YU8ydmpuT29JSW5QQ3JIeGVTM2xUNTNFSUorU2M4OE5iSGEyUnBLWlZmTWZqcGErY3I0L0JGQk40a25sK1IwQWt0ZDVMd3o4ZjlBZzIzbWduZWl0eWZBUmdCU05Kc2FkcUluK2ZHUGtaM0EzWTNvSGpkSkcxYU0xKzg0aWthZWZDWE96TXFiUWJUZXZBSXRUVi9OcEY5MnpLQ01SbnV2c2MwOEVrZ2hxZXhCYy9Gejl2OGdjZnc3OWlKczNsSEIzVE9ENHRFTHBKV1dTZTZqbEdnenV1U1RJeHJ4b2l3bW96Mk9nVEg4Q0d6dFpsRllHMVRVVUVzRTNCUlZsdUc2K0QxeTdQSFZlLzBIQkRmaUFuUlZkbDF5WHNsUUQvNDdIWVlBZW8zaEZHOVFnenN2T00rYno1ZWNiR3MxSFZEUXc5V2J5V3JPajgzS0ZYM3FIN3RRckdHNHFqQ1dDWEJQTXlvNDFqN1dNdGNxT1hsRWJIeGt6OC9Tcmx2WEJ5dTZFNGZVOUZwK2U0RzFpZkI1Y1o3dnFtS0MyTTZnWm1lTzh0ODEzek8rYisyNUVyYjdYZkRXQUdEaWxyTitqSll1VUtLR1hQYjNaVklQdU8xOHBvZTJNQ1Y1REwrOG9XNnlRRjlXc3l5M2JQbDIyQXd4R01GUDJZeTZPWG81a0dUckhnOE5LTmkyVzdTa1M3a3NEUVVtdUtTUGZYM0hOUDJqNW5iR203SG1HbzJLZ0VpYXhXcnJucXhBSWNQODlOMmRVV0g2THBJOVl1NXRkYnc0cWc2bHJneHMzSFFRaXV1ZGxlY1pMWW9WU3ppWEkzcUpOMjhxWWdsL3VkTGRwSkl2VnBNaXQyaHlvMjFDUFIwU25hOUtXeEpYcXFJU0pXbFZ5Nk1WVjdYZG5QaGhHL2R0SHdlODI0M2ZwSDdybVBiUjh6ZGh3amlqRlViSFNDUkZaTGRJNE9NZDRKYUZ2Y0VpSnRJc1MrR2paNEZmU2Z5M00wTmpja3RqcC9HY0FNN05sNDBWN3ZrYnVXcmExbDJnMklJakR1cnErTVdYeUFNWEphZm5tMXNtbjFRbnVFL2VMWXV0QVE1dHhlRm4vTHZ2RkVFaysxR3FGbTdyWlJ4RnpSRklYc0VnbTYzbzlqUU1LZDRvQ1owbTl4QjhJNTJRM256MXgzN2dQdUFoY3JxK3MrWjE4L3JMbFNFNFUvWS95czB1d1Z0SjgxSWRuRGZOSXovcFFpM3M4Yi80ZFNwalNMWVpYb0gweTFzemU1NUtXdThDTCtJbEhhTkJKN3pGS3M1TVJTRXRLUzFHOGF6RGduUkRRdU9MenFLcUh2QkoxaWMzQ2FwaGpqRUV5QlNJb3dRM21ERUpWRkpEa3prMnlSS2hHM2lVVUl5K2h6TG1qR0lJSnpJb0kxd0hBK2FHY1hRcVYyVEYwNXE0YUhKUk1LY1JuNEJpaFcwN2I0N3d3b1NtekR4UnZsdHF2RWtvMmpwSWY1QjlMT25sdXVmVmIwbmlON2J4YkdmUlVkT2hJYlludzVLcEpFWGV3K3pFNTZKZGx6S1AzNW5iUVNXbGo3WXViL3o5aGQ5VS9adWY5ZlBIMWE1LzM2NUhlajd4R01TajgzdmtqNmVwSDBGdnhxUDlFQlVsZlgrQ2wrZzNoOHExWU9Wc25iMHNyMGI0c3NOUXBvUTJWTlEwNHdKVmUwcElDRUpxaEdUS2FDc0FxK3lpR2ZSOVdNR25DVFNiZ3c2QitwbGVsL0t6aDhKU3JRZ0VVYkxyK3BIMmw1NkV1YncrNHJOV0xPU3h5ckVuUnpRc1VxSUpYeXFPWnJtblRuMUdCakJTa3A0c3ZIdzk2ZzlxMlhzYTJkcjJOYnQ5M2xocCt3OGJJTE4zYk96SEZ3emg5ZnpvZWNXV3RvYWJ2Y1FEb3p2MFNTdWx6VDNMcGVSNVp5dFNiR2YrUzVRR25LSVJ6eFBzdGVzTS9UM0hGdzQxc1lsZFpVZzZPWnVVcnlTbEsyb1E0a1k4UUM2bThoMmhhNEZDdTBLYjlTOW5aVzNacmJyNWE5WWh2QXhtZktmTFNScFRuYWFIdEs1YjhOdHMxK2k4ZS90YXVIMld6UXRxdnBQQ0JDMkJZbUtPMlRCY3JuTy8yLzkzM2RNbHZSL3M5RjI4UUNvZjF2b2VKa0IrbGJYMy9najhrT0hVOFo3UzdxKzh1MWJQbjhBd3VyMGFJQ3VkWHFtSGM5NzUrckgyZ3crWmJtZDRvTDVTN1gwVitQdGlkWmpTVEZCY2h1MTVtWjF3K3h3VGszTDR6bjNDa0ZEOVhDVFNjdmxhaGwzZEhSditPdWFxV09FL2lxV05zbFFKTk04cUJlMHVrZ3Z3b05wbEc0aHRIWlRqc3l5clh2cGlwb0xXRlBCYWFsYisyRVBHZHA0Ui90SktOdHVQajNhbmJnc3lIWE0yVXJLMUVzYkxQcHJsUGVzeGhkT3o4MlByamQ1Q0ZuZ1N5ejBNUkJKcHZhTEk4dXU2Y1p1M0RtbThneUN4elRoOEh0SlhnLyt4amRaMDU1dTgybTJNeVZxTklWMXpOREl5NktsZnMzNHFzWTR3NW9PMWU3Q3c1SUcza2RLMmVrclpWbFFMU2psNHpMd0tZcWFJMjhvNklOdEw2cjlSKzlScmxRVHhtV25IK0ZacEpSdUthUlRidGpKdGhLRFhmSlQxbGlCaFIzM2oyOTF2RUdlNWIrYTYya0ZKVUlrYlRLZSttcnBKL1BmbkFVb2R2bEhaOW9pM0ZubUpkaCtHZy9qQ2xPSGg3R2prSXZGeDJWUGlqUTlWRjZaWjMvZHdMRXBXeXRoUDVyZGpyeG54dkZ0U21EQkt5VmN4L09YbExTZ3J1ZmRHam9vNE9xUTJzTUc5S3lOd21jVHN3eFp5Ymg1UHU2ZVJPaWhPZlNrYnV0YjF5SGltUG40QytMdUtFeXN6c1NjY202V3NINGJvaU5TUVd5Vk4wdXRTUFlhNm0yQVRmWEdjQzB4OHVIVnZIdUZtNGp5c3ZRUjNVN1pmLzlrUzUzTmxVa3NlR2NzenJYaWFIS3ZSRU41anN3MUxpekRra09zd2cxcmdNRHdyOGVxODUxakZmalMvbCtjaEVZTUloR0M0K0pGaVcyaXZMUXRMQkhxTVY2Tmp5b1BJMHU2cHYvSmdmMEw0WWFzZE1wNHRNeXl2TituTlV6elpNbEU5VDdJN2FpZTJxWVgxMzBLK0hiUjVxMEw5QXhrQm9aRmt0OGJBQXhoU3lMQm1CbG5oWVJIVVZjcG8zdmhtSlVTcit6azd0aGY4eGlVSkQ2SHNPS2FZNUkvaFZFZ3N6TnZzSGhSQ2RITjhPQjJHa3pvdHhsYll4azRYMFAyWXZPM3BwT2hjSG5aVHdRRnpXOWcrV0lPcGNsTU9LdTBKZ2xBNTVrNGVCczVCWTdNRyt2MVdQa0ZqT3dIMFFTMGtIaXh0U3czaEU2Qmt6dEZFUFhZQ0pvV2NkTm9oRDh4UnRFMUZtV2NKdC9mZzNHTkVxaEtucmdjenR6dUVoYllLMVlsWm1FdWRiVjVhL0JPdWtQSlpLdkxBNS9jVEQvbVlSc05NdHEzeG5ONzNER2xJcEdiWmFJNisvTkNJMG5TRVR2RUtWMkxPMUY2VGpjWU9WbERQYnBDb1h5d0FETXAvOEEwOTJzTHh3aVNLV1doTVVMY3lVaTZxOEkxK0I2ckhLcmVOd0FiR3hvZ2crY0tFYnQ4THVlQWt5d2dtNUVLMi9lL29jZU41ZTVKL1pFdmk2aXM3RnpSZUVtOEtiRzhmSXNwem9pa0RscUJwSDdEdnFoazZlajdOUzQ0aEpTSGhrWjFMU0c3M2pTM1pIWDhRT2NvbXFhWkZiUUZoQkpyZkdDdUZxY1RCKzZ6N1JMYVkvQVZ5L2FKNTlDWDNFY0FWZ0JSMUhzb2FtTStKaVJGeEExdENJYVd6UXloY2dJcVYrdTNqcXdQaS9yWDJRVTR2V0hsSWRLc3RiNEFBY3ZWK2dUK3hSTUtESWxYZm1pcERJYS9NSEhKYkVqd2l0djFCQi9Ha2o1bEZuaDczaEJxRkNEWTNlNWtwS3UvTk0vdlN2S0syZFF6blFzNDZqNThLd1RWOURhQ25pMWFiaDhwTHk5cWIwVmJER0lxZm9lRUZRUTlJejNyTHVnK3lVWVhtM01sUHlhcCtDM2tWZnJ3T21vbVZLMmc5K0Mra2Z3SDV0NTNqOXJ1RnY0aktCOGhhSFdOOWtLcnVRYTU3QUMwK1hzd1pUSFQ1TFZMWW1ZcWw5ZU1DOXgzYkYzckl6L2RqYVNmMjZsNW5neHdTcU5iMUkxMGV5cXF6ZVBKNjdOUXIzRmRlL3hNZEFZRWNHNWpmc0JjL0w5dWJRTjFFejgxa3JyYmhaZVhTYi9NckNQRmJaaGFLcnI2U0pnYnlyN0g4b1A1S2Iydkh5MUJ2bDEzS2hlMTdBVnlwd1I4TW5Ba0kvaGcrN0l6dHlWTGh5ZUVGT1AxMHdkU3RVQjdWK3RzK3c2ZXhPcTFmQzlKYXNsRlAvWStiL1ZldjN2RTFUb2EySXp1RmtmbFZpdkdpd1hDVnFJeTQ0YmJzQjVURHp1enU1ZTBQTnRFc1N5ZlIrdUFCa2RVTU8yL3QzZk94VVBFT2F1elA4V3ExOE1EQWN1QjViL0M3b25xMExBNStaT1RncFBpaDlJRUU0NHZMZmFNWGwxbHo0V3ErOEQ1UU1md3orZ0hQQVdla1hWZDRERGdJU2ZyZDU5MU1nazRGM3dPR2dZc0l4MG1aZjV0SUs5VWdWOWtTbWkxcDIvQi9XTzRqKzFESGg5cStadUVqTEkyVXFDMXRzNVN1aVFha1JZZ2VsaVpyYmRRbHJlQmFkazB6U3hIemxEQUF0ZTRxREozK09nemk4dzkyRWU0bHIxejFPSy9yMjZFZnR6TmpYTkxRNzhvSEUyUmhPUlZYRDE1akgvMmpqRVUrTGRiZDZDNWdJZkF3c2lESmVnbjZUeVhlQWY4VEp3YmZUSnVTYUZmNGlxb1YwV2FPUGY4bjlEOVh5bDgxZjlUdk0rY0FKVVorK2hra0ZlaGpWdE5CazQ2d0loc2R2eVdjMVdodmpENG1hd24rOVpKUDY4M2hhOXdHcVJtbDFxaDQvbVU4SWZqUzRsRy9MOEE1M2c3cGJ3Q0tWU0g2cmhGTGJleXNVd29zRml6bERyWXZCWjNLbTcwRkpmdEpUdVlQbkxteG5JeFliWWRDMVNnNzJ6OTB4V0ZxNjN5aXNvZ08zaDBaTmJsYnlMcy9Gd2xvYUFtd1hzZEtRbzFLMU1yN0UzU3NHajc3Z3g2YitPUXR1anROWUpQRGZUeE5rYVF2ZU05ZXlLUXhqNDlDUzZnYU8yREdweWNxY0JGbnlsRGRsMnBlUzh2TUxaWWd3bkN0NEQ3R2YxTFZFNUN2ajN2TGZLR3g3blB5U3BZcTFHNnlSWDRjTnErTitUTGlnZmVTZ2lWM056YVJWRnRVV1hYdjIxc2JERVFNZWpMNjdQRmxGSDVTRm5QMlZtRXVITEZzdUxsYWFaOHNzUXJqcDNNVlBlY0tCRERCSTJtWnRMQUlpQWg5cE0yNDVML2dCSXRXR0FWWnVTQjJQeExGYjFrZ1BIZzBNM1JTendsd2FBR3A2V2dyQjVWdnB6cC9mejM2VUdZZ096MENQT3plcmQyYzdrN1htMWlxamZBd1ZqSkZlVk9nT0NoRldxY2RLWVVVcVFiVVVJYXNRd3M0elZFWm9hUUJCcjFrTW9YVEYzZm9IQjhOL1BwcHhGbmZvcjZUMXVRbng0YXJLeGxWZEpvNGRGQ2hzbGFUaWRUSysxODlCRXFra3dURTdXZndoUHUvSm9hZHBsMURBekw3TWhhODBvVFhkdkdPeHc2Y290a2VrTXhKMElmWW5SdEk5UGM0ZUNPdVhMb1VjZFJMV0grcjMzdEhuZEZsSkh4b21jM0JnOWFRU3ZKdUVCMUlKN0R2SmJIL1ZuLzhoanY0b1dPaGVaWHVSeVdTeDc4dmYxMHpDekkxTDFWbGIwY1dQVTl4TjdGeThQcGJScitXclZFYlFHTk9MVGxsRmxwUjQ3SndyOUFPbW1kbUh1c0YvY3NvUmREWGlhdGR4djNVVlg5aWpwcGNYZGZLbGVOTVcySVJNUDArK3hUV1U0M1lvNi9qandKcXhFS0hGLzZrV1o3K1BGMEpNclNqNCtwL3NvUHdkSG52NWdGazdyM1JUUFRycFlSRDArMGFyS3F5ZmJYbmhsTnlxN0ZkOHRScU5XTFVnb2VpL1F0NldlbnoxZFNVblB3WUtzb2V0S1ozZy8vQWNHY1c4YitJUWZqUU43dUl5Z1hJV2QxamQ1Q3ZqQWFtZHFudVZTZHJiN2JEbHIyUzdWTGZXM3p2QUk4MC9iNFd0NmxzN2lTejFFdnYwNjYrZCtXcVpiUFBoOTNaMDRLTkt2TU1odHJycWVORFBtbXcwTGxxclk1R0s0SjU0SXorMDlhUlY2azFENENlcVYzN3JXSkxmV2xUTUZzSkQ3cHhMeXYyaDgwcmdqN2FOVTRibVdHMG1Ib2s2MTFVUlhRUnd4VlAyT00zZ2ZNbmdOSnE1ckpOc2pvK1JnV2pYTEZobk96NWhZd3NvSTJ5V1EzdVF6QWxTK2llVGRYcE0yY25jLzEyTHlXc3RXYW9ldGd0OFVBS3orRXpia1UwVlBlTGFpb0dVN1Y5RjllZlBMLzNycDhiM0lkdm1LMFZ5SituMmF3WFJqZ09jYXVkRlFwL1NzUzRlNzRhbnlld3MvQU9OWFdqZGE1ZGE2Y3liaXFxZUJmaWJ3RnViWUlpUDVHZU1mS0I4MDFpL2s5c3Z6dHdaT2FsaXpQakV3UFZrRDRwM2szNEthSG1xWFRvdGJBY2tzbkFLQ1k5MEFLL2dYREZ3UkI2TlcvZ2FNMmxxejNFWnZ6c1NzcGhDSmhRci9pdUxxY2xJdzhrb1ZXMlNrSUtObnp4QklxaThxdjU1WEpXK2VKMm9rVEtxNjBZSjVMQS9ObDAvT2Y3UUFsWlNVa3BLVTFKZXpKdlhLVjJsOTZ4d3MxaGdBMFVlQjBjVmJnWEpqb3o2eTNJM1AwVDIzeFM5bWVyOUJtVXNNcDMxOG5DZFdMT0FjWktTOWxPRG1EaEplejJZb1NiMTlvVHVXQ05nL1A0aUs2Ky90NStkdUFzYXNweDlxa2ZTN1Fvd2V3Nk5MSmwwQ1NrTEpVUmxidG5Wc3pvdmpDNjB3YXlLR2RTRGNJUFlxcG1Tcm9hN3c0Wi9aQXhrTE1BU2tEYW0rYnBIRzZQTUo3SXhOb2Rjdm80cVNVL1orVGFsU21TR25BRmNXQmZhSWZGL2lmSzhGY2haVURPY2p2QWZJWmZWaDVLU2tnTld3NjFZY1VZOThkVUVZcko2LzFQQTZGeDYzRnQ0aVNheVNRclBUZEZpdDBiNnU3U2JuWXJ5NUtWSDBleXVodG1rUVRWT29kbHFXK0JxeGM1T2lhdFpzdlBaMnVuUHZvT0t5M3VhY3FDVUdKZzV6cVRycWJETmlmbVpWd28wSUZtYWNORkpUVHJ1L3pMcVA1NkZzZ1FMdHl6TFBsY08veU1McTFiNWRYMlBGYkgxTTMzNGU2MXUvbitYVzNZTGRMaHB4SkdRRlZVL25LVGlKQ055eTA1UGlvOUt6MGg4TnZSN2FPRnJMNlNZWjRFdzl1T1RpeGwxeTFId0Z4YW0zSXVXZWZWdDdQTENqZU5JMklJOU9jc3pJc3d1dHlhb0loVG8zZzNMS1Fsclp5YkVsRlZaRGFBcThJVHlzMW9RY21XZm1UcXFrMDRKcXJhS3VmRkZXVVBtc3VlbWJiUlRnZWYyVWcyaE1hTVlNMlZqNytPaG05V0hMY05tbTBBYmtSdkd4Z2NhMy9jYjk0SmorbUJiQmhTcEY4VVN6ZzRTdkE4d0QzSlNqclJBQmFnN3A4ZGxsZTd6N1c5ZldGNE9iakdNanpuWUExckhXQ2JIb0xramtic1ZHeVNRcU1JZVkzSjJWeDVwMjliSWdKa1hYb0VaMG9TckU0TFNKMzdBbjBGTUQvaWV1TDZLQkxRWG95cDBxaG9UQ3NmR000akxyUVZlS2NRTTV2Tm9rakZ5dEYwWXd6d1RpQk5MMXpkT2wxcGFsbDNSZ1F3bVp1R1FzUjh0THc2b1lCK1BEWUpvdjkxdXVCOGYxeDdRc2pUVXFpVTBvTFU4MUFLZmwrM012ZGJyYVJhVWhSdFRqcjFUY3JGeEFoZVFRazdnNXBYbUxHTHc1TVlsVmo1clFoYWhxa1ZoVGlJajhrSWhZWnBDU3BITmlqTE5ETEdHQUN4eGc5Wmtpa1A3bEJqRXRGZG5WZkc4eXZ0QW5oZGlpN2FaaFYweUVMY0lnSHBZQ3E5TDQ5T1RFcEZ6Mkh2LysxdUc2SUdYS20zcStoamNqN3BiY0RlcVg2NUZ2bG1jUEtaZDdydWJTb3FESVU3czFuRGlJSXlaQ3IwdmE5eFE2ZUUxYlJGZGZ0aGRzcjVGYlFzOVBqWTB1THJYaG95a21EYUhobGFZaDVGb1RTcmg1STgzRkllYmRVaW9ZYXltd0tFMWdNWk82NVVCQnlxUTM1VUt0OVQyMHluc0pNRGtxNXNEamdMZFRHcE9mUm1lVWxGa05vbDFkVm1sS0Rxa3piZTVmeHRSMGp3OThETXp5ODJmYndBSDAvMDNqYjBrREQ4d3Y5ZVBlUGhuRmV5OSt6bmhsRXFUblZJZUZYb2RIWC96UmtIZHFiaWI1OUl1bTBkN2xETi9iVldWSzU1MS9vZlBzTjNMWnE2aml1ZjlLOC84YnYxQUJTRGlickdVRHJMWk5vUk40MUlSV2Zaa2V2bHEydHZ6dVNtYXJ0MnN0eFY4SlZTSm91OXBWbXNKS1RrckpLVDNnMzkrNnRUNlRlc2s3OG53TmQ2VU5iSE1SVXg3cVdNcklUNDJOeTZtdzQ2SXBwZzFoNFZXbTVPQTZFMnE0UlNQTk5hUWNySnU2SDhtRmxqdk1rbGdFaTBuSG5DcHVaaXFSbEQ3alZIRzk2dXFkVCtVMU5idWNXWjlXK1FxOWhlNEFuWHZhYk1GUFdzNThmdXZ1MHJTOEdDMmgyWTlRVFdFd3VmZko2cGpKR2xqS2VHcU9UVk1GZ0loYWEweTVrR2FuZXJhZzVWejU2SktYckxCZFlsK1N3RE5GYysrc0U3dktOMXAycDNiWTJ5MlMrNFQ2M2ozL2FPdVJoblJNRVY2ZzUvc0ZSVVdHcTg4MXgzNzlwcVJqSmxWZnJXS0x4MjdGMWdzYUNXbk1hUWd3ZU9mN2YxK3NGcnBiMlZDNWt4WDllQlh3SWJvOHV6Y1MxYVBsQjJzZ1FBYzBkcnVSZ0xDempSa0VNcnZydkpKRDZpREVnd3N4b3EyUFJJT3NHSWpiZk5WZzllOGFJUTRKeUpndHhUQlZiNXhuZ0QzdUpPaDhpUDNsZ2xCRExNN2pYWVVaaXN5ZVJhS3REUlcwbGUrUkQrVlUrMVl4WHJJeERwWitVcXJmWnExL0RkMEJYY3p5YzB4VjdwQjhUMWxieDhEYUdTMWxndnJva1dSaWxteG1VUWJmODc1Z1pGWUxoeW9WYUo1UkxybG43YXZNVmNOYXFXZDRJRXhOakttYUtjWWNUVjhaMWhudkNKUnBsQWpOQWpKUUZNa2dZcW1iSFFVVnBPR1Z2aFlKYW12dDB5TUFRSHdFT2I4NHhBQkZ5Zmt2QjIxZ282WFdDRE1kelg4aGdrc2VncGhsTHJXTGpsaW9DMVVPWGdvWTA4VHZENFdDTk9TT2hod0FXbklhR0UzVTBOK0FqUU9vdmkzd3BRQW1pSUZaNFNoampmeUE0YVd5VGhnbTJaZUdQdEJ4Y1lBU0FwemJtVzI2aTMrM2Vib1VHZk1Ubzdma0YxSVoyUXlIWnpaZm14VUp3RlByazR4OUNqVk5jcWkxdVNiWUVHeXRuSVp0am9zZmxoS0ZER0pHWmtsMDljQ1BkNWdQNlFndWpWQkVROFgzMGFSd1k1NmY1RndsQ3dPc3BZR1M3VHBrVklLNEptMEYrMTlVYnhnOU9VbHB2ODE1WC9XM2dBS3RUbFVOLzB6aTkvWUxvQU1ZQ3lDL0g0RjlEOUJVckF3QXNzbXBCVUEwV0EwVEhyTFhjQWV6dUgvVDFJNnNVcUFDOHFDMkQ0YytOL3VRRDRmSzcyQTV1dGszVEttUFlzSi9ycFdLNWJMQ0JYbTRsU2FRaUdQcTNNbEVwK1hiZTdKYTBKRCs1ZVQ3OTlwdlkxdTRPcWZQNGYwNFU4MGJRV0Z6T3BnOXhYL1BFV1o3eThvUlVrclpiZ2FraHB6SFlodTQzQlpuaWhKcnkzUGdJbVdxOGtIdVVhNzFYdGUzYjlDRVl4cERSTUhOaWFkbUVVRmVkeGhhUDFmQWZJUzFhUkhIVkZjaUtXeXY0cGo4algxUzF3bi9uOXpDc3YrZkRacHo2OHN0dFhrVmRBamJ4WjJPZGhEbHdkeU0vRnV2ZGpubEFZMGY0NFdrUE45aHVTRGRUVlhpUitOdC95bSs2M21CN0NQRDh3cncxYnJsVzdQaDIrWHFJU2dROElSTDNiVStZUjlJemk1eVlqMXhhcDNaemR5M1Znb1EyVzViZGZSd21WUGtDZG1jcXJacEI5Wkp2bDJ2SXZFK0dkRk5DRkFvYkVNT0VtUFFKa3BRUmovWldKT2RMR2pKbEJNd0FMWlgxLzBNaWxTcGk3M2xiZjVTYmJNSDNsMGh6Q2lVNFBpYWZ1NGl1Z0drVndJN3JnSW5kbEQ5QkIybHRuSTdrVHc3WVNERll3VGtsdU5yMzN2eFVhSk1acVBvTW5zcGNKNlFOYy8yajhLSW5Jc3FvYXpsMjYweExkTHJPbTdaN2lOVGo3aWZuSGpvcmQwZlhkb3FDblB6SnRDSS9ydFFrMHA0QWRuM0hocnNtTXdIclZqQjlWNnZCMS9rR0svV1drbmRmZVVaS2JjVFg2UjBjOVpuSGpOOGU2UDUzb1p1NGxtZG5FQ2V4MTFZUkdiYWhiWVh1MlI1WHk4dWVBd3RoRFg1RkhHQ0pxaVF4cm15QUJtTkt1SjZMN01QUC9ZN0JiaXdYajJlY2ZEM3FpenBSeTJDb0ZuU0hVUkpGMkZUa1BvZ0JFSEk0V0I2WnM2VFF3U0J3MnRXemxIbkdFbmdCek1yeVVuajhJZzg1UllqQzhnLzhneUNZR1NyYSsvc3UxZE9DTDBEaVdWVG1JTElIQmVCNjdNWndza3RKdjJ3Myt1QkM2T1lCWkJBZVRwazZxNzdYVDhSeDd5S0VPb1lsbGZQQWt4ZElvOHFKUEpkdGxxSkt3OGU5UXI0Zm5uZWd4RmM2T2lnUEQ1dWozWFR0S1JmTXBzY2lCRndWbCtTYjJVZEh6N1ZlaUJMZkhmSzVNSXBSbmY3SkprRjk2U0ZuTi8vLzNVUEtXN0R3ZWFFVURNbW5laE9rWUhaWWVXVzM4dXphNFRTOTBYU1I4ZCtkY0daSWZnTVR6RlV4eDRtZTl0UnBGbWNVQko3T2pHcHdMTVBUTlE3cWNnWkZMOHpPNlZhbGdRWEJoVEp3NFpHZGFKODVKcVE3Vml6dk9ROENLcUh1TmEreGp4THpMclM3Z3NTSFJhUHM3Vm0ra2dZLzEyNUd5SjhNam1LcEFmNTBRa25KaHNONFk5eGJJQTVSb0JKcy9aZW5kU3QzVmF5WmRLNGEzM1lIdzBHZWd6NTNSd3FxcXJXRUxWLzlKK3lqdWJNV2pQNUIrT3pSVWUyNWpaMXNLTmRIRnNKa3Rya3ZhdUhUV000MisrdEMzUGpCdm5LZUFSZXpmSjFHMjlYU1IrVWlnZWF1eWE3bzlQc1NqbS9xUTZYTXhoLzlOSDF1OTArcitYNWwyMHhra0lXdGlZM0VienkzTGxISHNuSUZxSGY1WjZtOW9WYWNZaFNOS1ljSVpURWNCVmdKbUR6UjM0TnU5aTdETjRVQVlrNEhLNjhTSkk2djNaTzMwUnliUHRzTjUyaEQ2OXU0bTljOUYzbzJRaDRaSGFiNFQ1UjlJWjZPRVJVQmN6cTlERVkxd1dGdmNzT3R6M3NTaWRBMzNUVTczWlRubnM0WGJXckZVbXFjeGl2Uitsak1YaitTd204RVh3Q1FXdXJ1MmZaUU9WWE53amZ1S0hSU0ZkWEpGSWZoekJNQ0REcEZQM2x5SlNjcW56SytZQ2I1ejg5aWRkSVlpaktzaEdId1FDbzkrZkd3eGNJTkJxQjBLZGk2cDV6ZHk4N05xSEt5UmVZdSs4ZVR4bUc5TWc4YldSdHB1TzRJNDB0aWlKR085VUlHQlBQbWdULzQyOHQwRi91Ni9zdnRMdWdlM1ZlL1YxL1I2NlBYTFRsd3llZmgvWC8zTDRZMUlkR2VUTmVLVU1DaHNNNXc4Nm5NL1ZYa0tEVlZ5NFBPdk1tZnlZQ0FabDhvaXlhd2VqalowM2lvN05ZYm9UUVY0aHNNRHUrcmM1aEswUXJZMVlJNDVBNThSd1RkOU5tbUFqMEs2alFSZkVzejdsN2xKeVRHSUpaZllXTVlBS1p6VCt3L2dla3cwMG5IcWlBZEp5MDdXSSt0eiticUtvcXluSjl3ZDRURzBoNnlPRVdvdUs5aVNpM09kZm5KRUpGWkZ1MlZPd0prTEJ0T1pZcldoeTdpVXRIb3FzS2JlNzhBV2xDR1ExdG9vSWFaSFQyRDVHVGRFeCs0M0ZJbkZKTHBYM3MyTFFHOEFldytrd1AvdmtDTytjV08yMWpqamZBL2VhODljTGcyV2Iram5mR2tCWWZUUVFCTXprZEtWWnpEZDNTZldiSFRsczJEVG54UlkzSGFZOC83dUtyWjg4bFZvRmY3SStLaFQyamtuWHVQbS9UcWhJQWp1cVRXVE5ZTTQ5NlNFSHZpK0lVWlZzM1I2SGtwV3F1UFVpNEFRR2FrNG9MTWRuYThuRU9vYmdwdXp0a3BzdU04MGxRMExYSU5rbDU1R3NsMzFrWTlSQ1NiV1BOWTB5MlJaYmcvVzdYQ3VIejhld0themdOWlVTcndFaW5ENGhPVVhodjdNTm00RUwzQ1VUZ0dkSEhVY3RIcjE2Vkk0MndPajJWR004QncrS2xRY1o3blNXbTk5T01QbkpGS2ZDZkl3LzQybEIwKy8xWmJOQ21EaWpwbkF6Vng2akl3QVJ0QTBjczM1Zk5pc0R4YXBaL1JOOTlPRmh6Y04wTHJMSFlyK0pJYWc1YzdPeFNUY1o0SVdCV0ZSSmJaRnRXRW1rSU5WNlN6QXFod3ZoeVdZQTIxUGNtREk0QWtHbmJsVGVqYkpZSjRabkpPV0lnSjZwNWRLV21WMUJjRWlaUW82TE04MVRLTk1WK3RWS3RPYnQ3ekxDNHNabWVHUGJobTJiTGN5V3pUTXJOa2xzM3U5VHFIc3hOMkxiNDVLVnVpb2hIa3ZrN01lRlk5WEJvVE80S2tRUmpEbGExVEJSUTUrdDZNTmozNWNhSFRPdmhoMGw3dmVsMHZTNENLVVN1V1Z6NXJOTXFSRkJYc1ZqWXp6cWZOZUF6K21XZXVidnZyTE5ILzkzTW1udzJablJ2T3A5TWJNOCtvWDgxY29oRHhPSnB5VXlJU210VkZ5N1V1WTZHcUExR3d2U0dXTXIzUTNLNmp1M09aTm9lSzRJQ3VJT0E2UzVwamlFOGNTNVVDaUY4QkZFQkNpMHhjV09FTlNzZUs3RWdwVHlNQWFMRE8wWlhLby9qL0tmQ1VPL2tXZ0t2MXJ3RFFobktKTmtkVzZmd1FKdDNTMmxYbnEwRm84RklHTWJQa1hkb3dPWWl1RnMrajhKSTVJRkpDUlRDaGRxa2lQeFFpUXpVTDNrNlh0bWh1RDNSYVZKVTNuRTNYeGFjdkFDcDc5NjBVd3BGbVp2ckJ3QXZaWkJsemZCNzNnZVhmaDgvQlFiSW02amN2V3VtQkxsWkYyZE8wYU5OS29zM1V0bjFlRUhMdHZHSjJyQVp1Nk5IcHk0aFg1WENUd2lHZHpWUlh5bmgxclBXbGZ1Z2dtd3VPQmxFa1A2N0NyUmlwMHpjRnAvVWRnRnJQWllqMm5WcEh1bTBhMzRwTW1IeGxaUEl0RGE2ZUx2d3FwUEtjaHNiZm1rRFpHYzJrMUpXbEFRNEdLMnJIVHdKblRDcnNZTzZCVHBoVC9oeVowZXF3YzJlQ2RuQyt1K1pnZU94U0FpcVlqenFwNklJM1ZMd3FBejNDRmMrOGphVDVsRVR4aU1HcndoVjJNYWNMemJsSm9ta1NxRnJYQkRIcjRua21KaE5JTVF6aDdVckhPWVZ2WlBBUm52T1dlQ0dZOVltTzdmSjl1VFNTellyNFpuQnZoU3UyVzd0c3hzVEdtSXFLT3hXa0c3WERIZ3Z6c2NBVnlhVGNLV2Vhdzlpc2NoN1lqaWJSVndkVURnMjd1bW40NUVjU1RDWEdLZkFyei9FRHhDa2xTa2JBVk5GTVh3UUd1Yyt6MjR2MW5Rcjh4eU1ZUFkvQUQ0NnFuUENZV2NrdlJaUHlCUXU1QTNTa0dwYlQ3RjhwREhzbGhFZlk4amwrNVA2Y2VLaVYxS2dYcWhLMHhKQ0NaOFptU2s3cE0vSHNZeHFxYlBXTFdETGQyb1hIUUovcFVBQ2t6TVk0cmYwRVNBdml6MjBsLzhnUmVMRHgweW92WExqRVI5bFJteWNJTnpCeWwyTVZKc3ZxdGc4Ris0am11bnhqaitmeEdOSndLWEI4QW45RXJMUFBFUlhSYW84T3N4RHBkMTIxSW4xMXZqQXFsS0tqelFJYlorN25GZ2dzNGxNNVI3OTBSd3lEL3lwOG4yNEZ1RHBGM0NRV3RuRTFScHpianRLcVpENWNVWUx1OXdKdDJjdTZFV0JKZzZ1L0Z6TG1aSVJubkNHSXIvSFpLbGpVY2dPamlMdDViRWp6Tm5Ud0ZrL3NyUHFBV2VNME1GajBEUzlWMkFBRUFDTzU5N01lakhjTjhIdWYvMmtqcmZPdDM2OS9RZVdmZThYQi85UDU2dWJuczRyQWtNRlZnbk03UDgzU0hrT2hvZ0ZWRVRmN3VtcmZjWHFuQUdrZ2RuTnRKTjJIdTVaTGNzQzBFdkpkUXV6WC9KWTd2QWI0MzBkdnJhRXdjUytzTnJQOFlkNmhaei9nRkJwQ0JzdW9RNEZyZ1QyN1FJaGptcTdJSS83RStTbjBxSGR0VE1uMFhDZUF2TDNJVWRlY1QvUXZqREY5UVhPM2UydFEyQ3hUblFtRW1oT0krV0VacGYraWZHaEFJanB4TFN1MEw3S0Q3dERZV1Q1dEJmSlhGVVBjZXNSRlYxUWo5RE9iSjFUQTh6M0owSGVlQTdhMWpWaXRoU3NNVC9rMGpIbkdKc3EvOWJCWnRVN3pINGs3cnhsY0hpOFk4MDhuS1dLK3luRFhnWHVZNzI5WHo2c3VZcVZRbnFNaWQyWUkwZW9BdlBSVE9saGt5QTdRNlhXRkhOcjZtMGhjVEtkRWgvU25sOWtqV1ZxV1VqdVdWZWF0YStyMXNyc2tUZWhiN0FmeXVta2E1MGVlamQ1SEVEOEJGSFJuYzQrOHRzc0t6Tk5EdlY3N1ZOSmlldnFVWjhkdEhNS0JzTUlRUjlELzBBL2RKSHpQZXlrWldZYWlmMzg4aldkZkRVckpLMnhSNUhrUWVxZ01QelRCUkdaT1JNYVR0NEpBd2dmQ0pPQk9aWkJhMks0VE9HV3FoN1Z2UDRFRGcwSUFaSDN6dllaN3p1QklXUWdQQ0NNSVBScTVoMWRyYllvVkxMeE1IdTZoZlhQYmZSbmlJb3VkTHFIRkpVcGZDNDNwTy9HMFRYN2FCbDNUTFRhU05qK0Y2eTJXT0pjdTIvMXQxTjZLclVmdDN0ekVyTkh5WVFaWVk2Wk1qMW1USml2T0VOSTdPV24vU3JIdEZ5VG16YlBPZmduK3MvOUQvV3YvNytrRWJmNk45VkowNWNJR0V5VmJBVjIvWTBpbkdRS0F6aXBwSVNubjNJY0xpSWtPUzVadFBYNlJSdzFQYjFJb0VRSVh5U1JGVm9YS1ZqaGNHRUExWU04amdBZnJjV0xDQWJ0bkNIS1NWRVd0aDZXT2RoNlZ1Ym1WbjhUVW9KRUxFelJvdENsZ0tpcThuSFcwc21JMFdUYmFKWW1IcklkaFV1WjNMUHRNTytRTWJhbVpHY0xwVXBKdHpUVHBrcTcwaTRUMWF5dFNpd2NLdHBJNDhNUmpBM3NLaTVKcFV4b3d3dzBrUjhaSDVYSnRqKzJiRDk1TnA5ZWJTUkI3NHlTaWpHYXlWeEZsWTg2NjJvS0sxMFZuaTFtY3hoaDNZaTFqTkt2UVRRWlRXQVg1VTJwRE5FUk9LTXhUZWx1blJoVUd6dExob1NPazFHeDByYlFQUG1UTXlUU256UjFycjNOMlRqaHlkQk5pcVNZb3lCMEp0UWlmUUlIanl1K1hWWHZnbnRuMW1QNVR1OCtwUUNybm1yekszK1N6ZWlUazQ4ckV3N05TanE2Sko2L0V2WXU4U3VadU5Vd05zdUszYXlZcFV2MEZBVjlXaUpxWWhJNXVVQ2JOVU9kN3lnYU9HT0pHSE5XK0dqQ0JqU2hROVlpRDBVaGd4VzJSeFBVUlN4U1Z4VFlSUkhRVXBGLzIrRFg2c2EzUVl0WUc1ODZaeEhxTHZncUgxZEpyTFM4UytOVmNNc3pOeDY1M3NVOWQ4SXRzekNwY1UzSVFpZkdKYm1qQ3lwdVFNWmRFRndweERnUnNSeWpJb2Zvd1Q0RVl4ZEFsM1ArRDF0L3dsbi9pL1gxUDlMR1lsV0t6S2FXdW1xZkI3ckNNN1pVNlNueUM1aFRHcHNwejZRR0V2TnE4QURoUXQzWDBvYUtQb0Y2VmVXcnNoaHViU1BQMjhXNDZoVktuOERYTDdZOWtzMlNOMzR6WTIvSUJFb0hub0kvOXgxNCt6NFA3TUEzZ0hQN1E1OUlpSi9PbjhHZitoNzQra1lvMzljRG53WnU0Qi91d3dxais4L0lNKzRIUUJONXFsNitCVS9mS3pBRDN4Q2VteC95aEltN2IwdWhpMUg3QWcwOFpvTmZoSmF4RVBkWkRNdGVUSWZGMEJtK1I4elZld3lkUCszWjdSUUtyZnlrNU00L3lIM1hJM1pQT09DMEJzeUtBazhwNGZESExzdWN5Q01td29EWlJmNGc2UUVNekpOTXpMQVlTRmtMWVVrYWJBSHhnS2xpV24rSnMraVc3NVFDXCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzE3X19fID0gbmV3IFVSTChcImRhdGE6Zm9udC93b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBQ2RzQUJJQUFBQUFSL3dBQUNjR0FBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR2pnYklCeUJEQVpnUDFOVVFWUmVBSUVDQ0lGOENaOFVFUkFLMWlqSk5BdUNFQUFCTmdJa0E0UWNCQ0FGaEhnSElBeUZIeHRFUHlWalc5YXcyd0VvVXI2ZlA5SC9meng2RERkOWtOUWg1MGk0a1hLVUNrcEJLVGhIYkNpNG9hT1k3bHVvVzBvTUtqOTRKSmJ4NE5hZ3lBMnRIRHFjSXptNUdRaDJrV1FlOTJYWlNVblozNysxKzFIdStVOWl5MmhvL2RkcVJ3ZTdVWENLbFdzMklnWUtjbmJ5RDdmbDdYV3BheDRTanA0eE5HZXp0RkI0cTJHT2tHVDJTdmV2dTZzNzZRVFBsZ0Zsejl3ZitTNEFkUG42VERJS0RBUUtrSXhsSmtVRnBCZWdva3FaRnVzVUpaRG1tM3U5dXh4eENFcVFZakpVUDIvUFQ3T3dFNjd0bEVDaGdOMkUrcTJRZTM0RHRNME9SV1VZWTRwTVZCUURvNGM2WFJoOXMwaWpweUNLTmhnREN6T3daaVdZalZXTENoZnRWOElEZjZsZ3NSdnozUmlMTWl3V3lxN0hhMXlnVmlTdDJRTHU1K0cvdWQ0N21UZVQvVVczcXFncmU2b0EwQU93c25WQXdnUHJ1Z3JEbWpESityMjZVbWo0STFrTGRYc0EyS0U4bDhSKzZieTVNa0JjSlJVQWJLRC9kalRUSlBpRkhsRzZGT0Z4YWxRQUdPYjdiU3NSc1NWZUo4U0N4eU5lYUVSOGY1Z2hEbzRQQUFPUlcwaUI1ajNheTQ4RGp1TzQrZGFmTTJvT0pySnJWRU0zWktNNXV6aW02V1E2QmtkMEJIZFdoUU55cExuelE3TDNTMXR2TXlhYzcyaXJaR2hWaDlwMVREaUxocVg2YnMwM1NJdmxtQ0NFdTc0c2VUclVENCs2d0NEV3VjKy9UWHZiTnhwcmQ3eWZVUi8xS1ZCMHdHMktObVdxZFBQdW02ZDVNQ00vUGNzK21wR3lscVdRN1EralpXbFJka0RXaHJISEVzaVdsL1EvMjJFdU54Vmd0MjJxTWtWUkpoWDFLZW82SmtPMVNvREoyRFRGTWdoMG9XdisvNHlyZmt2R3pKNytXTjlha2laSng1T0tmNTE3QWtLc1VtNlI2eVUyYUlIWWwzbTk1RWFCaE9vY2dMQzZEQUtNODNUVVFOWnQ4S1FDTUpoU2FFVVdzbTk5aGtYaXpOakRGMWh4Z01IeGs1R3hnUHVKeUFnV1hYMG1QQ1doWCt6VXRIMnJNeFppNzR3amx0TE94SnNJY3V4MjVqd3REcERMRkZKTnFNMERoS0tkU3ppb0h6Ry9tcWVnd1U4MUpBQytPSzRCNEwxR1VQcDRmRk9ybkNRWENHTUdkeExjSU9zQmJJMnp5djZ2Y2ZHQTF5M2V2R3pBTnBVNUFFaFFKWnBEcEZmWFhmY1R1MzRrSlJwQ1JlZU9SNmRBQVBaUE9OTVFWUjBia2FhK3o1U1UwUUZnSlNoQmQzV0FublFkRkdOQTVJc0twV3ZZWEFMMUpsa0xvV3lPQm9CblFHV2hoQ0JHY0lRRlB5WVhGbkJTM1VtTzNOMUpFUkkxTWZHMzZuSzZvVHZWOWQwajNTYkFQNS8velI0SGlQSkN6K2hYY1hBcmtuU1pnN3JZQUVHdnREK2svcHI1WVR6NTE2V2k3UDRGd1B1R05KNHZFY2lUdzlTWnJGTzFRZVdwN290WHBrV3NLcTI0K2xTbTB3cnVaSS9lK1UyaEN3bThTaTR2ZGhneUxVeDNDeldhZGNMSm9JbXh1c0NJcEFaWG5qVFd5TnFPN0lwUGxhdlhzSEg1S2pTbDA1THhGS3VPQi9mTFVxUmNRL3VSeDN4elFiWVNkUW5Fd2NPL2JmVmFDT3RtNWhZNGtFMFc2c2pDVlNQTlRmZXNPWHFySmFlcldaa1pYTTZGOUxUVUZEWXJPU2t4SVQ0dU5vWVpIY1dJcE5NaXdzK0hoWVlFQndVRytQdjUrbEFwSkNMQjI4dlR3LzBjNk9hcU45OHBVSjF3N3krN3ZwZncvZldKQjlwRjEvTTM1dVFEMVZzYk80SHo3V0RTRWN4RTdHZ3E5UU5qclRkc1ljQlVYYjA2cnJRY0VCNld4WkNGUGNWR294bVBKbzFRclJtaXlzQzhFN0tucnJCNHF3WktZb0lCRjQ4dDNNR1FEQnNhM2phOExoTmdTdXZkQ1N5bHQ0MUorR1k4VDM1Sk1lazhvM0JzV2Rab1Z4SVE5TXpEZmJFdFdLK1VQVkJDT1lRaVBWQSs1WXlvcXhISWJPUDdjQnRJNGJySExNTVQ4WWYyMXhRZ1N5TFlpaGRqMFo0R016YmRTNmJDbzNPalBiRWw3M1A3YWRtUGlHMm5uUWg2VTR4dlR5ZFR2ajNiU0E2aGtXL1B5YStFbElSN1BtM3ArU3FScnNrUkNON2xaS0VZTFVlbk9kSDBKaHVyVzJuV3cwaTd6QWcwVjVCOUQyR0NvbkNtbktZZGh5WlkyWEE3YkVKTVZQbTdIWkVMZDlzSFFtZ3VRV2tUZU9iaDdwemc1cGc1Yms1Umg2S0VmZkpYditiM0NPQWlmQkZnQit1a2NxZk5iN0hxb3RNbVM0cW5qMDRGbWx1eDV4MEV4MDRrMGxOZytNQzhCUWZQTi9KYkFCMk1hZ3FvZStWbjZiVHJSQk9PdDdXZmFpQlZKZGdLM3ZCN1lrbHlMWmlaOE00SFkvM0YrQWVqQ0s1Tmt2RGFzRStyVit2eE9vWGgvWkVta3liVTJNdWVLVCtpZzlNdGg0MVc0K3FhNjRLbEJrdnVCc3M4ZzZtTEhOUnF5MTN5b29EcGZKR3FyZzRFaFlyWXdOcmpOMnlwaEV5Vkx4WXZkcEhzb1BIaTlUMzQ4VDNHNVM4VkwrVnM0alNBYTBIL0ZkZGNVK3VWbHJ3Z2dobkwxbXg4aEN4aE9JTEY5MHhpMEd1dGI1VVB0S2xPTU9FZWROcWpTVEpQM0hoUEZJSTNrOVo5dEhoSXgyVTg3ZlhBR3JZNjlMRngzd012SUdwbkdvUEpBSGkxWjlOSnJvN3Q1MGdybUFtWUlzQXN6MjNUaUdUbmpXaXdtODltSmt0elI2RU5sdEhRMGh0Tmw0QTNIM1RhNVlVVUE0Y1BKMDRVcFh5aWxwdjdQYk9FSXZDaUI4bTVMRzNvRnNzTjFJY3REK2RqallzTE9zTDFDa0FsWWpqRVNxWmlhZVczekNjS1U3TDJvNTRWMndSTFRiNVR3K2M2ZWFTZXJqK0FOdnZJOXYycVd4VUNtTHJNaU5VMDhWRVdCdzBPZXpkbVZFUlZrTXFRci9FcnU5bnBrWjdrczdRcTQrNms3TkNqRldkNElNbkNXQSttYnk1cndQbWVscUdpOThWUk55WGJVM2ZGT2JFZ1pVNEcxUlFGZjVGQkpkUEdtdXp3bERaeGMySGZqY2IycE9OR3JFNml6bzVhU0ZOb0hzNmNHTTJhaDVTbGFROHJQSU81eHcwQnN3S0k2anF1RzB3VjJUVjNFYmlHclFjUHVQUWNkeHpYa0prNklRbWkxQllwT0pEMldsT3o5UTA2QVVvNHJwVUppdGVuWG1xY0UzWUVCNjUyZEdVdG45R2xmZGhSRlNhejNLM3Z6cFlxNnRKYW0yZ0tPRUVOa1BIWEtSanB1WXFKcytzaEdrZGMybkZVVVVKVVBlWkc3eEI2WHdMTUNLYkdhQWNUTGs0b0NhMjcwb1R4TFp4cHhQbktQaFF3YkFaaGpCaHJqWENiUUhNNFprOXFjR3RzS0lSTjJNcVhPVnZTMS9YNXJOcSt1Z0Z4aVRCSEhjMnN1ektzSEhOS010SEdvZ01SWWtVbkRFQ0d1V0ppNUhnYzNxVk1yWitDVDRjd0FKNVBUZVFxWTNMN0RDUENCa2Erdy94YXpBUUJOclhXRXd6R3cvR0ZLOEFJcnpsZkRVem83OWNlVm81bVlIR1RWbkhIaCtBMWN2c0VEaWQrQWVNVmx2cVJsRHp0eUI2eVAxb0p4VWNPOElSb3VhN1RjdkxWUnRlZVdNdjJhRlIxYU05SW1IVmEyaGI5QURVYUhnNVVIRUhsQUJjRDRLUUgxa0lEOFZENTJpeGtnOEdBM1BheWgzOGxRQkZmT1JPM21RaWRsbHE3RzJXcTAwRmQ4cVVhVnArb084Y0NlRHE2NGVBTTVXYndyVHE3TiswMko0ZWpRK21XOFpYbzNKcHFYV05FU05TNWxDdzdRQ3JCbXRJY2ptUTNhMXNLYXVEakh4TjZEOVJpTmlLMGYxVXVZb2ZSdTZHUFBVWUhWNmcrQlBzWUhaQXNod2tZS1cyMTN0dlN0T05NZ2lhQjN0RTd6OEZUVitFa2FNbWdFWmQ3RnFibTFvTEN6bll1aHNUK3VsWFV5WWFzVVAzMzFxWkx4eUcyanJod3FlZFc2TTI0QXljQTR3VlhQc3lGRVp6QTBnZlZyV1E0cWk3aWlSU2ZUTkxWd2FFZlRrOWNYSmNabk9MSjhJaytZb204WXhLNlI1ckxvZWh3Q2s5VEJVdGRnMVBvalhSS284OGFMbkIwamhQYXFiVi8vSU1zN1FPWTRvdkxEd2lwOW53eGNNVjEybHFMRG1Qb01hbytuWE12VDNVYTlQSjRXUFFTK01uWEwvamNwTndOc05kbGNQWDEveVBuSFREbG1CeC9CN0NvTzFzUXg1N3lEdVdTYUY2VHZmbjl5MmVYek9VcmdFcitiekE3bUVadEsyVmNCMlVzeEdlT3VTOTAxVmZ2eWxjZkQvVXpTbm9Wd1pJeXRsbG9KeklubUs3WkxwZG9uVmRWZkJ0OEd5TmF3WTZtWHgyZmFOWUlWMVErWHp3ZmZUdkR2OC9JQ0lFcHFmWmU5Y0FzdDk5MlhMRlBmcXBYZGN4VnltcW5kWkRLbGNBY2I3aVhQMmltUGNBRVczTlJRUS9WdXVhRDlqMm5xQjZkZ2VudnlNU0pJRStFOEJ1c2QvbmQrNFlWaWZjQzR3ejcrWU9Gb2lQRFR2NW82eDBNS1orSnpRQU9IZVBudmRieXJPTHZwcXE3VW1PUUlIa1lYNVM4VFZYd2s4MnJ1WWNFZjRVMm1PZjJ3MktyZHZzcjVCeHJsZlhCbjU3N1BtdzVpOXRxZHFZZkJienRweHVJRjBKclhIV25idGV0YkxtcENOb3ZYQjkweVFvM1kwRzVPdmJ6cUpFY0pCaGcvNFVCNWVRdkp2UzFCejg4L2VlMVA1UGhQWG5uNWIvc1oxdUQ4TkZCWVJ0WmlFTWFSeXI1K1ZOUUJSaGM2SEE2d2FBR056REQvV1VwQzJXWEU1Vk1Ha21XRXc5YnBjZDNBZUVWZFVNV2NnOWlGaGYrSGRDeUNidlRsZGNxdW1admVXMDM2cWJpWEJlOXVuTS82aHRkMnlQVmM1SHZkdy9rTG5mZGJmTDF2RkEzZzk3MXRGYU5xejFWM3Rtamp5TExTT3RGcWs1enJYb2lsS2ZiNVphNTVidFNkTHpkMmhTSGNMVWRkL2ROaGdJLzJFME5qQlVqWUlwclkyZWs0ai9ISmU4SSs0TVhLbDRVNGkvSzVNVG8yUGRtVmd2Q0dPUUh3MDBqVTRKcUxmTlkwY0pVYTc0Ry8xajM2cEQzSUFmK2lhM0ZiVkdvSUFvVEdMWmx3R1RhbG9ncGpqUVNsZGNGSzFXMkZOVnd0NjNFZVpRaEFZRmpGTko2cmthd3g5VXl0WlZLVHFueDFyL252THJKam00TnJwR3V2U1dFQWMvQ3lLUTdmeXdnNll6OHk4MldYRkgvVG9iVkM2Nmh4Y1lBQVNuK25yNGxDOWpKcm5CZHJLMWdmWTFXMTJtRjc2TThML0I4cUphVVBPMENCa040SVJmVExQNW53N0krN3lLRyt2UE53RlJRTk1jMm0xbXVYQjM0aEtIVHJvc1BURDJVUVJSL1FhTXdVSkZzV0lSL2ExQ0dmTHczUU5WM3hPaW5weDJnbkhxZTVaUjVRVnFaczJFazhuREc5eWwvVitaV3NEbk1yQVpIak03aVBFQ0JhWkNlemc5K1lNdnFkMWUwUlRnQkNVbEl6bmkzUm92THRMS0twUVV3VFQ1V2VrSjBkZGJUdExlWWNMbVo2dWd3MTkwbWFwWTZlTlpPU055eU5xY2dIMEliNWxoNDRVVEZRWHB0QWtEV0ZsWlpFbU55U0pJc2lnZ203bDU5YXJINCt3WWxESmlGWE5NSHFscXFQK3ZaNEtRUHdPRFBOb092ckROZUp1MkRsTzhCUk1VaGJFWHdCNHFWdzNoQW1pVDArdVptVXdmRDBrSVl2WEE0Sk5BVUUyeWZEVUZNSmxqaWVoOWJHR2JNeXVjTXRFYUMvUWJRamlrR0prcWFrdWpBa0ZnbDBpM1psb0tsL242NldjKzZQOHNtUmRqZG9XMUxacGUydHJGallMZkFWZUtDN052RFJwVDg2Tk02UXJxQ0IyMzBIZTZVS0hIbWxEZnBURFVRTExxVGFaWmI3Y0pNa0tIb2pKazJyL3UxRS9JWnh1bVM0bkdsTERvWnh3YXppenFHdFdNWGxuT0pXVElWMkcxTFhBNnlDcnpIdnQ4dmVuYlNnN2hxRHQ2VnFDU3F5SEE5ZWZMZU9qWVdwUGFXNnh3dFRnRkIwSmhDL3RjaDkvWEE4MUw5SUpBeXJML2JwUFZXeVplK1ZyRCtML24zTXZrSWE1TjdiVTdUOVY3Vi9WOFB2dUdUR2dOcmhoNkdjMXlsYUhRQlBXNGhhWHFBbnpqYnVseHZ0UjhRVW0zTGgyOCtLd21YSU9mRTk0eUFaSGhsRld0R0M0NnJKVXRtbmVmangvWktPeURiQUNIeGZaTk1sVUJaTDFNR1c2K2FnVDNrTXBCNlVFNm1qZFQ5ZDh1U0R1WHhFcTUyVXdjZTdVV0FQVnZCNDVqSXJJS21ETHBReUEwMkxiUTJMcGs5NEdTYjFYS01VSTdINndmVTJwQkgrWUZ1NVpTRWxCSml0VUdZekdEVENIMlVaWnQ0bWdLSEhOdEZUSEVnUlhvZ01mQys0TUF4akNBZ3FCZFJ0ZGw2emwwL1MvSGNjZExJbXZ6NDNEd3c0S2k1bGFIUGZpeDlWbWtwcHpEMThmdUg3cXRLSE11SDU3bjRETm90VmVCZXU0Wi9kdk1oNlI0M25BNUJST1ZLbjByWWJoVys5Tm05NG1vMUl0U0s5NDFrcS9RZ3FhQlhtVldMYzN3emN3b1J1NjBKT2lQd3JOZjdRb2F1U0lXbDNFS0p5MHRiNnNvZ2x2SVNNRXJKNFo4bFp1aVBreUk2VXEzWFAvUlc1YWRVdFdkbXFuaXZWdWozdlpnMDFTVDF3N2xPZStURWczK2VFbFJEMlEvUEo0Qlp1UEN3cWI0SkpqenUvL21HVE45d243b3hvcld6M0t4VnVOeklHTHBLVWlhcCtKVTFvWWlLenVtalYxVmtDdWM2NUJWNmQzenNpekw4QWhId01MazZBcVU2c1RoejhVMW8yKy93cTA1S2E3VlpuS3l4K0xWL2tyWE10cnFiOGloZ2FvOXRpYnA1Z3lWbm5WelU1dmFzZklFbDk3WnVKR0lFUzFLcUoyREdWVGt2REJicVNlOEV3ZkpUZTlDNHdjUnJobVE5cDJvWGRZRUo0amNUSUdxVHhvSkhZZlZobUFJMGFSMTRIMkFGNktGRTROZ1FlcjlGMDQ5VUJzN0RlOGdPOC84OEJ6ZTBEakcwWW9ZQXZCb0dwS1dCMHdKL0dRKzFXVG1ZdFVTcWVCblkxbUh2L2tmMWwzVXBESDM5TDNsMkRndzRpT2RKcEJqQTFCVmxWSU0ybnczNklBZDIvNHp0SC9vblZyQkhWaHg4V1VjeUVyMTVwTGZZUkFUWEQ1YVlSeC9YRFE0OXJJczZ1cVR5eGZidm9TZjhHQm1FZHVTY0N2VHA5WkN6Z3VMc3AyRFhsSjFPL3l1SnI5bW1kbFlzblFrcFNxcGRyRHB1ZjZ3d2p6ZjNQcXlkVW5jMEEzUFE2Njcyd0NJdDRlSnA3d1J2RHdkNkV6bmZKQmhiNlIxR004djNTVTBUM1BZdlRkMDFKR3RiOEwyeEU0YWhvYnlUVGpRWEwvdklLdTlVQTU3SmRIUklvMnJwTUlDdU5qbzBYbFpvMmlqTHI4bWZmZmZudG1nbHpqWEJkV1pyUWZsWWtVYVdhNUozaklSUzhsa3FnZUx2UkRSQ3ltdlhCMjZ2akc5ODVLaDN3NTdRaUhsNllmUVdGLy9LK0Q3eDhTTlN5MUpPVlp6a1JOL1dFeTRhK0t4enVEVkxOeHVCNUZVcFlXcGNhSEpBYU8xaWQ0OVdwRUw5SzA3V242dDdCZjk4NURTUW03Q3dFMlVLZWVxbldJM2g3aXZsaGFDb0ppTGVyMXk3cEQ2MkNJUEFVWU1yOWpLWXp4dWlmaFY3c1hocE1Mb1Q1Nk5kUzlidTBVanMrTVRML1hOMk1rM3NZWGxOY1dIN3FGeXJNNUNmcms4bm94V3BJQ2dBcWMzNmZkWlcvZnFHaFZiV0JRaUR6K1llY292RkgvL1NjNlo0MFA4VS9FcTNxOHIzQVA2WXRTNHc1UHVYVk1GVlRLZlk1VTQrZjhrekxXSE9zNEFQM2ltZTRmenp1cUM5OFdWaDVqOFcyT2tDbHcwK2s4MnFaYnBzRk9TN3JQS2pVb1k3WGlFTXRZT3YvWXhXRVNYK2V6bTN6Qy9mT01UcnE0d09MRjUvVXdnVWxTcDJ3dzYza1F2TWJNcFpaWDUyWTVCOGJQblp0UXBhT3FNNDNuR2J0OW40Rm1mbFlNU01ydHAwSzJZTHRWNDJPMklYTGNPcmNvSUl4bmpuZEh1bVRyUnVremM1T2FqOFpmMDhiVVRISFd0VjRLVGFyRXRrY3owY3phMGRzazR4ZEJpNEJpS1JwVHh0eGtXdFl2dlYrNWU1cUdxelZmeXF4ZXF5S3ZBRVRoMW11R2t4VkVJeXBHNlo5MkNvYjduVG1Mc2ZjWFI2UXpXUlllb0dieXlrdnRlMERUUnhDTWc2MDZ5c0VNbkMyK2pvZXVGUDJPdnFtT1dZTFM3RzZZU2NkVVFkbkptY1dwb0c4cXd6a2VKUEpaeE5WUHJWSThZdEtVdGUwUmNwV3N4ZVhORVQ5M2FRUmtkN0YrbDc1bzlUL1NjcUJIMnRwWm5GdWR5YVlOdXBQR1hCazlic1ZwR1czYjI1cG5LQUg5eEtMdlljaDRVQkFIMVB2eHNJYThzck0rL0ZqMVduSHpaSDIyMVZ0LzBJblJCN05mQnFSdXd3cjJ3L3UwRlBkTmlzcmYvdU95STI0OXd2dmh2aE4zNGgrL3pjUHIwRkNzODNNZW1FN2tXRnpHZHkvTVoyejJ2STJHQ1JwaVFaVHYxSDV5TW0rQkJkRzBab01aZVR4dWQ5bU8zSFMyM2NhYnpVVTNYbDBmSXMvOUsxSFEyNGhhSmwwcHhkVVRacFFacHp0LzRSdE1EbGVsN1ZtbnNPWXhwTFBXQit2OVpWVXo0Ymkycklyd2VDa1RPN1IySkhlUHVtRkQxbi9qbnRJV08wVEI1S3kwbDJzSnBaaWJVRnd3M2FFRDZ5cmhvM2NWQTlRMlNuTUtIODVpOU01aUpuKy85M0N4bmdsQ2p0cjdTaHNxbXlwTnd2NjZoYzVyR1p6YkMySDZ6Ym1DdXJvdm16cDArVXBLa2ZTQnNrNUNXTUpKVGUvSmtaSTNxQzRUT1ZONFYvV1Z1M05wSk0vYWhTdGV4bjU1cis3Ym00ZjJkeFhucnc5d3cydTZMczNSREFKemRoNEhCaURmRHM4ZXp0UndOTmZrOTJRSEhxLzBxQ0dpY2Z2cm56TmVyOFlzYmxIeStQLzhQL3ZOdFhWa1Vqc0lkUFZGeEhuNHVjQS9nenFON3NQN0o3VVVudU9YbTJqR0Q3TUZqM1lWTXdMTVBHN0x4ZEdzNGhlVVhaNS91Wm5SWHpyZTIrYmZPdGxUUGJ4Qi9iRG04UCtnNGMzMjVyT3R3TmE1Z2ZhVVpMVGFORjA3VzV2RTFJN0hyNkErMEFnL1puMVliMUtPZmRxMDNsMVYveTd0K3V2bEt6NGhqS3BiSUZHVVhsczY0K1ZpUjJjNTN6dEY1MDY1M2crRjUxbWY2NVRpOHpTSko0TE5Udk9Bei85cklJb0R1ZExNWFRvSWtTL2xKSDhML2NYRmFHdjd6ZWVmQnVQKy9hcnRyYUt0cEJQL1NicGNleWllby9heHhxUEVCUTBHV2VtOW1NYUMxbjJlWTErbnRpQjlJTldvK1NaSncwYnVCZ2VzWUtuZktLQk1VNXpMYTJUWG1PYUR5aytIUUVJbTZRRll5MDhJbzNvVEJ3VkMxbit5Vmw4UlBaS0NXYVZPajczME5RYkt2alFieEdaRysybDJ0L05nQTZ2alVZbXFKL3k1eDM0K25xdFBPUUVZZkhyYzNZTkVyWHZ6U0lTVThDRHY0QWJuRDgwRGorclpIanZQWEpabU1RVE1mZEdZazh1QkpTb2Q5L2x6Nk4veVY4My9zWXcxaEszLzc5blpRVS85ZTU0YklxR29VOWNJTDNHQjB3NXROdTM0bDh4dC9ld1lDYW14MHE3eVd6QkdZNUQyeGVUK1UwUlNxY0JkVHV0NWlZWjRTOGt6TGlxOHpObHYzR0JyQkhUdVJBam1QNkxTT0hqSjNWWGFxb2V2Y01XZU5pTVlOYmxDT2RYMXVEckZjKzUweW9VakQxVk5TRUpyM284cm5TYXZDR1dPR2R4bHN3dHRkY2ZzNlVJem9iLzJ5UWlPemUreEhUZVZONXJONVc2aDVqd2pPLzFpU203RmFqcGtMbnBUdHFTM1VrbDVxWG9nakV0ZnF1dmh0MTRVZVhsczdMWHVQMzlseXZvY2xvSkVWa1JPdzE1UktVeW9LcHZieDl4QzA1dnZqL0Y2QnR2dUlJckh6U3c4dm42MWRlWTFMNW53TGNsL2ZydFhNMHBmQ1o4cXI4RDZXb1VpV084bGNxaXB2c3VpZDVVZVpKbEUrMWRXRFZDamZzV2NNMDkrZG4zTWFVdVlEc1VjZS8vNHhoSlFUM2tmS3hndTNhb0RyUFNDYVRnVms3MTV3WFlPUkFzNHhLWjRVcXdCaXk5V25jMElEcU5WTExRL0J1Mm94RlZIcHhZSGl0VHdVNkNWTldROFc2ZUNkNzVtbWRrU3d1OVZLM0tBQXJmeElKUVRrYmJWRFVEdXZPZ0dWMHdueERjak1zN2FpUTBZdjVVQmpmMFRnZUFVWktxUVJaZ0h2SWIvalZGNFpHclViUERWZS80ZmVSODJzS3lGYmtoZ0pXdFQ0NFk5b3hQQ2VZRnBzYWlvWTVIb3R6dEk4akJkTnFyMURhdkVvUmllb05GMTAwUk9ieDFFSWRiMTgzQnhkcW1WNU1YUW1uVWtnSUkrY1NPWUdsMmdTTjB3VStPQkZPSFhrWG5FU3FpYnVLMlNOeHRPNnJZR3NYRmtJVFB3L0hPWFZkQTQvRDhXL0IrWWVJLzA1dUhSb2FDVUVoRW4wd3VPS2xJSFkyS2ZBREx5NUE1VmZKdzF0YkNHTjM5N01YVFQ5b241WGRMMUtrT0lOZzQyVWphS0NOSkdvcnB4SmxuaU5wTEJhSTM3NEl2a0JwOFZCc25vb2lIYnhLdXlvQUJkOXAzNFVnMnBrS2dzSkZjRkVJSWs3MWlwaWlQaEc5TWxrQnY0dGM3cEU5dkZGNEtPemovZnpqWUVEMmFjL1RIdWtmTndwL0ZncDVQeDBlRzVaWmRzMkc5eks5WjNOeUNITzl6Q3pwSTNlbzFDeVpubGp2MmF6VjJmczRyKzZNbm94U1VDaHlFUWxXbXRGSUtGZ1dsUlFlRnoxbzUzdnlxUUFVZkE0NlBlbVVPYmd3M3RpSVlkd0Z3YUNYd0Y0Z09oQUpSZTlFeHhuYjRFbzdWTWdKTXV2OTBXSTA2ZUMyVGQyYVMwZ3BneEhRc0U1cWZTNEtyRFNQSUo1TXR1YngvUm4wRWkvME9DamNOcXFZY2ZHemZLdStEUXVrZW16UnNjdzZ2NmpJVXU5Y2xGWDNYNkFBVlBISkoxWXN1Z1Q3LytnREc1WkpEVjlCb2ZhV1dHU1ZOOCtHYlh1aHdmOTR1RUpJQ1dhWS83QlN5eitwaXhRb2tNdzBLaldRR1JFSytzNVVZRk9NaTV1N05NbXRIOWw1ZjF4YUsvMzNsMzAwVFV4bm12VS9mamFVWDA5UE80RDFhWDBYZ0lLck9ObUw2ZmV1SkpmVjNDMUsrY2ZzNVZTWjdYb1JQUzYyaUdhN1hsNXF0MUlZRVJ0YkZHRzNvdkYyODh3MVo3bFVFTXdKNjdqZE4zb0FDaFpRVWg0UjVhRjVDSzR4TDRtQmtjRy8rbUxzSUZkYU9oaURQZTN1RWVGZG1sSEk0OVFFMjAzbEtRODhhODFzRlFsRURaa05hN3JpM3BwSDBFenZJbjJQZ2dtSy8wUTVKZEttbXV1aEQ3K2cwUEl4UGUrUGpmMlNmNytsTjFIYTFKdk5Tb3FLVmMvRU4zaVFHK0ZKQnFWR0Vsd3ZRUU1sS2JCYWE1L2ZXb1pCeTV6V0JyZmhsWE11L3FVTWhuL0RLcW1sWFNRckwzWTJNZkI5VHB5ZjJvRmtaczkyMEJWc21rdy80amFOZjAzOG5Qd3RxOEdmUWEvMFVyZW5ncnVTTmZQTy9pVStFQ3MzaisvN0NmanBEamgwR1hxNWtmQno4cy9aOWRqWFd1YWxCWWViOGtDaHlGTWtBTk01UFlyMnUyOTJXcjdXR05kdmpMQ1lMZDM2ZFZjSS91V0EyRkhXWHpaNHV5V2xJRmtxWG9KM3Z6aDlTd3VHMUQwWVRySWNXbWJsWkpZdm1TOSt6TCtZNE5tU0pPeWRyQkcvSXErbXBJSCtxYkxFSUVvNk80V2NIQnprazV6Q3BxYnJuTldSaHRISnhaM09XYmx0anU3RmtvdzJlSHdZSWU1OFBBWE9sSWVmL3ZGOVlPQWI4ZVpxK2NWTGVVOExuczZyc1hQT21EV2FNWEIydjRES015Q2FweEluaU1Qd1ZKVDd3TkhQY1JvQitJc3k5ckNqOXBadEdrRUhrUm8rQWxBZzQ1aW1wc0MvcFdScTBPTmtiN1NjNDhBNFVXQXZxbzlZelczT2ZQaWExY0ovRlpkenF6a2pjR1dzTUV2YlZadmw0UlRoUmdwTzJ2SzJzTGc5R0tEWUZVTHZ5Mjhlblc3cUhwbnJqZkxnbDhhZzY5bm9nQUxZQWpXTmxGaTRxcGMwYWVCaVNVRFJLNkcwNDBwZVZnOC9ha2FMcmJqMVMxSFgvckpyMWk3VXFIWTdqVVZpU3k3M3ZzdGQ0Z3JkWTFlNmlhdmR3VFd1MDBHZTQwT3Eya1hSMmFPYnU5NnRkTW5wSHJQMXIzWk0xRnhiczNWUjY4Z1ZGOXFwdXpTZFpycGx4SDRpT3E0VEtha2xEem1FMXdFMktjYVcyTjJjT0ZiMVgxdk9zamJLcmVPK0pYZHVNcWptK0JMaHZId0FBRDhBckYvcDVXWlVuKzVnVHY0REluR2wyOFpMWmM0WFltay9NOWtmYmxJTWcxNWhiekVIZGZOaHVnaG84NWtTeTBnOVlVTU9iNXhmNUxMaDJ6RmtzUzFlNFhOSVpKRW9lTzdhK1h5cXlvN1JPK0pLdVVLK2RQWVM1bVQ1MVpGMGJwRFFqbndsQXJHd2drSUVHNjhmcWRJb2Q3NDV1SVB0Z0NaemJiZllzSVVZRktUcjVGUm1ZanZLN1E1clU5VVF4VTdLTTNZQjhFUjVQWG1HNXZSYmt6MDR1L0J3aTYyK21xTTd2OGNsa0ZlVll0OEZxU2I2TFpkeW9NOVA5SDR4alZhRUZORVpxWU54R3NQajh6azh2cmhjWE5ZdDdUcHdIYm0zQUFjclV3eCtvdHREL2dBdGNURkZQN1dmVUV2T0lTSzZESHAyQWdhS2xDZ1dlWEVZelM5SUNoQXhTdStuS1RBQWI2WkhXbHlwQjJUdGhsNTZMZ0xGcWxUcTlmMUZDdUtwY1hIcFZTa1Nrclc4Qi92SllVMzVxY2N2ME15bXlDd2lFZkUyRDNIcXNSaUxjckJGdWx4U04xb3h2SjB0UWVEOGRYTnI5MWFXeUo3MzFFMmFnbEljbTVjZzhkc3h3a2JQOUtiRWFkSUhpbXNPdjZRQ1lpcXZSanNUUnQ0Vkc0a2oyekhlOVlxOVVlSU0zSm4xZmFZL1EwOWVFRm1ieUNMMVlGM1ZoMjFXUE0vcVdpYnNpT1pYTmRweityNGVGSmp2YXVhS3l4MWIxUk1MSkJ4VWl6a0pjaGNGMWpsYXVlNE1ReFdjYTZCQ2gvNTBSNTVrT0ovTis0QlFLeVRyYmcwRFpHNFB3TGYrTGpiQzdJSGhwZDhvb3J0V2pWWTlQUTNvR1BoVDg5c3duSmRWNGp2UzdrM05Ec2JiYVVLTjIxcy90dzRVZ0pXN08vT2pCbC9YNEN6TGN1U1JPNE1uV0I5NHYvN0RSRjRBZjdxb3VvUHJ4TTB1UWcveXJqTG44TFQrb09WK0VTTzQ5b2l3a1V5M2hjQ0lycnZRT2MyOEw2QXE0SWpuOENsZW95V2E2ZmxpWXRCbmFETVJxYmhnZTdHTFRJY1pqa1cwbnFsRHg5TVM4T29kV1VnZ3U3aTRHblZTNENRS3E5dHBYbWxuZXZnVVpCcFZKUFJlRnU0OFByTjRLYTNxT1RxbXk3WnAxT09ZZUtwczA5RnpqMkdUcmlrR3ZYT1hnSmk0Y2VlUEJoYjdlUnBNUnB4amREUVhSVmVrVW0vaHBaU1FyejMxNURwUVdTZHBNRk9pTEc2cUtVMWgxN01Eb2Y3d3hYYU1FVkt4Ry9TNTlUU3FKRVRuekFGeWlGalRaYTEyT1EzTWhTL0RLWW1BS0d1T2hLQ0VWQzAwNDVnOHB5aHhVaDZkdm5qVDkreDBoNXRsWkFqTHN0R1p4YWVzS3MySTcrUE96bU4ybjlUUzZTZldaRXEwRENyZ0lKdkx6NDZQaXhCalViREhRYmxSNVJSNG1IbitKcm82UkZEQWQrWnUwL2g1NkZzalhtcERpQ2tpcmtIZlI1dFdMQnc1NDgvUllOVUVpVjQ5WmFCTmszaDc1T0tLT0tWc0owNU9tL1JoZTJzTG5IbmxSM3RVaUpwcXlJeUNIczZma3RZcFhWbXVOQnNOS1FVdFB3Qk9ob29PNms3THM4aGQ3RWFONWpGV0ZTZ3g1TjlGQjFWakhRZk5XdXlVTXZsWWFNQ2ZKY1FvNG9rZDRadktOb29DN3N3M1JiN1J4ZVZ3QUpnYzJHQlVSbWNXbDRQVDhEWWZhTUt3T3pIWE1TeHYvZUdHWHA2U3VJZ1I3ZlIyMUNSdVFzNzBXYVlyUFdVbURLVjE5MEdETWtUa0pSbVFmK1VDd0lwNGxIYjMxN1phSVZUTUdhaXAxbzQyWjM1TW1XdHhGVDVnaXd2R3NkVHM0UkQ5RDZDRFlmdnovbHJ6UGZDSjg2cnI4cjQvMkxIOXRRYSt5MDlDZWd4SDdncnNyZHVrdFJVRitFeEhtbjUwVTkxUU1sc3dyT2EyZktDT3lyZUI0QVV5QVZkL2ZXSGEyRDMxVXBWaEtEZzhMMVM1RU9TUWhPSXljNEJQcmRIY0h3U2ZZYXJydVV2RU5lYXNVU2NiKzFXV0d3S1JrNTJHSnF5bTgwak9hVWovVFdzcGE3djh1UTRPRE9ldjUwYkJBaTVBbk8yZ2RjVStwS2s2Q3NaSHBURldvb0VvazdzVWMvZ1prRjBCeHdpWU15K2VxeHhCWGg0YnJmcjRjV0Yrb1pXR09pTlEvdUtIV2hBY0JlVlppd1RBdlhsVEFnS0E1Y21FMS80NG1uMzJwL0JoUUZuNDZmV3IzN2J3MjNXOSs1OTMveGJUTm9vQWdBME5OeEQ0VDdTSysyQkR4a0RwTDUvS1czSE5SamtLQUw3SWZvRURWOEhLNGwyYWJNNTI2MHhlV3J6OWVrb25OOGNHRFRPaXlVY255Y1lhR1IwZm11OWhSVFpXSXdGOGFpVCt2NE5sV0hGZ1BPZU5vOEtNYm9nQktIclRTZjVIK2dBWit2YkxIZnYxUEthcStuUHl0QlFqU3o3VTBxUWxWVCtRQWRJTzhaQlhyVGdFV1JUNmV1d1RkR1k0NVpDUk5iS0tRR01Jb1NKZHJpRFNLbDBnTnNBbTJBRngyQUpiZ1NBVHVzQW04QlNWQ3NLUncrVElZeUhMMFhvcFMvbTBKQTJzUmhHcTFabmRhOFNtdEdneW50bmNpbWE2RUl3c3IwRHpjMDRGWlJ4TmhtYXpubXpSTGg0ckNBWU4rUTN3QUxaVzNxYVBXbVZSRWxTaytMM3hUN1MwYXNaYkUrTWxoMDdGYVhJQlgvZ1pkclZIcGdrMFZRRktxRGI1Sndlb09menFkeDhVMVhteUxRWTgwSUZoK1dlKzJjcCt2dEF6MHJFVEhSNUJCcGdnaituYnpRRllFMEJGMXE5SkNwYXR2NFVQSll3RXhEUFZBcUJucy9PSk05TmxQcmNxY2NSZDhUSGdkaWdha1FqSi83MDk4Y0RWMjdIdEpIWTcwU1R0MjZuTlpIdWJkUytGN2dVQlFKQnEwZTBRUUthT0FhajhDa1NaOHdOU2xmTXpFb052ZloyVFJFazRXSmlpUkV1QmhXZFdKVmhVeFlrVUJJUm1tY0FKUlRoSmRreUlXS015UnRjMG9jUkJhcGJSbW1heGxaNDBHbVZTa1p4bWVrNmpNRGtvdGhEQkJDMnFlQ3JOTW5GYWlCT0pJV1FDSXRsNm5LZ3lacCtPcDYrRkpKZUZLS25pZG1jeFo4THNRK0VNTndUcEpyaFFlQnBpakZhMGJUa082VHZCSnNsMDRBdlZ2RjZ5UXdEWWlmWTFEV2FkWktFMmtTampNZ0NUVWYwc2dTdFBmaTcwaGZSem1sNW9iNjRrWHZpQU9LZWdvYTVPUXdZUnlxZkZsUyt0ZllQM1RYd2VJOHJuT2NlZm5jOHBBcW5MLzV4ZWhqazFYZU4xa3Q2SnFlajQvRC9IeHFLamZTanh2VGs4YU42aHdUdllGUjFvb29odTF0alhzR0EwTGtTMjB1eHVSek5uTFlHSUd2ZkNhNU5WYk1LcUVXOW5sZGxSbmVTbFpMT3Q2SG1CUlNZdG92RFBYY1l2cjJNaEw4MTh4dDVjYWlncDdzMmtSZE1KajZsRVRtWnZJamJqVWZMR1FqTWFsa1Vqb1QzbkFtL0lONE9lOHdZODArK05Gam03ZFNSdVVTL1hXTVlZZXQ1TFR1WkY1NEdOVGVaNWk0cWVNMTg1YlI3d2pIbkFhdnMxRFJtTFhtUk9ORGxwa3M4Q1BjblFYbUtWa2lqY2dsczEya3VnM09KcjRHbUNIaDVnMmFKdXF2S0xyV1JpS1lKTnNpRHFOTzZxdFR6ZmRaUlRmc2NsOUZvV04reTB0Y3ZRV21XOCtxdFJaY1VjaHVDdm1jOTVlV3VSVENvaG94ZzBBeEsrOTFrYVNKOGNnWWUrQ3c5QlBLcTBVSVlpdUd2cVl3NkJCalIzRHVPM2VLZVpjNlBzdE9SUnVGTjd3TGNiTlZ1LzFrd2EyT0VwdzN5ekp3bnhWdnJ0NWszWTNEdkNuVm41MVlKNXhpZWlaTkwwbU5XNjk3cTQ3MnRDK1RvalE0R0N2ZUZvc1B5Z0NzU3FFbXZLOVpLQ2wraXdmT1ZMZU9wLzRzK3FCUUFBXCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzE4X19fID0gbmV3IFVSTChcImRhdGE6Zm9udC93b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBQTZBQUJJQUFBQUFHdVFBQUE0ZEFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR2pJYmdTNGNQQVpnUDFOVVFWUmVBRHdJZ1h3Sm54UVJFQXFDTElJb0N3b0FBVFlDSkFNUUJDQUZoSGdISUF5Rkh4dWVHU01Sd3NZQkNINS9lUVIvZGNBYmlpL2RRZ3d3bDNiZG9jOVkvS0ZpcXVvYmhDSHZWa1UzMWhCdVNuQ3RHSDF3TVc2RUpMUCs4M2pabi92eWtnRXJ6NEt6VlNxbDhpcmJac1dDTTEwNEszbTYzMEtJLzNidGs1SW0xaWdva1BCUURzaS9VV3Q3TTJqbU43c05rMzRSTVEyTkNnMi90MmJXUFlROUM2U0YwcXRsMlRrUFViY3BZSW9qZVFLU1lXQVp6c21ydlYyK2N1b2NsL1pkL3BJMEhUZGdQNTgvakVLVlBWYUZRdmd0SkRpSlVRZlAvMit1bXRaK2NCbGpKUTZoYVpiZjdZWVF6VUYrblBwSm4remtvbHVMajJWNEFJNnlFbHBDOHA2c3hFK0tmeFQ5S2Q5ZTltMjdZdzUwQkhUTmdSWXFLeXpBYkprYllzU280b0JOWnkvSk5Tdnc4TnZZT3ZBcmhvaXdIMkh0dTA0SGdjRUpZQ09OUnhnSWdsd01oRnUzbnBQVlF2NDJWbVJqTExHc29tNDhQTE1XK3pyZ21lZWIwdzVQeTV5WlBuZzZadlIxd1FNT0FJWUJCb0RBS3JnVHpzNzJQbzVRaTRXR3hCNUlHRWw2TDRJWkJCbDJFTElSakdMcWRlS2FlRHNrdU5WYUI4YU94bjdUK0RxZUxvSFlPRjVGUE1CV1M4bTEzalEzSGhtUGpFZDJSbDRGdkR2bnUyZ25SRUJNNDg4Qk9LeG5iTDlRWnJzaEwwYnhpU3RYWXlVOW1GQ2Y4UDVxMjM4WEFmUC9iQXRBSjd3ZnFSSnZCMWl5MUc3aTI0WnFuMlFVMk1MWmZTMUV3TUxYMGtjQS9jVXpUckZNaFdBTTFDYkFLQnF6WVlnb2NOcHAyWHRIZ20yUEF6aEdHU0tKSlgweHgzQ1FLQVRWazlxZFp2cyt2TzNESWZRbXBGRFl4TnNScm81NGxRUVlYNHY1VnQvMWYzajlmUTVEOVc4QVhIVFovbTN4ZWF2NWl2eWV2VTdZNFpMem5rU256UTVydDkwUlM1eTFMYmxZNjdEVE52c2U2eXhLRmRaWjRyRGpMcnNsU0hXZG5RNDVrUXFYQlBMRmVWY0RJcDJ2RGtvNjd5YjQ1UGlvUzV4eHhRMXJiSFV3dWVpbDIyREh1UFE1eTYyM3hUN1RPMS8zUFJaWllhTTlxY0ppdXZ5cjdYWFloZmF3c0VTMEl0UVkySEhoZ2xKejZPQ0IvUnZXcjF1N1p2VXFmZVdLNWN1V0xpbityNy84L05PUFAzei8zYmZmZlAzVmwxOTgvdG5OOWRYbGRESWVCZi9rOGFPSEYwTm5Id3p1OTN1ZDlyMjdkMjYzbW8xNnJmajR2V3hsdVpKRzN6dmpzK2xLcVpKRXEvOXlxeVZ6TlN3SiszWFFiUWkrWTNXcmEvTnpwYlZUck9IQnlOWDlZU0x6RHBsTGNaTDJNTDVlcWRYalZtZG9LWmNaZ2M3TitrYU5HMjVqdEdFR0pFZEFreGxYSGNiTi9kNHR0YmpOYW4xSkpzQll3aVNDRG4rUFZ4RUwzbHJMdjBiUmJSeGp6ckJtTzgzVW9sUFNRdCtmZ1ZucFM2VlVBMGtxeTVQUmZtejhnRXNVdGFHRitFdFhUKzBCRFlDbjlVcG84UytteitRaFl5SVk4S2h0SlFjOHN6SXY3bHAyRitVMldaTnpaZllucEorSWRiVVNTYW1MaGZUWkpQcjBQeHZhc2p5QjU5bUFmVTdxekprL2RiSElkQXRJckVRYVZsVVk1VmNtcmJUWGpaeWRUcFgrVHF4SGhuWG1QZU1TVHJERlpyaExFbHBzNEk0WURVVkNzQllmVTBpQ3Q4d3R2VDFjbUNQM0tYZUJFUUxqRlBoK2JLQzNVNnlpWWxZc2lwMDVXRXcvbGZITitxSjNFMkFoM0RMSVFUYm84ZGlkZDVMZW56a1NjeWNoa0ttWjBHa3FkTDJZdzNCVmo1bTJwQjF3RTdVbGw5NFRtMit4dzBIOW90S1FOS2ZnU2FxVlBOTFE4UGJkM1dkQU1BRjNlNmU0R0JTVDdvYnZXY291cjdSYm5UdC9nbmF5YjBDV3A0cGRySDVGZHZKWW5wMjFwTDR6dFBCcWZIcWNYYUEzc3UzUkZqZkQyZTZzUWFFeDVzSkhkekVZS3plczJuaEFIblBlWE8yaXJKQllJZU5BK2tFUWphUi9FTkg0SUQxTURpTnFDMnZ3eFBRVWlUaEZMRHRLamlJTDdGWmdsUDFmT2VlYzNyaVJlUjRSd2JmdGxicDBBVEtHNXdBV3B5cXlVcWUxZXlPdFZpaVBNRFRuMVVxckUvMDkwNzZ3RHVBS2tuQk9oK2NZeG1Gd3hybFdyTVhsd3NMNXVTTm11YnFmWTU0OUtYT24vREtiYjluSWdTYndIVEFJTU9NclB4eFN2MGwvYUNXOTg0UjdOdnBqbWFWeFVEUjJTa2JIek84OHIxYlNGWktiekora2RNOW9oMzdBK1BMcjlGS1NrZWRSeVNORC9QZ1dyd1JmMGxlVG5wdHhsUjdqSVduamZFS1Ntb1hXVUxKck5VMGMrdEZsd05oT1hXOWozRU5RaUxKZHl2ZU1iY1NLOHhIazU2clh1VGFGdXRLRGNVdjFQQ25DbFRUV0ZEYWNjWDI1Z0pzUmlXUzh5em5sUmRTZ3h2cWljVE1PSU1Ec2dtaUk1dmxrUjBvN01IVk1kcnh1UmR4UCtIQnNHZDh2d3dTY1d3MUNzK3E0YVpOMzVMMExFNmZWS1hSQmwyRXJvK092YWJjTHZ4Y1BMWVVnL1U5NDJCeEt1MkRuOW9hYmN0cG9tM1g4cWczMEVjRm9BbVlXa0pMQThwTnV3Q2h1TlFpYU1HemtjVFoyREljcHhLZk5SQ2dFeGdmQ0VnVTlwSExXTHVvSm5GSUg3aTVKbWN2OVV2TlNDSVJKYjZDeEpaVWlPekx5QWc1WkFzN3h3QnZXbEZGQjY5d0ZCYWt6VEVNNHR5ZnBDdElDRlViQkt4R2JKazR1d3BLS2lXMnowaHd6enliQTFLTEgxVm9KdXJKclFMSHRFSFhDS1RnZFd2QWE4MUJ1cnVIejRMMVdRZllRYUM1em5wdUdqMXhaZ0Z2R09CRHBYcjFqbTQ1dURZeFRpTUM1TFNQZCs5ck4yR2IxUWl2VFpJK2hnc3AzRzRLRll1YUVpSFR1Q3d2R0ZKT2VGNmtoME5zTkgxZ3RxVEw3ZlZuZ1BRdnZYRFdzaTBoRUZjUEtnQnBPMDF0M1hVS0lQb3dTMjJqSzFjcHRMSzJ0T3pLNmFiZWcxNEJtY1V1Wi9US29CbnBNaUcwS1R3OU9mZmpCSXF3TUp1Ujg0VVFlaU1aekM0MDdOeDIxQzZzMTYwVmxDam85RVBxTnpMZHg4SlRkUWZNa2dlQUtsQmFjRk5DOUJrUVRRTlRUM002RWdNMkJ0Sk0yK0RrcDZQRDJDTnlUSTZtTFVLTkhwVksydmlZM1hpZjg1SXhkYlZ0QVYrMUhxRk1nRXRITEUwZUdBWE03bjVwenc3MkdPRjYzbGhvNTlucEk0RS9HTEtQR2lZN1FSQWt3WUpTR2N1dEw1QWNnTEVVRlp4Tm9JOHlJS2JkaktlWmdkazF0YVlMemc1a0UzTnhKMHFIdEpSemppamk1Y2FDR2xGdCs5U1hFMklIZHFiYUtvOE1YQmpDdWduVVdOZko5MjZBOFdYOGpyQVk0eTlpL3QzRzhGallZcTlBMERtV1cvWDFOMHAyQmhaWTR0WnNPUWxaakpidG1DcFg5eHhRaVBhQ3dRRUR3NmlmL2ZoeHdTVjZEMDVDOTBobC93SUcxMFVYVWQrcmJ1ZFM4UTB6S29MREw2eTZ1d3NaT2FvTHo3UThqRGJSZHd1cGxnSHBIWG9EaWs2dk1SOFJHU3A0TlhKcHFSY0pTQ0hHTFMxYTczdGNiZTdpdVU2bmVMdzdIRW9tOGplSEFtMmhMT09NV05QNzgvOVJ6RDR3T2l2UTlRRm0zdndGMytvTjRhdHVFYUJPVzJpdlhMQmYzN1ovRVdQZ2ZkQW9zTkxYSzZqOVVTZFd1UHJsdHJuajVUOTdqemk4ZUd4TGRCTEJNaFoveHBpQ0JVampWMFM1SUNLWUpSZW45VFBaRzg2M3VUZktyOUlhV00wcjNrLzI3b3B3Zk4wcVd3TEJtYzhjQnoyWDJMNmN0eWp4cWFxVXZRdGxXcEM3eUV2Q0NSOVBhYk5sMmpBbUdhQVQ0bnBDQXAxWTAxalRwOWNCOE1NdFdHcSswL3AzV2ZYNHpib2JDTklHaWhEZi9vam1wbEhEa1g3VmRZUWc5dEhFSGVGY0dienNKdEpuQ1E5WDR3R3JLQ1JDcWhkTHVscVpQZzh6TnVRU0N2eUUvNmFYTTNvVjErczRQUHNvd0p0TnV2K2dYYlhzZWQ1cUM0MHBUOW5RQm9rSm82VHBVWlVMR1dIT0lzeDlkTDJXRzhCWXdwNUhKN1hsN0VBU1lZWVVESnNPQUMyQU9SMjQyY0dFWE00UmIyRVVCczh5WFljRXVXL0JTL2MxWFg3VnVmdjMxdDJuVk81L1l0bnowMXFMdlc2L0ptNy94RHExNTI3cjUxVGVYcXJlODBlVGpLaTN6eDNkcjlrYjl4MzhPK24veFZxditrcnA3K0wxTGF1akZ4LzlxUDNmNTMvYnpUNHlOWFBwd3o1aFI5M3p5MXZDN0RvNnVldkN6dTF0ZGIrKzVkUG5OUGZOY2Q4ZDhPLzV6K1oxZGJYYTNlOWplRDZMYU04NDR5KzRJeXltY1U5MHliYVc3MjlZeXZ5VWpzempaZXpRMThxZmJKNFlQckZURU9Bd0RVVDVBSmdqLzd6SU9Dd0NROGEzMHAvamNIWEZPd1JjdVduend5bDQ1SmZVMmdjbE9oanZyWDB5QU56MWRzY2ZhYklnS0NwSzRUa0N5SFAxc0pTZW5CYVh0M1Z0L0lBaUFnSkxEWGprN3paWC9tOWxtQmdDODllekRmd0R3M2tLTytlZm9mNjlFUjgwekFVaGdBQUFDWGwrTkxPY3BTSDhFRU1BN2MvNGNIcEp5c0x6UEIvSHoxSVA4NUJ5N2hHTWFFUXh1Sk9Nd3NQdGRheURJd29ucmhoRzNqT1ZYWVMwaEdGZVpzZTM3MXdySXhMTnJPUVlTV3lzaW1nYXZsZUNod2pWT3BOUFVNd2l3MDI2eGxtQ2w0emZoYVVZVVhkb1hPYmEwYitXNDNDZC9FS1c2OVZqTXA5VThMZnA0SUNORkRSNk1kOFNjMEtqbjVDNEo0OHdROWdNZW5RM2Qybnc3YXg2S3pUKzV4Yk0rbkJrZUZBZjN3SkNMNUsyWXB4V0ovS0daa2pCcm1FNHJudHpkRDNXWVl5NUlkdW5qbDZ4VDUvN0JyWTJvRFkvRksrZVpyK05VbnpRa0lVVlptWWRLalZ3Sk5May91SVZFY2ExdHZDWWtUK2pVTnR0YXk1dDQwbDIvRkpvSlBkamlONHR2MjlOU214UTRkRWhTNGFzbm8xR0ZPazNTMnlUY0JPeHM3bXdET25TYWtlUnFCMC9VTGJPTVpaTnFNUzRBWEpKeEZHUjhDYVdXN0M5V0Yyc0xzaHNUNW1jYjlHVmZTZkJuUG9jdkU4bmV6RVJQbGtGM1JxSXJiV3BDWjVyclNQZGtlN3Bza3hPdE94VHphQ2xlNUtyd01iY29aMDZKM0tSOG9qUmZOakl6ejhrWnVmTlpjZE95ckh5Y2xSNWxtYWkwdUl1RWtST1Rra3ZtMFJ4cnFTbmV3eURHN241VVpEOTA0OEtjN0lhSlRxRFREdmplS2UvNjdvNjN5OXV1YTdrNDBYUVZxaDFadDEzTlVsbFlMcmVlU0pTWmV6Z3pFNmM4UnkzdUdFWWVHYVZENDBPQkxtNWZrOFNlZk1tVjgzYmtTZGIwYTZkZGVnMUtxVVZNR0p4L2d1R254MDM1TVNtZU96RmtmYjhwSjdyRXZvRjFXOUI4OERDUklOZXowaU1GN2JMdzlubEJWVGZtYS9hNW4rOGl1c3ljb2tiaS8vcDlTTjFUVW9OUzNXcXc1dFljc2wwVlphN2FOYTY1K0VyK0F4ZGNobE8xeVZiVkpFc3FUWU02TmFzbWFTOUlQMGdNMm9lVmJ2Z0IzQTJ5eUdaVmtKbHExcGptWWl2WkQweHdRMUFVa2U2a25ZSHgzdG83VGNiWVZzQXllbEtBTmdhR2pBdlF4b0F5Wm1KQTJoaUFlaWMxOXhOdDE5WnQyNGE0a3RyQXpuSE5Od1VncmtUclo2eDBUSE0vRjdackpYNTQ0ZlY2L1g1NHB4NWVvSzJwZGxOU0RJcVYyc01NdmFVQURjaW8rOWMrMW9PcnovWENSQUlBQUE9PVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xOV9fXyA9IG5ldyBVUkwoXCJkYXRhOmZvbnQvd29mZjI7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R01nQUJBQUFBQUNMMEFCSUFBQUFBUGZBQUFDS05BQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdsZ2JoUmdjZ1JvR1lEOVRWRUZVWGdCY0NJRjhDWjhVRVJBS3ZuUzJWQXVCU0FBQk5nSWtBNE1NQkNBRmhIZ0hJQXlGSHh2VU55VmpXMGE4MndFa0pmcXZYaFJsUy9QNDRQOC9IOGd4Umd3N2hwclZmeEJFdVZzdGM1Sk1LZkd5OXQ3ZGkxaGFKUVVrSkZWM09mRXAwOUtwRVNmc0tKbGhaeVJlUWQ0emFqNVRWcVVFcmRQaFZ6LzVKUzMwNEJ0RmN2WUs5RkNVMW5pbG4xVHlYT0RrQ1BHZ01OSm9rL2NGT0wyMUJIMlI5bWN6OUZjcnlrWHV2Wm1CR1liQlh6QzRFMHFQME9RVXJmWjlUcXZmK3lEcFc1WVZRQThvNVNRRFFDcDdDSUpiVVlBOFFLQUY4aUtja0p4Qno1Nkp6bmc0cCs0TDhrTmR2VzlHc2l4YnRuZjVDTEg2RkNDZUFDQlZxUUNvekEzQXR0R2o0UUxPZ2I4cHprSzRJQ09vVElxR2V5QzRvRGlBaXVBK3ptT3paN05yeGZQUEg5SE8vVytac1prV0R6R0xzd0FEU2JBOGl5UXRnbkQ5dnFYTGx3d0hUNGFEdWcwQWR1UzFHbnZTZVNjZDB5Y29rYm9BSGk3ZFpmMGE5eXYvVGZPZE82d2xMRkpnVlZzd0Jod1NZOUdGaE9Zc29mM3FicnNvRXpzQU1tUmJiSmNLMWFTUlNPWXZHUkh6eS8xeU0rZXloMWdtalpZb1NRbkdWOUt6dG1oRU9YOXpJSy81RlcwQlFtQ2JDbGYzRC9zWVk2a0c0VkFvOFBoYTFmakdOMmpENnFhekE0UkJxUGNDN1RiT2V3bCthZForQm1mbk1FNllWbldvWGVKemJtWWRabDBkcmNGSjZ5aUN6TWRRVFpZOEVRMGgzOFNIU1hNSzcyY2N1N21DRytOQm1sY0RuMitaR2EzdWtxeFNmRHZPY1d5ME5rQWhNeHRnRTlMMWEycTZxNnBuVmRPajNkYzlyVEF6V2xuSllVWWhiOGlPR1FVVUh3OXBKR2RwSGVPRlRIM29qcG5kc2lQb0FNRUI0QVBzSHZ2bVcraldjRXJKNHYvRk5MYitHeERySlM2Q3NGUUl4bysrOHpmNmlmcHJrU0x5RUJFWGZiaHNKZ2lNQkpoYXl5MzJrVWNCQ3NYck9LRVVaVk9tQXMyWlZneG5SckdkMmlFN2xDakFtd0krQ1ozUWtoS3dWQ2JZZkpGYTNMeXpCMEh4MHVtajA0a0hUdTg3Y3VMQmZlT25Uenc2ZHZiNEhHZ0F1SXNRUkFTYklqcWpoVElFbTBUSWw2RkpiTEtYTW95L2x3WlZORVduSlhuY3FSa24za2F1VHM2R0R5cjR6Qk9lOWJJM3ZlVUR0dkdtaXE4ZG9LdWY4ZDRsTjl6MTJFdHU5YTkrQjBDRy9vZ21pZkpmWnltcEpvMmtuZlNTWVRKSjVtbVYxdEhtSkxRdDdVeDcwdjRrZEJTZFFLZWxQazJScFR1REdjOU1sckluaDNJaTUzSWx0M0kvVC9NNkgwWGx4Uk5JWFRuU1E2bTRlNTVJYkI2emZIcmhtVjVCRDZDSDBFMzBIM3FQdTIrbnVzYW9EVHJrVm5meXorWVVRSmZvZ0x1dVUvVzZ0U2Z4bEQyWE9Vb2ZRc3ZkUzB2RXdCenFuVGtxcThsbEM4dkcwVGJ0cVlzMStuVWhjbUlqczZPdU13eE5PWEFiTy9rWTBzRXIvWTd1YTY0bDNIMUs5QnNJRHhNVndCd0s2T2R1OTRuS005bE9WVGlhdlU4RUVlN3JMd0JUQlVTRytFUkxQSEZycDl1VHpxYXo2ZXkyK1hsc0NjOTFkR3lGdjQzb2JXemNITG1jd1B1ZktCNkZCOU5hWUF2QW9Ga0xodXJZMzE4Q2paMk5HRE9Pb0ZHTFFjeGdjMUpmbkNZS1VBUDhmUUM4U1FaTW44R0ZMNEZkTy9ZNzJ2SjJ6eFo2cVhoMTQxSDRieHpzLzA4RDBJMEF5RlgxQkNDQTlpeGpvVXd0OFhubWdvL2NlL1lnRVhEaHc4R3pCTkQvR1N0UnBlZjlXZFJIY1RFcWg5MEJZcHhKMDBYVlBFZDMyRlFCUXlOaDM0b2hNcU94YXJ6bzF6WktXR2pFQUM3Z0Q1TGRZbjNpenhaaENKZVBWQk14RWFFR2dxMkRMZG5YVW5OQ2E3NVlvMEhndnRadnllci9jUC9wQ3NvdGZnUGdLemtaeVl5cVVwTzVNVmNmc1FubE4zTktwbnFkMG9sMFlSc21ETUlqT2cycTl4NWZTYlpPaXAwbmVza3RhdUczOFNZZCtrS1RFK1owM1JmUU9NQldwUldrYW5Idy94S3VmdjhoazJaVmE5UWVoRk1xMUJMck1vS3JSZ01wYmVNWjc1VW9JeUFKR2t1RkNHNmt2Nld4UFlLbk1jdGZUKzdGbUJiVzBkNG1xNjNoODZxcktpdkt5N2ljVWphcnBMZ0k0SDN1Nnp6MmJWM21hUno2cm0zcXFpenlMRTNpaURPS0VBYSs1enEyWlJxNnBpb0VKcmU0ZEhGdW5sSk5nWStXbCthMXNtVGFWWEM1VGN1aERZdjVYYkRIRWNLUjJNRll5bU5qclRkc0VVSlNMbStLQ3kxeUJENmtzbkFFcmVxdEJoTWVqR3FoVWtjQlYyNDNwZnBpdmVzaWtoS0RQUkpzZG1QM2tXN3hFZDI2RzZEYmVGNlZDZWpRMHQ0RWdUNGNta1FySDZ6OEs4SWU1eG5qamkzTE1ySW8yWkU3VHNQUjlTaDN0Wnc2WUZQalp6TjZ5L3dWTndRVzFZSWdySHczTkF3RytJeEpnMlg4aWZhbEFvSTVFVFE4RzRxMmdONXM2Sm14OE5vZm95MXN5ZnNtT1d6US9ZYll0bHVKbzN6SzVUODdVNWcvMFYxTDQyY0lmdmJJYjQ2NUVBNTl3bS8xZUNvSmFPZ3lFRmJkNEN6c29CMWRybDJKc3BWd2g4WkdNZ1FhTGxZSW45UW05eG1oaFVQZm9Odk9IUTYzU0JyeTRzZ1dPNHlsV21jNnR1dFB1dzhtbE9jY0ZrMWdoOVlMalFydDBBbGRUbk4yZ2xqcVptdjZGUUVPNFpaTGFaSkpUTHNxRllvbklxVnNSV09oNjgySnNVVmo4ZEhCMkYxaEVLRmNBbTdYRzhueTN2NitXeTdTbEgyV0piaFRIMkl2MFc2VmlaZU82OXVqTVJpUlVDMTR3K3RFS0tvMWhCT1JxUVpqUGJiKytCMW9zczlJd2t2RFB0WGUwcE5sOG91amdSWkdkY3VKejVscDdGeDdjRnA3cUxpWWk4MjZDSUxlbkt0Z3JUSWtXUFdrZUg1Q0xSZ1A4ZFVFRlpWdWJnNGRvVVg5ODJ1bmJZbXl0bnczMjAyVWFMZHNwc3REcEthSEFzZnVaWHV1SmxZL0tHVC9MMXh5U2ZjK2FwRm5SQWlIOHNHc2ZFUXdSOGdSY25wb2tvenkxdnA3ZWJ0RlpjSnVkOXh1RFVZcGZPbUdyMFVoZENacGFTTk5uR21QOHpqTU9yYUdyZkk4TlhkODdDV0RzdHB5NkZmQnlVb3YxQ29XeHpaeHBJVmo4UWdTQXJwNUZkVzFiUDIwRm5YL1RPeEUxaHZzNnhqTm82RzVOeHJOTTE4NWJyZHlUTExibmIybEpOSjg5aFBtcThQTUpzaG1nV2VNSjBjUTVqdjlBTlRLdlFlTXVHOVdrSlRHZFR1WEN5ZVdRWVFWd21PeHRQQzE4MkxSSVV2UGZXa0tTRFlZR1ZSL2k5cEt2UEh6azJqNUFHbzdxS3ZsV1FHU3B3SkZJZ083V0J3Mk9Pb2Q3MW9SOFRocFVQQW1Qd2dsVG9kMGxGcVU0Mks4cExSdVFTNDQvWGNsbVJucklWVUZiVHl2Y2Q2MytFUWNkNnJYWUFMdHhZSUphekhpRGdxZVFsREp4bG96TzZwTXExaGx1SDdEWVZ6bFlTM1JKMUc3M3hFaE9rdFZXSHZaaUpkc1dXd1puMS9zRUZ6NG9EN1FMVUJXU3prdDAwVlIxZFlpZ2hLMGVrZk1TMDQ2amtzRXdXNFFaT2pnOWxDekJLMWpwbVRyRGJ3anAwaGdyZUZvL09IVEZ6VVhDVVBCUWJHbTFScHNhTjhmREJXWjJjNVA1T2xzcWFDS1NtNmpZWkVNM1FQV2IrWGNFOHhCNkJINExzSXhsNGJPdDIza1FOOEo5MVNIcmJrRWRBazZlSTBGaVFwT0tRa1A2eVlrSWFadGZUS3lZQkVFbisyRk9Ba2phN1FNRTNnUEMvSmQ5MVNFWmtNK0Q2QTk1dHE4M3pRbGpSdU5VNWM0eExiSFhZNkdkUkZBaEpYWERScWN6OGtTRVo0S0JCMU1Ga2pBVllXd21rcVdzYlV6Q0lSTXZFTVVHZFdaSmptRWxSb0ZCcEgzYmhqYklDU0ZDYU1EQXNmclhkc3BnWUNQdXluVEMyVVB0akZRV3g1Q1JJWjJCMVVBUDR0cGt4ektvQmprRElFQndZL1RLYzhmMlVjT2hndnB3cm1iUENHYW4xT2FqNzdyV1BSYXJHVjczb2dPejR5RWJxZkZHTU1mMlEzN3R3Um5kcUs4NHF5Q1FrdFFud0c1YnY1UXlRZ0VGbHpiOGlYOG15T3FjdXNUcWFjbWpxMHloVXVwcnJoNnBWUmszQmNXWDdBYmh3S3NOTnNXSkVVN0hmWlluNytpcHZYSTJld1pYenVlRWw0b3JSRUJ6anppRHY2U0xWWkd0UTNhbENocUdhME5CT0JkWDVCK0ZFcTJVV0tiRks0ZElHNmxSNkFMYitIcFFxVjl5TWZ3bEFYVnA0QTQyNUdXcnJoeUdycDJVaE5YYTNyakRSZzJZRkY0SzNJVVhQVkU2SERCMkJ0aWlxWVNVQ0ZWdmlLWERhcUltTDgxenRlT1JiUXh3cGpUSnZudnY1REtKUU1Rbi93cythUVcwYVNBeW9PdWxpbzhkUVZ5SjRvWDRnTGY4L2IzelJBSGNDOWN2YXdVWC9CN1dUT29ObEhkYUNwbnNtYzlqS2lBWURPdlZWMkd4VnRkYmV3dTIxMUZlRkJMcWE4RFFKTi9BQzM3SnZOSkVTbmp0Y0ExMTI1cHllNEY3dlRDcHJuYXk5M3V2VXFDS1kvRmhERlMvajVHUmI5MkttSFdVeWkrLzMvM1BJZ2tRYTU2RUlqTndYdXc3ejl0YnVlOGpsYVIvYTBIOTk1bHB2SWRHVXYrQjg4T2xaWHNVcHNVd3FwbzlhMG4zRGU4K3ZzdXE0ZGVDMkp6b284UjBua3VHZzIwSklnVTRtZHgyU1ZhR2hOMVhNdjlPQlBjZzJndy9pNzU3U2ExY0VINWRyWnRmcXlSUDIvVUNVRWk0dElORDNvM3lTdURlMHQ4RWRTZFpjTlVBeXJXTE40ODdRYm9nMGZUTEVVTWIzblRBTFNFT2NNZmZWb1NSeFJMcm5CcHh3UlNQNWtGbDBCZEF2OEhyWWY5K2h3K1RYcVdncVlORHZJbm01T0dCc1A4MmNvTmpJRGVpTjBDV3NPdWgxNUxBZEc1bjZwS0owSUlMa0prSWI0NXVWODhMa2VtM3BFWnhQMEZXcVpQazB3cXR2YmJIaVFYQkdXTHZucjlpZytnOWlLNkVXSXFHU3N6dkJMSU9jUWw2VU9qRG1vL1d6YnBpa3o3bEg2QlRqeHVGNDY1a3ZXQm9HQVJJb2EvZGhFRDZ5aGkzeHA3QVBUSloyWUcydWs4c21HYlB1M1BMZmNIRFlUM1JYdG90ZFpCVkZKQ2x5NXBnSHRTQWZmQXBBM2ZUbDRPVkFCZlNCSjc2UEZGaE8xUDVEb3U1NFpScEZPbE9jWnhhS01nbkQyK1VwMkZFYW9ZNC9UTnBuVCsrZHBjN1FiVnM2aTVsbkljZHkxazVQdVpEVDdYWmRpQ2NWSHFvS1czZndxcVZUMHQzSjlYdE9kbVM0cWhDK1c2b2c2b21LbXVMVWwxQjc3Y29lSHloMkw0UTdxaHNBZEJJSzIwVnJrMFBJL2l3ZmV1KzZoVDVNUVVlYkhDcjBtb2VIVWxvbUthV0dpaHIzTm5OeTV6OVJTN2pFamJBMStNY200NHN4ZUpvdTF3YkUraXlybWNoZmZ2ZTBoYjVhWEw5dE42eUxxSXJUdHFLWFdCSnB6a2owWjQwRUY0RmpqMlcwdEJBMjRpYUpxcENVeFB5ZVMwVEN4T1MrTEJUNlhwSzQyNGpxU3VLbUNHQ0hOZ2pGeUs0UGcxUm41bksxZUtILzNhcjl0cHFLQU5YM1hFeTlqY2pZamo5SXBBbjlqWGtVbU10VGlvaXBPaExzL1hrK1BLKzBaTmVvVjI0RmVWWHVSb0VheHR2UzJxbjZyeWU0SldBVVhtT3FhR0dqbU1wKzhrUFc4b3ppWHlJMk9USEsvc0pya1lLbHhIeWpIMTVvcG8weWcyTXFNNFBYVmVOeXA2TWpJNVljMHhLZDE4Q28yU0Q0QnZrMU1OamgxSjBYTzcwZExkV0lLVHdOU0JPNWRkY2ZoS1pla0hYQzNrYWhSeENLUzNvcGxVS0VwdCtpNXBhQ2RkUFBjN00wWEdsZ3BiR3RuM3BPekFFMmRQdG0zSlN2V3NrOFVMZU5ocVJGVUNnVDNWZytZT3hyalJSUlNvRDB5SmtFU2hqSFBNcGRMN3RzVU4yZWVtei9hcnBXblphK0Z5NzQxZUVYM29zcURQZGV6V0dQYWV3R2NranY3dUFXMXozRWE3cTU3S0pzTWh2c2dQcmNRbVZhK2NvM2tjMDNWNEIwUnNxWTFxUmp3SUpOTWdyZkxENFVmQW04MVlKOEZyRzlseUdqMTBLT0lvZmt5VXFxNS9sRTU4cjVXaGJTNU0yUXp4ZWZ2VzBNODJabmY2a2NZeFdlamFFNHFydUw1TVRGU2w5MlZLMXJvckhTVlpOQS9SSFQzaFhCclVTVW5CY2R3aUtpTnJmc3IyRnFPQk9aR1d3L2xCQ1dWd2U1UGdaVS9rdHJ5TjNhTlNxQjYyV1RjRmlDOUtGa0I0c3JXVy93VzUvYW9WVVVuM0M5aWxXN3NjVW5Ca0JkTDc0RWtvOEhJejZRZmNQcnRpUkFEUFJGWU1qVHowUjJ0VXhyOEZPY3dJZitqQXRlcUZCMEd5NVpIVDlUcW5aYUx6TFQvWnRxTk9Odk1VMnpVQjdjbzlxL0xwSGtaT0dQS1ZTaDl3aE82bk40MTdlMVRjaUZ3SDNSOURyamlmeGJUZjV6QXVoTTMrZS8zckNsekJqQnM1NU5zK1hOK0lSMXdDay9tZyt2UExXekJKUlJLTDkzY29tbjIvQTJ2VUJXc1QzZVh3eFdFWGQrS1RLOEZCZ2VZRTNHNXExMFlHRkV2OSs2a2h2VWNua3pmT25vTDFKVnY2NnZINXpnaVgrUlhrb1J5TS93bDhOS1JNVkREQzJSV0pRQ0dSZnE3T3dYN0sxRnNYd3hZdVRwa2UzOWRoeXQ4bjJ5ay9GNjBYclUrcWI5ZkNRa09LcDgvcGcvaUtYazN3MEhGaVFFMHBLVTVkbWU1Sk1IaHhkaTFuOXhOYTl3L2xvV0NkZ3kxY0ZuY204K0JhcnFuVDBZSDJLank2Y05CUEFQdnVBRkFLQnhsdmxkNUtOK1RwUmg4Q3lPY0JTUzQyeXJNQjJYTGRVd3NENWpMUTg5T3FKN29hdklGdnNlb1pVRnlCQ0pSZk80bGs2WVViTGFzQ1YyNHFGUFhvN2w1bzhackIxME5iREpNTy9iYSswL2g0NElhcVRRV3pnVEFveUFEL0ViQnByNTBEd3Jkd1pHTW9Pdkl6UGVvOGZHcUw1cWFLamEwQm1IN3QrQ1AzSm9pUThSTy8wa2ZrYSttakozSFFpWWVTYUx1OVQxYXRkcmRqMFllZTdVbFZ1eTJaa04rU01OWDI2TC8xK3lPLzA1d0dVamRMVnVodnZIdUI2ak5hVzNZWDNiL2czL1hmVW1iVE1VSmY0eDV2YWsxT3kyNlJkdDBrNEN6OG5DeFFkZ2JjZnJpK3VxbDYrZm12WTN2M1o2Q3lVRXRIZCtuNTNPTGRYVEhLTDk4bWR6U3FydDJqamZ4UjRlelcrN1A5WklWelNLKzFMbXE5UlMzeWFuWHpub2lpTEVVRXJ4bDl0WGFKdGZhWTF5Tjd5T2VzdWNFWGVjakR6YW41ZVMycHlNTzhhdVNCWm1iQlpPOGpkWEJ5bm91dmhXV2tpM09BcFlWVHVkTnlrN2tGOWI4QjFzTGNTVFZrS1JwZHE5dW1CS1ZHY0t5aVkwcmN1VURMRFNnaUw4T01BczY1alI3amx3c3FPVUtLejBKbG9IR0FHYnIzeVNIR2lleWZvbEx1SEhyT0NMZTVOMm9qNG9TVjhJbytuTGVxZjkyQXJzTUVKOFV1YXMxc3EwT0tkVlNkbnk5QkVINXBvVm1ZYU8xZkpxbXdMTkc3UnhiMkxzNXdDd3U0czR2OUU3TTJzWmtWZ0Z0TFJWdmQvN3FpdlFGdzF1anUvVXRiMVlhb01PUmpkNUpUREF1akRJaHdEVk80dDJtdVllck1BZjBVZUthVkJzTktGNGwzYnMxdjllMG5QTExmdGE3ZEpvVXhWTEVJQlM5SG1PZkNVaTcwR3FhWTU0UkRucXdzd2I4cHdNR3lSektQeEFYcEc2bnJsU3laV1BZU09vSEJPRzJIZi9nL1crcm94bGZaOSt5RVo5djFZRlFTSU9lRzhadlVjT2s2VEx2TTB0UDk3TktMRFJyaTRrOGRLZjVIeGQwZmFYUHJINDAvV2xyL0tVSFk0M000S1R2d1NFdnJoNWlwOVVzaEl4dE9KSkptUzhwMktFNGxkVzVVZnRqQm9XL2pTU1oxaGNNaXpaellZVXg3cG5pVTVYTlkxUEtCc0xoL2RQL2llMktEeFB0UStoUDVBeDUxNmppaEM3QWEzZGtMK0grUG42eDhESFArdG0za0ZpZjF4WUFJOWJIclFsbWNJRXhXSEJ2Y2NwajRyL3RNajVYTjROV2J0djFkbG1kN0NQK2I3N2lnSWxtWW9DSzI2eUxxYytOZytvdmJwVEFReUJoanZOM244dXRqL1hjSjFhL1UzMXpza3Q2N2RxWGxlbFhkdVcvNk90QnZGdmZZZ3lSWElxaHdPcDdPZTZjbEJQV0Z6NkswemRWUkVyWVVNYVlWUVF2WFpLaDhJR09xSEMydGQ4SUVsMktLcGlvbFBUT3RPc0JseUw2VHV4dUtqdHhMN2lrY3Nnd3hNUnNEbkhNZjVGeTh3NmlySjRuOUNKTEtQTFJsajJQcTR1aEFhd2E1Y1NBNEowc1lQOURXVVZYUlYya2RzSVRXRGJHRTRlMzJheTl1WC9MUm0zSFlaeGl0ZncweC9Ta215TGJVSkljQjNCSGtXN0szUHFKQnJSUmFndU5CMFZiYnF5SnRKN3lZQ1JTU241czdsb1ZuZUxDQ3BpVHhDdFlBNS83ai9NNldoMm5sNTVxck1vOGRxZVdhUmRubDdmQXJqR2k4MkxTc2lJVXUwWW9uNjJtUjRtYk16dlJXZkdSL3ZrZzBiM0MrWE5DUzFtaUxKQVdGUk9ENTVzU2NLZGRnbU9UQnJCWG54YjBsQVZ0VXd0QlhwbVl6MlFtMHRJcTlRU1VGWXhaWU0xOWVrSkhJa2xaZWpzZFM1ZGdXR0FMUVQ0N29jZzRZVWZhaW04U2J3VjNTck5NMXE3VG0wc2lLbWpiNjM0bkhEMWJMOCtmaTFuTTVTTlYvNWw2ZS82Zk5lMlMvbjFRUXplMzJ6ZFppZ3N2OUVHUjkyeVJLMVN5ZVBDZFVERS9XbGRaV2xUVEZCeXhVKzQyaWEzUjZsS3pUby9oVytpRVM0QnFEc2JwMy92ZjdBZFlhSS9IbW51ay9YM2FNdnFvUGR6bHRkaEpzdEplNktpZTM5c3NNbFBScWxQUTZESFFoeDlCYm1MdVRpYlpVMWJiS2ZhbnFybkYxaU1pVzZxMnE3dFJXVDg5KzQ3aW9oQmd6WmtndFJQWlVKN2tVU1dpMnl0V1NmTHQrMFVOYnphS0ZjOTBtV2RzSkNYUFpIanB3YXRFQXA0K0hoc2R2MFFqeTdJQ0ZiOWt4RFQzMXFtaXJEZHVpa0E4c3V5NkIrV1BQREs5R0ZSekFqWTB1UUxOSFU3QmRQR2FrMXRhUWFzWjI5MnhNSXI2c0lSS25OUmkxa2NLT3dmVUhLejNKY291NktGd0pMck03ZDlkb3hXVFpEQzVPVEUyTnlleHp6OVJLZ1pZR2VKQVFwUEJ1dTRCZWtBY05GbThPZzJmWVpJS3J0UmFTNDBiTXQzOHNNTGo3blBjaldNMHhJNmVpL1BMZC9jUDdINFJML1ZFTnE4ZEM0dzJSajgxMzUvKzlXU2tqOVRoTktZV0l4bGpiY2VQZEJWOXVzYVRDcTVXRmEvYys5OGd1WFNBc2RMdkdETGV1WHIvUmRNM1E4aXNsdWhOZTYxclA0QmlGckF3K3U4MUdpRHVqaFVZcFVFNkFCOG1iSE5HM3IzZXJCODA0M2dMdW5HNlREbzVSbDRSa0ZIclBjYzlWYjM1VERrRmUvaVhMZS9kUU1OcjJnTXY2TkhOV3RLWmNXUG5RQU1Uc1RuamcrcEZYRkx6Y3pDeVk3cmt4RVdjNUVDSE1DTDV4OFpTMjEwYjBNMU9ackhSR3ZEME45Sk43Tmgzc1RlL3lvclR3eXkwanBmN2EyZUQ1VTN6Y3k5YllVZnl5NUd6LzJPRDczMEw0RXlQV0dBUnIwS1k2bk9TenpsNGQ0b1l2SjBjd3FQZWJaZlNWWVhJU01Mc3lkcUNWTTFkRCt6eDRWTHJ1RjA4S1hCMWM3UVMrSzZuNWNXeXNVUE9tWmxCc2FtVnVKbkF5aFhHc3VjcHJNWmxxdkhWalJ4anQ0WjFpRUNGbCs5SG54Ly9mNzhTT3VKOU9ldGMwSzRtZDFxUnMvOUFTR0tHam1kbTNZUEFFTlhmQ0FCTVU0d28ydjE2TjJtM2lMdE1FcURhMjB2ek9IVWNrUXVOM3NQb1JXQTNzbytCaXkvbzFiai93enVDZG5rMGZDdmpmVDhLSHpUb1RsMGZ4eVpzQjAyRk1jRU5iVTkwWGRIZW5EeEIveWhzcThocnA4RGdsb3pnUlBZY3pKU0IvSDAzWDIrMCtiMDJiOEJmN2JCdzZXM29oRFVsRzJyQXhpRDRFeWI2RTdPOGZ5cVJzVTlRTStXd01lTTcwSi9lL29GYVVjZFlraHR1T3ZhUFJJRzdnUWJXTkJnSTFhazVmekJhbUNyMklTV1lWS0MvVnJIUml6b2xvckF2L2FWb0lwMm03SldDWldFZVZOSzlnUFRXWm44c1pGUkRBRjNSMG9IL1d1K1kwSEdJUlF3V2RtSHdCTlphQ3d6SzVMOUFIMW9HT3JwMGdGK1I2TzNpZU44R0d6WVNPQmRaM3ova0VSaGk3R2E3ODRDOThWaldzTmd0Z1JiYkc3b3U5WU1hQVR6c2FmcW5kbzg4OGhtNzRaUkxsTXFJL1R1eU91U2JQcU1nVjBlRnhXNHpqUlBUc1BTZmVmaUxDNVY0alpoR1FzT2FBNElvR01CemxPV2dpSng1bGQyUWtNZHFMVHcyY0lqbVZ4UHI3cHhkM0h5THFqVHNPMklPUXZ5QUo5dDRKaHBGM3RFcnZLWXp5cGNiTHBqZ1hNdFpjWTVPMDdIWW95Q0thSG94dWRpeFloUmh0b040emF3V3ZKWm1RUE9JOXdGdGVsNTk1YkFSeVYwenEvbHRSa0lKNVhDSkpEYmcvSThTakcxTkUxWHZleFBjNnZwVXJqOWhCbGdhNG5MTGx3cFcvUmZaV2k3TVNNVG02Y05pN3ZKZERRSnVCQVZqSS93KytFdDRDQXNUUm1BR05XMzMyMzNkdVg1NTNmWU03bjlhT2NBdm9oZ2tOZFExdnJyeE9wSHpqUTBCNWVlSC9aV0FEVmxSUlRWUFVvNGI2MU5LQWh0VFJpQ1pPbkRhREtSclAvSCtKc3JrbDZVemVPdE0xZzN3T0QrY3Q5OGVXUlRmdkxPUGVtTmxVc3dtSUNya2FreXN6V1VYU2lNaksyeTlTbEdteGFMb2pYOXV5eVowYWJsbFN3a3RwWmthUnpROERpTFV2ZHliWGdxWS8zanY2VENvMkdsY1VsVTdyeE9RZjh1cmRxTHZVaXgxY05uTGZyb2J2UEVCK1plbFJ5Nno5Mkg0a3U1UzNodmVjN3dIa2M2UGdkdkdmMm0yM0xQV3BTdW9pNlpMZmRlbDkyOVhNOUd2MzdleWI4K0xzcWFySjJjeUJjN1NqVzY3YXpoUDJuTTlwODlQM2JaL2NYRVR0MVhqV2wvOGhQYWMvNnNtSnZGdnBiUDFZNVp3MjhsVk1MUWppRXp2azlza3J2R3V1Y0JaK1hqaVRNMnoyQ3hxL1kyR1hqL1JkMXNrTnQ2RGtCSE1XNy9adjZWaGxLU3VQeFZMV0cxdW05MXRET2RDeVVTYXd1VXdwcUtwMkpBczhGZzhJWHNYcm1HdUNnT0llZEJuU2h4NGNXVllwejVucmttZlBSTkpBYW83NVpUekZOdEZlUEphd01qL21vZ0xScGlBOHBRMkowL3Q5UTRxaklPZnZIaFU0OXl1K3VwR1NlaEd3d0gvSlZCQzRKR0pKK1E0eXgxZTZTNlkyN2x5VVBXYzFoWmZWVmRjb2hBSi9VSmxuTC9XMTlsallXblZBdWMrNkx4MzVVbi9PKy9JV3B4aGFzQUE5UzR5OWphdlN3R2xWS2gwbkZFb3RtQmtxT05MYjZQOUJUOGVVRVg3V01TTDgwS1BncEN3NUtRQXNXTng4eDlqRUtkVWEvWk1XbEwzYUpYK2dORDZFYm5QRjFKTVFldkJkc0JRTmZkSk5BV0FxT3RVbVNLY1RCcEMrMGpJTjZ4MFVjMUNIVEpyZE5QbzVzNXkwRXNmUHlhbk8weG8yVURzSVBvaS9ySFdkTy93eVpOVXc1M3hmSSttM3hIRTZnWlR4TVlMMzk4YjE5ZndCb2JKS01zbDVZVjBZK2NGK2NRa05nZHk4ZldsUldFRmdxNnFZeFE1S1ZHSm8rTjRaZVNHQlVtM3JPQmVhRXJNb1JEWFVKYXdWZjczQUhhL1JyaDZ2Y3JzQjlhemJIZ25IcG9rMWVkWTNDd0VoSGIvVmR2SjRnNVNPZmNzdXJhdlZEdUE1eXpKR2J2OXNkWTdmTmw4c0lKK1JhdDN2eDA2YWdIcU05N3RmbnFLM01CblBsUGhHZENvOE1KR1pJNHlxeC91NWhhNTZYeXpnZUh4SWlWeXRLR2NtclMwbTQrdmU3VlFlUWFHdW0yWVNxQXFRUWsrK20yVXlsdmllcUpUVXdGYjR6ZXNoU1ArU1VrUmU4RWs4N1VvYmZ5WldDeDBMVGJ3WnpaQldIaGYxaFZSTUFyT2JoMlBHTjhpVUFSZW1aZENUcXNOVTYzNS9WNFp4SmtYTXdEd1d2VnZuUDlJUE1nVkxKMmlKRndvc2R6aE05VDVXUkZ2U1phNVYzblM3M09uSlZmWUtVNDQ2MGdVN3JIQjdTZXhTRlZmcndFajlSMlFNKzh3OHpXWEZkWFFjZjZWQzZqYUE0eHVWc2RnbDFTRDNoWUJwcmdHeHgrRUJOYXNPODNudFZBcU5pakVaQUN6amd1Y0owaWV2RUl3ZFd5b0dWYTdGMDdLTXBIMEJTazRQMzRDdFpzTmgzRnRaNHJxMitYT2dPbmJBRzlyVUF0bmVlcG8waWRXOHA2Lzd3dlQwSXlPWkFGdjNGV1gxdDdwV3FkNVFMQlRzd1NGWkRsMitLMnNCQ3dycndlVEhndFFZYy9KOHZYMEhWTG1pMHV5STc2cnM1L2IwbjlRd202VzBVa25aZEN4Sko0MmoxSmY1WGdLbDJ6cWR0cjM1bWNtVVc1eFRHR3hieVd5dHJXT0RRcUUxMU5TZ1V3WE1OZlQ2NDNvU1BoTVFBSUg1Tjc5NzUvVE01RDl3cTBYdzZLemZ2eC81NFFmOC9WSHYvM3orZDlYcGZrd0VvTUVBQUFMK2hTNDZkMERFRGM2ZThrbUsvYjdEUncrdUdEVkFkY0JiblhkbTg1d2RIOVdhUGJpdzNaeTFYbkI4Zi9TQm5ZSnFlU090andia1pYWjdxK1gxcmZIZ2YvbldicnlwOXdDandITkYvaGowOG0vckNqdFAyWXJaek82eXZQdjVyTnpyMWNTNjFvUGFPaUFiUFZDYjd6TFNWd0g2UUhRQllmT3A2SlVLYk8zR3FhWjN4cUdPNzJCMndZbWRnZlZuc3U5bitWcGVmU0syZnpCN1ZuelVqd3g1ZGpTL3BMVWgwTy9Md1d4OVZvQU85eDZuY0Z4WGlrNitYdU1ZQVJEdkZsejNLak1FWmZKRHczVTNOdlZiZWZVMlNEYWJmZXYyZHNuSFZjS3Q2d3lIbmlmdkt4OVJhSGlmcVg4RjBtZUNmazY5cXI4OEh6MTR0US9pMzFNQUZMMmdIanRSWUtUUmcydUFYM2lxSnFDeWh3ZU1vZzdtNHo2RDh3aFozS2NZYlgzaFBJVmh2SGVlUmozeGVSN0txZkU4ZzFxYVBqZkJJTzA0aXdDWExxSHpDQ0hkY0R0ZFU2VFZvblByVjVuYytsTlc3TFAvMld6eDJyUnFqUVBKaGRNcE54VEJjY29FWTlGcW9nUXZKYlhQQ2RhV29UcmY1T0VrMEtsVjQ1a04wMWFwZkZhTG1hZ2NUOHBNTGNqeDhReVBNZXZSNVZyTjAvaWdWQm5aazhOT2tOV0ZmYm9ycW8ySzdiTnFwMkg2UnVIQTZlUXNiOXNGeWpCazJKL3VoS045WHVQZVFQV2JjRzJxRmVCKzNZRlZ5RHNocHpSZmZyL05jcVdHVDA0R3ZEamJZZ0dHenZXbi9ETlJmOE1VOTg3NGNESktnOHB5dU9hUzV1SzdpUllsT0xxeFpFZm5HNFEzM1didFAvOWtESVhMLzdQTFpQNTBQbS9pMktrcEsyZitmMkxNT3Q3VHlPenQwVUZqNlFNNzNHVWRhcGlrTkUwT05IbnNiSkFrdDV6ZDI3NmpqdEZpU0t4akxLRzJvMVd4OUNyS2FGWGRVT1hCV1JZN1VIaFlYRkVYRlV6SWVhMGo1WktZbkxlOVdXRTlxY1duTVlaTHN6cVRDbXlpOW1nV0ZkdGRFV1U3UTdzajVMUEN3Z0JDQTdiVnQxdTh5bENlM2VTOUl5dkVsUVM3V1huT0IySkRQTXpmcVZ2dlhQamEyYTYxY3RZYTh3UENiTHJLM05pMjNoTU50NTc1eE01TlRwcHNXQWxETzJQOWtpaGNNWC9wNTk5Nm9OZmlhK0JwVHdzWGNGWmdwaXBQVzhmRVVwNHA4c2wyR29mcUtlZERKMWVKaGU3YjhmZDd4alY0VVhYdjJpSy85MFpVUkZjWHU2QVdTM0FqR1dYa0RUblpJcE40a0Zwc3dGcXNnVWJRNjBVbTB0RnZPN21NNkFSdTRFdE1haC9rTExaQkxHYXdJNDR5ZklNbmovQWh3bEJSaFo0djk4elowVmhKVjNqWjZSZ28weFBsdG00MUZuYjJsM1g5MU9qdEgraWJJSG8yZXZTWlp6QTFQeWcvMzkxM1UyQ3E4eFBNaFU0VGs2SXVmd1p6TUFlcE01b0xab2gwYytwMmRBTFd0UGhJcjdRRHlTT1ljdHozU2s1Nzd1UmVOd0lBQUFBPVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yMF9fXyA9IG5ldyBVUkwoXCJkYXRhOmZvbnQvd29mZjI7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R01nQUJBQUFBQUIwZ0FCSUFBQUFBTnN3QUFCeTdBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdsQWJpRW9jZ1dZR1lEOVRWRUZVWGdDQkRBaUJmQW1mRkJFUUNxMDRwVlFMZ1JnQUFUWUNKQU9DTEFRZ0JZUjRCeUFNaFI4YkdqRVZjdE5wdVIyQWxIWkpodUQvNndOZVJDVHV3MndyUXZsQVdHc0VET093QlFhUDAydDQyZ2JpV3NLSjc0OUVtNm8xVlB6TjduVCs3OTNkMlgyaTN1bk85NHUvZElnSWdlK0U2dGtDUDluYVVyQlgxUWs0TmtLdGVGV3hMV0pNSXlKQ2FVUnJSS2Q2MDNtL2pKQmsxdi9LWmI3L0c2WFdlT1FsMUphMk93RFVWZkl5MkR5ZUJRSXBZZTNoa3NvUkFHODVYNktmNTdmNTV6N2VJMW9rU2g1aVlGSXFhS05pRkNpS2lobGJZOVF5ZEhPWnJpTGNmaTEvNTM3VTNQL3dsTzJwdmFydTJaTUlTMUFLaGNXSXZlUVFHT0VJZis1YisvMURiTkZFOVZCSlBFb1M4eVplNzFjVnhXZDNLaW5SK2dDQUZ2MWVXMlgzRWZZZUdXUW92VEpyNW1MZ0FWeUNVcTlCYXBqMUJaa3h2bnZsTFBreTlvYW0vQ2pTR2p3SHhvdXFINnlPcHBaMFYydTlaVithVXUrQy9yN2FTUWZzQ3dvTXdDSEVPM3V5TmJ2UzNWcitZdmxhcy8xTnZ2cjJ0K3EvbE5aZ3FiRFZqaG9MQzA1b0FFTkJNTDZOK1Y0SVlQRXZLR2I1cE4zYm1IWUJSN3V4aUJoWklzYnhyYi9XVkJCZ3dBVWhYQU1ySVFKRlNvK1RqUUxJQnVRMGhJL0RaRHRPS280bG13SFpOaE9RU3BOb0pvS0I1dENYUTloKzVaZUErdDNubVFEcUwwL3plRkQvYVc3d2dQcHZmZWNrVU1NQmdDMEllaDhBWFNHcUNtYzJBYjNDQmpFQzZ6MERpMCtCd2thZzhQTVlNTHY2RlZWcTkwdFV0TzdNTFFCbjRPQ3A3MFdCR1RBQW5DZlRKVGljSG9uV1hZVzZ2MjhLbXZFeWRmOTc4eVZOMmY4eFIzdEpnblBpdW9BL05jYno2V2dxNXhwU1Z1aGZVZmZiL2JRUzhaRVlRS3VRQm9VZ25aRCtQTXBIOGNoS045cE9WSjQrZzcwaUVkcElVNlltZTF5bTBHNTdXdWIwTHNveUZOMXU3OGtoZXNJK2x5dnB0L0lnYitkWitvZWRsOC96YmVyUFBaSS84cnFPQWFOaWJFeEE2ZEtxR3Rpd2RFTmYxZHpFOUxUT2EzYnQ2U1d0YUYxYjNBa3IydXBwTDg1STlwSU9wNi90aTI3dVRyclBQdFVMZU0yeTczUVUzeVg3NDM3NWFYM2ZWLzJyYnhBWWhVN2hVb1FqSC9VRVQ4U1lnSWlkWkFncjIxekpBcTNvODlnS0lOUjRNaEQ2bzJaMm80VjJBZ2dlQXJZSllFcUdNMXpXOGdDYnkwOUVGRUlBa0FTOGdJU09ER0ViY0xETlRPM05aVW1RYUpDYXgreDVRSzBPU2Y0Q2xnQTJrN0pZaVoxNnJ5R0JySFp0b1Y4QmhJWTFzVmZzbFVwM2FpaFdZYk5ZRWtENEZwQjVQWkFFSWdFR0JBQVNXSkM2d3RrVlZaVVNFN0VXMWlKYnVZVlZBMDhDRVl6SjJWUTJOVXlmQ2xLMUdsWjdWTjBVRk1DWGVkK3hKQkEwTVl0aGFVTU05TGVTTUsrTkpZQzB6MTRMU0wzL1FaZ3BGeEZNNEwzTkFGb0o2ejVwcFFUbGVoczhQZFZxTWNwWTNJcnQ3L29BL0RSaVF6bTdqWk9abVptRnhjM05zTFZJd0sxcGZFK2NzcjI4Tmc4R1NHbEVNTFBLVmFKR0czYWRCZ1laaW5odzNCQTN4azN4NkhoTTNHeGFrREcrZHdJRWhFU2taT1FVY0h4RmhoRUFLbW9mQVh3aWEyQzZPVk5YRWhaSHdQQ1piZnJ0eUVMWHpyRi9lZlNoLy9zQyszK1hBdG9HQUpsOXpnQVVjRUJKVnlrQVdDUnhlbTZzNTdPekRTR0E2MTl0blFpQS9pbjRHRWdKQXlvSWFBaHJaeVRYRkFwQTBtUWNEUU8rcEthWTUwZXhrQ2huZ3lnazJ6ajBmaklyOEZHQVNWdzZWODZOYy9kOC85MHhaaDVMSEVzZVN4MGJqUzI5M2tBZGk5RHI5RzA3YkN4MnZuVnNPRGI1Ti9PUnBlYWJ6ZmlKYm4vYlgvZlYvckkvNzA4UUNBMWFpRVdjSWQ2ZmFiTUpRZmU5L0pFUFB2UCt6eWlTNm44QStOb1pITEIyc1BlWWd3ZXBkcXB0bHR0dmZETDNFRXRzTk40eW0vVGJaU2p4NXRsb3B5VitkdlJtODRUOVZOM3FnSk5PK0wweWJJTnRVTGpmTWJ5MHh5R0hQT3pOY1Nwa1hCbHd0Mi9jZk84akRqcHFya0hyRTIrcVdSWmFicFBkcGx0Z3FUV3E1ejdpWjk0TWk2eEt0ajZ6Mk85dHRZMzJ2bTVNUENuaGZWQ04yQnR6ZjluNzNOZlphNDdlWnBTY1l2RE9HcTJrNEl3U2pDQ3dIcjQ5V2JWTlhjWHd6ZGRmZlhsY2VqazZQTmpmMjluZTJ0eFlYeTdtcytua3N3K0xLNWNmejVOTEt4NjJWNTdvWlNsMXU3NzZoTG9RdW9KNU45amxDSEZIN0hKWHhpTmpyVGRzRVNIOXVEb1dHeDIyY0QyRUdSeEEyM3FzNVI0dmQwcWhzYzRCTjVyMmxRNnU2d0hHVVJUQjFSWmlvOXQyTHRtbVhIYW96ZTNtYlhsRUptQzN0a2NTaExlSG8wbFU4OHlxK21VY3U1eG56RHUyTEMxU2x5eXVyZHNQUTJGZTlrZzVUY0VWZFhsV2pSdnFJKzRJNmtwQkVWWitCZzJEUGNRcGV4MWU0TzlVYnlpZ3FJbWdQVmZib3V0QWMyelU5cTZ3SGhpemtTMTUzM1hYbFVhZkVOdCtMekVHcWN6ZjdFa3gvM0JmS1YyZW9YaXpYMzVsNGlvTWZGb2Z5U1JTc0dnd1pGQnJGTzNadG56YnJtRUh2T25pR1ZZcjJTQ3k0V0ZIMERGTFRpMUNqTDNjb3hGNGdISk1ka1lqS21NMlZwc1BVMnZrazA3QkJPdzdoQ0JoaHA3dHhSVVZMOFhMOFJyM2VHV2lKdncxUCt5L2hDd2gvSlpSajNSU3M5MkJ2Nm4rQlNtWXpxRy9lNkkxNkZndExrbkd6aFpkMzNXTXdFRUhFdG55UUNtL1piaE9LeVVlbEFQaElmcTljZUtkanBkM1ppeUN2VXBvS0hqRDlVUWc4UkRpbnBnTUJtTjlyLzFvQmF5eVYwbkNyV0dmRnQzUkMrT1VGOE9sVmp2bG1oUFhxV2x3SVFTblN3OFdYSkdMUjF3SDRlYzFUNEoza0NGOWozT3RXQjlTZHVjaGZsU2xZcUliVjRlTTdDTmhTV0xoRTBtZlA4dWVKV0tkL1p5VzdRQ3VIQ0NPZlo0OU56UXhQYUFsNUgvRFl4N1QyNjkweUJVUjRyYWNtSldQS0dwRWpwRGx3Q1NKZ2JYKzdiemZvM0hDVGpmcTk1WTdLVzY1N1dNeENNMG5iY2VvZWk3RU9oYlRSdGF3MVRZM0xrY2piK2lPV2Y4YzR4aUMxdGdMdThocWVRTkhhZ0wxTzVDZWdIMThGSlNsYVhTL0ZNMk84S0QzNVBnNVh1aUE2bWlvOWtiSGErSUhSdjFlM3BQc29QT2JsSk5KdnZkRFg2L2VUZTJLckFwY05WdzlpckEvNUFuZ0tyd0xDM2poVjhpTUtycVZ4MDBRcW00c0RhTGFGVXVOUjkrM0RPeVcxbWZMa2t1NjhsNzZOSCtzTklsbjNxNUdmejZleFUvSVNiVTlRUHI3SWdzQ2VkakI0cFRCR2UvYVBscEVQVTlhRlB5SWI0UVZPaVZUVkFlbGVoZ2ZVbEt2UWE3UXhlWWtsYkVlTWx6U3FTc3ZrN21jQzNoVm5ITzJINFVKdEY4czJBK3JIdlZ1Q3A1Q01Na2ViYzFNVllsV2NaSEI0MWR1cDhYZjI2VlFHSFhmaWdEajk5SWd6SDQ1b1Z1R3BkVXBUeS9NRVBUaG1SYkFQZ0ZXYWx2cXp6UnU0T1JVQTBFRjZEQy81YTNoZ3VQWW9naGgzWUxBQmZkN1NoSTRMWnN4VysvZ0ZTaUZFUnpxR05YTloxVnJHUW5Ud1VINU5WMmd4VU05ZklycElvTU05V0Z3YkttZ0NVMjVqa2FFMFpCejBQNHhkWFN3RWkvY0NIR2JnTE11VFYvMG1peXNPdTg2SlcyWVNjQmV3ZTYyeWpDaTNJdEd5RXNmdUdBVWlyUzNmRk55d2dLSWRub2VjQklEYTV3TUUzZy84K1Zaem0zNFJpTzZDNUJlTUd3MmJ1WWM3MHFMTENNSnNmcWNvOHg1cDUwMHc4cTZCaFgvOG80cEVkN0ZnUUFIbno0aERLVkNMVmhRYldvSjlqQVFXQUdsR0xrYU1WMTNyVkE0Q0F3WmhuNG82eEVNaFErbEJRd2NqblBiTVFGRVRqU2NtZzlsbDJhVk1ta2lCSXd6dEdZMUFWa1N1N3Z1R29HaWNQYUE2QlgrOWQzcDNIL2tLRG5oTmNiK2hZMDhKS3BiTjlVN2J6cnFqc1ZhdGhlTlNubHFKT3h6T2t6UmUwMnV0OWdrdUxBZDVSUE9KbEJaQTVaa1FEbkxid2F5QWxRMG1PTjVBLy9LeUczNVlFZVNpWW5KL0V4TEhrcVI0dnExZHNqOXF0QThZOWR1Qy9DeWVlS0JVWkVKaHptVzF4NVJrL2JMK1pYbi9OTHBDYmcrdFNwSTBES2I4UUMvcE5NUUtpM0VGUTRDbEhZR0VyQzVMeGxmRHEzMVNxeHlva3hBYkVxWElWdzZlV2NucW5zQmVldWRDWUNMRVJqYzI0RzJqN2hTbXI1eHA0WlpXTE5yYnlIMUQyRkdpRlpRVkwzamdOMTlVRllqZHNHK0RNaDMwNWYzVngxWUlPcnZKYzZQcVNGYUdUVHN3Njd6ZnYrc2tSZ05ZSERseldubk9BR3ROQXg5a1pNcWhwZWNRTWNkeFJQSlFOeDE4OC81SVFtdzNiVHFZcXZ3ak8reFkwZXBFL0Z6N2N1NWxlYzkwa0FGaEg5RXF4dDJOTExXVjUySG0yQW93bjNhdXBjQnlOYWRBakY3bFhtMUdOZUdJdTQ2LzYzUTF2WVFoN3lrVmRkelo3YTdyc3ZRNkR3dHFta0ZWNzJOd1JpWHlVS1ljQi9LLy96L1hpb3lkcVdnbytsaUlQWjliOE51ZnpMZG5MTXV6RUNPbVNkMnorMTkrUmtJQy85SFowcWxFMnhWbWpHRW9HS3Ryejd2WHZIS24yY1ozNzRXcERNU3ZZcVFWVjRHYzBFVkZwRWczc1RETHRSMm9NcFkxL0YreG4yN0JNdmROOG1QczFjS0Y1US95WjY4Sy9MNTQwWkVDTktMMnZqUWcrYTY3anZsdGdVODhOTnF6YjRXVkt4NXR0RGlGbWlBOThiWk9TcldiV0NDRG1ndThPY3FiZkdRUk1NMWJyZnRRWVlQWnU2VmdsZEs3cDNXcGY3NHNYYVMzRFNDeWc0bitEdExTVTJIR2Y3ZTZqV01ncjRVdndhc21oM3ZlVzJMUVpZZnFncUhJb2xXaE1qVDhPcmtRdlc4R1ZuZHpBMGsreFA2TXcyNjdxQ1NiZmg0UTY0TFJhY2VNM1hseDJIcEJUUXBDYkZnck1ud3kwRFpJNjQ1TWRUcWxFNndaWmRFVVYyZHVFQk51R0FGZW1hc0VsK2hQeW9kbU1BQm12ZnFnNURNZzdYV0c3Y0NnUURVdHdEdEJNQWZVRG9Cb0x3TFUreFdNd2RXWGpCZW9RRURBUlNndUFUSnFUUlJRcjN0UUpWV29NVHhwU29MNFIvSEV2RE1nb0JBbWR5UUoxWW9jSG1vZ2QyaGEwUXFxNEJTV2RsMTlaZHFaYzVuVVZTcHdlY3BYc3hhZFNkU3ErUVRrWEJjZzhFRkpRZnBhUWdNSUdCSGZkT3dVa3VGMlVJSmg4aDZRSFBxMUNqM1B3WHRjSUJuNXFVdnlxd0hXT1pGSkJvV0p0RTg1K1BTenZlU0h1eHo1VUpTd0RNTmhqdXoya0Z1VkEwaWNnSTlhcDJ4L2loYTlxak94ZnlEdk1xM3lSM3BoTjJvOUxjSTcrZDYrRHgxVGFvQ3BVd0gwdDJXVmpzZWxGcU45Rnp3TExjaHZnTEdrSEt5cGtWcHlucUFLWWpJU3d2clE0R2N0ZXJDY2xHM1B1dEMyN3dHbGQxRTdyOUozTU5wamtKWU1ua1RBQ1cwUkQwT0Z0bHA1S3RvQi94ZTRzTFVkamtoaWFTMjhXSTRLNUF0TWduYlRtYm9MdjhJMUdEd1FTd0FaM0pycE4xeEgxUEx3NUMzaUI2SmR6RHpVRExPVjZKVW9zYWdrbWkyaWlVS01YRlRHVkYrcmlDM1pQOE9uWUdCakhvS0xTVTdQb3BvYk94TGVUdCtXdzZlbVU1bHNWd21wMUhySmdrL1E5UzZ3eHlONlJGOWJBMjE1MlVhWko3OFJEbDJ0bDE4UmxtMXdlZkZvOU1NK1lVTDNzZG9FaXdLTVQxTFk4R1o0Qm0xRERVdHl2ZjEzSjYxcXIxM0d5dm55MlZiYmgyNjBBcC9kOWxIcHlBbnNLWTYxU1haYWN6MC9zRC9aZUJ6WGJFVExjM0NybE1qek4zd00vTU0wZHVXa3NVeTJmUlA1WTZNbCtpS3hTZFdXSHppUnhmWWUyVzlsbkVHOEFJNXlLNUJjKzhwT2JGV3RiaW1MV3VxZGw0VDZoODRkTGdMZGJPeU5UZXZnaWZLc1RIQ0JZa0g2RGR2TGwxbDJZemN5cmtSNnlLWGxzcjRycDRBTHZRUyt5U0E5YjNMN0EyNFcyUkRDVktLamd2TFFGbVpGekhIQjVwWFJvcG9lcGdXTUEvd2tXQXVUT3h1Wkg2M0J2bEZuc2F0WVl6a3pXMWRyeERobTQwQjFwcEJUZmJPYWFoVDVhcGw2eTZaMWJaZGx0TlVZZVBXb0FHTVk4SnkxTGRkbXhTRDhxQVNuOHU2emcwNzJuTlRpUjByUVFOZ0I5Mnl2ZXhBdkVUQW5sVk5sVFp5MlZ6OWFlSHQ2ZVc0MndOQytoUmtxaHIyakpuZGZIQmR5aG54T1RKTzEvRGtmeVV1VnViNmo4YzJzdmhxM1ArajdhNS84MlJBZXJPZG81dmMvR0wzQzVkczF2Vys2bXlyRDlwOS91YVB4dktZNmRMVXlYZWt4WXM3MmQzako3ZHg1LzBScWw5S2JhQXV6YUVPVTdPYkZ2QnZQeXZLV3ZqYWo1WVJ5bCs5V0hpQ3ByQlNYYUoxdCsvNDIyZm1hbTJIL1RveTMzWkZOVHNEQ2hqZkRaVUp5bTBOSk9kYjdYelhSd3VGajVndWIzV3dVeThaTjlNc3F3aDNsRzY5dHZqRWdFK3hjZjdsOGRQNVo5ZDB0VTF1NDNibUVvYVVVZFphOXVDWGJtS2xBNStCRzZZTytyNThXZVNZOFEzYkZiUG1CTG1QbEJ3Rnd1MER3ckhPdml6MVgzOTdRSjg2WDdiNCtqUkhBVEg2aDdpOFBjK3VlZWx6RkFoenZXT2tpcnFObXRZeDVQdmlaWkY5NXRmc1V2T2FBMnQ2SjA2ZHdHbXdVU0oxMHdrSHNVaXl3VGR6cGlLNXByeVd0QVU3QWtmbnpONC9lMTMwczVTQ2pxZzhlNWZaRVorai9YeWdMK2hsZE03NmFWSFp3bm5wZzZjYTVaa0R5cFFhWjRQQ1J1YXA3MDV2a1J5UVpLcmNEYlBUUTJybnFFVTczbzNkdjZOM0xYZmtoMHZWcXRVeTd0czc3REV6ZEVYMHNzWXNYOXZ3d2xUTy9EV1ZoS25scEsxN05ESk5yTTVRNzY2OXhKN2pXN1dCbjhuZndHd1NldGptMUphQUNJVXA3OWszNGtuSnh5ZEZIbVhlV2hEalN1am12LzJIeXpyOGVxQjVmZzBlMDNMSzFuMHBNaTI0UnRuRzhWaVBsOHBYSEdsS2RYNXNTOW9kekg5VTg5UGxGYWUyN09PY1dINWhhYzBmd24xQW1PTWRLNnRwMjZqcFhjdUZyOWNYNUM3OWdsTVNOV0lZWGx6cmwrcGZHclltVy9xa0l4UFQ2NllUZG9MWFNJeGNGN0M1cXFhcHN2OS9GQ2NzU0JpUlNHelZuSnY1Q1kxTk05VTU2UlA5RHorbGtzOVZ3K1ZGNXhmejd4WDRkNHZqTW0zQ0NPdlVvQkJhN2l1aStBbTU1eHRRMDFiMkRFa3ZFVm9jZHlCK0tLMVgxTWtmU2dZMXpleGF2T3NNc3oyNjN5REo3MVZUMUNIRjlMdkx5c3FwMGZFdTBlL3YzdjNGSkhUSDlKc1lVemd0ZFhONFRiNkRUWmJzNEhIejFiV1NET25CNXU3QUs3bXJPalRycWNzcThiM1VqWlJNNTZCMlVWcFJtOEtteWxHZG4xb3VXQyt3cXRvbnJNMExiMDhjSHJSM1dWSWRZWXY0Vyt5WGMxNDgwZFg3bTZQelVZZXJyUEQxeWRYNmR6bXBuUmJKNmFVczdhbUQ5d1JmZHU1Wm45YnpwanB5eGZyS2greStHTlAybUVoYWNkaTZ6RVZ2bkQyY0xXZmticzQyc1RUTytLTm5qZUdkTjUyOXByeThSWWJaRmFFVEV3dDFYVjg4emZQNzVvbDgybkRsMmt6OWJ2MktpdXFVclJrYjg2TjRiZDNTVlB0OHRkT3ZzUEtqb0lMZ3g3TThFcGR2a29kU1Q3UE5XK3htSEdPVTUwNDE1b3pYTGFUbjVGTktvdHk4UVdHYU1EMnpZZkJuRzA5YjBCMXFlRzJaa1o2ajYrbmlPTlNmdmllZnZxS3VUcnJROWFiNVYvV01uQW4ydzlib3JNVGo4ZlhGUzRNNkgrV1c3UTJ5YXgvUEdZeDRFVkxBZEx2aUl2djlaSUlmWkx5UGpzSmQzSFkzeDZka1djZnFmZXRyd2xlT2lEM1dQRTYvYXJla2VISDdER1M2Zk83MjJmcHNjNG5EVWZXQTFTK2xiWlA4YjJIbCtOaU8zUTNNS1hrcm8zU2VZTERKYngrTlE0dlM3Qks2TWtST1JmM29ZV3ZBNGllOUo0dHJKY1hTOHZZK1VZV29tZU9XS3JiOThPMytieVduMTNTUG56S08yemxYcmUzQWVxanZEcFlUcTRpazNxRjcrbWo3OHVmL0hleXIxS2VzSFltZnB2SDZZbWQ4cXh1aFZ5bDBXeFNSN1BrSlZ4SXpMZWs3SFoyK21BRkpTTW1TSDFibkw4aGJ4RDhVYmRnYVkySjZVdTlGbDhhVURjMnZEMzAxckxEN3phY0luNStkNHdyUHpxbHVTREptRWNiQkp0cEI1bkk4dm1xQVVTRlp1VEczWU9JTlZvbHB3NzQxUFJPbmpPYyt0d2RWWU01TUM3ZFN0T0Y0UW9OY3hCUmE4Vi84Z3dlMC9nRVdYbS9XWVA3YTJvbEJXZ3RQL3JzbXoyczBuakdMTi92bHFCTklVOUNhdTJyTDVHc01yVER3RVlDMGxUcnlrYlBWdVZWcmt0QmsyUnFrY1dvZlVUcXk3c0VTWjR0enlZUFE2aWhmSXR3S2xxMmRyMEMvamRtVC9vRkZ4c0tmNHJ5ZzVwcS9IcFJsOHcvV2FtUFVBZHFnWUMyUC91ZWVUSVJhYUUrRElUQW5Fdnd5WmVkdk9DYzZHV0hEOTRlS3h4Y1AzV2VDYUxxdElDQzZUekRUd2ZhZGZ4akxQNkFTbkVsZjlhZm8yTmdZM0xsTW8vWFVIOXM5VkZ2VldzU1VNVmZRT1FqS0FsQTZoeW9FZnFjUk8xYUJubjVsTVFIRFBZNUVSKyt3Z0FpY3UralZJdm9SSVA0Y0hiNDhwZXJod3VucnA3WGJsczNKcVZhRGVvNVRrcmJ4cXJodE1EZHpSZHZQRzM2ZVhmWDRicy9JNVNBc3VGZkpBZEVnOC9oWXdoZGxXV25SRm5oSXhxaHVEOVlVNWJUQ2hLMmxhTFlCYXl2dVYzeHBhc3Z2ZCswWitmQmhZbmFmb2hpbHhlc1kzaEozakdqcE5Fb2xXajVGakpiNGNQb01OQnZ5bUt3TkJWbGpyTGFVY1pwc1ZtTnlWS0s1ejNQR3B2byt3RXA5QVliVnhZUnRUUXJmRk5udVVId0oySmozc0NtMXN4VEdaSVU0T0pNTE1qbVpDbnVFZzFBSlBVeGFjTzhaZ0w2M1M5NldlNEdxZVhFaFgxWnNOYTAzQzZOVHIyYlREb3NPZTZRRlVPZVpjWUprdlAvd3hrb0VFQi9iOUNpcGo5d3JnTXFTNWIyYkp5KzE3NzQvN3VyS3pieVhQTnBjOHdncGpxT1NTZm5wbUxjMEF6SDg4dFA0TjRWYVVoZmdsNFNUY0ZLanViSFZlSkthRnFFakx2bGh1WTF6WjRnRDhDSXRMcmVIM0RleVRSMk41NU44L1BPenkrUXNQem9PQWFQUG93VG9UZUVtZ1NUT1lMUXlHSG0vUjRFUW1KQmk4b2tLTjFrUHp5S1ovbW9mU1Q4Tm1CNm81WlNvdUxpVTErQVpSN2RMZU1id0UxQTBLcGtxRlkwMjJ1OWgwSWo2MUhPSyt0U1pJKytzb1ZBNng5TUttRXFaRE5GNGtTbk5XaFZrdUV5Z0pBRG5XWVpITStHMEFFQjk5YWhmTUhRcUVmZjNBUkQ1czhzZ2o3NFRjVTlqMElWUTJtUHdLQ292bmxsdG9sTFEwSEY0R0g1UUlEUGFWNkRUeVhTZlp3Q3haVHBNZ1ZhZHRPbHgzTXA4bDBFVkZpZDd4cWg1Z1g1RlYvNTZMSTRFWVNwWlJBVXUxVUdXMUcyWklxRllEQ2FvdjdFUXArOFdaWWVFaHNMS3VKdkhzQ2NRSW9zSWZSRnVGRGRqUE1LaEw0T01lRlpsRkFyUnJHbWZxQUU2aTFCMUNybFN5V05udmJ1SXk5VjNHZTQvWlhnajlXaFduaCtUdWRoWEtLQVFZNm5FODg0ei80ZmdXbFl4QXdNRlRWR2IrYzZYRkU0K011Yk5qeFVyZTM2ZWZLeFRtVUFBR3FZOUZXVks2TEU1K3BnWWFrQm9xTVRQRDBiMU1pcEcvZ09jNEZ2aWFacnp4V0lnVEU3L1NFejZ5TWdpb1Z3TzlaUit1WFMwREkrRE1HQU5WRUdsWmd0VWpzMHlVS1ZTRlFjQ0ZVQTJKT1UvTm5XTUlYbmltc2s0cWtrMVdKNDhMYnRuY2NqRkFMVDBVUUV4aTk2RDBVMU9hNHpqNDRFWXZRYXJENS9QNVM1SCtDVTZmWUdBSkNHYkV4N05JR0oxNituNjhqMENBUUFGMG83UC9JNjd4VXY4MHpvTEFJQ1hvemYrQnVDam5sQTBwdnJ2dlVSbEd3QlFBUU1BQUFUdzE2VThZMCtJUklObVYrR2Q1TWxIL3NORG1DcjFzRmNrd3pNNEF4RUVGVWRMYXlVMXZLbDZ4b05oZDM3MDZmeVdKL3lZVDJYU2QyZGVMK3pidjczem44L3g2TnFISnUwWmlmc0Y5MTR6YVQ1R3diczQ5cWFqNDRXSXM0L3pDSVhJR2ZMelFSWEdBR3pQc1ZqZUs2dnUzVGpPY292QWMrR2QwSHNNQytrTWdPNzZtUGgvZSt6ZFJIZkIxTkJNbWswdjBtczB4THdHK00rcXVLczRYOW1PUUFEWVpnV3hXZ1Jnd0tlM0VmQ1ZiM05SVURoeTUwSWVaMnpIZlE4V0l4QTRoRmpVdkxLWUFtYWppM0hRQkZ0TWdEeUJpNm1nVHZJaUxrU25aaG9DeU5CS1dJeUFpYlllaElmSkkza3k5NkV5bWFmUUQzdnQxNlNiYklvK0h1MWF0ZW1rWm1Lb2htb2xCbTBPSGFiTU9JbkNZdldFSFJzV291Rms0MnpWZUE1VGRjM1laaWtQVG9ZNDVSdE9FY040K3FIVXFoM0o0NVVHT28yYm5LamxNMDZ1bFFtYXRRaXBrM1Rxb0hkQyt4M0ZYS0hSb0ZOdWI5Vmx3bVNQS0RxR1NudUNMQTdNRWh6alhIR0lTTmhqaXJ0RFltbUYxTENkQVo4THQyOGhza1NJZ3NkVUk5MXFTcUpLNXhnbnpFQWN0c1pxSFRMbEsrUHNuR0FacTZaUzJkSGhSUFVnNWhoODV0emR5RWttUkZHZ2dIQk8zV1ltYjBOdzBYc3JzYy9WNSs2T2RaQmRzVjZkc1FmSkR2TWowbU9XcktubWxDa1dyOGt4S1pPaWFzaUpVWHBDdEdXTmo3YkdtVkxhRGExa20rRmhXZzBlc3NXUVFUWWJKZDFrWEJGcE5EcklCajFtMWV0MW5TN3BXaDFxMWVnaTFUb3pXUldaZEdWRXhLcUlpTGdqV3NueWNJNlVoYThpUzhObDdRcExWa21vTGc3RkxHZG9TbEhJTExJd0JCMnpaZGZxZ3VEUnlnL1NlVUZ5U202UWxjd0p0TElEZEphR3JVeU56dENzU0xINXJ5TFQvVlBTeUVka0txbXRaTVJLVVVlUzFhMWtrb3Awb2grbEpDZzlaTHh5c3ppbGc3UlliNWhoSFIwbHZHeWpJWndNRFhHUUlTS0ZyRXFyaUNTRGc2eGtFRmZlUHZWQXVaRU1rSkdrUnVibFQ3YVNhdEpLa2txcHVFb2xWWkorRWkrbDJFdGhrcEdWMGxpeHBWSU9odVFQTHBJbGk3MzdHZ1V1SHlQZkpYRHozUndUMjBXWWNCZmJqYnQ1K0V6OEY1ekM4M0lYV0NhbWkyYWl1bEF0dUxodXBwdnFmb3Y2Q3hVRDkyU1lDVWY5SXBBNVVHS2l1eWdtekVWM1kyNGVOaFA3QmFQd1FVUXJnYzZoNFdNbDRYbm5hRjVuM2pGR1llVXh0T2hZVUxGVXRoWlZIS09tVnd5dWlzcnk0d2d0Yzg4ZkdnSy90THhqdzhYbEp5aFFJKzdqR0paZTVMSndTaVN0QThMaHNRNDdaczVRQW5lMEhkTEJxQ0toWGxTem1LN3dSZ0tPQUVvbjMvUGVLWFk5T3hjcEJRPT1cIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMjFfX18gPSBuZXcgVVJMKFwiZGF0YTpmb250L3dvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFCd2NBQklBQUFBQU9hQUFBQnU2QUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHa29iSUJ3OEJtQS9VMVJCVkY0QWZBaUJmQW1mRkJFUUNyb1V0RG9MZ2c0QUFUWUNKQU9FR0FRZ0JZUjRCeUFNaFI4YmdqU3pBM1ZLVk8xRVVTSTVSZkpmSmZCa3B4cjlBZ1FUSk0wVUNSb09QOC85eGhkZFpuR2wxRVJRemxNSlU0bnBoV1ZpdHJaNG1Damg5Z2hKWnR1ZjU3ZjU1ejdlZThCNzFCVFJmcGdMSGVhZnJyV1pZb09GbmRoZ1lHN1RGYXRLbDYyOTlrZUVYM2orNjU2ZHQzdjNmWXdnYXliaGdLTGdCeEZHRUFpMWs5TlVrbTFaeTVMSC9qMjgwckdOVUFIdDNRL1dZVUtLUURZTktub0hvRFJXcmRuc2hsQVJiblhyQU1sVWpRNFFDUGYyZm12S2t2eHVDL3Q4WUF1TkNudXNGd29qaXhDcVZxYVc1S2JJZFVod0dOUTRRN3IzcGlCU3lVSHA5Z0NlQXlCS1d0L2o1L2krcmZIdjAzRGsraGYvVDJmWmpqVFNTb3RIM2dBZk80QkZkUTV4MGFkcE5GLytYczJNdEo3Vjd0MVpDM2pvQzZ5UDdTUHlRZ0RnOVNtSkRwRERGVkNYVk9sVE5xbFRGRjM4L1Y3N0RxaHhTamVNWGtwNDI3N1c3L2ZUL2x4TUs2YTRpa0JnUk1TeFordlhlek1EQWd3RWtINzFzMkJBd2hSaUNDUXNJTEJoRDRHamNBZ1VGQkJFMFVLQWdBVUFJZ3hCQUp4S0Vidjg0RkNGRWppQUF3OHhHZ0ZOaHZ1WmcvZ3M2YXRSVXdvelRrMWVpVGp2blpldE9lK1RWVk8rTkZzTkxzTnhBMXExR2dEQ0czOEtZSFBXdzhZYnZjWnFTQytUQWg1VVlyRExZWS9vTU5SWG1QUUlaL24vQndFNGsxZ3ZBTnJodUVsT25IOU40bEZKemxhS00zbHVzUHJjbWtKRWNmVm5ZUTBDOTM5cDZwRU5TNE5NT09RRFlNZ0tja0dLb3puQzBhcTF2THJUc0ZyYnlER2tsQWVKc29Od0tJd2tSUEJra29pRnBxRHBxQWp0UWlmdGZySDd6ZTRmNlJHakVRQmhTSVNtb1VLMEU1MncyMm4zcTkzdnFuKzZVV2hrVGY0d2VXS3laYkxxWThmSEdSL2IzcjhBQkdrQktRYWFPQStTL2ZVaUJ6RXdmaXUrejNaTVNveVRoWnZOK2Q4QndFR0hyWDhQMnErZEg2SGNLanVzZEFpZW1BZFFwc2RtSlZiWVFtdXY1VFVIT20yMlc0OGZvVXREeVFYWFVuYTd3ODRRTURSMWxVMTJKS0pEVG1hYjlqdEsxcUxWVGdoWnZ0cjBkblptSFBvZVI1elFZWm1OTlFlcTZDMjIwaGI3Tk92V2ExMSswOGY5Q0ExYUxMR201TkJJTDM1dmEyMTJvRzlOTFVHQmVPdjhzTzJzQS83aG16WnVXTCs0dTZ1em83MU4zOXJTM0tUVE5qYlUxOVhXVkd1cUtpdkt5MHBMaW9zS0MvTHpjbk95c3pJejB0TlMxVWFpZFBiSjdlUEplRGo0L0xOUFArbjN1cDEyOGVFNzJkWm1JNDFwOUladjVsdk5SaEtwMkZjdWFydXBESWRWdUlQQnNDSEkwT3IreU9ZdHBiVlRyQ0hReUIrVHdreldTejJYNEVreWhIWHpaZjB4OTRlbHBWeFd3R0NQaVFSTjBvZHF6R1ZBMmlOMG1iNzRsbmJYckhycjBTbnAvVndtd0V6aUxJSVBWcGVvaUI4MmJQVG5XUXdieDFnenJObk80M25SQzY4KzhUZFRTZlo1S2JWQlNuVjVNaDBQVlUrNFJ1U1ZGdXdYcnBQb0FndmNaeHJYME9Odjgzdmt3UlVSTEhnNnNGSUR2TEdTRFJwWlZuZGxGTEltNStyaXBvM0ZDV0xkYkVTU3dGaVgzbzlHU2UvSFMxdVhKNURlVDloZnlDemQrR3NYNjIySENWTi8zY0lLQ3ZUYTBDUWk3WS8wY0x0VHRmaXBYdmRMSit1cWFoUTVEWk1IRzRsQmZyb3l2WkdaR21ab09tS3M0WWIzUFF1eldlUG81VE04Z0RYSnlYMHlEU1AwenNZdXQxWXZOeTQzTDNlV2RwZFV4R0wrUy8zTXYxQWdtT1FNeit5bUdubWhvL1lhdmY5NHZhckpndEZKODBCT1BmZFNScks0TXkvNWxXeDgwZU1vNWxXVjl0ZE0rRVpsV0VoY3ArL1JiT1NSSm9hSHRqTXlJQ2dFTzcxVFhFUVVwOUlKR1Z2ekRxKzAreWpYeXNNSTIwbXlQRmZzWXZWTGNwTEg4dXltTCszRGNyeTUxNW5qNnRyNzNzaXdnOEdXNGV5NDVFR2hXM0hoZlIwTWpRL3ZyalBWTGRWb3padnZMR1dGZEkwTUVTd1VaSjc3N0hzdm92Kzk5RHc1ajJqWGRwQzQrVFZTZDYyTVhTUVh1aVd1R1poaC9odk9PYWZYbnNrNlQ0a2dBM3VuRmk2QUt3Z0hhSGV0b3BaQXJkMXJhYk5CZVlTSmFUVWIvV0dVejgzZ3FZVUVMeU9KTGNxdXZCK3FzSm1scFJWcktYOWpYYXZsckx5OHFQd3l5bjNJenAzcmtyT3l3VTRPTklNTW9VR0FKWCtIWldsM0tKUFNTdmJpR1k5dGxFdFpwU29vcXB5UzJZcjE5bGF6a1g1SVVyVDZoc0tWV0pyM0VhckZidWFhazZubmFlRkxnLzIrMXp2d1JYQUpFWEt2U2pkTGNhcjBjVDRMd1dOMVlRYWxJNnRwNW9aTkNMTjN4M0pxam9sZEJJVUtXcVg4UkdJaXErejhFcExmcmF4dlJQRVk2cUh4eUYyRkpPZUxhT3dwSERpajkwVUJMMU1TenZpWW4xd0hXcHUwdWZscWZLbkNBaVhzK0dOTHJUYzMyYW5TRHBvL1VDdWp6cWtNMVhoN01ZNk1XMmRmQUZ4WkRVS1Q4dkV5SU8vSWU0UE1sVlpTTTQyMENBTU1sbDR4aUludEI1V1dvaURqK1JEMjg2Z0RibVhkbVRsckFITG5sZXdCQ0hPREdqM0EwZ0tLRWxueXROYWhPRkJBTUlSbDk1bWRDMDRNaHpuWSsvU1l3SjU1ZldFSUNLZW9uTFZUMlFaOFF1dDExaVRaVHp1ZUkzV0JzT2dOREE2a1V2aElaaDdnbkNYT0w2dHV2V0ZOR1JYVTNTb29BQzBodWxEdWhKTGFOaGN1aFh0ZmhEZzBjWEg5UFdrU0RjZm1oVElPWnlmQXdtSkVUenBCakhjS0k4b2VPcUFGTXJnb1QxSjNWZ2lsbzdvK1N5VFVpcUNMUUNzUjZMUG92aDRvS2RHR0ZTN1ZkU3BrU21QRjB0NXBSZ0x4NnNpUWN4UjFoR3RTaWhieTdDOUhPNktDMDBhd0F0VUZwTlJONEF1YU5PWnhsUktnRVdUY0NRbjg2S2Jxb2kvR2N1Z1pvWE4xa0w0eXNITGRTOWxBbytIWXQyOFBVTmJjOVZSMG03RmttVXlFY01HQkdwdlZpMmw5WkxDbEx2cllZeHZ1UWRtaThIeG00dHdqbTJUSG4xa0dhMi94aUtnNk4xRTEvTUdobnRwZjBNRjZYU2thelJ3STQwYlc0L09mTSt2MzNoQnNXb2pTZ3BNQ1psVUFtUVRnT3VsVGV5SUZOZ1VxVmxyQXY1Q2dNQi91U0dUNlNHWWRtRm1RVnBQdDdzZzZ5N3FmZlZybkRpeGdxRTUxYUJFU3RQREZ4SlZod01xdXFoVzM5U3owcjd2Vlo0YTVVaXRtc2grb2RXd0tEMHZnNElKWVlpRUQ2SHZEOGptSUd4VVNMOU83Q0hEZlNNK0NHeWQvdVpPYWV0RFAvaEk1N3cwUU1LOURpY3RiWTF6Y202VlJ4Z01yOXdVa09JSWJFS2pMVC9iQkFHYlZjdzl4RjA1c1k0SzA2K3F3cmZJc0x2OGUzbXlsT1dKOVpjak9VVjBZLzNXMHdKWmdERmQyUmgwa0FJVndncnNtaWdmM1QxRUFaMU93UFZON3k5NzhXQVVKY0YrS1Jwb2R3cWU5ejZRb1VSSExwaVoyUmEwNkpLUU1Dc2VjZG5BYkRpbHBjVGtTb1J0Q3JSSzN2d0pnTmUwQlJKSnZtQzhKZXluTTRORjQzNEhFallTeTF3MkYzRjFqVDZkM3MxQ0NVeUtiS0ZMOUNjTkRWSVJCTU1zakdQejAvM3ZuS1RSYVJ6ZFBBYVZvZlEzKzNTZVNOM1BLM2lUWk1uZVduZ3lhMkorQXJlaC9rTlN3MFZBL2hHby84T2lPODdISDV0dXUrS21IeFp0TEpxNUw5Q3hBYThyaGlzOUhIQ2pCenU1Q0Ywa01pZ2dmazc5bHZOZGEyQi85UUY3ZHVMU2NVWHFhbktyZk5QaFhZeGNzUWNPZXFpTUh2TlhGTnpadXVXSzZhRDl5SnNLVUhkQTh3aThBNy9oc1l6eEtsanVpQlphR2JHS1BCb21tRUVIQnpwTDBqNkg1cDh6YmFueXIxZnpLZXNaL1JrY1FSU0hRMWZEamJ6VWZPVFZjK0R1dDVUQ1l2ckJlQmNBNTR6ZWRSSHFMdWo5VURiYzJBeG9FU1JPK21UemhaV3BEeWoyNWtNVC9oT1RwdlM2T2xGajd0djdKbjV1cmxhT3ozZlFYaGwySXg0eDdyMWZhdkdzSWNMVmhhL1NmS3dzeXg1b2RvbkxGa0VCR2trM1FQT29yMW13Y0lHQUJCeWpnQTl0b0JDR2twZDBHSWg3a2Z3Wlk3UURFN2pOWlpiT2NiUEwvV1FBREJHanI1dkNHRW1sTW1VUzRDaDB0WnZqZmFoUlBCZGlhb1BWeWJDUE53MDJFWWk3T3Q2TXRPRGh2M2hFTE83NVFJT1diVHJHeUZWb0xwWTRTVTRxR1Nrd3RCZlNKa1Fnc2NaNXBpaUNKMHRHTnhTbWJCd2V0dHZiM1d5Uk5FZW1tZ0FBVGdnQVgwbnBHcHgvV0ZOWGorZXhSMURZMlR2ZCtIR25Rand6SXp4MGFReDJqVkUvL3NJN1UzNmNzK3hLeDZRbEt2U0hhenZvU3VnR25DQzNkS0VKVGRNY0dCdVlEZFhud3Rib1pTTmM3QURpVlFQVTVkdXI2eG5NU1Vkc2cxZE92VEJnYUtsSnFFaHlCZG5ZQVFEQlFNQzRSTEtLeElWVllDUWRmdTZMalVGeDE3MHZRdjZCNlhxRzIxenA5dnlhc282RWgraGZVTitoWDNoQVNnejdZb2NXcWJpRm9QTnpORVRvNjdkVEFnQzI5WnlneGcyNXcxT21DOXQwMW1PcWRxSU9ENjNZL0NwMEFKOFZkMS90eEJQVERIeWdlUVNHYXlLSndQdkF3ZXZsWHJMYkJ3YktlVVZiSFdPWFR6YVEzRHlMMCt6eExBdzNVZ1p6c1N1Z2RRdEZDbE1oTDRiUEJ1QmY5Q2dyZHFDQlpmV2NDdmV0bGNOTmVPK3IyRERVR2RnNlF0QUZFODVRdnBQMFNEYWp1azZJdEZVOUpTKzBpWDYvdnJNUlhKL014YTB0dnBRWVkwb0IxSDNqSCtqcGxYMlJic2k4QjlWQmFmZldVRVhETDZ2dmZjVUlIN3RPOUE5cFlCZDM4M0lUYlE5NDA5TFcwdHFTR0V5OWgveUVDRVgxcUlBQzBiZlVQTGVnZEFIMS9zSkpLdVA4WXRUMmllczZLMFlZTDJ2N09DL00xOTBrcE5zbkRsdHVPV3E2VHc4dHA4bWdmdjhUdEllOVNrVjBMR0xsUElVUENUd25peG15V05PdVh1Z2JUK0JTWHJoeTBraDdBSno3dHpQUHcwOCtQT3Q2OXVzbXg2K3I2L01OUFlxMWlyUk43TmtwaXpJTHJqejJ4L2xNR3hIblorczZSakxVWnRwMldEd0EvUFA0L3dWUGZlbnRJSlQ1NDc1K1NmWWNuU3ZiZmp6TTc5R0ZOck51VjhaRnBsemJHeVB1K3VGd2tIRjF6NlBEd21nTGhaZXZ2Ri94M2VNeFF6QlBGN2p0L2VrdlRMLy9KZGFHVjg1L0hqNXk1Zk9maG5lN0RtWEhIcTgrSzVnMTN2cmxnVjkzcWU5amRybVB4WlhPL1dPK2x1cVdjS2QzMnphR1ZVY1dFUmRVOFpYUjhVbENNbTlqRWFXM0tuV3NuYm43VHlPemlqT1hFdEUvTHlOMGNrclM4YkMvckJKZDlsUjIwb3JHcUltR0xaNGk5Vi9NaTV4dWZoYzNmVHo1aEg2Z3RUYTlLVGw5OWFkZHVSMmRsNnJMN3VxSjM2d3Ird1BvdVBUeFV1TU5aNWJRNnptbTNmY1gyYi9WdC81dzdWWWNOOTY1YTNMWHRtR0JMTUdUTldWc2ZaMm1tbE12M3k1V2JwdS8xODkwMzNiWEwxNjlURklxNUxBNTUzV0c0cktnclA2L29OTWhmTHo3Yk9QR3BjOXY2RDExTkV6N1NNNTBoTncxRjFaclZSU0UzT3p0Q3Joc0thbzVzL3lnSzZwVExsNWh2NGxxVVJIYTdLTnBQeENlZDZIbDI4TlpTWFhlcmRwVjY0ZW4yQUd0d2twLytSUmZtbUcrZHBtTy85TjV0cS94Y2U4YTIveHZuM054MUsyUHkzY09vOVYzS3J4d1dwTWdDa3B2bmJyS3lxN01Yend1T2lVOVNScytyc1Bnam9qaXNzdGxrbXRuNWQ0RzdqeS80N3E4ejRhcjl2N2NzM2JKdXkwYkRxbS9ZTmV0cS9ycnRQblA2MUxzZHhva21ocUo4VEYvOGFtWEcvR1g5TkxGdFpucWtrUmRGbGpoMVhHbStjbm4vNVMzTlc5NHVNZC9DK1pBVzNTNmJ0L1RreWp0M3BLK1dqbDNZdFA2TEo0L1dqYzZnS1lwaUVxVExraXR6U3ZJbGRYRlZlUWtKNWJueEdrbGlaa2xTeFZaek4rSXJNa2JSc0Rnb2M4MTZBMXRYbUdpWktGN2dteWpSNXBvUVRtL1U5bW0rQVFvSGQxbThVNFFzMU1uZUkveDlOcSttb2lmRExmYTVjM0luUjg4NTcyd3BTcjM3N1NHbCtPQzl2MHYySFJsM05QYTM1SHJsOHdNVFZjcTgxdGxSWnJYaHAvdkZUZFYzbTJTeVJObXdmR2ZyNVVMaDZKckRSNGJXNUFrdlczMnpjT0xJbUtHSWJ4Mkt1WnpWVG43cTNyYjZZM2ZMNUZtQllPcDNaV2NYK1FmdG5odGpXaXMvMlM5TW0yL0l6WXV3c2ZkMzJ1VWp6VmdXM0xjNnU3ckdrQ05QWm05UDhEVkRWdTNSYmNQV3Nmdk9QL0NuZ2lPc2RQRW4rbW01bXo0cVh4ZVNMS3paVXZQTGI5Sm41akRFRCtuY3hRY1BIM1FmeUl3OHBqbHZteVQrZFlBS2MrdUlMR29JU2VRbURJQXJGa1YydVVSMG5ocjg1R0RmRDNCKzdkUGJDdzlvL3d1SU5OZkZUTGNZR0kxTVU4cEZuUEpDM2xFRkw4SEQwMVBoT05jbTF6VDNzN3FwalcwcFpoVEZUNWZJQVo0Ump5ZFpObzYvU2Y5SXVrT3BTdXBmckhMSXNIQ09WRVdvdnovNmZiZzZVdVVjZGJQTkw5bDRJRGhVV0JpZTZlaDNaMFJpRnFsU2VPempFMFF4dHlUVHEwamw3MUdpMm0vMlZrOSs0U1d6ZmNiWktSb3pSMm5YbnhTOVd6amY3MXBRNXdTSHpRbWZxeVppb2puNml6ODVPNVhJSkRtM29sK3ZtU25OKzIzQ3B5S1ZsL05TQTR2amY2VGw4UTZwRXJNb3BVTDkvVHFiREZsMjFLeFp6aUcyQVM0LzJFN3Z1NU5FcFdmb1lsekNiQU9udnJXWmZ1cU1zMm5YUjZweDdmSmxLMWYyc0p2eTJjcHNuNlRvWWo5dWpQU0QyZDJBOE5DQXVXbVNyTG5xOTdheW1WNTl6ZkxsSzFmMGNOWWJVK1RMamVWLytNbFBYU1ZSdTRZRkhIbEZkODJzc1QvZk82a3pnOExtTEpvVG5ock5TVHY0M3NteHhNMjg1cWJpOHozTXNhSHZxSVkxdlFPWGNIU0Q0ck85aUUrMnd6VmRsaGtCQ2RXbWxwM3NMNnVQMVYxT3hHNUd0VisrbjVlVlBtT2RyOS9hR2E1ci9YelhjVEFYUUFDSURWWUlSeFhBNEY0SExnQmdKSWdZcHF3bWE2UGFLT2dVMGxkdEVPWEl4ZUNYd3pGS0R1SEFoMEFBdVE4RUVXanF3bitDeWEzZERJS0dPZUQvWUJ5aWVBZGlUZmc0b3RpQSt6Zmo3eEtiWXkzNEdLSjRJMnBiYVZHa1Y0VktwNEtpeFJLK1lnb3d4QkkyTzRIaWxWUXhQZjRkU29xM3FHTnQrTGVJNGswb2FVY1U3MFNzQS84Y1Vid3BQTGYzMG9oUEZPeS9pS0M2QUdPWjNnMG9DYjBYWUpDUGs0QVN4WGZVSTYxaFA2cndTSks2RS9Mdlg3UEV4RDhDVFB3K05TYitNV0RpWHdVbS9oNWc0bDhDSnY0K1lHK1lkK2xyazZJSE1hb0tZSld6bGdhZFNhQkozUGpMV1MwQkxXaStnWmNUK3A0ODNueWN5Q2RvQTU0b2ZxMitmeE9odlg4VGZpZXhPYkg1L2kxRVEySkxySldvUno3b0xRT3ZJUFRscUxVM0hrdnlFYWhka3hCTE12TVp5UlBSWHZYOU9laFdqSU40R0RQdFNXQVFudlcydUczTUdyWWpqMVJyTXZSK1FDUlVidktOaStpVFJpZnlBMmtjMU1XMHB5ZE1LVjFwMmxNTFUwcVRUWHM2YkVxcDFMU25CMDBwalRYdGFUQVhEQkxuZGlBd0hwUnIvT1NUb2p3SFRBSE5wZVFRYTFXK1lEYnBkeXJ1WU1QUDhMcTAvc3NZUWVyaU9CSjhkZ0trNys5Wmo5ZFg1Z0FpbGpodlBBYUFyV1VyakVzQnNFcmlyVXY3ZThJS1hRNzI3Tzl4UDBiYmlUZXlWd0UyYVlwanBEM0E1QzZDVDF5RmREbVI5VGdwMU1iNDJEWWsrc3RMOFFWa3E1eHBncWpuTEVLTEpma1hTRGFnNFJENXFHQ3ZITnRTQkdMMDU1Yk1TS284U0RNMW9DaHBBc1RPSDBqdlQxS2dvWGJjRkU5Rk5vRE5IbmZZb1VyU1lDaktpTGNYNHNYc2w5a2tzaFZTVFJocGk0aXBpeUh6T1l1YW5jaS9LQ280MlExc2tjOEs5c3J6U0Ntc0tFVVRRK3NCK3NLN3lEbW9qVGdQTytWbFJjUW56VjNFVmVLcFRTWVRUMFgyL2g1REpKa0krdkxjS3JKVnl5ekp4SkJJWmhJSWtwbjBnU0NaZ0F2SWJQYXFkMEpZa1BZeWM5dzBHSXFRZUV2cFVFaUs0VkFIL2pOY2twZFpFZWRoejBUY0Q1ZVBLV004SkExQ2tRMEVVTVJLV2g2WTQ2YkJVSVRFV3g4T2hhUVlEcDJIL3dvd0FXOGt6by9Sc2JoOHpKcmpnVUVZaXYwbjN0TDhuK0l2V3V6UDU3Tk1NSXhGWUJvMmk2TUIxOXZHK1pCVlk2NjhxSGtrbDR0VXAxVlFTSlJyaDlVOVdndFllZGQ1dmtkYkFVc2pJYmdtREkwMjVXSWFBVGk2SVF0WU9NYkdOTGhUTTI3MG9aSnJBZTQyOWtqam9MK1FpQVQzcDlYVDJaNTN3WVR0N016dFREMUEweHFjMHBnRCt4aHUzTHF4TjV3THJVa1N1Q0phWTZFQm9HN0JJMDZ4U0ExMlpiWVZ6eldLK3RLOHB6azJJU01MSDFpNjZ4SitRR3piN0ZSVitlcHhyMnZwd0dLS092QUFhZVhXOTYwZUlSSDEvSnRLT0E3M2ZXcExkRENqL0xoMTdMaU5ESFRsejZiWURyQzN2dzRDMTQyVndpbnpnR2JCc05rWkRnRnQ0Vkc3K2paKzg0MWdTdzlRaHhEK1RXQjhiZ09FblkzenFkdnEyTUs3d0trdU5iZkJTa0FCM05PcXRLM3pQRFpwZUVxSGVyRzRORzhqVm1oWmh0TWtDVk1PZEZTNVZaYmFiWms1V20rVlNWNDFCV3Uzb3NCSmphWFVEdllHYmVYNkQ4OTBmNG52eWxoZmNQUEE2THg4OWRJMEJnTW9uQUFkckp4WEdkVlgyWGF2QWdoc2JQcFlldmpBWlN5T0pUK3dPOEhwU1czOU1ndkZtdkNlR3NHcW8wTERhMWd0MlJjOGFxaGpRUGlqdGZqVndpNUF5WjhlQTJYQ200Umh3dHVFeE1yRzMyNzhqL2sySWJTMi95SXNjelMxM2pwSWJzMHNVVEpzdmx2NmE4ZzNmRjZlSWZ6ekVJeFJ3dG40NVZDUFpKK3dTM0RwM0EzeUxtYW9pc0pxaW5EYlhHcTVGQnErckVvd254SlFQWkgwT3hhVS9PcXhWeWJzclFVQ2cweC85RTQrSXRLVnZLcmdWbW5sVm1GbDFoZnJVM1ZDVVhYUHdsV0xvR3J0V1hOclpjMnNwVlZZVjFYU3JKb0FLelV6eUJuMDN0Uk83SVZOdDlhcHExa05VaVkwbDRxdTlDVzl2TTEyMkE3anB1UFZDakxOQUhvaEFHUmVXV3BmZkVOZnk3UXR0OE9mamNmZFpPNDlkV3JxNGdhWDBrdXc4SDRqTzAvUjBzRk05VW9BbEhOdk50MUp0QndNb3ZoVTBaQlluQmpILy8vd3I4eEsyeEhzL3JsY3hZSHZXNWJaVUZyRStRbG1lejhsaWRuMVhWa2tIYzhUN2twdjgwWGs5MlFZTW5abWhaVk01VlRNc200OGkxcnpxTjlNVXJkMmtIMHAwOXhldlpyQ1dzczlSaTc3enR4MERlUVgwUGNJRUFDd0lQRDMzNTc5VnpYdkR3N05BUUNBa1NlMy9nSUFlRnZQMlArMi92K2F1NVdURFFBa1lBQUFnQUQrR2JpT3V6OUFmRUM2WlBydGR1ZXBtNFFRQU5mQUEyd2VQQ0JuUS9NYWNDbU5BS3cyNHdUNVFWdzBrSjRXMEF3Q2R1WUZUYjYySnhoZzZvbnJtVGtVSWozUHVGQXo1aG1QWVlSeEtSV1k1OHdRaUpzbWcvUUFOZGgvQnJrUW1qTk8wN0tZdlNJbmdmOEpxdVhKbWpOdmszU0lFMkpaWHFHbDltT1JDY1JtdzRvNnFHZnRvdGpKRjNDeVBLSmZtU1lZLzRxSkZJY3BJRjhyaGhUUFN3WDBUd0dZcUFUNGJ5dlkwSXJHckQzWkJSZ0JKOEQvY3dBQlFEY0RpUXdFWUNEaWJqUEFyZ3M3Z0FVSUFBUndQRmVIYzN2MVVUQVNnWW1qSEl1WjEwZXlZSlluSTNGd0tHd2tBVmJsTkpJRWFTMFlJUUNmU3A4RkFmRFFhb3hFUUtIdFJiaVBPbVRGNWtGdXcrWlpicHZaOVQ1QktsUnFwRkdrUUtFYVVsNDhIcEdVRW1wNVViUkt5Y3NwaXBkRnZMcEhNVFI1WG16SkhNc29RSzNraFZocVRNUTBRdFo1SllqbWNIODNGaWd5WXRHcDJXUnl1aWhUTU1rcnRxbWw4dVJQOGVWcVZITkh2MEgxcHEvcGdmQTROTFJBcmRJWk5iekplTnlHemhVbW1vZE5hRm16NldVbWxobmYwb3g0d2daeHlhSUFpNlMrVm93ZVdjQk5VN1Vjcm1WbGxGSkdHcFdTRlUyVDd5NWFLSVZFU3ZVSFQ1eGtMbTh5eWpBcWs1WGlpeUNUckRUbGlHTVNBcWhuUWZwQXhxM2daVC9nK1J1MTh4cFZqY2wxZnRGTXJaK1JxZkU3d2xUUGVzcG9aczEyMWF5NFNsOGpVL0ZaWExsM09sUG1yVXA5c0YzaVl4ZDd4UlY1RkRDRkh0dFo0S0ZoOGoxQ21EeFBJNVByK1pUSjhZeG1zdDB6ZHBhN3lwU3h5cERsN0hSWnR6VFpMQ1oxSml1MW0yMm51SFZMZGl0Z2tseEx0MFRYTlV5Q0sxS3FHV3dycDZ2NDZSazdibnBjN0RROUV6T05SMHM3YXFxS2RCbTJ3bGxGT0tPNGNHZC9acEdUTFhkVVlRN0ZEblZRSVE3NXVHRDdOVXlRZlZ3Zzg1UUpZSlEvWTlzTHBkMFdTQXVZK1hhazV0bFMzRndiRFRQSFpxN1pOdEdNci8rdFdVbmw0ejF0dDZlSEt6TjlXalF6emN6YU1uV3E5VXpHeGRtZmNSWlluVSs2azVVbjQyakpNQTZXUnNhZUtXQ2tqRC9EMkZoSVV1MHNiQmhiY3lOakl6RXkxbDZXak5yQ1QrS3J0b0p1bmpHelhHRCtjVk5NUFUxVVV6eEZLcE5rVVRMZmk2Y2l2SEFWTHhsUEZ1S3QrRTg0UzJoTXFtZ3ZTc1gySWxVb0ExU0NaQ3FaVEg1Ty9rUmlrRndCclhBQ2ZvS0xBSEc5T0NxV0Y2YmlKR1BKUXF3Vit3bGppWURsNzArZ2kyalZTYVZyeEVXMmNSRnhraHVqUG9tV25IU096MHp4ajAwNVNaWWRCbFdLT3VrVVFpdVN1NVl2Qjl2QWlKT3I0cE5PczJEcmxud0t3NEppSFRiT3lnK3NCbGR3ZFhXdGxpQmd5M3BTZ1NoR053RndIeWwxMnJXRUFLWWd3Zld5OTdoWjhvd1hZUUU9XCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzIyX19fID0gbmV3IFVSTChcImRhdGE6Zm9udC93b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBREtjQUJJQUFBQUFaSWdBQURJMEFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR29FWUd5QWNnaVlHWUQ5VFZFRlVYZ0NDRGdpQmZBbWZGQkVRQ29HR1VQWmpDNFFFQUFFMkFpUURpQVFFSUFXRWVBY2dESVVmRzJGWkZleVlJVzRIRUpWUm5jWlJVVktvN0lzaTJEZ1FHTGxaOXYrM0EwNkdDTlhRZXJlOWhqSlIxR1JRdHdWMCtqZmpFNHZqVUF5eDIvM2tGWTFnNVVhcG9JVHFKRVZqZERUcVYrZ2FDbjZ6ZkxvWS9kRGdzNkd0V1dqN2dpQ0t6UnRycGpqUmY0WEZ4eDlqMzZ1UDc3TjQ3NzUxVDBseGpkMUhhT3lUWElObzAvL1o0KzVDajhTcEVidElpWWhXUEhHZ29vU1kwbFFwVlFzMVQwM1Q5eVY1RUtrYm9lS3BpQWNlc3YwZzMrek83TCs3QWltRWVFQVNCbEhXb3ZGTmphaHNLa3hkNDRIamdYZjhUMXVsZWdsNzc4d3lmTlVQTlhOVnpnNndCOGd3YktuWElBMWRYV1RpRUwrejVNbllHNXBpRDhBMlpZazFSTVhFd0NyTUlrU0psallLckFEUktXSUE0ckN4WnZRVWM5UHB4SzFkcXF0MDI3c1c3YmYrai9PbkN3L1AyY0IyM2ZWM0hJZjFCcGJYUEkrMUYwaHEwWDdWZmI3M1lnaWRpdVJUYXBkaHNwUmp5Z0ZUVTZBVXh5NWIwKzNVZGZuRG1KL203SHNEK0FhU21TUnQwdkp1RjZnOVpBMnN4TE5IRmZxVDBsL3VhWFgzNzF6TjRQK0VHWUxjVnR2MktHNUlHWndHbmgzY1ZoZGpWRlhZVmhzaFZ4SkpkZHRSR1hTcUVrTUlNR2pBRHBiQll4R0NqWnd4VWJxK0htZU81OGcrdmw3R3g5bVcwWmpKNmZPcGFyVURnQkFocjhsM2RFaVZ1SkVYVXRHbDFGUjcxelNZUHhnQU13REVJU2hwQ1pMS1hqK0p2a0FxM0JQbEpGRmFQNjIwS1ZkYlhzaFZTQXFPa3AwdngzS3JlMXZlNVRMTy8rWDQzcWZURTdzRG9Ma0FHelNwNk1wNjhVSmRndzZMRnUwbHRrRktBL0FzZ2NCMGJQdDMyV3h1WjNPZG1qdUtMRjA1M0hlU0YzWnArVVBwVlNoY0pQS2NwRDZHWm9kSXZMRnRTajNqaWhJNmZ2cnFaMHN2cHZiUXdxNEoyV0FpeS9pc2FHN0UvNVdmc2Rtcms4WFZNb3lKWXFDQTFCTzkrMzhtQ0NoWTQwak1pdTBPd3FRanlIemtDTEp6QkhJYmNvTU1GY01oUnpBeVJ6QTZSNUJqUXk3UHY3bmp6dVd1dTVHNzVXN3V2c2U1cDk3a1B2b2t2a0NPNE50ckUvenlGL200QUlEdDRWNENYSmFERXhlazE0TXBNZ2hCWTcvWGJNWnJkMVhiaVZtUGY2bFNYUXJmMTRSNUpmT2gxd1U1NmkvcjdmVHFjZ1QyckF2UXFmZjA0K0gwQkNVRkRuaytpVlFjOG4rV2t0b2IvbHVRWjVPWTFJa0MwS1h2cVVvaGdjRWIwcG8vMUFDREdHaWxRSU5EL0NNYXlRbGhLVHJoVGgvOThzbHZuLzN4eFYvMlg0MFNiYUFVU2ptMjJ0YThzVFZvTlBqWE1zdVIrT1V0VWVPcFo5WFhmKytIRDM1KzUyWEtqVGNCVFM4TkhRWmd3dklpWUYzMktmUHkwTEhNMVhndE9Mbko4V3ZyKzFSNlgzSWtzT3R6ZC9IL3UwSFlQaFlDMlF3QTNhL3FBVHdhWkRSTUIrTDd5L21qeHI5Y1hVZ0lNUDYxd21vS3lKOGViVUdjVUdCaHoxM3Y3VkZFSWhjZ0FBRkZhS0lEcXFuVXFLSnp0QUpRaEhCQWNvN0dyeUJ5OEN1aFV3UkhaaWhERlZOaldXeUpRL0UyUG9TWjBpTnFETG1FdU56bE12czZjbjNsOGpkL0diL2RuL2JuQTVOZDMrSUxCQ1EwWkpFVHVacDhiZFRGcTcyL1JwYzhYTzUwbVpaNzZmS2J0azJiSTUrMnZrNm9ZRFA5NzhwRkRQLy8zVC9zQm1qL2NpLzczdFMycXExblc5cWpHNDllUGR6LzBQZGhEano0d3NKU1dKdG52QVhnUmIyOUdUOTY2NTN2UzB6RTFPdEViNVg5aU1IOFNyN0pvN3RUdDdkRXg5aitHckRiWHFzZXVaMW1pSDNRV21XekdudUtYODRaWlJaWXA4UVM2MDJ5M2VLSU5jczZXeTN3em13VG90OHNKa0ZqazczKzIwblRTWjIxTmd1VFBRNXBxanZ0RjZHQ2FJWVFzbGpXRkxYdVppZlpacDg2TXkyeUptSlZtV2F1R25maURscHpMTFR5WmVlRDNwa0EyaFRNd3o3U0R4TXhMYjNhOXVNb0xySEg5bFF4ZXVpK3ZLU1JQYnNRK1A2K3c3Mk55Z2FGWEZaZlYxc2pyWlpVVlI2c0tCZVhpWVNsSmNWRmhRWDVlYms1MlZrQ2ZtWkdlbHBxU25KU0lvL0xZYk9ZakFRYWxVSW1FUWw0SERZK3pzMk9OWkFmSGQ3TlV1REgzRmdmM2F1cDVBZEhkWHl2Y2hkRURQbWpvTmtTN01pWndkaTFtdG9ZcjluQWd1blc3Ykc0a3JHdHZoY0twWWdoZHQ5cU1PSEJxSFRVa21IUVl1VzBjR3ZGbXp4L3FvQmlsNkRLdW9XSFJyVzN0MXJOZTEyMUd6SUJXaVFiVCtEbzFyalZDUjh2eitPZkV6UmJ6eGkxYk5pdFpXM0poWlB5YVdpRXJuQ2pqRHFnbUtyamF1RS91bnlMSzBSYjZhREN4bmVGNDBBYU56TW1GVHpqTDE2K3F3QzFKSUxRdkJnNktRY09zeTV6WThlYmoyZ3BaMFBlVjhWRmEvb2xzYW5YRWtHUm91ekgxbVN6TCsybHE0NHJxQjg3M0MrRUZJZkNwK3R0dTBHVVlYWENSaUVlZEpWWDlWbjlXSGRIdks3c21KRUc3SVdGNDJNVnd0cHd5WldGa0tMd2VDVzZvVTJOVXF6WFltb3M1YVpTODZibTZzZW5YUUVoWU9WczRnUzlzdDNESTI0UDdLRTlvVEs2bFBCVi9HTFgvWStnUElSZlF5ekRHa21OOGNnUnB2OWtaVjJWRW8yL3RCUlJJMlUvdXdnV0V2SDkzV24xaWs3cVQrd3MzYThobk9LbEkrM0tZdk1WNnJWV29pYkxNbTM3Q2toWENJNEZyL21ST0lKd0RIYmk4RWFETnY2cGZGTUh4YnBGY3J6VzdOUHBwMlM1bFk3bmpZSEVvMUxOMkhwbUd0a3p3WXE4UWNvcW5OL0dOamk2dCtSMldCOWxNUDBVdmJ5eW5KTk5Sb045TlNodlM1VkN5SWlwNE96dCszWjBRcWF6KytwK1FoSmg3a2ZyQWtGVUpPNTdvQjdvZ3NnNjhDekgvOGd0YnRGelQyU01GMFN3US9kWWIzeUVXc0p5QklzS25SZ1V4dmpuc25xTldnbWFiTE5lRzR5U2ZkTU9MMTFCc0lja3E2REdqb25MT0ovVk5KcU54TDg4YWpZOXR0OUNsVnVKQ0YycjVSa3B3WlhMVm5La0Zld0lUQk9nblY5eFdlSTNUMHNuNFRnLzFNUXRkM2dvSTdTTW1wWmVTN0xrOWtpelhzdWVSSzNZQlNZZVNqTDNSQzgzYnpNcnBSYUJGeTh3ekk3clZSOEhZaU5ZRk1UY3I0cWREWnlVT202dHV0ajdrVTV5NHJFenRQTHlFa01MWkN3enc5dmlPTUhSaElmaytKMG5FNm1saDVlUWZDcE1UOHYyUGgvQTlBMFd4b2FJbm1Fd3F6SHZiZnBtRWVrb2ljcjVOaDlZVHExRE9vSi9WTk94YUpta1VEdWFhZjI1NUJiYWVEQ3pzVmVVemJZMDlXcDVJUll0T1daUHAyS0hNeURkbG5ha0xSUThoZEFncmNwbzFuaVZObEd5WUhQRFlWZXF3OUoxT0luU3Jvc2hNWjlSeUE0M1ZGbXpTUkFOUEUvUks2ajJjbjFBdXdOY2tpeVNISk5DdEFmYkNOeEFtTjQ3VnZPV0xjYzFWS2pMVjRCaWRDUVV6cUNrQ2QxaTQ2dDBBaC9CdExHS1lIRzQrYVZFa1RBUUxMaStrSk9pYmtuUEZRemthbUNyNVR4WU5wUlRtOFNzb2s3QUFObnpsYjhEVGliTDA2d28yNTFoc0dEVHdMNk9PSDdma3MyNHl6V2ZTSUEyaDViMFFBYUUreXRGUXVkdXJxRGxZOWhXT3NaTEFRaElVNzJnSVRZMnV1QTRnVHFDaUgzTFhyNUlSd2hMQ1daenBkbTR0Qm9CcnpBUU95TWtIbkhWb2dWN0MwK1RzaTF1ZWJpandRNCtjY0tWeG1PR2FpSksxSGtVSHFwTXI3K2RvUkNOUjY5WGJlUjlrNjZLZGFvTGNXRGZSbFFkdUpVQW01RU5aSTdXNG5OdGx3MUk5SFo2SUh2Tlh4d1grRUVnNlVVeXVzTDU3aTQ5enRXcllwMXJtUE1WRWdjZC9ZTkJjcE1qRTJRNlhCV0k5c0E3SVZvZTdMZGdOTkZRbDA0NXltWmZWelNhR1FudFZzYTZGZjdBMGJBUEREU2NSbG1iVlJzOG5BZG5GU0RxWm9jUnBZQ2tRSmpPNXZFdkJKa2IzVndTYjJvaWxEbWV0VVJOK2VsSk5zYlB2ckFhcEZ1SER2QlMzNjJERWRLYm9WL2xwbDJhMXVGMkwrMTRlYkdML2kycndEZ2kxUXZsbGpuMlNpNUtON2tvQ0V4a09Za2dBa2Y0YXg4VWVBNHl0NkxJN2NrWW5zK0E2Rm1ZZzY5d1d6aTFQdGdwM0NwVjlEMENtSE1zbVYycnBvRXo0MHhDYzlGcXZRWmYzNEwwb0pEeHBiRnZBUzNWQm02RUxlT3BhMFVVaUt5a2o2c2lsd1YveVRWZGFwS0lRR05nVmEyS0x6UnpUTVlBQkZoang5TjRRU2dtQXVGSnR2Y2kzR1RiNTBZVUhSdm9haUhnYzlMRXc2NURTcEVKWVpBdmNtbDRVZ2x4cDZuYnViVHI0UnZLNGVqYnZCdzF4NUNwa3RlckdXbDBUbWhJc2dENkVSNi9BckJxWlBtU2tNakxOd0lIdGw2VHpDMUxYUFVnSVRoRnZJZUxwMmZFY0YxbytER0NlT29DdHlROTRjKzZBYTYvL1E5dW5vSnBwdWo4S2VBa0REMEhGL0trRDhodU1kT1FTWE82OHl3M2RkK0NTOGwvR0t4aHRZelpTODAyMU1UVXUzL0pqbkxsdHowcjNuMFdqbTlKOUNTQ3hWa1VENGQ3b2lJSjZZRlp1RVN5a1lxTU4rYzNqUDhjeFlQeHhIaURTZWs0cCt5dXVsdUZZZk8vR0UyT3dMU3J6TC9sZ2NOVjhiczFWTEdCVDNiMkxWTlJsRi9VYlo1MkRUaUNqNnpseVFGSDdYa1F3bURRUUs5OWt1R0E4bmtubE5WUHdNeWZNZitJeEJGNXY2NmU4Wjg3YVpLS3pnZEdGVXp6RjRZUExSVU04cGVtMXNKUTlMWWIyUUJ3QkkwdmVzblVRMFovcFBybTdvZ1VndVFoUmlSUFNFZHh5WldIOHdzSi93ekpjYVFxNXBkczZreS8xYlp3N1pWUGUzcm5VNUMzR1B1T2JGbldCbS84SlNCcUJNMTV2YTNTTDcxc2VFVWE1N0xtdE9DWldDTW5HcU4zc2Y5MmJTVUVCeXRZbU0zT1FwSWN1eW5xMWxZRFp3YTdhd0ZoR3RCL3dDWXlKUWI1Nmd3ZUVHcUpUYzVGZ3V4aHFSWitpT3RIWjk1N0txTjhoSk9lRFlqTUdySHh3VURPNWhYTUxGdjMwczMzSTZEQkxPa1FzSFE5TlRXeDJMam4rYktkZERxWFlkYmgzTWhmMFJhMzZNTSt5Skwxdk9Pa2NTZmIzZGxleGpXdTU5N2NucHJSUW9ZMlZIa3pjRExjWjJrdG5CRGlyREZ5V2lDK0crem9jUnVIT2U3a1JmWEQva0NOY1FqWk1oQ29OWHA3aW0wMitXMmNDUDNreFl1TmJlWE9jK09sRS9PV1ZWN2s3UVhNZWJpT2JDL2JRZW9QWGRVMHR6OVJPcWZmYjVCd090OS9WQ2JKY2FPeFMwTUtHSTFJeDFaUmFZUGdQN2ppdWszeStjWmpVVWw1MUpFbUd4NXlybmpsZVV1V3k4U1J6YnUvWFZWQzhJMEFmQldJcDFadStDQlg0R1o1dDk2MzRncnBxaUpoRldwbTRiUlJTSW9YVWtvM3lOTFB0bzQ3MEhiMDFpN0dCczN3NW5xakFNSW1uV0FyQkZrRUZiTHl0UWxYU29TcTZUTVRKMlVpRnNUWjBBQTc4cy82ZVd0QzFXTjNTR3VpcEtRcHhXMHBqTEk1bW5lUHlSaXBUb1hrVWpsaE5SYmJ1SGhOVElyT1haRjhzYUF0eE9neittMzBiWFJUWGV3QlY4emx6TDBmc2RqTVVJRWxDVFZQam13MTl0ZTJoZE1pNGZURXVISSt0VEo0dzFVQ2N1NVg3U0U3QzV3bzBrM3VxYUw0R0VJU3BsVU01UVpiRTRDZXltVHlSU2tKUm5WNjNUalEwcmhWTWViTGFiSjYxNG9pZXRDQ0I1WUtTZy8wajc0aUdCa0luOUVablFTdGVXcHVEZUdqSWhYVFNuVzZEYU5DeFVnaEkyUE5DeUMxRldDWFRBWHlBcktnRStjVnBaY0hQVDI2TmJXR0o3dDVFTjM0bjFMcEJzNW5JUFVlaWJoTSs0OGNMa1pjUTN5TldWQ1BiMGhyVHZ5T1ZuUXUwTEhDR0c1RHhDWm5vR3lSTmx6Umtid2ZvaVJhT0VvY3RxMnZLWHRGNzJLTldjWjYxOHh2aGlmbmFENHlVSGdIc013bDZGeGMwb01PMTZxMDJiYWRjSGdLWkFISTQrWnc2NFJNS3BDTmJxbDFpeTZTNitBakROTWtpSWNJdmRBTC9ZcGUzUXZPYzNjOVRSakhEQjY0NnZ4RWpTM29RYzFLb2FwYWh1ZFZodzRqYmRBYU9yUEhtWS81SXd2OUJEbmxlMWlWeUVHL2s1eXpRUmFkOEpnM2ZpTXNEdFdNQkNPQjVIVWVsaXhjcWJvbkdyaThZU1NhOEpZMERwb1NhVy9FKzM4bGx5TG02QU5iTlg3RmJaRHBuOWowTkVsNTNvS1ZzT01HeUhxTWxBZXVBYjVnUzYvSkxEK3VpT3B4QnlEODJNazJtTlFVeVE4VFZaT3lja2greWt4WGswbGlwQkFKd3BXRGRBQms3TGxZcUFrMnlRVjVKVjFYSEtoeFZLVDFXejBWd3F5R0xEeWQrV1dYV3Vqc2t6d0xERVFQK0d1aGl4NHlNSkJ0S0pXSldYdkp4NTNoZkFCcVZGTGNmVGJHU2VaenFzZ2haR1FJaVFJUUcxYUlWZW43UndUbXdISnNKWk56TkIwWjVMQ2g3cHAvWVIzVlk0dlZSRzNVQ09EcGsrTmFwRkxiNnRsUER5UmhhMWRNMUttbnRuTERRR1k2TU0xS3UraFZZRTRhMHZsWmpXQUFEYlZsM0hnZjExV1BXeG9lWnhTQVM0NW1OU0tpaTlLY2dvZGNCU0dXM2FPK1FTekN1Q3dib3ErNjVHTjFYcitVK3YzR2lPZkF2cmpMNFVOTEN4WUQwQklNVmR5UTVmanNXTkNnV1l3cnVUTlFPTzJvRmNCbGZTRFhJajlvYnZxcHJOOUl5Y21yN3p4SWJzcVVpUHlEbWY4c25lRTVqUDRDUG9xcWppbjRURXZ3aGRjOXhLWVJqZGVObFFxcVY1ZHpVTlNzZjQ2QkI1WGExM3N3SFg1eXd4dnF3K2lCTzdwWUJpZW5FUTFGa3BzYURoc2hMTlFnUitnQVNXL1ZLS05xTHVjaDR5bkpLSTcxYzJQQ3EzUmpKelR4S3ZpZzBWS3NtZkVWejlqNzJiYko2QkQyb0JOa0ZETTBQTmJzVmt4SjBOUmJjN1d5U3UwRGc4dWVIT2tWZnlVYkdNUUdmaUkrUmpoK3NxaUtpamhPbTI0SU5WenlxVkxSd1BHcDVrOElnT3lCT0ZGNEJrbHpmQzIya3dNUGZQeFB3Z2JoM3Yrd0I1MUdDZzYvQUJqSVpINEQ2dWdJK3FDYkFyU1dVblFuY1MwVDFPbUhoT3BWTTdOKzFBdTd6WndJUFBGU2ZBN1plOUhBaVhMUVVWWU55MzY3Y3J4N2dYeXkzYmV1MDBGLzlzL2NkWGVCbUM0eHZJbWhCVTdtK05oRlVSbnpmTFppT0NFWjd0Ull5eldlc0tBd0hFbDNPT1VFKzVTNmZ0a216aU9IQitXd1Nsb3I2YlhmRkVDR2RaQjVVQ1labnYrOGNPd1ZrRE1VVncySUdRV1lST0xaUzV3ODNGVFk5TmlPTTlWOGNVa3RRSjYwa1ZOdGw3eHlCNzk4WjhIeDZ0bCt4NGF6dlZsek4ybFdOQ2k3cWMrTWFocGJjZlFtTktBbnFIS2RyaHlLLzdyNXBCRDBVOWRDeGdLTVp0Rk5zVm0wcnZ6VzQyUTM3UmROa3ZIeXh0NkNQY1czUE9sdTZIYU1uUVlPWmhyLy9tNEZ6OUM4YWdWbzdhbHZrUlBIb3BmL3V5cjdzbE85OXFickRoenVEbjRMYi9ZZXZGZnhOTFU3MVVaaEdkRDUrVXRJTGkrZGUzOEtYUjJuL3Ziak1vMSsrcCtxWjE3SmJvZ3Vxc01sdjV5VnoxM0tBL28xTWVoRHo5WE1WclBSZGFZbGJSMHc5dy9nemw2QTFzNFZBeXIyV201ZUNWOGhBMjZhUCtIQXZQb0RUczh6Tk5rekpEY1p3QnliQitoeEZXOUZ3ekg0WlF0MGJiQTVva2ppcDZHSWlycHc1TnpERFV5bFZkSE10cW8rMEVDWFZaQXdlcDlZMElRZEdxbnBkNnhmcndOdCtPc2ZZMEV6TThnOXNuM1Z2anAycGdiV0NmOEJncENITjNWZ3dHcTZCWWZGNituTGZwT2JRT045ZFh0WElDaGo1b21YdnA1bFFtYXVmY2lmbXR2SjEyelFUV2UvNjZKNW5mbnhxZHVwUGlwMi9lZlR1WWJQdW1ibnRydXlEVTlELzRyK05QZGNuV2NBZGc3U252aURJMXB0TFVzWWFFd2xXblowWEJPaysyWTArSnFtcnZPSjMyOHJNK3Eybm1XSkRjS29RVmFuL1RWMU9LSExVT1A4OHhHODdaUEE4cUxENGVRaU1nSEo3NlBMNFVtd1ZuSnFwcStjS1M3WDNPZW94TmM4NlU2QmFqSnN5VE1scFM0WW5Za2hJUVJ0WkxGSEhYd2xKN25YV2pVUDBMQ2J2Y2plNnlhMEtlM3lZUFdMVDlsNVE0bnoyMlB6SzZldmJGMVJ6cVhSajRsT2dNdVlXZ3V4ZHQ3WWNYdkxqR0ZDdkE2M25RVVR6Smczakk0OG1iZkFhSStEL3R0ekRzSUJKeHlneU9NTUdmWnNNKzVOc0toNTBjaXg4eHZ6UkdNV2lKeVZacEp2SmY0TVd1bUdSbTRydmxxekZkV0d6UG5ZeWh0UG0yUGUxZmtGanJ6djI2anppeDF4dHd5bEJhZ2tLaDA3cGIwMHJvU2N0OCtpTkpKQlNlQ2dxVjRRWTZkdTNwVnppeGQvcjdRYjE3bVRTWlc1cGZJSE1Keld3c2s5ZGJvV1RjQ2VTeXBMaTFtRGZoaDdmeW5PK1VKUWZKUm0vd1hndExnZ3BaU2IwbmxxZk1KUllOTDlmYVgwdy9rTnhjN3ZsVDMwUHBpT1g1T0p6QzVNMkp1T1A5ZmNnRDNUa1ZISWJuWTYxSjJ2dEFFSG10eDlDYldBdm9QZFp0ZDdKeFAvTTRnRzVydXZhUUFtUkdreENIeVlRcEhCbzFWTDZvMnJ0dmVhdmwzclAvekhqZXU5ejUyZEdVa3RHNUxjYjNxeTMreGVQN1UxbXpQcXpIVHFwRHROMkJlUC9GRlgvMkgxZVBudTdlYU94b2JobzZEMXNRQmxiSGNGM2ZLN1A3ZC9IMU5ueTlRaTh5T1JsTUJJRkMvV25lbVFweWt1VDllY1lpdHNKamxCQi9PM0xCNjdGcUludjE2L0JIK241NC8waEFsdzRNQ0xLK2Q3T3JTdUY0M3JEeTBIYzdMaVVSRW9rUm5qUEw3UU81eUw1dllrNldlV1ZsUlVpQ1NWVlJYQ3FwcXFFa21GdHlrTGNzOXREN1c3dm1VT3VjR05vRmhLNEN5MlhKKzhvS3B1cksvcVNJcGVrVVZwQUNZRWFzckFZalZZUnIvN1pHaklsTHRuUTBpb0F1enhad0FCZEtyeDk0OXVzUWtFL2dmTkczNU1tNXdBK0s0TVZYamlMSXVKYVJ6RXpXMmYwQkdJeXhDY3o1ZGZQdmxnVzdRcDJ6K3JzblVLWUVKZ3JHbUFDWmsya011U1Z0Zk8zcnM5ZWExQnFDZ2RiVjliRVV4ZDQvcUwrZUdrUWprM2ZLaytWb05WV2d6b0NsV3BFdGM0NlV5U2M0cHVVTXFaSkRkUGZ0TGxqZk1QZmh6YXJsdFhvci8veFlkMWZmTEpEVzdRdU4wdWpaZ0hjdlZwWW5tUmxxaFFZeDgwbnFqYytVRXgzUHRkUS9WT0lHeEZnYm1vemhVSk8zTXhGeFZ5ekhsMWR0bjh5UGRnRDBpU2ZmeitWVWkvQmdtMFFaVUZzalA4bXBqRWFXeVQwUmJRT3BWZkUyRVpndlRLeldtN0ZOOG9tbmI4cmg4Rk94V1UzbGFiU1BIMmo2MUE1THJrdVBhUjZhV0p6ZDkxcjJVdXVPQmhJUXEwZGI4clZWUkZRQVdFSXFWaFdTNVp6ajFVcXRBS0xISm5IcGl0djVsbDVNZHVqV1NvNjV1R2FFTUk1Ti84ejBnWnNpRTdSV0NEVm1DeGg4ejdkYnZrazVRdVJObGlBbWV4NmZiTUpaVkVXVnZWa1JpekxFTkNVVXU3ajBrM3pjakcySC9pZ01IZkdPTk1xZHMzcXM0WS80UmRHRTc2WkYwR3ljTG9jS3d4OW1SVDhzUlcxY3FseW4rdHM4M1RNRHArcHBuV0ZmK1BKczBhdjhaQ0FVN1k1UmVTZU1jc2FMSUVlQzlnd29ieFU5V0t6Y1BmbmZuOG5uWnFsays4WG04RDQxZUhhQjRjeVpWRzlGc1YyeFU1ZDNFQ1pIOUpuRTJJS1pZbUFxRi9sSXNyeWQ4UDRlcmlXK3ZySCtYc2t1enZSM1Z4OWdYWmx0dERJbU9wQ1J3R0piTFk0ZzBoTDc1RWFqeG5rOTVUb0xZcjM1UHJzV3BMb0hnR2h1VDUwWFU0ZGNWQnhaWlVkeDhNT0FjTTJMbnk0ZXM3U3g1dnRBOTc2VTg5dXoxdDZBUy9lMnRySWs4M1UrMDNxSWxqMFgrK1c4RXpOYTlyVklNOWczM3FqdCtCWlN2TDNsMzI4WFozdlNyL3NsTnRaMy96bGwvd3gva0wya1dFd2tGZUp0ZDIyUTZueVQvbGovZE9ieEtTYzd1UzBqTWFzVmVWSWR2QkJBK1RFeFZxcjBSUXpoWFZjVm9XY0QrQTZQN2pNYWJLbFFuUFp6Mk1GSmpVY0Y0aStCcWdMcnE2WjJ2cTBoQy8zNW5xMUVsekdySVhwSTBFSDh4ekpYbGhpL0lQaCtmemh6RGMxc0xDb3Q1djZKcTllbURmaGRLU0F0cVFMOFloUUlwenVSYklyNS9rdXZBRGVVY0ZySmloL1VlQW8rS0NsQUp1SXE4NW50SmVzR0ZkcVo3UnF6VUNaRVIwRjlNQzRuYTduS2o2L0lOeW1LSjBVckFQRnVEVDVKRjQxRTBaeU5yclQ3TEtWY3dvTDhhbXlTT3c2SzFBV0MzZDR0REtnMXA4cWszNC9NajNQUnNVeTRiT0IzVWVhZEF3T1k4STB0dUlJc3VHc2pLMWV3ZTlWZTBVMHBkQVp2TTk1V2VrWjA1clRnOUtCNzgrWkQ2bzh6Q1pJb05IcXBiYXIxeUIzVmM5WCt2di9mbm05WjVuSHZrUHNDR0lGejVnYjN1ZFZ3WGFKdGRjZmlZdlBLeUFuYlRVQzZiRWNESWNHUHB2SENCUWRLZUsydUtrUHhPMHFkcDhQL2NlUUVRUWd4eC96cjZBZDNBMVpVSE9uS281ZGM1dEQ5bCtKVlc2RStXTERNNVNpMlp5MEV1MkxMUFNQQitzR1R6anFFOXNlWkk5c1NNL3JtZGVLMzdmSnBFdVlaZHM2ZnRIeUh2RHI3bTEzb2ZxNllsRVozYm5KYUJLanVhYXo2M0E1dEVWL0x1M1ZYM1drNHpDV0hUeGNhR0RaazJaaENtKzJYVEJTaytQNCtMVDYvM0pCODYydjZmb2VZZW11MGRuSndaQ3J1dTRBVlY3TjJJREpnUzFuQUw2NzVQdFdZazFId1BvZVdYaTRnd1Q2ay83eXc4TjZtK2NuWE9LSmhQNFFwV2tvYTVTbllnNExrTm9zRXFyWVYyZkhMTENqZENnN1Y0dGxmem9OaW5CdnFwd1M4dGVXenYzeGlOYUlsN2M2RVAyM1hvUjFoSTJidThUVlp0YUs5MnlLTEp6d2VoV1ZwYVdjYkJ2b3AyODdkL3ZFZHBxeTh2TXlVWWlwTW5aeDhSR0VTaGFnWHVhbVRKOUZDRFpOUVZ3dDAvZG5MdTVHU1dLMGVreEZYdG1sRmdZbFdaVzZDNy9TRGNHQlpyZWlNNjJLblNydDZKQnZKSlpBbm1ucWN6b2RpMXhzQXVUNTRiVjF6VC9pdEJ6NE5CU0ttOCtvajRNYVc0bVQvVEhPZTYyNXorMkNFdkJDQ1RDOUhSWnFRQWRsbXBoejlnK2ZsU2RPcTMrMGYzRjhXT0hMUkNXdUlrcVYxTlFXZzlVTUNvbVBBd1ZGUnlJamdvTGkwSFlLWTN2b1ZoUlhOWW1HQmlGSk1TUlVhNHVFNFUwb1BDOFFIUk1TRWcwSWl3UWlXQThwdmRMUWZBRHdsTlFXVFhDOUF4SmFSYmZHeGh4TmNndEo5WVFmejlvK0J3ZEY0Vk5DZVRMYVhkbHdWcTRKWm41V1dibDlGSUJpMVhFVHhDYXNkUHlPY1ZENXBBclQ0ZTVoV2w1Y1paQ2hqRExuRjJheFNpM3pNck00eGEyUWoxNjBwVnNwWUgvdmwvM1UxTU9OcUxUdW5yVlFFMGgyNUlOaVE1aG0xWHhqZlVGYmE3WVlXRC8rbGw2STJ4VnBSbXA5WmdtdTFhWWxocUVRb1NFeE1ZRStPOXc5b2xDZ0o3OTV3T0dpMW9iTU5GU0paNVB0TUhFNEl0Qit6eS9TclJQRGtFU0hYemdDVTRFZUp5VHZTLysyd3lEc29xbVZDOWF0aGVzazZOZitEYzIvbkgyRVAwb0twRkRwbHFuV1R4RzU4VVVreFlSaEJxeFpEdjNMTHREZDFubEMvVmR3OGU2TFhSV0lXYzNUaldYWC9wYU1Ddys0aHJyNERRTk1JTW1xdTg4ejFRMXNkdWpHVjMxUXF6cnNFL3VpbWE4dTREVE1vNHVLV3BOSEQvY0w2c2JyWGVYKzh2ZndWbjdzeEUyUklPY2dtR3Jmck90aHphWVNjV2cwRmQvcEZydmZnMDh1OXNJSkRwTkVhRmVZMmZoWTZsUWN4QjRxWHJKdzdTM0JJUmJpWHVCcUVhQVlaN09XeVdMWG1oWXVHeW55eVZCSkpPMkxROVZEeDBmcWhsSmNwUkVFNmNzK2dDN1BReVNVbndiK1pzMW04YzNxemViV3hrYnEzbGVWa0hhQTUrK3VwMGFySkhXM28wZlFFUk5BYlQyZzVySkNMNXlybTJ5YTZHMUU5QitYUGZqR2kyRWpySWo2N01tVnpHTm93aDVrV0dWeWJkSFNXT29zQ3ZlNGtKaVRwcU9PSGR2UVo4Qk9UV1QwUnliMEYvLzMzZnAxcDlLbzFKdDcvek5DbStzb1FqS1ZVUHRpc3hueHlaS2ZDMEthSlg2VGw1cE1Xa0lVbkEyZDdrV0pkOTJjR1ZCakpUZVJlR2xmeWVhTDBBSUpnd1FOUmprK2hobS9zS3gwTG9zY2Nwa0NsNkVFQkpCZWh4blMvTktsNVFLK0ZXaWpGUzVLQ083dmxRZWpNZUVoR0dpL1FOUjBXRWhkOENKRTEvUE1pQXoxOTduVDgzL1JnRzBkbmllK1dsNnA1UWhxQTBqbTRyeHl3OGgxYUtyMVhBNEc3Nk5IYXM5bldQNHJHdHUva21Yd1BDMDFlOHhPL1BQMWJrSG9LN0pyZk43WmMzbkUwTlNEeGFld0NIUUV4RlVFekYyNmFGaGNvS2FMeUJZMnlPY3hnTmhxUzJ4NjUwWm9qSjFadXg2YzFQc09YVzZlR0Y0RzBxYjBtNGk5R0lIV2trU0ZoL3FZLzNyeUZrU0ROZXdiSDNaaTFmWnVxbURCU3BxOWVUbTFxWnlPbzEwVktpMTRVQmVQdEtMOTVlVGNnOWkyTHFzY1JJMmw5VGdRbEFjUjI3T3JGZGQyMzNyY3N4MDFTY2t5VnhDZGJkNDlJeVV6TUNDZFlvS0RSYUlCcXhnUHoraVk0UTEzNFFmVk81YVdjOHoxZHU0K0wxSm0vNGNtdDR2N05wdTZXclpsT1IrMjUzOWRzK0ZrOWZuc2tlZFdNNWRkTWNqOWxzamFNRG9tTzZEOUJUbDhGRkw3OVVieWd0VWlkb3Uwem04YnZlNVROR2F2RDUzNDV1U3BmeFREaVMzSWJMSFJkL0VwWkhSZHRWcTgwcTVOSXBlUnNWWHVDVklKOUxJQzZMVkdXMS94WDh2TWhjRHpFVU13enNpM1liMDNFenl0ZFpXMUdPLzZrajM1MUNkamZiMTFEekRHYmpRVXRGWXRVL1pVNGp0bnVRR3AyNlRIYjRET3pneDJBVDRSKzMxSDJ3TmdyVHpscC9YdEd5MFFzcGtHK3JrMjdRbVlGdHkydVNuLzB3YzhmbHJUbStIRitURXVMUzZabFc4OW4rNXQ5dktZbGM3aHlhZWpLaUY2ZXVMNUR1eEdvT1IvVEVPcEc4OSttZ09QNU9IaXo5VUlHSWwybXd3QkY3OE1CK1lsOE83MS9PYXByMnNrNDIxK25kZXpBT2s5Uk5hbEpLaHJOUDd3RTJFYzN4OFlGNzJ3TDJsOVFQbWIvV213VjN1bEo3aTBSTVMydTNoMlIwYTBxTnpFS0MxTnp2T2xTVGRhSlQyVmVmR3RzbHd5ZTRvSGt6WUdiSjcxMTA0bTlPQzc3TTA1OTNhZDlPSFh6bzlmdHM1WFZodHQ2b3JScWpqaDFrOENrdHRxZ25XbEJRQmlBVWF3NEpVK0pLWVRqdGZNd0F2bTRMdWFkSmdzSDk0VmlMdFhCdktRRFh0KzQrZVBlalM2aC9UU2VxalNPcnRrczFESVp0am1UUkV2alBZWmdWSVJOZXVxK1AzUG91Z0ttalg2QXNsUlh3MnlTWWZaSk5UamVab3ljSGx5T3dpbmJTYStFcVRNOWhPSm1GandkR3dmSmVkY1JjRzY0aTVaSnpBZk91STRZdk0yRDRDMHNQZy9iV0xJV0RoU0dUSFFLRk9SWDhMeUVWWTdCL3BZZWY4aWhBRldCdzM5amcvejVyb0UxWTJkVTliMDRmemlOWERLM1dPdm1udWJGWVNrTUdBa0lvSE9PKzdER1lnaGRwQ09maU5RaWF2SGV5dFkxOHF1QnAyMFEvZ25EODVlWVFFS05lU1ZDcmYzV0syVVIwalYyTm1UOHl6Q2E5aUYrSHloZXovY3VUUk5mai9WYlNjWXlSYWQveUhsZ0VZVzgvbldqRTk2K2t4aE5JWEU3UUN2TUowcDZybmY2WFY0c05tNjRGWDFnb2JyRWY4bkc4Y2pXczVCV2VvTmRXaXdYclNEWmxHN0tLblAzR0hucWJCYlkrcTRUN2E5SWNaTExzVm56eWROL1gyK0k0Mi9hTUdnd0VSQkhtS0xTQU5kbFFORDZwdGZFbXlTbCtTWnRvMlk2bG5mWlRaN01MT0hRbXBlaFhiRHZEZVhaUlpMM3l6ZGlpMlh2Rm55SlpvbGkzUnAzRTBhbk55M3BDdENqZ0FlNmNmOXZCMit0Q21EaldiVXAvb1JkYjU5UnVLdlE2THlmb2VTNENYemJGWk5rZEFqMEdkOXplNUl3U3l6bjkyMFJEU3NlWXpHR0VvR0RvSTI5VW1pc1JadTcxRVh3M0tUa1B1T3NVUjJrdkZiM25wUHdaSnZ4amQ2dWU4TTQxT0h1WkYySkh3YmQvUWFhQklMcGlhNkdZclpuK2ttamNqM09Qb3B0UGlCb1B0dVI2eTRycHl1MjN3eUwzY0ZWa2VjYTZxMWlPcUlxc2V1UUc5QmpyNkFMU2RkbVNxbEdvdTAycENFS29lMkk0NXZIcXRCNHRSTDZXcDE3b1FrVGJETFJKNXJGWExvamFDU1FTeG1qU1dTMWI3MlpXYmRtemhmU2VMWTNPcll6WGdhcnJMWXlzbGphYnN3NnFmWFgzdDJ0Ky85NmY5N1MrZnpmM2YrNy9iOVFPK1EyQis5UGROK0pPeFlxOFkyVy9tK1ZLV2JSWUs4N3pjZm1lWmFacm1GN005aDlLMlh1WDVRMGZkTzF5MjNBZzF6WFdMMTB4TXJiYkNxb2N6d0dSaVVsVXVzZGkxcXVkcWMwVHdiVjA1bWc2bFJPWlFtTS9OVE5KbTdVUzNCMUtBTTdwVTBlbDlybHVjUVNsRnBwNmJtYVROMm5HNzZ6elhScHptOXhyUTNZKzN2VjVNcmpoU2VqN25LK3RlZjg0UFdGZmFsQThvWlQvUHl3OUZYMWZkSzJrZnZCTmpXOVVMZ2N0UHJqYk5RR1lmbWM3c3FYTm5xNmQyaTJlWjZ1RnB3U2c2YXJwamRDZ1czOHZGNVROUmgxWFBKZjRoMkZUdys5Q3BBY3J6ZUpmc2xBS1oyUjFhL1F4YUtheTJsbExxUTB6U29ZT0ZlTG4xMm9aTEQzYlA0VFd6cHBCSEFmUXg1azNVRkFFWjdaUWNaRFJIU2dkSnFna3ZqZGd0a0hibkphSzFwdFNwVVNBcnV3V1JvZ2dGa2ZvRlJzMXE0S1ZaUTNocml5M212TFhGVDUzRGEzUHRkMXhtVnowZVI4YSs2bU1zb0ViakovWXZNVDIzbE9SSXNRM3IwWFdQTXV0S3BDUlRFVDFINm50bXpUTjBsMDlaYnJidHhCeVEvYmlBUlcvY3VBdUtkVnc4QVBSRXVJOXFQeStwcExzMDd1bDk2R1E4S0toWWJraGxacW90VldOcnJHNVg3SFFwbGxwNWFaZFNkTXhibzNtd2FNZDVZY1E1R2t6ZEkzRXJVOTM3NjVxbVNLY3hjSnMxUGZzb3NNV1JkYlBINnZqNzlSSzN1VFRQUXdYdG4ybDJWMzAvM1UvQ2ZCd3RMVk1wVjJIdVVlK0xlV1dKMlc5eE5JWjRyblluVmxOZHBPYWpPVHFIcDkzckNwYTRMY0hNSW1NMnZiV0dMMjF2S1JGOXVTU3oyeXpPbmN0VmR5TzNlbUlVU3N3eXBFUmx2dVIrSFYvSEtBcm5RbkV5d2hMWXJtYTNyV1MzdS8wM0dIVnlqZHNpdXZSTnFlYlVtbmFPQ3RvNXBqaGtQTU51Mk5xMEExQmR2R1dXcG9zbUs0UkNMWDUvcHRRbnpDWHMrWFcwUHJ5OEFUaDJYMDBsd1cyU0tuNjh3cE5icTMwRkFxemxMVE9HbmttYmZHMUc4YjY3ZnlHRlBMaUtuSmpiV2Q0YXM4WXBNNWo0bXJld3BZeENhdk1UZlZJbWVmOTZEUVhkK1RwRDhuS2x5QVRwU0U4Nkk0UzAyS1BqUXA3dkh6aE9xWEIycWVmYk5jM3diQlBySEExYUFQbkdHWkovWWs4d1Vxb3F0L1lZZTg1bDR4VnlPSDcrTnE2RTgxbWFhVGkrVE1NL2ZodkZPaHpjZFEwQUlrbFBNMkMrSks1NWxJSFVsQkJyV2tYRWQ5UXhoeHBBNkRjYlpLaUdhUXB3VUNqdjRPdDV3a0pyY0EzU1hFenY2UFY3SEthanI3K0dvVTgrMld6QWxDUi9xa1Vua0kyRjhwdnovd1dtN0NwcEFzcWpKNmxxdGMwWHNGL2N2Ry9EQzAzY0c1Y25SVE5kTjdtYXpPYzRiMHVWSzNkSVVxSFZQc2JXazlmZmxHRGsxM1Q4VXdOaU85UHBPNTBWNC9uQ3FMV3l3ZERPb2dsUlVxT2ZCeFpPbFNWU1RVL1dwTktIS014Mm9FUktuekNZSG9rNHh2YmV4ekpzTnVla2NoMGJjanMyWG9nU0FiWTU5ajBsUlp0b0gvVmhyRXVXenBkbVVaT1FwV0NrMmFrWDhlZnU5MGlrMnhYUmRPZjdJaTY1emZWcTZVbVlNMElCdExkWVVRejlkcjdsZy9TOTdnNk82RjhDMnJEZThqTm9IUEZjd0RFLzZxSDJQckJkSTN3VWo5T1U1cFFZVTZybnMyN2N0bExFeVA2cktvZTJkYnZPYmhLbjN0YVdRS2I5R011dEVHa2FSVTJUeEZ5bnpXYmpvclg3dmVOTVFwMk04SzEzZDNKZFlyS2JKbjNXaHdlTGRoMHlGNEJQVXBlT1QwL0FkRXJ5UmxCZWtQMy94M2k1ak9PeWpFSnEwWFZST042WXV6dmJTcXdGODdIM1NQRTNOT3l2d1JTVGFMclp2eHoxN055bXo4bDJ1VGpwTWlWUXA2bC9wMS9hT3hrQS9nQjdVSDNFZVVxeW5ud0Z1bmEwV1d4TGdQQlZ4MlF2WmQzejFMN3Q5em5QVHFGSW8rbDVtbmN0dnlQVnpUaGprOGx5WHhTeDdxK1FubUpqbGtmRTJRS1VIZkYwT1hnUkJjMnZvLzlTSWZ2VFBpMklTZisweWhyTGVETmdib2dVMDlhL0h0eE5rTDM0TjFaWEdwUFlySVFoY0lwVEE1U3BldEtaQnVCdHcwb0lLR1hjQTlYeDdnNVBCeDJpQUlLV1pQcnJZKzhSMTdWWW1nV3ZZdDRHYWRaNDhUWlk4OFovQXlKd1lOOFk5WFZWVmpLeVZwbGlOUW5qTlJBTTYySkRMb2VTN2l3TUFPeFhwdUZYVmEzR2hKZkdXUXVLRTdiVDBlT2dTZDdsakE4bnJNSzY3R3p1aTJPQkZNTm9WM3grbFhBSW9xNGlqU3Ayb2k1RTJQTkYwOVJQUzBNOW9zNnhyN1RITldML0xJbnNMQlVYMGE1Ri9XUDFQdUozMHd5L2w1bStUTmJGYkphTzkxK3Y5UDNkYUtVZjA5ZnBYYnJlaHlXL3NHb2NyUlBuS0FTWTBRTlV4WU9uMnlnMHkySWVCSUNkK3dHUlJGeTljT2hvQmJLaDI1OUdYWXlqNlR5ZGRoWHp2alhXVmNoZTlxaC9XTHlHeldmR2kvckgyVTFXY0tkdjh2RE5wRWZkYmxxYkZNYm1jOTM3aGZObFN5bXNHdHFkYWJUaU5hT2VFQm5kVHVuNmh5Z3hRSHVaNHJpYXVraWphV282OEYxWko2Q1BsUE1CTTg5ZlZwVzdUZ2tScG9CSXprSllnQk8rbFNDRGNTUGIxaW8yMjlQcCtucGhEUzcySVduN1hsUk9ic0g0dTBTSFF5QUVRQ1Rsdi91ZWhJdVBkNzlzSDZZangvODc2a1FVOUgwVmRIMlFQZFA3LzliVy9wdWlEMXcycXYwZG9KTkpsRFBLZ1FVNHZyeVhEKzV2U3dkSnlxRFBHUmc0TndGSzdOYjE2Smt6TGwvOEU2ZzloeXlaTEZRNjZrUmdPSVNyN09INk9RaTd4QjdkUHhmbTRHeW40aENqYXMvWjZPU1d0Wm1ueWphbmd6WmxwOFJTQ3VNWmE5M255aXJxWTdKK3VOUmJ3dWIyZHJzRkhhRWlxb29nallCNVdBUzN3R1Y3YUhoMjEremRMOUhpcUpuckgvMTdDUGMrTlgvajdScEVUUnFmVUowUmxmTmhySHBSeVpqeFhsZ0J4OVptZmljcXM2WXhvZ3NCckpJRUovQ1YwSHRQMU05MUR3ZC9YNFFnKy9sWkhzZlp5SUR5clY1eWpYUHhibWtRQzVjZW1pYlo1dmxGUXB6REZDQXVQSkliYUFkWHpNWjEzd0gxdG0xWUkzczltaVFFZ0kyRFBEQmxJcm9lYU1KWllieUNwME40TmhwOGhiSjNZWGJpOXJVNzYxeWZPajhpWTIvL2Z3T05iQjNCYzBIdzE4WXdGZWRGWnozTHpac2thR2U2WHdiQktmNHYwaFYvTHEvUjBNWkE3OXpKcU0wR2hyYlhhR0o1S0pSbHUvaU9lZ2pMUXFCVU5UbnY1M01meVpnV091dGswbyt6bkJhaFBzc2h0VXowV2Q5a1o1RE5qZFdDZXpWd2FiRCtTNmtReHhHc01GSTdXZjkrNmdvdmxWcEptSExRZVk1MlFEaFkrbHRCR3dFQTdWN1haWGlwNUhTS3R1blFhbFo4TWx2WDk1ZnBtNERqRlhEeDl3OVRYZ3gzQjJiQUhqaXcyNTA5QUt5SFB6VTlUVi81TmNWSHZrelBUdnlBWXdKNHV6dWgvUVJxeE1hc1BydXZMZytIelhvZFZ5NHRlQk5ibEsxVDBHc1BYL1BWU0lQb3dsQ05QdzFYQ0t5cE1YZmdxeHJ5OFJZVmo3OENEWjNadnFYVVR5T1RaRzBwa3drSUM1QlJDdDFrSDZaVTF2cEk0QUZtMm1sZ003Y3RCT2h4L3YzL2h1ZHM0bjhYaW9TNHl0LzY2dGgzM01hOTk2V1puemI4Zi8za2hoTTVBQmJVZTNVQy9BTzNVb2VkSFJLT2pVVlhOMDBJZmRIUnNnRVlEdHE2NUV5cW5hbXJrVHl6Um54K1NIczRiV1dBT2tKOTkyTDltSjZWSDM2SnFWS1VoZXlybGY1UWNjbUpRSytRTnFmM0RoVXRLOVZHemxicWZBcmFsTzBIYzgwWDZnYUQyc0dZZFJsT05saEhJYmltdkVJOWV4dC84bVRCdUkwdnQ5KzJ3blJKQ3BUZ2lJemNGcEdTbThZcFR1dFRiK2FTV0IxajY1bVJmYkNBY1IwemJFSEQ4aElzQjA4aFlsR3E3VVByUXlKNEJEdkxTL0FzZWRFTlFMQUI4WWp2QTRNeHoyZnRzMmJTbnBQcmxzSGRDRW1hTTBkZTVWRHJPZk9INnVFUnUwMEM3SktJR3RiT21ET05PcU96a01qbHAzamdaVWM2VmtXb0YzZ0d2em9TSW9YL1BKbGF1VEptUkxLc2hCbEFYQjBUNWdJUm5wV0VHVUxjbUNORTdzNFRvdStZTngwcjFlVnlMV1hYN1lSNXdCeDROcml1c2RsYjFxMDFmbHZUM29wU2ErUlk4YjU3TGlEampoV051ckZ1N3FoalF6S01KTzNNeU9WRzRzWjlsdFNtZEZlWklQTjNjbnBVV0I2WVpYZnV2dWV4MTlpVlJKdVBxVmNnZmFYYUJuOUxyblBHN0hIZk9zZXkzUlRGVmN0UTd2MnNKSTVIamlqNUdDeFZPZGhEekFOMHdBNk5zbnZVSU13clRiVVFqUDlWMzdyNk9aZ2cxUWhBQ0picVpCUUdGR3dGV1FkVXkxa3pDVUFBV09QZ1U0bnU0UGJ2aDNzSTdPMFhWTjlzdVVlQVNCZnVvZUVlMUQwTUpPRjVEd3MrRXUrMlJuaU1uRVVBUzdJTTl4QndaTk1LV3JwRUpNYmNMWnlNK1QvaExMMzlJM3FxVUdraXRTSUZDbFhqaFFxK1RYaXlRc3RMMGxXeUtJY2tteExFR0pka1VPdEVjU3RRZFNUZGpXVlJXQWJxbXZRV29rNVVKa21zb0VlMVFGR1ZTaVp6QkZJNVdjWlFGaFhUWktrOCtaZkNjdFhHQ09Mam9qRUhhL2tvRUZscHZzQllwZFBWd2dRS3ZzN0g2U3RkOUEyOHd6dFlKUUJMMnVwVUZZb0pkb0lpWlN2NEVROU5scHZuQjdVeFZCNEhsZWFDUUxHa1ZDQnE2dllnNmZwSU1RamNHTVNnRU9UNkZhUTFKR1dVWXRHL1FMYXhwcExsSUFhWEJiajZjT1lOUXYwQXlUMHBmaUp6NHBCeDBlbDJZMFBOcmd2ZGh5ajRJdXJnYUJWY1VQS2IyeGVLbDRLaUtZWENTUlhNcFpVL1czbGpRVzZmVFU2L1RuWXZKS3ZISUJpaTRnKzZwc3lCUWtZbnRkSTdsZFlhbGRyS3JaUzJLYmtONW1pTVNxemJGcTl1NHRiWmNDcHNZbGRkc0twVU1VdGpNUXFWVUVndGVsRkF5K3VnNW9MQ0ZqbFRwTlJieEVRUmtyUUFueURBeFJZMlV2RWhXbkdod29TNmd0aWdDM1JRZ09JV1NCU0N0aFhqTjBYN0w2S3VvQ0l2VUJEaHZRbjM1b1I1ZDBMMjM2cFFnVk5vOHVzcmlwd3Y2YWE3OXBGQkc5Smt4MW5vOWl1UHJRWWlHMEw3eEo0WE1IYnNQTXM0cmhZZUYvUEUyamlCampaUEs5VFluazdTelZlNWJua3p6a2YxVTJvNXUzZzFuMTN6dVQ5OWZETGJmYnd6TzBsMmtuUDJacWVVenJFQ1ZEdCtmRFRiZjd3M3k0WlU1MWx5bE93bC82L1NJdkR2cXpmcUw1VGtjWlY1anc5bTI0KzNaZ2ZKVm5KT2I3Wkt3em11dHUzRFhUekMzM21ISFZTeW9CUGd0VndDditSNk11Ty81eWtJdkdub0xDOWRRdnlaZlBmakIxd3BCdmpkN241eFlQSzlxVkE4V3JHWTAxNThyTzRvYSszSERNSWhEdGtqeDhyc1dpcXdXNWN2MmkxRThTc1VmSC9wWTM2dytKeGZ5T2NBQUFBPVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yM19fXyA9IG5ldyBVUkwoXCJkYXRhOmZvbnQvd29mZjI7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R01nQUJBQUFBQUVFMEFCSUFBQUFBZTVBQUFFRE1BQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdtSWJJQnlFVUFaZ1AxTlVRVlJlQUlJTUNJRjhDWjhVRVJBS2diSVlnWmg2QzRRZUFBRTJBaVFEaURnRUlBV0VlQWNnRElVZkc1NXJCOWcyalJ2ZTdjQ3p2UHMyektnSU5nNWdpencwK3YvL21pQmxqR3dDZnltS09DY29pa21LRUpQT1FwZXM2SFczdEZKWEpBYWx0bVpHbVB6ODJISHZhcy9RK2t1Rkx2ekdOZzQ4dUEvM1BucFQxTk8xYXdzVjlJdEdzVHRtMVVldG96MFNXZHBMVUtnb0Y3L1RFdUV6UzVoM2xDUFJNeWRiYnNVSEtBUzlOTEh3emRvajdkOWpkdVd4L3dNWjVwaHpNSTRkaEpxNjhEejU1Lyt2clRtNWVSWkttTjM3ZGlXcGc1bk1BR3hUakp4elJxT0NFN0FLeFVDa3BZUldWQVFyVUJTTXdnU3p0NmtMRlNObmJhNnNsWXVPNS9aSUMrWkdTRFA5N1g2aWlHakhFK3QwUW9qVWJJZGpyRHZFaG92Y05rVDlXaU4xUXB1QXY1enB5cG5adGZrVmgzaGZ6bTRBYUNVLzhkMUo4YlBQQVlJTmtJTmxpaDZkN3BYcTA1V3ByaWp0bC80cTlaZnczMFZiSlVPck90VE14Y0FEYUJpMjlOY2dEVjFkWk9JUTIxbnlaTlNHcHRoK3ZFN3hUbUI0OTcraGdNdmVZZWRKRkNNa0paQjBpOVJzY3JNVmtleTBUTTdNUlpYR3pMb0pwd0R0OUJRQXBNbkJvRGY0YjNDK01mNlRVMDMybHFja2UyY1BwVlorcUZNL0NTdmhQeGFrdVNveFlJL3NFRlJROUVCLzVKa3RYamdBTk4vaFduMWZTU3BjZ1U3VEFDN1I3QUdCUGlYcTRLOGNMWjh3dno2MC9zOVVzNTNGWXNtbFpONGpwT3hJWG9SRExwcVkrTjUxMTltNWRyWHpaeGF6TTRNbEJrdElRaUFZd0pPWkZCWWdLUk1RZlVjUURpQjFLZEFoWjRLa25pbFJGMGlkN0tQa21Lb1lLMVZPVlNvYWQyNWR1aTdQN3Z5dWMwaEYxOXQzdnBWNTBvNnpleWMxcVdwY1ZRalZCRE1ZOS93OTdzZktMSXd3clptSmkySkJVNjQ5WHJlSVYwTjNBRG9VU29yaHNReW5aNE9yZDFycUZLc2dDVnhHSWloMXVlVnp5MXBsT2hPS0dwT0pPMEpiRUllT1VCNDZSV3ZvQWdaQ1YzQTg5RERuVXQvd05jWi8zRFcxdlFiVXordlY0TnJLdE1ZZXRjbFRKd2wwOGY4MkNNenMwNVp4SEsxKzhPcVM2MU5zV1MvZE85bXlJV1g3ZXI4dENiZm5BTUhRT1Z3bVRhQmNnRzBEbVZLYi9oWVRLRWJoMnJycVF0ZWFiZHUzNHI1T3VuSTF2bHN5MXE4RXVVV3llZ3ZZYlh1MzdvSzA0M1VhK3A0YnlRMUNiMUVZR1FoazdVTkhONzE4cUZyVW9UVkNLdGhnbUprbGRVME05dDJkQlNuY3ZtVEpQYVEwQk5aVHRoK01Fd2FVZzZqVlVxMHMwL1I1Tk5FR3NxRUFSWi94d0ZyWk5wNG1qUmxtbnNXVEtwTjQvdWxlRzJZMjhWUEhNUDFzUnpSTWQrS1Z5NUkvOXJadTlBelZvSm1mK0tObTdiMzhoYzVCVEdxdjRjdHpvQkcyYTdOTjZCOVJyM2M1VkFhQzJqUU96TDhYWjc2Z3dReG9mRVVMZzQrbzgwOHBOSnZQTUxnbVljWVIvWHpwUUF0aWtGOEZ3QlhrYUg1aFgrM2l0dmtFZ0c2WXRXam96cWR0MnJ5WkVkd0FrQ3VsMXNvRWdGSlZtd0hJdFFEQXA4Y3FBTnFqaVhRV01vRGpVTDFSMzcvbTloRFZZUC82dzl1TGxGKzVpcU10N1VvMFpPK1V0MHBMa21HSXpTb3U1N1hybzdXbTJUWUF3RUdNNWxKRWFvNVlqano5eTljU0FIVTR4di9TRlk2ZTB2UDZTSiswVjNBTnVCYTRNVHZzYzhncDkzbkdCM0ErZUNZSVF5WFVmemxYUHQ4Z0dtclBvZnZFUHEwUlcweG4xK1BwSDNBa2Y4K2Y1YTE4T2t1ckxsVXFQLzQ3cHEvKzlPRHl2bVZMRnN3NllraVBkTjlSNEtQOGJPZlpIL2lHOTZpeGxhVEc3SXI3c2NoMzV5VE1BT1J2eGZmU1UxMlcvOU81ZVZuOEhRQnVaSXErUGFTaWhrOGpQNCtEdERPcExQY2kyVFN4bnl6YU9FQXBvN1JLTUlxRkg5SHpmMEJKc1pBT1hrcER3MHl4Rk01WDBzRStEcnBUa3l6RU1pcG1HbVZMcVdrR3dyc01mbWhkYmlralRETlBMUzBNU0RCNVZGRlArN3IvR0hMcWFLYTNYSHFPSHlpbWdnYTZoVVFKVmZTZDFzTit4dE9XbFlZK2pYT2dEbHNqeDlHVWZRUDlmZlYxU2tWdFRYVlZaWVc4dkt5MHBMaW9zQ0JmSnMzTGxlUmtpN015TTlMVFVsT1NreElUNGtYQ09FRnNURFEvS3BMSDViQ1lESG9FalVvaGs4S0p6aUMxdnp3NTNsYWt3RSs0dVRuWlhsUEpEKzdWNmZhM25nWTdnWE04R0xZRVBYWm1PSEh0bGpiR2F6YlE0TEtkbnh6WGtyL0Q4VzZ1UWg3czl6SGZjTXJEY2VXb0xiUEFTdFdzWW5ic3JtVVhTVkJTcHRCbDE0bXIzczF1dEo0eW9GNktta3lBRVNsT0oyQlM3OVU2NFJ1SHRwS2ZVd3hiejJoYU51dzIzcUxrd2xuN0xEU0x1ckJXUVYxUVFqbUNaZDY5ZW9zem9xaHlFTE5iMzNQM0FrbThHakhOc0orL0tJOHBRT1JFc0NVdlIwN2FTNXhsWFljbWpsV21WVXNLeWZ0Yy9TUDNKNGxOdlpZSUdpbkdIMGVUTHQ3VktwY2pnSGhYZDc4UVVoSWFQbTJ3TEVaQzF3RUNTd2k4QkVTTDZpLzZKOUp0bjlSWmwrcEc4ZytFOU9ZWllhKzc2TVpFQ0ZJMGtoUlFPS05Sa0xmcDFob1B1a0ZqYk5MY1FEVHNCZ2dCUzNyd0VnVG1jRTlQTEgya2ovVVp0ZEhxaEovNEx6anJYd1FGRVg0TnNRMWxaUFJKeVJ5YVA1N1dXUkNVcEtWbVlJMU1aTGVHWUNJbng1L1U4cXFHQS9zM0t2ZHJDT2U0K29vVm9uRjRKL1ZhTzlHUTViaTJiQklrUllTNTREVy9Jc2JKNUtDbnJtMVAwTWJmeXJkYUlibFdTSTQzbW4xYXNrU3V0MU1VTlllU2pLdFVJL3VSS1R0UXdVck1RYVFsdWJ4dmlzQmtmOFdkVU5MRDRQTG1mU201V2hBNlRUVitIYVN5STExSklXS2hZTm54WVRPWmtNdmlzWHFja095dzlPTk5BMEhjcU5ud1JEMEoyTWpwQUM1RC9ZdmM1alpkdlpDY2wwVFFJL2RjYjMyRXlLRTVnc2NOblRnMGpQRlhSYjFHN1FSRHRsV3ZEY2RKdjJsSDF5NkNzSm1rNktEQlBSVlhjVGFxWlRRYm9iMXczTkh5REU3YnFGTHJlRkNZYlUvNGNSWVAyY21SMXRCamNFbUFHcjk2VmNYaW4xVk93dE44cWFuemwzZ3FHYTJpcHBYWGtxNFE3MjdWYThXTlZOWCs1R1FUUVVNK0pWZmI5NUZad0RMdzhnTU16a24zMHo0ditGWlZWbmc4a0VmdU9nNUlIN2ZYQ2pnN2tjYXhaT0lNclgzTWVEQXliVHlOamU0VmV3bE1jdStVNk9pYmdSang5R3lrUEVmcXo0dk91U1dBeXp1RWVJbzRuOC9nb3NabGI1dk1GV0dhSkNMaSszd2huYlV1Nm5MckpXM3lPRG9KTy9Xd29BM0drbHRxNDhGVmRac2tuSVU0WklwbTRxcmxTY2JVUXF3N0E1TDIrR0JHS1BpYmh5Z2FWVVk3elVyVE5rWVhqTHZSa1R2cFVlV2NUa1dwdFFyb1FRTWFUdDBWSmpkc0F2Z21QYTRRR0pCOXFBR2c1Z0NycFlpTEV0TUk3eFFYRVN3RlcvVS9ZRmx5M1hMY1FNeXFjd1FBS3k2TENqb2dyRiszMmZnRTdnRkxBQzZYQ1phWDVhOGt6Z2hUd2NLU3QyUlJJUTdMcVJ1WUtsV1JXaTNrNFd5b3BBNzVXa1VkQUFpaW55di9BR2hEMDVPRW5aekdLVnl4YWVwUWZtRjU0cHB0dk1aVit4Smd6R0draVhRS1pEazNJaWxhZmpjSjFpZHhyQm9sOTVRSFJsZjkwSWEwWnpSekw0SHFoY3Uzb3QvVjFWOFFEOXBrM0JYbUVERlhEMnlwMGo3cElmS1FxNjVhc09wc3VuRHNpWWlFWjlDYXNpQVd2V0VCbENETHBacUE1WWFYTkplYkxmMDVCQXNnOEdrZCtlelR1Wm8vT2VZRnppMEQ4cVVyQ1JnSWJ5a3pzQmpXQjNhaGdCcDJDZ1N5YjBQWlora1gwakVaNnFoTlV5emdHWHJaWE0wakJ6TzZoSm9za3o4TVNudllvVFBvZkhUTjVCNU00Q21pMVpTaDFmamZSdEcxTTRiTm9SWTFHaGtKTlN1NWE5RWZVSTBPSmdmTXprTkZoMVVIRmtuQ01tWFRjYStvdXBVQVVoemtzNmNTL29XZ2NPTzdDK1FWSmtLbnhHV2prYTg4UHl0eXZoTmgvVU9kUDNLQVEvcGhDc0FRWGdtaEZYZkhwbUYxdDc5Nno4ZU1GWW5lODZsVVYyakFpTGczSk5zY0pJVmJGNU1LZ0NTZHBTMEVybEFjK0lqcEtpaGNhY2lWd1VsNE9abU1yb1E2MmtSM1BaUVpnTitpTzRMNXdFSUJROXFUWW14THA2bUxBWm9LMWExNC9tMzQ4aDRjQzBZU2JKekhPUTlHWkV2M0MxbDRNMmVKRy9ndExrOFR2TlRLdjJJYis1cURiS2xid1RLVHE4cHMwcHFDQUFYczRXVFRiV1pJVGlpNEo5RTU4M0NJVG00UEpQZDBrRTROSjMzR0gzbHdtb1FhWTI3d1ErK3lRUHFtRXBxbFptNXY5YjZIcjZnRWsvZnhkTlRNblZESmtZSkdSd1VzUkoxU0JPcitIK2pRRFlCUTRQTFpRaW9IM2h0NFl1czFLZHkyTTlNZUhaWG56TGF5ZS81RkQ5ckxZZEJQRUNUNEJXS1Q4Q2JBcUR1dzVMZi8rWnhMY3lrN1BYUVpZRGVkVjNEOW52QzljcVN1b2RCWjQvemsyOURNZlF1YVN2MEhkUnFtUTVrM3J2OTF0RGVZNDl1dVdhQXJ2clV1Zi9GNThIRzNnbDVFOEtTSXZkbFFUSW1NMUhnaVRpNGxSU2FLK0oybU1jNFZlY01KT2w1b1dqa3VxWGlvSHVwMHhzNHpmSTdBcFJOTDczbmdiSzcrazc4aXdVOTAzL0ptSWtSNUsyVTVaMUdmeWZCYXZmWTV5Y2NzazRXdHVERERlNklvK0VENGtqTXErcWZnS2lOelRvaWZFRXV3cnZDM3JhY0YxUzhGeGhuTzh4ZEdGM2tacHZsTEkrY3hoSGpibFNuQW5qZjRrcGRDWENMT3BoSUw5d0VuRWFKZEFFb3VZWnI4YU8xVVBvRENuMEJLekhMMW5XTFRiLzF6ZEk4VTJ1VE82dS83T1poeUhrNThrR3Y4dHdCdjd5RkFQQkFzMlgzbnk2U01zK0dra01ydXlSWUg5bEdHeWpDZ1FEZjVCWkNYQmxKUkhZcWNLV3doVVJmaXNuV0JHcWxHU2VaVzI4VHVjZmwralc3YkxPVWxaVVNlWGxDdEFpVE5iVmNzU2xENWllNzNxOFMwa1NGc2ZmcFlZenJwaGZDTHl4bGswQXpCM1llOE9tL2xWV1dHL3Nvc0MrVlBGMDdGRFZYTzl2aktWMURCaHFMY2lHbTEzZGlpeWwxMkZzUXFjTVZaSGpoajJVNklHN3gybmdpSmJpSmgxd3BGbEp0Yk5lOU9rUzR1aXoyVWZGbUlJbGxFZTZEdnN4dDdIdzR4VUxnZ2JNVXNobFpTbUV2MXIyNG9EK1NEUTJjeDdlS2NkNHUwY012WFNtdWtqbnE4bTFwWjFqbFBqOHRGZnFSZHVNR2JGZExWMVZXZEVUOHBSTU42MkVaclRmYkRnSldRMWc5cDE4ODVrYldZbzhleXhvZm9EMVN4WkZySFdNSlg3NU83cmtpMERIR2JsL1c2dUo2SVZvaVJZb3hVRWRGYS9HUjBHUDNlcmpMaGpvajJlWmV4NWJ4N1VmWkZlQ3pWdXN0Ykk1ZTBsTmdaR0VSVTVBRkdiWHRQbWxneUNmcHIyYTZWSkU2cFA4dE5mS0RpdlVuWEZEc3M1VFVMQVE5azVJQ3dKSkVMVmdvTHljajkvMVJnak10eWdNR1QxU2RQN0pxOFZweENoM1hSbmJDODVYL1M4ci9MSWZvYjdhamM2TGVGZkZJQVhkcDEzcmxCbmhON2VzWmwvdHdYRDJEaXU4UWhmVHdVNFkxd0hsVllla2tsKzJYVm5NekR5VkhRUzZMK0xKNzIxSkp4NEJxMnJzd3YveDlHYloxSzk4TkxVb3dWR0ozUkltaURQa1N1eWIwL0Z0RUlFTDFpRjFIaExRYk5VajduNVgxbkVLM2x3ZzZ2encyRE9rdncvaE1MOExPODNJTGFlcGUwQjVHQUw4WEFVc2ZCekdaYmJ5YWoyZ3dIYm90VmFtSmNNOXJuNEhWVWJnQmpBbGhab3pFYXQ2bVZmS1NOamhTWkp2cFF5elRKZSsrTXpUb1RlN3VTaHUwOE5rbzczS1dVdDZRQVR3eEM4Q0FmQTBCQ3pxOUN5WUdBaWxTNGdzd3p6ZndCUkYwYXIvTWd5cmZiL2JBVEVWTWMyTldoenhORE1tVVVqc0tjbGRKTURjV1c5ME9VeWJXR0UwRUhRZ21rektVZ0VZQ2pCRGVKbTIxVzMxanllSldvOUM4aFBackUzMmdUMUZDK2crLzhKNjFBbnRIOUY3RTc1b1JlSzRGS2R0eDdsQzc5Y1pqVVJPMVpnVERUeWpFU0Jic0RudmRra2FlVmFSQkxrNnNnUTZ5WGkvQ25ZNmE4VTN5c29DRm4vM0VkN1ZMTGFWUExhMXM4YTE2WFdvODlRaURrdHZBYlB1SWFoZC94b09KMWZSR1ZMS2xZekMrNGkzMm5xTzlOd04xQkN5dVMwMnU1YzErclRkMGNUNWdGR3dpRmgzcWtkeU5WSk9xZjJlZEpPcXhMUHlFVkFZcmwzbWtxSmFPQ05hUGhRYWZ3VWdEWTNzcTB4S3JxZG1aeDJiZkZzZGtUUXBWV3RRK0RyRk9IYUtWWXNCVG5jbkppV2dzTlgwaEdhNHRSOS8xaFhXcWVIMVBYRkxsazd4U3ByS2VNMTZDdnpwTmI5MHQ2ZjNPUW1YWG9DVkpsZlk2K29PY1dLOUFMY2J6QnliRnNUMlJ6angxTVBmajVTT0JwSzFMVDNkdk1lT1BQckdiSXd5ZlBzTTNNK04rSm0yYlBPdHpWTjh4MkVUN2w2Wlh6OUxtSEk4TFh3MmJHWnllTzYrMUh3UlJZaU9vVXlCUVhlV1EwcG5NQmRPc3FtMWlyenZwZTUxandLeEJBN1o2Z24wRzVGSGlhKytXaDZ1UlJvaXNaSXJ3Tm8xcUpTbWhNa0o4QnJYMmFOdERCQ0o2aTlnSDhwb1k2T0k3UjZVWVBlZ0hzY25DMTYwK3ZFVDFHTGw2TExBVnY5TVprNVdlNHpHQXZldWMyM3c2ZUcyR2t3OGkwb05iSzd4UUFQbEYvNU1Mc0tGUWJhUFozRnpEbmlPcUs1VzBwdHRIQ3dsQlRHZzdIMmtTOXh6VXhzNzJtaXJVc3RqZ09ITU90eHlhcWROb28vUlpwUHR1VXNGdkxXVmpPeDA1R1hNb0VMN2Zqc1ppTVVEYkdKaXAyMVhqQ2dLQ042RDFUVnBjZ0tsM3c1SmJLd1RWUGpQYmFFMHQybkoyaURaSW9DcHhQK1NBSWxkUExnRkpLR1dYVXVjaDNsTkR6aGp4Wkh4ekhRcGFNVnhnM0psN1dGMjlkS04vMnpoRG55SlBucE1lUzZ1Z2lYZUpob2czTTRUUHJzdVF4Wit3Rm51QlBBUzdGdTdsYys3WllMYUM3OW83ZENHaU1HYXJYTjhUZHhZTGFYdnUyWVF0WGNZSTlPdEdEb0xFbXFJaWNnc1lCcTZmdHFFUkNjeFVJaHZiRzZvSlZ1M21RUFRQTC8ybUNhQ2U5UUYvM3ZudERNaWdlZ1pQUGtXbS9TdnFJd0FoSXFEYjFYM05reWJpazJxMWR1b0Iva2tjR3k2OExzWGR3SUlyRHYyNmNLZWNGWDh4MnB4ZTg2UE8rbkc1NE1mRzMxRE5FR0s4QjdURll3dG5lZmk0cU5UaXVMcUZ5YXdZdTBMYVkvQUNTSGVkUHpLOVBvWmYxOHVyZnhxdnZ3ZVZKN0E0cm9YcW4yUGRVdlYxOGUzZnNPNWhnL2l4WGpnTm9SQ0hXQngwNFlYQ0N3ajdMVUFtcHF1d0pPOVFhL2FZbHJ4VzRqQnV2dzhVeVdNMC85MWNQYm9mdnFOdm8vRlNqUitqQmNTVlVWaFRxZ0tyckY3NkFMMVNJa1FEandTTDBsUVYzS1lkN003VEZXR0h6WlBSZlIyQlZqQ3JTcDAwcE9tTjFmSCtKNldYZ0cyOEZ2eVZmczI3TzdjWWp0c0RaNnVuT29MQ1hxRCtQZzd6MnNuVzVuUDJFL0hKVUxNRVBacmtHdit3OGQrWEwrOUlnbWs5Tno1NjJadmMvamhmUmVoVXZKNSt2YkZYU1ViVmpsZHBkYlBoRVBDSFF5bktwZ29kUktWdzdubnFLWGJDdEdpUzErVFNQZjRwUTFJR2UrcFAzTkRVQnNjdFFPd3luWFlyNzYrNlZXcTVKQUd5U3VmV0gzbDE1QndSVTRvUEZuOEt6SUFaWTVwSW5EeDEvQkhic1ZVRVVId0NRRXc5aUQ1c3lLdjBEUmFqbklwYlJQNGtrS0FaQnppaHg1S3pjM25nUjJJQzRiYjFsWmErb1NSMHFVNW9GV1JmTlNjZlpUa2RSMGxISDVNdUJZbFBBeS93UUlwQlRuTVJTN1Z6dUhZYmN6L1p5M0t5cUx1WG5VNU1vL3BUalEvZEVWOExRQm5kcEVmcG9tS3RlTDBhaUFpaG5KL0gwM3lPUkNKV3VPL2wwNjV4dG1mck5KMkswOFIyYnhJNFRpYVltRG9tNEtENGRNa1RDV0pQQnVxanpQdnlzbHJEMkpiVTBQeVI4bUtwU0FrZ2Q1T2tEWStKQ0hkalp3S2owVDg3L2pVbndWMHR0WXFSSDdDS3lMMS93Q1g0dTlZRUdPMjRGMGh2T3BjKzUvWnhoZ0pYMENnWCtYeE5UVkJNTnFOSmVvTi9KdVNvUW00TWNuVmo2TXNabFB1VmoyVUJQM3JsQjI4dWxkVW1URkpKSUZqZWdnUTl1cWZWd2xZcmE1WmJNUHM2UUtXTWRUZkpvWFRSaWlYT09Tejc0TWh5TEI3ZFVCZ1lZb1llU2xnOXVFenpENzFRUWxwOXJsdDVUSmtvbWVHbVY4Y3hvNXo5OFIwSGhEWDA5TVlHVytqcEpOR0lPMmZHWlh2b1l4SFpOc3EvVDZCaFc3ODdTUEhOZE0vM1hHdkJhdzJ0eGFZcWtXbVYrcXJKOUtJQUpVcGJrclJKTWhFdjdwZmx0QTM4NHoxSVd5Q3JMZjBXdzU4M01LRFRURUphdXEzc2pic3VCZEVvVWZaZ3o0UVFWU0FVU0plTEdYT2NJVG8vOGFkRkdkUWlLNlc1S3pabm9zWDBRWklrNnVkWTNJbER3R1pPczE4bFBTZDhXOGIzWjZtL0FPN3Z2MG9tNFlEOWZmRENSZ0VmNSt1RlFGcVlycTlBOUdaQTlleUVmc3hxRjRtclJIR0FsbkR0ZlB5N3V3NXBYMHVlMUswRllqb1hjZzczUytJYjhrT0xiVVUvdXM4bjF3WEI4Z3JRS2IwblZiamhpYkkvZ1FmZTkwdFdPMTBKbWhMekd4TlQ0am5sV2dkWnM2WFNtK3J3ekJlVFhoTE1aZ2pLMFY1U3c1YWpZNnJTdXU0c2JKbzl5U25jVkMrbUJudUVaOEJqTGt1djFGTTBVRDEreVg0ZzdQVG5BMmVyNzViNzlQeng2MVB2TGdZNkJYOXdxT24vb0syUlJKeVlucWRNc0xtdDZjb0k1Q2U5STlGMVo3YkxkbWZEZUExcnQ0ZDEyOXYveThGSEhELzFGMnJnMlpVNU0vL0JNN0lWOXZ5b2VwSENiazJvbWxxckp2WTBTd29SbDRnU29OdmtwbFFPeGY3bTg4RmNYZjlGYjFuSTFOdmRvZFdaRWYzdEJFdUkxSjlPdmxKSWMwNnFpcW5YdmluRFBpUXJPcGhjTXRTZ2F6a1Jqd3l3MDNXSnpoVHdhcTVJYVVZN1ByWXBpcENlNEtmUTdScC9sUFlrT1V6cWtsQnpzT04xNS9mc2hkRUFWU0ZnNWxGS2t0RUdINk92NWpxT1JDbUJxNFpDb29zb0JIWEJvQkJOUzVSaGZjVEMxVkFGR28vU2RWODJnTFUxUzY3a1MySy80dy96bHBMR2tjZjdQK0NJWWNFNGhoYlVBbmJjdEJoc0dKeG9ubnY5dG1HbzBGSDg5YjB3S0dFT3J3S1J5TTRiVEFuaEdMOXlBOWJqbnB4N2QzalFpTHRqSGp4Qk1KQkJRZmo0NGxMNUg3K3BlcmRYUnZlYXJ1N0NMVHhmOUxXV2J4NUtyUis0Y1RXZis4RW5JdkwwOE4zWjNNWTNwYytQTGxkQTlUWFY1ZVUxSzFKNnJPNkdHalEweVdXTUQwdERvK2hHREVBQlhpWkFmQmJrcVpXUnVzM2VUdWVPWjVyb1djWGJQZElRcXVieXJwampqY0RnWHc1ZDBORkFIM2FMcnQrTXlaNHZ6WTgrUGJlV0lRNUU2bnkxUmR4SVNxZTMxTWJIR3VyUG1jMHRkbFlYYjMzTFc4ODlDb2wwSFk5enYraVpmUERyY0pFck1QeDVRMDlYV1hUUkdpS3lJa25RWFY5SXJRUkpFUGllUEVmbzJ1dXZGODhzZzRpYm5NZWNJWjd2RnJmYjU3TjNIOG1jSU5iNEdUWjJncHV2a3phL1pxZ0E1K2xYMFBrNHVYbS9zcTM3d2EvNlVkTnNKNnpSTWNydnVseWhSRVFVZE9WMkx3NXVvYnRPL09RR0kyZnNEWk1qeHFDSWpSMW11QXZKMzFJUCtrVmVDZ3g1cHV0YnROT0V1N3hOM0RzZVphYy9zZWlsaU5uakZWcDFKU3ovWDJpOTVmSzJ3UFd1SnBUaE0vdWt6djJGa2RxR2pjN3c3dVp2TmttT3dzSHFHcklRQTJndFYydHNOWEsrQ0VnSk1JY3JMbGR1TW5QMTUwVFJGZFNJZEZ1ZmFseFhWbVZ4V3VIaFgxSEhnZ1NCM3JpeUYxOU9heFlHUW5JcFRpQTJ4a3R6OVo1a0drT2pjb1k1REEyTWRoV1JxVG5PVTBCRVpDNjBTNEFwTXQyc0xlM016YWFSME9TVUNSQVVWMEhBWmxNd2VpUTJXRTY2RS9NMS8yRC95Um5EUUxWdmZwWU9XWk9oOTh1NmhPRE90R1lQbjhjeEdiMEhscWJUMGN5MzkwaWZYaTFyRlN5ekZFZEtQWDZPVW83UHpuYTNqUGFrOUxLWWNPNFlYTHkwaGdxWlI0aFJwZnlzSlR3aGRjYWhSN05kN3h1RUlGVm9GSWxXWTBaMFc5czdxaFZ2OXhOWGdqd3ZoUXYzSG1HQTdma1U2VElscy81TWU3NWQ1V0N2Q1JNY3ZwbjZxUHZqd3ZzbG5rS3IwL3BrS2NWbFBBUmNWZmtWTlFMMXdwcDJVa29SRlJLQmpZcHhpTWVuS25OS2tmVDdFdlVGS2x1dTZmK0htN1RQamNTRTEyV0lLRW9NZ2NLMzVLSWNGRHlJbUdPN2o1djVLOTRGalVKWlowa2NpMStXb2pocGVkRngybGo1WkQwcnZTczBhbkxnMlU1ZDViYXRRR1QxdVoyemFwV214UzB5aklIQXg2VjRMNHZWOXV3MWJGK1lOczA5Y0ZKbU9YK213cytxNVZQclNuKzlRRXdWNTZGbjdNMjk1aGZQRFppSHV4VmQwemM1OXlzSXBJc1loVlpsUkpzd1h6K3EwN2RLOHlEYndTS3RJQ0RyZ0VyZDBuYko0ZmNieDNLbDlqc3BUZmFsVFYxZzJMR0JVMDRBRjB4eGZOSHNGYUtCY0hUWXhIVG5IUTllVlJjVVk2WXNNdXhtY2RrbDkrZHByNGVEditpTTRxL1V1ZVlsOExudjluenhINyszREF6VWNVc0VSVkFQSXI5ZS9aSU5kTnhqK3RQbTQxUEJOOTB6aURKaGwxY093bTdjdGVlNTZ2SWYxVGlVd1dieWdLWjZVWEhWak8rUGFDU0NWcHhIUDVPUHZTeFN1NnRkV1FLeXVQY2NjbVVNdC9uU3U1djkzN0h2M2RVOVBGNlBmUERNTGV2WXBIb3A2UkhZS2ErblU3cGZlS3E0M3p0S3Y2Ny8vRnd6N0JkcjNKbkRsTVBQRDYwVVcrOFFQcFkvYzQ1elIzY3k5V3o3cFMvOTExKzFlTzFaZytHZnZ1YVJXaTRNYlBHdldCbURxS09DdWR2S25KQURKemRZWEdleDltZ3owcTN5cHU2YzcveVRydXdYR3VTRXk0Z0JhYzlPQU9Od1lzNlRpRzd6Yk1UeC9vRG1rM3NFZkJxS0xxb0l4VTNjdUVFcHM2aC9hdm5IQWtHcS9ZcWdicUZXZzBVUWFISmFMLzdIOXRxRmpsN3p4RnordWlRbU1SbzFXdnFzdXlOekFsdk1UWUQ3Z3poVmRzRTY1Wmd1WnhQdFZ1dTB6ZWxISFJLdEtzd2ZOT0dRWnUvVjBrbWMyY2Y3UHJMR3BmN0pVRjlqbWt5KzZXZTRuWHo5MFhodGdramJlbnNqWTg2aDdjdXBCZDlxZUU4QXZxTCtuSG5kbUdoaEJVbGFCbWsrdXhTRlY5UlZQU0ljV3c0WjdtT3lPczl5RExTZEM0dXB5dTliYW12NVp0WnpndUxIVDdoR1YvcXNOZWZmaDNUMnMyQnJxdjdyOGlTOWJhYzNuN0s4WDBhdzdPczZuSkhnbjl2UG5wYXJydnMrSHBZbk90dDdGTWp1MHNiS21hdlc5YUlqVHZhZk03dTBJeGY0K3ZEQ25QNWllUTZkaWtnZll0WjRDY0N0ZGxPUmR5eXNvVk4zaU54YWNkMk5ENEoxMDhJS2JVRmdWZ0VzaVJLQlQydWdGcmxXZVMrbHhmYmFOMDRBQVgrbkQ5RjB5WlkydExoNG8vL2x2T2JQSEJ2cmIzUFRTaWJNN1ordW00dGx6c21VakdtOFZmSGQxMmw2L1JmT2tiVEk0d3pwaGFNZzYwU0dUWW83Yk1NM1BtbFlGMzRZbWpnOTJMTGltdEV1ZTlwTkdWQXZlWmVPUis5TldoTldqaGt1OXA4MzRScHpkREI1eEQ5Y2t5aUw2aXBHc2VkN1lzZXVaWmF4SnBDR2RIVythWlZQd24rRlNEM0JnczZtMm8zYmwzWjluVDU0V0UzT0l5OXZIYlpBUEZFK08yY3NxRVZOZTlyWDFKeXdKdjFmNXdJZi9HTGh3bkNoKzJNVTZFM2NPb1AzWHVRWkhnTllIUjhOZHZhdDdvYXRqZTgxWERYelhEc1VienFmL0JudmVrQUVCeWdiajdXNFA5aFo4NUh3MERHVDVOWlkxNmhyWE9jaUp1ZlJNTGFzOEpKZkI0ZU9ZN21ZbWtKNllzNmZuTnorV2dBN3JQazVpMWppTGt2Y1QrSzNab3hyemVqcW5kSEJ0SlhtU3lBTStCQWRmT1JtNjdoOGVxdEsrb2pOZUlCYm1SUXU3MWc0ZmNUU1BORlBpdE9VbWV1N2t5UlRGdFcrMjFtdVNmeTlYTjllbzR0MEp1eDI2aWdIYVptOXhSYzBDNUlsMnZldU5qMWIzRFR5L2NhZnZMalRGdE9kbGlmelBNeGNVLzN3czZXVVBnSFY5bWt4clFFSFN2Z1RLNldZbDZXUkhZblpVTTZTaEo2dk96Z2h1ZXVNWG9CWHdkL0MxcUdxUE9OcFBCaWlkckwzSFZJQmtWbWQxUU9lRmtGSGppV3BjNkx4d3p2NW0wL05qKy9vL1hiN1U5eGdLNVFwYUxwUmxQT3ROKzY2K3NiWXptWDRReW9OMHNTRkhIQ1REbjZxcS8xdzVXcWorb0xtalhqazBhM2dBRDBnWTJWUEV0bmFSblRjK3J6cS94ZHdNSURleFpnNndjc1BTemVXdU5UWmNFM2RSVEdrdDB4ajQ0dk9EajRjNjAybzZaWllqU0FZY2lZM0J1L0QyWnFva2hRbXF0U2lGM1NqZnZ6aHJ4K3FlVXpadTlPbkdsdWZ2K3I0WU4zQUsyUWkrdVhTbXQyUFZhZE9rdW1FeGdKOGFqZzNCeWl5NFp5alpIc0hSdU9oZXdhNGtjVkZSa2F5c3BMUklXbHBSbWx0VzVHRWVhWGJUV1lPSjJXV2RUbGM2VXhVTEhQNTh5NlhSOWNieSt1clNEZ0ZxcVNaVUQ1OTdvRG1YUkZLUnVQdGNSZ01SWXk1dVNrU2d3c2oxc3gvVmNLMys0MS9PZUE0MStVL1Y5K1N3dGxvcTRQZUVRSVViM3lmQjFKeG81dXlzSlFYcWtKa3BaN0pxdDQvZmZpQzdXS090S0drZEF5UXpjT1Q0OHcwd2JzRGpDbGFPbmJwNWJmUzhVcXJJTzloK2JDbGw3SHkwYjBGeWNFUjJiWFR3UWpWZVJhcXoycStubXhSUjVrU1VUd2lnUWoxLzRVbUJzMXV5WVB2Q21kc0NENjUyWHoyTDR2d2ZveUU5bHl5NjBobElWSWZWRTI3WGRwNmdGZWFzMGhTZHBOdjF5eVgvdkZJTTliMVFsdjhEQnk4cENKdWRHVEpwVndaaFUxRkxPTk9abGo4OS9OTElEU0s0K3FzMThLVGszMHZWVFZHMUhuRVJYdzFndXRrdVcrT0E1TnRvZmxqMzUxaTJ3anUwV2RvVUZUYW5WZ3R1UnE2M0pCV2wxbWRqejFadDliMkJCcjc4ZE05Skl3Vy95NE02bVZLMzh5dlFaazN5NzVXYXh0cXhWRSt5cnRXZ0FwQjgzNG55bXlQUjgybzFqbmZhSHkzdDcvMjBzOVA3RE9wcUpuQUkxMTR4MjZmQzZOaGg4K0ZSaVQ1TlBObzRxY2w0UjhkV2xGd1JZbzNBdUdla3QyMkYxOHZHSFYvc3c0TFgvQlBhS21NWkhyNzRJblFHTE4xcGdNN09pMjErMFhNc2FRWkdBU01VT050OVRreFpLUlhyRjRpUkI2WENVcUc5VEtiVXhram13dHM5V1gwbDFkZ25xaFhKN2F4dUdtUU5vakZmay8vRDFHQ1VhY0lVTzV5Q1JHcXczS2RubFJWUkI2UFZ6SFA0ODAzWEpyWWF5K29xU3p0aXd4WnJNTUJETnBxa3haLzZySEIrSTUwNlJ4R2pGdGlmK2hadHpFam0yQVgxTGZsRkM3b0o2UWVpVHNBekU3STU4OEhsMHBNbWIwZ3pRNEsvYmZQTlVnbTZmRU9DQ2QyY2ZtU25kR21yNUVmYk5NdDRncTZQZVpKdDBiOEhCWk1tMzBqQUplOVNpelBnTWREWXFWS0xkdTh6dm1mZ1owN1pBaUE5aXorWGhUdW1BdVBLZEc3NkhiSGp2aWxkc3J2ekVacWMzTnZPVFBVSzErOVRjdC92UmNWNFlxTGxJZnRzSktBY2FEZmZyK1pMR2RTVUpyUStqU3NETEJLRnJWbSs0WWpJYkNkV0V4T1EzUlhCQzRkbkpiVXNFb29heUdycExnRTh2RWQ2aGp6YjFFQmlraWJQOE1QN2M5T2RLQUM3ZGVmTm13RWxyV1pkTEs2SnJKYm1ITURGZTJWa3lzVW1Cam1tNmZKMGI0SS9MODJaQW1nb0F4d2xDRnZFM2lSRVpJNFRxNG1WNDRUZ0VRTXlrMXFQRXUxY09vbWdCQ3V2b0FxY1k2OVpxVDhabFc4VEJTWFppNnc5UXVRNDArNWZTd0lweUFKcnU5c1RFdlUzb011NzN6S0krR0RmUkJUaHNic0pScGw2YUYwZW82bTNnR0JlVGNrSyswQlp2NGh5cHIyTmZMd3JKb2RmNy9Dd003TVF4RkM3VUhXbDNIaWxQT0hqOHJHa0gxYXFTbzFuelZ6Zjdram1QUWtPSWNvclBaNmNFbmxsRytoUTVhRm5YS2NjTkpabk5RQTQrMm9jRGw0VSsrSkM1UVdmOHVUWll3TG82cTB3NTBLamhwYlk2RWFsZWhFTWk1YkJUSnFVc2RGMXpYdGNDekZvV0RGYTBSak5iMUwrWEFCRFkwdGdyeHZyWXZqMVRVYk9oWlZoRWFUeWNoS05MaWVUeS91eFpMbWNFaEZSVGlIUjdPRnZpbS9NMitBMGRNdEM1a0xHOEQxSDlpRExrSE1GbWpZYUdrZmQ5WHNUb2RmOFM3TitzNEh1dGt0S2loeHJUNFh4Y25pbDExbzM4b1pnRkR2ZlNqeXdCUll2ejhLaFhFS0xnNUloYVpEZVNLYU1teTVVM2lKQm1HSm04N3Y5Ti9NbUhQL3JPQ3VEVlZxaUR4VEdvbHhQNXlQRlR1bXdmZzZyc0MzTFA0aFJoYzl3WWlPNVFtSkFNS2VWWEE1OUxoTFptS1pJZlVOaFRoRytQbWdubUhlbHQ5Y0VoY1ZkSHlZTTZtM29qelliTVpGYzJza3hPVElpTVhFV1grRElrRkh1MVVzeTR5Tkg5ci9JMWRCTGwvKzRvWXkvY2p4ZmdhMEd0U0JrMWdrMlhwWE5DL3NQVlV3MytrcXQ0YVZhYWNEVWRlVUgwZnhjMHBmV091SEg2YVZQeVMwdG4wUXpjOEszTFhHZlpoYi9Qd1Jvb2J4UVU1dGR0QlZyRVptWkZ4aUJGcnI1UnVQd2hOaDJIN0dHUk1PTHdFV2dFS20yOTEyRlFkWGcyK2tKR21VYTBXSEIvamY4MHdXSkhCRGRqVE5RaUxPUHQ0OHZ4SFA2V20zNEEvazR1M2k3K0h3OHZ3K0N4Vm5zcWF0SE5CaWlnSEt0a1FNMWlvVEUzRCsrTkkxZVMycEtmaVRoQ0ZuRWlDaWNJRnNYN3pmV0szTTRaUlMvejQ3b1ZET0RTZ05kWUZKc2ZIc0VzMFVRUjI5cHB5ZUtPdWlzbGpnQnE2VWpRcENYbUNEbUM1TEZvcFFFc1lBZkx6WktxOSt1dDM0TnpOTnZyZ09kL0xpWTlDL3ZXWXlvRkRETEN4dEJ4SWFtZXBLdy9LUE5JWkUxM1ZXNStJQzhUQm1OTkRteTM4UTg0SFo3cHp5Unk4KzRwYzNjSTB6bkZFMTFMMUpycksrVzRFQ05qaWh4YWlTVlZvZ1hGMlVXcGNlemNCaHVHQnFkNDVxSTR6OXA5Z2ZhRnpxWUlmRk1EcC9MUUVxc3ZsTXp3M1BsSm5nNGlWUnYzYTluSGtjcmQyWkZGdnZMZFowMGlHcDhmNFlLa09DcXM4cktodXJ5VmdGeXNScmpRTGlwS1FGb3p6NEFhTS9tRWo1RTZFTGx4K0tUSHl5ZnpuNThMazdwYWpKbGw5QXI3Z1FWYW1RNHJ0aFRHVzV3UktZUFc1Yy9ML0dYV0ROZHZBaEc5aGFiMmZVQkVIdDNXMnpRbHBpR2lkTS9idUoyUnpJNmM2eTdlVzV4VWpXNTJKUFF3b3pZQjloNk1MWThOVlZRWGxJY1c1S2FFbGRrRk54bHd1K1g0ZTBTN0VReUhMKy93NGJYbjcrbjhuSHNZRFk2QVc5WE93SytyeExJalllMnhkUlZIbXNVZnlOZjdVcnN3VFhEcTZSVlZ3ZFF1NjY3cTJXREo1QnhDUUUzOUx6ZE90Q1cwVUNBeHpZdHRndmIyU1MrU2phRzV0RE1JR0pRS1hlRTRSOXVDZUZ0UU9SbFpJcGd5WTM4U3J4ZHZSQkVxYlc1V29JRE4rMUZpVk41TkZxUkNYNjkyYTVTWE5UVEZuOWhXMmRGSWljcTQ1WU9ZNDhvalZNMDNlTzNGU3hnVXo5S0g2bWJGME5HaGpHbjRRdzdXWTRiaW8yQk5kWGxsS3p6SlRwc1BPTmZkSmM1WWpJU2k4QnZRZ2Y3RC9palVSYjY1L0VacEJzQi9ybng1OVByQzY3ZlYrLzBzUis2OWJqWnNhaytONDhkazdtZGg3ZFBuN1A1NmpQc2tUblU1OStYS0R6VnQ0ckdBNzBIQmpvN1B1cms5K2IvdnUzbDRlSjBydmIvQjlKdjBSOTh0aTh1UGlGaExoTEdKNGtFb3NSNHp6cGVPRkdVQkVtWGpsaTQ3a3YyVFdtWFViTVB4Q1JGMnk4bU5ZdGtyZmxTUEJLYXBQU01ia0ZDWW5UK2xUckVnd0NxcStseVVhZDdiSTZ6VkdqSGlScS9XMzQwbDlkenZFWW5YcllqZzhTY255Z3pGSWFvNmlxZWtVWVdNUG5mOXlUZ3JZNXFUNzVwRDNlY1FNYldTYnBYV3k1dmd6Q2ozOEtEVXJnUlhFd1EyaGwwblk0a2U0ZDdaU1FFRm5KeTR6b25pSGtKN1h0Ri9YZ0JOTU15SUQ4MWtlc1BpZUJTaUI1cy80UW9GMzRnQnNIbjROaGhDSG9ndjRNbGk2aDBwYWJHanF2R0cyV2pPK1RxNm5Wc3BzSmNBeitrdXlQZ0F1V1pzcFNuZ002TWN4bzdZMXVEeWZ1Z1RFZ1hDekxva0JJL0hGQ2M2UlRoVHNySjZnL09TaDRrUkxkbVorZjBQV09yTk5kMHdwdmx1V0xXb0RkaHI1K2NERHNQVDY0ZWpZWWx3Mk5tVXlMREJyVTNkQTRXaUlYaTZOaVk1bkJHdS9pQ2JVbm5oUDRoWTBEaWtCNEp5ODlhWDdmQVFqdWNmVFY1LzZlRzhKVExoVUorMndjNmNPeE1rY2JMMm9OZEw0cmt6d2IyRlR5K1Y5aEpMYkVSK3Y5UkF5cHV1TXBuNnU4anByMVR6SW9DZGI5bHlybzV4TU1GNmNTRFhYenA5T0hyNTFHd0hFWmt1WStEZFplVjJ0cXczZkN5dy9OQktPYTJwL3R0VE9nRHQ5TmVBSTNRWHl0bVJIWFljdWwvcitxR0dIVVFSVlN4bUJKZmk2UmdyOVFZR2pwOXBqYzZGWEFMSmFUNDJoQVNiZ2NPcm1SYk5TemRycVNJN0lLbmgxLzJYbUJZSzd0dVY3bkdBNE53cVBTWDZDOU91Sy9UU2NtL085V04vRnFQT05wL0JzWmFlSTF3cTUxeFFQSGYrRldRUm9LdHprOENacTEzek5WZjdhYk03dlRjR3B6cE9xdTJDYm5SK213cHJTNFp1K2xnNE1PN0RJL1h1MlRXSjNqbzMrTnZKK2piZFN4QkQvN2E5V1FYKzlXckxnWnM3VXR2OVNsVzZRSGswNVlUbVlaUHU2WUNVNHdxQ3RzVGRudEVRV0thdDB2VG4vYW12ZExZbWRzWXpScUVzak9iUDVwRER1S3V1eVdoaFNFRnQwcGJPcDhxeS85YldTcjYrN2xpZjhQVnNpQVpsSnFiMlJtNDNxanFlM0N6QmJ2UmtwZ3JhVTdBbm1wcXcyMjBKSXlwVmZXckRBNTVKaUc2ODVrZW9FaHdTM1J1VWxhcVJTRTdMeVV5TWllWkk3V0lpcy9pU3dZdGQ2VzhTaklXTVRENTlpaWhMQzgxdVRRdlVWUnRGMG1ybE1hTC9MRm9CQUlmNXVkckxiZjZVTFNoRnVSSnJFTWNBa1BiNitYSmdWQTlpUkFIYjhyelJJTjhTWlBJblNYVUprRWNmWUtmMmJFZTl3aDZkSjlrd1FhZ093RjEyZWFLTVFtaHdxakE0YVdtTk9lakRuUDZSRU5UNk9yYm80dVBnVW1sSCt5cmdVb0xlWUdobS9tcW1TSnYwV0ZXajNoMDNEZHdES3R5SVAxMnlGeFlDUVdNWVZLV3J1YjFHaG1OTGlFM283b2NkWmpYSTI3Y05TSUhrdXRUL01HKzJrWnBJVSt4blBvY2hVaVA5d29OdFVXSWpFZ3VJalBlaHlPZlplbWFqNjFPNFEwaytrRFRTWDJES1lMQkRUMkRjQnJEQUwrdmtZSGpPVjQvME9rWEdUbWJyd1o4WDIwYnZoZDNlYis5bERybnp2SWsxTGYxK3pEcDFUNUpLWVFCazVRL3lyVTBkQzNNZDJ0ZEsxKzNLRTZmSEkrV01ZYWdmL2MrR29Ba2pIeVF0MzIySFJzdkg5RFZBRnJhR3c2VWoxbE50UC94cWQ2dDg4M05wWE4rbC8zbWJwWU9XMm9rR09qYzhrdTk2S2Ryb3M0MW16REx1Smx1bDM0N3cyMXg3S3ZyeG5Xb3V0cm11NldoMjRiQThtK2tCVUFiQmR2TUxEZjUwSE1CMHJqVVd0VTJQVGlLYXdZK3JNcHRoQ0pFRWw0TVM4eFBDYUR1ZWI4Q0hnZnArM0hqLzd3azR3c3RIUGNZV1VUZXlEc2t6cUh4a3RBZ3RrTzhoSnMzM2xDZjBCQk16S1lHdWZESVlmY3dUdmhvdW5nMG4vUG1HOW9YakhaQjhtaVIwVnhxS0RLR3liWUJLUEcwME1CQWJ2Z2ZhTXNJWW5BZ1BkUXk3SjFaOFBaVThQWms4TWdrYXVGdkw5OGhyTjljQkFlV2dHczgxVDhTVkd3amNYdkVPb3B6cVBCQWhEMzBDb1lUY1hBcUVwdkxETEV4SVRGUnlFQTJpa1JqSXdPUlRLU2xoU04rNk1DSDU0OTdQNDBNRGI5LzlxajM2MWlSZ0RjNlBjVWJGY1J3UjJjbU9hT0dkdTl1Z2dnNkJkSTBvajVNVXNVTDZ0S0sxYjJjRzhJcjZXMnJGVklhR3NseGNWMWMzbXh0R3V4RWZNY2t4Mkl4aE8vbWpYZnlkMDNnaGFLWWlmSHh6S2hZYS9QSXU0SnVkdVJVWFJyc2xMQjduRnZqR0s2VGtzL0g3UExKbGNjRTltcEc2Ui9MUUhOcStqcVZTdFY0VXpZdEtVN0E0c1R6Zy9tdVBuaW5VQmNSRndIa3FVZ3FBNXowUDR3amxpMG5GMjRFV1M1OUZqSnVMYytyN2x5OUM3OE9yOG5KVGsvNHZhTkNYUzBremgxN2wwM2V6WUJZTldkY25WcVVlU1NjRTFaUEhYS0xxZE16MW85dVNad0JldXNvRXJwVkN3MDJLWnluVklWSEtBUkFhL2ZXdWJkd0JzOUc4Q2Zra3QwM3p0a1d0KzduTTNjZjl6M21IUHJ3akF5UVdTeEVOeW9zcVdaZWJMZjNka1hmclY2RWZybHZNbk1qck9FemQ0RUhBeFRIWThSaUl3ZnBFdWhiNDVtSzRyYXMzVDBrZlBCWkF5MDMxSmExckpIMCtnRlZKMkExSEtqUTZBOEN2RGRrRkdkNjRQNjNLVFR1R1Z3STJhbG8rQmF6dkdxYmtmMnREYTF5dmNDMVZ5czRRcmNpdFJWRExtQ1FxVGxOVWFMdlhwdzR0b0JPSWVTM1lITHZrZTBMcWZoTWFtYTNwTHlnTnplVFJrNHZwMWhpL2JqbFFmL29tOWoxZXE3dFQrVE9JYUdwMWl4S0N3MUlId2V6cnZWTFZOM296RUpIMjFnWFlOM0ZUR2I1cFJaUVhSdHdBS0E2Z0h1TVNWU0hBU0FBa09xc2lJdWFwRFd5MFZyZXR4NG5OeFU0b3VVTEYxQ2p3MXFlV2dBQXJ2TUp1cm5ock04YXp1NXQwSmE2ZzNSSDYrUjJhMGhzYlc1OXF6ZDBuL1VUcE83Yk9yTFZHdVZ2VmlvaFpyQnBML3FWWUdCQzJzbHVvc09NUURjQ05LWWZjSkZYcXhkSDhkekhFd0RjR3NuZkxQdGZTQnV3cmVtVWZnMWpsdnF1S0JGclJSZ2tKZmhVMlhDclFSR2RBRzBZK0ZQK1VENUlybTlrREJudzlzRUFlUlE2YS8yWWNkbW9Oa0JyWkhTelhJS1lrYUVNa3k0Q3pWMStDOTNLNE92ekJqOTZsMmtvME1rVitGQUlFRFVDZHlBdlJOZ0x5cTNrRUdXZ1IvaVZQbWw1RGFmL2hnWGV4S1ptbk91R3NRSVZwb1BpbWx3Y1lFbXlObk9HSHEzdWZmYTl6cFBkbktDZTNleElSUFBJNXg3Nk12Ny9yV0ljTnZZWWU0MzNqUStNcjR3UGpZK01yOUdYRGRVL2pjUEdIbU92OGI3eGdmR1Y4YUh4a2Y3MWk5R21JVnVoTUg1YzVmT244dXB5bFlubTBWelY3Z01zbENlSzFWejZsQ2dLbzRJWEYzV0s4OWc0MTVodFRGaXN6TkdxbVYrT3kxd0VZSC82SjRQUjNvVEozK0p5V2tmTFNtZWdJVi9qMjIya2Jlb284TldJY1FVTmVmNFNwNVpKeUdpUFVBakRHcktaREVZNzZTL3VCd2tKWDV4ZFRnNFVCRGZHVS9jV3hqWWdyWnBabHd0ZzRjVzVhWEpBRUd6NTgvSWZJR2RUY3pzQTdSeVdWd0RvMHJEOEhvQzJOcG52OVFueEZFNDhKcE1nT0FMTWZBUW9jRElPZ2pGYTFLdU5YSjBBMXpEVzlIK3hlczZjdWl1WmdhbitJZWw4NVFhOVg3c3Z2NGtSUG1Kam00THhJZnRjUEpGQWFQUVd3YUl4dmF3OXVEcVgvSk1PV3dVMEFQS0paZU1MUUhkYkpkRDhzN1lLTjYrTDd6TVpxUHlETnR2Z2J6NXNjb0liOUFJTzl3MzBXRG1PK3VvSHJSb1hEZGJodUFoTktmSXlqdUdyRkpYRkRsQU4wVmJoNW5YeFNwd0dwWUhhYklPLytYQmNJTGhCdXpqY045QVQ1M0hVTTROeCtmempmU2RXN3h6OUZrSllteUpMeWZDNHFURDdkWHE5dVdoeFJxVjBWMlVyM1dpeEZwdE5BUHRCa1NTRWhPaGNqRG1IdVZkTmNQQU4yMXNJcHd4N1Z3Y21RQ2h3NWFMRGVyOWZidUhtMlRkaWFIaEcrWmNnNE5RK2paOE9rdkYyaCsvdXV2dXh6eXRxQnRZZEQ3UnFYMFZSNDhtSlJvZVZMKzN1RXczYUlYUTNPa1o0VGwydWdkOEQxUklNOTNPYWNaTHhwZjFGckhuTDFpUU0wRERKR2s2YmxZcXF2Y1VRVlJLU29uRm5nSmF0amlVeWVLOE5uTFRETlZ2MFdZQlRKUzB1VHpNY1N5c2YxV0h0R0NWWk9QaG1BeVgxTm1rZWRhTEF2SllJTVFSRHlFQUc3QUFIclZoUjA3eVdtNDB5QU5DU3RVMFdqZEw0VHNlN2VqSzRKeEhnU280Unp1bHptOGw3TFlSc0Zsa3l3b29ZU0dBNzJWVlJwT2tBZ0wxYjYxd2NleVFBL2FWMXE1Vm1uSG01OHprWnZVREVGckRYYXltVnJvUmhiSDVjMkI4alhDSnNQRUU3em96WjFqVlJtc0drMmZsUVBSYkxBTUZuSEpwRHpnbDlEZ0RMdG9WU0M0WEtnSm00Q2xVU1VBZUk0YXlGRnFhbGdnRFE4cUFpN3ZlVHljcGw2cFcwT0tQeXN2cmYvdnh6Nm1lUEd2dWZmdHBxVGVlWGo2cHlaWU9tSGlRTXRXWCtsRlNUVW1uSlZqbENqQ1hic2Q3MWZiY0x0aVNSWFlQRWhRS1B6VjFEQzQxOTlhcWFrcTVPdXhEN3lYZ3Z0QlFiZ3dEQm9IT0VRZ2dqUHpFZEFZd2hLZDVvMy83MnlTbWxvNW1xT1EyZGhXVGdZWEZUSm1GQncrQVRXVW1YWVVycVF0S2VYMmFwQ3RMdWJrdWtVYURMSVROWHU2SVZhRGtneWZjUlhjK0JXbTF1YytPa29abXZlQjh6ZGRORVY5UkZyeXRBdTE0YklSY05aS1Q5ck5tMTVsSHVpdVRBSjZZeWtNUFZDb2J0c2pEeGFxc3hJU016NTVXOFZRb2hnMmhTdlErcnN5bFczeVN6Q2tyOGhTQXZmTDdTeXYwT05jcGlKMnBKbGpvNkZBR2tlMFh3bkUrQlFtbUpmR2NrWnhFMWY4K0pISktJTE1UWmw4MUd3SW5ob0UxcGlYa2NpdDhaMmhKL3RXZ0UwYVZiZkxwQUVweVlQeUtjUXlNTW5KNVgveC9RTjZEWjYydDMxMGNnUnNiQU05Z1JER0l2TW1vZXl3UjRETno2d1NDTXJIR2ViVHRsMEF1TU9yekVPbWFJT1hTNm04N2hDaHpEazJwYTdvYzhCM0dNb0xVeDRDdTVDN21CQ3ZEeUdTM0ViTnBhU0xBS3RMZHBmUEhwd3Z2MjI0UDU3TFBWQ3F5eTdHdS9kYnhDWWNZZERhLzZ6eEhjZjZ3VmNGa0dSdDMzVUd2UWVCZ0daVmlLRnRkOHBCOVdybUhMaTM2Szk2MzVDQmwxZENhazFBVU9KaUxTSk9PSTkwcGd3UUgzaTh5YjNuU205LzBJZ3VYalBYSmxPT3RsaUhNU1JlMDRjOHdwQ2FVenBsc0hXNVlacEhZNXZPU2tJV3h1Sm5mNXAwa1hGMWJrY1NnS2dEdDRCd1ZiRGZkdHEyWFVGWEJXcVNpSXlrYkwycFNUekxuZHBqb2VsaFpIakdrSjY0T2tjVVJoTXd3MlUrM2JhS0lmWkU2R0ZiWm1Sd1RZRDBoZXNBWklWTG1oWjVCcXpIaGhxbnkvRGVQWmh4eHluVFFYYjBBbG5Zc2dOQnNKdEczQ3ZHYTc4UkVXT0dRQ1dqbjE4dEROdllYckZtbXpkWUwzTUVRcVh3TlFKd3FyUUFOQlN5V0QzMHlwSG1odzd3S2FublBvSXkzTVoydE1uWU92TlhXVXFJMmFjOVdBWlpObENhZnIrTytUcEZhTHN2YXhqU0tBMTVwaFVTMDlSMUhhZCtNMlo1Zzh0cUF2Z0FLaFY1Kyt5Mk8vdjB6eWZMbnNwRmsySEhSQ29sZGx6T3NyekNtaDluNU44QTJqMTJuTlhtSm9uN1ZVWTRRaHhvNjFxZFlYZFowblJtUWFJNEdWMXFBb0lvUkdVUXh3cEhJNnN2NzlKelc3cHlzRWhlOGd5T1BNTW82YW4xK2tpelYzRk44Ti8wN2dBZU5sTTFtV21PaWdWMWVrQjdUMjd5YWd6cDFMTWVmbVdMcEZJdTJkTTBrRnNFYUs2R29wZG1SY0lDV0ZTQmlOcFNmZnlHVUZrL0xSVWVNQTU4M2NJWFdtbVpNVXptelVwY0s3MU82VGhJZlNqQ2w1RzRJd3FqVWpaZ01UVlVzY0Q5NUM5ei80aHIwS1ZwT00zVzdMTXZiZkxrRkdGWXUxejA0NGNwTGp1czZMcUJhTDZlNE9jeEdtQUQ0Qm9JNHczcXRPSzVhR3kvbjY2cWgzRFp6S1JoT3orQmpJb254TC96UHAxL0hoMzBxcHlkdldPSkwwSVZrd3FHTFFKSnlpb080SmJjWitQOCtqY2FlVEVrMDE0a1RaSXhZaENocE5vWWJJWjErVU03ZnRHemFiN2lSU2I4bXBCRlR2dFNZYVhJdnQzN3U5UFI3cDQ3dDMxVjVUTDZCdTd5cDlHTHQ0WEIxcmo5cXBpR3FuUWllemVZREpaR1V4OVZBUVdSUHBsNlVPUkZPdmhmcDkzVldIdk5zd1REWEUyRU5mVlVqcU9vODJrck1RT3ZRTlljNHBSZkprRGllYWJLQnlvVU1lUndaSEc0T291T21UYVNtNlA4bENYZWNPQTZ4Wjh1akJBbDAyMjRkUVBYdWJWYUgrcnY0WnZXODNmdHVQSHdLMWt0NTZvVnlVMmdVRDRBU0RpQ29kdXNKN2xCZzU4RENRSkx0ZFJvZmgvZjNLamM1ZFhEaGUrM1ppVmp3cjBxR2Rzdkt4ZGFIdTJDSHZ0d3lPTmxhYkwwb3hpMmd1N3JJRWpFM1FNVHdkNU9VemhUOE12R3J1VE1mTjYwOWd5d3IxSDlWOTNpRy9mcDloK3B6VlN0NkRFT2UvNlBGNEZDdGZhLzdCWEQ5WmZIemZmTi9BWjduTHA2OGZnWFhoZ29pQUhaUE52V20xcklDZTdNMXRQN29IZG4yUXBvelUxWXhjSmthTnNieHJYVitwbzlrZEJuQ2F3SE1RR1lCK08yUnMwS2x4aTlsOXlmWFBkZS8zeVllUGd6SHZ3Z0FUOGtCeGRMM0JNLzBPcjdiemVab09oMG1NTEw3ZGRKMWc3Y01EZEJndFN5ODM3cEtKN1F2c1dFWStIeG5aYnJ3R1U5S200YkMwdU9LV1VleHZiL1dvV2h2Rzlza1Bib0VpUHVURjlYaU1JZHNRVk15T2paSjhzeXlBc2daY1VRS3c2NWlPczlrNzAwd2ZBdWhiM0Q5dFlhMXA2M0JqUXk5YStpaWl4NnphMlJRU0JLZm5EMVp0VkhIQnE4SkFjczI4SXgxUjE2M1NoSFBvN3J4Y09xVVRYUm5yZ0tocjVWbXl5NzdRV1o3ZFJycHMyOXVzei9GZ0luUVZtWGdPbzR3TCtCZUN3ODJDcU5OMVU0QmxUa2lSSlBzaVJZWStkTFlnRFEvSkFPOEdqUUtwaGVaTmowTTg3alFhRkJrbVpXT1FTZmRSaVBHRHd5RzhYZVRyeENzRk5oTS82ak12d2tJd2xEMldkWlpwaGRUQzVneVE1SWFVQytDZVFFMDUranNFRy9NU0lwa1l2VWNoMUZ1eFVXeGlTcjFFM202NlJhRVowOU9iM0oydHdnb3ZXZ2p6cHNJT0xUK0dibGV4K2FLUHZYc1grV2pPTS9aNHJjN2w4VkdGdFlseUtzaGlHSEVtZUd1bVRaSUFqNk5ZeXUzMHpWWWwvWkJHRHpLTTAybWVJL2kydTZCcE9LRGtldlBzNmszK2FhSTVlSy9qdlNmVGQ0KzZFdXMxU0NkVUVYdTBlL1ZvdEpoKzVxRVBvQ0N1U0t2ZGlFRGdQS0dWZ0Mxc3A1U2ZKVEJHNnJMYjdkUW9SbmFXYUMvY2tKWlNJVWJ4MUltYWQvZjI0ajNqMDJvY0lDMldUc0FhSU9QZTA0cll1cG9hWUV6c2UvTE5uNGxCL2xIYVZXSnJlZWZWcmQraDVnZjdGZXZ2d2NwdHZjRlNJcWNUbWlCRS83Sjl2T1o2RThGQktkc0twSzYveGlhMmFlTzgyamIwbVRmMTRRYmN1NmxNUTZUR0hTU3lTYjBLWU9jQmxLY1RiZVducVFrYzdkYnUwSVkrL1JGelROcWFscUlKTkhkTm9lVnJjWUUwOEdPNEdBaVpyTUx5QVJYdUZNWWVpRjVjREgyT3hqVXV1cFM0UTYzZFJPL2lpa1FQTEF1OE5OMURGYjVvU05xN2c1RDdEVUUvZlVvOGlReFB4eVR1c3VibkFCU3JzZmVEYVB0QkFINFJkQjFHMVRNRzk4UHltRmFkLzlGQTJDNUY2RytadDd0SVlXVlVFZGVqMGRuNGdQd0Q4NnJGZGNqbERvZVhGc3dpSGZSMnYrSG44NVRNTXdJVjJRM1M5QkZnYTNVajlqK0FOQWdyOThiSjFWRjdFcVlCR09FcDhrWGtwSkhZbzdmSHArRzFFZ0h5ck1odEtmVVJDVWdUSk90dDhQWTc4eUxBb04yVEEvSy9sazFCNmlLK1dVS3ZwZkFYN29oUVNzZmRJK2V4MVkrZXB2OHl5WDVuVG53Qm02QzRwMkFjTEIvL3NWZkt1ZlJycnM2Q3pJRVJJSjYvTVY4Vzdkb2U3WGlkWUpvMDU3d2JKY0VzeWdnQU04djUzOXd4OW9wc3BuZUVwNmxBajJybFA2Q2R5MWV3NTcxZklXOE9rd0xHQWdLektHTUF6QXdFUHBhVVdwYUxGS25JaXo1eWpRQmJ4Tm5VUk5PYVRBZG9wYTBTQy9EdWJlUTdFL1FTUUc3anJZVXhkVzVKUWZUSmZYYUNhS3Vtd2NoRmlIYjE0MzgzUE5rQ21vOW16bEdrQlNmaERyamRMSXZKbFdCeGUyeTVMbnluanBHSXZhL2Vva2lGanozYmp0Rm16bHFEVHR0RGZGaytoY3dLOGZOTUdONUFsTy9IVzVJVjNzRkZib0t4TDFOYVhpU3A3ZUR6eGtQdHE4ZUtPUjhMUkdpaDFNZUwvUUQwOFhxMWFKZ0ljWHNSOTVweTQ2MEF6aEFhTXNQVll6eCtoakdVSzJjNEhVWDlqS0NsUU01SXRCZlU2WFVaTE1KUkFyWGxBcHdobE9XYUttOGZsNVprM01oYmszRXZiK00vK2lmQklTR1hFcVJra0VZNitZRHh4VHVud0lqa0tscEtpa0d1OEJ5a09DU0F5NG9VRTJtVVorb3lLWlRDVUNBOFhaTlNXemczd3l2UHJWTEJlTzNwTkRJYzJEZVFpQ2RKcThoV3NYQkpHaENUUW1vUm5rTStNcnpzTTExWk9wQkxGNXhkdDZSUmdIaTRGRDg4OGQ1YlFnaUh3Y01MTzhUU05CNm9lRzJUT1hoa2dtdmlHUXcrZHM3VDFab05nS2FNaktReHk5d3JsSjROVTJJOFdaTVdlOEdBQ0kwb1JHYkJvd3FaUERKSmQ2V3lTUWh3c29JRmN5WUo5aERoOUhZTnRzZVVxK0JHZkVjNjU1MGw5NmVsKzFZR0NpYi95NTlNazQydWtvNUtNMjhVbGp2K24yUVlsdE1YSXJ1dnhBUE56QnFZbWIyd2pFNGEwanV6cEhXa1NPMFFrTkpkVkhJMzZrdnFNcERZOXBzSmJSWGZZaVZxUlV4aHl4ZlhDa0RWSkJYYnNNeVloaSs2a1FaK25YMVI5VzZSOVZyeFNqSzVoZUlVZnBOZGhMSHlLc3ljTThTa1p5b2l6U1l0VWRTa0RxTWthSkJqa3hTcDhKQk5ZcWdJWVRRTUgzVERCV0ZZWElXQlFzTXl3OWlINGlkQ2ZTaWtoN0FRZWlHWXhnVFJFWWpOZXhSUzhIN2g4K25VVWVTeXFMUHUybFVHYkNKTk5vQUs1Y3VuUExicElyS0IwUDV6d0JOZ2JBQWl5Nmg4SzRKbi90a2FmOENlalljVmFJd2ZEZ1hNcEc2OU1yNTdKL2dvZDlsblU1YnoyNzcwNTN2TzV2dDc5dVpuNlY1NnlaL3R0Wnd0cUM3azZaNlQrZUdlZzNreG94b1g2VWw2a1A1dldvbkF2NitlcWQvUXdpTlZlSHVPNXJ0N2R1Wkg2VTU2U2M5Mldzb2l0YXVmN3VNY2ZpM3JkcGlkYWtLRk4zSU5mRmZLMnRHdnh4VnNYalkwcW11WEVEK24zMzM2QkdzYlEzeXR1VjhZSko5UFJNbjRuU1pudnNiSGFxdXlHLzlZTU1NS2JLdjBxQ3AySUZIY01xdktQaUZGTjZqb3BmSWRTK1ZQOXJPNEFnQUFcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMjRfX18gPSBuZXcgVVJMKFwiZGF0YTpmb250L3dvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFFSU1BQklBQUFBQWdPd0FBRUduQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHbG9iaW5BY1BBWmdQMU5VUVZSYUFGd0lnWHdKbnhRUkVBcUJ1bGlCblhrTGd6SUFBVFlDSkFPR1dBUWdCWVJnQnlBTWhSOGJwVzhWN0pnaGJnY2tTTzl5V0VWUnIwY3JkUlRCeGdGaVBGMFUvUC8xdURFR05taldmWkJKU01Fa1Npb1NaMDVrWUJZMUxTTlJRbU4yRjBSQ0t3ZTNIVXlGYW9lcDhOWEFRVFlYaEk4RUN4c25PVm1oSFNSYUtMRkhtaFp2ZkpFVS9IQXNZVThWa2laNzRsSUdNN0hEUzJzVi9TeHUwZFhRRXBsdnNjblBlR1NGUDA1d1lQTWhQN2lETTNDY2o1b0xuN0gzZjJlVFRYSWZ2VGxjSFY4VlNCekN0S0p4S0lGUTFja3FGTWcvL2pVZm5rNTlIM2RCb2F1aHJITTVPKzJJRExBSHdHMGlnaHFlTlBFaUhxNUtIandvK2psZkJFVUVSZnhjM3dQZktWKyttNW1hcFprOUl6dmYvbXl6czg1cTlteHJ0ZG82Zjg2WDJZSXZoQkFnMk1pS3p1NFg4L3FLK3BydUZkWE1xOU5QdGt4Q0MyeU83UUM3cVFLZjBnL0pFY0V3VXNhOU9SanY3V24zdzJXNytSL0taZEpPajQybEVCVDBqV3ZOVVFncXFER1g4SDUvL2kyUUJhYWtIVUpOL2wvcXl0MjFiTDU1aDFnL2poUUEwcHp1SHRuUFBnY0lIQ0FGeXpSZG5PNG5iZk5GYWYvVE5NVmVpbnVxT0FPRmova2xTTlVoODdpTWtzMXNZTThCWU5Lb2NzcGwvTzZhQjhlOTBxazJQQjl6Q3czVEQyOGlscmlGaG1tbkUwSWtselVnQUVIMVE1M1ZTREpLTS9ZZDE0OFZVTlhhRHRBQ2tEeE44dGNsZjkzRElXSFNNak1yenYzSGFiUHBmK210c0hLRDRWQVNKQTVuT3hqcGF4ZzlWcGthT2FaRG5wQllIRWF1NlhBSUJ3N0ovMi9UM3ZhTlJyWm40V3dzN3diWTNrOEtVTkY5NEM2cDB1YWs1SExlZlcvZVBCakpvNUc4cXhGNFpmbURyVStTN1FWSkN4cDUvemxhTytRQVlJVmcyZy9XSjRBcXhCdnN1RXJUVWw5Z0RWU1VYWDZWTmpwQVhRTmI4Y3lERVRIRytuTlBtb2U5RGh2R0xMSE1NV0tNM2ZWL1AvYnRheG5CZUdHTW9vRHVYZi9XTUs3K2U1bk1kYU5VdWlrcTRzL3VjUVFLWFd6YzNla3VHWndJUlE5SlVNbW1VMng3bzdVRGFMWmp1SEh3Q3RkaElHbkJKWjdnSHFoUW1LSFhEeUdNR01CSmo3S0s0UHhNMDYyeFJsOFZ0RzhZZlozWnB0dm8rOVFlbmRZQS9RdGhEVnhEOFFzWmgxblR1eVlQdFlzUk85NFMrWTZxaTRJY2hCOUFPelpQRWFSSS9BTUFlemlBaWFqL1Zja09SWWdtam1Ja2tsUVprU1dWOHFKS0phcFFuYlpxbTNvMW5EbFpwSEZOYTA2SHRLalRXdElwWGRBMTNkRWp2ZEM3dkpVUHdra2Z5QzhLcmdvRHFrME53emFMd2pZY0F4WHU0VzNYT043ZkprUklrT0ptcEVWS2NFTVFDWHk3TExLaUlNcWlLaHJpSnlXSzF1am9mS2cvUm1NaTlzUjhMSmhzblkxanl0KzRFZmZpU2J5S0QvUWIvY01va3pOZEpxVjlPaWNtTjZkUEJtWllVcEtWdkJTbUpOTlNrVFZCbGxQTDMybkt0dXpPd1J6THFaek5BNm5MazNrK1QrUzV2QkxtaC9KWnZzbFA3QWY3eHpsWGNuMWIyOEVJdTlyVGZnNXloR25tT01ZaVM1MWhsZlBRWXhkcjIyTm9qS1VGM1NTTjBtV0ZiUWp1WFQ2aHJONUVDNXl4eVE2MkZFM1FsQzM5RDRiQ0s2UEJobzZ4aXQ3RUZkYXMwTnI3MDdkc2FwY3JrSVkxM0FZeEgyTnAwMVUrN0ZpZ3QrM1pVQTZIakNwb0xTdTRiY0d3b3d4UEZCTldaUnRnU0NBKzhDUkVOK2RPT2FGQWE0azhzWURsZ1ZHVGhDejhTdXV3ZzU1Z0tQamNGMUlrYVl3ZEgwMDJPSXhoU3M0alZNaEx3L1RadWFCK3hlVkU0Z0pUT011V0JqMWNvL1VKVU9WQTRIa3QxcUNXcXNiSWdZb3BkVXFWdUVPVkE0R2FzZ3FQVlFtaHFNZ2FiRDJzTlpKSUVndjQwcmRDOVkrcE1jTEVpQ3VndFJPb3RBUWltU2xUZzhDRkw0RUZqQjFZMnB0c0FSbldBZEh5bzZEdkpFT25ZdzN5WkZ4Qi9neTd3YlowMlNaZ0JmdHI4L1BUblhRWGp0eVg0QzNuR3l6UTBCV1F5d2RETlJ5ZWtCSThQV29BZmZTZ2ZDOXoydTBtZ1FsQjc1cUJnMVArd3ZIZ05mVCtucmFxY0RKNHZBK0NFdnErYzVqTDgxMFcrbXk5enU0OWIrbDlkM0lRM09FTzk2cjdwZXh6ODBseEVqQlFnVjRHZk9iejhYRTlJTHFoS1lFdlAzNlNtMHJHblZLV1MvdDJCUURMUHpvR2dPYmZQSDd0RXZBK1QvTE83Umg0aHIxNUEyRHY1ejFxaVI3dzhWVnRENExrNjRwZDR2Q09uaGwySW43S2VSSSs0ek5nSHhMcG5yTk0wTDFsRFdEMm1jMDJJT0VXaExUeUNPVEtmWndQYzVNN3ZMOHNnMytaQytrYTEzdXJ1MzFvLy9jQnJQZi8zdnQ3ZHc5WnR0UnZybk9GcXkxaExHekRldnMwamdFS1lQK1hmTTJIZHNuKzN5NnNwdXBYZ0MvTTB0OGkwOVNKdmFqTVp3Y2R6Q3puOWdwTnREQ01tbTJNb0dXS2RnWFJjSWlKdmZJTmFzckVJS0dOMGhpekhEYkJqOUZPaHRoaCtUTWM4TFBUekJubXRkU1pBaGZkZ2hpdmM2dGxrcjNzcDU0MkJoVkVQalZzb2FQcWQxRkpFNjMwU2UzbmVVTWZxdGhLanhob3FLRXZ0RjZHMmQzbnMxOUJJTzNEWWl4M1B5eWJxWmt4dmFWWlBXTDRNTWkxTmRWVmxSWGxXazFaYVVseFVXRkJmbDV1VG5hV1dxVlV5R1daR2VscHFTbkowaVJKWW9KWUZDK01FOFR5ZWRIY0tBNmJ4V1RRYWE1T0pINStkTGczUzJHZytYSjl0Syt1VWhDK3VNZjdmdHdMam9aN1dUQm9DV3JrekdEc2lwWTJ4bXMyVUdDaXVEd21yaVMvZ250TEtOdURjNnVGQmhNZWpFcEhoU3dDTDYxVGtlbmk5elJNU0lOMCtlaXcxYmpXTysyRjN0VUExRTB4SnhOZ1NNekZCSmJZaDVWTytNRHAyL3JuRklQV00xcVdEYnUxVTVVOE9HbWZoc3ZYem1pdWpEb2dUVlVNaTM3QzhpMnVFRldsQTEvYytLNDFEQ1NRVDVoVWNJeS9rQzVVQU0rSjRBaGVESjIwbDdqSVdvNk1IYnVaWGswZVM5NVgxVG1wdXBiWU5PcUpvSmtTL0hFNHFlekxhT21xR01DL2pMbGZDRW1IcGsvYkZUTVIxMVdJb0M0SVgwTzhUL1ZtdmVPUVYvQzZVaGE5Q0RIbEg4TjVoZENrZStqYVFBaVRFM2NZa2xpaFVaakZGWkhHd2w2NDZOaXBlYUY0M0RVUUFrNzB5VXN3UUVzOU83TFZnVHBVSjFTalRRbnJ4Qzg0NjM4RTVTUDhHbUVONTZqUXg0VWxMUDd0SkhYRk1EYSthZ1UwNlFXNUx5ZG9wTWg5UlEzUU1xNUovWGpwZm8zZ0ZEZDlZS1ZzUG4yQ1JyMUlOR0RadmMyU0Jva3B3bUx3bXI4alM1QXpaZDdFa1F3RmJYenQrdFpuZ0pjVnlQRmF2NlJQcTFmTDNTTEY4ZVZBOUtqME9lSm9FMU8ySjRNVjF3T0hTM1Ard0ZYQkVyMGx0NE4waU1GRUxYcXo5SEpPeUZ0YmVGU2l2QzBkM2lGajRjTGFjckV0a1pDSjdJbDZrcENjcUF5U2RSTmgwc1JZODFROURUbkl6UUhYV3Y5V0xyaWcybXZKZVVFRU5YU3Y5TVpIOEJ5S0kxalMxSWxCMHhoZnl4cDFLaElNMkZhalBoZ2w5YVlkWHJrRndsNFMwNkRTam96THVOK29aVFFiUVhucnBOSHloTHh3YnFuMElpaU53aE82Z3FjalRZNjBVbFNQd0FRQlJubmtsU1ZwK2JSMEVsM2t4cDI0c2Z0TTFPbGwxTzF4WGt1NnRIeWgxYWhuRDZSYWRxT1VCU1ZOZlY4c043ZUpGWWRGNEVVTlROS21qeWxmRldLakRoUWU5N3NsbnpxT1NnOFhLeVc4OGtoYldYcnNESzI4NjNnd0ZEOTJFbm4vT0V5d1JDZURFcCtwN0VDTU9MMGVLYS9BcnF1eS9kb1h3TVJkQWoxSkhleGdjRjNqcHJlbzgwVVVMUkllOHdOK0kxUzBEdW9JZTVBcDhoaWtwT09EZUtMMXR5UzMwTWFEeVNOeDhUd1RNVzl6ZkIzY3RyUWh0STdGTVdkQVFxMHlGRU1VZkMzQ0VnMjdSdmVhbmFGTmRESUl2ODVRcjh5d2ROcjdVVVkvdzROMEtnM0JIWE9HOUpvTkMwM0syeGNHQ0VRNHZUNWcxQUUyaVVsTWllbEN0RTFWQkZ2Q2tiMDduR3J1V281cjhFVytuQU93d0hKSHJBUk1SM1RCeGd1d0I1dUNBWXNWd2VMdDNDOGx5UWh6d2NJV0Y3TFM4Rk15ZFExenVSSXZ0SndIeTRaeWFsT2Z1MUd6WUF6WkE2NS9DTFNGNFF2Q2hqeHZKWEhMcHJsOTBXQ0QxQjNiYXJrbk55WEFpTU1RcW5JTFpQTjdDNS9XM1JPQkVkSTRVa2JGZXN5RGhlYjJ3ajVTbnRGTWhnazBWc1RZVGZab3hIUURZbUdIaEY5cG5wamNlbWgxcnB4blBVSSs4dHpiRmt5N2hTWmR0UmhycUFMaEtTbXluSHVLd0E2NmpCRkd5RmJoSzFDUWF4eWFGa0VSTkRGdlhtUllwcXZxN01FeFhtRGdlUytHOGpvRVF0S0ZrajBvRHBmcFBaTUFodjBjQ2xWUGxVQzlDZ3JseWc0NFZMVmQ3UjVnVnN4VzFWa0wwajA5QVViZUVqOU1UbXY2b1V2b3FyTWlqdTFGY3A5b21jeWJHbVVkVlZmT0dEYjdlcXJSeEVnWXRaTHI2UHhnWGFjZkpUQ3pIV1Z0Vm0zWXNBYldLa0RTemQ0S2lnUEpCYm11cklaL0ljaTg1TjRSK1dNVG9WdmkycUJVbHArZW1KenJWRmdsN01xaEE1elVqeVJnRk9udllJamw0eEExYnN6dGJ0cnhybU11bkNkOXErUUhJREtJRmZoSTNMV285RUNYd0prQTVUQ0REeWltUHlCK05SaXZVK1NwOEZuNmdFU2xWMEVlWEozdG5uTDYvWmJxYjNFUS9SWk9NTFU5TVNFdWsrYk9KcW9meVl0MTVRMEU0ajdjRnFRbE51SXZOUjRNaWFDOEJuTDBwazZoV05oL0NYRXNFUG1PK3N2RjhWaHprYU0wTnB5eVZmVy8vSVNJR2dNS2VNQXpSV05Nd0V1aEVKNWsrMVdFSXR1QVRpaDhvUWllZzlIZjdnYjVVRFJCNm1lcWtQQmp6SmhXdWdsZHU2bmIyYlRyRVVqS1lZa0hkdVh5SVZ6ZWxkTkNzN2RBeUVZMEtDYWNCd0FlZHcyZzFDTHo5VUlxTlo4SnZMS051aGl2aGpIbFFhTTZMYTNCanAxKzBscHJYSlFDalZEbk1UQkhTZDhSTnJvTFczejdYK3laeVlRTlNKMlpEc1Fhck1HTGZ6S0l6b3hGaDBTWE82NDIzMFdtN2x1d21QOGZvdGN3VTlLOFNtMUM0RXA4ZmVDT1hmREtid2RadkRzTEgwL042WFVFMDFuaUxZWXFuMmUwaFJNSmRyNlliQ3JqTjdxZTRUWHlCdU1zZWJGSjZUaW43SkY2cE5jMTFuYWp6QkdZY05QYSt4NjRXRlV2Slc2UkpDZzdyeFZUNFR5L2tKZzlYK216R1Q2YTJjSlIzR1M2UEJ5SmpSbWNVOGJnZ3hZMUoyUjZKMkJ5WThhUFNCeVJ2ZEo2cGYvc1FaUEVwaGFZVkhDVnZ6QTJxYWhnbnI4MDh3b0c1Mjg3dVF2SUZmMDN2UmpleUdSVGxacTdEMEJDaUE3QzR1UmxpaFlaMnJJcjE2RG9HNUFTczZyYUs0bmgzL1VXUFNFVmNibVkvcUN2Z090NU9QTkJqa2x0U0laUEFoS0I4TXlTb1ZKbVpab05pNlFoeHdlVmkxUWpNNkFDZ29XUTMrN3p5cUdFRG1UL1krREorOHNaYlRENDU1NytYNHhybjR4WVlPaUpjZmJwTUFFQ3IrSVVRY0daQjF3M1M5TkRRSjF1QlFtTzR1RW5iTFJBQ1hmYVJrR1pRZ1F0YU5BQXBtNnFDTGhnV3NxYWdqWm1la3FUbzNuR0tobUkrbVFqV0JQd2JDSVFabkt5S1RDSWUwdFEzbFNXTUc5a3k5Z2x1S3R3bzNWeWZxUkpXdHNXWFdXU09xSW1INnVsamxpV3R6aWJSZmlBdnByU1Z1dUJIZWdMYnZEalZ2Yi85MWVpTk80WFp1c29VZGRsbWFmNlVaMCs2TlVSWHhYTWNzWjVOcnVJUkVUNGlPWndpM24vcko4azRaQ1NsbHhabXdUdlh3NGZ5RHU4MW9uT1M1WjFxbWlPUGcrK1FWOEdYL2Y3Wlo3L2VlMFhWcDFYYUd1d3ZldGFLV292OWhuNzljWnNZbVpsUFJ5a3hYSTVpNklzNksydE9rNDFmYUFjRlpISnJwVDNpZkxhQStGUzVEYUVRQ2hOSGVYeUM0enQrQTIzSEsxTkhkS2tLNVoxdkI0aVNZQXlOaWRHdVdtS0g3RlVKZitIWFBTNlFPVmhHcmZzOHdRQms3VG1vSnNUZDRpbU0vMkF1aUVxcmJ4d0U2SjFTYmJsRFNiZEEvVHdOQmJPR0ZFcElBWUVNL09RN2J6TjhiUExTTE5Mc0NLck0zMW1MWGdoZEtHVmdDdUg2cTBWYUJOU1ViUU5RdDN4SUp0d01ZKzFPMDZpb1V0QkNNWmxWbEJCbVN5TmloR2h6c0JBdFoxVjZXa09xM2VEMWxvVmc4VFJJMm94L2s5dWtYcElZMnQzMWJ5d1RtRVJlU05FTW41OUJ6bTVXdHBqUmJFdlpncVcwQTltMXo5Z0xaUGlpenBWUUNRWWR1d1hVclE0NzJkRTY2OUpsbnBsSmFwVFJwRzhabnp5VGhIRmNPd0Q4aFhGK3p2dUlTV3ViT2lwYllkTmJIdURleHFNdmxvSWZvaEUxWTBOdlM0NVRZN3k2Z1NOY3hXVE5MYU1FeTQ5aHF6MkNYejlUUkJYeVRMMVVtVlF6dE9pc05Xa1BaSUJjb1NXVnYveTBXMHRUM0RvTldSYmk2SXpBRWFpY3hyZmFVcTdtdDFjeWIzQjZHSlJhWWcyQlpjTWc4bE1qQ1FTbXJPT01VbnJ0YlpSUVpXRStYTWd4ZFFnbTFDTVJOeTE2OERZdUJxeFNjWEljQkdWb0tURitqTGhIRlNyUnBnRXFjNG9VNEFLdWJ2UGhTeUZsS3FKQ3Q2clRFalNvazNsQldndTNhQmZGbU44aGprS0dvaFlpZndZOHdLK09JMURQbVFxdVYxVllmcHF2VXBxZHIxS0Z3ZVB0VmZYZVgrTitjdDhJZGh0NU5YUHNLbzJzQ0syNzZabWZ5cTZBQ2tzY0FxeGZEaUNnQURCcWc0M085dTE4Q0tmSkdlMXhLdFpiTWR2VERzNEhETjY2ayttMjR6RU12cktjUzBYMWNsb2lUYWhCSkhTNUJYR1BBRkNCUE9EeGJwMjBOVlY1TlRQdVl2T3kzYjFteW1RWlRkUDZDSUlUY0lLNkwvR2xza0dpdlJLVVlOQ3NvS0NwS2hDcWVjbjgwc0NobDR1TGFteHFhcklRZmNKQkVGUXJJS1BDSXNsWmZqbFlwZDJwMUtpdXZJNGovbmo1ZmhHVFdOS0szZFp3MFdiS21aM3dFUDUzZjF3QVZXWjZaak8wUWIvblp5TitTVkFBS05ZQmw4QU82NTJoVk4yTkptK04vRmNmazlXSGliTVhkYmVEdzFkZE9XUWtvS0RRenlmNW5razhOZE9QNmZmbkdTbWtEUCtEYzdnUWRzdnpCMUFOUkdqdTYzQU1EV010NGU2MDJnL1JNd2E1bVFQVXZydXA1ejJiampOU0NBY084RWRKWTRaR2MxazJRWFpyVjNFb2ptczhjTUJIS0MwaFdnYTFWOTVBU1czd3dHL0xoT0hPL1RhcjlFclVyeUFwdk1OeWNnZVU0K2RvUkdMU3FPUVRqeHk0T0Q0SFR5Ky84QTlJU0U3WXJyc3pBZVN2eWlTTkQzL1ZwU2VrVDBGMjJJQzcwOFlPQUdTbG0xOFN1TDVYM0hVYlBjUXp5djgyNjBMczNPMk1ybWxFRXVXSjZZcmtuZFZKV1UrSlhzZitxaFZJTms0UUxHVjhKaXlTUUNsNWVwZm1CTnRuckNIMHNndjU4OCtMd3U3QU5nSVdRaXdaM1BsSkNWS3ZmOGYwWVphTVlWMXFpRXQ5aWNEcjJ1enlrQ2hYN0g2UFZRZm11bXpWbm5BNFFQbUI2eE1hM0VtSjIvSDZSZFVaRnR2cTE1SU45MUFST1pEdUFXRlRTTE1iZzR1MFpNQ24vM2hiSEpqRTNUejhqNlRtL3lJdzUrK0U2V0Fuc2lSM1MySFF6YmVWbVk0NlE5SjJoTSsrRFlCVmZPd2pndldhNHA3WXlRa3lUM3dJTHhkSVVxL0Y0WmFtR2lzRkZaRHFwa2l1a0NTTHFSSmRrVkFJblo2ZXpRUko3UWRXU0U5SFRjZ1FvOUU2YjFFYVMyYjFKeFBXVTZ0TTBjT1MyT1k5Qnd0UXZzZHlCQWgrdnJDdUt3R0VZbktWYXZHYklDRGk4ajRjNjhNdzByd2x1eVBqdUM2VXF6UVRlSm5peDhDSklZOE5rd09LajFYZDY0R0d6c253MHRxSmVvbVZ5MmVDbk9WYlllTk02dERZeEduaXBiWTAvNGcvUmRBY2QrR1JReFlFalIwSm0vVTRobGVXZ2FGRUZVY3JPWERZajZLMkptMEN0MG8wbys2RkpERHgxUklUeXZ5UUJrTUhyOWxnSzlNY3pFRzlLNXZMRHM5TzRGbnlnVGVINWtBbWVYeHNjVU13NWoyMFh0QlBGSVpVVzA0R1k0YzBPSEREb3h2dzhUazJpUk5seDMzSW90SEVMTDRFeVFuNnpzMzh2WVVRU1kxT2RhUytZQzZkTGZFU1pOL20wenhuQXhIdWtwVlhRbnVRSFdvdHoxWjM2ek52SzI0MVR1ZFRPUE5zMUdpUnc0RE9rTUZGdHhrSGxWT3BURHUwZHF3MFY2RkM1Z3pvOHZGYXFOVUNaVmlHOWlsNHREY3BYVytGdXNaU3g4a09lRFFQRk5Nc3RjY1Ztc1V5WXhpUzVJdGtEcE8wWllscW94OGZ1S0I1emMwN3dWYUhCa1FiNjBNWE5kMHhkUjc5cHBDRUp6UWlWNVJTOFQwZGJuOFkwaVdSN0p0dUVLMCtRZVkzSnFXU1U1amZtUWVtR3hsZ0luZUMrRm1SMlZUWDdMMVRQT3VGSEx6RjBNZUw4SW85VjFOUWhDYWNlYVhYZXFVMHRQT3VhWXFjUHFqSDJ2KzZKeXV5cHpTVHJjcVlCUmtSMmxvdVordVltWHM0UmU1QW9tMzhOZjg4R2J1bmEvSFJENU5XeW9KeTNrZmxlWERKRm1IMVhoTGNUQVpuREtFZmo3dENOWEdjUmt6azVIVVk3WGc5UHBkb3pZVFNRNFFwaFRPVWx5ZjY3MG1BYmFPRGVJT0JuZFh1MU9NdjNMdXVUYVF2UXpkV0hvNVR5WkZ2YmUzaW1aazZoY0ZMRFoySzdXUUdXbk5kVEMwYlVJU1hHdGtSeU9GdFhQbFVZSmw1T0Q5UExyV2hjTm1QR3EraFRFaU8rdmpzd2RtZm9rdjRobDNIWngwN0dvekNVeEJjazBCa1pRSWNCelBSV3lZRWJ5S0lRTjZHRzNaVVIydkxMZjlOeG1YN0lCUjZUNEp3WWxZRjNSYW4vY2d0eFRhNG5qbzlHanU2RTBrMkJyZHk3cnoyWi8vRHREMk9kWFZLcjAyMmJqTjVFV25ubElQcTdSS3Z5SjdUMEZpZ0VIdTA2Z2xiNUEwaFlvdUo3Y1RtNkE1MjZZV0tpbnM0NEVKOHdxRlQva0t1Q250SzNMMTlHSFdEQ25ZdDdBSkJPTmlPb2VpSnpEdHl0aG5kUUV6Ui9ObDI1Qm11S3JWMGFVNlhoSDRRVEN5UkU4U3F1RUhWQXdvVmZGUTJJMXlwREJsb0lKR1BOb3AvWmNGTFlNT3ZmTlJacHJBeFhjaTVpalAyMTNhZWlvemhEYk5tZXZHeWFNVVpRWFptR09xbUJWeGQyQ1JpQTF1WmpjQ1NIU21YOU1pUHpzZGlRUjlTL0pydVFuOWxZY3BySjlIVlpQdGZlUmJDTk9aUzgyTUhmQ3lTM3Mrc2I3d045SCt0cTd6UlRvM3hqeFdEMmVIZGpPNzVZd2pPbzkxQWNwRXEvcmV6M1dtbml4M3pqeXBsNnlNN1hKV09lY01EaUxLbk5ReVJTek1SM0JWdkpVaXFmVTZXampDZWJDem9FWjhDS3RBZ1ZLd0p4REZUeEhIVzNsUHBzV1crNjcrZjZ1Vi9ZQ1E3cFgrblkvWlJUUUhzZ0JnSFdzZEd2bDIvYTBHYXJmSUNzTHp0RXlrQlk5bVlxR3psOEdxdzRmQnF2NGN4MXJOUHV2bCtSOTcrOGJuV0MrZmRPRDVFT2ZoWkVsZEE4ekNlamowWXEvaHhmcXBrc1UvbHN5eDd5WGVZcTVqYkNYUno4c3hkZ3ZQQmpOVi9PVHRoU3N2N3dRTkdIMVBaOWNpazlKSDJlSlJ6YUd2ZTc0YW5RUGp5eEw1TWZ3Ump5aEV4ckxJODZHL1RVNnhmbzkrUVNxUHhnOGlwVFVWcXBHWmx0TXZ5elQvWFZwdUFYN1NUQmJ0MmZ4Ry9JcnVVSTRLNHlsWnZuMzV1UUZkU2hvbnVjZUg2Z0dtNGdZeDVucVd1LzlDT1RqOWpUbkwwK0JFekw4aHllWVZKSmtQUUlTK0N1bzBYUmF5U25GMjd5cGx2Y0ErbDhuMHVhMlorZnVtcGdwMm9URzNDMGRXU3pSUEpudFhRRFdkM2JYcWc3Z2szT3NZMXdWMDdSNWdlZmQvNTVZYVFIL1g3YmduTHNvMzBzd0J5SjVLU2FnZDNCb2FHZ3ZwOHpRbnB0RkxYYWlhdzRMMGhjNzcrUGF5ZUkxRW9oVGdwa3JOOEJDaGxzdzZmQnZyN3JiZUsreXFraVYyWnkvM2J0dnhlcjMzalRQYjN6VzI2SG5uSGMveDZzdGt4L0F6Mko1OU9ibWUzWm5NR0UzV0xuTXA5MmJSOWtjYklwRUdjZENrLzI0VTBlRzlmN3NYTmc4ZmlsTDdzU0c3M2xFK0l5TVMvVU1Uckt6dExZb3I2Ynp3SUdKc09KMGNHMGtNNGtWMmt6QVNRaFFnQVFvNVRiTUNIa0FwZWRXWEdPejZVZGUvN3Z0eFB0Zk5OTDVjZklxV1c0MkxnUmEyLzFwUzltU3k5NVlaSHBaNURDZlJZbjlETlNUdTNOeVE0RVVOcHBVbWpyb1hwZXhrcDQ1cVN0V0R2MGJ0QUo4R0M2aWl5Q2hlbnhzTGtYWTEzdk8rZjFIK2JBUXhNakppTHZ4QVZwNStpMzVXS28vR0NRb1BUL2NscHRNUmIyWGFmQ1BOUElDOFdSa1g2dXZWT0hkcitwWkp5RGNYcTIvYzZBeHhPajl4QW5hSm9hUm1aNmNVR3UwUGNLV1RNbE8zdXBYMFU5L1dyNVNqQzlZTEo3N1JlcHJEcnRVL1E2eVdSVldQZVd1TnJPVzU0NTdDeXJKblRuNTFCMjd0VWRZNHpubWc2Y1ZPcVpYMy9LbE9IemlJMzl5YVhmUU85WmYzYXJYV0VKV3RzaUZEWFYvOWlOaFU5TklqRHAzMGtBa2Y5WmJuNWVBSnBFYkNOcWR3ZzAwUWlJMlFWanE1cjJiTFpnUEVPQmkyQTIyd2RXWEh1bG5wdE5FRDJJTVpzRUZCNzZkbFgyUndFYUcxbXF3MkJGU3d2ZUhudjA2RjM3dXc1TEowUzBlOE9wWExPSDgrWDNOWmd6LzNIQVJyS3FWbjVmQzR0Y0ZseTd0SHVtdGFseXh5cmswRFhPZlFvUC9HM0NldGFlZm5jK1hLLzVMdk5yOHJueis3bVNNSVlUZUtHZ291UnNUNU45MWdlYy9TcjJPcWRyMU1xcGh3TW03VTJaejNBMWFDeXZURmpnYnVRY0pDQUZnSFBSMm9YMjlRRGs0d00zSnZsMUpzTDFqVE9RZ2dJV09hcjl4U3pSRXF6YVNRVFQzTS9TaXhIdmlvalU1TDdCbm1aZlVPSkFlS3hyak1uZ1pubmZvdjA0Wi9BRUE0Vm9PNzQ1RjlZKzNTb3NRZnBFcFZGUXYzb3BTb0RnSThQcHd6Zk1aMVVIN2xsZHI3am0rSjR2LzR6ZHNUOHJqMGR3VThuVXdnYlJFSy8zeFBnaUY2cjZhZERVakVwSDVWZWYxTGFObjVJMlArWElMTjRTZjlQT0x4RDFWWEVBb3NxQWgxQ1pzbTdmVE1rQVMyNkV1MDYyWEFPTitHcEtRYUw3dHNnWFRFNWp5Vk5rTUljQWdnVGh1WjQ3TGdka2NuQjZmclA1bk95S0pDelVwWWJaMDhVMU9TWVFlaG1SY1F5Wm14U2NXajc1SlBKNHh0ckhjRS82QTRYZk12akcyeTRRWjZlMUNDMmh5eVNtN2xEZTdDa3dsS2YyMzBLVlNNaS9oMkN1cXBwNU5Ea2ZRNEFpUXpWQnJHT2pxVHpYT2wyTk1CaGcwYml1SE9TTE1jcVkzOWtuU0lTV05FaVBxeEhLZG5lQ24rSkFPdEN5L2UvL09oSStQd2NTbitRTS9lMytucTd0eXM5QjEzNC9kdnY5a3V6by9nUk1xSjhtYWZnNzlKOFZMWVRrdlZMaWM2NmczVFpjcERSSlA1aHVTQkU2YXZUeHVVcTdTWmpIcDBXZHd2RVE3SGZOUTlMek8zZnZydGFpWDRuMm83TWlFY29remQrYlA0d0pHcndyaHhvMndMbzd4a2hrcVVHdzFSYmxxTjM3STl2cXlXMG5tT1lualFtMDNEOEQrNVNvMGhYTy9qZGxIYU1oT0c1UmJqVmowdUdUeUVDNko2SlZqNkZacEc5QW5qY1dQckpPZVk5WmxMOWN0dWJwRlJQZlNoa0FFYjZreVVZNVpBYW5RaEtuTklVWDdOSEJuSmFhRzAyNUp1Ympjaksrb01WTmd3bng1Znd5TVJsSGlJV3l1ak9nemJnNHNwZm1rcmhEM1F5L0ExMnVQbndqWnpIMk1VMEMzYXdEc0lvbk1DNk1Nem5BMCtxM21oYVMyL1laUmZkYVgydnZQYjRLTC9sTzA3RS9LNFhINDNYTVpESWYyeFYrVnI4dXQzZ1o4bmRtZWw3N2dYZjhCS0Exd0RYblZHY2xhTTdwaHhDWmQ0YitqdmJ1TmpxSTFMTjBvSm52YzNST2hkYUdQKy9TT2pId1ZEeFM4SUdWN3AzMFdZSTBSaFRCTXVJeTZzWWdNdkF5Z0R4d1owcENyYmdoSlN6Mkx6VVNBWjlpSUN5K0ZCUjU3S20yNWJURDVheGt2eDg0ODJ6Yll2UFlocFVwL3crUkgzaTZJQnpTUW4rdUxUd1l6cFo5TUdpU0c1TWp4VlBPWEJkSG5EUUUwNVlZSWFUeUkrbnZUNHBTU2oxS0pVZHFQRUMzSG41T2xqZm82eDJBeFV3aXhLVEVTSVJ4RmlWQm84RnVtWElZWDNTdEVEdTdqVFJ0TzgvbDFvZUpIMDZINmpIYWcwaEVDQ2lqVkY1V1pqNDEzVGtVbEhhRWZNUytYNXR5WCttcjd1d0FOU0oydGN4SE9ydmVPZVAyQjk0aHJwdXRGMTBxNXJxSE0vK1M0YlNZM211M1Q3anUwM0dzTmt1TVN4dUs5enF0RngyQlJQU1p5dXRlcDJ2SFZEYXZvNHBtUmdLVkJiWTgzMFRTRUhHdWY3NXVOb0FUNHBOaXh0VGNEQWtvT0kyaGlYb2dxTHRDaTUzUnJJQjM3N0hvaGhMa2xWcUp5RnhDaDZNWXhmS0FZbVlZQmhCOWZPR1Yzd0IvaXlKSXgra2RnK2hsR1NITFhnbktXNmRrTjI4REdtNm1LM0cvY3ZBVHl6TnlLZDgyVHh3Y2ZxY05XVUp1bXg1eGYxdk9PdVJOQ0FXQVFjM3IvcTQvSHdmLzVmRnlTL0J3YUZFUDd4K20xcG9KZGdqMCtOY3lWUHV5d2VyZWs1ZTdqWDJtRFI4dXFSN2hUK2poMkZyOEpITXRJc3Z5RXdUMkk0SmFCTWtFOG16K3JtbW04S0ZPZlJvRCttSDFzN0k0anRGS2NKZXU0SXpvQ2FOekNma2g5OHRhWGZOMjI1RWVPdjQ1UnMzQ0JJaW82N0RsdFp5Vkg3SlNmSWkrbWhBVWN5dkk1L0dGd3l0UGZnQjIvS2R1aHJ6TTdNTDVIYVFVam1hbUpFWm15U2F2Umo4czM0ZU90N01EK1dtNWlWQUdLRDhCbGNxL05yU0NuVXpTTmJ2MUUvcG5xRVRXdE9Vc1FOL0JSN0lLRUkzdXdXdG41YU5GUWc2UnNPUlRCRHljMndwWitWc2hGcG9yeVlIcnhNdXoyTy9sSTRraEEvWTF6NnAybXBhR1kwd2REM2R2WmdUTUt3UmZaajI4a0RSKzJZZGZqajlmb2ZtdlpzZjlmVW9uL2NHb243THlONTRLNkRncHpvUzVBWmNjNXY0QVRJa253alJqS3k4OHh5enh1eENPa1N2SjBBZFE0YmpJbVZXRGVBWXB6QU91SW15L1lmVnNrVzRrS3FLY09jYnNXNk1tUG9ObGg0dUNJcG5TUzFiWDhYR0dWRHZpMnppelBodm00cHRZQlhqbTZ4SkpzRldDeEp3My9LRDNldWpnVHhZV1c1Mm5pVW5GR1hGMnBqWWlKT2V6VERnSTVlL3FJNmVQQ0xhdVF5dzJyMldSM1A1ZGpyVjQ3SDZ2bGhnQ2N6UXg5MmwxVFhkWlVFUHh3YURucllWVkpiMDFNUytwQXkvc2VDS1pMZ0gvYlBHSXovZUdVUU0vRGx3S2JmTlYzbmFJQ2hVeFhSNE1KMU80dElPaTdBbjQ2emlMeHFCMTZxRHZwcGtQWmZ4OWxIMmo2b0VZdDR2a0pFZGZUeW9EcUtVdXkwMVVFWHFrL1ZmOXlHUlROUjNuZ0dpaXExMDlZRW5hdXFEcjVRVVkzbEkvQTdjMSt1dEhmYjFOT0RDRVJhVUdPenpTK3R4UzkzdnY4Q1gzV2FweUR3SGxURTZYYm9uZmF5dndnVGZLYzZjZ0xGOUVwWStCWFRLQmY2VEZrRmV6L2ZDZE5DREt6QXhEaHlEMkE5YlhqNEpGOTFyRytxbVVkNEhxcllzeEhGTlR0dmtUdmdySFNMY1hiem5KaUZsUW5QdE50QzhXK0lEdjVjSWowcVZzelFJd25WN1JFV2Q5N2VnLzdVa1BGMG1tblFjV3dsdFptM1AzUmUvU3Nta3hBU21oNUVLMGJQRjAvd1hveHJ5N3hqTUZGdGhEYVN5SVdnMmFIbHZwZ29Scy9UaXRPQ3drSXlDUmoxcjZmM2gwWTNyNlIySEdNYVRNOHlIWWR1dnlxZUtEeEU1N0RZckhrNk9iQWZIeVVRTVFFa3Zxb3RRcWd2UEYxcFo0bi9QY2pCajB2YzRCeVJpeXJ4YkpBOFlwNDdXTWQzZHZlY25OWDVhUFkvWlNsbVJrZGxsZWZJamEyVXUzM0xXdUJ2bWs1SkxkNmw1SFlURzRZV3hlK1pFVGhydzNsaUxCSEhjWFhUTS9iaFEyRmRUaHdaemE4cmR5Witqd2pEY2RoUzltdGtQVjdTOVVDakJTNWYwdnozWjludXZGMkNVR2xZK2tSMEtBVGlyNzVlL0pLZzlzcjRMc1ljSjRvekJpbnlXcitqaFNQQ0I3cUNUc1lNbEdHMjduOXY2QzFsdnJiZ2FNQ0xMZFBKbGlldWJzcTJkRjBvbE9qYytPajRQOWdPemFod2daS0Y3OHZQQ3VuS1piS0ZSVmJjRC9pSFJVWW5XUTB0dE9XMjFaYi9mNnVzaUZhUUtzYVJZTWRKcHRaKzhySVl0b3VtZFpnOEhGakRQQnhrUDBuVk9rNWVGTU1tYVJVT2t5WnhGdzZCUkJsS2VWcFdGamlPSjJJNytvWkd3aEk1dDM1cmRQKzF3cWgwaFR4ZHJYNVl0Snp0VkJIaG9QSTlETEZvaXBDNmgrUG84NG95WDdCNWhlUlk1cW1DOThBRWJnQXJGT3kzVnZ2ZEF2SEVTd3dtWEVCYnVkOEVoY3p3bUZTZlNFMTFlcER0WCtCREt2ei9Xem9mTDVCOGlUSTlKdFFIZlFTV1p6QU1TT3NEanVVQ09Rb1I4VlMwejVKRFhrQkVwVm9Lc0djMk1Jd2Y2TzN6ejhibis1R29Ic3lzaVJNaEh5WThHYXJKNjZtcGV0aWs2SGxITHJmYllYTWh0c2dqSUZWZ2VSckwzTkFLdjhXd0ZHQk9RNWl0KzI1aUNqMkwwbTFqTEdaUHpFQlBrOEg5aGgwQldlNUNBTERPNW53WWNCdTRsWlVIZi9BNTdzSER2cVYzRmxETDR2TWM2TktxRFphNXMydHJKL2EwTDdqR3FKU2M2OVZnajN1RGF5RGxvaXh3ZkRXdUs5ZlRXa1hucVEyenpUZklwWHlWcUh1RDBpcVU5b2tjMTNRRHVIWGNxSGFoYzZxekxzM3J6UU8yc1Y3UnpZcU1wNDB6M0JxNnFybWtPWGQzYnBXZW5TZnkrL0RDb0xtamwwWlhuVkhFOCtiTW1ueFRMTHlSUVk2dkdNZ3RtRHlldmlGUWJUUlgvaFY0QzZiLzdzUkpyWEhlT0R0ck1EdGpHeEZLODh3cVZWUzFCM2luUVBtRnJ2eUkyK2I4RGNsK0IvRUFrZlhGdmRQOFlSeTdkSFAwcVQvUkRtT2NGMlJta25aN3NicWxmOUN3c0llWEZPbGVyNWZoa3VYYWx4SVZaMlErcEdyN2JxMnlicGV4SkdBcWN4ZVJDdGF0cDhtNjFyc0VCRUh6ZW5NR1BQaTU5QXZnZnRZcnpnUitvdmxWOHdxOHo5WmJzbUVLUW9DZ0cxeFA2NVBYR2RKeW5wSFBqWlNBemszRWZ4aWNPQitqem1tM290bWEzNm15WmJKeUE5Z3lURXZzVnZYOEJZRlRLRlQ2QmZCdndRRWpwMzZ1NlY4L2RhbnArMnBwVTBTVmRRVE1jTEhVd1RlenRXdFBjK2Z1V1hOZ1dpRmVpaXo1cUh0MWl2OTM2QUp1ZHMrMktiQ2hVcTdiZ3c4WEtvUGtiZXJxM0NLMGRSVlFkZEJUV1gvVEYzQ3ppeGJQMTVZZHY0NUx4aGRjU1BpdXJ1WXJoQUM4Rk8rMDE1RjMzTVpWOWkzUDZlMnBKblVURnV4VzAyWk9GdlFVRXFmL2FiUmpORkVlODArb0NlMi9TVWpnYmZ3NlkzMHpDdCt1Rmc2M2h1NE12aHljM1FHN2JUazNlbmwwcDF1U2xVN240eituUXAvL0FnMVlYZzBUTmtpUDJUeW1VdFZsY0UzR1dxMlQzVnh0a2pvNzYxOUtYaVl0SE9vL2gxdHdZajNwNnZKZG5zMWd0NW1keDFkYjVUa3Q0aFhMZ2JRRnNpUjhIR2UwYnkxRGc5L1lJemlmcXV2aFFqcEJ4THI3NU1XUnZKN1NjOUZhTklPVUV4QXR3eTNkS0JocjRnN1pVaERSeG9NZy95My9Mc2l3V3lTOVYvb0Vudzl0ZjFQVE1XamhMZWpLY2gvWi8zblVzTHZleEVaYmc5ZVVhdkJTdE9UbWRBdmpRbHFOTFBNK3pKMXNiUGN4NERzSkJDdlo0VTMzRG0rd2lOejVXYkhubk5CazE3dXRJb2ZGUjZST0dEZnFyYnZBd2tkVVFlSFdvMCtVVHFYY25wVm5HLzJUNWhxK3hYVnZjaEZoZDJaV2g2OVlmbGlVZXdVNno3Q1dHN2xhN2Y5dG84Q1BiMWZ2bmw1akZ0b1dXNzhaazFIb1UycFRRM3AybEdPT0xVMWVtQ2trdHFXRmh4bjc1UDJCclpUbk1nZDdvck5GZmZURW9ZcXRxZnNqY2UvUDI4R1AydDVhakRiMVRtLzMyUDE3MXFhb3NaZnQxWHI3SzBOdlZZMHR4Uzk4aExjVGNXUlhKZloxZ0NvYTQ1YUhlelV6UzFob0IvS0E3Yk80QlJ2eWJlbGF6dkNtdkUxZGVFM3VtczN6Vjc2dllTZ3BiLzluQ1dweXdtUUNOU2s1K0prTDg1UGFNcC9NenM3R3VzYTZjcDcvZS9HQ01NalVUNGQ3N1hid3IrZ0Y1M0M5cnE0amYxVzlxa3JRQnNrUkNmZlNINlFucUJFdkVvRjV6cWtyczdPTkM3bkFZRHB3eUg2Qk1JZGJnTWZ3dTdxK2FOYlhoR3ZZM240TnZucFRuZ3YvaUc0T3Q0Q2IzYUNYWEZnZ2FiV3NnYlZxSzM0Vlc0VHhqK2ljNk03d2o3UXFScWdwamZpczQ0aTIyT2llQW9rL1NDRlY1ZW94R3NQb0pjNGs2dzVmRmtncXhaLzBFV0pOMzFYZVIwUkFXWjV0ZEJTSkE2ajhkMCtjdzhRekwrTkduVWdQdW5qc3Y5NlFTblFIQVU0K3N2d05mNjRsK1c4NnpsQXIzWDhncVQ3L21kOEp0cGQxZ3IrWjhPSERnUEdEcUUxTDRaTlRMWnBnbUx6NXJ3UW8yeG5aRU9CbTBhSjZ1Ry80TmE5UGoxdUxTeEVHVm9KNWErT1RCOUVFVU9IWVdrbjVrOG5lUDBBMWZkMU5PVWR4S2JqWEF0ZEZkSVBtZXNoUXVlUVVwRnJXdlptYnh0dHNKZkphL24yWERYclJ6OEs2Zjl1VjN6TzIzWk9XNXh0cExnREllR1ZxS0ZyQ256d2NqMXVjSGNhamJoTXpzSDltbTQwMzdoWHoyOG50b1Y2KzNieFdjUkhTTE14MDdXcDhJeVNYTGtRaXVOYlNLQTRuNlVWeGhVQ0VZRjNFUVFOVHcvUUhnYWRiU3orZUhNdjd5emxmMlY2OFpOdzJhV1BDV0FkM3dwYnBtbUlLQVlTUVA1ZG5MUm55Z3FaLzNMamVNUmViZ0t1VlRYRVoxaGJBYzJMcklFcDJXRVNqU3Mzb2JtZXJRa1FiTS9QeFV2eXIzWC9sUFAvYWVEKy85aTlrN0FxRWUvQ3c2TVNNLzRMTU9BbjJDUDdFK2ZwR2psMjE2TkJnVXJrYnkvanIrbUNRa3l2RnJRYWFYd3ZYb1QrNUlqZHRIN0ZqZEs3aU9uT1JXenZ4R2p2b1I2SllmSzh4UFkwZzJPajFSV1J2RHcvMXlITzk3SUkzdThlRkNUTjFBTERrUU4zR2QwTjdNZ1lWK2dTTnRwTDZyWmVtdjBXL3F3QmpMVW5wQjJwZXJoWjBjRXBzM3hna2xzTDkwc29hOVlmSGdtRWVMa3dWTnhnMUIxekdReVVWQ2tMaXQ0RUwvd0FBT0l0YitJd2JPUWtDZ3A0YlVsQ1haZDZMUjFjTWdiUUdsVzl3RTJ2QUxVQU5jbzhWUU5CTlcwMUpEYXkvU0tmbmhQblNkbG5BQW10QXJhQWkyQWFicVJwMDBkblZybHpFMWs0NG1nOGVBVWNhV0JZSzFpd25oVWFHSlBDUUJPNGdQV0QxMGY3amVEVVNBakV4Z1VCOGc2N1hQQStZWi85dGNuZzc5WjVIOTJGejliRkxVcXU5ODJMb2dmUDZzcGx2M3VkYWtsOHpjSWJhNVAwSGtzQVhIaWwzUkNYM0c2cGZxR2o5RTlGMkprLzNkMUtmN3RMK2tjOGJ2cXllcldtNGFsbDRwL29wSmdWcm1PbjFwM2RxZFdkQWNGcEVhSFQ4Z3RkdytYMTVvaDNBdWQ0cnZYUnMrMkhMTysyU096VnQ5YXVtdGI5VXJHS2xXSU5VejJmZTBvbzJabEFwaFUzVjdLT1BsdHp2cmVLK0ZKa0NWbkVjbGFvRHlHSVM5TU1FcXlDS2RPMVdsTHdnVWlzVGs2RmZ2Zm1tRGxmcDd2YUlpK2tlOVptRWc4OHJmcFV2cktlVlJQYlYwQkZVbDlmZW1XWjJIMTR5RUlnS1p5YVpNeEE5di9ISXgwWWFHVzNQY0RvcXhPSXU3ZWxtdzZuenJJT0pTRVBMV2pkdEZLdTZvaWpzdXNkMlpkcHQ2emFsZzB2bTdydE9SMGpyVUVmdXI2MTRuRStrK1dmUy9melA2TVZnNTdmM2E2dXZHT1V2bCtQOUFZSnU5RDlGTXkrekc4N2xjL1BHRTJ6SWZUbzZNREk2SWs3TWxlVzE0Mi9kMGo5MVgzR0JYVFcvajFtNWZVVXR2OTZaU3RyZFVuV2IxbDJJOTJJazFxTnBraGlhWjN3TWxzRExEQXRGVWpIUUFYWTBWU1JreS9LK2VvUXJJd1kwcVhNZTZyaFNtRGdrMTdBZ3RCcEIrR0NLc25KNmhsbU1Lc0xGTVpjaEtyTUdMOW1sUVhucXZxbXB0RjJLVXVuL1YxeGx5UnpPR1h4OVlKVmZNWnc3ZUdTaDBjbWd5SFNIa04rV2dqYWhvRWlPL2xMZU1YcW43aFlkSXBibGhVNW5lV0M1WW1LbnMzTDIvbXhqWDJDSWxNaFZ4ZWNyQmlJamg1ZTNka1ljUWlPZGx3cUxyNFZWMU1sL1lYeGRiR05GVUVCaUpKckFoQWVKZmRPWHBjNTZxSlQ3VUJVTVNnNlRUaFZYdWNVTjMrcHBHOFNUQ1JuK0JaeERLSzZMK0hZUzZvRW4yb1Y2ZmZ0TGZxMmM0L1piNmZaMmpudk5qVExyNGM1TkpvNDRGK2p1NjdwMkJrWktpZHlDK1BLY1haSDV3OHVML1JHTGFHZkVoMy93QnYrZEl1Vk85czEzby9tUlNTMU82cWxiWXdNVHYzTVhjT1pUZGVGNmRDNHAzaExJQndGL0tyVDl5dFhzMnhZYVdtWGVidGxyMldmVkJxMmFpR3VmTXB5MlU4UGtrZVAxLzR6aUtwSW8vVm1BYjZGdVVTOTQ3QjBka2MyZ3hzVXhlbU8zMzAvZGFsN2hsc3dCMm14N3NKUjlLQm9PbGM3M3pmdjh3WWdtOFFtQTM5T0dENVNtem5nbzViTi9FY2g5YW1IZk1sNks5bzMxUDFFK1NBWU5YZmd2Ni9nZnJMMEhvaisrbUk5bUhQMWo2dC9nVkUvVlY1TExtWWorbGtQMXdzZnRIZkVQVDFZTTFIV2tCL1RyTVl2dCtnWWtTY1grdDJ0MlBaSHVYZHhRMjdGKy9Hd1AyRVo5c2VTUk54K1YrRks1NkNXcWFJNFBHSkYxYUhYRHNySXd2elIvbEIyOVR3ZHNEMkN6cVhFaXRoNExyNSs2M1hxYld6YlhIdDRPaEMrR3B2emh5L2YxR1ErVmNnNVhtVVRwVXdOejErRHVqZGNyenpydENHZmhtNTdIK1YrTUtHaG81TEZET0lKem0rZTE3NXAvWFU5V3lxZFRab1FIclNiYzMxZ21vdjkzV2xjdGM5cVhhcnF2SFRscWFaQzJjVmdjMzVXbTJqTHhNY21KNS9MYVN4WXFrQ2lVOVpMeVRVOW1UMk5JcndQTjVhN1hnemRmalg4eHZHYXJWUFdQZUhLVkhYNTY2aGVWUlkwOHpDSW95b1NaVFRXRmVKYnBsMFArcjV5UmwwMnV2UElXTUZTUmd3SWl1VjRXTTRSVXVBZFkwZlhqL0lVRzBPdTZzZUVueFpxbkU3MHIralZkLzUzWTR5N1pmSWt3ZGVmbkFDUVBWVklJUTF5VWJ4ZTI5a1RFM3h2b0xSdkN5d0k2WTlqNzNFZnZGY0hoT3Bla29Pd0lwUTQyQVV2aUo0bFowZCtzVWhZUERWZGV1Z1lnVnM0ZVZqcW1RQlJGanlMNnc0Sit4MXZhVlo0V3h1aTNSUWhVSm5aSGRlU25PVm9zUmw5NHV0M09FdjhtQ1BaN0NQY25SQ2FlVSsrcjByd0NmT2tCZ1NIRTYreDhyMEFPQWFNQllOcnNtNkVlcVdheHZyN3FKUHpSNGNPZTdueG5wZnVnYzY3NUJUTnVBN0xFSzlmYklsVVl3QWlBREFYR1F5NEVYcEFNbDh0Y29sRVR4MzBhb0V3VW9xT0NLTTNXSlUydjhHaWlOZEdHV3VjMXp6c1MvRFhRUkxnM0FoZDRvY2lnUmE2anRmMldvMnFiZWJqWTY2L1Vlb2JLd0ZDSlBkY1YwM1ZSVk9qK01hQ2VEZlJEZlNBMUpMdW93MFhmWTRiN2VxWG5uY2NSWFZJV2k5U3VEbTNncmgzbExHeGJCanJubmNCUWhMYjRwcDJrdXdjclV1UW1VTnBiSWtJaUlkUVQxUGFvQ3NLQW1FSUhPR3FFVFBkMlRtamVJRGNWcnpDRnBxMkxsTFI2d3MzcGhncjFocDBMN1ZHZ25jVXhoTUZidXhqOFV0R0tyUXU4aVVVRlUxS2EvZGtqUVhjd0FKa1lEb1FmRk05WkFIS0FEd0I2ZXVubzJFbE42MDBBb0phTkJnRDRZdHNqMlVrcmtRdkJBWmllUXdRTG9JL1dRMVE3eVhmck5EbnNrSm9yaFZ1WlZkVXdHZm1JMk1BUEdJbng3RjNSVUJZVGVwY0lVSnd4TTRDMzZUOWliSGxacWZ1RSt6Y3VvNlJMZWlJYjVJNnpEb2pxZjd3bnJRbVhlSnBFYXlORU1hcHlJVk5hem5Ba2FhQkJiY01TREs1S3c5ZVh3ZFVjMFk1MDNSM1dGdVFkYTQ3MEtpRGVXMC9VODRCMmNRMVcxbG1JVDNSZEpUS3REVTdFV3BaN2tKU29IUFJoSjdtZElpeXhkYnJtYWNmYmhXd0FaZW1YQXdEeG1lb1dYOHZhVy9qcVdWN3BrTzNhMERpWHdObUZhOWY3V3ZPTHpUNHdmSjhBdmxxM2NtczJmWUhsNmpkd2hVQVRlcFN2NTdJOTFaeGRtd2FUVm1JbjE2VjVsWDZ4R0tCQnRHYWo0a2RJM0RKUDBPRkkwZ0VtK0NyZHpzK0g4ajhaa1UxclVBZ2NRd29pb2RjcUlYQ0QzMzZZNHJxL2dGa2ppU0VBakwwYTczMlVqckxzWkpxY3padHN1OTMyN2lraFFaQXhEcTN4KzJ6NERTQytZamhoMVNpU2craVJtc2V1MG9icnM4T0VNaG1Da2xkUEgvWEg4QmpEVEdZajZCejdXS004UVd1KzJUb29nenNYRW9jeHJkeHVqVkZJcmR2d3dsOUlrVDNpZlhMbW83ZjJmdlJvbXhHWUJ3K0FSUGpiaFpaRUlXcUcraU1jN0pqTUIwb3M0WHF2MTBPZ2VneFhhMjNFNGx4eGhjc1poSmM0OW5KT3p6UmtCT1ltK2pzYnRDM1AyZG1aemZPNGdkZkNNK2xEVTByNlpPNGdYVHpJRUxYVzFpUlRSQW1rTTBrWTRkSWFaRGlxcXV1OXpBR0NNT3dZNEVRSDlRY1ppcitYUlVFK2FpRTB5WnkyNURFdDJpRWFIY2xqc3JFSWhlM0pXYmhQYVlONmp0V3lldWFkUXlDTkl0V3JYOElGMlJGNlNpMUdRc25zMWhtOG9MUlZsWDkyM1prUmdvdWdMSnRZRk5VNUxBclBaOVBFZ3FjYTA0ZjlYZzljQk1ITWcyeFFJRU9ud0wyOGNzSk12eXFST29ibFZmSWltTGhJbnhFai9IVzJXa2xtUG53YUZIRDlzWG1uUTV6MHRGZWNibWNrbWlncXlKZkNJZGZHQ0ZncnA5SXRyeCtNbk5iMUlDN1EzUzJUQjdjWTJobmphQ2J1U1FxNXZ6OThoR1EzTXRxWUQ3VVRzUnZjaVJ1RUk2dTAzRjVjbmJHRnZqQXhlWFNjVndQT0FpSmcrQWxEY2N5cTBka3VRSlNFRVFXMnB4dGlVdmoyZ1k1cXg1VlFCc0hQeW9teGxrV2h3ckJWODdqQldxV0VENXgxUFFocmx4WlNVa25wRU5iYTE1Qm1oVmxQdE12QWtaRTRrcXdqVVVkSTZXL0kzUUNTamZBQ3FKN05qdzZiUk55dGJRUmpIRHVnbHJHeFVYZjV2VnpkVkY0SDNyK2F2N0UrN0k4R2czcHM4N3U3cXlyTHFyWlJCV253bEhRa3A4WnFsUytVenY0Nm9ubmVwYU02dFlkOUJ5YXdPYng4MWJEYk5WTHM5eWR5Yy84Ky9zcjRCRjVOaXZpY2djN0FlNldVbnNiWHpnekVhaWJoMXJySURwV0hDL25vb3l0M3U3clgwa0tVMnhVb2ZOSFdjRGYwbGFidW5YdW9pVzM3ZnRROWlwd0xPV0lvVys0cHBSQk00MHQ0SG1ZQ09uL3N1TEt1WUFZL1JXRHdqOE9WWVFoOGRYM3UwWDNEZGMvMnlXNDZneDllYk1KdlBQUTkxTE1SMEVqdE51UDlndWplc0I0T0laVUlxL08yRGVzQy9aNkx4TnRrRWg0QWV0dFJ2MmtpbWZvNFg3V3JGWTZpVzNoV08reHVpTUh6WC9wNFk5WUNiVzMxOWlRWlpPbkZCdUtiN280TzNkbXA5VzdrdzhvTWo4bVUvZWZFRkMxbXJaUnpsYnZQZnhyaXRXa1hlVkYwOVdFd0FNbi9jK1BqaTNwSFI3MittN0NaOUppOXZPMmFCRE5yYmdpdmZvK21CQ0gyU1Q5bGVIV1RjVndmaFFZbExNYTcxUWdZRTg3YTBQL0p0eGJ3TCsvMS9SZXlBZjJyMHVhdit6dDhmZVNtb3g4Kytiem8vNTJ4SGxTSGJ1YlBhQ1dNR0xBOW5sUGlPcDNKLzd5RUdIM3A0bEFuL2hUTVdLRnRwZ0FMUy9TZzZLR3JOdUhSWFN3M1JQcHFJeG5OekxYbE5kNFNmQlhDRWhtSHhBM25FUEtOYnpFQjZCZFF3a3Nta3pTVjNqR1dFZ2NScy9waURKcEFkcEV2dFAxVnF0bFdLeDlFZ1R2TzJuWXhuenVmVGJLeXpJc2l2NkRQK2dhaUhxRndLcng0YjZxSjI1enJTQmhFUW5wZ05sdm9DV0RXdGhUcGliQnJldnZVcStxeWhOMmRQMERkVE15SE5FRkc4eVJrRGc3Y2FUeEd2NDJSUkk2eHhkS2NPSlhXQVA4SnJENlRRN0JXNGVRY3RvZHV6R2tCR1RUbnJSY0d6UzZMYmIrbkFxYmlnNm1DTXBQYmt6U2JtOWNyM1dkMjdGTEx1aEZLMXFMR2thZy9lTlRWVjgrZVM2aUtvTmlmREptOWJpTHJHTDlXcWFBQXpMS05qMmJOWU0yU2Q0bGVIeFBFc1JNdGRYTXBCYTBwMHdCVWFoYmtYS0drMVBTQVZnaXpDUEM0Tzh5WTZkUjZuUVFaV2xnUEZJL2x2bFlLM0lYUkFDYmU1dFYwcittQjRWbGt2Mmtza2MvSHN4UEdjSnFKT1dXQmdWNGYwcDA4bHk3MllYZmdvZTVqYU9vWXdkc0ZqaCs5dUloSE5jVHEvRHhHZUk3SjRzZEJ4bm5aRXRQNWNVWXYzY2t5OEo4bHQvbmFFRFQ5L2l3MEtOTUdreTNtQWlTSkJBWWkyelN3Si9YMWJGWVVyazk2eFU3ZzYyZURVeGJYdmNJYWkvMkNoRnFmSGhjemM2TCtFQzVzUEtNcUNtRTlNS3ZnU2FTR0kvRXNFQk1ZWE5SVVlFL2szWTNCVlFBeWJadDVVOFIyaWRhK21aNDVBenBOa2djek5iVmloVlEzRzh5WEYya2F4WEVVSVordDFLYWMzVDFrV05Ub1RJOE1mWW1aYmtmU0xFNFNLNnlXZUgxRjFlb2V3dFB0d0dUalVyY2I2MERuVmhVUzlyUWVEbzFKUFNXc0VPWWdxNldzQUxsUVZZT0JQUmF2ZlBScDArSnBvbDV2T2wydmN5L1dMRHNYTTY4Nm5BOU42Nm9YQytkWnBiTXUrSXg4bVpaOGwzZTV1ZzFlSmxieVdaV1E0NlA1Wk9JNGRxUi9OV0tRUVh2eE5HdWlkVm5YV1pWN3lNb0tJa0VUbEZoODIxaktEOXJrOWgzZG5JbG9ucWhwZ2IwRGo0a1hLSHZBVGxMcUxMS2hBOUFnQUlad2lEd04wMjd0MjFLQ3hwaUhNVUJ3ZVVkZ1JuR2E1ajhVQVhzbnoxTDR0ZVlkR0dJbVZtcHpiSnpZdGc3dlZxSmRjWlVMQnIwUk1VeWYxNy9iaG5sUk5MMWJQby9DVVBGQnhESEl3VUt0SVNBL2xZcHA4a3NhYlp3NVV0eXVaR29JeXVzdjAyWEJtZ1dJdWVPMFV3dFZxUWZyRzJDdUV6Wko1L0FiM3ROTHY0K2VHZ0hrVlZUMmVOZlVFR3JHelJtcmVxWkphZkVxb2hzZUQydkpWajBSRHF1eE0zdDBxc0xtYTVhaHB3MkJOalZCVjZtUTFyT3FTL0VPT2Q0OFNEd2dnNE9YR1ZBaUh5dFA0ZFZ0QTZqeXE1UzM0ZGFjeS9TUStTMysxc2M3WjF5M0x2TGEyNFhmM0o4WmJsVlhydXNDM3FzM0UwbXIrZ0h3UnV0bVZqU0F5S3hDRE1RMWlPd3huK2p1TUNYdnBuZGQ5MmY1b3hsWW5sYlpqR3FFNVAyVTU4d3VSWjhLdGtXWWVlSnNicFJxWFJsUnMwOWlHV3RqenJkWDVhN2l2WXh3T3oxZ1o1MTF0VWZDSWNEUUxPM2FFMXptako1RnNQRytjeWJjQ3MyNk5MOVYyd01uUjdvVG9WYTZMWVd6MzFSQnM1aXViVXcxZ2RNS1VHM09RSU50MlJqZ204bEVYWjNPbFErOVdLUkJIMnkxQ0R2UndwNUxQMzA2SHNXakdNd0Z3am53K1FmN0FVSlFSZFNVd0ZRU2pCOUtrZktseUdjVXBuZ3IwaFFNT2djZkFCOGM1VFcwOEI0ZTB6Vi9UaWEyNERlSUl5bTE5ZndhTzZvUm5KYUJOY1VJbFc5TzdNZUpoMTVCQUh0QnFvd0tHNWtPR2pkT21QVnhRSWNaUnJiSXZuV2p6ZHlkeWtNSEkxZ0pvRUpqQ1dQODFENEM1Q2VoUiszblA0S2dmL2lzRVpWZkZ1WjhqQk5zNDJUREc2VE14Z1NwKzVMbDNYUHVIZGxNZnREaDU1TndMQXBjdWdnQndWOUNaaW5ZYURKTmpVK0hPVXUwVzQreVVHK01ENHd5d3RmVERaalZYVXBzUW1ZVG1NeFMrb002R1FpNmZEUGFOUWZQb0VDQ3FHUWJWMnZJdWUwd3hrTG14eGxHZWpvTDZjeFNrMHNHbWo1NCtuTXRhd29Ccllnend2MGUwa3FlcWpMaTRBcXlyRGoxc3B3OURWMzFneWcxdjBvaE1CMThFeFdLMC9NRUhBQUFna2Z2ZFJiK2FJeS8vL2RNb3F6dnp6Zm5QM00rL2wyVnIrZ1N2OC81ZTNrMVowbEREeUxvZGRpbWYxYVFXQzJUVUJBVWd0bTUvZW16SEN3MWdES24xT1VzeGpTTExaMU9meDN3VlVvTVIxTG1TSHljUjBtTSt3TkV1M0w3M0picGpBR1lFb1RKSXNZdXhBd1FUYzZIMjRmb21GWUE1WXUwKzFrc0x0QzZSZE9FbzhUb0g0RCtXcXdMTEtod3ludVpCYmFENVRFVU13NXVvR0FyRFVCbEFaaFpMTGJzRUhkblpHc3NTbU1DNXVoYzNQd0QwdEovSU1peU1zdms0K1FGZkVBVThMeXNUb0tGeGQxRDQzWmpKWEw3QUl6S05aYUZ4TXgyMWw2b2ZJU2Z3NnZVemt2Y1p6cE9XOEJpcXhndkdGNStDUmZFMlNoenc1cGwrUWJkTjd3eVlRa0dNS1BpazM0SUV4M0ZKQ3BGVXgrNDcrRlBucmlyams0QTBMc1N2VE42em1oemR3VUlZK0ExSFVCcGhTTVpEWXloemhPNFdZWVhmQTBBRjNxU2hzaTY3a1lMTUVyWjlUUDllNDBLdU53eHNxanBCMUE3R0dERU1CNFlRNklsY0NJcWVnSHpXcGsxVzQwakhqSDZ3Q3lOaFdXTUFpeFMxVGdiTExFNUtMcWMxamtaNm1hbW9sUEVXcksrNEsxRTlEVEUyWUFaWUp5TnJDbGdabUErWUk1ZzlwcHk1dFZ3cFpHM1lNNWdwdXp4aU50cXRUc1FvUVNBRjdCak9kT0pVWFF0N2ZiZ1l0ZWZFRjZqMkJVTDdrTEJmTW9CTEdVc3poampMYU8wdUVqYUhMZGF4YmU4RUkyWHQrcEdYYS9STWlDMEJQUEliVDNHUElCMS9kWjNHN25KM3JCWDNQbi95eVNzU1FZTUNuMjhHQVlRKzQ3WG82L2l4MHdRRWx4UkQvNEJZQjhDUStiMm9aQmozejRNZmx6YWg4T0tUL3NJc05BbVRlell2TGN1Z2tSN0VnSWNJZjMySVZDUzVoYXhUWUpZcUIwVGhWVjB6QkhXM3ZsZkFabGM4dEJRZ0JJNUNvcHd4Z2Z2Uzk4WndhSmwrdEhrc2NpQkgwc3FSR0g1UEFxdUVLcGRwVmY3a1JTelVHeXFRQ2RkVFhHSnZORVB3cXRsNVNpVnBqNmFoaWZwSmJPTG1FWHVPWnBGSnJJM2thT0t3ajJXMnpwV3VKck96WTBneWZWWlpPQ0xKOTRYZmNIUWlSYjBnZFd4VmR3RGs4ZGlHaUU4SVloU2VtcHhickdUdGl3d1hXRkJwZmRWNVFWU25wWWlpNkZEUXE1VlJrT0RRM3l5M292NFZCbHJ4Vlg3MmFTYW5Ma0F4NWxOSjZacjBENnBqK3paN1VmeDRSSjhKalgvVzNQVmlFc0NveWx1L3FlbzJVdGh0VXhCTlJuNVZWUmUvVCs1WlZST0xpVTdkN09LelZBWGhpcUxVaVp5Rk1rczhxUUFXVUlsTTUzY2pQU0tzdlEwbXJUWU0xSmpOeVVLTnpseURXbFVsaFFSK0lUaEpnYUtrUkNVaVFNNUlqL0w0djBlaFA3c3hubGhDRnczMXZXTUdEZUs3OVRBYzBRMEcxemJqYks2d1RGZHRqbEhzY3dJbUliQjBGMjZsZ1pOYzZuYUZWRVV0UWV5R2tWaW1VaE0yVlNNY0tVc1RQa1N1ZzAzWklPb1lQa1JKTE1TWlU5QSs2K2srT1ZER1Q3eGNaM3pQdUE2WFM4L05pekVNbHZRdldMNU1leFQ5Q1ZveXc0WHZqalQ0aVNMMldkcksyem1IUTZ6RGxpMjVMMEluTlh2RlVMejlOUnVKM3p4dmxiODZEckVWeStmM2ZDNVB6MThNdHM5dkRNN1NYZlNjL1ptWjluWlZ1blM0OE5Icy8zRGU3TnNRWTJmcFVmcFh2cC9IM1NBZjErOVVYOWhtY1VxOHc4ZnpMWVBiODBPMHEzMG5ONXNMVWZHYWxzOTI4VWwvRjJPMlVIbFZnWGw4SWV1Z0Y5S01jcEcxS2lFY3ovWE1GNWV1WVQ0TS8zdXh3L1kwaHpnOTZqN3hZTHZ5bndpMHFOZkdjd3FORDlXZTVwNUV4OHpmb1lFeVNwUzFwSWxJSmx0YkUyL1BRSklSa1Y3R2R3R1Y0RWpPOGthXCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzI1X19fID0gbmV3IFVSTChcImRhdGE6Zm9udC93b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBQ1pvQUJJQUFBQUFTRkFBQUNZREFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR2pnYklCeUJEQVpnUDFOVVFWUmFBSUVDQ0lGOENaOFVFUkFLMXhqSkV3dUNFQUFCTmdJa0E0UWNCQ0FGaEdBSElBeUZIeHNIUHpYSzdSUEY3UUNVUlYyaEVmei8zdzQ0R1NKUVU2dmJmc054RXNKcDFBRWpJUUpFMkN5Y1REcGlNWEZUdUlZVEhuVzZHdXR3S2hpMnR4NWU2eWJpVUlQVlY0MnVzZTRyL1piTmZXdWJaWWMxYlZlZDNoTkJIVnJkUHRxL2dERmw0bm11am4zOHQxcXRlU2ZNRWRXcGR4d2h5U3c4b1g5OGZ5YVpTZTVDVUNXNGdsaXEyc3EvK2kxVVBXU0E1dGFCbTh5Qk1HRXdWMlFmd29BUnZaRmpEWU54eERMSVVXa1VLUWdpL1lwUmlCMjhIZnlELzQwVmdJK1ppWUNJV0svOTk1UzZacDRacGd6TnBZZWM4Q09rbUhTa1BzcFV5WUgwSldOSXVPV0hsdDVsTHQyVlphQVF1YUNNS2hXQU5IRUllNWVaSm56bkFvRUxwT0t6bjZldUJPKzMvZExXMjR3SjV6dmFLaGxhMWFGMkhSUE9vbUdwdmx2ekRkSmlPU1lJNGE0dlM1NE85Y01qdjlUWml3eVMzdHBKcmlxdmFwa01uOGpleG1tZCtkTVRjaDJBaC81VXF0Wit4bm9aWTFFdllLVlN2c2REMVBPY1Y3Z3NnVS8rSnNRZkpMQXdDb0wyN2xhVHRuNGMxMjhYWldUbTRRTk1oeGRLSGI0UVZUOXYwN0w5b3kvdHppN3JJSUQyb1JJdVN1QTJSWnVpU3FmLy9ueDltcEgrak1hM0F3dXlGTEtPUnBJRDBwTGxrT3p3SVJWVlNpQlo5cEo4N0xzUVZnRFlVWldtVEoraXFKSXE1VzFMdFJyZ2xVV0VGcXBmdlM1aldnZlNkVk9QSXFRUUVTRWdqdmJYV0l6Z0tNcFoxdGJXOGxURENTUHFVaW1LRzJtVTRoNkI0dDN6aldCYVFTcGppMUh2dnFsc0FJRzZDdExQaHNNdUhvOGUrTm50WnhuMFNzQnpubDZrQUpMbml3cjA4SlRGK1VYcVlmdlR1eUdENHUwQjFDaG1yRDJ3Y29OaXNpdkFuc1hMQkVyQXZGRm9menlvcXgyQm9DeG1pRzRQZWl4RGdlbGhkeEk0V0N1OUFjQVpXYmp4M2dHdWpiTnl2Sm9wejlGdldEclZhRUNCR21VUkcvSjJCUGJuRzY4TDVPSmxIZTF2a3dCVUIrWk5aMVRwMGxKZlk0eFh6aTZTR2tISnlublNJaU9BL2pOTzNZZ1E2c0dTMkliZGtvb0lqMkRZSDl4TEFEek9QNzhLQUJzWjk2QkZMc0pZR3BjRlJZOHVLRnBZaStnd3BTdGZjN1ZWRDlTd29aU0FKVmJSNTJab2ptN1cvZitxK1kzenRybUY4OFJjTUpjQWtQUFBqM3V2SklBUnJiMEZtYndGQStVQmphazl4dVlTS0pONFAvME42bDk1UHQ4bUxmclNXdXYvQjRDcmpOTTFGTWVvbDd1Z1U4ZDJOckhUZWFSWFViR1dyU2pZU0MvbGpMQkJ5RFQreUNHLzgzK2FLSk5FSWN1eDNjODRoMUNJdnJDWkhyYVg0cDNzcjZkajdFWThXRTQ5S3BWbFcwSU1iTVQ5eW9mWnhUNGFXRSsza05GUlN3dWI2R1dVS3BwWlI2ZHE4NzM4VHhuVnJLWmRFakZReTMvYk90aktMK0c4THpja3BWTUk5dnRmQUZWeVQvZVdycGJtcHNhRytycmFtdXFxeW9weVExbHBTWEZSb1Y2bjFhaFZTb1ZjSnBXSVJVSkJRWDVlTHBURHo4N2laV1p3T1d3V2c1NU9TMHROU1U1S3BGTGMyUXpWQ1g5VFdRdURsTyt2VDJ4dUY3VWdQTTNKemViRnhrbmhmam1ZY0FRMUVUdWFTdjNBV09zTld5aFFVWGZmSEZlYUdRaGZra1U1Z09OcXZkR01SNU5HcU5abFJweVJ1WkxEYWxjZ1RCR0JwRnVNZnJjdFBlRUJMbFliTk5zMnRDWVRZRkwxaVFTVzhGdktKTHh5Ymp2OVpRWVR6ak9xamkzTHV0S1hQSWk2NStIK3RTMWFxMlE5a0pSeUExVEhxN09ubkpIMU5RSzJ2UEg5VWd1SVFIdlJMTU51L2tIMXVBSllSZ1JIOEdJczJtMXdtWTI2T0JXZVhESGF6UzE1bjR0emhLYjgrcFowMm9sQVQrTDRlaXFwOG5XcGtkd0FocjB1eTY4RVNScnUrYlFtVTNZUnd5cEhRRUNUWTdQRlNEa3l6WGtOYjdKYXdibW1QVlMwc295Z3d4N2F0eEh5eEcwWU1DZEp3aUo1V2xWV0ZzMTcrYnl3enZKeURUMzdRQkRNeFdrRkNRbzA3YzRKV3gxVHg5VXBFcE1rWVovOGxjZitRUUFmNFd1RU1kb294OVBHTDh4cmxickppTjcwMWNwQmgzUDZ2cFBBVW9kaTVzTkp3TWgwSkVkUE4vSmJCREVtRWttcWU2MlAwMm5YaVl3N250L2xNUUlSSnNKbThJYXZJMHNTTmFGbVlqTWZqUFdmeGorNEE2cXNRY0xyL0ZTZldscjBTcDBhR3U2UE5KMDBOVWRuMnVKVU9TS0QwN2tITXk3aTZocjF3UktESlhkRGRKNUJ4YWNjV05GeWwxaFVTMlRXcHFxci9kV2hJamZROXY2Q0xaR1FpdkpJY2FTR3hJbE13TmYzRVBKN2dBdU9Ga2R6RG5JUEF0dkkveTdYWEZQcmxXYThJSUlheTlac2ZBVExvRGlDOG5zbVVlaXgxcmZLelcycUU0eTdCNTMyYUpMVUV6ZmVFd2ZoREtudXBmWWhHWmZ4K0RZUHJHR3JKdmZrdlErOHBhakpHSldYSVduWG5ycVZiSjZ6anlPdG9DYWdnZ0FsbmdWTlk1dWRONkxSQ1I3TVRPYWIzTkVLTGFPaHBUYzZzeVMrOGFEVExqOVJNWEo0bDJKQ2tiVWZpK1htYTNGbVVBMjg2SUZWdXF4dTFTMlhtL1FRRDNnNExKVXhMdWd3MTZza2RFVnN4MWpwVkN5dC9Od0pZSEwvZURlTlh4SmJCRXNNY2xnYkRpb0xTSmdjdDZIbXROaCtSblc3c3dGVVhLWWlrRFRBU1JibkRDNTRaem9wSXErU3NnYSt4cCtvRTZ1SGV0S2VKSGtXTnlubDFDQXhyT0ZwU1JiR2VsRFpEVnA1WlNZNjkzaExYSEt1NmRiYWpXV3hJR0phR2VTVEZQeW5EQzZhTXRaSXkwNW9FMmNaYkwvdU9LNWszRWowY2RUU0hRSE1yS1Y1dUdWWmlOWnNWZEJwVHk4VUNNWndyaUdnSklCRWE2NE56aml5dTlSSHNDVWNPZmlHeThBVngzRU50dXhYTUFBTUVuZVZKRUI5cTZuWitnRHBRQ2trc0prSlZEODk4a3g1aGJBUUhHeXhvMDJhN2Rmais3QlFGV0d6M0xWNzJWSkZYY3E1aVVhRlpLZ0JNLzQ2T0RmWXZxQTR0SDJTeEVXWEZvNEtqY1BDeSs2bW5aNThld0ljRTB5YWFwY2pXMXgxWXRKK0pRUkppUEJZczJ1YXNRQ1dtUm1FT2xLQk5TZ3RBaWx6ajc2cGdRdlBhQkROTzhxM2NyWVNOZzdaNE5wcDR3ajV5RE9YSE15MVh6RlQ3clFxMktDQzBUdTJ5SEt2VGdRYUdOSWpRTTcyd3RXRWl2V2JjMStFaVVBRkpDcHlOMk55Y1phK29BU0JXWmxnSE5vYkVDenBFRnFQTUhGNGVmOWVTZ0RBMjdsUUQ2WXkxSzhEcnQzUUFlSk1iWVdkQVU1aW1vdXpCTklqdXdEZ2tDVityRTYyL3RCSmRNWmRXWHRIZHZLWWFIbWt0Sng4MWRHM0o5YXlQWnFZRmxrY0NTV25XWXp1RDNMZDRTNUJsQk9vN09laUg3WVlnRFl3d0FmTFQ0MkNHV3dHaExhWEEvd3JBZlQ0bFRQeXV4TkIxMkRicHBTcFRrYzY0ODh3ck83WW5XTUI3RXR1UkNBcHltK2d4T3JXRnRWVGxzUEpvWm01YzFEaWRtNjFsTUNRQzNWN2JWWmRRcFVIcWVrQkVrcWRhQWNOSk9Edi81ajFUYUM5UVpHbnc3YnlHZDJWYm9RODl1b2V6RlE2QlAzc0h2QWdoeU53V051QjZpMHVTUXRuVm1vY3lSMi84eHdDY1JYdUNNRlNpdG9QSEdCeUROclQwSE13bHdsNVlmNThjVElncTRyK2U0NlR1ZVVpUnlkZ3VLUzUrQmsrdFhLU0FSdytvTTNNR0FwVUtYRHBtK3AyWllpcUxtTXJ5anU1V2xkR3V6OGZCdm5RWHNhb3hrN2hqbDlqWkZDYWhMVFpYQTRsaDJjUVNLcGdpV3UwQ25sS1Z6ZDZJTGpIbFRrYmtjT3F3OGNBaUN2M0FWVHhSZVp0d296MmZEcncwSFhhcXIwWXNPb3hyVDU5WU1XdXhUTDBzbVhSRGxLRTZkY3g4SWhTL2t6b3VneGJmUDMvb213eWhpbHcrcTREMXVWd0M5NytwNExkdVlKUmtPaFU0Y3p5VFhFdVg0R3crSC9qcElXSlNkdFZKb1hnbGRiNjNHWDNCYS82V21UNTlIZEJlbkZHcnlKb1d2SmdPYWhpVnFFU09laG1GNnV1bUNwZWM3NmRFYTBXaktaZkpXOHdhNFFyS2c4Vmg3NHA4dmo3all3UXFCQno4S29ITHVmaUw4SytCVTBnZXQyT3VUSlc3VVRLc3FjSldNR0xORE9JWnQzVlRIQWttQ2prRldvTmh5Z0dUaEU5TWdPVjM1bUpFMDJlYVB3YnJSdjhlYU9aSXB4QklNOXdoajlZU2pveUxQSkhhM2N3R0hzbWNRTjRkWXlkOTZyWm9QaDNWZUd1U0dDRUVHMkRMMDQrSXEvYW9aVXJ1UWRGZjRVYXJPUmkxNVJiLzl1Zm9OdFVVZFdYY24vNXAySHVCVGduMFRQNVMyRFQybWVBajRoWUxJUk9uZGRadGh4U3F6NVlXS0JHZFNtb2ZNbTFUeThRTFBBZ2dCamNvc0JEYThjcjJJOTEwUDhDd1BzUEVPZUlIdGw0d1haV3Z2Z0FsVWRoQnlIT01hb3dybU5NNFo5Qk9WMkhBeGlVVEkvUWtjQUtPT1hEclVyRGZWU3hiNHFLOEhJNFhNRzlmV0RFbHc4UkdtNDFTaUFNNVhkQWxFM2FtNm04MXNrMyt4TzF2ZWlYV25CZHpPcXZvVE12cHJaUHBsZVozN2NIdGF2ZGRKdGl2UzMxeTl6c1pqcXJ4dFcrNnVEdE15U1paYVQxTHRQbndxaWVwRUw3Zlc2WlczNnJsSTYvMVZJZWtxS2RkUG9pWTBrKzNPYmJsNUlGTUZXbmxpNUxSUytHOEM4d25XMlVZNXVJRVZKc2JFellENHo3TWpxaldMbEYzTWFIUVhtU0dENVg3NmlkdHg2VjFuMC9kT2JiNE9wd1YzUkZBaXBsQklrQmswa0Q4a3pWWXF1c3ZvWGdhendYelMzZGp0cGRRaUpqVlowakJQM014Smc3dzAyS0gyTTd5b2Y0NTdSZlYwT1RYM2hLL3pXMkxvUWNDNk43QjV0dW5IQUlvQW1zSmJYUUwzVHNodjBmaFpyd1FFTmpPeEZEUi9RbDJXQ2hweFFZUllheW9MeWtqQjhoSzhMZWw2T2k1TjZGcUp0elgvR3BPOFBuWC9CdXlOeXJmajNqRWlqU0IwR3FCc1B6WWJJRXVHK1VDQksxRnVSUnF4bmFCcUZPQlRIczh1RGZCMitFeGJaSXUvTFZBQTFMY1VOaTQza21HRXlXSHZqQVM1TkVBK2lCd1dObzBuUnMxVjBDRWJDZjlVLzJnTFI1cnR6RTB4WXdLUWlqelJGY0VNYjdWM0ZiME9JeVpUbVdGbUJwOWR3aTRtODR0azVuUnRYTXlsc0graTFiMHp6bUZhZmo5OFhkMXVnNytTWGRVV05CQWozMSt4OFpnbG9JZy83SE9BTHJwSmVza2hnbmVwNnFZSk9ZeGFnZHdrUU9RWTV6ZTdYbVVnM3ptcFptTWptajFudHhxTitKczBISjVtQ0tmWlNpQVFpYXFPV0FwR1ZadnA0TC8xVTZOWEhIZW05WXYvT3VHVzkzL3BsaE1XekorTUZXQ21rWnoyUW9RQTYrUlFBRDBod0VqWllISnBpM0FBMm1PTFhrdWFzUzVRZU5NVEpubjQyOWdlNG9QdHBQL1A3T2oySVl3NVpPRjVRSFpFcktUcUl3Q0RKd3M0SUp3d0tLbVA2blZWYXhscHhYTDZVOUFUSkpyYmxYbjlHKzFnTGoxTUo5MDJrNndkTmRRY3JNaytKeC9wODIwZjhZVTZzcFA0Y00rQXZhNHRBNkcramVCRnN4STdDNEVnZGtHdExuQStJNmhBaTZZTU92VTE2K3JqczFoQURONzBxTHFnK2dBbWllTkJYaUZZUDhxZmVjaHVwSkVwbk9KZGh1YUFYVUdhWi9uVFRaZEp3VjNWNW1LUDlYWHZCYlNQT0NWYjZteWEvMzY1OVBORi84K1ZKdERzdk5tUXZPV2ozdzlsd0NYL2pmV3BhTHdlTEVwaXZxcWxTV1VnZFhMREVBQWlFc2h6V0FFOExCcGhOdklzN3l3bnRsTFdnZWx1L2Z6a2E0WFRvellhbW9nNnFBTWhkamFCSHF3bW9PK3RHV3pCUWlEQk5OZDB2dlhtY1ZWNHZnUFhXMVc3WENVcnRrUlJyTmg5ckxVa2ZCK3dpdk44b3BWZ3UzKzRjbzZQRWM3L09mYXlQdVp3M2RzUlJTUktGbk5WTW90ak43aEg3cjJneTZUbUtXcW11SzhDdVRDTEpLSnNMQ2xGd0NxTTZ0QmxHNVlWd2VhQTZ1b1B4Y085NEtyOVFja2tydnpXcUk4SnlBVGRVd3Q4TVF6bEs2cnRlN2Fra3QyQmNETnFVeHRGdWFLVklIcW10Q3I4dDRxMXVkZGtQcG5OZDkzejYySk1telBRdUpwZkhmRGlLWE5aNlFvUnRvdHE0aFJUb0hoVFlRS3VORXdHYlROYW1XVU1veUtMKytndXRhdmUwS3RidVcrNnU2TWhWN0lUTDNIcHRma0ZzUDdrNGhvM0M3U1VPVHJPK3Q2NXdScEtENERJbWR6MGh5SDNyeEdRbC93NjFsZ2lXZUhmN2NtMm5RaklpUVU3b3VwNytYWFowL2JKRTNnbVhaMXAvL1RXbjJDU2NyN0VVbmpYSmxyRlo3dWIyNnU5dXh6RTRobHJMd3BrMlRWNXk5aG0reUFwc0VIS29aTXRHOE9KR3l0ckNwN3RSYjRaaVRsYUJ3b2tYQ1pySExFNXVHdzZxdXIxY3Bza2wrREsyUHdDNkFmWTIzT3A1ZjUzZWtzRGYxNmFDK2xuZlFUZW9NeTNNNzRWajhtK1B4ZGZUcE1aN1ZubXMvNzhkVVQwa0NQOEVQaHV0b0tNbzRHWGhNSmkraVkrWVc1d3hvTERjUG1KWnhwU1FnVHBJaTRpS0NzRWNWWlB3Sk5iUGRFNTVsOW5WTUczOU9OUE5veTNFSGRRb0FQckV0QUIvL3N1ak5iYW1aVTFsWVJZR1YyVWc4Tm1pSE5RQi9mTmw2QkZwcTh4ODBCc0FmMTVoSWdCMktRK1dYWVk0WkNKRCt4VTRXZXZ3S1hQN2dFRnd1SHpiTGV2ejNEbnJRc2JuL0E0NTFNR0wzei9Ta1BoOHVxVytFTWNuUGU5N3NNcm0wZGFURWVSUW85OE9UK0NYdkgrU0Y3cTF2ZVVJYmFFS0U5a1RLKzRVTkI4VVpOVDRKK1duS1Vpa21SdGRWWDNYbXJXUjM2bWFyUnRlVDloS2ZWMG5xVkw2YlI0SlBjRkphYlJ6ZDFhMDBYaUdJM3loc0tEMzJzcUJiZnpOUUN3cmVDdDIzZTdQSURHZVBXTy9BY0VwNVRMYVhKckJmejlsSytKYzBzY0dZN2phVTR1UUJCYVBjV2U2cE0rOHVYZUNTbHdjV29YMjRqOE0xTzd4Z2F6S2tuL0FmNUJLNk1qT0hNV1Z0NlRwU1BEMTM0ZXBmRDhoYkVEOEVLWFZPT1lLK0ZGNmY0ZUMzSGQ4UTV3d2NuODFnTW5wOTBoeUZOeko5bndkaDFNVkwycjErQnAzQ0lNY1dOQmNxbkVSV1kzK1ZHUll1MzFoci9Oa3dYSzhVN2ZEK24vY1BsVkRoSEVtWEphL3ExR21DVzJXVTFOejJnQVFmZUlKWHR5dks5WDVoNzZzU3cvUnd4eDFZN2VhMk9zVUJyeHl2ZjVudUV5NTFPNHdyMmhiT1hXeUUvVmUvL1RHdlNJY3c3QWJpZkdYOENDd1JEVUVnMUgwNFBqK1N5OG1QamsvSWkrWnc4eUpSQ2Y4RWFzeVQzaVpGSXp3aU9mR2ljZkNST0czSEhnSE1UWkVhVGJENlA5UXFxUjVjbi94b1k4ZlZsT3FTaXltYk8yaVAxaDl2TVByUXRIUGIrNmExUnY3MDQycS9UbEVLa3lGTThlMVVhM3piUkVsTWczSVU1VDlUZU9wUEY4SnBsZkc1aG1wR29Uc2orajZxMUlUbGZnRUVKUG1yNTJiejU1eVVNdThWSCtnNU1aNE5Sa0lIcFh0blhocUh3a3Z6N2xLTmlFWmR5T2RTOWZLK2UvVCs0akVpMjNFK3kvMTJZRG92TmRDTDhLOG9ST2tqOVdybVJaZm45cjd0dXk0OTZTSHd5WDdHZEdyelNZMkxjM0xCZXdnRDh0MGcxM1hzbEVwY0kxbmltUFZZOEZTUXBYQ3NKR2YvWGYxUGRSWUJvdDB0MnZaaVdZelRVZzQ2WitGbUVaWFk4WjluNFpxdEI5TVVnU25JMGZmeFg1eWlzNE1pc3F4dGNDdUtxNmowS0hJb0s0b2F4NG9KSmROajJtS05ZbmdvRzdGUitNK1B1UWZKd1hvcWg2SElsTkRsVTNnNFY4clIzTEFrMnFBSHc2NkVXYktRWGI2V29mblVVZ2VLNFNDN1lHSlRIMGd2eXpEdytUS08xM0RwSFhCMzM1VytRYWVFaEVsQXZBaVYrV3EwbW40eWdpWndFNmlvUzFNVC84UHhQVlh2TitaRW5la1kvQ1k2dG1RYU0zMXl5WGR4MjFERW1XeEYvSm51cmkrOGc3Q0pzVVo0WDNwY1BadWZ2S1kvdlFKdUk1VlZ3cmVsVHcyZmJaWUQvNk1kekNpM0xRT2xsbmVCdXdzWUY4ZFc1eGhLRFk5SnlhVVBCVTFvakxPTUoxSDhOeDl2bmFpN2ZlT0pBekp3NUJwcm5hK1VIOUVFNXhvV0srQ1pJV3VFdVp2OG9ZTExia1hPTUtuYk5jZnFENkhIdStqVFk3bFdKNjVacWc0MlBDTXAvTlEvc2x4SFFyRm13MVlleWFiZkZydkpkdTd4SHJWb1hSMXgwdVd6dTVQbHRreXc4TUkzWGVuVnVpYzJjMzViSnB3UUtkYTdNUk1yOTJKN2IyQnJNZzkyNTBRY3NJU3FXN08wTkFxamdaaWRhSGQwaDBJdmhoMWtTbCtVZ3ZhTEMxWWJwbTdKS1RGbzBuZ1NWWGZyemEwVDJDQmpYZ0tGcm94dkVoR0paTjBHZG85N2plOTEyWjdBVFFSWk8rL3ZBOFJnK1UyRXJyci9CTmpQaFJVdVNEY01abWxwTkVZYlVaeU9aVmxQVGx6WTdUWGVNZTYxV3hlaWt5MWtPeVZ4Vmw1TDF0YklvNmlzMVJ6bEsvZWQvK0l3bk1tWHYwOUZQYjV3MGVIaVZ4VDl6Nmw1SnZYUG1WbUhXZmk5VFhWTUhzbHJ2M05vd0dicGxWS1BEcmZWcnJ1NFFuMTlESENmNGdKYjZQY2N0cUdjMzZ1UnlCWnlINjE1WDdIM3JIY3FPenlsS2JOUmZ5bWFFOVI4TTlsL25EcmxXajM2VjA3bGtKMXAwMlBNK1VEaktpM3p2S3BMUFZ0ekN3SDQ0OUtuUTVZMGhBckxLb3BvT0R1dkdJZmtBa3d2TVRPN256L1dpNllYQnFKUFlWbTNnYUNIWXRPY1NpK0kwL1pURnFrMGZ5QVZHZnBSOWxxelp5Y0piR1Q0M2pWWDc4bDNrNnJNb1lLV0RZd2lWR0E4eXdkTXM3QWJ3U1dpeWhvSXNZUjRnMmtaamtKTVByVWd3dVJyUHc5NGpRZW05enR6RnNQWUQ1QTZ0VjRQZkZRM1p5OGY1UWZCNVBueVl1NHVaNW56SmhLeFdndWNiNEdiNHNzVElXTXpDTE1lNWVpalZhKzFqL3NzWGpPaE1SNEJLMjZhNkdxdTFqMXhtQ01YTFVnM0RtUXBGTkVmVlIyZ2NBcW1xOG9kWlRzWHlsdGdyTmsySjdyWEVBVnhwTmlXSlVSR2piZDROL1A5eTRkeDdMaFdjRFk0MnpYL205enZIV250NEx4dzc3a3N6S0hwTG5ybzhZL1ZWeDJsYnJBaTU4dHVCZEJtWHlFL1pPMFNmdmxpbVRGblZXTk9UcTBmdHE3dHhVNGFldnVWVC9KZmZrVVBkRHBiWEZ4NVIvM2liSzBQOTVpYXQxNThhWGRzSFNPQ1B0T1Q4THkxUkZmY1ZoTDN2R2NyWlRhWEZCYTJsM2hiY1JqMjUvaG5icS9mVVpLYk5sQTY1ZkJ3NmZPd243QnY2YUZyWGNqMHVQd2FUV01yTVh2YkZ3TnYyYzFIemdyTGx5dExMUnlSUVlibEZlYUY1bTlFRmkxeDFIYVR0UmJGR2JTNlFFN3pCWlg4OGREcHRZdWZhb1lxci9BMjdrc0JXbGRNWGdpcFh0T2MyYWVJMFVhbTBmOUpYOWtSWEpxWDRFMzlFSnFsclZhdFFCUXUzOUFveWhOMFBlSHVSMFBvaGx1azBwcVZpYkZpc3VnYTRoWlhFNFZmSHNnQTZZOWVUT1FMZ3UzSThkRHNQUU1JbVNmZWgycEd0SmF0YjFzdHRWQ1NWdWdRR2I5OGJHWm0xcUxDL3czMS9xcjhJYnlLRGZWaXppZFFkcEtDQ2NFN1NaVHpDYjJZc0EyMmRnUzdEYmIyVGtXRmhqdVJkZlVTa2FGRWlFVlNVUHJRT0JFcnA3anZmZTdwckg2TEJsdjRmTHpkOWFCQ1ZqT0dGdUx2RTA5ZVQxQ1czTk4yajRKeEpGbFFlZm9wWjZZRDczNmU4MisrZG9RaTZMZ2pUR3dpTTJIWjJzZWhOSkRiNldDVHhtWEZSSHNuY3pXRVFRYmZoK2pITWRNSldWZEp3U0FFMm1IWGdBWXMrbE1vai9lNFNWQkFZbHY0ZmN6RTRZZ1JQbHIzS3c2ZytXT2FkUUVhZ29ndURIZ3ZQR2FwRllzOWF6WE1SWmpFd252NFJBSzAzL29UN2hPZWlJYjJqdThGSWZERytBMFF3aVkxUWxDQW9kTUFRcWk0ZXdhMUFUUm9aczJ0SW16USs4OVpMT3RZODM1YlgrTUhST2NWMUF4KzV1d0swNjcxNzNzSDZqNGkyMzQxMjkrWmFWcWJuYkNSbHgyN3NaYVhiWXJyN2NzeXJlYkZic3h1N3A1dzRjYTBXclllaEVERGFVTkF6VEFXZHhIcVNhSWtSbWQydWFYYS9RNUM0TWxFbDhtbzRuMjNEaDRlSU9yUkVDUkZBVXRCcWFFUkdBTXlkUStyMW56NzN1OHMwVU1JN1grMCt4VlYyYVpSQ3JZL3p0aHZiUkRPa2dvYWJpUHU4M1RScVRIaVVPd0FCTzV2My9XU3FqRHRlWlN4Yjl2ZERaQ3NKRlN5SnVEQXM2TUo0Vy92Y1laVjZJbEFlOEgyQlZoOEIvRmc1U2NOTTJnbEg3V2pPditmNUREaWswa1Jyd3JYd3JQR3BzYVdWc2pMUllrTkxtV2MyOUdFWXdHSzlyOUVxejgvdTFZRmYxdURsZGVEeDZ1WC9OMDh0UGFKWk0xOXErRnJOMEFJM0hzRDNicjZxbkgyOVZ2K2JHb3llbnBNN2RuSlQwbEp6azZSSFdxTlp4cy9TUk5KOEcvcWtKenNmYXhGd0k2b3kvNWwvdUJWQkFRTzdMaWFUMUhUTXNkeGQ1aHBOS0xacWp2Lytvbk5zVy8veW5RTVNJd1hIVlRucUxoMzRBOEFmRlQvSjlaYVROM1JML0JBcnJmYS9hTms5ZnkxVjJ0Ly9wRHY0RSs2TWh3ekhxY1ExamhGSmVTVFFwWExtS05Ub3dndVNRc0Z4eGYwZXpNZC82WTZiM1hDbWlYTVFQczNqajJreXRvMHlyenQ5ekoyWHpMOFB3UC9DZVRZaGpwRUUwc1JuUnFUSDJybnBINkRuNXg3OFBjZXFJZGY1WVJFdXJYTWxYV2cxYTJXMXRTSC81STJmU1V4NVJnSkZmNXBrODJpQVlRSUlHcGZYRHZaYmdSbEdZTmNiOUlaV1lYVWY1c1M3V1l3NWxSa3Q4bVcwT0lySjJ0T1JxOG82T1p3aHd2M0hEblpuOWZOemh3bzJuUHNUTTh3TlVvb0ZFWVZVSk9pQzRUQ2FLRnJIQ2tLS2NzZnZNWGJmL2dhbHpPQVVLMUFhSE1UNVptYWRLVE1Fb2xFSW1mTm80eWo3R3haTFhSZm5qK1Bac3VxOG1qbk1IZEphb1R3Z1pEVHJKUEpLaE14RnU4TTBmZDk0VHNQRDVrTjhXOE4vOEFYaHpzZ0JKcFJ4SGIyK2ZuNW9vd1RjYk9ycXozRmIwMjRJRWhMSHQ3QU85VXdzUDdSWitYMnZuZUt0ZmQ2bXdvT2JsTnpiWkd5dmtteTlJejhxb2ZjM0JEejlnSXhpOUtwQm9hK3BFR3VMbThzVG85UWlOS3d4cTdBUUNJVjBuZkpWREdoV0ZGYTl5K2xFRUVyb0xvT3ZKNC9DOUJSNXdWYjZXa01ISDMrQmpSWXRKTndaYTIyYmhCNGw5amhEQnN1b0t0d1hCQjdYQmhYeFVWd01WMENOOCtwMDhkeGFWd0dGOWZsbVM1blk2MW9CaXI4cGZMb01XZzNqc3Zxa21DdktXSTkxZUJTdUpLWFlhdTdsWG9sNnM0TkRzUFNvaHdreEEzaXUyUnZma1hJOXJBWkpNaG9UWkdwYllacThtQ09aUWZnaG5ldk5iMVBBZFRGeWZLazBkRUFsUDVWakUycHg4Z2ZOcG5td1YzUE5aTTBuOGxBNzl2MFBFSjNHQzF1QWNCMHU1M0VrZi9sUUM2TXpqdGpQL1BBd3ZDbDJXRnpuN2MwL1d0LzJBMnZpNTE3WFYraWQyd0tqeDI2V3ZEMUhhRUpBVHRzTE9JMk5VeUwyWE5vZ1JZeWtOWUtVU3pYM2NoSDZ3UUEyK0ZmV0VEL0JvVkFncDZRMUg1bmdMWDg4K0FBdDNhZnZSMUFmZ3ZvOUJ1QU94Umc2VGVBMmdjRzRxb0VPMXYvYzNEREVCWG5ucmphTStCN1YydnZZWDFIMzBmYmFFVklFWjJUT3VqNkx2NjZIZUt2dS92Ulo5Mnk2UlE4ay9BSlFDTy9UNjA4a3V1WU42QmpsMVAyazdVTmplUWNJcUtyb0djcmdrR0pFc1VpcncyamVZR2dnQkNkWmovYldRN2d0dDlzOUtVZWtMVWJlaFdFTFFTZ0t1LzJyTDlHU1cwOTlwZGVsUlpjakFzQjdGZkhodkhYckxiSE1IV1ZHV1VpNHFzQTRUamdNQmJsWUtQRlhQRTdXVFA4OHhJRWJoL2JqL2kzTWliK3ZkTXZXUWFLZG1KZWdXUVhkSWsrTXBEbDJHdnlSMHFLTW5jbUlJUGgxVGRaUGR6d25NUklITm5PN3JNaDkxWmp5c0cvdzl2SGVwdjM1Q1hGTkhrS1Rvbk9kZjFZOCtKRjNqVFlFSTg3ZkZKZFhHZnU2NkVrL05adzExeWVhSFkzRnNBa3FCWnpHdVRKalpDLzBjbHphaG5xNk4wQXN6NzIyUjhGem5BN1RQTTJvVlpxMWx6TjU1QzVmUURQWmorZVJhRXZsUGU4b29oT1VnL1IrU3lvQjBDd2FXRU53N1dxc1crVXZkdGFOditqZjRBRWJoYWVWd2RDOGo4Lys0dkgwRFRna3VlRlNCeHlLREtRNEZSQittU2pEUlRnVEZGMUIwL3NkcGMxQ0xoUHRsZTRiamhNaE4rbEJKNEJDWDRERFhFaGNxSm5Da0pQOGhCTzROTUJla01kbGE3SkVjMXN0NXhnVkVZSUtwK0lzbWU5QktOYUYzTUNUKzc3Z0IwbW5pdkErM1U1V0VuQjRwZlhwRk5Ka2loY1B2b2g0MVkvUFFNWmp5b1NlaStMY0JIZjZiS3BaUGR2OUV6M1NkdnF6dzU3cG1QVXFZQVA0Skt1R1FHVEMxZUFRT0RnOEZNTG8vNGtMU1lqem5HUk5FWk5EMUJaMGFDL3NqTGZlZzcwR2JscVZxc3pZS3d0bm1GS3JnNitEM0VpRzduRmRZd1JNb2tmUStrOWd5NEowUVZ6b0I1c0E5c3hWL29ETS9ITkdhOEg0VlJ1WkE5TVVFSDAwZ0NXTkRsTmdJbHFsL3oyeTJ6R3p4dmRITWNUY3BvMWtqZUxYemwyV3kyek40MTN5U2FVT0RyZlllT2dNRHFxeElNNFMzRnpQcGN4cGJMa24zTWRiS3R5Q2hjNnpmS3BmKzhtY0tJbE5HL0xoVS9DdkZyeHloaURwWVdrWVBjL211bkV3bEZ3L284R2w3WmE5Q1h3RExScEUxOG5McjZJTThwMlpPS01TVC9XcXhXNEJPMm5yWXF6aGg0eU44RmV1NmZhbVg0OXFWcFpOaHBTQ3FyZkJrbkdTZzdtWHN0THFDNjNNYU81bjRVU2tibGRsd21xeHFGV0xXcTJZY3JFbnVpQWY1d1FvNGhqMjh2UG5pL0tFdTdjbHpLL21PSnFIQXFBR01HT2NjWmtGbGMzMU9IZllhU3R4LzdFWE1ld3ZPVldOL2FHbE1SbGpHaW5kNk1tY1J0eXBuOXh5OTh5RTRiU090MXUxTWFRdkM0TDZxOWNBQ2d0bnBROS9iV3RWb2cxZHc3YTVmamtjdWJQakxzUjErMDJKNlJ3Mko4K21SNE9LVzZDc2ZENVc4N3BWdmpRUlQyZEZyUFpZZVA2YndNOFYzY2ozZFVsU3dsc3NkdWt1WlVsZU9DaGRwZzl1MmtvRzY5Z1dPMHI4eVpwWHhQQ1R3UUYzUC82MHJheEIrYVZMc09ZczR2dVZka0xzamlodU1vOHRmSkY3eTBIRUR4b3d2ZEJqUmcybXJSSlY0dDluUmVXUU1wVlQxb0RYUHJiRGQyU2x2enYzOUhHKy94ZkJ3ZUcyOGVoZFdBa2V4Q3ZtSUxpd2oya1dyTVlwaWV0TVZhaWdTaFR1SktiK0lNUTJrRExCSmd6TDBHb0hOVmVIVE11L1BYclpGN1FybUhvcFAvbDlxT1JCS2VvSFdZY2tDMmEvbVBWSnA2ZUg4WDEzYmtXNGY4alRMT241dGRQNTcvSVcvaTUwcFh4bzIvaDNySytyQUFqQXM2TWxKMS9Odk1MWEU2aFFOQU10NzZjblhxRGM5WUVZTk01YWxoS3RZS2p3WTZqYnV3eW42UnhuUzRnMzdhbFg0UktnWFFJRCtNQ3VOOWg2Z080U29TdngvRXBUa2Q3STFYcFIrd3dGQVArTzA0YUFLbjdBZlM3WU96R1dDd3dYYzlSKzB5dE1BM2ZaNnJEUTVmSUtmWEQvT3Y1RUs1YUJJcG5NQ2dOTTZHQnhxQmhvMHFnQTk0TVJKQ1lmbHpuenpRRENsM1FCUmlwNmVLeGVIYnhBSTY3TkdhSUNiQWhKSWpORDkxdzVoNnFiTURQL3RMRUhTOFhOVDZFWW1LMktXV216L0dqN3hsRGNNbmZHNXRHaDBqRnhEQVBvQ3VnMlFVR21LOGY1YXdIUUhpblV0V2tpb0tCSmtwZm9zS1BoV0VyWmI1dHpzeEhVUkZyZHB3dXNiMEE0Zk1PL1dzQlMzS0V5ZVEwZ0UrZ0ZFSXdDbXBBT1N1RCtxMFVKUkVQRUNzQkZFSUI3dHQwT1RQR1VjVnVrSVhTb3YxSXRZSXV3S1Zoenl3QzZLblFyUWlaVnMzV2Q5S0tEYm5BY1JUSGo2MEE3bld4QnBhQWtxTGNWdmhhWUx2d0pzQ2xRa2wyWCtySWVIMnBwem1YTDFVcTgvbFNvNkpZV3FIZ2ZVbFJXZ3ZsQlFRS3k1cExoWUt5WXlUNDhhVml0dkJ4ZktXRmhVdmF0YTMvaUVPREZnTjZaRWlRVW9ROUFmaDNZM3ZZamlXSzA5RktxWWFZUlQ3SXdpMm1vNzlEeW4wdHNJNWpLSlpTNm1rOVRMbWprazFxMVppTTM1QklrQUZKZnFFQVh3U2JVbW1KbEpxK29FU0VXSkhxckN6MFBZMXZyL0Q0L2p5Q2tiSHBvNVVJV1lVdi9wM1pNS2lrUzZyQzdQaXg2c1BlWlZ3Y0lya2RJdEd5a0Vic2ZieWJ1RHhpZWlRSkxhQlZheVBTdnBoU0tZRWdLY2xsMDZHUVNnWng2bVVHYWVGSjA4Q3hpdnlpU0hKQUpwUUtZSklHL3V0TGFMMis0aUtBTDBLbHg0YVBnVmNTa2s3eCtsUFJ1a3ZoZklOKzFtemRYS0pkZnRKTUplb0JRalVZNWVqWml0R1c5eVd5Vm9LMEhTTnA5WWpiQkVTZFpvVGRIUmxCbDA1QlU3UHpHNU5YbzhtdHF6WlVaM0pxRXJKQ2sxMW03S3d5d3lzbFpCYVV5U2phY1F2ZGNISzAyWmxoWlRXYm1aVXcwbHIwVktaTG01YVl0SGkwVXlPVEV1a2x5VkUwU2FHZEdCaXFUemJGTnduK0hTWHhYcnM0cnlTV0cySXcwV1RzS0RjVDZSNUVPR0RDYlNnSnMwN0kxdGhRNjAzdzlwOGhBZ2NsQTdZRldTcC9CdHlGcWNzRVh4RkhHeTVQUTVjaHJpUFF3ZGR2RGh6WXMyRm5hWXAwVmxyWTZvMmczUEM5enE2RktNdHVzSndhQ2V3cjhkdWJDOFIxMGdqYWFlSUZuZzJvTklBTmovQThiQ09aWTE4c09SMWdQRUJnTHVBVTVTa2U0MzNKbitLWVdVWU4rNWhEQXdUWlVuRUFDaDdpZWVPTmFBNTljYURGcUR1SDhSZCtNbVUzeW01eGJBVCs1Qjd3dFJFbEFmOTVadUJjanhpbW16MUppQjltdnIxL0R5dDdSdmhVa2w4dG1BbVBFVWtuSVp0YXpYdXZpNDFmQThyWEVpNXdnaE85d3RobzJWRUZvOTBLcE9aNlVjRmFvT1NINVMvOE9QekczbFVMQUE9PVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yNl9fXyA9IG5ldyBVUkwoXCJkYXRhOmZvbnQvd29mZjI7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R01nQUJBQUFBQUE1Y0FCSUFBQUFBR3NnQUFBMzRBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdqSWJnUzRjUEFaZ1AxTlVRVlJhQUR3SWdYd0pueFFSRUFxQ0xJSW5Dd29BQVRZQ0pBTVFCQ0FGaEdBSElBeUZIeHVCR1NNRHRVU3VaaVQ0eXdMYmVRMFdmSENEMjdvYkYxclA3bkxycWRjcEhNU2xFdnRtaERRUnpGNFI0VWRRK3BFa05SSkQ1MlNFRVpMTXd2T0VXL2IrWkRJUk9LRG1uQ2pWN1BaRVV4ZnVOaFZYS2tiRmpUMDNBMUc4VkNaQ0E2Qi80SVdBemdrdDhqNTZsU1FEbEEzT0tka2haRXNIek9kMmpHbUhwSDZoYitTVnZ0VDE5YWYyL09OMFR1b3FmVllKekxneEY2RW5yY0hRQWNEaTk2YWFwRnVsdlQxSUdieEpoN1JudHlLcXBxakZBYmdwZ0NqSjJjTXQ5Yngrazl2bEk1WE9yZWFIRnVlaHp2ZlhrNTAwTHRHT09JeTBkVm03TE5IWlNueFNuS2Zvb1Z3bXUyd1hFS1l1SXpCOG9JbW1QOEgyYlJOSjFDWWhBMzd4cmVyVkZkaTJYQTJzV1NpbGtFTTBYZFBYcll1Z1NBQlVkZVZ5aFdEeDNsQlZwZVJJdEFyK3gvaGNTWGZzbHEwNzlpUTllT2FrTWFTSFR4bzZtdlNJb1lNbWtSNHpjTW80MG1pQVlsR0FvQktjUTJMczZObE1aWTFDNHNCOERKZFp2VXh3RVFMaUNGZFNFVVV5czZLL3QyL0hrQkxsejJVY3plZUJkWE5jMXlDcVJQZXpYS3o2bWFaWlQzcTFlNWw3bVh0WjZiSWR3SXUxWHEvdXhRYTdSRDhIN0pCRHBTOFAxQWI0VkVMZXUwMlhMbTFrWDcxTzlkNTNWLzkzRE56LzFVcVF2YzZYdDdWdkI1S1UxSTEwcThyUys5UkhUUjh5WllRSVRCOCtZb3FBL0l2SFNHMmlSTVhyZzVLYURDSHc5WWhSOXdJV0NpVjFnTjdaQ2lJb2tYdHJMbUVtRmxTT1dIUEFGMzU0MjRjWDJ1Y3hsWW5adDFOVmJPanVaQ2sra2lmUC9YOUMvNTlURlMvN2dXTk8yS0o2SDdHUVRsSjZJbnV0ZFR6NTdaOWtMSGs3akdhTm5XWnh5T3BjeldJN0hKRDNQVXZNa0xZc01Zc2Q5ampoRmkvcEpkYlpibS9MSGxmb3gwZWM4c2poYUtGWGxHa0RRUHZXMjg3aW9KUE9XbVNWYmJtYWllUXNzM1p0ZnRoY2xscHBzK3I1WjN6UERPYXgzTWEwWlNZNS9tL2JaSWVqODdBMXkvYXBYTHhTN2JHT2h1MjNiOXU2WmRuU0pZc1hMVnlRbXo5djdwelpzMmJPbUQ1TmNEb2U5cnZ0WnIxYUx1WVVpV2JUeVhnMEhQUjczVTY3MVd6VWE5Vkt1VWpnWDU4ZjcyK3ZMNFc4RWZvZTJjWjZMWTJ4eGpWZnp6YnF0U1Q2elIrOVdROEh3eFNvZmd1NkdFSTRzTG8zdEhsRGFlMFVhNFJRNXVLaU1KVkhnOUMxS0drYlZGemRyemZpM3FDd2xNc2Q0OGxCWTZYQU5SMWdoS0lEcWxnV0syYnR1SEJYcTlORHJabDFXcjhyRXlEa2J4cnh6SHgrcXFMMFBEMHVmajdIcm5HTVFZWTEyMWtuRTExc3pjYisydWtVdjF0S0xZU0NxbFF5MFN2THo3a1NsaWtzek05ZHV6V2ZKd0t1TTZyZzQyOVZIK1ZoSlJFTWVkSzNNb1Bjc1ZMM0hsclc5eXJOc3libnF2SWhZUFVMc2E3WG9zSlZUTks3YmpGTjczb1V0dW9sU04vMXRMOEVXYmoyVnk3T2tUS0R1YUVUY0lxOWpnMU1PcVM5b1ZPYjQxUVZQbkZ6amlxbm5sOVdBcDFiZzN0UFVBaTFYa0RIT2NCVVFldXBGZE9GV3VHbHVHQ3UwMXZySGsrU1lCVUFFM0dFbm5XeHNYeXhkckYrc2JXd3ZhQ2lETkV2MXgzL0VpU2VKTC9HWlR1TkllY081MVR5VXQ1cFZwWEhhTGhsTDZoakwyTGZSV0ZIaDZFN2dnWWM4RmtsbTJjTCsyc0wyNklrRHNvcmNJVjZMWTloeC9EcFhkWWRDQXhCNW5tbnVCOGlJcG1IZEdSdDVucWwzYWxkNHcwOHk3NERXWjRwZG5IMFVDYmtzWmRkOTZRWUZCYXBXcTBiQjY2ODY0MmNlbmpDZFhCMnRET3cyQ201NmF0ekdab25kYUpNZVVNZUQ5N2N6YVdzS2JYWXltRDFreEJGRmIwVFJkOUp6NUt6S0dGbEMzNHl1MEl6dVVMME8wL09IUVBWR1pBSitiOXp6ams5ZlNtUFBDRkMyTGUzYXU0Q3JFVEtBWnBjcWFoeHBiVjdtdFpybEVkOG1VYTkxaHZFOUZQVGYyRVRrQUVrK1FZdFczbzNsR0crWGtNcjFtSnkrZm1OaHJNTWM5R0ZDNXc4Nk9YT2Qwc2NQclVWQjVvaUhVQkpvTXgzcGloc3Y4dTRzTko2NGltUGJFd3Y1SjdLb0toMFNxS1MrRG1OZWkwOUlUbGcrUzRscG5MaDJyY3M1MS9yVnVsazRua3ljR21ZWHgzeWx0RWMzb2tiN29iMVpWZVdTbnZPcHlDS1lSaTVxQmhhVFZPSG5zK0F1SC9zMlhwaW1VK3dHR1NXcEk2VlJlRVgzNWVRd3UyMDlJMXNpZ005bE0vOXFYRUtzSjNHS0lVeHpwamVLK0JsUXBMTytJZzd2aFBXZ2hiRk43bVhNaUFRNWh6a0FldHVTbmFpdElPNjFPWE1LMS9jcjBhOEdPT002M3N3UVk2c2htSlpXZVQ2NUIxNW44Sysxc295TzZaNU9Nbnc5aXY3ZGZIdjNvVWxHK1R3RFVQeldwb0w1OGcrMEROdVM2MXJjZTRvWUs1UDFld0NaUXZJSmM5U1NLOEdtNDl5Qk50aHZOUGxPemZCY0pqQmZOelFDSDN3ZWsxSVFxOUxWYzdhVlUwZ3BkakFlWlhDcFBOYmxaSUVRbDl2WUhOUEtrcjZVTXJ1MGMwU2FDOXZ2R0ZOR1RWcHpIVlFMalpEZHBoMnh4VDh3ZlBvKy9IaE5vNnhKdlpkZlVjaldNdDQ4NmN1cm05SW9HU3haNm9jRG5acW9vR2FIcFN3Q1d2SlFXR2hJMllRbWVtTzcwTm90UEl5bjZDT2VLUjNzdU1pVWhyUUJTTWRjSFFsYnpjbWdpc0QzVGg0NE9weGhzclBoWmwweXFyNDlsV3RYWTB0V05IRVFwQ0hpaU5DT0hia2UyUE5HU1o0TEdJaE1KcUhNTENZVUZYeFFjSTZ4ak16enFXaDNJQm82WWRRTXNmQ2NYTjR0eVdJcUVJbnBqcWw3RFNzZks2YzNEa2lTanZZSG9FS2lkT3I0b01FK25PeFFzUk1pNit1VG5IOXdWQVlVWnRhUnl0M2NrdFU3dWxVRHQ0Nk1pK3MxcXhYVmNqQ3VvSFF3OGpnR211dnlLMTE3eExjMlliU0ppZE54Tk1jUkFuUXROUE9uQ1FOR1JwQlNtbU9mMUZJYTN5d2hQcWFVY2txWkhKVFNtVGJXektZenhZL2ZXQ24reFlJcXBNS05nVTg1dDNiTWMwd3FOaGx0ZVFXQzR4ait0Z3FsOUN3TXVVQS81TzZRNmgwV1VsdzdUTXdZRkJDZHZnMTYzT1FYd3NLcm9wQjVXRWEydWtvMWtMV0ZrZHFlaGZhclMxRW9LNUdqdGUya2I5YlhCejc3bHlwTnU1N2VYb2ZQZy9oYU16V3AyalpIQU9JRk1oTnhOS01iVUZSYlB3YTNDeFExbEYvbitMOG5qbGdsRUxqeWxiRjR2OFhWcUlablBIQXR6QVRYbEFySFU1dXlLWkkvbGMyV1hCRmNZWTR3cDN2L3RVdzRDSGZoVkVUTzhVSGZvMDlDNldPSXM4YjJ5VzE3TkJ3eW1EeGlOYTV2Z25IMTNKMXNYdjFYU2NHTlV2eW04OEJuQzYveDBPWXZHUmVrcVlNM0FnOG0zcE44bXR0eENIWHRHcDdKbzUydEMwSGcrS3lXTllvMEN6ZVl5amcwanNSMW5zT216LzlmKzg1aFdhREhQc1VzTFN6bnNLOS80SGZOdDc0S0RvTUs0N1lOZTg5dGo4aFlmWi9LTXNrdGwyTFVyVVFvL3JuZXV0NDg4SkxQK0VHQzkxeU15SFJ5d0F0VWpaM1htVXRVSXR2LzJabkpSOUNHZnFDejVudzZUQzk0VnZ5QTBhRjVZelNrK1Rrb3lqaTc0MkVKV2phOEE2SERuSlhsVjhCeDQ0MmJJbXBzUmhsZTVXczJEN2tIcDltRkxWaTNVb21HRWR6aDM5YUpJL0hLbkpiQzlKaEJQVXZzM0JqME1hb2ZtaWQ4VFpqSnNsUEhwSlVrUHl0cGlSVm9jZmY2VGpGU05NWHRxNUJsdnA4M2NrZktYbitWMVhMalpYUUNBU2NzZEx1bmFacUI0cURlUUFZLzBQKzAvdXFQQWxZeHkvOXdNVlgxR1ZUbmxOR2VPb1p1WlI4Mkt5MHpmd2cwQ1RFSTVGRFdxN2tnaldYcFBJZzhrSTFzS1pEZmVOc2ZIYVNZaEZyMk1BMlZzdEtBblRSaUZ3RlhUL1pBSlppY1hZZHFjNlhxTUh1NXY0Z3MzTnZ2dnFobi8vNDliZGx3VHVmeEZaKzlOYU1sOWRlSS8zR0czNzRkbjZIVjErZExiZThjVk9iVTg2Y2EzdSsvdm9uZkFONXc1Zkk3YkZiTDhnOTErcG0wbnZIZTFRKzhZUTk2cFpiZE5tK2NZL3hpVTgyZFcxNjF3L2ZCM2R0NnRhODhPbjJqdThlbkxad01kMmgvYnZiUHovcFBMYm8wTFRrbjU1S1hURGtyUnFWbTV4T2R2Q3JkR2c1dHZQWXErK3BsRk1ybHBSZDM2WnJXUHB6SS9Fang4ZnV1K0R2eFhXNEdKSDdRUnlzLzMvc0ZnS2dlTTVoKzdrNzZpU3NTVlZ0YnhLWklCTTBibkticFlLRTRzNytpeHZKbEphRzhkcXhHRFVxVkRBNko5QW9xUGxzRURRcXFWQkM1VWNFLzBWWU5GLzQ4Wi9hUDNudGIyN01CZUN0WngvK0ErQzk2ZDd0bi85N3hkdmxEa0l3S0FBRWZsMDF2Q01RbENMZkdUeGY2K2Q0eVBSanVsc0g5QjVKSWQ5ZnMxNVYrbU9qU05HSUhWRDNKeGRoVGVJRVp4UU43YTMrcHpCVXFNaXBvUXFYKzRkYU5PYnhvWnJhL0Q3VXBxWlVaS1pZZjBpQ1Vtazlsa0JjWmcwVmZGbDZnSW5Ua0pwb2NSM1Y1dUl1cXRONy8yTzBBTWpHMXMwZUJTRWRZZHljb3NWVUVqYTF1SzJsTmRteUlkSEJJYUpyTithNUd1OXN5c2tTbWFrOVRocTk4a1ZiMTRZNVZJeFFTSTR2SGJFYkw3blNja3VidVhScGF1YU11SFowNEJDeG84UDhjS1pzS0ExdnZqVGhZZWNVQmtZVTRGUndoRjExWHJleDNkZFZ3VkJ0WWlXS3l1a0FMTWFlK2hVVmkvbjBnekd0YWx1UnN2dTBTM1poKzZ3REx1OURuU3JVVTkxUkU0clVGOXF1REp2MG1uRExaZnBZaVRTTTMvd01US3U0M1JlRXZVZHYzNjE1RHVLY1h0cngvWE80Lysxdno5dmRJMndmMnVZYVlYMzBXQjE2ZVdiZTR2VG0rd2pVaWlEWE82QjF6MnpOTWQwOFBkbmVTSXczbk5IUzg0YUxIc3lzKzNQWDY4Mko3dXlIbllsMWUwUzgxcGhvam9qR0lJbjY4S3MyK0xxYTJLdEVYWTQ5cnhSSEtJWnZSQ0RjZWw5ZWZ6cnRmVmo5YnYwUjNteVNWK085YUYxUTR1V1Z6cWszUnNqS1h4azVRcHAvS1hRU3hFdGdpVGlHaUNsSlJ4VTBRZ1RzQ1lNN2hnQk9JUG43ZTNnOVRzTGx0RUNUMGY0TmpFSzV0T1BsTnFqWEpkR3g2cXBqWkM2b2tVS29sdEpVRUlIQkpCQklSSjFlQXFCQ1RBTWltdHd0aGUweUtBcTBhK1lVSFprMER2eDM0N3VhcVppdDBDU1ZyUmlsb25PQ2VOWU9kRFllNlNpcDUrc2Z0SlVzc3I1WTRHZWR3R1NsUDlsRTVFY21lc0g4WUJUUmVPWnoxZy9vRk9JRmJ0WUtWTmFOVkpSVTg5VVB5a3BoaGFFdGQ4cTZRczlNaHp1ZFlxbFg4THIyTHNqeXdvVTlwRDh4N05hcllKWVh5UGJxWFZZdXNpWmFzbm8xZFpwM0tLenJVWGF6QlhXYVIrVkt0ZWhXVnE2dE5WSHp5V1RJWkRLVEo1UHBNMlNBMEFhVEEwV1E5UHRpQmRPVUdRUUVRS1dZN1g0bDVqdnZ4RjVXQndBQUFBPT1cIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMjdfX18gPSBuZXcgVVJMKFwiZGF0YTpmb250L3dvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFDSkVBQklBQUFBQVBqd0FBQ0hnQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHbGdiaFNRY2dSb0dZRDlUVkVGVVdnQmNDSUY4Q1o4VUVSQUt2MUMyYUF1QlNBQUJOZ0lrQTRNTUJDQUZoR0FISUF5Rkh4dllOeFhzMkl1QTh3Q1V1ak4vQmNIL0h4STRrU0hnSDdwT2pRUVJZVzBSTmkzaW9CMWJqWGFzbDRwNHI5NHdPbSs5Tm4vM2ZpSkN3SEh5MW85cUUzaUNyVGVNK0FFSUIwU0V4dzFmV3NPTDNkTzAyTVUrdjQ3M043TTY0endlNHBJUDZSVVBSbGZWQ0VsbWVmai8vWHJkNTF5WUNYMmNjRWtCa3dJR2hXQU1PMEFGTXI3Z3FvQjFWbFFhMTNjSGFKc2RxWE0rTmxGbllUU0NUQVF4TUxFQnNSQnRqQVFab21KZzVheVZ1bElYK1pPeDZsSlg1ZHovemZYdkhjZ0FKcFB3Wm1jZmNSYUs2SEgvT1Z0QTRjYTNyS3ZzQnhLdWlvU3A4RS9JZDZZcloyYlI4SkpEdkM5bk53QzBrcC9ZOThBSEFRSUh5TUV5VGVsMFVmcm1qRnJiZkdya1JDcDRTWHpJV0xJc1ZvOVpPVW12eVEvUWYyK2JYNEswL2NtRXJva2NYWkd2VWxrVDZGeksyeHVzaTBDN0poSGdmOVl5dTAzWXpzbFZDbnpWRDJ0bXp3WWNRTlBBZXFXZUJXbkl0ZWNBSC9IbmRua0t0bytoL3pWVlYrQWcyU2ZKamFtdWhTbDFtRXJmbkdIT3NodytDTjRCT0ZxNG8rVEg0Nm1SZEtGY1NWTXVwS3VzRk5jK2xXRktMWlFzcDFUYTZYMFluUzFiK3BRMXc3U1hNUm4ydklibUFZN1BUNmxoU1czM05tWTFVV3hYOFZqQUxGSWlvUDNhZis4cHBDV2NPRmNxbjFtd0FMUHQxZzJ4QTI2SzdHWVhPUklqY3FZVWNTZGdTRkNJaG9BVkVXeUNsUkJDWDJ4TVZnK0N1UFR5U0NGZ2ViOUtWalNOZmxpV1V6ajZrWnhNMmVnbk1pcEtWZ0dIcXdnbTRRUDZFbGFxaW9xRWViRFpBanZQeGZjWFFuVzYxd1VJakJnUmNoQUkyc2pHYmtqeXEyVENzZWNHVjVzZWcxWlliZElXTysxeHlBbm5YSEhMVnc4QzhLODNabjJsN2JlT0RBcFlzcTJUQjRNZEdCWXRURTdQTFJxV1ZkYU9OSFgwRFF0ZjNOb04yN1Q3anB5NmNPM09veGZ2UGg2QWdUbVFuRzQ2a0NJRU1tZHNTVlpBWnB3ZUhieXVOZk00QmJLRGpKQzFKTThRSjRzeGtJdnFKS2hBRGVFWjdrMDVwMVlBU1NkOFZZY2w1Y2FXWkdrQWw0THlabUtJOUhZSmFUVDJOQVl2bTYxZEMwYU42RHFvUW1Ta21qU3FQV0NvbW9JWFVYWXJNbTVrWm1PK214c3pjTCtieGZRTTFCZ1FlNk8xcVRnYmt0RWx1WnVhUmMzSUViaUNVMkdsMFpWYTFxNXV1cTE2eDF2SWlCTnhJazVEM2VKY1JWNTBUV3dZWUh5Vk1BZTdpYm00ZHNnbm5zNHFBbEJGYUE3UUFTZ2JOOUdsZVA3bExhbnVrU1pESm9qcU1IUitoT0IxU1I2QW9KMVNMd0s4S3pySlQrS1ovYmpidnU0THV1THFtRkRJNnRKVWJzMjcvOThRTUoreUV4QWZBYWhYTmgzQVllREVJbk5GTFlRWE94YjB1UWNxOGlBUXdITVA1MVZVRmY4L2xvUVFpWWRyeU0yeURMenN1RExSb1FlNktIMXFCZ25BQkpTMkJ4VmlCTzVLdFJUNXdMMTBsSzZ5cGx3cTE4cXR6SHJsYlhscVQxbFhydjVVZlhyMTZOYXBMUWl1b2k4c2JEcm96cS84REh2akhjaHBNVE50Ry9PMnNKREszd044YXBOaEZwbWtFWnVodU53cXZUWWFYL3daeFRxc1VLakhTbFhHZFllUEppdXMxV0ZXczhvSTA2ektDbU0ybWJKUzNLelBjcXRTd1VZNzhuQnhnTVgyS2hxcklEcjlBYmhVcVBuQjE5bHN1MFpkbG9XUGN2VmE5VnBwZ2xxTFRrT3lsOTltVnFWYWJRWWlqRW85QnE2bWMybDlQMWFxbWdHd0dON1FzYkwrUXQ3eWV1bHdhMHR6VTZPbW9iNnVWbDFUWGFXcVZDNVdWTWhsNVdXbEpjVkZoUVg1ZWIwZEh1YXo2V1FjL0t1WEw1NlBjbWVmM1Q4ZERucDN0emZYVjkxT3U5VnNmUGhPdHJHK040MVJtSEYxdHJHdmxFUVZuVG1icFNTRnpLQ1U3d2VqaHVCN1ZuZjd0bDVUV2p2RkdoN2MxdnNMd2xSYUF4eVhFa25haHh6clZOMEJkM3U1cGJyVWdScGJES1UycnZrQXd5VXBVTllEOUppK2FVTjZiVWI2TmdHakg2QmZKc0NZbEJjak1Hdm52SXA0NDhWRjlzc3NSbzFqTkExcnRyTk1XZFN3MVRuMFZXRkkzRjlLVFZCR1JRSmp2blR5akF1RXN0ekMxT2V1bGNvQldmQTlCZ1VjNHk5bGI4bkR0SWdnTFkvdnJIUldXR2Nsai9RdEQ5eFEwcGxxY3E1b0h4M0xXbG1YUzVHZ0VsUDhhVHo2OUV1ZTJ5S0JRUDlmYXZaWFFzcDh4Y1h0M1RLUkllOFlCQXh1R21aS01wZ085ZzNkNVZUaFY4Z3ZpaXNZeTdVS2hGZWkwYU9KVUVkdTR0QndOSUNwamhOUEVmTTY3UlpHOVR1eE5wS1NSeUFFZERIT2o3QkFMM1d4SWZ5YVgvZGIxRUdiSXFyRXI2WHFmNFFrUVBqTllBZnFxQ0Q5cm45WS9NMGtWV0V4MFgvQ0JlaEl3VjRhQ1RZZDBYRkRMQUZiVEVheTlqYTN2OFd3alpzRUdwUVY3akhLcFhxa0VjUHIyK0lwa0ZVUlpyMVRmQnN4UVpTRkgxaVRqRmZhamRyVmRzQW1PMHV5UEZQczR1clZjcmNlazZUYWxheVhiem4yMmpNMlZwdzNzdlpneGFVNE82SXlNTnVlY01ON013eHVSOUhXVXBON0trNHpSYzhXVWRhUW5zMGhRL0dKWUcwa1ppTnltNTRsWnhGSnhsV1l6aXFJMGdyaWd2UGszSkJJdFFIWFp2ODdybk9kOWw5TGk4ZEU4SGYyUWMxZGdHbkJjd0JQS3lweXFHanQ5dE55aWVvUlJreXRYT3Iyb3I4MWR5TnJJSnhNVW5iUm9pVVhKcUZlcWFZVmF4bHlmTnBWYzRaT25YVGw0OElIemJwajR3cFc4OTBjYUJvbzc0RmJBdVI4NXVlNTZRY1o1bGJpaXp6bGdZMytRaG8wQ1lvbVRzbnNKUE5kdFhJcEhWR3l4ZklseFpta294L1l5ZnhOejhMQTJQTlljV3lZZXJmTkJ4RHpjSy9DNTQ1YkpoTHNsZ0d1VDRQUWQwSmRoMlY5cTJucTFvNFBZOWZIWFJ4OFhjd1JtSFhTSWNrWmFUM1NRbzlqU0hXRkRiMHFHLzBwSHR3K1ljeDM1R0FqamVzS041MFpPbEJBMFNReENSL3hHellLYnFLbUVDZnBvaFZPS1NtM0lGVndaMDJ5WTZVZHVIdVhPYkx4ckVKbDIrUFJ1RzNHSG9BSldMTWFaS2RWam1LTXZDUHZUVFN1dFpxeFNOTThyREk0ZjkyN3VOSjN1WTArQ0pMdjhHSDJLR1dnYW5ZaE5XTXRnazY1L01JQ1FRZ3YxZ0hrRnJCSnlyU3NjTllRamFVeWduQ1FydjBXdW9xN2hzTU1wdTdYTVFBMnFOK1ZMSUhWdktxemRnN2FJS2VRd0d4Qk1INXo1aE5KRzRSRmJ5RHNucXdzelNtWmVZVEZMSEhyeWIxZXlwb3lhdENjNjZCRVNJWnNnM2JIRUx2RGxKYlpZZnhHRHJkTVhGeTFtaGkwM0RGM05RcTNLZ0VtTE1hR0tsVWc0ZHd6QWxwMzRJSWtwSEFpdnlnK1l6N1lNTjMyZWVSOXJhemtDRlFyRXZ4WnRzZHdsWWJmRHlBZForZzRiYUs1Y3lWNUVxTUFhWDNiZ0wvdUFBTUZUQ3R1RzJUMHkzTlR4Tng3RTRFU1hDWUlZWWlFdnhseU80dXRnU3hNQkEyeThJSDdCYXBvSC9uSW91OFpmT2ZDVU5vaEdESVhTbXFZT0R4dVg2Y0VFRFp2UktvOWxWNXFGUlpTRVFRTW45cFdZZ2JzTElaRiswZ0dXYzA3UUxReisrUGg1TWNQWFVKWDNhbHhZdVVpRDRnbVIwaVQzcGNPUGJKYk1xeFhsWXFwWnlEa1Jsb3h1ajltMSsxY0VsVFlnTklHSncwSVZnRnJFMERhU3Q5MEpRWllOWWlHcGhYOEswR3EwNE1XQlN0R1FsWGgybE9wSU52ZUtsczh0dmpwTzNieG5RV2NWQ2NlU0lvTVNsaGkrZmlNS3FuWjVVMUxidTFZaHZ0a2JwVVRZS0RONUpPak9VZGxWR3BNczFTUVVEWUtra2lDQUxEOU5lTkRVR3FuU0t1SWx3R3dTK2tnM05xVHV6aFRZUWY4cmJ2Z1FYUTRGSEMwZlNuUHVIUmMzRG1vUWV6MjdPSTNFTnBES0E1a1dZNmNseEVmeGtKUVdzTmFmMmdubElqbXo3T2JEcEZsMU45cm5KNWpoYVJTYU9qQ292MlBQalBpeWFBSXIvVGd3N2dWdGttaEVLN0tSbC80bDJ4QTdFQlJSREh3dlM5LzJ3MEtvTmpNb0dZZUZkN3hYYmJNcFRvaXZkelFMbTFhZGdnZFpXRDJLSzhadHdrbGF6bnRISzZjSVJCMVNCbDlEQUJiL0FqZ2swK1p4NFJaVVR3VmVHWEtKU2wxQjJLYmExcTFYZkhGYnQ0V1FjbjN4YUl3UTVSOWpSRWhMb09Wc05JVENQdmQvMWZQUHJoTmtDSDJBYWJ0MkllKy9tUjRPY2R0MUR0MHVmN3E1c3ZJMEg0SEdRditSODRZMDgzcHZsUXBCSzlzcTdmZU1aOTQ1WGVMTE42OUx3aFhOL1E2Z0dkcDZ0ZTlMREFOU3RHRG5YYUJsQTFWaGx1eDd6UE9mdlc3L1MvSmd3MXl5eG1sSjhtSitsN0RmOXdvc0FSdXJWcDU2SUQxb3YxMnZMYll1NkJzOW91R1lreTI1N0hta3BYQUJqNm1tV01VNjZ5cEhkS2hxVUNmTFdXSmh5Z3F0cWdjSElDN0g4eWNqU28ycXYxTjY0RC83QmtteVU0bE1DM2dLbitwYzFKVXdCSi9wZlVpaGpIUHJWOERua1hEYnpvcERaUHBEMVhKZXl1d1FRalJRZmgwc2tmUk5FTmJ0bVlGaW4rQVZOZ28ycHZIVlBzZitoWTlZWkk1OG1pMUc3OENhOC9IZVlIeFNhVk5jaWNCYVVCVTR4U0taVUhtV0xOTG1oZGZPUzJRSTBmOUxEQmo0S1VCQVFFQkNpend1MEU4Y0kwL01QK1N2d2ZZcjRlcFBteEFmNktQNXJJL2Z1K3lKNkFhNGI1ayt5ZDNKV0M1eENWeUxvT2k5ek1VdlRqdXcvWUR1RmlmTnh6Rm9iY2RHOE44bjdzZ2RDbVZNZFIzVmZCV0NTTlY4TWJFMGhwakdOTTBlRThwRldVdlpUeHpKMzNYSGZ2cmk4NXhYdHlFTi92R25nYmZkTkdjN3EzZU1ISHNUMnVwWk54eXpYMlNBc3hUMDJLdEVGQTRLNHYzS2RkaEQ0SldoU2pXTnJldVFDZmhBRGNHWnhweTM5UVZZNHBVV2ZWZE5WM0J4a1NUQkFFcGpxQnFDcUJRNHFyZ0tCeTVLYVVQZk40REcwU2ljWWJ0WlVnYTZReXJBcXJyZkVkbUl6aFFXR2M0dWFGV1V4V1lqY0VmNXJXNWI5UXQvN25mZkxXelhtdTJGdGVoYm1ZZUFnd3lDQmhiOTZzWUxhaHFpME1CeUUwVEVGSUpTS2RFTWkwU3lGL2VWa0ROaUtackZEVzVLZHZqR05yVGtLWnV5WWJ0aGszTzhXRFRIRzFaSXl2QkdEUFpCUnVwQVd6bnFrOG9UZ3NacTFuRjJpVFU2eElVQ09rQU92SDdIdFdBZEwrSG9LTWd5MTA2a2pQb2oyYXF1UjMxc1krbnJ1T3lQeldVdEJnZ09xUUpPdVhibEd1eEJVR3pVaVFhZFpJejM0SE1ybVg4M0cxQUxqZk9ESTJUREdxTVkxTUhDclFZcCtsNjJoaDR5bzJvUytUTmhZUWtiRUx5NHVnMm9sQTZIb290S2dVSXlHdWVrVmJ5VFJLbEJJWVN5RjFhRnRKVE9pb2lYYnVNbnBtV3RBRGdPRm0ybVlSUXVUVi9rZTlGdVA4M1BINWhocGZsMVlYN05QaCs5K1Y3RUJES0J1N2ZNR1RMK1FUelpMSXpDTkJmamJBcWdWRzlZcW9DNkRwdk9PK1FMN2t5V3hpVitHaEhJZUpnM3NxSW9vdnJRWHUrV3lvcFFaK0d2dFFzNU9iUUxvcythYjBUZmVkSlJQYkc4SkJVNTROaUJNOGlhM3BOVzZ4QzZGNTVQdmFLM01sQ2g4Zm1uYnRiWmxMRmtlZnFRQnNMWWhBQWl5M1VVSkNSVkVDNEVIQ0RiNEJka0dWclJubU5kcTBkYkgrTGdDWExXNktMbkRDeTZ0cEdraHZVczFHT1pnZ0ZyMjcwK1BkNXdFSnRPTng1ZWJMNFprKzJ2TER2MXl6ZXAwdHI4ZXdBQmhXaUtOdkpzRFhQK3pzVjJmaEZoNUxvRTVTdVoxMHBtRUZnTENyRmI5a3AyMXlNODlCM1QwSXZSbFdJUUpSUnF5bGhTamI4Rk5DbVo3SzlleVZSc050V1d1aUIwTjA1NjN0R3VCZHlZcnQwQzF5ay9IOGVKK0NIMWM4WFhZN2RzOGNnb09SbXNRclVXbkJEQ1FUYzQ1dkMwZngzUFJwUktmVncwOW9qL3RFbGtMMXF4M1BaV3g1eTJ0Tm9FSW1pcy9lOEpxNndYQUt3T1BjbHcraDFvMk9XemFZSVYzeHNWTlZTQUhkN0lHNjBQVTIyNGdJUlJHQ003eWZYdDBjL245Yjc1SVJ0WFFQbkZVdStKV1YvemN6M0U0QWhjVHRwZDRQMkRMdUNKeFdTNkdGK1NBNjh2RTR6dzhtMjZ3NS85Sm5kenE3RWt5R0Jpd0hLekZZZEN0UnlHbDF3MGs2cE9BNTJhaTVWbEJaMjJjVWIrUnJvNHdQRVlZKytuZ3VYcjV2T3AwMlp4S1BLaSt0blRacVNaeU1mTFdsZXpxV1puU2JjbVZIZG5Tb3RPVy9qSk5WcDRZN2EydTZZcmsvTWE4djlGRFRyVHRzNnI3c2tvRGRueFljYUdvU2hGR0VoSGZMbWhvTWZzeWR0ekxMazJsYXBVQ0NzQ210ZXgxS2Y2eW91VEdHNHg1VzVab0ZRSG9EUThlYk5BejdNZjFDWjQwVHBnSmVTcTJTb0t6Sjh1YjVldUQwU1NxY3dqQWNBWHl2VnBCcGd6bmowSFN2K1hlZkh4TDh0ZUJzMHZIb0JWbjljYjIvRUJvdEkrYVRGdUFTSi9pcVpsTjZubFRZWVBxVzNGcnNBTTZnaWl2c0F6LzRFZndFc0NOR0o2SUFHN3pCNlY2MzIybEE5Q0JmUkRHK0dCR294R0luczRVYUIrYWJUaUlLcEtXN05OUXNzTmowZmpQWGErMkhXYys5Z1hPQ09GOHNqSDZ4YnJHbUNLcndIeTE5dDFqdlpPTDdZT0F0amgxMDZBdXp6elhUbU5rM3IzZWpWemZway83Nk8vZTNlbVp0UTV4cWNFVldrek1OTU03VGQwRmhvdDFsOE9wQXBjQkE0Ukw3NGRQSzR5T2MvK24vUjUyN2c3YitJUFpLaXlRSTFrKzVPRnJUR1lzcjl6enBmbjlrRXREbmpmSHoyTWk1Y1ErM2kzZTRaUEJOUnUvaEVSTjlnOU8ydWZZMlFMODBiUno4M2QwQThZdmVWdUEvbFJQRGpzaVBjaGtwSzNmcHp3dm1xb2dsakU0VTZOTmJQaHlud0MrVUtBcGcrc1FIOWdVcUV6UlFpSVdML1RhQjRUUkxKYTZjaG8vV2hFU2tVbG0rbTIyK2tMVXdFVGFmNFU0SE9vM1pYSnFna0tYbEM1M0VseWlwS0s5bjk3NzhvWm03c1NZcWxTcWdVUTRqS0dlNFVKT0F4aXdsazg3dmdGQ1labldHU0drTEFDcGxLYnEyZFA0cW0wNXF6bVRuQkJjSjIvSHBzZ1ZseHhKdnR6SEMvVUc1NEFOTW5KSUFiR3VLWDVzMHI0M2tCM3V4U2pIRndzQTZvWHdPMW83d29Cd2pOaGp1dTdpVHNNaUJwOS8zNUY5M0Vtc1VzWE1oL3I5RnhNWC8rNHJpMDNIbjllZGFSOWdYOG9uRjBpZzYwMERGTnpFcTd3R3F5SmplZnBDR3B1azBFeFV3UW9UUGpBek5HV3F2bWY4N1QxL3JOajh4dlM5ejhWKzJseFd1Tm83L2VXbkR1M016eitUMTI0UkFlWEhEeTJJT0ZJWWh1Uk1oVm9LZmZ5ZlBhV1FSaHVmcHpUNnJmNGNFMXYzTDJ3cDVpbmg2QS9jN3RYK3Q3T0tVdzZQQ3k0UjlKTytIYXlTYkVTQXhYSXhUejJzZGlxaEhvdlB3YXhHZ01yMTBzNUdwR1lxenljM1NQMndJdkRMWDlDdHF0Uld2My93NFphT2VjYTN4dS9iZ3lxbTdNbzBvZnJWKzYyazJrcm53T2VnclBLemFrSmU5clgreHhVajZTemNEVXdlVnBQajI3b3Q2Mjc5dG91bWpwclZ0WTgwYXovZTNSYjNxbk1saUw0WTJZWExwaWpIcEcwWmE4TjU4QkRRME5uditqUVpVOEVtWnluWHNnSllicnNyYTBGT2R2blJ3dm5ERDlmT0tURFlIODAvNkdjcW1BS2pEU1dQRnI1OTViOXFDM3BuZ0hHMXVqUkprZmgvNG9NVkoxcUxYRTRtRmlSSTJMdlhNdU9QQmNwTm5XT0xoc2F5Y2F1ZFg4MU81OXZaWG43dWNQWm8yRGp6QlVvTk1udWk1L3l1aVpZV2U3c01yeWtHQVhoVmxmWFZNcURNNVVPSWFGZmZZcXpLbVFaTWdram1GYUNlNUdKQmpudkJ1OUxaakx4RzEyUFVRUTRNZjV2dXVtS1k1RFZtMENwQnRlYWQ5bkViRHVqNFh6SzdEck9xdklzL0pXc3ZPV1JZbHhBU3dIVzNaUVZXU0tXNVh2NkhERVZPSHUxdmZmeWlaR1BoVjBYT2p2a1I3WVdWRU0zaTdLRHFpSkhQbzVhaUJIbGlpaitaMUYvclRjYko4d25wVE5VSW9LaXBjUTZab2QxemZrMTVPM3VGSkNGV0NHK281WE1QZzEwdnErWTdzVlpPZHc5V0JWRmRxZ0FKdmZsRjNZV1BlUTJWTHgxaldla3ZvZ25EVGlJUzByb1RJQ214azlvSjhsSlVtMHl6T0VsczB0ZHNpd05oMkxKRWI5MTRZOVVacS9yN1V4ZVdiczNvVXpzdFJtb1Y0OEZHLzlXS1E3Ti9uQlNISEhkbE5nRmpkRDdSUnZvc0owODFpWkJLcFdYdm0vTUZQYmQ1S3FxaFNwVWxQemhVN2pTaFJWOHRhaHg0UlpFS3F4SW9SbklYOFZaYzRjUEdHcVA2NzRWWkE1YytDWXlYK3JyTDdvS29wZXdkNmVoYjNLZjZ2WHBKSkxuK2s5UFlWOFd2QU1SektYQVA1aEhEWXQxV3orK2MwMlltemVwSC82Nmo1QTB5Y05XbG1uT09Wbk1QbkVCUHFjN2VSWHJHWkNVTERhb2R4a0FFNFdlb2xTU1VaZVp0TS8vZ2JyNFFVbGkwSnpzZHcwb3gzbS91eFg4Y2lYRG1ycXhSZGs0QUVKODI3aEdFNklGVlRyUitXbWZYSHlQRVovR0ZGMUtHbnpabE9MbEYzSm9UMjFlUUpMZ3lEampFQmFkbkE0VzFvYm1vWDVYSVlRdzB6UmoyMnZSUWlHUVFXSEsvRVh5WkxYVEY3YklPOWpCQmJ4RTdtSmFvZmNiSitUM244amhmbmJLSEgrOTIzOVRTL2Y5NnF5OU91ZVdMRWxrSytnS3Q0Mi9wOXorKzAwd3pPT0ZKN3B2cmNNZXJtbEoyYUpVN2xwdE1IS0FCeU50S2NHTXRPNmNlbTcxaFlvYXJDa2FHQ1QvaWE1RTF1V3VYTG5WT1lLa29OV0x0WTV4bEVTWGtjUTIyMzlhc3VQSHhlSHBOZTZDazFWMk81b2x0UXZSWFRJTTV3bTVjb2RwRFptZlpGZ0ZDclhiRzFFdVl5MVBQTjdCL2FQd3B6WGNMOUwvZmk3Ump2K3JhN3R6OTVMeStidzh1TytqNG5oVWZubnFaWWg2UjY5MGhpaHVtUmRNNS9ZNkYzUzRMbWllem5HSHk1NTJVMVlxdEdlRXJQWklhMy91UW00dXUwNW1ENlRNNDg3a3o0TXBuc1c5T2ZWeTVUSzdUZWI3ZDZETFRSMEltbU4wWGg2SU5iVjJOeFc4YUEzT2w5NHBUVS90S1VxakllQ24zeDZidHZRTFUzRmx3MkgxME9NT2tkUlR3aFBSazNtYXBaTTc5MWVTNlpiNWpMOW9qT1FZdjIyRE41cWFhSjFmMHlDbFJHOE9FUEJpbFJiWm9jL1FFL1RUdjA2ZG85OXJJbUNmdmw5ZHB2SUtDQlpIWkRRQUtaTGc1a0Z3V0NXb2prTkh4bkpjRGMvamYrNlA5SFUyZzlwQ2pSbWtVRm5LSGVvdnRVRmFkMU5zTytsSU51dXJwcEhLU2YxN3hIdWJVUWdaWVBmTDlKc1dCV016anB1b1I3UVdGYnA0eEs3RE9vVVpsL0pSUGJmMDczRG11RXlTcnFCWGZwUVdlUFFtZDZzdnhNbG1IMGVVM1laRkw4V3RzV3lvWlI5VWs0UWsxQWFhNCt6anlXV0JqTjlnNFZDKzZHTXBTeThmNHZOVmZjUDY4b0EyMDRLVzViSFhqTlY5NzlzSUxHTU9qbS9lbzUrS1BtL2VSTWpUVUpSK05rZ1FoQ0JSTWN0UkF6dFRjU3VOY08wbENScGFxSVRNa0V2MmQwdlBsbWEwWkR0ZjMxYzN4WC9EMU9iV3E5VXBDV1A3cE1NdmZRSm9YbXp3Z3MzQi9WQkZ2RGQ2NE1TNGwzZDdLOEx3U0RmSm5ZMXMzREw4MkNPbU9qdkVHbElldG1mYUFFNkI4Znlha1RyaEx1c2twenA3bVI1YXl5aFJpdDVDWFVoTkJocEFpYXkzcHl1SHRZc2pYb1VKWDA0LytTcDZZOEF4NGNpTmhDUmRWdHpJaisrVEhjbDFLTFVuS0dVSlZJeHQ2R3lIZHYrK21sTFUvcjZmWTFxQ1EydXhqbG5TeG9paE1PT1phVnVBYVU4Szlyb2x4TFJ6SG9Iek56M3VRaWVpWGZCWUhUdVNQbkRiNmxxZWhCZ08yaXc2NXF6TEZMRXhJUXVxSjdibW93bWY3NTdTR2FtR1dZNTJTaXQrWkNXVUR2UW93QXppNGsyVnFjZUVKUXoyWVBiUzQ5QUt0OFFZbmFrL1NmWU1YZ0ZkUUlxR3NCc0RHdTcwazRJb0ZoNzYvUWJrQjFJZ1JSU3lUSnBwSk1abVpNTlpDUFpSRGFUSmJ3bFBCelNVL2ZxOUJJVHhUcFVFMlBNeVhaZ2NSN2VEWlFaSjlVRkdRL2hFS0FkK1FuQWZOVGxHVFZaSjJ0b3hUYVpmWFc2NzYvdUxJbHg0K0tvT3I1eG1pdnlrZ3huYStvQ0FkM3d2aWxqOU52OE9Sb1dIKzhCc0FDMHI5czhSU0hGOVZxdTh1cSt5eEtBZnAzWW1QL09IOU05VzU5NERkQTNlcnhCRjR3QUVOWGVhUWZzeWRYOVRWZml4RlQzV1hsTGV3aGFZeC9VWFRPOC80eS9MMVdPNmZhNlhiU0RQOGVPK0FVQmdEdVZacnZKSEhQejh2T1pXRTlCaVBONW9OOGxHaG9xWmVycXlieHVBSm9VeW52SGJEM1F0VlpENjRHS1F4V0pTK3F5S2grZjhmVndGNjZQbTlQWkthYVdYbTIvb0FIOTBIRVozMWM5VzRzSDl1TWlkWUxMOVhMMWpyVWtZRXd5bkRnUnV2eGw4ZXEwNGRSVHhVdFJsdU1JODlEQ0dlQm5ieDJxeGVGeFVNT2tSQm5HU1NIUjRnTGFLRUZJcHRudFVhYWZJazBDRTVmdXgzRUVDMGN6MnlSRDZ6NnZUWTJveTFHWHNNMUZaVmRGR2h0WjZ0VWhFcis2enZPNUk2bkpwQXFHWDl0THFaM0JTZHNCbXBJTDJyaFNic0s1Tk02MG9FaGRuMllNSTVCeWVDYzBycTdrbEdZNFlTSEdBeFo3TFhnZUhVL05FYWR5aWllK3JvbUVhYlB4OS9KRllUUWxYU2QwUWlwVndEb1lndzV5aXY1SFp0U2lJdU5Cc0VTNEl1UThNU3ArUVFEVGV2Zzd4aXF5aXpIb1g1Z0pONzM1djRyaWc2QzhPc0ZveWhHNmY4OTVZZWg4aHJNSlFPdHBVaFlobXVjRUlIM3FjcWxQWndqR2NqK1FOTWcwMmpuVDJKVWt0dmZ4dGlDakZJUTBHeEhZa0hyT1VLTUJleDZpU3FJMTV4S1N2dFRhUEllVTBUNC92UHJxSnZTWHlnOFE2dHVPcEVPbDlxMmhZZjZ6ZGpjQzVHYndycTZabEdMZWVwekVwTmhLZERmRFRnOFZTWHZqdUZnSXJaVXIxckdaeU5nZVljdjc5MS9wb2hoNDl2RUxGV2UwakxoZWpPamdnaUpuaTUvR2x5NnlBb3hUNzFRejZHNjdUb2d0R3gxZFhTMEJuUGJNWTZUK3M2c0ZQeisvdUlES3B4RDM5NzFPUGFBS21qMWV2VHhFcDFDRllxMW1pZm5wZ1JJeTh4TmRQRjZkTTdodWRPSUErK05WMnU3cUN1UGlaTUdUS3JSdDIrNVBNWFhmRDhPSklUTklCYVo4Vi9NRlM3bEttVTlsYlFXK2VkbGgvRUdtQzRIV0dpVkg5ZHltbnVXc3VGb0ZtL2hxdUVCbjFEYnhFcGxGQ2RRbUJQT0tNeWl3M1FEYk1sQ2g0aFZpM045Zk50WVdSUWdsdUlkZTh4VDhhK2FtcUVtZUI1YWNTc0QxN2xEdGM3NEpQRm5zeVlkaFBxY2FvTUhydkJwQ2ROWGwwM0tuVXlJLzl6RWFhbW9vMjJXZ25semhzcXh2eDJ6cWVaRnB3eFZBNEdzMFBvbTJQYWhnTVFLSXhnRmJZbmZOcWdWYlZiMFlNd3F6dm5nUGdMTVFySWhUdkNnQk1pVkVwenBGcUR5V0pjcDFBc0NZSGJvQXZxb2RIdnBseTVMUjUrZXY5dWcxV0YxdTFnS2FsajA1R1hLMmVTZGU3MmRzeEw1VG5SS2dkZFZLK24rblhvemozbUgyL3Z2ekZ3N1oybkNkeS9RR3dEU3pWbDM4NDFSc051NzQ4UnA4Qm1RWWNScEV5aVhKZm14SnE3Vm5ad1VleDY0Ylp2MnhyRHM2S25TNlVRbmtZY3VpbmZ0T25wbkl3SEJzUkdjcXljM2tiVkFoNnpwR1dKUkJ6TjlIT2dIQTcrS21PaXNBZ3VMaTc3WlgrOUtNMlAvcEw5UUh1Q20vL0hUc2h3L3h4M011N3MrZXJ3Y2o4MHdRWFlMZ1g2TzlEUitIRUIwMHZjdGE3cThYSGMwd2l0WU1hUGZZVTZzUHM0Tm1UcG90MXB4MU52U0diZ2xsUThiNlc4dXhpUUIxQWtndlJxMWZpZXY5d0xRd3ErdDNIRFVXVDB1Y2I5dVkyMGU1ZXJZUnpQSnVRLzhOdjRiMkxpd1hqNU8ra1RyYmdqQXBnRzJnQVg3alZCWTBHb0JPcmk3QnA0UytNMXJwUTZLcEFlaitEd0hGQVdjSlBObDVGdVhrbU5PYjdianlXaTY2QlZwZGVMWTU2dFV4Nm1FbmFDdzA1cFU1d29ITzU5a29FRmM0VFIrZlBnNkpBNU5NZXdzWFZTb3p3YlRTMFJ4dGUxMGtUVGt3THZlZEs3NVdYQUxIWnowemRSMTFYcnVmR2NnUU1KdlFXdlA0bUFmd0ErWnNrZDc0L1paQVM0T1FWcmhiQWNnOXk0MWdxUFNTcnlWZVhkQXYvQkl3STZ6Wk1pUE43WmxSbk9qVWpPb2czMmMwdThJVTkzcVg2VXRPalpBclFBQ2JvMm9HQk5nWUxWc2cvWGdRZkxTK1R4Q3hma1NRY205OEE2NVNaVlJrOGtubHFXREprMGMvc0NRMGNFNFFvMndXSlJBSVpJQ1E5eUNXYkljb3NGV1djUkJBTVlzOFM4bHcwc0VxN2FKTURIeTRzN1JVUHBMR3V6TzV5ZXF5V0V0blVkcTZpK1RJRmFKTFZKQno1NzRUOG5wN2ptUkVZSGp0SXRsbzNIajBwckNFaWhHaEFqZXo2MlpYNkNzdUd5TkVEU0pSK1pTMnNQUnhWKzN5aUhrZHltWGxWWlZGcE54c0JrWGNDTXZLM2NVSUVTa0I0cmtYQ1lMS3pwR0tSZ2ZGTXBKT3VBRWlwVEFMUDJ2Z1B3bkQzZGtZNGVsZFhEaXEyS3A0VmRKaTd4aFE0ZjBQclBEZURNb1pGeGVKSVpubGpLaXlSZi9BVXErb0Vwb0VMS2JwSXJwbEZ0TE5BcytvL0Evd2tJSjVIbFVlUEdSZ3JrY3dtRU9WOUpTNm95Q0xHZ05tdXVmTURIZnQzVkNudVdWTmlWdkJDemNHS0haRlBYS0ptTWt1QmM1RkNpWTZVMEdDOHdBb2NwYjFVeWMwaDQ1YTRKZ3orWTVSUFlkNk1OWkIzTTVtdEwyK3R1UG1GVVYzS1hJVWorSVBodHVhTFJ2ZHRDWXp4RnJYclhkRUJWa05nRnlycUFwNEVRd0E5UVVZTWYwc0M4NHNwYUF2R2ZRSkNhS09pVExRaDFqMWtCZ0RMdkkveHBDQWRKcFFNOVhER1hSMGlBRWRMQWc0c1QzQkZiU2orSU1VRlA3NDNHM3hWTkFHQjRMV3VIOExEVXBCUzlBZkJKYzJkczJYc1JzWDgvWU9ISnM3Y0xidUYxOTByelF2ZnpHQTBhYnEvcTNBOXplNVhJVnRzY3EzWVpmdjdOcHNzelhkbWgzZGVmb3p2YTNFM3kxdDlWcHQrWnB0MFRld1hkcXBIZHY5MTI4N2h0M1RmbmJmclpvRGttdXhKV3U4RlR1ODgvaG5mSnNrQjFLbHYxakdmL2k3cXBsdW9kcjlMb0t4RWZCTFpYTWg3M3M1SkoweFRPWWpHeEYvem43LzR3ZHNxWFR4TzdlL01tZ0ZMaEpsUFpmSldVSGxrMlJQWWdieHlVd0pHaWk1Tmlac2tmYWdrR2xyWTVyTk13RG5RTXFydmp0ZTkzN21MM0lmXCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzI4X19fID0gbmV3IFVSTChcImRhdGE6Zm9udC93b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBQjBrQUJJQUFBQUFOc0FBQUJ5OEFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR2xBYmlFb2NnV1lHWUQ5VFZFRlVXZ0NCREFpQmZBbWZGQkVRQ3ExSXBVa0xnUmdBQVRZQ0pBT0NMQVFnQllSZ0J5QU1oUjhiOHpBVjdOZ0liZ2VRaU9xZUpvTC92eHh3QTRhQVRiWDNpSWpkNm9EaFF3dmYxazFvd05xSXJYdC9ZVk9MNmdIaGpIQkdHQ09pSlVLZ1RsaXRUZGppT21yYUFSRVFPTVRQQ1JoUGRTSWhIQ2RnSi9MbDd6a0tHOEZmK3hlbXpJUVJrc3dlMFp6L3MzZlJpeElrUWdnYXd3S0JCaTBrUVFJRVBDRUVzMkJTQTJvS05ZVUtGUTJpYlg5TFhYN0xjNmQ5S2lIK2E0amIvKzVmU25YVThSaFhxdXlLSUZ1VkRDN0tJMHdHaTNEZCtWQU9Bam9WTERiMlpZeEY3ZVpTS084cEZ3RExrdDVIa1ByZitnQWwvZS9UOVp1WjFWd1M3aEE5WlA4THU3aFUrMFVOTWQyQWg2S2g0L1ZxRlhRbFRYWCtwMm5idlR0QzNpTWtFYjdtbDdLcFUvS3VFOUgySEY4TGhlVEVVSFM1aHZsMHpSTlJWNUtpQVA0Zjd0MUh6UlBPUEExc0RodHIwcnJ2SGkwK2Z0TDV1dDdwckZoMlVPVy9KV3lYWUE5TUhUdk1YUmJkTzhrK3NIN3V5dzdJSVVQQi9pVTViSVhvUTVrbkFQb1U3QVRJV3p1MXk4N0R0SFlZdTlac2FEWkNsZ21YQmdZMTlwenlaWDlNKzVkZ2h6ZXhHQUZaQXNaeHJmZlhXQmtRWU1BR0taVEFKRVRnWHJLanBNQUIyUUJjTEFzRFlib2RSU2NTaTAySEZKc0FwUFFLVGhiZ0NFM3FzeUVuM2s0M2dkZVRybzRtOEhyUlVkTUlYaTlyS2p2QTYyM0ZnaGJ3UWdJQU9JSmc4Z0hRQ05aVkpMUVIwSnBNY0VQR2xvekI4bE5BMkFqY2ZXNE9mbUVYcCtCTTMwVGo4aFBXQW1oQ2dyV243SURERWhnc0Y3MDBBVG1tNndBT082VkdGRElER3BiS1RWMTMvQ2VhSEl6amFXeGhpbFMycUg2cTNmWi9ubnR4eXcwZ2NmbVVvb0tWN1BCS3IralM0bVE3dHdxeVM2T3AzZFdmWFozZnFxSGE4Q0o3YWExZXNyRzJXdUZCKzFRTlpVL1V4YnBhdDdNZjRuTjhFOS9QL3BUVzF0ZjRPdk9YK2l1QVVkb3dKc2JMNS9RdFpRc2lpVi84czBPaVNXejAyU25KakNtRjJlV3BUVk02c3Bka0tyM1pmdWp5ck0zZW00TTVsak5paE94THVaNTlsejZreC9TQ3YwMWVxby9xaC95V2Z3WUdnTk53TnU0eVJNTnJ5RWJnVUk5SWdNZU5SQWpiMW1WS0NrelErNlFJcnBwQ0xvRCtDTFF6aHl6MEdRQVRvVzhPQXlTQXFJaEt4b2tpTnVobVIweTVFWEVFTUxFakZtb0FoV2tNaFFXUmdDNm1RU29oNmhpU1kyclN3ZkFxSVFXeVFEYU83eVh1Ukc3SU8xQkNqaEFuNVNTTTh0SEFLd1FqMDVOMDRpK1BwaDhOUG9VcFRBRTFiV3Q0bDFBb3BBRnpNK1FsZEFjQVJpT1N3UzloUFpBQ2FtbDJhck16a2dIbENzQU96RHJLaUlRc0lVdkNycEhoRTI0aEV0T0FzVVU2amM0T3hBMjFJSzdKeFJSUVBTdEdQSW1RQ0dXeFNBTzdoUE1Sc0VyZTF4dTFjbmRkRDIxTms0VTlCcEVDQ1AvTFBoaUZlQWZLYVJQbEVnM1JFUCtrcHJlalJRTGNnNm9uelcxd3ZMeThEblFROEJGSVF5dU5TYWs2MjNOOFlKQkVKR1hKa0dSb1VwME1UODVMYXN3SVFSL2ZQaGw0WExnU0VCSnhSeUx0eUF3eUFEbXNud0JBdjZvQm85dFRaeWRwbWhaZzhMRVo3bVlaME9BYysyTnN5Nzh6QWUyLzlBRjBCQUNRVXVaNUFGNUlnS28rSVE0QUxuQ0FGOFlXUDExUWh4REE0aGQxQ3hBQStrL0JZWkFZQmhUZ2tUQTJCVU1pMVdEWVRzRm1BT0NBK1FkNUFLWWdMSjlBSWRVbXdaSlFoTXR2bGlEUHpLdnpwcmdudmpYbi90YjhIZnQzM044NmlZeDNRQjdMNEJ2NHVlMy9kK1JFclFUSnYyZW5ML1ZaWjVYUWp3WkpQL1dQL1VOL3oxL3pWNEJBaWxGY01Nam51YlVuNkZ3dXdQR3RuRk9yLzVjNS9tUGhxclYvQitDTWMvWU85aW1yaFoxYTJ4Mnh6Vm5udzdtdldhOStqYllhME8yRUxSVnRyWDdIOUhwdG5TV1ZNb2x1Nmo3c25Na2c5SzI1M1FGSG9QQ3NNYng4eWxCQW12WlhCd1ZWN0V6d3dVcmR0MytjM2FnMU50dGYwZHF0dE1FMkEwNWFacjArZTZnWEh2SGFFc3R0dEt0U2RGbUpQN2ZkK3AzZXVNbTZKd0V1S3pLSHgrbXJhUWYyNzl1N1lmMjZ0V3RXaTdGcTVZcmx5NWIyZEhjdFdieG80WUxPanZhMjFwYm1wc2FHK2pwYmJVMTFWV1ZGZVZscFNYRlJvYlhBa204MjVlVmtaMlZtcEJ2VFVsTU15UXBQTGtFUFJPTU1Jc0Uzb1lZSUNvUlVZancwSThpY29pY0FzaEhxcmFEWEVmd3pzZU9KMUQxanJUZHM0Y0Z0M1Qwckx2V29BZmVRS09BQTB0ZHc0eW1QbjdWQ3RjNEJkWHJOU005dTdsVWJqMWdJYXF3aFdsemQvRUphODAxZmJXYWoyZ2RsQXZScGNTd0JzMzdkbTRROSt4ZU5YOGJSNnp6amlHUExza0xha29ha2JoWWVLS09Td1VycWd4b3BWNHI1ZU43aU9XZUV0bFpnd3RvUG9EcVFoYnpTTk1NK2ZrTzlxZ0N6SUlLMFBIOHFXZ2VjWTBQYkUyRTliOXc0Vy9JKzEvNkpuVDRrdHQxT0ltaElXZm01UC9ueXhXQXJ1VkxBZkI2U3I0VFVHTzc3dEQ3akZHU0lOd2dhNkRYTXBLS3o3SndZdXVKTjlqc2tLRDdBbXZyUmpLQWpHdTFhQ0FrcVZDSWFqaVl3SlhpbmQ4SThvUlBCM0lpMVVWbGhGd2poVSt0S1FZSVZPdERkZzhMdjl3ZjhZVXFwbW5CSWZEMEcvSU1BRWNMWEJGTzBVU0NUeWk4TW41R2l5UUg5eVFzT29DT0J2YVVKTnZmSXh6dDNCbm9NVjdMdWNDdmZFa2l4cXRDa3ZDODlRYmRUSitweHZMMmRjU0hJbWdocndSdnVSMHdRMStDbjRsSU54dnBlKzk0ZHNNdmVCZ212RFB1MDVLUmVxbE9sZWpEV3htZXR3SnQyNVRTLzF3V25XdzgyM0VLdXJyYzJNRHRjY0JPaVZRYTN2UmhhQ3hjN2RQQWpFRjExVTlWb3krNlFFVFVzKzN6ZHpDYmt0cnhkM0U1SU12bFV5bGIzRVdmM0xRNjVVOXd4SkZLTGdjdlkvNUpycnVuc2F6M0tjeUw0cC9MS3JIMkVXY0J6Qk0vdW04U2h3VnAvdHV4MnFFN1E0M3JkenZoWjhrL2MweGZpSUp4SVdqUlI5NWFMaTNoZXBXY05Xelc1ZGRicmVVZGVzLzdrOHlJa3Jkb3p2NExOUmpOSFdpYmFuNEZiQWd6eUttaGIxK2lzRlUyTzhhQ25zdFozTlQzTUlocGFlS1BqQytZcnZXNm43RkhSWTg4aDVUV1M3djNRTHRhWGxiTXA1b0huQTljUEU5bytYNEZZcDdmQWdFZHhtVXF3cVIxY0w1UFE1VkZpckhFaWxwYmUrcEZsUUorc2ZETXpjcktWamJKVUt6ZElFK2xCMi9Yb3A1Tk44cFJzdXBNQ3VMM0Ntc0JSaEUwc3poaWM4ODUwcUlod2hOUlVmSjF2bUJmY1IzMGhGdVZ3TkQ2a3BOeUQxTUNqdFVubXhucHc5NVJPM1huT1FmVjh3dXZpZ3ZQdFhHUEFJYkVnVzFZRW9ZK0M3MFZ3VWIrMlpzYWlUT3U0eWVEeEs1L1dSYTkyS3hSR0hid2pnUEY3cVFvMUpCdDZ4YkMwT3VYNWhSV0NLZXh2QkJnVVFGV0xURC9odUNPYXJSaEJPRWczdktVdGRzbHhYTUdFdE53UWhLRHhncklFUVJ1bVp1c0Q5QVJPWVFacm1lREl6Y2QxVkxOSW1BNE93bTdySWpYWGRHd1hwcXNDM0MxMmdtTkxGVFcwNURvYUZXWkREa0g3RytTT3NDTEx3akI1RTRmekxrM3ZzeG9YU2hmZHFMUjJxeE5nUU5CbnFoUWl3Uzg3SVMyL0dvSlpXSWdEN1l2aUN4YUFtZWxod0pFUHJBbFNKOUFRK3Z4VkRuMFVqTVliRHlDOVpOaGMzaVQyb2lzcGt3UkZTT3NManB4OXoweXFzbktoZ1lMSnU2NklGUzRYQWdKaSttUmhDQlY2d1lOYTFaWWlDNFhBRGlqN3lOMkl5YlcvMmNKQllIQVlwcUYwUkhCa01aU2VvWEI0N2wvUENWamtaU05XdzFLMkdGWWxWQ3Azc0hGTDZ5MFdJTWZpb2x6N3l5QTdleTFZTEdIMjA5M3AzWC9vT0RwVldEcjdldy95a0dqUm5JdDY5azFIMnd1eGx1MCtZMkphT1JJR25SNnRzZkNKM2NMb2tLREtSbFEyWERRUVRReVdGWUJzVU41VUNnTVVEZUprR2VPdkJLaXpxMWNVTFo4STFTZGM5bENLVkVjT0YwZTVMNFhsSjNiclV3RWNORGNqTUNzeUVyREd3OTF3REJpU1BkVXR2M1VXTzl4Y1d1VVVNTXcxTkVHZjBxa1lsUnFTQ2s4TWxBd0dDbUQvKzUydmhrSkhSVnJGc295QUhVcFh3ZTEvS1d3dTFLSVIrRzFoSTRFWWpZQndid2RhUE9MS2Fmcm9uUm9tYnR0dlBZNlN2UVkxUXJhTUkzNHZFMERmRkpUV3NHc3drNEw4ZVBtNjdLR0FxQkQxZTR2VE5WWklLbU1OYlpocnRkL3ZPYm16QVFqdnRIbG1YaEI0a3dxRkY5bDBSZmlVRGJoM0ZDMG9BWG5Md3o4ZkIwV0FXekdheTE3aEU3L0FnVDFTSitRWG1zbFdkWTlIeVZFRlpxL3p5dDFES0YzcjRlQlk1UXlCYUtrVzhaY0JhTTdaQmZERlY1blhDK002OEV6Z3Z1dDJ0TkNwUlovN3Rlckl5VnZ0dVVkVUdQUStGdDJsUnNTTjM4YUltSmZSUmxqdUNvVDkrTCtWZ28wdE9YQ0hMZ2VzWFhvVyt2aVRwY001RjhKMDZJUjVhdXZDbnNsSFlDejhqOHdZeTlQWnJqUnpDRW5aWGk5ZWRGL3hnaHNubG8vODB1bjRSSzhqZUdPWkJYT0JDazBraURiMnNBdTFtRGRsN0hPL24rRm5KUmhQdmtrZVlkb0tWMVRlTEc1K1YrVHpqeHNSSVhBclp2eWFCODdsMm4veHNRVWlzUDF1eTB3TlZkdVJkalhIZ2ZONHVrVk1ybGgzSGhPa3M2WUsvU2hwWVE5VnhBNVQwVGtGZHorWThZTWlEa3IrTzYwci9YcUxtYVF3Y1dDVzRSUy9zWnkwWkpqaHQ5WnVZUmg2S1hFTitHanB2dUMxTUlQTWZxZ3E3WWdDUmdqUlR2anE1RkxoaUJ0YTA1c0hVUEliOUJQTzU5cGJpMjM2Wkk1dU1xSlRuNTF6emlkaDZ3VTRxVEM1YUt4TC9TQWdteEMxdkJ4YWRVb24ySEpJR2lwNTkvSUNHckhCQzB6TTJIVmdRSUFERFFoZ0FkWGhjQWhTMnNqYTY5VnJBUmtCVUc0RG9HTUFmZ0g0QWdEbzFJa1JXOWYwZzEwdUdZZlVJa0FHWENDa2dUUElFNkIvd3owN1A0bWNKeWFSbGtzaXlONVJEQjVIdy9QMUU0cENqRzVWZDVKSUdjTHNSTndRVjFyQVJXbVZ4K2VQVmZNS2w0SG52S1dheEZMTHF0OVg1TnZIaUtVVUZESW1VdzJ6NGNSQ2NEQWhCcFpGN3Z4VE42S1FDYjBGNDFXa1BvaWc0WGdET0FQTXhVMVRkUExLZUVYOEtJamxUcU5FZXJ5QitVOENKREZDN0pkaVJoeVY0ejZ3RDJDanhaQ055dlZFT2tuZGFhZnNmZWs5REcxWDZEajhqK1JSV1RLK3krcGlrSE1zazhRd1VSbk92R2ZGUXhMdnJ3Rm4zRDFOeE1qNVRKVnBKWkhXM012N3VHVDltMFlpNVNGMHcxRWJxRzZCb2hQVUk2NjFYTkNGRUZiRy85QWJsU0RUYkY5NXJDSXFGQjlxcDY5eWNIOVBOajBkZnFKUVFFVzBIVGxuSXlpbUszcWRqNmJEZHlQQWZuWS8wcWdVNDI2V0kzWi84dE9ZZVk4eGxZL3phMWlUWld3OHBUSVVqNVdCTS9Ed3VpMHNjajd5UC9XU2xjTERnL3NZcUtMY2t2N0tZYmU5QlRkV1hjR0RNVURNWlhiTFo0OGVsVmZZR0l0UzllOC9QZnlNS3M0Y0JFdXNQYnFEZ3RzQjl1U0ZCK0lOdUIyajlBMG9SckIzTlVkdS9Taks4ajdna1BOb0ZYczE5MmJlZEw4Y3lua3Juci9NVERndmM4MncvR3ltajdCUmVEVDArdUpuQmhBS0dNaU1MS2Z2OG01V2lmVlpyR0lwWXhVSHFyT0JzLzl0MmNVbi9lL0FGR0hVVU1xVFQybVNLZjlONTc2SXVTRFBQaFBzQmRidWpEYzFHc1J2N1JxK3g1TStnTTh4UjU5N2hTSm4rVjFUWGtvQi92cCthejFIbkZJTnZZRlZzcS9MdjhlZXRySm5vaVlLQTh2RHRZRVBxY1o4QzBzUnEyQlFzK0tEQ2h4U3BCVTRxN0lveHpMQVc1NWxYSFNHbDY5RGROeGtGbUJKeE5MbExlWkliN1Q1Qm1iY1laVmNJTUNPYnhHcklLVk56L3NOZW5QRU1Lc1BDeXZLQkk1VjY3VUdmVlRPUStLYndybUc5WmdmZW1nUHkvUDg3b08wVW9GajZSbGh4UTdsKzNMSExZU05pWnE1K29vWmhlbk1ySjc1Y0UvS0VRdXNObUVCSXVxTklxRGlzbG5NbWMwek0yY3V1VEFXMjdOTWlBWFFvOXYzek4ya0lBL2JwbnFWK3RoMnNGeTBXQTl5Z05IRDZYdGdEY2dVdWQ4a0VuMlhSVW1yUTF6Ti8xa0d6UklMcmoxUDBUTDlPWHhqL283eVZJT2IwMlRXMnJXTHJxZld4SWUvRS9pV3dhbHVkM2xGVm9xQWR6NTczVVpTMmVqYnFTOEV0WE9wcldaOXFaNVg5ejlwekFDOWsvNmRqaGludDVWdTV1NDhsaFd4WWRZem4yR0w3OWsrNTNLSDdmNkhvY3I0N1VzU20wTXlqM2tVUjY4eUJHVkVCWmtaNlQrMHJiUlZycEcyWGZNL1Vubm15OENybkgraVUrL3BtZ1A1R2ZQOW5WTC8vall0My9JZDVjMmZramVWcm0ySjVDNHV5bzByK2JSYnovRFBlNDk5Z2p0bnFLZm5wWkcya0JJV0hoTU9YY25LS25abTFSbUt5S1FnRW44UVdNR3doOFc0RkZqak8rS3QzeDZUR1VkOEozdDNtaU5MdnU3SmEvZm5COGtDblFZQi9XSlVML09wNXlpbVJjY0U5a2VaR1NVOFZsTnFrYXFveUZobDVJU2J2WDF5Y0Y0d2Y1U1h1SVhmOG80MUsxYWRIL1RCcm01VjkxTHBtT2w4dGlJODJxSzZZaENQTkRXSVR2MTg1Y2cva3Z2eXAxZnZKSkpQMmthdnhYWHpqVGsrUnA4Myt5cUY1NFRKM3NYTkc5TDh0Mi8yY3QwNWJRbGVQUDRSZS9sM3R4SzV0cEpUWDNybzV2VUVaT0xWbjJZd1RELzU1ZEJlL215anFNNFovZDVIS3AzTUo4bjdaTVVONXJSejUwVzJnZjNMaGZmTUhxb3VQRk44c1RyeThGR1dPY1NlTHQ0VUdMSlluaFMvbXA1QTNPeFk5ZE92WHVVbUxzVDBnZkI3Lzc5cDhhaGpkK3JPRmduM2U2WklFc29yTXoxWGJSQnluOVMvUGhHNjUrZGdjdi85MFpMYXIxMEdBYzJtVVNjc1ZEdlYzR01YLzBEdEpXWXJuV3JqMXIvMTNkbGpTb3VlZzM5dU9pN3p5Y04vNHF6SnpnM0JLcjZNa3J6QSsvSk1WdXlHZEE2b2VoMzdSWFpzYm1lUFYycmVXdFc3OS9zK3VlcCt2SnFtblB0ZEhNY3RabzIwejZuQ3NqM3VUdTk0aCt5NzM3UHZRd2d5c25lN3JYd3Z0aTVHRlgwb29kdDFPZmRRR2dRUnhYTWxuZFJVcWRpUDZmdGhtMGlhU2FIK2FKdWpSRmN1OVYyK1BLeHdmSlJoREJCSEVjdllyWlVuT0l0NWZUVWhPZExGYTZRbDRoU1BNVnVoWkc5czF3ZE9TeWsvbGNnSnFwMlVtN25SYzVWQjFyRFUyeXhPOWhpcHRianVkOUY2MTNidXlRcnMwQTc4R0d0UkQxWUxxeGxMOUpzQ2hsY2VUZk1POXNvOUdwOGUrN3kzMWVQb1o5ZnkxZnlrK0orKzlYZEg3bmFhbFFiMVIrUnZEc3RzRGR0TnM0YnJsR0hoWkwyb1M5RndKZTJRN05ZNzNyV2N1eEpCK1Avbk9ydEVSOCtKUzN3akk4dDlodnNreHVCNXZxWXZXelZ2UEZLOW5ZUkswY0dZTG1uazRZWmkvYkdxczBuQjhWcHhueWl6ZUwvc0hqdS95a1ByWS9TOXRiaVQzK2ljMUV2cXBQdjkrdldYL295b1V4czllMzE4VzVJVHNTUlZQTFZvMSttZ2l2cFZxN3kwVnEvMUQzM3pRdFErcHZzZGxwdnZxZDVOd25mVzhDZW5EVEY3ZUw1cnNocFRUeC9QU0hwVDIxWXlvSGo3ZFY3NU14K2ozNjBsQnpSZkJhY0c2RmRZRXB4SDY3bEN6KzhVL09jSlg2Kzl1ZTdtaGRpSzRzbWdxN1dhL3FyMXZSb3JTYy9ZeHpmUHFUZFFxSlYzYnFmN3ZoZFpzQ0drajJJU3VQdnprWmFaeTAyNWVVZWF1cmNtS3BIdFNCLzJPTVlVTUlQNU81MHlXM25wYmxrVG8wajRYZVdGT3pIWGhMbHVPVzJOckVSR0NsVW5DRkYvTXZlVDZpZiswcUw4cFBKRW5zWG1GZFJCNnFIZWVWMU9PMDAxYkQwcWVQSWtNN1BrQS8xdndYeEplWVBscDlsQ1RwQllEM2xXR24xMitQaHNvYmZySnhQaTF1L1NsRkp4S3M2OXlLdzcyNmlwajJobEh3Nkw5WjJYUUcrTHVLSE1rS2MyZEtiSVRacmIvcTBlN3pLbEJrN3IrNXZDWXRYNjFCSHZaTEwzWENOeGh6Vk55U3Zmem0zeTduMGRrOFozdzI4UjFaZHJnd3V0S1pVcDNJTTZ5Y3FqMXhONGpjdFB2Ynl4d3NlVmtOWW1LNzdLNVpjVlN2dFV0aXQrNzBVekF3M0o1RU1jMXdQNU43bXlYeWgvcEZpcy9kL2dsSmNVaXNmeXlpK21LYWEvbGs1YzF2TlduU3VDWFA2Y2xFeEJONldpMTZINE9hOTVyMnpOdHJPQ0ZQeHRCRCtpdWZJbGhYK3ZRL3U0SkppNDhIQ3RyY20yOW1GSXBzSUdjM1g1bXV2bDhrWFRIVEh5SHVydHlzY3kyZnYwSGYrVjc0MUxTc1g3OHJZb1MySDNHWnVSeVdjNFFGRmtReFJuMm41WC9zL2NrcjlMemtIUTF5UzgrcTV0dVkwZSt1WGhKdHNpVys5REFxVEhjVnJrNzlGQWVudkw0YkpjK1g3L3VVTm5GSGE1ajRqY3Z2S1kvTkdWUDQ1QTNHRE5VVmRvdWR4ZDVJYThHVUpLTHRzK0MxeHZtd0luSDNtUjloRjBmRzlMOGFMaUhmZDQrT3lxbjRjM1NCdEJQbi9uNW1mcnEzNDhQcWJrazNiYnFyaEs5L2ZvSjY0emJSY3J0UGVsMjlhMWkzbmdjOTFQWDYrL21TakZaRVFBVVNGNVpsTmVwaHA4eHVkSlFTNXBkQzJqYlY3TFhNZ3JqTmFrZ2piYjFnOEM2NUwvVFVxSzduOVRBdXVvSFJRbXJueFMrQ1FnOHhQa1lvNDRZQXFpZE8zNmF3bXFjY21uV3djVFJJTG9nQ0h2QktOWWVodWZDYVRNWkJGamdqTTZVNzRURU56a2tSN2ZCZXdDMzVxdTloSnZKL2dkeFhIczlBV2d1cXZ5aGFDS2doRVJZNU9TNmE3KzVSUlJFQnBBWDFIck1nQ09vMHNmVzdVV2tOK1NybXJmYkRwYXZGejdybURSbVAvRzBRRFhuckI1ZWt0ZVB6S0pDQ0FSNnVOQmRFcXY4MlNocDVialJSZTJseWIxcjFmOVZuTzR6dGNObWhqdzN3VWZhYUZmYytQT3ZLSUJrRGdVbC9Eb01hUUxzRCtRNHJJZkhTeEZXb0dLVTcwSDYrVFd0STRma0xHd0hRQS94L0tucFdsWVAvTlh1aHJNNThQOHhDOXFJbUo0MEVqQW8zZDFpQUZVNmdBMWp4OFZFcXFsMDduZEhlNElBUUh4YXFld0FMVTNNTU9UOFBaeTRuZFRnZWlBc3hFZkZoVVYvMWs5SDlOb3Q5QkRCR3pBT1M0bUpCSXExYW03QTJGUXFNcmlLZXlpblpXNjRPaVMzdk94ZVlSWUtFUlVLakorV0V1a0RpZUFNZy9peURJZ205bzBBL0RwYUVKMVEyMHFjdXVlQWxoMFhWZ0IrYlFyNUwwS25ZYmpaRXJFNE1sd1duaCtqY3BLM29EN05BQlg2a2VFTy9PQ2c0VzJ6M0dBM0p4T3hFT2xTVjBmeGEzRWVTYlVaTENZb2FHVzd4Y1h4dExQNFZoOGhKSHBMaFJnVXdMa1dOMlFjSFZ4Y3dNbDdSNHNScW5HUlprS3BSS3FVYTVQOXdjV3JIbHlGMmRFb3BLQmdXR0VSUk5BUXJhNmhUaU8wS3BwcDdBQlJyTlViZTRpc1pqRFpMTGVXRjVjMVRtOGJFcHhabW9vTGNlRElGeWRYWGc0ZVM2VjI3clRnLzZINEwwaElmejhlRTFSaHVtRDNsS2MzRFRudlo4U2M5bzdpZzgzbGZCNElHR3BLa3hkMGZBczFieDVGRitsa3UvaEFRdjFNaXhIS01CTnZpNkpJTGhjTnpkQW03eCtNSUxHWnJ1NGlFUVFoaXdUQ1I1ZnduRVFEdXlCYnBBVUpvL3lmRGFBSWhCSU9PQkpBSnFhZ1B1MEg1bEFPZkh1SE9LeEpVV3h0QlNreWkvZ25aSUN0T0NKZ0p5ejNvYlRiYVlsaHVWSEV3bDhCVm9uTHBmTkZpSlNCNDNHNDNsNlFySW1UblVRdHJ2MU1wVjhnNEFBZ0lOZXI0Z3lsWEZpZnkybTBRb0FBTHp6NCtidkFPQ0RqN0tjdncvK0pmM2dWaVVFRk1BQUFBQUIvTFZTRi8xVUNvV0Raa3ZwelJqN0NkeVlvWXI3c05weFFYSlhDSmc2ZzJsdjVTdmFxSmMxMWZxVGJWY25DV2hQK2k1aTBBKzhUbTBLcFk1V3hmMUx5WmhPa3FkSFYvK3F2OVE5YUtTL1hKc1NneDB0WUNOSjdSeGdVTGRBeUlIQnRuT3gxdm5TZXBISHFkWXdpSHg2TC9VMjAwSTlGZUFZR2xQLzdjVVAwWU9VdzI0S3NBNG5tWFlNTTlzLzZpUnNsL21iaFVZZ0FERGF3VTBaTW1EQXBkSVBzS3VIYStDQUFJQU5JOFFHSkRvQURJSExOQVE4UTlNd29NSFZhVGlFdUR1TkJHSy9UU09EcUhpWVlnWk9aVU40SlI4REFUQlI5elFFQkZyZmc1S21DNG15NW5ZaEx1WkI0WUc5L0RNU3RHclRwVU05bXpvTGVGRUw2WVplVEE2dUNiTzB6YUtGd2p3VkpEcXJ5RWJEVmcyK3Fub05kUmJPb3M1VEhYWlNFWlJXMGFhRzBWUkQyYWJla3VhYmxZSlZWZG1zcGJOb1BadE5hdFFxbVMwVzZLVHlVdnVkNS82VTJRaDlldDBtMWNJRUMrbE1pbUdRSlF5SzU1WS9kd2JCdHV2SzJZajhFeXBSOVRuMThFcXh2V0c5aXQwelRhZ3FYbFZiUlNvNHBHaWFnU0ZoeTdWbVNaYk93am51aFlWVjlVVmxXb2ZOS2tDZTZvQktlVkdWWE5ZZ2ZSRUg2ZlFjQjZtOUFlMjZrZTZiWFZ1WGRWRmtGZ3RYeDRMVjNqay82WmcxcTMzT2FGc2NyVk5HeTFCSzg2Q2JSczlxSEsyR1BxTyt0VkhYRG1Cck82aHRrNmpwTkYzZDNSR3A2cktvYkRDcm90SGxkZEZsTldxVjFwR1NXb09vaWk0cU0xWmhHYkdXTmdvS2psaUtYZm1GcnMxNXNVeVp6c3N3S3pmTHlFbFhacWNpYTdZeUU1MFJqMVo2cEkyUm5wRVdhVWtOclpSQUczeTJrbjJkNU4rUmtlanRTdkF5OUR6UjRhU2RqQlh2UnVMY2cvbE8wYkUyWmNSWVA2S3R0YUtzRHhHMy93enI4RUdKaExZRldYcitCQlN5cVl2RXZTS09ia2dsUXhlaHFDUFF3ZGRQYnc2OHVPRnBhWXB3QkJhMmVvcVYwNzNYMmJWSVpka05NTlJmdUN5OG9PM21LSFFPNVptZFFybG1ucFZyWmFuM3pGUGQ1ajFyV3c5SksvcDdqbk1jN0cxWHZXUGVWRytZcTR6NXdMcGozYkQrcG53dk1iQitnQlZHZlkvRWhlanFMZk5ReDd4bGpmVVFXNUh2Q2VmQ3RWZko2R0p0UHpFRkdDOVNIYm5HTVhyMjR6RzA4VVNhcHpTME9ZVmpGSG5SWUQ0cUtoaEhhT3VqZFZ1MmdNZDE0OWoydklJSkhGWVI2emlHSmR3UFdTUThvdStFQUFHZDZKd3B3d1dFcDNXVkhxZ0RLTkUxYjlNajRCV0JKd0hwbmJiZGV1Y3RYNzAzS1FBQUFBQT1cIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMjlfX18gPSBuZXcgVVJMKFwiZGF0YTpmb250L3dvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFCdW9BQklBQUFBQU9ZUUFBQnRHQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHa29iSUJ3OEJtQS9VMVJCVkZvQWZBaUJmQW1mRkJFUUNyb1V0RG9MZ2c0QUFUWUNKQU9FR0FRZ0JZUmdCeUFNaFI4YlpqUWpFYmFjdElKTDlKY0hOaGxPQ3ZjK1V1V0tpa3ByaFlvSzM5ZzNvb0pweXVLTHdoNXViaXkwVjB4UC9sc2pKSm5sNGIvOWFIZm12emVya3JjNU5NaGlpVU1TazdpSHFvbVFDRWxiTUUvSjV1ZjViZlhuUGg0UGZJU29nRUU4TUFvTGU5b09RREN3Y294R3hzeUpzcWFjS21kMjE0bnZaa3o5TVRiS2paellLbVZxTFYyNlhUNmlaN2dnbkZGMXFiQ2QyWms2T21PcVJOaEdWZVVqVk5wTFhibTdsbVFaZnNZaDFvOGlCWUEwNHdjQyt5NUE0QUNwcUZMMGVPa3lxVDVkbWFiSjFmUzMvNm1Xa3BjaVQ5WE5RT0ZqdnVTRVhkVWg3eTI1NlZMNG9CeUFUUm9WbldNdHozZlhQRGp5U3FlV3lkSFkrTCttNmdvU2Q3cFRkZW1iOUd6bDBTbHRtTXhrckh4N3Rpekw0UU1nRHpoQ0FvLzBNMDgwMWVoV1NIZlNsWklMYVRuZGZmTExYTWZTSkxjcXBYVmxxMjlQdG1US25pa3ZZNllsYzVaMXpyRGxOZFFPTUxGMkxKc25WRkdJUC9ibHI5VlhCeFM5R2ZGQ0NFMU1tcGlFNWxoa3pxLzN0bFFBQXk2a1lyY2Npd0FMZkFpRWJKWnBZdkpwRHVLbUpVaVlscVF0UUVEemQ4L3VaaUFBTVg1QzBxdEVSQ1dvZ0FrNEFOMFVKZkQ1d1Rhamp5YTdZcWl2QXZjYjljV1ZNUGRtY1VIOTNMdjVqZFZENlNFUkF0K0xMWjRISVAzd084Q0xtMXZ6bWI1MUg2VHRLMkFTV2l1ODc4TkhrNlBSY1lUSkxqTEgxODhCakc1Z293RGxtTkZjREgzaEdROFB5R01tM3VLbGJBdldVdFJZaGlCaSswWlpJd0w2LzJqU1NNeVF0QXdSck14RGRsQUUyZ3RESWJCRkFJSHBYWktBdVN0eFlnL2RwdUZRRml6aktkOG1nV2pJQXJtaGNuUUN6VXQvbHY0cS9WdDIwV1FDVURERVE2Nm9EQjFIVjZYSHBiOUlmNVAvMFUzbUp0ckc0NDJyR3gwYmRXdTlhKzVyM1ovZEJ3UnBSZU1EaTc0QXd2VjlJZzM0b1A4Z0g5MEcvZ3ROR3lRRXN2eEhBQzlkY09nMjdZd2VjUkZLNnh5ejIzbGxjdDZDblVaTXF6UmhScHRUeHN0bTZETnR6b2duMEsrMXhDeWlEZFljZGNFejJ1UzRlbzhweDl6QmVmTmp1VE11RWVYYjlKREJUZXpydU1jalVULy9TUmRkMVd2TVpOa01kYm9NMm0zR2FlMEdqRHFZdi9ZVlQ2QlZoeUg3U3d3WWRJbWYyd0hUenJaWGhqWTZDZndlakIybG5RMkptNW84Zkdod29MK3Z0NmU3cTdPamZaZXh6ZERhMHR6VTJGQmZWMXRUdmJPcXNxSzhyTFNrdUtpd0lEOHZWNStUbmRWRDFGNXVycTh1TDg1T1Q0NlBEa2ZEUWI5WGZmYWcyRmpmbmFja3p2bGd0ckdubGFVNDJldk5QZFg1RURuQ3o0SkJSM0JuWWtmblVuYU50ZDZ3aFFNelpiWWlUclZlNFhxM3lJWjhDQlBuR2wzdzZLd1dLclVBb3RSZEZqamUvUVRqdVN3b2p3RTZYTnczd1oySitIQmQxUTNkWXpJQmh0U2ZUeEFZdmVCTXdyc3I4L3lYYVF3Nno2ZzV0aXd6YjFtU3NOVjZHUTRPRGVsWU9mVkFPVFVaalBQNnlRMDNDR1cxUUJWejMzY1hnQXhPVzF3MGNJUy96WCtvQUZVbmdqQThQaFZ0YldEQnBqanRYRmlYUnEzVWxyeHZtbi9GeXBQRXR0MUtCSjJrOGVmaDVQSlBvN1UwR1VCOUdwTmZDU2tQSForMjloeEVDcnN3UVF3UFlkV1I5ZWE5NTU1VXo1ckdXWEhsc1JJYUYrb05nZ3hMZEdzakdKVE1HZ3BiMGdtUndiQWpHR0tHVEZiSzV2YVFER2ViM1FJaFlNMVNQMEhQWE8zTkJuZHJidDF0VVF0dFNGZ21mZzJqL2tISUlvVGZVbXpCT3FydytVNi9zZm9WT2RNUXFYUEZVQVV5WE5GREU4RytobHgvWlo3WGpBZXc4M2d0djZXd2pSc3V4Q0U3Nld1MFcyV2lBY2ZEMnNsWmtLa2lIQXplOENNS0JORWczSVdvRGdSai9WMzc3aWlNcnZkSXdqUERQcTFjcWJmTGxHVUhJODNQNnJGR2oxdW1jc1VHcDBNT0JscVdpMmRVaHNBTUpsd0Z5d0NEbWJzWTFMS1Rhd3BCTGJqMUdpb3E3UmdWTWlwL0xWaWRLREFKbWNsZlphOFNra2dic1o1MWtPZ09Ndk4xOWpvc1VMZ1V1SnIxNzdqa2t2WS9hSjNIUkhDbjh0N01mWVNxdzNFRTB4MlRHSFNzOWZ0NXUwVmxnZ0hYYmJkR1o4bWR1Tk4zb2lCc0ovVnR0R2JKeGtsY2J0VzFocTFXbmFuYnVsN0RMVWszbkU4RWgxMTZhazV3OVlydEhHa0tkd1ptQ0RES2E3K3VkVDdQWlMyYW51Y3BYMGh5YjdTa1NUUTA4VWFuSjR6M2Q5dXQvSTZ5bXVYWmljZVNwbnhnSnZQSGxvMkNjZUJ4eWVtaGl2VmgzNE9ZdTZxRXo4UG02QTNqYXUzaGN1cUE3SHh4aWlBL0YwdFRQMlI4R0pvMzlyUFdvbGdnQk1aNHIyYW5DaWFTUU5KcHRIRXB0aTdMS3VzSVlPWXhqWDFMaHZleXVHcHczYnM2WjR1b2FxUXE0MmQ4cGsrSGVxZ24rS3FucXNlM2t4UmpqMVJDd3gxSnhzWjZNTHU1UzBlY0UwaVpzSFFxYmpxVFoyRUNqb2tGR1gvS1VRMVI4QlNDaW9hMU5SemlQVFNQZ3d2ZXUvSTBIUEl5clJZS29vNk8rakE5aFFZUWpva3hPMk5iZ015NU12YkJ4U3N5TXdTTUNtQ0RldTBiR0ZLbU1sY1F1SVd3Z3l0SkZiY2R4eGxVWWM5VkFMckVsbFIyZ0d5VktkbjZCcG1CUzJpNXdZWmdmSjc0UkhWSm1BOE8zT3pwY3E5TzZOUXR6QmVaU1UrdTY1dXpwWUlxNm1vZFRRR3RJQWVnL1hOZ05lM0lVSDE2MnN2aWhrdnpxMGJDSUhQTDFXNlNkbHNDakFpRzZuaWhRTnk5b3dTMDVra1R2TS9pU0wzeldFZjVDS3IxSUl3aDUxdWpYU0RRbUZCc0x3ZlBLaU5CekJEU3AyRWJkeGNudkZGUG5IQ0tJaVQxVFFmT05sNHRRMy9pbEpBbm41cnJvRURkOFlBUU5LVUlDWE1WSG5xWW1XSHM4eEE4UUJlRGNKR3pJdE0wbDFKRStJSEI5NzU1VHpZRUd0UzBwMHZ3R0xZank3WUFKSEVLSjNMZ1EzVzVGd3NaT2dZWTk2bWV0M3ljdlh6VFhHS096SHdOU0Q0d0h5Y2xuM2JvQXJxY25HcXBsUms4SUpxa0hFM09mbXlVdlJOcjJhNmFhb2kyaklSUnAvWFFraDlaVFE1bkJ5TDJvTHppckFLUEsyQjFCdEQ5L055ZktlQ2tRV1RsRmZ3clFTNzFreFdLTmsyRVlRTlh2NDJLaXUwdFgrZDdKa3cvcVV0UEJYRGN2R2hCYTZBb0ZKM2Q0cUZqd0pnc2IxanlpU3VVekNNM2l1a0Zhc1JqMGlHYnUwSW1wUVJMRWNjaEVrakFCV0RrTmEzajRHVmpTSHJKU1VaQVo2TmpzR3U3NUdJSDVZWmcxK1FDc1JobUVEQ2xmZlh2dHA0MHZ6TkJnOVR1NmFWM0VKdW5DRE00U2JsWjg5d0JocG9XVXVFci8xSThVVW0zcGN4bVF4UmU3KytoVFo1RElSS2VVWUoxMERTYlg1c3I4MVlnQ0VlU2VEWFhwcU1UaFBDVHJESVJMcklDTnBFSW9oUk8xYk4rd2p5S1FBeFIyYzNHNEpOZU1TRXI2SVIwclV0WjJyRHNFVnNxRUpobmZBN1lUWVNsMXBPRzF0Q0dPYUplOWNuOEQvSGFXd0NYZmJzOExVeHJ5VnVCRjY3ZFVpOWJrTU91U2IzdEJlOWx0WDFqcGZ6ZllVMmNJOGwvdm9qb2s5RUEyT294dVBucC96bm5PWmhwbVRCL0RnVFMzbjNJZVUvR3MzSmMxN1Rvb25sNTZHamFwZndFVEFYL2d6aUVQZHphVEpxMkEydDBqQysrNWI3cHlwOTZWN3g1UGJqY1c5R0hDSmJuMmk5Q1BsQWx1VW1pYjdsQWZWbVY4Wjc5am5IM0ozOTAvdVA0UEJlMWNFSDVpK3pGcnlIRmZ6T0toTUNNVkN1ZmVtRFJOUCtKNXl1SWZOUExTaTVWcVdLdnRaT3E1Y0FTNzl1WGJ6MldPVXNld2lvUlFjNFo3OVhBK1lvdDhyMFhZUFlQbWJzeGlZMHA4UXZycUwvc3FwYWtYd25VRFZ6bWJ5MFhqaGhZNE85c3ZZU2gxSmRpMHdDdHBQK3VWNjl1VXYrWnlsekxCU29Sb3Yzd3JlUVpWVTBkYmFybkVwVCtDbTFnMlRTL3RyVzFhNzFHajJpdVM3Zk8vT0NYWU1pbGNEYXhVOXBZMWNKeGdINFJVdU8yUzNWT1o5aHlVeHBqNlpHN0EwWEV6YzNqenR2dy9xc0RBaG93Z1FRT01Fd204Q0J0ZkdacVlVUDVMakQwQU9TRmhJYnN3ZEZ1NjF1cGdBQWxOTWMvZU1FenBZUTVNRG5OSlpUK1hVM1Jjd0ZhSUhSWkpvdU5XNXJ6elhDT2xHWER4Tmx5SWpaU2pqbFh4ckd5c0pPWWk4eGxEa0lyRWpxRVZyWmMxdVFJdWJZNDJ5cVRxMlViT1libXpLTXJLOUxacFNVYnJSWFBhQUZjakFOc3pKelZHcWV4Ni8ybHo4bVJMMVkrUk4wZmZja2FYZnVndFd0NW1mWHFhcG45a0J6WkVoaUpMc09xc1c4UWd5Tll4US9NTUZaeVduRTJ2WTFqNENFTDQrWGxaVThnYjYrc3JMZ2o0K2d5NEtTR2ZPblRFam15c29LNlZ6TXlVUGNLT2JLazBxeXVscXVXbHNBSTFDd3NBMHczcFRPZ0RxOUFRbXBWN2RTY2xlc3FJNU50bHVYeG9ZdUdCTmU0WWlhcGtzdnE3T3VtWEtGM051emJiSjdPd1YyOUh0Mk1rek4xWWxuQ09ybEs1WEphalF3Nm85T3ZvNnY5L0l4d3J0WWZUS0lYaTRsNUcwZlhQb0N1YjUrVGJEcUpXUFI4RW1OQjlrYWJHSDNueUllMDNvOVlvOHZMbnF5alFhTGY1aWtPR01BdXV1Um0yRmlnRUNCd2dyWnQ5YzZYdFB0TENjWlowd1VONjhRRHh3SUg0K29WNk1oejdxRURDNFZBbnZ1K3JFOVM2b3VnT2JZV1YyVWVxbnRnNHdRU2RPKzNZZWF5K2wwQzFyVjRDeW1vaE1WSWVLY3laQ1NpSGNtS1BxM2J1bmF1cW4rMjFZZW8rd1Z5Wk1rUm5mVmdtemJ5N3Blazk4S1VITjlkalJqSVlNRkxoNXEyVWdWcXJ1YWxKd3l4U21yYnl2bnpYazJmRjBYSVNNM3F2ZVRlUHE1L2xvOE92MWt6L0k0Um8wckh3eGJ2a0NPTFlwSko5SGIrUmFxTlp6YTBSTVkvRFBGcHJxNzZWYVExMTBZdHhFTUpjR0RxTzMreC9lYi9HaTVVcXh4UlZ1TnJPV3d6VHUyQTlWaWU5QWVWWndudWs1a2tpMXcweW9vWFVXNTUrbDVaaGF4NmN0SytsYW9zS1VzWFlYRkFYNGpiNEljKzNYaHE0TnZlTEVSZ0hwMnRyLy9rZkRyL3dwdjBpbWVleVE2UE8xMXc0Y3NES1FHM25qN3h2WFVnTld6K3E2bUVqMDgyOS9UQktIRWZUMzF6a2ZINjQxUE55di8vOHRSZkwxdy8zUGNMZS93OWUyK1gzNjRFZEQ2M2YrL2VrbzdJTFh2cjJua3V2MmI3NkpLazZlMmIvTDJsNllNcDF2NXJFV2xqYVV5N0Fma25xcHFNc3Q5RjcxU1VwbFJwYzFMZkZWZzZuMnBhZS9ycVc5OHZiejdNL0xjd3Z0c2hwM0EyWGpkcnVQNzN1YitaTDZkU201V2FsanJqbVdoZmRFZnI5WEdBZFhVVGJUK3RQajhsS25WeldNRkFRNldEODFMRHpHZk5ocldUQng3Z1hYdjJkVmRlVStRb0hxVzVQdXZVZlE0ejdsdC8rYlUrL1BHalkrL3JHdXVZaGtzUXZyTThlNXV0aEsvWEsvV1R6MFhrYjllbzgwTWlJdk5DMUpxODdiellIdVZZM09yRWdiZmlPNXBmaTk5eklHbDE3SFl2K3JYLy9KRmYra2VRVDhydGF1K0R4ZkZwcVVYeFhnZXJhN3oyRmNlbUdhcE84K0ljOWZvZlhDZDR3WlhSM2ZLbzFtdXFnbWYyZktBY2IxVWI5RG5sS3ZkVExWeVJQdW4valVjK01RdDFJTlQ4blBXN2pkR1NBNC9kRzRhbnJ5ZFcrc2VUcDMrSitOTWhKQ3RnVzZaQWFPY1dLQmU4bTVOYXFTMU5xWGhYUk5lVXFXdnVXTG9HTEh5VE9uZHIrNDkvTHNZVm4vbnZxR3A0WTdqby9mV1RKWTgzSHF0NlAxLzcrZWxjL3YxYmhSUkpJcXYvL1NCZzh4NExYMG94dUd0am41Q1Y1b1ArZmx2ZTNITEM5OFRNbXpPWGZ0aThoM1BuZUZ5THd2YVg5cEpCYkVoOG9IQjJxTGp1eU1FRDlZZmNXU1JKS2tya2Q3SnI4c3Y5UmUva2RtaWpOQVpONkxzaWRYNVpWczN6MW9GUkNxS2daUEtTdW43K3ZSdU1xUXN4citWeE4vdmtXMFFFcUN6cGpxdjBaTS9HMkxoc3h3QzNKR21DVzV6VVVkcjMya0hXa1psRFpXNUpWSUpyTE9WSTliMHVJY2xoTi9WZ1N1QmYrQnBSbnA3M2xXc1N2eXJVYzFsK1p2aGVsNzgwV1hJN2JMNWlJUDdkaTJKN2xMZDdhYjhObkR2eXk4QUk3YmJRUWJGZSsxWmtaSGhLYUxLNE1kcnphNnVDbUhNVGJidGtvM1lqUGlrcHZUZE9rZnJyaFVXTDdVblMraWpQWlY1YTBONkN4cmxrWTZWcWZNODdmSEwvNko4ZHZtV3crS0NrSkpMNGVqWTlhRjlSMDZua2RndmxENjRUbHNHVjBWM3l5STcvQ2NhS1g3ak9WVGJKUXBPcHhtZzNJZjNla2RUQ1pDdXpxQ3ZDZlhHc05DZlpYbnZYTVBiZjU5N09aeXRIUjJzRUpNbEpxM0lBUjhWbUY0YUhjWElQZkRBbnIwemZrVnVSYmpFbkVzYnJZd3NmYjFsL09Lc1BJOVMrUEJxU1NZWCtMTGh0TEwwdzZiQ04vd0UrZmV0NmpDdmEyRjZlbnJ1amFvZlBYNW5lVmZxTzRCZnpMaUdaUmpzSHNaQk5jSGlSNmY4Q3NYNDhYeHVkc2prMDRtSjJwMWxERk1ZWENoSVZ3cEs1empuTVV5TDRhejFKcDFJMWl5YnVOc1lrNXpiSFhCa1hSYWhVcVZucmZ6c1NvYjRWT2R0alBKTHRvdVEvaUJWRGQ5dk5DcXNHUzVXcGRoSHlENlh1WTlOTzVtY1VaZ2R1TFY2NGR2a0dZK29RUTEyZnJsVTFacG9saVE0S2prYkZ4MGVMZWtVM2QxVDFTTlN5YXdkNzJ1TG0wYkcrcU1qNEt3SlI5SDM5L3FHbU1DeGk2M3VYdFpWbU93MjJRc0ZEaWVUQVhObWNMMlYrQmlNR3JweVl2M2p6RE5rOXpZeG8zS0xPYUFoaXhNelpFYUZLNXgrV1o5SWtVUStVZWlXNzYzSmtYb2hLazdjak1pSi9oMGFWSDhMRW5BRUJGQWJZZVlLMGhXa1dlUWhVQW5oRXc3U2NxQmNwcUQ3aHhXQUd2Ym53RFU2emVVek1ZTUtaRU5jbElGTUROcEVGL1JrR0FHREg5d2wzT3UzVEFhVVJlR2E4aThYdVNubnNybmc5dGoycDJQWjRzNzVETDdZajNvN3RURWxOSitWbVZ2Vm5oTFRYMXNzY3VkQzJ2UWxPTC9vd3RpdmRZcnZpVG14M3V0UjNCMVRmZzlYMzZFWDMxdlJDeG1xdlNjU2tGUUhTNlljQUQxQmgvT0pIaWl6Z1R4UUczdXMyRkNscVA4STZSVnFLMWlWQTNkdFI1dFh6V2l4Uzd3S0wxRXNZaTlSRFlGSHRJdFIzNk5WM2d0VkorNkUxSHVFU2c4Um5XVGd0UUdzZWJxdStncHFOYU9ETncwUEZFbmpSd0p0ejNtQm40aC9CUnlUZVc4L21TT0dBKzAwMmZtRGlhakNxWXNMQXEvV2lPNnhPQm5qWndGdHl2cmw0S2pZL29YOFFJUjhDbHViTU1TZUZKRlU0Q2RVQkZzdEVtcGxNbU9QQjRqTW1wYjRGTnRueE5wTlN3OEFZeE5kTkNtOG9PdUJ1ZzlPV0pMV0g5U1lILzRWbE04elJmMHBlcUowVXNVemtPWk1KYjNOS1hHVEt6WTJxR1N0YXJtU080VTRsTDJCMlBSR1F3VzF1RG9xdzRIMWd6K1RpT1VWQTdmZ3MyQ1E2THZrSXdiMS9BbUQ3T1dWS1FVSmhrck9mMFF1YS9vaHRJUlRnRGJLSnZtQmFBS2kvTWtwTTB3QjF0WEhoU24vRTlZd1NtUGFKdVpMZ21MSEJNQUQ4NStQamhKd2owK2o5OUVYUUxNZTM0RTIwNWgvcVZJUWZ6TjRnT2h1N2hpMXBaaHllUDBmOEJhZ0dJTU9RMExjd0RJc0pPUmhXUjBPOEhCbmFvMkVRZEdadm9JQ2IzSUhSRnlBN1c0QTNvQTFzeGg4T090Qk1uSnBGTUVvd2Qvb2ZqQWNMY1p6b05MMkhzSFNQNDg3cE04eTRaZXdDOFpkb1lkYWtHUko3TThVTXcxeENEdnNiYTJaSEU2aGIzVXZZai82aUwraUUyOWNhSDFvSzlHL3pqbnAyRW04bzdmNkl1NGNtR1hCM0VNbUFROWNrY0VEekREaWdTVWJQQVUwQytHSzFTSHhIZGdmTVA4eFRab25rMGpuZ056NDRNSkFFWE9GMlBYMEJwcGZqYzdoK1BKbC95Rk5DaDI0QThIaEVBeUUzLzRpcm15V1NTKytBVC9EQkFaOU85Tzh5ZklPK01ENFg0L3J4YXY2aFRoWE5ray9NaGV6L2kvUWwwelN1amNFaFF0aEJsbUZ1Z1R0WUJlZlZZUjVsYjcvV1ZBam9vRTZMaFBKZzRjejZHZFlraU4yVjNPVzE0MktiT2dJbjVXMlJRTmFsUnU2UEFXYUlJVXVja0Eyejg0RHVKVEIxdFZkRlFPTlJTRUYxVis2eStqNUNOcG1vYmhRQmxWZ2liUWJZMWwrRnIwVnVzQzlxVVFwRTFsZjVDaDJBcUhnbEVsT0xaQ0kvWGlib3V1elVyZUFhYm1hb3hTUU11YkpRSmt1RHc4T3E4OU5PMnhDUUI1N1ZnR3JRVjMyaFY4ajFLLzVPVHdlQmltUGh1OGdtZ2h2NmVnT1BtWU1PNGtQTTNBQTIvanBKd2pEM1BGcktDTmlacEt6Vjd3TUZ0OXZzdzlzbHExdnRHNzFBQWlIODh3WGMwV09DcUtGOExGQTBNemYwL2RSS0VCZUhEZlUwMUtDNk95eDNyN3VUenh2dEVVaks1THR2VnpHcE1VN1FGSVgwQWhqSVN3K3IwdCtwbXIyUEhpTnVHNE9MbXl3SlNtZnVZanR3UkF1bnp6K29mcE00ZEhNeVU4ejJpS282djh1Y1hnL3FJRUcyREo0amtENnNrbytVUU5CdWQ2a2JVU3VrekhOWFdkWUJUbVExdys5YkNZcDE5T1lCQ1U0RHZFNHcyckN0ZU1XbzVVRDRyYVhFMFpPOUR4cCsxL1dRcU9Pb2Z0UkpWR0ZWU3g1WHRoYzlpVXF0OVQ4SWhoMUp2WThCa2xrVFN6ZjBsejdONHdYa00xZnpQYmcrRjhFY1JYMDNmanBRVjZ5ak5sRWhubElISDJLQzJnU2NKUkR0bTdvNEY0Zk05YUtVNStNQ21rWXUvc29mR243V2JaR29yVFhqd0Izc3VyQk1SRngwSDhyYTlwVjFZTzFaKzFabFhWdVhzd3FCWm5VTWJac2xiY3ZJbWxvTGEyTE5yWDNycU0xbGJTTmdsV1lGd2xBZnBRN3lLRzNhTlJFaE5nMzBHR1R2aVVMNXVmZVpiTUorbWpldHFQYWd4QTVvdEFhZ09xaEsvOTNTOFYrNU00NTRNaHkyaTJuMDlscUV0Q0d1YTBOVUhzN0d6a1h1cUdDU3VnY0YwTzI0V3JWSDJielh5N3lyZFVPcDNoR00vTmRmMVlIdkxPUTBwdkx5Skk2TllZM0VmV2M3NmJrL0dPWGs4S295YzRNb0VqUU83OHAxRm5mY05KVXlFU0tVUFF3T2tZelJVUFkyMDZ6YmpNcXdmbnJOcC9JL1A4aVVmMGIwbmUvSTNMMkdBUEhsOHlNQ0FqQkEyTEdiMVIyNTVsdC9aN0tZQVBqKzNpdC9BdkM3eFRuMTM5bjFoMmF6ekFKQVFBQUdnQUx3bjRCVFkyZTZ5QjhrMWVuMyt5enVlSm5lRHhCR3VGblB3TTJtaDViR2hpdXhBVERFbWY2anI2WEZNazNjaHV4YUIvdmpOOGpPTUppT2NRQ3NrSTk0NnhNUHpRdWxMM3ZHdE9EMVRkTTBGRndtcFlhRmpOYUFGblJIYWRQUWtqV1FQY0wzMkkyL0V2ejlnR2I0VzB2M21OQkFpQkRHZmdyYjlONVJtRDdESVN3YjlxZWdDVU9YNUg2dWdJLzlFRWRsaXZQUUQxQncvdUxBdVRvd2lITThKRURmVklDL25nQi8yRUR5QXlvSHNUbzQzaGMyb00vaG1iMkVjdEVCQXg1djA2QytZTjRMTkxSbkdxN2tVcmhablBVV2RDS3dkS2tUQXlhODBFa0RIMjkwNGlEMlJ5Y2Q3SXBsaURBOUZuREJ2MFRkQlFGTW9yWk9CQ1FhcUNIb1U4ak9ZKzRSWWpSbmhjVC8vczlCdUJxMURPcVZLMVdta1l3dm55eVFVU21oWWpmWlExaFVZNUF1SDBSREZDa2pRWTBLM1N2Y0I2R2FXSlJwWGowdVhjbElGTFZGNVdiZXZKVXFWeUMrMVFXOEZFYTVVMHBZMU15cnF4UXJFYUxhSXhwMFZXTlROU3hIY25OQ2hMbDJybExFanhlZmo0NHRvaVdMYU1IVkU4c3VUeGcrbkRnbU5ETUU0Slc3VWlPajNsODZIaWhia281WHlLZFhHNGpuUlNXcUdKZ1JwZjNTWkZFU1pGQ2NjNUZCWGxIaUpTa0ZPK1VQaUZpRk1LRmNvVFMyd0c2YUJ1a1Q5Vm53OVFuMjlMYXRCclZCMXh5Y1REVUZtNmpHNEl0VVErQWRxajVRMm5XQkViVkJKcW9tSUtMYVQwL3Q5Tk5WL3BwZDZXOVgrRWFVKzVSU1pUN2pMUFdwcDBwOElxbGlwWWtxVXQ2aENwWEpWSUczMzg3MzFubGVxSE85Um15OVYxR09WeUNWN1lrNnk2Tm5aM29VNlR4S0thMkNpaklVK3ltTm90UnFkN1JWYmpyZHpXK251VVdrdW5aUkthNGltZTBrRjUzb25PMEVKeDN2VkViRU9ZVlFzWTUyaklPT3RpYzd5bDVIMm85R1JNajNVK0h5aUREcURoVks2UkNxWisrUUZXMlhsVkxicEtDM1NpQmlpN2llMml6ZVlaTTRtUW9LZVNWd1NQdjdpWEVyZlJTVW0yc3k1U29RMldhN2lEd3BaNmNReW9scmw3NTFSenNsNVdCTFVmYTJKa3BPbFZJeUtvU2l4RGJDYkttTm1KSllteWl4MEVTSmZHMnBMSnRnWVZDV0hZU3Rzd0xiN1oxZmJxYVYwbEp0b2VTcExYVThIY2VYcmFiNzRtcTJEdGVaNDUzNDA2Q1ptN2hxbGkrcFp2Z1NhcFFMNm1rZHFTTjA5NGluRFFQZEEraDAxVlBBZVlETWZKbHFtaSttWnVvd25UbldpVDJ0TkI3UVFrTG82Q2JhTTY5U3hOOWttTkxpNTgxU3N1YlIwTHhUK21WVlNHcm1QRUVUQnZYcExPMDFoQ1owL2VQaklOa1hQNzhuWFh1ZEJuT1I3aHFHaGFjMmJaeFdIdFlBQ29wTlJRT0RnSVJFSnVWUWl6NGtBTTNpV0xlaUZBRlBvY0FYdzYvNXNuclBEOUlHXCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzMwX19fID0gbmV3IFVSTChcImRhdGE6Zm9udC93b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBREhZQUJJQUFBQUFaTGdBQURGd0FBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR29FWUd5QWNnaVlHWUQ5VFZFRlVXZ0NDRGdpQmZBbWZGQkVRQ29HSEhQWmtDNFFFQUFFMkFpUURpQVFFSUFXRVlBY2dESVVmRzBaWkZXTmJSak00RDBBbzBmNFJSMUViT1NrU1JiMGVwSWpzL3k4SDNKQ0JiNml2UkFGUUpZclRLQjRpSEo5WWZHT1pWR0hWd1hsc3hHbkUwYjNXSzNRTkJlOGNieGVqRjgzcmV4VGhzVUZEK2FtRFlCWGI5Z2hyUS85VWQwc01ZNjYzY2RUaTZQZS9oS2ZmK3EycDgvUVpPTTVIemVYaHllNTV6NTBkZkVkQVNhbUxPOUJkZmhXaUZQeDJoZ2UzOVE4RUp4SXE0Z0FGM0lpSU9IYUtnK0dFN1NJY0RIRXN3QlRObkdqTHNjckdkbVhtZFdaa1ptdDYzbDNYTDI4c0c5dmExdlZML1U5YnBYb0plL2ZRbHVHcmZxaVpxN29NZUFBTnc1WjZEZExRMVVVbUR2RTdTNTZNdmFFcDlwVXUzZDBEU2YveXhBanlLSGRocUc0aU04bkFxQUFwV0ticDh1azhhWnN2MDBYN3Y2YkpxMnF1UTh3TmlIV0ovcjFOSWRtdUVjYm1wNkFHUjlQTTJUWmJtcVNWZEpMdXVuMzI5M05xWjdVU09EUk5BSDlGTk5BQk5Dd0loSDFSM0ZaU3RqdWJ3VGtpR2hYNGZ3WkZERHJwTkNXS1JHa1M5TWN5dURUTTAveWxvdFF0dytqTHRDVHI4UGN1dzViSmVCaHozNXpmVHFqdDdreFNVR2NjS1ZzQVZJZkptT1I5bDV6K0FLZ09FT0hmdHBYazZTMzRqc21FQ1paUE12VHE1VEtscTF2dGw2NDV1YkhTb1ExWUFCT0RiNTMwVFZxM2xsSXFRRjN6S1BBbkxJQUdvRDdjOGZsc1dxWFZhc3ZxQVduUSt6eVp2YWdEQ2pLaUpOcTdKT242MWEzdXF1cTJ5aTE3cGxzR1dyS1dKTnNMMHFBa3YzMGUrMkNSZytnUWpET3puZ1BUTW1jSEFCbFJoa0Y2ZWJ4MzJWMFFwMmllaEM2eHhzYndZb3RYMGQzcTFOeWlpakp6M3M0bGRFWWN5WXBrUXdpdTdQOWFsa3VnU2Myb0tBMStFM3Z0R0ZPcmlXUjBaUTVIUkJCRlpRa25tdjYvSzBBaG5mMzZBbEEyQW5CQThCNEtRcUFnUkpzaDBtU0NrQ2dJcVlMSTZVRGtiWCtVd3JTNjdKYTZZMEg5NWsvMXR3ZnFrWmZxclYrSEg2REM4c2J3eFVTOE5BTE0rWmhEZ1ArYkJzY1paTE10a29YQUZBeWdyNlorYlVsckdQeG5oRU4xNm1MZ2ZhUmFVWVRab3hSNTZoODZMbGRiQ254N2ZrcmVmbU0yQWVDMjV5UmoxbTJIR1BHc3p5NmNsSjNBWDRJK0U0U2cvN3E3RWRoeEo4cUtnU04wZ3U3UjVRUFVBQjJpZzFJb0dIT1JseS9sdU9uS01YNjB0LzcxcS8vODVuKy9tN0EvYm9oUVNaTGx5blBJNGVhZk55U1lVNmIxNkFVQjA2SFRJNCtyTC9qYVp6LzdaKzBsU2xXcEJzdmRhUlljS092a2VjQU4yVTE1Yy8vVTQ2emxObUJSeVdsV3ZlV09IQmJrUUlDUlIwM2JKNlBBbERGdEJlTFduOTd1V3hVRFlFa3dyZEpVdFp6M2VUV3JncDU1bUZZRmdRQnc1cEVxTFFTQStOT2pDZ2dPbERGckovY0JwSEFrTjJwSFZPZ3NHU2piNWdTQVNISkVKU1J2Z2ZraTF4LzZiR0hDTDNpUkc3S29qNTQ0R01kaktkN0VLbFNua0pTeE9NUjVRMmU5OHo3bjk1dC9ka3NTQmdramhLTkVtNUdUcTZzL3NIVHRFRVpleUU5YUQ4UjM4WHpibDJUZkNwdzNjRzdZOG03enUzWllHeU1ueWxZREV2L0VMMm5PSjhzNUNVdDgvajhiUHh0UEFlT1RZOCtuOSs1dnZ4OTNQM1Z4WWZINXYrUC9ldis3Q01CSGoydW9nNm1YWkp6d096NHZ2Z29lV3ZMS3A0cG1VUXd3OURLWkR3MzA1K0psSGhneGZZVngyMW4rQW5DZk1kdXZMY09hK0ZHVVZ0aXYwNUhsMGIraHhCYTdGT213VzQxQjdSR3V4UzZIYlBHS1huV3c2ZFhZWlo4eEp6cEw5YnJzdEYrTWpqaCtraDgyTGtJRnYwa0ltZmRROTBCUWN1OFBPK283emJZWmlIQVZHclRwdE51UU9xMjI2djg0K29SWHFtMjBTVyt3NlRTa3I3USt1NHpVUzBOTk1RZm9Ia3I3aHBHTkVuY083TmplMXFwdmFXNXFiS2pmV0xlQnRyWkdWMTIxdmxLclVWZVVsNVdXRkJjVkZxanlsUXE1TEM4M0oxdTZUcEtWbVpHZUpoWUpCVHd1SnpVbE9Ta3hnYzFpZXVGUjVtWStrTzh0ek9OYzR4VG1GQi93eDFtOGxBWGx4M0dRRHhuQXVpZm90QVF6ZEtZL2NzMkdOc1pyTmpEZ3F2bDRXbHpLekVIWGkxd2RCSkRmbjZzLzV2NndjTlNVU2RCbHdxUndhdGs3dlAwV2dvS0kwR0Rqd0ZPOTBUbWFyT21yeHVZWm1RQmRFczhtWUlvTkdaM3c5YlpGOEhPSVR1c1owNVlOdTVWV2xtdzRxcDJFK3Qzb3pwUlJHeFJRbWF2bWVmYmlMUzRSWllXREY5YStJdzRCS1R5TUdaZndoTC80dUYwQjNvSUlVdkY4NEtRV09NbTYzREp5cktZME1Xc2tlVjhtRjNHTlMyVlRyU1NDV3ZLekg3dVR5VDcxRnE3TVZYVG1IL3ZjTDRRVWhKcFBWOE1reE5OTmpIQXVJZTVpWHF0cXpWcEgwc1lOZFduYzlFanlKeFlPelpRSUs5MG1sd1pDQTNtNVRHS2FhalZxNEcwR1UrTU5ka01VdjY3WnNkeFJsMEFJV0ZycklJRlNGbnR5SU15ZTJUZEhsRU1WQ1ovNUx6RHRYd1RsSVB6cVlnNVNKTkpIL1pjWS9mSEw2YklRZi9TdFJZanFFZnRkVDNBZ0ZkZjNWcTBuOUhPL2UzL2hmblhoR0NzTzFDcHE2dzlTclRRVGRWaldhVk9HSUVVUUhBeGU4ejFobkpKQm1MSERHd2phK0ZINVJod01hNFhrZUtYWnA4S3JzdGxNdVhtOUw4R3dNRE8yR3B1bWRuU3dvbS9Rc3BEemUwa1ptT291dUJYTUF3eXVSdDVWdzhXTXdKMzJwRWVCOHBZMEdJU0lrd2NGeFltWVNzaFY5a2c5U2tqU3phVDhWUTFwdjVhNC9iRjZISlBFNmdZV0MveHBibktUYmo2WEdaNFR3UXpjTTczMkVkNENoaU80WDlPSlE4MFlmek9yVnFpWm9NTTJxcFgrTUprMzdlRENQUWkya01SMVZOalNjUkZuNTJrWXpVYmliKzQzR2g3YmJTWXFZM3g0c0JwTnoyaHhKbTZ6bmlNdFlZYmdpZ0M5ZkFSRmdYOXZKb1VUZDVhWFBIYkpQSkVwV2tSTkM2OGxYQWk3djFHdFpDTlJFN2FCeVE0RjJYdWtGdXRwYk9tcGVlRDVFeXl6NW1yU1p4Tys5cWlhQk54anhVNDZEa3NMTjVkVzdOeUllN0JnNUF3dHZiNEUwQVVaNDh5UVFCaEpqaW5LdlpKNy95R09GR2h4TFpKWkNCT0xvclZyRGVEcUZnc0RUVlQzTTFqV1dQVTJmYmFJYUpyRXkva2U3MWxPclUzYVhHejVhQ1k2SmlITmppcGE3OExrNXRwNGNCM1lKc1ptQXIwN3BWd2Q2NVllYzZjanNjOFprS3BMT2FJdUNwNUMwSkJ1WmZTcWlUeXRvMmJCNVhxRHB1UUhoV3R3RktVM0xvRFFmZ1pnOVRtbmNNWG1ocWowSW9WU3dQYTJlb0JlQjZpUTJKY01oZy9lY2l3akNBMnB1d3VXRlp1VzR3cGVLTXYxT01pb2l5ZUNRVUZuNkNZYlQ5SVVZa1NyRFpZRTgvM3lGK0pId2xpd0VPcE04c1c3SzBPWE1KWXJoN2tXczJEWlVFNHRrck9LK29ZV0VOMUErZnZjeW1RNGlwR3k3VDRhYXphTjdhcUlIWFJzMkl6cmJYMStBdlE0ZEtWTGEwS0V1L1dJcU9TT0FUVWZ4SjdDdGJ5UWdJQTAxUTB4eEFSR0V3NFJxRy9pOHgvUnplZnJDT0VOa3JsY1lkWVpYdlcwelZES3JlNFNoOWhxM1hJekJNbVlvaTZaNG5CRGhTMTh3cnl0eW1NS05qNGx4b1FmN3ZKY3JYNnN2aENWaDlMekp2S3VTSmZKQmE3Ymc4Q0JtWUMxdEprQW05R1ZNa050OFRXMTNRNUlkTGF4dE94V3Z5cE9waWJTNGhmSmFJb2xkbWZoQ0s2blRDNElEVE5yaWNRZXBuNndTTnZteUJ4WjlKWUUvZzU0UjBTTHdwemtjS1NoTGx6a0FKdGRUV2cwTmhKNnJjdzB5L3RCb0Y0UEdPaStEMlV0VmkySU1JUmlKZk4rSjBQOXlnTmlPK2pxWENyNEY0TE05dThzaURNeUVWb1pMSFpFUmZueFVUekRZMGRZOXRLbEF3ZDRyaC9RYUFuaFRLRldzZStXUnZXNTdZb3RyeS9tby9QQUdqQU9TSFZDY1dDUGJaWVFoWjJjRllSV1pEbUpKQklIQkZQdkVWd0pzYzNJdHhVWndBa1lFRjBCdmZmdGJVcW5xd2QrOURZSzVUMkpDZXc1a05pdDVkUFlpWFZHcmo3VGxaNGpwZTdDa3VDUWlhVndhZ0ZkYktVZFlZdGc0bXJocDJYV3JnNUpudnZKdi9TYVhqV0xTS2t4c093cWsxV2VHYWJWQXBoZ2hhMmRaaFBDTURIaEhrVnJ4ME1uV29GdFJmNmhoUjdzQXI1RG16alkxa2pKTWlYMDhsa3VEQThxWVhLMGlkdXEyUFpJYWNyQjFEMVJEdWhEV0hjbEw0MUpTOGNFb1Y2SjA5Q1A4TXhMQUtNR2x0Y0tvVHg5TkhCbXF4V0o3WnpFU2ZjUzVER3lGWnc5UGlIRzdncUZWSUIwTUhhQlh4S085RWZkZ2xEZi9nYzNFRUIxczYzblN3RmI5dDZFRFhraUJjZ1pzcmdtOC9IRjJ0TXRFL2N0aEJUOWg3UnFtQy9hN0lSdU41VEV6THR6d3c1eXhiZUs1VzllaGNOTEV6MlA0RUhtQjVQaEZubVJQR25CSEZ3azhSUWg0dFY2aDNGdll0QWZqWXpuR1JlT2M4b2VxQWR2UWo3L3hTaHlCSzRjVVhuWEF5Zkw1QmtPcWpBTlZIdFhNaEdQOGpPNlhMeHo0QlRlMzhJNGx4dzE1eDVJalVGMzJuWklqQVBPSzQ0b2JoMkQ2ejlqN2dIeUEzVGVyaTczcjF0cGdrZ3JnWDRKaS95RkVVTkpDZVA4cGFGS0dCNjk3VnhtQUZ4QyswdGVZbThRL2grcGpwazdJSVVndVk4QnljV2lhVnhTZFRBL0VmYzdrQXhPbGNuUmxFMlppZGZhQVM1dDhtV21yM29CK2hiZ3lJRnRjOXJnRFQwSCtKV2dxbDF1cVl6S01CczJDT0dibGMwTEhrbENUbFFtOW9EOXAyc3VBdzRpNkJkZFJvSWQxbkcrc2ljQTdnV290d0RNcHdEa1UvTHJLUUd3Nzlvend1dEU3U1Jmbkp5Z0hvNDl4K1p0ZXhGZUd2NzRWb3JwRlFGV3pCUXM4cWFBWFpSck5HYmNmTmZIUGhrRENhcXVnQkRVZjkwZ3FodnVpSHpjZ3JRSXg5RllLeW1qOHE5azQzZmVoVU9RVGNhaHBYWmxyMHg3UzNVeWJ2eG1NQWR6VlJsTEdlcFE1STJlMnYzdE9DcVlGa0pjVkZKT1MrOWZEbVowZmhmN1FXbmxXYkhDNGVoSVkrK1JoV3VFdVBFaGhsS2tPb1RRVFdZY0J5TTB0MHc3bm10UkxWbm5aZDZkaFgycjNMbjBWU2ZybnVuOVlGU1ZVWDVOYUZCRUp2ZFdlVjAydVFvZExuSUlWWmpwZzhpUjlsY3BmTnNZOUVZamlGak4vcGY0OVllUUtScXQ2MEJHMGxLUis1S2NZbXNrVUhQWU1RajgvOUM4T3NXdC9FQkhSdE0ya01sd1RGSk1iaW5Vdkw2WDB0NUE0ZnArcG5YRE9GdHk0WTBCRFl0WjRvNlc4dVFhUFNRSk44ODBhQVp1c0x6RFdKRi9EVlgzZjcrZ000bjlxajhVdnNaQmZyUnFyRkg0anFCUmFLcWhoM2tkcm94d0xLUENsdFFzRkZ3SmNINmFMS1hqbXFkeW4yVm9HRlMxNnFLcS84VGF1akNCZWtaRHRuejgwTjBQWTJUNXZ5VXh2b1AxNVRBMXV1aGJwc05WOU1oZEs4S0pEZmRxakMreEpiTHphRFB6aE80WWFIcVVTUVBiZWtiY2NkeGtwUGlNZmszSXh6SmJCbzRJVXVibHk4cUJGeFVWV3Z5cVNyN052V1Q1UVEzazdJWG9uQ2FTampSTk1kQmljejJkM3ErcFphRk9yc3pMVXgyUE9rWUxHYm1JYmdBcmh4U3FaUFJhcWlFcTFHVVBZZG55OGNFUnl3Zy9RQ0o3SnRKcDZQMys0UXorNW9PVTNuUFByUkI3c2xGRlhCRUhsT05xdmwzRDZnMHhaQ3ZOV0tGU0xuQWNFNVhjOU1jaWRDL25ybjI0VjhNd1FYR04wbnJhRnJ4U1lyUzNHYW9MWHd5b084SitWa09tRVcyV29XaWRNN1I3RWlySDBseE5xTVp4VXFBTFFJNHdEOVFpVUtHOEVPZUs4d2U5R25rUUJnN3dLTGpMWWVtUEUxTFFnL3RsNno0UUgrVVptaEx3MjFTQ0JCbytKUzdwSHBNTWd4bzBNK1gxbVpCbzNYalJLRzF0bVZBcnpVTU5xdEVMMlZBemxab25HbTNxM3pFM3dHckU0RHpzUlNyZi9zNjFWQkp1STZURTBPRTJuSGgzaTBRY0J2UWZTbmpoMjdQUjh2TVNyblRIUUs2Z0x0K2psK1NBUmVRTVczTjJ1M3RrU281R0M1eEV3WlNnekk3VkpqcVhOTHRFeTV5ZXpSZitBNFJieU1RL01PbmFIajVxNHFoUG4xdVR4M0txbzRsbXNzdjl0WUJxQkRybW5IM3VDQ2I2MS9VVkxDbkVVZ1BDdVI5aVNjV2FVMzVpc0srOGtUZUJScnQ3YTU0cUN5SHIzeXRBSUNDaGhJeGJTdmp0aDJiSHVTQjJHVGNxWDdCZUVhM2J6OTVCUW9JQ0VnNVZBR0loNW9ETnFuOHJoRDNrT09id1didFhueUJ0RTZGNjRZdUIwclA1Z2tsR0lkZlVITzBoRnV2TEdtNkhPYmNSZVhMTGZRYmJzbnk0V3J5MERNSkhKdFdXRVhsQUI5RWhSNm5ESEZidkJhTUNqaWlhTFlUeHFsSjllQndUQWd3bW5FZmhLSHRmY3BUN1FrV2JnTzBFNG0wd0pxRlExRG5JeDBJanJWaDBzV3dYRzlRcHhPU3N2NzhTWFpibVRPSGRuNjdncE11dmtJaDkreHc2VU9tUm1YdWhZSkJkOHpQd3c1LytEd2hCRWRCTXpzWjh0dEpQWkN4a3pYd3VPd2YxelJmL09LM0VVK2dxQ3h2WVZJZWMya3ExdnZnTXV6UWlUak9rSzgzaWV2SWJreUk1VnhZbUpreDZ5b3dDSnVwOFNzaGkwVksxaTRQa25jZVZ6MVhFa1hXQmdvRWMyQXlIRlBCVFk1a245OEVEa2tzRnJjZ2RjNm5hcmw5NUUxcGxLblpVcXhoWk8weXM3QnhxdmxpcWRXWjR4TTQ5SjJ5WXZRWnFIUm1IdUdLS2lnL1Z0aThDSUszMnRWSlhBUDI3b1VjTjB6RWp0MHpabVdaaDRVV1FxZGZqSWRldG5wR0pNSytOZm9NcHpRRFFzQmFNSjNtNk9RUUFYZnlGN0Fsd2lIcGZqcmdDc1U3KzlPaEFpWTYyQllpbHcrdnFEbW9NRkd5MzRmME9HQjJpdVV3VUU5OW5QSUVQVW9DbWdobTZsVGlWTWFqVGplVlVOZWZraXdqTnhXL2RnVFErWWI3bGRUZklDT2ZXV01WL1d4QzVOZmVNVllQa0VIZVpRN2x3WkpudlRyR1IxNEU2TzlNZThYZWpqR2VZTkw3MUFHKzNqQ0xMNnYyL3YzaFR1N3dwT0QwelU0V28zU2ZibUVESXFiZHFMYVVGZzdHUU1vZW1HWW83WWREUFc3ZEVtRm4yeWw2RnRtcUNYZjhET3Z4MnFiRThKKzhyL0R3dWJ6aXhYTDE5RnJWenVFc1RSeUZNYTJjYVc3YTd0QVNSVG1TSmx2RDkwQjlTa0dVNy92T1FTbURNMWhJVXM1RHNvd1hkaEVKQzZjQ0FTelcrU0trU1lQMkZOek0yeFVzYXFhYzB1NU4vUDZodXlKajBWTG5CY2xZNDQxSjUzMlZtSzNkeE9NUG0yTTNWa3VHUzM0TmxWTm4vZVhvb0RKWEdmL1pwZGh2RjhOZDk0TE5mZmN3N2REb3E1dDJoQTM2ZWxtMGE4citiMWovNDh5MEttZ2pnaHNRVmRNenJsZGM2dElOdlFGRDhzdHI5azgvZTM2bEg5M0krUGo3T0VaNWExaTdTc2p5Vm4yS0pSeW5TdG11MXhYL3Y2RXo1YzJSRFcyd21ZajNOMWtHY0E0S3E0cXFDZ1RBRXI0MWJHK1F3ZmFGeWVRam5ZNUdaaU0vUVpUYUNGQ3p5b2xVVUFYZ21lZFQwV2Uzam4xVUlFUUJoWTM3VE9uT2l1ZlkranhBOTMvb20vVnVySStsdEczZ0E2WXFCMVpyWm13NmFuRTRhdFNYS2gyMEhwY2FZRDlMaDh4NFNweGl3RXlhSDdNM3MrblE0U1JlSUw2L3d6WXppNFZ2aFc2Q000NWgzcWMxemltVUNpWVByWVhwSTdKU2RuVlQ5MXhFQmV1dzZ2UERFQ1dtdVN4YllqajNvNHdhZGZ2M0svM1FmTC9iNHc1M0pmeDVlMzlUQ3AwbjhjK2Zqb3laWG13ZlhQMWFNOG5BM1hJZG0xMTNza3lmMTErYXpDTWMycEV2OGhtZ1ZmZzd2L1NiZEt0L1ZvcFNyT3RLY1lpcTJOOVdkZjVNL250eGwwK0l4Uzhpbi9KTlFtaXp4SkRFb0lRa3BEWEZjRDgrcStDSlpmSWU4dWVyMDMza0Q2aDhEeTJteU4zS3YvVDZDY0o0YktkWW5NSkpaRTVORkxndmNweGJ0d3IwTW5tcUhjcUh0TnFKSGhza2RMZThRN1QrNFVEMC9UQVRWbit6dDdsWnVaRVIwVjlTaGFxOGE3QmlHM0t1cjFaSmhXNGlTa3Ntb2RlZ0NtNnkwSzk5eTdFUUdtc1VKWncxYWhpNUd5UU1aYStUV0twdU1Xa3RCZ0xzWUxyVE90Q21nL3M4NjE3NEQxLzZkeFdGbnJPZDdpVjlHcXJPZ0xpeVE2aXhvNDlwVjBHK1M3eXlOZ2ZJYjVNdXZmbklJWEl6bmIrT2JPcllTL3hLV3BhaytZbThWNW5PTDA5Zng1bXl0UFFZckYxOWZ2dkhzYnZnTzAvL0xraHBkMThuMkpHWHMwVTMrTi9xZjZVVTRMVDJMeCtmdHBxUzR5T2ZUZmY4TXNpdXROT28xVXVkeW1iencyTHhXVFpHcndtYjRXYlh1MjdYNUxkQmwzV0h0cU0rcmpCY3NYSzFiRkxjZ01hQy9vaXlrdTRDWm5OM3J6NkRBR2VRQkR4VEU1c3h6Tnh4K3llTUNWMGRPVDFneXowWnRpRlg2QTRsK0h0NWxPUzlPckNJN3ZLdFQ5a0g3aVlkbDQ1c1VGY2NHQjlWRDdoNy8wK3orWjcxdThYRGZiVmhEVjA5ajBmZmtkZVNYZks4cDk4WlJhRzNQdDR0WFdtQkxUZnQvemRCV21PckdRZUJiSUZucjhQakY4K1ZEdllxNk5oM3VBU016Z0o0Z1pIaWx1U3RIMURXRll6OWs5T0o1SnZGbWs2MjdKM3kwZGdMcTFKY2IvOFErekszQ1lKSVRrYUhucGkvczNYbUZ1ZUIycldTUGx5QXgwQnRNMjZUc0MwMTNEYUNUbzZ0WlpnKzRZazVCbG9JdkZ3Z0Zja1VXdjREaWhFR3ZGWmozKzZMQzhsaFZSSWJ1aEZBMjFmVWJyYjA2VFNlUkZBakpnMVZJR3BCb3JCTmFLcVZKQjA3RzUwYUpSYm4wZUVZT1hTVE9pVUl4WGdTV0lSUGVKTkJOU1ZHaWVNVVliVUdaTW5wTUJ2TXNFdWRFTVREdmlZMFRCajBkYlZZbmhiMmdpMWloZ3ZRekQrOVY1OFJjYVZKSnFBZUUyNGQ3VGtOSTBKcHpseTR0L09iZlhzM1RpWFdLOFlNMFdqdlh0U2doS0Z5VUkvU3F5dDJSUHZQcXNISlFzbXFKOU5veERrV0FwWWtNS1Y2MEtjMkozNElJelV6UFhyZE5jZllFMXI4c1lZV3NKaUkyb1ltMkxYR2hvKzlHMHNiMVY1SzYrbElYdHMwMFE5N3JqK3g5cDk4QzhlUE9sRkw3RlVsOG5qekp0NyswekxkSGtjRFhGUStoYURDTjNSVlhqTk5ET1RxaTFDa3QxcitZRTBhVFB2RTVzOFkwVDdveDFDSDhZcks2Y004ZDdyN0tZU2VoeTlkTXI1OERPUm5KZ1dUY1MwVm9NVVZGYnMyZzEyVHZmclBubG1xV0pLTmsvY0YzN2FFa3g4VzV1bU5KY3Y5Y1Q2bkhWbUhTQnNmMWYvdExiVjQ5Z0hmaHhQSjk5TXdEWGRpZXhoRkYyb3ZMcjhJZWhXSHA3Q2luUkRlcDlMbFhCeXEwaU5WSVpGWi9MOHc3b2FCbWtVNjZUdk4rRHNLR2lGcno4SnZjOWpqclM4MUtuZlJ1ZS9GYk5CbE5iSnVIVXIrR1Y1ZnRPcXhibUtZNFJEWktpZVJIYmJiak50a1ZZK3FzV3VDbU5CdTlZODhkL1NzeTJrMktsYWIrb3QzN2wxbU1xN0VJdmU3YmoxcVdVOStTdDJienJzbVVvc0FrODZGMzhaOWM2VmxCYXpOdE1ZNWptaW40aFNmUFlxOTltakIzc0txc1kzR2p3OE1FMGF3NFFVeFlPRGVtSjFiWkVoa21KRUlTK1RtS0pBVVRiZWZXOFlyUzg3bUZjMWk0V0NVcW03YysrSjlHdi9FN0Nzdml4dWcxZ2FXejA1aXJlMEpZRmlKbDU4WHhiUW4rdm9rb05SY1VTRjcwWjBWNGZUUnNYd21JUWE0Z2RRR3B0SnlhMUhxeVY1Q2hqL0ZmK0p5ZnVuRHp5bWI1cjk4T0s1ZFdsb1ROL3k2K2ZYMG85K2ZUTWp3TWY5SzhVVUk4UHFQMVlGRkdtMXlXNHpFRHgvZEdNZTdLSUFvMjdNOVBhOHJOelhhTlA1bGgzNy96L2F2WWRKdGc1enpub3dHSjQ2NjUvOTdMMTltRlF2U2NZWHkwcHYzZSt1ckZ3MzEzckxwWmNab3MwUVQvNEZxeUR2cTBaRklaRWN5cXJEM2UycHlEU2JsN2RGVkZBL2RTOXNQUHdZV005SmdVYmo4cDBTWHZacHJ2YjBIYWlqRjZXRXdNZlR6NmVIRzUwUmFqNGx3dU16azhPbG9XRUNaanVieFcxbFNZNmlaQTRGTWdXaHVRMEVTYmFUYjYwRHBLMTJJWXNmS2RxamdaT3pGMW9SM2pTdjRXdjhGUkZjemJVUlFtaUdNbi9PekhiYVdaOFJzamYwL013dXVLaDM0WThvSXoxd1hPaDl4ejFPNUxCSm12aFlWamE3VkZvSll3eFBzbmYyVmV0S1l0TUNEaWVzUkIvNE83cis4ZWQyL1Ayd2JkaE91VDdSbXp0NzlQdmQyYi9LK3hnZjgrOEw3dVNuamhQdms1d1pLbWFXMVFSRVlVS3lXL1hMUGpzU1JLOXlTa2JZQVRGQ1MrMk1iRVJhY3AwOWVuTHdWZmlyc1VkT24wOWRPVS92Kys2K0ttNGp5ZE1PaURFZGNqckFYbTIzMnR3M0paVlVTbWJsS1lOOVc1aDhhRnIwT0x5SWVyYnRQRzkxemZjOURWZ3RwblQ4cVU5TlJxSHBPRUhlbkk0TktrTkhjRVJFZUdlY2NMRXNOS3NPYm1GaGJUTCtPOXlpK2ZMTDBRRE90STAxNDIyanZLQTdnRGY3Rzh5NjlNbDFGb2FvYTM1c3Jwc2dISG10Ky82TVlKZWg3Qy9oMlRoNkFtNTNqNENhQ3hWRzJxR2R0a0ozeEh5TUJncGhONkU1SnhQNnpiLzYzZC9YNzBhYy9kenNRRzNINUpWU0lkM2p4TGQvRm54eXZlbEdTV1pGZ3kzTmE2RHB0OEk1Rmg2WlZUWFh3bGEzU2ZqRmpXeFJFSXhZMHlDRCt2Zk03ejJ4Zk8rN1R5U1VpTWVYdXR2eUpkMW1EaXVSUE9ibW1KUUVTaDVnT05YQWxIZzlSRy9IK1pOWmN6SWpjcVZiK2N4N0Zpc2lxOGMrM3VwWTBHSko0WEszem8zT0VVWm1oeTVDRHRlR2ZPdnUvbzFYbDYzRzNtUDk0Y0s2Ui8vNXhrSSs0ZzY1L25jVmEra1g3MjJaa1BIejNjcDJTUDdwYzEreWthMzh4MkNVajQyOWFLMGQ0UkhyOHpjOThRM1JYVU1Gd2xhRGE1Yk5QR3NzS2V1bElmK3dRSlh1R2FYSkJnVjVUd1hVcTNnbkRBVytPaHpSRmp4ZmhzeHhScHptUHFHbDlLSG9uaVR5RzdKRGFoYmtiSFJUQ1N4WWkzaVFIU1VFa0EwV084Y0EvTSt2amVNaCtLa1I5SlJ2R1JlVzFqcVVQalZBbmxQZlZGMVhOTDVRTDNDQWltT3JFcGNXR09zUWdVeUVOQVZoTG5KV1c1QllIWVc5a2IwNWxpblRobURpdktWV1dWbmJXemRmdnRiRmFwdmwrRW5ZdlJLVEhUMXA5OUN4dDROMzMvYU0xanFmcnhPOE4zRU1GTXNuR2VjbUJjcEQ3K3d5bVRuV1BzS3puSWNMOWNxL2dnb2ZXYVZuUmZQSVJBRHk1d2doYmJyYmV1cEx5bnZuQWJyNUxFOTNVZzNlNTMwWWRLSWJuZjRoSWZrMUtNaExzdHdEa1ViVUtpeEMySWxPcWNURXAwZG5OdXVkSnZzWGYzZHBYeXU4SW5leVhnM2ZBdFY1MGlsNG0yWDFJNThnd1pMK3NROWhxN2dGRlNrb00wNWhkVkhaNnN4UGMrRURkTk5QY05ITnVLTVQ2R3ZuWnFwclA2MWg4RmZiSkIvTjkyTkNBRGg3Yjk5RGEzWXlsUzdoTlJyakxHYjNNUGE2amRVQ1prNUZXUzJPeDNRVVVLclRSWExTWHAvTjExVUJqdVdyRkRCMk9IaUlsLy9JRnJkbXkycmRVaXcyVUhrcHlNTk9jd01neDJlZ3ViZ3c5Z2xwRGtaRGR0M0QvWnYxSzJFc1YxV0hHWWpJU0gycGpnWXp1bm5hVnlpSkpIS2JnbUZ3WmJrSnhka1g4OFg1TS9XZUNLNWRHVGFuK0UyWCtPc1V0bHVxVFRKaUhVVEI1UC9oN3ZVQnV1QzN4YzdocUladS91NWtSTXRMWXRwZzRGbVJLQk1HaS9DU2RqdDdTcnRNVWJWYlN1dWlYVWJWUkFKQ3MyZ0pwa25mMlR2Z2JIeXQ2Mk5ybTNNYXFuZUVTWjlwelNjRFl5V1FhWC93UnZTRFFjek5teS9saUdkTEsxUGtOaVQ3bUN5SEpzMzEyZnRtZU12Zkh3MmZFZExZb3JWd2U2WXAveHc1UW1seS9Ha0JMOGdqeVNvdGs1Sk9GeEY3SVNqWTcwbDBjVXVrODZ0bHNsb2ZpV3FYNUlieVVSTzJKZmFGT1M1V2liVEV0UlNITnhmVkNjTkczUVNKZjVIdldPc3JtZkcvd0gvTDF4Z1NEbm9WY3F1amlHY3BjNHZQbW5oa0JuanROTTdQSEN0NVlzdG1jYXNmZGQ2eGFqR1grMDVQSWJERVljTjRhRDA3SW9qMnp5MktNZE5Sc0lXeDIzVkZOelIxcEx4SW9lR1dhdG9sS2QxVXpLWFJRL3BEdFBlNGhUcTFRNW5oMDdEdmR1L1YzSFJiUXArcDJVRE9OSEtFRklqN3h5a0ZOblJYdnUxV0VkV3NScUlESUdSNC81TnNXNVNTU3RraEREd1d0WkpBejhweFNlakdOanhwekE5Q1JhOE4wSjNTNWVzWWovUm0vbUltaGJ0NWJabXEvdmdRdGFNd3JkMFAzMTB1VVcyTXVtZmJzV0szWDNEL1hkTm1ybzlseGJ2U1UrLzZiRW8rblNPSGhGS1Z3WHljN1FWamo0NmVkRzNzdjZEZlliN3Y5ZGhqNmNuM0ZFdDBuN3d5dTFvY3pnd3ZjMDV2Z2U5MG5wcXEvTWxXNHJIRXhmZUx5MGpoMmE1MEJYMURNaXV0VjFRZnNNZlorUUd6MVFpcHVsalVuQzdhVHlNdCtZc2tSaXdONzNwZUtsRVMrN3I4dGZreEt0UWd2N1VwVjczQ3RiYTFyK2pISHJNei81QzFtZExBNnpZNW5WZmoyV2lYRzIwQnV1dTVFUC95Z0kxTXRFTElRNUcxbkpabTdSNkJ2UHZwRVBMNzBNdGxGa1Q3WGxDd1hDR3JiK2NFVGRyVzBsUlZuQlZGNDVSVVlJcVN3c0xHNnZKYVVoeHZNRnBBVnk1M2R3a1NhT0h5aHVPYklBTFo1WjQxNGU0bjNLRFV4dU9tUE13ZTQxNS85RDBXbko4UzBsbFFmZmlTTkw1WjVOZFZZM3hIR0x4QUh3USs1MnpqRkdEbDBvem9sbXhPZEdpNFc1ZE5NSjhOazdYSHJRS250N2VEbUU4OW4wenNhb1BPd2Y4Y0ZORVBtTDVKNmZOS1pUMTR2WWVhZnEzZE9MTHNXN245eGdVOFJkMm1NU2U4cXVFRjJTaElSNmdBRFJ3Sm5BUjdxS3Q3Ujc2RHJBbTdOZVRjL2FEaGJQRDVXQVF6MFZCbWpUVlovNDBzUDJLWTNsWjA0SGRGQ1JiTU5Pbmsyb0R2TnNwSnN6QWF2TmJCZU5VTGNjSEZDN1BWeXRnTnFIc1B5TXEreFlwRE84T2F2WG5MVlpuNDFLRHk2RTA1cGltL1FNbFpzc080RGhTcEVtc2NtU3JEa2IwdGJzMXRZQ2pDWXMrb3pnSTJjRFFPWUY3L3l5QmpDcVlEd2JEMEZreEtXNUhvR0dZSEtkWCtoeS9samNaQVBBejV6cEU0T0s1QnBXejNhZHg0NjhZMENwblY4dk9uMGswOW83WjBtQ2E3Qmdtb1lCZExycW5DcTYyWFM2d0JmbVpRb2hpR1lLRDhFVFNlQ2hqaXFBNXJrUEpoTVFxSWptTFZsSkpIUlByRktoWSsxMlhPNkhWbTRiQTZ6Ujk3Wk9CbDFicU1sSlcwUklINmFRUWV3U1lSeGdoQXR1V25MeHZBOHF4a2FYWW9ORGdCWENFNnRxYzkrejVlTGhWbkxGQldsWmoweHlUWWQ1ZlRHbVBRVVlHRWs0SnQyT3JjRE5pSyt4bTBFY2xGemlxWjRpd05rVVhpT0dFZVFPSC9yODFHbnh0cU41K24rd1NJa0t3QmRwSXN3WnpOck1HRkVPWnV6bzhjRVB1S0laK2ZiYXVxbCtBOURxNm9WQVgwZlA0dFJ4V0hNeGp6eHhoYXlRUnA3cFBNeHpjYzQ4RjVuNlluUjYwbVNnMkFvNHl0WUxpWDlKTDc4LzJNWTBySk9rWkFzMkowTXgybmpra3pjODYxK2JaME5sbmcyZ1owaWN2ZG52d1RmbFBnT1VhUUYzVnJGZkVTaGcvN0dzY2F6d0lzTkc5NC9rbzBJVGs0d25NZEdyWHZ1a3U3NUk4M2lUSEJWTTlnVnRKakdHamFsaFRzVGxoWmtlQmtCYTFOTU1FeW45L1B0cCt0ZlFqQUlJd0Fia0szbEZrcjZ1cm1OWC9zcS9CZDhpUGNSUFh0QStVKzNDSGhpZjIzckRxS2pqUHZZZ0RHUExlS0JEZE1WcHBQSnhoVzB3SnVweGhhM0EwZVozbWhYRStZZ282a25CRU9Bd3c3REwzZmU5emMxV3JIalVxZUJTZnp2bUZDM3NJb21BSERHMnYvZmQzYytYNkovKzlWdjdQMSs5WCsxZnYvOGM4ZWZnLzJXajFjVi9mb1YvbGdzYkRJajd5eHhSeGt2WlhLbmt5amh2cGN4MjY3WE15NVdxMktQYlRVZUM3NGEvS3BIYUdYQng3VXEwZ0Q2YkJzcnAySzlJaktnNEtBYXVhNGNtc0picmVXV2NaSE96a3FrWTBKVVI3WHYwNGszblJ1OFhUeHNhNzNaTFFNMUVwbUpBVjhhSVpwbHpzOEVSZTcyOTF1WDcya0kzYkVpL05XWGZ0ZkJXUlFLd2NFK0RyVDVkdUtTTTk3bXJIN1RtbHArL1ZNbmFSblRDRlFNSkxoRnZLOW9FRVArMll0TWpuL2N4NksxazdsNVg5WFhNMUVUWDYyNm5wVXJjcVlqQ0hSend2YnlNZFFhQXZPRVdqVUI2cGkxVWN6UzBWK09SbUI2ZTdTc0hnT0VnMmxEc1pEWEF5elVIdkRUZC9QWm8xdEFDSENpWFdtdjRpUWN3NEVvUEdQQkFIZCt4Q3JZcVJ2TGxJd1FiZXB0RGxhMkpUUEhFVUhyQ2R0Rkp4MHVSbWsxV1J2UkJtYk91dTJ0bmplQ0txYXVrOFIzTkEycmRHa0pLY3E4QTJ3N1VnOXhwZGRkZks5S210TXVuRGxXa2hEWExPRGVUSkRlbW1EZnJKT3JPdmxTaTdZMW90aWxMQWRwajgyaWdQbStwbXNjaDhOMTJuRXZRWEp5OEVBSU1EemhROFhnMFdVbFl6cTdhWVYySktnOWJlM1VxRDFoQkVSangvaGsrWEpKa0xHekdJbXJodFdjYTFOZXFiWlBkZDRQSmZTdHVWbnVPUUFqR1hVNDJGa05ubGtyRWwvM0JNcTZjQ1FrazQyeEJHS09SdXVXTjNycFZHQ3hQeXJ5WFJoNndzTEhCc09JbUVGbGtSTlBaTmZacU82dEVKb0lpalM2dEZtQzhoT3pCNUZIUkphTE1wTHc4d3NvdDlXNmZEMk1VRGVkQ2NkTENFQlJ0UVo2cUx1ZW9tek1ZUmJLVlBjRGIvdUlPY3FwbGN5RWUwRnFtT0pLT1lYbyt4QmJ0QVZRYnUrUkt6Z1JGUmdqbDBmc05tVkpIcUFvSTNlSTBEbWFyQmppMUg0b253VTJTS21ZUGFmZ0Uya21LZ09HOGRQYWhZOUlrMTdWd0ZKUkJoK0tlQjFzOEoyWnppNmVHR2FPVTdHV3dlU25UTkVaSWRiNjRTNXdKU2o1ZDVZQjJ1NHFSUEY5SEpJTzBpaDYyV2dnSkNLazc3K3FUdTVaVFNsK2NpL25teGtueWJDSWpIQWdvQUYyZDZkS20yQkswbENyUGpWa2l0RmFGRDhqaFJIOFJYY0tja1NHYzl0UHdaVjlGZzQ5SGZWTmM0RDFKUnd1Z21RUUZWYVhzZUlwc28zVlpINnlwSlJwVmdMemJicEdtNGtVUjhDVjUzUjVpWFNBc0VjRldub2JDWWkxdDcyQS9NVDc4a0lEZWVtdTlCbE1ZL2l5WXJrQnVtTmUxblB0dlo1eDlpalFCNWRHUlZLV29tZ0dUWE1WWmNnS0p1NGFMSzBmOXRwMTB4ZGQwMkU5N29aRnVTdWZ5QmwyTXRTT0hMY1VKdWdXZWVSU0FXRzZhcm5XUmptWnpxWlJjQlUxN1RCT2lwRVpuRGt3NWVSSjIzTFJrSkpYZVRFTlVDNHFsKzhWNldVUTh1ckh3OWJCbXBubWgxRndHa3R5Tm1xdDc2UU1rRnNldWMrd0doWStEN21FUlhWb29MU0tTa0UyamVKNnRjaEUvZjNkQUl0MWMyMGkzTEVlU29UYzNybGVtaElIWUZBQS9xZ3hGeDFkd0pRZTc2MFJiV0xLL0ZtakNhczZqVzJuaW1vSlRjcEdDeWp0WHRaVndVUXo3S09TVUdGT201eEpyVUZWYXhPait1RHlIdXRiYlZxMFNwMDd0TExKTHV4ZXJEV05SNVB0bEdRWlVwTzE2clh0akRnZk4yb1M2eXNYZU9EY3IxLzJZMUtxS3Z1RHhEcVo5aTE1R2VDdlM2ZlQrRGpRUFFVc1JYUS9JL3N0anRGZ0VRWmI1bm9QcE1rMDFwL1d0VzZxUnZoVE1Cajk5eFYvUXZha0FuUTJqaWJKcE1ZcXBtVWxzeVdhOE9JbXNnYUhNT0Q2dUorR2xEQUEvUXJIam5VOXBaR2VjWEFHNjFGQXZkeG53OEVGTHVyN3JpbDZrdEd1eU9FOU5JT3RFRTdNRWJWeXNpYmRUU3NoNHZHalNOQkRkaGFkN2dUWExDN0xhQlNobDhFVFdjeHNGejg4bmZsc2crODJzRG9oSmZEM0pDa3QvdkZQZVVzbEd0WDhCdUo4Z3UvOVRMTHJVT3JGRjQzbkFLazRWTUtiOFZhMXRBTjVtekJtRFVzWURVQm14RFNiS0ZsRU9pb1prc1VlbmZmb2NTekdReVljeEw0YzBvOTkvT1VWeitqODdXUkRBOXBISHo4aXprcEhWU2pjR1NXalhBZEZpamF4WDUxRFFzUTBEQVBOSVZ2eFQ4bHBnd2tsdGpRSEZ5ZGZUNnNheVNsNXZkUjRJQ3ZlS1dTcHgyWkZFc2w2ME1WaVlKOThIVWRhK1FFWHhvaG1JTU9mRFJwR1ZWcG82UkszbVhxbk43aEJOMHlSUzA1U2RSeHZuM1lmbHE4aSt4WFhmWjViNVMyYk14dE5FMFBTd0ZwdmFFU2ZlRWcrSk9sRnNWeVEvTks4MHhNUzVGd0wwNEFHbTRzRFRLaG9uamdQcXVvRE5YWTlJZXIrOCttQVhKNUR5YkZNVU1SdEVFMGtpYWt3cnpnSnJDMlFQRk1wM0YyTlk2UGU3RHpjM3NrSTRIZU03UDB4NzFNMnRicGFHa05sTWRHNXBBMUZ4Q3FlR2VpY3JJZnZRVWhmemRkZHV3TzREYTJLQWZBSll1TVF4NjBRVFRseERrTkYxQWpwSWVSKzA1c0pabnV1YmxMeUh5YlUxNTBCWWdCZGVpUnZEdUpWMWpSdVR6ZFhWdzhNYzl5NW1FVlY5NzVVTG44QjRCRG9lWGNhR0lRc3E5OGtYS1Frc0Z1bXVlaDJQblBsZkY3VXlrcjJxWkt1QzFBMDIvZHJpcHNkRzNINVg0YlZ3YjJVU3pZeHlZQUZPKzFlU3dmL05hU0ZKR1hET3dNQzdzUUVJcFVjY3hNd1p6NFlCN0dnemh5eVpKR3EveU9LQi9oQkI0VUR4MnFpeGxkZ2l1bXRLTEp6YjRMR1BVZFZ6UEdxNVppM2ZKNFhFR1ZTbEhDMnhsTUk0SzRoZExxeWdEdEtWRDUrNklrWGZ2TG5aZ05hbWh1VzU3V2tFN0FOeitRUmNwa1FIVDlYVnRtYUZxcVB4M0gzb1gwRzRkZkRkRDE1T1ladEo0UWpWN0ZFdUdZYXFoNVdNYWVlRUVYQ3FYT1phZUdaVkpVVWJBaGdsQ1F6NFFPcHRWKzR2ckIrUDFxRmh6TTRyNHlRSVlrT0RDb3krc3pxY2c3ZWluczExdWxPVzRTWkpia1BiV3A4Q3hIa25lanVyd1JlellkMGFISE5YZXdVeWw2Tk1RZ0NZMk1zRFU0U3lhNEU2ekFyREZUdzArMWtqeEFwamIvU3BzZDFlN2ZGOFI1R2ZQR04vdjNpTURsbHF3RFZGOEh1Z0Y4bnpzSXVPSlBLTkpHZ3YyemNEZVkzL3JyU05OY2hMcjJrcitZLzVrMWJiTFF4MUo5QkU4bENlNjZyNW1qb0lxNVNoVkpDc2M4TmdlZEsyaGNaYW1XS1g4MWdVb1Z6cklRVW0rNVNsVTFOSUpkcW9JSFBSZlgydy9tN3hFTWNSckJWUDlXajl6cFNsc2xKcUxXRktRR3RhMmdQaFllbVhRbWNFQUpTYmJSc3JLeVdueXQrbG8xTXo4dUZzYk5jMW83Y3VWZGJBNWQ4NUxPTkZmM2ZNQXRpdUk3c2Uyd0hBcHU4bzREaDk0bW1NajN6SmpoVU9jRXp3dDFhaXQxejdxR2k5ZnVjbHY5dnQxcXRWa091MHBHV0FLVHNuMlhjZWUyVXYrMHRFWjRMR3VKTnphTU1HdzBFREgwQSt2c0I0NkFNZ05HYngybkdzTkRKSnhqVE5lQXpDSEhSeWYwNXZNYm0vSncwOFJzMGVsT29XQlFFZi85c1UzMy9uZC84M3lzQmQ2MytYUzUreU9YQWZQampUZy9mL1BaTTdVL2RNeVFOaERBb2dnUC9lMWo3MW5nMEpwS09hbGh3Qm0zZXg2SUd5a0tyeTBuU3VOVjNtcGxIeFFScCtIT2dxT0pjUnZXcGJzYTQyY3FtbXNaZWpJczJIa0NvQ1RMUlpJSS8wcGRDR3hQNlZIdUhudThUWmlhU2diRjJlbVU3UHVNUTZrQ3IwNW1Ddmd5MS9tRERhSCtDSzhnZjdEWWVzZmZoU2tRNTFYWHhYL1EwNnR3UERWMEx5SDJFbk9Xc005ai9hUHFCOGp6ckhZQk1UOTBFRHh0WE0wSVVaeHBXZ09WZFEyRXd0Tk9pL2dua0dzQWg2eHBWZzMwQ0o3ZTBnWUJxd05Od05xYUx2cW5VQWY5cTFPYzFBMmd5U1dVeVVaTk41VWEvbHNBZTJ3eUwyR09rTktMeXh0T2w0dTM1QWY4U2h1bmppRDZ5c1RiMGs4QTlZQnJ0cUVqeUYvWGFLOTRwTW4rR0puU2Jib1JRN1JRQisxU1RFQWg1ZUpBa1JndDhzUmhNdWpoTzhyNW5WZ1BMVGNxK3JIaU1PaUVGR2h6TmYzaFR3SDljTmljUmd4SnQxYVJjSk00WkZJeE5QSzJ3SHhqcTUxaHh1ZE82Z0RkZm1YcTQ1TTcrNW1zNGtwQXdnQjZUWXdTdXNCNktjbWVjT3B6SHBkWmVxVWtiUzBDWXEyaTdnLzNma2FtWkV6N0d0aGk5WW4vblNLOVpFMGZjM0ltY2Q0U1hHSUk2SUVDeEVIREFIOU5BcHM5ZUtPdUpLTzVGWTQxWEwxREQzaWtDQUNOQU5JeHNjRkFxMXVraDZZbzVtUmlDQVdTYmUyck5aTkQwRW5BQmhiZndFS0ZQblRqRGk1OW9KTURqTEo4QTVoclZtSFBjNUhpa3dtQzhDQVdCRzFKd0FBZWJST3NGWXVoM2l1STkzY1p6RjkzQW5kZldqNHBRcHA2TldJSitLRm9FL3Y4ZUlRTGhvaW9panZIZ3BJb0ZjY0UxRVhPb3pYc2lrckNPS1VWbGN0VXAxVFhnSjBlRGxMUXBIdmZMNUNxcFVHYzdqU3hhaWhLSEZ5OFp3TVFYbE83MlVsZ2JWSHVkclRxWWlUY0JqaGQyTHlRWHc1WGZmR29HRncxbTMzZXFjWkNtb3A4WGh1WGhnZWxrd3h3U0M3SGlsYkpYV0NhVlNacVVzVnlGOVpYaHh3UlNldnl2bFlFcVc1aG03ZVpwTCthbE1iWWhLNU1vOFlVRTJ2VXVHYnhSRzVvemN2YVcraDcrN3NGR3ZpZFNKZEJuclF6bjR5dEJWL0c3b1Vid21lSjdWd2RQWUNrNHJEMW5GYndTbHJRZEk4U1VCYWpWd05Zb0NqV1gvdENXL2ZMektiNGtMZm1xODBvK0JWOUJXOGJPMGVaYlJPUGc4cW1ya1V0V2tyNmxzWDkyUStoYU4rUWEvTzE3eW1zcWEzTWljUlJrem4vVGhSV21qbDhXaks5RmpoakNWSUZXRG4ybTgzc0RjempsbHBEYVZjcWVSSENvcGVscGkwRW1vQnZ0U0xIZUQ2WXJoWjJueHBaZmpTbG9zOHh5RG9zT05hRUpSRkNHZnRjNVFrVTVJaThDcENjZE5HNGJqRUVMLzk2VUVCdHhMcHZtUjhTUXZEbDYyV0FkSncxTHdIdTUwM0pIMmZNU3JJdzN2Nm9ESHV6aXNNaEdmRHdGUEI0K3p4MGhPZXh6ZXlXNlZjWmhWeHZvNzRMT09VRXhJbGlHMmg1dERGUDNxblhkaGMvdDhlblk3bjU3NzNCOC9QSnB1UDl5YUhvVmI0U20vMk1wbWRpVkJWZzhmSGt4M0grNU1zd25WZnhJZWhEdmgvNWl0QlA1OWRhRitRMWJPVlpuemNHKzYrWEJqdWhkdWhLZDBzWkZOTEZkdG1pZmJlSWsvTTMyMlgxb0pQd2xPMXdYd1UwYU5uODh3d3dMU2x3Mzl4WVZMaU4vRDc3NTlnNnBhSHo5NzNTOE1ScEZQUk1Id2o4RlplZTFqZFV0WmF6OHVKSnpTc0JnYkU3TjdvY0FlTTN6V0hpREt2a05oSDljL3QwK3FyKzBiY1JNQUFBPT1cIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMzFfX18gPSBuZXcgVVJMKFwiZGF0YTpmb250L3dvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFFQVlBQklBQUFBQWU2Z0FBRCt3QUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHbUliSUJ5RVVBWmdQMU5VUVZSYUFJSU1DSUY4Q1o4VUVSQUtnYkpNZ1pnNUM0UWVBQUUyQWlRRGlEZ0VJQVdFWUFjZ0RJVWZHMEZyTld4YmhzU0Q3a0NjVkhrbVowVVJiQndZY0o5WDlQOS9UWkJqakJqNU4waXR0K3M0TENRRUZVakw3WGs3eUFnV0ptczhpbnpuZHpKM1I0K29WZktzS2hJMlRsQlNVQlFsQTMyZmFKMHR0QkNMV0dLMWtyZTE0azkwMGlQdm56M2lpZmdDc2l3bWZkVXQxaDVUSitEQ2xzY1FTSG16MVZXcHYxRlBuTER1Zk1acEl4V2YwMDVLdUhxQ056bENZNS9rK3ZEOE52L2Mrd0pFUk1hd1ViRVNZNVhvMzFqS0dIUHhXYUVycXhIdFJTWExacG1zeTBXbDZEaXZjeCtscENDdUJ3L2xmditlM1d4eVB4Um9mSVVEbEloR0lBdGpxcXNxVkMyckIxbTBXY21TTFpzSEtMdzdXWUxaQjRLdTBsUEsxT1VWemZ1VnpkN2RJOVE1VXRVWWVxck5JLzBZV0lBR2lYdjJETFBDK3BHSlEyeG55UnZqWG1qNjBiL01MM1JXWlFRRnRCM2VObmFGNW5xR2tsU2dtQnpocWJlQXVUMVpBN0JOSStlY3MxQUpSUkVVeFFJckFDV1VDZ1ZCUWxveHNUQXcwVjdaeTIvV0tsblh0Mi9mMm4yN2kwb1Y1clR1d29nTFJXUUpLR2tIZVB4TjkvcmV1N001a2xPZzBFWHVYUUhvSklmNC8wZ05NTHRBVnh5N2pPNFdkVjB5akZhelZwRnFBbGJzTk1JeTNvdmZONm5UWklMRWtnd1lSQ1ZXMm44VjliaHNYZllIR3RkZURNUDJrKzFsNmoxdWZzMGdrUkVJdTE0MFc1OVVMWmJ3eFFTWWhyenRrdHZ1VkMzNUxaTXpjL0gvVE5YYVdZQXJydUlqSENsZEloeWhpNUtLNm1MZ3hWdzA5NjZhK1RPTDJabkJFb3NsSlFNTFFDS2h4S0N3SUVXYkFHVWZsN2l3a0p4eWRTR2tFaUFjbEJ3b09xYk8xY1ZZdWJveWR5bjMxMVJYdGo1WGZxN3UzZnU5V1VWRW01NUphY2NhUVVWbmovdjk3LzFZMnU4QWllMit0VFhYYzYwaFpJUlJVQWlTZTAzeWovTitiUDVEWlQrVGxUSXhCd2djUjdnZk80S0FRb0pDZE0rYmlSQ29OWUpFL1YreERCbXhNbVd4R3BOaTA4Mk56YmM3dHRlSjNDdThteFB2TjQxc1p3QklWNGNTNE1wRVVQQkJFbTkxMVVNSTluOGJCTTdWUncrd0d6ZW9mR0xLeTRET0YzbEQwanRmRGpIbVRYbzd1Q0FMZ1NUSXNTVGhxbDRKQllIaTV6MzBmekdrRWwxZ005bU5GcVMrejg1RTVQTzh3U21JZXp0aTJHQzBlcHVka2dIMSs4TE1QR2crZm5qby9sVW92U2E0bG1LQWdoSnZvb2d5VWRIZUhPRUVoUUVxSE1aaUd3NjVDMFM4YlEyTVZxRjNTd25SSXhReXdTNFZWWkk2eUZHWU1rK0ZWSU95U0JMTU9ZR1NsY0RzWXhqSWFxcjFvNVNZdzRVbnVsZkw4emlaUDdFc251WWplSWgrMFIralZPcE1nYThqdUNYWHcyTU9vQi94QVQ4QmV0ZitGbDRGWVlpNEY4L3hMNm9oaGZLRTJDOUMyMW5WcEJ6aUlJWjhvclcvVUcvQm9KT3Uza0U4eVN0UThUckV1bm9EZ1JORU9URExUc3Y5T0lDTHIvT0ErZHlpL081eE9WM1JWUVVoaENOb29UY0JIUjhuZFNSTHdmNVBPR216Rm9UMU9RSElFcGExMG5RclFJa0ZtY1VZQURaN2kwU0xueFlNSndRb2ZqRzhnQlQ1SzFjWm9uQmJlTWo0UkxtVGVFcWwyc3VEOEhRL0NLb2Y2ZzNBRWVYRWlwU0tEYTlxMGZHOTV3bHdRZ1U3aWVpWisvTmszc2w3SjFPNXE5eFhubEI2S24yVS9zcGdaYnl5aFRKUldhRGNZUDM5WmY0dTlkTytPZFZBTjZhMDlNbnBqajZ1ZEZjcVhseWNzdm0vY0lqOW0vMkovY3ArK25uYnNLMS83Lys5SXg0OGVIanI0YzJIdTlyUjlyYTBNVXVMbXRud29OY1ZaM3Z3TTZYSlV5OUFVRlR4Y282Y2xldHFwZEtSZy8yMWZGc08xTHZPZWwyNDVKVnZBS3l4enV3dHRrcU5XQS9sdVphWVlxMHkyOVBJTk41ODZTWmJvTlFLazZLRmtRZGgwY3ZmWTVTUzBMeEVxUnRaYkozdDJ1V2pURFhQRW5OdXJTMXorVlUyRUJWTDFaQkJLYVkzeE5JNDIxTExyYmRacllubVJndTVxb3d4SlU1ZXFkeG9FOHlxN24rVDl5aFJZYXdab1dGU3hiN1RacHB2OVRqYVNyc0k4dGtzRnpjMTArMG9ZNk1qdzUwZDV2YTIxcGJtSmxOalEzMmRzYmFtdXFyU1VGRmVWbHBTckM4cTFHazFhcFZTVVNDWFNTWDVZaEVBa0htWno2YVQ4WER3OWx0dnZ0SHZkVHZ0MXFzdmxFNk9iNll4OEJPdXIwOXVWWkt0b3VEa25ONFNqNGFkd0xrcGFIY0VQUlRiSDBtellhejFoaTAwdUd5dU51VXJIZHRoZWJOSXBsellKbHIxeDl3ZlprSk5IUWFpaENZMXJrN2ZWcG1WTENqSmM2aHpjV29XcmVkQ2F3Z0FhbVRRbEFuUW9XWThBcFA2ZW0waS9yUjNLL21sQiszT00wWWRXNWExdFNLNklLNmVoSG8yTDJ5V1VodVVVQkdCa2JlbXpMbEFxTWdFWW5qak8rYjFRQkxMSGNZRlBPSXZxOWNxUUl3UndaYThHSWhXWnpqTXBoNGJDVHNqUnNWcE5IbGY1RWNVNkt2THRscUpCT29ZNDArZFVhZGZDNWtVRVRTYWZ5M0tyNFNVaEpxUGx5TldrWWkyaXhBSStCSVI4YVJMMmp4U0xqNXJDdDBiclZKOEN4WHJ4d3FFejZpTGJnd0NiWlNLV29vbzB0Qm9HKy9SYUkxdGM5dFMvYW9takVSamJvQVF0cnl6d28wUW1YMDlQckgwa1Q3V1oxUkNaUkczaVY5OXcvOEk4QkMyaTdFRVpaUkdSNU9PTWYzbmFWTVEyU09rbG9JTXBjbVBCUVJURFZsOVY5YnpVUGNBSnZmSzVMY1FuTEJzUXd5eVZueVphcVVacWMzeHVNYWNCVWtSWVNsNHcxOFJFNFFsNkxGZ0I0S3gvdUg0eGl3a1YwTVNYaHYyOGN3WlhSNnJpcUo2WDVOaGxtcDBoTzBZUnc1VWNEcm1ZS1JsdVhRWEs4QmtkOG10MERQQTRQSWh1bEoyT1NOdmpackorekNWV2xxWEZESm5EcHk3WDI4bUkzS1pQa3phUkNRN3pQeDRYVU1RMXhTSFBVcmFSbXprRklEbmduNXZON2xKNWFjNnhnc2k2SUZzemNibkVHUFFuSVBITlJNNXFLMzE1YlJhb1dhRU50ZW9WdnJEcU45Mmcyc2hid3lTbWhwU2h2ZFV2c3puNHhyV3NOVmQ3eDdYTkx5RzFVUW4wellSREViVFUzT0N4YjNXY2s0cjZDRzRKRUNCMzkwczAvRlBNdEZ3bkRkbkxIdi9ZeDJoWlc1NHhCdnRXUWE4djFHdHBBK1VoUFl2VHFhUWRNcm41SEx6M0xFUVlBeTgyQUluNTdTZnU5d3lzVEVGbU11OTltZ1p4U0Z0NHViS0FDc3JwNTFZTWhKTEt6OW1YT2k0Ykx5ZGV6MHhyaWN3YVh5dFJpOXFPaEpQbG92UmJFcTBUOHZXS2g3QTVTMHFYRVdHMzhaaTFtRGV1MzFteXBHT2tvcUk3L0thTnRiYXFDMnNOeThkeTg5TzBrNDlJbWk5aVNRTFl6MjRHdTdSaE1PZWxMeWppMkRSbVlSejZtZ3NpZ1hKL3ZpUWRsRHdEeEZVMU9sWWt6VExvMDArdXVDOG14b014eHRrTXVoY3JvVlpGM3BPb1FFNFJlbk1ydGtXSUZNK3JCQVphSHR2UFVCQkFHVnFZcE5oanlKYTNSVUVTOEZXM1E5NHIxcDJuSzhoaHJ1ekJJQXU2VXRwY0lCczBEVForZ29KRUVyd1hLa2dNSzZkRkIzRnR0a01CQWRMWHVrcEk1N3AyeHNZS0NWSFp6bVR4N0tsRXJYb1VEdTVLY0FMc2d1T3Z3ZHNUOE5CVW4yNjNFbGh3Y1dCUXluaDBMZms5bFpDMGhNVG9FdlFzWTl5T0xLc0ZTVkg1MjlYb2ZjbDdNckUrOUsrS01CdXB4dm1rSGF0MFY1UG9DS3plUzY3VFcwamdXWU02SGxYMmlMcGJ0VFJiRlhaeTJpSVBPUTZpdzd3bUxsYk92MUpVa0lWckdZNmlLVldlZ0FjMnJKSkViSHM4TVhqY3AyemErRVFaZ0FMNyttYzMzeW15QTlySlhNREU0elF2M0o3Z2haVXROSU56Qmp1ZHUvS0FtcjRheVJRM1RrRTlpdS9VTTZVb1k3TnFjNlNQRmRlc2NnUEt3NDI3QVpxaWt6K0NFb1RkbWdDVGFkV3Jld0RCTThSTFJmOFZNTnN3N21XNlFHMmgwYlVhTWVjVUhBNmRtNnBINVdhNnFFRHlVNUJhWXVURHJDcUxKeEwySXM3S2UxUGxFREtnUGFjcWVKZkNZZ2IzNzVHM3VoSTZHUjR6aHY1U3Vkblpvd2ZmV0VWcU1zSEFuaHE3dGRBR3RJcllXbmxwbThhVTVUOXNqMXZNbGhKYmVsVXFROW93Q3U1QmNrZVI1SFNyVXNyQlVuU2s1R05iUGdBc3Z1alZ1ZURjWHREcmdwZXBVY29HcDBIZFhTZjJ0VlF2Z2YrbWRycFdQUVlDb0MwcThhM2VYSGdBcUM1VUYzcDVjL0FsM2ZnTUV5U3FzYmFiN25RMGJkeUQ5QnJkeUl6c1FPOVplUnBSWlNzNm0vVEpudk5RYll5WEhEakZibDkyb3liU1FFS2VJSlg4N2paR3F3VEN1Rkp0dDVFdU1zV01ZRmtuNEswUGtSOUxoNTU4RHJOMFRRTGcwQnZjNGRzeDRtSSs1dklYdG0raDYrb0JDYnZxdE5TSitHVWpqN3Z3TWtrRVF2UldqVUIva00xY2dPZ2srVHlZdEdqZTdJNGNIM3ZoeHEzcEdhWFJ3ZlZPVFVYMlQ3L1ludE5keGoyRXdSSi9nS3hTWG9HTU80V0xQbmQvNWh6Tmx4S0ptS2REZGpCdFdXNHVDZDlWRTYyMVJXYTFLZW5MMk1UK1E0VWxmc2ZtVFQwdXJKdnd2enUyR0JnNDZ1WFhLSXJ2MXRjOGY3ejRHTkZRVTl6OENTTjNlSEE1c1FJbWNsQ3ZWeE96WWdvOCs5c0hXT1Z5ZTJQc3VOTEdtZkNKVXJ2SjYzTWVzYTh6UEFKZ1VzUnErOTQ0SENSdjFMZ0ZRMStzdjFXTmxFaFNsYzFuS3hUSVQrQ1QvSTE2eFFmd2xpRXJiaElSbTU5eHZEQjVLdk95RFNQd2RVRm1YVkM0b1Q0Q3V0Yy83MXhYRkw3YW1CY3dEUi9hVldCczRGQi9zcktaUXdoM3BHK0pvQmp0RDdyMVloTnhoZFRmVFA1Z0tNSTBWMUlTczZVanZLamlucmVnOEtmUURNY0tmTDFXV3lIYlgrSHRpalRvM2M0UE9VcE1Ea1grejdvYTYreHZPdWZBdUtSRU1rY3Vsejd0WmN0VjJVbFBrL21kQUNpamlUUUdDeUt6S0F2LzRRd1ZEaEJZTGR6eGhvakVtU29Ja01OSGRrOU5oVGZERFl3USsrVjZMdkpGWjNsR0hDNGF3SmhXZ0t6R1R5dGNWMkFHbUNxZzZyYUdMNWhSRHg3eDdRMTdJcTRRdmw3czl1eEhHUTZFYXdOc1dGN0VhelY1dUJlUUlVaG1KODJSbDluZ3R3TVh6QURLYWloRWxTa2FXME5neUxGb0FOZGdWNE5Yak9XdTdmRHJMY1hDTXk0OG9FRWVTMUVVUm9GNmFGVzF2VkZlSDVoYmplOU1GTG9BTGZ6bjNxcFF0d2xNcDRUcFIzNnVyUVVPOHZoMWRkMnp4QTl2RU5hcGRPMVQ3MGZYak1uc0dDRjI3YTBJWGZhUGd5OVBuQ04xN2dld2N2THk5d0JQNHlzcDNvUjV3NGE2aHFaNEhTZjFxclRST2VnRW1BVDdpWHN6RERsSkdMeDV6djlWUVk1UkZsMHlGZm1LNUlqSUJRUlpnRE80VWZqSVdGem94SXJ5VTFYUmFtNlBvdjBWQ3RtQjBHc1U2M2xVRlZqb2lyRWpRUm1hQzdrVlMxV2tKd0tpcUZteXdyT2VVK3c0NWpSTGs2RnVoTVMxMVVLWmFpU0ljTmV4REp5Z0N5TGdRRmN1L1RLaGNvQnZyL2JoYlI4SHRvQmpRb3lBcXFpYXR6emVSSW95V1pWcVRHWnRlcjdtZjV2cEpLa3Z3UEgyazM5eTRyQmoyOU5lcXZxeHZNYkxtaC9mUE5EKzUzeGJZK295bndsTkxYZS9JM3hndWxDeFNlOHkxS2V5RGNROHVWa29SOFA4clJZeWhZSHBpQU91WUxxOHZMTmEyc0hwb3ZQd0FvTUlRdlZtRkxNR3NNYTlDWnRSZWwxdmFFVDBMb2xkTnlhaTBIYVE1VysrNUVlcCt0OFdVcldMMllFc09EK3B6cGdEdTlLTVRoYnFlRFQrbWxEZU1FVUZYMkVScWx3eTFPOW1VTWdSOXdBVFZzc0lSZ3ZiZlE2c2xjOHhnazRiMUtjemtjMHlEL1NLVWM3enBmQWh3YlhZWDdQRWVyYm90Z1lONEpRNHZVVUtndmN5eWpOMXRJSVQ0MUMyM1JOb0xFNDIzbnJkRjFCSkFxODRyT01ETkFzWDRvZk9MV08wZXNtYU9jdTMyekEvVmNudkIyT3JrNk5TZDFjUEpyVmFKQ1RheGloNUVsRi9oRldVRExNd3RCZlhnZkJ4R2Y0L1hZSXNFSkFWQ2k5UXZwYW1HNzFkK1FQcDN6ZFBLcGdwL1ZMM3BzQlhyMmliLzFUWC9nYWdCTExYdHo4YUdRYUJMbVlWbWVESitjTTcrT09QUytLZDBJVVp4YkMzc0EraUYvak9ZZmJ0aTZvc1pBRFNOSlRyQ1UweGsrY21JN0QxK254b2JWR20zcm1DSUV6ZXRlR0t0VjFGbnI2OXIvQXlNbXZlWmtySm43Z2lha1grc3FtVlg4a3FlNExoNEhzcmNhS0RRdTM0ckszTkc5ZE41WVpPcUVUbGRJVDVFZ3VxMmF1K0swTnZaOUtrd3FhdEJGcnVuclVWemRCUCtwRm1hUTRrVmFaQXFYa251Tm9yTGhJanJUaDd2T09WMlZ0RkQwWlMweWo2elpscXoycm1JR0ZPbUZRRlBSWFk1MU9GUTZackg2ZGRNVzlURUcyNERONDMwOXBhOFllR3JhdGxGcXJSOGc5VCszbnV5dzc5NmlzSGM2SDRkcG42dEFUUUlGQ1EwTG9PZVJyS0ZzYnNyMmxtOXU2WWR4ZmV1TGZDNWRseEtYdVd1ZERNUVdxMkNxcEV6WkNyV1RldUtLdGphcEhJdk1iNURsQW40b1FtWWlmMjFsSzZXdlluSWxsWnIxMkpmN2ZiNDR5cDRHYno5RXlNMmswSHRWSU1ka3AxRG15cWcwUnlqWnhMZ2x1Y3JoWnNzSnYyMjQ1UXc0L0tvcXJGYVVPSzFpZERnbU5xVWZvUTNBU2c0SW13SU5uc1U3WGs0RzBwRTJZcWZ1UWl2akRFUVJkSFUxZWZmb3hCUUZHTEFyeFJtZWMvR1BrNVJMUy9uVVY2UTFtRjYvNEVIR1R0QUQ1S0dDMm5wMi9vOVFlVTc3bkFzdjhjT3RJdHdnczZSSDBHVlM2Mm1tb0xnUit5Nk85eHZOYldyZXVLNXV5Rmp0aStnQ3BKNFd5YjBueHhTNG4vZUtFZlpDUEgwMzZGTHdtSThTVENhUkJSNVVpbDU0Z29tS1Q2SzBVMWhadlBDcm9EdFZId3ZxczhFMEM0VXlyczZCRzFxOVQ4Z2U5ejNTamdIQVFRWWpKK0owNUFhK0lqNDZ0clhhaERINDJyNnhQU0Q4bWc0SjREYUZqZUFWZlBWaVFERi8yTWZzT0UvZzVMWnJYOG5LL0p5dEpaTDQ3Ti9yUHhEejhXS2R0WG1mSkRqMDFrRlJvZVRQNlJYWlRCamJSclduNS91ZlVOKytad2txcCtNSzZqNW1MN20wZ0plZUNFVGFjRDN1WHJ1UWtFdW1helZqNEhoZUlOb2hLa2pmbkxlQVo3dU5QZXQyZ2wrRXBIUXZSQ2dRa0t1RGZCMlh2cy8vYzgvMzRueUtvY3J3aHVEVDQxaW11eE13R2psNDh3SFdRbkJST0E0TUlNNkNRS1JPa0JqN0pWeDQ2bDhodlZVZEJtK0FBc1hja0w4MlN6OXdCSjJidFZqYTQ2Y2REV1pYdzNySTNoZVVRVmJDdEd3d0ViMUlFQVZsK1M0MWI1SHhVRzJyZm40c1ptVVBYYnZjZkgzVHg3VjlvdEFHREhFcXVybmZvK3o0UVlLZXlkdER6U2trOS9vcVFQRE02Q2luMUhPalhaTlNXWFJMQkgyemtRTTNzQVlDUnA1VEdWS0FVdGJTSDFvNUcwQzB5M21sK1BWbFpqZGVXUHllYlIyNlBITGQxSWlkdTc5T0FIRGRVMXB6VWJtbmZHeTZSeStaQmVZSVRwdGp4NFNxTVVLZDdmZ3N3KzA5UDJ0b2szSjBycUJnSHFKVnhkU2JUTTFiQm5LQ043eThGV0FNL3RwendLNVY1c0ltK3ZUNlhIcUdEVHdGUGYwVkdmS2IyODNsUU1WeHNyQjlSREdHUVpuelh6amtQV21UdW44bDIveWdRcDh1bTZmTHB6c3h6MmdsVzB2VzFiSFhoODhQVnVOdzZyWnBiRlFwdXMyZEtjczBnTnlZOWpIUXVxN2p5dTFOM0tnY0YzRy8zL090VWtxbzVYT284KzBwR3ExNldLSWZsYVIveFBFRmNoOTFNUFVaeXNjc0luUEJ0Y3EwKzJUaDhSUmtRemoxa1A5ejNRTWpIUkkySHpkOU1PekJ1anROc21nQlpXWlNUdENsZnVQSEpJdXl3MmJCZysxT2dzUndFZExRVitBNjNuN0JDajZUdXZTVFBmUy9haTY4QWlpYmhQRzh1Q3FWcmREV2lwQ1gyOVA4eFBFaGhoUGlWWGc3bG1IcU9ZNmszWWMvWXFiVUg4K1o4enZVYmM5ejhxVlJ1K2ljR2hLMVRHR0ZGbFREdThDU2JBakd5VXpwWW5YLzdyenA2R0FrMDlLeG5zS05uaHVKY2VhRTlEWk1iakhoaGZoa051NUczK3N6NTZiTXhReVJjVXhKcGJKM1QyNUYraGtmUzJ2ZFYxZjVVSkZOUDExT0Q1RHVWNnhCR0h0SGVrZ2NrUnFobTNLOHkrRGU2WFcxcXBBL0RUUE4wL0xUT3JUZFVkWWUxRHdnc1BwTTROcE9XRzE5Y01wUVJBN1BuemFQa05VYktWaHJpT1hLVDdMdVN1aEFSazRNZW5OcjRiT2FIbDFNbDBBMUNjUkd3aVhLZXJZS1J3dHFYeHcwUVFNNWxUUXhwM09NTk8rcFhrVU5OcHBLUUg4eVFZZElOOGIxSytuMmVuV2ZQTHh5RWkyWm9qaDRob29GUEdBSjVtdDlvSWlEM3M4WDFUaG9iaU9PWHR1aCtvVTc4QlR2S2t0UEN0bVU4dGFGSTJUMERibW1xS3NaTW1uaCt0QUhwWFNYVGdjNWlOS0pNeFdjNzM4UmNsWFdWeFBKL0xiNVNqU1RpZmdaN1BndHluQW91VDUxbWxIMHBjUEZVeFB4V0F6NkZJVGt5MmgwcU50WGZ2QnJnOXd2bVErVjBMeEV5eHhQYWRxdVJyajZzQjJZQVNWR25FYzkxeGNLQkdsQURVdDFnNjk0OElPZHkvQis5VTVidktuTnF6bDFQVDY2Q2ZLSk8zN1FwSG9YVG1VL1c5K1NUMktxSEg1bjR5M21BUnlFU05UV2J6QW1TUERXVG5PMzNCcDYwSU9lZjlPcmcrOVYxU3pmUUlwL1lYQXlqRGQyaER4MmpEdDNJSG5wOUVTRDVmbDcyb3czUHVNNVQ5T0ViQ1c4dlAzNXlJdkk3UE1tKzJ0WnVjeW1TajNEaWhiN0lLSFNJWDVGMm9KS3pRS25XRHg0Vm1wekh4ZzBaYk05RXlzTHluN0VESnhCWjlpRWx5TlBTeG9IYW9adG5aend2N0NmT3hiZUlnc3ljT3Q0bGVHRmVlc3ZQYjRNWkNUU2YzN2p0emExYjB4OHNhN2Q4dUhWNzRzMnVTK2lJZXBNcG9oR05qbXhvTWtYV3AyMDlnTmxsZVV2dUxBYmJkdk1wM3Z6aGdJWHNPbCs5Tzd1d1g5MC9kYmlCRFBZS0pTU1BBZWpwL2hYVmRxSzhjTGl4b214dFI4b29sRC8xU3RPNHIwR0xIYXdwNDBiUjA0dEFoU2xhL2ZBUmpuV01RTnp2Und3VHRDa0tNc3FoTDExakxESGlHREltUnZJWFAxSWtTVXZqeEtLOGVBYzRzMk9tc2VsbW1McisrNFJEaS83NXNMaHRvaWxRMVBoMWFJMFpnazEyVnNSTXZpYTJRelExWHcyTmpZR3RPM2JsR2x4S0l6eS82ZnV3K25ZWU50MFo1ZUNGTEszVUJQem82WE1YZWI5MldXSlgvSXZxTzBnMk1QaGJoaVkwQWFNVTJMYVp0cGFaRnZkcjF6SGp1di9kWTNkeTRtVEdaQ0RsamljTHNTMWd3eHlTT0hYNk8vQzNzR0J5bkN1Y1k0a1dHTUFDNFA5enppWFV6R3lMQjlRZVBhN3EyenE3dllqMTRsVUI2OTZPL1Z2dWJ5OW1uWHMxRGIrYlc4cWdDMG9RZDlkT0krNEp5dWlNM0RMNFBUZEdIQ1BJV3Mzb3ZUWm1wSitaN2hqY2U3MzZ0NHYyOTgyc2lwTHlqdEhVeHF4Y1dRNmJ2NHFlUTU0KzlhaFB1aSs1YmRGRlRlbjJjcVAwdE9WNGMvWCtyYTZOYnZqS1VoVjNZRUcrQU9Dd3hjV3lZVkZ6dzFsYnczbmpwV0JSaUdPKzZrSzBjS3E5UXB1V3hoMUZkWmUrS3Uvc3cyQUVTUXhwYmhtcEFpYUtEbDV3bFovMm1QM1hmY2Rkdm1UM3FLMVJrVkZsTjVDZVcvMUd0dDc5R2tDbGpKU2xTSnlRb2JTOWN3ZDlneFZUSFpkVU5TY1hyMng5YUdNOFlqZ1hUQTJaU3cyNUdpOFJOMGJqMUt5aWhlVkRTWFdBbmpwOC9GT2dnelBJMzVzNUw0aXNOOEUvLzM5N2N1MmZhUXVxd2lIM1IwbWVjNFRsbElIMXQwT24wMVk5MVJqT2FkNnZWMTBZWEdsOGNMZDJyT3dvYmZFSzlsdm5wLytYMTdjWEZkUXBDZXJVQkRFNkJxeElZSFBRMEFjdzN2Ykxkc0Jqc01HUG5vR1RaMDFYNlUzTHF3V0V0cW9DQ3B5TzdOVUxGc3ZyV3JZL2tvOU9QTXF2MlZ5bnBBdzBGZElRT0dTaEp0MmNXOW02N0JyRG9UMlJXYVl1TlpRWHNCTnhYSGtHWk5OUENUbE82Qm9VU2xQUXlaaG9DaXZoeS9Xa09EUTFqcXlrZ3dqakpCUDhpLzFvYW1XRFE4NVBrOUE1Y25maUJmc084VC9kYWMwbGpYdjB5b3NEcTJydjN6T09IdENTcGUra1QvUGVRcUc4WGtsVXBTWk9QNFo2QnVzeGtacHhqZ3kzOUR1NzZOdW9DUjZaaTg2bnUxc1djdU8zSDllMzJ1RHJZZDhXY212MjF0NXZucG1kY2NuZHMyQlZ2SzJTanI5S0ZnL1BoeFFDUXN1VkVOQXpGQ0tNRUk2WFp1YmtySTNMUWVsdkt4S2VFWHF2UC85N0pTKzJybERMVE5yL296QXNGY2wzOFVHMmo3N2lQMm40SHRGZ2owQktyU0JyM1paMDB1VzdUOTdlM2xQMTc2MmFRZm5mc0FIUGNhODVEdnpuZnBGcEl1aVllRVBQMjdjVlk2cy9xYVoyODc3TjNOMzJCN1h0cTdGcWxCWnlWSTU4RnpQbXQyYkhJYzZyZlhYcGoxNFR6R2RuZUZ1UEVuSFcwaHh4QVZQREhYS29GZDlKSFlUSkRUeE1lMmlDVGdUUWlSZ0J4QVAxQWFvRDF0SVIzTVVCaFFFbG82T3dXbWlSV3NzRnp6VmJUOE5SNHhlNXNXWUZuK3ppbkNXcDBwQjZET2FXZzIrVlUwR2VDc1BPVGcyUHk2dkxNbytuTko3ckt5NFN4VWV4eXlJVVVBenZyTENMSUc2SjJtMVlScnU5dXFKWnVEMUVDN2VUaGV5SFZkMkg3ZXRselU0SlBUZWQvYk14Vlh3N1hoR2wrTkVqZURMSkxaZno3TXYrenFxcG55dkJXYzgrWnEvWm00NS9ieGx3YVkraWEzS1ArY0dkZDFKS2FUVHQvRnZlL3MzdkR5WXY0RFAwL3F1dHcyOFgwOXQvSDkyaVkrSUluL01RWHlJWDNZN2FzSUw1NmZrV0ptLzM1OHBadENoRS9VVWR1Q0ZDMG5tcVhuOTNaQ0g5em5SRFowYWVTM1VzQUpnanMycGNuRmtUYjhWWm02Umxwc1VCOTFRSXowN3N2eWsxeitVci9hNXhDWTNuSTlIbFJWWmN2OHArKyt5dmZIeEo2OElIUW9XbU5kOVpzOVdLNXluODU3MXZCYjlHZStydjNjSzJrZ1I0MjlVNytEcE5DUFoyV1FzUUsxY0JKaVFPM2g4SFRPVTMwVzhuMFc2SFlJMzdISjlCSTBTOHlHcDh5QW5PSEZzQzE4djFVT0lXOUEwYUU3S1Q3R2lkeVpsWk04blk0ZU1qcWZodkhkZHIvV243d3UwN0dLZXJ6UVdzZnpESWl0djc1alZtN3lBN1krdkRNZHFkOGVyV2RtaEF1VFAyZUlQanlkcUphdVVnM0pDN0xHRGI5OWNISlcxdTdiekYrTXZzWk84K2p2NmF0RTJkMnhSQmxOUDFOVnJUUDZ2R2FhNnJUdFFsU0x2NjU1SUZ6ZzRkSERRd0dHRTViU010UHpxb3BBN1ZhOGdCbXhvRTR1aEpkRGNQV21iOGt2UXFsN2FybGRvRnVYNzQ4dUhXeHNOdk5SdHBpenpiZ3c4RWFDTHVaWmZReENHaHhJaUViSHB6SmlzNHBJWlFwQ0FzVUxiVjdMMWJNRnB4TWJZTXJYaWJpbHdWemsxbXcwTXp3bU5UU1hWNEVhbzBkbVVGZnlua1pmek9maHNXN1cvSWYyVFpQdEwrM21YU09WaFV5TWROalp0MkRTeGVyRFlSVXhhWE43cHg0eXhRZ0lVRHRiYzBkNDlScTZDMUFSMGlrYi9adjFidHpsVjcxcCswK0JBdDhwTi9pS2NRVU9nbVFhSGM4cjEwbnFMY0U3OEcrZkF0NkxrN2ZBeGVDaSs5bXpLV09GOHAwM29LNitkeDR4RThWT2lSNTZtVHYrbmt2Z3NnL1Z2bWp2dUErVElyWTA4a0YwbDcrTzdFc1p6a2ViSHpHR2V1Z2tJK0dLS0ZESDl1WTFKc2xEKzNrK1ZUamp1THV2SnF2WlhuYWRUeDEvOEFLeklmV3RtL24xNzkzOHJTUDNUMUFOenVCbHd3WmZlazNyb3J1LytuTG9sMEJDc3NpL3cvV0QvZ1czMWFYV05uQ1p3K2poT29JL0EvWG1tdTlwUFhtVUlOU3kvSVo1OEhlQVJQVk0yK09YN20yYlhrRWFjZktkU1dvSHpGY3Fwd3VYSDd0N1cvbkk1d2FJR0l6V0V2aTZERGxCY0VrWGZpZkVxcWJBZVlpc0VzRWpzNW82RERVQlRrNSsxVmlIV29iKytDSW96SWpBZWVJU0NIaTJ5TzFqVFg5K2RhQUppNloxYTJmTzZnTmg4ZjFtYXQ5QnVYYm15U2xHeWFtQ2lkUktnOHA1N1ZHbitkUE45ajg5azBYcmsyL0xYd0JSbFNEMDluNlNneFErV2xDWXQxSkpwMEFFT01zQ2RHakFhN1dYdnVmdzZIUUY4RkgyRVpVWUxzVjg1U2FVT0dHbVBGeTU4bkw1cDNJWmxTZ3dLK0wxY1AyZ3o1alNzMmRxbktOMDFNVkV3aWdxOGFsdDJyTnM2T0QxNjJhNTY2cEtWb0d5b2Y5WktEM0lsb1dXdFRQLzNYMGVQdGRxOXFWdDBVVnBZN0dUZFlKVVRyeEduQTZIR2prekhXdUhaZ21zMVpLRnU1RldjVUxvWmNwdDhMWTd2SDRaSnBxU1FuOE9NWHp6OWJacWdhTzQyUUI4UzhHRncyajRqTVJhaW5LK29LMS84dEhJQ3lIUWtPMjBjdjJ4eGU2Y09OMnZuOVRGM0dRM21OdHplTjRwcDRhTStSRldNblNEZmdwNHFYSTdtVTJEQXJZMFA2eWtSQlVBd09oYTBsejNtZ3pXSHFSQ3FPa3N2aktsVWlqaTdDejlzcmplczhGTzJXVkVDdUNTUWFkL0FVT3hmZFF2Zlg1aHJGWWgwUE5WSGppcmJpNVdBL0w0a0VMUm5kUlpDbjUvRGxPQUpSaHVQbnlOTGRpQzlpUzEyelAzYkNPWVdtOHdtcTllZ2JhdnJhVFFxN2tDSWZKcUp2aXFlZnQ5Y2U3SnpHQVhZdjJ2SEppVnpCL29mWGEyWDRFNjFhY1F0dXdPWE5UVWU3aU9XR1E4ZU8zYmlGNmE5bEczT01xbzJyMGVoK1ZsQlJkbHd5WDhaRDJuTmpKTStRQzl5QmFuSjlJSzUrUFRPQ0MwYnpMWFFrZXFkaHg2MUJoTVpoYTM2ZjZ1QU81QTlIVWlHNU5SQ2MzWXJ1bzl4WU1IaUdhcW8rUVYwMHlMalJ0Ni9OK3NPb3RTdmVtOGRiUjdQMmxVUU5xYWdjdHBJYU9WUlNHcmxFbGMweDZpZmRvaDhhRGo1RlFBNFYyeHl0TmJFTlNEYnVxbHVOSXpmME9OcUs3L3d6Zktycm5WN1UybkQzRCtQd3B1dVJRekk2bnlTa2h3OFhUNmdtRVRIdjNsNFBjK0QxbVJkR0dKYldIM3dLVCtFYmVxUzJxWDVVRWtWd0FpMndzWExvVEU3cEMvQ29kbXRGMExoaVkwZXhqaDdvcG91bUVHZzdnOXVKSUcrL2gwcXZsQksvM0F5TW5wbUVsandKM3ovZnFXQ0FLUkdZZkpSV1ViajhDbXRsMVpRZkQvYXpIL0pTTEZOSWkwVkJYcW9TOVJGYVZJY1FWeWRkOW5iNUdlMkJVRVdFYUlZVHRDU0NscGtaaEFDSEtqSHlFRWx3TDQvYUFLcStpNUY0dm41Z3YwaVJvMXlKeS90ckVYaEp5N1FxOThYeDEwbVBrc0M0ckhRL0Nsd2llWTVjNEpaWVJHNEpKTlZ1NHhYc1NJOU92bEdTcjRYTkNyd2VOQ0hCM21qdzhhcVBkb0o3MTRSY2I4QXFEMTBBQ2Z5T0FtZ1hmTG0vdVdST2liY1p2Z0xhWXhDMlpuaytsRVEzdno3dXM4Q2puZVFFY1pGSzFhNmNOdDArckZZZnZYZWplN3U5RTlyVERGcHl4ZndhNVFXWGdOdVROYkM4bTRyYmlyd2lXRU95NkxucGhTa1BJbUg4VzduaXZ6bjRBQWUrUFAvWGhRS3kzK0NyTUVQMzB1MzBvbGlxOCtSbndwZUFkcUs0dER5QU4yaTlZYWY5a1JmUE1rNTkyU1FDWHMzY2NqQXhxNzRnQlo5TUx3L2l2dUdXdzVJWnVQU0NyTHFEaVZ0bWNRenZaVWtvU1UxSnVadEx1WE5ObGdTVnRKd0J3UGxCcWwxbjROVGRkV0luM01mUkFSc3hSNWZOZHltVERtK2dlK05tYVZlcEswakhKVFBLWVYxQnlYUjhDcXEvbW41d0RRV3E4NGxNYmlBRlBrR1k0aG1wTmQ0eXBMUmlvWGRFU2ozUjR3bmdubWVtVm52N1RlZC9aT0wveVFNOFFraFVWQXBKUTVXSU5Bd1NSY1h3ak9TZlh5bXpYUnhXTDN4T2h0UUhwYk8wRnpHMDZQNkJLdTBKWVFiOXJxOE16TEk3c08xRW04ZitWc1dyYlVlMGJ3NDBOcnBQZWFGT25pODlGY1VNRkQ4aVFucGcyQXdwVFhxMFpxWm1ZWGFFbEpDQ3VXam4rM1ZzVW5LWWxMRjQrOHoyNHlQVmxsTmN4UDUvNHlHS25tYlRraVVtMDFvMU9DWk9CcG94TlE4dGFHN3VCcXZqRTBBRnl4c2FGaTh5TlV3cHdIRUpTdDkxRFhXTGlqMHVCOHN2eHNWaStIeDBiRndPT29iL3d1emtZQlNIajRsN29NRGJ4STdDNXFibng3ZC83dm51RXYvei9lL0x0aDg5d3dkcm42ZUdlemVubW1tQit3RVh4d0UvQWFPTzk0Um9vTGJjWFdGUmI0bmt3ZG1ITXFBTFl1anM3UENvd0ozNWFJcWZCTEZBd3Fobkt3bTFsVGZTdFpUQmw1dlBGNjlERWhIL1pCdkQ2MEF4WmV4TU5PeVNJQ1lYcmdwZElLQWE3NWFGb2drcUxDUGcwY2xvWW14b01FR0p6UStJaU04Q3VWYzFrbG5ZNUNRdWxwekp4U2Nscy9CTE1vUllhaElQOFZEcURYT053M21OZTVTY08xdmlNYjY4ek8zdkMrNlZmeTEzSzdsd3J0SjlZbnpCK2dPWGUwazc4UEpGNnl2alpQOGVyTzNHdGtIN1VycUJNakRLMkw1eFpFWGxkR2RVSlNob2daM0tTejFzbXNtYm5zeS8zOVVzbXAzWWNFZlcyblpYTkRrbGV0RFZKYncvUG5rdkR3eWNQTDJrZDZCeFg2ZC84YnA2TENWYkg1VlNRR054cE1zaml1MEtHUGVvajIyalN3UFg0enZ3MEZYbzNaMEY5bm1jSkNENFNnQmR3TVZCMmFrVnAyNVhlNHU4UmJlckswNTg4OGc5TlZQRHJ6OXN5ay9BTXdldzVCbTl3NHdrR3RUdFByMnMzeXlYbDl4ODFiZnZXRzZUWUZiTllySncyVms0b2RMeGFzUkF6OHQ0NnhDdVJoQk83ZVZ5VnV3RVZnQjFxM1B5bHFtVVhMWmFxQ3RjSmNpUmF1S3FITjFCZkI2SFRBRURqek1vNUMvckpwaVpuZkdOYVppVy81Y0NveDd3T3RmZXUzMmV3UHdIanZnU0dwcURaTlNONEJKWGs0dmIxelRWcFlYcjVLWE1MRzIrek1ObitFcmplRU1oaWFVUVFGeVVMaklEMmJpbFp4K3RMUkFITzR3UGFVTm5Vd2h4c2FFRXZMeHNsVmlia2hrYTdCNFR4VVYwS3Z2dURxZUJRK01EQWVmejJVVUNEYXZ3UE5nK1p6aS85SUlIcFYwaWVSSTJOSCs2STFXRVNFa3JpUHpPQjlybVVGa1E3bXhQcjRtSFNrVGF5c0NzZCt3eThOcFYrTjFzaVhsS2NnbzNIWkJvYnU4L1VYYnZYSDZIMkdQMU40UFp0Q1dDUFBmTW1sUGNlZjUrNjRNUTJVa2lGL3E4b3h2N3NqR1JGRGQ0eDlIaTE0ZkExamtNM2Vmd3ZYbjBWbnBUK0F1UFNDL3hwajJIVmd3Y09yUnA4KzRESytValBNSHFPd1lsVHBsRnhpcVZTbXdCT1F0WDRKYTlKcWppeE8xcWdBZ1FjWFFxVUZzTndqN2RtZGsyK3lEWW1zOHdmQTYvbVVjei8wdCtmbGdmZlo4eTJqVFdqSDhSMnpqZE9Mb2ovZlJFbUUyK2NsbTBDaFhmN01POTVrYkI1b294bnRscjc5NmVPU0RvNjR2SURVM1hDcENtZURhNDAwU1ZTeUsxRFlhREhZckMwaXdLTWI0eFRsNytsMWlYbkJFV2JCMFRmWWpXak5JMGpEY1VFZVBYTlU4bGwxVitySzA5R0ZpU2hjYUdxT3VHUFNhbVpDSjBuSHdpNWp5VkFDT0c0MlFFL3NQdEs4WS9KZll0T3YvQ3ZJekc4alRNSE5QYmViMXBMaFZhcXhHR0YwT2lGT1FuNit6Zk1lMWRmMHRNOFF5MHJJN1JoRkxES28rTXMwejU3QmVQZ0hQWGQvL3VUcjM1YS9uUVY3L2Y2ZHYrbjMzM3dTSy90RmNCZFNac2xGQzVkSFFvT2pvOGNuRGsyUlVlTmpTQzdBZ2ZHUXZEcDBvSExGZ2JRSUFLTzFZWENUdVZDbG53dmduTnpWRnREQ0lHY2h0V2FYSmI1WEpwRUdHWDBIZG83TU5ydGNBei91R201YU5STVdqcCtXOWZVdk45RWljNUtzbkcxcFRsTnBLbTYwM215L1NsWTRocDMvZmdvKzJ1UC83czI2bVVtU0t3Q25hUlNkUFZBR1Y0M2FJbGxmQll2TlFCRUtoT2xFUkZaNFJLOGpDVjdBcnQySG42U01GaXlPcjNId2VGRlBwR3NuTFQwdUE3bUNuTUNHNlVuQk9hRTQ5TEVIQXpPS2tKUkRTMmhTN1BLZ2xMRnhDMWFNT1NSUWUraWxjc2ZVL3RXd1RvZTh0NUhMbWgvM3AxN2V6NDRKVjc0RTdWWHBSWTQzNFR0NHRXaDdmblJSRlRTRFdpNVdHVnN0VlUrWEpqVGRIb2Rmb3ErME1jN3o4Qm5zNGFDcVhBQ3M3bVJ0NktxeXhmajB2QzQzRWJzVnYxWmJZOWpINHdpMFJMeG1JVk1Va0tNdXlOdXE3Y3liakpLaUZTeDArTGlkTFhMY1FDSlVGYlNCMy85eXJHMW1rVWVSMDNDWTVyRHJRN2ZSeS9lc1g3NnA0SGE5YlV6ZDZzNmlmcUFMUXdtU0dRTFRialVoLzFLNVp0MFFWVElvZTk5RnhWZW1TRGxCZGxVcEU0OWJyeDhTZ1FMeUVqSnpnd3FyUE9UWm1ablhrN3VqbUh6T0p4TXBJU3VCazhGcGNjdjA5WXhPUWJmT2JYaGxkMkszcGZtKzNIMFd0d2xkN0VET1dZTmxPUlJXSGM2UGNPUXYxS2JBQnA0OWtqUlVuY3pLenNTOUdzRHZRY1RuWHFiWW9JYXRSUC9qMkp0Q2YxajcyUWNCMTAxNm5paG5XdlVOWG9RenFiZzdVbVZpMmNuM2JOTlVhUTZIMFNiU1VFZWd6YXFiUzc2NFZraWpHY2VlQVpJdDVuUWpWWlZDc2RzQmwrOUtIM25KY1I2Qkp0dmhEZlBQZGNhbUwvTzIwMVluZVRjOXovZ2Z2N3VBOGU5TEZnZS8rM3pxM001RFNGV0F4ajVEdUQxWVpVa3llbk43UFJLeUszMHJEcWNYWGo3UGpnYzRlMldRdmJ5eTBvR2VvbEQ3a1gwZEYwZzBwakVPbG5hTFdyUG5hTXQ5MjN0OG42M2FqMVpXY1lSTnFISWtJM2JNc25vMzV5Nmc3NnQ5dzJpS1MrM01sNDFDcUowY25USWxEcXdBdmlVcmt1Rm54T2FoS1Fjb3c1K1BOZ3Zsd3JLajNvTTc5RFByR29kUEdhdUZIYVpTb3Q0YStJd29IRzRySWxUWVY5b1lxSWNFVm9tQ0k4d3RiVkhuN0RuaGxWbVUwUncrTkNHZjYwVUlvLzNMLzl4TkRjRlF1R3RhRU1LQTJaRFlWRDIwLzZzWGM4Rmo5Mml0bXFJMVpwN2phR0k5ZmNzeEluTXFZQ3MyYzhXTUhib091ZFNSS2d5aUtGbDNHWFBUTURhUU8xQWVvclhST3FMSWkwZTZQZGZOMDI2Qk52dGp6YWVVa1QrT1lwajZkNTUwRGNTOWpBUi83Q1FPMXBTV2N6dVFHOXgxQk83MjNCTWRrOEsycXZrN2ZLNGlPY2YxSUVpNWx5bk8rVE43ODc0bklYcnZQZzN1L21jZFVPZWtCNFArQVdDckFFN2MzMzVGeE0zRkhWaGxCR2lQd0p3YjhHaGs5VEJ0R0pNU3JuakJsYjF6aUNQZHhjckJUYk9HNE1qcjR0WHNqczlOOXJOYkhmVC9MWDk4clY5eUNydXJkWE84UGM1cnM0Vlc0eEE4ZkhuLzBxUTQwOXZIemtTTmpKc1AyWDI5YTQyMGtGVGhmRGk0K0h6WUhhc3AwMitpditLUWtzdWF4QXVjaFlweWpGeThiUjE2aU5YdllVUlpTSEtHRFRJVC9rNXlON2xQTTcxSU5CSGJ2N09oY2ZXbVVoZGZzQ2owRE55SGhHZmdvWm00TmxBd25PblJsaDhEM1FPZU42N280ZGU1Y1A0NjY3K2VaY2E5bFJWa2JqeUxabHdvdmtQTVAra2FXbFkzaEdGVDBSeFNRbkQvR3psTFNTM1JVbG5yK09sZmxIakNXbDdJMEkvVkhEMUVWYzhBdUw1blBkVVg0cmZMQ1B2WktQcjA4K3ZpNTVmRjM2MWg5UmNTc3lZamJUdWNIeXpPNERJK05KdGFCUzFHMzJ0c3hBVTBRQzlsWlVjaXdwTTVhYW1sSEdTZ0Y1WkxIU1V4TTU2VmswVG1waUtpdlZ4OWNUdTI3eng1dTN4OS9zL0w5a3d0VEhuUmN3RVExTm93UDFHSFE0Zk9XRU43b0dPbHhSVUJ5ckR1UlJnU1hHZEV5eExVazRPRENWV3R1N3VGM0k3QmxncUxVclJZSWRaaGxxcDI3aEhwN1RuZENtSTZBZ0lJRVdGb2NuNFJJVGNFQ2ZuQ3U2RlQwZEhiS3dLMW13bDdjQWt1MW8zcTlMQVpiV2l0UFNidW1TOW81dEc4ZTN4V1lROFFtSitHUmsweEVnM0pjZ0JsOUdTOUF1Sk10ZkU4Mk9xZnJiRDZzYWpxWUF0a1YwZC83VzJTWm5YMzN2OWFPZ1V2RHQ3d1VKTFRwWVFTRDNWRS9LbmhUZDZwSjFvL2pxTlpmbWNIaVNwUi9QNks2ZFptajVPWlcyeGlUS2llVGRkR05aZUhLQzk4Qi9FajhmdjkycWl2Q1hSTmxrdGZDWjR4VkszdU80eER1NGpTNEsxR3NUejlqZHE0Q1B3d2piTDluNVRuQkw4UngvbEYrN3VXY3lkY0JVU0VmZ2tFWC9QR3h0VzNhVjBmQnZ4YUdaYmRXSDkrbHpUN2JzUGwwVmptSEYveUV4LzZXMFpWSWNtcTJJcE8xNnhJeUwvaStpU0tjcS81KzRpQThwODE4SnZRSlpOSGJNNlhDU2xxK3BkS08ybUxENDhRRWlCUUc0WFhXZThwQUNGYUFCVUhVR0N3UWlRSUpYcEUrdGUxSHM3bjRTUjdyYmNQbUlOSHFFWmFkSnNXaHd2RFRWWUlkMkVKMmloMFlINktIaG9YQm8ydndkamV5ZU1IWGRpK1IwUDJudlB6UnQreXdhMjJjanFtamNoUk1pR2JvWFpWRDNreVNxdTQyMHR0T0diamNqQ1VleEk0dmlMNEROQXRPTHpyVmJJYU9GZG1JZ1l0TkFUMHdQNGhZUG9lSFZaN0tabHFTdEljZ3FRQ1BWQVJiR1VsMWpqNm94c1BWQXFVT0c2b0swWC9iN0FETUhvdS9YRkoxaUVGNjdUTUZBbmEybGVrQXZ0b0N0NnpacTBYVjJMbEFJbVJUZGJSaTNJTzJBM1ljZ2F0UDdoT2Z5STA5aUtabUtuTE1OT05RYUdGTkVmaUFWUXNJcE9tRXpJWlVFQTJUYnBqUEZ6eU5rZFNseWlUUzFCaU1oR3FRR3RYeURtZ0tVRjdpb1RySUxkMm9ldFNmdCtzUkpLZ1FKMGhmWGRjU2lKSHJhb2VlWnZ4dVNidFlMOUVMOW5uNWZmNkUvME92MGwrajUvUHJ2dWxrdjBBdjFlL3A5L1lYK1FLK0x2dXpnSVFzV293bmFYYTZzVzdMNnZXUTd0ZGp5V2VVdm9IV3N5ZVMwS015UXVOck1BSENqRmhQVGgrcUdQWWxRdkpYWDVYN1dibUNwTFFocFJiM0RNRmNzSXU4ZGhvSDUwNkx4Nks5RDE3VkIzb1N6TFVNVno3ZmNDMXR0em5uTVlKTTJvRFl3OXpKc3ZVUEo3dy9iY3ZneFhhS3pLMjVqMk1yYi9jb25JSXkydDRNNXJQMmFBL21DWGRWQWo4cDVPb2gzcUQyMnBqcEk5UFhzbWlIQnE3bDZOVXRkRW1NeFgxajAya0RhY2RUTGF4SUR4WWJWYTl1dDNjeklhSWRjdSszUE9Pc2RtOThXTnkrY3ozaGpOT2ZSanNRS0d3b3I4Wk9ITHl4bWY3YTlYaXlVUnVpbytZYld0ZW9Uc1l4cVdpWVZpSVBseWkzblIycHRsY1R4N3kyZlhweHRpM2duN3V0YVMzRVRoNkxtRzNyWHJrVm8xL2NlbG8yenJwOWx5TTZwNmJ1b1VCeDBLN2ZNRm1udE51TDQ5MzZBWHB4dGkzZ243dXRhUzNFVGg2S3ljZDYxYXhIYTlidENBakNKM1hvNDJvNlVzalpIUVJTSTJPV0kvbnA1TzFkR25WbksrL09rNVc0d245UnUxNGVMVWV6N0dEdmF1UmhMQ1ZNbmNuRHdEZDNpbUJHSzNNNkdlR0JrY0kvMTluaGM3NDNkUzQ5VjM2SUZsVitCZ3FWOW5id0tPR1M0ZlJmMzJYSGFrMDFxR2JhcERhWnJYMDVnNHpuSnhvYURIK3poRXduYWsrTnVUWXp3RWxoU0Iza1BDQW1PdDJJa1pEaGtwL05WelVTYkxjZzZRaEpRREN5N2crWFplS3REcEt3d1JYWm5nQ3BwTmF3cWd2ZUdZYkdPakhTYU13RXJyK0pjdmM2SjVwR1AzUkhyQkVKUkRyN1pRVlc5ejBZR2szZEExb3pIR0FJbkxTQkc2QWNNRUdzVnJaRXQ3blpDQkU4cmlzMmEwZExPYVdwZlB5dlNKUW9ZU29saXhuYlB6S1AzUmlsc3JSYlVoTy9VUWVxMys3cUo0eUFZQVJBZXRySlVUajhaZ1VGcm04M0drbFd2RHRWQ1p2T0JzRW13UFJoRXNwVnFUTlNubGY2eGhpdm9GeS9RaTBKblZqY3RsYWJ3MWt3WXFZZktpb2RnT3ltTnZwU1VPWXM4ck1wWFFLTklFME1oNzhRcUM5b1VpSkltOXRoN1NCQUJ4bHR4dWJpWXpUYVdwTzR3ZzRXQzBLeXEzLzcvT1hhTEowbjhUei90alVubjZJK0dTa21EcEI0a0RPdEw2NVNwUlNTRFlza0o2aXpOSjNyWGRWa0c5cmhTM0FLR2hYbWU0QlBDV2hKZis1UFdqTklZRjJNLzJYdGxVRndjRkJDRHpja2RWSER4RTNNRzRQcE1zak1ldnp3ZGtZbGNid3c1cFpJVW1NQzVVV1JwdlViQXg1WFFGYWpMVFdqYWkrcWtpRkhjaWhiVG9MUXJJVC9WK296TndNb2hUTDZMM3ZZR1dLK05mVms4R3RqUFYza2ZTM0s3aUVOeGpwMXRsTGJiclJKQU5qNmorSWJxMnRaT3BhbFFRajQxbFVIc0s5ZWczNjlqVlYvdkpVbGFrN3Z6WWNFU2FaL0JhSEk2WDRhTEt6aDBZS0VJZ3J1MHZjVHBXcW9lRG5BeFZtYWlWaW1hNkxRS1hucGlEUWZPUjBBYUxWRTVGeVdydFRIdk9nV1FSUFJObG9keWdCVXNKUWs5WkNYSlhiQXVFeXM5WEhHalFUVmVpMTB1RU1JZ1drY05aMlBGc0x5TS81L1ExNkMwTnpmV29YTkJqS0tEVEdEUFlNa0xLT2xwV0k5QVhJSzAzV2preExqUjA2U2Jsd3hZdzFsSFZGcGhnZ2pRYUlYR2xCckVNYnkxcXBXdWp5SVFKM0J1bWNIWFpLL2FqZVFRTGg4YnBTYWVpeWNsRk5qUnByRTl0MGY3MjI4ditiUFBOaHV3Q2NPdjFiWHdCcFUyY1N5K3puK0podjNIMm9BNHI0Tm8wM1dHMVdEeEdCMklCYWxsQitORHY3RllyQ202TFZPMTB3Y28ya1RISWVjbVNPQVI0ZUdRQlh3OWdoQURKRnpUYmplWUwrU3VteGhnWmJheVlTbG1IY1k1SFVXOUtCeVlWVlVjVTd6WE5nWXk0SkJ6S09XWlIrUERybGFWcHZ3MDAvR29SUm42T0FaaGg0T0Qra3RadW5hcEZXMXFoTmxKbFlGMitVeWFsVHYyNDVmMkxwRDE1VnFUcUdOYWdzS2Zod0U2TFY5c0FSVGFveERvWEpwT21ZVjAyK3BSQVR5QWxFWExrTlNRTFhJTVNpY01SNVhLdzk3Umk0OGxrQ2p1TXM5QVdlY2lGSXppdWpiVVdubS82MmxZSVVjU1ZFSDNpUEtUaEt2bWFiYzNnL2ZRdTZMY0FLaThLSUJBQTBrYVpZUGZMYmtCYU9GSkZZakdvek80VXBqT2xybWVnaTllQ2dsc28rWk1OWURBWmlzSXkzWG05NHZrYkZaOXZWTTlpd0JlZkFLbnVxTEpkWU9oRmZlbHdHaUxEVnR3Q3dXN2FuZ3hENGRyUDRyVzZ6UzQzSnp4S0hWU2VpUG10emVqNUt5Tjk5c0UzMURTbVRWL1NjTmQzbEdUQm5vUG1kYm1lcnlpYVd3MWFFbkhaR0JsTFZnV0VkTk1MQWM0a0MwekhUNThPcDNjOHpVMEZIYlF6T080YWhnazM1cW40NWFaSlBmOXZ3VVFNSk0wQzJhcW8wdTl2c1lEWUl4LzF3S3EyMEFRWS9yWWZ4bFRNdDQ1emhUQU1xcm9pZzBuaEd4Q1RxRkVTbGtzYlZBbVZ3aEc0YU01ZmtTQTg4UFVvNHRDUFJxb2ZQUjBybXE0NnpvTkQ5VkY1K3h0Q0VxcitJU29tWmc0TmZxZHdVblUvSGZVbHI1TnJDblo3dmRKNHZWT1Z5Q2puTWZhaTFNdWVjbWRpc2FPbWxZcmM3ZDdXd1FUSUNza3FEdXc5OVFZeWJKdzJhcXJUWHBYZ2lWcGlHZ1FZa2hXNHluL2g5N2IyUGdmUmpSNmN6R3VDSDNJRmxoVERDWXBKeW5TdUZuek1CeEdrVHROMHdCTDFDYkpxWGl0SzZVcXJUVUhOa1EvTjBjWTlkdStmcmZMWnE2NXMrUXFvUHFKNjc0RzE1NjI5Kzd1TGhmeTlPNWRmcFRvRlJyYzNYc2VRcGFlTjh2QzJWZzVNZVhVNktWUkFBaVliVFJKSFhRa0llRmQxeVlRMVhkTSs4Vzg2MEp4djZPRW12Q21NM3hOSWRQbUdKWTNGYVZNNkJ0QmpCR1N5Vk1iN210UlFHMm1VTXdEaFlPTGc2cFpiQzd5V3ZWL0h5MDFqZFgzUmwxUUJwOHNNTGRaMDRmVGkzZUZtUGI3OWhmMHZpbjhrUjgvOW1sUGxmV0tYRVRqQWdPSW5xdHF6YkJRZ21nS2F6bnlPT1Q3aDBOSSs1Q0xoNDBWblRzZVRXOThtUVo0enJLeExkbjQ5SmFaTnhlS2h6MkZnNHRyVzg2dDRsWGtUYmdtVGNhbXFCaWVMdVgxTTBFK0RMSnBMVXNuMDRjdVlBTk0rMGZ6UGk4VVg3OVBDVjNkbXZBQmxEb25ROFRsd2tkZjE5R0h3ODB6WHRuOHZ2byt3MmVSSmN2WFQ4RDZjSW1uUUJJL04vdTIwd0NEbnMzaWtSODlBSHRvUUE2UWVYVytXR2ZLdERHM0c5bGMwOHlIeTVFeGp1Q2xId1dnd2tvM1pMM3FkeVI3Q3FYOVpkNzdtNHZIai90ejNxSURqQkNCTXJCN0FETDlCby83NVRJSXhtUGZnNXJjN1RJeldQdjRhRGdkRjVadERqOWtUbDh3L0pCWHZNeVVsWWZmQUZlVjQzaWNhRkxuTGVQRTM5M0pVYlptR3J1NStPQU9TT0k2OXpmVEtUTEVoa0N4T0dGQ3VWM0hnQllEcmhpQnRPdGF6WXZGTzVYSER3SDRhTkk5NzQyNkRqcUhHelAxWW8zbklGNFhhczljSlpWZ2Vmbll0RkhGQmxTRmtZeHYrUjJCeW5jN2FmUXptT2E4WHB0Vm81b20rQTVSRi92ZjVwTmRYcUpTbmM4Ylh0SldPOUtjSFMrTng2YUdxajZMQnJ3dGtPOEl0bmVwbEJvemI0elEvS3RPTjVMaUZkVUQra2hwQVJsREh3QlgwRXlBUmhuUkJGS1NvOFZrRXh0VFlDdEhkTkk5Qjk1OGNEbzVkNnRvNjl0VkJidFo3NmJQTHlMOEdnejdYcHR0R0VwVm9wVXRCY0FsVWhCWGQrNTlzTm1QdlliZ2ZkNFBUeHlqOTFvcE9sWDJKaloxU3IwZjNlK3lPSmFZdTNUQ2d6SmtOcm95U3ZHSnJqdHMvd204MjNqcXE1bURmWC9qWTQ4OEUrY2JjYXFlbmtTNGRCQkdYTXh1WTFzU25HUk1TU2ZBWHliRnFyb2J2N21ycHFKR0w2VWY1dk1vZ3NicDhJMU53K0dYNUhhK3VIcFhuazEwQmU5TmZOSnMrT2FOTjJxN0JWN1NkTU1lYjEwL0tXM016M2xZRGg0U1JGcmRyelVrc0o0OXJnQUhYbWZQSlloUDZ2THZhOWdLNHJtU0JxK1gwd3NKRE1UTFoyaDYvNkN2M2xNK3JaVkx5QWZqbVFZSWtQS2srYUJ5UENBQUdLaC92amJMUU9kVy8zY2NoU2ppdDg4ZC9ZRTUzQysrN2ZGbjRlYUt3OElkSXdJZWRIZUJBUDhvZmNaaDFRbkZraEFzbGljUzlyd2pXRTNscXh2V1dXRTdaVlNQRUZVejlGa2FhenNBWGZvWmxkWkVZTGgxR2JSVkdhbXgwcUhXWkNiWG5VUVRuVUdZME82KzBnSzBWRTFqTndXcHhoTkhLWkp3TmR0bHZDREswRDRLdUVGMmR3L0YvVzNLbEJsRWFvbk9Hc1BYelZVd01JZDNyWTVHT2NzRW1EK3F4UUM3elpkSWM2TnF1QUZsRVRiRTJOVGpRYkFmdUdSZzZ3RXJZM09WS2EwN01jdyt2bVpRdGM3ekwzMUdWOWNsZDZtbDVjMlFPZ3kxdDBIekVGYWo4SnphOVdldUdWeWE1Zlc5aXNGWTdnSjM2eXVlb0pDQ1pjRk0rNTF5SnFyV3pQTnJFdkMzeVdzcFViVXA4MExURnNLM2hzY3BwM1NoTkVOUFVFeGhrSWxjVUR6bXdFK2sxZDF3RzJ1a05pbFZ2ZFdCMElOc2xZTDlONU5KTzlDRVVMRnNPWlNxcnJHMHQ1WWI3ckpZTWU4eVF2QzhOTmN2R3l0RWpYb2VmVXkvZGxuVHNOY0VRN0FZWWtIandCbU5nYjJDQzR2YjlwZDdTeFdIYWFGVU0xU1hFSXNBQTRDWWxmb1dTOE5la3h0TE1uQ0lRNEJoeU14dHFGV0xjVTQ5RHIvSnAyVVFGbE9kbnMvTXVFRE1vSVJVY3ZKWlhyYllGQzlYWndhRjBNVkhObksrMFI0WkJXMW5XZXpuc1VwcXRHdFRlR1RLeXpXbU1JNmJDalBUZ0lxRlpmbVp6Z3RSL2ZDM3FvZEtRSHcwc2RBN3JXVTJxckFlU2ZSS1FrQlBUMW9pRExYNHg0NFlzY0w2dUVVN0ZrZzlFOU5qaVBsVTZwNTRldEJ2V1RkbFZnQ1BNa2s4TGFPcmNrUHJzbDdlZ1Z1ZFlzeFBGd01kbk9vM0VRUWdFa3pqYWlBT0ZGSXE4NEVlUEZ5TFVTTElUWlVNNjVBZnZnR09KWkRaY0N5RkVBZVBaUkRqNUxFc0ZMNGZ5OEV6WkJxdlJ4NGpRYVBvOERnRUVKUFNZd2xFWkhTSXA4OFFUNHMrVlNpY3ZsQjQyK2UrUm9JZlhxcU1VUVVkRGExS0FjQWdlcFVMQUUvUlZEbW1zaVJLSU1jbEIyR0lPWmFLV1ZHb0s0VldEcThxQ2EybUt0UVNTVWFpS0N0eXlZamFQQTBkZ3RpR0NrUkNFV1d4bENSUkdvYjBWTlNaS0xFSWcyNlhkbWtiNXJzTGRVSmttQ2JyS2NVZ0V0R0xlQXJJbUlLY21YZytUMGRBcmVGd2xjZ0pNQUNsY3lVVVFQMTIwdkdCMGpscEtFVTRWZGxBVkNTVjBDY0lqTkMweTVsSWFISXhHWEtSaTBxWktRWXFWMHcrSWJJVktESG1GVGpCZ201N2JSVnZMaytCRzZCbm5XcjhSbUYxSWhOVjc0L0t0MEYrWGxDUnVWR2VDVG4zajlLVFVMSWtLRjZPZm10RytqWUtaNExPTmRCNkE0MVhRTzFFcU9MZ0tHUFdwd2dtQ29iZGtBOUhadWhJYmNZWVlMNThpN2ZkT1NKdEdYbnFFNm9HQWtGZnJneElsdExoTjJmdzJPR3kzZEJ4QXB1YWFVa3drOUc5T3ZUQ0JzMTJDS2NMb2t5Z0lIRFFiTGloQ1hJNnd0QWd3WnovWUxNSmhNQUJhR1pnZ2hwNkFZcUhZaE51R2RnQVg1c0FEVFROM3ptdC9DQ2hKYVFDbWd4cDJCekNoQ2JnanNWTG9MRXhtUThkallLR0l0TlhBUklBQm9wRHdCSFFZQVFPaW5BRkFjVndFQm9hQklSQ1ljQS8vS0FhYUFBVUI0VkNmTDNGL3I0UXFKL1BId3J2UDd3d1FLaklOOUU3UVFTQ2lFOFdBRXh2ZlBlT0o5cUQ3NDUyNDNzSTNZVHpNQzU4RG1QSEZ3dFpvYk5kRS91R3RaMy9SNGtqeHBrdndEandpUlM5SkVLUmtCZGVkSGpEazUvUTk0T2tNdG1NRTRnUzR0MC9tdTdlMzVrZTllejBYTkxSemttMktHSDA0MzA4eGo5WjBmVUxKOWYxNFhWY0E3OW1zckFaMU1NTU5zMGF1ck5yaVlpL2VyNy8rUk1xYW4zOEtjaXZETjU5UGhJbHc2ckJtYS8yU1JLUlJLemlrMFFRTXVDbWxHMUM2UUtZVE4rNEt1UnlsTEFDYW14Vys1M1BnN241SWNzQUFBPT1cIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8wX19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMF9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMV9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzFfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzJfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8zX19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfM19fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfNF9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzRfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzVfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF81X19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF82X19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfNl9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfN19fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzdfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzhfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF84X19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF85X19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfOV9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMTBfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xMF9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMTFfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xMV9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMTJfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xMl9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMTNfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xM19fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMTRfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xNF9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMTVfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xNV9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMTZfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xNl9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMTdfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xN19fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMThfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xOF9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMTlfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xOV9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMjBfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yMF9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMjFfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yMV9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMjJfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yMl9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMjNfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yM19fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMjRfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yNF9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMjVfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yNV9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMjZfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yNl9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMjdfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yN19fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMjhfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yOF9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMjlfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yOV9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMzBfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8zMF9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMzFfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8zMV9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCIvKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxcXFxuICAhKioqIGNzcyAuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi9ub2RlX21vZHVsZXMvQGZvbnRzb3VyY2Uvb3Blbi1zYW5zLzQwMC1pdGFsaWMuY3NzICoqKiFcXG4gIFxcXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xcbi8qIG9wZW4tc2Fucy1jeXJpbGxpYy1leHQtNDAwLWl0YWxpYyovXFxuQGZvbnQtZmFjZSB7XFxuICBmb250LWZhbWlseTogJ09wZW4gU2Fucyc7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBmb250LWRpc3BsYXk6IHN3YXA7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgc3JjOiB1cmwoXCIgKyBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8wX19fICsgXCIpIGZvcm1hdCgnd29mZjInKTtcXG4gIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzFDODAtMUM4OCwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUYsIFUrRkUyRS1GRTJGO1xcbn1cXG4vKiBvcGVuLXNhbnMtY3lyaWxsaWMtNDAwLWl0YWxpYyovXFxuQGZvbnQtZmFjZSB7XFxuICBmb250LWZhbWlseTogJ09wZW4gU2Fucyc7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBmb250LWRpc3BsYXk6IHN3YXA7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgc3JjOiB1cmwoXCIgKyBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xX19fICsgXCIpIGZvcm1hdCgnd29mZjInKTtcXG4gIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjtcXG59XFxuLyogb3Blbi1zYW5zLWdyZWVrLWV4dC00MDAtaXRhbGljKi9cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGZvbnQtZGlzcGxheTogc3dhcDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBzcmM6IHVybChcIiArIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzJfX18gKyBcIikgZm9ybWF0KCd3b2ZmMicpO1xcbiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7XFxufVxcbi8qIG9wZW4tc2Fucy1ncmVlay00MDAtaXRhbGljKi9cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGZvbnQtZGlzcGxheTogc3dhcDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBzcmM6IHVybChcIiArIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzNfX18gKyBcIikgZm9ybWF0KCd3b2ZmMicpO1xcbiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7XFxufVxcbi8qIG9wZW4tc2Fucy1oZWJyZXctNDAwLWl0YWxpYyovXFxuQGZvbnQtZmFjZSB7XFxuICBmb250LWZhbWlseTogJ09wZW4gU2Fucyc7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBmb250LWRpc3BsYXk6IHN3YXA7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgc3JjOiB1cmwoXCIgKyBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF80X19fICsgXCIpIGZvcm1hdCgnd29mZjInKTtcXG4gIHVuaWNvZGUtcmFuZ2U6IFUrMDU5MC0wNUZGLCBVKzIwQUEsIFUrMjVDQywgVStGQjFELUZCNEY7XFxufVxcbi8qIG9wZW4tc2Fucy12aWV0bmFtZXNlLTQwMC1pdGFsaWMqL1xcbkBmb250LWZhY2Uge1xcbiAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgZm9udC1kaXNwbGF5OiBzd2FwO1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIHNyYzogdXJsKFwiICsgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfNV9fXyArIFwiKSBmb3JtYXQoJ3dvZmYyJyk7XFxuICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSswMTEwLTAxMTEsIFUrMDEyOC0wMTI5LCBVKzAxNjgtMDE2OSwgVSswMUEwLTAxQTEsIFUrMDFBRi0wMUIwLCBVKzFFQTAtMUVGOSwgVSsyMEFCO1xcbn1cXG4vKiBvcGVuLXNhbnMtbGF0aW4tZXh0LTQwMC1pdGFsaWMqL1xcbkBmb250LWZhY2Uge1xcbiAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgZm9udC1kaXNwbGF5OiBzd2FwO1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIHNyYzogdXJsKFwiICsgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfNl9fXyArIFwiKSBmb3JtYXQoJ3dvZmYyJyk7XFxuICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSswMjU5LCBVKzFFMDAtMUVGRiwgVSsyMDIwLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMjExMywgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGO1xcbn1cXG4vKiBvcGVuLXNhbnMtbGF0aW4tNDAwLWl0YWxpYyovXFxuQGZvbnQtZmFjZSB7XFxuICBmb250LWZhbWlseTogJ09wZW4gU2Fucyc7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBmb250LWRpc3BsYXk6IHN3YXA7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgc3JjOiB1cmwoXCIgKyBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF83X19fICsgXCIpIGZvcm1hdCgnd29mZjInKTtcXG4gIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQkItMDJCQywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIxMjIsIFUrMjE5MSwgVSsyMTkzLCBVKzIyMTIsIFUrMjIxNSwgVStGRUZGLCBVK0ZGRkQ7XFxufVxcblxcbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXFxcXG4gICEqKiogY3NzIC4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uLy4uL25vZGVfbW9kdWxlcy9AZm9udHNvdXJjZS9vcGVuLXNhbnMvNzAwLWl0YWxpYy5jc3MgKioqIVxcbiAgXFxcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXFxuLyogb3Blbi1zYW5zLWN5cmlsbGljLWV4dC03MDAtaXRhbGljKi9cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGZvbnQtZGlzcGxheTogc3dhcDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBzcmM6IHVybChcIiArIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzhfX18gKyBcIikgZm9ybWF0KCd3b2ZmMicpO1xcbiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMUM4MC0xQzg4LCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RiwgVStGRTJFLUZFMkY7XFxufVxcbi8qIG9wZW4tc2Fucy1jeXJpbGxpYy03MDAtaXRhbGljKi9cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGZvbnQtZGlzcGxheTogc3dhcDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBzcmM6IHVybChcIiArIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzlfX18gKyBcIikgZm9ybWF0KCd3b2ZmMicpO1xcbiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2O1xcbn1cXG4vKiBvcGVuLXNhbnMtZ3JlZWstZXh0LTcwMC1pdGFsaWMqL1xcbkBmb250LWZhY2Uge1xcbiAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgZm9udC1kaXNwbGF5OiBzd2FwO1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIHNyYzogdXJsKFwiICsgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMTBfX18gKyBcIikgZm9ybWF0KCd3b2ZmMicpO1xcbiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7XFxufVxcbi8qIG9wZW4tc2Fucy1ncmVlay03MDAtaXRhbGljKi9cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGZvbnQtZGlzcGxheTogc3dhcDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBzcmM6IHVybChcIiArIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzExX19fICsgXCIpIGZvcm1hdCgnd29mZjInKTtcXG4gIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGO1xcbn1cXG4vKiBvcGVuLXNhbnMtaGVicmV3LTcwMC1pdGFsaWMqL1xcbkBmb250LWZhY2Uge1xcbiAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgZm9udC1kaXNwbGF5OiBzd2FwO1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIHNyYzogdXJsKFwiICsgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMTJfX18gKyBcIikgZm9ybWF0KCd3b2ZmMicpO1xcbiAgdW5pY29kZS1yYW5nZTogVSswNTkwLTA1RkYsIFUrMjBBQSwgVSsyNUNDLCBVK0ZCMUQtRkI0RjtcXG59XFxuLyogb3Blbi1zYW5zLXZpZXRuYW1lc2UtNzAwLWl0YWxpYyovXFxuQGZvbnQtZmFjZSB7XFxuICBmb250LWZhbWlseTogJ09wZW4gU2Fucyc7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBmb250LWRpc3BsYXk6IHN3YXA7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgc3JjOiB1cmwoXCIgKyBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xM19fXyArIFwiKSBmb3JtYXQoJ3dvZmYyJyk7XFxuICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSswMTEwLTAxMTEsIFUrMDEyOC0wMTI5LCBVKzAxNjgtMDE2OSwgVSswMUEwLTAxQTEsIFUrMDFBRi0wMUIwLCBVKzFFQTAtMUVGOSwgVSsyMEFCO1xcbn1cXG4vKiBvcGVuLXNhbnMtbGF0aW4tZXh0LTcwMC1pdGFsaWMqL1xcbkBmb250LWZhY2Uge1xcbiAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgZm9udC1kaXNwbGF5OiBzd2FwO1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIHNyYzogdXJsKFwiICsgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMTRfX18gKyBcIikgZm9ybWF0KCd3b2ZmMicpO1xcbiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMDI1OSwgVSsxRTAwLTFFRkYsIFUrMjAyMCwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzIxMTMsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjtcXG59XFxuLyogb3Blbi1zYW5zLWxhdGluLTcwMC1pdGFsaWMqL1xcbkBmb250LWZhY2Uge1xcbiAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgZm9udC1kaXNwbGF5OiBzd2FwO1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIHNyYzogdXJsKFwiICsgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMTVfX18gKyBcIikgZm9ybWF0KCd3b2ZmMicpO1xcbiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJCQi0wMkJDLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjEyMiwgVSsyMTkxLCBVKzIxOTMsIFUrMjIxMiwgVSsyMjE1LCBVK0ZFRkYsIFUrRkZGRDtcXG59XFxuXFxuLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxcXFxuICAhKioqIGNzcyAuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi9ub2RlX21vZHVsZXMvQGZvbnRzb3VyY2Uvb3Blbi1zYW5zLzQwMC5jc3MgKioqIVxcbiAgXFxcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cXG4vKiBvcGVuLXNhbnMtY3lyaWxsaWMtZXh0LTQwMC1ub3JtYWwqL1xcbkBmb250LWZhY2Uge1xcbiAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgZm9udC1kaXNwbGF5OiBzd2FwO1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIHNyYzogdXJsKFwiICsgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMTZfX18gKyBcIikgZm9ybWF0KCd3b2ZmMicpO1xcbiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMUM4MC0xQzg4LCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RiwgVStGRTJFLUZFMkY7XFxufVxcbi8qIG9wZW4tc2Fucy1jeXJpbGxpYy00MDAtbm9ybWFsKi9cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGZvbnQtZGlzcGxheTogc3dhcDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBzcmM6IHVybChcIiArIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzE3X19fICsgXCIpIGZvcm1hdCgnd29mZjInKTtcXG4gIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjtcXG59XFxuLyogb3Blbi1zYW5zLWdyZWVrLWV4dC00MDAtbm9ybWFsKi9cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGZvbnQtZGlzcGxheTogc3dhcDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBzcmM6IHVybChcIiArIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzE4X19fICsgXCIpIGZvcm1hdCgnd29mZjInKTtcXG4gIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGO1xcbn1cXG4vKiBvcGVuLXNhbnMtZ3JlZWstNDAwLW5vcm1hbCovXFxuQGZvbnQtZmFjZSB7XFxuICBmb250LWZhbWlseTogJ09wZW4gU2Fucyc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBmb250LWRpc3BsYXk6IHN3YXA7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgc3JjOiB1cmwoXCIgKyBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xOV9fXyArIFwiKSBmb3JtYXQoJ3dvZmYyJyk7XFxuICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjtcXG59XFxuLyogb3Blbi1zYW5zLWhlYnJldy00MDAtbm9ybWFsKi9cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGZvbnQtZGlzcGxheTogc3dhcDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBzcmM6IHVybChcIiArIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzIwX19fICsgXCIpIGZvcm1hdCgnd29mZjInKTtcXG4gIHVuaWNvZGUtcmFuZ2U6IFUrMDU5MC0wNUZGLCBVKzIwQUEsIFUrMjVDQywgVStGQjFELUZCNEY7XFxufVxcbi8qIG9wZW4tc2Fucy12aWV0bmFtZXNlLTQwMC1ub3JtYWwqL1xcbkBmb250LWZhY2Uge1xcbiAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgZm9udC1kaXNwbGF5OiBzd2FwO1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIHNyYzogdXJsKFwiICsgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMjFfX18gKyBcIikgZm9ybWF0KCd3b2ZmMicpO1xcbiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMDExMC0wMTExLCBVKzAxMjgtMDEyOSwgVSswMTY4LTAxNjksIFUrMDFBMC0wMUExLCBVKzAxQUYtMDFCMCwgVSsxRUEwLTFFRjksIFUrMjBBQjtcXG59XFxuLyogb3Blbi1zYW5zLWxhdGluLWV4dC00MDAtbm9ybWFsKi9cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGZvbnQtZGlzcGxheTogc3dhcDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBzcmM6IHVybChcIiArIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzIyX19fICsgXCIpIGZvcm1hdCgnd29mZjInKTtcXG4gIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzAyNTksIFUrMUUwMC0xRUZGLCBVKzIwMjAsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyMTEzLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7XFxufVxcbi8qIG9wZW4tc2Fucy1sYXRpbi00MDAtbm9ybWFsKi9cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGZvbnQtZGlzcGxheTogc3dhcDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBzcmM6IHVybChcIiArIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzIzX19fICsgXCIpIGZvcm1hdCgnd29mZjInKTtcXG4gIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQkItMDJCQywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIxMjIsIFUrMjE5MSwgVSsyMTkzLCBVKzIyMTIsIFUrMjIxNSwgVStGRUZGLCBVK0ZGRkQ7XFxufVxcblxcbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcXFxcbiAgISoqKiBjc3MgLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vbm9kZV9tb2R1bGVzL0Bmb250c291cmNlL29wZW4tc2Fucy83MDAuY3NzICoqKiFcXG4gIFxcXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXFxuLyogb3Blbi1zYW5zLWN5cmlsbGljLWV4dC03MDAtbm9ybWFsKi9cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGZvbnQtZGlzcGxheTogc3dhcDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBzcmM6IHVybChcIiArIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzI0X19fICsgXCIpIGZvcm1hdCgnd29mZjInKTtcXG4gIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzFDODAtMUM4OCwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUYsIFUrRkUyRS1GRTJGO1xcbn1cXG4vKiBvcGVuLXNhbnMtY3lyaWxsaWMtNzAwLW5vcm1hbCovXFxuQGZvbnQtZmFjZSB7XFxuICBmb250LWZhbWlseTogJ09wZW4gU2Fucyc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBmb250LWRpc3BsYXk6IHN3YXA7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgc3JjOiB1cmwoXCIgKyBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8yNV9fXyArIFwiKSBmb3JtYXQoJ3dvZmYyJyk7XFxuICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7XFxufVxcbi8qIG9wZW4tc2Fucy1ncmVlay1leHQtNzAwLW5vcm1hbCovXFxuQGZvbnQtZmFjZSB7XFxuICBmb250LWZhbWlseTogJ09wZW4gU2Fucyc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBmb250LWRpc3BsYXk6IHN3YXA7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgc3JjOiB1cmwoXCIgKyBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8yNl9fXyArIFwiKSBmb3JtYXQoJ3dvZmYyJyk7XFxuICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjtcXG59XFxuLyogb3Blbi1zYW5zLWdyZWVrLTcwMC1ub3JtYWwqL1xcbkBmb250LWZhY2Uge1xcbiAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgZm9udC1kaXNwbGF5OiBzd2FwO1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIHNyYzogdXJsKFwiICsgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMjdfX18gKyBcIikgZm9ybWF0KCd3b2ZmMicpO1xcbiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7XFxufVxcbi8qIG9wZW4tc2Fucy1oZWJyZXctNzAwLW5vcm1hbCovXFxuQGZvbnQtZmFjZSB7XFxuICBmb250LWZhbWlseTogJ09wZW4gU2Fucyc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBmb250LWRpc3BsYXk6IHN3YXA7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgc3JjOiB1cmwoXCIgKyBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8yOF9fXyArIFwiKSBmb3JtYXQoJ3dvZmYyJyk7XFxuICB1bmljb2RlLXJhbmdlOiBVKzA1OTAtMDVGRiwgVSsyMEFBLCBVKzI1Q0MsIFUrRkIxRC1GQjRGO1xcbn1cXG4vKiBvcGVuLXNhbnMtdmlldG5hbWVzZS03MDAtbm9ybWFsKi9cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGZvbnQtZGlzcGxheTogc3dhcDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBzcmM6IHVybChcIiArIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzI5X19fICsgXCIpIGZvcm1hdCgnd29mZjInKTtcXG4gIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzAxMTAtMDExMSwgVSswMTI4LTAxMjksIFUrMDE2OC0wMTY5LCBVKzAxQTAtMDFBMSwgVSswMUFGLTAxQjAsIFUrMUVBMC0xRUY5LCBVKzIwQUI7XFxufVxcbi8qIG9wZW4tc2Fucy1sYXRpbi1leHQtNzAwLW5vcm1hbCovXFxuQGZvbnQtZmFjZSB7XFxuICBmb250LWZhbWlseTogJ09wZW4gU2Fucyc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBmb250LWRpc3BsYXk6IHN3YXA7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgc3JjOiB1cmwoXCIgKyBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8zMF9fXyArIFwiKSBmb3JtYXQoJ3dvZmYyJyk7XFxuICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSswMjU5LCBVKzFFMDAtMUVGRiwgVSsyMDIwLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMjExMywgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGO1xcbn1cXG4vKiBvcGVuLXNhbnMtbGF0aW4tNzAwLW5vcm1hbCovXFxuQGZvbnQtZmFjZSB7XFxuICBmb250LWZhbWlseTogJ09wZW4gU2Fucyc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBmb250LWRpc3BsYXk6IHN3YXA7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgc3JjOiB1cmwoXCIgKyBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8zMV9fXyArIFwiKSBmb3JtYXQoJ3dvZmYyJyk7XFxuICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkJCLTAyQkMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMTIyLCBVKzIxOTEsIFUrMjE5MywgVSsyMjEyLCBVKzIyMTUsIFUrRkVGRiwgVStGRkZEO1xcbn1cXG5cXG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcXFxcbiAgISoqKiBjc3MgLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vbm9kZV9tb2R1bGVzL3Nhc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc3JjL2luZGV4LnNjc3MgKioqIVxcbiAgXFxcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xcbi8qXFxuICogQ1NTIGZvciBqc1BzeWNoIGV4cGVyaW1lbnRzLlxcbiAqXFxuICogVGhpcyBzdHlsZXNoZWV0IHByb3ZpZGVzIG1pbmltYWwgc3R5bGluZyB0byBtYWtlIGpzUHN5Y2hcXG4gKiBleHBlcmltZW50cyBsb29rIHBvbGlzaGVkIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgc3R5bGVzLlxcbiAqL1xcbi8qIENvbnRhaW5lciBob2xkaW5nIGpzUHN5Y2ggY29udGVudCAqL1xcbi5qc3BzeWNoLWRpc3BsYXktZWxlbWVudCB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gIG92ZXJmbG93LXk6IGF1dG87XFxufVxcblxcbi5qc3BzeWNoLWRpc3BsYXktZWxlbWVudDpmb2N1cyB7XFxuICBvdXRsaW5lOiBub25lO1xcbn1cXG5cXG4uanNwc3ljaC1jb250ZW50LXdyYXBwZXIge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIG1hcmdpbjogYXV0bztcXG4gIGZsZXg6IDEgMSAxMDAlO1xcbiAgd2lkdGg6IDEwMCU7XFxufVxcblxcbi5qc3BzeWNoLWNvbnRlbnQge1xcbiAgbWF4LXdpZHRoOiA5NSU7XFxuICAvKiB0aGlzIGlzIG1haW5seSBhbiBJRSAxMC0xMSBmaXggKi9cXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIG1hcmdpbjogYXV0bztcXG4gIC8qIHRoaXMgaXMgZm9yIG92ZXJmbG93aW5nIGNvbnRlbnQgKi9cXG59XFxuXFxuLmpzcHN5Y2gtdG9wIHtcXG4gIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xcbn1cXG5cXG4uanNwc3ljaC1taWRkbGUge1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuXFxuLyogZm9udHMgYW5kIHR5cGUgKi9cXG4uanNwc3ljaC1kaXNwbGF5LWVsZW1lbnQge1xcbiAgZm9udC1mYW1pbHk6IFxcXCJPcGVuIFNhbnNcXFwiLCBcXFwiQXJpYWxcXFwiLCBzYW5zLXNlcmlmO1xcbiAgZm9udC1zaXplOiAxOHB4O1xcbiAgbGluZS1oZWlnaHQ6IDEuNmVtO1xcbn1cXG5cXG4vKiBGb3JtIGVsZW1lbnRzIGxpa2UgaW5wdXQgZmllbGRzIGFuZCBidXR0b25zICovXFxuLmpzcHN5Y2gtZGlzcGxheS1lbGVtZW50IGlucHV0W3R5cGU9dGV4dF0ge1xcbiAgZm9udC1mYW1pbHk6IFxcXCJPcGVuIFNhbnNcXFwiLCBcXFwiQXJpYWxcXFwiLCBzYW5zLXNlcmlmO1xcbiAgZm9udC1zaXplOiAxNHB4O1xcbn1cXG5cXG4vKiBib3Jyb3dpbmcgQm9vdHN0cmFwIHN0eWxlIGZvciBidG4gZWxlbWVudHMsIGJ1dCBjb21iaW5pbmcgc3R5bGVzIGEgYml0ICovXFxuLmpzcHN5Y2gtYnRuIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIHBhZGRpbmc6IDZweCAxMnB4O1xcbiAgbWFyZ2luOiAwcHg7XFxuICBmb250LXNpemU6IDE0cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgZm9udC1mYW1pbHk6IFxcXCJPcGVuIFNhbnNcXFwiLCBcXFwiQXJpYWxcXFwiLCBzYW5zLXNlcmlmO1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgbGluZS1oZWlnaHQ6IDEuNDtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcXG4gIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgY29sb3I6ICMzMzM7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xcbiAgYm9yZGVyLWNvbG9yOiAjY2NjO1xcbn1cXG5cXG4vKiBvbmx5IGFwcGx5IHRoZSBob3ZlciBzdHlsZSBvbiBkZXZpY2VzIHdpdGggYSBtb3VzZS9wb2ludGVyIHRoYXQgY2FuIGhvdmVyIC0gaXNzdWUgIzk3NyAqL1xcbkBtZWRpYSAoaG92ZXI6IGhvdmVyKSB7XFxuICAuanNwc3ljaC1idG46aG92ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkO1xcbiAgICBib3JkZXItY29sb3I6ICNhYWE7XFxuICB9XFxufVxcbi5qc3BzeWNoLWJ0bjphY3RpdmUge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDtcXG4gIGJvcmRlci1jb2xvcjogIzAwMDAwMDtcXG59XFxuXFxuLmpzcHN5Y2gtYnRuOmRpc2FibGVkIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNlZWU7XFxuICBjb2xvcjogI2FhYTtcXG4gIGJvcmRlci1jb2xvcjogI2NjYztcXG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XFxufVxcblxcbi8qIGN1c3RvbSBzdHlsZSBmb3IgaW5wdXRbdHlwZT1cXFwicmFuZ2VdIChzbGlkZXIpIHRvIGltcHJvdmUgYWxpZ25tZW50IGJldHdlZW4gcG9zaXRpb25zIGFuZCBsYWJlbHMgKi9cXG4uanNwc3ljaC1zbGlkZXIge1xcbiAgYXBwZWFyYW5jZTogbm9uZTtcXG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcXG4gIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XFxufVxcblxcbi5qc3BzeWNoLXNsaWRlcjpmb2N1cyB7XFxuICBvdXRsaW5lOiBub25lO1xcbn1cXG5cXG4vKiB0cmFjayAqL1xcbi5qc3BzeWNoLXNsaWRlcjo6LXdlYmtpdC1zbGlkZXItcnVubmFibGUtdHJhY2sge1xcbiAgYXBwZWFyYW5jZTogbm9uZTtcXG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiA4cHg7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBiYWNrZ3JvdW5kOiAjZWVlO1xcbiAgYm94LXNoYWRvdzogMHB4IDBweCAwcHggIzAwMDAwMCwgMHB4IDBweCAwcHggIzBkMGQwZDtcXG4gIGJvcmRlci1yYWRpdXM6IDJweDtcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNhYWE7XFxufVxcblxcbi5qc3BzeWNoLXNsaWRlcjo6LW1vei1yYW5nZS10cmFjayB7XFxuICBhcHBlYXJhbmNlOiBub25lO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBoZWlnaHQ6IDhweDtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG4gIGJhY2tncm91bmQ6ICNlZWU7XFxuICBib3gtc2hhZG93OiAwcHggMHB4IDBweCAjMDAwMDAwLCAwcHggMHB4IDBweCAjMGQwZDBkO1xcbiAgYm9yZGVyLXJhZGl1czogMnB4O1xcbiAgYm9yZGVyOiAxcHggc29saWQgI2FhYTtcXG59XFxuXFxuLmpzcHN5Y2gtc2xpZGVyOjotbXMtdHJhY2sge1xcbiAgYXBwZWFyYW5jZTogbm9uZTtcXG4gIHdpZHRoOiA5OSU7XFxuICBoZWlnaHQ6IDE0cHg7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBiYWNrZ3JvdW5kOiAjZWVlO1xcbiAgYm94LXNoYWRvdzogMHB4IDBweCAwcHggIzAwMDAwMCwgMHB4IDBweCAwcHggIzBkMGQwZDtcXG4gIGJvcmRlci1yYWRpdXM6IDJweDtcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNhYWE7XFxufVxcblxcbi8qIHRodW1iICovXFxuLmpzcHN5Y2gtc2xpZGVyOjotd2Via2l0LXNsaWRlci10aHVtYiB7XFxuICBib3JkZXI6IDFweCBzb2xpZCAjNjY2O1xcbiAgaGVpZ2h0OiAyNHB4O1xcbiAgd2lkdGg6IDE1cHg7XFxuICBib3JkZXItcmFkaXVzOiA1cHg7XFxuICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xcbiAgbWFyZ2luLXRvcDogLTlweDtcXG59XFxuXFxuLmpzcHN5Y2gtc2xpZGVyOjotbW96LXJhbmdlLXRodW1iIHtcXG4gIGJvcmRlcjogMXB4IHNvbGlkICM2NjY7XFxuICBoZWlnaHQ6IDI0cHg7XFxuICB3aWR0aDogMTVweDtcXG4gIGJvcmRlci1yYWRpdXM6IDVweDtcXG4gIGJhY2tncm91bmQ6ICNmZmZmZmY7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcblxcbi5qc3BzeWNoLXNsaWRlcjo6LW1zLXRodW1iIHtcXG4gIGJvcmRlcjogMXB4IHNvbGlkICM2NjY7XFxuICBoZWlnaHQ6IDIwcHg7XFxuICB3aWR0aDogMTVweDtcXG4gIGJvcmRlci1yYWRpdXM6IDVweDtcXG4gIGJhY2tncm91bmQ6ICNmZmZmZmY7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBtYXJnaW4tdG9wOiAtMnB4O1xcbn1cXG5cXG4vKiBqc1BzeWNoIHByb2dyZXNzIGJhciAqL1xcbiNqc3BzeWNoLXByb2dyZXNzYmFyLWNvbnRhaW5lciB7XFxuICBjb2xvcjogIzU1NTtcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGVkZWRlO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjlmOTtcXG4gIG1hcmdpbi1ib3R0b206IDFlbTtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIHBhZGRpbmc6IDhweCAwcHg7XFxuICB3aWR0aDogMTAwJTtcXG4gIGxpbmUtaGVpZ2h0OiAxZW07XFxufVxcblxcbiNqc3BzeWNoLXByb2dyZXNzYmFyLWNvbnRhaW5lciBzcGFuIHtcXG4gIGZvbnQtc2l6ZTogMTRweDtcXG4gIHBhZGRpbmctcmlnaHQ6IDE0cHg7XFxufVxcblxcbiNqc3BzeWNoLXByb2dyZXNzYmFyLW91dGVyIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNlZWU7XFxuICB3aWR0aDogNTAlO1xcbiAgbWFyZ2luOiBhdXRvO1xcbiAgaGVpZ2h0OiAxNHB4O1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMSk7XFxufVxcblxcbiNqc3BzeWNoLXByb2dyZXNzYmFyLWlubmVyIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNhYWE7XFxuICB3aWR0aDogMCU7XFxuICBoZWlnaHQ6IDEwMCU7XFxufVxcblxcbi8qIENvbnRyb2wgYXBwZWFyYW5jZSBvZiBqc1BzeWNoLmRhdGEuZGlzcGxheURhdGEoKSAqL1xcbiNqc3BzeWNoLWRhdGEtZGlzcGxheSB7XFxuICB0ZXh0LWFsaWduOiBsZWZ0O1xcbn1cXG5cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvanNwc3ljaC9jc3MvanNwc3ljaC5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7O2dIQUVnSDtBQUNoSCxxQ0FBcUM7QUFDckM7RUFDRSx3QkFBd0I7RUFDeEIsa0JBQWtCO0VBQ2xCLGtCQUFrQjtFQUNsQixnQkFBZ0I7RUFDaEIsNERBQStreEI7RUFDL2t4QixzRkFBc0Y7QUFDeEY7QUFDQSxpQ0FBaUM7QUFDakM7RUFDRSx3QkFBd0I7RUFDeEIsa0JBQWtCO0VBQ2xCLGtCQUFrQjtFQUNsQixnQkFBZ0I7RUFDaEIsNERBQXVtZTtFQUN2bWUsNERBQTREO0FBQzlEO0FBQ0Esa0NBQWtDO0FBQ2xDO0VBQ0Usd0JBQXdCO0VBQ3hCLGtCQUFrQjtFQUNsQixrQkFBa0I7RUFDbEIsZ0JBQWdCO0VBQ2hCLDREQUF1bUs7RUFDdm1LLDBCQUEwQjtBQUM1QjtBQUNBLDhCQUE4QjtBQUM5QjtFQUNFLHdCQUF3QjtFQUN4QixrQkFBa0I7RUFDbEIsa0JBQWtCO0VBQ2xCLGdCQUFnQjtFQUNoQiw0REFBdXhZO0VBQ3Z4WSwwQkFBMEI7QUFDNUI7QUFDQSwrQkFBK0I7QUFDL0I7RUFDRSx3QkFBd0I7RUFDeEIsa0JBQWtCO0VBQ2xCLGtCQUFrQjtFQUNsQixnQkFBZ0I7RUFDaEIsNERBQSttVTtFQUMvbVUsdURBQXVEO0FBQ3pEO0FBQ0EsbUNBQW1DO0FBQ25DO0VBQ0Usd0JBQXdCO0VBQ3hCLGtCQUFrQjtFQUNsQixrQkFBa0I7RUFDbEIsZ0JBQWdCO0VBQ2hCLDREQUErNlM7RUFDLzZTLGdIQUFnSDtBQUNsSDtBQUNBLGtDQUFrQztBQUNsQztFQUNFLHdCQUF3QjtFQUN4QixrQkFBa0I7RUFDbEIsa0JBQWtCO0VBQ2xCLGdCQUFnQjtFQUNoQiw0REFBdS9pQjtFQUN2L2lCLG1IQUFtSDtBQUNySDtBQUNBLDhCQUE4QjtBQUM5QjtFQUNFLHdCQUF3QjtFQUN4QixrQkFBa0I7RUFDbEIsa0JBQWtCO0VBQ2xC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LGdCQUFnQjtFQUNoQixXQUFXO0VBQ1gsV0FBVztFQUNYLGVBQWU7RUFDZixnQkFBZ0I7RUFDaEIsb0RBQW9EO0VBQ3BELGtCQUFrQjtFQUNsQixzQkFBc0I7QUFDeEI7O0FBRUE7RUFDRSxnQkFBZ0I7RUFDaEIsVUFBVTtFQUNWLFlBQVk7RUFDWixlQUFlO0VBQ2YsZ0JBQWdCO0VBQ2hCLG9EQUFvRDtFQUNwRCxrQkFBa0I7RUFDbEIsc0JBQXNCO0FBQ3hCOztBQUVBLFVBQVU7QUFDVjtFQUNFLHNCQUFzQjtFQUN0QixZQUFZO0VBQ1osV0FBVztFQUNYLGtCQUFrQjtFQUNsQixtQkFBbUI7RUFDbkIsZUFBZTtFQUNmLHdCQUF3QjtFQUN4QixnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSxzQkFBc0I7RUFDdEIsWUFBWTtFQUNaLFdBQVc7RUFDWCxrQkFBa0I7RUFDbEIsbUJBQW1CO0VBQ25CLGVBQWU7QUFDakI7O0FBRUE7RUFDRSxzQkFBc0I7RUFDdEIsWUFBWTtFQUNaLFdBQVc7RUFDWCxrQkFBa0I7RUFDbEIsbUJBQW1CO0VBQ25CLGVBQWU7RUFDZixnQkFBZ0I7QUFDbEI7O0FBRUEseUJBQXlCO0FBQ3pCO0VBQ0UsV0FBVztFQUNYLGdDQUFnQztFQUNoQyx5QkFBeUI7RUFDekIsa0JBQWtCO0VBQ2xCLGtCQUFrQjtFQUNsQixnQkFBZ0I7RUFDaEIsV0FBVztFQUNYLGdCQUFnQjtBQUNsQjs7QUFFQTtFQUNFLGVBQWU7RUFDZixtQkFBbUI7QUFDckI7O0FBRUE7RUFDRSxzQkFBc0I7RUFDdEIsVUFBVTtFQUNWLFlBQVk7RUFDWixZQUFZO0VBQ1oscUJBQXFCO0VBQ3JCLHNCQUFzQjtFQUN0Qiw4Q0FBOEM7QUFDaEQ7O0FBRUE7RUFDRSxzQkFBc0I7RUFDdEIsU0FBUztFQUNULFlBQVk7QUFDZDs7QUFFQSxxREFBcUQ7QUFDckQ7RUFDRSxnQkFBZ0I7QUFDbEJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcXFxcbiAgISoqKiBjc3MgLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vbm9kZV9tb2R1bGVzL0Bmb250c291cmNlL29wZW4tc2Fucy80MDAtaXRhbGljLmNzcyAqKiohXFxuICBcXFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cXG4vKiBvcGVuLXNhbnMtY3lyaWxsaWMtZXh0LTQwMC1pdGFsaWMqL1xcbkBmb250LWZhY2Uge1xcbiAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgZm9udC1kaXNwbGF5OiBzd2FwO1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIHNyYzogdXJsKGRhdGE6Zm9udC93b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBRW1NQUJJQUFBQUFpSndBQUVrbUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR2xvYml6NGNQQVpnUDFOVVFWUmFBRndJZ2pnSm54UVJFQXFCeUJDQnJtZ0xnekFBQVRZQ0pBT0dWQVFnQllSY0J5QU1oaFliRFhrVjdOaVR3TVlCQnB1MUFTbUtZT1BBWTRLbVpQOS9PdURHMEdsZ1ZuL0lpVU5aRzk1aEd0c2o5cmxkNmlkWWFXTTdocXArV3QxVVBOMTRxVlE0RUpVcmVYRVZuVXpGMk5EOElkb1VYVHZzY0NKb1JlUGh4Unc2YjFYRkdaaDN6Vis1cVJYaWptNE9uQmhhb09RWURZMGtKbnpTMkZjdnFVcjZ6eEdnUlNLalNKNWJZWTQwTWRoVE03UDlmM1ZWLy84RXF5dEhqbjdSRVFNb0drUlZEb1FjS0VjOFV0bExIUGNFdnZ2NmNObHJEY0EyUlh0b1k0RWdZY2FzSUpSV2tFZ1RwY1VBUVJHN3BqMmQwNmtZc3hiNk9mKzU4RjgrRnYzY2UvR292VWNBckRQRmUzcDBpUE9oenJUV085bjZGSEJ1cDcxekZVdUo5SytIc0ovQXRvcXJzejRRRjVDZCtxKzJjdVlvUUhPcFRuTGdXNy8wYm1yQ1dRd3M2Zkk5SVh0UktUcXVJLzEwelhQUVY0WXMwcXRwMnRDMStQUms3K1hjNXdTWWY1M2FsK1VJdnVBRENkZ2d4M0lpUnlxcDZDc1Fid2MwVERRdW5QUTZMQjJiRE5POUdqU3VEcUVvYWc3bWcweUNTOW1VTitieHhXbVBpdXpJc3V6RXVkd1k2M2VNaGJvQkt1QVBvS093c0pqMS8welYydGtkVUZnUkRvUkYyOUJGOHU2Y1lsR0p2SlNMOW5KNzNlNmZuWjJkbVYxb3NTQXRMa0NUSUVRSFV0SjdnREpBUDRzTGl2Y0FCZWRZdWJzWVNDcllwRE1kUXlpdkM2bG9jbEdVTWJaWGxOVzE1enRmMysrUklPNWFRVnlDU1kwcVZPTWEzNlhPLy9hTngwb05DcGR3WTVsMUd3ZmFmdnZzTURhL1B4d3NYc1l0eFVSRm9sVjA3MzR1VEVEa2Njb1BXMGF6S0NBRkUwckltT09WYU9QN3FZa2ZvU3Qra1ErS2YrWUJaaURIZ1cza1J1S2FGaEdBMG1tdnd4SVlXQngzQXBVRlFGeXJWNWVreEkxcXNUSnhrMWlrVHR4V1dGbTZHK2IvZVZBcm9SZDQ5VG1BL2UyMzNyVURYR29BUTVlYVdkSlpzUTJXTmNDbmpEUFJSZEl6Qm1BSWhtSVN6bnlrQ2prZTZNQUhOUmpCaTd3b0RrV1VoeTVxWlcvU0hKM1JIeU54TkdiMXRpNkhNZGJpZEp5TEMzRVFOK0tqZUJBZng3UDRMbjZJM3h6Z3NQU0l2eE5BYldwcjZwd2U2WlUrTHMrZ2pNallUTTZTeENZeHM1S1ZnaXhJU1g1SjFWbWQ5ZG1hM1RtWVl6bWRKM0k1Ti9Kc25zK0xlU3ZmZTdoMzNjbEgrV2wrbGMvenAvd2ovNVdwbWJXWnZabUxJRUxJVHlHS1VyeFNsUzZ5Nk9Jb1J5TEpWS3BLMWFoUjdlclZrQ1kwb3dXdGFrczczVjlxWGRNSHVxY24rbHpmNktWKzBaLzYzK2JtUUhOSHV4bHExQURuMHRFdWQ2TFJ4cHRxaG5uT2M3RVY2MnRMNTFvM3U5UDlIdkZSejlyb05aLzJPVXlzcVIxTU5HRWlKb0l2UFhtLy9FczRCc2ZnNFBpZ2lSaUoyVWh1ckhBcFhtbnc2ZytucDdib2NoZlo3WGF1QjI0SjArT3lNZEJ3b3BIKytJSFN2VnFTRU1MNDRQY2hvb2FndGsvbi94Ui8zaTd5RUtudnBsUFJDd2FwTjlQNXJhTEdwUlcyNEE0WnhES0E1QmMxTUEyZmtaOFF2aWFqNnVHTGNwZndJbjRzbTZHVzF1Y1YzeVljeXhzNEU3dktBZUN2SlpneEc2OWl1dHlBWkRFbTREdnFvNFRSbzg1M3dQQXhFV1F6Y0tFOHpyZ0dQOFZ0K0ZOSmhycGZiKytZZ2tVeFlvSTBjQWFtUnpZV2Q0Q0IrSUxLaWVVektRVXVFK2V0c2J3aUlwZDZReEtLR1Q1YWRrTmpRcGdVM095UDVqakF1RVk4UTB6dTRxOGxscytsRVhoSC9GcWpYb2Q4S1NpVzA0S0lXRXJVL0ZqV3kvSUFxUU5wemRlV1p1M3hoZ3BJTzdHRWwvRUtNb0VEYWU0eUFyV3dUWmJoZ0ZqVTJ5UHRwRVgxVEV0SnFrTXM4M0crUEFrOElyOEc3cEczZ2NYeUErQVh1QWdMbEtrRkxRa3d3ZjBjREh4OE91SkkwSis0aXBWTitGWlFkaWplRFpPMVMrYkVHZStNOTFBMjZqUEhKWEJ5YUI2YzN4R0ViNHRmV21lNno2bmJuOXd0RTNFUURzSkIwYUJCdHhQYmpCakVBcWhEL2Y3OGpLUHl0Wm5JOTRuS0lWQ2IyWGsrOFV3YXdhVEpCUVZhOUswdUIxaXN6UjRBc2VZRmc1TnFoK0diUXVKblA5Y2dONXZIM1EvVEI2K3JsSm1ZQU9EQkcyV1ZKaUEvZUV5Ym1IOG5aSWVDR3NUTFFMWVl3SGZXTGltZ01RZ2duMU9DZ3kySnI0WlZsU2h4Y3lxQzliRExZK2x1ZHJzSHZGbWdZUytncjNLTE96M2swL09OMXdBc3YrZ2RlN3ZOdXAzb2N4NXdsM3Z0Z2szdDRIYTJDeE54QVRDZmk1ZVNXZXMyUDdHNDY5THhBc0FrNGpOVWZDZkFLUmJ2bExHR0JSb005SFV4eEptOE9KYzVCdWxPeGEyTWN3TUZqVjlQRTFNWTBiUEVKSDIwV1VZZXBnZGpQS1FqTEFCcU5oamN3VGpIWEdhTnVJRzI4UVk1eWd3THJGTkRPd1BxdVoxbmxSdUlLVVZQQTkxTUlFRkhvekphSHlOTU00dVJrMVBReFJIV2ZZcVIzeVErYkpLNnRzVlQxTkZLdDNHMFNZNnp4RlYram9mcm9JVk8rMmhIdzhLRUNKcHFPckpnbEduOWtiUldRTUR3dnF5YUdaOHpXanFLUFBuWStGaEhlMXRyUzNOVFkwTjlYYTJoUmw5ZHBkTldhbFRWRmVWbHBhb1NwVUl1azByRXhVV2l3b0w4dk53Y29ZRFA0M0xZTEdZMm5aYVZTYVdRU1VRQ1BnRHVXS2hPT2pQS1FjOHQ1Z2Vya3pOYnhhRHJsZGg3cDJZS2IwN01ZbGlYQnZXT29NWmloeE9wSHhwcnZXRUxCVjNVcjN2R3BZWVhiYS9rUllFUHMveWFobE1lamh1aFdnZUFjYW1hSGJHczVOVjA2N3NFVkR3VGxEazdlSVBMR1ZRcVFpQlppUnVWQ2RDZzhab0VtdkROVmliaDEvaEc4WmRPMUR2UHlEcTJMQ3RkU2JMQno1K0ZCODBVZjdTU2RVSEZsQVBJdW5uaE04NElTaG9CRzFqN25uSTJrTURMUXRNTUMvbmIvUVVLWUNFUlRNSHprV2grZ2dOc2p1TVQ0YkV6UnZPNUplOXo3bHZvNmhwaTIyNGxncUxFOFh4alV1WDU1a1p5QUFrNzN5SmZDYWs0M1BlcHdLOTdFTU5LSllCd29MTG1vcnFzbnFoMnpwdXMwbkFrOVJNQ1o0Y1o0UkhiNkVoRGlKQVROS0pLdzZ0UVJFK3Fnb29lc1NOUjNSVEZWb01Gam9BUWtwMzU1Q2RReWtSM1R4cnF1RHFoVGxPS3hpVTg1Vjl4eE04UXdFRjQzOGNVU2lqQ2s5d25HQTNxMGlZVGNTZDNTZ1RuT0NJUDlRU0RhN0U3UjdQWFZhM1VEMnh0NUpzUEtSejNia1RGL2FldjBtN1ZpZW9jNjdUdU9rQkNRSmdQM3ZBaDBqaFpQZVJQcFZoUE1OYlBubjlZQm9ZMVNSSmVHZlpwK0hEZFVhY2dlRERVNG5Galp1Ung0WlRaazhHcHZvR1dkWEIxM1paQUUvMEZkMEs0aDZHTG1mZlBIWXREUWp1ck5OWitxanBhWmhBaUpoNk1IQzZ5SmhMcW9seFZyQnBFTXYzRTVhdjc4UGo5MU1iVnhXclZSRlluY0tUQWIrR2FhenA0b3lIUGlhQkdzakZySDhGQ0tJN1ErWDJUZENpeTFoK1VNMXRVSjZoekQ5dXQ0VGlwcDI3MFhDNEltMGpqRXVyZmtYRVIxNHM4dElhdFhqNGhMM25vQzl1MTlSS2w0U0dxMVo3VXhWa1l0NVFqTGFIRzBBVUJtbm4xbTZiNFpaazFvdjRhWHZKVWtycXJHVnBFUXd0dnRITWg3TnpEZHF1Y1VWRzFHNWdvRk9UdWdWaXNud3RuQnRuQTh4Tnd6SXFQSzl3a2ZLMElKVDRQbWlLZkdQdTBpdXRsRkY3dFNQdlFpaWRpYWVuMUpRME5JV1A1Y3N5SXN3bWFxTGxMZytWSGRXaWd3VWVoeVhvWTNTQTZyODBCdXJoQ29DK3AxbVVzTmhsczhRNC9Wa1NVSldVQlgrYzNVbExwb2k0M3Zwa29qSjVKbUdabm5KVEIwaVJ6WXoxMG1abFVZOVBST0xKV2pvaHRyajdpVCtmSEZyRWcwWmRTUkEwVVBJWGdRWTJlTlIvRnlOQTZhaGI0WEdmRVNtYlVDTU5CMU9ZeUFkYlRaMkMxU0pLMzRnSmh6NlVYS1NnRm1oMXZBR2dXd0xnNDVuR0NuUmZlU1N3aEdCS203TDloVjdiRGNWeUJEYlJsTTRCcVJvcWpnZ0ZDZTV1YXJSZU5Dc1FJWE10bmd1emJ1UStWWndpOXdjRVErem8wWmt1MTR3aDZxeUpoVFl2RDROaFNSUjJTc3hmTkFUZ2crc0R6TjhETXBUbUNWQ1V2eTBoc2RhbjNtRGd6UWR0Mmw3UGVsb3NUb0VuUWdCZFdBbzlGT3gxbzFOVUE5RHlQVFkxd1hwZ0JBWEJlUDVRZzVWdFQwYWF3YkZtNWVsWFJMK2VZTTFvR0FQRzV3ajVadEdLUE5pak5GK3dqQjluZU5nZDZEc1VKcXk4V09kaERoODNpU0hOMmRoNVcwSXhMcWFvaHd3R1VFcXQwY3lpRXpvUFNNeXJ5YTRISnVXL29zdmlCZ1c2aGFXazNBb1ZKdlZMWDBGdTRYYm5OQjBobEw2b24rdDBQWDVKdUlpeXFJSjMycDhiZ09oTmNOdWUrRVJwWjB4Mms3cTZKenc1SlhRNnRSUnVjWlFWM0wzZ0hSQXZPMG1JY2FaUThGMnZaSGhzbktHVEhvdDVtcHlGYnptZUJPb1BBWUN6N29yS01peklZc0F4R1FnSzhvbnpMRlN4QjhrQTJXcGJ4VndLMCtkVXRjbktKMEpMRlNFOVVVSjN4NDVEbnRyQWNwSXRIQWxneTdxWUZUZ2huQldvVisvelNBaTJ5TzI2blUxOTZKZlk3QXlidmdHVlE3SGZIcENWRVlhY25GUkV1a3BMU0pBRHZrS3o4ZUlYRElMWWJRcmIwWG9RRFNDQTZGUEw0bmJNdEhXY2dxN2JCRmxFK2NMQURkL1kxOW11WjFIdldPUU5mN3Z1S3o4TVYxMkE1b0pDSXBmK0lBelEwSyswenN2Vm4wZ3ZYazFsS25CSjVwWk8vOWRyWUt4WXlwU2tBdTJ6TzVXZ21CVTBPUUFLUEJsT2NWUkVNRXhMdVNYUmVlUmhFQjFBbmNrODVhSzBmOEZuZHlJR1hDcGlaWEJNTThnNFRvMGRlUW50Nk05a1p0OXNKVjFJRlRWd1hwUzFyYmgwOVhSYmMwSktxZ2FoTFl5LzBBNXh6QktDS2llVlJRcWVlZkROdzFMVmJHdHVwMUJVZVQ1Rm5FRlZ3TXZWSkxsQmI2SGVMNFJYSExqQXVDVWY2aTF5QklUNzlEemNIMWdYYjVGVG5WclN1QTlnaFQ3Z0IyYXBXSjlHNjZJWktxL2hNUG9HUWd2L0lqNEtaa3ZaVkdMNUJTOFM4MjdlN1NhNzRwRmgrOHFmZ2ZlZU0za1RveFNYM0I4SStZQmxTR2t3OFhLQnhSaER4dHptSHNRL0lIMDRpNDdWTkcrR0t5aFhGaW5GekdickVLQkNDTGtRb3YrYUJBem4zSHpSVWtZRlBkRitMWnNwWXRTOFBVRFlVbU1FWjN0SmJ5ZWZ6bUdES0FzWmk5RzF4WEFRb0x6dE5jZlVVdWx5TTJTZUpueVEydXpyRTk2YmpCRlV0Qi9JTUcvaXRGVU5SaGo1K1o2VWlCbU12Sk1VRDlFVzFGN3pHYkJKOElaVStsSGVDUVlqbXdJVGtBRkcyS0pwUXl5Zklmd2FhWUNiblhobTViVE42QXUwbjMwbTkxYXUzdmg3MHpjZnVkN0pORzF0czlwSUVlQ2VNTTIyM1dIdTBpeTBIeE1SSFNnc2NvendvQ1oxUmI1SWYvY2Uwd1lVVVdMa0pnaWYvZDI3UVd3Mys4RWJlZDFwQnJVYlBOZnhURzdGc05oQ2dla29heEdBYk15VmRDdlBLSEZleEkwUUE2NThZWTVFRmlGWVdqaWk0M2tXWlZXVnUxbUFvUm16cFpLNE0yb3hhVEJvYWxXK3BuWUVZaG8yd0xkUW43V1BvMXBXN1o1YWJVMjN2K3JHdzU2eE1XZTRlT01zeXQrbkduM0xYTjgxMXQ2SWRUMk0vK2V1OXRoUjBmSkdyaFhUV1pMM3JQdkxvMllndWhyN1ROL3BGUCtuL1BCZGVIcmxwaytSRmxnbHhuZVpkS2d2dUovbHNsdkpmZ3pOWlNlbXNHVVYreGZ6MlZzdTdxUGlVL0pCNVRZZjk5bTI1SWVkUi9nWERJMm1kVDh0NTNLSDMzRS9RaCs1bE5sbkVNY2JGTkl0S3RIVjNGYlJkbGxIcTJjRi9ZNmRQdGp2SGg2cWF6N0w4Mk41eFFmMmNoNEpuVU5CYWpDQlBaZURtVStMQVg3QzZFbnBnY3Z2eThPRkRtM3JINXA4Sm1PQTJMaURxYk9xTTYveUZqV1hjazR5MHZyVmhtTnRBMk9SL3ByZXdUWFBxSjdvUHlsSlVlTi9PeE5nY3FOdDFHeUxrMTNJL0VnV0dJT0JsbVEyNUt5WU1GOHVTK09OVWdFRExTVktjajZqSlh2Z2VFSzVxZzZjaGdMeEFBYUQwQkVDWWxQckdGUitycUdFOE9mdk9RdkZOUVVDTFFEV1lCVE5yRmtzMlRBRmpHMkRsSHN5REc5U3pmTlNKZFhBQlhqTDJJMnVON3kxaWJQNDNDZ0FEV25oZzVBYUdwTTdUQS9NcWNMbTEzYWV5UDZnYmFETlMrQVk4UlF1QmEwQ29xOFI3YVFQcmVSd09BcWl0S1BKcWpRZ0tEWUp4UzE3WW5uQjB2TkNCNHVsQkoxUFE0bHh2aFhKUkxxQVZBbXMwenZKdnM0eFBhUzc1TkhWTGZReGJIM2tqRm1XOUh5Rlc5VTB6cURtN1VocnpQVFhCVzhkSGZPK0RrUnBXUTZjM2dvTlZxR2t3ZzIwSmNZaEptRlFmQUFUOUIyRDU4c215bkg5ZlJMcjE0YUx4U1lITjJTZjhUSmhOeUkvY0l3Q3lRSE85c0RzTXQwNDdHYTVSU2RaSkhaSFpDeTFxRFRnQTBLZkFHN0lCMGkzbkV5cmllb0xOcUhJRm12Z3haMzUyTXZZVGE2TUN0TlBUaHo1a3c4QkZwUUFWU2xUckNXUDQrdGdwOTVqNE82dWRtaytOUVlLU0tkaEZRQ2FmUXNNVUJVRFBRVjJGdHpaYXFvd0lrMkloR0dCTXV4OFNvam5KdTRZdW8vTTZxdDZpUkJOdVFZVjdXendpMGY5aUo0NkIyajBVam5KY0ZOamxudlQ4NU9sU2NIejhtSTBIdHVOdzBEQ3U5L0VvamN0VElmNi9mc1VDeFJ4TzZLWlVET0I4ZHhoT3BheVUrUURmL0JIbzQzeWNBbG9Ram5EeUxxZFNRVzRYVzFXcVNKZzlpMnN5L2NiVkYveTZxQWFMMm0zNHlyMVlqSHRXN2xHY2sxbDB1aGxUaVdRNGtFRkRCNXlWL0JrSnlDTzJnQVlERmV2NjA0YnhJTHNhSnlSUUU5bm1DZ0dtbzQvYTFXQm92U29vM0FNQjFRVm1oaEp5Qk9tVzc4dWhUT1VJNWtIcDl0NGxjWklYcU9BK093ZjVkSlRBMHNTcmRkcXloLyt3dk1nQUpEQXpVcWFOSGdUTGw1K0JCZHY1MHFpMlphLzlsYk5hU0o2bUE1WkVaWlpHOTNtaE96TkUxRFJzT0lUS3VjZVVTdkJaaHhGZ1V5U2NjZWNrbC9mUS94emJabkh1SWlEYXhZbWdZekY5MUt4TjBnd3lxSDVwQlFzWDJaMzVDVGFIVmtCeUZSTUd2enkzYVZLVGFUb3Y0K3BFTDVadnRFaHp2Y0RjSldDM2krMXRGMk8wRk04aXppNllQeFR1SFBrNkxwOWxoVGhNcE5qb3h3cm9GTEVRUk1SNDNJNUtoN2dVOXc2MzdaQWNBZVFmb3FnNU9uVndkc0d6MWw3RGM0cDlrR2l2K3JhOTE4YklWVmRtd21EZklqZ0htM2diK0VOMUE1WHBocEM3cm9FcDA1OUxzdmdSRVRueFlIRXlianR5UGUrTVFsS1RVeTBFaXR4TVMyQnhSbit3UXJuMVpZek1jOHo0ZzhqeEdBYzlSV3R2UFNDd0lZRnZMeDhFV0JzZnBoRHdpeGowRUJVcWpZM3l5Y2RhRDFyTE9Wa1prS1RiZk5VdTJsN2ZsSlZ0dk4yeE5kWEQ4b0VSNFZITFlzdTRwV29acmFxcWtyUCsyU2VjbzJRZll2U3EvU1dnWmM5UllmNTdla0FtL3hTZUU1MFRYRHd0NWU2RjlCemY5dzRUbC9ZNnpzSGl5L3U3eEFNdmNaUUtqUko3OE9Sc1pISUo4Wm1WWk84d1ZsMnNTSTJnMVRDcUhqM3FPTVMzVmFqWVorWEF5R2c1cXd3dmpDdHRDaWRxM29vbXlKL1ZyTFBUeHJxWU0yZGx1ZjhXUU5BRzZ5ek9GOW5hdm1wVUVzWFFJcDhFVXROYk5BcG1BWldCd1lTTUZ4b1dacG9NOXdLSGxKUmlGZHpQTEk3SmJKWDMwV0NuY1hLRE5FVklmQlNKNUZFUlZTYW8zSmhZc0UydllwOVFOT1NoOWxTS0JGWU5PTEVZRnVway9wcDgwdFpjM1hlSWluWjVhUThMR0VPc3d0OWNOSmFxOVBzc2tKbUQ1TUpPajBTRmUxREhvTjIwOFpCZ01SWWN4NVVuTjVGTVNVek51NXlHUlNUZXdSRVVXRkhFWnd0NVh1aTZNL3JCUGFDM1FTOW9QcjFqd0lTWjFOV2g5TVdUTU1Ec25BRkFyZ29CVEVxU3hYbUkwbHdKY2ZGQmJocEw3SloxMXdxWStNT2tOblBWY3dNQm9naE5YamNhZnVKWWNLQllnYVVpdzZtWTVQdEpSN3RheUNURGJhMDVHcVRWTHZzVFpqbENEa1hMVkU0OXFXVk9qVE5qY3dNTVphU2dwUUsydHBCTER6WWJ3bGo1QWdRdG1DdGpKZGVnMjlSNEc3UFNPb3I3K3dkMlRuQVZiSDFRV3lCdHE1ZzBmVUsxRm1ORFV5UktaYkFWT0dSbk0rWmpYR0ZXVjJJeXNvS0d5dzkxbUJOZHRHdW5LNUFBQWtpcHM1eGRPMThlUWE4czVRbHQyVmMzMDhuU0VYUThmWDArR0NmUjlSb2MxWVBQYmVIZm55MjI3SnBQOVdkVzZLZzhXN2kwV01IaHpVcGhCUHFNTm54UUxMbUJRYXJ5N2RzNEk2WFovY3JFTHBVa0JvUGw5bDRvbXVUQUJYcVh0alN1b0I0S0V6STVNMTRPVTdhd2NRM0pRVkJ6TE1sWVJCRHBMczlvQ0VYdXZUblc0SEJ4eEwvSHo3dFJ6UTBjUUtoaWFHbXR6Kzd6MUNwZFZDY3R0RFdRUllNaXlxVkd4QUJrazFFUkVJSkVESk1RaVBHeE4wTHJCak5oS2tONjd5SlllcTJnTlZYYzQwc2JYSWdKWjdISWZKSEZqYnAxbmlIQzBBSkVEOS9hREVDQUJJYVdvelFLWG1UQUV4bmVLeFhCNTJUVm95eEFxTnpBZUlVaXFRYXN6aEQxdDByenlkaU4rS1ZURnZ1NWdDR1BYQWV3SzJKUnY3QVBvWGRSdDdCSEFlQUJSeHJmYmNuYlgzRTVyVmJzTDRQQVBONHI0SVhuMUpKeEMyRE9ZTmorcEQxVjlLWnFHSVpwdGxRMTgxTHd2UlZrSWd4ZlVWSzhRZW9zUC9ueGhHMXJIMEs2MUFOUE1hd2xkNjFHamk0U1FXM0RxaEtHTUI0ZTVJSjVjMUQzcUFrSjZwTHI5N0VWTStZVkFlNlJXSHZGSFZOUG55TDBrTFhNUkNxNExreFJVaC9rd1dXWEc5WnFqckpTQi9BVzluaXdrOGhFY010Q0sxWS9nU3I1bThYbjBkVDZLVUt5cnJCWm01bW54WGVBeUdYUThSN01LbmFqVm5WVHNRdU0rQUc1SkE1d016c3orQ2N2aHNSRHhrTDZQNHlnT0pTN3JKWVZ0VmtDOGVyOUJNZzlHNFpiNmc2NXJVbjlRSU4vTVhPT2d3K3ZTOFhQNlVFWXdhWHVpS0VPM2RzeFd0Y25jOTUwMVh2MXJrZ3hXWHFwODdwRzFGeTduSHV3Y1JlYWE1bHpXSFIyVzJONjJiZ3ZMTHVKNjdmZEJUZytCVEdSRjMzdC9zZ0RhcUpjZDA3WmpPNHNKZHorNi9XT0tCdjNZMW1TSExaTU1pemhGTG94aEFXZUFzMS8wMkg0ZTcwenpiNytwM2ZPLzZzOEpsdnpwd1JnZTJlNkEvaUdLN3lob3dYWEk1NVZYcno4NlRyM0JKSUtIc24wWEVBNGNrRHNuYS9obzhuRmp6eWd3MkFOTkFVK0N1YUF0RHRHOSs4NDJ5M1Exazg5K2pmcmRTSGZzeitxWDV1dmV5Kzk4ZytYQ0FlOS96ZTBENnZXanRkZHpWQ1BjSTRrNlpTQ0l5a2I4RXZpYTI5L3NzUVpqdGZMY2diU05oQlg1SzNzZCtiRmp2RTZYd2Z2d1pXZDcxNTl0KzlmTkZxT2NPOEI4ZHZZcENXOVB1cXozUDNXZ1VWYUFia2tqaWpBQXROT05kaTNFdHRnZDYxdmF1UmRHSSt1ekxIeTZvdnc2citCb21CcFNYMGVUb3ZOMCtHbWZkNHExT1RxQXY4QzFlemtGRzkzYUtNZUZtNzNkSndtS3dpOWtNNndudUVLT0VZNElsU2NTTGhkeFU2cUtjZlFTSTMrVC91VnZkNk92U0JCRzVOa3JOV0ZmeXJZYnhsY3Bvc3pWWEZFSGhhWWE4Tng1RzlTU3hkZGpDNWRrTHRXLzVYTDI5TGN1OElMUW9Vc21pYTVCem5GVklqcnlqTXFNM0wxNkJuVTJSeU5VQmY0RThod1NwUjNycW1OQ2hqNDZJYWhmbnlxWGNlazlzeElmb2szK2prRmcxb2JSaHBwdlNGVW53RVNjalFvMk9EUmVEK2tTY0tKcHhDeU10cFlKWFBnUkJlamk1RTdYT01tY0Jmc0FZc1Y4bjZDZ0ZPVGdxM0o5YmVoOXd3Y1h6cHlhcnJCZzBTazBTa0x4ZDJQZkRiRXoyQi9PdFJ2U3dyZWJwS0YzdUNmYmUxZXoxSTJucFVVdk5Nc0Nibk9PLzZmNUEyYXFDdTE3TEJRaE8zMzJWWmhRdlhpTERaZWw1QXJSdytnVHVhM05BdzZOb09ZaGhSc05TL0VsbEU3T0xzOGNxYkdHZ3NoRUxQb2xBVng3eE9mRGZFWEMvYXR4QzdJM1VOTXBhS1BDRXQ0R1hueldvY1JBL1JsYUtWeHhkUk9ZQ3Q3bVJKMUNHTXpadEVlWlBsUlhHMWFSeDlSZGpyNGE4dVlvdkwyTGh3ay9yNmo5MlAva09qMHcvNTg3OWhQUjN5dis0Y2NUby95ZERaMWo3MWdxMDNNMk5tQ2phSWxqNkRRWVlnYW1nb2YvVjUwZXh0MXUxbXFHWDZMRmF3QzBhdllXR04xVGVRWHVmdE4vVE0wWVVaQkhGcUFBbUpPbGNBblk2a3JCUnJWOGRwR0pyWG5tT1RuZUdPSVNUQ29wV0cwTGJNM25JSWNvbnJQK1BMS2pDeC9MbUtpREhMSEtocW5rdFltdW5jbGxLRkZtc3dwZDhIZndNSmdLYitlZ2E3QTVtaHh4N3gzQ2l1emRLVS9lemJlRDJrVXMzQlphWWxadlN6VlhMcDk4VlBQZHFSbnU2MVArbU13Z1NObmxMNXowb1ZDcHZONU9mU1NyYzFmNFBERHVSZnNUbHdxNDJ3cmdtd2tTK3hqVzRKVDF3OHhFWHhNWld0Y3NZUE52T1NremJERXZoK3dreWRiOTlBV2YzRks5cE9iSnZlZHNjNlB5V09vdkF2SUJaRCtPSkZXbnkyaU5YYVNtSGFXYURCWHlTN1hkZTJtRnNuR2ZEQ281TWJsVmw5cXlUQkhuRmJBVWhvOGU3VDh3UUJXRG8wa0Z1bnlGNk16a0gzQ2M5SHdreS9FSDE5emV2dUQrUWpid3ZOS2k2VVM0SkNOMEY5ZE50Qmw0L3o3NUR6SVlyUWFlRkpTdHA3MkhBeWRYOTN6SVFyc2o3MzNnMmJaV3Z3eFhMVHhKdGpla1o0YlBqYy9mSzcrM1BYWnAvckhieXNmSDMxOFl2Sng3Mk5FTzBpMzc4Y0lPRUVNZXBSWUxoMkxFSEhDTmJqR1ZkMngyOUN1ZCtYbms3V2RhbG1kV0ZGd0JzdU9UZGRMMDU4UStyU0xkTjZRU0NHY1gxWld1Sm5UYmV1eWlHMTUrYVNGNFpvbjZYQy9NOTZjRFpPMkN4K0FOUTJiSjdIMnI4Q2o2cmdOam1tUDhlcUhOdTVGSkkzY2dTeUN3dktjVmhiRFdXNGg4VGxJUmpwZEhrSUFzZHhYZDJmMlhMa3ViTVY0ZkxuYi9KWDlvQU1HbzMxeXdVanh4RGJ3OEY3dkoxUkwrOUdrV240Z2tEQlZZcktzK0s4RGlIR2o4UmdTNmZXb2JLL1I5MWRCN0IzMzFxK1Y1UmJWNE5MRlBQcThwSlo1ZHFMeWRuekQ5T0IyVG85L0hpMmlPcnV1djdodTdiT3plUXozMzFTZUpTREpnaC9OZjBHdURLcjJJSjM0cHF2L0graEt0ZGVvMGd3QzAyV2VQU2FwRWszNTRUMkNla2llQjZIcTJXOGFhbjgvTlJManB2NXBlL3QvTVpnTmdyNGU4K2p3aWZNZzY5TDUydVFSMkZ4V1hmNjAwb3V6MDMyQUIvcXNyejk5RCtUaHRGejhkRkw4ZE02SlNWMDNERzBLdENpTXBZZFhCMXNNSm12VHVkcUVFZWhzWnAxZ1JvV3lNblpyQ0VCZjlkSEN6UE50N2w1K0s1TG5FN0xuSjBDNWpMUDF3MXZjdzdFZ2dkRzNmaXJMR0svZ05rVVRDN0ZVdnFCMkNONGp4cmQ1Y1ZsME5KZkNKVFdqYUtpSUJvYmZRcEJDM0o5RVVXZVRrelFWMUd3bmM2NXJnU1pmSnAxN1h3aWZ4YWJaRVgxYW4xbnBsUHkyYUxxZ0pqWFZJUEMzSzJ5Sy9YY3BGbmdXU0VDd0dUZ2lkWXJSZk5WMzNhUEthRDlDOVB3VVZEYU5aL2JJUSt4TFp1cTR5NUxQd1dxSGxQSmhMTGt4Unl4YzJSTzNkMkR5dk4rSDBrS1R3d241Q0ZLc3pQYXZtOEJNWkc1T3NWWmpYMGxjc2g4aHdrQWdSb2RYOXVnNUE0SllQTWtURzBHYUw2Qzk5NjNOcldYeDdlVllGazRINTBjMG5COEpLT2crbytDOTI2SHd2OG5jYUcwN1J3YUhqRHd1NjA1Q3EwaE8rTUNoOENEN0ZEbytYMVJIY3lrNTdweFgyTDFNZHE0QXhneFJCRDUxaC9xUjcyNTY3UjFTZ2FuaG5wNEtvR1Y0WG9MOG00d1FVL3loWWNmKy9VMnZkZXNpR0RNaEJGVnBYVFYvZTNEbHd3VFRVMmx1TjIwZEhoamZIUXNwSmJxR2VWa1pvQzBJTDNDQUZQT1hOOWdzM1BQWW90ZGxzOEp3WDRUYzhncTlEUDl4Z3FuRThZRnpvUkZtTk9NSEpIa2JySW9yTjRQNmhSRnZMMFplbmRFK0s1eGNtUWJqdzlaUTIxYlpCZjk0emRpUFpQM3BOZkE2N09GcStNTTIyRUJyZ3VYazVOdDh6cHhLUXpzOVhmMTE2bGpwVUVmK2xHOHBMVW5QcXVpUjljM0JBa0RhV1R5alR4WnFLenRXY09NTGFQK1hZWjhaUXo3emd2VjdrV2tlN1E2cHV2RjBZcE5RTGw0NktHenNSSXZnMkVRVVBaS3RvSmNuMXRrUjl3NWxJUXBsK1lHWkFKZUZyOXQwZjIzNG1aSmo4RWUybHEzaVhsS2FnV3BxK083ODZkL0ZrNUpOLzh3QWZHOXBYd0N2N0MxS2YwZnhhYWlrQWphaVlacVQvQTdlZmJTU3FMSlhlRWFNMEwzbVlmNHBzeTc2czRMaTdTNUlUSkM1N0NkSlB2NFg4MjRDcUtuNzhjT1dZVklYWkRtOHA2VWNqdUVOTU9XVE1Pa2plTy85eUVBd0k4bFFnYU5uVnZ2djlRczd2ZjAxTWVMdGNZZVliYU5pcTJaZzY5aklWa1BmbGhlTzRBczdIVFJnaFROSDI3ajZaNFV5TjVHQ0FCL2loemIzaUl0WnJ3cUtYMDJwWGhYQVhra3JmcmZCT2V2c2xYUmxDRE04TzVLRDVMQnlLMjJWcUNZZExMYU44aTFELzliVThGWlR6OWJwa2EyYUkxc1JWd2dvancxYk5yQU1iaG5BQ09WZWlFeTBIeUV1Rlg2UVl2L0JCNFFUMUZkNWtnYmxxL3pmRnV1b1Y5YXlWOUxLbjZPWWtiUkhOdytYcWVabWMrb3NUWDhCTjhJOEd6LzVwY3E2cGlCczNsd0p1YnJxY2QyQzdWUEtpc2wwSGo5WUhqMXd5SktHMDB0Q2NoOWREOUFJalFlOXdTVVhaUUdVSEcwdldYWG9XYkd6YU1wRnBDL090WlBTSW1xQnpERDZYRWltTlQ2WXpmVERsenRObGprUkNyMUpEQi84YVdad2E4TGgvM3dmN3d2Tml2Ri92d2Mzd2lDTkgvK2lPMVNkSDM3Q29zVGo2ckw3ZFRPMlh4a25KaFBnT0g2d01uYmdtQ2tMcFN1RGN4NitmK3JSVFc4eVh2dHdlT2hzNmhYaC9FRnZlQysvUnY1VjUyZkZqcUpqalRkRzBPY1I0eS9QQ3FkeHBSTSszNXZJOENOdVpXOWVrc2ZHa0JQZzh0OFBvOXFTRHI5SmpUUVpiY1R1bVhFVlpqWG1HYTJEK255WlRIc3BzZFV1Mi9vb29oWkRyTXh0V2EyYXUrWFpkWkY2QktFbFpsUnhGWFVpZWQ0V21oR1RybWZGbjhiSkRqMW4xY0k5dExGRXZpd2xVMXVSQ1E5NFYzbjVpZ3NzT3A0Z3d0bVdVVEgxUWlsL3dWaXFkVE9uMnpSbWtqdEVGZG56a3lWUGtqdUJLdXNhMkU4QnZzTlpDU1dXYWt0TUJoOGtpRE8yMHpsdWFFYS9kVUZoWmZ4aFlSUWxMVThWMncvUHRHWFpUd1FYQ0Zoa0VVTXo1TlVqSnJUQk9LeHNOSXVTZzI5QlphRWlHejZ1OVUrM2VrQlZJU0RhT0x3QUYwK3BWTk5nVlFlcXkyZGNBc25wMFVTaGg5aVFTMDdTcU1QamozYUdzN1F5cDc3MXlDZkVEaWV0UTMxa2d2KzVGTTdrSVVvTTMzNHBkdG84YWVrU3MzR0VlK0JlTGc4SmdiVnkzcGtYUHowbDhnMERUNkZmZ1hncHM3bGJzQWYrMjZGaFcxSVk2WTNVdmkzTGVVc25EWG1mLzViNVQrOG1vNmdqUlJXWms1L2U2Y3loeDhJOG1odUdDdjRudTZCYzlaV0QxWndlam1nU1hBQjAzVm15OU41bFdhdk01SURzLzRKS0lzdWJvZVRVWnRHaVBpdmZSemJXUlFCN2hhYkhabWhDaFVpWEdQQTMxaXppQ2xadHpUNDBaVlpnaWVMUmRqL2JFSWVKYUhwSkhNMTk0U3ZEWFhNM2hHTW8vaHpZN0xDbnJXMVhWVnhLT3FnYXVqTE8vMjVzZ3hlMzh2b1hlZElsSmlNOE52NURjeTFzZVVqdzNXeG56QnY1SjlNblAxUTIyTVhoSXpUbWJLZStncElqNUxPK3Q1VHEyQVdwa2dUaEVIeUN3di9UTTUxNjgxVDlsTlArdDBvVjBTdHlUUlpZalBVSkR2OGs4RDlGQkM5MUJIejBpeldCN3hueVFtbkhjSTdBK1N0TVVGUzR6dUVJWXZESlRJSDNXNFFGWmR0QUxoLzBPenFzL21kR281KzMyUktjbFk0dENtLzBtT1FXRUxwSTd0bDF2cWpJNlZ2c0ZHSmVYRDM4cUxDTWNjUTMzcDFvVHlQSVZGR0VOQ1ZLRXFaQ1lUemNxMEJabGFpQ3NGeFVmQ1F1NFhweXJCMmhGTnJ2Nkp6MkRWRUE5ellOamtWajRxTmlXU1dwdm02SlEzdDYzbWNUR3A4WHhNK1ZsL3VHMTVsU1RsY0ltTjc2UnZyRlVldXppdHVwSjZQZUFaOW5yTGJzOVREVlZDVi9jWjJ6SmxjUjJBWFRsYnBMOUJjQlA4dWtFVjI1NmJqWXZFQ3Y5TTd2K29PWjFYTkt4cTBoamQ4djFPL1Z0OGFtOW5obHJHcGZlbnlQZEphQkM5UzUyR2NScGFyRGVJd1NKUW1sTkE3V09lUENFYkFKTjdCeDlvU1MwT08za1FxL0lmT2czcTVCOFdrNDBZREhkSnFYMkVJM1haaDVvVnNSZm90L3BxSHJlR1p1dWdxWnpLNS9nSFlMUUFPVUdZekt1RUhvVVZKSHdVZ1JnUjN1UjhvMWtndmtBditZZEhVYVQ1MHlEaitWSjhOMDBPRjQ1KzZVNWpRTkJGdlFrSXRlcmlnTGVNSzYxRHh5bXFYaDFjZjlQOUFVaXdFQzdWNUlINDlhUGVoUy83YlltZVpRLy9OUzlOMGxHOG9VK3ZKN2RlWEpxc2U5NTEzZG5hQytGK0tIZXNDWm5NTFR6YkxnMi95OXppUG5XTHJGbkpMendMdFh6VW1zckVqTWpoYTZNL3FHUWRsbVZlazdxZUNGdEFxditmZUxvQXRZRFdSaE4wV0xPNWNHbThlcElRc2ZGRU1Yc1dyb2dpMzd5N1BtdkdLeHVGQWh0MlJScFJSVWRBcldTMGtkZnBxeXVjeVNuZnZkMVp5TFhyRW9yZG1DU1pGU3Q0R0IxeHpXQUhIeHRsaFVHUlY1K09EazN4Qjg2emhQOXlzMEZSVkxDcFNJcVFOVXpSdWloODFUY21LUlhHcHBPN3E1Um14NXYwNExoZkFiSmJIcXd6Z01Pb01XbFJWRmlDU2NEVVNua1VMbWxYdENBV0xYZnh0R09TTkNOSDZhVUh3T3kzWGZqd2hzOWpLanVyTDg5dzhSbTlkSElTdzRGOGwyRTV5Nm5hSEFGVDhRQ2swaUF6TDlXRDdNYi9IM1RQWjNKdE9IOVcwcTVuT2NNcjM0SWRNWlZGZnJXZVZtMGZ5RXg0Unc0V3hrQlZxVXUzN1pWeDFhV1p6and2Sy9jSWhrSFkrc2ZXNll0OEV4N1NibjJkWTdCeEU4d2sxQlBNOE9uTVJlNS84QjJjU3RUTUd1VkVIM0N0bC91L3E5NmtISWJadDBoYndQbjVOZGs1aFJMUXkwWmM5SFAwV0dPNFZNenZybTI4N3ZiWHh0WWYwZVkyTDNsNXd2eC82ZWNoSStQT20vcyt5M0U0a1lqa2hHalU5ZDRISG5TclhacDJlcXYwMFpWeHhwejUveUxjOUtOckFyKzhYOXg1RFBRVld6eE94ZWdDVE1YcjR4c0RZQnJwK01lVzJNZVcwRnFiZXNqZ0czTzZSVWplTklUVGx5OGRLN2hVMGRHQkVjbDRUS2pvd1BKeFo0VXhQcWJFbFYwMmpYSWtXZU53L0UzaUZPN2VmeVZqVlRMWTlxazdOT0dCTFpHOG9HMjR3QlBYcml3NTVncGhVQlA2bFBwTTVtQkdiMXlodjZLd2FYMGlJYzMzUCtWWjNtOEd2QzdXS1hQNkk2SWZlc1hwWEwydFBvZ2pZVzJWaXJDL3VVZjZGNWNJa3V6aXlOSmZPWmg2SWRkUjFGRDZieThaVVpPZFhvNDhnenVaVTUycHlJd3JDZktKVEVleDFEcnFpUDVIUjBqOENHUnZ2R1AvTWFqeXQ1dzRNUDhUdTZZVW5TYnlZZ2RlUFNaeGhZL3pTSkNZTFVPVW0rZ1J4N3d4dkJMa2VydEZDOGVBWmZXVU9kOVRtYnUzMzJ6aGxma2xsbGU4ZEU4TmI4RmphS0xyTjdUYkx5cmQzTnF1MVBQZEMxSjd3czI1L3B2a1pHa243REZFRGFwanR6a0NrRVRZeWdNTFVkUHA4eldETlRoVVJiUFM1OEZQdGRWU3lzLzFnNjdkdS9nNlJHa2VoZ1dPRi9JM3V6dm5XZDRwMDlWNXRsRUMwdlYveis0dk83S1JqelZqbklqM0draWx3OERaeDZ2T2NPRFpqbHJJWjZRZlVsckp3VVVjKzNicFRoeVRVSWo2bjhTSGJ0SlNZeHNka0dlazNXK3cvSEh5NFNiNUhWc1lQTEIrOS84Y2lRdmxIaEROK3Z6cXJtaUZFVnFDWDdWdUpDcVJYUTZpREFFenB6cHN3Q2ZzL0h0bWlvM3ZidzBIOCtPVk5YeHRFSG1TY2ZYeVp5Q2J3VDdZdnh4bEpyUCtzRElyZ3UrSUxFUisyakVkZ3lKdzN1UW5sekhNd1ZFL0RoVWYrM2x2M2V1dWcxdko5ZFhmSTJ1UFZ3NHFGL2dtUHIweW5QaHFQKzV4Yjh6OW1BRzJ3RzU0R09kL3hoRllIdmlWQVZxTUFmbmRnSUNtTDBsN0dES3djZnJxNmpEeCtPUC9UODBuWjRWK2pWRDFCWldWc2RCSHZXQmwrUW90UW96N1NtK3F5NnRjR3RxY0dKZm02bHRYU2F6OTdvSlBaYUtYZUZINzV0b05jTVMzN3lpTnpYNVZGNDAyZzd2emRXYWdXUG8rMHA5WUFmWWFNa0p5MWlpY0FzV0dLaEFmL0Qrcm0ydzd2THBhOHhHT1V5NEdtamU4YjBSSlVuVG40Q3J6TlFabjNPQ211WUczTjVPdDhNczZMMnpqVW5OcUxCUVNkK1N1OE96cmxuV0tEcTM4NnE2MCs5b2l2enY1NjVYdEU5SkRvVjdaMzZ4ZSs0SExEMm1GU0kwcklicXI5K1Z1dU5PWFM5Nk1HUzdabmR2MjFiZHBmdEY0Z1o0azllWXcvNVU5dGpwS3BFWTduQ1Q5ditvdmNsekxLWlhWSGYvYldITmc4NDhVTnprOG4rVElaNzA5Yzd4aS81cmVrR0NETnVjRWpvbHBTemhPbHBrSjZQLzJsb2dIdDVycWpjRFhreGlCUzhKMm1PZjExK2RVRmJ3cWtqWjV4b2x3Wjl5THZZY1NJblFma1VGWWkxKzJkNmoyTG5CTXFLckRoQzJrRHRDc2pnM09UQVNBR2JNQkZ3VThkRGpBY2xsQ2VtVkNCQWZUbU84VlhiWXNuVmthTEFBOVptUzhmWlRFMjR6RDRIMlhXRDVoak9xa2NMeXVJSElNZHB2SVRPY2lvRDh1c3poOEFPcGlCa1ZkRFZSYzlWdHJVMVNUQ1hhK1k0TVlTM3dKRHJWenZ1bnN1NC9qTTJvS0FqZW82ZUhJQ09DRTlQRFNsMjFjVGc0VXFmaWJxc3VuVW5NV0lDUHZvRU5qcmhVTms1VitycXpqOVNrNlhNemNxaVEzcFUvSmxlYTV3YmhVQ2h4RlFrS0NyWnA4QlZpaitNUnpiNnJMRWVCQXlkRXFPT1UxYnhkeUhONG1kNjhCZFdKL2d1OEhDeG9vM0lxZFMzSGRKWTFaYXArMG1jaHE3ZUhuOWJXZyt6VzBseFFoSGdrUE54SlcvQ1AxNUl2ejlVVEY3R3gxcGhIUzZZVWEzaHBMenRRQ0ltK2JSL09sbnl2WHNVcHA1V0ozN1U5RzNUZWQ4V0M0dXRremNUTGlUc0JwLzd0SGk5M0JXeHIyZm9zeTZleVQ5ejhlbmhsNkNWOVdPWnh5NWRnN3g5Zkw3TUVrRkYxdElOajUyMFhoT3c4VS9oNDBjZFdPME5UbXl2azA1aXhHS1pFeXk1b2laYitWanJMZ1JnckhCeWVVK0dnR1ZJd2RVSUFtMnphOHVkRXFEOTdyRCs2Q29maFRYV2pVeWkwYWdMNHA0blBodVNMNHpBWDBOTEtVN0lJRGprUExma2pXK3VpWHY1cVFZZUdYWTFzVUkxakNFWnVCQlZiYVhuY2psRUozSWg4NmlGeXQzZ0l0L1I5MWVkMkY0cmFoRHllMzIyL2hndXd5RWQxZnFUZFNyenJLcUtiMGhKcXhZRTJCWWVqLzF2T2Q1bUFVaUEwN054NUt4cFZ2TjEzdzAzbFVWZDcxTmxsakJzQXkraklaQmdnNDF0VEEwc0cwYVQ2d1JnZGw1VjJMSTJMRTdvUWhWUXhlU2NabUwyYTRNdjF1UEsxYTEzZUJhYjVwRHAzZmlIMVZVS2haL29GV05XRmZsSHcxQjNaNUFkODFpYzNWSXl2TWM2M1oyRXpjb3dUZk91U25MOXFsd3AySWExZWxSZm5mSERlUjd0cjVZNlBobDZrRnlwR2tBVDZ3U2VPU0lOY2xXRHBCUzdrcm5VZk5XNTRFTGZzVnZ3MkVHWDFXKzdkZit1SUN6UU5DSkFHWlRJd1FSN3NHampyejN3U04vTUNEZmZpYjQvTG0yK3pHM3RPcy9NbTVBcU9SczNhdms0TTExd1BPempteDhzTit6RjV2bE41ZnBjaW9LZXdXVTlCSWZPc1hGVnBMUUV0aUtZWExDQkhXMHB1K2k3QzlKdmlmTE9OYm5aK3VMTnBRRnhEQ3pLUFZzNC9Ob0Rpd3pBUnlJN0JyKzQwOUU2c0ZqYm1FWHFPcXI0TGVta253a0YxRm8zMHB3MUVFNUNEbEI4anZzakRlQ2FoMEh0RWw0U0t6M2p1dnFMaHZlWkdtcFp1L1B1VVA3emNiby92WXEvZWRzZ3h0aHhuZy9aaUpNUmVqT1N6SGxrbGZaUkEvL1drOVZjMXhvNVpyNkVQMFdHaVRRd252VitodE9lVFN5OHc0OWlScEFDZjMzR3dyWGpEd1JlZlVOdGNvK1pudEI1WWhRbjBuVlZsQ21mVTBJOVkzbWViMENLZ2VnNndZb2kvNXFhdkhiNTJrZHZuVnc0OUxCTi91VkVTL3gzcW5lT2QzNUVSbXIrUk1zZ2k5TWR1Y2hVb2paU21KZmFpbGpJSHpseXJEb0VCd3pLKzNESnZwaTRXR3B0YlgzdGwrKzVObE9DZ2xOSEZQNVhHZXYxemVza1pLU0o0V1hOdXBQWXF3RWl3dnhNK0pmd0hWd1EyaVRiSFJkcEExN0ZqY2FXUUZOeW94bnR3WHBQYXZMbHRDZXBueVU5OE1pOTZpU0duL25kQ1p5dnY2N2ZzRE83OEt6RkZTTUlKb2d6MWtPYVF4b1pCM210dFRnZStOejhrWGRkUVZHWllWZ0pidEcvS3F5RGZWM1pPbzNSWWVxYzdHdzF4dFZuRnZDYi96TmFJTkVuUXRudXVmYmhnL3VTcW9mZUs1cUE4WUZOVm45TmFpc2RieTAxT3IxTENuMjY1bVJTNTNuNU41ekVZL3Q0VndreWxhOW5NRTlCZTNJdnVjdCtYTEpmSUM3azNYUVQzVnl5WjhWQzJ4a0g2cnFqeWJDWXVkcVhocTNCVFVMUER0dHI5elVJL29uK3VuNWQrbVBGYTkvMnl0N0paNVp3YkUycDgxTGVQaGwyTGFGQ2NTU1ZYSmNEVVJScWZWY3F2U2tpMXdnZkhNMGJLOThMTHZRWi84QkIvOWU3bmwyRCtFeXZzaHhHTGR1VDREbzNySFVhZlZ0ZXhUSWtwZXVGZ2Jhc3FYaTc1V1N2YVd1Y0J4NmZTYVBQY2RwdStteTR5QmZ0VzRsaldYb0U2WlRoZWMyNnpiRGNQdDNUNEtGMDVUYWFoM3p0MEFUVTJsbUgyK1k1bDdscTVtM082R1pCN0owZkQ0MmN0UXFzUEd2bTVBcmYvczBKbVhCSmY3VjZwTjBBeXZZNTZvQTJSL3k2Mm1qTlhMR1V3WlljcVkwMXcvYXRoSWRXVjhyTnZhNlVmMityMlp2L3d0d2JDTFMxQlFKZmcwWjJCZHpKdklyY3pZLzAzTlMvZGRnUTM3MnRWN3VHajJLNC90Tk0xTTNva1kxditqVC9MVStSUGJwZlhGeDdudDh4VnJTSkcyb3QyMGZXMUYyM0NoOW5wMmtKc1JGY2VSUllEdnFyc0FibklPZWRqelpsOVFabit2YVQxeEFzcWQwUzVaNXJhcVA4NFN5dDZYcnNoNnJkR3gvOGdXeE9ISVVJdG4xNkRKV0NoUHZCZU4vWllHMVlJd1JiT2g2Zm14ZW9TNnVkSytzZEE3ZVlmb3VCajd0RDJ6My9PV3YyOWNhMktHTnRzUFVwMmZ2OGkvSkozLzJqM29YK0JqQkpQSlJhb0Fycno1WXdHc2FTcEZTUGl1Zi93THg2UC9QUS8yMHR0bHpPTFZwclZKUGU3UisremVDQUNhenZlZHNHdW1FeitsMnJRM0huYWdYSXFiR2FWajBlMGY0QVRBT3ZoQnd0czNDeXRTMW9RMHgvMnlNN0I0V3UzQzJHdGk1RzJTT1RoVWRTVVk2c1ZGbHVPUEs1VXV1MStrYXVRVDI3dnF5RXRQSkd3S0xQSkFNcG9jNHdQU2NjVVZqMW11eVkxUDB6ZVdjdWZYejRGV2g1YzBnYzVUcmt3dHhnQ3NxSmxWYXZ4YnNFOHBhTDE3akx0MklpNWQrSjdlRGpZRUJ5dXY2MUlDakxyOTlFSi85OGRMZFNlZS9kLzhBR3E2OWVyeEtiR0FFNWVpRElYZFYxTkg5a29UdlliVlhFWXIrWlE0K2NxQXpZYmo2WnllckpiWm9vaDZaZmRORjE1bmxscFRIWGVGVWxjelQrc2NyNW8xOTQ2TjZaYkZhY3RLK01Jd3BkYUZ3MkkwZFY3cTZTL3JnbWVlVlJLVExPOFIrUDhDdlRjY285UEw2bC9ZQ2tuSzVQRGMvTmkvTHVCL1hNWHR6UmhuN0szMjhlWE1vV1o1WEZrWGxZb05DVzdTZ2NwaW9YSFh6VWVRWlBWbllSVjZscWhyWmpVK1p4NllFZlhqcS8xVGJWNUtJNkZJR3VWbzJnZmJyQ0MwS0VUSm82dVFkNWpLV1ExWlhPaTJicjBUUElQOUQrbFJxY1B1dFNjaFRON0ZKNWNMSzg4WEg1elZFVk42RmQxK1c3eWVwT3Rjd2dWdVNkeGpLaTAvVVMzRU44dDlaSTV3Mko1SUw1UldXWnUyVXpSTkZTQWZiMmdSWFFjd1ZLWlJXa3VmRHVxdVFWdEVNK2Y0TGtHMS91VXRLWG1sSEZnWWE2Q1VSbzhTU2twNHpTaUtReHlXbE1laTZ4MVpjRWoycmdCQ3dIOE1TakNka1ZMRktpV3AzSmNyYmkyUWxsUEJBQ2dxZlR1YkxTWnM5V2JOb2lMdDJ6VzdLK2tPMGJhVktiYmRnaWMzVjlFR2xuMmNnUDBLNDdpclBwcWw2bFNDY3BJdFREdERHTDZmb2k3S2VrN3BwRkJudW9vQ3h2YmxsYzZtN090RkVURXpVVWhDMUo1SDl1dVFLRVlPcG91cU9SMzlYT1FCbEY2S0lweng0VnBRbEpaNUxUV1BRY1VndGRLbnREeVFpcStHY0VaTUd4SzFTeWZlMnBKQ2Y2bE1vTW9RdjZKSDRrTmhlYW1wL0E3QXN4ZUlzeS84NTBKTm5CdGZOMnpHL3RzSWNvRUJxTExWQXFxNkZOaFhlTnN1K2hIWXJGZVlxNllCVERiaXRHV2pNY3MyMUFhS0VyTFdvMzlrcjh4ZGhUWUdKWXMzeC9YQXBEMDEySytqQ1V4bnk0VllaT2k3b3o0czVSWnZFdUoyMkVORFBleldtdHhYTEI1ODRNM3JjQVJXV0dZNlhZSmYrcXNFN09kV1h6VkpvV1crdVVNbUFzazdnekdVeE9hV0VqdEEyWGFpUnkzZFhDNVFXaE4rTW5sOEl4REtldDJOdWFOSGY0ci9HbERScWYxS3JkVjI1NWg5QVFHb2N0VUtxcVBadnk3eTdUdXdibDRna0tpakRvSXU2blpnbnI5Q2xIQm1qWm96bUxmdjhQdjExVzZjRmlNTm1saFUxZXJlalVGUkxYWFoyelBDOUVuUVQ5QS9Gem5pSzZkMzEvYWZXWDNMNldxNkhjQVBRd0JiVVlxVmFjSTQvMmxGeEtlTm14dC9iaXlzRHBVdWtkeUlqYWF4VHBydmZvNWIwWTN2Z3NINHdFOVY5VHlxLzNsc1hja3ArY3JyK0ZyeTlkQ2NBSHBMVU1kWWJrNTQzSHFjV1ViajlqYmtmZnhzaHg0eVowRUEzcmZ1NlM1N2ZWLy9TK0JId0hWRGlCNGJZVkk0R0VJWnN6SlJQdzBZL2hvMGR0elJwTHJkRVFHcHN0VkpaVVE1c0s3aTZJR1F3OFNTQkU1RWtoRHBIR0tzQkowSDRQV0grc05yU3MzWjNKWWl6ZUNHdDdYQk81enV5azdqeFIzMkhQdzZDamx3dUZTMUpkNGVaNWViT3RwUlJaUFZWV2hKOXNrSy9FRnZHNjRlcmtZRzRWTnFZL3BTQzF4RHNiSHliRktkdGJwOC9DdXM0V0hFZnF5T2hxVHNWZzUxRDVUZ3pkWit6WEtwOGhkM2o4RjUySXFXOTcrUStobnF0M2lzQWRwNTFHdlRvaFJaaFhHWC9ndjRJTHRhT1MxdjBNQ0tVbFgweTlsL3drNFM0NDl3T25Oc1IwV3BnVEswMmVFdzQ1MVlHWWV0MnJYNEpDVjU5cElCMWJkbWJ2M0duMTRKWm9Va05KODdTR00xeVh0c05MVTZuZWpxeFVlVzQ0SW5uUGx4dmpMRGNyUmtUaDBkUVk5d0tTSmkyNE1oVWZKeXROc0NWNzRXdUh1K3ZodFgyN094RTBoSTUxWktZWDVBWFlRa2ErOTEza1J5ZVVMaUxkeFpmVHhYQVAyL2tDd3NDL1BaWnlTcWtWQ3BmdG44UGxDWkszUFE2a3ZGeUplSVIvN0lFRUhUelJ3U3ZWcEFRTU9pbHdHZW41UGNFMTJ3bThzV09QTkg5Q1VvVTJPRHBHV3BEZHZMeC9ENDVEWStJam8xaFN0SDJvK1hEQUpqeitYOXdadzVzdzd5SXE4VCtjeWVrYVovdW9lMSs3VjluRUZ6b0xvRE10Slloa3ZwckRjd2lHMTNpYUEzME9oMEN3OXFXc0d2OTJNQ21WT0p0YUFvWURnREt5WVEvaVMySUFmdkpmVVhaWmw1QklBd0N5UUV6THF5c1IyN1FiUGRobjJvOHg3UGdpemZteTlLQnAzNGZNaFpQMGdHT0tXQ1pHck5OUjFZMDBaK3hKWFpQdU5iTThZaHU0WGxrMVdJMll4R0FwVnFpcjFpMSthSnBXUDcyaFN3WmVQS1RPREpNalFQV0x1bUY4T1RKUzlVUkhqZWxJb3Buak5UWjFaUFZnZ0hCNjZpREJ5QTZORFk5amh3UHlSYmt4elI5bUkzV3JpRVdNL3gzYlMvRmY5M0xSQ0hpeEcydUlmeGVNU0p6NGRkZTdzUGJ5bDZLTHltUW11NUJ1TUVLeFIxMTFDamVtYWFHT0dScytkRmlrMUErN29jNFRQNVlJMUtlL2lVQmprZTRpTGZKR0xVU3pnZi9Ed1lOSVp4dzB3cndOMWp2c29LZlhpSThtbExRLy81eHZYc1NGdi8zc2U4TUp0VVB2V3BkU3REUDdBT3JlTVVnaEFCL1VTTWJXZ3BidTEvc1VyMldMSVhPNU9YOGZudzhQdWdIMEhiVXkvMStiN3NpNktWdFRwbk1ZODhvK24wcXhzcGwvQjREL0xpdFBwS2E5MmdXT2w0ZVNObWRPdGY4WmRmUHorYklmdDMwSjlXbCtScU5JY3dYQnRCTUdwaW0zN3N5ZVJQOVlPNFpuRTVGelVuN2Fxb2hSc2dkb1Fxb0FRSEdhWm1pTENNYkkrZitXSUhMNGlLNGhLWGkzVVd2Nk5oV2RlU1hLRFJBWW1qMG1xV3FtTFl2blQwYkU2djNkdmMwbDdLTjRJK2VVTmJCZHVFMkVWbXV0ekw0OWs5YUM3RndpMm5CZzZ1N2d3VkowSS9rZFFPMkN1Yk1BZkVodnFUNlRlSU9GdDJJdWFHMk5GYU1YK0VxN2tDelhqUll0T0dvRDFOVkdoQ3JHbUJTZzZSb3l0RU8vM3Z0SW9FTUU0dHJ1V0c4NnFibFdKVjluODQ0TTRCL09CUEltUTh1ZEZtSnRvZktPVldFd0UwNnBRWnFrWkJEWUFHcmI0d1FHY0NIQ0VDU3NSL3FKdnN1bUEwcUlKQ2lGVkQwSFU2LzFSdzNDTUUxTE51NldVbkMxd3dUSEtEM2REZElRVm9rYm9CRUVzQWRTQmRnVldVY0dONldoMmRlU2xpQ01Jb3piZ1ByUHdGL0ExSTlwN2dwTUtodEIrMWErYjlDNzlGN2ZseThWNHlIRGZxM3RKRWh3ZnM0YnFNVnVHcDFFVzV1eE0rQUN6TmJ3M2VuMFZwcUt4Z0Y5K0ZDWUhKcjZ3MWNmWmEvclRwd3dTWWkydkgyQnlnKzBEYWtpYXQ4MHU1UWZSbnlyLzEzcis2ak10Ym1IOSttZDBXSFgxSHF4WWt3N2o1ZzJFc3BQZGp5Q1BNRDRNNHE2VG9zQ1RMR0ptb2MrSFNTNE5NR01hVHNIcEdzSUxaR29OT3pJd3hoVUM5WjVYaWlxM1VVTWl3NUgxUDlxb3Z1Q0VJekJ2TkJoVWlTOHRCOTBRTWRrVlJsQVM3Qnd0NDY1TzVTb3Bwbkh2OWpsakRNYVM0TXl3dFM5TG0rbU8xcG9qTkNuZ0YwdWROdW1vVW5hUnl4Mk4vbjRPa1J1b0V6VHF6ZHZndDI2eHNyRXlmUG5UUzRROXNnYkZDUXFnRTV0N1ZaampNclUzS3dzcWhFOFB3L3RTRnRpREVtNG8wSmUrZ3FSZVEzZExYK05BRVNQUDY4bVp4b241TUF5dXF4WEsycy8rcnc3RTF3SUVUc1BNcWFhTVdlbWw2cWh2L0VTdWdYd2dpSWZRVkFCVzV1M2Mzd0lsVms5NFpEVDltdnFVWGVtYkRHYkNUODFUVXFxQXlvc0x2dC9kN1FtR2t6Z0JSRVIwNUY3emNIU21CaTJZdEVGblV4U2FsTWdRbW9pUmJITGcwU2FkbFVHWmRpSU1XY2QraVo5TU8vaHNoRTNrSzE1RlpndkdZZ21BRllNWE9nQXRtM1BkZGRUVFhNdVpXZ2gzS29ySmtJNlRYS3VsT1RlUm9jWmhIemJaQVNKZ3lDVWNDZjFsSUZoYThFV09aaWtxVjNPVk5aZFNyRlNJZ2pnUmpWM0RWR1l0RnIyNW5UM093K0ZIaS82YVFyT3VMNHRESWJHeUJVaWFyc3VUT2tnYUoyaTMzYmtKYWZUcnFaMmRPNVFhVWMwa1VreWdVV0orbUlJMUU0NjRWem9MQkVKZllhS2UwZlBUUGZsTXNsbVozSHRhaEQ0ZnltbGY3c3VGenBlNmZTZWNRT2YvV0V3WGc4Zjd0eTJ6T1REb2V1V3EvcnlwVEJFdjBxcGY5MFd0Zm4zNDhjR0ZIMUwraGd1WmJyWjFnNXhETzVPYStKenVMc29BdGV3eTZ6V0pzcHVLOUR3a3FYRG9CWExlaE1rZ1VxcDNNaHVTUXdnZTdETUZKczZPdHBldjBnMDZkandzOEV6QmM1dEV4dXJ0dDJtRkdXbklNdVNuUjU0NjUzRmlBd01tSlpaRmdOSEQ3azNQeURIZFRDNTk3Mk5GKzkxMkNrTnhxOFJuMGh4OXJpTzJ6ZHUvSHoxNXMyclY1ZjlJM1pCRExuZ1MvZTVheU5IRGdqOVQ2TzY4N1dEcDI5TXdQSm5jT2FZaWU5dVhyNSsvZHJseTBzSEFoaHluZDFmYmZYU1dCb1hXMUsrc1h2SElRWlZ5L3d3eVR4VlF6U1Y3enRoUkcwN0RGVFRmMWllNXlEcTRKL0hkZy9ZK2lTMjg5L25nVG1BSTRjaFJreW1wSjNlN2VZTVg3cm9NQ0NNM0crdnF3d2IwR2NCVUpQSlJ3Wm9MdjFCWUJLSEZBaEg4RWpBNE50MUU2ZHRkVUJBSnN6RkdvekZ5Z0VhUHJZS0FocEt5UmlsMkhiaHI5MDVaaDBHT3kzTXI0dzhnNEZQZmxSVnk2Z29nSE1UQjFhNGI3c0JXNEp4VzRtSUY5NWdaK1oraG41MExqT1QxbldibUtYZFhGWFIrOGFJdU83TUM2a2pZSVp4bEtaZ0xuT1FFS2E5aHNzNUZJc0VNcEp3eWhDK24xQVlya2M1aWc1OFk3QXhCUmJuRGFLRDNPVktiMmdKZXdZMncyRGwvRkhia25KaEFnVEVBWFFGOTZoRzA3RE5RRnFvSjNXMUNRSmIxYlU4Z1J6RFJhUTE2NldlaGYrWGEzRWZhNGJyQjJTWXdGQjhrUzNPcFR3SkNwWkhiWkVsQ1Q0eWUxcnRRS2NRcUtrWk9KSUVRQVZRTG9tZkhEV0N2SVlxVlJOaXMwWmJrOVRTZnRMYU9jc0tYZXg0WEE5ZlZxMmxuQVdLM2tzT0RJK1poQXZVNXpCY1JGbzEzM2Z4R3hsQmtwQnlBc0lZUlZxenN5Q2NrTFFvb2lBZVFVYkdVZE1oaFcwanlmTlFSVlVoQ3VmbzV6ZDJkb0t3T05wTVAxU2JZUUJrUmtOQ3MyWEl6aSt0NWErc1Ztcnl0dmo1RXljQWxZWmxWWlBzZmtlOXIyTjZ5VUtBTmF3bmpOcGR2LzNJUkQxUGtzYkVkRm95NXdpeDBhcERFZVkwWmhUMU5Ldmd1QlI0TE5QOE1xSm5pYjVPbkI3UzRGZ1dsc3EzUmI1Nm4rdE1FV2xqd0h3OGM2WVltM0lEUnIzSmdDVTBkRUUyUSt2SG9aUzZDQzk5UmxJOUpNZzErbUVCalhmVUFDaURGN01jR09ZdVVocEZLZ2lVTWl2dmcwZ0l0RVVCUWFHb0pjL2tDL0tQcmNiMUpvdVRKSTdkbEdKOS84U0dLSlliRUgwQTVDRGFZSUJyUjJYYVZkMkVDdytWMkRQcE92TThBMS9IT3BweDAyd1NCUGlLMFZpMHJYbW93R2VoaVFWSTJhYTVuQ1hHU2gwL2JsM20ybmVKam40MVFLeW9KK016M0ZhQmRaeG9YMGJRQzliYm1zYlVIcExxMnFlamtTZDJENFRQTzBzU1RvaU1WWlgwZmxIYWc0TTQ1bllSZ2NyWXArSDV6UWpjaXlpVVJEM1hla1ZPcFFrRk9nZXpRWVpKZU8zZTBHODdTVWJBRml5Q3pKSDdlNjhwNDBWVWhXREw3SHcxS0FpOGpUUUJXaWlsaTdSTUcydmxpK0lFbnk0YzlveXNFUVZaUk5CNmpRN1F0UFRhektKeVAxMmlYSFdqU0l3UUErWTAyblIzK01qd0x6UmozREVKd2hOaUFLbE9BUnQ5ZDlSYkI2aGdpdGE0Z3FIOUlMc0FlL2ZVUFdUT2RJdHQyTmpQNXNhTjF4cDBTa2Naa1cxTlQxTlFKcTNrd2NIWmRVY0pONTVzSkdreE9uSmZhUVRzdTg5M1JkSEdNMjFPR0Q4MXpnVU5Bb3pCZURUN0dqUTlCZnlvZ1JDU2hTRWhZR0xjV2krejlqazd1MmVXc1A0dUJYZVhsd0M5NGNUU2NXK29leGhpcDNjcE00UEE1bjJkYnRiTmsrNzkxR3R2aWl1Mkh4aUl1dFhMMVl6TjVuWHNiclpUa3N4SFEzUGFGT3RmYkR6SWlTSmFaZW9odElJMFJxbkZHQmppK3J3eUQ3R1UzcGdhNDBwMWEvOFhtZmhUd3NkbFRFZEFHbWptS1gzWGYrNHVETzlXRmxRMDZxQXBkb2ZvYzlETWU0MFd2Tys4cWlvRFMrL3NMZ3IxUTU0S1dRaTJLbU1kb0tWSTl1Ly9NOEtzTzIvMFhUZU0wNUV4cU5GcStxeWRmcWlNZE5YRzc5dllnYXhLVlo3SFV3Y001SzduMHhOMndLSmVyY0FrMlh5RHNRMTZValNmb1pJL25zalNmc3BhMHByb2NyeVlUaWZRbWc5c0I0MWlLM2EybFhNZ3RIWTN4OGpEV01jS2NLOFU2REROOG8vVkFsU0hSR1JpMmJybFZna091QnNOdmxwQkhRbGFQNnUrQjVyU2JXWWk1ZzdhWDlZUEMwUm1xYmlhT3F4em0wNm9zOG96TDNRd25Ja0VXZXZwYWJxYlBBZWQ3UkE2T0x2SXJyR0ZsMTBGQVdoVURWMmUzK29NWEZZOVJhSko3Y2RBVWZmbGRBcm1SRXlrU3VobW5WNjVqNUFITmt4NkdwNFYycHY4QWRsdGdqSnk2dTczUE1QSXpzYjdUVjR0U3greWovMlhnZlorTVNOZC9nZjhJcUh6Y0JpVzU2WWhka3lrUytWNHEvOGRvRnpsNjErd3RiQ2xIeWg0U1FBMHYyTWNrQlp0RnoyQUxUUUFmbnpBZjZQdFUybS91aVlKekdwU0VBSVRBRkcwNmN1SDlIeUg1UCt0YmF3QnQ4MWZ2L2ZLcDR6Ny9ZT1MvbSsxK3ZIUy9VVURwcGhuQnNCaC9pOGxiK2tlUlZ0eE9ZVys0ejU4YmovMSsxeHk3ZXp6V2NhTWdwUEJjT3BnR2QwTzhLWGJLZElzeFQ0dXBmOGk5alNKYnNwdm1Xa3F0RG1UWEJudjk4RHM2UkdLOGwyK0VZZVg5WXJyR2lPNTl1bnR1RGxqOHZ5L0p1QjRDSDBRZm04aTM3S25jZTc1K2JrNjUvL1dNbHVYYU5BS0xxNlAvc0hnWmlmUjdiTU1XQXEzbjhHcEpoTDl3ZXh6N0RUMmVVTDdJeFIxbnZLZE9USllKMXJMeW95ZU94cWF4MXREVytpZjlObFJ6MzVwTndyRlcxSkRXNFNuNmpzTkdZdkdNVVliVDFaTGU1M0l1T045U3RYNG51QmhKTGhPd3JKZDNBcVh3bkVRamU2QzUrUHpubTVCRmhnYjM0T25GOWhWSDVzemZYSis3cW50SWVVN2xqNXZFajJpOFJzeXZnYU9QaUtoM05oMVBkbFZBL1RoMWhvSWFLdmFDY2RyZU4xRlVsMWh6RGNvUGh6UWg2Zi9yZDd3WU9CTHFFMUVYcGdqanA1ZmRRYTdSWUJmUHZ4cUJUTUZGYVVpQTRkM21BYTBGd1pmSXd2b1BUaXNjRGhndDZmS1VoL2RrK1JLbVh0bXpJVXF5NVdidkVXVU94TTU4OUtqWE96THNLcWZlQjlFQk9KZ3NYWFlJVElRalgwVkFZWitJNDZ0Tm14WHpCK0RuWmFuTmdvUUh5YjBNRlVDakM2Y0l3R3hnYWhWRklnU1JLZE05K0hKZzhSWWtSaU5md3VRd1BOUGg4NFIzWjNiRGhQbFlhYVYzQmdYOVNxaXZvYmJZcE9mNmhValBzcjN1cy9FaUo5dnQyb2F4eXk4L3B6RUdtTE1PeFFXamwyZmhtTTZobGpib1JiTm1iZFJMRXhXMlR1ZmVTWmFBS3pzc3ZwbzlhZC9QMW01aXduQWx3emloZzRMaUlCd2pnTFF0aHUyWUtaazF1ZmhKdVZEYWRQSEFXeUJER1Z0QzhMbnF5MDBGbkJqQ3gzRy8xc1lqQTJ2TFV3bVJ2eGI4bGdRbkIyWUFHQzk2TjdDQk9ER21HdGVHNEFnRzhic1pZTmlIMnZnS0tNY1BXcmtTSkZSQ1lJb0loNENCS3lWSWc1b2xBc3ZSY0NrRUZ5VEFqcHFIMWVVWkpFandLQVZMbHRMdFNZQ0tobUpsMmRCSXVGM1dTbHl0VmlMaURDS1RGSlY0R1ZjTEtVRU1aSkxYcXB6VGNrdGErZHFwcFVGZHNCSjZDdWtCUG5sbk1PRUVYSFhuQVFCR2lkc3FKMU5OYUVZY3FTd3hqa1REQ0xsUFZVaDZnK2pKaHVhVElZaWkzYXRMQjlLaHRYaUpRSTdpVXUxWWhwNHFIRFoydjJjeTdJNHlTeURWRlVOR0lnMXJ0M3d3bldmR1RCL2V6aTVhYUk0dlpodjdEei9DNlBQdisvdkk0eWZ4emErSDhLUkJ6SDRrQWJ1c3JYK2V4TnZ0NjMxWGpWNHVUNHl1aTlaUEYyMjhYZ2hPaTVDKzJVVmQyZWk5V0NEbG9NTHJrOXZOQjFPYWp5ODBYQ1E2bzlVZHhScWp4MU85bExObnZRN3F0NDFIV3huN0c4RjdaWXExeWJzckgrbzExUWhXdm5HSzl1VVJ5amRWS3l0cUdUcDA1UkxUN0VnVGI3d1pBdTlRTHJvc0RMSFgxYmlPUlhQdHkzT1hWaVlPc3hQVkRDai9KbVVOMUx1S09VTUpHeC9DRnJpOThUckwzRTc0cHdaa2hxdUxyRXFZbFkvR05XTS9wcm9EZEVhS2F1T29yc2tha0dVbk1nSmtaSkx4RXdpWklSUEtlUGVSTG5ZcTFRY2tjMDBwWkl6a2hHN2RXcXV0aU9uWnJFUk1iM05Palhhb29oWURRZ0hlNFdDRmdTdEZPSVhnbjFGK0VJVzgxUnAwY0VEOGpkM2NEbFNjRHFjY0pqSk8yckZaSkF6Ti8rMnBIclVtNnhsTTM4c3FzUDFmS2ZJamM1MzVqdnk3YUxXWTFlVTJldnh6ZC9Rdk1FLzJzemhqZjF6M2FoMTJDT3EyWkVQZXdQK092em1mOWcvdGltZzgwNUFBNXVnZC9vUjg0MHdXWXBhc0JXVjdBVS8rUnVhTnVTUGFlYUkyVkZIV1ppY2k4R25XY0dVYytNTlk3aTFSTDkwS3pxZjlyMTZ1VGM2VzdEVkV6clhBUFlsUXQ2cE1PbS91TzJoUGdEc0dNcldvMHplYVFIV0F2NnBOTVdkSGRCc2xzZHFBTUUvZC9KN1A3Q0NEV3pJRndYVjhVd3V3Q2U4VWl4Smc1MGtJUnYyUk04WVlra3k3bHFESmVHdDJBb0EpIGZvcm1hdCgnd29mZjInKTtcXG4gIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzFDODAtMUM4OCwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUYsIFUrRkUyRS1GRTJGO1xcbn1cXG4vKiBvcGVuLXNhbnMtY3lyaWxsaWMtNDAwLWl0YWxpYyovXFxuQGZvbnQtZmFjZSB7XFxuICBmb250LWZhbWlseTogJ09wZW4gU2Fucyc7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBmb250LWRpc3BsYXk6IHN3YXA7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgc3JjOiB1cmwoZGF0YTpmb250L3dvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFDMGNBQklBQUFBQVVyQUFBQ3k0QUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHajRiSUJ5QklnWmdQMU5VUVZSYUFJRUNDSUk0Q1o4VUVSQUs2V3pkSHd1Q0pBQUJOZ0lrQTRSRUJDQUZoRndISUF5R0Zoc0dTaFhzbUNFZUJ5RG1UVndVd2NZQnRQSHFCZjkvT09ER1VPakR0QXNtaVUwbEVrVlJRa1U3bCtwTGxHUXdMWk14T0xDTGhkTUlaeTNiUlkxUVFUdUhVM1B0cXgzMG5VUkdmeDBoYUJRS3R0QTFIUXNtRmtGV3FLbFhLK2hEbXk5VzBYeHpUMzZiSjhpcm1KVnJJbnlBT1VKam4rVDZuenF5OTcvQU11ekdTNnlOSStVQUExUnB6bUZ5Z05FSDVPUHVPbXdabW82bzZIYjZBdy9BdkpvOGhyR2JtbGlvNlhNcUYxWmh6WmlZdFY2STJlUlVuSEZPeGNaRmNhN1RSN240eUQ2ZS85ejd2NVZrSnhkWG1zZVoxb1dxelNFY3dqZGpFSTd4Q1BNMVF0TWY5eEN0dGhRM0pVYnZoUkEvaU45cnExUXZZUjhhWkNpOUNqVnpNZkFBR21aWTZqVklRL2N1TW5HSTVTejVNdmFHcHRoUmFCOStmNzRpM0lhek41cnBDeXpscGJ5WXIvOXBNM2ZiLzZUZGNFVnRvMWovTE5rNndvNWtLOWp1dFFtYm9Bd3dtV1pjWjlETkNoVWtDVVFNYUlDS2N4ck9oRGNmcHArMkgxZVRaV2w3dzNhWGExVW5IWm9PYm1acEZuaVdqa2llY2FlL1hzZ1c2dXkvSXAvUFZMT2R4WkRpa3BlSWl6eG5Yb1RzWEhTaUhFTlIrYm1wZHY3TWNIWm1Gc0JnQ1ZwWUtKRUFyVWRRQ1JDcEFDaGhGVjUyU0trTXNTTjVFZUk1eHlxbjZseUYzTGtvM1JUdWl4UTZ1M1RSVlg0c0RZczQ0azBKUVVET2p2bnFtMlJtL0JvSnZzMkpGU3RpOS81L1hQWHdtMk5QNHl6ZDlDbVZZWGNoQ0l4T05QbythWFdKQW9xZGJtZlpKL1hwbDRobnA0VzNtUGVYMkFHOUVveUNzVnQ4Z2NZRnVFQkNGZTFMb0doWGI5ZkE2ZFlSRDVvYnFnRFJUeHFrYWdEbHFiU2lBVVplbG10cjB2eWI1elZYOHhFQXI3dHNMQUxnZno4bFlVVEVlYWZlU0tvQW9HcTg5WlNwN1F3TmpYckc2Lzdjdm1ESXNCR2pCdGhCWXlNdW5qSVNHbzZTM2NZNEFXcDJkdXNETTdCaXV0T1hUK3lITklPTUN3eDZMTHZKSk5wMUJEQjV6Z3ovM3pBTS85OEhZM3BqZlFOeStkd0JnT1ZvMEpvQWJTOW9lNEQ5MVlkYWhSM2tYSDJpME5vQitDOTFKdXdjSFd6b0Z1TG12aWhBSlFBRWs0YUQybGlOdndWWXNoUEU1UVZUQ3BaZzFoRm5rbjVleW51dkpVQm1qaDZPekxCU25OS001OHg1My9ZbHVrY2U2TzRMVXBLeG5QNkFEazhlUWc2TkIrUWg1WUFBK0dmcW43MFAxSHFxdVREQjhzOHdNaTF2Ym1xSDcvcCtRdUlOMEg1dHZvWFR1Mi85cjJzZnFmSU5RQzIxRktmNUVxS1dyQk52YW5oTkc0Tkd2ME8yNU5ZU3k4WU10Tlp1aHoyaVNyMU5Pc3l5YW1aenhEQ3p2OWVFUWRhMnA3YzVBWUxlQktIa3NQa05RaTVyWU80MVpzYUNOU2UwNkRIcWZHOVhIZldJVkkxbWJRWk1rOUZyZHkwMXpHTE9FcXRqTmVrM2pzRU96Nm9mSnowUnNIb0xyYk9NdWcyRWxqOWlrYzE5UDlFZTQxMkdSWmVhYVU1MkpHaE5lc1ZrMHB6M0IrbjRCQUo2MTYzUlV1bDlZWUMwb1NsSHBnOVA5ZmFZdTdzNk85cmJUTVpXUTB0elU2TmVwOVUwMU5mVjFsUlhxVlZLaFZ3bXJaUlVsSmVWaWt1S1JVV0ZRZ0dmeCtVVXNKZ01PbzFLSVpPSWhFZzR5NThmSFQ2UXBUUXB1YjQrZXJDaVVwSyszUEdEMDZ1aFMwUWZDOVpaUWhnNjB4KzVaa01iNHpVYkJFalg3TGZFbFJ5Y0VQcVFWdUVZK3J4dXFEL20vckJ3MUpSOW1Ta25UVkJGSzk2bVNLUUNMbHVDcGJaMUwra3lOYVBMdTNKaHhiUWxtWUQxMGh4S0VFNnZCNTNvUkc5Vi9sUmhuZldNQTVZTnUzV2tMUm1jVEU1Qy9iNHFXeXFqTnJpa01sY0x1bjA1NTVKeVcrRmd3OFozUW5Xd1E3dGdYR0l1ZjQ1OVVBRjJTUVR0ZURGd01nbmF4eHJQamh3dnYxL0xKQnZ5dm14dk11dG5pVTIxa2hpMVZHUS9iRWdoZTI1VDRjcGN3ZjZ3MmYzTXhHV28rVFRERTZqRTBwQmhkQVhvek5oUnRTcGJOY3FZS2EvTHNFSnJLd2M0MUErV2hGOXF5S1ZQNk9Nb1Y1anh6T0Z4bnl3RUxrLzJtYjY2L3g3UFpQSjVsMkFDbnFJV0oyelF1UjRmcVhBUURzTUpkL0JJb2lIOWMxNzBhNEtLQ2I5azFFRnpVdFBSMUpkVWZ4U1owS1hFL09qTHF6RkdhLzR6eE9nV0dQcEJPT0NrTFF2WmYwdmhmc2x3U2lNdDVqUzEydHVwVnBxSjExcjI3NEJXd0c1S3FCYTg1bTRpTkdFTllleDRwb00yZm5TK3NRTkJOa1dPMS81eit0UjdYYzQxVTU3WCsxSU9pNURqbnJZdzdkL3p3WXJ2d2VNcW5OL0ZOZ2pYWFhJcldLY1owbzI2TzZzc1o1VERBeUYyTlVkNVM1WUdoNG1sUS8vN3d4WXVrWFRaUS9Vd0VldnN3NlJZMTVBV05ZWkxINmxIR1UyaURhQis5TC9BVFc3Uzg4L2tJQytJRUFidXFkNzRDTHRFNEFoWjFIU1NxQm5qbjgrcUZXb21yTFdOYXFVL1RPRk5PN2h3Q3FHN2tUU0xhVzdIeDJXODdkWXdtbzNRdkd6UmFIak9zSW51dytEWHdUblk5QkNyZVRxN2hDT3RITzFEU0VmQUpyNktpNEwzNDVrVVRySkR2T0t4UytHeDdLZGwxTFQwV3FvbDhsT05haVViaVRwcE4wdEpNQno3aVZ0dVRndExxeGFCRndPSTBpUCtudlpwcVRmdVZCbHpUeTF2VTJySVNtNnVuSGdOWXpsQWxDTm5hT1Y5cDRUMS96K09sWHBOcWhPRVU3Sko4bnU5L2NReTZ5OUFQandLQThkTTYzVTBRTHBiSEdKUENnNHpPS0Z4eWx2YTVTTHFBeVEyNTd2YzRFSzhObWxyZFZHdEQ4WWtaWFFJc29uWDI1ZmNRaHNQNlQ5U2tNQUxNcE9WeHVmREdTc2FxWFZYMnV3TTJNMnJIZlY2Q3A1Q1VNa0daelQzVkpVMjBjdVFmcVBCc3FxRHdpMCtpYkpwaDhGT2FtaEVtOTFDWmMxR3hKajErR0tEWUVLdkhyREpBU1BTRlBJaFZZcHVMYlVSbElmMjNUT2VIZWNzeHpWczBCdGFnQXhtandRbFNKM1ZUVGJld0Nvd2hRTnJKV1BSZU8rWFVrVEM3bUNoM0JYcEZudEh0bDlpZDY3TU43U2NCY3VHY21yUm1ydW9SVGpEZEF2bjc0R1lNQmc3eU9IMXd6eE8yN1I3MzQySW9ueldUaG95Zms4Q05qcXNwelZSaWQvd3ZKTHd3RzBUbkZDampZVmJCYU96QStoY044UkppSTJXRXBMVmJxN3lVbzdwaXNqckVVd1hoZkcxakJtM202WlN1ZFYxbXBHWUdIZkdRckFPRmxTWTE3aHM5TUY0d1V0RWRING1xS0F5VHd3WlpVTW5CSmcxaXpnV01STUVRRFZFZm0zU1pYc2p6VUljdUFnUVpsaWpFSnhjaFpVYlpvN1BNeHVYZ0VIVk02bnR6aVUxYkpQU1JyYURCY3NTVzZBZUNzVU5aWHNEUWR6a0V3d2JoZnMrT21YOGtjUGtXTFRpenU5bDhvUm8yWU9USFY0NjJpNmNNV3oyOWRUamhaR3d5Y3JCSlViZm94djFzZ1FURHFHc3hhb0ZCUlgwSzFvdE9obVpVaFpVU3VCcjFkUEJQek15VTl4K2tIalh4QlI5U1AxSnFTay9QV2tPOGxnT3F3TzdkZUNBQmZxK0JVNHhjWVV0TmxkUzFMek5ibmRreC90T29FeGV0Y0dNRmlnVm1LdXhXWWdRTllhbEtBUU81VUtzbG9ZV3lqTWZjRDhIR3FPVUdKdldUVnp3clBScytJT3ZhSHVsb3Q2NmxYdGJHblNQNG9uWWpxVkpjZFcwK3l4U2s4eGYwVnV2SW5GM0VGRll5ekdhdTJXQjlTWllNOElmOGNUTktKK3VYOGtkRzNRZXNYLzZPTHYySXFLdFpzYXpXcll2N1JkY3doa284WXU2cEpOU0VLUW90UyttOWFyRDI3UUtFVkVza1F6MWRQWlhha2lNOGdoVVJSYUtBNy9Ja3RIckV1RktFN2N6c3V1UmVNb2gzRjFjcC8weEl0bkpJdU1Ga2M4b3dwdWtTZDhEZ0syWFFGQ256QmVJU2dZcXVHM3RyNEkwcG9QaHRBZWo5cFRJelM2ZXRqRW85OFZjVWlJdHJ6RjRSNW5ZRStiZGduTGYvSnQ3Z0VZYUF6SDBEQ0NlbTU2SHlYOG15YzdqTXZvOU9kSi83TWhWZHVLK0FXTEp2MkR1VVZWNTgycTBDNkdWaC9ya1dYdmlOZDlzc243aXMyamROOUd6Q0ZsbVJid3Y5Q1UyVW9oMW51d1NhZlpQVGV3U2YyZkM1MHZjSDEyU2x4Z1hqblBLN3F2N0JrUzUvTC9SNUFqU3VXbm5IUS9hVjdaZk1mTVdQd1JOKzdWbElwYnlLNWFBejdzSzJvK24zU3haTEk5dFo0TDJ6RXhnMXJJMDdGaEV4d2szcThhUS9wOVplRlQwVVZGL3RKN2wxKytuTXlTbkUxU1VPTWFmRzB4YVN1emhMOHk4aFdIcExXZDNnTmF5NWlVdmpTV20rRmRWbnJrV3FBaVJSM0E2ZVpyNkFCOFpPNVVIU0hZNzVFUGFYN2JITEJ2OUE0OTdWOUZUa00rZzN2K2o4TDBTN2V5aXpuNGw4TlFYQUlWQmJDWnRhSlZkc29NTm13d3E1YSswQy8wa2dSQVlsdm5oaUErNWxuVUFBa1NBZlZreW9Cbjh5NG1RN3NOdjN4LzMyLzZnZUVMV2ZEcFpBaGsrV2V3OHFUQ0puMUVTVkJuR2x5VjZzUkFNVkQ0bVVnREJ3MEl0WkIwdlNxV0FGcmdvUVNtVHBxZjNaNGZseUJZVkFrNVJVWlJOb1M0R2Z4SmRxQ1hhaHFEcVZLbUVubDBJWFR1cXNJbzF2cTZrc0dLL3hLc1E0MFVaTnlVNlg1Wm9UTE5RcUxqNkxORjZpZWVoRkppOFN2NjBWQlQxdzV5RWg1UDRkSWoyWTl5UnY5MmVQakZjOGQ2b3ppMmZ3WS9qQ1M5NDJYZXVWYVZvcG52N2ZHMTdSTmtDU3BRWHZDSHpveEdmQmdNdWd0d2Z2ZzJvcjZKbzVZRHo2ZER4bnQzRkVaQTA5bTRyaXdVM045MGJndG5Ja0tlK2xySUJKSUI2YUhXQ1NHaHhDNmxLbUJJYlNDSFlySU1uSjdMa1BIZnhrV3FFN25JRWhWMmJ3YTlEaVliUzZjSjRjSERpbFRKVjFETFhxMk1aOStwLyt3dGYxYmY0Ky8yd0I4b0ZPZWx0KzNlK0JTVHJEQ1p6Ni9ueEY1MFljTy93a1pWMElRUk44b2EzOTlBakNIMVFDVTloSFlVTmJLOVJjVFc4REUvRngyaGFOOFpGNWJZQkF2bkFnOUR3cE9tMWZSY0kyZ0xTUEp2SjZxbGFHRFpEalQ0UEtPMFU1Q3llNWxvRlRhM2k0NEtCWUc3SWZ0cGR2UGVnWHl6Qm5ZOFpkeitrNk1DM1FlSGRqR1dicVR1RExMbTZyYytBeTczZHZHb1NiUVBVb2lTYldoVUFDbEdjUmlnTXMyTWYyRE9SS29NZzNwZ0dVRmhaeWtZQit0OXlvR1JXQjk1SVU3YkRIV3dsNklKU01CdXhNbkNqaUprVnJCWW92OGpaeDRqWTIrWUV1b3lDSEpmV2x5WVBiQ0JHWHRveFRQNTI3eXM5K1ZvU1EvektuRVcwc1dRNkFtbG9LS25FOHl5REVLb0huYXJBRHoyYk91Z3B0TWt0dlp6dG53ZzAxQ0oyZk1oVitSQzRoWElIVHZCTEswcUhrVjZYRGNLU1A1WlpycDlXNFdQWWZYVnVxaEpNUUxoM3ViZklmd0lWSUVIZitlS0ZJTFdyTWdjVVFReW1BdzB3aW5pUnNacGlUMXhpalFyU1ptMWlNZ2EzTGhrUjRGTmFGaHo5WGJLS09UbHo3RENlV3RUdVlja2NZSmNlNFdUb0JPNnRZODNCN3UyNGNOMHk0YllqbHc3VDJRZUxmaHB1enIvSzNLZ1NFYUliL3lhMFJTWnh4N3lrWkI4RkZlWUdGb0lZM2liUUIyWXZZRWgxSnZqZUdIZmIyR3dPekxJT2U5QUZ0QXpEVlZ3U09CT281V3V3bWltcjZVRHdtVXFMRFFzZmNWd1Fzbk0ybmtwbE51RTNqVVNuTit2dENFNHlrd1VFZHZQY1lnVFVpd3NyVStrVGdYc3A4bERweWRIcUh0eXpLd09VQkk5T0plSnBNQ1FjQzBkVlMrRUt6a00zVkNKUHJ4OEFYSHdHaWJod0xYQnlVY1pUV29zQ3VVWFNFdVhteVJ3d21SVk5VN3BtNG5Eekl1L0Y2Ymx2NUZuMzByRS9WY2FhNDJVZkkzU0FxQm5NdkErTCt4bHo5MG9LQThiM3k2YW8zc2VqN2ttZlVORmFTT3hhSHhDVElScVYwWTdUZ3dIZHZucjNSN0tIT3I3OEFJVHphUHp6RGxjZVFsRkhKUUZ4TmhUQ1JzYXhHbk9hQjdlYmhKZE02dUdwTWVJQ1dhcFkvQ1E4UldiTXc3L3ZaTTlqeWEydTByZ2tMeHFQRnB5YWI5MDk1ZnBRRFc0US9Vem5Na25FaWtybGFpa3FmaWVrSjIxSm50OCt1cmd4QS9UQ3ZFbkRYdFlLTjBLbi9PbFBwMzRLYjc2Wmh2SWJYVytQWTZHbnlhOVNkWUNmY3ZvOXlmbk1OVzhSQ0MwdjNuU0pjQjM0eG1NeHlDTnRJMWo1MUpFUFVBVTJ4UnRJTi95V3lhMm5wWTcyWmNHRVE2eEdGNmFkVW44TzZING5uVVNIRjFGanVNaHNSeitiWU5MVFhxdGNUd3JOTHU0T3hETUJ2ZlhzVS9DWDBzcDdnVWc0YWVqWlBwcDJISWQ4VFdnMERwclFNQnkzRUdwRXRuU2x0dHNQRFNOVXJnd09RZmlEV3FwOGR0cFRLVW9CYnRZQTIrc0dsNjRsYzRNTElERlZlYXJsOHJldlB5NlY0QmxEQm42S2NEeFVUNERSU1FUUFp5KzE4NENVdWs2bWRVZDhJTkwxbFBpSm8zSFlXM2pZSCtWTXlaYXNPRURTNU05VWl6Nm84cnRyRW4xMnpyaE43dGd5WHYvcmo5Yzdpc01SWEdleTUyazd2RE9jeXJMR2NxRjhDRytucGU4R1FUcmVVRmx3MkZJbTJlOHFEVFJiV3FiR0gvMG5YWE1ZYzlkdkVFVDlVbVd2ZWZiSDRLRy95K2N5UzFyRWxSM0tpZWZ3V2NqcTU3Mkd2MC8wNVlGTVAxNjk5Szk2WG5FY1JZM0VEaTBNUkJZYWJnc1B6WlE5VFBoWWUrUFcreWNFSzBnYTFFSVBYRU40S1Y3OE0vaGtkdVZULzZBSnFDWW9SeXBCaFZyclpuZk5YRmVOOVRGbEd6czlPN1pBK1JEZGpyVzhKKzdyN1FsY0Q2WGorSjhVWUJSYWxrU3VCbHVHOFJ1YjdaZURlalMyRFpvN2QvbEg3d2ZYN3FzdVVYZXVPa0NjZG82Nk93eUJDNUNqUWZxTGpuRk9ubWFnRk9TU3Z0L2tQK0tCY1lkTUJwNkduUDV4c1BubENXUHNWN3pYVE1kWGpmZnl0Yjk3SjNnMm96NW52dHA0Zk5GNEg5OWc0WTluNmRWRjR6a240VGVsRDY2OForTlBwRGNyaWtmelRpSnVLN3Q1VjFlbE0vcVBDbm4yZW9sZ1U5UE11cnpZOFMxMmJySVpQZjNxV044dHVtS2gyVFJjTjI3MU0wS3FWK0Y0aE8ySHplUTZ2QkZlZ1V0WGtyTVNpNnE1d2dScWJGTUZ2cnRVUnAzclZoMVBMZGRzeGpFaTBLUEd1UVIrWGhXaUFCTlhoc1lrOE1SNGZLUXdxVmRHN1pIVjBOYUdxMjZtQm1XQnBZaHArT1R6NE1scHNBNEJxUXJ2Y25JNmZleHh4cldNaXpFWC9QNDkrN1RqaTQ0QWhPVVpYMUJMcVNmN25QM3BnREpOZWh5NmZ4QlNhT2FSYmMzTmlSK1VYTzhlWFdlV1VhclNTRVZZWU42Wk5sQTN5Uno4cHN0ampiSWY0OTlQbjZwcnVnRnYraHRZRVNPdk1vbHhPcXhZajVzTE8xK3VLZEZIL1FWcDJTbXVQTmVyUzl3clB6ZlllNWFpSWc0RjlNVVBUdFRETVNLTFNMV1M4WG9qTDZ1bERzTWt0Nk5laktpSFFyMStoQmpPVklndmRKaHBnTkhYSGhsTWgyZDc5QnphNElMczUzUnJCRGdHMHQxbWFXY094ZExDUnNuSXllZ1lnMy83MjdFZE1uNDZsY2pBbTdsVnk5Qk1rSVZrd3krTCsyY3VrWXdZNUdaSWVPelZxQ3djM3F2M20zQ01tMks0L3dreUJoTWJYd2pDZW1rL1dQZTY4NE8zaERiZXhnaE8vUldWTzQyY3FPYmpJZkwrMlBSQjN3UW1TVlU5Skw2MjBleXEyZGRhMnpCQzVyZjE5M2NkQUhLT0RTOXVUSndaY3NIQWNFUTZOYVUrUTZYbG5ZRTJxbjYzanA4Y2RzSDZFekVzYWtwRG1ycXg4R0pBcC9UanVDVFFObjBDK29ZOVI2VWFJWW1FUmpTdVJSRHZVYUlkbno4enNUVjBLb2hBSlZMSXk1TCtkOEtQeXo0Ty9OUFRkRTVXZHFWREVmZW9jTHQ3NEFSRDNiNHRyM2ExVXhiN1VQamZzWlBNaXY3YzJpUlJCWFlrN0Z3MUpxNVp5dUFSOUJrbFN2Um95TEhTcnJZeHI1aXZ2SDlQN0F0NGE5OTNkWXFlUEZhUm1VdXh0dXJqM3krODFqbG1ZMG5wTmFtVVFvNXJzcGUrVi9MT2JDbEJpeTl1UWk4aXQwcTB4YnJpaFBKNEVaZXB5UnhFenJLVktsTlVMcVJ5Q21XY1lhNms4WGwxY2VtczFCZ0dPeXMvZ2hhdEZLUXFDR0pSdjVWYUo3SEZQa25wVGpkSENjVTFQSEtFVzBFbUlTSWZWY05HcXhocXFlVUtMYWdUd2pIa1lKdUVzZTdzMXJHbERjdFdpd3MyZ0VoaXNLaHIwcUhuWVNlbEg2MkJ1a245QVcrNmN0U3FZVkl3OWQyazd5QWJwK2JwOHpjZkJ2d1hlL1Q2bG5ncklPUGJnNDhmOUZveHdIQzJUcDVXU2VzRGR2TTJxSW11R0xjcHA1NW81OWZTV3ZONmgwbUtzekdmT2FkSTZucjZjUUhwYjN1RlBrUEZKdWNub1FwRFU5KzNoRDlFeFNibEp3YnV0L2RMdmVZT3V2TU1TdVFwMlRXN1Y3MUZGRmFSVU1ScTNaL3B0ZmJpU0pEUmdycGtqYndrRHpSVzd1ZUVEQWZVbUYyNVN2VUlTY1EzNUdHTUpSSHVqSVdCRWR2bzh1eW9QNVZhd0NLdnk0YWVoWjBvZXpNS1ZQa2lzQWNaMk9NZS9SMWZ3aWJSWUNrQzFLZS9TbzJqWUI1aXF2eTc3QlVMU2ZodzJIVzNwdnJlc0puMXNlMm9rMlRiS1hUclJOalc0TDRuNnBxYmd6cktSeXNYbkJ1dU9DVjhXRklMZkRPcUZiQkRhZXpNUENHVlVrZUc2QjZPQnVmenpDWno1a2xwQ2JGdmlDNTNRTGduMW5sSDB6MVNKL3R3YnFIRW91UVVxUWZaazFQZ2dvUHpwV3hWMk53WG0yQXpBZytmSElWUHJnaVh3VHRiTXhPaCswcjFZSjVmVTluOE5BMEpuSVVjLzJ4UTg2K3RMOWZEOU5QVlMvK3BGMlVuVUpSSTdOQjhmNVN3NFJKdHRGZHlObENtQ1pyVUY5aVRJenA1RjFiTGRWazFJRlVnd3NKUkJ6UjZRTjMxMGUrbFcxSkxnbkpMTXpqRHNZYlFDdnJmZEMreUIxdzMyMUd0dDEwWHMxYWtyZXh6MDdyWDA5dG9ZRHlNR3lEQmZJZi9uZkFwWEJUZnFieCtXSjdzdGJFb0drU0ptUWxOQmNiaFN0TUUzSDB0RzEzcXZHNDEyNy9aZXIyMFlGWGF5aEUxYTJLTWIrV05peWVValM4MXJ4TjRJMVhHSVVud1pVSy9BT3NXKzlrTjJqbzJQUlBpeGw0UVdJK1duRFM3VU9CQ0dVc2RNdmRGTUJDNGFXQWJiQkRlempHd0dYRUV6RU5zU0kwVnBzRkh3TU5QdHRReUt2Ym1UUGRYWmRudGFXM244Ykc3clZZQ2Q2VEt4TS9mSmVpbW9SYWlLRzY3amo5UjBWc2NmcGdGNXNITzEwT1dtWVpETE1OZkVMS24xdXdSMnRSNmNCWm5SY0VxVHI1VVA5aVJYNWk0c0RwKzY1c3VQRng2MGZ6c2l2clp6TE9WSTgrR25pRjZJUHJyRWV6SUZWTDAwOHc2K1ZSQ0JmK0FCdGQrVkQvL2VsRC9YZVdsYkYxZmc4SW9WWlZ0WVhtcCtjM3kvT2ZFWWQwNlMzaW9RaVZhM1ZEWCt6cXkzSTBNa2xsY1NsNmJhSG1lajE2dlpUY084eUo4TkxoandqR0xlLzIyc3ZLaUc0NER3c0JHZ3RvdkoyUlozZ2dBT3ZrWGJlck9yVHV2ZlBUMCtidTNudXhONzBIWGN2WVZpRzduNk8wMllEMCt6TVNMcWJmVGI2U2VnWkxXNzh2bXN3NkpGNE0zMXc5d2ZXUFRpNUhzZkpZeWxnamgraDI5dUhEWlIrRE5VeDFPci9OZHZYMDkrZzZiM1hOa3pVb056TG5aV21CNHZpOUtzQTZLOW1mVDFnRHh3N1lKQ2JEZGpDYjVDSnJjV2hnRkpNNVcyVzJvL3VzRllueVpRclpNL2pDeEFEYTVleFFuL0xoaUxwUEMvTFJ2TWhzVWgwbkFyVXhEeFdzQXRxd1V0cG54ZzdxcGVramc5M2liQ0FwODh1ZXU2a08yNitLQ1ZWa3JaNnV2V3hnN2I3Qk5uSUlpRlpnZmI4eDJROHphTWpkMnJqaFk3MjZrMG5qOGcyMUc4NEY4anpWcHUzNkhwYkdMSmQ0Qk12eXRkOGF2Q2lKYmkyQ2kxcFRxNkNaLzhzcm4vU1AvQkcwMndTYlZEZ0hCZXZyMnZLeXhZamFDNEI4OVNBNjhFOWV3OUhsYjYyOW5MQ20rRFQrZU8vZS9GRW8vN1gzcGt4bTUvV3lZZlg0SWRmejBodkwvd2FyQncvb2F2ejUxNnFQeWdVOWRZaUV0RVovVFh0VWNtekhkeUsrMkNFWno2K3M0azJtbkFpNkxkODgrWFdRUHBtc1V3dEhzay9EYlNqMyt4dUU2Sk5WaGxoM2RNTjNWTGpoenBQcCtZcjBKa3JKenJLUGl1OWNxTW41WmJVeTRVREFBa3hNejlJTDZ3WUhncnlER0U4ckNYVXN4OGl2eUgvcVBySnMxWWVLaFVHdklYQUFQMG9kM3ZZemNpWDZIRTl6WExiOGIwc25LSkY1dk5NajcrZmcxblNIek84T051dzJ0L1pSYUxMMG1vZGRuTU1ja2FoVFJCd2cxQ3V5VWUyMmlPRzVFemtTQklKYkxOWVVQKzdRSGQ4dU9EaG0yY2RXYXhWeDJVeUdMMkdBaXNiMGNTM3kwQ2pXTk0zZGRNZFZickV0UEswbEpTU1BvUWt0ZGdSNWVTNk1UaGwrZWhiVndhUkV6ankrVVMrWjU2aVg0SUtSMExxMmtxWXlabzFGd3UzTHovWG1JdGp3OEl5TVZoeE1Vek1UK0c5ZWREOTFPcmhmMUo5R3JoWVEwWlJtckpSdm5YeGJXanliemNQa1ZUSG1HeWxjVzhmc0VIcjRhRS9BSW9sK1VzTFlheTZKdWNJNjFtSmRvbFp6YVJES24xTmtyM1BQLzN0OUhValQrYjBXMStoMEpKVnN1anhiNlA1SEQzc3Q3S3JuUk4zR2FLeHJNVTJjV0tvbERTZXVld3YzWWZIVTVHcHVwVEJHV1k4eGh5Nks2OGtra0R4TDB4NVIvYjFpYVAwV2ZYNmpMdGdRdk00eWxjMm9ZZjJmZ0RnRVlkdUxFaTNzUWYvQkc1WXNqMGhmTFlBN3RoT0hRcVNKZENNYlpIOWJMazBJcHVueUJMc01TdEVRM0ZpMVVoK3l6RG1pSXdQQ0dtWEw2SmJNZkxHSlQ5dlcwNHVzVlNBbDcyelJ4V3BDVUNpbXlocHRtR2RaMGxhQWptVlNPcFJVV3RSNkNEMG9KWnBpQXkwSUxxQUp5WndnekpLR05IYkVXclpLT1pGRWJDaWhabW5wYUFkaFI0Rk9tS1ZYSWwzZEZjR0FtcUp1MFZ1ZnA3dmxHVkpBdStyNDBwRDRFT2dTOXNEWDJ0aE1ra1g0QUs4ZmFVSTN4ZmZ5SFZaMXplVHFjQVp3RHFremM4SEM0K2thM3Y2Q0tJYnlWZFRLMmszMjN1THNWNjVNTjBoS2U3bHZWT2NKKzBYMEY0aEttK3dmQXBOQkRMeDNwRTF1M1M1TFZXUjQ0NTBudTZnbThxUDFCZjEzODJMZjhzUlZVU2RxUS9laXIrQkZxK2tieXJNbnptTGJvVHAvMDRIWEorcVRwSHRuZ1VISjVwdVR5V2I5WFAzbEZsWEpIWVR0c3VrUFFBeVF2ZktWdUhHNnQ0MktKekpLd1hTTFBIYW1tZmVBc2NoaENTNVI1M2NIalJFVnVmeldGNkJTVytIb0xTLzJRNXkyeXc3ancxWXBobklocnlNR2RhYjR0Z2FGT013TUJZZXBJc0FCZjgzZndFamJQZ3hUVy9mRSt2YnJRbk13cWFzbk5OUlNoUE1vN1V2KzFwUUszZ1VRRWo0MGowV2JabmZmRFQvZzNXa0VXVW1BenBLMS9zUE9BTzd0MWVHSHowSmxXNElWekgrSzByTzExNUtLNnRrMmNHV3FEa2pHTVBKcGVwUmRlK3Z4OFpBT3RrZm9DM2dRbVZhck1KRUdXSURRYml5d2l1TFRXMWcrVFE0Vm5XaGpxaHp4ZkVRRGpIQ1pWOXVUek5TMW1sd2FYVnhNSnRBNFZHQy9ZYWhraFRFdmJNMHZ2Y0d0Z0g4YVBncUdUcnpjZ3pxblNCZWVIYWdxSE50K3Evd3MxQmFtZEozQUhsYkdncW9YeUIwV3dFY0RtUTFlZFoxYkRGSTdjVVN3cDJyZ2k2K25GbElUdUJyTmlzK0tKWlVocW1zSWRlaG5JUUJRVnk2SHZiN2wwanNDcEdBVWJSeTlvZzJkTzNRU1cwbDRzRlcxZWxuNGg0dmM3aUJtWGZZQllpaUNuS3R6L2VueEVSNVlVVitvMElPMzEvNjlDOEZjUTdRcUJNNlNNQTZrV1RJSU41WWVGUms5YzYyRXlvWU12S2QrNEt6UDM0aVVoNkJ3WUt5NHhpbHdXeWNibzNhRVBYVmtJbnFqS0R3Smg5OElLSmk4WUVLVEtJMEtwRmFMNUtHam9iUmRIRjBWNlR4MldpOVBEQ3hQYUxsa2l5d2EyVk1LN3ZTclVZODdKYnZNRkNqUUg0WFhqMXJjWEFpQWVMb29mYlI3Ni8vTkwyeFZuT2hwbnN2Z2R4NnA0VjF2Vk1VOTRaMDI5VnBxb1AwdVJ3cFBtakNLM2xQcjZDU1doSHMycnl4Z1BXdWNaYXFlUkFkQ2UyK2FWUXg1aGpJTmtHRnFjeENCa0FYby9qeEpabVVGUE4xYUpGaE5rY3lBdGFWMjgwMGZnUldmekVkaHdCcmxla25XWmRaN1I4Q3RaRlpkUmlDazFVcER1MEcvQzBXNU5velBIa05HWXVQaENEeXp3ZHNqUUtYOHloY21pckVzSG5vYWRGRisxZVdsZlRKMTVmMThxL05RZ01yTExsK0ZhcUZRTVkwVUNReTZtdFFUbHhwd0QzZzcxcnFDUHR6RU9BUCtDR0hhS0pUdTkwcGhkNGFXKzhZdGMvZCs3VDU0elRxdVpSdFE5Und5OUUra1pTRXN4MUpINXJDYlVOOE90UTZGUTk3elh2RmVhZVB3dVNwK3NlSU54SWpydlZ0YXA2RTdXWFhHM0Fjc1BlTEExMWlWSUhyK2RtSGJtdmNyZWNYeDFicU4zYTltREtLMW5sbWJTcDhhSUwxTzZ1ODVFNGR1OUEvTFRnRG5qZ0lUYXU3SWZOMEhicFBXeXgzY3JIdHZrSC82bDljd096Wnlyc3Q1ZXJKZ0czYTBVU1VsVisxZGMzeW9MUytSeFFPQS9tR1dPN3JIMWZUR280aFhrdVdDNTdOeW9sYktiU1dBcHpDdHhmWFRUK055TjBpdHo3cmNmZVdWQnBEdFhmUzEzTi8zTUFYMVgzRUx6cHRmKzhaNzMvZlg1VzJBRnBOYW5kaFg0UzhKdmdUMXZCL2NzZ0pzNngwek1tRWxlVXh1QjIyaWVNbVFnUnVoZDNieWkyaFI2OGtHaG56S0ZoZWJna3FqSmlRSi9aUW9Ud3d1SnRUeXJIY2hDVjVQQmhLaERCNkpCT1N4Q2FZV1I2VjIxdUY5Y1ByQkIyUThFQW9IcHRFcHYySlJmczJmbzJPYk9sOTk5ZVIwbG1iUWdFVlBCNUVyNDZEZTAyajhDakwrN2Nna2JoTlI5K1o1WEhHZ3VjTEw0WEJRSmszMFc1VTBBQkJqdGFiV2gvN3QvaUgwK2daei81Tkh0OGVxUEhzOE5SZUlQMW5YekJNTDZPZUtya1QvNm05emNSN3Jjdi9VOUZ5RW41SWJHNDBySnBGaFJXbmNuY1ZuUlFuMHlOSG1UcmVrWG1uRkZ1cmpEM0ZybHZEaTFEWDYycmZpS3FkVjB5QWZZL0kxa0krTGtUTDR5b3NuZkFXUSthelVqeC9jelRvNDEyc3g3YjVYbXdCTDFpSDFnOFEycWkzOS9iM1NOYnhUSTZOVnA1RUtjSytiTFhVL0xlL2pocnF2MzV4bmxDV1h4SWg1RG16V0luQ2xRVlJqckNEcDhjVE5tWWZwMnNVYWtqd0FDN2Q0NkN1cjVWdmU0MkVkd0JDZ0NqR0sxV3BFaXNtUHR5YkF6SUdYTTA4UUwra1JoQ1RZYTViTlk5azhKbW4vSkU5aVVMQU5xcmVUbU04ajBRMnFvb3JHZExEU2hnbVowT3UyZzAyaVhIUkwzb0VTYlV3UGJ2Nk45ZElEbXRKZU8yR0UyQmNlalIxaWU2OG1LYVhZUTJHNnk3U2RjTXJydjBoNDZuaGR4TFFtbGdaYzhVUWJxdUw2VC9DTEtaMlI2dkErOER1OTRRQzc4clRvSEQvNWhkTTJZd3JaL2lMUmlYVExoSTZ1czlWZDdwS1pIMy9kRi9RN0EzdnNiSVBnOEhvTmthMTJlMnpCd3VZdmJHRlI5bS9ENUdLL3g3TG1UblpqdFc3QmYyOXQ2V25IcVFiOWYvK2RNK21hczRTRTV5TEQvMC82TGZlZWNlZ01RWWtsL0FVUTRxSzdlL1ZSOU96dm43cVM2eE1zL08yNkFuQjY3S0h1ZmVCWnlaYkFzM2c5RTBwU1NGSk5DYVZ6anBQNk9FWWYwMFRRdEVPQlEvU2dSRVVnQ2tBK2xvdDdhZlpPUklnaGkzcW5aVEFEOWRGcXhzblpJOW9kVTV3Qms2a2lTYlR5YWIwaUUwWjhYa250RXJuVWVteC9tOEh2Zmd2M3ZmWXNsZVlIWFZiZ1psakE1Sm1UTEp2bS9JUGdUL2JITEVzK01vMXp5blcwMlhORS94NktFUy82cy9HaXhpOGFBc09jZXVBWnc0MnAyZVhqWkhCMjN4Tk55YVMwNGV2cUZkaGZLVk1Ndkw5c0IveGtoNTZBWlptc3RXRHNINmhnVGdXSVVpY0NzSmRSL2dVTllTLzRmUEJvQVBMaDViWUtEaUp4NVNsaUp1Vkh1VjM1TnRScEtJY0NFZzRMRktMNHJLem56WVpQRmFEQXVxdEpHRnFkOUtUSEswRGFLVzhnS3BVQ1ZzMUI2ejlIVDM1UkJBT0Roczh1Mzl3OVFDOGpVWjVMU2ZnOHRTNld5REhpWnJJbVdyWEh5N0JxK2FWMDVPRVZUbXNxQ0xheU9sREFNYUtqZWRVWmR4WVlEeUE4eDFOTmc3KzhVNHQxZFJXbG9lVEdlcDNlNENMcng1QzlZMUl6QzZaVGFNaEFBbGFhMHZOdTJmYlUyeGxxT2VEWEJ2aSt3S0pOUzg0SmpjOUFsOSswb3V6TEJHSC83eUpSWWg0YXpQS2ZVSldrWGUyYUF3REF5STE4TDNaSlZzY2h2SHlxR2g2WngwczcvZ2Y0V0s1SFozSy9xV2l1SmRINUR3dWMrc0Ywc25NdHRML3poWjhlNmZ6MWZnZkNUL2FESDEvdEVicm9zSm84OFRsUHRRUVA0M0RvZlFRc1M0elNJU1c1MnU4anlURmdMNXNha0haWmhpQ2tUQUZnRTV3SE00WEdYZ2YyeWFzaXNrUHNRVk4wZ1hSWWhPODdCbW5aQVRlQW1kckFBY1QyVVFMcldiaGlQaWpQS2JYZFQrMzRHcFF2dXN1Tlc5U0VtWEZERXBJWE9QZ2MxU0plQnFGRll4NTNXKzNodDlJYVRScGFTaEpDVGE2MmEydjNXSFc0MG1KYmhucVVTbFlFbWl0YVJFTGRseDd6azhNdVpNVXBCTjl5UktwbEF5VDdXRFdvUHlHNkhBT1VOUmVuT3ZlUEdJSUpPSkNxUWd1UDVIQ3YwVEszNDhDNjBZNkpoR2xNb1BpeC9YYVJKeEVnVkRaVS9IakdYeElpd2Y0d0FFVnh4SEtTZEdoTldsQ3Nmam5Rb3hWTjBNODlRemhMU1JUS0lnYXdLZGU1Y1BjVUk0NkxiMzRnaWw4Zk93VW1FS0JyQ1hDakNzR3ZkYnFLSWxLQ05KR05rbzBNV2tBOUJwcG5yM3Q5YkM0YVV3aXg0dHFkbEdFOHc4d1k0cksycjFXUUNubExaRVZadlJHMmE2SXB4WlJhcStBbGFsdVE3ZkhxQ0JDUHJmWFJwT1BmZ05lVEs1MUZSdkh6N0Z0d3ZGc0xxNTNkM3dSUFdLSk40UHNYM2ZaOVBsSklNMDJvdEFjTGxjWlhPZUdZc3ZlNklPR2RTNUdHVENjT0d5WnFrRGk0bFQyRzhzc2dtRTIvaUEvQituaWZlY3Y3aWxzZjFQZUEydTZrKzkyMExBTG54d2l1VXozWEdxdXVpQnRZczhhdHZ6dC9NWjVBbktqQ01ITTJ0TFJESFNEOHo5U1kybnk0eW4yUGRENE8waFlyNFJnOHJYZjdZdE1rWkd1RHorUTN3aFNNbmFDcmpDSmV3bjZKWW9NU2dMd0ZwajF3UVE0Q1JkV0s2YU1MV1FzOHhoTkY2Ukd5ZnFlckh5M0xJcE8rTEFweFRmd054OUc4NXY0bHNOcnpWckxJMnk4YmpZakhudlBaNU9jc3BwTGtydzF0R3R2dytuQVM1Tmp1YXBrL1FjZ1g4S3RPa1F1L1B2ZGNmeU4zYjI5dlYzdDZKbTRXL2lUaUFEMCszSDlScVBvL3FTQ1dwYVdDQURTUGlZaXZtcXVBK3R0OWNWZ2FUWjArSkwxdVZ3Mnk1b1huY0xqZi85L0VKcWJ4cmNHTDZDTnNWSHRZTEl5UkdYNE1UNm42M3M3bTgvSExZcEkvdWFmRDEvelAzblo0WTEvM0dEL1ZGaWNpSTA3ZVVsUWlHSUYzT3BqaUdSaTROZjlZbmJvanZtaUVhRExvNGxGS1BNdE8rbVNodVpIamhkazJYMkRPTHRvbDBXb2hmWDAySllmYi9sNXVUY21BTGIrd01CMlZTZ3czOFBsMWVJYmdoTjAvOS9lN2twTHhQVTNLOTlueDRSV1BCanlmZEcyZkNCYWZXL1BRZE91NnBHVGduQkI3N3VoTnlyTlF6KzRlTG13dWdHZjNsMjYwM0FUMy9lQmZCK2pmay83dXVieDlyWXcvZEdZQXQvclhBeFJkYy9zSDc5Y2FYM2xiYlg4dXVtMm10WVo3THo3YXBoT1RNZXNJZXMwU1AySyt0czdqemprNTZ2MkJ4QWN3Yy83dVkrTEwwdUJhVEhwS3hwSEw4UzlxZEFJdTYwLzkvMTE4eU15Y3BIU3F6V0c4TkRYZTVkLzNZcTNQalZHVkYyM1k3MkxkYUVHdS82L1B4SnY2c3B1di9aYkZRTFhheHdoSjB1UjFaRm16UmRXWExvdzdHVUQxVS8wdkFCME1qOE1KbHEvdGVGaVZiVmxvdGhPSWwwK2pCcmMyRGRjVWJ2TUlmbDRsNmRlRVIwckFFcjZWWjZtOFA4RnUwaWJ0dFN3MVh3RmVMRk5GYTJqaHIvN2FYcXROMUxvNmNpRWhEcTQxVmlSRWdtbzYxV2grT3Z2by9CaDdGMG0vTERLdXNjMUIyN2tuTWo4Z1FGK0pFaElpcU5wa2tzWlZ5STU3b0xPbEovUllzQmZpKzhlZE5iVUZwRzV1OEYxbG0wdXBOVGNRS0MveHF1VmpEWFYwMWpkaXlydDRFYXZTMkZpb2ljeU1JSzlzUmN0WFVScUpEaFN5M1RqeFlwUEM1WkQyMXlEQmNSTkJncnc3UWZuSWpmZjlmTThhWG5oTVl1UU5tQU1USThTNE9wR29IM2taSzByVmQ5aTdBdFlSdXg2OWxaUGorV29FNUhsMHJZZjEvcmNKd2cxMnJNZDdTcituRW5NYS9GenNBTWhxNDFnNlEwRlRlVVFlWkJGeEFTeWJvSTRIM0cwNnRPczBhS01rcGFDRWtTdWdUQks3aVNST21PcTVySU9Fb0I2MXBDVXZERHEzU3JZU2RZT2k0Vm1pMmdXWWlSVm5UZFdLUzZRQ3B5aW1Kek4rb0VFL1NUUFdRY1YxYkcxV2taTS9jR2xvYUI2UjJYck00VTVRWlRZWkd1U3JLeDlZazhSSzYwU3hFVEUwVUpGY3RUb25MUi9XWHBtbCtoU3VydEhjU1F1czQ1RlVBWXFFMUNtSzJkUTV0dkt5dTRnaE15MzNOVEFRMEFsUlhoUmFnclZ4YUJ0bFdLeVJzVXAvV0NicGNhemdBN2EvMGxjMUoxSHlFZHg3cTMvNTMvLzdmVWVGbnR2RTl0SzhoR0p1eDBlWTVJeDNBMjVjemRCYnhjbjR3Qm1MQlU3YnhHSUxlME80end0MUwwRjB6dW1vVjF3L1JVYlRMSXRvY1l5WW5ZWFRTVHAxUm5OakhXdXhFczQxb3NnVndZRzFpMzByYnN4SmFNd3M3NWgvYlpxS2UrNXNXVjJ2eE5LMWIzRmd6U2E3S3VNTlhHNTNLZ0w3UzRCUUdiOVBJRU1WUUQyNmdseGVwMUcranB4ZWlxOVZjUnd1dVRBZXVWQmZ4eFJwWG91RitzZHFKRk9CWEZhNVFoVGxDMWFXU2NoKytteWpsS0VoRlB5OTFIS2t6Snl0dElpTnpMRGwxVFBtR0pvWk1nNFJFY2pReCtGU1JvL0RCa2ZreEZ4WjZjb2hDZ2lDNEZidy9BSmNqQmFlakNJczVMV1UwTkdGUTg2aTZmdnJrZEZyMW0wZTd3cVhxR3E0R2Fvb0JsU0lGcFlJREJVWEV5bWd5cVFOU0pZZGRsM0NXSVFhQllrY2g1QnNoNEF2QVp4T2hHZ28xanBVZHFIR1JESDdvV1pTTFRWWm9sZ3RMbXRMbTA2cys5NmV6VHFhN3MzYW1KOVZPZFM3djdreEZUR3ZQN3ZHc28rbityTDFwdGxkdE9hdU9xcjNxdnpXMUdQNDlkVmQ5Z0VEL3ErUXFpMmNkVExkbmJVMFBxcTNxbk85dVRYV1JxKzN3ZUplK3BGYy8zR3o3WmRTT3FJalhYNENlKzlDTndXd1lGdERsdmNhVzRzSWxvcGVyYjE5NkNXTzFQbDdkNUg0V3VHcnlpYmtjbW53cDJtc2ZxZnVWdGZZampvSWxhMklvODhsWng4OEVSQzhuOGpIV2tTcFlxa1lPMUZ5VlFyWWJvMUlsdlRMUEF3PT0pIGZvcm1hdCgnd29mZjInKTtcXG4gIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjtcXG59XFxuLyogb3Blbi1zYW5zLWdyZWVrLWV4dC00MDAtaXRhbGljKi9cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGZvbnQtZGlzcGxheTogc3dhcDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBzcmM6IHVybChkYXRhOmZvbnQvd29mZjI7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R01nQUJBQUFBQUE4Y0FCSUFBQUFBRzVBQUFBNjdBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdqSWJnUzRjUEFaZ1AxTlVRVlJhQUR3SWdqZ0pueFFSRUFxQ1JJSkpDd29BQVRZQ0pBTVFCQ0FGaEZ3SElBeUdGaHRTR3FPUkVXd2NBSVRvdXdENHE0TnNESlVhL1FkRUlwSE1lYVUzbjY1T0Jkc1cyMW9OZGU5UDJPWjFucUh5RjEwZ2pKQms5aWYrMUhjZktUSG5rdFp4ZzhvWlZHdVZVanNkUkI5QmNHbXpsMUl4b1FCRkMyQzFDUFJxK0NEVnZndSthUzQvdFB6OWYvMVpTa1BvMmQyZ0FrL25oV1dId1lBTHBwblIrMTdRTjAyMkNuR0pTdGRjQmYrVW9UcFZtU3ZkLzNZM1o1RTNCUFA3RS9ZdzZmQ2JDV0lTUVV5QzJLRWxUVWZLUDdUTkw4cEUxWjgyMzlxblhUdmVFUFdJUlVsZHlzcDZXdG1XM3U2UExBZFc5dWNRL3MvZTRBYXdBNnlvb3VtQkR4Q3JYSGxYWFhsRlhhYzluUU0yUkRGckt3Ritxc2R3NWVLaWxWRUt4bTBmL1FHaEdJdW9MMlluQmFIbmlRRFdaQXJIaUVJdy96WDYzSVZqdTROSFJnSnZYS01wQU41Y2s1a1B2RVZtdWdaNG03VHlJdUJoQUFBaFFBRkFxTUoxZ3ZFMjMycGdpU1dBT0xvUmgwRGk0eEJkaUp3aHhKMDVoMExXakhJRDJPM0FZYXFrZjlhR25OeE81NWF2UHdkSzVqRkRwYlltUHpsT0pWN1IweGY0QWw5UUVCd1JmVENURFVjVGdRVnNtem1YUG9EWmNHSm00bStVSjVOaFhvMi9MejFrRkRJRXRlQlIrTDd1dUg4ckFYUWZWQzhBZWxLOGM4aHVCL0FRSVp2UjEyUUpmUmtSNmo2bVBBY2hnS3A1VGprQ1FQL0FVME9NbDV3NUcwMERVTkVmeG9BTHo5TUQwVVFBNmhmZ3NoR2c3S3hoTG1zbkJFOWtPQUVIdWJGOGFHKzRiSDY0N2FHOWJCbzROVERJYlFmcnRKb2RLZzdJYTlGdjRhNy8xbVJNV2VYSkd3Q3JJaFZMdjRSeHFjS3ltMDJmc0ZRVGwrMDlKdHRTNjVsa2tZbTArODl1TjhOcHlLUFZxTVVjeTlWWVlaWnhPa3czUmEvbGNVTlhzT0N2eTNRdGJvWjUzYUd1aVhVNi9ta1R6VGJmVXV2VTZqVEJERXVzZGhveUZhblJSR3VtTEpXYWRScG5xcmtXV202TkdqMG1tVzYrNWRZNUErTk1NVk5sL3EvUE9ScTAwNXBxbGdWV09BR2YwQTBOMm5TYlpIYXdhQ2o0cTlabGttbm1XbUJ0VGg4czg0Y3p0Y1NkbWsrdjhCOCthK2FNNlYyZEhlMXRyUzNOVFkwTjlYVzFOZFZWbFJYbFpaclNrdUtpd29MOHZOeWNiSi9GY2pHZlRmTnc2K2FONjVOTS9Pbko4WGcwNkYrN2V1VnlyOXRwdDVxUFBWamEyVjZoMDI1U2NtMnhzN0tzVXBLV1hOdGRXZGJZS0tFSlB3UUhIY0VQdk8wTmZhTnVyQlhERmg2Q0crbVdmQjViWWtVNmxPcTBVR3JlckRmaTNpRHoxSWpWeEt0bmpER1NaODNMZExtVmdNcnRzTVB0SXkrd003T2ViUmZMaU4wdlpRTDBZN2lVWUpXeGpkNGszSGgvV2Y1MEdnZWRNQnJIbHYyQzM1UU03STJOUSswMUludVpwaGFvcENLSHFkODlPK1VDcDZiTXcxWkxhWGRzaEJWRzBtOVV3QXY4K2ZiWENyQXRFUlR6dE8valdJOFZHOXpFb2VjM3JrMGNLeXlKRk1PaGdjdnZ4TFpTVGdUVlZPQVBnK1QxMTFIbWl4eGd2eDd6UHhOU0dhcVNGdUZGQkt6dlBjSVZFWjZkcnZicXZVUFBkSW9wUE4zdlBFSHkyZGdXQ0hqZndIbUFrS01vejh4ekhHV1VFeTFlZ29tY3lYWDVKY3g0ZVo5eldFSEFMWXhzZ3RyNW9MZDNwTi95MjM2UFJqUTNJVnI5UEYvNFg0UFNRL2dsd3hGQzBQbkR6bkhkSlg3TkZOcmk0Wk4xaUdlZGZJOWFnU09WVmVRS2pUL3R1Qlg3SDgvOEx4bnM0MXlJczNRMWVrQ2wzRWgwd0hIVEx2b0V4QUJnZHhEREtJZ1VhVGY4eVBOM0JXUEZHYW4zWXd2N2d1UjVZVmpTdEdueFhpUGxlYTBYeTBIVzNzU25mNm8zWEhDeDJXRmpTN2owcWpZaDRzNk1tNEhXeFJEc1ZLZWN6RTVvdWlhNHRJdEt6VWlwMnphWCtGVndaNktJRXdyV2I2bzNFNUxLK3AxaVVVVmFWS2xUM2xKdmVSdWdXNEV6UFArS0c5eWd1Mi9IbHFkRThIMS9acGFTdzdid25FTVVWWk1FVksyVnUzV2xUSTBFVjEyOVV1NE5rci9tK2hOZkJaeEdNV3lqSFdzdW4rWG5BWFZyMkVieWpjVzJ1a2hWR21wNnoxV0JGVFJFcUZRTXZPOTJ6bWtPUDRCZ0FvdzR0VmttOTJQR21ZL1pKWjd6eUNmL2RxeHBsaHVhaVltbloxN3ZyRmZLMm9FNmJYMkVrcXVtZnU5NHRnejZGeGFtZ2FmSTY4Tld0N09lVFdySnpNeVd1MWtLMk1mdGNRODM1aXhNSy9rNklDcUgzdEpjbXMzOVF0OHZoSEY1M0VpSU9JUDJtRy9FNUpGUGZxNFQrNnRyNFpwdXB0TURCRDhwVnV0SStXRVdOd3h1aVdON294eGRROUhtL0NvRFFnRnJRVXZKSk5XMU9ZaWgyaDh2c3U1dzhsTmpCY0pwUzJ4MXhjbHI1ZHl1eFIybjlnMllnTWU4QmJGSnplZ09VUkFLQVlIRHhwcVl5VG90OHdhR1E2L3UyOFREaVprbmw4ZWovUmFrSDNWQkgvUGtaTUcyZ3ZqaUZkWUFsdk45QlhjQkl3OHdNUlNoeDFubFprT0tJQjJVNjREOHBPNDV6aGV3Vlo0Vkt5alBxVkgwRUdyY2JocHNoV2FKL1luTzZ5NElwc0NmTll0RlRUZ2ZIQ1FmeFNuQnJvK256dUZHU1VHNDJVbHdiS2xFVGFwdWs1c0tPa0ozSmlPdlNjZ2N4Q3gwaU9Rd2g5c3VuZDlrYkRpdHZlc0VSaGszbUFCRGowTnNwR2VRUGU0NzBNeVhDZWlBQkk5a0R4S1ZaUkd4bUU3b0JXK3QwYkNSUU1mbVdMeDBSencyV0JBNXBTWHliS25NZmlvekpwWDRHY1JnekIwbnhWYkpvclZKSmIxaWU5MGhKd2RSZk44SVBqQzdtS2llakFPaUxuaEJENzhTMFFnWWRjUG5uTzVqaXVGZ3FNOXM0TW1LRklGTVppZ2wxRk04bzlINE9MZHhCMUxMaVpkU3g0d01pWktaZExrNUxzMDZVenEvNU1GR01SejBuampMRzFMYkl2NitaOHErQjVmaFdqU1hqRGRHY1VjME93MmFEZlk0bWliZVdyYWJCbURVUHljY2RiRzFML3JlczFGM2hPRFpJYVNickpxUWF3cnVWQUJ1YTZCVFdlQXlJQzNvRlA5TW9FM3g4aFhpM29sUTkzckdnTFJQYVg4dnpOaXREZk12NjU1OUQzalp2QTZqUXlCbThSczdQSEVNR1B2MXVXdHkyYVFjbmxZck9RaVpTaXRIK1JlMGFHOXFNeFVpM3NWRVNoTkNPSjk3Uy9JeUJKTWhHRW9USFU5aVJMb0V0L1dNVml1cDBZVUFveFh0cXV0eHhuNXRZeGplNnVuOFFTOTFtVHZDZWw1QXdxOUFleXlwOE0rT1Z3N1F6NTRNVmx6dDJCc1RwMVZYNVYxUWxmajBaL1BtSmJZSmlnd24zbHd4a1A4dUphUWorTUFQUDVKRmFrQ0sxck9TcFp1cENoL2RuTUxleEFmc1laSWQrY3Rad0RiT1IyRll3d3J4eXo1aXJSSmpFdXFIamYzYTNIVkI0cWlFaUYvMWFaZmJ4V2JOeEEya3NkcDVFcWc5aHZRN0FOZWQ1NkQ4MVE3bWRVRWk4a25ndGF1VVl6QWo2bG0zS0xSL2tqVWQ3OE1oUVhhSkhVbUp0TnlIVVRsWHg0MWd3Sk9RL00yLzQ4NTVCRHZIaytkQlJHbS9HMmJzMDhuSVhKTFBPN2lTdjNiMFplTFlmNFBlY3YrQ2lobldXV2RUYmR5SE9ZcDJ2dTZ1MjlsVjMzQXQzcXZrMGJLV2J1Y1FwUzVzRmJhZHJhbURIekhRdVJocVFPZWI0YUZNNWU1bGU4TTk1TGNZWlo1THBGOVhyeDhReFh5c3NZOG5DUFpBK2hVQlZzWHdhdUNZaFl2bFZ0cGpISzB0SGNITjBVNEIxdmkwZk9VRk1YNDNFNVRqNUJsL3J3MkJGeTFJN1ZIb2pTRGNVVmxsWjZtZFZUN0l1dWkveTFrMDZVZ0Rpd0xlNWMrdFAzb1VjSk8vc0ZBUGhyWFhQZlVsZ0FLdTNDY3gyRnNYUjFTMUV3OEpCa0I0dW02czdNK1VaZUQrTXhrSmUvOGg5bGdYREFaWk05Q1duM2VoQmFyRVZvdjJVYlJWWjJPenN5Z0JFa2x0QUo5L28vczcyQmFHbDJYK1BiV0oybmhidmkxQmN6K3lUSWdENDhaR3h1SGhUZmxnUUdpNjlCblJTUW1ZaUVZeFl0MHROY0pZT1RObGhzeFhVZnczcE9wV2hsYUYydXZYVWN1TlpRR0QzbWRVODlWYWRDK3lpRFd1NjJ1bmZhSDUvMW9kMnJBN0ZRWjkxMHJOTzFLd2N1SHh2M1FmTkQrZlZFNmRDczEvcW8wV0d6LzIxcEIxRGFKWFVSY2IxeTVwT0I1Yy90MVNabExqK0R6a1F0WGFCUTBuMUpxcDBaTzhLdlBqSi9tc3g0Y3lUKzY5dHlKNmludE5UdUlFdi9XOEk3bnRVZnVXWkpvYWliN2U3T2Z1bE9hUUF4dXljOVdaSTdPU0o1Z04xNHRPR09uU1A2UlJhUHZTaWY5M0NLSjFXZTZiWlh4d2hLSVNBQldBZnV3bGkzZ0FBS3ZTdDV5ZjdMa1BiRUJyckVEdkJNS1dVQzV6MlVGVFBnWUlRVFJoUitsdnJNT3lnL3IzdHpCc1JnQzhLa2piQ3FtOHYrbFp1WmxDTGxYSVhBQUJvQVUyTHoxY2xHTGkvVTNYUUJjQUFHNmRQWHdGQU9CZWxVUG9YNXQvZC9XdUZadUF3a0VCQUVEZ2gySkc3OFFJL2xyZWtYbnBHa1IvTnBNOTV4QjcxUFNDSjZ6S0pxQjNFQURHUk5ZcXNTaW1wR1lEdW1IU0J2UlVON0o0cTVyVjIxUFhndG1JdWJXektZYjJ6Nllwblo3TjRQay9tOVUvdUxNNXVPRSt5NWd5b2hkREFJYWhuWTFBUDZackpnODVRZit4c2ZESERRVGpXQXRCaXBXb29aRXJXNDV5UEhLeTFQRkVWbG1tQzFFU3F5SnhFZEpFbFcwVjJ1ZUs1V0dVOFhJQkttS1ZVeWNOajNiU3lMY3FxVGhQMHJ1ZUxaZUxjN2VuazhqWXVwRENZMVZzMnd0a3lzcm1MVkt1akZUbUc1ZWR6K1ZjRWpWTTNqeE5nVndaRkNSazhYUXZRNFNvSVptVUs1L1BFRS9IdEMzTG82SU5MYUxjc3AzR3krZEVkRXZyNWJsUkpzUEhWR0lkU1hTNkFoSmxtbWFwRUlPTkZDT2xlbEF4R1kzeEY0M21wRUx0TGx3bVIxVmtLcTIrblFia3E3L2RYSkNMdnFOL090MTdXdFMwdUtscUtaNmkxdURKNmpWNGtwcmdpZXB6ZUVKd1BNLzRZRFVlRnpUUDJFQlQzQnY0NzlBR2VPQ2VBQTN1RGlDNEsyQU43Z3pJeGgzK0JMZjdHT0EySDB2YzZrZTArS3pCelQ1RWs4ODUzT2hMTlBpdXdmVyt3M0dkOXpsYzYwM1VlQkhWWG1wYzVabU1LejNYNEFwUG90eDlFQzV6bjRJMTdrUnBISlI0bUdJUC9BVkZIdjY0MEkwb2NPMFA4bDFObm1vRXVTcVRvK0x0azYwYWpyT1U4aDZaU21LTVVyTUd6bEE2NEhSNWZaNDBPUkVVNXBhQ0h5UzdtQnN1STBpVW1ZbFlna3hzUktyemVHbXpVOG13RTM4aU9jTlJna293RnBpUmdEWFBVSkNNdzRTbUwvTG1tcWo3Vlk4V3V1QlJ6c1JsSjZMblNIVHRpSTVkczdiRE9UekVnV2phRTQxZ05mYnpDY0crUHRIWXcxMk5YVlhKV0NXejVTY3E2WmRSeUpGRWJtR1QvQzFjYkZ5d2pEOEFTOFVoV0NMbVlUR2ZLQXZYY0FJZkxKRHd1SW5PUEhQc2hJbEh1Y094ZzUwcnRyZXp4M1pjZ2wzNE9JSG55VlVuMkp3OG5BemkrNkd2N3l4Y3pLUE1YRXlqek9OTTQ0emttWlNMTEU3RVRXS2F4QWVHTmlIR3FUelJjb1VwWUJ5WHhJWGVPUDBmWjRKRElPK3B0K29mdkUzL0t5WlhPbDYzZGJ5NmJ1VjQ2L1RLNlVONnV6SkJSYmxhOVcrdjQ3aitnMk91VitnaGZBVGlReFBnVi9CUjRGZjRRUWIxRlhDY1RYeEMvQ1hmL3Z3SjkxZDcrSFBVL3h5QkdsU1ZSRlFPZkJMUkw2bCtwSllyNTl4SEg2bmxEN3hFYm9yZDYzUWRDd0xDbUVvbVFjT2JWck84eUVoaXN5ZWNKREZ6WWpxN1pLLzZiZz09KSBmb3JtYXQoJ3dvZmYyJyk7XFxuICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjtcXG59XFxuLyogb3Blbi1zYW5zLWdyZWVrLTQwMC1pdGFsaWMqL1xcbkBmb250LWZhY2Uge1xcbiAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgZm9udC1kaXNwbGF5OiBzd2FwO1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIHNyYzogdXJsKGRhdGE6Zm9udC93b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBQ1NnQUJJQUFBQUFRTFFBQUNRN0FBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR21RYmhUb2NnUm9HWUQ5VFZFRlVXZ0NCREFpQ09BbWZGQkVRQ3NKRXVtY0xnVWdBQVRZQ0pBT0REQVFnQllSY0J5QU1oaFliMkRvVjQxaVRlQnhBREw4c29pZ0pxbThTUll4eHdJYk1SdmIveHdSTlJnend1MjFxVlk2WGlMVEdLTkhxMmRwYjUyaEc0OTNkNnNNVnV1Z3kxMHZqTEErdkFGNFBqT0Zrd2hWV2djVjJISFFKUmVSU3VVbG9sK050TTV6OTNzYlJmT1lidWtnYkhaWitQbDVsOWN5cy9HUEZyN283VmE0SENNZG9hQ1F4L2FlY1dlOVhsVXBzeTRTUzJ5MDF1TkYyZDRBVUJpZHhzR0VJdFVSZUlDL0NrZGdobURrdUFCejN4SWZMUmdQZ3JuSXVSNW1YbFNRS0dldmtITHZRbEFvdG81REtxTmdaTXpKMkpIT0V3MW5IblZ0ai8vQmozNCtGNS9zTzM3dXpiNWFDc1FnR3FGUnFvS1ZUQjRsNFFITThnRUgrWU9Sa1NiL3Q1aVl0Q28wUktBekNLeHk3OTE5dDVjeEJBT2RTbmVUQWQzN3AzZFNFc3hoWTB1VjdRdmFpVW5SY1IvcnBtdWVncnd3bGZ3S0EzLzljL3RiT0Rad1ZzdEpQT3k5Y0FIakpGRzNpeS94QkEvQkNFbGcwZ2d5MzFGeUpBb2Q3N2dueFFYT3dGWXVTdEJZQXJjMHQwK0lnQ0E2QzBoQkl3emNaTlpiYzN6ODRGeC8rZnpiTFQ2dTdCclF6SnRtY1dlZVlNTWdBUTRjK09RWmgxNjFTcWF0ZXQ2YlZXbENOMW5PMHJTWE5ZaTlMaTFxVHhpajdJMlIwY3FBWkdZQ2k4WDRNZ2JPTmY1Q0dQMHAvRUlZZitzZWJqNDd3QWZCb2VQZzVvRER6U0paTnM0U3orYzR2alNkbHhzazlKMHBxak9zSTFSamp6bDdYWjlsdFRWbmhqRGczUVlMMDEydHNaWEFSK2VxSUlDRzdnS2Q4MUo0Z1RNSmdEbmluUzUrdVM3Snl1THlBS3lxdHhRcS9PS0ZiWEhhaGVFbHljWlhBa05IQTFBUWNRVW5rTndsbVk5Z1gzd040K0tReUFmYlhaUVhTOWZ6N0FwSGsvQWVSb09EOGw3U2luSDBJQUg0WDRWMXNBT2dEazFBTVJTVml5YzRkd0s4aFZ0S2FIa1M3bkhIQmt4ek9JMXlrUFQwM09sVExrOFJlOFBMaHRkdlNZOENZR1lldDJuTEtCZGZjOGNndnZCaS84YzZYdnZQL0RuL3l2M3QxUURxbVdtb3JVaGU5OUROSXJBU3BBMEJYY3VVck5Oczg1VlphWjdPZDlqcmtoRnFYWFBlNFo0YWV6aVZ2ZU04bnZ2S0RYL3VEdi9uM0FMQUZvTHJSMGtGemFXMmhFMk5pcGlMaW4zeTlDMHBYNzZpdk96M2Q2VC93ejlKVW42WHd2YU9BajlJVFQxcnl5NmJyWC82S1g2UWJDcjlBcDRpMnFXaDM0TTRJM0lWVDlXeHFZdXZqTTJ4d1EvVzY5RGtsNmdhYzZiWW5TbytjZHB1dmRETjFob0dldy9Tb29XelkyenhkT1RSaG9uNm05MFNuUUZIZzE3aXpmNncrMFd0eGMrKzNTYmhnUEZ3UENBUXliSXM4d2UvVHhqWklaMlBzdGxRWUlxMnlQUG5kOGJYbkZYelhjamZ1eHQwbXZmVFF3L1plREJMQTlHeWRzZjUrVm5Jd1lTL2ZkQ25BbUpybUVCTm14OGhlQlo2MmQ0SndGZjhuN05NSW5vNXRUdHFiT0ZVQVFkbWR0L3ZXa0RRWXFQbjcrRllQd3gwSFR0RCtjenBSUnhGbG5wd2Q5M3dBYlRQYUFOQVBBRUNjcmkwQThJaG1paHBPMmZXVlpyQ3ZkMUdtamc0QWI3alBMT3FJL3F1c3JyTzMyYlZwWTQxZmI5andHQUI0NE0rd1ZaV3hQd0JPTEZHMkQ2NFVKWktpOE1ibEtYTnd4bXhOZTlUcHpXVG1zNUNUT1pVN2VaQW4zUTMvVG51ZFJVMm12Y05ubnM3OWQwU2xTNmNyMW01Vkd6WWQ3MVpUT3RBanR6RjdDMHQzdlpBd2gvZ2IreDJ2MjlULzJWajR4cmNBZmMyRHF2MWF3RFcrT25wOVo4eW9FZWkwNkxFUjVua21xYlM2dkZLL0c3SnBPYW9wRE5NcU0yZFFod1o5MU5wb3gxT2FCaEFRYWdLeVhiL1JMRldpV0tHaHFUTDBPeWkvckZ5akx2V2RUanZzQnBFY1pXcTBHaUFtVjZ1OGNvZGVJeVpvTFNyVG9wdnpZN1NXM1R3YnRZbmtkZlBEcWlpMUdwY2FORzdPVlQvN05QN3ZVNjladDZFQjFDR0JWYXBKTjQwUjQ1WWFCTWl1Q3lsdlFJMWw3akVZM09udmEycHNVSUxYMXlscWE2cXJLaXZLeTBwTDVNVkZoUVg1ZWJrNU1xa2tPeXN6UXl3U3BndlNVbFA0dk9Ta3hBUXVoODFpeHNjeTZMUVlhalNGVENJU1hCRFdRWFZDbnltdm1jWnVmckE2TWRzcXJobm1ibjV3Y3JaVmp1UnVxTjJud1hGSENNZGloeE9wSHhwcnZXR0xFTUt2NTQxeHFldXZodDVvaW93VTh1M1BOWnp5Y053STFib0NFUzJjQlVxclhrM3JSd05zdDNQWTU5eXhqdSt2N1BpQlk4QU9LaXpKQkp6UTRXTUozRSsxUTVQby9zcks3aTk5SEhlZXNlYllzcXhzWFVtRDFaaUZCNmNKYTZuUzY0THRwdXhnYmQ2Mi9vd3pvYXNSZUN0cjN6TzJ3WHhNZTB3emxwcHYvUWNLOE5hSklIMmVqMFFiSTFwaEV4WW53cU5YalRhYWxyelA4ZmtxTHhQYmRpc3g3RXBOK3NESkZKWWZPTjFJZGpEeVBuQkd2akppdThOOW44YlRRWUo1UFBRWi9rTnc1M3VsNG5CNWVPSnJMVzl5eU9NREVrK1N0TmN6NFMzWDJHR0JNTVlpUjRnZmlLREh4a1ExcFBURW1EWTJHSi8wTk4vWjdSQ01NSnFvZFpyZ2xGZTdlMElKajRYSHcxUE1acFZFeithcldmUStBVHJoaGtVMlVXekFKNjI3TkxpV1ZqZTVsbmd5OXdaNHl3ZHlPY1Z3TEpldzM2bEdEL1MwUDdqWHlEY0xObFVPSW1ydnIzOUN1MVVuZHN5eFR3ZGpBOHduR0dYQkc3NW4zSkRPRUU2RmJsMHcxZytKZjVpSGx2VXVTWGhsMktkc1ZsK3FrK004R09ydWNkUE81R3JQdEhva0NFNzlEVjdXNE9xNjdnTDMrd3Z1aFBkMURPRVBwdjlzTEE3SWhHdUo0cGlucXFQN1dvU05TWUo4KzVHNW4wajQ1ZlppK3pWaTBob1p6ZFY5bU0zN3VXZnZLSGI0a3FsclFYbkUvOGcxMTdUL1J0ZDVUb1J3SkJ1ejloSGVPa0tPRU0zN0pnbnNzdGJ2bDdNdHFoT091WWZ0MW5DY3dxZHU5Rnc4UmhlU0R2ZlEvRTRRRjNHNDEwTnIyR3IyZHpmM1BQVFVZYTJUVVpoaVFyUlFlOG5MTVBHS2V6blNFdUVZd2lmZ05COXAwOUIvbGxramFqM0dTNTVLQ3UvcUtpMmlvWVUzMmwrZzNYcllicFVES3daMkExT1pXTmJkbmI5WVQzdG1EMnVCNTA5Zkg5N0s1REUzc1ZrbjlDVXBEMFRKRTZlT0h1SjZHY1V1akhBSTN6MFJTMHZ2THo4dVRzaktsN2dodFFuYzV6eW56cGFIY1JKRzROZlIwWk5rOGluYjJaVUNoSDlGa2pRZ3JrZFpQR1B3bkhmRm95SUdhNlNldzlkNUx5dDZYZFkxeWpZN1dJODlrNVh0VGp5OHdZRWtjMk05UlBDeHFxMHRNT0pla2ZLMWVNSHhHOEVFT2lNV3pHOUs0UEluS0hnS0ljQk9KdGFzbmpKTDYraFo2SFB0eUJTeEZCc2hGL1YwbnNYTDB6RlF6d2lyc1dKN3cxdnltTUlwRVB0S0ErQzBBSlhoc0RrY1VkOHpIV1lYUVFrZ2cvNkNTYzlManVNSzNvcXMwSk5nRTV4SWtVRk5tMDNOMXBQQ0FrZUFsbVdHdGYySld0Zm1LdUZ5Y0ZEOFBVMFB2VTE2L2hDWHEySWtnc1ZCY0d5cG9nN1pPWW5tQmdCc1AwNzhEYWxLRlhSZnNzcnRVUUdlZCtueVVmK05pbGUrNkVwT2FjRytCSndTbkNnbU5XRksrTExuV09IcUN4cWUwYWxHZ0xjeUlLQW82WWNjRnFiV01MWUo3RXdTaTRYdFY0dk5HMVJSc2ZWcjMycGR1VmtXU0hMTExhWXpMWG5CeWVBTDhwR2lLYm8rM0tDd29tYzhlbGw1cEJBVFU2NnZVTGhESmJ2S1YrK0ZVSjVOTTRTUmR6dVpISjg3SVhzYU9FNjlGMDJhRUZCTHZxUkROQmF6eDlkZ1FHNWw2NXZVVjc4dmk0eUVWSDJScjVxelVBRmRJOWZNOFRuVTFGQk5rUHNBOXo5M3lIS1hZNCt6cDZJbFEzd2tlRHVpQlFZVGpiOW9kRDBYYTlrZXJSQWUyek1TVGp0ZE55djZqR2cwQ0F4aVA0TEtmVnpzZzBKNmtNY0l6UVBsdmxWNEk0SUVURStXUGZ5VmdiVG0xVEhUZDAyTTFCSGxlNktkcXRQV2NKMkhsV0g1THAwZkNiQ3hjcE1HRUZaUDRWYjcrbjVwdHpPeVc5bnArMHZnUlcrd0p3VUhGR29pZ3VKalZVWFJhdkdrWWlwamtqWGdnT1R4anpGOEdZYWFJS2FSdWJWNkxBUFJseEFjbTBmYjFta09JSTdSVnExbU1DSkJkMDUxMksvTnBzdG5PcWV6Z3IxUS9od00veHJVRVJwS1hPYmY2b0FUWWtsN0k4ZnBUQm9SbXphcitTZEpVNlhSYjc4V1YwOWxrZ3dGSnMwYzcrb3NLUlVBU0xEQ1ZoVnBSclJNSk1hRDdleE1hRzBuVnAxSUtHWmgyeC93Szd5Wmp1UTRCVFBNQ2UveU1kZW1IcEpFK3JWbXNsUFo3Y01JcUFMM3IyTVpCcVZSNzRsdWZqMVZEWHlGc1RrZG1xRWZaTXNoRUJhZkxMOHUrdnIwaThEYlhMdWxRODNPZmN4ak9YUjZVSFp3Yko5VVJ2bFZtRGQydzl6OTFjWEVGS3RiZjY4clVQeFAvOFBOc3dnZkZGOTVGdkNjdVgxb0ljOGFBVm16alFmc2lmR25qcDhXWi9JSktMbi9xTldqMlE3c3pocllJRW0yNzFVdnVrKzU5cE5qemJ0K2hjTjFQWG9USVhhWHpYUWwzSnkzU29rQ1pRL25kTGhLMkhoVjMySENmVWlIa3kvR3p6TnRoQ3NxdHhaYnZ3bkYvQk5qSnlFSVg0amVheDYwa3VPZGFxaENtdnJkWFc2bW5sZnQwY0c2V3hxMGl2ZENXODRuZnJ1TkNUS2dFTHRvVmc2SE5OQzg1eFFiSHA1Q0JEL0d3aE5nVGtEbDI5VVgvZmxXa1NYV1hsQXo0eWwrYTNISVpWemhkNWJLTVR6dmhYQVN3TThkUGU5MTZQVzIrVU9xZmlBSFdjQ0lMZUFUeWRCZ2paYlZGdklUczA1Q1I3U2E0OFZxMDhxY2ZDZDdnN3hVZFJiWW0zOFMvbGFqaTZpMjRqOUExOTQ0UWxNSjhTekx6ZXNsdmNDV1h3eEd1MWJyZ2tkbWpJcFF4bGUvT2dnY0dnellVT1BZaGZYVU9nby9ZT216Z01vQjg5TUEwRWVSblZndHIvL3pNd3lTOVl6MStlazQvc0k4NWxXVWFnTEZ6MGIwRDZxOHJvSGE2cXlra3E2b2ZiV096WXM0RnQzU2pJeGhXSmF3aTdsaDBZU2hXYnFSelZpMms0Z1RTKzcrcElVdGhOQ3NvbUZNekdiS2xXTGd6RTNWeTVhVmJ6bmIzRUpxSnBldTFCcTJQN1k4SzYzdGlWclZuY2lKQ0lFNmR6bDFOZzFjZllBQUtYSUtIVFB1aGkyeXFRRW0xSzMwTWVCTFZKTUUxQmNkYVU5MU5na2l3U1VIOWRrek00c0RIMkxkbk1GU2RoRms3YVZIbHJHUTB4aDNMQS9kSjRtMmh3UkJzbnRCQjNqRXRLbncvTWd6NUtqeWJNUWplenRaOG9uT3BxMnZBSzcrUFJ1b3M2c2xSRklaZnhlZ1BsWnh4eU1ReFpsTzc5WlZSK3JzV05JeEpPTllHS1YweE0yS1c4N0dKT3BGTmxtZmU0VlV3VHd3VlFTeGlwc1Y1UWtUazFXdjRhMTJMRU1MckREUjBiWW93Y0FvcFd5MDQwblRIQUE3bnlqa0ljUVk5akJNNWVxRFJqY0pIaHA3Rzd4SStKSXFIWlVWTGJMVERrbWRsd2l6dERhZzlYdE5QYisyUElZTmIzUUIxazVLeTd3OVBuSUUzQnh0Zjhma1VQbFYwMHhkei9ZakFtTXJLb0k1QVZjNlVTakRlVklENHE4eXZTVmdCN0N3YnhmZHNZU3Z3alE3RVZEQVZVY0R1S3psMEJzRFR1T2NTekxNVmJBajVoR2xIUzBlWng3clg1cGhubWwvYW9MOHJFQnlxSDdvWEljWmh5MHI5aVBPRVR4ZERQL0trSnJITWFaS0RUQ000MGlGWWFaamNBNkxuemt3ZUpPRFFPM0dxVjFyaVA1WGpOa29IdmdWNXdOQUpENWJoVjdNRXJFcFpGYVA5ZDNma0lMeDNzZzF0bGJnY0h1WnZxcmhxdFU1WGsxRGZOL2RDdVVNa1NIR0ZhcDBEdFdpVERiWTRabnJQZGhXVjYyZkl1MXVwKzNoMkgxZDQyWldmbGdYWEhlM3dnRXVrSGcvVzN1OTVLRGh6NWhHNktaWG54b2pKVmJNVjRhZHl2cHFjMDFZd2lzVk1CT3BnMVFwRWprTFlWTnBUUnNIZ1Z3ZGc4aktseXEvMmdhcVFrUkcvckVlaVR2R3o3NnZ5ODdienNsOEZkRVkvU1JIeEdjblBnQlFLbnNqSjBQc1RGbXhoUTEvWmxhTEloQ3FYVklwVXdVcmFDcHVXbkVoOTlhd05VSGxEdkpPckdBY051REwxczQ3ZGpqeU85bDV6c29RRzVZRmUvUlNuS2loRFJJR2VoYkxialczRTBaVWs4NFpCSWExSjhqbDY0djdyNmY2NFV5WFBSbU5aREdKSXVmQ1Q4OU1HM2o2aWxoTzIyUmx3K01vMXlZTytUekZSSVVKelgxTHREYVpGSFJjeFg1eTJodGtMNHF5MXB1cWN6bnhWcVpUN0lNeTFkaXdsaU9pbVFPbkRZallWa01BT3A2WnE1RmVTR2luWjd3RHJuOHZnQzM3eWVUOURWSnIzcGUra1dPeVVjQ2FnUjhBMzlSU01BS1BoaThOclA5bTFxYlhVQ2ZNMjg4bm5KQktkY1A0QnVQVFFZVytGbHRyWU0zV1hPRDl2LzY0VDhyc2QyYnFrVTFXZGZCNmlHaUcxb01KWlVOWVcrWE41d2lpN2dKaGJIOXZhdnArQXhHc29iZThyL3ZHZjZJWlhaV2hmSjZRMUNMS2Ftb1kvZ25lL25mYVNCQ3ZuQzlVWktsZklLb3QvZ1ZDRXlKOFptMnJoaGJhaHA0MUtOZlBMeWh6UnVwenRGVnJUclU2UElSUWxpdmUwanByU1AwTzV3ZnVWdFZUb20vWDFWaEMvTGZSZHpjYXkwa3dKbmtDZnpSUW50WjN2WFJhRndMY09teW8yMjRXNjlCbEs5L2U2d2swYVFDSmpQVUQ5bGRiZHhyaERDR2E1U0xydHI5ZEE2WlpLR0VxUHdPandpYklueXZjOFNZUVo4emJMN01vMkFROTlMTmFoYXorMUZhMis2aktZNGQxcjNwcHV1cEtWTkh2NWo0bVplZ3Y2WGRMbHNhcnJ1SUxldG5kd1hKSlluZm9FY1I1MGJWVHIrZlk2b0N5ek9TdThDUDJGN09Vck5QVElsT1YvOW5KdzJkNW5JWENNc2JKY2NWM0VTT2FNdXpBWFZYemhaak1zYkxxanJ4dXJWV3dtY2grQUtGNUFkY01tQlhiUTZSTzlVRGc2dUxOd0RPQjIrN0hyZjVkZjZiNFNtRVRJSGN5UWFrV3RyNysvdXV6NkhSTm5yMlZPYlF1S0dwWWplam5XeW1EL0FaUDIvVkQvelNwM2hTbm5sSmtldDVJT0twc1hhWkphbzgybHp0ZEovYTR6djJESEtFTFdzSnlNVW1DaUU3SFRSbk9zMHhFWXhIa2did3NiQmR5TWFXK1JtVWE4TmdVOVJ6dDRSZUZRU2VnL04vME9sMHYvdFF4VWI2dy9YdXMvTThZQmhnclNmTWhsaVkwMTQ0M2UySEl5OCtmT09jZC8wNS9ySmJlWk9QODZEa003NVBxaytFdSttdk45dTJoRktJa09sUGZHUGxZWXBIcG4zVXcxK2U0K2MyNDdGUVo0bk1pNm9Xemh4LytnR3NReXYvTk9sSXdUQUdkN2U3QXdGMW9EQkt5UDhXdjdUUllNNUc5OFRwazllZTJjc0NSS285djJIZXJsbVlxcjBRV2ZiYjBNUzFIZjBXL1U3bzRYblUxcXJDWDJ4TmNJazNzQ1RsaWR6Yjkyc20zaHpucXdMTE1aRlg0TXVKQ2hwSjFabHJNaHNPN29lNkVGL3BhYks2RE56Zm45bUcyOWVtR1IzVEpDRXJzdkM4ZmNYRUZZZ1BYbENJMDRuVzRXbUduWmtvUkdtOTdUUXMzTys1L0RSNDJZOW4zbVluc1RlSFFWaWN4TE5TbWdZZlFURmtIbThTOFJtZ1FIaENmZHgwR3QzTmtWem9hR0IvbURnUFRqd0pSRzh1T0cyMzdia2x5enJjVlU5NVBIZGNyT0FYMGVjZkxCVDEwclFSc1VVcnFncFpGb3VqTzloaWp2UlY2eCtpbERVRkhSRHhpYzN0TWhxNDlobmZHYU9wOExuc3oydzBzbm1PTnJpYXVYVGVJdDAvQUZTa1BDVTNBMCtKRnNGcHMzQW5ZNG1jdVd4Y0wzNjlsL21SWnlEdmQxL3lLMG9ma24zRXdOQVNCUUNEVFZrajl6T2tUWlQ3dmtzN1dkVXpUVTB1VWhYWjA4THdkTnVWZ3MrU2dHck5tbmtDSnpjbUVPRG5iR1RzQnkvK01Na0VHTXp5ZCtIdUkrNDVscGRZRVc3UlF1NlZGcHhFbGY0TWw3cG5TU2w1VVVVUnlDVzRFdVpsYXpKT2pQSGNzbkRHd090bWp5MVdUaFRQeDNDR0pqREU3TE0yM3pySlNUd3hsNHphcWxjZkk4cUkrSXJlU3NNWmoxUVN3MDl5cjhOV05BeE1FZURzMXNkNkx4WEtSRTNuWk5WSlJSVEorRUpJRTNpaDA2ZmRGTTc0MVlmb3ZFT2RkR1NCbDhBS2R6OVNQQjNKMTJlaTlTQmIzeEQrRXRIVkhvWk5uZlBSUzBCb2t5ZW9sUkxtZW1iUXFHYXo1dERNMDVrb0t5RlNKZUFtZHM0ejhvbFhpdFlpU2ZGVVlOMXVVRnVmblJtZVFLZ2dCUllxb0dXa0IvbWJ6OEZWdVRrdGNMUzZ4MEh1UVU1NDBjQy9SWXBKV1VZZ2ZFZFlxVk5BWlNOazRpVjRkSzZEWE5wUGpqZlN3VUk2RWxTZHYyUTVMeit4enhDRkRhdWVWVGxTcG1pMEtUMlZLS21CdHhRa3FGMll5blN3U3lGTm0vZkFPSFVuSC9SQ0trUzhaSERUZE5WZ1Frb2hLUTFlbUJyZG4xa24rdWZxdmhkNUMyOTRLSU8yRFhkc290THE3MHZMdnQvOG9kK3NwTG9KRWZEU0NacDhmRVpwTUN2RVdVZG1YVGZPL05iazBObUtBczQyaTBCaVVHV0hiTThjam9nOXp4cjJrWnVoRFVIcFdkZ2Nwa1ZVZUdpbm5laGttRjVyTXRNTlhJZExlNU9pVEhjRUdpdjFLSTZ6TENabUQ2dW9wY2FsUXpZazlPK1pyVUE1cE5hVTZyMHFncXNzbk13VXRKRGsxZFNEMkkxS0RNV0diREVZTkphdmczM3NaazB4VVFaMUpYVHlpbkNMb1l0eURKa095MnpMcjdFQ2tscUczY3lPZmtrYmhmdDZSb1VpY2thUzJWV2hwZk9BbjgwTVVadyt1QWNYcmNJN0JFSUQ4OXV6cGwvL210YStoL2Z3aC9hQ2tNRW0wcldPVVJiMldZb0FTRmtVRU5ZSXo5dldhSFVBOHN6VEVmNjQrZEF2Mm5iNlNORWZWN0tPQTIzVUp5dEtURHJVc3Q0dXpYdS83cTMrTVdSdUFsSXdjbzdPY2FlNGhLZUZDVkpKRFJYSklBNzlBc0hXcXVoRU9UTFlwcmN5STlNL2xjeXRDOGFhb0pMMklTSGhiRHF3V1JPaUdObUN5NmFHU0tGRlh6ckRBVmhGWDhUYW1mYUltd28yYmhvMkZmODdERXRJb0lWN2lhUGFXZDhDcWVWSXFMdzdhMWRHc1VSayszRjR3L0xqOTJvaDRqdkFHMXZtNGJTb3gxc1RCRVFsOS9sbHhuR0FFZDk4eC9wUnBVeU43ZXJGK3RISlJrSEM2bFllK3pOaXE2bGxrNVlpN0NISndETFRGTkM3Y3BUY2x1alF5b1RCRURaK2dOY2dHNWJ6S0pOcWNkUUc5c0wwR0IxTnFleG5KYml4MzFJOVVOenlVQkd0SVljM1VwM3RkU1Y1dGFkbWk1Vk1iYkFhODI5UUZDRHk5R3BzaUMyOUZhRWhKQndwRUZDcjh6K3dRYkFvMTJGTWNuZkRjOG5lVHpkZVB2czd6dnBZNnF5bTdnYXY3eGFZZFpCczRWaE9MV3FaT2xTbVdvc1V0MGZuK2NRS00wbnFFbWVveS9JbFl2c2pJN2pwd1NqcWg2TFA0RE1sVFpTbFF4bW5qY2crTUVlRTBzUWJleVN6eEdRWFQ3UDBPNGtKUkJLTktSWnZZMHVwUHlOSHpKeFpjd1lsbXNYa09jL2t3TXdZNHlibEVMaE9tTnFVbnp2dmZ0WG1sZjVPbTdZSDZSeUhydjdyZlpGcTBJM2dpTVp6UFNOMXU3SWordHZlK1RKUWxTR1NWcjRWZUxKQmhHNlJZM0w2bU91VE0yTW5SbnU2TFI2UWVqMVBPRFBROTRyWHBwejFRcEFqM2FlSXpGZUdqdHRxWUdrcDJLSVdlYjEzaThQNWJwNDlSMkEvNlZKaW5tZlZlMjRwaGtna3lsMTlubE9jaEdVcFlROGJ2eC85dUdJdGhoRm8wUWFxYmNFWk9zVHlpWjRVQnphZnF1Z3E1K0szbzFUV3pVM2VtZlF6VFRraUFjMUpRRHpnSlhaRGIxUUxlLzNsd0dnTFVsSUlXeGJuTDRkOUFiYWNQbjNRa0pScVBYdm1oY0Y1ZjlBcFJBV25ydktxdENQMi82Si9Za2hWeVR1bXZSSjJHdW5nUmxpbnJoTlhoL0diQzdBaTVRYWFNQ0JhV2tNRWtkM2d0bTIvUXVlQVJJOUtNTWNsNG1zcTFmWXg3bkxjMkp5MEs1M3VHeFg3aHgyMVA3cDMvLzBaenVDWXJudDhUZEsyK0x1ejcwdXNyZlIvaVdqWi83SmIvTzFtUCsxUjZjV29zSmJnQXJtRlpLeVZobStPTmw4amZ0SmJRanMxbTFXWE1SZFdXczdYdUY3UFBGdjJYbm1LdFJBU1paM2l5WXBZTkh0UE5SWDdZL3RYWS8rTDAwNENKdWt6blRFeCtjQ2txMHFJYkltc2pSMVRSeVM1MU1PemZzQmdrL0hzcnk3d2dnNXIvQ1BzOTZYUnVWQkF5bDhOR1NBS0pOQmFiMXluTzFCSXZ1WjhEa1pmMjdMQ0twb3F5MktOajNPeXlNVG45eFFEVUJ0SnBVNk0wRWdWL0svalljL0pxbnVYSGovYnVpSFhoSWo4czloQTZKU1NSTGRGNnUvbkpVY1lmZXhiV2RsenBxWXVwTTZ6bWIwSVp1WXhZMnlFOHN1R0IxZ3daNGJsYngybk1QVjd6UEtKWVpnNDlEbWtlWEZzWCtUMFUzc09uR0Jyanp4S1o3d0Qxamg5ZW1TaUpTWWhMa2NlbDZrR09XRndzaHJDOE9XMUNha3M0aHh4UVlVcHhPVHZwTUl1cHBwdlRJNWhoQWNrNFl2NkJYcWlXRldGWVA3OFZsaWkrSHZ3b1IwYk5RWC9hOFg0RTQ3TmE3Y2htYU1pU0U2TDJKN2FGVzF3SzJhZmVrSTIvc3VmTnR1dDByMFJySmduS3Bkb0VSbGJ0TUV3OGt3UTA3eTRUZmp6S1dTMUFtbjBMZlRyMVZmZkhkTWo0VmxrNStadTE5OWd4LzkxWHExb2YxY2RaRWNpeGRQS1VvT09aODFyV3gybmpHVktUOVVNRGNWWjJDejRobE9tcjNrY3pTVE5OUzFsZmhadGNTS3dRV0FBR2tJcnMvLy9zZ2dyQ04vTm1URURncmtxS2ZSYmhPUW8reHovY1dlS3IzeFBBZUVZNUowRVZ1Z1JaUUNEcjQ5M1U0M3RjTHRaelU0S3RuSFBCazF6aGtxdGM0em8zdU1rdG5pQzdPSmVkVkR6cFJScExUS1BxYmMwa3NsVkxGSHIvMWJGZEE4M21zdXlqTzVpT0o5UGM2NGhubUtNTmQwWHEwYTAwcFZIa2xJbi9lWWIzemVoMFNZZWI4RFMyc1pQTEREVGovL1BIL3dtVGd4VUFjV09UNThTQnVBT0FLQ3AzOERoOCtrSFNzUVlvaytGV09pQVRNc1grMUlpLzY5SGR0cWg1Ly9BRUpzL2hrNmtOOWZ1NldjTGRCbHZHYjdLWEFrV0FmYVlBN2tybERaY3AxaEdodDhDWUsrUWRqK2w5SSt3enQ3dE8rWGt1ZS84S2JIczN6R2xpUDFrUjkwYS94M3JlVVhlbWhGeDNQZjR1TGZJMTJMcGl6cFkyUHpJM2lkYk1PTmk3Y3lISm13aEFPSGs1Q0kvRlAvSEVPZTNzMDhwdkJNdVV0Z3BpYTRXdStMemlCNXU4VDdyeDhiKzVJK0xZRFFrelFxdTlzQmhhbWkwbGlFVUNXdms1MTBwdG10L1VJYnVUcGxHclZhc0ljRHhqMnBCMTBwczJzWlFVVFlOWW9DY1lsN2hoUU42RVptNDlKWWxhbk50Y0ZRck5oSjZtQzF5M0pIaks1cG14dzF4WkdGTjV4b3hGN1cwNjVJNXI4aWdIL1JsbGRpUXNDd1ZSV3FrdVhkVWl5UmdQQ2Q5MlZQalpFNFpLUWtBeVlpeXl5WmxHclNCUldTM0p1WGhzSlZXRnhnTzdvQzNjcVcrTXNqRGxuMzlESXAzTmR6cHRDZWNuYkduY3YwNHlzbUE4MTAxTkRnaVliNWQvcHZOOHZWaTBsRGVLRFhscENzUDdQM3liRlFtZ3MyaDFiMVA2T21HY2Y1TXRtT3Z2OXB2ZnpFS1NjZHdKZXVVUm9jNFpqYWxFUDVvRTNkQnRBUllhK2IydDZXbUFxaEZjb0hsS2xQWURJKzZoTG0rQ2h1OUlLbkRzU25KVjFSaUVYS1ByNEFXdDJkU2k2TjIwU2lYYk1IazBWaXptQ1RwMi9Mdzl3Z0hUbDNRS21RejVqS0dlTi9TVWNxaURVSFpUT0dTcDJpOStjWjZyNTFoMkk5UlZJc3hwYzg1cDlkelplVlZLT0c0dzFRalRxYUN6Tm16SVBHUnFkclkyUGc1VFhVektyZWZBYkx0Y0x1Yk15STUwTjV1WVZTaENncUU3U2R4UyswQkxXRFpIV3BIT0pGRzNzQVBzT2EzR2tVOW1SRUc5T3JPUTFJK3NlUjRLamhwTmpDb3YzazYzQzlsc0RrUUI4d3FWVmkwWnBYaUptc1A1aEl4c0kwRzJWTzhrck1Eek1HdFRWT1lpaWxEbHhjbG50TkNkSEEzWkNzbFZSdFJJcU9odk9sU1hNRWxHTU5SRyt2NEtSYy9sbFVxMVdrczZNek5xRjFOVHFLa2p0REJZd1hQcnFZSnlMMjFyS1c1WkNSbnBSbFRrclFwZUxPRVhDdW1rR1htS2lwekdiSVFwSnJTbVFDbXQ4dFhUSXd6TGRYVVo1Y2FxWEdqTFJETUNOOGlpL2NVRkEzVjhZQ3JkYUpCclJvWmRNNTJYTmRlZTcwd095S1JsMU15UWd3WEZhaGJxZFdlSnNGelpWdlVMblV5R3ZCMHBSQ1hObWRYV1hFUk9Gb0VxbytyOGZDZVpiQzlucERmTnU1dGplVm4yMFhTcWRsUHhhUk1HTWxSY1hiNjhTWmdjczNpVUt4WkxyUmJSaTFPdVU4Z2pESnV4aUtUTWxSbmRXVHU3dEgzN3hpRGJINFU5Y3hSNU1JTm1ZLzV0OHh3NEIrUTU3WXpGb3dvSkRzNWdGa1pWZi9QcHZCblozYTdSYU1DUVVhbGFOU1pzT1ZHVXBTeWU5bk9VRnJZWEJDVXY0NXJTNW5NRXNEamx6NjlpR3E1YnIxTXVtOUVtaVVYSmpwOFhhZ1pFUzVtMHJoY3VNS0lFalNlVUM5OFZDQURIcmxudFhQTnFNbjZIL1BUQitvQjE2Yy8vRng0Q1h2SHZYOEhvMzh2M3F4K2ZOZXdoRVZDSURQWFIrMFIvVlFwLzh4L0kxenpHUzYvbk51ZHJEMkFtbGUzd0RYYVFjNjd6NFpZN1dFVnVyY1BzU1h6ZWwraExFK3o1UDl2eGFtK01BSzhFMSsraVFKZ2liOCtGTnVZT0Fha1lzclNMS2ZVeXBRZjRmWjRqV1BxQTQzVVBoZVg1b28xbWNhVWpLRGtaOVZiT2h6WEJxTHV4cjlCWEc3cXVud1hWTDFzb3RBeHRaRG5RajYwQVdmOUxiMHRaZjgvMVBObmFjN1dUUHZzSXlRaEJ0V2JIcVk5SFJ0dC84d2l4eVlXc1pYT01ORDBMRDZFRlcxaGtmbG5WL0JuaDdBSzJKOGl4MGdNejdvMDJOU3NncnRTYnRoQkI5SGJyZlpiMmZvV2dCdXdReEorNjMvYTdWUFpLMnZFT2hGZFdISkw4WEpQYi9TRnovZDhLOGo4akFxeFRzZlI2UUl4ajNoY0IrTTVWajY0eWEvdlNveFlEZDg1M0FDNG1hZCs1bUxHOGVqSFg5Wk9MQmMraml4WGxZWGV4VkI4QkZ5VjBCL3RxT2dCWW8vVmlIWUF4K3VLOXBRRm1jK3FZK0d5MkpNWVNrWExsS1ZNZ1M0Wk1SZXkxTGN6T2N5YnlSTzY0UERFNWNLZWx3UlE2ZDBKQm5zbE9VWHFHMjZsWVRHWk1CWnFkTENTY3lRdGNrUGx4OWtsWnFyQjBCTHlzT3l0TENERzVmVWRLUkh3eE9ib3I1QTFWTHk3c0g4KzFBVU5HSjQxVTFua0x4cHlGc2JURmZuUkRmR2k3N2hkNDRrRzMxSzhaZG8rTlVGWkxnL2JsSDNwSnZXblZDNFhTUDdlVXR5bnlLbVdrZ3MrU3lkRHl4eEZRY1ZoLy9nMkhTZWlJWmlCWlVSZEhwSm5paDBtTE83b1Evell2N2tiNEdqNWVhdlJ6emRZOHZlV05VRmRCVHkzU1hidW82bmJYa3VoYytJNDcycWNwb20zdTBacUJpSllzYU01ZG1uS1J4c3hvR0xzb0Exd2Y1b2k2YTFjUmk5VEdiazNjcnU2N1ZYMlJ5azZod20rWCsyNVoyeTF0ZUVxTWo5d1dLYmJkSW9FakNrVk5nZXptQzNscXJxWW5PWXBGZHU3T0FPbHlIcEpsczVlSXJDVXpsL1RUazB1SDNDZTZXRHplalJGMkkzZTlHN2hyN1RoVzJ6R3BIVk02TnZpTDhoYUo1QVdUWnNHRldSUG1PYmp6QS9mYzNJVWR4bDRaYm04NjRNeTA4ZE5xbkpxKzRwNXN5WmlaSi9TWm43dTAxcUo3ZE1wTG5RVFJFMURHSlk5YlBSQ2tneGpFRVB3RmZzOWVkOGUyNCs3MmJXZmRUUnY1YVhucGlydTAwR3hjNnZMRlRqdFI3Y3pZL1JlTFk0dnVRcVBpenM4ZWQrZG1QWGUyRWVQUityYmJtdDdtVHM5NTlVdFRYdHFkZEdQUTlVTnVNTDdzK3VPK08xNlBRUzAyM0l2ZTV2cmVpMk5kYzZ2VzJKSGMrYzBzcG51cFJhZVg3anQ5dTIzMWxMYm9XWDNSVDRwM2lQOUdOeGtuZW1iYjZLbHQyYU9yNkNYNlJsLzJmeWwvWEh2UWZ4SHZ3UGZCZXYrRmNFQjZXK3Z4TnV0cGZkWlBzbmV3LzVhdUF4NkdDdDJsajQvT3RBN2ZWZU5UaDBmNmlZc2orc0RJUDczMkQ4TTdrcWZYWUYyNGVQNGEwVWY3Ny8zSVJ3RGZkWGowOGRQbnIzTzhqRDRWMjMzeUNZSWZ1MTZEMXI5djNMeEdjSUNEVTNlRlFScnhDdlk0NmFmeWdnT0JsTk9EaXZvN2hTcnRiaEthK3ZlMkNBPT0pIGZvcm1hdCgnd29mZjInKTtcXG4gIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGO1xcbn1cXG4vKiBvcGVuLXNhbnMtaGVicmV3LTQwMC1pdGFsaWMqL1xcbkBmb250LWZhY2Uge1xcbiAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgZm9udC1kaXNwbGF5OiBzd2FwO1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIHNyYzogdXJsKGRhdGE6Zm9udC93b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBQjRrQUJJQUFBQUFONkFBQUIyOEFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR2s0Ymhpb2NnV1lHWUQ5VFZFRlVXZ0NCREFpQ09BbWZGQkVRQ3JBWXFFa0xnUmdBQVRZQ0pBT0NMQVFnQllSY0J5QU1oaFliQURLVkJ3QUFBSGdjZ0t6TFIvYi94d002eG41eUlKcFdpQkVpVXRTY0tyV21TcFRXWnVvOTZuY21ISzdRRVg1NHZGZUdFTjAzb3hJUkl0aFgrYUtiMy81RU8yazRqaFBqb0dNWnJJY1Z0M2ZXeUN6L0M4WWM3NEJ4ZTQwdXIraUx2dG5DcjJaNVd3WnRsUTliWkRCQ2t0bWY1N2Y1NXo2aUJTUWtGYU93TVJhRmpURWxWWXdJeEV5WTlsS2R5L3orV2tYNTk2TUtIdnJHYUg5Mlo4KzhDYWFSYXRyb1ZOY1dMU1J2UEVMeVJpcVhrUEUvMDFSU3JWSSthUVpPOHBHZmpsMmYxY3FTMjFLMldRYW9GSUJiWkI5dXFXZDdmbTZYaDFRcXR3bzFQRTNNc3lydzRVWVIzTGIzdjZiL08vZHVUOEpNNkhiZmhMdURzUFNsdEo1UVdnMmxyVkFJVHhmdTR5VEdFSVAyMXg5Q1VkU2N3QTh4Q1M1bFUzNHhUdzBRRklEK29ZNzJEMHhKZzdwZWV5K2lXeURUciszNnFoSmhCeERZWElvREx1b2gzdjkzemdMRlh3Z1UwaUhtN1VwRDFVbDllc1p1eG8rTnVrdEFpb1dtdnE0Ry8zK3E2bnJBa1Nic0R0TXBUSGR0dzVaU2x5M0xpUHNIa0xnN1FEcUN5bnNFWmFwUkthUlNTRWxXNmJRMGlDbTFqTFZRY3VsbFN0L2lMY3VlWVZ1Y3JjM3hhemo3ZVZoTWFFdU1oZ1UyM0gyNWw3UCtUZlNyYnAzdGxvaVFTUVNqbkhXL2xkYUFZT3lFdmlOTSs0aFl6TCtJQ2c3U0FWaUtoeStIK2ZvaTRTeEs2QlFxUm1Vd2tEb1N3MEN5TVByY0VNNmVUOVNEN0VxTHFSSmtOMHhGRlNDN1daUnZBdG5kUEhNMXlPQUJ3S1lEN1cwRU1uZ2lnRUJIeUQ0ZFg5d25jd3Bta1lDVGpvZ1ZGb3NRVEdWUjBsaDZKVjNKVllxVnl1a21PQk9yYjRaMHd2UURHTXBQUWRadmdxYTJEcDZGMEUrMmdqQkl4OXZXVFdubjZYcjBqdTM4S2FaeWZqTjNZTXBJYmNuQUQvbFlqSTVmQ21Rc1BnVjdkQ3ArNUZXUDExM2JzaTk4MUFRdS9MbHZ3ei83YytyL2diOGMrU1BxZEJiaUkwbmFCWGt4SEZKZGpoWkR1QjBwd3pFb01heEZhZWxzVkNpRGE5TmJVYU1zN2cxYjBWaDZMWm9SNGQzaGcraTk4REYwSm53SjNRamZRMC9DcjlESFU3NUUzeStEZmtWL1k0QVJJeGdkczg4aWRCL2dyWStqU0hIZ29rOWdHN0ZjNTJPemVKVG44anlzam5uUW1odG4remVDN2hGeTFTTVJZR0l6L0IrbkhxdkYzSVVZa3AzaTNWZEZVQmVBTU9IaFdsSG80QWFjTHY1dGh1dHdDNi9JallPUEVpaEVTa1NaRkIrQk1GN3czNkpHTEw0QVBRK1hnWi9xemJna3RUR0J2Z2IxYUFSZXhCLzRqWWpHRUJiZ2VZNUhlRDcxSGxhVnV4UkhRMmNpcUlPUXJmSXZ4YTVnSEcycTBhcU1YeVhFbEdvQmgrRXdMQStGbFZvdnBQbEVBRjI1VWxYcjdaNEpoWUFMWDJHVTR1bGxLeFUzdWNCRW4wSWVvY0JRVUVnUkNnbUZoc0tDQ3hqRkhqcUJQUzRlQVNFUk1YeHFZd0lCRUk3azdabzNjMGlhYW5nelJWc3RuSzBFbUZNWGV5azVGdldNdVQ4Sk52cHZMeUQvYjhNQXZRUUErSXZqQ0FBWlBLU25PUndBYmtxd2VlekZWWE1wUWdCTk4wck5DQUQ5Nzl0cUVCNHdSUFpjU0pxT2hVaWhqNFBPcnBLWUFOaG5FR1FBU2pFSEZrTVY2S0RqTmZzaXJOdkJVc2VwY1daY0dGZkgxenYyRThaU2xoTk9pNzVzRU43U3lubmxuaTVuNFRWS2Jpbit6SzQ2ZkdEUG9DbjljLzZVUCtZUCtYMStCNG03RU5mUXhoSDhhTGxVNFFMYjEvemJRLzMvVkY4eTNwbjhCcGg0aENiNWx3ZHc0bll0eXZvcE8zVVJaRmRaN1gyL01NczJFNGFxVTkxdmd4dktEZW5VWTZQZFd1d3hiZFNBOWRZWXRqdWVzZ1FCbEN6V055YnM5Q2E3TVBRMkF5ZHZ3b3pOZGpxazFhQnhHK3l3M3cxRnFyWG9NbVJLc1ViZGlaRkdyVFZycTkwT0dIK1ZTV0dVS2J2WlRjSFdzRVNqMmNLTk92UWJZbDZJcG0yeHgxVS9vYWM2OUxHYU5CTUVwS0xVekdMU09yTzJPRGlvd0oyNDBGdHJJVy91ZTA1MlRFOXRXRzhaSE9qdjYrM3A3anJ2YUc5cmJXbHVhbXd3MTV2cWFtdXFxeW9yeXN2eUdWNCtMT2F6YVJYOE4xOS85ZVY5NmV5THUrZVQ4WER3eGVlZmZkcnZkVHZ0NHFOM3NxM05SaHJyNnBadjUxdk5SaEtyK3JDM1ZZc1VkaU5jd2FGZ3J5SGtvZFg5a2MxYlNtdW5XQ05EUzU3Y0ZXWnl2dEIyVEpZVWVMRDFWOWNmYzM5WVdzcWxCM0lybVdRc1VlVVIzenAxQW0rY1dHd3hjbUNBdDhiY0I5dFdObWI3aUV5QVdzb3NBaWRVSnF0SXg0MmJqVDhmeDE3akdPY01hN1p6WHFmb3NUT2IrTnR1VEROU1NtM3dScXBiVlBhKzZRdXVDVHFWRnJGZnVBNHpBMHl3YXpXdUVjcmZYdmJLSTU0bmdoV3VCbFptdjZsbmxkVkhsa2NmbE13NlRjN1YwOS9EemtsaTNXeEV4azNzNk0zK21OTTNCMHRidDBEOGZNait3clIwNjI5Y1hFWWJCSW80cXd3dVhLbHhlckl6N1k5VVgrZFVuZlB3S1BRTmRUUFRtdkNLUFhyVUNBRjJXaTFxSXFUQ0FWMlJKUlVkOElFeHVGenhhdHZpRVJnbGlNellpNWlVVFYxdHJWNXRYRzFlN1N6dExxbEl0K3dYVmZZdlFoSW8rYldoM1RTRVJqeXFxMm44dzB1b0dzVWRQU2tqNVBGSVg4WXhCaXF4M1d4MmV0aHo2N3NmTHUydkRYWkpwU1RKYitJdmFEYnl5SHNNejJuREpzRVNRTlRnbmVKcnBCakpCdVN4bGF2M1NydFZ1bFlaTEt4ZEpNdHp4UzR1V2lSMzh0aTJ0MzNaT0N5WEdYMXRIWWUxRDd5UitRYXpMTW5aaWV3RUpkMHBGejVlejlDeXN1NTNjbnBIeWovbnpaR2pySkF0QzRJSFNRbit0Ti9xL1VqNi9mUWl1WWpFYXp1b3V2a042dTZHTysweXVWUXRjaXRBU3dnLzRKeHpPbndsNTdraVFoN1lCN1Z3QWZFOE1nZm83cVkrS0kwYnJkMWgybXhRSHBGa1dzMUdmeGp6RjJad2IyK0lyaUVwTGNxdGZCQ213VitwcFJWcktYNTl0Nm5scE8xY3l0OVhIT2FUV3U2b0tzYUJqVzdtUURQa0liUVFvT1BESzB2NS9FbHBwYm5BaXh6YjYyYXVaS0JwVURSMVNvNVB5YTVyTlJ2cGlwSmhxeHVUNWZLbDllN0xkUEZxWFVkVW5xdWJGMGZzb3dkOUFMWmdGREdQZTdyb0FWTldkbkErUzBKaUI5MURiUnhaVFRNM1h6eW90NHdoVnJnMlpRaEtGTmRJdXlvVEpLSkk4eUx5KzhFTnZlUkZNdDFEeXpQcWVvbVU5dE80cG5ERG1mTFJBc2FLSkxaOHd1KzBwdEpHYldhMjFEZ05keVp1bHgzNVVub2R5VlpLTytqMHNFSVdtNkdJSHpQeVF0d3k2a1poQWgyeUdpeGQ2WXh4UU42Ujl3VGFMN1Z5aWtuUklzd3N1T2Z5UVYvSVJ5OHQrVUVPbG5rd3JwOTZ1RU0yS3psbjdVRmVPRXBoVWtEdnhucUF6Z0ppS1Z4K3A4ZHZyTWpzUkRBSk5uVS9FSFc1WXpqTUVYdFRkZ1EwSXptT0VBTkk5NmljdFFzU0F6VENvRFhVak9wOTU2ZlNEWVRUM3NESWdTd29jWVVjZTBSV2xtVEk2VjJvSld2S3FLQnhsa0Y1TUFDOEM5S2R3cXlrQmFGTjZhNWZ3azBUVDYrL256T2g2cmFwS0R4aVd3SzBGdnZLaFhPUXNlL2VmRjU2RklHT0orbEFXUXM5U2g1VW1lejZFcFE5clJwbUNIeUl1ZnFaZCtzNUttZlZBZUF1Vm5YVVZseGJHb1hkNFFZRjVPVXRBK09KVmNaZFY2SjRjSUVXbS9KSU9YZGJEdzdvY1ltckd1R3ZvQmFmODgzUFFtZzlHaHN2TDdDYnArcHA3cnZkUGMvZ09hZGJlQzBnVGRVSzhhR3o4UGpRZmhpQUc5dXB0ZWkydjZoSVZFdzRlNEZ2ZHFmVURIcVV1SFE5elpFR3Zoa0JONjNrOVlxMDFoeTZpSzQ0c3didTJ1YnRFMDBiNHlXRzMyakllMXRZejNwZEJSUnVIUWdIalp6dmwvT2FVS2UzTVpDOUQ2VUZKd1dNMndYOEJIRHRwTzkxU1FScENaYWh0QXYvd2tnOUg0VW9OSTlNNjZBbGQ2SzhiSGRIenZOYTVXZWYwb1VEQ3l4VVoyRVlDQjRjbUZiKzZMN1VRbTlYMVlxYkx5c1NIbytuU0NtVVJsMUNrb2NWamtUdUlTVHdRRUZZQkVpQlBmUkdnMmVoYkdoQ1h0UTdIb0J1Uk04Z2JUdzV5Nk5UM1lQZU8wdW9yR2VCd1hyMnBOelhVdkgwM3VyMG0zUkFGVDVCSmNkd0ZpeWt0T1JlR0VDdFYvZ2NEYjJKN1lSYmoxbGN0b01zNDRtLzV6VzVLZzVab1NRZzh1dHArcCtqa25RQWdNRXI3S3d5cXlFc1RHRE1hVjRrekUrOEFITVZFWUVhMkJWditESFZLQUJiUlVrbEs0SlArVXBHZzR5TUpEYzNzU3RxMWFGS2xFSEpDWlYyYXBuenBheU1UblFmcUFaeGpaVHRyUi9jcGtkQVRyNnlmRkVZNWVhYndFdlRiRWpabU1kOTBBMk8yUFdzQ2E3Y1BVQ0I5VkhJVlJ0UmIveldoUVVPRDZQZjdCbU0vUFIveEEwQnhmMDJiNThFS3FvNWhOL3llTFVoUjVzRkU3b1V2TEpxUjUvWW40QWsvMyt3VXlobGtrNjRHall3UkpmM0hiZk5WN244cDRsbGIzOEswbVVqdlFyUUcxUDJlbi94NDBCTTB0QTduQzhsQkhnNG05L0QySWZhNjQrK01WN0R1TFNjVVhxV25IMG41UEtQR0htV29NVUd1aDQ3VUY5UC93NXZWZUI0MGs0S0poSmpkaEEyWElzRm9BRWZodGJpQzg0Yjd6UnNraUE3R2F0S2tRSEx1K3dzeWM0eGRQcGh6TjdTYkV2SHZydDYybDlOR2FlbVhVRmRqVkwrVnROUVVDT2J2OU9oQWthTVg5cWNFWUJqV1BuVVNhR0ZkejlJSmU1c1Nrc1FvVUQ0aXVSeFl5V0xwS1Y4ZytoL1FINm5RejE5MDNmYVpLZ0hOZEZUaFR3YTVvWkxZTDU1ZERLbFlVSnB1Y3hDd0xVVjVOc3lXeWluNUFScmpuREFIRjh0V3lDTDdLQW10RVpkczJsQWNNaW9HRWdsaStKeENiVDE5bDRKQ09jQjZSTkFid0Q4Q25CZkFDQ3ZFanV0TXZjUVdQRFlWRnlnSWNCcHdGRnhGRXB3K0VlOGQ1OFhWNGJIQy9lRUU3cXFFdy9vemgyM2Q1MDlkZmpROWVlSGpoelpjdXJHTFN1MjlZcThkWW41djJtdjJ6MGswUFJxSWd5ZzhUazFEaXNHQTZtZjlMeFJ5dHYrSktHeTAyMVJnaC9CYmFLZ0JHVzB5NGMxY2FWOHZSdE4xRk4yM2RpUnZDSlFPQ3ZnRk42NDAzZXhhb3A2eG1CZ1ZiWmVwMjVqajMvNHlrZXBoQk1rb3lRVEZlWlN3NGpudnEyNEF5YmQ3NVhBZDJCUDFSKzdHWmdpanhRbHR3czZRV0tIbG5VMHoxbzJMbG5Jb002N250c3F5QzJjcFNBb1VsbFRJM3dncjB3UWhabHlVYlAyRHBLSHU5cHAxNzRaQmtOcGtPUkRYV2xTMURPL1JneVdGQnFrcjY4MjU1WHZkTU9hR2VxcEYyUHpVV0pMeU92eWczcGxvQkFORUMxS3BQaFR2R2J2S3l1NU9LTlRQbGxxd001UjVYRnV1OXJCckNwZUZhNzJiSUpvOENsdEhLVHBZKzVGa3pwUjlyQmZJRDBmQll0WVlPTFdRT3EzRGVMOHVwSlNEL3BvNnlEZ0tkdEVUc0ZHVEdzVzFkOURSRUhGRG1OY05yMlg1cFVKcy9LZ2gyR1B1cU9VeFYwUGN3dFphRUhKRnFIM1ZoUGM3UHg1N2lkS3VwZ3AzeTZpTFNYYUpqa05IZVpVcU5yNmZIN3hzbkplajFmaVFwMVdHVlRhTmp0OFBkelZtalJwanEwcm85dDVxWE8wTFRvOG5uU21uSFVRTURDODNwT1R1NFVBaWtjQ2pPd3g5K0FQRGZiUGNNM2dONWZmNVNGZFNFT1lmVnc3NkRXcXdHam16Ums0YTR4WHVOUkkvTVdhcGlQWXBPL2VSVFd3YUVOVTFMVThMSGdTWmZ0V0c0blp5dUcvLy8xRkNQM3Q5TXlZYzJhbXkrK0RuZDA1bEVGT2NKczNkU1lnQWRWWmVUeUJhSjEwWStoMDN4KzI1ZVE0bEFSWWpoc3hjVHZ1Z0xqTTFrZXk5WHFsL2Z1NW9QemowU1RLNy9lb2pseHdLL3NXc0VMcm5Ld3FXbDN4VFRPRE5abnA3dXhmNzhlOGY2U1EwTVpua1ROdXR3ZDJVYzljYStod0V2K2dSWGo2eTlJV04raXpGb044elR0U1NiZisyNTRZM2w4SFZ2MHUxN0p2TlVyeGFzQmNPK3JhN1AwMk12RFBEZzlzNmtjaFNid2NBdUZCa1MzWFNyNzFxUFZ3d3V5NnR0OTlZY2pBejh4d0lTNjZGR0dVMkxZUGRJWUhPRU55WWliSU84Y0U1V3hlR3c2b1RaTHR3ak5YbHd3aWhsV292MlhFZW5JbTFDZjBNaXN4MkZJODNiRXlnYlY3eXpIWEx6NmRQZnBUZERXM3NQRHByb0tuZHJFK3RRdldSaTNWKy82N2Q5Y0p0MjlabVVzK2p1L21sZVplZHZTU1dNM1VlbnAwR05zOWl1TXp6aytRNmJBaS9NVzNrcUY0NGhneG91MkFPTkwvY2NLYXdCZ2UyNzBzaGxyUFdpZXhjbzg2L2g0YXV1SERJODZwRzlOTmV3WDFlWGN6a3JqZUxxR3VHc3Bma3BIbmFXUjVRcGwzV0VxMHRDcVg0ZnJhd3J0TlBWS1kxN05VTkUvN3BHdVhiL3JzOEpIRlY4NUpyZThKVzVteGJ0blppbXlHa3ZaSkIxdElEMTRYSGNaZUZoenJtbFJEWHFCOFFKdWhTNGV6U1p1b0hmaUE3c1BpaUlEUEU5Y0VMdUNLS2t3cytTNjFaWHZ0ZkE3MjdGRGF2Z09sWmM0OHV5V3ZYMUJBZkpTaUZrcXM1NFZ0TFltcGIvODhmdHAwNWVwMFZPUkkyU3kyT3ltb21EUkFzaEpDcTdjSndyM1BhOC8yVDBxbG5YWDA0SFg3REY5WVhYNzZwQzVOV2trT0Mrd21xQWxNczVYMVA4ZXlwOVF6ZFpKalhyckFydDB1MnRLOTM5cHRGMlBYRUxpTWw2czlVNkpJVVBjdEpzeXJSZ1dhSTRJY1RpRXRYNzZjazIvYVZ4eVl3RnNiS1IyK1dDZ3VHVit5NDRsc01tRUp5OEphYVpjZ0h3aXVmNnZRZGpYRnUybzBEaWwwWHVVRDZpOEw5NDF0blY1UHYvQU55KzNVUVVxeXE4cTVLaVJHTlJsUnovb1JYNlIySE0vWjU1Q2RPdWI3Vkw2NGpoVHA0Y0JXVUFzbTg4NGZ1Nzg1R2JQTWFMWnNTa040Lzg4MURtbkpJK0h6OS9Tei9FSzN1WU9VWkpjSWNja2w3enFmNUNVdExDV0xXNlNVam9kejUreTFoVHNpTG4vbWxsRnI5dkdsNXU1MG0yT3RWRmhySE1wcm90enJabnhZaG1zL3FNWS9TSjNkdDRqK251TlkxUEQxWDdsczJxNHBJZzJTTEJlV3BFNWFzZXp3WVhuaGNtRktGYjFneHpmV0hPb09xZTlDSGszR2ZEdWVKcWtpaFFWMUU5VjRwcWQ5L2ZtVzR3VmNQam1SRWlYYWtkNU5vT0lwak1GMU1XbDJqdzNFeFRuRVlvMUhpOUtWb3Q1RWk5UWNGMXRaRzY3R0dFUFpjb2t1S3V4ZUJMMVQ4TUhqdUlWZVJQdFA1bVVGWDlpSFpzM1NEQVMxcHhoVGVPLzM5SE53UWdYVXB0ZWgveTNvZ1JMcnptS1hzaDJETFVGK2RJYTdsMzdUQXRka01razYycFJPREVuTWRqdDhocS8xYzFBbkRMWnNjNjUxS2I0WHdiek1hWnFLTlRUSVJtSzhpU21NOUMzdTd3N2JDcnZ4azVyN3RkTFJUUHcrNGd3dXRtRXFLc1hzc2pwcEFhT0RFZU82dS9tdlhidHY2WXdqMnE0bGhXWVB3MWUrRnNkaFpudEFrbHROeElrMGFiQW9DaTc4S2tzZCtOdjlQYnRZWmxQZ3NIbU5VMXlvWk1oTmJ0Ylk3MStneGVOUDdwRkUwUDdWdWszV0xvME5WZXFuUlBwRGltMkgvSVM2K0EwRjF0ZmxUUUd6cDBUU3lXK1liaVk3RmJQQnY2OXE0NkN1MDN0cjNTYktnRmRUdUNkUGRUTXFWdVo1S2JSOW9oUXNoOEl0SzhWeFpvRzUvMmhtYUhMUTNpQmorZm9sbi9pNHIwbHNkNXhndXBta1J6bkxhM0c1cEJDenhKcEtPVXhKUyt3TWZoa1ZOeWxLKzAwMnlMVXVUZzNzckl4S1QrcjIyVjVRL251dmwwa1o1SmFyWHhHTExvWjBUSmFCNVpEU2tpUlMzV0ZUd2Z2MUc4TFQ2c3gvQjYwTE1aR3U1ZWlQSjRVc2RSRUdmY1A0VkdoK1BVZUtaQ1l2SS82clpQeStrbTBhRTVqMGEvWWFObkN5RXRiVVgrdGFGcy80TW92OWxTcWVvZnRhR2kyeDFqaWV1L2ZvdFBQbG85OWxkYzEzNWFvSHI3dTNxa2xiVm5oMEJyZzJtSzZyTkx5RXFLb3pJOXdDRnhiZmwyOWVNSjU5ZTBWM1dFWTh4MHZwS3JZK0ZqUUY2MXg3WEtKZFZIdmk4Z0lxM1hLeTBnUHJ2bVh0L0hJZjY0TXZKU0gwNEhXaE1XeFgxMS9PVzBxK3ppVjdLakt3S2tJQ1RqcWNSaGdqaEhidDVFVjZ1ZDY0MkpnczJENytBaGdxcW9HMmpkam5HYW83NFVWTzQxYjZjbFNoV2U4N2xXVDZiOHJ3azF1TFRzWkd4NnRPSlhWeEo5Z3NTbHk4YjVIRElIR3NxSE5ocEg2Yk9PdGc0T1pEQ25IYXloMEZrN05xM1puR2NrZDFEV3VSazQ1N2RJT29wOGpiSjlyRlJHeHZvSEdXaGFzSTRkTGhZdEtIMUMzNDZOSUQ0aHRJWHJKWTJwNUxqNXplY0E3SjZ1N0srYVZLSnkya0tMeXlzQWhhY0F4YnQ3dzlROVBpSmFUR205NzdnM1FmMytjSHVlTUJCejlxRGliZGY2VTU3VytrTXpmLzR0blNjS0gvMzMvMnAvbStKenJaaWZwTU9zUHo4VlB5U1pmOENVbEordmlCazN4L1dpbkxjOWx4bTZVcFhyMGNUM3pIbjFNdFpxQkhVMDBMUWNrRytmVWhDWHQ0cStabk9kWVZQcFVRUFRTVGN0djNjMGJPeThQTkJMNDBpdkE3ZGZhOFJBZmlmeWVjMHZmN0Z1Qnh6RVVXYTM3L1FHUGtRMXRwV2NDY09QazBvZjRDVzFPOWxxWDhQQ0cvTnNyV1ZyQzBZMXNqbDFMNGxTTHBlUEpwblloTTBWK3ZuT2I1emljaWZoc28wNGlYUEFhMFI2UnIwb3hLWi9pVlBwVHZ4eEJTL2tGQWhVTzhMdmZjMVhHOGlabTBqSlhVc2gwa2wzbXBRekw2aVhpVXZOT3VQMktLdnVNc28zUnFSZUdZb0lGUi8vMk0vWGtjSjlwdTNpL2Z2cEF6Y0dSWDgwNjFicnJhaFJSbmFkZk5XRG95SWdRVnpWWDFBdmFId2U2WUI0Z0FJa0hNV0FqRG1WbXhkbUJWTi9BVTNYRzJCakVPTHVLQUhONnJvUFlrVURZalpEbHp3MXMwNUUyUERzdi9md1V4ZlJWb2dqaWRDYm9nWGhqNUFVS2lsWU5DUkVTKzVRZElZeWZWTGtVQzl6cFVGdUVjS3dLMFNGU0FOa2pIV1VFRzFycE1CR3dLc0JPeEZGeDdQdGE2WE5DTnlEN0kwK3NRUHVBUThiQ2FYQUdJWmVpbHduNWhFU1dRd0JVNytobElRa1NFc2hFK01nekp0TTNqYUs0Q1JHOGk4NUFoL0VWa1pLL2wxc0gyc3ZKelA0R0dDZi92alFmbzJVWncxd2hPdHFnL1lRUW5XRWVob2ppd3dkWWk2d0RkNGFETGNld29wcmZXdDdrdk8vRVFYVWJIcWY5Y1hEL0IwZGFRZmIxandDM0EreEtsdG9OckJna0MyNUk0TnVLd29nU1ZTeWhISEw5U3Nrd2Y1Y1J0S2JKREJKcHRqckwvbDNIWUp0QmgwMllpczZmcTM3ZkVxYllINkQ2UnVhaG5PWVUyQktreDdObE9GNFJ3cnR0SVYzbWpUazFSbnQwSklUUHdrOXRMZlZPTFdvMGVqRUcyYnFicHhMYVI1eGlHMVJHanpuN3ByZ3RQVTRDbWdLRE9tOENZcVlHTU1wWnpHbDQ0d0FhZ2VrNEF2dU1FRU1LTmdjWVlCcFlwTUo3MDVwc0xpVHFKR1ZzYnFJMFIrenRiZkdUaHJ4dkpNdjAwTHByMlZzaXIxdC9uVUdwYUxSSi9jTmVISXlTNlVtOG9xbUZSL1dpdUxIYzBoQ1RJWFZ4YlQwTDJQLzIyRDNQazJlMndHYkMwTXhPK3Y5OVhsUndxSmdZYksxRUxrcVFRVTVtMlJVeFFnWTNzc3c0amxFZnJwVHJwU0ptd2xXV3BVc2hPWlhFVUtnT044cFRYZnI0L204K1Jxa25YUllSbkNNdkpMREZhMkhSdDB1Wm5ndXMyc2FwQkMzWHF4UWJhbHE5YzArNTJNTzRDcngwYndCWXlnVVo3Q0wvZkgwWnFmRDhrdkU2Y2NpMXEzb3hrMnFEZG8wekRzSjNTam0xWU5QTnVJV1ZnRzJBVXdub1RjR0h5SFl2UDFmZ25ua0dqVXZwL3VxRmxZL0NyZmRHbFJCWXVlVjNscUg3VzczKzNzNHI5ZnIwdU5JZlRqTXE1QmdEbmFZb3dCSzhqNTlLb294T0djZHh1VTFUN1RDaWd1c3h5eE1TWk8xZ2MwY3Uzdm15aWVLQXZuZlg3dnNnOFdqbEFEM3lJQkNGRW9xQ0VFNmN5ZWdBRXNKdm9JdlpRZWFYb1lYQ0ZLZ0x5TjR2eFpBTENVSHVtZFlYREFiRG1Kb3IyZ2k0djJSRmdma0JBQUhBaWZpLzUweHptMGkweWpRd0FBTSsvWG5nSUFQRDZoV1B3Nzd2dlZYZzgxUVZEaEFFQVFPQ3Z5eVRsY1VLNzNBLzBMejBXSDN4QzNuWStoK3RscnFqZFYxVEV3N3A4aXgydjJiY1VtU2RqMld4cm5GRlYySFdxMzZqVEhucGZ2TkY4VmMvalhNM1MxTDNjYjRWLzZFY2VVWjVUTXZ0amlreXRrM2ZYbkQrOEhwZW9CcS9xVUpTQVdRcURtOWZxL2FxNmJQbzJOUTlPektSbGJsQlQwSWNSd2Y5ZkFxQUV3TTRUTFJwcmMxTE9zekViT0RBT3NnblF3T050WjdLbitvNzZ4TC9FUlJaQkFCSk00R3RFZ0dFSk1BTnc2NHQ5Y0JBQWh1MVB2WklDQUFjQm00M1lPemdiUTNkbU5rNklHN1B4WlA2ZlRTQUt4OWxFanJGd2xwMlFTRmtNQWRCamFEWUNhcXgzOGRnQVNEUXh0aDZlaEYwY0ZLbEdyUlltWlVxVU1wTlJDRXg4R2YxTktmS1QxVHBXRFY4bkQ2eCs5OVZNWmF5Y0VnVU4vSEFOanBYZWhVa2t2SkI4czFyUFh5eGdTWlVvRXhKT05wKy9nb3BYY1loak5TWmJxVWp4d0tyVHJKNXlhOHk1OWY1RGVWdkE0cEROVTZtc2J3cm1ML0J0K2hLeGtsbnNic25IL0JJL0dMUlB4U0tXWXFBbm9zeW00VEw4b1dQR2VrMTlraEFGMUlyYVhnbC9MRmJwZ0NSV2tpcE1GaU5ScW96U3oxS2xLQXhFa29Tb1FyVzFTV0pZdzg3eTdsa2NlUHJwVi90V3N5cmhBV2I5SDExMy9yMi9SeEEveHphK0Q4SGtRVXdjRXVPN20yZHNyK050bTJka1ZlRmwvWDBNTFdrOExkdDRYQWpMSWhoY1ZuRTNFLzBEamI2QmkrdkpSczl3Z083QlJ0Y2dvWE1rSGFPZ2ZlemdwSmZRMnBPV2pqUjNkUTdhR2ZaYlFVTkx6TFVCTy9VUHBwclVPYTIya1RVTlhhYTZLYkZXa2NxeVRLc29aWGtodExKQ2xoYnB2SktpZzVVY3NpajN5eFRtMnl6bURpeWtkem1mUXVabWtEa1pUOHRPWkZiaXRNeFlaZ1RRMGdOcGpPUThhZEVscVdHSGxKbUJFb1pkVDlPN1V1Y201OUc2TS9SN1V1MWJtZXdYNVNWNVlYUTdwMHkwb1NWWU1sNkhqTk81VW1YUzg4U2FKTVk0bU9pOWptSytsMEoraEhTcVRpSStRenhrTlUvbHlwZk1Ja1F5b3JWc3Y0bkVFa2JJckVQUTMwdkFiNExmVEh5OUFoOVBIcDZBeVRqbG1EUndnWGdhTzNEWUVyRGI3TEFaaVd2WWpFbVJNZFovaTZkeTNodk1SU08vS0d4eGV3TTdpR1d3TjdLTURBWGRRRkRnRFhRajNzakVkK0Yvd09PWU5ydVRwcUFhU0FxaUFlV0FZY0ZJTlJLTmQ0ay9FREV3UG9BdTcwQzU0d2ZBc3dCUkZHUURUb0VaeUViTXlNUzZzQjh3SEF0d1NpVUJIVU1UYzNxZmhHTWttN1p6anFMT21FUFdPWGRkZXJCS1Rmb2MwVG9IaHNzWmFlOGlOR1ljR0IwRjZlbUV1UWxkMm5zNDZQS003MkpZcENhaTRYR2RJK3JCaDg5aG4zb0hEQUlJNk5HQzRlZ05DaUNFSkZwS2VSQUpZRFNJeGxhdTJET2hBcm5YaG1KV0hISUJBQUFBKSBmb3JtYXQoJ3dvZmYyJyk7XFxuICB1bmljb2RlLXJhbmdlOiBVKzA1OTAtMDVGRiwgVSsyMEFBLCBVKzI1Q0MsIFUrRkIxRC1GQjRGO1xcbn1cXG4vKiBvcGVuLXNhbnMtdmlldG5hbWVzZS00MDAtaXRhbGljKi9cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGZvbnQtZGlzcGxheTogc3dhcDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBzcmM6IHVybChkYXRhOmZvbnQvd29mZjI7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R01nQUJBQUFBQUJ3VUFCSUFBQUFBT3lnQUFCdXhBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdrb2JJQnc4Qm1BL1UxUkJWRm9BZkFpQ09BbWZGQkVRQ3J3SXRuRUxnZzRBQVRZQ0pBT0VHQVFnQllSY0J5QU1oaFliVERZbDdOZ3JBczRERXRMWmYrWWsvLzhoUVJzakJPMFByVTJraUNaRmpBS0xZc1JpT0VFUm1maFF6dG5OTjZKcnF6dWFWOUJQc1ZveEphMXJiSUdoaDBObjhhV3hmYWI2UFZ2bkRBWG5yK0ZjREF4NlZ4U0RZRGhFNTEvbU1ZaW5tVlNKWTN1QVlvUWtzenhFYzN5K1NXWjJjd0RnaU1vTzBGVlhBYkJRcHdxbzJmMEtXVjlXVldoazNmM3NUM092N3k3M2s2TVFmeXBnaWo5L2tDa0VDZVNuejVYVGR2TXNEUHF5R3VtQ0hyb04wRFk3TUxiZFlXT2lIbUJFWW1CUk5tRTBZQVlHVXd3d2h6WXU3TjdtTDdwZFZENytVODcwL2RGSWJFaEtwQTJRVStSWkpFUHFXU0F2RUdnVFZnSHdobExSNmFsSHdzc044TVFDZ1IyQzBJRDczL00vYTZWcUUvYWFBako4MVE5cnhtR2E3aUhEVU5aU3IwRnFtTTBlVGdFK2JkWFA3ZktVVS9zWWdtaHRkSjZDb0ZnMUdKZVpaa25iQmVYYUZ3OGVnbGhyb1QveFpVL01YajFoR2lxaDBSaWlsVUlvNGVMai8xVFQyZ0VHWTBKTHJaODJPV1FGT29XaU14MVN4ZElwVlM0cS9BOE1pWmtCZG9kWTZTMUJjaU9WRXFWTU9XR2R1RnFIbUNwWExxbDF5T0h1eXBBNzk5ZWw4cXFyQ3RYWGRtcUsrdnd4NW5mUFZmMnhEQW1GdUxXT3NWWTNpRnEvUGF3U0VnNklPQ21aK3oyM3JvQlpDbkU3MzViT2hZWVEwU0lkVGJpT0laU08yMmdkZDFYRWlPYnAyNzNwUWdDeDlVejBYK2YrQnh1eVdJOEFoalFwNk13K3k1MWNLK3hUSzdQak1IOXVkbUFNdXowLzBEZTcyOHU5ODVQam1ScjJ5MHhIK3hTZ2JzbnpZODFXc1dUelZCOXNQM1VxOWpzTjJLNTk4b1VmZXFTNW1tb0M2VzRzNHMwcHdMS3lGa0I4QlNBZnJ0WHJsR3hRaXVacXY3RFpSY2ozbnA0ZkptengzblBEOHdSQS9DOU5QOG1TTk1PRFIwZTd4OFU0OFF6eHhrdWpIVEQ5Q01oaHBWSlBTZ3JvQ29rZHNwN0ZCeW1MMzZjZUN1MElzOGlJNFZnNithbjlwZjJyT3p1a0VCTWx3elRTWXlnV1R3NmQvTnorcXZwSGp4SkRadjE1WFZ5ci9pOTRkT3lSK2FPYXRVc0FRdEhROW9QcUF4ckxveVFKR2pCZXk3Zmk2S29oL1Q4S2RWNTZBeWpGY0RMSmx5SW1SZU4zUXpKampBQ3dwRW1uN1ZKOXZHSHRtcWQ2b1Y1blpJYnZwMHFOYlNhVW03U0ZtSWhFbHhZVGNWTkR5T0c4QmhJVWNJbCt0NGZWd1NmNlRiZmJhc0NZZVJYcXRlazFhc1laWExuS0NUVGJMQlZQdFhwaTNmb01tVENyWEpNT2tyTXhJYzZPUlpkWjhkelhiMU5KcU5teEk5cGkwS1NUUGlGdXFsU25VWWV0SVVjMWZKUnAwS0ZIbjBGekJTSm9SK2FLNFRvTnpKTjNVNTdlM0N0UmFLZ1hDZXRxYTZvRlZlK2V2ZWJvclphY1l2RE9HcTJrY1BDMmE1czZoaWVQSHozY3E3eDdzUHZOWnIxYzNMOTM5ODU4TnAyTXkxZHU1V2RPSDg2U3ZaVHoxOTJaYTZDU3RiYisyYlJXQmkyaFgvZzhhTFlFc1hSbXZuTEZTQnZqTlJzSWNJclR3dGhLNGFMdkhVSTVJMmpOdk5COHpmTmw1YWlRSGdCeHdrYkNkZm8rVVBOU0NTeW5HRlYydW54T3F3dmNxRWtBclFWc2t3bFlpTitmY0hUdnFDWjBvaWV2cmVhZkVzM1dNL29zRzNhZGZiTmtGS2RrRTc0Kzd1UnNLNk14V0ZLZlZIVmQwVHpnbm1DenlzRU5Xejl4MUhCa0w0N3JySHU4eTkrWFAxS0EyeEJCZyt1Rmt4TFF4MXJXc1hJOGRkZFN3b2E4NzZQRDE1UHZpTTF3WUdUSVVCYnVwdDhhQ2pxZGFjc1hrd2pjMDluOE80eFllVStaRFBlTW5RRnhxVEFaY3F3dzNabW9wL3EwYVl6SVM0cENUejNGSzExZUt4UUpjbXFRc3piQllrSFNtcmtQaGdhek9CVVFERzRaZ1dmQURoaUdtVnpyTEJnaFdIcEZGR0p3WGs5WXFqQ0VLUndXWTVlRVZDM2VTUzAvSXNBa3ZPdFFqSHJFbyttUklubWh2ZitTSWxxWTNoZ2V5cGtIbHphR3l6Zm15NXZYK2FaY0VGdm0ydkx2T29qUkpRS1laRm54UEp6TDRhQkk3TFk4dHAxYUFxTkRhQ3g0elZWRUVSVEhJTlpPZnpSbzR4L2FqL3dZWWUrVEhIZWFmVHIzaWt3WEtabC9QWmZ5WlJWdjduN2QxSHZDWUdYYzRXZ3JjZjVSM0F3SzA0YkxvQnRsY0I1aXVsMXFkaW5GZmNHMlN5a3ZwU295WkRUUXVIYjl4T1BlUk5QZTdEUDFXYUtxT1lFVjNWZXc0eXRsOStmcWMxTWplaFcwRS84YkxyaWdadytrd0RVUnhNTHQ2NjJQY0JzSWp1RHhsVTY4bEJuam44MkdBeW9TN3RuUmNEQmZKbkhmTHZhY1NHZy9FcitDbGg0ek5qRmJiMlEwRzduODROMmprVGZ5aTZnRFlSWEJaQmZlYlZKdzV6VXJPVklMc1FTSGdEVzNVVldaZlpGTjVjVDVjOHRybDhRWDBrdE4xTlI0TGJJaGZXUTBIR1FQb3BxT3oxQ2N5enJ0WTVydGF0M2VWWFhndXZMdTRZYmxWdmRCYkkwSkZ2SE1waXRTV2lKMVhMUW1QUGt4WDB6SmxUUFUrbkh6YkxGd25hOTVkS29SRkN3TVNmSmpDU05Jc055TkJFTThOU3pMMDh3QXptMlhSMUxqbHpFWTFSajN0dDVVRVY0ZmladnpSM3ptTm1DTXlWaW9UZGtyeEFlVTFPSVBObzNaeTVLcnRmSGdsa0dpemtrZ0ZaemRGWk8yMlNtWVFNMFpNTHJrSE90YktIZ0tZVUFlYlRRMTFESnQ0d2pEUjY5Y2hBVHJqc3BSSENYamorQ24wU2owNXRTbGpvMkFjdWZtRFFENitacWNHYkIyZ0JaL3R3U1VpcFE3R2dpcTBKeWV3OUl3YlRsMmNJTkwzd1dhZ3pZUWdoQnhzUzdZK0M0VXBCTjdiNnhucGUvc2h5ckk3a2pvREJZcU83SlQzQThsL3hTUGNnVnVzeHNzRzhxcHBOdGRqRnJZUTl4OE90OS9QQnpVdGsxY0RQZDRHVEZoVStkSnBCN01uYkpYdEJsdVNNREtvYVdlMGhsUi9Sa3hac2NIQ3V5QkVyM1ZyUGpOaXFEVTBkUGdKU0l5R3FGR1lJMkZmQ3VuMTRkYVNyaWxTVitZSnU4enRibGxwUjJwUTB4aTZFa0xaeSt2SS9VdTVYR3hETytjbXhFbG5Pa0VSTFFYa3RKVXcxQlI1blJiN3prUk8wSFdZeENSVDZ2cFBqcTBjQ3dLREpIM2JaQ0dOVFR5bWxlU1lhZHhQYm5SSDZnc0hFMWJUcnVSdktRc0puWHZVTTI3TlZIdC9UeUIxVDQ2UkI1bWZJbktRWVhEaWNtbkhoa2d3MEZyR0o2WXhXT2lacWxRczN6RHNkbWVNNGJOU2QweDJMcVJrTEZTQ0M4NEpEYVl6UkRBTGtWWnlhcUV5aHR3VFFFOHljNUdGSUd5Qm91cHJJSC9Zb1dNM1I4c2lMbG1Zb01lMFA1QWVwSDgvRG0vd0ZJSTdiTjEvY0lCSCtoUCt0Z2p4RFRNcWNXaVpXRGpqcC9IZkw1Q0UwczJrbEhBV25rT1EzaUdYcDFNYVVCS2NPV0MwcEJRUURiNUtjUGJ3VGNzRWtQWlIybUNPeVBkQms5dGdxTTNxVElEUHcrT29JdFpSWWJUT2hMLzhWWk9uUmNtYWV5NE02cS9CSXNQb1ZmMDFLVm42Ym9GRnZhRklmSkZ0SEdkQ2UxYlYrUnNWK1IyOWZmNGhpMURKMXFnTldHSiswajYwYmtCN3drSXVJZUYxK0VJWG9SQ0VEN0w4aVRDVlpiZ1RTWUl4TUZqY3VZdjJDQW1zbkZxOUhHRCtHd2ZNQ3FYNkVUeGpUYnUySG5jdzVKeUtIeEU2YWhub1V0YWJsTzF6L3RNbGJBaDhlMlhBT1RMbmtJSjlRcnpidUdsc29RTnEzMFU0aHViY3F1bkZPcDh5Z2M2UEM5NkYvZzlzZFJLMlBrV1JrU3JORWZCZXJlaDhzdi84ODdOY0hySFZHOEdpbUxvV1Joem43Um01cnc1a3d5eTRmR1RqbzM3QmNtSy84ZEVEU3FYNWlSMS82RkROODduVGRsWHUvS1hBWlpIbXdSeVpLS0RDSjVaUkQyaEhMdVJITEM0RDdwWS9ONk9qRSs5OXpMK3N6bWFyOTRndjhpNmNweFQ5b242NUIxUnlCODFWbk1FanVzMGZ1aEJYeCs5dWo1bllSSXhQdFZ0eEtWOHArL1F0UzZCT2s3ME1WY3JscTlnZ3FZbU1Mak1GVjhYQTJnNFYvMzZOYmdmeXZ3eldaekpoWGRadC9xcFZCMUpHSTJnNlBFdGYyL29xT3Z4bUg4d3ZUcUdTdytkVmdOeTNkM3JYbnozTG5kL29PcmZkWUpiZ3hCNUExK1ozTWpyTXlFM0puSWxPZmNMSktEZVI3Tk5OcTVUZjVEdjNGS3ZySjF5N1BzNDdpTDZDZTZ4WHh2OTJnY0F0d2EydWZ0NjZaQTJOcXlRTi9mY0o1U1JDeFZ3MTJiWDY2c01DZ3hZaUVHUEJodkZ0SlA0Q2NnQmNLTlN5bzlvSHBUcVF5bDdsTkwrQkF3RUV0d1NQM0NKaWdxZ0hEeVZXeXBvL20rTmtwdURVMEx2Zmg3S0pRbkRuQkdaK2gxSnpNQnZ0MDNIR2ZHYmJXVGRzT3VQVGNhK3dNekl6eDN4MmFMY0ppWmZFZ3Y4a2ZRQmlzcFNpTGx4Z3dsZXUwYUgrRXAweGFpSnhEbDhCQ3JMYWU2V0VkczNpNE5COXo1RGV0ZjZtUzJWc3hIYk4wQi9BVkJmdjY0dERIYktQaVlncFdCdGdPYlZGTG9yb1Bnc3FDd3VpcVZDNXgrd2psZ2pvSmRkZzFaQXNnUGtqbFN5ZzFpMitTQUxQT1JrT211VWMwOWYzZVVTOEdVK2FEM1Y1MHF6Z0ZsazByd0p0cjdFYjc2UTlQYUxzNzBmR01mVkFGQjNCSG5TRHE1T0JTZENjYjJ4ZnEwVjFYekNHREh1Y2pHckFvcS9maXNCWWxEVmI1TVZac3hISE9RZEVEQzEyQlZLQkZsMU5RWHhNNlIzNjdyd0lYZ0VzdmdjUWF0RGdZNEszZC9XdkJ5R2hXSXBzQ0E2UkFkcGNNMlMwTS9IV0pMTDlHMEp6bHk1WVgzcEJ4b2ZiK2syVGFodjJUOXRBSmxEZnVQKytWWDVLZ3ZxTDhlR1hiM3BKZHRicXE4emlLTWgyajdkZlcyQndhWEplYlBnYkFyNVdzNlR5WElleklmS2hrYkVQUHJKQmlDTHVQbEs5SHF5THU4UlhjR0svc0VUT2JQOEdCb3hlVElPcW5SNlJhOFkvUzIwd0FzM3ZNNzlRR0lqdHBYZlVFem1xckVKYytiR0RYTWRhRjZjRkRDWHJGRDhQV25GRGpSaThqOUwyYnIwVEJEVEl5VzMzZWRKNWFJRFJITEpmYzhaeE9kc0s0NCtjNGM2UEZwZ09CaUR1Qm9iVzNkZFk0c29abHlZd055bFRsNmhiVHBEb2hNYzd3TXpIenpGM2ZQNE5SVFpxNjh1UXoycmsyNlgvL3B4bVpUZWEweVhKeXN0SVFMazRmcXdDVXU2TmxPTnNmb003dkhrM05MUzdkSXUwaVZ3a09PUzFZbjZGNDlhVWx2NjJGSXVuYSswZkpXN1ZEVTNXbm5Ddi9nNzJsYXAzT1I1ODhYU3VjSEtrd0dGM2N3T0QxNVdUQWRoQVQ0OGNHcmZ2OGw3WGE3bDZYRnQzZ3ZZb3lOQ3h2NVJyakpYVFhJeW5yMjkxZ0JLbm9TZWxFOURYMnJuSVRhMnZLdWhuVC9LNU16b1ZLRzI3NWhDSFQyQ0cybDcrWTZ2N01velVqSjRhSG8xN0hCZkhoeGo5K1JqTlhkN1lXcE5NTFhyc1kvZFpyTHlLQVZrOVpWUE5oa3UzRGx0MVJhMWFCR0RQRmxlYnIvV2VWRFlOaDZhUk1sMkljVVFRZTlRb0Nna2lmU3VHcDhYWlRUNWFqVUZTL0xMRHNGbHY4RVVpN1RzcWdTL0VtSUN6Ni9QOEwva29uaWUyVWMxL25KS3dxNGFFUTFvdTNTR1g5VzdyWjRYU1dzWlNQM3NPbUdzWXFFbUZIUlhoMjZ5cEJtMmtYRTk1aFo4cmVycmxqV3BURmRxVUVpQWlKNDlyTzJ1MkUyYXhMZURlcmIrUUpNRmJocHZaTG5mek1NdlFQbW5VdFhPMUtSOU5lbFdaK1FPWWZOOFNGYjFEdWtnKzJ0VExVL24vOC9rUW1oS2sxZWVRMndLc2RWd1o0NnZWVGszaEJISWM0dlA4R25EenliV0NkcVZhOVVpK1FSaVdaUWxLbUpqKzlCVTkvYUs5VVNkSUZKSUdIV011K21PNFFMMzBaZ2xKRFhwWERVeldabGlrcDdiMjJ2UGZ0THcyUmMwU3Bla3VYQm9qYUNRTVVXMTMrQUxTZVRxemVVdnVXejBiaENUMGxjc25tazNGdkxybS94MEZJL2QxZzVpWkVUa250OGZ4RkxDWXFKaXd6YXFNdXViZStIT1huRXZBN1M4M0V3U3RFRjgrMksveTVqYTBqRW12RTRhRWVXdXV0eGJlLzdnd3I3ZFhIa3F0cE1DZytEOWF0SDFkTW9FbjJmMVFCNnFmVGtaemczSmM2WkVFVUYzM1FmMFQ5U3VMdFdxckRUY00yNjhwMXU3VXFKY2ZMY3B1NnIvbDNjZzh0WnNzazJ5anFXSEZIbTA0UG9pc3RJcmN3T0xBK0lxZkFaeE8rS0s0bmdPRUdSWjhmZHVyNzltS2l1NzZOeFE2Wkh0dzI3VVRtK0lkdzdzUGxISjRXcmo2TGRKK1E3ZWJESWtadytzdXhNRUV4SVNBdjlrbXJieFNsVkZ6ajJWQ08rQ0dEY1BxeEI4Z05XUlN5MGR0WHpTMUNOOEM2TGQzYzNJZUg5clh6emV3alZiRXdTai90L0ZudnNGUHBsUitQQjI1YnlkSmJqR2JRdXRMczRhQXNxZE1BbG1MUHdIa2pzZVlrLzZTVjJiRllOQjIzbm82SWptT2s0U2ZwMmlkQmdmTDQ3SlV1czlrOGpkV1dPRTRneE9ybGNWRGtGMHVLSzVZMHZwS0QxdEZsUDk5S1czVDVtZnFJOGd1cGNyeEs2SVZNTElOZG5KVFQ1aGlvMUMzTWltbDYvNW1ERzJQei9XRkJWMmJsOU5DaW4wRTJmQ3pFaWlXN2xDL0FwUEpZeGFrNTNjN0IybUJGM2ZHSGMvaVpuQjAySzQvWGFFWGgvVzlPeU5ldHhQS1lmSDhlbjgwUENJZ3ZoRWRaMGNkUkNNRlltU2c1dll0bVFjdGFlVEtEbnh2OWxyWDd1ZFhwQVNFNS93ZmVhR1E1Sm43RENEaUV1SWljMXFpWDkvN1lqbWRIb2VibHhqbGs1T29PeUY2Lzg5MngvNXlUdlFqWlNuM3BnWFZIeEwvZDkzOHZxU2ZLY2Y2RzlrcEhkOHYzcnhTSWpzSjIxYW5DdkJOOEl2VU9rVXprNTRtMVRBM2syZXozQk1Jc3dxSWNLSmNiOXRENnhqVklNSVNTeGJONHNnUFJYOHBjdk1DWlBKdWhrRitYUUxzb0VqY0xwbGxwMW1wTjk5SjRSSElCWWh3akl5bTRJd1RwUjBBb2FZclYvWTF6WUVSRjFSV2U5R2cyMHhWQzcxTHVad2tVTkxDTDVGeU5ldFFMNzFDeVNRODR3YUJZRzhXMmdNcmwzaWVZckk4RC9qdVMvckVva2IvSXhNZFhlWXFIT09oS0NSV28xeGJsNCs5SUFBcFZPdzdZa2JWQU1KU1ZGMkhtYUJHRFg4dzBzdDlTVnN2WXlDZklZNURlZjRwVkhQZ3BhdFd2cFlsajRva2lsN2Z1VVVTY2VKTW53YnhuZjg4cnpuV3VINTc3UCtiRGVpWFdudlFiMUpQL1Y4YlE5aXBZSGNCd0dpSXd0NW1oS3NEVWV5RHpBMU9DQlRtVW8rVG1pRlFxYVlha3N1SFRHV1F0b1FsZStpL2h1S2ZzUGNoN2tsWnIzSUZnQUhLdlo4eWd5V0hLVUJOODVENnVweS92U1hzK1pGbHJ1U3YzTlhjaVZuTlg4Qm1wZWdkODJVczk1bFdNc1pvdHlrcUtiZTYzRmdMYzBUV0xsMXlkNjV6djNxM1BXU3lWM1B2ZGtiMlJ2Wm0zU1QrK2NOM2NTZ0V4V250ZzhRSWttbUl3UnNwdWFnUGxIT3dHWVJxK1J1QXNLREd2SW5zdTdsL01nbEErWFl6bGpoMEx3UnNsWUJ6WHpJV2dOd1UwNDdHd21lNkhHRjBVUmEweXNSbXhtY2YxQUVTcnh3QTVuZzAzTmFDREZLdFdUVHhiSlFQQlpDMmJpa2t3eEZKeXpaZEcxaEtOcHF5U2JWMlN1NXE3VTFlelZyRFVERmx1ejBvcWREekZCc2lkWlIvUzU3S3FQd25lM29oVndheitSU2UvbVFzMkFPdzNsRW05WWE4dmN6VGlLMVpqQnREZVVTcXM4VVdJUG5rT1l3Qlhva3hBWkI3Mlk0ZXB4aDZhTU1SMzh5TEMxaE9IcWFZU25OWTkyNURyNmxlZ3hIKzBKNUNRMnpGT2VYeGZqTGtLVnpoaWxTR3cvdW5CdWZDOXZ5UnRHamhrTzNmZC83QUpaTys4MTNQTVNBZkxJenNjZmJqSzhYQWdGMXFGWXhBZlBIbmNZZE1KK3ErOGJHMjZxVlJJRlZaT0M5N1Fma3I3MTllS3krckdyRERmRTZsbHBld2FhVitJekQ3ajdaMTZJbVR2YW9KL3I3UFVxckNkSjVLK3BRUWVlK0pkZ0ovZTBCZFAyNUNDck5YZGxGTjdHM3BSdTI1OG5GV2gyVTlUeXgyTExEVm5HNnk0VS9ZVElCaG82QUlKaFU1TVBuWW1RK2tIR1NEYkQ3bWozZXBwdTQ4K3RPMnlQTjYvNmU5V2gvUC9pNENVellleGRxdGRWb2hNNmU5bURQL0dVUlZCbGQyV1c2dDNVZWJ0aHA4KzZaN29EcGV4ODlxcHNjYW5YOHBQdnAxVU9TQTFWdG5jZFpLN0hKSWhrU2YwMnl4OGUySnQ2eklmVmZxajgwZ1E0SGh1M2FzUVJYcDlvRFNDK0NhbXBYZGpHOXQ3VTE3QjV0ckxjL21ncHVPTWJXbU5paVJYVWYwMEhVME9DZ2xxK01oZEN4cW1Bd0lVa3hSZGRFQW93eC93bFFkbWJxVXNPeE5TYTJhQmlqVG5SQzFOQXVSdXBTdm9yMk9qYTlWdWNsS1diWldpaE9MTnEzVWZlcHJEL0t0cUVIOWJ5a3BxNER3b29BVlZEMENyZWFyY3E1K2U3TUJxVkFHQk85REJCNzJ5NzNDMzZ4ZzQ3UVZBaE1CNlJ6UlJRcjU4WFBTd01SRFZPcWRJd2Q2TGdxWTFzUTBOenJIWkJHelcxQUFQN1RYblo4MWZ1TWZLNGNYZG1XTlRURURSV0VZWnFDdUY2NzVaMExza0QvSlIzUGd6Rm1xQVJFR3hzT0JFRzZBcDdMazNiSmRsTURJRURieVZoSFZQZVVOTXNjcDNsRWZoTXI0OElqa0VwZEdXRG4wbXYzcWdPalVhUDJta2V0YkszWnhKME81QTJNQkUzRjBsMmlIUzh0Rmllc2U0b2I3K1Y4M3VFcWkrTldFUEFFbEczTnp2WVhEblJIUm53SnlyUEFRL0tMM0dvZmhRaWhkL2NVL2RZZzV0dWhuU2xxb1dlVzZrc0ZsOUx4dE1OSGZxM01qaXR2bnViQXByVnMvMVE4a3FST21lMGlWeHV5NlBXR2RoaEczcmt0WDg3MFhTdUNTYUdwN3RER1hsWDl1TzVsMjR5bmNlT1l4SHF0UEI2RU1DS1NNQklPYzVVMUJaTWZsZ2ZwYW5Sa0lDQnA1NFNDV1JSSk0yU1paMzl2UFNSbmNDV0lMUjFvR0dXRVh2ZU82Ry9ZVTV5dWJFZktnWjJPKzJPcXN0N1ExV3NDc3FaVDE2NHc5SUVkS1U4WERNZE1TczdBQlRQcjZBRHZDMkhCbWNNMXRzN2E0Q1NsMHZSWkJteFhnakRUNFQvRm9YbU1USHRTN0xSa2pOR043VWc1c0hQR2ZWK2Y5WjJTbjZDbDNzZVpENVRUMmlWWEwrN1NWRTdiYnJnRitRazZxZmRSTGp3SzJpZHA4cTR0YUR1eEFPMXQrZTdQVzBFYTE2M3pOdUphbzVZZXpKYlpjVnhsZnduZVc0N213alhqdFBhZjJSNExzb0YwN2xFdjNXU3lHMCszaG9mdE9lWUl3WjNENEFXS3ZXVldUWTU3TTgrUkE5ZHhaS05tZ0xNUjFnaVNoOUk5QkZHNk1ZK1h5cmc5N0pveVFvOEROd2ZOaUVreVBpMGViZGRET1ZqSjNkYjJOSzRpVHhZdlBMUzlMNEFBQ0dCMjhXcUFSWGdzNGZrL2hRd1VNLy82L2NoVjREWC9lODg0N0YvOHY3OWJyaThDU1BxQ1VBM3c2MnU5NVUyRC9UZDR5dnpTZGV6MzQwYWVkemczRG5IaU1TY0x6RHBHVWpuR1VnRmZac01SeUt6Q0l1dXg1Ny9nVG5JNGx6VTQyYWRnWGh3ZWs0cTNGU1VRQTJ4dTJSK2tpSVg2Q0M2OGtKbzMwK1BRbmNNOXh3Wi9penBFa3MwNGRkbG1GM0loWUhNLzFuWXBZcGdZeWpYQzhxRUJDRHFLZnRLRmxGeXRqSWQvRllGVG1BZE8xMVdEUE0zalEvMGdGY0RONXpXTUJQTHlScHNLRU4zOEdpS0VMem9QQWR6UVRnT1BITXhoWXl0Z1ByYXJqb3hHZVlmM3BXS2FVODhQZ0F6aW1jdGcwdGVNcHU5TWh1ajZQOU9RaFg1RzF3N1hPWlorTUE5RGdPM2had2c4bmdpNUN3UnljWHU4OU1VdXBSaHY4Sk1uWDdsQ0dkS2tLNFpsei9ZVVk5RkZneHVIeXFjaUYzR2taSWlpU1lUNTRqeVpJOFhleHI1S3FFaVhWYUdPTkVXRVNlUUxzVHViZXpsTmhoWllsNlN3eHA1a2pnS295Q3RMc25HbE1wRnJFMFdqTU05dFdKUk5adWFKSUVNa3U3Zk13T2JBbXUxaHBvY2dvU0tJY2JOQ05zRUtyakMwcEk1Z0Z2aEN3RldlWnNITlZjSG13Zk9zVW9STnNjb1BUbGxqeHRtc0l5a0VTMzJvUURTc2tCOEd3V0tLUTVjSzBWUTU2SEVFcmtXVU1KRXNMNUVCNDJ0OXBENzJpaDNUb1lqeDF6eCsrV1gwRndGWDRPL2xtM0RuY2dOK2VEbDRhUGxIMjJMd3dPSUJXRHdmM0RmYkRYL05CdjcwTHZoeitpYmNPQjJjbW03QUo2ZlB3YUxKNFBqUXJodWV5OGM0Mmg2K2pqZU10b2JucTBiU2pkRXM2eU1LL09aOFJTTmRxYVhMZFFDbFZRSzhhcGFGU2pwZjZQRmVkREZiU0dlb1BWM3FxWExjWXJMMElTZVhqbWQrT3l2VG8ybXdNMUk5bk5wV0cwb3BwQ1o0bFlGRTJwOFV3azZNZVl2a0F5VkgwcDY0UlhkOFBpR1Vkb2F3NHdMZDd0cnRObGRMUHh3bzcxZHpqN2ZKa1luVUc0SmhDWGJXMGhuTGRLQzBsVUM0clZ1Yyt0dlE3SndQc2UwNG10SUdRMXF2UytzVWFhMVNUWTEyUGtpVFZxblN5a1VBN0QwODR6Vzh3cTFZNHB3KzRSVEk0a01pazNWc1AvamRzYitReEljUUh4S0lYWHozakxVcjRJcnRZZnVmbERYRThvVEJnNG50WU5EdUgrd3dWakpVUlVVWnRMdERrWHZCZmJDOHg1ZE0vdWIxY09OQjI0cEs3ZHFkdVoxcms3bExNcGZucjNOUXIrTTRrc3NFMytLL3BwS0k0dGpYV2VqWGFWQTNjbkZwU1UxKzNYNXRESElLVzNnYnd2MVZKa0htZFFiS2RReERNcGxnVyt6WFNVbENFVUtsSWowVVpGUDF2UjZscVlIWjBoN1E2V0J2Umxnc1d0c0NMYjluNU5yYTh5SFJBL0xFL2ZmanNySjU4RkFtLzQ2Q3RvVVBHU3R2ellkY1VXeGVOb2NVVXFuVTNBVVo1akI1Q2c3TmRBQklMTVBVenNzRFNoUUVkNWt2dURTWmV0QkxQQXNKbGx6SUN3RUEpIGZvcm1hdCgnd29mZjInKTtcXG4gIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzAxMTAtMDExMSwgVSswMTI4LTAxMjksIFUrMDE2OC0wMTY5LCBVKzAxQTAtMDFBMSwgVSswMUFGLTAxQjAsIFUrMUVBMC0xRUY5LCBVKzIwQUI7XFxufVxcbi8qIG9wZW4tc2Fucy1sYXRpbi1leHQtNDAwLWl0YWxpYyovXFxuQGZvbnQtZmFjZSB7XFxuICBmb250LWZhbWlseTogJ09wZW4gU2Fucyc7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBmb250LWRpc3BsYXk6IHN3YXA7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgc3JjOiB1cmwoZGF0YTpmb250L3dvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFEUklBQklBQUFBQVo5QUFBRFBoQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHb0VZR3lBY2dpWUdZRDlUVkVGVVdnQ0NEZ2lDT0FtZkZCRVFDb0dMZVAwNEM0UUlBQUUyQWlRRGlBd0VJQVdFWEFjZ0RJWVdHMUZkRmV5WUllQThRRWpPOXc1L0ZCV2tHNDhNQkJzSGtHMDNsUDMvN2JneEJqUm90YTl0bVNEa2d0RmxWMUZFZ2wxVUtKeU5idXZHN2RWakdUL1QxbWFyeXo0VXhPclZOZzJxUk9QQ2VibFdtaTRQR3g4aThpSXFNTm1YVEtFWHdWOFVtZ3dHbDB0bU1ESVdzVGlXWWJQUkRsclh5bDc1WlM2YVAwUU1iUkh5QXhabmdEczVvaEhuei9Pbi9ybFBUZUVVU2w4cUQzQzNqQm1jcEFLVEtWTWhwdUQyLzIrL3NrN3c0L24vMWtEdm01MzVtN0NLemFramRBQ29Xb2VrME5hb2FpS1gxckZTTWJxdy8wL2Q2M3RpUXdsRHlxbFNnZjlZMU1VaDd2OTNjWUFLUkM2UWkyT1hyU3Jnc25RYU00eUdpbTczdDNNdkhCQUc1RUVTSmtHN0E3RE4ydG9oTWhVTEFiRlJBZWZFUUpsS2xZQ1VnVWkybUNpSWloRzlXWE90QzllWHE3ckkrcnhyZTFqWEt4VEZ3OXdleVk4a3VKUk5lV04rZittcy9yVzYxZDFxa05nQzI1TE5NK1B4YUU1ZUFoOGdwc2Q5UkQ3SUNDcW5JTm5sOENoYzc4RW55SDRRL294NDNyYVIya3RwaDMreUVBM2k5OW9xMVV2WUI2Zzd1L1FxMU16RlJOT0RobDB1OVJxa29Yc1htVGpFeXFJdlkyOW95bUl2NnNSa1k4a2VJYjVFaXVWUU13QndxK0diM1loUThJdjlOYjhWaFpqQkR1akV0M3ZLVnpJNVB2ODIvV3pmYUtUMUdJKzEvZzZ3RmhYMkZsMlFLdXFvYWViZE4wL3ozcHNaZXpTMnZpVVplTmYyUjhuZUgwc2ZCZjlIV2tZSHFOdXpWY0l5QkF3aHhpcGJCa3NxeXFRb0tzQXVkZG91ZlJQL2YzdlZjcmo4RHVpR2JqVmRuWGl5U3Y2ZmhDemU3UjZxeW5LcUlpTnJhNlROZ25vdDNlUkp3M0k4OFcrMS9UeFNtNVZSdG1sWExJdzhYSDVNL21iZm93MzFWVVVzQ2drUjc4NTlubTM5YTR6K1h1bXBTL0NsYkpxSWlHZlNGd01DRE5SQXlOUlBvYllaZUJCczJhSUl0blVpMkVFUjNXbVAzSWNvZ2dOUkJJYzZFUWdvb201Nm9tTW1vbE91UksrNUdiM2pZZlN4VjlIM1BvaFBvSWgrOFRYNncrOW5Sb0FEZ0lic1FnQWJLb0V4RHJUeUlkZnR3QUlDTGwwTWcvdE9EVldGYkVTLzBoanNDM1p2Vkx2NVBPN3dwbFlRZkt2ZVZZYjZnOU9RaGdERXhudlgwbUQ4Sk04VmQ3QjRpc2kvZzhOenZJMjlNeitDWEVWUUJEc1lCOEwzQTZFdkdJSk82MVpERHNBSDBKRU91UmdRb0FRTHI5NEJtMlRWVXBlM2V1K0hEMzc2NkpkUGZsdC8xam5tMnNEVllRSmx5cU4vMGRTQWdHNDlqam9HQVFINXhCNTc0cjMzdDc1NTUvdGI3OGRmaEVnRXNUVVNKQUE1WS83VGQrcU1TanMxOHZMcDR5Z3hWUUtNcnlhSHQzbk4wN3cxS0NsUS9Rc3I3LzhOQU5idmtRTlE4Y1U3ZU8zcUFrQWpjblZZV1R2czlkdmlBSXQ0TmRRVElZQ0lOenhERVFENjZkRW5CQkdBQVFWYXpDQUF3SkFoRVFBY0VHRElPQktBOVYrdElVQUVVdERZU1Iya29nUjhkMllmOUN0Qk55N1prc01SSmlGSFU1cVd2TXJiTUZqVG1ETjJYMFNjdXpscG5DTE9oL0xySFhRRlhVM1hjN1dyT3hrR0JHaDZ0a2NRMFVpc0pNMTUzdlY5Nk1lQWN4Y25NZnErZkxWeXJZNjBGL1N0bVI2WHBPYjlPSmtYQjEvZTE4dmRBTC8vOUxIN2wrOUw3Nis0ejd0MzVkNkx1dzEzN1M0cndaM2ZjcWtDSGozTmZ2cjVmU2JaN0pIWDN2aGFiTXBrRjExNWxya1dHekRQMVVzMVlkMzg3a21kVC9wRlFVcG1scW1lS3VDa3lxc203YXlRUURHWDVhaDJuYnRmS1luc0tUZlZTUk84NmFNVEw4bFpWYUpVT3kxUEdxbGpjbFRsaW95UXNGUUc2V0RxSGlsVW1TSWFJKzBqSjNGR2tRcU5vcVVUTzZsY25RbHUvRVZKa08wVWQrRVNqWlh5SEZlZ1JKWDZsTWx5aE13eHJVcE9ranptY3NJUCs1ZnRyRGlwc2gxM1dyRnFmM2lYSytLa3lIVEVtWkJvcmFVaVpUamloQUxGR3BZU3NHdDBpKzY1WGJSVjM4TTZmZXFrTkNNOUxUVWxPU2t4d1JzWEd4TWRGUmtSSG9aZTQ2cDJPdXcycThWc01ocjBPcTFHclZJcTVGV3lTbWxGZVZtcFJDd1NsdkI1M0dJT204VmswR2twQ0JwQnVYRmdWN0dWeEpsNU1kdlkzVEpmNCtRdE5zT0NZbE5rUVJyZUc0eDRndDhYTnpxUXFtT2RDNVlkUEppdDVObHBxc2VOSWppbEdRaUMySDZ0MFNHUDltdWhTdWVCVmpWSEhkdlhkOWZPcXdLUXJDN285bndzMTN0c292V1dBT216WUVVbUFGL0xFeGwyMjk2VXR4bkxqWG4yTnNlSUQ0eEZ6NDVsNWl2SUN0TDJvL2hpT3lsZHFZanRnV1M2V1drVzg1N2pwOXdnRk5RQ0hlZWg3NXlDWFJhclJZY05aSnN2bTNjb1FrK0lJQ3lQOTBUYmdmUEdkcU1Id3Fzdk5HazdPd3FocVViNCtDUEVydDNLQkRxeUtickhzaTllSDZ1bFdXbUMvcWt1dnhBazJmenprTGYwelE3UnVnOFJFTFJDT21ZR2lvSHhrQm9QdHZILzB3dUg5UmlaT3Q0ZzZMb2k1d1pDbUxncjl4Snl0S3VSTU5NOUpZMkZsVnRFUnJacEtyUnl3VG5zUWdoalN3UVo3c3BtVHplNFZ6N3lLVmxHbWpMMjVTK2g0VDhFaUJDK3A3Z01XNlRReDhmL1lQSFYxOS9VSlBIR1oxb0JQVnhnMFVMZzJKMkkvR0tkZFUzajVBOXUxUEpyQ3N1d2FVMU45Vnk4aEhhcnltUjRKei9TWms2RDJBYkJ5UmdzdHdtVnhKUHdoeEkzRWEwTE56OTB4dkJrdlpVa1BMTWM4dHJMZXFYS0s4c1hJODMyNitlTUxSZm5oUlVYdlQ1dWVNalNYTjduQWxBN21IQTM3azh3bUwzSlFabWVuRkFRaTA3Nm5xZXlxOTFQaEVySWg0anp1MHh0Um1hTFFuUGtLeEtSaHRqTW5pTXh6NjA3aXN6UmtDQnlHTGoraW4rR0s2N28raXM5em1NaStEMTVhZWNoUVUvZ09ZR1o1ell6NkhBdVhDOHdMYW95Y0gybjNScnRaLysyM3p1VGl1QTlTTXRPbWw5eWFaTFl1VHJPc2xQemN0UHBoR2hSc1IrOFIwYlRxQUxibGVUR2JCY25tbllMOThFc0FZVDhEdW82L24wNXFrWFRFMmJLaDVMOVUxMmdTYkkwQ1ZienlkVWU3N1JieFkyWW11VXZFeWVLdk84Wk81bmZGemZhTEVZZTkvQm1sdFhQOHlXU2MwY0pDbmk0TDZaMG5OTitycVltcEVpRTRpRTBHeGRIMDZBdUFmQjlScFU5SGhDbkNOUkNIdFdWRDM1RWtCSTZ2ZzROcDBIVEdkVjlpa1V3ZTRlQndCSFVveHpPV1Z3SXZuMjFoR0tSVkpkOG41L1pTSzFIZXBLWDJlSjRja3hLNkIzdGFjT2xKR1ByQXBqN3NWZTF6UXkwYXhPNUppNTVlTXlkNW1OOXdvSFl1UlNpR0tVWUtFWUxHZk9kRlkxbmFaNFVDeTdYM1Z0S2RxK1dCV2VTSGhzV1FMbjlURURXSjRMU00zWUtWU2VJRkZJQjNvMkdBS0VBb0dWcE5HQ3V5VzVnQVlFN0NEZlk0RmgweFhPYVFVZFNRZ1BUYUlpcmdnR2lXVnV4QzAzS0lFWndiYkloc1BqOGxoOVhrd2d6MFlQYkM3cGE5VDJkT0FkWmFRTFdtcHhFejQ1SzZ0STYrOGtxY0VBTkNqODhnTlhMaUN5YnloNlBjTGpvODh5cXJmQmk0TEx2MmFMY2dRUVFDRWJiSGJraFhGeXRNbVREWFFkbVBvbmprOEo1SlR3QzJ2eEJIQ0UrY0hiaUZJSFVOeDY3VVlOeG5xMFFGaGJNNVNwM24yQlZUemhHUnp6cUtZbUk4aTk1bUwvd05pWG5ra0NITDFCc0RTZlV2VW85dHNEalVXT0llL0ZibHRuWmpSVUtRVDJrbnZXSm4vYXpUVFZjdEs4Z2NtRXljQ3VGQllNdHVJN3VNRnVjejEveEFZMzJZeWhSQS9wTDY1eDRveVJUYU9ienFlTmN0d1UzM0ZURFFzT09IOUU0UXUyUEZzbHRqcHdrWjl6cEJHL0ZlMmVJSnVNaG11eG5HZ1ZuNGh5N1ZhaEJJNHNUNFpqWDQ4dHlmeFNvTy9RTXREcUNDcG94M2VDZ0NDSWdRRUp2OFR4dWRNRG9nM0JUVWNTL0VFQmw3aDVJbEo4SnlvRHJIZEU2NVRhd1BNNTZQRTZEZE82ZUFIQk5EODNnaElvZUlWZDF5eTB0RU1seTAxSzV1cGhWNnJiWFlMeWcxUWJxdGozMlNpRXExZHluSmJqSVJoSkJCRjVRblAvYWhLdWdWSmlJY3BKSEZSWE1FMTBKdDNaeEYxZkhIYTdWd0hBQnFSeEtIR0hQZ1padUxadG5kcXd6azdvTHR0eUxpTzA5U0FrR21WakVnMzRBZkx4S1ZheERjQ1N6OEpJMVM5cE5veXpqbkwvVW1yWTFTWVRUTkFESFRGTXhwOHdIV2h6QUJuZDQ1RzE4SWpRVEd4bW82ajdKdUZUZGdsdVJ0Mm1oOWFuSHQyR1RDSTlsV3ZvWUVvSzh5OGo0RHo4amIzVWtTMDNMNVNGMlZJTGErNktjY0p1YnN1dnJnZDEyNlVLY2tGRXRFOThQc09zY2RuaVRXRjRubE91dlZ3UWUrblpMUzdXczhUelhHcHp0a2t2WUMzcXphcmdwek1kWlNMTGNCWEZKUmF1ZmR3ZmNmdmZmVVhFQmxDN2IrbjBab01mUjYxQStUOFVlT1RFdDRzaXB5Sm55MitpUmZBY2haZjRMclRUTWpuTlB5dklOaEpoK3B5NzdKRmQ5SjFuNWRGZDQ2VW4wS29GbGFJTDUrSlhSaVNMcG1EbTRqSllMQnBVK3JXc1ljVDBHbzRQTWVKMWp0WEJKeFJGejZFckk0NzhZK3dtQldXa1Uzd3ZBK1QvVk03NnZ3amF3dmFlY0k5VlVYakNic3VBaWNDRzg0QzF2ZHJpNnh4Q0VHMEFydWhqUWNnZ1lMOW9pNWNBaG1Qc3pKamFpM0tEMjFkVVYvcnl6VGRIVVlxQnB3TUJmT2pIay9JRXEvc3FaY2d3MHZTTWhQcURPS2I0VnROU0ZNbitrQms3a0JTMEVTUVlTa2tzVWkwTUp2SjUvRWVCUG9BRVgvbFQxZkhZa20xcEpQZnZvTGM5bWV2QjZxRnVBVXkvc2tlYUJZVk80QUFsVTBENG5tNnZUT3NtT0hjbzY1NDZ6Z3A5RURTTkJUZWdZKzAreXRWaWdCS3Fnd0RET2x3cC9hY1lvY1NJMEdTcWtvWDNKWU8weFNCVkQ3ZnFkQVFOVWxoR3NnczV0SHE1c3FCVERPWW9MeDVETE1McFZ4aVB0OGFRNW4yaVBEYURLOEN5TkIzc0tJSUNzZUlVQWxmMWh2RFJ6Rkh6bzhSMzJBdUNuYnRuc1E4OGkxb2FJdnJyMEdDa1NhcG9sM3ltZWJIaDc1QWlpOHFqZmpTcDFLSTRIUkljNklIdktPR3JOeTNKU0NxVjE1aFBmNzdudXZsaVZXbytqVnFWaXN1bTdhcmp0VDZwSkpKVEtJNlZVSEpOSUs5VXF0QzdhVW9WYnJpekhzdm1aVjcya0YwMjMwa3JWMDBRSUVzWjVsSlJhK1Vrc1hwT3ZpUHZVUFkrcjN2Zkh5L3o0OTcvZmZqSDc4bVdVOUxjclY2NG81L3hoUjMzaXNsTDI3NUdHeEQvbzlKOTJ3cXVIY296KzhGOVk0cDh6ZDVYNE5XVWZKVG1FVW0vQ3U4TzlKNU1IbGoyWit4Z2ZybCtXVndNZ2I4MlVDbXl5VGxJSWRPVm02Q0Jya256eW5jMjVEMS8wSm10OGRzdHdFTy9FYlVWWVF6VFpsQjZpbUdhMUE2bGQvSzRnQzB0d0FtVnlOdmY4SUVzZkxuZHo1MEVEK09TL3pqNElaY2d5YTVWTy9vdlJOQ2Y2QUhuT2haUkNBWkpzVGd3Y3VEaG40MytsWCthWFYwVm5DNGFQRjhIQ0poOVIxcUs0T1NuQ2N6MEYzUWx2eWF5S2RBbUxGUkQrb2hVaGNUODZJK21XcDdidzRVNi9rZE5aQ2RPMTZCSkFRUk51VHE0cDJZMHZyM2JIaC9oNGxrWUdlOHFsQVpnNlBSelphWVlCZUxPOGRqNXZnZEpodzlQcFdTTmZqK2M0MDlzQmtqak5sK3dhUThOOWhVTDlnTFhrWlFCSE5BMFJhOFFlR2l6UGtXYjUyZlFpZm4xTUNoYitIN1BwYUUxMGxicnR3N3cvb0R4cmM1bFJEcTZqK2VnUXllVE0zMlNSTitBYUc3TjNCU3JWRXZUdjMvK3RzcUE5OFJucWhPOVpRWG11VGdsa3AxM2lBVm5WU1V0K2dSLy8zcFV0Z2FvOW9YOXhMVzJEM2xIOWtIYTRFNWV0aHNKb0tqMkM3d1p2TnBId0MyV1pIL2J3eWpUWkF1ZGR0bllDSEd0Mk5vVDV0VGRkMmpSWkk1MFplZ2tRbVJqUXAxUFdORHFMVjJDYnJoa3dNNUltbFJ5eEx0bXgzbXFIVlY0Q0UwVzExMTdnbWFTcW16N01ERjJMNmJtWnN6c1Z6bkhOakF0VzJYelR4emZlSkhNd1NQSXpCR3ZTcENodXFzSUxKTy84MWhlUFV6ZjFsU3h2MG96NHIwT2o2Tlc0NHhCcDZjSHYvZjFzR09uakVzWkFtcnVZcFUxaXRXeXR6Z0J2Z21NVkxtazIwYVNDWHptUExibE5jVUJ2SVlHbGMzSTJTMVg3bHJ1NGwyVGtsVitvWUdBWGlQUWRjS1lKR09SWDN2eHF0NXJEc3NEd081aDdabk5BZDZtaGhNeXh3QjJjRHR1dXR1NjhWaG1JNDJsSlIxYXNHZWw2QWNGU3lXYU15YzdsSDk5ZmxWcnN5L3Q2cTB0a3Y1TW93TXYybWhLQnh4Ynk1VFZwZ2pKZHFMTHhLZHRxMjlKa1JvYWQrNHNFaTJ4VCtuRk5TallIZ1lRYnJ3WGZUbnZtZnMzR2NMbWxBVHdvWUk1MlY2Wll4LzVZV1pYblJrQjRFR05EZURHTEJHUU12Ulk1SlphZ2gwZlRKUUtBNklXZUEyMkFZTFdIZXpza0hQQXlrR3RrTE1IV2pBdXluVDM2QktuNHdHV1p0KzhlYWYxRk5zdWpFN0ZSMXhoVUQwVDkwdkZMM1kwV09ZQnJqK3FRUDdwekw0SVlWKytyL2I4eUY5czlRWG1Rc0ZtQzdMemFGaytFWEVqMVJJL0lyZk9DZ0ZUcUhxcldJd1ZQUEdGZi9JUjRIaTI5aGtPNzlHMllsZGNyaytjanJFaU1WMjRQZzhuYWVPenhscTlGOEpPR213M1YzaUd1cW1VUkw0N1JMcVVsVHJZcEZEZkJKR3hxREtJVzlzUU56L0tUaWxxNUNxdHBTUVlLaTNCcE1rQ0tpT2lXMm1DVmgrd0phNzVrMjM4UkFmL0g5SjlnbFAvNU5iYnUvbm00ZFV5S1lIKzVBT1F2R1Bja3QzbThLM29GU1V6NmtOTmtLbW00SXAxU0xwUDFKVTZNenhtT285ck1wbFNiQm9QdllycUFONE1OSi9HaVhRWGRtY1JsZ0Q2UFJJblFXRVhJS08zREZkY3ZjUzFlSDhoaDk5TEt2N3hkVkQrUklZS3FZVHh1VXJ5VGZJNTViM1VIUmRnaEMydXFUQUdZbGRRQ2ZrSmhaaXJCc2dxWXRGSTRKOTZwcEplNTNyeGZFTzVFbHdxVGtyT3FoNU9tNEd6V1o1V3V0eDBIWmJQYVZyUEVCMkovaFh5QnB6WDE2RkZQbFBIcXk4MU9mVEM2K2tCY3Q4a1lhMFBkOGJYczEyaTZsa0V6MFY1WVB6NmlYRWp0QTc3NW50NDZvblVXNGtSMmVmemZiLytYTTFZZEZxbkI5S1ozaEVCQzNZZGc4OWZSSXNnY2VPWExycWJmejNRWGdidy8zN3oycDNuQmNCckpUaUgxTC9hbWxEZTlYRFk2cTdpZjhXbk5DeS9kYml4ZGp1TkF4b3VocTdIQkVyQjRXd3hBeDZSTzBnOE12UE8wTUVTOE1UT3k2bitEc2R4aDI4NTl2K25MRC8vdHZ6aWc4UmVJaVNPYXQ2TmdZeEFYck9EemxRSzVEdDRkSDc5M21SblQrLzFMOVQ5WDlyWGZ4VlFnQ1dPYytLME1RK3Y3MWF1dlNXUFBOb2l1blRLMWwvUkVIVlRjUkNQRzNwaDVxVEx1V1JxaURDemVQdUczemJmYjF0bjQ4ZUhOdVZzT1JBS3UzVjZuYnc1d3paY2hDakx1R2ZtVkJVZ2w2TEJNYTBpN2s3cHhvdWc2ck5OMWZJTURaT1J0MjVoKzZtbG5zUiszdFVTQWM2NGluMTdvZERPZ2w0SVFiVXdCWWdva2FqNmFQeDN3M3d4SXZYVnpOM2p2OWtuZzd2NlFrcmdoV04zVlBaaTlCenNBV2xBQUx0UWJOUmhFQklJbm9IMGJuSWY5NTk1ZVpiZ2ZPbHhQQmlZVUhnVmZvL0RFaDN1SklGbW9OYno2RXVDMXJNaE44T2JQZlkzL25QR2d2eEUvODU1ZThkeWgxUHd2TE9OZ0kvSkwzdFA2MDB1ZXU5VHFjY2tJdnM1Y01WSndGdkdpOXQ2TkQ0NUx4bkNOaHNxaG9yT3hMeHY5NHBzcldtNyt0eG5oNDQ5NkxsbVltOHN0N1FrL2RWNTVUZm1QVDduNHk1WjJJbDBsem1oa3R3enJSMWZoSHJCMUJVR05QZjdUaVN3SDFZTlFrWEZHSmo2endpb3F5MkNqRzFSVXYxekhudmViVHVjb1hTY3czR1RDa0djK1ExSmtpUzBoWWhRRVlvYTRpa3BOS2NOMjZkaWRPaHRuZGNEeVlnNE1INktOblVaTXZBdWZtQTZwalFWcndUWksvOWd2YkU4MlZ6NzhyZktEVDJ1VlAzeldxQ3k4SW1vc1F4S3p3dGZVR2NZRDJ5L1ZxSXo5emYxQy9QUlZqQVlILy9SckZZWWZHMXRtdytTVjhaT2NVYnZuby9ISUg3R3BEOG05MngvV2xkYVZnYWl3WHYycDkzYmJzTzBHSFAvcjJ1MmcvVmRUUEM1UjJNWTBHUXg4RDRxclN6cVlNSHhpKytzZm5nNGgxUk9PMk1nd1NGcytaVzRNTVZVVjZjL1BtcmtaTXdXNVdnaHRRMExiQW1MSDM1R1UybGxPWnZqNVh3NFpjN1duSWFGOTRQSU9NZk40WTJQbVI3TG4vVU5yUEFYTGtzdW9JQUdLdGxwQWZrWUgvTFdBaHk1akR6R3FwM2pTMGZBQ291RjNnQXFsdDNpcnlMV2txanJ5Zk9KbHBVdFdsL29iMkwxZHFiblVWWnY1bHZKU1g5ZDVsb25lSDkyZDNqZm1SQkNsNDFMVGN0NHI5V0s4MjBIa01YM0k5d2JOL1FuQi9lQ0tEaUZ6dmJudTBJY1Z6N2NQYi9DMXhkWmNSaGtKSUF1VUJKZWY0OWpXd3RiRGVxSmYyLytYdzloUkZObHpTSUdSaW5pdUkzMXhjMEtUMXVPZzFsQmxqWVRGK0l1VkxtbGQ2cy9ncGkxVjFaWFdEczZPb1djUFlyeFRjNTExUWs3Zm91NWZ1UFhrRUJUWTN6THU0L1dqT1lsRHpMaUpORlJUbE84TmRLdE9nbVBUdWRRT2tlVVk1TWgzTDE0NzJtRWVubC9LRWxwU0tHcFZlZXJQeFMzQ0hhcXNYSzJkeEpjbnN3OHdxeU0xYjRmYklvUzdWTVNGTzRySnJNb2QwSi9QR0JBcUZRbmI4ZmZnZUMyd1BtaUtSSGVLVE1wWmFRWTFZVHRKM3lBZFJNRDVPRmtCTkRENG1qNk90Mi9wb0RERVFjdFRGZ2k2cE9EUERKSTZTZEd3QkJWQjBrcElrYWdpZFFaRm5PZ2twb1VUYWEraDg4UFd3OVpMeDl3UkZaRVYxd0VhazNHUVhpRnhGNURjTW1RZ3YyOW82ZmpJMW54TEZKUEI0N05YTmIxdko1N1ZmZ3JQQjQwempzdlBDL0NMZ0JRdUt1NUVmQkw2WmlxZVRBM3UraTZKR0dnWTZIa1VoeUtpMDh0QnBPQ2FqOWFDYi8zRVZuTkdXcmp3blA4Z0MvdVNNKzgraFFyR2hhMkhiWFM1dy9WSlk5Qkt3eDVvN08xM0xsczVybndmc09qamRjRU1lWWRudDhPQXVQN2NkRU5lQTJDMXBrNkdwS2ErNDRCcmY3TzllcEFwYWVucGFUOEVFSjRhV05vWTIrb1BJTWFRNmNYc2JHZWVxVWE4QmFrMy9XOTk1T3hBQUNtS1R1U3pzNnR6emZYbFY2UGJ0Sjlpc0tDTHhXT1FWM2NKVGFaQmhyVE1ReUM3UzlPRFpEVWpDMXRqRi9yUHdXaHNPb3Q1VE4zelp0SnAzYWZRWHc5Nkwra1VOMW9ObUFmbEYvMjlaN2htMzBWOVR6ZmJkT2o3WlorRXN6eFZUNkVkSzFXUkJoTXZXWW1ZUmkxWFRLdkxreGtKUS9HbjVPMHR3OEdzLzU5djAzS1RtOHlQZWZONHd2aGFFcFRUeXRXMTA0NkZDRTIvUXdyQm1rbWtaNWEzbkNzUk96QTRmZzZLSzhCVGtqbHB4dEljQTYxSzJyUE9kcWlQb3g5bCszRWRxV1ZWTmpFek9iQWtuNVpNUWRvRUJCUFhyQjIvd1lFNXdkWmhndyt4bjlIcDA1dzR5TGxFcmY5S25mTkhOTVFMYWRXWno4RXpzYVNDWkVxUXhkZW5pWUMzZ1lWTkJhU0dNalJRMER4OGRHUDhnanVBRkUxbmNQbnNWVzMvdTRsbnRaK3NndnlNbnVqWERnak5wZ0VHZkhYM0hzWkthT1V1eTU0emVmdC9ROXN5N0J4MDAzbGsxVTdXN2hzN1dmdDNZdHk0bmhqNlg1bWJpTmNaZHhMMUNUdVVTMThCd2ZIaU5Ia01FZFVJemZ2KzhNTjdHZXRFUUpLZ1ZwK3I0WFFEL09JTmR1WUJZdURrM3M2MGZjOXltNHU2QmhpRzg2Z3Y5bVdySFowOTVHaEVoQU8xVXY0WnhETUQ4YWY5bXhvWjVZSGczZ2hPZUFlSnpxSmdrZVVKT1IrT0o5MUhvckdVVEdqb3JzaWM1NENnVys4WTBNVkdnZTN4elRBcGkxOVJKdVUzaC9LK2cwYnMxbURIZ25QWlVkWEpHQTZLc0U5MTNveXZnd2tvckVLeXNnMFhYSnRQM2Q2RVR4QjBiOE5nWTlIVnNFTEV4RGVxVnk3RnY5S21kNDFkRnFFa25iMVRpTkdwZ2FtSSszT3c3V1BIanJJUWIvTk5wUU5uc1BURDE2d0JwNkYySlplYzE3bG1sVXh0LzlTdU5jZWUxOXBvV01za1lTVVl5U2krUGdLOUQwZENqZjlQSHh0WWJVVDkvMWI2eXRUMStrUEZrckc4Um9Oc09DRDkzU0tHMVdDc1lINjltTFRlNEQ3OGllejUxc0ZGbnBTcXlDVlV4QU9JV3hiRVRBN25oTUpsWFdyMkNUbDlDN3BmY092b25TaHdlOHRFUjNIL0lYYmNLQ2RoTWFuTXZpNUNsc1pPMjZOZjNaOUZ0dXFiOHlONzh1d0VsYXQ0THJMaWQ0QVNwUy8zQ2doT1VtVXRlU0ZoVzFuRHJiUDlBdlc5Z2ZacFJXUnVVVDYzWDJROVJwbG1hN2kxL1dIeFBwNEI4NkRNTlA1WThKc1RkNWxhTk95RzlwOWhQUlE5Nm5IcDViYWhNd0lMeTVPd2M4ZjJPN0F5SmFVM2FWT2Y2SzBHdU8rTElKZFhRQzBkTEhnZXJUNVByaWYzSmF4SlVRQnFNdUQrY3hBNEFDN3ZGTEhXbStvd0g1YS8wRFo4dkVUTHRlZXd5a2lBL1AwRUFFVU84ZFZIZVR5SjE5YVNyNDFEUEpQQk5lLzVjOTNlbWFGSTcrUzY4UEh6QXJQQlk2UEZLdDJFcGJqaHlqb3M5TjhWeVZjNVdxNkFtS2RXQ1c0dnBTN2ExRFFETHBFWUY3RUdObmR1TzlaY3ZrcGtuajAwQkVoQVdkZ2JzSjdyMmI5dXhLL3Z1WnhmVDJKL3ZRSHRlUjZVaUQwMXNqazNzaGtJcHM4ZC9tNHVNVDk0OWIwWm1HY2NlVzA5NVpvZTZ0R0VDdU1Ib20wZEIwUkc4eUJES21rcUlucGt5VUR1WXUvZzhhRmpjME5SYkhZSm43bW02MzhuOFl6aXRkVEFRTUR1dHVCQWZzYkdrWWlEM05TQkQvZEE0NTNyWnkwYUFBQ0JSTllkenNiYm50UUMxT0NUdzZ2LzZja3o4VjVRdlZtSW1JTGh2QUlYRldkNDNBeDRPVzU5ZUxPWmthVi8zVHQ1S3hybWUvbWc1WkF3eUx4MzZHc0dJSTJnejJBWmdnWHd6KzhwU0VEeVlHT1lQZXR5anlabm42UHJlNmNqKzZCaklBcGdCYjRNcGw2Q2R0YWVPTW1EUTc1TCttNTY0TVI4WEJvUmsxNGVSQXJFTXVZUEVHRVVGcGZQV3RYMGhSanZ1TXQ4TDlSRzB3Q2pRdXd1SU5lVnBRZUsrZ0xKekRCVjhYQUxGOEhFcFlCQUZUa2NQN1FTRjlNTE0vK2NMSm5QWHh3a3RCYzV1QkxuQk51R0REN0VBWVlPL1dGdmRITXZMc0E5bXZwVy9SZlMvRC9NeDA3U1JhRWNDQXJDRVFiK0plMzZMdW1QaG9FWkM0SllXUjFaRzlLUkNldVN6dzRSMWRuR3lDQzA5eG90T0NtL0pDVkxFU3dJZVlNU2FTdFphQlVHKzc1TEpnUjJEOHcweHhGa3p2QnE0R3UzaGdJcGp3cGdZOUhkaXNWUnNoWnJpUGdiNVgxQURrNHVWU21pMnhEVFAwQ2Fmd1IrOXFhZXRXVGVKMEM0ME5uQUhnZ2pYZFBxckZCNnFsV0ZPWlhYQVZsZnJlVy84dXR2Y3JaaFBCbS9qeG5VejlsOG45S1h3cjdlbWswb3lza2hGbVZsa3AyVS93WDh0TThMSmdqTCtOSTNubWs5dGxkNjVTWHg5MklyUjZ6bXF0d090YmJWSWExcWhwbi9Rc3RrbVdSaUZvNVNjRGliVUlETHdoTjNUSVFTaGFVODZldlBORy9hSzMxeVJSNEFBQUNBTHI0VGtHRTNXMXlQam1MeEZvSzZHMkxva3VYUXh1OTRORm9JUFBFZGNMNjVTRHNGMGE3THN1bit0M3lhR2x0QWtjTnNkWDBRRHRLOEIrMk1nM1lDNDBUdk1CellJalV6Y0crZ2R2KzdkRVJCVlJYdEQxUGMwSm9uTkNJN0FGbUZ5anpDem9uUjVFRHhGQ29RUVhsWDRYWm9OVDU3aGJMSnJ0SjdIRlh5YkdKUlRnNnBLT3N3R1FzL0FwVmQ1MmlLLy8wOWhiZXJkdzFKZVVWVmZ5b3JZeVA5Q2FiT2RTQkk4MzZJb01oWmtZZkhjT09wbUpkZzZLd29najVjUUhTVzUrZW5NdU1wNmNUNGVCVE9FcGxJZVFkQ2x4Z0Z0cHVud3Rnc2ZubFpKZCt5dWZETmk4QjhFNTZNaGJaWlg3OGRkOHkxS2l5Yk5WdjVhM01XWjVReGN1em9ySWw0d2V1L3pLeXJtYVNYTmRPMlpPSVduRVNKOGxDOW5kTkhhZkIrVGtWN3VsaWNVa2VYbVZvczJxWks2Z3hZR25qQmxUS1ZpU3pEUjJqL2hSY1RlWnd0eXFrSTJvVmFCRk95cWx6TFlBSjNCbC9jbndXUFcwdUZweTdmNmwybXZmLzl6NGNDTHU0Tlc4RUZuWXYybkFPRnBUMUdUS1E1SWZzUUUzc1Bmd2FQOHNEemcrS2lvdnRad1FZT3VUVk05aExVZXp2dTdJTVk3OTJNejZOYzVtUG54RjdkVnFhQzBBNmNQTVNxYS9GRjFhRWVPMkZlZTlKWlo3VFhHY0xEdWpoOHovdUlLUXdPM0xIOVpQUjZSY1dxMDBXN09kcjlNWFAyaUpzdzl4UlZ2NENYYVpITnhLYWV4cjZjMUV0NWxpcWJJRFpJOHJqWU5BNHFYcWFxYnVrUHZmM0VvT1d4c0hHd0pSTDFDSm53ejB4cmtCaU0xWUJGZlJUaFRPdlBIeXRoZnpnTDVERlBmK0RuZDNsNVdwNlRWdGdoOTZ2ZlBidnN5SWl5bERTV2NReUtnRnJOSGd0dHRwMy94eDhKcFBhM0p3a3dzUnRWbktNdmo0M1ZQSTVTNWxteVhYOHNnbCtsMnNwcXJ3TVEvbmZDbjFIc1pYVW5LNkY4bkNuTDlXY2tBQUNZVEZBMTJEVHFCb2Vxc3QyaDFQcnNWVldaaE1MczdCeGtacjFkN2xuUVkrWnZpaE1mT0FtbXN2aVM0V0Q3cGRxNDdybXpnN2s1RVMyc0o4OUtkNSsvaGRqV3VKbU1YOW5DMUJvQS9VSmRXTG1ndDEyamlOOFBLc2Zla2E0UE5ZT25Ic2kxbDFxVGdKcWxaOGpQZy85b29Bamg3aDJacVY4UjZVOUJmY0FMRnpiUzdyQUZwUHpHSU9uNWpoQStzOVdpN0NId1FkMyt1T1grcjcrTmdkNUNudEVrVFFIeW41b1l5V0x3M3VWb3YwbEl5bXNNa3AydkMrR3pXeTNLM2lMK3dVQnM4WDNsSDJKcXd1ZFh3aSs4STREUHg2WTh6SVpyZjFGMTNZNDNOUEZLQkU2WlBEemFHbTRFWDJzN1E5TkNlMDYwY3Z0UnhVbURyRFZRdXVaTmxleEthd2Y3d3R6djZubWZoMVZIK3Q2OEFPZmxzaGtRQU9CYStKL0hlMkQxYWdJVnRVQkFuY29xNTNhaE5XSmNFODh4MVQ1YnRMUEpMWWR3YW9UV3h2VXE3ZW1vR3VEWTlqcHc3RnJzM01DUFA2VnRWZzZtNjB2SmpRZFpaWGhWNEVTbGNONW1aSnpyYTcxTFQvNzhHK2ZYb1ZYaTNoaG1DQko4T2duaCsxa1NuaWFRTXpQYWdSTHFuVjBmWGsxZEdUZXZoNWp6N1p6b1BMTG5HLzVCakZURlBUUjBzRXFZa0R5bWlnLzVEdkxXc3J2N0JacDJwRnBUTWpXdVVJY2UwRUk3eHQyVEl3LyswcTdHNmIvek53UHJObWpTSHEyeHEyUHVaM2ovNzhyNWZKbTdTdE5xSEhzMzloSHNPQjY1ZmpjSHZYNkZvK1VJV1lxVjJqS0ZRc29aSnlhV3hJZGRCSnM2NzZoWHJ3SDltQ2RiM3dDYlpsRzdSUG55SGNaYk1rTlptc05YYjdwdDNlcGp4a2NrNFZkcEVnZVRpV2ZueE9naUlIZ1NOVUIvSzFxUVo4cXEvbk1oN0NXS3JiVDJJZWpmRzVPbWdTdlBCeG1taXpTRFViVkJyaDluYzM3TWNOUERWN3lYenpQdjIxckRLbDg0WTR2ZnoreHFGczUyZWFTa0tIT0QxUlVWY2dtYlZLTDBJMEFuZGgxaHl1WHBIWVdKSlhIaEYzZWJPcmQxdFZRd0t3Z0FLVUJmekJLZ3ducm51QXJrRnRrZmFxZGZ2NEhqb2ZFUlpDQ3dZR3U5T1F4K2orclRiQmJLdTcySkgxT29YbnhKQTJQZkFMTlozQ0ZsU2ZXeWQ0aVRPV3pjR2pRMjVlTnlhM3BuSk14QnZ6R3NTMlRaNzZmc2x5RUhNcDRHNHBxdDFxcHJKWmtYQTJYMlk1SkdVZW1NcWs5RjJaL2UwUDlDOWdBcGpSSHNwK1FoOXhBZ2tZSGJDMWNhaEJHcGcwQ2t4clRmNTljL1JZRW13Nm9IZmtiaGd3cGVYQ25LWTRxcnoxOVNmOS9QZUlqRFkvRDRvVktUV2JXdnZ6R2dzM2cxY01UQzdBRk0zamdENnlaTDNjQlpmdUhpRHF0NGlBQjZwcWE3M2tJUUI2VTNCMzkxa09aU1pwQktoQXlsYVluWk9IbzlKM2V2QzJ0TTRlSFc1cDYzNzNYLzY4VWUvM2o2ZnhSVEpjUHdhc3dnb1VvSXhxQW41OE9pWU5BalpaRk1aWlc1QVd0VnpucmxKeTlUTlpjWWFjelI2VlJES2hyeitvd3NSM0kzanBpQ1duVElWVnF3cWlOclJCOHQvS20zOVNSWllKQmdleHZWKzBzczFMS1pjNGU4M2F1czE3SGF1d3djTzJZVHlGUmprREkxWG5aYU5ZSzI2OVZxeG50U2YyMzBxRlY0OXQ2aUtjYmg3RkhycGxmdGtTejdVaUQ3M0pmOVNaRDkvcENEYVpLRHZxYVJ5RElSUS8rY3NKUWZQZVF6QklLZ0ZYdUhBVzJxV216SWFRZWRhdXRnZGVFbDJqTW1Pd1EwT0x1bEVDT1dBMm1TQTFGSU1sY0hYdHNiNlpSdlhIZlR3c2ltQzIzR1paZWJIbEtxNnJIWXpXbzVxd2lEVW5lcy9hZWIzVmc2akcvU1lTaEoreVRQMlR2cXpFWFE5ZERyUG9JdmI3TDJKVlZHR1ArUjI5U1hyMVhwYWpnWmNJWjJaSWhSWi90TDd1eWZoejI3TmV1eXRZZmNrM05XVjJyeXcyVldHb2c2SnFtUmU2eFhxeVo0UXRWOFFGZk44WlE5c2xxZkdmN0ljclUrUXhDdDU1c3BvT0MyN0NrZFJFOE1xN1NPdVdIVUdwOElVZWR3THE4N2tWL3RueEVLUnMra1dOYmllS2RudG50ZDRobXVTWllucmdQVENKdnBvN0ZwZi9tUzR0eTVQekRNZjlQN2VwaWVwbmNSNXV2UHB3Q0F5U3NnVnBXY3NGK3lmd25hYnNIT0owL2lURUYvZFZHWjNULzNrZmIyR3pVRkNSRm05SDl4V1JkM2R4U3Q4N3FhMTEzWFlGa3pNTWNIcEI2STRGNjJackd0RGxhWEZFY0VscHpidE1hV0FLMDd2L3ZCZXFMek9nZlhYZU9nOEo2VEUzZHhDcFZEaTgxMGYxM21NTnpEL1BiMUpNeUROdi9BbzIxTlRoVFhMbWdSK2ZNQlliTy8ydlVrTHQ1ZDZjNjQ2YnAxc2tQSkI3QStqUWErbUVGY3d3cmRaRXJQV0YzZExNb0V0TmN6WStmaEh5MEk0c3cvWWpqK01haDk2Wk54L0c2MGpGcFIvTGlJdVRLRlRiRjNPYmQvbDVpTDdPejlOUnZhWTNSblc5dmRtVEJlWFo3L3VtNXMyNHpKeVBZNHNtYVhtSEVId3FtNHhvR25FRFBFcE5RVUxOUEZQYmNVYlM4Zy9tTGVySmRjY3FKK1M5QkxRTzA3WDMvU0pkc2xRNDNGMVNCekFCYmxnTVptY2tqZm5lVXg5N2tudkZ3Qi82OW8xdjBTUzI5TWhYbXBFSXQxc2RxOXpEaGlZMDJhTXFWMWN4OGlpN1NTcFcwSG52YlZaUjJXOUwyMVVpL1FsTFQ5dTJKTFc0WFd0S3NndWd0ZTYxWnJ5WGNjV0lMMm5SOTVFdjdRV3FsZHgzZEo1ODNpK2dlRmpOVmxISlJncnIzYUpoVVNPQllLS0ZJTXNFRk0zRjh2Y0lTV1dIWmdscU9TdmpkeXFyaWs4N3FUMTExZExNWlIxRGtGMUoxZFVybTNZZ3VLeTcrYnAzZVBNck03Mk9VUkpjc1QvWFpMUTBSeVFiaHRlRm1LdktESmsyaFUzTXcxQzhudGx0c2RuVUdsVFhmZS8zN1ZUUUhNRWVOWWJWdGRxYmwyRjVFN1hsNGJkdDFpM2FKNWZEOHV4Vlp3aEVVazVnbURJL1V3K2cvUk1EMTN0cTBsUjhiSW5FRGlySmhlWk55M1haQlYrOXpEcXo3UUxkVktSTktnTDFpWDlESnRNYkZLeUJtTWJBczNxMGlEYzE5ZjlBb0Z2WUx2K3pMbG1sSkFsaUhBRGN5YVdYQ3dQcmpZdmVSY0lMQXB3Rm1ValphcEhWYUFtYzVQTVp0eklCRkhOcFRDa3FWWFZoWDR6dUIwSjgvN1I3TXRGbWNadWpBbGhvVUEraUM0UE5OblFNdyt4bWtWWXdCMTh4TXNQU2t3SXpaUU11a3dQUmprV1J6RzZMWEx4WUhHTzg5SG05Z2tsOUtvaVQ0MVZUdDR3TGxLWXBNc0R6ZTVqdWRwRFRtdGs0eXA4TnpJVjNOL014NVQ2T1VET3JOUkZ6cU1HMnBaMk1LWXFYbEluMnZ4V09lamZjMCtyVERLaDl5a0NsbG5QVmlvR0NMWTR1UFptZGV0UnpFbWxrR01BVWVKSi9NOGZ3SVExT3V6Q2JGWHdnTUVVRC9ZRkdzTTQ2MUltR1ZiNDdudWNDaVlpWk1rejBHT3hKNjlPRFBKYWl3c01ZcWtMVEUwVDZmUE1NdnpicmRncWFvd2hLbmp0dHJzTlgrcnMzYVdKVGROMVZWWFU3dTFzOFZHbzNzU2RnaThIdjd4UlVpbkJ4Y1h3S0FzM3VPTWRUcHFBUUtUZ0RneTlGalFMa2tRTlRYQjdPSmwzTWxERlZ5R3hQcGQ3SHN1a3dRRUhYMlNwcmNCS2tRZ0xGN3ZNbFZTemduRzgzbmwrNXc1eldWZ2t1MHNiRGdtS05ydEVweGxQV3FERTRBcXhYaXNvSFpyVER5dkh3TUpjTnVXdnR6MHhsR2ZRcGt5dzBEcXgydDFIYzU5WHdwTlRkcll0eGJHYkNaTWkrUEY4cUx3ZmE0enBmN0pLeHBnVkl5RnlUU2kvNDV5Q3lGREFybHcrSlpyams0ZlNNeWRvaEFxcmhZR0xkaXhDV2tYQ3M4RUxvUHZQS2c3NmlDTXdvUkVrZS9hM0MwVVdOK2dVcG9vQWpPb2F4cmRodjFDM09sWVZRVnQrNmt2TVIxcmZ1OTZ2bFY3SWFtc25SbFJDS0RYY1V6Zys0M0MzaUhUQkF2TTl1L0FlRmZzakViWGQ3dkpUSnJ3dHR0MG1FNDNYM3JwTTdpa2FmYnRBd1NRb2tvZDErZTNyV3R0ektiYmdjdGxpYUNRcHZZOXlRaXA1b2xaV1ArcDBCRGx4V3JIdG1DVnE5MTlnUi8rL2Q0TS9WdDkxdG9iQThCZE1OdXpiRmZDRkduYWpXT1JXV0t5cnNuWi9kNTRETnpGc3hNS0ZENW04SlJpczNYbW5LRHE1c3RnNzhaRzYyakZPTnZaOFdEVndqQlJYTEJnd2ZGRldjM3R5TWpCYk44TGZpcEI2T1dTbW9mOHNXUGhqUTRRMFBGR0pXSE1SV2tZeDM3RUhkdnlHVE9MaXhyTCtua2ttREZMQ050emg4T0lHaHRNeDBodE5jcy9peEtFMEpka3pMZEduQzl3TnBFZEJOSGpxVjRpVkI4aENtdTdnNnVwTUJ6MGhBckVKVTlSTkdGWTVUU1NDT0Q4LzM4RTRxYlNIWjM1OFphQmhiQWd6T0VjN0dCaldhN2pON2M0TE9ITUxBSk5pVmN5VzdFS04vUWEwMHhwRzhyRU1qRVBwWWx6ejZEVERzTWVNL2xnSnJ3RzR5SGszYjBsY2Z0VVZLeW1UdTh2OGVYdHVVRm5YOEdLM3FxcTJ0M2srSWs1VDlsT2ptM24zbENwRVhwdk94OUxhYmt1ODdnUmxMSlFiSnNLMUtjUnl6S1JyR1FjQjlyais4RjVxQUs1OGRaUklDaldxZ2F6YitkV2Q4MXBYN3Y2RUpkRjV5elVUaEQ2bkIyNXA2V1YrbWVwMHh0OXdTOXZkb09pWXlRN0pxckRzZHBMbFRxZDFLRGNLVWhYcXlBbnFMcnNYTXREMFFLT2V3MnQrdjJ5aENMQ1RYWmhtZDNiRVVkYmV6YlpzSXQwdml0MmdtREhVMVZSbTNTT3dpM1Rqdld1WDVlNDZtYmU0dWJBdHBkL3BKSVkySjRyNzU4dWFHb3VxOWxkVTl4OWwwKzdqeWpjZmtEbUxhVlF5bzlWMFFoRjA0dGlYWjduRm9KNG1LNWltTm1DZHFkT28rK0ljRS9wOFpWS25hWUZ2dTRZMHUrVTFTaE9CZU03eGphckxrVkxrVlh1ZUFFS3NJRloxRzNtc2ppMnd4VnlYZkJ5bE5mYk9nTSt2Wk5OVVdTSk5IbzBHZzVoYmlNRHJvRlpGc2xDSEZhN0NlbW9VaFdGdDN2R2w5ZmNWS1VZTHBXeVd0T3duWFFzZ1FqRG5Oc0FkZTFSN3VBanBCRytmWnVnVDlHVVlQdWRiSFdVY29hMjNlT1Y0MEFXMkFaTlFTV3FsaU8yazZXVjI2NGFqeWVUNFFEM04xVnhJTnJOdGNrUVZQaEVLem1RS2RmcnR5RjB1SzN5TVlYdHdEYTlYaGMwV3EvMlNRVW43WldFdWxoUFhaV1c3RDBPRHdOT2JtMGZYQm83QjAvdEVkTWhDbFloaFhxeGRuazZDdHdXdUtleEhqZ3B2M2V4M3RCcHMyQVBTdDVpdDUwT0lNbmM3V0k4R1FrVGZRNm1TTkl5YWliak5JMFM0ZHN5aUpJejRqdklTbm5mNlZjaWkvb0pGUitOd0dzeFUyWE5sYVhvbjBVTk8zcTFsNnFpLzIyOGpJTEpKQnozZkIrU25wRXErSjhTNS9qVmxybHcrekROTFJNVUV0MmJUUEplWkJtcU1YNXpIbHJVQWQ5eGpiVmVWWlVsU3VLSWI2RFFxOVlKQUpYSXFVL0R3aUJhZXpiVFJOWXZwbTB5Mm40dzNMKy9aR1p6WXo3WEFEU1c2MXF6eUZqUTA0am1aRXQwbDZKNmg0M0hMaVJEV0w2QlRqVzd0Z2xSaUp2WkZiTWxHVnEvOFFDaDRWQUV4TFRiR0FQNEt2UHJmNzAycCtRYk5SL1ZzTEpjY0g1VHdIRFo5d3VTOXgvMmp2eWJoUnp1WTMrNU1Eb0ZHLzdqSlhmTGY4Uy9ianFYZUFKWVFDVUtPc0Q2M3hSOXh4akdUL2FMNHFkd0NiWnZNY0prRFNNazl2OTVuQWFwZlEvY1JRWndsLzFNYzQ5bjRSNXIxc0NhL0crUTErQXUvTWQ4VC9Ra2JMZS9tdnNKcE9UenVJOGNoeW4rbjlKK0VyNmx2d2tRZDZZcURNeGwvVklXdlhvNHhuNm1FMjRsUkxOWVVsYi95VzFhZHhrRjVnK1NldnorUjgvTUhlUkVmVE8vdC9HTW1VUzAyWnEvaFZEQnl1M25qMjdRNmhXNk5mY0M1ZlU5UXZQUDBQUXlwYjIxeEowenU2eGU0L3pyT09GTU10TUNEbGQyQkZ2UVVCVXh5OW5iQkx1Q1R0aUgxbXBHOWpKNEJEdFZNZnlEVlVvaFB2UHlmRWtZM1dRd3pkUWp0MlJCMWZBYy9zQjNlTVMrbmN2cjhsRXIwK2t0YkIxWFNMYWxsT0tCbCtWNVpJNjlNelUvUG5oZGxoRXAvTGRvWi9lMWlCbVJWTVZud1g5ckcrWFdhYjNhZnExTzJlUUNFWjRRUW9ZUU4zS0V5TzA4SWZweW95TjY2ZkVIbmhBakQ4Z0JnQ3pZdWo1WjJsNXMyckVmNXp3ZTkyT2NnRkNZVnd6eXFtdTB4ZU9ONytXczZndUh0VWZsZEx6WGE1ZVliY2lWNmNseGV2YlRtVEIzbWduY3JnOEtsK2RyVktnSHNwelE4MEdOdXU2ZllkS1pUYlRrS2hZR1FlRFhiL2hIYzNaWmZ2VFRMS2E1L1ZZd3lzMkxadFB0cHpsTFpQVjgxMGI4MDY5alI1dzRGREk1T2V5N3hjZEV2V0RKUkQ4anJwYWJYa0dxeVVWbytLejgvQmtBUEd1ZWVRbnRra0lBQ0FjSlhlRkl3RUNEc3pNQU56cWZBZ2NFQUtwUWRrT1ZKQlNuN2dad09nSXREYWRqb0FLRHArTXcwOFRwQk5CK24wNkNZVGluVThESjNOUFVZR2I0OTRVQVZGRDI2UWlVa05RalVnT0lZVHNxZWQrTXFhRUdLd1FJRkNXWUZ3K2VRdEdtYzVFWjJ2WktjOHZ3QklyMFIyYWJ3NUFoazl6c3p3VHc3am5DZVdhWk1KR2V0UlBzVXphSjZDUURWV1krNTJ2V2c1ZVhldVlFbkFnbjVXZWhJZ1BTbkM4MzdzZDRmNkZDT1BQRGVTSHMvR3hQUUs2RFBEeDBzQmVoR1p5NEZMRUYxdURKTlM4ZWI3TTZSNmlZVTZsUDhoTXljYnhPcVpaT1gzMUtPMnVMeVpBSzE5WUp6TXB4U2lWOUJWZEplbGk1UEt1NTJzbUo2eTkzc2lQaXpxWUl4eStwMkdyU0pNTmU4bkE5aHdNd0gvTnpLNmpweEx2NVhmajhleWUrdi85M0RQaVpiWHdQYTJRSXc4TVpPaEkzZUdKNGUrUDZldzR2L1ozUkd4ZWVzbzNIRUxyQzZzd3E3aDZDdndLbFZCaXU5ejlhNnhSZi9hUEZ4L0g2aWNmUGF2YW5jZUxsdUwyazBVTWFQREVjdVB2WWQ3TnEzYVRHS2NDTzgwZTFrempGY0xoOHU2dmZ3T1lLWXMxQkxQWXh3MnozVFRZeWpMWjN3MkQ3b2JlbHNXTDlvYlVTalhVYkU2c2NZM1B0ajh6a0t5eG9JTGR3cWt4RVpvSlJhZlNsT3A5Um9mUExEUlJYWnJoVXFsOGlDWkplajVwYUdTSzFMMVNiY1FKMUh5V056OWZtQmp3dGg2c3hJYWY2K0J3bERMYkNZRWw5cHRUck0rVDlPTHFjMEdUdkNUVWFROEJYZ045WGg4c1pnOTNXaDgwb1liclcyZnRYbDhWY2gzbFJ6SFJOWWhPTURBOEdYUUY2blFnNmhxQTFMSlRhQjdWZUpPeXFSQXRRZ2lDRmFjaWxkc2lrTWtpRkpNSEVvQ055QzJNZGNSWENkN3lBQ1FqcFJxYUYycnlwZ2VYeHhWQ0c3ZHFXbU5lV3hHbk84aFhzTVZ1Q3JxaEFqYVMySVphMUZUSE9RV01uajNPUi82K2xUU0Qvd0R3Mlg0QkEvd01yRFVhMU5UR3RMWWhWVHZJVjVERlphcnJTVU8rWDhROStDblUvYW1RbFlDTWFuUUsrRHZad3c3OWIraERiV3d6aStrd3k0b2Y4Ky9mdkFkNHh3cWRqOGd1RnR3aVVKdG5ZanNGbzRmTlB6RTdZdWROL0lzRGdkTElzSEdxTGdobWdJTG1UMlRCMkRRSzNoYVhaMUVhMjBhYVJ3c2FsSTNVZEFBPT0pIGZvcm1hdCgnd29mZjInKTtcXG4gIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzAyNTksIFUrMUUwMC0xRUZGLCBVKzIwMjAsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyMTEzLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7XFxufVxcbi8qIG9wZW4tc2Fucy1sYXRpbi00MDAtaXRhbGljKi9cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGZvbnQtZGlzcGxheTogc3dhcDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBzcmM6IHVybChkYXRhOmZvbnQvd29mZjI7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R01nQUJBQUFBQUVWb0FCSUFBQUFBZ3pRQUFFVDlBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdvRUNHNGtPSElWVUJtQS9VMVJCVkZvQWdod0lnamdKbnhRUkVBcUJ0V0NCbjBNTGhDb0FBVFlDSkFPSVVBUWdCWVJjQnlBTWhoWWJ0SFFWWTF2V01Hd2NBSmgzbS9GUmxJeldwNG1pZmhMTlJQYi8xd01xTXRZTzAzMC9LSW9LVVNVS1RSR3RicC9aYXhXekxZNGhLblNPMERFVTFMcmIyeW1wV2kxNitiN3kyUEcyK0NnT0NvaGxLSUtDQ3I0MlJjcXhNWFMrbzhmNEFmanN2WmFGVUx6ZUpYem9mOS83c2FTRjBKMFlCWVlCaG5nVGdFMmM0dVJ5bHozcUZDbGVXMFdNRDFDY2dlTjgxRno0ci9lUC85YmUzWDN1RjBiSzZBaEE1UUtDYkdJNWh5ci82WUNNSG00UFQ5djhkNVFNRVF1ajhPeVk0Mk1pQm03TzZLMnRDWmlCTm1JbFptQTF1bXBqOVYxRVdhdlNvN21xNnU1cXdIVENROG5jN3NCeURvQ05QcUZLUDdrWDZzREpNL2FWK0FZWDhUWnBEOWY2QWltOG1NdnVUeFVwdE1TTC9QeFBXNlY2Q1hzdjJpcmRuYi9xbXpWek1mQUFIZzJlMUd1UWhzd2M0bmVXUEJsN1ExUHNLUFFBYkxQL3hXMGlPcWVpVWlvV01nVWpBVEdJYkNrVERGUlUwR2FZV0hOUlJzMkZMbHpmOWVwcXU5MnUvdjR1TXQ1dnV0ZjMzaGtvaWdzWXV1aDZWd0E2eVNIMi8xSWQ5bmVCd0FXNjR0aGxxN3RGWFpjTW80L1psRTgzcUxsc01UMk9panJiVXRObDZpckdrNlNUemVmMmVvVER6cmpETk9MOGxBUnFWSyt2bS91MDZMaW1IeG0yVHA4L2JOM1NzUzB6YytaOVNXZjYvbG02U3o1VGFkdzd5ZFlaRW9lZ0JPZW91TnJ0aGt3S2JMTmxRdXZReExwZFZMZGg2VXBVMjFMY2xIN2drQXZSb1A5bmF0ck9ZQURlRWxBZ0hwUVNGT25NYzZyUHppVWRZdW1tMnZrek83c3pzMHNzRnFBUEM1QzZBM2tKVUFJWXNtUXNvRUR5VHUvUktaOVZPWVJBVUZUZ25ST2xURG5kYzZYbnl1cnM2dFE1cEtwejBXcWUrNW4rcEZXQ2pteHZ3aHQ0VUZGRTRaOUY0dHBHQTVwQTFIVlRCMGJTNlFHZTJRR2VXVkdrSDVpZXdFRXNVZVhCa1RxV3EvckkwdGtLb2JJYzJNcUFyV0FJWWlPSUt5RjdpR1FsSjBIOVZwZWhhbVVRUGova0VSY2pKRTcvTm94cFZqMjR1ZE0wdzhGWXlnd2drdnhQUlNBZ1lQUmx0ODNxV0FOQlcydElIRGlBakNBTmtaUkd3cTVCNUZDNnBhdW9UemN5bXo3S0JmbWVnUkFmV0FQQk9yVytEYjVTZjFra2dPMEFiSUNLSVkwa05MQVB2Z29MbkVBZmY2S3JENEF2VG8yTHFCZGNIaGNhZnNFVm9VRnhGMXdUbUJBMUF4UUFGaFU4eHp6QVhwUURxaFZNVkpOOUFsdU5CdkNFNDdoK2FGdy9HblJDNUxWNUQyUTdzU0QyeEFVelR1VUhFbGhuZ3lSUytNeFBTMWlYVGFFZ0hDUW1hU2xLTllqU2xxSGRaTjVPQlVWMmNwS3J2QlNnZ3dvUlN6Rktja3Rnb2ZSWVZLNEtWVjY2MVlhOG10UWh2b1psblVuTjZaUXU2STVDZVdOcmZxUVhlcWMxN2Y1VnZ3MFFBNEZIU0ZoV2RpZFozYm8ydHNYdVZyWTMzVzcyNmJiWGgzM0VFWTV6aW5UUE5NZkZyblNkVzl3bDJYNlBlbnIzWXo3alM3N2k1ZDN2K1lsZitZTTNudXgzL3cwRUVvc2tJSWtoSDNCb2huN2NpTVV3QlFva1drQk1MK1Z2c1pGVVRNUlNVbnF1bjBZeEl6Y0xTS3YrZTB0RXRFQ1I4NFFkZTVaTS9aUlA2RVdRVitGYzBsUHByRUZVMlFnY3I1UDZWOVgxZWtac281QVlRbDkycEo1Y0pBNHgrYXIrbGdPeEM2bXdJMDVhRDhRcXJWQm4rK1RxNXNVUk5sWGc4blRBdEN2dE4xSDdrcWRIaGNSMW9IT2g5MlNSUFpwTzY1aVUvREpCRFloVTR2UWZEdkpMODJuOXRJdzhKZGUwVWFTRmlMVE9VSzRvRFJXSDRiUUkrbkZhR0wyY05oa2NmYXBwSFlYTTY2R0NZWFdMRHZRb1N1cGhVa3Rqb1R4SVRNQlI4TjljOGxldmFQV0JMbGdna05hdVNiUzFUTXFyaUJBeDVVd3RPM2gxQzRXMGFGZXZDYTJTM1l4eUhNcWc1NUFXbWppTU9wU1pyeUJBTEFnTlZvTkd6NjlhZFFKYlV6NWRObXhTd3lGTjBGcW5RRWNiRU1DVXcxd0hQaVZQdnF3M0VSRStWcEhJS2FWWXQyOHNEWW04QkFUYTF2TWtjcVpEZE4wdWlrMGI2V1l0b3JjbGhTZHBkWWduMndEaXVHTjhZRlJQOEhlRXNWaE0zamlWNklzV2loTFQwWkQ3Q2RURHdGNXlYWFFrTUwwc0xqQVlrSzloaGdXQzM4NnJSQUM2bStkMlhXSmtIUEM1NFZRR2UyK0JQbHdLOHJvQkZtb1JSd0JCRWhRUnJ1RWhRSnFhbjAwSEt5eHlqL0MzeU90c0R6R1VEV1pZazNFZ2tFQnpiOVFJZDQ2YVNRSHFOWFFiaVlrNzdJbGlMZUZCdWVkbzJPOU1KYzRLVmdCR2FNenFyWDNoSzUrcWhQb0hjdUVESDFsaGxiV3N6NGNvNVVXUXhuQ1JjZHR4aGNYM3Z1QmRZRlFWSk9IWnk2Ulg1dWJ1cGhLNjZWVWd2dUFibXdEdW9GZndiclFOa2lDOEd5UlJURFV4dlFXWlhhbVBORkloZzU2TWt5bWlpamFySUhIQmxUV2ZkZWNEQ1BrUjdjcTgwajBUZjhMcitETmV4eHVaZGI2UXJ3b3FwZnNUbzlKTGxhQUJkWEJlN2FjMCtSSU5ic2VidWhyalBFQjJkd0NyOFI1L0xFNDZ5OTBaeWdIMHZ4Vmx5LzJBRmJOTEFIb0NBSGx5Q1FEc0JrbzZqSzBBdG5KYjdnUGk5a3NTR0JBRXdPMlhNeElnMkcrZ0ZpRFVySTFJb0xyMVhDaDVRa0R5M1JGU1ZDWEFiMk5WZ0pKVzNOcXNHdklhSmFJK3N1cWZuZ1JnTFpsTU04TVdkRWZlUHVGTGZ1Qkh1eGxlQ2ErR3Q0TGxZUktzQ212Q1pqQUZkb0J2Z1Y4MXFVcW9TbTEyTDNkRGFScW1Bd3RlbmRkVm0yRlpXUEV0bWNMLy9aOVAvYTIvNjNPWTlkbWU2OWhaZTdtWC8vaTM4dXp4czd2UDdqd1RtREpwekxCT0xXcUUwWHoxMnVlZmJFSXZlUU9FV1RDMlFyZ0VTTnZka2c0UjBCL1VpcS9PMHIwNWtsSzMwa2RBeVd0N3FONTUwSGw2VjF6WDEwTVdwVlpFTlZOOTh3RTZxYVM0Tm5Pb1p4R1dicDFKRHMzd1NhV1BSc3JJejZ4ZlF3bDgzYVZBYUdDM1VZUGlzSjdXS2M2UlpwTy9WU1ZOdE5IRENHbHdxUWkzMjgwZ2k0UVNSU3BaRk5QQUVaTElEcnFWVVVzTEhmQVpLbUVSVldiT1liNWNVbG1UMGtsMW01dkpnRU54c2xzajdmUnhtVSs2dXcvektNeDNheElhb21OSENnVmR5S01sL2tzYUxod2dqbk9SMW1TM1JkL1JxY1pmc3dmOGd3UDlmYjA5M1YwWEdlbnN0TlNVNUtURWhQaTQySmpvcU1pSWNGdmh6VGRlZjIyMVhNeG5NYno2eXNzdm5SWGVQWmxPeHFQQjQwY1BIOXp2OTdxZGR1djVwL0s5M1QxWkNvT0U2OHU5dlJXVmduREp4ZC9mUzF3Rko0RzdFMHhhZ2g0NDB4KzZaa01iNHpVYmFGaXkrWEVvTHFRNDZ2aE1xU29DT1BqMzFoOXhmMUE0YXNweVE0T1Y0eDArTkhTMVcyeEtvS1FOTVdEYjFoc3lhQU04RkduUU1HKzZNZ0dteEZ4TXdHUnNYT3VFdjF2YnlVOFpKcTFudEN3YmRzdThlY21EZzk1eHFMdWVxRnRHYlZCQ1pRd3plOVA4Q1pmWXpDc2MrUExLZHpMSGdTVGVwNHhLT01xZmJ4OVZBQytJNEVpZVBYYlNXK0V5NjkzMDBQSEd1WlplWWNqN3NqN0x2VEtYVTFLdEpJSmFFdmpEZE5MWmw3UndaUXpnWHhydVowSktRczJuYlhFemdqalJNUUlBVnpHZVZhUFo2RERtN2ZlNjFHbWsxTlllQStORmlYQklQSFJ1SU1USmpibkVGSTFpaWx0REdoRmJjUzllSm5aZ0x4WlBPZ2RDd0IxL0RSSTQ1VVIzOTJ5OW8zZjFBYlZSUjhKOStiTmU5eitDOGhGK2liQU5LVlNTNGY0VkxQL2xGWFRKeEJzKzRoSU9TY21la3dTdFZCeS84VWt2YXlxL3VGbTRYeUk0eEk0dktxcmE2L2VwVnBxSkppejd0R2xMSUVrZ0hBdGU4NytJU1ZKajBDT0hWZzNhK0l2dkczVVFXQStSSEM4MSs3Uit2ZHh0cGppdTl5VVpGR0hHWHFhbWZFc0ZLLzRHWGxiaS9McWFCeWE3YzI0RnZzcXc1RVYyejZYNWxMVFR5cVN2T3VVdEdRZ0lGVnNmTnE2UG04bUVsc3h1cTlzSnlZbXFRQ3hyQ0VXdDg1dzc2azdNUWU0SWNLUEJuK1ltTituMERTbDRSZ1Q5MkwybVZ6NkNGOUFjWVltYVRoYlVqUEduV2JWQ3pRUVR0bEd0OUFkSlA3S1B6MXlBOEFvUzAwZjFEUlhuOFhwYXcyZzJjdng0MGRmd3lFNVQrWlhPa1VFMG1wN1Jra3hzMmMrUkZ0QURXSklBS2IrQ29rQi9LdVBDU1hTUkZ6eHlTZCtWbk9aUjA5eHJ5ZWJHM3Qrb1ZySUxVc3MyTTVNRkZNVjdLT2VyNjlTU3d5endiQThpcyszaHFxKzFjcFVSYVFQdThXSS9CR3N5d3MyRkNCOU94Q1VzR1RwREMrOHZBVXpsak5zNVlrOGNKekJKK1hxSlQrOGtrR3JhZndLcHJvQmRWMVhySXh0Z3lTc01CSXFvdm8vQmRZMmIzdlp2RkZHMlNIak0xL21UWWVJMmFrdjdXUzZMbUppVUUzYjBoSHR6eWMyMDhiQlU0WkFFbTZtcGJ3djVXTnkyOUZnNm5ZZ05aMEJ5S2cwb3B5ajRpd3dSTk8wYi9jQjJtVmJSc3lEbHFzZHpvZmQwNFNpTWt0WUZrTVZQRlc3REpaV1diRHc0MU42azRCVGd1MVVQa0RwQWh4aGhLc3dDMlVxY1I3QVZITlc5dzkyQ3U1YmpFbnhabE1NQnlHaUtLNFlCUmtkMGs0MG5xUUV6Z3RiR1NvTFo1L2JuSW5MQ1FyQ3c1WW1zTmZ5a1hEaUhoVndsM050OEdpd2J5cWxGZHZhajlrQURxdHY0L2did1VZWXZHU2w3djVYQ0xac1d0dVdCYUlwMzdNaWtwMllTWU1aaHFsKzdMYktkZTBGSW02NHlNUEV4bkNtYzVwV1RFYURQNzRZYXBBT2pDY2NKMUdnOTYwbDE4Vng5WU9GQXcxS3VNcTlDVlJKYUhMWHpUaUxrSTgrL2JjRXNzZnFVT3hYQkRyWWdNVWRIekwwblBWd0JINDg2WTdZTy93Q1dXbmJ6cFJDa0I2ZVhkZVNQQmwzV1p3ck9CWUViVXdGdjdYRUJaRVpYeXpWTUZoNk83dWtCT3UzM1dLaTc4a2VPNmFEVnJyclF6YWV6MHRhNk1GeWxyTThZalYvek8rZ2NaZkw3aUxSaURsMUNWOTBGZ2JlVnZVT2llVitoK2FEU21IZm1qR0d6clFsTVV5TWh0VkxNeS8zZW9HNHZNMUIzRzhwYXJGcXd3UUxZcUFDaWszM3VWeHlJUGtqdHloYnd6d1NaSjY3ZUluOWlJblFyM0ppSUd2TERBMVB3cFJnV2kzVHpZd2M0b1cvU29BbmxYNEZiMWVPME5LbmhOanMydkwrWWdmdkVubHA5UWE4TjFKTjRISEtOcUx6dW5FRFFJc1BVRGdQNGd2Ym9Pd1FmQWVOeFFwNE8zNVhmc0V6MFlhaWRSM2ZkT203UFZzWGVHbFBaczNBSDhSeUlTV3ZsdEhBVW5XR2tUbUxORnhESWEzQXRLTWpNVW45cEFWTjh0WGZBYm9PeG00UVgyaXd2OTBtWjUray8vWnEreHk1eXRFYUF1MHBaYjZuTUVMa0dvSVVYZU9kOWdoQUNFMXJwVWJVK1pGaFZxN0dpeU51UDBKVlJ4cmRwSXgvZTIvVGttQklzOGk0enMzYjhoT3BrWTdmUnNla1JLTXJCNUhWVFZ0VStYTitYVSt5WnJvclppSzRYRStaK0FEZWNBMmkxc3Z5RWtNbmVqd092YkxVaXhtdnJYSFduUXg5Q3k4SGU0UTgvWXAwSzlTQkJtTlF1VUphVWIvMUpWMkRMYi83Tk4yQ0E2THpadnRtL0duYjlLYnljcDRLTUxNZ1NDbDFPWEcxL2xSNjdiOEJJNGIvd0EyTzVsUGxRV204Z2lJWDM4QjI3eWxYZk9GYSsreWo0R3NqcGpRZ3J5VVN3SExZaHp5bVQ5aXpCaFdKeVFzVy8vQnpHT2NXZ1A2eU1OeHNWam5QS2JxcWIrbHpHdXNSb2NBUkxPbUxoTlE5Y0x1djMzRnpGRmo3Vi9tZ2FDK2Y1Q1cwK0pxMEY1dmlvVzZ0Yjg2RjVHNFdqRUtpalM5RVlGRkI4d1FHWjBSRXNkVEhtN0tIY1EvdnM2a1Arczd0UEVlbENvQ2poS245dXpHQzY2aUovWWFnbUJ1Y3Z1WlF1Z0JVWXYrakY4RjJKQzZuaTFIMUJEMEowQUZZa2E4b1dLdXBheVhzb2VoWlNZVjdXUTduQ2lOejFGaitCelpBOG1PWTFYd0YvQzNEdWk3MFh0RUViUHdFUVV0Q3pKYlpaNW1XV0RUT0szK0xGVWdWMkVRTk1rQ2IyeS82bmNrT0RJNks3V1E5VVczM2wrUjRPeWE4TFkweHZESHpSRU1jYlZXQzlhZzVEZ2JTcnF6UGt1T2RLaTB3UmlES0c5aEJVTk4yWkZvNnoyUHQzckJERGFxd05waiszbTlRUXhhWGJDTjh4NkV3T0VnSTRvOFRkaTlKWEU4SmJncjg2TGpwZ3RwMzhzRzhaNElzSVpGWFIvUGF1TjkweUlLN3hZQzFXTW4rUEZ0ZzBkdkJIZjRpdVlkTTk3UGQ3MzlnVzZieW13VWVOcU1md3RUQ3VkdTVXWUtEYkJheWlHdHBUeTl5eXRmMWRzOHE3eERxRFJtTlkxTG03bGJzbE9UNzF2RzBZcTFqaS9kRnpzL2RuZW5CU0ZIeWZqRzdHdTBzWTk2ZTdQSVQ0dEFpeFdYbUJNTFJLdG1sZ0RoaFcxN1FkYU02R0hrUEduTWsycGV5K1BQVElzWVloakRHT2RTb1dEbWxpQ0V2RTRMMjNUOWdYcURYZWJVMzA5a1F2UThDd3JubkpwblFMdjM2RmNkbnVFbVFQYUxQUjJmeGg3TXhaY1NjbFpJcUo1aXFNTlpzVTJoUnBBMktaSHE3VDRIOXlxcjhtajEzcXlTTmh3VWozalE3NkpMUi9md2FRRWdvby9qL0EyTm5RemlEKzQ1TnlOSUVKdWpUUHBocXdJb2RTd1NKL2tLY0Rvam5BM1QwYWprOXB3UjFhTGxCMnpoTEZBLzRRQXB4aFgxZnczb25QK0hBTkU5V2g2azY5MFh3bkFvQVFjdnZmcDJORkkwNkR4bllJbTZOMjBHdHlJL1p0aTVxaEdDOFdBWk5hbVVtMC80WEpKZmgxSVdaRHZpNFBVRUVub3pVUDlteS8ySkREVXB5Y2JrNjc0TUt0ay94NjZKQjdnMnZkd2ZUbXRqMVJuMFl1Vkw0WjhtRVRpOEJiaHJvQ2dPY0ozRGdoTHJHZ1F3Szd6cmlsc1FDR1Vkc29MdlM2bWRnUHM5SXlsZXg5L0x4YVMyQXpLSWpmTitVMkVvdzZIQUY4N1I0QU5xaldIdkJQR25EMldJa3JZQUR1cU5XK1FVc2ZjTXYwemZVd05NRkVPSG5FcWo0cVZ4THdJaHlpc3JTMEVxaFFUUlNnamhNQjVCWm10ckRnOGtPM3ROb3NPdHhWanBWNEtVZWlLclJacWZGUnBoWVEyK3FXQWNDT25EN0ZvOXlmVE5INXgrQVZoVXphQXNLM0xYUGdzS3E5OTg1QzJvYk1Ecjd3WG5MOHZqYytONHQ3cFlJWlJOcU9UUFNQMFQwQmluR3ZUNXNCdE13WHhJWmJ6cTE1N3VQMFNZZ0FjNWlZM1QvTGprS1hmMmlBWTkyWU1mQUJhbEhDdHJIa3VKVzcvakdNeUQ4dklyT3k1UXVWTUhNd2IyS0tEdEpTRXUvSVZzcTUxM25nZis2ZndVVzhHVGRrTUNRSTlIM003TGh4SUdGcFBpYVA0UWdVdUM1OW1zZzYzS2NLWFREQzlZZjRzMFRVTXROQXR5Z0tTYXFUYnlHTDlwajBEb05QRFRwZENNMEJxRUx0eG9Mc05OempvNGNVbzdwbVdVWEUvc3c0MFZ3Qi9BUnFKU0xzanN3UjA2d1ROOGJzSk0xY0hKdGx5d0M3WTM4QjJFc2RvbnY3NkE1Z2ZFemFnQnNBQnpMRTZnZzNES0RXTitsNGU4QWx3TkczUVptc0dBS0hSR2UrWlJSZzQ5SzJDc08rRlo4OSs1bDB2UkkrU2JQT001MWNmaE5tSWdkUkI4WTlRNXkyQUV6Z2dtYndBV2xuTHpVYmRFN1pBclpHUUVDUGp0c2hmNDh1YjE1eGR0cWZhd3RpN2phektOQTFzR3k4NW9BZDJITDVJVkFoQlB0VTc1cnFNakJITTA5bE1UNkNnRUR6ZWk1R1MrTFI0Z2JaeWpGTUlmUWJwY0g0MEVVV3drVC9EMERlU2VkOTBPQ3QyNnlxUWJhODY3dStLYTRlRkNheWxDeG9JR2JaV1BXU0Nkb2p4L0pjUTAzTFRYRHA4ZWcyQUJzUGpaSmZqSjNOdDBXT0pWdHRPenlpZlhBeTBYQkpKaVpqZXdBMWJHcEZlbmI1ankwa25nTnNzMk9qZDVaSldLYXpoUUh5WnBWQkNtQVI1aU5mb2dXNU5qd2NTbHZ4WWRBRmFiMUQwQjFsYU84VzlXNVlseEYvMDhYVTBzNlRFRUJpd1FCeFVMTnJ6a3R5VUpENndCSWtRem81NEh0TXVjTmJIT0J3alhBU2xiWUhPbXpGVlVYaXoyZ1l3YTdaVkFxeC9kNnJQdlNLOUtMYUtZVk5mRGg5R05VdzdHRy9DbEhiNXB0eTFldWZpakdCVXJ3ZHpGUm4wVnlPVjdlallJR2JqYSs0R0lCZWZLUjFMOWljWDh3a3RjdmVsanl0bVpyVWFxVytrMU5JUEdGTmE2U21leENrTjF1dDRGZmhyWGtNbGtQZUdUdm9RUTlzV2RpR242ZldXcnphKzVpMzdJcGRBZXBBd08rSEhHamQySVd1Ui9jSzZzZUY5QWYyTWtud2hIVzluL3o0MmJNejhBajg1K09jUGdqb3FveUhlLzJnd3FQZ1dwdXJVWWN0R0JvMEhwQzJXWk9WV1p4eGFyeVJxOXZ4VWJERzljbjlnbzdkRk9EaHR6c2g0Z3k4VTVINVpMSm9QSHlMM2ViN2oxZy95dC82Tzh0QVVaY21mdkZDL1F6bjRXVnJBVm9BdG5HQWJVdFp1Q0VQL1RIeHBtaUdoT3NsTTlHeUJkOTIyUGhlSWxNd3VhRDQyY1duMlI1Q0JCT1RtbDEzbE9pb0tCVFMreXA1NWFXUjNKTDRlRldoZlUxcjV1b1dCZmt3QlhmZ0Y3eWlWNGFHWmVSb2xURU4zcUF6dUU3WlhvK1VwSHF1anpRZ3VNRTIxcmxXNkl6TnhmeW5sRE1ReU9JQXQrWFRvREdrR05FRzZlbTg0TXlwa3Z4YUFRam9uVmVhM0ZpVGcxN0U0ZUxONzhCTHpnVXQ5VTNPWDNjcEViUnV2REpuSWIyUFNxVyttVnVLZFh0a1VzQ0x3M2c3NnFGSGtSalM0cmM3MUcwSHZTNTMvQ0FhckdlSFcvMVNPYXZpeTdVUzEvUjhkNUlvenhLWURWdnFrck50RFBvUUphcGx3b0g3Uy9ZcXZsUUJSUjJRT0ZuODdGZGc3OEJqZ3lqSUloMFc4V09pRWdtS0hpQmcwR3o3SlQ2M3M0VGFEUGxzL1VYaG1tNzFnQytwbTQreXIvV3ZkeWdKdG8zcUU2cUNSZXY2bVV6VzNzYTN4L0dBWDBuNmVSNzI2V2JaR1BhMktIM2ZNRHRoZ0xqNVVwbGhWWWZiQ081QW9VbkNrZWhxZUUxYjJmWGY1dzZ3MkZhSWdLMjR3T1RUN0t3MzRwdllPdGZPR2l2SVpTZUJtcWl0RmdBSEg3citoM0lYYjVGYU5QeWJYMGVpY3ZndUhUZnRoUlZQZ1JPajhZWmJZK3hmQVRzdUpFdlBaUENOTlkxeVNaT3pmOFVnTk1kUUdybUhQbnFuSTlmTGNqd3lSMGZZVDFFdXg5MUlMQnVyMldaZ1BCeWQ1OXhGNm5jZkdaNUM5WUIva3FsYUtyMmRIVXhqTmNVcG1OeVo1OEIrcU1GUkVpSk1neXA3Rk9Vcmo2dERhQjVoZ2dUVVJUNmRseHhBWmZZUmhpMjNMdDlYVm9ybnU3b0QyVmp4cEVtOGZ1TnlBeWpDMTd3WCs1dDAvbGt6OHRuUW4zODBsc3psUkdjWTkrMWNpb3UrbUkvdUFJWklMaFYwTytXazFwemxsbFdZU0syOG5NSVlFQ041UmNBdmNWZWorUzQzY3NWOXZsTmRBaTlVT3cwUG5ibjZ1ME9yM1dNeTY5L2xGRXZwdmVjSWs5VmtWZnRjb250c1dOWFhDNFV2THdJUTdZNWE3S3ZMSjd3WXFaNDB1WmxIenl1akdqZ1lXajZPWW9sTjdWdG03OTNpN2Iyd1MzU3JiaTloSVhWc2wzQ0drbFVlRzlhdTEzRXA0TDJVMTNXcHArTVNBSittWXBiSGgzbk5PODhGZXMvbCtjN05aK1hwNVRrbHFwYmN4M0xVdXNialE2Nm9heGpKZHRORmI1SkhSSExMbStzT1g1YzFoNmFQZEthZTVlNGExM2k5TEQreks0TzJVMzljaytJVlZ0U0xXaHJubmxjbmgrYys0WVdUUTJySkpDTmwzMzgwVTVua3BtU2NzcnRxZTRtZWhrb21rZkl6djZUY0Z2RHMvaU9ZUjNrT2pKZkZ6QldzS01ZSGxMcW10bkUvTG02KzZJenFRTCtlNThVSkJjWGVwS0dJVkRVbGxsZUVGYkdLM1VuK2lBeDlXWkUwTC8rT00zVjZ2RHgyUG45Rk9kNnYxRFY3eGdmeDRESlUzYU1RMjVrMEhKR2lxc1R4aTdFQ1Z0SGJFZDJUb1NjcmtDR3ZnNVllWEI1ejZaWTNCcndsbWVTeVF6S0hadW1zcWRNMFR1ZjNxS3JxSmk4NWE0dkJneFJDNWNsa3lVcUtSREZsNjEyN0hYNHhvZGNrZk16SURQQzhHWFVNVHU0NUFTcWdrL1RvR1dXT1d1eXRQeUVzbkphQlU1ZXdGUm9oclJKYlpHTlY3R3RFN2ZtWjc0QjV3ejJuR1loSk41THZ1MllwakI3a3RkQ2sxQ04xclZ0NzhuV1l0RTAzN0g3aEhGSUNQRXlyUDFNNHVnd3M5TFdDWTBoeFh3RlF3WDY5Y1pZTXBNMW5jaXJ3djZqNDBlMjc0cHJ5NDF3dFJWUE9hNWpSaFNSMzF4dzQ1QWczZmJNZGlwYkVIZDEvZERXd2V2dm44MVFnd2w4STZjWGFJSzFCR1JkYmtwanlKZU5TRGd1SXZadmMrRkZTSTZCY0lhY3d0NEp1NUdZVzVCTm9sVUNkNmErQ3dmeEhXN2dYa2hQWC9sMnhLWHhjK3RKd2hkdCtUdVBVQjhyVUxlalR6bzdFUDJ6Zm11ZTV2RE5TeFNpOWlhc2JwRzFrMzRsYnRqUmJGaHpVWm82aG43bWU5engwWGo5Z3Z4QzVHQjdmOHlRK0s5NjU5T1NId0trMlh1Y2QxV3JRekZZY0lLSHNuVk9CeXNsaFUyZHVGOWZRNUs0dXJVbXk0R0w0RFhMS1hmOHN6NHBFTVdWdTA5MVp1TjFWN2lDRUxDdk94cDRCdFY3TDVLZk4wVkgzUzhObGZabHFmcmFUSm1jMER4Sk1nL0JBZ0RlU1VTY3NkM09OYlE2RGNaNGt3UExjc3JMNzRzSzJKYUVzYUt6U3JLdzZtMk5DbTRuVDgvM0s4cmtlNzEwWFpRVkxQQlUvVXloNTdUVCsvSTNYeWpXZk03MlNQdnZTZ3gzSlFSMUhqYjRlMHUvYjlFQ2xDVVJxamFwS3ZUckh3S3hqdGRXSGNaV1duSDV1OTB5d2oxZ2JRNG1rRjk4NjNZNlkzWnM5cTFUdklhUnU2RXpycmNheWEvNkRUelFxMjBHSnB5dDF0M2poeUc5NEg1TnVlTGl0VDBqT1pkcUt6R0VsS3VNdzhSNGM1d1BQWUlqSm5aQmdwcUFuaTNQdzRyTm5tZVgzZkQwM1RjNWh2b2NxYmtGUEMxcnJmUzVoRDAxUm1kQThWd2pIUWFxS0phcGN4SmxjV2VvYkNkVTlrTjVjV1FIb1Y4bmlTMmJWb3FYV3NManA4V0JvUW1WV0E3ZTFjZjE1YldyZnZKb3pJYTAxSGpodTE2WXpNcXFzSmYwYVY4MzEvMnVvQ3pqMmM2bWRERnB1clVuRlJCa1REa3ZWdlJibmFNZlgxdytwOVV1cExxNm0yV0htTkpaVTFIRDFlZzlNQkNydmlxbzRMUEpBNmRaRlJrL1E4QmptaFlvRnNUMlpETmRScGVoVXV6cHJVVDdjYVR1SzEzbldiTW83MVJISUgrZ3JZVmVvem04d25CdXkybUxtcnpNOCtWbzlqSGdmNzJrcXlldXVaSEVFblVTcEV6TXBhWGYySTBDVitteEtOaWFSU2NUa28vTUt5bWltaUovVHdyTHpTSE5JbWhkcmc3d0dZV3padkxnOGF0R1dVNEFURkVsTCt0bEs1WlRCK2g5UEczL1lvQnZ4SkVKZjJGdHd5bDh5ZDZqSGhGZms1LzY0Q3hUeHRhelVrTFJ4MFR0bUNIdkpmY1o2TnA2VTEyaWtOd3UxRHJ1Sk81VkxTU0owaWRIUEZSK1llM3IrdUo0NjA5ZXZvL0Z3YWttT0xwTGwzOHlteW9Yam9GL0I0THlrYXdmLzJEZTVZZnhmejdRRU12Zmp1MHM2MWd0djd1M05qVm1xeTNpR2U3U21vYStVNDFMWDd1WmdNVzdqVlRiWDRHU2dzdkNVTWRCdFBGUWdNZlNtRmVxc1VjUW9hUnB4QUZPb3dOSk1lVDdvT0h2SS9NRkRqaUQ0czljWlhzR3I5TzlGRTkzLy9mQlAxTDludkRlbDA1NzVJU1lqekZad0RqVkczYTYwMzV2aDBrVTBOQlVmMW1qb2txS20vTml0elRDZVlBWC80TS9mSHpBWnMrblMzU3pSRGNnUmc5Z2xYTVpJb1hLUWJLdDkvN1AwMElsR2kyaDIybGdaSFdwVkdKaHVQekJ4NzE5cno4NUtmRkkvWFJPd1Z2a0hqdnlnVlBwWFlFdUpybDF2NmFtYWVnL1JERnI0ek0vK2E2U3dJc0szY2ZMWVArR3RqdE1vemo3eXlQR2hmYXFPRndLcUR4dnZHcjlvUG5QdXlZai9mRElYT3MyREx5WkZjcHU3RElnaFpSeGdoSTdlZjcxVlhMWjZhR0t4L3hHemE2QitDL3U0NDgyVGF5ZW1FZXAvaXVDVld0NlJWWnlDTnNXWEhYTG80VDVNNEpXN29GREVES3pQQ2I0TzJwbWl1bXZlSlhIb20rZUhOdmFYOU4zTzJvc2lUbkZUTm5NZFBZOGJleDVxNExOdDBtdnIxWDJpQUdTdjhTUUdNZlhvMERtdHl2MU1aU1ZJdHJYV1gzKzByMzdaMlZlQ0cwY3VBVkE1eUwyMWpNTUo3ODNPbGU2cFFrMzgzSW5Mc0xNVnNPcWlhREp0ZFMzc2V2eGcwOG9xTjF5T3NhMGVmTjJieCthOG1wc1ZCeXEraW5yOUFyZWRDWDhNaWJJbWxpRm1JM3lPaGZ3K2xITVNvSFBoSmxJU3ZUVVlqaXdWRnlXUHg3ZGNmY29BdlRjZkYwb0FrQ1Y4a0xFOVZEeUlCeDliNTN6OEwvTzdBcVg2NGNIUUtaeHFjeEljMG9TMGwzZFJDVHFKdXRqR1M4Q2I1aklib0kwZlNsTC9OK0xGZkNtN2tUbTg0TDNsa1BBYjBYaXZSK3N6d2ZYazRSUGUyNDV4MC9JSlFrdU5lcUxzTE9JNTYveUp4eXQrVXppUFF6dGVjVGJwaFNxTzdPYUMxYmkzTHV2SU16ckZXcE5IZVAxRXp6ZmtsaGtQOGVEcndjTG5lWXpqSHQrb2EySVpYUEtjOXBGTDlnZUFVYkFtYWYrTjh1dTVRL2NyeVhMbXlGS25QVEhDZXZWUlFEVzQ4cU9hS0QyYkNJRi9USWdmUEoyYnFXVnR6SGYxcFg0L09QZlF0SlZ0T3Y3alJPaE10bG1XNitGMEJlMlRpd2xlVU4wQ2dwYTA4djJhdVl2bVJaZ3B1Q29XSVY5ZEoxWG1jakJ0WmxxL3djWTUybDk5dXRqVXRKYkZUeWVPZTQvbXlpdHFrMFNrTENPUmxDdlQwMmo3bEFWK0cyZlFWczlkSEsxOXprS1JFR1ZOT29pWWVTK0JkekRLblFTeWdnN2MxZ1ZmNkUwTk0vV0Z2VXdkQ1B1U094SVdESHVtL01HT0JibmxGTXdYZm1GNk5mejhPWld1OFMrK1pZc1pnYkdDbGQxcXN6SkFQYktLOEpTTllXVngzYitrODF2SGMxL2Fra3pjK2F1QXZ3TlpnL0JFblVhNVkrSjNjNS9YRFlEdGJCdmFjVE1SclVIZUJsOHcwVm91dEhzSThuQnNLc085ZFhvbmNrRVBhUUFMT3J2UlpwNU1YVHpvRGp3QzJiY0xQVDcwTXY0VS9pcjZDdmlmeVhzOWIzdmtjUzNJdmFtVmExdGZmUHZ1dEZibGpDc0pIQVB0TGFFZW1VTE02c0g5SllXSGJpYk9RcU1vNEZ0L2paRDJmeHNqOWZuM3BLS0lveUt2QmZYdFJTOWNUWU1Idm90QmY3Nm1WRGdDZnV1dkNLRjZmTjlSWTN6bDBXbmpsOEh2Q1VkdDRMMG9lQzhBcm4xWDd1OWtON0Jpei85b3hNUmFUME9qaDBHcUFSbHJ4ZVBKZjE5M3VuOThTV0JrMTJLWmFqS3dZcUlyb3A4K2tQQVFzQlRQREpBZ0FkNEJWOXV6eWlsLzRjeDY5bHFmbnVJbTYxc29SOU11bTVwMExSa0lFTTlWekZKUlFrbmp2cGpsbUdWQjZ4NnljaTlFalFYOEU4WG9Kd3EwZmlsN3FhTWwrNG5xZEU5d1ZlUUswSnRwMmpiaWllUUx1bWF0VzV0cnp0YkkrRTBsdzhsSFJGWFZ2b3cvSmRPMnRKWkxmbmYrMjZhWllmOTVkalZqQkxZL2UzaXFBVUhTVEd1cTUvRVBXbjBKN1M2U2dOV04rcit4OEpIVXlCR1Fla0RDV3U1c3lYbWlQdDBYWEJWYWVYVllwcElNMUFuTHhWVG51UFZMTWNzeEFkakRrSDh4eklFS2NDREhtS1dSQ3BwSzlkVXNxYlo2WGJSbW1zNURQSjV5VWR1a2FjbjRRWks5YWRaZjZSbmdidnQxL3g0N2MvYklZSXVFTzN6YzloT1pueDZGQnZWM1RYY0xSakRjdEhGVzhrd211Z1BTL1FpVFk1UGpPQXcrYlVCYU93ZTFmYTFGRGR0ZnR0YVp4QmE1SWM0SWk4TXplNXdXcldTcTRxekVJWVc0T1pXYjc0aUx5TXg4anlhMlQyYlV3N3NoZGQvSVpINUw2UEVIMTRtT2RvbVRTNzkrN241MWZrM3c2SWxDU2UwK2FxVlpsZkhEN2l6SnRoWjE0YXI3QUVHVnpnbGx4WUV0NzBoRnhVbDJtS25IYmhuckNyWGJPbjQvWnNyUmFLajRiZitOMWJyRFcwVm03UmtOMG1yVFlVMHVMWFVMYVcvVGpDRVNoRGhkR1R3czhwZzlXYkQ3aEtpM3VJdU9ONVdKL1JyUXh3Ni9GbmxGVUk2T0kxdmxaREM2b2pLWEtrdHJJR1hHa3VnUDlTa3Y2cm9vcHRyajFHRDFkV0FJcTJxTW9aYTNsNUhiZGFnd1ljbjRpWldKemFOZEVCWlRJT1FzV29iZVNSdTFmcVJFaVppbXIraVdoSCtLMVhaREo2K2xJREUzTXdnVVdxVC9heVExekZFV2VDVlpqNFRKVmtXUXhacmY3eFY3OFh0aU1IZWlpNTlRL0l1V3pXT0JNOU9uMGtDNG1PV1lWWDk3ckIwNUJkYzZub0xETDcxN1J6UG15amVBdG15QlB6NlEzcXJHclpqd1RUMDArNkVQZ1dhaDFZTk1lWFByUUdpOFVHZDA0eGhMM2hVSTlPVUFKVU9qSjFhbk5rY0FWQktGd2VNVU5lQ3JtMldiME5icTMvaFZaMGNCOXJJTWtwQlQxSWl0YVZWZGhmVmFQekl3aTdpNGV3cjZ4ZzV2VnZVWVU2UDBFaW50aXV3OXVvU0pZNXRURjBiT3hkTTVERFpycmpMd0ZuTFk5cEhDVDFIZmpNMTRvOGVSZFU4MTNUOTBobC9UZmJIbnVObHJ3OXhWYnRSWmdUbFE3aXpRbU1samFaZnFTRmtlSzE5R2I4SHJxb2pqS2V1R3ZxNWdKUHJMbU8rbWhiQTNRMVpqR0lNVlF2V0FsTDNjT1RFMzYxUnZjRVZvNWRVWHMxV1MwRUt4Rm4vbFc4Mkg1Z2N3NGFRQ1NIeElhcjRNdWg1T2xJSlZmWUJITWF3Qm9sQXpLR1V0ZDdoem5xalBjS3BXUlRadUxaYWxLZ0NTSnJ5eGNma2NRNjR4V3lQbk54T0drdzhMemRhQk9wcWJwdk9RWGcxV2RRdEsxTi9jRFllcTJ5bkN4TGRXMUthWGtIQnVEOS9XUjUrTGtsVC9KV2NEc2h4QWVROEw1ckZ5bVNzTEp5eEc4OFVFYWpvM3MwcFI3S0RyTllGbGpxdHlCZk5LRVFjM2tLSFUxOHRZNldFaUNqMmRpcW9YRTZ2NU5kYnBHOXo0QmxCZDBOR05DR0Z5dXkxcmUxMW5hSzJmQjF2OExTL25nL2JZYXM0bDVCZVF5OUtwZTJxemh5MXhDYjBnU1VjWnVVMkpDUmVuQjArdVRsOW9CNURsR1V5K2tMTm9IWGt2YmRUNllRK0JRdy9BSG9aNmgxZVBNaE0rQXpqUVY4a3QwdEFCVENKcHQ1RFNTV2l2RWJuT0k2Vk0wT0pPRkwwN1dydWpGblhtdjVBLzlhTnluVnhNeDNtVWZqc2JlUVBhS2JUZElBMFhTR1Q4YXpxT2VKTjVTVDBzZFpzSlhMRUdSS3JLTWcySkpMUUh6bmxzdGdycVAzZU1kK3k1dS9MLzlBZWZ1YUMvQU1OL2s3ZDBwNEJQQWlLOTNIYXNoYnNmeVBGZDVlU0hrb1FQb0xtNnUrL3ZTSy93anpJZDU5R2Y3dDRlN0JvTVVHQ0lPQmQ2UWZXeFhNWWhhSC9tejQ0eUVDLzBNaVU0VTlPVUZFWktLUGpFa0FCaDJPaTJ4RURyaURLMm1rS05xMUw2cHJHdWxQaUF2b1ljVjBrbnhUa2EvVTJncDdpUzlCbytERURKeW5taXpJNGh5aks0dzNHUWI3Y1pLZ0pZd3JyUnRobXFDVjdHMkVOMkpzWFpHd2Vib25keHBXaFZQSGdvT1Rydmc2b3NFTkdBVmtBREVVRjUyV1FUSHdFa2NRbyswOWRBbUZVMGErS1FvQkhKa0VYUWFUU3dTK2VkelhOQnhCTjBoQW1TZy9kUlVtZGkyb3RZNWMwd0JaS1phSUJtRWJ3VTBOVFBxV1IycVJzS2oyNk8vQ1FwSmt3S0F5MVhqVTF6aVhRakc1T1dqMHhnUHBHOEJOSjk1Rk9ldmJNUW5YVlBOdG81ZUZTdUMwL3E5NlN0WG5CQlBzNHVYbkFsa2pUVG1wcTVrb2V0V1lPVExZd2U1S3RqcFNQSjh1MFpsMktrWVNPUEhUUnVTN1E2KzcwN2NobDNuYjNqKzlwUG5HVlVPMWJ5TjRoOW9ZV21NczJrTFNGSUtYWEN2TTZjZHlHWkRzLy83cWhQSmp3SHkrdDk0RlF2TDJ0TXY5K1RJMWYyOUNZZzZ5cEtrVTVFWDU5UzNkUDNRNHhtV1hsOStnZDllU3BsWDk5L1dqSGxGZW5PUGIyNVYweE1ONFhheUdCU205MVVKcjJKU21sbU1paU5UWlRDYXZ3ZWxLSXZMV1VKRmQvMWxRZ051VEQ3NGJmUFoxVmUyTGttbjVXWnZKUUo4NkVJZTdKVXBzS3hSVmhzN1c5Y0FJY1B3dHJxMGo4UDdwL1Bsd3lNYVdVcHMwb3NNNG1WNU9KWDFQQUVsS1k2NFh1MmptYVdXTk96enZZWTVwRlA4cFBKc0lGa2FyRTlnVUxCNGJTTTZod0dvb0ZEc25Qb3BhMTJQVEg1TzFJQTNXQUtQaXYwd0ZGU3E5dUZXZGtVZTdrazVSVWxwVVJCeU05aDFwTmd1RWVSYXUraTlBdXBCU2hWYXZHVGFZMjdLUDBDYWo0OGVnZlk0dW53N1hZeEM5SE9ld3RSRXZNTHp1aDdkeVdpNTQ5RnVsNWRqQmVmbncvWHVRZDU3K1dmOXdjT3Z6S1gwRS91UVl4Z202QW1XRTdYOE1iaGs3NzFRSDRqdExCOWwxM0I5c3pBRjRheHM1WGZsSEgxWHc1TmZXVXBIZm5LTUh4V0wyemRWOE9UZjBJVVluK1dOQlVYNU5qWUN2U1NwTS9ERTVDWVpYOWpVL2NyaGc5cDlyb3hMVUVjcEMyTG1ZM2xJblhSK293eUxKT1FKeURnS3hNN1NmUWlDcXJRL2ZFMGpwc3BFbUU0YTc2d3ZMdEI0Ymg2SlNPcDVwZ2VSbjBvTFRwWWdOMGZZYVBnM2JYUTNOdHZNcnYrV0JucWVhMnkyUEpldExkZVJPY3BLTm82QU5Xc3kyTG1yTzFQV3kzOE55S3BleCtpRzZBUXJER084NFFqV2gxL1pKeHZOZ1Q1b2hHZHR0VVA4clFOWmxPdFVtdXBOVmo5M0ZxbHNUWXk2SC9CTC9jeC9LczFqeVFjOElLUGpBUDRzYmR6YlYyaENWdjRQY0hjaUlLVXFEOHNNaFY2cTN0NHRIeDNRNGVlLzg1MEJiZzVHdklDZzlZVy80WDNRQWVxckxwS0l5S3JLQW9EdUVwUE5LVVYwL0lJMUhMaWR0ZkIxTmNLOXowVk1KR0phZ3FMTktWNnA5TUFEYUdLY1MxVUVkZDdtQUdQZVBHK25MT3NTbHovNmttaWhpMVVLelhDenVoZmtiUjNUbGpNd1FORk5VMjRHLzZ4OG1lYjR1Y0tMSm5iUWpiSGJITSszdFhuUkVMd3RZTDBUb3ZaVkNTV0EybE16K0tpaWJ2Tmt6V0Vsbmd4bFYxT01mWGlJaUVTY1gzSW9rcjM5UnpBQlNhNVVKVjZ1U1ZzSVFJS213SlZqd3dNaURKblpSNGZYZExWTk5VZ1REOGs2dkN4ZUpZaWZsR3hCdFpVTG1meXk0dkZCVmdsdkpFb1pVc2pQa2owRkdXeFRuVTM1WDIwaGY4WHZZZWViRDl1YnN4N2E1SUVjNjUrOFU2clk1ZndiQkxoVHo3VFlFQkg1ZU5WNGx6ZFh1SE9LWnl2V0NBUUo0d1hTYVRRdGpZU1pvaTJkeFFWcDJDTjhlV0ltUy9OLzgrb1B1Z05hNXE2TEVVblpIaFZPVC91MEN4aWNuWjA5c3ZaaVByZEhIaVNqUWpqeGxyN0hOQVpUYWJmRUwyeDBxQTFtSTEzd3UwNlprTWw1QjBoU3pGNnBvQ1JkNjN1YzYyNjFnVXNCVCs0VkNlZjNmcitPTFhtTTcxT1V4MUwrZVFDZVpaOGt0RDYrZDR3cmFLcmZqZXNHVjMwb0grL2tOMDllNzAxaHllZndxZFV1dUJuWWk1cVRIUFdreGVmZjI1WEMvOTNjdVFaaldxMTBTZDllckhyTzd1bVVTclI5S0NNYzRzZGVjem5IYXNQbmtMcy96cnRENk5pcUFaQmx1bmpxcUxjcWZHRHJlZXZLM3FQWHh2cFp1UHIxTkxZZnhsN0NFbWZ2K3ExczBMWGEreXVYN3pNcjljTUlzOGUzdkFYMFgxZG5icHNPT1hNSTVFZHQ1YkV3Sm1VN0IrdUNteHplUVhVYXJaSzNFUmd1S1BrVVVYUXVEclJzUjRKR0FqRTRmQWlrWkxDVmhsNXVhMDk3MFBkNlo2eDR3SU56WWdscWxPQXBJbGF4S0ZpN3BxeHFlNUVaN2VFTzN6TTlpT1pqOW1PbHV6cm1obmdqZVJ3a2llNXFjZVJTdWV5RktWSU91aUV2UkZpVHF1emQ1YUFBM2duMGR6RU93SlcvNFV6NmRsVlBqR3hnYXgxVTQ2bGJwbWErUzMxUHlwa1A4SmtXNlVVZmtVSmYwUmFOMGQ5aVkvQUU4bVVzenJkUnFlYjhXWkI3ek9HTnMrNFBZRXUydDVtL1pFaUFqaTV3L3B0N2dyanYzVjF3L2VCTzI5dXF5aTFmcE83dWFzQmZjUHRSbjR0K1ovYjg3d3VPU0JzSnlqTTJGWm9SM0VXVklWajZ6QTA3U0JYM3B0eFV0cFFPNUVHN0hoRUZXWDdYOWovUEdqNFRobjFvYUgrUTVMMU8raVRkNUFkUU93UDBzQ3g4TjBqTVNuZEFrZldQZVhIeUVNaTdFemJVWjFsNGJUMS9hQllSTFdqWDFYTTlvNmZFZGV5dmFuYnR5MmZxMEJub2c0aE4reHB2a1pnKzRLUDNPV0ZpS3g4ZGdLZTNvbzMyQ25EcVVzYU5KQ20rU3huby9jZUx2UWYzNzBsV3BaK0VJajlGODBZcUJBRUZwNjU0czc2L3kvTnJtNUZaT1UyRkhOVmt0Qm9zYlpQTWc4ejkwaWo5eFlwL1F6d2dGRlZsUThadmlHKzhVTng2bjhqdklyWWpxOG14ejR6bFhEclEvOVpUdUFScmU4b2tLWmdEZkhFcEpsTkxDODByVGIxOHl1aUNhWFZwakJjMkxxd2YxTDlvdUZiTDBkMlk4R1M5ZDNlMlpzZm5mdWsrYkVlR05yZzE4OHU5cWRaV2M0SFdaazlTNTFkRXZiSUVkc1BaSDcyZG9Ka1g4OU1MMjkvRGk5bDJ3UXY3UWhTTFIvTHQ5cmczQXJiSFhabWdOMktWMWVWQlJNM0tsc2JKbHZwYnJ6V1FSeEpYdFVPZDB3R3YwM0llU3NydTBxVlQ2RlJCRUdoODJST3hNWDdBT1BvbXRxbVZ6ck1DTFhFeXYxUWgxOVhUSisrNVEyeFF1T0tBS2lENlB4U1RuR2lwUmhPb05MQ0VRN3ZIVTV6V1MzZFRyV3B3Mm0yZTExNlF4R3BvcmlZWEZHWVIvR05lRCtDRVBKSTNLdWlRWTBuWlBGVGFGblB4K3NYUW9qMldER3BRVlZTa3NGS29XYVRVbExRdUZvdzl0M2tCbHppUVlDM3V6NEFVdzNEbXAyMXdpejU0amM0Ujl5MWp1c3Q2c3Z0VEFzUG1UcWI1czdkcEs3SDBTKzRFWTk2TXkzbHNzSk5RcW51bkUzS2FRajk2L3RVeFpJcEZJRjhMaDltS1JmTmR4SnZCSENCOVN4SmZKVG94TDdHN0UzeU9waSs1VTVrS1JZckpjdFhtekJFaDRRY2lBREJNS0pFTnV2cnF2c2hjdVd2ZmNuMVhqbTJ4cFJmWG1ySXh0cGxVbHl0cVFBQW1PTHZGQlc0N1FXYUozNDhodWZtaUVRWTBWcGJwTmt0Rm1HRWE1N0d2SS9PYlJON1Mza3RhR2cveVBndXljRmJEZUZmVEExQ3ZZZlJ4NjdTWm1CZHgvQ3JsMzdiOEZmYmhuTHY4TGhQbkFZcy9hcktmeUY3NEF5NDYwYmJuU2I5N25odmRUOTVxWmR2WUhZalZxZVVrOG5vaVU4ZVRGMHNXQ29ZZmREZUJ0NXB3b2NzbXgyNVk0YU5Sa2lKcXpGVkR4aEtqb2RNSGQvSThQRmhnTko1cWM0OWw1VGxFL3ZDdG1KZnJLczM0MTZhNVJlWjV5NUsyZTlmM25uNExCenlzNU5WTmVSS1Q2SVRXVUkzNVJhb1NoazZKaU9WREVUcmVoYk9nbHVJcEEvTmZ5akZkbnNiQ0toR3FkWmZqSWhvOG52MFowek9sUml0VGFpTWpJUlQ2RTFqelJaOVkwL0R2clFTQ1pOQ2RYUVJOQzNOYnBHa3RrV1ArSndWeEdWeDNLTVV1VU93YmRhSFVrU1hzZ1R3V2prYnp5T1BMRDZ5MDlrNUpGd3huY1BFWXMvRlZYeFlRVmxZSzFrNFZmTENLYXZ6TXpoeE9aTXJMc1dWQ2t1NVRHRjUwYUUzY2t5UGtRc1VkRVdITlhCamRrRitFVTlGaVRZcHliNHNiTVc3T1pSQ09xV1FVMHAyQ1NQaFA5TjIxOUJ3UXc0bWVLSHdoS0xYeTVlMXRVOU55bUViMkpOS1h3ZUwwVkttMHVGbjRSdFNWYW0wRkM5WEVNWVRUMGxNV0ZORWZEZXR4cjkveEZ2eVlkdllGV3RYR2dWd1dkSFZTZ2xOOSszaVNFZGlEQUJkSUlsbmJPcW9JYVozQ015dEpiUTZncUJpbjQxUVVVb3ZZd21aQ0YwU3FkUUFqUUhSVWlpQTVkUUFMeEpsQ2hqRTB4SHVhQ1NyZ0dCbzlOU1IwdHY1LzFvSVVhM2ZQOTVaOW1ISDJHVUwvaUpXWEppanhwSUlXaXBCV0w3UFJpQ1dVZUNZTDVOWG5SODhmd3hBbGFHelJBTFd2SG4wbmZTSnFvKzdDVDEwUCtSaDZCRm1kWUNtS3BQbVQ0VzRpWnJFVEFZaUh2R3RpS1J2elFoY3JyVkN1N0R2eU1YRVdTb0NEd0EzV01pUmxYbU5Hb2tDNDN2OVRqN3pXMEt0UDdoT2VMUmJiRUJTdnEzUjFkSGtjclVkNG8yd09MenpMWjA3bWJkUnZUVHFtNXVUdmhJeC9XMFlXQU5Ldlo4MEd2N3BPUEsraWVHdjJ2bWRmeXRtdXpMODRjSlh4MmptYnNvOUVwcTdWQ1lxem5aRmdUMHVFVU5vSTdCdUtFdDRmcUd2eVR2ZjI5VnJkOEVnQm1CQ25Bd0hvY1ZkOHdCZVMrdXo4OC9SVlEvTldCcDkxZnBNZ3AvV0UzdCsvazRaSWM1eWYvV0RwV0Zyb2c3UUJHaUNGUjBNVHRMMXdSZFpHenpQaThFcy9MT1h0VjBCU0JPUlRiVWh3Tk5tSjFJSmJYSXVvZTIrZ2NWSFBJait4OUo2QTRPVEVBeSsySTh5ckxZbkpwbDVaUlBUd1RTZEdaemt5TUVYVlRaNFhya1pGajg4TWdOcFNKQUpMVUYyUTJHVmtPdWVWYWVrMW5YUWgza0EwSU9UbER2NEl2eno1Nms3YmdEVyttVG1NbXV1azhncFJjWHBSYnFVaGR4dU9JTmwxOTBtV1IrUjkyOUVlenlWZExRbDdwb1FkSVkxWC9FOEd5TTlubGRGTXAzd1duNVluWCtSbk9NR21MOTFMOG42d3dzb0ppOFNBYVEwRWVDT0tsNFEyNDdzVHlmeFNTREQ2a3hraE9oM1NZUExZY1RkTCtUZGNxb1duNDBSY1F2TlVpRkZ3dlJON1hlR3E5d0xyd0JTMm9YOFdGZG5CQWwzc2pIWU5mOGwzRmV1bC9Tc001OTkzVzVMdzltMDlsMGE5UkxDU21JSEl2T3dnek9QT2lEenBsM2xZL0FRZmdJbDVHMEZnMlNySWZIWnpTMHQ5VEZKNmZlU01wMlUvVFFwOTIxUy92Mmt3czlGeFIvYTBBdnJ3VjRUUVYvMEFBcTBvWlpBa1lzQTVIVUE4Z1lBZVFHQTh6OWZ4QmdnZ1prb0N1NmowMGZhSFVFYjdIYjNiMjMxMzRBamRNOVdqbVBBVG1xS1hXUHRVbytWZ0hIQVdHbVllUVhvTFYxMmNXNDNWU1l1emh3N1ZXUmVtVnhIVDU2b09kMGVVVGNUaTRCZXdrK2NHN0x0VktJaVJpMzZndFJ3bkFyM0FLbzNEa1krWGVyRnlaVzZYcWxjYVlORWhjQTVWSHJhZ1ZRQXNpY0J1UVVGMzFNZUdDb2c4TWloZW93emEzazlEaUV6TWNaeVA2R1NqMU5aVUlubm1YTURsdlBVS0FDWGdVcThMMThISU44Qm1YWEphK3N4SWIyUnNMUUJnWWRzUUxPMTJGN0pnN1RSY2Rpa1gxdk9tMU9DZzJaQnN1M2ZVd0xJQUw4NWlPajNxOUxsUFJYQmo4N1JFWGFjTmNwZXBtWG1yYkpwS0tNK21PVGhhUWZFZHdjS3dEQlFvZGZORFM1NWRlOGNFYjB5dTk4UldTRDZpd3NqdTMvVnJSNk1lSWo5MlRVUmpWcC9zcTNZMkFMNWRFVDFadi92N0t3a2pIRDY5dG05a2k1MWxXdWdRNmVPOXpOQXJrRXZBVVJpVklyMDJaTnFGczJhZWdrSVFkb2F6cEhuS1hhb1dkZFZITUVTM2V0c0dSQjZtWFh2ZEZGVTg3U3Ixd21adHZYd0NvSDk5dC9YYWJpMkNUVDZPSHhiaDNSZFp0WnVzVU9jSk8zbm43VkFsZUd0WW5kTHVJT2JZdElKNFJ4NllweWdxaHJSMXFkbkEwQkpWV3BtNWNuTHpNMHlXRTJsN2IweHNsc21Da09FdUpMVEFBeXZtb2xxVjdkaURkWWNYVURScWZYODQwdldlcjZzTjd0OVdXZlBkcXZUVTFkNDRFazhjMWNWVHRoOVBRVG4vdG5oRFZXY1JlcGduQmlMY3RNMzFRMWZ1YVJQYkRmY01wZkxjTHM4Q284RDQ2NkJwMHpRSGxpak5EcGhKOXI2Ymkwc29RODVYNlJkUWpCWEJMV05VZjNRSkdmQlI2ZVJXYW00aUdDWTU5MzRoNzJ6VXdYbVZ1NngzMDZoaXFack9HY0FjNk9xU3dYK1c2QWRFUXdwTFppMlRsSUhZaGZjekpmRUdpY1J2S1NJS2ZuRUZpQlhTV0xyOVNIb2w0M3o3UXRoc1NNRVdHMXJwUEV0TFFaT2gzNVNybnFsZUZWYUZsMGdSRWFtWUJwUVRiVzlwKys1bk1kWkJnWWZrc0ZtRFZBZnVCaE9UdkljTkhUUHZmVjRzeVU1RnlycXhsWnoyZGxnemdnUGVUTFpjcDBDbTRFeG5KOExBZTZucjE3ZlpxcWpKekFtSFpSR1h4Mlc5bUIzd2NRa0Z5aVVGb00vcUZXV0tIV3Exd1A5VVFvdVFNWGJUU1hlYkhaM0MweStFdXlZVCs1RUpyVWZ4UThlWkUrZVB6L2M4N085dmN4WDRRbm05STROelRBTG5YcFRZdkx3eHNPdlRreFV5aDhxQ0lhU0l4SjBaeHJmTzFQTk1uQ0lrenFpL1JsVDZRUXRQWXY2c2svcENjQXlLNDBCWEdISlFISnhsQUViYkc2UFV3bXlKV2dkeDFzc21SOUlod05hV2VFY3FGZGpjZ01WOHpENm9QVTB1ZXpqUXFORUoxWTRTbzVCUW9CRHgwVVp4Umd2czdWdEtqRzV3czJKVDl1WWZFOExZNzU0Q2dINjJaVHdyaGpyeTBnQnZQUFhiZXhsSHJORkVTTXMycFZlcDh5blQ1OWM1eU52VDRkdHJKS09Xd2pHcWpha2VvOUhpTm5NbURyREtTT3cyeldRVkdETXVyS3NKc0VXcHliMWhPWlRJNkxNbk01U0gxRFpPSGxKeUlyZ1JoVHJjZ1ZZcklSQVRrenJzY3cxU2xnQWJLbWswVUVCM1FzUGVWV1JocEE5Yk1hZ1VES1JNLzF6QUREUnhBbmxQNmdBaE1ybkpzbW1qekJ3RVdXZGlwUk9UNUdteHZmakdIaGhjTU8rVkRXSzhuMkhnM3U2QmtnN1FpazNtOGF0YmxpZ1lrMDhZNDdDWkFONmowZG5NSURWcVcwbVUrV0FvOFh6UHR1eEp4WTBoSk1UTmlsYWVRcHBLQWJneHVMM1NHV1VScEgvNUlCOC9LVGZucTBMdmR1OTg0Mm5LRlB2dGwwZGRtMFVncWVleEdpOVhoTk5ES2dGN28rdDlnMGVtYUlqUWJWdWJyWVdGVkhDK1A1Q2JpZnRFZHpBN29uTWphTURBMHdvRGc5Q3ZMOUdJYTZ2Uzg1Tm5XbjJ4VU4wemJuQm5aRG9Sb1ppR0VZc0wrOEJxTkVoRVYyYTJCQm1tWU1wZlVUczl6QUF4bEZvVXhTN09ZbE9pK2pnd0lQcFVxbk5CbmtVRy9TMjFVMVVZRkhRU0NDZTBmOGVmRjdzNnkwZHh0QWdEZDVqNzVkWlkzTEdMaXJxTzNPemNZOE1qam9Udm1DUkpKdzcyYXRPR2NGSE5IMlRLbDlodVVjMFVLWmVqWU1WY2FMemdxWHpsYnV3aldqc3FDRnFUd2ZwNWFXbkxjUHJteWpjQ09wMkxDdW5xc2E1MWRrUldZUStqaUE3S1czVzFLN3EvakdVeXYxeVhFbG0xRGFhT0VkMG1nVE16TlgzQXJ4b3QxWk9HK0xpcW9KbTZybndEYkIyclJTMExHVGI3UWZUUnBSR0FEdEsweVFSanJNRHdLNHdUSis0dkhaanM5dEJ2T3I0bVgzb2hGM1BWek51QXg0T05pYWxzdFJheGlxVUVzSktyQzZBcFZwTEo5N1k4bVlBQy81ZUViTmc0YjJuOTRKS2gxMGVSL1lzb2FJSUtzSUxBbXd6ZXJMcWtLQXo3OWVjNzFSUytiRGJoK0hRTUUxV1hRV0JFTUN1UzFZWTB1RU16SW54WXdFd1VTSGowdGoxVGNFSkxxYklLaHZRbVpUQWkramY3aENUQkhUS2cxc3FPZmluNm5uQmM4dWFaL0tZQVRwVGVnZlArSXNUeG1pMWMyeFFDVzFiYTRCTjJUQ0FYMWIrQ1hmYkMyMGRJWWU5WGFDanFUUEMwUzZ0aDdYOFI4bUlhaVZrUGtPc1V3a3dhMTcyWkZsVi9XMHpTOXJwRTc5Q0cyTXRJdnhDUDhIZC8yYStZY2d3bU1Zd0RSaUFtcndTUVBWYWowMUJXcXNLYkl6QzNGNFhsdFdTY1F6cmpUOXkzSVN4NzIrZ3V0eFhZd2ZGd2lSZzdJOXVsNlVQNjVvemFkS3VvQlR2RFdIeEtJdXVxMGNzL3hsZUJxcWROeU45R0NCMEVPellBdEtabUdHdUM4VjZ2VEZOWUtVVnlwV21DZ1NUMWx2RzJMOUtIbGhlZUVIYVlRUFROQzQ4K1hieHhVTXNXS0xhU0V0dXZHVUdYRlpvOGRYamo0OXJ1OEtKMzF6Q3dBQzJtVVVsNXcwUmRRMmNER1lhQy9IaXlpamRlVFBTcjQ0UU9sS1d3NXhxT1MxRTJuTlE3bTFEZ21mdHY5eGhTb2d1VEZTZGMrVjA1MDNQaTBwLzlSaGFqalN1WFB5dlI3RjNpbTUydXcvejNLOHdWUzllK01aQzNmdm16WHUrMHpSWHIxcDJWcldENVYzTVhGcmRlVlBwTHg5QnF5V3Fjd3ROai9yNUxnMTM3d3FINTI2aTk5YjJSd1djZXJheUZLM0t6ZVN3NU4vT1RlNnhEczQrM3J1TnROQkJ4M2xVTzk5UTg2WDNZUWI1eHRubHdVSXc0MGNHUzB3enQ3MjJzV28rNkVSTlpqU3E4MmFrSHk4ZzYwaUVrMGd2am9yQ3c2VFY4WWpYQmkxTEtnTzZ4ZXNoL3pzWkNjK2o3V0JTcHB5bTdXMGthRXhUWUJlYzF2cmxzY2JGSHFhWFVRVHNpWVdtOE9DQnBlbDhzWENjOVFIVk42OXhrVk01SmFWclZvZHRNdjlQZ2Z1UVNsTDB1TEJTdndQUFZ4dEsxQVg4SjdaRnlVcGt0a1RaaWRQK0dlK1psNWVqc00wb2g5RUx6T2xUWUs2VCtZeWJKY2V2cTByWHl1SUFEV1BRd21JMDI5WG5XYTNsYkJmUW15VGpLRVZNcmV3QloxMkhsSkM0TzIwUWdSaldTWS9IaDhlanNkdXc1UDEyQ3hhT1JwZG5mUGFsUEUvaGo4WkxnMEQxaFJoMFNnQXRaR3hZb2J1cmNzZEN6NTRyV3dzc0RzRXlCcjg0NXZ5V2M5SjFXRlVLbHZwbFlqQ3BvTllnVDFSTmtuUDFTNlgweGU0Y2liZTFmc0JsM2htTHlPYjBTdWpLazFRREh0U3I1UUF3bUF0UDQ5QzRZVmlDWDdaaHpiSkZZL0RUWkJjNmV2Wit6Mlc2WCtFNmx1MDlsWWpTeWs2c0JrRnJ5Q1hVUHorVm5VM1grd3JkeHg4KzBKVHUxTWVBWlZXT2M4clhUeDdxOUJVbCt6UWc3V2lsMm04cnI3dnVqdDIzZkpxYlZRVi9Kdk9IQUFjbXVBa2ZCclZWVkNKV2wzaVZBMzk1dUtnUm5XWUtYU2czTnlyaWNVUjdaU0hRVHdpQ3Q4LytyZjVxUC8vZmVBTUVrLzF2ZFM3NHVBbTIvT0wybmYxWGRmbnpiYmRYWklFQTB3RFUrUCtaOEZmZUZCaExXMzErdk9NMitubTFWVjdsTE1QZXlqNmRhNEIraVBPMDFMRkpCanZIZm5vckJFZk44ZFRPZU5pNVF6T0VlMWxEcGY3Mmk4NkJiQVRROTdYdXpqckpHTkx0QllzTk1BRzc0bHc4Z3Zmcnd5Z2p0bHJMcWFvV3Y4MElwMzFjSWpMVHV5eXY0cGZUMUZXQU82cHF4TTE4eGZSWHhCSmd2U1pyenU4bWU0VHVOSTFKZktwVG5RdlJlQmJnNTFITktVc3MwSXBOamxZa1BYbUUwMk9acDJuWXRTa0NUaWExVit6YmE3N0dROTkrWkpiakdlcnRaQVBwSlpmZ2JJY1NIWVQ0UXdtT3Y0UTZxMlZTcTd1eUJZclJkc0RtUXJ5SGJIUjEvSUl5S3B0bFRtNmhiK1U3T3Z0NUVRL2UzUnhnNTdFeFJsQWRKU0h1OWt5TXRXV1U5WFBQbzVDaGx2TjhUL1RPWlcvWVdrMEdEMXU5UDJRRVVxb00rbUhGRzNaa2dxNk9ma0k4eVdBY3hUTy9uQWs1ZnBrZ2N6MGlTUXdYS1cwUDNtbHhWc3FhUlNQQWdEcmJpeVlaK2lpVGN5Y1dxNnVNanYyTUR6dVlFZDczNU82b3gwWkZsNHdBNUk4b1FBU0hLZ0FuUk1ISElFZGRSWTBnb2dFd3F2SHNtUC9LM1VrYm94WTB5QjlSZ0FnT1pRbDcwUllnQjNWbFBvS0lCc0Nvd01NMmRNcnNDbm04b201OElTUWsrYWhvWVJCTXlZVW5iK0l1NUdrRXNnSklid1BaZXR0dHZraTZlVFBDZTF1QkFMZUhLTkRYY1VwQ2hncGI0c24yeENTOHVYMHlzQnVLS0djRVdWNmtydUVUK0czL3lRUUFuUy8yNXEwQW5LKzlzTWZ5cXVLNzlUUFoxemY3bTFKZ1N5YnowRHNoRUxxZnN3aklmMmRNa0drVWxFdG5wQUlvTDk4UEhDUHdMMGtFcTBuYkhtOXVUY2hzMk5IR3RRenFaOGtBZ0VXdzV2eVF1RTVPc25EQWMyd1pyMk5QeVFRSFlpN200MW1jcEtybVB3QmFLRHVtRW1tU1FJTkFEQ09hQUxIaitqeVFRQURXMG5XZHoyMzEzRmNCMTBCSU1Id05BanlucmtGaXp1STFLR0EycjBFakw5STFHRWdpWDAzQVhINHZBZ0d3UnNYWFFBQ25PbzNpNWtEeVo2cmpxU2xDMERBMG9va2hsVGlZaE1FZ0FSaFRqRzBJNDdQRG9hRTdNUzZqQ0wwSlJNYlgwSU80T2NrYTZlQ0NrRXFpUzhaZXgxRkttNGxXR2RPRkZJeldjaGhNa21acVFSZ1NYRlZrZ3JxTUxyVUlRamx5a1ZGeEdJOFJ2SjRYdjNjMG5RYWtDN1ZBSW1CKzNHQ0dJY1lYV1V1Y2NaZk9GNUV2OWxZWW9HTlBVVXI2RmVoRU0xdGFCdlBmRVU3Uk5kdWpnUTZXVnNkMHBRMjVaSVNEU0RJc2FuYkhDVmY4VGNndi9VMkg3R3UzREIzSkdub1JHc25FaXd6YzE1Q0EvdHErUkF1bWdMMG5lSFRYZlhnUDcvMy8vcXJIYjNmd1UwWlZDY0d5eHEvM0c3dFJ2RC85UnM0U1hzODZRM0hpT1R0NGl2MzUrc1BnWmczM205QS93dnFHaUp1MXBXZUdaTStXTGkvTDV5TmVIeVBkbDhLcGg5WHVJUjQzYVhOSGNlanE0Y0RGU0hTUlpnY1B1NDVmY1E3U2dCSGo5SjNPY1VPVU00QjF1L2FydGJGcWJINjFWWTBxcSsrd3hnMWgxaFJtRmg0azFFSXNsaDJNTFRLTVROWnZhQ0pHczI4dzV3eTkwZGNaMWRBYWZJMFdZNi9XVittdG4xSi94VjgzUng0Z25SMVZWV2Y0cUh5Skt1em5wZXFocVBhRm1yYU9RTVBpcTQzSUttOCtWNEhCa1J0c2ljK1NaSDI2Yk55UElTTjA2WVBRSWxINHZYbjR2RFU0SGRiTlp1M0JhaEFMTzViRnYwYXpxUWJUcXVqekdXRVVHV0VRY3FEWDVxSFRDcUFWRW95YW9hZnlRcVVUOER0S3dRb1VJQ2grQ2pLSkRWS0pGQkkrU1RVSzBSYTQrTkcyNkRxR3YzcWUwTStuM3pXdVZKZU5rOHduRjN6dUR3OGRURFlQYlV3T3NvM3MySHF6c1pyUlhqTytmMmh2c24xb2E1SXRxZVpSdHBkdFpmK3B2NGJCdjZmZXFMK2c2WCtGc2NyOFF6dVQ5VU5yazUxc0xUdW1OMnVyamxpdDY3dWJ1SUsvcTRidGwyNzlZaFQrMUJud1N5VlRkMFFQQ2ppbmJVT3pPSE1KOFdmMjdZOGYwRlhyNDNmcWZtWndiZkNKS0JrOE1DdzJWdnRJN2Y2Y1NYN2tvR0dmVnA2d3NEeTdZUGVBQjJzOXlGSndxSlZpKzdiaFVYU1hZeWpiMlZORlZmUkFuUUlBQUFBPSkgZm9ybWF0KCd3b2ZmMicpO1xcbiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJCQi0wMkJDLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjEyMiwgVSsyMTkxLCBVKzIxOTMsIFUrMjIxMiwgVSsyMjE1LCBVK0ZFRkYsIFUrRkZGRDtcXG59XFxuXFxuLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcXFxcbiAgISoqKiBjc3MgLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vbm9kZV9tb2R1bGVzL0Bmb250c291cmNlL29wZW4tc2Fucy83MDAtaXRhbGljLmNzcyAqKiohXFxuICBcXFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cXG4vKiBvcGVuLXNhbnMtY3lyaWxsaWMtZXh0LTcwMC1pdGFsaWMqL1xcbkBmb250LWZhY2Uge1xcbiAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgZm9udC1kaXNwbGF5OiBzd2FwO1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIHNyYzogdXJsKGRhdGE6Zm9udC93b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBRWE4QUJJQUFBQUFpVHdBQUVaVUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR2xvYmluWWNQQVpnUDFOVVFWUldBRndJZ2pnSm54UVJFQXFCeVZDQnJYRUxnekFBQVRZQ0pBT0dWQVFnQllVR0J5QU1oaFliZEhnVjQ1aWx3TVlCZ0wyMUNSaEZmZGF6RWxFRUd3Y0FDdjFPc3YrL0h0QWhROExXZ2t6MUQ1a1YxWlZjRmFha0VCVWpVOVRJaVUwclB5ZkVsaUdLb3BLQjZZbFdPTGxYRGc3NmVrSnNaMi9VMnJBYzM0dFNWTzZWd1E4OWgxVTRvc3VMWnB1R2R6MVVqRFBiNmFmOVQ0ZTgrUzhhM3Vqa0NJMTlrZ3YvL3UvMy84NGtLOW5udm85RkpBZE1FbTFWRmFvcUFsbVd5THFqd3Z6UEovUHFxbGUyWmcweVNHeUN3UjNQcnVma0l4L09CNFFPQ011Zk9xOVAwWDJDTXVYdGhscWlva25xRE1BMnhZbUpDZ29Hb2lJb0lCSmxOQzJpSWhqUUJxaUlnWWtSTVhOTzU2S2NUcDJmSzVmZjNGejlkMzVmMUh0MzYzK1JqMTMvVTgwa2xTSjFsV1p3dGovbU8yUDNhcVZFYm5MWWREcUFjZ0NXdTZ1VGl5clhkL1BkTkM3S0IwZktYU3g2KzhUKzZ1MmU2TFR6MDVtWlJLSVVwZVJEVlkyMHR5dGlsTjZHSmRNS0VTY2RMS1NMTnRNS1NTUmZWdWwvYzFGcTY4ak9zOEkrYmEvN25nN0lubk1JOVVlUkppV1NEQWpuQ3hCY2dGU2xkRkdsTkhSVnBrK2EvaVoxclQyMjVGVXgxd2o0OUNNbS9VNHIrSWFQWXBvR014T1gvU3ZMdGl6TDN2WGVYbTJ2dEo5U0Nrb0hLSUFQUUVkaFlHb0JzQlFDaitZV2N0MkhQaGZNNUFUSkFBSnVDNW1ROWp0aVZoTDRuOHRtay8rb0NTMm9YWW1TV0xmYjcvTG9IM09scTVPVTVzNUluQVRIbkFQalFEaitMNmZWdFdUWmJYVm5LSk1lWlBjU25aTXMwZUI5Z1E1SDFhOHFsMVNTWWtsMlhpd3A2SWJ0T0FOMjArczRBNUU3UGM5eGVpQ0RjSnU5SVRsdTRuUm5nV0VRYnN0NHVNeHA3MWZnODc2MTJNL1BETEJpYWVqZDRTdElYVWkrMHE4eHJWc3dwWnZpY0hsTlFVTVFjRVZVVHZuYWhqV3RsZ1JqU3AxV015b2lBaW9xSU0zeXZIdU1ZUklTZDA5K2ZXWXpJeEl6cm9YL0dXNmlQTHhGVFhpZjd2QzUxYnQvNEE3bUdESUFkdVJxZHI2QmF3QTErWHFKc3lSaGNmYTU4U2tBNzF1cVN3dDBja2RwZG41eVo3YXVOTGxYYXlxOEFhajV1dGNwQWl4RjVhY0FoL3Z1TWJjQW1Jb2lLVkVPTEkwSXZqVWNETTFnSi9wckJIQkx6QURBSFI0UVF2UjlOVHZudmJFczJ1SXR5UlNXWnNXV1pYbFJZLzkzaGRWWmkzVlp2MjJLbW1peUNkdGxVM2JBRHRzSk8yc1g3VnU3Ym5mc0ozdm85K0pCL0daUDdTOTdiLzg0d0N3eU01blQzYnpVM2R6TGZkM2ZML3VLVXozSUk1d1ROUjdqQ1o3aUtzOXd2UmZFWXkvMUttL3dOdS94Ry9Mekc3N1pCOC9sTnQvait6TzlyL3hvWS8rVUx5bkl4ZC9jODE5OHpaLzdhLy9vLzhVR0tub3FWaXJ1Y0EvdndBWXg2QkVTVWNHTDJKQ0VMRFNoQzBNVWhnbjlqNk1qK21JNHhtTkhUTVpzTE1SaW5Ja0xjUlg1SWxiakZ2dWR4L0V5M3NibitGOUFha1pxZHJuSVEyajVpYXdBaFltbGFNVXJTUXFsS1V0NUtzWXNacFhXQmIxY1BHS21rVk5acEl6Z21ZRGNRNGhzWC9rcWNxQlBsbWZoWHE4UmxqTkxxRk94MG5KRzVsUTlwcmczTnFybEVTMnRoSnNvT2pncHRZaTRwd29hSXozbllvSmlxZ05md2FpUjBsc0k4eFVpV2toRGlnVVVTYmlqQ1lCQUFsbDVPSXhXeE92V1BPWUNqNGlUUm5xQmx4S2ZLVks0S3djaDBkQ1lTa0hMNm9UWE55SXlVK01ZUnh5d1NmMjlBT3VkUEJSS3l4dnNVb2d5aENlblhsa29pVzBxWEJCcDFBOU5UNk9BZVRqZ0UwNlFvU3VjOWFFclJjRWNTMUtubG5uRURKbXpDbEQvb3RLU2lwV09PaWprQVVySWdTSzBQZ1RZQWRnK3BxWnpLSGt4Si9VK0cvMVVPTzl3a2FBK1JXS2FMK3o0WWc3WjFOQlNMVTFPOU40WGpVMGhXcWE0aEFvcURXY3BaMkZSQjd6c0tuL2hHSUd6M0RwMXFKZ0plaXFQa0Q3MVA1QnlId29pNHIyTDV6eExQTFNFWUFZS1h6MGZYN3hYc0FLbGxkMnl1ejNzcm5mM3htdytXMm1mT0FibjIxMldRQkNrc2V2aDlsNHNoY0F6NFltOE5ybTJZQUgzZEJqODRRLy9iZitWZUwxazQyZXdBT1JSdXRhL01zRWFiNXJ4dlFiZGg0R25jM2I0dk12RUFyUGR5a2pvdEhIemZnRFQ3TDBBN1BVU3ZmTnpVVUNBTjR5UXJVTVlXeWZhd1NMaGlWdE5Cak96L2lmdU1Kak1CUGxOeGJRWk1KUUhEQzlMYkRkWVdjRi9BTmh1Zm1hcW14c29ZeFhoQ2cyRE5RSzUwVnVPRTY4M1ViSTZOS0NEQ2JWMGlycFJyZXJTc0E3MytyOWZBOWo0MmNhdk41NTJXVExlMEsvYzRTYTNDZ1lvaDNCWlBKcVNnQUhvNStJbDY1dGQrditZN3Z6S3ZnRFFMV0NCaXVFcEJlS3d6MGliOTVqVWlOSGZiZGdSdHppVjNRYjE2T0kyWTc0bFQ2eS9nV1piVGFsbTJoWWJ0WFBXTjZMWDFOeWxjeXl3bzFPQXREZG1leE5WMFZoTCsvb0dUZGhoMHJ3YU9neGt0M2V2V2QrU1RTSFZOTkpqbko0S21qSVRiYlRKTnJ0TW1ldThia05TYlpPbTlPK0VQc0l5S3N3V2IxVlBteDdtUkZ2c05PMEtiK3l1NzdYcTRrODBNUllrSTFoVTBlbDRvN2JsdjVNTzFCYWlMa1JOaDJ6WUVkT254MjRaSDl2YzJkSGUxdHJTM05UWVVGOVhXMU5kVlZsUmJpb3JMU2t1S2pRVzVOc1RYejI4dkovUHB0VWsrQysvK1B5enU5TFpGN2ZQeDZOQi85TlBQdjZvMSsyMFc4WDdiMlViNjQwMHBzazFYODgybW8wa0p1bHFiellEUnlCb1IvamVZTmdRN01EcTN0RG1OMHBycDFqRHd0UDVjVjZZU25sWGMwdzlhWEFSUEwreTNvaDdnOUpTTGl1QXZZcnhCUzlLSGZEWk9RdHUxeDY2akI0K2s3dDVWSzBuYjFydmhFekFpTGhwaE5DeDJWWkZlbDIvMy83akxJYU5ZNndhMW14bnZFRXh3bFpqN0srbmFkbEVLYlhBN1ZUbm1KeW5WQys0SmhoVVdzaVZ1V3N6WjRNMURvdU1hcHptcjlNcGVjaVNDSUhtU2Q5S1k1TldXRjAyRGkzWEw1UTBsQ2JuNnZxOGk2cnJSNlRaaUl5cnFPajFhTFRwNi9IUzFqa2dmMDdZbjVrV3J2MlZpMGZpY0JZeEVsYTRpQW9xOGlUcFQzdERpYVpPMWJZTUZiMnJNbHBVTldHSHlEenVFRGI0TE5jaUpvOWEzdkF1cktEMU5xS05hdk9valNSLzhBaW1CSXNxdm9ub2xIVVhHOHNYYXhmckYxc0wyd3NxMG5YM1ovWGhuNFFrcHVTWGpMYlRrS2t3bk5aVWJmRlUxVXJPaDJ0YkZiZW95cTFqckpieVIyaHVwN1d1ZUk1KzZHUnBmOG13VFNyQldYRVZ2NUZtSTQ4OFpMaFBxMXNXckFPSWN0NHB6aUtoazh6QmpxeFluMWZhSGJhN2FRUFBtaVJabmlsMmNjY09lWlRIUEwvdVNmdWc5RE95V3pRV0srOTZJLzBOZWxtV3N5TTVDRUozS2k1OHVvL2g2VVB2M0xQVkxTbHRsWW1mZWNvSzZmSUlFWWlOWGR1N0xONko1TDJUbmlWbmtYaGxDNG1hWFNGVlY5eVo1OGw1SkVCaEoyaVh3ei9ET2VlMC95QWxUNGhnKy9aZXpWMkFMR0U1d0ZOWEtucTQwdHJ0cDgwRzVSRkQ1cWJaNkEyaS9kVDA3NnlINkZBU2QwUDVwWGRERmFhTDNXakZXdTVmVjNYY09HRXRsL2JtQlVmM1dTVjNwQ3lkQSt2dDVFQlQyQUU4VGNBNFA5MnlGSDlmeHFXVjdCcFBlV1NqdlpDQ3FxQ29ja3BtSzJmMzNqUWI2WUdTaXVYQXhDS3hNTnc5WGMwL0ZxMGxKcDRuVnpBd3krNnEzaE45emdnUmw3dTZDSk9wWC9vNG4yYmhxQVU2bldnZldrMVQxMS9TR0FrWkkzdWdPYzBtQ0YxeXQrUVhMMktFRlI2dVFEYnZvL2hMVVJ3UDgvRDBNeEs1aGtvOWk4WWRoWHZPNU5jTHFDWWtNdWNqUHBFbnBSWnE2ZjdsVjFVWW1VVGdkL2dtZGRkSWRxSzBnMmNLTDk2bUt1eHlJNWZGQTFNZUdVOFhwQW1yd2JvdUJhajY1TjJoK3dnYXRiV3lrdS9UUFBRc0dIUE52aTErdjdRV2UwSEcyd1RlUFAwSzRZUXR5czVZTzNCck9KZENwNERlOVhXQmNRdnNGOGR1TTUzMTlLSndFTUUzQ0V6bkN4WWxqd3lIR2VTS0tVMEM1SENKS1k0QlJmTlZ6dG9GY1FkdWhFYkwxWXpKYWZzclVRVmgwUnY0ZWsrMk9YbGVaaDZ4bUNVRks2dHV2V0ZOR1JYVXpuWlFEalNBNklEdGprRWZVbUpOWk1uaFRBYjNUVnhjZmVlR1FlYWhlWEJHWkpZa1lNeGlKTjhJQ2ZLMXg1N0h1dzhTVVBNY2paVzI0VVVRRUNEUDd2Z1daRjJ0SkdjVGVJSlkza1owbnJQVURmS2lBUmx6aFk2VFdPV1VhVFNDZzV5aEdFWDJBd08xaHVXSnNDNUpkWkJDaGFrNEV1Ymp5Z01GUFJaeEk3N2xNNzZuWnh2NnZoQXFENTN1MjhESEFsWFhTL1h5Y0QyREtrRzNFV2tCWVZLdUlWT29MYXpHanBvQnVQd1FTVVduK3VGN1JrSkVpQXI0ckQ2ai9FYm5qZ3ZxZXNscFpNb1d3TzBTK3RXQVpFTU9YVWUzekttRXRSSzhQYUpxQ0tnYWZLSXg2TTVxelhwVkJTVFdRdE9jY1NPbFhlWXJoNXJkd0lBZlo2SzA0S1NBSDVWZ1Z3S29kbnJxVFNTSWJMQ01weVg4TXlPTitHQ080Z1VqMHlwbzEwaFVrRzF2U2NsSHhrL2ZTeGYzTFhCT25ZU2hJVVJNb1Z2RmkzRnBvUW03ckpaY2YxRTk4MlY3R2lhQlhCNkpsOE94TFhTaWlQZ3BtVUFqa2llTlFBRWtRTVplazdnRTNKb21GQm5wUWNSQUF0SEZNR3RyYzdGMXpHNWJaYm9MU3ZYdUNRc1l6cTY0Y2MyUGl6dUQwOHZNWHF6NENSSjlpUEFFaE1RdCtYY0dHTkZyUkRkazdvNXRMYXkwelJ5OUdkUXpudkZYdjhidlVvZ0NRd25BSXFqcmRjeEVrRFlBRU5qQmdlVXhTZkJNSUxvalVSeDF2NGtDMkNDeU5nZm82Q3pnODdKUkRJY3lPU2t1Q2Q3TG02eU1YZGlSNU1iR2Rra3RPeVNHTWdoOTVFck5qSHJvMm5JaHVXdjRic1JIM0MxdU0vUkROUEFJMk9Ranl5dkVyRnk5TmZEZU5CdmkxcHE0VmRjNHh2YUVkWEJxbThFZDlsYklKKzFJMno5MWdROUxJbTc5eFo3QjF6LzhGMjdHZTlwdWNxME9yWWp1ZlVRaFR5UUJPU2tYTStoRzdGWjUyamkyUDRDVHZQK3dWaUsvUmgrRmFqWXdSUHk3L2FINUtGZjgwTEg2NSs4RnlhTktlZ2p3MmxOMlYzenF5WUtZZUNBam5DY3VCRVI0UnovTEdFYmJKN2MzREl4WE5Tb3RaNVNlSkNkcUxNT21HQVdXNEdrYktEMTBvSlc2ZnVZeVZjVHlpZFpqMFZpa3pQYkNRMFJ1QXhYNDFyVHNZUER2VTVnUUdBVDh3R3ZHT1JUZ3ZHUnJRZnBIOE14a1ROc2dmWVA0Nk9vaXI1a2tRYmlsSUZYakZuK3R4VkJVWTRtLzBhRWlocFNmMlJJYldJc0duenB4WklTYVNLVnY3VE5KUUlTT2dVZHl2bXFDaWc2TzVoOG91d095bVJaMVBaY3JUVFArQ2IwazcyMXlVTHNuZmhQNm0wUHpBMzFJSzQwMit4eWdtTUIzUnJkWUZtU09OU2ZFb1F2akJiNmpac2dKekVSR3lFSjkzVFZzWUJ1cmRjTzR1bi90MGJxQ2YvYXVuelpGL2Evd0g0WCtLK3prT1ZpZ0lzYzJYdkYzR3JmNU9Md2V5NjhyR0NPMEFwRDhuNGZsSUord1lvU0ZYekdncTRreko4cXhPWVZsclJFbjA4bHplY0NvTVJTNldqWW9mMlhvSEJDRTVRWmh0QkNmbE53SWFKZm5ucU44T2F1ZC9UQ1g3cG8zQmEvOGkrQmw2WGZENURQaGg2NTdQR3laRmtVV2x2QjRSOTlJTm5sUW01WHk5blI3Nk5kcU16U0RKM2lBRC9BTy92dWdET3JNTDRlOHFzdFN5aHVQVTY1cGFoRnVjdFdzWlA4SXJsU3JsTGZuREljZEQvdW5wYm9kdDFCS21QS2dHMGpZdjYxMzlCS3V2eEo4SjIycldiUElOSDdmL3hSLzVEL01wNnNzSTZTZWxXbURqLzZwUlhZcVM4WUN1NFJ2L055Wi91RFUyTGFMZVZtZFBIRktzckRXcVJRbEF2N0FKYlZJY200ZHB5QzRDdkVidS9RcS92dmxuTU1lWXZPYlFCZjJyQkRkN1dNNjhCWmdxSnVhc0NGSkRBWXVpcEVpZVBVUThQK2ZFTkt0dlI5cURQS3lxSkNwZmNWRE9UdmpWa1dVZkEyV2dCWUxzUEJVNjdSbVYzcUVRbzVHZVpIZkF5UkFpNTVsQ25KaUVEMSt5b1hCM1RDUXU0MHZKSnoyQVJqVndhRFdhUUUxY3BrUEE4dkJNWERoaXlORUJmNk8vSkVvRjNsMElLazRBd0FFZ1FDclBsU2dOTWl6TytnTDcrUk55aUQ2cWJWa2NxSHhxWFhwTlZaVVBIUUltY0RibEtRY0N5VGpPc3FvcGZwMDl0dlVBOEtVVm5BbmFmZGRpQWVoampNdkt0bE0xc0I0L2tJam9DcEJJcThjRkVHaGJCTVQ0aWV5TDQ2alhHcGNldTFMa0NoUWhOb0UwdmZiQlhvRnEyRGEvU3kzVGRqSzBQaVY5eTJ5ZGRHVU1veXp0RWNSTEQ5aHFXVis0S0pLNjNzVCtaL1g4OU0zRWdnalBKemEwRzdlTVV3amp2eU9WVjBpZ3pMQk9qc0RsbitKem9mUzlnbFF4TjVJNnlydXFQQm4xU04vZ2txbUY0MHVwUTdlSTdEcVJ4NVg4ZEJZTUdPL3dzNldzUFgrcERWZFBISjZkbjJiVzgxUFFJYjNnUE9CbEFON1owZ3d0a2hVUkdzMm1SRGhNanpwcnhvTmwrUkM3YWsyWkV6dnR3cU96MkMxdUdSQ1pjRnV2VzZJT2QzUnlybkhzT2drVTBXV1NFai9wNGhhWkNyakVya29udmdqZ2NWYVBjSis4UENuWTMzMVdKWUYyV0Y5dUYzdVlFSmZ6eDUzYnlpbGNiSGZLdm1vYjNaWHRyTXlmZ2YzSWN2eGNnbE1tZHNPSzJzZjRxSW45ZS9QNjl1ajRQWENNRjZSZHB3T2duOVhTWVh6NXh0V0g3My9pSDd2SFNSRHcycmdCaGZaZnpjNlV5cElkcnBLRUF4Z1VUUG13c2wwa0xXeFhoVzZEdFV2d3NBODNSc1NZdDV6Z3FNMnIvWm5xSndYbjVpYVhLaWtEZHdZYXFNVkJFbllrTTJPWjBPVjUyb0pCcmxtR3h4NXlBS20rMm0zZlMrR0RGdGt0TnEyVDNJOFBtZjZ0UjU4UHM2Uit5Z24xNkNtQkRraXZJeXc0dlJSaHlUamdoZG5RY3RPTVd0LzdiMjRTUzF1ZWdkeTkzWlBUL0hwQXpzRWl1cVJkd2l5amZsUUROV1R2YjFveVMyVk9vSVQydUdpaDd6QlVlUkNCOG53UXBvZHhyTnlaYm1RQkV2bGVGT29KelVSby82b2NDZ3FwZGVKeFBnTWN3U1lYNGRFNDUzU0xyRCtsMlpyYU9pN0VwNGJRZENOOXEzN2szSk5TSS94cUJIYWgvazRsNmxRT2cyUVFZRHQzMGpseUhtRTFpK2d0ZEdoY0Y1bjhxOWxWa2ZpTFBLUFBJajYzVCszbGY4VmFMYTYybkxIOE1sbENkcWRxdk4rZEhyVE9UNHEwRTVnWlRaMWcvUHA5N1pzN3JoZC9HM2pYSHBpWndZMENFUnpqMExiQjdIMktwVVhUM1AzeGZldGZWNUR4WVVyN0oyN3V3OWY2TklqdjFKdXpQNkR0OVlMUjNUYUh6enh6VXdZdTJ2SnRhTER1VUhLc0RuL3ByMXpYSWlubHRNRDhkVVZHV05CQmxZa2Jzb3g1M21VejFLV1MyKzBERWdZSFQ1d2tIYlVjcjlHVEszVlFwZENmOE05TTh4OURxV2kyQ0ZFVlhYUUxqMzl3cUJKWE5LS0thR1J4OU5jY3FUZXlwQXF0eXJWMVhiVjQrRU5XV1ZXbXdGdEJod2Y3MTk4YTdtdVpkVlNXNVlycWppOUlaM3hZSENyR3QxbGo2VzlWOWVZK2d5NlhwT3R5T0pJb2o2SzAreE1ObnJ6OVVCdnJGMTJTZWVadTFwKzJRalo5dHJMaVNrTCswcmpHZTFZYjBZMS9VU3huWVRkWEZSMndJRldrbE85Y3M0cUU1L3BWOTlqUlVCZ3RDS0lrelRqSndFTnhIM3JZalFpN2VBT2hXWUNKK3dFYXBqMEpnQndBWHVaTmJXTkI0WE5MMGZzY09IM0dIelMreGgwWThFSHRISUpEVWt2bEd4NVA5bHpxSTZ0eVlNd29tMnRTbGNPV2taK0RvSWRoZFRHR2RJc1FwNHFtU2g3dEV3Q1JSREFZQ0FwaEQ0VkZBek5icUlyZzZjS0VRaXNHUEFzUmg0UlBUUWRlVE1Vckk3YTFuZTV2ZGFjc3lhNk5RR0xEU0VNTS9FdWZPaDJHdDVWS1VubDdVS1I5UGI5TXFRSmRqZlo1TStCVXNrVHBUeDdMdmk3cW9rVkZTd2h1QkQrMUJKUEZDakUwa0F6aXdKQks5R0NZSXFzY09ZeVlZbzdRZlRFSlpKdDk3b3dtS205MmZyY0RCeXJ3dHd1WXJpWFdhOG5RaWErRjQwbFVOdHBVVk82OVFseDI1MG40NFpLQ21PUW02Wm1wN1AzS1dPSW53Y29xdUZqYk1PaWs2MmoxZ2RhUmMwWXJRNzFLQVhTdXBDWXhIdFB0Y05QUnl5WXhwUC9CcjJhRFZVcEpPMzZpNzZoL2cyNllhNnBicVp1em9XVUN1Mk1kcmNuY2t3U0JyWFdVdDdtcGhLVTJEYXBkSmdDWUhmTy9ZWGlxK1k4d0hvbGRRTnlFRlE5NVdoQjY0NHd4Q1pkVDRMVUVjSTdDVjNkMzRWa0FjVXZMbEdVTzV3MUdNbitUWndkclFVYnNOM2RJdk1VaStiQkR2cFZzdk1XOTIyTy9BRXZTRWk3MG5abFBPZFEzNWVIWjZGdUhFU25Ydms5cmtRREVhL0ovV1FlQkdRc01YZGpIUGF2OWpubHo2aFU5RnVZczdIazhVaGk3c1JHaThPek5vWTBOeitWMVNrd3BNbkJJVFI0bFIva0xCa3krTm1XT3A1QllRVWJvS0p4bXQ2d3c2dW9GNXh0VlFqanFheXlnNUdLb0QrSlZYaDJSWUVaUjlhdE1WYUZtb3N5YkZSU3cwRkxENXNXb0JRQ2RyWXVVbDM3WXRzOFNpQlo1M0hKaythRWRPWVU4YUpPKzFYUUI2Qm1scTdSTFRVVU4veitWbFVsZ3NrSjg3dy9pQlA5emhpc3EvRXlYbVJlSmdzdm5QazVGNkRFWTVZY3l5eERlaHZvWjJRNk92cmVWTm50a0ljT2FGUllFdUZwb1loRzZSYTFXSDdCN2wwa0xpN2xaakswSTUzUGtzMkRSeUVOSFVvTER5RndiTkVmSGxBQURJQWNMR1l0eU5EQUVEVTYwUEZFSzFsZkM3dEpiQ05wTElCRm5vdlZxR0NEYTBQaFQ1NlE2ZXVkazZaYXNOM1RXOXVEYkZZdXd0Q01FaTZQMmNqU1lQREM0ZXNNa3l3NTBaeGZaZ21pWlRYQThmWTRDeFJybEppVXlJK3lSMDFTelJETW9UaFFWaGlXQi9DV2RobGpmVFh0QVc5RzRKWGF0cmxjUXgreGt0NnE5Qm5td1J2UjRZNm4rRG9Fa1ZOMWRxUndsR3RRbmdzN1hCM0xVZUxGcGhZb0tNRnZocm51Ly80K0xsbjZPeFkybnduL0FXbkN5dGpkODRvMEMxYXk1V0Vrc1diVkhCdHQzWHVKeHBOVWd5Zng1UzRxV0xPR21ZNnJ2U1d2ME54cUdlVllIcU1JRk1wbVhpNVIweHpUbXFIZGcwTDgxdDBodmFWMUd5cW50bTRNcFBCNCs2dkhwTVRHZkFoWlFsVDdGRlhOY0RmMXUzQ1VmakluSEpkVThSM2VqUmRDVHhmRVQyZmllN3NQRkllUDNLVDVBS0NETjI5ZmRiSSsxQkpaRXpCUHBMbDVubFgrVWQ4VHN5RC9HNkE4V2l5M0NWekV1NnJ2ejZuOTBrWHdxbkNyYXFRRmxtYjhFejRNUGZSblh4WGdZSE9ZVmVYcms2ZS9HUGYybm1ka0JKVC9IZTIzS1ZpVHVVVmMyQ1dZUlIrWFRYWHZHVTJlOFU5QkFhK3NCRUFDb2RKRmV1QVhRS0g5T2VqTHorSXFRR0RiR2REeVJUcTBmZEZ1Qy9UdzYrN2FmL2FYK3YyUmRMUGgyRnpuL2JoMld6di96NVhZWjVMYmRVZG5PdTdGRnBsSEdBbnBTUWxWd2VOZXgzTTc2M2JYTWt0cEdXcFJmZkFXai9rMGJYaGJDUWRDcVNBN0xIZUdOSW5MeFRMczNzNEtzdXNvTkhGQXJEbzBVa2krcTFocTJMUkxtaWJJOVlzVEZsdUg5RDkxV0V2NzNYN1F1amhWV0lJbnY0M0t6WWpiQ3BaVldrb29nbGdObTVnUXd0WlJHK0FiQlhLdUF2ODMxSFFtcWZEb1NEWHRaKzNwZ1o2VG90S3NIUmdlU3IwbXkwRnhCSVdKOGQyNFdRWFRUeHBQQ0lwdkp2UFFIL20rdS9HUWt2YzZ2TW40dTVhU3h0VVF1TUx0MXBZV2NTQmRkMXcyQ1RZRmUrUTRhRjJzRVpiZ0E5OVM0dWxoS2Y2NWlFSzdISndrTnAwK2l2NHZBUXB0dlp4V2RHNm9Ud3pjY2UxcDVaWXpwMlk3RkFrRE8vVnZndll5UUdZZ1ZVNXV1bUlBcHlYOUlmYy81di9yQk1rMFNPTWtVcW1GOUJBalA3a1dqb0ZOd1VpaDlodTlUS2ppZTlZdGFmRkZlRTVHVXdKeklCTURVdTlwcXlOMTlaWFV3cG5xSUo3UkpGbUdWMmhYUFMyZ0RVczVCVXZ0bGVSN2FZdjlIVi9IVnJaOGJjaTUxRmRLdktFKzJ0dHhOamJqUFQyUnpsVDVWN2gweDRTNkt4NEdCc3NpbU5uNGVsaGJwRnFZQ3VtQlp0U0xJZ2QxR0ZEWjZRWTFxYXRQMjF0NElyL0FsSGpScmZ5YmtPUndLKzB4YkJYa3o5YnI2ME05TFY0RThVQVZyemZsK0tUWEZwS2tnN2E4TkZ5d2hRaG9NTXYycy83Qkl4bXJtemFIQy96Yi9nOHYzalF5SCswZXV2WTVXRUNORkNWSVloaENjcVJRSUZ2NXZoKzYxUXUvaEYxdDZMNUZpY1ROK0NYaEU1OGdWTTgrVURla1J6YklKWVIrcUtaSEl6clNWazc1V2ZWMS9jQTJpWXF2eGNURTNBS0Y5Sjl4Vkg3WUdpTGQvVlVUbzljUGhnSkFEaUJKYWtWMS9DeWRnLzRqd2ZjNFZXZnNDM3dCVGoxalAyaGJyQkFhOFpTM3hIaEtWREsxOE5VQjIzU3FoSjNPSnlXRU1IV2tCdGVOZ25TaFJEM2RJWVU4aDREN3hCdjV4emJhNFZMdXc1MlRERWxGcjJpT0tsbFNyaW9uTVovbFBVK3lJYkZvL1NPQkRFMDdCSjcrUGovOVVLNjN0YzZlblhvY2wvV0xwdGFEVFJWbm9tTWRiYm5XSHROL2w0NHBMUlIxZzF0NTlrTjhvWVdiS2Z2TTdyYTE2REZuOVNIVVEyamJGVTVSUzBaR1l0MUlqQlpzellWckN5UTFyVU8zbURYTmw0aHhmdXFmQlQ0YlNVcFphU2czSUlPUzFVbThzVWxrOG1heUtNR3FTR25sVkJBSC9WSG9leDZQWEhxaFhmM0ZlZVdIN2I3V3dweW1kRUpUamk3ZlBWNnRrQUlkYnpPOUhTK0ZDMEdWSWxWM3hLb1g0Z1RwZ0JjbnhYWDNmZk91c3hEZEtySWVlOFRPWllaaU16YzBoeG1hYzV1TDRkL0FQb3h3WEIxYjlkMjg0ci9pZlIwNmVnVWJpN05LcGE5U2RQSDE3cXBncXBLWk5TMGUyMGgvMDZqOXlydFFtaWhJUzBwTE84U1doeFJjTjhWK2xCM3JXTkxvSnpSVnVUdFBwMVJiV2V0QlhRcCtlNkpSZkdCYjFZc281S0N6SHZqd2tiMmU5WjYxNTIwcEYyR2x0MXF3d1lQZndTczg2c0hjRXZrMWkzTi9BNldWZ1g4RlBjNEJVOGg4VHc2QnhYYTg1Y1RZVXNIY3M5L2YzVWR5VlY2VmdKbTBsQTZQZm5OR2o3Q3NvTWFnRmhrYTFXUmtibCtsdTdLb3lKZVdieDRraDdMRUhLRjRDTTlIOXZUVG9kbUxyc1BkUjZLQ2lqbHdWNTkxdktZMitmak9tb2VSQTlRdmZFbUJEenZTVTB5U3BxZG9SZWM2U3ZRdzdyY1ZZaHBhZGQ0M2lRVG1ZZXJ4cGVBQTAxeHk1VDVzTlNMZ0M5Z0RicDhUMGwwYUxWUDIrYWw5eFI4eS9INmxWaDU4MFZiNTM1RzJJTnV5TjBmUC9HT0VsMElKWEtzeThsOTBua3VvS3BDWFNxNTI2WWxPRjJqWjZNYm43NS9Md0JIVFB6eTQ3WUR3bU1xOGpqcW10QjJlazdIUTAzb2t4a2prV0xVeC9rS251SVpnVE5RdFNJL1JzdERGejk0LysxYTdhQ1kxL2V0K0IzZmdWK2tYVVBqTFBRN1BUanZRVlgrSXoraURsbHdpckg3bW9rNEVHZ1VtT0Q4cUpGUWVybGdnM3FpWGxyaDAwQ2hjdW93N1JaQ2dCUSswbVB1VXVySmp3WWFxckVSZXZva2poRm9udWVUbHB4ZVZUNy9USU51WjVINFg1YmMyK2Nvb1BTcEMzWnpBSGRSaHdHWGYwVitUSXRIYVhqZm1yNkY4blZwNEROSGgza0J5V0V0RHZJS096TW9FdzJwM20reVZqaUtTOWxLVjNpNUMzUmNqYVZNYk1rL2ZNWTM4NER0OXlvanhPMXFOUno2Tk9WYUs0M0JEVXI1dUFzeC84enk5b0xGdEhqYi9oVlJoUmR3aVFyTEJSV1h5L3piTERXWXJJQ1hGKzVCQ05jZ2U4VTlDM3lsaWZ2RkpSZEdsUGVYa1cra0xReTJYQkhEUzBmdlRoMVhjZnBFOURtNExOZ2NKbFd5SnBpalJMUWZpbmwrMjY0YkNpY1BvNU1zOW1oMEhmWmJDWFBiRFFzeGNuSjZDRlRhZ3dQTFF5dFFUSmVZeG9GSllKVGlCNWpHTXdsc2hZUlp1aGZicWpUdGpPM3NDWDlBaTNFK3VHeGV6MXdnZWN1SVZ6KytzMUdZQ0x5ZU1nV25saTdPa0lZZDl2STlhK0xnL3Q4K3d6SW91eFkrOGpRWHZjc3dpdUc4RHc4RC9PVlZic3pKcTNwZmdxTE40MnZKNDFvK0c4ZThzWFZuNEVlU1lMZWZ6UWE5RysvZVFYNm1QZnNhZW93bk5lSzNTNk5uRFBYQlhuMzI4cGpaRkhwdkVYN0lsRDVTbUpyOGFoZERoZzFMUlNDckdUck1vN1h0SldYdmxmNVZFdklva3I2R292ODNtMlhMTHQ0bkZYVEpkOXNtbkZWdC9vUERoTDJwUUlXeE9zbmV5OVlsait6M3BySGg4UEFUMjFjdmV5aTl6enY0V2w5c3JhSXF3a2FxSU0rakt1anRIOTcxT0cydGE4UmkrTnZoK1c0TmxLUjFoV1ZwQlpieFR3QmNJQStjKzBUOVJGVzZFVktKajNJQVp1QXUrT1BaMW1PbE1jdUd4RVVkZjhIZmFWWXJEK3pTcVp2NGNybm5zdXdlbXZxenRibGlLdmpHRnBnY0lOWDA1bE4vMGRwWWdKbDRxSWdURk5aUDU2SS9SdnJ2d3VGcjY2Smx5MEtVejd0d0tXa01GdktPQ0VsUGhzWngxMDBhSnQyUmJDQzNpb1pHMFhLTG1KMVE5SHBhV0Q3cVk1aEt5RHlQZUI4N1loMysyVDJjNjFldVFhU3NQK2ZGUE5BK2ZpTkxzVjRLdmpFaUw0aFFudWUyTXNJS2pyTEJzcXdnd3o3cHBxMHl5MndvVTdQNSswVEFPdDlJYzFmT2FML041b0Z0cHJsRXJjT21LUTg2S3g1ZVZBSWNWYTkwS3pXbGh4T3NSVGZhdkJ6RWpwNjVia0FyNTVSNmlhNWQ3Ly9IZmt0MnlkWXp0VmtYZXB3a3VsMzBjSlEwWTY3cWFvSllhYTkvZmcrTU9YbGp4elN3eDU0d1M5TWRMU1JwVm9URk02TEJjNEp6ekV5eEhXL3hZSVBkdHRKSDVSdjN2UXFlNW4rV3FMNEQwbDMvL2hnYmNtWHh4K3VSakgweGdwM3dQLzd0K0JORzFDOTUvNHJjRVpMWXNlSk4xZlVrb2NPbzJ2dWNDaGVjdVhZKzZkVlVib2xtMWJhK0loSmFZY1VZb2xWcHc4U0RmT2VkSEtMMjlvK1dZUjZRZ3Z1ZHFMdGg2RG52aVdCL2pEYm9WUnVuK1U0OTlvbWhEUDZ3TDNVS0NPc3piekJtTGMxTVZkWG5EejVKUEl3d09MY1RvVURnZm56VXRIUGJmcUxETHNZREFGRVhFTjFacDhFSzhFVHdhVXgwUUI1OTZIUzBpeDZlTWx1ZDYrK0ZHMzhOYzROdmlPRXFWYzBNR3B6bTJLbmYzYVZtMWxYVTJxRHVaM3lLdFM5czNwZjh4cE00K3c5WUVEL0hCYklwa3BRTVZ3QUFlMy9sRzhKM3JyK05kQTJTVFZxbkdZYjZ3UlJWUEx6Zkk5Z1FWZ2dwQUhjaVh3UUh5VVBQMk1sdVRDbUVkakRQZWFjRHdiRFNSMmw0dUlzazc2aHE4R1dqaGdoWlRmbEVnU2lvTmlidzhFMXNJdFIzNGZ2VDNiUm16NGs4NVpkaGs0dWdFZ1hja2Y4Q0d4V1BEL2dqeWhQOGtaRmZROVRweEgxelpidS90ckkxb0srVlVOVlJiSWh3N0czYlhza3BwT2sxQ0k5eDMrMy90WC9obzFOZGsrWWQyZ05Xa0ZtdXhTNDNXOWxacVhva2tXQm5KTWNDRHJUNHM0c3daRWg5QUFlV0UyN3pFNWVEU1h6MzZMYUtoN01SNFppazVIdkxkWjdtdE8rNDFNeEVqOUY0RHdsOWJUNmJoaUVJL1FOMTVHNmZBbXBBdU4zcXVibU56VERyMjMydC9oUWhkUFY4aXJyaTNRaEIyZG9mcUlsaVJ3ZjN3aTN1eS85c3pJa0x0K3ZocFpzYnRGamVFRmM0S0EyNTBQNzhqODhPT09zcWJ6SHNUODdmS3VxQ1gyZUdhbHRaTWtjUVkxdWMxbFNIQk5NZWtDcHJmRWdtVHZ4L0xTcEtVQlBkNmJwZXEvRHJqVk5IOUR3bCtMZmlnd3NETHlEMm9TMytkeXZFN0pkbFYwekNabEFPK2ZZbE9uQjdaajd6dzZWd21aakZoZTJYOTNtUUQ1Tnl0SG4zaEFCNVArNGw5aWlqeTBqZ1lRcUt4K1M4VlY0bjR6dHZTY0M0aHlVTmpuMDZKSmVzeFlkTXhrT1RZL0dLNklESWZaU0FWbzFodzl5WW5jUVZLUzBwRkJaTTVRUThDSWgzaUdrbjlZRWZ4STBXTk53WktEdVd5d3hraEtjVXNERFpnNTkxeG8vbXVSdC9ud2xYanpGRDFNVTVCN3Jhd3JZVy9QZEpTZUZRRk9WNGVXVWtZY3AxVWJLblluVXRMd0JLVGV3akpQVm9saXBiY0t0WjFzNDU0ZjZOWFVVd0pvUlN5RHJNcytKMUhtOFh6bTg0MkdaNXVxOGUvVGZ5eCt2ak96b3V4cHVobWpJR0Q1L1AyaWJqRWo2NlFwTGpjWWtaMGxCRmxJQldoV0hDUEJrY0pyLzhBV2NIM3c1aVF1UHJJQVloanlTTlZwWmR2TURHY3l3K2xCNmVVc0ZIdFprVXptclJEZ0VhTUJMeldMWGJWelVScGxUVitpdFNIK3psUXowaDFCRE1MVisxWXpjaVRHSVRlRXJJeUdJUU5zeitUVEtOUUVpaVJjdjlLNTM1QXdyUXdMUlE3ZVQva25xN1VYNVkvSTlNZDd0dElmWkc2Mk5Zd3hjNHNQYUxGY01TcHU2TFp0clovdjhpK3Y4UDZici94NDJSckdLanl6Y2t6WDR4N20xYW1sSHRNQk10KzZVc0t1d1VIMFdjMUU3MFRBNlJFNnlUd2c5M3JQT1JGM285cTBHaWFmSzVwWlBiaDR2bExFN0JCb1RwWDRPNVBVTEZGay9CSW1QdGVmbzNYM2t0S3hON29Pbys5eDBJYVlvNkZ1N2F3SnFaZDhmZllGMTN6QzJRblhUNE1WR1RsNXVnS0NpeWtFa1djRnlPU2pWREgzL3d4dHQ4NHE0Uk1RMDVtZnY2KzRwdzRaQkhMSTQ5eHhMWk1Na1R5OTR6M29sOVk5bVBjQytVbUU4eVV2Z01xTkVzMEdPS3VteDl3RTBnSFJ6QlViTHVkNHQyNFZvdDhZQXdzcFhONTNPZ0VlZ0pEUUJOTTRsOG5DMGw3OGsvLy9ia3VvWUdSSkJPMmpCeWtUWUdldzhiWTlucStpNGFtNE03WnhQVE9iMGFrSUdWb3FZdDAvamQrSGpmcnJsWnJSc09KY1NrK3lVOEUzSC9NNkxnRVVNRGgvOGJMNDIyL3kwbHZuZXZyNEpVdWxyMFBsQ2tJT1ZLSzFySXVxT1p2WU12SXBrd3ROQVY3MWxab0hhNmR0Wmg1RTJwWHIvVEgzL3JnV3dkb3dVZWNjWGU5cXg4MnVJT0Q5d1lYb1Vlc0o3SlZOVFJoUnFPSU5hakRRRWFXYjMzUUg0My9RWXJBVTNua0pva0pkUEJGYlE3Nk1vemNUUGZlL0RuNHl3ZnZyZHo1WUIwQ28raU9VVm5BTDBDWkFTbCtYU0Q1WW0vbkRyOUx1OGkva0tpL1VLNStXdGFkVTdtSWJZOC9teGl6eVBJSzhVNnl2bHEya3dIVHdzZm1maFdPSDc2VGwzR3VjVmYvL2Nyd1lOTjhJcnY3ZUxvMWZWdUJsUzNYc3Q1aFlTbkFOSk1ZWGtmQktFSTFHWEx0SUpOK2ZROEx0TWZBQkxGcFI1ejFzWThoTXpZVXRidzhLQ1p4UUt3OFBHb2szNWxsZUM5MnBxVHpVdjFad25sckN3bTBDeEl2U09aL1N4U0hzSFdVWllRYmc0SWw1MUFUYU9ISkJBT2l5QzRITDQ3Tm9BVTJKSThGZlJsdHlpUUhmZ0ZVWGc4TS9oSllsK3lKVWU3dXBUN3YxVjVmQy9oMG5IelBrdnJjVXI3YjNXMmRqTHBuQTUrMnd1TzR4U1M1TkxMY2V6QnBjbWl1MHlmRzB0ZUVKa0dsaXdRK1MzanRreHBFVkM5RURMUko3MHlVMFg3SnVqQXhlak1GMWZZaHRBVzJEMXhZNEJMSzBSSDRDWGc5MUJTWm45S29oajE1Skc1WURBQktIMUxBUjR0b0VLRitwa3g2clZPRk9pYysxTm4vVFpKUFVzbXNlaVptbkRpR2JCTDVmYkg4OG9mK25WaTFka2pkMFFDZldEME9jZ1VkR0xPY2s0SVIwdXRGMFl3Mi9WeC92RU1pTFo4ZURXN3FHZ3dNWXM5cVpvNkFWOGRXdmR3UDQ5Q2N4NXlDZitQeVM1K0JuY2czZyttRHZldTF5WnZrOEQ2TlhHaDEzRXJ4QzNXTS9xR3JCL2xwNmI2b1lSQU1OQ1F1NWZrSVllZDArVGRFRHpYdXEyT3JQaW93TUkxVWFMVmtKZm1ENmthTXRVS2IwSEtsSFdOYis3a3VuMEFISHEwNTRFc3pvb1B1MGRGK0JlMU1MRDBmK3pDSmhRbHhHQWp3d0I3L3kzdlF1MGlIS2dOU2c3UlVIMFpNNHFNbS9pL3cybEZlZ0ZubDRCeWlKc0piT1dSMTh5cmlOdWlQYWlGMXJaSkZqcmdXQk10c1ZqMkRiSys0RzhScmQ0ZXAwQ0MrU3g3OU81R0I3S0hVd1EzcEt5cnRpbDllSTFVNVR3S05aRDNzN2tud3JFUDBBV2JCNExXamRBSWRuaGlrSWEzVU5Sbm9aalVwZDZtblpBOUErdHVGQlpldVErTzVSV1JGN1Fya1FHSVpmMU85SUlYd21FZjlGQWp3Nk9rVG1QaTlnT2paZkVVRElpc1BSZ3kyeWU1TVpQcWNGY3ptRHd3WWpvVDZNTTkvREcyQkhRTTM5RE1rbGFFTGd2WldSNE9XcTduMTkrVCtKV3RuU2R2SVNhK21UbVhILzAxaVlvcFRFbnRwSW5lQnZkQVNOLzJ1cGZXZkk5MWg0S28zeDA5K3l0c1JXKzY4T2ZtVmg4U1JvUjVPTUhZTEQvcGV5RWp4SDFDb2VCdkE3OTQ5UjQ2cVJxTi9yeDNiRTZmSkdSSW5iQzJSWTJkamQrYjFjb00vWHZSRTgrMEo3enh6N2Y3Yk9ocHRaRFFpMnBuZVArMTNScDhrNXJvTnlZTmhxZjRSMTJOaWFxbHVhVVV1Z282VEJlbmY5dWNSVnpSSCtqdVhSZlgwR2xoSjlJT3JYRnNmYm5hb0lJTlU1ZHdVa1lETUxtVXZ0U3g3ZVpXejVJUXhlV2s3VzkyMHMzdEFGcm9ycldsMHp6QVVmYnJxaDZEbitodFNVYkFXV2NSQWQ4UGhXZHZ0NC9FK0RncmZsUm4xREJLOGRqUWp5T3h0a0puV2J1OVpqLzZkcnZMRW9mVEIxdVRzYkE5akZwTzhMRmdmUkF1UXN3WGxRVnNkbGVuWGx3cko3ME1aY3E2Z0l1T2ttTTFEYXg5OWEzK09JYnNwTEtHc3JncWFaNDNuNUdXM2hvbjZldVkzWVVES1BXRWVaTHdkMmdzQlA4N3Y2cUgwdlRDOHNBRUdqRjlaT0l2NlVHc1lyVHJZTDVHTDlVM0xlZUVheUo1Vno0ek5lZlY2eVpqLy9ubVNOVzZSWjZId3ZuWG91WFgvVHUrbHdkVEJYWFZTSzJuYUx4Ry9lYk5MUmU5RXVodlVOcnB0VjQrMzRFMlYrVU5sYXQ0TU1PUFpaUjVlZ1FDUFVyMHRIZmhoNUlobmlPTlEraUQ3QTRLMzJZcXNxeW1lMmFNT2dKUXZpcXYrb2E1NUhtdjhMSi9XV25OZHcySnBNVVd1SkwzN1g2YjM5WEE3THZVeEVVUEtzTnp6UUQ5NklBRkxudjA3VWZTaG9mUkJJSk5jQ1UrZnN3bGo5OGVxNWptbzdqeHdUOHNLYW9rSy9ZTFBIV0tScytZajgyaXNPb3pGT2NZVERIUERUeXFRZStlY3ZrZU04U2h5cjZ2NnRIWGc0aSs5Z1g5M2syL3QyRE8vNlRpZkdrdWdyc1dHM3JzYm5SMjgzY1hnYm5BdHlrSlZJRVFkcTR0aTZGVlU2YmRJZW9GNXRBREtUbURIaWdmeDBjamVmbVRZYjdETHI3ZmtBeWFjOFpZRzRGaTRKRjhVZ1RONi9FZEV4V0xSclRSYmZGL1h3MU83WDhqNmUwK2thdmFYbHFxT2ZkMkE1YXprZ2N3ZHQ3Zk9UZWdPK1NjaE42VDRYc0ZCazZzMGl1M08xUUY4SlJmM2RKWEVxbVFZMHNXdG1LZUwzTDllZ2p6TWxNQUdGamVIU2ZkUVhiMzl5WjFEeEJQUVB0M2JmMzdWdkd2dSsyN2owemFUZXJER2Qyd0g3MzQ5enhMaEJFN3VmdjQwUU1oZHlmSGE0YU8ya0c0QlBYTGcrN3VEZnppb0hrNkMxK1N4SjR0QlVKRGF0cDdKMHUxT0d1MGo5czdpbzNweFNWYmlKcXROYnZ3dmlMTzFGYTFYajVyRmZVODB3cE44a2lMRjhkNitaQU9ydnowMmp5U3hkeSt3c2oyVDk1L1hRUTVYRi84OG5VZTZxMTNlTW41SGdmcnpRM0FWcE5vWVRpNGtVT1VWRThsUUk2cmlDa3k5RldpZS9ZUW9kL1hWUnpKYW5iUlMzSEJPYzJ3dkZCeXVNUkRQcXliN2FzL3lVSXloV1lzWk93andLTVRERlBGN3hMV1FlVGlMODFYWG1XbEJHVDdHL3B2L3E1NTdFc1crNGlKQ3NaeTZNWEErN0h2Mlc1K2VWQWpRcTN2d0FyODZlRy93UFdpNS9PR2FZNlEwSU1vUXVoV2RqZEx6amlpNm11TXp5RnhiNHVlWUNsZmNHRG1EVU84V1Rldkx1TjdhZVpremJqanVNd3JpcXY0SEZ5Rzkxc2xHRnhiY3NVSGlvZ0dGS1pyamxMdmdqWGwvMjZLZnNkTm92ZCtGN2YrK3FrYjg5Q0d1SGo1Z0dWZUFaTVpvV1ZGMVRpcjVQc2NFODRCMTNHdGxwK3NhcHFJOEEvelRxbURMVmdKZU8wQUxPb0w4bHUzeWUvZGRJMGV2amY2WmtaMHUzREQ5dnlFaGxPdEpXd3BlajVkcXhwczRPTmJ6N25LZmEvYU84Y25yQXdaenlZUGVjYng5UEQ4TUh0bmoxWVpxZGRkTGJYdzJHZUhtdDR6VzRlQjg1MWJYdGlQOTAxQ29kSEVURU1hM1FhZndwd1BwYlVaeEU0ZnVEZjVaNHdjUitRNWRzM1J2RFVadHVCa010TkUzcmc1N1ZyNkhzOFBGakowYmpqaFl3bjBjRHRoQm04R1FJaDliV3pzN1c5dDFQbnBKazdHL1ZKK3djS3dqSU81eFBzTEphZFBHZlFQR0k0UWs1SVprMzZ0K2RWZmVieTQyMzlzVWFsbngrdmlaLzR3N3plSWJHUG8wY1F0Q1BKRzdHWlVSUVVxbUV3MHY0RFBRMDZkbEhQVkxyeEdpVVoxanlHRzE1RFVWOVN0YnJ5aTV2MUZzRHZIOXJETjMzQXMxOGxOcUlCS2ZENHh3dS9qRzFBUXR2WWdSK1ZuOTAweHNjdzhVMVhvcElpaXF5R1NqZnRNVzRrcU4rdnVnOVZiLzVWdjdacDIrUGoxWm96eXhyM1l0MHNmclZlbHAvMWhmMjlRYXZNbVpyRzZqU2xQd2hWR3NvTXpTVUZVbjhVNS8weVBxVTVuZjhtOUxKcHU5ZXRsZVE0ZmkzcjR0ajVQcXp5QjVQdVhkakhvRzhRbnRIeGpWVnhjOCtuYzZYaDFNSHdRNjNFcDdTUDkwdkNYLzk2NGVSenU3QjY4b0dRNy92dDV5eWhQekUwVm96NEdJQ1o4NmI4MTdLMDdVQW0vUjc1MklRekhldkJhT3ZMeGlzSGpyZTdxRnRoL0N5K2ZjbDNudnZhK282WkU4QzhxclQ3ejM2MmpDTGxmaFUzNGo5MUhBbDMrK0ZaWGtuUlY5ZFB5SHVYRWFWdUdkVlhQaEhIWHR5ckZqVXRuQ1kxZEU3dHJsQzlIS051eU4yZkpBWFhhOFo5K091OURjdzNvVGRVRGNXUGxmWXBPNzRoUHEvR08wU1RKOXNnZFhBdFB1Wi9melFnZDRSZlZ6R3ZsMDBWYzczcnMwSHN1b29GTHNiOEVDSXgxQ253ZEhKK3JkaXBMN0FyVTNQUHZxRnM0bkxhL2oyRjVVM29tQUw0SHl6bENSU1VsSHNiNzNXWVdlT3ZYamxYVGNpbmlwZW1LM1dzL1ZFWVRDN2RaT0ZqRWc1ZmRJLzJHRGdYa2hTbWp3RjRaRWFJRFhCSHltY2FLSU54K2VPZGs4bVlHSnNmTW9qcTFDZ2Q0U0JQNmhzVVN0UjVGRFNaQ0VreTZrU0VKWU9sS0QyMGFCUEU1QjRCVERHZzdGcFkwYTRaeG9UNnEvTUEwdmZreCtzQ043QzFXbVQySktSR0xGRGw1WnlRMWw1T3ZFOGFZVEN0M1dUTDE4NjNhOUFXNWpSSlExRmlMY29NN0JCNWlDK0J6bnd1UytJTjBOajc3YWhlVWtETk1iVm4ySW45R2REWUtDbEhtaGhVUEVHNjNTRWxnSGcvSlF6VDN3blkvNHpYM1pCU1hjeWRwb3dkSzhSSkN6VFJBN2dCWWJwM2JXUjhCcG5LankwTklrcUwvUHFtZXdDUVc1NC9Ca1k0cnhNZVBWRDd3a0kwcDlqYU9xUGN1RFJpZS9xbEt0bTRXOENwR2JKV3NBbG9rWTJPbjl5MkQ2NEx1Z3Z6VU5zSmpVc0xRZnlTUXljMDNzQkpqdG5aZWxTNFFFcGxmODN0WGpuUWdONmp2dHpvODZGZjJYMkljNG4ycGY5azlqamd2OSt6QitzdDZsZldXUG5XK3ZPeG1iTTFxTUJTVjhzL2tLeENXVnVraWRwVXdRMnhqdktYNTg4QlJTWWIxSFV1U2pPZys1UnZ2dHd6WEhKRjFxM0FsUzEvdUNDK3pxOXdMb1ZkOFBTMGsrU1F1d3V1T2k3UEVTQWpqZGpnZlRoZkVCKzdKL2lpcVJOcWJvblhjTjBpMkVGamJCZW85VzVmclRSTHBtaEwrZlF6TnBRYkFnVG5DUVFLUjNLOUwwNXc1OUVncGk0SjJIK1pEdTV5c0w5cnJwcHV0QkNZVFNmOTRNQkJabVRjWTBORXFuQ1V0Wm8rM3pvNFplV2ZLd284b1liTGFBUHVZNWtmTitjdWFOQWg0RTdibWJWbk54dkNia1h1SENucWJiL0ZiakJSb0hVL0Nvc01rdkpjWkVscWVFbXp4N0V6U1p4ZW0xVlhWUU9aRDhSekJ5dTkveXpLTzNXdmdIYU9OdVlQeUtMc2pzL3lDem9oMmZHbzJRdXZHaFJ1RjdoL2dXMm50RUxodlgrZHZMTHljM1JaUFh2cWF1eGFldnhqVGdnejA2TjhyWklCbXIxRzRuSWRqUTBjY3B6ZnZyMmdvbkw2b2FIYTFONkxwTlphWHAyM1prbkNXa0YrekRkREh2OXYzMi8yRm1OaVBaNVl3RFBxbGV2YmVYL3FaV011NVlTNGxSeFdxNlJMV0ZLeEZzdEYxd08zYlNCUm4xKzJ0cWVCT1VqeCsyanU1anZRMWZDWnZ4NERQSHUrWW0rZmt2azR6M2o5VmpWZG4wM3FENWlOdjgvN0dqcWVDMlRrTDRrN0t2MkQySVBXSUt3cWNVWjJjZldzeDJtWUdMYndtcFB5ZmVMd0tFRGpOSHYxRjdNb1lDQW1rWko0NUtZaG9Ta21NTkRUUTc4Q3RkSFlrTm9YaG43TnplLzRHZGM1S1RIT1dsYzlHdStsYStQdm1lZWtKaDk4ZFQ4eEtMR3B3Ujg2aHNncUVaN25iNW5UNEVSMEd5bG11c2gwM3BvdXc4V1VRMjFoUFgzbG5kcDkwUjB5QUhxYVBQYXo2emQ3SkNiQUhCMXY3WkV0OWNQRnNaenhORkYyOWlPeENlcTZVU2lLR0NKTmFKQjhNMCt2dnVSSmFTZCtKejIwckcxdmY5THJpRVpqaktrTVBZTEVTb3RyMmdCdVlmdmVqdVlLbjhJZHIxejRuQlFseWZ1OXhwZ3lVRUFFaHFqMzBKR1dRRHY5ZVVLZVpZNkw0d0FDQUxSRk9ZeDFHN3RMcGtaTittMzlsaEN3TUdrRys0a2FiZjJLS0ZKRVlKbUJ1Z3dRMVI2N1ROb2pHc1JQYW9FdVNLTEpoYW5nSEw2Nkt5dlRCcTFrQ3RaSVdxWWlYMzJKalBYYnlibEVGa1pSb3psL0ZSMjhpYTJJajhXWFJUeGIrSTlzWVdReTdNY3J1WlJIQmdTVUFnOG9rTWIySjJWclp2WXR5UHdqUEd5cWNRT1VDMmFNTDgxN1Jib3dvS3B5MlF6MWhCQW8wL1QxSTBXUHp2ZU11VEdJQnJvaS9TTGFLV094b1pLRG1ncXJpV0hodHo3OVBndDQ3TkRUQ0RYMmtoeE9WZlJyMGprK1ZobVp4aG9paXpHb2tSd1crNWE0bmhKa2pTK0VheS9PVERBWllZTDdrSHpQK2U5UHEyQ2VBQStBQ2dmczVGS21kWWVaWVRKd0R5aTFHTkhvRGVMQlMxTTJ6SmtOZFF6YkFGVTJYTUFZd1BCcE5PZ1BvcW40Q2ZoUmJ5TytDemlQOVVKcnBMQmsrUHQraFVYNTZXaS8vUnN3SjBYOEZnYUsrNFNyY1dqSmZIV0w4MEx4L0x4ZVNoZGlWdlZWQXArZ1RrQUgwNk5IdnVLS0E5SHVBQUZOVVZsUkhJalcySmZyWGhDU2V0SVRFUWdwbUlhVHdnOXNXaEMwTUczSTcvWEpDZHBiWWVRTHpVZFRnUFFGU0RjOXA3dGozSFRiZWwwRjN5R2dZdGlzdFE1bWhLSUtRU3JjQldtKzBEK0Y4Mnd6U1VCeUNxWWJScDQ2Z09IaFhLOWRwOWNKaUUrUVkyWit6bWFubHdLaFluRnpQUnVPMUYrcWRnNE96SGhLS3kwN2RPZmUxRXlERW1wQUNkN3VqWWo4UDJ4SGNVZWFRZzMycGFxa1dIUlZVS01WZlhoS0YvY3llUjNsVW9sZGRDcmlxNTRGa1ZGck5pSnhwRGsxUWNnVmpBZlgrZG9nUWhaWktBa212VHdiREU2RVpsUUVyUkFybFFORU9BNlkvTEZ4b25TVkVNMnZsSHhzQ2pteVpKbk5PTjdyQ210TXY5QklNZ2daMEpEdFJYbEl3TUwwdkJxemVsSEVHU3BvVFFnT0kzRVc1UUdTZTA5Z1UydFZpd3FwVitaZEhvMC92RGtIK3duRXc1Q2FQMlJwRGdNclhHV1RwMHBKTG9DOE52R0ZPWWI5RjdzOWt0UlNFN0QrenV1NlhkUU5OL3ZPcUZuTkQ2OUdsS1F2VDV0Y3RVK3JYUnlCSDFqNVc3dmpETnhONzRzZEgzMU5iR09xSVA1WjNwa1M1cmpTVGkzTGczbVE0S3RaK2htd2l5UU0zdlVOWjlVZGRnU1d3c205QmxZd3N1VFFubnhza0RYZlpJSERGd2J0aVJjeDFtSkJ1Q0lKUzczY0kxRmpxSmRQOER4YzhyU2drQjZ4ckNwa3lZTUY2b0V6WWhjMjBBbVdESmNUVnJmNnB3cEZYQS8vaDkzNXROV29QVmhIZjM2b0lWOUxReEdFbklBYjlmNlBkZFI0dGlqVHI4T1Buc1JvVEtRbE1VMTk5OE16aGNMa2xrNDh5bFMzWWprUHFSSjBBa1hRQk1KVHd0Q2NGTnFleGxpS3BHRU5hSm0rbElyUzJGZGxUSTJ1UHRUWlZCUjgrT1FBTFNqeE82V21tZXQ3QkJNYnFkVzlqV2JucGx0eGxTUzVsNUwzUkNrYkdvelJ3V2pjUGV6dG5MUXc4NDh3SUVMYkJWQlNjdnBPVE00cUtCekw1YTA0LzFadmxxUHBkaDZicFNWQ2RNS2x6d1IzMjhJVDJZd0tuSWxFTlVRWGR4TkJlR3ExaXhvQklsRmVrS1pNSnNGRXFjc2lCSldlOEtneEppNVZ5clRvZW1qR29NOTNFZUs3N1JYV0tCWXFDR0FGaHo4RTdIcU85SEFmM0lESzIxdGFtRFpDODZKa0tZSmhuSHBKbG5HUWhIVUUrYTdKZ2ljWndvZEZJd3huUjA0SXBjYk5KTUxWT1JjZzltSklwa0hLTUQ2K1E5UW0zem1sUTNVNThlTlpFd1A4QzdHZGgwZkZwWkRJTlJSWmlvMTlwTXFSQ3NTREZzczFVamFOM3R6TTNlWDFyamloY3F6NmVvYWQvNFlBa1VUcGd3THpOTFJNSnVnUG5lcFEvWS9xdGg2QTVXTjF3ZngrSGZVUVMvMnpZcmlFY2d2Uy9kME16dU9FcnZLZVJJNno3UDVKTlI2L1ZtZWUwMVNZSi9Vd3ArMDlkTCs1OTc3N1dnR0NpTkg0WUwxYk9FUzVhQlo2ODErU3I4VTVxQ1I3UExsVmFqekI0bmtYMEoyRGoyaXJNR0N5eUpXbk42cFBVa1JoQjh2UzQ3MWprK2ZoMjB5ZzJaMms1Y0dFZmcvVEYzc2VuN2ZjWnc5UjJVVkdSekFQYjI0SUV6UXhObVRWbG13UE5EVHZRRk1ud01wbmM4NStLaEp5SGNVaWFUbXhCVEpTK2NncmoxcHB0ZXV2N21tNisvZmwwOW9oWkVrZ3Yrcksvb1BqM0pGOEwvN1dodmU4ckQvWS9aUVBrM2NmNmtqV2R2dnZiR0cyKzQ5dHExQndFc2N4Tjh0ZG1ySkg3TVhPMUo2YzRkUFk4TU9NcjZVUkg5R1VueFV2cVY1NHlvNzBkTHRkL3pua1VGb3ZhK3VEY29BcW8raWYzcTQwVnNUOURNWTBpVHlaUzBPZWpkd1Bobm5SNFpoTnJEL3JZdGlRVzRpb0VLdnpJTnNFeHFUMkFiTVNsZ2p1QkN3UERENnFuWDl6cWhvQklXY2dQU3dqS1FIbDQvaW1PV0tNVTVZOFRWNFRjOWVHWURBU2ZEekk5RmJ5RGhremVkMjZaMURieGZlSERTODc2ZnNDZVk5RmhFdlBBRU81cjVEb2JaKzhwTUdvdW1DVXY3MWJrY1FtZEVkRGQxK2M4YWhCT1NGZ1ZZcXhva2hhMnU0WHdtUzBRU1dXM0lad2lmTmlndFArS2FSU2VoTWZpRWcyVERZMkpXYnR1TG00eUNFeFoyNCtqVStuSGYwMlpsQThRMFlpSmRTQjBYQ0pKTkRXa2hMT3FqaVlKNnBXSjdVbkk4S1NxdDJSd1dXUHJ2c1pZTU9UTDhZSkhCZzJISlJhNTRYNm9SWkN5djJDRmI3U3RNczl2VlR5Q2xSRjFra0VBU0FCTkFxYUpoOGRRSnNtS1dFMG5KbG5TMmxOVFNZZEhvdlZXRno1NGppTUwzSTlaU3RvQnpDRklUSTJBbWFRUzZIcFlVbFZiTkRYMzRSaHhJQ25GZWRVaVFwRFhiQWhXVUZuV2R4cGtKbFVySEtCMUpmSmE4cXBJb3JVaWljSWE4dU9uZ0lEYUxkZWJ3MHU3R0VaQ3Q3TVEwSnlYWi9JQmE3cnJOSnZMZWxyeDAralNneGxLc1NwcWU5elNFR05JYkxBVFlFSTNaVUg4WTloL2JXQzd5dkxNeDgwc0dyZ2c3QXg5UXVOYlFJT3AydXVTNU5RUXNmbjRKaFZWeWlLV2hseWx4UEUyVzhvZWlVRU9vc1ZKazNqaWdseTN6aVBPWnNHREZRd21zb09NTDUzbTBacElvQlVWNEd6SnkvSkFnNjRacGc0eFB6QUpvakJkWEhHTG4zcVVpVGFNNGppTGJoWkJFVXFJak5nZ1NRejI1a1RmSVhqK2F4RU9aNVhtVythV0UraDEzM0VaQlpvallHU0lUOHdZV3JoMDN2NnV5TXhjMmJyazdvclY5UHdmZlpCQ2QyNlJsZ2dBZk1KN0x2cmN2TGZnOHNiRUNKWjNLeXhZSmlhSlRwNXlIaGZGOURqRnNMRVMxZ1l6TENhMEM1em8xdmtveEcyejNqWGk4UG9xN3YyS200Mm00dzQ4MDg2UGt1YUJVWlZHRkd2emlySS9FV1RhMHl4U1VUN3dkUVRpWUVFRkczVWxzNEZxanlGMWpJd0tEaDdtVjRTMjg2bUFhOW9PaUpvZ0RoeURYNUlReDZOcWNWR0JOQ3F2NU9TQWo4Q1RTQnZBbWlxQkl6M1J3ZHFFb3J2UHJ5MGREVFZhS2syeFNaS05CRnlSYjZralRXTHR2bEVhKytsa3FUV1NBdWN6aUhrMk9KWDhiT1JlZVNSSmVVQXRZZFFuWTZIdVpWQTdvZ21uR3pBMUs3VitYZCtEVE9udUMxSlNQdG12bjNwazdQejh1d1JCQk5BRlpndDdOUUZ1MFVubGZYOWd1akhEVG1VNVJpbkZUUE5JajJHZlBKVjJqemp6ZlY2VG1heE5Dc2pnbUJNek4wZGN3L3hTUzY4VlNLcDRrbElLRk5hbmVRTWRYb2o1ZHBTTjFmNXBhV090N0VCMThldTM1ZzVjRFNnM25EbGx0aG9GOWhtV3h0MTdrUFY4VkFiMXB2dGcvY3hEM0s5ZnI1dDAreTh6Zis2Q2gvbmVXSDlNNnJIOWkzSk1ma2lqT0lrZEFCUm1jVTFZeklvbHJDdG82SVVvRmMyYTVsY3BlL2Q5bEdpNnBtTFE1TTRFMTBTcFErbjY0b2kvYmQ1WkdNUEhvZGMwMEJKL0RSdDRydFJUQ0VEalhKbzRlTloxbFU1Y3F3eEdoVnFYZTF6aG5zdi8rMzIyTXVuTkczMnM3emh5anQ4UTc4MG9IZUdtdE1tdmpEbjNvUU5hRG82cktaaDQ0cUYzRFo2ZmRoTlZ5c3dGZU1uMEMxd1lWS1ZyTWNhdWZHREsxbjdZMVdFRnNPbDdNWmxOazNZY3lTN05NaW9OdCtRd0lyOXF2T2ZNMGc5Z0FIanNGR0dacDdyV2RnS3JZTjdXeGJ0MTZkem1KaHg1MFpMYUNhUkpRMzlJd0FDM2xhVzRqRXg3NmY4bUZCZEptVHQ2WnJBMysxSWwwaFoyNnpHQTRGUW15MXN2dDlBOVZCUWJYSTlGd2ZwZlBzWVduWFFVeDZGUk5XU0k3WTRiY2p3U1N4QXNheUhKUjhibVp6Y0NhL3A0b1RtaS8ycUE5bTZoaUZ6YTlTbDdTdEI4YVR1aGg1eldwTi9hOEgxaUNvVlU4YjlPdHA2a1ArV3o0bjREM3ZKaVJUdjg5dm9GQTU5RTRUcytwSkdZWHlxZFNzamQrREhCMWRmNkxiRm5pNEc4WXVJa0Q2SWgvREhhUUVlOFgveHFKMEFTTTQwTytOZmVGY205RUo3bVpGSEJFQU5KUHIvM2lIYS85NW45S2d3ZkVoLzM1elpjL00rRy9UMkFsLzZFMy8zRnhlMnJrK0JZbUJ5VG9melN5Rnc5bmxFM2lGZUlwdDRtMzkyZGQ0M3hhL3JmckViV1NFZWdETVBMdXExNHJwM0llVmZ5TWlrMVgrUkczd2VpcldrWENkWm1LYk5mQXR6bjFEK2M3eHdIL2tCMytVNTBjRGdKY1ZWSlpyN3RWbDhDWExVN3BHNUNwNDhURENOUVRFT09yZmlrYWNDMHplVWJ5NG1lUUtyTEk0Y3JjVmRKWlMzeWttMFFPT0lFRkFQdWtxdHMxMmEwank1VVdIdjF1ejJwUFQ0emYwYTRTWGVvRjBYclNOSmdGL0lEelRNbmdSTkxRTTN2eGYweVpidHZsQUNVaFo1cmd0TjR6bENiQkJjVGViZnNWdzNnR2ZreUJyeUVDMHhyUDZveWNSYjJVNmZlSmwvdU1MRkhFMFg2ZktlNkNtOEVNVmJmYUJCVHNjckl4aGg0NWVpS3lSMUh4c2EyOUMweldzcjhVWWdzbGl6SUdUT0dCRnBTSm85UXpnaHM5NFRnMEpuZjJHOEIweDNzRFI1K2QzYXVqdmEwT3M3L2xhUEkvNm5veTZkcDBiak1wOEFreEZVNWt4Z0tEYmdVSytKenNodjQrUHhqV3l4bmRsM0pDZFA4RkJnOVJnNWFkSDRKL0dKSWMrQWo0UVpJbHV4MThCbndEdCtnODI4UklRZElNZDBXSlN2by9aZlNVTDREL0pCbnZwakFRMnlXRVFQb04rRnBabXNTbnhESVhSOEg0RmZnUjd4SndFZnJPMFgwck1mMUpJakhiOVF6VEIrQno4VHVYcXBQdWNtak5UUTcvN1Y0ZWhMNDBmaVZ3VU1Ea0g5U21IUjdPV2ZaWFI1cE93UE5yTFpDalpPL255S1k2Mm1XZG9SMW1BTERweHMwdk4xL2I5R2pUOTVnQitKMUJMbFJnZ1FtQndnUkE3TFNxRmZNQ2Z3Vy9PanRpMEh1OUJYQ1VBZVBBVVNhS3MwZEJMbkRycUFscmd4eTFSMnBoUjFrc0xPWElrSk5XODNBa2dPWFdkUlFKeU1aMDZsaHNRUmRFYk9kOUU4UGFMdUJTUkRIVmxKSkxEZ1pNZUVPSGV2UzhTZkdrYkU5TXNkVUw0U1dqaFY2bVBRbWxiWHBlek1pVThOaVVXOTNnRzZWRndrOFIxbnF4NDRWQk1YNE91WVdZMDYrRFRLWVdSZzYyZWxIWFgwQTIrc1VyeE1UV0thRG1yTExwV0hnRUhvZWlGajNMMDRXenJuME56U1VUQm1Tbys4UENFU0RXQlRPVDVOTTJFb1JnbVZhT3hFQWdJeHVNWEx5VjNnYVgzd2gzREozcVpSNjQzeWkyM0NDcjFBc3NPRkxQeVJXTGlTWWV1VXgya1M2WEltc1dWbWdrQ0F2akpUZDRsNWtEK2oxSmI0Tk8vRzZlM3B0UEhwV09LamZ4S2NnUmZpbHltRCtISE9Ldkl3ZjUxNm9CbmszbzUvR1JHN2tKZlJ3SXNwZnpuZEhERGtWMnMwdVJYZXgxWkNkN0R0bkJ6a0cyczlhUmJaRWc1TE9STUdRTGMvMmhhZDdtYU5yV2FkeXUwYkN2VTcvUFViZkhVcnRlbzJaZHAzcFpwMnJoVXptblVUSFBVVDZ2WXhvOWtXWGpDS1hqT2lWV0taN3NvaWxlbzNCaVlSeldLZWpibFB6ZXp1dUVrdHZaaGk1ZmtOUEZvbSt4anV4Mm5heTJsTXdXaTlUVmZvSzJYaWVqc2RNYm5wSlcyYW1WVURTbHJjNmdxREpiV2NnRVJkR0VQRjlLZHE2VGM1REdqcElTMjhseE5pRXBUaU14c1NYcFlvdlRwb0tFaElZVVJWRGlRenZPdzQ0MVo0SFFOQkhqNHJiQVNTWGFyb1AvOHBITVNERlJrVEpDUTE0VEJRV21FVWoxUVdsYTg0K3Zyb1l1Z3c1Rm96UVZtb2Frb2hCSUNra01tZVNOSktIV0lSTG1JUGhISXYzSjNsNmF5TnNKNllkY0IrY1ZDOVkzQ0lueHhTQjl2ZGJ4b2FHUWFoSG14Zi9SNndnM2VrOFUwMnY5NHpRbmFVQ0xKRVRxcElRbzdlbkxwVW1YZExsU3lsWEFCTDJTT2R1L1EyTVpmVWs2NkNXMWRLUXJsVXZLVW41dnZhb05lT2dCUUNNSHNYWi9CUUN1eG15aE9VbUQ3dEpKNmNwVkd4TDhsWnV6WTM3NjZSWm1JemI0WGdvaDdvVFZldEpGQ3phU2F4Yk11dDdESksvbXN4SlZDNWEwM1FEcDFXckZJVE96L0t2YU4yNEVlSjRadHpDWXJEaHNEbmdXS0E5dDJLQjdSVUlCbXVjNFpRRENOMGIxTWdzVVpqQWpyd3dxemZia0RqQTRzbHpDZzRVQklHVEdZM2JESjV5MG1hMWJBM0FTbmdzM0FBQUEpIGZvcm1hdCgnd29mZjInKTtcXG4gIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzFDODAtMUM4OCwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUYsIFUrRkUyRS1GRTJGO1xcbn1cXG4vKiBvcGVuLXNhbnMtY3lyaWxsaWMtNzAwLWl0YWxpYyovXFxuQGZvbnQtZmFjZSB7XFxuICBmb250LWZhbWlseTogJ09wZW4gU2Fucyc7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBmb250LWRpc3BsYXk6IHN3YXA7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgc3JjOiB1cmwoZGF0YTpmb250L3dvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFDdzRBQklBQUFBQVV6Z0FBQ3ZUQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHajRiSUJ5QklnWmdQMU5VUVZSV0FJRUNDSUk0Q1o4VUVSQUs2a3pjVlF1Q0pBQUJOZ0lrQTRSRUJDQUZoUVlISUF5R0ZodmlTU1hzbUNGdUI2ZzIvdjY1aTZKbTdsR25DLzcvMHdFblkrYzIwR2NKalYzdVhDaW1MTEh1aUpWVDR3eTQ4cnBDWGVyVW5jZ3RsM1hxdURYZHNidFRMRnFUVCtPaWhZWjEyb2diVnBEZCtLWkI5M25yYUJpaFNKVEl5QjVTUTRSbFJ5SStDeStMVm1oNSttdlBBdWlJSDMvdi9xL01Ea29CZmRhL2g0N1EyQ2U1L24rNlh1OTdRNktGVDZ4dlpTWUFOT2ZJVERJd3JoMldNUjFoU1J2QU9oVlJsKzYzb1o0MEFOc1VaeUU2WldLaEtLQ2dSQ3RHMDlLQ2txVU5SczdjekY2WHV0SzUvTDU5YzNWZGxQZVJQdmVzVGFKd1NvN2tsZlRzMlNlQklieWkxZ0dxQlpLS1NCZ0tJYzN4L2JqNUdkaDVDV1JBZ0hBQi91Wit1UW4veHU1Y3d0U1kwN1htdGpHOUU2cXRjWFgxZTNPVjhoQjZsZ0lLbEY0ZDFUM25CZlRZallHbVRDUlBRR3JhdCtjQUg3Rnl1M3dGUGNjUUNMZ3R4VjBNTVNrSi9qZW5XczFPMHYveGtFRzFGRXV4Q3ppUHdJNU91YnB2TjBSTU1rSVRwM214YkZrZTJkODFCa1VIVUdoeHUzQnltTjNSTmdtNXdaZUdpRTQwdVp4TThyb0tBa2lpejJmVEtxMVdXVE05czJRdGVyTHhvbWFQZzR3aENTK0lWTCtxWFYxVjNWS3JMYS9WN2ZFYXRHQnJTRExjV1JwU0c5NnpkM3pBRUFKSjhzd3lSZ2VJMFlXY2NYaVhYWDU1QkpqZlk1a09FVzE2U2hVQmlUdGYreGxML2FGb21wNWFnNEljaXZBRUJEeWFiZjk0V3FybmphVExvajRPVVlJb0plUHg3MXdRR0hVMDFBM1NqaEtaT0c2cXZjczhwbGRkWXBiYlBnR2dlVHZGRGJpNkNNT2l1RTIrTHNvSEFDRUZodFY2S2RuT1dxNks1NVVqbmpkV2xRRndyNnNjcFFEQkc0ZTFDdm8rV0dxY1NmN0w1emwzMkFnQStJbWNpUUNFcFNtbjZ4SGpyRjJmYldVQS8xSUhUU2UxMnNQUTBFUXJzRG83WHpCb3lMQVIvZHpxM1Zzb240S1pUVFVQdWJCZjR3bW9PN05jbjlqVkxkdlIrYXZUK3JpRzVpSWZFSzlpMmdNcHorMWdBT05ud0tIL0p3eTkvL2VCa0Y2OWJ5Q25qd1VBcER3ME5BR0FwcnZUY0pNTlIxL1VGTGxCMXRIWFJUVnVBUDQvZFFiZFBBelkyU25LbUFvTnN0ZWdIQm5yMTBnV1E3SXpLeW5kVURmamdUMVJMN0J5MDdXRVRHUk56a3R1OURGbExPY3VocXl2bzF0azFjOHZpeUdqT1h1TDlvNDllais2SS9lNzl4VGduNy8rSzN3U2xDMk5FeU4wZjFLTDFobkVWMzBpcEIxRzdvcGk5UjNvNzdzVFI5TjZvNnRncWZ3S29NeG85T1Q0cGtSUmRKUloyM3FQYUdNdzNXZmNuRnh2Y05Dby9scmZhYnNIU3RKVnQ5cGl0Mk1hSGJmVGtDNS8rd2tEanJVVlBjMFR2bU1JU2RGMmV6Y0llWmttWFIrK1VidnNjOFNzemJxTjJPNndVeDV3Y0dyVXB0OE9CZXEwdXpvTm1iVEhBY2RNbDZqUFdNcnRzSTZwZDVPYUNKZzZIZXAzYTlHcFA5UnBwLzJPdStzWFd0RVFMNTNIN0dxZU5GMjJCajFpTkdXUDk5dHBab0RRUGQvWk5sY3k3OXVPWHhQczNMRjlXMDkzVjJmSDFpM3RiVEJiVzVxYk5qYzIxTmZWMWxSWFZWYTRuT1ZscFNYRlJZVUZEcnZOYWpHYmpBYTlUcXRScTVTSy9EeFpybFFpRmdrRi9Cd2VGd1BuRnNnUDltL0tVaHpsZkxFNnVMbWxVaFEvM2NNOEs0UE9ZWHJ2RHVaWmdoODdNNXk0cXRUR2VNMEdIdEpXN1V2aVVqWlN1RDZrVkRpRUZyWFJjTXJEY2Uyb2tuV0lLV3RuUk1GV3VNdmlFTXJndkVhWWFtdnJqVTZUMkpxZVFHU0dRQjJaZ1BsU2Jrb1FWcTk0bmVqQlZhdjhsd0x6ckdkc3NHellyU0lOS2NEUitDeGNDSnVTVGhsMXdUazFUVFhuZXhidmMwT29vWFpJdzlyM1FoV3dSWFBPdE1IZC9DWHBOZ1drQ3lKb3kvT1JrM0hRT3Ria3pNUng5L1ZheHRtUTkwMTEwNVFmSmpidFZtSVVLY3QrV3BCODl2U2kyalZOaGZTbnhlNVhKczVENGRNMW5weEtVdXBUREl5SHFiUmZ6Y3BtVFZMQnVOZU5YNkV0STNzNHJteHNDRjgwSU5jMm9ZZTlwc0tVWXc2TGUyVGVjMW15SitocHBhK3pnbFJ6MWpXWWdMdG9oQWtPdXJxbkI4cnYrWDEveERVZVN0U25mczF0dnlDb2tQQmJRaldha3hhZGpIOUdyZmNqZzdxUjZFL2VyUmFHYUl0L2JtVzBDblI5SXl5d2Fva2greStwM1c4SmptbW93NXk2YUx5YmRxdEtQTmV5ZitkNEdXeW5oQ2FEMS95WUNFVTRDVDkxUEJOQkc5OEd2dHlCSUJzbnh5di8xZnJVZlV2MlZhbVpYd3dsSDljaHh6MXRibHEvNDRJVjM0UEhsVG0vancwUXRyL2dUckJPTUtSdFZYOVdYbHhTampZRU82cFMzcEdwd2FFalY0RGUxeDBXTnBHMDJXUDFPQkhycEIxbHF3SnhWakNjK2tROVNXbGlkb0o2d2Y4MFYxelJ5eTlrSTgrSjRFZnV1Vjc3aUhRQnp4RXlLM1NTS0l6eEwyZnRGbFVKYzIzWmJnM0h5YjlyUjFkT0liU2RwSnhNMVMwWEY3R2VWeHJOUm1oZU5TdEx6K2xXR0xTOVh3V25YWGt1VnZGMGFncEhXam9heDVDV2dFVThDdXVhOTU3TWFpZkpKbDd5MUNYL1ZOYlRJbXBhZUMzRkF2anhzdDNLV3FKV2JXY3BCMnVPL2NndTFtOXptMVROQTg5N0VLV0xmbDNtODBLdDNZa2k1SUZhM3FVMExUTzVXanJSZGlNZElQS0pNN1QwdmhOaWZ2NVlKdlVEVTRVZ3JKSUxwZm1BbUNhVzJmRVNwTDBWYjk2bU8rMytBR25QT1E0ZEtUak1ZSWZHTG05cHUwVzBOcENrT2QvbmIxeUkxU1ZkcFFaeGEyTk1VbHFISUp0WWc0WGs1dHA0U0hkS1hnSXZsNWtzSjN3eDdMR2lrVnBuMG1KbndIWlpOV2pOcCtCYkZWU3lJREM2dDFSTTYraGxTTC9leUt4NFZEdmpveWlMZG1oc3BHa05zOWd0bEZkc1JBd1pEeThjaERsYzFRQlk1SUFoS1ROcFU2R296bElEUVRsbzEzL0h2V21mNWJoQ0dxWjFVNEFNWnZjRUpFaWQwaFViYjJBRmtNS0NrdzFqL3UybUx5U0xoTlhCUXRrejZaVDBuaXkveHVwY21UZGFYQWJMaG5McTBKb0hVWXV3aHU2andEOEFNY0lPTFpmRG00YzU3TFpwOWE0ZEVLaTAxNDdhR3JpbkptQ2h3M3hhYlFwOHVmdVZpUHZ1bW1DRlNWcFl1MVhRT2p1QUx1aUhPUEdoMFZJcUJGNWMrUEpEOTBYNGVnRGpCZEsra1RJRGV0UFlVVzUwa3lZa0pFR3d4OEpRMzEwNmJaWTFJQnNrekY3d0V1SHRYd2hLcVBTSklhWDg4RENXZHZVaDlrVXNCQUVRKzhqdEd0MVVONzQ3SVF5TWNvaDU2RUFoT0lVS0xUVzNHOTZPSE5nRURMS1ppblYvS2NsK0V4WEc2QTRXbUNWY0lGOGtpQ05OZFFOQVVZczdHRWFGL1RFNm5mZ2ptOGsyYjhudDcyVHlpR2h4ak5CaWZPbG91SExHc05uVlU0dm5Sc0lpS3h0TjlINEUxeHRrQ1NZY1FsbUhWUWNLbDlHcmVKejFzbXBjcFNBcWdzZVMwTVMvTXJJZ3UvdEN3cG1KeWJTcE55blY1TWRINVVadVMyRzVZOWVQSEhDZmZtaUJWWFJZd3NYNlNJcWF0ZGh0RDIxNTM4a3BRMGR0TUtNRFNvbjEwZGpNRzBCMXdGS1FDaGJsUW95V2hnNktJKzl4dndES1FDa0pUTnpVSWVKWjZmbHdlKy9lNWtwNWczVXJEVFltVUFPT08ySTdsRExGeFduMVNhUkdpVHZUYTI4Z3N2ZGd1TkFXRUZWUFdXRCtISFF3SUY3Q21WdVFINjlmMFI0YVZCNHhmL3M0RzF1R2FLT1pjWStiYWwxL3dTV3NnUUpmYURwMGpoUUVLUXJsU1hmYUtyeDBCNG1JWW9ra2FDYXp2MVJEUWhTTFVCVllLSFo4bnlVTFlwQUlyMm5tdG9hMlBTSkhPWVM5RCt1RU80U1JBM25BZUlKeEtVWDRRaW5qWXdCNDF6WGcxU256SmFLUW52Y0hUdHQyUzhxZ3huQ1plNFBtdUhLYzdSOTNSYSt6TGFwUmpqaS94dUNJMHFFbnpEaUhzdC85ZjljS2pDUUVvdTg1UU56MXl5N0ltOVJ3d1Y0ckkrM0lsdlMyeGN2TXpIMEh3S0wvd2IxRnNYS21yYlVOTVNrUDlhRzk5c1NydjNPeU9uOHVPdmRQOUNKQzVsa1dyZ3VrS0kwVVlnZFBkcEdVNjZjNlBoSS9aOXlYS1J4T0xzbEhtOWFPYzhvZXFvZjZaNDN6dkZIakNOSzZhZk05RDFyWFZOK2F2TVYzUWQxdDE4MGtwZnpNc3Ara04wRHI4WVNkblRmRFEzdVlvQjB6RTlpekpDVTdqR2c2NG5MV0ZOSTltYmtIcEE1SS90QjZucCs3a1U2VG5HWlExbUFiZjJrZ3FXdXdocjh5OHpwR1NoODRld2ZnTTh4NXpVdVpNcDA5VlpVdVhRZFVoTWh0T0owOFMyc0RIeGxaeXowaytUR2tUZXViYXRxd21YN3pPZXNvQ0hsNXk1V0h2QlcrVjZTVmgyaXl2d1NleW4xQU5pTTJjM1NvbDFXeWdnMmI5T2lYb3hmSXhKZy9oR0JtS2ZrZnVMb0dpRkNEcVNxbmFHeDVWaTlOMGxnQ3hHOERkUDZVeVZjMnZXVkg3eGJCNGRYVXNsaVNuUEtJekNDTFhsRlZvaTFxd1lHU0Q1TXVPb0lQdGF5ZGNxQ1FrK1NGRGl3SlRZV2NKSHZ5WTMxYnNiaU9rZ0Nld3JLNkxGSlBNYmtZK0x0cGVZWjhSS3VmQ3FYaS9Celd1cFdNRytyYktYcXQwOFFrbXpYZHAyMTc1YXB0UXI1Y3JwTjEyS1lERE9IVXArU2dvanQwNE5BVjM1V0xTbkZ5bHBhc1ByVEp0MjF5a3RFdEtMZmp2UmU1Vk5KZGt3c2o1L0N4V01sSzFwN1o3QTQ4RTVtTGV6dlpQUnVGR296QUJSbWd1NTg2MGJQUW54bXN3NXkxd0VkdWRhLzRGM1ZZSFJkSWxpZ1Z0L0dsTVgzSjdrOTBDN00rTE9iNVlneE5aQzFvdlV1aTZDa3cwNEFuSlhLUU5tY0dOZm9ZZ2c5YUNrSjVTanlVWE9MSUVSdXpPRlBkaUlQUkxUUzFuV2dJR2JvVG03bGVHbE9lWkJsRmJNUC94d0dGYmgwWitrQzVxRmJsOU4vM2tWSnRaa3hLNDdtSjNKVEZOdzhtdWFGK0xUbXBmL2p5cktDaE9ibjZUcUVCMVVCQ1NOZDdtQTV3VFMxNE5lWTI1ZnNTM0dVZEhXQlpkSU1vSm5kamdvVlUwTHZ3VVpqbDc5RlBZTWtqMUZyUEJRVzNsMnVOc0ZEQUNld3NvcmhSOVRuWTg4elIxL0dBcVdqaTBBQjI1WEN5S3ptMG9mVTYyVE5CeDJLampETU4wQldETmUwMStIc0N0M2xxOUJ5NEpMYnlMallLMkhHS1pBUFNEZ1lHcTBCYUNsdHpoMXJSRThLK1ZGUStHQWNzb1JwMGlHV3lQcEJzblhjWU9aYXpYck15V3VWbU9NbXhiRTBuSC9WT0Y4MGpsRUtGanNCMDQ0R0hLZkZwYXRMZ1ZxUkFhaWNHWlRDOUMzTldjY3F6RGdvQUU5Z0hVdkZ3aThxRzNERnY2NGRXMm40NE0xUXdnUnc1N0gyOFRNM1pBNEFxUnRnODhJOFZNdE1vQkFQaFVtSE9ucjlDSURkaTd5L09YVDl3L1ZKQTlzODdVVXdqeVRWYzBWanNjS1J2UURVWVVJMGtTRjBqdHpVUEwyUHpWYmpOazZIREJaVm5GVDE5bVdJSXpOQktMSFRwVjlGQXIwcEV3VnhZQlJoZ0ZQSGl4R29yTzZLMnNEeWUxdUM4QW1ndmFEVmppNEpLVlNNTWtiTUhqMzRwcXpXRlRFbWZGWDdObExCRHBuZGNWRjhHT0o5bWFoWmpyWTk2L1lhckx0Ymdyd2tMbWxnMCsxUmk0QTRFTWs4SmRURGhvcjN3c1gwbUlRZGkwVFFjY21RdkFRb2N4ZjFROWVmTU5qZzA0WVNqZnlqMHkyQjZrN2V2eFJsdUZTNmprYXEveUFtbUcvai9hSVJoSmh1MEd0cHF4cXZ5VGFCMjJyblZWRWFPQjREUDFkYlFzUENpdzZJaWE5Y1hVZ21ZUkZVbmtzTGVJdWFMV0VtL0RYQTBqa0hER292b1hmY25sVjVBMTZkSTJITXZyVEZNcGEyV0RCQ0tGOStDMUVQUWs3MHAzMFIxSWlVQWg3MTNvaU84U3gxaWZ3RVhhbmRKSWQxb1VlV1NlU0JEYm5hK2J2cE1Ga3g2QUtQUnAzQXpCM2lqY21reU1aZDJDSG5lY040QjA2bnpyR0wza1lVQVNRbTVnSXZXbmNtUjlEQmZhY3dVU3ZieHFsMzQ0ZEZlZC9HcG0zVWtKR1lZaEVwUUlRMzl6Y3lNMXVyQkQvRURzTUF6QXF5cEJjOVg2VkR2VllGSHpYZ01ibzd6RElQa1htbmFZV0NtUkJLVnVrZUJyRlNwaDZkR1R5SmtxYlhlbTZobVRvM1U5V1crN2ZHMURwcGJ0VTR1N2pUOUNPTnUybFo3dUIyOU9lYUpCTXEzS2pBc2pTWEpoOGxjbmNQNGZiNGpvVGRTMXdjME1RN0x5c1FsNStkNHdQeE9Db1F0cjhETVY3eDZwMCt5UFp3WnZOZHRPVHlTOVBSRW52ZXNCNWNhZzV4cVJaSjN6aVRQWXZFTUVMaDVPZ1dXdHdsQzVmTWkyUTZhRE1vdFpOTzduWjlwOVlEZkRMdStMWTBLQjNMU0JKc1RlUFhLYzBEaVNGb0Z1eGRwL2FDOTRhMUxuazB3Q3ZESzYwaysrbW9OeEpkTTQ2MjNycjhZTENjWE1iSWtQSGI1NDFhd3l5K1FTakRKakgyRU9wa2xXWjhDSFNWK1hES0xtYTN1dzlyckJzTG1ibnpha3lrS1djZkphNldGMmNMRHpmRFVwZkVDU0ZTTXJUS1h2OXF3T1VxUXFVa284QlRCY3RUbmZoa25XMVljejQ4TDRuV0ozZDdqcStrK3FKQkxpd0o3YzUyc0s5TTNmYlpQdE5yRHJiYVZ6R0I2d3BtU0xSay9RSkxWMzZDTWFNUk52Ly81SnkvVSt0QVhzS0c2MVdrZHhpU0dOcVI1TjhJOVk2bmxQMERwRU1YQ3FjRkgyVlhEdFRiQmppRzdJeGhvZzlZTk9vOXRmK3BoTzN4b2ZUQjBVVE10UExFMlgzK1U5c2NVdnl3MlRjNWs1N0dWTytEamtITS9ERFlBenB4TDlhNy8rZkxWMStXSEIyN0dteE5xLytGaUpwUDB0cDFTWnkvdlZQUkY1YkcrUTFONUozSDVTSSs3U3dsZ3hkZElvNzhHRlA2anhOY2ZTUnNBOU5KRDVZYjBsVlpUQ2VXdXVoVVloOFpEYW04ZkVValhnbC8zYkpZaVFQczZWdXBIWlZyb0xPY21aYURDVGczOFl5VG1lUGZ5c3RGUFN1T2tSeERISnpxZmM3eCtONFNOenZtejBYdmpkdjduazAyV1E5MmZsd09Gb1ZOUnB6ZmxEUitQMkFrNS8zTmYwNzhucWpCZnlKKzFYcGp1V1JWMmdmeDYvbDBmKzIzdWkrYjVrOTN2Q1Z6dTZlVjRrMXpTa0xRajZtSnhUL1BCcHF3cXFsa25ia25hQ1pzMVd0STZLNW5HZkt2dU9QK3l4UHgyMjFiVHpabjJyek43OTVSNWd5WjV0ZWg2MDBTVnVYcXp5aklhT2doeExwQy9EZFRTVGlmcjQ1V0JmNlZoVWdnaUNZUCticFdMUDJtM2NnOTIxRi9LcnFxOFFkRlN5NzRSb3daUkhDdzdCSGMxTmdISHo4M3N5azBvYVVnWVVsWXJUbTV6M1VtRWdRTCt6WnNUM1g1dGxVWDRid3BTbS9YZkQ1ZXpkM2lXZUtvUnozMC9GVTVIRFVTRkkrZFhkeGhLWks3VzRLUzNrQTU4MFJabzRCUkVOaUxWbnB0d2tsYlVOMW9uRHlpTXZHS01rRjhCVEI3K3huL04rTm5HVVdDRmdWK0pKZjJhV1d3VzdnNVExbnZsa25rQ1BZTWdTV1pZS2EzUUlaNktwY2IrQTZtNUpuZk9UelJTUDdKY0hlbS9MSzZ5NzBPemtibzFaU0dTeVhQS1JIMXhwOVJaR0lVSW55amFRbUpILzhsQkhjU0NJWkNPTzBiWDIyT0RVbzk5eTkvVTc3eDI1VlMzV2pLeXYrQ1h4TVB4dm03TUxTdzJxVWZpTE1RdlZMZ0x1RTkyRVd0R3FVd1poZUtrSlpkejhwcWdhUC9uUmlMLzh3eXMrVFpibWNSS3hZbGxjU25wNm5oMnJzb0sxcnlpR1AyLy9mWGZBb1psUjlPRVZ3S2VueUtCSjFlQ0hQb1RoMndSZFM4NE5VVHM1KzJyb0ljK09HYWhvelZWVXQzYUFDa0JZcG5GanEycDRzSCsyVW0wcis1UVp6T3hiN0N5Q1pybFMwMVFNWGkxaWJzM2FVeVBpYjFEMitOVkxGN2RXd3BVV3g0UzBUeHp1eVJyeENaTDhDM1VKYkxMYTNKdlFldktWMjZFSjZUMVJtSFpqYTU2MG52R2hlSHV0d1QxVzk4cUtsd2NyQ0k4MWMwUGRGOFhtSCtueVdoWldseGRTRjlPU3JqNmMzcVNNajNMZ1cwSjZzelE4UTFnMXF2Z0FzRlg0Sk0rWkoycU5qRkhOaUxWbko4cUo3MTA3dDNZbjI5aUczRFovRm1nNTN4SUwxakV5K004SUVpVEdWYXlHNyt6MU5rcUprVkNUY3ZERjBXNC9BcXhVb0VaNjRDVTdvdGtSLzh0d08waktjaHlLQjBMMjUyVHdFYXpZODB5V2lHM3hySHZ1cXpMTW9kWDBLd3ZEM2VTbVZReGtSSitoWWtmWWtVWDVhYzVSZTNWTTA5VnNINkl1VVdjTVdwRisxWmZiZFVSZXdjdEE0dlA1cFRWeUc2SDFYcEVvTDdoZlhHTWdvS1dsRWo3eCttZkloaFY0dC9FMXFlVTN3amNab1czSXR6elZTTGJ0KzdueWNJWVU1T1RxQmdGc1kxeFNaNWlqeUkzQndiNEJKWVhhejN1RHVYaE90K2tWVXhPekhMRFU5YitUdUpSTXNTUzNKeDRQaW1EejFNdWtiZEZkMFJodnhMOC9OZXNRb01sUlNMWCtydENteWQzYU8yeTBrQjB3TnJNSWR5ZEE5RUhpSWdEZU53ZC9FZFJUcWhxQU5paEZ6cXhURXViSkd2RWlnYnBEelZrRXB1bHE5Z25wSE9jNVBaQ3hTaldQMkdWOExTMDVVbW5pVVIvRGNoenlaODBSWUU0RnFoVW5GL20zNEZnQW9UeThZV05UMGMxejZ0M2xYeDJZOUpUdk1zVE5RZER6YzFzZk41cmVkUTBZdnJzNGo0ZnhTazN5cWVYSG0wdHl2WG9UREFhYUYwcU5ybk1rVlc2UWVuWmxhUTNrN3J5V1pRU1I1YkVEZUdYbWgwVVh4QzQ5YzJYYkRDQ2tBMGpjcGMzY2poT2FHS3orTnVSZzFTd1IySWc2RitPeWVTQVg2OWR2VEFabVNFTHJndnJNaDg3TGtLQzB2UUo3VXZmemJ1U2xQTE81Q0tiY0N0VUVKendPcUNldEN2UysxcTV0cVFLU0dWMHJjYy83ZEZkQVZBL0dRU2JzL0grbTRidklnbFNsTlNGcndqblpGN2gvaWlOSWN5SzZpanNtUldIZmE2MkxlL3EvdWJQTTBZV0F0Ym0zOEJxMGo5TFgwNmVoV1l6VC9kZU84NUxad1RXOHgweEdka3dKVTFnekxXVXcxTitUUjFscklGQzdmNDRsSWNmVzJ4bkc5cnpydTlyL2poajRFWnY5MFJmOXordnp4b3JNbWxGV1ZLajNGSWVBelQydy9MWnJWdHpCMkFnemZHOGczVGJ5eHdSaUo3SU1hNk9ISXdFZ1ZJbmRTZTNRQlFMQ1RHMXhMRkNidHRNQnl2K2U1OUlmdzMwTk5iTVNvSGo0dWFtL0l2N04zK2VNU0o1YlM5dHlxQTcwaFNtZkVzWjlQYkprZWt0NG9vSndJRHJVbVRmZmdQMm1MOHlPazNXblFUclQ5S25UL2dkUG44dnBrRHpZOGwvVGI5RnRjVE8rWVdjSlB0TWowMmp4NmJEcG5NNFQyTS9UOS8wY1B0RDFMWWwzQkxpTVdUcWJxd2d6dHRBZTBpMmlsckN0VWtVVFpiOXVIVDdFTzJYTnN0cGhGTWg0eG5sUnVNNWhpcTU3SEdONEUvbGhlNGIrb0pkK29iaS9WZnpHNzJCVmI2OWFrNlhyRnc2czZmaFZhYjFyZ0k2UG5jNHNpV3k2U2FJZkR1b2F0SXVhUFRNdTlBNldFc0FxNUpHNHNKQkFGZkhwbUhUYXEyMnlBUFdDM1ZrMVFEcFdpQjc3OUZDREpRRnlpbnlMa0puL09yOVNRVC9BcUZXQjN6aSsxVmhBSm5FaVdUaXN4bWJuZ2ZHNzZ6TE9uUUNGeDZUZTAvVklFRWY4VktNVDkyL1ZoQ1JldkNVN3VTVEZmaUlnMUUzSGcvdkQvV3FvK1FnRitMMTJpTVp4WVAxNFJxWEMwVXRkVTlVUWJLbFRMNTBETXVCOXcvVElJNkYwQVdvMUJOVUMvZlR1aXBGZTE5RHJkUlR1cFAyQXdDMitXRFVqU2ZEK3lOMngvM0c2eWlzMlpVQ3U1TlQreDZNMVBHL0VucUcyc3Z6aFc2VTE1emNzaGhHUnFTVWVJdkZiM2VyckVBY0N4RjhTd3BQb0srOXN0RGprSWFiS0RreGdJMXV3VllGSk5STTU5VWZqVzJNU0hnZE1BemRXSmpjVjhWVmFnWXhPcFQwRHpQbUUwcjltVmVkOWYvUGRTYUNxbitadi9adk9WVDZhZER4dGI3YWYwK0VJanlEdXVxbzU2R3ZNQzlrWTgzTDQwYytOZ3orOSthR3Z6ZWpYZ2xlMU16dDYxektLWFNuVy9BS09hZUJ0aVBpWW5HUDg2QXIyVTVWNmpndGxKM1FXYU9GM21sbklsdmNSbldwaFZOTnhUa3pZeTBmc2llK3lsUC9aNnVqMU82alJENGpsdVgxOTJTWllZeGtaRjZTcmtrUzZRTnB2ZVJ3UEQ5V0gvdUwrUE9heFQzYkxQakMzYkZuWVdkQ0JjQW90Ny8zQkc4UEdkQnZHcExhSnVGTnNnVEdrZUlxVzRlYWNiaTZqZlBuOEwwUDZoci94SXVvbVNxQ0s3UTVNeWN4TjUxcVNwWkl4L3Y5aTBqc0NQdENYQ0preDR0aTUvM1JDdHBqMjdtcHprWEI1b1o1cnFQTG5KOVpVcGJPQVFOekFvdUxyY2FDUXkvc2g1NmtTT0l3YkNKaHB3NG1IUGNIc0xEUWtmN3FmbXB1MUN5SndraWdwOXJUSktYd0tVakJtWXpTZ1dvRHU3a3l0eStSSFdKRjZQQzdFZGc5V1p3MkRCdkpmeTVDM2FkVkZKNUl0WGU2ak5uTmxiTHhOQm5zRHhYNk9nci9UVzVxQmJRRSs4Y1grZGpUK0hBZnlMYnIxZHE3cmRYRWQvSjMxcFZPSkN1NHhSU1JmQndJamdQZGI3bzhTSFlHdjVQNVEzYm8vakQxcGJVOUpaRzNhNkxXc3A0NTVvZTdMd3RzdjhmTHlKbDVKQmVpM1lmMUxvWE5qU09UeGVnTUxzNFczTXhYQzYzSUtnaWU1VjFOK3BIR0RrblIwdGtHVW1OSVA5ZkVzekNpMjc3Ny9UdGxRUHJ4SisrLzhJK0FIYk05UnRvZTc0VVdtcy8yZDh6bGxCT1kzcDN4UDBibmh5WnpkK3JqbVhJczJkRVYzLzcrN1VkNzEwbUQ2YTFoLzNDUDA2WjNrTzMvRUR1Z0R1Tk1iOHM1VHZ3Z3BISVIvL0J2RnZJU3ZaeFhBK1ZrSnFlbzB0Um5DVTliRkpVaDNWUXlpNlprSGNQblJ2UGV0NkJYeWMzVkY1S0tHdXd5ZG1rTmt3OEJ5a05LU2sydTJ1Ty82ZUVndFAvdlJwTFQrNkszK21OS0VFRytUalVJcUFaQ1lvRUlmK2ZVaGNadEo1bnhMV0ZjNnFENWNVZlBIZWFPb29zeFUvNEpLVVRmVzdXZnIyMlNXdzNDUzhSZVpBRjdUdDI3UlJSTTlMOXQzTDloenMrclJZemZUSUNIRjdJWkF4YWpScGE5d2p2b3lBM1A2QjQrQzhJNk4yYVh3aUxVLzNXSG9wODFhR2FKL210R29tbEphMW1DSG54VitNVWcrRWFMNVhhakJyOWdQckduNXhQbEZGQXpDOWVjZVFoNzc1OXJ1VEV6aW1QYkI3OHlId0tiVmdlV1JuWnJQUnVWdk5hb3ZsUjJiS21RcVFJS2ZFb1lYRDJtQkZ4TXlJeTFDUmlOS0FweXpEVEsrQ09DdlEyNHk2SGRUT1diMjhUWm8xWTArQUp6bHcvK1I4TDZSVWZCd2k0cWV2c2p1N0pJd3lHYUJ6Nmxtc3dDWkxwdWk0UjF4djBGVkw5TCs1bVlFZDA5TE91VEZJNVZ4NzhRMFIzZWFzNnhJOW9oQXdNemsyZy8vVmhuOHlTMkwxVlhuUXJGdVpJcE9nSlJMckd5OVkvN0Y1Q0hRQnlqcUtBdFJaS3Fpdm8zTG0vU0I4c29LZGlhRXFNOE9HWWVsWG5EdUFYQVBRWGF4bmgrZFhNRHBKanBHU3VaVWhpNTNSOEd2Y2o1RG94N0h6SitSaUdhTUtCOVZRdXFNVE5sYmRDNmVLVVl4S3JkSzVYMktxMk95OS9XN1g1QzVrSmZiVWFpNzJSSEpTUGt3SHNYZGtUU3NrWFFueUFUcDVTOGNWMjRqMk9wMjBXMExEWVUrS1hyQm5OeU8zVkZ0cXN2YXlhZW9JNWZLVWRqNWh1eDhHOXlMbFRGTVZuSitXODVuUEV3OHE4WldHTGlWK3l1MjFJOFZmSk03MGw5czRsei9pUkVIdkRTaFJOZk82RlJFRUVuek9mLzVJWllNY3VGenlzSzBkYmdIdGpEZ2tBOG9sd1VRMHpSdy91bEgvSlJ4d2lsRlpmVnJzVkR0YVRucHJOald4ZDVVTWJQUVRmZisreUJQOVQva1dXSkhJSjMveWJVb2ovUzBURExMTzJhTHpVczlsWGhucXJtdTdvWEJNYmZjVG0wTkMzMll0NVJrZXdTVU1UcHFRNU1DeVQvQmVFWWtGc2hlTEh2QjM5LzJSZ0NtL3h0RVp2RXYxYjZEamNObzh1MkMwYzZ0YWZ4dG1mKzgwYVNkbjhtZ3k5UGJjZXhyL0E1RHV5OWRrTXF0STBxUmhHNENVbGNKdEl2K21tR1VJZUdkbDlCTStVMTBuZXRHaVVHM0o0NWNIMTl5ckYxRUFPcTBxZkwyRnh3c2VIa0lTc1o5TXoyVStZNUwweFU0Ti9UWGhzY2UxdlcvT3RubVY0WUw3S0hDRjI0QjRWK1htd1NWaUdPZTNLYkQvWGpaZ2ROblBhS1czeEhNM2JRNGl1M0dIaVhjTDN3QXVhY3BuZXJ5RXg2UHpQOGhzTjJFOHh4TFNFOHdvRHVZVlBmSlZaLzBVS2tNRUo3NEZLeEg3dDJqd2NkZDJteGdKM3UxeTJVMGFHTnRTNlJBenc4c200MlRqTkx0QzV1TDkwbzYrMGdna0F4WkR2amh3aFo0NXVyYTN2SzBvcFEvVjh4MWZRTzhwaWZFY0dnZzJ2aUwvUWEvRVRYY1RtTEVsS051ZWpiVVFDR3VxNkZDRVpGc1FLN3dyZURKZDNOZmoxWEZrbmFhSVBVQnpjZTZxd1ppYjBxYWY5RmZiNnBjYXEvVTR6WnIra1psUmMyVEc3ckVlTjNhOXVISmNyRGhEUUd5Z0sySW9ocHNjUTBGc29XWUVlUUVxS0o4NnZIejJ0WncrS05jVkJRUUlMTjBEQnk5UzVaV0NFNHZMVDZ3Rk4xSUFoRWFiL2tqYkFFTjdqUi8xWlBjcnUwVnFxTVBkeGpqRXR3dzZac2hBKytTdkxhMEg5dGcwODlMNDdBeHdITVF6N0I4WTFhakl3Vml6SUdVdFlDRTcxaW5wNy9wdmdGL3dGNThPM3o4NE1GRHhlRzZuQ1BTcXJ0ZG0zSE1mbFhwUER3L2FDdzE3czJmaFc4TTBLSVFVVFZsWE9sQ1R4U1JVUDJIa2ViZkhuWHhJclUrbnVLTWpGTkcrVksxVWhMZW9Yb1NtZldzRUl1TVFTRHVsKzFIa0lMa0Y2cHJ0aDZTSFpSaHltaW9QVUl6RFFNek1nWEZ4TzVzdDU4K2ZraEozbEZmYU5sY3E5Q3gzZkVDZmh1djNlNDV3SHNSdlNaN1E5V0ZWNFBjRnhDcWdodmkzTDZ1K0p6QmFaTWtqU1phU1huTGUyRTZsZ1FpSHhjSlR4MVVWQzhLdUFHeHdNZ2cyRXBUUzFTUkdhazdlbjFRc3c2U3hNbjZJUEZKQmlEK1drc3N5SkIyYWVjeDZaa0dORFVTSzZmUXFadmFFQVZEYzE0b1JFVk5LR1RhSTAyYUljWkVMZWdST3NMaU9uRlRVK2xmYlJKdSttUUdXVFRUZUh3blBuNW5neVpadnFCNlNTYlBzSXB3OGZmdEl1TytqcXV5Wjk2RVZiSWw0RndUNmxqd2tzcHg5Rm5QWnRLYUR0d2N2NW56U29jK0EvczdCRzFqYjJWdEdTZE1tYlZGTmZLMVU3MjVTcDZmbW5iUDhGOCtpOUE5U1VLaitUdWlueHA2V0huOW1xRXJlK2pITytLM3hLL05CWnlJQTc3YW83cmg3eWZsNWsvQTFCbkNUeHJkSzN0aFMwdmNCbC9BcWFmNjNrcDBOMEplY2gwVi9VV3FDYkkrYzN5M0graCtML2pWcEk2QWQ2UHRXN21qSGRyd0c4ZGQ3VlF5YjVVUTR0cHVVNCtIMk5sYk5DUDRsYitGQnBBN29ZNWRlMElTaEd2dFAxYXR1aGZyZXJwc1Jocmo5OTlDNFhzdHVtQjdtbldSQXFOOVJ5WTVFc3pLR2VKYkhyOC83dlVSK1pEY2gxMEoxRFUwc3p5ZjhKcTlCdmxQYVJkQnBBYmVXWTU0TTZoTVlNeklDVnF1eXpLSDQ3eFlLMHFMRWNYSVpIdE8zRzBmVFRzN0Q1bkplOVZ4cUJ6VHpwUlBZMFA4dWlvSHZBZ0ltR0owakZicTZQQkRPN2xRVEJPOUV2TzhCOU1xTzZBTjdlVDdGdmFId0NSKzFuUFl4a2pZZnE4TXdwbGZuTzdpUjlZN1VDNldwSHpKbHM3VHUvNE1wMzdHT2tZRFFaK3F2d2NSNno2em9sN0h4VERSMTJPamZkUW5WOGhkYS9HVlF0dHdBSWkvK2pMeC9WV1pnbVErMlJkZHpLRnlGUXByVkdSWkZVQTA4Vmt4UWNxTlFkU29nczhwWVdUMmNLT1JEWktkTEMxZTJyR1c1SXFBN0JOSEYxbFRrdTVjMFh1Tmh2T3c4akZjRkdzK0l1Z2paMFBjSFdSbDgzaXRCRk5OTnhTMThaYnJTM01zanczUmhKU3JrWnlOaWRvbERwSkxBdVd6U0pYN0N3WlorbzhlQkR5NDdGTllCWXFkVmx5YnBPa2pTM2RER0RvMjRZeTViWEpFclc1OFNFcHRvZWhsL1k5QkdvaEs1SDY5WURLaWRIbEhIbzMyZkZxSGk1aHhzSzZYUGY4TFQrN0ROKzd2Z0xocS8yZ3gvdk5ZamRhUjdrSUowV1JXY0M0ZUtUNUNEcVFHQmFKbU1nK1BZeDBGNGt4YUNmUEM1dHBHR0p5RHNBd2d2TUFWK202MW1pN2JCb3hLK1ErRXBjYjh2VXFaQzhsT3VBMmxpUDRISnRFSUhLUXBraTZ5dHllMlZrd09tNFBOb1BYY3hoMGNKZDZxVlVQWWNJSlZTMTZEbWF2UW9CdFBWNjh3Z3JkOHNJMmZuQjg0emk1Z2NlMTlwM05nWnJKaTBmYXRxUEIxRVZhTVErUlYrQW9HbVkxYmt1OThKTERyOWFGNEJ4dGpUYWtUQ1pRc2lEYUtGMUFzME5nNlEyRjFKNXpvNlFpOEJKSklwRGVqRXdoRlhpNlUzejRGcDB6RmxCRUZKSVA1Zy9qVUhtaWlzbks5Y2RGYzBsSU12UlBGSWlBSzR5cXRMVlJ4VWphOGpIWVVvdzJNU2d0UTBuSFZVdVZJZ3ljTXQvbHpoMjd0a1ZXT1drc1VMYU16TkFtODRrakdDdTZRbmM3Vmp4WVhZY0VPMUpndlcwV1ZMY2pMWFR2M0c4WmcxYWNROTl3dnFXZE1CNFUrUUZ3MkN5WHkra1VQYVd5UlZhdnp4L2lOdUM1aTdZUzZCOU54UDJkODdRTEdjcFlWQzBUWFAzYWUyRGpjMXhWYno4S0FPZHRLNnh5Y0g0ZTNLR05uQlBQcC9pNC84dVdjOWFqYUI1TWdIQjVjbldnbGo0b3ZPa2FzQlJTbk4wbVJYdVY3SUZCN2x4U25vVDRtaE05blZvYnBPS1NXSlp4aWN4ZlhQT3d1OENvcHc2bFQ4ODJCK1hDMWtMUzU1b2p2NlZ4UWlNU3YvemcvTFZ5RHB5cXdOQzNzekNtd0N3ai9FeDNUcXpkYTdYUEtCeUhRVDVDRStIcE5JeGEvTEhta1BYQStmSGlPU3JveDJNWHdEcHFzUXlWaWtWM0gyQVFPRm5NYTJ1Rk1sWk1vQm9hSStZU1hZaFdjS2E1SjhxZnJDaUI3R3hlVmVpeThCMUl1dXJ0d1kwNFZxaXVWRGZHYUQyWlZPMUN5czduY29aaFFKbk04TTVlTjNLejNTY0JlbWF0RlFVYWdUYkpYTHRKYTFSWXl1WGNhNitsODU5bm5DMDNObFoyRnY0bTRnREg3WlVzRndzOEtSVjNLVUhRNHBMaVZ3cEVKVXBQcE5pMG5sWW42b3NqOFZXYmVxUnY4ZkIzK1lZOXFDQU9wTkpUUEpsb3p3SGVydUdoYWZNa3BWSW1hbzFQdTEyR282T2YyMFB4bC9ackYzdDFFU3pKZzNINGh1YjZRa3B3SUU1dWxHdGlVcXV6dnRjaEpLaTdhWG5xRTRGNC9ZTGtVVGl5c2wxWVkrU2VVb29ndzhYdGJDZWlwVzJmeDg1QzAvdzV4RGZOMUw5ajJSVWQrQnh1Z20xbjVOTXl0NEduZERoRW9BWHB6RCtackZiMWJZS3o2MmNiaHg4K2FDejhjOVdGY1NhY3NHZjBsVyszN3kxMHRRQjN2UHpnajE3NUFiLy9RbWI0MHIrNnRIeEpIVCtxZDkvL1QxNy94bWl5UC9aaG8yQ0wveGtJZk9peVpZZTkrODIyYjd6dzVjUHhiSmJkSEY3VkUva1RQVjlxaWhKOTdFTHZJK0w3c2VQNkFzbHFSU2VmM2Noa3dDYkxpYXpXUUo5bzJOeWszVDdpZG1yN3VobjZBWTYvWXdaMFhxalRVSCtycm0zM2hlTFZ1NUpWZXhKWDFYRzFBMzNDMTlRMm16OG00b1c3eHdnT3pSNEw4YzlPWUxBRVhkaVJaYytKYXJWUnJWdnhmWEFKN3NPNkJpK1FqVzlWbW1Uai9MazZzZ2c3RTBad2M3SEJ5cHUzeXg5azRCRzZ5SkNHSlhndGpvKzgyNjB1blFEMWlVVXlacThncmxuOVdzUUpHSWJWRVVkV1RpdlB0am5iQzBGNUZFM1RPbDJIQ2hvREg0OStBRHJmMStJa0l1YkhxQkFINGtLY2lCQlJGV2NFSUxieW4wbzhSVWYwVGlYTHFHVFk2V2U1Rm0xUkZNdkE1K240UkswSk9WaEFSdlRpc1loSE02NC8xaUlQVVN1c1FJdEp1aVN5cVcwZWVrRVZHbGZMaUE3RmtUM1VsUTZpUU91V1pDWHptREMrS1lJR2V4V0E2b3VYOUpZL2ExU0lPcDVnTkpIdEFoQkRweDNjU1hFTmIweUtNcXludlExd0RxSFR6RG1NWHRmUEVYakk4M01rYm1qZ2N4UUdXK281R3E3bG4xM0hYVzN6ZlJDUTBMdm5FQ0w2UWtrOS9hVWFoUFFQOTJ3TWtIN0Q0bEtoVVpWaWhZclVRS0NoakJGQ3ZtSTVJcW1LWGpraHltTUJWVjJqWEZVN1ZJbHViT3lJb2JaWFJacXBvbW1NS0t1cVFveFNrVmxjcUpqSS9OTldKTGFxeTFIV0sxZVpMdU5ROEZCT3I2cldmWmUyWDcwY0NXc21ZbkxGbFYxUi9MdXlTUHNYczRsSFFobjYwL0JJRlU5d1JPU1NKK1pFWHRyeDBtb1ZTbzVzaXEydlJxaXZYRkdHSkJaVnJlQlJtSW9RREVsZWxmVUlWUlg2NnFXNFJGUTQ4TGlVQ3JWOVRZb2JDVk9YejZYNnREdFEvYzVmMng0MFgrNmtyMjJYcHQ2YjBreHl5UENKcWdvK1hrM0R4NnAxK05WcW1aR3l6N3BjY3VCREYxa1hDL0RiZ1EvY1Y5Si9wY0Q3cmlwNDc3Vk96eFg1OHV5K0N1RmQ1enFkbXk4ZFd4Qjg2N0hPbG0yYTltMmR0bTJaMW4yZGxuMmE1bDFBMDdyTTVuV2R4bVdkaG9WRC9XeWticDZtZGw2blpveUVWNDhUVkkzclZJSmRNUVd1eWRQR09XVlRQcXhUMXUrd1MvdWdwRXQyY1JjVWRkNmF3azVBUVF1Qm81WGIyTnNxYkcwczNGcHJnYVdHd054QVlHb2l0ckVLREZWdjY4dEFsNEd0elFKTmdWbnFvaDFWdmtCNXJ1ZUZLR0xSem8rRHZOaVpKWStOeUpJZ04rV0JOTjFRSTBtb2NIRWtCYUlBdHRBSEFnTUIzOFNDSE9mSjRybDF1UFpLT0M4SG5wVWhKVE5EU1VweTZwUklOMEtueENEMXJmdmJWMVpEVTBLRFJDUDFWVFFWVGtGR3dNbEVLU1FpQWs1RXJrUEFUNFBIWmNCeEpFU1VQa0lFd2pId2RlS2lCTVNpRXVGb0ZCcU9pbG9uaG9xRTYwUnFGT2VQbnFRb1J5S3pITi9KWDBJbGVqcHVUMmZSTEdwM0pOUWRVbExJb2lIUHlyOGlHbFVudmlOaTd0Qm9MUlQxSWlwMDhiMytOUmwrcnphYzhmUXY0U0I4UjBEY3dZS0Npd2FmNWIrNmFFSlU3Sjl1MDJkMHRiM1lEaHRUVFlZSTUxK0JubTdiS1pqeTR4cWFiaktXMUZjdUVWMHV2cjkwQ1NQRkVGY1h1VjhGUmpVK01lZGpreTFGWS9HSnVsRlphei9wVWJCaUZkK0l2RG9iK0NFZ1J1Y2t4N0ZyVmNRcXZ3Z2syVVhPWiszQktWbVNtMzRaQUE9PSkgZm9ybWF0KCd3b2ZmMicpO1xcbiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2O1xcbn1cXG4vKiBvcGVuLXNhbnMtZ3JlZWstZXh0LTcwMC1pdGFsaWMqL1xcbkBmb250LWZhY2Uge1xcbiAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgZm9udC1kaXNwbGF5OiBzd2FwO1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIHNyYzogdXJsKGRhdGE6Zm9udC93b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBQThNQUJJQUFBQUFHN2dBQUE2cUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR2pJYmdTNGNQQVpnUDFOVVFWUldBRHdJZ2pnSm54UVJFQXFDUklKS0N3b0FBVFlDSkFNUUJDQUZoUVlISUF5R0ZodDVHak9qOXBDemtnL3dYeVp3WXdqVVIzb2owRWFJRUtyMm9XRkg5UVVPQnVjdUgra0lVS25CRlJ5MFZoWDE1S1hsQ1kzejQxRDBuRzdEenI4UlRxZUVFWkxNK3IwNjlOL3BKR01TRjNCU25pc1ZnUFRxSW9FTDVPTFl1VE5QRThMWVpmWlBkTnEvQ1Fwb05xM2piaWx2VXBtNSs1RHpSUTBQd1AzeS9RbzhTL0FBVER1QnFrV2FUYkFCTjV6cGZaOSticFBzK2QvZTNLcG9HdXFkU09xMFFJMHdCdHhrcVE5T0UrMS8xdEs2VFRoZUlDMTgxVi9XVEJnRzBEQVVXMm83aVhwNllQRk1jRXJxcC9aMGYxcHM3dzFycE9vK25aL3RyR1NmZlVROVlsRlNkMlhsbWRYSzNoM0xKKytSMXY1OGhQK3pkS2hEU3JpaWlsNVBSTldsVFpWMEtlbzZYVjUwaWl5TWpYMmErQU8wcUkvaGFuWFJTZ21LY2R2SFVCRFc2Y3I5S1FjWVVjdDBvQzhYY0lRNGpPV1BTVTJSaWp1T2pFOEhhdG5KMUFPMVpTcnFnTnBWbERKQW5VcmtqVURoQU5DU01JQnc1bnBBNTF4bm04R0l5b0FRM2NFWWx1TERTSXlNbzRWTVlTQ2h5ZEtVcEhMdkFCV0Zjbm8ydVNUYXBUYjVHMnBRZUIrbk1OV2V5RkxGSThmcit2cDhuKy96Uy96VGd2ZVdPSlYxSDNCQkR6bks1Z1BZZ2hNYm9YOGtIUzdCc3BIZ2N5OVlKRVdoUTV5QTMxZWIvZThDSUw2eXBnSG9UZkdCT2ZjT0FBOHhsWmw4emIyaHp6TUM2NlZjWG8wUTRNSzJXbzRBOUE4OEZuRzhwRW83SE9EQUFzcTlkd0RVWjkxMzFueEhzVjh4cjJwbWdxZHpEQUZEMHBRM0ttdXc3dHJ0YzBpYmhXbUJabklIbU1UTk9GVWN0RitMK1JidS9kK0VITlBHZWZJTmdBMUFIcHhvK0hLbHBRbW5UN0UyN1VRL3lyNUpTMjZ0OVM5d2FNSFUvcjFIckh0R3JTbDlCbTA3MCtuY3BsbWoxaXliZGhhOFlUemdRakJ1VFl0YnQ5c2Q2SnJlYmZUUHRtRExuaFBYZFJremI5MnhLOCtvMEtoVHZ5a2JLclVaTUdiV2loMEh6aWgwbXJSb3paNHoxejFyMXJJTmJmYjdiK3MxWXFyajMyN1R2bk5QK29uZTBHdlloRVZiQVJkRlE3QU80eGF0MnJIdldxSUJ2ZE5Ib2k3aXpkcGpud2ZIYm02c3I0MlBqWTRNRHcwTzlQZjE5blIzZFhhMHQ4Rld1WXhwYVc1cWJLaXZxNjJwcnJJczA4azRHNlgrOGFPSEo4ZUpzMGVIRDRhRFh2ZGdmMiszMDI0MUcvWDMzeXFzclJiamtLVVZya3pXU3NVb3BGbUZLK3VsWWd4VElXSjhGNnd3aE5DenV0TzN0YXJTMmluV0NCQlhpM2VuWTluRHJEblZVYWVGVWZONm5RRjNlb21sbXV5Y3NYcnBrQkxLYkxyR1YxZ0NycmJEZkxOUHY4Q0MzSGFsaFNMakZyMHFFOUNWWmh3dzc3QWRRUVZDM2wxWHp6WmhoWEdNM1lZMTJ3ay9GV0pzZEE5OTVUMHVmN1dZR3VDSzhpSWErVVBaRWVjMHB4SUw2NmV1MmJFRGN3N1JrRUdPeS93bC9xVThiRVlFNDNqVXRkSU4yc21LTnIxditiVjNLZWxtVGM3bDdjTmsvWlZZbDRxQlVRNWwvSFJWQ1BIVE5Zbk5pd2oyNlZyN0M5TmN4WmRkR0lSWEVMQis4QmluSkhoMmJyUWs3dlM5dU1lcFBORDkyaE4ybngxWlRxRDdNWnlXQ1FXdUY4WThqNmpnZ2pSQ0NpR0Z1RkFYaDRqWUt3YWRZbzRpM0lMQUJ0VE9lOTFiVzd5M2NtLzEzc2JjNXB3S1JOYS96RmY4aXhBbEZQMmEwMllNUWUzM2UzS3EzL01QcVp5QUZkbWlwZ2ZVNFhzQzQzUmxOZmNJQ24vSmcxSWN1eTZ4ditiWUpBVWh5NVNEWnlnVmE0R1hHMjdhRlorQUhRRFU1NTFpRWloTjJvY3dzUEs5WG1ubllsZnRweGIyR2NueVJMRUx2VitRazdWUUZDb2RxWHBKZTVPZm9XSFgwcnZlU0xPanhwWnc0WWFtb0Z3cjQ3cW45VExFT2QwcUo5a2hUYmZibTdTWENuV2h0R3lXcHZoWmVDbXdlaWVRdkJQZmllNEU0cVVOcE9Xa2pLd3NjMmZkamU1NkJxSU9VRi9QMytVYTEraVZqMlVQajRnUXVuYW1waTZGelJBNGhaUmxGUVJscmQwcmNhbEl0WUI5VXkwVk83MFFEa3ozMkZhQjVwQTBWZHEvOEc2YXBlZGhWYTFZQy91UlpiWHFVcVZxSk8vdXBabG5sV3RPcXRRTXZPczhUbW1NMElNNEFnYWMyaVJKOTMyR2laVjhMNDk1WUVPNEo3c29TeFZsVHNtbXpPczkxVkl4ZGhCZHNqaENxYzNNOVh2bnNta3dOTGZSeVBPSStQQ3cvbmJGMmF5bnpOeGl1VzFTd2o3dGs4VmNHN01vcnFYck9GWDFyYWF4YXpaUEYxMDdjWUpyMHc2Q2NnYTZwTGhKS1JKT1BBOGo3MlpiNlNOVGorZDZpRHNqTit0SitTa2FoeFdPT2lQMldpbnFFWWt0OEEwR3BBTFJnSWJXU2FiT1VyQ0RhWDlZRk8yeFpFZEtPNGpYaHJTNnlzUmExZHBEY2R5b2ZRMG0wRnFyd2E1SWFkUmQ4bzY4UjJCVnJGVXNkSXVtYVFPam9kZDB5NFRoOU1TU1MyVk52NFhyUjcySTFscHlNbUZkSVRvNzMxTHRrUGxQMHdZR0ZsRFNzTHlMTjBGY3ZTRkQwQjdHdDBBOG1aT0cwd21zdDFtelF1bVJXaGNQa2NaOXFzYmEwU3c3ZjVMeituTEdDUGk5TWlsVHdqWnZvTjJPOUJSN1hUYWU0bUVoZ3ZqczBCdldWS0E2VlhlY3FnbzV3clRtMk4yVVFMaWNPS2xEUnFkNEhETmgyL0k3MUdEZWNzSWttQkQ3a1FUMExWYUtjYlNBN25mS2dQdGRJNUFERWxxZFhDeVZaYUZFNHBidmhXQzEwckNEd0d1WFNGNm1sVHhTVkpDQ01TN3dkSmhuUDFPRzJVUitEZ25FOFhFamxWWWxZcUlpaFhvbHZuV2xTUWNxT2xVSUhHUXVJcTZuSTA5b2ladndnNjlFS2dRTStoQlNqbzlTZWZ2UXhtYlc4MnlkeXdMSHhpaVZWTTl5cGtMVDQrcXhPNGhiamJ5TVc4WElzVGhkT01vMzRxcFlsMnZuaHg1czUrMUQzcE5uZFNOdXAzSlBlcWJxZTdBUER0YkhLYU9sVWR3UlphZE5XVytQSTNWc3RXYTlyQURCUTFQQ0dpTjd5bGQvNHRsNmU0VEE3Q1NLNnh6Vm9iY01Yb29BYnNaQVQyUkJLd1pyS2M3d0w0dzQ1bXRYU0FZR3BtVlEzd0hwcU1MbWh1eGh0OFdQdjZ6N2R5MXdUZDJDeVNHUWlPUzFQYzRiQm9aMlVTMjR5MDdqY2FGYTJVTWtGRzZJNGhjMEltK2FlQzRKM2VVTUJveUVVSzYra3ZKK2FGWU1Rc3haeEFtL0tWNnVZOFZjZmI2UzJtMElXSi9UcnR1ZUZ1clhWcHJoclJXMmJmVlNsL3NkclA5elNOMTFSSjV5S3Yyei82b0J1dVk1cHNxckhkckNSRm5WTmQwNnFBdDgvcnQ1WTBsRVlGaEowczNsTGZudktvVnlCQTc2NEZFaVNnTnhUTFJvdDB3OTF2NDI5VG5vVFRnZ3B5Zy84bGROUUVMTEdRUTJzVUw2c3ErelZrV0pBK243RGUyQ1duUklQUldnM0EyZjl2cDFSTFZZcHBFbVIrOTZHcmhMbXZYdkFOb09uQ0lLMFE3bXc4SUo4WVhBTlZNcVNyUFN3YjNpQ29jM1Q2cW1HNXV3WktndXNUK3RrRlg3TURybG1xUVJERHNEN2I3N2Y5eTVnempuZVBvT1VKeXVWeENQZlNZZG1jUDBSUS83aXdmUHZFNGYydS9JVys1L2NDeW9wYjJPalhJZldaVHRmT3NKczdPcnYrTmEzRktKMFpwRUg2ZVFLbWE3MCtQT3B0U0JSdzUwVHBvVU1Da2FITXJVWGxtMjA5OURmb05CWXJsQThhM28xZ0ZSeE1jYVIxbUNPQXRrcnp2UXpyejlpb3hadEZyWGlQc054VkpoQjA2TGZRNjBDM2ZOS2dvei9SQVRqSmZFREQ5YnBKR2xFbVEyNW1USkFPS1B5bXByUzYrdDZrSFd2WDVoUkF6cHlJTEtIQi94bDlvZi9YSTg0cTgwMUk5aDZjUlNYd1hJc2ZlNms0YWVwanlpMm5Kb0lSSUFnbk10cGQzK1REVU52SEU1RTJIakg4aTdlRmZlS2docjI2V2Y0QXVKTmVSUnNRM1BxTmxaMmdMSmFMUFM4anV1QVp3WkxDdjcvV1dyYkdiTkJQUG1SK1dKYUxEVmh2aUh0L3plVVl4NXJHQU5tMWh1Q1YwRUV3UlJqT2tsSnM2SlF1UmlsbWIrYTdMNnZMang0dWZ5L1h2ODA0OTFtZldmLzZQK3VqbDVScXhnN2UrcHpCWFpXK3YvcjNXakc2MEhhOE9yWWYzVEUrSlZubjdwZitqUFUrNHJYeGo0aTlnMHZPVS8yZjMzQmVQOFNlb3JmYmNyeHQrS0c5WFE0di9aN3I5S2ZxM250c3V4TjJPYjJQNE5ncUxVeEE2dkRlWE85M2pQWVhjUTQxcWNsOURydFVtdXYwcjhSajZoZXRyaTlMY3NDNTFxYkt2dVZURitjTjJVVVZ2MWxHRU5xcTVKRE9BblJUc0xoVklINTZUUFM5bGN0dlZycmp4d2dvSXpBTXBBWGU4amF3UUFQR3UrVlEza0t0OXBzaGxqVUw4SHdVQkFTMTN2WkZrQm1nakJlb0tSZTdDT0twZHJiV0ZocURXQUFMYUcwVU0zQ1cyaDl4eXQ3MFpMM0tTdWdBREtuTmZsNE1raVhmL2YxRFRWQUFCKy9UN3lDZ0R3NzhVeCtWL2IvOTVOWHN2N2djMWdBRUR3RTdFNHVXZVUvelY2UXZTbDF3Uy90OFJLRHlkdjZNNTZZVDdlUTY5QUFQR2NpVFpjckNDeEJWUmJkeGpZYzZ2RFM2d1pxKy9acjhCQzB0TzFoYXl2QnhZcU03eTZVQXdMOUJacUF3UGZoWVlQMGhkMG1oQjByWVFBZVhERFFnUnBjSS9tWU1YSHRJVVVYL3grR05TQ2Q0VnAwcXdUbzBhVmFuSVVtalIybFBTcXFIQkptbVBkS0M1TmlXaloxc2w5cmtrdHhtVXZGNkkxMXRWMVptU01zMGJjdXJuaWZFbWVyU28xVXNqZFYwcXNiSnNHRHNhNnlmYlZxMUNaTGRsSVRrYWk3RWF5ODlWY2N1SkNOZlh1SzBlSk1WMlNaMnVVY1NNbURaZmdKMG9TUmcwL0RkVnpRelRuNXJPWDl1eVdkc2hVTVhOTnZpK2xMSisvdGRCRDZ0eVdLYXNIYnZZQWkzVzdlbUlWVEZvaVNhUjRXUkxXbGM3S3VOeW5PYzJjbUlvYmFLSGxmV3hvZi9XUHR4UFJydDh3Tkd1M1ZvK3JPU3NSRXJ3OE1YaHBVdURGaWVDRlNZbm54M2lKdVRFQ3p3NUx6UFI2ZUxyL2EweDFQbml5WS9CRVIvQjRwOEJqWFJVZWJRa2VxVFR4Y0dXRWh4cGlzRkpnb0NMNkE1UzRMNURvRFZTZ0p6QVdkL3NyY1pjLzBlbEhkUGhGNEhiZlF0em1xMENyTHlIM3RzWXk3MlV3M2tSTFhHNzJpWnQ4OEZkbzlBbkdEVjVFdldkL3VjNHpydlVZNVJxUHVOcURkMVNWUnl5dWRKZi9WaFh1UkxrN2c4dmNIWEVwSFl0TDlwUVR2aUFlRjBxUE11SmhwblNTRXNmUnNpUWlYRUxZWk1CUlRCeTJSRHhEaGo5ZzZCTURmMW5mTDBSS1FIUkQ0aUJVMmc5Y2NZSkg3THBFeHlIYUp0RXlCelJ0cFlaTjFDMmlOa2Jnb0lBa0JBWmt3c2M3QXA0ZWhmQ1Eydkh5UzdidS9JTE9CRzFveTh2UGJGMnhsR2VKSmFJa2lFVVVGdkdJb2tEQjhBTXdYMHpaNUh1VUFYYkd4SHMyc1hDMDk4UU85ZzdZM29aZ1Z4N09VMzF0SXU2MkZ3K0pOUzhJL1R2WDBOVWdRM0xWeTVCenhCeU96bXRhNWptUzA4WHBseCtFclV0MFpuUTZvazBxUW9aT1RwcGpjajZZSHd3TFhCUDB3NDJDcVI4aUJlS0VqaXVheHptYzA4WHE1eCtZcllmNUVMam9ybmdCYXdWeHY0aWt4dDJVSkcrNWlTYmdCdERkQ2ltNU41a0pJQ00zTC90bVFuTnU5TWtUV0lmT056MWZrMzJMZ3NnNjlIb3pzOEpXWmQ4czdEa1hLZ01CR0lGQXB2Sm13UVNLRTBDWG9sQXlNSmF4RXBJOHVobFkxRVVGaXBvLzBheVl1Wk5BK1RWL05XWUEpIGZvcm1hdCgnd29mZjInKTtcXG4gIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGO1xcbn1cXG4vKiBvcGVuLXNhbnMtZ3JlZWstNzAwLWl0YWxpYyovXFxuQGZvbnQtZmFjZSB7XFxuICBmb250LWZhbWlseTogJ09wZW4gU2Fucyc7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBmb250LWRpc3BsYXk6IHN3YXA7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgc3JjOiB1cmwoZGF0YTpmb250L3dvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFDUmNBQklBQUFBQVFSQUFBQ1AzQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHbVFiaFM0Y2dSb0dZRDlUVkVGVVZnQ0JEQWlDT0FtZkZCRVFDc01FdWtJTGdVZ0FBVFlDSkFPRERBUWdCWVVHQnlBTWhoWWJ6VG9WNDFpVHdNWUJqREg5UlJGRmxlb3JvcWpQYXBPWC9mL3RnQnN5cEliK3ZTcVlkQ3hYNk5IU1d0cGIwNE1KUVdrRm4yUlRIdUViQ3c1aHdTSHNGbTV1ZUFvVmp4bkY5OFd1ZlpJK2lxYlE3NXJLZWJWSGU5Vld4NFF1eVNsdHUxRFE5K2sxOGIrNDJIWDlaVVhOUFZ2b2Yyc2ZLbWdjR2xMeXJJeUZpNk80WXpRMGtwaitsNjd5L2QvZDRwblNBczdkdWJma2JnTlExMnFCU0NNRGdReWtJTEl6bDFQVUdDZzZaNkdUYUFab214MFRIWUppQUNvVzJGaUFnZGdvb1lBQklsRWlCallHVms1RmU5b3JGMlV2ZFc2L2QrbjJzVWp6MjUrZkxodVViYnRvd2RPMzMrdWRuZGtOQUx5aUt2OWFJSHhKZ1VBaXE5cnF1aVFxcW93S2hleUpVUG5qdjVxMW1Rc1ptS002eVlSdi9kSzcxQ25PUnVMdTZ2Z2VrcjFSRkYydWtUNWQ4MHowbGFUbUIxRHN2emluMEhaR0FzS0JLRWxuVHhERTNBZ0Z6OXhQWE5NeVhqc3BjN2hXemlUWjBDWkxkQWdQQUVKVjZmRUY2WitFTFR0WDF3UmN1TjVYbDU5YlpTa3B6S3NhNjRJRkFGOVVYSlBYamZuekJvajFVZVh6MmJSS3E3c01iWG1wRnozWkxqdmNDYklGQ25lQ2ZDa0lWYithcXFvbGw5cjJUTGZiMkZxd1BDUU50d1kxa1dZQk1BSUs0VWdhejRJOUN3RFJBVWVBOFNYWkJlRzlDNUw0Z3V5Q01EZy9mcHNaQzVHdUYrbGQ5UDFENDBGSVJESkpiRnNJY2ViMlh6SUorM3g3bks2a1d4SHJTaENSOUxwLzIyVnNSYXJUQmlPUFRZZmVmeDlqYW85aUVqTzNzeUxJVUE0d1NydC9TeEJNbTFrc3hDUmtjTDB5aUdGUTZERmFBekVPT3RnZFhPenI4TGZ2UldxZklMY0xVZ1VwQlZRcGdGVFFFKzBwQ0hnUjZUdlQwWiszWUdVSDJGMlZyejYvSGRxbmVlSzVvZjJxN3F0RGgxTmVmM0Vid0FENEtzSzl1QVlRd0VwV2JDSklFb1pwZWdIeENBWVZtRzRIN05JdEZFeE5xQjJscGpTMldQcnBncTRCQ2dkTUFZTXUvWGJhNTRoSko4MlpkN1hYL09DT1JULzV3OThlZSttOXI0RkJVSkNGbUhyYlVXeC9tM0dDRjM4SmxnaUprbGo1S0R3UmkwTGFKRjF5cEZES3BFWWFwVTIyeTZEc2xnTXlLdE55V3M0RmdKN0lOYmtoOTJSWmZwRS81Vjk1S3EvbFl3QkE0UjlUQUZKcG5IUG13MEhMb1dMcVFxaE1aWlBUTEtXYlpDdThSRFBQbEJicVhLQks1UWJUYVZEdnE1Vm9UZzlxdTBMQ1hCOE1UNVZSQXdVbnpCSjVzTGxKUVcxTTZXaHdZVnVlWnFOSGxoV2F6UFpKR0hxY1BqVUpnM0tPemljT3lRRmtFcXFCaEtRWEZaL1VReWdlMCtlMDNQeTFvTm9WQmpjd2Qvclo1Z21zeUVGNUdwSnNoR1pPelQwQTVVMFVybmhrVHZNM3hIMFAwTHhScVFmMW9CNzllTy9ReExOWGJTekFkSEVvVzcyRlhkbVo0TVBIeXVjQnB4UUprQ3Y0OVl5SGx4akIxbTBrNXlnK1ZKOUZvdkVqakFUQXhndno2QU0xMVc3NzcreVdtSjNEaitNYitwa3ZXZm1lNWxldXo5TkJiZGJsMHU3aDhZQ2dHRG9CNkJFQUlCZkZPUUJvd0dic0FLR0d3MUkzcytYYzd0ZWZKaENBdC9ZOS9mcEMwVC9KUmdsc2RuSVFlK05Wc1NaOXd0VTBDL1BSNE5BZU91QjNWQ1EybUxlVFNVeXpUeHRwaDNicGdBN3FRUjNYQ2YxVzUvV09QdEJsMTBWY0tSdmI3U0U5YkV3ZWUwSHZ2eXU5ZW16M25XNWRUdW9rdE9ObGFnMEVtcnhHWUhFT0M3ZVM4VUFDOVArWGoyV3VhT0ZmV2FCaXZBa3diU0lrWS9Jdmd5b2NQUnJEeHh4UnoxQnIxMjhtYlV6aW9GNGRyckhaRGpmazBOSjFiTFBIcUVyRzdOSk5xMWxxUUtmUlZtaE5IM0MwRW10bWFyRzN5ZWxoVjZOTmUrMys2dmw5T2FhS0ZqMTJPR3pTRFNyeXFhU2VEanRsVUVhREZ0MEdqVGhnMUpSSzJ2VVp0cytvWTI3cU5tQ25zckcxUFdwcDV1NkRkdGx2elBkZXRKSW5UZHIwM1hhbkQySVNRUVd0U1RKa3BQNkhOSDFRWURoZDFTb1BEUHQwYk5iZ1czN0hjR3VMdHBtOHFYRmJRMzFkYlUxMVZXVkZlVmxwU2JHbXFMQWdYNTJYbTVPZGxabWhTazlMVFZFbUs1TGtNcWxFTEJJSytJa0pYRTU4WEd3TW04V01qc0poYklOcUw3eTU3TVZSenZjV2U3ZTBpbDRVZjdrTzlzMW1aZVBsOEhNK0M5WWR3VDBWT3h4SmZkOVk2dzFiT0VoVEg2Nk5jeTF6QXg4cGlnY1J2UHFMRGNjOGZOb0kxWHFCV05BMlNmaHZsUzhYZTdjWW5LY0o1bHk2NzVUTys5aFlhRUhseGJLdVRNQ0cxbzhuQ0VOVm5VbDBYVnJsWHc2eDdqeWo2OWl5TE9KeUtVQXlOUW4zaXI2a1c2bTc0Snh5aXE1Zlh6N2pUQ2pYQ1BURjB2Y2lxMkNEL1JiampIdXl0NDhQRmFCTEluaUdwMDlFcHhxNllKTzBSOElITDR4T1paYTh6LzMvYk1OdmlXMjdsUmpUS2FPdk5wTXJ2OXB1SktkbzlGYzc4cFdKODNEWHAydnBJa0UwZFNZRDQ4blVweFRMNWZMSURHYTl5WTVIS3lWVEhGZkxUTmpRZ0p4WWhCNE9VeTZtWmFUQlBiTHNDQTNaRS9SVXZkY2JnWmx1ZGdJbU5MR3pqUktzc3R6dFBlVjIzSzQ3NEJaM0VxWEZWOVB4WHdKQ3dtOEp0UWdqRlIzTi9rMVZMMjdVNUVaS282VlJJVXNydmk0dzltVVNITFpPcTl0MmxkOTV0NUZ2Q1ZyVU9iRkxlWGY3SXUxV25Yak5zVXNYZlF3MkNLRXNlTVBQUkFqU0dkeFl5T2FDc2Q1cGYvOFpldFo3Sk9HRllaK0doL1hsT3FYcHZhSG1UNXQreGpkYnBtTExCcWZ1QmllTHVicXFjeENtUCtOT09KOWpTT05FL3pXZUhaTkp1c0d0QzFSMWRLNUh5RWo0dFREYVkyRVNTVk0rV2p6YUkvYVNKc29XZHhGbmR3dVBmNng0elBTSVB3a2FCZnluWEhOTlIyKzA1Q2tSM0JOWm1hV1AwQ1VjUjhqc3Jra1MwOWI2by9LV0Z0VUphKzUrdXpWOG10eGo5K1M1QklST0pxMW5hR0hEeGxtY2JIWGZHcmFhLytoczVyNG5EbXF0R3hjandxVlZlODVLTURJL3k1SG1aUDRwcENGZ205ZW9hY2cvejZRUlRSN25PWThsdWR0YTBDd2Ftbm1qaHpPd1orKzNXNlVqUmR1bVozS3g1T0dlbU5teTN6SnJkQU5QVS9jUGZSRmY3d3FKWlVSTEVQR0FGNzlRcXVrUzEvTkxISUpvZHhINVNDek52YnM4VTJ6SXdsYzRKMVVKd2pDZTF2U2hSQzh4dytCK3RIa0s5ejh0TzRkVEFxUzV4SEZraWVsZUZzOGFQTzlkK2NFaXFpNnBUdmtxSDNsTm8wdTZRczBUVlJsSEp1bjFPL1ppREhZa21ScnJJZTNOc3ZhMm9tRkhYOGk5OGFKang4ZlRUV2xITE5pMEpZOXFnNEtuRUFpeXFhMlpERFZCeStoWUdIUGxrNjZ3MFc2RWtxamJ6eUljRHA4NStEdkNpaGRzRDhncUR5bXNBcjVMRFlCdEFUcDFuZFVOSFFhaXc4d1JsSVZuK3lQaXBwY2R4d1gwaGFoQVM5QXhUcWpBb0tGNVU3UDFLRXNBSTdTV1pVYjMrTzVMelFyQ2FYQlE1bEFIYS8yQUhwemd0Q29ZaTgyT2cyTkxGWFhJekRxYUF6UWcrMGo3YTlLcFpJV0cwL0w5WGhZdnVIUzZiVElPR252SlZTd0VkbHNDdGdRYjVjb1BpQXBlQ1JJZXUzeUNsbWUwMVlqbXBlY1JVS2I3NFFseGtUV1VWUUx2QkNXNWt2MTZvY200ZFlDazM1cldVNVhHTGtmbDdXbENRaExvRjUwczNuSExwTjhXcnprOElMRkRUa1Q0aXZRSXdhZEVoYVpTNFFtMTVLTFllUytFOUdTY3dVVSsxSm5jdjhxVkpRcU1JdTk1cTRBTGlEbGJwUk8wRm9zYkR2U0FRbjl2eHFvdmYwdWVpZ0xscTR0aXB6MEhLSzM3d0tXNWZ4VTBQbkZqRkU0SjgzbEF1a09PUEVHZUR1Y1VwUzN2blJETklLWFoweThhdWVkaUxkdnREbUx3bHBHdzdiVHNWdmdaMEhEZ0dkaXlCNVZ6WE14QjRTYU1va0cyVUI1bkM5MlExV0RkWHpieFZ3WUYyZVVaQ1RkTlRINURveU5SWFhVcXFVdDJZMkgrTHQzNFJJRDdPOWR4YUVLR0lld3EzeHlYTnR1UnpjN0dvYnNVZy9BdGN5cDdRcW1IR2NsdWxuMFFaWUQ2bE04NVVsNERPQ0c0NFIyS3U2RU9PSkZBeFhzWkl1Nko3b0xkV1licnhra0hrT2R3clZFeDhBZ3duQ090eDdXSmRIcDZjQ2FKUGFRYXp5SXlWK0I3S01oaFdYamZBUnQ4VlpEaHMyZ2lyU2pGSnF1WWZWUlVjZXEzVzdPOTRSTlBHUUxFYWU3M1ZlYUVqZ1lRWUlPOVUrWlJvbWNpRU43S3prR0VSbmFRTTRpWUlnbjJyUjdmWjAxQ0JQc3BHV0ZHZUpjZjRjYVEwSW4wNFNheTBkazhSR1NwZ2pCWG9aeXorNDEvMVByZzZaRytOUlhoYWExajN3Kzg5Z1J3eFNmTCs4V2hwbjRZK01DMVcxb0hyY0xyM1NsUXB5TFh3aU90QzNMY1YyRWh5aEhuWDExRWpKR2g4VGU1QkdVKy9ZK2xBcUMxMjA3NmRpRGk2U01FUGs5R0h0bWo2N1hreWQ2bjl4L2FFL2tFa0pML0NKTkJFOUhhZ3pSNmd5RGV2OGRmY3A5eTVTZkxpay9laGRQWk5iMkprSG1aUlJmaGtlaUNJaG53RVM3UnVrQmt2RHZmWVlJakd3MUhYNHdQTVc2RUt5b2ZMaDcrSmxUaW54aDFRcEJHa09ZckhuU1IrLy9iK2lxRWtla2VHaWFxZFhXSUY2Zk5Ca0VGUHRldFc2dzR1NTRKbmlWZ0M2dkg2cG9FaWpjZGNMMDhoclEveG9JOUsvYXMvKzNxVG45elU1a2sybVpRbHZFMHY3VXdOR1NjOFR1TE5UQzBmaUdjTHNEZldEM250ZGFkekg1SWpSM0xDU1dFeU8zNFJIS3Jxa3RLTGgvSUtaTDhBOXBRa2ZzL25NdXN5UDZQeVZ2OFZ0WkZNVG4vcCtCdUZUb0daOC8rQnNpcTl6ZklwR0N2cnRoR1BkRWp0bndpbWRwdlhGV1FKSERVaERUbXdQSkFjRFFXajNLbmhtMWhGOVlidW0rQUVnV29PQUxJQXlDclZxZUIvL1RjR3B3UTF2SVlkTDlqN3VFNGNnazE0WVczaDZEV3JkTzhKd0tpM1NXLytNWCtteTJpOXFVTE9lcFlHZGpjV3VlRWI4cTJjMlMxTTdiSW5VOGkxdzZUWlNtOCtKM1VyckYydFpkM3ZXYVo3RytHblhQVlRuSTNxdFBkTXVzTkpuNHhQZCtUN2o0YTlFZXIwdG9KcUpZRVdtR3dDZ0VBVldwZ2hESkUwUWs1d1QwZ0dxVUs4OU5Gdm5lSi80Q0djWHV4RmRBS1FjR3V1aHB0WmwrSVVRTG01eFBLeVdHT3lTWmRzc24yMGZRQVpoeVJCa3FDLzYxMmdtbDlBWHV3V0NRT1g5a3RWcEMxVFJheHlVaEphbUdid0ZiLzN3QW9rbFpKemxPVmkwY0JjRW5Hall0UVNGU2x3NUJpM0N6b1lDNmpkRWg4MWs5NThYaE5sNEJWM3phekM1Z0xJQWlYa0JSaVlQVUFBYlZYNjZsazlPaHl1QURBbFBpbzZ0WkgzUU1Zc1dqdDdyTTVESG0zRWhXYWNQQ3RJOXJydHhzL3VQYTBHd25hZm1ydEJkMVNsVnBpUzgwV0p5VFNlUzhIdHBsbmJlQ0xVNlBSVm9lS1lXV3FGMksvcDl0T2p0aC8zYXM4RXQwTC82NDIvTUhuS0dkWFNoR3dibGtZeEtDTnpVUXh5WmF1WFJpTS9hZElqeVovZEh3djZTZzF0b1BBN0ZZTG51WVdMTU9YTlI0d2dGVTlTODhHSnJFalBNR2tpRzdrdEFQQXR4YXJ0a1ArR1pYajRHU0kyZUplSGtXTjc2NVJrc3lMQ3FydlE5b2dWUXduK0JtUFF0RVo4a1Q4ajJJOW9GaEs2Q29NeXZGWStJZUpUM0VEdFdnT1lZWm5IaFdWRm5reVV2MnVPZjRVZ2xnTUo5NEFGUEt4UHovd1Npd2VOZTZFSGxvc3J1NExDS3BoMDhrMVdNZXh4ZG1tK0grNmVGU0VEZDBxbWV6TlFjYXdXQ0xaa2dFVFdNWElYaDhxWVJsaGVFTDJXL25KazFhQ0dpcGRYVHVIOXh2VWd0UXozZ2Z6M0R3YllBV2x4d2o4enlMNnM3cks3d1JkK20ySFdQbW5NNk1CQzJ6cGZrdkhaRU9SZWNzbVIxYzNnN1d0RE1rYUw1TmRuZHhhVGNxTkthazY0QnZmaXBOeUc4VlBwbmZZa1ZNalpmR24wdjN4TTBmNDZuRUR4cWVEaytLWkthdVZxbGdiQTRWOFRUblVDNWlja2oxblZqQzZZVCtEYUxsYlhhMkt0VkJxRXhxUmNsbjRCb3F5Z3k5NXh1L1dTTXVrTmgvdklHanJJMWYvKzBpclBiSlg5L1pFR1BXL3I1WGJvd1ZLYm5yNkgzenBLQ2xCR2Y2cWFYbkVybDdBMmpVdnBHTUUyQTZFbFdYZnNYamQ5ZzJxOEszY0dYd1NQOTVIZDUwRkFsYXB3Wk5CdHFHMjYwRmIrYlNWbDRzeHU5WWdRMGN4YTJoQTJzb1lQcmc2ZnNLejRGb09hUmk4anF5dVEwaWQ0ZUdqcUhqTlZSU2lPUkp2dEhqa2RTVk5LYkhXaTRqUVdtWFlkb1JRYURSNG9QMTBjOUswOEZVK1pMcG1KK1Y1YUdrN2g1OTc4ZWIxSVhMcDN3VzRmZjBia1BlbEJ3TEpwNHcxbnV6cEYxSGc2RkY0b1Vic0FWdnBINVd0OUlpYXNSWXdSQUZzV1hVaFBTR0dJY2hWUTZzSmY4MlZHcExtM0MxbGExTXlYSEljdWlKa2F5VkczOVZIL1FSTlFnam1KcnZ1Um1pMmw2YXhkM2FucTFDUU5IUlpWLzdvamdmZ3RNT0hkTE14QlQ3aEtkRnhVcjc4cU8rYklWYWVhd2lQU2sra0MzZGk2aDNXbC9RRm1HYjlHdkRsVjA0RlFISjBOcTRJWFhIUzV4WnJ5MWJrTE5vUFVWcFVFZG81b3pmZXk2NHJlKzZOUE05TytOYnhBKzhCcDRhUloyaFRsQjhFSXhtR2puekcyUGE1ckhwbjRIU1h2VzY3UGhrNkRhclJlb3RxU0l6bGtQMXhzOFR0WXhXWFVLSG9KRWdPcXMyNi81ditHZk9YMzFXaEJaMEhoUm5KekJ0UXpZZDdUMWp1UXB4KzNsNzljVnlEZThSN1dIZG1xblV0UmdzMThuaGY3dm9mZDZsbWRxSmxsVjJnRjZyMlRPYkZWNUIzMnAvTmJxMDVXRTNSK0NobGNiWGtYYmJIRkNraHpVVlVVekhmNE03VHl6bktTL1dOeVZlbUcvNEpieHZKMndxbEdkVEsya0ppaTdoeXBTaWwxeEpxc2pHckRBQzlkQ0psK1dZUXBaUlBUNzZKMkttZm95L0dMc0wraUpteTc3UzNKcFRoNFF1dGdRMmNVbzdROVhEcjRhL0ZNc3psQitMQUU0eS9iaHozSS9IUlk3Ni9EcTJQcUx1Y21YZFpXNDVmVmN4dGI3bkFMbSs4a0pWNXZVdmo5VUEyMjlseWthMTg3WnZnUzVGNmxGbTBNNE9zeFgrU3lNSlFpc3E5RnRrY0ptTWxtUVp0dkNkSEU4UGk0cmxNUHhZK2pCVXR2RFZkNGRoazcvN3ZtcEVMZkZIaEhmQm0xcWxlSC9MREgrSVg3MnhWM0xuRDVkRXNtYlVUZncyRHdFbHhLVTVKeTdaVzVZRWlpcHlSWEFESENkVFdaTThjblBwbk1IS2VyUkxtdkthVytER0lZWEZ4WEJxUmlROWpSUWwvVFZac1lHMEF0eHk2M3d3ODZRdHdzblB3R2NUc2w4NFcwS2tLajc4RmR4dW1qOVd2TXBxTWJRS05hOXovNWQydW14aXZXcUlXNjhWVSs2UklvMnNJT3l3bXBPM2FxVHBPQXprdGxkbUUxeDBQY21UaDdaVnhNZVgrWCtiZE40aXV4bCtmRjBMT3pMdnB6ZERqd1pjQVhsTThjMHh0dlZDRThQVFZ0ZnJyT2lvQ3ZveVF2NmpENHdRWklNVThFYUdhODdHVjJkdittelgxSkw2dy94RDVCL0hmRHRJWFF0Z2ZyNWI1L2pxTUY0TDQyeG5qQjcyU3hlTGRPZXVYQi9YamR1czd6OWlhMzk1cDQ4VzJsTHZWUGNuclovY1pDaVpCeEQvTzNXM000b0tiL1JWSnZsb1JuWkNub3VSdUVlcHJ5WElsWHN1bkVYTlVsSGdRTmtoeHltVHNibTd5cVd3c0pOVTRNdW1zVy9wdjhtcmJTQ0luelpGdEJxVkJiT1duTStNM0VtUjFWcVdxUDkzejlhMUtWUE1IbXplaWRxQmtweHlNaktEWi83NlpkaUNhcHhmdWJ5TStrbi9iMEhLUWxaUlhrdUxHZ295K1k1aDl6UTNyQ0o1QVNLa1V2THVSSTl6V1JEVHpWQ0pFQklhbllxbk1qNUFZUGx2ajdmY3lNSkVhVm9KZy9XV3hMWUJMU1k0a2NBTWpsTjdWVm0zVTFFaTVVK1FtYWpqTnJxdnUyNGVLUGUwWCtXbDcxS1c4b3lOcEJlWVZxUDd4OW1qUFkrcDkxekoycWR0OXp4WTV5bTZFU3oxQ1l1M1NnbElMQkhLQzc0c1FrZ0FiRm9sVlJ0Qlo3SEFpeHlNc0c2bUFQc0xlVW1QZGdqZE5FMzNIR09OZWZNZzFycHZySzdjdFhCQW4zdGtRSFIwLzZSTDc3aW5Oc2ZoMVJKbjBSdkJaaE16eUNXTGtjb0ZrUnRWWC91dlNVSmRUWkFDL1IxQlJ0dStIdUpxR0t5RUMvN0psSnFHTHhBb1dCMUpjL21WVFgwVUhacllHN3BhMGN0YUdkNi94TWwrVEJIN2hNb2VxYUhaQXljYTFiSGFjeXJPU3pvOU5RditKYVA2ZVd0Q29WQ2JVRERCVFRDQTBkRW9ldDZxcGI1RlN0ZTI2Vnd4TzltdTBVN2UzUktnSm92a3JDZW10WGc4RzQwcXdsQWdDV1JvbUtCOE5vRHErWlRsZmNjZlFxdnpGeWdDSk8wWlA1S2J3YUN5azdzcnNWanlaWG5wOHB6dDNxd3BzOTlUbk55UFhNL2RHa2NCM0gya254Y0ZlQ1p3UVpoUzJpRVhONWxJOU5ienNVZFBnVFJQbnlxSnFORVVXUUZlWGNCZlFaU2wzdk9HTGlnM2tIWWdITlV2VkVCeXZiSWluOUtTNXdHU0g0QnZaZHB1SW51blNtQnYxUWJBZTlFRUV6MjFmcHE1bjlqdWx0bjRpVS9EalFJaWhGalZvbm9qZG1iYWw5K0tOTE0wdjNuR0IxS0xnRXphbGFuaThTVnVrZ0p4cU9aTnRIR3ZjR01VaEpRZDZ4NFhRTmFIajZFWkU4NzZDZmlzSS9mZWREN3gzYjhqRlJpNFBjTzRzODkvWC8yNjFnNU43a1p6TTBKQUtJNG50RCtsYk83M1BabzVjK1BMNkJ0T1Y3bUlvTTB5aVJJWllSL09kM2t3cVlmN0ZnL3pFUS9BUzFSZG92SzNvTkFiK2l2SC9aN201elV2SU5ZVmJXS1pZcjk1Ym5OMzZPZ09QdStUbjhyQzM4WG5xbWNNSVdwVy9VT2t2Y2NmMFNkM1Q4UTJGb1IzQ010bUJ3Nm9jRzRqQ0lsZkRvUkZUUll4U0lzMlVBUzdaR2tnaS92YkM2NzVWYUoxSnFaTThORUJLNFpUeU5SbGU5Nk9hSnlLNGFnYkpqUkh2UDgxd0tHTFJzdUQ5YXlSUVRaR05YZldWMWgzSmFudHoyRUtsTCt4VjVYUGIvb1dFZmZpTjU3bTIrSGlZYTVHejAzUGQyc05TakYza0pwd2U3RFJlL21aRk85TjJMaS9wYW1PbDE2cG90cTc1TUROZDJFaHZnY1JaN3pMbGhWaEYzd2pnMDhQeWNZMklXaDlSWkNvbG1FOFA3YmJJQzloYUZlZGwwNTU1RkxqeXZQVDhYNFU2YWs5K01uNGg2WFJQMStXRUt0VnUzRmZaQnJrUUd4SW94ek1UZkxQUXhjR1JYbndPMlMxKzRSWXd4TFVuZnkxWGtoN2tUaDJzWG83VVJ1Si9zNDN4MzV0SnN0L0ZIbTNzdlM0dGYrMmJRS1FJUFRRV0xkRlVpd3diTzBsRGZHS3oyMUZST2lzTFpXdk8vM3VJRlJwckc5ditDd21QaVJ2eEdtdThseUh1QmM2ZGJmNzcrdHNXTzBzRVl2bTcrNVBPRUZabVE3Sm5RMlpxcmpVbk9wYUI1K0pvd29CTzErc0k4S2ozTGd0S2xHdm52LyswbVhadFpxMlhtMzVUa3YxZHg1RGcvNFBmRnlZdFRNVEdGZTRKR1UxaHVxcG9JVGZWZXA3WHJ2OXdidjdIZjYvWGg2MlduQml2WDJiVzZ5ZXZEZHhoUUhOcDhlbSsxVmF0ZEE0dWxZU2p4cU9VRG5xYmJxOXEvZU9NWXQwalBCQUcwWDVQVG1halNMVjEzUllIMEhPVWU3Rk9qd3hZZDZCVUgwL2tHOXpUNHpLelVHRmhlR1FUUEJObjFVQnp2THlaY3VjMzFLMzdlOVgrczQyVmlRVmdzeVVLMXV4NkNBdFdIaWR0RDcxamIzUE9lOXFleXJjOHVLYlhkdEUwOVE3bURPTEU5RytuVzZtNmd2L1VYQUl6dC9RZC9VczV4MThlR2hlL0RWMGU3bXBIY1dYV3N4RUJuLzE5RTZNb1ZaNTdMWTZMZUNZZDhFaTdVMlo5OUdFUENIOTEyOGd4Zm41Q25nOVZhaHNnMjZQMnhmK0Z1UHZyNVRabE4xRXYxY3E5Ym1aY21SaDVMNSs0RE9wcWZEbzBFdmRQN1pFK05RMnJEdEFyRFVZby9UcWF4ZnZjWjlOekludnIySXFrdG9qay9PRHQ2TDN4ell5TGJHWXdBa055bk1HVlFwU1FKYmpyc1U4Zy9aZzNNSVNISFNyTE4yNEF4VUcwVC9EaW1sZ2VwdXpWcmo4dHJQZGprQmlyRmU4U2UxWnVkamJmRDVYMFk3L09takJNOWVZNXg4VFQ2a0pPVzVXZE5meW5MUGQwV2tQaHpQZEpUVHZtbWhNZjlabTVZSWFJRzFwVU9YMGo2L3JnMEMyK1dkTXJITTZ5SkxxRzRyWEROcHBBOU9GcC9EMjh2NVI4VDhhMEtucHBWSlpIZUd4N3JOaUhhVlJML25zdzBCSTc5bTUvVklxOHUvUTZ1Nm5FR1kzVGFaTUVOOHNheDlQTkJsYWMwUXVrNyttMUFxcWlxdHh2Sko2cDdSNUx5SzZzVTZObGNIVmtQUGFuQlhrVm1ITHMyK3ljcSszL1pKSzRJY0U1enAxbSsva2tQOHg3OXdUS2hQTVlsK01uZDlQN2w3QmhMVEZ0YmtkWklkOEkvZjhERlZpRVN0VGVJUW9qRnFONU4xM29TZHRmVm1ZY00rOW4xVHJ4ZUYyRm9NdUtTWkZGWnFLb002L09PUHB1b2xjT2ZZNTlobXVabTNzMzQ4K0FwVzJpTXRqZUxjMnBrQWgwYUhnRWtabGJHbnZWb2pCbGNZeitSYTZibllERzhVUnliNUpmckdzSU5Od3dCaGFYUXFWZ0FBOVFDckRGRldCTGdMWUN5S0tsVHN4V0FBVE1LUm00RGdtc2c1Y1NwRTZZcnFxQXYxYjFnT2VyUnNEMDhXMFF1VEQ4cXdPR1RNSmRCaFptU0ZERnowbHFBR3dKVkkrQ3FRblZwd1owSzRWUVF3cWxNR3BFNGNxNE8vVnFaazRWTWZXMEI3bkhlRGd6QUpEek5LR0xablhQZE5zS2N4blMwUUNyOVdLRUdra1VRVXg5eGFYTkhJak14bEtZOW1uTE5nWGs5SEM3SnhFUURTTUozektNOW05elZwNkRJMHdhbEFDQVQ3NGl3WmZBQ3QwSUFOZ2gvVG5ncnRwdThRRVhBaXlBV0pzeU9TSzFGN1FyNTQ4VFhmODJZRjdxS2Fza0xRVThETk1tZzFtZGRzQTZCWWw3SDVHUkFkMUNlQklEOFFqeEk4Rm5ZS3dFQ1psazgycC9ISGZxMzI0bGp3ZUFjZU8rY1o1UUtycE9oSlU5cnRiU3JmSVNvNVdsL3RqV0RCU0FtMEU0eGFXSUJLc0RKUVlVTU1xUEdUZVlQUm5ZY3pDMEtSOWNYRHZPendBc0JwZ3ptS2Rjb3hNSlhYUVh2eUxCZHcwd1h6OUxzZmllaTRmeWkwZDRFc1lkSHg0OU91MmxCQXdrUU8rbUczYlNxNE9ya3p3ZmgzWXc2UGZCUW04dWptMTJrbDFkMFp3U2FBM2lBQk5nZGdxM0Z1UjVhUEgyeW5HNHc3aktsUWhJK2t5VTFVelhSanoxUExlVVVQc3JFU3JEampoaTQycVhqMUhNcVlRd2pTb2JJdWVnNXVWTGxUTktrMlNNVXl5VUp6SzgvTWdxRkFKa3dNS2hLV2VhMk5HSms5Y3NPUmVNVUttcVlJRkRzYkUraHRkU0FiSDRvUmRKbGgyY25Cd0xHSXE4dEZkdFJKSUR1OWlyVHQ4RW1IVGMvVmE1Tm13YUZ3UXVIWW9pczVqMVAvbWR0U0tBYklCeHArOVlmKzhySDNwbGs4T3JCLzEvNUZvMWpISXBNR2cveUtQaERLY0s4WHRjYkcvMUxyU0ZWajVtWjdzRnJmb0FIcUFkSmN6Y1FJaGpVQ2JQQTIvOUlZbkFNQmR6cFRRRElkY1lvNzFpSTY0YWxMMlhuYmIxTnVRMGJab0t3ZkR3eDNlS0UrYXZtZFI1amd2R1lGaFpOYmtZZFFKUTlpcHEwVkNWdjNlMkUwMFR5MTRlUTRXWk9Xby9QV280Y256bFM2NlBjMnh5ajFrcXlWMWNQTnhsczdjM21NOGhsaGV4MjN2cWl1T3VhMG9xOEJmNTJReHVDWkNnbXVFTmt0S08zRHM2NFR5SExKQ0ZxQUd2aHgzSzcrc0JoeXBHV2picjVWcXhhUjZNeHpDV0tGcE5XMSs4dXZkNnVDZ0JzWmprZ0RJN2lDbmxhVlhDUWlUSjJ3RDVYTDUvd0MzSFk3akZJM1ZNV0JZb1hpbE9vNGZXSlJxS0hzcHhTNjJFak9iVnJrWkNLSktnWEc2RUg2eHV4aVBlNi9YN2d6alozVlduY01NR0xzdkRORFBZd0hGSDAxcTYxL1k2NWM1RmtveWxoclZUVWhjdDZqcUx3K2x4b0lEeklGc2tGQ3M5RTlCbWlxMDczOE82MGNoSUttZE90Y0JMclMxeGpnTDlMNnc3NktNZDAyd3l3VkZJTmxtenJVUk5IeCtjeER2a21hUlpqZ2xZUVdWYUQ0ZldZalRmeUozNkp5ZDVqdU9OS2J6YXBxMVozbG15aTM4VXJKTFVQemc0aWVQK2NreDJkWkM4VGtlbDY2TFI1dkxEUVVldEl1UTRxSHgrZTR2SGVPbzRsVTNUN3V3Z3ZqaHVrNEJqYTg4WW9aU0ZUazYrOE1YWi9mM2xzdWoyZ3BtSlNHT0l2V1o4OFBtQUErc0FMK3B6eDZtSGdnTVBlbWJHcWYvVzJ5b2tmM3BxSnhPSUVyWDlmbWVDbllKbHJwRE8yYUxFVFBqeGN0bU84eUtWbmkvaHdVcXBPeThUMnRGb09NU3l5UFVhMmIvS3c1K01Md0RvS1hsbVRMM0NVb1M5MVk0TmY0RkFBTXJ6NHp4bkpKdmMvb09rQVlCZm4xNzhCUHc3WnovOWQvd3Y0VkpRRDRxRUFZQUFzbitvMTJVbkt4YmtrOFMvaWMyU3d6c3A3VFpYaGdrNkd1aTA5aGFTQ1pkVzNGMFhldkN6ZjBTWFFHR2tocmhDdGEzWHZnMEs0N3ZtbmRiRStXWDdnaDFIYWdWeXdOYjlnblhpWWdXQmxMNExZYlR6a2NEazdwRmhwWHBZU2xacWVzMTRIdk4wRGxaNERtOWNhREFTdlRBMmlPVnk5V2h0dCt2ZStNdzhmY21DRlh1NGpVQ2N3Z29vZTYxVVcySWlUN2NoTDZidkE2blo0R1pMdUlUbktPMHA1VGpZVzc5b2FFSnNGbkt0b3JOZzljeU9rNjdoRDZGeHdJOVlCaGxsS1g5NGRmRWNDbHRvNGJyZ3BjLzBLNHBlQThtdWxsT1V5aVBwOFVaQUQwSCtEdU4vdm1JcmZqTjJVbXE3T2ZlM29ZZ3UxR1J2L2JhdCs3d1Z0UE1YK1AyWDlMS2dESDJZRkFLN0FhS2pwZ205U2oyMitQNHltS0d6ZndRUU1jZzBNYU5jSk1IRExKTGtSakVseGFRRWs0Y1ZmdERtYnFrS2dRQWtjcHhBUUNUbkFTNVpSL1VWMm1GOSt5OERRbi9KS2FDUVNqUmtrMGtXSldEeGhlZ0ZDei9UVk1LaFVKQVBTU1FGS0hiQ1JkT0duQktuTlVna3BZS3NuRFUxaGVzVU94UW1FZ3poT0dXU1hZMDBjeXA0MHB4U0YySkJ3VFRub1NKaksvbVVxRUZBTnE0cG5uNjVHeEFxQlMxSXo4RGFJQ1d1czBuRER6ekVveE5DTkp3NHRDR041ZFI2WTRQREIzbG13Q1JFQmM2Mis4WU92RDZrZkdMU0tWWncydFBQaFErYzhUMlJKOGtUaWN6YWtrTVVzWWk0ZUlrZ1lrNTNtNDRjcjFicUZQTUgxdlNBdi9aUE5FTEUvQTNOOHQrMG9mdFFQamlmZ0JsWU5Wbi9PcFgxclRwNjE5dFp6NkpqKzhMSXVtY2UxaldaWWpxblA0eU9NUWpUUG1xeXRsRkg2emlWdFl5Wm1YYlEwZHpDWEc2Um1NWmV4N1oyaW9aV1IzMTdtN3BPUjIwM1JVM0hwcnE1VFZXam83TFdVVkV6S0s4VWxGVlRsRlk2U2dvN1RIRXhnS2JRVVNSV1lha0x5bktIL0RJQ2RhNGpMMnV6Y2pPZGs1S1ZuZXFzdEY2WG1iTEpTUEE2cWtSSGVxSWhMWEhGcEViNXNKUkloekxXeWJIT1VvUTZLU1JMSG1pWkMwdnFhb25QdzhSK0F5SnZCK0hnWGlZQ0s3SDRsazYwcXNONGxvSUVXM01kcnpsT1UxMjg3WU9KTTZPT05XREY2SnF0b0k2bE5NRFV5c09pTlIxUjZ1c3dsdmtaSll4RGVKaVFvRUIwQ3lBcElCR2RIT1NKM3ZsM0svWVY0b3R3ZEpDSGpqNFlvb01OaHVETkFlK054WGc3NlBEeW5NTFRJd3pqZ2NmYXkwMnNPUWFIMGVGbXo4YlZPUURqNHV5Q2NiYlg0ZVRqZ0pFSndmYU03NmlMU2R6bFFDbitNWCt1UHVhQ3M0K3A0Q0k1U2ZhRnlyRmdLM1BMYSt5OERabldPSHhGb1h4SklaVnRDS3J6OGp6bFg5TlFDdVRIcU9lRVljU3puVXdCaFlYU1dnaEw4NURYaFBOaEtHZ3RlbTVXbEVGNjBLenpqUG1YT0cvcksxdlYyeWMzbXJHSllYNVdRazlmV3J4cjdqMjltL3BGN2gxcTc5N2xObWZyZTdCV1BLRGMxcjM3UTVpNytvcGxtbEZQNGZsTFR4UUxHQTZPMzdob0J4MXhCMlo0N3lvdllSa0NCT2NmM014ZitGUUdiYzRMOEtsMWxsWT0pIGZvcm1hdCgnd29mZjInKTtcXG4gIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGO1xcbn1cXG4vKiBvcGVuLXNhbnMtaGVicmV3LTcwMC1pdGFsaWMqL1xcbkBmb250LWZhY2Uge1xcbiAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgZm9udC1kaXNwbGF5OiBzd2FwO1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIHNyYzogdXJsKGRhdGE6Zm9udC93b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBQjRzQUJJQUFBQUFOK2dBQUIzSEFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR2s0YmhqQWNnV1lHWUQ5VFZFRlVWZ0NCREFpQ09BbWZGQkVRQ3JBMHFDUUxnUmdBQVRZQ0pBT0NMQVFnQllVR0J5QU1oaFliQnpJRjdOZzQ0RHhBSmJCNy8wY1V3Y1pCUEFlOHkvNi9ISEJqS05UUTZoY2sxVVNSRkNtcU8xM01xV2x0QW5PcTZZUXVMaW1Fb2w5aHdhQW9IbnNsWmxhUTBUTUhyc1ExTm9XQWdudEZXSDJ6OG1sMlA4RWdYL1RiODl0cGY0bUw3dzJZWXpRMGtwaitwKzQvejcwQ3kvQjJ2Y1Q2NDBnQklPVUQ0WU1BZ1FQa1lMV1RldXVBMC8zWnFndTFTVS9vQWRybS8xSEd3UUVDTmtxa09FbGpjMkZpNVFrb1ZtQmhZS0FzVWlkRzVhTFNsVXVVbCsxK3VMMW80SW5lcTE1MXByTkg2MWZ3UWdlUnllMFV6L2QvejIvUDNETi9CYTArYUdnSkJEL0lKRW9EanJuMHpWOXpuMjhoOUlLN0FmeE1teXNja0JFUlVSV1M5SUh1K0t1eGdFWmRxeVNPYi8vdkkvUUZnYzJsT09DaUh1TGQvNnlWZGk5aHIwOVRwY0JYL2JCbWZBWWVRTk5BMWwrOUJtbkk1WE9Bai9oenV6d0ZlNCtoV2dDTWovOHpsN2F6T3lCV25HeXp4Z2xubnVXVWlrNmhjdE81S1hmKzdNRE96SUtIdmZNemMraU9xQUJLSElxZ3VNSUJIRk1WY3RHRmhFS3U3cHh6RzJMbnBuZlJOU3A2bC9hZHI4bVRrdHdhYmpDcE1hNU9DR05VZHczKzIwVzhxZ2RuVWxMZVBjYXhPVEF1N3hRdVVRcmF6NDFCTUh0WTY5T1FveVpPME9WdkZnRUYyVUJ1ZUgwSlpHN2ZMSWdQa20zTHFBWWhjSUljWG5UQ0RmTDNnNmxWSndZRzZPOE4xV1VBL1ZGZFVBclFQd3B5cXdINlowNk5GcUJEQStCWEJ4NXZBTmlBQmlrVm16QTY0M0MyMXJvTzJaRUVGcHM0WWVTOG4vaG9RTlB6V1RUV2piWnhyL0Z3K2trb1B1WFBwMjFmaGVRdEFLb3lnZUJzVlJ2czJ1dVhkOE5zdmphbTdicmU1c0plM29PNFc5ZGFpa1R6VHE4TEFTTUZXbEZscjZtRlBwOHNDUk5MSGJ1N3QrYTNQRFZaWXZKSFBpWi81dStwLzB2Z0hDcFNZRHBaT1JSMUtrZnhDWHVYbmxjRkpLdEpXTEtSSkNXYlNlWlVKeW14NEg3SkliSXpHU0dIazVPbEx6bGZwcEtyNVhoeXUxeE9IcGI3eWZOMWRlcDJQV3lGM3lZKzE4L3IxSjhNdTBoY2lsTzBVeFZoaU5hT29lRHBiRCtCM1dRbXBUSmhWM3pjOUE5TUR3SytLdUtJbEh3OXJmQVBpWmFaQ0l3VHBVeW5FY3RGS3o1blgzYjZ4UVJTRW1xbThLQW8wTEVFRWltTm02NDZLV29oajFlN0ZZSWl4U1Vremw5eGd4ZzN1eE9HNU1FNmpOWUdKNXZsUDJSUE9ySDRtcFMwd0J2MlQ4YkZ6a0xYZTF3V0E5RzBTOWs3R1NzR2tIS0M1VktpeWFhTm14MUl2T2U1RFQ1STFuZUZUTU5Kd0w3WUZ3dGl2c08rTlFKNExoMDdsbGQrYytiMkpGdU9ZdHJFVjZBb3NFd2FuWlFsSkVOTHpNZXVpbDBkdXlaMlhlejYyQTNSRzcrZUdFS3hINFU5Sjg1Y3VFSUhrc3gxTUVDVnpNcCtidjVVTkxmRE01WG9IdFlYQndEempZMjh4WWNqcHUxcFAzcnRjVXNBSnNnVEFHZ0pBQ0RyMllzQXNORFFNMjBKZ0lNendmR1JRenZWYUJBSUFNODlORFVJQVBRUHVQMGcwQUNqMmMvOVZicUl4VVUrM0N4bDdldkpZQm5ZQ2lEYlVGSzAwVHl2anlNV0h6V3gxKzFOZTNmT3pQdlg5YjZ2WDhtdjRsY3Z0R2dLdFZVMjdoaFhiWUZmN3NKcWhSVDJiK2FOODFxOVE5NCtUL0praXIrVDMrUlgrU1dmODRsdzd0R3BZTzFGSERiWFN4SVVRUE9UZUJ1clZ4b05NcmRQeFhWTUhlS1RDSDVnb0lMNWl6R1FtTE9Ib05taXg3bDhab1pwWFl5cnIvdWdRVS9vd1dpM2ZVWXRhTEJvV0x0REJ2UnF0VkJtc1lVQmdtWUQxY1RNeDZ2Y0ZyYkJvWis2eTRnSmMwNW8xS1RUb0ZsSFBhRXpyUVo3R0EwcFZHZXZKdTM2akpteTRKZ0dMYm9OSEl3Ri9sVG12U1paNTN0aUc3WExRVVo5aGsxYXRNdzN1V08wQXc3ck5sSVlSQVNCOUpwMTZ6ZG0wdkVCZ1lPM3UyZUVsdU1KWjdGYWcrRzVjMmJIeGtSSFJVYUVoNFdPMmJYVDBOaWdyNitycmRGVlYxVldhTXZMU2t1S05VV0ZCVmtPeThVOGhwY3Zuais3S0wwOFBmOTROaDAvZWZ6bzRZUFJjTkR2ZFQ5NHV6all2eXhQYVRMQXJkWEI1ZlVzSmVuTEhONmgyaUNISGtDVThuRXc0d2hoTEhZMGtVN2JXT3NOV3dSSTE5bXNpRXZ0cFhvK2tHY0pBVFQ3L2taVEhvMUxvWTYyQVhrTnpXN1lzL3cxZk9aVUJBK2NHc011MjMyRVI3S2hNUm9DK1RIU1hwbUFXYTN1VGhDT3FnZVQ2SGgwTmZETEdtYWNaM1FkVzVaVldGY3lPT3FiaFZZMUw5dGJUajN3QUZVNTV1UGF4Vk91Q0hTVkF0dGUrMzVnSGV5dzNtaGE0WHIrOHZLZUFteVBDTnJ4L0lsb1gwMXROcmYyUkhqZkhhTjloU1h2cStZWU5maUsyRGJxaWRGTUJmMDBsMEwrM2tJcFZRN1k5eGJsVnlZZUNFMmZMcUFkQWxrY1RJWVFya3liemlieWlZbHBLdDVVd1ErWFV0N1JzTjZyQ0F0czBLVkZpTENmS3pFOUlRMk95SHlnTkdURVJNcm9SWVl4OHcwdXdRUWdkeGtrVk1xeDdoMm9zQmYyd3hHMytFU2llLzZyR25tZWtNV0UzekpxRVlaS1BLbnNVdmwxMkxpcHBPUW1VNk9FUjF6U2VaeXh1eERQOTI2dUI1YXMzM2FwbE44eUhOT0pIWEdLNXZJVkd2Vk80bW5IZGRvWmkyQ0hJS29GYi9nYUNVNnloakFWdW1vdzFvUHk3VFJvV0hNazRaVmhudzRlMU1jN0tjOWJJeDBZbDgyTUxqWk9uUjBmbk5ZM3FHVkZMbTdJTGdnM1dIQTMyS3NNNllBUG5zWEZPU212RzBpT0ZoVmRIVzRRSXNJdmhNT0poVXNrWFg0bnU1T0lkVllueGFxSnRHaGlUN3ViM1RVMWlwYUJEbnY4Sis1d2gycXZ0Y2R6SW9RbjhzcXNmWVR0SVhDRUxKb21TVFN0OWJXOFVhZE93clJyTitxamNRcVAzWk1MZVNHNmtMUWFwTmFXajRzWWI5SzJocTJtUDdVWWJIdHFyeU5WSFVKNGNGb2RUMFZ4UmxZTmNhUWwyVDJHZEFRczhCR1VKWDM3ckJUTjd1WkJUZVY2bkh2YW9VVTB0UEJHMXhiZXJyUWI5UnhRTnJBOU1MRlFjSGZYYnJHZU5xNHM1b0huZDA4TzIwWjMrZ3J3ZFVBSUJqeFVSUStZbWpyT25hVVRObDdVMjRtQmlWaGErdm9TWUhiSXVKVVpGcVU2UVRqQjA1cmZlaE1sb2tqeEpGcmZGOGJ1RjkxTk9rQzZxelFNUEFuZHhlSkJnNGU5SSs4cm91eVMycHh2OEpZeUdqM1U0MnFiTEh1eFp4SzYyWkdITWR5YVpHNnNoL1NSZVcxc2ppTDNySlluNGxFbmJoOU1vRVd4WUpjWHA2ck1VdkRBQTRIbWxEV3JvU1pwSFdzVzlMbmlTVkhJWXBkQ091cENXb0MxN2xORnRDaGV4UlhiR3p3NnZldDVzTytvMGcyQkJRRk9hRlZVTmFtQzYzcDJFWlNIOW9NRlVNL2pqdU1LdHEzTHN4ejRpSSt2bmdGSnEweUhyVWVKQVQrQzAyb1ZZNzZkL1VLTERtRXJPQ2gzcHZzcmU3T3VYbUtyeUR6MnR6Z1BqaTBWMUtWeVZ0SGN3QUZpQUpTL3lkMU1WdXdvTDEzdjR2R0lTMXU3N3NFRkU0KzVqSEhqTnlkZ1hqQkxsaEZFeW52aXBmbklOUXZrdkVqelpTNWxLUVVRSkRVSUtTZ0UxbkRXQ2J3SWMzSW1CbXkrZVdBc0FJUmZtalpqSzA2WlFxblhPRU14TXVwUng1MFlSaEpSWGpMeTRBSUd1L1JJK0U4WUR3R295UkhXVkRKY0FaTlk0ZDFYSVJpUHBqV0V5SnMyVXpWSEUyUVBBb1BBZTlYU0tBRnFLbFpxRExtRnlWMGJOd0EydXpaVE1UQS9uQ1lUS0NLckFNL3lNNnljbnZGY3FXcU9lbzNHREFGMlNyZ2ZPeVRyY3VnZWRMKy81TWp0RE42YWFGR1VhREgrMHVpNkVHdlo3aHJFNEkwalljRnByMWorang3MWh3TUQyWGVpdk10WkZ5cnN3ZUVNS1ByNXRwSlprRlpnR2N0NytGZEdib3ByQ1lvN0UxTlUwK0dlcUswNFBxcDZEQk5oK1pLZStVU0FtOHd0SEJ3aDRnQ3FWVHpiTDIyd0tOc250bng5V2VieFhIbEt2d05pSmlRa2ljeEhYaFFHeEJUR0ZFZ3RBWFlBNzNxUDQxR29qQ0prWkxvV01hQUQwU1B3ZTFOL3MzUktROGk5dnlHVkQwZUEwSjBEcmZxMXliUjEwamwxNXMrb21WZVF1T3VJUnJDUStxWDFzZ05tMVVyelFKTmdKcm5JcFdWV2NJY29MOExrMy9XYVhJMElhV2tvQU9tcTBmL01LRjBIQUlRRnJCbUpjVUxEQk1pOUZ0ME5ENTNvQXJjVEVZRXlXSWNIL0t4b0ZBUGNBK0VtRmdRdmVaK2xzUnVWU0I1dkpsc250ajBTVHdXRXUrRkx6NWM4dWl1OXhYcFM1RTJGZUZxcmRPaUhjUFVsRUxJUHl5ZkZtdDY5RVhqRk5lcGFtUmIyVHZjdzhqaGlGWncvUHRBVTFoWmF5UURTZ1c4WEhrTkVYUG9kVjZIY2QvOGpvVHdRTHJaNy95QVFhTG9HTStTSlpFRE84RVU5dWpkNi81NERleWJmZ1pmMC8rRFZvRW5sN1VZWXQ0RW0ycnh2ZnN4OTVJcnZLcGEvOFNuWVhkZlM2d2c1a0JkQk8xeTA3VkFnS1dnUHA3WHFJQ0tlM1Y4WXI2YUQwZVRMK0FEVFVyaWcvRloyNjBjb3gvOFliVUtRVHBEZTZ4N1VycHAzMUtFS2dzRDFOak5tYW0xeGhuZXIzUS9xNE8xTGRWUktmbHpMQk8wcHlFN2FpYXFpQWN0N2pyaWFtRUw2dnpIdlFQTURuZjI1ZXRpZlhVb1N4TnNMS2lyY3oxOWFQOHlvc00xZldXd0d3OXBuNHJNWFlCZFRiM2l0N0NDS1A2bUpjOWtCQVJHNkNqNUk3bGQyYWRHcFliNUQyVC9RbWpwVnM2RXFyTTdZNitnNWVzcnJ4REZMdncvcVcwQWJPNXFNRzB0WHZ3a29qQ0JQcG5lbWJ1bzZXN1lJck80TFpndmNJand3Z2pIbWpHT0RRR0JJYUJHcGhUdkwrQVRyclBjZUFLb09RRFFWZ0pZRDRGY1Fod0ZBVVo1UGUzNjRDeDdkTjdyc29WRUlGSmdjMkxIVkVKUC9xU2ZUZWRUblBCOWZhNE5qVzRxamNEcXF5djFWMmVudzBhRjJsaDZYeUdTWGJQeXpObmtRWXphNTJtd091V2RXcGtFWmc4Y2NqOTFqcVNHVnlSUzQ5TkxrbllyTDdKdWpMSm5vS2xCSnlCcWRST3c3S3ppNkJocE5wbEJ2cGRtTWJWMk5QYkxxTmp3T0hKdHlTc2ZDY3VPYXIzcitBYmJWYkZhcXMvS2IrV1NvY2puK0dsYUJKcW9lVklDM1RTYklNR24yUEhhTDU0aFhrdUZISnY2U2lhNG5HREpQM3ZWZmtNMWhBMUU4OFFybGFwRU1rQjY3NFZuNHNaT1B2ZkRFS1Fud001TjQ2TFRUME5TVTZtV0dTMlo3R3ZNM25JZFZTWnpBMm9UTDBTZlJWcUg2Y3VPYVltTHQ5VW5NckN3b2Zjb0VYSFUrc1lwdE5ZZWNNaXNuemVaWnhMNjEzTlhtS01wTGNiRDlqZ3dGbTNvVmFGclFaYVUycE5UaEFzTWtsWGh0SmU5cjZPeWMySlhWbEgzUjlUbkdOWVd5Zjk3K2dWd3I0SmFqV1J5bWJpWGVXR1ZNaHh5V3BEajhJeE9rTHNXcklSVUIxcWp5b2xlMzNEQm9xcUtGc2daN1I4UlBPcUR6UmRBdzZYVGtPNWlaY1lHR3A1MzM3Z1dZelVyejZ2YkhqdTZoNi9GS2JOYm9iTzVYSGVYZVhQTU83dUR6OVNyRDdNaWFtS0NHampUQmVsQUpUWnBwV1lPaldHM0VZZVNxazFqQjVRbWxSSFNhcU9JYzQ5cWExNVNaQmtXbDhiekpVYXJIVmNSTm9xUm9OYnNRbTlFVDR1RVFFdmJ4UG1GbDNpV3pIOXdJWmFRK2RYVlZsZ1dsKzNkc00zMEJWeGxDY010eCtVdTNuWlpPQTg5NDlELzJrY01LYllWWmxxSmFDb212dElBOXUzck4xMWU1R3FJM2NwYlZqZkR4QjF0ZGlabUp4QnhCYlBvaTFaQUpOU2dXbDVkNXl6aXQ2UXArQnQ3NTVwaEtQYWdrWEZqMVNTdUJNdnI3N2Q4OEljR2tHWFhjeEUrRkNZT2pqcFBteWh2c3IrOVlTbFNTWWMzUWFjL0pzcjNKaWFvM1FIckkwRDVhQXdzT0N3K1JENGZ6STY5QUtVdHE0ejJBNHNSajdMTFo4NVpacHBnVXhUbWpzVzVUUWExbTVSdHd2UklrbU93UllIdmlTdFh4MUhQMGxHdVdnYXlHNTFjU3FvNk9nL3RzcG9wSlpUd0pzL2RHZitrSjRFczRSVlhHalFFc3dsZzBlMUhvcGJBU2dsUHpRU1YwdmhKVW5nU0VjMWI5UFFkVGVBaFgzNjhYMEJlRlYyUXJJZGhuMEFCSWZWdmNWUXJBdW1obVh3TEtxenhxU2dJTTdRMDRVSzhyQnF6ZTFEZEFvb0hRbDYybXEzQlprL1gyUHdGUVQ4MTlBUVY3bE11TDlJbnhqdWZQeC85MUtBYlJlQUhmay8raFY1NlpFQ09yeXk1N0grL3gyWVdMQ1g4Zm5yRjllSTBWZFRudmxidE1zaDU1VUNzVkUza1h1NXNVZURFM0ZhV3hPbjlPOGxNSWVCNnNhcjdDNi95TEZaSk1KQkVwQWMzYXBzWXU2VHBGU0F1eTRhVmcxOVpvY2MwQjJidkk2c1M5b1ZJQ1I4L2ZsSW90ay81dnJCZ1M1WFR4NC9MVDNHd2lqVGpkMG5mb20vZ0RaWmw3L0YydVkxSGJqWXlvVW42VE5xOUR1bTd0dGNhSTREeDl5MHQ2QXI2L1p2Y1JWcWVXaW9uQ2JmUVRNZGhOOEdmNEphSmtYUUV1UVRQV2NlM1hQYXB3ekxCa094S1JaaHQzQ3F0VFk4Qmt0QmNZZ25iRTJNbnhRanNmUEpaVjYwbU04K3VMM1VkcHhWV0JrbldlOENOR3V0YjA1OUhOZGY5L2ZUSzZ6dE1PWldlUGVGQ0hiYlpweFlSVUwxSFBuTlE4K3RzdWhNL0hLazVpZFdxUjd2L1B1di83S3ZWQWhDMmZsWXdpNGIyRlJEdFMzNzFXL3U0L29DeVpGRmUrMHRRb2FtcjhERmZpNlFXRi84Z0o1OG1DU3JaMy9PTzloeHhYUlFqREJwYzdDM0h4YXVkUU54L2kxKytrYitYaEdHWktwL0R6RFVaYnpIYTdicnNVUXF6UXVLVkI2cGRrckUxaVpjTU9LdEJlZFFHYnB4SWVxdnZ5QzF6TE90SDdYbk9uazVpVWVIem5nZUM5dG5Md3ErcHUyVVlFZUFzcVQydm5JcStFMU5xRyt6bVNKTFo1TTBUMkhid25XWGNKTDhmTDNsZEp1K3ZISUhXQVJoUWV2dFZBakdNZEhkempLQ1RHN3h6UFlvWHRPR0FiQm42VjJ5M2RpTVhkeFdvcUZyYVJ3d1JaaDdKNUlqQzNsN1ZFVXZuMmlTSzg1THZMMUV6bElSZWkvNXYvdWtyNmk5OEovZENqZ21WeHh2TWZLR2c3RE9KQlBiYkp4b2dPU2V1MEsrTmxaWE55QTZuYUhCeXFhWDc5U09lMGpRaXlkc0g4ZlhZbXlzcERES01RQkRIeFhNbGJjcHF0d3NNeHFvaEpxSyt5c1NYWlFGRkIxNkkwbUJCa0xWZEsyaHpwa0xmWkV5cFpBWk50QkpMMTM2cGRNL2I3ayt3dlh6L2dsNHBaL2lCbng2NmRkc2xEOU1iUDdQcTlMaEZLcll1OVNRaUJVTVJ4ZFhSSFZ1TGJDWkYyL1Y2NGJaTDFqUGVPa1RYVnJtNThIREd0VVZkRVk4ZFo4YVQvYjI1djdWL2NJQ0IvNFphK3hXMVBYclhySTladXJ2WXJtUEFkYWQ5OFZMcUJNeGpEc1lyQkpocXBUWlVyc0J4RUpOcE5TVGN5cmM3YkhFY243MTJJeXR6SkdVbVU0WFF2R0ZPN2Z6dTk3aE5GMUlhOEpDeXAzYjMwTjRjVVFySjFOTTNmRVc2UkwzTkpVMVYzRW1JMEw2akd6M0FhUVhGU0dVMFJJTjNnQ3VZVmhPV0tkalI3Mm91eEdkbUdWeWdqL2lNdEZwd01GaHp6b1lSNE53YVdaSmFOeGQvOW5PNFd2MDVnNndpUmhHcCtjcVMyY0hzV3pad1FmTUlkb2xNbGlNK2NNTWN5UHdoQmFKQ0RFVW43bEM2Q0dkZURFdy8xUGpIY1dZNnErTmlXMGdxUGZsVVY5UkNCclhQN2lDeHZRVmZaVWxZbDN4ZUFLN1pGZnFrY1pLUnZwMVB1SFVvZVRzM3hkbFBIK01tREMzbWZjcTlVdXpqUldDNUJONzQ1bHZGUktFcURIb3hJMktOeWNaNXhQVGorUU84N0hIT3FhbVpya1ZZeWx1dUZMWFhRTVhTdytnL1p4ODdTZFR5YnYvdFZxRFVaMFZiM2VtNyt6bHBDRGpsZGZjNHI0Nlo5bm1wU0xqM1dJNHpEdkh0bS9WVm5JL1FOMFMxSXN1Nk5DRVlpcnVjS0g4U1luWDB6dU9HeGJVN0pLVlFCSlpDN0w4RERxSHNhRVByL1FQL2ZMemRpSDJkaVBjTTlqZDQ5OGVlRWFoOTFHcHVLY0phczUzSXZCV3lkNnY3Z2NrNlZnS1Z3anRkT2JzbDVTN3ovVGtRMHZhUCswVmEvQTFhd1pQam1Md3F6bTFTRGFyQ0p4RWovazJNemF4UGNOdTU0L00yV3dHOC9qM2Z1TGY3bVVBQllnT2RZSllNWkYxOTdVaHdENlk4VEpmbG9mUStqdm9QZFVId2l5ajltMjZJczFUckJRK0RRdEpNbHc2V2ZWb1luT3llTlVQTk9iR2VkRG5VdlNEeVYxeldVcWpKcDZpbExxVFpDMnQrY0VFS0E4T1BIUWliSCtyWmJaczhKU1RoR0lsMHZCNTlDTjZ4VXRhZHBmVG5DaWdBZW1EU0M3UzNzV2VhZXcyQktHUWc0MkpydFB0VTljSXVjRzlXcHpSalk1QXd1WjNrU3pmMlNMR3NYOGI2aStINlE5UnRuZ3lJOUtlUmVxaDhTUHNiam82UVRRZzZTNHZmOVg5d3ZmTTdxRUhQZnErOC9hYXNrMllTb1BLS2YrZGZmL0N1S3RGM0VlVWYyKzZDOEtsTEVlMHB5anZxQitmWS85b1dsbEVLdEV3SkVDZ0xiMzhTcERuRWdpV3R6YXJva2VIelE2WlVWM3FGdGdoN0hlQXZ2S3hvbXZzVStqZVc5c3EvQ1JWRjg4SzViLzNBM3lKSk95YTNrKzMyaXJLS0k4ejVpYXBrUWFpeWRFSjZneU1ZUkt2anQvMFZLaVBkSUhKLzJENXp6UHJJdjNBMXR0cGl6Z3NjdHExZlB2ZGFxUlFFUGhmR29wVWptR2h1d05veDdiYjVYbVE1ZG1pSWRGM0ZXTDZmUGNEY2MwZlUxMmU5UnhqVDMxWVd5UEsxQWY5TTdqREFrcjgvMXFKOWwvb2NkVWwxSFZuZHY3UlMzTDYzMGQycjRnOFU3OWpLb0JoSjdvTE9YOGgyS3puUjZuT3dyaUN2NW5lZkM1Ry9yejM2YWxiTDJJbTIvL1J0ZjZsa1ltN2VyMjBzZWtQR3dLODljVkFEbi8wbU11dWNNbHd1QVFvRGgyY3hEbEMwY2NSbC9HMXhJZm1SYlE4ZUNrQUEydkd3Z3Rvd0lQVW8yWDNwWHQ2Qk5EOVdicTJjVWFlc1JSRkVZaXFMeHBnaG1yQThhVmtpTHZ5bGlMYTVlY3JZR1BPeURuT0pXOUFnMlZiNDhvemlwTk9VZ1NIODVRaGpyaVlqZHVIWGtTTUFWT1Fyc010YWo5blkzSDBRY1V6N1E3cHdUWlA1cmxuUDJrcWtOc0F0OUJRbWlydlkzY2lJclJDUDZ2YUVBQUh2MUhBK3o2WjBBM2NTMWozZEt5YmZhbDN0b09JUEhndXZBR05ES0NKbGltTHRsdnpudFlrRWplVHVsK1lBMGJqVTNBTGl1QlYwb2lKUklQN1dmOHZuQ203WGJiUDhLZ1pjdml2TmlzdStCL1hnK1RuYjlBRG5WcGV4VnlOOHE2NTZFS0RsTTIydlFOa1ZsZFRRU3ZTaFMyWXdSZXdTZ0VtTHdGdG1uSlRWM0tNQmJSdi9jbmdtcmM3S1dyZzFBOWZBMTZzbVZIR09CYnNMN0hjT3NVQWp6NFEyczFPNHlQYjdjSDY2c0VhVVRkT0ozSFNuVnkxclVhcFU3UkpubkhlT1JZWUNOY3d5dkxVN2UvTzVZRnNaT0lseW1FRjZ4UnpnTXRGQm1JTitGMUw0d0pCb2dleXREeHpSSGtNQ2R3eHNSOW5SZG9MMW9UemNYWXZWalBkN0tBRE1HL25odThLM3Z2YkZDV3I2S0xSVGptaVZDR2IvV1pFelREWktQWU1XM1VFanBSbjJrc01hWjJxNkNWTGNHZll4UlljbjFWcDJVeFovNktyMEhFbmNqT2tFLzZmYUY0eng5cXBSczhpT05Xb2w2QUpJU0ltVkVvVk1OVTljQTQ2d1FnTWhhbGVueHlqTEN5N01zU1ZPSXBta0Y4SlRERy9KNFY4ZnR6bVE2aFNNMW1iTWt3Z3lTVVRLTGVVNDB5NkJGZU4xOWVFT3RxcTFFZWx5SUl4UzZrMXFhVVpXRVZCamt2Z0hBRnRLQlFxL1BkYmZidDB3N2p1ZnhpamplcmNUMFZ6ZXVOakI3SDJQUEt4SldHbHozczZoU0tYUnQ2L2I2dU55NGdkRENmUjB2MHZJZi8zd29sZUVmcDZXZHorUDcvZUpJQ1JwdWRyWGFTZFZadC92Y1F0OC9mYnBjcHJydWRORW9peU1HUVpJQWdSQTE4bSs0dGpZOUw0cUtna0d1S1dVY3NxdHN4N1BQNng5Qnd4RjkwYm9qaTR3OFVEZVZkYnV4ekNLYU9VTHJ2dWtVUUNLRVFCQjZWV1lPSUFIc0pqb0U3MnFYS1hQb0w5QWs0UDNqRWpJYW9lQnZ5cElyT2lnQStYTkYwVUxRNXFWR2k1aW5PWUVBRVBULy9QNjVhMHZZOWg4dm9RMXdUbjl6OGZnTlBzVVBRNmNKZnpQakhzYTNua0pCb1dFQWdNQmZ4bFE4UUxIK3AzclplZXNXMUpySWltTy9hTE5PdUY0NkMzVkw1RFNPTzdTSkJtTVdZYVc1b1N5TnJpVlNJN0F6MUQwUXNYNzlTRFpLcjNhK2pUNDZQWmt2Nk91d3RoekpMMmlXSHpSSUxySTgzMXREMjJYWnF1WG1MR0EwdWlPR0F2aFM5UGUzZE1PRTd2Syt3ZDRFem5obS9QcDZ3WE9vZ3YvdkJQU2swSkNqa1kyRDRJckVoeUN5TUk0dUFXcDEvK1pTL25XdmNVaUtiMi9WZ2dDWTBNVkJIUXhNVG1RRUlETGVENENDQUZxYzIrOFFzQVdBendGME1iSGY4WXVadzI1ZUxMaU42V0xKSlVXOFdIRzgvQy9XK0lJWDd1RzZhcndhQWtBbUp5OUdBSWxjNVdncGVwKzdJUHJ5azlIWXlDZHFxbENwUWJWaVJUUnEwRW1KZzZhREM2TkF4NnVNWEF1ZExBZGN0OUlKcXV0NGlTVHpLblNRMnNnMXBheldCTDhSV2ZIS1RQc1RYVXBGaWxYSDBzd2xsTGNTNVFLSnZHSnFsaWxRZU9CYVhldUk0UHJsZE5OZGVYU2dnMVhVTlBQUlJVNDhKMjFiTEkrTWtQaVMzaXBjUEEvZnM4cnNsUGRDQ1AyZlpYK0hPb1VDeU9KK0IrbU90OTBsODhxd3FhU1Q5L3JMeW1jdWhTMTFHU0ViMWQwaThjTEVVQ0x6SG5IbEl2SmZ5M0JER1dlVzVYbkdzWWtDemMvaDJjWklyVTlNWVdlZnZ1OC9aNzB6ajZLMDNtTUFyZWZZUVBlaGRCMlhPbmVsWTY5TmE5K1V0alVaclhWVmpFdDVXc3N5Z0haNFVacVhEVFF0WFdtSFp1WGdnSTBjS0xUOWsyWGZjSXk5ZzJYUHNMSjd0T3dhajdGempNTFFyelQybG9iT291L2sxTGVaMUxYSHFHMHROYlViVFZmM1VsMWJxcUpWMmFpS1JoNmhiUUlwcnl4bFpaMVZXcXFTZ3F6aVFta0t2YTJvaUtJd3h4RUtja3QrWGsxZXpxWGxwdVZsY2xKTGRxYXlNcHVWbWFpTWhLejBXS2tEV0dtQlNvMzRNcXBvTDhwd0s4VnNDWXRJY1RNTGRsV3lxMTRteWMwazBWTUpmaGdSNzYvRWVSSmFySk5VakEwcjJyS2lkQldwVzFXRUtWOG0zTFNFR1VlUTczSmF3UFo0ZG14WHNHVXo3ODNYSnhNZk1ZdVJucVB1MmpPcEFpbVplZmhaSkV3SlRjeHdwWW04NGhGNjBXbGVETXNtejJONENyYlRCRUs2ZTdwREo5SDROQXZQUFFvdTI1ZkdZWE5vYkhjTFM4S2dxWVcvdS94bkxpWi9lemRHZ0x2RndoY2VaQ01PUVNQYm9IV1YwMmlLTjA3TFc1L2Y4MStjK2YveGphMndNWlRla0JmUWVDMjJldnRULzZWVGFGKzZoL2RDLzVjRVFKWXlHNlpvWTdhMDllazkvVVZaQUdMaGNHK2JkdW5UZXRHTnFxaVpqQkRQWG9EZXE5M0N2Q3FNUytoeDFsZ3FMeVFSZmJ6Mi9VY2Y0VlJ6aEU4WDVGZUIremFmbUFmR055d3AycHFmWkpkbTdzdy9pWlNEekJFVDNIa3d2OEFEc0thQjNhUVNiRVJHYk1YT3JBaVBMdkw1c0dnV3B2QmExQUE9KSBmb3JtYXQoJ3dvZmYyJyk7XFxuICB1bmljb2RlLXJhbmdlOiBVKzA1OTAtMDVGRiwgVSsyMEFBLCBVKzI1Q0MsIFUrRkIxRC1GQjRGO1xcbn1cXG4vKiBvcGVuLXNhbnMtdmlldG5hbWVzZS03MDAtaXRhbGljKi9cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGZvbnQtZGlzcGxheTogc3dhcDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBzcmM6IHVybChkYXRhOmZvbnQvd29mZjI7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R01nQUJBQUFBQUJ1OEFCSUFBQUFBTzFBQUFCdFlBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdrb2JJQnc4Qm1BL1UxUkJWRllBZkFpQ09BbWZGQkVRQ3J3SXRsY0xnZzRBQVRZQ0pBT0VHQVFnQllVR0J5QU1oaFliV0RZVjdOZ0xzSEVBNWxtYk44SC9IdzYwT0t6bWVwZ0luVWFNTUZXdDFUQ09zMUZGMkFhRWluTjFublllRW0wcWFZeFFKN2ZoSHFGcnFEamZTZFdJd2Z1bE5yNTlPMnRlWVBuMGFwN050L0hqcEJ1Nm9DdGV2S2lKVUx2NVh6VkNrdG0vZE4vZWU3dUozeERNOXliczRsTHRUTTR0SjI0RXNhQWxSYStmanFHQ3B0VHBxVzU2Sk1QVE52OGROYnpqa0EzVUlRbzRUSXdhenR6TVFHU0FHRW0wMFpqRnlzNVZ1YWgwZm45MHliamw0YUgvKzlBNzc4L01TM2F3aENRbkdOckFsbTZMcjZBbEsybTF4eXRRN0gvL04xZittZEJRbUE0b2U1UmNJVzVkaGF1cnJoOWJtcEl3cE1SaGJKKy9yRkQxUzMrVjBoTCtZOXN5dEtwRHpWeVZzd01jUU5QUVd2cHJrSWF1TGpKeGlPMHNlVEwrRFUyeG85RCt3LzU4aGFJNG5OSDhFa3RjeWkvbUMyNnlGSjhTVTFEeXcwWHIvNWFtZEhaSFk2M2Q1ZHFWVmdEenBtRVRFR1NBOXMvZmtUU3p1NzdSM3QwNzdlbHlVWEVya3J2a3V1ZW04em1sZFJaa1dIcEthYXlpMGxpQ2d3TlFBQXNneHFFd0FTaiszdDliNXdJeGRXWlhUUWtCcEg3dGN4blQrdUJxTjVaRFNERWdZblQvV2hzQ0Fnd2dBMGxlczQ1RUFKdlJRTURTVnBXeVlaZmlpRThsU2t3bHE0a2dnSzIxQmJjeEVBRFMvVW1ZTHhCNWt5Z0VSSUFEQUNEYnlMSzRPZjRDNFEvSGZsVmRvZ1hjZHlVeURTYStsK1dYVFB5Y1Y2YnZ5NTNEQzNPY1lGeUdCOER3elNmckE2TlZ3ZkNORC9jWkIwZ3pCZUNENFFUZWRQRkRTZ3cwRXhqMkw2THAvekpnLzQvcEFYQ3E5V0pzcmJ6cjRSTHppSlczUzJrNEExUDV1a3dKWWF1bGQ4b3lDQUQ4ZjVwMkNNZFVhZ3ZtNVFFUVpLMFE0SlpGMXJpc016QWVEcWNBc3VRZXBLWndRQm50UVhHK1NBS0VoVGFIUzZoaUprNWMvTVQ4aGZrWCsvREdCb2lCS09FY3lwaU80eGZUekorWnY1cGYxenBmYlA5dS83RFg3OFYvdjMvRS9hanBnK2U4ZTZuSnBFSHdLeXpQbDBzQkdwQjlyYjVWeS91ZWpmOTlhV0VWdmdHMmRZS1hzYjdNdU1oYkdJekJVZk1hQU11N0hIRGFyczh5WTUvdVh0OXF5RU5xK21McU5SbXpxTnFTRVNadEJ2WHBzWmcxSGNHRFVCMEdpYUFvSng1dzZWSkdiZCsxZlVaTm1uZFVqWFo3RFpsenlFTXlldFVhZEJzbVY2RlJPNU4rNDZZdE9xeGFsLzBHVFZwMDFDTW1mWVpWeExCOFRKMVdPbksvRVZPVzNQTVR0T2I5OTdUb3ROOW84RkNzVUZVNjdEZGczSlFqZ3dHdGIyNDF5NThtdHlXRm9mRWp3ME9ESGUxdHJTM05UWTBOOVhXMXhwcnFxc3FLOHJMU2t1SWlnMTZuMWFoVlNvVmNWbGlRbjVlYms1MlZtU0ZObDRoRnU0VnBxZnlVNUtURWhQaTQySmhvWjVaL29UallQNk96NTBiY1hCMmNyYW5zZWhFM0Q4L1dOTXdJVnZGQlVPMElldVR0Y096YkxXTnRNR3lod1dXN3ZpUXRwYzhpRjBwU2xVT1liUjFyT09IaHFQVFVsbTRBcDk5VUszQnR0ekJDVXdCRlBVS1I2N3RXdERpYkd5VXhvS1dBSXpJQmFpVHR6OENrWDlVbTR3ZG5OcUtmWWxTN3dPaDFiTm12S2czWmhxUDhhV3dhZy93amFlcUNJcW9DTlI5WEw5N2tDcUdoOUJCeEhYcWxLcENFdk1Ha2dxdjh1ZTV0UllnRkVVeko4emU4NUFPNzJlaFRZODlIN3pHU3o1WkNxTEt2N013NVBwZDZMUk0wY3FoL3FNMWFQNjR2ZlJVb2lCOGEvTStFRk1WR3lNY3lqa3NFMVNhQllHYUtXYXBjbDQ5TnV4Uk1wZS9ReE9NTm1GZjdLb1FudGNtRmhaQWdQL0JvS2tnWWxPQlVBeGs4WWZ1SkV6dGgyR2F3M2dVUUFzNnVGR2FZb0JkNmRHRG9QYjJ2anlpUERtWnNrai9MWVQ4aktBZmhGeC96Y0UwU09pNTl3dVJqcGQxVWhNSDRaaVRjUkJOOERDSFl0Y1ZjdUxnRDBOS1l5TmFOcGYvRmgyTThxRUJTTmFSRDFHdnRURldPNTdjekZrQnlTYkFTZytHUENaUEVGZWlKZHlsSFk4TlZoOVlUZkpHOVFmSzhNaHp5cnFzeTNjNUIwUnhLTkNxWEhENDN6RDA3S2pxWmUzekdGYmk0d3cxZ3NyL2dUb3lXR1Z4ZVpYOVZXSnlSUkwzUnpWWlEwWkdpeGFHU2s0WTk1N3RtTWlPWCtvRjZrSkZNUCtlR3F3YThzSUVZKzFBOU5FMWk5UUQzc1A4bHQ3bE56enlWUHA0VFFiL2huNWgxU0JBTGFFN2dZY05rRGcxcnd6TzZYcU4yaGlyWHF0ZUdvNnhmZDIrY2U0ZmdUSkswZ0Zac3FiUkk1VVl0YTlpS3pjUERWaXM0NXRxc2N6b3ZZOUpxQjJ4WDh2S01oWnhvQ1QwQ2x3U281MWxZbHE0ZlpscDY4ZnQ1eVJPZjlTUHBvVVV5dEFoRzRnWHpwVmE5cHE5RXRXd2ZVaUpYdFBVanVWaS9iVmdKTlk4OGI3aDNpSGcrNEJPUTYzUk1oRHp3aXlyRjVWTEc3V1dTMTNPcGJjT2lzYmUwREhNbmhKcmpZdyt0NThVcWdVa3Z2UkxjMVRJRWdmMWVKRGVVSjRkVnB6NHJnc3VibUllS1BPeGtNV293SHB6dDBSS1NYaEpSOEIxK3dWYU1MdWxLWTlLZDlLVmRTcGxMRUJiRzRLVGs1OFlHY05XSnN2QWNBVHNiOEo2WWRHMGZoUW5ZNEMxSTlxc1JTUTNGUURHNnBGWmJvdzJqbTlacGx2SDlWNzJSRnJ5blNrOVJrdm9uUW9pM1VobFdnNzlSV0xFMXVja0wvUElKNGwwNDB3QlE3d0VISlEwbGg3RWpPN2VhQ0lhQ3FmcXZzRGROTzA0cmlCZzJKOEFwSU80TFM1eDBtV216RFFIWU9LZDhBQ3NWd2Z6bDlTOGtUSVNPNkdESVM3SkR4RzFwdVlDT1FvV1B0VGlMamkwVjFLRXgxOG1ZZkRCVUgzUzRDL2NOeTVGSWcvSk9DaE11ZCt4S2d3c2RVKzR0enliZmxBQjFIalcybnBVUm8yN0dnZmJlQ3ZGQktHQmQrZkw0aUlWZ2Ryb2Y2MFNIMXBCVUNkUWdBbjVYL1RZQ1l5QThZYW9nbVRZVE4vV0VkOCtVcVU4Y1l1dEpCK2Urc0ZOV3Z6TFVxT3VzY2E2RUJUTTlBZUkrQTBLWVJoQS9MSEs1U20wd1NkNFRNbkhld3NSNWphbXlMem5QWVdRSVEraUdzajJpSS9wUVV1S3c4ZXZBOXBCd1JGWTJQZFh2Uzd6WmM0V3lJa1NNNGlDbVFKeXlMQmFyN0F1RFdJb3pSMXpINVBlYlUydy9Na0NHL2FWenNIT1FSMFNMdlVpTDBUY2REZWZlV3JhN1ptblFob2xRNzZRdlJmOTdkdjNCSVFIR0RxUTdyRG93OGliWW93QmhUNytVbEFBMkRlS2tidUtmQ2JRZDNqb1JaOTFNYU9Wd3o2NVVVeHdmcFgxODdZakx6OWoxYjNqQURYTXZ3Z2RGT294VGZLeEZ4NEFHdjMxd0s4eWRIb1dsc2ZXVkFzRk1EZ240eUVLTFVXVkRVdmdGZ1pqRVJBVXc4Sjd6blpEYVhvbnRlYkp5QUErbE82RDJidjdtU0JVSDRLLytSZ0E1R0xuZ1d6dVVkSS9yemgwbkd6WHkxU1cvL2pKY2VSdld5S05Gamxhc08wQk5GNlR0aUZNNDlUMEt2UEhMeThPQUxDcmVuM01jNW9aRlROK2dZUzlXV1JZL09vbkJBT0pQMklXZElNRkZ5b1VNVFhYcU1wNnFBKzZHQWlJK2wrT0hmOVlQY2Jqb3c2cU5XK1dmOFgwbUZscWRrVjlzNnJjT2JnZTRpZ293ZVlmWHNqcUVaV3U1RlJ4dUtkTWcxQ3VwOTJXQTV5c3ZBTFQ2S3ZOZUlaYUdBalpjL0hGSWF1Y2hEcmhuOUk0TE1kbkJzZW8yaW5XeHdvM2dSZC9HeUpSWHpreFk1eVlNK2MyL1oyV3dFZWZBYmJvVnNIUHZNN0NQUCtVZXpoa0twc2dnRys0N1MwMzlONXl4NkY4TWJXQjNLVnVYNW5lSVFYR3BkMDY1cjNqVk41TXM3MzZXSzVjbGVwckFJeDJHM1ZFWGlVUWwySEczaXlUdFdhcjBrZnY5VE82WkZnN0gzeVFmWjFKNkxramZVL2UrS3dyNHg0MGFUK0RTTDV0dkIyQjNsZjFtSDFzOEMyVzNYamNWUWNXbFNLT0l5OEFlUERqZEdQZll0Sm9KcGtLREFVZUhwSGllUk5NUnBlVVRjUFdEV2U2Z3lZT1cvVTdyZHI4K2JhZUlwaGtZVmpETW4xdE9IS1BjeVYvWWRSMUQwRnMrcmdGSFhlWHpRVkl4cVBDSHF2WXpyNkFWUVhLQmYzVnlzNlRYalJ6dXp3M0UvdzJTdzU0cWU4Tm1HejU1aHl5aFpxRmNuZTNLaC9qY0M3Rk5RYm5kV0pmcURVRFlJVmlKR09xbFhWclpja2hHeER4RlhLZ25aSWhqeDh5K2J4VkFBQXVJQUFZbzJMU1JPUWNBQUI0Q0FFZ0NBSzRDN0J2QTFBSkdLOERzQWZNWEFBaEFBRkpRSTJwQzYyMUlxQ0s0WnRSazBmK3NHOW10R1FXQkRrLzAvTUFrbklVRnd3eEhvbE5aczllSjBxaE1Ka3FoT0ZCcFZHdTJCWnZxeExXaUlwaGxTV1ZRa0MvWWttR09RMkVqV2syU2tpUWFWRHI3aGdPZmVPMkZHRGNMeVJKVVNKS1lDeEVqV3FYcmZ2TUdhbHJMTG9DWVBnUHFkYnUwcDJFTzFQUUc3bDRNMU9xcWcyVGR6bzlQazBUQ1VqeUZXQTJhVTRObWFYN1Vaa3JFbTRYR3EvbVNCNFJPRksvM0JpbUlVd0o3QzBTTVZNRmkrRG9yY1N2QlZDRE1SZTY5OHc3R3N3aUcrNGZEYVRGNHlXd05OZk1wN3dFeGdvaTMrdXZDdWNsSWtXRGU5dElYelZ1eHhzbEJNeS8wUlppQnhnWm5MajFWY1lRVzdvUTlqRzhObWpXeHVncjQxR241YW9BS1J1aWFOY2tUQmN2TC9KRWNXRHpXb0tiUE1JMXZuVXMraEVXSTErY0J3eEpFQ0tkL0dIZWthVzZOSVNhSjBVRUtVenlzZjVrTDRCaWd0MmdYZXJSNkRIQnc2T1ZMN3ZQWGlVYktsV05XU09OSlRnamlHejNvSncvZXVtLzVJa1BtWlBYVGg5VDFuRDBnV09qZHorNXBsTjRlcUhCaWRZS0ZhKzdSSVRuZjBBNXVoTkU5bWhWUytCRlREQzJYT1I3RWh3UHZ4T2U1SjBiaFpXckVTMnZYb0taRGNQZnQ3ZERTK041REtLd1ptTkxGTnpzZml5eFloUkhJZEF6a2p3cEZoeFpoSHBtUjNZbXFRWHh1elp0MXhwN2RzN1BwSVU4NktLVUhBV2N2cU9JMUZzSjBVK0RGaTNEM1padWFvaGRwWEIyVkZtbGNmZHZBd2JoOVFVa2t2dmZvdUlMRmRwc2EvelB1eEYxNFFCNGFLOWJXZEJEekJ2SEZ0VUNyUU9RTi9IOWk5UHhzcGR5TXQrSmlsYkYrT01NNUo0bGVGYlNwbW9WMzlOWjlSK2RSZDYvNDhQNEQyZmY4L25zdld3WE1sQnVwNVNzKzFMWVYwZ2oxMUk5ZEgvNWVsczZmQ0Y3Vm56M2NzWjdRQnBPNGYxWTZmc1ZmclQxenNQMnRlQU0yV09lYUkwaXUyakhNUEtmcXFKMHg3aXJ4enMxSXF0c3hZbk0wT3krb3RUaWNra0VkZWlwVG5xOWxFL2dscElneGJ4Sm5LSC9LV3BTVmtaTmVGaEhUUVNza2NRWjhTSDJuMktQOVAvL1g1WGxXZUpCdmRmZzNwcFNuaUJ6bk9pbzhyQzVFMlBiNE1YdUlkbWZXaDdQVXFZWjZpeDFYN0dTdXlpYjZsZ0ZxNnQ0VTZjayt2Y2VhNUhwOS8vVHU3QmlWYzBKY0VkRi96NWZrVDdNL1F2Y1JpN0xpaWwwOGZ0NnB5azBZTXhkVkV2aWVNZkdaWVc3Si9tSDVYdlYwVTR3NFF1SkNwYmJjelRaYzI5K2JncHQ4OG1YbHlPV0xoOW9seVh1bjVELzV6ZmtpRUNKVnFISWtlNTN5M0Q4UmM4OXlQeGgxTDl2bkhaN3E1YVgzOGRkRnBSbnBEdVRYMmU3anI1Tlk5bFdvYUVkRUlEY3AxU2tnV09JYnlSZm5VL0RVK3VzSzdmVzJTbyszc2xmMnRGK0pyMnkrb2xUYzZTMXhlNWx4cHFmOWFuenVyejZwUHJ1azNBckxydGdBYThuSHZCMmk0RjB5bHpwYWEwaEdYQmFsbTVwYmx4U3lMOThCS2IxVW4rSGUyWnZYUTkrVjRSZWxMVXU5dmJVODcya0gvbzAvcHoxRnVHRnllVjJBTGY0YnYwaWs0c2YrOTV3Y285NTk5ejQ0TXR0cEJ6NEpwNFJrenNRWE5tbU8rVXRZZWd5MzlmK2dvdjYrbzlIVzVMSjF1a1d5TXRHd2taMlhwZ2xrMHNKVXpSWmViWnJKNzcrZWJ3VzlxQk1EWFl5aXQ3OS9kd3hLbmNqWVdCdFBocGRWSms0NVhKYk5ESXkwbE1iTHZ2UDc3M3ZBOEJRMXEwOGlQTjB0ZGJxZWNxcDY3MHlhUENyUE1TSmNUYVFtRWlNVHpkT2RuTzg2Ylp0MjN6WTk2bngzM1B6MmtTbjY0aElrOFhwM3I1KzUwUzRCTWE1U1d4bTV3QzAyVkJ6bnlmY09GYm5ydDlidUZDZElmQkVFaGp2N3Q3Wk5yOVlVdVFsU2duWGh5aVg2M2NLaFBjWVRCdjRDM2JGMXZkS1VFbEliWWVuaGRzejE5MGhyWG5LQm4zblVGZnIwMVJOYnlOdlhhSnJrRGtOb2xIY1M4NjlqRGVkbjBSRkxMYi9Uc0RQR080SDE1WEU3bHRWTEt4aWU4MzhTSjk3Vmh1V0Z4NXZNQ3oySHZBL2VmTkRENnpCTGMxc0ZBekJtd1o4UDNjRjR2K2lLeUhUSDhnbW5JUnRkMXV4WXBkRzFGaC9LV1JhL0d5T04ydmRRbzd4aVpCT2l0OVUwUVhsRTBsOFd4M096MFlsT1JXYVJua05iaGJ1SEd5dFBKSlJ0cWdwaGp3Ny9qT2xpZEZOekc1SkM5K1U3VU9iV29hME1HK0c4ZlFrYzJzNjNRWVEvOGY2VTlwVElEVlBLR3dOY09LOXZvUWMrQzZPOXc5MzZMNHVqZHBuL093djFxbW5MVHMvVWEzYlRxZEVXTUl4S3Uyb0FYUWlpUllnRDRuYlZBUDJWNWJXdVc2VXBDZ3VWWmp1RC9lVWhlUXRXbDJ5RUVpdWRLcjdzNTVzTE1tazE1VTg0TmxPZ0VLU3ozdmtqdjMzN202aTRvQ1FLK2NzVHJ0b3psRThmYnROVnRQU1V3TnFEK3BNVm5hZW9Fbi9KVHBVbWgvbkg4NU0zdjdaem4xUWd6YzJlRkp3Wkp2NmVmWjZaSE42V0UxSldGRUhpNzFSTHQvdjV2UDR0NVkwakorYWZsckxSVUp6bUZXRloydkxTMFlFNTYyRHplbDNkbHJwelNObS9uWmtRN3hLYVo4aGp4QXl5aHU1ZStCVkxsYVZYYmx0SCtpUVpoUVhWdGlZR0Rlb1BoR1BZUzNNeXkvelZkYTd1OUdaWVlGVnI5TTcraWgvbEI3OGhPckVIaTlKTHMzUWd5Q3dVdGpIOFNIOWVlRUlFeTBBZlhub1N2TS9pcnZNa1hqelhPci9pVEE1SGQ2NkpVVjZpVFBhNi9kblp0MWtjemQ1eDhmeSt3UU45WFA4azIxM0svT2dMZmF6V0czT3NQYS9HOTNweExGVGNEaVBLVFJjNWgxdjJ1NmZnVEVTTUl3Z0EzQVNzZlI4U2s1azFOZ0ZFQUJUQW85Z2lZNTFEQnEzQ0UyQVMrS0hobEVDSDZxR0VNVVR3Z1VIT0VkQWhFcHJBM0xZK0FCRG9vaHRYZWxzeFFnQzRlWjdIcEd2TE5pU0FtK2R4c05mTlg1Y243UFgyZW52RCtJWThHY0x4ZU5IWVEvY0NLOEJZSklTVzEyVDJ4djZOZ2V4Ti9ac3c5bVo3czcyRnRtUWl4TW5ySDR5aWNVd1RRQmNERE0vMFRBQnI2YWtBQTk0cTZ3eHVIY1drR2NZamVSZ0JNTjZYWTJ2emtkQzJEanYzcjh2c2RmWjZlNzI5WVZDRFlENDRNeDIwZ2NHSlUrWnRnRTNFQTJrbFdvZHVnejZXQWFGbENLMU00SWFPbnlBTjdkVUF0ekJwQXlQUlFZYWpiWXpVT295eDE5bnI3UFgyZW50RHNnRmgyUGhESTRDUldxOHlRcGxGY3d3SktPdGg1bEM0Ykg0aVZEeVdDQmJqU2R0WUFub1k0ZUtPUVljeUhnV1BOSk94NkhxQXp5aUZvV3phRlRTWG9mUnl3RTZFQW1aSHN4bWJGaks3NEphSVVWK3hIUmZVTm1Gbi9tQnN5bUYyOUVsQTBOS09CTG02eTBnWmlxRjVqSkZwYkVEWVNPYndNR1R6ak5BSU9Nai9DQzR6bG42eU50RHczckkyZ0g4NFcwalh0em5acmh3QXc3VlcrQUxNVi9KYkRUTTJHWmh5K1JxRk5PVGxHY2lMT1BPdVdiMUtkeHB1Zjl1dHRsMlFQWFVwMWNYSkxLVWYxek4vVi9QNnlTWnJybFhyWkRmZ3hsMlo2MmJURk9QU0FYOU1jdjg1OWtlaTBwb1VvSjZQWm5XWW9XMDM3dU1EK3NIY3lCTFpReWZoUUgvU3dxL1BBVUh5ZERDZUJna2ZqTWZHU1RqcXg5eVo4dEg3bTl4cFBFbUxqTHB1QWtnNDRnSVZFRCtFWUJLSXhnMHJnR1FpNzFKQUFFMWZRcTgvL2JveFhpdHJYYzgwTlkyeFdzUDF4SzBnekZMYld0K0tPSW1RdzgyNkl5NkJZK3UwcVpVRENMc0NodGtWQU9FazZDRi9jT3ZBZm1melRLN0l0QTVDQWcwY2xJc0FUSHJtYUswd0xNNVRtYjJzek44ZEd0THpldVpDVTBOM0YvWUUyTzhaTnlaWDVEQU9yS1k1Y0ZBcUhMaW9GOVd1V2xtbW5abTliTm52d2J5ZXlUOERNdkRiTDFkeEQyZTBGY1EyVFVCWTZrQWtET1BnejVmemRIVWRtR1VRQWpxamNtd0ErYmpDUERkWTJ5d3QxMlFNRkFlMlRzalI0c0h4dDhKQ3VvWUprU2JHUVhRNmI1VmJDR2p6aFJiZFVNd0ZCSEQ1Yml6V045OWdFakxwbWRKMW5QMTlac2tvanZNY2VCdmFud2FocUNGQVRSc0VjRXlqZm1hWDZXYlR3blZrU21DVjJuVk5OZTExQVFmdFpobWRrT2d6OHFMd1BCK2MvQ1djZ3ZGQWgxeVkwZ0szVWtIWDF5NldvVkNYemVmRHVWcFY0YmFGMHNDSWNaV2YvRDI4RDRyOHNEUEdicGoxZXJabHkyU1JwblVVc1F5azYxeGVScGIwM2VGaFBQNzA0Z2RrdWFFZDdnbkZDS0cvYncwM00wTTMvL1RlYjRpWGNaZkVYTUdaRUY2MHFSQ0YxYWxZNTRpZVpYR0pFbjA0R2t1RXJuTHErc2gzZ0NiSGRlODl4ZVFqR25FeU8vU2RCTTY0SnJ2cGpZSjUvZ09qaldXbmc1bDFSWHlqdWt6M0lGNFVjU2pGQjB3MlRTQ1ppN2VIbWZMb2NESkF0TGZUVUpDRGFJcHluZTYvSG9BNDdoNndXMWcwakc2RWZnMlF2SmxhRzBZL25VV0lydnMyaGl1YWJiL3A1LzBCdHZQa205Mm0zM1V2VEVNSHl1ZE5Vb3pDQXpWVnVPQm5Oalc4SSt5M3ErMmJZQ3FaVzYrcHE1bWdJOHhNK0w4UzBIck1xSFhHQjMwd2p1bTNzd2pSZGY4cWhyWWIwZmJDZEkxTytnazNNVm5PekpxWTkzT2xKa3ZhWU1wWjB6VjZwcDlReSs0SHc4OUlmT1ZtSFJ6T3d2Qkd2UGF0RStXcHFyY3VZcHFoUkFDWFU3R21jL0ZmOGZYbHhLNWRsZVlxZkc3M09DcjZvdU41TExZNDY5THordURBZlVVTUllQXhCby9reDQ5R1Q3YU9oODlsSTkvemhLRW84QU9KVy9uWnpuUWZVWkxmekhXRlNKc0QzNTNwZEZWK2hYWWxXeTlZWDNiVXFQMFNiQktocTQ4YWs0dFBEVjk4S05VSWJ3aEFBQUFENFg5SSsybk9lZkEvSWtJRTBxeHZ2MisrQWx2KytxTDQvMjc3NzkzRFlGTURMQ0FBRElBZUJPQnZyTFZUa3JMK3BUMWorOUlxOGQxNDJDZHVGR0hqUVlyd3hsNit0Y1pZSFV4dGNmRjlWL1RvQzVlOFFacmxwQ09YUXg0anpWV0dkRnFsbzg4WHBlWkFBMW11NHlxbjR5NElBTDI5eURkdHVuRFlsbjFDenluZVZic3psZ05wK3pMdEJEWHdiNTd1YkZSNXF2RHI3QitSU2MrQnRmNE0xenBubkpkOUtnUUhld2NaSGpPUTRXeXZJTU4xbndEYzdBZjhYUWIrZkFadWZmQS9YSUlRL3YwL1RhQVBtdzhDQUI3YXgxSUZQTUFBQ2srakFHT2N0OENpdXZQQXJDYVBNK3ZqM2dKcENHeHhKSTBCbHE2bXNTRFk2elFPY0lPU3hnUHJDRXdUZ0dNSTU1TEI5cWk1R0FTQUR4MUxRd0NHTGtxY3oyNUxhN0RuSDQ2RkNMM3Izc2VnU0xVU0tncEtaZGg4ZU5Vak5xRmp5S0lVUlZycUVhWEpneXp0a2wrTkROUytWM0NQd3BScnFmUzhFcHh5Sm9VdWk4d29rT2RRVkZBaG5menlmQjRLdXRJWlFVdkR0bHhMUm01SWZWYVcrb0VoZEZCYUR1UVNUUlRPVUY5ZWlDMXVrM25XMWlvRmZIbndxczBLRWlORnhoaUNKRnN1ZEljWTdEYmhQUWxXRkpHQnA0cTlsUjE4N3dObVdCSmxzVlRCVkhoRkxIZ2U5SkdXQnhzbGpaNVNSRXNrUm1hNnBOaFFoYnpHeWIxa1I2WFRaNE12eDVMOU9qN1d1SkgwTTlGcjhHcGdOaEQ2cFZFdC9ydUh2MDdZWDdLdmpMMVA5bndZbjBkNk00ZjNrRzdiOGVvOXZKaDBlRUs3bC9HNHBGVUl2b3VHdTluUXBNTTBha09EbTFIdklYVWVQayt0SjRGemwxWGowdFZPZW45VnpqQ09IUjBjT1NhVU8waVpqWU45Mno4bE5sS3NyU0s3TnRnemg5SGJmZGkwRXEzbENVdGowV296V1NxelZwcXpOUXB6QWtzbW5FWm1Jb1dtUFF4TkVnd00zbm42QnBKclBFeU9rWkd0SjFsNldKazZuYUd1V0ZLMVR0ZlNlU1RhRzhTYUxVUStTb0d5d3JTRUNwMm1TSjVIb09nZ3IveTM0cXRJaW9xUnJOUWpMU2VKTXBJZ0pmRWlFaWU2SVZiQ2lKR1FhREdKQ29YaGRXZmhjVmRndDRWaE1YZGcxZ241TGRPc3NHOFpEUlVZRmdYOGxsNmdoNDdQZ2xhZGhVYk5nNXBQM0pRVFhCVnVLRFE4Ymt2T1c0QU14SW1iZ0VSa2dWZ2tob2hMT0hvK21qd0hOOXdVYUV6ODZqbDhMNWNPOVkyK1BMdjBjakc3SElwd2ZPbG90bjFwYTNZVWI4V24vUGJXVnJKdDJjbnM4TkxCYlBmU3preDNxY2FUK0NEZWlmL3JyU1lJNzZuYjZnTm8rbDlsb0xSemFXKzJlV2xqdGhkdnhLZDBlMk5yc0VCdDZrZmIrQWxmNVJyY3NMS3ljVG1jbW5QZzQ1eWNLTXYwcUlUWlhqYzBsdWMrSTc2SXYzMytIQTQzaG5oVjczOW1NS3NKbVNnYWhTek9HaHNmcWRQS09mZVJCc0lLdW1zVTBLcHIyQWdhNjhJU3pmenNLNEdWa0lRaFhyaXdVT2MyRlJQeGszb0dBQUE9KSBmb3JtYXQoJ3dvZmYyJyk7XFxuICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSswMTEwLTAxMTEsIFUrMDEyOC0wMTI5LCBVKzAxNjgtMDE2OSwgVSswMUEwLTAxQTEsIFUrMDFBRi0wMUIwLCBVKzFFQTAtMUVGOSwgVSsyMEFCO1xcbn1cXG4vKiBvcGVuLXNhbnMtbGF0aW4tZXh0LTcwMC1pdGFsaWMqL1xcbkBmb250LWZhY2Uge1xcbiAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgZm9udC1kaXNwbGF5OiBzd2FwO1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIHNyYzogdXJsKGRhdGE6Zm9udC93b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBREtjQUJJQUFBQUFhRWdBQURJMUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR29FWUd5QWNnaVlHWUQ5VFZFRlVWZ0NDRGdpQ09BbWZGQkVRQ29HTVNQeGZDNFFJQUFFMkFpUURpQXdFSUFXRkJnY2dESVlXR3g1ZE5XTmJSc1BnUElEeTROcGYreWdxU0FPUEl0ZzRFSUtGbGV6Ly8zNmd4aGp5VHdkcTZiWjFBWUZCcXFTMFMwckhpRzRseSt5WXE1TzNRVWFPQzVaL1lxT0hLQXpwV1diSGtXRkdwbVRKZlo3ZzFqSXRYUkFJQVdZUXgvQVp5YTE3dVlxdlZqTXhYUjNJcGxqSUx4YVUvbVBXUmZQcDFGZXdZTWVxWEFzR0JmTm1YanM2aHA0by84UE9DM0RQdUFQWmI2UEV2M3kvQ29rSjJWcnVEQnpubytiNjhQdzIvMXplQlJsR3ZlRysrSkVGWWpTclNKYmhvcEFWUmdkR3JwakRXQ2JiOTdQbzlCRkVhNVRWTTkyelQ2VC9nekk2RHRBQlMyUVpGZVZSMkVpeVlSMFp0aXh2ZWdDMldYT0pnQmpnbERKUW9pUkttNGd3R3JFQnM4NkttWEdicm5TUnVuSzc3SlhuUlhyMzdyM2Q0aUozRzNTdUl0MFFRaHJhQVV2bHZQd24xMHIycjMzYS90ZEIrektJdy9qK3cvNThoYUk0bkpIK01rcDVLUy9tR3dDUUYwdnhVOW94TEVUeGNha3JkMWRvT0FpeGZod3BESlhtL1FTQnU1azR3T2dBT1lSTjZRQTJUZm8welJlbC9kSldyK1lJNXd3a1E2czYxTzZQZ1Jmb0RFdDFiczBacEtWZlB6WndpTzBzZVRMT2hhYjc2ZjYvbVVDQXdCQmlkbFh6L29wYmE2YzNxaTJ6VWxUVzllOVNWOXAzWDJtbElPTmFxN1AxQUd3SXRnOWRBS2tDWU1OTUtrckFQVnNWNWpScVFqdmlBNEZDVERyU2UxTGJYbmNWME45cm4zK2Q5clZQbHYyajRGa0ZQbkErWm9HS0RnQkxhaHJwUGozNXZTY3BrV1VucG9IQUVOZ2V0SWRNZjlaSlpvR2dSUWh1TW9CTGpPVnl5OVdlcmJZb0tvYWlxdFovWERxYnk4c1Z5TEZUNXJJSWozRGZ5WTVjVi9JWVl4cUx6S0VxSzRIWVJXU0tXOXdmZjliTFM1SmtiZlBwa3pHNzIvTklMeWtTZ21SRlVoSEpPLzY3N1oxL2tBUkdkWU9LRTZ4OTN6cnRwMzBQZzhtVzdtWmJDbUpFbWlnbzFaTE0vZDNXSU9EQkNoOUZpQmZiVTVxQVlOS3RFMHpSQ2FZWjZEUE1GblBSQ1ZRNndRS2RZSkdCdmxTRGZzSjUvVHFUZnRNZC9iNG4rak52OVU4KzYxOTkxYi83b2YvV3RpTUJBOERtWFJjQlRrMEVKMUprNkVOanAwSUlDZ0FjOXlJNnVuZ3pIZjVVc3BkcU42NkIrMnRsUzFkejV1dU9SUnVmcnJlek5xK0R0K2FOQWVpNGUwZks0UFN3YnF3TVhSNFJUSmZCOHduZE9CbTZYZ1JaajVBSWIxY0dkTTE3aTlmQWtWU1o2cEwxaEJHZ0VoWDVQRkNJMFBmMVZKSVFaaUhXdzMzeTIyZC9mUEhYVjIzaXQ5dERUMk9NdGRBaVJZcW52OWVzUUhGSWd5VEpDQ2ppeEh2bStmQ3FQL2pwbzErbnZ0WTYyMnhINmVUUmhBL3dsWG1wNzh2cUtSbGpQN2IvU1BKeHJBQ2N3bVI0bVVjOE9tRUVLUXlVZlNhTVBTa0hZZHVJQnBML3o1dHRaT2tCTWhURUdsczc3TGVYeFJOdjI4dWJWeEFDYkh0dHhXWUNrUDg5S2lFVVBBaGdsK1JlQUhqRTBaS2d6aVBPb3lrTFFrY1N2Nk1MSGRKMWlsOU9kOFAzbFRoOFkxSXNqTVd4TzVLaU1PcmpiWHdJamljWlBjYXM2MFI2dHpRMHpVcy9TMy9LWkxLU3ZDeXY2dG1YYlRudTJmTDlZMm9zaWlVbnZRVlJGNis2Zm8wT3ZaRGVKZDJqZjVKK1VZcVZTckl1NHBUdDM3NGRzbk9rM2FzOTkvZU5mYndQUWR0WE8vbVgrNC9TSG9rZTZSNXVQSHo5b1BvQjZZRU11UDk1L3JWd0M4aDRObzFsVE9KUVQ3M3ozby9GTXVmcmlYRnRPUmtMM0N2NXBvOXNNZGRXaWZhZWVnMVhRWFRMa1Y0MFVFenBxNlRwSlhZYnJJMlVaSC9NbjZkUWdxaVZIeUxkZWF2a2JiT0xWallkdFRLWllvVktreXlhTGt6Q2c0K0J3cVdwMCtseWo2d1Z1a2JvZXpwQmxqd2xhZ1FLRXk5ZHNVcm5MYldPMm01Uk1peXoxUjVoWXFYSVVVQ25pbHFrUkdtUG9oTVhhcEU4Y3JiYTVtZmJLVVRVWnlxY0xsTytNbWQ4REpQLyt5ZFloRVJad1NjakRiUmR1RVNwY3VTckxoSFlkWHdHZHMrUk44dnVHWjJaa1o0V0hoWWFFaHlrM2JONzE4NGRta0QxOW0wVVZaVVY1V1dsSlc2WHM3aW9zQ0EvTDllUlk4L095c3hJVDB0TlNVNUt0Rmt0WnBOQnI5TnExQ3FsUWk2VEVwd1M1ZEhoNGlKSFljcnQ5ZEdTaHNsaGxITDdlRW1qZ0V5aDh0Y0dvNTdnSitJdXA5THRXT2VDWlFjUGJydkZxclRTQTZVOEZBcnpJSUJzUHR2bGpDOG5sVkJYOXdMVEd6Yy9ZWmNHYnVQWmJ3cVU2alI2dkM3ZnFiMVJxUGFWQWRKdmdXbVpBSnUwT0ppQjJkQ1l0eGwvRGk3U1h6S00rc0RZNzlteHJNdUtzb2E0WXg3YjlXbnhkQVgxUVNuVlRiTndHNWZ2YzQyZ3FCS1l1QW1Ed2pFZ2k0K3RaaldzNFM4UHIxQ0VXUkpCV2w2TVJUdUFlOW1lNmxOaGY1OE5HSE1oaFZCWHgxQ0VieUYyelVZbTZNeEo4ZFBtN0lzbld5dXBtd2JtcDViOFNraHBiSVU4TjJ3QU1hb1BFU0NPUXFiWERCYUQwNUFlRHJiMmVXcnU4RE1LeHc3VUNLaXF5WTJHRUNhM0tTVGt6S0JDWWQ3dkNSVWUxdUU4TWwvUm9lWVdOMEFJNWIzMUZtUVlsVU05UGhMK3dCLzZFNnJSakl6bjRsZWM4aThDQkFqZllxd2hSM0oxT3Z3Yjh5OWxjVnR6OGFaUFNnNVV6ZWxMQzBFNUU1NjlyVTQzdEpYZnRWM0piekhVY01iZVRNclcyM05wTnJxWlJqemJ0T0ZTSU1zUUhJM0I4akZoZ21BVWZpWmtJOUc2WVAzUWVRYkhPa1VTWGxzT2VlSUxlcmFibTJYN1V0Tko1V2IwZGV1OGI4OUZyL1lHSzB0eGVSZUt3T3h3eWIwWUgyRndhOFh3bWxwZUVhYjNSNyt0bzdLblBRNGhFK0diQkpNek1adVIyK0toZVppUlpGeUd5YnFGS0dsaHV4K1pSeUZKMUJMZ1pJTy9oN3ZjcFZlZTZRRmVFTUdQNWFuZGhBU3poT2NFbnJSczV0RHBYSGlsYURhb20ySEVkNXFOeTBuMjcvbnh0WGdFTHlRdHVtamRqa3ZMdE4ybTR5dzdMWC9zcE5NSnhMd0xmdWxMUkV4cTNVQlpDV1lPMnMySlZ2QVRjRXVBcmJ3RlZVWCt1c3dyMGZnZ3IzZ20yVC9XZmJSTWxwYkJhclkwOW5DbjJTZ3NNUTI3aVlsQlNlR2V0c3ZOc0hWdHpDTHk0Z3lCV1JXZDhHa21OZ1VWV2NBalVmUmJ4YlU2d04xVkVnVlB0QnRMcCtKb0Zld2xnRTBwbzg0YTE0bGpCR1laTDlQbXZaTUltbWlhaDZQbEVkaDBWUGFLM2dodWIxRVlPR0s2ajhOeGk1UEJWOCtVa084bk5TWGY1VS9hVU9tVHZoQkxKaitRSXBPVWJtZGVsTkhPSkF2ckFyaTcyYS9PWnFCNWprcDVhSnoyN0dnOExjU1dPSkR0U2c3eVRSU0RGVEZBTnZ2T3pvckkwQ1paRm1LdU8rNUxabHhKajlOSnR6NExJQXVmRWFpV1pLWFc3RTVBbldCU2pBckVIbXdFMkNxQUdWb2tXbUxtaVY1bUVVRTRTRGVjY0Y5eTFuTmF3MFJaM0FqUW1UbXVHZ2FjMXRndXU4Q2FDbWFFMWtacmd2MmZKMzlBazBUWUZUMkV2ZER4YXU3b3RodllWWnFNMlpaWDBiT2prbm8wekg2eUoyaEFEb0VmN2dtcmxoWllTa3MvOW5BNDVmT3VmWXZZSUhIRzEyelJibnNDYkJGc3FuWlVSZ1EvNTZWcHl1MElPajZLV3lyUnZKUUpBVlgrTUQ0aFBuQ1djb3hBcmN6anozTFl6TE1JNFdGSlk2NTBiN2FxYXNRRU92SkRqVWxBdEgvYUMrTU9xNUtxS3pZL0hOQmlpNXd3OTF6cnNZRVlqN0FoNGNXakRMZnJaMnNxUk9zeDZobWZ1TWl4ZFhWVUwyc1FHUmdBMFZJTEFiSEYxdEV0T292SHliVWVnSTEraENJNWJIOWxtUk5tVWlrRlBPdk9lS0YxMjNEWnVqcHFOTHBsOThBdVpmYkhnR1FoUnc2Um8rNkt3dHRMM21taXBURUdaN0xTS0xvVzU5anRXMGFoclJOaHE5Y0QvWEovTktnN1Nnem11aGNWUFRZOUNGZ0NrdzBnR1JTZnc4WUF5UWRCVTFIQ3Z4S2dUbTdma2FBd0U2b1NKMGVpblBMMHBEakFOaEZYazNUK1dBRHI3WDBlbXBEQkJ1TXFMOGVsTFZxeU8yTW4ySXZoRFY3eERvdzlLcU5RWGduSGZtVkVxZkVEbWtPTHRDR1JSR0lQTVBrQnhZT2gwSUk4UFpJQkFrQVQwWVBnRHA3YzdjRnhSME9WR0cxeEZTT0hlNFJ6b0VWY3krUmRaOEdaanQxRktQODVoUFlPbElPQzFDejhaamlBVFdLbFJxempZQzZkOEtJaGk5bGpWcFJsenQ5MmJSNFZSYVJqQ1hDZnJTdE9aVXBvYVFBWlh2SEJxaGdsSEJPWkNDUjdoWWk5N0FFV1JONXhnSTZQRTM2VU5RbndVYVZpZ0JsaGt2ZVltM1h5c21TTTdWeDJadXdHaEk1S01IdlhsQ1B1R0tyMWRXTzBYYm1RSUxSTWl5ajFBNjYvQWZCbVlmbHdJZE96RndadStXWkRDMTNEVG5pQWNVNXpOc0xlNmJkVndueGhYWmdpU3RjdW1KZGtNUGpiM0lLdzMvMmZidTZYMjM1YjUvY0g3SDdaSzlBcFQ0WUoyYWFMT0hJNGNyVDZScC9MZHpCUytuK01XY0ZNT1ZkSXF6ZElvdTQ5ZU1ZdmN1VjNJeXZ1ZlJYMjEwcjBMSUduUlJMc2pZZTBTVlJvR2hyaDBscnNZMlQ2czY1aCtDc1VYRTVYeG5QTUt1R1NpdnZtL3BXUXg3Y1lPVUxnVnBqU093RzR0NjVlb2xJVk5vSHRGM2x6TlZSZThNYTh4WFBBZlhpb1c0WjNHTjNJQk9rSXpOWHNFbHFRUVBHU0V5b0daK0R1Wm93ZmtUaWk2TlhWQS8xNVVaVWsybEpnVXNOUi90S1pJYStHM2Z5VjQvSVloajZRSEIvZzV3Mi9IclF3SDVuY1NDV3VaSThLZ21RNUZpVDNsZThuSmJQRzh4bUp2d0l0Y1Y5ZFZiSFp5V3k2UzY3UTMzNTlOTlQxUHdKN0MzREhubjdFclNNYld3OUlXbUZlbWR4ODNhbmIyWEZFem41bHF1Q1UxTkVRclFrbDAvOGdtMDFEQ0RWUUZibGNzbjB6U2Y1QmFiSFFKaVJOdHpRUmEvWC81d0FCVnQwU3FvRXluTWUrbzZBV0NkdmgvVjZyb0NHcm5SNGdBdzhLSUo5SkVMbGxBR3VEZXlwNU05NFdCMUhUUUFDMUw0ZFpSYy9MVFg2dmtkd0oyYmJDc0ZIWmExQ0hIYkxwZlMxYjRwa1ZUZm1aRXB1blZMK3RhazV0M3V2eURMMVVpTDVqTTV2eVorYUMxeFpwT2s0aFdkc2tUcExrT0g2dVFITnJkM2t0UXdVL0paZzJWekxPeGh3U3RUa2lLZ29udDBSVkY5bXVEeWs3WXpQZmhleDducFpsemlmemVvYkdRd0kxejRvbVQ5S0lrbEpBR05FSWo5dGNWUXI3bkl4azlaaFczU3UvVFcyZUpBbEUwOEw0UG91Q1NCbDRuanFtMUh1Z0VaMUZhay9pNjMvWWRGUDZwcmFBaTBLSDZHNkdLSUZjZGNYcXRuK2F2dW0vQlFFSzV6cGdwNnNPZVJScmtTdGNuc3YxWHVpcU5wbGpIcndZUzZoM1E3QUxsWXFtY3A2RGVhd3JqdHhUYU1DVHR6K1N6V3Q5ZGdKaEFqaHgraHJrZXVYa3dBemhNTzFzazlqVXhtOVhBYkdGQVk2dExISzBpTzNNdTBFN0s3ZkVjcDdEZE5BbEN0ZG50Y21XdE1xeGI2OHV4c0g3eXErc1Z5MmY3L0ROaGxMdkdRb05kN29uZ2wzSk9VTURML2RFaUpXZHlnMFUzajRnWE1qTW1IZDI1ZmRKVHUzU21UbngvZjM4UHkrM1RPVDZJcnVTcHRXTWdpN1UzVnpURmRYazF6OU43am5GdEp4bk5OMUlmVU5MelBOTU1BTmNSdXk1a01SNHAvdG5RVVptdDNyOHgrSHd5ZGlxTUlwTkJ2RlFReDB2Wm5pckFHcTF6S0hWNXhFbUdqTUZnenhuQm1ub0dSUzNjWTNUdzMwb0RuYithcEkzVzB6Rm85Rk5mOXQzbWpQcU9PWkJFeWpqcDJaYmV1UklSNUR0OGNMcis0bldGcS84UDBjS2RRS213NzU0UW0va0hkbkphbi9CWENQVWlUMDdDRTZvZ3J4MG1BYm5uaTRUN1ZkNmdNcGlaS0NDM1ZxdURtZU9NVXNQSmxnalVsa0Z0K01uL04zNndYSlJWTTd0eG9aYkNnajZzNzZyU2tGZTVTUktYcnROdG4zYWx3RDZaVGcxL1BTN0tJT05oOUZxNHNoMmZYNmJTSFBEZnhYeTNpNWpQbXh3bGErbXluWmIxMnNTajZaY1U1WmtBT2xkQUNpUTY2RlN0a3ZuR3ZYSXczZWt0bFQxWXcyOTlScks4UFBFQnlabDFwODRMVU9PM0IrQ3ZMNWVQa2tuR2JPVVp0WjVaWjlrWk5UUlpsYkNObmFmMGNxcEt6WUpOTEVGUFg2SVhaNVFLakNmNVo0MVZhRGNuVGMyaFA2NkxybkZVeExnaHo0c1o1cWVNU2JvbHBLMFVya01MQ2VxSXladGxRaklMR2x6ek1Rck5wT0ZHb0ZLUmorMHBkQzJuNHZ2V0hHTXN2VmFXcGdrOHJEN3dWZnUzcVNDelgydlFHK1pZS1QvTlRiNncyTlprbDZ5M0RpZkxIaTNOU2EyTHFBOVJ4N1draVVIRDdKMHNCOS9PT3hBUm9EbWxrMERDVXppTTRxQWJLZ21meHlvcEI1TjRsdnArTVdwYVI1OUdtdjhEanQ4OXdJTkl5Q0JVcEN3RFV3U3g2V1JuL212MU85OUhKTU4wMEpwYW1lZHBGeWh5TXBUWGZGRU5obXlRRysxVU5lUE9wc0U3RGplQ0U3dDVxV3gzbk1yQkV6SVBRMnBHSmJoT09rWWJ1QnBMNUEybGFPZWdQNk1RMjlvVUpic0JzeEcxK09sYTdLUmc0UTNacXJBb0tJNkF4eG1IT2h5dWVaWXljNzc1MDJ5K2ltUlk1T2N2cC9LdVcvRHh6WWZxZUdKQWszeTNqWXZvVmY0MFlGSVhqU2dEcjFVMURDYWJCeFZmbjlPK0c1VGNHc0dLVFZmL3Z3WS8rdXRRREs2S0xCMTlVdVQxanNPb0QxREN5QVFaUzllVUYyeXZJeHQzUlE4WmxyenYzd1FTM1l6d2Exalh6OFdqeDhXNU9PNytIeGpmUnEwQXhUaGtOUkY4N0ZubTVycFpoVGRxeVJQaytoZmREQ0VJSS95SGFFS3NjQUZoK3dWQ1VaNFJESDZCR2FBRnBVVG9jUktaQVYzRU03ck9uTTFZRXV1ZkNDMW1ORWR4MjVnTXhIVmZGdElVL21YU1M1amxmbnV1V2x0TjRaUys0d1poUDVMVUtxTnp0ZGEzSTZUb1FMVnpySkR5MHA0WUFabGE5bWVLMWk3M1c5ZGZxVHhKRmMyckFHRC9CTzRJODEwZ0Vjbm0zb1dMZ0p2S29TY2EzY2dmNmFNKzhKM2RXQzU2Tzh3WFk2ZmFkN0NsZnRaWmxtdjRvaWVpRll0TVo5MFdqeUVwc2JjUkNsSkxUS1U5dkJjdVFwam83RFV3MzV2OVB1NXhheU1yTHdJemxvVTVKd2JHVVJSbFM3VzkvQTdXWmxLNFdaSHIreHk3dDJFYlk2bFhhYkdPSTdHOTVvL1RKU1ltN2J0TFBxTHViL0dla0V0RHNoU2JxQ2JVUGVUOTZyRlpZM1ZlZjBUOFRqWEd4c3pyaVBGNm9TT2tRT1JaNmxOM2pFUXl4R3JCMjVOa0E0U2JOWDU1K3JVSDJxdXp0NHR3Tms4NVV3ek5QMXJZZzZvaC9xbTdzTXhuQS9oSTlBTEQvdHJkcDNiSDMyZyt2RzFHOCtjUzMydnNETFpsWDlKQ1dPOFZQdTB6dFV0VzhGY3NSN3ZXUnczTFpQTW9YdmZlcC90dzRGYTF2cTk4RWl2NDhQZ25WKzlPZXRobUU5NXZ1eFlFRlpVcTEvRXJqdU9qRSszbFJOOExERTV6M1lKZlY5eW4zMlpyZG5GSWZnazlEa2FjM0JjNHQvei93L1BlV2N0bDc1QnkyYVcvUzNIajlGc1hXK1d0YTN6ZjZnb2pobHJWZVd6VkY3TGcwZ2duZ2ZyeUYvMjBLOHB3YXhTTmJFYlZqSitVeDFWRzJJWXpvSlcxbThUYU1jYXVMTW13ZUtkL0F5bkF6T0VXUnlSeTlmcVo4bGgrUDAyR0hhaTg0TVAwc0dVTDh2MEs3TWZ6ejB1TU56QS9HVzhyV3VRRkhzaWNZVStlOWZBSWNqaDJzZjJ3aVNlR0xQa3hPc1VPSFFKSXNiTzQ2Zi84UlNPT2VGNzdqb0Jxb0R4b0xPK3BrTW5HaDNFNFMvbUFBcjl1eEVqMTBZdStjSEhxUFdnMkFnRWdWUDhXdnpibDRiT0JVeERMejd1cWYvN1pCbmhlK09kcHRWVFhadXFEaUNZOUdjMTdvSCtYc1BsNWM1UGxlNDlzVTV5aGxGYnc1c0t1bExRMVhDa1BxR01rWm1pYWVSTm84NmtaOFcwbHdxTitCbWU5OFYvNjNjclRHZUdLbE9EOXhhclA2UlhWOUdCcjFHMWdseVVMRExjR20zTU1EaVU2SDZvYTQzMndDK1plVFl5bFdYMSt5T0dFRVZSYXdXYzk4cmNpckdjYk9tUnR1cXIvTExTbCtuSmpPSnRUWGgvdUlRb1BraTZnV09URlByNERqMjdzSVk5WUMyM0xFKzQzK1NpZ041Ymx6TzVIays1SGxuclA5YlFGT2praDQ3OHF3MGgrL1ZsWU5Fc0F4dzJtZjBpd3BxV2twRlVJWkoxd1hMQVllTk04T2kra0pteHA4K2VmSDdZZlc4dGVOZVNxOWwzMDB3SFFPckVhN2NDb0N5SWg0Z0YzWE9MYndRUUtJM1VhaXBzQ2NVaFZLNGxlMCtUUkkrS2RDZ0FidUNOQm9sRkh5SnBWUkdRMTdvaVczU1ZPaXR1cWFzcUlpQU8relo5OUdFdysvbEp3anYwNzM4eXM1L0RyNG5RZmR5Z1BrRG81YzJwdEVLRHU4bWZkelBVUWM1L0FlNDNEalVNNnBJdmpMb2lOaEpmYmhvN2JFbVhGUkJVaWhKQTVLRnR5RmI2dDE1RHdwSTBSU2t4NG1sOFFhWnExdHRhdlY5UGt5bFRCUlJ0cENDYjNnUWZrTmxFaWNTL29CWHJSdGZsMFZyR2wxazNCbnV2YWNweUZyRGkwSlF0YTE2b1VPWXlxSHZ3SzRrSkJJdWF6RlcvRUNIRy9DNEpQMEwwRWR4emNjejUwMlpPRjZXU1JZcDV3UDU5S2xCMmo4cEJoUjJIL2VBN0JDaEpWWlFTT1U5cGFtYTBtVlNBZElIejhIcGxobndpL2VzUENtMTdNOTM5MG5DL2J1L0NwZTNxNmZYcks1Mkoyc0VYYzU5d2wxZ2dEMUJ5WGtGRzRpQStpL3E5amJSSytucUdXakhFRUJyb2RCY3owaWt4MWNNbE94OXZUN1RuZG84TTA2VGhRcklzTWRjUndhZkhOU1pueHM1MXZuY3VvWVJvQXZWR1k0NmRJZFRXaGFaSFQrVk9yOFFWb1dIc3VRbEV3TTlmSkppN2ZZdTl1Z2NLaXZWTzAxRURUOFg2bkYzN3Zxa09xZnpoQWRhbnN6dU03M2V2eTFzQ3lLRFFSWlRvekVpL0pUMVRKU0hXYWtNZWZybE9Ec0J2VStTQm1WRittdGdrQ2haMkhFYU44aHFRVm9TV2ZBcG9WYW5kUkdGbWl6WmgwSTRGcFN5Mk4xQzcrMHZyNFFrcFhMR3pRdjhhdkNyclF6UVdjamVkNm40NUF5b2U4SzA4VVRSSlk4Qkh4U2F5eEhwYnRrL1NEajBkOHVEcDMzVVVVWXhocXE1NzMxMko4Qm5iZ0RsU1R5N2FrVlgzaUIybzlKZDVkRFV6d0JLZ3RnSmUveXp4eVI5c2gzNXRxVnFtU0VGVm1DREJBdCtnSDJFZmVwS0VlWTZtYUcxNVV3MjBFRUFVRmpoYW96WDl2V2ZHRkZWN1pnY3gyRGFCckpJNzY1dVU4Ykh5UUM5azJVU3lLdDh2c1oySXl1b0s5UFlEajl3SGJYbzVyL2psanVxSVQ5UFhEblhlVkZhMzNzelBlNk8vakhJNzVYSmY1eTFsNXE5TUF6TWhtVlIxc0VjZWhVajhqc096eGlZNGlJMnc5cmdVUlpxUHBOOUlJSXEwd0ZIUFZRUTY5Z3BDZjFNRVJ6b29GaHUvM2M5VzhBdmNBUzFhUUlzeGZ5cEpDeEVXbWhIT0lhSm01V3d4Vm96TE5ERHpwQldPaFZ1R2pxeExaQXN6Ky81U08wM0kwRkRwaU90QzhvQUlrMitPY2FsYnlrL2Z0cUdtb1IzejdwSEF4UFF5eEJScTVEVlQyODZyOUlkSXhoYWlEQkZCOFNROElSQ1ZmbDkvKzNzbkd0MEx6V3pVeEExbHQyZVYzMmhLYWNucTZ5c3ByakM4SGxqcFVkdjdwNG9reU0xdGpFS2YzOE5PaCsvNTJiajdpRm1hNTIxeUF6NjM5TWNBZWFEVVk5RE1DSHhJYktiVUgvanNaMVpvZUxweTN3R1NSKzNlcGhEd3J0a0J3YjF2RzRYY3Q4TVZnNm9laitXRlpkUzdxSllob0RnZHo5dW4yWnZ2NFNBQVBrR1pjTmtuOXNCbHBQYi9Za3JHUnM5SUVUVE1wZmlYQjVqYlA1UGU0cHkrUXQrR1IyMzl5WlBSNHpSYXZaeWxpSWhUeUt6dm41NkZhUXNpZm5EQmtJcE51TDgyWCsxK252Vk5OaGtkeVRtR0lqL3VEbDN2blh2U0t2SU93N3lhZzhCOG9RVmtURi9EeVJZTkpwVlk0T3hOOEttUE9yYW1ud3hidnNvc3psQ2tySHlXMHBRUjEyVFRremtOcGdIMlVldHJ0YytyS2FYallkWlg5ak9lV2FiTGFpYm9ZdnBxNGV6eTdhWk80UzdudDA1VVZBeEZpTWtyT1JQTkoyaG55a1RZYmNWcWZBa2wyNnl0alp3SnVscmdTL1ZSZjM5T0I3djNydW5KSzVsQXBxaUttWjJxYWViT0lNK21CNGlvaDZDcHZhbWFTKzJWdEMrVGJ6WU96dW1USlZsWXVmd3VLUExRdW0vU2I3T1JsaU5uSXhGNS9Pc1FHd1FCNmRPcWF0VXJUQ0htZTIzNEZYcTJzNSt6NDUyMjdqVWtLa2xVT0ltMHB4UTFMZDVFZHowNkRjeWc2d1VaRXFvMk1pR2IyaFF3SU10UTZGTk9wSzB2UjN6RjBWOVVOUm9XM3F3T2hlTUl5cEE3RXR1UTA1VC9TMmlySmlUOHVvVFFUOC8yWDZ1UlptNWNNc0h0WDg1QytIczZicHlBdEYwcmZ2MXRDQ0xHeG81UHdydGhsVndRQUFkOGU3T0JYclJQRzAwMFgrcE54citzdTFnN2VNU1VLOG5DaVlTRkFLZ2FJRlo3SitFSmIrSXhoNm1henl5amM5NnZuNTQ0M2d5cVJLV0xTbjlLa2hLalpPUmt0QU5pcDhqNU5nVk56K0JicWE3QWhuaGIwbVh4L3ZHdmJDZXZzakJSeE0zTHNtejhUcGR5aSt3eEdYVFV6eWdVY0tKZW9ZRU1tbUs3REZlZXZpOEc1RURDcVJjSWIxN0N2OElrdkxKQmhNRXZIbGRjaHNDb2E2VWMwSjNhamZCTGNoR3M5OWJwUmRLYmh6R0hxU0dIeWN0clIvNHl5QVczOVFIYTVxcGNSR0ZXc3paaE1Cc0xURjJzaWFjMjZGTFRtU3FPeEVWZTMyZ1pJb0pBT3FOeCtYbHhmN3NjMXJ3UDhQWTNTZlM5Z2dBQ0lSQmU3amZ6am5lK3FCcStRQ3Y4cTE5VCtDNzN1R1Z5RjRkUUNkbTN6enZlL2FvR3VDUWx0aGI5V3ZEdWp3MDk3UWh1cjlYOU13bnBYbjg5amVuQlpHVWVWbUtBQ1JEaFJnRElLOFd2NWVCaTZ0QlFxR1ZOR1hCbkUxZ0k3VUZNZnQycVduQTlqNkRSd1Z1M2s5R1llWUF3N25mNjA2aHFSUml5OVRRQUpHRytveVVCbDg0LzhTOUlXMTdNRGhaL1AyQ3dWZXdKYkRCOXkzMzJkVEpyRFpSU1p1MGMrZjhaTHpUdDVjcGRJYU1kaERmc0JDOG5QK1BNSHdRZXprN1FhQXAweVJ3VFhsNEN3dUF4MlE0dG85VS9POUR4eVhxL1JOKzkvNkc2bkF0TEVxZWtFcjVmOS9YN1R3aTRpakQraksvRUgrWklPN2xvOXpsVSt4VUJMVzA0aVJwYjEvbWEwRjNGQzRzU2w2U0NadTRvaVE3RXYvazVmZXNMc0dpaDRmOFRDSzZucmdxdlhBdHhkemU1aWtZYVhkSEU1QWpQVlI0UnJiaTNyS0JvUkhCMnFPYzRFWUNMdVRWK0MrZElkZ28xbTBUTXBsTDJlTGRiZVdyRUN1bWNGZGlxVmpVSmZzTXNybmJ6dFgvazZtNXl1MVQ1ampsTGhwdUwra2wyS3NWT0l0b3AxRDFlODFhZWFyRlNwSXpTRjZMdlc2ckRWVmhVUWpIcVlwM0MvQlB3TjNNbUQ5V2ZkK3VQd2RGam13bHhUa0grRmZoYjVUWHp4YjVjclRsVlVhRTcxaC9DM3FUY0xySy9Hb054N1p2VkE3cTRCdEhCQ01wWjh1OWlCRWRyNTNwTGJzSVAzenJ2Qjk5NndMZnhSTmJNSkF0QjVEOUcxZHV5d2FIaEcyMGNnalQ1OTg2Wmx2KzkrYnRWd3pXcjF2K1E3MTQxQkF4aGI4Q0t0RjF1dm9TaENmcnJiRkRZVSt2cGc4WDZibmU4aktFSzNqNFhHaHh3T3dCdjNvVDdHL09ON2tjTTMyU3JzU0E1ejFERTkrN0tsRzl3UC8va0RSYnMrRS9ZMGYxTk4rNmt6L2JjTXR0bm5aWEdZM04ydDErTi84akpIaG41akhQaDlkeHBady96U2lrbTVkMzRaRktNR20yUHluWmJVbW5NSnpFY1MwaWNJQ1NUTDFZbzQrazZVbHdCTEIzNGZjajd6aEM4NWY4UFlQL1NNWXhlY29GL0tsQ0NyZ3lXV281bUhLZXB3STk5OXF6N0lWbVBjY2pRQldUL2doREpmTXhGZTdhMXdCSzUrd2E3WEJqMEdtMmpzcC90a21XLzRqMzdVbklCRUhiQms3MHZGRXovYlNTRkowejJGYjhjZnU3bHdLcFhjR2RlZ3JlaStqc3V2R0t1Y3EwekpaaVMvNTJ1eE1YS3M5WFE5SUNTZE55WjFNQ3F0UEJ6R2VCNGk1cVhOY3pkUTQyQ2RxekZ6WHlVVlhpNW9jMzI5bUwzZDVKK28rc0FVTFNmeFM4TzBZc29CWEpWaGk1ZFRCZS9Yek5iMVFBSDhIdmpBdDMrQmJObGRkK2NadjcwbFByeEV3R1RRZ0tGYitCd3Z5M2VPVllVeE5MNGxoeE5TcnJZMlp5VWlpQy9EazVCRE13MkcrZU95R3Z5UmpYNklVZDc2clZML2EzQ1hVWmRialJUWU4rVDg5RytsdUZyVTVuZzF6S1ZCTUdNay96bEozQVNXcFVRRXJUMUFRSWZVVWgyZm82RU5janlMRVd2QU5IbVRmOSs2ZC9vS2hKUEszK21Cd0NCd0tFWmRsUHpDdkZIeFBrdmlnVlpRdVdBZHc1dGtySDg2anQ5bkM1UEUrV2FzZFlpOGtjUDU3S1NLNjBTSitFcTUvR1RLR2ZhNG14MVBibGhIejlzWGZsVlE1cWdvKzhXNWQrc0Q5a3Z2ZjA3ejFncDB2ekNncnV5S0ZYalN6ekZ0TWxBczJXcXBmcThxdUpBVFZ6SXpOVFQzVStTWG1obXM0WS9sSTMxV1FjKzl3RDM4N0FodkF6SWJ6b0dBSDdQU050dlRVRitia3NVTWV6dWExNGpUd1d3ejBtQi93YUhGUktQL3AzbVJhL3JTRTlLZFJWWjRGQ3AvekwweG8wSmxCeFNIaE9rbnBLWGZ6WXVLMklyVTkzMjFtemJPYURiczNmbnAxRk9pYm5PUnorcnJuUENnVURRWFBvdkJSOVdlQndqeGU4VmtFOVFEVEhaYUZra3pzSXpqK1JOd0Y4alBlL0tWeVlsMVNtMHd3Rk8wSjFHQnRpMGdMODE5OXMvQjZzTlZ5U05WYW94aUE2Mll3bHN6cGFPMkt1VWx3YXEzNHZGN2RtbWJTR1NmTnA3L0FOaHYxblpEenpjQjJPVG5OU1lkTEJDMGo0anRwSkZMMVpWZWFuV1dZRmR5ejk5NjRDS1U4bzVnbEpmbTNUMWwxVU1jd2Urc2JqUy94Ry83RkNsWFRrMWtPUHdCOWpoVmYydTQ1TzM5OXFYTnZOMjVuY3VxOXlNK0N5Wkp0bWNlb3o1MjdpaUdCZGpGSXBOWXV0VXlFM1VFTmcyUzJiUlJORU4weGxiSzlRNDVGa1NPMEo5eTRwVFcrV3BVa1FmVGNBOWhVOXhEV1RLRk8vajFHMzJ1Y2FvbGlLWGdxMTF0U3BxN0RzVTZ1OUUrV0FiTkYwcHJBeWpaNTFOMUdkYUNjS0RSTGNlVVBjNmtoZVVIenNJV0w4MDMxTDRLdVFWU0lWd042aHQ2ZCtXeG5qcllHQU5tRFg4SDlnNGlWczk5R1JuLytJNHRISnRWLys5VXN1Vklpckl2cHEvdGJzTTJiMWZnczV6bUhQKzltbmZ4Tm9WdVgzcFNlb3VubXdrV0ZsOEJHaFlUbTB2RDJiQmMwRUFZb2JHNkJNelE5aGh0U3NnZHpkNXg5Q3ZCVUgyeUhpS2lJTTZuZkFJeVhvT2thWXJkc0JRZURXQnc5RVRrTndoampZUHFwRE5vWkNHWUszaFRqSlFBaVg4Z3puamxEUmE2NE4wbi9CU1IwZEd2ZXpiU1E3K0NkRDArbE85T2RRbDQzQkZlOVBodUt1WEJwSFc4QXo1YitGakpNbGpvbXlLc2ROTjk3VUNnRnN1UWFjQjMzS1pnTWdWenE4OXVCOGtGSmpBTGpyUlNxZUZQcGlSTzlxSCtJMjlUQVo1cVJHL0p5RDVVS3czOVlFU1hVVVBFM3ZrMXZqdjcrVGEvR3l6bE9DZHdvNlFGdy80OTBFNkZxZ3BkQmVLRnZON0MwckVkaHRlb0pJeVp5VVliQU5FenRNbHl1QVJSVE42ZkpTcHg3a2VYY1VoWTloMG5nT2pBOUNLOXFIK0pFRDI3Rzd1U1E5b1VXQ284azdZUkF0LytHVTY2WjIwcUNKWEtOcEZlUHNBVUhnd3htUXZmRTNMazBOSjNoa0hqZVZOVEpjN2hZVGw2TEVvVUxoajlzSEtlVVlMdXdURHA4MTdSU0s3Uk1QQjVLdUxjNmFML292V3k2REs1YmppYWZxd2xtTHE4SThLKzE2eEFOcU1TbmdickRCeS9WTzBpVThyb3N0dnZwUGEwMURUSlRtWW9tMk5MMEloUXlHUGlwYU5zVVUydWxsdDBoeHRraTJSSTFzQzhsaHNxQi9UV2w0UFBET0tZaXlpM1dIaUlWMFJIR1JqWDlCa2JrcVEvUFBrUEhRam13TzI1TzR3ZVpMTkVTQ2JHUmNNZHJmRDFqL1R1OXA0YlB5S29hVXZ6ZldKeWNmK3RwMzhXc25vZjZMOGQvSm1ReWtldzUwNE5MUmJWVzVmc2hZNnN2U0lISG80aDcwVHV3ODNLMzRHMzJrNGI1b2oxTSt3STVJemQ2a04zQWlWWnhnTWU4ZlJjT1AydzI5aVlYdHdOMnRqY2d2cFNFL3lxQXg3OUlJYXF1RGErMENiNGlPQUxvUnV0Q3dMYnByT3YrV291REw4RWVPb3VFS1F6SDFBZ0hzeVJXdFJDUXZuTlZibHBMcmx6bFd4dW81WGJxOXZGdHJJOXJnZ0cxbXZaOWxwUFdycE9La1kwc08rQjBqeWJQVGoyOWk1djMvbjh2dituNTg1N2cvSHRUbnZ5UjZBY0QvK3ZBR0FDd1dxUHlobTk1dk1xMnJlL2VBSTFwWkhuODNTNk5Kcm14M09UVFRWV1BVNDFLT0hIYlE2VWxPLzBKcHo1cWZGZXN1Z1JHN29CdnlaaUswQ2hKeU1SK21sUVpyamdReTJpSUhNWm5EWGpMVEZhcHRsR3UvMmFxL2NtcThsMXJIZFFCR1BCRWM4SW1zSXErMCtiWFdKZVNNbDhNVHBwTlJFQ2N5RFkxazdoOUVzcTY0OUIrMlNWSFdYN2doZU0zUjU5Q2xSZUxIV1d5WjJzYU5oM3JOakRjTjdjZzJxTkhLTnZ2ZDNTK3d6OXgzcS9TdGdobGhxdXc4ZFhha1AvUUFQYmN4RGpha0VKTE9TNzZPTmx4UFExRm5UdkY0OHpHdGphbzBmMjhFTlg5MHVZQjkyYlc0YWtTdWdHTDgvaU1iTHlJQk1aVHdLSUxHOG90WnFBTFgwcm5sMGYxckVhRFdrT2NGVW9wMHZVUVp6dDVOWWJvemNRUWJuWTBUV2hlNzMyU3lkWGhjTUcyTUtjdE1vYkdoT2o1MkxkaDlxTEQwVk96RUJOVlk1cUNtS2FzM2N4WXFWdk1vNmxnbVFuZ1BMU3FVOSs2bzZITnkyUE5wUGlkUjluVzJIK3N4YXREcjZteFd0OU5wbXJ5MVZHc0RzZWU5T0VPaTVBWTAvSU5hYkdFaEUvdHcrQWJTK3V0QUl6R3NHZFUzWG1jVzZ4dFpNbFNRMFlSWVFhZk02TS91U3JxeDl4eVllblpXUmtVVDZxSDJxZWFpSFIrWk9TRDNTeXJGVDlNd3FFQWhhUFNST3lrL2RNTUE0MGZia3R0SVBwbXBGNUp0WHdpUExwckpDOTkxVUd4YXJJTEtNVkpackdPTm4xS1ZyQ0pscW9lMmdPQ0ZEWWltcFNEZFVIQjFWdGE4OTlxa24rc3hwMlprMGQ4dTZLOHU1NDZYNFlnblZ4a28rMkJKOXBIOXlncS83RzBoWklRQUR6MEY1S0ZSQmIrV3RmdkZ5bjJybU80aitGaXFLdWxlSnd0aC9xemRVQ25na0VvcE1jUVFUenhjWlNLck1EMjJ6MTlqZ3VlNEZpNEdtbDJrTjRub29zYjFTeUl0ZDIxQ3ZCSkRxS3pDeDBVenlFSVNjRkt2Zm90aUJ5bWl0OVppbGxtMjloSytkeFV6SUtucUFhSlhiN2ZZTHczelpQenpuUjg1WkN5Mk5NNHBKOWpnVm9Wc3lFeU1QbHMwSHFvenlMcTVLNVVVUXNBRFFVYU5KN1N0RjR4Sys4eWRpd2JEZEJMNG1EQjVWdWlXU3lGbWdtdE5IVmphWFlJd0hIcVVFeFJPRjBZOHVJY0JZaDlyemNOSU9FRUQrVVYwcFlMaVdRMitPNkYwY2J6WlErcUpNbWsxZ0dtSkg5MDR4c29wVURXMUU2cFlDbWcrSGU5aTB6VzYzeUtCRnhzQ2hHcjlmTUVOK3lvMiswVWplVHVpOTk4WERXRDNMN2ZaN0lsOEM5K3cvYTB6VmIvVWJMRXpWTjFaU0RnUGFBc0dYb084cGYvUm92ZUVvZkVsUW5KNkdxMjJHMEpWY3JQTlM0bUpwT0dqUitEUnJmZyt3SVFKaHVLaXBrekUzenRqdGxoRVN5RUxESlBiTjFoS0dlN3RGR3pCblRWT2pNWDBBbEhNemxodHFROFM0Yy9Vb3RPSHhEVEVudDh0N0hzenJ2cGRnM0FPOHJ5VlNLa2xDYmZ0cjdFQnBqSytvMGI1U3dyZGRpeEN0VTZ2K3loY2laZGp0b0c4c2luL1BGWGZhWkJ4YTR3QnJPNDRxcmt1dlhRdklrSmJhbzdsc20xQTVGbS9UV01LakcwL3lsa1Z4d3ZPYzRGREZId25CbHlSeVJFNlRnWlJ0ZEpYNnBXd1lyTVVDOUs3VGwvdU8xYjNGbTJjWlozd1IzQzhPSVVEZTZYZElFNklRU3c3b2JyeCtxL2dyTUhxQTkrM3dWWGVXRktIUHZ2cFlTcGR1ZnZQTmUvRGtLWFYxQlFhUVJaUjhkdWVYYldZZEw1TXppcFdaSTNTaEg1UFl5Q2VwQ2hwZzhYWG1pZUswZGwrMXJJMzJyRFM3OGEvNkcvNm52QXVlTFFDQXIxQmNtUFlDK3E2dWQ0V0FUU0RHeGhGWHJaYWpFWFQxcDhNTWloU1RYSk9hYlpkby82Q0hOdlRaNmJUMm1QbEszdTh4VEdJQkk2MmowaXA0MW5rOUwwdTNFVlA3S3RqUEplTHZGU1UzK0UvbDdKYXRFZHB4VE1PbGpMSE9oQ0E4aU1JZ1phelVKNlVDNjd1Uk1Da0RyVU1YYnpiYzh5SDR3VXVqZGxhNHd4SVIvNWRqYkFwMy9oUFp4THM1aWl1QzNsZEd2eUdCWURzenRrSnJFZDRtZ2I3dnRlQVRoaGsyYUJEZ3dQMkdkT09rUmlyMzVSa2FJTk5jUmtwQk9ObFlnZXNRZkVzazdXaG1TV2dxdmJteU5WSEVvWG5yQnRrUTVvbmxDeldWMm8vWFNvYzJZN252MjJTamt3YlZJY2E3NTJ4WTIwSFhSZ2MzeitjNGVNODg0K0pBcDRwYTFZWDJQTlhhZDhwYjdROHBGanBYaFhPTCtQZVJDRE1taUdQcGxOZEN5S2s0Nml1d244VmswOEJ5TWtWQm96aE9VcE5kZ0FGZU9Rc0VyZExXNFBmdEt1Z1psUmpvMFJ0NFhySVBzQzhyK0s4NjR1S2d6TlYvQmpmSHV0Q1hkM2tHNk5pYWpqMTFSSUV6UjBIdWxZOEFIWnEzYUw2L05vKzFyeHpPRm9qY2MxaGFyZElVZE56RzJjRHl1NWRENVBPTG1iK1pWV3o3QU84cFBZOXRsY3VrMlFLNDZiSmpybzgvblBMNTU2ODlkWE1XcnorU1pRRlo0aXI0cjQ1S1NTM0w0cldwNlBrdUVUMnZFR3Qvd1JTWVVCTWxjNVdlWTc1Q2QrWHRlRzRMTlhkTVRIT1l3Y0c1QnpkNGpCbnVMcDJheUV4RUJBNW5aZUtSVzFpK1J1MVIwbXhHQXl2aVV4dTVGRk5oVUJabGg4S3lLTnhzd2pnRzEySmJYdTR5cjdRUlQ3VmFqU1QwZHJzZERNRE5SUS9ZUTdHS3BGTWNCcnNKVmF5RkFuZ1Bqemg0VHozWFpSbXVHR1ZadHVGSVlSUm81SklwRlFKSW1WRE9UQ3BvTVgzN0lSY0RxRTIyMnE5a2JVQVViY0p3cVJaUkJBMTFQUjZBRnFwV0pJNHVscVp2eDdUYmpjZUR2cjA2b2MvMitOQkd2a0dtU0luVzRrRFV0U3BmQmhhcGtOcWRCMWZxK3VXeUN5eGZUNmFrb2xVNEdSaGJaZTJpWmNubTE4SDNZQzl1N1JSY09YY20xOCtZYVRlQ3lVN0FxSWV1SU1wVFhFRjhXcjZFYU1udm5jcTFxRzZHOG5xWmJXWjl2US9LbFhzbEdFNjIwSk1mUUpJbjZyR0UzKytXYVNaeWtoYTBTQlRvVnpFMTZCN2R5MTVGZllWSWJiZkFWZEl2VnMyMVI5SGZJUk9kdmRyblZEUDlIdDN3ZER4bW81d1FVT2EyNzlSTmlmTjh0V1VZRmg0dkE5c2xsWXpiNVg3Y3pMbmxoV1hpalZkV1M2cDNYR1BOdFZpa2FhVXNlSERFcVZlV0N3RFRZVTE5Q2RNZVJlTnVwWWxWUHovd1pIdms5ZWI2T3ZYOTZiaFlSQUJlWVlhMVFhOVlVRlBqTjNMbU0xTXkzdjNkRGtOSlF0Y2J1Q2lMYTV2UXdyeVptV1E0a3FIeTJCUnhzNEVwOTMxdk13Q0NWbjd4djlLZll2K2tYbVpoQ3R6M1k4b0FBb0RCNEQrVVVjWU02NzcvQzgyRkFJQ2IzeDIvRGdCMzMzZVorRytudjNkT3Q1N2FqWUVBUEFBQUFmN0hRNy9kUmt1TjlvZDk2dmxDcTQ4blRSaDZ5YkVTY0tINWxLWlc2WmJUZGF0UUoxblRqSGpLb2RzdCtid2ljdjhRYmJLTWpwaTB2UDlXeTM3Y2NvRHlDaGQ3S0RSa01FT083aE5UMmNOSGNyamxNYlBuWGJON2MyNHBuZHF4MlVvK0Z0Q0svWU5HLy9hUGZrQ0taZTJVcTdSb251TXdSMUxsdDI3QUdtOW5LbnJUTEdsakJrVEJTUFk4U3RydmNPdlFXa1ZlSmt2V0w3T3psc2NPc0tuYXNSYzgxRVhZT1Y3TElPV3oyUDlCekMyRWlMQlBYWVQ0c0pOTk5NcEpGMERyVTBIcmVVbDFvOHhqNUpFYk9kaS9Za2RFK0lMNE1XdjFsdDUzemdUa0lmVnUzY2JMQTRISXFpcjgwbUgvUm42SXVtcEhwb2pmb3FGdTVzZ1ptZFRYc2dNVTVXVVFLVmQwMHJrV3lIQy9FQ3FFdkZFalpHN1hDZGxYN1h1TnV5MmlLL3BoUXgxUUF3QlZzSDNsVHFQbjgzcjRHMnVGeDNOdHlPTkRDSGk2a0l6eFhUVExQVTRMUE05djNXSnI5Nm8rUnFMQnF0bmlMYmtDNklyK0lyaXBWd0p1dTVtOGs2MVo0VHhRWmR2UEd6VXFPMnQ1MFpUYzdLVVVXL1ZXd2Q5UGN3dmx5dXE5OEpqdU9VQkJoRld6Z2VZbzlZbGJ5ZmNmK3EwdnBmd2NZU1dubjJ2UVoySms1eVYvN1dRUWRIemU5Z21hVWZuNDNncUFQeThDTk91Tm9hSHJjQVFnREJLSWJjVUhEelo4WkFFanVSaU1BUUZnaWFLZk1kcHU5VlREcFFSMnFpL2xRYXpsVWdaOS9YY3BoWHZZWE1xSFkvUytWQUNYbUhxSkZicEc0TlVSd0lMVVhrb2dJZ1pCcThoSjRVams2dXZtVEVqdUVMZnVrdHF5Z3J6OGloQW0vVXM2eEp3VVIxcFhZc0pGMnBTRktGOUNQMCs3Q3l2SC9pNHRxRFNSbjUyeWtTUXNNcGNvQ2VsbzJwdk5LeGptVjJaSDJFZlNLWmdtM05mYVlrZnVJMXk5S0s4OHQ1MVgvalFaMFVGYTZENFJPVWtvUGlMTGR5MndzeUxvbjNwalpEb2grOXRLKzJtQWlnclUyckllZzZ6VkFhZkFiME9JNGY0d1ljR3dKMUdlRUw5VHNya1RzVklVRzRJVWVWMitUcXEycVoyUnNLbk1lVkc1ME5GT08wNXVHMzdOOXZTWHpsRWZYODFmdlA1M2pmOWYvVGVzeFUrMjhSMEd3eUVNWlRoNDF1ZlFoZkcyZmZwbkFpL3ptZEZyTzU2OGpVY1R1c3lnMHd1NGEwSzdRTUdDNGJxZXY2QlR0T2g1czN2WTVLRkdEME9ESjRFVDE3RE9SYlZPcW5HR2NlRG9ZTi9CVU9tZ0Noc0hPN1lmeW14VWFscUozWGZiNnlsY2RoL1dyRlJzT2RPS0xINmhXYlFDczU5djduUHl6QW5NbTFqRVlhSWMwelptVEJJTURMbFAzMENaUmovRE9OUFM5WDZhWHJSVW5aK2lSa3RXKzBsYTdaT292Y1NtMmNucUkwMGV5b3FnbVJXK1NkSDJNU282eUN0OXZlcnhkYXFqSEsxU2o3UWNUUzN6VlZKOHBXam5LRVNYeUNXMUw1T29KaFV2SWdtRjRYVm40WEZYWUxmNWRCWnpCMmFka044eWpZZERydEZRZ1dGYTBINVU2QVY2NlBnc2FOVlphTlE4cVBsRVVUS1FGVzRvTkR4dVM4NmJnZ3lFNXlZZ0VWa2dGb2toNGxLWW5vOG16OEVOTndXL0lYeldjL2hlTGhtbytJcnhiYnFpMldZWnlhS1ZSS3prNG94bkRYNkhqeVZyVkZpMFVsTXJCZHdENmxtWXllemZHbHNFNGN6Z21iRWtFTldWQ2xzWjBCbGxEYnBEWTRNMVljN3NIKy9pYjN4ZHR2eGxyYXFDQ3NHbWErQ1QwczcyYS95a2dxU1RobloxTFJueFpmYjlpeGN3cTNXSjExdmxWd1piVHNoRTZTU2ljVmJjK3NRc010NzdUMlprMkpuYXdqRFFXTHpURW55allKVVVoM3ZYWk5qWmJ3eXB6QzNRWDhEcmFleXM4azYrQWdBPSkgZm9ybWF0KCd3b2ZmMicpO1xcbiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMDI1OSwgVSsxRTAwLTFFRkYsIFUrMjAyMCwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzIxMTMsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjtcXG59XFxuLyogb3Blbi1zYW5zLWxhdGluLTcwMC1pdGFsaWMqL1xcbkBmb250LWZhY2Uge1xcbiAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgZm9udC1kaXNwbGF5OiBzd2FwO1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIHNyYzogdXJsKGRhdGE6Zm9udC93b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBRVBRQUJJQUFBQUFneUFBQUVOb0FBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR29FQ0c0ZzRISVZVQm1BL1UxUkJWRllBZ2h3SWdqZ0pueFFSRUFxQnRYeUJuam9MaENvQUFUWUNKQU9JVUFRZ0JZVUdCeUFNaGhZYiszTVY3SmdoNER5QUlFcTdzOW5JUU9BOEtJS3BmMEQyLytjRE9nWm9pd3VnNnVZdkVwU1dHVlNwVmNxSlVvdjB1ZXQwMEpWaGMxRUYyRXFycll5YjRTL2pHMTlUdTZxdlRlOWpPZkF6SEFobWhrdmQrQnFadHB3UytNVTVXU0IySzh2T3RsUkZpL2MweSsrTnJtRm8yNTh6a0VTTDhIaytTOHNQdlpFZEhvUnYvVmRJZ01Fd0JHZGcyOGlmbkplRUwxcUw5MVYxeit6Qi84RUxBRGhXQUNBTUlEa1dLcXdZVktJaUxERGZiUy9VWlVrR0JlalpkWG1nK0NvR1lKdmlkSTRaaFlXb0tBb0Nnb1NDMkVpa1ZDaUlxS0NOV1ROalZpMWNKaXVYcnVPN2k0anZVUnZTYVo2c3N3NTFJTUtRN0NSeS9rd1BldFFYQ0tZTnh6VTFEVnNuMjF1QnRsODdiSjJjeS96bTBpRTg1SkVIQ0dreVFvVVVOZU9BaE1IelFJb2dhVzlUWlB6KzFMMis5eXliLzhVRkRDbW5TZ1grVzFrWEI4bDNjWksySHdvRUxwQ0tZNWV0S3VDeWRCb3pqTi9DdVRvUWhtUmhtaDRnUERNWUU2VXI5ZDduOUkzOVA4L3NndlZjMlpXTDNsVTdNQXVMaEZMd2hTalFYRktMemwzTXFiekJsNlpXbXBHbWFZb2RPOFZwZG00M1pYdXVsTTRPOEFkSStCdDdnSzR3ZUpUODFwem5weWVrcUoxRzBnWENBU1g1M3FiWS83U1ZxWmV3ZDZPcGt1R3JmcWdaVnprajdFSGJkOHRmdlFmU1lEazY0aEIvRmowZDlvWkhXWHd0Y3pIanZRUUFRV0J6S1E2NHFJZDQvejlUdFhZR1ExQkxVSHJpUGppUWwrRklYNlI5b2RiUkZ6dGVpT1UxMWM2Zldlek96QzY1V0pJMkZnQWxnbFFDblFnR01WcEhFTlF6S0RwUUYzVWhwQzRrUXFJRFJTZUt0cUpqNkM3RVdGU3hUa1hsMW0zbnV5NTFWL1RkUVV4Unk1a2svTmg4UkRvc2wxb0lYOGVuOXBsZUJ4bjZZaEZDaEhqRWNnbjljNisvKzNpL2IvOGRGQ1p1bEJPcHFPQzhxTS9kWWN6OWR4cSt1WnVtQ1Z0bENpamsvWUVJUWh1dnprbjVqc1JnUWNKN2ppR1JLb1FZSGVuU0dZYmtrRkgwSFBvc3h2UkZITkFQY1ZwOG9xRUZuL25FRW41UTBYL3loOEJTQUd4cWVEMjFhY2RZQWwwZzRMSm5CTU9DTyt5SUJEbkE5c3lxNGp5dFBiZlltRnQ3bmpHdHVQYWkxRktUajlVZXh0OVN3VjFNQUZRdjBobVZOQi9wYkkxUXpVWXVtZ1N0Wkg0bzlma293RXlJdVFxY0F3a2laRUlqWEp4MWM3NmpsQjk4NFJwNitNMC9Cc0FvSzB5V0RlcktYZDZDK2F5UUNqRmVZWFp6UklvcWxnRjRuS1JTU3llRFZpdkh4U3JVc0YrbzNKZFZ1NHNtVDNhb2IweG9jbForZzdacGp3N3FvbzdwOU5IL3V1N3FnWjZ0ZHZkR24vU2IvamFBK3NHamFwSytQZTM3cUlGR0cyL3k0MGViWm82Rmx1OHV5WHBuT00vRkhqaUlUcnZ5ckhxM3VNdUpVVTJ2OVNhNmVqdTh6NGQ5d21kOTJUZjlpeC81blY5WUhoYVIyTXhLUWtLeWlIOVh4Mm8xcmdoUnRjMUN0WkYwcUk1YnloQWhQMlZVKzVYU2JTS0ZTck9tdnJ2UWg3cm83SzZoZ0RyUFRKMWlreVMwWmxpaDNvRWNKNC9JQTFKSzR2WHNsaUJmb1RvbWNaQkdrcTc3dFpNMThlMVdYYXdkcXZTVlE0YStmTkRXbkpuWXRHYnhRR29ZVkQ2dk1oblZQUVBwMWVxblpxMDFWWlBpR2JYVmtXZmtnY29tNVZYVGgzU29IdEw5OVlEdW9QdDFLNzI0NzFGL3gxSXJKMTJWdDFQRUtCZUJpbTlWTmpKaWdjd28rQVl3MkY5RkZPcGNVa0hHcWVPa1lpeFdxaWFxeWlGa1A2cTFVWDdTVHJUVlIvUFM1VU4zbXR1RUk1RkxOVTNRd2xhQUphM2FzbE96eTdTRnRaVndlMDRkWStTL09Gd2hKOGg2Q0I3Tmg0NTFRY3V0Z2h6RnNqNldxS0xOdU9ybkZkNFlXQXl6aUxlUk81am5iek9lbHg2ZTY0NjRMclllU3c0OVdPNEhZSWVybUg2QS9EYkU3VmVDdXlpVklqek14SnlFMldXb25uVkpRVDdBLzV6aTFIUkE2RVhabWFtQVg2Tkw1d0ZTcHhIWmw1VGxGd01LTDl0U2dQS3JvR3FsWUtnVFlMblNtZ2dRaHJCRUk2ZUpOdGFsa1NOWnpRY3U4Z3ZCMzZMOGRvcVZwYURGK3VIcHJ3NmhEK0s0d3dlUlJzNzBnTDJ5U0FVbHllSEhYS3owSTVCem1vZVQ0bHo0RkZmbHdLU3MzMHJtZnVjUGZ0V3JFanhwZk9ZOUgvaklwNlozUjZieUxOTjV6akZ0cTB3TC9KOFh2TDN1c01lU2NlTnRVdFBXbGdlMXNMcytnOTdqSHlObysvVUJMMFpxcUU5NE1SamdYVjJ1K29Ed2lsVE5nNlJEV2JvVUZ2TUdCcEtQV0pKR0p0OWpMSWZQTEJGZlVKbkswM01hOFZmOEEvL0dQL0RQNkErK2s3OFNwWFRjczFYbWU1NmxRTnNycjlSakp1TkhaOXhYSUhvUWI5OEcza1diZzNldHo1RW5pdGdXYXc2elZwUGUxUWtBazlIZEFQUVFBTWlqbWhrQTIySmxIVlpOQTR0cHdUMVpjdTFacFZrV0ZnRFhucHRWYWdIN1ZkRldDNnVsbHRISDk4blRMWE1NQkZ2VDIzaWVCSzBxblNSWmlncWpzakpRSGREeDNyY0d3RnFHczVmOS9OUk1Ncy83ckgvMWcyMlgrRTM5NW40TGxJSDB5SVJzS0l3S1VKWGZvdC9oS2N5VVlFcityMXBWZ1ZTM1pUVTJOeVk5ZGtPVWhyVFBLWVR5LzhLbitsR2YxeWxDNjJRZHJLSngxMVd0Zmx6OThNbUhuN3o5eVZ1ZnZITHZQWGZlZHMzcFF6T2ZUQjYvNnZ4SG81N3pDZ3Y4cUw3QXR1M0hQWndzcFJnQ3FPL2tEekU3Ymx6L1I4THRsdndld041SHBPVHcwUUVsV1ArTFIydlcwVURKZFRMSTNqNC9tVlVNMEtYNUxZeHhrWngyYzlRemlpazJVTVVHSnVpbGxWR0c2R2FEN3RHdXBSRExCRUFjakRGVDRocjZFTVl0Tk1Ba3M2eGpPOVdNcDMrNjFEbTJjQkVqVWdZeGdzbU1rMEVYSXlmbGVobG1tdFZzWU9zZVRHS2xHRFc4UVZ4cVlpaWx5dnZtVDFISFdMcVM1U1pZeFViTzhWWDN4bUFNSGZseWsxcUtxY1RTdzRRdUdHRjYvcFcwcmRtQVlUOFYxVVdoMmRoNFVQUEVqckhSOXJiV2x1YW14aFVONTNXMU5kVlZsUlhsQ01wS1M0cUxDZ3RNK1htNU9kbFptUmxHUTNwYXFqNUZsNnpWSkNXcVZVcUZYQ1lSaTRTQ0JENlB5Mkd6a0ZDb1gyNkZPNHF2Y1pTSjU3T3RuVzN6TllxLzdPMjFYMkc5elBvYkRnV1RucUNQeEkyT3BYcGhuUXVXSFRTWXJNTEdOTlhtUmpza2hTbjQxdHQ5ZDZNVEhoM1ZRcFhXUUllUzA4emlXdTdVelhVU2xHbUFBYThUVDhpZ2RZaUhDb0NIR2NveUFjUnFUbVN3bEZHM3RobGZMdXhtYnd0TStzQm9lSFlzczl5SUhFRFNjeHFmWHlxVGNnWHZnVExlcE5Dd3M1b1gzQ0JHMUFKZW00ZCtzaHVXU0x3WWNOSUFTWHlacmxVRWJ4TEJrengrVzdUSFlrM1lYRDhXOXVydGdlRjlLWVNtZFZMYmVET3g2N1F6UVc4VytIbzY2K0wxYkMxTkNwYS9ucE5mQ0NtclBRdDVVMndJNGtTSENMd0t3RUdJeDh4b01UcWpBdGlrYmJTTWxJcWRNTkRkYkJEcUpFQlhHa0lGT1NtVGtLSlJUQldzV1VOaVZoRlVsT0V0T0FpbC9hNWdDWUs5NTI5K0JxUHM2Y21XcXdNZDZvUXExSjd4VlB5Q2MvNURnQkRoZTRJVjVGQkpaanIvWVBsVjE5cmVVSEZubm5BSmRWS3lsd2pCUkNKMjhlQ0RMc2w3UHphdjVkY0VLdGorVGJQeTJkdEg2YlNyVEJQYjJhWU5sd1JKQm1GWERKWVBrU1BJR2luL1JPQ3kwYnJ3OHNLTFkrQlllMG5DTThzaHIxNnRWNnFjcHM5SG1oM1Zic1plQitiNm1vcGU3UTJzTE1ubFBUc0NqaHhNdUJ2VFdRYVRMekh3azVOelFydWhwRXNQbFYwZGNBaVp5aHNGN2wvSmtSbVpMQTZidzErUnZNUkdZdllNc1hqV2VNUVJjeVRrSVQ4RFhLdnd1N25paWxwdnRNbGpJdWkzWldIbklZRTNvVG1CaVdjMk0raDFMclNLblcycU1najlpMDU3ZEpUMVcvN3RTd2tRUG9MVTlGSFBpa3FUZERQb2hiUHM5UHliaTc0WEFkcXVyR2UxUnNTc1ZnVkdTakN6WUQ4bm1rSWZnVWtDeUhqeDZ4citjRTVyMGVTRW1QS0paUDFFNnpSSmxpYkJhakZSZHVlTFRydDRJVk95R3BsTUlNbmZBem1aZHdNYkRvM0k0eFB3ekVucjIxMlVZcTRvS0gwZXNtSy9CSE02d3RVMEM1OTJvbkZPTmlPT3BzRmVmQkRIakNsMldCTnQ0cFFrdkZiVEEwZGhwRWpiMTZMMk5GaHhSblkvWXhGTTNtTEFWMFQwcFJ6T1dWd0l2bjFYQ1dXRGxLZDhqNzhZSXU2aG5uQ25WTmxNZ1VsNmJrYzlQQnhPTXJZdWdLbkNablUyQStuZTRySXpMbmx5TEp6MnhibDVCNUpENllWeWltSjRpUmhCMDU2ekkzWlRORStXQlNGWHZqMFdPdWkxVUpCMDlwZ1BpZjZUaFQ4M0wwck8yTzJncm9KS3dTakFkcUVoUUNZQWlESENXQ3dDMFJXT0lMZ0tuaG9NY0QvcWl1YzBBNi94c2prQUhwVTRxaGlndE5sVzdBSkxLMUFqU0sycklXaDhMYjJwb2s0NEdqMWNlYUFyRGQrbjgxZVFYQnJCN2libjBiT2prcnFrWnkvWkhVaEFEZ292M0FmZVNRc2x3MlVmNHhRdStueDBYZGFzb3UyeTd4Z0oxSllFa0FxbTJwVmZJdGUrR2dTMDdrNENCcDdFbVlWR01TMzVjTnE4UVR5Q3RPOHNwazFwTmJkeEdhNGNvRG0yeGxCNHdVS3VkRy94dnBMWVpLaThENUtnRUFYZUpROUdpZGttL2FIRTZjRWVCT2J3eUhHdUNnOGJZT05TWThoVjhRQ1E1S3laejRVZ1BCZzlwUk4vOXJKTjYwU2J6SDdrd3JEQVdnVk1BSnFSVlhvRGc0WEhtUU01UUtQMUVZclZRUHlDY3lvcWxkOWZhT2JEbWVaSzNWSmN1bW1kVUJxLzRmZlEyT0hJSHozUzlEbDBFcDF4cGhqdVd2UU9pQ2F0MGFtalRNTzdsSU5aZHV2dERLYUJpVERydFRrdTUwZUZPc1BJUU9ldHFCZ1FaZ0F1U0lJN3VGVEFVRkYxR202UkVxQ3R0UjNGdnhCZ0lPN2NvYkJ2SnZRdHJnMUV2Y3JkeERUNTFSYW5zM1QrMndLZ3REL2dRUkl5M0lCWjVhMncxRTh1cSswcmhiMFlnWE5ibjBwOVE2c0Y1RzEvYlBhVktJUG1acTJZRkJtaThpakFONVF6YjJDOENrekFDQVVxL3BCaHdTTFJLNkUybnB4bDdhU0hZRC9PRWxVeGRGQ0NQL3Rxd2xvcUg5M3p6aUJSQjdIOFEwVHlMbndIUFdScXNSL0VmUkN6VlVHTjNmbW5NZ2czMWxsQ2JyT2kxS20vN0pwdXNZODhaU0hnUHQyMGZ2YVpRWElKUUFtdjhNSGJURXptbUZDS1FMTDdLZUpkZGd2VGk5eHRENTJlUkh5TE5BcmhZNUtXRmlZRXM3ekwxUGlSbDlFdWRpb3I3YXVGalJTVmNPUTlWV2JWdHZYM251NVBydkpWeUVXMFZrMGMrd0djY1FVQWJSTEwxd3FKZXZMSndFUGZhYXNKS28zYjNXaFF1NVZwWUxmeXk4K1lVNkVueW15YzVTNndMTWxRKzROdXdaWGYvUmR2ZG1SeTNPelVhQnR4WkV2dFBPYkpLQ0xIOGNJS25RcWZtYnhCUDVYdlFFbkJmNkFSWThwVjdsTmF1UUVuNXQ3dGwzMlNLNzh6ckhqNlZ2RGRrTk9iQkphaDhHdHhIL0E2S1duTEFseWdwczdJdE9QWE1IYUwvTkZ4Wmp6ZmJDMWNVbkhRSEd5L2xqSFhHTDJFd0tRd28rOEdZTzFQNjYwMlZyR1pUL1krODA2VjgvS0FOOForSzRGMSswSzJaclBpdXRGM3dGTVFkS2EzTm1OZ29PZWpkc2lNbm9DcDFaaTlSV0tMckt1clYvano5alpKdUtPQm9vRXMvdEtwd1ppek92N0tjWGtDbkw4amtqS0FneUM0RnRUd3B4UXJxYlp6K1lZV2hBZ1BDY21zc2dHTGZLYnpDYkw3RHRSaS9VOXJxeWdjenhXTnVBSzJ6ZWJScUU0OUUrek54OFZ2OWtGL0I4QjFVeXdFQ0VGOWsyKytMdWtDTzA1SUV2ZXZ2Qy9zR0JWQUJHRkNQNnpZVnlsMzZXRXlyb3FLSTdtWUVvTmRMMGllWDVsVy9hckJoelg3TU0yTHpHTXlDQkREOWhWS2RRUlMyR2htbG95aCtCVmZyVkRGZVd2aUt0Ykp0Z2t4YkUrTndkeGJWa0VPaWdxbHlzZGowYXc0MjBTQm9GbklYRENVTm9MeGFCcmVpTFptd01KazlzT0o2VUd2d0NDemk5THB2UGZsTWhHdGFCOENOY3ZJeHExb1BKWXBQcm9wcG1NeDNHTnh0d3ZScGlybnJadGlka1N1VDErbDU1YjVWcUloYnhNMTJYYVRtMWZ3WWlMalhiK3NMM2hnVDk1Um1yZWxmMXI2TlQ4OERZSXptSnM4b3Z0OTRCZnZuKzNSVFZXcEVlLzVTSGNYTU85T0wxUU02V21WOG5nWlJCbzVXOEo0RE90RWFYbnRUanEzcnBIclUwMTF6VGVsMVB6bFhzQVBMVXlwejdsdmN6M3grRGludENCS01jWnd3TEVpNStqdUJGTU1KMjZSRXFWVnEyb3hsRnYwOVMyWTE2VXVia044SnlhM0pXbW1USm9oQ0N3enFjOUowQUViZnBCRGk3V2t5WGdXSkdrejNPWm84RGVGekg5RjJUa0ljeXBsSkxEdFpucWwxRmdEWkE2RFkzTFh6N2VhcVhCaFMvaEtkUVh5NTVKZ1h1TkZIL3lWUWkyWjNWV3FDbUFaYmQ5UlVGNjdYREdzS0hQb3hEbUsyUGZObHo5ZlJ5Z0dwdXpKamM1R2J2UGdiZmFoM3J0dXNEd2N3MEJWM0hmNythQjZ1d1dBQ0dUN2ZlOXBwbXdyd1dIUTJDSGljV0tqVnBNYkxyUXRhc1ppUEQwSDgxcVplYlRmdWNsMTFiczdEaWlVcFEwMWJpNGlId2Q3NGE4VTRSWVJOYXh2eVdqWkQ5KzI0UWc0S1BvTmMrRGV4ZGx0MGZENjFiM0FOa3JwR3lHL2JKQ2haWHRlVEdzQ3JzZnhjS0tkejJKeUpMQkR3NGVabWdsbm9LaFJrbEpBeGNMY09pdktBcXZ0OFJJOXdhY0ViQVFPdlUxbjB6V1JPakRlTnc4ZmozV1QxVzRaYjlMVzEzZVMrSzVDT2ZMTG9yZDBwZDcrQWg0YmdsTWdoL2JCMTYvc3lCNHV6T1RNWCsxZGtzSWQ2MEpLRmcxS2xFdHdsZzBNdTFjRzBGaUZHT2NGb0hUVkxCTjFWbmk1TEpzbzhYNmVFMVVoZDMzZHdxK3E4SEl6S0hxUGJ3b0REdXczYmhxYVBxbTE4aTBZZXFLL3lPdVRDZHRLNE1jU3ViUGU3b0ZXMlFOeTFkN3lDZ2JwVWE4UkEwTUhIek5HY2JXdVVFeWhFMjFISmpsRVpyZ0FBUXdtTVcvM040eFFpbUFMMWpiN1EwbGZYNGF6bkMwVEZ3Q1hPUGNDSkRHYmZ4SC90Unpadk8yRFVpSGYrcndmMEQ2a3owcC9LUCtSUTR0VHNrVHVtK3UwQzlJdjFIcW5Kak81enJRT3hwZTJIR1U4c0Qvbnk4VXgzRE8vRDNTTktpRHZtY0lCZ3YzOTRabGh6RTFnRC9BTU5Jbjl2cCtaQ20xWngxSHFqTFJxMy96enFGUHJLUkVLT29kRFNFVW03NnRJeWg2azhQcmgrTThLaXZWNG9HdTNabVUzYms3TDVLbDZ1VFUyNmgzQkFsbjdqNmZvemMxdTlmMHRvMFc3aXRVZTBjc2dKdCt6dmhhb1psVDB4QlI3a1dzSExmMGVTL2VkL3dGRzhNSXk0NFBPNWJPTDY5bzNaWVBoQytBK2pHdW1PbEpuVjk5a2svMWw1aW13K0Z5aFBDQXJocTQrRWxuUE1uakFxYzJaWUFGS1llL2Z1ZHdqeGFmTVhoUkJyekc1dkNBYWxIdnc0SXhwTzkwdkYxN0FBR3BEUU9EWlBaNnJqUVpXeUo1Y2lSWmRycHJRcTBLWG40Unh3b3ZMT29NenpPSHM1QVc0TmdCVHgyTExQeDVyQ25Gank5T2ozWFhwc3FtamVXTlNnQjl4UDB6UnNXWktkMjFBQXNtcmNSOXRwYmUrUTk5YU96K0h2R3RzaUhadVFHajd3R0ZaMks1NFlIZHJuaDFxVmVHeDFoU2VWZ2RNVTA1UlRsUXB4cnRybWJMTm1IVW9iWndrWCt3b2FzWGpBU2pWMmY1ZGNERklXaThvREVwV3Y2bmg3bEhZQnBQSjNoT09TOE9lYVE5MGdteTREaVJVTXYrZGxBdFVreHhaOE1WRnNueXVxSWJaWlZiSUxnS0ZUZ0RUelBjQitnd2pkL0RuM0x4WEpLekxjcWViWWFqdkNmMDdLN2ZhYlVXdllUa2t5djVBVzFqWnNtN2FHSDVIcXc1ZTFFOUF0aVNuZHBtWkRmaElRUTBzQnZzZHVkNE45NE53STFPdkpGZHVnZWlMTGQyUHFlNUVBYW96UjZFWWxsTkRMUmQyTUdXbDgwdzVqV1AyaFhPdEo0WFJSNHVkNlZkMTBvNnQwTjVZMkY3ZFN3aUhRVTN6OEZoelFMOGI2dlJROFl5V2dDeVZic2crMGxqak1UK3pUaU5yTCtkMUdCWldQV2NmWmttR3FtK0kxZHRuN1RqckdOa3hWMlJLNEtURzhTbmRwajdMaVVuUDcvU2Nld04xQ1ZxZzZWZnVjS29Wei9aSzYzMlhnYjV2QUJQdzgwczIxTlBad3lXV01mUzZKN0FTM2FEZFUwQVJud08yZi9URDI5M3NmUERwTEp0Tm5yQTVteFhaall5bUJwOHN3dlgwa1lDSzJHZ1psM0lJd1VTQjVzTU5mdXU5bjRrQzJHZkdSVjlOODdxN204VGdiVGxLUHRLVnk2a1ppOEc2VWZ2MitueGV4MThNQ0FHRFd2N2RVejVvazNwVENqV04zZ3RudG1FYlhxd1RFK1d5d0VJcVRzVWRWT2R1ZGxLRkx1UGowVVQxd25ZYy9veVRCWmhmbzkrV1o1Lzh1aGdTbUp0SGRsTlVvSmtJMXhUanRVbU9XVmtaRjBWVDREZFhGU1lwcmFGVkxRSXRwMVNTQTU4TWlVeURlcXRrNTVabE9MZWRLdklvV1Nubm9remRaNnJmZUNlQTg3eGZsbzk0dHpuK0FVRUJBa1ZRUStpNUo2Y0JKOEpJTDdGMjd3NHp3eEV2aWFJVzVpTXRGQ1NhMCsvS0dqY1Q5UktPdmZ4SGptTUJkZHhyVDZkaDJ1WFI5OFkzTzN5enRnN0sydnpHWCtNeXEyUUcrTEtacHBBUDdZTkZBZ25iSGVxMm8xNlhPMkhrRGF4Zkc1bzVwR2pIcXROYVdvSHJveXd6ZmorS1pIenE5Y05zSkRHRWVjbHFteFVzVVNYZjFTNWZSSysyODN5Z29BRk1WMjkvYndFZHQrKzNRVktpS0ZKa0Z0K0JIaStSbFgxR2EzWUZ6YkE3bXZkWHBRdHphT21VQTN2bHVPNnFneUkrUlFYOFZSU1BmZElsd1ZjdUZsWld2UHVncXREMnJkS0IvWG81NGtjazQwR2c1T0t5SVFxK0QxVG4yczVwMmx0ejBndjQ4M0cwWmR3bHhoNkF3RHk2RFF2TmpuaFBzZ0JWU1haKzYvdFhzc2VkY3VYVWlDRlRtUUNtbEY0QXA1S0tzUmFYR0o4RVYxVnF6cUx3ZW5EcTl1NzZBRTFoUmx6VHhKZ0R0czNtVy91eXVsZmplMDkzWFNZTjQ4QVN6L2Z4emNoeGhWeVhrS3dQeGdtOFlHWUZaRTFUWW5mbVJTak9oOTl4RFgvbVRzT092VEp1YkdBajB3OVJEays0akMrWXplWUQ0L2JWUWVZdzdmdkNLM25veis2WTc2YVowLzdESzQ5RFcxbkVhb1lMTUQ5bG1aQkNEWFlpNEMrQ0NqeFlzSlcrUWpXUFRCcm01K2dpNzkrWlQxd2NRbnFCZWhtWDlYaEw1QUxTdEwyVUhZZ0dpNmZUVitkcytpNUo0cjdKbFZ1WEZGeUJSTy90VlFXSy9yRHgya1NLUENiYVBiUjJtbEllQ3B2ZnVTWjZBdnd2TGZJdmlqamdnRERXbXJIU3NVazVHOCtITUhGR2ZBT2cySlJuUTFvYmhoUHh5dXBJZWxHQ0Q2M1hybVF2dm1Ld2ttTmFrSFRCamxGcGs3OXRTbmJQbDBsL1N5R1MxQ2YzRVNvenNLejJQa1AyL0dGV2YyRmhvZGQvVjdYby9QOHZiSDNFZVlsemJMN3g2MCtacVNMek5EV0ZEQW1mcWNqTmQ0TXZiT0E2dW80NkpyRWMzY1ljSFRZVWpuMXl2dUxHZlAydjgzWC84dEg3cGFQblNrYnZsWXgrZHI3dXdYaTl4T1VLcW1Uc1FlbllxZUt4cmNZempOZW5JN1BMZzg5bkxkMko0c0p0RXREWEdXVldySGkxLzRCTzNwbFdVNzMxcnI0TENCdnQ5aHVWTHU5R3NlSFpyN3ZyVUhPeGFFM0FvRnJSbWxsbzJQTkw0UTVieEZuTndaSHZ3U2hvc3JpU3dTTCtDSmluWUQyWCs2RmZNNWFhMzlQM203bGhYZjBieHpsZWMxSFQrb2FlaEpUTzRkVXpMSzgxVWJOcGpiM0NoS3MrSUlUU0s4ZmVSQ0FjODRGOFFVaTlzeDJLeUxoZDVEbjMvcFV6L1VydkhUR3pxVFZkYkczbjhNd1l6MnREMUNwOVkzZUMrQW9LZ1pDclZaQ3Nyelg4YXZoMzBQWEhDK1pNL3ZSVVkwVWtuQXB2ak9zcU9yeWdxMTJ4U3NIcmtocVZNM09WUmRoVDFoUU9zd2NxeGlEMXlUdnlwdUlabDMxMTdGUmgyQ21xN0tkZjZNand1dmFFL1E4ckRpR0xSc0laSE5UR3JTMHNqTUdYR2hTeEJ4bnl3SmNYRXVLaENiSWIyaUR2bThybUVaMmdqbC93dTJIYVRZMXQ4RDlpVzExdm5WZHVCcllHY1RrSHNpQ1hRMDhGSnRvTTB2MjYvY3RiRVhYWmtFdkVkVzhKS29RcTJPR2J6K1p5ZktMNHROdlZPWmMvbUJyRkI4bDJ2OEtmMFVKOWs3ZnpmeEwwS2hFWXN6ZXVlYkc1Y2JHeFA3QzJSUWZqc2dBeFkzZmNWaytXVDdrZlc3NCtaVDJPWjRQY0dQYVgzZXUxQWZkNjJVaWVUUkp4eEJ6ay91OGptOXVnYXd2L3ZXMEwvSmZ6UEcrK3IzTTNQMXMzUk00b0llMnBhWUwrUzN1VmNiS3YzeXhTL1VtUXNSZzFwRlh3M1M1N0pLYm9qTmhRcFlEWkhEWVhzTjE1RGJXWVhPYlVZRXVQS2ZZMCtPUmNDaEZFZmo5VjNYS1hwUGtMcERDN0U5QzNIMnhVQzZ0cU9BWS9GWm92RVRJSldqOGo3Zm5LaTVtcUwrVXpBL3VOaXJYYXBvS2JKNC9YR093ZTJsQklsbTREb0tKekNHNlFyUlIvSmxUTHJmUldSb1VreGhDd2drSk1laGYyQVRlK3dTT1RISk1ZSHlXUUtEVjk4ZkgxbDFLcGkrSTFIWHRWaWFNcFJ1bmFtZHhpVjJDKzI5VEtIaFZyYnJqcHRRRDZlMnlJRVBjV0h6QVRiaGM2dG9YNGVVdHN5RnZmOElnLzVueXJmYlBiYlZVTWZaVC9HRWpVNjFvV09HclBSZTJscEducnNQd0UvMlM4SU1XMElxYllqWmNwdVByZ08zbnBXMVZnNlY5QkJYdGtXVnZiaXRubmhzZGVLdnd0UWIzSGlsSituYTRJL2loN1VESFBaOUNpSmtRSGd3cmpLaHlyaVQ5NG1mYkVqbFBHcHZQSUVTQlV6U3RCYzhaMkhURXJRNjlXSGI1VzBmYzdSVVlKMTBGS1k5aDBPU05TSHgycjZRMEo4WEZDdTdCbGVWQmhpT3Vlc25ETGE4aVRPS3ZmZkF2UStHVzljV04ydG5qMVZMa0oyY0JYNGszTW92eEQ5MHd6SFhzMTZyR2tiTlZZYjVyWVc1cVdGdGVoeXpXZGVGazU4WXlsSnFOVmhJZ2dGWXY1SU1IYnlDUHFZc1RwS1dlM2owcGlNRklTUXlpSUkzRXhDRjRJbDY3M1lvTG96YUJ1Z0xZS1FpK1k0bWMweE0yNFNvRU9jbFp1RUxOc3pNalpXUkFQbmVKTjFqY2NGVFRYSFVyUHVMTWxEL2FLK1NoemdjblpabVNXNDN2QXk3L0RxS1JZaXJhT0ZldEI4VlZRY1VTS05KeWM1SlZIVXZJVG9lNXpVQVZUU1NZRUpTVkc4aG5pQktZOE45OFpGT21TTXpyWjhHdDMrRzJNTnN5SjhlUlNyTE81MzNaKytjS2pwVXR6c2I0VmRQL3AvVmpuMXNXbmkzWjVoN1o2Ym8zK2txREptOXJzWXZuQ1dSZlJheXlUa0drWUdUMklGa3g1eE9hdXBLalJtZ2Nhd21OZTQ5NUx1Nll5aEFQdHhZcUlBMng4cmNKM2wwUHF2N01lUktmRE80RlpldzRuL2pWdzJJRGI5K2JiREVROGZocy91TmJ0VENyNmtIUjFaZFVrUXljdVp6bnpiZEMwTWxGSzhlVEFPaGwyamJxM0lYZHRUS3BwQ25vMmUyNnJJOVVQN2dBT1RnaU5TY1NVZURURXRXY3UzTWxaWDNXUHZtdkZpZ1BNTjEwOUdlK2Y5SnJycjJKeWtZZjE4RmVoVGRGaXd6QzBrdkxRVmU3RnlXWXhDLzFyeWNJZVVnM3VwYmxzT2NtTTh0RGMzNnBCcGdqQWxWSExxcUJMRVlUOGoyQVNTR0hlMG5PTld0eFhsczRiN3pVWTNZRHA0UEllMDRheG0xYnBjMnQvcnZrRmhOaFV0aUJKcmwxUC9ESEN6VU5FU1drTUdVTTVEaDBFN2Y3WVV3bll5VVV1cS9oeTZNaC8rWFBkSjBQMVlXVi9zWkRENGRyMENaR3BnNzBGZGtDNW9YUHRpR3d6V3U1dmRlNXltQk96dysreEQ0TFliMkNDMng2ZG5iS1F6R2grTGh0bmFhVVZDYXZnODhZMUl4UE5KUkNMRVVuL0FYcXBEOG4vUFJSVkFrZ2xwaDBTZm03ODIxNTVQL3pmKzVYeEhtT2duejR3OXhHbVcrZTdxenNkVXpjWG5jR2xFWXYvNWdRTjQxVHRaNHViNTZrdlMvT2locHY0V2FGOCs4M3hhTnR3aTlBMWY2WDdQOFpBYVNjcm8rKzlKR0diYkMyL0I3Y2lPQlJVWmlhQ1dzMTJiZHZqRkk1Si95RkVkZ1JhS29sdWNsYTZLQXdFbHgvOUFSdmJybHpSMldFdVorTGsxUFhwTDltU0k3Qy9wRGRGdGN5ODVaQ212azVXWmdDcEhQWW5IN1p5WlM2SHlaa2JEOHR6WUs4REF6NFROUEhQOG9EaGZMRGw3WHdnMzJQRWQ0ZXpyRzhqMGdKR053WUptT1BXNFRWNGFIQ3ZpLzBjVmJvenBEYTJkaHFYRlc0dGN3TTdQU1pBZTc1MDF2eTlxUmo1WEhxcmZ2L1c5dnY4VmhzNzlKOFZpTGZpTzdYN05yZjl3aXV3ak00UFRwRUtLOFBIZlE5a3Q5ZXVxWWtySnVnMWdycndDZS90dXRTb2xpS2FYUCtFR045ek4wZC92S0VwNWVTMkZhOWpPNmJ6bHRuUXJlczBIVkVKUldLdFhwVTY0RUZPMWU1bVd6dFlzL3RGSzRJOVlGL00yekhVb1EzK3I4T2JmeHZ5K0FyUGZQRC8vTzFTMmZhQk1pM1VLaS9oS3I2aUhHK3pnQlhHWjNpektZSEtTR21LeE1qejZRR1p6TGkzTGtuRUhSUnRxTkxsanloa0JDWkJHRSs2VkZ6QUhUYWtzZFkwVnh5a0ZoZWR3Q2NSOHQ0SUFuc0NtU2lHTy9vSUlnek5GY2UyaXNOeUtzTjZsU1dLemFNRlo4bmVObzR2OXVuSkZ0L3VXYVRPL3gyQk5LQ3hxOGFzZzdWKzF1SmlPL29Vd1M1Z0xHMlZsekpaazVKWVNtZTN1eHJzQWthSWRrTjcvQ2FIdi8zMzVCUys3TWMyeURLMEVBVXdXcVNUbHovd1R3N1M2N3llRjBhSG5ER0RYaTY1WTRZQzBuMEZTNDh1RXdFaElvYjVtQWNvMU1HQ0hncXlQTFpVQ2tSaTZyQVZXTmM1YnhLeXpKemtPR0dodGlqVmdZQmdTZmlRTDROK0ZWSVc5OC9IUTlUeHBUbEwxWDYzYlovd3QvcDIrM3JoeWtNY0Z0b3BLMFJsSWlWaXJyMDh4Q01HZmg0LzlCRWE5bk1UOGdMKytRZDUyRTl3SU4zajd0LzNNVGZ2dVpEazl6QTNIY3oySTJZcmg2Vm0ydzQ2NXVhZE0rSisraCtpQTJ3WllzNDg3RXczUDk1ZU9WRHBjSWp1MDAzMjdRYjY3N3MvbnB3akthaDNDei9xYnd6T2FnUzdqSUFrL2FLazNVT21rSHZxRS9YRHF4VTZkamFTenkwRVV2cmVPTHpRUGJVZkFCWW1jNHRRSWQ5aXMvWDhLVWRsaGJVWXgrWnA0ekZDU253YXZoN2N5MWJSMWFoVUVDc2J5ZU9zQUViMHZYYmQ0SXFOZ1haQThxQjVyNEhSQW9FaGhDSHBGeVh1SHM0UCtVVjl2SDVrbFh6bE40em9ZQWozZWFTbXFtaDRJU0ZLSHB3Tk1kbGxJa1U4UGVvdlVPbTgxTFJ2cUlyd01QVklmOWNoUWJGaEZzN3cxN3hRWnZyVDJDWkpRbWZRRm5VY1VwRVFURTVvREdIQWZtY0dya0U1RGVQSVBjUDV0NUpjUjljRzA3a3pRT3VsZk51MFRyNFI2N3JCOWFYekFMQlF5eTFDa2I3aEVvaVJjalRIdHdnUzgxSkdnMWovUG9KQXpXZDFCY2RYOW9pc1pxKzhxWmlZUDd5bFRTM3NYNVh4bFR3WGFtdGhtNVNabmFMdUQwckZQbGVoOTZNZlQySkxCd2cwQ1I1dklsTHltYklhTU9ZOVh1Znc5dHZmUXo0eEdyR0wybTdoekp6UGdGbm1MSE16Y3JxTjhoYTRsRmtLdGhZOXZ2d1ZHY0VVMlZLUEx1SmZQTEF2K2VacTFHNWFtKzdQZkgvOXpXaExSc2ZnU2h3cmtCYk1WbWNZUTZqNG1Mb2tmZlIwMjZXZGNZVW9tVzFYTjJ6OWRtUlZ0Yjh1Y2p4allrdE1ybzlyMlBTb2w4ZW5CM0h5RHVjOCt3NXFmSjQ0WDdaT0VzNFBYUXlydWl5cmh2QmV2b1U3dFhVRVVGM3V0RHN5Z1NrWVBCMFRxYWU0ekltSmZDYXFTdWozOGVGOHNFZlFHd3pIVXgvaElvaE94TUIxZVhkRTJQZjZsdm9YL2dKczBpVVVvR2o2RmNLNC9uUzRyV1p0U3kyMm82ZW9CaHluSVRQeVM4VUw0UExVcXo1d2g5czZyTnRIWU9sYnFqS2NIb2tXU0lJaW90V2hETEVxelNsUkpaZmpqV0xBaVB6RGpyZTNoRGdOM3h2eWE0ZVUzNEZXSU83TEh0cXY5MUI0SkNpQnAzOVZmLzFETklyTmN4VnNyc2E3aFRwcHgvQjZ2WEs5dWh4Tnl6VFdSd3BMNml0Qk9VQVVMZHZZRkNubzZkbyszRlBTdVh0YlFwZ3FubDFHbm5KT1RMbmVlNmcvSWxSRlo1ZDdMbXJLZFh0WVV0c3cyczg2eUZKUS9Zbk12Qk90RlNHLzZNeDliVWQ1RlUxSHN6TFA5QlJqYm1yMmRiY2Q0K2wvSTBxSWNVbm9jdmRPVG9TWCtoa3BYQmtkWjBUVnViYkVhTGpKVHZUM2JobThWMDZibCtNMHFqSXlaNnBvZTBia1hSYzI0SGNnaFpHTXBuSzNBNWVLUVIxT0NXd1o4K0xVZVlRc09BdFNFRUw5WnJ6ZWN5UWwzbm4reFplQU1YSkJOcGJGN1JLcHAvY2owZE9DQkp3bDN6dTNEQjcrSW81UGpKQ2pzNzBtUVFkSEhhU0VmM2EyR0ZhMnNZYk05VFJheGZ2LzRFSXBSb3hDUlcxeFVXVi9CeHRCdWJNK0ROaWZQUFJzaUFJbkJaTlEzbE9jTUFhY2dkQkxpSm1zVXVQc01VbHI2dDVnQlRIdDdsd0xqa1lRWVBGZWgybkJ2WFJZbGp6S2xMQ2laTnRObGZjRXFIV21ZTkJUclN2Mkd2Y2VYSkExdnorRi93Z2h2UEFxOWdyQkxFZCtSYUo0TG8rZi90N200OU1GMHRjSllnYlM0TFlsUitvMTJJNmUxRzVUMUdmbWxVcE9lNWE1V0hILzlVUEhaMlRVUmZoOEFhN1RCV0c0bmt2RUZpcTR6VzVmT1ZSNEhpbWh3MC9yUUxzc3czUmd5MC9TSld1V0pTKy9HVndibEZIMHlvUGp5YkxvWHlhMStZaHF3TlFzKy9WVHFIK2dqcmQwR2RxaXlxcmV6dzdndVJaWnNQU05OOFR3S1BxSlgzeXg0THNnN1NiK080WlZxMWltOEZyNm5zeXdMZjh5bkJtUVVtUENLZ1pzR0xxZzhLVUNxeXdMSXhKNHcxdUdTTnRvQ1dhalcvNlBLaHdlMnM3eXdzSDJ4cDdvSmI3NWhENUgybllBL3diOEMvM2dWRmMrckU2TE9NQ2FkbUZsTXpNeEw2cDdwRzc2YUcvM0RIWEhLa2FqSFArRUI5Q1NuQlh4U0E5VHJ5bmZIaWdEeXdxRlh1VUZBYnRqa2Jaa1dsRGtNL2V6MXdIdThhSWJEa3luUDNNU3VXa1BLay9xbWQ5VGtHKzN2RUdCeUt1c0lIQlB5REpKSENRWCtjUy9aaVNXVnNDRjFXb1JCOGxiUVV5T041R2tOSkF0dEtmR1FOeU1pWjJybUkyZWxFd2VOTnNqSkxLVzVmemFyWjRzaXFwdzF5UDlocm51bUtnYUp1dzFYQk5HN3lPRVcreGtlZVBiOHVjM3JGN1UwU1Y4bGp3blg2Tk15ZThFVUJNSWY2TUNPblprUndINnFteDNkYytxeEZSN3Y1bDUyQXpWT3QvZlEvT1NGZDc3YjA1TVNkUkwrWnZIRHd4ZlA1QkpWc2pqcm5iNEg4ZjBjY3hzSjZGYjVnbk00Z244NzE0cmF2YWRTRzQyelJPWnNNTFgyNm9RRkg2S0NLUUplUkdNV1F4Mmxya1o4bG9Gc0g2eXBUL2wrdi8xdFJ2U0lhUndnK2ZtMnVxQmdmcmFhVWdxbWV5ZDNyV2lmbkN3dm41VEJpU1VwUGRhckY4eDByZGlSU2NrZ3h6dWxUWmRXM3U3bmFRa2hDckNTRFpNU1NTRktZaEVoUm9ja0lJUUJnOTU4Ry9nN24rOU8vOUY3RDU5L0IycVNGQXNDUC9yM1NYRWlDQTBOR1lqc1djZjRSWng5dnQySGQvc2R1a2cwM3JrN2ljczlLNlkxRFFOTThMN0VSTTNud0RQVjBmazAraUVuQ1QxbVVhS2taSnA2am5KclRPc3h3bUNKQ2NLdWtOVmFLcWJBSUdXeEN2Z1lsaXVPaXlQeGljWHFDUSswbEJEWkdIRnhDMlJ2RUlkSjQrRzl3bEpaVkRZc1FCWXBJVGlGZkhpejNBMlBrWWdGSE5DdVNFeFhMYnljbDRIYS9aRkhaZ2RpZW82NTJLNmVNSGtNamRkNkhUNWluUHA2bWtuMDVXTHBjN3I1a1lqZWlCeU5yV0FiMXkxdU5XcHYzbTBzak91R2RvVDFRbldRNEtyV3JhTnpaUnViTWVWZWdYMFdSa2hHYVAxaTBrYjF5Yy82MWloZWJwdTZ3TjlVL01qemZvTm11Y2RIWW5QNXRZL1RvSVV2cWVrRTZQTDB1bUlHVWxmYzFKeXZDenNKQkNST0RsemRCaW9XUzdTaDF1TkJ2YWdPQkM1blJpSzY4WWgvOEJxUFBMSTVQRWc1OFFMbDEwR3JoNmJkQmUwSlgvTnVIaW5yN3g2OU0rYjltUXZ4dk00OW1LZTlhSUQzcXZUZWVOVWIydHFxdW1YanoySFQ2a2ExRTh6eENJeGxjdWhKaHFXM1E2K2c2L01YTk8rWDYwQVc0UXI1cnc5OWp3UWtnN09YcU5NbWpJYUxHOU5ZbmJPS3ZVTkdZZXZVbVlmalUrU3NubG84VlNOeC82b1R2bUxUeGM5UTJ1LzZ2SVBFYklzVkFwYjcvaHJmSmhhaUtValVFRUJ3ZG9nVHZvMGw3SXVLcjl1b0M1VkVWZFJtNU5FVzVHY2hEenZBbjVPUytqeDhUeXhwaTZReVRWRVJpRmdjUTJ3MmFSd3NlZHVCREljRTZLRC9TOFpZV0hIc0pxczZpaXlucHhWbDVua3ZsenF6RXFLTnhUVjdZbUNPSlRlQjdzSnN4SUtmblk0Sjhta3hpU0RKTmZsdkdYb0d4WVFreklaYWlxTlBONHpSRDFUVWJhZWFOQUNsbm11QlZpTE4vRFY1VUoranhjN1pteFMwaDBEWUtjTVhyQUhRbURLeENFRWU2MUV4bWZFNTNmRk9iazNTMlU5ajN6ejFvWTgrNlZKa3JHKy8vZHJ0bnZ6d0FmZXQzYU10aWZpVnFWVTlURjEvZFZyYW1nQjQvTDJsY3FrdFhCam9NbzVBMCtXSStEbGNCWElnSTBZY1ZpZmVHenFJYTM1WWJ5UURWOTU3V2lIMjlIRlBYanQxRHNsUi9ZWlN5WGg4Umo1SitIUE52d3phKzVNWVg5N2lZSnlqa1ZIaXU0dkdtRWN4ZFhVZW00MlAxdloydG5YUkt3M2l6K1ZqRHdTMm9SRW1TMi9hdXBUWXVwVjR1QkYyb1ZPVXEyczkra2IxdDJVbnIwNlRmS01IMFhwVDFCYjJuTlI5azFPak9EeG1KQ1JzZTRSR1BUd0dMSUdNenJ4SFhuK3A1Z29yaHpGTS9EN2M5WlBQNjUySExFdnEybTB0SFFnaEJHOHhiQjZ1eGZhTktNQk43bjdZd3N4YVhKaEZXWFM5MkMyTTlZcDRmbE9rZXVkaTdLdko0V2VSSG81TVUwcmFDQlBRbmJvUE9qWWZyTlY1MERDQy9uZXV6a3BhenBjMzZzOUpyQVVsbzAxa1FtRktIVkFEVFQ5UFZ5VGkzNFZ4S3JFSUwzaml3TytLOXZtWDJxMzN2eStiMFJKckRKb2VlaFlHZ25oNkhkSUs0MU5hOHZNeWR4NE9XVmNOK2hULzZXb09aaGxUS2FGK2RSdkRCZEd5c3RFakZCZE12ZlV3YTlvUkt5UW81RHFZd21HdzQ0dkZqeE0raTJiOVI0MlF0MCs5bjBnYlpkV3NMZWxEUGN3NldoZC83UTRpWmtLNTNCdTIxTDY1cDBUZjB4UkZHdDJwTlBveTk5RFliWU90dUxrOHFxRUxVUWE3TGt3OEFBK0xiK0g5TjR4ZWQ1K3dLWlF6YzFINGI1aEVuQ3hNcnpwOHphYkZMdzRQb1dKRlZMaTByRDFIcjNzRks1WXN6SDdibWJvOVhQZEF0UjRWbGwwWkt5Y2NidHBiajY1eWxqSDg3ZXhsb2F0Ylh2VnBCbzZWNkNrSXVMTER0TjlLemx6SDVyNVk4ZHpTTXk0R2E5ZGh0YmdiNG1YZWtaUHlRcWVZSGlZS0NISzZGNFVFZUFkazQySVRXYkVGdnQyc2NRQ1RhRE5TSmVjbDc3NGRQRnJXNFNFTFpaTGFCRVVLVTB1bHJMREQzc3JSUXBOSWZwMlBBOFllM0xMaHdJQ0d4TFN4S3VJTDRhOFo2b0c4bVZaMy8yYkJPbmlyVm9kVnd4NTg5ZCtpcHdjazRRc2NDc0o5WEpiYmp5eTBhSDVadDdwOHc1ZVVhcXcyTVNnQXRjeXNpMFFNY3pmVC9wN0NBV0FQWmg0TFdRNkVyaFJ5OWZEaVQwN3psMVBROXdRbnFxWVdxM0pZQnJRM0JTeUN5ZWhVS1ZIQWZHdU5DNU5SeDkzVnFtV2lZTkVORDNjN2g4Tys5SVo2Vmo1N2NDUnYzSlhjNUtCMjFGaC93R3lmOHNjWGxqOStWcGo0Mm1KRkR1SzdBS0d2eXRjaUFtdHJOd0d3VGJVbGNLSEc0UDlDanJ3NU1XVkNzeTlwUDJkclllNDVUa3pVbndDaTN0RzBiU2FDbjlaSStPMjNvZXU1TFJBYytLY1lta2JCWkxmOEFKaWRCS3kzTFdUbzRndkVJUkpvcUlNaUZxWDVoZ05KN1ZrUGJhMDMrUTZnV0tTdUtCM2Q3U2FjbklMTVZKUmRENHRheVA0ckdHc3IyWlhnWGc5R1B6aUxWVVZUbGZxRXhWSXV0c3dWcXhLcy9NUHZHZnFxQzl3ZDdrcGQ3QXV2M0JsUTI0UE9oMkxTVWVqMGpGWVN3ZUhzSHV1dWNMMkFpcVRJUEQ5YTRkdndEZmxOdmM4Y1VkQkxKdkFoNzdaNlEvMXVPbUIzSXQvS1VjSmpCMkQ0bDBBdlJtVzdUMVpCbVhKNS9TYmNMeW4wMkZOaEdac1RhQ2Q5ZHhKbUppNW03clZrK256YkxSaVhjb0dITi9PdUd3RC8wS201OHRFMDI5TTJRUU03YXdyNWxMVU0rNXRiQUd6RnZWMEY5Z1E3Sm9ETTczTGZNSDZHVmJmeGlxWHhCaVk1ZDBHZlI4cEcvSDhOVjB2dzJuejlxcjF3NXRMK0YyTnNSS1IvUVlGWFNWRmd1NUdLaEFJMmhEaTZGSHNhUE0rZVdlbm80bHZ0di9uNitSSy8ySCtRRDlqdHFzSGpaOHBTWG04Wmp4d2R3UFVXRVdyUSt4c2o5NTI1Tk9uNms3VFRDaWZXUHZvV1NvNm1scEVTMmtJMUdnUk83TmtyWWFBNE1EZG5pSkVucHpNNEhYN003eVhYTjBFRFo1NGNlUEVDZlFaOUpFYnpXdWRyVktXQWEraTh4ZlF5NkdXRXZ0dHNQUnJKbi9UalhSVVh2cml3VVVnWkU3cU4xcm11K05YakZWRmFEbHNZN25mcUNwMkIzS3U4OXYxWUY5TENEaVV4bXIzZkcvMnJmR1BZRWlDNERSa1JEd3AzbzlqZDRCUEwxL3RqRHlRanU3NkRZRXM2bXZPbFViVjU2b0dNRkM3SWVuVnZhT0lBeXQ5aHEvZmRmSUpqUmxiMVo2bXE2ak1DNFJGcUdKRUtsTmZoR3lvdjB5alRzOVNRNmt3WVNwUG0xSzlQaVpwaG5ROE9QaWc4ckU0bm9LaTFjK3NaR0s5dkpFQkZrZy9xbnZjMDdqSXVjMlJjMXNpRjdaRTd4bWhTR001Q2RKb1NyUTRPb0VqamlWTjNNUVJwMmdrRlVOVloreWNINXRUN290Z0JFbDIwLzNyc2VGeDkzR1JZU3g2R0QrYVZpeDA4aG1LVWRXekdHMHBRczh0bE5YNnhyNkV0TTZSMlZGamdKazVsbEhRRWgxN0ZSNHBSTmE2OWNRUWp2bkFLRHgwaFVjdkE3L0x3WGVCMXIxaDl3NGg5bmpKem11RmM4aFN1MHowRVlvY0ZKR2N4dzdQdVEzY25VNmlGeFkyR3hNSUs1SlRtc01FMjRPUFFObkJlQVFxZE5TRERjRmRCcnN1MEpCU200ekRFeHA3bUtFNmhwVVJiUDB6SXpBS2k1b3oyZys3SlV3Nk1iYXh2NTM3b0cvMmlwenpDSDNBbDRIR1g4YWhEdnV4ZzNFSXlPZTZlNFZ0YTBrRFVzSFJzVlE4eDJQT0xVczRGUldtM3Y2c2JaK2Y2cDFVY0lwS2k4ME9OeUVLWWV5VVB4ZWNUb3N6ZkVuaHdyWDdzb285ZTl6RWZaeU5oZHB1K3l1N3I3aVE5M0Z5NWh3M3FCa3A2VW5mZXZNZXd0cjdYZVFXZHg2SS8vQmxGS3dLdWFzTHUrK1BFZnVURFVZRHJIMmdKR3k3Y1AzWHMyaENnVi90dkJzck83OTFQZFlPcGdjWHJnOEcxdWdDWUVDUEhETnc0WjYvZ09lcTY5NzRWM1Rza3dEMFB2ZmtIMklka2JWOHFxZXNyb3ovY0ZvRXM5YXJqbG8rWXdTQkFEUkFna2hTWjAyN2RPT1p6dEgwSXArYUNreUpYbEFhUWlCaWd5d0hIS1I2TlcvQ1NOSVFSbHBnZWlTTVlIWk9xQTlvMmtWNzAzTTFFUlZLU1FqUmk2b2h4S1lKbW0zYTVZalY1OFFrWVNVZmcveXRvTFNyZ0xnQ3NRbFRMREFKT2VkR3o1VFVPQXkzaVVzQTNORmRNdGlka3JPcVRTL1MrQXpDTnRFTC9PNndMSzdXYUpqajduUWNqZ0JjdWVTNEZCRTZlZnNNQ2ZkV2QrMWpXanVMQkM0cWpMKzRrc0ZJLzNScHg3Q1VKRlJLcmJUcTRubFdkMWN0SlhmQ2FsSlFvUzY1bENMQ2JvNjJvWnBmanJZYWVncmhFUFhPYTlmcUoxeFJwbXRYKzJIbk0zYkIyWVJLV2kvVHJ2UmJ1bWQzWjhmNGFucG51T3pPbWY0M0MrZVFMMDB6Mjc1d2p2dFo0dndQQ3hCajc0cXpmQ282dU5LaUhTV09kcFkyK3FTU29rOUxIMzFmd3ZBejkzbXIvcUVTY3RZWTdBT09pT0VqRVNNaXhuOUVUSllSMC84aVp1dEV6TitQV0h6VFpyblpHR3JoN1lMMTlzR3ZNeEhBb0QrcFd6Q0dYQVJGM0FBZzdnQmdMUlQ3RXJibVplamorNG9KdDlEeEE4S3dKeUFCYm5yclR3N2dGOWhObTV6anRUUWJwWmRSeHl3QS9heG05cnI2djE5c3FBZjZRKzFDdFQ0NDd4NnF3bDlXZk5yZE5oa3k4c3pyZzdhbDdNUUdob3lMRnQ2dVFGclEvVk9oR2kwQm50OW9nRlZ4ZS9oeGNlY01YcDhqRjBNR1ErcERHNmU0czZCcm1ZWW5pNE1TT3d5Z0hZakszM2JPZG45MGJPa09DRnVoUFk4eUx1SmJscmkwRmplVmlCWnE5YTNBQ1lBdkJsVEYwZGpiUFR4M2R1RGE4elZ0Vnk3Wm5sNmpaYVhUclVDRzkwd2g1cXdHU3NaRjF2V0hzckkwYlc1L3I0V2Y2YTZBNjJWN3FBZ2FZMFBPUnB0ejRxU2w0aFU4MjkwNk94Um8vREdRQTVPREswNWExZTRHYm1IcmV1c0wwWUJsL2UrYXlLa0Y3RDE5bWZwY24zd2k2dXJFRWpzV1JmVzdmYVVsVUczMmpVakRKQkhBN0NNKzFGdWZySUpIQ3g3ZHcvRHNibGZRQWlFMTVycVdsOGUwU3l3Um0wR2ludmV4NDVvWk41RUd6aEQ5V1lHSzhQMFlLb1FDRm9qa2R0bU5EZzFHdThCS2MveWw3WVBpaVFpU2srdE5DVUk3UjBRc3ZCMmhTSEJtb3JzSmVZUm5SYi9rc2gwYXNWbmNpbWkzUUcwQUVIODE4eTYxUGtKa3BpaVdGdEMyYzcwdzA5a0dTQWJKK2NGKzhIM2hGd1ZzaGxyRzZMMlpMakpMRVVHZWFrbUE1OVc4a08zTVF2LzZSeE5kZ1dqcDZvYlhkOGpxdUhURzJ4SDJPN1ZkVHFlK0RnQzRFQi80ZDFaN2NYZmJDKy9sMmVWREc4K3lSREFQU21YRCtpd3pWM3MvVkxEVStCUXZGdkZaZlJWZlIraXVoNmNDcFFIQlV1anR4WjFlbUdkMTZ3ckdJUTZ6Q0JnQTA0TGZoam95ZTljcmtXSm1SeW9ZcXpHRDUzaGdINnc1QkdrNExzVHUrcGt0OWRHWWs3Y0swSjVqZG1VaGZncHNNcWlJMEtqZGhvMUVJRGZCYldmUGd3OXFDV0pLcmtvK3NGR1VHeVBXYWxVSCtiSnVucnpJYk8xcERaWm5RMEhvSUVYZjYrQVhWWGEwVmpjakVvaVRRS0prWkl3SytpWVhyZDkrNEN1VkZnWG9RaWdZbVJWQXZPRzh1N2twU3pCMjEyek1wN09KMFJyN3FPYTZHaTdPT253a2VLakU1SVRMRk9nMHpPbjhYR3R3UDI4Y2JiVnJjeFNBQmhra3Q3RlpUZW5COGFpZE1ob0pyUlQ5WHhCTHI4aklWQjB2Sk1sZ0xVSHR2SnkzWit2MXhVWEZoRFZJajlua0lmYVpDWlAwcmJlSzl6Nzg4TElKaTZZcFFodWVNQzB2QTJBZ2pFTGJQS1FlUER4eTkrdmhQbHRyRDJrSW5wQ3RCYXBUalJlNXloWUYyTWVKWHlEOUxYWWpSc2tzaSs3RlRGTEpnV2JNZUE5VVN2Q2dhR1puR2JEQS9MSWZhbEFUbENKTlR6Zk1Eb1NYQWxJeFpBYmJDRzdaRURGV2JaMFVHaVlYdlJzZEdYaEM0b1lTMnlCc2cwRzdjWlN4aTZ2b1dqb1ZqSjNHWStMRDFvWllHVUtYOTE1U2d0bG9rbXhiblh1eXhBSzY5NDU3c05jUklsUlZ6akN2cHpPWk1wdis5dmwxZlJVMERteFNXNURmZ2pObW5SZW5kYldIR0dhTDNkUnJVUkRzYmhhVVBqQnF3MFJ0QjFUelU5K1ArWGsyTktKVGdsMlUydEZhT2RBb09LWlJlMTZzeWRGZ1BvdElXaXpud0F0QUhXaEFFRGxEQzZObnhqM2dWY3RxYUNxdExUYVdqTUtZMlhNTGlxTm45Q0h6TDYwQUl2M3RQSXVtMXpEeXFTaEhaQ21ucDlSSkVJWnBDaUkzdUdYZnN1MUUwelg3dmYvdFloREhBbzFacnd1bi9XV09paDJKakRxS0l3R29PaHpzcEFLa1ltVStIeG9QSEVpYXQxbUczYk4yVXpvNUVZT1ZQTEFFUWZVQXR5YTdhOW9uZVpLRTc0MzV4OWVkMjBkeTRiYmJMMEwwRkdiZ3MwVm40bTdoaFdDcGkzam5WaXZ1eEFLWkFQN1A2dmNaa1pTVk0zNTdMTTRtODRaYmJ2eDB0SkxGUlFMdXlKV1ptYkZqb3dBUnJGb2NMb1BIZUUySTE5ZTFVdGdwMTFzWkpSVm54dTVOZ2M0VWhGM1hvVlEvQUpDOVFRcGthZEI4Y1ZGNFRDRGliZ2VmQU1KTWEyOHBEQTh6UjlKa1BBNWc4TkRhOVpwR0dBdFVMZHF6WEtTcUloR21QS0wvSk95ODJyV25EdlF4RWdUUllpOVJCTy9ybW5HMkVqZTJISlM3dVdPSk1MeEhtbVZLR2RsdHA0ekp4aXBxQmp0Nm9zV09TdUlxMjRpSDdYVG1QbmpCc1NHWTY4WnN0THlHMkRVWndzc3BoNDJnNjVza0h2aG0wWlV0cDlLZ25PdnNRQVBCTFBVZ0t5ak5OMjU5bS85RjF0YXorVGlkSFJEYjFVNXJJblppdzVHNi9INEJIck5kV2FkanpqbXBvRXAxV1BnYWhMQ3lGaVlpc0RhYk42YkdXaG9wSGxLZVo1bjJ2SE1BWk9LVk8rRjY1YWQ0dW9WME5XVm50SUVYZHkxUFpwdzVXQTd6dnBUUmFEaFJxaUZqSUUwcHV3Q2E4aWhjL0ozTmJ4b28vOS8zeENnWWZlL3A4NmgxWUZ2NmtUVkt5Q2o4aHJNQ0I1dlBQVmwyRk9VeStPa1k3MlNXK2JDN1pYaHVHZ2JTTmxHa05RanJsSUNLdEZVQ3hzVFlNUWZvYTBscDQwTjY0ek15b2FVc3N3R1pDUU44RWYzeFBlNEx3dFI2Y01zV0N2KzJNMWJ3TWlIbDZiK3RBU0pzcklOSC9MR0ZjZzZPV1YyVVd0cG1DakN2Nmpyd2k5US80ZFhpaGJRMjgvMU9WbVE3Ym1YY1cwdnJKbWYrdFNLaTNITVpxWWphTWdJd3lKYzlNVHFVL1Ixd3pLbU1UVnlGOHo0RUl2aEZmNEpYLzZtNVoxTkRoNVhCSmZWalNxV05SUjlTWm82a2dOYWVKQlVZZGNCeGNkTzZhdWFNODNIY2VsdE44eWoxL1ROb2wrdW1iNkRVdXNNcTlHZTVaUi9DdGxYQytQS1VzQlNmbnRMc2tkSmRsNCtZOXRPK1NrU0xielByMUZYUVFLaG9DVkNycUlheGpzYlZhakFNWURsY0tLZjdMQkJVMmpOUlN2M1h5L1dyaTRpNFJiWXdUTzBpa2ovOGk0Y05VRUNnMnBVejJzZWdQSEJtYUJYN2ZVK3ZqV3hvMERlWE1DbUFrNEtJVm1yT01hOWhrOEdRTVJkdlcvcGVGOTltMXN0REJRMlJvTm1ZY25XWlkzazJ3M0p2S1pKWjFrZTgzRExwNWN4RVRmU0szUlMybFMvUzY2dkhsV2xJN1lvci9yNFd6WlRlYkMvZUxzdXdaZUo5OUZHSVp1cXFOODlmOG13K3YzZlAxTE0wQmhiUEtIb1pYUEZ0ZW4zNXFESkxZb3VYVUZUYXkvZmRkUGV1OWxUcFo4NHNoTm1oQjdhNW1sR0tIbW81NHNPY1A4VnR5Mk1ackQ3YzI2b254REJWeXF2dDcwaXB1WGVaVVRrNHV4eFB0UEN4VjdCZ1lwU01Uc2R5L3FtMGZxTzl0OFczbVhWL1ViR0djRnFrRDlLa3FnSW15QjRPTERXWU1LY3lvQlpvbGZ6WDF5YzZDTnhKaDBXNVd1cXpNNHBTNVRrSU04N0UvR1ZmMDZwaDhqUkpRRGhDT3VFUEhoQW5WNU9KNGN4UHlMNTVqb3RZMWlGSmIxVWJMTExEWHdyTW0yMlFvbXRkWTM4bkhxOTIyZE5wb24vVFVJM1VDSnJOVVZiZ3RINjcxeXFhOVNqc281YXBjSVU1ZUpjVVQwMTl4YzJDNDRlMUk1Nllxb1kyV1pqQVNzeVAxVzFVbTNDMUMvQjVSbWt5R012c3kxeDFiYlJvNkhqUUJwTllsQ2Z0VHdnUEI3UmRpeExqWmdQbTNsRGFLejVyTGM5RCtMVUo4aWl5WTRXZEt3VWdoRXAxQ2JxelgrNlk2MWxqWmFuQTJKU0NVdkJMVWN5ZmNFMDZoMmhHV3BUWklrT0o2cWhWS2g2bzhvelc5cGZOcVJmSHczcTJhWjA5TFhRcko1bU42VW1JUnlmNUVMVGZMdWNEUUdBbS9EYjJZeitPYS9CTGV0b3NXdlJPY1JoazVhS3JSek11MGlWcTN5TmhGa1ZURVlsZFBCa0VxU0VPMjU5OTNuZFNia2FXTE5tSFY5MVM3dVRIZ0dSbWpzUHFUOTk3MjVHM3FOaHpFOUdHSHBTak10MTMzVDE3bVBCRmkzaksrOFlzM3daUE1NQjVkTmZaRXl1YXFyekViUTE0NWZIRVVEa3ZMTG0yYm01c29rT0h5WHNManI1SFlQTzJmTnUzRDhybi93UFJ3MVUrOXVlYm13K3dqSC9IdGcvK1YxY1BnZ1ovWjlJQUF3OXRvNDMvWndkdmVzVkVXeTdlUGQ1d0IzOVNMZklLSjJuM0l0emt4MkFXcTduUWdrRmxGZ0g5UGlWdEN3emJ3Q1diNGRsYythbGxhdzZSYjA1TjJoR0s1Z05kYmNpS2VPejlVbFhYc0RaK2pTeXFLTVhaT0VRV0U4aEFIZzlMakczTTl2dG9tL1ZBYS83T1B2bVNtcGJqUWdtS1M3VFdIazJXY1QraDNqRGV5OWNSZ251RFRjTjlVTHRIVFQ2TjZIRTJZMEJWRG41VGE2YzNEM0p3Q09KZzNxL3ViT1p3OG1yQkcyb3hkRHhqem9yTXdpRkNpK1VoNVVlZUpDa1hnTWRESU5sbDdNSC8xazVNWHIxNUI3ajFZZjM0RDNXVE44UUFOVDkzU1B5YWIvZEMxMGJFQlR5Q1F6VUhWNUJnTXJxUVlSbFgweGxVSmJHdWJ2aGUvWmxaT3VkcTJrWm11MWZtMFdPdGFmVmJGZTJ5bE4rcmVJNXJGbWgxMzRRaHJHQmhOcERhRHJaRGVZb0V3QXVSVDI0MmdOQnVZazRjdkc0eG5zOWhqTllWUVhLSC9ZMG5hcjJoUDhYS3dkOUc5ZGZvWTF1ZHRic290QUVGRHdHejN5S09BbXhzT1RoaFVtUnppRkdYaG9lZ2dCakUvWHlhTlM0dEx1YTAvamR6MnlrRHM1OURXdUpoT1F0blVvQWQxR1h3UTFEZ0FQQlFzWGpUd0NGRkZVNERpWnJCQWNyakJxLzFSZGEwWHBEWXhQTzRCMnJZSVhVNlNFbkRIRWZVWkZUUWJ0eXE0dSs1bDhDVXZnV3dHWXhLQ0hVZWgxTWVJUHAreUN6Y09vNEFnWWNGTjR2NTRFdkpwUW40T1ZxbjBUVUJUdE9tc1RodW9jTmQrYlRtNTVkcys0b0s3Y29BVUkvKzViUzJiK1hFdGFycGtKWldCQSt5ckJwWXdKL3hDZlI3RmFnS2t4ditjRzQrOTFJUkY5QXVWVXo0ZVgramJDVWpuWloremlaTGtPWEVLTU96Y0NpdXhXRllnYWZnNWJoTmpsditQaFp2VVE2WkFkd3BoNFBRQmNja2dOaGkzV1lzUVlDMXJGNG5VazJQZkFyQThZZysyNDRuakRsMlBFTWt0NDluY1pmVDhSem1panlleDFueTQ3UUpWUFZqSU1BYWJUOGVRVjJIQlJ1Rnp3cHp3amNQendhZ25rSkhocHhCS0dtamhWWTZzSVVJUGdSK3lBZmNGSWlRdTVBU3lLaER0R3NnUmxrVFFxUWFCRUU4blM1YVI2WGtKRktKcXBCM1FUaTQzMVFtYlN6TjVPcnhKbDJscEVKZHlQYWNtQ2FhTDBJNkYrMlJXOURQYlQrZXlXMEFFWjhJeERRT2dsc1FkYmV4YlRRUVFBajRWU3dLTmpraTVXSUtyZU5tTHhTZzZDeW4waUZkVEJOVTI3aWx0aDIzdll0bEREdW1DZFZndjVMUFhIbHJDckdEa2FKbGxpOGltVXhLSlA0UWlSSlJqU2NGaWlxN1dVcHlxMk9PQWVvUGUxdjNROFFmNEx2citzK1BuSC92N3hIQ3o3R043NE96OGlBTUhCcjZkNi9YdDlmaGJhdlhzNXJ3c241bGRDMFpQQzNiZUZ3STdRdW5iVm5BM1V4b0dXelJQTGppZXZwSjQ3Q1ZGY05QR2dhTitwR29Hem0xWXpNbnZVWjFUMVIxUkdWWHgwRTd6bjdMS1d1SjBsckNUdjFEY1UwVXVWYlllQVZOUEllcEtiTldFWGxsVGNzdHZaeWlhZG1GbDFYTWUyVVd6Y3puZU1hOG44T1Fiek9UT3pHZGp0NVVpcWZQOEZLeW5LWkx2T1RFTlczc2FRSzBwTUJMaktTZU9ycEVGUTVUemhUTXBNL3ROTG5yeWR4cFBhazdUcGZuaVgyYlErUnJDTDBJMnB5YmwyQ2o4UzJOcDN0Y1BldHh6TGdlMnlSWXhzRXc5enFVQ2gwVUMvMWswblVrRStNa3dqWTJtaHYvUDd1eWFEOVJxOHBHRXpXQ01CTVFDblFRRENnSU1BTGo0d1I3Qy9BR0ZYblVVU3h3Z3dpU20zSGFrM0RZSGJETFJFQ0VZVVJrNWJwZlhZZjRxcGRZU2Fhdnh2N3R3N09EMitYWllTakRiblVuZDZzcmVWS3dvbzA5WnN2a3RMVkVIbGUzY3IrNmx1Tnh5UGVLcVBDSy8zYlpFaFFmbU1mbUMxRHBmME9wd2JDNmtUdlZwVHdvcUdpang3U3NuZFE0V3EvaUgveGs1L3lvOFZzZnZZMXdhaEg0MnNyWmFiTStxdUZ0U3daRmZTa1o4VVB4L2Z2MzROTTd3cWRaK2NXQmE2K1FpYkxwSnhwenVwNTlZclovY2lVK2NYQndRcFZYVEpRV0s3WUJJZ3Q4SzZ2Qm1UTEVUaXh2RnRhUlJjM0Y1WnFta0FwUFpRcz0pIGZvcm1hdCgnd29mZjInKTtcXG4gIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQkItMDJCQywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIxMjIsIFUrMjE5MSwgVSsyMTkzLCBVKzIyMTIsIFUrMjIxNSwgVStGRUZGLCBVK0ZGRkQ7XFxufVxcblxcbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcXFxcbiAgISoqKiBjc3MgLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vbm9kZV9tb2R1bGVzL0Bmb250c291cmNlL29wZW4tc2Fucy80MDAuY3NzICoqKiFcXG4gIFxcXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXFxuLyogb3Blbi1zYW5zLWN5cmlsbGljLWV4dC00MDAtbm9ybWFsKi9cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGZvbnQtZGlzcGxheTogc3dhcDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBzcmM6IHVybChkYXRhOmZvbnQvd29mZjI7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R01nQUJBQUFBQUVSa0FCSUFBQUFBZ0JnQUFFUC9BQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdsb2JpeG9jUEFaZ1AxTlVRVlJlQUZ3SWdYd0pueFFSRUFxQnVEeUJuaWNMZ3pJQUFUWUNKQU9HV0FRZ0JZUjRCeUFNaFI4YkdYQVY3TmlUZ1BNQWhKVHNqcXNvNmhWcHBSNUZ5VnBOQlA5L08rQmtpRkFYV25YN0hWQ2lGTjJhM3VxTk9tQ3hQWXFmMXFnNzJzS0J0bGcwYWZVRFliVXBoN1cyRTRIZmpuRGV0V05ibzduNnJJdCtZSFNGQVQ2VytxRFpIdnY4MkcvNXRXTmJjMWQvWEFvbzR6aWVwNmY4ZFBRSlMvMWZZSm5xQ0kxOWt1cy9qNXYrdWM4U2dqUTFEMlBKMURwUFAxTVRKa1luNm1WaTlrMk5BZGltNkREbk5xOW9veWhpQmVhY0NZaVloRmlvR0lDaVltRmlCUVpHRkdCdDFvYjJyRm81dDNhVi94ZjVIQS9mTHg5M2JuMmJBamlNUmtpNlpaQkZ0aXF4TmtwUWxLU3JUUDd1NS9iZkoyTmNFbVJGeS9XeUFaNm9EbW5ndkE2K2kxelorYW4ySWxBRFZFQUlDVWtXbGt2VitYRDV6Yi9aYWExc1dadW5PV09tLzN2R3ZOMTNjNlpNYlJtenVKYnA1cTRqWnZVRWFUcFVDT3J1UGtKUCtnbjd5RGFZcTRTdyt0MWNENWlLTDdNRlh3Z1FRckNSRlozZEwrYjFGZlUxM1N1cThVdGIrVE1tbkRPUURLM3FVTHVPaVhiMkZneExkVzZOU1Zvc0J4bkhkcld6NU1uMGRlRW5lT2hQQll2OWxmVXl4ckJld0hxZTcvRUNZRm5TTWpNcnp1UERmeHd6N2M5L0tlWW9HenRBWXlmbjV1UTFLU1d2R1NITFRyamFLVWVrZ0YzbDVrN3UvMHcxMndGQWlrdmxTNW04U0lkVWRBcVYzZG1WMjlDRjErLzhQN096TTdOTERCYmdpVmhRRkFqeFBaT1U3ZzRBU1Q4Q1NseEFmTm5oTWkzbkxvUkU0akp4bVRybldJVVE5T1EybHE0YTk1VzdrRnNYWGVFeUZvMmZadFlBUHBwZU1jVVlNSW0waisrK1ZjdTRhcEZCQnJmY3V2NzN0WmJVUUREWE1VYWxCUVFFRkJROE4vdmEyaHRCWUFoZ2tlcHBMOUpRVW4yRVJseUVieTdWVDVYcFp5bjNSWjYvK2xWM25BQ1JCN0pveXNJTUF1alErdzBVNkVDazBZZXRPZ0h5T1d2Q3FMN2thK2Jna1V1K29RMllzT1NIOEVsamRoRi9JYXdqUTcxQ1E0N2c5T2p2MlE2QS9BTEhHdTlYNHQyc3V3azZTSHhLQ3ZkOXo4SVE2dzlBR2Fwd1ErdTVFS1FubkFJZG5rR0lnQ0FITldJaU1kSWlPd3FqTEtxak1kcWpOM2pWV3QwdFNjZGpLbVpqT1RaaUw2N0g3WGdZYitJWkg5ZWY5YjhBMHEvME53TXd4Y2VrRkV0S3hkWk10ZFJLL1RSTnEzeVhpTFRqNDhDa2R4S1RsR0VabVl4a1prYm10aVJibUJWWm04M1ptZDlaLzUrL2tFT2ZkekhuY3lXMzhpQVA4MjQreWhmNUxqK0cvczIvWEpqclBNQlRTcmtncFYyR0JTK2JjaWhVdVJldS9DcTRJb3BlOFpWU21aVmY3S3FzK2hvSnNyVUc1WjlNbEtBV2E2MTI2bW9kMWYxNlVxL3E5d2J5bi9uUE1IOUpHTUpzK1ZadHpkWnQ0N1pvMjNacWRIczJvUU9hM05TTzZjUk82K3d1N0xLdTdrYkVqNDVBekFRYnM0MmQxWmF3Nk9nMFplNTI0VStqT05mQjdXSkpIaDdnTXk0anZvY0l6WFRld3lYMHcyQWRyK3lsU3FKaG1sbHdhbzR5andvQ1g4bEdsN3hLYTlKdlIzbEE2NHQrMjU3MC9SYkVjV1hxeE8xc00ybCtreGZWZVU0b09acHdrQldKU2NUeEpURFBEOWN4SGovclVpZWF5WlRnR3RNczB1RFRsazFXemRISHFJODRLMlJnTEQ3Z0U4UlVEaE9SdHZQM1NnTjg3OFBpVDFGNUcxSEF0elYweExjNjAzRndGK0UreDZheEQzOXlrYmZVanF6T1crY3dxak1jbjRqeGFNeUhoSWI4TVE4TjJadjFweWJyUEVFL3hQRDZ4ekZ1cUJjN3F6SGhORmlMNmp3dmlGaUNqQWhhODJoRnA3d1lIZjNONlNnVU1LSlFSSzFwcUNEdnB6R1cyV0h5NElUanljeXFsMXdPMlVGenJCemFJaE1UY3Eyem9NN1hCeEVKVzFqTmlybk1abjZKSEg1MndJc0RrTHJjc2RleGhWMDFaT0ZWMC81NlVaZ0l4djF1cnc4K0dFM2ozbG1OTUVrcEEwemUxU1hSZnhjYkkzQUZEOHp6WjRFd1lONlNjeXlOdGVFTjhvL2wxT0dYNUwwNzlQcDFvQTk5Nk5mMG56aDRzUkJyb3BZRVpMVytBb090c3MvNHMvQ3N4eHN3ZkhIVGo5bzJwWlVPRzltcjZ0VVE2UDh6RHRBdVM3eXFpQ2NDNlI2Zk9EQkY5TXZqT2xPL21EU01oTTVPL1hyWUpNTDRZdU4yVXIzMzcwOVNJdFFXUnBBR3liMGNwTTBJV3IyZFhkVU5LN2xQa2s3bGVxV1FwQmRvdHRjSFBmSXlJZVkzdTJ0NmZHVERmNmZvMTBWZDF2VTlkZC8vM0FYZ24vWExwWmNMM2RnOWVNbnI3amh5YTBIT2dweTJiMzNPZ2lEK05lUnY1ZEZIMnYyL25WSzF1NzhCd0dGSGJXVCtvUG5wR0Z3OVhvOVZqaGpqZVNoT2hhMUdxcmJORElOV2hLMkZ0dG9yNm5zbHBnVkdwQmx3YnFlanpyaTAzbWRYMjJKWGF1OFJzZnorZzQ0N0hzaFU2QnBsV25zR0EybDMvOXdaQmh4VGJJSGxOb2V0OGZJdHNhcmZmOEJzYkVVMkZIMzZwTzlseUZWbVhXQ3c1T1AvYmIydER1MWFaWTRrVXU0QzFsMHErVTd1YmEwdHphWHNrdUtpd29MOHZOeWM3S3hNVmtaNldtcEtNak1wTVNFK2poRWJFMDJQaXFSUktSSGhZYUhra09BZ1VtQ0F2NTh2MFFlUHczcDdlWHE0dTJGYzBicnFrcjg2SWxHK25LUkdtQit2amhpMWlrbmlmVzQ1YXJSY09lR0dvZjBKMmpxQ094WTduRWpkTWRaNnd4WXVoRjEvbm9wTEhValI5NmxVcExkQjhYclZjTXJEY1NOVWF6L1VNcDZlRmJaaG0yOUFPZ1Y3d01KOUw1cTQvdVFKVFhzRXpaNUEwcnlOWHNnRTREUktUVGp4aVgzY05ZbStmRmlHdjNkSFcrY1pBeHhibGxYbXJxUkQ2b05aZVB5cStsNVVRcmJCd3BUTklvSmZwTHpnVE9pdVJtQ0Z0ZStsamtQNEU3emZNTTJ3aEw0ditxNEFhMEVFWmZOOEpCb0U5V05UN0NmQ0wrOXZOTWlXdk0veFZkWEQ3SGNzN1ZaaVFLUlFXZlpLY3N1eTF4ckpaakhSZk9za1B4aXhjSGprVThuSXJDa1c5c29DQ1FlMWxoZlBsUjRUMVk5NGs5MGRIQ2hLSWpsT3lZUVhkTm10VzJUWndHeFFuVmJBUUNzMnVVekd0cnFOVkVvYlg4M3JkaUhzTUhGcHYyMUw2S0dQUFRnaTRoNXlPdXgwVE5qUHNoT1ZwUi9sdWZNV0FOaGhPaUEvclNXQ3laRlpLM0k3czkxa2dXVnlONUZRaFVoOE5pR2U1TmdQSE5vV0dQSTE1UDQzR3ZucHd5bVhuZnNDTktnZXZiMkJkcXRPckkxai83YlBYakI3U2FnUXZPSHZoRXVpQXR5cHNBd0VZLzFvZk9jT0NMSjdTY0lyd3o2bG5ORnhkVEtyeDBNTmo1dVF3OWZZMVArQWRuRHFlK0J4dlZ6ZG9ncHd1Ny9nYnZBT01JUTl5djZxZDdGRHhSMlFvck1ScXJyYUpEaFV4QWJ5NXp2TjdVVENMaDBLaDBsaXloY2pvZFVqZUVPUEFDYzdGbzV4bDJoOW9EVG5mNXBycnVuQ094M0ljeUs0STltWXRZK3dGbkE1UW9RZW1TU0FzTlpmS0kxYVZDZDR1MDY3TlJ3bjk3a2J2UlNEVUFkcEZFVWorN1RqSWg3SGRheGhxelRQRytwMFBLTmJrNGs1eFdVSVdyVkh2cEtYUTQwNTBqSlFPWWF3Q2ZEaFdkQTByTVd6UnRRM2lKbVp5cnpKQSsxUGkyaG80WTEyWHpnKzMybTN5cEVVTS9ZbktVNlU4TmpQMm92MXo5aHNGUkdCNXlVd1NtdSs1dHhndVE1SGNNQ0Raakdmb0dGdHdmVXlDSjl1clB2eDhFUXNMYjN2Qk1DbGo4T2szcEpjV211N2tYNDFieGUyRWkzME9JTEdva2diWFhVL093T0VmUjFKNEZBRGgxaU1NQmpsSFcyamlFZ0VxVlh4TGY0THVjUzJ5YmFVa3pCQ2lWRktxUkNraTloZ0lzbmNXQS9oWE5LdGdXY1hxZ3VKaXpIRzhjYllXazZkeElMWjdTcENCRWZCanpLWXBMMnhSc1prU092b1pSQi92WkZaNGFnUjQ3TlJPOTZoTUpDR0RiUk9zdEc3WXF0Q2xmYnVoUjRDRlhvSHdNNHlnRXBGRktveG9lNkc3SDRxQ05LQmN2cS9jS2thNXppdVlBVzVyZ1VnZ3ZvOWRSSUlIVEkxVysrZ0RWd0tGaXhraG9pLzdqbEZRNUhRT3poSWUwdVQxTHFwM1hZUlVoVnVzOWhaajJaTEZYV3B5MDAwS2xoRDlaSHh0NEhWc0xDTll2RDlBQWVqWGVwOUVGYmhvTXhZVjJ1dDd6dzVBUVJCTzFxdFlTTGQ4VWFXcGQ5d2dSVUsxS0dSVGxBcU9RQ2Q2WWM4Y1FOcmhMamsxWjBPdmhDaitqeDhVMEZFaThMNHEreWJvM2VDOHNhMWVrLzRpSWZvWm93RGU1L1RLYTFkam1nb0F1VVpLK0hlK0piQUFacjBDUkNYT253RkRtb0ZZZE1pdEFRQ0lIUWpmeGFaSEYvQkRTdEJZR1FUcUtIMUJvRVJtOUI2aEpiRGJYN2RKZ0FRNzNHdjdyY2xVcTROckRYZEFjTGFOa3QyZ0hCaUxzZFhISWhIZmdIQVRtNS9IWjE4L0pIQlpKaTNaUFlPNEVLZmFKSEEwNHZ4cXFQaXBWakw5cURLTXNiR1JrSkhwd05OOUw0NjF4c2tDYW9jUkNXYUN6UWs2WVU4Z0lkUVRKbmxpMmFDYWdwc0xncXErQWVEa0ladW5Fa3VUNHkwbUpVV2xZcXE0MUxSejNqTWhPV0VYVG9Td0VibGpnZXNvandINkdNMUpVYU5Jc3ArbFgyQnZtTWIzdFN1MVU0T0tBVlJVOGRtdCtaUXBVT1Ntb0ZGa1l0V3dpQUhlUDVEek5kQlZMeFJvbXZ2dS9JZ1RFclh3amwwOS9aMmxEZm90c3hnandRNTRIQ0JzUjFvTk1hRnFmZUprWnIxT1Z0MjZTa1k5azFvSExSRkY3bXpJZ0Z3S21pOUFzL0JURnJrZTdzdlpSOTF5Q3FqLy9aeE9vOTVST2xzTUZ4eU9mNUxmMlJpMWdBTUwzaG5kRndJQmlsZzZhdnFmc3B3cWk3aUk4by9PbHBuKzVLL2FJWmdlSzlCbFdTdU1PSDdMSmdWbWtUVWJDYjdWUFlId25Db0FyZHZ1ZFYxbnRMVGpkWnhidENjdUNTc1g2TW41d0VnZTNZQjJCZUx6Q09DUUMxNVMyQzJhN2MwS3U0SHpIbW9VaC9QZUcvN3AvS3NsQStMRVNNTWIzZ2RBM09VOG5qQ3VPdVE5cGYvVTg5VkNOdENjWGtWNEpYOUY2Q25QMlVrWjBkRXEwT0d0QTZyZlRoaEpsL0FZZG4vWXlsakZJNWpQNVd4SVVqRlVPOFo2eGE4NmtzdnkvblhRdTZoaWQ1RmlIQUpEZnFGb3F3VktVVVBqSFpaallZdlZmekd0alB1aFJvTUo2dmtHNWsyd2hXVmRvWGRwc2puL1VhUkVJUXR5K3FiSHRRdng5K3FwaTA0QlBiMlo4bE1MYXEyUExZY2RRclVINHZzekNHYXEyeXhFOG9CVTRWK014cUZneEZWeDRTanowMGhuSjJaZTZUS0kxVnN0Szd4WmdNNlJXS3FRYUVNT3IrM0xpbkpJUE1IdXk1aFdQUksvQWI0bG5oZDlocUZNQlhhVmFWM0pJZFVoSWdwTEU2ZUxoTEJSc0N6dVlSSWZROGFFK3FmNDZNK1cvbHRCU1FkQzdyMVpyZnRSNEh2QmRRemgrZTBzU3lETmhPQUt0UWpIQjFLdFpmMllNc3VaUkg5WW5waE1ZbUFDeWdXYjhDZjlBMTlRRUFJdlA5dk1NQmI4Q2RkeVMwTC9HdkVmNmVsZjdQZ3I1YjF0eVhmM0EwZ3NJNUppQ0lGUGpyVk9NeVBFTEFsckJxWVdNNy9Pa3o4SkV3NWs2TlJNVVBTWjFFQms1QURyZ21JYU9GQVdhNG1ZcElkT01QMVVlMDN6aWdRZ3FlTW9pd1JuWmxPVG5GOUxGZ2lQZkc1NHBkM0VKWTRiM1JUNGNXL0ovRVcxTW4rTWREUTJyWm9FcFBwTkxEd2NiSVVhWmpEbTUzTVVuTEFYMDJEVnVzaFBBUXZ0S0dQMmZ2ei8vZGxzSTZzV3lkaFdsZFZrWXRIUlg2enA5T0lESm5sYkxDMFhWakdVbkxFYzd4SnMrcXpmcGJGSXhTMDRocTJpVVg5eStGTmZpV3FkVHJjRzZVNmRUckhuL3ZmNEMvOXIvdjlxaWhLdjdaMFVlT3RTK3l0ZFpJRTlnby9DMys5TUp1WVdhV0hnN3hjTG1kcHF2emUyaXBrTHQ2TnBQc3dDZnZWMGNjNE5mQUVFbjNEMGlDUmdFcEx5bFkwZEdFMGZrN1VScm91VzFKWm45dFA4V2xJVkFyZHBIeEZLSlZLYlR2Z1JySFB5MXBjVHMrTEUvMm9rREhYK05pUUxWbGFBa01GZmNObWw1TGdmZ2hyanBaaE1aRFhySGtnYWJFQk1wTFdDdVRNZm5zQkFMSzhHMzdCTWFBM25oanROcFByL0JnTHpaNEtlZ2NKdWdINVFpM0p2dWNCaUhyR3JPVlVGOVVBMC81b1ZoV0crSHRab0YzRzFxKzhJWkVBc2tIR1lKNmxoRWtMTjJSNTVvbDNjYjloZmw3MEZCL1hLc3pnaTBmYVk5MGNrdm90MnlkVUg2UDUzUmU5QWs1ME5Fd3VMSlN4SlcyM2hUNXBBV1NtZGhOMGd5MlNMODZ5cTFvektUWW9nUVFGWHNubjl3amZibGRhcGE5cFVXYmxGT2xMVnJONkQ2dUEzZUJZckkvQXlURWRHSTBHZGhOT2dMNW5ydDB0eFErc1lZajNxcUJTRTZoSWl6N1JzcmtOT1Rya0E4dm1pUGNQNkpCSzkwa3FJR3paVDFrcE9jSmY1VUhyQWtMc3ROUDcyK0loczFOYTlZVlhub0phaHNzRzZaakUxV2Z1NEtmVVhKZnNIMnkrZVprZlRqOTlVYzZTQmFFMmFFemVNZ3ZRZTBGK3BtbTJZVnFWRDFySHFtTzhaQllxVlRzazl0Q3BFMHo3cStEbEZWbzFaSmRwYlpWWExKdTFvTUkyWVlaNHh3RjZCemRxVXAvbDJWU1pjSEdmY0lkc1RXTUdqeWtVcGFUVWxxY1ZINjg1WkJXM3ZET3pzU0FUZWROMFpueWhDMyt0eWJTREJpNXpGTCtMWlBMWU1kQWpLTHgzcHE4UGRPcHFvRlY0dW4zd0o3NDNHQmo1Rzc1dFpwQmFhZWo0RGs4dFN0R3d3UHBBOWp3dDZkVXh3Zng2OHpvT0k0eVJvVUZWVG0wcnRGU1RHSTBvandKQ1JsOENzTVoyNCtjb01pUnM0b0dOUlRqWlE0QnA0SXRUM0E0alJTNlpQUmo3V0VPOFZtQlBxMlRJMGpKSi9raXdER1Z4OFZodm9BNDE2dWNwR29aT2VxTFRIUXFlWXVMVTlOZFVjdGN1MEIxWVRlU1BLWExGV0U2UGdGTUs1dDlHallUZC9nQUNRVGVhd1phOVJJdm9rd1hnVklsM3FOckNVL3ErOTJWUlFZN0sydU0wUERUeU5oNldTR2pHUHZSL2NrQTNualFQcjRsa010OWc1TkcxKzVXdmVBSDVUd3ArRDRQY0hydWJhRHVEYkdxbzdrQndmOGV0M3FvelUwQjRtMU85UVhHTDNkTU8yOHRGQnlkSndLa1hXQ0xoY2J1eStTVHdtRXIyU3pQK2RDaE1UMDU1RFZobTcwc2phWWZ1Q1JmZE5XcXlZdld6MHYxeHVOTlVXT3VwYkFweDNmVlROVEYrUUVpZ24zZUZPNzdsWloxZmVBYlhiMWZvWldlRU9qM0JJelBTVGFzQlYwRDNBWm5YQkIrN2tIZnMyWnZFZW1GdkFZMGV1UWJxYVVERjhFQVlhNG5mRE1HZlpwaUxiR3o0Z1JIeCsxL1V0WTlldzNrRnV5ZHROUzNEKzBuZTdDdG45cjdNcjFuOTJWWVVWTUJSOFhjTjBCK2RBcE9OeHh4bm9vdzVTUUZOZWlucnU1aVg0NThCQVRRYzFxeStWSVNIaFh2RjUvUk9zdFFoZVR3R0NFVXp1MlpTMHFuMXhXeWU3UVdNeXg3RitmQk1OdnQ1ZmpFMk96VGp5UVMxbHA2Nzh0aHg0ZFlMVzVkYmo4M3JJZlhaSjBqZWhhZTQrUGt5YitXWFB0R01vMmptcmVjcmhuUE01TTgzZzlUeWV1dkdtNVpaejRxNUtHVjRudDJFdUQ5K1VrNG9BWmJVNXNMelBiZnB4Mlk0TlVsdzJsTkRaREdQbDNGZDhrbmp6aHdTc0xuYVpUdHVKaWZwM1c1VEZDYmpIakxKR284eHc3T3RRNWlrODNsVy9PQ29Ja01TMytsWmZUQllET1YvcHcxWWpqVmNvU2NKRkFubi9MNXJNbHBEN2ZBRFJJWXc2N2pVK0JiRy95OHdKS2JwSXJLRWJOWDJTSjJnU0J0OXRKbWVNZ3VodFBrNFZDQ0RURXg1cUR2VVJoaGl2TWMvWldGMlUxdUtRdGxmWVVONnFlRXNQa0paWHFpc05ZUGJtVFVIVXR6YXcyVG9VRnp2OGowSzJML3l2QzlPZCtmSVg0RStuMkFLSUxTcXYvYkFlMDcyRDFBWVlhd0lVcWpnNjZnMXI4bWVFbEJ5MnJKbmMyWjBFdE43TlR2UURDakVVRDFjODcyUVFuWDNoWXViTWluRG5TYnhmQTV4MkZZSFpHcFBrRGdLMDVGNnRYcGtGbDRZL0JBRlp2MFNHWitQdHJPWFJtblBlWFlFZ2dTTVdaektuc3Jna3JDZXJnbFB1T3RlNHFpVHhoZDVCZkJDVTRIdmt4emo2ajBPYysxdFRSajcxZFpyY0JhaURodUJ5UFVWT1BEQUhkSWxUL1JvUENsRHY3Rk9CZmVqUFlQRitXSnJZU20rNEo4UmwwbkYzdkxVMnoxTm9Vc0RISWlYVUdlbDZJbGtzU0J6Rm1sMkRsaDhYRFR6bXRTbkJxOThoL1FmM3l1QThJSFVRNnViNnovVGJGd2h0aFFTeTlqV3l3SWtsQ1o5OTU3S281VjI1U0Eva0lIcUsvbS9DdGlkd0h4STZucmJsM1NLT21aV25oRzNNNlN1M1JSZm0wL2h0WUJQN3JPbEVzaXpXK1E5Ry9zUEs3NFoyM3JsYkw2WDhKSjRKV1FJODlUd2d3VlBOZk00alpGRVhiMXFUTHlCSHF4QXZkUEFYQkRkbnJiY1VXanRnMFUzL1hqQlZIeWxhcElVdyswcXBETWF4TGhqWEFXOGgzazBZamtObTdOMEhObXkzazJrcFVOUjIxc0twMHQ2MGlhQm85Q0RUK0RvYkZ1VWZDWFdIVzJLYWloSUthNS9LYmZtV2VUQTN6Y2hmSS9kaTJmN0Exc1p4YW9ud1h6VjJ6ZEZ0eHBxYWJ2bkwzZkc0ZENsazQ2SEoyVndEWVlMemMzS2cvUDNFUk95bjZabnhWdkVXVFlzT3VwcTM2TmpFRkNHWTViZE1kUVZIb1ZvS2w2RXlYbERMZFFiWElyU085TEVlTGJzWjlsTzkybnVXQldkaXlhSnRTWFc4UjA5bnFNc0RCNXNmSk92OFR1Z1o3blpJVXY5anV6Y3BPS0NFeDlhcEs2M0Y2M0pISlVPTndjTEVpVVpVTWxsaW8zMEFERFVFUnMxR2wyVEM2THUyN3hqUTJaT2NSSEVyL3JqcDdiNHRFNGVKSVZoTVovaHFIQW81U1NGQ3ZZN2lCTmNRZk5sM1VoYVJFY3hGQTgxRUVsd0FvRlp4MENKNi9sTld4UzZUWHVGc1lCSU14Uk1qcW8rLzVNRnk2SStlL2hKWmo3djQvVlRqblkxcWxUTk5QUW5nZkx5NUNQREsvK3Z1R2lFczQ3MlZBWDU1dDBnZ3YrNm14M0hrQmtGZmZaaStlWnlaQm5vTTk0eHphS3Z1YktXbjBjVmxROWVnZXJyQkpvcnNtSW44cjJMUExFeG1wMm8xeHcvdmVaMkMxWGpFeXBiaWlZQkNMWUg3bzFmTSttNzk5OTkrWFNmdWpZRzNWeHNnNVlzTmtlT0hPQ1Y4U3IrRmEzeU9EbFUrdmtERmZNbVM5WUtnZDNwZXN5WlpaNSswVEFXTVFiQkt6Wml3ZU9xck1mNnM0MzRWN3hnbWFsdElPTkl3aFVEZ2k2eXhrV2RaeXo5M1JnZ0lqQnVMcjRYMmhnS0xsYmFVZVVJLy84TlVrRzNqNGQ5UVVOYmY4VnlSLzZONVcwVDVJYWZOT0FORjU3ZjA1MXJ4V0ZXWHM1SG43bmZNRHh5dHlIcXpMeks3dzcvakR5b2k1R1N0cnRiL0hCR0xUblBlc1JFcmFoMFhrR3JrYlN4Tkw3NmxxWGVKLzZBZ2l2VURhVzJ1d1JVeFEyZUdKY1FXeFJEcm1RbEpmaDFtTGxvd0hQY1lKY3RYZTE1b2dkaS9GUUdPU21RWEQvWDF3K2x5VFkrWmVYOHRieGQvTzliVmhPaEZTSnVWaUZicUg2VzJSenV2c1Fwd1N6VVJzVDVjN1RLR21QWllHa0wyZXVmVlJSVmZrQ3UraGNZaFhoK2xISVFpeTB4d3dNNEVGdXhRK3dKR1Z0bzdGQStVYmU5cVhhajR2Rk1XOHU3L2IzbUJ6QVlNYmh5T3l2NlVWUFVOK0dWdWQxaGVnL01WNnVlb05XdmtkRDlMci9ncjB1VGFjSjNPYldsSlYzblQzZWdBT0cyamVrRUpUay8wQTNkRTdqQ2swcDA3eEpkaitJSm40RHh5cjNCeStYWnBRV1p0Y0VPMDRYMlBJQURxYUNGdFV0ZGJoYlZ6WHVteFFzOGkrc3dOMHN2c3Y1OVZ0elYvS1FrKzE4THlIU3h5MnBkZERLelB0cGx0YmpJWmJrdUttVzArNmswUUFzejlTbkxGUnFwRXBJbGRzTzhIMHg4a1RrTlBub0xvMUtiYW5DUkpxNlN6U1hFMTVvT0pHUG53Snh6YmNxeU5DYmNYbHZIQzI3bXBLTnRtbWNLdDRkcGg4RE5jTm93MDlOMEUvRHY1Ni9qYXhQNjN3Ukh6WVI3Qm8wR1lJS0gyWTJabVdRREw0dmdrdVVzMmpGZ1RmVG1pVjN1V2llMURZYlRxc2RyZFdyUXdycXRNbUowdkF3eDhiRXR0ckhVVHBmQXFyaTQrT1pIQkI1d1RzeTFLQ2VSZ2U4MGRkRTB6M0hUM3JLZ0Znd0dhbE10U09kcGZvNmRvaXRpUGFrTU1pTXdpTVJ4eGRZd3RsVlpkVU9TdmI4Qklpd2JFL0RtK2szaGJIKzJGQnl0QVRwcGovTU04TWFwaGluZVJzWTRKbmlOVjhRUWYrY0pVU2UvRkR5TnQxdXRydjlBbkY3aUxVMy82Y3RwT0xjUyszemtjWEhJMkNheEE3RElpK3dHL0pnSGpSWThVNytTVjFZZlUybmc0bzlBZWZxVXdId1R4OHlSNmcyUHgzV3pYeDlmTE11c3pxQ29TSVpreDJXR2syUHlGeEFaS1h4dG5KWjlNVUt0V29lY2wrZURDeG5CMWF0Yk5zc0FSRm95SlNZanc5WWFxalQrVUsvZ3FyUFZQNVpkcXhmK042ZFgvRUgvZ3k2UkR5a2wzN2NoZzFydEVaZDRQalJSZ0d6VDhQMXdiblBKZkgxamNNTjhmZW5jQnU3amh2T0xsNE12RVM4Mk5KMlBRcHRteHRxVXhLYVZGcWJyQy9MWGhHSnZwdC9SQ3RUdk9xNHhhSlJIYlIyMGNtcCtMN3g5V0xOZnU0UWdaeEtUZVZsc3ppVzByelUrdWEwQk5hMUw3N2daSERlZ0xzVVY5SGlaQ2lYeVdPR2ZMZzUvc2JjQXNJSWVwT1dKTkpFZ0F6UUorTmZyaThwWU9RRjRROHVlazdjd0hsSnFHeUhOR0dZR2d5eTg0b3g5SW1GRUtNcHBYdm1FV2E2OElrV00vTVdQRVBsa2E0WDFZWEtLM2czei9Hc1BsNmRSSTRhcy9NejZyRFhEZEwzZFlYQmNlUC9pMzIyOWphSE5wMjk4ZnlVT1dQM3gwZ2lubWtKZzhreno3dGcvbTBvYi8raWhBdVphMGthTVVPb3UxVVRkV3diTWNlR1lJK3MrRWoxL2RBVFpMTDNQbTFEMUFUY1M1U2MwcWV3OXQvSWF6RFhoa3B2Tk44U1RXd3VLOHFZUVNrRVdtRzNRbi9EbHh3YUdIWWFQREpiL2hPK0FaaTdMZ2pwQXE3SVExY2JnckdsRWVGNHdKVGFWckNTT1NHUWduQmo0WUVyOXZrK25WN2wwZ25wVGk0dkdnbmtjc1VUYjI4L1YyWVZZb1J2VFVNYXE0bU5EQ1FVNEZxbGNDNnRoVyt3TFc0Q3BnNDR3a3lDMUUyam1sQUtqOUIxZ09ub2hRaFFlWnNDUXZWY3dDaUFnSmhxVkdNNmdEenY2V1Qza1lYanZnMndua2RuRHMrUE56ZUJ4REgvRHNQS2lpMzk1WktSZjB5eStFY0wrTGJ2QlA0cFc3bDBnYjkzM040YUhVUW1YRFNrRGo5YmRyWUlHSlBiaVNUelI3UExsK2xKamZON2d1VXBJaWxGcFc2OG1vZU50Y3VIUDNjdmwvMzNOVnJMVFBpbE83VkRhZzhvcDZFUzRsNHBHYnBlTTY0dGxoTVg1U0VZbnZaYjBXZHNVbUpydFhpMitQU0d4aUdDRWVzWXFtOFZJM2pOdFZmTzVhbkFTbmRJZ1ZhTTJLVEtPaUtUNXBPdWVaWXI1N00rcGRyMG1MRHdGbEFzK09Yb25lNnNaN2hPeEhYamtka01wV09ZRVJDM3NoYnY0ZGtCcVQzaktjS2VlSzNFVU02V0UvL2F6eFpHVytZT2k1R2dtMGpONGNvTVluZ3kxb1l1dWFhSzFNTUIyYTBXcThuMWh5a0VnM3dYTE9HdlBGdmVZeE5MM0pFa3NxZnY3SUd1UVIyTkhneldESjYvYytCd1ROWisrOGZPVjNMdmFPMnZqbk9vSUluUENySHhlUzNsVDUzRUlKK1NjODhOYkhhMlJwS1pWZk1manBhK2NyNC9CRkJONGtubCtSMEFrdGQ1THd6OGY5QWcyM21nbmVpdHlmQVJnQlNOSnNhZHFJbitmR1BrWjNBM1kzb0hqZEpHMWFNMSs4NGlrYWVmQ1hPek1xYlFiVGV2QUl0VFYvTnBGOTJ6S0NNUm51dnNjMDhFa2docWV4QmMvRno5djhnY2Z3NzlpSnMzbEhCM1RPRDR0RUxwSldXU2U2amxHZ3p1dVNUSXhyeG9pd21vejJPZ1RIOENHenRabEZZRzFUVVVFc0UzQlJWbHVHNitEMXk3UEhWZS8wSEJEZmlBblJWZGwxeVhzbFFELzQ3SFlZQWVvM2hGRzlRZ3pzdk9NK2J6NWVjYkdzMUhWRFF3OVdieVdyT2o4M0tGWDNxSDd0UXJHRzRxakNXQ1hCUE15bzQxajdXTXRjcU9YbEViSHhrejgvU3JsdlhCeXU2RTRmVTlGcCtlNEcxaWZCNWNaN3ZxbUtDMk02Z1ptZU84dDgxM3pPK2IrMjVFcmI3WGZEV0FHRGlsck4rakpZdVVLS0dYUGIzWlZJUHVPMThwb2UyTUNWNURMKzhvVzZ5UUY5V3N5eTNiUGwyMkF3eEdNRlAyWXk2T1hvNWtHVHJIZzhOS05pMlc3U2tTN2tzRFFVbXVLU1BmWDNITlAyajVuYkdtN0htR28yS2dFaWF4V3JybnF4QUljUDg5TjJkVVdINkxwSTlZdTV0ZGJ3NHFnNmxyZ3hzM0hRUWl1dWRsZWNaTFlvVlN6aVhJM3FKTjI4cVlnbC91ZExkcEpJdlZwTWl0Mmh5bzIxQ1BSMFNuYTlLV3hKWHFxSVNKV2xWeTZNVlY3WGRuUGhoRy9kdEh3ZTgyNDNmcEg3cm1QYlI4emRod2ppakZVYkhTQ1JGWkxkSTRPTWQ0SmFGdmNFaUp0SXNTK0dqWjRGZlNmeTNNME5qY2t0anAvR2NBTTdObDQwVjd2a2J1V3JhMWwyZzJJSWpEdXJxK01XWHlBTVhKYWZubTFzbW4xUW51RS9lTFl1dEFRNXR4ZUZuL0x2dkZFRWsrMUdxRm03clpSeEZ6UkZJWHNFZ202M285alFNS2Q0b0NaMG05eEI4STUyUTNuejF4MzdnUHVBaGNycStzK1oxOC9yTGxTRTRVL1kveXMwdXdWdEo4MUlkbkRmTkl6L3BRaTNzOGIvNGRTcGpTTFlaWG9IMHkxc3plNTVLV3U4Q0wrSWxIYU5CSjd6RktzNU1SU0V0S1MxRzhhekRnblJEUXVPTHpxS3FIdkJKMWljM0NhcGhqakVFeUJTSW93UTNtREVKVkZKRGt6azJ5UktoRzNpVVVJeStoekxtakdJSUp6SW9JMXdIQSthR2NYUXFWMlRGMDVxNGFISlJNS2NSbjRCaWhXMDdiNDd3d29TbXpEeFJ2bHRxdkVrbzJqcElmNUI5TE9ubHV1ZlZiMG5pTjdieGJHZlJVZE9oSWJZbnc1S3BKRVhldyt6RTU2SmRsektQMzVuYlFTV2xqN1l1Yi96OWhkOVUvWnVmOWZQSDFhNS8zNjVIZWo3eEdNU2o4M3ZrajZlcEgwRnZ4cVA5RUJVbGZYK0NsK2czaDhxMVlPVnNuYjBzcjBiNHNzTlFwb1EyVk5RMDR3SlZlMHBJQ0VKcWhHVEthQ3NBcSt5aUdmUjlXTUduQ1RTYmd3NkIrcGxlbC9Lemg4SlNyUWdFVWJMcitwSDJsNTZFdWJ3KzRyTldMT1N4eXJFblJ6UXNVcUlKWHlxT1pybW5UbjFHQmpCU2twNHN2SHc5Nmc5cTJYc2EyZHIyTmJ0OTNsaHArdzhiSUxOM2JPekhGd3poOWZ6b2VjV1d0b2FidmNRRG96djBTU3VselQzTHBlUjVaeXRTYkdmK1M1UUduS0lSenhQc3Rlc00vVDNIRnc0MXNZbGRaVWc2T1p1VXJ5U2xLMm9RNGtZOFFDNm04aDJoYTRGQ3UwS2I5UzluWlczWnJicjVhOVlodkF4bWZLZkxTUnBUbmFhSHRLNWI4TnRzMStpOGUvdGF1SDJXelF0cXZwUENCQzJCWW1LTzJUQmNybk8vMi85MzNkTWx2Ui9zOUYyOFFDb2Yxdm9lSmtCK2xiWDMvZ2o4a09IVThaN1M3cSs4dTFiUG44QXd1cjBhSUN1ZFhxbUhjOTc1K3JIMmd3K1pibWQ0b0w1UzdYMFYrUHRpZFpqU1RGQmNodTE1bVoxdyt4d1RrM0w0em4zQ2tGRDlYQ1RTY3ZsYWhsM2RIUnYrT3VhcVdPRS9pcVdOc2xRSk5NOHFCZTB1a2d2d29OcGxHNGh0SFpUanN5eXJYdnBpcG9MV0ZQQmFhbGIrMkVQR2RwNFIvdEpLTnR1UGozYW5iZ3N5SFhNMlVySzFFc2JMUHBybFBlc3hoZE96ODJQcmpkNUNGbmdTeXowTVJCSnB2YUxJOHV1NmNadTNEbW04Z3lDeHpUaDhIdEpYZy8reGpkWjA1NXU4Mm0yTXlWcU5JVjF6TkRJeTZLbGZzMzRxc1k0dzVvTzFlN0N3NUlHM2tkSzJla3JaVmxRTFNqbDR6THdLWXFhSTI4bzZJTnRMNnI5Uis5UnJsUVR4bVduSCtGWnBKUnVLYVJUYnRqSnRoS0RYZkpUMWxpQmhSMzNqMjkxdkVHZTViK2E2MmtGSlVJa2JUS2UrbXJwSi9QZm5BVW9kdmxIWjlvaTNGbm1KZGgrR2cvakNsT0hoN0dqa0l2RngyVlBpalE5VkY2WlozL2R3TEVwV3l0aFA1cmRqcnhueHZGdFNtREJLeVZjeC9PWGxMU2dydWZkR2pvbzRPcVEyc01HOUt5TndtY1Rzd3haeWJoNVB1NmVST2loT2ZTa2J1dGIxeUhpbVBuNEMrTHVLRXlzenNTY2NtNldzSDRib2lOU1FXeVZOMHV0U1BZYTZtMkFUZlhHY0MweDh1SFZ2SHVGbTRqeXN2UVIzVTdaZi85a1M1M05sVWtzZUdjc3pyWGlhSEt2UkVONWpzdzFMaXpEa2tPc3dnMXJnTUR3cjhlcTg1MWpGZmpTL2wrY2hFWU1JaEdDNCtKRmlXMml2TFF0TEJIcU1WNk5qeW9QSTB1NnB2L0pnZjBMNFlhc2RNcDR0TXl5dk4rbk5VenpaTWxFOVQ3STdhaWUycVlYMTMwSytIYlI1cTBMOUF4a0JvWkZrdDhiQUF4aFN5TEJtQmxuaFlSSFVWY3BvM3ZobUpVU3Irems3dGhmOHhpVUpENkhzT0thWTVJL2hWRWdzek52c0hoUkNkSE44T0IyR2t6b3R4bGJZeGs0WDBQMll2TzNwcE9oY0huWlR3UUZ6VzlnK1dJT3BjbE1PS3UwSmdsQTU1azRlQnM1Qlk3TUcrdjFXUGtGak93SDBRUzBrSGl4dFN3M2hFNkJrenRGRVBYWUNKb1djZE5vaEQ4eFJ0RTFGbVdjSnQvZmczR05FcWhLbnJnY3p0enVFaGJZSzFZbFptRXVkYlY1YS9CT3VrUEpaS3ZMQTUvY1REL21ZUnNOTXRxM3huTjczREdsSXBHYlphSTYrL05DSTBuU0VUdkVLVjJMTzFGNlRqY1lPVmxEUGJwQ29YeXdBRE1wLzhBMDkyc0x4d2lTS1dXaE1VTGN5VWk2cThJMStCNnJIS3JlTndBYkd4b2dnK2NLRWJ0OEx1ZUFreXdnbTVFSzIvZS9vY2VONWU1Si9aRXZpNmlzN0Z6UmVFbThLYkc4ZklzcHpvaWtEbHFCcEg3RHZxaGs2ZWo3TlM0NGhKU0hoa1oxTFNHNzNqUzNaSFg4UU9jb21xYVpGYlFGaEJKcmZHQ3VGcWNUQis2ejdSTGFZL0FWeS9hSjU5Q1gzRWNBVmdCUjFIc29hbU0rSmlSRnhBMXRDSWFXelF5aGNnSXFWK3UzanF3UGkvclgyUVU0dldIbElkS3N0YjRBQWN2VitnVCt4Uk1LRElsWGZtaXBESWEvTUhISmJFandpdHYxQkIvR2tqNWxGbmg3M2hCcUZDRFkzZTVrcEt1L05NL3ZTdktLMmRRem5RczQ2ajU4S3dUVjlEYUNuaTFhYmg4cEx5OXFiMFZiREdJcWZvZUVGUVE5SXozckx1Zyt5VVlYbTNNbFB5YXArQzNrVmZyd09tb21WSzJnOStDK2tmd0g1dDUzajlydUZ2NGpLQjhoYUhXTjlrS3J1UWE1N0FDMCtYc3daVEhUNUxWTFltWXFsOWVNQzl4M2JGM3JJei9kamFTZjI2bDVuZ3h3U3FOYjFJMTBleXFxemVQSjY3TlFyM0ZkZS94TWRBWUVjRzVqZnNCYy9MOXViUU4xRXo4MWtycmJoWmVYU2IvTXJDUEZiWmhhS3JyNlNKZ2J5cjdIOG9QNUtiMnZIeTFCdmwxM0toZTE3QVZ5cHdSOE1uQWtJL2hnKzdJenR5VkxoeWVFRk9QMTB3ZFN0VUI3Vit0cyt3NmV4T3ExZkM5SmFzbEZQL1krYi9WZXYzdkUxVG9hMkl6dUZrZmxWaXZHaXdYQ1ZxSXk0NGJic0I1VER6dXp1NWUwUE50RXNTeWZSK3VBQmtkVU1PMi90M2ZPeFVQRU9hdXpQOFdxMThNREFjdUI1Yi9DN29ucTBMQTUrWk9UZ3BQaWg5SUVFNDR2TGZhTVhsMWx6NFdxKzhENVFNZnd6K2dIUEFXZWtYVmQ0RERnSVNmcmQ1OTFNZ2s0RjN3T0dnWXNJeDBtWmY1dElLOVVnVjlrU21pMXAyL0IvV080aisxREhoOXErWnVFakxJMlVxQzF0czVTdWlRYWtSWWdlbGlacmJkUWxyZUJhZGswelN4SHpsREFBdGU0cURKMytPZ3ppOHc5MkVlNGxyMXoxT0svcjI2RWZ0ek5qWE5MUTc4b0hFMlJoT1JWWEQxNWpILzJqakVVK0xkYmQ2QzVnSWZBd3NpREplZ242VHlYZUFmOFRKd2JmVEp1U2FGZjRpcW9WMFdhT1BmOG45RDlYeWw4MWY5VHZNK2NBSlVaKytoa2tGZWhqVnROQms0NndJaHNkdnlXYzFXaHZqRDRtYXduKzlaSlA2ODNoYTl3R3FSbWwxcWg0L21VOElmalM0bEcvTDhBNTNnN3Bid0NLVlNINnJoRkxiZXlzVXdvc0ZpemxEcll2QlozS203MEZKZnRKVHVZUG5MbXhuSXhZYllkQzFTZzcyejkweFdGcTYzeWlzb2dPM2gwWk5ibGJ5THMvRndsb2FBbXdYc2RLUW8xSzFNcjdFM1NzR2o3N2d4NmIrT1F0dWp0TllKUERmVHhOa2FRdmVNOWV5S1F4ajQ5Q1M2Z2FPMkRHcHljcWNCRm55bERkbDJwZVM4dk1MWllnd25DdDREN0dmMUxWRTVDdmozdkxmS0d4N25QeVNwWXExRzZ5Ulg0Y05xK04rVExpZ2ZlU2dpVjNOemFSVkZ0VVdYWHYyMXNiREVRTWVqTDY3UEZsRkg1U0ZuUDJWbUV1SExGc3VMbGFhWjhzc1FyanAzTVZQZWNLQkREQkkybVp0TEFJaUFoOXBNMjQ1TC9nQkl0V0dBVlp1U0IyUHhMRmIxa2dQSGcwTTNSU3p3bHdhQUdwNldnckI1VnZwenAvZnozNlVHWWdPejBDUE96ZXJkMmM3azdYbTFpcWpmQXdWakpGZVZPZ09DaEZXcWNkS1lVVXFRYlVVSWFzUXdzNHpWRVpvYVFCQnIxa01vWFRGM2ZvSEI4Ti9QcHB4Rm5mb3I2VDF1UW54NGFyS3hsVmRKbzRkRkNoc2xhVGlkVEsrMTg5QkVxa2t3VEU3V2Z3aFB1L0pvYWRwbDFEQXpMN01oYTgwb1RYZHZHT3h3NmNvdGtla014SjBJZlluUnRJOVBjNGVDT3VYTG9VY2RSTFdIK3IzM3RIbmRGbEpIeG9tYzNCZzlhUVN2SnVFQjFJSjdEdkpiSC9Wbi84aGp2NG9XT2hlWlh1UnlXU3g3OHZmMTB6Q3pJMUwxVmxiMGNXUFU5eE43Rnk4UHBiUnIrV3JWRWJRR05PTFRsbEZscFI0N0p3cjlBT21tZG1IdXNGL2Nzb1JkRFhpYXRkeHYzVVZYOWlqcHBjWGRmS2xlTk1XMklSTVAwKyt4VFdVNDNZbzYvamp3SnF4RUtIRi82a1daNytQRjBKTXJTajQrcC9zb1B3ZEhudjVnRms3cjNSVFBUcnBZUkQwKzBhcktxeWZiWG5obE55cTdGZDh0UnFOV0xVZ29laS9RdDZXZW56MWRTVW5Qd1lLc29ldEtaM2cvL0FjR2NXOGIrSVFmalFON3VJeWdYSVdkMWpkNUN2akFhbWRxbnVWU2RyYjdiRGxyMlM3VkxmVzN6dkFJODAvYjRXdDZsczdpU3oxRXZ2MDY2K2QrV3FaYlBQaDkzWjA0S05Ldk1NaHRycnFlTkRQbW13MExscXJZNUdLNEo1NEl6KzA5YVJWNmsxRDRDZXFWMzdyV0pMZldsVE1Gc0pEN3B4THl2Mmg4MHJnajdhTlU0Ym1XRzBtSG9rNjExVVJYUVJ3eFZQMk9NM2dmTW5nTkpxNXJKTnNqbytSZ1dqWExGaG5PejVoWXdzb0kyeVdRM3VRekFsUytpZVRkWHBNMmNuYy8xMkx5V3N0V2FvZXRndDhVQUt6K0V6YmtVMFZQZUxhaW9HVTdWOUY5ZWZQTC8zcnA4YjNJZHZtSzBWeUorbjJhd1hSamdPY2F1ZEZRcC9Tc1M0ZTc0YW55ZXdzL0FPTlhXamRhNWRhNmN5YmlxcWVCZmlid0Z1YllJaVA1R2VNZktCODAxaS9rOXN2enR3Wk9hbGl6UGpFd1BWa0Q0cDNrMzRLYUhtcVhUb3RiQWNrc25BS0NZOTBBSy9nWERGd1JCNk5XL2dhTTJscXozRVp2enNTc3BoQ0poUXIvaXVMcWNsSXc4a29WVzJTa0lLTm56eEJJcWk4cXY1NVhKVytlSjJva1RLcTYwWUo1TEEvTmwwL09mN1FBbFpTVWtwS1UxSmV6SnZYS1YybDk2eHdzMWhnQTBVZUIwY1ZiZ1hKam96NnkzSTNQMFQyM3hTOW1lcjlCbVVzTXAzMThuQ2RXTE9BY1pLUzlsT0RtRGhKZXoyWW9TYjE5b1R1V0NOZy9QNGlLNisvdDUrZHVBc2FzcHg5cWtmUzdRb3dldzZOTEpsMENTa0xKVVJsYnRuVnN6b3ZqQzYwd2F5S0dkU0RjSVBZcXBtU3JvYTd3NFovWkF4a0xNQVNrRGFtK2JwSEc2UE1KN0l4Tm9kY3ZvNHFTVS9aK1RhbFNtU0duQUZjV0JmYUlmRi9pZks4RmNoWlVET2NqdkFmSVpmVmg1S1NrZ05XdzYxWWNVWTk4ZFVFWXJKNi8xUEE2Rng2M0Z0NGlTYXlTUXJQVGRGaXQwYjZ1N1NibllyeTVLVkgwZXl1aHRta1FUVk9vZGxxVytCcXhjNU9pYXRac3ZQWjJ1blB2b09LeTN1YWNxQ1VHSmc1enFUcnFiRE5pZm1aVndvMElGbWFjTkZKVFRydS96THFQNTZGc2dRTHR5ekxQbGNPL3lNTHExYjVkWDJQRmJIMU0zMzRlNjF1L24rWFczWUxkTGhweEpHUUZWVS9uS1RpSkNOeXkwNVBpbzlLejBoOE52UjdhT0ZyTDZTWVo0RXc5dU9UaXhsMXkxSHdGeGFtM0l1V2VmVnQ3UExDamVOSTJJSTlPY3N6SXN3dXR5YW9JaFRvM2czTEtRbHJaeWJFbEZWWkRhQXE4SVR5czFvUWNtV2ZtVHFxazA0SnFyYUt1ZkZGV1VQbXN1ZW1iYlJUZ2VmMlVnMmhNYU1ZTTJWajcrT2htOVdITGNObW0wQWJrUnZHeGdjYTMvY2I5NEpqK21CYkJoU3BGOFVTemc0U3ZBOHdEM0pTanJSQUJhZzdwOGRsbGU3ejdXOWZXRjRPYmpHTWp6bllBMXJIV0NiSG9Ma2prYnNWR3lTUXFNSWVZM0oyVng1cDI5YklnSmtYWG9FWjBvU3JFNExTSjM3QW4wRk1EL2lldUw2S0JMUVhveXAwcWhvVENzZkdNNGpMclFWZUtjUU01dk5va2pGeXRGMFl3endUaUJOTDF6ZE9sMXBhbGwzUmdRd21adUdRc1I4dEx3Nm9ZQitQRFlKb3Y5MXV1QjhmMXg3UXNqVFVxaVUwb0xVODFBS2ZsKzNNdmRicmFSYVVoUnRUanIxVGNyRnhBaGVRUWs3ZzVwWG1MR0x3NU1ZbFZqNXJRaGFocWtWaFRpSWo4a0loWVpwQ1NwSE5pakxORExHR0FDeHhnOVpraWtQN2xCakV0RmRuVmZHOHl2dEFuaGRpaTdhWmhWMHlFTGNJZ0hwWUNxOUw0OU9URXBGejJIdi8rMXVHNklHWEttM3EraGpjajdwYmNEZXFYNjVGdmxtY1BLWmQ3cnViU29xRElVN3MxbkRpSUl5WkNyMHZhOXhRNmVFMWJSRmRmdGhkc3I1RmJRczlQalkwdUxyWGhveWttRGFIaGxhWWg1Rm9UU3JoNUk4M0ZJZWJkVWlvWWF5bXdLRTFnTVpPNjVVQkJ5cVEzNVVLdDlUMjB5bnNKTURrcTVzRGpnTGRUR3BPZlJtZVVsRmtOb2wxZFZtbEtEcWt6YmU1Znh0UjBqdzk4RE16eTgyZmJ3QUgwLzAzamIwa0REOHd2OWVQZVBobkZleTkrem5obEVxVG5WSWVGWG9kSFgvelJrSGRxYmliNTlJdW0wZDdsRE4vYlZXVks1NTEvb2ZQc04zTFpxNmppdWY5SzgvOGJ2MUFCU0RpYnJHVURyTFpOb1JONDFJUldmWmtldmxxMnR2enVTbWFydDJzdHhWOEpWU0pvdTlwVm1zSktUa3JKS1QzZzM5KzZ0VDZUZXNrNzhud05kNlVOYkhNUlV4N3FXTXJJVDQyTnk2bXc0NklwcGcxaDRWV201T0E2RTJxNFJTUE5OYVFjckp1Nkg4bUZsanZNa2xnRWkwbkhuQ3B1WmlxUmxEN2pWSEc5NnVxZFQrVTFOYnVjV1o5VytRcTloZTRBblh2YWJNRlBXczU4ZnV2dTByUzhHQzJoMlk5UVRXRXd1ZmZKNnBqSkdsaktlR3FPVFZNRmdJaGFhMHk1a0dhbmVyYWc1Vno1NkpLWHJMQmRZbCtTd0RORmMrK3NFN3ZLTjFwMnAzYlkyeTJTKzRUNjNqMy9hT3VSaG5STUVWNmc1L3NGUlVXR3E4ODF4Mzc5cHFSakpsVmZyV0tMeDI3RjFnc2FDV25NYVFnd2VPZjdmMStzRnJwYjJWQzVreFg5ZUJYd0libzh1emNTMWFQbEIyc2dRQWMwZHJ1UmdMQ3pqUmtFTXJ2cnZKSkQ2aURFZ3dzeG9xMlBSSU9zR0lqYmZOVmc5ZThhSVE0SnlKZ3R4VEJWYjV4bmdEM3VKT2g4aVAzbGdsQkRMTTdqWFlVWmlzeWVSYUt0RFJXMGxlK1JEK1ZVKzFZeFhySXhEcForVXFyZlpxMS9EZDBCWGN6eWMweFY3cEI4VDFsYng4RGFHUzFsZ3Zyb2tXUmlsbXhtVVFiZjg3NWdaRllMaHlvVmFKNVJMcmxuN2F2TVZjTmFxV2Q0SUV4TmpLbWFLY1ljVFY4WjFobnZDSlJwbEFqTkFqSlFGTWtnWXFtYkhRVVZwT0dWdmhZSmFtdnQweU1BUUh3RU9iODR4QUJGeWZrdkIyMWdvNlhXQ0RNZHpYOGhna3NlZ3BobExyV0xqbGlvQzFVT1hnb1kwOFR2RDRXQ05PU09oaHdBV25JYUdFM1UwTitBalFPb3ZpM3dwUUFtaUlGWjRTaGpqZnlBNGFXeVRoZ20yWmVHUHRCeGNZQVNBcHpibVcyNmkzKzNlYm9VR2ZNVG83ZmtGMUlaMlF5SFp6WmZteFVKd0ZQcms0eDlDalZOY3FpMXVTYllFR3l0bkladGpvc2ZsaEtGREdKR1prbDA5Y0NQZDVnUDZRZ3VqVkJFUThYMzBhUndZNTZmNUZ3bEN3T3NwWUdTN1Rwa1ZJSzRKbTBGKzE5VWJ4ZzlPVWxwdjgxNVgvVzNnQUt0VGxVTi8wemk5L1lMb0FNWUN5Qy9INEY5RDlCVXJBd0Fzc21wQlVBMFdBMFRIckxYY0FlenVIL1QxSTZzVXFBQzhxQzJENGMrTi91UUQ0Zks3MkE1dXRrM1RLbVBZc0ovcnBXSzViTENCWG00bFNhUWlHUHEzTWxFcCtYYmU3SmEwSkQrNWVUNzk5cHZZMXU0T3FmUDRmMDRVODBiUVdGek9wZzl4WC9QRVdaN3k4b1JVa3JaYmdha2hwekhZaHU0M0JabmloSnJ5M1BnSW1XcThrSHVVYTcxWHRlM2I5Q0VZeHBEUk1ITmlhZG1FVUZlZHhoYVAxZkFmSVMxYVJISFZGY2lLV3l2NHBqOGpYMVMxd24vbjl6Q3N2K2ZEWnB6NjhzdHRYa1ZkQWpieFoyT2RoRGx3ZHlNL0Z1dmRqbmxBWTBmNDRXa1BOOWh1U0RkVFZYaVIrTnQveW0rNjNtQjdDUEQ4d3J3MWJybFc3UGgyK1hxSVNnUThJUkwzYlUrWVI5SXppNXlZajF4YXAzWnpkeTNWZ29RMlc1YmRmUndtVlBrQ2RtY3FyWnBCOVpKdmwydkl2RStHZEZOQ0ZBb2JFTU9FbVBRSmtwUVJqL1pXSk9kTEdqSmxCTXdBTFpYMS8wTWlsU3BpNzNsYmY1U2JiTUgzbDBoekNpVTRQaWFmdTRpdWdHa1Z3STdyZ0luZGxEOUJCMmx0bkk3a1R3N1lTREZZd1RrbHVOcjMzdnhVYUpNWnFQb01uc3BjSjZRTmMvMmo4S0luSXNxb2F6bDI2MHhMZExyT203WjdpTlRqN2lmbkhqb3JkMGZYZG9xQ25Qekp0Q0kvcnRRazBwNEFkbjNIaHJzbU13SHJWakI5VjZ2QjEva0dLL1dXa25kZmVVWktiY1RYNlIwYzlabkhqTjhlNlA1M29adTRsbWRuRUNleDExWVJHYmFoYllYdTJSNVh5OHVlQXd0aERYNUZIR0NKcWlReHJteUFCbU5LdUo2TDdNUFAvWTdCYml3WGoyZWNmRDNxaXpwUnkyQ29GblNIVVJKRjJGVGtQb2dCRUhJNFdCNlpzNlRRd1NCdzJ0V3psSG5HRW5nQnpNcnlVbmo4SWc4NVJZakM4Zy84Z3lDWUdTcmErL3N1MWRPQ0wwRGlXVlRtSUxJSEJlQjY3TVp3c2t0SnYydzMrdUJDNk9ZQlpCQWVUcGs2cTc3WFQ4Ung3eUtFT29ZbGxmUEFreGRJbzhxSlBKZHRscUpLdzhlOVFyNGZubmVneEZjNk9pZ1BENXVqM1hUdEtSZk1wc2NpQkZ3VmwrU2IyVWRIejdWZWlCTGZIZks1TUlwUm5mN0pKa0Y5NlNGbk4vLy8zVVBLVzdEd2VhRVVETW1uZWhPa1lIWlllV1czOHV6YTRUUzkwWFNSOGQrZGNHWklmZ01UekZVeHg0bWU5dFJwRm1jVUJKN09qR3B3TE1QVE5RN3FjZ1pGTDh6TzZWYWxnUVhCaFRKdzRaR2RhSjg1SnFRN1ZpenZPUThDS3FIdU5hK3hqeEx6THJTN2dzU0hSYVBzN1ZtK2tnWS8xMjVHeUo4TWptS3BBZjUwUWtuSmhzTjRZOXhiSUE1Um9CSnMvWmVuZFN0M1ZheVpkSzRhMzNZSHcwR2VnejUzUndxcXFyV0VMVi85Sit5anViTVdqUDVCK096UlVlMjVqWjFzS05kSEZzSmt0cmt2YXVIVFdNNDIrK3RDM1BqQnZuS2VBUmV6ZkoxRzI5WFNSK1VpZ2VhdXlhN285UHNTam0vcVE2WE14aC85TkgxdTkwK3IrWDVsMjB4a2tJV3RpWTNFYnp5M0xsSEhzbklGcUhmNVo2bTlvVmFjWWhTTktZY0laVEVjQlZnSm1EelIzNE51OWk3RE40VUFZazRISzY4U0pJNnYzWk8zMFJ5YlB0c041MmhENjl1NG05YzlGM28yUWg0WkhhYjRUNVI5SVo2T0VSVUJjenE5REVZMXdXRnZjc090ejNzU2lkQTMzVFU3M1pUbm5zNFhiV3JGVW1xY3hpdlIrbGpNWGorU3dtOEVYd0NRV3VydTJmWlFPVlhOd2pmdUtIUlNGZFhKRklmaHpCTUNERHBGUDNseUpTY3FueksrWUNiNXo4OWlkZElZaWpLc2hHSHdRQ285K2ZHd3hjSU5CcUIwS2RpNnA1emR5ODdOcUhLeVJlWXUrOGVUeG1HOU1nOGJXUnRwdU80STQwdGlpSkdPOVVJR0JQUG1nVC80Mjh0MEYvdTYvc3Z0THVnZTNWZS9WMS9SNjZQWExUbHd5ZWZoL1gvM0w0WTFJZEdlVE5lS1VNQ2hzTTV3ODZuTS9WWGtLRFZWeTRQT3ZNbWZ5WUNBWmw4b2l5YXdlampaMDNpbzdOWWJvVFFWNGhzTUR1K3JjNWhLMFFyWTFZSTQ1QTU4UndUZDlObW1BajBLNmpRUmZFc3o3bDdsSnlUR0lKWmZZV01ZQUtaelQrdy9nZWt3MDBuSHFpQWRKeTA3V0krdHorYnFLb3F5bko5d2Q0VEcwaDZ5T0VXb3VLOWlTaTNPZGZuSkVKRlpGdTJWT3dKa0xCdE9aWXJXaHk3aVV0SG9xc0tiZTc4QVdsQ0dRMXRvb0lhWkhUMkQ1R1RkRXgrNDNGSW5GSkxwWDNzMkxRRzhBZXcra3dQL3ZrQ08rY1dPMjFqampmQS9lYTg5Y0xnMldiK2puZkdrQllmVFFRQk16a2RLVlp6RGQzU2ZXYkhUbHMyRFRueFJZM0hhWTgvN3VLclo4OGxWb0ZmN0krS2hUMmprblh1UG0vVHFoSUFqdXFUV1ROWU00OTZTRUh2aStJVVpWczNSNkhrcFdxdVBVaTRBUUdhazRvTE1kbmE4bkVPb2JncHV6dGtwc3VNODBsUTBMWElOa2w1NUdzbDMxa1k5UkNTYldQTlkweTJSWmJnL1c3WEN1SHo4ZXdLYXpnTlpVU3J3RWluRDRoT1VYaHY3TU5tNEVMM0NVVGdHZEhIVWN0SHIxNlZJNDJ3T2oyVkdNOEJ3K0tsUWNaN25TV205OU9NUG5KRktmQ2ZJdy80MmxCMCsvMVpiTkNtRGlqcG5BelZ4NmpJd0FSdEEwY3MzNWZOaXNEeGFwWi9STjk5T0ZoemNOMExyTEhZcitKSWFnNWM3T3hTVGNaNElXQldGUkpiWkZ0V0Vta0lOVjZTekFxaHd2aHlXWUEyMVBjbURJNEFrR25ibFRlamJKWUo0Wm5KT1dJZ0o2cDVkS1dtVjFCY0VpWlFvNkxNODFUS05NVit0Vkt0T2J0N3pMQzRzWm1lR1BiaG0yYkxjeVd6VE1yTmtsczN1OVRxSHN4TjJMYjQ1S1Z1aW9oSGt2azdNZUZZOVhCb1RPNEtrUVJqRGxhMVRCUlE1K3Q2TU5qMzVjYUhUT3ZoaDBsN3ZlbDB2UzRDS1VTdVdWejVyTk1xUkZCWHNWall6enFmTmVBeittV2V1YnZ2ckxOSC85M01tbncyWm5Sdk9wOU1iTTgrb1g4MWNvaER4T0pweVV5SVNtdFZGeTdVdVk2R3FBMUd3dlNHV01yM1EzSzZqdTNPWk5vZUs0SUN1SU9BNlM1cGppRThjUzVVQ2lGOEJGRUJDaTB4Y1dPRU5Tc2VLN0VncFR5TUFhTERPMFpYS28vai9LZkNVTy9rV2dLdjFyd0RRaG5LSk5rZFc2ZndRSnQzUzJsWG5xMEZvOEZJR01iUGtYZG93T1lpdUZzK2o4Skk1SUZKQ1JUQ2hkcWtpUHhRaVF6VUwzazZYdG1odUQzUmFWSlUzbkUzWHhhY3ZBQ3A3OTYwVXdwRm1adnJCd0F2WlpCbHpmQjczZ2VYZmg4L0JRYkltNmpjdld1bUJMbFpGMmRPMGFOTktvczNVdG4xZUVITHR2R0oyckFadTZOSHB5NGhYNVhDVHdpR2R6VlJYeW5oMXJQV2xmdWdnbXd1T0JsRWtQNjdDclJpcDB6Y0ZwL1VkZ0ZyUFpZajJuVnBIdW0wYTM0cE1tSHhsWlBJdERhNmVMdndxcFBLY2hzYmZta0RaR2MyazFKV2xBUTRHSzJySFR3Sm5UQ3JzWU82QlRwaFQvaHlaMGVxd2MyZUNkbkMrdStaZ2VPeFNBaXFZanpxcDZJSTNWTHdxQXozQ0ZjKzhqYVQ1bEVUeGlNR3J3aFYyTWFjTHpibEpvbWtTcUZyWEJESHI0bmttSmhOSU1Remg3VXJIT1lWdlpQQVJudk9XZUNHWTlZbU83Zko5dVRTU3pZcjRabkJ2aFN1Mlc3dHN4c1RHbUlxS094V2tHN1hESGd2enNjQVZ5YVRjS1dlYXc5aXNjaDdZamliUlZ3ZFVEZzI3dW1uNDVFY1NUQ1hHS2ZBcnovRUR4Q2tsU2tiQVZORk1Yd1FHdWMrejI0djFuUXI4eHlNWVBZL0FENDZxblBDWVdja3ZSWlB5QlF1NUEzU2tHcGJUN0Y4cERIc2xoRWZZOGpsKzVQNmNlS2lWMUtnWHFoSzB4SkNDWjhabVNrN3BNL0hzWXhxcWJQV0xXRExkMm9YSFFKL3BVQUNrek1ZNHJmMEVTQXZpejIwbC84Z1JlTER4MHlvdlhMakVSOWxSbXljSU56QnlsMk1WSnN2cXRnOEYrNGptdW54amorZnhHTkp3S1hCOEFuOUVyTFBQRVJYUmFvOE9zeERwZDEyMUluMTF2akFxbEtLanpRSWJaKzduRmdnczRsTTVSNzkwUnd5RC95cDhuMjRGdURwRjNDUVd0bkUxUnB6Ymp0S3FaRDVjVVlMdTl3SnQyY3U2RVdCSmc2dS9GekxtWklSbm5DR0lyL0haS2xqVWNnT2ppTHQ1YkVqek5uVHdGay9zclBxQVdlTTBNRmowRFM5VjJBQUVBQ081OTdNZWpIY044SHVmLzJranJmT3QzNjkvUWVXZmU4WEIvOVA1NnVibnM0ckFrTUZWZ25NN1A4M1NIa09ob2dGVkVUZjd1bXJmY1hxbkFHa2dkbk50Sk4ySHU1Wkxjc0MwRXZKZFF1elgvSlk3dkFiNDMwZHZyYUV3Y1Mrc05yUDhZZDZoWnovZ0ZCcENCc3VvUTRGcmdUMjdRSWhqbXE3SUkvN0UrU24wcUhkdFRNbjBYQ2VBdkwzSVVkZWNUL1F2akRGOVFYTzNlMnRRMkN4VG5RbUVtaE9JK1dFWnBmK2lmR2hBSWpweExTdTBMN0tEN3REWVdUNXRCZkpYRlVQY2VzUkZWMVFqOURPYkoxVEE4ejNKMEhlZUE3YTFqVml0aFNzTVQvazBqSG5HSnNxLzliQlp0VTd6SDRrN3J4bGNIaThZODA4bktXSyt5bkRYZ1h1WTcyOVh6NnN1WXFWUW5xTWlkMllJMGVvQXZQUlRPbGhreUE3UTZYV0ZITnI2bTBoY1RLZEVoL1NubDlraldWcVdVanVXVmVhdGErcjFzcnNrVGVoYjdBZnl1bWthNTBlZWpkNUhFRDhCRkhSbmM0Kzh0c3NLek5ORHZWNzdWTkppZXZxVVo4ZHRITUtCc01JUVI5RC8wQS9kSkh6UGV5a1pXWWFpZjM4OGpXZGZEVXJKSzJ4UjVIa1FlcWdNUHpUQlJHWk9STWFUdDRKQXdnZkNKT0JPWlpCYTJLNFRPR1dxaDdWdlA0RURnMElBWkgzenZZWjd6dUJJV1FnUENDTUlQUnE1aDFkcmJZb1ZMTHhNSHU2aGZYUGJmUm5pSW91ZExxSEZKVXBmQzQzcE8vRzBUWDdhQmwzVExUYVNOaitGNnkyV09KY3UyLzF0MU42S3JVZnQzdHpFck5IeVlRWllZNlpNajFtVEppdk9FTkk3T1duL1NySHRGeVRtemJQT2ZnbitzLzlEL1d2Lzcra0ViZjZOOVZKMDVjSUdFeVZiQVYyL1kwaW5HUUtBemlwcElTbm4zSWNMaUlrT1M1WnRQWDZSUncxUGIxSW9FUUlYeVNSRlZvWEtWamhjR0VBMVlNOGpnQWZyY1dMQ0FidG5DSEtTVkVXdGg2V09kaDZWdWJtVm44VFVvSkVMRXpSb3RDbGdLaXE4bkhXMHNtSTBXVGJhSlltSHJJZGhVdVozTFB0TU8rUU1iYW1aR2NMcFVwSnR6VFRwa3E3MGk0VDFheXRTaXdjS3RwSTQ4TVJqQTNzS2k1SnBVeG93d3cwa1I4Wkg1WEp0aisyYkQ5NU5wOWViU1JCNzR5U2lqR2F5VnhGbFk4NjYyb0tLMTBWbmkxbWN4aGgzWWkxak5LdlFUUVpUV0FYNVUycERORVJPS014VGVsdW5SaFVHenRMaG9TT2sxR3gwcmJRUFBtVE15VFNuelIxcnIzTjJUamh5ZEJOaXFTWW95QjBKdFFpZlFJSGp5dStYVlh2Z250bjFtUDVUdTgrcFFDcm5tcnpLMytTemVpVGs0OHJFdzdOU2pxNkpKNi9Fdll1OFN1WnVOVXdOc3VLM2F5WXBVdjBGQVY5V2lKcVloSTV1VUNiTlVPZDd5Z2FPR09KR0hOVytHakNCalNoUTlZaUQwVWhneFcyUnhQVVJTeFNWeFRZUlJIUVVwRi8yK0RYNnNhM1FZdFlHNTg2WnhIcUx2Z3FIMWRKckxTOFMrTlZjTXN6Tng2NTNzVTlkOEl0c3pDcGNVM0lRaWZHSmJtakN5cHVRTVpkRUZ3cHhEZ1JzUnlqSW9mb3dUNEVZeGRBbDNQK0QxdC93bG4vaS9YMVA5TEdZbFdLekthV3VtcWZCN3JDTTdaVTZTbnlDNWhUR3BzcHo2UUdFdk5xOEFEaFF0M1gwb2FLUG9GNlZlV3JzaGh1YlNQUDI4VzQ2aFZLbjhEWEw3WTlrczJTTjM0elkyL0lCRW9Ibm9JLzl4MTQrejRQN01BM2dIUDdRNTlJaUovT244R2YraDc0K2tZbzM5Y0Rud1p1NEIvdXd3cWorOC9JTSs0SFFCTjVxbDYrQlUvZkt6QUQzeENlbXgveWhJbTdiMHVoaTFIN0FnMDhab05maEpheEVQZFpETXRlVElmRjBCbStSOHpWZXd5ZFArM1o3UlFLcmZ5azVNNC95SDNYSTNaUE9PQzBCc3lLQWs4cDRmREhMc3VjeUNNbXdvRFpSZjRnNlFFTXpKTk16TEFZU0ZrTFlVa2FiQUh4Z0tsaVduK0pzK2lXNzVRQykgZm9ybWF0KCd3b2ZmMicpO1xcbiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMUM4MC0xQzg4LCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RiwgVStGRTJFLUZFMkY7XFxufVxcbi8qIG9wZW4tc2Fucy1jeXJpbGxpYy00MDAtbm9ybWFsKi9cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGZvbnQtZGlzcGxheTogc3dhcDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBzcmM6IHVybChkYXRhOmZvbnQvd29mZjI7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R01nQUJBQUFBQUNkc0FCSUFBQUFBUi93QUFDY0dBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdqZ2JJQnlCREFaZ1AxTlVRVlJlQUlFQ0NJRjhDWjhVRVJBSzFpakpOQXVDRUFBQk5nSWtBNFFjQkNBRmhIZ0hJQXlGSHh0RVB5VmpXOWF3MndFb1VyNmZQOUgvZnp4NkREZDlrTlFoNTBpNGtYS1VDa3BCS1RoSGJDaTRvYU9ZN2x1b1cwb01Lajk0SkpieDROYWd5QTJ0SERxY0l6bTVHUWgya1dRZTkyWFpTVW5aMzcrMSsxSHUrVTlpeTJoby9kZHFSd2U3VVhDS2xXczJJZ1lLY25ieUQ3Zmw3WFdwYXg0U2pwNHhOR2V6dEZCNHEyR09rR1QyU3ZldnU2czc2UVRQbGdGbHo5d2YrUzRBZFBuNlRESUtEQVFLa0l4bEprVUZwQmVnb2txWkZ1c1VKWkRtbTN1OXV4eHhDRXFRWWpKVVAyL1BUN093RTY3dGxFQ2hnTjJFK3EyUWUzNER0TTBPUldVWVk0cE1WQlFEbzRjNlhSaDlzMGlqcHlDS05oZ0RDek93WmlXWWpWV0xDaGZ0VjhJRGY2bGdzUnZ6M1JpTE1pd1d5cTdIYTF5Z1ZpU3QyUUx1NStHL3VkNDdtVGVUL1VXM3FxZ3JlNm9BMEFPd3NuVkF3Z1BydWdyRG1qREorcjI2VW1qNEkxa0xkWHNBMktFOGw4Uis2Ynk1TWtCY0pSVUFiS0QvZGpUVEpQaUZIbEc2Rk9GeGFsUUFHT2I3YlNzUnNTVmVKOFNDeHlOZWFFUjhmNWdoRG80UEFBT1JXMGlCNWozYXk0OERqdU80K2RhZk0yb09KckpyVkVNM1pLTTV1emltNldRNkJrZDBCSGRXaFFOeXBMbnpRN0wzUzF0dk15YWM3MmlyWkdoVmg5cDFURGlMaHFYNmJzMDNTSXZsbUNDRXU3NHNlVHJVRDQrNndDRFd1YysvVFh2Yk54cHJkN3lmVVIvMUtWQjB3RzJLTm1XcWRQUHVtNmQ1TUNNL1BjcyttcEd5bHFXUTdRK2paV2xSZGtEV2hySEhFc2lXbC9RLzIyRXVOeFZndDIycU1rVlJKaFgxS2VvNkprTzFTb0RKMkRURk1naDBvV3YrLzR5cmZrdkd6SjcrV045YWtpWkp4NU9LZjUxN0FrS3NVbTZSNnlVMmFJSFlsM205NUVhQmhPb2NnTEM2REFLTTgzVFVRTlp0OEtRQ01KaFNhRVVXc205OWhrWGl6TmpERjFoeGdNSHhrNUd4Z1B1SnlBZ1dYWDBtUENXaFgrelV0SDJyTXhaaTc0d2psdExPeEpzSWN1eDI1and0RHBETEZGSk5xTTBEaEtLZFN6aW9IekcvbXFlZ3dVODFKQUMrT0s0QjRMMUdVUHA0ZkZPcm5DUVhDR01HZHhMY0lPc0JiSTJ6eXY2dmNmR0ExeTNldkd6QU5wVTVBRWhRSlpwRHBGZlhYZmNUdTM0a0pScENSZWVPUjZkQUFQWlBPTk1RVlIwYmthYSt6NVNVMFFGZ0pTaEJkM1dBbm5RZEZHTkE1SXNLcFd2WVhBTDFKbGtMb1d5T0JvQm5RR1doaENCR2NJUUZQeVlYRm5CUzNVbU8zTjFKRVJJMU1mRzM2bks2b1R2VjlkMGozU2JBUDUvL3pSNEhpUEpDeitoWGNYQXJrblNaZzdyWUFFR3Z0RCtrL3ByNVlUejUxNldpN1A0RndQdUdOSjR2RWNpVHc5U1pyRk8xUWVXcDdvdFhwa1dzS3EyNCtsU20wd3J1WkkvZStVMmhDd204U2k0dmRoZ3lMVXgzQ3pXYWRjTEpvSW14dXNDSXBBWlhualRXeU5xTzdJcFBsYXZYc0hINUtqU2wwNUx4Rkt1T0IvZkxVcVJjUS91UngzeHpRYllTZFFuRXdjTy9iZlZhQ090bTVoWTRrRTBXNnNqQ1ZTUE5UZmVzT1hxckphZXJXWmtaWE02RjlMVFVGRFlyT1NreElUNHVOb1laSGNXSXBOTWl3cytIaFlZRUJ3VUcrUHY1K2xBcEpDTEIyOHZUdy8wYzZPYXFOOThwVUoxdzd5Kzd2cGZ3L2ZXSkI5cEYxL00zNXVRRDFWc2JPNEh6N1dEU0VjeEU3R2dxOVFOanJUZHNZY0JVWGIwNnJyUWNFQjZXeFpDRlBjVkdveG1QSm8xUXJSbWl5c0M4RTdLbnJyQjRxd1pLWW9JQkY0OHQzTUdRREJzYTNqYThMaE5nU3V2ZENTeWx0NDFKK0dZOFQzNUpNZWs4bzNCc1dkWm9WeElROU16RGZiRXRXSytVUFZCQ09ZUWlQVkErNVl5b3F4SEliT1A3Y0J0STRickhMTU1UOFlmMjF4UWdTeUxZaWhkajBaNEdNemJkUzZiQ28zT2pQYkVsNzNQN2FkbVBpRzJublFoNlU0eHZUeWRUdmozYlNBNmhrVy9QeWErRWxJUjdQbTNwK1NxUnJza1JDTjdsWktFWUxVZW5PZEgwSmh1clcybld3MGk3ekFnMFY1QjlEMkdDb25DbW5LWWRoeVpZMlhBN2JFSk1WUG03SFpFTGQ5c0hRbWd1UVdrVGVPYmg3cHpnNXBnNWJrNVJoNktFZmZKWHYrYjNDT0FpZkJGZ0IrdWtjcWZOYjdIcW90TW1TNHFuajA0Rm1sdXg1eDBFeDA0azBsTmcrTUM4QlFmUE4vSmJBQjJNYWdxb2UrVm42YlRyUkJPT3Q3V2ZhaUJWSmRnSzN2QjdZa2x5TFppWjhNNEhZLzNGK0FlakNLNU5rdkRhc0UrclYrdnhPb1hoL1pFbWt5YlUyTXVlS1QraWc5TXRoNDFXNCtxYTY0S2xCa3Z1QnNzOGc2bUxITlJxeTEzeW9vRHBmSkdxcmc0RWhZcll3TnJqTjJ5cGhFeVZMeFl2ZHBIc29QSGk5VDM0OFQzRzVTOFZMK1ZzNGpTQWEwSC9GZGRjVSt1Vmxyd2dnaG5MMW14OGhDeGhPSUxGOTB4aTBHdXRiNVVQdEtsT01PRWVkTnFqU1RKUDNIaFBGSUkzazlaOXRIaEl4MlU4N2ZYQUdyWTY5TEZ4M3dNdklHcG5Hb1BKQUhpMVo5Tkpybzd0NTBncm1BbVlJc0FzejIzVGlHVG5qV2l3bTg5bUprdHpSNkVObHRIUTBodE5sNEEzSDNUYTVZVVVBNGNQSjA0VXBYeWlscHY3UGJPRUl2Q2lCOG01TEczb0Zzc04xSWN0RCtkampZc0xPc0wxQ2tBbFlqakVTcVppYWVXM3pDY0tVN0wybzU0VjJ3UkxUYjVUdytjNmVhU2VyaitBTnZ2STl2MnFXeFVDbUxyTWlOVTA4VkVXQncwT2V6ZG1WRVJWa01xUXIvRXJ1OW5wa1o3a3M3UXE0KzZrN05DakZXZDRJTW5DV0ErbWJ5NXJ3UG1lbHFHaTk4VlJOeVhiVTNmRk9iRWdaVTRHMVJRRmY1RkJKZFBHbXV6d2xEWnhjMkhmamNiMnBPTkdyRTZpem81YVNGTm9IczZjR00yYWg1U2xhUThyUElPNXh3MEJzd0tJNmpxdUcwd1YyVFYzRWJpR3JRY1B1UFFjZHh6WGtKazZJUW1pMUJZcE9KRDJXbE96OVEwNkFVbzRycFVKaXRlblhtcWNFM1lFQjY1MmRHVXRuOUdsZmRoUkZTYXozSzN2enBZcTZ0SmFtMmdLT0VFTmtQSFhLUmpwdVlxSnMrc2hHa2RjMm5GVVVVSlVQZVpHN3hCNlh3TE1DS2JHYUFjVExrNG9DYTI3MG9UeExaeHB4UG5LUGhRd2JBWmhqQmhyalhDYlFITTRaazlxY0d0c0tJUk4yTXFYT1Z2UzEvWDVyTnErdWdGeGlUQkhIYzJzdXpLc0hITktNdEhHb2dNUllrVW5ERUNHdVdKaTVIZ2MzcVZNclorQ1Q0Y3dBSjVQVGVRcVkzTDdEQ1BDQmthK3cveGF6QVFCTnJYV0V3ekd3L0dGSzhBSXJ6bGZEVXpvNzljZVZvNW1ZSEdUVm5ISGgrQTFjdnNFRGlkK0FlTVZsdnFSbER6dHlCNnlQMW9KeFVjTzhJUm91YTdUY3ZMVlJ0ZWVXTXYyYUZSMWFNOUltSFZhMmhiOUFEVWFIZzVVSEVIbEFCY0Q0S1FIMWtJRDhWRDUyaXhrZzhHQTNQYXloMzhsUUJGZk9STzNtUWlkbGxxN0cyV3EwMEZkOHFVYVZwK29POGNDZURxNjRlQU01V2J3clRxN04rMDJKNGVqUSttVzhaWG8zSnBxWFdORVNOUzVsQ3c3UUNyQm10SWNqbVEzYTFzS2F1RGpIeE42RDlSaU5pSzBmMVV1WW9mUnU2R1BQVVlIVjZnK0JQc1lIWkFzaHdrWUtXMjEzdHZTdE9OTWdpYUIzdEU3ejhGVFYrRWthTW1nRVpkN0ZxYm0xb0xDem5ZdWhzVCt1bFhVeVlhc1VQMzMxcVpMeHlHMmpyaHdxZWRXNk0yNEF5Y0E0d1ZYUHN5RkVaekEwZ2ZWcldRNHFpN2lpUlNmVE5MVndhRWZUazljWEpjWm5PTEo4SWsrWW9tOFl4SzZSNXJMb2Vod0NrOVRCVXRkZzFQb2pYUktvODhhTG5CMGpoUGFxYlYvL0lNczdRT1k0b3ZMRHdpcDlud3hjTVYxMmxxTERtUG9NYW8rblhNdlQzVWE5UEo0V1BRUytNblhML2pjcE53TnNOZGxjUFgxL3lQbkhURGxtQngvQjdDb08xc1F4NTd5RHVXU2FGNlR2Zm45eTJlWHpPVXJnRXIrYnpBN21FWnRLMlZjQjJVc3hHZU91UzkwMVZmdnlsY2ZEL1V6U25vVndaSXl0bGxvSnpJbm1LN1pMcGRvblZkVmZCdDhHeU5hd1k2bVh4MmZhTllJVjFRK1h6d2ZmVHZEdjgvSUNJRXBxZlplOWNBc3Q5OTJYTEZQZnFwWGRjeFZ5bXFuZFpES2xjQWNiN2lYUDJpbVBjQUVXM05SUVEvVnV1YUQ5ajJucUI2ZGdlbnZ5TVNKSUUrRThCdXNkL25kKzRZVmlmY0M0d3o3K1lPRm9pUERUdjVvNngwTUtaK0p6UUFPSGVQbnZkYnlyT0x2cHFxN1VtT1FJSGtZWDVTOFRWWHdrODJydVljRWY0VTJtT2YydzJLcmR2c3I1QnhybGZYQm41NzdQbXc1aTl0cWRxWWZCYnp0cHh1SUYwSnJYSFduYnRldGJMbXBDTm92WEI5MHlRbzNZMEc1T3ZienFKRWNKQmhnLzRVQjVlUXZKdlMxQno4OC9lZTFQNVBoUFhubjViL3NaMXVEOE5GQllSdFppRU1hUnlyNStWTlFCUmhjNkhBNndhQUdOekREL1dVcEMyV1hFNVZNR2ttV0V3OWJwY2QzQWVFVmRVTVdjZzlpRmhmK0hkQ3lDYnZUbGRjcXVtWnZlVzAzNnFiaVhCZTl1bk0vNmh0ZDJ5UFZjNUh2ZHcva0xuZmRiZkwxdkZBM2c5NzF0RmFOcXoxVjN0bWpqeUxMU090RnFrNXpyWG9pbEtmYjVaYTU1YnRTZEx6ZDJoU0hjTFVkZC9kTmhnSS8yRTBOakJVallJcHJZMmVrNGovSEplOEkrNE1YS2w0VTRpL0s1TVRvMlBkbVZndkNHT1FIdzAwalU0SnFMZk5ZMGNKVWE3NEcvMWozNnBEM0lBZitpYTNGYlZHb0lBb1RHTFpsd0dUYWxvZ3BqalFTbGRjRksxVzJGTlZ3dDYzRWVaUWhBWUZqRk5KNnJrYXd4OVV5dFpWS1Rxbngxci9udkxySmptNE5ycEd1dlNXRUFjL0N5S1E3Znl3ZzZZejh5ODJXWEZIL1RvYlZDNjZoeGNZQUFTbitucjRsQzlqSnJuQmRySzFnZlkxVzEybUY3Nk04TC9COHFKYVVQTzBDQmtONElSZlRMUDVudzdJKzd5S0crdlBOd0ZSUU5NYzJtMW11WEIzNGhLSFRyb3NQVEQyVVFSUi9RYU13VUpGc1dJUi9hMUNHZkx3M1FOVjN4T2lucHgyZ25IcWU1WlI1UVZxWnMyRWs4bkRHOXlsL1YrWldzRG5NckFaSGpNN2lQRUNCYVpDZXpnOStZTXZxZDFlMFJUZ0JDVWxJem5pM1Jvdkx0TEtLcFFVd1RUNVdla0owZGRiVHRMZVljTG1aNnVndzE5MG1hcFk2ZU5aT1NOeXlOcWNnSDBJYjVsaDQ0VVRGUVhwdEFrRFdGbFpaRW1OeVNKSXNpZ2dtN2w1OWFySDQrd1lsREppRlhOTUhxbHFxUCt2WjRLUVB3T0RQTm9PdnJETmVKdTJEbE84QlJNVWhiRVh3QjRxVnczaEFtaVQwK3VabVV3ZkQwa0lZdlhBNEpOQVVFMnlmRFVGTUpsamllaDliR0diTXl1Y010RWFDL1FiUWppa0dKa3Fha3VqQWtGZ2wwaTNabG9LbC9uNjZXYys2UDhzbVJkamRvVzFMWnBlMnRyRmpZTGZBVmVLQzdOdkRScFQ4Nk5NNlFycUNCMjMwSGU2VUtISG1sRGZwVERVUUxMcVRhWlpiN2NKTWtLSG9qSmsyci91MUUvSVp4dW1TNG5HbExEb1p4d2F6aXpxR3RXTVhsbk9KV1RJVjJHMUxYQTZ5Q3J6SHZ0OHZlbmJTZzdocUR0NlZxQ1NxeUhBOWVmTGVPallXcFBhVzZ4d3RUZ0ZCMEpoQy90Y2g5L1hBODFMOUlKQXlyTC9icFBWV3laZStWckQrTC9uM012a0lhNU43YlU3VDlWN1YvVjhQdnVHVEdnTnJoaDZHYzF5bGFIUUJQVzRoYVhxQW56amJ1bHh2dFI4UVVtM0xoMjgrS3dtWElPZkU5NHlBWkhobEZXdEdDNDZySlV0bW5lZmp4L1pLT3lEYkFDSHhmWk5NbFVCWkwxTUdXNithZ1Qza01wQjZVRTZtamRUOWQ4dVNEdVh4RXE1MlV3Y2U3VVdBUFZ2QjQ1aklySUttRExwUXlBMDJMYlEyTHBrOTRHU2IxWEtNVUk3SDZ3ZlUycEJIK1lGdTVaU0VsQkppdFVHWXpHRFRDSDJVWlp0NG1nS0hITnRGVEhFZ1JYb2dNZkMrNE1BeGpDQWdxQmRSdGRsNnpsMC9TL0hjY2RMSW12ejQzRHd3NEtpNWxhSFBmaXg5Vm1rcHB6RDE4ZnVIN3F0S0hNdUg1N240RE5vdFZlQmV1NFovZHZNaDZSNDNuQTVCUk9WS24wclliaFcrOU5tOTRtbzFJdFNLOTQxa3EvUWdxYUJYbVZXTGMzd3pjd29SdTYwSk9pUHdyTmY3UW9hdVNJV2wzRUtKeTB0YjZzb2dsdklTTUVySjRaOGxadWlQa3lJNlVxM1hQL1JXNWFkVXRXZG1xbml2VnVqM3ZaZzAxU1QxdzdsT2UrVEVnMytlRWxSRDJRL1BKNEJadVBDd3FiNEpKanp1Ly9tR1ROOXduN294b3JXejNLeFZ1TnpJR0xwS1VpYXArSlUxb1lpS3p1bWpWMVZrQ3VjNjVCVjZkM3pzaXpMOEFoSHdNTGs2QXFVNnNUaHo4VTFvMisvd3EwNUthN1Zabkt5eCtMVi9rclhNdHJxYjhpaGdhbzl0aWJwNWd5Vm5uVnpVNXZhc2ZJRWw5N1p1SkdJRVMxS3FKMkRHVlRrdkRCYnFTZThFd2ZKVGU5QzR3Y1JyaG1ROXAyb1hkWUVKNGpjVElHcVR4b0pIWWZWaG1BSTBhUjE0SDJBRjZLRkU0TmdRZXI5RjA0OVVCczdEZThnTzgvODhCemUwRGpHMFlvWUF2Qm9HcEtXQjB3Si9HUSsxV1RtWXRVU3FlQm5ZMW1Idi9rZjFsM1VwREgzOUwzbDJEZ3c0aU9kSnBCakExQlZsVklNMm53MzZJQWQyLzR6dEgvb25WckJIVmh4OFdVY3lFcjE1cExmWVJBVFhENWFZUngvWERRNDlySXM2dXFUeXhmYnZvU2Y4R0JtRWR1U2NDdlRwOVpDemd1THNwMkRYbEoxTy95dUpyOW1tZGxZc25Ra3BTcXBkckRwdWY2d3dqemYzUHF5ZFVuYzBBM1BRNjY3MndDSXQ0ZUpwN3dSdkR3ZDZFem5mSkJoYjZSMUdNOHYzU1UwVDNQWXZUZDAxSkd0YjhMMnhFNGFob2J5VFRqUVhML3ZJS3U5VUE1N0pkSFJJbzJycE1JQ3VOam8wWGxabzJpakxyOG1mZmZmbnRtZ2x6alhCZFdaclFmbFlrVWFXYTVKM2pJUlM4bGtxZ2VMdlJEUkN5bXZYQjI2dmpHOTg1S2gzdzU3UWlIbDZZZlFXRi8vSytEN3g4U05TeTFKT1ZaemtSTi9XRXk0YStLeHp1RFZMTnh1QjVGVXBZV3BjYUhKQWFPMWlkNDlXcEVMOUswN1duNnQ3QmY5ODVEU1FtN0N3RTJVS2VlcW5XSTNoN2l2bGhhQ29KaUxlcjF5N3BENjJDSVBBVVlNcjlqS1l6eHVpZmhWN3NYaHBNTG9UNTZOZFM5YnUwVWpzK01UTC9YTjJNazNzWVhsTmNXSDdxRnlyTTVDZnJrOG5veFdwSUNnQXFjMzZmZFpXL2ZxR2hWYldCUWlEeitZZWNvdkZILy9TYzZaNDBQOFUvRXEzcThyM0FQNll0UzR3NVB1WFZNRlZUS2ZZNVU0K2Y4a3pMV0hPczRBUDNpbWU0Znp6dXFDOThXVmg1ajhXMk9rQ2x3MCtrODJxWmJwc0ZPUzdyUEtqVW9ZN1hpRU10WU92L1l4V0VTWCtlem0zekMvZk9NVHJxNHdPTEY1L1V3Z1VsU3Ayd3c2M2tRdk1iTXBaWlg1Mlk1QjhiUG5adFFwYU9xTTQzbkdidDluNEZtZmxZTVNNcnRwMEsyWUx0VjQyTzJJWExjT3Jjb0lJeG5qbmRIdW1UclJ1a3pjNU9hajhaZjA4YlVUSEhXdFY0S1RhckV0a2N6MGN6YTBkc2s0eGRCaTRCaUtScFR4dHhrV3RZdnZWKzVlNXFHcXpWZnlxeGVxeUt2QUVUaDFtdUdreFZFSXlwRzZaOTJDb2I3blRtTHNmY1hSNlF6V1JZZW9HYnl5a3Z0ZTBEVFJ4Q01nNjA2eXNFTW5DMitqb2V1RlAyT3ZxbU9XWUxTN0c2WVNjZFVRZG5KbWNXcG9HOHF3emtlSlBKWnhOVlByVkk4WXRLVXRlMFJjcFdzeGVYTkVUOTNhUVJrZDdGK2w3NW85VC9TY3FCSDJ0cFpuRnVkeWFZTnVwUEdYQms5YnNWcEdXM2IyNXBuS0FIOXhLTHZZY2g0VUJBSDFQdnhzSWE4c3JNKy9GajFXbkh6WkgyMjFWdC8wSW5SQjdOZkJxUnV3d3Iydy91MEZQZE5pc3JmL3VPeUkyNDl3dnZodmhOMzRoKy96Y1ByMEZDczgzTWVtRTdrV0Z6R2R5L01aMnoydkkyR0NScGlRWlR2MUg1eU1tK0JCZEcwWm9NWmVUeHVkOW1PM0hTMjNjYWJ6VVUzWGwwZklzLzlLMUhRMjRoYUpsMHB4ZFVUWnBRWnB6dC80UnRNRGxlbDdWbW5zT1l4cExQV0IrdjlaVlV6NGJpMnJJcndlQ2tUTzdSMkpIZVB1bUZEMW4vam50SVdPMFRCNUt5MGwyc0pwWmliVUZ3dzNhRUQ2eXJobzNjVkE5UTJTbk1LSDg1aTlNNWlKbisvOTNDeG5nbENqdHI3U2hzcW15cE53djY2aGM1ckdaemJDMkg2emJtQ3Vyb3ZtenAwK1VwS2tmU0JzazVDV01KSlRlL0prWkkzcUM0VE9WTjRWL1dWdTNOcEpNL2FoU3RleG41NXIrN2JtNGYyZHhYbnJ3OXd3MnU2THMzUkRBSnpkaDRIQmlEZkRzOGV6dFJ3Tk5mazkyUUhIcS8wcUNHaWNmdnJuek5lcjhZc2JsSHkrUC84UC92TnRYVmtVanNJZFBWRnhIbjR1Y0EvZ3pxTjdzUDdKN1VVbnVPWG0yakdEN01GajNZVk13TE1QRzdMeGRHczRoZVVYWjUvdVpuUlh6cmUyK2JmT3RsVFBieEIvYkRtOFArZzRjMzI1ck90d05hNWdmYVVaTFRhTkYwN1c1dkUxSTdIcjZBKzBBZy9abjFZYjFLT2ZkcTAzbDFWL3k3dCt1dmxLejRoaktwYklGR1VYbHM2NCtWaVIyYzUzenRGNTA2NTNnK0Y1MW1mNjVUaTh6U0pKNExOVHZPQXovOXJJSW9EdWRMTVhUb0lrUy9sSkg4TC9jWEZhR3Y3emVlZkJ1UCsvYXJ0cmFLdHBCUC9TYnBjZXlpZW8vYXh4cVBFQlEwR1dlbTltTWFDMW4yZVkxK250aUI5SU5XbytTWkp3MGJ1Qmdlc1lLbmZLS0JNVTV6TGEyVFhtT2FEeWsrSFFFSW02UUZZeTA4SW8zb1RCd1ZDMW4reVZsOFJQWktDV2FWT2o3MzBOUWJLdmpRYnhHWkcrMmwydC9OZ0E2dmpVWW1xSi95NXgzNCtucXRQT1FFWWZIcmMzWU5Fclh2elNJU1U4Q0R2NEFibkQ4MERqK3JaSGp2UFhKWm1NUVRNZmRHWWs4dUJKU29kOS9sejZOL3lWODMvc1l3MWhLMy83OW5aUVUvOWU1NGJJcUdvVTljSUwzR0IwdzV0TnUzNGw4eHQvZXdZQ2FteDBxN3lXekJHWTVEMnhlVCtVMFJTcWNCZFR1dDVpWVo0UzhrekxpcTh6Tmx2M0dCckJIVHVSQWptUDZMU09IakozVlhhcW9ldmNNV2VOaU1ZTmJsQ09kWDF1RHJGYys1MHlvVWpEMVZOU0VKcjNvOHJuU2F2Q0dXT0dkeGxzd3R0ZGNmczZVSXpvYi8yeVFpT3plK3hIVGVWTjVyTjVXNmg1andqTy8xaVNtN0ZhanBrTG5wVHRxUzNVa2w1cVhvZ2pFdGZxdXZodDE0VWVYbHM3TFh1UDM5bHl2b2Nsb0pFVmtST3cxNVJLVXlvS3B2Yng5eEMwNXZ2ai9GNkJ0dnVJSXJIelN3OHZuNjFkZVkxTDVud0xjbC9mcnRYTTBwZkNaOHFyOEQ2V29VaVdPOGxjcWlwdnN1aWQ1VWVaSmxFKzFkV0RWQ2pmc1djTTA5K2RuM01hVXVZRHNVY2UvLzR4aEpRVDNrZkt4Z3UzYW9EclBTQ2FUZ1ZrNzE1d1hZT1JBczR4S1o0VXF3Qml5OVduYzBJRHFOVkxMUS9CdTJveEZWSHB4WUhpdFR3VTZDVk5XUThXNmVDZDc1bW1ka1N3dTlWSzNLQUFyZnhJSlFUa2JiVkRVRHV2T2dHVjB3bnhEY2pNczdhaVEwWXY1VUJqZjBUZ2VBVVpLcVFSWmdIdkliL2pWRjRaR3JVYlBEVmUvNGZlUjgyc0t5RmJraGdKV3RUNDRZOW94UENlWUZwc2Fpb1k1SG90enRJOGpCZE5xcjFEYXZFb1JpZW9ORjEwMFJPYngxRUlkYjE4M0J4ZHFtVjVNWFFtblVrZ0lJK2NTT1lHbDJnU04wd1UrT0JGT0hYa1huRVNxaWJ1SzJTTnh0TzZyWUdzWEZrSVRQdy9IT1hWZEE0L0Q4Vy9CK1llSS8wNXVIUm9hQ1VFaEVuMHd1T0tsSUhZMktmQURMeTVBNVZmSncxdGJDR04zOTdNWFRUOW9uNVhkTDFLa09JTmc0MlVqYUtDTkpHb3JweEpsbmlOcExCYUkzNzRJdmtCcDhWQnNub29pSGJ4S3V5b0FCZDlwMzRVZzJwa0tnc0pGY0ZFSUlrNzFpcGlpUGhHOU1sa0J2NHRjN3BFOXZGRjRLT3pqL2Z6allFRDJhYy9USHVrZk53cC9GZ3A1UHgwZUc1WlpkczJHOXpLOVozTnlDSE85ekN6cEkzZW8xQ3labmxqdjJhelYyZnM0cis2TW5veFNVQ2h5RVFsV210RklLRmdXbFJRZUZ6MW81M3Z5cVFBVWZBNDZQZW1VT2JndzN0aUlZZHdGd2FDWHdGNGdPaEFKUmU5RXh4bmI0RW83Vk1nSk11djkwV0kwNmVDMlRkMmFTMGdwZ3hIUXNFNXFmUzRLckRTUElKNU10dWJ4L1JuMEVpLzBPQ2pjTnFxWWNmR3pmS3UrRFF1a2VtelJzY3c2djZqSVV1OWNsRlgzWDZBQVZQSEpKMVlzdWdUNy8rZ0RHNVpKRFY5Qm9mYVdXR1NWTjgrR2JYdWh3Zjk0dUVKSUNXYVkvN0JTeXorcGl4UW9rTXcwS2pXUUdSRUsrczVVWUZPTWk1dTdOTW10SDlsNWYxeGFLLzMzbDMwMFRVeG5tdlUvZmphVVgwOVBPNEQxYVgwWGdJS3JPTm1MNmZldUpKZlYzQzFLK2NmczVWU1o3WG9SUFM2MmlHYTdYbDVxdDFJWUVSdGJGR0czb3ZGMjg4dzFaN2xVRU13SjY3amROM29BQ2haUVVoNFI1YUY1Q0s0eEw0bUJrY0cvK21Mc0lGZGFPaGlEUGUzdUVlRmRtbEhJNDlRRTIwM2xLUTg4YTgxc0ZRbEVEWmtOYTdyaTNwcEgwRXp2SW4yUGdnbUsvMFE1SmRLbW11dWhENytnMFBJeFBlK1BqZjJTZjcrbE4xSGExSnZOU29xS1ZjL0VOM2lRRytGSkJxVkdFbHd2UVFNbEtiQmFhNS9mV29aQnk1eldCcmZobFhNdS9xVU1obi9ES3FtbFhTUXJMM1kyTWZCOVRweWYyb0ZrWnM5MjBCVnNta3cvNGphTmYwMzhuUHd0cThHZlFhLzBVcmVuZ3J1U05mUE8vaVUrRUNzM2orLzdDZmpwRGpoMEdYcTVrZkJ6OHMvWjlkalhXdWFsQlllYjhrQ2h5Rk1rQU5NNVBZcjJ1MjkyV3I3V0dOZHZqTENZTGQzNmRWY0kvdVdBMkZIV1h6WjR1eVdsSUZrcVhvSjN2emg5U3d1RzFEMFlUckljV21ibFpKWXZtUzkrekwrWTRObVNKT3lkckJHL0lxK21wSUgrcWJMRUlFbzZPNFdjSEJ6a2s1ekNwcWJybk5XUmh0SEp4WjNPV2JsdGp1N0Zrb3cyZUh3WUllNThQQVhPbEllZi92RjlZT0FiOGVacStjVkxlVThMbnM2cnNYUE9tRFdhTVhCMnY0REtNeUNhcHhJbmlNUHdWSlQ3d05IUGNSb0IrSXN5OXJDajlwWnRHa0VIa1JvK0FsQWc0NWltcHNDL3BXUnEwT05rYjdTYzQ4QTRVV0F2cW85WXpXM09mUGlhMWNKL0ZaZHpxemtqY0dXc01FdmJWWnZsNFJUaFJncE8ydksyc0xnOUdLRFlGVUx2eTI4ZW5XN3FIcG5yamZMZ2w4YWc2OW5vZ0FMWUFqV05sRmk0cXBjMGFlQmlTVURSSzZHMDQwcGVWZzgvYWthTHJiajFTMUhYL3JKcjFpN1VxSFk3alVWaVN5NzN2c3RkNGdyZFkxZTZpYXZkd1RXdTAwR2U0ME9xMmtYUjJhT2J1OTZ0ZE1ucEhyUDFyM1pNMUZ4YnMzVlI2OGdWRjlxcHV6U2RacnBseEg0aU9xNFRLYWtsRHptRTF3RTJLY2FXMk4yY09GYjFYMXZPc2piS3JlTytKWGR1TXFqbStCTGh2SHdBQUQ4QXJGL3A1V1pVbis1Z1R2NERJbkdsMjhaTFpjNFhZbWsvTTlrZmJsSU1nMTVoYnpFSGRmTmh1Z2hvODVrU3kwZzlZVU1PYjV4ZjVMTGgyekZrc1MxZTRYTklaSkVvZU83YStYeXF5bzdSTytKS3VVSytkUFlTNW1UNTFaRjBicERRam53bEFyR3dna0lFRzY4ZnFkSW9kNzQ1dUlQdGdDWnpiYmZZc0lVWUZLVHI1RlJtWWp2SzdRNXJVOVVReFU3S00zWUI4RVI1UFhtRzV2UmJrejA0dS9Cd2k2MittcU03djhjbGtGZVZZdDhGcVNiNkxaZHlvTTlQOUg0eGpWYUVGTkVacVlOeEdzUGo4ems4dnJoY1hOWXQ3VHB3SGJtM0FBY3JVd3grb3R0RC9nQXRjVEZGUDdXZlVFdk9JU0s2REhwMkFnYUtsQ2dXZVhFWXpTOUlDaEF4U3UrbktUQUFiNlpIV2x5cEIyVHRobDU2TGdMRnFsVHE5ZjFGQ3VLcGNYSHBWU2tTa3JXOEIvdkpZVTM1cWNjdjBNeW15Q3dpRWZFMkQzSHFzUmlMY3JCRnVseFNOMW94dkowdFFlRDhkWE5yOTFhV3lKNzMxRTJhZ2xJY201Y2c4ZHN4d2tiUDlLYkVhZElIaW1zT3Y2UUNZaXF2UmpzVFJ0NFZHNGtqMnpIZTlZcTlVZUlNM0puMWZhWS9RMDllRUZtYnlDTDFZRjNWaDIxV1BNL3FXaWJzaU9aWE5kcHorcjRlRkpqdmF1YUt5eDFiMVJNTEpCeFVpemtKY2hjRjFqbGF1ZTRNUXhXY2E2QkNoLzUwUjU1a09KL04rNEJRS3lUcmJnMERaRzRQd0xmK0xqYkM3SUhocGQ4b29ydFdqVlk5UFEzb0dQaFQ4OXN3bkpkVjRqdlM3azNORHNiYmFVS04yMXMvdHc0VWdKVzdPL09qQmwvWDRDekxjdVNSTzRNbldCOTR2LzdEUkY0QWY3cW91b1ByeE0wdVFnL3lyakxuOExUK29PVitFU080OW9pd2tVeTNoY0NJcnJ2UU9jMjhMNkFxNElqbjhDbGVveVdhNmZsaVl0Qm5hRE1ScWJoZ2U3R0xUSWNaamtXMG5xbER4OU1TOE9vZFdVZ2d1N2k0R25WUzRDUUtxOXRwWG1sbmV2Z1VaQnBWSlBSZUZ1NDhQck40S2EzcU9UcW15N1pwMU9PWWVLcHMwOUZ6ajJHVHJpa0d2WE9YZ0ppNGNlZVBCaGI3ZVJwTVJweGpkRFFYUlZla1VtL2hwWlNRcnozMTVEcFFXU2RwTUZPaUxHNnFLVTFoMTdNRG9mN3d4WGFNRVZLeEcvUzU5VFNxSkVUbnpBRnlpRmpUWmExMk9RM01oUy9ES1ltQUtHdU9oS0NFVkMwMDQ1ZzhweWh4VWg2ZHZualQ5K3gwaDV0bFpBakxzdEdaeGFlc0tzMkk3K1BPem1OMm45VFM2U2ZXWkVxMERDcmdJSnZMejQ2UGl4QmpVYkRIUWJsUjVSUjRtSG4rSnJvNlJGREFkK1p1MC9oNTZGc2pYbXBEaUNraXJrSGZSNXRXTEJ3NTQ4L1JZTlVFaVY0OVphQk5rM2g3NU9LS09LVnNKMDVPbS9SaGUyc0xuSG5sUjN0VWlKcHF5SXlDSHM2Zmt0WXBYVm11TkJzTktRVXRQd0JPaG9vTzZrN0xzOGhkN0VhTjVqRldGU2d4NU45RkIxVmpIUWZOV3V5VU12bFlhTUNmSmNRbzRva2Q0WnZLTm9vQzdzdzNSYjdSeGVWd0FKZ2MyR0JVUm1jV2w0UFQ4RFlmYU1Ld096SFhNU3h2L2VHR1hwNlN1SWdSN2ZSMjFDUnVRczcwV2FZclBXVW1ES1YxOTBHRE1rVGtKUm1RZitVQ3dJcDRsSGIzMTdaYUlWVE1HYWlwMW80MlozNU1tV3R4RlQ1Z2l3dkdzZFRzNFJEOUQ2Q0RZZnZ6L2xyelBmQ0o4NnJyOHI0LzJMSDl0UWEreTA5Q2VneEg3Z3JzcmR1a3RSVUYrRXhIbW41MFU5MVFNbHN3ck9hMmZLQ095cmVCNEFVeUFWZC9mV0hhMkQzMVVwVmhLRGc4TDFTNUVPU1FoT0l5YzRCUHJkSGNId1NmWWFycnVVdkVOZWFzVVNjYisxV1dHd0tSazUyR0pxeW04MGpPYVVqL1RXc3BhN3Y4dVE0T0RPZXY1MGJCQWk1QW5PMmdkY1UrcEtrNkNzWkhwVEZXb29Fb2s3c1VjL2daa0YwQnh3aVlNeStlcXh4QlhoNGJyZnI0Y1dGK29aV0dPaU5RL3VLSFdoQWNCZVZaaXdUQXZYbFRBZ0tBNWNtRTEvNDRtbjMycC9CaFFGbjQ2ZldyMzdidzIzVzkrNTkzL3hiVE5vb0FnQTBOTnhENFQ3U0srMkJEeGtEcEw1L0tXM0hOUmprS0FMN0lmb0VEVjhISzRsMmFiTTUyNjB4ZVdyejlla29uTjhjR0RUT2l5VWNueWNZYUdSMGZtdTloUlRaV0l3RjhhaVQrdjRObFdIRmdQT2VObzhLTWJvZ0JLSHJUU2Y1SCtnQVordmJMSGZ2MVBLYXErblB5dEJRalN6N1UwcVFsVlQrUUFkSU84WkJYclRnRVdSVDZldXdUZEdZNDVaQ1JOYktLUUdNSW9TSmRyaURTS2wwZ05zQW0yQUZ4MkFKYmdTQVR1c0FtOEJTVkNzS1J3K1RJWXlITDBYb3BTL20wSkEyc1JoR3ExWm5kYThTbXRHZ3ludG5jaW1hNkVJd3NyMER6YzA0RlpSeE5obWF6bm16UkxoNHJDQVlOK1Ezd0FMWlczcWFQV21WUkVsU2srTDN4VDdTMGFzWmJFK01saDA3RmFYSUJYL2daZHJWSHBnazBWUUZLcURiNUp3ZW9PZnpxZHg4VTFYbXlMUVk4MElGaCtXZSsyY3ArdnRBejByRVRIUjVCQnBnZ2orbmJ6UUZZRTBCRjFxOUpDcGF0djRVUEpZd0V4RFBWQXFCbnMvT0pNOU5sUHJjcWNjUmQ4VEhnZGlnYWtRakovNzA5OGNEVjI3SHRKSFk3MFNUdDI2bk5aSHViZFMrRjdnVUJRSkJxMGUwUVFLYU9BYWo4Q2tTWjh3TlNsZk16RW9OdmZaMlRSRWs0V0ppaVJFdUJoV2RXSlZoVXhZa1VCSVJtbWNBSlJUaEpka3lJV0tNeVJ0YzBvY1JCYXBiUm1tYXhsWjQwR21WU2taeG1lazZqTURrb3RoREJCQzJxZUNyTk1uRmFpQk9KSVdRQ0l0bDZuS2d5WnArT3A2K0ZKSmVGS0tuaWRtY3haOExzUStFTU53VHBKcmhRZUJwaWpGYTBiVGtPNlR2QkpzbDA0QXZWdkY2eVF3RFlpZlkxRFdhZFpLRTJrU2pqTWdDVFVmMHNnU3RQZmk3MGhmUnptbDVvYjY0a1h2aUFPS2Vnb2E1T1F3WVJ5cWZGbFMrdGZZUDNUWHdlSThybk9jZWZuYzhwQXFuTC81eGVoamsxWGVOMWt0NkpxZWo0L0QvSHhxS2pmU2p4dlRrOGFONmh3VHZZRlIxb29vaHUxdGpYc0dBMExrUzIwdXh1UnpObkxZR0lHdmZDYTVOVmJNS3FFVzlubGRsUm5lU2xaTE90NkhtQlJTWXRvdkRQWGNZdnIyTWhMODE4eHQ1Y2FpZ3A3czJrUmRNSmo2bEVUbVp2SWpialVmTEdRak1hbGtVam9UM25BbS9JTjRPZTh3WTgwKytORmptN2RTUnVVUy9YV01ZWWV0NUxUdVpGNTRHTlRlWjVpNHFlTTE4NWJSN3dqSG5BYXZzMURSbUxYbVJPTkRscGtzOENQY25RWG1LVmtpamNnbHMxMmt1ZzNPSnI0R21DSGg1ZzJhSnVxdktMcldSaUtZSk5zaURxTk82cXRUemZkWlJUZnNjbDlGb1dOK3kwdGN2UVdtVzgrcXRSWmNVY2h1Q3ZtYzk1ZVd1UlRDb2hveGcwQXhLKzkxa2FTSjhjZ1llK0N3OUJQS3EwVUlZaXVHdnFZdzZCQmpSM0R1TzNlS2VaYzZQc3RPUlJ1Rk43d0xjYk5WdS8xa3dhMk9FcHczeXpKd254VnZydDVrM1kzRHZDblZuNTFZSjV4aWVpWk5MMG1OVzY5N3E0NzJ0QytUb2pRNEdDdmVGb3NQeWdDc1NxRW12SzlaS0NsK2l3Zk9WTGVPcC80cytxQlFBQSkgZm9ybWF0KCd3b2ZmMicpO1xcbiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2O1xcbn1cXG4vKiBvcGVuLXNhbnMtZ3JlZWstZXh0LTQwMC1ub3JtYWwqL1xcbkBmb250LWZhY2Uge1xcbiAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgZm9udC1kaXNwbGF5OiBzd2FwO1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIHNyYzogdXJsKGRhdGE6Zm9udC93b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBQTZBQUJJQUFBQUFHdVFBQUE0ZEFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR2pJYmdTNGNQQVpnUDFOVVFWUmVBRHdJZ1h3Sm54UVJFQXFDTElJb0N3b0FBVFlDSkFNUUJDQUZoSGdISUF5Rkh4dWVHU01Sd3NZQkNINS9lUVIvZGNBYmlpL2RRZ3d3bDNiZG9jOVkvS0ZpcXVvYmhDSHZWa1UzMWhCdVNuQ3RHSDF3TVc2RUpMUCs4M2pabi92eWtnRXJ6NEt6VlNxbDhpcmJac1dDTTEwNEszbTYzMEtJLzNidGs1SW0xaWdva1BCUURzaS9VV3Q3TTJqbU43c05rMzRSTVEyTkNnMi90MmJXUFlROUM2U0YwcXRsMlRrUFViY3BZSW9qZVFLU1lXQVp6c21ydlYyK2N1b2NsL1pkL3BJMEhUZGdQNTgvakVLVlBWYUZRdmd0SkRpSlVRZlAvMit1bXRaK2NCbGpKUTZoYVpiZjdZWVF6VUYrblBwSm4remtvbHVMajJWNEFJNnlFbHBDOHA2c3hFK0tmeFQ5S2Q5ZTltMjdZdzUwQkhUTmdSWXFLeXpBYkprYllzU280b0JOWnkvSk5Tdnc4TnZZT3ZBcmhvaXdIMkh0dTA0SGdjRUpZQ09OUnhnSWdsd01oRnUzbnBQVlF2NDJWbVJqTExHc29tNDhQTE1XK3pyZ21lZWIwdzVQeTV5WlBuZzZadlIxd1FNT0FJWUJCb0RBS3JnVHpzNzJQbzVRaTRXR3hCNUlHRWw2TDRJWkJCbDJFTElSakdMcWRlS2FlRHNrdU5WYUI4YU94bjdUK0RxZUxvSFlPRjVGUE1CV1M4bTEzalEzSGhtUGpFZDJSbDRGdkR2bnUyZ25SRUJNNDg4Qk9LeG5iTDlRWnJzaEwwYnhpU3RYWXlVOW1GQ2Y4UDVxMjM4WEFmUC9iQXRBSjd3ZnFSSnZCMWl5MUc3aTI0WnFuMlFVMk1MWmZTMUV3TUxYMGtjQS9jVXpUckZNaFdBTTFDYkFLQnF6WVlnb2NOcHAyWHRIZ20yUEF6aEdHU0tKSlgweHgzQ1FLQVRWazlxZFp2cyt2TzNESWZRbXBGRFl4TnNScm81NGxRUVlYNHY1VnQvMWYzajlmUTVEOVc4QVhIVFovbTN4ZWF2NWl2eWV2VTdZNFpMem5rU256UTVydDkwUlM1eTFMYmxZNjdEVE52c2U2eXhLRmRaWjRyRGpMcnNsU0hXZG5RNDVrUXFYQlBMRmVWY0RJcDJ2RGtvNjd5YjQ1UGlvUzV4eHhRMXJiSFV3dWVpbDIyREh1UFE1eTYyM3hUN1RPMS8zUFJaWllhTTlxY0ppdXZ5cjdYWFloZmF3c0VTMEl0UVkySEhoZ2xKejZPQ0IvUnZXcjF1N1p2VXFmZVdLNWN1V0xpbityNy84L05PUFAzei8zYmZmZlAzVmwxOTgvdG5OOWRYbGRESWVCZi9rOGFPSEYwTm5Id3p1OTN1ZDlyMjdkMjYzbW8xNnJmajR2V3hsdVpKRzN6dmpzK2xLcVpKRXEvOXlxeVZ6TlN3SiszWFFiUWkrWTNXcmEvTnpwYlZUck9IQnlOWDlZU0x6RHBsTGNaTDJNTDVlcWRYalZtZG9LWmNaZ2M3TitrYU5HMjVqdEdFR0pFZEFreGxYSGNiTi9kNHR0YmpOYW4xSkpzQll3aVNDRG4rUFZ4RUwzbHJMdjBiUmJSeGp6ckJtTzgzVW9sUFNRdCtmZ1ZucFM2VlVBMGtxeTVQUmZtejhnRXNVdGFHRitFdFhUKzBCRFlDbjlVcG84UytteitRaFl5SVk4S2h0SlFjOHN6SXY3bHAyRitVMldaTnpaZllucEorSWRiVVNTYW1MaGZUWkpQcjBQeHZhc2p5QjU5bUFmVTdxekprL2RiSElkQXRJckVRYVZsVVk1VmNtcmJUWGpaeWRUcFgrVHF4SGhuWG1QZU1TVHJERlpyaExFbHBzNEk0WURVVkNzQllmVTBpQ3Q4d3R2VDFjbUNQM0tYZUJFUUxqRlBoK2JLQzNVNnlpWWxZc2lwMDVXRXcvbGZITitxSjNFMkFoM0RMSVFUYm84ZGlkZDVMZW56a1NjeWNoa0ttWjBHa3FkTDJZdzNCVmo1bTJwQjF3RTdVbGw5NFRtMit4dzBIOW90S1FOS2ZnU2FxVlBOTFE4UGJkM1dkQU1BRjNlNmU0R0JTVDdvYnZXY291cjdSYm5UdC9nbmF5YjBDV3A0cGRySDVGZHZKWW5wMjFwTDR6dFBCcWZIcWNYYUEzc3UzUkZqZkQyZTZzUWFFeDVzSkhkekVZS3plczJuaEFIblBlWE8yaXJKQllJZU5BK2tFUWphUi9FTkg0SUQxTURpTnFDMnZ3eFBRVWlUaEZMRHRLamlJTDdGWmdsUDFmT2VlYzNyaVJlUjRSd2JmdGxicDBBVEtHNXdBV3B5cXlVcWUxZXlPdFZpaVBNRFRuMVVxckUvMDkwNzZ3RHVBS2tuQk9oK2NZeG1Gd3hybFdyTVhsd3NMNXVTTm11YnFmWTU0OUtYT24vREtiYjluSWdTYndIVEFJTU9NclB4eFN2MGwvYUNXOTg0UjdOdnBqbWFWeFVEUjJTa2JIek84OHIxYlNGWktiekora2RNOW9oMzdBK1BMcjlGS1NrZWRSeVNORC9QZ1dyd1JmMGxlVG5wdHhsUjdqSVduamZFS1Ntb1hXVUxKck5VMGMrdEZsd05oT1hXOWozRU5RaUxKZHl2ZU1iY1NLOHhIazU2clh1VGFGdXRLRGNVdjFQQ25DbFRUV0ZEYWNjWDI1Z0pzUmlXUzh5em5sUmRTZ3h2cWljVE1PSU1Ec2dtaUk1dmxrUjBvN01IVk1kcnh1UmR4UCtIQnNHZDh2d3dTY1d3MUNzK3E0YVpOMzVMMExFNmZWS1hSQmwyRXJvK092YWJjTHZ4Y1BMWVVnL1U5NDJCeEt1MkRuOW9hYmN0cG9tM1g4cWczMEVjRm9BbVlXa0pMQThwTnV3Q2h1TlFpYU1HemtjVFoyREljcHhLZk5SQ2dFeGdmQ0VnVTlwSExXTHVvSm5GSUg3aTVKbWN2OVV2TlNDSVJKYjZDeEpaVWlPekx5QWc1WkFzN3h3QnZXbEZGQjY5d0ZCYWt6VEVNNHR5ZnBDdElDRlViQkt4R2JKazR1d3BLS2lXMnowaHd6enliQTFLTEgxVm9KdXJKclFMSHRFSFhDS1RnZFd2QWE4MUJ1cnVIejRMMVdRZllRYUM1em5wdUdqMXhaZ0Z2R09CRHBYcjFqbTQ1dURZeFRpTUM1TFNQZCs5ck4yR2IxUWl2VFpJK2hnc3AzRzRLRll1YUVpSFR1Q3d2R0ZKT2VGNmtoME5zTkgxZ3RxVEw3ZlZuZ1BRdnZYRFdzaTBoRUZjUEtnQnBPMDF0M1hVS0lQb3dTMjJqSzFjcHRMSzJ0T3pLNmFiZWcxNEJtY1V1Wi9US29CbnBNaUcwS1R3OU9mZmpCSXF3TUp1Ujg0VVFlaU1aekM0MDdOeDIxQzZzMTYwVmxDam85RVBxTnpMZHg4SlRkUWZNa2dlQUtsQmFjRk5DOUJrUVRRTlRUM002RWdNMkJ0Sk0yK0RrcDZQRDJDTnlUSTZtTFVLTkhwVksydmlZM1hpZjg1SXhkYlZ0QVYrMUhxRk1nRXRITEUwZUdBWE03bjVwenc3MkdPRjYzbGhvNTlucEk0RS9HTEtQR2lZN1FSQWt3WUpTR2N1dEw1QWNnTEVVRlp4Tm9JOHlJS2JkaktlWmdkazF0YVlMemc1a0UzTnhKMHFIdEpSemppamk1Y2FDR2xGdCs5U1hFMklIZHFiYUtvOE1YQmpDdWduVVdOZko5MjZBOFdYOGpyQVk0eTlpL3QzRzhGallZcTlBMERtV1cvWDFOMHAyQmhaWTR0WnNPUWxaakpidG1DcFg5eHhRaVBhQ3dRRUR3NmlmL2ZoeHdTVjZEMDVDOTBobC93SUcxMFVYVWQrcmJ1ZFM4UTB6S29MREw2eTZ1d3NaT2FvTHo3UThqRGJSZHd1cGxnSHBIWG9EaWs2dk1SOFJHU3A0TlhKcHFSY0pTQ0hHTFMxYTczdGNiZTdpdVU2bmVMdzdIRW9tOGplSEFtMmhMT09NV05QNzgvOVJ6RDR3T2l2UTlRRm0zdndGMytvTjRhdHVFYUJPVzJpdlhMQmYzN1ovRVdQZ2ZkQW9zTkxYSzZqOVVTZFd1UHJsdHJuajVUOTdqemk4ZUd4TGRCTEJNaFoveHBpQ0JVampWMFM1SUNLWUpSZW45VFBaRzg2M3VUZktyOUlhV00wcjNrLzI3b3B3Zk4wcVd3TEJtYzhjQnoyWDJMNmN0eWp4cWFxVXZRdGxXcEM3eUV2Q0NSOVBhYk5sMmpBbUdhQVQ0bnBDQXAxWTAxalRwOWNCOE1NdFdHcSswL3AzV2ZYNHpib2JDTklHaWhEZi9vam1wbEhEa1g3VmRZUWc5dEhFSGVGY0dienNKdEpuQ1E5WDR3R3JLQ1JDcWhkTHVscVpQZzh6TnVRU0N2eUUvNmFYTTNvVjErczRQUHNvd0p0TnV2K2dYYlhzZWQ1cUM0MHBUOW5RQm9rSm82VHBVWlVMR1dIT0lzeDlkTDJXRzhCWXdwNUhKN1hsN0VBU1lZWVVESnNPQUMyQU9SMjQyY0dFWE00UmIyRVVCczh5WFljRXVXL0JTL2MxWFg3VnVmdjMxdDJuVk81L1l0bnowMXFMdlc2L0ptNy94RHExNTI3cjUxVGVYcXJlODBlVGpLaTN6eDNkcjlrYjl4MzhPK24veFZxditrcnA3K0wxTGF1akZ4LzlxUDNmNTMvYnpUNHlOWFBwd3o1aFI5M3p5MXZDN0RvNnVldkN6dTF0ZGIrKzVkUG5OUGZOY2Q4ZDhPLzV6K1oxZGJYYTNlOWplRDZMYU04NDR5KzRJeXltY1U5MHliYVc3MjlZeXZ5VWpzempaZXpRMThxZmJKNFlQckZURU9Bd0RVVDVBSmdqLzd6SU9Dd0NROGEzMHAvamNIWEZPd1JjdVduend5bDQ1SmZVMmdjbE9oanZyWDB5QU56MWRzY2ZhYklnS0NwSzRUa0N5SFAxc0pTZW5CYVh0M1Z0L0lBaUFnSkxEWGprN3paWC9tOWxtQmdDODllekRmd0R3M2tLTytlZm9mNjlFUjgwekFVaGdBQUFDWGwrTkxPY3BTSDhFRU1BN2MvNGNIcEp5c0x6UEIvSHoxSVA4NUJ5N2hHTWFFUXh1Sk9Nd3NQdGRheURJd29ucmhoRzNqT1ZYWVMwaEdGZVpzZTM3MXdySXhMTnJPUVlTV3lzaW1nYXZsZUNod2pWT3BOUFVNd2l3MDI2eGxtQ2w0emZoYVVZVVhkb1hPYmEwYitXNDNDZC9FS1c2OVZqTXA5VThMZnA0SUNORkRSNk1kOFNjMEtqbjVDNEo0OHdROWdNZW5RM2Qybnc3YXg2S3pUKzV4Yk0rbkJrZUZBZjN3SkNMNUsyWXB4V0ovS0daa2pCcm1FNHJudHpkRDNXWVl5NUlkdW5qbDZ4VDUvN0JyWTJvRFkvRksrZVpyK05VbnpRa0lVVlptWWRLalZ3Sk5May91SVZFY2ExdHZDWWtUK2pVTnR0YXk1dDQwbDIvRkpvSlBkamlONHR2MjlOU214UTRkRWhTNGFzbm8xR0ZPazNTMnlUY0JPeHM3bXdET25TYWtlUnFCMC9VTGJPTVpaTnFNUzRBWEpKeEZHUjhDYVdXN0M5V0Yyc0xzaHNUNW1jYjlHVmZTZkJuUG9jdkU4bmV6RVJQbGtGM1JxSXJiV3BDWjVyclNQZGtlN3Bza3hPdE94VHphQ2xlNUtyd01iY29aMDZKM0tSOG9qUmZOakl6ejhrWnVmTlpjZE95ckh5Y2xSNWxtYWkwdUl1RWtST1Rra3ZtMFJ4cnFTbmV3eURHN241VVpEOTA0OEtjN0lhSlRxRFREdmplS2UvNjdvNjN5OXV1YTdrNDBYUVZxaDFadDEzTlVsbFlMcmVlU0pTWmV6Z3pFNmM4UnkzdUdFWWVHYVZENDBPQkxtNWZrOFNlZk1tVjgzYmtTZGIwYTZkZGVnMUtxVVZNR0p4L2d1R254MDM1TVNtZU96RmtmYjhwSjdyRXZvRjFXOUI4OERDUklOZXowaU1GN2JMdzlubEJWVGZtYS9hNW4rOGl1c3ljb2tiaS8vcDlTTjFUVW9OUzNXcXc1dFljc2wwVlphN2FOYTY1K0VyK0F4ZGNobE8xeVZiVkpFc3FUWU02TmFzbWFTOUlQMGdNMm9lVmJ2Z0IzQTJ5eUdaVmtKbHExcGptWWl2WkQweHdRMUFVa2U2a25ZSHgzdG83VGNiWVZzQXllbEtBTmdhR2pBdlF4b0F5Wm1KQTJoaUFlaWMxOXhOdDE5WnQyNGE0a3RyQXpuSE5Od1VncmtUclo2eDBUSE0vRjdackpYNTQ0ZlY2L1g1NHB4NWVvSzJwZGxOU0RJcVYyc01NdmFVQURjaW8rOWMrMW9PcnovWENSQUlBQUE9PSkgZm9ybWF0KCd3b2ZmMicpO1xcbiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7XFxufVxcbi8qIG9wZW4tc2Fucy1ncmVlay00MDAtbm9ybWFsKi9cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGZvbnQtZGlzcGxheTogc3dhcDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBzcmM6IHVybChkYXRhOmZvbnQvd29mZjI7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R01nQUJBQUFBQUNMMEFCSUFBQUFBUGZBQUFDS05BQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdsZ2JoUmdjZ1JvR1lEOVRWRUZVWGdCY0NJRjhDWjhVRVJBS3ZuUzJWQXVCU0FBQk5nSWtBNE1NQkNBRmhIZ0hJQXlGSHh2VU55VmpXMGE4MndFa0pmcXZYaFJsUy9QNDRQOC9IOGd4Umd3N2hwclZmeEJFdVZzdGM1Sk1LZkd5OXQ3ZGkxaGFKUVVrSkZWM09mRXAwOUtwRVNmc0tKbGhaeVJlUWQ0emFqNVRWcVVFcmRQaFZ6LzVKUzMwNEJ0RmN2WUs5RkNVMW5pbG4xVHlYT0RrQ1BHZ01OSm9rL2NGT0wyMUJIMlI5bWN6OUZjcnlrWHV2Wm1CR1liQlh6QzRFMHFQME9RVXJmWjlUcXZmK3lEcFc1WVZRQThvNVNRRFFDcDdDSUpiVVlBOFFLQUY4aUtja0p4Qno1Nkp6bmc0cCs0TDhrTmR2VzlHc2l4YnRuZjVDTEg2RkNDZUFDQlZxUUNvekEzQXR0R2o0UUxPZ2I4cHprSzRJQ09vVElxR2V5QzRvRGlBaXVBK3ptT3paN05yeGZQUEg5SE8vVytac1prV0R6R0xzd0FEU2JBOGl5UXRnbkQ5dnFYTGx3d0hUNGFEdWcwQWR1UzFHbnZTZVNjZDB5Y29rYm9BSGk3ZFpmMGE5eXYvVGZPZE82d2xMRkpnVlZzd0Jod1NZOUdGaE9Zc29mM3FicnNvRXpzQU1tUmJiSmNLMWFTUlNPWXZHUkh6eS8xeU0rZXloMWdtalpZb1NRbkdWOUt6dG1oRU9YOXpJSy81RlcwQlFtQ2JDbGYzRC9zWVk2a0c0VkFvOFBoYTFmakdOMmpENnFhekE0UkJxUGNDN1RiT2V3bCthZForQm1mbk1FNllWbldvWGVKemJtWWRabDBkcmNGSjZ5aUN6TWRRVFpZOEVRMGgzOFNIU1hNSzcyY2N1N21DRytOQm1sY0RuMitaR2EzdWtxeFNmRHZPY1d5ME5rQWhNeHRnRTlMMWEycTZxNnBuVmRPajNkYzlyVEF6V2xuSllVWWhiOGlPR1FVVUh3OXBKR2RwSGVPRlRIM29qcG5kc2lQb0FNRUI0QVBzSHZ2bVcraldjRXJKNHYvRk5MYitHeERySlM2Q3NGUUl4bysrOHpmNmlmcHJrU0x5RUJFWGZiaHNKZ2lNQkpoYXl5MzJrVWNCQ3NYck9LRVVaVk9tQXMyWlZneG5SckdkMmlFN2xDakFtd0krQ1ozUWtoS3dWQ2JZZkpGYTNMeXpCMEh4MHVtajA0a0hUdTg3Y3VMQmZlT25Uenc2ZHZiNEhHZ0F1SXNRUkFTYklqcWpoVElFbTBUSWw2RkpiTEtYTW95L2x3WlZORVduSlhuY3FSa24za2F1VHM2R0R5cjR6Qk9lOWJJM3ZlVUR0dkdtaXE4ZG9LdWY4ZDRsTjl6MTJFdHU5YTkrQjBDRy9vZ21pZkpmWnltcEpvMmtuZlNTWVRKSjVtbVYxdEhtSkxRdDdVeDcwdjRrZEJTZFFLZWxQazJScFR1REdjOU1sckluaDNJaTUzSWx0M0kvVC9NNkgwWGx4Uk5JWFRuU1E2bTRlNTVJYkI2emZIcmhtVjVCRDZDSDBFMzBIM3FQdTIrbnVzYW9EVHJrVm5meXorWVVRSmZvZ0x1dVUvVzZ0U2Z4bEQyWE9Vb2ZRc3ZkUzB2RXdCenFuVGtxcThsbEM4dkcwVGJ0cVlzMStuVWhjbUlqczZPdU13eE5PWEFiTy9rWTBzRXIvWTd1YTY0bDNIMUs5QnNJRHhNVndCd0s2T2R1OTRuS005bE9WVGlhdlU4RUVlN3JMd0JUQlVTRytFUkxQSEZycDl1VHpxYXo2ZXkyK1hsc0NjOTFkR3lGdjQzb2JXemNITG1jd1B1ZktCNkZCOU5hWUF2QW9Ga0xodXJZMzE4Q2paMk5HRE9Pb0ZHTFFjeGdjMUpmbkNZS1VBUDhmUUM4U1FaTW44R0ZMNEZkTy9ZNzJ2SjJ6eFo2cVhoMTQxSDRieHpzLzA4RDBJMEF5RlgxQkNDQTlpeGpvVXd0OFhubWdvL2NlL1lnRVhEaHc4R3pCTkQvR1N0UnBlZjlXZFJIY1RFcWg5MEJZcHhKMDBYVlBFZDMyRlFCUXlOaDM0b2hNcU94YXJ6bzF6WktXR2pFQUM3Z0Q1TGRZbjNpenhaaENKZVBWQk14RWFFR2dxMkRMZG5YVW5OQ2E3NVlvMEhndnRadnllci9jUC9wQ3NvdGZnUGdLemtaeVl5cVVwTzVNVmNmc1FubE4zTktwbnFkMG9sMFlSc21ETUlqT2cycTl4NWZTYlpPaXAwbmVza3RhdUczOFNZZCtrS1RFK1owM1JmUU9NQldwUldrYW5Idy94S3VmdjhoazJaVmE5UWVoRk1xMUJMck1vS3JSZ01wYmVNWjc1VW9JeUFKR2t1RkNHNmt2Nld4UFlLbk1jdGZUKzdGbUJiVzBkNG1xNjNoODZxcktpdkt5N2ljVWphcnBMZ0k0SDN1Nnp6MmJWM21hUno2cm0zcXFpenlMRTNpaURPS0VBYSs1enEyWlJxNnBpb0VKcmU0ZEhGdW5sSk5nWStXbCthMXNtVGFWWEM1VGN1aERZdjVYYkRIRWNLUjJNRll5bU5qclRkc0VVSlNMbStLQ3kxeUJENmtzbkFFcmVxdEJoTWVqR3FoVWtjQlYyNDNwZnBpdmVzaWtoS0RQUkpzZG1QM2tXN3hFZDI2RzZEYmVGNlZDZWpRMHQ0RWdUNGNta1FySDZ6OEs4SWU1eG5qamkzTE1ySW8yWkU3VHNQUjlTaDN0Wnc2WUZQalp6TjZ5L3dWTndRVzFZSWdySHczTkF3RytJeEpnMlg4aWZhbEFvSTVFVFE4RzRxMmdONXM2Sm14OE5vZm95MXN5ZnNtT1d6US9ZYll0bHVKbzN6SzVUODdVNWcvMFYxTDQyY0lmdmJJYjQ2NUVBNTl3bS8xZUNvSmFPZ3lFRmJkNEN6c29CMWRybDJKc3BWd2g4WkdNZ1FhTGxZSW45UW05eG1oaFVQZm9Odk9IUTYzU0JyeTRzZ1dPNHlsV21jNnR1dFB1dzhtbE9jY0ZrMWdoOVlMalFydDBBbGRUbk4yZ2xqcVptdjZGUUVPNFpaTGFaSkpUTHNxRllvbklxVnNSV09oNjgySnNVVmo4ZEhCMkYxaEVLRmNBbTdYRzhueTN2NitXeTdTbEgyV0piaFRIMkl2MFc2VmlaZU82OXVqTVJpUlVDMTR3K3RFS0tvMWhCT1JxUVpqUGJiKytCMW9zczlJd2t2RFB0WGUwcE5sOG91amdSWkdkY3VKejVscDdGeDdjRnA3cUxpWWk4MjZDSUxlbkt0Z3JUSWtXUFdrZUg1Q0xSZ1A4ZFVFRlpWdWJnNGRvVVg5ODJ1bmJZbXl0bnczMjAyVWFMZHNwc3REcEthSEFzZnVaWHV1SmxZL0tHVC9MMXh5U2ZjK2FwRm5SQWlIOHNHc2ZFUXdSOGdSY25wb2tvenkxdnA3ZWJ0RlpjSnVkOXh1RFVZcGZPbUdyMFVoZENacGFTTk5uR21QOHpqTU9yYUdyZkk4TlhkODdDV0RzdHB5NkZmQnlVb3YxQ29XeHpaeHBJVmo4UWdTQXJwNUZkVzFiUDIwRm5YL1RPeEUxaHZzNnhqTm82RzVOeHJOTTE4NWJyZHlUTExibmIybEpOSjg5aFBtcThQTUpzaG1nV2VNSjBjUTVqdjlBTlRLdlFlTXVHOVdrSlRHZFR1WEN5ZVdRWVFWd21PeHRQQzE4MkxSSVV2UGZXa0tTRFlZR1ZSL2k5cEt2UEh6azJqNUFHbzdxS3ZsV1FHU3B3SkZJZ083V0J3Mk9Pb2Q3MW9SOFRocFVQQW1Qd2dsVG9kMGxGcVU0Mks4cExSdVFTNDQvWGNsbVJucklWVUZiVHl2Y2Q2MytFUWNkNnJYWUFMdHhZSUphekhpRGdxZVFsREp4bG96TzZwTXExaGx1SDdEWVZ6bFlTM1JKMUc3M3hFaE9rdFZXSHZaaUpkc1dXd1puMS9zRUZ6NG9EN1FMVUJXU3prdDAwVlIxZFlpZ2hLMGVrZk1TMDQ2amtzRXdXNFFaT2pnOWxDekJLMWpwbVRyRGJ3anAwaGdyZUZvL09IVEZ6VVhDVVBCUWJHbTFScHNhTjhmREJXWjJjNVA1T2xzcWFDS1NtNmpZWkVNM1FQV2IrWGNFOHhCNkJINExzSXhsNGJPdDIza1FOOEo5MVNIcmJrRWRBazZlSTBGaVFwT0tRa1A2eVlrSWFadGZUS3lZQkVFbisyRk9Ba2phN1FNRTNnUEMvSmQ5MVNFWmtNK0Q2QTk1dHE4M3pRbGpSdU5VNWM0eExiSFhZNkdkUkZBaEpYWERScWN6OGtTRVo0S0JCMU1Ga2pBVllXd21rcVdzYlV6Q0lSTXZFTVVHZFdaSmptRWxSb0ZCcEgzYmhqYklDU0ZDYU1EQXNmclhkc3BnWUNQdXluVEMyVVB0akZRV3g1Q1JJWjJCMVVBUDR0cGt4ektvQmprRElFQndZL1RLYzhmMlVjT2hndnB3cm1iUENHYW4xT2FqNzdyV1BSYXJHVjczb2dPejR5RWJxZkZHTU1mMlEzN3R3Um5kcUs4NHF5Q1FrdFFud0c1YnY1UXlRZ0VGbHpiOGlYOG15T3FjdXNUcWFjbWpxMHloVXVwcnJoNnBWUmszQmNXWDdBYmh3S3NOTnNXSkVVN0hmWlluNytpcHZYSTJld1pYenVlRWw0b3JSRUJ6anppRHY2U0xWWkd0UTNhbENocUdhME5CT0JkWDVCK0ZFcTJVV0tiRks0ZElHNmxSNkFMYitIcFFxVjl5TWZ3bEFYVnA0QTQyNUdXcnJoeUdycDJVaE5YYTNyakRSZzJZRkY0SzNJVVhQVkU2SERCMkJ0aWlxWVNVQ0ZWdmlLWERhcUltTDgxenRlT1JiUXh3cGpUSnZudnY1REtKUU1Rbi93cythUVcwYVNBeW9PdWxpbzhkUVZ5SjRvWDRnTGY4L2IzelJBSGNDOWN2YXdVWC9CN1dUT29ObEhkYUNwbnNtYzlqS2lBWURPdlZWMkd4VnRkYmV3dTIxMUZlRkJMcWE4RFFKTi9BQzM3SnZOSkVTbmp0Y0ExMTI1cHllNEY3dlRDcHJuYXk5M3V2VXFDS1kvRmhERlMvajVHUmI5MkttSFdVeWkrLzMvM1BJZ2tRYTU2RUlqTndYdXc3ejl0YnVlOGpsYVIvYTBIOTk1bHB2SWRHVXYrQjg4T2xaWHNVcHNVd3FwbzlhMG4zRGU4K3ZzdXE0ZGVDMkp6b284UjBua3VHZzIwSklnVTRtZHgyU1ZhR2hOMVhNdjlPQlBjZzJndy9pNzU3U2ExY0VINWRyWnRmcXlSUDIvVUNVRWk0dElORDNvM3lTdURlMHQ4RWRTZFpjTlVBeXJXTE40ODdRYm9nMGZUTEVVTWIzblRBTFNFT2NNZmZWb1NSeFJMcm5CcHh3UlNQNWtGbDBCZEF2OEhyWWY5K2h3K1RYcVdncVlORHZJbm01T0dCc1A4MmNvTmpJRGVpTjBDV3NPdWgxNUxBZEc1bjZwS0owSUlMa0prSWI0NXVWODhMa2VtM3BFWnhQMEZXcVpQazB3cXR2YmJIaVFYQkdXTHZucjlpZytnOWlLNkVXSXFHU3N6dkJMSU9jUWw2VU9qRG1vL1d6YnBpa3o3bEg2QlRqeHVGNDY1a3ZXQm9HQVJJb2EvZGhFRDZ5aGkzeHA3QVBUSloyWUcydWs4c21HYlB1M1BMZmNIRFlUM1JYdG90ZFpCVkZKQ2x5NXBnSHRTQWZmQXBBM2ZUbDRPVkFCZlNCSjc2UEZGaE8xUDVEb3U1NFpScEZPbE9jWnhhS01nbkQyK1VwMkZFYW9ZNC9UTnBuVCsrZHBjN1FiVnM2aTVsbkljZHkxazVQdVpEVDdYWmRpQ2NWSHFvS1czZndxcVZUMHQzSjlYdE9kbVM0cWhDK1c2b2c2b21LbXVMVWwxQjc3Y29lSHloMkw0UTdxaHNBZEJJSzIwVnJrMFBJL2l3ZmV1KzZoVDVNUVVlYkhDcjBtb2VIVWxvbUthV0dpaHIzTm5OeTV6OVJTN2pFamJBMStNY200NHN4ZUpvdTF3YkUraXlybWNoZmZ2ZTBoYjVhWEw5dE42eUxxSXJUdHFLWFdCSnB6a2owWjQwRUY0RmpqMlcwdEJBMjRpYUpxcENVeFB5ZVMwVEN4T1MrTEJUNlhwSzQyNGpxU3VLbUNHQ0hOZ2pGeUs0UGcxUm41bksxZUtILzNhcjl0cHFLQU5YM1hFeTlqY2pZamo5SXBBbjlqWGtVbU10VGlvaXBPaExzL1hrK1BLKzBaTmVvVjI0RmVWWHVSb0VheHR2UzJxbjZyeWU0SldBVVhtT3FhR0dqbU1wKzhrUFc4b3ppWHlJMk9USEsvc0pya1lLbHhIeWpIMTVvcG8weWcyTXFNNFBYVmVOeXA2TWpJNVljMHhLZDE4Q28yU0Q0QnZrMU1OamgxSjBYTzcwZExkV0lLVHdOU0JPNWRkY2ZoS1pla0hYQzNrYWhSeENLUzNvcGxVS0VwdCtpNXBhQ2RkUFBjN00wWEdsZ3BiR3RuM3BPekFFMmRQdG0zSlN2V3NrOFVMZU5ocVJGVUNnVDNWZytZT3hyalJSUlNvRDB5SmtFU2hqSFBNcGRMN3RzVU4yZWVtei9hcnBXblphK0Z5NzQxZUVYM29zcURQZGV6V0dQYWV3R2NranY3dUFXMXozRWE3cTU3S0pzTWh2c2dQcmNRbVZhK2NvM2tjMDNWNEIwUnNxWTFxUmp3SUpOTWdyZkxENFVmQW04MVlKOEZyRzlseUdqMTBLT0lvZmt5VXFxNS9sRTU4cjVXaGJTNU0yUXp4ZWZ2VzBNODJabmY2a2NZeFdlamFFNHFydUw1TVRGU2w5MlZLMXJvckhTVlpOQS9SSFQzaFhCclVTVW5CY2R3aUtpTnJmc3IyRnFPQk9aR1d3L2xCQ1dWd2U1UGdaVS9rdHJ5TjNhTlNxQjYyV1RjRmlDOUtGa0I0c3JXVy93VzUvYW9WVVVuM0M5aWxXN3NjVW5Ca0JkTDc0RWtvOEhJejZRZmNQcnRpUkFEUFJGWU1qVHowUjJ0VXhyOEZPY3dJZitqQXRlcUZCMEd5NVpIVDlUcW5aYUx6TFQvWnRxTk9Odk1VMnpVQjdjbzlxL0xwSGtaT0dQS1ZTaDl3aE82bk40MTdlMVRjaUZ3SDNSOURyamlmeGJUZjV6QXVoTTMrZS8zckNsekJqQnM1NU5zK1hOK0lSMXdDay9tZyt2UExXekJKUlJLTDkzY29tbjIvQTJ2VUJXc1QzZVh3eFdFWGQrS1RLOEZCZ2VZRTNHNXExMFlHRkV2OSs2a2h2VWNua3pmT25vTDFKVnY2NnZINXpnaVgrUlhrb1J5TS93bDhOS1JNVkREQzJSV0pRQ0dSZnE3T3dYN0sxRnNYd3hZdVRwa2UzOWRoeXQ4bjJ5ay9GNjBYclUrcWI5ZkNRa09LcDgvcGcvaUtYazN3MEhGaVFFMHBLVTVkbWU1Sk1IaHhkaTFuOXhOYTl3L2xvV0NkZ3kxY0ZuY204K0JhcnFuVDBZSDJLank2Y05CUEFQdnVBRkFLQnhsdmxkNUtOK1RwUmg4Q3lPY0JTUzQyeXJNQjJYTGRVd3NENWpMUTg5T3FKN29hdklGdnNlb1pVRnlCQ0pSZk80bGs2WVViTGFzQ1YyNHFGUFhvN2w1bzhackIxME5iREpNTy9iYSswL2g0NElhcVRRV3pnVEFveUFEL0ViQnByNTBEd3Jkd1pHTW9Pdkl6UGVvOGZHcUw1cWFLamEwQm1IN3QrQ1AzSm9pUThSTy8wa2ZrYSttakozSFFpWWVTYUx1OVQxYXRkcmRqMFllZTdVbFZ1eTJaa04rU01OWDI2TC8xK3lPLzA1d0dVamRMVnVodnZIdUI2ak5hVzNZWDNiL2czL1hmVW1iVE1VSmY0eDV2YWsxT3kyNlJkdDBrNEN6OG5DeFFkZ2JjZnJpK3VxbDYrZm12WTN2M1o2Q3lVRXRIZCtuNTNPTGRYVEhLTDk4bWR6U3FydDJqamZ4UjRlelcrN1A5WklWelNLKzFMbXE5UlMzeWFuWHpub2lpTEVVRXJ4bDl0WGFKdGZhWTF5Tjd5T2VzdWNFWGVjakR6YW41ZVMycHlNTzhhdVNCWm1iQlpPOGpkWEJ5bm91dmhXV2tpM09BcFlWVHVkTnlrN2tGOWI4QjFzTGNTVFZrS1JwZHE5dW1CS1ZHY0t5aVkwcmN1VURMRFNnaUw4T01BczY1alI3amx3c3FPVUtLejBKbG9IR0FHYnIzeVNIR2lleWZvbEx1SEhyT0NMZTVOMm9qNG9TVjhJbytuTGVxZjkyQXJzTUVKOFV1YXMxc3EwT0tkVlNkbnk5QkVINXBvVm1ZYU8xZkpxbXdMTkc3UnhiMkxzNXdDd3U0czR2OUU3TTJzWmtWZ0Z0TFJWdmQvN3FpdlFGdzF1anUvVXRiMVlhb01PUmpkNUpUREF1akRJaHdEVk80dDJtdVllck1BZjBVZUthVkJzTktGNGwzYnMxdjllMG5QTExmdGE3ZEpvVXhWTEVJQlM5SG1PZkNVaTcwR3FhWTU0UkRucXdzd2I4cHdNR3lSektQeEFYcEc2bnJsU3laV1BZU09vSEJPRzJIZi9nL1crcm94bGZaOSt5RVo5djFZRlFTSU9lRzhadlVjT2s2VEx2TTB0UDk3TktMRFJyaTRrOGRLZjVIeGQwZmFYUHJINDAvV2xyL0tVSFk0M000S1R2d1NFdnJoNWlwOVVzaEl4dE9KSkptUzhwMktFNGxkVzVVZnRqQm9XL2pTU1oxaGNNaXpaellZVXg3cG5pVTVYTlkxUEtCc0xoL2RQL2llMktEeFB0UStoUDVBeDUxNmppaEM3QWEzZGtMK0grUG42eDhESFArdG0za0ZpZjF4WUFJOWJIclFsbWNJRXhXSEJ2Y2NwajRyL3RNajVYTjROV2J0djFkbG1kN0NQK2I3N2lnSWxtWW9DSzI2eUxxYytOZytvdmJwVEFReUJoanZOM244dXRqL1hjSjFhL1UzMXpza3Q2N2RxWGxlbFhkdVcvNk90QnZGdmZZZ3lSWElxaHdPcDdPZTZjbEJQV0Z6NkswemRWUkVyWVVNYVlWUVF2WFpLaDhJR09xSEMydGQ4SUVsMktLcGlvbFBUT3RPc0JseUw2VHV4dUtqdHhMN2lrY3Nnd3hNUnNEbkhNZjVGeTh3NmlySjRuOUNKTEtQTFJsajJQcTR1aEFhd2E1Y1NBNEowc1lQOURXVVZYUlYya2RzSVRXRGJHRTRlMzJheTl1WC9MUm0zSFlaeGl0ZncweC9Ta215TGJVSkljQjNCSGtXN0szUHFKQnJSUmFndU5CMFZiYnF5SnRKN3lZQ1JTU241czdsb1ZuZUxDQ3BpVHhDdFlBNS83ai9NNldoMm5sNTVxck1vOGRxZVdhUmRubDdmQXJqR2k4MkxTc2lJVXUwWW9uNjJtUjRtYk16dlJXZkdSL3ZrZzBiM0MrWE5DUzFtaUxKQVdGUk9ENTVzU2NLZGRnbU9UQnJCWG54YjBsQVZ0VXd0QlhwbVl6MlFtMHRJcTlRU1VGWXhaWU0xOWVrSkhJa2xaZWpzZFM1ZGdXR0FMUVQ0N29jZzRZVWZhaW04U2J3VjNTck5NMXE3VG0wc2lLbWpiNjM0bkhEMWJMOCtmaTFuTTVTTlYvNWw2ZS82Zk5lMlMvbjFRUXplMzJ6ZFppZ3N2OUVHUjkyeVJLMVN5ZVBDZFVERS9XbGRaV2xUVEZCeXhVKzQyaWEzUjZsS3pUby9oVytpRVM0QnFEc2JwMy92ZjdBZFlhSS9IbW51ay9YM2FNdnFvUGR6bHRkaEpzdEplNktpZTM5c3NNbFBScWxQUTZESFFoeDlCYm1MdVRpYlpVMWJiS2ZhbnFybkYxaU1pVzZxMnE3dFJXVDg5KzQ3aW9oQmd6WmtndFJQWlVKN2tVU1dpMnl0V1NmTHQrMFVOYnphS0ZjOTBtV2RzSkNYUFpIanB3YXRFQXA0K0hoc2R2MFFqeTdJQ0ZiOWt4RFQzMXFtaXJEZHVpa0E4c3V5NkIrV1BQREs5R0ZSekFqWTB1UUxOSFU3QmRQR2FrMXRhUWFzWjI5MnhNSXI2c0lSS25OUmkxa2NLT3dmVUhLejNKY291NktGd0pMck03ZDlkb3hXVFpEQzVPVEUyTnlleHp6OVJLZ1pZR2VKQVFwUEJ1dTRCZWtBY05GbThPZzJmWVpJS3J0UmFTNDBiTXQzOHNNTGo3blBjaldNMHhJNmVpL1BMZC9jUDdINFJML1ZFTnE4ZEM0dzJSajgxMzUvKzlXU2tqOVRoTktZV0l4bGpiY2VQZEJWOXVzYVRDcTVXRmEvYys5OGd1WFNBc2RMdkdETGV1WHIvUmRNM1E4aXNsdWhOZTYxclA0QmlGckF3K3U4MUdpRHVqaFVZcFVFNkFCOG1iSE5HM3IzZXJCODA0M2dMdW5HNlREbzVSbDRSa0ZIclBjYzlWYjM1VERrRmUvaVhMZS9kUU1OcjJnTXY2TkhOV3RLWmNXUG5RQU1Uc1RuamcrcEZYRkx6Y3pDeVk3cmt4RVdjNUVDSE1DTDV4OFpTMjEwYjBNMU9ackhSR3ZEME45Sk43Tmgzc1RlL3lvclR3eXkwanBmN2EyZUQ1VTN6Y3k5YllVZnl5NUd6LzJPRDczMEw0RXlQV0dBUnIwS1k2bk9TenpsNGQ0b1l2SjBjd3FQZWJaZlNWWVhJU01Mc3lkcUNWTTFkRCt6eDRWTHJ1RjA4S1hCMWM3UVMrSzZuNWNXeXNVUE9tWmxCc2FtVnVKbkF5aFhHc3VjcHJNWmxxdkhWalJ4anQ0WjFpRUNGbCs5SG54Ly9mNzhTT3VKOU9ldGMwSzRtZDFxUnMvOUFTR0tHam1kbTNZUEFFTlhmQ0FCTVU0d28ydjE2TjJtM2lMdE1FcURhMjB2ek9IVWNrUXVOM3NQb1JXQTNzbytCaXkvbzFiai93enVDZG5rMGZDdmpmVDhLSHpUb1RsMGZ4eVpzQjAyRk1jRU5iVTkwWGRIZW5EeEIveWhzcThocnA4RGdsb3pnUlBZY3pKU0IvSDAzWDIrMCtiMDJiOEJmN2JCdzZXM29oRFVsRzJyQXhpRDRFeWI2RTdPOGZ5cVJzVTlRTStXd01lTTcwSi9lL29GYVVjZFlraHR1T3ZhUFJJRzdnUWJXTkJnSTFhazVmekJhbUNyMklTV1lWS0MvVnJIUml6b2xvckF2L2FWb0lwMm03SldDWldFZVZOSzlnUFRXWm44c1pGUkRBRjNSMG9IL1d1K1kwSEdJUlF3V2RtSHdCTlphQ3d6SzVMOUFIMW9HT3JwMGdGK1I2TzNpZU44R0d6WVNPQmRaM3ova0VSaGk3R2E3ODRDOThWaldzTmd0Z1JiYkc3b3U5WU1hQVR6c2FmcW5kbzg4OGhtNzRaUkxsTXFJL1R1eU91U2JQcU1nVjBlRnhXNHpqUlBUc1BTZmVmaUxDNVY0alpoR1FzT2FBNElvR01CemxPV2dpSng1bGQyUWtNZHFMVHcyY0lqbVZ4UHI3cHhkM0h5THFqVHNPMklPUXZ5QUo5dDRKaHBGM3RFcnZLWXp5cGNiTHBqZ1hNdFpjWTVPMDdIWW95Q0thSG94dWRpeFloUmh0b040emF3V3ZKWm1RUE9JOXdGdGVsNTk1YkFSeVYwenEvbHRSa0lKNVhDSkpEYmcvSThTakcxTkUxWHZleFBjNnZwVXJqOWhCbGdhNG5MTGx3cFcvUmZaV2k3TVNNVG02Y05pN3ZKZERRSnVCQVZqSS93KytFdDRDQXNUUm1BR05XMzMyMzNkdVg1NTNmWU03bjlhT2NBdm9oZ2tOZFExdnJyeE9wSHpqUTBCNWVlSC9aV0FEVmxSUlRWUFVvNGI2MU5LQWh0VFJpQ1pPbkRhREtSclAvSCtKc3JrbDZVemVPdE0xZzN3T0QrY3Q5OGVXUlRmdkxPUGVtTmxVc3dtSUNya2FreXN6V1VYU2lNaksyeTlTbEdteGFMb2pYOXV5eVowYWJsbFN3a3RwWmthUnpROERpTFV2ZHliWGdxWS8zanY2VENvMkdsY1VsVTdyeE9RZjh1cmRxTHZVaXgxY05uTGZyb2J2UEVCK1plbFJ5Nno5Mkg0a3U1UzNodmVjN3dIa2M2UGdkdkdmMm0yM0xQV3BTdW9pNlpMZmRlbDkyOVhNOUd2MzdleWI4K0xzcWFySjJjeUJjN1NqVzY3YXpoUDJuTTlwODlQM2JaL2NYRVR0MVhqV2wvOGhQYWMvNnNtSnZGdnBiUDFZNVp3MjhsVk1MUWppRXp2azlza3J2R3V1Y0JaK1hqaVRNMnoyQ3hxL1kyR1hqL1JkMXNrTnQ2RGtCSE1XNy9adjZWaGxLU3VQeFZMV0cxdW05MXRET2RDeVVTYXd1VXdwcUtwMkpBczhGZzhJWHNYcm1HdUNnT0llZEJuU2h4NGNXVllwejVucmttZlBSTkpBYW83NVpUekZOdEZlUEphd01qL21vZ0xScGlBOHBRMkowL3Q5UTRxaklPZnZIaFU0OXl1K3VwR1NlaEd3d0gvSlZCQzRKR0pKK1E0eXgxZTZTNlkyN2x5VVBXYzFoWmZWVmRjb2hBSi9VSmxuTC9XMTlsallXblZBdWMrNkx4MzVVbi9PKy9JV3B4aGFzQUE5UzR5OWphdlN3R2xWS2gwbkZFb3RtQmtxT05MYjZQOUJUOGVVRVg3V01TTDgwS1BncEN3NUtRQXNXTng4eDlqRUtkVWEvWk1XbEwzYUpYK2dORDZFYm5QRjFKTVFldkJkc0JRTmZkSk5BV0FxT3RVbVNLY1RCcEMrMGpJTjZ4MFVjMUNIVEpyZE5QbzVzNXkwRXNmUHlhbk8weG8yVURzSVBvaS9ySFdkTy93eVpOVXc1M3hmSSttM3hIRTZnWlR4TVlMMzk4YjE5ZndCb2JKS01zbDVZVjBZK2NGK2NRa05nZHk4ZldsUldFRmdxNnFZeFE1S1ZHSm8rTjRaZVNHQlVtM3JPQmVhRXJNb1JEWFVKYXdWZjczQUhhL1JyaDZ2Y3JzQjlhemJIZ25IcG9rMWVkWTNDd0VoSGIvVmR2SjRnNVNPZmNzdXJhdlZEdUE1eXpKR2J2OXNkWTdmTmw4c0lKK1JhdDN2eDA2YWdIcU05N3RmbnFLM01CblBsUGhHZENvOE1KR1pJNHlxeC91NWhhNTZYeXpnZUh4SWlWeXRLR2NtclMwbTQrdmU3VlFlUWFHdW0yWVNxQXFRUWsrK20yVXlsdmllcUpUVXdGYjR6ZXNoU1ArU1VrUmU4RWs4N1VvYmZ5WldDeDBMVGJ3WnpaQldIaGYxaFZSTUFyT2JoMlBHTjhpVUFSZW1aZENUcXNOVTYzNS9WNFp4SmtYTXdEd1d2VnZuUDlJUE1nVkxKMmlKRndvc2R6aE05VDVXUkZ2U1phNVYzblM3M09uSlZmWUtVNDQ2MGdVN3JIQjdTZXhTRlZmcndFajlSMlFNKzh3OHpXWEZkWFFjZjZWQzZqYUE0eHVWc2RnbDFTRDNoWUJwcmdHeHgrRUJOYXNPODNudFZBcU5pakVaQUN6amd1Y0owaWV2RUl3ZFd5b0dWYTdGMDdLTXBIMEJTazRQMzRDdFpzTmgzRnRaNHJxMitYT2dPbmJBRzlyVUF0bmVlcG8waWRXOHA2Lzd3dlQwSXlPWkFGdjNGV1gxdDdwV3FkNVFMQlRzd1NGWkRsMitLMnNCQ3dycndlVEhndFFZYy9KOHZYMEhWTG1pMHV5STc2cnM1L2IwbjlRd202VzBVa25aZEN4Sko0MmoxSmY1WGdLbDJ6cWR0cjM1bWNtVVc1eFRHR3hieVd5dHJXT0RRcUUxMU5TZ1V3WE1OZlQ2NDNvU1BoTVFBSUg1Tjc5NzUvVE01RDl3cTBYdzZLemZ2eC81NFFmOC9WSHYvM3orZDlYcGZrd0VvTUVBQUFMK2hTNDZkMERFRGM2ZThrbUsvYjdEUncrdUdEVkFkY0JiblhkbTg1d2RIOVdhUGJpdzNaeTFYbkI4Zi9TQm5ZSnFlU090andia1pYWjdxK1gxcmZIZ2YvbldicnlwOXdDandITkYvaGowOG0vckNqdFAyWXJaek82eXZQdjVyTnpyMWNTNjFvUGFPaUFiUFZDYjd6TFNWd0g2UUhRQllmT3A2SlVLYk8zR3FhWjN4cUdPNzJCMndZbWRnZlZuc3U5bitWcGVmU0syZnpCN1ZuelVqd3g1ZGpTL3BMVWgwTy9Md1d4OVZvQU85eDZuY0Z4WGlrNitYdU1ZQVJEdkZsejNLak1FWmZKRHczVTNOdlZiZWZVMlNEYWJmZXYyZHNuSFZjS3Q2d3lIbmlmdkt4OVJhSGlmcVg4RjBtZUNmazY5cXI4OEh6MTR0US9pMzFNQUZMMmdIanRSWUtUUmcydUFYM2lxSnFDeWh3ZU1vZzdtNHo2RDh3aFozS2NZYlgzaFBJVmh2SGVlUmozeGVSN0txZkU4ZzFxYVBqZkJJTzA0aXdDWExxSHpDQ0hkY0R0ZFU2VFZvblByVjVuYytsTlc3TFAvMld6eDJyUnFqUVBKaGRNcE54VEJjY29FWTlGcW9nUXZKYlhQQ2RhV29UcmY1T0VrMEtsVjQ1a04wMWFwZkZhTG1hZ2NUOHBNTGNqeDhReVBNZXZSNVZyTjAvaWdWQm5aazhOT2tOV0ZmYm9ycW8ySzdiTnFwMkg2UnVIQTZlUXNiOXNGeWpCazJKL3VoS045WHVQZVFQV2JjRzJxRmVCKzNZRlZ5RHNocHpSZmZyL05jcVdHVDA0R3ZEamJZZ0dHenZXbi9ETlJmOE1VOTg3NGNESktnOHB5dU9hUzV1SzdpUllsT0xxeFpFZm5HNFEzM1didFAvOWtESVhMLzdQTFpQNTBQbS9pMktrcEsyZitmMkxNT3Q3VHlPenQwVUZqNlFNNzNHVWRhcGlrTkUwT05IbnNiSkFrdDV6ZDI3NmpqdEZpU0t4akxLRzJvMVd4OUNyS2FGWGRVT1hCV1JZN1VIaFlYRkVYRlV6SWVhMGo1WktZbkxlOVdXRTlxY1duTVlaTHN6cVRDbXlpOW1nV0ZkdGRFV1U3UTdzajVMUEN3Z0JDQTdiVnQxdTh5bENlM2VTOUl5dkVsUVM3V1huT0IySkRQTXpmcVZ2dlhQamEyYTYxY3RZYTh3UENiTHJLM05pMjNoTU50NTc1eE01TlRwcHNXQWxETzJQOWtpaGNNWC9wNTk5Nm9OZmlhK0JwVHdzWGNGWmdwaXBQVzhmRVVwNHA4c2wyR29mcUtlZERKMWVKaGU3YjhmZDd4alY0VVhYdjJpSy85MFpVUkZjWHU2QVdTM0FqR1dYa0RUblpJcE40a0Zwc3dGcXNnVWJRNjBVbTB0RnZPN21NNkFSdTRFdE1haC9rTExaQkxHYXdJNDR5ZklNbmovQWh3bEJSaFo0djk4elowVmhKVjNqWjZSZ28weFBsdG00MUZuYjJsM1g5MU9qdEgraWJJSG8yZXZTWlp6QTFQeWcvMzkxM1UyQ3E4eFBNaFU0VGs2SXVmd1p6TUFlcE01b0xab2gwYytwMmRBTFd0UGhJcjdRRHlTT1ljdHozU2s1Nzd1UmVOd0lBQUFBPSkgZm9ybWF0KCd3b2ZmMicpO1xcbiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7XFxufVxcbi8qIG9wZW4tc2Fucy1oZWJyZXctNDAwLW5vcm1hbCovXFxuQGZvbnQtZmFjZSB7XFxuICBmb250LWZhbWlseTogJ09wZW4gU2Fucyc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBmb250LWRpc3BsYXk6IHN3YXA7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgc3JjOiB1cmwoZGF0YTpmb250L3dvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFCMGdBQklBQUFBQU5zd0FBQnk3QUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHbEFiaUVvY2dXWUdZRDlUVkVGVVhnQ0JEQWlCZkFtZkZCRVFDcTA0cFZRTGdSZ0FBVFlDSkFPQ0xBUWdCWVI0QnlBTWhSOGJHakVWY3ROcHVSMkFsSFpKaHVELzZ3TmVSQ1R1dzJ3clF2bEFXR3NFRE9Pd0JRYVAwMnQ0MmdiaVdzS0o3NDlFbTZvMVZQek43blQrNzkzZDJYMmkzdW5POTR1L2RJZ0lnZStFNnRrQ1A5bmFVckJYMVFrNE5rS3RlRld4TFdKTUl5SkNhVVJyUktkNjAzbS9qSkJrMXYvS1piNy9HNlhXZU9RbDFKYTJPd0RVVmZJeTJEeWVCUUlwWWUzaGtzb1JBRzg1WDZLZjU3ZjU1ejdlSTFva1NoNWlZRklxYUtOaUZDaUtpaGxiWTlReWRIT1pyaUxjZmkxLzUzN1UzUC93bE8ycHZhcnUyWk1JUzFBS2hjV0l2ZVFRR09FSWYrNWIrLzFEYk5GRTlWQkpQRW9TOHlaZTcxY1Z4V2QzS2luUitnQ0FGdjFlVzJYM0VmWWVHV1FvdlRKcjVtTGdBVnlDVXE5QmFwajFCWmt4dm52bExQa3k5b2FtL0NqU0dqd0h4b3VxSDZ5T3BwWjBWMnU5WlYrYVV1K0MvcjdhU1Fmc0N3b013Q0hFTzN1eU5idlMzVnIrWXZsYXMvMU52dnIydCtxL2xOWmdxYkRWamhvTEMwNW9BRU5CTUw2TitWNElZUEV2S0diNXBOM2JtSFlCUjd1eGlCaFpJc2J4cmIvV1ZCQmd3QVVoWEFNcklRSkZTbytUalFMSUJ1UTBoSS9EWkR0T0tvNGxtd0haTmhPUVNwTm9Kb0tCNXRDWFE5aCs1WmVBK3Qzbm1RRHFMMC96ZUZEL2FXN3dnUHB2ZmVja1VNTUJnQzBJZWg4QVhTR3FDbWMyQWIzQ0JqRUM2ejBEaTArQndrYWc4UE1ZTUx2NkZWVnE5MHRVdE83TUxRQm40T0NwNzBXQkdUQUFuQ2ZUSlRpY0hvbldYWVc2djI4S212RXlkZjk3OHlWTjJmOHhSM3RKZ25QaXVvQS9OY2J6NldncTV4cFNWdWhmVWZmYi9iUVM4WkVZUUt1UUJvVWduWkQrUE1wSDhjaEtOOXBPVko0K2c3MGlFZHBJVTZZbWUxeW0wRzU3V3ViMExzb3lGTjF1NzhraGVzSStseXZwdC9JZ2IrZForb2VkbDgvemJlclBQWkkvOHJxT0FhTmliRXhBNmRLcUd0aXdkRU5mMWR6RTlMVE9hM2J0NlNXdGFGMWIzQWtyMnVwcEw4NUk5cElPcDYvdGkyN3VUcnJQUHRVTGVNMnk3M1FVM3lYNzQzNzVhWDNmVi8ycmJ4QVloVTdoVW9RakgvVUVUOFNZZ0lpZFpBZ3IyMXpKQXEzbzg5Z0tJTlI0TWhENm8yWjJvNFYyQWdnZUFyWUpZRXFHTTF6VzhnQ2J5MDlFRkVJQWtBUzhnSVNPREdFYmNMRE5UTzNOWlVtUWFKQ2F4K3g1UUswT1NmNENsZ0EyazdKWWlaMTZyeUdCckhadG9WOEJoSVkxc1Zmc2xVcDNhaWhXWWJOWUVrRDRGcEI1UFpBRUlnRUdCQUFTV0pDNnd0a1ZWWlVTRTdFVzFpSmJ1WVZWQTA4Q0VZekoyVlEyTlV5ZkNsSzFHbFo3Vk4wVUZNQ1hlZCt4SkJBME1ZdGhhVU1NOUxlU01LK05KWUMwejE0TFNMMy9RWmdwRnhGTTRMM05BRm9KNno1cHBRVGxlaHM4UGRWcU1jcFkzSXJ0Ny9vQS9EUmlRem03alpPWm1abUZ4YzNOc0xWSXdLMXBmRStjc3IyOE5nOEdTR2xFTUxQS1ZhSkdHM2FkQmdZWmluaHczQkEzeGszeDZIaE0zR3hha0RHK2R3SUVoRVNrWk9RVWNIeEZoaEVBS21vZkFYd2lhMkM2T1ZOWEVoWkh3UENaYmZydHlFTFh6ckYvZWZTaC8vc0MrMytYQXRvR0FKbDl6Z0FVY0VCSlZ5a0FXQ1J4ZW02czU3T3pEU0dBNjE5dG5RaUEvaW40R0VnSkF5b0lhQWhyWnlUWEZBcEEwbVFjRFFPK3BLYVk1MGV4a0Nobmd5Z2syemowZmpJcjhGR0FTVnc2Vjg2TmMvZDgvOTB4Wmg1TEhFc2VTeDBialMyOTNrQWRpOURyOUcwN2JDeDJ2blZzT0RiNU4vT1JwZWFiemZpSmJuL2JYL2ZWL3JJLzcwOFFDQTFhaUVXY0lkNmZhYk1KUWZlOS9KRVBQdlArenlpUzZuOEErTm9aSExCMnNQZVlnd2VwZHFwdGx0dHZmREwzRUV0c05ONHltL1RiWlNqeDV0bG9weVYrZHZSbTg0VDlWTjNxZ0pOTytMMHliSU50VUxqZk1ieTB4eUdIUE96TmNTcGtYQmx3dDIvY2ZPOGpEanBxcmtIckUyK3FXUlphYnBQZHBsdGdxVFdxNXo3aVo5NE1pNnhLdGo2ejJPOXR0WTMydm01TVBDbmhmVkNOMkJ0emY5bjczTmZaYTQ3ZVpwU2NZdkRPR3EyazRJd1NqQ0N3SHI0OVdiVk5YY1h3emRkZmZYbGNlams2UE5qZjI5bmUydHhZWHk3bXMrbmtzdytMSzVjZno1TkxLeDYyVjU3b1pTbDF1Nzc2aExvUXVvSjVOOWpsQ0hGSDdISlh4aU5qclRkc0VTSDl1RG9XR3gyMmNEMkVHUnhBMjNxczVSNHZkMHFoc2M0Qk41cjJsUTZ1NndIR1VSVEIxUlppbzl0Mkx0bW1YSGFvemUzbWJYbEVKbUMzdGtjU2hMZUhvMGxVODh5cSttVWN1NXhuekR1MkxDMVNseXl1cmRzUFEyRmU5a2c1VGNFVmRYbFdqUnZxSSs0STZrcEJFVlorQmcyRFBjUXBleDFlNE85VWJ5aWdxSW1nUFZmYm91dEFjMnpVOXE2d0hoaXprUzE1MzNYWGxVYWZFTnQrTHpFR3FjemY3RWt4LzNCZktWMmVvWGl6WDM1bDRpb01mRm9meVNSU3NHZ3daRkJyRk8zWnRuemJybUVIdk9uaUdWWXIyU0N5NFdGSDBERkxUaTFDakwzY294RjRnSEpNZGtZakttTTJWcHNQVTJ2a2swN0JCT3c3aENCaGhwN3R4UlVWTDhYTDhScjNlR1dpSnZ3MVAreS9oQ3doL0paUmozUlNzOTJCdjZuK0JTbVl6cUcvZTZJMTZGZ3RMa25HemhaZDMzV013RUVIRXRueVFDbS9aYmhPS3lVZWxBUGhJZnE5Y2VLZGpwZDNaaXlDdlVwb0tIakQ5VVFnOFJEaW5wZ01CbU45ci8xb0JheXlWMG5DcldHZkZ0M1JDK09VRjhPbFZqdmxtaFBYcVdsd0lRU25TdzhXWEpHTFIxd0g0ZWMxVDRKM2tDRjlqM090V0I5U2R1Y2hmbFNsWXFJYlY0ZU03Q05oU1dMaEUwbWZQOHVlSldLZC9aeVc3UUN1SENDT2ZaNDlOelF4UGFBbDVIL0RZeDdUMjY5MHlCVVI0cmFjbUpXUEtHcEVqcERsd0NTSmdiWCs3YnpmbzNIQ1RqZnE5NVk3S1c2NTdXTXhDTTBuYmNlb2VpN0VPaGJUUnRhdzFUWTNMa2NqYitpT1dmOGM0eGlDMXRnTHU4aHFlUU5IYWdMMU81Q2VnSDE4RkpTbGFYUy9GTTJPOEtEMzVQZzVYdWlBNm1pbzlrYkhhK0lIUnYxZTNwUHNvUE9ibEpOSnZ2ZERYNi9lVGUyS3JBcGNOVnc5aXJBLzVBbmdLcndMQzNqaFY4aU1LcnFWeDAwUXFtNHNEYUxhRlV1TlI5KzNET3lXMW1mTGtrdTY4bDc2Tkgrc05JbG4zcTVHZno2ZXhVL0lTYlU5UVByN0lnc0NlZGpCNHBUQkdlL2FQbHBFUFU5YUZQeUliNFFWT2lWVFZBZWxlaGdmVWxLdlFhN1F4ZVlrbGJFZU1selNxU3N2azdtY0MzaFZuSE8ySDRVSnRGOHMyQStySHZWdUNwNUNNTWtlYmMxTVZZbFdjWkhCNDFkdXA4WGYyNlZRR0hYZmlnRGo5OUlnekg0NW9WdUdwZFVwVHkvTUVQVGhtUmJBUGdGV2FsdnF6elJ1NE9SVUEwRUY2REMvNWEzaGd1UFlvZ2hoM1lMQUJmZDdTaEk0TFpzeFcrL2dGU2lGRVJ6cUdOWE5aMVZyR1FuVHdVSDVOVjJneFVNOWZJcnBJb01NOVdGd2JLbWdDVTI1amthRTBaQnowUDR4ZFhTd0VpL2NDSEdiZ0xNdVRWLzBtaXlzT3U4NkpXMllTY0Jld2U2MnlqQ2kzSXRHeUVzZnVHQVVpclMzZkZOeXdnS0lkbm9lY0JJRGE1d01FM2cvOCtWWnptMzRSaU82QzVCZU1HdzJidVljNzBxTExDTUpzZnFjbzh4NXA1MDB3OHE2QmhYLzhvNHBFZDdGZ1FBSG56NGhES1ZDTFZoUWJXb0o5akFRV0FHbEdMa2FNVjEzclZBNENBd1pobjRvNnhFTWhRK2xCUXdjam5QYk1RRkVUalNjbWc5bGwyYVZNbWtpQkl3enRHWTFBVmtTdTd2dUdvR2ljUGFBNkJYKzlkM3AzSC9rS0RuaE5jYitoWTA4SktwYk45VTdienJxanNWYXRoZU5TbmxxSk94ek9relJlMDJ1dDlna3VMQWQ1UlBPSmxCWkE1WmtRRG5MYndheUFsUTBtT041QS8vS3lHMzVZRWVTaVluSi9FeExIa3FSNHZxMWRzajlxdEE4WTlkdUMvQ3llZUtCVVpFSmh6bVcxeDVSay9iTCtaWG4vTkxwQ2JnK3RTcEkwREtiOFFDL3BOTVFLaTNFRlE0Q2xIWUdFckM1THhsZkRxMzFTcXh5b2t4QWJFcVhJVnc2ZVdjbnFuc0JlZXVkQ1lDTEVSamMyNEcyajdoU21yNXhwNFpaV0xOcmJ5SDFEMkZHaUZaUVZMM2pnTjE5VUZZamRzRytETWgzMDVmM1Z4MVlJT3J2SmM2UHFTRmFHVFRzdzY3emZ2K3NrUmdOWUhEbHpXbm5PQUd0TkF4OWtaTXFocGVjUU1jZHhSUEpRTngxODgvNUlRbXczYlRxWXF2d2pPK3hZMGVwRS9GejdjdTVsZWM5MGtBRmhIOUVxeHQyTkxMV1Y1MkhtMkFvd24zYXVwY0J5TmFkQWpGN2xYbTFHTmVHSXU0Ni82M1ExdllRaDd5a1ZkZHpaN2E3cnN2UTZEd3RxbWtGVjcyTndSaVh5VUtZY0IvSy8vei9YaW95ZHFXZ28rbGlJUFo5YjhOdWZ6TGRuTE11ekVDT21TZDJ6KzE5K1JrSUMvOUhaMHFsRTJ4Vm1qR0VvR0t0cno3dlh2SEtuMmNaMzc0V3BETVN2WXFRVlY0R2MwRVZGcEVnM3NUREx0UjJvTXBZMS9GK3huMjdCTXZkTjhtUHMxY0tGNVEveVo2OEsvTDU0MFpFQ05LTDJ2alFnK2E2N2p2bHRnVTg4Tk5xemI0V1ZLeDV0dERpRm1pQTk4YlpPU3JXYldDQ0RtZ3U4T2NxYmZHUVJNTTFicmZ0UVlZUFp1NlZnbGRLN3AzV3BmNzRzWGFTM0RTQ3lnNG4rRHRMU1UySEdmN2U2aldNZ3I0VXZ3YXNtaDN2ZVcyTFFaWWZxZ3FISW9sV2hNalQ4T3JrUXZXOEdWbmR6QTBrK3hQNk13MjY3cUNTYmZoNFE2NExSYWNlTTNYbHgySHBCVFFwQ2JGZ3JNbnd5MERaSTY0NU1kVHFsRTZ3WlpkRVVWMmR1RUJOdUdBRmVtYXNFbCtoUHlvZG1NQUJtdmZxZzVETWc3WFdHN2NDZ1FEVXR3RHRCTUFmVURvQm9Md0xVK3hXTXdkV1hqQmVvUUVEQVJTZ3VBVEpxVFJSUXIzdFFKVldvTVR4cFNvTDRSL0hFdkRNZ29CQW1keVFKMVlvY0htb2dkMmhhMFFxcTRCU1dkbDE5WmRxWmM1blVWU3B3ZWNwWHN4YWRTZFNxK1FUa1hCY2c4RUZKUWZwYVFnTUlHQkhmZE93VWt1RjJVSUpoOGg2UUhQcTFDajNQd1h0Y0lCbjVxVXZ5cXdIV09aRkpCb1dKdEU4NStQU3p2ZVNIdXh6NVVKU3dETU5oanV6MmtGdVZBMGljZ0k5YXAyeC9paGE5cWpPeGZ5RHZNcTN5UjNwaE4ybzlMY0k3K2Q2K0R4MVRhb0NwVXdIMHQyV1Zqc2VsRnFOOUZ6d0xMY2h2Z0xHa0hLeXBrVnB5bnFBS1lqSVN3dnJRNEdjdGVyQ2NsRzNQdXRDMjd3R2xkMUU3cjlKM01OcGprSllNbmtUQUNXMFJEME9GdGxwNUt0b0IveGU0c0xVZGpraGlhUzI4V0k0SzVBdE1nbmJUbWJvTHY4STFHRHdRU3dBWjNKcnBOMXhIMVBMdzVDM2lCNkpkekR6VURMT1Y2SlVvc2Fna21pMmlpVUtNWEZUR1ZGK3JpQzNaUDhPbllHQmpIb0tMU1U3UG9wb2JPeExlVHQrV3c2ZW1VNWxzVndtcDFIckpnay9ROVM2d3h5TjZSRjliQTIxNTJVYVpKNzhSRGwydGwxOFJsbTF3ZWZGbzlNTStZVUwzc2RvRWl3S01UMUxZOEdaNEJtMUREVXR5dmYxM0o2MXFyMTNHeXZueTJWYmJoMjYwQXAvZDlsSHB5QW5zS1k2MVNYWmFjejAvc0QvWmVCelhiRVRMYzNDcmxNanpOM3dNL01NMGR1V2tzVXkyZlJQNVk2TWwraUt4U2RXV0h6aVJ4ZlllMlc5bG5FRzhBSTV5SzVCYys4cE9iRld0YmltTFd1cWRsNFQ2aDg0ZExnTGRiT3lOVGV2Z2lmS3NUSENCWWtINkRkdkxsMWwyWXpjeXJrUjZ5S1hsc3I0cnA0QUx2UVMreVNBOWIzTDdBMjRXMlJEQ1ZLS2pndkxRRm1aRnpISEI1cFhSb3BvZXBnV01BL3drV0F1VE94dVpINjNCdmxGbnNhdFlZemt6VzFkcnhEaG00MEIxcHBCVGZiT2FhaFQ1YXBsNnk2WjFiWmRsdE5VWWVQV29BR01ZOEp5MUxkZG14U0Q4cUFTbjh1NnpnMDcybk5UaVIwclFRTmdCOTJ5dmV4QXZFVEFubFZObFRaeTJWejlhZUh0NmVXNDJ3TkMraFJrcWhyMmpKbmRmSEJkeWhueE9USk8xL0RrZnlVdVZ1YjZqOGMyc3ZocTNQK2o3YTUvODJSQWVyT2RvNXZjL0dMM0M1ZHMxdlcrNm15ckQ5cDkvdWFQeHZLWTZkTFV5WGVreFlzNzJkM2pKN2R4NS8wUnFsOUtiYUF1emFFT1U3T2JGdkJ2UHl2S1d2amFqNVlSeWwrOVdIaUNwckJTWGFKMXQrLzQyMmZtYW0ySC9Ub3kzM1pGTlRzRENoamZEWlVKeW0wTkpPZGI3WHpYUnd1Rmo1Z3ViM1d3VXk4Wk45TXNxd2gzbEc2OXR2akVnRSt4Y2Y3bDhkUDVaOWQwdFUxdTQzYm1Fb2FVVWRaYTl1Q1hibUtsQTUrQkc2WU8rcjU4V2VTWThRM2JGYlBtQkxtUGxCd0Z3dTBEd3JIT3ZpejFYMzk3UUo4Nlg3YjQralJIQVRINmg3aThQYyt1ZWVsekZBaHp2V09raXJxTm10WXg1UHZpWlpGOTV0ZnNVdk9hQTJ0NkowNmR3R213VVNKMTB3a0hzVWl5d1RkenBpSzVwcnlXdEFVN0FrZm56TjQvZTEzMHM1U0NqcWc4ZTVmWkVaK2ovWHlnTCtobGRNNzZhVkhad25ucGc2Y2E1WmtEeXBRYVo0UENSdWFwNzA1dmtSeVFaS3JjRGJQVFEycm5xRVU3M28zZHY2TjNMWGZraDB2VnF0VXk3dHM3N0RFemRFWDBzc1lzWDl2d3dsVE8vRFdWaEtubHBLMTdOREpOck01UTc2Njl4SjdqVzdXQm44bmZ3R3dTZXRqbTFKYUFDSVVwNzlrMzRrbkp4eWRGSG1YZVdoRGpTdWptdi8ySHl6cjhlcUI1ZmcwZTAzTEsxbjBwTWkyNFJ0bkc4VmlQbDhwWEhHbEtkWDVzUzlvZHpIOVU4OVBsRmFlMjdPT2NXSDVoYWMwZnduMUFtT01kSzZ0cDI2anBYY3VGcjljWDVDNzlnbE1TTldJWVhsenJsK3BmR3JZbVcvcWtJeFBUNjZZVGRvTFhTSXhjRjdDNXFxYXBzdjkvRkNjc1NCaVJTR3pWbkp2NUNZMU5NOVU1NlJQOUR6K2xrczlWdytWRjV4Zno3eFg0ZDR2ak1tM0NDT3ZVb0JCYTdpdWkrQW01NXh0UTAxYjJERWt2RVZvY2R5QitLSzFYMU1rZlNnWTF6ZXhhdk9zTXN6MjYzeURKNzFWVDFDSEY5THZMeXNxcDBmRXUwZS92M3YzRkpIVEg5SnNZVXpndGRYTjRUYjZEVFpiczRISHoxYldTRE9uQjV1N0FLN21yT2pUcnFjc3E4YjNValpSTTU2QjJVVnBSbThLbXlsR2RuMW91V0Mrd3F0b25yTTBMYjA4Y0hyUjNXVklkWVl2NFcreVhjMTQ4MGRYN202UHpVWWVyclBEMXlkWDZkem1wblJiSjZhVXM3YW1EOXdSZmR1NVpuOWJ6cGpweXhmcktoK3krR05QMm1FaGFjZGk2ekVWdm5EMmNMV2ZrYnM0MnNUVE8rS05uamVHZE41Mjlwcnk4UlliWkZhRVRFd3QxWFY4OHpmUDc1b2w4Mm5EbDJrejlidjJLaXVxVXJSa2I4Nk40YmQzU1ZQdDh0ZE92c1BLam9JTGd4N004RXBkdmtvZFNUN1BOVyt4bUhHT1U1MDQxNW96WExhVG41Rk5Lb3R5OFFXR2FNRDJ6WWZCbkcwOWIwQjFxZUcyWmtaNmo2K25pT05TZnZpZWZ2cUt1VHJyUTlhYjVWL1dNbkFuMnc5Ym9yTVRqOGZYRlM0TTZIK1dXN1EyeWF4L1BHWXg0RVZMQWRMdmlJdnY5WklJZlpMeVBqc0pkM0hZM3g2ZGtXY2ZxZmV0cndsZU9pRDNXUEU2L2FyZWtlSEg3REdTNmZPNzIyZnBzYzRuRFVmV0ExUytsYlpQOGIySGwrTmlPM1EzTUtYa3JvM1NlWUxESmJ4K05RNHZTN0JLNk1rUk9SZjNvWVd2QTRpZTlKNHRySmNYUzh2WStVWVdvbWVPV0tyYjk4TzMrYnlXbjEzU1BuektPMnpsWHJlM0FlcWp2RHBZVHE0aWszcUY3K21qNzh1Zi9IZXlyMUtlc0hZbWZwdkg2WW1kOHF4dWhWeWwwV3hTUjdQa0pWeEl6TGVrN0haMittQUZKU01tU0gxYm5MOGhieEQ4VWJkZ2FZMko2VXU5Rmw4YVVEYzJ2RDMwMXJMRDd6YWNJbjUrZDR3clB6cWx1U0RKbUVjYkJKdHBCNW5JOHZtcUFVU0ZadVRHM1lPSU5Wb2xwdzc0MVBST25qT2MrdHdkVllNNU1DN2RTdE9GNFFvTmN4QlJhOFYvOGd3ZTAvZ0VXWG0vV1lQN2Eyb2xCV2d0UC9yc216MnMwbmpHTE4vdmxxQk5JVTlDYXUyckw1R3NNclREd0VZQzBsVHJ5a2JQVnVWVnJrdEJrMlJxa2NXb2ZVVHF5N3NFU1o0dHp5WVBRNmloZkl0d0tscTJkcjBDL2pkbVQvb0ZGeHNLZjRyeWc1cHEvSHBSbDh3L1dhbVBVQWRxZ1lDMlAvdWVlVElSYWFFK0RJVEFuRXZ3eVplZHZPQ2M2R1dIRDk0ZUt4eGNQM1dlQ2FMcXRJQ0M2VHpEVHdmYWRmeGpMUDZBU25FbGY5YWZvMk5nWTNMbE1vL1hVSDlzOVZGdlZXc1NVTVZmUU9RaktBbEE2aHlvRWZxY1JPMWFCbm41bE1RSERQWTVFUisrd2dBaWN1K2pWSXZvUklQNGNIYjQ4cGVyaHd1bnJwN1hibHMzSnFWYURlbzVUa3JieHFyaHRNRGR6UmR2UEczNmVYZlg0YnMvSTVTQXN1RmZKQWRFZzgvaFl3aGRsV1duUkZuaEl4cWh1RDlZVTViVENoSzJsYUxZQmF5dnVWM3hwYXN2dmQrMForZkJoWW5hZm9oaWx4ZXNZM2hKM2pHanBORW9sV2o1RmpKYjRjUG9NTkJ2eW1Ld05CVmxqckxhVWNacHNWbU55VktLNXozUEdwdm8rd0VwOUFZYlZ4WVJ0VFFyZkZObnVVSHdKMkpqM3NDbTFzeFRHWklVNE9KTUxNam1aQ251RWcxQUpQVXhhY084WmdMNjNTOTZXZTRHcWVYRWhYMVpzTmEwM0M2TlRyMmJURG9zT2U2UUZVT2VaY1lKa3ZQL3d4a29FRUIvYjlDaXBqOXdyZ01xUzViMmJKeSsxNzc0Lzd1ckt6YnlYUE5wYzh3Z3BqcU9TU2ZucG1MYzBBekg4OHRQNE40VmFVaGZnbDRTVGNGS2p1YkhWZUpLYUZxRWpMdmxodVkxelo0Z0Q4Q0l0THJlSDNEZXlUUjJONTVOOC9QT3p5K1FzUHpvT0FhUFBvd1RvVGVFbWdTVE9ZTFF5R0htL1I0RVFtSkJpOG9rS04xa1B6eUtaL21vZlNUOE5tQjZvNVpTb3VMaVUxK0FaUjdkTGVNYndFMUEwS3BrcUZZMDIydTloMElqNjFIT0srdFNaSSsrc29WQTZ4OU1LbUVxWkRORjRrU25OV2hWa3VFeWdKQURuV1laSE0rRzBBRUI5OWFoZk1IUXFFZmYzQVJENXM4c2dqNzRUY1U5ajBJVlEybVB3S0Nvdm5sbHRvbExRMEhGNEdINVFJRFBhVjZEVHlYU2Zad0N4WlRwTWdWYWR0T2x4M01wOGwwRVZGaWQ3eHFoNWdYNUZWLzU2TEk0RVlTcFpSQVV1MVVHVzFHMlpJcUZZRENhb3Y3RVFwKzhXWlllRWhzTEt1SnZIc0NjUUlvc0lmUkZ1RkRkalBNS2hMNE9NZUZabEZBclJyR21mcUFFNmkxQjFDcmxTeVdObnZidUl5OVYzR2U0L1pYZ2o5V2hXbmgrVHVkaFhLS0FRWTZuRTg4NHovNGZnV2xZeEF3TUZUVkdiK2M2WEZFNCtNdWJOanhVcmUzNmVmS3hUbVVBQUdxWTlGV1ZLNkxFNStwZ1lha0JvcU1UUEQwYjFNaXBHL2dPYzRGdmlhWnJ6eFdJZ1RFNy9TRXo2eU1naW9Wd085WlIrdVhTMERJK0RNR0FOVkVHbFpndFVqczB5VUtWU0ZRY0NGVUEySk9VL05uV01JWG5pbXNrNHFrazFXSjQ4TGJ0bmNjakZBTFQwVVFFeGk5NkQwVTFPYTR6ajQ0RVl2UWFyRDUvUDVTNUgrQ1U2ZllHQUpDR2JFeDdOSUdKMTYrbjY4ajBDQVFBRjBvN1AvSTY3eFV2ODB6b0xBSUNYb3pmK0J1Q2pubEEwcHZydnZVUmxHd0JRQVFNQUFBVHcxNlU4WTArSVJJTm1WK0dkNU1sSC9zTkRtQ3Ixc0Zja3d6TTRBeEVFRlVkTGF5VTF2S2w2eG9OaGQzNzA2ZnlXSi95WVQyWFNkMmRlTCt6YnY3M3puOC94Nk5xSEp1MFppZnNGOTE0emFUNUd3YnM0OXFhajQ0V0lzNC96Q0lYSUdmTHpRUlhHQUd6UHNWamVLNnZ1M1RqT2NvdkFjK0dkMEhzTUMra01nTzc2bVBoL2UremRSSGZCMU5CTW1rMHYwbXMweEx3RytNK3F1S3M0WDltT1FBRFlaZ1d4V2dSZ3dLZTNFZkNWYjNOUlVEaHk1MEllWjJ6SGZROFdJeEE0aEZqVXZMS1lBbWFqaTNIUUJGdE1nRHlCaTZtZ1R2SWlMa1NuWmhvQ3lOQktXSXlBaWJZZWhJZkpJM2t5OTZFeW1hZlFEM3Z0MTZTYmJJbytIdTFhdGVta1ptS29obW9sQm0wT0hhYk1PSW5DWXZXRUhSc1dvdUZrNDJ6VmVBNVRkYzNZWmlrUFRvWTQ1UnRPRWNONCtxSFVxaDNKNDVVR09vMmJuS2psTTA2dWxRbWF0UWlwazNUcW9IZEMreDNGWEtIUm9GTnViOVZsd21TUEtEcUdTbnVDTEE3TUVoempYSEdJU05oamlydERZbW1GMUxDZEFaOEx0Mjhoc2tTSWdzZFVJOTFxU3FKSzV4Z256RUFjdHNacUhUTGxLK1BzbkdBWnE2WlMyZEhoUlBVZzVoaDg1dHpkeUVrbVJGR2dnSEJPM1dZbWIwTncwWHNyc2MvVjUrNk9kWkJkc1Y2ZHNRZkpEdk1qMG1PV3JLbm1sQ2tXcjhreEtaT2lhc2lKVVhwQ3RHV05qN2JHbVZMYURhMWttK0ZoV2cwZXNzV1FRVFliSmQxa1hCRnBORHJJQmoxbTFldDFuUzdwV2gxcTFlZ2kxVG96V1JXWmRHVkV4S3FJaUxnaldzbnljSTZVaGE4aVM4Tmw3UXBMVmttb0xnN0ZMR2RvU2xISUxMSXdCQjJ6WmRmcWd1RFJ5Zy9TZVVGeVNtNlFsY3dKdExJRGRKYUdyVXlOenRDc1NMSDVyeUxUL1ZQU3lFZGtLcW10Wk1SS1VVZVMxYTFra29wMG9oK2xKQ2c5Wkx4eXN6aWxnN1JZYjVoaEhSMGx2R3lqSVp3TURYR1FJU0tGckVxcmlDU0RnNnhrRUZmZVB2VkF1WkVNa0pHa1J1YmxUN2FTYXRKS2trcXB1RW9sVlpKK0VpK2wyRXRoa3BHVjBsaXhwVklPaHVRUExwSWxpNzM3R2dVdUh5UGZKWER6M1J3VDIwV1ljQmZiamJ0NStFejhGNXpDODNJWFdDYW1pMmFpdWxBdHVMaHVwcHZxZm92NkN4VUQ5MlNZQ1VmOUlwQTVVR0tpdXlnbXpFVjNZMjRlTmhQN0JhUHdRVVFyZ2M2aDRXTWw0WG5uYUY1bjNqRkdZZVV4dE9oWVVMRlV0aFpWSEtPbVZ3eXVpc3J5NHdndGM4OGZHZ0svdEx4anc4WGxKeWhRSSs3akdKWmU1TEp3U2lTdEE4TGhzUTQ3WnM1UUFuZTBIZExCcUNLaFhsU3ptSzd3UmdLT0FFb24zL1BlS1hZOU94Y3BCUT09KSBmb3JtYXQoJ3dvZmYyJyk7XFxuICB1bmljb2RlLXJhbmdlOiBVKzA1OTAtMDVGRiwgVSsyMEFBLCBVKzI1Q0MsIFUrRkIxRC1GQjRGO1xcbn1cXG4vKiBvcGVuLXNhbnMtdmlldG5hbWVzZS00MDAtbm9ybWFsKi9cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGZvbnQtZGlzcGxheTogc3dhcDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBzcmM6IHVybChkYXRhOmZvbnQvd29mZjI7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R01nQUJBQUFBQUJ3Y0FCSUFBQUFBT2FBQUFCdTZBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdrb2JJQnc4Qm1BL1UxUkJWRjRBZkFpQmZBbWZGQkVRQ3JvVXREb0xnZzRBQVRZQ0pBT0VHQVFnQllSNEJ5QU1oUjhiZ2pTekEzVktWTzFFVVNJNVJmSmZKZkJrcHhyOUFnUVRKTTBVQ1JvT1A4Lzl4aGRkWm5HbDFFUlF6bE1KVTRucGhXVml0clo0bUNqaDlnaEpadHVmNTdmNTV6N2VlOEI3MUJUUmZwZ0xIZWFmcnJXWllvT0ZuZGhnWUc3VEZhdEtsNjI5OWtlRVgzais2NTZkdDN2M2ZZd2dheWJoZ0tMZ0J4RkdFQWkxazlOVWttMVp5NUxIL2oyODByR05VQUh0M1EvV1lVS0tRRFlOS25vSG9EUldyZG5zaGxBUmJuWHJBTWxValE0UUNQZjJmbXZLa3Z4dUMvdDhZQXVOQ251c0Z3b2ppeENxVnFhVzVLYklkVWh3R05RNFE3cjNwaUJTeVVIcDlnQ2VBeUJLV3QvajUvaStyZkh2MDNEaytoZi9UMmZaampUU1NvdEgzZ0FmTzRCRmRRNXgwYWRwTkYvK1hzMk10SjdWN3QxWkMzam9DNnlQN1NQeVFnRGc5U21KRHBEREZWQ1hWT2xUTnFsVEZGMzgvVjc3RHFoeFNqZU1Ya3A0Mjc3VzcvZlQvbHhNSzZhNGlrQmdSTVN4Wit2WGV6TURBZ3dFa0g3MXMyQkF3aFJpQ0NRc0lMQmhENEdqY0FnVUZCQkUwVUtBZ0FVQUlneEJBSnhLRWJ2ODRGQ0ZFamlBQXc4eEdnRk5odnVaZy9nczZhdFJVd296VGsxZWlUanZuWmV0T2UrVFZWTytORnNOTHNOeEExcTFHZ0RDRzM4S1lIUFd3OFlidmNacVNDK1RBaDVVWXJETFlZL29NTlJYbVBRSVovbi9Cd0U0azFndkFOcmh1RWxPbkg5TjRsRkp6bGFLTTNsdXNQcmNta0pFY2ZWbllRMEM5MzlwNnBFTlM0Tk1PT1FEWU1nS2NrR0tvem5DMGFxMXZMclRzRnJieURHa2xBZUpzb053S0l3a1JQQmtrb2lGcHFEcHFBanRRaWZ0ZnJIN3plNGY2UkdqRVFCaFNJU21vVUswRTUydzIybjNxOTN2cW4rNlVXaGtUZjR3ZVdLeVpiTHFZOGZIR1IvYjNyOEFCR2tCS1FhYU9BK1MvZlVpQnpFd2ZpdSt6M1pNU295VGhadk4rZDhCd0VHSHJYOFAycStkSDZIY0tqdXNkQWllbUFkUXBzZG1KVmJZUW11djVUVUhPbTIyVzQ4Zm9VdER5UVhYVW5hN3c4NFFNRFIxbFUxMkpLSkRUbWFiOWp0SzFxTFZUZ2hadnRyMGRuWm1IUG9lUjV6UVlabU5OUWVxNkMyMjBoYjdOT3ZXYTExKzA4ZjlDQTFhTExHbTVOQklMMzV2YTIxMm9HOU5MVUdCZU92OHNPMnNBLzdobXpadVdMKzR1NnV6bzcxTjM5clMzS1RUTmpiVTE5WFdWR3VxS2l2S3kwcExpb3NLQy9MemNuT3lzekl6MHROUzFVYWlkUGJKN2VQSmVEajQvTE5QUCtuM3VwMTI4ZUU3MmRabUk0MXA5SVp2NWx2TlJoS3AyRmN1YXJ1cERJZFZ1SVBCc0NISTBPcit5T1l0cGJWVHJDSFF5QitUd2t6V1N6Mlg0RWt5aEhYelpmMHg5NGVscFZ4V3dHQ1BpUVJOMG9kcXpHVkEyaU4wbWI3NGxuYlhySHJyMFNucC9Wd213RXppTElJUFZwZW9pQjgyYlBUbldRd2J4MWd6ck5uTzQzblJDNjgrOFRkVFNmWjVLYlZCU25WNU1oMFBWVSs0UnVTVkZ1d1hycFBvQWd2Y1p4clgwT052ODN2a3dSVVJMSGc2c0ZJRHZMR1NEUnBaVm5kbEZMSW01K3JpcG8zRkNXTGRiRVNTd0ZpWDNvOUdTZS9IUzF1WEo1RGVUOWhmeUN6ZCtHc1g2MjJIQ1ZOLzNjSUtDdlRhMENRaTdZLzBjTHRUdGZpcFh2ZExKK3VxYWhRNURaTUhHNGxCZnJveXZaR1pHbVpvT21LczRZYjNQUXV6V2VQbzVUTThnRFhKeVgweURTUDB6c1l1dDFZdk55NDNMM2VXZHBkVXhHTCtTLzNNdjFBZ21PUU16K3ltR25taG8vWWF2Zjk0dmFySmd0Rko4MEJPUGZkU1JySzRNeS81bFd4ODBlTW81bFdWOXRkTStFWmxXRWhjcCsvUmJPU1JKb2FIdGpNeUlDZ0VPNzFUWEVRVXA5SUpHVnZ6RHErMCt5alh5c01JMjBteVBGZnNZdlZMY3BMSDh1eW1MKzNEY3J5NTE1bmo2dHI3M3Npd2c4R1c0ZXk0NUVHaFczSGhmUjBNalEvdnJqUFZMZFZvelp2dkxHV0ZkSTBNRVN3VVpKNzc3SHN2b3YrOTlEdzVqMmpYZHBDNCtUVlNkNjJNWFNRWHVpV3VHWmhoL2h2T09hZlhuc2s2VDRrZ0EzdW5GaTZBS3dnSGFIZXRvcFpBcmQxcmFiTkJlWVNKYVRVYi9XR1V6ODNncVlVRUx5T0pMY3F1dkIrcXNKbWxwUlZyS1g5alhhdmxyTHk4cVB3eXluM0l6cDNya3JPeXdVNE9OSU1Nb1VHQUpYK0haV2wzS0pQU1N2YmlHWTl0bEV0WnBTb29xcHlTMllyMTlsYXprWDVJVXJUNmhzS1ZXSnIzRWFyRmJ1YWFrNm5uYWVGTGcvMisxenZ3UlhBSkVYS3ZTamRMY2FyMGNUNEx3V04xWVFhbEk2dHA1b1pOQ0xOM3gzSnFqb2xkQklVS1dxWDhSR0lpcSt6OEVwTGZyYXh2UlBFWTZxSHh5RjJGSk9lTGFPd3BIRGlqOTBVQkwxTVN6dmlZbjF3SFdwdTB1ZmxxZktuQ0FpWHMrR05MclRjMzJhblNEcG8vVUN1anpxa00xWGg3TVk2TVcyZGZBRnhaRFVLVDh2RXlJTy9JZTRQTWxWWlNNNDIwQ0FNTWxsNHhpSW50QjVXV29pRGorUkQyODZnRGJtWGRtVGxyQUhMbmxld0JDSE9ER2ozQTBnS0tFbG55dE5haE9GQkFNSVJsOTVtZEMwNE1oem5ZKy9TWXdKNTVmV0VJQ0tlb25MVlQyUVo4UXV0MTFpVFpUenVlSTNXQnNPZ05EQTZrVXZoSVpoN2duQ1hPTDZ0dXZXRk5HUlhVM1Nvb0FDMGh1bER1aEpMYU5oY3VoWHRmaERnMGNYSDlQV2tTRGNmbWhUSU9aeWZBd21KRVR6cEJqSGNLSThvZU9xQUZNcmdvVDFKM1ZnaWxvN28rU3lUVWlxQ0xRQ3NSNkxQb3ZoNG9LZEdHRlM3VmRTcGtTbVBGMHQ1cFJnTHg2c2lRY3hSMWhHdFNpaGJ5N0M5SE82S0MwMGF3QXRVRnBOUk40QXVhTk9aeGxSS2dFV1RjQ1FuODZLYnFvaS9HY3VnWm9YTjFrTDR5c0hMZFM5bEFvK0hZdDI4UFVOYmM5VlIwbTdGa21VeUVjTUdCR3B2VmkybDlaTENsTHZyWVl4dnVRZG1pOEh4bTR0d2ptMlRIbjFrR2EyL3hpS2c2TjFFMS9NR2hudHBmME1GNlhTa2F6UndJNDBiVzQvT2ZNK3YzM2hCc1dvalNncE1DWmxVQW1RVGdPdWxUZXlJRk5nVXFWbHJBdjVDZ01CL3VTR1Q2U0dZZG1GbVFWcFB0N3NnNnk3cWZmVnJuRGl4Z3FFNTFhQkVTdFBERnhKVmh3TXF1cWhXMzlTejByN3ZWWjRhNVVpdG1zaCtvZFd3S0Qwdmc0SUpZWWlFRDZIdkQ4am1JR3hVU0w5TzdDSERmU00rQ0d5ZC91Wk9hZXREUC9oSTU3dzBRTUs5RGljdGJZMXpjbTZWUnhnTXI5d1VrT0lJYkVLakxUL2JCQUdiVmN3OXhGMDVzWTRLMDYrcXdyZklzTHY4ZTNteWxPV0o5WmNqT1VWMFkvM1cwd0paZ0RGZDJSaDBrQUlWd2dyc21pZ2YzVDFFQVoxT3dQVk43eTk3OFdBVUpjRitLUnBvZHdxZTl6NlFvVVJITHBpWjJSYTA2SktRTUNzZWNkbkFiRGlscGNUa1NvUnRDclJLM3Z3SmdOZTBCUkpKdm1DOEpleW5NNE5GNDM0SEVqWVN5MXcyRjNGMWpUNmQzczFDQ1V5S2JLRkw5Q2NORFZJUkJNTXNqR1B6MC8zdm5LVFJhUnpkUEFhVm9mUTMrM1NlU04zUEszaVRaTW5lV25neWEySitBcmVoL2tOU3cwVkEvaEdvLzhPaU84N0hINXR1dStLbUh4WnRMSnE1TDlDeEFhOHJoaXM5SEhDakJ6dTVDRjBrTWlnZ2ZrNzlsdk5kYTJCLzlRRjdkdUxTY1VYcWFuS3JmTlBoWFl4Y3NRY09lcWlNSHZOWEZOelp1dVdLNmFEOXlKc0tVSGRBOHdpOEE3L2hzWXp4S2xqdWlCWmFHYkdLUEJvbW1FRUhCenBMMGo2SDVwOHpiYW55cjFmektlc1ovUmtjUVJTSFExZkRqYnpVZk9UVmMrRHV0NVRDWXZyQmVCY0E1NHplZFJIcUx1ajlVRGJjMkF4b0VTUk8rbVR6aFpXcER5ajI1a01UL2hPVHB2UzZPbEZqN3R2N0puNXVybGFPejNmUVhobDJJeDR4N3IxZmF2R3NJY0xWaGEvU2ZLd3N5eDVvZG9uTEZrRUJHa2szUVBPb3IxbXdjSUdBQkJ5amdBOXRvQkNHa3BkMEdJaDdrZndaWTdRREU3ak5aWmJPY2JQTC9XUUFEQkdqcjV2Q0dFbWxNbVVTNENoMHRadmpmYWhSUEJkaWFvUFZ5YkNQTncwMkVZaTdPdDZNdE9EaHYzaEVMTzc1UUlPV2JUckd5RlZvTHBZNFNVNHFHU2t3dEJmU0prUWdzY1o1cGlpQ0owdEdOeFNtYkJ3ZXR0dmIzV3lSTkVlbW1nQUFUZ2dBWDBucEdweC9XRk5YaitleFIxRFkyVHZkK0hHblFqd3pJengwYVF4MmpWRS8vc0k3VTM2Y3MreEt4NlFsS3ZTSGF6dm9TdWdHbkNDM2RLRUpUZE1jR0J1WURkWG53dGJvWlNOYzdBRGlWUVBVNWR1cjZ4bk1TVWRzZzFkT3ZUQmdhS2xKcUVoeUJkbllBUURCUU1DNFJMS0t4SVZWWUNRZGZ1NkxqVUZ4MTcwdlF2NkI2WHFHMjF6cDl2eWFzbzZFaCtoZlVOK2hYM2hBU2d6N1lvY1dxYmlGb1BOek5FVG82N2RUQWdDMjlaeWd4ZzI1dzFPbUM5dDAxbU9xZHFJT0Q2M1kvQ3AwQUo4VmQxL3R4QlBUREh5Z2VRU0dheUtKd1B2QXdldmxYckxiQndiS2VVVmJIV09YVHphUTNEeUwwK3p4TEF3M1VnWnpzU3VnZFF0RkNsTWhMNGJQQnVCZjlDZ3JkcUNCWmZXY0N2ZXRsY05OZU8rcjJERFVHZGc2UXRBRkU4NVF2cFAwU0RhanVrNkl0RlU5SlMrMGlYNi92ck1SWEovTXhhMHR2cFFZWTBvQjFIM2pIK2pwbFgyUmJzaThCOVZCYWZmV1VFWERMNnZ2ZmNVSUg3dE85QTlwWUJkMzgzSVRiUTk0MDlMVzB0cVNHRXk5aC95RUNFWDFxSUFDMGJmVVBMZWdkQUgxL3NKSkt1UDhZdFQyaWVzNkswWVlMMnY3T0MvTTE5MGtwTnNuRGx0dU9XcTZUdzh0cDhtZ2Z2OFR0SWU5U2tWMExHTGxQSVVQQ1R3bml4bXlXTk91WHVnYlQrQlNYcmh5MGtoN0FKejd0elBQdzA4K1BPdDY5dXNteDYrcjYvTU5QWXExaXJSTjdOa3BpeklMcmp6MngvbE1HeEhuWitzNlJqTFVadHAyV0R3QS9QUDQvd1ZQZmVudElKVDU0NzUrU2ZZY25TdmJmanpNNzlHRk5yTnVWOFpGcGx6Ykd5UHUrdUZ3a0hGMXo2UER3bWdMaFpldnZGL3gzZU14UXpCUEY3anQvZWt2VEwvL0pkYUdWODUvSGo1eTVmT2ZobmU3RG1YSEhxOCtLNWcxM3ZybGdWOTNxZTlqZHJtUHhaWE8vV08rbHVxV2NLZDMyemFHVlVjV0VSZFU4WlhSOFVsQ01tOWpFYVczS25Xc25ibjdUeU96aWpPWEV0RS9MeU4wY2tyUzhiQy9yQkpkOWxSMjBvckdxSW1HTFo0aTlWL01pNXh1ZmhjM2ZUejVoSDZndFRhOUtUbDk5YWRkdVIyZGw2ckw3dXFKMzZ3cit3UG91UFR4VXVNTlo1YlE2em1tM2ZjWDJiL1Z0LzV3N1ZZY045NjVhM0xYdG1HQkxNR1ROV1ZzZloybW1sTXYzeTVXYnB1LzE4OTAzM2JYTDE2OVRGSXE1TEE1NTNXRzRyS2dyUDYvb05NaGZMejdiT1BHcGM5djZEMTFORXo3U001MGhOdzFGMVpyVlJTRTNPenRDcmhzS2FvNXMveWdLNnBUTGw1aHY0bHFVUkhhN0tOcFB4Q2VkNkhsMjhOWlNYWGVyZHBWNjRlbjJBR3R3a3AvK1JSZm1tRytkcG1PLzlONXRxL3hjZThhMi94dm4zTngxSzJQeTNjT285VjNLcnh3V3BNZ0NrcHZuYnJLeXE3TVh6d3VPaVU5U1JzK3JzUGdqb2ppc3N0bGttdG41ZDRHN2p5LzQ3cTh6NGFyOXY3Y3MzYkp1eTBiRHFtL1lOZXRxL3JydFBuUDYxTHNkeG9rbWhxSjhURi84YW1YRy9HWDlOTEZ0Wm5xa2tSZEZsamgxWEdtK2Nubi81UzNOVzk0dU1kL0MrWkFXM1M2YnQvVGt5anQzcEsrV2psM1l0UDZMSjQvV2pjNmdLWXBpRXFUTGtpdHpTdklsZFhGVmVRa0o1Ym54R2tsaVprbFN4Vlp6TitJck1rYlJzRGdvYzgxNkExdFhtR2laS0Y3Z215alI1cG9RVG0vVTltbStBUW9IZDFtOFU0UXMxTW5lSS94OU5xK21vaWZETGZhNWMzSW5SODg1NzJ3cFNyMzc3U0dsK09DOXYwdjJIUmwzTlBhMzVIcmw4d01UVmNxODF0bFJaclhocC92RlRkVjNtMlN5Uk5td2ZHZnI1VUxoNkpyRFI0Ylc1QWt2VzMyemNPTEltS0dJYngyS3VaelZUbjdxM3JiNlkzZkw1Rm1CWU9wM1pXY1grUWZ0bmh0aldpcy8yUzlNbTIvSXpZdXdzZmQzMnVVanpWZ1czTGM2dTdyR2tDTlBabTlQOERWRFZ1M1JiY1BXc2Z2T1AvQ25naU9zZFBFbittbTVtejRxWHhlU0xLelpVdlBMYjlKbjVqREVEK25jeFFjUEgzUWZ5SXc4cGpsdm15VCtkWUFLYyt1SUxHb0lTZVFtRElBckZrVjJ1VVIwbmhyODVHRGZEM0IrN2RQYkN3OW8vd3VJTk5mRlRMY1lHSTFNVThwRm5QSkMzbEVGTDhIRDAxUGhPTmNtMXpUM3M3cXBqVzBwWmhURlQ1ZklBWjRSanlkWk5vNi9TZjlJdWtPcFN1cGZySExJc0hDT1ZFV292ei82ZmJnNlV1VWNkYlBOTDlsNElEaFVXQmllNmVoM1owUmlGcWxTZU96akUwUXh0eVRUcTBqbDcxR2kybS8yVms5KzRTV3pmY2JaS1JvelIyblhueFM5V3pqZjcxcFE1d1NIelFtZnF5Wmlvam42aXo4NU81WElKRG0zb2wrdm1Tbk4rMjNDcHlLVmwvTlNBNHZqZjZUbDhRNnBFck1vcFVMOS9UcWJERmwyMUt4WnppRzJBUzQvMkU3dnU1TkVwV2ZvWWx6Q2JBT252cldaZnVxTXMyblhSNnB4N2ZKbEsxZjJzSnZ5MmNwc242VG9Zajl1alBTRDJkMkE4TkNBdVdtU3JMbnE5N2F5bVY1OXpmTGxLMWYwY05ZYlUrVExqZVYvK01sUFhTVlJ1NFlGSEhsRmQ4MnNzVC9mTzZremc4TG1MSm9UbmhyTlNUdjQzc214eE0yODVxYmk4ejNNc2FIdnFJWTF2UU9YY0hTRDRyTzlpRSsyd3pWZGxoa0JDZFdtbHAzc0w2dVAxVjFPeEc1R3RWKytuNWVWUG1PZHI5L2FHYTVyL1h6WGNUQVhRQUNJRFZZSVJ4WEE0RjRITGdCZ0pJZ1lwcXdtYTZQYUtPZ1UwbGR0RU9YSXhlQ1h3ekZLRHVIQWgwQUF1UThFRVdqcXduK0N5YTNkRElLR09lRC9ZQnlpZUFkaVRmZzRvdGlBK3pmajd4S2JZeTM0R0tKNEkycGJhVkdrVjRWS3A0S2l4UksrWWdvd3hCSTJPNEhpbFZReFBmNGRTb3EzcUdOdCtMZUk0azBvYVVjVTcwU3NBLzhjVWJ3cFBMZjMwb2hQRk95L2lLQzZBR09aM2cwb0NiMFhZSkNQazRBU3hYZlVJNjFoUDZyd1NKSzZFL0x2WDdQRXhEOENUUHcrTlNiK01XRGlYd1VtL2g1ZzRsOENKdjQrWUcrWWQrbHJrNklITWFvS1lKV3psZ2FkU2FCSjNQakxXUzBCTFdpK2daY1QrcDQ4M255Y3lDZG9BNTRvZnEyK2Z4T2h2WDhUZmlleE9iSDUvaTFFUTJKTHJKV29SejdvTFFPdklQVGxxTFUzSGt2eUVhaGRreEJMTXZNWnlSUFJYdlg5T2VoV2pJTjRHRFB0U1dBUW52VzJ1RzNNR3JZamoxUnJNdlIrUUNSVWJ2S05pK2lUUmlmeUEya2MxTVcwcHlkTUtWMXAybE1MVTBxVFRYczZiRXFwMUxTbkIwMHBqVFh0YVRBWERCTG5kaUF3SHBSci9PU1RvandIVEFITnBlUVFhMVcrWURicGR5cnVZTVBQOExxMC9zc1lRZXJpT0JKOGRnS2s3KzlaajlkWDVnQWlsamh2UEFhQXJXVXJqRXNCc0VyaXJVdjdlOElLWFE3MjdPOXhQMGJiaVRleVZ3RTJhWXBqcEQzQTVDNkNUMXlGZERtUjlUZ3AxTWI0MkRZaytzdEw4UVZrcTV4cGdxam5MRUtMSmZrWFNEYWc0UkQ1cUdDdkhOdFNCR0wwNTViTVNLbzhTRE0xb0NocEFzVE9IMGp2VDFLZ29YYmNGRTlGTm9ETkhuZllvVXJTWUNqS2lMY1g0c1hzbDlra3NoVlNUUmhwaTRpcGl5SHpPWXVhbmNpL0tDbzQyUTFza2M4SzlzcnpTQ21zS0VVVFErc0Irc0s3eURtb2pUZ1BPK1ZsUmNRbnpWM0VWZUtwVFNZVFQwWDIvaDVESkprSSt2TGNLckpWeXl6SnhKQklaaElJa3BuMGdTQ1pnQXZJYlBhcWQwSllrUFl5Yzl3MEdJcVFlRXZwVUVpSzRWQUgvak5ja3BkWkVlZGh6MFRjRDVlUEtXTThKQTFDa1EwRVVNUktXaDZZNDZiQlVJVEVXeDhPaGFRWURwMkgvd293QVc4a3pvL1JzYmg4ekpyamdVRVlpdjBuM3RMOG4rSXZXdXpQNTdOTU1JeEZZQm8yaTZNQjE5dkcrWkJWWTY2OHFIa2tsNHRVcDFWUVNKUnJoOVU5V2d0WWVkZDV2a2RiQVVzakliZ21ESTAyNVdJYUFUaTZJUXRZT01iR05MaFRNMjcwb1pKckFlNDI5a2pqb0wrUWlBVDNwOVhUMlo1M3dZVHQ3TXp0VEQxQTB4cWMwcGdEK3hodTNMcXhONXdMclVrU3VDSmFZNkVCb0c3QkkwNnhTQTEyWmJZVnp6V0srdEs4cHprMklTTUxIMWk2NnhKK1FHemI3RlJWK2VweHIydnB3R0tLT3ZBQWFlWFc5NjBlSVJIMS9KdEtPQTczZldwTGREQ2ovTGgxN0xpTkRIVGx6NmJZRHJDM3Z3NEMxNDJWd2luemdHYkJzTmtaRGdGdDRWRzcralorODQxZ1N3OVFoeEQrVFdCOGJnT0VuWTN6cWR2cTJNSzd3S2t1TmJmQlNrQUIzTk9xdEszelBEWnBlRXFIZXJHNE5HOGpWbWhaaHRNa0NWTU9kRlM1VlpiYWJaazVXbStWU1Y0MUJXdTNvc0JKamFYVUR2WUdiZVg2RDg5MGY0bnZ5bGhmY1BQQTZMeDg5ZEkwQmdNb25BQWRySnhYR2RWWDJYYXZBZ2hzYlBwWWV2akFaU3lPSlQrd084SHBTVzM5TWd2Rm12Q2VHc0dxbzBMRGExZ3QyUmM4YXFoalFQaWp0ZmpWd2k1QXlaOGVBMlhDbTRSaHd0dUV4TXJHMzI3OGovazJJYlMyL3lJc2N6UzEzanBJYnMwc1VUSnN2bHY2YThnM2ZGNmVJZnp6RUl4Und0bjQ1VkNQWkord1MzRHAzQTN5TG1hb2lzSnFpbkRiWEdxNUZCcStyRW93bnhKUVBaSDBPeGFVL09xeFZ5YnNyUVVDZzB4LzlFNCtJdEtWdktyZ1ZtbmxWbUZsMWhmclUzVkNVWFhQd2xXTG9HcnRXWE5yWmMyc3BWVllWMVhTckpvQUt6VXp5Qm4wM3RSTzdJVk50OWFwcTFrTlVpWTBsNHF1OUNXOXZNMTIyQTdqcHVQVkNqTE5BSG9oQUdSZVdXcGZmRU5meTdRdHQ4T2ZqY2ZkWk80OWRXcnE0Z2FYMGt1dzhINGpPMC9SMHNGTTlVb0FsSE52TnQxSnRCd01vdmhVMFpCWW5CakgvLy93cjh4SzJ4SHMvcmxjeFlIdlc1YlpVRnJFK1FsbWV6OGxpZG4xWFZra0hjOFQ3a3B2ODBYazkyUVlNblptaFpWTTVWVE1zbTQ4aTFyenFOOU1VcmQya0gwcDA5eGV2WnJDV3NzOVJpNzd6dHgwRGVRWDBQY0lFQUN3SVBEMzM1NzlWelh2RHc3TkFRQ0FrU2UzL2dJQWVGdlAyUCsyL3YrYXU1V1REUUFrWUFBQWdBRCtHYmlPdXo5QWZFQzZaUHJ0ZHVlcG00UVFBTmZBQTJ3ZVBDQm5RL01hY0NtTkFLdzI0d1Q1UVZ3MGtKNFcwQXdDZHVZRlRiNjJKeGhnNm9ucm1Ua1VJajNQdUZBejVobVBZWVJ4S1JXWTU4d1FpSnNtZy9RQU5kaC9CcmtRbWpOTzA3S1l2U0luZ2Y4SnF1WEptak52azNTSUUySlpYcUdsOW1PUkNjUm13NG82cUdmdG90akpGM0N5UEtKZm1TWVkvNHFKRkljcElGOHJoaFRQU3dYMFR3R1lxQVQ0Ynl2WTBJckdyRDNaQlJnQko4RC9jd0FCUURjRGlRd0VZQ0RpYmpQQXJnczdnQVVJQUFSd1BGZUhjM3YxVVRBU2dZbWpISXVaMTBleVlKWW5JM0Z3S0d3a0FWYmxOSklFYVMwWUlRQ2ZTcDhGQWZEUWFveEVRS0h0UmJpUE9tVEY1a0Z1dytaWmJwdlo5VDVCS2xScXBGR2tRS0VhVWw0OEhwR1VFbXA1VWJSS3ljc3BpcGRGdkxwSE1UUjVYbXpKSE1zb1FLM2toVmhxVE1RMFF0WjVKWWptY0g4M0ZpZ3lZdEdwMldSeXVpaFRNTWtydHFtbDh1UlA4ZVZxVkhOSHYwSDFwcS9wZ2ZBNE5MUkFyZElaTmJ6SmVOeUd6aFVtbW9kTmFGbXo2V1VtbGhuZjBveDR3Z1p4eWFJQWk2UytWb3dlV2NCTlU3VWNybVZsbEZKR0dwV1NGVTJUN3k1YUtJVkVTdlVIVDV4a0xtOHl5akFxazVYaWl5Q1RyRFRsaUdNU0FxaG5RZnBBeHEzZ1pUL2crUnUxOHhwVmpjbDFmdEZNclorUnFmRTd3bFRQZXNwb1pzMTIxYXk0U2w4alUvRlpYTGwzT2xQbXJVcDlzRjNpWXhkN3hSVjVGRENGSHR0WjRLRmg4ajFDbUR4UEk1UHIrWlRKOFl4bXN0MHpkcGE3eXBTeHlwRGw3SFJadHpUWkxDWjFKaXUxbTIybnVIVkxkaXRna2x4THQwVFhOVXlDSzFLcUdXd3JwNnY0NlJrN2JucGM3RFE5RXpPTlIwczdhcXFLZEJtMndsbEZPS080Y0dkL1pwR1RMWGRVWVE3RkRuVlFJUTc1dUdEN05VeVFmVndnODVRSllKUS9ZOXNMcGQwV1NBdVkrWGFrNXRsUzNGd2JEVFBIWnE3Wk50R01yLyt0V1VubDR6MXR0NmVIS3pOOVdqUXp6Y3phTW5XcTlVekd4ZG1mY1JaWW5VKzZrNVVuNDJqSk1BNldSc2FlS1dDa2pEL0QyRmhJVXUwc2JCaGJjeU5qSXpFeTFsNldqTnJDVCtLcnRvSnVuakd6WEdEK2NWTk1QVTFVVXp4RktwTmtVVExmaTZjaXZIQVZMeGxQRnVLdCtFODRTMmhNcW1ndlNzWDJJbFVvQTFTQ1pDcVpUSDVPL2tSaWtGd0JyWEFDZm9LTEFIRzlPQ3FXRjZiaUpHUEpRcXdWK3dsamlZRGw3MCtnaTJqVlNhVnJ4RVcyY1JGeGtodWpQb21XbkhTT3owenhqMDA1U1pZZEJsV0tPdWtVUWl1U3U1WXZCOXZBaUpPcjRwTk9zMkRybG53S3c0SmlIVGJPeWcrc0JsZHdkWFd0bGlCZ3kzcFNnU2hHTndGd0h5bDEycldFQUtZZ3dmV3k5N2haOG93WFlRRT0pIGZvcm1hdCgnd29mZjInKTtcXG4gIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzAxMTAtMDExMSwgVSswMTI4LTAxMjksIFUrMDE2OC0wMTY5LCBVKzAxQTAtMDFBMSwgVSswMUFGLTAxQjAsIFUrMUVBMC0xRUY5LCBVKzIwQUI7XFxufVxcbi8qIG9wZW4tc2Fucy1sYXRpbi1leHQtNDAwLW5vcm1hbCovXFxuQGZvbnQtZmFjZSB7XFxuICBmb250LWZhbWlseTogJ09wZW4gU2Fucyc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBmb250LWRpc3BsYXk6IHN3YXA7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgc3JjOiB1cmwoZGF0YTpmb250L3dvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFES2NBQklBQUFBQVpJZ0FBREkwQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHb0VZR3lBY2dpWUdZRDlUVkVGVVhnQ0NEZ2lCZkFtZkZCRVFDb0dHVVBaakM0UUVBQUUyQWlRRGlBUUVJQVdFZUFjZ0RJVWZHMkZaRmV5WUlXNEhFSlZSbmNaUlVWS283SXNpMkRnUUdMbFo5diszQTA2R0NOWFFlcmU5aGpKUjFHUlF0d1YwK2pmakU0dmpVQXl4Mi8za0ZZMWc1VWFwb0lUcUpFVmpkRFRxVitnYUNuNnpmTG9ZL2REZ3M2R3RXV2o3Z2lDS3pSdHJwampSZjRYRnh4OWozNnVQNzdONDc3NTFUMGx4amQxSGFPeVRYSU5vMC8vWjQrNUNqOFNwRWJ0SWlZaFdQSEdnb29TWTBsUXBWUXMxVDAzVDl5VjVFS2tib2VLcGlBY2VzdjBnMyt6TzdMKzdBaW1FZUVBU0JsSFdvdkZOamFoc0treGQ0NEhqZ1hmOFQxdWxlZ2w3Nzh3eWZOVVBOWE5Wemc2d0I4Z3diS25YSUExZFhXVGlFTCt6NU1uWUc1cGlEOEEyWllrMVJNWEV3Q3JNSWtTSmxqWUtyQURSS1dJQTRyQ3hadlFVYzlQcHhLMWRxcXQwMjdzVzdiZitqL09uQ3cvUDJjQjIzZlYzSElmMUJwYlhQSSsxRjBocTBYN1ZmYjczWWdpZGl1UlRhcGRoc3BSanlnRlRVNkFVeHk1YjArM1VkZm5EbUovbTdIc0QrQWFTbVNSdDB2SnVGNmc5WkEyc3hMTkhGZnFUMGwvdWFYWDM3MXpONFArRUdZTGNWdHYyS0c1SUdad0duaDNjVmhkalZGWFlWaHNoVnhKSmRkdFJHWFNxRWtNSU1HakFEcGJCWXhHQ2pad3hVYnErSG1lTzU4Zyt2bDdHeDltVzBaako2Zk9wYXJVRGdCQWhyOGwzZEVpVnVKRVhVdEdsMUZSNzF6U1lQeGdBTXdERUlTaHBDWkxLWGorSnZrQXEzQlBsSkZGYVA2MjBLVmRiWHNoVlNBcU9rcDB2eDNLcmUxdmU1VExPLytYNDNxZlRFN3NEb0xrQUd6U3A2TXA2OFVKZGd3NkxGdTBsdGtGS0EvQXNnY0IwYlB0MzJXeHVaM09kbWp1S0xGMDUzSGVTRjNacCtVUHBWU2hjSlBLY3BENkdab2RJdkxGdFNqM2ppaEk2ZnZycVowc3ZwdmJRd3E0SjJXQWl5L2lzYUc3RS81V2ZzZG1yazhYVk1veUpZcUNBMUJPOSszOG1DQ2hZNDBqTWl1ME93cVFqeUh6a0NMSnpCSEliY29NTUZjTWhSekF5UnpBNlI1QmpReTdQdjduanp1V3V1NUc3NVc3dXZzZTVwOTdrUHZva3ZrQ080TnRyRS96eUYvbTRBSUR0NFY0Q1hKYURFeGVrMTRNcE1naEJZNy9YYk1acmQxWGJpVm1QZjZsU1hRcmYxNFI1SmZPaDF3VTU2aS9yN2ZUcWNnVDJyQXZRcWZmMDQrSDBCQ1VGRG5rK2lWUWM4bitXa3RvYi9sdVFaNU9ZMUlrQzBLWHZxVW9oZ2NFYjBwby8xQUNER0dpbFFJTkQvQ01heVFsaEtUcmhUaC85OHNsdm4vM3h4Vi8yWDQwU2JhQVVTam0yMnRhOHNUVm9OUGpYTXN1UitPVXRVZU9wWjlYWGYrK0hEMzUrNTJYS2pUY0JUUzhOSFFaZ3d2SWlZRjMyS2ZQeTBMSE0xWGd0T0xuSjhXdnIrMVI2WDNJa3NPdHpkL0gvdTBIWVBoWUMyUXdBM2EvcUFUd2FaRFJNQitMN3kvbWp4cjljWFVnSU1QNjF3bW9LeUo4ZWJVR2NVR0JoejEzdjdWRkVJaGNnQUFGRmFLSURxcW5VcUtKenRBSlFoSEJBY283R3J5Qnk4Q3VoVXdSSFppaERGVk5qV1d5SlEvRTJQb1NaMGlOcURMbUV1TnpsTXZzNmNuM2w4amQvR2IvZG4vYm5BNU5kMytJTEJDUTBaSkVUdVpwOGJkVEZxNzIvUnBjOFhPNTBtWlo3NmZLYnRrMmJJNSsydms2b1lEUDk3OHBGRFAvLzNUL3NCbWovY2kvNzN0UzJxcTFuVzlxakc0OWVQZHovMFBkaERqejR3c0pTV0p0bnZBWGdSYjI5R1Q5NjY1M3ZTMHpFMU90RWI1WDlpTUg4U3I3Sm83dFR0N2RFeDlqK0dyRGJYcXNldVoxbWlIM1FXbVd6R251S1g4NFpaUlpZcDhRUzYwMnkzZUtJTmNzNld5M3d6bXdUb3Q4c0prRmprNzMrMjBuVFNaMjFOZ3VUUFE1cHFqdnRGNkdDYUlZUXNsaldGTFh1WmlmWlpwODZNeTJ5Sm1KVm1XYXVHbmZpRGxwekxMVHlaZWVEM3BrQTJoVE13ejdTRHhNeExiM2E5dU1vTHJISDlsUXhldWkrdktTUlBic1ErUDYrdzcyTnlnYUZYRlpmVjFzanJaWlVWUjZzS0JlWGlZU2xKY1ZGaFFYNWViazUyVmtDZm1aR2VscHFTbkpTSW8vTFliT1lqQVFhbFVJbUVRbDRIRFkrenMyT05aQWZIZDdOVXVESDNGZ2YzYXVwNUFkSGRYeXZjaGRFRFBtam9Oa1M3TWlad2RpMW10b1lyOW5BZ3VuVzdiRzRrckd0dmhjS3BZZ2hkdDlxTU9IQnFIVFVrbUhRWXVXMGNHdkZtengvcW9CaWw2REt1b1dIUnJXM3Qxck5lMTIxR3pJQldpUWJUK0RvMXJqVkNSOHZ6K09mRXpSYnp4aTFiTml0WlczSmhaUHlhV2lFcm5DampEcWdtS3JqYXVFL3VueUxLMFJiNmFEQ3huZUY0MEFhTnpNbUZUempMMTYrcXdDMUpJTFF2Qmc2S1FjT3N5NXpZOGViajJncFowUGVWOFZGYS9vbHNhblhFa0dSb3V6SDFtU3pMKzJscTQ0cnFCODczQytFRklmQ3ArdHR1MEdVWVhYQ1JpRWVkSlZYOVZuOVdIZEh2SzdzbUpFRzdJV0Y0Mk1Wd3Rwd3laV0ZrS0x3ZUNXNm9VMk5VcXpYWW1vczVhWlM4NmJtNnNlblhRRWhZT1ZzNGdTOXN0M0RJMjRQN0tFOW9USzZsUEJWL0dMWC9ZK2dQSVJmUXl6REdrbU44Y2dScHY5a1pWMlZFbzIvdEJSUkkyVS91d2dXRXZIOTNXbjFpazdxVCt3czNhOGhuT0tsSSszS1l2TVY2clZXb2liTE1tMzdDa2hYQ0k0RnIvbVJPSUp3REhiaThFYUROdjZwZkZNSHhicEZjcnpXN05QcHAyUzVsWTduallIRW8xTE4ySHBtR3RrendZcThRY29xbk4vR05qaTZ0K1IyV0I5bE1QMFV2Ynl5bkpOTlJvTjlOU2h2UzVWQ3lJaXA0T3p0KzNaMFFxYXorK3ArUWhKaDdrZnJBa0ZVSk81N29CN29nc2c2OEN6SC84Z3RidEZ6VDJTTUYwU3dRL2RZYjN5RVdzSnlCSXNLblJnVXh2am5zbnFOV2dtYWJMTmVHNHlTZmRNT0wxMUJzSWNrcTZER2pvbkxPSi9WTkpxTnhMODhhalk5dHQ5Q2xWdUpDRjJyNVJrcHdaWExWbktrRmV3SVRCT2duVjl4V2VJM1Qwc240VGcvMU1RdGQzZ29JN1NNbXBaZVM3TGs5a2l6WHN1ZVJLM1lCU1llU2pMM1JDODNiek1ycFJhQkZ5OHd6STdyVlI4SFlpTllGTVRjcjRxZERaeVVPbTZ0dXRqN2tVNXk0ckV6dFBMeUVrTUxaQ3d6dzl2aU9NSFJoSWZrK0owbkU2bWxoNWVRZkNwTVQ4djJQaC9BOUEwV3hvYUlubUV3cXpIdmJmcG1FZWtvaWNyNU5oOVlUcTFET29KL1ZOT3hhSm1rVUR1YWFmMjU1QmJhZURDenNWZVV6YlkwOVdwNUlSWXRPV1pQcDJLSE15RGRsbmFrTFJROGhkQWdyY3BvMW5pVk5sR3lZSFBEWVZlcXc5SjFPSW5Tcm9zaE1aOVJ5QTQzVkZtelNSQU5QRS9SSzZqMmNuMUF1d05ja2l5U0hKTkN0QWZiQ054QW1ONDdWdk9XTGNjMVZLakxWNEJpZENRVXpxQ2tDZDFpNDZ0MEFoL0J0TEdLWUhHNCthVkVrVEFRTExpK2tKT2lia25QRlF6a2FtQ3I1VHhZTnBSVG04U3NvazdBQU5uemxiOERUaWJMMDZ3bzI1MWhzR0RUd0w2T09IN2ZrczI0eXpXZlNJQTJoNWIwUUFhRSt5dEZRdWR1cnFEbFk5aFdPc1pMQVFoSVU3MmdJVFkydXVBNGdUcUNpSDNMWHI1SVJ3aExDV1p6cGRtNHRCb0JyekFRT3lNa0huSFZvZ1Y3QzArVHNpMXVlYmlqd1E0K2NjS1Z4bU9HYWlKSzFIa1VIcXBNcjcrZG9SQ05SNjlYYmVSOWs2NktkYW9MY1dEZlJsUWR1SlVBbTVFTlpJN1c0bk50bHcxSTlIWjZJSHZOWHh3WCtFRWc2VVV5dXNMNTdpNDl6dFdyWXAxcm1QTVZFZ2NkL1lOQmNwTWpFMlE2WEJXSTlzQTdJVm9lN0xkZ05ORlFsMDQ1eW1aZlZ6U2FHUW50VnNhNkZmN0EwYkFQRERTY1JsbWJWUnM4bkFkbkZTRHFab2NScFlDa1FKak81dkV2QkprYjNWd1NiMm9pbERtZXRVUk4rZWxKTnNiUHZyQWFwRnVIRHZCUzM2MkRFZEtib1YvbHBsMmExdUYyTCsxNGViR0wvaTJyd0RnaTFRdmxsam4yU2k1S043a29DRXhrT1lrZ0FrZjRheDhVZUE0eXQ2TEk3Y2tZbnMrQTZGbVlnNjl3V3ppMVB0Z3AzQ3BWOUQwQ21ITXNtVjJycG9FejQweENjOUZxdlFaZjM0TDBvSkR4cGJGdkFTM1ZCbTZFTGVPcGEwVVVpS3lrajZzaWx3Vi95VFZkYXBLSVFHTmdWYTJLTHpSelRNWUFCRmhqeDlONFFTZ21BdUZKdHZjaTNHVGI1MFlVSFJ2b2FpSGdjOUxFdzY1RFNwRUpZWkF2Y21sNFVnbHhwNm5idWJUcjRSdks0ZWpidkJ3MXg1Q3BrdGVyR1dsMFRtaElzZ0Q2RVI2L0FyQnFaUG1Ta01qTE53SUh0bDZUekMxTFhQVWdJVGhGdkllTHAyZkVjRjFvK0RHQ2VPb0N0eVE5NGMrNkFhNi8vUTl1bm9KcHB1ajhLZUFrREQwSEYvS2tEOGh1TWRPUVNYTzY4eXczZGQrQ1M4bC9HS3hodFl6WlM4MDIxTVRVdTMvSmpuTGx0ejByM24wV2ptOUo5Q1NDeFZrVUQ0ZDdvaUlKNllGWnVFU3lrWXFNTitjM2pQOGN4WVB4eEhpRFNlazRwK3l1dWx1RllmTy9HRTJPd0xTcnpML2xnY05WOGJzMVZMR0JUM2IyTFZOUmxGL1ViWjUyRFRpQ2o2emx5UUZIN1hrUXdtRFFRSzk5a3VHQThua25sTlZQd015Zk1mK0l4QkY1djY2ZThaODdhWktLemdkR0ZVenpGNFlQTFJVTThwZW0xc0pROUxZYjJRQndCSTB2ZXNuVVEwWi9wUHJtN29nVWd1UWhSaVJQU0VkeHlaV0g4d3NKL3d6SmNhUXE1cGRzNmt5LzFiWnc3WlZQZTNyblU1QzNHUHVPYkZuV0JtLzhKU0JxQk0xNXZhM1NMNzFzZUVVYTU3TG10T0NaV0NNbkdxTjNzZjkyYlNVRUJ5dFltTTNPUXBJY3V5bnExbFlEWndhN2F3RmhHdEIvd0NZeUpRYjU2Z3dlRUdxSlRjNUZndXhocVJaK2lPdEhaOTU3S3FOOGhKT2VEWWpNR3JIeHdVRE81aFhNTEZ2MzBzMzNJNkRCTE9rUXNIUTlOVFd4MkxqbitiS2RkRHFYWWRiaDNNaGYwUmEzNk1NK3lKTDF2T09rY1NmYjNkbGV4ald1NTk3Y25wclJRb1kyVkhremNETGNaMmt0bkJEaXJERnlXaUMrRyt6b2NSdUhPZTdrUmZYRC9rQ05jUWpaTWhDb05YcDdpbTAyK1cyY0NQM2t4WXVOYmVYT2MrT2xFL09XVlY3azdRWE1lYmlPYkMvYlFlb1BYZFUwdHo5Uk9xZmZiNUJ3T3Q5L1ZDYkpjYU94UzBNS0dJMUl4MVpSYVlQZ1A3aml1azN5K2NaalVVbDUxSkVtR3g1eXJuamxlVXVXeThTUnpidS9YVlZDOEkwQWZCV0lwMVp1K0NCWDRHWjV0OTYzNGdycHFpSmhGV3BtNGJSUlNJb1hVa28zeU5MUHRvNDcwSGIwMWk3R0JzM3c1bnFqQU1JbW5XQXJCRmtFRmJMeXRRbFhTb1NxNlRNVEoyVWlGc1RaMEFBNzhzLzZlV3RDMVdOM1NHdWlwS1FweFcwcGpMSTVtbmVQeVJpcFRvWGtVamxoTlJiYnVIaE5USXJPWFpGOHNhQXR4T2d6K20zMGJYUlRYZXdCVjh6bHpMMGZzZGpNVUlFbENUVlBqbXcxOXRlMmhkTWk0ZlRFdUhJK3RUSjR3MVVDY3U1WDdTRTdDNXdvMGszdXFhTDRHRUlTcGxVTTVRWmJFNENleW1UeVJTa0pSblY2M1RqUTByaFZNZWJMYWJKNjE0b2lldENDQjVZS1NnLzBqNzRpR0JrSW45RVpuUVN0ZVdwdURlR2pJaFhUU25XNkRhTkN4VWdoSTJQTkN5QzFGV0NYVEFYeUFyS2dFK2NWcFpjSFBUMjZOYldHSjd0NUVOMzRuMUxwQnM1bklQVWVpYmhNKzQ4Y0xrWmNRM3lOV1ZDUGIwaHJUdnlPVm5RdTBMSENHRzVEeENabm9HeVJObHpSa2J3Zm9pUmFPRW9jdHEydktYdEY3MktOV2NaNjE4eHZoaWZuYUQ0eVVIZ0hzTXdsNkZ4YzBvTU8xNnEwMmJhZGNIZ0taQUhJNCtadzY0Uk1LcENOYnFsMWl5NlM2K0FqRE5Na2lJY0l2ZEFML1lwZTNRdk9jM2M5VFJqSERCNjQ2dnhFalMzb1FjMUtvYXBhaHVkVmh3NGpiZEFhT3JQSG1ZLzVJd3Y5QkRubGUxaVZ5RUcvazV5elFSYWQ4SmczZmlNc0R0V01CQ09CNUhVZWxpeGNxYm9uR3JpOFlTU2E4SlkwRHBvU2FXL0UrMzhsbHlMbTZBTmJOWDdGYlpEcG45ajBORWw1M29LVnNPTUd5SHFNbEFldUFiNWdTNi9KTEQrdWlPcHhCeUQ4Mk1rMm1OUVV5UThUVlpPeWNraCt5a3hYazBsaXBCQUp3cFdEZEFCazdMbFlxQWsyeVFWNUpWMVhIS2h4VktUMVd6MFZ3cXlHTER5ZCtXV1hXdWpza3p3TERFUVArR3VoaXg0eU1KQnRLSldKV1h2Sng1M2hmQUJxVkZMY2ZUYkdTZVp6cXNnaFpHUUlpUUlRRzFhSVZlbjdSd1Rtd0hKc0paTnpOQjBaNUxDaDdwcC9ZUjNWWTR2VlJHM1VDT0RwaytOYXBGTGI2dGxQRHlSaGExZE0xS21udG5MRFFHWTZNTTFLdStoVllFNGEwdmxaaldBQURiVmwzSGdmMTFXUFd4b2VaeFNBUzQ1bU5TS2lpOUtjZ29kY0JTR1czYU8rUVN6Q3VDd2JvcSs2NUdOMVhyK1UrdjNHaU9mQXZyakw0VU5MQ3hZRDBCSU1WZHlRNWZqc1dOQ2dXWXdydVROUU9PMm9GY0JsZlNEWElqOW9idnFwck45SXljbXI3enhJYnNxVWlQeURtZjhzbmVFNWpQNENQb3FxamluNFRFdndoZGM5eEtZUmpkZU5sUXFxVjVkelVOU3NmNDZCQjVYYTEzc3dIWDV5d3h2cXcraUJPN3BZQmllbkVRMUZrcHNhRGhzaExOUWdSK2dBU1cvVktLTnFMdWNoNHluSktJNzFjMlBDcTNSakp6VHhLdmlnMFZLc21mRVZ6OWo3MmJiSjZCRDJvQk5rRkRNMFBOYnNWa3hKME5SYmM3V3lTdTBEZzh1ZUhPa1ZmeVViR01RR2ZpSStSamgrc3FpS2lqaE9tMjRJTlZ6eXFWTFJ3UEdwNWs4SWdPeUJPRkY0QmtsemZDMjJrd01QZlB4UHdnYmgzdit3QjUxR0NnNi9BQmpJWkg0RDZ1Z0krcUNiQXJTV1VuUW5jUzBUMU9tSGhPcFZNN04rMUF1N3pad0lQUEZTZkE3WmU5SEFpWExRVVZZTnkzNjdjcng3Z1h5eTNiZXUwMEYvOXMvY2RYZUJtQzR4dkltaEJVN20rTmhGVVJuemZMWmlPQ0VaN3RSWXl6V2VzS0F3SEVsM09PVUUrNVM2ZnRrbXppT0hCK1d3U2xvcjZiWGZGRUNHZFpCNVVDWVpudis4Y093VmtETVVWdzJJR1FXWVJPTFpTNXc4M0ZUWTlOaU9NOVY4Y1VrdFFKNjBrVk50bDd4eUI3OThaOEh4NnRsK3g0YXp2Vmx6TjJsV05DaTdxYytNYWhwYmNmUW1OS0FucUhLZHJoeUsvN3I1cEJEMFU5ZEN4Z0tNWnRGTnNWbTBydnpXNDJRMzdSZE5rdkh5eHQ2Q1BjVzNQT2x1NkhhTW5RWU9aaHIvL200Rno5QzhhZ1ZvN2FsdmtSUEhvcGYvdXlyN3NsTzk5cWJyRGh6dURuNExiL1lldkZmeE5MVTcxVVpoR2RENStVdElMaStkZTM4S1hSMm4vdmJqTW8xKytwK3FaMTdKYm9ndXFzTWx2NXlWejEzS0EvbzFNZWhEejlYTVZyUFJkYVlsYlIwdzl3L2d6bDZBMXM0VkF5cjJXbTVlQ1Y4aEEyNmFQK0hBdlBvRFRzOHpOTmt6SkRjWndCeWJCK2h4Rlc5Rnd6SDRaUXQwYmJBNW9ramlwNkdJaXJwdzVOekREVXlsVmRITXRxbyswRUNYVlpBd2VwOVkwSVFkR3FucGQ2eGZyd050K09zZlkwRXpNOGc5c24zVnZqcDJwZ2JXQ2Y4QmdwQ0hOM1Znd0dxNkJZZkY2K25MZnBPYlFPTjlkWHRYSUNoajVvbVh2cDVsUW1hdWZjaWZtdHZKMTJ6UVRXZS82Nko1bmZueHFkdXBQaXAyL2VmVHVZYlB1bWJudHJ1eURVOUQvNHIrTlBkY25XY0FkZzdTbnZpREkxcHRMVXNZYUV3bFduWjBYQk9rKzJZMCtKcW1ydk9KMzI4ck0rcTJubVdKRGNLb1FWYW4vVFYxT0tITFVPUDg4eEc4N1pQQThxTEQ0ZVFpTWdISjc2UEw0VW13Vm5KcXBxK2NLUzdYM09lb3hOYzg2VTZCYWpKc3lUTWxwUzRZbllraElRUnRaTEZISFh3bEo3blhXalVQMExDYnZjamU2eWEwS2UzeVlQV0xUOWw1UTRuejIyUHpLNmV2YkYxUnpxWFJqNGxPZ011WVdndXhkdDdZY1h2TGpHRkN2QTYzblFVVHpKZzNqSTQ4bWJmQWFJK0QvdHR6RHNJQkp4eWd5T01NR2Zac00rNU5zS2g1MGNpeDh4dnpSR01XaUp5VlpwSnZKZjRNV3VtR1JtNHJ2bHF6RmRXR3pQbll5aHRQbTJQZTFma0Zqcnp2MjZqeml4MXh0d3lsQmFna0toMDdwYjAwcm9TY3Q4K2lOSkpCU2VDZ3FWNFFZNmR1M3BWeml4ZC9yN1FiMTdtVFNaVzVwZklITUp6V3dzazlkYm9XVGNDZVN5cExpMW1EZmhoN2Z5bk8rVUpRZkpSbS93WGd0TGdncFpTYjBubHFmTUpSWU5MOWZhWDB3L2tOeGM3dmxUMzBQcGlPWDVPSnpDNU0ySnVPUDlmY2dEM1RrVkhJYm5ZNjFKMnZ0QUVIbXR4OUNiV0F2b1BkWnRkN0p4UC9NNGdHNXJ1dmFRQW1SR2t4Q0h5WVFwSEJvMVZMNm8ycnR2ZWF2bDNyUC96SGpldTl6NTJkR1VrdEc1TGNiM3F5Myt4ZVA3VTFtelBxekhUcXBEdE4yQmVQL0ZGWC8ySDFlUG51N2VhT3hvYmhvNkQxc1FCbGJIY0YzZks3UDdkL0gxTm55OVFpOHlPUmxNQklGQy9XbmVtUXB5a3VUOWVjWWl0c0pqbEJCL08zTEI2N0ZxSW52MTYvQkgrbjU0LzBoQWx3NE1DTEsrZDdPclN1RjQzckR5MEhjN0xpVVJFb2tSbmpQTDdRTzV5TDV2WWs2V2VXVmxSVWlDU1ZWUlhDcXBxcUVrbUZ0eWtMY3M5dEQ3Vzd2bVVPdWNHTm9GaEs0Q3kyWEorOG9LcHVySy9xU0lwZWtVVnBBQ1lFYXNyQVlqVllSci83WkdqSWxMdG5RMGlvQXV6eFp3QUJkS3J4OTQ5dXNRa0UvZ2ZORzM1TW01d0ErSzRNVlhqaUxJdUphUnpFelcyZjBCR0l5eENjejVkZlB2bGdXN1FwMnorcnNuVUtZRUpnckdtQUNaazJrTXVTVnRmTzNyczllYTFCcUNnZGJWOWJFVXhkNC9xTCtlR2tRamszZktrK1ZvTlZXZ3pvQ2xXcEV0YzQ2VXlTYzRwdVVNcVpKRGRQZnRMbGpmTVBmaHphcmx0WG9yLy94WWQxZmZMSkRXN1F1TjB1alpnSGN2VnBZbm1SbHFoUVl4ODBucWpjK1VFeDNQdGRRL1ZPSUd4RmdibW96aFVKTzNNeEZ4Vnl6SGwxZHRuOHlQZGdEMGlTZmZ6K1ZVaS9CZ20wUVpVRnNqUDhtcGpFYVd5VDBSYlFPcFZmRTJFWmd2VEt6V203Rk44b21uYjhyaDhGT3hXVTNsYWJTUEgyajYxQTVMcmt1UGFSNmFXSnpkOTFyMlV1dU9CaElRcTBkYjhyVlZSRlFBV0VJcVZoV1M1WnpqMVVxdEFLTEhKbkhwaXR2NWxsNU1kdWpXU282NXVHYUVNSTVOLzh6MGdac2lFN1JXQ0RWbUN4aDh6N2RidmtrNVF1Uk5saUFtZXg2ZmJNSlpWRVdWdlZrUml6TEVOQ1VVdTdqMGszemNqRzJIL2lnTUhmR09OTXFkczNxczRZLzRSZEdFNzZaRjBHeWNMb2NLd3g5bVJUOHNSVzFjcWx5bit0czgzVE1EcCtwcG5XRmYrUEpzMGF2OFpDQVU3WTVSZVNlTWNzYUxJRWVDOWd3b2J4VTlXS3pjUGZuZm44bm5acWxrKzhYbThENDFlSGFCNGN5WlZHOUZzVjJ4VTVkM0VDWkg5Sm5FMklLWlltQXFGL2xJc3J5ZDhQNGVyaVcrdnJIK1hza3V6dlIzVng5Z1habHR0REltT3BDUndHSmJMWTRnMGhMNzVFYWp4bms5NVRvTFlyMzVQcnNXcExvSGdHaHVUNTBYVTRkY1ZCeFpaVWR4OE1PQWNNMkxueTRlczdTeDV2dEE5NzZVODl1ejF0NkFTL2UydHJJazgzVSswM3FJbGowWCsrVzhFek5hOXJWSU05ZzMzcWp0K0JaU3ZMM2wzMjhYWjN2U3Ivc2xOdFozL3psbC93eC9rTDJrV0V3a0ZlSnRkMjJRNm55VC9sai9kT2J4S1NjN3VTMGpNYXNWZVZJZHZCQkErVEV4VnFyMFJRemhYVmNWb1djRCtBNlA3ak1hYktsUW5QWnoyTUZKalVjRjRpK0JxZ0xycTZaMnZxMGhDLzM1bnExRWx6R3JJWHBJMEVIOHh6SlhsaGkvSVBoK2Z6aHpEYzFzTENvdDV2NkpxOWVtRGZoZEtTQXRxUUw4WWhRSXB6dVJiSXI1L2t1dkFEZVVjRnJKaWgvVWVBbytLQ2xBSnVJcTg1bnRKZXNHRmRxWjdScXpVQ1pFUjBGOU1DNG5hN25LajYvSU55bUtKMFVyQVBGdURUNUpGNDFFMFp5TnJyVDdMS1Zjd29MOGFteVNPdzZLMUFXQzNkNHRES2cxcDhxazM0L01qM1BSc1V5NGJPQjNVZWFkQXdPWThJMHR1SUlzdUdzaksxZXdlOVZlMFUwcGRBWnZNOTVXZWtaMDVyVGc5S0I3OCtaRDZvOHpDWklvTkhxcGJhcjF5QjNWYzlYK3Z2L2ZubTlaNW5IdmtQc0NHSUZ6NWdiM3VkVndYYUp0ZGNmaVl2UEt5QW5iVFVDNmJFY0RJY0dQcHZIQ0JRZEtlSzJ1S2tQeE8wcWRwOFAvY2VRRVFRZ3h4L3pyNkFkM0ExWlVIT25LbzVkYzV0RDlsK0pWVzZFK1dMRE01U2kyWnkwRXUyTExQU1BCK3NHVHpqcUU5c2VaSTlzU00vcm1kZUszN2ZKcEV1WVpkczZmdEh5SHZEcjdtMTNvZnE2WWxFWjNibkphQktqdWFhejYzQTV0RVYvTHUzVlgzV2s0ekNXSFR4Y2FHRFprMlpoQ20rMlhUQlNrK1A0K0xUNi8zSkI4NjJ2NmZvZVllbXUwZG5Kd1pDcnV1NEFWVjdOMklESmdTMW5BTDY3NVB0V1lrMUh3UG9lV1hpNGd3VDZrLzd5dzhONm0rY25YT0tKaFA0UXBXa29hNVNuWWc0TGtOb3NFcXJZVjJmSExMQ2pkQ2c3VjR0bGZ6b05pbkJ2cXB3Uzh0ZVd6djN4aU5hSWw3YzZFUDIzWG9SMWhJMmJ1OFRWWnRhSzkyeUtMSnp3ZWhXVnBhV2NiQnZvcDI4N2QvdkVkcHF5OHZNeVVZaXBNblp4OFJHRVNoYWdYdWFtVEo5RkNEWk5RVnd0MC9kbkx1NUdTV0swZWt4Rlh0bWxGZ1lsV1pXNkM3L1NEY0dCWnJlaU02MktuU3J0NkpCdkpKWkFubW5xY3pvZGkxeHNBdVQ1NGJWMXpUL2l0Qno0TkJTS204K29qNE1hVzRtVC9USE9lNjI1eisyQ0V2QkNDVEM5SFJacVFBZGxtcGh6OWcrZmxTZE9xMyswZjNGOFdPSExSQ1d1SWtxVjFOUVdnOVVNQ29tUEF3VkZSeUlqZ29MaTBIWUtZM3ZvVmhSWE5ZbUdCaUZKTVNSVWE0dUU0VTBvUEM4UUhSTVNFZzBJaXdRaVdBOHB2ZExRZkFEd2xOUVdUWEM5QXhKYVJiZkd4aHhOY2d0SjlZUWZ6OW8rQndkRjRWTkNlVExhWGRsd1ZxNEpabjVXV2JsOUZJQmkxWEVUeENhc2RQeU9jVkQ1cEFyVDRlNWhXbDVjWlpDaGpETG5GMmF4U2kzek1yTTR4YTJRajE2MHBWc3BZSC92bC8zVTFNT05xTFR1bnJWUUUwaDI1SU5pUTVobTFYeGpmVUZiYTdZWVdELytsbDZJMnhWcFJtcDlaZ211MWFZbGhxRVFvU0V4TVlFK085dzlvbENnSjc5NXdPR2kxb2JNTkZTSlo1UHRNSEU0SXRCK3p5L1NyUlBEa0VTSFh6Z0NVNEVlSnlUdlMvKzJ3eURzb3FtVkM5YXRoZXNrNk5mK0RjMi9uSDJFUDBvS3BGRHBscW5XVHhHNThVVWt4WVJoQnF4WkR2M0xMdERkMW5sQy9WZHc4ZTZMWFJXSVdjM1RqV1hYL3BhTUN3KzRocnI0RFFOTUlNbXF1ODh6MVExc2R1akdWMzFRcXpyc0UvdWltYTh1NERUTW80dUtXcE5IRC9jTDZzYnJYZVgrOHZmd1ZuN3N4RTJSSU9jZ21HcmZyT3RoemFZU2NXZzBGZC9wRnJ2ZmcwOHU5c0lKRHBORWFGZVkyZmhZNmxRY3hCNHFYckp3N1MzQklSYmlYdUJxRWFBWVo3T1d5V0xYbWhZdUd5bnl5VkJKSk8yTFE5VkR4MGZxaGxKY3BSRUU2Y3MrZ0M3UFF5U1Vud2IrWnMxbThjM3F6ZWJXeGticTNsZVZrSGFBNSsrdXAwYXJKSFczbzBmUUVSTkFiVDJnNXJKQ0w1eXJtMnlhNkcxRTlCK1hQZmpHaTJFanJJajY3TW1WekdOb3doNWtXR1Z5YmRIU1dPb3NDdmU0a0ppVHBxT09IZHZRWjhCT1RXVDBSeWIwRi8vMzNmcDFwOUtvMUp0Ny96TkNtK3NvUWpLVlVQdGlzeG54eVpLZkMwS2FKWDZUbDVwTVdrSVVuQTJkN2tXSmQ5MmNHVkJqSlRlUmVHbGZ5ZWFMMEFJSmd3UU5SamsraGhtL3NLeDBMb3NjY3BrQ2w2RUVCSkJlaHhuUy9OS2w1UUsrRldpakZTNUtDTzd2bFFlak1lRWhHR2kvUU5SMFdFaGQ4Q0pFMS9QTWlBejE5N25UODMvUmdHMGRuaWUrV2w2cDVRaHFBMGptNHJ4eXc4aDFhS3IxWEE0Rzc2TkhhczluV1A0ckd0dS9rbVh3UEMwMWU4eE8vUFAxYmtIb0s3SnJmTjdaYzNuRTBOU0R4YWV3Q0hRRXhGVUV6RjI2YUZoY29LYUx5QlkyeU9jeGdOaHFTMng2NTBab2pKMVp1eDZjMVBzT1hXNmVHRjRHMHFiMG00aTlHSUhXa2tTRmgvcVkvM3J5RmtTRE5ld2JIM1ppMWZadXFtREJTcHE5ZVRtMXFaeU9vMTBWS2kxNFVCZVB0S0w5NWVUY2c5aTJMcXNjUkkybDlUZ1FsQWNSMjdPckZkZDIzM3Jjc3gwMVNja3lWeENkYmQ0OUl5VXpNQ0NkWW9LRFJhSUJxeGdQeitpWTRRMTM0UWZWTzVhV2M4ejFkdTQrTDFKbS80Y210NHY3TnB1NldyWmxPUisyNTM5ZHMrRms5Zm5za2VkV001ZGRNY2o5bHNqYU1Eb21PNkQ5QlRsOEZGTDc5VWJ5Z3RVaWRvdTB6bThidmU1VE5HYXZENTM0NXVTcGZ4VERpUzNJYkxIUmQvRXBaSFJkdFZxODBxNU5JcGVSc1ZYdUNWSUo5TElDNkxWR1cxL3hYOHZNaGNEekVVTXd6c2kzWWIwM0V6eXRkWlcxR08vNmtqMzUxQ2RqZmIxMUR6REdialFVdEZZdFUvWlU0anRudVFHcDI2VEhiNERPemd4MkFUNFIrMzFIMndOZ3JUemxwL1h0R3kwUXNwa0crcmsyN1FtWUZ0eTJ1U24vMHdjOGZsclRtK0hGK1RFdUxTNlpsVzg5bis1dDl2S1lsYzdoeWFlaktpRjZldUw1RHV4R29PUi9URU9wRzg5K21nT1A1T0hpejlVSUdJbDJtd3dCRjc4TUIrWWw4TzcxL09hcHIyc2s0MjErbmRlekFPazlSTmFsSktock5QN3dFMkVjM3g4WUY3MndMMmw5UVBtYi9XbXdWM3VsSjdpMFJNUzJ1M2gyUjBhMHFOekVLQzFOenZPbFNUZGFKVDJWZWZHdHNsd3llNG9Ia3pZR2JKNzExMDRtOU9DNzdNMDU5M2FkOU9IWHpvOWZ0czVYVmh0dDZvclJxampoMWs4Q2t0dHFnbldsQlFCaUFVYXc0SlUrSktZVGp0Zk13QXZtNEx1YWRKZ3NIOTRWaUx0WEJ2S1FEWHQrNCtlUGVqUzZoL1RTZXFqU09ydGtzMURJWnRqbVRSRXZqUFlaZ1ZJUk5ldXErUDNQb3VnS21qWDZBc2xSWHcyeVNZZlpKTlRqZVpveWNIbHlPd2luYlNhK0VxVE05aE9KbUZqd2RHd2ZKZWRjUmNHNjRpNVpKekFmT3VJNFl2TTJENEMwc1BnL2JXTElXRGhTR1RIUUtGT1JYOEx5RVZZN0IvcFllZjhpaEFGV0J3MzlqZy96NXJvRTFZMmRVOWIwNGZ6aU5YREszV092bW51YkZZU2tNR0FrSW9IT08rN0RHWWdoZHBDT2ZpTlFpYXZIZXl0WTE4cXVCcDIwUS9nbkQ4NWVZUUVLTmVTVkNyZjNXSzJVUjBqVjJObVQ4eXpDYTlpRitIeWhlei9jdVRSTmZqL1ZiU2NZeVJhZC95SGxnRVlXOC9uV2pFOTYra3hoTklYRTdRQ3ZNSjBwNnJuZjZYVjRzTm02NEZYMWdvYnJFZjhuRzhjaldzNUJXZW9OZFdpd1hyU0RabEc3S0tuUDNHSG5xYkJiWStxNFQ3YTlJY1pMTHNWbnp5ZE4vWDIrSTQyL2FNR2d3RVJCSG1LTFNBTmRsUU5ENnB0ZkVteVNsK1NadG8yWTZsbmZaVFo3TUxPSFFtcGVoWGJEdkRlWFpSWkwzeXpkaWkyWHZGbnlKWm9saTNScDNFMGFuTnkzcEN0Q2pnQWU2Y2Y5dkIyK3RDbURqV2JVcC9vUmRiNTlSdUt2UTZMeWZvZVM0Q1h6YkZaTmtkQWowR2Q5emU1SXdTeXpuOTIwUkRTc2VZekdHRW9HRG9JMjlVbWlzUlp1NzFFWHczS1RrUHVPc1VSMmt2RmIzbnBQd1pKdnhqZDZ1ZThNNDFPSHVaRjJKSHdiZC9RYWFCSUxwaWE2R1lyWm4ra21qY2ozT1BvcHRQaUJvUHR1UjZ5NHJweXUyM3d5TDNjRlZrZWNhNnExaU9xSXFzZXVRRzlCanI2QUxTZGRtU3FsR291MDJwQ0VLb2UySTQ1dkhxdEI0dFJMNldwMTdvUWtUYkRMUko1ckZYTG9qYUNTUVN4bWpTV1MxYjcyWldiZG16aGZTZUxZM09yWXpYZ2FyckxZeXNsamFic3c2cWZYWDN0MnQrLzk2Zjk3UytmemYzZis3L2I5UU8rUTJCKzlQZE4rSk94WXE4WTJXL20rVktXYlJZSzg3emNmbWVaYVpybUY3TTloOUsyWHVYNVEwZmRPMXkyM0FnMXpYV0wxMHhNcmJiQ3FvY3p3R1JpVWxVdXNkaTFxdWRxYzBUd2JWMDVtZzZsUk9aUW1NL05UTkptN1VTM0IxS0FNN3BVMGVsOXJsdWNRU2xGcHA2Ym1hVE4ybkc3Nnp6WFJwem05eHJRM1krM3ZWNU1yamhTZWo3bksrdGVmODRQV0ZmYWxBOG9aVC9QeXc5RlgxZmRLMmtmdkJOalc5VUxnY3RQcmpiTlFHWWZtYzdzcVhObnE2ZDJpMmVaNnVGcHdTZzZhcnBqZENnVzM4dkY1VE5SaDFYUEpmNGgyRlR3KzlDcEFjcnplSmZzbEFLWjJSMWEvUXhhS2F5MmxsTHFRMHpTb1lPRmVMbjEyb1pMRDNiUDRUV3pwcEJIQWZReDVrM1VGQUVaN1pRY1pEUkhTZ2RKcWdrdmpkZ3RrSGJuSmFLMXB0U3BVU0FydXdXUm9nZ0ZrZm9GUnMxcTRLVlpRM2hyaXkzbXZMWEZUNTNEYTNQdGQxeG1WejBlUjhhKzZtTXNvRWJqSi9Zdk1UMjNsT1JJc1EzcjBYV1BNdXRLcENSVEVUMUg2bnRtelROMGwwOVpicmJ0eEJ5US9iaUFSVy9jdUF1S2RWdzhBUFJFdUk5cVB5K3BwTHMwN3VsOTZHUThLS2hZYmtobFpxb3RWV05yckc1WDdIUXBsbHA1YVpkU2RNeGJvM213YU1kNVljUTVHa3pkSTNFclU5Mzc2NXFtU0tjeGNKczFQZnNvc01XUmRiUEg2dmo3OVJLM3VUVFBRd1h0bjJsMlYzMC8zVS9DZkJ3dExWTXBWMkh1VWUrTGVXV0oyVzl4TklaNHJuWW5WbE5kcE9hak9UcUhwOTNyQ3BhNExjSE1JbU0ydmJXR0wyMXZLUkY5dVNTejJ5ek9uY3RWZHlPM2VtSVVTc3d5cEVSbHZ1UitIVi9IS0FyblFuRXl3aExZcm1hM3JXUzN1LzAzR0hWeWpkc2l1dlJOcWViVW1uYU9DdG81cGpoa1BNTnUyTnEwQTFCZHZHV1dwb3NtSzRSQ0xYNS9wdFFuekNYcytYVzBQcnk4QVRoMlgwMGx3VzJTS242OHdwTmJxMzBGQXF6bExUT0dua21iZkcxRzhiNjdmeUdGUExpS25KamJXZDRhczhZcE01ajRtcmV3cFl4Q2F2TVRmVkltZWY5NkRRWGQrVHBEOG5LbHlBVHBTRTg2STRTMDJLUGpRcDd2SHpoT3FYQjJxZWZiTmMzd2JCUHJIQTFhQVBuR0daSi9Zazh3VXFvcXQvWVllODVsNHhWeU9INytOcTZFODFtYWFUaStUTU0vZmh2Rk9oemNkUTBBSWtsUE0yQytKSzU1bElIVWxCQnJXa1hFZDlReGh4cEE2RGNiWktpR2FRcHdVQ2p2NE90NXdrSnJjQTNTWEV6djZQVjdIS2FqcjcrR29VOCsyV3pBbENSL3FrVW5rSTJGOHB2ei93V203Q3BwQXNxako2bHF0YzBYc0YvY3ZHL0RDMDNjRzVjblJUTmRON21hek9jNGIwdVZLM2RJVXFIVlBzYldrOWZmbEdEazEzVDhVd05pTzlQcE81MFY0L25DcUxXeXdkRE9vZ2xSVXFPZkJ4Wk9sU1ZTVFUvV3BOS0hLTXgyb0VSS256Q1lIb2s0eHZiZXh6SnNOdWVrY2gwYmNqczJYb2dTQWJZNTlqMGxSWnRvSC9WaHJFdVd6cGRtVVpPUXBXQ2syYWtYOGVmdTkwaWsyeFhSZE9mN0lpNjV6ZlZxNlVtWU0wSUJ0TGRZVVF6OWRyN2xnL1M5N2c2TzZGOEMyckRlOGpOb0hQRmN3REUvNnFIMlByQmRJM3dVajlPVTVwUVlVNnJuczI3Y3RsTEV5UDZyS29lMmRidk9iaEtuM3RhV1FLYjlHTXV0RUdrYVJVMlR4Rnlueldiam9yWDd2ZU5NUXAyTThLMTNkM0pkWXJLYkpuM1dod2VMZGgweUY0QlBVcGVPVDAvQWRFcnlSbEJla1AzL3gzaTVqT095akVKcTBYVlJPTjZZdXp2YlNxd0Y4N0gzU1BFM05PeXZ3UlNUYUxyWnZ4ejE3TnltejhsMnVUanBNaVZRcDZsL3AxL2FPeGtBL2dCN1VIM0VlVXF5bm53RnVuYTBXV3hMZ1BCVngyUXZaZDN6MUw3dDl6blBUcUZJbytsNW1uY3R2eVBWelRoams4bHlYeFN4N3ErUW5tSmpsa2ZFMlFLVUhmRjBPWGdSQmMydm8vOVNJZnZUUGkySVNmKzB5aHJMZUROZ2JvZ1UwOWEvSHR4TmtMMzROMVpYR3BQWXJJUWhjSXBUQTVTcGV0S1pCdUJ0dzBvSUtHWGNBOVh4N2c1UEJ4MmlBSUtXWlByclkrOFIxN1ZZbWdXdll0NEdhZFo0OFRaWTg4Wi9BeUp3WU44WTlYVlZWakt5VnBsaU5RbmpOUkFNNjJKRExvZVM3aXdNQU94WHB1RlhWYTNHaEpmR1dRdUtFN2JUMGVPZ1NkN2xqQThuck1LNjdHenVpMk9CRk1Ob1YzeCtsWEFJb3E0aWpTcDJvaTVFMlBORjA5UlBTME05b3M2eHI3VEhOV0wvTEluc0xCVVgwYTVGL1dQMVB1SjMwd3kvbDVtK1ROYkZiSmFPOTErdjlQM2RhS1VmMDlmcFhicmVoeVcvc0dvY3JSUG5LQVNZMFFOVXhZT24yeWcweTJJZUJJQ2Qrd0dSUkZ5OWNPaG9CYktoMjU5R1hZeWo2VHlkZGhYenZqWFdWY2hlOXFoL1dMeUd6V2ZHaS9ySDJVMVdjS2R2OHZETnBFZmRibHFiRk1ibWM5MzdoZk5sU3ltc0d0cWRhYlRpTmFPZUVCbmRUdW42aHlneFFIdVo0cmlhdWtpamFXbzY4RjFaSjZDUGxQTUJNODlmVnBXN1Rna1Jwb0JJemtKWWdCTytsU0NEY1NQYjFpbzIyOVBwK25waERTNzJJV243WGxST2JzSDR1MFNIUXlBRVFDVGx2L3VlaEl1UGQ3OXNINllqeC84NzZrUVU5SDBWZEgyUVBkUDcvOWJXL3B1aUQxdzJxdjBkb0pOSmxEUEtnUVU0dnJ5WEQrNXZTd2RKeXFEUEdSZzROd0ZLN05iMTZKa3pMbC84RTZnOWh5eVpMRlE2NmtSZ09JU3I3T0g2T1FpN3hCN2RQeGZtNEd5bjRoQ2phcy9aNk9TV3RabW55amFuZ3pabHA4UlNDdU1aYTkzbnlpcnFZN0ordU5SYnd1YjJkcnNGSGFFaXFvb2dqWUI1V0FTM3dHVjdhSGgyMSt6ZEw5SGlxSm5ySC8xN0NQYytOWC9qN1JwRVRScWZVSjBSbGZOaHJIcFJ5Wmp4WGxnQng5Wm1maWNxczZZeG9nc0JySklFSi9DVjBIdFAxTTkxRHdkL1g0UWcrL2xaSHNmWnlJRHlyVjV5alhQeGJta1FDNWNlbWliWjV2bEZRcHpERkNBdVBKSWJhQWRYek1aMTN3SDF0bTFZSTNzOW1pUUVnSTJEUERCbElyb2VhTUpaWWJ5Q3AwTjROaHA4aGJKM1lYYmk5clU3NjF5Zk9qOGlZMi8vZndPTmJCM0JjMEh3MThZd0ZlZEZaejNMelpza2FHZTZYd2JCS2Y0djBoVi9McS9SME1aQTc5ekpxTTBHaHJiWGFHSjVLSlJsdS9pT2VnakxRcUJVTlRudjUzTWZ5WmdXT3V0azBvK3puQmFoUHNzaHRVejBXZDlrWjVETmpkV0NlelZ3YWJEK1M2a1F4eEdzTUZJN1dmOSs2Z292bFZwSm1ITFFlWTUyUURoWStsdEJHd0VBN1Y3WFpYaXA1SFNLdHVuUWFsWjhNbHZYOTVmcG00RGpGWER4OXc5VFhneDNCMmJBSGppdzI1MDlBS3lIUHpVOVRWLzVOY1ZIdmt6UFR2eUFZd0o0dXp1aC9RUnF4TWFzUHJ1dkxnK0h6WG9kVnk0dGVCTmJsSzFUMEdzUFgvUFZTSVBvd2xDTlB3MVhDS3lwTVhmZ3F4cnk4UllWajc4Q0RaM1p2cVhVVHlPVFpHMHBrd2tJQzVCUkN0MWtINlpVMXZwSTRBRm0ybWxnTTdjdEJPaHgvdjMvaHVkczRuOFhpb1M0eXQvNjZ0aDMzTWE5OTZXWm56YjhmLzNraGhNNUFCYlVlM1VDL0FPM1VvZWRIUktPalVWWE4wMElmZEhSc2dFWUR0cTY1RXlxbmFtcmtUeXpSbngrU0hzNGJXV0FPa0o5OTJMOW1KNlZIMzZKcVZLVWhleXJsZjVRY2NtSlFLK1FOcWYzRGhVdEs5Vkd6bGJxZkFyYWxPMEhjODBYNmdhRDJzR1lkUmxPTmxoSEliaW12RUk5ZXh0LzhtVEJ1STB2dDkrMnduUkpDcFRnaUl6Y0ZwR1NtOFlwVHV0VGIrYVNXQjFqNjVtUmZiQ0FjUjB6YkVIRDhoSXNCMDhoWWxHcTdVUHJReUo0QkR2TFMvQXNlZEVOUUxBQjhZanZBNE14ejJmdHMyYlNucFBybHNIZENFbWFNMGRlNVZEck9mT0g2dUVSdTAwQzdKS0lHdGJPbURPTk9xT3prTWpscDNqZ1pVYzZWa1dvRjNnR3Z6b1NJb1gvUEpsYXVUSm1STEtzaEJsQVhCMFQ1Z0lSbnBXRUdVTGNtQ05FN3M0VG91K1lOeDByMWVWeUxXWFg3WVI1d0J4NE5yaXVzZGxiMXEwMWZsdlQzb3BTYStSWThiNTdMaURqamhXTnVyRnU3cWhqUXpLTUpPM015T1ZHNHNaOWx0U21kRmVaSVBOM2NucFVXQjZZWlhmdXZ1ZXgxOWlWUkp1UHFWY2dmYVhhQm45THJuUEc3SEhmT3NleTNSVEZWY3RRN3Yyc0pJNUhqaWo1R0N4Vk9kaER6QU4wd0E2TnNudlVJTXdyVGJVUWpQOVYzN3I2T1pnZzFRaEFDSmJxWkJRR0ZHd0ZXUWRVeTFrekNVQUFXT1BnVTRudTRQYnZoM3NJN08wWFZOOXN1VWVBU0JmdW9lRWUxRDBNSk9GNUR3cytFdSsyUm5pTW5FVUFTN0lNOXhCd1pOTUtXcnBFSk1iY0xaeU0rVC9oTEwzOUkzcXFVR2tpdFNJRkNsWGpoUXErVFhpeVFzdEwwbFd5S0lja214TEVHSmRrVU90RWNTdFFkU1RkaldWUldBYnFtdlFXb2s1VUprbXNvRWUxUUZHVlNpWnpCRkk1V2NaUUZoWFRaS2s4K1pmQ2N0WEdDT0xqb2pFSGEva29FRmxwdnNCWXBkUFZ3Z1FLdnM3SDZTdGQ5QTI4d3p0WUpRQkwydXBVRllvSmRvSWlaU3Y0RVE5Tmxwdm5CN1V4VkI0SGxlYUNRTEdrVkNCcTZ2WWc2ZnBJTVFqY0dNU2dFT1Q2RmFRMUpHV1VZdEcvUUxheHBwTGxJQWFYQmJqNmNPWU5RdjBBeVQwcGZpSno0cEJ4MGVsMlkwUE5yZ3ZkaHlqNEl1cmdhQlZjVVBLYjJ4ZUtsNEtpS1lYQ1NSWE1wWlUvVzNsalFXNmZUVTYvVG5ZdkpLdkhJQmlpNGcrNnBzeUJRa1ludGRJN2xkWWFsZHJLclpTMktia041bWlNU3F6YkZxOXU0dGJaY0Nwc1lsZGRzS3BVTVV0ak1RcVZVRWd0ZWxGQXkrdWc1b0xDRmpsVHBOUmJ4RVFSa3JRQW55REF4UlkyVXZFaFduR2h3b1M2Z3RpZ0MzUlFnT0lXU0JTQ3RoWGpOMFg3TDZLdW9DSXZVQkRodlFuMzVvUjVkMEwyMzZwUWdWTm84dXNyaXB3djZhYTc5cEZCRzlKa3gxbm85aXVQclFZaUcwTDd4SjRYTUhic1BNczRyaFllRi9QRTJqaUJqalpQSzlUWW5rN1N6VmU1Ym5renprZjFVMm81dTNnMW4xM3p1VDk5ZkRMYmZid3pPMGwya25QMlpxZVV6ckVDVkR0K2ZEVGJmN3czeTRaVTUxbHlsT3dsLzYvU0l2RHZxemZxTDVUa2NaVjVqdzltMjQrM1pnZkpWbkpPYjdaS3d6bXV0dTNEWFR6QzMzbUhIVlN5b0JQZ3RWd0N2K1I2TXVPLzV5a0l2R25vTEM5ZFF2eVpmUGZqQjF3cEJ2amQ3bjV4WVBLOXFWQThXckdZMDE1OHJPNG9hKzNIRE1JaER0a2p4OHJzV2lxd1c1Y3YyaTFFOFNzVWZIL3BZMzZ3K0p4ZnlPY0FBQUE9KSBmb3JtYXQoJ3dvZmYyJyk7XFxuICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSswMjU5LCBVKzFFMDAtMUVGRiwgVSsyMDIwLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMjExMywgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGO1xcbn1cXG4vKiBvcGVuLXNhbnMtbGF0aW4tNDAwLW5vcm1hbCovXFxuQGZvbnQtZmFjZSB7XFxuICBmb250LWZhbWlseTogJ09wZW4gU2Fucyc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBmb250LWRpc3BsYXk6IHN3YXA7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgc3JjOiB1cmwoZGF0YTpmb250L3dvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFFRTBBQklBQUFBQWU1QUFBRURNQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHbUliSUJ5RVVBWmdQMU5VUVZSZUFJSU1DSUY4Q1o4VUVSQUtnYklZZ1poNkM0UWVBQUUyQWlRRGlEZ0VJQVdFZUFjZ0RJVWZHNTVyQjlnMmpSdmU3Y0N6dlBzMnpLZ0lOZzVnaXp3MCt2Ly9taUJsakd3Q2Z5bUtPQ2NvaWttS0VKUE9RcGVzNkhXM3RGSlhKQWFsdG1aR21QejgySEh2YXMvUStrdUZMdnpHTmc0OHVBLzNQbnBUMU5PMWF3c1Y5SXRHc1R0bTFVZXRvejBTV2RwTFVLZ29GNy9URXVFelM1aDNsQ1BSTXlkYmJzVUhLQVM5TkxId3pkb2o3ZDlqZHVXeC93TVo1cGh6TUk0ZGhKcTY4RHo1NS8rdnJUbTVlUlpLbU4zN2RpV3BnNW5NQUd4VGpKeHpScU9DRTdBS3hVQ2twWVJXVkFRclVCU013Z1N6dDZrTEZTTm5iYTZzbFl1TzUvWklDK1pHU0RQOTdYNmlpR2pIRSt0MFFvalViSWRqckR2RWhvdmNOa1Q5V2lOMVFwdUF2NXpweXBuWnRma1ZoM2hmem00QWFDVS84ZDFKOGJQUEFZSU5rSU5saWg2ZDdwWHEwNVdwcmlqdGwvNHE5WmZ3MzBWYkpVT3JPdFRNeGNBRGFCaTI5TmNnRFYxZFpPSVEyMW55Wk5TR3B0aCt2RTd4VG1CNDk3K2hnTXZlWWVkSkZDTWtKWkIwaTlSc2NyTVZrZXkwVE03TVJaWEd6TG9KcHdEdDlCUUFwTW5Cb0RmNGIzQytNZjZUVTAzMmxxY2tlMmNQcFZaK3FGTS9DU3ZoUHhha3VTb3hZSS9zRUZSUTlFQi81Smt0WGpnQU5OL2hXbjFmU1NwY2dVN1RBQzdSN0FHQlBpWHE0SzhjTFo4d3Z6NjAvczlVczUzRllzbWxaTjRqcE94SVhvUkRMcHFZK041MTE5bTVkclh6Wnhhek00TWxCa3RJUWlBWXdKT1pGQllnS1JNUWZVY1FEaUIxS2RBaFo0S2tuaWxSRjBpZDdLUGttS29ZSzFWT1ZTb2FkMjVkdWk3UDd2eXVjMGhGMTl0M3ZwVjUwbzZ6ZXljMXFXcGNWUWpWQkRNWTkvdzk3c2ZLTEl3d3JabUppMkpCVTY0OVhyZUlWME4zQURvVVNvcmhzUXluWjRPcmQxcnFGS3NnQ1Z4R0lpaDF1ZVZ6eTFwbE9oT0tHcE9KTzBKYkVJZU9VQjQ2Uld2b0FnWkNWM0E4OUREblV0L3dOY1ovM0RXMXZRYlV6K3ZWNE5yS3RNWWV0Y2xUSndsMDhmODJDTXpzMDVaeEhLMSs4T3FTNjFOc1dTL2RPOW15SVdYN2VyOHRDYmZuQU1IUU9Wd21UYUJjZ0cwRG1WS2IvaFlUS0ViaDJycnFRdGVhYmR1MzRyNU91bkkxdmxzeTFxOEV1VVd5ZWd2WWJYdTM3b0swNDNVYStwNGJ5UTFDYjFFWUdRaGs3VU5ITjcxOHFGclVvVFZDS3RoZ21Ka2xkVTBNOXQyZEJTbmN2bVRKUGFRMEJOWlR0aCtNRXdhVWc2alZVcTBzMC9SNU5ORUdzcUVBUloveHdGclpOcDRtalJsbW5zV1RLcE40L3VsZUcyWTI4VlBITVAxc1J6Uk1kK0tWeTVJLzlyWnU5QXpWb0ptZitLTm03YjM4aGM1QlRHcXY0Y3R6b0JHMmE3Tk42QjlScjNjNVZBYUMyalFPekw4WFo3Nmd3UXhvZkVVTGc0K284MDhwTkp2UE1MZ21ZY1lSL1h6cFFBdGlrRjhGd0JYa2FINWhYKzNpdHZrRWdHNll0V2pvenFkdDJyeVpFZHdBa0N1bDFzb0VnRkpWbXdISXRRREFwOGNxQU5xamlYUVdNb0RqVUwxUjM3L205aERWWVAvNnc5dUxsRis1aXFNdDdVbzBaTytVdDBwTGttR0l6U291NTdYcm83V20yVFlBd0VHTTVsSkVhbzVZamp6OXk5Y1NBSFU0eHYvU0ZZNmUwdlA2U0orMFYzQU51QmE0TVR2c2M4Z3A5M25HQjNBK2VDWUlReVhVZnpsWFB0OGdHbXJQb2Z2RVBxMFJXMHhuMStQcEgzQWtmOCtmNWExOE9rdXJMbFVxUC80N3BxLys5T0R5dm1WTEZzdzZZa2lQZE45UjRLUDhiT2ZaSC9pRzk2aXhsYVRHN0lyN3NjaDM1eVRNQU9SdnhmZlNVMTJXLzlPNWVWbjhIUUJ1WklxK1BhU2loazhqUDQrRHRET3BMUGNpMlRTeG55emFPRUFwbzdSS01JcUZIOUh6ZjBCSnNaQU9Ya3BEdzB5eEZNNVgwc0UrRHJwVGt5ekVNaXBtR21WTHFXa0d3cnNNZm1oZGJpa2pURE5QTFMwTVNEQjVWRkZQKzdyL0dITHFhS2EzWEhxT0h5aW1nZ2E2aFVRSlZmU2Qxc04reHRPV2xZWStqWE9nRGxzang5R1VmUVA5ZmZWMVNrVnRUWFZWWllXOHZLeTBwTGlvc0NCZkpzM0xsZVJraTdNeU05TFRVbE9Ta3hJVDRrWENPRUZzVERRL0twTEg1YkNZREhvRWpVb2hrOEtKemlDMXZ6dzUzbGFrd0UrNHVUblpYbFBKRCs3VjZmYTNuZ1k3Z1hNOEdMWUVQWFptT0hIdGxqYkdhemJRNExLZG54elhrci9EOFc2dVFoN3M5ekhmY01yRGNlV29MYlBBU3RXc1luYnNybVVYU1ZCU3B0QmwxNG1yM3MxdXRKNHlvRjZLbWt5QUVTbE9KMkJTNzlVNjRSdUh0cEtmVXd4YnoyaGFOdXcyM3FMa3dsbjdMRFNMdXJCV1FWMVFRam1DWmQ2OWVvc3pvcWh5RUxOYjMzUDNBa204R2pITnNKKy9LSThwUU9SRXNDVXZSMDdhUzV4bFhZY21qbFdtVlVzS3lmdGMvU1AzSjRsTnZaWUlHaW5HSDBlVEx0N1ZLcGNqZ0hoWGQ3OFFVaElhUG0yd0xFWkMxd0VDU3dpOEJFU0w2aS82SjlKdG45UlpsK3BHOGcrRTlPWVpZYSs3Nk1aRUNGSTBraFJRT0tOUmtMZnAxaG9QdWtGamJOTGNRRFRzQmdnQlMzcndFZ1RtY0U5UExIMmtqL1VadGRIcWhKLzRMempyWHdRRkVYNE5zUTFsWlBSSnlSeWFQNTdXV1JDVXBLVm1ZSTFNWkxlR1lDSW54NS9VOHFxR0EvczNLdmRyQ09lNCtvb1ZvbkY0Si9WYU85R1E1YmkyYkJJa1JZUzU0RFcvSXNiSjVLQ25ybTFQME1iZnlyZGFJYmxXU0k0M21uMWFza1N1dDFNVU5ZZVNqS3RVSS91UktUdFF3VXJNUWFRbHVieHZpc0JrZjhXZFVOTEQ0UExtZlNtNVdoQTZUVFYrSGFTeUkxMUpJV0toWU5ueFlUT1prTXZpc1hxY2tPeXc5T05OQTBIY3FObndSRDBKMk1qcEFDNUQvWXZjNWpaZHZaQ2NsMFRRSS9kY2IzMkV5S0U1Z3NjTm5UZzBqUEZYUmIxRzdRUkR0bFd2RGNkSnYybEgxeTZDc0ptazZLREJQUlZYY1RhcVpUUWJvYjF3M05IeURFN2JxRkxyZUZDWWJVLzRjUllQMmNtUjF0QmpjRW1BR3I5NlZjWGluMVZPd3ROOHFhbnpsM2dxR2EyaXBwWFhrcTRRNzI3VmE4V05WTlgrNUdRVFFVTStKVmZiOTVGWndETHc4Z01NemtuMzB6NHYrRlpWVm5nOGtFZnVPZzVJSDdmWENqZzdrY2F4Wk9JTXJYM01lREF5YlR5TmplNFZld2xNY3UrVTZPaWJnUmp4OUd5a1BFZnF6NHZPdVNXQXl6dUVlSW80bjgvZ29zWmxiNXZNRldHYUpDTGkrM3dobmJVdTZuTHJKVzN5T0RvSk8vV3dvQTNHa2x0cTQ4RlZkWnNrbklVNFpJcG00cXJsU2NiVVFxdzdBNUwyK0dCR0tQaWJoeWdhVlVZN3pVclROa1lYakx2UmtUdnBVZVdjVGtXcHRRcm9RUU1hVHQwVkpqZHNBdmdtUGE0UUdKQjlxQUdnNWdDcnBZaUxFdE1JN3hRWEVTd0ZXL1UvWUZseTNYTGNRTXlxY3dRQUt5NkxDam9nckYrMzJmZ0U3Z0ZMQUM2WENaYVg1YThremdoVHdjS1N0MlJSSVE3THFSdVlLbFdSV2kzazRXeW9wQTc1V2tVZEFBaWlueXYvQUdoRDA1T0VuWnpHS1Z5eGFlcFFmbUY1NHBwdHZNWlYreEpnekdHa2lYUUtaRGszSWlsYWZqY0oxaWR4ckJvbDk1UUhSbGY5MElhMFp6UnpMNEhxaGN1M290L1YxVjhRRDlwazNCWG1FREZYRDJ5cDBqN3BJZktRcTY1YXNPcHN1bkRzaVlpRVo5Q2FzaUFXdldFQmxDRExwWnFBNVlhWE5KZWJMZjA1QkFzZzhHa2QrZXpUdVpvL09lWUZ6aTBEOHFVckNSZ0lieWt6c0JqV0IzYWhnQnAyQ2dTeWIwUFpaK2tYMGpFWjZxaE5VeXpnR1hyWlhNMGpCek82aEpvc2t6OE1TbnZZb1RQb2ZIVE41QjVNNENtaTFaU2gxZmpmUnRHMU00Yk5vUlkxR2hrSk5TdTVhOUVmVUkwT0pnZk16a05GaDFVSEZrbkNNbVhUY2Erb3VwVUFVaHprczZjUy9vV2djT083QytRVkprS254R1dqa2E4OFB5dHl2aE5oL1VPZFAzS0FRL3BoQ3NBUVhnbWhGWGZIcG1GMXQ3OTZ6OGVNRlluZTg2bFVWMmpBaUxnM0pOc2NKSVZiRjVNS2dDU2RwUzBFcmxBYytJanBLaWhjYWNpVndVbDRPWm1Ncm9RNjJrUjNQWlFaZ04raU80TDV3RUlCUTlxVFlteExwNm1MQVpvSzFhMTQvbTM0OGg0Y0MwWVNiSnpIT1E5R1pFdjNDMWw0TTJlSkcvZ3RMazhUdk5US3YySWIrNXFEYktsYndUS1RxOHBzMHBxQ0FBWHM0V1RUYldaSVRpaTRKOUU1ODNDSVRtNFBKUGQwa0U0TkozM0dIM2x3bW9RYVkyN3dRKyt5UVBxbUVwcWxabTV2OWI2SHI2Z0VrL2Z4ZE5UTW5WREprWUpHUndVc1JKMVNCT3IrSCtqUURZQlE0UExaUWlvSDNodDRZdXMxS2R5Mk05TWVIWlhuekxheWUvNUZEOXJMWWRCUEVDVDRCV0tUOENiQXFEdXc1TGYvK1p4TGN5azdQWFFaWURlZFYzRDludkM5Y3FTdW9kQlo0L3prMjlETWZRdWFTdjBIZFJxbVE1azNydjkxdERlWTQ5dXVXYUFydnJVdWYvRjU4SEczZ2w1RThLU0l2ZGxRVEltTTFIZ2lUaTRsUlNhSytKMm1NYzRWZWNNSk9sNW9Xamt1cVhpb0h1cDB4czR6Zkk3QXBSTkw3M25nYks3K2s3OGl3VTkwMy9KbUlrUjVLMlU1WjFHZnlmQmF2Zlk1eWNjc2s0V3R1REREZTZJbytFRDRrak1xK3FmZ0tpTnpUb2lmRUV1d3J2QzNyYWNGMVM4Rnhobk84eGRHRjNrWnB2bExJK2N4aEhqYmxTbkFuamY0a3BkQ1hDTE9waElMOXdFbkVhSmRBRW91WVpyOGFPMVVQb0RDbjBCS3pITDFuV0xUYi8xemRJOFUydVRPNnUvN09aaHlIazU4a0d2OHR3QnY3eUZBUEJBczJYM255NlNNcytHa2tNcnV5UllIOWxHR3lqQ2dRRGY1QlpDWEJsSlJIWXFjS1d3aFVSZmlzbldCR3FsR1NlWlcyOFR1Y2ZsK2pXN2JMT1VsWlVTZVhsQ3RBaVROYlZjc1NsRDVpZTczcThTMGtTRnNmZnBZWXpycGhmQ0x5eGxrMEF6QjNZZThPbS9sVldXRy9zb3NDK1ZQRjA3RkRWWE85dmpLVjFEQmhxTGNpR20xM2RpaXlsMTJGc1FxY01WWkhqaGoyVTZJRzd4Mm5naUpiaUpoMXdwRmxKdGJOZTlPa1M0dWl6MlVmRm1JSWxsRWU2RHZzeHQ3SHc0eFVMZ2diTVVzaGxaU21FdjFyMjRvRCtTRFEyY3g3ZUtjZDR1MGNNdlhTbXVram5xOG0xcFoxamxQajh0RmZxUmR1TUdiRmRMVjFWV2RFVDhwUk1ONjJFWnJUZmJEZ0pXUTFnOXAxODg1a2JXWW84ZXl4b2ZvRDFTeFpGckhXTUpYNzVPN3JraTBESEdibC9XNnVKNklWb2lSWW94VUVkRmEvR1IwR1AzZXJqTGhqb2oyZVpleDVieDdVZlpGZUN6VnVzdGJJNWUwbE5nWkdFUlU1QUZHYlh0UG1sZ3lDZnByMmE2VkpFNnBQOHROZktEaXZVblhGRHNzNVRVTEFROWs1SUN3SkpFTFZnb0x5Y2o5LzFSZ2pNdHlnTUdUMVNkUDdKcThWcHhDaDNYUm5iQzg1WC9TOHIvTElmb2I3YWpjNkxlRmZGSUFYZHAxM3JsQm5oTjdlc1psL3R3WEQyRGl1OFFoZlR3VTRZMXdIbFZZZWtrbCsyWFZuTXpEeVZIUVM2TCtMSjcyMUpKeDRCcTJyc3d2L3g5R2JaMUs5OE5MVW93VkdKM1JJbWlEUGtTdXliMC9GdEVJRUwxaUYxSGhMUWJOVWo3bjVYMW5FSzNsd2c2dnp3MkRPa3Z3L2hNTDhMTzgzSUxhZXBlMEI1R0FMOFhBVXNmQnpHWmJieWFqMmd3SGJvdFZhbUpjTTlybjRIVlViZ0JqQWxoWm96RWF0Nm1WZktTTmpoU1pKdnBReXpUSmUrK016VG9UZTd1U2h1MDhOa283M0tXVXQ2UUFUd3hDOENBZkEwQkN6cTlDeVlHQWlsUzRnc3d6emZ3QlJGMGFyL01neXJmYi9iQVRFVk1jMk5XaHp4TkRNbVVVanNLY2xkSk1EY1dXOTBPVXliV0dFMEVIUWdta3pLVWdFWUNqQkRlSm0yMVczMWp5ZUpXbzlDOGhQWnJFMzJnVDFGQytnKy84SjYxQW50SDlGN0U3NW9SZUs0RktkdHg3bEM3OWNaalVSTzFaZ1REVHlqRVNCYnNEbnZka2thZVZhUkJMazZzZ1E2eVhpL0NuWTZhOFUzeXNvQ0ZuLzNFZDdWTExhVlBMYTFzOGExNlhXbzg5UWlEa3R2QWJQdUlhaGQveG9PSjFmUkdWTEtsWXpDKzRpMzJucU85TndOMUJDeXVTMDJ1NWMxK3JUZDBjVDVnRkd3aUZoM3FrZHlOVkpPcWYyZWRKT3F4TFB5RVZBWXJsM21rcUphT0NOYVBoUWFmd1VnRFkzc3EweEtycWRtWngyYmZGc2RrVFFwVld0UStEckZPSGFLVllzQlRuY25KaVdnc05YMGhHYTR0UjkvMWhYV3FlSDFQWEZMbGs3eFNwcktlTTE2Q3Z6cE5iOTB0NmYzT1FtWFhvQ1ZKbGZZNitvT2NXSzlBTGNiekJ5YkZzVDJSemp4MU1QZmo1U09CcEsxTFQzZHZNZU9QUHJHYkl3eWZQc00zTStOK0ptMmJQT3R6Vk44eDJFVDdsNlpYejlMbUhJOExYdzJiR1p5ZU82KzFId1JSWWlPb1V5QlFYZVdRMHBuTUJkT3NxbTFpcnp2cGU1MWp3S3hCQTdaNmduMEc1RkhpYSsrV2g2dVJSb2lzWklyd05vMXFKU21oTWtKOEJyWDJhTnREQkNKNmk5Z0g4cG9ZNk9JN1I2VVlQZWdIc2NuQzE2MCt2RVQxR0xsNkxMQVZ2OU1aazVXZTR6R0F2ZXVjMjN3NmVHMkdrdzhpMG9OYks3eFFBUGxGLzVNTHNLRlFiYVBaM0Z6RG5pT3FLNVcwcHR0SEN3bEJUR2c3SDJrUzl4elV4czcybWlyVXN0amdPSE1PdHh5YXFkTm9vL1JacFB0dVVzRnZMV1ZqT3gwNUdYTW9FTDdmanNaaU1VRGJHSmlwMjFYakNnS0NONkQxVFZwY2dLbDN3NUpiS3dUVlBqUGJhRTB0Mm5KMmlEWklvQ3B4UCtTQUlsZFBMZ0ZKS0dXWFV1Y2gzbE5EemhqeFpIeHpIUXBhTVZ4ZzNKbDdXRjI5ZEtOLzJ6aERueUpQbnBNZVM2dWdpWGVKaG9nM000VFByc3VReFord0ZudUJQQVM3RnU3bGMrN1pZTGFDNzlvN2RDR2lNR2FyWE44VGR4WUxhWHZ1MllRdFhjWUk5T3RHRG9MRW1xSWljZ3NZQnE2ZnRxRVJDY3hVSWh2Ykc2b0pWdTNtUVBUUEwvMm1DYUNlOVFGLzN2bnRETWlnZWdaUFBrV20vU3ZxSXdBaElxRGIxWDNOa3liaWsycTFkdW9CL2trY0d5NjhMc1hkd0lJckR2MjZjS2VjRlg4eDJweGU4NlBPK25HNTRNZkczMURORUdLOEI3VEZZd3RuZWZpNHFOVGl1THFGeWF3WXUwTGFZL0FDU0hlZFB6SzlQb1pmMTh1cmZ4cXZ2d2VWSjdBNHJvWHFuMlBkVXZWMThlM2ZzTzVoZy9peFhqZ05vUkNIV0J4MDRZWENDd2o3TFVBbXBxdXdKTzlRYS9hWWxyeFc0akJ1dnc4VXlXTTAvOTFjUGJvZnZxTnZvL0ZTalIrakJjU1ZVVmhUcWdLcnJGNzZBTDFTSWtRRGp3U0wwbFFWM0tZZDdNN1RGV0dIelpQUmZSMkJWakNyU3AwMHBPbU4xZkgrSjZXWGdHMjhGdnlWZnMyN083Y1lqdHNEWjZ1bk9vTENYcUQrUGc3ejJzblc1blAyRS9ISlVMTUVQWnJrR3YrdzhkK1hMKzlJZ21rOU56NTYyWnZjL2poZlJlaFV2SjUrdmJGWFNVYlZqbGRwZGJQaEVQQ0hReW5LcGdvZFJLVnc3bm5xS1hiQ3RHaVMxK1RTUGY0cFExSUdlK3BQM05EVUJzY3RRT3d5blhZcjc2KzZWV3E1SkFHeVN1ZldIM2wxNUJ3UlU0b1BGbjhLeklBWlk1cEluRHgxL0JIYnNWVUVVSHdDUUV3OWlENXN5S3YwRFJham5JcGJSUDRra0tBWkJ6aWh4NUt6YzNuZ1IySUM0YmIxbFphK29TUjBxVTVvRldSZk5TY2ZaVGtkUjBsSEg1TXVCWWxQQXkvd1FJcEJUbk1SUzdWenVIWWJjei9aeTNLeXFMdVhuVTVNby9wVGpRL2RFVjhMUUJuZHBFZnBvbUt0ZUwwYWlBaWhuSi9IMDN5T1JDSld1Ty9sMDY1eHRtZnJOSjJLMDhSMmJ4STRUaWFZbURvbTRLRDRkTWtUQ1dKUEJ1cWp6UHZ5c2xyRDJKYlUwUHlSOG1LcFNBa2dkNU9rRFkrSkNIZGpad0tqMFQ4Ny9qVW53VjB0dFlxUkg3Q0t5TDEvd0NYNHU5WUVHTzI0RjBodk9wYys1L1p4aGdKWDBDZ1grWHhOVFZCTU5xTkplb04vSnVTb1FtNE1jblZqNk1zWmxQdVZqMlVCUDNybEIyOHVsZFVtVEZKSklGamVnZ1E5dXFmVndsWXJhNVpiTVBzNlFLV01kVGZKb1hUUmlpWE9PU3o3NE1oeUxCN2RVQmdZWW9ZZVNsZzl1RXp6RDcxUVFscDlybHQ1VEprb21lR21WOGN4bzV6OThSMEhoRFgwOU1ZR1cranBKTkdJTzJmR1pYdm9ZeEhaTnNxL1Q2QmhXNzg3U1BITmRNLzNYR3ZCYXcydHhhWXFrV21WK3FySjlLSUFKVXBia3JSSk1oRXY3cGZsdEEzODR6MUlXeUNyTGYwV3c1ODNNS0RUVEVKYXVxM3NqYnN1QmRFb1VmWmd6NFFRVlNBVVNKZUxHWE9jSVRvLzhhZEZHZFFpSzZXNUt6Wm5vc1gwUVpJazZ1ZFkzSWxEd0daT3MxOGxQU2Q4VzhiM1o2bS9BTzd2djBvbTRZRDlmZkRDUmdFZjUrdUZRRnFZcnE5QTlHWkE5ZXlFZnN4cUY0bXJSSEdBbG5EdGZQeTd1dzVwWDB1ZTFLMEZZam9YY2c3M1MrSWI4a09MYlVVL3VzOG4xd1hCOGdyUUtiMG5WYmpoaWJJL2dRZmU5MHRXTzEwSm1oTHpHeE5UNGpubFdnZFpzNlhTbStyd3pCZVRYaExNWmdqSzBWNVN3NWFqWTZyU3V1NHNiSm85eVNuY1ZDK21CbnVFWjhCakxrdXYxRk0wVUQxK3lYNGc3UFRuQTJlcjc1Yjc5UHp4NjFQdkxnWTZCWDl3cU9uL29LMlJSSnlZbnFkTXNMbXQ2Y29JNUNlOUk5RjFaN2JMZG1mRGVBMXJ0NGQxMjl2L3k4RkhIRC8xRjJyZzJaVTVNLy9CTTdJVjl2eW9lcEhDYmsyb21scXJKdlkwU3dvUmw0Z1NvTnZrcGxRT3hmN204OEZjWGY5RmIxbkkxTnZkb2RXWkVmM3RCRXVJMUo5T3ZsSkljMDZxaXFuWHZpbkRQaVFyT3BoY010U2dhemtSand5dzAzV0p6aFR3YXE1SWFVWTdQcllwaXBDZTRLZlE3UnAvbFBZa09VenFrbEJ6c09OMTUvZnNoZEVBVlNGZzVsRktrdEVHSDZPdjVqcU9SQ21CcTRaQ29vc29CSFhCb0JCTlM1UmhmY1RDMVZBRkdvL1NkVjgyZ0xVMVM2N2tTMksvNHcvemxwTEdrY2Y3UCtDSVljRTRoaGJVQW5iY3RCaHNHSnhvbm52OXRtR28wRkg4OWIwd0tHRU9yd0tSeU00YlRBbmhHTDl5QTliam5weDdkM2pRaUx0akhqeEJNSkJCUWZqNDRsTDVINytwZXJkWFJ2ZWFydTdDTFR4ZjlMV1dieDVLclIrNGNUV2YrOEVuSXZMMDhOM1ozTVkzcGMrUExsZEE5VFhWNWVVMUsxSjZyTzZHR2pRMHlXV01EMHREbytoR0RFQUJYaVpBZkJia3FaV1J1czNlVHVlT1o1cm9XY1hiUGRJUXF1YnlycGpqamNEZ1h3NWQwTkZBSDNhTHJ0K015WjR2elk4K1BiZVdJUTVFNm55MVJkeElTcWUzMU1iSEd1clBtYzB0ZGxZWGIzM0xXODg5Q29sMEhZOXp2K2laZlBEcmNKRXJNUHg1UTA5WFdYVFJHaUt5SWtuUVhWOUlyUVJKRVBpZVBFZm8ydXV2Rjg4c2c0aWJuTWVjSVo3dkZyZmI1N04zSDhtY0lOYjRHVFoyZ3B1dmt6YS9acWdBNStsWDBQazR1WG0vc3EzN3dhLzZVZE5zSjZ6Uk1jcnZ1bHloUkVRVWRPVjJMdzV1b2J0Ty9PUUdJMmZzRFpNanhxQ0lqUjFtdUF2SjMxSVAra1ZlQ2d4NXB1dGJ0Tk9FdTd4TjNEc2VaYWMvc2VpbGlObmpGVnAxSlN6L1gyaTk1Zksyd1BXdUpwVGhNL3VrenYyRmtkcUdqYzd3N3Vadk5rbU93c0hxR3JJUUEyZ3RWMnRzTlhLK0NFZ0pNSWNyTGxkdU1uUDE1MFRSRmRTSWRGdWZhbHhYVm1WeFd1SGhYMUhIZ2dTQjNyaXlGMTlPYXhZR1FuSXBUaUEyeGt0ejlaNWtHa09qY29ZNURBMk1kaFdScVRuT1UwQkVaQzYwUzRBcE10MnNMZTNNemFhUjBPU1VDUkFVVjBIQVpsTXdlaVEyV0U2NkUvTTEvMkQveVJuRFFMVnZmcFlPV1pPaDk4dTZoT0RPdEdZUG44Y3hHYjBIbHFiVDBjeTM5MGlmWGkxckZTeXpGRWRLUFg2T1VvN1B6bmEzalBhazlMS1ljTzRZWEx5MGhncVpSNGhScGZ5c0pUd2hkY2FoUjdOZDd4dUVJRlZvRklsV1kwWjBXOXM3cWhWdjl4Tlhnand2aFF2M0htR0E3ZmtVNlRJbHMvNU1lNzVkNVdDdkNSTWN2cG42cVB2and2c2xua0tyMC9wa0tjVmxQQVJjVmZrVk5RTDF3cHAyVWtvUkZSS0JqWXB4aU1lbktuTktrZlQ3RXZVRktsdXU2ZitIbTdUUGpjU0UxMldJS0VvTWdjSzM1S0ljRkR5SW1HTzdqNXY1Szk0RmpVSlpaMGtjaTErV29qaHBlZEZ4MmxqNVpEMHJ2U3MwYW5MZzJVNWQ1YmF0UUdUMXVaMnphcFdteFMweWpJSEF4NlY0TDR2Vjl1dzFiRitZTnMwOWNGSm1PWCttd3MrcTVWUHJTbis5UUV3VjU2Rm43TTI5NWhmUERaaUh1eFZkMHpjNTl5c0lwSXNZaFZabFJKc3dYeitxMDdkSzh5RGJ3U0t0SUNEcmdFcmQwbmJKNGZjYngzS2w5anNwVGZhbFRWMWcyTEdCVTA0QUYweHhmTkhzRmFLQmNIVFl4SFRuSFE5ZVZSY1VZNllzTXV4bWNka2w5K2RwcjRlRHYraU00cS9VdWVZbDhMbnY5bnp4SDcrM0RBelVjVXNFUlZBUElyOWUvWklOZE54ait0UG00MVBCTjkwemlESmhsMWNPd203Y3RlZTU2dklmMVRpVXdXYnlnS1o2VVhIVmpPK1BhQ1NDVnB4SFA1T1B2U3hTdTZ0ZFdRS3l1UGNjY21VTXQvblN1NXY5MzdIdjNkVTlQRjZQZlBETUxldllwSG9wNlJIWUthK25VN3BmZUtxNDN6dEt2NjcvL0Z3ejdCZHIzSm5EbE1QUEQ2MFVXKzhRUHBZL2M0NXpSM2N5OVd6N3BTLzkxMSsxZU8xWmcrR2Z2dWFSV2k0TWJQR3ZXQm1EcUtPQ3VkdktuSkFESnpkWVhHZXg5bWd6MHEzeXB1NmM3L3lUcnV3WEd1U0V5NGdCYWM5T0FPTndZczZUaUc3emJNVHgvb0RtazNzRWZCcUtMcW9JeFUzY3VFRXBzNmgvYXZuSEFrR3EvWXFnYnFGV2cwVVFhSEphTC83SDl0cUZqbDd6eEZ6K3VpUW1NUm8xV3Zxc3V5TnpBbHZNVFlEN2d6aFZkc0U2NVpndVp4UHRWdXUwemVsSEhSS3RLc3dmTk9HUVp1L1Ywa21jMmNmN1ByTEdwZjdKVUY5am1reSs2V2U0blh6OTBYaHRna2piZW5zalk4Nmg3Y3VwQmQ5cWVFOEF2cUwrbkhuZG1HaGhCVWxhQm1rK3V4U0ZWOVJWUFNJY1d3NFo3bU95T3M5eURMU2RDNHVweXU5YmFtdjVadFp6Z3VMSFQ3aEdWL3FzTmVmZmgzVDJzMkJycXY3cjhpUzliYWMzbjdLOFgwYXc3T3M2bkpIZ245dlBucGFycnZzK0hwWW5PdHQ3Rk1qdTBzYkttYXZXOWFJalR2YWZNN3UwSXhmNCt2RENuUDVpZVE2ZGlrZ2ZZdFo0Q2NDdGRsT1JkeXlzb1ZOM2lOeGFjZDJORDRKMTA4SUtiVUZnVmdFc2lSS0JUMnVnRnJsV2VTK2x4ZmJhTjA0QUFYK25EOUYweVpZMnRMaDRvLy9sdk9iUEhCdnJiM1BUU2liTTdaK3VtNHRsenNtVWpHbThWZkhkMTJsNi9SZk9rYlRJNHd6cGhhTWc2MFNHVFlvN2JNTTNQbWxZRjM0WW1qZzkyTExpbXRFdWU5cE5HVkF2ZVplT1IrOU5XaE5XamhrdTlwODM0UnB6ZERCNXhEOWNreWlMNmlwR3NlZDdZc2V1WlpheEpwQ0dkSFcrYVpWUHduK0ZTRDNCZ3M2bTJvM2JsM1o5blQ1NFdFM09JeTl2SGJaQVBGRStPMmNzcUVWTmU5clgxSnl3SnYxZjV3SWYvR0xod25DaCsyTVU2RTNjT29QM1h1UVpIZ05ZSFI4TmR2YXQ3b2F0amU4MVhEWHpYRHNVYnpxZi9CbnZla0FFQnlnYmo3VzRQOWhaODVIdzBER1Q1TlpZMTZoclhPY2lKdWZSTUxhczhKSmZCNGVPWTdtWW1rSjZZczZmbk56K1dnQTdyUGs1aTFqaUxrdmNUK0szWm94cnplanFuZEhCdEpYbVN5QU0rQkFkZk9SbTY3aDhlcXRLK29qTmVJQmJtUlF1NzFnNGZjVFNQTkZQaXRPVW1ldTdreVJURnRXKzIxbXVTZnk5WE45ZW80dDBKdXgyNmlnSGFabTl4UmMwQzVJbDJ2ZXVOajFiM0RUeS9jYWZ2TGpURnRPZGxpZnpQTXhjVS8zd3M2V1VQZ0hWOW1reHJRRUhTdmdUSzZXWWw2V1JIWW5aVU02U2hKNnZPemdodWV1TVhvQlh3ZC9DMXFHcVBPTnBQQmlpZHJMM0hWSUJrVm1kMVFPZUZrRkhqaVdwYzZMeHd6djVtMC9Oaisvby9YYjdVOXhnSzVRcGFMcFJsUE90Tis2NitzYll6bVg0UXlvTjBzU0ZISENURG42cXEvMXc1V3FqK29MbWpYamswYTNnQUQwZ1kyVlBFdG5hUm5UYytyenEveGR3TUlEZXhaZzZ3Y3NQU3plV3VOVFpjRTNkUlRHa3QweGo0NHZPRGo0YzYwMm82WlpZalNBWWNpWTNCdS9EMlpxb2toUW1xdFNpRjNTamZ2emhyeCtxZVV6WnU5T25HbHVmdityNFlOM0FLMlFpK3VYU210MlBWYWRPa3VtRXhnSjhhamczQnlpeTRaeWpaSHNIUnVPaGV3YTRrY1ZGUmtheXNwTFJJV2xwUm1sdFc1R0VlYVhiVFdZT0oyV1dkVGxjNlV4VUxIUDU4eTZYUjljYnkrdXJTRGdGcXFTWlVENTk3b0RtWFJGS1J1UHRjUmdNUll5NXVTa1Nnd3NqMXN4L1ZjSzMrNDEvT2VBNDErVS9WOStTd3Rsb3E0UGVFUUlVYjN5ZkIxSnhvNXV5c0pRWHFrSmtwWjdKcXQ0L2ZmaUM3V0tPdEtHa2RBeVF6Y09UNDh3MHdic0RqQ2xhT25icDViZlM4VXFySU85aCtiQ2xsN0h5MGIwRnljRVIyYlhUd1FqVmVSYXF6MnErbm14UlI1a1NVVHdpZ1FqMS80VW1CczF1eVlQdkNtZHNDRDY1Mlh6Mkw0dndmb3lFOWx5eTYwaGxJVklmVkUyN1hkcDZnRmVhczBoU2RwTnYxeXlYL3ZGSU05YjFRbHY4REJ5OHBDSnVkR1RKcFZ3WmhVMUZMT05PWmxqODkvTkxJRFNLNCtxczE4S1RrMzB2VlRWRzFIbkVSWHcxZ3V0a3VXK09BNU50b2ZsajM1MWkyd2p1MFdkb1VGVGFuVmd0dVJxNjNKQldsMW1kanoxWnQ5YjJCQnI3OGRNOUpJd1cveTRNNm1WSzM4eXZRWmszeTc1V2F4dHF4VkUreXJ0V2dBcEI4MzRueW15UFI4Mm8xam5mYUh5M3Q3LzIwczlQN0RPcHFKbkFJMTE0eDI2ZkM2TmhoOCtGUmlUNU5QTm80cWNsNFI4ZFdsRndSWW8zQXVHZWt0MjJGMTh2R0hWL3N3NExYL0JQYUttTVpIcjc0SW5RR0xOMXBnTTdPaTIxKzBYTXNhUVpHQVNNVU9OdDlUa3haS1JYckY0aVJCNlhDVXFHOVRLYlV4a2ptd3RzOVdYMGwxZGducWhYSjdheHVHbVFOb2pGZmsvL0QxR0NVYWNJVU81eUNSR3F3M0tkbmxSVlJCNlBWekhQNDgwM1hKcllheStvcVN6dGl3eFpyTU1CRE5wcWt4Wi82ckhCK0k1MDZSeEdqRnRpZitoWnR6RWptMkFYMUxmbEZDN29KNlFlaVRzQXpFN0k1ODhIbDBwTW1iMGd6UTRLL2JmUE5VZ202ZkVPQ0NkMmNmbVNuZEdtcjVFZmJOTXQ0Z3E2UGVaSnQwYjhIQlpNbTMwakFKZTlTaXpQZ01kRFlxVktMZHU4enZtZmdaMDdaQWlBOWl6K1hoVHVtQXVQS2RHNzZIYkhqdmlsZHNydnpFWnFjM052T1RQVUsxKzlUY3QvdlJjVjRZcUxsSWZ0c0pLQWNhRGZmcitaTEdkU1VKclEralNzRExCS0ZyVm0rNFlqSWJDZFdFeE9RM1JYQkM0ZG5KYlVzRW9vYXlHcnBMZ0U4dkVkNmhqemIxRUJpa2liUDhNUDdjOU9kS0FDN2RlZk5td0VscldaZExLNkpySmJtSE1ERmUyVmt5c1VtQmptbTZmSjBiNEkvTDgyWkFtZ29BeHdsQ0Z2RTNpUkVaSTRUcTRtVjQ0VGdFUU15azFxUEV1MWNPb21nQkN1dm9BcWNZNjlacVQ4WmxXOFRCU1haaTZ3OVF1UTQwKzVmU3dJcHlBSnJ1OXNURXZVM29NdTczektJK0dEZlJCVGhzYnNKUnBsNmFGMGVvNm0zZ0dCZVRja0srMEJadjRoeXByMk5mTHdySm9kZjcvQ3dNN01ReEZDN1VIV2wzSGlsUE9IajhyR2tIMWFxU28xbnpWemY3a2ptUFFrT0ljb3JQWjZjRW5sbEcraFE1YUZuWEtjY05KWm5OUUE0KzJvY0RsNFUrK0pDNVFXZjh1VFpZd0xvNnEwdzUwS2pocGJZNkVhbGVoRU1pNWJCVEpxVXNkRjF6WHRjQ3pGb1dERmEwUmpOYjFMK1hBQkRZMHRncnh2cll2ajFUVWJPaFpWaEVhVHljaEtOTGllVHkvdXhaTG1jRWhGUlRpSFI3T0Z2aW0vTTIrQTBkTXRDNWtMRzhEMUg5aURMa0hNRm1qWWFHa2ZkOVhzVG9kZjhTN04rczRIdXRrdEtpaHhyVDRYeGNuaWwxMW8zOG9aZ0ZEdmZTanl3QlJZdno4S2hYRUtMZzVJaGFaRGVTS2FNbXk1VTNpSkJtR0ptODd2OU4vTW1IUC9yT0N1RFZWcWlEeFRHb2x4UDV5UEZUdW13Zmc2cnNDM0xQNGhSaGM5d1lpTzVRbUpBTUtlVlhBNTlMaExabUtaSWZVTmhUaEcrUG1nbm1IZWx0OWNFaGNWZEh5WU02bTNvanpZYk1aRmMyc2t4T1RJaU1YRVdYK0RJa0ZIdTFVc3k0eU5IOXIvSTFkQkxsLys0b1l5L2NqeGZnYTBHdFNCazFnazJYcFhOQy9zUFZVdzMra3F0NGFWYWFjRFVkZVVIMGZ4YzBwZldPdUhINmFWUHlTMHRuMFF6YzhLM0xYR2ZaaGIvUHdSb29ieFFVNXRkdEJWckVabVpGeGlCRnJyNVJ1UHdoTmgySDdHR1JNT0x3RVdnRUttMjkxMkZRZFhnMitrSkdtVWEwV0hCL2pmODB3V0pIQkRkalROUWlMT1B0NDh2eEhQNldtMzRBL2s0dTNpNytIdzh2dytDeFZuc3FhdEhOQmlpZ0hLdGtRTTFpb1RFM0QrK05JMWVTMnBLZmlUaENGbkVpQ2ljSUZzWDd6ZldLM000WlJTL3o0N29WRE9EU2dOZFlGSnNmSHNFczBVUVIyOXBweWVLT3Vpc2xqZ0JxNlVqUXBDWG1DRG1DNUxGb3BRRXNZQWZMelpLcTkrdXQzNE56Tk52cmdPZC9MaVk5Qy92V1l5b0ZERExDeHRCeElhbWVwS3cvS1BOSVpFMTNWVzUrSUM4VEJtTk5EbXkzOFE4NEhaN3B6eVJ5OCs0cGMzY0kwem5GRTExTDFKcnJLK1c0RUNOamloeGFpU1ZWb2dYRjJVV3BjZXpjQmh1R0JxZDQ1cUk0ejlwOWdmYUZ6cVlJZkZNRHAvTFFFcXN2bE16dzNQbEpuZzRpVlJ2M2E5bkhrY3JkMlpGRnZ2TGRaMDBpR3A4ZjRZS2tPQ3FzOHJLaHVyeVZnRnlzUnJqUUxpcEtRRm96ejRBYU0vbUVqNUU2RUxseCtLVEh5eWZ6bjU4TGs3cGFqSmxsOUFyN2dRVmFtUTRydGhUR1c1d1JLWVBXNWMvTC9HWFdETmR2QWhHOWhhYjJmVUJFSHQzVzJ6UWxwaUdpZE0vYnVKMlJ6STZjNnk3ZVc1eFVqVzUySlBRd296WUI5aDZNTFk4TlZWUVhsSWNXNUthRWxka0ZOeGx3dStYNGUwUzdFUXlITCsvdzRiWG43K244bkhzWURZNkFXOVhPd0srcnhMSWpZZTJ4ZFJWSG1zVWZ5TmY3VXJzd1RYRHE2UlZWd2RRdTY2N3EyV0RKNUJ4Q1FFMzlMemRPdENXMFVDQXh6WXR0Z3ZiMlNTK1NqYUc1dERNSUdKUUtYZUU0Ujl1Q2VGdFFPUmxaSXBneVkzOFNyeGR2UkJFcWJXNVdvSUROKzFGaVZONU5GcVJDWDY5MmE1U1hOVFRGbjloVzJkRklpY3E0NVlPWTQ4b2pWTTAzZU8zRlN4Z1V6OUtINm1iRjBOR2hqR240UXc3V1k0YmlvMkJOZFhsbEt6ekpUcHNQT05mZEpjNVlqSVNpOEJ2UWdmN0QvaWpVUmI2NS9FWnBCc0Ivcm54NTlQckM2N2ZWKy8wc1IrNjlialpzYWsrTjQ4ZGs3bWRoN2RQbjdQNTZqUHNrVG5VNTkrWEtEelZ0NHJHQTcwSEJqbzdQdXJrOStiL3Z1M2w0ZUowcnZiL0I5SnYwUjk4dGk4dVBpRmhMaExHSjRrRW9zUjR6enBlT0ZHVUJFbVhqbGk0N2t2MlRXbVhVYk1QeENSRjJ5OG1OWXRrcmZsU1BCS2FwUFNNYmtGQ1luVCtsVHJFZ3dDcXErbHlVYWQ3Ykk2elZHakhpUnEvVzM0MGw5ZHp2RVluWHJZamc4U2NueWd6RklhbzZpcWVrVVlXTVBuZjl5VGdyWTVxVDc1cEQzZWNRTWJXU2JwWFd5NXZnekNqMzhLRFVyZ1JYRXdRMmhsMG5ZNGtlNGQ3WlNRRUZuSnk0em9uaUhrSjdYdEYvWGdCTk1NeUlEODFrZXNQaWVCU2lCNXMvNFFvRjM0Z0JzSG40TmhoQ0hvZ3Y0TWxpNmgwcGFiR2pxdkdHMldqTytUcTZuVnNwc0pjQXora3V5UGdBdVdac3BTbmdNNk1jeG83WTF1RHlmdWdURWdYQ3pMb2tCSS9IRkNjNlJUaFRzcko2Zy9PU2g0a1JMZG1aK2YwUFdPck5OZDB3cHZsdVdMV29EZGhyNStjRERzUFQ2NGVqWVlsdzJObVV5TERCclUzZEE0V2lJWGk2TmlZNW5CR3UvaUNiVW5uaFA0aFkwRGlrQjRKeTg5YVg3ZkFRanVjZlRWNS82ZUc4SlRMaFVKKzJ3YzZjT3hNa2NiTDJvTmRMNHJrendiMkZUeStWOWhKTGJFUit2OVJBeXB1dU1wbjZ1OGpwcjFUeklvQ2RiOWx5cm81eE1NRjZjU0RYWHpwOU9IcjUxR3dIRVprdVkrRGRaZVYydHF3M2ZDeXcvTkJLT2EycC90dFRPZ0R0OU5lQUkzUVh5dG1SSFhZY3VsL3IrcUdHSFVRUlZTeG1CSmZpNlJncjlRWUdqcDlwamM2RlhBTEphVDQyaEFTYmdjT3JtUmJOU3pkcnFTSTdJS25oMS8yWG1CWUs3dHVWN25HQTROd3FQU1g2QzlPdUsvVFNjbS9POVdOL0ZxUE9OcC9Cc1phZUkxd3E1MXhRUEhmK0ZXUVJvS3R6azhDWnExM3pOVmY3YWJNN3ZUY0dwenBPcXUyQ2JuUittd3ByUzRadStsZzRNTzdESS9YdTJUV0ozam8zK052SitqYmRTeEJELzdhOVdRWCs5V3JMZ1pzN1V0djlTbFc2UUhrMDVZVG1ZWlB1NllDVTR3cUN0c1RkbnRFUVdLYXQwdlRuL2FtdmRMWW1kc1l6UnFFc2pPYlA1cEREdUt1dXlXaGhTRUZ0MHBiT3A4cXkvOWJXU3I2KzdsaWY4UFZzaUFabEpxYjJSbTQzcWpxZTNDekJidlJrcGdyYVU3QW5tcHF3MjIwSkl5cFZmV3JEQTU1SmlHNjg1a2VvRWh3UzNSdVVsYXFSU0U3THlVeU1pZVpJN1dJaXMvaVN3WXRkNlc4U2pJV01URDU5aWloTEM4MXVUUXZVVlJ0RjBtcmxNYUwvTEZvQkFJZjV1ZHJMYmY2VUxTaEZ1UkpyRU1jQWtQYjYrWEpnVkE5aVJBSGI4cnpSSU44U1pQSW5TWFVKa0VjZllLZjJiRWU5d2g2ZEo5a3dRYWdPd0YxMmVhS01RbWh3cWpBNGFXbU5PZWpEblA2UkVOVDZPcmJvNHVQZ1VtbEgreXJnVW9MZVlHaG0vbXFtU0p2MFdGV2ozaDAzRGR3REt0eUlQMTJ5RnhZQ1FXTVlWS1dydWIxR2htTkxpRTNvN29jZFpqWEkyN2NOU0lIa3V0VC9NRysya1pwSVUreG5Qb2NoVWlQOXdvTnRVV0lqRWd1SWpQZWh5T2ZaZW1hajYxTzRRMGsra0RUU1gyREtZTEJEVDJEY0JyREFMK3ZrWUhqT1Y0LzBPa1hHVG1icndaOFgyMGJ2aGQzZWIrOWxEcm56dklrMUxmMSt6RHAxVDVKS1lRQms1US95clUwZEMzTWQydGRLMSszS0U2ZkhJK1dNWWFnZi9jK0dvQWtqSHlRdDMyMkhSc3ZIOURWQUZyYUd3NlVqMWxOdFAveHFkNnQ4ODNOcFhOK2wvM21icFlPVzJva0dPamM4a3U5Nktkcm9zNDFtekRMdUpsdWwzNDd3MjF4N0t2cnhuV291dHJtdTZXaDI0YkE4bStrQlVBYkJkdk1MRGY1MEhNQjByalVXdFUyUFRpS2F3WStyTXB0aENKRUVsNE1TOHhQQ2FEdWViOENIZ2ZwKzNIai83d2s0d3N0SFBjWVdVVGV5RHNrenFIeGt0QWd0a084aEpzMzNsQ2YwQkJNektZR3VmRElZZmN3VHZob3VuZzBuL1BtRzlvWGpIWkI4bWlSMFZ4cUtES0d5YllCS1BHMDBNQkFidmdmYU1zSVluQWdQZFF5N0oxWjhQWlU4UFprOE1na2F1RnZMOThock45Y0JBZVdnR3M4MVQ4U1ZHd2pjWHZFT29wenFQQkFoRDMwQ29ZVGNYQXFFcHZMRExFeElURlJ5RUEyaWtSakl3T1JUS1NsaFNOKzZNQ0g1NDk3UDQwTURiOS85cWozNjFpUmdEYzZQY1ViRmNSd1IyY21PYU9HZHU5dWdnZzZCZEkwb2o1TVVzVUw2dEtLMWIyY0c4SXI2VzJyRlZJYUdzbHhjVjFjM214dEd1eEVmTWNreDJJeGhPL21qWGZ5ZDAzZ2hhS1lpZkh4ektoWWEvUEl1NEp1ZHVSVVhScnNsTEI3bkZ2akdLNlRrcy9IN1BMSmxjY0U5bXBHNlIvTFFITnEranFWU3RWNFV6WXRLVTdBNHNUemcvbXVQbmluVUJjUkZ3SGtxVWdxQTV6MFA0d2psaTBuRjI0RVdTNTlGakp1TGMrcjdseTlDNzhPcjhuSlRrLzR2YU5DWFMwa3poMTdsMDNlellCWU5XZGNuVnFVZVNTY0UxWlBIWEtMcWRNejFvOXVTWndCZXVzb0VycFZDdzAyS1p5blZJVkhLQVJBYS9mV3ViZHdCczlHOENma2t0MDN6dGtXdCs3bk0zY2Y5ejNtSFByd2pBeVFXU3hFTnlvc3FXWmViTGYzZGtYZnJWNkVmcmx2TW5NanJPRXpkNEVIQXhUSFk4UmlJd2ZwRXVoYjQ1bUs0cmFzM1Qwa2ZQQlpBeTAzMUphMXJKSDArZ0ZWSjJBMUhLalE2QThDdkRka0ZHZDY0UDYzS1RUdUdWd0kyYWxvK0JhenZHcWJrZjJ0RGExeXZjQzFWeXM0UXJjaXRSVkRMbUNRcVRsTlVhTHZYcHc0dG9CT0llUzNZSEx2a2UwTHFmaE1hbWEzcEx5Z056ZVRSazR2cDFoaS9iamxRZi9vbTlqMWVxN3RUK1RPSWFHcDFpeEtDdzFJSHdlenJ2VkxWTjNvekVKSDIxZ1hZTjNGVEdiNXBSWlFYUnR3QUtBNmdIdU1TVlNIQVNBQWtPcXNpSXVhcERXeTBWcmV0eDRuTnhVNG91VUxGMUNqdzFxZVdnQUFydk1KdXJuaHJNOGF6dTV0MEphNmczUkg2K1IyYTBoc2JXNTlxemQwbi9VVHBPN2JPckxWR3VWdlZpb2hackJwTC9xVllHQkMyc2x1b3NPTVFEY0NOS1lmY0pGWHF4ZEg4ZHpIRXdEY0dzbmZMUHRmU0J1d3JlbVVmZzFqbHZxdUtCRnJSUmdrSmZoVTJYQ3JRUkdkQUcwWStGUCtVRDVJcm05a0RCbnc5c0VBZVJRNmEvMlljZG1vTmtCclpIU3pYSUtZa2FFTWt5NEN6VjErQzkzSzRPdnpCajk2bDJrbzBNa1YrRkFJRURVQ2R5QXZSTmdMeXEza0VHV2dSL2lWUG1sNURhZi9oZ1hleEtabW5PdUdzUUlWcG9QaW1sd2NZRW15Tm5PR0hxM3VmZmE5enBQZG5LQ2UzZXhJUlBQSTV4NzZNdjcvcldJY052WVllNDMzalErTXI0d1BqWStNcjlHWERkVS9qY1BHSG1PdjhiN3hnZkdWOGFIeGtmNzFpOUdtSVZ1aE1INWM1Zk9uOHVweWxZbm0wVnpWN2dNc2xDZUsxVno2bENnS280SVhGM1dLODlnNDE1aHRURmlzek5HcW1WK095MXdFWUgvNko0UFIzb1RKMytKeVdrZkxTbWVnSVYvajIyMmtiZW9vOE5XSWNRVU5lZjRTcDVaSnlHaVBVQWpER3JLWkRFWTc2Uy91QndrSlg1eGRUZzRVQkRmR1UvY1d4allnclpwWmx3dGc0Y1c1YVhKQUVHejU4L0lmSUdkVGN6c0E3UnlXVndEbzByRDhIb0MyTnBudjlRbnhGRTQ4SnBNZ09BTE1mQVFvY0RJT2dqRmExS3VOWEowQTF6RFc5SCt4ZXM2Y3VpdVpnYW4rSWVsODVRYTlYN3N2djRrUlBtSmptNEx4SWZ0Y1BKRkFhUFFXd2FJeHZhdzl1RHFYL0pNT1d3VTBBUEtKWmVNTFFIZGJKZEQ4czdZS042K0w3ek1acVB5RE50dmdiejVzY29JYjlBSU85dzMwV0RtTyt1b0hyUm9YRGRiaHVBaE5LZkl5anVHckZKWEZEbEFOMFZiaDVuWHhTcHdHcFlIYWJJTy8rWEJjSUxoQnV6amNOOUFUNTNIVU00TngrZnpqZlNkVzd4ejlGa0pZbXlKTHlmQzRxVEQ3ZFhxOXVXaHhScVYwVjJVcjNXaXhGcHROQVB0QmtTU0VoT2hjakRtSHVWZE5jUEFOMjFzSXB3eDdWd2NtUUNodzVhTERlcjlmYnVIbTJUZGlhSGhHK1pjZzROUStqWjhPa3ZGMmgrL3V1dnV4enl0cUJ0WWREN1JxWDBWUjQ4bUpSb2VWTCszdUV3M2FJWFEzT2taNFRsMnVnZDhEMVJJTTkzT2FjWkx4cGYxRnJIbkwxaVFNMERESkdrNmJsWXFxdmNVUVZSS1NvbkZuZ0phdGppVXllSzhObkxURE5WdjBXWUJUSlMwdVR6TWNTeXNmMVdIdEdDVlpPUGhtQXlYMU5ta2VkYUxBdkpZSU1RUkR5RUFHN0FBSHJWaFIwN3lXbTQweUFOQ1N0VTBXamRMNFRzZTdlaks0SnhIZ1NvNFJ6dWx6bThsN0xZUnNGbGt5d29vWVNHQTcyVlZScE9rQWdMMWI2MXdjZXlRQS9hVjFxNVZtbkhtNTh6a1p2VURFRnJEWGF5bVZyb1JoYkg1YzJCOGpYQ0pzUEVFN3pveloxalZSbXNHazJmbFFQUmJMQU1GbkhKcER6Z2w5RGdETHRvVlNDNFhLZ0ptNENsVVNVQWVJNGF5RkZxYWxnZ0RROHFBaTd2ZVR5Y3BsNnBXME9LUHlzdnJmL3Z4ejZtZVBHdnVmZnRwcVRlZVhqNnB5WllPbUhpUU10V1grbEZTVFVtbkpWamxDakNYYnNkNzFmYmNMdGlTUlhZUEVoUUtQelYxREM0MTk5YXFha3E1T3V4RDd5WGd2dEJRYmd3REJvSE9FUWdnalB6RWRBWXdoS2Q1bzMvNzJ5U21sbzVtcU9RMmRoV1RnWVhGVEptRkJ3K0FUV1VtWFlVcnFRdEtlWDJhcEN0THVia3VrVWFETElUTlh1NklWYURrZ3lmY1JYYytCV20xdWMrT2tvWm12ZUI4emRkTkVWOVJGcnl0QXUxNGJJUmNOWktUOXJObTE1bEh1aXVUQUo2WXlrTVBWQ29idHNqRHhhcXN4SVNNejU1VzhWUW9oZzJoU3ZRK3JzeWxXM3lTekNrcjhoU0F2Zkw3U3l2ME9OY3BpSjJwSmxqbzZGQUdrZTBYd25FK0JRbW1KZkdja1p4RTFmOCtKSEpLSUxNVFpsODFHd0luaG9FMXBpWGtjaXQ4WjJoSi90V2dFMGFWYmZMcEFFcHlZUHlLY1F5TU1uSjVYL3gvUU42RFo2MnQzMTBjZ1JzYkFNOWdSREdJdk1tb2V5d1I0RE56NndTQ01ySEdlYlR0bDBBdU1PcnpFT21hSU9YUzZtODdoQ2h6RGsycGE3b2M4QjNHTW9MVXg0Q3U1QzdtQkN2RHlHUzNFYk5wYVNMQUt0TGRwZlBIcHd2djIyNFA1N0xQVkNxeXk3R3UvZGJ4Q1ljWWREYS82enhIY2Y2d1ZjRmtHUnQzM1VHdlFlQmdHWlZpS0Z0ZDhwQjlXcm1ITGkzNks5NjM1Q0JsMWRDYWsxQVVPSmlMU0pPT0k5MHBnd1FIM2k4eWIzblNtOS8wSWd1WGpQWEpsT090bGlITVNSZTA0Yzh3cENhVXpwbHNIVzVZWnBIWTV2T1NrSVd4dUpuZjVwMGtYRjFia2NTZ0tnRHQ0QndWYkRmZHRxMlhVRlhCV3FTaUl5a2JMMnBTVHpMbmRwam9lbGhaSGpHa0o2NE9rY1VSaE13dzJVKzNiYUtJZlpFNkdGYlptUndUWUQwaGVzQVpJVkxtaFo1QnF6SGhocW55L0RlUFpoeHh5blRRWGIwQWxuWXNnTkJzSnRHM0N2R2E3OFJFV09HUUNXam4xOHRETnZZWHJGbW16ZFlMM01FUXFYd05RSndxclFBTkJTeVdEMzB5cEhtaHc3d0thbm5Qb0l5M01aMnRNbllPdk5YV1VxSTJhYzlXQVpaTmxDYWZyK08rVHBGYUxzdmF4alNLQTE1cGhVUzA5UjFIYWQrTTJaNWc4dHFBdmdBS2hWNSsreTJPL3YwenlmTG5zcEZrMkhIUkNvbGRsek9zcnpDbWg5bjVOOEEyajEybk5YbUpvbjdWVVk0UWh4bzYxcWRZWGRaMG5SbVFhSTRHVjFxQW9Jb1JHVVF4d3BISTZzdjc5SnpXN3B5c0VoZThneU9QTU1vNmFuMStraXpWM0ZOOE4vMDdnQWVObE0xbVdtT2lnVjFla0I3VDI3eWFnenAxTE1lZm1XTHBGSXUyZE0wa0ZzRWFLNkdvcGRtUmNJQ1dGU0JpTnBTZmZ5R1VGay9MUlVlTUE1ODNjSVhXbW1aTVV6bXpVcGNLNzFPNlRoSWZTakNsNUc0SXdxalVqWmdNVFZVc2NEOTVDOXovNGhyMEtWcE9NM1c3TE12YmZMa0ZHRll1MXowNDRjcExqdXM2THFCYUw2ZTRPY3hHbUFENEJvSTR3M3F0T0s1YUd5L242NnFoM0RaektSaE96K0JqSW9ueEwvelBwMS9IaDMwcXB5ZHZXT0pMMElWa3dxR0xRSkp5aW9PNEpiY1orUDgramNhZVRFazAxNGtUWkl4WWhDaHBOb1liSVoxK1VNN2Z0R3phYjdpUlNiOG1wQkZUdnRTWWFYSXZ0Mzd1OVBSN3A0N3QzMVY1VEw2QnU3eXA5R0x0NFhCMXJqOXFwaUdxblFpZXplWURKWkdVeDlWQVFXUlBwbDZVT1JGT3ZoZnA5M1ZXSHZOc3dURFhFMkVOZlZVanFPbzgya3JNUU92UU5ZYzRwUmZKa0RpZWFiS0J5b1VNZVJ3WkhHNE9vdU9tVGFTbTZQOGxDWGVjT0E2eFo4dWpCQWwwMjI0ZFFQWHViVmFIK3J2NFp2VzgzZnR1UEh3SzFrdDU2b1Z5VTJnVUQ0QVNEaUNvZHVzSjdsQmc1OERDUUpMdGRSb2ZoL2YzS2pjNWRYRGhlKzNaaVZqd3IwcUdkc3ZLeGRhSHUyQ0h2dHd5T05sYWJMMG94aTJndTdySUVqRTNRTVR3ZDVPVXpoVDhNdkdydVRNZk42MDlneXdyMUg5VjkzaUcvZnA5aCtwelZTdDZERU9lLzZQRjRGQ3RmYS83QlhEOVpmSHpmZk4vQVo3bkxwNjhmZ1hYaGdvaUFIWlBOdldtMXJJQ2U3TTF0UDdvSGRuMlFwb3pVMVl4Y0prYU5zYnhyWFYrcG85a2RCbkNhd0hNUUdZQitPMlJzMEtseGk5bDl5ZlhQZGUvM3lZZVBnekh2d2dBVDhrQnhkTDNCTS8wT3I3YnplWm9PaDBtTUxMN2RkSjFnN2NNRGRCZ3RTeTgzN3BLSjdRdnNXRVkrSHhuWmJyd0dVOUttNGJDMHVPS1dVZXh2Yi9Xb1dodkc5c2tQYm9FaVB1VEY5WGlNSWRzUVZNeU9qWko4c3l5QXNnWmNVUUt3NjVpT3M5azcwMHdmQXVoYjNEOXRZYTFwNjNCalF5OWEraWlpeDZ6YTJSUVNCS2ZuRDFadFZISEJxOEpBY3MyOEl4MVIxNjNTaEhQbzdyeGNPcVVUWFJucmdLaHI1Vm15eTc3UVdaN2RScnBzMjl1c3ovRmdJblFWbVhnT280d0wrQmVDdzgyQ3FOTjFVNEJsVGtpUkpQc2lSWVkrZExZZ0RRL0pBTzhHalFLcGhlWk5qME04N2pRYUZCa21aV09RU2ZkUmlQR0R3eUc4WGVUcnhDc0ZOaE0vNmpNdndrSXdsRDJXZFpacGhkVEM1Z3lRNUlhVUMrQ2VRRTA1K2pzRUcvTVNJcGtZdlVjaDFGdXhVV3hpU3IxRTNtNjZSYUVaMDlPYjNKMnR3Z292V2dqenBzSU9MVCtHYmxleCthS1B2WHNYK1dqT00vWjRyYzdsOFZHRnRZbHlLc2hpR0hFbWVHdW1UWklBajZOWXl1MzB6VllsL1pCR0R6S00wMm1lSS9pMnU2QnBPS0RrZXZQczZrMythYUk1ZUsvanZTZlRkNCs2RXVzMVNDZFVFWHUwZS9Wb3RKaCs1cUVQb0NDdVNLdmRpRURnUEtHVmdDMXNwNVNmSlRCRzZyTGI3ZFFvUm5hV2FDL2NrSlpTSVVieDFJbWFkL2YyNGozajAyb2NJQzJXVHNBYUlPUGUwNHJZdXBvYVlFenNlL0xObjRsQi9sSGFWV0pyZWVmVnJkK2g1Z2Y3RmV2dndjcHR2Y0ZTSXFjVG1pQkUvN0o5dk9aNkU4RkJLZHNLcEs2L3hpYTJhZU84MmpiMG1UZjE0UWJjdTZsTVE2VEdIU1N5U2IwS1lPY0JsS2NUYmVXbnFRa2M3ZGJ1MElZKy9SRnpUTnFhbHFJSk5IZE5vZVZyY1lFMDhHTzRHQWlack1MeUFSWHVGTVllaUY1Y0RIMk94alV1dXBTNFE2M2RSTy9paWtRUExBdThOTjFERmI1b1NOcTdnNUQ3RFVFL2ZVbzhpUXhQeHlUdXN1Ym5BQlNyc2ZlRGFQdEJBSDRSZEIxRzFUTUc5OFB5bUZhZC85RkEyQzVGNkcrWnQ3dElZV1ZVRWRlajBkbjRnUHdEODZyRmRjamxEb2VYRnN3aUhmUjJ2K0huODVUTU13SVYyUTNTOUJGZ2EzVWo5aitBTkFncjk4YkoxVkY3RXFZQkdPRXA4a1hrcEpIWW83ZkhwK0cxRWdIeXJNaHRLZlVSQ1VnVEpPdHQ4UFk3OHlMQW9OMlRBL0svbGsxQjZpSytXVUt2cGZBWDdvaFFTc2ZkSStleDFZK2Vwdjh5eVg1blRud0JtNkM0cDJBY0xCLy9zVmZLdWZScnJzNkN6SUVSSUo2L01WOFc3ZG9lN1hpZFlKbzA1N3diSmNFc3lnZ0FNOHY1Mzl3eDlvcHNwbmVFcDZsQWoycmxQNkNkeTFldzU3MWZJVzhPa3dMR0FnS3pLR01BekF3RVBwYVVXcGFMRktuSWl6NXlqUUJieE5uVVJOT2FUQWRvcGEwU0MvRHViZVE3RS9RU1FHN2pyWVV4ZFc1SlFmVEpmWGFDYUt1bXdjaEZpSGIxNDM4M1BOa0NtbzltemxHa0JTZmhEcmpkTEl2SmxXQnhlMnk1TG55bmpwR0l2YS9lb2tpRmp6M2JqdEZtemxxRFR0dERmRmsraGN3SzhmTk1HTjVBbE8vSFc1SVYzc0ZGYm9LeEwxTmFYaVNwN2VEenhrUHRxOGVLT1I4TFJHaWgxTWVML1FEMDhYcTFhSmdJY1hzUjk1cHk0NjBBemhBYU1zUFZZengraGpHVUsyYzRIVVg5aktDbFFNNUl0QmZVNlhVWkxNSlJBclhsQXB3aGxPV2FLbThmbDVaazNNaGJrM0V2YitNLytpZkJJU0dYRXFSa2tFWTYrWUR4eFR1bndJamtLbHBLaWtHdThCeWtPQ1NBeTRvVUUybVVaK295S1pUQ1VDQThYWk5TV3pnM3d5dlByVkxCZU8zcE5ESWMyRGVRaUNkSnE4aFdzWEJKR2hDVFFtb1Jua00rTXJ6c00xMVpPcEJMRjV4ZHQ2UlJnSGk0RkQ4ODhkNWJRZ2lId2NNTE84VFNOQjZvZUcyVE9YaGtnbXZpR1F3K2RzN1QxWm9OZ0thTWpLUXh5OXdybEo0TlUySThXWk1XZThHQUNJMG9SR2JCb3dxWlBESkpkNld5U1Fod3NvSUZjeVlKOWhEaDlIWU50c2VVcStCR2ZFYzY1NTBsOTZlbCsxWUdDaWIveTU5TWs0MnVrbzVLTTI4VWxqdituMlFZbHRNWElydXZ4QVBOekJxWW1iMndqRTRhMGp1enBIV2tTTzBRa05KZFZISTM2a3ZxTXBEWTlwc0piUlhmWWlWcVJVeGh5eGZYQ2tEVkpCWGJzTXlZaGkrNmtRWituWDFSOVc2UjlWcnhTaks1aGVJVWZwTmRoTEh5S3N5Y004U2taeW9pelNZdFVkU2tEcU1rYUpCamt4U3A4SkJOWXFnSVlUUU1IM1REQldGWVhJV0JRc015dzlpSDRpZENmU2lraDdBUWVpR1l4Z1RSRVlqTmV4UlM4SDdoOCtuVVVlU3lxTFB1MmxVR2JDSk5Ob0FLNWN1blBMYnBJcktCMFA1endCTmdiQUFpeTZoOEs0Sm4vdGthZjhDZWpZY1ZhSXdmRGdYTXBHNjlNcjU3Si9nb2Q5bG5VNWJ6Mjc3MDUzdk81dnQ3OXVabjZWNTZ5Wi90dFp3dHFDN2s2WjZUK2VHZWcza3hveG9YNlVsNmtQNXZXb25BdjYrZXFkL1F3aU5WZUh1TzVydDdkdVpINlU1NlNjOTJXc29pdGF1Zjd1TWNmaTNyZHBpZGFrS0ZOM0lOZkZmSzJ0R3Z4eFZzWGpZMHFtdVhFRCtuMzMzNkJHc2JRM3l0dVY4WUpKOVBSTW40blNabnZzYkhhcXV5Ry85WU1NTUtiS3YwcUNwMklGSGNNcXZLUGlGRk42am9wZklkUytWUDlyTzRBZ0FBKSBmb3JtYXQoJ3dvZmYyJyk7XFxuICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkJCLTAyQkMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMTIyLCBVKzIxOTEsIFUrMjE5MywgVSsyMjEyLCBVKzIyMTUsIFUrRkVGRiwgVStGRkZEO1xcbn1cXG5cXG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXFxcXG4gICEqKiogY3NzIC4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uLy4uL25vZGVfbW9kdWxlcy9AZm9udHNvdXJjZS9vcGVuLXNhbnMvNzAwLmNzcyAqKiohXFxuICBcXFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xcbi8qIG9wZW4tc2Fucy1jeXJpbGxpYy1leHQtNzAwLW5vcm1hbCovXFxuQGZvbnQtZmFjZSB7XFxuICBmb250LWZhbWlseTogJ09wZW4gU2Fucyc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBmb250LWRpc3BsYXk6IHN3YXA7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgc3JjOiB1cmwoZGF0YTpmb250L3dvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFFSU1BQklBQUFBQWdPd0FBRUduQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHbG9iaW5BY1BBWmdQMU5VUVZSYUFGd0lnWHdKbnhRUkVBcUJ1bGlCblhrTGd6SUFBVFlDSkFPR1dBUWdCWVJnQnlBTWhSOGJwVzhWN0pnaGJnY2tTTzl5V0VWUnIwY3JkUlRCeGdGaVBGMFUvUC8xdURFR05taldmWkJKU01Fa1Npb1NaMDVrWUJZMUxTTlJRbU4yRjBSQ0t3ZTNIVXlGYW9lcDhOWEFRVFlYaEk4RUN4c25PVm1oSFNSYUtMRkhtaFp2ZkpFVS9IQXNZVThWa2laNzRsSUdNN0hEUzJzVi9TeHUwZFhRRXBsdnNjblBlR1NGUDA1d1lQTWhQN2lETTNDY2o1b0xuN0gzZjJlVFRYSWZ2VGxjSFY4VlNCekN0S0p4S0lGUTFja3FGTWcvL2pVZm5rNTlIM2RCb2F1aHJITTVPKzJJRExBSHdHMGlnaHFlTlBFaUhxNUtIandvK2psZkJFVUVSZnhjM3dQZktWKyttNW1hcFprOUl6dmYvbXl6czg1cTlteHJ0ZG82Zjg2WDJZSXZoQkFnMk1pS3p1NFg4L3FLK3BydUZkWE1xOU5QdGt4Q0MyeU83UUM3cVFLZjBnL0pFY0V3VXNhOU9SanY3V24zdzJXNytSL0taZEpPajQybEVCVDBqV3ZOVVFncXFER1g4SDUvL2kyUUJhYWtIVUpOL2wvcXl0MjFiTDU1aDFnL2poUUEwcHp1SHRuUFBnY0lIQ0FGeXpSZG5PNG5iZk5GYWYvVE5NVmVpbnVxT0FPRmova2xTTlVoODdpTWtzMXNZTThCWU5Lb2NzcGwvTzZhQjhlOTBxazJQQjl6Q3czVEQyOGlscmlGaG1tbkUwSWtselVnQUVIMVE1M1ZTREpLTS9ZZDE0OFZVTlhhRHRBQ2tEeE44dGNsZjkzRElXSFNNak1yenYzSGFiUHBmK210c0hLRDRWQVNKQTVuT3hqcGF4ZzlWcGthT2FaRG5wQllIRWF1NlhBSUJ3N0ovMi9UM3ZhTlJyWm40V3dzN3diWTNrOEtVTkY5NEM2cDB1YWs1SExlZlcvZVBCakpvNUc4cXhGNFpmbURyVStTN1FWSkN4cDUvemxhTytRQVlJVmcyZy9XSjRBcXhCdnN1RXJUVWw5Z0RWU1VYWDZWTmpwQVhRTmI4Y3lERVRIRytuTlBtb2U5RGh2R0xMSE1NV0tNM2ZWL1AvYnRheG5CZUdHTW9vRHVYZi9XTUs3K2U1bk1kYU5VdWlrcTRzL3VjUVFLWFd6YzNla3VHWndJUlE5SlVNbW1VMng3bzdVRGFMWmp1SEh3Q3RkaElHbkJKWjdnSHFoUW1LSFhEeUdNR01CSmo3S0s0UHhNMDYyeFJsOFZ0RzhZZlozWnB0dm8rOVFlbmRZQS9RdGhEVnhEOFFzWmgxblR1eVlQdFlzUk85NFMrWTZxaTRJY2hCOUFPelpQRWFSSS9BTUFlemlBaWFqL1Zja09SWWdtam1Ja2tsUVprU1dWOHFKS0phcFFuYlpxbTNvMW5EbFpwSEZOYTA2SHRLalRXdElwWGRBMTNkRWp2ZEM3dkpVUHdra2Z5QzhLcmdvRHFrME53emFMd2pZY0F4WHU0VzNYT043ZkprUklrT0ptcEVWS2NFTVFDWHk3TExLaUlNcWlLaHJpSnlXSzF1am9mS2cvUm1NaTlzUjhMSmhzblkxanl0KzRFZmZpU2J5S0QvUWIvY01va3pOZEpxVjlPaWNtTjZkUEJtWllVcEtWdkJTbUpOTlNrVFZCbGxQTDMybkt0dXpPd1J6THFaek5BNm5MazNrK1QrUzV2QkxtaC9KWnZzbFA3QWY3eHpsWGNuMWIyOEVJdTlyVGZnNXloR25tT01ZaVM1MWhsZlBRWXhkcjIyTm9qS1VGM1NTTjBtV0ZiUWp1WFQ2aHJONUVDNXl4eVE2MkZFM1FsQzM5RDRiQ0s2UEJobzZ4aXQ3RUZkYXMwTnI3MDdkc2FwY3JrSVkxM0FZeEgyTnAwMVUrN0ZpZ3QrM1pVQTZIakNwb0xTdTRiY0d3b3d4UEZCTldaUnRnU0NBKzhDUkVOK2RPT2FGQWE0azhzWURsZ1ZHVGhDejhTdXV3ZzU1Z0tQamNGMUlrYVl3ZEgwMDJPSXhoU3M0alZNaEx3L1RadWFCK3hlVkU0Z0pUT011V0JqMWNvL1VKVU9WQTRIa3QxcUNXcXNiSWdZb3BkVXFWdUVPVkE0R2FzZ3FQVlFtaHFNZ2FiRDJzTlpKSUVndjQwcmRDOVkrcE1jTEVpQ3VndFJPb3RBUWltU2xUZzhDRkw0RUZqQjFZMnB0c0FSbldBZEh5bzZEdkpFT25ZdzN5WkZ4Qi9neTd3YlowMlNaZ0JmdHI4L1BUblhRWGp0eVg0QzNuR3l6UTBCV1F5d2RETlJ5ZWtCSThQV29BZmZTZ2ZDOXoydTBtZ1FsQjc1cUJnMVArd3ZIZ05mVCtucmFxY0RKNHZBK0NFdnErYzVqTDgxMFcrbXk5enU0OWIrbDlkM0lRM09FTzk2cjdwZXh6ODBseEVqQlFnVjRHZk9iejhYRTlJTHFoS1lFdlAzNlNtMHJHblZLV1MvdDJCUURMUHpvR2dPYmZQSDd0RXZBK1QvTE83Umg0aHIxNUEyRHY1ejFxaVI3dzhWVnRENExrNjRwZDR2Q09uaGwySW43S2VSSSs0ek5nSHhMcG5yTk0wTDFsRFdEMm1jMDJJT0VXaExUeUNPVEtmWndQYzVNN3ZMOHNnMytaQytrYTEzdXJ1MzFvLy9jQnJQZi8zdnQ3ZHc5WnR0UnZybk9GcXkxaExHekRldnMwamdFS1lQK1hmTTJIZHNuKzN5NnNwdXBYZ0MvTTB0OGkwOVNKdmFqTVp3Y2R6Q3puOWdwTnREQ01tbTJNb0dXS2RnWFJjSWlKdmZJTmFzckVJS0dOMGhpekhEYkJqOUZPaHRoaCtUTWM4TFBUekJubXRkU1pBaGZkZ2hpdmM2dGxrcjNzcDU0MkJoVkVQalZzb2FQcWQxRkpFNjMwU2UzbmVVTWZxdGhLanhob3FLRXZ0RjZHMmQzbnMxOUJJTzNEWWl4M1B5eWJxWmt4dmFWWlBXTDRNTWkxTmRWVmxSWGxXazFaYVVseFVXRkJmbDV1VG5hV1dxVlV5R1daR2VscHFTbkowaVJKWW9KWUZDK01FOFR5ZWRIY0tBNmJ4V1RRYWE1T0pINStkTGczUzJHZytYSjl0Syt1VWhDK3VNZjdmdHdMam9aN1dUQm9DV3JrekdEc2lwWTJ4bXMyVUdDaXVEd21yaVMvZ250TEtOdURjNnVGQmhNZWpFcEhoU3dDTDYxVGtlbmk5elJNU0lOMCtlaXcxYmpXTysyRjN0VUExRTB4SnhOZ1NNekZCSmJZaDVWTytNRHAyL3JuRklQV00xcVdEYnUxVTVVOE9HbWZoc3ZYem1pdWpEb2dUVlVNaTM3QzhpMnVFRldsQTEvYytLNDFEQ1NRVDVoVWNJeS9rQzVVQU0rSjRBaGVESjIwbDdqSVdvNk1IYnVaWGswZVM5NVgxVG1wdXBiWU5PcUpvSmtTL0hFNHFlekxhT21xR01DL2pMbGZDRW1IcGsvYkZUTVIxMVdJb0M0SVgwTzhUL1ZtdmVPUVYvQzZVaGE5Q0RIbEg4TjVoZENrZStqYVFBaVRFM2NZa2xpaFVaakZGWkhHd2w2NDZOaXBlYUY0M0RVUUFrNzB5VXN3UUVzOU83TFZnVHBVSjFTalRRbnJ4Qzg0NjM4RTVTUDhHbUVONTZqUXg0VWxMUDd0SkhYRk1EYSthZ1UwNlFXNUx5ZG9wTWg5UlEzUU1xNUovWGpwZm8zZ0ZEZDlZS1ZzUG4yQ1JyMUlOR0RadmMyU0Jva3B3bUx3bXI4alM1QXpaZDdFa1F3RmJYenQrdFpuZ0pjVnlQRmF2NlJQcTFmTDNTTEY4ZVZBOUtqME9lSm9FMU8ySjRNVjF3T0hTM1Ard0ZYQkVyMGx0NE4waU1GRUxYcXo5SEpPeUZ0YmVGU2l2QzBkM2lGajRjTGFjckV0a1pDSjdJbDZrcENjcUF5U2RSTmgwc1JZODFROURUbkl6UUhYV3Y5V0xyaWcybXZKZVVFRU5YU3Y5TVpIOEJ5S0kxalMxSWxCMHhoZnl4cDFLaElNMkZhalBoZ2w5YVlkWHJrRndsNFMwNkRTam96THVOK29aVFFiUVhucnBOSHloTHh3YnFuMElpaU53aE82Z3FjalRZNjBVbFNQd0FRQlJubmtsU1ZwK2JSMEVsM2t4cDI0c2Z0TTFPbGwxTzF4WGt1NnRIeWgxYWhuRDZSYWRxT1VCU1ZOZlY4c043ZUpGWWRGNEVVTlROS21qeWxmRldLakRoUWU5N3NsbnpxT1NnOFhLeVc4OGtoYldYcnNESzI4NjNnd0ZEOTJFbm4vT0V5d1JDZURFcCtwN0VDTU9MMGVLYS9BcnF1eS9kb1h3TVJkQWoxSkhleGdjRjNqcHJlbzgwVVVMUkllOHdOK0kxUzBEdW9JZTVBcDhoaWtwT09EZUtMMXR5UzMwTWFEeVNOeDhUd1RNVzl6ZkIzY3RyUWh0STdGTVdkQVFxMHlGRU1VZkMzQ0VnMjdSdmVhbmFGTmRESUl2ODVRcjh5d2ROcjdVVVkvdzROMEtnM0JIWE9HOUpvTkMwM0syeGNHQ0VRNHZUNWcxQUUyaVVsTWllbEN0RTFWQkZ2Q2tiMDduR3J1V281cjhFVytuQU93d0hKSHJBUk1SM1RCeGd1d0I1dUNBWXNWd2VMdDNDOGx5UWh6d2NJV0Y3TFM4Rk15ZFExenVSSXZ0SndIeTRaeWFsT2Z1MUd6WUF6WkE2NS9DTFNGNFF2Q2hqeHZKWEhMcHJsOTBXQ0QxQjNiYXJrbk55WEFpTU1RcW5JTFpQTjdDNS9XM1JPQkVkSTRVa2JGZXN5RGhlYjJ3ajVTbnRGTWhnazBWc1RZVGZab3hIUURZbUdIaEY5cG5wamNlbWgxcnB4blBVSSs4dHpiRmt5N2hTWmR0UmhycUFMaEtTbXluSHVLd0E2NmpCRkd5RmJoSzFDUWF4eWFGa0VSTkRGdlhtUllwcXZxN01FeFhtRGdlUytHOGpvRVF0S0ZrajBvRHBmcFBaTUFodjBjQ2xWUGxVQzlDZ3JseWc0NFZMVmQ3UjVnVnN4VzFWa0wwajA5QVViZUVqOU1UbXY2b1V2b3FyTWlqdTFGY3A5b21jeWJHbVVkVlZmT0dEYjdlcXJSeEVnWXRaTHI2UHhnWGFjZkpUQ3pIV1Z0Vm0zWXNBYldLa0RTemQ0S2lnUEpCYm11cklaL0ljaTg1TjRSK1dNVG9WdmkycUJVbHArZW1KenJWRmdsN01xaEE1elVqeVJnRk9udllJamw0eEExYnN6dGJ0cnhybU11bkNkOXErUUhJREtJRmZoSTNMV285RUNYd0prQTVUQ0REeWltUHlCK05SaXZVK1NwOEZuNmdFU2xWMEVlWEozdG5uTDYvWmJxYjNFUS9SWk9NTFU5TVNFdWsrYk9KcW9meVl0MTVRMEU0ajdjRnFRbE51SXZOUjRNaWFDOEJuTDBwazZoV05oL0NYRXNFUG1PK3N2RjhWaHprYU0wTnB5eVZmVy8vSVNJR2dNS2VNQXpSV05Nd0V1aEVKNWsrMVdFSXR1QVRpaDhvUWllZzlIZjdnYjVVRFJCNm1lcWtQQmp6SmhXdWdsZHU2bmIyYlRyRVVqS1lZa0hkdVh5SVZ6ZWxkTkNzN2RBeUVZMEtDYWNCd0FlZHcyZzFDTHo5VUlxTlo4SnZMS051aGl2aGpIbFFhTTZMYTNCanAxKzBscHJYSlFDalZEbk1UQkhTZDhSTnJvTFczejdYK3laeVlRTlNKMlpEc1Fhck1HTGZ6S0l6b3hGaDBTWE82NDIzMFdtN2x1d21QOGZvdGN3VTlLOFNtMUM0RXA4ZmVDT1hmREtid2RadkRzTEgwL042WFVFMDFuaUxZWXFuMmUwaFJNSmRyNlliQ3JqTjdxZTRUWHlCdU1zZWJGSjZUaW43SkY2cE5jMTFuYWp6QkdZY05QYSt4NjRXRlV2Slc2UkpDZzdyeFZUNFR5L2tKZzlYK216R1Q2YTJjSlIzR1M2UEJ5SmpSbWNVOGJnZ3hZMUoyUjZKMkJ5WThhUFNCeVJ2ZEo2cGYvc1FaUEVwaGFZVkhDVnZ6QTJxYWhnbnI4MDh3b0c1Mjg3dVF2SUZmMDN2UmpleUdSVGxacTdEMEJDaUE3QzR1UmxpaFlaMnJJcjE2RG9HNUFTczZyYUs0bmgzL1VXUFNFVmNibVkvcUN2Z090NU9QTkJqa2x0U0laUEFoS0I4TXlTb1ZKbVpab05pNlFoeHdlVmkxUWpNNkFDZ29XUTMrN3p5cUdFRG1UL1krREorOHNaYlRENDU1NytYNHhybjR4WVlPaUpjZmJwTUFFQ3IrSVVRY0daQjF3M1M5TkRRSjF1QlFtTzR1RW5iTFJBQ1hmYVJrR1pRZ1F0YU5BQXBtNnFDTGhnV3NxYWdqWm1la3FUbzNuR0tobUkrbVFqV0JQd2JDSVFabkt5S1RDSWUwdFEzbFNXTUc5a3k5Z2x1S3R3bzNWeWZxUkpXdHNXWFdXU09xSW1INnVsamxpV3R6aWJSZmlBdnByU1Z1dUJIZWdMYnZEalZ2Yi85MWVpTk80WFp1c29VZGRsbWFmNlVaMCs2TlVSWHhYTWNzWjVOcnVJUkVUNGlPWndpM24vcko4azRaQ1NsbHhabXdUdlh3NGZ5RHU4MW9uT1M1WjFxbWlPUGcrK1FWOEdYL2Y3Wlo3L2VlMFhWcDFYYUd1d3ZldGFLV292OWhuNzljWnNZbVpsUFJ5a3hYSTVpNklzNksydE9rNDFmYUFjRlpISnJwVDNpZkxhQStGUzVEYUVRQ2hOSGVYeUM0enQrQTIzSEsxTkhkS2tLNVoxdkI0aVNZQXlOaWRHdVdtS0g3RlVKZitIWFBTNlFPVmhHcmZzOHdRQms3VG1vSnNUZDRpbU0vMkF1aUVxcmJ4d0U2SjFTYmJsRFNiZEEvVHdOQmJPR0ZFcElBWUVNL09RN2J6TjhiUExTTE5Mc0NLck0zMW1MWGdoZEtHVmdDdUg2cTBWYUJOU1ViUU5RdDN4SUp0d01ZKzFPMDZpb1V0QkNNWmxWbEJCbVN5TmloR2h6c0JBdFoxVjZXa09xM2VEMWxvVmc4VFJJMm94L2s5dWtYcElZMnQzMWJ5d1RtRVJlU05FTW41OUJ6bTVXdHBqUmJFdlpncVcwQTltMXo5Z0xaUGlpenBWUUNRWWR1d1hVclE0NzJkRTY2OUpsbnBsSmFwVFJwRzhabnp5VGhIRmNPd0Q4aFhGK3p2dUlTV3ViT2lwYllkTmJIdURleHFNdmxvSWZvaEUxWTBOdlM0NVRZN3k2Z1NOY3hXVE5MYU1FeTQ5aHF6MkNYejlUUkJYeVRMMVVtVlF6dE9pc05Xa1BaSUJjb1NXVnYveTBXMHRUM0RvTldSYmk2SXpBRWFpY3hyZmFVcTdtdDFjeWIzQjZHSlJhWWcyQlpjTWc4bE1qQ1FTbXJPT01VbnJ0YlpSUVpXRStYTWd4ZFFnbTFDTVJOeTE2OERZdUJxeFNjWEljQkdWb0tURitqTGhIRlNyUnBnRXFjNG9VNEFLdWJ2UGhTeUZsS3FKQ3Q2clRFalNvazNsQldndTNhQmZGbU44aGprS0dvaFlpZndZOHdLK09JMURQbVFxdVYxVllmcHF2VXBxZHIxS0Z3ZVB0VmZYZVgrTitjdDhJZGh0NU5YUHNLbzJzQ0syNzZabWZ5cTZBQ2tzY0FxeGZEaUNnQURCcWc0M085dTE4Q0tmSkdlMXhLdFpiTWR2VERzNEhETjY2ayttMjR6RU12cktjUzBYMWNsb2lUYWhCSkhTNUJYR1BBRkNCUE9EeGJwMjBOVlY1TlRQdVl2T3kzYjFteW1RWlRkUDZDSUlUY0lLNkwvR2xza0dpdlJLVVlOQ3NvS0NwS2hDcWVjbjgwc0NobDR1TGFteHFhcklRZmNKQkVGUXJJS1BDSXNsWmZqbFlwZDJwMUtpdXZJNGovbmo1ZmhHVFdOS0szZFp3MFdiS21aM3dFUDUzZjF3QVZXWjZaak8wUWIvblp5TitTVkFBS05ZQmw4QU82NTJoVk4yTkptK04vRmNmazlXSGliTVhkYmVEdzFkZE9XUWtvS0RRenlmNW5razhOZE9QNmZmbkdTbWtEUCtEYzdnUWRzdnpCMUFOUkdqdTYzQU1EV010NGU2MDJnL1JNd2E1bVFQVXZydXA1ejJiampOU0NBY084RWRKWTRaR2MxazJRWFpyVjNFb2ptczhjTUJIS0MwaFdnYTFWOTVBU1czd3dHL0xoT0hPL1RhcjlFclVyeUFwdk1OeWNnZVU0K2RvUkdMU3FPUVRqeHk0T0Q0SFR5Ky84QTlJU0U3WXJyc3pBZVN2eWlTTkQzL1ZwU2VrVDBGMjJJQzcwOFlPQUdTbG0xOFN1TDVYM0hVYlBjUXp5djgyNjBMczNPMk1ybWxFRXVXSjZZcmtuZFZKV1UrSlhzZitxaFZJTms0UUxHVjhKaXlTUUNsNWVwZm1CTnRuckNIMHNndjU4OCtMd3U3QU5nSVdRaXdaM1BsSkNWS3ZmOGYwWVphTVlWMXFpRXQ5aWNEcjJ1enlrQ2hYN0g2UFZRZm11bXpWbm5BNFFQbUI2eE1hM0VtSjIvSDZSZFVaRnR2cTE1SU45MUFST1pEdUFXRlRTTE1iZzR1MFpNQ24vM2hiSEpqRTNUejhqNlRtL3lJdzUrK0U2V0Fuc2lSM1MySFF6YmVWbVk0NlE5SjJoTSsrRFlCVmZPd2pndldhNHA3WXlRa3lUM3dJTHhkSVVxL0Y0WmFtR2lzRkZaRHFwa2l1a0NTTHFSSmRrVkFJblo2ZXpRUko3UWRXU0U5SFRjZ1FvOUU2YjFFYVMyYjFKeFBXVTZ0TTBjT1MyT1k5Qnd0UXZzZHlCQWgrdnJDdUt3R0VZbktWYXZHYklDRGk4ajRjNjhNdzByd2x1eVBqdUM2VXF6UVRlSm5peDhDSklZOE5rd09LajFYZDY0R0d6c253MHRxSmVvbVZ5MmVDbk9WYlllTk02dERZeEduaXBiWTAvNGcvUmRBY2QrR1JReFlFalIwSm0vVTRobGVXZ2FGRUZVY3JPWERZajZLMkptMEN0MG8wbys2RkpERHgxUklUeXZ5UUJrTUhyOWxnSzlNY3pFRzlLNXZMRHM5TzRGbnlnVGVINWtBbWVYeHNjVU13NWoyMFh0QlBGSVpVVzA0R1k0YzBPSEREb3h2dzhUazJpUk5seDMzSW90SEVMTDRFeVFuNnpzMzh2WVVRU1kxT2RhUytZQzZkTGZFU1pOL20wenhuQXhIdWtwVlhRbnVRSFdvdHoxWjM2ek52SzI0MVR1ZFRPUE5zMUdpUnc0RE9rTUZGdHhrSGxWT3BURHUwZHF3MFY2RkM1Z3pvOHZGYXFOVUNaVmlHOWlsNHREY3BYVytGdXNaU3g4a09lRFFQRk5Nc3RjY1Ztc1V5WXhpUzVJdGtEcE8wWllscW94OGZ1S0I1emMwN3dWYUhCa1FiNjBNWE5kMHhkUjc5cHBDRUp6UWlWNVJTOFQwZGJuOFkwaVdSN0p0dUVLMCtRZVkzSnFXU1U1amZtUWVtR3hsZ0luZUMrRm1SMlZUWDdMMVRQT3VGSEx6RjBNZUw4SW85VjFOUWhDYWNlYVhYZXFVMHRQT3VhWXFjUHFqSDJ2KzZKeXV5cHpTVHJjcVlCUmtSMmxvdVordVltWHM0UmU1QW9tMzhOZjg4R2J1bmEvSFJENU5XeW9KeTNrZmxlWERKRm1IMVhoTGNUQVpuREtFZmo3dENOWEdjUmt6azVIVVk3WGc5UHBkb3pZVFNRNFFwaFRPVWx5ZjY3MG1BYmFPRGVJT0JuZFh1MU9NdjNMdXVUYVF2UXpkV0hvNVR5WkZ2YmUzaW1aazZoY0ZMRFoySzdXUUdXbk5kVEMwYlVJU1hHdGtSeU9GdFhQbFVZSmw1T0Q5UExyV2hjTm1QR3EraFRFaU8rdmpzd2RtZm9rdjRobDNIWngwN0dvekNVeEJjazBCa1pRSWNCelBSV3lZRWJ5S0lRTjZHRzNaVVIydkxMZjlOeG1YN0lCUjZUNEp3WWxZRjNSYW4vY2d0eFRhNG5qbzlHanU2RTBrMkJyZHk3cnoyWi8vRHREMk9kWFZLcjAyMmJqTjVFV25ubElQcTdSS3Z5SjdUMEZpZ0VIdTA2Z2xiNUEwaFlvdUo3Y1RtNkE1MjZZV0tpbnM0NEVKOHdxRlQva0t1Q250SzNMMTlHSFdEQ25ZdDdBSkJPTmlPb2VpSnpEdHl0aG5kUUV6Ui9ObDI1Qm11S3JWMGFVNlhoSDRRVEN5UkU4U3F1RUhWQXdvVmZGUTJJMXlwREJsb0lKR1BOb3AvWmNGTFlNT3ZmTlJacHJBeFhjaTVpalAyMTNhZWlvemhEYk5tZXZHeWFNVVpRWFptR09xbUJWeGQyQ1JpQTF1WmpjQ1NIU21YOU1pUHpzZGlRUjlTL0pydVFuOWxZY3BySjlIVlpQdGZlUmJDTk9aUzgyTUhmQ3lTM3Mrc2I3d045SCt0cTd6UlRvM3hqeFdEMmVIZGpPNzVZd2pPbzkxQWNwRXEvcmV6M1dtbml4M3pqeXBsNnlNN1hKV09lY01EaUxLbk5ReVJTek1SM0JWdkpVaXFmVTZXampDZWJDem9FWjhDS3RBZ1ZLd0p4REZUeEhIVzNsUHBzV1crNjcrZjZ1Vi9ZQ1E3cFgrblkvWlJUUUhzZ0JnSFdzZEd2bDIvYTBHYXJmSUNzTHp0RXlrQlk5bVlxR3psOEdxdzRmQnF2NGN4MXJOUHV2bCtSOTcrOGJuV0MrZmRPRDVFT2ZoWkVsZEE4ekNlamowWXEvaHhmcXBrc1UvbHN5eDd5WGVZcTVqYkNYUno4c3hkZ3ZQQmpOVi9PVHRoU3N2N3dRTkdIMVBaOWNpazlKSDJlSlJ6YUd2ZTc0YW5RUGp5eEw1TWZ3Ump5aEV4ckxJODZHL1RVNnhmbzkrUVNxUHhnOGlwVFVWcXBHWmx0TXZ5elQvWFZwdUFYN1NUQmJ0MmZ4Ry9JcnVVSTRLNHlsWnZuMzV1UUZkU2hvbnVjZUg2Z0dtNGdZeDVucVd1LzlDT1RqOWpUbkwwK0JFekw4aHllWVZKSmtQUUlTK0N1bzBYUmF5U25GMjd5cGx2Y0ErbDhuMHVhMlorZnVtcGdwMm9URzNDMGRXU3pSUEpudFhRRFdkM2JYcWc3Z2szT3NZMXdWMDdSNWdlZmQvNTVZYVFIL1g3YmduTHNvMzBzd0J5SjVLU2FnZDNCb2FHZ3ZwOHpRbnB0RkxYYWlhdzRMMGhjNzcrUGF5ZUkxRW9oVGdwa3JOOEJDaGxzdzZmQnZyN3JiZUsreXFraVYyWnkvM2J0dnhlcjMzalRQYjN6VzI2SG5uSGMveDZzdGt4L0F6Mko1OU9ibWUzWm5NR0UzV0xuTXA5MmJSOWtjYklwRUdjZENrLzI0VTBlRzlmN3NYTmc4ZmlsTDdzU0c3M2xFK0l5TVMvVU1Uckt6dExZb3I2Ynp3SUdKc09KMGNHMGtNNGtWMmt6QVNRaFFnQVFvNVRiTUNIa0FwZWRXWEdPejZVZGUvN3Z0eFB0Zk5OTDVjZklxV1c0MkxnUmEyLzFwUzltU3k5NVlaSHBaNURDZlJZbjlETlNUdTNOeVE0RVVOcHBVbWpyb1hwZXhrcDQ1cVN0V0R2MGJ0QUo4R0M2aWl5Q2hlbnhzTGtYWTEzdk8rZjFIK2JBUXhNakppTHZ4QVZwNStpMzVXS28vR0NRb1BUL2NscHRNUmIyWGFmQ1BOUElDOFdSa1g2dXZWT0hkcitwWkp5RGNYcTIvYzZBeHhPajl4QW5hSm9hUm1aNmNVR3UwUGNLV1RNbE8zdXBYMFU5L1dyNVNqQzlZTEo3N1JlcHJEcnRVL1E2eVdSVldQZVd1TnJPVzU0NTdDeXJKblRuNTFCMjd0VWRZNHpubWc2Y1ZPcVpYMy9LbE9IemlJMzl5YVhmUU85WmYzYXJYV0VKV3RzaUZEWFYvOWlOaFU5TklqRHAzMGtBa2Y5WmJuNWVBSnBFYkNOcWR3ZzAwUWlJMlFWanE1cjJiTFpnUEVPQmkyQTIyd2RXWEh1bG5wdE5FRDJJTVpzRUZCNzZkbFgyUndFYUcxbXF3MkJGU3d2ZUhudjA2RjM3dXc1TEowUzBlOE9wWExPSDgrWDNOWmd6LzNIQVJyS3FWbjVmQzR0Y0ZseTd0SHVtdGFseXh5cmswRFhPZlFvUC9HM0NldGFlZm5jK1hLLzVMdk5yOHJueis3bVNNSVlUZUtHZ291UnNUNU45MWdlYy9TcjJPcWRyMU1xcGh3TW03VTJaejNBMWFDeXZURmpnYnVRY0pDQUZnSFBSMm9YMjlRRGs0d00zSnZsMUpzTDFqVE9RZ2dJV09hcjl4U3pSRXF6YVNRVFQzTS9TaXhIdmlvalU1TDdCbm1aZlVPSkFlS3hyak1uZ1pubmZvdjA0Wi9BRUE0Vm9PNzQ1RjlZKzNTb3NRZnBFcFZGUXYzb3BTb0RnSThQcHd6Zk1aMVVIN2xsZHI3am0rSjR2LzR6ZHNUOHJqMGR3VThuVXdnYlJFSy8zeFBnaUY2cjZhZERVakVwSDVWZWYxTGFObjVJMlArWElMTjRTZjlQT0x4RDFWWEVBb3NxQWgxQ1pzbTdmVE1rQVMyNkV1MDYyWEFPTitHcEtRYUw3dHNnWFRFNWp5Vk5rTUljQWdnVGh1WjQ3TGdka2NuQjZmclA1bk95S0pDelVwWWJaMDhVMU9TWVFlaG1SY1F5Wm14U2NXajc1SlBKNHh0ckhjRS82QTRYZk12akcyeTRRWjZlMUNDMmh5eVNtN2xEZTdDa3dsS2YyMzBLVlNNaS9oMkN1cXBwNU5Ea2ZRNEFpUXpWQnJHT2pxVHpYT2wyTk1CaGcwYml1SE9TTE1jcVkzOWtuU0lTV05FaVBxeEhLZG5lQ24rSkFPdEN5L2UvL09oSStQd2NTbitRTS9lMytucTd0eXM5QjEzNC9kdnY5a3V6by9nUk1xSjhtYWZnNzlKOFZMWVRrdlZMaWM2NmczVFpjcERSSlA1aHVTQkU2YXZUeHVVcTdTWmpIcDBXZHd2RVE3SGZOUTlMek8zZnZydGFpWDRuMm83TWlFY29remQrYlA0d0pHcndyaHhvMndMbzd4a2hrcVVHdzFSYmxxTjM3STl2cXlXMG5tT1lualFtMDNEOEQrNVNvMGhYTy9qZGxIYU1oT0c1UmJqVmowdUdUeUVDNko2SlZqNkZacEc5QW5qY1dQckpPZVk5WmxMOWN0dWJwRlJQZlNoa0FFYjZreVVZNVpBYW5RaEtuTklVWDdOSEJuSmFhRzAyNUp1Ympjaksrb01WTmd3bng1Znd5TVJsSGlJV3l1ak9nemJnNHNwZm1rcmhEM1F5L0ExMnVQbndqWnpIMk1VMEMzYXdEc0lvbk1DNk1Nem5BMCtxM21oYVMyL1laUmZkYVgydnZQYjRLTC9sTzA3RS9LNFhINDNYTVpESWYyeFYrVnI4dXQzZ1o4bmRtZWw3N2dYZjhCS0Exd0RYblZHY2xhTTdwaHhDWmQ0YitqdmJ1TmpxSTFMTjBvSm52YzNST2hkYUdQKy9TT2pId1ZEeFM4SUdWN3AzMFdZSTBSaFRCTXVJeTZzWWdNdkF5Z0R4d1owcENyYmdoSlN6Mkx6VVNBWjlpSUN5K0ZCUjU3S20yNWJURDVheGt2eDg0ODJ6Yll2UFlocFVwL3crUkgzaTZJQnpTUW4rdUxUd1l6cFo5TUdpU0c1TWp4VlBPWEJkSG5EUUUwNVlZSWFUeUkrbnZUNHBTU2oxS0pVZHFQRUMzSG41T2xqZm82eDJBeFV3aXhLVEVTSVJ4RmlWQm84RnVtWElZWDNTdEVEdTdqVFJ0TzgvbDFvZUpIMDZINmpIYWcwaEVDQ2lqVkY1V1pqNDEzVGtVbEhhRWZNUytYNXR5WCttcjd1d0FOU0oydGN4SE9ydmVPZVAyQjk0aHJwdXRGMTBxNXJxSE0vK1M0YlNZM211M1Q3anUwM0dzTmt1TVN4dUs5enF0RngyQlJQU1p5dXRlcDJ2SFZEYXZvNHBtUmdLVkJiWTgzMFRTRUhHdWY3NXVOb0FUNHBOaXh0VGNEQWtvT0kyaGlYb2dxTHRDaTUzUnJJQjM3N0hvaGhMa2xWcUp5RnhDaDZNWXhmS0FZbVlZQmhCOWZPR1Yzd0IvaXlKSXgra2RnK2hsR1NITFhnbktXNmRrTjI4REdtNm1LM0cvY3ZBVHl6TnlLZDgyVHh3Y2ZxY05XVUp1bXg1eGYxdk9PdVJOQ0FXQVFjM3IvcTQvSHdmLzVmRnlTL0J3YUZFUDd4K20xcG9KZGdqMCtOY3lWUHV5d2VyZWs1ZTdqWDJtRFI4dXFSN2hUK2poMkZyOEpITXRJc3Z5RXdUMkk0SmFCTWtFOG16K3JtbW04S0ZPZlJvRCttSDFzN0k0anRGS2NKZXU0SXpvQ2FOekNma2g5OHRhWGZOMjI1RWVPdjQ1UnMzQ0JJaW82N0RsdFp5Vkg3SlNmSWkrbWhBVWN5dkk1L0dGd3l0UGZnQjIvS2R1aHJ6TTdNTDVIYVFVam1hbUpFWm15U2F2Umo4czM0ZU90N01EK1dtNWlWQUdLRDhCbGNxL05yU0NuVXpTTmJ2MUUvcG5xRVRXdE9Vc1FOL0JSN0lLRUkzdXdXdG41YU5GUWc2UnNPUlRCRHljMndwWitWc2hGcG9yeVlIcnhNdXoyTy9sSTRraEEvWTF6NnAybXBhR1kwd2REM2R2WmdUTUt3UmZaajI4a0RSKzJZZGZqajlmb2ZtdlpzZjlmVW9uL2NHb243THlONTRLNkRncHpvUzVBWmNjNXY0QVRJa253alJqS3k4OHh5enh1eENPa1N2SjBBZFE0YmpJbVZXRGVBWXB6QU91SW15L1lmVnNrVzRrS3FLY09jYnNXNk1tUG9ObGg0dUNJcG5TUzFiWDhYR0dWRHZpMnppelBodm00cHRZQlhqbTZ4SkpzRldDeEp3My9LRDNldWpnVHhZV1c1Mm5pVW5GR1hGMnBqWWlKT2V6VERnSTVlL3FJNmVQQ0xhdVF5dzJyMldSM1A1ZGpyVjQ3SDZ2bGhnQ2N6UXg5MmwxVFhkWlVFUHh3YURucllWVkpiMDFNUytwQXkvc2VDS1pMZ0gvYlBHSXovZUdVUU0vRGx3S2JmTlYzbmFJQ2hVeFhSNE1KMU80dElPaTdBbjQ2emlMeHFCMTZxRHZwcGtQWmZ4OWxIMmo2b0VZdDR2a0pFZGZUeW9EcUtVdXkwMVVFWHFrL1ZmOXlHUlROUjNuZ0dpaXExMDlZRW5hdXFEcjVRVVkzbEkvQTdjMSt1dEhmYjFOT0RDRVJhVUdPenpTK3R4UzkzdnY4Q1gzV2FweUR3SGxURTZYYm9uZmF5dndnVGZLYzZjZ0xGOUVwWStCWFRLQmY2VEZrRmV6L2ZDZE5DREt6QXhEaHlEMkE5YlhqNEpGOTFyRytxbVVkNEhxcllzeEhGTlR0dmtUdmdySFNMY1hiem5KaUZsUW5QdE50QzhXK0lEdjVjSWowcVZzelFJd25WN1JFV2Q5N2VnLzdVa1BGMG1tblFjV3dsdFptM1AzUmUvU3Nta3hBU21oNUVLMGJQRjAvd1hveHJ5N3hqTUZGdGhEYVN5SVdnMmFIbHZwZ29Scy9UaXRPQ3drSXlDUmoxcjZmM2gwWTNyNlIySEdNYVRNOHlIWWR1dnlxZUtEeEU1N0RZckhrNk9iQWZIeVVRTVFFa3Zxb3RRcWd2UEYxcFo0bi9QY2pCajB2YzRCeVJpeXJ4YkpBOFlwNDdXTWQzZHZlY25OWDVhUFkvWlNsbVJrZGxsZWZJamEyVXUzM0xXdUJ2bWs1SkxkNmw1SFlURzRZV3hlK1pFVGhydzNsaUxCSEhjWFhUTS9iaFEyRmRUaHdaemE4cmR5Witqd2pEY2RoUzltdGtQVjdTOVVDakJTNWYwdnozWjludXZGMkNVR2xZK2tSMEtBVGlyNzVlL0pLZzlzcjRMc1ljSjRvekJpbnlXcitqaFNQQ0I3cUNUc1lNbEdHMjduOXY2QzFsdnJiZ2FNQ0xMZFBKbGlldWJzcTJkRjBvbE9qYytPajRQOWdPemFod2daS0Y3OHZQQ3VuS1piS0ZSVmJjRC9pSFJVWW5XUTB0dE9XMjFaYi9mNnVzaUZhUUtzYVJZTWRKcHRaKzhySVl0b3VtZFpnOEhGakRQQnhrUDBuVk9rNWVGTU1tYVJVT2t5WnhGdzZCUkJsS2VWcFdGamlPSjJJNytvWkd3aEk1dDM1cmRQKzF3cWgwaFR4ZHJYNVl0Snp0VkJIaG9QSTlETEZvaXBDNmgrUG84NG95WDdCNWhlUlk1cW1DOThBRWJnQXJGT3kzVnZ2ZEF2SEVTd3dtWEVCYnVkOEVoY3p3bUZTZlNFMTFlcER0WCtCREt2ei9Xem9mTDVCOGlUSTlKdFFIZlFTV1p6QU1TT3NEanVVQ09Rb1I4VlMwejVKRFhrQkVwVm9Lc0djMk1Jd2Y2TzN6ejhibis1R29Ic3lzaVJNaEh5WThHYXJKNjZtcGV0aWs2SGxITHJmYllYTWh0c2dqSUZWZ2VSckwzTkFLdjhXd0ZHQk9RNWl0KzI1aUNqMkwwbTFqTEdaUHpFQlBrOEg5aGgwQldlNUNBTERPNW53WWNCdTRsWlVIZi9BNTdzSER2cVYzRmxETDR2TWM2TktxRFphNXMydHJKL2EwTDdqR3FKU2M2OVZnajN1RGF5RGxvaXh3ZkRXdUs5ZlRXa1hucVEyenpUZklwWHlWcUh1RDBpcVU5b2tjMTNRRHVIWGNxSGFoYzZxekxzM3J6UU8yc1Y3UnpZcU1wNDB6M0JxNnFybWtPWGQzYnBXZW5TZnkrL0RDb0xtamwwWlhuVkhFOCtiTW1ueFRMTHlSUVk2dkdNZ3RtRHlldmlGUWJUUlgvaFY0QzZiLzdzUkpyWEhlT0R0ck1EdGpHeEZLODh3cVZWUzFCM2luUVBtRnJ2eUkyK2I4RGNsK0IvRUFrZlhGdmRQOFlSeTdkSFAwcVQvUkRtT2NGMlJta25aN3NicWxmOUN3c0llWEZPbGVyNWZoa3VYYWx4SVZaMlErcEdyN2JxMnlicGV4SkdBcWN4ZVJDdGF0cDhtNjFyc0VCRUh6ZW5NR1BQaTU5QXZnZnRZcnpnUitvdmxWOHdxOHo5WmJzbUVLUW9DZ0cxeFA2NVBYR2RKeW5wSFBqWlNBemszRWZ4aWNPQitqem1tM290bWEzNm15WmJKeUE5Z3lURXZzVnZYOEJZRlRLRlQ2QmZCdndRRWpwMzZ1NlY4L2RhbnArMnBwVTBTVmRRVE1jTEhVd1RlenRXdFBjK2Z1V1hOZ1dpRmVpaXo1cUh0MWl2OTM2QUp1ZHMrMktiQ2hVcTdiZ3c4WEtvUGtiZXJxM0NLMGRSVlFkZEJUV1gvVEYzQ3ppeGJQMTVZZHY0NUx4aGRjU1BpdXJ1WXJoQUM4Rk8rMDE1RjMzTVpWOWkzUDZlMnBKblVURnV4VzAyWk9GdlFVRXFmL2FiUmpORkVlODArb0NlMi9TVWpnYmZ3NlkzMHpDdCt1Rmc2M2h1NE12aHljM1FHN2JUazNlbmwwcDF1U2xVN240eituUXAvL0FnMVlYZzBUTmtpUDJUeW1VdFZsY0UzR1dxMlQzVnh0a2pvNzYxOUtYaVl0SE9vL2gxdHdZajNwNnZKZG5zMWd0NW1keDFkYjVUa3Q0aFhMZ2JRRnNpUjhIR2UwYnkxRGc5L1lJemlmcXV2aFFqcEJ4THI3NU1XUnZKN1NjOUZhTklPVUV4QXR3eTNkS0JocjRnN1pVaERSeG9NZy95My9Mc2l3V3lTOVYvb0Vudzl0ZjFQVE1XamhMZWpLY2gvWi8zblVzTHZleEVaYmc5ZVVhdkJTdE9UbWRBdmpRbHFOTFBNK3pKMXNiUGN4NERzSkJDdlo0VTMzRG0rd2lOejVXYkhubk5CazE3dXRJb2ZGUjZST0dEZnFyYnZBd2tkVVFlSFdvMCtVVHFYY25wVm5HLzJUNWhxK3hYVnZjaEZoZDJaV2g2OVlmbGlVZXdVNno3Q1dHN2xhN2Y5dG84Q1BiMWZ2bmw1akZ0b1dXNzhaazFIb1UycFRRM3AybEdPT0xVMWVtQ2trdHFXRmh4bjc1UDJCclpUbk1nZDdvck5GZmZURW9ZcXRxZnNqY2UvUDI4R1AydDVhakRiMVRtLzMyUDE3MXFhb3NaZnQxWHI3SzBOdlZZMHR4Uzk4aExjVGNXUlhKZloxZ0NvYTQ1YUhlelV6UzFob0IvS0E3Yk80QlJ2eWJlbGF6dkNtdkUxZGVFM3VtczN6Vjc2dllTZ3BiLzluQ1dweXdtUUNOU2s1K0prTDg1UGFNcC9NenM3R3VzYTZjcDcvZS9HQ01NalVUNGQ3N1hid3IrZ0Y1M0M5cnE0amYxVzlxa3JRQnNrUkNmZlNINlFucUJFdkVvRjV6cWtyczdPTkM3bkFZRHB3eUg2Qk1JZGJnTWZ3dTdxK2FOYlhoR3ZZM240TnZucFRuZ3YvaUc0T3Q0Q2IzYUNYWEZnZ2FiV3NnYlZxSzM0Vlc0VHhqK2ljNk03d2o3UXFScWdwamZpczQ0aTIyT2llQW9rL1NDRlY1ZW94R3NQb0pjNGs2dzVmRmtncXhaLzBFV0pOMzFYZVIwUkFXWjV0ZEJTSkE2ajhkMCtjdzhRekwrTkduVWdQdW5qc3Y5NlFTblFIQVU0K3N2d05mNjRsK1c4NnpsQXIzWDhncVQ3L21kOEp0cGQxZ3IrWjhPSERnUEdEcUUxTDRaTlRMWnBnbUx6NXJ3UW8yeG5aRU9CbTBhSjZ1Ry80TmE5UGoxdUxTeEVHVm9KNWErT1RCOUVFVU9IWVdrbjVrOG5lUDBBMWZkMU5PVWR4S2JqWEF0ZEZkSVBtZXNoUXVlUVVwRnJXdlptYnh0dHNKZkphL24yWERYclJ6OEs2Zjl1VjN6TzIzWk9XNXh0cExnREllR1ZxS0ZyQ256d2NqMXVjSGNhamJoTXpzSDltbTQwMzdoWHoyOG50b1Y2KzNieFdjUkhTTE14MDdXcDhJeVNYTGtRaXVOYlNLQTRuNlVWeGhVQ0VZRjNFUVFOVHcvUUhnYWRiU3orZUhNdjd5emxmMlY2OFpOdzJhV1BDV0FkM3dwYnBtbUlLQVlTUVA1ZG5MUm55Z3FaLzNMamVNUmViZ0t1VlRYRVoxaGJBYzJMcklFcDJXRVNqU3Mzb2JtZXJRa1FiTS9QeFV2eXIzWC9sUFAvYWVEKy85aTlrN0FxRWUvQ3c2TVNNLzRMTU9BbjJDUDdFK2ZwR2psMjE2TkJnVXJrYnkvanIrbUNRa3l2RnJRYWFYd3ZYb1QrNUlqZHRIN0ZqZEs3aU9uT1JXenZ4R2p2b1I2SllmSzh4UFkwZzJPajFSV1J2RHcvMXlITzk3SUkzdThlRkNUTjFBTERrUU4zR2QwTjdNZ1lWK2dTTnRwTDZyWmVtdjBXL3F3QmpMVW5wQjJwZXJoWjBjRXBzM3hna2xzTDkwc29hOVlmSGdtRWVMa3dWTnhnMUIxekdReVVWQ2tMaXQ0RUwvd0FBT0l0YitJd2JPUWtDZ3A0YlVsQ1haZDZMUjFjTWdiUUdsVzl3RTJ2QUxVQU5jbzhWUU5CTlcwMUpEYXkvU0tmbmhQblNkbG5BQW10QXJhQWkyQWFicVJwMDBkblZybHpFMWs0NG1nOGVBVWNhV0JZSzFpd25oVWFHSlBDUUJPNGdQV0QxMGY3amVEVVNBakV4Z1VCOGc2N1hQQStZWi85dGNuZzc5WjVIOTJGejliRkxVcXU5ODJMb2dmUDZzcGx2M3VkYWtsOHpjSWJhNVAwSGtzQVhIaWwzUkNYM0c2cGZxR2o5RTlGMkprLzNkMUtmN3RMK2tjOGJ2cXllcldtNGFsbDRwL29wSmdWcm1PbjFwM2RxZFdkQWNGcEVhSFQ4Z3RkdytYMTVvaDNBdWQ0cnZYUnMrMkhMTysyU096VnQ5YXVtdGI5VXJHS2xXSU5VejJmZTBvbzJabEFwaFUzVjdLT1BsdHp2cmVLK0ZKa0NWbkVjbGFvRHlHSVM5TU1FcXlDS2RPMVdsTHdnVWlzVGs2RmZ2Zm1tRGxmcDd2YUlpK2tlOVptRWc4OHJmcFV2cktlVlJQYlYwQkZVbDlmZW1XWjJIMTR5RUlnS1p5YVpNeEE5di9ISXgwWWFHVzNQY0RvcXhPSXU3ZWxtdzZuenJJT0pTRVBMV2pkdEZLdTZvaWpzdXNkMlpkcHQ2emFsZzB2bTdydE9SMGpyVUVmdXI2MTRuRStrK1dmUy9melA2TVZnNTdmM2E2dXZHT1V2bCtQOUFZSnU5RDlGTXkrekc4N2xjL1BHRTJ6SWZUbzZNREk2SWs3TWxlVzE0Mi9kMGo5MVgzR0JYVFcvajFtNWZVVXR2OTZaU3RyZFVuV2IxbDJJOTJJazFxTnBraGlhWjN3TWxzRExEQXRGVWpIUUFYWTBWU1JreS9LK2VvUXJJd1kwcVhNZTZyaFNtRGdrMTdBZ3RCcEIrR0NLc25KNmhsbU1Lc0xGTVpjaEtyTUdMOW1sUVhucXZxbXB0RjJLVXVuL1YxeGx5UnpPR1h4OVlKVmZNWnc3ZUdTaDBjbWd5SFNIa04rV2dqYWhvRWlPL2xMZU1YcW43aFlkSXBibGhVNW5lV0M1WW1LbnMzTDIvbXhqWDJDSWxNaFZ4ZWNyQmlJamg1ZTNka1ljUWlPZGx3cUxyNFZWMU1sL1lYeGRiR05GVUVCaUpKckFoQWVKZmRPWHBjNTZxSlQ3VUJVTVNnNlRUaFZYdWNVTjMrcHBHOFNUQ1JuK0JaeERLSzZMK0hZUzZvRW4yb1Y2ZmZ0TGZxMmM0L1piNmZaMmpudk5qVExyNGM1TkpvNDRGK2p1NjdwMkJrWktpZHlDK1BLY1haSDV3OHVML1JHTGFHZkVoMy93QnYrZEl1Vk85czEzby9tUlNTMU82cWxiWXdNVHYzTVhjT1pUZGVGNmRDNHAzaExJQndGL0tyVDl5dFhzMnhZYVdtWGVidGxyMldmVkJxMmFpR3VmTXB5MlU4UGtrZVAxLzR6aUtwSW8vVm1BYjZGdVVTOTQ3QjBka2MyZ3hzVXhlbU8zMzAvZGFsN2hsc3dCMm14N3NKUjlLQm9PbGM3M3pmdjh3WWdtOFFtQTM5T0dENVNtem5nbzViTi9FY2g5YW1IZk1sNks5bzMxUDFFK1NBWU5YZmd2Ni9nZnJMMEhvaisrbUk5bUhQMWo2dC9nVkUvVlY1TExtWWorbGtQMXdzZnRIZkVQVDFZTTFIV2tCL1RyTVl2dCtnWWtTY1grdDJ0MlBaSHVYZHhRMjdGKy9Hd1AyRVo5c2VTUk54K1YrRks1NkNXcWFJNFBHSkYxYUhYRHNySXd2elIvbEIyOVR3ZHNEMkN6cVhFaXRoNExyNSs2M1hxYld6YlhIdDRPaEMrR3B2emh5L2YxR1ErVmNnNVhtVVRwVXdOejErRHVqZGNyenpydENHZmhtNTdIK1YrTUtHaG81TEZET0lKem0rZTE3NXAvWFU5V3lxZFRab1FIclNiYzMxZ21vdjkzV2xjdGM5cVhhcnF2SFRscWFaQzJjVmdjMzVXbTJqTHhNY21KNS9MYVN4WXFrQ2lVOVpMeVRVOW1UMk5JcndQTjVhN1hnemRmalg4eHZHYXJWUFdQZUhLVkhYNTY2aGVWUlkwOHpDSW95b1NaVFRXRmVKYnBsMFArcjV5UmwwMnV2UElXTUZTUmd3SWl1VjRXTTRSVXVBZFkwZlhqL0lVRzBPdTZzZUVueFpxbkU3MHIralZkLzUzWTR5N1pmSWt3ZGVmbkFDUVBWVklJUTF5VWJ4ZTI5a1RFM3h2b0xSdkN5d0k2WTlqNzNFZnZGY0hoT3Bla29Pd0lwUTQyQVV2aUo0bFowZCtzVWhZUERWZGV1Z1lnVnM0ZVZqcW1RQlJGanlMNnc0Sit4MXZhVlo0V3h1aTNSUWhVSm5aSGRlU25PVm9zUmw5NHV0M09FdjhtQ1BaN0NQY25SQ2FlVSsrcjByd0NmT2tCZ1NIRTYreDhyMEFPQWFNQllOcnNtNkVlcVdheHZyN3FKUHpSNGNPZTdueG5wZnVnYzY3NUJUTnVBN0xFSzlmYklsVVl3QWlBREFYR1F5NEVYcEFNbDh0Y29sRVR4MzBhb0V3VW9xT0NLTTNXSlUydjhHaWlOZEdHV3VjMXp6c1MvRFhRUkxnM0FoZDRvY2lnUmE2anRmMldvMnFiZWJqWTY2L1Vlb2JLd0ZDSlBkY1YwM1ZSVk9qK01hQ2VEZlJEZlNBMUpMdW93MFhmWTRiN2VxWG5uY2NSWFZJV2k5U3VEbTNncmgzbExHeGJCanJubmNCUWhMYjRwcDJrdXdjclV1UW1VTnBiSWtJaUlkUVQxUGFvQ3NLQW1FSUhPR3FFVFBkMlRtamVJRGNWcnpDRnBxMkxsTFI2d3MzcGhncjFocDBMN1ZHZ25jVXhoTUZidXhqOFV0R0tyUXU4aVVVRlUxS2EvZGtqUVhjd0FKa1lEb1FmRk05WkFIS0FEd0I2ZXVubzJFbE42MDBBb0phTkJnRDRZdHNqMlVrcmtRdkJBWmllUXdRTG9JL1dRMVE3eVhmck5EbnNrSm9yaFZ1WlZkVXdHZm1JMk1BUEdJbng3RjNSVUJZVGVwY0lVSnd4TTRDMzZUOWliSGxacWZ1RSt6Y3VvNlJMZWlJYjVJNnpEb2pxZjd3bnJRbVhlSnBFYXlORU1hcHlJVk5hem5Ba2FhQkJiY01TREs1S3c5ZVh3ZFVjMFk1MDNSM1dGdVFkYTQ3MEtpRGVXMC9VODRCMmNRMVcxbG1JVDNSZEpUS3REVTdFV3BaN2tKU29IUFJoSjdtZElpeXhkYnJtYWNmYmhXd0FaZW1YQXdEeG1lb1dYOHZhVy9qcVdWN3BrTzNhMERpWHdObUZhOWY3V3ZPTHpUNHdmSjhBdmxxM2NtczJmWUhsNmpkd2hVQVRlcFN2NTdJOTFaeGRtd2FUVm1JbjE2VjVsWDZ4R0tCQnRHYWo0a2RJM0RKUDBPRkkwZ0VtK0NyZHpzK0g4ajhaa1UxclVBZ2NRd29pb2RjcUlYQ0QzMzZZNHJxL2dGa2ppU0VBakwwYTczMlVqckxzWkpxY3padHN1OTMyN2lraFFaQXhEcTN4KzJ6NERTQytZamhoMVNpU2craVJtc2V1MG9icnM4T0VNaG1Da2xkUEgvWEg4QmpEVEdZajZCejdXS004UVd1KzJUb29nenNYRW9jeHJkeHVqVkZJcmR2d3dsOUlrVDNpZlhMbW83ZjJmdlJvbXhHWUJ3K0FSUGpiaFpaRUlXcUcraU1jN0pqTUIwb3M0WHF2MTBPZ2VneFhhMjNFNGx4eGhjc1poSmM0OW5KT3p6UmtCT1ltK2pzYnRDM1AyZG1aemZPNGdkZkNNK2xEVTByNlpPNGdYVHpJRUxYVzFpUlRSQW1rTTBrWTRkSWFaRGlxcXV1OXpBR0NNT3dZNEVRSDlRY1ppcitYUlVFK2FpRTB5WnkyNURFdDJpRWFIY2xqc3JFSWhlM0pXYmhQYVlONmp0V3lldWFkUXlDTkl0V3JYOElGMlJGNlNpMUdRc25zMWhtOG9MUlZsWDkyM1prUmdvdWdMSnRZRk5VNUxBclBaOVBFZ3FjYTA0ZjlYZzljQk1ITWcyeFFJRU9ud0wyOGNzSk12eXFST29ibFZmSWltTGhJbnhFai9IVzJXa2xtUG53YUZIRDlzWG1uUTV6MHRGZWNibWNrbWlncXlKZkNJZGZHQ0ZncnA5SXRyeCtNbk5iMUlDN1EzUzJUQjdjWTJobmphQ2J1U1FxNXZ6OThoR1EzTXRxWUQ3VVRzUnZjaVJ1RUk2dTAzRjVjbmJHRnZqQXhlWFNjVndQT0FpSmcrQWxEY2N5cTBka3VRSlNFRVFXMnB4dGlVdmoyZ1k1cXg1VlFCc0hQeW9teGxrV2h3ckJWODdqQldxV0VENXgxUFFocmx4WlNVa25wRU5iYTE1Qm1oVmxQdE12QWtaRTRrcXdqVVVkSTZXL0kzUUNTamZBQ3FKN05qdzZiUk55dGJRUmpIRHVnbHJHeFVYZjV2VnpkVkY0SDNyK2F2N0UrN0k4R2czcHM4N3U3cXlyTHFyWlJCV253bEhRa3A4WnFsUytVenY0Nm9ubmVwYU02dFlkOUJ5YXdPYng4MWJEYk5WTHM5eWR5Yy84Ky9zcjRCRjVOaXZpY2djN0FlNldVbnNiWHpnekVhaWJoMXJySURwV0hDL25vb3l0M3U3clgwa0tVMnhVb2ZOSFdjRGYwbGFidW5YdW9pVzM3ZnRROWlwd0xPV0lvVys0cHBSQk00MHQ0SG1ZQ09uL3N1TEt1WUFZL1JXRHdqOE9WWVFoOGRYM3UwWDNEZGMvMnlXNDZneDllYk1KdlBQUTkxTE1SMEVqdE51UDlndWplc0I0T0laVUlxL08yRGVzQy9aNkx4TnRrRWg0QWV0dFJ2MmtpbWZvNFg3V3JGWTZpVzNoV08reHVpTUh6WC9wNFk5WUNiVzMxOWlRWlpPbkZCdUtiN280TzNkbXA5VzdrdzhvTWo4bVUvZWZFRkMxbXJaUnpsYnZQZnhyaXRXa1hlVkYwOVdFd0FNbi9jK1BqaTNwSFI3MittN0NaOUppOXZPMmFCRE5yYmdpdmZvK21CQ0gyU1Q5bGVIV1RjVndmaFFZbExNYTcxUWdZRTg3YTBQL0p0eGJ3TCsvMS9SZXlBZjJyMHVhdit6dDhmZVNtb3g4Kytiem8vNTJ4SGxTSGJ1YlBhQ1dNR0xBOW5sUGlPcDNKLzd5RUdIM3A0bEFuL2hUTVdLRnRwZ0FMUy9TZzZLR3JOdUhSWFN3M1JQcHFJeG5OekxYbE5kNFNmQlhDRWhtSHhBM25FUEtOYnpFQjZCZFF3a3Nta3pTVjNqR1dFZ2NScy9waURKcEFkcEV2dFAxVnF0bFdLeDlFZ1R2TzJuWXhuenVmVGJLeXpJc2l2NkRQK2dhaUhxRndLcng0YjZxSjI1enJTQmhFUW5wZ05sdm9DV0RXdGhUcGliQnJldnZVcStxeWhOMmRQMERkVE15SE5FRkc4eVJrRGc3Y2FUeEd2NDJSUkk2eHhkS2NPSlhXQVA4SnJENlRRN0JXNGVRY3RvZHV6R2tCR1RUbnJSY0d6UzZMYmIrbkFxYmlnNm1DTXBQYmt6U2JtOWNyM1dkMjdGTEx1aEZLMXFMR2thZy9lTlRWVjgrZVM2aUtvTmlmREptOWJpTHJHTDlXcWFBQXpMS05qMmJOWU0yU2Q0bGVIeFBFc1JNdGRYTXBCYTBwMHdCVWFoYmtYS0drMVBTQVZnaXpDUEM0Tzh5WTZkUjZuUVFaV2xnUEZJL2x2bFlLM0lYUkFDYmU1dFYwcittQjRWbGt2Mmtza2MvSHN4UEdjSnFKT1dXQmdWNGYwcDA4bHk3MllYZmdvZTVqYU9vWXdkc0ZqaCs5dUloSE5jVHEvRHhHZUk3SjRzZEJ4bm5aRXRQNWNVWXYzY2t5OEo4bHQvbmFFRFQ5L2l3MEtOTUdreTNtQWlTSkJBWWkyelN3Si9YMWJGWVVyazk2eFU3ZzYyZURVeGJYdmNJYWkvMkNoRnFmSGhjemM2TCtFQzVzUEtNcUNtRTlNS3ZnU2FTR0kvRXNFQk1ZWE5SVVlFL2szWTNCVlFBeWJadDVVOFIyaWRhK21aNDVBenBOa2djek5iVmloVlEzRzh5WEYya2F4WEVVSVordDFLYWMzVDFrV05Ub1RJOE1mWW1aYmtmU0xFNFNLNnlXZUgxRjFlb2V3dFB0d0dUalVyY2I2MERuVmhVUzlyUWVEbzFKUFNXc0VPWWdxNldzQUxsUVZZT0JQUmF2ZlBScDArSnBvbDV2T2wydmN5L1dMRHNYTTY4Nm5BOU42Nm9YQytkWnBiTXUrSXg4bVpaOGwzZTV1ZzFlSmxieVdaV1E0NlA1Wk9JNGRxUi9OV0tRUVh2eE5HdWlkVm5YV1pWN3lNb0tJa0VUbEZoODIxaktEOXJrOWgzZG5JbG9ucWhwZ2IwRGo0a1hLSHZBVGxMcUxMS2hBOUFnQUlad2lEd04wMjd0MjFLQ3hwaUhNVUJ3ZVVkZ1JuR2E1ajhVQVhzbnoxTDR0ZVlkR0dJbVZtcHpiSnpZdGc3dlZxSmRjWlVMQnIwUk1VeWYxNy9iaG5sUk5MMWJQby9DVVBGQnhESEl3VUt0SVNBL2xZcHA4a3NhYlp3NVV0eXVaR29JeXVzdjAyWEJtZ1dJdWVPMFV3dFZxUWZyRzJDdUV6Wko1L0FiM3ROTHY0K2VHZ0hrVlZUMmVOZlVFR3JHelJtcmVxWkphZkVxb2hzZUQydkpWajBSRHF1eE0zdDBxc0xtYTVhaHB3MkJOalZCVjZtUTFyT3FTL0VPT2Q0OFNEd2dnNE9YR1ZBaUh5dFA0ZFZ0QTZqeXE1UzM0ZGFjeS9TUStTMysxc2M3WjF5M0x2TGEyNFhmM0o4WmJsVlhydXNDM3FzM0UwbXIrZ0h3UnV0bVZqU0F5S3hDRE1RMWlPd3huK2p1TUNYdnBuZGQ5MmY1b3hsWW5sYlpqR3FFNVAyVTU4d3VSWjhLdGtXWWVlSnNicFJxWFJsUnMwOWlHV3RqenJkWDVhN2l2WXh3T3oxZ1o1MTF0VWZDSWNEUUxPM2FFMXptako1RnNQRytjeWJjQ3MyNk5MOVYyd01uUjdvVG9WYTZMWVd6MzFSQnM1aXViVXcxZ2RNS1VHM09RSU50MlJqZ204bEVYWjNPbFErOVdLUkJIMnkxQ0R2UndwNUxQMzA2SHNXakdNd0Z3am53K1FmN0FVSlFSZFNVd0ZRU2pCOUtrZktseUdjVXBuZ3IwaFFNT2djZkFCOGM1VFcwOEI0ZTB6Vi9UaWEyNERlSUl5bTE5ZndhTzZvUm5KYUJOY1VJbFc5TzdNZUpoMTVCQUh0QnFvd0tHNWtPR2pkT21QVnhRSWNaUnJiSXZuV2p6ZHlkeWtNSEkxZ0pvRUpqQ1dQODFENEM1Q2VoUiszblA0S2dmL2lzRVpWZkZ1WjhqQk5zNDJUREc2VE14Z1NwKzVMbDNYUHVIZGxNZnREaDU1TndMQXBjdWdnQndWOUNaaW5ZYURKTmpVK0hPVXUwVzQreVVHK01ENHd5d3RmVERaalZYVXBzUW1ZVG1NeFMrb002R1FpNmZEUGFOUWZQb0VDQ3FHUWJWMnZJdWUwd3hrTG14eGxHZWpvTDZjeFNrMHNHbWo1NCtuTXRhd29Ccllnend2MGUwa3FlcWpMaTRBcXlyRGoxc3B3OURWMzFneWcxdjBvaE1CMThFeFdLMC9NRUhBQUFna2Z2ZFJiK2FJeS8vL2RNb3F6dnp6Zm5QM00rL2wyVnIrZ1N2OC81ZTNrMVowbEREeUxvZGRpbWYxYVFXQzJUVUJBVWd0bTUvZW16SEN3MWdES24xT1VzeGpTTExaMU9meDN3VlVvTVIxTG1TSHljUjBtTSt3TkV1M0w3M0picGpBR1lFb1RKSXNZdXhBd1FUYzZIMjRmb21GWUE1WXUwKzFrc0x0QzZSZE9FbzhUb0g0RCtXcXdMTEtod3ludVpCYmFENVRFVU13NXVvR0FyRFVCbEFaaFpMTGJzRUhkblpHc3NTbU1DNXVoYzNQd0QwdEovSU1peU1zdms0K1FGZkVBVThMeXNUb0tGeGQxRDQzWmpKWEw3QUl6S05aYUZ4TXgyMWw2b2ZJU2Z3NnZVemt2Y1p6cE9XOEJpcXhndkdGNStDUmZFMlNoenc1cGwrUWJkTjd3eVlRa0dNS1BpazM0SUV4M0ZKQ3BGVXgrNDcrRlBucmlyams0QTBMc1N2VE42em1oemR3VUlZK0ExSFVCcGhTTVpEWXloemhPNFdZWVhmQTBBRjNxU2hzaTY3a1lMTUVyWjlUUDllNDBLdU53eHNxanBCMUE3R0dERU1CNFlRNklsY0NJcWVnSHpXcGsxVzQwakhqSDZ3Q3lOaFdXTUFpeFMxVGdiTExFNUtMcWMxamtaNm1hbW9sUEVXcksrNEsxRTlEVEUyWUFaWUp5TnJDbGdabUErWUk1ZzlwcHk1dFZ3cFpHM1lNNWdwdXp4aU50cXRUc1FvUVNBRjdCak9kT0pVWFF0N2ZiZ1l0ZWZFRjZqMkJVTDdrTEJmTW9CTEdVc3poampMYU8wdUVqYUhMZGF4YmU4RUkyWHQrcEdYYS9STWlDMEJQUEliVDNHUElCMS9kWjNHN25KM3JCWDNQbi95eVNzU1FZTUNuMjhHQVlRKzQ3WG82L2l4MHdRRWx4UkQvNEJZQjhDUStiMm9aQmozejRNZmx6YWg4T0tUL3NJc05BbVRlell2TGN1Z2tSN0VnSWNJZjMySVZDUzVoYXhUWUpZcUIwVGhWVjB6QkhXM3ZsZkFabGM4dEJRZ0JJNUNvcHd4Z2Z2Uzk4WndhSmwrdEhrc2NpQkgwc3FSR0g1UEFxdUVLcGRwVmY3a1JTelVHeXFRQ2RkVFhHSnZORVB3cXRsNVNpVnBqNmFoaWZwSmJPTG1FWHVPWnBGSnJJM2thT0t3ajJXMnpwV3VKck96WTBneWZWWlpPQ0xKOTRYZmNIUWlSYjBnZFd4VmR3RGs4ZGlHaUU4SVloU2VtcHhickdUdGl3d1hXRkJwZmRWNVFWU25wWWlpNkZEUXE1VlJrT0RRM3l5M292NFZCbHJ4Vlg3MmFTYW5Ma0F4NWxOSjZacjBENnBqK3paN1VmeDRSSjhKalgvVzNQVmlFc0NveWx1L3FlbzJVdGh0VXhCTlJuNVZWUmUvVCs1WlZST0xpVTdkN09LelZBWGhpcUxVaVp5Rk1rczhxUUFXVUlsTTUzY2pQU0tzdlEwbXJUWU0xSmpOeVVLTnpseURXbFVsaFFSK0lUaEpnYUtrUkNVaVFNNUlqL0w0djBlaFA3c3hubGhDRnczMXZXTUdEZUs3OVRBYzBRMEcxemJqYks2d1RGZHRqbEhzY3dJbUliQjBGMjZsZ1pOYzZuYUZWRVV0UWV5R2tWaW1VaE0yVlNNY0tVc1RQa1N1ZzAzWklPb1lQa1JKTE1TWlU5QSs2K2srT1ZER1Q3eGNaM3pQdUE2WFM4L05pekVNbHZRdldMNU1leFQ5Q1ZveXc0WHZqalQ0aVNMMldkcksyem1IUTZ6RGxpMjVMMEluTlh2RlVMejlOUnVKM3p4dmxiODZEckVWeStmM2ZDNVB6MThNdHM5dkRNN1NYZlNjL1ptWjluWlZ1blM0OE5Icy8zRGU3TnNRWTJmcFVmcFh2cC9IM1NBZjErOVVYOWhtY1VxOHc4ZnpMWVBiODBPMHEzMG5ONXNMVWZHYWxzOTI4VWwvRjJPMlVIbFZnWGw4SWV1Z0Y5S01jcEcxS2lFY3ovWE1GNWV1WVQ0TS8zdXh3L1kwaHpnOTZqN3hZTHZ5bndpMHFOZkdjd3FORDlXZTVwNUV4OHpmb1lFeVNwUzFwSWxJSmx0YkUyL1BRSklSa1Y3R2R3R1Y0RWpPOGthKSBmb3JtYXQoJ3dvZmYyJyk7XFxuICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsxQzgwLTFDODgsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGLCBVK0ZFMkUtRkUyRjtcXG59XFxuLyogb3Blbi1zYW5zLWN5cmlsbGljLTcwMC1ub3JtYWwqL1xcbkBmb250LWZhY2Uge1xcbiAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgZm9udC1kaXNwbGF5OiBzd2FwO1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIHNyYzogdXJsKGRhdGE6Zm9udC93b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBQ1pvQUJJQUFBQUFTRkFBQUNZREFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR2pnYklCeUJEQVpnUDFOVVFWUmFBSUVDQ0lGOENaOFVFUkFLMXhqSkV3dUNFQUFCTmdJa0E0UWNCQ0FGaEdBSElBeUZIeHNIUHpYSzdSUEY3UUNVUlYyaEVmei8zdzQ0R1NKUVU2dmJmc054RXNKcDFBRWpJUUpFMkN5Y1REcGlNWEZUdUlZVEhuVzZHdXR3S2hpMnR4NWU2eWJpVUlQVlY0MnVzZTRyL1piTmZXdWJaWWMxYlZlZDNoTkJIVnJkUHRxL2dERmw0bm11am4zOHQxcXRlU2ZNRWRXcGR4d2h5U3c4b1g5OGZ5YVpTZTVDVUNXNGdsaXEyc3EvK2kxVVBXU0E1dGFCbTh5Qk1HRXdWMlFmd29BUnZaRmpEWU54eERMSVVXa1VLUWdpL1lwUmlCMjhIZnlELzQwVmdJK1ppWUNJV0svOTk1UzZacDRacGd6TnBZZWM4Q09rbUhTa1BzcFV5WUgwSldOSXVPV0hsdDVsTHQyVlphQVF1YUNNS2hXQU5IRUllNWVaSm56bkFvRUxwT0t6bjZldUJPKzMvZExXMjR3SjV6dmFLaGxhMWFGMkhSUE9vbUdwdmx2ekRkSmlPU1lJNGE0dlM1NE85Y01qdjlUWml3eVMzdHBKcmlxdmFwa01uOGpleG1tZCtkTVRjaDJBaC81VXF0Wit4bm9aWTFFdllLVlN2c2REMVBPY1Y3Z3NnVS8rSnNRZkpMQXdDb0wyN2xhVHRuNGMxMjhYWldUbTRRTk1oeGRLSGI0UVZUOXYwN0w5b3kvdHppN3JJSUQyb1JJdVN1QTJSWnVpU3FmLy9ueDltcEgrak1hM0F3dXlGTEtPUnBJRDBwTGxrT3p3SVJWVlNpQlo5cEo4N0xzUVZnRFlVWldtVEoraXFKSXE1VzFMdFJyZ2xVV0VGcXBmdlM1aldnZlNkVk9QSXFRUUVTRWdqdmJYV0l6Z0tNcFoxdGJXOGxURENTUHFVaW1LRzJtVTRoNkI0dDN6aldCYVFTcGppMUh2dnFsc0FJRzZDdExQaHNNdUhvOGUrTm50WnhuMFNzQnpubDZrQUpMbml3cjA4SlRGK1VYcVlmdlR1eUdENHUwQjFDaG1yRDJ3Y29OaXNpdkFuc1hMQkVyQXZGRm9menlvcXgyQm9DeG1pRzRQZWl4RGdlbGhkeEk0V0N1OUFjQVpXYmp4M2dHdWpiTnl2Sm9wejlGdldEclZhRUNCR21VUkcvSjJCUGJuRzY4TDVPSmxIZTF2a3dCVUIrWk5aMVRwMGxKZlk0eFh6aTZTR2tISnlublNJaU9BL2pOTzNZZ1E2c0dTMkliZGtvb0lqMkRZSDl4TEFEek9QNzhLQUJzWjk2QkZMc0pZR3BjRlJZOHVLRnBZaStnd3BTdGZjN1ZWRDlTd29aU0FKVmJSNTJab2ptN1cvZitxK1kzenRybUY4OFJjTUpjQWtQUFBqM3V2SklBUnJiMEZtYndGQStVQmphazl4dVlTS0pONFAvME42bDk1UHQ4bUxmclNXdXYvQjRDcmpOTTFGTWVvbDd1Z1U4ZDJOckhUZWFSWFViR1dyU2pZU0MvbGpMQkJ5RFQreUNHLzgzK2FLSk5FSWN1eDNjODRoMUNJdnJDWkhyYVg0cDNzcjZkajdFWThXRTQ5S3BWbFcwSU1iTVQ5eW9mWnhUNGFXRSsza05GUlN3dWI2R1dVS3BwWlI2ZHE4NzM4VHhuVnJLWmRFakZReTMvYk90aktMK0c4THpja3BWTUk5dnRmQUZWeVQvZVdycGJtcHNhRytycmFtdXFxeW9weVExbHBTWEZSb1Y2bjFhaFZTb1ZjSnBXSVJVSkJRWDVlTHBURHo4N2laV1p3T1d3V2c1NU9TMHROU1U1S3BGTGMyUXpWQ1g5VFdRdURsTyt2VDJ4dUY3VWdQTTNKemViRnhrbmhmam1ZY0FRMUVUdWFTdjNBV09zTld5aFFVWGZmSEZlYUdRaGZra1U1Z09OcXZkR01SNU5HcU5abFJweVJ1WkxEYWxjZ1RCR0JwRnVNZnJjdFBlRUJMbFliTk5zMnRDWVRZRkwxaVFTVzhGdktKTHh5Ymp2OVpRWVR6ak9xamkzTHV0S1hQSWk2NStIK3RTMWFxMlE5a0pSeUExVEhxN09ubkpIMU5RSzJ2UEg5VWd1SVFIdlJMTU51L2tIMXVBSllSZ1JIOEdJczJtMXdtWTI2T0JXZVhESGF6UzE1bjR0emhLYjgrcFowMm9sQVQrTDRlaXFwOG5XcGtkd0FocjB1eTY4RVNScnUrYlFtVTNZUnd5cEhRRUNUWTdQRlNEa3l6WGtOYjdKYXdibW1QVlMwc295Z3d4N2F0eEh5eEcwWU1DZEp3aUo1V2xWV0ZzMTcrYnl3enZKeURUMzdRQkRNeFdrRkNRbzA3YzRKV3gxVHg5VXBFcE1rWVovOGxjZitRUUFmNFd1RU1kb294OVBHTDh4cmxickppTjcwMWNwQmgzUDZ2cFBBVW9kaTVzTkp3TWgwSkVkUE4vSmJCREVtRWttcWU2MlAwMm5YaVl3N250L2xNUUlSSnNKbThJYXZJMHNTTmFGbVlqTWZqUFdmeGorNEE2cXNRY0xyL0ZTZldscjBTcDBhR3U2UE5KMDBOVWRuMnVKVU9TS0QwN2tITXk3aTZocjF3UktESlhkRGRKNUJ4YWNjV05GeWwxaFVTMlRXcHFxci9kV2hJamZROXY2Q0xaR1FpdkpJY2FTR3hJbE13TmYzRVBKN2dBdU9Ga2R6RG5JUEF0dkkveTdYWEZQcmxXYThJSUlheTlac2ZBVExvRGlDOG5zbVVlaXgxcmZLelcycUU0eTdCNTMyYUpMVUV6ZmVFd2ZoREtudXBmWWhHWmZ4K0RZUHJHR3JKdmZrdlErOHBhakpHSldYSVduWG5ycVZiSjZ6anlPdG9DYWdnZ0FsbmdWTlk1dWRONkxSQ1I3TVRPYWIzTkVLTGFPaHBUYzZzeVMrOGFEVExqOVJNWEo0bDJKQ2tiVWZpK1htYTNGbVVBMjg2SUZWdXF4dTFTMlhtL1FRRDNnNExKVXhMdWd3MTZza2RFVnN4MWpwVkN5dC9Od0pZSEwvZURlTlh4SmJCRXNNY2xnYkRpb0xTSmdjdDZIbXROaCtSblc3c3dGVVhLWWlrRFRBU1JibkRDNTRaem9wSXErU3NnYSt4cCtvRTZ1SGV0S2VKSGtXTnlubDFDQXhyT0ZwU1JiR2VsRFpEVnA1WlNZNjkzaExYSEt1NmRiYWpXV3hJR0phR2VTVEZQeW5EQzZhTXRaSXkwNW9FMmNaYkwvdU9LNWszRWowY2RUU0hRSE1yS1Y1dUdWWmlOWnNWZEJwVHk4VUNNWndyaUdnSklCRWE2NE56aml5dTlSSHNDVWNPZmlHeThBVngzRU50dXhYTUFBTUVuZVZKRUI5cTZuWitnRHBRQ2trc0prSlZEODk4a3g1aGJBUUhHeXhvMDJhN2Rmais3QlFGV0d6M0xWNzJWSkZYY3E1aVVhRlpLZ0JNLzQ2T0RmWXZxQTR0SDJTeEVXWEZvNEtqY1BDeSs2bW5aNThld0ljRTB5YWFwY2pXMXgxWXRKK0pRUkppUEJZczJ1YXNRQ1dtUm1FT2xLQk5TZ3RBaWx6ajc2cGdRdlBhQkROTzhxM2NyWVNOZzdaNE5wcDR3ajV5RE9YSE15MVh6RlQ3clFxMktDQzBUdTJ5SEt2VGdRYUdOSWpRTTcyd3RXRWl2V2JjMStFaVVBRkpDcHlOMk55Y1phK29BU0JXWmxnSE5vYkVDenBFRnFQTUhGNGVmOWVTZ0RBMjdsUUQ2WXkxSzhEcnQzUUFlSk1iWVdkQVU1aW1vdXpCTklqdXdEZ2tDVityRTYyL3RCSmRNWmRXWHRIZHZLWWFIbWt0Sng4MWRHM0o5YXlQWnFZRmxrY0NTV25XWXp1RDNMZDRTNUJsQk9vN09laUg3WVlnRFl3d0FmTFQ0MkNHV3dHaExhWEEvd3JBZlQ0bFRQeXV4TkIxMkRicHBTcFRrYzY0ODh3ck83WW5XTUI3RXR1UkNBcHltK2d4T3JXRnRWVGxzUEpvWm01YzFEaWRtNjFsTUNRQzNWN2JWWmRRcFVIcWVrQkVrcWRhQWNOSk9Edi81ajFUYUM5UVpHbnc3YnlHZDJWYm9RODl1b2V6RlE2QlAzc0h2QWdoeU53V051QjZpMHVTUXRuVm1vY3lSMi84eHdDY1JYdUNNRlNpdG9QSEdCeUROclQwSE13bHdsNVlmNThjVElncTRyK2U0NlR1ZVVpUnlkZ3VLUzUrQmsrdFhLU0FSdytvTTNNR0FwVUtYRHBtK3AyWllpcUxtTXJ5anU1V2xkR3V6OGZCdm5RWHNhb3hrN2hqbDlqWkZDYWhMVFpYQTRsaDJjUVNLcGdpV3UwQ25sS1Z6ZDZJTGpIbFRrYmtjT3F3OGNBaUN2M0FWVHhSZVp0d296MmZEcncwSFhhcXIwWXNPb3hyVDU5WU1XdXhUTDBzbVhSRGxLRTZkY3g4SWhTL2t6b3VneGJmUDMvb213eWhpbHcrcTREMXVWd0M5NytwNExkdVlKUmtPaFU0Y3p5VFhFdVg0R3crSC9qcElXSlNkdFZKb1hnbGRiNjNHWDNCYS82V21UNTlIZEJlbkZHcnlKb1d2SmdPYWhpVnFFU09laG1GNnV1bUNwZWM3NmRFYTBXaktaZkpXOHdhNFFyS2c4Vmg3NHA4dmo3all3UXFCQno4S29ITHVmaUw4SytCVTBnZXQyT3VUSlc3VVRLc3FjSldNR0xORE9JWnQzVlRIQWttQ2prRldvTmh5Z0dUaEU5TWdPVjM1bUpFMDJlYVB3YnJSdjhlYU9aSXB4QklNOXdoajlZU2pveUxQSkhhM2N3R0hzbWNRTjRkWXlkOTZyWm9QaDNWZUd1U0dDRUVHMkRMMDQrSXEvYW9aVXJ1UWRGZjRVYXJPUmkxNVJiLzl1Zm9OdFVVZFdYY24vNXAySHVCVGduMFRQNVMyRFQybWVBajRoWUxJUk9uZGRadGh4U3F6NVlXS0JHZFNtb2ZNbTFUeThRTFBBZ2dCamNvc0JEYThjcjJJOTEwUDhDd1BzUEVPZUlIdGw0d1haV3Z2Z0FsVWRoQnlIT01hb3dybU5NNFo5Qk9WMkhBeGlVVEkvUWtjQUtPT1hEclVyRGZWU3hiNHFLOEhJNFhNRzlmV0RFbHc4UkdtNDFTaUFNNVhkQWxFM2FtNm04MXNrMyt4TzF2ZWlYV25CZHpPcXZvVE12cHJaUHBsZVozN2NIdGF2ZGRKdGl2UzMxeTl6c1pqcXJ4dFcrNnVEdE15U1paYVQxTHRQbndxaWVwRUw3Zlc2WlczNnJsSTYvMVZJZWtxS2RkUG9pWTBrKzNPYmJsNUlGTUZXbmxpNUxSUytHOEM4d25XMlVZNXVJRVZKc2JFellENHo3TWpxaldMbEYzTWFIUVhtU0dENVg3NmlkdHg2VjFuMC9kT2JiNE9wd1YzUkZBaXBsQklrQmswa0Q4a3pWWXF1c3ZvWGdhendYelMzZGp0cGRRaUpqVlowakJQM014Smc3dzAyS0gyTTd5b2Y0NTdSZlYwT1RYM2hLL3pXMkxvUWNDNk43QjV0dW5IQUlvQW1zSmJYUUwzVHNodjBmaFpyd1FFTmpPeEZEUi9RbDJXQ2hweFFZUllheW9MeWtqQjhoSzhMZWw2T2k1TjZGcUp0elgvR3BPOFBuWC9CdXlOeXJmajNqRWlqU0IwR3FCc1B6WWJJRXVHK1VDQksxRnVSUnF4bmFCcUZPQlRIczh1RGZCMitFeGJaSXUvTFZBQTFMY1VOaTQza21HRXlXSHZqQVM1TkVBK2lCd1dObzBuUnMxVjBDRWJDZjlVLzJnTFI1cnR6RTB4WXdLUWlqelJGY0VNYjdWM0ZiME9JeVpUbVdGbUJwOWR3aTRtODR0azVuUnRYTXlsc0graTFiMHp6bUZhZmo5OFhkMXVnNytTWGRVV05CQWozMSt4OFpnbG9JZy83SE9BTHJwSmVza2hnbmVwNnFZSk9ZeGFnZHdrUU9RWTV6ZTdYbVVnM3ptcFptTWptajFudHhxTitKczBISjVtQ0tmWlNpQVFpYXFPV0FwR1ZadnA0TC8xVTZOWEhIZW05WXYvT3VHVzkzL3BsaE1XekorTUZXQ21rWnoyUW9RQTYrUlFBRDBod0VqWllISnBpM0FBMm1PTFhrdWFzUzVRZU5NVEpubjQyOWdlNG9QdHBQL1A3T2oySVl3NVpPRjVRSFpFcktUcUl3Q0RKd3M0SUp3d0tLbVA2blZWYXhscHhYTDZVOUFUSkpyYmxYbjlHKzFnTGoxTUo5MDJrNndkTmRRY3JNaytKeC9wODIwZjhZVTZzcFA0Y00rQXZhNHRBNkcramVCRnN4STdDNEVnZGtHdExuQStJNmhBaTZZTU92VTE2K3JqczFoQURONzBxTHFnK2dBbWllTkJYaUZZUDhxZmVjaHVwSkVwbk9KZGh1YUFYVUdhWi9uVFRaZEp3VjNWNW1LUDlYWHZCYlNQT0NWYjZteWEvMzY1OVBORi84K1ZKdERzdk5tUXZPV2ozdzlsd0NYL2pmV3BhTHdlTEVwaXZxcWxTV1VnZFhMREVBQWlFc2h6V0FFOExCcGhOdklzN3l3bnRsTFdnZWx1L2Z6a2E0WFRvellhbW9nNnFBTWhkamFCSHF3bW9PK3RHV3pCUWlEQk5OZDB2dlhtY1ZWNHZnUFhXMVc3WENVcnRrUlJyTmg5ckxVa2ZCK3dpdk44b3BWZ3UzKzRjbzZQRWM3L09mYXlQdVp3M2RzUlJTUktGbk5WTW90ak43aEg3cjJneTZUbUtXcW11SzhDdVRDTEpLSnNMQ2xGd0NxTTZ0QmxHNVlWd2VhQTZ1b1B4Y085NEtyOVFja2tydnpXcUk4SnlBVGRVd3Q4TVF6bEs2cnRlN2Fra3QyQmNETnFVeHRGdWFLVklIcW10Q3I4dDRxMXVkZGtQcG5OZDkzejYySk1telBRdUpwZkhmRGlLWE5aNlFvUnRvdHE0aFJUb0hoVFlRS3VORXdHYlROYW1XVU1veUtMKytndXRhdmUwS3RidVcrNnU2TWhWN0lUTDNIcHRma0ZzUDdrNGhvM0M3U1VPVHJPK3Q2NXdScEtENERJbWR6MGh5SDNyeEdRbC93NjFsZ2lXZUhmN2NtMm5RaklpUVU3b3VwNytYWFowL2JKRTNnbVhaMXAvL1RXbjJDU2NyN0VVbmpYSmxyRlo3dWIyNnU5dXh6RTRobHJMd3BrMlRWNXk5aG0reUFwc0VIS29aTXRHOE9KR3l0ckNwN3RSYjRaaVRsYUJ3b2tYQ1pySExFNXVHdzZxdXIxY3Bza2wrREsyUHdDNkFmWTIzT3A1ZjUzZWtzRGYxNmFDK2xuZlFUZW9NeTNNNzRWajhtK1B4ZGZUcE1aN1ZubXMvNzhkVVQwa0NQOEVQaHV0b0tNbzRHWGhNSmkraVkrWVc1d3hvTERjUG1KWnhwU1FnVHBJaTRpS0NzRWNWWlB3Sk5iUGRFNTVsOW5WTUczOU9OUE5veTNFSGRRb0FQckV0QUIvL3N1ak5iYW1aVTFsWVJZR1YyVWc4Tm1pSE5RQi9mTmw2QkZwcTh4ODBCc0FmMTVoSWdCMktRK1dYWVk0WkNKRCt4VTRXZXZ3S1hQN2dFRnd1SHpiTGV2ejNEbnJRc2JuL0E0NTFNR0wzei9Ta1BoOHVxVytFTWNuUGU5N3NNcm0wZGFURWVSUW85OE9UK0NYdkgrU0Y3cTF2ZVVJYmFFS0U5a1RLKzRVTkI4VVpOVDRKK1duS1Vpa21SdGRWWDNYbXJXUjM2bWFyUnRlVDloS2ZWMG5xVkw2YlI0SlBjRkphYlJ6ZDFhMDBYaUdJM3loc0tEMzJzcUJiZnpOUUN3cmVDdDIzZTdQSURHZVBXTy9BY0VwNVRMYVhKckJmejlsSytKYzBzY0dZN2phVTR1UUJCYVBjV2U2cE0rOHVYZUNTbHdjV29YMjRqOE0xTzd4Z2F6S2tuL0FmNUJLNk1qT0hNV1Z0NlRwU1BEMTM0ZXBmRDhoYkVEOEVLWFZPT1lLK0ZGNmY0ZUMzSGQ4UTV3d2NuODFnTW5wOTBoeUZOeko5bndkaDFNVkwycjErQnAzQ0lNY1dOQmNxbkVSV1kzK1ZHUll1MzFoci9Oa3dYSzhVN2ZEK24vY1BsVkRoSEVtWEphL3ExR21DVzJXVTFOejJnQVFmZUlKWHR5dks5WDVoNzZzU3cvUnd4eDFZN2VhMk9zVUJyeHl2ZjVudUV5NTFPNHdyMmhiT1hXeUUvVmUvL1RHdlNJY3c3QWJpZkdYOENDd1JEVUVnMUgwNFBqK1N5OG1QamsvSWkrWnc4eUpSQ2Y4RWFzeVQzaVpGSXp3aU9mR2ljZkNST0czSEhnSE1UWkVhVGJENlA5UXFxUjVjbi94b1k4ZlZsT3FTaXltYk8yaVAxaDl2TVByUXRIUGIrNmExUnY3MDQycS9UbEVLa3lGTThlMVVhM3piUkVsTWczSVU1VDlUZU9wUEY4SnBsZkc1aG1wR29Uc2orajZxMUlUbGZnRUVKUG1yNTJiejU1eVVNdThWSCtnNU1aNE5Sa0lIcFh0blhocUh3a3Z6N2xLTmlFWmR5T2RTOWZLK2UvVCs0akVpMjNFK3kvMTJZRG92TmRDTDhLOG9ST2tqOVdybVJaZm45cjd0dXk0OTZTSHd5WDdHZEdyelNZMkxjM0xCZXdnRDh0MGcxM1hzbEVwY0kxbmltUFZZOEZTUXBYQ3NKR2YvWGYxUGRSWUJvdDB0MnZaaVdZelRVZzQ2WitGbUVaWFk4WjluNFpxdEI5TVVnU25JMGZmeFg1eWlzNE1pc3F4dGNDdUtxNmowS0hJb0s0b2F4NG9KSmROajJtS05ZbmdvRzdGUitNK1B1UWZKd1hvcWg2SElsTkRsVTNnNFY4clIzTEFrMnFBSHc2NkVXYktRWGI2V29mblVVZ2VLNFNDN1lHSlRIMGd2eXpEdytUS08xM0RwSFhCMzM1VytRYWVFaEVsQXZBaVYrV3EwbW40eWdpWndFNmlvUzFNVC84UHhQVlh2TitaRW5la1kvQ1k2dG1RYU0zMXl5WGR4MjFERW1XeEYvSm51cmkrOGc3Q0pzVVo0WDNwY1BadWZ2S1kvdlFKdUk1VlZ3cmVsVHcyZmJaWUQvNk1kekNpM0xRT2xsbmVCdXdzWUY4ZFc1eGhLRFk5SnlhVVBCVTFvakxPTUoxSDhOeDl2bmFpN2ZlT0pBekp3NUJwcm5hK1VIOUVFNXhvV0srQ1pJV3VFdVp2OG9ZTExia1hPTUtuYk5jZnFENkhIdStqVFk3bFdKNjVacWc0MlBDTXAvTlEvc2x4SFFyRm13MVlleWFiZkZydkpkdTd4SHJWb1hSMXgwdVd6dTVQbHRreXc4TUkzWGVuVnVpYzJjMzViSnB3UUtkYTdNUk1yOTJKN2IyQnJNZzkyNTBRY3NJU3FXN08wTkFxamdaaWRhSGQwaDBJdmhoMWtTbCtVZ3ZhTEMxWWJwbTdKS1RGbzBuZ1NWWGZyemEwVDJDQmpYZ0tGcm94dkVoR0paTjBHZG85N2plOTEyWjdBVFFSWk8rL3ZBOFJnK1UyRXJyci9CTmpQaFJVdVNEY01abWxwTkVZYlVaeU9aVmxQVGx6WTdUWGVNZTYxV3hlaWt5MWtPeVZ4Vmw1TDF0YklvNmlzMVJ6bEsvZWQvK0l3bk1tWHYwOUZQYjV3MGVIaVZ4VDl6Nmw1SnZYUG1WbUhXZmk5VFhWTUhzbHJ2M05vd0dicGxWS1BEcmZWcnJ1NFFuMTlESENmNGdKYjZQY2N0cUdjMzZ1UnlCWnlINjE1WDdIM3JIY3FPenlsS2JOUmZ5bWFFOVI4TTlsL25EcmxXajM2VjA3bGtKMXAwMlBNK1VEaktpM3p2S3BMUFZ0ekN3SDQ0OUtuUTVZMGhBckxLb3BvT0R1dkdJZmtBa3d2TVRPN256L1dpNllYQnFKUFlWbTNnYUNIWXRPY1NpK0kwL1pURnFrMGZ5QVZHZnBSOWxxelp5Y0piR1Q0M2pWWDc4bDNrNnJNb1lLV0RZd2lWR0E4eXdkTXM3QWJ3U1dpeWhvSXNZUjRnMmtaamtKTVByVWd3dVJyUHc5NGpRZW05enR6RnNQWUQ1QTZ0VjRQZkZRM1p5OGY1UWZCNVBueVl1NHVaNW56SmhLeFdndWNiNEdiNHNzVElXTXpDTE1lNWVpalZhKzFqL3NzWGpPaE1SNEJLMjZhNkdxdTFqMXhtQ01YTFVnM0RtUXBGTkVmVlIyZ2NBcW1xOG9kWlRzWHlsdGdyTmsySjdyWEVBVnhwTmlXSlVSR2piZDROL1A5eTRkeDdMaFdjRFk0MnpYL205enZIV250NEx4dzc3a3N6S0hwTG5ybzhZL1ZWeDJsYnJBaTU4dHVCZEJtWHlFL1pPMFNmdmxpbVRGblZXTk9UcTBmdHE3dHhVNGFldnVWVC9KZmZrVVBkRHBiWEZ4NVIvM2liSzBQOTVpYXQxNThhWGRzSFNPQ1B0T1Q4THkxUkZmY1ZoTDN2R2NyWlRhWEZCYTJsM2hiY1JqMjUvaG5icS9mVVpLYk5sQTY1ZkJ3NmZPd243QnY2YUZyWGNqMHVQd2FUV01yTVh2YkZ3TnYyYzFIemdyTGx5dExMUnlSUVlibEZlYUY1bTlFRmkxeDFIYVR0UmJGR2JTNlFFN3pCWlg4OGREcHRZdWZhb1lxci9BMjdrc0JXbGRNWGdpcFh0T2MyYWVJMFVhbTBmOUpYOWtSWEpxWDRFMzlFSnFsclZhdFFCUXUzOUFveWhOMFBlSHVSMFBvaGx1azBwcVZpYkZpc3VnYTRoWlhFNFZmSHNnQTZZOWVUT1FMZ3UzSThkRHNQUU1JbVNmZWgycEd0SmF0YjFzdHRWQ1NWdWdRR2I5OGJHWm0xcUxDL3czMS9xcjhJYnlLRGZWaXppZFFkcEtDQ2NFN1NaVHpDYjJZc0EyMmRnUzdEYmIyVGtXRmhqdVJkZlVTa2FGRWlFVlNVUHJRT0JFcnA3anZmZTdwckg2TEJsdjRmTHpkOWFCQ1ZqT0dGdUx2RTA5ZVQxQ1czTk4yajRKeEpGbFFlZm9wWjZZRDczNmU4MisrZG9RaTZMZ2pUR3dpTTJIWjJzZWhOSkRiNldDVHhtWEZSSHNuY3pXRVFRYmZoK2pITWRNSldWZEp3U0FFMm1IWGdBWXMrbE1vai9lNFNWQkFZbHY0ZmN6RTRZZ1JQbHIzS3c2ZytXT2FkUUVhZ29ndURIZ3ZQR2FwRllzOWF6WE1SWmpFd252NFJBSzAzL29UN2hPZWlJYjJqdThGSWZERytBMFF3aVkxUWxDQW9kTUFRcWk0ZXdhMUFUUm9aczJ0SW16USs4OVpMT3RZODM1YlgrTUhST2NWMUF4KzV1d0swNjcxNzNzSDZqNGkyMzQxMjkrWmFWcWJuYkNSbHgyN3NaYVhiWXJyN2NzeXJlYkZic3h1N3A1dzRjYTBXclllaEVERGFVTkF6VEFXZHhIcVNhSWtSbWQydWFYYS9RNUM0TWxFbDhtbzRuMjNEaDRlSU9yUkVDUkZBVXRCcWFFUkdBTXlkUStyMW56NzN1OHMwVU1JN1grMCt4VlYyYVpSQ3JZL3p0aHZiUkRPa2dvYWJpUHU4M1RScVRIaVVPd0FCTzV2My9XU3FqRHRlWlN4Yjl2ZERaQ3NKRlN5SnVEQXM2TUo0Vy92Y1laVjZJbEFlOEgyQlZoOEIvRmc1U2NOTTJnbEg3V2pPditmNUREaWswa1Jyd3JYd3JQR3BzYVdWc2pMUllrTkxtV2MyOUdFWXdHSzlyOUVxejgvdTFZRmYxdURsZGVEeDZ1WC9OMDh0UGFKWk0xOXErRnJOMEFJM0hzRDNicjZxbkgyOVZ2K2JHb3llbnBNN2RuSlQwbEp6azZSSFdxTlp4cy9TUk5KOEcvcWtKenNmYXhGd0k2b3kvNWwvdUJWQkFRTzdMaWFUMUhUTXNkeGQ1aHBOS0xacWp2Lytvbk5zVy8veW5RTVNJd1hIVlRucUxoMzRBOEFmRlQvSjlaYVROM1JML0JBcnJmYS9hTms5ZnkxVjJ0Ly9wRHY0RSs2TWh3ekhxY1ExamhGSmVTVFFwWExtS05Ub3dndVNRc0Z4eGYwZXpNZC82WTZiM1hDbWlYTVFQczNqajJreXRvMHlyenQ5ekoyWHpMOFB3UC9DZVRZaGpwRUUwc1JuUnFUSDJybnBINkRuNXg3OFBjZXFJZGY1WVJFdXJYTWxYV2cxYTJXMXRTSC81STJmU1V4NVJnSkZmNXBrODJpQVlRSUlHcGZYRHZaYmdSbEdZTmNiOUlaV1lYVWY1c1M3V1l3NWxSa3Q4bVcwT0lySjJ0T1JxOG82T1p3aHd2M0hEblpuOWZOemh3bzJuUHNUTTh3TlVvb0ZFWVZVSk9pQzRUQ2FLRnJIQ2tLS2NzZnZNWGJmL2dhbHpPQVVLMUFhSE1UNVptYWRLVE1Fb2xFSW1mTm80eWo3R3haTFhSZm5qK1Bac3VxOG1qbk1IZEphb1R3Z1pEVHJKUEpLaE14RnU4TTBmZDk0VHNQRDVrTjhXOE4vOEFYaHpzZ0JKcFJ4SGIyK2ZuNW9vd1RjYk9ycXozRmIwMjRJRWhMSHQ3QU85VXdzUDdSWitYMnZuZUt0ZmQ2bXdvT2JsTnpiWkd5dmtteTlJejhxb2ZjM0JEejlnSXhpOUtwQm9hK3BFR3VMbThzVG85UWlOS3d4cTdBUUNJVjBuZkpWREdoV0ZGYTl5K2xFRUVyb0xvT3ZKNC9DOUJSNXdWYjZXa01ISDMrQmpSWXRKTndaYTIyYmhCNGw5amhEQnN1b0t0d1hCQjdYQmhYeFVWd01WMENOOCtwMDhkeGFWd0dGOWZsbVM1blk2MW9CaXI4cGZMb01XZzNqc3Zxa21DdktXSTkxZUJTdUpLWFlhdTdsWG9sNnM0TkRzUFNvaHdreEEzaXUyUnZma1hJOXJBWkpNaG9UWkdwYllacThtQ09aUWZnaG5ldk5iMVBBZFRGeWZLazBkRUFsUDVWakUycHg4Z2ZOcG5td1YzUE5aTTBuOGxBNzl2MFBFSjNHQzF1QWNCMHU1M0VrZi9sUUM2TXpqdGpQL1BBd3ZDbDJXRnpuN2MwL1d0LzJBMnZpNTE3WFYraWQyd0tqeDI2V3ZEMUhhRUpBVHRzTE9JMk5VeUwyWE5vZ1JZeWtOWUtVU3pYM2NoSDZ3UUEyK0ZmV0VEL0JvVkFncDZRMUg1bmdMWDg4K0FBdDNhZnZSMUFmZ3ZvOUJ1QU94Umc2VGVBMmdjRzRxb0VPMXYvYzNEREVCWG5ucmphTStCN1YydnZZWDFIMzBmYmFFVklFWjJUT3VqNkx2NjZIZUt2dS92Ulo5Mnk2UlE4ay9BSlFDTy9UNjA4a3V1WU42QmpsMVAyazdVTmplUWNJcUtyb0djcmdrR0pFc1VpcncyamVZR2dnQkNkWmovYldRN2d0dDlzOUtVZWtMVWJlaFdFTFFTZ0t1LzJyTDlHU1cwOTlwZGVsUlpjakFzQjdGZkhodkhYckxiSE1IV1ZHV1VpNHFzQTRUamdNQmJsWUtQRlhQRTdXVFA4OHhJRWJoL2JqL2kzTWliK3ZkTXZXUWFLZG1KZWdXUVhkSWsrTXBEbDJHdnlSMHFLTW5jbUlJUGgxVGRaUGR6d25NUklITm5PN3JNaDkxWmp5c0cvdzl2SGVwdjM1Q1hGTkhrS1Rvbk9kZjFZOCtKRjNqVFlFSTg3ZkZKZFhHZnU2NkVrL05adzExeWVhSFkzRnNBa3FCWnpHdVRKalpDLzBjbHphaG5xNk4wQXN6NzIyUjhGem5BN1RQTTJvVlpxMWx6TjU1QzVmUURQWmorZVJhRXZsUGU4b29oT1VnL1IrU3lvQjBDd2FXRU53N1dxc1crVXZkdGFOditqZjRBRWJoYWVWd2RDOGo4Lys0dkgwRFRna3VlRlNCeHlLREtRNEZSQittU2pEUlRnVEZGMUIwL3NkcGMxQ0xoUHRsZTRiamhNaE4rbEJKNEJDWDRERFhFaGNxSm5Da0pQOGhCTzROTUJla01kbGE3SkVjMXN0NXhnVkVZSUtwK0lzbWU5QktOYUYzTUNUKzc3Z0IwbW5pdkErM1U1V0VuQjRwZlhwRk5Ka2loY1B2b2g0MVkvUFFNWmp5b1NlaStMY0JIZjZiS3BaUGR2OUV6M1NkdnF6dzU3cG1QVXFZQVA0Skt1R1FHVEMxZUFRT0RnOEZNTG8vNGtMU1lqem5HUk5FWk5EMUJaMGFDL3NqTGZlZzcwR2JscVZxc3pZS3d0bm1GS3JnNitEM0VpRzduRmRZd1JNb2tmUStrOWd5NEowUVZ6b0I1c0E5c3hWL29ETS9ITkdhOEg0VlJ1WkE5TVVFSDAwZ0NXTkRsTmdJbHFsL3oyeTJ6R3p4dmRITWNUY3BvMWtqZUxYemwyV3kyek40MTN5U2FVT0RyZlllT2dNRHFxeElNNFMzRnpQcGN4cGJMa24zTWRiS3R5Q2hjNnpmS3BmKzhtY0tJbE5HL0xoVS9DdkZyeHloaURwWVdrWVBjL211bkV3bEZ3L284R2w3WmE5Q1h3RExScEUxOG5McjZJTThwMlpPS01TVC9XcXhXNEJPMm5yWXF6aGg0eU44RmV1NmZhbVg0OXFWcFpOaHBTQ3FyZkJrbkdTZzdtWHN0THFDNjNNYU81bjRVU2tibGRsd21xeHFGV0xXcTJZY3JFbnVpQWY1d1FvNGhqMjh2UG5pL0tFdTdjbHpLL21PSnFIQXFBR01HT2NjWmtGbGMzMU9IZllhU3R4LzdFWE1ld3ZPVldOL2FHbE1SbGpHaW5kNk1tY1J0eXBuOXh5OTh5RTRiU090MXUxTWFRdkM0TDZxOWNBQ2d0bnBROS9iV3RWb2cxZHc3YTVmamtjdWJQakxzUjErMDJKNlJ3Mko4K21SNE9LVzZDc2ZENVc4N3BWdmpRUlQyZEZyUFpZZVA2YndNOFYzY2ozZFVsU3dsc3NkdWt1WlVsZU9DaGRwZzl1MmtvRzY5Z1dPMHI4eVpwWHhQQ1R3UUYzUC82MHJheEIrYVZMc09ZczR2dVZka0xzamlodU1vOHRmSkY3eTBIRUR4b3d2ZEJqUmcybXJSSlY0dDluUmVXUU1wVlQxb0RYUHJiRGQyU2x2enYzOUhHKy94ZkJ3ZUcyOGVoZFdBa2V4Q3ZtSUxpd2oya1dyTVlwaWV0TVZhaWdTaFR1SktiK0lNUTJrRExCSmd6TDBHb0hOVmVIVE11L1BYclpGN1FybUhvcFAvbDlxT1JCS2VvSFdZY2tDMmEvbVBWSnA2ZUg4WDEzYmtXNGY4alRMT241dGRQNTcvSVcvaTUwcFh4bzIvaDNySytyQUFqQXM2TWxKMS9Odk1MWEU2aFFOQU10NzZjblhxRGM5WUVZTk01YWxoS3RZS2p3WTZqYnV3eW42UnhuUzRnMzdhbFg0UktnWFFJRCtNQ3VOOWg2Z080U29TdngvRXBUa2Q3STFYcFIrd3dGQVArTzA0YUFLbjdBZlM3WU96R1dDd3dYYzlSKzB5dE1BM2ZaNnJEUTVmSUtmWEQvT3Y1RUs1YUJJcG5NQ2dOTTZHQnhxQmhvMHFnQTk0TVJKQ1lmbHpuenpRRENsM1FCUmlwNmVLeGVIYnhBSTY3TkdhSUNiQWhKSWpORDkxdzVoNnFiTURQL3RMRUhTOFhOVDZFWW1LMktXV216L0dqN3hsRGNNbmZHNXRHaDBqRnhEQVBvQ3VnMlFVR21LOGY1YXdIUUhpblV0V2tpb0tCSmtwZm9zS1BoV0VyWmI1dHpzeEhVUkZyZHB3dXNiMEE0Zk1PL1dzQlMzS0V5ZVEwZ0UrZ0ZFSXdDbXBBT1N1RCtxMFVKUkVQRUNzQkZFSUI3dHQwT1RQR1VjVnVrSVhTb3YxSXRZSXV3S1Zoenl3QzZLblFyUWlaVnMzV2Q5S0tEYm5BY1JUSGo2MEE3bld4QnBhQWtxTGNWdmhhWUx2d0pzQ2xRa2wyWCtySWVIMnBwem1YTDFVcTgvbFNvNkpZV3FIZ2ZVbFJXZ3ZsQlFRS3k1cExoWUt5WXlUNDhhVml0dkJ4ZktXRmhVdmF0YTMvaUVPREZnTjZaRWlRVW9ROUFmaDNZM3ZZamlXSzA5RktxWWFZUlQ3SXdpMm1vNzlEeW4wdHNJNWpLSlpTNm1rOVRMbWprazFxMVppTTM1QklrQUZKZnFFQVh3U2JVbW1KbEpxK29FU0VXSkhxckN6MFBZMXZyL0Q0L2p5Q2tiSHBvNVVJV1lVdi9wM1pNS2lrUzZyQzdQaXg2c1BlWlZ3Y0lya2RJdEd5a0Vic2ZieWJ1RHhpZWlRSkxhQlZheVBTdnBoU0tZRWdLY2xsMDZHUVNnWng2bVVHYWVGSjA4Q3hpdnlpU0hKQUpwUUtZSklHL3V0TGFMMis0aUtBTDBLbHg0YVBnVmNTa2s3eCtsUFJ1a3ZoZklOKzFtemRYS0pkZnRKTUplb0JRalVZNWVqWml0R1c5eVd5Vm9LMEhTTnA5WWpiQkVTZFpvVGRIUmxCbDA1QlU3UHpHNU5YbzhtdHF6WlVaM0pxRXJKQ2sxMW03S3d5d3lzbFpCYVV5U2phY1F2ZGNISzAyWmxoWlRXYm1aVXcwbHIwVktaTG01YVl0SGkwVXlPVEV1a2x5VkUwU2FHZEdCaXFUemJGTnduK0hTWHhYcnM0cnlTV0cySXcwV1RzS0RjVDZSNUVPR0RDYlNnSnMwN0kxdGhRNjAzdzlwOGhBZ2NsQTdZRldTcC9CdHlGcWNzRVh4RkhHeTVQUTVjaHJpUFF3ZGR2RGh6WXMyRm5hWXAwVmxyWTZvMmczUEM5enE2RktNdHVzSndhQ2V3cjhkdWJDOFIxMGdqYWFlSUZuZzJvTklBTmovQThiQ09aWTE4c09SMWdQRUJnTHVBVTVTa2U0MzNKbitLWVdVWU4rNWhEQXdUWlVuRUFDaDdpZWVPTmFBNTljYURGcUR1SDhSZCtNbVUzeW01eGJBVCs1Qjd3dFJFbEFmOTVadUJjanhpbW16MUppQjltdnIxL0R5dDdSdmhVa2w4dG1BbVBFVWtuSVp0YXpYdXZpNDFmQThyWEVpNXdnaE85d3RobzJWRUZvOTBLcE9aNlVjRmFvT1NINVMvOE9QekczbFVMQUE9PSkgZm9ybWF0KCd3b2ZmMicpO1xcbiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2O1xcbn1cXG4vKiBvcGVuLXNhbnMtZ3JlZWstZXh0LTcwMC1ub3JtYWwqL1xcbkBmb250LWZhY2Uge1xcbiAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgZm9udC1kaXNwbGF5OiBzd2FwO1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIHNyYzogdXJsKGRhdGE6Zm9udC93b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBQTVjQUJJQUFBQUFHc2dBQUEzNEFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR2pJYmdTNGNQQVpnUDFOVVFWUmFBRHdJZ1h3Sm54UVJFQXFDTElJbkN3b0FBVFlDSkFNUUJDQUZoR0FISUF5Rkh4dUJHU01EdFVTdVppVDR5d0xiZVEwV2ZIQ0QyN29iRjFyUDduTHJxZGNwSE1TbEV2dG1oRFFSekY0UjRVZFErcEVrTlJKRDUyU0VFWkxNd3ZPRVcvYitaRElST0tEbW5DalY3UFpFVXhmdU5oVlhLa2JGalQwM0ExRzhWQ1pDQTZCLzRJV0F6Z2t0OGo1NmxTUURsQTNPS2RraFpFc0h6T2QyakdtSHBINmhiK1NWdnRUMTlhZjIvT04wVHVvcWZWWUp6TGd4RjZFbnJjSFFBY0RpOTZhYXBGdWx2VDFJR2J4Smg3Um50eUtxcHFqRkFiZ3BnQ2pKMmNNdDlieCtrOXZsSTVYT3JlYUhGdWVoenZmWGs1MDBMdEdPT0l5MGRWbTdMTkhaU254U25LZm9vVndtdTJ3WEVLWXVJekI4b0ltbVA4SDJiUk5KMUNZaEEzN3hyZXJWRmRpMlhBMnNXU2lsa0VNMFhkUFhyWXVnU0FCVWRlVnloV0R4M2xCVnBlUkl0QXIreC9oY1NYZnNscTA3OWlROWVPYWtNYVNIVHhvNm12U0lvWU1ta1I0emNNbzQwbWlBWWxHQW9CS2NRMkxzNk5sTVpZMUM0c0I4REpkWnZVeHdFUUxpQ0ZkU0VVVXlzNksvdDIvSGtCTGx6MlVjemVlQmRYTmMxeUNxUlBlelhLejZtYVpaVDNxMWU1bDdtWHRaNmJJZHdJdTFYcS91eFFhN1JEOEg3SkJEcFM4UDFBYjRWRUxldTAyWExtMWtYNzFPOWQ1M1YvOTNETnovMVVxUXZjNlh0N1Z2QjVLVTFJMTBxOHJTKzlSSFRSOHlaWVFJVEI4K1lvcUEvSXZIU0cyaVJNWHJnNUthRENIdzlZaFI5d0lXQ2lWMWdON1pDaUlva1h0ckxtRW1GbFNPV0hQQUYzNTQyNGNYMnVjeGxZblp0MU5WYk9qdVpDaytraWZQL1g5Qy81OVRGUy83Z1dOTzJLSjZIN0dRVGxKNkludXRkVHo1N1o5a0xIazdqR2FObldaeHlPcGN6V0k3SEpEM1BVdk1rTFlzTVlzZDlqamhGaS9wSmRiWmJtL0xIbGZveDBlYzhzamhhS0ZYbEdrRFFQdlcyODdpb0pQT1dtU1ZiYm1haWVRc3MzWnRmdGhjbGxwcHMrcjVaM3pQRE9heDNNYTBaU1k1L20vYlpJZWo4N0ExeS9hcFhMeFM3YkdPaHUyM2I5dTZaZG5TSllzWExWeVFtejl2N3B6WnMyYk9tRDVOY0RvZTlydnRacjFhTHVZVWlXYlR5WGcwSFBSNzNVNjcxV3pVYTlWS3VVamdYNThmNzIrdkw0VzhFZm9lMmNaNkxZMnh4alZmenpicXRTVDZ6Uis5V1E4SHd4U29mZ3U2R0VJNHNMbzN0SGxEYWUwVWE0UlE1dUtpTUpWSGc5QzFLR2tiVkZ6ZHJ6ZmkzcUN3bE1zZDQ4bEJZNlhBTlIxZ2hLSURxbGdXSzJidHVIQlhxOU5EclpsMVdyOHJFeURrYnhyeHpIeCtxcUwwUEQwdWZqN0hybkdNUVlZMTIxa25FMTFzemNiKzJ1a1V2MXRLTFlTQ3FsUXkwU3ZMejdrU2xpa3N6TTlkdXpXZkp3S3VNNnJnNDI5VkgrVmhKUkVNZWRLM01vUGNzVkwzSGxyVzl5ck5zeWJucXZJaFlQVUxzYTdYb3NKVlROSzdiakZONzNvVXR1b2xTTi8xdEw4RVdiajJWeTdPa1RLRHVhRVRjSXE5amcxTU9xUzlvVk9iNDFRVlBuRnpqaXFubmw5V0FwMWJnM3RQVUFpMVhrREhPY0JVUWV1cEZkT0ZXdUdsdUdDdTAxdnJIaytTWUJVQUUzR0Vubld4c1h5eGRyRitzYld3dmFDaURORXYxeDMvRWlTZUpML0daVHVOSWVjTzUxVHlVdDVwVnBYSGFMaGxMNmhqTDJMZlJXRkhoNkU3Z2dZYzhGa2xtMmNMKzJzTDI2SWtEc29yY0lWNkxZOWh4L0RwWGRZZENBeEI1bm1udUI4aUlwbUhkR1J0NW5xbDNhbGQ0dzA4eTc0RFdaNHBkbkgwVUNia3NaZGQ5NlFZRkJhcFdxMGJCNjY4NjQyY2VuakNkWEIydERPdzJDbTU2YXR6R1pvbmRhSk1lVU1lRDk3Y3phV3NLYlhZeW1EMWt4QkZGYjBUUmQ5Sno1S3pLR0ZsQzM0eXUwSXp1VUwwTzAvT0hRUFZHWkFKK2I5enpqazlmU21QUENGQzJMZTNhdTRDckVUS0FacGNxYWh4cGJWN210WnJsRWQ4bVVhOTFodkU5RlBUZjJFVGtBRWsrUVl0VzNvM2xHRytYa01yMW1KeStmbU5ock1NYzlHRkM1dzg2T1hPZDBzY1ByVVZCNW9pSFVCSm9NeDNwaWhzdjh1NHNOSjY0aW1QYkV3djVKN0tvS2gwU3FLUytEbU5laTA5SVRsZytTNGxwbkxoMnJjczUxL3JWdWxrNG5reWNHbVlYeDN5bHRFYzNva2I3b2IxWlZlV1Nudk9weUNLWVJpNXFCaGFUVk9IbnMrQXVIL3MyWHBpbVUrd0dHU1dwSTZWUmVFWDM1ZVF3dTIwOUkxc2lnTTlsTS85cVhFS3NKM0dLSVV4enBqZUsrQmxRcExPK0lnN3ZoUFdnaGJGTjdtWE1pQVE1aHprQWV0dVNuYWl0SU82MU9YTUsxL2NyMGE4R09PTTYzc3dRWTZzaG1KWldlVDY1QjE1bjhLKzFzb3lPNlo1T01udzlpdjdkZkh2M29VbEcrVHdEVVB6V3BvTDU4ZyswRE51UzYxcmNlNG9ZSzVQMWV3Q1pRdklKYzlTU0s4R200OXlCTnRodk5QbE96ZkJjSmpCZk56UUNIM3dlazFJUXE5TFZjN2FWVTBncGRqQWVaWENwUE5ibFpJRVFsOXZZSE5QS2tyNlVNcnUwYzBTYUM5dnZHRk5HVFZwekhWUUxqWkRkcGgyeHhUOHdmUG8rL0hoTm82eEp2WmRmVWNqV010NDg2Y3VybTlJb0dTeFo2b2NEblpxb29HYUhwU3dDV3ZKUVdHaEkyWVFtZW1PNzBOb3RQSXluNkNPZUtSM3N1TWlVaHJRQlNNZGNIUWxiemNtZ2lzRDNUaDQ0T3B4aHNyUGhabDB5cXI0OWxXdFhZMHRXTkhFUXBDSGlpTkNPSGJrZTJQTkdTWjRMR0loTUpxSE1MQ1lVRlh4UWNJNnhqTXp6cVdoM0lCbzZZZFFNc2ZDY1hONHR5V0lxRUlucGpxbDdEU3NmSzZjM0RraVNqdllIb0VLaWRPcjRvTUUrbk94UXNSTWk2K3VUbkg5d1ZBWVVadGFSeXQzY2t0VTd1bFVEdDQ2TWkrczFxeFhWY2pDdW9IUXc4amdHbXV2eUsxMTd4TGMyWWJTSmlkTnhOTWNSQW5RdE5QT25DUU5HUnBCU21tT2YxRklhM3l3aFBxYVVja3FaSEpUU21UYld6S1l6eFkvZldDbit4WUlxcE1LTmdVODV0M2JNYzB3cU5obHRlUVdDNHhqK3RncWw5Q3dNdVVBLzVPNlE2aDBXVWx3N1RNd1lGQkNkdmcxNjNPUVh3c0tyb3BCNVdFYTJ1a28xa0xXRmtkcWVoZmFyUzFFb0s1R2p0ZTJrYjliWEJ6NzdseXBOdTU3ZVhvZlBnL2hhTXpXcDJqWkhBT0lGTWhOeE5LTWJVRlJiUHdhM0N4UTFsRi9uK0w4bmpsZ2xFTGp5bGJGNHY4WFZxSVpuUEhBdHpBVFhsQXJIVTV1eUtaSS9sYzJXWEJGY1lZNHdwM3YvdFV3NENIZmhWRVRPOFVIZm8wOUM2V09JczhiMnlXMTdOQnd5bUR4aU5hNXZnbkgxM0oxc1h2MVhTY0dOVXZ5bTg4Qm5DNi94ME9ZdkdSZWtxWU0zQWc4bTNwTjhtdHR4Q0hYdEdwN0pvNTJ0QzBIZytLeVdOWW8wQ3plWXlqZzBqc1IxbnNPbXovOWYrODVoV2FESFBzVXNMU3puc0s5LzRIZk50NzRLRG9NSzQ3WU5lODl0ajhoWWZaL0tNc2t0bDJMVXJVUW8vcm5ldXQ0ODhKTFArRUdDOTF5TXlIUnl3QXRValozWG1VdFVJdHYvMlpuSlI5Q0dmcUN6NW53NlRDOTRWdnlBMGFGNVl6U2srVGtveWppNzQyRUpXamE4QTZIRG5KWGxWOEJ4NDQyYkltcHNSaGxlNVdzMkQ3a0hwOW1GTFZpM1VvbUdFZHpoMzlhSkkvSEtuSmJDOUpoQlBVdnMzQmowTWFvZm1pZDhUWmpKc2xQSHBKVWtQeXRwaVJWb2NmZjZUakZTTk1YdHE1Qmx2cDgzY2tmS1huK1YxWExqWlhRQ0FTY3NkTHVuYVpxQjRxRGVRQVkvMFArMC91cVBBbFl4eS85d01WWDFHVlRubE5HZU9vWnVaUjgyS3kwemZ3ZzBDVEVJNUZEV3E3a2dqV1hwUElnOGtJMXNLWkRmZU5zZkhhU1loRnIyTUEyVnN0S0FuVFJpRndGWFQvWkFKWmljWFlkcWM2WHFNSHU1djRnczNOdnZ2cWhuLy80OWJkbHdUdWZ4RlorOU5hTWw5ZGVJLzNHRzM3NGRuNkhWMStkTGJlOGNWT2JVODZjYTN1Ky92b25mQU41dzVmSTdiRmJMOGc5MStwbTBudkhlMVErOFlROTZwWmJkTm0rY1kveGlVODJkVzE2MXcvZkIzZHQ2dGE4OE9uMmp1OGVuTFp3TWQyaC9idmJQei9wUExibzBMVGtuNTVLWFREa3JScVZtNXhPZHZDcmRHZzV0dlBZcSsrcGxGTXJscFJkMzZacldQcHpJL0VqeDhmdXUrRHZ4WFc0R0pIN1FSeXMvMy9zRmdLZ2VNNWgrN2s3NmlTc1NWVnRieEtaSUJNMGJuS2JwWUtFNHM3K2l4dkpsSmFHOGRxeEdEVXFWREE2SjlBb3FQbHNFRFFxcVZCQzVVY0UvMFZZTkYvNDhaL2FQM250YjI3TUJlQ3RaeC8rQStDOTZkN3RuLzk3eGR2bERrSXdLQUFFZmwwMXZDTVFsQ0xmR1R4ZjYrZDR5UFJqdWxzSDlCNUpJZDlmczE1VittT2pTTkdJSFZEM0p4ZGhUZUlFWnhRTjdhMytwekJVcU1pcG9RcVgrNGRhTk9ieG9acmEvRDdVcHFaVVpLWllmMGlDVW1rOWxrQmNaZzBWZkZsNmdJblRrSnBvY1IzVjV1SXVxdE43LzJPMEFNakcxczBlQlNFZFlkeWNvc1ZVRWphMXVLMmxOZG15SWRIQklhSnJOK2E1R3U5c3lza1NtYWs5VGhxOThrVmIxNFk1Vkl4UVNJNHZIYkViTDduU2NrdWJ1WFJwYXVhTXVIWjA0QkN4bzhQOGNLWnNLQTF2dmpUaFllY1VCa1lVNEZSd2hGMTFYcmV4M2RkVndWQnRZaVdLeXVrQUxNYWUraFVWaS9uMGd6R3RhbHVSc3Z1MFMzWmgrNndETHU5RG5TclVVOTFSRTRyVUY5cXVESnYwbW5ETFpmcFlpVFNNMy93TVRLdTQzUmVFdlVkdjM2MTVEdUtjWHRyeC9YTzQvKzF2ejl2ZEkyd2YydVlhWVgzMFdCMTZlV2JlNHZUbSt3alVpaURYTzZCMXoyek5NZDA4UGRuZVNJdzNuTkhTODRhTEhzeXMrM1BYNjgySjd1eUhuWWwxZTBTODFwaG9qb2pHSUluNjhLczIrTHFhMkt0RVhZNDlyeFJIS0ladlJDRGNlbDllZnpydGZWajlidjBSM215U1YrTzlhRjFRNHVXVnpxazNSc2pLWHhrNVFwcC9LWFFTeEV0Z2lUaUdpQ2xKUnhVMFFnVHNDWU03aGdCT0lQbjdlM2c5VHNMbHRFQ1QwZjROakVLNXRPUGxOcWpYSmRHeDZxcGpaQzZva1VLb2x0SlVFSUhCSkJCSVJKMWVBcUJDVEFNaW10d3RoZTB5S0FxMGErWVVIWmswRHZ4MzQ3dWFxWml0MENTVnJSaWxvbk9DZU5ZT2REWWU2U2lwNStzZnRKVXNzcjVZNEdlZHdHU2xQOWxFNUVjbWVzSDhZQlRSZU9aejFnL29GT0lGYnRZS1ZOYU5WSlJVODlVUHlrcGhoYUV0ZDhxNlFzOU1oenVkWXFsWDhMcjJMc2p5d29VOXBEOHg3TmFyWUpZWHlQYnFYVll1c2laYXNubzFkWnAzS0t6clVYYXpCWFdhUitWS3RlaFdWcTZ0TlZIenlXVElaREtUSjVQcE0yU0EwQWFUQTBXUTlQdGlCZE9VR1FRRVFLV1k3WDRsNWp2dnhGNVdCd0FBQUE9PSkgZm9ybWF0KCd3b2ZmMicpO1xcbiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7XFxufVxcbi8qIG9wZW4tc2Fucy1ncmVlay03MDAtbm9ybWFsKi9cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGZvbnQtZGlzcGxheTogc3dhcDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBzcmM6IHVybChkYXRhOmZvbnQvd29mZjI7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R01nQUJBQUFBQUNKRUFCSUFBQUFBUGp3QUFDSGdBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdsZ2JoU1FjZ1JvR1lEOVRWRUZVV2dCY0NJRjhDWjhVRVJBS3YxQzJhQXVCU0FBQk5nSWtBNE1NQkNBRmhHQUhJQXlGSHh2WU54WHMySXVBOHdDVXVqTi9CY0gvSHhJNGtTSGdIN3BPalFRUllXMFJOaTNpb0IxYmpYYXNsNHA0cjk0d09tKzlObi8zZmlKQ3dISHkxbzlxRTNpQ3JUZU0rQUVJQjBTRXh3MWZXc09MM2RPMDJNVSt2NDczTjdNNjR6d2U0cElQNlJVUFJsZlZDRWxtZWZqLy9YcmQ1MXlZQ1gyY2NFa0Jrd0lHaFdBTU8wQUZNcjdncW9CMVZsUWExM2NIYUpzZHFYTStObEZuWVRTQ1RBUXhNTEVCc1JCdGpBUVpvbUpnNWF5VnVsSVgrWk94NmxKWDVkei96Zlh2SGNnQUpwUHdabWNmY1JhSzZISC9PVnRBNGNhM3JLdnNCeEt1aW9TcDhFL0lkNllyWjJiUjhKSkR2QzluTndDMGtwL1k5OEFIQVFJSHlNRXlUZWwwVWZybWpGcmJmR3JrUkNwNFNYeklXTElzVm85Wk9VbXZ5US9RZjIrYlg0SzAvY21Fcm9rY1haR3ZVbGtUNkZ6SzJ4dXNpMEM3SmhIZ2Y5WXl1MDNZenNsVkNuelZEMnRtendZY1FOUEFlcVdlQlduSXRlY0FIL0huZG5rS3RvK2gvelZWVitBZzJTZkpqYW11aFNsMW1FcmZuR0hPc2h3K0NONEJPRnE0bytUSDQ2bVJkS0ZjU1ZNdXBLdXNGTmMrbFdGS0xaUXNwMVRhNlgwWW5TMWIrcFExdzdTWE1SbjJ2SWJtQVk3UFQ2bGhTVzMzTm1ZMVVXeFg4VmpBTEZJaW9QM2FmKzhwcENXY09GY3FuMW13QUxQdDFnMnhBMjZLN0dZWE9SSWpjcVlVY1NkZ1NGQ0lob0FWRVd5Q2xSQkNYMnhNVmcrQ3VQVHlTQ0ZnZWI5S1ZqU05mbGlXVXpqNmtaeE0yZWduTWlwS1ZnR0hxd2dtNFFQNkVsYXFpb3FFZWJEWkFqdlB4ZmNYUW5XNjF3VUlqQmdSY2hBSTJzakdia2p5cTJUQ3NlY0dWNXNlZzFaWWJkSVdPKzF4eUFublhISExWdzhDOEs4M1puMmw3YmVPREFwWXNxMlRCNE1kR0JZdFRFN1BMUnFXVmRhT05IWDBEUXRmM05vTjI3VDdqcHk2Y08zT294ZnZQaDZBZ1RtUW5HNDZrQ0lFTW1kc1NWWkFacHdlSGJ5dU5mTTRCYktEakpDMUpNOFFKNHN4a0l2cUpLaEFEZUVaN2swNXAxWUFTU2Q4VlljbDVjYVdaR2tBbDRMeVptS0k5SFlKYVRUMk5BWXZtNjFkQzBhTjZEcW9RbVNrbWpTcVBXQ29tb0lYVVhZck1tNWtabU8rbXhzemNMK2J4ZlFNMUJnUWU2TzFxVGdia3RFbHVadWFSYzNJRWJpQ1UyR2wwWlZhMXE1dXVxMTZ4MXZJaUJOeElrNUQzZUpjUlY1MFRXd1lZSHlWTUFlN2libTRkc2dubnM0cUFsQkZhQTdRQVNnYk45R2xlUDdsTGFudWtTWkRKb2pxTUhSK2hPQjFTUjZBb0oxU0x3SzhLenJKVCtLWi9iamJ2dTRMdXVMcW1GREk2dEpVYnMyNy85OFFNSit5RXhBZkFhaFhOaDNBWWVERUluTkZMWVFYT3hiMHVRY3E4aUFRd0hNUDUxVlVGZjgvbG9RUWlZZHJ5TTJ5REx6c3VETFJvUWU2S0gxcUJnbkFCSlMyQnhWaUJPNUt0UlQ1d0wxMGxLNnlwbHdxMThxdHpIcmxiWGxxVDFsWHJ2NVVmWHIxNk5hcExRaXVvaThzYkRyb3pxLzhESHZqSGNocE1UTnRHL08yc0pESzN3TjhhcE5oRnBta0VadWh1TndxdlRZYVgvd1p4VHFzVUtqSFNsWEdkWWVQSml1czFXRldzOG9JMDZ6S0NtTTJtYkpTM0t6UGNxdFN3VVk3OG5CeGdNWDJLaHFySURyOUFiaFVxUG5CMTlsc3UwWmRsb1dQY3ZWYTlWcHBnbHFMVGtPeWw5OW1WcVZhYlFZaWpFbzlCcTZtYzJsOVAxYXFtZ0d3R043UXNiTCtRdDd5ZXVsd2EwdHpVNk9tb2I2dVZsMVRYYVdxVkM1V1ZNaGw1V1dsSmNWRmhRWDVlYjBkSHVhejZXUWMvS3VYTDU2UGNtZWYzVDhkRG5wM3R6ZlhWOTFPdTlWc2ZQaE90ckcrTjQxUm1IRjF0ckd2bEVRVm5UbWJwU1NGektDVTd3ZWpodUI3Vm5mN3RsNVRXanZGR2g3YzF2c0x3bFJhQXh5WEVrbmFoeHpyVk4wQmQzdTVwYnJVZ1JwYkRLVTJydmtBd3lVcFVOWUQ5SmkrYVVONmJVYjZOZ0dqSDZCZkpzQ1lsQmNqTUd2bnZJcDQ0OFZGOXNzc1JvMWpOQTFydHJOTVdkU3cxVG4wVldGSTNGOUtUVkJHUlFKanZuVHlqQXVFc3R6QzFPZXVsY29CV2ZBOUJnVWM0eTlsYjhuRHRJZ2dMWS92ckhSV1dHY2xqL1F0RDl4UTBwbHFjcTVvSHgzTFdsbVhTNUdnRWxQOGFUejY5RXVlMnlLQlFQOWZhdlpYUXNwOHhjWHQzVEtSSWU4WUJBeHVHbVpLTXBnTzlnM2Q1VlRoVjhndmlpc1l5N1VLaEZlaTBhT0pVRWR1NHRCd05JQ3BqaE5QRWZNNjdSWkc5VHV4TnBLU1J5QUVkREhPajdCQUwzV3hJZnlhWC9kYjFFR2JJcXJFcjZYcWY0UWtRUGpOWUFmcXFDRDlybjlZL00wa1ZXRXgwWC9DQmVoSXdWNGFDVFlkMFhGRExBRmJURWF5OWphM3Y4V3dqWnNFR3BRVjdqSEtwWHFrRWNQcjIrSXBrRlVSWnIxVGZCc3hRWlNGSDFpVGpGZmFqZHJWZHNBbU8wdXlQRlBzNHVyVmNyY2VrNlRhbGF5WGJ6bjIyak0yVnB3M3N2Wmd4YVU0TzZJeU1OdWVjTU43TXd4dVI5SFdVcE43S2s0elJjOFdVZGFRbnMwaFEvR0pZRzBrWmlOeW01NGxaeEZKeGxXWXppcUkwZ3JpZ3ZQazNKQkl0UUhYWnY4N3JuT2Q5bDlMaThkRThIZjJRYzFkZ0duQmN3QlBLeXB5cUdqdDl0TnlpZW9SUmt5dFhPcjJvcjgxZHlOcklKeE1VbmJSb2lVWEpxRmVxYVlWYXhseWZOcFZjNFpPblhUbDQ4SUh6YnBqNHdwVzg5MGNhQm9vNzRGYkF1Ujg1dWU1NlFjWjVsYmlpenpsZ1kzK1FobzBDWW9tVHNuc0pQTmR0WElwSFZHeXhmSWx4Wm1rb3gvWXlmeE56OExBMlBOWWNXeVllcmZOQnhEemNLL0M1NDViSmhMc2xnR3VUNFBRZDBKZGgyVjlxMm5xMW80UFk5ZkhYUng4WGN3Um1IWFNJY2taYVQzU1FvOWpTSFdGRGIwcUcvMHBIdHcrWWN4MzVHQWpqZXNLTjUwWk9sQkEwU1F4Q1IveEd6WUticUttRUNmcG9oVk9LU20zSUZWd1owMnlZNlVkdUh1WE9iTHhyRUpsMitQUnVHM0dIb0FKV0xNYVpLZFZqbUtNdkNQdlRUU3V0WnF4U05NOHJESTRmOTI3dU5KM3VZMCtDSkx2OEdIMktHV2dhblloTldNdGdrNjUvTUlDUVFndjFnSGtGckJKeXJTc2NOWVFqYVV5Z25DUXJ2MFd1b3E3aHNNTXB1N1hNUUEycU4rVkxJSFZ2S3F6ZGc3YUlLZVF3R3hCTUg1ejVoTkpHNFJGYnlEc25xd3N6U21aZVlURkxISHJ5YjFleXBveWF0Q2M2NkJFU0lac2czYkhFTHZEbEpiWllmeEdEcmRNWEZ5MW1oaTAzREYzTlFxM0tnRW1MTWFHS2xVZzRkd3pBbHAzNElJa3BIQWl2eWcrWXo3WU1OMzJlZVI5cmF6a0NGUXJFdnhadHNkd2xZYmZEeUFkWitnNGJhSzVjeVY1RXFNQWFYM2JnTC91QUFNRlRDdHVHMlQweTNOVHhOeDdFNEVTWENZSVlZaUV2eGx5TzR1dGdTeE1CQTJ5OElIN0JhcG9IL25Jb3U4WmZPZkNVTm9oR0RJWFNtcVlPRHh1WDZjRUVEWnZSS285bFY1cUZSWlNFUVFNbjlwV1lnYnNMSVpGKzBnR1djMDdRTFF6KytQaDVNY1BYVUpYM2FseFl1VWlENGdtUjBpVDNwY09QYkpiTXF4WGxZcXBaeURrUmxveHVqOW0xKzFjRWxUWWdOSUdKdzBJVmdGckUwRGFTdDkwSlFaWU5ZaUdwaFg4SzBHcTA0TVdCU3RHUWxYaDJsT3BJTnZlS2xzOHR2anBPM2J4blFXY1ZDY2VTSW9NU2xoaStmaU1LcW5aNVUxTGJ1MVlodnRrYnBVVFlLRE41Sk9qT1VkbFZHcE1zMVNRVURZS2traUNBTEQ5TmVORFVHcW5TS3VJbHdHd1Mra2czTnFUdXpoVFlRZjhyYnZnUVhRNEZIQzBmU25QdUhSYzNEbW9RZXoyN09JM0VOcERLQTVrV1k2Y2x4RWZ4a0pRV3NOYWYyZ25sSWptejdPYkRwRmwxTjlybko1amhhUlNhT2pDb3YyUFBqUGl5YUFJci9UZ3c3Z1Z0a21oRUs3S1JsLzRsMnhBN0VCUlJESHd2UzkvMncwS29Oak1vR1llRmQ3eFhiYk1wVG9pdmR6UUxtMWFkZ2dkWldEMktLOFp0d2tsYXpudEhLNmNJUkIxU0JsOURBQmIvQWpnazArWng0UlpVVHdWZUdYS0pTbDFCMktiYTFxMVhmSEZidDRXUWNuM3hhSXdRNVI5alJFaExvT1ZzTklUQ1B2ZC8xZlBQcmhOa0NIMkFhYnQySWUrL21SNE9jZHQxRHQwdWY3cTVzdkkwSDRIR1F2K1I4NFkwODNwdmxRcEJLOXNxN2ZlTVo5NDVYZUxMTjY5THdoWE4vUTZnR2RwNnRlOUxEQU5TdEdEblhhQmxBMVZobHV4N3pQT2Z2VzcvUy9KZ3cxeXl4bWxKOG1KK2w3RGY5d29zQVJ1clZwNTZJRDFvdjEydkxiWXU2QnM5b3VHWWt5MjU3SG1rcFhBQmo2bW1XTVU2NnlwSGRLaHFVQ2ZMV1dKaHlncXRxZ2NISUM3SDh5Y2pTbzJxdjFONjRELzdCa215VTRsTUMzZ0tuK3BjMUpVd0JKL3BmVWloakhQclY4RG5rWERiem9wRFpQcEQxWEpleXV3UVFqUlFmaDBza2ZSTkVOYnRtWUZpbitBVk5nbzJwdkhWUHNmK2hZOVlaSTU4bWkxRzc4Q2E4L0hlWUh4U2FWTmNpY0JhVUJVNHhTS1pVSG1XTE5MbWhkZk9TMlFJMGY5TERCajRLVUJBUUVCQ2l6d3UwRThjSTAvTVArU3Z3ZllyNGVwUG14QWY2S1A1ckkvZnUreUo2QWE0YjVrK3lkM0pXQzV4Q1Z5TG9PaTl6TVV2VGp1dy9ZRHVGaWZOeHpGb2JjZEc4TjhuN3NnZENtVk1kUjNWZkJXQ1NOVjhNYkUwaHBqR05NMGVFOHBGV1V2WlR4ekozM1hIZnZyaTg1eFh0eUVOL3ZHbmdiZmROR2M3cTNlTUhIc1QydXBaTnh5elgyU0FzeFQwMkt0RUZBNEs0djNLZGRoRDRKV2hTaldOcmV1UUNmaEFEY0daeHB5MzlRVlk0cFVXZlZkTlYzQnhrU1RCQUVwanFCcUNxQlE0cXJnS0J5NUthVVBmTjRERzBTaWNZYnRaVWdhNlF5ckFxcnJmRWRtSXpoUVdHYzR1YUZXVXhXWWpjRWY1clc1YjlRdC83bmZmTFd6WG11MkZ0ZWhibVllQWd3eUNCaGI5NnNZTGFocWkwTUJ5RTBURUZJSlNLZEVNaTBTeUYvZVZrRE5pS1pyRkRXNUtkdmpHTnJUa0tadXlZYnRoazNPOFdEVEhHMVpJeXZCR0RQWkJSdXBBV3pucWs4b1Rnc1pxMW5GMmlUVTZ4SVVDT2tBT3ZIN0h0V0FkTCtIb0tNZ3kxMDZralBvajJhcXVSMzFzWStucnVPeVB6V1V0QmdnT3FRSk91WGJsR3V4QlVHelVpUWFkWkl6MzRITXJtWDgzRzFBTGpmT0RJMlRER3FNWTFNSENyUVlwK2w2MmhoNHlvMm9TK1ROaFlRa2JFTHk0dWcyb2xBNkhvb3RLZ1VJeUd1ZWtWYnlUUktsQklZU3lGMWFGdEpUT2lvaVhidU1ucG1XdEFEZ09GbTJtWVJRdVRWL2tlOUZ1UDgzUEg1aGhwZmwxWVg3TlBoKzkrVjdFQkRLQnU3Zk1HVEwrUVR6WkxJekNOQmZqYkFxZ1ZHOVlxb0M2RHB2T08rUUw3a3lXeGlWK0doSEllSmczc3FJb292clFYdStXeW9wUVorR3Z0UXM1T2JRTG9zK2FiMFRmZWRKUlBiRzhKQlU1NE5pQk04aWEzcE5XNnhDNkY1NVB2YUszTWxDaDhmbW5idGJabExGa2VmcVFCc0xZaEFBaXkzVVVKQ1JWRUM0RUhDRGI0QmRrR1ZyUm5tTmRxMGRiSCtMZ0NYTFc2S0xuREN5NnRwR2todlVzMUdPWmdnRnIyNzArUGQ1d0VKdE9OeDVlYkw0WmsrMnZMRHYxeXplcDB0cjhld0FCaFdpS052SnNEWFArenNWMmZoRmg1TG9FNVN1WjEwcG1FRmdMQ3JGYjlrcDIxeU04OUIzVDBJdlJsV0lRSlJScXlsaFNqYjhGTkNtWjdLOWV5VlJzTnRXV3VpQjBOMDU2M3RHdUJkeVlydDBDMXlrL0g4ZUorQ0gxYzhYWFk3ZHM4Y2dvT1Jtc1FyVVduQkRDUVRjNDV2QzBmeDNQUnBSS2ZWdzA5b2ovdEVsa0wxcXgzUFpXeDV5MnROb0VJbWlzL2U4SnE2d1hBS3dPUGNsdytoMW8yT1d6YVlJVjN4c1ZOVlNBSGQ3SUc2MFBVMjI0Z0lSUkdDTTd5Zlh0MGMvbjliNzVJUnRYUVBuRlV1K0pXVi96Y3ozRTRBaGNUdHBkNFAyREx1Q0p4V1M2R0YrU0E2OHZFNHp3OG0yNnc1LzlKbmR6cTdFa3lHQml3SEt6RllkQ3RSeUdsMXcwazZwT0E1MmFpNVZsQloyMmNVYitScm80d1BFWVkrK25ndVhyNXZPcDAyWnhLUEtpK3RuVFpxU1p5TWZMV2xlenFXWm5TYmNtVkhkblNvdE9XL2pKTlZwNFk3YTJ1Nllyay9NYTh2OUZEVHJUdHM2cjdza29EZG54WWNhR29TaEZHRWhIZkxtaG9NZnN5ZHR6TExrMmxhcFVDQ3NDbXRleDFLZjZ5b3VUR0c0eDVXNVpvRlFIb0RROGViTkF6N01mMUNaNDBUcGdKZVNxMlNvS3pKOHViNWV1RDBTU3Fjd2pBY0FYeXZWcEJwZ3puajBIU3YrWGVmSHhMOHRlQnMwdkhvQlZuOWNiMi9FQm90SSthVEZ1QVNKL2lxWmxONm5sVFlZUHFXM0Zyc0FNNmdpaXZzQXovNEVmd0VzQ05HSjZJQUc3ekI2VjYzMjJsQTlDQmZSREcrR0JHb3hHSW5zNFVhQithYlRpSUtwS1c3Tk5Rc3NOajBmalBYYSsySFdjKzlnWE9DT0Y4c2pINnhickdtQ0tyd0h5MTl0MWp2Wk9MN1lPQXRqaDEwNkF1enp6WFRtTmszcjNlalZ6ZnBrLzc2Ty9lM2VtWnRRNXhxY0VWV2t6TU5NTTdUZDBGaG90MWw4T3BBcGNCQTRSTDc0ZFBLNHlPYy8rbi9SNTI3ZzdiK0lQWktpeVFJMWsrNU9GclRHWXNyOXp6cGZuOWtFdERuamZIejJNaTVjUSszaTNlNFpQQk5SdS9oRVJOOWc5TzJ1ZlkyUUw4MGJSejgzZDBBOFl2ZVZ1QS9sUlBEanNpUGNoa3BLM2Zwend2bXFvZ2xqRTRVNk5OYlBoeW53QytVS0FwZytzUUg5Z1VxRXpSUWlJV0wvVGFCNFRSTEphNmNoby9XaEVTa1VsbSttMjIra0xVd0VUYWY0VTRIT28zWlhKcWdrS1hsQzUzRWx5aXBLSzluOTc3OG9abTdzU1lxbFNxZ1VRNGpLR2U0VUpPQXhpd2xrODd2Z0ZDWVpuV0dTR2tMQUNwbEticTJkUDRxbTA1cXptVG5CQmNKMi9IcHNnVmx4eEp2dHpIQy9VRzU0QU5NbkpJQWJHdUtYNXMwcjQza0IzdXhTakhGd3NBNm9Yd08xbzd3b0J3ak5oanV1N2lUc01pQnA5LzM1RjkzRW1zVXNYTWgvcjlGeE1YLys0cmkwM0huOWVkYVI5Z1g4b25GMGlnNjAwREZOekVxN3dHcXlKamVmcENHcHVrMEV4VXdRb1RQakF6TkdXcXZtZjg3VDEvck5qOHh2Uzl6OFYrMmx4V3VObzcvZVduRHUzTXp6K1QxMjRSQWVYSER5MklPRklZaHVSTWhWb0tmZnlmUGFXUVJodWZwelQ2cmY0Y0UxdjNMMndwNWluaDZBL2M3dFgrdDdPS1V3NlBDeTRSOUpPK0hheVNiRVNBeFhJeFR6MnNkaXFoSG92UHdheEdnTXIxMHM1R3BHWXF6eWMzU1Ayd0l2RExYOUN0cXRSV3YzL3c0WmFPZWNhM3h1L2JneXFtN01vMG9mclYrNjJrMmtybndPZWdyUEt6YWtKZTlyWCt4eFVqNlN6Y0RVd2VWcFBqMjdvdDYyNzl0b3VtanByVnRZODBhei9lM1JiM3FuTWxpTDRZMllYTHBpakhwRzBaYThONThCRFEwTm52K2pRWlU4RW1aeW5Yc2dKWWJyc3JhMEZPZHZuUnd2bkREOWZPS1REWUg4MC82R2NxbUFLakRTV1BGcjU5NWI5cUMzcG5nSEcxdWpSSmtmaC80b01WSjFxTFhFNG1GaVJJMkx2WE11T1BCY3BObldPTGhzYXljYXVkWDgxTzU5dlpYbjd1Y1BabzJEanpCVW9OTW51aTUveXVpWllXZTdzTXJ5a0dBWGhWbGZYVk1xRE01VU9JYUZmZllxekttUVpNZ2tqbUZhQ2U1R0pCam52QnU5TFpqTHhHMTJQVVFRNE1mNXZ1dW1LWTVEVm0wQ3BCdGVhZDluRWJEdWo0WHpLN0RyT3F2SXMvSldzdk9XUllseEFTd0hXM1pRVldTS1c1WHY2SERFVk9IdTF2ZmZ5aVpHUGhWMFhPanZrUjdZV1ZFTTNpN0tEcWlKSFBvNWFpQkhsaWlqK1oxRi9yVGNiSjh3bnBUTlVJb0tpcGNRNlpvZDF6ZmsxNU8zdUZKQ0ZXQ0crbzVYTVBnMTB2cStZN3NWWk9kdzlXQlZGZHFnQUp2ZmxGM1lXUGVRMlZMeDFqV2Vrdm9nbkRUaUlTMHJvVElDbXhrOW9KOGxKVW0weXpPRWxzMHRkc2l3TmgyTEpFYjkxNFk5VVpxL3I3VXhlV2JzM29VenN0Um1vVjQ4RkcvOVdLUTdOL25CU0hISGRsTmdGamREN1JSdm9zSjA4MWlaQktwV1h2bS9NRlBiZDVLcXFoU3BVbFB6aFU3alNoUlY4dGFoeDRSWkVLcXhJb1JuSVg4VlpjNGNQR0dxUDY3NFZaQTVjK0NZeVgrcnJMN29Lb3Bld2Q2ZWhiM0tmNnZYcEpKTG4razlQWVY4V3ZBTVJ6S1hBUDVoSERZdDFXeisrYzAyWW16ZXBILzY2ajVBMHljTldsbW5PT1ZuTVBuRUJQcWM3ZVJYckdaQ1VMRGFvZHhrQUU0V2VvbFNTVVplWnRNLy9nYnI0UVVsaTBKenNkdzBveDNtL3V4WDhjaVhEbXJxeFJkazRBRUo4MjdoR0U2SUZWVHJSK1dtZlhIeVBFWi9HRkYxS0duelpsT0xsRjNKb1QyMWVRSkxneURqakVCYWRuQTRXMW9ibW9YNVhJWVF3MHpSajIydlJRaUdRUVdISy9FWHlaTFhURjdiSU85akJCYnhFN21KYW9mY2JKK1QzbjhqaGZuYktISCs5MjM5VFMvZjk2cXk5T3VlV0xFbGtLK2dLdDQyL3A5eisrMDB3ek9PRko3cHZyY01lcm1sSjJhSlU3bHB0TUhLQUJ5TnRLY0dNdE82Y2VtNzFoWW9hckNrYUdDVC9pYTVFMXVXdVhMblZPWUtrb05XTHRZNXhsRVNYa2NRMjIzOWFzdVBIeGVIcE5lNkNrMVYyTzVvbHRRdlJYVElNNXdtNWNvZHBEWm1mWkZnRkNyWGJHMUV1WXkxUFBON0IvYVB3cHpYY0w5TC9maTdSanYrcmE3dHo5NUx5K2J3OHVPK2o0bmhVZm5ucVpZaDZSNjkwaGlodW1SZE01L1k2RjNTNExtaWV6bkdIeTU1MlUxWXF0R2VFclBaSWEzL3VRbTR1dTA1bUQ2VE00ODdrejRNcG5zVzlPZlZ5NVRLN1RlYjdkNkRMVFIwSW1tTjBYaDZJTmJWMk54VzhhQTNPbDk0cFRVL3RLVXFqSWVDbjN4NmJ0dlFMVTNGbHcySDEwT01Pa2RSVHdoUFJrM21hcFpNNzkxZVM2WmI1akw5b2pPUVl2MjJETjVxYWFKMWYweUNsUkc4T0VQQmlsUmJab2MvUUUvVFR2MDZkbzk5ckltQ2Z2bDlkcHZJS0NCWkhaRFFBS1pMZzVrRndXQ1dvamtOSHhuSmNEYy9qZis2UDlIVTJnOXBDalJta1VGbktIZW92dFVGYWQxTnNPK2xJTnV1cnBwSEtTZjE3eEh1YlVRZ1pZUGZMOUpzV0JXTXpqcHVvUjdRV0ZicDR4SzdET29VWmwvSlJQYmYwNzNEbXVFeVNycUJYZnBRV2VQUW1kNnN2eE1sbUgwZVUzWVpGTDhXdHNXeW9aUjlVazRRazFBYWE0K3pqeVdXQmpOOWc0VkMrNkdNcFN5OGY0dk5WZmNQNjhvQTIwNEtXNWJIWGpOVjk3OXNJTEdNT2ptL2VvNStLUG0vZVJNalRVSlIrTmtnUWhDQlJNY3RSQXp0VGNTdU5jTzBsQ1JwYXFJVE1rRXYyZDB2UGxtYTBaRHRmMzFjM3hYL0QxT2JXcTlVcENXUDdwTU12ZlFKb1htendnczNCL1ZCRnZEZDY0TVM0bDNkN0s4THdTRGZKblkxczNETDgyQ09tT2p2RUdsSWV0bWZhQUU2QjhmeWFrVHJoTHVza3B6cDdtUjVheXloUml0NUNYVWhOQmhwQWlheTNweXVIdFlzalhvVUpYMDQvK1NwNlk4QXg0Y2lOaENSZFZ0eklqKytUSGNsMUtMVW5LR1VKVkl4dDZHeUhkdisrbWxMVS9yNmZZMXFDUTJ1eGpsblN4b2loTU9PWmFWdUFhVThLOXJvbHhMUnpIb0h6TnozdVFpZWlYZkJZSFR1U1BuRGI2bHFlaEJnTzJpdzY1cXpMRkxFeElRdXFKN2Jtb3dtZjc1N1NHYW1HV1k1MlNpdCtaQ1dVRHZRb3dBemk0azJWcWNlRUpRejJZUGJTNDlBS3Q4UVluYWsvU2ZZTVhnRmRRSXFHc0JzREd1NzBrNElvRmg3Ni9RYmtCMUlnUlJTeVRKcHBKTVptWk1OWkNQWlJEYVRKYndsUEJ6U1UvZnE5QklUeFRwVUUyUE15WFpnY1I3ZURaUVpKOVVGR1EvaEVLQWQrUW5BZk5UbEdUVlpKMnRveFRhWmZYVzY3Ni91TElseDQrS29PcjV4bWl2eWtneG5hK29DQWQzd3ZpbGo5TnY4T1JvV0grOEJzQUMwcjlzOFJTSEY5VnF1OHVxK3l4S0FmcDNZbVAvT0g5TTlXNTk0RGRBM2VyeEJGNHdBRU5YZWFRZnN5ZFg5VFZmaXhGVDNXWGxMZXdoYVl4L1VYVE84LzR5L0wxV082ZmE2WGJTRFA4ZU8rQVVCZ0R1VlpydkpISFB6OHZPWldFOUJpUE41b044bEdob3FaZXJxeWJ4dUFKb1V5bnZIYkQzUXRWWkQ2NEdLUXhXSlMrcXlLaCtmOGZWd0Y2NlBtOVBaS2FhV1htMi9vQUg5MEhFWjMxYzlXNHNIOXVNaWRZTEw5WEwxanJVa1lFd3luRGdSdXZ4bDhlcTA0ZFJUeFV0Umx1TUk4OURDR2VCbmJ4MnF4ZUZ4VU1Pa1JCbkdTU0hSNGdMYUtFRklwdG50VWFhZklrMENFNWZ1eDNFRUMwY3oyeVJENno2dlRZMm95MUdYc00xRlpWZEZHaHRaNnRVaEVyKzZ6dk81STZuSnBBcUdYOXRMcVozQlNkc0JtcElMMnJoU2JzSzVOTTYwb0VoZG4yWU1JNUJ5ZUNjMHJxN2tsR1k0WVNIR0F4WjdMWGdlSFUvTkVhZHlpaWUrcm9tRWFiUHg5L0pGWVRRbFhTZDBRaXBWd0RvWWd3NXlpdjVIWnRTaUl1TkJzRVM0SXVROE1TcCtRUURUZXZnN3hpcXlpekhvWDVnSk43MzV2NHJpZzZDOE9zRm95aEc2Zjg5NVllaDhock1KUU90cFVoWWhtdWNFSUgzcWNxbFBad2pHY2orUU5NZzAyam5UMkpVa3R2Znh0aUNqRklRMEd4SFlrSHJPVUtNQmV4NmlTcUkxNXhLU3Z0VGFQSWVVMFQ0L3ZQcnFKdlNYeWc4UTZ0dU9wRU9sOXEyaFlmNnpkamNDNUdid3JxNlpsR0xlZXB6RXBOaEtkRGZEVGc4VlNYdmp1RmdJclpVcjFyR1p5TmdlWWN2NzkxL3BvaGg0OXZFTEZXZTBqTGhlak9qZ2dpSm5pNS9HbHk2eUFveFQ3MVF6Nkc2N1RvZ3RHeDFkWFMwQm5QYk1ZNlQrczZzRlB6Ky91SURLcHhEMzk3MU9QYUFLbWoxZXZUeEVwMUNGWXExbWlmbnBnUkl5OHhOZFBGNmRNN2h1ZE9JQSsrTlYydTdxQ3VQaVpNR1RLclJ0Mis1UE1YWGZEOE9KSVROSUJhWjhWL01GUzdsS21VOWxiUVcrZWRsaC9FR21DNEhXR2lWSDlkeW1udVdzdUZvRm0vaHF1RUJuMURieEVwbEZDZFFtQlBPS015aXczUURiTWxDaDRoVmkzTjlmTnRZV1JRZ2x1SWRlOHhUOGErYW1xRW1lQjVhY1NzRDE3bER0Yzc0SlBGbnN5WWRoUHFjYW9NSHJ2QnBDZE5YbDAzS25VeUkvOXpFYWFtb28yMldnbmx6aHNxeHZ4MnpxZVpGcHd4VkE0R3MwUG9tMlBhaGdNUUtJeGdGYlluZk5xZ1ZiVmIwWU13cXp2bmdQZ0xNUXJJaFR2Q2dCTWlWRXB6cEZxRHlXSmNwMUFzQ1lIYm9BdnFvZEh2cGx5NUxSNStldjl1ZzFXRjF1MWdLYWxqMDVHWEsyZVNkZTcyZHN4TDVUblJLZ2RkVksrbituWG96ajNtSDIvdnZ6Rnc3WjJuQ2R5L1FHd0RTelZsMzg0MVJzTnU3NDhScDhCbVFZY1JwRXlpWEpmbXhKcTdWblp3VWV4NjRiWnYyeHJEczZLblM2VVFua1ljdWluZnRPbnBuSXdIQnNSR2NxeWMza2JWQWg2enBHV0pSQnpOOUhPZ0hBNytLbU9pc0FndUxpNzdaWCs5S00yUC9wTDlRSHVDbS8vSFRzaHcveHgzTXU3cytlcndjajgwd1FYWUxnWDZPOURSK0hFQjAwdmN0YTdxOFhIYzB3aXRZTWFQZllVNnNQczRObVRwb3QxcHgxTnZTR2JnbGxROGI2Vzh1eGlRQjFBa2d2UnExZmlldjl3TFF3cSt0M0hEVVdUMHVjYjl1WTIwZTVlcllSelBKdVEvOE52NGIyTGl3WGo1TytrVHJiZ2pBcGdHMmdBWDdqVkJZMEdvQk9yaTdCcDRTK00xcnBRNktwQWVqK0R3SEZBV2NKUE5sNUZ1WGttTk9iN2JqeVdpNjZCVnBkZUxZNTZ0VXg2bUVuYUN3MDVwVTV3b0hPNTlrb0VGYzRUUitmUGc2SkE1Tk1ld3NYVlNvendiVFMwUnh0ZTEwa1RUa3dMdmVkSzc1V1hBTEhaejB6ZFIxMVhydWZHY2dRTUp2UVd2UDRtQWZ3QStac2tkNzQvWlpBUzRPUVZyaGJBY2c5eTQxZ3FQU1NyeVZlWGRBdi9CSXdJNnpaTWlQTjdabFJuT2pVak9vZzMyYzB1OElVOTNxWDZVdE9qWkFyUUFDYm8yb0dCTmdZTFZzZy9YZ1FmTFMrVHhDeGZrU1FjbTk4QTY1U1pWUms4a25scVdESmswYy9zQ1EwY0U0UW8yd1dKUkFJWklDUTl5Q1diSWNvc0ZXV2NSQkFNWXM4UzhsdzBzRXE3YUpNREh5NHM3UlVQcExHdXpPNXllcXlXRXRuVWRxNmkrVElGYUpMVkpCejU3NFQ4bnA3am1SRVlIanRJdGxvM0hqMHByQ0VpaEdoQWplejYyWlg2Q3N1R3lORURTSlIrWlMyc1BSeFYrM3lpSGtkeW1YbFZaVkZwTnhzQmtYY0NNdkszY1VJRVNrQjRya1hDWUxLenBHS1JnZkZNcEpPdUFFaXBUQUxQMnZnUHduRDNka1k0ZWxkWERpcTJLcDRWZEppN3hoUTRmMFByUERlRE1vWkZ4ZUpJWm5saktpeVJmL0FVcStvRXBvRUxLYnBJcnBsRnRMTkFzK28vQS93a0lKNUhsVWVQR1Jncmtjd21FT1Y5SlM2b3lDTEdnTm11dWZNREhmdDNWQ251V1ZOaVZ2QkN6Y0dLSFpGUFhLSm1Na3VCYzVGQ2lZNlUwR0M4d0FvY3BiMVV5YzBoNDVhNEpneitZNVJQWWQ2TU5aQjNNNW10TDIrdHVQbUZVVjNLWElVaitJUGh0dWFMUnZkdENZenhGclhyWGRFQlZrTmdGeXJxQXA0RVF3QTlRVVlNZjBzQzg0c3BhQXZHZlFKQ2FLT2lUTFFoMWoxa0JnREx2SS94cENBZEpwUU05WERHWFIwaUFFZExBZzRzVDNCRmJTaitJTVVGUDc0M0czeFZOQUdCNExXdUg4TERVcEJTOUFmQkpjMmRzMlhzUnNYOC9ZT0hKczdjTGJ1RjE5MHJ6UXZmekdBMGFicS9xM0E5emU1WElWdHNjcTNZWmZ2N05wc3N6WGRtaDNkZWZvenZhM0UzeTF0OVZwdCtacHQwVGV3WGRxcEhkdjkxMjg3aHQzVGZuYmZyWm9Ea211eEpXdThGVHU4OC9obmZKc2tCMUtsdjFqR2YvaTdxcGx1b2RyOUxvS3hFZkJMWlhNaDczczVKSjB4VE9Zakd4Ri96bjcvNHdkc3FYVHhPN2UvTW1nRkxoSmxQWmZKV1VIbGsyUlBZZ2J4eVV3SkdpaTVOaVpza2ZhZ2tHbHJZNXJOTXdEblFNcXJ2anRlOTM3bUwzSWYpIGZvcm1hdCgnd29mZjInKTtcXG4gIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGO1xcbn1cXG4vKiBvcGVuLXNhbnMtaGVicmV3LTcwMC1ub3JtYWwqL1xcbkBmb250LWZhY2Uge1xcbiAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgZm9udC1kaXNwbGF5OiBzd2FwO1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIHNyYzogdXJsKGRhdGE6Zm9udC93b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBQjBrQUJJQUFBQUFOc0FBQUJ5OEFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR2xBYmlFb2NnV1lHWUQ5VFZFRlVXZ0NCREFpQmZBbWZGQkVRQ3ExSXBVa0xnUmdBQVRZQ0pBT0NMQVFnQllSZ0J5QU1oUjhiOHpBVjdOZ0liZ2VRaU9xZUpvTC92eHh3QTRhQVRiWDNpSWpkNm9EaFF3dmYxazFvd05xSXJYdC9ZVk9MNmdIaGpIQkdHQ09pSlVLZ1RsaXRUZGppT21yYUFSRVFPTVRQQ1JoUGRTSWhIQ2RnSi9MbDd6a0tHOEZmK3hlbXpJUVJrc3dlMFp6L3MzZlJpeElrUWdnYXd3S0JCaTBrUVFJRVBDRUVzMkJTQTJvS05ZVUtGUTJpYlg5TFhYN0xjNmQ5S2lIK2E0amIvKzVmU25YVThSaFhxdXlLSUZ1VkRDN0tJMHdHaTNEZCtWQU9Bam9WTERiMlpZeEY3ZVpTS084cEZ3RExrdDVIa1ByZitnQWwvZS9UOVp1WjFWd1M3aEE5WlA4THU3aFUrMFVOTWQyQWg2S2g0L1ZxRlhRbFRYWCtwMm5idlR0QzNpTWtFYjdtbDdLcFUvS3VFOUgySEY4TGhlVEVVSFM1aHZsMHpSTlJWNUtpQVA0Zjd0MUh6UlBPUEExc0RodHIwcnJ2SGkwK2Z0TDV1dDdwckZoMlVPVy9KV3lYWUE5TUhUdk1YUmJkTzhrK3NIN3V5dzdJSVVQQi9pVTViSVhvUTVrbkFQb1U3QVRJV3p1MXk4N0R0SFlZdTlac2FEWkNsZ21YQmdZMTlwenlaWDlNKzVkZ2h6ZXhHQUZaQXNaeHJmZlhXQmtRWU1BR0taVEFKRVRnWHJLanBNQUIyUUJjTEFzRFlib2RSU2NTaTAySEZKc0FwUFFLVGhiZ0NFM3FzeUVuM2s0M2dkZVRybzRtOEhyUlVkTUlYaTlyS2p2QTYyM0ZnaGJ3UWdJQU9JSmc4Z0hRQ05aVkpMUVIwSnBNY0VQR2xvekI4bE5BMkFqY2ZXNE9mbUVYcCtCTTMwVGo4aFBXQW1oQ2dyV243SURERWhnc0Y3MDBBVG1tNndBT082VkdGRElER3BiS1RWMTMvQ2VhSEl6amFXeGhpbFMycUg2cTNmWi9ubnR4eXcwZ2NmbVVvb0tWN1BCS3IralM0bVE3dHdxeVM2T3AzZFdmWFozZnFxSGE4Q0o3YWExZXNyRzJXdUZCKzFRTlpVL1V4YnBhdDdNZjRuTjhFOS9QL3BUVzF0ZjRPdk9YK2l1QVVkb3dKc2JMNS9RdFpRc2lpVi84czBPaVNXejAyU25KakNtRjJlV3BUVk02c3Bka0tyM1pmdWp5ck0zZW00TTVsak5paE94THVaNTlsejZreC9TQ3YwMWVxby9xaC95V2Z3WUdnTk53TnU0eVJNTnJ5RWJnVUk5SWdNZU5SQWpiMW1WS0NrelErNlFJcnBwQ0xvRCtDTFF6aHl6MEdRQVRvVzhPQXlTQXFJaEt4b2tpTnVobVIweTVFWEVFTUxFakZtb0FoV2tNaFFXUmdDNm1RU29oNmhpU1kyclN3ZkFxSVFXeVFEYU83eVh1Ukc3SU8xQkNqaEFuNVNTTTh0SEFLd1FqMDVOMDRpK1BwaDhOUG9VcFRBRTFiV3Q0bDFBb3BBRnpNK1FsZEFjQVJpT1N3UzloUFpBQ2FtbDJhck16a2dIbENzQU96RHJLaUlRc0lVdkNycEhoRTI0aEV0T0FzVVU2amM0T3hBMjFJSzdKeFJSUVBTdEdQSW1RQ0dXeFNBTzdoUE1Sc0VyZTF4dTFjbmRkRDIxTms0VTlCcEVDQ1AvTFBoaUZlQWZLYVJQbEVnM1JFUCtrcHJlalJRTGNnNm9uelcxd3ZMeThEblFROEJGSVF5dU5TYWs2MjNOOFlKQkVKR1hKa0dSb1VwME1UODVMYXN3SVFSL2ZQaGw0WExnU0VCSnhSeUx0eUF3eUFEbXNud0JBdjZvQm85dFRaeWRwbWhaZzhMRVo3bVlaME9BYysyTnN5Nzh6QWUyLzlBRjBCQUNRVXVaNUFGNUlnS28rSVE0QUxuQ0FGOFlXUDExUWh4REE0aGQxQ3hBQStrL0JZWkFZQmhUZ2tUQTJCVU1pMVdEWVRzRm1BT0NBK1FkNUFLWWdMSjlBSWRVbXdaSlFoTXR2bGlEUHpLdnpwcmdudmpYbi90YjhIZnQzM044NmlZeDNRQjdMNEJ2NHVlMy9kK1JFclFUSnYyZW5ML1ZaWjVYUWp3WkpQL1dQL1VOL3oxL3pWNEJBaWxGY01Nam51YlVuNkZ3dXdQR3RuRk9yLzVjNS9tUGhxclYvQitDTWMvWU85aW1yaFoxYTJ4Mnh6Vm5udzdtdldhOStqYllhME8yRUxSVnRyWDdIOUhwdG5TV1ZNb2x1Nmo3c25Na2c5SzI1M1FGSG9QQ3NNYng4eWxCQW12WlhCd1ZWN0V6d3dVcmR0MytjM2FnMU50dGYwZHF0dE1FMkEwNWFacjArZTZnWEh2SGFFc3R0dEt0U2RGbUpQN2ZkK3AzZXVNbTZKd0V1S3pLSHgrbXJhUWYyNzl1N1lmMjZ0V3RXaTdGcTVZcmx5NWIyZEhjdFdieG80WUxPanZhMjFwYm1wc2FHK2pwYmJVMTFWV1ZGZVZscFNYRlJvYlhBa204MjVlVmtaMlZtcEJ2VFVsTU15UXBQTGtFUFJPTU1Jc0Uzb1lZSUNvUlVZancwSThpY29pY0FzaEhxcmFEWEVmd3pzZU9KMUQxanJUZHM0Y0Z0M1Qwckx2V29BZmVRS09BQTB0ZHc0eW1QbjdWQ3RjNEJkWHJOU005dTdsVWJqMWdJYXF3aFdsemQvRUphODAxZmJXYWoyZ2RsQXZScGNTd0JzMzdkbTRROSt4ZU5YOGJSNnp6amlHUExza0xha29ha2JoWWVLS09Td1VycWd4b3BWNHI1ZU43aU9XZUV0bFpnd3RvUG9EcVFoYnpTTk1NK2ZrTzlxZ0N6SUlLMFBIOHFXZ2VjWTBQYkUyRTliOXc0Vy9JKzEvNkpuVDRrdHQxT0ltaElXZm01UC9ueXhXQXJ1VkxBZkI2U3I0VFVHTzc3dEQ3akZHU0lOd2dhNkRYTXBLS3o3SndZdXVKTjlqc2tLRDdBbXZyUmpLQWpHdTFhQ0FrcVZDSWFqaVl3SlhpbmQ4SThvUlBCM0lpMVVWbGhGd2poVSt0S1FZSVZPdERkZzhMdjl3ZjhZVXFwbW5CSWZEMEcvSU1BRWNMWEJGTzBVU0NUeWk4TW41R2l5UUg5eVFzT29DT0J2YVVKTnZmSXh6dDNCbm9NVjdMdWNDdmZFa2l4cXRDa3ZDODlRYmRUSitweHZMMmRjU0hJbWdocndSdnVSMHdRMStDbjRsSU54dnBlKzk0ZHNNdmVCZ212RFB1MDVLUmVxbE9sZWpEV3htZXR3SnQyNVRTLzF3V25XdzgyM0VLdXJyYzJNRHRjY0JPaVZRYTN2UmhhQ3hjN2RQQWpFRjExVTlWb3krNlFFVFVzKzN6ZHpDYmt0cnhkM0U1SU12bFV5bGIzRVdmM0xRNjVVOXd4SkZLTGdjdlkvNUpycnVuc2F6M0tjeUw0cC9MS3JIMkVXY0J6Qk0vdW04U2h3VnAvdHV4MnFFN1E0M3JkenZoWjhrL2MweGZpSUp4SVdqUlI5NWFMaTNoZXBXY05Xelc1ZGRicmVVZGVzLzdrOHlJa3Jkb3p2NExOUmpOSFdpYmFuNEZiQWd6eUttaGIxK2lzRlUyTzhhQ25zdFozTlQzTUlocGFlS1BqQytZcnZXNm43RkhSWTg4aDVUV1M3djNRTHRhWGxiTXA1b0huQTljUEU5bytYNEZZcDdmQWdFZHhtVXF3cVIxY0w1UFE1VkZpckhFaWxwYmUrcEZsUUorc2ZETXpjcktWamJKVUt6ZElFK2xCMi9Yb3A1Tk44cFJzdXBNQ3VMM0Ntc0JSaEUwc3poaWM4ODUwcUlod2hOUlVmSjF2bUJmY1IzMGhGdVZ3TkQ2a3BOeUQxTUNqdFVubXhucHc5NVJPM1huT1FmVjh3dXZpZ3ZQdFhHUEFJYkVnVzFZRW9ZK0M3MFZ3VWIrMlpzYWlUT3U0eWVEeEs1L1dSYTkyS3hSR0hid2pnUEY3cVFvMUpCdDZ4YkMwT3VYNWhSV0NLZXh2QkJnVVFGV0xURC9odUNPYXJSaEJPRWczdktVdGRzbHhYTUdFdE53UWhLRHhncklFUVJ1bVp1c0Q5QVJPWVFacm1lREl6Y2QxVkxOSW1BNE93bTdySWpYWGRHd1hwcXNDM0MxMmdtTkxGVFcwNURvYUZXWkREa0g3RytTT3NDTEx3akI1RTRmekxrM3ZzeG9YU2hmZHFMUjJxeE5nUU5CbnFoUWl3Uzg3SVMyL0dvSlpXSWdEN1l2aUN4YUFtZWxod0pFUHJBbFNKOUFRK3Z4VkRuMFVqTVliRHlDOVpOaGMzaVQyb2lzcGt3UkZTT3NManB4OXoweXFzbktoZ1lMSnU2NklGUzRYQWdKaSttUmhDQlY2d1lOYTFaWWlDNFhBRGlqN3lOMkl5YlcvMmNKQllIQVlwcUYwUkhCa01aU2VvWEI0N2wvUENWamtaU05XdzFLMkdGWWxWQ3Azc0hGTDZ5MFdJTWZpb2x6N3l5QTdleTFZTEdIMjA5M3AzWC9vT0RwVldEcjdldy95a0dqUm5JdDY5azFIMnd1eGx1MCtZMkphT1JJR25SNnRzZkNKM2NMb2tLREtSbFEyWERRUVRReVdGWUJzVU41VUNnTVVEZUprR2VPdkJLaXpxMWNVTFo4STFTZGM5bENLVkVjT0YwZTVMNFhsSjNiclV3RWNORGNqTUNzeUVyREd3OTF3REJpU1BkVXR2M1VXTzl4Y1d1VVVNTXcxTkVHZjBxa1lsUnFTQ2s4TWxBd0dDbUQvKzUydmhrSkhSVnJGc295QUhVcFh3ZTEvS1d3dTFLSVIrRzFoSTRFWWpZQndid2RhUE9MS2Fmcm9uUm9tYnR0dlBZNlN2UVkxUXJhTUkzNHZFMERmRkpUV3NHc3drNEw4ZVBtNjdLR0FxQkQxZTR2VE5WWklLbU1OYlpocnRkL3ZPYm16QVFqdnRIbG1YaEI0a3dxRkY5bDBSZmlVRGJoM0ZDMG9BWG5Md3o4ZkIwV0FXekdheTE3aEU3L0FnVDFTSitRWG1zbFdkWTlIeVZFRlpxL3p5dDFES0YzcjRlQlk1UXlCYUtrVzhaY0JhTTdaQmZERlY1blhDK002OEV6Z3Z1dDJ0TkNwUlovN3Rlckl5VnZ0dVVkVUdQUStGdDJsUnNTTjM4YUltSmZSUmxqdUNvVDkrTCtWZ28wdE9YQ0hMZ2VzWFhvVyt2aVRwY001RjhKMDZJUjVhdXZDbnNsSFlDejhqOHdZeTlQWnJqUnpDRW5aWGk5ZWRGL3hnaHNubG8vODB1bjRSSzhqZUdPWkJYT0JDazBraURiMnNBdTFtRGRsN0hPL24rRm5KUmhQdmtrZVlkb0tWMVRlTEc1K1YrVHpqeHNSSVhBclp2eWFCODdsMm4veHNRVWlzUDF1eTB3TlZkdVJkalhIZ2ZONHVrVk1ybGgzSGhPa3M2WUsvU2hwWVE5VnhBNVQwVGtGZHorWThZTWlEa3IrTzYwci9YcUxtYVF3Y1dDVzRSUy9zWnkwWkpqaHQ5WnVZUmg2S1hFTitHanB2dUMxTUlQTWZxZ3E3WWdDUmdqUlR2anE1RkxoaUJ0YTA1c0hVUEliOUJQTzU5cGJpMjM2Wkk1dU1xSlRuNTF6emlkaDZ3VTRxVEM1YUt4TC9TQWdteEMxdkJ4YWRVb24ySEpJR2lwNTkvSUNHckhCQzB6TTJIVmdRSUFERFFoZ0FkWGhjQWhTMnNqYTY5VnJBUmtCVUc0RG9HTUFmZ0g0QWdEbzFJa1JXOWYwZzEwdUdZZlVJa0FHWENDa2dUUElFNkIvd3owN1A0bWNKeWFSbGtzaXlONVJEQjVIdy9QMUU0cENqRzVWZDVKSUdjTHNSTndRVjFyQVJXbVZ4K2VQVmZNS2w0SG52S1dheEZMTHF0OVg1TnZIaUtVVUZESW1VdzJ6NGNSQ2NEQWhCcFpGN3Z4VE42S1FDYjBGNDFXa1BvaWc0WGdET0FQTXhVMVRkUExLZUVYOEtJamxUcU5FZXJ5QitVOENKREZDN0pkaVJoeVY0ejZ3RDJDanhaQ055dlZFT2tuZGFhZnNmZWs5REcxWDZEajhqK1JSV1RLK3krcGlrSE1zazhRd1VSbk92R2ZGUXhMdnJ3Rm4zRDFOeE1qNVRKVnBKWkhXM012N3VHVDltMFlpNVNGMHcxRWJxRzZCb2hQVUk2NjFYTkNGRUZiRy85QWJsU0RUYkY5NXJDSXFGQjlxcDY5eWNIOVBOajBkZnFKUVFFVzBIVGxuSXlpbUszcWRqNmJEZHlQQWZuWS8wcWdVNDI2V0kzWi84dE9ZZVk4eGxZL3phMWlUWld3OHBUSVVqNVdCTS9Ed3VpMHNjajd5UC9XU2xjTERnL3NZcUtMY2t2N0tZYmU5QlRkV1hjR0RNVURNWlhiTFo0OGVsVmZZR0l0UzllOC9QZnlNS3M0Y0JFdXNQYnFEZ3RzQjl1U0ZCK0lOdUIyajlBMG9SckIzTlVkdS9Taks4ajdna1BOb0ZYczE5MmJlZEw4Y3lua3Juci9NVERndmM4MncvR3ltajdCUmVEVDArdUpuQmhBS0dNaU1MS2Z2OG01V2lmVlpyR0lwWXhVSHFyT0JzLzl0MmNVbi9lL0FGR0hVVU1xVFQybVNLZjlONTc2SXVTRFBQaFBzQmRidWpEYzFHc1J2N1JxK3g1TStnTTh4UjU5N2hTSm4rVjFUWGtvQi92cCthejFIbkZJTnZZRlZzcS9MdjhlZXRySm5vaVlLQTh2RHRZRVBxY1o4QzBzUnEyQlFzK0tEQ2h4U3BCVTRxN0lveHpMQVc1NWxYSFNHbDY5RGROeGtGbUJKeE5MbExlWkliN1Q1Qm1iY1laVmNJTUNPYnhHcklLVk56L3NOZW5QRU1Lc1BDeXZLQkk1VjY3VUdmVlRPUStLYndybUc5WmdmZW1nUHkvUDg3b08wVW9GajZSbGh4UTdsKzNMSExZU05pWnE1K29vWmhlbk1ySjc1Y0UvS0VRdXNObUVCSXVxTklxRGlzbG5NbWMwek0yY3V1VEFXMjdOTWlBWFFvOXYzek4ya0lBL2JwbnFWK3RoMnNGeTBXQTl5Z05IRDZYdGdEY2dVdWQ4a0VuMlhSVW1yUTF6Ti8xa0d6UklMcmoxUDBUTDlPWHhqL283eVZJT2IwMlRXMnJXTHJxZld4SWUvRS9pV3dhbHVkM2xGVm9xQWR6NTczVVpTMmVqYnFTOEV0WE9wcldaOXFaNVg5ejlwekFDOWsvNmRqaGludDVWdTV1NDhsaFd4WWRZem4yR0w3OWsrNTNLSDdmNkhvY3I0N1VzU20wTXlqM2tVUjY4eUJHVkVCWmtaNlQrMHJiUlZycEcyWGZNL1Vubm15OENybkgraVUrL3BtZ1A1R2ZQOW5WTC8vall0My9JZDVjMmZramVWcm0ySjVDNHV5bzByK2JSYnovRFBlNDk5Z2p0bnFLZm5wWkcya0JJV0hoTU9YY25LS25abTFSbUt5S1FnRW44UVdNR3doOFc0RkZqak8rS3QzeDZUR1VkOEozdDNtaU5MdnU3SmEvZm5COGtDblFZQi9XSlVML09wNXlpbVJjY0U5a2VaR1NVOFZsTnFrYXFveUZobDVJU2J2WDF5Y0Y0d2Y1U1h1SVhmOG80MUsxYWRIL1RCcm01VjkxTHBtT2w4dGlJODJxSzZZaENQTkRXSVR2MTg1Y2cva3Z2eXAxZnZKSkpQMmthdnhYWHpqVGsrUnA4Myt5cUY1NFRKM3NYTkc5TDh0Mi8yY3QwNWJRbGVQUDRSZS9sM3R4SzV0cEpUWDNybzV2VUVaT0xWbjJZd1RELzU1ZEJlL215anFNNFovZDVIS3AzTUo4bjdaTVVONXJSejUwVzJnZjNMaGZmTUhxb3VQRk44c1RyeThGR1dPY1NlTHQ0VUdMSlluaFMvbXA1QTNPeFk5ZE92WHVVbUxzVDBnZkI3Lzc5cDhhaGpkK3JPRmduM2U2WklFc29yTXoxWGJSQnluOVMvUGhHNjUrZGdjdi85MFpMYXIxMEdBYzJtVVNjc1ZEdlYzR01YLzBEdEpXWXJuV3JqMXIvMTNkbGpTb3VlZzM5dU9pN3p5Y04vNHF6SnpnM0JLcjZNa3J6QSsvSk1WdXlHZEE2b2VoMzdSWFpzYm1lUFYycmVXdFc3OS9zK3VlcCt2SnFtblB0ZEhNY3RabzIwejZuQ3NqM3VUdTk0aCt5NzM3UHZRd2d5c25lN3JYd3Z0aTVHRlgwb29kdDFPZmRRR2dRUnhYTWxuZFJVcWRpUDZmdGhtMGlhU2FIK2FKdWpSRmN1OVYyK1BLeHdmSlJoREJCSEVjdllyWlVuT0l0NWZUVWhPZExGYTZRbDRoU1BNVnVoWkc5czF3ZE9TeWsvbGNnSnFwMlVtN25SYzVWQjFyRFUyeXhPOWhpcHRianVkOUY2MTNidXlRcnMwQTc4R0d0UkQxWUxxeGxMOUpzQ2hsY2VUZk1POXNvOUdwOGUrN3kzMWVQb1o5ZnkxZnlrK0orKzlYZEg3bmFhbFFiMVIrUnZEc3RzRGR0TnM0YnJsR0hoWkwyb1M5RndKZTJRN05ZNzNyV2N1eEpCK1Avbk9ydEVSOCtKUzN3akk4dDlodnNreHVCNXZxWXZXelZ2UEZLOW5ZUkswY0dZTG1uazRZWmkvYkdxczBuQjhWcHhueWl6ZUwvc0hqdS95a1ByWS9TOXRiaVQzK2ljMUV2cXBQdjkrdldYL295b1V4czllMzE4VzVJVHNTUlZQTFZvMSttZ2l2cFZxN3kwVnEvMUQzM3pRdFErcHZzZGxwdnZxZDVOd25mVzhDZW5EVEY3ZUw1cnNocFRUeC9QU0hwVDIxWXlvSGo3ZFY3NU14K2ozNjBsQnpSZkJhY0c2RmRZRXB4SDY3bEN6KzhVL09jSlg2Kzl1ZTdtaGRpSzRzbWdxN1dhL3FyMXZSb3JTYy9ZeHpmUHFUZFFxSlYzYnFmN3ZoZFpzQ0drajJJU3VQdnprWmFaeTAyNWVVZWF1cmNtS3BIdFNCLzJPTVlVTUlQNU81MHlXM25wYmxrVG8wajRYZVdGT3pIWGhMbHVPVzJOckVSR0NsVW5DRkYvTXZlVDZpZiswcUw4cFBKRW5zWG1GZFJCNnFIZWVWMU9PMDAxYkQwcWVQSWtNN1BrQS8xdndYeEplWVBscDlsQ1RwQllEM2xXR24xMitQaHNvYmZySnhQaTF1L1NsRkp4S3M2OXlLdzcyNmlwajJobEh3Nkw5WjJYUUcrTHVLSE1rS2MyZEtiSVRacmIvcTBlN3pLbEJrN3IrNXZDWXRYNjFCSHZaTEwzWENOeGh6Vk55U3Zmem0zeTduMGRrOFozdzI4UjFaZHJnd3V0S1pVcDNJTTZ5Y3FqMXhONGpjdFB2Ynl4d3NlVmtOWW1LNzdLNVpjVlN2dFV0aXQrNzBVekF3M0o1RU1jMXdQNU43bXlYeWgvcEZpcy9kL2dsSmNVaXNmeXlpK21LYWEvbGs1YzF2TlduU3VDWFA2Y2xFeEJONldpMTZINE9hOTVyMnpOdHJPQ0ZQeHRCRCtpdWZJbGhYK3ZRL3U0SkppNDhIQ3RyY20yOW1GSXBzSUdjM1g1bXV2bDhrWFRIVEh5SHVydHlzY3kyZnYwSGYrVjc0MUxTc1g3OHJZb1MySDNHWnVSeVdjNFFGRmtReFJuMm41WC9zL2NrcjlMemtIUTF5UzgrcTV0dVkwZSt1WGhKdHNpVys5REFxVEhjVnJrNzlGQWVudkw0YkpjK1g3L3VVTm5GSGE1ajRqY3Z2S1kvTkdWUDQ1QTNHRE5VVmRvdWR4ZDVJYThHVUpLTHRzK0MxeHZtd0luSDNtUjloRjBmRzlMOGFMaUhmZDQrT3lxbjRjM1NCdEJQbi9uNW1mcnEzNDhQcWJrazNiYnFyaEs5L2ZvSjY0emJSY3J0UGVsMjlhMWkzbmdjOTFQWDYrL21TakZaRVFBVVNGNVpsTmVwaHA4eHVkSlFTNXBkQzJqYlY3TFhNZ3JqTmFrZ2piYjFnOEM2NUwvVFVxSzduOVRBdXVvSFJRbXJueFMrQ1FnOHhQa1lvNDRZQXFpZE8zNmF3bXFjY21uV3djVFJJTG9nQ0h2QktOWWVodWZDYVRNWkJGamdqTTZVNzRURU56a2tSN2ZCZXdDMzVxdTloSnZKL2dkeFhIczlBV2d1cXZ5aGFDS2doRVJZNU9TNmE3KzVSUlJFQnBBWDFIck1nQ09vMHNmVzdVV2tOK1NybXJmYkRwYXZGejdybURSbVAvRzBRRFhuckI1ZWt0ZVB6S0pDQ0FSNnVOQmRFcXY4MlNocDVialJSZTJseWIxcjFmOVZuTzR6dGNObWhqdzN3VWZhYUZmYytQT3ZLSUJrRGdVbC9Eb01hUUxzRCtRNHJJZkhTeEZXb0dLVTcwSDYrVFd0STRma0xHd0hRQS94L0tucFdsWVAvTlh1aHJNNThQOHhDOXFJbUo0MEVqQW8zZDFpQUZVNmdBMWp4OFZFcXFsMDduZEhlNElBUUh4YXFld0FMVTNNTU9UOFBaeTRuZFRnZWlBc3hFZkZoVVYvMWs5SDlOb3Q5QkRCR3pBT1M0bUpCSXExYW03QTJGUXFNcmlLZXlpblpXNjRPaVMzdk94ZVlSWUtFUlVLakorV0V1a0RpZUFNZy9peURJZ205bzBBL0RwYUVKMVEyMHFjdXVlQWxoMFhWZ0IrYlFyNUwwS25ZYmpaRXJFNE1sd1duaCtqY3BLM29EN05BQlg2a2VFTy9PQ2c0VzJ6M0dBM0p4T3hFT2xTVjBmeGEzRWVTYlVaTENZb2FHVzd4Y1h4dExQNFZoOGhKSHBMaFJnVXdMa1dOMlFjSFZ4Y3dNbDdSNHNScW5HUlprS3BSS3FVYTVQOXdjV3JIbHlGMmRFb3BLQmdXR0VSUk5BUXJhNmhUaU8wS3BwcDdBQlJyTlViZTRpc1pqRFpMTGVXRjVjMVRtOGJFcHhabW9vTGNlRElGeWRYWGc0ZVM2VjI3clRnLzZINEwwaElmejhlRTFSaHVtRDNsS2MzRFRudlo4U2M5bzdpZzgzbGZCNElHR3BLa3hkMGZBczFieDVGRitsa3UvaEFRdjFNaXhIS01CTnZpNkpJTGhjTnpkQW03eCtNSUxHWnJ1NGlFUVFoaXdUQ1I1ZnduRVFEdXlCYnBBVUpvL3lmRGFBSWhCSU9PQkpBSnFhZ1B1MEg1bEFPZkh1SE9LeEpVV3h0QlNreWkvZ25aSUN0T0NKZ0p5ejNvYlRiYVlsaHVWSEV3bDhCVm9uTHBmTkZpSlNCNDNHNDNsNlFySW1UblVRdHJ2MU1wVjhnNEFBZ0lOZXI0Z3lsWEZpZnkybTBRb0FBTHp6NCtidkFPQ0RqN0tjdncvK0pmM2dWaVVFRk1BQUFBQUIvTFZTRi8xVUNvV0Raa3ZwelJqN0NkeVlvWXI3c05weFFYSlhDSmc2ZzJsdjVTdmFxSmMxMWZxVGJWY25DV2hQK2k1aTBBKzhUbTBLcFk1V3hmMUx5WmhPa3FkSFYvK3F2OVE5YUtTL1hKc1NneDB0WUNOSjdSeGdVTGRBeUlIQnRuT3gxdm5TZXBISHFkWXdpSHg2TC9VMjAwSTlGZUFZR2xQLzdjVVAwWU9VdzI0S3NBNG5tWFlNTTlzLzZpUnNsL21iaFVZZ0FERGF3VTBaTW1EQXBkSVBzS3VIYStDQUFJQU5JOFFHSkRvQURJSExOQVE4UTlNd29NSFZhVGlFdUR1TkJHSy9UU09EcUhpWVlnWk9aVU40SlI4REFUQlI5elFFQkZyZmc1S21DNG15NW5ZaEx1WkI0WUc5L0RNU3RHclRwVU05bXpvTGVGRUw2WVplVEE2dUNiTzB6YUtGd2p3VkpEcXJ5RWJEVmcyK3Fub05kUmJPb3M1VEhYWlNFWlJXMGFhRzBWUkQyYWJla3VhYmxZSlZWZG1zcGJOb1BadE5hdFFxbVMwVzZLVHlVdnVkNS82VTJRaDlldDBtMWNJRUMrbE1pbUdRSlF5SzU1WS9kd2JCdHV2SzJZajhFeXBSOVRuMThFcXh2V0c5aXQwelRhZ3FYbFZiUlNvNHBHaWFnU0ZoeTdWbVNaYk93am51aFlWVjlVVmxXb2ZOS2tDZTZvQktlVkdWWE5ZZ2ZSRUg2ZlFjQjZtOUFlMjZrZTZiWFZ1WGRWRmtGZ3RYeDRMVjNqay82WmcxcTMzT2FGc2NyVk5HeTFCSzg2Q2JSczlxSEsyR1BxTyt0VkhYRG1Cck82aHRrNmpwTkYzZDNSR3A2cktvYkRDcm90SGxkZEZsTldxVjFwR1NXb09vaWk0cU0xWmhHYkdXTmdvS2psaUtYZm1GcnMxNXNVeVp6c3N3S3pmTHlFbFhacWNpYTdZeUU1MFJqMVo2cEkyUm5wRVdhVWtOclpSQUczeTJrbjJkNU4rUmtlanRTdkF5OUR6UjRhU2RqQlh2UnVMY2cvbE8wYkUyWmNSWVA2S3R0YUtzRHhHMy93enI4RUdKaExZRldYcitCQlN5cVl2RXZTS09ia2dsUXhlaHFDUFF3ZGRQYnc2OHVPRnBhWXB3QkJhMmVvcVYwNzNYMmJWSVpka05NTlJmdUN5OG9PM21LSFFPNVptZFFybG1ucFZyWmFuM3pGUGQ1ajFyV3c5SksvcDdqbk1jN0cxWHZXUGVWRytZcTR6NXdMcGozYkQrcG53dk1iQitnQlZHZlkvRWhlanFMZk5ReDd4bGpmVVFXNUh2Q2VmQ3RWZko2R0p0UHpFRkdDOVNIYm5HTVhyMjR6RzA4VVNhcHpTME9ZVmpGSG5SWUQ0cUtoaEhhT3VqZFZ1MmdNZDE0OWoydklJSkhGWVI2emlHSmR3UFdTUThvdStFQUFHZDZKd3B3d1dFcDNXVkhxZ0RLTkUxYjlNajRCV0JKd0hwbmJiZGV1Y3RYNzAzS1FBQUFBQT0pIGZvcm1hdCgnd29mZjInKTtcXG4gIHVuaWNvZGUtcmFuZ2U6IFUrMDU5MC0wNUZGLCBVKzIwQUEsIFUrMjVDQywgVStGQjFELUZCNEY7XFxufVxcbi8qIG9wZW4tc2Fucy12aWV0bmFtZXNlLTcwMC1ub3JtYWwqL1xcbkBmb250LWZhY2Uge1xcbiAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgZm9udC1kaXNwbGF5OiBzd2FwO1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIHNyYzogdXJsKGRhdGE6Zm9udC93b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBQnVvQUJJQUFBQUFPWVFBQUJ0R0FBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR2tvYklCdzhCbUEvVTFSQlZGb0FmQWlCZkFtZkZCRVFDcm9VdERvTGdnNEFBVFlDSkFPRUdBUWdCWVJnQnlBTWhSOGJaalFqRWJhY3RJSkw5SmNITmhsT0N2YytVdVdLaWtwcmhZb0szOWczb29KcHl1S0x3aDV1Yml5MFYweFAvbHNqSkpubDRiLzlhSGZtdnplcmtyYzVOTWhpaVVNU2s3aUhxb21RQ0VsYk1FL0o1dWY1YmZYblBoNFBmSVNvZ0VFOE1Bb0xlOW9PUURDd2NveEd4c3lKc3FhY0ttZDIxNG52Wmt6OU1UYktqWnpZS21WcUxWMjZYVDZpWjdnZ25GRjFxYkNkMlprNk9tT3FSTmhHVmVValZOcExYYm03bG1RWmZzWWgxbzhpQllBMDR3Y0MreTVBNEFDcHFGTDBlT2t5cVQ1ZG1hYkoxZlMzLzZtV2twY2lUOVhOUU9GanZ1U0VYZFVoN3kyNTZWTDRvQnlBVFJvVm5XTXR6M2ZYUERqeVNxZVd5ZEhZK0wrbTZnb1NkN3BUZGVtYjlHemwwU2x0bU14a3JIeDd0aXpMNFFNZ0R6aENBby8wTTA4MDFlaFdTSGZTbFpJTGFUbmRmZkxMWE1mU0pMY3FwWFZscTI5UHRtVEtuaWt2WTZZbGM1WjF6ckRsTmRRT01MRjJMSnNuVkZHSVAvYmxyOVZYQnhTOUdmRkNDRTFNbXBpRTVsaGt6cS8zdGxRQUF5NmtZcmNjaXdBTGZBaUViSlpwWXZKcER1S21KVWlZbHFRdFFFRHpkOC91WmlBQU1YNUMwcXRFUkNXb2dBazRBTjBVSmZENXdUYWpqeWE3WXFpdkF2Y2I5Y1dWTVBkbWNVSDkzTHY1amRWRDZTRVJBdCtMTFo0SElQM3dPOENMbTF2em1iNTFINlR0SzJBU1dpdTg3OE5IazZQUmNZVEpMakxIMTg4QmpHNWdvd0RsbU5GY0RIM2hHUThQeUdNbTN1S2xiQXZXVXRSWWhpQmkrMFpaSXdMNi8yalNTTXlRdEF3UnJNeERkbEFFMmd0REliQkZBSUhwWFpLQXVTdHhZZy9kcHVGUUZpempLZDhtZ1dqSUFybWhjblFDelV0L2x2NHEvVnQyMFdRQ1VEREVRNjZvREIxSFY2WEhwYjlJZjVQLzBVM21KdHJHNDQyckd4MGJkV3U5YSs1cjNaL2RCd1JwUmVNRGk3NEF3dlY5SWczNG9QOGdIOTBHL2d0Tkd5UUVzdnhIQUM5ZGNPZzI3WXdlY1JGSzZ4eXoyM2xsY3Q2Q25VWk1xelJoUnB0VHhzdG02RE50em9nbjBLKzF4Q3lpRGRZY2RjRXoydVM0ZW84cHg5ekJlZk5qdVRNdUVlWGI5SkRCVGV6cnVNY2pVVC8vU1JkZDFXdk1aTmtNZGJvTTJtM0dhZTBHakRxWXYvWVZUNkJWaHlIN1N3d1lkSW1mMndIVHpyWlhoalk2Q2Z3ZWpCMmxuUTJKbTVvOGZHaHdvTCt2dDZlN3E3T2pmWmV4emREYTB0elUyRkJmVjF0VHZiT3FzcUs4ckxTa3VLaXdJRDh2VjUrVG5kVkQxRjV1cnE4dUw4NU9UNDZQRGtmRFFiOVhmZmFnMkZqZm5hY2t6dmxndHJHbmxhVTQyZXZOUGRYNUVEbkN6NEpCUjNCbllrZm5VbmFOdGQ2d2hRTXpaYllpVHJWZTRYcTN5SVo4Q0JQbkdsM3c2S3dXS3JVQW90UmRGamplL1FUanVTd29qd0U2WE53M3daMkorSEJkMVEzZFl6SUJodFNmVHhBWXZlQk13cnNyOC95WGFRdzZ6Nmc1dGl3emIxbVNzTlY2R1E0T0RlbFlPZlZBT1RVWmpQUDZ5UTAzQ0dXMVFCVnozM2NYZ0F4T1cxdzBjSVMvelgrb0FGVW5nakE4UGhWdGJXREJwamp0WEZpWFJxM1Vscnh2bW4vRnlwUEV0dDFLQkoyazhlZmg1UEpQbzdVMEdVQjlHcE5mQ1NrUEhaKzI5aHhFQ3Jzd1FRd1BZZFdSOWVhOTU1NVV6NXJHV1hIbHNSSWFGK29OZ2d4TGRHc2pHSlRNR2dwYjBnbVJ3YkFqR0dLR1RGYks1dmFRREdlYjNRSWhZTTFTUDBIUFhPM05CbmRyYnQxdFVRdHRTRmdtZmcyai9rSElJb1RmVW16Qk9xcncrVTYvc2ZvVk9kTVFxWFBGVUFVeVhORkRFOEcraGx4L1paN1hqQWV3ODNndHY2V3dqUnN1eENFNzZXdTBXMldpQWNmRDJzbFprS2tpSEF6ZThDTUtCTkVnM0lXb0RnUmovVjM3N2lpTXJ2ZEl3alBEUHExY3FiZkxsR1VISTgzUDZyRkdqMXVtY3NVR3AwTU9CbHFXaTJkVWhzQU1KbHdGeXdDRG1ic1kxTEtUYXdwQkxiajFHaW9xN1JnVk1pcC9MVmlkS0RBSm1jbGZaYThTa2tnYnNaNTFrT2dPTXZOMTlqb3NVTGdVdUpyMTc3amtrdlkvYUozSFJIQ244dDdNZllTcXczRUUweDJUR0hTczlmdDV1MFZsZ2dIWGJiZEdaOG1kdU5OM29pQnNKL1Z0dEdiSnhrbGNidFcxaHExV25hbmJ1bDdETFVrM25FOEVoMTE2YWs1dzlZcnRIR2tLZHdabUNEREthNyt1ZFQ3UFpTMmFudWNwWDBoeWI3U2tTVFEwOFVhbko0ejNkOXV0L0k2eW11WFppY2VTcG54Z0p2UEhsbzJDY2VCeHllbWhpdlZoMzRPWXU2cUV6OFBtNkEzamF1M2hjdXFBN0h4eGlpQS9GMHRUUDJSOEdKbzM5clBXb2xnZ0JNWjRyMmFuQ2lhU1FOSnB0SEVwdGk3TEt1c0lZT1l4algxTGh2ZXl1R3B3M2JzNlo0dW9hcVFxNDJkOHBrK0hlcWduK0txbnFzZTNreFJqajFSQ3d4MUp4c1o2TUx1NVMwZWNFMGlac0hRcWJqcVRaMkVDam9rRkdYL0tVUTFSOEJTQ2lvYTFOUnppUFRTUGd3dmV1L0kwSFBJeXJSWUtvbzZPK2pBOWhRWVFqb2t4TzJOYmdNeTVNdmJCeFNzeU13U01DbUNEZXUwYkdGS21NbGNRdUlXd2d5dEpGYmNkeHhsVVljOVZBTHJFbGxSMmdHeVZLZG42QnBtQlMyaTV3WVpnZko3NFJIVkptQThPM096cGNxOU82TlF0ekJlWlNVK3U2NXV6cFlJcTZtb2RUUUd0SUFlZy9YTmdOZTNJVUgxNjJzdmloa3Z6cTBiQ0lIUEwxVzZTZGxzQ2pBaUc2bmloUU55OW93UzA1a2tUdk0vaVNMM3pXRWY1Q0tyMUlJd2g1MXVqWFNEUW1GQnNMd2ZQS2lOQnpCRFNwMkViZHhjbnZGRlBuSENLSWlUMVRRZk9ObDR0UTMvaWxKQW5uNXJyb0VEZDhZQVFOS1VJQ1hNVkhucVltV0hzOHhBOFFCZURjSkd6SXRNMGwxSkUrSUhCOTc1NVR6WUVHdFMwcDB2d0dMWWp5N1lBSkhFS0ozTGdRM1c1RndzWk9nWVk5Nm1ldDN5Y3ZYelRYR0tPekh3TlNENHdIeWNsbjNib0FycWNuR3FwbFJrOElKcWtIRTNPZm15VXZSTnIyYTZhYW9pMmpJUlJwL1hRa2g5WlRRNW5CeUwyb0x6aXJBS1BLMkIxQnREOS9OeWZLZUNrUVdUbEZmd3JRUzcxa3hXS05rMkVZUU5YdjQyS2l1MHRYK2Q3Smt3L3FVdFBCWERjdkdoQmE2QW9GSjNkNHFGandKZ3NiMWp5aVN1VXpDTTNpdWtGYXNSajBpR2J1MEltcFFSTEVjY2hFa2pBQldEa05hM2o0R1ZqU0hySlNVWkFaNk5qc0d1NzVHSUg1WVpnMStRQ3NSaG1FRENsZmZYdnRwNDB2ek5CZzlUdTZhVjNFSnVuQ0RNNFNibFo4OXdCaHBvV1V1RXIvMUk4VVVtM3BjeG1ReFJlNysraFRaNURJUktlVVlKMTBEU2JYNXNyODFZZ0NFZVNlRFhYcHFNVGhQQ1RyRElSTHJJQ05wRUlvaFJPMWJOK3dqeUtRQXhSMmMzRzRKTmVNU0VyNklSMHJVdFoyckRzRVZzcUVKaG5mQTdZVFlTbDFwT0cxdENHT2FKZTljbjhEL0hhV3dDWGZiczhMVXhyeVZ1QkY2N2RVaTlia01PdVNiM3RCZTlsdFgxanBmemZZVTJjSThsL3Zvam9rOUVBMk9veHVQbnAvem5uT1pocG1UQi9EZ1RTM24zSWVVL0dzM0pjMTdUb29ubDU2R2phcGZ3RVRBWC9nemlFUGR6YVRKcTJBMnQwakMrKzViN3B5cDk2Vjd4NVBiamNXOUdIQ0pibjJpOUNQbEFsdVVtaWI3bEFmVm1WOFo3OWpuSDNKMzkwL3VQNFBCZTFjRUg1aSt6RnJ5SEZmek9LaE1DTVZDdWZlbURSTlArSjV5dUlmTlBMU2k1VnFXS3Z0Wk9xNWNBUzc5dVhiejJXT1VzZXdpb1JRYzRaNzlYQStZb3Q4cjBYWVBZUG1ic3hpWTBwOFF2cnFML3NxcGFrWHduVURWem1ieTBYamhoWTRPOXN2WVNoMUpkaTB3Q3RwUCt1VjY5dVV2K1p5bHpMQlNvUm92M3dyZVFaVlUwZGJhcm5FcFQrQ20xZzJUUy90clcxYTcxR2oyaXVTN2ZPL09DWFlNaWxjRGF4VTlwWTFjSnhnSDRSVXVPMlMzVk9aOWh5VXhwajZaRzdBMFhFemMzanp0dncvcXNEQWhvd2dRUU9NRXdtOENCdGZHWnFZVVA1TGpEMEFPU0ZoSWJzd2RGdTYxdXBnQUFsTk1jL2VNRXpwWVE1TURuTkpaVCtYVTNSY3dGYUlIUlpKb3VOVzVyenpYQ09sR1hEeE5seUlqWlNqamxYeHJHeXNKT1lpOHhsRGtJckVqcUVWclpjMXVRSXViWTQyeXFUcTJVYk9ZYm16S01ySzlMWnBTVWJyUlhQYUFGY2pBTnN6SnpWR3FleDYvMmx6OG1STDFZK1JOMGZmY2thWGZ1Z3RXdDVtZlhxYXBuOWtCelpFaGlKTHNPcXNXOFFneU5ZeFEvTU1GWnlXbkUydlkxajRDRUw0K1hsWlU4Z2I2K3NyTGdqNCtneTRLU0dmT25URWpteXNvSzZWek15VVBjS09iS2swcXl1bHF1V2xzQUkxQ3dzQTB3M3BUT2dEcTlBUW1wVjdkU2NsZXNxSTVOdGx1WHhvWXVHQk5lNFlpYXBrc3ZxN091bVhLRjNOdXpiYko3T3dWMjlIdDJNa3pOMVlsbkNPcmxLNVhKYWpRdzZvOU92bzZ2OS9JeHdydFlmVEtJWGk0bDVHMGZYUG9DdWI1K1RiRHFKV1BSOEVtTkI5a2FiR0gzbnlJZTAzbzlZbzh2TG5xeWpRYUxmNWlrT0dNQXV1dVJtMkZpZ0VDQndnclp0OWM2WHRQdExDY1paMHdVTjY4UUR4d0lINCtvVjZNaHo3cUVEQzRWQW52dStyRTlTNm91Z09iWVdWMlVlcW50ZzR3UVNkTyszWWVheStsMEMxclY0Q3ltb2hNVkllS2N5WkNTaUhjbUtQcTNidW5hdXFuKzIxWWVvK3dWeVpNa1JuZlZnbXpieTdwZWs5OEtVSE45ZGpSaklZTUZMaDVxMlVnVnFydWFsSnd5eFNtcmJ5dm56WGsyZkYwWElTTTNxdmVUZVBxNS9sbzhPdjFrei9JNFJvMHJId3hidmtDT0xZcEpKOUhiK1JhcU5aemEwUk1ZL0RQRnBycTc2VmFRMTEwWXR4RU1KY0dEcU8zK3gvZWIvR2k1VXF4eFJWdU5yT1d3elR1MkE5VmllOUFlVlp3bnVrNWtraTF3MHlvb1hVVzU1K2w1WmhheDZjdEsrbGFvc0tVc1hZWEZBWDRqYjRJYyszWGhxNE52ZUxFUmdIcDJ0ci8va2ZEci93cHYwaW1lZXlRNlBPMTF3NGNzREtRRzNuajd4dlhVZ05XeitxNm1FajA4MjkvVEJLSEVmVDMxemtmSDY0MVBOeXYvLzh0UmZMMXcvM1BjTGUvdzllMitYMzY0RWRENjNmKy9la283SUxYdnIybmt1djJiNzZKS2s2ZTJiL0wybDZZTXAxdjVyRVdsamFVeTdBZmtucXBxTXN0OUY3MVNVcGxScGMxTGZGVmc2bjJwYWUvcnFXOTh2Yno3TS9MY3d2dHNocDNBMlhqZHJ1UDczdWIrWkw2ZFNtNVdhbGpyam1XaGZkRWZyOVhHQWRYVVRiVCt0UGo4bEtuVnpXTUZBUTZXRDgxTER6R2ZOaHJXVEJ4N2dYWHYyZFZkZVUrUW9IcVc1UHV2VWZRNHo3bHQvK2JVKy9QR2pZKy9yR3V1WWhrc1F2ck04ZTV1dGhLL1hLL1dUejBYa2I5ZW84ME1pSXZOQzFKcTg3YnpZSHVWWTNPckVnYmZpTzVwZmk5OXpJR2wxN0hZdityWC8vSkZmK2tlUVQ4cnRhdStEeGZGcHFVWHhYZ2VyYTd6MkZjZW1HYXBPOCtJYzlmb2ZYQ2Q0d1pYUjNmS28xbXVxZ21mMmZLQWNiMVViOURubEt2ZFRMVnlSUHVuL2pVYytNUXQxSU5UOG5QVzdqZEdTQTQvZEc0YW5yeWRXK3NlVHAzK0orTk1oSkN0Z1c2WkFhT2NXS0JlOG01TmFxUzFOcVhoWFJOZVVxV3Z1V0xvR0xIeVRPbmRyKzQ5L0xzWVZuL252cUdwNFk3am8vZldUSlk4M0hxdDZQMS83K2VsYy92MWJoUlJKSXF2Ly9TQmc4eDRMWDBveHVHdGpuNUNWNW9QK2ZsdmUzSExDOThUTW16T1hmdGk4aDNQbmVGeUx3dmFYOXBKQmJFaDhvSEIycUxqdXlNRUQ5WWZjV1NSSktrcmtkN0pyOHN2OVJlL2tkbWlqTkFaTjZMc2lkWDVaVnMzejFvRlJDcUtnWlBLU3VuNyt2UnVNcVFzeHIrVnhOL3ZrVzBRRXFDenBqcXYwWk0vRzJMaHN4d0MzSkdtQ1c1elVVZHIzMmtIV2tabERaVzVKVklKckxPVkk5YjB1SWNsaE4vVmdTdUJmK0JwUm5wNzNsV3NTdnlyVWMxbCtadmhlbDc4MFdYSTdiTDVpSVA3ZGkySjdsTGQ3YWI4Tm5Ednl5OEFJN2JiUVFiRmUrMVprWkhoS2FMSzRNZHJ6YTZ1Q21ITVRiYnRrbzNZalBpa3B2VGRPa2ZycmhVV0w3VW5TK2lqUFpWNWEwTjZDeHJsa1k2VnFmTTg3ZkhMLzZKOGR2bVd3K0tDa0pKTDRlalk5YUY5UjA2bmtkZ3ZsRDY0VGxzR1YwVjN5eUk3L0NjYUtYN2pPVlRiSlFwT3B4bWczSWYzZWtkVENaQ3V6cUN2Q2ZYR3NOQ2ZaWG52WE1QYmY1OTdPWnl0SFIyc0VKTWxKcTNJQVI4Vm1GNGFIY1hJUGZEQW5yMHpma1Z1UmJqRW5Fc2JyWXdzZmIxbC9PS3NQSTlTK1BCcVNTWVgrTExodExMMHc2YkNOL3dFK2ZldDZqQ3ZhMkY2ZW5ydWphb2ZQWDVuZVZmcU80QmZ6TGlHWlJqc0hzWkJOY0hpUjZmOENzWDQ4WHh1ZHNqazA0bUoycDFsREZNWVhDaElWd3BLNXpqbk1VeUw0YXoxSnAxSTFpeWJ1TnNZazV6YkhYQmtYUmFoVXFWbnJmenNTb2I0Vk9kdGpQSkx0b3VRL2lCVkRkOXZOQ3FzR1M1V3BkaEh5RDZYdVk5Tk81bWNVWmdkdUxWNjRkdmtHWStvUVExMmZybFUxWnBvbGlRNEtqa2JGeDBlTGVrVTNkMVQxU05TeWF3ZDcydUxtMGJHK3FNajRLd0pSOUgzOS9xR21NQ3hpNjN1WHRaVm1PdzIyUXNGRGllVEFYTm1jTDJWK0JpTUdycHlZdjNqekROazl6WXhvM0tMT2FBaGl4TXpaRWFGSzV4K1daOUlrVVErVWVpVzc2M0prWG9oS2s3Y2pNaUovaDBhVkg4TEVuQUVCRkFiWWVZSzBoV2tXZVFoVUFuaEV3N1NjcUJjcHFEN2h4V0FHdmJud0RVNnplVXpNWU1LWkVOY2xJRk1ETnBFRi9Sa0dBR0RIOXdsM091M1RBYVVSZUdhOGk4WHVTbm5zcm5nOXRqMnAyUFo0czc1REw3WWozbzd0VEVsTkorVm1WdlZuaExUWDFzc2N1ZEMydlFsT0wvb3d0aXZkWXJ2aVRteDN1dFIzQjFUZmc5WDM2RVgzMXZSQ3htcXZTY1NrRlFIUzZZY0FEMUJoL09KSGlpemdUeFFHM3VzMkZDbHFQOEk2UlZxSzFpVkEzZHRSNXRYeldpeFM3d0tMMUVzWWk5UkRZRkh0SXRSMzZOVjNndFZKKzZFMUh1RVNnOFJuV1RndFFHc2VicXUrZ3BxTmFPRE53MFBGRW5qUndKdHozbUJuNGgvQlJ5VGVXOC9tU09HQSswMDJmbURpYWpDcVlzTEFxL1dpTzZ4T0Jualp3RnR5dnJsNEtqWS9vWDhRSVI4Q2x1Yk1NU2VGSkZVNENkVUJGc3RFbXBsTW1PUEI0ak1tcGI0Rk50bnhOcE5TdzhBWXhOZE5DbThvT3VCdWc5T1dKTFdIOVNZSC80VmxNOHpSZjBwZXFKMFVzVXprT1pNSmIzTktYR1RLelkycUdTdGFybVNPNFU0bEwyQjJQUkdRd1cxdURvcXc0SDFneitUaU9VVkE3ZmdzMkNRNkx2a0l3YjEvQW1EN09XVktRVUpoa3JPZjBRdWEvb2h0SVJUZ0RiS0p2bUJhQUtpL01rcE0wd0IxdFhIaFNuL0U5WXdTbVBhSnVaTGdtTEhCTUFEODUrUGpoSndqMCtqOTlFWFFMTWUzNEUyMDVoL3FWSVFmek40Z09odTdoaTFwWmh5ZVAwZjhCYWdHSU1PUTBMY3dESXNKT1JoV1IwTzhIQm5hbzJFUWRHWnZvSUNiM0lIUkZ5QTdXNEEzb0Exc3hoOE9PdEJNbkpwRk1Fb3dkL29makFjTGNaem9OTDJIc0hTUDQ4N3BNOHk0WmV3QzhaZG9ZZGFrR1JKN004VU13MXhDRHZzYmEyWkhFNmhiM1V2WWovNmlMK2lFMjljYUgxb0s5Ry96am5wMkVtOG83ZjZJdTRjbUdYQjNFTW1BUTlja2NFRHpERGlnU1ViUEFVMEMrR0sxU0h4SGRnZk1QOHhUWm9uazBqbmdOejQ0TUpBRVhPRjJQWDBCcHBmamM3aCtQSmwveUZOQ2gyNEE4SGhFQXlFMy80aXJteVdTUysrQVQvREJBWjlPOU84eWZJTytNRDRYNC9yeGF2NmhUaFhOa2svTWhlei9pL1FsMHpTdWpjRWhRdGhCbG1GdWdUdFlCZWZWWVI1bGI3L1dWQWpvb0U2TGhQSmc0Y3o2R2RZa2lOMlYzT1cxNDJLYk9nSW41VzJSUU5hbFJ1NlBBV2FJSVV1Y2tBMno4NER1SlRCMXRWZEZRT05SU0VGMVYrNnkrajVDTnBtb2JoUUJsVmdpYlFiWTFsK0ZyMFZ1c0M5cVVRcEUxbGY1Q2gyQXFIZ2xFbE9MWkNJL1hpYm91dXpVcmVBYWJtYW94U1FNdWJKUUprdUR3OE9xODlOTzJ4Q1FCNTdWZ0dyUVYzMmhWOGoxSy81T1R3ZUJpbVBodThnbWdodjZlZ09QbVlNTzRrUE0zQUEyL2pwSndqRDNQRnJLQ05pWnBLelY3d01GdDl2c3c5c2xxMXZ0RzcxQUFpSDg4d1hjMFdPQ3FLRjhMRkEwTXpmMC9kUktFQmVIRGZVMDFLQzZPeXgzcjd1VHp4dnRFVWpLNUx0dlZ6R3BNVTdRRklYMEFoaklTdytyMHQrcG1yMlBIaU51RzRPTG15d0pTbWZ1WWp0d1JBdW56eitvZnBNNGRITXlVOHoyaUtvNnY4dWNYZy9xSUVHMkRKNGprRDZza28rVVFOQnVkNmtiVVN1a3pITlhXZFlCVG1RMXcrOWJDWXAxOU9ZQkNVNER2RTR3MnJDdGVNV281VUQ0cmFYRTBaTzlEeHArMS9XUXFPT29mdFJKVkdGVlN4NVh0aGM5aVVxdDlUOEloaDFKdlk4Qmtsa1RTemYwbHo3TjR3WGtNMWZ6UGJnK0Y4RWNSWDAzZmpwUVY2eWpObEVobmxJSEgyS0MyZ1NjSlJEdG03bzRGNGZNOWFLVTUrTUNta1l1L3NvZkduN1diWkdvclRYandCM3N1ckJNUkZ4MEg4cmE5cFYxWU8xWisxWmxYVnVYc3dxQlpuVU1iWnNsYmN2SW1sb0xhMkxOclgzcnFNMWxiU05nbFdZRndsQWZwUTd5S0czYU5SRWhOZzMwR0dUdmlVTDV1ZmVaYk1KK21qZXRxUGFneEE1b3RBYWdPcWhLLzkzUzhWKzVNNDU0TWh5MmkybjA5bHFFdENHdWEwTlVIczdHemtYdXFHQ1N1Z2NGME8yNFdyVkgyYnpYeTd5cmRVT3AzaEdNL05kZjFZSHZMT1EwcHZMeUpJNk5ZWTNFZldjNzZiay9HT1hrOEtveWM0TW9FalFPNzhwMUZuZmNOSlV5RVNLVVBRd09rWXpSVVBZMjA2emJqTXF3Zm5yTnAvSS9QOGlVZjBiMG5lL0kzTDJHQVBIbDh5TUNBakJBMkxHYjFSMjU1bHQvWjdLWUFQaiszaXQvQXZDN3hUbjEzOW4xaDJhenpBSkFRQUFHZ0FMd240QlRZMmU2eUI4azFlbjMreXp1ZUpuZUR4Qkd1Rm5Qd00ybWg1YkdoaXV4QVRERW1mNmpyNlhGTWszY2h1eGFCL3ZqTjhqT01KaU9jUUNza0k5NDZ4TVB6UXVsTDN2R3RPRDFUZE0wRkZ3bXBZYUZqTmFBRm5SSGFkUFFraldRUGNMMzJJMi9Fdno5Z0diNFcwdjNtTkJBaUJER2ZncmI5TjVSbUQ3RElTd2I5cWVnQ1VPWDVINnVnSS85RUVkbGl2UFFEMUJ3L3VMQXVUb3dpSE04SkVEZlZJQy9uZ0IvMkVEeUF5b0hzVG80M2hjMm9NL2htYjJFY3RFQkF4NXYwNkMrWU40TE5MUm5HcTdrVXJoWm5QVVdkQ0t3ZEtrVEF5YTgwRWtESDI5MDRpRDJSeWNkN0lwbGlEQTlGbkRCdjBUZEJRRk1vclpPQkNRYXFDSG9VOGpPWSs0UllqUm5oY1QvL3M5QnVCcTFET3FWSzFXbWtZd3ZueXlRVVNtaFlqZlpRMWhVWTVBdUgwUkRGQ2tqUVkwSzNTdmNCNkdhV0pScFhqMHVYY2xJRkxWRjVXYmV2SlVxVnlDKzFRVzhGRWE1VTBwWTFNeXJxeFFyRWFMYUl4cDBWV05UTlN4SGNuTkNoTGwycmxMRWp4ZWZqNDR0b2lXTGFNSFZFOHN1VHhnK25EZ21ORE1FNEpXN1VpT2ozbDg2SGloYmtvNVh5S2RYRzRqblJTV3FHSmdScGYzU1pGRVNaRkNjYzVGQlhsSGlKU2tGTytVUGlGaUZNS0Zjb1RTMndHNmFCdWtUOVZudzlRbjI5TGF0QnJWQjF4eWNURFVGbTZqRzRJdFVRK0FkcWo1UTJuV0JFYlZCSnFvbUlLTGFUMC90OU5OVi9wcGQ2VzlYK0VhVSs1UlNaVDdqTFBXcHAwcDhJcWxpcFlrcVV0NmhDcFhKVklHMzM4NzMxbmxlcUhPOVJteTlWMUdPVnlDVjdZazZ5Nk5uWjNvVTZUeEtLYTJDaWpJVSt5bU5vdFJxZDdSVmJqcmR6VytudVVXa3VuWlJLYTRpbWUwa0Y1M29uTzBFSngzdlZFYkVPWVZRc1k1MmpJT090aWM3eWw1SDJvOUdSTWozVStIeWlERHFEaFZLNlJDcVorK1FGVzJYbFZMYnBLQzNTaUJpaTdpZTJpemVZWk00bVFvS2VTVndTUHY3aVhFcmZSU1VtMnN5NVNvUTJXYTdpRHdwWjZjUXlvbHJsNzUxUnpzbDVXQkxVZmEySmtwT2xWSXlLb1NpeERiQ2JLbU5tSkpZbXlpeDBFU0pmRzJwTEp0Z1lWQ1dIWVN0c3dMYjdaMWZicWFWMGxKdG9lU3BMWFU4SGNlWHJhYjc0bXEyRHRlWjQ1MzQwNkNabTdocWxpK3BadmdTYXBRTDZta2RxU04wOTRpbkRRUGRBK2gwMVZQQWVZRE1mSmxxbWkrbVp1b3duVG5XaVQydE5CN1FRa0xvNkNiYU02OVN4TjlrbU5MaTU4MVNzdWJSMEx4VCttVlZTR3JtUEVFVEJ2WHBMTzAxaENaMC9lUGpJTmtYUDc4blhYdWRCbk9SN2hxR2hhYzJiWnhXSHRZQUNvcE5SUU9EZ0lSRUp1VlFpejRrQU0zaVdMZWlGQUZQb2NBWHc2LzVzbnJQRDlJRykgZm9ybWF0KCd3b2ZmMicpO1xcbiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMDExMC0wMTExLCBVKzAxMjgtMDEyOSwgVSswMTY4LTAxNjksIFUrMDFBMC0wMUExLCBVKzAxQUYtMDFCMCwgVSsxRUEwLTFFRjksIFUrMjBBQjtcXG59XFxuLyogb3Blbi1zYW5zLWxhdGluLWV4dC03MDAtbm9ybWFsKi9cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGZvbnQtZGlzcGxheTogc3dhcDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBzcmM6IHVybChkYXRhOmZvbnQvd29mZjI7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R01nQUJBQUFBQURIWUFCSUFBQUFBWkxnQUFERndBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdvRVlHeUFjZ2lZR1lEOVRWRUZVV2dDQ0RnaUJmQW1mRkJFUUNvR0hIUFprQzRRRUFBRTJBaVFEaUFRRUlBV0VZQWNnRElVZkcwWlpGV05iUmpNNEQwQW8wZjRSUjFFYk9Ta1NSYjBlcElqcy95OEgzSkNCYjZpdlJBRlFKWXJUS0I0aUhKOVlmR09aVkdIVndYbHN4R25FMGIzV0szUU5CZThjYnhlakY4M3JleFRoc1VGRCthbURZQlhiOWdoclEvOVVkMHNNWTY2M2NkVGk2UGUvaEtmZitxMnA4L1FaT001SHplWGh5ZTU1ejUwZGZFZEFTYW1MTzlCZGZoV2lGUHgyaGdlMzlROEVKeElxNGdBRjNJaUlPSGFLZytHRTdTSWNESEVzd0JUTm5HakxzY3JHZG1YbWRXWmtabXQ2M2wzWEwyOHNHOXZhMXZWTC9VOWJwWG9KZS9mUWx1R3JmcWlacTdvTWVBQU53NVo2RGRMUTFVVW1EdkU3UzU2TXZhRXA5cFV1M2QwRFNmL3l4QWp5S0hkaHFHNGlNOG5BcUFBcFdLYnA4dWs4YVpzdjAwWDd2NmJKcTJxdVE4d05pSFdKL3IxTklkbXVFY2JtcDZBR1I5UE0yVFpibXFTVmRKTHV1bjMyOTNOcVo3VVNPRFJOQUg5Rk5OQUJOQ3dJaEgxUjNGWlN0anVid1RraUdoWDRmd1pGRERycE5DV0tSR2tTOU1jeXVEVE0wL3lsb3RRdHcrakx0Q1RyOFBjdXc1YkplQmh6MzV6ZlRxanQ3a3hTVUdjY0tWc0FWSWZKbU9SOWw1eitBS2dPRU9IZnRwWGs2UzM0anNtRUNaWlBNdlRxNVRLbHExdnRsNjQ1dWJIU29RMVlBQk9EYjUzMFRWcTNsbElxUUYzektQQW5MSUFHb0Q3YzhmbHNXcVhWYXN2cUFXblErenladmFnRENqS2lKTnE3Sk9uNjFhM3VxdXEyeWkxN3Bsc0dXcktXSk5zTDBxQWt2MzBlKzJDUmcrZ1FqRE96bmdQVE1tY0hBQmxSaGtGNmVieDMyVjBRcDJpZWhDNnh4c2J3WW90WDBkM3ExTnlpaWpKejNzNGxkRVljeVlwa1F3aXU3UDlhbGt1Z1NjMm9LQTErRTN2dEdGT3JpV1IwWlE1SFJCQkZaUWtubXY2L0swQWhuZjM2QWxBMkFuQkE4QjRLUXFBZ1JKc2gwbVNDa0NnSXFZTEk2VURrYlgrVXdyUzY3SmE2WTBIOTVrLzF0d2Zxa1pmcXJWK0hINkRDOHNid3hVUzhOQUxNK1poRGdQK2JCc2NaWkxNdGtvWEFGQXlncjZaK2JVbHJHUHhuaEVOMTZtTGdmYVJhVVlUWm94UjU2aDg2TGxkYkNueDdma3JlZm1NMkFlQzI1eVJqMW0ySEdQR3N6eTZjbEozQVg0SStFNFNnLzdxN0VkaHhKOHFLZ1NOMGd1N1I1UVBVQUIyaWcxSW9HSE9SbHkvbHVPbktNWDYwdC83MXEvLzg1bisvbTdBL2JvaFFTWkxseW5QSTRlYWZOeVNZVTZiMTZBVUIwNkhUSTQrckwvamFaei83WiswbFNsV3BCc3ZkYVJZY0tPdmtlY0FOMlUxNWMvL1U0NnpsTm1CUnlXbFd2ZVdPSEJia1FJQ1JSMDNiSjZQQWxERnRCZUxXbjk3dVd4VURZRWt3cmRKVXRaejNlVFdyZ3A1NW1GWUZnUUJ3NXBFcUxRU0ErTk9qQ2dnT2xERnJKL2NCcEhBa04ycEhWT2dzR1NqYjVnU0FTSEpFSlNSdmdma2kxeC82YkdIQ0wzaVJHN0tvajU0NEdNZGpLZDdFS2xTbmtKU3hPTVI1UTJlOTh6N245NXQvZGtzU0Jna2poS05FbTVHVHE2cy9zSFR0RUVaZXlFOWFEOFIzOFh6YmwyVGZDcHczY0c3WThtN3p1M1pZR3lNbnlsWURFdi9FTDJuT0o4czVDVXQ4L2o4YlB4dFBBZU9UWTgrbjkrNXZ2eDkzUDNWeFlmSDV2K1AvZXYrN0NNQkhqMnVvZzZtWFpKendPejR2dmdvZVd2TEtwNHBtVVF3dzlES1pEdzMwNStKbEhoZ3hmWVZ4MjFuK0FuQ2ZNZHV2TGNPYStGR1VWdGl2MDVIbDBiK2h4QmE3Rk9td1c0MUI3Ukd1eFM2SGJQR0tYbld3NmRYWVpaOHhKenBMOWJyc3RGK01qamgra2g4MkxrSUZ2MGtJbWZkUTkwQlFjdThQTytvN3piWVppSEFWR3JUcHROdVFPcTIyNnY4NCtvUlhxbTIwU1crdzZUU2tyN1ErdTR6VVMwTk5NUWZvSGtyN2hwR05FbmNPN05qZTFxcHZhVzVxYktqZldMZUJ0clpHVjEyMXZsS3JVVmVVbDVXV0ZCY1ZGcWp5bFFxNUxDODNKMXU2VHBLVm1aR2VKaFlKQlR3dUp6VWxPU2t4Z2MxaWV1RlI1bVkra084dHpPTmM0eFRtRkIvd3gxbThsQVhseDNHUUR4bkF1aWZvdEFRemRLWS9jczJHTnNack5qRGdxdmw0V2x6S3pFSFhpMXdkQkpEZm42cy81djZ3Y05TVVNkQmx3cVJ3YXRrN3ZQMFdnb0tJMEdEandGTzkwVG1hck9tcnh1WVptUUJkRXM4bVlJb05HWjN3OWJaRjhIT0lUdXNaMDVZTnU1VldsbXc0cXAyRSt0M296cFJSR3hSUW1hdm1lZmJpTFM0UlpZV0RGOWErSXc0QktUeU1HWmZ3aEwvNHVGMEIzb0lJVXZGODRLUVdPTW02M0RKeXJLWTBNV3NrZVY4bUYzR05TMlZUclNTQ1d2S3pIN3VUeVQ3MUZxN01WWFRtSC92Y0w0UVVoSnBQVjhNa3hOTk5qSEF1SWU1aVhxdHF6VnBIMHNZTmRXbmM5RWp5SnhZT3paUUlLOTBtbHdaQ0EzbTVUR0thYWpWcTRHMEdVK01OZGtNVXY2N1pzZHhSbDBBSVdGcnJJSUZTRm50eUlNeWUyVGRIbEVNVkNaLzVMekR0WHdUbElQenFZZzVTSk5KSC9aY1kvZkhMNmJJUWYvU3RSWWpxRWZ0ZFQzQWdGZGYzVnEwbjlITy9lMy9oZm5YaEdDc08xQ3BxNnc5U3JUUVRkVmpXYVZPR0lFVVFIQXhlOHoxaG5KSkJtTEhER3dqYStGSDVSaHdNYTRYa2VLWFpwOEtyc3RsTXVYbTlMOEd3TURPMkdwdW1kblN3b20vUXNwRHplMGtabU9vdXVCWE1Bd3l1UnQ1Vnc4V013SjMycEVlQjhwWTBHSVNJa3djRnhZbVlTc2hWOWtnOVNralN6YVQ4VlExcHY1YTQvYkY2SEpQRTZnWVdDL3hwYm5LVGJqNlhHWjRUd1F6Y003MzJFZDRDaGlPNFg5T0pRODBZZnpPclZxaVpvTU0ycXBYK01KazM3ZURDUFFpMmtNUjFWTmpTY1JGbjUya1l6VWJpYis0M0doN2JiU1lxWTN4NHNCcE56Mmh4Sm02em5pTXRZWWJnaWdDOWZBUkZnWDl2Sm9VVGQ1YVhQSGJKUEpFcFdrUk5DNjhsWEFpN3YxR3RaQ05SRTdhQnlRNEYyWHVrRnV0cGJPbXBlZUQ1RXl5ejVtclNaeE8rOXFpYUJOeGp4VTQ2RGtzTE41ZFc3TnlJZTdCZzVBd3R2YjRFMEFVWjQ4eVFRQmhKamluS3ZaSjcveUdPRkdoeExaSlpDQk9Mb3JWckRlRHFGZ3NEVFZUM00xaldXUFUyZmJhSWFKckV5L2tlNzFsT3JVM2FYR3o1YUNZNkppSE5qaXBhNzhMazV0cDRjQjNZSnNabUFyMDdwVndkNjVZZWM2Y2pzYzhaa0twTE9hSXVDcDVDMEpCdVpmU3FpVHl0bzJiQjVYcURwdVFIaFd0d0ZLVTNMb0RRZmdaZzlUbW5jTVhtaHFqMElvVlN3UGEyZW9CZUI2aVEySmNNaGcvZWNpd2pDQTJwdXd1V0ZadVc0d3BlS012MU9NaW9peWVDUVVGbjZDWWJUOUlVWWtTckRaWUU4LzN5RitKSHdsaXdFT3BNOHNXN0swT1hNSllyaDdrV3MyRFpVRTR0a3JPSytvWVdFTjFBK2Z2Y3ltUTRpcEd5N1Q0YWF6YU43YXFJSFhSczJJenJiWDErQXZRNGRLVkxhMEtFdS9XSXFPU09BVFVmeEo3Q3RieVFnSUEwMVEweHhBUkdFdzRScUcvaTh4L1J6ZWZyQ09FTmtybGNZZFlaWHZXMHpWREtyZTRTaDlocTNYSXpCTW1Zb2k2WjRuQkRoUzE4d3J5dHltTUtOajRseG9RZjd2SmNyWDZzdmhDVmg5THpKdkt1U0pmSkJhN2JnOENCbVlDMXRKa0FtOUdWTWtOdDhUVzEzUTVJZExheHRPeFd2eXBPcGliUzRoZkphSW9sZG1maENLNm5UQzRJRFROcmljUWVwbjZ3U052bXlCeFo5SllFL2c1NFIwU0x3cHprY0tTaExsemtBSnRkVFdnME5oSjZyY3cweS90Qm9GNFBHT2krRDJVdFZpMklNSVJpSmZOK0owUDl5Z05pTytqcVhDcjRGNExNOXU4c2lETXlFVm9aTEhaRVJmbnhVVHpEWTBkWTl0S2xBd2Q0cmgvUWFBbmhUS0ZXc2UrV1J2VzU3WW90cnkvbW8vUEFHakFPU0hWQ2NXQ1BiWllRaFoyY0ZZUldaRG1KSkJJSEJGUHZFVndKc2MzSXR4VVp3QWtZRUYwQnZmZnRiVXFucXdkKzlEWUs1VDJKQ2V3NWtOaXQ1ZFBZaVhWR3JqN1RsWjRqcGU3Q2t1Q1FpYVZ3YWdGZGJLVWRZWXRnNG1yaHAyWFdyZzVKbnZ2SnYvU2FYaldMU0treHNPd3FrMVdlR2FiVkFwaGdoYTJkWmhQQ01ESGhIa1ZyeDBNbldvRnRSZjZoaFI3c0FyNURtempZMWtqSk1pWDA4bGt1REE4cVlYSzBpZHVxMlBaSWFjckIxRDFSRHVoRFdIY2xMNDFKUzhjRW9WNkowOUNQOE14TEFLTUdsdGNLb1R4OU5IQm1xeFdKN1p6RVNmY1M1REd5Rlp3OVBpSEc3Z3FGVklCME1IYUJYeEtPOUVmZGdsRGYvZ2MzRUVCMXM2M25Td0ZiOXQ2RURYa2lCY2dac3JnbTgvSEYydE10RS9jdGhCVDloN1JxbUMvYTdJUnVONVRFekx0end3NXl4YmVLNVc5ZWhjTkxFejJQNEVIbUI1UGhGbm1SUEduQkhGd2s4UlFoNHRWNmgzRnZZdEFmall6bkdSZU9jOG9lcUFkdlFqNy94U2h5Qks0Y1VYblhBeWZMNUJrT3FqQU5WSHRYTWhHUDhqTzZYTHh6NEJUZTM4STRseHcxNXg1SWpVRjMyblpJakFQT0s0NG9iaDJENno5ajdnSHlBM1Rlcmk3M3IxdHBna2dyZ1g0SmkveUZFVU5KQ2VQOHBhRktHQjY5N1Z4bUFGeEMrMHRlWW04US9oK3BqcGs3SUlVZ3VZOEJ5Y1dpYVZ4U2RUQS9FZmM3a0F4T2xjblJsRTJaaWRmYUFTNXQ4bVdtcjNvQitoYmd5SUZ0YzlyZ0RUMEgrSldncWwxdXFZektNQnMyQ09HYmxjMExIa2xDVGxRbTlvRDlwMnN1QXc0aTZCZGRSb0lkMW5HK3NpY0E3Z1dvdHdETXB3RGtVL0xyS1FHdzc5b3p3dXRFN1NSZm5KeWdIbzQ5eCtadGV4RmVHdjc0Vm9ycEZRRld6QlFzOHFhQVhaUnJOR2JjZk5mSFBoa0RDYXF1Z0JEVWY5MGdxaHZ1aUh6Y2dyUUl4OUZZS3ltajhxOWs0M2ZlaFVPUVRjYWhwWFpscjB4N1MzVXlidnhtTUFkelZSbExHZXBRNUkyZTJ2M3RPQ3FZRmtKY1ZGSk9TKzlmRG1aMGZoZjdRV25sV2JIQzRlaElZKytSaFd1RXVQRWhobEtrT29UUVRXWWNCeU0wdDB3N25tdFJMVm5uWmQ2ZGhYMnIzTG4wVlNmcm51bjlZRlNWVVg1TmFGQkVKdmRXZVYwMnVRb2RMbklJVlpqcGc4aVI5bGNwZk5zWTlFWWppRmpOL3BmNDlZZVFLUnF0NjBCRzBsS1IrNUtjWW1za1VIUFlNUWo4LzlDOE9zV3QvRUJIUnRNMmtNbHdURkpNYmluVXZMNlgwdDVBNGZwK3BuWERPRnR5NFkwQkRZdFo0bzZXOHVRYVBTUUpOODgwYUFadXNMekRXSkYvRFZYM2Y3K2dNNG45cWo4VXZzWkJmclJxckZINGpxQlJhS3FoaDNrZHJveHdMS1BDbHRRc0ZGd0pjSDZhTEtYam1xZHluMlZvR0ZTMTZxS3EvOFRhdWpDQmVrWkR0bno4ME4wUFkyVDV2eVV4dm9QMTVUQTF1dWhicHNOVjlNaGRLOEtKRGZkcWpDK3hKYkx6YURQemhPNFlhSHFVU1FQYmVrYmNjZHhrcFBpTWZrM0l4ekpiQm80SVV1Ymx5OHFCRnhVVld2eXFTcjdOdldUNVFRM2s3SVhvbkNhU2pqUk5NZEJpY3oyZDNxK3BaYUZPcnN6TFV4MlBPa1lMR2JtSWJnQXJoeFNxWlBSYXFpRXExR1VQWWRueThjRVJ5d2cvUUNKN0p0SnA2UDMrNFF6KzVvT1UzblBQclJCN3NsRkZYQkVIbE9OcXZsM0Q2ZzB4WkN2TldLRlNMbkFjRTVYYzlNY2lkQy9ucm4yNFY4TXdRWEdOMG5yYUZyeFNZclMzR2FvTFh3eW9POEorVmtPbUVXMldvV2lkTTdSN0VpckgwbHhOcU1aeFVxQUxRSTR3RDlRaVVLRzhFT2VLOHdlOUdua1FCZzd3S0xqTFllbVBFMUxRZy90bDZ6NFFIK1VabWhMdzIxU0NCQm8rSlM3cEhwTU1neG8wTStYMW1aQm8zWGpSS0cxdG1WQXJ6VU1OcXRFTDJWQXpsWm9uR20zcTN6RTN3R3JFNER6c1JTcmYvczYxVkJKdUk2VEUwT0UybkhoM2kwUWNCdlFmU25qaDI3UFI4dk1Tcm5USFFLNmdMdCtqbCtTQVJlUU1XM04ydTN0a1NvNUdDNXhFd1pTZ3pJN1ZKanFYTkx0RXk1eWV6UmYrQTRSYnlNUS9NT25hSGo1cTRxaFBuMXVUeDNLcW80bG1zc3Y5dFlCcUJEcm1uSDN1Q0NiNjEvVVZMQ25FVWdQQ3VSOWlTY1dhVTM1aXNLKzhrVGVCUnJ0N2E1NHFDeUhyM3l0QUlDQ2hoSXhiU3ZqdGgyYkh1U0IyR1RjcVg3QmVFYTNiejk1QlFvSUNFZzVWQUdJaDVvRE5xbjhyaEQza09PYndXYnRYbnlCdEU2RjY0WXVCMHJQNWdrbEdJZGZVSE8waEZ1dkxHbTZIT2JjUmVYTExmUWJic255NFdyeTBETUpISnRXV0VYbEFCOUVoUjZuREhGYnZCYU1DamlpYUxZVHhxbEo5ZUJ3VEFnd21uRWZoS0h0ZmNwVDdRa1diZ08wRTRtMHdKcUZRMURuSXgwSWpyVmgwc1d3WEc5UXB4T1Nzdjc4U1haYm1UT0hkbjY3Z3BNdXZrSWg5K3h3NlVPbVJtWHVoWUpCZDh6UHd3NS8rRHdoQkVkQk16c1o4dHRKUFpDeGt6WHd1T3dmMXpSZi9PSzNFVStncUN4dllWSWVjMmtxMXZ2Z011elFpVGpPa0s4M2lldklia3lJNVZ4WW1Ka3g2eW93Q0p1cDhTc2hpMFZLMWk0UGtuY2VWejFYRWtYV0Jnb0VjMkF5SEZQQlRZNWtuOThFRGtrc0ZyY2dkYzZuYXJsOTVFMXBsS25aVXF4aFpPMHlzN0J4cXZsaXFkV1o0eE00OUoyeVl2UVpxSFJtSHVHS0tpZy9WdGk4Q0lLMzJ0VkpYQVAyN29VY04wekVqdDB6Wm1XWmg0VVdRcWRmaklkZXRucEdKTUsrTmZvTXB6UURRc0JhTUozbTZPUVFBWGZ5RjdBbHdpSHBmanJnQ3NVNys5T2hBaVk2MkJZaWx3K3ZxRG1vTUZHeTM0ZjBPR0IyaXVVd1VFOTluUElFUFVvQ21naG02bFRpVk1halRqZVZVTmVma2l3ak54Vy9kZ1RRK1liN2xkVGZJQ09mV1dNVi9XeEM1TmZlTVZZUGtFSGVaUTdsd1pKbnZUckdSMTRFNk85TWU4WGVqakdlWU5MNzFBRyszakNMTDZ2Mi92M2hUdTd3cE9EMHpVNFdvM1NmYm1FRElxYmRxTGFVRmc3R1FNb2VtR1lvN1lkRFBXN2RFbUZuMnlsNkZ0bXFDWGY4RE92eDJxYkU4Sis4ci9Ed3Vieml4WEwxOUZyVnp1RXNUUnlGTWEyY2FXN2E3dEFTUlRtU0psdkQ5MEI5U2tHVTcvdk9RU21ETTFoSVVzNURzb3dYZGhFSkM2Y0NBU3pXK1NLa1NZUDJGTnpNMnhVc2FxYWMwdTVOL1A2aHV5SmowVkxuQmNsWTQ0MUo1MzJWbUszZHhPTVBtMk0zVmt1R1MzNE5sVk5uL2VYb29ESlhHZi9acGRodkY4TmQ5NExOZmZjdzdkRG9xNXQyaEEzNmVsbTBhOHIrYjFqLzQ4eTBLbWdqZ2hzUVZkTXpybGRjNnRJTnZRRkQ4c3RyOWs4L2UzNmxIOTNJK1BqN09FWjVhMWk3U3NqeVZuMktKUnluU3RtdTF4WC92NkV6NWMyUkRXMndtWWozTjFrR2NBNEtxNHFxQ2dUQUVyNDFiRytRd2ZhRnllUWpuWTVHWmlNL1FaVGFDRkN6eW9sVVVBWGdtZWRUMFdlM2puMVVJRVFCaFkzN1RPbk9pdWZZK2p4QTkzL29tL1Z1ckkrbHRHM2dBNllxQjFaclptdzZhbkU0YXRTWEtoMjBIcGNhWUQ5TGg4eDRTcHhpd0V5YUg3TTNzK25RNFNSZUlMNi93ell6aTRWdmhXNkNNNDVoM3FjMXppbVVDaVlQcllYcEk3SlNkblZUOTF4RUJldXc2dlBERUNXbXVTeGJZamozbzR3YWRmdjNLLzNRZkwvYjR3NTNKZng1ZTM5VENwMG44Yytmam95Wlhtd2ZYUDFhTThuQTNYSWRtMTEzc2t5ZjExK2F6Q01jMnBFdjhobWdWZmc3di9TYmRLdC9Wb3BTck90S2NZaXEyTjlXZGY1TS9udHhsMCtJeFM4aW4vSk5RbWl6eEpERW9JUWtwRFhGY0Q4K3ErQ0paZkllOHVlcjAzM2tENmg4RHkybXlOM0t2L1Q2Q2NKNGJLZFluTUpKWkU1TkZMZ3ZjcHhidHdyME1ubXFIY3FIdE5xSkhoc2tkTGU4UTdUKzRVRDAvVEFUVm4renQ3bFp1WkVSMFY5U2hhcThhN0JpRzNLdXIxWkpoVzRpU2tzbW9kZWdDbTZ5MEs5OXk3RVFHbXNVSlp3MWFoaTVHeVFNWmErVFdLcHVNV2t0QmdMc1lMclRPdENtZy9zODYxNzREMS82ZHhXRm5yT2Q3aVY5R3FyT2dMaXlRNml4bzQ5cFYwRytTN3l5TmdmSWI1TXV2Zm5JSVhJem5iK09iT3JZUy94S1dwYWsrWW04VjVuT0wwOWZ4NW15dFBRWXJGMTlmdnZIc2J2Z08wLy9Ma2hwZDE4bjJKR1hzMFUzK04vcWY2VVU0TFQyTHgrZnRwcVM0eU9mVGZmOE1zaXV0Tk9vMVV1ZHltYnp3Mkx4V1RaR3J3bWI0V2JYdTI3WDVMZEJsM1dIdHFNK3JqQmNzWEsxYkZMY2dNYUMvb2l5a3U0Q1puTjNyejZEQUdlUUJEeFRFNXN4ek54eCt5ZU1DVjBkT1QxZ3l6MFp0aUZYNkE0bCtIdDVsT1M5T3JDSTd2S3RUOWtIN2lZZGw0NXNVRmNjR0I5VkQ3aDcvMCt6K1o3MXU4WERmYlZoRFYwOWowZmZrZGVTWGZLOHA5OFpSYUczUHQ0dFhXbUJMVGZ0L3pkQldtT3JHUWVCYklGbnI4UGpGOCtWRHZZcTZOaDN1QVNNemdKNGdaSGlsdVN0SDFEV0ZZejlrOU9KNUp2Rm1rNjI3SjN5MGRnTHExSmNiLzhRK3pLM0NZSklUa2FIbnBpL3MzWG1GdWVCMnJXU1BseUF4MEJ0TTI2VHNDMDEzRGFDVG82dFpaZys0WWs1QmxvSXZGd2dGY2tVV3Y0RGloRUd2RlpqMys2TEM4bGhWUklidWhGQTIxZlVicmIwNlRTZVJGQWpKZzFWSUdwQm9yQk5hS3FWSkIwN0c1MGFKUmJuMGVFWU9YU1RPaVVJeFhnU1dJUlBlSk5CTlNWR2llTVVZYlVHWk1ucE1Cdk1zRXVkRU1URHZpWTBUQmowZGJWWW5oYjJnaTFpaGd2UXpEKzlWNThSY2FWSkpxQWVFMjRkN1RrTkkwSnB6bHk0dC9PYmZYczNUaVhXSzhZTTBXanZYdFNnaEtGeVVJL1NxeXQyUlB2UHFzSEpRc21xSjlOb3hEa1dBcFlrTUtWNjBLYzJKMzRJSXpVelBYcmROY2ZZRTFyOHNZWVdzSmlJMm9ZbTJMWEdobys5RzBzYjFWNUs2K2xJWHRzMDBROTdyait4OXA5OEM4ZVBPbEZMN0ZVbDhuanpKdDcrMHpMZEhrY0RYRlEraGFEQ04zUlZYak5ORE9UcWkxQ2t0MXIrWUUwYVRQdkU1czhZMFQ3b3gxQ0g4WXJLNmNNOGQ3cjdLWVNlaHk5ZE1yNThET1JuSmdXVGNTMFZvTVVWRmJzMmcxMlR2ZnJQbmxtcVdKS05rL2NGMzdhRWt4OFc1dW1OSmN2OWNUNm5IVm1IU0JzZjFmL3RMYlY0OWdIZmh4UEo5OU13RFhkaWV4aEZGMm92THI4SWVoV0hwN0NpblJEZXA5TGxYQnlxMGlOVklaRlovTDh3N29hQm1rVTY2VHZOK0RzS0dpRnJ6OEp2YzlqanJTODFLbmZSdWUvRmJOQmxOYkp1SFVyK0dWNWZ0T3F4Ym1LWTRSRFpLaWVSSGJiYmpOdGtWWStxc1d1Q21OQnU5WTg4ZC9Tc3kyazJLbGFiK290MzdsMW1NcTdFSXZlN2JqMXFXVTkrU3QyYnpyc21Vb3NBazg2RjM4WjljNlZsQmF6TnRNWTVqbWluNGhTZlBZcTk5bWpCM3NLcXNZM0dqdzhNRTBhdzRRVXhZT0RlbUoxYlpFaGttSkVJUytUbUtKQVVUYmVmVzhZclM4N21GYzFpNFdDVXFtN2MrK0o5R3YvRTdDc3ZpeHVnMWdhV3owNWlyZTBKWUZpSmw1OFh4YlFuK3Zva29OUmNVU0Y3MFowVjRmVFJzWHdtSVFhNGdkUUdwdEp5YTFIcXlWNUNoai9GZitKeWZ1bkR6eW1iNXI5OE9LNWRXbG9UTi95NitmWDBvOStmVE1qd01mOUs4VVVJOFBxUDFZRkZHbTF5VzR6RUR4L2RHTWU3S0lBbzI3TTlQYThyTnpYYU5QNWxoMzcvei9hdllkSnRnNXp6bm93R0o0NjY1Lzk3TDE5bUZRdlNjWVh5MHB2M2UrdXJGdzMxM3JMcFpjWm9zMFFULzRGcXlEdnEwWkZJWkVjeXFyRDNlMnB5RFNibDdkRlZGQS9kUzlzUFB3WVdNOUpnVWJqOHAwU1h2WnBydmIwSGFpakY2V0V3TWZUejZlSEc1MFJhajRsd3VNems4T2xvV0VDWmp1YnhXMWxTWTZpWkE0Rk1nV2h1UTBFU2JhVGI2MERwSzEySVlzZktkcWpnWk96RjFvUjNqU3Y0V3Y4RlJGY3piVVJRbWlHTW4vT3pIYmFXWjhSc2pmMC9Nd3V1S2gzNFk4b0l6MXdYT2g5eHoxTzVMQkptdmhZVmphN1ZGb0pZd3hQc25mMlZldEtZdE1DRGllc1JCLzRPN3IrOGVkMi9QMndiZGhPdVQ3Um16dDc5UHZkMmIvSyt4Z2Y4KzhMN3VTbmpoUHZrNXdaS21hVzFRUkVZVUt5Vy9YTFBqc1NSSzl5U2tiWUFURkNTKzJNYkVSYWNwMDllbkx3VmZpcnNVZE9uMDlkT1UvdisrNitLbTRqeWRNT2lERWRjanJBWG0yMzJ0dzNKWlZVU21ibEtZTjlXNWg4YUZyME9MeUllcmJ0UEc5MXpmYzlEVmd0cG5UOHFVOU5ScUhwT0VIZW5JNE5La05IY0VSRWVHZWNjTEVzTktzT2JtRmhiVEwrTzl5aStmTEwwUURPdEkwMTQyMmp2S0E3Z0RmN0c4eTY5TWwxRm9hb2EzNXNycHNnSEhtdCsvNk1ZSmVoN0MvaDJUaDZBbTUzajRDYUN4VkcycUdkdGtKM3hIeU1CZ3BoTjZFNUp4UDZ6Yi82M2QvWDcwYWMvZHpzUUczSDVKVlNJZDNqeExkL0ZueHl2ZWxHU1daRmd5M05hNkRwdDhJNUZoNlpWVFhYd2xhM1NmakZqV3hSRUl4WTB5Q0QrdmZNN3oyeGZPKzdUeVNVaU1lWHV0dnlKZDFtRGl1UlBPYm1tSlFFU2g1Z09OWEFsSGc5UkcvSCtaTlpjeklqY3FWYitjeDdGaXNpcThjKzN1cFkwR0pKNFhLM3pvM09FVVptaHk1Q0R0ZUdmT3Z1L28xWGw2M0czbVA5NGNLNlIvLzV4a0krNGc2NS9uY1ZhK2tYNzIyWmtQSHozY3AyU1A3cGMxK3lrYTM4eDJDVWo0MjlhSzBkNFJIcjh6Yzk4UTNSWFVNRndsYURhNWJOUEdzc0tldWxJZit3UUpYdUdhWEpCZ1Y1VHdYVXEzZ25EQVcrT2h6UkZqeGZoc3h4UnB6bVBxR2w5S0hvbmlUeUc3SkRhaGJrYkhSVENTeFlpM2lRSFNVRWtBMFdPOGNBL00rdmplTWgrS2tSOUpSdkdSZVcxanFVUGpWQW5sUGZWRjFYTkw1UUwzQ0FpbU9yRXBjV0dPc1FnVXlFTkFWaExuSldXNUJZSFlXOWtiMDVsaW5UaG1EaXZLVldXVm5iV3pkZnZ0YkZhcHZsK0VuWXZSS1RIVDFwOTlDeHQ0TjMzL2FNMWpxZnJ4TzhOM0VNRk1zbkdlY21CY3BENyt3eW1UbldQc0t6bkljTDljcS9nZ29mV2FWblJmUElSQUR5NXdnaGJicmJldXBMeW52bkFicjVMRTkzVWczZTUzMFlkS0libmY0aElmazFLTWhMc3R3RGtVYlVLaXhDMklsT3FjVEVwMGRuTnV1ZEp2c1hmM2RwWHl1OEluZXlYZzNmQXRWNTBpbDRtMlgxSTU4Z3daTCtzUTlocTdnRkZTa29NMDVoZFZIWjZzeFBjK0VEZE5OUGNOSE51S01UNkd2blpxcHJQNjFoOEZmYkpCL045Mk5DQURoN2I5OURhM1l5bFM3aE5ScmpMR2IzTVBhNmpkVUNaazVGV1MyT3gzUVVVS3JUUlhMU1hwL04xMVVCanVXckZEQjJPSGlJbC8vSUZyZG15MnJkVWl3MlVIa3B5TU5PY3dNZ3gyZWd1Ymd3OWdscERrWkRkdDNEL1p2MUsyRXNWMVdIR1lqSVNIMnBqZ1l6dW5uYVZ5aUpKSEtiZ21Gd1pia0p4ZGtYODhYNU0vV2VDSzVkR1RhbitFMlgrT3NVdGx1cVRUSmlIVVRCNVAvaDd2VUJ1dUMzeGM3aHFJWnUvdTVrUk10TFl0cGc0Rm1SS0JNR2kvQ1NkanQ3U3J0TVViVmJTdXVpWFViVlJBSkNzMmdKcGtuZjJUdmdiSHl0NjJOcm0zTWFxbmVFU1o5cHpTY0RZeVdRYVgvd1J2U0RRY3pObXkvbGlHZExLMVBrTmlUN21DeUhKczMxMmZ0bWVNdmZIdzJmRWRMWW9yVndlNllwL3h3NVFtbHkvR2tCTDhnanlTb3RrNUpPRnhGN0lTalk3MGwwY1V1azg2dGxzbG9maVdxWDVJYnlVUk8ySmZhRk9TNVdpYlRFdFJTSE54ZlZDY05HM1FTSmY1SHZXT3NybWZHL3dIL0wxeGdTRG5vVmNxdWppR2NwYzR2UG1uaGtCbmp0Tk03UEhDdDVZc3RtY2FzZmRkNnhhakdYKzA1UEliREVZY040YUQwN0lvajJ6eTJLTWROUnNJV3gyM1ZGTnpSMXBMeElvZUdXYXRvbEtkMVV6S1hSUS9wRHRQZTRoVHExUTVuaDA3RHZkdS9WM0hSYlFwK3AyVURPTkhLRUZJajd4eWtGTm5SWHZ1MVdFZFdzUnFJRElHUjQvNU5zVzVTU1N0a2hERHdXdFpKQXo4cHhTZWpHTmp4cHpBOUNSYThOMEozUzVlc1lqL1JtL21JbWhidDViWm1xL3ZnUXRhTXdyZDBQMzEwdVVXMk11bWZic1dLM1gzRC9YZE5tcm85bHhidlNVKy82YkVvK25TT0hoRktWd1h5YzdRVmpqNDZlZEczc3Y2RGZZYjd2OWRoajZjbjNGRXQwbjd3eXUxb2N6Z3d2YzA1dmdlOTBucHFxL01sVzRySEV4ZmVMeTBqaDJhNTBCWDFETWl1dFYxUWZzTWZaK1FHejFRaXB1bGpVbkM3YVR5TXQrWXNrUml3TjczcGVLbEVTKzdyOHRma3hLdFFndjdVcFY3M0N0YmExcitqSEhyTXovNUMxbWRMQTZ6WTVuVmZqMldpWEcyMEJ1dXU1RVAveWdJMU10RUxJUTVHMW5KWm03UjZCdlB2cEVQTDcwTXRsRmtUN1hsQ3dYQ0dyYitjRVRkclcwbFJWbkJWRjQ1UlVZSXFTd3NMRzZ2SmFVaHh2TUZwQVZ5NTNkd2tTYU9IeWh1T2JJQUxaNVo0MTRlNG4zS0RVeHVPbVBNd2U0MTUvOUQwV25KOFMwbGxRZmZpU05MNVo1TmRWWTN4SEdMeEFId1ErNTJ6akZHRGwwb3pvbG14T2RHaTRXNWROTUo4Tms3WEhyUUtudDdlRG1FODluMHpzYW9QT3dmOGNGTkVQbUw1SjZmTktaVDE0dlllYWZxM2RPTExzVzduOXhnVThSZDJtTVNlOHF1RUYyU2hJUjZnQURSd0puQVI3cUt0N1I3NkRyQW03TmVUYy9hRGhiUEQ1V0FRejBWQm1qVFZaLzQwc1AyS1kzbFowNEhkRkNSYk1OT25rMm9Edk5zcEpzekFhdk5iQmVOVUxjY0hGQzdQVnl0Z05xSHNQeU1xK3hZcERPOE9hdlhuTFZabjQxS0R5NkUwNXBpbS9RTWxac3NPNERoU3BFbXNjbVNyRGtiMHRiczF0WUNqQ1lzK296Z0kyY0RRT1lGNy95eUJqQ3FZRHdiRDBGa3hLVzVIb0dHWUhLZFgraHkvbGpjWkFQQXo1enBFNE9LNUJwV3ozYWR4NDY4WTBDcG5WOHZPbjBrMDlvN1owbUNhN0JnbW9ZQmRMcnFuQ3E2MlhTNndCZm1aUW9oaUdZS0Q4RVRTZUNoamlxQTVya1BKaE1RcUlqbUxWbEpKSFJQckZLaFkrMTJYTzZIVm00YkE2elI5N1pPQmwxYnFNbEpXMFJJSDZhUVFld1NZUnhnaEF0dVduTHh2QThxeGthWFlvTkRnQlhDRTZ0cWM5K3o1ZUxoVm5MRkJXbFpqMHh5VFlkNWZUR21QUVVZR0VrNEp0Mk9yY0ROaUsreG0wRWNsRnppcVo0aXdOa1VYaU9HRWVRT0gvcjgxR254dHFONStuK3dTSWtLd0JkcElzd1p6TnJNR0ZFT1p1em84Y0VQdUtJWitmYmF1cWwrQTlEcTZvVkFYMGZQNHRSeFdITXhqenh4aGF5UVJwN3BQTXh6Y2M0OEY1bjZZblI2MG1TZzJBbzR5dFlMaVg5Skw3OC8yTVkwckpPa1pBczJKME14Mm5qa2t6Yzg2MStiWjBObG5nMmdaMGljdmRudndUZmxQZ09VYVFGM1ZyRmZFU2hnLzdHc2NhendJc05HOTQva28wSVRrNHduTWRHclh2dWt1NzVJODNpVEhCVk05Z1Z0SmpHR2phbGhUc1RsaFprZUJrQmExTk1NRXluOS9QdHArdGZRakFJSXdBYmtLM2xGa3I2dXJtTlgvc3EvQmQ4aVBjUlBYdEErVSszQ0hoaWYyM3JEcUtqalB2WWdER1BMZUtCRGRNVnBwUEp4aFcwd0p1cHhoYTNBMGVaM21oWEUrWWdvNmtuQkVPQXd3N0RMM2ZlOXpjMVdySGpVcWVCU2Z6dm1GQzNzSW9tQUhERzJ2L2ZkM2MrWDZKLys5VnY3UDErOVgrMWZ2LzhjOGVmZy8yV2oxY1YvZm9WL2xnc2JESWo3eXh4UnhrdlpYS25reWpodnBjeDI2N1hNeTVXcTJLUGJUVWVDNzRhL0twSGFHWEJ4N1VxMGdENmJCc3JwMks5SWpLZzRLQWF1YTRjbXNKYnJlV1djWkhPemtxa1kwSlVSN1h2MDRrM25SdThYVHhzYTczWkxRTTFFcG1KQVY4YUlacGx6czhFUmU3MjkxdVg3MmtJM2JFaS9OV1hmdGZCV1JRS3djRStEclQ1ZHVLU005N21ySDdUbWxwKy9WTW5hUm5UQ0ZRTUpMaEZ2SzlvRUVQKzJZdE1qbi9jeDZLMWs3bDVYOVhYTTFFVFg2MjZucFVyY3FZakNIUnp3dmJ5TWRRYUF2T0VXalVCNnBpMVVjelMwVitPUm1CNmU3U3NIZ09FZzJsRHNaRFhBeXpVSHZEVGQvUFpvMXRBQ0hDaVhXbXY0aVFjdzRFb1BHUEJBSGQreENyWXFSdkxsSXdRYmVwdERsYTJKVFBIRVVIckNkdEZKeDB1Um1rMVdSdlJCbWJPdXUydG5qZUNLcWF1azhSM05BMnJkR2tKS2NxOEEydzdVZzl4cGRkZGZLOUttdE11bkRsV2toRFhMT0RlVEpEZW1tRGZySk9yT3ZsU2k3WTFvdGlsTEFkcGo4MmlnUG0rcG1zY2g4TjEybkV2UVhKeThFQUlNRHpoUThYZzBXVWxZenE3YVlWMkpLZzliZTNVcUQxaEJFUmp4L2hrK1hKSmtMR3pHSW1yaHRXY2ExTmVxYlpQZGQ0UEpmU3R1Vm51T1FBakdYVTQyRmtObmxrckVsLzNCTXE2Y0NRa2s0MnhCR0tPUnV1V04zcnBWR0N4UHlyeVhSaDZ3c0xIQnNPSW1FRmxrUk5QWk5mWnFPNnRFSm9JaWpTNnRGbUM4aE96QjVGSFJKYUxNcEx3OHdzb3Q5VzZmRDJNVURlZENjZExDRUJSdFFaNnFMdWVvbXpNWVJiS1ZQY0RiL3VJT2NxcGxjeUVlMEZxbU9KS09ZWG8reEJidEFWUWJ1K1JLemdSRlJnamwwZnNObVZKSHFBb0kzZUkwRG1hckJqaTFING9ud1UyU0ttWVBhZmdFMmttS2dPRzhkUGFoWTlJazE3VndGSlJCaCtLZUIxczhKMlp6aTZlR0dhT1U3R1d3ZVNuVE5FWklkYjY0UzV3SlNqNWQ1WUIydTRxUlBGOUhKSU8waWg2MldnZ0pDS2s3NytxVHU1WlRTbCtjaS9ubXhrbnliQ0lqSEFnb0FGMmQ2ZEttMkJLMGxDclBqVmtpdEZhRkQ4amhSSDhSWGNLY2tTR2M5dFB3WlY5Rmc0OUhmVk5jNEQxSlJ3dWdtUVFGVmFYc2VJcHNvM1ZaSDZ5cEpScFZnTHpiYnBHbTRrVVI4Q1Y1M1I1aVhTQXNFY0ZXbm9iQ1lpMXQ3MkEvTVQ3OGtJRGVlbXU5QmxNWS9peVlya0J1bU5lMW5QdHZaNXg5aWpRQjVkR1JWS1dvbWdHVFhNVlpjZ0tKdTRhTEswZjl0cDEweGRkMDJFOTdvWkZ1U3VmeUJsMk10U09ITGNVSnVnV2VlUlNBV0c2YXJuV1JqbVp6cVpSY0JVMTdUQk9pcEVabkRrdzVlUkoyM0xSa0pKWGVURU5VQzRxbCs4VjZXVVE4dXJIdzliQm1wbm1oMUZ3R2t0eU5tcXQ3NlFNa0ZzZXVjK3dHaFkrRDdtRVJYVm9vTFNLU2tFMmplSjZ0Y2hFL2YzZEFJdDFjMjBpM0xFZVNvVGMzcmxlbWhJSFlGQUEvcWd4RngxZHdKUWU3NjBSYldMSy9GbWpDYXM2alcybmltb0pUY3BHQ3lqdFh0WlZ3VVF6N0tPU1VHRk9tNXhKclVGVmF4T2ordUR5SHV0YmJWcTBTcDA3dExMSkx1eGVyRFdOUjVQdGxHUVpVcE8xNnJYdGpEZ2ZOMm9TNnlzWGVPRGNyMS8yWTFLcUt2dUR4RHFaOWkxNUdlQ3ZTNmZUK0RqUVBRVXNSWFEvSS9zdGp0RmdFUVpiNW5vUHBNazAxcC9XdFc2cVJ2aFRNQmo5OXhWL1F2YWtBblEyamliSnBNWXFwbVVsc3lXYThPSW1zZ2FITU9ENnVKK0dsREFBL1FySGpuVTlwWkdlY1hBRzYxRkF2ZHhudzhFRkx1cjdyaWw2a3RHdXlPRTlOSU90RUU3TUViVnlzaWJkVFNzaDR2R2pTTkJEZGhhZDdnVFhMQzdMYUJTaGw4RVRXY3hzRno4OG5mbHNnKzgyc0RvaEpmRDNKQ2t0L3ZGUGVVc2xHdFg4QnVKOGd1LzlUTExyVU9yRkY0M25BS2s0Vk1LYjhWYTF0QU41bXpCbURVc1lEVUJteERTYktGbEVPaW9aa3NVZW5mZm9jU3pHUXlZY3hMNGMwbzk5L09VVnorajg3V1JEQTlwSEh6OGl6a3BIVlNqY0dTV2pYQWRGaWpheFg1MURRc1EwREFQTklWdnhUOGxwZ3drbHRqUUhGeWRmVDZzYXlTbDV2ZFI0SUN2ZUtXU3B4MlpGRXNsNjBNVmlZSjk4SFVkYStRRVh4b2htSU1PZkRScEdWVnBvNlJLM21YcW5ON2hCTjB5UlMwNVNkUnh2bjNZZmxxOGkreFhYZlo1YjVTMmJNeHRORTBQU3dGcHZhRVNmZUVnK0pPbEZzVnlRL05LODB4TVM1RndMMDRBR200c0RUS2hvbmpnUHF1b0ROWFk5SWVyKzgrbUFYSjVEeWJGTVVNUnRFRTBraWFrd3J6Z0pyQzJRUEZNcDNGMk5ZNlBlN0R6YzNza0k0SGVNN1AweDcxTTJ0YnBhR2tObE1kRzVwQTFGeENxZUdlaWNySWZ2UVVoZnpkZGR1d080RGEyS0FmQUpZdU1ReDYwUVRUbHhEa05GMUFqcEllUiswNXNKWm51dWJsTHlIeWJVMTUwQllnQmRlaVJ2RHVKVjFqUnVUemRYVnc4TWM5eTVtRVZWOTc1VUxuOEI0QkRvZVhjYUdJUXNxOThrWEtRa3NGdW11ZWgyUG5QbGZGN1V5a3IycVpLdUMxQTAyL2RyaXBzZEczSDVYNGJWd2IyVVN6WXh5WUFGTysxZVN3Zi9OYVNGSkdYRE93TUM3c1FFSXBVY2N4TXdaejRZQjdHZ3poeXlaSkdxL3lPS0IvaEJCNFVEeDJxaXhsZGdpdW10S0xKemI0TEdQVWRWelBHcTVaaTNmSjRYRUdWU2xIQzJ4bE1JNEs0aGRMcXlnRHRLVkQ1KzZJa1hmdkxuWmdOYW1odVc1N1drRTdBTnorUVJjcGtRSFQ5WFZ0bWFGcXFQeDNIM29YMEc0ZGZEZEQxNU9ZWnRKNFFqVjdGRXVHWWFxaDVXTWFlZUVFWENxWE9aYWVHWlZKVVViQWhnbENRejRRT3B0Vis0dnJCK1AxcUZoek00cjR5UUlZa09EQ295K3N6cWNnN2VpbnMxMXVsT1c0U1pKYmtQYldwOEN4SGtuZWp1cndSZXpZZDBhSEhOWGV3VXlsNk5NUWdDWTJNc0RVNFN5YTRFNnpBckRGVHcwKzFranhBcGpiL1Nwc2QxZTdmRjhSNUdmUEdOL3YzaU1EbGxxd0RWRjhIdWdGOG56c0l1T0pQS05KR2d2MnpjRGVZMy9yclNOTmNoTHIya3IrWS81azFiYkxReDFKOUJFOGxDZTY2cjVtam9JcTVTaFZKQ3NjOE5nZWRLMmhjWmFtV0tYODFnVW9WenJJUVVtKzVTbFUxTklKZHFvSUhQUmZYMncvbTd4RU1jUnJCVlA5V2o5enBTbHNsSnFMV0ZLUUd0YTJnUGhZZW1YUW1jRUFKU2JiUnNyS3lXbnl0K2xvMU16OHVGc2JOYzFvN2N1VmRiQTVkODVMT05GZjNmTUF0aXVJN3NlMndIQXB1OG80RGg5NG1tTWozekpqaFVPY0V6d3QxYWl0MXo3cUdpOWZ1Y2x2OXZ0MXF0VmtPdTBwR1dBS1RzbjJYY2VlMlV2KzB0RVo0TEd1Sk56YU1NR3cwRURIMEErdnNCNDZBTWdOR2J4Mm5Hc05ESkp4alROZUF6Q0hIUnlmMDV2TWJtL0p3MDhSczBlbE9vV0JRRWYvOXNVMzMvbmQvODN5c0JkNjMrWFM1K3lPWEFmUGpqVGcvZi9QWk03VS9kTXlRTmhEQW9nZ1AvZTFqNzFuZzBKcEtPYWxod0JtM2V4NklHeWtLcnkwblN1TlYzbXBsSHhRUnArSE9ncU9KY1J2V3Bic2E0MmNxbW1zWmVqSXMySGtDb0NUTFJaSUkvMHBkQ0d4UDZWSHVIbnU4VFppYVNnYkYyZW1VN1B1TVE2a0NyMDVtQ3ZneTEvbUREYUgrQ0s4Z2Y3RFllc2ZmaFNrUTUxWFh4WC9RMDZ0d1BEVjBMeUgyRW5PV3NNOWovYVBxQjhqenJIWUJNVDkwRUR4dFhNMElVWnhwV2dPVmRRMkV3dE5PaS9nbmtHc0FoNnhwVmczMENKN2UwZ1lCcXdOTndOcWFMdnFuVUFmOXExT2MxQTJneVNXVXlVWk5ONVVhL2xzQWUyd3lMMkdPa05LTHl4dE9sNHUzNUFmOFNodW5qaUQ2eXNUYjBrOEE5WUJydHFFanlGL1hhSzk0cE1uK0dKblNiYm9SUTdSUUIrMVNURUFoNWVKQWtSZ3Q4c1JoTXVqaE84cjVuVmdQTFRjcStySGlNT2lFRkdoek5mM2hUd0g5Y05pY1JneEp0MWFSY0pNNFpGSXhOUEsyd0h4anE1MWh4dWRPNmdEZGZtWHE0NU03KzVtczRrcEF3Z0I2VFl3U3VzQjZLY21lY09wekhwZFplcVVrYlMwQ1lxMmk3Zy8zZmthbVpFejdHdGhpOVluL25TSzlaRTBmYzNJbWNkNFNYR0lJNklFQ3hFSERBSDlOQXBzOWVLT3VKS081Rlk0MVhMMUREM2lrQ0FDTkFOSXhzY0ZBcTF1a2g2WW81bVJpQ0FXU2JlMnJOWk5EMEVuQUJoYmZ3RUtGUG5UakRpNTlvSk1EakxKOEE1aHJWbUhQYzVIaWt3bUM4Q0FXQkcxSndBQWViUk9zRll1aDNpdUk5M2NaekY5M0FuZGZXajRwUXBwNk5XSUorS0ZvRS92OGVJUUxob2lvaWp2SGdwSW9GY2NFMUVYT296WHNpa3JDT0tVVmxjdFVwMVRYZ0owZURsTFFwSHZmTDVDcXBVR2M3alN4YWloS0hGeThad01RWGxPNzJVbGdiVkh1ZHJUcVlpVGNCamhkMkx5UVh3NVhmZkdvR0Z3MW0zM2VxY1pDbW9wOFhodVhoZ2Vsa3d4d1NDN0hpbGJKWFdDYVZTWnFVc1Z5RjlaWGh4d1JTZXZ5dmxZRXFXNWhtN2VacEwrYWxNYlloSzVNbzhZVUUydlV1R2J4Ukc1b3pjdmFXK2g3KzdzRkd2aWRTSmRCbnJRem40eXRCVi9HN29VYndtZUo3VndkUFlDazRyRDFuRmJ3U2xyUWRJOFNVQmFqVndOWW9DaldYL3RDVy9mTHpLYjRrTGZtcTgwbytCVjlCVzhiTzBlWmJST1BnOHFtcmtVdFdrcjZsc1g5MlEraGFOK1FhL08xN3ltc3FhM01pY1JSa3puL1RoUldtamw4V2pLOUZqaGpDVklGV0RuMm04M3NEY3pqbGxwRGFWY3FlUkhDb3BlbHBpMEVtb0J2dFNMSGVENllyaFoybnhwWmZqU2xvczh4eURvc09OYUVKUkZDR2Z0YzVRa1U1SWk4Q3BDY2RORzRiakVFTC85NlVFQnR4THB2bVI4U1F2RGw2MldBZEp3MUx3SHU1MDNKSDJmTVNySXczdjZvREh1emlzTWhHZkR3RlBCNCt6eDBoT2V4emV5VzZWY1poVnh2bzc0TE9PVUV4SWxpRzJoNXRERlAzcW5YZGhjL3Q4ZW5ZN241NzczQjgvUEpwdVA5eWFIb1ZiNFNtLzJNcG1kaVZCVmc4ZkhreDNIKzVNc3duVmZ4SWVoRHZoLzVpdEJQNTlkYUYrUTFiT1ZabnpjRys2K1hCanVoZHVoS2Qwc1pGTkxGZHRtaWZiZUlrL00zMjJYMW9KUHdsTzF3WHdVMGFObjg4d3d3TFNsdzM5eFlWTGlOL0Q3NzU5ZzZwYUh6OTczUzhNUnBGUFJNSHdqOEZaZWUxamRVdFphejh1Skp6U3NCZ2JFN043b2NBZU0zeldIaURLdmtOaEg5Yy90MCtxciswYmNSTUFBQT09KSBmb3JtYXQoJ3dvZmYyJyk7XFxuICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSswMjU5LCBVKzFFMDAtMUVGRiwgVSsyMDIwLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMjExMywgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGO1xcbn1cXG4vKiBvcGVuLXNhbnMtbGF0aW4tNzAwLW5vcm1hbCovXFxuQGZvbnQtZmFjZSB7XFxuICBmb250LWZhbWlseTogJ09wZW4gU2Fucyc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBmb250LWRpc3BsYXk6IHN3YXA7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgc3JjOiB1cmwoZGF0YTpmb250L3dvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFFQVlBQklBQUFBQWU2Z0FBRCt3QUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHbUliSUJ5RVVBWmdQMU5VUVZSYUFJSU1DSUY4Q1o4VUVSQUtnYkpNZ1pnNUM0UWVBQUUyQWlRRGlEZ0VJQVdFWUFjZ0RJVWZHMEZyTld4YmhzU0Q3a0NjVkhrbVowVVJiQndZY0o5WDlQOS9UWkJqakJqNU4waXR0K3M0TENRRUZVakw3WGs3eUFnV0ptczhpbnpuZHpKM1I0K29WZktzS2hJMlRsQlNVQlFsQTMyZmFKMHR0QkNMV0dLMWtyZTE0azkwMGlQdm56M2lpZmdDc2l3bWZkVXQxaDVUSitEQ2xzY1FTSG16MVZXcHYxRlBuTER1Zk1acEl4V2YwMDVLdUhxQ056bENZNS9rK3ZEOE52L2Mrd0pFUk1hd1ViRVNZNVhvMzFqS0dIUHhXYUVycXhIdFJTWExacG1zeTBXbDZEaXZjeCtscENDdUJ3L2xmditlM1d4eVB4Um9mSVVEbEloR0lBdGpxcXNxVkMyckIxbTBXY21TTFpzSEtMdzdXWUxaQjRLdTBsUEsxT1VWemZ1VnpkN2RJOVE1VXRVWWVxck5JLzBZV0lBR2lYdjJETFBDK3BHSlEyeG55UnZqWG1qNjBiL01MM1JXWlFRRnRCM2VObmFGNW5xR2tsU2dtQnpocWJlQXVUMVpBN0JOSStlY3MxQUpSUkVVeFFJckFDV1VDZ1ZCUWxveHNUQXcwVjdaeTIvV0tsblh0Mi9mMm4yN2kwb1Y1clR1d29nTFJXUUpLR2tIZVB4TjkvcmV1N001a2xPZzBFWHVYUUhvSklmNC8wZ05NTHRBVnh5N2pPNFdkVjB5akZhelZwRnFBbGJzTk1JeTNvdmZONm5UWklMRWtnd1lSQ1ZXMm44VjliaHNYZllIR3RkZURNUDJrKzFsNmoxdWZzMGdrUkVJdTE0MFc1OVVMWmJ3eFFTWWhyenRrdHZ1VkMzNUxaTXpjL0gvVE5YYVdZQXJydUlqSENsZEloeWhpNUtLNm1MZ3hWdzA5NjZhK1RPTDJabkJFb3NsSlFNTFFDS2h4S0N3SUVXYkFHVWZsN2l3a0p4eWRTR2tFaUFjbEJ3b09xYk8xY1ZZdWJveWR5bjMxMVJYdGo1WGZxN3UzZnU5V1VWRW01NUphY2NhUVVWbmovdjk3LzFZMnU4QWllMit0VFhYYzYwaFpJUlJVQWlTZTAzeWovTitiUDVEWlQrVGxUSXhCd2djUjdnZk80S0FRb0pDZE0rYmlSQ29OWUpFL1YreERCbXhNbVd4R3BOaTA4Mk56YmM3dHRlSjNDdThteFB2TjQxc1p3QklWNGNTNE1wRVVQQkJFbTkxMVVNSTluOGJCTTdWUncrd0d6ZW9mR0xLeTRET0YzbEQwanRmRGpIbVRYbzd1Q0FMZ1NUSXNTVGhxbDRKQllIaTV6MzBmekdrRWwxZ005bU5GcVMrejg1RTVQTzh3U21JZXp0aTJHQzBlcHVka2dIMSs4TE1QR2crZm5qby9sVW92U2E0bG1LQWdoSnZvb2d5VWRIZUhPRUVoUUVxSE1aaUd3NjVDMFM4YlEyTVZxRjNTd25SSXhReXdTNFZWWkk2eUZHWU1rK0ZWSU95U0JMTU9ZR1NsY0RzWXhqSWFxcjFvNVNZdzRVbnVsZkw4emlaUDdFc251WWplSWgrMFIralZPcE1nYThqdUNYWHcyTU9vQi94QVQ4QmV0ZitGbDRGWVlpNEY4L3hMNm9oaGZLRTJDOUMyMW5WcEJ6aUlJWjhvclcvVUcvQm9KT3Uza0U4eVN0UThUckV1bm9EZ1JORU9URExUc3Y5T0lDTHIvT0ErZHlpL081eE9WM1JWUVVoaENOb29UY0JIUjhuZFNSTHdmNVBPR216Rm9UMU9RSElFcGExMG5RclFJa0ZtY1VZQURaN2kwU0xueFlNSndRb2ZqRzhnQlQ1SzFjWm9uQmJlTWo0UkxtVGVFcWwyc3VEOEhRL0NLb2Y2ZzNBRWVYRWlwU0tEYTlxMGZHOTV3bHdRZ1U3aWVpWisvTmszc2w3SjFPNXE5eFhubEI2S24yVS9zcGdaYnl5aFRKUldhRGNZUDM5WmY0dTlkTytPZFZBTjZhMDlNbnBqajZ1ZEZjcVhseWNzdm0vY0lqOW0vMkovY3ArK25uYnNLMS83Lys5SXg0OGVIanI0YzJIdTlyUjlyYTBNVXVMbXRud29OY1ZaM3Z3TTZYSlV5OUFVRlR4Y282Y2xldHFwZEtSZy8yMWZGc08xTHZPZWwyNDVKVnZBS3l4enV3dHRrcU5XQS9sdVphWVlxMHkyOVBJTk41ODZTWmJvTlFLazZLRmtRZGgwY3ZmWTVTUzBMeEVxUnRaYkozdDJ1V2pURFhQRW5OdXJTMXorVlUyRUJWTDFaQkJLYVkzeE5JNDIxTExyYmRacllubVJndTVxb3d4SlU1ZXFkeG9FOHlxN24rVDl5aFJZYXdab1dGU3hiN1RacHB2OVRqYVNyc0k4dGtzRnpjMTArMG9ZNk1qdzUwZDV2YTIxcGJtSmxOalEzMmRzYmFtdXFyU1VGRmVWbHBTckM4cTFHazFhcFZTVVNDWFNTWDVZaEVBa0htWno2YVQ4WER3OWx0dnZ0SHZkVHZ0MXFzdmxFNk9iNll4OEJPdXIwOXVWWkt0b3VEa25ONFNqNGFkd0xrcGFIY0VQUlRiSDBtellhejFoaTAwdUd5dU51VXJIZHRoZWJOSXBsellKbHIxeDl3ZlprSk5IUWFpaENZMXJrN2ZWcG1WTENqSmM2aHpjV29XcmVkQ2F3Z0FhbVRRbEFuUW9XWThBcFA2ZW0waS9yUjNLL21sQiszT00wWWRXNWExdFNLNklLNmVoSG8yTDJ5V1VodVVVQkdCa2JlbXpMbEFxTWdFWW5qak8rYjFRQkxMSGNZRlBPSXZxOWNxUUl3UndaYThHSWhXWnpqTXBoNGJDVHNqUnNWcE5IbGY1RWNVNkt2THRscUpCT29ZNDArZFVhZGZDNWtVRVRTYWZ5M0tyNFNVaEpxUGx5TldrWWkyaXhBSStCSVI4YVJMMmp4U0xqNXJDdDBiclZKOEN4WHJ4d3FFejZpTGJnd0NiWlNLV29vbzB0Qm9HKy9SYUkxdGM5dFMvYW9takVSamJvQVF0cnl6d28wUW1YMDlQckgwa1Q3V1oxUkNaUkczaVY5OXcvOEk4QkMyaTdFRVpaUkdSNU9PTWYzbmFWTVEyU09rbG9JTXBjbVBCUVJURFZsOVY5YnpVUGNBSnZmSzVMY1FuTEJzUXd5eVZueVphcVVacWMzeHVNYWNCVWtSWVNsNHcxOFJFNFFsNkxGZ0I0S3gvdUg0eGl3a1YwTVNYaHYyOGN3WlhSNnJpcUo2WDVOaGxtcDBoTzBZUnc1VWNEcm1ZS1JsdVhRWEs4QmtkOG10MERQQTRQSWh1bEoyT1NOdmpackorekNWV2xxWEZESm5EcHk3WDI4bUkzS1pQa3phUkNRN3pQeDRYVU1RMXhTSFBVcmFSbXprRklEbmduNXZON2xKNWFjNnhnc2k2SUZzemNibkVHUFFuSVBITlJNNXFLMzE1YlJhb1dhRU50ZW9WdnJEcU45Mmcyc2hid3lTbWhwU2h2ZFV2c3puNHhyV3NOVmQ3eDdYTkx5RzFVUW4wellSREViVFUzT0N4YjNXY2s0cjZDRzRKRUNCMzkwczAvRlBNdEZ3bkRkbkxIdi9ZeDJoWlc1NHhCdnRXUWE4djFHdHBBK1VoUFl2VHFhUWRNcm41SEx6M0xFUVlBeTgyQUluNTdTZnU5d3lzVEVGbU11OTltZ1p4U0Z0NHViS0FDc3JwNTFZTWhKTEt6OW1YT2k0Ykx5ZGV6MHhyaWN3YVh5dFJpOXFPaEpQbG92UmJFcTBUOHZXS2g3QTVTMHFYRVdHMzhaaTFtRGV1MzFteXBHT2tvcUk3L0thTnRiYXFDMnNOeThkeTg5TzBrNDlJbWk5aVNRTFl6MjRHdTdSaE1PZWxMeWppMkRSbVlSejZtZ3NpZ1hKL3ZpUWRsRHdEeEZVMU9sWWt6VExvMDArdXVDOG14b014eHRrTXVoY3JvVlpGM3BPb1FFNFJlbk1ydGtXSUZNK3JCQVphSHR2UFVCQkFHVnFZcE5oanlKYTNSVUVTOEZXM1E5NHIxcDJuSzhoaHJ1ekJJQXU2VXRwY0lCczBEVForZ29KRUVyd1hLa2dNSzZkRkIzRnR0a01CQWRMWHVrcEk1N3AyeHNZS0NWSFp6bVR4N0tsRXJYb1VEdTVLY0FMc2d1T3Z3ZHNUOE5CVW4yNjNFbGh3Y1dCUXluaDBMZms5bFpDMGhNVG9FdlFzWTl5T0xLc0ZTVkg1MjlYb2ZjbDdNckUrOUsrS01CdXB4dm1rSGF0MFY1UG9DS3plUzY3VFcwamdXWU02SGxYMmlMcGJ0VFJiRlhaeTJpSVBPUTZpdzd3bUxsYk92MUpVa0lWckdZNmlLVldlZ0FjMnJKSkViSHM4TVhqY3AyemErRVFaZ0FMNyttYzMzeW15QTlySlhNREU0elF2M0o3Z2haVXROSU56Qmp1ZHUvS0FtcjRheVJRM1RrRTlpdS9VTTZVb1k3TnFjNlNQRmRlc2NnUEt3NDI3QVpxaWt6K0NFb1RkbWdDVGFkV3Jld0RCTThSTFJmOFZNTnN3N21XNlFHMmgwYlVhTWVjVUhBNmRtNnBINVdhNnFFRHlVNUJhWXVURHJDcUxKeEwySXM3S2UxUGxFREtnUGFjcWVKZkNZZ2IzNzVHM3VoSTZHUjR6aHY1U3Vkblpvd2ZmV0VWcU1zSEFuaHE3dGRBR3RJcllXbmxwbThhVTVUOXNqMXZNbGhKYmVsVXFROW93Q3U1QmNrZVI1SFNyVXNyQlVuU2s1R05iUGdBc3Z1alZ1ZURjWHREcmdwZXBVY29HcDBIZFhTZjJ0VlF2Z2YrbWRycFdQUVlDb0MwcThhM2VYSGdBcUM1VUYzcDVjL0FsM2ZnTUV5U3FzYmFiN25RMGJkeUQ5QnJkeUl6c1FPOVplUnBSWlNzNm0vVEpudk5RYll5WEhEakZibDkyb3liU1FFS2VJSlg4N2paR3F3VEN1Rkp0dDVFdU1zV01ZRmtuNEswUGtSOUxoNTU4RHJOMFRRTGcwQnZjNGRzeDRtSSs1dklYdG0raDYrb0JDYnZxdE5TSitHVWpqN3Z3TWtrRVF2UldqVUIva00xY2dPZ2srVHlZdEdqZTdJNGNIM3ZoeHEzcEdhWFJ3ZlZPVFVYMlQ3L1ludE5keGoyRXdSSi9nS3hTWG9HTU80V0xQbmQvNWh6Tmx4S0ptS2REZGpCdFdXNHVDZDlWRTYyMVJXYTFLZW5MMk1UK1E0VWxmc2ZtVFQwdXJKdnd2enUyR0JnNDZ1WFhLSXJ2MXRjOGY3ejRHTkZRVTl6OENTTjNlSEE1c1FJbWNsQ3ZWeE96WWdvOCs5c0hXT1Z5ZTJQc3VOTEdtZkNKVXJ2SjYzTWVzYTh6UEFKZ1VzUnErOTQ0SENSdjFMZ0ZRMStzdjFXTmxFaFNsYzFuS3hUSVQrQ1QvSTE2eFFmd2xpRXJiaElSbTU5eHZEQjVLdk95RFNQd2RVRm1YVkM0b1Q0Q3V0Yy83MXhYRkw3YW1CY3dEUi9hVldCczRGQi9zcktaUXdoM3BHK0pvQmp0RDdyMVloTnhoZFRmVFA1Z0tNSTBWMUlTczZVanZLamlucmVnOEtmUURNY0tmTDFXV3lIYlgrSHRpalRvM2M0UE9VcE1Ea1grejdvYTYreHZPdWZBdUtSRU1rY3Vsejd0WmN0VjJVbFBrL21kQUNpamlUUUdDeUt6S0F2LzRRd1ZEaEJZTGR6eGhvakVtU29Ja01OSGRrOU5oVGZERFl3USsrVjZMdkpGWjNsR0hDNGF3SmhXZ0t6R1R5dGNWMkFHbUNxZzZyYUdMNWhSRHg3eDdRMTdJcTRRdmw3czl1eEhHUTZFYXdOc1dGN0VhelY1dUJlUUlVaG1KODJSbDluZ3R3TVh6QURLYWloRWxTa2FXME5neUxGb0FOZGdWNE5Yak9XdTdmRHJMY1hDTXk0OG9FRWVTMUVVUm9GNmFGVzF2VkZlSDVoYmplOU1GTG9BTGZ6bjNxcFF0d2xNcDRUcFIzNnVyUVVPOHZoMWRkMnp4QTl2RU5hcGRPMVQ3MGZYak1uc0dDRjI3YTBJWGZhUGd5OVBuQ04xN2dld2N2THk5d0JQNHlzcDNvUjV3NGE2aHFaNEhTZjFxclRST2VnRW1BVDdpWHN6RERsSkdMeDV6djlWUVk1UkZsMHlGZm1LNUlqSUJRUlpnRE80VWZqSVdGem94SXJ5VTFYUmFtNlBvdjBWQ3RtQjBHc1U2M2xVRlZqb2lyRWpRUm1hQzdrVlMxV2tKd0tpcUZteXdyT2VVK3c0NWpSTGs2RnVoTVMxMVVLWmFpU0ljTmV4REp5Z0N5TGdRRmN1L1RLaGNvQnZyL2JoYlI4SHRvQmpRb3lBcXFpYXR6emVSSW95V1pWcVRHWnRlcjdtZjV2cEpLa3Z3UEgyazM5eTRyQmoyOU5lcXZxeHZNYkxtaC9mUE5EKzUzeGJZK295bndsTkxYZS9JM3hndWxDeFNlOHkxS2V5RGNROHVWa29SOFA4clJZeWhZSHBpQU91WUxxOHZMTmEyc0hwb3ZQd0FvTUlRdlZtRkxNR3NNYTlDWnRSZWwxdmFFVDBMb2xkTnlhaTBIYVE1VysrNUVlcCt0OFdVcldMMllFc09EK3B6cGdEdTlLTVRoYnFlRFQrbWxEZU1FVUZYMkVScWx3eTFPOW1VTWdSOXdBVFZzc0lSZ3ZiZlE2c2xjOHhnazRiMUtjemtjMHlEL1NLVWM3enBmQWh3YlhZWDdQRWVyYm90Z1lONEpRNHZVVUtndmN5eWpOMXRJSVQ0MUMyM1JOb0xFNDIzbnJkRjFCSkFxODRyT01ETkFzWDRvZk9MV08wZXNtYU9jdTMyekEvVmNudkIyT3JrNk5TZDFjUEpyVmFKQ1RheGloNUVsRi9oRldVRExNd3RCZlhnZkJ4R2Y0L1hZSXNFSkFWQ2k5UXZwYW1HNzFkK1FQcDN6ZFBLcGdwL1ZMM3BzQlhyMmliLzFUWC9nYWdCTExYdHo4YUdRYUJMbVlWbWVESitjTTcrT09QUytLZDBJVVp4YkMzc0EraUYvak9ZZmJ0aTZvc1pBRFNOSlRyQ1UweGsrY21JN0QxK254b2JWR20zcm1DSUV6ZXRlR0t0VjFGbnI2OXIvQXlNbXZlWmtySm43Z2lha1grc3FtVlg4a3FlNExoNEhzcmNhS0RRdTM0ckszTkc5ZE41WVpPcUVUbGRJVDVFZ3VxMmF1K0swTnZaOUtrd3FhdEJGcnVuclVWemRCUCtwRm1hUTRrVmFaQXFYa251Tm9yTGhJanJUaDd2T09WMlZ0RkQwWlMweWo2elpscXoycm1JR0ZPbUZRRlBSWFk1MU9GUTZackg2ZGRNVzlURUcyNERONDMwOXBhOFllR3JhdGxGcXJSOGc5VCszbnV5dzc5NmlzSGM2SDRkcG42dEFUUUlGQ1EwTG9PZVJyS0ZzYnNyMmxtOXU2WWR4ZmV1TGZDNWRseEtYdVd1ZERNUVdxMkNxcEV6WkNyV1RldUtLdGphcEhJdk1iNURsQW40b1FtWWlmMjFsSzZXdlluSWxsWnIxMkpmN2ZiNDR5cDRHYno5RXlNMmswSHRWSU1ka3AxRG15cWcwUnlqWnhMZ2x1Y3JoWnNzSnYyMjQ1UXc0L0tvcXJGYVVPSzFpZERnbU5xVWZvUTNBU2c0SW13SU5uc1U3WGs0RzBwRTJZcWZ1UWl2akRFUVJkSFUxZWZmb3hCUUZHTEFyeFJtZWMvR1BrNVJMUy9uVVY2UTFtRjYvNEVIR1R0QUQ1S0dDMm5wMi9vOVFlVTc3bkFzdjhjT3RJdHdnczZSSDBHVlM2Mm1tb0xnUit5Nk85eHZOYldyZXVLNXV5Rmp0aStnQ3BKNFd5YjBueHhTNG4vZUtFZlpDUEgwMzZGTHdtSThTVENhUkJSNVVpbDU0Z29tS1Q2SzBVMWhadlBDcm9EdFZId3ZxczhFMEM0VXlyczZCRzFxOVQ4Z2U5ejNTamdIQVFRWWpKK0owNUFhK0lqNDZ0clhhaERINDJyNnhQU0Q4bWc0SjREYUZqZUFWZlBWaVFERi8yTWZzT0UvZzVMWnJYOG5LL0p5dEpaTDQ3Ti9yUHhEejhXS2R0WG1mSkRqMDFrRlJvZVRQNlJYWlRCamJSclduNS91ZlVOKytad2txcCtNSzZqNW1MN20wZ0plZUNFVGFjRDN1WHJ1UWtFdW1helZqNEhoZUlOb2hLa2pmbkxlQVo3dU5QZXQyZ2wrRXBIUXZSQ2dRa0t1RGZCMlh2cy8vYzgvMzRueUtvY3J3aHVEVDQxaW11eE13R2psNDh3SFdRbkJST0E0TUlNNkNRS1JPa0JqN0pWeDQ2bDhodlZVZEJtK0FBc1hja0w4MlN6OXdCSjJidFZqYTQ2Y2REV1pYdzNySTNoZVVRVmJDdEd3d0ViMUlFQVZsK1M0MWI1SHhVRzJyZm40c1ptVVBYYnZjZkgzVHg3VjlvdEFHREhFcXVybmZvK3o0UVlLZXlkdER6U2trOS9vcVFQRE02Q2luMUhPalhaTlNXWFJMQkgyemtRTTNzQVlDUnA1VEdWS0FVdGJTSDFvNUcwQzB5M21sK1BWbFpqZGVXUHllYlIyNlBITGQxSWlkdTc5T0FIRGRVMXB6VWJtbmZHeTZSeStaQmVZSVRwdGp4NFNxTVVLZDdmZ3N3KzA5UDJ0b2szSjBycUJnSHFKVnhkU2JUTTFiQm5LQ043eThGV0FNL3RwendLNVY1c0ltK3ZUNlhIcUdEVHdGUGYwVkdmS2IyODNsUU1WeHNyQjlSREdHUVpuelh6amtQV21UdW44bDIveWdRcDh1bTZmTHB6c3h6MmdsVzB2VzFiSFhoODhQVnVOdzZyWnBiRlFwdXMyZEtjczBnTnlZOWpIUXVxN2p5dTFOM0tnY0YzRy8zL090VWtxbzVYT284KzBwR3ExNldLSWZsYVIveFBFRmNoOTFNUFVaeXNjc0luUEJ0Y3EwKzJUaDhSUmtRemoxa1A5ejNRTWpIUkkySHpkOU1PekJ1anROc21nQlpXWlNUdENsZnVQSEpJdXl3MmJCZysxT2dzUndFZExRVitBNjNuN0JDajZUdXZTVFBmUy9haTY4QWlpYmhQRzh1Q3FWcmREV2lwQ1gyOVA4eFBFaGhoUGlWWGc3bG1IcU9ZNmszWWMvWXFiVUg4K1o4enZVYmM5ejhxVlJ1K2ljR2hLMVRHR0ZGbFREdThDU2JBakd5VXpwWW5YLzdyenA2R0FrMDlLeG5zS05uaHVKY2VhRTlEWk1iakhoaGZoa051NUczK3N6NTZiTXhReVJjVXhKcGJKM1QyNUYraGtmUzJ2ZFYxZjVVSkZOUDExT0Q1RHVWNnhCR0h0SGVrZ2NrUnFobTNLOHkrRGU2WFcxcXBBL0RUUE4wL0xUT3JUZFVkWWUxRHdnc1BwTTROcE9XRzE5Y01wUVJBN1BuemFQa05VYktWaHJpT1hLVDdMdVN1aEFSazRNZW5OcjRiT2FIbDFNbDBBMUNjUkd3aVhLZXJZS1J3dHFYeHcwUVFNNWxUUXhwM09NTk8rcFhrVU5OcHBLUUg4eVFZZElOOGIxSytuMmVuV2ZQTHh5RWkyWm9qaDRob29GUEdBSjVtdDlvSWlEM3M4WDFUaG9iaU9PWHR1aCtvVTc4QlR2S2t0UEN0bVU4dGFGSTJUMERibW1xS3NaTW1uaCt0QUhwWFNYVGdjNWlOS0pNeFdjNzM4UmNsWFdWeFBKL0xiNVNqU1RpZmdaN1BndHluQW91VDUxbWxIMHBjUEZVeFB4V0F6NkZJVGt5MmgwcU50WGZ2QnJnOXd2bVErVjBMeEV5eHhQYWRxdVJyajZzQjJZQVNWR25FYzkxeGNLQkdsQURVdDFnNjk0OElPZHkvQis5VTVidktuTnF6bDFQVDY2Q2ZLSk8zN1FwSG9YVG1VL1c5K1NUMktxSEg1bjR5M21BUnlFU05UV2J6QW1TUERXVG5PMzNCcDYwSU9lZjlPcmcrOVYxU3pmUUlwL1lYQXlqRGQyaER4MmpEdDNJSG5wOUVTRDVmbDcyb3czUHVNNVQ5T0ViQ1c4dlAzNXlJdkk3UE1tKzJ0WnVjeW1TajNEaWhiN0lLSFNJWDVGMm9KS3pRS25XRHg0Vm1wekh4ZzBaYk05RXlzTHluN0VESnhCWjlpRWx5TlBTeG9IYW9adG5aend2N0NmT3hiZUlnc3ljT3Q0bGVHRmVlc3ZQYjRNWkNUU2YzN2p0emExYjB4OHNhN2Q4dUhWNzRzMnVTK2lJZXBNcG9oR05qbXhvTWtYV3AyMDlnTmxsZVV2dUxBYmJkdk1wM3Z6aGdJWHNPbCs5Tzd1d1g5MC9kYmlCRFBZS0pTU1BBZWpwL2hYVmRxSzhjTGl4b214dFI4b29sRC8xU3RPNHIwR0xIYXdwNDBiUjA0dEFoU2xhL2ZBUmpuV01RTnp2Und3VHRDa0tNc3FoTDExakxESGlHREltUnZJWFAxSWtTVXZqeEtLOGVBYzRzMk9tc2VsbW1McisrNFJEaS83NXNMaHRvaWxRMVBoMWFJMFpnazEyVnNSTXZpYTJRelExWHcyTmpZR3RPM2JsR2x4S0l6eS82ZnV3K25ZWU50MFo1ZUNGTEszVUJQem82WE1YZWI5MldXSlgvSXZxTzBnMk1QaGJoaVkwQWFNVTJMYVp0cGFaRnZkcjF6SGp1di9kWTNkeTRtVEdaQ0RsamljTHNTMWd3eHlTT0hYNk8vQzNzR0J5bkN1Y1k0a1dHTUFDNFA5enppWFV6R3lMQjlRZVBhN3EyenE3dllqMTRsVUI2OTZPL1Z2dWJ5OW1uWHMxRGIrYlc4cWdDMG9RZDlkT0krNEp5dWlNM0RMNFBUZEdIQ1BJV3Mzb3ZUWm1wSitaN2hqY2U3MzZ0NHYyOTgyc2lwTHlqdEhVeHF4Y1dRNmJ2NHFlUTU0KzlhaFB1aSs1YmRGRlRlbjJjcVAwdE9WNGMvWCtyYTZOYnZqS1VoVjNZRUcrQU9Dd3hjV3lZVkZ6dzFsYnczbmpwV0JSaUdPKzZrSzBjS3E5UXB1V3hoMUZkWmUrS3Uvc3cyQUVTUXhwYmhtcEFpYUtEbDV3bFovMm1QM1hmY2Rkdm1UM3FLMVJrVkZsTjVDZVcvMUd0dDc5R2tDbGpKU2xTSnlRb2JTOWN3ZDlneFZUSFpkVU5TY1hyMng5YUdNOFlqZ1hUQTJaU3cyNUdpOFJOMGJqMUt5aWhlVkRTWFdBbmpwOC9GT2dnelBJMzVzNUw0aXNOOEUvLzM5N2N1MmZhUXVxd2lIM1IwbWVjNFRsbElIMXQwT24wMVk5MVJqT2FkNnZWMTBZWEdsOGNMZDJyT3dvYmZFSzlsdm5wLytYMTdjWEZkUXBDZXJVQkRFNkJxeElZSFBRMEFjdzN2Ykxkc0Jqc01HUG5vR1RaMDFYNlUzTHF3V0V0cW9DQ3B5TzdOVUxGc3ZyV3JZL2tvOU9QTXF2MlZ5bnBBdzBGZElRT0dTaEp0MmNXOW02N0JyRG9UMlJXYVl1TlpRWHNCTnhYSGtHWk5OUENUbE82Qm9VU2xQUXlaaG9DaXZoeS9Xa09EUTFqcXlrZ3dqakpCUDhpLzFvYW1XRFE4NVBrOUE1Y25maUJmc084VC9kYWMwbGpYdjB5b3NEcTJydjN6T09IdENTcGUra1QvUGVRcUc4WGtsVXBTWk9QNFo2QnVzeGtacHhqZ3kzOUR1NzZOdW9DUjZaaTg2bnUxc1djdU8zSDllMzJ1RHJZZDhXY212MjF0NXZucG1kY2NuZHMyQlZ2SzJTanI5S0ZnL1BoeFFDUXN1VkVOQXpGQ0tNRUk2WFp1YmtySTNMUWVsdkt4S2VFWHF2UC85N0pTKzJybERMVE5yL296QXNGY2wzOFVHMmo3N2lQMm40SHRGZ2owQktyU0JyM1paMDB1VzdUOTdlM2xQMTc2MmFRZm5mc0FIUGNhODVEdnpuZnBGcEl1aVllRVBQMjdjVlk2cy9xYVoyODc3TjNOMzJCN1h0cTdGcWxCWnlWSTU4RnpQbXQyYkhJYzZyZlhYcGoxNFR6R2RuZUZ1UEVuSFcwaHh4QVZQREhYS29GZDlKSFlUSkRUeE1lMmlDVGdUUWlSZ0J4QVAxQWFvRDF0SVIzTVVCaFFFbG82T3dXbWlSV3NzRnp6VmJUOE5SNHhlNXNXWUZuK3ppbkNXcDBwQjZET2FXZzIrVlUwR2VDc1BPVGcyUHk2dkxNbytuTko3ckt5NFN4VWV4eXlJVVVBenZyTENMSUc2SjJtMVlScnU5dXFKWnVEMUVDN2VUaGV5SFZkMkg3ZXRselU0SlBUZWQvYk14Vlh3N1hoR2wrTkVqZURMSkxaZno3TXYrenFxcG55dkJXYzgrWnEvWm00NS9ieGx3YVkraWEzS1ArY0dkZDFKS2FUVHQvRnZlL3MzdkR5WXY0RFAwL3F1dHcyOFgwOXQvSDkyaVkrSUluL01RWHlJWDNZN2FzSUw1NmZrV0ptLzM1OHBadENoRS9VVWR1Q0ZDMG5tcVhuOTNaQ0g5em5SRFowYWVTM1VzQUpnanMycGNuRmtUYjhWWm02Umxwc1VCOTFRSXowN3N2eWsxeitVci9hNXhDWTNuSTlIbFJWWmN2OHArKyt5dmZIeEo2OElIUW9XbU5kOVpzOVdLNXluODU3MXZCYjlHZStydjNjSzJrZ1I0MjlVNytEcE5DUFoyV1FzUUsxY0JKaVFPM2g4SFRPVTMwVzhuMFc2SFlJMzdISjlCSTBTOHlHcDh5QW5PSEZzQzE4djFVT0lXOUEwYUU3S1Q3R2lkeVpsWk04blk0ZU1qcWZodkhkZHIvV243d3UwN0dLZXJ6UVdzZnpESWl0djc1alZtN3lBN1krdkRNZHFkOGVyV2RtaEF1VFAyZUlQanlkcUphdVVnM0pDN0xHRGI5OWNISlcxdTdiekYrTXZzWk84K2p2NmF0RTJkMnhSQmxOUDFOVnJUUDZ2R2FhNnJUdFFsU0x2NjU1SUZ6ZzRkSERRd0dHRTViU010UHpxb3BBN1ZhOGdCbXhvRTR1aEpkRGNQV21iOGt2UXFsN2FybGRvRnVYNzQ4dUhXeHNOdk5SdHBpenpiZ3c4RWFDTHVaWmZReENHaHhJaUViSHB6SmlzNHBJWlFwQ0FzVUxiVjdMMWJNRnB4TWJZTXJYaWJpbHdWemsxbXcwTXp3bU5UU1hWNEVhbzBkbVVGZnlua1pmek9maHNXN1cvSWYyVFpQdEwrM21YU09WaFV5TWROalp0MkRTeGVyRFlSVXhhWE43cHg0eXhRZ0lVRHRiYzBkNDlScTZDMUFSMGlrYi9adjFidHpsVjcxcCswK0JBdDhwTi9pS2NRVU9nbVFhSGM4cjEwbnFMY0U3OEcrZkF0NkxrN2ZBeGVDaSs5bXpLV09GOHAwM29LNitkeDR4RThWT2lSNTZtVHYrbmt2Z3NnL1Z2bWp2dUErVElyWTA4a0YwbDcrTzdFc1p6a2ViSHpHR2V1Z2tJK0dLS0ZESDl1WTFKc2xEKzNrK1ZUamp1THV2SnF2WlhuYWRUeDEvOEFLeklmV3RtL24xNzkzOHJTUDNUMUFOenVCbHd3WmZlazNyb3J1LytuTG9sMEJDc3NpL3cvV0QvZ1czMWFYV05uQ1p3K2poT29JL0EvWG1tdTlwUFhtVUlOU3kvSVo1OEhlQVJQVk0yK09YN20yYlhrRWFjZktkU1dvSHpGY3Fwd3VYSDd0N1cvbkk1d2FJR0l6V0V2aTZERGxCY0VrWGZpZkVxcWJBZVlpc0VzRWpzNW82RERVQlRrNSsxVmlIV29iKytDSW96SWpBZWVJU0NIaTJ5TzFqVFg5K2RhQUppNloxYTJmTzZnTmg4ZjFtYXQ5QnVYYm15U2xHeWFtQ2lkUktnOHA1N1ZHbitkUE45ajg5azBYcmsyL0xYd0JSbFNEMDluNlNneFErV2xDWXQxSkpwMEFFT01zQ2RHakFhN1dYdnVmdzZIUUY4RkgyRVpVWUxzVjg1U2FVT0dHbVBGeTU4bkw1cDNJWmxTZ3dLK0wxY1AyZ3o1alNzMmRxbktOMDFNVkV3aWdxOGFsdDJyTnM2T0QxNjJhNTY2cEtWb0d5b2Y5WktEM0lsb1dXdFRQLzNYMGVQdGRxOXFWdDBVVnBZN0dUZFlKVVRyeEduQTZIR2prekhXdUhaZ21zMVpLRnU1RldjVUxvWmNwdDhMWTd2SDRaSnBxU1FuOE9NWHp6OWJacWdhTzQyUUI4UzhHRncyajRqTVJhaW5LK29LMS84dEhJQ3lIUWtPMjBjdjJ4eGU2Y09OMnZuOVRGM0dRM21OdHplTjRwcDRhTStSRldNblNEZmdwNHFYSTdtVTJEQXJZMFA2eWtSQlVBd09oYTBsejNtZ3pXSHFSQ3FPa3N2aktsVWlqaTdDejlzcmplczhGTzJXVkVDdUNTUWFkL0FVT3hmZFF2Zlg1aHJGWWgwUE5WSGppcmJpNVdBL0w0a0VMUm5kUlpDbjUvRGxPQUpSaHVQbnlOTGRpQzlpUzEyelAzYkNPWVdtOHdtcTllZ2JhdnJhVFFxN2tDSWZKcUp2aXFlZnQ5Y2U3SnpHQVhZdjJ2SEppVnpCL29mWGEyWDRFNjFhY1F0dXdPWE5UVWU3aU9XR1E4ZU8zYmlGNmE5bEczT01xbzJyMGVoK1ZsQlJkbHd5WDhaRDJuTmpKTStRQzl5QmFuSjlJSzUrUFRPQ0MwYnpMWFFrZXFkaHg2MUJoTVpoYTM2ZjZ1QU81QTlIVWlHNU5SQ2MzWXJ1bzl4WU1IaUdhcW8rUVYwMHlMalJ0Ni9OK3NPb3RTdmVtOGRiUjdQMmxVUU5xYWdjdHBJYU9WUlNHcmxFbGMweDZpZmRvaDhhRGo1RlFBNFYyeHl0TmJFTlNEYnVxbHVOSXpmME9OcUs3L3d6Zktycm5WN1UybkQzRCtQd3B1dVJRekk2bnlTa2h3OFhUNmdtRVRIdjNsNFBjK0QxbVJkR0dKYldIM3dLVCtFYmVxUzJxWDVVRWtWd0FpMndzWExvVEU3cEMvQ29kbXRGMExoaVkwZXhqaDdvcG91bUVHZzdnOXVKSUcrL2gwcXZsQksvM0F5TW5wbUVsandKM3ovZnFXQ0FLUkdZZkpSV1ViajhDbXRsMVpRZkQvYXpIL0pTTEZOSWkwVkJYcW9TOVJGYVZJY1FWeWRkOW5iNUdlMkJVRVdFYUlZVHRDU0NscGtaaEFDSEtqSHlFRWx3TDQvYUFLcStpNUY0dm41Z3YwaVJvMXlKeS90ckVYaEp5N1FxOThYeDEwbVBrc0M0ckhRL0Nsd2llWTVjNEpaWVJHNEpKTlZ1NHhYc1NJOU92bEdTcjRYTkNyd2VOQ0hCM21qdzhhcVBkb0o3MTRSY2I4QXFEMTBBQ2Z5T0FtZ1hmTG0vdVdST2liY1p2Z0xhWXhDMlpuaytsRVEzdno3dXM4Q2puZVFFY1pGSzFhNmNOdDArckZZZnZYZWplN3U5RTlyVERGcHl4ZndhNVFXWGdOdVROYkM4bTRyYmlyd2lXRU95NkxucGhTa1BJbUg4VzduaXZ6bjRBQWUrUFAvWGhRS3kzK0NyTUVQMzB1MzBvbGlxOCtSbndwZUFkcUs0dER5QU4yaTlZYWY5a1JmUE1rNTkyU1FDWHMzY2NqQXhxNzRnQlo5TUx3L2l2dUdXdzVJWnVQU0NyTHFEaVZ0bWNRenZaVWtvU1UxSnVadEx1WE5ObGdTVnRKd0J3UGxCcWwxbjROVGRkV0luM01mUkFSc3hSNWZOZHltVERtK2dlK05tYVZlcEswakhKVFBLWVYxQnlYUjhDcXEvbW41d0RRV3E4NGxNYmlBRlBrR1k0aG1wTmQ0eXBMUmlvWGRFU2ozUjR3bmdubWVtVm52N1RlZC9aT0wveVFNOFFraFVWQXBKUTVXSU5Bd1NSY1h3ak9TZlh5bXpYUnhXTDN4T2h0UUhwYk8wRnpHMDZQNkJLdTBKWVFiOXJxOE16TEk3c08xRW04ZitWc1dyYlVlMGJ3NDBOcnBQZWFGT25pODlGY1VNRkQ4aVFucGcyQXdwVFhxMFpxWm1ZWGFFbEpDQ3VXam4rM1ZzVW5LWWxMRjQrOHoyNHlQVmxsTmN4UDUvNHlHS25tYlRraVVtMDFvMU9DWk9CcG94TlE4dGFHN3VCcXZqRTBBRnl4c2FGaTh5TlV3cHdIRUpTdDkxRFhXTGlqMHVCOHN2eHNWaStIeDBiRndPT29iL3d1emtZQlNIajRsN29NRGJ4STdDNXFibng3ZC83dm51RXYvei9lL0x0aDg5d3dkcm42ZUdlemVubW1tQit3RVh4d0UvQWFPTzk0Um9vTGJjWFdGUmI0bmt3ZG1ITXFBTFl1anM3UENvd0ozNWFJcWZCTEZBd3Fobkt3bTFsVGZTdFpUQmw1dlBGNjlERWhIL1pCdkQ2MEF4WmV4TU5PeVNJQ1lYcmdwZElLQWE3NWFGb2drcUxDUGcwY2xvWW14b01FR0p6UStJaU04Q3VWYzFrbG5ZNUNRdWxwekp4U2Nscy9CTE1vUllhaElQOFZEcURYT053M21OZTVTY08xdmlNYjY4ek8zdkMrNlZmeTEzSzdsd3J0SjlZbnpCK2dPWGUwazc4UEpGNnl2alpQOGVyTzNHdGtIN1VycUJNakRLMkw1eFpFWGxkR2RVSlNob2daM0tTejFzbXNtYm5zeS8zOVVzbXAzWWNFZlcyblpYTkRrbGV0RFZKYncvUG5rdkR3eWNQTDJrZDZCeFg2ZC84YnA2TENWYkg1VlNRR054cE1zaml1MEtHUGVvajIyalN3UFg0enZ3MEZYbzNaMEY5bm1jSkNENFNnQmR3TVZCMmFrVnAyNVhlNHU4UmJlckswNTg4OGc5TlZQRHJ6OXN5ay9BTXdldzVCbTl3NHdrR3RUdFByMnMzeXlYbDl4ODFiZnZXRzZUWUZiTllySncyVms0b2RMeGFzUkF6OHQ0NnhDdVJoQk83ZVZ5VnV3RVZnQjFxM1B5bHFtVVhMWmFxQ3RjSmNpUmF1S3FITjFCZkI2SFRBRURqek1vNUMvckpwaVpuZkdOYVppVy81Y0NveDd3T3RmZXUzMmV3UHdIanZnU0dwcURaTlNONEJKWGs0dmIxelRWcFlYcjVLWE1MRzIrek1ObitFcmplRU1oaWFVUVFGeVVMaklEMmJpbFp4K3RMUkFITzR3UGFVTm5Vd2h4c2FFRXZMeHNsVmlia2hrYTdCNFR4VVYwS3Z2dURxZUJRK01EQWVmejJVVUNEYXZ3UE5nK1p6aS85SUlIcFYwaWVSSTJOSCs2STFXRVNFa3JpUHpPQjlybVVGa1E3bXhQcjRtSFNrVGF5c0NzZCt3eThOcFYrTjFzaVhsS2NnbzNIWkJvYnU4L1VYYnZYSDZIMkdQMU40UFp0Q1dDUFBmTW1sUGNlZjUrNjRNUTJVa2lGL3E4b3h2N3NqR1JGRGQ0eDlIaTE0ZkExamtNM2Vmd3ZYbjBWbnBUK0F1UFNDL3hwajJIVmd3Y09yUnA4KzRESytValBNSHFPd1lsVHBsRnhpcVZTbXdCT1F0WDRKYTlKcWppeE8xcWdBZ1FjWFFxVUZzTndqN2RtZGsyK3lEWW1zOHdmQTYvbVVjei8wdCtmbGdmZlo4eTJqVFdqSDhSMnpqZE9Mb2ovZlJFbUUyK2NsbTBDaFhmN01POTVrYkI1b294bnRscjc5NmVPU0RvNjR2SURVM1hDcENtZURhNDAwU1ZTeUsxRFlhREhZckMwaXdLTWI0eFRsNytsMWlYbkJFV2JCMFRmWWpXak5JMGpEY1VFZVBYTlU4bGwxVitySzA5R0ZpU2hjYUdxT3VHUFNhbVpDSjBuSHdpNWp5VkFDT0c0MlFFL3NQdEs4WS9KZll0T3YvQ3ZJekc4alRNSE5QYmViMXBMaFZhcXhHR0YwT2lGT1FuNit6Zk1lMWRmMHRNOFF5MHJJN1JoRkxES28rTXMwejU3QmVQZ0hQWGQvL3VUcjM1YS9uUVY3L2Y2ZHYrbjMzM3dTSy90RmNCZFNac2xGQzVkSFFvT2pvOGNuRGsyUlVlTmpTQzdBZ2ZHUXZEcDBvSExGZ2JRSUFLTzFZWENUdVZDbG53dmduTnpWRnREQ0lHY2h0V2FYSmI1WEpwRUdHWDBIZG83TU5ydGNBei91R201YU5STVdqcCtXOWZVdk45RWljNUtzbkcxcFRsTnBLbTYwM215L1NsWTRocDMvZmdvKzJ1UC83czI2bVVtU0t3Q25hUlNkUFZBR1Y0M2FJbGxmQll2TlFCRUtoT2xFUkZaNFJLOGpDVjdBcnQySG42U01GaXlPcjNId2VGRlBwR3NuTFQwdUE3bUNuTUNHNlVuQk9hRTQ5TEVIQXpPS2tKUkRTMmhTN1BLZ2xMRnhDMWFNT1NSUWUraWxjc2ZVL3RXd1RvZTh0NUhMbWgvM3AxN2V6NDRKVjc0RTdWWHBSWTQzNFR0NHRXaDdmblJSRlRTRFdpNVdHVnN0VlUrWEpqVGRIb2Rmb3ErME1jN3o4Qm5zNGFDcVhBQ3M3bVJ0NktxeXhmajB2QzQzRWJzVnYxWmJZOWpINHdpMFJMeG1JVk1Va0tNdXlOdXE3Y3liakpLaUZTeDArTGlkTFhMY1FDSlVGYlNCMy85eXJHMW1rVWVSMDNDWTVyRHJRN2ZSeS9lc1g3NnA0SGE5YlV6ZDZzNmlmcUFMUXdtU0dRTFRialVoLzFLNVp0MFFWVElvZTk5RnhWZW1TRGxCZGxVcEU0OWJyeDhTZ1FMeUVqSnpnd3FyUE9UWm1ablhrN3VqbUh6T0p4TXBJU3VCazhGcGNjdjA5WXhPUWJmT2JYaGxkMkszcGZtKzNIMFd0d2xkN0VET1dZTmxPUlJXSGM2UGNPUXYxS2JBQnA0OWtqUlVuY3pLenNTOUdzRHZRY1RuWHFiWW9JYXRSUC9qMkp0Q2YxajcyUWNCMTAxNm5paG5XdlVOWG9RenFiZzdVbVZpMmNuM2JOTlVhUTZIMFNiU1VFZWd6YXFiUzc2NFZraWpHY2VlQVpJdDVuUWpWWlZDc2RzQmwrOUtIM25KY1I2Qkp0dmhEZlBQZGNhbUwvTzIwMVluZVRjOXovZ2Z2N3VBOGU5TEZnZS8rM3pxM001RFNGV0F4ajVEdUQxWVpVa3llbk43UFJLeUszMHJEcWNYWGo3UGpnYzRlMldRdmJ5eTBvR2VvbEQ3a1gwZEYwZzBwakVPbG5hTFdyUG5hTXQ5MjN0OG42M2FqMVpXY1lSTnFISWtJM2JNc25vMzV5Nmc3NnQ5dzJpS1MrM01sNDFDcUowY25USWxEcXdBdmlVcmt1Rm54T2FoS1Fjb3c1K1BOZ3Zsd3JLajNvTTc5RFByR29kUEdhdUZIYVpTb3Q0YStJd29IRzRySWxUWVY5b1lxSWNFVm9tQ0k4d3RiVkhuN0RuaGxWbVUwUncrTkNHZjYwVUlvLzNMLzl4TkRjRlF1R3RhRU1LQTJaRFlWRDIwLzZzWGM4Rmo5Mml0bXFJMVpwN2phR0k5ZmNzeEluTXFZQ3MyYzhXTUhib091ZFNSS2d5aUtGbDNHWFBUTURhUU8xQWVvclhST3FMSWkwZTZQZGZOMDI2Qk52dGp6YWVVa1QrT1lwajZkNTUwRGNTOWpBUi83Q1FPMXBTV2N6dVFHOXgxQk83MjNCTWRrOEsycXZrN2ZLNGlPY2YxSUVpNWx5bk8rVE43ODc0bklYcnZQZzN1L21jZFVPZWtCNFArQVdDckFFN2MzMzVGeE0zRkhWaGxCR2lQd0p3YjhHaGs5VEJ0R0pNU3JuakJsYjF6aUNQZHhjckJUYk9HNE1qcjR0WHNqczlOOXJOYkhmVC9MWDk4clY5eUNydXJkWE84UGM1cnM0Vlc0eEE4ZkhuLzBxUTQwOXZIemtTTmpKc1AyWDI5YTQyMGtGVGhmRGk0K0h6WUhhc3AwMitpditLUWtzdWF4QXVjaFlweWpGeThiUjE2aU5YdllVUlpTSEtHRFRJVC9rNXlON2xQTTcxSU5CSGJ2N09oY2ZXbVVoZGZzQ2owRE55SGhHZmdvWm00TmxBd25PblJsaDhEM1FPZU42N280ZGU1Y1A0NjY3K2VaY2E5bFJWa2JqeUxabHdvdmtQTVAra2FXbFkzaEdGVDBSeFNRbkQvR3psTFNTM1JVbG5yK09sZmxIakNXbDdJMEkvVkhEMUVWYzhBdUw1blBkVVg0cmZMQ1B2WktQcjA4K3ZpNTVmRjM2MWg5UmNTc3lZamJUdWNIeXpPNERJK05KdGFCUzFHMzJ0c3hBVTBRQzlsWlVjaXdwTTVhYW1sSEdTZ0Y1WkxIU1V4TTU2VmswVG1waUtpdlZ4OWNUdTI3eng1dTN4OS9zL0w5a3d0VEhuUmN3RVExTm93UDFHSFE0Zk9XRU43b0dPbHhSVUJ5ckR1UlJnU1hHZEV5eExVazRPRENWV3R1N3VGM0k3QmxncUxVclJZSWRaaGxxcDI3aEhwN1RuZENtSTZBZ0lJRVdGb2NuNFJJVGNFQ2ZuQ3U2RlQwZEhiS3dLMW13bDdjQWt1MW8zcTlMQVpiV2l0UFNidW1TOW81dEc4ZTN4V1lROFFtSitHUmsweEVnM0pjZ0JsOUdTOUF1Sk10ZkU4Mk9xZnJiRDZzYWpxWUF0a1YwZC83VzJTWm5YMzN2OWFPZ1V2RHQ3d1VKTFRwWVFTRDNWRS9LbmhUZDZwSjFvL2pxTlpmbWNIaVNwUi9QNks2ZFptajVPWlcyeGlUS2llVGRkR05aZUhLQzk4Qi9FajhmdjkycWl2Q1hSTmxrdGZDWjR4VkszdU80eER1NGpTNEsxR3NUejlqZHE0Q1B3d2piTDluNVRuQkw4UngvbEYrN3VXY3lkY0JVU0VmZ2tFWC9QR3h0VzNhVjBmQnZ4YUdaYmRXSDkrbHpUN2JzUGwwVmptSEYveUV4LzZXMFpWSWNtcTJJcE8xNnhJeUwvaStpU0tjcS81KzRpQThwODE4SnZRSlpOSGJNNlhDU2xxK3BkS08ybUxENDhRRWlCUUc0WFhXZThwQUNGYUFCVUhVR0N3UWlRSUpYcEUrdGUxSHM3bjRTUjdyYmNQbUlOSHFFWmFkSnNXaHd2RFRWWUlkMkVKMmloMFlINktIaG9YQm8ydndkamV5ZU1IWGRpK1IwUDJudlB6UnQreXdhMjJjanFtamNoUk1pR2JvWFpWRDNreVNxdTQyMHR0T0diamNqQ1VleEk0dmlMNEROQXRPTHpyVmJJYU9GZG1JZ1l0TkFUMHdQNGhZUG9lSFZaN0tabHFTdEljZ3FRQ1BWQVJiR1VsMWpqNm94c1BWQXFVT0c2b0swWC9iN0FETUhvdS9YRkoxaUVGNjdUTUZBbmEybGVrQXZ0b0N0NnpacTBYVjJMbEFJbVJUZGJSaTNJTzJBM1ljZ2F0UDdoT2Z5STA5aUtabUtuTE1OT05RYUdGTkVmaUFWUXNJcE9tRXpJWlVFQTJUYnBqUEZ6eU5rZFNseWlUUzFCaU1oR3FRR3RYeURtZ0tVRjdpb1RySUxkMm9ldFNmdCtzUkpLZ1FKMGhmWGRjU2lKSHJhb2VlWnZ4dVNidFlMOUVMOW5uNWZmNkUvME92MGwrajUvUHJ2dWxrdjBBdjFlL3A5L1lYK1FLK0x2dXpnSVFzV293bmFYYTZzVzdMNnZXUTd0ZGp5V2VVdm9IV3N5ZVMwS015UXVOck1BSENqRmhQVGgrcUdQWWxRdkpYWDVYN1dibUNwTFFocFJiM0RNRmNzSXU4ZGhvSDUwNkx4Nks5RDE3VkIzb1N6TFVNVno3ZmNDMXR0em5uTVlKTTJvRFl3OXpKc3ZVUEo3dy9iY3ZneFhhS3pLMjVqMk1yYi9jb25JSXkydDRNNXJQMmFBL21DWGRWQWo4cDVPb2gzcUQyMnBqcEk5UFhzbWlIQnE3bDZOVXRkRW1NeFgxajAya0RhY2RUTGF4SUR4WWJWYTl1dDNjeklhSWRjdSszUE9Pc2RtOThXTnkrY3ozaGpOT2ZSanNRS0d3b3I4Wk9ITHl4bWY3YTlYaXlVUnVpbytZYld0ZW9Uc1l4cVdpWVZpSVBseWkzblIycHRsY1R4N3kyZlhweHRpM2duN3V0YVMzRVRoNkxtRzNyWHJrVm8xL2NlbG8yenJwOWx5TTZwNmJ1b1VCeDBLN2ZNRm1udE51TDQ5MzZBWHB4dGkzZ243dXRhUzNFVGg2S3ljZDYxYXhIYTlidENBakNKM1hvNDJvNlVzalpIUVJTSTJPV0kvbnA1TzFkR25WbksrL09rNVc0d245UnUxNGVMVWV6N0dEdmF1UmhMQ1ZNbmNuRHdEZDNpbUJHSzNNNkdlR0JrY0kvMTluaGM3NDNkUzQ5VjM2SUZsVitCZ3FWOW5id0tPR1M0ZlJmMzJYSGFrMDFxR2JhcERhWnJYMDVnNHpuSnhvYURIK3poRXduYWsrTnVUWXp3RWxoU0Iza1BDQW1PdDJJa1pEaGtwL05WelVTYkxjZzZRaEpRREN5N2crWFplS3REcEt3d1JYWm5nQ3BwTmF3cWd2ZUdZYkdPakhTYU13RXJyK0pjdmM2SjVwR1AzUkhyQkVKUkRyN1pRVlc5ejBZR2szZEExb3pIR0FJbkxTQkc2QWNNRUdzVnJaRXQ3blpDQkU4cmlzMmEwZExPYVdwZlB5dlNKUW9ZU29saXhuYlB6S1AzUmlsc3JSYlVoTy9VUWVxMys3cUo0eUFZQVJBZXRySlVUajhaZ1VGcm04M0drbFd2RHRWQ1p2T0JzRW13UFJoRXNwVnFUTlNubGY2eGhpdm9GeS9RaTBKblZqY3RsYWJ3MWt3WXFZZktpb2RnT3ltTnZwU1VPWXM4ck1wWFFLTklFME1oNzhRcUM5b1VpSkltOXRoN1NCQUJ4bHR4dWJpWXpUYVdwTzR3ZzRXQzBLeXEzLzcvT1hhTEowbjhUei90alVubjZJK0dTa21EcEI0a0RPdEw2NVNwUlNTRFlza0o2aXpOSjNyWGRWa0c5cmhTM0FLR2hYbWU0QlBDV2hKZis1UFdqTklZRjJNLzJYdGxVRndjRkJDRHpja2RWSER4RTNNRzRQcE1zak1ldnp3ZGtZbGNid3c1cFpJVW1NQzVVV1JwdlViQXg1WFFGYWpMVFdqYWkrcWtpRkhjaWhiVG9MUXJJVC9WK296TndNb2hUTDZMM3ZZR1dLK05mVms4R3RqUFYza2ZTM0s3aUVOeGpwMXRsTGJiclJKQU5qNmorSWJxMnRaT3BhbFFRajQxbFVIc0s5ZWczNjlqVlYvdkpVbGFrN3Z6WWNFU2FaL0JhSEk2WDRhTEt6aDBZS0VJZ3J1MHZjVHBXcW9lRG5BeFZtYWlWaW1hNkxRS1hucGlEUWZPUjBBYUxWRTVGeVdydFRIdk9nV1FSUFJObG9keWdCVXNKUWs5WkNYSlhiQXVFeXM5WEhHalFUVmVpMTB1RU1JZ1drY05aMlBGc0x5TS81L1ExNkMwTnpmV29YTkJqS0tEVEdEUFlNa0xLT2xwV0k5QVhJSzAzV2preExqUjA2U2Jsd3hZdzFsSFZGcGhnZ2pRYUlYR2xCckVNYnkxcXBXdWp5SVFKM0J1bWNIWFpLL2FqZVFRTGg4YnBTYWVpeWNsRk5qUnByRTl0MGY3MjI4ditiUFBOaHV3Q2NPdjFiWHdCcFUyY1N5K3puK0podjNIMm9BNHI0Tm8wM1dHMVdEeEdCMklCYWxsQitORHY3RllyQ202TFZPMTB3Y28ya1RISWVjbVNPQVI0ZUdRQlh3OWdoQURKRnpUYmplWUwrU3VteGhnWmJheVlTbG1IY1k1SFVXOUtCeVlWVlVjVTd6WE5nWXk0SkJ6S09XWlIrUERybGFWcHZ3MDAvR29SUm42T0FaaGg0T0Qra3RadW5hcEZXMXFoTmxKbFlGMitVeWFsVHYyNDVmMkxwRDE1VnFUcUdOYWdzS2Zod0U2TFY5c0FSVGFveERvWEpwT21ZVjAyK3BSQVR5QWxFWExrTlNRTFhJTVNpY01SNVhLdzk3Umk0OGxrQ2p1TXM5QVdlY2lGSXppdWpiVVdubS82MmxZSVVjU1ZFSDNpUEtUaEt2bWFiYzNnL2ZRdTZMY0FLaThLSUJBQTBrYVpZUGZMYmtCYU9GSkZZakdvek80VXBqT2xybWVnaTllQ2dsc28rWk1OWURBWmlzSXkzWG05NHZrYkZaOXZWTTlpd0JlZkFLbnVxTEpkWU9oRmZlbHdHaUxEVnR3Q3dXN2FuZ3hENGRyUDRyVzZ6UzQzSnp4S0hWU2VpUG10emVqNUt5Tjk5c0UzMURTbVRWL1NjTmQzbEdUQm5vUG1kYm1lcnlpYVd3MWFFbkhaR0JsTFZnV0VkTk1MQWM0a0MwekhUNThPcDNjOHpVMEZIYlF6T080YWhnazM1cW40NWFaSlBmOXZ3VVFNSk0wQzJhcW8wdTl2c1lEWUl4LzF3S3EyMEFRWS9yWWZ4bFRNdDQ1emhUQU1xcm9pZzBuaEd4Q1RxRkVTbGtzYlZBbVZ3aEc0YU01ZmtTQTg4UFVvNHRDUFJxb2ZQUjBybXE0NnpvTkQ5VkY1K3h0Q0VxcitJU29tWmc0TmZxZHdVblUvSGZVbHI1TnJDblo3dmRKNHZWT1Z5Q2puTWZhaTFNdWVjbWRpc2FPbWxZcmM3ZDdXd1FUSUNza3FEdXc5OVFZeWJKdzJhcXJUWHBYZ2lWcGlHZ1FZa2hXNHluL2g5N2IyUGdmUmpSNmN6R3VDSDNJRmxoVERDWXBKeW5TdUZuek1CeEdrVHROMHdCTDFDYkpxWGl0SzZVcXJUVUhOa1EvTjBjWTlkdStmcmZMWnE2NXMrUXFvUHFKNjc0RzE1NjI5Kzd1TGhmeTlPNWRmcFRvRlJyYzNYc2VRcGFlTjh2QzJWZzVNZVhVNktWUkFBaVliVFJKSFhRa0llRmQxeVlRMVhkTSs4Vzg2MEp4djZPRW12Q21NM3hOSWRQbUdKWTNGYVZNNkJ0QmpCR1N5Vk1iN210UlFHMm1VTXdEaFlPTGc2cFpiQzd5V3ZWL0h5MDFqZFgzUmwxUUJwOHNNTGRaMDRmVGkzZUZtUGI3OWhmMHZpbjhrUjgvOW1sUGxmV0tYRVRqQWdPSW5xdHF6YkJRZ21nS2F6bnlPT1Q3aDBOSSs1Q0xoNDBWblRzZVRXOThtUVo0enJLeExkbjQ5SmFaTnhlS2h6MkZnNHRyVzg2dDRsWGtUYmdtVGNhbXFCaWVMdVgxTTBFK0RMSnBMVXNuMDRjdVlBTk0rMGZ6UGk4VVg3OVBDVjNkbXZBQmxEb25ROFRsd2tkZjE5R0h3ODB6WHRuOHZ2byt3MmVSSmN2WFQ4RDZjSW1uUUJJL04vdTIwd0NEbnMzaWtSODlBSHRvUUE2UWVYVytXR2ZLdERHM0c5bGMwOHlIeTVFeGp1Q2xId1dnd2tvM1pMM3FkeVI3Q3FYOVpkNzdtNHZIai90ejNxSURqQkNCTXJCN0FETDlCby83NVRJSXhtUGZnNXJjN1RJeldQdjRhRGdkRjVadERqOWtUbDh3L0pCWHZNeVVsWWZmQUZlVjQzaWNhRkxuTGVQRTM5M0pVYlptR3J1NStPQU9TT0k2OXpmVEtUTEVoa0N4T0dGQ3VWM0hnQllEcmhpQnRPdGF6WXZGTzVYSER3SDRhTkk5NzQyNkRqcUhHelAxWW8zbklGNFhhczljSlpWZ2Vmbll0RkhGQmxTRmtZeHYrUjJCeW5jN2FmUXptT2E4WHB0Vm81b20rQTVSRi92ZjVwTmRYcUpTbmM4Ylh0SldPOUtjSFMrTng2YUdxajZMQnJ3dGtPOEl0bmVwbEJvemI0elEvS3RPTjVMaUZkVUQra2hwQVJsREh3QlgwRXlBUmhuUkJGS1NvOFZrRXh0VFlDdEhkTkk5Qjk1OGNEbzVkNnRvNjl0VkJidFo3NmJQTHlMOEdnejdYcHR0R0VwVm9wVXRCY0FsVWhCWGQrNTlzTm1QdlliZ2ZkNFBUeHlqOTFvcE9sWDJKaloxU3IwZjNlK3lPSmFZdTNUQ2d6SmtOcm95U3ZHSnJqdHMvd204MjNqcXE1bURmWC9qWTQ4OEUrY2JjYXFlbmtTNGRCQkdYTXh1WTFzU25HUk1TU2ZBWHliRnFyb2J2N21ycHFKR0w2VWY1dk1vZ3NicDhJMU53K0dYNUhhK3VIcFhuazEwQmU5TmZOSnMrT2FOTjJxN0JWN1NkTU1lYjEwL0tXM016M2xZRGg0U1JGcmRyelVrc0o0OXJnQUhYbWZQSlloUDZ2THZhOWdLNHJtU0JxK1gwd3NKRE1UTFoyaDYvNkN2M2xNK3JaVkx5QWZqbVFZSWtQS2srYUJ5UENBQUdLaC92amJMUU9kVy8zY2NoU2ppdDg4ZC9ZRTUzQysrN2ZGbjRlYUt3OElkSXdJZWRIZUJBUDhvZmNaaDFRbkZraEFzbGljUzlyd2pXRTNscXh2V1dXRTdaVlNQRUZVejlGa2FhenNBWGZvWmxkWkVZTGgxR2JSVkdhbXgwcUhXWkNiWG5VUVRuVUdZME82KzBnSzBWRTFqTndXcHhoTkhLWkp3TmR0bHZDREswRDRLdUVGMmR3L0YvVzNLbEJsRWFvbk9Hc1BYelZVd01JZDNyWTVHT2NzRW1EK3F4UUM3elpkSWM2TnF1QUZsRVRiRTJOVGpRYkFmdUdSZzZ3RXJZM09WS2EwN01jdyt2bVpRdGM3ekwzMUdWOWNsZDZtbDVjMlFPZ3kxdDBIekVGYWo4SnphOVdldUdWeWE1Zlc5aXNGWTdnSjM2eXVlb0pDQ1pjRk0rNTF5SnFyV3pQTnJFdkMzeVdzcFViVXA4MExURnNLM2hzY3BwM1NoTkVOUFVFeGhrSWxjVUR6bXdFK2sxZDF3RzJ1a05pbFZ2ZFdCMElOc2xZTDlONU5KTzlDRVVMRnNPWlNxcnJHMHQ1WWI3ckpZTWU4eVF2QzhOTmN2R3l0RWpYb2VmVXkvZGxuVHNOY0VRN0FZWWtIandCbU5nYjJDQzR2YjlwZDdTeFdIYWFGVU0xU1hFSXNBQTRDWWxmb1dTOE5la3h0TE1uQ0lRNEJoeU14dHFGV0xjVTQ5RHIvSnAyVVFGbE9kbnMvTXVFRE1vSVJVY3ZKWlhyYllGQzlYWndhRjBNVkhObksrMFI0WkJXMW5XZXpuc1VwcXRHdFRlR1RLeXpXbU1JNmJDalBUZ0lxRlpmbVp6Z3RSL2ZDM3FvZEtRSHcwc2RBN3JXVTJxckFlU2ZSS1FrQlBUMW9pRExYNHg0NFlzY0w2dUVVN0ZrZzlFOU5qaVBsVTZwNTRldEJ2V1RkbFZnQ1BNa2s4TGFPcmNrUHJzbDdlZ1Z1ZFlzeFBGd01kbk9vM0VRUWdFa3pqYWlBT0ZGSXE4NEVlUEZ5TFVTTElUWlVNNjVBZnZnR09KWkRaY0N5RkVBZVBaUkRqNUxFc0ZMNGZ5OEV6WkJxdlJ4NGpRYVBvOERnRUVKUFNZd2xFWkhTSXA4OFFUNHMrVlNpY3ZsQjQyK2UrUm9JZlhxcU1VUVVkRGExS0FjQWdlcFVMQUUvUlZEbW1zaVJLSU1jbEIyR0lPWmFLV1ZHb0s0VldEcThxQ2EybUt0UVNTVWFpS0N0eXlZamFQQTBkZ3RpR0NrUkNFV1d4bENSUkdvYjBWTlNaS0xFSWcyNlhkbWtiNXJzTGRVSmttQ2JyS2NVZ0V0R0xlQXJJbUlLY21YZytUMGRBcmVGd2xjZ0pNQUNsY3lVVVFQMTIwdkdCMGpscEtFVTRWZGxBVkNTVjBDY0lqTkMweTVsSWFISXhHWEtSaTBxWktRWXFWMHcrSWJJVktESG1GVGpCZ201N2JSVnZMaytCRzZCbm5XcjhSbUYxSWhOVjc0L0t0MEYrWGxDUnVWR2VDVG4zajlLVFVMSWtLRjZPZm10RytqWUtaNExPTmRCNkE0MVhRTzFFcU9MZ0tHUFdwd2dtQ29iZGtBOUhadWhJYmNZWVlMNThpN2ZkT1NKdEdYbnFFNm9HQWtGZnJneElsdExoTjJmdzJPR3kzZEJ4QXB1YWFVa3drOUc5T3ZUQ0JzMTJDS2NMb2t5Z0lIRFFiTGloQ1hJNnd0QWd3WnovWUxNSmhNQUJhR1pnZ2hwNkFZcUhZaE51R2RnQVg1c0FEVFROM3ptdC9DQ2hKYVFDbWd4cDJCekNoQ2JnanNWTG9MRXhtUThkallLR0l0TlhBUklBQm9wRHdCSFFZQVFPaW5BRkFjVndFQm9hQklSQ1ljQS8vS0FhYUFBVUI0VkNmTDNGL3I0UXFKL1BId3J2UDd3d1FLaklOOUU3UVFTQ2lFOFdBRXh2ZlBlT0o5cUQ3NDUyNDNzSTNZVHpNQzU4RG1QSEZ3dFpvYk5kRS91R3RaMy9SNGtqeHBrdndEandpUlM5SkVLUmtCZGVkSGpEazUvUTk0T2tNdG1NRTRnUzR0MC9tdTdlMzVrZTllejBYTkxSemttMktHSDA0MzA4eGo5WjBmVUxKOWYxNFhWY0E3OW1zckFaMU1NTU5zMGF1ck5yaVlpL2VyNy8rUk1xYW4zOEtjaXZETjU5UGhJbHc2ckJtYS8yU1JLUlJLemlrMFFRTXVDbWxHMUM2UUtZVE4rNEt1UnlsTEFDYW14Vys1M1BnN241SWNzQUFBPT0pIGZvcm1hdCgnd29mZjInKTtcXG4gIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQkItMDJCQywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIxMjIsIFUrMjE5MSwgVSsyMTkzLCBVKzIyMTIsIFUrMjIxNSwgVStGRUZGLCBVK0ZGRkQ7XFxufVxcblxcbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxcXFxuICAhKioqIGNzcyAuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi9ub2RlX21vZHVsZXMvc2Fzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zcmMvaW5kZXguc2NzcyAqKiohXFxuICBcXFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXFxuLypcXG4gKiBDU1MgZm9yIGpzUHN5Y2ggZXhwZXJpbWVudHMuXFxuICpcXG4gKiBUaGlzIHN0eWxlc2hlZXQgcHJvdmlkZXMgbWluaW1hbCBzdHlsaW5nIHRvIG1ha2UganNQc3ljaFxcbiAqIGV4cGVyaW1lbnRzIGxvb2sgcG9saXNoZWQgd2l0aG91dCBhbnkgYWRkaXRpb25hbCBzdHlsZXMuXFxuICovXFxuLyogQ29udGFpbmVyIGhvbGRpbmcganNQc3ljaCBjb250ZW50ICovXFxuLmpzcHN5Y2gtZGlzcGxheS1lbGVtZW50IHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgb3ZlcmZsb3cteTogYXV0bztcXG59XFxuXFxuLmpzcHN5Y2gtZGlzcGxheS1lbGVtZW50OmZvY3VzIHtcXG4gIG91dGxpbmU6IG5vbmU7XFxufVxcblxcbi5qc3BzeWNoLWNvbnRlbnQtd3JhcHBlciB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgbWFyZ2luOiBhdXRvO1xcbiAgZmxleDogMSAxIDEwMCU7XFxuICB3aWR0aDogMTAwJTtcXG59XFxuXFxuLmpzcHN5Y2gtY29udGVudCB7XFxuICBtYXgtd2lkdGg6IDk1JTtcXG4gIC8qIHRoaXMgaXMgbWFpbmx5IGFuIElFIDEwLTExIGZpeCAqL1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgbWFyZ2luOiBhdXRvO1xcbiAgLyogdGhpcyBpcyBmb3Igb3ZlcmZsb3dpbmcgY29udGVudCAqL1xcbn1cXG5cXG4uanNwc3ljaC10b3Age1xcbiAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XFxufVxcblxcbi5qc3BzeWNoLW1pZGRsZSB7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG5cXG4vKiBmb250cyBhbmQgdHlwZSAqL1xcbi5qc3BzeWNoLWRpc3BsYXktZWxlbWVudCB7XFxuICBmb250LWZhbWlseTogXFxcIk9wZW4gU2Fuc1xcXCIsIFxcXCJBcmlhbFxcXCIsIHNhbnMtc2VyaWY7XFxuICBmb250LXNpemU6IDE4cHg7XFxuICBsaW5lLWhlaWdodDogMS42ZW07XFxufVxcblxcbi8qIEZvcm0gZWxlbWVudHMgbGlrZSBpbnB1dCBmaWVsZHMgYW5kIGJ1dHRvbnMgKi9cXG4uanNwc3ljaC1kaXNwbGF5LWVsZW1lbnQgaW5wdXRbdHlwZT10ZXh0XSB7XFxuICBmb250LWZhbWlseTogXFxcIk9wZW4gU2Fuc1xcXCIsIFxcXCJBcmlhbFxcXCIsIHNhbnMtc2VyaWY7XFxuICBmb250LXNpemU6IDE0cHg7XFxufVxcblxcbi8qIGJvcnJvd2luZyBCb290c3RyYXAgc3R5bGUgZm9yIGJ0biBlbGVtZW50cywgYnV0IGNvbWJpbmluZyBzdHlsZXMgYSBiaXQgKi9cXG4uanNwc3ljaC1idG4ge1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgcGFkZGluZzogNnB4IDEycHg7XFxuICBtYXJnaW46IDBweDtcXG4gIGZvbnQtc2l6ZTogMTRweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBmb250LWZhbWlseTogXFxcIk9wZW4gU2Fuc1xcXCIsIFxcXCJBcmlhbFxcXCIsIHNhbnMtc2VyaWY7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBsaW5lLWhlaWdodDogMS40O1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xcbiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICBjb2xvcjogIzMzMztcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XFxuICBib3JkZXItY29sb3I6ICNjY2M7XFxufVxcblxcbi8qIG9ubHkgYXBwbHkgdGhlIGhvdmVyIHN0eWxlIG9uIGRldmljZXMgd2l0aCBhIG1vdXNlL3BvaW50ZXIgdGhhdCBjYW4gaG92ZXIgLSBpc3N1ZSAjOTc3ICovXFxuQG1lZGlhIChob3ZlcjogaG92ZXIpIHtcXG4gIC5qc3BzeWNoLWJ0bjpob3ZlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7XFxuICAgIGJvcmRlci1jb2xvcjogI2FhYTtcXG4gIH1cXG59XFxuLmpzcHN5Y2gtYnRuOmFjdGl2ZSB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkO1xcbiAgYm9yZGVyLWNvbG9yOiAjMDAwMDAwO1xcbn1cXG5cXG4uanNwc3ljaC1idG46ZGlzYWJsZWQge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTtcXG4gIGNvbG9yOiAjYWFhO1xcbiAgYm9yZGVyLWNvbG9yOiAjY2NjO1xcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcXG59XFxuXFxuLyogY3VzdG9tIHN0eWxlIGZvciBpbnB1dFt0eXBlPVxcXCJyYW5nZV0gKHNsaWRlcikgdG8gaW1wcm92ZSBhbGlnbm1lbnQgYmV0d2VlbiBwb3NpdGlvbnMgYW5kIGxhYmVscyAqL1xcbi5qc3BzeWNoLXNsaWRlciB7XFxuICBhcHBlYXJhbmNlOiBub25lO1xcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xcbiAgLW1vei1hcHBlYXJhbmNlOiBub25lO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcXG59XFxuXFxuLmpzcHN5Y2gtc2xpZGVyOmZvY3VzIHtcXG4gIG91dGxpbmU6IG5vbmU7XFxufVxcblxcbi8qIHRyYWNrICovXFxuLmpzcHN5Y2gtc2xpZGVyOjotd2Via2l0LXNsaWRlci1ydW5uYWJsZS10cmFjayB7XFxuICBhcHBlYXJhbmNlOiBub25lO1xcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBoZWlnaHQ6IDhweDtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG4gIGJhY2tncm91bmQ6ICNlZWU7XFxuICBib3gtc2hhZG93OiAwcHggMHB4IDBweCAjMDAwMDAwLCAwcHggMHB4IDBweCAjMGQwZDBkO1xcbiAgYm9yZGVyLXJhZGl1czogMnB4O1xcbiAgYm9yZGVyOiAxcHggc29saWQgI2FhYTtcXG59XFxuXFxuLmpzcHN5Y2gtc2xpZGVyOjotbW96LXJhbmdlLXRyYWNrIHtcXG4gIGFwcGVhcmFuY2U6IG5vbmU7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogOHB4O1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgYmFja2dyb3VuZDogI2VlZTtcXG4gIGJveC1zaGFkb3c6IDBweCAwcHggMHB4ICMwMDAwMDAsIDBweCAwcHggMHB4ICMwZDBkMGQ7XFxuICBib3JkZXItcmFkaXVzOiAycHg7XFxuICBib3JkZXI6IDFweCBzb2xpZCAjYWFhO1xcbn1cXG5cXG4uanNwc3ljaC1zbGlkZXI6Oi1tcy10cmFjayB7XFxuICBhcHBlYXJhbmNlOiBub25lO1xcbiAgd2lkdGg6IDk5JTtcXG4gIGhlaWdodDogMTRweDtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG4gIGJhY2tncm91bmQ6ICNlZWU7XFxuICBib3gtc2hhZG93OiAwcHggMHB4IDBweCAjMDAwMDAwLCAwcHggMHB4IDBweCAjMGQwZDBkO1xcbiAgYm9yZGVyLXJhZGl1czogMnB4O1xcbiAgYm9yZGVyOiAxcHggc29saWQgI2FhYTtcXG59XFxuXFxuLyogdGh1bWIgKi9cXG4uanNwc3ljaC1zbGlkZXI6Oi13ZWJraXQtc2xpZGVyLXRodW1iIHtcXG4gIGJvcmRlcjogMXB4IHNvbGlkICM2NjY7XFxuICBoZWlnaHQ6IDI0cHg7XFxuICB3aWR0aDogMTVweDtcXG4gIGJvcmRlci1yYWRpdXM6IDVweDtcXG4gIGJhY2tncm91bmQ6ICNmZmZmZmY7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XFxuICBtYXJnaW4tdG9wOiAtOXB4O1xcbn1cXG5cXG4uanNwc3ljaC1zbGlkZXI6Oi1tb3otcmFuZ2UtdGh1bWIge1xcbiAgYm9yZGVyOiAxcHggc29saWQgIzY2NjtcXG4gIGhlaWdodDogMjRweDtcXG4gIHdpZHRoOiAxNXB4O1xcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xcbiAgYmFja2dyb3VuZDogI2ZmZmZmZjtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuXFxuLmpzcHN5Y2gtc2xpZGVyOjotbXMtdGh1bWIge1xcbiAgYm9yZGVyOiAxcHggc29saWQgIzY2NjtcXG4gIGhlaWdodDogMjBweDtcXG4gIHdpZHRoOiAxNXB4O1xcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xcbiAgYmFja2dyb3VuZDogI2ZmZmZmZjtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG4gIG1hcmdpbi10b3A6IC0ycHg7XFxufVxcblxcbi8qIGpzUHN5Y2ggcHJvZ3Jlc3MgYmFyICovXFxuI2pzcHN5Y2gtcHJvZ3Jlc3NiYXItY29udGFpbmVyIHtcXG4gIGNvbG9yOiAjNTU1O1xcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZWRlZGU7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5O1xcbiAgbWFyZ2luLWJvdHRvbTogMWVtO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgcGFkZGluZzogOHB4IDBweDtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgbGluZS1oZWlnaHQ6IDFlbTtcXG59XFxuXFxuI2pzcHN5Y2gtcHJvZ3Jlc3NiYXItY29udGFpbmVyIHNwYW4ge1xcbiAgZm9udC1zaXplOiAxNHB4O1xcbiAgcGFkZGluZy1yaWdodDogMTRweDtcXG59XFxuXFxuI2pzcHN5Y2gtcHJvZ3Jlc3NiYXItb3V0ZXIge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTtcXG4gIHdpZHRoOiA1MCU7XFxuICBtYXJnaW46IGF1dG87XFxuICBoZWlnaHQ6IDE0cHg7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcXG59XFxuXFxuI2pzcHN5Y2gtcHJvZ3Jlc3NiYXItaW5uZXIge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2FhYTtcXG4gIHdpZHRoOiAwJTtcXG4gIGhlaWdodDogMTAwJTtcXG59XFxuXFxuLyogQ29udHJvbCBhcHBlYXJhbmNlIG9mIGpzUHN5Y2guZGF0YS5kaXNwbGF5RGF0YSgpICovXFxuI2pzcHN5Y2gtZGF0YS1kaXNwbGF5IHtcXG4gIHRleHQtYWxpZ246IGxlZnQ7XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLypcbiAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcbiAgQXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcpIHtcbiAgdmFyIGxpc3QgPSBbXTsgLy8gcmV0dXJuIHRoZSBsaXN0IG9mIG1vZHVsZXMgYXMgY3NzIHN0cmluZ1xuXG4gIGxpc3QudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBjb250ZW50ID0gXCJcIjtcbiAgICAgIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2YgaXRlbVs1XSAhPT0gXCJ1bmRlZmluZWRcIjtcblxuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICBjb250ZW50ICs9IFwiQG1lZGlhIFwiLmNvbmNhdChpdGVtWzJdLCBcIiB7XCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKTtcbiAgICAgIH1cblxuICAgICAgY29udGVudCArPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pO1xuXG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG5cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG5cbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH0pLmpvaW4oXCJcIik7XG4gIH07IC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG5cblxuICBsaXN0LmkgPSBmdW5jdGlvbiBpKG1vZHVsZXMsIG1lZGlhLCBkZWR1cGUsIHN1cHBvcnRzLCBsYXllcikge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgbW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgdW5kZWZpbmVkXV07XG4gICAgfVxuXG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcblxuICAgIGlmIChkZWR1cGUpIHtcbiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdGhpcy5sZW5ndGg7IGsrKykge1xuICAgICAgICB2YXIgaWQgPSB0aGlzW2tdWzBdO1xuXG4gICAgICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICAgICAgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2sgPSAwOyBfayA8IG1vZHVsZXMubGVuZ3RoOyBfaysrKSB7XG4gICAgICB2YXIgaXRlbSA9IFtdLmNvbmNhdChtb2R1bGVzW19rXSk7XG5cbiAgICAgIGlmIChkZWR1cGUgJiYgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpdGVtWzBdXSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBsYXllciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW1bNV0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQGxheWVyXCIuY29uY2F0KGl0ZW1bNV0ubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChpdGVtWzVdKSA6IFwiXCIsIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG1lZGlhKSB7XG4gICAgICAgIGlmICghaXRlbVsyXSkge1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN1cHBvcnRzKSB7XG4gICAgICAgIGlmICghaXRlbVs0XSkge1xuICAgICAgICAgIGl0ZW1bNF0gPSBcIlwiLmNvbmNhdChzdXBwb3J0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQoaXRlbVs0XSwgXCIpIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzRdID0gc3VwcG9ydHM7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGlzdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gbGlzdDtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykge1xuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICBpZiAoIXVybCkge1xuICAgIHJldHVybiB1cmw7XG4gIH1cblxuICB1cmwgPSBTdHJpbmcodXJsLl9fZXNNb2R1bGUgPyB1cmwuZGVmYXVsdCA6IHVybCk7IC8vIElmIHVybCBpcyBhbHJlYWR5IHdyYXBwZWQgaW4gcXVvdGVzLCByZW1vdmUgdGhlbVxuXG4gIGlmICgvXlsnXCJdLipbJ1wiXSQvLnRlc3QodXJsKSkge1xuICAgIHVybCA9IHVybC5zbGljZSgxLCAtMSk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5oYXNoKSB7XG4gICAgdXJsICs9IG9wdGlvbnMuaGFzaDtcbiAgfSAvLyBTaG91bGQgdXJsIGJlIHdyYXBwZWQ/XG4gIC8vIFNlZSBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXZhbHVlcy0zLyN1cmxzXG5cblxuICBpZiAoL1tcIicoKSBcXHRcXG5dfCglMjApLy50ZXN0KHVybCkgfHwgb3B0aW9ucy5uZWVkUXVvdGVzKSB7XG4gICAgcmV0dXJuIFwiXFxcIlwiLmNvbmNhdCh1cmwucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpLnJlcGxhY2UoL1xcbi9nLCBcIlxcXFxuXCIpLCBcIlxcXCJcIik7XG4gIH1cblxuICByZXR1cm4gdXJsO1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlbSkge1xuICB2YXIgY29udGVudCA9IGl0ZW1bMV07XG4gIHZhciBjc3NNYXBwaW5nID0gaXRlbVszXTtcblxuICBpZiAoIWNzc01hcHBpbmcpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYnRvYSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdmFyIGJhc2U2NCA9IGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGNzc01hcHBpbmcpKSkpO1xuICAgIHZhciBkYXRhID0gXCJzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxcIi5jb25jYXQoYmFzZTY0KTtcbiAgICB2YXIgc291cmNlTWFwcGluZyA9IFwiLyojIFwiLmNvbmNhdChkYXRhLCBcIiAqL1wiKTtcbiAgICB2YXIgc291cmNlVVJMcyA9IGNzc01hcHBpbmcuc291cmNlcy5tYXAoZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgICAgcmV0dXJuIFwiLyojIHNvdXJjZVVSTD1cIi5jb25jYXQoY3NzTWFwcGluZy5zb3VyY2VSb290IHx8IFwiXCIpLmNvbmNhdChzb3VyY2UsIFwiICovXCIpO1xuICAgIH0pO1xuICAgIHJldHVybiBbY29udGVudF0uY29uY2F0KHNvdXJjZVVSTHMpLmNvbmNhdChbc291cmNlTWFwcGluZ10pLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICByZXR1cm4gW2NvbnRlbnRdLmpvaW4oXCJcXG5cIik7XG59OyIsImV4cG9ydCBkZWZhdWx0IF9fd2VicGFja19wdWJsaWNfcGF0aF9fICsgXCJ2aWRlby9Bc3Rlcm9pZF9BdHRhY2tfRW5kLm1wNFwiOyIsImV4cG9ydCBkZWZhdWx0IF9fd2VicGFja19wdWJsaWNfcGF0aF9fICsgXCJ2aWRlby9Bc3Rlcm9pZF9BdHRhY2tfSW50cm8ubXA0XCI7IiwiZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyBcInZpZGVvL0FzdGVyb2lkX0F0dGFja19MZXZlbF9VcF8xLm1wNFwiOyIsImV4cG9ydCBkZWZhdWx0IF9fd2VicGFja19wdWJsaWNfcGF0aF9fICsgXCJ2aWRlby9Bc3Rlcm9pZF9BdHRhY2tfTGV2ZWxfVXBfMi5tcDRcIjsiLCJleHBvcnQgZGVmYXVsdCBfX3dlYnBhY2tfcHVibGljX3BhdGhfXyArIFwidmlkZW8vQXN0ZXJvaWRfQXR0YWNrX0xldmVsX1VwXzMubXA0XCI7IiwiZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyBcInZpZGVvL0FzdGVyb2lkX0F0dGFja19MZXZlbF9VcF80Lm1wNFwiOyIsImV4cG9ydCBkZWZhdWx0IF9fd2VicGFja19wdWJsaWNfcGF0aF9fICsgXCJ2aWRlby9Bc3Rlcm9pZF9BdHRhY2tfTGV2ZWxfVXBfNS5tcDRcIjsiLCJpbXBvcnQgeyByZWdpc3RlclZlcnNpb24gfSBmcm9tICdAZmlyZWJhc2UvYXBwJztcbmV4cG9ydCAqIGZyb20gJ0BmaXJlYmFzZS9hcHAnO1xuXG52YXIgbmFtZSA9IFwiZmlyZWJhc2VcIjtcbnZhciB2ZXJzaW9uID0gXCI5LjYuOVwiO1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5yZWdpc3RlclZlcnNpb24obmFtZSwgdmVyc2lvbiwgJ2FwcCcpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguZXNtLmpzLm1hcFxuIiwiZXhwb3J0ICogZnJvbSAnQGZpcmViYXNlL2F1dGgnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguZXNtLmpzLm1hcFxuIiwiZXhwb3J0ICogZnJvbSAnQGZpcmViYXNlL2ZpcmVzdG9yZSc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5lc20uanMubWFwXG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbnZhciBydW50aW1lID0gKGZ1bmN0aW9uIChleHBvcnRzKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIHZhciBPcCA9IE9iamVjdC5wcm90b3R5cGU7XG4gIHZhciBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eTtcbiAgdmFyIHVuZGVmaW5lZDsgLy8gTW9yZSBjb21wcmVzc2libGUgdGhhbiB2b2lkIDAuXG4gIHZhciAkU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiID8gU3ltYm9sIDoge307XG4gIHZhciBpdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuaXRlcmF0b3IgfHwgXCJAQGl0ZXJhdG9yXCI7XG4gIHZhciBhc3luY0l0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8IFwiQEBhc3luY0l0ZXJhdG9yXCI7XG4gIHZhciB0b1N0cmluZ1RhZ1N5bWJvbCA9ICRTeW1ib2wudG9TdHJpbmdUYWcgfHwgXCJAQHRvU3RyaW5nVGFnXCI7XG5cbiAgZnVuY3Rpb24gZGVmaW5lKG9iaiwga2V5LCB2YWx1ZSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIG9ialtrZXldO1xuICB9XG4gIHRyeSB7XG4gICAgLy8gSUUgOCBoYXMgYSBicm9rZW4gT2JqZWN0LmRlZmluZVByb3BlcnR5IHRoYXQgb25seSB3b3JrcyBvbiBET00gb2JqZWN0cy5cbiAgICBkZWZpbmUoe30sIFwiXCIpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBkZWZpbmUgPSBmdW5jdGlvbihvYmosIGtleSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBvYmpba2V5XSA9IHZhbHVlO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gSWYgb3V0ZXJGbiBwcm92aWRlZCBhbmQgb3V0ZXJGbi5wcm90b3R5cGUgaXMgYSBHZW5lcmF0b3IsIHRoZW4gb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IuXG4gICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3I7XG4gICAgdmFyIGdlbmVyYXRvciA9IE9iamVjdC5jcmVhdGUocHJvdG9HZW5lcmF0b3IucHJvdG90eXBlKTtcbiAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTtcblxuICAgIC8vIFRoZSAuX2ludm9rZSBtZXRob2QgdW5pZmllcyB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMuXG4gICAgZ2VuZXJhdG9yLl9pbnZva2UgPSBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfVxuICBleHBvcnRzLndyYXAgPSB3cmFwO1xuXG4gIC8vIFRyeS9jYXRjaCBoZWxwZXIgdG8gbWluaW1pemUgZGVvcHRpbWl6YXRpb25zLiBSZXR1cm5zIGEgY29tcGxldGlvblxuICAvLyByZWNvcmQgbGlrZSBjb250ZXh0LnRyeUVudHJpZXNbaV0uY29tcGxldGlvbi4gVGhpcyBpbnRlcmZhY2UgY291bGRcbiAgLy8gaGF2ZSBiZWVuIChhbmQgd2FzIHByZXZpb3VzbHkpIGRlc2lnbmVkIHRvIHRha2UgYSBjbG9zdXJlIHRvIGJlXG4gIC8vIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHMsIGJ1dCBpbiBhbGwgdGhlIGNhc2VzIHdlIGNhcmUgYWJvdXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG1ldGhvZCB3ZSB3YW50IHRvIGNhbGwsIHNvIHRoZXJlJ3Mgbm8gbmVlZFxuICAvLyB0byBjcmVhdGUgYSBuZXcgZnVuY3Rpb24gb2JqZWN0LiBXZSBjYW4gZXZlbiBnZXQgYXdheSB3aXRoIGFzc3VtaW5nXG4gIC8vIHRoZSBtZXRob2QgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIHNpbmNlIHRoYXQgaGFwcGVucyB0byBiZSB0cnVlXG4gIC8vIGluIGV2ZXJ5IGNhc2UsIHNvIHdlIGRvbid0IGhhdmUgdG8gdG91Y2ggdGhlIGFyZ3VtZW50cyBvYmplY3QuIFRoZVxuICAvLyBvbmx5IGFkZGl0aW9uYWwgYWxsb2NhdGlvbiByZXF1aXJlZCBpcyB0aGUgY29tcGxldGlvbiByZWNvcmQsIHdoaWNoXG4gIC8vIGhhcyBhIHN0YWJsZSBzaGFwZSBhbmQgc28gaG9wZWZ1bGx5IHNob3VsZCBiZSBjaGVhcCB0byBhbGxvY2F0ZS5cbiAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwibm9ybWFsXCIsIGFyZzogZm4uY2FsbChvYmosIGFyZykgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwidGhyb3dcIiwgYXJnOiBlcnIgfTtcbiAgICB9XG4gIH1cblxuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRTdGFydCA9IFwic3VzcGVuZGVkU3RhcnRcIjtcbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkWWllbGQgPSBcInN1c3BlbmRlZFlpZWxkXCI7XG4gIHZhciBHZW5TdGF0ZUV4ZWN1dGluZyA9IFwiZXhlY3V0aW5nXCI7XG4gIHZhciBHZW5TdGF0ZUNvbXBsZXRlZCA9IFwiY29tcGxldGVkXCI7XG5cbiAgLy8gUmV0dXJuaW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGlubmVyRm4gaGFzIHRoZSBzYW1lIGVmZmVjdCBhc1xuICAvLyBicmVha2luZyBvdXQgb2YgdGhlIGRpc3BhdGNoIHN3aXRjaCBzdGF0ZW1lbnQuXG4gIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307XG5cbiAgLy8gRHVtbXkgY29uc3RydWN0b3IgZnVuY3Rpb25zIHRoYXQgd2UgdXNlIGFzIHRoZSAuY29uc3RydWN0b3IgYW5kXG4gIC8vIC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcyBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIEdlbmVyYXRvclxuICAvLyBvYmplY3RzLiBGb3IgZnVsbCBzcGVjIGNvbXBsaWFuY2UsIHlvdSBtYXkgd2lzaCB0byBjb25maWd1cmUgeW91clxuICAvLyBtaW5pZmllciBub3QgdG8gbWFuZ2xlIHRoZSBuYW1lcyBvZiB0aGVzZSB0d28gZnVuY3Rpb25zLlxuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cblxuICAvLyBUaGlzIGlzIGEgcG9seWZpbGwgZm9yICVJdGVyYXRvclByb3RvdHlwZSUgZm9yIGVudmlyb25tZW50cyB0aGF0XG4gIC8vIGRvbid0IG5hdGl2ZWx5IHN1cHBvcnQgaXQuXG4gIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuICBkZWZpbmUoSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pO1xuXG4gIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbiAgdmFyIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpO1xuICBpZiAoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgJiZcbiAgICAgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJlxuICAgICAgaGFzT3duLmNhbGwoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sKSkge1xuICAgIC8vIFRoaXMgZW52aXJvbm1lbnQgaGFzIGEgbmF0aXZlICVJdGVyYXRvclByb3RvdHlwZSU7IHVzZSBpdCBpbnN0ZWFkXG4gICAgLy8gb2YgdGhlIHBvbHlmaWxsLlxuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gTmF0aXZlSXRlcmF0b3JQcm90b3R5cGU7XG4gIH1cblxuICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPVxuICAgIEdlbmVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gIGRlZmluZShHcCwgXCJjb25zdHJ1Y3RvclwiLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gIGRlZmluZShHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgXCJjb25zdHJ1Y3RvclwiLCBHZW5lcmF0b3JGdW5jdGlvbik7XG4gIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gZGVmaW5lKFxuICAgIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLFxuICAgIHRvU3RyaW5nVGFnU3ltYm9sLFxuICAgIFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICApO1xuXG4gIC8vIEhlbHBlciBmb3IgZGVmaW5pbmcgdGhlIC5uZXh0LCAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMgb2YgdGhlXG4gIC8vIEl0ZXJhdG9yIGludGVyZmFjZSBpbiB0ZXJtcyBvZiBhIHNpbmdsZSAuX2ludm9rZSBtZXRob2QuXG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgIGRlZmluZShwcm90b3R5cGUsIG1ldGhvZCwgZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3JcbiAgICAgID8gY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHxcbiAgICAgICAgLy8gRm9yIHRoZSBuYXRpdmUgR2VuZXJhdG9yRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuXG4gICAgICAgIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgPT09IFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICAgICAgOiBmYWxzZTtcbiAgfTtcblxuICBleHBvcnRzLm1hcmsgPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgICAgIGRlZmluZShnZW5GdW4sIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvckZ1bmN0aW9uXCIpO1xuICAgIH1cbiAgICBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCk7XG4gICAgcmV0dXJuIGdlbkZ1bjtcbiAgfTtcblxuICAvLyBXaXRoaW4gdGhlIGJvZHkgb2YgYW55IGFzeW5jIGZ1bmN0aW9uLCBgYXdhaXQgeGAgaXMgdHJhbnNmb3JtZWQgdG9cbiAgLy8gYHlpZWxkIHJlZ2VuZXJhdG9yUnVudGltZS5hd3JhcCh4KWAsIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIHRlc3RcbiAgLy8gYGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIilgIHRvIGRldGVybWluZSBpZiB0aGUgeWllbGRlZCB2YWx1ZSBpc1xuICAvLyBtZWFudCB0byBiZSBhd2FpdGVkLlxuICBleHBvcnRzLmF3cmFwID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHsgX19hd2FpdDogYXJnIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7XG4gICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpO1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmc7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIikpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZS5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJuZXh0XCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24odW53cmFwcGVkKSB7XG4gICAgICAgICAgLy8gV2hlbiBhIHlpZWxkZWQgUHJvbWlzZSBpcyByZXNvbHZlZCwgaXRzIGZpbmFsIHZhbHVlIGJlY29tZXNcbiAgICAgICAgICAvLyB0aGUgLnZhbHVlIG9mIHRoZSBQcm9taXNlPHt2YWx1ZSxkb25lfT4gcmVzdWx0IGZvciB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IGl0ZXJhdGlvbi5cbiAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQ7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgIC8vIElmIGEgcmVqZWN0ZWQgUHJvbWlzZSB3YXMgeWllbGRlZCwgdGhyb3cgdGhlIHJlamVjdGlvbiBiYWNrXG4gICAgICAgICAgLy8gaW50byB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIHNvIGl0IGNhbiBiZSBoYW5kbGVkIHRoZXJlLlxuICAgICAgICAgIHJldHVybiBpbnZva2UoXCJ0aHJvd1wiLCBlcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzUHJvbWlzZTtcblxuICAgIGZ1bmN0aW9uIGVucXVldWUobWV0aG9kLCBhcmcpIHtcbiAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2VJbXBsKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPVxuICAgICAgICAvLyBJZiBlbnF1ZXVlIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byB3YWl0IHVudGlsXG4gICAgICAgIC8vIGFsbCBwcmV2aW91cyBQcm9taXNlcyBoYXZlIGJlZW4gcmVzb2x2ZWQgYmVmb3JlIGNhbGxpbmcgaW52b2tlLFxuICAgICAgICAvLyBzbyB0aGF0IHJlc3VsdHMgYXJlIGFsd2F5cyBkZWxpdmVyZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIElmXG4gICAgICAgIC8vIGVucXVldWUgaGFzIG5vdCBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRvXG4gICAgICAgIC8vIGNhbGwgaW52b2tlIGltbWVkaWF0ZWx5LCB3aXRob3V0IHdhaXRpbmcgb24gYSBjYWxsYmFjayB0byBmaXJlLFxuICAgICAgICAvLyBzbyB0aGF0IHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gaGFzIHRoZSBvcHBvcnR1bml0eSB0byBkb1xuICAgICAgICAvLyBhbnkgbmVjZXNzYXJ5IHNldHVwIGluIGEgcHJlZGljdGFibGUgd2F5LiBUaGlzIHByZWRpY3RhYmlsaXR5XG4gICAgICAgIC8vIGlzIHdoeSB0aGUgUHJvbWlzZSBjb25zdHJ1Y3RvciBzeW5jaHJvbm91c2x5IGludm9rZXMgaXRzXG4gICAgICAgIC8vIGV4ZWN1dG9yIGNhbGxiYWNrLCBhbmQgd2h5IGFzeW5jIGZ1bmN0aW9ucyBzeW5jaHJvbm91c2x5XG4gICAgICAgIC8vIGV4ZWN1dGUgY29kZSBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0LiBTaW5jZSB3ZSBpbXBsZW1lbnQgc2ltcGxlXG4gICAgICAgIC8vIGFzeW5jIGZ1bmN0aW9ucyBpbiB0ZXJtcyBvZiBhc3luYyBnZW5lcmF0b3JzLCBpdCBpcyBlc3BlY2lhbGx5XG4gICAgICAgIC8vIGltcG9ydGFudCB0byBnZXQgdGhpcyByaWdodCwgZXZlbiB0aG91Z2ggaXQgcmVxdWlyZXMgY2FyZS5cbiAgICAgICAgcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsXG4gICAgICAgICAgLy8gQXZvaWQgcHJvcGFnYXRpbmcgZmFpbHVyZXMgdG8gUHJvbWlzZXMgcmV0dXJuZWQgYnkgbGF0ZXJcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBvZiB0aGUgaXRlcmF0b3IuXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmdcbiAgICAgICAgKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7XG4gICAgfVxuXG4gICAgLy8gRGVmaW5lIHRoZSB1bmlmaWVkIGhlbHBlciBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGltcGxlbWVudCAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIChzZWUgZGVmaW5lSXRlcmF0b3JNZXRob2RzKS5cbiAgICB0aGlzLl9pbnZva2UgPSBlbnF1ZXVlO1xuICB9XG5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKTtcbiAgZGVmaW5lKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlLCBhc3luY0l0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pO1xuICBleHBvcnRzLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yO1xuXG4gIC8vIE5vdGUgdGhhdCBzaW1wbGUgYXN5bmMgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2ZcbiAgLy8gQXN5bmNJdGVyYXRvciBvYmplY3RzOyB0aGV5IGp1c3QgcmV0dXJuIGEgUHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9mXG4gIC8vIHRoZSBmaW5hbCByZXN1bHQgcHJvZHVjZWQgYnkgdGhlIGl0ZXJhdG9yLlxuICBleHBvcnRzLmFzeW5jID0gZnVuY3Rpb24oaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QsIFByb21pc2VJbXBsKSB7XG4gICAgaWYgKFByb21pc2VJbXBsID09PSB2b2lkIDApIFByb21pc2VJbXBsID0gUHJvbWlzZTtcblxuICAgIHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3IoXG4gICAgICB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSxcbiAgICAgIFByb21pc2VJbXBsXG4gICAgKTtcblxuICAgIHJldHVybiBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbilcbiAgICAgID8gaXRlciAvLyBJZiBvdXRlckZuIGlzIGEgZ2VuZXJhdG9yLCByZXR1cm4gdGhlIGZ1bGwgaXRlcmF0b3IuXG4gICAgICA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7XG4gICAgICAgIH0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkge1xuICAgIHZhciBzdGF0ZSA9IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQ7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlRXhlY3V0aW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVDb21wbGV0ZWQpIHtcbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgdGhyb3cgYXJnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmUgZm9yZ2l2aW5nLCBwZXIgMjUuMy4zLjMuMyBvZiB0aGUgc3BlYzpcbiAgICAgICAgLy8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWdlbmVyYXRvcnJlc3VtZVxuICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgIGNvbnRleHQuYXJnID0gYXJnO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlO1xuICAgICAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgICAgICB2YXIgZGVsZWdhdGVSZXN1bHQgPSBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcbiAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7XG4gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAgIC8vIFNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICAgICAgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydCkge1xuICAgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAgIHRocm93IGNvbnRleHQuYXJnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgICBjb250ZXh0LmFicnVwdChcInJldHVyblwiLCBjb250ZXh0LmFyZyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZSA9IEdlblN0YXRlRXhlY3V0aW5nO1xuXG4gICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgLy8gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBmcm9tIGlubmVyRm4sIHdlIGxlYXZlIHN0YXRlID09PVxuICAgICAgICAgIC8vIEdlblN0YXRlRXhlY3V0aW5nIGFuZCBsb29wIGJhY2sgZm9yIGFub3RoZXIgaW52b2NhdGlvbi5cbiAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZVxuICAgICAgICAgICAgPyBHZW5TdGF0ZUNvbXBsZXRlZFxuICAgICAgICAgICAgOiBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkO1xuXG4gICAgICAgICAgaWYgKHJlY29yZC5hcmcgPT09IENvbnRpbnVlU2VudGluZWwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZyxcbiAgICAgICAgICAgIGRvbmU6IGNvbnRleHQuZG9uZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAvLyBEaXNwYXRjaCB0aGUgZXhjZXB0aW9uIGJ5IGxvb3BpbmcgYmFjayBhcm91bmQgdG8gdGhlXG4gICAgICAgICAgLy8gY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZykgY2FsbCBhYm92ZS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gQ2FsbCBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF0oY29udGV4dC5hcmcpIGFuZCBoYW5kbGUgdGhlXG4gIC8vIHJlc3VsdCwgZWl0aGVyIGJ5IHJldHVybmluZyBhIHsgdmFsdWUsIGRvbmUgfSByZXN1bHQgZnJvbSB0aGVcbiAgLy8gZGVsZWdhdGUgaXRlcmF0b3IsIG9yIGJ5IG1vZGlmeWluZyBjb250ZXh0Lm1ldGhvZCBhbmQgY29udGV4dC5hcmcsXG4gIC8vIHNldHRpbmcgY29udGV4dC5kZWxlZ2F0ZSB0byBudWxsLCBhbmQgcmV0dXJuaW5nIHRoZSBDb250aW51ZVNlbnRpbmVsLlxuICBmdW5jdGlvbiBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIG1ldGhvZCA9IGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXTtcbiAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEEgLnRocm93IG9yIC5yZXR1cm4gd2hlbiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIG5vIC50aHJvd1xuICAgICAgLy8gbWV0aG9kIGFsd2F5cyB0ZXJtaW5hdGVzIHRoZSB5aWVsZCogbG9vcC5cbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAvLyBOb3RlOiBbXCJyZXR1cm5cIl0gbXVzdCBiZSB1c2VkIGZvciBFUzMgcGFyc2luZyBjb21wYXRpYmlsaXR5LlxuICAgICAgICBpZiAoZGVsZWdhdGUuaXRlcmF0b3JbXCJyZXR1cm5cIl0pIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIGEgcmV0dXJuIG1ldGhvZCwgZ2l2ZSBpdCBhXG4gICAgICAgICAgLy8gY2hhbmNlIHRvIGNsZWFuIHVwLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICAvLyBJZiBtYXliZUludm9rZURlbGVnYXRlKGNvbnRleHQpIGNoYW5nZWQgY29udGV4dC5tZXRob2QgZnJvbVxuICAgICAgICAgICAgLy8gXCJyZXR1cm5cIiB0byBcInRocm93XCIsIGxldCB0aGF0IG92ZXJyaWRlIHRoZSBUeXBlRXJyb3IgYmVsb3cuXG4gICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTtcblxuICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuXG4gICAgaWYgKCEgaW5mbykge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKTtcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgLy8gQXNzaWduIHRoZSByZXN1bHQgb2YgdGhlIGZpbmlzaGVkIGRlbGVnYXRlIHRvIHRoZSB0ZW1wb3JhcnlcbiAgICAgIC8vIHZhcmlhYmxlIHNwZWNpZmllZCBieSBkZWxlZ2F0ZS5yZXN1bHROYW1lIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTtcblxuICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYztcblxuICAgICAgLy8gSWYgY29udGV4dC5tZXRob2Qgd2FzIFwidGhyb3dcIiBidXQgdGhlIGRlbGVnYXRlIGhhbmRsZWQgdGhlXG4gICAgICAvLyBleGNlcHRpb24sIGxldCB0aGUgb3V0ZXIgZ2VuZXJhdG9yIHByb2NlZWQgbm9ybWFsbHkuIElmXG4gICAgICAvLyBjb250ZXh0Lm1ldGhvZCB3YXMgXCJuZXh0XCIsIGZvcmdldCBjb250ZXh0LmFyZyBzaW5jZSBpdCBoYXMgYmVlblxuICAgICAgLy8gXCJjb25zdW1lZFwiIGJ5IHRoZSBkZWxlZ2F0ZSBpdGVyYXRvci4gSWYgY29udGV4dC5tZXRob2Qgd2FzXG4gICAgICAvLyBcInJldHVyblwiLCBhbGxvdyB0aGUgb3JpZ2luYWwgLnJldHVybiBjYWxsIHRvIGNvbnRpbnVlIGluIHRoZVxuICAgICAgLy8gb3V0ZXIgZ2VuZXJhdG9yLlxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kICE9PSBcInJldHVyblwiKSB7XG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlLXlpZWxkIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIGRlbGVnYXRlIG1ldGhvZC5cbiAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIC8vIFRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBpcyBmaW5pc2hlZCwgc28gZm9yZ2V0IGl0IGFuZCBjb250aW51ZSB3aXRoXG4gICAgLy8gdGhlIG91dGVyIGdlbmVyYXRvci5cbiAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgfVxuXG4gIC8vIERlZmluZSBHZW5lcmF0b3IucHJvdG90eXBlLntuZXh0LHRocm93LHJldHVybn0gaW4gdGVybXMgb2YgdGhlXG4gIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKTtcblxuICBkZWZpbmUoR3AsIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvclwiKTtcblxuICAvLyBBIEdlbmVyYXRvciBzaG91bGQgYWx3YXlzIHJldHVybiBpdHNlbGYgYXMgdGhlIGl0ZXJhdG9yIG9iamVjdCB3aGVuIHRoZVxuICAvLyBAQGl0ZXJhdG9yIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBpdC4gU29tZSBicm93c2VycycgaW1wbGVtZW50YXRpb25zIG9mIHRoZVxuICAvLyBpdGVyYXRvciBwcm90b3R5cGUgY2hhaW4gaW5jb3JyZWN0bHkgaW1wbGVtZW50IHRoaXMsIGNhdXNpbmcgdGhlIEdlbmVyYXRvclxuICAvLyBvYmplY3QgdG8gbm90IGJlIHJldHVybmVkIGZyb20gdGhpcyBjYWxsLiBUaGlzIGVuc3VyZXMgdGhhdCBkb2Vzbid0IGhhcHBlbi5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9pc3N1ZXMvMjc0IGZvciBtb3JlIGRldGFpbHMuXG4gIGRlZmluZShHcCwgaXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9KTtcblxuICBkZWZpbmUoR3AsIFwidG9TdHJpbmdcIiwgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwiW29iamVjdCBHZW5lcmF0b3JdXCI7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7XG4gICAgdmFyIGVudHJ5ID0geyB0cnlMb2M6IGxvY3NbMF0gfTtcblxuICAgIGlmICgxIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXTtcbiAgICB9XG5cbiAgICBpZiAoMiBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5maW5hbGx5TG9jID0gbG9jc1syXTtcbiAgICAgIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXTtcbiAgICB9XG5cbiAgICB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7XG4gICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307XG4gICAgcmVjb3JkLnR5cGUgPSBcIm5vcm1hbFwiO1xuICAgIGRlbGV0ZSByZWNvcmQuYXJnO1xuICAgIGVudHJ5LmNvbXBsZXRpb24gPSByZWNvcmQ7XG4gIH1cblxuICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gVGhlIHJvb3QgZW50cnkgb2JqZWN0IChlZmZlY3RpdmVseSBhIHRyeSBzdGF0ZW1lbnQgd2l0aG91dCBhIGNhdGNoXG4gICAgLy8gb3IgYSBmaW5hbGx5IGJsb2NrKSBnaXZlcyB1cyBhIHBsYWNlIHRvIHN0b3JlIHZhbHVlcyB0aHJvd24gZnJvbVxuICAgIC8vIGxvY2F0aW9ucyB3aGVyZSB0aGVyZSBpcyBubyBlbmNsb3NpbmcgdHJ5IHN0YXRlbWVudC5cbiAgICB0aGlzLnRyeUVudHJpZXMgPSBbeyB0cnlMb2M6IFwicm9vdFwiIH1dO1xuICAgIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKTtcbiAgICB0aGlzLnJlc2V0KHRydWUpO1xuICB9XG5cbiAgZXhwb3J0cy5rZXlzID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gICAga2V5cy5yZXZlcnNlKCk7XG5cbiAgICAvLyBSYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gb2JqZWN0IHdpdGggYSBuZXh0IG1ldGhvZCwgd2Uga2VlcFxuICAgIC8vIHRoaW5ncyBzaW1wbGUgYW5kIHJldHVybiB0aGUgbmV4dCBmdW5jdGlvbiBpdHNlbGYuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICB3aGlsZSAoa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgbmV4dC52YWx1ZSA9IGtleTtcbiAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUbyBhdm9pZCBjcmVhdGluZyBhbiBhZGRpdGlvbmFsIG9iamVjdCwgd2UganVzdCBoYW5nIHRoZSAudmFsdWVcbiAgICAgIC8vIGFuZCAuZG9uZSBwcm9wZXJ0aWVzIG9mZiB0aGUgbmV4dCBmdW5jdGlvbiBvYmplY3QgaXRzZWxmLiBUaGlzXG4gICAgICAvLyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgbWluaWZpZXIgd2lsbCBub3QgYW5vbnltaXplIHRoZSBmdW5jdGlvbi5cbiAgICAgIG5leHQuZG9uZSA9IHRydWU7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIHZhbHVlcyhpdGVyYWJsZSkge1xuICAgIGlmIChpdGVyYWJsZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gaXRlcmFibGVbaXRlcmF0b3JTeW1ib2xdO1xuICAgICAgaWYgKGl0ZXJhdG9yTWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvck1ldGhvZC5jYWxsKGl0ZXJhYmxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpdGVyYWJsZS5uZXh0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhYmxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTmFOKGl0ZXJhYmxlLmxlbmd0aCkpIHtcbiAgICAgICAgdmFyIGkgPSAtMSwgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IGl0ZXJhYmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkge1xuICAgICAgICAgICAgICBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV07XG4gICAgICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXh0LnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG5leHQuZG9uZSA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbmV4dC5uZXh0ID0gbmV4dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYW4gaXRlcmF0b3Igd2l0aCBubyB2YWx1ZXMuXG4gICAgcmV0dXJuIHsgbmV4dDogZG9uZVJlc3VsdCB9O1xuICB9XG4gIGV4cG9ydHMudmFsdWVzID0gdmFsdWVzO1xuXG4gIGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG5cbiAgQ29udGV4dC5wcm90b3R5cGUgPSB7XG4gICAgY29uc3RydWN0b3I6IENvbnRleHQsXG5cbiAgICByZXNldDogZnVuY3Rpb24oc2tpcFRlbXBSZXNldCkge1xuICAgICAgdGhpcy5wcmV2ID0gMDtcbiAgICAgIHRoaXMubmV4dCA9IDA7XG4gICAgICAvLyBSZXNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG5cbiAgICAgIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpO1xuXG4gICAgICBpZiAoIXNraXBUZW1wUmVzZXQpIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzKSB7XG4gICAgICAgICAgLy8gTm90IHN1cmUgYWJvdXQgdGhlIG9wdGltYWwgb3JkZXIgb2YgdGhlc2UgY29uZGl0aW9uczpcbiAgICAgICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT09IFwidFwiICYmXG4gICAgICAgICAgICAgIGhhc093bi5jYWxsKHRoaXMsIG5hbWUpICYmXG4gICAgICAgICAgICAgICFpc05hTigrbmFtZS5zbGljZSgxKSkpIHtcbiAgICAgICAgICAgIHRoaXNbbmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcblxuICAgICAgdmFyIHJvb3RFbnRyeSA9IHRoaXMudHJ5RW50cmllc1swXTtcbiAgICAgIHZhciByb290UmVjb3JkID0gcm9vdEVudHJ5LmNvbXBsZXRpb247XG4gICAgICBpZiAocm9vdFJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcm9vdFJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnJ2YWw7XG4gICAgfSxcblxuICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbihleGNlcHRpb24pIHtcbiAgICAgIGlmICh0aGlzLmRvbmUpIHtcbiAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29udGV4dCA9IHRoaXM7XG4gICAgICBmdW5jdGlvbiBoYW5kbGUobG9jLCBjYXVnaHQpIHtcbiAgICAgICAgcmVjb3JkLnR5cGUgPSBcInRocm93XCI7XG4gICAgICAgIHJlY29yZC5hcmcgPSBleGNlcHRpb247XG4gICAgICAgIGNvbnRleHQubmV4dCA9IGxvYztcblxuICAgICAgICBpZiAoY2F1Z2h0KSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRpc3BhdGNoZWQgZXhjZXB0aW9uIHdhcyBjYXVnaHQgYnkgYSBjYXRjaCBibG9jayxcbiAgICAgICAgICAvLyB0aGVuIGxldCB0aGF0IGNhdGNoIGJsb2NrIGhhbmRsZSB0aGUgZXhjZXB0aW9uIG5vcm1hbGx5LlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gISEgY2F1Z2h0O1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gXCJyb290XCIpIHtcbiAgICAgICAgICAvLyBFeGNlcHRpb24gdGhyb3duIG91dHNpZGUgb2YgYW55IHRyeSBibG9jayB0aGF0IGNvdWxkIGhhbmRsZVxuICAgICAgICAgIC8vIGl0LCBzbyBzZXQgdGhlIGNvbXBsZXRpb24gdmFsdWUgb2YgdGhlIGVudGlyZSBmdW5jdGlvbiB0b1xuICAgICAgICAgIC8vIHRocm93IHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgcmV0dXJuIGhhbmRsZShcImVuZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2KSB7XG4gICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksIFwiY2F0Y2hMb2NcIik7XG4gICAgICAgICAgdmFyIGhhc0ZpbmFsbHkgPSBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpO1xuXG4gICAgICAgICAgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhYnJ1cHQ6IGZ1bmN0aW9uKHR5cGUsIGFyZykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2ICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpICYmXG4gICAgICAgICAgICB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgdmFyIGZpbmFsbHlFbnRyeSA9IGVudHJ5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkgJiZcbiAgICAgICAgICAodHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgIHR5cGUgPT09IFwiY29udGludWVcIikgJiZcbiAgICAgICAgICBmaW5hbGx5RW50cnkudHJ5TG9jIDw9IGFyZyAmJlxuICAgICAgICAgIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAvLyBJZ25vcmUgdGhlIGZpbmFsbHkgZW50cnkgaWYgY29udHJvbCBpcyBub3QganVtcGluZyB0byBhXG4gICAgICAgIC8vIGxvY2F0aW9uIG91dHNpZGUgdGhlIHRyeS9jYXRjaCBibG9jay5cbiAgICAgICAgZmluYWxseUVudHJ5ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlY29yZCA9IGZpbmFsbHlFbnRyeSA/IGZpbmFsbHlFbnRyeS5jb21wbGV0aW9uIDoge307XG4gICAgICByZWNvcmQudHlwZSA9IHR5cGU7XG4gICAgICByZWNvcmQuYXJnID0gYXJnO1xuXG4gICAgICBpZiAoZmluYWxseUVudHJ5KSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIHRoaXMubmV4dCA9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jO1xuICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY29tcGxldGUocmVjb3JkKTtcbiAgICB9LFxuXG4gICAgY29tcGxldGU6IGZ1bmN0aW9uKHJlY29yZCwgYWZ0ZXJMb2MpIHtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgcmVjb3JkLnR5cGUgPT09IFwiY29udGludWVcIikge1xuICAgICAgICB0aGlzLm5leHQgPSByZWNvcmQuYXJnO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICB0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gXCJlbmRcIjtcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIgJiYgYWZ0ZXJMb2MpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gYWZ0ZXJMb2M7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH0sXG5cbiAgICBmaW5pc2g6IGZ1bmN0aW9uKGZpbmFsbHlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykge1xuICAgICAgICAgIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpO1xuICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIFwiY2F0Y2hcIjogZnVuY3Rpb24odHJ5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gdHJ5TG9jKSB7XG4gICAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG4gICAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIHZhciB0aHJvd24gPSByZWNvcmQuYXJnO1xuICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aHJvd247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGNvbnRleHQuY2F0Y2ggbWV0aG9kIG11c3Qgb25seSBiZSBjYWxsZWQgd2l0aCBhIGxvY2F0aW9uXG4gICAgICAvLyBhcmd1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEga25vd24gY2F0Y2ggYmxvY2suXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHRcIik7XG4gICAgfSxcblxuICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uKGl0ZXJhYmxlLCByZXN1bHROYW1lLCBuZXh0TG9jKSB7XG4gICAgICB0aGlzLmRlbGVnYXRlID0ge1xuICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGl0ZXJhYmxlKSxcbiAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSxcbiAgICAgICAgbmV4dExvYzogbmV4dExvY1xuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAvLyBEZWxpYmVyYXRlbHkgZm9yZ2V0IHRoZSBsYXN0IHNlbnQgdmFsdWUgc28gdGhhdCB3ZSBkb24ndFxuICAgICAgICAvLyBhY2NpZGVudGFsbHkgcGFzcyBpdCBvbiB0byB0aGUgZGVsZWdhdGUuXG4gICAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG4gIH07XG5cbiAgLy8gUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoaXMgc2NyaXB0IGlzIGV4ZWN1dGluZyBhcyBhIENvbW1vbkpTIG1vZHVsZVxuICAvLyBvciBub3QsIHJldHVybiB0aGUgcnVudGltZSBvYmplY3Qgc28gdGhhdCB3ZSBjYW4gZGVjbGFyZSB0aGUgdmFyaWFibGVcbiAgLy8gcmVnZW5lcmF0b3JSdW50aW1lIGluIHRoZSBvdXRlciBzY29wZSwgd2hpY2ggYWxsb3dzIHRoaXMgbW9kdWxlIHRvIGJlXG4gIC8vIGluamVjdGVkIGVhc2lseSBieSBgYmluL3JlZ2VuZXJhdG9yIC0taW5jbHVkZS1ydW50aW1lIHNjcmlwdC5qc2AuXG4gIHJldHVybiBleHBvcnRzO1xuXG59KFxuICAvLyBJZiB0aGlzIHNjcmlwdCBpcyBleGVjdXRpbmcgYXMgYSBDb21tb25KUyBtb2R1bGUsIHVzZSBtb2R1bGUuZXhwb3J0c1xuICAvLyBhcyB0aGUgcmVnZW5lcmF0b3JSdW50aW1lIG5hbWVzcGFjZS4gT3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyBlbXB0eVxuICAvLyBvYmplY3QuIEVpdGhlciB3YXksIHRoZSByZXN1bHRpbmcgb2JqZWN0IHdpbGwgYmUgdXNlZCB0byBpbml0aWFsaXplXG4gIC8vIHRoZSByZWdlbmVyYXRvclJ1bnRpbWUgdmFyaWFibGUgYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuXG4gIHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIgPyBtb2R1bGUuZXhwb3J0cyA6IHt9XG4pKTtcblxudHJ5IHtcbiAgcmVnZW5lcmF0b3JSdW50aW1lID0gcnVudGltZTtcbn0gY2F0Y2ggKGFjY2lkZW50YWxTdHJpY3RNb2RlKSB7XG4gIC8vIFRoaXMgbW9kdWxlIHNob3VsZCBub3QgYmUgcnVubmluZyBpbiBzdHJpY3QgbW9kZSwgc28gdGhlIGFib3ZlXG4gIC8vIGFzc2lnbm1lbnQgc2hvdWxkIGFsd2F5cyB3b3JrIHVubGVzcyBzb21ldGhpbmcgaXMgbWlzY29uZmlndXJlZC4gSnVzdFxuICAvLyBpbiBjYXNlIHJ1bnRpbWUuanMgYWNjaWRlbnRhbGx5IHJ1bnMgaW4gc3RyaWN0IG1vZGUsIGluIG1vZGVybiBlbmdpbmVzXG4gIC8vIHdlIGNhbiBleHBsaWNpdGx5IGFjY2VzcyBnbG9iYWxUaGlzLiBJbiBvbGRlciBlbmdpbmVzIHdlIGNhbiBlc2NhcGVcbiAgLy8gc3RyaWN0IG1vZGUgdXNpbmcgYSBnbG9iYWwgRnVuY3Rpb24gY2FsbC4gVGhpcyBjb3VsZCBjb25jZWl2YWJseSBmYWlsXG4gIC8vIGlmIGEgQ29udGVudCBTZWN1cml0eSBQb2xpY3kgZm9yYmlkcyB1c2luZyBGdW5jdGlvbiwgYnV0IGluIHRoYXQgY2FzZVxuICAvLyB0aGUgcHJvcGVyIHNvbHV0aW9uIGlzIHRvIGZpeCB0aGUgYWNjaWRlbnRhbCBzdHJpY3QgbW9kZSBwcm9ibGVtLiBJZlxuICAvLyB5b3UndmUgbWlzY29uZmlndXJlZCB5b3VyIGJ1bmRsZXIgdG8gZm9yY2Ugc3RyaWN0IG1vZGUgYW5kIGFwcGxpZWQgYVxuICAvLyBDU1AgdG8gZm9yYmlkIEZ1bmN0aW9uLCBhbmQgeW91J3JlIG5vdCB3aWxsaW5nIHRvIGZpeCBlaXRoZXIgb2YgdGhvc2VcbiAgLy8gcHJvYmxlbXMsIHBsZWFzZSBkZXRhaWwgeW91ciB1bmlxdWUgcHJlZGljYW1lbnQgaW4gYSBHaXRIdWIgaXNzdWUuXG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gXCJvYmplY3RcIikge1xuICAgIGdsb2JhbFRoaXMucmVnZW5lcmF0b3JSdW50aW1lID0gcnVudGltZTtcbiAgfSBlbHNlIHtcbiAgICBGdW5jdGlvbihcInJcIiwgXCJyZWdlbmVyYXRvclJ1bnRpbWUgPSByXCIpKHJ1bnRpbWUpO1xuICB9XG59XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9qc3BzeWNoLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9qc3BzeWNoLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgc3R5bGVzSW5ET00gPSBbXTtcblxuZnVuY3Rpb24gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcikge1xuICB2YXIgcmVzdWx0ID0gLTE7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXNJbkRPTS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHlsZXNJbkRPTVtpXS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICByZXN1bHQgPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpIHtcbiAgdmFyIGlkQ291bnRNYXAgPSB7fTtcbiAgdmFyIGlkZW50aWZpZXJzID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBsaXN0W2ldO1xuICAgIHZhciBpZCA9IG9wdGlvbnMuYmFzZSA/IGl0ZW1bMF0gKyBvcHRpb25zLmJhc2UgOiBpdGVtWzBdO1xuICAgIHZhciBjb3VudCA9IGlkQ291bnRNYXBbaWRdIHx8IDA7XG4gICAgdmFyIGlkZW50aWZpZXIgPSBcIlwiLmNvbmNhdChpZCwgXCIgXCIpLmNvbmNhdChjb3VudCk7XG4gICAgaWRDb3VudE1hcFtpZF0gPSBjb3VudCArIDE7XG4gICAgdmFyIGluZGV4QnlJZGVudGlmaWVyID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgdmFyIG9iaiA9IHtcbiAgICAgIGNzczogaXRlbVsxXSxcbiAgICAgIG1lZGlhOiBpdGVtWzJdLFxuICAgICAgc291cmNlTWFwOiBpdGVtWzNdLFxuICAgICAgc3VwcG9ydHM6IGl0ZW1bNF0sXG4gICAgICBsYXllcjogaXRlbVs1XVxuICAgIH07XG5cbiAgICBpZiAoaW5kZXhCeUlkZW50aWZpZXIgIT09IC0xKSB7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleEJ5SWRlbnRpZmllcl0ucmVmZXJlbmNlcysrO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnVwZGF0ZXIob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHVwZGF0ZXIgPSBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKTtcbiAgICAgIG9wdGlvbnMuYnlJbmRleCA9IGk7XG4gICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoaSwgMCwge1xuICAgICAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgICB1cGRhdGVyOiB1cGRhdGVyLFxuICAgICAgICByZWZlcmVuY2VzOiAxXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZGVudGlmaWVycy5wdXNoKGlkZW50aWZpZXIpO1xuICB9XG5cbiAgcmV0dXJuIGlkZW50aWZpZXJzO1xufVxuXG5mdW5jdGlvbiBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKSB7XG4gIHZhciBhcGkgPSBvcHRpb25zLmRvbUFQSShvcHRpb25zKTtcbiAgYXBpLnVwZGF0ZShvYmopO1xuXG4gIHZhciB1cGRhdGVyID0gZnVuY3Rpb24gdXBkYXRlcihuZXdPYmopIHtcbiAgICBpZiAobmV3T2JqKSB7XG4gICAgICBpZiAobmV3T2JqLmNzcyA9PT0gb2JqLmNzcyAmJiBuZXdPYmoubWVkaWEgPT09IG9iai5tZWRpYSAmJiBuZXdPYmouc291cmNlTWFwID09PSBvYmouc291cmNlTWFwICYmIG5ld09iai5zdXBwb3J0cyA9PT0gb2JqLnN1cHBvcnRzICYmIG5ld09iai5sYXllciA9PT0gb2JqLmxheWVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXBpLnVwZGF0ZShvYmogPSBuZXdPYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcGkucmVtb3ZlKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiB1cGRhdGVyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChsaXN0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBsaXN0ID0gbGlzdCB8fCBbXTtcbiAgdmFyIGxhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZShuZXdMaXN0KSB7XG4gICAgbmV3TGlzdCA9IG5ld0xpc3QgfHwgW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbaV07XG4gICAgICB2YXIgaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4XS5yZWZlcmVuY2VzLS07XG4gICAgfVxuXG4gICAgdmFyIG5ld0xhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShuZXdMaXN0LCBvcHRpb25zKTtcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBsYXN0SWRlbnRpZmllcnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2lkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbX2ldO1xuXG4gICAgICB2YXIgX2luZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoX2lkZW50aWZpZXIpO1xuXG4gICAgICBpZiAoc3R5bGVzSW5ET01bX2luZGV4XS5yZWZlcmVuY2VzID09PSAwKSB7XG4gICAgICAgIHN0eWxlc0luRE9NW19pbmRleF0udXBkYXRlcigpO1xuXG4gICAgICAgIHN0eWxlc0luRE9NLnNwbGljZShfaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxhc3RJZGVudGlmaWVycyA9IG5ld0xhc3RJZGVudGlmaWVycztcbiAgfTtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBtZW1vID0ge307XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0KHRhcmdldCkge1xuICBpZiAodHlwZW9mIG1lbW9bdGFyZ2V0XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHZhciBzdHlsZVRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTsgLy8gU3BlY2lhbCBjYXNlIHRvIHJldHVybiBoZWFkIG9mIGlmcmFtZSBpbnN0ZWFkIG9mIGlmcmFtZSBpdHNlbGZcblxuICAgIGlmICh3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQgJiYgc3R5bGVUYXJnZXQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgYWNjZXNzIHRvIGlmcmFtZSBpcyBibG9ja2VkXG4gICAgICAgIC8vIGR1ZSB0byBjcm9zcy1vcmlnaW4gcmVzdHJpY3Rpb25zXG4gICAgICAgIHN0eWxlVGFyZ2V0ID0gc3R5bGVUYXJnZXQuY29udGVudERvY3VtZW50LmhlYWQ7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgICAgIHN0eWxlVGFyZ2V0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBtZW1vW3RhcmdldF0gPSBzdHlsZVRhcmdldDtcbiAgfVxuXG4gIHJldHVybiBtZW1vW3RhcmdldF07XG59XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cblxuXG5mdW5jdGlvbiBpbnNlcnRCeVNlbGVjdG9yKGluc2VydCwgc3R5bGUpIHtcbiAgdmFyIHRhcmdldCA9IGdldFRhcmdldChpbnNlcnQpO1xuXG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnQnIHBhcmFtZXRlciBpcyBpbnZhbGlkLlwiKTtcbiAgfVxuXG4gIHRhcmdldC5hcHBlbmRDaGlsZChzdHlsZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5zZXJ0QnlTZWxlY3RvcjsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucykge1xuICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgb3B0aW9ucy5zZXRBdHRyaWJ1dGVzKGVsZW1lbnQsIG9wdGlvbnMuYXR0cmlidXRlcyk7XG4gIG9wdGlvbnMuaW5zZXJ0KGVsZW1lbnQsIG9wdGlvbnMub3B0aW9ucyk7XG4gIHJldHVybiBlbGVtZW50O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydFN0eWxlRWxlbWVudDsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMoc3R5bGVFbGVtZW50KSB7XG4gIHZhciBub25jZSA9IHR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXyAhPT0gXCJ1bmRlZmluZWRcIiA/IF9fd2VicGFja19ub25jZV9fIDogbnVsbDtcblxuICBpZiAobm9uY2UpIHtcbiAgICBzdHlsZUVsZW1lbnQuc2V0QXR0cmlidXRlKFwibm9uY2VcIiwgbm9uY2UpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGFwcGx5KHN0eWxlRWxlbWVudCwgb3B0aW9ucywgb2JqKSB7XG4gIHZhciBjc3MgPSBcIlwiO1xuXG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChvYmouc3VwcG9ydHMsIFwiKSB7XCIpO1xuICB9XG5cbiAgaWYgKG9iai5tZWRpYSkge1xuICAgIGNzcyArPSBcIkBtZWRpYSBcIi5jb25jYXQob2JqLm1lZGlhLCBcIiB7XCIpO1xuICB9XG5cbiAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBvYmoubGF5ZXIgIT09IFwidW5kZWZpbmVkXCI7XG5cbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIkBsYXllclwiLmNvbmNhdChvYmoubGF5ZXIubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChvYmoubGF5ZXIpIDogXCJcIiwgXCIge1wiKTtcbiAgfVxuXG4gIGNzcyArPSBvYmouY3NzO1xuXG4gIGlmIChuZWVkTGF5ZXIpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cblxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG5cbiAgaWYgKG9iai5zdXBwb3J0cykge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuXG4gIHZhciBzb3VyY2VNYXAgPSBvYmouc291cmNlTWFwO1xuXG4gIGlmIChzb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpLCBcIiAqL1wiKTtcbiAgfSAvLyBGb3Igb2xkIElFXG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuXG5cbiAgb3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCkge1xuICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgaWYgKHN0eWxlRWxlbWVudC5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3R5bGVFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50KTtcbn1cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuXG5cbmZ1bmN0aW9uIGRvbUFQSShvcHRpb25zKSB7XG4gIHZhciBzdHlsZUVsZW1lbnQgPSBvcHRpb25zLmluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKTtcbiAgcmV0dXJuIHtcbiAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShvYmopIHtcbiAgICAgIGFwcGx5KHN0eWxlRWxlbWVudCwgb3B0aW9ucywgb2JqKTtcbiAgICB9LFxuICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCk7XG4gICAgfVxuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRvbUFQSTsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCkge1xuICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG5cbiAgICBzdHlsZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHlsZVRhZ1RyYW5zZm9ybTsiLCIvKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xyXG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xyXG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIG9bazJdID0gbVtrXTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcclxuICAgIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xyXG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICByW2tdID0gYVtqXTtcclxuICAgIHJldHVybiByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xyXG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XHJcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XHJcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBuID09PSBcInJldHVyblwiIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xyXG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xyXG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XHJcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIGdldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHN0YXRlLCB2YWx1ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwibVwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiAoa2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIsIHZhbHVlKSA6IGYgPyBmLnZhbHVlID0gdmFsdWUgOiBzdGF0ZS5zZXQocmVjZWl2ZXIsIHZhbHVlKSksIHZhbHVlO1xyXG59XHJcbiIsImV4cG9ydCB7IGRlZmF1bHQgYXMgdjEgfSBmcm9tICcuL3YxLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdjMgfSBmcm9tICcuL3YzLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdjQgfSBmcm9tICcuL3Y0LmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdjUgfSBmcm9tICcuL3Y1LmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTklMIH0gZnJvbSAnLi9uaWwuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB2ZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdmFsaWRhdGUgfSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgc3RyaW5naWZ5IH0gZnJvbSAnLi9zdHJpbmdpZnkuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXJzZSB9IGZyb20gJy4vcGFyc2UuanMnOyIsIi8qXG4gKiBCcm93c2VyLWNvbXBhdGlibGUgSmF2YVNjcmlwdCBNRDVcbiAqXG4gKiBNb2RpZmljYXRpb24gb2YgSmF2YVNjcmlwdCBNRDVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL0phdmFTY3JpcHQtTUQ1XG4gKlxuICogQ29weXJpZ2h0IDIwMTEsIFNlYmFzdGlhbiBUc2NoYW5cbiAqIGh0dHBzOi8vYmx1ZWltcC5uZXRcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxuICpcbiAqIEJhc2VkIG9uXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIE1ENSBNZXNzYWdlXG4gKiBEaWdlc3QgQWxnb3JpdGhtLCBhcyBkZWZpbmVkIGluIFJGQyAxMzIxLlxuICogVmVyc2lvbiAyLjIgQ29weXJpZ2h0IChDKSBQYXVsIEpvaG5zdG9uIDE5OTkgLSAyMDA5XG4gKiBPdGhlciBjb250cmlidXRvcnM6IEdyZWcgSG9sdCwgQW5kcmV3IEtlcGVydCwgWWRuYXIsIExvc3RpbmV0XG4gKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2VcbiAqIFNlZSBodHRwOi8vcGFqaG9tZS5vcmcudWsvY3J5cHQvbWQ1IGZvciBtb3JlIGluZm8uXG4gKi9cbmZ1bmN0aW9uIG1kNShieXRlcykge1xuICBpZiAodHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJykge1xuICAgIHZhciBtc2cgPSB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoYnl0ZXMpKTsgLy8gVVRGOCBlc2NhcGVcblxuICAgIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobXNnLmxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7ICsraSkge1xuICAgICAgYnl0ZXNbaV0gPSBtc2cuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWQ1VG9IZXhFbmNvZGVkQXJyYXkod29yZHNUb01kNShieXRlc1RvV29yZHMoYnl0ZXMpLCBieXRlcy5sZW5ndGggKiA4KSk7XG59XG4vKlxuICogQ29udmVydCBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzIHRvIGFuIGFycmF5IG9mIGJ5dGVzXG4gKi9cblxuXG5mdW5jdGlvbiBtZDVUb0hleEVuY29kZWRBcnJheShpbnB1dCkge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIHZhciBsZW5ndGgzMiA9IGlucHV0Lmxlbmd0aCAqIDMyO1xuICB2YXIgaGV4VGFiID0gJzAxMjM0NTY3ODlhYmNkZWYnO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoMzI7IGkgKz0gOCkge1xuICAgIHZhciB4ID0gaW5wdXRbaSA+PiA1XSA+Pj4gaSAlIDMyICYgMHhmZjtcbiAgICB2YXIgaGV4ID0gcGFyc2VJbnQoaGV4VGFiLmNoYXJBdCh4ID4+PiA0ICYgMHgwZikgKyBoZXhUYWIuY2hhckF0KHggJiAweDBmKSwgMTYpO1xuICAgIG91dHB1dC5wdXNoKGhleCk7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGUgb3V0cHV0IGxlbmd0aCB3aXRoIHBhZGRpbmcgYW5kIGJpdCBsZW5ndGhcbiAqL1xuXG5cbmZ1bmN0aW9uIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aDgpIHtcbiAgcmV0dXJuIChpbnB1dExlbmd0aDggKyA2NCA+Pj4gOSA8PCA0KSArIDE0ICsgMTtcbn1cbi8qXG4gKiBDYWxjdWxhdGUgdGhlIE1ENSBvZiBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzLCBhbmQgYSBiaXQgbGVuZ3RoLlxuICovXG5cblxuZnVuY3Rpb24gd29yZHNUb01kNSh4LCBsZW4pIHtcbiAgLyogYXBwZW5kIHBhZGRpbmcgKi9cbiAgeFtsZW4gPj4gNV0gfD0gMHg4MCA8PCBsZW4gJSAzMjtcbiAgeFtnZXRPdXRwdXRMZW5ndGgobGVuKSAtIDFdID0gbGVuO1xuICB2YXIgYSA9IDE3MzI1ODQxOTM7XG4gIHZhciBiID0gLTI3MTczMzg3OTtcbiAgdmFyIGMgPSAtMTczMjU4NDE5NDtcbiAgdmFyIGQgPSAyNzE3MzM4Nzg7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSArPSAxNikge1xuICAgIHZhciBvbGRhID0gYTtcbiAgICB2YXIgb2xkYiA9IGI7XG4gICAgdmFyIG9sZGMgPSBjO1xuICAgIHZhciBvbGRkID0gZDtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpXSwgNywgLTY4MDg3NjkzNik7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDFdLCAxMiwgLTM4OTU2NDU4Nik7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDJdLCAxNywgNjA2MTA1ODE5KTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgM10sIDIyLCAtMTA0NDUyNTMzMCk7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaSArIDRdLCA3LCAtMTc2NDE4ODk3KTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgNV0sIDEyLCAxMjAwMDgwNDI2KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgNl0sIDE3LCAtMTQ3MzIzMTM0MSk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDddLCAyMiwgLTQ1NzA1OTgzKTtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpICsgOF0sIDcsIDE3NzAwMzU0MTYpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyA5XSwgMTIsIC0xOTU4NDE0NDE3KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgMTBdLCAxNywgLTQyMDYzKTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgMTFdLCAyMiwgLTE5OTA0MDQxNjIpO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2kgKyAxMl0sIDcsIDE4MDQ2MDM2ODIpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyAxM10sIDEyLCAtNDAzNDExMDEpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyAxNF0sIDE3LCAtMTUwMjAwMjI5MCk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDE1XSwgMjIsIDEyMzY1MzUzMjkpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyAxXSwgNSwgLTE2NTc5NjUxMCk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDZdLCA5LCAtMTA2OTUwMTYzMik7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDExXSwgMTQsIDY0MzcxNzcxMyk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaV0sIDIwLCAtMzczODk3MzAyKTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgNV0sIDUsIC03MDE1NTg2OTEpO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyAxMF0sIDksIDM4MDE2MDgzKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgMTVdLCAxNCwgLTY2MDQ3ODMzNSk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaSArIDRdLCAyMCwgLTQwNTUzNzg0OCk7XG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDldLCA1LCA1Njg0NDY0MzgpO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyAxNF0sIDksIC0xMDE5ODAzNjkwKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgM10sIDE0LCAtMTg3MzYzOTYxKTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpICsgOF0sIDIwLCAxMTYzNTMxNTAxKTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgMTNdLCA1LCAtMTQ0NDY4MTQ2Nyk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDJdLCA5LCAtNTE0MDM3ODQpO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyA3XSwgMTQsIDE3MzUzMjg0NzMpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2kgKyAxMl0sIDIwLCAtMTkyNjYwNzczNCk7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDVdLCA0LCAtMzc4NTU4KTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpICsgOF0sIDExLCAtMjAyMjU3NDQ2Myk7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDExXSwgMTYsIDE4MzkwMzA1NjIpO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyAxNF0sIDIzLCAtMzUzMDk1NTYpO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyAxXSwgNCwgLTE1MzA5OTIwNjApO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2kgKyA0XSwgMTEsIDEyNzI4OTMzNTMpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyA3XSwgMTYsIC0xNTU0OTc2MzIpO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyAxMF0sIDIzLCAtMTA5NDczMDY0MCk7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDEzXSwgNCwgNjgxMjc5MTc0KTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpXSwgMTEsIC0zNTg1MzcyMjIpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyAzXSwgMTYsIC03MjI1MjE5NzkpO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyA2XSwgMjMsIDc2MDI5MTg5KTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgOV0sIDQsIC02NDAzNjQ0ODcpO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2kgKyAxMl0sIDExLCAtNDIxODE1ODM1KTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgMTVdLCAxNiwgNTMwNzQyNTIwKTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgMl0sIDIzLCAtOTk1MzM4NjUxKTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpXSwgNiwgLTE5ODYzMDg0NCk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDddLCAxMCwgMTEyNjg5MTQxNSk7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDE0XSwgMTUsIC0xNDE2MzU0OTA1KTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgNV0sIDIxLCAtNTc0MzQwNTUpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2kgKyAxMl0sIDYsIDE3MDA0ODU1NzEpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAzXSwgMTAsIC0xODk0OTg2NjA2KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgMTBdLCAxNSwgLTEwNTE1MjMpO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyAxXSwgMjEsIC0yMDU0OTIyNzk5KTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpICsgOF0sIDYsIDE4NzMzMTMzNTkpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAxNV0sIDEwLCAtMzA2MTE3NDQpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyA2XSwgMTUsIC0xNTYwMTk4MzgwKTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgMTNdLCAyMSwgMTMwOTE1MTY0OSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaSArIDRdLCA2LCAtMTQ1NTIzMDcwKTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgMTFdLCAxMCwgLTExMjAyMTAzNzkpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyAyXSwgMTUsIDcxODc4NzI1OSk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDldLCAyMSwgLTM0MzQ4NTU1MSk7XG4gICAgYSA9IHNhZmVBZGQoYSwgb2xkYSk7XG4gICAgYiA9IHNhZmVBZGQoYiwgb2xkYik7XG4gICAgYyA9IHNhZmVBZGQoYywgb2xkYyk7XG4gICAgZCA9IHNhZmVBZGQoZCwgb2xkZCk7XG4gIH1cblxuICByZXR1cm4gW2EsIGIsIGMsIGRdO1xufVxuLypcbiAqIENvbnZlcnQgYW4gYXJyYXkgYnl0ZXMgdG8gYW4gYXJyYXkgb2YgbGl0dGxlLWVuZGlhbiB3b3Jkc1xuICogQ2hhcmFjdGVycyA+MjU1IGhhdmUgdGhlaXIgaGlnaC1ieXRlIHNpbGVudGx5IGlnbm9yZWQuXG4gKi9cblxuXG5mdW5jdGlvbiBieXRlc1RvV29yZHMoaW5wdXQpIHtcbiAgaWYgKGlucHV0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHZhciBsZW5ndGg4ID0gaW5wdXQubGVuZ3RoICogODtcbiAgdmFyIG91dHB1dCA9IG5ldyBVaW50MzJBcnJheShnZXRPdXRwdXRMZW5ndGgobGVuZ3RoOCkpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoODsgaSArPSA4KSB7XG4gICAgb3V0cHV0W2kgPj4gNV0gfD0gKGlucHV0W2kgLyA4XSAmIDB4ZmYpIDw8IGkgJSAzMjtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG4vKlxuICogQWRkIGludGVnZXJzLCB3cmFwcGluZyBhdCAyXjMyLiBUaGlzIHVzZXMgMTYtYml0IG9wZXJhdGlvbnMgaW50ZXJuYWxseVxuICogdG8gd29yayBhcm91bmQgYnVncyBpbiBzb21lIEpTIGludGVycHJldGVycy5cbiAqL1xuXG5cbmZ1bmN0aW9uIHNhZmVBZGQoeCwgeSkge1xuICB2YXIgbHN3ID0gKHggJiAweGZmZmYpICsgKHkgJiAweGZmZmYpO1xuICB2YXIgbXN3ID0gKHggPj4gMTYpICsgKHkgPj4gMTYpICsgKGxzdyA+PiAxNik7XG4gIHJldHVybiBtc3cgPDwgMTYgfCBsc3cgJiAweGZmZmY7XG59XG4vKlxuICogQml0d2lzZSByb3RhdGUgYSAzMi1iaXQgbnVtYmVyIHRvIHRoZSBsZWZ0LlxuICovXG5cblxuZnVuY3Rpb24gYml0Um90YXRlTGVmdChudW0sIGNudCkge1xuICByZXR1cm4gbnVtIDw8IGNudCB8IG51bSA+Pj4gMzIgLSBjbnQ7XG59XG4vKlxuICogVGhlc2UgZnVuY3Rpb25zIGltcGxlbWVudCB0aGUgZm91ciBiYXNpYyBvcGVyYXRpb25zIHRoZSBhbGdvcml0aG0gdXNlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIG1kNWNtbihxLCBhLCBiLCB4LCBzLCB0KSB7XG4gIHJldHVybiBzYWZlQWRkKGJpdFJvdGF0ZUxlZnQoc2FmZUFkZChzYWZlQWRkKGEsIHEpLCBzYWZlQWRkKHgsIHQpKSwgcyksIGIpO1xufVxuXG5mdW5jdGlvbiBtZDVmZihhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYiAmIGMgfCB+YiAmIGQsIGEsIGIsIHgsIHMsIHQpO1xufVxuXG5mdW5jdGlvbiBtZDVnZyhhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYiAmIGQgfCBjICYgfmQsIGEsIGIsIHgsIHMsIHQpO1xufVxuXG5mdW5jdGlvbiBtZDVoaChhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYiBeIGMgXiBkLCBhLCBiLCB4LCBzLCB0KTtcbn1cblxuZnVuY3Rpb24gbWQ1aWkoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGMgXiAoYiB8IH5kKSwgYSwgYiwgeCwgcywgdCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG1kNTsiLCJleHBvcnQgZGVmYXVsdCAnMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwJzsiLCJpbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5cbmZ1bmN0aW9uIHBhcnNlKHV1aWQpIHtcbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW52YWxpZCBVVUlEJyk7XG4gIH1cblxuICB2YXIgdjtcbiAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDE2KTsgLy8gUGFyc2UgIyMjIyMjIyMtLi4uLi0uLi4uLS4uLi4tLi4uLi4uLi4uLi4uXG5cbiAgYXJyWzBdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDAsIDgpLCAxNikpID4+PiAyNDtcbiAgYXJyWzFdID0gdiA+Pj4gMTYgJiAweGZmO1xuICBhcnJbMl0gPSB2ID4+PiA4ICYgMHhmZjtcbiAgYXJyWzNdID0gdiAmIDB4ZmY7IC8vIFBhcnNlIC4uLi4uLi4uLSMjIyMtLi4uLi0uLi4uLS4uLi4uLi4uLi4uLlxuXG4gIGFycls0XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSg5LCAxMyksIDE2KSkgPj4+IDg7XG4gIGFycls1XSA9IHYgJiAweGZmOyAvLyBQYXJzZSAuLi4uLi4uLi0uLi4uLSMjIyMtLi4uLi0uLi4uLi4uLi4uLi5cblxuICBhcnJbNl0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMTQsIDE4KSwgMTYpKSA+Pj4gODtcbiAgYXJyWzddID0gdiAmIDB4ZmY7IC8vIFBhcnNlIC4uLi4uLi4uLS4uLi4tLi4uLi0jIyMjLS4uLi4uLi4uLi4uLlxuXG4gIGFycls4XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgxOSwgMjMpLCAxNikpID4+PiA4O1xuICBhcnJbOV0gPSB2ICYgMHhmZjsgLy8gUGFyc2UgLi4uLi4uLi4tLi4uLi0uLi4uLS4uLi4tIyMjIyMjIyMjIyMjXG4gIC8vIChVc2UgXCIvXCIgdG8gYXZvaWQgMzItYml0IHRydW5jYXRpb24gd2hlbiBiaXQtc2hpZnRpbmcgaGlnaC1vcmRlciBieXRlcylcblxuICBhcnJbMTBdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDI0LCAzNiksIDE2KSkgLyAweDEwMDAwMDAwMDAwICYgMHhmZjtcbiAgYXJyWzExXSA9IHYgLyAweDEwMDAwMDAwMCAmIDB4ZmY7XG4gIGFyclsxMl0gPSB2ID4+PiAyNCAmIDB4ZmY7XG4gIGFyclsxM10gPSB2ID4+PiAxNiAmIDB4ZmY7XG4gIGFyclsxNF0gPSB2ID4+PiA4ICYgMHhmZjtcbiAgYXJyWzE1XSA9IHYgJiAweGZmO1xuICByZXR1cm4gYXJyO1xufVxuXG5leHBvcnQgZGVmYXVsdCBwYXJzZTsiLCJleHBvcnQgZGVmYXVsdCAvXig/OlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLTVdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCkkL2k7IiwiLy8gVW5pcXVlIElEIGNyZWF0aW9uIHJlcXVpcmVzIGEgaGlnaCBxdWFsaXR5IHJhbmRvbSAjIGdlbmVyYXRvci4gSW4gdGhlIGJyb3dzZXIgd2UgdGhlcmVmb3JlXG4vLyByZXF1aXJlIHRoZSBjcnlwdG8gQVBJIGFuZCBkbyBub3Qgc3VwcG9ydCBidWlsdC1pbiBmYWxsYmFjayB0byBsb3dlciBxdWFsaXR5IHJhbmRvbSBudW1iZXJcbi8vIGdlbmVyYXRvcnMgKGxpa2UgTWF0aC5yYW5kb20oKSkuXG52YXIgZ2V0UmFuZG9tVmFsdWVzO1xudmFyIHJuZHM4ID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcm5nKCkge1xuICAvLyBsYXp5IGxvYWQgc28gdGhhdCBlbnZpcm9ubWVudHMgdGhhdCBuZWVkIHRvIHBvbHlmaWxsIGhhdmUgYSBjaGFuY2UgdG8gZG8gc29cbiAgaWYgKCFnZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAvLyBnZXRSYW5kb21WYWx1ZXMgbmVlZHMgdG8gYmUgaW52b2tlZCBpbiBhIGNvbnRleHQgd2hlcmUgXCJ0aGlzXCIgaXMgYSBDcnlwdG8gaW1wbGVtZW50YXRpb24uIEFsc28sXG4gICAgLy8gZmluZCB0aGUgY29tcGxldGUgaW1wbGVtZW50YXRpb24gb2YgY3J5cHRvIChtc0NyeXB0bykgb24gSUUxMS5cbiAgICBnZXRSYW5kb21WYWx1ZXMgPSB0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pIHx8IHR5cGVvZiBtc0NyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyA9PT0gJ2Z1bmN0aW9uJyAmJiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0byk7XG5cbiAgICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBnZXRSYW5kb21WYWx1ZXMocm5kczgpO1xufSIsIi8vIEFkYXB0ZWQgZnJvbSBDaHJpcyBWZW5lc3MnIFNIQTEgY29kZSBhdFxuLy8gaHR0cDovL3d3dy5tb3ZhYmxlLXR5cGUuY28udWsvc2NyaXB0cy9zaGExLmh0bWxcbmZ1bmN0aW9uIGYocywgeCwgeSwgeikge1xuICBzd2l0Y2ggKHMpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4geCAmIHkgXiB+eCAmIHo7XG5cbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4geCBeIHkgXiB6O1xuXG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIHggJiB5IF4geCAmIHogXiB5ICYgejtcblxuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiB4IF4geSBeIHo7XG4gIH1cbn1cblxuZnVuY3Rpb24gUk9UTCh4LCBuKSB7XG4gIHJldHVybiB4IDw8IG4gfCB4ID4+PiAzMiAtIG47XG59XG5cbmZ1bmN0aW9uIHNoYTEoYnl0ZXMpIHtcbiAgdmFyIEsgPSBbMHg1YTgyNzk5OSwgMHg2ZWQ5ZWJhMSwgMHg4ZjFiYmNkYywgMHhjYTYyYzFkNl07XG4gIHZhciBIID0gWzB4Njc0NTIzMDEsIDB4ZWZjZGFiODksIDB4OThiYWRjZmUsIDB4MTAzMjU0NzYsIDB4YzNkMmUxZjBdO1xuXG4gIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIG1zZyA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChieXRlcykpOyAvLyBVVEY4IGVzY2FwZVxuXG4gICAgYnl0ZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgKytpKSB7XG4gICAgICBieXRlcy5wdXNoKG1zZy5jaGFyQ29kZUF0KGkpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkoYnl0ZXMpKSB7XG4gICAgLy8gQ29udmVydCBBcnJheS1saWtlIHRvIEFycmF5XG4gICAgYnl0ZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChieXRlcyk7XG4gIH1cblxuICBieXRlcy5wdXNoKDB4ODApO1xuICB2YXIgbCA9IGJ5dGVzLmxlbmd0aCAvIDQgKyAyO1xuICB2YXIgTiA9IE1hdGguY2VpbChsIC8gMTYpO1xuICB2YXIgTSA9IG5ldyBBcnJheShOKTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgTjsgKytfaSkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDMyQXJyYXkoMTYpO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCAxNjsgKytqKSB7XG4gICAgICBhcnJbal0gPSBieXRlc1tfaSAqIDY0ICsgaiAqIDRdIDw8IDI0IHwgYnl0ZXNbX2kgKiA2NCArIGogKiA0ICsgMV0gPDwgMTYgfCBieXRlc1tfaSAqIDY0ICsgaiAqIDQgKyAyXSA8PCA4IHwgYnl0ZXNbX2kgKiA2NCArIGogKiA0ICsgM107XG4gICAgfVxuXG4gICAgTVtfaV0gPSBhcnI7XG4gIH1cblxuICBNW04gLSAxXVsxNF0gPSAoYnl0ZXMubGVuZ3RoIC0gMSkgKiA4IC8gTWF0aC5wb3coMiwgMzIpO1xuICBNW04gLSAxXVsxNF0gPSBNYXRoLmZsb29yKE1bTiAtIDFdWzE0XSk7XG4gIE1bTiAtIDFdWzE1XSA9IChieXRlcy5sZW5ndGggLSAxKSAqIDggJiAweGZmZmZmZmZmO1xuXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IE47ICsrX2kyKSB7XG4gICAgdmFyIFcgPSBuZXcgVWludDMyQXJyYXkoODApO1xuXG4gICAgZm9yICh2YXIgdCA9IDA7IHQgPCAxNjsgKyt0KSB7XG4gICAgICBXW3RdID0gTVtfaTJdW3RdO1xuICAgIH1cblxuICAgIGZvciAodmFyIF90ID0gMTY7IF90IDwgODA7ICsrX3QpIHtcbiAgICAgIFdbX3RdID0gUk9UTChXW190IC0gM10gXiBXW190IC0gOF0gXiBXW190IC0gMTRdIF4gV1tfdCAtIDE2XSwgMSk7XG4gICAgfVxuXG4gICAgdmFyIGEgPSBIWzBdO1xuICAgIHZhciBiID0gSFsxXTtcbiAgICB2YXIgYyA9IEhbMl07XG4gICAgdmFyIGQgPSBIWzNdO1xuICAgIHZhciBlID0gSFs0XTtcblxuICAgIGZvciAodmFyIF90MiA9IDA7IF90MiA8IDgwOyArK190Mikge1xuICAgICAgdmFyIHMgPSBNYXRoLmZsb29yKF90MiAvIDIwKTtcbiAgICAgIHZhciBUID0gUk9UTChhLCA1KSArIGYocywgYiwgYywgZCkgKyBlICsgS1tzXSArIFdbX3QyXSA+Pj4gMDtcbiAgICAgIGUgPSBkO1xuICAgICAgZCA9IGM7XG4gICAgICBjID0gUk9UTChiLCAzMCkgPj4+IDA7XG4gICAgICBiID0gYTtcbiAgICAgIGEgPSBUO1xuICAgIH1cblxuICAgIEhbMF0gPSBIWzBdICsgYSA+Pj4gMDtcbiAgICBIWzFdID0gSFsxXSArIGIgPj4+IDA7XG4gICAgSFsyXSA9IEhbMl0gKyBjID4+PiAwO1xuICAgIEhbM10gPSBIWzNdICsgZCA+Pj4gMDtcbiAgICBIWzRdID0gSFs0XSArIGUgPj4+IDA7XG4gIH1cblxuICByZXR1cm4gW0hbMF0gPj4gMjQgJiAweGZmLCBIWzBdID4+IDE2ICYgMHhmZiwgSFswXSA+PiA4ICYgMHhmZiwgSFswXSAmIDB4ZmYsIEhbMV0gPj4gMjQgJiAweGZmLCBIWzFdID4+IDE2ICYgMHhmZiwgSFsxXSA+PiA4ICYgMHhmZiwgSFsxXSAmIDB4ZmYsIEhbMl0gPj4gMjQgJiAweGZmLCBIWzJdID4+IDE2ICYgMHhmZiwgSFsyXSA+PiA4ICYgMHhmZiwgSFsyXSAmIDB4ZmYsIEhbM10gPj4gMjQgJiAweGZmLCBIWzNdID4+IDE2ICYgMHhmZiwgSFszXSA+PiA4ICYgMHhmZiwgSFszXSAmIDB4ZmYsIEhbNF0gPj4gMjQgJiAweGZmLCBIWzRdID4+IDE2ICYgMHhmZiwgSFs0XSA+PiA4ICYgMHhmZiwgSFs0XSAmIDB4ZmZdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzaGExOyIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcbi8qKlxuICogQ29udmVydCBhcnJheSBvZiAxNiBieXRlIHZhbHVlcyB0byBVVUlEIHN0cmluZyBmb3JtYXQgb2YgdGhlIGZvcm06XG4gKiBYWFhYWFhYWC1YWFhYLVhYWFgtWFhYWC1YWFhYWFhYWFhYWFhcbiAqL1xuXG52YXIgYnl0ZVRvSGV4ID0gW107XG5cbmZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgYnl0ZVRvSGV4LnB1c2goKGkgKyAweDEwMCkudG9TdHJpbmcoMTYpLnN1YnN0cigxKSk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeShhcnIpIHtcbiAgdmFyIG9mZnNldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgLy8gTm90ZTogQmUgY2FyZWZ1bCBlZGl0aW5nIHRoaXMgY29kZSEgIEl0J3MgYmVlbiB0dW5lZCBmb3IgcGVyZm9ybWFuY2VcbiAgLy8gYW5kIHdvcmtzIGluIHdheXMgeW91IG1heSBub3QgZXhwZWN0LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkL3B1bGwvNDM0XG4gIHZhciB1dWlkID0gKGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDJdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgM11dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA0XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDVdXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA3XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDhdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgOV1dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMV1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxM11dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNV1dKS50b0xvd2VyQ2FzZSgpOyAvLyBDb25zaXN0ZW5jeSBjaGVjayBmb3IgdmFsaWQgVVVJRC4gIElmIHRoaXMgdGhyb3dzLCBpdCdzIGxpa2VseSBkdWUgdG8gb25lXG4gIC8vIG9mIHRoZSBmb2xsb3dpbmc6XG4gIC8vIC0gT25lIG9yIG1vcmUgaW5wdXQgYXJyYXkgdmFsdWVzIGRvbid0IG1hcCB0byBhIGhleCBvY3RldCAobGVhZGluZyB0b1xuICAvLyBcInVuZGVmaW5lZFwiIGluIHRoZSB1dWlkKVxuICAvLyAtIEludmFsaWQgaW5wdXQgdmFsdWVzIGZvciB0aGUgUkZDIGB2ZXJzaW9uYCBvciBgdmFyaWFudGAgZmllbGRzXG5cbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkJyk7XG4gIH1cblxuICByZXR1cm4gdXVpZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3RyaW5naWZ5OyIsImltcG9ydCBybmcgZnJvbSAnLi9ybmcuanMnO1xuaW1wb3J0IHN0cmluZ2lmeSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7IC8vICoqYHYxKClgIC0gR2VuZXJhdGUgdGltZS1iYXNlZCBVVUlEKipcbi8vXG4vLyBJbnNwaXJlZCBieSBodHRwczovL2dpdGh1Yi5jb20vTGlvc0svVVVJRC5qc1xuLy8gYW5kIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGlicmFyeS91dWlkLmh0bWxcblxudmFyIF9ub2RlSWQ7XG5cbnZhciBfY2xvY2tzZXE7IC8vIFByZXZpb3VzIHV1aWQgY3JlYXRpb24gdGltZVxuXG5cbnZhciBfbGFzdE1TZWNzID0gMDtcbnZhciBfbGFzdE5TZWNzID0gMDsgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCBmb3IgQVBJIGRldGFpbHNcblxuZnVuY3Rpb24gdjEob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgdmFyIGkgPSBidWYgJiYgb2Zmc2V0IHx8IDA7XG4gIHZhciBiID0gYnVmIHx8IG5ldyBBcnJheSgxNik7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgbm9kZSA9IG9wdGlvbnMubm9kZSB8fCBfbm9kZUlkO1xuICB2YXIgY2xvY2tzZXEgPSBvcHRpb25zLmNsb2Nrc2VxICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmNsb2Nrc2VxIDogX2Nsb2Nrc2VxOyAvLyBub2RlIGFuZCBjbG9ja3NlcSBuZWVkIHRvIGJlIGluaXRpYWxpemVkIHRvIHJhbmRvbSB2YWx1ZXMgaWYgdGhleSdyZSBub3RcbiAgLy8gc3BlY2lmaWVkLiAgV2UgZG8gdGhpcyBsYXppbHkgdG8gbWluaW1pemUgaXNzdWVzIHJlbGF0ZWQgdG8gaW5zdWZmaWNpZW50XG4gIC8vIHN5c3RlbSBlbnRyb3B5LiAgU2VlICMxODlcblxuICBpZiAobm9kZSA9PSBudWxsIHx8IGNsb2Nrc2VxID09IG51bGwpIHtcbiAgICB2YXIgc2VlZEJ5dGVzID0gb3B0aW9ucy5yYW5kb20gfHwgKG9wdGlvbnMucm5nIHx8IHJuZykoKTtcblxuICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgIC8vIFBlciA0LjUsIGNyZWF0ZSBhbmQgNDgtYml0IG5vZGUgaWQsICg0NyByYW5kb20gYml0cyArIG11bHRpY2FzdCBiaXQgPSAxKVxuICAgICAgbm9kZSA9IF9ub2RlSWQgPSBbc2VlZEJ5dGVzWzBdIHwgMHgwMSwgc2VlZEJ5dGVzWzFdLCBzZWVkQnl0ZXNbMl0sIHNlZWRCeXRlc1szXSwgc2VlZEJ5dGVzWzRdLCBzZWVkQnl0ZXNbNV1dO1xuICAgIH1cblxuICAgIGlmIChjbG9ja3NlcSA9PSBudWxsKSB7XG4gICAgICAvLyBQZXIgNC4yLjIsIHJhbmRvbWl6ZSAoMTQgYml0KSBjbG9ja3NlcVxuICAgICAgY2xvY2tzZXEgPSBfY2xvY2tzZXEgPSAoc2VlZEJ5dGVzWzZdIDw8IDggfCBzZWVkQnl0ZXNbN10pICYgMHgzZmZmO1xuICAgIH1cbiAgfSAvLyBVVUlEIHRpbWVzdGFtcHMgYXJlIDEwMCBuYW5vLXNlY29uZCB1bml0cyBzaW5jZSB0aGUgR3JlZ29yaWFuIGVwb2NoLFxuICAvLyAoMTU4Mi0xMC0xNSAwMDowMCkuICBKU051bWJlcnMgYXJlbid0IHByZWNpc2UgZW5vdWdoIGZvciB0aGlzLCBzb1xuICAvLyB0aW1lIGlzIGhhbmRsZWQgaW50ZXJuYWxseSBhcyAnbXNlY3MnIChpbnRlZ2VyIG1pbGxpc2Vjb25kcykgYW5kICduc2VjcydcbiAgLy8gKDEwMC1uYW5vc2Vjb25kcyBvZmZzZXQgZnJvbSBtc2Vjcykgc2luY2UgdW5peCBlcG9jaCwgMTk3MC0wMS0wMSAwMDowMC5cblxuXG4gIHZhciBtc2VjcyA9IG9wdGlvbnMubXNlY3MgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubXNlY3MgOiBEYXRlLm5vdygpOyAvLyBQZXIgNC4yLjEuMiwgdXNlIGNvdW50IG9mIHV1aWQncyBnZW5lcmF0ZWQgZHVyaW5nIHRoZSBjdXJyZW50IGNsb2NrXG4gIC8vIGN5Y2xlIHRvIHNpbXVsYXRlIGhpZ2hlciByZXNvbHV0aW9uIGNsb2NrXG5cbiAgdmFyIG5zZWNzID0gb3B0aW9ucy5uc2VjcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5uc2VjcyA6IF9sYXN0TlNlY3MgKyAxOyAvLyBUaW1lIHNpbmNlIGxhc3QgdXVpZCBjcmVhdGlvbiAoaW4gbXNlY3MpXG5cbiAgdmFyIGR0ID0gbXNlY3MgLSBfbGFzdE1TZWNzICsgKG5zZWNzIC0gX2xhc3ROU2VjcykgLyAxMDAwMDsgLy8gUGVyIDQuMi4xLjIsIEJ1bXAgY2xvY2tzZXEgb24gY2xvY2sgcmVncmVzc2lvblxuXG4gIGlmIChkdCA8IDAgJiYgb3B0aW9ucy5jbG9ja3NlcSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY2xvY2tzZXEgPSBjbG9ja3NlcSArIDEgJiAweDNmZmY7XG4gIH0gLy8gUmVzZXQgbnNlY3MgaWYgY2xvY2sgcmVncmVzc2VzIChuZXcgY2xvY2tzZXEpIG9yIHdlJ3ZlIG1vdmVkIG9udG8gYSBuZXdcbiAgLy8gdGltZSBpbnRlcnZhbFxuXG5cbiAgaWYgKChkdCA8IDAgfHwgbXNlY3MgPiBfbGFzdE1TZWNzKSAmJiBvcHRpb25zLm5zZWNzID09PSB1bmRlZmluZWQpIHtcbiAgICBuc2VjcyA9IDA7XG4gIH0gLy8gUGVyIDQuMi4xLjIgVGhyb3cgZXJyb3IgaWYgdG9vIG1hbnkgdXVpZHMgYXJlIHJlcXVlc3RlZFxuXG5cbiAgaWYgKG5zZWNzID49IDEwMDAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXVpZC52MSgpOiBDYW4ndCBjcmVhdGUgbW9yZSB0aGFuIDEwTSB1dWlkcy9zZWNcIik7XG4gIH1cblxuICBfbGFzdE1TZWNzID0gbXNlY3M7XG4gIF9sYXN0TlNlY3MgPSBuc2VjcztcbiAgX2Nsb2Nrc2VxID0gY2xvY2tzZXE7IC8vIFBlciA0LjEuNCAtIENvbnZlcnQgZnJvbSB1bml4IGVwb2NoIHRvIEdyZWdvcmlhbiBlcG9jaFxuXG4gIG1zZWNzICs9IDEyMjE5MjkyODAwMDAwOyAvLyBgdGltZV9sb3dgXG5cbiAgdmFyIHRsID0gKChtc2VjcyAmIDB4ZmZmZmZmZikgKiAxMDAwMCArIG5zZWNzKSAlIDB4MTAwMDAwMDAwO1xuICBiW2krK10gPSB0bCA+Pj4gMjQgJiAweGZmO1xuICBiW2krK10gPSB0bCA+Pj4gMTYgJiAweGZmO1xuICBiW2krK10gPSB0bCA+Pj4gOCAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRsICYgMHhmZjsgLy8gYHRpbWVfbWlkYFxuXG4gIHZhciB0bWggPSBtc2VjcyAvIDB4MTAwMDAwMDAwICogMTAwMDAgJiAweGZmZmZmZmY7XG4gIGJbaSsrXSA9IHRtaCA+Pj4gOCAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRtaCAmIDB4ZmY7IC8vIGB0aW1lX2hpZ2hfYW5kX3ZlcnNpb25gXG5cbiAgYltpKytdID0gdG1oID4+PiAyNCAmIDB4ZiB8IDB4MTA7IC8vIGluY2x1ZGUgdmVyc2lvblxuXG4gIGJbaSsrXSA9IHRtaCA+Pj4gMTYgJiAweGZmOyAvLyBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGAgKFBlciA0LjIuMiAtIGluY2x1ZGUgdmFyaWFudClcblxuICBiW2krK10gPSBjbG9ja3NlcSA+Pj4gOCB8IDB4ODA7IC8vIGBjbG9ja19zZXFfbG93YFxuXG4gIGJbaSsrXSA9IGNsb2Nrc2VxICYgMHhmZjsgLy8gYG5vZGVgXG5cbiAgZm9yICh2YXIgbiA9IDA7IG4gPCA2OyArK24pIHtcbiAgICBiW2kgKyBuXSA9IG5vZGVbbl07XG4gIH1cblxuICByZXR1cm4gYnVmIHx8IHN0cmluZ2lmeShiKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdjE7IiwiaW1wb3J0IHYzNSBmcm9tICcuL3YzNS5qcyc7XG5pbXBvcnQgbWQ1IGZyb20gJy4vbWQ1LmpzJztcbnZhciB2MyA9IHYzNSgndjMnLCAweDMwLCBtZDUpO1xuZXhwb3J0IGRlZmF1bHQgdjM7IiwiaW1wb3J0IHN0cmluZ2lmeSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5pbXBvcnQgcGFyc2UgZnJvbSAnLi9wYXJzZS5qcyc7XG5cbmZ1bmN0aW9uIHN0cmluZ1RvQnl0ZXMoc3RyKSB7XG4gIHN0ciA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKTsgLy8gVVRGOCBlc2NhcGVcblxuICB2YXIgYnl0ZXMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGJ5dGVzLnB1c2goc3RyLmNoYXJDb2RlQXQoaSkpO1xuICB9XG5cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG5leHBvcnQgdmFyIEROUyA9ICc2YmE3YjgxMC05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnO1xuZXhwb3J0IHZhciBVUkwgPSAnNmJhN2I4MTEtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChuYW1lLCB2ZXJzaW9uLCBoYXNoZnVuYykge1xuICBmdW5jdGlvbiBnZW5lcmF0ZVVVSUQodmFsdWUsIG5hbWVzcGFjZSwgYnVmLCBvZmZzZXQpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgdmFsdWUgPSBzdHJpbmdUb0J5dGVzKHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5hbWVzcGFjZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG5hbWVzcGFjZSA9IHBhcnNlKG5hbWVzcGFjZSk7XG4gICAgfVxuXG4gICAgaWYgKG5hbWVzcGFjZS5sZW5ndGggIT09IDE2KSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ05hbWVzcGFjZSBtdXN0IGJlIGFycmF5LWxpa2UgKDE2IGl0ZXJhYmxlIGludGVnZXIgdmFsdWVzLCAwLTI1NSknKTtcbiAgICB9IC8vIENvbXB1dGUgaGFzaCBvZiBuYW1lc3BhY2UgYW5kIHZhbHVlLCBQZXIgNC4zXG4gICAgLy8gRnV0dXJlOiBVc2Ugc3ByZWFkIHN5bnRheCB3aGVuIHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zLCBlLmcuIGBieXRlcyA9XG4gICAgLy8gaGFzaGZ1bmMoWy4uLm5hbWVzcGFjZSwgLi4uIHZhbHVlXSlgXG5cblxuICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KDE2ICsgdmFsdWUubGVuZ3RoKTtcbiAgICBieXRlcy5zZXQobmFtZXNwYWNlKTtcbiAgICBieXRlcy5zZXQodmFsdWUsIG5hbWVzcGFjZS5sZW5ndGgpO1xuICAgIGJ5dGVzID0gaGFzaGZ1bmMoYnl0ZXMpO1xuICAgIGJ5dGVzWzZdID0gYnl0ZXNbNl0gJiAweDBmIHwgdmVyc2lvbjtcbiAgICBieXRlc1s4XSA9IGJ5dGVzWzhdICYgMHgzZiB8IDB4ODA7XG5cbiAgICBpZiAoYnVmKSB7XG4gICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IGJ5dGVzW2ldO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYnVmO1xuICAgIH1cblxuICAgIHJldHVybiBzdHJpbmdpZnkoYnl0ZXMpO1xuICB9IC8vIEZ1bmN0aW9uI25hbWUgaXMgbm90IHNldHRhYmxlIG9uIHNvbWUgcGxhdGZvcm1zICgjMjcwKVxuXG5cbiAgdHJ5IHtcbiAgICBnZW5lcmF0ZVVVSUQubmFtZSA9IG5hbWU7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lbXB0eVxuICB9IGNhdGNoIChlcnIpIHt9IC8vIEZvciBDb21tb25KUyBkZWZhdWx0IGV4cG9ydCBzdXBwb3J0XG5cblxuICBnZW5lcmF0ZVVVSUQuRE5TID0gRE5TO1xuICBnZW5lcmF0ZVVVSUQuVVJMID0gVVJMO1xuICByZXR1cm4gZ2VuZXJhdGVVVUlEO1xufSIsImltcG9ydCBybmcgZnJvbSAnLi9ybmcuanMnO1xuaW1wb3J0IHN0cmluZ2lmeSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5cbmZ1bmN0aW9uIHY0KG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgcm5kcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBybmcpKCk7IC8vIFBlciA0LjQsIHNldCBiaXRzIGZvciB2ZXJzaW9uIGFuZCBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGBcblxuICBybmRzWzZdID0gcm5kc1s2XSAmIDB4MGYgfCAweDQwO1xuICBybmRzWzhdID0gcm5kc1s4XSAmIDB4M2YgfCAweDgwOyAvLyBDb3B5IGJ5dGVzIHRvIGJ1ZmZlciwgaWYgcHJvdmlkZWRcblxuICBpZiAoYnVmKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHJuZHNbaV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuXG4gIHJldHVybiBzdHJpbmdpZnkocm5kcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHY0OyIsImltcG9ydCB2MzUgZnJvbSAnLi92MzUuanMnO1xuaW1wb3J0IHNoYTEgZnJvbSAnLi9zaGExLmpzJztcbnZhciB2NSA9IHYzNSgndjUnLCAweDUwLCBzaGExKTtcbmV4cG9ydCBkZWZhdWx0IHY1OyIsImltcG9ydCBSRUdFWCBmcm9tICcuL3JlZ2V4LmpzJztcblxuZnVuY3Rpb24gdmFsaWRhdGUodXVpZCkge1xuICByZXR1cm4gdHlwZW9mIHV1aWQgPT09ICdzdHJpbmcnICYmIFJFR0VYLnRlc3QodXVpZCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZhbGlkYXRlOyIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuZnVuY3Rpb24gdmVyc2lvbih1dWlkKSB7XG4gIGlmICghdmFsaWRhdGUodXVpZCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0ludmFsaWQgVVVJRCcpO1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlSW50KHV1aWQuc3Vic3RyKDE0LCAxKSwgMTYpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2ZXJzaW9uOyIsImltcG9ydCB7IENvbXBvbmVudCwgQ29tcG9uZW50Q29udGFpbmVyIH0gZnJvbSAnQGZpcmViYXNlL2NvbXBvbmVudCc7XG5pbXBvcnQgeyBMb2dnZXIsIHNldFVzZXJMb2dIYW5kbGVyLCBzZXRMb2dMZXZlbCBhcyBzZXRMb2dMZXZlbCQxIH0gZnJvbSAnQGZpcmViYXNlL2xvZ2dlcic7XG5pbXBvcnQgeyBFcnJvckZhY3RvcnksIGRlZXBFcXVhbCwgb3BlbkRCLCBiYXNlNjR1cmxFbmNvZGVXaXRob3V0UGFkZGluZywgaXNJbmRleGVkREJBdmFpbGFibGUsIHZhbGlkYXRlSW5kZXhlZERCT3BlbmFibGUgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5leHBvcnQgeyBGaXJlYmFzZUVycm9yIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jbGFzcyBQbGF0Zm9ybUxvZ2dlclNlcnZpY2VJbXBsIHtcclxuICAgIGNvbnN0cnVjdG9yKGNvbnRhaW5lcikge1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xyXG4gICAgfVxyXG4gICAgLy8gSW4gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiwgdGhpcyB3aWxsIGJlIGNhbGxlZCBieSBpbnN0YWxsYXRpb25zIG9uXHJcbiAgICAvLyBhdXRoIHRva2VuIHJlZnJlc2gsIGFuZCBpbnN0YWxsYXRpb25zIHdpbGwgc2VuZCB0aGlzIHN0cmluZy5cclxuICAgIGdldFBsYXRmb3JtSW5mb1N0cmluZygpIHtcclxuICAgICAgICBjb25zdCBwcm92aWRlcnMgPSB0aGlzLmNvbnRhaW5lci5nZXRQcm92aWRlcnMoKTtcclxuICAgICAgICAvLyBMb29wIHRocm91Z2ggcHJvdmlkZXJzIGFuZCBnZXQgbGlicmFyeS92ZXJzaW9uIHBhaXJzIGZyb20gYW55IHRoYXQgYXJlXHJcbiAgICAgICAgLy8gdmVyc2lvbiBjb21wb25lbnRzLlxyXG4gICAgICAgIHJldHVybiBwcm92aWRlcnNcclxuICAgICAgICAgICAgLm1hcChwcm92aWRlciA9PiB7XHJcbiAgICAgICAgICAgIGlmIChpc1ZlcnNpb25TZXJ2aWNlUHJvdmlkZXIocHJvdmlkZXIpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZXJ2aWNlID0gcHJvdmlkZXIuZ2V0SW1tZWRpYXRlKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7c2VydmljZS5saWJyYXJ5fS8ke3NlcnZpY2UudmVyc2lvbn1gO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgICAgICAuZmlsdGVyKGxvZ1N0cmluZyA9PiBsb2dTdHJpbmcpXHJcbiAgICAgICAgICAgIC5qb2luKCcgJyk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqXHJcbiAqIEBwYXJhbSBwcm92aWRlciBjaGVjayBpZiB0aGlzIHByb3ZpZGVyIHByb3ZpZGVzIGEgVmVyc2lvblNlcnZpY2VcclxuICpcclxuICogTk9URTogVXNpbmcgUHJvdmlkZXI8J2FwcC12ZXJzaW9uJz4gaXMgYSBoYWNrIHRvIGluZGljYXRlIHRoYXQgdGhlIHByb3ZpZGVyXHJcbiAqIHByb3ZpZGVzIFZlcnNpb25TZXJ2aWNlLiBUaGUgcHJvdmlkZXIgaXMgbm90IG5lY2Vzc2FyaWx5IGEgJ2FwcC12ZXJzaW9uJ1xyXG4gKiBwcm92aWRlci5cclxuICovXHJcbmZ1bmN0aW9uIGlzVmVyc2lvblNlcnZpY2VQcm92aWRlcihwcm92aWRlcikge1xyXG4gICAgY29uc3QgY29tcG9uZW50ID0gcHJvdmlkZXIuZ2V0Q29tcG9uZW50KCk7XHJcbiAgICByZXR1cm4gKGNvbXBvbmVudCA9PT0gbnVsbCB8fCBjb21wb25lbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbXBvbmVudC50eXBlKSA9PT0gXCJWRVJTSU9OXCIgLyogVkVSU0lPTiAqLztcclxufVxuXG5jb25zdCBuYW1lJG8gPSBcIkBmaXJlYmFzZS9hcHBcIjtcbmNvbnN0IHZlcnNpb24kMSA9IFwiMC43LjE5XCI7XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoJ0BmaXJlYmFzZS9hcHAnKTtcblxuY29uc3QgbmFtZSRuID0gXCJAZmlyZWJhc2UvYXBwLWNvbXBhdFwiO1xuXG5jb25zdCBuYW1lJG0gPSBcIkBmaXJlYmFzZS9hbmFseXRpY3MtY29tcGF0XCI7XG5cbmNvbnN0IG5hbWUkbCA9IFwiQGZpcmViYXNlL2FuYWx5dGljc1wiO1xuXG5jb25zdCBuYW1lJGsgPSBcIkBmaXJlYmFzZS9hcHAtY2hlY2stY29tcGF0XCI7XG5cbmNvbnN0IG5hbWUkaiA9IFwiQGZpcmViYXNlL2FwcC1jaGVja1wiO1xuXG5jb25zdCBuYW1lJGkgPSBcIkBmaXJlYmFzZS9hdXRoXCI7XG5cbmNvbnN0IG5hbWUkaCA9IFwiQGZpcmViYXNlL2F1dGgtY29tcGF0XCI7XG5cbmNvbnN0IG5hbWUkZyA9IFwiQGZpcmViYXNlL2RhdGFiYXNlXCI7XG5cbmNvbnN0IG5hbWUkZiA9IFwiQGZpcmViYXNlL2RhdGFiYXNlLWNvbXBhdFwiO1xuXG5jb25zdCBuYW1lJGUgPSBcIkBmaXJlYmFzZS9mdW5jdGlvbnNcIjtcblxuY29uc3QgbmFtZSRkID0gXCJAZmlyZWJhc2UvZnVuY3Rpb25zLWNvbXBhdFwiO1xuXG5jb25zdCBuYW1lJGMgPSBcIkBmaXJlYmFzZS9pbnN0YWxsYXRpb25zXCI7XG5cbmNvbnN0IG5hbWUkYiA9IFwiQGZpcmViYXNlL2luc3RhbGxhdGlvbnMtY29tcGF0XCI7XG5cbmNvbnN0IG5hbWUkYSA9IFwiQGZpcmViYXNlL21lc3NhZ2luZ1wiO1xuXG5jb25zdCBuYW1lJDkgPSBcIkBmaXJlYmFzZS9tZXNzYWdpbmctY29tcGF0XCI7XG5cbmNvbnN0IG5hbWUkOCA9IFwiQGZpcmViYXNlL3BlcmZvcm1hbmNlXCI7XG5cbmNvbnN0IG5hbWUkNyA9IFwiQGZpcmViYXNlL3BlcmZvcm1hbmNlLWNvbXBhdFwiO1xuXG5jb25zdCBuYW1lJDYgPSBcIkBmaXJlYmFzZS9yZW1vdGUtY29uZmlnXCI7XG5cbmNvbnN0IG5hbWUkNSA9IFwiQGZpcmViYXNlL3JlbW90ZS1jb25maWctY29tcGF0XCI7XG5cbmNvbnN0IG5hbWUkNCA9IFwiQGZpcmViYXNlL3N0b3JhZ2VcIjtcblxuY29uc3QgbmFtZSQzID0gXCJAZmlyZWJhc2Uvc3RvcmFnZS1jb21wYXRcIjtcblxuY29uc3QgbmFtZSQyID0gXCJAZmlyZWJhc2UvZmlyZXN0b3JlXCI7XG5cbmNvbnN0IG5hbWUkMSA9IFwiQGZpcmViYXNlL2ZpcmVzdG9yZS1jb21wYXRcIjtcblxuY29uc3QgbmFtZSA9IFwiZmlyZWJhc2VcIjtcbmNvbnN0IHZlcnNpb24gPSBcIjkuNi45XCI7XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBUaGUgZGVmYXVsdCBhcHAgbmFtZVxyXG4gKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmNvbnN0IERFRkFVTFRfRU5UUllfTkFNRSA9ICdbREVGQVVMVF0nO1xyXG5jb25zdCBQTEFURk9STV9MT0dfU1RSSU5HID0ge1xyXG4gICAgW25hbWUkb106ICdmaXJlLWNvcmUnLFxyXG4gICAgW25hbWUkbl06ICdmaXJlLWNvcmUtY29tcGF0JyxcclxuICAgIFtuYW1lJGxdOiAnZmlyZS1hbmFseXRpY3MnLFxyXG4gICAgW25hbWUkbV06ICdmaXJlLWFuYWx5dGljcy1jb21wYXQnLFxyXG4gICAgW25hbWUkal06ICdmaXJlLWFwcC1jaGVjaycsXHJcbiAgICBbbmFtZSRrXTogJ2ZpcmUtYXBwLWNoZWNrLWNvbXBhdCcsXHJcbiAgICBbbmFtZSRpXTogJ2ZpcmUtYXV0aCcsXHJcbiAgICBbbmFtZSRoXTogJ2ZpcmUtYXV0aC1jb21wYXQnLFxyXG4gICAgW25hbWUkZ106ICdmaXJlLXJ0ZGInLFxyXG4gICAgW25hbWUkZl06ICdmaXJlLXJ0ZGItY29tcGF0JyxcclxuICAgIFtuYW1lJGVdOiAnZmlyZS1mbicsXHJcbiAgICBbbmFtZSRkXTogJ2ZpcmUtZm4tY29tcGF0JyxcclxuICAgIFtuYW1lJGNdOiAnZmlyZS1paWQnLFxyXG4gICAgW25hbWUkYl06ICdmaXJlLWlpZC1jb21wYXQnLFxyXG4gICAgW25hbWUkYV06ICdmaXJlLWZjbScsXHJcbiAgICBbbmFtZSQ5XTogJ2ZpcmUtZmNtLWNvbXBhdCcsXHJcbiAgICBbbmFtZSQ4XTogJ2ZpcmUtcGVyZicsXHJcbiAgICBbbmFtZSQ3XTogJ2ZpcmUtcGVyZi1jb21wYXQnLFxyXG4gICAgW25hbWUkNl06ICdmaXJlLXJjJyxcclxuICAgIFtuYW1lJDVdOiAnZmlyZS1yYy1jb21wYXQnLFxyXG4gICAgW25hbWUkNF06ICdmaXJlLWdjcycsXHJcbiAgICBbbmFtZSQzXTogJ2ZpcmUtZ2NzLWNvbXBhdCcsXHJcbiAgICBbbmFtZSQyXTogJ2ZpcmUtZnN0JyxcclxuICAgIFtuYW1lJDFdOiAnZmlyZS1mc3QtY29tcGF0JyxcclxuICAgICdmaXJlLWpzJzogJ2ZpcmUtanMnLFxyXG4gICAgW25hbWVdOiAnZmlyZS1qcy1hbGwnXHJcbn07XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmNvbnN0IF9hcHBzID0gbmV3IE1hcCgpO1xyXG4vKipcclxuICogUmVnaXN0ZXJlZCBjb21wb25lbnRzLlxyXG4gKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbmNvbnN0IF9jb21wb25lbnRzID0gbmV3IE1hcCgpO1xyXG4vKipcclxuICogQHBhcmFtIGNvbXBvbmVudCAtIHRoZSBjb21wb25lbnQgYmVpbmcgYWRkZWQgdG8gdGhpcyBhcHAncyBjb250YWluZXJcclxuICpcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5mdW5jdGlvbiBfYWRkQ29tcG9uZW50KGFwcCwgY29tcG9uZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGFwcC5jb250YWluZXIuYWRkQ29tcG9uZW50KGNvbXBvbmVudCk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgQ29tcG9uZW50ICR7Y29tcG9uZW50Lm5hbWV9IGZhaWxlZCB0byByZWdpc3RlciB3aXRoIEZpcmViYXNlQXBwICR7YXBwLm5hbWV9YCwgZSk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZnVuY3Rpb24gX2FkZE9yT3ZlcndyaXRlQ29tcG9uZW50KGFwcCwgY29tcG9uZW50KSB7XHJcbiAgICBhcHAuY29udGFpbmVyLmFkZE9yT3ZlcndyaXRlQ29tcG9uZW50KGNvbXBvbmVudCk7XHJcbn1cclxuLyoqXHJcbiAqXHJcbiAqIEBwYXJhbSBjb21wb25lbnQgLSB0aGUgY29tcG9uZW50IHRvIHJlZ2lzdGVyXHJcbiAqIEByZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBjb21wb25lbnQgaXMgcmVnaXN0ZXJlZCBzdWNjZXNzZnVsbHlcclxuICpcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5mdW5jdGlvbiBfcmVnaXN0ZXJDb21wb25lbnQoY29tcG9uZW50KSB7XHJcbiAgICBjb25zdCBjb21wb25lbnROYW1lID0gY29tcG9uZW50Lm5hbWU7XHJcbiAgICBpZiAoX2NvbXBvbmVudHMuaGFzKGNvbXBvbmVudE5hbWUpKSB7XHJcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBUaGVyZSB3ZXJlIG11bHRpcGxlIGF0dGVtcHRzIHRvIHJlZ2lzdGVyIGNvbXBvbmVudCAke2NvbXBvbmVudE5hbWV9LmApO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIF9jb21wb25lbnRzLnNldChjb21wb25lbnROYW1lLCBjb21wb25lbnQpO1xyXG4gICAgLy8gYWRkIHRoZSBjb21wb25lbnQgdG8gZXhpc3RpbmcgYXBwIGluc3RhbmNlc1xyXG4gICAgZm9yIChjb25zdCBhcHAgb2YgX2FwcHMudmFsdWVzKCkpIHtcclxuICAgICAgICBfYWRkQ29tcG9uZW50KGFwcCwgY29tcG9uZW50KTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcbi8qKlxyXG4gKlxyXG4gKiBAcGFyYW0gYXBwIC0gRmlyZWJhc2VBcHAgaW5zdGFuY2VcclxuICogQHBhcmFtIG5hbWUgLSBzZXJ2aWNlIG5hbWVcclxuICpcclxuICogQHJldHVybnMgdGhlIHByb3ZpZGVyIGZvciB0aGUgc2VydmljZSB3aXRoIHRoZSBtYXRjaGluZyBuYW1lXHJcbiAqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZnVuY3Rpb24gX2dldFByb3ZpZGVyKGFwcCwgbmFtZSkge1xyXG4gICAgY29uc3QgaGVhcnRiZWF0Q29udHJvbGxlciA9IGFwcC5jb250YWluZXJcclxuICAgICAgICAuZ2V0UHJvdmlkZXIoJ2hlYXJ0YmVhdCcpXHJcbiAgICAgICAgLmdldEltbWVkaWF0ZSh7IG9wdGlvbmFsOiB0cnVlIH0pO1xyXG4gICAgaWYgKGhlYXJ0YmVhdENvbnRyb2xsZXIpIHtcclxuICAgICAgICB2b2lkIGhlYXJ0YmVhdENvbnRyb2xsZXIudHJpZ2dlckhlYXJ0YmVhdCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFwcC5jb250YWluZXIuZ2V0UHJvdmlkZXIobmFtZSk7XHJcbn1cclxuLyoqXHJcbiAqXHJcbiAqIEBwYXJhbSBhcHAgLSBGaXJlYmFzZUFwcCBpbnN0YW5jZVxyXG4gKiBAcGFyYW0gbmFtZSAtIHNlcnZpY2UgbmFtZVxyXG4gKiBAcGFyYW0gaW5zdGFuY2VJZGVudGlmaWVyIC0gc2VydmljZSBpbnN0YW5jZSBpZGVudGlmaWVyIGluIGNhc2UgdGhlIHNlcnZpY2Ugc3VwcG9ydHMgbXVsdGlwbGUgaW5zdGFuY2VzXHJcbiAqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZnVuY3Rpb24gX3JlbW92ZVNlcnZpY2VJbnN0YW5jZShhcHAsIG5hbWUsIGluc3RhbmNlSWRlbnRpZmllciA9IERFRkFVTFRfRU5UUllfTkFNRSkge1xyXG4gICAgX2dldFByb3ZpZGVyKGFwcCwgbmFtZSkuY2xlYXJJbnN0YW5jZShpbnN0YW5jZUlkZW50aWZpZXIpO1xyXG59XHJcbi8qKlxyXG4gKiBUZXN0IG9ubHlcclxuICpcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5mdW5jdGlvbiBfY2xlYXJDb21wb25lbnRzKCkge1xyXG4gICAgX2NvbXBvbmVudHMuY2xlYXIoKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBFUlJPUlMgPSB7XHJcbiAgICBbXCJuby1hcHBcIiAvKiBOT19BUFAgKi9dOiBcIk5vIEZpcmViYXNlIEFwcCAneyRhcHBOYW1lfScgaGFzIGJlZW4gY3JlYXRlZCAtIFwiICtcclxuICAgICAgICAnY2FsbCBGaXJlYmFzZSBBcHAuaW5pdGlhbGl6ZUFwcCgpJyxcclxuICAgIFtcImJhZC1hcHAtbmFtZVwiIC8qIEJBRF9BUFBfTkFNRSAqL106IFwiSWxsZWdhbCBBcHAgbmFtZTogJ3skYXBwTmFtZX1cIixcclxuICAgIFtcImR1cGxpY2F0ZS1hcHBcIiAvKiBEVVBMSUNBVEVfQVBQICovXTogXCJGaXJlYmFzZSBBcHAgbmFtZWQgJ3skYXBwTmFtZX0nIGFscmVhZHkgZXhpc3RzIHdpdGggZGlmZmVyZW50IG9wdGlvbnMgb3IgY29uZmlnXCIsXHJcbiAgICBbXCJhcHAtZGVsZXRlZFwiIC8qIEFQUF9ERUxFVEVEICovXTogXCJGaXJlYmFzZSBBcHAgbmFtZWQgJ3skYXBwTmFtZX0nIGFscmVhZHkgZGVsZXRlZFwiLFxyXG4gICAgW1wiaW52YWxpZC1hcHAtYXJndW1lbnRcIiAvKiBJTlZBTElEX0FQUF9BUkdVTUVOVCAqL106ICdmaXJlYmFzZS57JGFwcE5hbWV9KCkgdGFrZXMgZWl0aGVyIG5vIGFyZ3VtZW50IG9yIGEgJyArXHJcbiAgICAgICAgJ0ZpcmViYXNlIEFwcCBpbnN0YW5jZS4nLFxyXG4gICAgW1wiaW52YWxpZC1sb2ctYXJndW1lbnRcIiAvKiBJTlZBTElEX0xPR19BUkdVTUVOVCAqL106ICdGaXJzdCBhcmd1bWVudCB0byBgb25Mb2dgIG11c3QgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLicsXHJcbiAgICBbXCJzdG9yYWdlLW9wZW5cIiAvKiBTVE9SQUdFX09QRU4gKi9dOiAnRXJyb3IgdGhyb3duIHdoZW4gb3BlbmluZyBzdG9yYWdlLiBPcmlnaW5hbCBlcnJvcjogeyRvcmlnaW5hbEVycm9yTWVzc2FnZX0uJyxcclxuICAgIFtcInN0b3JhZ2UtZ2V0XCIgLyogU1RPUkFHRV9HRVQgKi9dOiAnRXJyb3IgdGhyb3duIHdoZW4gcmVhZGluZyBmcm9tIHN0b3JhZ2UuIE9yaWdpbmFsIGVycm9yOiB7JG9yaWdpbmFsRXJyb3JNZXNzYWdlfS4nLFxyXG4gICAgW1wic3RvcmFnZS1zZXRcIiAvKiBTVE9SQUdFX1dSSVRFICovXTogJ0Vycm9yIHRocm93biB3aGVuIHdyaXRpbmcgdG8gc3RvcmFnZS4gT3JpZ2luYWwgZXJyb3I6IHskb3JpZ2luYWxFcnJvck1lc3NhZ2V9LicsXHJcbiAgICBbXCJzdG9yYWdlLWRlbGV0ZVwiIC8qIFNUT1JBR0VfREVMRVRFICovXTogJ0Vycm9yIHRocm93biB3aGVuIGRlbGV0aW5nIGZyb20gc3RvcmFnZS4gT3JpZ2luYWwgZXJyb3I6IHskb3JpZ2luYWxFcnJvck1lc3NhZ2V9LidcclxufTtcclxuY29uc3QgRVJST1JfRkFDVE9SWSA9IG5ldyBFcnJvckZhY3RvcnkoJ2FwcCcsICdGaXJlYmFzZScsIEVSUk9SUyk7XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNsYXNzIEZpcmViYXNlQXBwSW1wbCB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zLCBjb25maWcsIGNvbnRhaW5lcikge1xyXG4gICAgICAgIHRoaXMuX2lzRGVsZXRlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKTtcclxuICAgICAgICB0aGlzLl9jb25maWcgPSBPYmplY3QuYXNzaWduKHt9LCBjb25maWcpO1xyXG4gICAgICAgIHRoaXMuX25hbWUgPSBjb25maWcubmFtZTtcclxuICAgICAgICB0aGlzLl9hdXRvbWF0aWNEYXRhQ29sbGVjdGlvbkVuYWJsZWQgPVxyXG4gICAgICAgICAgICBjb25maWcuYXV0b21hdGljRGF0YUNvbGxlY3Rpb25FbmFibGVkO1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IGNvbnRhaW5lcjtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDb21wb25lbnQobmV3IENvbXBvbmVudCgnYXBwJywgKCkgPT4gdGhpcywgXCJQVUJMSUNcIiAvKiBQVUJMSUMgKi8pKTtcclxuICAgIH1cclxuICAgIGdldCBhdXRvbWF0aWNEYXRhQ29sbGVjdGlvbkVuYWJsZWQoKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0Rlc3Ryb3llZCgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hdXRvbWF0aWNEYXRhQ29sbGVjdGlvbkVuYWJsZWQ7XHJcbiAgICB9XHJcbiAgICBzZXQgYXV0b21hdGljRGF0YUNvbGxlY3Rpb25FbmFibGVkKHZhbCkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tEZXN0cm95ZWQoKTtcclxuICAgICAgICB0aGlzLl9hdXRvbWF0aWNEYXRhQ29sbGVjdGlvbkVuYWJsZWQgPSB2YWw7XHJcbiAgICB9XHJcbiAgICBnZXQgbmFtZSgpIHtcclxuICAgICAgICB0aGlzLmNoZWNrRGVzdHJveWVkKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX25hbWU7XHJcbiAgICB9XHJcbiAgICBnZXQgb3B0aW9ucygpIHtcclxuICAgICAgICB0aGlzLmNoZWNrRGVzdHJveWVkKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wdGlvbnM7XHJcbiAgICB9XHJcbiAgICBnZXQgY29uZmlnKCkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tEZXN0cm95ZWQoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xyXG4gICAgfVxyXG4gICAgZ2V0IGNvbnRhaW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyO1xyXG4gICAgfVxyXG4gICAgZ2V0IGlzRGVsZXRlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNEZWxldGVkO1xyXG4gICAgfVxyXG4gICAgc2V0IGlzRGVsZXRlZCh2YWwpIHtcclxuICAgICAgICB0aGlzLl9pc0RlbGV0ZWQgPSB2YWw7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCB0aHJvdyBhbiBFcnJvciBpZiB0aGUgQXBwIGhhcyBhbHJlYWR5IGJlZW4gZGVsZXRlZCAtXHJcbiAgICAgKiB1c2UgYmVmb3JlIHBlcmZvcm1pbmcgQVBJIGFjdGlvbnMgb24gdGhlIEFwcC5cclxuICAgICAqL1xyXG4gICAgY2hlY2tEZXN0cm95ZWQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNEZWxldGVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IEVSUk9SX0ZBQ1RPUlkuY3JlYXRlKFwiYXBwLWRlbGV0ZWRcIiAvKiBBUFBfREVMRVRFRCAqLywgeyBhcHBOYW1lOiB0aGlzLl9uYW1lIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogVGhlIGN1cnJlbnQgU0RLIHZlcnNpb24uXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNvbnN0IFNES19WRVJTSU9OID0gdmVyc2lvbjtcclxuZnVuY3Rpb24gaW5pdGlhbGl6ZUFwcChvcHRpb25zLCByYXdDb25maWcgPSB7fSkge1xyXG4gICAgaWYgKHR5cGVvZiByYXdDb25maWcgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IHJhd0NvbmZpZztcclxuICAgICAgICByYXdDb25maWcgPSB7IG5hbWUgfTtcclxuICAgIH1cclxuICAgIGNvbnN0IGNvbmZpZyA9IE9iamVjdC5hc3NpZ24oeyBuYW1lOiBERUZBVUxUX0VOVFJZX05BTUUsIGF1dG9tYXRpY0RhdGFDb2xsZWN0aW9uRW5hYmxlZDogZmFsc2UgfSwgcmF3Q29uZmlnKTtcclxuICAgIGNvbnN0IG5hbWUgPSBjb25maWcubmFtZTtcclxuICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycgfHwgIW5hbWUpIHtcclxuICAgICAgICB0aHJvdyBFUlJPUl9GQUNUT1JZLmNyZWF0ZShcImJhZC1hcHAtbmFtZVwiIC8qIEJBRF9BUFBfTkFNRSAqLywge1xyXG4gICAgICAgICAgICBhcHBOYW1lOiBTdHJpbmcobmFtZSlcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGNvbnN0IGV4aXN0aW5nQXBwID0gX2FwcHMuZ2V0KG5hbWUpO1xyXG4gICAgaWYgKGV4aXN0aW5nQXBwKSB7XHJcbiAgICAgICAgLy8gcmV0dXJuIHRoZSBleGlzdGluZyBhcHAgaWYgb3B0aW9ucyBhbmQgY29uZmlnIGRlZXAgZXF1YWwgdGhlIG9uZXMgaW4gdGhlIGV4aXN0aW5nIGFwcC5cclxuICAgICAgICBpZiAoZGVlcEVxdWFsKG9wdGlvbnMsIGV4aXN0aW5nQXBwLm9wdGlvbnMpICYmXHJcbiAgICAgICAgICAgIGRlZXBFcXVhbChjb25maWcsIGV4aXN0aW5nQXBwLmNvbmZpZykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nQXBwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgRVJST1JfRkFDVE9SWS5jcmVhdGUoXCJkdXBsaWNhdGUtYXBwXCIgLyogRFVQTElDQVRFX0FQUCAqLywgeyBhcHBOYW1lOiBuYW1lIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IGNvbnRhaW5lciA9IG5ldyBDb21wb25lbnRDb250YWluZXIobmFtZSk7XHJcbiAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBfY29tcG9uZW50cy52YWx1ZXMoKSkge1xyXG4gICAgICAgIGNvbnRhaW5lci5hZGRDb21wb25lbnQoY29tcG9uZW50KTtcclxuICAgIH1cclxuICAgIGNvbnN0IG5ld0FwcCA9IG5ldyBGaXJlYmFzZUFwcEltcGwob3B0aW9ucywgY29uZmlnLCBjb250YWluZXIpO1xyXG4gICAgX2FwcHMuc2V0KG5hbWUsIG5ld0FwcCk7XHJcbiAgICByZXR1cm4gbmV3QXBwO1xyXG59XHJcbi8qKlxyXG4gKiBSZXRyaWV2ZXMgYSB7QGxpbmsgQGZpcmViYXNlL2FwcCNGaXJlYmFzZUFwcH0gaW5zdGFuY2UuXHJcbiAqXHJcbiAqIFdoZW4gY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzLCB0aGUgZGVmYXVsdCBhcHAgaXMgcmV0dXJuZWQuIFdoZW4gYW4gYXBwIG5hbWVcclxuICogaXMgcHJvdmlkZWQsIHRoZSBhcHAgY29ycmVzcG9uZGluZyB0byB0aGF0IG5hbWUgaXMgcmV0dXJuZWQuXHJcbiAqXHJcbiAqIEFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGFwcCBiZWluZyByZXRyaWV2ZWQgaGFzIG5vdCB5ZXQgYmVlblxyXG4gKiBpbml0aWFsaXplZC5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiAvLyBSZXR1cm4gdGhlIGRlZmF1bHQgYXBwXHJcbiAqIGNvbnN0IGFwcCA9IGdldEFwcCgpO1xyXG4gKiBgYGBcclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiAvLyBSZXR1cm4gYSBuYW1lZCBhcHBcclxuICogY29uc3Qgb3RoZXJBcHAgPSBnZXRBcHAoXCJvdGhlckFwcFwiKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBwYXJhbSBuYW1lIC0gT3B0aW9uYWwgbmFtZSBvZiB0aGUgYXBwIHRvIHJldHVybi4gSWYgbm8gbmFtZSBpc1xyXG4gKiAgIHByb3ZpZGVkLCB0aGUgZGVmYXVsdCBpcyBgXCJbREVGQVVMVF1cImAuXHJcbiAqXHJcbiAqIEByZXR1cm5zIFRoZSBhcHAgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvdmlkZWQgYXBwIG5hbWUuXHJcbiAqICAgSWYgbm8gYXBwIG5hbWUgaXMgcHJvdmlkZWQsIHRoZSBkZWZhdWx0IGFwcCBpcyByZXR1cm5lZC5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gZ2V0QXBwKG5hbWUgPSBERUZBVUxUX0VOVFJZX05BTUUpIHtcclxuICAgIGNvbnN0IGFwcCA9IF9hcHBzLmdldChuYW1lKTtcclxuICAgIGlmICghYXBwKSB7XHJcbiAgICAgICAgdGhyb3cgRVJST1JfRkFDVE9SWS5jcmVhdGUoXCJuby1hcHBcIiAvKiBOT19BUFAgKi8sIHsgYXBwTmFtZTogbmFtZSB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBhcHA7XHJcbn1cclxuLyoqXHJcbiAqIEEgKHJlYWQtb25seSkgYXJyYXkgb2YgYWxsIGluaXRpYWxpemVkIGFwcHMuXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmZ1bmN0aW9uIGdldEFwcHMoKSB7XHJcbiAgICByZXR1cm4gQXJyYXkuZnJvbShfYXBwcy52YWx1ZXMoKSk7XHJcbn1cclxuLyoqXHJcbiAqIFJlbmRlcnMgdGhpcyBhcHAgdW51c2FibGUgYW5kIGZyZWVzIHRoZSByZXNvdXJjZXMgb2YgYWxsIGFzc29jaWF0ZWRcclxuICogc2VydmljZXMuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogZGVsZXRlQXBwKGFwcClcclxuICogICAudGhlbihmdW5jdGlvbigpIHtcclxuICogICAgIGNvbnNvbGUubG9nKFwiQXBwIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5XCIpO1xyXG4gKiAgIH0pXHJcbiAqICAgLmNhdGNoKGZ1bmN0aW9uKGVycm9yKSB7XHJcbiAqICAgICBjb25zb2xlLmxvZyhcIkVycm9yIGRlbGV0aW5nIGFwcDpcIiwgZXJyb3IpO1xyXG4gKiAgIH0pO1xyXG4gKiBgYGBcclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlQXBwKGFwcCkge1xyXG4gICAgY29uc3QgbmFtZSA9IGFwcC5uYW1lO1xyXG4gICAgaWYgKF9hcHBzLmhhcyhuYW1lKSkge1xyXG4gICAgICAgIF9hcHBzLmRlbGV0ZShuYW1lKTtcclxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChhcHAuY29udGFpbmVyXHJcbiAgICAgICAgICAgIC5nZXRQcm92aWRlcnMoKVxyXG4gICAgICAgICAgICAubWFwKHByb3ZpZGVyID0+IHByb3ZpZGVyLmRlbGV0ZSgpKSk7XHJcbiAgICAgICAgYXBwLmlzRGVsZXRlZCA9IHRydWU7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIFJlZ2lzdGVycyBhIGxpYnJhcnkncyBuYW1lIGFuZCB2ZXJzaW9uIGZvciBwbGF0Zm9ybSBsb2dnaW5nIHB1cnBvc2VzLlxyXG4gKiBAcGFyYW0gbGlicmFyeSAtIE5hbWUgb2YgMXAgb3IgM3AgbGlicmFyeSAoZS5nLiBmaXJlc3RvcmUsIGFuZ3VsYXJmaXJlKVxyXG4gKiBAcGFyYW0gdmVyc2lvbiAtIEN1cnJlbnQgdmVyc2lvbiBvZiB0aGF0IGxpYnJhcnkuXHJcbiAqIEBwYXJhbSB2YXJpYW50IC0gQnVuZGxlIHZhcmlhbnQsIGUuZy4sIG5vZGUsIHJuLCBldGMuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmZ1bmN0aW9uIHJlZ2lzdGVyVmVyc2lvbihsaWJyYXJ5S2V5T3JOYW1lLCB2ZXJzaW9uLCB2YXJpYW50KSB7XHJcbiAgICB2YXIgX2E7XHJcbiAgICAvLyBUT0RPOiBXZSBjYW4gdXNlIHRoaXMgY2hlY2sgdG8gd2hpdGVsaXN0IHN0cmluZ3Mgd2hlbi9pZiB3ZSBzZXQgdXBcclxuICAgIC8vIGEgZ29vZCB3aGl0ZWxpc3Qgc3lzdGVtLlxyXG4gICAgbGV0IGxpYnJhcnkgPSAoX2EgPSBQTEFURk9STV9MT0dfU1RSSU5HW2xpYnJhcnlLZXlPck5hbWVdKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBsaWJyYXJ5S2V5T3JOYW1lO1xyXG4gICAgaWYgKHZhcmlhbnQpIHtcclxuICAgICAgICBsaWJyYXJ5ICs9IGAtJHt2YXJpYW50fWA7XHJcbiAgICB9XHJcbiAgICBjb25zdCBsaWJyYXJ5TWlzbWF0Y2ggPSBsaWJyYXJ5Lm1hdGNoKC9cXHN8XFwvLyk7XHJcbiAgICBjb25zdCB2ZXJzaW9uTWlzbWF0Y2ggPSB2ZXJzaW9uLm1hdGNoKC9cXHN8XFwvLyk7XHJcbiAgICBpZiAobGlicmFyeU1pc21hdGNoIHx8IHZlcnNpb25NaXNtYXRjaCkge1xyXG4gICAgICAgIGNvbnN0IHdhcm5pbmcgPSBbXHJcbiAgICAgICAgICAgIGBVbmFibGUgdG8gcmVnaXN0ZXIgbGlicmFyeSBcIiR7bGlicmFyeX1cIiB3aXRoIHZlcnNpb24gXCIke3ZlcnNpb259XCI6YFxyXG4gICAgICAgIF07XHJcbiAgICAgICAgaWYgKGxpYnJhcnlNaXNtYXRjaCkge1xyXG4gICAgICAgICAgICB3YXJuaW5nLnB1c2goYGxpYnJhcnkgbmFtZSBcIiR7bGlicmFyeX1cIiBjb250YWlucyBpbGxlZ2FsIGNoYXJhY3RlcnMgKHdoaXRlc3BhY2Ugb3IgXCIvXCIpYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChsaWJyYXJ5TWlzbWF0Y2ggJiYgdmVyc2lvbk1pc21hdGNoKSB7XHJcbiAgICAgICAgICAgIHdhcm5pbmcucHVzaCgnYW5kJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2ZXJzaW9uTWlzbWF0Y2gpIHtcclxuICAgICAgICAgICAgd2FybmluZy5wdXNoKGB2ZXJzaW9uIG5hbWUgXCIke3ZlcnNpb259XCIgY29udGFpbnMgaWxsZWdhbCBjaGFyYWN0ZXJzICh3aGl0ZXNwYWNlIG9yIFwiL1wiKWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsb2dnZXIud2Fybih3YXJuaW5nLmpvaW4oJyAnKSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgX3JlZ2lzdGVyQ29tcG9uZW50KG5ldyBDb21wb25lbnQoYCR7bGlicmFyeX0tdmVyc2lvbmAsICgpID0+ICh7IGxpYnJhcnksIHZlcnNpb24gfSksIFwiVkVSU0lPTlwiIC8qIFZFUlNJT04gKi8pKTtcclxufVxyXG4vKipcclxuICogU2V0cyBsb2cgaGFuZGxlciBmb3IgYWxsIEZpcmViYXNlIFNES3MuXHJcbiAqIEBwYXJhbSBsb2dDYWxsYmFjayAtIEFuIG9wdGlvbmFsIGN1c3RvbSBsb2cgaGFuZGxlciB0aGF0IGV4ZWN1dGVzIHVzZXIgY29kZSB3aGVuZXZlclxyXG4gKiB0aGUgRmlyZWJhc2UgU0RLIG1ha2VzIGEgbG9nZ2luZyBjYWxsLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiBvbkxvZyhsb2dDYWxsYmFjaywgb3B0aW9ucykge1xyXG4gICAgaWYgKGxvZ0NhbGxiYWNrICE9PSBudWxsICYmIHR5cGVvZiBsb2dDYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIHRocm93IEVSUk9SX0ZBQ1RPUlkuY3JlYXRlKFwiaW52YWxpZC1sb2ctYXJndW1lbnRcIiAvKiBJTlZBTElEX0xPR19BUkdVTUVOVCAqLyk7XHJcbiAgICB9XHJcbiAgICBzZXRVc2VyTG9nSGFuZGxlcihsb2dDYWxsYmFjaywgb3B0aW9ucyk7XHJcbn1cclxuLyoqXHJcbiAqIFNldHMgbG9nIGxldmVsIGZvciBhbGwgRmlyZWJhc2UgU0RLcy5cclxuICpcclxuICogQWxsIG9mIHRoZSBsb2cgdHlwZXMgYWJvdmUgdGhlIGN1cnJlbnQgbG9nIGxldmVsIGFyZSBjYXB0dXJlZCAoaS5lLiBpZlxyXG4gKiB5b3Ugc2V0IHRoZSBsb2cgbGV2ZWwgdG8gYGluZm9gLCBlcnJvcnMgYXJlIGxvZ2dlZCwgYnV0IGBkZWJ1Z2AgYW5kXHJcbiAqIGB2ZXJib3NlYCBsb2dzIGFyZSBub3QpLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiBzZXRMb2dMZXZlbChsb2dMZXZlbCkge1xyXG4gICAgc2V0TG9nTGV2ZWwkMShsb2dMZXZlbCk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgREJfTkFNRSA9ICdmaXJlYmFzZS1oZWFydGJlYXQtZGF0YWJhc2UnO1xyXG5jb25zdCBEQl9WRVJTSU9OID0gMTtcclxuY29uc3QgU1RPUkVfTkFNRSA9ICdmaXJlYmFzZS1oZWFydGJlYXQtc3RvcmUnO1xyXG5sZXQgZGJQcm9taXNlID0gbnVsbDtcclxuZnVuY3Rpb24gZ2V0RGJQcm9taXNlKCkge1xyXG4gICAgaWYgKCFkYlByb21pc2UpIHtcclxuICAgICAgICBkYlByb21pc2UgPSBvcGVuREIoREJfTkFNRSwgREJfVkVSU0lPTiwgKGRiLCBvbGRWZXJzaW9uKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIFdlIGRvbid0IHVzZSAnYnJlYWsnIGluIHRoaXMgc3dpdGNoIHN0YXRlbWVudCwgdGhlIGZhbGwtdGhyb3VnaFxyXG4gICAgICAgICAgICAvLyBiZWhhdmlvciBpcyB3aGF0IHdlIHdhbnQsIGJlY2F1c2UgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHZlcnNpb25zIGJldHdlZW5cclxuICAgICAgICAgICAgLy8gdGhlIG9sZCB2ZXJzaW9uIGFuZCB0aGUgY3VycmVudCB2ZXJzaW9uLCB3ZSB3YW50IEFMTCB0aGUgbWlncmF0aW9uc1xyXG4gICAgICAgICAgICAvLyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhvc2UgdmVyc2lvbnMgdG8gcnVuLCBub3Qgb25seSB0aGUgbGFzdCBvbmUuXHJcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZWZhdWx0LWNhc2VcclxuICAgICAgICAgICAgc3dpdGNoIChvbGRWZXJzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICAgICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoU1RPUkVfTkFNRSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KS5jYXRjaChlID0+IHtcclxuICAgICAgICAgICAgdGhyb3cgRVJST1JfRkFDVE9SWS5jcmVhdGUoXCJzdG9yYWdlLW9wZW5cIiAvKiBTVE9SQUdFX09QRU4gKi8sIHtcclxuICAgICAgICAgICAgICAgIG9yaWdpbmFsRXJyb3JNZXNzYWdlOiBlLm1lc3NhZ2VcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGJQcm9taXNlO1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIHJlYWRIZWFydGJlYXRzRnJvbUluZGV4ZWREQihhcHApIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgZGIgPSBhd2FpdCBnZXREYlByb21pc2UoKTtcclxuICAgICAgICByZXR1cm4gZGJcclxuICAgICAgICAgICAgLnRyYW5zYWN0aW9uKFNUT1JFX05BTUUpXHJcbiAgICAgICAgICAgIC5vYmplY3RTdG9yZShTVE9SRV9OQU1FKVxyXG4gICAgICAgICAgICAuZ2V0KGNvbXB1dGVLZXkoYXBwKSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgIHRocm93IEVSUk9SX0ZBQ1RPUlkuY3JlYXRlKFwic3RvcmFnZS1nZXRcIiAvKiBTVE9SQUdFX0dFVCAqLywge1xyXG4gICAgICAgICAgICBvcmlnaW5hbEVycm9yTWVzc2FnZTogZS5tZXNzYWdlXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gd3JpdGVIZWFydGJlYXRzVG9JbmRleGVkREIoYXBwLCBoZWFydGJlYXRPYmplY3QpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgZGIgPSBhd2FpdCBnZXREYlByb21pc2UoKTtcclxuICAgICAgICBjb25zdCB0eCA9IGRiLnRyYW5zYWN0aW9uKFNUT1JFX05BTUUsICdyZWFkd3JpdGUnKTtcclxuICAgICAgICBjb25zdCBvYmplY3RTdG9yZSA9IHR4Lm9iamVjdFN0b3JlKFNUT1JFX05BTUUpO1xyXG4gICAgICAgIGF3YWl0IG9iamVjdFN0b3JlLnB1dChoZWFydGJlYXRPYmplY3QsIGNvbXB1dGVLZXkoYXBwKSk7XHJcbiAgICAgICAgcmV0dXJuIHR4LmNvbXBsZXRlO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICB0aHJvdyBFUlJPUl9GQUNUT1JZLmNyZWF0ZShcInN0b3JhZ2Utc2V0XCIgLyogU1RPUkFHRV9XUklURSAqLywge1xyXG4gICAgICAgICAgICBvcmlnaW5hbEVycm9yTWVzc2FnZTogZS5tZXNzYWdlXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gY29tcHV0ZUtleShhcHApIHtcclxuICAgIHJldHVybiBgJHthcHAubmFtZX0hJHthcHAub3B0aW9ucy5hcHBJZH1gO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IE1BWF9IRUFERVJfQllURVMgPSAxMDI0O1xyXG4vLyAzMCBkYXlzXHJcbmNvbnN0IFNUT1JFRF9IRUFSVEJFQVRfUkVURU5USU9OX01BWF9NSUxMSVMgPSAzMCAqIDI0ICogNjAgKiA2MCAqIDEwMDA7XHJcbmNsYXNzIEhlYXJ0YmVhdFNlcnZpY2VJbXBsIHtcclxuICAgIGNvbnN0cnVjdG9yKGNvbnRhaW5lcikge1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEluLW1lbW9yeSBjYWNoZSBmb3IgaGVhcnRiZWF0cywgdXNlZCBieSBnZXRIZWFydGJlYXRzSGVhZGVyKCkgdG8gZ2VuZXJhdGVcclxuICAgICAgICAgKiB0aGUgaGVhZGVyIHN0cmluZy5cclxuICAgICAgICAgKiBTdG9yZXMgb25lIHJlY29yZCBwZXIgZGF0ZS4gVGhpcyB3aWxsIGJlIGNvbnNvbGlkYXRlZCBpbnRvIHRoZSBzdGFuZGFyZFxyXG4gICAgICAgICAqIGZvcm1hdCBvZiBvbmUgcmVjb3JkIHBlciB1c2VyIGFnZW50IHN0cmluZyBiZWZvcmUgYmVpbmcgc2VudCBhcyBhIGhlYWRlci5cclxuICAgICAgICAgKiBQb3B1bGF0ZWQgZnJvbSBpbmRleGVkREIgd2hlbiB0aGUgY29udHJvbGxlciBpcyBpbnN0YW50aWF0ZWQgYW5kIHNob3VsZFxyXG4gICAgICAgICAqIGJlIGtlcHQgaW4gc3luYyB3aXRoIGluZGV4ZWREQi5cclxuICAgICAgICAgKiBMZWF2ZSBwdWJsaWMgZm9yIGVhc2llciB0ZXN0aW5nLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2hlYXJ0YmVhdHNDYWNoZSA9IG51bGw7XHJcbiAgICAgICAgY29uc3QgYXBwID0gdGhpcy5jb250YWluZXIuZ2V0UHJvdmlkZXIoJ2FwcCcpLmdldEltbWVkaWF0ZSgpO1xyXG4gICAgICAgIHRoaXMuX3N0b3JhZ2UgPSBuZXcgSGVhcnRiZWF0U3RvcmFnZUltcGwoYXBwKTtcclxuICAgICAgICB0aGlzLl9oZWFydGJlYXRzQ2FjaGVQcm9taXNlID0gdGhpcy5fc3RvcmFnZS5yZWFkKCkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9oZWFydGJlYXRzQ2FjaGUgPSByZXN1bHQ7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCB0byByZXBvcnQgYSBoZWFydGJlYXQuIFRoZSBmdW5jdGlvbiB3aWxsIGdlbmVyYXRlXHJcbiAgICAgKiBhIEhlYXJ0YmVhdHNCeVVzZXJBZ2VudCBvYmplY3QsIHVwZGF0ZSBoZWFydGJlYXRzQ2FjaGUsIGFuZCBwZXJzaXN0IGl0XHJcbiAgICAgKiB0byBJbmRleGVkREIuXHJcbiAgICAgKiBOb3RlIHRoYXQgd2Ugb25seSBzdG9yZSBvbmUgaGVhcnRiZWF0IHBlciBkYXkuIFNvIGlmIGEgaGVhcnRiZWF0IGZvciB0b2RheSBpc1xyXG4gICAgICogYWxyZWFkeSBsb2dnZWQsIHN1YnNlcXVlbnQgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbiBpbiB0aGUgc2FtZSBkYXkgd2lsbCBiZSBpZ25vcmVkLlxyXG4gICAgICovXHJcbiAgICBhc3luYyB0cmlnZ2VySGVhcnRiZWF0KCkge1xyXG4gICAgICAgIGNvbnN0IHBsYXRmb3JtTG9nZ2VyID0gdGhpcy5jb250YWluZXJcclxuICAgICAgICAgICAgLmdldFByb3ZpZGVyKCdwbGF0Zm9ybS1sb2dnZXInKVxyXG4gICAgICAgICAgICAuZ2V0SW1tZWRpYXRlKCk7XHJcbiAgICAgICAgLy8gVGhpcyBpcyB0aGUgXCJGaXJlYmFzZSB1c2VyIGFnZW50XCIgc3RyaW5nIGZyb20gdGhlIHBsYXRmb3JtIGxvZ2dlclxyXG4gICAgICAgIC8vIHNlcnZpY2UsIG5vdCB0aGUgYnJvd3NlciB1c2VyIGFnZW50LlxyXG4gICAgICAgIGNvbnN0IGFnZW50ID0gcGxhdGZvcm1Mb2dnZXIuZ2V0UGxhdGZvcm1JbmZvU3RyaW5nKCk7XHJcbiAgICAgICAgY29uc3QgZGF0ZSA9IGdldFVUQ0RhdGVTdHJpbmcoKTtcclxuICAgICAgICBpZiAodGhpcy5faGVhcnRiZWF0c0NhY2hlID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2hlYXJ0YmVhdHNDYWNoZSA9IGF3YWl0IHRoaXMuX2hlYXJ0YmVhdHNDYWNoZVByb21pc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIERvIG5vdCBzdG9yZSBhIGhlYXJ0YmVhdCBpZiBvbmUgaXMgYWxyZWFkeSBzdG9yZWQgZm9yIHRoaXMgZGF5XHJcbiAgICAgICAgLy8gb3IgaWYgYSBoZWFkZXIgaGFzIGFscmVhZHkgYmVlbiBzZW50IHRvZGF5LlxyXG4gICAgICAgIGlmICh0aGlzLl9oZWFydGJlYXRzQ2FjaGUubGFzdFNlbnRIZWFydGJlYXREYXRlID09PSBkYXRlIHx8XHJcbiAgICAgICAgICAgIHRoaXMuX2hlYXJ0YmVhdHNDYWNoZS5oZWFydGJlYXRzLnNvbWUoc2luZ2xlRGF0ZUhlYXJ0YmVhdCA9PiBzaW5nbGVEYXRlSGVhcnRiZWF0LmRhdGUgPT09IGRhdGUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIGVudHJ5IGZvciB0aGlzIGRhdGUuIENyZWF0ZSBvbmUuXHJcbiAgICAgICAgICAgIHRoaXMuX2hlYXJ0YmVhdHNDYWNoZS5oZWFydGJlYXRzLnB1c2goeyBkYXRlLCBhZ2VudCB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUmVtb3ZlIGVudHJpZXMgb2xkZXIgdGhhbiAzMCBkYXlzLlxyXG4gICAgICAgIHRoaXMuX2hlYXJ0YmVhdHNDYWNoZS5oZWFydGJlYXRzID0gdGhpcy5faGVhcnRiZWF0c0NhY2hlLmhlYXJ0YmVhdHMuZmlsdGVyKHNpbmdsZURhdGVIZWFydGJlYXQgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBoYlRpbWVzdGFtcCA9IG5ldyBEYXRlKHNpbmdsZURhdGVIZWFydGJlYXQuZGF0ZSkudmFsdWVPZigpO1xyXG4gICAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gbm93IC0gaGJUaW1lc3RhbXAgPD0gU1RPUkVEX0hFQVJUQkVBVF9SRVRFTlRJT05fTUFYX01JTExJUztcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc3RvcmFnZS5vdmVyd3JpdGUodGhpcy5faGVhcnRiZWF0c0NhY2hlKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGJhc2U2NCBlbmNvZGVkIHN0cmluZyB3aGljaCBjYW4gYmUgYXR0YWNoZWQgdG8gdGhlIGhlYXJ0YmVhdC1zcGVjaWZpYyBoZWFkZXIgZGlyZWN0bHkuXHJcbiAgICAgKiBJdCBhbHNvIGNsZWFycyBhbGwgaGVhcnRiZWF0cyBmcm9tIG1lbW9yeSBhcyB3ZWxsIGFzIGluIEluZGV4ZWREQi5cclxuICAgICAqXHJcbiAgICAgKiBOT1RFOiBDb25zdW1pbmcgcHJvZHVjdCBTREtzIHNob3VsZCBub3Qgc2VuZCB0aGUgaGVhZGVyIGlmIHRoaXMgbWV0aG9kXHJcbiAgICAgKiByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgZ2V0SGVhcnRiZWF0c0hlYWRlcigpIHtcclxuICAgICAgICBpZiAodGhpcy5faGVhcnRiZWF0c0NhY2hlID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2hlYXJ0YmVhdHNDYWNoZVByb21pc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIElmIGl0J3Mgc3RpbGwgbnVsbCBvciB0aGUgYXJyYXkgaXMgZW1wdHksIHRoZXJlIGlzIG5vIGRhdGEgdG8gc2VuZC5cclxuICAgICAgICBpZiAodGhpcy5faGVhcnRiZWF0c0NhY2hlID09PSBudWxsIHx8XHJcbiAgICAgICAgICAgIHRoaXMuX2hlYXJ0YmVhdHNDYWNoZS5oZWFydGJlYXRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGRhdGUgPSBnZXRVVENEYXRlU3RyaW5nKCk7XHJcbiAgICAgICAgLy8gRXh0cmFjdCBhcyBtYW55IGhlYXJ0YmVhdHMgZnJvbSB0aGUgY2FjaGUgYXMgd2lsbCBmaXQgdW5kZXIgdGhlIHNpemUgbGltaXQuXHJcbiAgICAgICAgY29uc3QgeyBoZWFydGJlYXRzVG9TZW5kLCB1bnNlbnRFbnRyaWVzIH0gPSBleHRyYWN0SGVhcnRiZWF0c0ZvckhlYWRlcih0aGlzLl9oZWFydGJlYXRzQ2FjaGUuaGVhcnRiZWF0cyk7XHJcbiAgICAgICAgY29uc3QgaGVhZGVyU3RyaW5nID0gYmFzZTY0dXJsRW5jb2RlV2l0aG91dFBhZGRpbmcoSlNPTi5zdHJpbmdpZnkoeyB2ZXJzaW9uOiAyLCBoZWFydGJlYXRzOiBoZWFydGJlYXRzVG9TZW5kIH0pKTtcclxuICAgICAgICAvLyBTdG9yZSBsYXN0IHNlbnQgZGF0ZSB0byBwcmV2ZW50IGFub3RoZXIgYmVpbmcgbG9nZ2VkL3NlbnQgZm9yIHRoZSBzYW1lIGRheS5cclxuICAgICAgICB0aGlzLl9oZWFydGJlYXRzQ2FjaGUubGFzdFNlbnRIZWFydGJlYXREYXRlID0gZGF0ZTtcclxuICAgICAgICBpZiAodW5zZW50RW50cmllcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIC8vIFN0b3JlIGFueSB1bnNlbnQgZW50cmllcyBpZiB0aGV5IGV4aXN0LlxyXG4gICAgICAgICAgICB0aGlzLl9oZWFydGJlYXRzQ2FjaGUuaGVhcnRiZWF0cyA9IHVuc2VudEVudHJpZXM7XHJcbiAgICAgICAgICAgIC8vIFRoaXMgc2VlbXMgbW9yZSBsaWtlbHkgdGhhbiBlbXB0eWluZyB0aGUgYXJyYXkgKGJlbG93KSB0byBsZWFkIHRvIHNvbWUgb2RkIHN0YXRlXHJcbiAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBjYWNoZSBpc24ndCBlbXB0eSBhbmQgdGhpcyB3aWxsIGJlIGNhbGxlZCBhZ2FpbiBvbiB0aGUgbmV4dCByZXF1ZXN0LFxyXG4gICAgICAgICAgICAvLyBhbmQgaXMgcHJvYmFibHkgc2FmZXN0IGlmIHdlIGF3YWl0IGl0LlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9zdG9yYWdlLm92ZXJ3cml0ZSh0aGlzLl9oZWFydGJlYXRzQ2FjaGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5faGVhcnRiZWF0c0NhY2hlLmhlYXJ0YmVhdHMgPSBbXTtcclxuICAgICAgICAgICAgLy8gRG8gbm90IHdhaXQgZm9yIHRoaXMsIHRvIHJlZHVjZSBsYXRlbmN5LlxyXG4gICAgICAgICAgICB2b2lkIHRoaXMuX3N0b3JhZ2Uub3ZlcndyaXRlKHRoaXMuX2hlYXJ0YmVhdHNDYWNoZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBoZWFkZXJTdHJpbmc7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gZ2V0VVRDRGF0ZVN0cmluZygpIHtcclxuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcclxuICAgIC8vIFJldHVybnMgZGF0ZSBmb3JtYXQgJ1lZWVktTU0tREQnXHJcbiAgICByZXR1cm4gdG9kYXkudG9JU09TdHJpbmcoKS5zdWJzdHJpbmcoMCwgMTApO1xyXG59XHJcbmZ1bmN0aW9uIGV4dHJhY3RIZWFydGJlYXRzRm9ySGVhZGVyKGhlYXJ0YmVhdHNDYWNoZSwgbWF4U2l6ZSA9IE1BWF9IRUFERVJfQllURVMpIHtcclxuICAgIC8vIEhlYXJ0YmVhdHMgZ3JvdXBlZCBieSB1c2VyIGFnZW50IGluIHRoZSBzdGFuZGFyZCBmb3JtYXQgdG8gYmUgc2VudCBpblxyXG4gICAgLy8gdGhlIGhlYWRlci5cclxuICAgIGNvbnN0IGhlYXJ0YmVhdHNUb1NlbmQgPSBbXTtcclxuICAgIC8vIFNpbmdsZSBkYXRlIGZvcm1hdCBoZWFydGJlYXRzIHRoYXQgYXJlIG5vdCBzZW50LlxyXG4gICAgbGV0IHVuc2VudEVudHJpZXMgPSBoZWFydGJlYXRzQ2FjaGUuc2xpY2UoKTtcclxuICAgIGZvciAoY29uc3Qgc2luZ2xlRGF0ZUhlYXJ0YmVhdCBvZiBoZWFydGJlYXRzQ2FjaGUpIHtcclxuICAgICAgICAvLyBMb29rIGZvciBhbiBleGlzdGluZyBlbnRyeSB3aXRoIHRoZSBzYW1lIHVzZXIgYWdlbnQuXHJcbiAgICAgICAgY29uc3QgaGVhcnRiZWF0RW50cnkgPSBoZWFydGJlYXRzVG9TZW5kLmZpbmQoaGIgPT4gaGIuYWdlbnQgPT09IHNpbmdsZURhdGVIZWFydGJlYXQuYWdlbnQpO1xyXG4gICAgICAgIGlmICghaGVhcnRiZWF0RW50cnkpIHtcclxuICAgICAgICAgICAgLy8gSWYgbm8gZW50cnkgZm9yIHRoaXMgdXNlciBhZ2VudCBleGlzdHMsIGNyZWF0ZSBvbmUuXHJcbiAgICAgICAgICAgIGhlYXJ0YmVhdHNUb1NlbmQucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBhZ2VudDogc2luZ2xlRGF0ZUhlYXJ0YmVhdC5hZ2VudCxcclxuICAgICAgICAgICAgICAgIGRhdGVzOiBbc2luZ2xlRGF0ZUhlYXJ0YmVhdC5kYXRlXVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYgKGNvdW50Qnl0ZXMoaGVhcnRiZWF0c1RvU2VuZCkgPiBtYXhTaXplKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgaGVhZGVyIHdvdWxkIGV4Y2VlZCBtYXggc2l6ZSwgcmVtb3ZlIHRoZSBhZGRlZCBoZWFydGJlYXRcclxuICAgICAgICAgICAgICAgIC8vIGVudHJ5IGFuZCBzdG9wIGFkZGluZyB0byB0aGUgaGVhZGVyLlxyXG4gICAgICAgICAgICAgICAgaGVhcnRiZWF0c1RvU2VuZC5wb3AoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBoZWFydGJlYXRFbnRyeS5kYXRlcy5wdXNoKHNpbmdsZURhdGVIZWFydGJlYXQuZGF0ZSk7XHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBoZWFkZXIgd291bGQgZXhjZWVkIG1heCBzaXplLCByZW1vdmUgdGhlIGFkZGVkIGRhdGVcclxuICAgICAgICAgICAgLy8gYW5kIHN0b3AgYWRkaW5nIHRvIHRoZSBoZWFkZXIuXHJcbiAgICAgICAgICAgIGlmIChjb3VudEJ5dGVzKGhlYXJ0YmVhdHNUb1NlbmQpID4gbWF4U2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgaGVhcnRiZWF0RW50cnkuZGF0ZXMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBQb3AgdW5zZW50IGVudHJ5IGZyb20gcXVldWUuIChTa2lwcGVkIGlmIGFkZGluZyB0aGUgZW50cnkgZXhjZWVkZWRcclxuICAgICAgICAvLyBxdW90YSBhbmQgdGhlIGxvb3AgYnJlYWtzIGVhcmx5LilcclxuICAgICAgICB1bnNlbnRFbnRyaWVzID0gdW5zZW50RW50cmllcy5zbGljZSgxKTtcclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgaGVhcnRiZWF0c1RvU2VuZCxcclxuICAgICAgICB1bnNlbnRFbnRyaWVzXHJcbiAgICB9O1xyXG59XHJcbmNsYXNzIEhlYXJ0YmVhdFN0b3JhZ2VJbXBsIHtcclxuICAgIGNvbnN0cnVjdG9yKGFwcCkge1xyXG4gICAgICAgIHRoaXMuYXBwID0gYXBwO1xyXG4gICAgICAgIHRoaXMuX2NhblVzZUluZGV4ZWREQlByb21pc2UgPSB0aGlzLnJ1bkluZGV4ZWREQkVudmlyb25tZW50Q2hlY2soKTtcclxuICAgIH1cclxuICAgIGFzeW5jIHJ1bkluZGV4ZWREQkVudmlyb25tZW50Q2hlY2soKSB7XHJcbiAgICAgICAgaWYgKCFpc0luZGV4ZWREQkF2YWlsYWJsZSgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZUluZGV4ZWREQk9wZW5hYmxlKClcclxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRydWUpXHJcbiAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4gZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVhZCBhbGwgaGVhcnRiZWF0cy5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgcmVhZCgpIHtcclxuICAgICAgICBjb25zdCBjYW5Vc2VJbmRleGVkREIgPSBhd2FpdCB0aGlzLl9jYW5Vc2VJbmRleGVkREJQcm9taXNlO1xyXG4gICAgICAgIGlmICghY2FuVXNlSW5kZXhlZERCKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7IGhlYXJ0YmVhdHM6IFtdIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBpZGJIZWFydGJlYXRPYmplY3QgPSBhd2FpdCByZWFkSGVhcnRiZWF0c0Zyb21JbmRleGVkREIodGhpcy5hcHApO1xyXG4gICAgICAgICAgICByZXR1cm4gaWRiSGVhcnRiZWF0T2JqZWN0IHx8IHsgaGVhcnRiZWF0czogW10gfTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBvdmVyd3JpdGUgdGhlIHN0b3JhZ2Ugd2l0aCB0aGUgcHJvdmlkZWQgaGVhcnRiZWF0c1xyXG4gICAgYXN5bmMgb3ZlcndyaXRlKGhlYXJ0YmVhdHNPYmplY3QpIHtcclxuICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgY29uc3QgY2FuVXNlSW5kZXhlZERCID0gYXdhaXQgdGhpcy5fY2FuVXNlSW5kZXhlZERCUHJvbWlzZTtcclxuICAgICAgICBpZiAoIWNhblVzZUluZGV4ZWREQikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ0hlYXJ0YmVhdHNPYmplY3QgPSBhd2FpdCB0aGlzLnJlYWQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHdyaXRlSGVhcnRiZWF0c1RvSW5kZXhlZERCKHRoaXMuYXBwLCB7XHJcbiAgICAgICAgICAgICAgICBsYXN0U2VudEhlYXJ0YmVhdERhdGU6IChfYSA9IGhlYXJ0YmVhdHNPYmplY3QubGFzdFNlbnRIZWFydGJlYXREYXRlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBleGlzdGluZ0hlYXJ0YmVhdHNPYmplY3QubGFzdFNlbnRIZWFydGJlYXREYXRlLFxyXG4gICAgICAgICAgICAgICAgaGVhcnRiZWF0czogaGVhcnRiZWF0c09iamVjdC5oZWFydGJlYXRzXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGFkZCBoZWFydGJlYXRzXHJcbiAgICBhc3luYyBhZGQoaGVhcnRiZWF0c09iamVjdCkge1xyXG4gICAgICAgIHZhciBfYTtcclxuICAgICAgICBjb25zdCBjYW5Vc2VJbmRleGVkREIgPSBhd2FpdCB0aGlzLl9jYW5Vc2VJbmRleGVkREJQcm9taXNlO1xyXG4gICAgICAgIGlmICghY2FuVXNlSW5kZXhlZERCKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSGVhcnRiZWF0c09iamVjdCA9IGF3YWl0IHRoaXMucmVhZCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gd3JpdGVIZWFydGJlYXRzVG9JbmRleGVkREIodGhpcy5hcHAsIHtcclxuICAgICAgICAgICAgICAgIGxhc3RTZW50SGVhcnRiZWF0RGF0ZTogKF9hID0gaGVhcnRiZWF0c09iamVjdC5sYXN0U2VudEhlYXJ0YmVhdERhdGUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGV4aXN0aW5nSGVhcnRiZWF0c09iamVjdC5sYXN0U2VudEhlYXJ0YmVhdERhdGUsXHJcbiAgICAgICAgICAgICAgICBoZWFydGJlYXRzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgLi4uZXhpc3RpbmdIZWFydGJlYXRzT2JqZWN0LmhlYXJ0YmVhdHMsXHJcbiAgICAgICAgICAgICAgICAgICAgLi4uaGVhcnRiZWF0c09iamVjdC5oZWFydGJlYXRzXHJcbiAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4vKipcclxuICogQ2FsY3VsYXRlIGJ5dGVzIG9mIGEgSGVhcnRiZWF0c0J5VXNlckFnZW50IGFycmF5IGFmdGVyIGJlaW5nIHdyYXBwZWRcclxuICogaW4gYSBwbGF0Zm9ybSBsb2dnaW5nIGhlYWRlciBKU09OIG9iamVjdCwgc3RyaW5naWZpZWQsIGFuZCBjb252ZXJ0ZWRcclxuICogdG8gYmFzZSA2NC5cclxuICovXHJcbmZ1bmN0aW9uIGNvdW50Qnl0ZXMoaGVhcnRiZWF0c0NhY2hlKSB7XHJcbiAgICAvLyBiYXNlNjQgaGFzIGEgcmVzdHJpY3RlZCBzZXQgb2YgY2hhcmFjdGVycywgYWxsIG9mIHdoaWNoIHNob3VsZCBiZSAxIGJ5dGUuXHJcbiAgICByZXR1cm4gYmFzZTY0dXJsRW5jb2RlV2l0aG91dFBhZGRpbmcoXHJcbiAgICAvLyBoZWFydGJlYXRzQ2FjaGUgd3JhcHBlciBwcm9wZXJ0aWVzXHJcbiAgICBKU09OLnN0cmluZ2lmeSh7IHZlcnNpb246IDIsIGhlYXJ0YmVhdHM6IGhlYXJ0YmVhdHNDYWNoZSB9KSkubGVuZ3RoO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIHJlZ2lzdGVyQ29yZUNvbXBvbmVudHModmFyaWFudCkge1xyXG4gICAgX3JlZ2lzdGVyQ29tcG9uZW50KG5ldyBDb21wb25lbnQoJ3BsYXRmb3JtLWxvZ2dlcicsIGNvbnRhaW5lciA9PiBuZXcgUGxhdGZvcm1Mb2dnZXJTZXJ2aWNlSW1wbChjb250YWluZXIpLCBcIlBSSVZBVEVcIiAvKiBQUklWQVRFICovKSk7XHJcbiAgICBfcmVnaXN0ZXJDb21wb25lbnQobmV3IENvbXBvbmVudCgnaGVhcnRiZWF0JywgY29udGFpbmVyID0+IG5ldyBIZWFydGJlYXRTZXJ2aWNlSW1wbChjb250YWluZXIpLCBcIlBSSVZBVEVcIiAvKiBQUklWQVRFICovKSk7XHJcbiAgICAvLyBSZWdpc3RlciBgYXBwYCBwYWNrYWdlLlxyXG4gICAgcmVnaXN0ZXJWZXJzaW9uKG5hbWUkbywgdmVyc2lvbiQxLCB2YXJpYW50KTtcclxuICAgIC8vIEJVSUxEX1RBUkdFVCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHZhbHVlcyBsaWtlIGVzbTUsIGVzbTIwMTcsIGNqczUsIGV0YyBkdXJpbmcgdGhlIGNvbXBpbGF0aW9uXHJcbiAgICByZWdpc3RlclZlcnNpb24obmFtZSRvLCB2ZXJzaW9uJDEsICdlc20yMDE3Jyk7XHJcbiAgICAvLyBSZWdpc3RlciBwbGF0Zm9ybSBTREsgaWRlbnRpZmllciAobm8gdmVyc2lvbikuXHJcbiAgICByZWdpc3RlclZlcnNpb24oJ2ZpcmUtanMnLCAnJyk7XHJcbn1cblxuLyoqXHJcbiAqIEZpcmViYXNlIEFwcFxyXG4gKlxyXG4gKiBAcmVtYXJrcyBUaGlzIHBhY2thZ2UgY29vcmRpbmF0ZXMgdGhlIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgZGlmZmVyZW50IEZpcmViYXNlIGNvbXBvbmVudHNcclxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXHJcbiAqL1xyXG5yZWdpc3RlckNvcmVDb21wb25lbnRzKCcnKTtcblxuZXhwb3J0IHsgU0RLX1ZFUlNJT04sIERFRkFVTFRfRU5UUllfTkFNRSBhcyBfREVGQVVMVF9FTlRSWV9OQU1FLCBfYWRkQ29tcG9uZW50LCBfYWRkT3JPdmVyd3JpdGVDb21wb25lbnQsIF9hcHBzLCBfY2xlYXJDb21wb25lbnRzLCBfY29tcG9uZW50cywgX2dldFByb3ZpZGVyLCBfcmVnaXN0ZXJDb21wb25lbnQsIF9yZW1vdmVTZXJ2aWNlSW5zdGFuY2UsIGRlbGV0ZUFwcCwgZ2V0QXBwLCBnZXRBcHBzLCBpbml0aWFsaXplQXBwLCBvbkxvZywgcmVnaXN0ZXJWZXJzaW9uLCBzZXRMb2dMZXZlbCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguZXNtMjAxNy5qcy5tYXBcbiIsImltcG9ydCB7IERlZmVycmVkIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuXG4vKipcclxuICogQ29tcG9uZW50IGZvciBzZXJ2aWNlIG5hbWUgVCwgZS5nLiBgYXV0aGAsIGBhdXRoLWludGVybmFsYFxyXG4gKi9cclxuY2xhc3MgQ29tcG9uZW50IHtcclxuICAgIC8qKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBwdWJsaWMgc2VydmljZSBuYW1lLCBlLmcuIGFwcCwgYXV0aCwgZmlyZXN0b3JlLCBkYXRhYmFzZVxyXG4gICAgICogQHBhcmFtIGluc3RhbmNlRmFjdG9yeSBTZXJ2aWNlIGZhY3RvcnkgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSBwdWJsaWMgaW50ZXJmYWNlXHJcbiAgICAgKiBAcGFyYW0gdHlwZSB3aGV0aGVyIHRoZSBzZXJ2aWNlIHByb3ZpZGVkIGJ5IHRoZSBjb21wb25lbnQgaXMgcHVibGljIG9yIHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IobmFtZSwgaW5zdGFuY2VGYWN0b3J5LCB0eXBlKSB7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcclxuICAgICAgICB0aGlzLmluc3RhbmNlRmFjdG9yeSA9IGluc3RhbmNlRmFjdG9yeTtcclxuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xyXG4gICAgICAgIHRoaXMubXVsdGlwbGVJbnN0YW5jZXMgPSBmYWxzZTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBQcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIHRoZSBzZXJ2aWNlIG5hbWVzcGFjZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2VydmljZVByb3BzID0ge307XHJcbiAgICAgICAgdGhpcy5pbnN0YW50aWF0aW9uTW9kZSA9IFwiTEFaWVwiIC8qIExBWlkgKi87XHJcbiAgICAgICAgdGhpcy5vbkluc3RhbmNlQ3JlYXRlZCA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBzZXRJbnN0YW50aWF0aW9uTW9kZShtb2RlKSB7XHJcbiAgICAgICAgdGhpcy5pbnN0YW50aWF0aW9uTW9kZSA9IG1vZGU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICBzZXRNdWx0aXBsZUluc3RhbmNlcyhtdWx0aXBsZUluc3RhbmNlcykge1xyXG4gICAgICAgIHRoaXMubXVsdGlwbGVJbnN0YW5jZXMgPSBtdWx0aXBsZUluc3RhbmNlcztcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIHNldFNlcnZpY2VQcm9wcyhwcm9wcykge1xyXG4gICAgICAgIHRoaXMuc2VydmljZVByb3BzID0gcHJvcHM7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICBzZXRJbnN0YW5jZUNyZWF0ZWRDYWxsYmFjayhjYWxsYmFjaykge1xyXG4gICAgICAgIHRoaXMub25JbnN0YW5jZUNyZWF0ZWQgPSBjYWxsYmFjaztcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBERUZBVUxUX0VOVFJZX05BTUUgPSAnW0RFRkFVTFRdJztcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFByb3ZpZGVyIGZvciBpbnN0YW5jZSBmb3Igc2VydmljZSBuYW1lIFQsIGUuZy4gJ2F1dGgnLCAnYXV0aC1pbnRlcm5hbCdcclxuICogTmFtZVNlcnZpY2VNYXBwaW5nW1RdIGlzIGFuIGFsaWFzIGZvciB0aGUgdHlwZSBvZiB0aGUgaW5zdGFuY2VcclxuICovXHJcbmNsYXNzIFByb3ZpZGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKG5hbWUsIGNvbnRhaW5lcikge1xyXG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XHJcbiAgICAgICAgdGhpcy5jb21wb25lbnQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuaW5zdGFuY2VzID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIHRoaXMuaW5zdGFuY2VzRGVmZXJyZWQgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgdGhpcy5pbnN0YW5jZXNPcHRpb25zID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIHRoaXMub25Jbml0Q2FsbGJhY2tzID0gbmV3IE1hcCgpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0gaWRlbnRpZmllciBBIHByb3ZpZGVyIGNhbiBwcm92aWRlIG11bGl0cGxlIGluc3RhbmNlcyBvZiBhIHNlcnZpY2VcclxuICAgICAqIGlmIHRoaXMuY29tcG9uZW50Lm11bHRpcGxlSW5zdGFuY2VzIGlzIHRydWUuXHJcbiAgICAgKi9cclxuICAgIGdldChpZGVudGlmaWVyKSB7XHJcbiAgICAgICAgLy8gaWYgbXVsdGlwbGVJbnN0YW5jZXMgaXMgbm90IHN1cHBvcnRlZCwgdXNlIHRoZSBkZWZhdWx0IG5hbWVcclxuICAgICAgICBjb25zdCBub3JtYWxpemVkSWRlbnRpZmllciA9IHRoaXMubm9ybWFsaXplSW5zdGFuY2VJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xyXG4gICAgICAgIGlmICghdGhpcy5pbnN0YW5jZXNEZWZlcnJlZC5oYXMobm9ybWFsaXplZElkZW50aWZpZXIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRlZmVycmVkID0gbmV3IERlZmVycmVkKCk7XHJcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2VzRGVmZXJyZWQuc2V0KG5vcm1hbGl6ZWRJZGVudGlmaWVyLCBkZWZlcnJlZCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQobm9ybWFsaXplZElkZW50aWZpZXIpIHx8XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3VsZEF1dG9Jbml0aWFsaXplKCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgdGhlIHNlcnZpY2UgaWYgaXQgY2FuIGJlIGF1dG8taW5pdGlhbGl6ZWRcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmdldE9ySW5pdGlhbGl6ZVNlcnZpY2Uoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUlkZW50aWZpZXI6IG5vcm1hbGl6ZWRJZGVudGlmaWVyXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgaW5zdGFuY2UgZmFjdG9yeSB0aHJvd3MgYW4gZXhjZXB0aW9uIGR1cmluZyBnZXQoKSwgaXQgc2hvdWxkIG5vdCBjYXVzZVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgZmF0YWwgZXJyb3IuIFdlIGp1c3QgcmV0dXJuIHRoZSB1bnJlc29sdmVkIHByb21pc2UgaW4gdGhpcyBjYXNlLlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlc0RlZmVycmVkLmdldChub3JtYWxpemVkSWRlbnRpZmllcikucHJvbWlzZTtcclxuICAgIH1cclxuICAgIGdldEltbWVkaWF0ZShvcHRpb25zKSB7XHJcbiAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgIC8vIGlmIG11bHRpcGxlSW5zdGFuY2VzIGlzIG5vdCBzdXBwb3J0ZWQsIHVzZSB0aGUgZGVmYXVsdCBuYW1lXHJcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZElkZW50aWZpZXIgPSB0aGlzLm5vcm1hbGl6ZUluc3RhbmNlSWRlbnRpZmllcihvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuaWRlbnRpZmllcik7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9uYWwgPSAoX2EgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMub3B0aW9uYWwpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQobm9ybWFsaXplZElkZW50aWZpZXIpIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2hvdWxkQXV0b0luaXRpYWxpemUoKSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T3JJbml0aWFsaXplU2VydmljZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBub3JtYWxpemVkSWRlbnRpZmllclxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25hbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gSW4gY2FzZSBhIGNvbXBvbmVudCBpcyBub3QgaW5pdGlhbGl6ZWQgYW5kIHNob3VsZC9jYW4gbm90IGJlIGF1dG8taW5pdGlhbGl6ZWQgYXQgdGhlIG1vbWVudCwgcmV0dXJuIG51bGwgaWYgdGhlIG9wdGlvbmFsIGZsYWcgaXMgc2V0LCBvciB0aHJvd1xyXG4gICAgICAgICAgICBpZiAob3B0aW9uYWwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYFNlcnZpY2UgJHt0aGlzLm5hbWV9IGlzIG5vdCBhdmFpbGFibGVgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldENvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb21wb25lbnQ7XHJcbiAgICB9XHJcbiAgICBzZXRDb21wb25lbnQoY29tcG9uZW50KSB7XHJcbiAgICAgICAgaWYgKGNvbXBvbmVudC5uYW1lICE9PSB0aGlzLm5hbWUpIHtcclxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYE1pc21hdGNoaW5nIENvbXBvbmVudCAke2NvbXBvbmVudC5uYW1lfSBmb3IgUHJvdmlkZXIgJHt0aGlzLm5hbWV9LmApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jb21wb25lbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYENvbXBvbmVudCBmb3IgJHt0aGlzLm5hbWV9IGhhcyBhbHJlYWR5IGJlZW4gcHJvdmlkZWRgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7XHJcbiAgICAgICAgLy8gcmV0dXJuIGVhcmx5IHdpdGhvdXQgYXR0ZW1wdGluZyB0byBpbml0aWFsaXplIHRoZSBjb21wb25lbnQgaWYgdGhlIGNvbXBvbmVudCByZXF1aXJlcyBleHBsaWNpdCBpbml0aWFsaXphdGlvbiAoY2FsbGluZyBgUHJvdmlkZXIuaW5pdGlhbGl6ZSgpYClcclxuICAgICAgICBpZiAoIXRoaXMuc2hvdWxkQXV0b0luaXRpYWxpemUoKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlmIHRoZSBzZXJ2aWNlIGlzIGVhZ2VyLCBpbml0aWFsaXplIHRoZSBkZWZhdWx0IGluc3RhbmNlXHJcbiAgICAgICAgaWYgKGlzQ29tcG9uZW50RWFnZXIoY29tcG9uZW50KSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRPckluaXRpYWxpemVTZXJ2aWNlKHsgaW5zdGFuY2VJZGVudGlmaWVyOiBERUZBVUxUX0VOVFJZX05BTUUgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGluc3RhbmNlIGZhY3RvcnkgZm9yIGFuIGVhZ2VyIENvbXBvbmVudCB0aHJvd3MgYW4gZXhjZXB0aW9uIGR1cmluZyB0aGUgZWFnZXJcclxuICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemF0aW9uLCBpdCBzaG91bGQgbm90IGNhdXNlIGEgZmF0YWwgZXJyb3IuXHJcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBJbnZlc3RpZ2F0ZSBpZiB3ZSBuZWVkIHRvIG1ha2UgaXQgY29uZmlndXJhYmxlLCBiZWNhdXNlIHNvbWUgY29tcG9uZW50IG1heSB3YW50IHRvIGNhdXNlXHJcbiAgICAgICAgICAgICAgICAvLyBhIGZhdGFsIGVycm9yIGluIHRoaXMgY2FzZT9cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBDcmVhdGUgc2VydmljZSBpbnN0YW5jZXMgZm9yIHRoZSBwZW5kaW5nIHByb21pc2VzIGFuZCByZXNvbHZlIHRoZW1cclxuICAgICAgICAvLyBOT1RFOiBpZiB0aGlzLm11bHRpcGxlSW5zdGFuY2VzIGlzIGZhbHNlLCBvbmx5IHRoZSBkZWZhdWx0IGluc3RhbmNlIHdpbGwgYmUgY3JlYXRlZFxyXG4gICAgICAgIC8vIGFuZCBhbGwgcHJvbWlzZXMgd2l0aCByZXNvbHZlIHdpdGggaXQgcmVnYXJkbGVzcyBvZiB0aGUgaWRlbnRpZmllci5cclxuICAgICAgICBmb3IgKGNvbnN0IFtpbnN0YW5jZUlkZW50aWZpZXIsIGluc3RhbmNlRGVmZXJyZWRdIG9mIHRoaXMuaW5zdGFuY2VzRGVmZXJyZWQuZW50cmllcygpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZGVudGlmaWVyID0gdGhpcy5ub3JtYWxpemVJbnN0YW5jZUlkZW50aWZpZXIoaW5zdGFuY2VJZGVudGlmaWVyKTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIC8vIGBnZXRPckluaXRpYWxpemVTZXJ2aWNlKClgIHNob3VsZCBhbHdheXMgcmV0dXJuIGEgdmFsaWQgaW5zdGFuY2Ugc2luY2UgYSBjb21wb25lbnQgaXMgZ3VhcmFudGVlZC4gdXNlICEgdG8gbWFrZSB0eXBlc2NyaXB0IGhhcHB5LlxyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmdldE9ySW5pdGlhbGl6ZVNlcnZpY2Uoe1xyXG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlSWRlbnRpZmllcjogbm9ybWFsaXplZElkZW50aWZpZXJcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VEZWZlcnJlZC5yZXNvbHZlKGluc3RhbmNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgaW5zdGFuY2UgZmFjdG9yeSB0aHJvd3MgYW4gZXhjZXB0aW9uLCBpdCBzaG91bGQgbm90IGNhdXNlXHJcbiAgICAgICAgICAgICAgICAvLyBhIGZhdGFsIGVycm9yLiBXZSBqdXN0IGxlYXZlIHRoZSBwcm9taXNlIHVucmVzb2x2ZWQuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjbGVhckluc3RhbmNlKGlkZW50aWZpZXIgPSBERUZBVUxUX0VOVFJZX05BTUUpIHtcclxuICAgICAgICB0aGlzLmluc3RhbmNlc0RlZmVycmVkLmRlbGV0ZShpZGVudGlmaWVyKTtcclxuICAgICAgICB0aGlzLmluc3RhbmNlc09wdGlvbnMuZGVsZXRlKGlkZW50aWZpZXIpO1xyXG4gICAgICAgIHRoaXMuaW5zdGFuY2VzLmRlbGV0ZShpZGVudGlmaWVyKTtcclxuICAgIH1cclxuICAgIC8vIGFwcC5kZWxldGUoKSB3aWxsIGNhbGwgdGhpcyBtZXRob2Qgb24gZXZlcnkgcHJvdmlkZXIgdG8gZGVsZXRlIHRoZSBzZXJ2aWNlc1xyXG4gICAgLy8gVE9ETzogc2hvdWxkIHdlIG1hcmsgdGhlIHByb3ZpZGVyIGFzIGRlbGV0ZWQ/XHJcbiAgICBhc3luYyBkZWxldGUoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VydmljZXMgPSBBcnJheS5mcm9tKHRoaXMuaW5zdGFuY2VzLnZhbHVlcygpKTtcclxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXHJcbiAgICAgICAgICAgIC4uLnNlcnZpY2VzXHJcbiAgICAgICAgICAgICAgICAuZmlsdGVyKHNlcnZpY2UgPT4gJ0lOVEVSTkFMJyBpbiBzZXJ2aWNlKSAvLyBsZWdhY3kgc2VydmljZXNcclxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgICAgICAgICAubWFwKHNlcnZpY2UgPT4gc2VydmljZS5JTlRFUk5BTC5kZWxldGUoKSksXHJcbiAgICAgICAgICAgIC4uLnNlcnZpY2VzXHJcbiAgICAgICAgICAgICAgICAuZmlsdGVyKHNlcnZpY2UgPT4gJ19kZWxldGUnIGluIHNlcnZpY2UpIC8vIG1vZHVsYXJpemVkIHNlcnZpY2VzXHJcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgICAgICAgICAgLm1hcChzZXJ2aWNlID0+IHNlcnZpY2UuX2RlbGV0ZSgpKVxyXG4gICAgICAgIF0pO1xyXG4gICAgfVxyXG4gICAgaXNDb21wb25lbnRTZXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50ICE9IG51bGw7XHJcbiAgICB9XHJcbiAgICBpc0luaXRpYWxpemVkKGlkZW50aWZpZXIgPSBERUZBVUxUX0VOVFJZX05BTUUpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZXMuaGFzKGlkZW50aWZpZXIpO1xyXG4gICAgfVxyXG4gICAgZ2V0T3B0aW9ucyhpZGVudGlmaWVyID0gREVGQVVMVF9FTlRSWV9OQU1FKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2VzT3B0aW9ucy5nZXQoaWRlbnRpZmllcikgfHwge307XHJcbiAgICB9XHJcbiAgICBpbml0aWFsaXplKG9wdHMgPSB7fSkge1xyXG4gICAgICAgIGNvbnN0IHsgb3B0aW9ucyA9IHt9IH0gPSBvcHRzO1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZGVudGlmaWVyID0gdGhpcy5ub3JtYWxpemVJbnN0YW5jZUlkZW50aWZpZXIob3B0cy5pbnN0YW5jZUlkZW50aWZpZXIpO1xyXG4gICAgICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQobm9ybWFsaXplZElkZW50aWZpZXIpKSB7XHJcbiAgICAgICAgICAgIHRocm93IEVycm9yKGAke3RoaXMubmFtZX0oJHtub3JtYWxpemVkSWRlbnRpZmllcn0pIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWRgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzQ29tcG9uZW50U2V0KCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYENvbXBvbmVudCAke3RoaXMubmFtZX0gaGFzIG5vdCBiZWVuIHJlZ2lzdGVyZWQgeWV0YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5nZXRPckluaXRpYWxpemVTZXJ2aWNlKHtcclxuICAgICAgICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBub3JtYWxpemVkSWRlbnRpZmllcixcclxuICAgICAgICAgICAgb3B0aW9uc1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIHJlc29sdmUgYW55IHBlbmRpbmcgcHJvbWlzZSB3YWl0aW5nIGZvciB0aGUgc2VydmljZSBpbnN0YW5jZVxyXG4gICAgICAgIGZvciAoY29uc3QgW2luc3RhbmNlSWRlbnRpZmllciwgaW5zdGFuY2VEZWZlcnJlZF0gb2YgdGhpcy5pbnN0YW5jZXNEZWZlcnJlZC5lbnRyaWVzKCkpIHtcclxuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZERlZmVycmVkSWRlbnRpZmllciA9IHRoaXMubm9ybWFsaXplSW5zdGFuY2VJZGVudGlmaWVyKGluc3RhbmNlSWRlbnRpZmllcik7XHJcbiAgICAgICAgICAgIGlmIChub3JtYWxpemVkSWRlbnRpZmllciA9PT0gbm9ybWFsaXplZERlZmVycmVkSWRlbnRpZmllcikge1xyXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VEZWZlcnJlZC5yZXNvbHZlKGluc3RhbmNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBpbnZva2VkICBhZnRlciB0aGUgcHJvdmlkZXIgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYnkgY2FsbGluZyBwcm92aWRlci5pbml0aWFsaXplKCkuXHJcbiAgICAgKiBUaGUgZnVuY3Rpb24gaXMgaW52b2tlZCBTWU5DSFJPTk9VU0xZLCBzbyBpdCBzaG91bGQgbm90IGV4ZWN1dGUgYW55IGxvbmdydW5uaW5nIHRhc2tzIGluIG9yZGVyIHRvIG5vdCBibG9jayB0aGUgcHJvZ3JhbS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaWRlbnRpZmllciBBbiBvcHRpb25hbCBpbnN0YW5jZSBpZGVudGlmaWVyXHJcbiAgICAgKiBAcmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVucmVnaXN0ZXIgdGhlIGNhbGxiYWNrXHJcbiAgICAgKi9cclxuICAgIG9uSW5pdChjYWxsYmFjaywgaWRlbnRpZmllcikge1xyXG4gICAgICAgIHZhciBfYTtcclxuICAgICAgICBjb25zdCBub3JtYWxpemVkSWRlbnRpZmllciA9IHRoaXMubm9ybWFsaXplSW5zdGFuY2VJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQ2FsbGJhY2tzID0gKF9hID0gdGhpcy5vbkluaXRDYWxsYmFja3MuZ2V0KG5vcm1hbGl6ZWRJZGVudGlmaWVyKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogbmV3IFNldCgpO1xyXG4gICAgICAgIGV4aXN0aW5nQ2FsbGJhY2tzLmFkZChjYWxsYmFjayk7XHJcbiAgICAgICAgdGhpcy5vbkluaXRDYWxsYmFja3Muc2V0KG5vcm1hbGl6ZWRJZGVudGlmaWVyLCBleGlzdGluZ0NhbGxiYWNrcyk7XHJcbiAgICAgICAgY29uc3QgZXhpc3RpbmdJbnN0YW5jZSA9IHRoaXMuaW5zdGFuY2VzLmdldChub3JtYWxpemVkSWRlbnRpZmllcik7XHJcbiAgICAgICAgaWYgKGV4aXN0aW5nSW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgY2FsbGJhY2soZXhpc3RpbmdJbnN0YW5jZSwgbm9ybWFsaXplZElkZW50aWZpZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICAgICAgICBleGlzdGluZ0NhbGxiYWNrcy5kZWxldGUoY2FsbGJhY2spO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEludm9rZSBvbkluaXQgY2FsbGJhY2tzIHN5bmNocm9ub3VzbHlcclxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSB0aGUgc2VydmljZSBpbnN0YW5jZWBcclxuICAgICAqL1xyXG4gICAgaW52b2tlT25Jbml0Q2FsbGJhY2tzKGluc3RhbmNlLCBpZGVudGlmaWVyKSB7XHJcbiAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gdGhpcy5vbkluaXRDYWxsYmFja3MuZ2V0KGlkZW50aWZpZXIpO1xyXG4gICAgICAgIGlmICghY2FsbGJhY2tzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiBjYWxsYmFja3MpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGluc3RhbmNlLCBpZGVudGlmaWVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnMgaW4gdGhlIG9uSW5pdCBjYWxsYmFja1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0T3JJbml0aWFsaXplU2VydmljZSh7IGluc3RhbmNlSWRlbnRpZmllciwgb3B0aW9ucyA9IHt9IH0pIHtcclxuICAgICAgICBsZXQgaW5zdGFuY2UgPSB0aGlzLmluc3RhbmNlcy5nZXQoaW5zdGFuY2VJZGVudGlmaWVyKTtcclxuICAgICAgICBpZiAoIWluc3RhbmNlICYmIHRoaXMuY29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIGluc3RhbmNlID0gdGhpcy5jb21wb25lbnQuaW5zdGFuY2VGYWN0b3J5KHRoaXMuY29udGFpbmVyLCB7XHJcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUlkZW50aWZpZXI6IG5vcm1hbGl6ZUlkZW50aWZpZXJGb3JGYWN0b3J5KGluc3RhbmNlSWRlbnRpZmllciksXHJcbiAgICAgICAgICAgICAgICBvcHRpb25zXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlcy5zZXQoaW5zdGFuY2VJZGVudGlmaWVyLCBpbnN0YW5jZSk7XHJcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2VzT3B0aW9ucy5zZXQoaW5zdGFuY2VJZGVudGlmaWVyLCBvcHRpb25zKTtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIEludm9rZSBvbkluaXQgbGlzdGVuZXJzLlxyXG4gICAgICAgICAgICAgKiBOb3RlIHRoaXMuY29tcG9uZW50Lm9uSW5zdGFuY2VDcmVhdGVkIGlzIGRpZmZlcmVudCwgd2hpY2ggaXMgdXNlZCBieSB0aGUgY29tcG9uZW50IGNyZWF0b3IsXHJcbiAgICAgICAgICAgICAqIHdoaWxlIG9uSW5pdCBsaXN0ZW5lcnMgYXJlIHJlZ2lzdGVyZWQgYnkgY29uc3VtZXJzIG9mIHRoZSBwcm92aWRlci5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIHRoaXMuaW52b2tlT25Jbml0Q2FsbGJhY2tzKGluc3RhbmNlLCBpbnN0YW5jZUlkZW50aWZpZXIpO1xyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogT3JkZXIgaXMgaW1wb3J0YW50XHJcbiAgICAgICAgICAgICAqIG9uSW5zdGFuY2VDcmVhdGVkKCkgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciB0aGlzLmluc3RhbmNlcy5zZXQoaW5zdGFuY2VJZGVudGlmaWVyLCBpbnN0YW5jZSk7IHdoaWNoXHJcbiAgICAgICAgICAgICAqIG1ha2VzIGBpc0luaXRpYWxpemVkKClgIHJldHVybiB0cnVlLlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50Lm9uSW5zdGFuY2VDcmVhdGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50Lm9uSW5zdGFuY2VDcmVhdGVkKHRoaXMuY29udGFpbmVyLCBpbnN0YW5jZUlkZW50aWZpZXIsIGluc3RhbmNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnMgaW4gdGhlIG9uSW5zdGFuY2VDcmVhdGVkQ2FsbGJhY2tcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaW5zdGFuY2UgfHwgbnVsbDtcclxuICAgIH1cclxuICAgIG5vcm1hbGl6ZUluc3RhbmNlSWRlbnRpZmllcihpZGVudGlmaWVyID0gREVGQVVMVF9FTlRSWV9OQU1FKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudC5tdWx0aXBsZUluc3RhbmNlcyA/IGlkZW50aWZpZXIgOiBERUZBVUxUX0VOVFJZX05BTUU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gaWRlbnRpZmllcjsgLy8gYXNzdW1lIG11bHRpcGxlIGluc3RhbmNlcyBhcmUgc3VwcG9ydGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGlzIHByb3ZpZGVkLlxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHNob3VsZEF1dG9Jbml0aWFsaXplKCkge1xyXG4gICAgICAgIHJldHVybiAoISF0aGlzLmNvbXBvbmVudCAmJlxyXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudC5pbnN0YW50aWF0aW9uTW9kZSAhPT0gXCJFWFBMSUNJVFwiIC8qIEVYUExJQ0lUICovKTtcclxuICAgIH1cclxufVxyXG4vLyB1bmRlZmluZWQgc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUgc2VydmljZSBmYWN0b3J5IGZvciB0aGUgZGVmYXVsdCBpbnN0YW5jZVxyXG5mdW5jdGlvbiBub3JtYWxpemVJZGVudGlmaWVyRm9yRmFjdG9yeShpZGVudGlmaWVyKSB7XHJcbiAgICByZXR1cm4gaWRlbnRpZmllciA9PT0gREVGQVVMVF9FTlRSWV9OQU1FID8gdW5kZWZpbmVkIDogaWRlbnRpZmllcjtcclxufVxyXG5mdW5jdGlvbiBpc0NvbXBvbmVudEVhZ2VyKGNvbXBvbmVudCkge1xyXG4gICAgcmV0dXJuIGNvbXBvbmVudC5pbnN0YW50aWF0aW9uTW9kZSA9PT0gXCJFQUdFUlwiIC8qIEVBR0VSICovO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBDb21wb25lbnRDb250YWluZXIgdGhhdCBwcm92aWRlcyBQcm92aWRlcnMgZm9yIHNlcnZpY2UgbmFtZSBULCBlLmcuIGBhdXRoYCwgYGF1dGgtaW50ZXJuYWxgXHJcbiAqL1xyXG5jbGFzcyBDb21wb25lbnRDb250YWluZXIge1xyXG4gICAgY29uc3RydWN0b3IobmFtZSkge1xyXG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICAgICAgdGhpcy5wcm92aWRlcnMgPSBuZXcgTWFwKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY29tcG9uZW50IENvbXBvbmVudCBiZWluZyBhZGRlZFxyXG4gICAgICogQHBhcmFtIG92ZXJ3cml0ZSBXaGVuIGEgY29tcG9uZW50IHdpdGggdGhlIHNhbWUgbmFtZSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQsXHJcbiAgICAgKiBpZiBvdmVyd3JpdGUgaXMgdHJ1ZTogb3ZlcndyaXRlIHRoZSBleGlzdGluZyBjb21wb25lbnQgd2l0aCB0aGUgbmV3IGNvbXBvbmVudCBhbmQgY3JlYXRlIGEgbmV3XHJcbiAgICAgKiBwcm92aWRlciB3aXRoIHRoZSBuZXcgY29tcG9uZW50LiBJdCBjYW4gYmUgdXNlZnVsIGluIHRlc3RzIHdoZXJlIHlvdSB3YW50IHRvIHVzZSBkaWZmZXJlbnQgbW9ja3NcclxuICAgICAqIGZvciBkaWZmZXJlbnQgdGVzdHMuXHJcbiAgICAgKiBpZiBvdmVyd3JpdGUgaXMgZmFsc2U6IHRocm93IGFuIGV4Y2VwdGlvblxyXG4gICAgICovXHJcbiAgICBhZGRDb21wb25lbnQoY29tcG9uZW50KSB7XHJcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLmdldFByb3ZpZGVyKGNvbXBvbmVudC5uYW1lKTtcclxuICAgICAgICBpZiAocHJvdmlkZXIuaXNDb21wb25lbnRTZXQoKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbXBvbmVudCAke2NvbXBvbmVudC5uYW1lfSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgd2l0aCAke3RoaXMubmFtZX1gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcHJvdmlkZXIuc2V0Q29tcG9uZW50KGNvbXBvbmVudCk7XHJcbiAgICB9XHJcbiAgICBhZGRPck92ZXJ3cml0ZUNvbXBvbmVudChjb21wb25lbnQpIHtcclxuICAgICAgICBjb25zdCBwcm92aWRlciA9IHRoaXMuZ2V0UHJvdmlkZXIoY29tcG9uZW50Lm5hbWUpO1xyXG4gICAgICAgIGlmIChwcm92aWRlci5pc0NvbXBvbmVudFNldCgpKSB7XHJcbiAgICAgICAgICAgIC8vIGRlbGV0ZSB0aGUgZXhpc3RpbmcgcHJvdmlkZXIgZnJvbSB0aGUgY29udGFpbmVyLCBzbyB3ZSBjYW4gcmVnaXN0ZXIgdGhlIG5ldyBjb21wb25lbnRcclxuICAgICAgICAgICAgdGhpcy5wcm92aWRlcnMuZGVsZXRlKGNvbXBvbmVudC5uYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hZGRDb21wb25lbnQoY29tcG9uZW50KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogZ2V0UHJvdmlkZXIgcHJvdmlkZXMgYSB0eXBlIHNhZmUgaW50ZXJmYWNlIHdoZXJlIGl0IGNhbiBvbmx5IGJlIGNhbGxlZCB3aXRoIGEgZmllbGQgbmFtZVxyXG4gICAgICogcHJlc2VudCBpbiBOYW1lU2VydmljZU1hcHBpbmcgaW50ZXJmYWNlLlxyXG4gICAgICpcclxuICAgICAqIEZpcmViYXNlIFNES3MgcHJvdmlkaW5nIHNlcnZpY2VzIHNob3VsZCBleHRlbmQgTmFtZVNlcnZpY2VNYXBwaW5nIGludGVyZmFjZSB0byByZWdpc3RlclxyXG4gICAgICogdGhlbXNlbHZlcy5cclxuICAgICAqL1xyXG4gICAgZ2V0UHJvdmlkZXIobmFtZSkge1xyXG4gICAgICAgIGlmICh0aGlzLnByb3ZpZGVycy5oYXMobmFtZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvdmlkZXJzLmdldChuYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY3JlYXRlIGEgUHJvdmlkZXIgZm9yIGEgc2VydmljZSB0aGF0IGhhc24ndCByZWdpc3RlcmVkIHdpdGggRmlyZWJhc2VcclxuICAgICAgICBjb25zdCBwcm92aWRlciA9IG5ldyBQcm92aWRlcihuYW1lLCB0aGlzKTtcclxuICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQobmFtZSwgcHJvdmlkZXIpO1xyXG4gICAgICAgIHJldHVybiBwcm92aWRlcjtcclxuICAgIH1cclxuICAgIGdldFByb3ZpZGVycygpIHtcclxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnByb3ZpZGVycy52YWx1ZXMoKSk7XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgQ29tcG9uZW50LCBDb21wb25lbnRDb250YWluZXIsIFByb3ZpZGVyIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5lc20yMDE3LmpzLm1hcFxuIiwiLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIEEgY29udGFpbmVyIGZvciBhbGwgb2YgdGhlIExvZ2dlciBpbnN0YW5jZXNcclxuICovXHJcbmNvbnN0IGluc3RhbmNlcyA9IFtdO1xyXG4vKipcclxuICogVGhlIEpTIFNESyBzdXBwb3J0cyA1IGxvZyBsZXZlbHMgYW5kIGFsc28gYWxsb3dzIGEgdXNlciB0aGUgYWJpbGl0eSB0b1xyXG4gKiBzaWxlbmNlIHRoZSBsb2dzIGFsdG9nZXRoZXIuXHJcbiAqXHJcbiAqIFRoZSBvcmRlciBpcyBhIGZvbGxvd3M6XHJcbiAqIERFQlVHIDwgVkVSQk9TRSA8IElORk8gPCBXQVJOIDwgRVJST1JcclxuICpcclxuICogQWxsIG9mIHRoZSBsb2cgdHlwZXMgYWJvdmUgdGhlIGN1cnJlbnQgbG9nIGxldmVsIHdpbGwgYmUgY2FwdHVyZWQgKGkuZS4gaWZcclxuICogeW91IHNldCB0aGUgbG9nIGxldmVsIHRvIGBJTkZPYCwgZXJyb3JzIHdpbGwgc3RpbGwgYmUgbG9nZ2VkLCBidXQgYERFQlVHYCBhbmRcclxuICogYFZFUkJPU0VgIGxvZ3Mgd2lsbCBub3QpXHJcbiAqL1xyXG52YXIgTG9nTGV2ZWw7XHJcbihmdW5jdGlvbiAoTG9nTGV2ZWwpIHtcclxuICAgIExvZ0xldmVsW0xvZ0xldmVsW1wiREVCVUdcIl0gPSAwXSA9IFwiREVCVUdcIjtcclxuICAgIExvZ0xldmVsW0xvZ0xldmVsW1wiVkVSQk9TRVwiXSA9IDFdID0gXCJWRVJCT1NFXCI7XHJcbiAgICBMb2dMZXZlbFtMb2dMZXZlbFtcIklORk9cIl0gPSAyXSA9IFwiSU5GT1wiO1xyXG4gICAgTG9nTGV2ZWxbTG9nTGV2ZWxbXCJXQVJOXCJdID0gM10gPSBcIldBUk5cIjtcclxuICAgIExvZ0xldmVsW0xvZ0xldmVsW1wiRVJST1JcIl0gPSA0XSA9IFwiRVJST1JcIjtcclxuICAgIExvZ0xldmVsW0xvZ0xldmVsW1wiU0lMRU5UXCJdID0gNV0gPSBcIlNJTEVOVFwiO1xyXG59KShMb2dMZXZlbCB8fCAoTG9nTGV2ZWwgPSB7fSkpO1xyXG5jb25zdCBsZXZlbFN0cmluZ1RvRW51bSA9IHtcclxuICAgICdkZWJ1Zyc6IExvZ0xldmVsLkRFQlVHLFxyXG4gICAgJ3ZlcmJvc2UnOiBMb2dMZXZlbC5WRVJCT1NFLFxyXG4gICAgJ2luZm8nOiBMb2dMZXZlbC5JTkZPLFxyXG4gICAgJ3dhcm4nOiBMb2dMZXZlbC5XQVJOLFxyXG4gICAgJ2Vycm9yJzogTG9nTGV2ZWwuRVJST1IsXHJcbiAgICAnc2lsZW50JzogTG9nTGV2ZWwuU0lMRU5UXHJcbn07XHJcbi8qKlxyXG4gKiBUaGUgZGVmYXVsdCBsb2cgbGV2ZWxcclxuICovXHJcbmNvbnN0IGRlZmF1bHRMb2dMZXZlbCA9IExvZ0xldmVsLklORk87XHJcbi8qKlxyXG4gKiBCeSBkZWZhdWx0LCBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGRpc3BsYXllZCBpbiB0aGUgZGV2ZWxvcGVyIGNvbnNvbGUgKGluXHJcbiAqIGNocm9tZSkuIFRvIGF2b2lkIGZvcmNpbmcgdXNlcnMgdG8gaGF2ZSB0byBvcHQtaW4gdG8gdGhlc2UgbG9ncyB0d2ljZVxyXG4gKiAoaS5lLiBvbmNlIGZvciBmaXJlYmFzZSwgYW5kIG9uY2UgaW4gdGhlIGNvbnNvbGUpLCB3ZSBhcmUgc2VuZGluZyBgREVCVUdgXHJcbiAqIGxvZ3MgdG8gdGhlIGBjb25zb2xlLmxvZ2AgZnVuY3Rpb24uXHJcbiAqL1xyXG5jb25zdCBDb25zb2xlTWV0aG9kID0ge1xyXG4gICAgW0xvZ0xldmVsLkRFQlVHXTogJ2xvZycsXHJcbiAgICBbTG9nTGV2ZWwuVkVSQk9TRV06ICdsb2cnLFxyXG4gICAgW0xvZ0xldmVsLklORk9dOiAnaW5mbycsXHJcbiAgICBbTG9nTGV2ZWwuV0FSTl06ICd3YXJuJyxcclxuICAgIFtMb2dMZXZlbC5FUlJPUl06ICdlcnJvcidcclxufTtcclxuLyoqXHJcbiAqIFRoZSBkZWZhdWx0IGxvZyBoYW5kbGVyIHdpbGwgZm9yd2FyZCBERUJVRywgVkVSQk9TRSwgSU5GTywgV0FSTiwgYW5kIEVSUk9SXHJcbiAqIG1lc3NhZ2VzIG9uIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgY29uc29sZSBjb3VudGVycGFydHMgKGlmIHRoZSBsb2cgbWV0aG9kXHJcbiAqIGlzIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBsb2cgbGV2ZWwpXHJcbiAqL1xyXG5jb25zdCBkZWZhdWx0TG9nSGFuZGxlciA9IChpbnN0YW5jZSwgbG9nVHlwZSwgLi4uYXJncykgPT4ge1xyXG4gICAgaWYgKGxvZ1R5cGUgPCBpbnN0YW5jZS5sb2dMZXZlbCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcclxuICAgIGNvbnN0IG1ldGhvZCA9IENvbnNvbGVNZXRob2RbbG9nVHlwZV07XHJcbiAgICBpZiAobWV0aG9kKSB7XHJcbiAgICAgICAgY29uc29sZVttZXRob2RdKGBbJHtub3d9XSAgJHtpbnN0YW5jZS5uYW1lfTpgLCAuLi5hcmdzKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQXR0ZW1wdGVkIHRvIGxvZyBhIG1lc3NhZ2Ugd2l0aCBhbiBpbnZhbGlkIGxvZ1R5cGUgKHZhbHVlOiAke2xvZ1R5cGV9KWApO1xyXG4gICAgfVxyXG59O1xyXG5jbGFzcyBMb2dnZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBHaXZlcyB5b3UgYW4gaW5zdGFuY2Ugb2YgYSBMb2dnZXIgdG8gY2FwdHVyZSBtZXNzYWdlcyBhY2NvcmRpbmcgdG9cclxuICAgICAqIEZpcmViYXNlJ3MgbG9nZ2luZyBzY2hlbWUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdGhhdCB0aGUgbG9ncyB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aFxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lKSB7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbG9nIGxldmVsIG9mIHRoZSBnaXZlbiBMb2dnZXIgaW5zdGFuY2UuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fbG9nTGV2ZWwgPSBkZWZhdWx0TG9nTGV2ZWw7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG1haW4gKGludGVybmFsKSBsb2cgaGFuZGxlciBmb3IgdGhlIExvZ2dlciBpbnN0YW5jZS5cclxuICAgICAgICAgKiBDYW4gYmUgc2V0IHRvIGEgbmV3IGZ1bmN0aW9uIGluIGludGVybmFsIHBhY2thZ2UgY29kZSBidXQgbm90IGJ5IHVzZXIuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fbG9nSGFuZGxlciA9IGRlZmF1bHRMb2dIYW5kbGVyO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBvcHRpb25hbCwgYWRkaXRpb25hbCwgdXNlci1kZWZpbmVkIGxvZyBoYW5kbGVyIGZvciB0aGUgTG9nZ2VyIGluc3RhbmNlLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3VzZXJMb2dIYW5kbGVyID0gbnVsbDtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDYXB0dXJlIHRoZSBjdXJyZW50IGluc3RhbmNlIGZvciBsYXRlciB1c2VcclxuICAgICAgICAgKi9cclxuICAgICAgICBpbnN0YW5jZXMucHVzaCh0aGlzKTtcclxuICAgIH1cclxuICAgIGdldCBsb2dMZXZlbCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbG9nTGV2ZWw7XHJcbiAgICB9XHJcbiAgICBzZXQgbG9nTGV2ZWwodmFsKSB7XHJcbiAgICAgICAgaWYgKCEodmFsIGluIExvZ0xldmVsKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIHZhbHVlIFwiJHt2YWx9XCIgYXNzaWduZWQgdG8gXFxgbG9nTGV2ZWxcXGBgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fbG9nTGV2ZWwgPSB2YWw7XHJcbiAgICB9XHJcbiAgICAvLyBXb3JrYXJvdW5kIGZvciBzZXR0ZXIvZ2V0dGVyIGhhdmluZyB0byBiZSB0aGUgc2FtZSB0eXBlLlxyXG4gICAgc2V0TG9nTGV2ZWwodmFsKSB7XHJcbiAgICAgICAgdGhpcy5fbG9nTGV2ZWwgPSB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyA/IGxldmVsU3RyaW5nVG9FbnVtW3ZhbF0gOiB2YWw7XHJcbiAgICB9XHJcbiAgICBnZXQgbG9nSGFuZGxlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbG9nSGFuZGxlcjtcclxuICAgIH1cclxuICAgIHNldCBsb2dIYW5kbGVyKHZhbCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1ZhbHVlIGFzc2lnbmVkIHRvIGBsb2dIYW5kbGVyYCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fbG9nSGFuZGxlciA9IHZhbDtcclxuICAgIH1cclxuICAgIGdldCB1c2VyTG9nSGFuZGxlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdXNlckxvZ0hhbmRsZXI7XHJcbiAgICB9XHJcbiAgICBzZXQgdXNlckxvZ0hhbmRsZXIodmFsKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlckxvZ0hhbmRsZXIgPSB2YWw7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmdW5jdGlvbnMgYmVsb3cgYXJlIGFsbCBiYXNlZCBvbiB0aGUgYGNvbnNvbGVgIGludGVyZmFjZVxyXG4gICAgICovXHJcbiAgICBkZWJ1ZyguLi5hcmdzKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlckxvZ0hhbmRsZXIgJiYgdGhpcy5fdXNlckxvZ0hhbmRsZXIodGhpcywgTG9nTGV2ZWwuREVCVUcsIC4uLmFyZ3MpO1xyXG4gICAgICAgIHRoaXMuX2xvZ0hhbmRsZXIodGhpcywgTG9nTGV2ZWwuREVCVUcsIC4uLmFyZ3MpO1xyXG4gICAgfVxyXG4gICAgbG9nKC4uLmFyZ3MpIHtcclxuICAgICAgICB0aGlzLl91c2VyTG9nSGFuZGxlciAmJlxyXG4gICAgICAgICAgICB0aGlzLl91c2VyTG9nSGFuZGxlcih0aGlzLCBMb2dMZXZlbC5WRVJCT1NFLCAuLi5hcmdzKTtcclxuICAgICAgICB0aGlzLl9sb2dIYW5kbGVyKHRoaXMsIExvZ0xldmVsLlZFUkJPU0UsIC4uLmFyZ3MpO1xyXG4gICAgfVxyXG4gICAgaW5mbyguLi5hcmdzKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlckxvZ0hhbmRsZXIgJiYgdGhpcy5fdXNlckxvZ0hhbmRsZXIodGhpcywgTG9nTGV2ZWwuSU5GTywgLi4uYXJncyk7XHJcbiAgICAgICAgdGhpcy5fbG9nSGFuZGxlcih0aGlzLCBMb2dMZXZlbC5JTkZPLCAuLi5hcmdzKTtcclxuICAgIH1cclxuICAgIHdhcm4oLi4uYXJncykge1xyXG4gICAgICAgIHRoaXMuX3VzZXJMb2dIYW5kbGVyICYmIHRoaXMuX3VzZXJMb2dIYW5kbGVyKHRoaXMsIExvZ0xldmVsLldBUk4sIC4uLmFyZ3MpO1xyXG4gICAgICAgIHRoaXMuX2xvZ0hhbmRsZXIodGhpcywgTG9nTGV2ZWwuV0FSTiwgLi4uYXJncyk7XHJcbiAgICB9XHJcbiAgICBlcnJvciguLi5hcmdzKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlckxvZ0hhbmRsZXIgJiYgdGhpcy5fdXNlckxvZ0hhbmRsZXIodGhpcywgTG9nTGV2ZWwuRVJST1IsIC4uLmFyZ3MpO1xyXG4gICAgICAgIHRoaXMuX2xvZ0hhbmRsZXIodGhpcywgTG9nTGV2ZWwuRVJST1IsIC4uLmFyZ3MpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHNldExvZ0xldmVsKGxldmVsKSB7XHJcbiAgICBpbnN0YW5jZXMuZm9yRWFjaChpbnN0ID0+IHtcclxuICAgICAgICBpbnN0LnNldExvZ0xldmVsKGxldmVsKTtcclxuICAgIH0pO1xyXG59XHJcbmZ1bmN0aW9uIHNldFVzZXJMb2dIYW5kbGVyKGxvZ0NhbGxiYWNrLCBvcHRpb25zKSB7XHJcbiAgICBmb3IgKGNvbnN0IGluc3RhbmNlIG9mIGluc3RhbmNlcykge1xyXG4gICAgICAgIGxldCBjdXN0b21Mb2dMZXZlbCA9IG51bGw7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5sZXZlbCkge1xyXG4gICAgICAgICAgICBjdXN0b21Mb2dMZXZlbCA9IGxldmVsU3RyaW5nVG9FbnVtW29wdGlvbnMubGV2ZWxdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobG9nQ2FsbGJhY2sgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgaW5zdGFuY2UudXNlckxvZ0hhbmRsZXIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaW5zdGFuY2UudXNlckxvZ0hhbmRsZXIgPSAoaW5zdGFuY2UsIGxldmVsLCAuLi5hcmdzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gYXJnc1xyXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoYXJnID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYXJnID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInIHx8IHR5cGVvZiBhcmcgPT09ICdib29sZWFuJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJnLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZyBpbnN0YW5jZW9mIEVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmcubWVzc2FnZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoaWdub3JlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoYXJnID0+IGFyZylcclxuICAgICAgICAgICAgICAgICAgICAuam9pbignICcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxldmVsID49IChjdXN0b21Mb2dMZXZlbCAhPT0gbnVsbCAmJiBjdXN0b21Mb2dMZXZlbCAhPT0gdm9pZCAwID8gY3VzdG9tTG9nTGV2ZWwgOiBpbnN0YW5jZS5sb2dMZXZlbCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2dDYWxsYmFjayh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBMb2dMZXZlbFtsZXZlbF0udG9Mb3dlckNhc2UoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXJncyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogaW5zdGFuY2UubmFtZVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG5leHBvcnQgeyBMb2dMZXZlbCwgTG9nZ2VyLCBzZXRMb2dMZXZlbCwgc2V0VXNlckxvZ0hhbmRsZXIgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmVzbTIwMTcuanMubWFwXG4iLCJpbXBvcnQgeyBQYXJhbWV0ZXJUeXBlIH0gZnJvbSAnanNwc3ljaCc7XG5cbmNvbnN0IGluZm8gPSB7XHJcbiAgICBuYW1lOiBcInJka1wiLFxyXG4gICAgcGFyYW1ldGVyczoge1xyXG4gICAgICAgIC8qKiBBcnJheSBjb250YWluaW5nIHRoZSB2YWxpZCBrZXkocykgdGhhdCB0aGUgc3ViamVjdCBjYW4gcHJlc3MgdG8gaW5kaWNhdGUgYSByZXNwb25zZS4gKi9cclxuICAgICAgICBjaG9pY2VzOiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuS0VZUyxcclxuICAgICAgICAgICAgcHJldHR5X25hbWU6IFwiQ2hvaWNlc1wiLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiBcIkFMTF9LRVlTXCIsXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvKiogQXJyYXkgY29udGFpbmluZyB0aGUgY29ycmVjdCBrZXkocykgZm9yIHRoYXQgdHJpYWwuICovXHJcbiAgICAgICAgY29ycmVjdF9jaG9pY2U6IHtcclxuICAgICAgICAgICAgdHlwZTogUGFyYW1ldGVyVHlwZS5LRVlTLFxyXG4gICAgICAgICAgICBwcmV0dHlfbmFtZTogXCJDb3JyZWN0IGNob2ljZVwiLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiB1bmRlZmluZWQsXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvKiogVGhlIGxlbmd0aCBvZiBzdGltdWx1cyBwcmVzZW50YXRpb24uICovXHJcbiAgICAgICAgdHJpYWxfZHVyYXRpb246IHtcclxuICAgICAgICAgICAgdHlwZTogUGFyYW1ldGVyVHlwZS5JTlQsXHJcbiAgICAgICAgICAgIHByZXR0eV9uYW1lOiBcIlRyaWFsIGR1cmF0aW9uXCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IDUwMCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8qKiBJZiB0cnVlLCB0aGVuIGFueSB2YWxpZCBrZXkgd2lsbCBlbmQgdGhlIHRyaWFsLiAqL1xyXG4gICAgICAgIHJlc3BvbnNlX2VuZHNfdHJpYWw6IHtcclxuICAgICAgICAgICAgdHlwZTogUGFyYW1ldGVyVHlwZS5CT09MLFxyXG4gICAgICAgICAgICBwcmV0dHlfbmFtZTogXCJSZXNwb25zZSBlbmRzIHRyaWFsXCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHRydWUsXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvKiogVGhlIG51bWJlciBvZiBSREsgYXBlcnR1cmVzIChJZiBtb3JlIHRoYW4gb25lLCBtYWtlIHN1cmUgdG8gc2VwYXJhdGUgdGhlbSBieSBzZXR0aW5nIGFwZXJ0dXJlX2NlbnRlcl94IGFuZCBhcGVydHVyZV9jZW50ZXJfeSBmb3IgZWFjaCBSREspLiAqL1xyXG4gICAgICAgIG51bWJlcl9vZl9hcGVydHVyZXM6IHtcclxuICAgICAgICAgICAgdHlwZTogUGFyYW1ldGVyVHlwZS5JTlQsXHJcbiAgICAgICAgICAgIHByZXR0eV9uYW1lOiBcIk51bWJlciBvZiBhcGVydHVyZXNcIixcclxuICAgICAgICAgICAgZGVmYXVsdDogMSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8qKiBUaGUgbnVtYmVyIG9mIGRvdHMgcGVyIHNldCBpbiB0aGUgc3RpbXVsdXMuICovXHJcbiAgICAgICAgbnVtYmVyX29mX2RvdHM6IHtcclxuICAgICAgICAgICAgdHlwZTogUGFyYW1ldGVyVHlwZS5JTlQsXHJcbiAgICAgICAgICAgIHByZXR0eV9uYW1lOiBcIk51bWJlciBvZiBkb3RzXCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IDMwMCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8qKiBUaGUgbnVtYmVyIG9mIHNldHMgb2YgZG90cyB0byBjeWNsZSB0aHJvdWdoLiAqL1xyXG4gICAgICAgIG51bWJlcl9vZl9zZXRzOiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuSU5ULFxyXG4gICAgICAgICAgICBwcmV0dHlfbmFtZTogXCJOdW1iZXIgb2Ygc2V0c1wiLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAxLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLyoqIFRoZSBkaXJlY3Rpb24gb2YgY29oZXJlbnQgbW90aW9uIGluIGRlZ3JlZXMuICovXHJcbiAgICAgICAgY29oZXJlbnRfZGlyZWN0aW9uOiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuSU5ULFxyXG4gICAgICAgICAgICBwcmV0dHlfbmFtZTogXCJDb2hlcmVudCBkaXJlY3Rpb25cIixcclxuICAgICAgICAgICAgZGVmYXVsdDogMCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8qKiBUaGUgcHJvcG9ydGlvbiBvZiBkb3RzIG1vdmluZyBpbiB0aGUgY29oZXJlbnQgZGlyZWN0aW9uLiAqL1xyXG4gICAgICAgIGNvaGVyZW5jZToge1xyXG4gICAgICAgICAgICB0eXBlOiBQYXJhbWV0ZXJUeXBlLkZMT0FULFxyXG4gICAgICAgICAgICBwcmV0dHlfbmFtZTogXCJDb2hlcmVuY2VcIixcclxuICAgICAgICAgICAgZGVmYXVsdDogMC41LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLyoqIFRoZSBwcm9wb3J0aW9uIG9mIGRvdHMgbW92aW5nIGluIHRoZSBkaXJlY3Rpb24gb3Bwb3NpdGUgb2YgdGhlIGNvaGVyZW50IGRpcmVjdGlvbi4gKi9cclxuICAgICAgICBvcHBvc2l0ZV9jb2hlcmVuY2U6IHtcclxuICAgICAgICAgICAgdHlwZTogUGFyYW1ldGVyVHlwZS5GTE9BVCxcclxuICAgICAgICAgICAgcHJldHR5X25hbWU6IFwiT3Bwb3NpdGUgY29oZXJlbmNlXCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IDAsXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvKiogVGhlIHJhZGl1cyBvZiB0aGUgZG90cyBpbiBwaXhlbHMgKi9cclxuICAgICAgICBkb3RfcmFkaXVzOiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuSU5ULFxyXG4gICAgICAgICAgICBwcmV0dHlfbmFtZTogXCJEb3QgcmFkaXVzXCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IDIsXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvKiogVGhlIGxlbmd0aCBvZiB0aGUgc2lkZSBvZiBhIGRvdCBpbiBwaXhlbHMgKG9ubHkgd2hlbiBkb3Rfc2hhcGUgaXMgXCJzcXVhcmVcIikgKi9cclxuICAgICAgICBkb3Rfc2lkZV9sZW5ndGg6IHtcclxuICAgICAgICAgICAgdHlwZTogUGFyYW1ldGVyVHlwZS5JTlQsXHJcbiAgICAgICAgICAgIHByZXR0eV9uYW1lOiBcIkRvdCBzaWRlIGxlbmd0aFwiLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAxLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLyoqIFRoZSBudW1iZXIgb2YgZnJhbWVzIHRoYXQgcGFzcyBiZWZvcmUgZWFjaCBkb3QgZGlzYXBwZWFycyBhbmQgcmVhcHBlYXJzIHNvbWV3aGVyZSBlbHNlLiAqL1xyXG4gICAgICAgIGRvdF9saWZlOiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuSU5ULFxyXG4gICAgICAgICAgICBwcmV0dHlfbmFtZTogXCJEb3QgbGlmZVwiLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAtMSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8qKiBUaGUgZGlzdGFuY2UgaW4gcGl4ZWxzIGVhY2ggZG90IG1vdmVzIHBlciBmcmFtZS4gKi9cclxuICAgICAgICBtb3ZlX2Rpc3RhbmNlOiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuSU5ULFxyXG4gICAgICAgICAgICBwcmV0dHlfbmFtZTogXCJNb3ZlIGRpc3RhbmNlXCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IDEsXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvKiogVGhlIHdpZHRoIG9mIHRoZSBhcGVydHVyZSBpbiBwaXhlbHMuICovXHJcbiAgICAgICAgYXBlcnR1cmVfd2lkdGg6IHtcclxuICAgICAgICAgICAgdHlwZTogUGFyYW1ldGVyVHlwZS5JTlQsXHJcbiAgICAgICAgICAgIHByZXR0eV9uYW1lOiBcIkFwZXJ0dXJlIHdpZHRoXCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IDYwMCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSBhcGVydHVyZSBpbiBwaXhlbHMuICovXHJcbiAgICAgICAgYXBlcnR1cmVfaGVpZ2h0OiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuSU5ULFxyXG4gICAgICAgICAgICBwcmV0dHlfbmFtZTogXCJBcGVydHVyZSBoZWlnaHRcIixcclxuICAgICAgICAgICAgZGVmYXVsdDogNDAwLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLyoqIFRoZSBjb2xvciBvZiB0aGUgZG90cy4gKi9cclxuICAgICAgICBkb3RfY29sb3I6IHtcclxuICAgICAgICAgICAgdHlwZTogUGFyYW1ldGVyVHlwZS5TVFJJTkcsXHJcbiAgICAgICAgICAgIHByZXR0eV9uYW1lOiBcIkRvdCBjb2xvclwiLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiBcIndoaXRlXCIsXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvKiogVGhlIHNoYXBlIG9mIHRoZSBkb3RzICovXHJcbiAgICAgICAgZG90X3NoYXBlOiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuU1RSSU5HLFxyXG4gICAgICAgICAgICBwcmV0dHlfbmFtZTogXCJEb3Qgc2hhcGVcIixcclxuICAgICAgICAgICAgZGVmYXVsdDogXCJjaXJjbGVcIixcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8qKiBUaGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgc3RpbXVsdXMuICovXHJcbiAgICAgICAgYmFja2dyb3VuZF9jb2xvcjoge1xyXG4gICAgICAgICAgICB0eXBlOiBQYXJhbWV0ZXJUeXBlLlNUUklORyxcclxuICAgICAgICAgICAgcHJldHR5X25hbWU6IFwiQmFja2dyb3VuZCBjb2xvclwiLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiBcImdyYXlcIixcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8qKiBUaGUgdHlwZSBvZiBSREsgKHJlZmVyIHRvIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMpLiAqL1xyXG4gICAgICAgIFJES190eXBlOiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuSU5ULFxyXG4gICAgICAgICAgICBwcmV0dHlfbmFtZTogXCJSREsgdHlwZVwiLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAzLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLyoqIFRoZSBzaGFwZSBvZiB0aGUgYXBlcnR1cmUuICovXHJcbiAgICAgICAgYXBlcnR1cmVfdHlwZToge1xyXG4gICAgICAgICAgICB0eXBlOiBQYXJhbWV0ZXJUeXBlLklOVCxcclxuICAgICAgICAgICAgcHJldHR5X25hbWU6IFwiQXBlcnR1cmUgVHlwZVwiLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAyLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLyoqIFRoZSByZWluc2VydGlvbiBydWxlIGZvciBkb3RzIHRoYXQgbW92ZSBvdXQgb2YgdGhlIGFwZXJ0dXJlLiAqL1xyXG4gICAgICAgIHJlaW5zZXJ0X3R5cGU6IHtcclxuICAgICAgICAgICAgdHlwZTogUGFyYW1ldGVyVHlwZS5JTlQsXHJcbiAgICAgICAgICAgIHByZXR0eV9uYW1lOiBcIlJlaW5zZXJ0IHR5cGVcIixcclxuICAgICAgICAgICAgZGVmYXVsdDogMixcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8qKiBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGFwZXJ0dXJlLiAqL1xyXG4gICAgICAgIGFwZXJ0dXJlX2NlbnRlcl94OiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuSU5ULFxyXG4gICAgICAgICAgICBwcmV0dHlfbmFtZTogXCJBcGVydHVyZSBjZW50ZXIgWFwiLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiB3aW5kb3cuaW5uZXJXaWR0aCAvIDIsXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvKiogVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBhcGVydHVyZS4gKi9cclxuICAgICAgICBhcGVydHVyZV9jZW50ZXJfeToge1xyXG4gICAgICAgICAgICB0eXBlOiBQYXJhbWV0ZXJUeXBlLklOVCxcclxuICAgICAgICAgICAgcHJldHR5X25hbWU6IFwiQXBlcnR1cmUgY2VudGVyIFlcIixcclxuICAgICAgICAgICAgZGVmYXVsdDogd2luZG93LmlubmVySGVpZ2h0IC8gMixcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8qKiBJZiB0cnVlLCB0aGVuIGEgZml4YXRpb24gY3Jvc3Mgd2lsbCBiZSBwcmVzZW50IGluIHRoZSBtaWRkbGUgb2YgdGhlIHNjcmVlbi4gKi9cclxuICAgICAgICBmaXhhdGlvbl9jcm9zczoge1xyXG4gICAgICAgICAgICB0eXBlOiBQYXJhbWV0ZXJUeXBlLkJPT0wsXHJcbiAgICAgICAgICAgIHByZXR0eV9uYW1lOiBcIkZpeGF0aW9uIGNyb3NzXCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLyoqIFRoZSB3aWR0aCBvZiB0aGUgZml4YXRpb24gY3Jvc3MgaW4gcGl4ZWxzLiAqL1xyXG4gICAgICAgIGZpeGF0aW9uX2Nyb3NzX3dpZHRoOiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuSU5ULFxyXG4gICAgICAgICAgICBwcmV0dHlfbmFtZTogXCJGaXhhdGlvbiBjcm9zcyB3aWR0aFwiLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAyMCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSBmaXhhdGlvbiBjcm9zcyBpbiBwaXhlbHMuICovXHJcbiAgICAgICAgZml4YXRpb25fY3Jvc3NfaGVpZ2h0OiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuSU5ULFxyXG4gICAgICAgICAgICBwcmV0dHlfbmFtZTogXCJGaXhhdGlvbiBjcm9zcyBoZWlnaHRcIixcclxuICAgICAgICAgICAgZGVmYXVsdDogMjAsXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvKiogVGhlIGNvbG9yIG9mIHRoZSBmaXhhdGlvbiBjcm9zcy4gKi9cclxuICAgICAgICBmaXhhdGlvbl9jcm9zc19jb2xvcjoge1xyXG4gICAgICAgICAgICB0eXBlOiBQYXJhbWV0ZXJUeXBlLlNUUklORyxcclxuICAgICAgICAgICAgcHJldHR5X25hbWU6IFwiRml4YXRpb24gY3Jvc3MgY29sb3JcIixcclxuICAgICAgICAgICAgZGVmYXVsdDogXCJibGFja1wiLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLyoqIFRoZSB0aGlja25lc3Mgb2YgdGhlIGZpeGF0aW9uIGNyb3NzLiAqL1xyXG4gICAgICAgIGZpeGF0aW9uX2Nyb3NzX3RoaWNrbmVzczoge1xyXG4gICAgICAgICAgICB0eXBlOiBQYXJhbWV0ZXJUeXBlLklOVCxcclxuICAgICAgICAgICAgcHJldHR5X25hbWU6IFwiRml4YXRpb24gY3Jvc3MgdGhpY2tuZXNzXCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IDEsXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvKiogVGhlIHByZXNlbmNlIG9mIGEgYm9yZGVyIGFyb3VuZCB0aGUgYXBlcnR1cmUuICovXHJcbiAgICAgICAgYm9yZGVyOiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuQk9PTCxcclxuICAgICAgICAgICAgcHJldHR5X25hbWU6IFwiQm9yZGVyXCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLyoqIFRoZSB0aGlja25lc3Mgb2YgdGhlIGJvcmRlciBpbiBwaXhlbHMuICovXHJcbiAgICAgICAgYm9yZGVyX3RoaWNrbmVzczoge1xyXG4gICAgICAgICAgICB0eXBlOiBQYXJhbWV0ZXJUeXBlLklOVCxcclxuICAgICAgICAgICAgcHJldHR5X25hbWU6IFwiQm9yZGVyIHdpZHRoXCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IDEsXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvKiogVGhlIGNvbG9yIG9mIHRoZSBib3JkZXIuICovXHJcbiAgICAgICAgYm9yZGVyX2NvbG9yOiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuU1RSSU5HLFxyXG4gICAgICAgICAgICBwcmV0dHlfbmFtZTogXCJCb3JkZXIgQ29sb3JcIixcclxuICAgICAgICAgICAgZGVmYXVsdDogMSxcclxuICAgICAgICB9LFxyXG4gICAgfSxcclxufTtcclxuLyoqXHJcbiAqICoqUkRLKipcclxuICpcclxuICoganNQc3ljaCBwbHVnaW4gZm9yIHNob3dpbmcgYSByYW5kb20tZG90IGtpbmVtYXRvZ3JhbSBzdGltdWx1cyBhbmQgcmVjb3JkaW5nIGEga2V5Ym9hcmQgcmVzcG9uc2VcclxuICpcclxuICogQGF1dGhvciBTaXZhbmFuZGEgUmFqYW5hbmRhXHJcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vd3d3LmpzcHN5Y2gub3JnL3BsdWdpbnMvanNwc3ljaC1yZGsvIFJESyBwbHVnaW4gZG9jdW1lbnRhdGlvbiBvbiBqc3BzeWNoLm9yZ31cclxuICogQGNvcHlyaWdodFxyXG4gKlxyXG4gKiBUaGlzIGNvZGUgd2FzIGNyZWF0ZWQgaW4gdGhlIENvbnNjaW91c25lc3MgYW5kIE1ldGFjb2duaXRpb24gTGFiIGF0IFVDTEEsXHJcbiAqIHVuZGVyIHRoZSBzdXBlcnZpc2lvbiBvZiBCcmlhbiBPZGVnYWFyZCBhbmQgSGFrd2FuIExhdVxyXG4gKlxyXG4gKiBXZSB3b3VsZCBhcHByZWNpYXRlIGl0IGlmIHlvdSBjaXRlZCB0aGlzIHBhcGVyIHdoZW4geW91IHVzZSB0aGUgUkRLOlxyXG4gKiBSYWphbmFuZGEsIFMuLCBMYXUsIEguICYgT2RlZ2FhcmQsIEIuLCAoMjAxOCkuIEEgUmFuZG9tLURvdCBLaW5lbWF0b2dyYW0gZm9yIFdlYi1CYXNlZCBWaXNpb24gUmVzZWFyY2guIEpvdXJuYWwgb2YgT3BlbiBSZXNlYXJjaCBTb2Z0d2FyZS4gNigxKSwgcC42LiBET0k6IFtodHRwOi8vZG9pLm9yZy8xMC41MzM0L2pvcnMuMTk0XVxyXG4gKlxyXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAqXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNyAgU2l2YW5hbmRhIFJhamFuYW5kYVxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcclxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcclxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxyXG4gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gKlxyXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxyXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi5cclxuICovXHJcbmNsYXNzIFJka1BsdWdpbiB7XHJcbiAgICBjb25zdHJ1Y3Rvcihqc1BzeWNoKSB7XHJcbiAgICAgICAgdGhpcy5qc1BzeWNoID0ganNQc3ljaDtcclxuICAgIH1cclxuICAgIHRyaWFsKGRpc3BsYXlfZWxlbWVudCwgdHJpYWwpIHtcclxuICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgICAgLy8tLS0tLS0tLS1TRVQgUEFSQU1FVEVSUyBCRUdJTi0tLS0tLS0tLVxyXG4gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgICAvL05vdGUgb24gJ3x8JyBsb2dpY2FsIG9wZXJhdG9yOiBJZiB0aGUgZmlyc3Qgb3B0aW9uIGlzICd1bmRlZmluZWQnLCBpdCBldmFsdXRlcyB0byAnZmFsc2UnIGFuZCB0aGUgc2Vjb25kIG9wdGlvbiBpcyByZXR1cm5lZCBhcyB0aGUgYXNzaWdubWVudFxyXG4gICAgICAgIC8vIE5vdGU6IHRyaWFsIHByb3BlcnRpZXMgYXJlIG5vdyByZWFkLW9ubHksIHNvIHRoZXNlIHBhcmFtcyBoYXZlIGFsbCBiZWVuIGNoYW5nZWQgdG8gc2VwYXJhdGUgdmFyaWFibGVzIGhlcmUgYW5kIHRocm91Z2hvdXQgdHJpYWwgZnVuY3Rpb25cclxuICAgICAgICB2YXIgY2hvaWNlcyA9IGFzc2lnblBhcmFtZXRlclZhbHVlKHRyaWFsLmNob2ljZXMsIFtdKTtcclxuICAgICAgICB2YXIgY29ycmVjdF9jaG9pY2UgPSBhc3NpZ25QYXJhbWV0ZXJWYWx1ZSh0cmlhbC5jb3JyZWN0X2Nob2ljZSwgdW5kZWZpbmVkKTtcclxuICAgICAgICB2YXIgdHJpYWxfZHVyYXRpb24gPSBhc3NpZ25QYXJhbWV0ZXJWYWx1ZSh0cmlhbC50cmlhbF9kdXJhdGlvbiwgNTAwKTtcclxuICAgICAgICB2YXIgcmVzcG9uc2VfZW5kc190cmlhbCA9IGFzc2lnblBhcmFtZXRlclZhbHVlKHRyaWFsLnJlc3BvbnNlX2VuZHNfdHJpYWwsIHRydWUpO1xyXG4gICAgICAgIHZhciBudW1iZXJfb2ZfYXBlcnR1cmVzID0gYXNzaWduUGFyYW1ldGVyVmFsdWUodHJpYWwubnVtYmVyX29mX2FwZXJ0dXJlcywgMSk7XHJcbiAgICAgICAgdmFyIG51bWJlcl9vZl9kb3RzID0gYXNzaWduUGFyYW1ldGVyVmFsdWUodHJpYWwubnVtYmVyX29mX2RvdHMsIDMwMCk7XHJcbiAgICAgICAgdmFyIG51bWJlcl9vZl9zZXRzID0gYXNzaWduUGFyYW1ldGVyVmFsdWUodHJpYWwubnVtYmVyX29mX3NldHMsIDEpO1xyXG4gICAgICAgIHZhciBjb2hlcmVudF9kaXJlY3Rpb24gPSBhc3NpZ25QYXJhbWV0ZXJWYWx1ZSh0cmlhbC5jb2hlcmVudF9kaXJlY3Rpb24sIDApO1xyXG4gICAgICAgIHZhciBjb2hlcmVuY2UgPSBhc3NpZ25QYXJhbWV0ZXJWYWx1ZSh0cmlhbC5jb2hlcmVuY2UsIDAuNSk7XHJcbiAgICAgICAgdmFyIG9wcG9zaXRlX2NvaGVyZW5jZSA9IGFzc2lnblBhcmFtZXRlclZhbHVlKHRyaWFsLm9wcG9zaXRlX2NvaGVyZW5jZSwgMCk7XHJcbiAgICAgICAgdmFyIGRvdF9yYWRpdXMgPSBhc3NpZ25QYXJhbWV0ZXJWYWx1ZSh0cmlhbC5kb3RfcmFkaXVzLCAyKTtcclxuICAgICAgICB2YXIgZG90X3NpZGVfbGVuZ3RoID0gYXNzaWduUGFyYW1ldGVyVmFsdWUodHJpYWwuZG90X3NpZGVfbGVuZ3RoLCAxKTtcclxuICAgICAgICB2YXIgZG90X2xpZmUgPSBhc3NpZ25QYXJhbWV0ZXJWYWx1ZSh0cmlhbC5kb3RfbGlmZSwgLTEpO1xyXG4gICAgICAgIHZhciBtb3ZlX2Rpc3RhbmNlID0gYXNzaWduUGFyYW1ldGVyVmFsdWUodHJpYWwubW92ZV9kaXN0YW5jZSwgMSk7XHJcbiAgICAgICAgdmFyIGFwZXJ0dXJlX3dpZHRoID0gYXNzaWduUGFyYW1ldGVyVmFsdWUodHJpYWwuYXBlcnR1cmVfd2lkdGgsIDYwMCk7XHJcbiAgICAgICAgdmFyIGFwZXJ0dXJlX2hlaWdodCA9IGFzc2lnblBhcmFtZXRlclZhbHVlKHRyaWFsLmFwZXJ0dXJlX2hlaWdodCwgNDAwKTtcclxuICAgICAgICB2YXIgZG90X2NvbG9yID0gYXNzaWduUGFyYW1ldGVyVmFsdWUodHJpYWwuZG90X2NvbG9yLCBcIndoaXRlXCIpO1xyXG4gICAgICAgIHZhciBkb3Rfc2hhcGUgPSBhc3NpZ25QYXJhbWV0ZXJWYWx1ZSh0cmlhbC5kb3Rfc2hhcGUsIFwiY2lyY2xlXCIpO1xyXG4gICAgICAgIHZhciBiYWNrZ3JvdW5kX2NvbG9yID0gYXNzaWduUGFyYW1ldGVyVmFsdWUodHJpYWwuYmFja2dyb3VuZF9jb2xvciwgXCJncmF5XCIpO1xyXG4gICAgICAgIHZhciBSREtfdHlwZSA9IGFzc2lnblBhcmFtZXRlclZhbHVlKHRyaWFsLlJES190eXBlLCAzKTtcclxuICAgICAgICB2YXIgYXBlcnR1cmVfdHlwZSA9IGFzc2lnblBhcmFtZXRlclZhbHVlKHRyaWFsLmFwZXJ0dXJlX3R5cGUsIDIpO1xyXG4gICAgICAgIHZhciByZWluc2VydF90eXBlID0gYXNzaWduUGFyYW1ldGVyVmFsdWUodHJpYWwucmVpbnNlcnRfdHlwZSwgMik7XHJcbiAgICAgICAgdmFyIGFwZXJ0dXJlX2NlbnRlcl94ID0gYXNzaWduUGFyYW1ldGVyVmFsdWUodHJpYWwuYXBlcnR1cmVfY2VudGVyX3gsIHdpbmRvdy5pbm5lcldpZHRoIC8gMik7XHJcbiAgICAgICAgdmFyIGFwZXJ0dXJlX2NlbnRlcl95ID0gYXNzaWduUGFyYW1ldGVyVmFsdWUodHJpYWwuYXBlcnR1cmVfY2VudGVyX3ksIHdpbmRvdy5pbm5lckhlaWdodCAvIDIpO1xyXG4gICAgICAgIHZhciBmaXhhdGlvbl9jcm9zcyA9IGFzc2lnblBhcmFtZXRlclZhbHVlKHRyaWFsLmZpeGF0aW9uX2Nyb3NzLCBmYWxzZSk7XHJcbiAgICAgICAgdmFyIGZpeGF0aW9uX2Nyb3NzX3dpZHRoID0gYXNzaWduUGFyYW1ldGVyVmFsdWUodHJpYWwuZml4YXRpb25fY3Jvc3Nfd2lkdGgsIDIwKTtcclxuICAgICAgICB2YXIgZml4YXRpb25fY3Jvc3NfaGVpZ2h0ID0gYXNzaWduUGFyYW1ldGVyVmFsdWUodHJpYWwuZml4YXRpb25fY3Jvc3NfaGVpZ2h0LCAyMCk7XHJcbiAgICAgICAgdmFyIGZpeGF0aW9uX2Nyb3NzX2NvbG9yID0gYXNzaWduUGFyYW1ldGVyVmFsdWUodHJpYWwuZml4YXRpb25fY3Jvc3NfY29sb3IsIFwiYmxhY2tcIik7XHJcbiAgICAgICAgdmFyIGZpeGF0aW9uX2Nyb3NzX3RoaWNrbmVzcyA9IGFzc2lnblBhcmFtZXRlclZhbHVlKHRyaWFsLmZpeGF0aW9uX2Nyb3NzX3RoaWNrbmVzcywgMSk7XHJcbiAgICAgICAgdmFyIGJvcmRlciA9IGFzc2lnblBhcmFtZXRlclZhbHVlKHRyaWFsLmJvcmRlciwgZmFsc2UpO1xyXG4gICAgICAgIHZhciBib3JkZXJfdGhpY2tuZXNzID0gYXNzaWduUGFyYW1ldGVyVmFsdWUodHJpYWwuYm9yZGVyX3RoaWNrbmVzcywgMSk7XHJcbiAgICAgICAgdmFyIGJvcmRlcl9jb2xvciA9IGFzc2lnblBhcmFtZXRlclZhbHVlKHRyaWFsLmJvcmRlcl9jb2xvciwgXCJibGFja1wiKTtcclxuICAgICAgICAvL0ZvciBzcXVhcmUgYW5kIGNpcmNsZSwgc2V0IHRoZSBhcGVydHVyZSBoZWlnaHQgPT0gYXBlcnR1cmUgd2lkdGhcclxuICAgICAgICBpZiAoYXBlcnR1cmVUeXBlID09IDEgfHwgYXBlcnR1cmVUeXBlID09IDMpIHtcclxuICAgICAgICAgICAgYXBlcnR1cmVfaGVpZ2h0ID0gYXBlcnR1cmVfd2lkdGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vQ29udmVydCB0aGUgcGFyYW1ldGVyIHZhcmlhYmxlcyB0byB0aG9zZSB0aGF0IHRoZSBjb2RlIGJlbG93IGNhbiB1c2VcclxuICAgICAgICB2YXIgbkFwZXJ0dXJlcyA9IG51bWJlcl9vZl9hcGVydHVyZXM7IC8vVGhlIG51bWJlciBvZiBhcGVydHVyZXNcclxuICAgICAgICB2YXIgbkRvdHMgPSBudW1iZXJfb2ZfZG90czsgLy9OdW1iZXIgb2YgZG90cyBwZXIgc2V0IChlcXVpdmFsZW50IHRvIG51bWJlciBvZiBkb3RzIHBlciBmcmFtZSlcclxuICAgICAgICB2YXIgblNldHMgPSBudW1iZXJfb2Zfc2V0czsgLy9OdW1iZXIgb2Ygc2V0cyB0byBjeWNsZSB0aHJvdWdoIHBlciBmcmFtZVxyXG4gICAgICAgIHZhciBjb2hlcmVudERpcmVjdGlvbiA9IGNvaGVyZW50X2RpcmVjdGlvbjsgLy9UaGUgZGlyZWN0aW9uIG9mIHRoZSBjb2hlcmVudERvdHMgaW4gZGVncmVlcy4gU3RhcnRzIGF0IDMgbydjbG9jayBhbmQgZ29lcyBjb3VudGVyY2xvY2t3aXNlICgwID09IHJpZ2h0d2FyZHMsIDkwID09IHVwd2FyZHMsIDE4MCA9PSBsZWZ0d2FyZHMsIDI3MCA9PSBkb3dud2FyZHMpLCByYW5nZSAwIC0gMzYwXHJcbiAgICAgICAgdmFyIGNvaGVyZW5jZSA9IGNvaGVyZW5jZTsgLy9Qcm9wb3J0aW9uIG9mIGRvdHMgdG8gbW92ZSB0b2dldGhlciwgcmFuZ2UgZnJvbSAwIHRvIDFcclxuICAgICAgICB2YXIgb3Bwb3NpdGVDb2hlcmVuY2UgPSBvcHBvc2l0ZV9jb2hlcmVuY2U7IC8vIFRoZSBjb2hlcmVuY2UgZm9yIHRoZSBkb3RzIGdvaW5nIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24gYXMgdGhlIGNvaGVyZW50IGRvdHNcclxuICAgICAgICB2YXIgZG90UmFkaXVzID0gZG90X3JhZGl1czsgLy9SYWRpdXMgb2YgZWFjaCBkb3QgaW4gcGl4ZWxzXHJcbiAgICAgICAgdmFyIGRvdFNpZGVMZW5ndGggPSBkb3Rfc2lkZV9sZW5ndGg7IC8vIExlbmd0aCBvZiBkb3Qgc2lkZSBpbiBwaXhlbHMgKG9ubHkgd2hlbiBkb3Rfc2hhcGUgaXMgXCJzcXVhcmVcIilcclxuICAgICAgICB2YXIgZG90TGlmZSA9IGRvdF9saWZlOyAvL0hvdyBtYW55IGZyYW1lcyBhIGRvdCB3aWxsIGtlZXAgZm9sbG93aW5nIGl0cyB0cmFqZWN0b3J5IGJlZm9yZSBpdCBpcyByZWRyYXduIGF0IGEgcmFuZG9tIGxvY2F0aW9uLiAtMSBkZW5vdGVzIGluZmluaXRlIGxpZmUgKHRoZSBkb3Qgd2lsbCBvbmx5IGJlIHJlZHJhd24gaWYgaXQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBhcGVydHVyZSkuXHJcbiAgICAgICAgdmFyIG1vdmVEaXN0YW5jZSA9IG1vdmVfZGlzdGFuY2U7IC8vSG93IG1hbnkgcGl4ZWxzIHRoZSBkb3RzIG1vdmUgcGVyIGZyYW1lXHJcbiAgICAgICAgdmFyIGFwZXJ0dXJlV2lkdGggPSBhcGVydHVyZV93aWR0aDsgLy8gSG93IG1hbnkgcGl4ZWxzIHdpZGUgdGhlIGFwZXJ0dXJlIGlzLiBGb3Igc3F1YXJlIGFwZXJ0dXJlIHRoaXMgd2lsbCBiZSB0aGUgYm90aCBoZWlnaHQgYW5kIHdpZHRoLiBGb3IgY2lyY2xlLCB0aGlzIHdpbGwgYmUgdGhlIGRpYW1ldGVyLlxyXG4gICAgICAgIHZhciBhcGVydHVyZUhlaWdodCA9IGFwZXJ0dXJlX2hlaWdodDsgLy9Ib3cgbWFueSBwaXhlbHMgaGlnaCB0aGUgYXBlcnR1cmUgaXMuIE9ubHkgcmVsZXZhbnQgZm9yIGVsbGlwc2UgYW5kIHJlY3RhbmdsZSBhcGVydHVyZXMuIEZvciBjaXJjbGUgYW5kIHNxdWFyZSwgdGhpcyBpcyBpZ25vcmVkLlxyXG4gICAgICAgIHZhciBkb3RDb2xvciA9IGRvdF9jb2xvcjsgLy9Db2xvciBvZiB0aGUgZG90c1xyXG4gICAgICAgIHZhciBiYWNrZ3JvdW5kQ29sb3IgPSBiYWNrZ3JvdW5kX2NvbG9yOyAvL0NvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kXHJcbiAgICAgICAgdmFyIGFwZXJ0dXJlQ2VudGVyWCA9IGFwZXJ0dXJlX2NlbnRlcl94OyAvLyBUaGUgeC1jb29yZGluYXRlIG9mIGNlbnRlciBvZiB0aGUgYXBlcnR1cmUgb24gdGhlIHNjcmVlbiwgaW4gcGl4ZWxzXHJcbiAgICAgICAgdmFyIGFwZXJ0dXJlQ2VudGVyWSA9IGFwZXJ0dXJlX2NlbnRlcl95OyAvLyBUaGUgeS1jb29yZGluYXRlIG9mIGNlbnRlciBvZiB0aGUgYXBlcnR1cmUgb24gdGhlIHNjcmVlbiwgaW4gcGl4ZWxzXHJcbiAgICAgICAgLyoqIFJESyB0eXBlIHBhcmFtZXRlclxyXG4gICAgICAgICAgKiogU2VlIEZpZy4gMSBpbiBTY2FzZSwgQnJhZGRpY2ssIGFuZCBSYXltb25kICgxOTk2KSBmb3IgYSB2aXN1YWwgZGVwaWN0aW9uIG9mIHRoZXNlIGRpZmZlcmVudCBzaWduYWwgc2VsZWN0aW9uIHJ1bGVzIGFuZCBub2lzZSB0eXBlc1xyXG4gICAgXG4gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAgICAgU1VNTUFSWTpcclxuICAgIFxuICAgICAgICAgIFNpZ25hbCBTZWxlY3Rpb24gcnVsZTpcclxuICAgICAgICAgIC1TYW1lOiBFYWNoIGRvdCBpcyBkZXNpZ25hdGVkIHRvIGJlIGVpdGhlciBhIGNvaGVyZW50IGRvdCAoc2lnbmFsKSBvciBpbmNvaGVyZW50IGRvdCAobm9pc2UpIGFuZCB3aWxsIHJlbWFpbiBzbyB0aHJvdWdob3V0IGFsbCBmcmFtZXMgaW4gdGhlIGRpc3BsYXkuIENvaGVyZW50IGRvdHMgd2lsbCBhbHdheXMgbW92ZSBpbiB0aGUgZGlyZWN0aW9uIG9mIGNvaGVyZW50IG1vdGlvbiBpbiBhbGwgZnJhbWVzLlxyXG4gICAgICAgICAgLURpZmZlcmVudDogRWFjaCBkb3QgY2FuIGJlIGVpdGhlciBhIGNvaGVyZW50IGRvdCAoc2lnbmFsKSBvciBpbmNvaGVyZW50IGRvdCAobm9pc2UpIGFuZCB3aWxsIGJlIGRlc2lnbmF0ZWQgcmFuZG9tbHkgKHdlaWdodGVkIGJhc2VkIG9uIHRoZSBjb2hlcmVuY2UgbGV2ZWwpIGF0IGVhY2ggZnJhbWUuIE9ubHkgdGhlIGRvdHMgdGhhdCBhcmUgZGVzaWduYXRlZCB0byBiZSBjb2hlcmVudCBkb3RzIHdpbGwgbW92ZSBpbiB0aGUgZGlyZWN0aW9uIG9mIGNvaGVyZW50IG1vdGlvbiwgYnV0IG9ubHkgaW4gdGhhdCBmcmFtZS4gSW4gdGhlIG5leHQgZnJhbWUsIGVhY2ggZG90IHdpbGwgYmUgZGVzaWduYXRlZCByYW5kb21seSBhZ2FpbiBvbiB3aGV0aGVyIGl0IGlzIGEgY29oZXJlbnQgb3IgaW5jb2hlcmVudCBkb3QuXHJcbiAgICBcbiAgICAgICAgICBOb2lzZSBUeXBlOlxyXG4gICAgICAgICAgLVJhbmRvbSBwb3NpdGlvbjogVGhlIGluY29oZXJlbnQgZG90cyBhcHBlYXIgaW4gYSByYW5kb20gbG9jYXRpb24gaW4gdGhlIGFwZXJ0dXJlIGluIGVhY2ggZnJhbWVcclxuICAgICAgICAgIC1SYW5kb20gd2FsazogVGhlIGluY29oZXJlbnQgZG90cyB3aWxsIG1vdmUgaW4gYSByYW5kb20gZGlyZWN0aW9uIChkZXNpZ25hdGVkIHJhbmRvbWx5IGluIGVhY2ggZnJhbWUpIGluIGVhY2ggZnJhbWUuXHJcbiAgICAgICAgICAtUmFuZG9tIGRpcmVjdGlvbjogRWFjaCBpbmNvaGVyZW50IGRvdCBoYXMgaXRzIG93biBhbHRlcm5hdGl2ZSBkaXJlY3Rpb24gb2YgbW90aW9uIChkZXNpZ25hdGVkIHJhbmRvbWx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRyaWFsKSwgYW5kIG1vdmVzIGluIHRoYXQgZGlyZWN0aW9uIGluIGVhY2ggZnJhbWUuXHJcbiAgICBcbiAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICBcbiAgICAgICAgICAxIC0gc2FtZSAmJiByYW5kb20gcG9zaXRpb25cclxuICAgICAgICAgIDIgLSBzYW1lICYmIHJhbmRvbSB3YWxrXHJcbiAgICAgICAgICAzIC0gc2FtZSAmJiByYW5kb20gZGlyZWN0aW9uXHJcbiAgICAgICAgICA0IC0gZGlmZmVyZW50ICYmIHJhbmRvbSBwb3NpdGlvblxyXG4gICAgICAgICAgNSAtIGRpZmZlcmVudCAmJiByYW5kb20gd2Fsa1xyXG4gICAgICAgICAgNiAtIGRpZmZlcmVudCAmJiByYW5kb20gZGlyZWN0aW9uICAgICAgICAgKi9cclxuICAgICAgICB2YXIgUkRLID0gUkRLX3R5cGU7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICBTaGFwZSBvZiBhcGVydHVyZVxyXG4gICAgICAgICAgMSAtIENpcmNsZVxyXG4gICAgICAgICAgMiAtIEVsbGlwc2VcclxuICAgICAgICAgIDMgLSBTcXVhcmVcclxuICAgICAgICAgIDQgLSBSZWN0YW5nbGVcclxuICAgICAgICAgICovXHJcbiAgICAgICAgdmFyIGFwZXJ0dXJlVHlwZSA9IGFwZXJ0dXJlX3R5cGU7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICBTaGFwZSBvZiBkb3RzXHJcbiAgICAgICAgICBcImNpcmNsZVwiIChkZWZhdWx0KSBvciBcInNxdWFyZVwiXHJcbiAgICAgICAgICAqL1xyXG4gICAgICAgIHZhciBkb3RTaGFwZSA9IGRvdF9zaGFwZTtcclxuICAgICAgICAvKlxyXG4gICAgICAgICAgT3V0IG9mIEJvdW5kcyBEZWNpc2lvblxyXG4gICAgICAgICAgSG93IHdlIHJlaW5zZXJ0IGEgZG90IHRoYXQgaGFzIG1vdmVkIG91dHNpZGUgdGhlIGVkZ2VzIG9mIHRoZSBhcGVydHVyZTpcclxuICAgICAgICAgIDEgLSBSYW5kb21seSBhcHBlYXIgYW55d2hlcmUgaW4gdGhlIGFwZXJ0dXJlXHJcbiAgICAgICAgICAyIC0gQXBwZWFyIG9uIHRoZSBvcHBvc2l0ZSBlZGdlIG9mIHRoZSBhcGVydHVyZSAoUmFuZG9tIGlmIHNxdWFyZSBvciByZWN0YW5nbGUsIHJlZmxlY3RlZCBhYm91dCBvcmlnaW4gaW4gY2lyY2xlIGFuZCBlbGxpcHNlKVxyXG4gICAgICAgICAgKi9cclxuICAgICAgICB2YXIgcmVpbnNlcnRUeXBlID0gcmVpbnNlcnRfdHlwZTtcclxuICAgICAgICAvL0ZpeGF0aW9uIENyb3NzIFBhcmFtZXRlcnNcclxuICAgICAgICB2YXIgZml4YXRpb25Dcm9zcyA9IGZpeGF0aW9uX2Nyb3NzOyAvL1RvIGRpc3BsYXkgb3Igbm90IHRvIGRpc3BsYXkgdGhlIGNyb3NzXHJcbiAgICAgICAgdmFyIGZpeGF0aW9uQ3Jvc3NXaWR0aCA9IGZpeGF0aW9uX2Nyb3NzX3dpZHRoOyAvL1RoZSB3aWR0aCBvZiB0aGUgZml4YXRpb24gY3Jvc3MgaW4gcGl4ZWxzXHJcbiAgICAgICAgdmFyIGZpeGF0aW9uQ3Jvc3NIZWlnaHQgPSBmaXhhdGlvbl9jcm9zc19oZWlnaHQ7IC8vVGhlIGhlaWdodCBvZiB0aGUgZml4YXRpb24gY3Jvc3MgaW4gcGl4ZWxzXHJcbiAgICAgICAgdmFyIGZpeGF0aW9uQ3Jvc3NDb2xvciA9IGZpeGF0aW9uX2Nyb3NzX2NvbG9yOyAvL1RoZSBjb2xvciBvZiB0aGUgZml4YXRpb24gY3Jvc3NcclxuICAgICAgICB2YXIgZml4YXRpb25Dcm9zc1RoaWNrbmVzcyA9IGZpeGF0aW9uX2Nyb3NzX3RoaWNrbmVzczsgLy9UaGUgdGhpY2tuZXNzIG9mIHRoZSBmaXhhdGlvbiBjcm9zcywgbXVzdCBiZSBwb3NpdGl2ZSBudW1iZXIgYWJvdmUgMVxyXG4gICAgICAgIC8vQm9yZGVyIFBhcmFtZXRlcnNcclxuICAgICAgICB2YXIgYm9yZGVyID0gYm9yZGVyOyAvL1RvIGRpc3BsYXkgb3Igbm90IHRvIGRpc3BsYXkgdGhlIGJvcmRlclxyXG4gICAgICAgIHZhciBib3JkZXJUaGlja25lc3MgPSBib3JkZXJfdGhpY2tuZXNzOyAvL1RoZSB3aWR0aCBvZiB0aGUgYm9yZGVyIGluIHBpeGVsc1xyXG4gICAgICAgIHZhciBib3JkZXJDb2xvciA9IGJvcmRlcl9jb2xvcjsgLy9UaGUgY29sb3Igb2YgdGhlIGJvcmRlclxyXG4gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgICAvLy0tLS0tLS0tLS1TRVQgUEFSQU1FVEVSUyBFTkQtLS0tLS0tLS0tXHJcbiAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAgIC8vLS0tLS0tLS1TZXQgdXAgQ2FudmFzIGJlZ2luLS0tLS0tLVxyXG4gICAgICAgIC8vQ3JlYXRlIGEgY2FudmFzIGVsZW1lbnQgYW5kIGFwcGVuZCBpdCB0byB0aGUgRE9NXHJcbiAgICAgICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XHJcbiAgICAgICAgZGlzcGxheV9lbGVtZW50LmFwcGVuZENoaWxkKGNhbnZhcyk7XHJcbiAgICAgICAgLy9UaGUgZG9jdW1lbnQgYm9keSBJUyAnZGlzcGxheV9lbGVtZW50JyAoaS5lLiA8Ym9keSBjbGFzcz1cImpzcHN5Y2gtZGlzcGxheS1lbGVtZW50XCI+IC4uLi4gPC9ib2R5PiApXHJcbiAgICAgICAgdmFyIGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwianNwc3ljaC1kaXNwbGF5LWVsZW1lbnRcIilbMF07XHJcbiAgICAgICAgLy9TYXZlIHRoZSBjdXJyZW50IHNldHRpbmdzIHRvIGJlIHJlc3RvcmVkIGxhdGVyXHJcbiAgICAgICAgdmFyIG9yaWdpbmFsTWFyZ2luID0gYm9keS5zdHlsZS5tYXJnaW47XHJcbiAgICAgICAgdmFyIG9yaWdpbmFsUGFkZGluZyA9IGJvZHkuc3R5bGUucGFkZGluZztcclxuICAgICAgICB2YXIgb3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IgPSBib2R5LnN0eWxlLmJhY2tncm91bmRDb2xvcjtcclxuICAgICAgICAvL1JlbW92ZSB0aGUgbWFyZ2lucyBhbmQgcGFkZGluZ3Mgb2YgdGhlIGRpc3BsYXlfZWxlbWVudFxyXG4gICAgICAgIGJvZHkuc3R5bGUubWFyZ2luID0gXCIwXCI7XHJcbiAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nID0gXCIwXCI7XHJcbiAgICAgICAgYm9keS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBiYWNrZ3JvdW5kQ29sb3I7IC8vTWF0Y2ggdGhlIGJhY2tncm91bmQgb2YgdGhlIGRpc3BsYXkgZWxlbWVudCB0byB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgY2FudmFzIHNvIHRoYXQgdGhlIHJlbW92YWwgb2YgdGhlIGNhbnZhcyBhdCB0aGUgZW5kIG9mIHRoZSB0cmlhbCBpcyBub3Qgbm90aWNlZFxyXG4gICAgICAgIC8vUmVtb3ZlIHRoZSBtYXJnaW5zIGFuZCBwYWRkaW5nIG9mIHRoZSBjYW52YXNcclxuICAgICAgICBjYW52YXMuc3R5bGUubWFyZ2luID0gXCIwXCI7XHJcbiAgICAgICAgY2FudmFzLnN0eWxlLnBhZGRpbmcgPSBcIjBcIjtcclxuICAgICAgICAvLyB1c2UgYWJzb2x1dGUgcG9zaXRpb25pbmcgaW4gdG9wIGxlZnQgY29ybmVyIHRvIGdldCByaWQgb2Ygc2Nyb2xsIGJhcnNcclxuICAgICAgICBjYW52YXMuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XHJcbiAgICAgICAgY2FudmFzLnN0eWxlLnRvcCA9IFwiMFwiO1xyXG4gICAgICAgIGNhbnZhcy5zdHlsZS5sZWZ0ID0gXCIwXCI7XHJcbiAgICAgICAgLy9HZXQgdGhlIGNvbnRleHQgb2YgdGhlIGNhbnZhcyBzbyB0aGF0IGl0IGNhbiBiZSBwYWludGVkIG9uLlxyXG4gICAgICAgIHZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgICAgIC8vRGVjbGFyZSB2YXJpYWJsZXMgZm9yIHdpZHRoIGFuZCBoZWlnaHQsIGFuZCBhbHNvIHNldCB0aGUgY2FudmFzIHdpZHRoIGFuZCBoZWlnaHQgdG8gdGhlIHdpbmRvdyB3aWR0aCBhbmQgaGVpZ2h0XHJcbiAgICAgICAgdmFyIGNhbnZhc1dpZHRoID0gKGNhbnZhcy53aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoKTtcclxuICAgICAgICB2YXIgY2FudmFzSGVpZ2h0ID0gKGNhbnZhcy5oZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQpO1xyXG4gICAgICAgIC8vU2V0IHRoZSBjYW52YXMgYmFja2dyb3VuZCBjb2xvclxyXG4gICAgICAgIGNhbnZhcy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBiYWNrZ3JvdW5kQ29sb3I7XHJcbiAgICAgICAgLy8tLS0tLS0tLVNldCB1cCBDYW52YXMgZW5kLS0tLS0tLVxyXG4gICAgICAgIC8vLS0tLS0tLS1SREsgdmFyaWFibGVzIGFuZCBmdW5jdGlvbiBjYWxscyBiZWdpbi0tLS0tLS0tXHJcbiAgICAgICAgLy9UaGlzIGlzIHRoZSBtYWluIHBhcnQgb2YgdGhlIHRyaWFsIHRoYXQgbWFrZXMgZXZlcnl0aGluZyBydW5cclxuICAgICAgICAvL0dsb2JhbCB2YXJpYWJsZSBmb3IgdGhlIGN1cnJlbnQgYXBlcnR1cmUgbnVtYmVyXHJcbiAgICAgICAgdmFyIGN1cnJlbnRBcGVydHVyZU51bWJlcjtcclxuICAgICAgICAvLzNEIEFycmF5IHRvIGhvbGQgdGhlIGRvdHMgKDFzdCBEIGlzIEFwZXJ0dXJlcywgMm5kIEQgaXMgU2V0cywgM3JkIEQgaXMgRG90cylcclxuICAgICAgICB2YXIgZG90QXJyYXkzZCA9IFtdO1xyXG4gICAgICAgIC8vVmFyaWFibGVzIGZvciBkaWZmZXJlbnQgYXBlcnR1cmVzIChpbml0aWFsaXplZCBpbiBzZXRVcE11bHRpcGxlQXBlcnR1cmVzIGZ1bmN0aW9uIGJlbG93KVxyXG4gICAgICAgIHZhciBuRG90c0FycmF5O1xyXG4gICAgICAgIHZhciBuU2V0c0FycmF5O1xyXG4gICAgICAgIHZhciBjb2hlcmVudERpcmVjdGlvbkFycmF5O1xyXG4gICAgICAgIHZhciBjb2hlcmVuY2VBcnJheTtcclxuICAgICAgICB2YXIgb3Bwb3NpdGVDb2hlcmVuY2VBcnJheTtcclxuICAgICAgICB2YXIgZG90UmFkaXVzQXJyYXk7XHJcbiAgICAgICAgdmFyIGRvdFNpZGVMZW5ndGhBcnJheTtcclxuICAgICAgICB2YXIgZG90TGlmZUFycmF5O1xyXG4gICAgICAgIHZhciBtb3ZlRGlzdGFuY2VBcnJheTtcclxuICAgICAgICB2YXIgYXBlcnR1cmVXaWR0aEFycmF5O1xyXG4gICAgICAgIHZhciBhcGVydHVyZUhlaWdodEFycmF5O1xyXG4gICAgICAgIHZhciBkb3RDb2xvckFycmF5O1xyXG4gICAgICAgIHZhciBkb3RTaGFwZUFycmF5O1xyXG4gICAgICAgIHZhciBhcGVydHVyZUNlbnRlclhBcnJheTtcclxuICAgICAgICB2YXIgYXBlcnR1cmVDZW50ZXJZQXJyYXk7XHJcbiAgICAgICAgdmFyIFJES0FycmF5O1xyXG4gICAgICAgIHZhciBhcGVydHVyZVR5cGVBcnJheTtcclxuICAgICAgICB2YXIgcmVpbnNlcnRUeXBlQXJyYXk7XHJcbiAgICAgICAgdmFyIGZpeGF0aW9uQ3Jvc3NBcnJheTtcclxuICAgICAgICB2YXIgZml4YXRpb25Dcm9zc1dpZHRoQXJyYXk7XHJcbiAgICAgICAgdmFyIGZpeGF0aW9uQ3Jvc3NIZWlnaHRBcnJheTtcclxuICAgICAgICB2YXIgZml4YXRpb25Dcm9zc0NvbG9yQXJyYXk7XHJcbiAgICAgICAgdmFyIGZpeGF0aW9uQ3Jvc3NUaGlja25lc3NBcnJheTtcclxuICAgICAgICB2YXIgYm9yZGVyQXJyYXk7XHJcbiAgICAgICAgdmFyIGJvcmRlclRoaWNrbmVzc0FycmF5O1xyXG4gICAgICAgIHZhciBib3JkZXJDb2xvckFycmF5O1xyXG4gICAgICAgIC8vU2V0IHVwIHRoZSB2YXJpYWJsZXMgZm9yIHRoZSBhcGVydHVyZXNcclxuICAgICAgICBjb25zdCBzZXRVcE11bHRpcGxlQXBlcnR1cmVzID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBuRG90c0FycmF5ID0gc2V0UGFyYW1ldGVyKG5Eb3RzKTtcclxuICAgICAgICAgICAgblNldHNBcnJheSA9IHNldFBhcmFtZXRlcihuU2V0cyk7XHJcbiAgICAgICAgICAgIGNvaGVyZW50RGlyZWN0aW9uQXJyYXkgPSBzZXRQYXJhbWV0ZXIoY29oZXJlbnREaXJlY3Rpb24pO1xyXG4gICAgICAgICAgICBjb2hlcmVuY2VBcnJheSA9IHNldFBhcmFtZXRlcihjb2hlcmVuY2UpO1xyXG4gICAgICAgICAgICBvcHBvc2l0ZUNvaGVyZW5jZUFycmF5ID0gc2V0UGFyYW1ldGVyKG9wcG9zaXRlQ29oZXJlbmNlKTtcclxuICAgICAgICAgICAgZG90UmFkaXVzQXJyYXkgPSBzZXRQYXJhbWV0ZXIoZG90UmFkaXVzKTtcclxuICAgICAgICAgICAgZG90U2lkZUxlbmd0aEFycmF5ID0gc2V0UGFyYW1ldGVyKGRvdFNpZGVMZW5ndGgpO1xyXG4gICAgICAgICAgICBkb3RMaWZlQXJyYXkgPSBzZXRQYXJhbWV0ZXIoZG90TGlmZSk7XHJcbiAgICAgICAgICAgIG1vdmVEaXN0YW5jZUFycmF5ID0gc2V0UGFyYW1ldGVyKG1vdmVEaXN0YW5jZSk7XHJcbiAgICAgICAgICAgIGFwZXJ0dXJlV2lkdGhBcnJheSA9IHNldFBhcmFtZXRlcihhcGVydHVyZVdpZHRoKTtcclxuICAgICAgICAgICAgYXBlcnR1cmVIZWlnaHRBcnJheSA9IHNldFBhcmFtZXRlcihhcGVydHVyZUhlaWdodCk7XHJcbiAgICAgICAgICAgIGRvdENvbG9yQXJyYXkgPSBzZXRQYXJhbWV0ZXIoZG90Q29sb3IpO1xyXG4gICAgICAgICAgICBkb3RTaGFwZUFycmF5ID0gc2V0UGFyYW1ldGVyKGRvdFNoYXBlKTtcclxuICAgICAgICAgICAgYXBlcnR1cmVDZW50ZXJYQXJyYXkgPSBzZXRQYXJhbWV0ZXIoYXBlcnR1cmVDZW50ZXJYKTtcclxuICAgICAgICAgICAgYXBlcnR1cmVDZW50ZXJZQXJyYXkgPSBzZXRQYXJhbWV0ZXIoYXBlcnR1cmVDZW50ZXJZKTtcclxuICAgICAgICAgICAgUkRLQXJyYXkgPSBzZXRQYXJhbWV0ZXIoUkRLKTtcclxuICAgICAgICAgICAgYXBlcnR1cmVUeXBlQXJyYXkgPSBzZXRQYXJhbWV0ZXIoYXBlcnR1cmVUeXBlKTtcclxuICAgICAgICAgICAgcmVpbnNlcnRUeXBlQXJyYXkgPSBzZXRQYXJhbWV0ZXIocmVpbnNlcnRUeXBlKTtcclxuICAgICAgICAgICAgZml4YXRpb25Dcm9zc0FycmF5ID0gc2V0UGFyYW1ldGVyKGZpeGF0aW9uQ3Jvc3MpO1xyXG4gICAgICAgICAgICBmaXhhdGlvbkNyb3NzV2lkdGhBcnJheSA9IHNldFBhcmFtZXRlcihmaXhhdGlvbkNyb3NzV2lkdGgpO1xyXG4gICAgICAgICAgICBmaXhhdGlvbkNyb3NzSGVpZ2h0QXJyYXkgPSBzZXRQYXJhbWV0ZXIoZml4YXRpb25Dcm9zc0hlaWdodCk7XHJcbiAgICAgICAgICAgIGZpeGF0aW9uQ3Jvc3NDb2xvckFycmF5ID0gc2V0UGFyYW1ldGVyKGZpeGF0aW9uQ3Jvc3NDb2xvcik7XHJcbiAgICAgICAgICAgIGZpeGF0aW9uQ3Jvc3NUaGlja25lc3NBcnJheSA9IHNldFBhcmFtZXRlcihmaXhhdGlvbkNyb3NzVGhpY2tuZXNzKTtcclxuICAgICAgICAgICAgYm9yZGVyQXJyYXkgPSBzZXRQYXJhbWV0ZXIoYm9yZGVyKTtcclxuICAgICAgICAgICAgYm9yZGVyVGhpY2tuZXNzQXJyYXkgPSBzZXRQYXJhbWV0ZXIoYm9yZGVyVGhpY2tuZXNzKTtcclxuICAgICAgICAgICAgYm9yZGVyQ29sb3JBcnJheSA9IHNldFBhcmFtZXRlcihib3JkZXJDb2xvcik7XHJcbiAgICAgICAgICAgIGN1cnJlbnRTZXRBcnJheSA9IHNldFBhcmFtZXRlcigwKTsgLy9BbHdheXMgc3RhcnRzIGF0IHplcm9cclxuICAgICAgICAgICAgLy9Mb29wIHRocm91Z2ggdGhlIG51bWJlciBvZiBhcGVydHVyZXMgdG8gbWFrZSB0aGUgZG90c1xyXG4gICAgICAgICAgICBmb3IgKGN1cnJlbnRBcGVydHVyZU51bWJlciA9IDA7IGN1cnJlbnRBcGVydHVyZU51bWJlciA8IG5BcGVydHVyZXM7IGN1cnJlbnRBcGVydHVyZU51bWJlcisrKSB7XHJcbiAgICAgICAgICAgICAgICAvL0luaXRpYWxpemUgdGhlIHBhcmFtZXRlcnMgdG8gbWFrZSB0aGUgMmQgZG90IGFycmF5IChvbmUgZm9yIGVhY2ggYXBlcnR1cmUpO1xyXG4gICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUN1cnJlbnRBcGVydHVyZVBhcmFtZXRlcnMoY3VycmVudEFwZXJ0dXJlTnVtYmVyKTtcclxuICAgICAgICAgICAgICAgIC8vTWFrZSBlYWNoIDJkIGFycmF5IGFuZCBwdXNoIGl0IGludG8gdGhlIDNkIGFycmF5XHJcbiAgICAgICAgICAgICAgICBkb3RBcnJheTNkLnB1c2gobWFrZURvdEFycmF5MmQoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIC8vIFNldCB1cCBtdWx0aXBsZSBhcGVydHVyZXNcclxuICAgICAgICBzZXRVcE11bHRpcGxlQXBlcnR1cmVzKCk7XHJcbiAgICAgICAgLy9EZWNsYXJlIGFwZXJ0dXJlIHBhcmFtZXRlcnMgZm9yIGluaXRpYWxpemF0aW9uIGJhc2VkIG9uIHNoYXBlICh1c2VkIGluIGluaXRpYWxpemVBcGVydHVyZURpbWVuc2lvbnMgZnVuY3Rpb24gYmVsb3cpXHJcbiAgICAgICAgdmFyIGhvcml6b250YWxBeGlzO1xyXG4gICAgICAgIHZhciB2ZXJ0aWNhbEF4aXM7XHJcbiAgICAgICAgLy9DYWxjdWxhdGUgdGhlIHggYW5kIHkganVtcCBzaXplcyBmb3IgY29oZXJlbnQgZG90c1xyXG4gICAgICAgIHZhciBjb2hlcmVudEp1bXBTaXplWDtcclxuICAgICAgICB2YXIgY29oZXJlbnRKdW1wU2l6ZVk7XHJcbiAgICAgICAgLy9DYWxjdWxhdGUgdGhlIG51bWJlciBvZiBjb2hlcmVudCwgb3Bwb3NpdGUgY29oZXJlbnQsIGFuZCBpbmNvaGVyZW50IGRvdHNcclxuICAgICAgICB2YXIgbkNvaGVyZW50RG90cztcclxuICAgICAgICB2YXIgbk9wcG9zaXRlQ29oZXJlbnREb3RzO1xyXG4gICAgICAgIC8vTWFrZSB0aGUgYXJyYXkgb2YgYXJyYXlzIGNvbnRhaW5pbmcgZG90IG9iamVjdHNcclxuICAgICAgICB2YXIgZG90QXJyYXkyZDtcclxuICAgICAgICB2YXIgY3VycmVudFNldEFycmF5OyAvL0RlY2xhcmUgYW5kIGluaXRpYWxpemUgYSBnbG9iYWwgdmFyaWFibGUgdG8gY3ljbGUgdGhyb3VnaCB0aGUgZG90IGFycmF5c1xyXG4gICAgICAgIC8vSW5pdGlhbGl6ZSBzdG9wcGluZyBjb25kaXRpb24gZm9yIGFuaW1hdGVEb3RNb3Rpb24gZnVuY3Rpb24gdGhhdCBydW5zIGluIGEgbG9vcFxyXG4gICAgICAgIHZhciBzdG9wRG90TW90aW9uID0gZmFsc2U7XHJcbiAgICAgICAgLy9WYXJpYWJsZSB0byBzdGFydCB0aGUgdGltZXIgd2hlbiB0aGUgdGltZSBjb21lc1xyXG4gICAgICAgIHZhciB0aW1lckhhc1N0YXJ0ZWQgPSBmYWxzZTtcclxuICAgICAgICAvL0luaXRpYWxpemUgb2JqZWN0IHRvIHN0b3JlIHRoZSByZXNwb25zZSBkYXRhLiBEZWZhdWx0IHZhbHVlcyBvZiAtMSBhcmUgdXNlZCBpZiB0aGUgdHJpYWwgdGltZXMgb3V0IGFuZCB0aGUgc3ViamVjdCBoYXMgbm90IHByZXNzZWQgYSB2YWxpZCBrZXlcclxuICAgICAgICB2YXIgcmVzcG9uc2UgPSB7XHJcbiAgICAgICAgICAgIHJ0OiAtMSxcclxuICAgICAgICAgICAga2V5OiBcIlwiLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy9EZWNsYXJlIGEgZ2xvYmFsIHRpbWVvdXQgSUQgdG8gYmUgaW5pdGlhbGl6ZWQgYmVsb3cgaW4gYW5pbWF0ZURvdE1vdGlvbiBmdW5jdGlvbiBhbmQgdG8gYmUgdXNlZCBpbiBhZnRlcl9yZXNwb25zZSBmdW5jdGlvblxyXG4gICAgICAgIHZhciB0aW1lb3V0SUQ7XHJcbiAgICAgICAgLy9EZWNsYXJlIGdsb2JhbCB2YXJpYWJsZSB0byBiZSBkZWZpbmVkIGluIHN0YXJ0S2V5Ym9hcmRMaXN0ZW5lciBmdW5jdGlvbiBhbmQgdG8gYmUgdXNlZCBpbiBlbmRfdHJpYWwgZnVuY3Rpb25cclxuICAgICAgICB2YXIga2V5Ym9hcmRMaXN0ZW5lcjtcclxuICAgICAgICAvL0RlY2xhcmUgZ2xvYmFsIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSBmcmFtZSByYXRlIG9mIHRoZSB0cmlhbFxyXG4gICAgICAgIHZhciBmcmFtZVJhdGUgPSBbXTsgLy9Ib3cgb2Z0ZW4gdGhlIG1vbml0b3IgcmVmcmVzaGVzLCBpbiBtcy4gQ3VycmVudGx5IGFuIGFycmF5IHRvIHN0b3JlIGFsbCB0aGUgaW50ZXJ2YWxzLiBXaWxsIGJlIGNvbnZlcnRlZCBpbnRvIGEgc2luZ2xlIG51bWJlciAodGhlIGF2ZXJhZ2UpIGluIGVuZF90cmlhbCBmdW5jdGlvbi5cclxuICAgICAgICAvL3ZhcmlhYmxlIHRvIHN0b3JlIGhvdyBtYW55IGZyYW1lcyB3ZXJlIHByZXNlbnRlZC5cclxuICAgICAgICB2YXIgbnVtYmVyT2ZGcmFtZXMgPSAwO1xyXG4gICAgICAgIC8vIHNldCB1cCBkb3QtZHJhd2luZyBhYnN0cmFjdGlvbnNcclxuICAgICAgICBjb25zdCBwaTIgPSBNYXRoLlBJICogMjtcclxuICAgICAgICBjb25zdCBjaXJjbGVGbiA9ICh4LCB5LCByYWQpID0+IHtcclxuICAgICAgICAgICAgY3R4LmFyYyh4LCB5LCByYWQsIDAsIHBpMik7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBzcXVhcmVGbiA9ICh4LCB5LCBoYWxmX2xlbikgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBsZW4gPSBoYWxmX2xlbiAqIDI7XHJcbiAgICAgICAgICAgIGN0eC5yZWN0KHggLSBoYWxmX2xlbiwgeSAtIGhhbGZfbGVuLCBsZW4sIGxlbik7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvL0Z1bmN0aW9uIHRvIHN0YXJ0IHRoZSBrZXlib2FyZCBsaXN0ZW5lclxyXG4gICAgICAgIGNvbnN0IHN0YXJ0S2V5Ym9hcmRMaXN0ZW5lciA9ICgpID0+IHtcclxuICAgICAgICAgICAgLy9TdGFydCB0aGUgcmVzcG9uc2UgbGlzdGVuZXIgaWYgdGhlcmUgYXJlIGNob2ljZXMgZm9yIGtleXNcclxuICAgICAgICAgICAgaWYgKGNob2ljZXMgIT0gXCJOT19LRVlTXCIpIHtcclxuICAgICAgICAgICAgICAgIC8vQ3JlYXRlIHRoZSBrZXlib2FyZCBsaXN0ZW5lciB0byBsaXN0ZW4gZm9yIHN1YmplY3RzJyBrZXkgcmVzcG9uc2VcclxuICAgICAgICAgICAgICAgIGtleWJvYXJkTGlzdGVuZXIgPSB0aGlzLmpzUHN5Y2gucGx1Z2luQVBJLmdldEtleWJvYXJkUmVzcG9uc2Uoe1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX2Z1bmN0aW9uOiBhZnRlcl9yZXNwb25zZSxcclxuICAgICAgICAgICAgICAgICAgICB2YWxpZF9yZXNwb25zZXM6IGNob2ljZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgcnRfbWV0aG9kOiBcInBlcmZvcm1hbmNlXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgcGVyc2lzdDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dfaGVsZF9rZXk6IGZhbHNlLCAvL09ubHkgcmVnaXN0ZXIgdGhlIGtleSBvbmNlLCBhZnRlciB0aGlzIGdldEtleWJvYXJkUmVzcG9uc2UgZnVuY3Rpb24gaXMgY2FsbGVkLiAoQ2hlY2sgSnNQc3ljaCBkb2NzIGZvciBiZXR0ZXIgaW5mbyB1bmRlciAnanNQc3ljaC5wbHVnaW5BUEkuZ2V0S2V5Ym9hcmRSZXNwb25zZScpLlxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIC8vRnVuY3Rpb24gdG8gZW5kIHRoZSB0cmlhbCBwcm9wZXJcclxuICAgICAgICBjb25zdCBlbmRfdHJpYWwgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vU3RvcCB0aGUgZG90IG1vdGlvbiBhbmltYXRpb25cclxuICAgICAgICAgICAgc3RvcERvdE1vdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgIC8vU3RvcmUgdGhlIG51bWJlciBvZiBmcmFtZXNcclxuICAgICAgICAgICAgbnVtYmVyT2ZGcmFtZXMgPSBmcmFtZVJhdGUubGVuZ3RoO1xyXG4gICAgICAgICAgICAvL1ZhcmlhYmxlIHRvIHN0b3JlIHRoZSBmcmFtZSByYXRlIGFycmF5XHJcbiAgICAgICAgICAgIHZhciBmcmFtZVJhdGVBcnJheSA9IGZyYW1lUmF0ZTtcclxuICAgICAgICAgICAgLy9DYWxjdWxhdGUgdGhlIGF2ZXJhZ2UgZnJhbWUgcmF0ZVxyXG4gICAgICAgICAgICBpZiAobnVtYmVyT2ZGcmFtZXMgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL0NoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBhcnJheSBpcyBub3QgZW1wdHlcclxuICAgICAgICAgICAgICAgIGZyYW1lUmF0ZSA9XHJcbiAgICAgICAgICAgICAgICAgICAgZnJhbWVSYXRlLnJlZHVjZSgodG90YWwsIGN1cnJlbnQpID0+IHRvdGFsICsgY3VycmVudCkgLyBudW1iZXJPZkZyYW1lczsgLy9TdW0gdXAgYWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgYXJyYXlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZyYW1lUmF0ZSA9IDA7IC8vU2V0IHRvIHplcm8gaWYgdGhlIHN1YmplY3QgcHJlc3NlcyBhbiBhbnN3ZXIgYmVmb3JlIGEgZnJhbWUgaXMgc2hvd24gKGkuZS4gaWYgZnJhbWVSYXRlIGlzIGFuIGVtcHR5IGFycmF5KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vS2lsbCB0aGUga2V5Ym9hcmQgbGlzdGVuZXIgaWYga2V5Ym9hcmRMaXN0ZW5lciBoYXMgYmVlbiBkZWZpbmVkXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5Ym9hcmRMaXN0ZW5lciAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5qc1BzeWNoLnBsdWdpbkFQSS5jYW5jZWxLZXlib2FyZFJlc3BvbnNlKGtleWJvYXJkTGlzdGVuZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vUGxhY2UgYWxsIHRoZSBkYXRhIHRvIGJlIHNhdmVkIGZyb20gdGhpcyB0cmlhbCBpbiBvbmUgZGF0YSBvYmplY3RcclxuICAgICAgICAgICAgdmFyIHRyaWFsX2RhdGEgPSB7XHJcbiAgICAgICAgICAgICAgICBydDogcmVzcG9uc2UucnQsXHJcbiAgICAgICAgICAgICAgICByZXNwb25zZTogcmVzcG9uc2Uua2V5LFxyXG4gICAgICAgICAgICAgICAgY29ycmVjdDogY29ycmVjdE9yTm90KCksXHJcbiAgICAgICAgICAgICAgICBjaG9pY2VzOiBjaG9pY2VzLFxyXG4gICAgICAgICAgICAgICAgY29ycmVjdF9jaG9pY2U6IGNvcnJlY3RfY2hvaWNlLFxyXG4gICAgICAgICAgICAgICAgdHJpYWxfZHVyYXRpb246IHRyaWFsX2R1cmF0aW9uLFxyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VfZW5kc190cmlhbDogcmVzcG9uc2VfZW5kc190cmlhbCxcclxuICAgICAgICAgICAgICAgIG51bWJlcl9vZl9hcGVydHVyZXM6IG51bWJlcl9vZl9hcGVydHVyZXMsXHJcbiAgICAgICAgICAgICAgICBudW1iZXJfb2ZfZG90czogbnVtYmVyX29mX2RvdHMsXHJcbiAgICAgICAgICAgICAgICBudW1iZXJfb2Zfc2V0czogbnVtYmVyX29mX3NldHMsXHJcbiAgICAgICAgICAgICAgICBjb2hlcmVudF9kaXJlY3Rpb246IGNvaGVyZW50X2RpcmVjdGlvbixcclxuICAgICAgICAgICAgICAgIGNvaGVyZW5jZTogY29oZXJlbmNlLFxyXG4gICAgICAgICAgICAgICAgb3Bwb3NpdGVfY29oZXJlbmNlOiBvcHBvc2l0ZV9jb2hlcmVuY2UsXHJcbiAgICAgICAgICAgICAgICBkb3RfcmFkaXVzOiBkb3RfcmFkaXVzLFxyXG4gICAgICAgICAgICAgICAgZG90X3NpZGVfbGVuZ3RoOiBkb3Rfc2lkZV9sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICBkb3RfbGlmZTogZG90X2xpZmUsXHJcbiAgICAgICAgICAgICAgICBtb3ZlX2Rpc3RhbmNlOiBtb3ZlX2Rpc3RhbmNlLFxyXG4gICAgICAgICAgICAgICAgYXBlcnR1cmVfd2lkdGg6IGFwZXJ0dXJlX3dpZHRoLFxyXG4gICAgICAgICAgICAgICAgYXBlcnR1cmVfaGVpZ2h0OiBhcGVydHVyZV9oZWlnaHQsXHJcbiAgICAgICAgICAgICAgICBkb3RfY29sb3I6IGRvdF9jb2xvcixcclxuICAgICAgICAgICAgICAgIGRvdF9zaGFwZTogZG90X3NoYXBlLFxyXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZF9jb2xvcjogYmFja2dyb3VuZF9jb2xvcixcclxuICAgICAgICAgICAgICAgIFJES190eXBlOiBSREtfdHlwZSxcclxuICAgICAgICAgICAgICAgIGFwZXJ0dXJlX3R5cGU6IGFwZXJ0dXJlX3R5cGUsXHJcbiAgICAgICAgICAgICAgICByZWluc2VydF90eXBlOiByZWluc2VydF90eXBlLFxyXG4gICAgICAgICAgICAgICAgZnJhbWVfcmF0ZTogZnJhbWVSYXRlLFxyXG4gICAgICAgICAgICAgICAgZnJhbWVfcmF0ZV9hcnJheTogZnJhbWVSYXRlQXJyYXksXHJcbiAgICAgICAgICAgICAgICBudW1iZXJfb2ZfZnJhbWVzOiBudW1iZXJPZkZyYW1lcyxcclxuICAgICAgICAgICAgICAgIGFwZXJ0dXJlX2NlbnRlcl94OiBhcGVydHVyZV9jZW50ZXJfeCxcclxuICAgICAgICAgICAgICAgIGFwZXJ0dXJlX2NlbnRlcl95OiBhcGVydHVyZV9jZW50ZXJfeSxcclxuICAgICAgICAgICAgICAgIGZpeGF0aW9uX2Nyb3NzOiBmaXhhdGlvbl9jcm9zcyxcclxuICAgICAgICAgICAgICAgIGZpeGF0aW9uX2Nyb3NzX3dpZHRoOiBmaXhhdGlvbl9jcm9zc193aWR0aCxcclxuICAgICAgICAgICAgICAgIGZpeGF0aW9uX2Nyb3NzX2hlaWdodDogZml4YXRpb25fY3Jvc3NfaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgZml4YXRpb25fY3Jvc3NfY29sb3I6IGZpeGF0aW9uX2Nyb3NzX2NvbG9yLFxyXG4gICAgICAgICAgICAgICAgZml4YXRpb25fY3Jvc3NfdGhpY2tuZXNzOiBmaXhhdGlvbl9jcm9zc190aGlja25lc3MsXHJcbiAgICAgICAgICAgICAgICBib3JkZXI6IGJvcmRlcixcclxuICAgICAgICAgICAgICAgIGJvcmRlcl90aGlja25lc3M6IGJvcmRlcl90aGlja25lc3MsXHJcbiAgICAgICAgICAgICAgICBib3JkZXJfY29sb3I6IGJvcmRlcl9jb2xvcixcclxuICAgICAgICAgICAgICAgIGNhbnZhc193aWR0aDogY2FudmFzV2lkdGgsXHJcbiAgICAgICAgICAgICAgICBjYW52YXNfaGVpZ2h0OiBjYW52YXNIZWlnaHQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIC8vUmVtb3ZlIHRoZSBjYW52YXMgYXMgdGhlIGNoaWxkIG9mIHRoZSBkaXNwbGF5X2VsZW1lbnQgZWxlbWVudFxyXG4gICAgICAgICAgICBkaXNwbGF5X2VsZW1lbnQuaW5uZXJIVE1MID0gXCJcIjtcclxuICAgICAgICAgICAgLy9SZXN0b3JlIHRoZSBzZXR0aW5ncyB0byBKc1BzeWNoIGRlZmF1bHRzXHJcbiAgICAgICAgICAgIGJvZHkuc3R5bGUubWFyZ2luID0gb3JpZ2luYWxNYXJnaW47XHJcbiAgICAgICAgICAgIGJvZHkuc3R5bGUucGFkZGluZyA9IG9yaWdpbmFsUGFkZGluZztcclxuICAgICAgICAgICAgYm9keS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBvcmlnaW5hbEJhY2tncm91bmRDb2xvcjtcclxuICAgICAgICAgICAgLy9FbmQgdGhpcyB0cmlhbCBhbmQgbW92ZSBvbiB0byB0aGUgbmV4dCB0cmlhbFxyXG4gICAgICAgICAgICB0aGlzLmpzUHN5Y2guZmluaXNoVHJpYWwodHJpYWxfZGF0YSk7XHJcbiAgICAgICAgfTsgLy9FbmQgb2YgZW5kX3RyaWFsXHJcbiAgICAgICAgLy9UaGlzIHJ1bnMgdGhlIGRvdCBtb3Rpb24gc2ltdWxhdGlvbiwgdXBkYXRpbmcgaXQgYWNjb3JkaW5nIHRvIHRoZSBmcmFtZSByZWZyZXNoIHJhdGUgb2YgdGhlIHNjcmVlbi5cclxuICAgICAgICBhbmltYXRlRG90TW90aW9uKCk7XHJcbiAgICAgICAgLy8tLS0tLS0tLVJESyB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9uIGNhbGxzIGVuZC0tLS0tLS0tXHJcbiAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgICAgLy8tLS0tLS0tLS0tLUZVTkNUSU9OUyBCRUdJTi0tLS0tLS0tLS0tXHJcbiAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgICAgLy8tLS0tSnNQc3ljaCBGdW5jdGlvbnMgQmVnaW4tLS0tXHJcbiAgICAgICAgLy9GdW5jdGlvbiB0byByZWNvcmQgdGhlIGZpcnN0IHJlc3BvbnNlIGJ5IHRoZSBzdWJqZWN0XHJcbiAgICAgICAgZnVuY3Rpb24gYWZ0ZXJfcmVzcG9uc2UoaW5mbykge1xyXG4gICAgICAgICAgICAvL0lmIHRoZSByZXNwb25zZSBoYXMgbm90IGJlZW4gcmVjb3JkZWQsIHJlY29yZCBpdFxyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uua2V5ID09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gaW5mbzsgLy9SZXBsYWNlIHRoZSByZXNwb25zZSBvYmplY3QgY3JlYXRlZCBhYm92ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vSWYgdGhlIHBhcmFtZXRlciBpcyBzZXQgc3VjaCB0aGF0IHRoZSByZXNwb25zZSBlbmRzIHRoZSB0cmlhbCwgdGhlbiBraWxsIHRoZSB0aW1lb3V0IGFuZCBlbmQgdGhlIHRyaWFsXHJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV9lbmRzX3RyaWFsKSB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVvdXRJRCk7XHJcbiAgICAgICAgICAgICAgICBlbmRfdHJpYWwoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gLy9FbmQgb2YgYWZ0ZXJfcmVzcG9uc2VcclxuICAgICAgICAvL0Z1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyBpZiB0aGUgcmVzcG9uc2UgaXMgY29ycmVjdFxyXG4gICAgICAgIGNvbnN0IGNvcnJlY3RPck5vdCA9ICgpID0+IHtcclxuICAgICAgICAgICAgLy9DaGVjayB0aGF0IHRoZSBjb3JyZWN0X2Nob2ljZSBoYXMgYmVlbiBkZWZpbmVkIGFuZCB0aGF0IGl0IGlzIGFuIGFycmF5XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29ycmVjdF9jaG9pY2UgIT09IFwidW5kZWZpbmVkXCIgJiYgY29ycmVjdF9jaG9pY2UuY29uc3RydWN0b3IgPT09IEFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvcnJlY3RfY2hvaWNlWzBdID09PSBcInN0cmluZ1wiIHx8IGNvcnJlY3RfY2hvaWNlWzBdIGluc3RhbmNlb2YgU3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtleV9pbl9jaG9pY2VzID0gY29ycmVjdF9jaG9pY2UuZXZlcnkoKHgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuanNQc3ljaC5wbHVnaW5BUEkuY29tcGFyZUtleXMoeCwgcmVzcG9uc2Uua2V5KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5X2luX2Nob2ljZXM7IC8vSWYgdGhlIHJlc3BvbnNlIGlzIGluY2x1ZGVkIGluIHRoZSBjb3JyZWN0X2Nob2ljZSBhcnJheSwgcmV0dXJuIHRydWUuIEVsc2UsIHJldHVybiBmYWxzZS5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBjb3JyZWN0X2Nob2ljZVswXSA9PT0gXCJudW1iZXJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBlbGVtZW50cyBhcmUgbnVtYmVycyAoamF2YXNjcmlwdCBjaGFyYWN0ZXIgY29kZXMpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGluIFJESyBwbHVnaW46IGVsZW1lbnRzIGluIHRoZSBjb3JyZWN0X2Nob2ljZSBhcnJheSBtdXN0IGJlIGtleSBjaGFyYWN0ZXJzIChzdHJpbmdzKS5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBhZGRlZCBkdWUgdG8gVFMgZXJyb3I6IG5vdCBhbGwgY29kZSBwYXRocyByZXR1cm4gYSB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGluIFJESyBwbHVnaW46IGVsZW1lbnRzIGluIHRoZSBjb3JyZWN0X2Nob2ljZSBhcnJheSBtdXN0IGJlIGtleSBjaGFyYWN0ZXJzIChzdHJpbmdzKS5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBhZGRlZCBkdWUgdG8gVFMgZXJyb3I6IG5vdCBhbGwgY29kZSBwYXRocyByZXR1cm4gYSB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGluIFJESyBwbHVnaW46IHlvdSBtdXN0IHNwZWNpZnkgYW4gYXJyYXkgb2Yga2V5IGNoYXJhY3RlcnMgZm9yIHRoZSBjb3JyZWN0X2Nob2ljZSBwYXJhbWV0ZXIuXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBhZGRlZCBkdWUgdG8gVFMgZXJyb3I6IG5vdCBhbGwgY29kZSBwYXRocyByZXR1cm4gYSB2YWx1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvLy0tLS1Kc1BzeWNoIEZ1bmN0aW9ucyBFbmQtLS0tXHJcbiAgICAgICAgLy8tLS0tUkRLIEZ1bmN0aW9ucyBCZWdpbi0tLS1cclxuICAgICAgICAvL0Z1bmN0aW9uIHRvIHNldCB0aGUgcGFyYW1ldGVycyBvZiB0aGUgYXJyYXlcclxuICAgICAgICAvL0B0cy1leHBlY3QtZXJyb3IgXCJub3QgYWxsIGNvZGUgcGF0aHMgcmV0dXJuIGEgdmFsdWVcIlxyXG4gICAgICAgIGZ1bmN0aW9uIHNldFBhcmFtZXRlcihvcmlnaW5hbFZhcmlhYmxlKSB7XHJcbiAgICAgICAgICAgIC8vQ2hlY2sgaWYgaXQgaXMgYW4gYXJyYXkgYW5kIGl0cyBsZW5ndGggbWF0Y2hlcyB0aGUgYXBlcnR1cmUgdGhlbiByZXR1cm4gdGhlIG9yaWdpbmFsIGFycmF5XHJcbiAgICAgICAgICAgIGlmIChvcmlnaW5hbFZhcmlhYmxlLmNvbnN0cnVjdG9yID09PSBBcnJheSAmJiBvcmlnaW5hbFZhcmlhYmxlLmxlbmd0aCA9PT0gbkFwZXJ0dXJlcykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsVmFyaWFibGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9FbHNlIGlmIGl0IGlzIG5vdCBhbiBhcnJheSwgd2UgbWFrZSBpdCBhbiBhcnJheSB3aXRoIGR1cGxpY2F0ZSB2YWx1ZXNcclxuICAgICAgICAgICAgZWxzZSBpZiAob3JpZ2luYWxWYXJpYWJsZS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHtcclxuICAgICAgICAgICAgICAgIHZhciB0ZW1wQXJyYXkgPSBbXTtcclxuICAgICAgICAgICAgICAgIC8vTWFrZSBhIGZvciBsb29wIGFuZCBkdXBsaWNhdGUgdGhlIHZhbHVlc1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuQXBlcnR1cmVzOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wQXJyYXkucHVzaChvcmlnaW5hbFZhcmlhYmxlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB0ZW1wQXJyYXk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9FbHNlIGlmIHRoZSBhcnJheSBpcyBub3QgbG9uZyBlbm91Z2gsIHRoZW4gcHJpbnQgb3V0IHRoYXQgZXJyb3IgbWVzc2FnZVxyXG4gICAgICAgICAgICBlbHNlIGlmIChvcmlnaW5hbFZhcmlhYmxlLmNvbnN0cnVjdG9yID09PSBBcnJheSAmJiBvcmlnaW5hbFZhcmlhYmxlLmxlbmd0aCAhPT0gbkFwZXJ0dXJlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIklmIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgYXBlcnR1cmUsIHBsZWFzZSBlbnN1cmUgdGhhdCBhcnJheXMgdGhhdCBhcmUgcGFzc2VkIGluIGFzIHBhcmFtZXRlcnMgYXJlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgbnVtYmVyIG9mIGFwZXJ0dXJlcy4gRWxzZSB5b3UgY2FuIHVzZSBhIHNpbmdsZSB2YWx1ZSB3aXRob3V0IHRoZSBhcnJheVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL0Vsc2UgcHJpbnQgYSBnZW5lcmljIGVycm9yXHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkEgcGFyYW1ldGVyIGlzIGluY29ycmVjdGx5IHNldC4gUGxlYXNlIGVuc3VyZSB0aGF0IHRoZSBuQXBlcnR1cmVzIHBhcmFtZXRlciBpcyBzZXQgdG8gdGhlIGNvcnJlY3QgdmFsdWUgKGlmIHVzaW5nIG1vcmUgdGhhbiBvbmUgYXBlcnR1cmUpLCBhbmQgYWxsIG90aGVycyBwYXJhbWV0ZXJzIGFyZSBzZXQgY29ycmVjdGx5LlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvL0Z1bmN0aW9uIHRvIHNldCB0aGUgZ2xvYmFsIHZhcmlhYmxlcyB0byB0aGUgY3VycmVudCBhcGVydHVyZSBzbyB0aGF0IHRoZSBjb3JyZWN0IGRvdHMgYXJlIHVwZGF0ZWQgYW5kIGRyYXduXHJcbiAgICAgICAgZnVuY3Rpb24gaW5pdGlhbGl6ZUN1cnJlbnRBcGVydHVyZVBhcmFtZXRlcnMoY3VycmVudEFwZXJ0dXJlTnVtYmVyKSB7XHJcbiAgICAgICAgICAgIC8vU2V0IHRoZSBnbG9iYWwgdmFyaWFibGVzIHRvIHRoYXQgcmVsZXZhbnQgdG8gdGhlIGN1cnJlbnQgYXBlcnR1cmVcclxuICAgICAgICAgICAgbkRvdHMgPSBuRG90c0FycmF5W2N1cnJlbnRBcGVydHVyZU51bWJlcl07XHJcbiAgICAgICAgICAgIG5TZXRzID0gblNldHNBcnJheVtjdXJyZW50QXBlcnR1cmVOdW1iZXJdO1xyXG4gICAgICAgICAgICBjb2hlcmVudERpcmVjdGlvbiA9IGNvaGVyZW50RGlyZWN0aW9uQXJyYXlbY3VycmVudEFwZXJ0dXJlTnVtYmVyXTtcclxuICAgICAgICAgICAgY29oZXJlbmNlID0gY29oZXJlbmNlQXJyYXlbY3VycmVudEFwZXJ0dXJlTnVtYmVyXTtcclxuICAgICAgICAgICAgb3Bwb3NpdGVDb2hlcmVuY2UgPSBvcHBvc2l0ZUNvaGVyZW5jZUFycmF5W2N1cnJlbnRBcGVydHVyZU51bWJlcl07XHJcbiAgICAgICAgICAgIGRvdFJhZGl1cyA9IGRvdFJhZGl1c0FycmF5W2N1cnJlbnRBcGVydHVyZU51bWJlcl07XHJcbiAgICAgICAgICAgIGRvdFNpZGVMZW5ndGggPSBkb3RTaWRlTGVuZ3RoQXJyYXlbY3VycmVudEFwZXJ0dXJlTnVtYmVyXTtcclxuICAgICAgICAgICAgZG90TGlmZSA9IGRvdExpZmVBcnJheVtjdXJyZW50QXBlcnR1cmVOdW1iZXJdO1xyXG4gICAgICAgICAgICBtb3ZlRGlzdGFuY2UgPSBtb3ZlRGlzdGFuY2VBcnJheVtjdXJyZW50QXBlcnR1cmVOdW1iZXJdO1xyXG4gICAgICAgICAgICBhcGVydHVyZVdpZHRoID0gYXBlcnR1cmVXaWR0aEFycmF5W2N1cnJlbnRBcGVydHVyZU51bWJlcl07XHJcbiAgICAgICAgICAgIGFwZXJ0dXJlSGVpZ2h0ID0gYXBlcnR1cmVIZWlnaHRBcnJheVtjdXJyZW50QXBlcnR1cmVOdW1iZXJdO1xyXG4gICAgICAgICAgICBkb3RDb2xvciA9IGRvdENvbG9yQXJyYXlbY3VycmVudEFwZXJ0dXJlTnVtYmVyXTtcclxuICAgICAgICAgICAgZG90U2hhcGUgPSBkb3RTaGFwZUFycmF5W2N1cnJlbnRBcGVydHVyZU51bWJlcl07XHJcbiAgICAgICAgICAgIGFwZXJ0dXJlQ2VudGVyWCA9IGFwZXJ0dXJlQ2VudGVyWEFycmF5W2N1cnJlbnRBcGVydHVyZU51bWJlcl07XHJcbiAgICAgICAgICAgIGFwZXJ0dXJlQ2VudGVyWSA9IGFwZXJ0dXJlQ2VudGVyWUFycmF5W2N1cnJlbnRBcGVydHVyZU51bWJlcl07XHJcbiAgICAgICAgICAgIFJESyA9IFJES0FycmF5W2N1cnJlbnRBcGVydHVyZU51bWJlcl07XHJcbiAgICAgICAgICAgIGFwZXJ0dXJlVHlwZSA9IGFwZXJ0dXJlVHlwZUFycmF5W2N1cnJlbnRBcGVydHVyZU51bWJlcl07XHJcbiAgICAgICAgICAgIHJlaW5zZXJ0VHlwZSA9IHJlaW5zZXJ0VHlwZUFycmF5W2N1cnJlbnRBcGVydHVyZU51bWJlcl07XHJcbiAgICAgICAgICAgIGZpeGF0aW9uQ3Jvc3MgPSBmaXhhdGlvbkNyb3NzQXJyYXlbY3VycmVudEFwZXJ0dXJlTnVtYmVyXTtcclxuICAgICAgICAgICAgZml4YXRpb25Dcm9zc1dpZHRoID0gZml4YXRpb25Dcm9zc1dpZHRoQXJyYXlbY3VycmVudEFwZXJ0dXJlTnVtYmVyXTtcclxuICAgICAgICAgICAgZml4YXRpb25Dcm9zc0hlaWdodCA9IGZpeGF0aW9uQ3Jvc3NIZWlnaHRBcnJheVtjdXJyZW50QXBlcnR1cmVOdW1iZXJdO1xyXG4gICAgICAgICAgICBmaXhhdGlvbkNyb3NzQ29sb3IgPSBmaXhhdGlvbkNyb3NzQ29sb3JBcnJheVtjdXJyZW50QXBlcnR1cmVOdW1iZXJdO1xyXG4gICAgICAgICAgICBmaXhhdGlvbkNyb3NzVGhpY2tuZXNzID0gZml4YXRpb25Dcm9zc1RoaWNrbmVzc0FycmF5W2N1cnJlbnRBcGVydHVyZU51bWJlcl07XHJcbiAgICAgICAgICAgIGJvcmRlciA9IGJvcmRlckFycmF5W2N1cnJlbnRBcGVydHVyZU51bWJlcl07XHJcbiAgICAgICAgICAgIGJvcmRlclRoaWNrbmVzcyA9IGJvcmRlclRoaWNrbmVzc0FycmF5W2N1cnJlbnRBcGVydHVyZU51bWJlcl07XHJcbiAgICAgICAgICAgIGJvcmRlckNvbG9yID0gYm9yZGVyQ29sb3JBcnJheVtjdXJyZW50QXBlcnR1cmVOdW1iZXJdO1xyXG4gICAgICAgICAgICAvL0NhbGN1bGF0ZSB0aGUgeCBhbmQgeSBqdW1wIHNpemVzIGZvciBjb2hlcmVudCBkb3RzXHJcbiAgICAgICAgICAgIGNvaGVyZW50SnVtcFNpemVYID0gY2FsY3VsYXRlQ29oZXJlbnRKdW1wU2l6ZVgoY29oZXJlbnREaXJlY3Rpb24pO1xyXG4gICAgICAgICAgICBjb2hlcmVudEp1bXBTaXplWSA9IGNhbGN1bGF0ZUNvaGVyZW50SnVtcFNpemVZKGNvaGVyZW50RGlyZWN0aW9uKTtcclxuICAgICAgICAgICAgLy9Jbml0aWFsaXplIHRoZSBhcGVydHVyZSBwYXJhbWV0ZXJzXHJcbiAgICAgICAgICAgIGluaXRpYWxpemVBcGVydHVyZURpbWVuc2lvbnMoKTtcclxuICAgICAgICAgICAgLy9DYWxjdWxhdGUgdGhlIG51bWJlciBvZiBjb2hlcmVudCwgb3Bwb3NpdGUgY29oZXJlbnQsIGFuZCBpbmNvaGVyZW50IGRvdHNcclxuICAgICAgICAgICAgbkNvaGVyZW50RG90cyA9IG5Eb3RzICogY29oZXJlbmNlO1xyXG4gICAgICAgICAgICBuT3Bwb3NpdGVDb2hlcmVudERvdHMgPSBuRG90cyAqIG9wcG9zaXRlQ29oZXJlbmNlO1xyXG4gICAgICAgICAgICAvL0lmIHRoZSAzZCBhcnJheSBoYXMgYmVlbiBtYWRlLCB0aGVuIGNob29zZSB0aGUgMmQgYXJyYXkgYW5kIHRoZSBjdXJyZW50IHNldFxyXG4gICAgICAgICAgICBkb3RBcnJheTJkID0gZG90QXJyYXkzZC5sZW5ndGggIT09IDAgPyBkb3RBcnJheTNkW2N1cnJlbnRBcGVydHVyZU51bWJlcl0gOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSAvLyBFbmQgb2YgaW5pdGlhbGl6ZUN1cnJlbnRBcGVydHVyZVBhcmFtZXRlcnNcclxuICAgICAgICAvL0NhbGN1bGF0ZSBjb2hlcmVudCBqdW1wIHNpemUgaW4gdGhlIHggZGlyZWN0aW9uXHJcbiAgICAgICAgZnVuY3Rpb24gY2FsY3VsYXRlQ29oZXJlbnRKdW1wU2l6ZVgoY29oZXJlbnREaXJlY3Rpb24pIHtcclxuICAgICAgICAgICAgdmFyIGFuZ2xlSW5SYWRpYW5zID0gKGNvaGVyZW50RGlyZWN0aW9uICogTWF0aC5QSSkgLyAxODA7XHJcbiAgICAgICAgICAgIHJldHVybiBtb3ZlRGlzdGFuY2UgKiBNYXRoLmNvcyhhbmdsZUluUmFkaWFucyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vQ2FsY3VsYXRlIGNvaGVyZW50IGp1bXAgc2l6ZSBpbiB0aGUgeSBkaXJlY3Rpb25cclxuICAgICAgICBmdW5jdGlvbiBjYWxjdWxhdGVDb2hlcmVudEp1bXBTaXplWShjb2hlcmVudERpcmVjdGlvbikge1xyXG4gICAgICAgICAgICB2YXIgYW5nbGVJblJhZGlhbnMgPSAoLWNvaGVyZW50RGlyZWN0aW9uICogTWF0aC5QSSkgLyAxODA7IC8vTmVnYXRpdmUgc2lnbiBiZWNhdXNlIHRoZSB5LWF4aXMgaXMgZmxpcHBlZCBvbiBzY3JlZW5cclxuICAgICAgICAgICAgcmV0dXJuIG1vdmVEaXN0YW5jZSAqIE1hdGguc2luKGFuZ2xlSW5SYWRpYW5zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9Jbml0aWFsaXplIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYXBlcnR1cmUgZm9yIGZ1cnRoZXIgY2FsY3VsYXRpb25cclxuICAgICAgICBmdW5jdGlvbiBpbml0aWFsaXplQXBlcnR1cmVEaW1lbnNpb25zKCkge1xyXG4gICAgICAgICAgICAvL0ZvciBjaXJjbGUgYW5kIHNxdWFyZVxyXG4gICAgICAgICAgICBpZiAoYXBlcnR1cmVUeXBlID09IDEgfHwgYXBlcnR1cmVUeXBlID09IDMpIHtcclxuICAgICAgICAgICAgICAgIGhvcml6b250YWxBeGlzID0gdmVydGljYWxBeGlzID0gYXBlcnR1cmVXaWR0aCAvIDI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9Gb3IgZWxsaXBzZSBhbmQgcmVjdGFuZ2xlXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGFwZXJ0dXJlVHlwZSA9PSAyIHx8IGFwZXJ0dXJlVHlwZSA9PSA0KSB7XHJcbiAgICAgICAgICAgICAgICBob3Jpem9udGFsQXhpcyA9IGFwZXJ0dXJlV2lkdGggLyAyO1xyXG4gICAgICAgICAgICAgICAgdmVydGljYWxBeGlzID0gYXBlcnR1cmVIZWlnaHQgLyAyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vTWFrZSB0aGUgMmQgYXJyYXksIHdoaWNoIGlzIGFuIGFycmF5IG9mIGFycmF5IG9mIGRvdHNcclxuICAgICAgICBmdW5jdGlvbiBtYWtlRG90QXJyYXkyZCgpIHtcclxuICAgICAgICAgICAgLy9EZWNsYXJlIGFuIGFycmF5IHRvIGhvbGQgdGhlIHNldHMgb2YgZG90IGFycmF5c1xyXG4gICAgICAgICAgICB2YXIgdGVtcEFycmF5ID0gW107XHJcbiAgICAgICAgICAgIC8vTG9vcCBmb3IgZWFjaCBzZXQgb2YgZG90IGFycmF5XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgblNldHM7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdGVtcEFycmF5LnB1c2gobWFrZURvdEFycmF5KCkpOyAvL01ha2UgYSBkb3QgYXJyYXkgYW5kIHB1c2ggaXQgaW50byB0aGUgMmQgYXJyYXlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdGVtcEFycmF5O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL01ha2UgdGhlIGRvdCBhcnJheVxyXG4gICAgICAgIGZ1bmN0aW9uIG1ha2VEb3RBcnJheSgpIHtcclxuICAgICAgICAgICAgdmFyIHRlbXBBcnJheSA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5Eb3RzOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIC8vSW5pdGlhbGl6ZSBhIGRvdCB0byBiZSBtb2RpZmllZCBhbmQgaW5zZXJ0ZWQgaW50byB0aGUgYXJyYXlcclxuICAgICAgICAgICAgICAgIHZhciBkb3QgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgeDogMCxcclxuICAgICAgICAgICAgICAgICAgICB5OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHZ4OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHZ5OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHZ4MjogMCxcclxuICAgICAgICAgICAgICAgICAgICB2eTI6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgbGF0ZXN0WE1vdmU6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgbGF0ZXN0WU1vdmU6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgbGlmZUNvdW50OiBNYXRoLmZsb29yKHJhbmRvbU51bWJlckJldHdlZW4oMCwgZG90TGlmZSkpLFxyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVR5cGU6IFwiXCIsIC8vU3RyaW5nIHRvIGRldGVybWluZSBob3cgdGhpcyBkb3QgaXMgdXBkYXRlZFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIC8vcmFuZG9tbHkgc2V0IHRoZSB4IGFuZCB5IGNvb3JkaW5hdGVzXHJcbiAgICAgICAgICAgICAgICBkb3QgPSByZXNldExvY2F0aW9uKGRvdCk7XHJcbiAgICAgICAgICAgICAgICAvL0ZvciB0aGUgc2FtZSAmJiByYW5kb20gcG9zaXRpb24gUkRLIHR5cGVcclxuICAgICAgICAgICAgICAgIGlmIChSREsgPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vRm9yIGNvaGVyZW50IGRvdHNcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IG5Db2hlcmVudERvdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG90ID0gc2V0dnh2eShkb3QpOyAvLyBTZXQgZG90LnZ4IGFuZCBkb3QudnlcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG90LnVwZGF0ZVR5cGUgPSBcImNvbnN0YW50IGRpcmVjdGlvblwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvL0ZvciBvcHBvc2l0ZSBjb2hlcmVudCBkb3RzXHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaSA+PSBuQ29oZXJlbnREb3RzICYmIGkgPCBuQ29oZXJlbnREb3RzICsgbk9wcG9zaXRlQ29oZXJlbnREb3RzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvdCA9IHNldHZ4dnkoZG90KTsgLy8gU2V0IGRvdC52eCBhbmQgZG90LnZ5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvdC51cGRhdGVUeXBlID0gXCJvcHBvc2l0ZSBkaXJlY3Rpb25cIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy9Gb3IgaW5jb2hlcmVudCBkb3RzXHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvdC51cGRhdGVUeXBlID0gXCJyYW5kb20gcG9zaXRpb25cIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IC8vRW5kIG9mIFJESz09MVxyXG4gICAgICAgICAgICAgICAgLy9Gb3IgdGhlIHNhbWUgJiYgcmFuZG9tIHdhbGsgUkRLIHR5cGVcclxuICAgICAgICAgICAgICAgIGlmIChSREsgPT0gMikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vRm9yIGNvaGVyZW50IGRvdHNcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IG5Db2hlcmVudERvdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG90ID0gc2V0dnh2eShkb3QpOyAvLyBTZXQgZG90LnZ4IGFuZCBkb3QudnlcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG90LnVwZGF0ZVR5cGUgPSBcImNvbnN0YW50IGRpcmVjdGlvblwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvL0ZvciBvcHBvc2l0ZSBjb2hlcmVudCBkb3RzXHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaSA+PSBuQ29oZXJlbnREb3RzICYmIGkgPCBuQ29oZXJlbnREb3RzICsgbk9wcG9zaXRlQ29oZXJlbnREb3RzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvdCA9IHNldHZ4dnkoZG90KTsgLy8gU2V0IGRvdC52eCBhbmQgZG90LnZ5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvdC51cGRhdGVUeXBlID0gXCJvcHBvc2l0ZSBkaXJlY3Rpb25cIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy9Gb3IgaW5jb2hlcmVudCBkb3RzXHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvdC51cGRhdGVUeXBlID0gXCJyYW5kb20gd2Fsa1wiO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gLy9FbmQgb2YgUkRLPT0yXHJcbiAgICAgICAgICAgICAgICAvL0ZvciB0aGUgc2FtZSAmJiByYW5kb20gZGlyZWN0aW9uIFJESyB0eXBlXHJcbiAgICAgICAgICAgICAgICBpZiAoUkRLID09IDMpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL0ZvciBjb2hlcmVudCBkb3RzXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBuQ29oZXJlbnREb3RzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvdCA9IHNldHZ4dnkoZG90KTsgLy8gU2V0IGRvdC52eCBhbmQgZG90LnZ5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvdC51cGRhdGVUeXBlID0gXCJjb25zdGFudCBkaXJlY3Rpb25cIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy9Gb3Igb3Bwb3NpdGUgY29oZXJlbnQgZG90c1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgPj0gbkNvaGVyZW50RG90cyAmJiBpIDwgbkNvaGVyZW50RG90cyArIG5PcHBvc2l0ZUNvaGVyZW50RG90cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb3QgPSBzZXR2eHZ5KGRvdCk7IC8vIFNldCBkb3QudnggYW5kIGRvdC52eVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb3QudXBkYXRlVHlwZSA9IFwib3Bwb3NpdGUgZGlyZWN0aW9uXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vRm9yIGluY29oZXJlbnQgZG90c1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXR2eDJ2eTIoZG90KTsgLy8gU2V0IGRvdC52eDIgYW5kIGRvdC52eTJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG90LnVwZGF0ZVR5cGUgPSBcInJhbmRvbSBkaXJlY3Rpb25cIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IC8vRW5kIG9mIFJESz09M1xyXG4gICAgICAgICAgICAgICAgLy9Gb3IgdGhlIGRpZmZlcmVudCAmJiByYW5kb20gcG9zaXRpb24gUkRLIHR5cGVcclxuICAgICAgICAgICAgICAgIGlmIChSREsgPT0gNCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vRm9yIGFsbCBkb3RzXHJcbiAgICAgICAgICAgICAgICAgICAgZG90ID0gc2V0dnh2eShkb3QpOyAvLyBTZXQgZG90LnZ4IGFuZCBkb3QudnlcclxuICAgICAgICAgICAgICAgICAgICBkb3QudXBkYXRlVHlwZSA9IFwiY29uc3RhbnQgZGlyZWN0aW9uIG9yIG9wcG9zaXRlIGRpcmVjdGlvbiBvciByYW5kb20gcG9zaXRpb25cIjtcclxuICAgICAgICAgICAgICAgIH0gLy9FbmQgb2YgUkRLPT00XHJcbiAgICAgICAgICAgICAgICAvL0ZvciB0aGUgZGlmZmVyZW50ICYmIHJhbmRvbSB3YWxrIFJESyB0eXBlXHJcbiAgICAgICAgICAgICAgICBpZiAoUkRLID09IDUpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL0ZvciBhbGwgZG90c1xyXG4gICAgICAgICAgICAgICAgICAgIGRvdCA9IHNldHZ4dnkoZG90KTsgLy8gU2V0IGRvdC52eCBhbmQgZG90LnZ5XHJcbiAgICAgICAgICAgICAgICAgICAgZG90LnVwZGF0ZVR5cGUgPSBcImNvbnN0YW50IGRpcmVjdGlvbiBvciBvcHBvc2l0ZSBkaXJlY3Rpb24gb3IgcmFuZG9tIHdhbGtcIjtcclxuICAgICAgICAgICAgICAgIH0gLy9FbmQgb2YgUkRLPT01XHJcbiAgICAgICAgICAgICAgICAvL0ZvciB0aGUgZGlmZmVyZW50ICYmIHJhbmRvbSBkaXJlY3Rpb24gUkRLIHR5cGVcclxuICAgICAgICAgICAgICAgIGlmIChSREsgPT0gNikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vRm9yIGFsbCBkb3RzXHJcbiAgICAgICAgICAgICAgICAgICAgZG90ID0gc2V0dnh2eShkb3QpOyAvLyBTZXQgZG90LnZ4IGFuZCBkb3QudnlcclxuICAgICAgICAgICAgICAgICAgICAvL0VhY2ggZG90IHdpbGwgaGF2ZSBpdHMgb3duIGFsdGVybmF0ZSBkaXJlY3Rpb24gb2YgbW90aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0dngydnkyKGRvdCk7IC8vIFNldCBkb3QudngyIGFuZCBkb3QudnkyXHJcbiAgICAgICAgICAgICAgICAgICAgZG90LnVwZGF0ZVR5cGUgPSBcImNvbnN0YW50IGRpcmVjdGlvbiBvciBvcHBvc2l0ZSBkaXJlY3Rpb24gb3IgcmFuZG9tIGRpcmVjdGlvblwiO1xyXG4gICAgICAgICAgICAgICAgfSAvL0VuZCBvZiBSREs9PTZcclxuICAgICAgICAgICAgICAgIHRlbXBBcnJheS5wdXNoKGRvdCk7XHJcbiAgICAgICAgICAgIH0gLy9FbmQgb2YgZm9yIGxvb3BcclxuICAgICAgICAgICAgcmV0dXJuIHRlbXBBcnJheTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9GdW5jdGlvbiB0byB1cGRhdGUgYWxsIHRoZSBkb3RzIGFsbCB0aGUgYXBlcnR1cmVzIGFuZCB0aGVuIGRyYXcgdGhlbVxyXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUFuZERyYXcoKSB7XHJcbiAgICAgICAgICAgIC8vVGhyZWUgZm9yIGxvb3BzIHRoYXQgZG8gdGhpbmdzIGluIHNlcXVlbmNlOiBjbGVhciwgdXBkYXRlLCBhbmQgZHJhdyBkb3RzLlxyXG4gICAgICAgICAgICAvLyBDbGVhciBhbGwgdGhlIGN1cnJlbnQgZG90c1xyXG4gICAgICAgICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XHJcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBhbGwgdGhlIHJlbGV2YW50IGRvdHNcclxuICAgICAgICAgICAgZm9yIChjdXJyZW50QXBlcnR1cmVOdW1iZXIgPSAwOyBjdXJyZW50QXBlcnR1cmVOdW1iZXIgPCBuQXBlcnR1cmVzOyBjdXJyZW50QXBlcnR1cmVOdW1iZXIrKykge1xyXG4gICAgICAgICAgICAgICAgLy9Jbml0aWFsaXplIHRoZSB2YXJpYWJsZXMgZm9yIGVhY2ggcGFyYW1ldGVyXHJcbiAgICAgICAgICAgICAgICBpbml0aWFsaXplQ3VycmVudEFwZXJ0dXJlUGFyYW1ldGVycyhjdXJyZW50QXBlcnR1cmVOdW1iZXIpO1xyXG4gICAgICAgICAgICAgICAgLy9VcGRhdGUgdGhlIGRvdHNcclxuICAgICAgICAgICAgICAgIHVwZGF0ZURvdHMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBEcmF3IGFsbCB0aGUgcmVsZXZhbnQgZG90cyBvbiB0aGUgY2FudmFzXHJcbiAgICAgICAgICAgIGZvciAoY3VycmVudEFwZXJ0dXJlTnVtYmVyID0gMDsgY3VycmVudEFwZXJ0dXJlTnVtYmVyIDwgbkFwZXJ0dXJlczsgY3VycmVudEFwZXJ0dXJlTnVtYmVyKyspIHtcclxuICAgICAgICAgICAgICAgIC8vSW5pdGlhbGl6ZSB0aGUgdmFyaWFibGVzIGZvciBlYWNoIHBhcmFtZXRlclxyXG4gICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUN1cnJlbnRBcGVydHVyZVBhcmFtZXRlcnMoY3VycmVudEFwZXJ0dXJlTnVtYmVyKTtcclxuICAgICAgICAgICAgICAgIC8vRHJhdyBvbiB0aGUgY2FudmFzXHJcbiAgICAgICAgICAgICAgICBkcmF3KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9EcmF3IHRoZSBmaXhhdGlvbiBjcm9zcyBpZiB3ZSB3YW50IGl0XHJcbiAgICAgICAgICAgIGlmIChmaXhhdGlvbkNyb3NzID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAvL0hvcml6b250YWwgbGluZVxyXG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xyXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IGZpeGF0aW9uQ3Jvc3NUaGlja25lc3M7XHJcbiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKGNhbnZhc1dpZHRoIC8gMiAtIGZpeGF0aW9uQ3Jvc3NXaWR0aCwgY2FudmFzSGVpZ2h0IC8gMik7XHJcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGNhbnZhc1dpZHRoIC8gMiArIGZpeGF0aW9uQ3Jvc3NXaWR0aCwgY2FudmFzSGVpZ2h0IC8gMik7XHJcbiAgICAgICAgICAgICAgICAvL1ZlcnRpY2FsIGxpbmVcclxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oY2FudmFzV2lkdGggLyAyLCBjYW52YXNIZWlnaHQgLyAyIC0gZml4YXRpb25Dcm9zc0hlaWdodCk7XHJcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGNhbnZhc1dpZHRoIC8gMiwgY2FudmFzSGVpZ2h0IC8gMiArIGZpeGF0aW9uQ3Jvc3NIZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gZml4YXRpb25Dcm9zc0NvbG9yO1xyXG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vRHJhdyB0aGUgZG90cyBvbiB0aGUgY2FudmFzIGFmdGVyIHRoZXkncmUgdXBkYXRlZFxyXG4gICAgICAgIGZ1bmN0aW9uIGRyYXcoKSB7XHJcbiAgICAgICAgICAgIC8vTG9hZCBpbiB0aGUgY3VycmVudCBzZXQgb2YgZG90IGFycmF5IGZvciBlYXN5IGhhbmRsaW5nXHJcbiAgICAgICAgICAgIGNvbnN0IGRvdEFycmF5ID0gZG90QXJyYXkyZFtjdXJyZW50U2V0QXJyYXlbY3VycmVudEFwZXJ0dXJlTnVtYmVyXV07XHJcbiAgICAgICAgICAgIGxldCBkcmF3Rm47XHJcbiAgICAgICAgICAgIGxldCBkb3Rfc2l6ZTtcclxuICAgICAgICAgICAgaWYgKGRvdFNoYXBlID09IFwic3F1YXJlXCIpIHtcclxuICAgICAgICAgICAgICAgIGRyYXdGbiA9IHNxdWFyZUZuO1xyXG4gICAgICAgICAgICAgICAgZG90X3NpemUgPSBkb3RTaWRlTGVuZ3RoICogMC41O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZHJhd0ZuID0gY2lyY2xlRm47XHJcbiAgICAgICAgICAgICAgICBkb3Rfc2l6ZSA9IGRvdFJhZGl1cztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL0xvb3AgdGhyb3VnaCB0aGUgZG90cyBvbmUgYnkgb25lIGFuZCBkcmF3IHRoZW1cclxuICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGRvdENvbG9yO1xyXG4gICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbkRvdHM7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZG90ID0gZG90QXJyYXlbaV07XHJcbiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKGRvdC54ICsgZG90X3NpemUsIGRvdC55KTtcclxuICAgICAgICAgICAgICAgIGRyYXdGbihkb3QueCwgZG90LnksIGRvdF9zaXplKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdHguZmlsbCgpO1xyXG4gICAgICAgICAgICAvL0RyYXcgdGhlIGJvcmRlciBpZiB3ZSB3YW50IGl0XHJcbiAgICAgICAgICAgIGlmIChib3JkZXIgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIC8vRm9yIGNpcmNsZSBhbmQgZWxsaXBzZVxyXG4gICAgICAgICAgICAgICAgaWYgKGFwZXJ0dXJlVHlwZSA9PT0gMSB8fCBhcGVydHVyZVR5cGUgPT09IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICBjdHgubGluZVdpZHRoID0gYm9yZGVyVGhpY2tuZXNzO1xyXG4gICAgICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IGJvcmRlckNvbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTtcclxuICAgICAgICAgICAgICAgICAgICBjdHguZWxsaXBzZShhcGVydHVyZUNlbnRlclgsIGFwZXJ0dXJlQ2VudGVyWSwgaG9yaXpvbnRhbEF4aXMgKyBib3JkZXJUaGlja25lc3MgLyAyLCB2ZXJ0aWNhbEF4aXMgKyBib3JkZXJUaGlja25lc3MgLyAyLCAwLCAwLCBwaTIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKTtcclxuICAgICAgICAgICAgICAgIH0gLy9FbmQgb2YgaWYgY2lyY2xlIG9yIGVsbGlwc2VcclxuICAgICAgICAgICAgICAgIC8vRm9yIHNxdWFyZSBhbmQgcmVjdGFuZ2xlXHJcbiAgICAgICAgICAgICAgICBpZiAoYXBlcnR1cmVUeXBlID09PSAzIHx8IGFwZXJ0dXJlVHlwZSA9PT0gNCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSBib3JkZXJUaGlja25lc3M7XHJcbiAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gYm9yZGVyQ29sb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZVJlY3QoYXBlcnR1cmVDZW50ZXJYIC0gaG9yaXpvbnRhbEF4aXMgLSBib3JkZXJUaGlja25lc3MgLyAyLCBhcGVydHVyZUNlbnRlclkgLSB2ZXJ0aWNhbEF4aXMgLSBib3JkZXJUaGlja25lc3MgLyAyLCBob3Jpem9udGFsQXhpcyAqIDIgKyBib3JkZXJUaGlja25lc3MsIHZlcnRpY2FsQXhpcyAqIDIgKyBib3JkZXJUaGlja25lc3MpO1xyXG4gICAgICAgICAgICAgICAgfSAvL0VuZCBvZiBpZiBzcXVhcmUgb3JcclxuICAgICAgICAgICAgfSAvL0VuZCBvZiBpZiBib3JkZXIgPT09IHRydWVcclxuICAgICAgICB9IC8vRW5kIG9mIGRyYXdcclxuICAgICAgICAvL1VwZGF0ZSB0aGUgZG90cyB3aXRoIHRoZWlyIG5ldyBsb2NhdGlvblxyXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZURvdHMoKSB7XHJcbiAgICAgICAgICAgIC8vQ3ljbGUgdGhyb3VnaCB0byB0aGUgbmV4dCBzZXQgb2YgZG90c1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudFNldEFycmF5W2N1cnJlbnRBcGVydHVyZU51bWJlcl0gPT0gblNldHMgLSAxKSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50U2V0QXJyYXlbY3VycmVudEFwZXJ0dXJlTnVtYmVyXSA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50U2V0QXJyYXlbY3VycmVudEFwZXJ0dXJlTnVtYmVyXSA9IGN1cnJlbnRTZXRBcnJheVtjdXJyZW50QXBlcnR1cmVOdW1iZXJdICsgMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL0xvYWQgaW4gdGhlIGN1cnJlbnQgc2V0IG9mIGRvdCBhcnJheSBmb3IgZWFzeSBoYW5kbGluZ1xyXG4gICAgICAgICAgICB2YXIgZG90QXJyYXkgPSBkb3RBcnJheTJkW2N1cnJlbnRTZXRBcnJheVtjdXJyZW50QXBlcnR1cmVOdW1iZXJdXTtcclxuICAgICAgICAgICAgLy9Mb29wIHRocm91Z2ggdGhlIGRvdHMgb25lIGJ5IG9uZSBhbmQgdXBkYXRlIHRoZW0gYWNjb3JkaW5nbHlcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuRG90czsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZG90ID0gZG90QXJyYXlbaV07IC8vTG9hZCB0aGUgY3VycmVudCBkb3QgaW50byB0aGUgdmFyaWFibGUgZm9yIGVhc3kgaGFuZGxpbmdcclxuICAgICAgICAgICAgICAgIC8vR2VuZXJhdGUgYSByYW5kb20gdmFsdWVcclxuICAgICAgICAgICAgICAgIHZhciByYW5kb21WYWx1ZSA9IE1hdGgucmFuZG9tKCk7XHJcbiAgICAgICAgICAgICAgICAvL1VwZGF0ZSBiYXNlZCBvbiB0aGUgZG90J3MgdXBkYXRlIHR5cGVcclxuICAgICAgICAgICAgICAgIGlmIChkb3QudXBkYXRlVHlwZSA9PSBcImNvbnN0YW50IGRpcmVjdGlvblwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG90ID0gY29uc3RhbnREaXJlY3Rpb25VcGRhdGUoZG90KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRvdC51cGRhdGVUeXBlID09IFwib3Bwb3NpdGUgZGlyZWN0aW9uXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBkb3QgPSBvcHBvc2l0ZURpcmVjdGlvblVwZGF0ZShkb3QpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZG90LnVwZGF0ZVR5cGUgPT0gXCJyYW5kb20gcG9zaXRpb25cIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGRvdCA9IHJlc2V0TG9jYXRpb24oZG90KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRvdC51cGRhdGVUeXBlID09IFwicmFuZG9tIHdhbGtcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGRvdCA9IHJhbmRvbVdhbGtVcGRhdGUoZG90KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRvdC51cGRhdGVUeXBlID09IFwicmFuZG9tIGRpcmVjdGlvblwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG90ID0gcmFuZG9tRGlyZWN0aW9uVXBkYXRlKGRvdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChkb3QudXBkYXRlVHlwZSA9PSBcImNvbnN0YW50IGRpcmVjdGlvbiBvciBvcHBvc2l0ZSBkaXJlY3Rpb24gb3IgcmFuZG9tIHBvc2l0aW9uXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL1JhbmRvbWx5IHNlbGVjdCBpZiB0aGUgZG90IGdvZXMgaW4gYSBjb25zdGFudCBkaXJlY3Rpb24gb3IgcmFuZG9tIHBvc2l0aW9uLCB3ZWlnaHRlZCBiYXNlZCBvbiB0aGUgY29oZXJlbmNlIGxldmVsXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmRvbVZhbHVlIDwgY29oZXJlbmNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvdCA9IGNvbnN0YW50RGlyZWN0aW9uVXBkYXRlKGRvdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhbmRvbVZhbHVlID49IGNvaGVyZW5jZSAmJiByYW5kb21WYWx1ZSA8IGNvaGVyZW5jZSArIG9wcG9zaXRlQ29oZXJlbmNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvdCA9IG9wcG9zaXRlRGlyZWN0aW9uVXBkYXRlKGRvdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb3QgPSByZXNldExvY2F0aW9uKGRvdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZG90LnVwZGF0ZVR5cGUgPT0gXCJjb25zdGFudCBkaXJlY3Rpb24gb3Igb3Bwb3NpdGUgZGlyZWN0aW9uIG9yIHJhbmRvbSB3YWxrXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL1JhbmRvbWx5IHNlbGVjdCBpZiB0aGUgZG90IGdvZXMgaW4gYSBjb25zdGFudCBkaXJlY3Rpb24gb3IgcmFuZG9tIHdhbGssIHdlaWdodGVkIGJhc2VkIG9uIHRoZSBjb2hlcmVuY2UgbGV2ZWxcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmFuZG9tVmFsdWUgPCBjb2hlcmVuY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG90ID0gY29uc3RhbnREaXJlY3Rpb25VcGRhdGUoZG90KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmFuZG9tVmFsdWUgPj0gY29oZXJlbmNlICYmIHJhbmRvbVZhbHVlIDwgY29oZXJlbmNlICsgb3Bwb3NpdGVDb2hlcmVuY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG90ID0gb3Bwb3NpdGVEaXJlY3Rpb25VcGRhdGUoZG90KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvdCA9IHJhbmRvbVdhbGtVcGRhdGUoZG90KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChkb3QudXBkYXRlVHlwZSA9PSBcImNvbnN0YW50IGRpcmVjdGlvbiBvciBvcHBvc2l0ZSBkaXJlY3Rpb24gb3IgcmFuZG9tIGRpcmVjdGlvblwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9SYW5kb21seSBzZWxlY3QgaWYgdGhlIGRvdCBnb2VzIGluIGEgY29uc3RhbnQgZGlyZWN0aW9uIG9yIHJhbmRvbSBkaXJlY3Rpb24sIHdlaWdodGVkIGJhc2VkIG9uIHRoZSBjb2hlcmVuY2UgbGV2ZWxcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmFuZG9tVmFsdWUgPCBjb2hlcmVuY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG90ID0gY29uc3RhbnREaXJlY3Rpb25VcGRhdGUoZG90KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmFuZG9tVmFsdWUgPj0gY29oZXJlbmNlICYmIHJhbmRvbVZhbHVlIDwgY29oZXJlbmNlICsgb3Bwb3NpdGVDb2hlcmVuY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG90ID0gb3Bwb3NpdGVEaXJlY3Rpb25VcGRhdGUoZG90KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvdCA9IHJhbmRvbURpcmVjdGlvblVwZGF0ZShkb3QpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gLy9FbmQgb2YgaWYgZG90LnVwZGF0ZVR5cGUgPT0gLi4uXHJcbiAgICAgICAgICAgICAgICAvL0luY3JlbWVudCB0aGUgbGlmZSBjb3VudFxyXG4gICAgICAgICAgICAgICAgZG90LmxpZmVDb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgLy9DaGVjayBpZiBvdXQgb2YgYm91bmRzIG9yIGlmIGxpZmUgZW5kZWRcclxuICAgICAgICAgICAgICAgIGlmIChsaWZlRW5kZWQoZG90KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRvdCA9IHJlc2V0TG9jYXRpb24oZG90KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vSWYgaXQgZ29lcyBvdXQgb2YgYm91bmRzLCBkbyB3aGF0IGlzIG5lY2Vzc2FyeSAocmVpbnNlcnQgcmFuZG9tbHkgb3IgcmVpbnNlcnQgb24gdGhlIG9wcG9zaXRlIGVkZ2UpIGJhc2VkIG9uIHRoZSBwYXJhbWV0ZXIgY2hvc2VuXHJcbiAgICAgICAgICAgICAgICBpZiAob3V0T2ZCb3VuZHMoZG90KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocmVpbnNlcnRUeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdCA9IHJlc2V0TG9jYXRpb24oZG90KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3QgPSByZWluc2VydE9uT3Bwb3NpdGVFZGdlKGRvdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9IC8vRW5kIG9mIHN3aXRjaCBzdGF0ZW1lbnRcclxuICAgICAgICAgICAgICAgIH0gLy9FbmQgb2YgaWZcclxuICAgICAgICAgICAgfSAvL0VuZCBvZiBmb3IgbG9vcFxyXG4gICAgICAgIH0gLy9FbmQgb2YgdXBkYXRlRG90cyBmdW5jdGlvblxyXG4gICAgICAgIC8vRnVuY3Rpb24gdG8gY2hlY2sgaWYgZG90IGxpZmUgaGFzIGVuZGVkXHJcbiAgICAgICAgZnVuY3Rpb24gbGlmZUVuZGVkKGRvdCkge1xyXG4gICAgICAgICAgICAvL0lmIHdlIHdhbnQgaW5maW5pdGUgZG90IGxpZmVcclxuICAgICAgICAgICAgaWYgKGRvdExpZmUgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICBkb3QubGlmZUNvdW50ID0gMDsgLy9yZXNldHRpbmcgdG8gemVybyB0byBzYXZlIG1lbW9yeS4gT3RoZXJ3aXNlIGl0IG1pZ2h0IGluY3JlbWVudCB0byBodWdlIG51bWJlcnMuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9FbHNlIGlmIHRoZSBkb3QncyBsaWZlIGhhcyByZWFjaGVkIGl0cyBlbmRcclxuICAgICAgICAgICAgZWxzZSBpZiAoZG90LmxpZmVDb3VudCA+PSBkb3RMaWZlKSB7XHJcbiAgICAgICAgICAgICAgICBkb3QubGlmZUNvdW50ID0gMDtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vRWxzZSB0aGUgZG90J3MgbGlmZSBoYXMgbm90IHJlYWNoZWQgaXRzIGVuZFxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvL0Z1bmN0aW9uIHRvIGNoZWNrIGlmIGRvdCBpcyBvdXQgb2YgYm91bmRzXHJcbiAgICAgICAgLy9AdHMtZXhwZWN0LWVycm9yIFwibm90IGFsbCBjb2RlIHBhdGhzIHJldHVybiBhIHZhbHVlXCJcclxuICAgICAgICBmdW5jdGlvbiBvdXRPZkJvdW5kcyhkb3QpIHtcclxuICAgICAgICAgICAgLy9Gb3IgY2lyY2xlIGFuZCBlbGxpcHNlXHJcbiAgICAgICAgICAgIGlmIChhcGVydHVyZVR5cGUgPT0gMSB8fCBhcGVydHVyZVR5cGUgPT0gMikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRvdC54IDwgeFZhbHVlTmVnYXRpdmUoZG90LnkpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgZG90LnggPiB4VmFsdWVQb3NpdGl2ZShkb3QueSkgfHxcclxuICAgICAgICAgICAgICAgICAgICBkb3QueSA8IHlWYWx1ZU5lZ2F0aXZlKGRvdC54KSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGRvdC55ID4geVZhbHVlUG9zaXRpdmUoZG90LngpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9Gb3Igc3F1YXJlIGFuZCByZWN0YW5nbGVcclxuICAgICAgICAgICAgaWYgKGFwZXJ0dXJlVHlwZSA9PSAzIHx8IGFwZXJ0dXJlVHlwZSA9PSA0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZG90LnggPCBhcGVydHVyZUNlbnRlclggLSBob3Jpem9udGFsQXhpcyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGRvdC54ID4gYXBlcnR1cmVDZW50ZXJYICsgaG9yaXpvbnRhbEF4aXMgfHxcclxuICAgICAgICAgICAgICAgICAgICBkb3QueSA8IGFwZXJ0dXJlQ2VudGVyWSAtIHZlcnRpY2FsQXhpcyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGRvdC55ID4gYXBlcnR1cmVDZW50ZXJZICsgdmVydGljYWxBeGlzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy9TZXQgdGhlIHZ4IGFuZCB2eSBmb3IgdGhlIGRvdCB0byB0aGUgY29oZXJlbnQganVtcCBzaXplcyBvZiB0aGUgWCBhbmQgWSBkaXJlY3Rpb25zXHJcbiAgICAgICAgZnVuY3Rpb24gc2V0dnh2eShkb3QpIHtcclxuICAgICAgICAgICAgZG90LnZ4ID0gY29oZXJlbnRKdW1wU2l6ZVg7XHJcbiAgICAgICAgICAgIGRvdC52eSA9IGNvaGVyZW50SnVtcFNpemVZO1xyXG4gICAgICAgICAgICByZXR1cm4gZG90O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL1NldCB0aGUgdngyIGFuZCB2eTIgYmFzZWQgb24gYSByYW5kb20gYW5nbGVcclxuICAgICAgICBmdW5jdGlvbiBzZXR2eDJ2eTIoZG90KSB7XHJcbiAgICAgICAgICAgIC8vR2VuZXJhdGUgYSByYW5kb20gYW5nbGUgb2YgbW92ZW1lbnRcclxuICAgICAgICAgICAgdmFyIHRoZXRhID0gcmFuZG9tTnVtYmVyQmV0d2VlbigtTWF0aC5QSSwgTWF0aC5QSSk7XHJcbiAgICAgICAgICAgIC8vVXBkYXRlIHByb3BlcnRpZXMgdngyIGFuZCB2eTIgd2l0aCB0aGUgYWx0ZXJuYXRlIGRpcmVjdGlvbnNcclxuICAgICAgICAgICAgZG90LnZ4MiA9IE1hdGguY29zKHRoZXRhKSAqIG1vdmVEaXN0YW5jZTtcclxuICAgICAgICAgICAgZG90LnZ5MiA9IC1NYXRoLnNpbih0aGV0YSkgKiBtb3ZlRGlzdGFuY2U7XHJcbiAgICAgICAgICAgIHJldHVybiBkb3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vVXBkYXRlcyB0aGUgeCBhbmQgeSBjb29yZGluYXRlcyBieSBtb3ZpbmcgaXQgaW4gdGhlIHggYW5kIHkgY29oZXJlbnQgZGlyZWN0aW9uc1xyXG4gICAgICAgIGZ1bmN0aW9uIGNvbnN0YW50RGlyZWN0aW9uVXBkYXRlKGRvdCkge1xyXG4gICAgICAgICAgICBkb3QueCArPSBkb3Qudng7XHJcbiAgICAgICAgICAgIGRvdC55ICs9IGRvdC52eTtcclxuICAgICAgICAgICAgZG90LmxhdGVzdFhNb3ZlID0gZG90LnZ4O1xyXG4gICAgICAgICAgICBkb3QubGF0ZXN0WU1vdmUgPSBkb3Qudnk7XHJcbiAgICAgICAgICAgIHJldHVybiBkb3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vVXBkYXRlcyB0aGUgeCBhbmQgeSBjb29yZGluYXRlcyBieSBtb3ZpbmcgaXQgaW4gdGhlIG9wcG9zaXRlIHggYW5kIHkgY29oZXJlbnQgZGlyZWN0aW9uc1xyXG4gICAgICAgIGZ1bmN0aW9uIG9wcG9zaXRlRGlyZWN0aW9uVXBkYXRlKGRvdCkge1xyXG4gICAgICAgICAgICBkb3QueCAtPSBkb3Qudng7XHJcbiAgICAgICAgICAgIGRvdC55IC09IGRvdC52eTtcclxuICAgICAgICAgICAgZG90LmxhdGVzdFhNb3ZlID0gLWRvdC52eDtcclxuICAgICAgICAgICAgZG90LmxhdGVzdFlNb3ZlID0gLWRvdC52eTtcclxuICAgICAgICAgICAgcmV0dXJuIGRvdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9DcmVhdGVzIGEgbmV3IGFuZ2xlIHRvIG1vdmUgdG93YXJkcyBhbmQgdXBkYXRlcyB0aGUgeCBhbmQgeSBjb29yZGluYXRlc1xyXG4gICAgICAgIGZ1bmN0aW9uIHJhbmRvbVdhbGtVcGRhdGUoZG90KSB7XHJcbiAgICAgICAgICAgIC8vR2VuZXJhdGUgYSByYW5kb20gYW5nbGUgb2YgbW92ZW1lbnRcclxuICAgICAgICAgICAgdmFyIHRoZXRhID0gcmFuZG9tTnVtYmVyQmV0d2VlbigtTWF0aC5QSSwgTWF0aC5QSSk7XHJcbiAgICAgICAgICAgIC8vR2VuZXJhdGUgdGhlIG1vdmVtZW50IGZyb20gdGhlIGFuZ2xlXHJcbiAgICAgICAgICAgIGRvdC5sYXRlc3RYTW92ZSA9IE1hdGguY29zKHRoZXRhKSAqIG1vdmVEaXN0YW5jZTtcclxuICAgICAgICAgICAgZG90LmxhdGVzdFlNb3ZlID0gLU1hdGguc2luKHRoZXRhKSAqIG1vdmVEaXN0YW5jZTtcclxuICAgICAgICAgICAgLy9VcGRhdGUgeCBhbmQgeSBjb29yZGluYXRlcyB3aXRoIHRoZSBuZXcgbG9jYXRpb25cclxuICAgICAgICAgICAgZG90LnggKz0gZG90LmxhdGVzdFhNb3ZlO1xyXG4gICAgICAgICAgICBkb3QueSArPSBkb3QubGF0ZXN0WU1vdmU7XHJcbiAgICAgICAgICAgIHJldHVybiBkb3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vVXBkYXRlcyB0aGUgeCBhbmQgeSBjb29yZGluYXRlcyB3aXRoIHRoZSBhbHRlcm5hdGl2ZSBtb3ZlIGRpcmVjdGlvblxyXG4gICAgICAgIGZ1bmN0aW9uIHJhbmRvbURpcmVjdGlvblVwZGF0ZShkb3QpIHtcclxuICAgICAgICAgICAgZG90LnggKz0gZG90LnZ4MjtcclxuICAgICAgICAgICAgZG90LnkgKz0gZG90LnZ5MjtcclxuICAgICAgICAgICAgZG90LmxhdGVzdFhNb3ZlID0gZG90LnZ4MjtcclxuICAgICAgICAgICAgZG90LmxhdGVzdFlNb3ZlID0gZG90LnZ5MjtcclxuICAgICAgICAgICAgcmV0dXJuIGRvdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9DYWxjdWxhdGVzIGEgcmFuZG9tIHBvc2l0aW9uIG9uIHRoZSBvcHBvc2l0ZSBlZGdlIHRvIHJlaW5zZXJ0IHRoZSBkb3RcclxuICAgICAgICBmdW5jdGlvbiByZWluc2VydE9uT3Bwb3NpdGVFZGdlKGRvdCkge1xyXG4gICAgICAgICAgICAvL0lmIGl0IGlzIGEgY2lyY2xlIG9yIGVsbGlwc2VcclxuICAgICAgICAgICAgaWYgKGFwZXJ0dXJlVHlwZSA9PSAxIHx8IGFwZXJ0dXJlVHlwZSA9PSAyKSB7XHJcbiAgICAgICAgICAgICAgICAvL0JyaW5nIHRoZSBkb3QgYmFjayBpbnRvIHRoZSBhcGVydHVyZSBieSBtb3ZpbmcgYmFjayBvbmUgc3RlcFxyXG4gICAgICAgICAgICAgICAgZG90LnggLT0gZG90LmxhdGVzdFhNb3ZlO1xyXG4gICAgICAgICAgICAgICAgZG90LnkgLT0gZG90LmxhdGVzdFlNb3ZlO1xyXG4gICAgICAgICAgICAgICAgLy9Nb3ZlIHRoZSBkb3QgdG8gdGhlIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW4gdG8gYmUgcmVmbGVjdGVkIGFib3V0IHRoZSBvcmlnaW5cclxuICAgICAgICAgICAgICAgIGRvdC54IC09IGFwZXJ0dXJlQ2VudGVyWDtcclxuICAgICAgICAgICAgICAgIGRvdC55IC09IGFwZXJ0dXJlQ2VudGVyWTtcclxuICAgICAgICAgICAgICAgIC8vUmVmbGVjdCB0aGUgZG90IGFib3V0IHRoZSBvcmlnaW5cclxuICAgICAgICAgICAgICAgIGRvdC54ID0gLWRvdC54O1xyXG4gICAgICAgICAgICAgICAgZG90LnkgPSAtZG90Lnk7XHJcbiAgICAgICAgICAgICAgICAvL01vdmUgdGhlIGRvdCBiYWNrIHRvIHRoZSBjZW50ZXIgb2YgdGhlIHNjcmVlblxyXG4gICAgICAgICAgICAgICAgZG90LnggKz0gYXBlcnR1cmVDZW50ZXJYO1xyXG4gICAgICAgICAgICAgICAgZG90LnkgKz0gYXBlcnR1cmVDZW50ZXJZO1xyXG4gICAgICAgICAgICB9IC8vRW5kIG9mIGlmIGFwZXJ0dXJlVHlwZSA9PSAxIHwgPT0gMlxyXG4gICAgICAgICAgICAvL0lmIGl0IGlzIGEgc3F1YXJlIG9yIHJlY3RhbmdsZSwgcmUtaW5zZXJ0IG9uIG9uZSBvZiB0aGUgb3Bwb3NpdGUgZWRnZXNcclxuICAgICAgICAgICAgaWYgKGFwZXJ0dXJlVHlwZSA9PSAzIHx8IGFwZXJ0dXJlVHlwZSA9PSA0KSB7XHJcbiAgICAgICAgICAgICAgICAvKiogVGhlIGZvcm11bGEgZm9yIGNhbGN1bGF0aW5nIHdoZXRoZXIgYSBkb3QgYXBwZWFycyBmcm9tIHRoZSB2ZXJ0aWNhbCBlZGdlIChsZWZ0IG9yIHJpZ2h0IGVkZ2VzKSBpcyBkZXBlbmRlbnQgb24gdGhlIGRpcmVjdGlvbiBvZiB0aGUgZG90IGFuZCB0aGUgcmF0aW8gb2YgdGhlIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIGVkZ2UgbGVuZ3Rocy5cclxuICAgICAgICAgICAgICAgICAgRS5nLlxyXG4gICAgICAgICAgICAgICAgICBBcGVydHVyZSBpcyAxMDAgcHggaGlnaCBhbmQgMjAwcHggd2lkZVxyXG4gICAgICAgICAgICAgICAgICBEb3QgaXMgbW92aW5nIDMgcHggaW4geCBkaXJlY3Rpb24gYW5kIDRweCBpbiB5IGRpcmVjdGlvblxyXG4gICAgICAgICAgICAgICAgICBXZWlnaHQgb24gdmVydGljYWwgZWRnZSAoc2lkZXMpICAgICAgICAgICA9ICgxMDAvKDEwMCsyMDApKSAqICh8M3wgLyAofDN8ICsgfDR8KSkgPSAxLzdcclxuICAgICAgICAgICAgICAgICAgV2VpZ2h0IG9uIGhvcml6b250YWwgZWRnZSAodG9wIG9yIGJvdHRvbSkgPSAoMjAwLygxMDArMjAwKSkgKiAofDR8IC8gKHwzfCArIHw0fCkpID0gOC8yMVxyXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICBUaGUgd2VpZ2h0cyBhYm92ZSBhcmUgdGhlIHJhdGlvcyB0byBvbmUgYW5vdGhlci5cclxuICAgICAgICAgICAgICAgICAgRS5nLiAoY29udC4pXHJcbiAgICAgICAgICAgICAgICAgIFJhdGlvICh2ZXJ0aWNhbCBlZGdlIDogaG9yaXpvbnRhbCBlZGdlKSA9PSAoMS83IDogOC8yMSlcclxuICAgICAgICAgICAgICAgICAgVG90YWwgcHJvYmFiaWxpdHkgc3BhY2UgPSAxLzcgKyA4LzIxID0gMTEvMjFcclxuICAgICAgICAgICAgICAgICAgUHJvYmFiaWxpdHkgdGhhdCBkb3QgYXBwZWFycyBvbiB2ZXJ0aWNhbCBlZGdlICAgPSAoMS83KS8oMTEvMjEpID0gMy8xMVxyXG4gICAgICAgICAgICAgICAgICBQcm9iYWJpbGl0eSB0aGF0IGRvdCBhcHBlYXJzIG9uIGhvcml6b250YWwgZWRnZSA9ICg4LzIxKS8oMTEvMjEpID0gOC8xMVxyXG4gICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgLy9HZXQgdGhlIGFic29sdXRlIHZhbHVlcyBvZiB0aGUgbGF0ZXN0IFggYW5kIFkgbW92ZXMgYW5kIHN0b3JlIHRoZW0gaW4gdmFyaWFibGVzIGZvciBlYXN5IGhhbmRsaW5nLlxyXG4gICAgICAgICAgICAgICAgdmFyIGFic1ggPSBNYXRoLmFicyhkb3QubGF0ZXN0WE1vdmUpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGFic1kgPSBNYXRoLmFicyhkb3QubGF0ZXN0WU1vdmUpO1xyXG4gICAgICAgICAgICAgICAgLy9DYWxjdWxhdGUgdGhlIGRpcmVjdGlvbiB3ZWlnaHRzIGJhc2VkIG9uIGRpcmVjdGlvbiB0aGUgZG90IHdhcyBtb3ZpbmdcclxuICAgICAgICAgICAgICAgIHZhciB3ZWlnaHRJblhEaXJlY3Rpb24gPSBhYnNYIC8gKGFic1ggKyBhYnNZKTtcclxuICAgICAgICAgICAgICAgIHZhciB3ZWlnaHRJbllEaXJlY3Rpb24gPSBhYnNZIC8gKGFic1ggKyBhYnNZKTtcclxuICAgICAgICAgICAgICAgIC8vQ2FsY3VsYXRlIHRoZSB3ZWlnaHQgb2YgdGhlIGVkZ2UgdGhlIGRvdCBzaG91bGQgYXBwZWFyIGZyb20sIGJhc2VkIG9uIGRpcmVjdGlvbiBvZiBkb3QgYW5kIHJhdGlvIG9mIHRoZSBhcGVydHVyZSBlZGdlc1xyXG4gICAgICAgICAgICAgICAgdmFyIHdlaWdodE9uVmVydGljYWxFZGdlID0gKHZlcnRpY2FsQXhpcyAvICh2ZXJ0aWNhbEF4aXMgKyBob3Jpem9udGFsQXhpcykpICogd2VpZ2h0SW5YRGlyZWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgdmFyIHdlaWdodE9uSG9yaXpvbnRhbEVkZ2UgPSAoaG9yaXpvbnRhbEF4aXMgLyAodmVydGljYWxBeGlzICsgaG9yaXpvbnRhbEF4aXMpKSAqIHdlaWdodEluWURpcmVjdGlvbjtcclxuICAgICAgICAgICAgICAgIC8vR2VuZXJhdGUgYSBib3VuZGVkIHJhbmRvbSBudW1iZXIgdG8gZGV0ZXJtaW5lIGlmIHRoZSBkb3Qgc2hvdWxkIGFwcGVhciBvbiB0aGUgdmVydGljYWwgZWRnZSBvciB0aGUgaG9yaXpvbnRhbCBlZGdlXHJcbiAgICAgICAgICAgICAgICBpZiAod2VpZ2h0T25WZXJ0aWNhbEVkZ2UgPlxyXG4gICAgICAgICAgICAgICAgICAgICh3ZWlnaHRPbkhvcml6b250YWxFZGdlICsgd2VpZ2h0T25WZXJ0aWNhbEVkZ2UpICogTWF0aC5yYW5kb20oKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vSWYgeWVzLCBhcHBlYXIgb24gdGhlIGxlZnQgb3IgcmlnaHQgZWRnZSAodmVydGljYWwgZWRnZSlcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZG90LmxhdGVzdFhNb3ZlIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0lmIGRvdHMgbW92ZSBsZWZ0LCBhcHBlYXIgb24gcmlnaHQgZWRnZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb3QueCA9IGFwZXJ0dXJlQ2VudGVyWCArIGhvcml6b250YWxBeGlzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb3QueSA9IHJhbmRvbU51bWJlckJldHdlZW4oYXBlcnR1cmVDZW50ZXJZIC0gdmVydGljYWxBeGlzLCBhcGVydHVyZUNlbnRlclkgKyB2ZXJ0aWNhbEF4aXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9FbHNlIGRvdHMgbW92ZSByaWdodCwgc28gdGhleSBzaG91bGQgYXBwZWFyIG9uIHRoZSBsZWZ0IGVkZ2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG90LnggPSBhcGVydHVyZUNlbnRlclggLSBob3Jpem9udGFsQXhpcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG90LnkgPSByYW5kb21OdW1iZXJCZXR3ZWVuKGFwZXJ0dXJlQ2VudGVyWSAtIHZlcnRpY2FsQXhpcywgYXBlcnR1cmVDZW50ZXJZICsgdmVydGljYWxBeGlzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvL0Vsc2UgYXBwZWFyIG9uIHRoZSB0b3Agb3IgYm90dG9tIGVkZ2UgKGhvcml6b250YWwgZWRnZSlcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZG90LmxhdGVzdFlNb3ZlIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0lmIGRvdHMgbW92ZSB1cHdhcmRzLCB0aGVuIGFwcGVhciBvbiBib3R0b20gZWRnZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb3QueSA9IGFwZXJ0dXJlQ2VudGVyWSArIHZlcnRpY2FsQXhpcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG90LnggPSByYW5kb21OdW1iZXJCZXR3ZWVuKGFwZXJ0dXJlQ2VudGVyWCAtIGhvcml6b250YWxBeGlzLCBhcGVydHVyZUNlbnRlclggKyBob3Jpem9udGFsQXhpcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0lmIGRvdHMgbW92ZSBkb3dud2FyZHMsIHRoZW4gYXBwZWFyIG9uIHRvcCBlZGdlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvdC55ID0gYXBlcnR1cmVDZW50ZXJZIC0gdmVydGljYWxBeGlzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb3QueCA9IHJhbmRvbU51bWJlckJldHdlZW4oYXBlcnR1cmVDZW50ZXJYIC0gaG9yaXpvbnRhbEF4aXMsIGFwZXJ0dXJlQ2VudGVyWCArIGhvcml6b250YWxBeGlzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gLy9FbmQgb2YgYXBlcnR1cmVUeXBlID09IDNcclxuICAgICAgICAgICAgcmV0dXJuIGRvdDtcclxuICAgICAgICB9IC8vRW5kIG9mIHJlaW5zZXJ0T25PcHBvc2l0ZUVkZ2VcclxuICAgICAgICAvL0NhbGN1bGF0ZSB0aGUgUE9TSVRJVkUgeSB2YWx1ZSBvZiBhIHBvaW50IG9uIHRoZSBlZGdlIG9mIHRoZSBlbGxpcHNlIGdpdmVuIGFuIHgtdmFsdWVcclxuICAgICAgICBmdW5jdGlvbiB5VmFsdWVQb3NpdGl2ZSh4KSB7XHJcbiAgICAgICAgICAgIHggPSB4IC0gYXBlcnR1cmVDZW50ZXJYOyAvL0JyaW5nIGl0IGJhY2sgdG8gdGhlICgwLDApIGNlbnRlciB0byBjYWxjdWxhdGUgYWNjdXJhdGVseSAoaWdub3JlIHRoZSB5LWNvb3JkaW5hdGUgYmVjYXVzZSBpdCBpcyBub3QgbmVjZXNzYXJ5IGZvciBjYWxjdWxhdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuICh2ZXJ0aWNhbEF4aXMgKiBNYXRoLnNxcnQoMSAtIE1hdGgucG93KHgsIDIpIC8gTWF0aC5wb3coaG9yaXpvbnRhbEF4aXMsIDIpKSArIGFwZXJ0dXJlQ2VudGVyWSk7IC8vQ2FsY3VsYXRlZCB0aGUgcG9zaXRpdmUgeSB2YWx1ZSBhbmQgYWRkZWQgYXBlcnR1cmVDZW50ZXJZIHRvIHJlY2VudGVyIGl0IG9uIHRoZSBzY3JlZW5cclxuICAgICAgICB9XHJcbiAgICAgICAgLy9DYWxjdWxhdGUgdGhlIE5FR0FUSVZFIHkgdmFsdWUgb2YgYSBwb2ludCBvbiB0aGUgZWRnZSBvZiB0aGUgZWxsaXBzZSBnaXZlbiBhbiB4LXZhbHVlXHJcbiAgICAgICAgZnVuY3Rpb24geVZhbHVlTmVnYXRpdmUoeCkge1xyXG4gICAgICAgICAgICB4ID0geCAtIGFwZXJ0dXJlQ2VudGVyWDsgLy9CcmluZyBpdCBiYWNrIHRvIHRoZSAoMCwwKSBjZW50ZXIgdG8gY2FsY3VsYXRlIGFjY3VyYXRlbHkgKGlnbm9yZSB0aGUgeS1jb29yZGluYXRlIGJlY2F1c2UgaXQgaXMgbm90IG5lY2Vzc2FyeSBmb3IgY2FsY3VsYXRpb24pXHJcbiAgICAgICAgICAgIHJldHVybiAoLXZlcnRpY2FsQXhpcyAqIE1hdGguc3FydCgxIC0gTWF0aC5wb3coeCwgMikgLyBNYXRoLnBvdyhob3Jpem9udGFsQXhpcywgMikpICtcclxuICAgICAgICAgICAgICAgIGFwZXJ0dXJlQ2VudGVyWSk7IC8vQ2FsY3VsYXRlZCB0aGUgbmVnYXRpdmUgeSB2YWx1ZSBhbmQgYWRkZWQgYXBlcnR1cmVDZW50ZXJZIHRvIHJlY2VudGVyIGl0IG9uIHRoZSBzY3JlZW5cclxuICAgICAgICB9XHJcbiAgICAgICAgLy9DYWxjdWxhdGUgdGhlIFBPU0lUSVZFIHggdmFsdWUgb2YgYSBwb2ludCBvbiB0aGUgZWRnZSBvZiB0aGUgZWxsaXBzZSBnaXZlbiBhIHktdmFsdWVcclxuICAgICAgICBmdW5jdGlvbiB4VmFsdWVQb3NpdGl2ZSh5KSB7XHJcbiAgICAgICAgICAgIHkgPSB5IC0gYXBlcnR1cmVDZW50ZXJZOyAvL0JyaW5nIGl0IGJhY2sgdG8gdGhlICgwLDApIGNlbnRlciB0byBjYWxjdWxhdGUgYWNjdXJhdGVseSAoaWdub3JlIHRoZSB4LWNvb3JkaW5hdGUgYmVjYXVzZSBpdCBpcyBub3QgbmVjZXNzYXJ5IGZvciBjYWxjdWxhdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuIChob3Jpem9udGFsQXhpcyAqIE1hdGguc3FydCgxIC0gTWF0aC5wb3coeSwgMikgLyBNYXRoLnBvdyh2ZXJ0aWNhbEF4aXMsIDIpKSArIGFwZXJ0dXJlQ2VudGVyWCk7IC8vQ2FsY3VsYXRlZCB0aGUgcG9zaXRpdmUgeCB2YWx1ZSBhbmQgYWRkZWQgYXBlcnR1cmVDZW50ZXJYIHRvIHJlY2VudGVyIGl0IG9uIHRoZSBzY3JlZW5cclxuICAgICAgICB9XHJcbiAgICAgICAgLy9DYWxjdWxhdGUgdGhlIE5FR0FUSVZFIHggdmFsdWUgb2YgYSBwb2ludCBvbiB0aGUgZWRnZSBvZiB0aGUgZWxsaXBzZSBnaXZlbiBhIHktdmFsdWVcclxuICAgICAgICBmdW5jdGlvbiB4VmFsdWVOZWdhdGl2ZSh5KSB7XHJcbiAgICAgICAgICAgIHkgPSB5IC0gYXBlcnR1cmVDZW50ZXJZOyAvL0JyaW5nIGl0IGJhY2sgdG8gdGhlICgwLDApIGNlbnRlciB0byBjYWxjdWxhdGUgYWNjdXJhdGVseSAoaWdub3JlIHRoZSB4LWNvb3JkaW5hdGUgYmVjYXVzZSBpdCBpcyBub3QgbmVjZXNzYXJ5IGZvciBjYWxjdWxhdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuICgtaG9yaXpvbnRhbEF4aXMgKiBNYXRoLnNxcnQoMSAtIE1hdGgucG93KHksIDIpIC8gTWF0aC5wb3codmVydGljYWxBeGlzLCAyKSkgK1xyXG4gICAgICAgICAgICAgICAgYXBlcnR1cmVDZW50ZXJYKTsgLy9DYWxjdWxhdGVkIHRoZSBuZWdhdGl2ZSB4IHZhbHVlIGFuZCBhZGRlZCBhcGVydHVyZUNlbnRlclggdG8gcmVjZW50ZXIgaXQgb24gdGhlIHNjcmVlblxyXG4gICAgICAgIH1cclxuICAgICAgICAvL0NhbGN1bGF0ZSBhIHJhbmRvbSB4IGFuZCB5IGNvb3JkaW5hdGUgaW4gdGhlIGVsbGlwc2VcclxuICAgICAgICBmdW5jdGlvbiByZXNldExvY2F0aW9uKGRvdCkge1xyXG4gICAgICAgICAgICAvL0ZvciBjaXJjbGUgYW5kIGVsbGlwc2VcclxuICAgICAgICAgICAgaWYgKGFwZXJ0dXJlVHlwZSA9PSAxIHx8IGFwZXJ0dXJlVHlwZSA9PSAyKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcGhpID0gcmFuZG9tTnVtYmVyQmV0d2VlbigtTWF0aC5QSSwgTWF0aC5QSSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmhvID0gTWF0aC5yYW5kb20oKTtcclxuICAgICAgICAgICAgICAgIHZhciB4ID0gTWF0aC5zcXJ0KHJobykgKiBNYXRoLmNvcyhwaGkpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHkgPSBNYXRoLnNxcnQocmhvKSAqIE1hdGguc2luKHBoaSk7XHJcbiAgICAgICAgICAgICAgICB4ID0geCAqIGhvcml6b250YWxBeGlzICsgYXBlcnR1cmVDZW50ZXJYO1xyXG4gICAgICAgICAgICAgICAgeSA9IHkgKiB2ZXJ0aWNhbEF4aXMgKyBhcGVydHVyZUNlbnRlclk7XHJcbiAgICAgICAgICAgICAgICBkb3QueCA9IHg7XHJcbiAgICAgICAgICAgICAgICBkb3QueSA9IHk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9Gb3Igc3F1YXJlIGFuZCByZWN0YW5nbGVcclxuICAgICAgICAgICAgZWxzZSBpZiAoYXBlcnR1cmVUeXBlID09IDMgfHwgYXBlcnR1cmVUeXBlID09IDQpIHtcclxuICAgICAgICAgICAgICAgIGRvdC54ID0gcmFuZG9tTnVtYmVyQmV0d2VlbihhcGVydHVyZUNlbnRlclggLSBob3Jpem9udGFsQXhpcywgYXBlcnR1cmVDZW50ZXJYICsgaG9yaXpvbnRhbEF4aXMpOyAvL0JldHdlZW4gdGhlIGxlZnQgYW5kIHJpZ2h0IGVkZ2VzIG9mIHRoZSBzcXVhcmUgLyByZWN0YW5nbGVcclxuICAgICAgICAgICAgICAgIGRvdC55ID0gcmFuZG9tTnVtYmVyQmV0d2VlbihhcGVydHVyZUNlbnRlclkgLSB2ZXJ0aWNhbEF4aXMsIGFwZXJ0dXJlQ2VudGVyWSArIHZlcnRpY2FsQXhpcyk7IC8vQmV0d2VlbiB0aGUgdG9wIGFuZCBib3R0b20gZWRnZXMgb2YgdGhlIHNxdWFyZSAvIHJlY3RhbmdsZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBkb3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vR2VuZXJhdGVzIGEgcmFuZG9tIG51bWJlciAod2l0aCBkZWNpbWFscykgYmV0d2VlbiAyIHZhbHVlc1xyXG4gICAgICAgIGZ1bmN0aW9uIHJhbmRvbU51bWJlckJldHdlZW4obG93ZXJCb3VuZCwgdXBwZXJCb3VuZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbG93ZXJCb3VuZCArIE1hdGgucmFuZG9tKCkgKiAodXBwZXJCb3VuZCAtIGxvd2VyQm91bmQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL0Z1bmN0aW9uIHRvIG1ha2UgdGhlIGRvdHMgbW92ZSBvbiB0aGUgY2FudmFzXHJcbiAgICAgICAgZnVuY3Rpb24gYW5pbWF0ZURvdE1vdGlvbigpIHtcclxuICAgICAgICAgICAgLy9mcmFtZVJlcXVlc3RJRCBzYXZlcyBhIGxvbmcgaW50ZWdlciB0aGF0IGlzIHRoZSBJRCBvZiB0aGlzIGZyYW1lIHJlcXVlc3QuIFRoZSBJRCBpcyB0aGVuIHVzZWQgdG8gdGVybWluYXRlIHRoZSByZXF1ZXN0IGJlbG93LlxyXG4gICAgICAgICAgICB2YXIgZnJhbWVSZXF1ZXN0SUQgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpO1xyXG4gICAgICAgICAgICAvL1N0YXJ0IHRvIGxpc3RlbiB0byBzdWJqZWN0J3Mga2V5IHJlc3BvbnNlc1xyXG4gICAgICAgICAgICBzdGFydEtleWJvYXJkTGlzdGVuZXIoKTtcclxuICAgICAgICAgICAgLy9EZWxhcmUgYSB0aW1lc3RhbXBcclxuICAgICAgICAgICAgdmFyIHByZXZpb3VzVGltZXN0YW1wO1xyXG4gICAgICAgICAgICBmdW5jdGlvbiBhbmltYXRlKCkge1xyXG4gICAgICAgICAgICAgICAgLy9JZiBzdG9wcGluZyBjb25kaXRpb24gaGFzIGJlZW4gcmVhY2hlZCwgdGhlbiBzdG9wIHRoZSBhbmltYXRpb25cclxuICAgICAgICAgICAgICAgIGlmIChzdG9wRG90TW90aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKGZyYW1lUmVxdWVzdElEKTsgLy9DYW5jZWxzIHRoZSBmcmFtZSByZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL0Vsc2UgY29udGludWUgd2l0aCBhbm90aGVyIGZyYW1lIHJlcXVlc3RcclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGZyYW1lUmVxdWVzdElEID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlKTsgLy9DYWxscyBmb3IgYW5vdGhlciBmcmFtZSByZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICAgICAgLy9JZiB0aGUgdGltZXIgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgYW5kIGl0IGlzIHNldCwgdGhlbiBzdGFydCB0aGUgdGltZXJcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRpbWVySGFzU3RhcnRlZCAmJiB0cmlhbF9kdXJhdGlvbiA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiB0aGUgdHJpYWwgZHVyYXRpb24gaXMgc2V0LCB0aGVuIHNldCBhIHRpbWVyIHRvIGNvdW50IGRvd24gYW5kIGNhbGwgdGhlIGVuZF90cmlhbCBmdW5jdGlvbiB3aGVuIHRoZSB0aW1lIGlzIHVwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vKElmIHRoZSBzdWJqZWN0IGRpZCBub3QgcHJlc3MgYSB2YWxpZCBrZXlib2FyZCByZXNwb25zZSB3aXRoaW4gdGhlIHRyaWFsIGR1cmF0aW9uLCB0aGVuIHRoaXMgd2lsbCBlbmQgdGhlIHRyaWFsKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0SUQgPSB3aW5kb3cuc2V0VGltZW91dChlbmRfdHJpYWwsIHRyaWFsX2R1cmF0aW9uKTsgLy9UaGlzIHRpbWVvdXRJRCBpcyB0aGVuIHVzZWQgdG8gY2FuY2VsIHRoZSB0aW1lb3V0IHNob3VsZCB0aGUgc3ViamVjdCBwcmVzcyBhIHZhbGlkIGtleVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1RoZSB0aW1lciBoYXMgc3RhcnRlZCwgc28gd2Ugc2V0IHRoZSB2YXJpYWJsZSB0byB0cnVlIHNvIGl0IGRvZXMgbm90IHN0YXJ0IG1vcmUgdGltZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVySGFzU3RhcnRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUFuZERyYXcoKTsgLy9VcGRhdGUgYW5kIGRyYXcgZWFjaCBvZiB0aGUgZG90cyBpbiB0aGVpciByZXNwZWN0aXZlIGFwZXJ0dXJlc1xyXG4gICAgICAgICAgICAgICAgICAgIC8vSWYgdGhpcyBpcyBiZWZvcmUgdGhlIGZpcnN0IGZyYW1lLCB0aGVuIHN0YXJ0IHRoZSB0aW1lc3RhbXBcclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNUaW1lc3RhbXAgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1RpbWVzdGFtcCA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvL0Vsc2UgY2FsY3VsYXRlIHRoZSB0aW1lIGFuZCBwdXNoIGl0IGludG8gdGhlIGFycmF5XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50VGltZVN0YW1wID0gcGVyZm9ybWFuY2Uubm93KCk7IC8vVmFyaWFibGUgdG8gaG9sZCBjdXJyZW50IHRpbWVzdGFtcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVJhdGUucHVzaChNYXRoLnJvdW5kKGN1cnJlbnRUaW1lU3RhbXAgLSBwcmV2aW91c1RpbWVzdGFtcCkpOyAvL1B1c2ggdGhlIGludGVydmFsIGludG8gdGhlIGZyYW1lUmF0ZSBhcnJheVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1RpbWVzdGFtcCA9IGN1cnJlbnRUaW1lU3RhbXA7IC8vUmVzZXQgdGhlIHRpbWVzdGFtcFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLy0tLS1SREsgRnVuY3Rpb25zIEVuZC0tLS1cclxuICAgICAgICAvLy0tLS1HZW5lcmFsIEZ1bmN0aW9ucyBCZWdpbi8vLS0tLVxyXG4gICAgICAgIC8vRnVuY3Rpb24gdG8gYXNzaWduIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIHN0YWlyY2FzZSBwYXJhbWV0ZXJzXHJcbiAgICAgICAgZnVuY3Rpb24gYXNzaWduUGFyYW1ldGVyVmFsdWUoYXJndW1lbnQsIGRlZmF1bHRWYWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGFyZ3VtZW50ICE9PSBcInVuZGVmaW5lZFwiID8gYXJndW1lbnQgOiBkZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vLS0tLUdlbmVyYWwgRnVuY3Rpb25zIEVuZC8vLS0tLVxyXG4gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAgIC8vLS0tLS0tLS0tLS1GVU5DVElPTlMgRU5ELS0tLS0tLS0tLS0tLVxyXG4gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgfVxyXG59XHJcblJka1BsdWdpbi5pbmZvID0gaW5mbztcblxuZXhwb3J0IHsgUmRrUGx1Z2luIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuIiwiaW1wb3J0IHsgUGFyYW1ldGVyVHlwZSB9IGZyb20gJ2pzcHN5Y2gnO1xuXG5jb25zdCBpbmZvID0ge1xyXG4gICAgbmFtZTogXCJmdWxsc2NyZWVuXCIsXHJcbiAgICBwYXJhbWV0ZXJzOiB7XHJcbiAgICAgICAgLyoqIElmIHRydWUsIGV4cGVyaW1lbnQgd2lsbCBlbnRlciBmdWxsc2NyZWVuIG1vZGUuIElmIGZhbHNlLCB0aGUgYnJvd3NlciB3aWxsIGV4aXQgZnVsbHNjcmVlbiBtb2RlLiAqL1xyXG4gICAgICAgIGZ1bGxzY3JlZW5fbW9kZToge1xyXG4gICAgICAgICAgICB0eXBlOiBQYXJhbWV0ZXJUeXBlLkJPT0wsXHJcbiAgICAgICAgICAgIHByZXR0eV9uYW1lOiBcIkZ1bGxzY3JlZW4gbW9kZVwiLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiB0cnVlLFxyXG4gICAgICAgICAgICBhcnJheTogZmFsc2UsXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvKiogSFRNTCBjb250ZW50IHRvIGRpc3BsYXkgYWJvdmUgdGhlIGJ1dHRvbiB0byBlbnRlciBmdWxsc2NyZWVuIG1vZGUgKi9cclxuICAgICAgICBtZXNzYWdlOiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuSFRNTF9TVFJJTkcsXHJcbiAgICAgICAgICAgIHByZXR0eV9uYW1lOiBcIk1lc3NhZ2VcIixcclxuICAgICAgICAgICAgZGVmYXVsdDogXCI8cD5UaGUgZXhwZXJpbWVudCB3aWxsIHN3aXRjaCB0byBmdWxsIHNjcmVlbiBtb2RlIHdoZW4geW91IHByZXNzIHRoZSBidXR0b24gYmVsb3c8L3A+XCIsXHJcbiAgICAgICAgICAgIGFycmF5OiBmYWxzZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8qKiBUaGUgdGV4dCB0aGF0IGFwcGVhcnMgb24gdGhlIGJ1dHRvbiB0byBlbnRlciBmdWxsc2NyZWVuICovXHJcbiAgICAgICAgYnV0dG9uX2xhYmVsOiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuU1RSSU5HLFxyXG4gICAgICAgICAgICBwcmV0dHlfbmFtZTogXCJCdXR0b24gbGFiZWxcIixcclxuICAgICAgICAgICAgZGVmYXVsdDogXCJDb250aW51ZVwiLFxyXG4gICAgICAgICAgICBhcnJheTogZmFsc2UsXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvKiogVGhlIGxlbmd0aCBvZiB0aW1lIHRvIGRlbGF5IGFmdGVyIGVudGVyaW5nIGZ1bGxzY3JlZW4gbW9kZSBiZWZvcmUgZW5kaW5nIHRoZSB0cmlhbC4gKi9cclxuICAgICAgICBkZWxheV9hZnRlcjoge1xyXG4gICAgICAgICAgICB0eXBlOiBQYXJhbWV0ZXJUeXBlLklOVCxcclxuICAgICAgICAgICAgcHJldHR5X25hbWU6IFwiRGVsYXkgYWZ0ZXJcIixcclxuICAgICAgICAgICAgZGVmYXVsdDogMTAwMCxcclxuICAgICAgICAgICAgYXJyYXk6IGZhbHNlLFxyXG4gICAgICAgIH0sXHJcbiAgICB9LFxyXG59O1xyXG4vKipcclxuICogKipmdWxsc2NyZWVuKipcclxuICpcclxuICoganNQc3ljaCBwbHVnaW4gZm9yIHRvZ2dsaW5nIGZ1bGxzY3JlZW4gbW9kZSBpbiB0aGUgYnJvd3NlclxyXG4gKlxyXG4gKiBAYXV0aG9yIEpvc2ggZGUgTGVldXdcclxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93d3cuanNwc3ljaC5vcmcvcGx1Z2lucy9qc3BzeWNoLWZ1bGxzY3JlZW4vIGZ1bGxzY3JlZW4gcGx1Z2luIGRvY3VtZW50YXRpb24gb24ganNwc3ljaC5vcmd9XHJcbiAqL1xyXG5jbGFzcyBGdWxsc2NyZWVuUGx1Z2luIHtcclxuICAgIGNvbnN0cnVjdG9yKGpzUHN5Y2gpIHtcclxuICAgICAgICB0aGlzLmpzUHN5Y2ggPSBqc1BzeWNoO1xyXG4gICAgfVxyXG4gICAgdHJpYWwoZGlzcGxheV9lbGVtZW50LCB0cmlhbCkge1xyXG4gICAgICAgIC8vIGNoZWNrIGlmIGtleXMgYXJlIGFsbG93ZWQgaW4gZnVsbHNjcmVlbiBtb2RlXHJcbiAgICAgICAgdmFyIGtleWJvYXJkTm90QWxsb3dlZCA9IHR5cGVvZiBFbGVtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIFwiQUxMT1dfS0VZQk9BUkRfSU5QVVRcIiBpbiBFbGVtZW50O1xyXG4gICAgICAgIGlmIChrZXlib2FyZE5vdEFsbG93ZWQpIHtcclxuICAgICAgICAgICAgLy8gVGhpcyBpcyBTYWZhcmksIGFuZCBrZXlib2FyZCBldmVudHMgd2lsbCBiZSBkaXNhYmxlZC4gRG9uJ3QgYWxsb3cgZnVsbHNjcmVlbiBoZXJlLlxyXG4gICAgICAgICAgICAvLyBkbyBzb21ldGhpbmcgZWxzZT9cclxuICAgICAgICAgICAgdGhpcy5lbmRUcmlhbChkaXNwbGF5X2VsZW1lbnQsIGZhbHNlLCB0cmlhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodHJpYWwuZnVsbHNjcmVlbl9tb2RlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dEaXNwbGF5KGRpc3BsYXlfZWxlbWVudCwgdHJpYWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5leGl0RnVsbFNjcmVlbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbmRUcmlhbChkaXNwbGF5X2VsZW1lbnQsIHRydWUsIHRyaWFsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHNob3dEaXNwbGF5KGRpc3BsYXlfZWxlbWVudCwgdHJpYWwpIHtcclxuICAgICAgICBkaXNwbGF5X2VsZW1lbnQuaW5uZXJIVE1MID0gYFxuICAgICAgJHt0cmlhbC5tZXNzYWdlfVxuICAgICAgPGJ1dHRvbiBpZD1cImpzcHN5Y2gtZnVsbHNjcmVlbi1idG5cIiBjbGFzcz1cImpzcHN5Y2gtYnRuXCI+JHt0cmlhbC5idXR0b25fbGFiZWx9PC9idXR0b24+XG4gICAgYDtcclxuICAgICAgICBkaXNwbGF5X2VsZW1lbnQucXVlcnlTZWxlY3RvcihcIiNqc3BzeWNoLWZ1bGxzY3JlZW4tYnRuXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZW50ZXJGdWxsU2NyZWVuKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kVHJpYWwoZGlzcGxheV9lbGVtZW50LCB0cnVlLCB0cmlhbCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbmRUcmlhbChkaXNwbGF5X2VsZW1lbnQsIHN1Y2Nlc3MsIHRyaWFsKSB7XHJcbiAgICAgICAgZGlzcGxheV9lbGVtZW50LmlubmVySFRNTCA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5qc1BzeWNoLnBsdWdpbkFQSS5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdmFyIHRyaWFsX2RhdGEgPSB7XHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBzdWNjZXNzLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLmpzUHN5Y2guZmluaXNoVHJpYWwodHJpYWxfZGF0YSk7XHJcbiAgICAgICAgfSwgdHJpYWwuZGVsYXlfYWZ0ZXIpO1xyXG4gICAgfVxyXG4gICAgZW50ZXJGdWxsU2NyZWVuKCkge1xyXG4gICAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xyXG4gICAgICAgIGlmIChlbGVtZW50LnJlcXVlc3RGdWxsc2NyZWVuKSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQucmVxdWVzdEZ1bGxzY3JlZW4oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoZWxlbWVudFtcIm1velJlcXVlc3RGdWxsU2NyZWVuXCJdKSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnRbXCJtb3pSZXF1ZXN0RnVsbFNjcmVlblwiXSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChlbGVtZW50W1wid2Via2l0UmVxdWVzdEZ1bGxzY3JlZW5cIl0pIHtcclxuICAgICAgICAgICAgZWxlbWVudFtcIndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuXCJdKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGVsZW1lbnRbXCJtc1JlcXVlc3RGdWxsc2NyZWVuXCJdKSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnRbXCJtc1JlcXVlc3RGdWxsc2NyZWVuXCJdKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZXhpdEZ1bGxTY3JlZW4oKSB7XHJcbiAgICAgICAgaWYgKGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50IHx8XHJcbiAgICAgICAgICAgIGRvY3VtZW50W1wibW96RnVsbFNjcmVlbkVsZW1lbnRcIl0gfHxcclxuICAgICAgICAgICAgZG9jdW1lbnRbXCJ3ZWJraXRGdWxsc2NyZWVuRWxlbWVudFwiXSkge1xyXG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pIHtcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnRbXCJtc0V4aXRGdWxsc2NyZWVuXCJdKSB7XHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudFtcIm1zRXhpdEZ1bGxzY3JlZW5cIl0oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChkb2N1bWVudFtcIm1vekNhbmNlbEZ1bGxTY3JlZW5cIl0pIHtcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50W1wibW96Q2FuY2VsRnVsbFNjcmVlblwiXSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGRvY3VtZW50W1wid2Via2l0RXhpdEZ1bGxzY3JlZW5cIl0pIHtcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50W1wid2Via2l0RXhpdEZ1bGxzY3JlZW5cIl0oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHNpbXVsYXRlKHRyaWFsLCBzaW11bGF0aW9uX21vZGUsIHNpbXVsYXRpb25fb3B0aW9ucywgbG9hZF9jYWxsYmFjaykge1xyXG4gICAgICAgIGlmIChzaW11bGF0aW9uX21vZGUgPT0gXCJkYXRhLW9ubHlcIikge1xyXG4gICAgICAgICAgICBsb2FkX2NhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2ltdWxhdGVfZGF0YV9vbmx5KHRyaWFsLCBzaW11bGF0aW9uX29wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2ltdWxhdGlvbl9tb2RlID09IFwidmlzdWFsXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5zaW11bGF0ZV92aXN1YWwodHJpYWwsIHNpbXVsYXRpb25fb3B0aW9ucywgbG9hZF9jYWxsYmFjayk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgY3JlYXRlX3NpbXVsYXRpb25fZGF0YSh0cmlhbCwgc2ltdWxhdGlvbl9vcHRpb25zKSB7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdF9kYXRhID0ge1xyXG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuanNQc3ljaC5wbHVnaW5BUEkubWVyZ2VTaW11bGF0aW9uRGF0YShkZWZhdWx0X2RhdGEsIHNpbXVsYXRpb25fb3B0aW9ucyk7XHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9XHJcbiAgICBzaW11bGF0ZV9kYXRhX29ubHkodHJpYWwsIHNpbXVsYXRpb25fb3B0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmNyZWF0ZV9zaW11bGF0aW9uX2RhdGEodHJpYWwsIHNpbXVsYXRpb25fb3B0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5qc1BzeWNoLmZpbmlzaFRyaWFsKGRhdGEpO1xyXG4gICAgfVxyXG4gICAgc2ltdWxhdGVfdmlzdWFsKHRyaWFsLCBzaW11bGF0aW9uX29wdGlvbnMsIGxvYWRfY2FsbGJhY2spIHtcclxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5jcmVhdGVfc2ltdWxhdGlvbl9kYXRhKHRyaWFsLCBzaW11bGF0aW9uX29wdGlvbnMpO1xyXG4gICAgICAgIGNvbnN0IGRpc3BsYXlfZWxlbWVudCA9IHRoaXMuanNQc3ljaC5nZXREaXNwbGF5RWxlbWVudCgpO1xyXG4gICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kVHJpYWwoZGlzcGxheV9lbGVtZW50LCBmYWxzZSwgdHJpYWwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy50cmlhbChkaXNwbGF5X2VsZW1lbnQsIHRyaWFsKTtcclxuICAgICAgICAgICAgbG9hZF9jYWxsYmFjaygpO1xyXG4gICAgICAgICAgICB0aGlzLmpzUHN5Y2gucGx1Z2luQVBJLmNsaWNrVGFyZ2V0KGRpc3BsYXlfZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiI2pzcHN5Y2gtZnVsbHNjcmVlbi1idG5cIiksIHRoaXMuanNQc3ljaC5yYW5kb21pemF0aW9uLnNhbXBsZUV4R2F1c3NpYW4oMTAwMCwgMTAwLCAxIC8gMjAwLCB0cnVlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbkZ1bGxzY3JlZW5QbHVnaW4uaW5mbyA9IGluZm87XG5cbmV4cG9ydCB7IEZ1bGxzY3JlZW5QbHVnaW4gYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iLCJpbXBvcnQgeyBQYXJhbWV0ZXJUeXBlIH0gZnJvbSAnanNwc3ljaCc7XG5cbmNvbnN0IGluZm8gPSB7XHJcbiAgICBuYW1lOiBcImh0bWwta2V5Ym9hcmQtcmVzcG9uc2VcIixcclxuICAgIHBhcmFtZXRlcnM6IHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgSFRNTCBzdHJpbmcgdG8gYmUgZGlzcGxheWVkLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHN0aW11bHVzOiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuSFRNTF9TVFJJTkcsXHJcbiAgICAgICAgICAgIHByZXR0eV9uYW1lOiBcIlN0aW11bHVzXCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFycmF5IGNvbnRhaW5pbmcgdGhlIGtleShzKSB0aGUgc3ViamVjdCBpcyBhbGxvd2VkIHRvIHByZXNzIHRvIHJlc3BvbmQgdG8gdGhlIHN0aW11bHVzLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNob2ljZXM6IHtcclxuICAgICAgICAgICAgdHlwZTogUGFyYW1ldGVyVHlwZS5LRVlTLFxyXG4gICAgICAgICAgICBwcmV0dHlfbmFtZTogXCJDaG9pY2VzXCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IFwiQUxMX0tFWVNcIixcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFueSBjb250ZW50IGhlcmUgd2lsbCBiZSBkaXNwbGF5ZWQgYmVsb3cgdGhlIHN0aW11bHVzLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHByb21wdDoge1xyXG4gICAgICAgICAgICB0eXBlOiBQYXJhbWV0ZXJUeXBlLkhUTUxfU1RSSU5HLFxyXG4gICAgICAgICAgICBwcmV0dHlfbmFtZTogXCJQcm9tcHRcIixcclxuICAgICAgICAgICAgZGVmYXVsdDogbnVsbCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEhvdyBsb25nIHRvIHNob3cgdGhlIHN0aW11bHVzLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHN0aW11bHVzX2R1cmF0aW9uOiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuSU5ULFxyXG4gICAgICAgICAgICBwcmV0dHlfbmFtZTogXCJTdGltdWx1cyBkdXJhdGlvblwiLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiBudWxsLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSG93IGxvbmcgdG8gc2hvdyB0cmlhbCBiZWZvcmUgaXQgZW5kcy5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0cmlhbF9kdXJhdGlvbjoge1xyXG4gICAgICAgICAgICB0eXBlOiBQYXJhbWV0ZXJUeXBlLklOVCxcclxuICAgICAgICAgICAgcHJldHR5X25hbWU6IFwiVHJpYWwgZHVyYXRpb25cIixcclxuICAgICAgICAgICAgZGVmYXVsdDogbnVsbCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElmIHRydWUsIHRyaWFsIHdpbGwgZW5kIHdoZW4gc3ViamVjdCBtYWtlcyBhIHJlc3BvbnNlLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHJlc3BvbnNlX2VuZHNfdHJpYWw6IHtcclxuICAgICAgICAgICAgdHlwZTogUGFyYW1ldGVyVHlwZS5CT09MLFxyXG4gICAgICAgICAgICBwcmV0dHlfbmFtZTogXCJSZXNwb25zZSBlbmRzIHRyaWFsXCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHRydWUsXHJcbiAgICAgICAgfSxcclxuICAgIH0sXHJcbn07XHJcbi8qKlxyXG4gKiAqKmh0bWwta2V5Ym9hcmQtcmVzcG9uc2UqKlxyXG4gKlxyXG4gKiBqc1BzeWNoIHBsdWdpbiBmb3IgZGlzcGxheWluZyBhIHN0aW11bHVzIGFuZCBnZXR0aW5nIGEga2V5Ym9hcmQgcmVzcG9uc2VcclxuICpcclxuICogQGF1dGhvciBKb3NoIGRlIExlZXV3XHJcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vd3d3LmpzcHN5Y2gub3JnL3BsdWdpbnMvanNwc3ljaC1odG1sLWtleWJvYXJkLXJlc3BvbnNlLyBodG1sLWtleWJvYXJkLXJlc3BvbnNlIHBsdWdpbiBkb2N1bWVudGF0aW9uIG9uIGpzcHN5Y2gub3JnfVxyXG4gKi9cclxuY2xhc3MgSHRtbEtleWJvYXJkUmVzcG9uc2VQbHVnaW4ge1xyXG4gICAgY29uc3RydWN0b3IoanNQc3ljaCkge1xyXG4gICAgICAgIHRoaXMuanNQc3ljaCA9IGpzUHN5Y2g7XHJcbiAgICB9XHJcbiAgICB0cmlhbChkaXNwbGF5X2VsZW1lbnQsIHRyaWFsKSB7XHJcbiAgICAgICAgdmFyIG5ld19odG1sID0gJzxkaXYgaWQ9XCJqc3BzeWNoLWh0bWwta2V5Ym9hcmQtcmVzcG9uc2Utc3RpbXVsdXNcIj4nICsgdHJpYWwuc3RpbXVsdXMgKyBcIjwvZGl2PlwiO1xyXG4gICAgICAgIC8vIGFkZCBwcm9tcHRcclxuICAgICAgICBpZiAodHJpYWwucHJvbXB0ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIG5ld19odG1sICs9IHRyaWFsLnByb21wdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZHJhd1xyXG4gICAgICAgIGRpc3BsYXlfZWxlbWVudC5pbm5lckhUTUwgPSBuZXdfaHRtbDtcclxuICAgICAgICAvLyBzdG9yZSByZXNwb25zZVxyXG4gICAgICAgIHZhciByZXNwb25zZSA9IHtcclxuICAgICAgICAgICAgcnQ6IG51bGwsXHJcbiAgICAgICAgICAgIGtleTogbnVsbCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8vIGZ1bmN0aW9uIHRvIGVuZCB0cmlhbCB3aGVuIGl0IGlzIHRpbWVcclxuICAgICAgICBjb25zdCBlbmRfdHJpYWwgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIGtpbGwgYW55IHJlbWFpbmluZyBzZXRUaW1lb3V0IGhhbmRsZXJzXHJcbiAgICAgICAgICAgIHRoaXMuanNQc3ljaC5wbHVnaW5BUEkuY2xlYXJBbGxUaW1lb3V0cygpO1xyXG4gICAgICAgICAgICAvLyBraWxsIGtleWJvYXJkIGxpc3RlbmVyc1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGtleWJvYXJkTGlzdGVuZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuanNQc3ljaC5wbHVnaW5BUEkuY2FuY2VsS2V5Ym9hcmRSZXNwb25zZShrZXlib2FyZExpc3RlbmVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBnYXRoZXIgdGhlIGRhdGEgdG8gc3RvcmUgZm9yIHRoZSB0cmlhbFxyXG4gICAgICAgICAgICB2YXIgdHJpYWxfZGF0YSA9IHtcclxuICAgICAgICAgICAgICAgIHJ0OiByZXNwb25zZS5ydCxcclxuICAgICAgICAgICAgICAgIHN0aW11bHVzOiB0cmlhbC5zdGltdWx1cyxcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlOiByZXNwb25zZS5rZXksXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIC8vIGNsZWFyIHRoZSBkaXNwbGF5XHJcbiAgICAgICAgICAgIGRpc3BsYXlfZWxlbWVudC5pbm5lckhUTUwgPSBcIlwiO1xyXG4gICAgICAgICAgICAvLyBtb3ZlIG9uIHRvIHRoZSBuZXh0IHRyaWFsXHJcbiAgICAgICAgICAgIHRoaXMuanNQc3ljaC5maW5pc2hUcmlhbCh0cmlhbF9kYXRhKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8vIGZ1bmN0aW9uIHRvIGhhbmRsZSByZXNwb25zZXMgYnkgdGhlIHN1YmplY3RcclxuICAgICAgICB2YXIgYWZ0ZXJfcmVzcG9uc2UgPSAoaW5mbykgPT4ge1xyXG4gICAgICAgICAgICAvLyBhZnRlciBhIHZhbGlkIHJlc3BvbnNlLCB0aGUgc3RpbXVsdXMgd2lsbCBoYXZlIHRoZSBDU1MgY2xhc3MgJ3Jlc3BvbmRlZCdcclxuICAgICAgICAgICAgLy8gd2hpY2ggY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSB2aXN1YWwgZmVlZGJhY2sgdGhhdCBhIHJlc3BvbnNlIHdhcyByZWNvcmRlZFxyXG4gICAgICAgICAgICBkaXNwbGF5X2VsZW1lbnQucXVlcnlTZWxlY3RvcihcIiNqc3BzeWNoLWh0bWwta2V5Ym9hcmQtcmVzcG9uc2Utc3RpbXVsdXNcIikuY2xhc3NOYW1lICs9XHJcbiAgICAgICAgICAgICAgICBcIiByZXNwb25kZWRcIjtcclxuICAgICAgICAgICAgLy8gb25seSByZWNvcmQgdGhlIGZpcnN0IHJlc3BvbnNlXHJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5rZXkgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBpbmZvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0cmlhbC5yZXNwb25zZV9lbmRzX3RyaWFsKSB7XHJcbiAgICAgICAgICAgICAgICBlbmRfdHJpYWwoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy8gc3RhcnQgdGhlIHJlc3BvbnNlIGxpc3RlbmVyXHJcbiAgICAgICAgaWYgKHRyaWFsLmNob2ljZXMgIT0gXCJOT19LRVlTXCIpIHtcclxuICAgICAgICAgICAgdmFyIGtleWJvYXJkTGlzdGVuZXIgPSB0aGlzLmpzUHN5Y2gucGx1Z2luQVBJLmdldEtleWJvYXJkUmVzcG9uc2Uoe1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2tfZnVuY3Rpb246IGFmdGVyX3Jlc3BvbnNlLFxyXG4gICAgICAgICAgICAgICAgdmFsaWRfcmVzcG9uc2VzOiB0cmlhbC5jaG9pY2VzLFxyXG4gICAgICAgICAgICAgICAgcnRfbWV0aG9kOiBcInBlcmZvcm1hbmNlXCIsXHJcbiAgICAgICAgICAgICAgICBwZXJzaXN0OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGFsbG93X2hlbGRfa2V5OiBmYWxzZSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGhpZGUgc3RpbXVsdXMgaWYgc3RpbXVsdXNfZHVyYXRpb24gaXMgc2V0XHJcbiAgICAgICAgaWYgKHRyaWFsLnN0aW11bHVzX2R1cmF0aW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuanNQc3ljaC5wbHVnaW5BUEkuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBkaXNwbGF5X2VsZW1lbnQucXVlcnlTZWxlY3RvcihcIiNqc3BzeWNoLWh0bWwta2V5Ym9hcmQtcmVzcG9uc2Utc3RpbXVsdXNcIikuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcbiAgICAgICAgICAgIH0sIHRyaWFsLnN0aW11bHVzX2R1cmF0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZW5kIHRyaWFsIGlmIHRyaWFsX2R1cmF0aW9uIGlzIHNldFxyXG4gICAgICAgIGlmICh0cmlhbC50cmlhbF9kdXJhdGlvbiAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLmpzUHN5Y2gucGx1Z2luQVBJLnNldFRpbWVvdXQoZW5kX3RyaWFsLCB0cmlhbC50cmlhbF9kdXJhdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc2ltdWxhdGUodHJpYWwsIHNpbXVsYXRpb25fbW9kZSwgc2ltdWxhdGlvbl9vcHRpb25zLCBsb2FkX2NhbGxiYWNrKSB7XHJcbiAgICAgICAgaWYgKHNpbXVsYXRpb25fbW9kZSA9PSBcImRhdGEtb25seVwiKSB7XHJcbiAgICAgICAgICAgIGxvYWRfY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgdGhpcy5zaW11bGF0ZV9kYXRhX29ubHkodHJpYWwsIHNpbXVsYXRpb25fb3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzaW11bGF0aW9uX21vZGUgPT0gXCJ2aXN1YWxcIikge1xyXG4gICAgICAgICAgICB0aGlzLnNpbXVsYXRlX3Zpc3VhbCh0cmlhbCwgc2ltdWxhdGlvbl9vcHRpb25zLCBsb2FkX2NhbGxiYWNrKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjcmVhdGVfc2ltdWxhdGlvbl9kYXRhKHRyaWFsLCBzaW11bGF0aW9uX29wdGlvbnMpIHtcclxuICAgICAgICBjb25zdCBkZWZhdWx0X2RhdGEgPSB7XHJcbiAgICAgICAgICAgIHN0aW11bHVzOiB0cmlhbC5zdGltdWx1cyxcclxuICAgICAgICAgICAgcnQ6IHRoaXMuanNQc3ljaC5yYW5kb21pemF0aW9uLnNhbXBsZUV4R2F1c3NpYW4oNTAwLCA1MCwgMSAvIDE1MCwgdHJ1ZSksXHJcbiAgICAgICAgICAgIHJlc3BvbnNlOiB0aGlzLmpzUHN5Y2gucGx1Z2luQVBJLmdldFZhbGlkS2V5KHRyaWFsLmNob2ljZXMpLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuanNQc3ljaC5wbHVnaW5BUEkubWVyZ2VTaW11bGF0aW9uRGF0YShkZWZhdWx0X2RhdGEsIHNpbXVsYXRpb25fb3B0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5qc1BzeWNoLnBsdWdpbkFQSS5lbnN1cmVTaW11bGF0aW9uRGF0YUNvbnNpc3RlbmN5KHRyaWFsLCBkYXRhKTtcclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuICAgIHNpbXVsYXRlX2RhdGFfb25seSh0cmlhbCwgc2ltdWxhdGlvbl9vcHRpb25zKSB7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuY3JlYXRlX3NpbXVsYXRpb25fZGF0YSh0cmlhbCwgc2ltdWxhdGlvbl9vcHRpb25zKTtcclxuICAgICAgICB0aGlzLmpzUHN5Y2guZmluaXNoVHJpYWwoZGF0YSk7XHJcbiAgICB9XHJcbiAgICBzaW11bGF0ZV92aXN1YWwodHJpYWwsIHNpbXVsYXRpb25fb3B0aW9ucywgbG9hZF9jYWxsYmFjaykge1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmNyZWF0ZV9zaW11bGF0aW9uX2RhdGEodHJpYWwsIHNpbXVsYXRpb25fb3B0aW9ucyk7XHJcbiAgICAgICAgY29uc3QgZGlzcGxheV9lbGVtZW50ID0gdGhpcy5qc1BzeWNoLmdldERpc3BsYXlFbGVtZW50KCk7XHJcbiAgICAgICAgdGhpcy50cmlhbChkaXNwbGF5X2VsZW1lbnQsIHRyaWFsKTtcclxuICAgICAgICBsb2FkX2NhbGxiYWNrKCk7XHJcbiAgICAgICAgaWYgKGRhdGEucnQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5qc1BzeWNoLnBsdWdpbkFQSS5wcmVzc0tleShkYXRhLnJlc3BvbnNlLCBkYXRhLnJ0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuSHRtbEtleWJvYXJkUmVzcG9uc2VQbHVnaW4uaW5mbyA9IGluZm87XG5cbmV4cG9ydCB7IEh0bWxLZXlib2FyZFJlc3BvbnNlUGx1Z2luIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuIiwiaW1wb3J0IHsgUGFyYW1ldGVyVHlwZSB9IGZyb20gJ2pzcHN5Y2gnO1xuXG5jb25zdCBpbmZvID0ge1xyXG4gICAgbmFtZTogXCJzdXJ2ZXktdGV4dFwiLFxyXG4gICAgcGFyYW1ldGVyczoge1xyXG4gICAgICAgIHF1ZXN0aW9uczoge1xyXG4gICAgICAgICAgICB0eXBlOiBQYXJhbWV0ZXJUeXBlLkNPTVBMRVgsXHJcbiAgICAgICAgICAgIGFycmF5OiB0cnVlLFxyXG4gICAgICAgICAgICBwcmV0dHlfbmFtZTogXCJRdWVzdGlvbnNcIixcclxuICAgICAgICAgICAgZGVmYXVsdDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBuZXN0ZWQ6IHtcclxuICAgICAgICAgICAgICAgIC8qKiBRdWVzdGlvbiBwcm9tcHQuICovXHJcbiAgICAgICAgICAgICAgICBwcm9tcHQ6IHtcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBQYXJhbWV0ZXJUeXBlLkhUTUxfU1RSSU5HLFxyXG4gICAgICAgICAgICAgICAgICAgIHByZXR0eV9uYW1lOiBcIlByb21wdFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAvKiogUGxhY2Vob2xkZXIgdGV4dCBpbiB0aGUgcmVzcG9uc2UgdGV4dCBib3guICovXHJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjoge1xyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuU1RSSU5HLFxyXG4gICAgICAgICAgICAgICAgICAgIHByZXR0eV9uYW1lOiBcIlBsYWNlaG9sZGVyXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogXCJcIixcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAvKiogVGhlIG51bWJlciBvZiByb3dzIGZvciB0aGUgcmVzcG9uc2UgdGV4dCBib3guICovXHJcbiAgICAgICAgICAgICAgICByb3dzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogUGFyYW1ldGVyVHlwZS5JTlQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJldHR5X25hbWU6IFwiUm93c1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDEsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgLyoqIFRoZSBudW1iZXIgb2YgY29sdW1ucyBmb3IgdGhlIHJlc3BvbnNlIHRleHQgYm94LiAqL1xyXG4gICAgICAgICAgICAgICAgY29sdW1uczoge1xyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuSU5ULFxyXG4gICAgICAgICAgICAgICAgICAgIHByZXR0eV9uYW1lOiBcIkNvbHVtbnNcIixcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiA0MCxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAvKiogV2hldGhlciBvciBub3QgYSByZXNwb25zZSB0byB0aGlzIHF1ZXN0aW9uIG11c3QgYmUgZ2l2ZW4gaW4gb3JkZXIgdG8gY29udGludWUuICovXHJcbiAgICAgICAgICAgICAgICByZXF1aXJlZDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuQk9PTCxcclxuICAgICAgICAgICAgICAgICAgICBwcmV0dHlfbmFtZTogXCJSZXF1aXJlZFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIC8qKiBOYW1lIG9mIHRoZSBxdWVzdGlvbiBpbiB0aGUgdHJpYWwgZGF0YS4gSWYgbm8gbmFtZSBpcyBnaXZlbiwgdGhlIHF1ZXN0aW9ucyBhcmUgbmFtZWQgUTAsIFExLCBldGMuICovXHJcbiAgICAgICAgICAgICAgICBuYW1lOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogUGFyYW1ldGVyVHlwZS5TVFJJTkcsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJldHR5X25hbWU6IFwiUXVlc3Rpb24gTmFtZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLyoqIElmIHRydWUsIHRoZSBvcmRlciBvZiB0aGUgcXVlc3Rpb25zIGluIHRoZSAncXVlc3Rpb25zJyBhcnJheSB3aWxsIGJlIHJhbmRvbWl6ZWQuICovXHJcbiAgICAgICAgcmFuZG9taXplX3F1ZXN0aW9uX29yZGVyOiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuQk9PTCxcclxuICAgICAgICAgICAgcHJldHR5X25hbWU6IFwiUmFuZG9taXplIFF1ZXN0aW9uIE9yZGVyXCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLyoqIEhUTUwtZm9ybWF0dGVkIHN0cmluZyB0byBkaXNwbGF5IGF0IHRvcCBvZiB0aGUgcGFnZSBhYm92ZSBhbGwgb2YgdGhlIHF1ZXN0aW9ucy4gKi9cclxuICAgICAgICBwcmVhbWJsZToge1xyXG4gICAgICAgICAgICB0eXBlOiBQYXJhbWV0ZXJUeXBlLkhUTUxfU1RSSU5HLFxyXG4gICAgICAgICAgICBwcmV0dHlfbmFtZTogXCJQcmVhbWJsZVwiLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiBudWxsLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLyoqIExhYmVsIG9mIHRoZSBidXR0b24gdG8gc3VibWl0IHJlc3BvbnNlcy4gKi9cclxuICAgICAgICBidXR0b25fbGFiZWw6IHtcclxuICAgICAgICAgICAgdHlwZTogUGFyYW1ldGVyVHlwZS5TVFJJTkcsXHJcbiAgICAgICAgICAgIHByZXR0eV9uYW1lOiBcIkJ1dHRvbiBsYWJlbFwiLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiBcIkNvbnRpbnVlXCIsXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvKiogU2V0dGluZyB0aGlzIHRvIHRydWUgd2lsbCBlbmFibGUgYnJvd3NlciBhdXRvLWNvbXBsZXRlIG9yIGF1dG8tZmlsbCBmb3IgdGhlIGZvcm0uICovXHJcbiAgICAgICAgYXV0b2NvbXBsZXRlOiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuQk9PTCxcclxuICAgICAgICAgICAgcHJldHR5X25hbWU6IFwiQWxsb3cgYXV0b2NvbXBsZXRlXCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxyXG4gICAgICAgIH0sXHJcbiAgICB9LFxyXG59O1xyXG4vKipcclxuICogKipzdXJ2ZXktdGV4dCoqXHJcbiAqXHJcbiAqIGpzUHN5Y2ggcGx1Z2luIGZvciBmcmVlIHRleHQgcmVzcG9uc2Ugc3VydmV5IHF1ZXN0aW9uc1xyXG4gKlxyXG4gKiBAYXV0aG9yIEpvc2ggZGUgTGVldXdcclxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93d3cuanNwc3ljaC5vcmcvcGx1Z2lucy9qc3BzeWNoLXN1cnZleS10ZXh0LyBzdXJ2ZXktdGV4dCBwbHVnaW4gZG9jdW1lbnRhdGlvbiBvbiBqc3BzeWNoLm9yZ31cclxuICovXHJcbmNsYXNzIFN1cnZleVRleHRQbHVnaW4ge1xyXG4gICAgY29uc3RydWN0b3IoanNQc3ljaCkge1xyXG4gICAgICAgIHRoaXMuanNQc3ljaCA9IGpzUHN5Y2g7XHJcbiAgICB9XHJcbiAgICB0cmlhbChkaXNwbGF5X2VsZW1lbnQsIHRyaWFsKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmlhbC5xdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0cmlhbC5xdWVzdGlvbnNbaV0ucm93cyA9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgICAgICB0cmlhbC5xdWVzdGlvbnNbaV0ucm93cyA9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmlhbC5xdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0cmlhbC5xdWVzdGlvbnNbaV0uY29sdW1ucyA9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgICAgICB0cmlhbC5xdWVzdGlvbnNbaV0uY29sdW1ucyA9IDQwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJpYWwucXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdHJpYWwucXVlc3Rpb25zW2ldLnZhbHVlID09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgICAgIHRyaWFsLnF1ZXN0aW9uc1tpXS52YWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGh0bWwgPSBcIlwiO1xyXG4gICAgICAgIC8vIHNob3cgcHJlYW1ibGUgdGV4dFxyXG4gICAgICAgIGlmICh0cmlhbC5wcmVhbWJsZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBodG1sICs9XHJcbiAgICAgICAgICAgICAgICAnPGRpdiBpZD1cImpzcHN5Y2gtc3VydmV5LXRleHQtcHJlYW1ibGVcIiBjbGFzcz1cImpzcHN5Y2gtc3VydmV5LXRleHQtcHJlYW1ibGVcIj4nICtcclxuICAgICAgICAgICAgICAgICAgICB0cmlhbC5wcmVhbWJsZSArXHJcbiAgICAgICAgICAgICAgICAgICAgXCI8L2Rpdj5cIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gc3RhcnQgZm9ybVxyXG4gICAgICAgIGlmICh0cmlhbC5hdXRvY29tcGxldGUpIHtcclxuICAgICAgICAgICAgaHRtbCArPSAnPGZvcm0gaWQ9XCJqc3BzeWNoLXN1cnZleS10ZXh0LWZvcm1cIj4nO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaHRtbCArPSAnPGZvcm0gaWQ9XCJqc3BzeWNoLXN1cnZleS10ZXh0LWZvcm1cIiBhdXRvY29tcGxldGU9XCJvZmZcIj4nO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBnZW5lcmF0ZSBxdWVzdGlvbiBvcmRlclxyXG4gICAgICAgIHZhciBxdWVzdGlvbl9vcmRlciA9IFtdO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJpYWwucXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHF1ZXN0aW9uX29yZGVyLnB1c2goaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0cmlhbC5yYW5kb21pemVfcXVlc3Rpb25fb3JkZXIpIHtcclxuICAgICAgICAgICAgcXVlc3Rpb25fb3JkZXIgPSB0aGlzLmpzUHN5Y2gucmFuZG9taXphdGlvbi5zaHVmZmxlKHF1ZXN0aW9uX29yZGVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gYWRkIHF1ZXN0aW9uc1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJpYWwucXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBxdWVzdGlvbiA9IHRyaWFsLnF1ZXN0aW9uc1txdWVzdGlvbl9vcmRlcltpXV07XHJcbiAgICAgICAgICAgIHZhciBxdWVzdGlvbl9pbmRleCA9IHF1ZXN0aW9uX29yZGVyW2ldO1xyXG4gICAgICAgICAgICBodG1sICs9XHJcbiAgICAgICAgICAgICAgICAnPGRpdiBpZD1cImpzcHN5Y2gtc3VydmV5LXRleHQtJyArXHJcbiAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb25faW5kZXggK1xyXG4gICAgICAgICAgICAgICAgICAgICdcIiBjbGFzcz1cImpzcHN5Y2gtc3VydmV5LXRleHQtcXVlc3Rpb25cIiBzdHlsZT1cIm1hcmdpbjogMmVtIDBlbTtcIj4nO1xyXG4gICAgICAgICAgICBodG1sICs9ICc8cCBjbGFzcz1cImpzcHN5Y2gtc3VydmV5LXRleHRcIj4nICsgcXVlc3Rpb24ucHJvbXB0ICsgXCI8L3A+XCI7XHJcbiAgICAgICAgICAgIHZhciBhdXRvZm9jdXMgPSBpID09IDAgPyBcImF1dG9mb2N1c1wiIDogXCJcIjtcclxuICAgICAgICAgICAgdmFyIHJlcSA9IHF1ZXN0aW9uLnJlcXVpcmVkID8gXCJyZXF1aXJlZFwiIDogXCJcIjtcclxuICAgICAgICAgICAgaWYgKHF1ZXN0aW9uLnJvd3MgPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgaHRtbCArPVxyXG4gICAgICAgICAgICAgICAgICAgICc8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImlucHV0LScgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbl9pbmRleCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdcIiAgbmFtZT1cIiNqc3BzeWNoLXN1cnZleS10ZXh0LXJlc3BvbnNlLScgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbl9pbmRleCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdcIiBkYXRhLW5hbWU9XCInICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb24ubmFtZSArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdcIiBzaXplPVwiJyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uLmNvbHVtbnMgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnXCIgJyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9mb2N1cyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIFwiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJyBwbGFjZWhvbGRlcj1cIicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbi5wbGFjZWhvbGRlciArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdcIj48L2lucHV0Pic7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBodG1sICs9XHJcbiAgICAgICAgICAgICAgICAgICAgJzx0ZXh0YXJlYSBpZD1cImlucHV0LScgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbl9pbmRleCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdcIiBuYW1lPVwiI2pzcHN5Y2gtc3VydmV5LXRleHQtcmVzcG9uc2UtJyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uX2luZGV4ICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ1wiIGRhdGEtbmFtZT1cIicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbi5uYW1lICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ1wiIGNvbHM9XCInICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb24uY29sdW1ucyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdcIiByb3dzPVwiJyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uLnJvd3MgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnXCIgJyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9mb2N1cyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIFwiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJyBwbGFjZWhvbGRlcj1cIicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbi5wbGFjZWhvbGRlciArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdcIj48L3RleHRhcmVhPic7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaHRtbCArPSBcIjwvZGl2PlwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBhZGQgc3VibWl0IGJ1dHRvblxyXG4gICAgICAgIGh0bWwgKz1cclxuICAgICAgICAgICAgJzxpbnB1dCB0eXBlPVwic3VibWl0XCIgaWQ9XCJqc3BzeWNoLXN1cnZleS10ZXh0LW5leHRcIiBjbGFzcz1cImpzcHN5Y2gtYnRuIGpzcHN5Y2gtc3VydmV5LXRleHRcIiB2YWx1ZT1cIicgK1xyXG4gICAgICAgICAgICAgICAgdHJpYWwuYnV0dG9uX2xhYmVsICtcclxuICAgICAgICAgICAgICAgICdcIj48L2lucHV0Pic7XHJcbiAgICAgICAgaHRtbCArPSBcIjwvZm9ybT5cIjtcclxuICAgICAgICBkaXNwbGF5X2VsZW1lbnQuaW5uZXJIVE1MID0gaHRtbDtcclxuICAgICAgICAvLyBiYWNrdXAgaW4gY2FzZSBhdXRvZm9jdXMgZG9lc24ndCB3b3JrXHJcbiAgICAgICAgZGlzcGxheV9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaW5wdXQtXCIgKyBxdWVzdGlvbl9vcmRlclswXSkuZm9jdXMoKTtcclxuICAgICAgICBkaXNwbGF5X2VsZW1lbnQucXVlcnlTZWxlY3RvcihcIiNqc3BzeWNoLXN1cnZleS10ZXh0LWZvcm1cIikuYWRkRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIC8vIG1lYXN1cmUgcmVzcG9uc2UgdGltZVxyXG4gICAgICAgICAgICB2YXIgZW5kVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG4gICAgICAgICAgICB2YXIgcmVzcG9uc2VfdGltZSA9IE1hdGgucm91bmQoZW5kVGltZSAtIHN0YXJ0VGltZSk7XHJcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBvYmplY3QgdG8gaG9sZCByZXNwb25zZXNcclxuICAgICAgICAgICAgdmFyIHF1ZXN0aW9uX2RhdGEgPSB7fTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHRyaWFsLnF1ZXN0aW9ucy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBpZCA9IFwiUVwiICsgaW5kZXg7XHJcbiAgICAgICAgICAgICAgICB2YXIgcV9lbGVtZW50ID0gZG9jdW1lbnRcclxuICAgICAgICAgICAgICAgICAgICAucXVlcnlTZWxlY3RvcihcIiNqc3BzeWNoLXN1cnZleS10ZXh0LVwiICsgaW5kZXgpXHJcbiAgICAgICAgICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoXCJ0ZXh0YXJlYSwgaW5wdXRcIik7XHJcbiAgICAgICAgICAgICAgICB2YXIgdmFsID0gcV9lbGVtZW50LnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBxX2VsZW1lbnQuYXR0cmlidXRlc1tcImRhdGEtbmFtZVwiXS52YWx1ZTtcclxuICAgICAgICAgICAgICAgIGlmIChuYW1lID09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lID0gaWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB2YXIgb2JqZSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgb2JqZVtuYW1lXSA9IHZhbDtcclxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ocXVlc3Rpb25fZGF0YSwgb2JqZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gc2F2ZSBkYXRhXHJcbiAgICAgICAgICAgIHZhciB0cmlhbGRhdGEgPSB7XHJcbiAgICAgICAgICAgICAgICBydDogcmVzcG9uc2VfdGltZSxcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlOiBxdWVzdGlvbl9kYXRhLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBkaXNwbGF5X2VsZW1lbnQuaW5uZXJIVE1MID0gXCJcIjtcclxuICAgICAgICAgICAgLy8gbmV4dCB0cmlhbFxyXG4gICAgICAgICAgICB0aGlzLmpzUHN5Y2guZmluaXNoVHJpYWwodHJpYWxkYXRhKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB2YXIgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XHJcbiAgICB9XHJcbiAgICBzaW11bGF0ZSh0cmlhbCwgc2ltdWxhdGlvbl9tb2RlLCBzaW11bGF0aW9uX29wdGlvbnMsIGxvYWRfY2FsbGJhY2spIHtcclxuICAgICAgICBpZiAoc2ltdWxhdGlvbl9tb2RlID09IFwiZGF0YS1vbmx5XCIpIHtcclxuICAgICAgICAgICAgbG9hZF9jYWxsYmFjaygpO1xyXG4gICAgICAgICAgICB0aGlzLnNpbXVsYXRlX2RhdGFfb25seSh0cmlhbCwgc2ltdWxhdGlvbl9vcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNpbXVsYXRpb25fbW9kZSA9PSBcInZpc3VhbFwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2ltdWxhdGVfdmlzdWFsKHRyaWFsLCBzaW11bGF0aW9uX29wdGlvbnMsIGxvYWRfY2FsbGJhY2spO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNyZWF0ZV9zaW11bGF0aW9uX2RhdGEodHJpYWwsIHNpbXVsYXRpb25fb3B0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uX2RhdGEgPSB7fTtcclxuICAgICAgICBsZXQgcnQgPSAxMDAwO1xyXG4gICAgICAgIGZvciAoY29uc3QgcSBvZiB0cmlhbC5xdWVzdGlvbnMpIHtcclxuICAgICAgICAgICAgY29uc3QgbmFtZSA9IHEubmFtZSA/IHEubmFtZSA6IGBRJHt0cmlhbC5xdWVzdGlvbnMuaW5kZXhPZihxKX1gO1xyXG4gICAgICAgICAgICBjb25zdCBhbnNfd29yZHMgPSBxLnJvd3MgPT0gMVxyXG4gICAgICAgICAgICAgICAgPyB0aGlzLmpzUHN5Y2gucmFuZG9taXphdGlvbi5zYW1wbGVFeHBvbmVudGlhbCgwLjI1KVxyXG4gICAgICAgICAgICAgICAgOiB0aGlzLmpzUHN5Y2gucmFuZG9taXphdGlvbi5yYW5kb21JbnQoMSwgMTApICogcS5yb3dzO1xyXG4gICAgICAgICAgICBxdWVzdGlvbl9kYXRhW25hbWVdID0gdGhpcy5qc1BzeWNoLnJhbmRvbWl6YXRpb24ucmFuZG9tV29yZHMoe1xyXG4gICAgICAgICAgICAgICAgZXhhY3RseTogYW5zX3dvcmRzLFxyXG4gICAgICAgICAgICAgICAgam9pbjogXCIgXCIsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBydCArPSB0aGlzLmpzUHN5Y2gucmFuZG9taXphdGlvbi5zYW1wbGVFeEdhdXNzaWFuKDIwMDAsIDQwMCwgMC4wMDQsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkZWZhdWx0X2RhdGEgPSB7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlOiBxdWVzdGlvbl9kYXRhLFxyXG4gICAgICAgICAgICBydDogcnQsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5qc1BzeWNoLnBsdWdpbkFQSS5tZXJnZVNpbXVsYXRpb25EYXRhKGRlZmF1bHRfZGF0YSwgc2ltdWxhdGlvbl9vcHRpb25zKTtcclxuICAgICAgICB0aGlzLmpzUHN5Y2gucGx1Z2luQVBJLmVuc3VyZVNpbXVsYXRpb25EYXRhQ29uc2lzdGVuY3kodHJpYWwsIGRhdGEpO1xyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfVxyXG4gICAgc2ltdWxhdGVfZGF0YV9vbmx5KHRyaWFsLCBzaW11bGF0aW9uX29wdGlvbnMpIHtcclxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5jcmVhdGVfc2ltdWxhdGlvbl9kYXRhKHRyaWFsLCBzaW11bGF0aW9uX29wdGlvbnMpO1xyXG4gICAgICAgIHRoaXMuanNQc3ljaC5maW5pc2hUcmlhbChkYXRhKTtcclxuICAgIH1cclxuICAgIHNpbXVsYXRlX3Zpc3VhbCh0cmlhbCwgc2ltdWxhdGlvbl9vcHRpb25zLCBsb2FkX2NhbGxiYWNrKSB7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuY3JlYXRlX3NpbXVsYXRpb25fZGF0YSh0cmlhbCwgc2ltdWxhdGlvbl9vcHRpb25zKTtcclxuICAgICAgICBjb25zdCBkaXNwbGF5X2VsZW1lbnQgPSB0aGlzLmpzUHN5Y2guZ2V0RGlzcGxheUVsZW1lbnQoKTtcclxuICAgICAgICB0aGlzLnRyaWFsKGRpc3BsYXlfZWxlbWVudCwgdHJpYWwpO1xyXG4gICAgICAgIGxvYWRfY2FsbGJhY2soKTtcclxuICAgICAgICBjb25zdCBhbnN3ZXJzID0gT2JqZWN0LmVudHJpZXMoZGF0YS5yZXNwb25zZSkubWFwKCh4KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB4WzFdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYW5zd2Vycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLmpzUHN5Y2gucGx1Z2luQVBJLmZpbGxUZXh0SW5wdXQoZGlzcGxheV9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYCNpbnB1dC0ke2l9YCksIGFuc3dlcnNbaV0sICgoZGF0YS5ydCAtIDEwMDApIC8gYW5zd2Vycy5sZW5ndGgpICogKGkgKyAxKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuanNQc3ljaC5wbHVnaW5BUEkuY2xpY2tUYXJnZXQoZGlzcGxheV9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjanNwc3ljaC1zdXJ2ZXktdGV4dC1uZXh0XCIpLCBkYXRhLnJ0KTtcclxuICAgIH1cclxufVxyXG5TdXJ2ZXlUZXh0UGx1Z2luLmluZm8gPSBpbmZvO1xuXG5leHBvcnQgeyBTdXJ2ZXlUZXh0UGx1Z2luIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuIiwiaW1wb3J0IHsgUGFyYW1ldGVyVHlwZSB9IGZyb20gJ2pzcHN5Y2gnO1xuXG5jb25zdCBpbmZvID0ge1xyXG4gICAgbmFtZTogXCJ2aWRlby1rZXlib2FyZC1yZXNwb25zZVwiLFxyXG4gICAgcGFyYW1ldGVyczoge1xyXG4gICAgICAgIC8qKiBBcnJheSBvZiB0aGUgdmlkZW8gZmlsZShzKSB0byBwbGF5LiBWaWRlbyBjYW4gYmUgcHJvdmlkZWQgaW4gbXVsdGlwbGUgZmlsZSBmb3JtYXRzIGZvciBiZXR0ZXIgY3Jvc3MtYnJvd3NlciBzdXBwb3J0LiAqL1xyXG4gICAgICAgIHN0aW11bHVzOiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuVklERU8sXHJcbiAgICAgICAgICAgIHByZXR0eV9uYW1lOiBcIlZpZGVvXCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgYXJyYXk6IHRydWUsXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvKiogQXJyYXkgY29udGFpbmluZyB0aGUga2V5KHMpIHRoZSBzdWJqZWN0IGlzIGFsbG93ZWQgdG8gcHJlc3MgdG8gcmVzcG9uZCB0byB0aGUgc3RpbXVsdXMuICovXHJcbiAgICAgICAgY2hvaWNlczoge1xyXG4gICAgICAgICAgICB0eXBlOiBQYXJhbWV0ZXJUeXBlLktFWVMsXHJcbiAgICAgICAgICAgIHByZXR0eV9uYW1lOiBcIkNob2ljZXNcIixcclxuICAgICAgICAgICAgZGVmYXVsdDogXCJBTExfS0VZU1wiLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLyoqIEFueSBjb250ZW50IGhlcmUgd2lsbCBiZSBkaXNwbGF5ZWQgYmVsb3cgdGhlIHN0aW11bHVzLiAqL1xyXG4gICAgICAgIHByb21wdDoge1xyXG4gICAgICAgICAgICB0eXBlOiBQYXJhbWV0ZXJUeXBlLkhUTUxfU1RSSU5HLFxyXG4gICAgICAgICAgICBwcmV0dHlfbmFtZTogXCJQcm9tcHRcIixcclxuICAgICAgICAgICAgZGVmYXVsdDogbnVsbCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIHZpZGVvIGluIHBpeGVscy4gKi9cclxuICAgICAgICB3aWR0aDoge1xyXG4gICAgICAgICAgICB0eXBlOiBQYXJhbWV0ZXJUeXBlLklOVCxcclxuICAgICAgICAgICAgcHJldHR5X25hbWU6IFwiV2lkdGhcIixcclxuICAgICAgICAgICAgZGVmYXVsdDogXCJcIixcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSB2aWRlbyBkaXNwbGF5IGluIHBpeGVscy4gKi9cclxuICAgICAgICBoZWlnaHQ6IHtcclxuICAgICAgICAgICAgdHlwZTogUGFyYW1ldGVyVHlwZS5JTlQsXHJcbiAgICAgICAgICAgIHByZXR0eV9uYW1lOiBcIkhlaWdodFwiLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiBcIlwiLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLyoqIElmIHRydWUsIHRoZSB2aWRlbyB3aWxsIGJlZ2luIHBsYXlpbmcgYXMgc29vbiBhcyBpdCBoYXMgbG9hZGVkLiAqL1xyXG4gICAgICAgIGF1dG9wbGF5OiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuQk9PTCxcclxuICAgICAgICAgICAgcHJldHR5X25hbWU6IFwiQXV0b3BsYXlcIixcclxuICAgICAgICAgICAgZGVmYXVsdDogdHJ1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8qKiBJZiB0cnVlLCB0aGUgc3ViamVjdCB3aWxsIGJlIGFibGUgdG8gcGF1c2UgdGhlIHZpZGVvIG9yIG1vdmUgdGhlIHBsYXliYWNrIHRvIGFueSBwb2ludCBpbiB0aGUgdmlkZW8uICovXHJcbiAgICAgICAgY29udHJvbHM6IHtcclxuICAgICAgICAgICAgdHlwZTogUGFyYW1ldGVyVHlwZS5CT09MLFxyXG4gICAgICAgICAgICBwcmV0dHlfbmFtZTogXCJDb250cm9sc1wiLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8qKiBUaW1lIHRvIHN0YXJ0IHRoZSBjbGlwLiBJZiBudWxsIChkZWZhdWx0KSwgdmlkZW8gd2lsbCBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLiAqL1xyXG4gICAgICAgIHN0YXJ0OiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuRkxPQVQsXHJcbiAgICAgICAgICAgIHByZXR0eV9uYW1lOiBcIlN0YXJ0XCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IG51bGwsXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvKiogVGltZSB0byBzdG9wIHRoZSBjbGlwLiBJZiBudWxsIChkZWZhdWx0KSwgdmlkZW8gd2lsbCBzdG9wIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuICovXHJcbiAgICAgICAgc3RvcDoge1xyXG4gICAgICAgICAgICB0eXBlOiBQYXJhbWV0ZXJUeXBlLkZMT0FULFxyXG4gICAgICAgICAgICBwcmV0dHlfbmFtZTogXCJTdG9wXCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IG51bGwsXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvKiogVGhlIHBsYXliYWNrIHJhdGUgb2YgdGhlIHZpZGVvLiAxIGlzIG5vcm1hbCwgPDEgaXMgc2xvd2VyLCA+MSBpcyBmYXN0ZXIuICovXHJcbiAgICAgICAgcmF0ZToge1xyXG4gICAgICAgICAgICB0eXBlOiBQYXJhbWV0ZXJUeXBlLkZMT0FULFxyXG4gICAgICAgICAgICBwcmV0dHlfbmFtZTogXCJSYXRlXCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IDEsXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvKiogSWYgdHJ1ZSwgdGhlIHRyaWFsIHdpbGwgZW5kIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSB2aWRlbyBmaW5pc2hlcyBwbGF5aW5nLiAqL1xyXG4gICAgICAgIHRyaWFsX2VuZHNfYWZ0ZXJfdmlkZW86IHtcclxuICAgICAgICAgICAgdHlwZTogUGFyYW1ldGVyVHlwZS5CT09MLFxyXG4gICAgICAgICAgICBwcmV0dHlfbmFtZTogXCJFbmQgdHJpYWwgYWZ0ZXIgdmlkZW8gZmluaXNoZXNcIixcclxuICAgICAgICAgICAgZGVmYXVsdDogZmFsc2UsXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvKiogSG93IGxvbmcgdG8gc2hvdyB0cmlhbCBiZWZvcmUgaXQgZW5kcy4gKi9cclxuICAgICAgICB0cmlhbF9kdXJhdGlvbjoge1xyXG4gICAgICAgICAgICB0eXBlOiBQYXJhbWV0ZXJUeXBlLklOVCxcclxuICAgICAgICAgICAgcHJldHR5X25hbWU6IFwiVHJpYWwgZHVyYXRpb25cIixcclxuICAgICAgICAgICAgZGVmYXVsdDogbnVsbCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8qKiBJZiB0cnVlLCB0aGUgdHJpYWwgd2lsbCBlbmQgd2hlbiBzdWJqZWN0IG1ha2VzIGEgcmVzcG9uc2UuICovXHJcbiAgICAgICAgcmVzcG9uc2VfZW5kc190cmlhbDoge1xyXG4gICAgICAgICAgICB0eXBlOiBQYXJhbWV0ZXJUeXBlLkJPT0wsXHJcbiAgICAgICAgICAgIHByZXR0eV9uYW1lOiBcIlJlc3BvbnNlIGVuZHMgdHJpYWxcIixcclxuICAgICAgICAgICAgZGVmYXVsdDogdHJ1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8qKiBJZiB0cnVlLCB0aGVuIHJlc3BvbnNlcyBhcmUgYWxsb3dlZCB3aGlsZSB0aGUgdmlkZW8gaXMgcGxheWluZy4gSWYgZmFsc2UsIHRoZW4gdGhlIHZpZGVvIG11c3QgZmluaXNoIHBsYXlpbmcgYmVmb3JlIGEgcmVzcG9uc2UgaXMgYWNjZXB0ZWQuICovXHJcbiAgICAgICAgcmVzcG9uc2VfYWxsb3dlZF93aGlsZV9wbGF5aW5nOiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuQk9PTCxcclxuICAgICAgICAgICAgcHJldHR5X25hbWU6IFwiUmVzcG9uc2UgYWxsb3dlZCB3aGlsZSBwbGF5aW5nXCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHRydWUsXHJcbiAgICAgICAgfSxcclxuICAgIH0sXHJcbn07XHJcbi8qKlxyXG4gKiAqKnZpZGVvLWtleWJvYXJkLXJlc3BvbnNlKipcclxuICpcclxuICoganNQc3ljaCBwbHVnaW4gZm9yIHBsYXlpbmcgYSB2aWRlbyBmaWxlIGFuZCBnZXR0aW5nIGEga2V5Ym9hcmQgcmVzcG9uc2VcclxuICpcclxuICogQGF1dGhvciBKb3NoIGRlIExlZXV3XHJcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vd3d3LmpzcHN5Y2gub3JnL3BsdWdpbnMvanNwc3ljaC12aWRlby1rZXlib2FyZC1yZXNwb25zZS8gdmlkZW8ta2V5Ym9hcmQtcmVzcG9uc2UgcGx1Z2luIGRvY3VtZW50YXRpb24gb24ganNwc3ljaC5vcmd9XHJcbiAqL1xyXG5jbGFzcyBWaWRlb0tleWJvYXJkUmVzcG9uc2VQbHVnaW4ge1xyXG4gICAgY29uc3RydWN0b3IoanNQc3ljaCkge1xyXG4gICAgICAgIHRoaXMuanNQc3ljaCA9IGpzUHN5Y2g7XHJcbiAgICB9XHJcbiAgICB0cmlhbChkaXNwbGF5X2VsZW1lbnQsIHRyaWFsKSB7XHJcbiAgICAgICAgLy8gY2F0Y2ggbWlzdGFrZSB3aGVyZSBzdGltdWxpIGFyZSBub3QgYW4gYXJyYXlcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodHJpYWwuc3RpbXVsdXMpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgXG4gICAgICAgIFRoZSBzdGltdWx1cyBwcm9wZXJ0eSBmb3IgdGhlIHZpZGVvLWtleWJvYXJkLXJlc3BvbnNlIHBsdWdpbiBtdXN0IGJlIGFuIGFycmF5XG4gICAgICAgIG9mIGZpbGVzLiBTZWUgaHR0cHM6Ly93d3cuanNwc3ljaC5vcmcvbGF0ZXN0L3BsdWdpbnMvdmlkZW8ta2V5Ym9hcmQtcmVzcG9uc2UvI3BhcmFtZXRlcnNcbiAgICAgIGApO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBzZXR1cCBzdGltdWx1c1xyXG4gICAgICAgIHZhciB2aWRlb19odG1sID0gXCI8ZGl2PlwiO1xyXG4gICAgICAgIHZpZGVvX2h0bWwgKz0gJzx2aWRlbyBpZD1cImpzcHN5Y2gtdmlkZW8ta2V5Ym9hcmQtcmVzcG9uc2Utc3RpbXVsdXNcIic7XHJcbiAgICAgICAgaWYgKHRyaWFsLndpZHRoKSB7XHJcbiAgICAgICAgICAgIHZpZGVvX2h0bWwgKz0gJyB3aWR0aD1cIicgKyB0cmlhbC53aWR0aCArICdcIic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0cmlhbC5oZWlnaHQpIHtcclxuICAgICAgICAgICAgdmlkZW9faHRtbCArPSAnIGhlaWdodD1cIicgKyB0cmlhbC5oZWlnaHQgKyAnXCInO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHJpYWwuYXV0b3BsYXkgJiYgdHJpYWwuc3RhcnQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAvLyBpZiBhdXRvcGxheSBpcyB0cnVlIGFuZCB0aGUgc3RhcnQgdGltZSBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIHZpZGVvIHdpbGwgc3RhcnQgYXV0b21hdGljYWxseVxyXG4gICAgICAgICAgICAvLyB2aWEgdGhlIHBsYXkoKSBtZXRob2QsIHJhdGhlciB0aGFuIHRoZSBhdXRvcGxheSBhdHRyaWJ1dGUsIHRvIHByZXZlbnQgc2hvd2luZyB0aGUgZmlyc3QgZnJhbWVcclxuICAgICAgICAgICAgdmlkZW9faHRtbCArPSBcIiBhdXRvcGxheSBcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRyaWFsLmNvbnRyb2xzKSB7XHJcbiAgICAgICAgICAgIHZpZGVvX2h0bWwgKz0gXCIgY29udHJvbHMgXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0cmlhbC5zdGFydCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAvLyBoaWRlIHZpZGVvIGVsZW1lbnQgd2hlbiBwYWdlIGxvYWRzIGlmIHRoZSBzdGFydCB0aW1lIGlzIHNwZWNpZmllZCxcclxuICAgICAgICAgICAgLy8gdG8gcHJldmVudCB0aGUgdmlkZW8gZWxlbWVudCBmcm9tIHNob3dpbmcgdGhlIGZpcnN0IGZyYW1lXHJcbiAgICAgICAgICAgIHZpZGVvX2h0bWwgKz0gJyBzdHlsZT1cInZpc2liaWxpdHk6IGhpZGRlbjtcIic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZpZGVvX2h0bWwgKz0gXCI+XCI7XHJcbiAgICAgICAgdmFyIHZpZGVvX3ByZWxvYWRfYmxvYiA9IHRoaXMuanNQc3ljaC5wbHVnaW5BUEkuZ2V0VmlkZW9CdWZmZXIodHJpYWwuc3RpbXVsdXNbMF0pO1xyXG4gICAgICAgIGlmICghdmlkZW9fcHJlbG9hZF9ibG9iKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJpYWwuc3RpbXVsdXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBmaWxlX25hbWUgPSB0cmlhbC5zdGltdWx1c1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChmaWxlX25hbWUuaW5kZXhPZihcIj9cIikgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZSA9IGZpbGVfbmFtZS5zdWJzdHJpbmcoMCwgZmlsZV9uYW1lLmluZGV4T2YoXCI/XCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZhciB0eXBlID0gZmlsZV9uYW1lLnN1YnN0cihmaWxlX25hbWUubGFzdEluZGV4T2YoXCIuXCIpICsgMSk7XHJcbiAgICAgICAgICAgICAgICB0eXBlID0gdHlwZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gXCJtb3ZcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIldhcm5pbmc6IHZpZGVvLWtleWJvYXJkLXJlc3BvbnNlIHBsdWdpbiBkb2VzIG5vdCByZWxpYWJseSBzdXBwb3J0IC5tb3YgZmlsZXMuXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmlkZW9faHRtbCArPSAnPHNvdXJjZSBzcmM9XCInICsgZmlsZV9uYW1lICsgJ1wiIHR5cGU9XCJ2aWRlby8nICsgdHlwZSArICdcIj4nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZpZGVvX2h0bWwgKz0gXCI8L3ZpZGVvPlwiO1xyXG4gICAgICAgIHZpZGVvX2h0bWwgKz0gXCI8L2Rpdj5cIjtcclxuICAgICAgICAvLyBhZGQgcHJvbXB0IGlmIHRoZXJlIGlzIG9uZVxyXG4gICAgICAgIGlmICh0cmlhbC5wcm9tcHQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgdmlkZW9faHRtbCArPSB0cmlhbC5wcm9tcHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRpc3BsYXlfZWxlbWVudC5pbm5lckhUTUwgPSB2aWRlb19odG1sO1xyXG4gICAgICAgIHZhciB2aWRlb19lbGVtZW50ID0gZGlzcGxheV9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjanNwc3ljaC12aWRlby1rZXlib2FyZC1yZXNwb25zZS1zdGltdWx1c1wiKTtcclxuICAgICAgICBpZiAodmlkZW9fcHJlbG9hZF9ibG9iKSB7XHJcbiAgICAgICAgICAgIHZpZGVvX2VsZW1lbnQuc3JjID0gdmlkZW9fcHJlbG9hZF9ibG9iO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2aWRlb19lbGVtZW50Lm9uZW5kZWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0cmlhbC50cmlhbF9lbmRzX2FmdGVyX3ZpZGVvKSB7XHJcbiAgICAgICAgICAgICAgICBlbmRfdHJpYWwoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodHJpYWwucmVzcG9uc2VfYWxsb3dlZF93aGlsZV9wbGF5aW5nID09IGZhbHNlICYmICF0cmlhbC50cmlhbF9lbmRzX2FmdGVyX3ZpZGVvKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBzdGFydCBrZXlib2FyZCBsaXN0ZW5lclxyXG4gICAgICAgICAgICAgICAgdGhpcy5qc1BzeWNoLnBsdWdpbkFQSS5nZXRLZXlib2FyZFJlc3BvbnNlKHtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja19mdW5jdGlvbjogYWZ0ZXJfcmVzcG9uc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRfcmVzcG9uc2VzOiB0cmlhbC5jaG9pY2VzLFxyXG4gICAgICAgICAgICAgICAgICAgIHJ0X21ldGhvZDogXCJwZXJmb3JtYW5jZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHBlcnNpc3Q6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFsbG93X2hlbGRfa2V5OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2aWRlb19lbGVtZW50LnBsYXliYWNrUmF0ZSA9IHRyaWFsLnJhdGU7XHJcbiAgICAgICAgLy8gaWYgdmlkZW8gc3RhcnQgdGltZSBpcyBzcGVjaWZpZWQsIGhpZGUgdGhlIHZpZGVvIGFuZCBzZXQgdGhlIHN0YXJ0aW5nIHRpbWVcclxuICAgICAgICAvLyBiZWZvcmUgc2hvd2luZyBhbmQgcGxheWluZywgc28gdGhhdCB0aGUgdmlkZW8gZG9lc24ndCBhdXRvbWF0aWNhbGx5IHNob3cgdGhlIGZpcnN0IGZyYW1lXHJcbiAgICAgICAgaWYgKHRyaWFsLnN0YXJ0ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHZpZGVvX2VsZW1lbnQucGF1c2UoKTtcclxuICAgICAgICAgICAgdmlkZW9fZWxlbWVudC5vbnNlZWtlZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHZpZGVvX2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwidmlzaWJsZVwiO1xyXG4gICAgICAgICAgICAgICAgdmlkZW9fZWxlbWVudC5tdXRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRyaWFsLmF1dG9wbGF5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmlkZW9fZWxlbWVudC5wbGF5KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2aWRlb19lbGVtZW50LnBhdXNlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB2aWRlb19lbGVtZW50Lm9uc2Vla2VkID0gKCkgPT4geyB9O1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB2aWRlb19lbGVtZW50Lm9ucGxheWluZyA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHZpZGVvX2VsZW1lbnQuY3VycmVudFRpbWUgPSB0cmlhbC5zdGFydDtcclxuICAgICAgICAgICAgICAgIHZpZGVvX2VsZW1lbnQub25wbGF5aW5nID0gKCkgPT4geyB9O1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAvLyBmaXggZm9yIGlPUy9NYWNPUyBicm93c2VyczogdmlkZW9zIGFyZW4ndCBzZWVrYWJsZSB1bnRpbCB0aGV5IHN0YXJ0IHBsYXlpbmcsIHNvIG5lZWQgdG8gaGlkZS9tdXRlLCBwbGF5LFxyXG4gICAgICAgICAgICAvLyBjaGFuZ2UgY3VycmVudCB0aW1lLCB0aGVuIHNob3cvdW5tdXRlXHJcbiAgICAgICAgICAgIHZpZGVvX2VsZW1lbnQubXV0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB2aWRlb19lbGVtZW50LnBsYXkoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHN0b3BwZWQgPSBmYWxzZTtcclxuICAgICAgICBpZiAodHJpYWwuc3RvcCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB2aWRlb19lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0aW1ldXBkYXRlXCIsIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgY3VycmVudHRpbWUgPSB2aWRlb19lbGVtZW50LmN1cnJlbnRUaW1lO1xyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnR0aW1lID49IHRyaWFsLnN0b3ApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRyaWFsLnJlc3BvbnNlX2FsbG93ZWRfd2hpbGVfcGxheWluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmpzUHN5Y2gucGx1Z2luQVBJLmdldEtleWJvYXJkUmVzcG9uc2Uoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfZnVuY3Rpb246IGFmdGVyX3Jlc3BvbnNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRfcmVzcG9uc2VzOiB0cmlhbC5jaG9pY2VzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRfbWV0aG9kOiBcInBlcmZvcm1hbmNlXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzaXN0OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X2hlbGRfa2V5OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHZpZGVvX2VsZW1lbnQucGF1c2UoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHJpYWwudHJpYWxfZW5kc19hZnRlcl92aWRlbyAmJiAhc3RvcHBlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRvIHByZXZlbnQgZW5kX3RyaWFsIGZyb20gYmVpbmcgY2FsbGVkIHR3aWNlLCBiZWNhdXNlIHRoZSB0aW1ldXBkYXRlIGV2ZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbiBmaXJlIGluIHF1aWNrIHN1Y2Nlc3Npb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHBlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZF90cmlhbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHN0b3JlIHJlc3BvbnNlXHJcbiAgICAgICAgdmFyIHJlc3BvbnNlID0ge1xyXG4gICAgICAgICAgICBydDogbnVsbCxcclxuICAgICAgICAgICAga2V5OiBudWxsLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy8gZnVuY3Rpb24gdG8gZW5kIHRyaWFsIHdoZW4gaXQgaXMgdGltZVxyXG4gICAgICAgIGNvbnN0IGVuZF90cmlhbCA9ICgpID0+IHtcclxuICAgICAgICAgICAgLy8ga2lsbCBhbnkgcmVtYWluaW5nIHNldFRpbWVvdXQgaGFuZGxlcnNcclxuICAgICAgICAgICAgdGhpcy5qc1BzeWNoLnBsdWdpbkFQSS5jbGVhckFsbFRpbWVvdXRzKCk7XHJcbiAgICAgICAgICAgIC8vIGtpbGwga2V5Ym9hcmQgbGlzdGVuZXJzXHJcbiAgICAgICAgICAgIHRoaXMuanNQc3ljaC5wbHVnaW5BUEkuY2FuY2VsQWxsS2V5Ym9hcmRSZXNwb25zZXMoKTtcclxuICAgICAgICAgICAgLy8gc3RvcCB0aGUgdmlkZW8gZmlsZSBpZiBpdCBpcyBwbGF5aW5nXHJcbiAgICAgICAgICAgIC8vIHJlbW92ZSBlbmQgZXZlbnQgbGlzdGVuZXJzIGlmIHRoZXkgZXhpc3RcclxuICAgICAgICAgICAgZGlzcGxheV9lbGVtZW50XHJcbiAgICAgICAgICAgICAgICAucXVlcnlTZWxlY3RvcihcIiNqc3BzeWNoLXZpZGVvLWtleWJvYXJkLXJlc3BvbnNlLXN0aW11bHVzXCIpXHJcbiAgICAgICAgICAgICAgICAucGF1c2UoKTtcclxuICAgICAgICAgICAgZGlzcGxheV9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjanNwc3ljaC12aWRlby1rZXlib2FyZC1yZXNwb25zZS1zdGltdWx1c1wiKS5vbmVuZGVkID0gKCkgPT4geyB9O1xyXG4gICAgICAgICAgICAvLyBnYXRoZXIgdGhlIGRhdGEgdG8gc3RvcmUgZm9yIHRoZSB0cmlhbFxyXG4gICAgICAgICAgICB2YXIgdHJpYWxfZGF0YSA9IHtcclxuICAgICAgICAgICAgICAgIHJ0OiByZXNwb25zZS5ydCxcclxuICAgICAgICAgICAgICAgIHN0aW11bHVzOiB0cmlhbC5zdGltdWx1cyxcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlOiByZXNwb25zZS5rZXksXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIC8vIGNsZWFyIHRoZSBkaXNwbGF5XHJcbiAgICAgICAgICAgIGRpc3BsYXlfZWxlbWVudC5pbm5lckhUTUwgPSBcIlwiO1xyXG4gICAgICAgICAgICAvLyBtb3ZlIG9uIHRvIHRoZSBuZXh0IHRyaWFsXHJcbiAgICAgICAgICAgIHRoaXMuanNQc3ljaC5maW5pc2hUcmlhbCh0cmlhbF9kYXRhKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8vIGZ1bmN0aW9uIHRvIGhhbmRsZSByZXNwb25zZXMgYnkgdGhlIHN1YmplY3RcclxuICAgICAgICB2YXIgYWZ0ZXJfcmVzcG9uc2UgPSAoaW5mbykgPT4ge1xyXG4gICAgICAgICAgICAvLyBhZnRlciBhIHZhbGlkIHJlc3BvbnNlLCB0aGUgc3RpbXVsdXMgd2lsbCBoYXZlIHRoZSBDU1MgY2xhc3MgJ3Jlc3BvbmRlZCdcclxuICAgICAgICAgICAgLy8gd2hpY2ggY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSB2aXN1YWwgZmVlZGJhY2sgdGhhdCBhIHJlc3BvbnNlIHdhcyByZWNvcmRlZFxyXG4gICAgICAgICAgICBkaXNwbGF5X2VsZW1lbnQucXVlcnlTZWxlY3RvcihcIiNqc3BzeWNoLXZpZGVvLWtleWJvYXJkLXJlc3BvbnNlLXN0aW11bHVzXCIpLmNsYXNzTmFtZSArPVxyXG4gICAgICAgICAgICAgICAgXCIgcmVzcG9uZGVkXCI7XHJcbiAgICAgICAgICAgIC8vIG9ubHkgcmVjb3JkIHRoZSBmaXJzdCByZXNwb25zZVxyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uua2V5ID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gaW5mbztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodHJpYWwucmVzcG9uc2VfZW5kc190cmlhbCkge1xyXG4gICAgICAgICAgICAgICAgZW5kX3RyaWFsKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIC8vIHN0YXJ0IHRoZSByZXNwb25zZSBsaXN0ZW5lclxyXG4gICAgICAgIGlmICh0cmlhbC5jaG9pY2VzICE9IFwiTk9fS0VZU1wiICYmIHRyaWFsLnJlc3BvbnNlX2FsbG93ZWRfd2hpbGVfcGxheWluZykge1xyXG4gICAgICAgICAgICB0aGlzLmpzUHN5Y2gucGx1Z2luQVBJLmdldEtleWJvYXJkUmVzcG9uc2Uoe1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2tfZnVuY3Rpb246IGFmdGVyX3Jlc3BvbnNlLFxyXG4gICAgICAgICAgICAgICAgdmFsaWRfcmVzcG9uc2VzOiB0cmlhbC5jaG9pY2VzLFxyXG4gICAgICAgICAgICAgICAgcnRfbWV0aG9kOiBcInBlcmZvcm1hbmNlXCIsXHJcbiAgICAgICAgICAgICAgICBwZXJzaXN0OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGFsbG93X2hlbGRfa2V5OiBmYWxzZSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGVuZCB0cmlhbCBpZiB0aW1lIGxpbWl0IGlzIHNldFxyXG4gICAgICAgIGlmICh0cmlhbC50cmlhbF9kdXJhdGlvbiAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLmpzUHN5Y2gucGx1Z2luQVBJLnNldFRpbWVvdXQoZW5kX3RyaWFsLCB0cmlhbC50cmlhbF9kdXJhdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc2ltdWxhdGUodHJpYWwsIHNpbXVsYXRpb25fbW9kZSwgc2ltdWxhdGlvbl9vcHRpb25zLCBsb2FkX2NhbGxiYWNrKSB7XHJcbiAgICAgICAgaWYgKHNpbXVsYXRpb25fbW9kZSA9PSBcImRhdGEtb25seVwiKSB7XHJcbiAgICAgICAgICAgIGxvYWRfY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgdGhpcy5zaW11bGF0ZV9kYXRhX29ubHkodHJpYWwsIHNpbXVsYXRpb25fb3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzaW11bGF0aW9uX21vZGUgPT0gXCJ2aXN1YWxcIikge1xyXG4gICAgICAgICAgICB0aGlzLnNpbXVsYXRlX3Zpc3VhbCh0cmlhbCwgc2ltdWxhdGlvbl9vcHRpb25zLCBsb2FkX2NhbGxiYWNrKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzaW11bGF0ZV9kYXRhX29ubHkodHJpYWwsIHNpbXVsYXRpb25fb3B0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmNyZWF0ZV9zaW11bGF0aW9uX2RhdGEodHJpYWwsIHNpbXVsYXRpb25fb3B0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5qc1BzeWNoLmZpbmlzaFRyaWFsKGRhdGEpO1xyXG4gICAgfVxyXG4gICAgc2ltdWxhdGVfdmlzdWFsKHRyaWFsLCBzaW11bGF0aW9uX29wdGlvbnMsIGxvYWRfY2FsbGJhY2spIHtcclxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5jcmVhdGVfc2ltdWxhdGlvbl9kYXRhKHRyaWFsLCBzaW11bGF0aW9uX29wdGlvbnMpO1xyXG4gICAgICAgIGNvbnN0IGRpc3BsYXlfZWxlbWVudCA9IHRoaXMuanNQc3ljaC5nZXREaXNwbGF5RWxlbWVudCgpO1xyXG4gICAgICAgIHRoaXMudHJpYWwoZGlzcGxheV9lbGVtZW50LCB0cmlhbCk7XHJcbiAgICAgICAgbG9hZF9jYWxsYmFjaygpO1xyXG4gICAgICAgIGNvbnN0IHZpZGVvX2VsZW1lbnQgPSBkaXNwbGF5X2VsZW1lbnQucXVlcnlTZWxlY3RvcihcIiNqc3BzeWNoLXZpZGVvLWJ1dHRvbi1yZXNwb25zZS1zdGltdWx1c1wiKTtcclxuICAgICAgICBjb25zdCByZXNwb25kID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZGF0YS5ydCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5qc1BzeWNoLnBsdWdpbkFQSS5wcmVzc0tleShkYXRhLnJlc3BvbnNlLCBkYXRhLnJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKCF0cmlhbC5yZXNwb25zZV9hbGxvd2VkX3doaWxlX3BsYXlpbmcpIHtcclxuICAgICAgICAgICAgdmlkZW9fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiZW5kZWRcIiwgcmVzcG9uZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXNwb25kKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgY3JlYXRlX3NpbXVsYXRpb25fZGF0YSh0cmlhbCwgc2ltdWxhdGlvbl9vcHRpb25zKSB7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdF9kYXRhID0ge1xyXG4gICAgICAgICAgICBzdGltdWx1czogdHJpYWwuc3RpbXVsdXMsXHJcbiAgICAgICAgICAgIHJ0OiB0aGlzLmpzUHN5Y2gucmFuZG9taXphdGlvbi5zYW1wbGVFeEdhdXNzaWFuKDUwMCwgNTAsIDEgLyAxNTAsIHRydWUpLFxyXG4gICAgICAgICAgICByZXNwb25zZTogdGhpcy5qc1BzeWNoLnBsdWdpbkFQSS5nZXRWYWxpZEtleSh0cmlhbC5jaG9pY2VzKSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmpzUHN5Y2gucGx1Z2luQVBJLm1lcmdlU2ltdWxhdGlvbkRhdGEoZGVmYXVsdF9kYXRhLCBzaW11bGF0aW9uX29wdGlvbnMpO1xyXG4gICAgICAgIHRoaXMuanNQc3ljaC5wbHVnaW5BUEkuZW5zdXJlU2ltdWxhdGlvbkRhdGFDb25zaXN0ZW5jeSh0cmlhbCwgZGF0YSk7XHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9XHJcbn1cclxuVmlkZW9LZXlib2FyZFJlc3BvbnNlUGx1Z2luLmluZm8gPSBpbmZvO1xuXG5leHBvcnQgeyBWaWRlb0tleWJvYXJkUmVzcG9uc2VQbHVnaW4gYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iLCIvKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxuXG52YXIgY29tbW9uanNHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fTtcblxuLy8gR2V0cyBhbGwgbm9uLWJ1aWx0aW4gcHJvcGVydGllcyB1cCB0aGUgcHJvdG90eXBlIGNoYWluXG5jb25zdCBnZXRBbGxQcm9wZXJ0aWVzID0gb2JqZWN0ID0+IHtcblx0Y29uc3QgcHJvcGVydGllcyA9IG5ldyBTZXQoKTtcblxuXHRkbyB7XG5cdFx0Zm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKG9iamVjdCkpIHtcblx0XHRcdHByb3BlcnRpZXMuYWRkKFtvYmplY3QsIGtleV0pO1xuXHRcdH1cblx0fSB3aGlsZSAoKG9iamVjdCA9IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KSkgJiYgb2JqZWN0ICE9PSBPYmplY3QucHJvdG90eXBlKTtcblxuXHRyZXR1cm4gcHJvcGVydGllcztcbn07XG5cbnZhciBhdXRvQmluZCA9IChzZWxmLCB7aW5jbHVkZSwgZXhjbHVkZX0gPSB7fSkgPT4ge1xuXHRjb25zdCBmaWx0ZXIgPSBrZXkgPT4ge1xuXHRcdGNvbnN0IG1hdGNoID0gcGF0dGVybiA9PiB0eXBlb2YgcGF0dGVybiA9PT0gJ3N0cmluZycgPyBrZXkgPT09IHBhdHRlcm4gOiBwYXR0ZXJuLnRlc3Qoa2V5KTtcblxuXHRcdGlmIChpbmNsdWRlKSB7XG5cdFx0XHRyZXR1cm4gaW5jbHVkZS5zb21lKG1hdGNoKTtcblx0XHR9XG5cblx0XHRpZiAoZXhjbHVkZSkge1xuXHRcdFx0cmV0dXJuICFleGNsdWRlLnNvbWUobWF0Y2gpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9O1xuXG5cdGZvciAoY29uc3QgW29iamVjdCwga2V5XSBvZiBnZXRBbGxQcm9wZXJ0aWVzKHNlbGYuY29uc3RydWN0b3IucHJvdG90eXBlKSkge1xuXHRcdGlmIChrZXkgPT09ICdjb25zdHJ1Y3RvcicgfHwgIWZpbHRlcihrZXkpKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRjb25zdCBkZXNjcmlwdG9yID0gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBrZXkpO1xuXHRcdGlmIChkZXNjcmlwdG9yICYmIHR5cGVvZiBkZXNjcmlwdG9yLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRzZWxmW2tleV0gPSBzZWxmW2tleV0uYmluZChzZWxmKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gc2VsZjtcbn07XG5cbnZhciB2ZXJzaW9uID0gXCI3LjIuMVwiO1xuXG5jbGFzcyBNaWdyYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UgPSBcIlRoZSBnbG9iYWwgYGpzUHN5Y2hgIHZhcmlhYmxlIGlzIG5vIGxvbmdlciBhdmFpbGFibGUgaW4ganNQc3ljaCB2Ny5cIikge1xyXG4gICAgICAgIHN1cGVyKGAke21lc3NhZ2V9IFBsZWFzZSBmb2xsb3cgdGhlIG1pZ3JhdGlvbiBndWlkZSBhdCBodHRwczovL3d3dy5qc3BzeWNoLm9yZy83LjAvc3VwcG9ydC9taWdyYXRpb24tdjcvIHRvIHVwZGF0ZSB5b3VyIGV4cGVyaW1lbnQuYCk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJNaWdyYXRpb25FcnJvclwiO1xyXG4gICAgfVxyXG59XHJcbi8vIERlZmluZSBhIGdsb2JhbCBqc1BzeWNoIG9iamVjdCB0byBoYW5kbGUgaW52b2NhdGlvbnMgb24gaXQgd2l0aCBtaWdyYXRpb24gZXJyb3JzXHJcbndpbmRvdy5qc1BzeWNoID0ge1xyXG4gICAgZ2V0IGluaXQoKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IE1pZ3JhdGlvbkVycm9yKFwiYGpzUHN5Y2guaW5pdCgpYCB3YXMgcmVwbGFjZWQgYnkgYGluaXRKc1BzeWNoKClgIGluIGpzUHN5Y2ggdjcuXCIpO1xyXG4gICAgfSxcclxuICAgIGdldCBkYXRhKCkge1xyXG4gICAgICAgIHRocm93IG5ldyBNaWdyYXRpb25FcnJvcigpO1xyXG4gICAgfSxcclxuICAgIGdldCByYW5kb21pemF0aW9uKCkge1xyXG4gICAgICAgIHRocm93IG5ldyBNaWdyYXRpb25FcnJvcigpO1xyXG4gICAgfSxcclxuICAgIGdldCB0dXJrKCkge1xyXG4gICAgICAgIHRocm93IG5ldyBNaWdyYXRpb25FcnJvcigpO1xyXG4gICAgfSxcclxuICAgIGdldCBwbHVnaW5BUEkoKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IE1pZ3JhdGlvbkVycm9yKCk7XHJcbiAgICB9LFxyXG4gICAgZ2V0IEFMTF9LRVlTKCkge1xyXG4gICAgICAgIHRocm93IG5ldyBNaWdyYXRpb25FcnJvcignanNQc3ljaC5BTExfS0VZUyB3YXMgcmVwbGFjZWQgYnkgdGhlIFwiQUxMX0tFWVNcIiBzdHJpbmcgaW4ganNQc3ljaCB2Ny4nKTtcclxuICAgIH0sXHJcbiAgICBnZXQgTk9fS0VZUygpIHtcclxuICAgICAgICB0aHJvdyBuZXcgTWlncmF0aW9uRXJyb3IoJ2pzUHN5Y2guTk9fS0VZUyB3YXMgcmVwbGFjZWQgYnkgdGhlIFwiTk9fS0VZU1wiIHN0cmluZyBpbiBqc1BzeWNoIHY3LicpO1xyXG4gICAgfSxcclxufTtcblxuLyoqXHJcbiAqIEZpbmRzIGFsbCBvZiB0aGUgdW5pcXVlIGl0ZW1zIGluIGFuIGFycmF5LlxyXG4gKiBAcGFyYW0gYXJyIFRoZSBhcnJheSB0byBleHRyYWN0IHVuaXF1ZSB2YWx1ZXMgZnJvbVxyXG4gKiBAcmV0dXJucyBBbiBhcnJheSB3aXRoIG9uZSBjb3B5IG9mIGVhY2ggdW5pcXVlIGl0ZW0gaW4gYGFycmBcclxuICovXHJcbmZ1bmN0aW9uIHVuaXF1ZShhcnIpIHtcclxuICAgIHJldHVybiBbLi4ubmV3IFNldChhcnIpXTtcclxufVxyXG5mdW5jdGlvbiBkZWVwQ29weShvYmopIHtcclxuICAgIGlmICghb2JqKVxyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICBsZXQgb3V0O1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xyXG4gICAgICAgIG91dCA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3QgeCBvZiBvYmopIHtcclxuICAgICAgICAgICAgb3V0LnB1c2goZGVlcENvcHkoeCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb3V0O1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiAmJiBvYmogIT09IG51bGwpIHtcclxuICAgICAgICBvdXQgPSB7fTtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcclxuICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICBvdXRba2V5XSA9IGRlZXBDb3B5KG9ialtrZXldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb3V0O1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxufVxuXG52YXIgdXRpbHMgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIHVuaXF1ZTogdW5pcXVlLFxuICAgIGRlZXBDb3B5OiBkZWVwQ29weVxufSk7XG5cbmNsYXNzIERhdGFDb2x1bW4ge1xyXG4gICAgY29uc3RydWN0b3IodmFsdWVzID0gW10pIHtcclxuICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlcztcclxuICAgIH1cclxuICAgIHN1bSgpIHtcclxuICAgICAgICBsZXQgcyA9IDA7XHJcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIHRoaXMudmFsdWVzKSB7XHJcbiAgICAgICAgICAgIHMgKz0gdjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHM7XHJcbiAgICB9XHJcbiAgICBtZWFuKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN1bSgpIC8gdGhpcy5jb3VudCgpO1xyXG4gICAgfVxyXG4gICAgbWVkaWFuKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnZhbHVlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbnVtYmVycyA9IHRoaXMudmFsdWVzLnNsaWNlKDApLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGEgLSBiO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IG1pZGRsZSA9IE1hdGguZmxvb3IobnVtYmVycy5sZW5ndGggLyAyKTtcclxuICAgICAgICBjb25zdCBpc0V2ZW4gPSBudW1iZXJzLmxlbmd0aCAlIDIgPT09IDA7XHJcbiAgICAgICAgcmV0dXJuIGlzRXZlbiA/IChudW1iZXJzW21pZGRsZV0gKyBudW1iZXJzW21pZGRsZSAtIDFdKSAvIDIgOiBudW1iZXJzW21pZGRsZV07XHJcbiAgICB9XHJcbiAgICBtaW4oKSB7XHJcbiAgICAgICAgcmV0dXJuIE1hdGgubWluLmFwcGx5KG51bGwsIHRoaXMudmFsdWVzKTtcclxuICAgIH1cclxuICAgIG1heCgpIHtcclxuICAgICAgICByZXR1cm4gTWF0aC5tYXguYXBwbHkobnVsbCwgdGhpcy52YWx1ZXMpO1xyXG4gICAgfVxyXG4gICAgY291bnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVzLmxlbmd0aDtcclxuICAgIH1cclxuICAgIHZhcmlhbmNlKCkge1xyXG4gICAgICAgIGNvbnN0IG1lYW4gPSB0aGlzLm1lYW4oKTtcclxuICAgICAgICBsZXQgc3VtX3NxdWFyZV9lcnJvciA9IDA7XHJcbiAgICAgICAgZm9yIChjb25zdCB4IG9mIHRoaXMudmFsdWVzKSB7XHJcbiAgICAgICAgICAgIHN1bV9zcXVhcmVfZXJyb3IgKz0gTWF0aC5wb3coeCAtIG1lYW4sIDIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBtc2UgPSBzdW1fc3F1YXJlX2Vycm9yIC8gKHRoaXMudmFsdWVzLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgIHJldHVybiBtc2U7XHJcbiAgICB9XHJcbiAgICBzZCgpIHtcclxuICAgICAgICBjb25zdCBtc2UgPSB0aGlzLnZhcmlhbmNlKCk7XHJcbiAgICAgICAgY29uc3Qgcm1zZSA9IE1hdGguc3FydChtc2UpO1xyXG4gICAgICAgIHJldHVybiBybXNlO1xyXG4gICAgfVxyXG4gICAgZnJlcXVlbmNpZXMoKSB7XHJcbiAgICAgICAgY29uc3QgdW5pcXVlID0ge307XHJcbiAgICAgICAgZm9yIChjb25zdCB4IG9mIHRoaXMudmFsdWVzKSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdW5pcXVlW3hdID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgICAgICB1bmlxdWVbeF0gPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdW5pcXVlW3hdKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVuaXF1ZTtcclxuICAgIH1cclxuICAgIGFsbChldmFsX2ZuKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCB4IG9mIHRoaXMudmFsdWVzKSB7XHJcbiAgICAgICAgICAgIGlmICghZXZhbF9mbih4KSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgc3Vic2V0KGV2YWxfZm4pIHtcclxuICAgICAgICBjb25zdCBvdXQgPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IHggb2YgdGhpcy52YWx1ZXMpIHtcclxuICAgICAgICAgICAgaWYgKGV2YWxfZm4oeCkpIHtcclxuICAgICAgICAgICAgICAgIG91dC5wdXNoKHgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgRGF0YUNvbHVtbihvdXQpO1xyXG4gICAgfVxyXG59XG5cbi8vIHByaXZhdGUgZnVuY3Rpb24gdG8gc2F2ZSB0ZXh0IGZpbGUgb24gbG9jYWwgZHJpdmVcclxuZnVuY3Rpb24gc2F2ZVRleHRUb0ZpbGUodGV4dHN0ciwgZmlsZW5hbWUpIHtcclxuICAgIGNvbnN0IGJsb2JUb1NhdmUgPSBuZXcgQmxvYihbdGV4dHN0cl0sIHtcclxuICAgICAgICB0eXBlOiBcInRleHQvcGxhaW5cIixcclxuICAgIH0pO1xyXG4gICAgbGV0IGJsb2JVUkwgPSBcIlwiO1xyXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cud2Via2l0VVJMICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgYmxvYlVSTCA9IHdpbmRvdy53ZWJraXRVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2JUb1NhdmUpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgYmxvYlVSTCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2JUb1NhdmUpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xyXG4gICAgbGluay5pZCA9IFwianNwc3ljaC1kb3dubG9hZC1hcy10ZXh0LWxpbmtcIjtcclxuICAgIGxpbmsuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgbGluay5kb3dubG9hZCA9IGZpbGVuYW1lO1xyXG4gICAgbGluay5ocmVmID0gYmxvYlVSTDtcclxuICAgIGxpbmsuY2xpY2soKTtcclxufVxyXG4vLyB0aGlzIGZ1bmN0aW9uIGJhc2VkIG9uIGNvZGUgc3VnZ2VzdGVkIGJ5IFN0YWNrT3ZlcmZsb3cgdXNlcnM6XHJcbi8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS91c2Vycy82NDc0MS96YWNoYXJ5XHJcbi8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS91c2Vycy8zMTcvam9zZXBoLXN0dXJ0ZXZhbnRcclxuZnVuY3Rpb24gSlNPTjJDU1Yob2JqQXJyYXkpIHtcclxuICAgIGNvbnN0IGFycmF5ID0gdHlwZW9mIG9iakFycmF5ICE9IFwib2JqZWN0XCIgPyBKU09OLnBhcnNlKG9iakFycmF5KSA6IG9iakFycmF5O1xyXG4gICAgbGV0IGxpbmUgPSBcIlwiO1xyXG4gICAgbGV0IHJlc3VsdCA9IFwiXCI7XHJcbiAgICBjb25zdCBjb2x1bW5zID0gW107XHJcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiBhcnJheSkge1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHJvdykge1xyXG4gICAgICAgICAgICBsZXQga2V5U3RyaW5nID0ga2V5ICsgXCJcIjtcclxuICAgICAgICAgICAga2V5U3RyaW5nID0gJ1wiJyArIGtleVN0cmluZy5yZXBsYWNlKC9cIi9nLCAnXCJcIicpICsgJ1wiLCc7XHJcbiAgICAgICAgICAgIGlmICghY29sdW1ucy5pbmNsdWRlcyhrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2goa2V5KTtcclxuICAgICAgICAgICAgICAgIGxpbmUgKz0ga2V5U3RyaW5nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGluZSA9IGxpbmUuc2xpY2UoMCwgLTEpOyAvLyByZW1vdmVzIGxhc3QgY29tbWFcclxuICAgIHJlc3VsdCArPSBsaW5lICsgXCJcXHJcXG5cIjtcclxuICAgIGZvciAoY29uc3Qgcm93IG9mIGFycmF5KSB7XHJcbiAgICAgICAgbGluZSA9IFwiXCI7XHJcbiAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgY29sdW1ucykge1xyXG4gICAgICAgICAgICBsZXQgdmFsdWUgPSB0eXBlb2Ygcm93W2NvbF0gPT09IFwidW5kZWZpbmVkXCIgPyBcIlwiIDogcm93W2NvbF07XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgdmFsdWVTdHJpbmcgPSB2YWx1ZSArIFwiXCI7XHJcbiAgICAgICAgICAgIGxpbmUgKz0gJ1wiJyArIHZhbHVlU3RyaW5nLnJlcGxhY2UoL1wiL2csICdcIlwiJykgKyAnXCIsJztcclxuICAgICAgICB9XHJcbiAgICAgICAgbGluZSA9IGxpbmUuc2xpY2UoMCwgLTEpO1xyXG4gICAgICAgIHJlc3VsdCArPSBsaW5lICsgXCJcXHJcXG5cIjtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuLy8gdGhpcyBmdW5jdGlvbiBpcyBtb2RpZmllZCBmcm9tIFN0YWNrT3ZlcmZsb3c6XHJcbi8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9wb3N0cy8zODU1Mzk0XHJcbmZ1bmN0aW9uIGdldFF1ZXJ5U3RyaW5nKCkge1xyXG4gICAgY29uc3QgYSA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guc3Vic3RyKDEpLnNwbGl0KFwiJlwiKTtcclxuICAgIGNvbnN0IGIgPSB7fTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7ICsraSkge1xyXG4gICAgICAgIGNvbnN0IHAgPSBhW2ldLnNwbGl0KFwiPVwiLCAyKTtcclxuICAgICAgICBpZiAocC5sZW5ndGggPT0gMSlcclxuICAgICAgICAgICAgYltwWzBdXSA9IFwiXCI7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBiW3BbMF1dID0gZGVjb2RlVVJJQ29tcG9uZW50KHBbMV0ucmVwbGFjZSgvXFwrL2csIFwiIFwiKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYjtcclxufVxuXG5jbGFzcyBEYXRhQ29sbGVjdGlvbiB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhID0gW10pIHtcclxuICAgICAgICB0aGlzLnRyaWFscyA9IGRhdGE7XHJcbiAgICB9XHJcbiAgICBwdXNoKG5ld19kYXRhKSB7XHJcbiAgICAgICAgdGhpcy50cmlhbHMucHVzaChuZXdfZGF0YSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICBqb2luKG90aGVyX2RhdGFfY29sbGVjdGlvbikge1xyXG4gICAgICAgIHRoaXMudHJpYWxzID0gdGhpcy50cmlhbHMuY29uY2F0KG90aGVyX2RhdGFfY29sbGVjdGlvbi52YWx1ZXMoKSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICB0b3AoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudHJpYWxzLmxlbmd0aCA8PSAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRhQ29sbGVjdGlvbihbdGhpcy50cmlhbHNbdGhpcy50cmlhbHMubGVuZ3RoIC0gMV1dKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFF1ZXJpZXMgdGhlIGZpcnN0IG4gZWxlbWVudHMgaW4gYSBjb2xsZWN0aW9uIG9mIHRyaWFscy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbiBBIHBvc2l0aXZlIGludGVnZXIgb2YgZWxlbWVudHMgdG8gcmV0dXJuLiBBIHZhbHVlIG9mXHJcbiAgICAgKiAgICAgICAgICBuIHRoYXQgaXMgbGVzcyB0aGFuIDEgd2lsbCB0aHJvdyBhbiBlcnJvci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIEZpcnN0IG4gb2JqZWN0cyBvZiBhIGNvbGxlY3Rpb24gb2YgdHJpYWxzLiBJZiBmZXdlciB0aGFuXHJcbiAgICAgKiAgICAgICAgIG4gdHJpYWxzIGFyZSBhdmFpbGFibGUsIHRoZSB0cmlhbHMubGVuZ3RoIGVsZW1lbnRzIHdpbGxcclxuICAgICAqICAgICAgICAgYmUgcmV0dXJuZWQuXHJcbiAgICAgKlxyXG4gICAgICovXHJcbiAgICBmaXJzdChuID0gMSkge1xyXG4gICAgICAgIGlmIChuIDwgMSkge1xyXG4gICAgICAgICAgICB0aHJvdyBgWW91IG11c3QgcXVlcnkgd2l0aCBhIHBvc2l0aXZlIG5vbnplcm8gaW50ZWdlci4gUGxlYXNlIHVzZSBhXG4gICAgICAgICAgICAgICBkaWZmZXJlbnQgdmFsdWUgZm9yIG4uYDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMudHJpYWxzLmxlbmd0aCA9PT0gMClcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRhQ29sbGVjdGlvbigpO1xyXG4gICAgICAgIGlmIChuID4gdGhpcy50cmlhbHMubGVuZ3RoKVxyXG4gICAgICAgICAgICBuID0gdGhpcy50cmlhbHMubGVuZ3RoO1xyXG4gICAgICAgIHJldHVybiBuZXcgRGF0YUNvbGxlY3Rpb24odGhpcy50cmlhbHMuc2xpY2UoMCwgbikpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBRdWVyaWVzIHRoZSBsYXN0IG4gZWxlbWVudHMgaW4gYSBjb2xsZWN0aW9uIG9mIHRyaWFscy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbiBBIHBvc2l0aXZlIGludGVnZXIgb2YgZWxlbWVudHMgdG8gcmV0dXJuLiBBIHZhbHVlIG9mXHJcbiAgICAgKiAgICAgICAgICBuIHRoYXQgaXMgbGVzcyB0aGFuIDEgd2lsbCB0aHJvdyBhbiBlcnJvci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIExhc3QgbiBvYmplY3RzIG9mIGEgY29sbGVjdGlvbiBvZiB0cmlhbHMuIElmIGZld2VyIHRoYW5cclxuICAgICAqICAgICAgICAgbiB0cmlhbHMgYXJlIGF2YWlsYWJsZSwgdGhlIHRyaWFscy5sZW5ndGggZWxlbWVudHMgd2lsbFxyXG4gICAgICogICAgICAgICBiZSByZXR1cm5lZC5cclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgIGxhc3QobiA9IDEpIHtcclxuICAgICAgICBpZiAobiA8IDEpIHtcclxuICAgICAgICAgICAgdGhyb3cgYFlvdSBtdXN0IHF1ZXJ5IHdpdGggYSBwb3NpdGl2ZSBub256ZXJvIGludGVnZXIuIFBsZWFzZSB1c2UgYVxuICAgICAgICAgICAgICAgZGlmZmVyZW50IHZhbHVlIGZvciBuLmA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnRyaWFscy5sZW5ndGggPT09IDApXHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0YUNvbGxlY3Rpb24oKTtcclxuICAgICAgICBpZiAobiA+IHRoaXMudHJpYWxzLmxlbmd0aClcclxuICAgICAgICAgICAgbiA9IHRoaXMudHJpYWxzLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gbmV3IERhdGFDb2xsZWN0aW9uKHRoaXMudHJpYWxzLnNsaWNlKHRoaXMudHJpYWxzLmxlbmd0aCAtIG4sIHRoaXMudHJpYWxzLmxlbmd0aCkpO1xyXG4gICAgfVxyXG4gICAgdmFsdWVzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRyaWFscztcclxuICAgIH1cclxuICAgIGNvdW50KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRyaWFscy5sZW5ndGg7XHJcbiAgICB9XHJcbiAgICByZWFkT25seSgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IERhdGFDb2xsZWN0aW9uKGRlZXBDb3B5KHRoaXMudHJpYWxzKSk7XHJcbiAgICB9XHJcbiAgICBhZGRUb0FsbChwcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCB0cmlhbCBvZiB0aGlzLnRyaWFscykge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRyaWFsLCBwcm9wZXJ0aWVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICBhZGRUb0xhc3QocHJvcGVydGllcykge1xyXG4gICAgICAgIGlmICh0aGlzLnRyaWFscy5sZW5ndGggIT0gMCkge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMudHJpYWxzW3RoaXMudHJpYWxzLmxlbmd0aCAtIDFdLCBwcm9wZXJ0aWVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICBmaWx0ZXIoZmlsdGVycykge1xyXG4gICAgICAgIC8vIFt7cDE6IHYxLCBwMjp2Mn0sIHtwMTp2Mn1dXHJcbiAgICAgICAgLy8ge3AxOiB2MX1cclxuICAgICAgICBsZXQgZjtcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmlsdGVycykpIHtcclxuICAgICAgICAgICAgZiA9IGRlZXBDb3B5KFtmaWx0ZXJzXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBmID0gZGVlcENvcHkoZmlsdGVycyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGZpbHRlcmVkX2RhdGEgPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IHRyaWFsIG9mIHRoaXMudHJpYWxzKSB7XHJcbiAgICAgICAgICAgIGxldCBrZWVwID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIGYpIHtcclxuICAgICAgICAgICAgICAgIGxldCBtYXRjaCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhmaWx0ZXIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0cmlhbFtrZXldICE9PSBcInVuZGVmaW5lZFwiICYmIHRyaWFsW2tleV0gPT09IGZpbHRlcltrZXldKSA7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAga2VlcCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9IC8vIGNhbiBicmVhayBiZWNhdXNlIGVhY2ggZmlsdGVyIGlzIE9SLlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChrZWVwKSB7XHJcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZF9kYXRhLnB1c2godHJpYWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgRGF0YUNvbGxlY3Rpb24oZmlsdGVyZWRfZGF0YSk7XHJcbiAgICB9XHJcbiAgICBmaWx0ZXJDdXN0b20oZm4pIHtcclxuICAgICAgICByZXR1cm4gbmV3IERhdGFDb2xsZWN0aW9uKHRoaXMudHJpYWxzLmZpbHRlcihmbikpO1xyXG4gICAgfVxyXG4gICAgZmlsdGVyQ29sdW1ucyhjb2x1bW5zKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhQ29sbGVjdGlvbih0aGlzLnRyaWFscy5tYXAoKHRyaWFsKSA9PiBPYmplY3QuZnJvbUVudHJpZXMoY29sdW1ucy5maWx0ZXIoKGtleSkgPT4ga2V5IGluIHRyaWFsKS5tYXAoKGtleSkgPT4gW2tleSwgdHJpYWxba2V5XV0pKSkpO1xyXG4gICAgfVxyXG4gICAgc2VsZWN0KGNvbHVtbikge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3QgdHJpYWwgb2YgdGhpcy50cmlhbHMpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0cmlhbFtjb2x1bW5dICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh0cmlhbFtjb2x1bW5dKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IERhdGFDb2x1bW4odmFsdWVzKTtcclxuICAgIH1cclxuICAgIGlnbm9yZShjb2x1bW5zKSB7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbHVtbnMpKSB7XHJcbiAgICAgICAgICAgIGNvbHVtbnMgPSBbY29sdW1uc107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG8gPSBkZWVwQ29weSh0aGlzLnRyaWFscyk7XHJcbiAgICAgICAgZm9yIChjb25zdCB0cmlhbCBvZiBvKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZGVsZXRlX2tleSBvZiBjb2x1bW5zKSB7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgdHJpYWxbZGVsZXRlX2tleV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhQ29sbGVjdGlvbihvKTtcclxuICAgIH1cclxuICAgIHVuaXF1ZU5hbWVzKCkge1xyXG4gICAgICAgIGNvbnN0IG5hbWVzID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCB0cmlhbCBvZiB0aGlzLnRyaWFscykge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0cmlhbCkpIHtcclxuICAgICAgICAgICAgICAgIGlmICghbmFtZXMuaW5jbHVkZXMoa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWVzLnB1c2goa2V5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmFtZXM7XHJcbiAgICB9XHJcbiAgICBjc3YoKSB7XHJcbiAgICAgICAgcmV0dXJuIEpTT04yQ1NWKHRoaXMudHJpYWxzKTtcclxuICAgIH1cclxuICAgIGpzb24ocHJldHR5ID0gZmFsc2UpIHtcclxuICAgICAgICBpZiAocHJldHR5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnRyaWFscywgbnVsbCwgXCJcXHRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnRyaWFscyk7XHJcbiAgICB9XHJcbiAgICBsb2NhbFNhdmUoZm9ybWF0LCBmaWxlbmFtZSkge1xyXG4gICAgICAgIGZvcm1hdCA9IGZvcm1hdC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGxldCBkYXRhX3N0cmluZztcclxuICAgICAgICBpZiAoZm9ybWF0ID09PSBcImpzb25cIikge1xyXG4gICAgICAgICAgICBkYXRhX3N0cmluZyA9IHRoaXMuanNvbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChmb3JtYXQgPT09IFwiY3N2XCIpIHtcclxuICAgICAgICAgICAgZGF0YV9zdHJpbmcgPSB0aGlzLmNzdigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGZvcm1hdCBzcGVjaWZpZWQgZm9yIGxvY2FsU2F2ZS4gTXVzdCBiZSBcImpzb25cIiBvciBcImNzdlwiLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzYXZlVGV4dFRvRmlsZShkYXRhX3N0cmluZywgZmlsZW5hbWUpO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIEpzUHN5Y2hEYXRhIHtcclxuICAgIGNvbnN0cnVjdG9yKGpzUHN5Y2gpIHtcclxuICAgICAgICB0aGlzLmpzUHN5Y2ggPSBqc1BzeWNoO1xyXG4gICAgICAgIC8vIGRhdGEgcHJvcGVydGllcyBmb3IgYWxsIHRyaWFsc1xyXG4gICAgICAgIHRoaXMuZGF0YVByb3BlcnRpZXMgPSB7fTtcclxuICAgICAgICB0aGlzLnJlc2V0KCk7XHJcbiAgICB9XHJcbiAgICByZXNldCgpIHtcclxuICAgICAgICB0aGlzLmFsbERhdGEgPSBuZXcgRGF0YUNvbGxlY3Rpb24oKTtcclxuICAgICAgICB0aGlzLmludGVyYWN0aW9uRGF0YSA9IG5ldyBEYXRhQ29sbGVjdGlvbigpO1xyXG4gICAgfVxyXG4gICAgZ2V0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFsbERhdGE7XHJcbiAgICB9XHJcbiAgICBnZXRJbnRlcmFjdGlvbkRhdGEoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJhY3Rpb25EYXRhO1xyXG4gICAgfVxyXG4gICAgd3JpdGUoZGF0YV9vYmplY3QpIHtcclxuICAgICAgICBjb25zdCBwcm9ncmVzcyA9IHRoaXMuanNQc3ljaC5nZXRQcm9ncmVzcygpO1xyXG4gICAgICAgIGNvbnN0IHRyaWFsID0gdGhpcy5qc1BzeWNoLmdldEN1cnJlbnRUcmlhbCgpO1xyXG4gICAgICAgIC8vdmFyIHRyaWFsX29wdF9kYXRhID0gdHlwZW9mIHRyaWFsLmRhdGEgPT0gJ2Z1bmN0aW9uJyA/IHRyaWFsLmRhdGEoKSA6IHRyaWFsLmRhdGE7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdF9kYXRhID0ge1xyXG4gICAgICAgICAgICB0cmlhbF90eXBlOiB0cmlhbC50eXBlLmluZm8ubmFtZSxcclxuICAgICAgICAgICAgdHJpYWxfaW5kZXg6IHByb2dyZXNzLmN1cnJlbnRfdHJpYWxfZ2xvYmFsLFxyXG4gICAgICAgICAgICB0aW1lX2VsYXBzZWQ6IHRoaXMuanNQc3ljaC5nZXRUb3RhbFRpbWUoKSxcclxuICAgICAgICAgICAgaW50ZXJuYWxfbm9kZV9pZDogdGhpcy5qc1BzeWNoLmdldEN1cnJlbnRUaW1lbGluZU5vZGVJRCgpLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5hbGxEYXRhLnB1c2goT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGF0YV9vYmplY3QpLCB0cmlhbC5kYXRhKSwgZGVmYXVsdF9kYXRhKSwgdGhpcy5kYXRhUHJvcGVydGllcykpO1xyXG4gICAgfVxyXG4gICAgYWRkUHJvcGVydGllcyhwcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgLy8gZmlyc3QsIGFkZCB0aGUgcHJvcGVydGllcyB0byBhbGwgZGF0YSB0aGF0J3MgYWxyZWFkeSBzdG9yZWRcclxuICAgICAgICB0aGlzLmFsbERhdGEuYWRkVG9BbGwocHJvcGVydGllcyk7XHJcbiAgICAgICAgLy8gbm93IGFkZCB0byBsaXN0IHNvIHRoYXQgaXQgZ2V0cyBhcHBlbmRlZCB0byBhbGwgZnV0dXJlIGRhdGFcclxuICAgICAgICB0aGlzLmRhdGFQcm9wZXJ0aWVzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5kYXRhUHJvcGVydGllcywgcHJvcGVydGllcyk7XHJcbiAgICB9XHJcbiAgICBhZGREYXRhVG9MYXN0VHJpYWwoZGF0YSkge1xyXG4gICAgICAgIHRoaXMuYWxsRGF0YS5hZGRUb0xhc3QoZGF0YSk7XHJcbiAgICB9XHJcbiAgICBnZXREYXRhQnlUaW1lbGluZU5vZGUobm9kZV9pZCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFsbERhdGEuZmlsdGVyQ3VzdG9tKCh4KSA9PiB4LmludGVybmFsX25vZGVfaWQuc2xpY2UoMCwgbm9kZV9pZC5sZW5ndGgpID09PSBub2RlX2lkKTtcclxuICAgIH1cclxuICAgIGdldExhc3RUcmlhbERhdGEoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWxsRGF0YS50b3AoKTtcclxuICAgIH1cclxuICAgIGdldExhc3RUaW1lbGluZURhdGEoKSB7XHJcbiAgICAgICAgY29uc3QgbGFzdHRyaWFsID0gdGhpcy5nZXRMYXN0VHJpYWxEYXRhKCk7XHJcbiAgICAgICAgY29uc3Qgbm9kZV9pZCA9IGxhc3R0cmlhbC5zZWxlY3QoXCJpbnRlcm5hbF9ub2RlX2lkXCIpLnZhbHVlc1swXTtcclxuICAgICAgICBpZiAodHlwZW9mIG5vZGVfaWQgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRhQ29sbGVjdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgcGFyZW50X25vZGVfaWQgPSBub2RlX2lkLnN1YnN0cigwLCBub2RlX2lkLmxhc3RJbmRleE9mKFwiLVwiKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGxhc3Rub2RlZGF0YSA9IHRoaXMuZ2V0RGF0YUJ5VGltZWxpbmVOb2RlKHBhcmVudF9ub2RlX2lkKTtcclxuICAgICAgICAgICAgcmV0dXJuIGxhc3Rub2RlZGF0YTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBkaXNwbGF5RGF0YShmb3JtYXQgPSBcImpzb25cIikge1xyXG4gICAgICAgIGZvcm1hdCA9IGZvcm1hdC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmIChmb3JtYXQgIT0gXCJqc29uXCIgJiYgZm9ybWF0ICE9IFwiY3N2XCIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJJbnZhbGlkIGZvcm1hdCBkZWNsYXJlZCBmb3IgZGlzcGxheURhdGEgZnVuY3Rpb24uIFVzaW5nIGpzb24gYXMgZGVmYXVsdC5cIik7XHJcbiAgICAgICAgICAgIGZvcm1hdCA9IFwianNvblwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkYXRhX3N0cmluZyA9IGZvcm1hdCA9PT0gXCJqc29uXCIgPyB0aGlzLmFsbERhdGEuanNvbih0cnVlKSA6IHRoaXMuYWxsRGF0YS5jc3YoKTtcclxuICAgICAgICBjb25zdCBkaXNwbGF5X2VsZW1lbnQgPSB0aGlzLmpzUHN5Y2guZ2V0RGlzcGxheUVsZW1lbnQoKTtcclxuICAgICAgICBkaXNwbGF5X2VsZW1lbnQuaW5uZXJIVE1MID0gJzxwcmUgaWQ9XCJqc3BzeWNoLWRhdGEtZGlzcGxheVwiPjwvcHJlPic7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJqc3BzeWNoLWRhdGEtZGlzcGxheVwiKS50ZXh0Q29udGVudCA9IGRhdGFfc3RyaW5nO1xyXG4gICAgfVxyXG4gICAgdXJsVmFyaWFibGVzKCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5xdWVyeV9zdHJpbmcgPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICB0aGlzLnF1ZXJ5X3N0cmluZyA9IGdldFF1ZXJ5U3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5X3N0cmluZztcclxuICAgIH1cclxuICAgIGdldFVSTFZhcmlhYmxlKHdoaWNodmFyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXJsVmFyaWFibGVzKClbd2hpY2h2YXJdO1xyXG4gICAgfVxyXG4gICAgY3JlYXRlSW50ZXJhY3Rpb25MaXN0ZW5lcnMoKSB7XHJcbiAgICAgICAgLy8gYmx1ciBldmVudCBjYXB0dXJlXHJcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgICAgICAgICAgIGV2ZW50OiBcImJsdXJcIixcclxuICAgICAgICAgICAgICAgIHRyaWFsOiB0aGlzLmpzUHN5Y2guZ2V0UHJvZ3Jlc3MoKS5jdXJyZW50X3RyaWFsX2dsb2JhbCxcclxuICAgICAgICAgICAgICAgIHRpbWU6IHRoaXMuanNQc3ljaC5nZXRUb3RhbFRpbWUoKSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5pbnRlcmFjdGlvbkRhdGEucHVzaChkYXRhKTtcclxuICAgICAgICAgICAgdGhpcy5qc1BzeWNoLmdldEluaXRTZXR0aW5ncygpLm9uX2ludGVyYWN0aW9uX2RhdGFfdXBkYXRlKGRhdGEpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIGZvY3VzIGV2ZW50IGNhcHR1cmVcclxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgICAgICAgICAgIGV2ZW50OiBcImZvY3VzXCIsXHJcbiAgICAgICAgICAgICAgICB0cmlhbDogdGhpcy5qc1BzeWNoLmdldFByb2dyZXNzKCkuY3VycmVudF90cmlhbF9nbG9iYWwsXHJcbiAgICAgICAgICAgICAgICB0aW1lOiB0aGlzLmpzUHN5Y2guZ2V0VG90YWxUaW1lKCksXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMuaW50ZXJhY3Rpb25EYXRhLnB1c2goZGF0YSk7XHJcbiAgICAgICAgICAgIHRoaXMuanNQc3ljaC5nZXRJbml0U2V0dGluZ3MoKS5vbl9pbnRlcmFjdGlvbl9kYXRhX3VwZGF0ZShkYXRhKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBmdWxsc2NyZWVuIGNoYW5nZSBjYXB0dXJlXHJcbiAgICAgICAgY29uc3QgZnVsbHNjcmVlbmNoYW5nZSA9ICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgICAgICAgICAgIGV2ZW50OiBcclxuICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmlzRnVsbFNjcmVlbiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC53ZWJraXRJc0Z1bGxTY3JlZW4gfHxcclxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQubW96SXNGdWxsU2NyZWVuIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICA/IFwiZnVsbHNjcmVlbmVudGVyXCJcclxuICAgICAgICAgICAgICAgICAgICA6IFwiZnVsbHNjcmVlbmV4aXRcIixcclxuICAgICAgICAgICAgICAgIHRyaWFsOiB0aGlzLmpzUHN5Y2guZ2V0UHJvZ3Jlc3MoKS5jdXJyZW50X3RyaWFsX2dsb2JhbCxcclxuICAgICAgICAgICAgICAgIHRpbWU6IHRoaXMuanNQc3ljaC5nZXRUb3RhbFRpbWUoKSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5pbnRlcmFjdGlvbkRhdGEucHVzaChkYXRhKTtcclxuICAgICAgICAgICAgdGhpcy5qc1BzeWNoLmdldEluaXRTZXR0aW5ncygpLm9uX2ludGVyYWN0aW9uX2RhdGFfdXBkYXRlKGRhdGEpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImZ1bGxzY3JlZW5jaGFuZ2VcIiwgZnVsbHNjcmVlbmNoYW5nZSk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vemZ1bGxzY3JlZW5jaGFuZ2VcIiwgZnVsbHNjcmVlbmNoYW5nZSk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2VcIiwgZnVsbHNjcmVlbmNoYW5nZSk7XHJcbiAgICB9XHJcbiAgICAvLyBwdWJsaWMgbWV0aG9kcyBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gbm90IHJlY29tbWVuZGVkIGZvciB1c2UuXHJcbiAgICBfY3VzdG9tSW5zZXJ0KGRhdGEpIHtcclxuICAgICAgICB0aGlzLmFsbERhdGEgPSBuZXcgRGF0YUNvbGxlY3Rpb24oZGF0YSk7XHJcbiAgICB9XHJcbiAgICBfZnVsbHJlc2V0KCkge1xyXG4gICAgICAgIHRoaXMucmVzZXQoKTtcclxuICAgICAgICB0aGlzLmRhdGFQcm9wZXJ0aWVzID0ge307XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgSGFyZHdhcmVBUEkge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpbnN0YW5jZSBvZiBqc3BzeWNoIGhhcyBvcGVuZWQgYSBoYXJkd2FyZSBjb25uZWN0aW9uIHRocm91Z2ggb3VyIGJyb3dzZXJcclxuICAgICAgICAgKiBleHRlbnNpb25cclxuICAgICAgICAgKiovXHJcbiAgICAgICAgdGhpcy5oYXJkd2FyZUNvbm5lY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgIC8vaXQgbWlnaHQgYmUgdXNlZnVsIHRvIG9wZW4gdXAgYSBsaW5lIG9mIGNvbW11bmljYXRpb24gZnJvbSB0aGUgZXh0ZW5zaW9uIGJhY2sgdG8gdGhpcyBwYWdlXHJcbiAgICAgICAgLy9zY3JpcHQsIGFnYWluLCB0aGlzIHdpbGwgaGF2ZSB0byBwYXNzIHRocm91Z2ggRE9NIGV2ZW50cy4gRm9yIG5vdyBzcGVlZCBpcyBvZiBubyBjb25jZXJuIHNvIElcclxuICAgICAgICAvL3dpbGwgdXNlIGpRdWVyeVxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJqc3BzeWNoLWFjdGl2YXRlXCIsIChldnQpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5oYXJkd2FyZUNvbm5lY3RlZCA9IHRydWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEFsbG93cyBjb21tdW5pY2F0aW9uIHdpdGggdXNlciBoYXJkd2FyZSB0aHJvdWdoIG91ciBjdXN0b20gR29vZ2xlIENocm9tZSBleHRlbnNpb24gKyBuYXRpdmUgQysrIHByb2dyYW1cclxuICAgICAqIEBwYXJhbVx0XHRtZXNzXHRUaGUgbWVzc2FnZSB0byBiZSBwYXNzZWQgdG8gb3VyIGV4dGVuc2lvbiwgc2VlIGl0cyBkb2N1bWVudGF0aW9uIGZvciB0aGUgZXhwZWN0ZWQgbWVtYmVycyBvZiB0aGlzIG9iamVjdC5cclxuICAgICAqIEBhdXRob3JcdERhbmllbCBSaXZhc1xyXG4gICAgICpcclxuICAgICAqL1xyXG4gICAgaGFyZHdhcmUobWVzcykge1xyXG4gICAgICAgIC8vc2luY2UgQ2hyb21lIGV4dGVuc2lvbiBjb250ZW50LXNjcmlwdHMgZG8gbm90IHNoYXJlIHRoZSBqYXZhc2NyaXB0IGVudmlyb25tZW50IHdpdGggdGhlIHBhZ2VcclxuICAgICAgICAvL3NjcmlwdCB0aGF0IGxvYWRlZCBqc3BzeWNoLCB3ZSB3aWxsIG5lZWQgdG8gdXNlIGhhY2t5IG1ldGhvZHMgbGlrZSBjb21tdW5pY2F0aW5nIHRocm91Z2ggRE9NXHJcbiAgICAgICAgLy9ldmVudHMuXHJcbiAgICAgICAgY29uc3QganNwc3ljaEV2dCA9IG5ldyBDdXN0b21FdmVudChcImpzcHN5Y2hcIiwgeyBkZXRhaWw6IG1lc3MgfSk7XHJcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChqc3BzeWNoRXZ0KTtcclxuICAgICAgICAvL0FuZCB2b2lsYSEgaXQgd2lsbCBiZSB0aGUgam9iIG9mIHRoZSBjb250ZW50IHNjcmlwdCBpbmplY3RlZCBieSB0aGUgZXh0ZW5zaW9uIHRvIGxpc3RlbiBmb3JcclxuICAgICAgICAvL3RoZSBldmVudCBhbmQgZG8gdGhlIGFwcHJvcHJpYXRlIGFjdGlvbnMuXHJcbiAgICB9XHJcbn1cblxuY2xhc3MgS2V5Ym9hcmRMaXN0ZW5lckFQSSB7XHJcbiAgICBjb25zdHJ1Y3RvcihnZXRSb290RWxlbWVudCwgYXJlUmVzcG9uc2VzQ2FzZVNlbnNpdGl2ZSA9IGZhbHNlLCBtaW5pbXVtVmFsaWRSdCA9IDApIHtcclxuICAgICAgICB0aGlzLmdldFJvb3RFbGVtZW50ID0gZ2V0Um9vdEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5hcmVSZXNwb25zZXNDYXNlU2Vuc2l0aXZlID0gYXJlUmVzcG9uc2VzQ2FzZVNlbnNpdGl2ZTtcclxuICAgICAgICB0aGlzLm1pbmltdW1WYWxpZFJ0ID0gbWluaW11bVZhbGlkUnQ7XHJcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSBuZXcgU2V0KCk7XHJcbiAgICAgICAgdGhpcy5oZWxkS2V5cyA9IG5ldyBTZXQoKTtcclxuICAgICAgICB0aGlzLmFyZVJvb3RMaXN0ZW5lcnNSZWdpc3RlcmVkID0gZmFsc2U7XHJcbiAgICAgICAgYXV0b0JpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5yZWdpc3RlclJvb3RMaXN0ZW5lcnMoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSWYgbm90IHByZXZpb3VzbHkgZG9uZSBhbmQgYHRoaXMuZ2V0Um9vdEVsZW1lbnQoKWAgcmV0dXJucyBhbiBlbGVtZW50LCBhZGRzIHRoZSByb290IGtleVxyXG4gICAgICogbGlzdGVuZXJzIHRvIHRoYXQgZWxlbWVudC5cclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJSb290TGlzdGVuZXJzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5hcmVSb290TGlzdGVuZXJzUmVnaXN0ZXJlZCkge1xyXG4gICAgICAgICAgICBjb25zdCByb290RWxlbWVudCA9IHRoaXMuZ2V0Um9vdEVsZW1lbnQoKTtcclxuICAgICAgICAgICAgaWYgKHJvb3RFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICByb290RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLnJvb3RLZXlkb3duTGlzdGVuZXIpO1xyXG4gICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsIHRoaXMucm9vdEtleXVwTGlzdGVuZXIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hcmVSb290TGlzdGVuZXJzUmVnaXN0ZXJlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByb290S2V5ZG93bkxpc3RlbmVyKGUpIHtcclxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYSBzdGF0aWMgY29weSBvZiB0aGUgbGlzdGVuZXJzIHNldCBiZWNhdXNlIGxpc3RlbmVycyBtaWdodCBhZGQgb3RoZXIgbGlzdGVuZXJzXHJcbiAgICAgICAgLy8gdGhhdCB3ZSBkbyBub3Qgd2FudCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgbG9vcFxyXG4gICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgQXJyYXkuZnJvbSh0aGlzLmxpc3RlbmVycykpIHtcclxuICAgICAgICAgICAgbGlzdGVuZXIoZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaGVsZEtleXMuYWRkKHRoaXMudG9Mb3dlckNhc2VJZkluc2Vuc2l0aXZlKGUua2V5KSk7XHJcbiAgICB9XHJcbiAgICB0b0xvd2VyQ2FzZUlmSW5zZW5zaXRpdmUoc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJlUmVzcG9uc2VzQ2FzZVNlbnNpdGl2ZSA/IHN0cmluZyA6IHN0cmluZy50b0xvd2VyQ2FzZSgpO1xyXG4gICAgfVxyXG4gICAgcm9vdEtleXVwTGlzdGVuZXIoZSkge1xyXG4gICAgICAgIHRoaXMuaGVsZEtleXMuZGVsZXRlKHRoaXMudG9Mb3dlckNhc2VJZkluc2Vuc2l0aXZlKGUua2V5KSk7XHJcbiAgICB9XHJcbiAgICBpc1Jlc3BvbnNlVmFsaWQodmFsaWRSZXNwb25zZXMsIGFsbG93SGVsZEtleSwga2V5KSB7XHJcbiAgICAgICAgLy8gY2hlY2sgaWYga2V5IHdhcyBhbHJlYWR5IGhlbGQgZG93blxyXG4gICAgICAgIGlmICghYWxsb3dIZWxkS2V5ICYmIHRoaXMuaGVsZEtleXMuaGFzKGtleSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmFsaWRSZXNwb25zZXMgPT09IFwiQUxMX0tFWVNcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbGlkUmVzcG9uc2VzID09PSBcIk5PX0tFWVNcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWxpZFJlc3BvbnNlcy5pbmNsdWRlcyhrZXkpO1xyXG4gICAgfVxyXG4gICAgZ2V0S2V5Ym9hcmRSZXNwb25zZSh7IGNhbGxiYWNrX2Z1bmN0aW9uLCB2YWxpZF9yZXNwb25zZXMgPSBcIkFMTF9LRVlTXCIsIHJ0X21ldGhvZCA9IFwicGVyZm9ybWFuY2VcIiwgcGVyc2lzdCwgYXVkaW9fY29udGV4dCwgYXVkaW9fY29udGV4dF9zdGFydF90aW1lLCBhbGxvd19oZWxkX2tleSA9IGZhbHNlLCBtaW5pbXVtX3ZhbGlkX3J0ID0gdGhpcy5taW5pbXVtVmFsaWRSdCwgfSkge1xyXG4gICAgICAgIGlmIChydF9tZXRob2QgIT09IFwicGVyZm9ybWFuY2VcIiAmJiBydF9tZXRob2QgIT09IFwiYXVkaW9cIikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnSW52YWxpZCBSVCBtZXRob2Qgc3BlY2lmaWVkIGluIGdldEtleWJvYXJkUmVzcG9uc2UuIERlZmF1bHRpbmcgdG8gXCJwZXJmb3JtYW5jZVwiIG1ldGhvZC4nKTtcclxuICAgICAgICAgICAgcnRfbWV0aG9kID0gXCJwZXJmb3JtYW5jZVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB1c2VQZXJmb3JtYW5jZVJ0ID0gcnRfbWV0aG9kID09PSBcInBlcmZvcm1hbmNlXCI7XHJcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gdXNlUGVyZm9ybWFuY2VSdCA/IHBlcmZvcm1hbmNlLm5vdygpIDogYXVkaW9fY29udGV4dF9zdGFydF90aW1lICogMTAwMDtcclxuICAgICAgICB0aGlzLnJlZ2lzdGVyUm9vdExpc3RlbmVycygpO1xyXG4gICAgICAgIGlmICghdGhpcy5hcmVSZXNwb25zZXNDYXNlU2Vuc2l0aXZlICYmIHR5cGVvZiB2YWxpZF9yZXNwb25zZXMgIT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgdmFsaWRfcmVzcG9uc2VzID0gdmFsaWRfcmVzcG9uc2VzLm1hcCgocikgPT4gci50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbGlzdGVuZXIgPSAoZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBydCA9IE1hdGgucm91bmQoKHJ0X21ldGhvZCA9PSBcInBlcmZvcm1hbmNlXCIgPyBwZXJmb3JtYW5jZS5ub3coKSA6IGF1ZGlvX2NvbnRleHQuY3VycmVudFRpbWUgKiAxMDAwKSAtXHJcbiAgICAgICAgICAgICAgICBzdGFydFRpbWUpO1xyXG4gICAgICAgICAgICBpZiAocnQgPCBtaW5pbXVtX3ZhbGlkX3J0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy50b0xvd2VyQ2FzZUlmSW5zZW5zaXRpdmUoZS5rZXkpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1Jlc3BvbnNlVmFsaWQodmFsaWRfcmVzcG9uc2VzLCBhbGxvd19oZWxkX2tleSwga2V5KSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIHZhbGlkIHJlc3BvbnNlLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlIGtleSBldmVudCB0byB0cmlnZ2VyIG90aGVyIGFjdGlvbnNcclxuICAgICAgICAgICAgICAgIC8vIGxpa2Ugc2Nyb2xsaW5nIHZpYSB0aGUgc3BhY2ViYXIuXHJcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXBlcnNpc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUga2V5Ym9hcmQgbGlzdGVuZXIgaWYgaXQgZXhpc3RzXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW5jZWxLZXlib2FyZFJlc3BvbnNlKGxpc3RlbmVyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrX2Z1bmN0aW9uKHsga2V5LCBydCB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcclxuICAgICAgICByZXR1cm4gbGlzdGVuZXI7XHJcbiAgICB9XHJcbiAgICBjYW5jZWxLZXlib2FyZFJlc3BvbnNlKGxpc3RlbmVyKSB7XHJcbiAgICAgICAgLy8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tIHRoZSBzZXQgb2YgbGlzdGVuZXJzIGlmIGl0IGlzIGNvbnRhaW5lZFxyXG4gICAgICAgIHRoaXMubGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XHJcbiAgICB9XHJcbiAgICBjYW5jZWxBbGxLZXlib2FyZFJlc3BvbnNlcygpIHtcclxuICAgICAgICB0aGlzLmxpc3RlbmVycy5jbGVhcigpO1xyXG4gICAgfVxyXG4gICAgY29tcGFyZUtleXMoa2V5MSwga2V5Mikge1xyXG4gICAgICAgIGlmICgodHlwZW9mIGtleTEgIT09IFwic3RyaW5nXCIgJiYga2V5MSAhPT0gbnVsbCkgfHxcclxuICAgICAgICAgICAgKHR5cGVvZiBrZXkyICE9PSBcInN0cmluZ1wiICYmIGtleTIgIT09IG51bGwpKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBpbiBqc1BzeWNoLnBsdWdpbkFQSS5jb21wYXJlS2V5czogYXJndW1lbnRzIG11c3QgYmUga2V5IHN0cmluZ3Mgb3IgbnVsbC5cIik7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2Yga2V5MSA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2Yga2V5MiA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICAvLyBpZiBib3RoIHZhbHVlcyBhcmUgc3RyaW5ncywgdGhlbiBjaGVjayB3aGV0aGVyIG9yIG5vdCBsZXR0ZXIgY2FzZSBzaG91bGQgYmUgY29udmVydGVkIGJlZm9yZSBjb21wYXJpbmcgKGNhc2Vfc2Vuc2l0aXZlX3Jlc3BvbnNlcyBpbiBpbml0SnNQc3ljaClcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXJlUmVzcG9uc2VzQ2FzZVNlbnNpdGl2ZVxyXG4gICAgICAgICAgICAgICAgPyBrZXkxID09PSBrZXkyXHJcbiAgICAgICAgICAgICAgICA6IGtleTEudG9Mb3dlckNhc2UoKSA9PT0ga2V5Mi50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4ga2V5MSA9PT0gbnVsbCAmJiBrZXkyID09PSBudWxsO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBQYXJhbWV0ZXIgdHlwZXMgZm9yIHBsdWdpbnNcclxuICovXHJcbnZhciBQYXJhbWV0ZXJUeXBlO1xyXG4oZnVuY3Rpb24gKFBhcmFtZXRlclR5cGUpIHtcclxuICAgIFBhcmFtZXRlclR5cGVbUGFyYW1ldGVyVHlwZVtcIkJPT0xcIl0gPSAwXSA9IFwiQk9PTFwiO1xyXG4gICAgUGFyYW1ldGVyVHlwZVtQYXJhbWV0ZXJUeXBlW1wiU1RSSU5HXCJdID0gMV0gPSBcIlNUUklOR1wiO1xyXG4gICAgUGFyYW1ldGVyVHlwZVtQYXJhbWV0ZXJUeXBlW1wiSU5UXCJdID0gMl0gPSBcIklOVFwiO1xyXG4gICAgUGFyYW1ldGVyVHlwZVtQYXJhbWV0ZXJUeXBlW1wiRkxPQVRcIl0gPSAzXSA9IFwiRkxPQVRcIjtcclxuICAgIFBhcmFtZXRlclR5cGVbUGFyYW1ldGVyVHlwZVtcIkZVTkNUSU9OXCJdID0gNF0gPSBcIkZVTkNUSU9OXCI7XHJcbiAgICBQYXJhbWV0ZXJUeXBlW1BhcmFtZXRlclR5cGVbXCJLRVlcIl0gPSA1XSA9IFwiS0VZXCI7XHJcbiAgICBQYXJhbWV0ZXJUeXBlW1BhcmFtZXRlclR5cGVbXCJLRVlTXCJdID0gNl0gPSBcIktFWVNcIjtcclxuICAgIFBhcmFtZXRlclR5cGVbUGFyYW1ldGVyVHlwZVtcIlNFTEVDVFwiXSA9IDddID0gXCJTRUxFQ1RcIjtcclxuICAgIFBhcmFtZXRlclR5cGVbUGFyYW1ldGVyVHlwZVtcIkhUTUxfU1RSSU5HXCJdID0gOF0gPSBcIkhUTUxfU1RSSU5HXCI7XHJcbiAgICBQYXJhbWV0ZXJUeXBlW1BhcmFtZXRlclR5cGVbXCJJTUFHRVwiXSA9IDldID0gXCJJTUFHRVwiO1xyXG4gICAgUGFyYW1ldGVyVHlwZVtQYXJhbWV0ZXJUeXBlW1wiQVVESU9cIl0gPSAxMF0gPSBcIkFVRElPXCI7XHJcbiAgICBQYXJhbWV0ZXJUeXBlW1BhcmFtZXRlclR5cGVbXCJWSURFT1wiXSA9IDExXSA9IFwiVklERU9cIjtcclxuICAgIFBhcmFtZXRlclR5cGVbUGFyYW1ldGVyVHlwZVtcIk9CSkVDVFwiXSA9IDEyXSA9IFwiT0JKRUNUXCI7XHJcbiAgICBQYXJhbWV0ZXJUeXBlW1BhcmFtZXRlclR5cGVbXCJDT01QTEVYXCJdID0gMTNdID0gXCJDT01QTEVYXCI7XHJcbiAgICBQYXJhbWV0ZXJUeXBlW1BhcmFtZXRlclR5cGVbXCJUSU1FTElORVwiXSA9IDE0XSA9IFwiVElNRUxJTkVcIjtcclxufSkoUGFyYW1ldGVyVHlwZSB8fCAoUGFyYW1ldGVyVHlwZSA9IHt9KSk7XHJcbmNvbnN0IHVuaXZlcnNhbFBsdWdpblBhcmFtZXRlcnMgPSB7XHJcbiAgICAvKipcclxuICAgICAqIERhdGEgdG8gYWRkIHRvIHRoaXMgdHJpYWwgKGtleS12YWx1ZSBwYWlycylcclxuICAgICAqL1xyXG4gICAgZGF0YToge1xyXG4gICAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuT0JKRUNULFxyXG4gICAgICAgIHByZXR0eV9uYW1lOiBcIkRhdGFcIixcclxuICAgICAgICBkZWZhdWx0OiB7fSxcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIEZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0cmlhbCBiZWdpbnNcclxuICAgICAqL1xyXG4gICAgb25fc3RhcnQ6IHtcclxuICAgICAgICB0eXBlOiBQYXJhbWV0ZXJUeXBlLkZVTkNUSU9OLFxyXG4gICAgICAgIHByZXR0eV9uYW1lOiBcIk9uIHN0YXJ0XCIsXHJcbiAgICAgICAgZGVmYXVsdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSxcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIEZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0cmlhbCBpcyBmaW5pc2hlZFxyXG4gICAgICovXHJcbiAgICBvbl9maW5pc2g6IHtcclxuICAgICAgICB0eXBlOiBQYXJhbWV0ZXJUeXBlLkZVTkNUSU9OLFxyXG4gICAgICAgIHByZXR0eV9uYW1lOiBcIk9uIGZpbmlzaFwiLFxyXG4gICAgICAgIGRlZmF1bHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0sXHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiBGdW5jdGlvbiB0byBleGVjdXRlIGFmdGVyIHRoZSB0cmlhbCBoYXMgbG9hZGVkXHJcbiAgICAgKi9cclxuICAgIG9uX2xvYWQ6IHtcclxuICAgICAgICB0eXBlOiBQYXJhbWV0ZXJUeXBlLkZVTkNUSU9OLFxyXG4gICAgICAgIHByZXR0eV9uYW1lOiBcIk9uIGxvYWRcIixcclxuICAgICAgICBkZWZhdWx0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9LFxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICogTGVuZ3RoIG9mIGdhcCBiZXR3ZWVuIHRoZSBlbmQgb2YgdGhpcyB0cmlhbCBhbmQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IHRyaWFsXHJcbiAgICAgKi9cclxuICAgIHBvc3RfdHJpYWxfZ2FwOiB7XHJcbiAgICAgICAgdHlwZTogUGFyYW1ldGVyVHlwZS5JTlQsXHJcbiAgICAgICAgcHJldHR5X25hbWU6IFwiUG9zdCB0cmlhbCBnYXBcIixcclxuICAgICAgICBkZWZhdWx0OiBudWxsLFxyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICogQSBsaXN0IG9mIENTUyBjbGFzc2VzIHRvIGFkZCB0byB0aGUganNQc3ljaCBkaXNwbGF5IGVsZW1lbnQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGlzIHRyaWFsXHJcbiAgICAgKi9cclxuICAgIGNzc19jbGFzc2VzOiB7XHJcbiAgICAgICAgdHlwZTogUGFyYW1ldGVyVHlwZS5TVFJJTkcsXHJcbiAgICAgICAgcHJldHR5X25hbWU6IFwiQ3VzdG9tIENTUyBjbGFzc2VzXCIsXHJcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIE9wdGlvbnMgdG8gY29udHJvbCBzaW11bGF0aW9uIG1vZGUgZm9yIHRoZSB0cmlhbC5cclxuICAgICAqL1xyXG4gICAgc2ltdWxhdGlvbl9vcHRpb25zOiB7XHJcbiAgICAgICAgdHlwZTogUGFyYW1ldGVyVHlwZS5DT01QTEVYLFxyXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXHJcbiAgICB9LFxyXG59O1xuXG5jb25zdCBwcmVsb2FkUGFyYW1ldGVyVHlwZXMgPSBbXHJcbiAgICBQYXJhbWV0ZXJUeXBlLkFVRElPLFxyXG4gICAgUGFyYW1ldGVyVHlwZS5JTUFHRSxcclxuICAgIFBhcmFtZXRlclR5cGUuVklERU8sXHJcbl07XHJcbmNsYXNzIE1lZGlhQVBJIHtcclxuICAgIGNvbnN0cnVjdG9yKHVzZVdlYmF1ZGlvLCB3ZWJhdWRpb0NvbnRleHQpIHtcclxuICAgICAgICB0aGlzLnVzZVdlYmF1ZGlvID0gdXNlV2ViYXVkaW87XHJcbiAgICAgICAgdGhpcy53ZWJhdWRpb0NvbnRleHQgPSB3ZWJhdWRpb0NvbnRleHQ7XHJcbiAgICAgICAgLy8gdmlkZW8gLy9cclxuICAgICAgICB0aGlzLnZpZGVvX2J1ZmZlcnMgPSB7fTtcclxuICAgICAgICAvLyBhdWRpbyAvL1xyXG4gICAgICAgIHRoaXMuY29udGV4dCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5hdWRpb19idWZmZXJzID0gW107XHJcbiAgICAgICAgLy8gcHJlbG9hZGluZyBzdGltdWxpIC8vXHJcbiAgICAgICAgdGhpcy5wcmVsb2FkX3JlcXVlc3RzID0gW107XHJcbiAgICAgICAgdGhpcy5pbWdfY2FjaGUgPSB7fTtcclxuICAgICAgICB0aGlzLnByZWxvYWRNYXAgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgdGhpcy5taWNyb3Bob25lX3JlY29yZGVyID0gbnVsbDtcclxuICAgIH1cclxuICAgIGdldFZpZGVvQnVmZmVyKHZpZGVvSUQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy52aWRlb19idWZmZXJzW3ZpZGVvSURdO1xyXG4gICAgfVxyXG4gICAgaW5pdEF1ZGlvKCkge1xyXG4gICAgICAgIHRoaXMuY29udGV4dCA9IHRoaXMudXNlV2ViYXVkaW8gPyB0aGlzLndlYmF1ZGlvQ29udGV4dCA6IG51bGw7XHJcbiAgICB9XHJcbiAgICBhdWRpb0NvbnRleHQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0YXRlICE9PSBcInJ1bm5pbmdcIikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LnJlc3VtZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQ7XHJcbiAgICB9XHJcbiAgICBnZXRBdWRpb0J1ZmZlcihhdWRpb0lEKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgLy8gY2hlY2sgd2hldGhlciBhdWRpbyBmaWxlIGFscmVhZHkgcHJlbG9hZGVkXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5hdWRpb19idWZmZXJzW2F1ZGlvSURdID09IFwidW5kZWZpbmVkXCIgfHxcclxuICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9fYnVmZmVyc1thdWRpb0lEXSA9PSBcInRtcFwiKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZiBhdWRpbyBpcyBub3QgYWxyZWFkeSBsb2FkZWQsIHRyeSB0byBsb2FkIGl0XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByZWxvYWRBdWRpbyhbYXVkaW9JRF0sICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMuYXVkaW9fYnVmZmVyc1thdWRpb0lEXSk7XHJcbiAgICAgICAgICAgICAgICB9LCAoKSA9PiB7IH0sIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUuZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBhdWRpbyBpcyBhbHJlYWR5IGxvYWRlZFxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLmF1ZGlvX2J1ZmZlcnNbYXVkaW9JRF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBwcmVsb2FkQXVkaW8oZmlsZXMsIGNhbGxiYWNrX2NvbXBsZXRlID0gKCkgPT4geyB9LCBjYWxsYmFja19sb2FkID0gKGZpbGVwYXRoKSA9PiB7IH0sIGNhbGxiYWNrX2Vycm9yID0gKGVycm9yX21zZykgPT4geyB9KSB7XHJcbiAgICAgICAgZmlsZXMgPSB1bmlxdWUoZmlsZXMuZmxhdCgpKTtcclxuICAgICAgICBsZXQgbl9sb2FkZWQgPSAwO1xyXG4gICAgICAgIGlmIChmaWxlcy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICBjYWxsYmFja19jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGxvYWRfYXVkaW9fZmlsZV93ZWJhdWRpbyA9IChzb3VyY2UsIGNvdW50ID0gMSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XHJcbiAgICAgICAgICAgIHJlcXVlc3Qub3BlbihcIkdFVFwiLCBzb3VyY2UsIHRydWUpO1xyXG4gICAgICAgICAgICByZXF1ZXN0LnJlc3BvbnNlVHlwZSA9IFwiYXJyYXlidWZmZXJcIjtcclxuICAgICAgICAgICAgcmVxdWVzdC5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZGVjb2RlQXVkaW9EYXRhKHJlcXVlc3QucmVzcG9uc2UsIChidWZmZXIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvX2J1ZmZlcnNbc291cmNlXSA9IGJ1ZmZlcjtcclxuICAgICAgICAgICAgICAgICAgICBuX2xvYWRlZCsrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX2xvYWQoc291cmNlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobl9sb2FkZWQgPT0gZmlsZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX2NvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja19lcnJvcih7IHNvdXJjZTogc291cmNlLCBlcnJvcjogZSB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGVyciA9IGU7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT0gNDA0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXJyID0gXCI0MDRcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrX2Vycm9yKHsgc291cmNlOiBzb3VyY2UsIGVycm9yOiBlcnIgfSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHJlcXVlc3Qub25sb2FkZW5kID0gZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PSA0MDQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja19lcnJvcih7IHNvdXJjZTogc291cmNlLCBlcnJvcjogXCI0MDRcIiB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmVxdWVzdC5zZW5kKCk7XHJcbiAgICAgICAgICAgIHRoaXMucHJlbG9hZF9yZXF1ZXN0cy5wdXNoKHJlcXVlc3QpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgbG9hZF9hdWRpb19maWxlX2h0bWw1YXVkaW8gPSAoc291cmNlLCBjb3VudCA9IDEpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgYXVkaW8gPSBuZXcgQXVkaW8oKTtcclxuICAgICAgICAgICAgY29uc3QgaGFuZGxlQ2FuUGxheVRocm91Z2ggPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvX2J1ZmZlcnNbc291cmNlXSA9IGF1ZGlvO1xyXG4gICAgICAgICAgICAgICAgbl9sb2FkZWQrKztcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrX2xvYWQoc291cmNlKTtcclxuICAgICAgICAgICAgICAgIGlmIChuX2xvYWRlZCA9PSBmaWxlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja19jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYXVkaW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNhbnBsYXl0aHJvdWdoXCIsIGhhbmRsZUNhblBsYXlUaHJvdWdoKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgYXVkaW8uYWRkRXZlbnRMaXN0ZW5lcihcImNhbnBsYXl0aHJvdWdoXCIsIGhhbmRsZUNhblBsYXlUaHJvdWdoKTtcclxuICAgICAgICAgICAgYXVkaW8uYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIGZ1bmN0aW9uIGhhbmRsZUVycm9yKGUpIHtcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrX2Vycm9yKHsgc291cmNlOiBhdWRpby5zcmMsIGVycm9yOiBlIH0pO1xyXG4gICAgICAgICAgICAgICAgYXVkaW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIGhhbmRsZUVycm9yKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGF1ZGlvLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBmdW5jdGlvbiBoYW5kbGVBYm9ydChlKSB7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFja19lcnJvcih7IHNvdXJjZTogYXVkaW8uc3JjLCBlcnJvcjogZSB9KTtcclxuICAgICAgICAgICAgICAgIGF1ZGlvLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBoYW5kbGVBYm9ydCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBhdWRpby5zcmMgPSBzb3VyY2U7XHJcbiAgICAgICAgICAgIHRoaXMucHJlbG9hZF9yZXF1ZXN0cy5wdXNoKGF1ZGlvKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuYXVkaW9fYnVmZmVyc1tmaWxlXSAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICAgICAgbl9sb2FkZWQrKztcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrX2xvYWQoZmlsZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAobl9sb2FkZWQgPT0gZmlsZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9fYnVmZmVyc1tmaWxlXSA9IFwidG1wXCI7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdWRpb0NvbnRleHQoKSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvYWRfYXVkaW9fZmlsZV93ZWJhdWRpbyhmaWxlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvYWRfYXVkaW9fZmlsZV9odG1sNWF1ZGlvKGZpbGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJlbG9hZEltYWdlcyhpbWFnZXMsIGNhbGxiYWNrX2NvbXBsZXRlID0gKCkgPT4geyB9LCBjYWxsYmFja19sb2FkID0gKGZpbGVwYXRoKSA9PiB7IH0sIGNhbGxiYWNrX2Vycm9yID0gKGVycm9yX21zZykgPT4geyB9KSB7XHJcbiAgICAgICAgLy8gZmxhdHRlbiB0aGUgaW1hZ2VzIGFycmF5XHJcbiAgICAgICAgaW1hZ2VzID0gdW5pcXVlKGltYWdlcy5mbGF0KCkpO1xyXG4gICAgICAgIHZhciBuX2xvYWRlZCA9IDA7XHJcbiAgICAgICAgaWYgKGltYWdlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgY2FsbGJhY2tfY29tcGxldGUoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgICAgICAgICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBuX2xvYWRlZCsrO1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2tfbG9hZChpbWcuc3JjKTtcclxuICAgICAgICAgICAgICAgIGlmIChuX2xvYWRlZCA9PT0gaW1hZ2VzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX2NvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGltZy5vbmVycm9yID0gZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrX2Vycm9yKHsgc291cmNlOiBpbWcuc3JjLCBlcnJvcjogZSB9KTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgaW1nLnNyYyA9IGltYWdlc1tpXTtcclxuICAgICAgICAgICAgdGhpcy5pbWdfY2FjaGVbaW1hZ2VzW2ldXSA9IGltZztcclxuICAgICAgICAgICAgdGhpcy5wcmVsb2FkX3JlcXVlc3RzLnB1c2goaW1nKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcmVsb2FkVmlkZW8odmlkZW9zLCBjYWxsYmFja19jb21wbGV0ZSA9ICgpID0+IHsgfSwgY2FsbGJhY2tfbG9hZCA9IChmaWxlcGF0aCkgPT4geyB9LCBjYWxsYmFja19lcnJvciA9IChlcnJvcl9tc2cpID0+IHsgfSkge1xyXG4gICAgICAgIC8vIGZsYXR0ZW4gdGhlIHZpZGVvIGFycmF5XHJcbiAgICAgICAgdmlkZW9zID0gdW5pcXVlKHZpZGVvcy5mbGF0KCkpO1xyXG4gICAgICAgIGxldCBuX2xvYWRlZCA9IDA7XHJcbiAgICAgICAgaWYgKHZpZGVvcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgY2FsbGJhY2tfY29tcGxldGUoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGNvbnN0IHZpZGVvIG9mIHZpZGVvcykge1xyXG4gICAgICAgICAgICBjb25zdCB2aWRlb19idWZmZXJzID0gdGhpcy52aWRlb19idWZmZXJzO1xyXG4gICAgICAgICAgICAvL2Jhc2VkIG9uIG9wdGlvbiA0IGhlcmU6IGh0dHA6Ly9kaW5icm9yLmRrL2Jsb2cvaG93LXRvLXByZWxvYWQtZW50aXJlLWh0bWw1LXZpZGVvLWJlZm9yZS1wbGF5LXNvbHZlZC9cclxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xyXG4gICAgICAgICAgICByZXF1ZXN0Lm9wZW4oXCJHRVRcIiwgdmlkZW8sIHRydWUpO1xyXG4gICAgICAgICAgICByZXF1ZXN0LnJlc3BvbnNlVHlwZSA9IFwiYmxvYlwiO1xyXG4gICAgICAgICAgICByZXF1ZXN0Lm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwIHx8IHRoaXMuc3RhdHVzID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmlkZW9CbG9iID0gdGhpcy5yZXNwb25zZTtcclxuICAgICAgICAgICAgICAgICAgICB2aWRlb19idWZmZXJzW3ZpZGVvXSA9IFVSTC5jcmVhdGVPYmplY3RVUkwodmlkZW9CbG9iKTsgLy8gSUUxMCtcclxuICAgICAgICAgICAgICAgICAgICBuX2xvYWRlZCsrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX2xvYWQodmlkZW8pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChuX2xvYWRlZCA9PT0gdmlkZW9zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja19jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgIGxldCBlcnIgPSBlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09IDQwNCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVyciA9IFwiNDA0XCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFja19lcnJvcih7IHNvdXJjZTogdmlkZW8sIGVycm9yOiBlcnIgfSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHJlcXVlc3Qub25sb2FkZW5kID0gZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PSA0MDQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja19lcnJvcih7IHNvdXJjZTogdmlkZW8sIGVycm9yOiBcIjQwNFwiIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZXF1ZXN0LnNlbmQoKTtcclxuICAgICAgICAgICAgdGhpcy5wcmVsb2FkX3JlcXVlc3RzLnB1c2gocmVxdWVzdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0QXV0b1ByZWxvYWRMaXN0KHRpbWVsaW5lX2Rlc2NyaXB0aW9uKSB7XHJcbiAgICAgICAgLyoqIE1hcCBlYWNoIHByZWxvYWQgcGFyYW1ldGVyIHR5cGUgdG8gYSBzZXQgb2YgcGF0aHMgdG8gYmUgcHJlbG9hZGVkICovXHJcbiAgICAgICAgY29uc3QgcHJlbG9hZFBhdGhzID0gT2JqZWN0LmZyb21FbnRyaWVzKHByZWxvYWRQYXJhbWV0ZXJUeXBlcy5tYXAoKHR5cGUpID0+IFt0eXBlLCBuZXcgU2V0KCldKSk7XHJcbiAgICAgICAgY29uc3QgdHJhdmVyc2VUaW1lbGluZSA9IChub2RlLCBpbmhlcml0ZWRUcmlhbFR5cGUpID0+IHtcclxuICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xyXG4gICAgICAgICAgICBjb25zdCBpc1RpbWVsaW5lID0gdHlwZW9mIG5vZGUudGltZWxpbmUgIT09IFwidW5kZWZpbmVkXCI7XHJcbiAgICAgICAgICAgIGlmIChpc1RpbWVsaW5lKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkTm9kZSBvZiBub2RlLnRpbWVsaW5lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJhdmVyc2VUaW1lbGluZShjaGlsZE5vZGUsIChfYSA9IG5vZGUudHlwZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogaW5oZXJpdGVkVHJpYWxUeXBlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICgoX2MgPSAoKF9iID0gbm9kZS50eXBlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBpbmhlcml0ZWRUcmlhbFR5cGUpKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuaW5mbykge1xyXG4gICAgICAgICAgICAgICAgLy8gbm9kZSBpcyBhIHRyaWFsIHdpdGggdHlwZS5pbmZvIHNldFxyXG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gbmFtZSBhbmQgcGFyYW1ldGVycyBvYmplY3QgZnJvbSB0aGUgaW5mbyBvYmplY3RcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgbmFtZTogcGx1Z2luTmFtZSwgcGFyYW1ldGVycyB9ID0gKChfZCA9IG5vZGUudHlwZSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogaW5oZXJpdGVkVHJpYWxUeXBlKS5pbmZvO1xyXG4gICAgICAgICAgICAgICAgLy8gRXh0cmFjdCBwYXJhbWV0ZXJzIHRvIGJlIHByZWxvYWRlZCBhbmQgdGhlaXIgdHlwZXMgZnJvbSBwYXJhbWV0ZXIgaW5mbyBpZiB0aGlzIGhhcyBub3RcclxuICAgICAgICAgICAgICAgIC8vIHlldCBiZWVuIGRvbmUgZm9yIGBwbHVnaW5OYW1lYFxyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnByZWxvYWRNYXAuaGFzKHBsdWdpbk5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmVsb2FkTWFwLnNldChwbHVnaW5OYW1lLCBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMocGFyYW1ldGVycylcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsdGVyIG91dCBwYXJhbWV0ZXIgZW50cmllcyB3aXRoIG1lZGlhIHR5cGVzIGFuZCBhIG5vbi1mYWxzZSBgcHJlbG9hZGAgb3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKFtfbmFtZSwgeyB0eXBlLCBwcmVsb2FkIH1dKSA9PiBwcmVsb2FkUGFyYW1ldGVyVHlwZXMuaW5jbHVkZXModHlwZSkgJiYgKHByZWxvYWQgIT09IG51bGwgJiYgcHJlbG9hZCAhPT0gdm9pZCAwID8gcHJlbG9hZCA6IHRydWUpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXAgZWFjaCBlbnRyeSdzIHZhbHVlIHRvIGl0cyBwYXJhbWV0ZXIgdHlwZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKChbbmFtZSwgeyB0eXBlIH1dKSA9PiBbbmFtZSwgdHlwZV0pKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBBZGQgcHJlbG9hZCBwYXRocyBmcm9tIHRoaXMgdHJpYWxcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW3BhcmFtZXRlck5hbWUsIHBhcmFtZXRlclR5cGVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucHJlbG9hZE1hcC5nZXQocGx1Z2luTmFtZSkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVyVmFsdWUgPSBub2RlW3BhcmFtZXRlck5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gcHJlbG9hZFBhdGhzW3BhcmFtZXRlclR5cGVdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW1ldGVyVmFsdWUgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMuYWRkKHBhcmFtZXRlclZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShwYXJhbWV0ZXJWYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHBhcmFtZXRlclZhbHVlLmZsYXQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMuYWRkKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0cmF2ZXJzZVRpbWVsaW5lKHsgdGltZWxpbmU6IHRpbWVsaW5lX2Rlc2NyaXB0aW9uIH0pO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGltYWdlczogWy4uLnByZWxvYWRQYXRoc1tQYXJhbWV0ZXJUeXBlLklNQUdFXV0sXHJcbiAgICAgICAgICAgIGF1ZGlvOiBbLi4ucHJlbG9hZFBhdGhzW1BhcmFtZXRlclR5cGUuQVVESU9dXSxcclxuICAgICAgICAgICAgdmlkZW86IFsuLi5wcmVsb2FkUGF0aHNbUGFyYW1ldGVyVHlwZS5WSURFT11dLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBjYW5jZWxQcmVsb2FkcygpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IHJlcXVlc3Qgb2YgdGhpcy5wcmVsb2FkX3JlcXVlc3RzKSB7XHJcbiAgICAgICAgICAgIHJlcXVlc3Qub25sb2FkID0gKCkgPT4geyB9O1xyXG4gICAgICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiB7IH07XHJcbiAgICAgICAgICAgIHJlcXVlc3Qub25jYW5wbGF5dGhyb3VnaCA9ICgpID0+IHsgfTtcclxuICAgICAgICAgICAgcmVxdWVzdC5vbmFib3J0ID0gKCkgPT4geyB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnByZWxvYWRfcmVxdWVzdHMgPSBbXTtcclxuICAgIH1cclxuICAgIGluaXRpYWxpemVNaWNyb3Bob25lUmVjb3JkZXIoc3RyZWFtKSB7XHJcbiAgICAgICAgY29uc3QgcmVjb3JkZXIgPSBuZXcgTWVkaWFSZWNvcmRlcihzdHJlYW0pO1xyXG4gICAgICAgIHRoaXMubWljcm9waG9uZV9yZWNvcmRlciA9IHJlY29yZGVyO1xyXG4gICAgfVxyXG4gICAgZ2V0TWljcm9waG9uZVJlY29yZGVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1pY3JvcGhvbmVfcmVjb3JkZXI7XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgU2ltdWxhdGlvbkFQSSB7XHJcbiAgICBkaXNwYXRjaEV2ZW50KGV2ZW50KSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGlzcGF0Y2hlcyBhIGBrZXlkb3duYCBldmVudCBmb3IgdGhlIHNwZWNpZmllZCBrZXlcclxuICAgICAqIEBwYXJhbSBrZXkgQ2hhcmFjdGVyIGNvZGUgKGAua2V5YCBwcm9wZXJ0eSkgZm9yIHRoZSBrZXkgdG8gcHJlc3MuXHJcbiAgICAgKi9cclxuICAgIGtleURvd24oa2V5KSB7XHJcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBLZXlib2FyZEV2ZW50KFwia2V5ZG93blwiLCB7IGtleSB9KSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIERpc3BhdGNoZXMgYSBga2V5dXBgIGV2ZW50IGZvciB0aGUgc3BlY2lmaWVkIGtleVxyXG4gICAgICogQHBhcmFtIGtleSBDaGFyYWN0ZXIgY29kZSAoYC5rZXlgIHByb3BlcnR5KSBmb3IgdGhlIGtleSB0byBwcmVzcy5cclxuICAgICAqL1xyXG4gICAga2V5VXAoa2V5KSB7XHJcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBLZXlib2FyZEV2ZW50KFwia2V5dXBcIiwgeyBrZXkgfSkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXNwYXRjaGVzIGEgYGtleWRvd25gIGFuZCBga2V5dXBgIGV2ZW50IGluIHNlcXVlbmNlIHRvIHNpbXVsYXRlIHByZXNzaW5nIGEga2V5LlxyXG4gICAgICogQHBhcmFtIGtleSBDaGFyYWN0ZXIgY29kZSAoYC5rZXlgIHByb3BlcnR5KSBmb3IgdGhlIGtleSB0byBwcmVzcy5cclxuICAgICAqIEBwYXJhbSBkZWxheSBMZW5ndGggb2YgdGltZSB0byB3YWl0IChtcykgYmVmb3JlIGV4ZWN1dGluZyBhY3Rpb25cclxuICAgICAqL1xyXG4gICAgcHJlc3NLZXkoa2V5LCBkZWxheSA9IDApIHtcclxuICAgICAgICBpZiAoZGVsYXkgPiAwKSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5rZXlEb3duKGtleSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmtleVVwKGtleSk7XHJcbiAgICAgICAgICAgIH0sIGRlbGF5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMua2V5RG93bihrZXkpO1xyXG4gICAgICAgICAgICB0aGlzLmtleVVwKGtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXNwYXRjaGVzIGBtb3VzZWRvd25gLCBgbW91c2V1cGAsIGFuZCBgY2xpY2tgIGV2ZW50cyBvbiB0aGUgdGFyZ2V0IGVsZW1lbnRcclxuICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIGVsZW1lbnQgdG8gY2xpY2tcclxuICAgICAqIEBwYXJhbSBkZWxheSBMZW5ndGggb2YgdGltZSB0byB3YWl0IChtcykgYmVmb3JlIGV4ZWN1dGluZyBhY3Rpb25cclxuICAgICAqL1xyXG4gICAgY2xpY2tUYXJnZXQodGFyZ2V0LCBkZWxheSA9IDApIHtcclxuICAgICAgICBpZiAoZGVsYXkgPiAwKSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoXCJtb3VzZWRvd25cIiwgeyBidWJibGVzOiB0cnVlIH0pKTtcclxuICAgICAgICAgICAgICAgIHRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KFwibW91c2V1cFwiLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoXCJjbGlja1wiLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xyXG4gICAgICAgICAgICB9LCBkZWxheSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0YXJnZXQuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudChcIm1vdXNlZG93blwiLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xyXG4gICAgICAgICAgICB0YXJnZXQuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudChcIm1vdXNldXBcIiwgeyBidWJibGVzOiB0cnVlIH0pKTtcclxuICAgICAgICAgICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoXCJjbGlja1wiLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSB0YXJnZXQgdGV4dCBpbnB1dFxyXG4gICAgICogQHBhcmFtIHRhcmdldCBBIHRleHQgaW5wdXQgZWxlbWVudCB0byBmaWxsIGluXHJcbiAgICAgKiBAcGFyYW0gdGV4dCBUZXh0IHRvIGlucHV0XHJcbiAgICAgKiBAcGFyYW0gZGVsYXkgTGVuZ3RoIG9mIHRpbWUgdG8gd2FpdCAobXMpIGJlZm9yZSBleGVjdXRpbmcgYWN0aW9uXHJcbiAgICAgKi9cclxuICAgIGZpbGxUZXh0SW5wdXQodGFyZ2V0LCB0ZXh0LCBkZWxheSA9IDApIHtcclxuICAgICAgICBpZiAoZGVsYXkgPiAwKSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0LnZhbHVlID0gdGV4dDtcclxuICAgICAgICAgICAgfSwgZGVsYXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGFyZ2V0LnZhbHVlID0gdGV4dDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFBpY2tzIGEgdmFsaWQga2V5IGZyb20gYGNob2ljZXNgLCB0YWtpbmcgaW50byBhY2NvdW50IGpzUHN5Y2gtc3BlY2lmaWNcclxuICAgICAqIGlkZW50aWZpZXJzIGxpa2UgXCJOT19LRVlTXCIgYW5kIFwiQUxMX0tFWVNcIi5cclxuICAgICAqIEBwYXJhbSBjaG9pY2VzIFdoaWNoIGtleXMgYXJlIHZhbGlkLlxyXG4gICAgICogQHJldHVybnMgQSBrZXkgc2VsZWN0ZWQgYXQgcmFuZG9tIGZyb20gdGhlIHZhbGlkIGtleXMuXHJcbiAgICAgKi9cclxuICAgIGdldFZhbGlkS2V5KGNob2ljZXMpIHtcclxuICAgICAgICBjb25zdCBwb3NzaWJsZV9rZXlzID0gW1xyXG4gICAgICAgICAgICBcImFcIixcclxuICAgICAgICAgICAgXCJiXCIsXHJcbiAgICAgICAgICAgIFwiY1wiLFxyXG4gICAgICAgICAgICBcImRcIixcclxuICAgICAgICAgICAgXCJlXCIsXHJcbiAgICAgICAgICAgIFwiZlwiLFxyXG4gICAgICAgICAgICBcImdcIixcclxuICAgICAgICAgICAgXCJoXCIsXHJcbiAgICAgICAgICAgIFwiaVwiLFxyXG4gICAgICAgICAgICBcImpcIixcclxuICAgICAgICAgICAgXCJrXCIsXHJcbiAgICAgICAgICAgIFwibFwiLFxyXG4gICAgICAgICAgICBcIm1cIixcclxuICAgICAgICAgICAgXCJuXCIsXHJcbiAgICAgICAgICAgIFwib1wiLFxyXG4gICAgICAgICAgICBcInBcIixcclxuICAgICAgICAgICAgXCJxXCIsXHJcbiAgICAgICAgICAgIFwiclwiLFxyXG4gICAgICAgICAgICBcInNcIixcclxuICAgICAgICAgICAgXCJ0XCIsXHJcbiAgICAgICAgICAgIFwidVwiLFxyXG4gICAgICAgICAgICBcInZcIixcclxuICAgICAgICAgICAgXCJ3XCIsXHJcbiAgICAgICAgICAgIFwieFwiLFxyXG4gICAgICAgICAgICBcInlcIixcclxuICAgICAgICAgICAgXCJ6XCIsXHJcbiAgICAgICAgICAgIFwiMFwiLFxyXG4gICAgICAgICAgICBcIjFcIixcclxuICAgICAgICAgICAgXCIyXCIsXHJcbiAgICAgICAgICAgIFwiM1wiLFxyXG4gICAgICAgICAgICBcIjRcIixcclxuICAgICAgICAgICAgXCI1XCIsXHJcbiAgICAgICAgICAgIFwiNlwiLFxyXG4gICAgICAgICAgICBcIjdcIixcclxuICAgICAgICAgICAgXCI4XCIsXHJcbiAgICAgICAgICAgIFwiOVwiLFxyXG4gICAgICAgICAgICBcIiBcIixcclxuICAgICAgICBdO1xyXG4gICAgICAgIGxldCBrZXk7XHJcbiAgICAgICAgaWYgKGNob2ljZXMgPT0gXCJOT19LRVlTXCIpIHtcclxuICAgICAgICAgICAga2V5ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY2hvaWNlcyA9PSBcIkFMTF9LRVlTXCIpIHtcclxuICAgICAgICAgICAga2V5ID0gcG9zc2libGVfa2V5c1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBwb3NzaWJsZV9rZXlzLmxlbmd0aCldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZmxhdF9jaG9pY2VzID0gY2hvaWNlcy5mbGF0KCk7XHJcbiAgICAgICAgICAgIGtleSA9IGZsYXRfY2hvaWNlc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBmbGF0X2Nob2ljZXMubGVuZ3RoKV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9XHJcbiAgICBtZXJnZVNpbXVsYXRpb25EYXRhKGRlZmF1bHRfZGF0YSwgc2ltdWxhdGlvbl9vcHRpb25zKSB7XHJcbiAgICAgICAgLy8gb3ZlcnJpZGUgYW55IGRhdGEgd2l0aCBkYXRhIGZyb20gc2ltdWxhdGlvbiBvYmplY3RcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0X2RhdGEpLCBzaW11bGF0aW9uX29wdGlvbnMgPT09IG51bGwgfHwgc2ltdWxhdGlvbl9vcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzaW11bGF0aW9uX29wdGlvbnMuZGF0YSk7XHJcbiAgICB9XHJcbiAgICBlbnN1cmVTaW11bGF0aW9uRGF0YUNvbnNpc3RlbmN5KHRyaWFsLCBkYXRhKSB7XHJcbiAgICAgICAgLy8gQWxsIFJUcyBtdXN0IGJlIHJvdW5kZWRcclxuICAgICAgICBpZiAoZGF0YS5ydCkge1xyXG4gICAgICAgICAgICBkYXRhLnJ0ID0gTWF0aC5yb3VuZChkYXRhLnJ0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSWYgYSB0cmlhbF9kdXJhdGlvbiBhbmQgcnQgZXhpc3QsIG1ha2Ugc3VyZSB0aGF0IHRoZSBSVCBpcyBub3QgbG9uZ2VyIHRoYW4gdGhlIHRyaWFsLlxyXG4gICAgICAgIGlmICh0cmlhbC50cmlhbF9kdXJhdGlvbiAmJiBkYXRhLnJ0ICYmIGRhdGEucnQgPiB0cmlhbC50cmlhbF9kdXJhdGlvbikge1xyXG4gICAgICAgICAgICBkYXRhLnJ0ID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKGRhdGEucmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgIGRhdGEucmVzcG9uc2UgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChkYXRhLmNvcnJlY3QpIHtcclxuICAgICAgICAgICAgICAgIGRhdGEuY29ycmVjdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIElmIHRyaWFsLmNob2ljZXMgaXMgTk9fS0VZUyBtYWtlIHN1cmUgdGhhdCByZXNwb25zZSBhbmQgUlQgYXJlIG51bGxcclxuICAgICAgICBpZiAodHJpYWwuY2hvaWNlcyAmJiB0cmlhbC5jaG9pY2VzID09IFwiTk9fS0VZU1wiKSB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhLnJ0KSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhLnJ0ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZGF0YS5yZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgZGF0YS5yZXNwb25zZSA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSWYgcmVzcG9uc2UgaXMgbm90IGFsbG93ZWQgYmVmb3JlIHN0aW11bHVzIGRpc3BsYXkgY29tcGxldGUsIGVuc3VyZSBSVFxyXG4gICAgICAgIC8vIGlzIGxvbmdlciB0aGFuIGRpc3BsYXkgdGltZS5cclxuICAgICAgICBpZiAodHJpYWwuYWxsb3dfcmVzcG9uc2VfYmVmb3JlX2NvbXBsZXRlKSB7XHJcbiAgICAgICAgICAgIGlmICh0cmlhbC5zZXF1ZW5jZV9yZXBzICYmIHRyaWFsLmZyYW1lX3RpbWUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1pbl90aW1lID0gdHJpYWwuc2VxdWVuY2VfcmVwcyAqIHRyaWFsLmZyYW1lX3RpbWUgKiB0cmlhbC5zdGltdWxpLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIGlmIChkYXRhLnJ0IDwgbWluX3RpbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLnJ0ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLnJlc3BvbnNlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG5jbGFzcyBUaW1lb3V0QVBJIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMudGltZW91dF9oYW5kbGVycyA9IFtdO1xyXG4gICAgfVxyXG4gICAgc2V0VGltZW91dChjYWxsYmFjaywgZGVsYXkpIHtcclxuICAgICAgICBjb25zdCBoYW5kbGUgPSB3aW5kb3cuc2V0VGltZW91dChjYWxsYmFjaywgZGVsYXkpO1xyXG4gICAgICAgIHRoaXMudGltZW91dF9oYW5kbGVycy5wdXNoKGhhbmRsZSk7XHJcbiAgICAgICAgcmV0dXJuIGhhbmRsZTtcclxuICAgIH1cclxuICAgIGNsZWFyQWxsVGltZW91dHMoKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIHRoaXMudGltZW91dF9oYW5kbGVycykge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoaGFuZGxlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudGltZW91dF9oYW5kbGVycyA9IFtdO1xyXG4gICAgfVxyXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUpvaW50UGx1Z2luQVBJT2JqZWN0KGpzUHN5Y2gpIHtcclxuICAgIGNvbnN0IHNldHRpbmdzID0ganNQc3ljaC5nZXRJbml0U2V0dGluZ3MoKTtcclxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCAuLi5bXHJcbiAgICAgICAgbmV3IEtleWJvYXJkTGlzdGVuZXJBUEkoanNQc3ljaC5nZXREaXNwbGF5Q29udGFpbmVyRWxlbWVudCwgc2V0dGluZ3MuY2FzZV9zZW5zaXRpdmVfcmVzcG9uc2VzLCBzZXR0aW5ncy5taW5pbXVtX3ZhbGlkX3J0KSxcclxuICAgICAgICBuZXcgVGltZW91dEFQSSgpLFxyXG4gICAgICAgIG5ldyBNZWRpYUFQSShzZXR0aW5ncy51c2Vfd2ViYXVkaW8sIGpzUHN5Y2gud2ViYXVkaW9fY29udGV4dCksXHJcbiAgICAgICAgbmV3IEhhcmR3YXJlQVBJKCksXHJcbiAgICAgICAgbmV3IFNpbXVsYXRpb25BUEkoKSxcclxuICAgIF0ubWFwKChvYmplY3QpID0+IGF1dG9CaW5kKG9iamVjdCkpKTtcclxufVxuXG52YXIgd29yZExpc3QgPSBbXG4gIC8vIEJvcnJvd2VkIGZyb20geGtjZCBwYXNzd29yZCBnZW5lcmF0b3Igd2hpY2ggYm9ycm93ZWQgaXQgZnJvbSB3aGVyZXZlclxuICBcImFiaWxpdHlcIixcImFibGVcIixcImFib2FyZFwiLFwiYWJvdXRcIixcImFib3ZlXCIsXCJhY2NlcHRcIixcImFjY2lkZW50XCIsXCJhY2NvcmRpbmdcIixcbiAgXCJhY2NvdW50XCIsXCJhY2N1cmF0ZVwiLFwiYWNyZXNcIixcImFjcm9zc1wiLFwiYWN0XCIsXCJhY3Rpb25cIixcImFjdGl2ZVwiLFwiYWN0aXZpdHlcIixcbiAgXCJhY3R1YWxcIixcImFjdHVhbGx5XCIsXCJhZGRcIixcImFkZGl0aW9uXCIsXCJhZGRpdGlvbmFsXCIsXCJhZGplY3RpdmVcIixcImFkdWx0XCIsXCJhZHZlbnR1cmVcIixcbiAgXCJhZHZpY2VcIixcImFmZmVjdFwiLFwiYWZyYWlkXCIsXCJhZnRlclwiLFwiYWZ0ZXJub29uXCIsXCJhZ2FpblwiLFwiYWdhaW5zdFwiLFwiYWdlXCIsXG4gIFwiYWdvXCIsXCJhZ3JlZVwiLFwiYWhlYWRcIixcImFpZFwiLFwiYWlyXCIsXCJhaXJwbGFuZVwiLFwiYWxpa2VcIixcImFsaXZlXCIsXG4gIFwiYWxsXCIsXCJhbGxvd1wiLFwiYWxtb3N0XCIsXCJhbG9uZVwiLFwiYWxvbmdcIixcImFsb3VkXCIsXCJhbHBoYWJldFwiLFwiYWxyZWFkeVwiLFxuICBcImFsc29cIixcImFsdGhvdWdoXCIsXCJhbVwiLFwiYW1vbmdcIixcImFtb3VudFwiLFwiYW5jaWVudFwiLFwiYW5nbGVcIixcImFuZ3J5XCIsXG4gIFwiYW5pbWFsXCIsXCJhbm5vdW5jZWRcIixcImFub3RoZXJcIixcImFuc3dlclwiLFwiYW50c1wiLFwiYW55XCIsXCJhbnlib2R5XCIsXCJhbnlvbmVcIixcbiAgXCJhbnl0aGluZ1wiLFwiYW55d2F5XCIsXCJhbnl3aGVyZVwiLFwiYXBhcnRcIixcImFwYXJ0bWVudFwiLFwiYXBwZWFyYW5jZVwiLFwiYXBwbGVcIixcImFwcGxpZWRcIixcbiAgXCJhcHByb3ByaWF0ZVwiLFwiYXJlXCIsXCJhcmVhXCIsXCJhcm1cIixcImFybXlcIixcImFyb3VuZFwiLFwiYXJyYW5nZVwiLFwiYXJyYW5nZW1lbnRcIixcbiAgXCJhcnJpdmVcIixcImFycm93XCIsXCJhcnRcIixcImFydGljbGVcIixcImFzXCIsXCJhc2lkZVwiLFwiYXNrXCIsXCJhc2xlZXBcIixcbiAgXCJhdFwiLFwiYXRlXCIsXCJhdG1vc3BoZXJlXCIsXCJhdG9tXCIsXCJhdG9taWNcIixcImF0dGFjaGVkXCIsXCJhdHRhY2tcIixcImF0dGVtcHRcIixcbiAgXCJhdHRlbnRpb25cIixcImF1ZGllbmNlXCIsXCJhdXRob3JcIixcImF1dG9tb2JpbGVcIixcImF2YWlsYWJsZVwiLFwiYXZlcmFnZVwiLFwiYXZvaWRcIixcImF3YXJlXCIsXG4gIFwiYXdheVwiLFwiYmFieVwiLFwiYmFja1wiLFwiYmFkXCIsXCJiYWRseVwiLFwiYmFnXCIsXCJiYWxhbmNlXCIsXCJiYWxsXCIsXG4gIFwiYmFsbG9vblwiLFwiYmFuZFwiLFwiYmFua1wiLFwiYmFyXCIsXCJiYXJlXCIsXCJiYXJrXCIsXCJiYXJuXCIsXCJiYXNlXCIsXG4gIFwiYmFzZWJhbGxcIixcImJhc2ljXCIsXCJiYXNpc1wiLFwiYmFza2V0XCIsXCJiYXRcIixcImJhdHRsZVwiLFwiYmVcIixcImJlYW5cIixcbiAgXCJiZWFyXCIsXCJiZWF0XCIsXCJiZWF1dGlmdWxcIixcImJlYXV0eVwiLFwiYmVjYW1lXCIsXCJiZWNhdXNlXCIsXCJiZWNvbWVcIixcImJlY29taW5nXCIsXG4gIFwiYmVlXCIsXCJiZWVuXCIsXCJiZWZvcmVcIixcImJlZ2FuXCIsXCJiZWdpbm5pbmdcIixcImJlZ3VuXCIsXCJiZWhhdmlvclwiLFwiYmVoaW5kXCIsXG4gIFwiYmVpbmdcIixcImJlbGlldmVkXCIsXCJiZWxsXCIsXCJiZWxvbmdcIixcImJlbG93XCIsXCJiZWx0XCIsXCJiZW5kXCIsXCJiZW5lYXRoXCIsXG4gIFwiYmVudFwiLFwiYmVzaWRlXCIsXCJiZXN0XCIsXCJiZXRcIixcImJldHRlclwiLFwiYmV0d2VlblwiLFwiYmV5b25kXCIsXCJiaWN5Y2xlXCIsXG4gIFwiYmlnZ2VyXCIsXCJiaWdnZXN0XCIsXCJiaWxsXCIsXCJiaXJkc1wiLFwiYmlydGhcIixcImJpcnRoZGF5XCIsXCJiaXRcIixcImJpdGVcIixcbiAgXCJibGFja1wiLFwiYmxhbmtcIixcImJsYW5rZXRcIixcImJsZXdcIixcImJsaW5kXCIsXCJibG9ja1wiLFwiYmxvb2RcIixcImJsb3dcIixcbiAgXCJibHVlXCIsXCJib2FyZFwiLFwiYm9hdFwiLFwiYm9keVwiLFwiYm9uZVwiLFwiYm9va1wiLFwiYm9yZGVyXCIsXCJib3JuXCIsXG4gIFwiYm90aFwiLFwiYm90dGxlXCIsXCJib3R0b21cIixcImJvdW5kXCIsXCJib3dcIixcImJvd2xcIixcImJveFwiLFwiYm95XCIsXG4gIFwiYnJhaW5cIixcImJyYW5jaFwiLFwiYnJhc3NcIixcImJyYXZlXCIsXCJicmVhZFwiLFwiYnJlYWtcIixcImJyZWFrZmFzdFwiLFwiYnJlYXRoXCIsXG4gIFwiYnJlYXRoZVwiLFwiYnJlYXRoaW5nXCIsXCJicmVlemVcIixcImJyaWNrXCIsXCJicmlkZ2VcIixcImJyaWVmXCIsXCJicmlnaHRcIixcImJyaW5nXCIsXG4gIFwiYnJvYWRcIixcImJyb2tlXCIsXCJicm9rZW5cIixcImJyb3RoZXJcIixcImJyb3VnaHRcIixcImJyb3duXCIsXCJicnVzaFwiLFwiYnVmZmFsb1wiLFxuICBcImJ1aWxkXCIsXCJidWlsZGluZ1wiLFwiYnVpbHRcIixcImJ1cmllZFwiLFwiYnVyblwiLFwiYnVyc3RcIixcImJ1c1wiLFwiYnVzaFwiLFxuICBcImJ1c2luZXNzXCIsXCJidXN5XCIsXCJidXRcIixcImJ1dHRlclwiLFwiYnV5XCIsXCJieVwiLFwiY2FiaW5cIixcImNhZ2VcIixcbiAgXCJjYWtlXCIsXCJjYWxsXCIsXCJjYWxtXCIsXCJjYW1lXCIsXCJjYW1lcmFcIixcImNhbXBcIixcImNhblwiLFwiY2FuYWxcIixcbiAgXCJjYW5ub3RcIixcImNhcFwiLFwiY2FwaXRhbFwiLFwiY2FwdGFpblwiLFwiY2FwdHVyZWRcIixcImNhclwiLFwiY2FyYm9uXCIsXCJjYXJkXCIsXG4gIFwiY2FyZVwiLFwiY2FyZWZ1bFwiLFwiY2FyZWZ1bGx5XCIsXCJjYXJyaWVkXCIsXCJjYXJyeVwiLFwiY2FzZVwiLFwiY2FzdFwiLFwiY2FzdGxlXCIsXG4gIFwiY2F0XCIsXCJjYXRjaFwiLFwiY2F0dGxlXCIsXCJjYXVnaHRcIixcImNhdXNlXCIsXCJjYXZlXCIsXCJjZWxsXCIsXCJjZW50XCIsXG4gIFwiY2VudGVyXCIsXCJjZW50cmFsXCIsXCJjZW50dXJ5XCIsXCJjZXJ0YWluXCIsXCJjZXJ0YWlubHlcIixcImNoYWluXCIsXCJjaGFpclwiLFwiY2hhbWJlclwiLFxuICBcImNoYW5jZVwiLFwiY2hhbmdlXCIsXCJjaGFuZ2luZ1wiLFwiY2hhcHRlclwiLFwiY2hhcmFjdGVyXCIsXCJjaGFyYWN0ZXJpc3RpY1wiLFwiY2hhcmdlXCIsXCJjaGFydFwiLFxuICBcImNoZWNrXCIsXCJjaGVlc2VcIixcImNoZW1pY2FsXCIsXCJjaGVzdFwiLFwiY2hpY2tlblwiLFwiY2hpZWZcIixcImNoaWxkXCIsXCJjaGlsZHJlblwiLFxuICBcImNob2ljZVwiLFwiY2hvb3NlXCIsXCJjaG9zZVwiLFwiY2hvc2VuXCIsXCJjaHVyY2hcIixcImNpcmNsZVwiLFwiY2lyY3VzXCIsXCJjaXRpemVuXCIsXG4gIFwiY2l0eVwiLFwiY2xhc3NcIixcImNsYXNzcm9vbVwiLFwiY2xhd3NcIixcImNsYXlcIixcImNsZWFuXCIsXCJjbGVhclwiLFwiY2xlYXJseVwiLFxuICBcImNsaW1hdGVcIixcImNsaW1iXCIsXCJjbG9ja1wiLFwiY2xvc2VcIixcImNsb3NlbHlcIixcImNsb3NlclwiLFwiY2xvdGhcIixcImNsb3RoZXNcIixcbiAgXCJjbG90aGluZ1wiLFwiY2xvdWRcIixcImNsdWJcIixcImNvYWNoXCIsXCJjb2FsXCIsXCJjb2FzdFwiLFwiY29hdFwiLFwiY29mZmVlXCIsXG4gIFwiY29sZFwiLFwiY29sbGVjdFwiLFwiY29sbGVnZVwiLFwiY29sb255XCIsXCJjb2xvclwiLFwiY29sdW1uXCIsXCJjb21iaW5hdGlvblwiLFwiY29tYmluZVwiLFxuICBcImNvbWVcIixcImNvbWZvcnRhYmxlXCIsXCJjb21pbmdcIixcImNvbW1hbmRcIixcImNvbW1vblwiLFwiY29tbXVuaXR5XCIsXCJjb21wYW55XCIsXCJjb21wYXJlXCIsXG4gIFwiY29tcGFzc1wiLFwiY29tcGxldGVcIixcImNvbXBsZXRlbHlcIixcImNvbXBsZXhcIixcImNvbXBvc2VkXCIsXCJjb21wb3NpdGlvblwiLFwiY29tcG91bmRcIixcImNvbmNlcm5lZFwiLFxuICBcImNvbmRpdGlvblwiLFwiY29uZ3Jlc3NcIixcImNvbm5lY3RlZFwiLFwiY29uc2lkZXJcIixcImNvbnNpc3RcIixcImNvbnNvbmFudFwiLFwiY29uc3RhbnRseVwiLFwiY29uc3RydWN0aW9uXCIsXG4gIFwiY29udGFpblwiLFwiY29udGluZW50XCIsXCJjb250aW51ZWRcIixcImNvbnRyYXN0XCIsXCJjb250cm9sXCIsXCJjb252ZXJzYXRpb25cIixcImNvb2tcIixcImNvb2tpZXNcIixcbiAgXCJjb29sXCIsXCJjb3BwZXJcIixcImNvcHlcIixcImNvcm5cIixcImNvcm5lclwiLFwiY29ycmVjdFwiLFwiY29ycmVjdGx5XCIsXCJjb3N0XCIsXG4gIFwiY290dG9uXCIsXCJjb3VsZFwiLFwiY291bnRcIixcImNvdW50cnlcIixcImNvdXBsZVwiLFwiY291cmFnZVwiLFwiY291cnNlXCIsXCJjb3VydFwiLFxuICBcImNvdmVyXCIsXCJjb3dcIixcImNvd2JveVwiLFwiY3JhY2tcIixcImNyZWFtXCIsXCJjcmVhdGVcIixcImNyZWF0dXJlXCIsXCJjcmV3XCIsXG4gIFwiY3JvcFwiLFwiY3Jvc3NcIixcImNyb3dkXCIsXCJjcnlcIixcImN1cFwiLFwiY3VyaW91c1wiLFwiY3VycmVudFwiLFwiY3VydmVcIixcbiAgXCJjdXN0b21zXCIsXCJjdXRcIixcImN1dHRpbmdcIixcImRhaWx5XCIsXCJkYW1hZ2VcIixcImRhbmNlXCIsXCJkYW5nZXJcIixcImRhbmdlcm91c1wiLFxuICBcImRhcmtcIixcImRhcmtuZXNzXCIsXCJkYXRlXCIsXCJkYXVnaHRlclwiLFwiZGF3blwiLFwiZGF5XCIsXCJkZWFkXCIsXCJkZWFsXCIsXG4gIFwiZGVhclwiLFwiZGVhdGhcIixcImRlY2lkZVwiLFwiZGVjbGFyZWRcIixcImRlZXBcIixcImRlZXBseVwiLFwiZGVlclwiLFwiZGVmaW5pdGlvblwiLFxuICBcImRlZ3JlZVwiLFwiZGVwZW5kXCIsXCJkZXB0aFwiLFwiZGVzY3JpYmVcIixcImRlc2VydFwiLFwiZGVzaWduXCIsXCJkZXNrXCIsXCJkZXRhaWxcIixcbiAgXCJkZXRlcm1pbmVcIixcImRldmVsb3BcIixcImRldmVsb3BtZW50XCIsXCJkaWFncmFtXCIsXCJkaWFtZXRlclwiLFwiZGlkXCIsXCJkaWVcIixcImRpZmZlclwiLFxuICBcImRpZmZlcmVuY2VcIixcImRpZmZlcmVudFwiLFwiZGlmZmljdWx0XCIsXCJkaWZmaWN1bHR5XCIsXCJkaWdcIixcImRpbm5lclwiLFwiZGlyZWN0XCIsXCJkaXJlY3Rpb25cIixcbiAgXCJkaXJlY3RseVwiLFwiZGlydFwiLFwiZGlydHlcIixcImRpc2FwcGVhclwiLFwiZGlzY292ZXJcIixcImRpc2NvdmVyeVwiLFwiZGlzY3Vzc1wiLFwiZGlzY3Vzc2lvblwiLFxuICBcImRpc2Vhc2VcIixcImRpc2hcIixcImRpc3RhbmNlXCIsXCJkaXN0YW50XCIsXCJkaXZpZGVcIixcImRpdmlzaW9uXCIsXCJkb1wiLFwiZG9jdG9yXCIsXG4gIFwiZG9lc1wiLFwiZG9nXCIsXCJkb2luZ1wiLFwiZG9sbFwiLFwiZG9sbGFyXCIsXCJkb25lXCIsXCJkb25rZXlcIixcImRvb3JcIixcbiAgXCJkb3RcIixcImRvdWJsZVwiLFwiZG91YnRcIixcImRvd25cIixcImRvemVuXCIsXCJkcmF3XCIsXCJkcmF3blwiLFwiZHJlYW1cIixcbiAgXCJkcmVzc1wiLFwiZHJld1wiLFwiZHJpZWRcIixcImRyaW5rXCIsXCJkcml2ZVwiLFwiZHJpdmVuXCIsXCJkcml2ZXJcIixcImRyaXZpbmdcIixcbiAgXCJkcm9wXCIsXCJkcm9wcGVkXCIsXCJkcm92ZVwiLFwiZHJ5XCIsXCJkdWNrXCIsXCJkdWVcIixcImR1Z1wiLFwiZHVsbFwiLFxuICBcImR1cmluZ1wiLFwiZHVzdFwiLFwiZHV0eVwiLFwiZWFjaFwiLFwiZWFnZXJcIixcImVhclwiLFwiZWFybGllclwiLFwiZWFybHlcIixcbiAgXCJlYXJuXCIsXCJlYXJ0aFwiLFwiZWFzaWVyXCIsXCJlYXNpbHlcIixcImVhc3RcIixcImVhc3lcIixcImVhdFwiLFwiZWF0ZW5cIixcbiAgXCJlZGdlXCIsXCJlZHVjYXRpb25cIixcImVmZmVjdFwiLFwiZWZmb3J0XCIsXCJlZ2dcIixcImVpZ2h0XCIsXCJlaXRoZXJcIixcImVsZWN0cmljXCIsXG4gIFwiZWxlY3RyaWNpdHlcIixcImVsZW1lbnRcIixcImVsZXBoYW50XCIsXCJlbGV2ZW5cIixcImVsc2VcIixcImVtcHR5XCIsXCJlbmRcIixcImVuZW15XCIsXG4gIFwiZW5lcmd5XCIsXCJlbmdpbmVcIixcImVuZ2luZWVyXCIsXCJlbmpveVwiLFwiZW5vdWdoXCIsXCJlbnRlclwiLFwiZW50aXJlXCIsXCJlbnRpcmVseVwiLFxuICBcImVudmlyb25tZW50XCIsXCJlcXVhbFwiLFwiZXF1YWxseVwiLFwiZXF1YXRvclwiLFwiZXF1aXBtZW50XCIsXCJlc2NhcGVcIixcImVzcGVjaWFsbHlcIixcImVzc2VudGlhbFwiLFxuICBcImVzdGFibGlzaFwiLFwiZXZlblwiLFwiZXZlbmluZ1wiLFwiZXZlbnRcIixcImV2ZW50dWFsbHlcIixcImV2ZXJcIixcImV2ZXJ5XCIsXCJldmVyeWJvZHlcIixcbiAgXCJldmVyeW9uZVwiLFwiZXZlcnl0aGluZ1wiLFwiZXZlcnl3aGVyZVwiLFwiZXZpZGVuY2VcIixcImV4YWN0XCIsXCJleGFjdGx5XCIsXCJleGFtaW5lXCIsXCJleGFtcGxlXCIsXG4gIFwiZXhjZWxsZW50XCIsXCJleGNlcHRcIixcImV4Y2hhbmdlXCIsXCJleGNpdGVkXCIsXCJleGNpdGVtZW50XCIsXCJleGNpdGluZ1wiLFwiZXhjbGFpbWVkXCIsXCJleGVyY2lzZVwiLFxuICBcImV4aXN0XCIsXCJleHBlY3RcIixcImV4cGVyaWVuY2VcIixcImV4cGVyaW1lbnRcIixcImV4cGxhaW5cIixcImV4cGxhbmF0aW9uXCIsXCJleHBsb3JlXCIsXCJleHByZXNzXCIsXG4gIFwiZXhwcmVzc2lvblwiLFwiZXh0cmFcIixcImV5ZVwiLFwiZmFjZVwiLFwiZmFjaW5nXCIsXCJmYWN0XCIsXCJmYWN0b3JcIixcImZhY3RvcnlcIixcbiAgXCJmYWlsZWRcIixcImZhaXJcIixcImZhaXJseVwiLFwiZmFsbFwiLFwiZmFsbGVuXCIsXCJmYW1pbGlhclwiLFwiZmFtaWx5XCIsXCJmYW1vdXNcIixcbiAgXCJmYXJcIixcImZhcm1cIixcImZhcm1lclwiLFwiZmFydGhlclwiLFwiZmFzdFwiLFwiZmFzdGVuZWRcIixcImZhc3RlclwiLFwiZmF0XCIsXG4gIFwiZmF0aGVyXCIsXCJmYXZvcml0ZVwiLFwiZmVhclwiLFwiZmVhdGhlcnNcIixcImZlYXR1cmVcIixcImZlZFwiLFwiZmVlZFwiLFwiZmVlbFwiLFxuICBcImZlZXRcIixcImZlbGxcIixcImZlbGxvd1wiLFwiZmVsdFwiLFwiZmVuY2VcIixcImZld1wiLFwiZmV3ZXJcIixcImZpZWxkXCIsXG4gIFwiZmllcmNlXCIsXCJmaWZ0ZWVuXCIsXCJmaWZ0aFwiLFwiZmlmdHlcIixcImZpZ2h0XCIsXCJmaWdodGluZ1wiLFwiZmlndXJlXCIsXCJmaWxsXCIsXG4gIFwiZmlsbVwiLFwiZmluYWxcIixcImZpbmFsbHlcIixcImZpbmRcIixcImZpbmVcIixcImZpbmVzdFwiLFwiZmluZ2VyXCIsXCJmaW5pc2hcIixcbiAgXCJmaXJlXCIsXCJmaXJlcGxhY2VcIixcImZpcm1cIixcImZpcnN0XCIsXCJmaXNoXCIsXCJmaXZlXCIsXCJmaXhcIixcImZsYWdcIixcbiAgXCJmbGFtZVwiLFwiZmxhdFwiLFwiZmxld1wiLFwiZmxpZXNcIixcImZsaWdodFwiLFwiZmxvYXRpbmdcIixcImZsb29yXCIsXCJmbG93XCIsXG4gIFwiZmxvd2VyXCIsXCJmbHlcIixcImZvZ1wiLFwiZm9sa3NcIixcImZvbGxvd1wiLFwiZm9vZFwiLFwiZm9vdFwiLFwiZm9vdGJhbGxcIixcbiAgXCJmb3JcIixcImZvcmNlXCIsXCJmb3JlaWduXCIsXCJmb3Jlc3RcIixcImZvcmdldFwiLFwiZm9yZ290XCIsXCJmb3Jnb3R0ZW5cIixcImZvcm1cIixcbiAgXCJmb3JtZXJcIixcImZvcnRcIixcImZvcnRoXCIsXCJmb3J0eVwiLFwiZm9yd2FyZFwiLFwiZm91Z2h0XCIsXCJmb3VuZFwiLFwiZm91clwiLFxuICBcImZvdXJ0aFwiLFwiZm94XCIsXCJmcmFtZVwiLFwiZnJlZVwiLFwiZnJlZWRvbVwiLFwiZnJlcXVlbnRseVwiLFwiZnJlc2hcIixcImZyaWVuZFwiLFxuICBcImZyaWVuZGx5XCIsXCJmcmlnaHRlblwiLFwiZnJvZ1wiLFwiZnJvbVwiLFwiZnJvbnRcIixcImZyb3plblwiLFwiZnJ1aXRcIixcImZ1ZWxcIixcbiAgXCJmdWxsXCIsXCJmdWxseVwiLFwiZnVuXCIsXCJmdW5jdGlvblwiLFwiZnVubnlcIixcImZ1clwiLFwiZnVybml0dXJlXCIsXCJmdXJ0aGVyXCIsXG4gIFwiZnV0dXJlXCIsXCJnYWluXCIsXCJnYW1lXCIsXCJnYXJhZ2VcIixcImdhcmRlblwiLFwiZ2FzXCIsXCJnYXNvbGluZVwiLFwiZ2F0ZVwiLFxuICBcImdhdGhlclwiLFwiZ2F2ZVwiLFwiZ2VuZXJhbFwiLFwiZ2VuZXJhbGx5XCIsXCJnZW50bGVcIixcImdlbnRseVwiLFwiZ2V0XCIsXCJnZXR0aW5nXCIsXG4gIFwiZ2lhbnRcIixcImdpZnRcIixcImdpcmxcIixcImdpdmVcIixcImdpdmVuXCIsXCJnaXZpbmdcIixcImdsYWRcIixcImdsYXNzXCIsXG4gIFwiZ2xvYmVcIixcImdvXCIsXCJnb2VzXCIsXCJnb2xkXCIsXCJnb2xkZW5cIixcImdvbmVcIixcImdvb2RcIixcImdvb3NlXCIsXG4gIFwiZ290XCIsXCJnb3Zlcm5tZW50XCIsXCJncmFiYmVkXCIsXCJncmFkZVwiLFwiZ3JhZHVhbGx5XCIsXCJncmFpblwiLFwiZ3JhbmRmYXRoZXJcIixcImdyYW5kbW90aGVyXCIsXG4gIFwiZ3JhcGhcIixcImdyYXNzXCIsXCJncmF2aXR5XCIsXCJncmF5XCIsXCJncmVhdFwiLFwiZ3JlYXRlclwiLFwiZ3JlYXRlc3RcIixcImdyZWF0bHlcIixcbiAgXCJncmVlblwiLFwiZ3Jld1wiLFwiZ3JvdW5kXCIsXCJncm91cFwiLFwiZ3Jvd1wiLFwiZ3Jvd25cIixcImdyb3d0aFwiLFwiZ3VhcmRcIixcbiAgXCJndWVzc1wiLFwiZ3VpZGVcIixcImd1bGZcIixcImd1blwiLFwiaGFiaXRcIixcImhhZFwiLFwiaGFpclwiLFwiaGFsZlwiLFxuICBcImhhbGZ3YXlcIixcImhhbGxcIixcImhhbmRcIixcImhhbmRsZVwiLFwiaGFuZHNvbWVcIixcImhhbmdcIixcImhhcHBlblwiLFwiaGFwcGVuZWRcIixcbiAgXCJoYXBwaWx5XCIsXCJoYXBweVwiLFwiaGFyYm9yXCIsXCJoYXJkXCIsXCJoYXJkZXJcIixcImhhcmRseVwiLFwiaGFzXCIsXCJoYXRcIixcbiAgXCJoYXZlXCIsXCJoYXZpbmdcIixcImhheVwiLFwiaGVcIixcImhlYWRlZFwiLFwiaGVhZGluZ1wiLFwiaGVhbHRoXCIsXCJoZWFyZFwiLFxuICBcImhlYXJpbmdcIixcImhlYXJ0XCIsXCJoZWF0XCIsXCJoZWF2eVwiLFwiaGVpZ2h0XCIsXCJoZWxkXCIsXCJoZWxsb1wiLFwiaGVscFwiLFxuICBcImhlbHBmdWxcIixcImhlclwiLFwiaGVyZFwiLFwiaGVyZVwiLFwiaGVyc2VsZlwiLFwiaGlkZGVuXCIsXCJoaWRlXCIsXCJoaWdoXCIsXG4gIFwiaGlnaGVyXCIsXCJoaWdoZXN0XCIsXCJoaWdod2F5XCIsXCJoaWxsXCIsXCJoaW1cIixcImhpbXNlbGZcIixcImhpc1wiLFwiaGlzdG9yeVwiLFxuICBcImhpdFwiLFwiaG9sZFwiLFwiaG9sZVwiLFwiaG9sbG93XCIsXCJob21lXCIsXCJob25vclwiLFwiaG9wZVwiLFwiaG9yblwiLFxuICBcImhvcnNlXCIsXCJob3NwaXRhbFwiLFwiaG90XCIsXCJob3VyXCIsXCJob3VzZVwiLFwiaG93XCIsXCJob3dldmVyXCIsXCJodWdlXCIsXG4gIFwiaHVtYW5cIixcImh1bmRyZWRcIixcImh1bmdcIixcImh1bmdyeVwiLFwiaHVudFwiLFwiaHVudGVyXCIsXCJodXJyaWVkXCIsXCJodXJyeVwiLFxuICBcImh1cnRcIixcImh1c2JhbmRcIixcImljZVwiLFwiaWRlYVwiLFwiaWRlbnRpdHlcIixcImlmXCIsXCJpbGxcIixcImltYWdlXCIsXG4gIFwiaW1hZ2luZVwiLFwiaW1tZWRpYXRlbHlcIixcImltcG9ydGFuY2VcIixcImltcG9ydGFudFwiLFwiaW1wb3NzaWJsZVwiLFwiaW1wcm92ZVwiLFwiaW5cIixcImluY2hcIixcbiAgXCJpbmNsdWRlXCIsXCJpbmNsdWRpbmdcIixcImluY29tZVwiLFwiaW5jcmVhc2VcIixcImluZGVlZFwiLFwiaW5kZXBlbmRlbnRcIixcImluZGljYXRlXCIsXCJpbmRpdmlkdWFsXCIsXG4gIFwiaW5kdXN0cmlhbFwiLFwiaW5kdXN0cnlcIixcImluZmx1ZW5jZVwiLFwiaW5mb3JtYXRpb25cIixcImluc2lkZVwiLFwiaW5zdGFuY2VcIixcImluc3RhbnRcIixcImluc3RlYWRcIixcbiAgXCJpbnN0cnVtZW50XCIsXCJpbnRlcmVzdFwiLFwiaW50ZXJpb3JcIixcImludG9cIixcImludHJvZHVjZWRcIixcImludmVudGVkXCIsXCJpbnZvbHZlZFwiLFwiaXJvblwiLFxuICBcImlzXCIsXCJpc2xhbmRcIixcIml0XCIsXCJpdHNcIixcIml0c2VsZlwiLFwiamFja1wiLFwiamFyXCIsXCJqZXRcIixcbiAgXCJqb2JcIixcImpvaW5cIixcImpvaW5lZFwiLFwiam91cm5leVwiLFwiam95XCIsXCJqdWRnZVwiLFwianVtcFwiLFwianVuZ2xlXCIsXG4gIFwianVzdFwiLFwia2VlcFwiLFwia2VwdFwiLFwia2V5XCIsXCJraWRzXCIsXCJraWxsXCIsXCJraW5kXCIsXCJraXRjaGVuXCIsXG4gIFwia25ld1wiLFwia25pZmVcIixcImtub3dcIixcImtub3dsZWRnZVwiLFwia25vd25cIixcImxhYmVsXCIsXCJsYWJvclwiLFwibGFja1wiLFxuICBcImxhZHlcIixcImxhaWRcIixcImxha2VcIixcImxhbXBcIixcImxhbmRcIixcImxhbmd1YWdlXCIsXCJsYXJnZVwiLFwibGFyZ2VyXCIsXG4gIFwibGFyZ2VzdFwiLFwibGFzdFwiLFwibGF0ZVwiLFwibGF0ZXJcIixcImxhdWdoXCIsXCJsYXdcIixcImxheVwiLFwibGF5ZXJzXCIsXG4gIFwibGVhZFwiLFwibGVhZGVyXCIsXCJsZWFmXCIsXCJsZWFyblwiLFwibGVhc3RcIixcImxlYXRoZXJcIixcImxlYXZlXCIsXCJsZWF2aW5nXCIsXG4gIFwibGVkXCIsXCJsZWZ0XCIsXCJsZWdcIixcImxlbmd0aFwiLFwibGVzc29uXCIsXCJsZXRcIixcImxldHRlclwiLFwibGV2ZWxcIixcbiAgXCJsaWJyYXJ5XCIsXCJsaWVcIixcImxpZmVcIixcImxpZnRcIixcImxpZ2h0XCIsXCJsaWtlXCIsXCJsaWtlbHlcIixcImxpbWl0ZWRcIixcbiAgXCJsaW5lXCIsXCJsaW9uXCIsXCJsaXBzXCIsXCJsaXF1aWRcIixcImxpc3RcIixcImxpc3RlblwiLFwibGl0dGxlXCIsXCJsaXZlXCIsXG4gIFwibGl2aW5nXCIsXCJsb2FkXCIsXCJsb2NhbFwiLFwibG9jYXRlXCIsXCJsb2NhdGlvblwiLFwibG9nXCIsXCJsb25lbHlcIixcImxvbmdcIixcbiAgXCJsb25nZXJcIixcImxvb2tcIixcImxvb3NlXCIsXCJsb3NlXCIsXCJsb3NzXCIsXCJsb3N0XCIsXCJsb3RcIixcImxvdWRcIixcbiAgXCJsb3ZlXCIsXCJsb3ZlbHlcIixcImxvd1wiLFwibG93ZXJcIixcImx1Y2tcIixcImx1Y2t5XCIsXCJsdW5jaFwiLFwibHVuZ3NcIixcbiAgXCJseWluZ1wiLFwibWFjaGluZVwiLFwibWFjaGluZXJ5XCIsXCJtYWRcIixcIm1hZGVcIixcIm1hZ2ljXCIsXCJtYWduZXRcIixcIm1haWxcIixcbiAgXCJtYWluXCIsXCJtYWlubHlcIixcIm1ham9yXCIsXCJtYWtlXCIsXCJtYWtpbmdcIixcIm1hblwiLFwibWFuYWdlZFwiLFwibWFubmVyXCIsXG4gIFwibWFudWZhY3R1cmluZ1wiLFwibWFueVwiLFwibWFwXCIsXCJtYXJrXCIsXCJtYXJrZXRcIixcIm1hcnJpZWRcIixcIm1hc3NcIixcIm1hc3NhZ2VcIixcbiAgXCJtYXN0ZXJcIixcIm1hdGVyaWFsXCIsXCJtYXRoZW1hdGljc1wiLFwibWF0dGVyXCIsXCJtYXlcIixcIm1heWJlXCIsXCJtZVwiLFwibWVhbFwiLFxuICBcIm1lYW5cIixcIm1lYW5zXCIsXCJtZWFudFwiLFwibWVhc3VyZVwiLFwibWVhdFwiLFwibWVkaWNpbmVcIixcIm1lZXRcIixcIm1lbHRlZFwiLFxuICBcIm1lbWJlclwiLFwibWVtb3J5XCIsXCJtZW5cIixcIm1lbnRhbFwiLFwibWVyZWx5XCIsXCJtZXRcIixcIm1ldGFsXCIsXCJtZXRob2RcIixcbiAgXCJtaWNlXCIsXCJtaWRkbGVcIixcIm1pZ2h0XCIsXCJtaWdodHlcIixcIm1pbGVcIixcIm1pbGl0YXJ5XCIsXCJtaWxrXCIsXCJtaWxsXCIsXG4gIFwibWluZFwiLFwibWluZVwiLFwibWluZXJhbHNcIixcIm1pbnV0ZVwiLFwibWlycm9yXCIsXCJtaXNzaW5nXCIsXCJtaXNzaW9uXCIsXCJtaXN0YWtlXCIsXG4gIFwibWl4XCIsXCJtaXh0dXJlXCIsXCJtb2RlbFwiLFwibW9kZXJuXCIsXCJtb2xlY3VsYXJcIixcIm1vbWVudFwiLFwibW9uZXlcIixcIm1vbmtleVwiLFxuICBcIm1vbnRoXCIsXCJtb29kXCIsXCJtb29uXCIsXCJtb3JlXCIsXCJtb3JuaW5nXCIsXCJtb3N0XCIsXCJtb3N0bHlcIixcIm1vdGhlclwiLFxuICBcIm1vdGlvblwiLFwibW90b3JcIixcIm1vdW50YWluXCIsXCJtb3VzZVwiLFwibW91dGhcIixcIm1vdmVcIixcIm1vdmVtZW50XCIsXCJtb3ZpZVwiLFxuICBcIm1vdmluZ1wiLFwibXVkXCIsXCJtdXNjbGVcIixcIm11c2ljXCIsXCJtdXNpY2FsXCIsXCJtdXN0XCIsXCJteVwiLFwibXlzZWxmXCIsXG4gIFwibXlzdGVyaW91c1wiLFwibmFpbHNcIixcIm5hbWVcIixcIm5hdGlvblwiLFwibmF0aW9uYWxcIixcIm5hdGl2ZVwiLFwibmF0dXJhbFwiLFwibmF0dXJhbGx5XCIsXG4gIFwibmF0dXJlXCIsXCJuZWFyXCIsXCJuZWFyYnlcIixcIm5lYXJlclwiLFwibmVhcmVzdFwiLFwibmVhcmx5XCIsXCJuZWNlc3NhcnlcIixcIm5lY2tcIixcbiAgXCJuZWVkZWRcIixcIm5lZWRsZVwiLFwibmVlZHNcIixcIm5lZ2F0aXZlXCIsXCJuZWlnaGJvclwiLFwibmVpZ2hib3Job29kXCIsXCJuZXJ2b3VzXCIsXCJuZXN0XCIsXG4gIFwibmV2ZXJcIixcIm5ld1wiLFwibmV3c1wiLFwibmV3c3BhcGVyXCIsXCJuZXh0XCIsXCJuaWNlXCIsXCJuaWdodFwiLFwibmluZVwiLFxuICBcIm5vXCIsXCJub2JvZHlcIixcIm5vZGRlZFwiLFwibm9pc2VcIixcIm5vbmVcIixcIm5vb25cIixcIm5vclwiLFwibm9ydGhcIixcbiAgXCJub3NlXCIsXCJub3RcIixcIm5vdGVcIixcIm5vdGVkXCIsXCJub3RoaW5nXCIsXCJub3RpY2VcIixcIm5vdW5cIixcIm5vd1wiLFxuICBcIm51bWJlclwiLFwibnVtZXJhbFwiLFwibnV0c1wiLFwib2JqZWN0XCIsXCJvYnNlcnZlXCIsXCJvYnRhaW5cIixcIm9jY2FzaW9uYWxseVwiLFwib2NjdXJcIixcbiAgXCJvY2VhblwiLFwib2ZcIixcIm9mZlwiLFwib2ZmZXJcIixcIm9mZmljZVwiLFwib2ZmaWNlclwiLFwib2ZmaWNpYWxcIixcIm9pbFwiLFxuICBcIm9sZFwiLFwib2xkZXJcIixcIm9sZGVzdFwiLFwib25cIixcIm9uY2VcIixcIm9uZVwiLFwib25seVwiLFwib250b1wiLFxuICBcIm9wZW5cIixcIm9wZXJhdGlvblwiLFwib3BpbmlvblwiLFwib3Bwb3J0dW5pdHlcIixcIm9wcG9zaXRlXCIsXCJvclwiLFwib3JhbmdlXCIsXCJvcmJpdFwiLFxuICBcIm9yZGVyXCIsXCJvcmRpbmFyeVwiLFwib3JnYW5pemF0aW9uXCIsXCJvcmdhbml6ZWRcIixcIm9yaWdpblwiLFwib3JpZ2luYWxcIixcIm90aGVyXCIsXCJvdWdodFwiLFxuICBcIm91clwiLFwib3Vyc2VsdmVzXCIsXCJvdXRcIixcIm91dGVyXCIsXCJvdXRsaW5lXCIsXCJvdXRzaWRlXCIsXCJvdmVyXCIsXCJvd25cIixcbiAgXCJvd25lclwiLFwib3h5Z2VuXCIsXCJwYWNrXCIsXCJwYWNrYWdlXCIsXCJwYWdlXCIsXCJwYWlkXCIsXCJwYWluXCIsXCJwYWludFwiLFxuICBcInBhaXJcIixcInBhbGFjZVwiLFwicGFsZVwiLFwicGFuXCIsXCJwYXBlclwiLFwicGFyYWdyYXBoXCIsXCJwYXJhbGxlbFwiLFwicGFyZW50XCIsXG4gIFwicGFya1wiLFwicGFydFwiLFwicGFydGljbGVzXCIsXCJwYXJ0aWN1bGFyXCIsXCJwYXJ0aWN1bGFybHlcIixcInBhcnRseVwiLFwicGFydHNcIixcInBhcnR5XCIsXG4gIFwicGFzc1wiLFwicGFzc2FnZVwiLFwicGFzdFwiLFwicGF0aFwiLFwicGF0dGVyblwiLFwicGF5XCIsXCJwZWFjZVwiLFwicGVuXCIsXG4gIFwicGVuY2lsXCIsXCJwZW9wbGVcIixcInBlclwiLFwicGVyY2VudFwiLFwicGVyZmVjdFwiLFwicGVyZmVjdGx5XCIsXCJwZXJoYXBzXCIsXCJwZXJpb2RcIixcbiAgXCJwZXJzb25cIixcInBlcnNvbmFsXCIsXCJwZXRcIixcInBocmFzZVwiLFwicGh5c2ljYWxcIixcInBpYW5vXCIsXCJwaWNrXCIsXCJwaWN0dXJlXCIsXG4gIFwicGljdHVyZWRcIixcInBpZVwiLFwicGllY2VcIixcInBpZ1wiLFwicGlsZVwiLFwicGlsb3RcIixcInBpbmVcIixcInBpbmtcIixcbiAgXCJwaXBlXCIsXCJwaXRjaFwiLFwicGxhY2VcIixcInBsYWluXCIsXCJwbGFuXCIsXCJwbGFuZVwiLFwicGxhbmV0XCIsXCJwbGFubmVkXCIsXG4gIFwicGxhbm5pbmdcIixcInBsYW50XCIsXCJwbGFzdGljXCIsXCJwbGF0ZVwiLFwicGxhdGVzXCIsXCJwbGF5XCIsXCJwbGVhc2FudFwiLFwicGxlYXNlXCIsXG4gIFwicGxlYXN1cmVcIixcInBsZW50eVwiLFwicGx1cmFsXCIsXCJwbHVzXCIsXCJwb2NrZXRcIixcInBvZW1cIixcInBvZXRcIixcInBvZXRyeVwiLFxuICBcInBvaW50XCIsXCJwb2xlXCIsXCJwb2xpY2VcIixcInBvbGljZW1hblwiLFwicG9saXRpY2FsXCIsXCJwb25kXCIsXCJwb255XCIsXCJwb29sXCIsXG4gIFwicG9vclwiLFwicG9wdWxhclwiLFwicG9wdWxhdGlvblwiLFwicG9yY2hcIixcInBvcnRcIixcInBvc2l0aW9uXCIsXCJwb3NpdGl2ZVwiLFwicG9zc2libGVcIixcbiAgXCJwb3NzaWJseVwiLFwicG9zdFwiLFwicG90XCIsXCJwb3RhdG9lc1wiLFwicG91bmRcIixcInBvdXJcIixcInBvd2RlclwiLFwicG93ZXJcIixcbiAgXCJwb3dlcmZ1bFwiLFwicHJhY3RpY2FsXCIsXCJwcmFjdGljZVwiLFwicHJlcGFyZVwiLFwicHJlc2VudFwiLFwicHJlc2lkZW50XCIsXCJwcmVzc1wiLFwicHJlc3N1cmVcIixcbiAgXCJwcmV0dHlcIixcInByZXZlbnRcIixcInByZXZpb3VzXCIsXCJwcmljZVwiLFwicHJpZGVcIixcInByaW1pdGl2ZVwiLFwicHJpbmNpcGFsXCIsXCJwcmluY2lwbGVcIixcbiAgXCJwcmludGVkXCIsXCJwcml2YXRlXCIsXCJwcml6ZVwiLFwicHJvYmFibHlcIixcInByb2JsZW1cIixcInByb2Nlc3NcIixcInByb2R1Y2VcIixcInByb2R1Y3RcIixcbiAgXCJwcm9kdWN0aW9uXCIsXCJwcm9ncmFtXCIsXCJwcm9ncmVzc1wiLFwicHJvbWlzZWRcIixcInByb3BlclwiLFwicHJvcGVybHlcIixcInByb3BlcnR5XCIsXCJwcm90ZWN0aW9uXCIsXG4gIFwicHJvdWRcIixcInByb3ZlXCIsXCJwcm92aWRlXCIsXCJwdWJsaWNcIixcInB1bGxcIixcInB1cGlsXCIsXCJwdXJlXCIsXCJwdXJwbGVcIixcbiAgXCJwdXJwb3NlXCIsXCJwdXNoXCIsXCJwdXRcIixcInB1dHRpbmdcIixcInF1YXJ0ZXJcIixcInF1ZWVuXCIsXCJxdWVzdGlvblwiLFwicXVpY2tcIixcbiAgXCJxdWlja2x5XCIsXCJxdWlldFwiLFwicXVpZXRseVwiLFwicXVpdGVcIixcInJhYmJpdFwiLFwicmFjZVwiLFwicmFkaW9cIixcInJhaWxyb2FkXCIsXG4gIFwicmFpblwiLFwicmFpc2VcIixcInJhblwiLFwicmFuY2hcIixcInJhbmdlXCIsXCJyYXBpZGx5XCIsXCJyYXRlXCIsXCJyYXRoZXJcIixcbiAgXCJyYXdcIixcInJheXNcIixcInJlYWNoXCIsXCJyZWFkXCIsXCJyZWFkZXJcIixcInJlYWR5XCIsXCJyZWFsXCIsXCJyZWFsaXplXCIsXG4gIFwicmVhclwiLFwicmVhc29uXCIsXCJyZWNhbGxcIixcInJlY2VpdmVcIixcInJlY2VudFwiLFwicmVjZW50bHlcIixcInJlY29nbml6ZVwiLFwicmVjb3JkXCIsXG4gIFwicmVkXCIsXCJyZWZlclwiLFwicmVmdXNlZFwiLFwicmVnaW9uXCIsXCJyZWd1bGFyXCIsXCJyZWxhdGVkXCIsXCJyZWxhdGlvbnNoaXBcIixcInJlbGlnaW91c1wiLFxuICBcInJlbWFpblwiLFwicmVtYXJrYWJsZVwiLFwicmVtZW1iZXJcIixcInJlbW92ZVwiLFwicmVwZWF0XCIsXCJyZXBsYWNlXCIsXCJyZXBsaWVkXCIsXCJyZXBvcnRcIixcbiAgXCJyZXByZXNlbnRcIixcInJlcXVpcmVcIixcInJlc2VhcmNoXCIsXCJyZXNwZWN0XCIsXCJyZXN0XCIsXCJyZXN1bHRcIixcInJldHVyblwiLFwicmV2aWV3XCIsXG4gIFwicmh5bWVcIixcInJoeXRobVwiLFwicmljZVwiLFwicmljaFwiLFwicmlkZVwiLFwicmlkaW5nXCIsXCJyaWdodFwiLFwicmluZ1wiLFxuICBcInJpc2VcIixcInJpc2luZ1wiLFwicml2ZXJcIixcInJvYWRcIixcInJvYXJcIixcInJvY2tcIixcInJvY2tldFwiLFwicm9ja3lcIixcbiAgXCJyb2RcIixcInJvbGxcIixcInJvb2ZcIixcInJvb21cIixcInJvb3RcIixcInJvcGVcIixcInJvc2VcIixcInJvdWdoXCIsXG4gIFwicm91bmRcIixcInJvdXRlXCIsXCJyb3dcIixcInJ1YmJlZFwiLFwicnViYmVyXCIsXCJydWxlXCIsXCJydWxlclwiLFwicnVuXCIsXG4gIFwicnVubmluZ1wiLFwicnVzaFwiLFwic2FkXCIsXCJzYWRkbGVcIixcInNhZmVcIixcInNhZmV0eVwiLFwic2FpZFwiLFwic2FpbFwiLFxuICBcInNhbGVcIixcInNhbG1vblwiLFwic2FsdFwiLFwic2FtZVwiLFwic2FuZFwiLFwic2FuZ1wiLFwic2F0XCIsXCJzYXRlbGxpdGVzXCIsXG4gIFwic2F0aXNmaWVkXCIsXCJzYXZlXCIsXCJzYXZlZFwiLFwic2F3XCIsXCJzYXlcIixcInNjYWxlXCIsXCJzY2FyZWRcIixcInNjZW5lXCIsXG4gIFwic2Nob29sXCIsXCJzY2llbmNlXCIsXCJzY2llbnRpZmljXCIsXCJzY2llbnRpc3RcIixcInNjb3JlXCIsXCJzY3JlZW5cIixcInNlYVwiLFwic2VhcmNoXCIsXG4gIFwic2Vhc29uXCIsXCJzZWF0XCIsXCJzZWNvbmRcIixcInNlY3JldFwiLFwic2VjdGlvblwiLFwic2VlXCIsXCJzZWVkXCIsXCJzZWVpbmdcIixcbiAgXCJzZWVtc1wiLFwic2VlblwiLFwic2VsZG9tXCIsXCJzZWxlY3RcIixcInNlbGVjdGlvblwiLFwic2VsbFwiLFwic2VuZFwiLFwic2Vuc2VcIixcbiAgXCJzZW50XCIsXCJzZW50ZW5jZVwiLFwic2VwYXJhdGVcIixcInNlcmllc1wiLFwic2VyaW91c1wiLFwic2VydmVcIixcInNlcnZpY2VcIixcInNldHNcIixcbiAgXCJzZXR0aW5nXCIsXCJzZXR0bGVcIixcInNldHRsZXJzXCIsXCJzZXZlblwiLFwic2V2ZXJhbFwiLFwic2hhZGVcIixcInNoYWRvd1wiLFwic2hha2VcIixcbiAgXCJzaGFraW5nXCIsXCJzaGFsbFwiLFwic2hhbGxvd1wiLFwic2hhcGVcIixcInNoYXJlXCIsXCJzaGFycFwiLFwic2hlXCIsXCJzaGVlcFwiLFxuICBcInNoZWV0XCIsXCJzaGVsZlwiLFwic2hlbGxzXCIsXCJzaGVsdGVyXCIsXCJzaGluZVwiLFwic2hpbm5pbmdcIixcInNoaXBcIixcInNoaXJ0XCIsXG4gIFwic2hvZVwiLFwic2hvb3RcIixcInNob3BcIixcInNob3JlXCIsXCJzaG9ydFwiLFwic2hvcnRlclwiLFwic2hvdFwiLFwic2hvdWxkXCIsXG4gIFwic2hvdWxkZXJcIixcInNob3V0XCIsXCJzaG93XCIsXCJzaG93blwiLFwic2h1dFwiLFwic2lja1wiLFwic2lkZXNcIixcInNpZ2h0XCIsXG4gIFwic2lnblwiLFwic2lnbmFsXCIsXCJzaWxlbmNlXCIsXCJzaWxlbnRcIixcInNpbGtcIixcInNpbGx5XCIsXCJzaWx2ZXJcIixcInNpbWlsYXJcIixcbiAgXCJzaW1wbGVcIixcInNpbXBsZXN0XCIsXCJzaW1wbHlcIixcInNpbmNlXCIsXCJzaW5nXCIsXCJzaW5nbGVcIixcInNpbmtcIixcInNpc3RlclwiLFxuICBcInNpdFwiLFwic2l0dGluZ1wiLFwic2l0dWF0aW9uXCIsXCJzaXhcIixcInNpemVcIixcInNraWxsXCIsXCJza2luXCIsXCJza3lcIixcbiAgXCJzbGFic1wiLFwic2xhdmVcIixcInNsZWVwXCIsXCJzbGVwdFwiLFwic2xpZGVcIixcInNsaWdodFwiLFwic2xpZ2h0bHlcIixcInNsaXBcIixcbiAgXCJzbGlwcGVkXCIsXCJzbG9wZVwiLFwic2xvd1wiLFwic2xvd2x5XCIsXCJzbWFsbFwiLFwic21hbGxlclwiLFwic21hbGxlc3RcIixcInNtZWxsXCIsXG4gIFwic21pbGVcIixcInNtb2tlXCIsXCJzbW9vdGhcIixcInNuYWtlXCIsXCJzbm93XCIsXCJzb1wiLFwic29hcFwiLFwic29jaWFsXCIsXG4gIFwic29jaWV0eVwiLFwic29mdFwiLFwic29mdGx5XCIsXCJzb2lsXCIsXCJzb2xhclwiLFwic29sZFwiLFwic29sZGllclwiLFwic29saWRcIixcbiAgXCJzb2x1dGlvblwiLFwic29sdmVcIixcInNvbWVcIixcInNvbWVib2R5XCIsXCJzb21laG93XCIsXCJzb21lb25lXCIsXCJzb21ldGhpbmdcIixcInNvbWV0aW1lXCIsXG4gIFwic29tZXdoZXJlXCIsXCJzb25cIixcInNvbmdcIixcInNvb25cIixcInNvcnRcIixcInNvdW5kXCIsXCJzb3VyY2VcIixcInNvdXRoXCIsXG4gIFwic291dGhlcm5cIixcInNwYWNlXCIsXCJzcGVha1wiLFwic3BlY2lhbFwiLFwic3BlY2llc1wiLFwic3BlY2lmaWNcIixcInNwZWVjaFwiLFwic3BlZWRcIixcbiAgXCJzcGVsbFwiLFwic3BlbmRcIixcInNwZW50XCIsXCJzcGlkZXJcIixcInNwaW5cIixcInNwaXJpdFwiLFwic3BpdGVcIixcInNwbGl0XCIsXG4gIFwic3Bva2VuXCIsXCJzcG9ydFwiLFwic3ByZWFkXCIsXCJzcHJpbmdcIixcInNxdWFyZVwiLFwic3RhZ2VcIixcInN0YWlyc1wiLFwic3RhbmRcIixcbiAgXCJzdGFuZGFyZFwiLFwic3RhclwiLFwic3RhcmVkXCIsXCJzdGFydFwiLFwic3RhdGVcIixcInN0YXRlbWVudFwiLFwic3RhdGlvblwiLFwic3RheVwiLFxuICBcInN0ZWFkeVwiLFwic3RlYW1cIixcInN0ZWVsXCIsXCJzdGVlcFwiLFwic3RlbXNcIixcInN0ZXBcIixcInN0ZXBwZWRcIixcInN0aWNrXCIsXG4gIFwic3RpZmZcIixcInN0aWxsXCIsXCJzdG9ja1wiLFwic3RvbWFjaFwiLFwic3RvbmVcIixcInN0b29kXCIsXCJzdG9wXCIsXCJzdG9wcGVkXCIsXG4gIFwic3RvcmVcIixcInN0b3JtXCIsXCJzdG9yeVwiLFwic3RvdmVcIixcInN0cmFpZ2h0XCIsXCJzdHJhbmdlXCIsXCJzdHJhbmdlclwiLFwic3RyYXdcIixcbiAgXCJzdHJlYW1cIixcInN0cmVldFwiLFwic3RyZW5ndGhcIixcInN0cmV0Y2hcIixcInN0cmlrZVwiLFwic3RyaW5nXCIsXCJzdHJpcFwiLFwic3Ryb25nXCIsXG4gIFwic3Ryb25nZXJcIixcInN0cnVja1wiLFwic3RydWN0dXJlXCIsXCJzdHJ1Z2dsZVwiLFwic3R1Y2tcIixcInN0dWRlbnRcIixcInN0dWRpZWRcIixcInN0dWR5aW5nXCIsXG4gIFwic3ViamVjdFwiLFwic3Vic3RhbmNlXCIsXCJzdWNjZXNzXCIsXCJzdWNjZXNzZnVsXCIsXCJzdWNoXCIsXCJzdWRkZW5cIixcInN1ZGRlbmx5XCIsXCJzdWdhclwiLFxuICBcInN1Z2dlc3RcIixcInN1aXRcIixcInN1bVwiLFwic3VtbWVyXCIsXCJzdW5cIixcInN1bmxpZ2h0XCIsXCJzdXBwZXJcIixcInN1cHBseVwiLFxuICBcInN1cHBvcnRcIixcInN1cHBvc2VcIixcInN1cmVcIixcInN1cmZhY2VcIixcInN1cnByaXNlXCIsXCJzdXJyb3VuZGVkXCIsXCJzd2FtXCIsXCJzd2VldFwiLFxuICBcInN3ZXB0XCIsXCJzd2ltXCIsXCJzd2ltbWluZ1wiLFwic3dpbmdcIixcInN3dW5nXCIsXCJzeWxsYWJsZVwiLFwic3ltYm9sXCIsXCJzeXN0ZW1cIixcbiAgXCJ0YWJsZVwiLFwidGFpbFwiLFwidGFrZVwiLFwidGFrZW5cIixcInRhbGVzXCIsXCJ0YWxrXCIsXCJ0YWxsXCIsXCJ0YW5rXCIsXG4gIFwidGFwZVwiLFwidGFza1wiLFwidGFzdGVcIixcInRhdWdodFwiLFwidGF4XCIsXCJ0ZWFcIixcInRlYWNoXCIsXCJ0ZWFjaGVyXCIsXG4gIFwidGVhbVwiLFwidGVhcnNcIixcInRlZXRoXCIsXCJ0ZWxlcGhvbmVcIixcInRlbGV2aXNpb25cIixcInRlbGxcIixcInRlbXBlcmF0dXJlXCIsXCJ0ZW5cIixcbiAgXCJ0ZW50XCIsXCJ0ZXJtXCIsXCJ0ZXJyaWJsZVwiLFwidGVzdFwiLFwidGhhblwiLFwidGhhbmtcIixcInRoYXRcIixcInRoZWVcIixcbiAgXCJ0aGVtXCIsXCJ0aGVtc2VsdmVzXCIsXCJ0aGVuXCIsXCJ0aGVvcnlcIixcInRoZXJlXCIsXCJ0aGVyZWZvcmVcIixcInRoZXNlXCIsXCJ0aGV5XCIsXG4gIFwidGhpY2tcIixcInRoaW5cIixcInRoaW5nXCIsXCJ0aGlua1wiLFwidGhpcmRcIixcInRoaXJ0eVwiLFwidGhpc1wiLFwidGhvc2VcIixcbiAgXCJ0aG91XCIsXCJ0aG91Z2hcIixcInRob3VnaHRcIixcInRob3VzYW5kXCIsXCJ0aHJlYWRcIixcInRocmVlXCIsXCJ0aHJld1wiLFwidGhyb2F0XCIsXG4gIFwidGhyb3VnaFwiLFwidGhyb3VnaG91dFwiLFwidGhyb3dcIixcInRocm93blwiLFwidGh1bWJcIixcInRodXNcIixcInRoeVwiLFwidGlkZVwiLFxuICBcInRpZVwiLFwidGlnaHRcIixcInRpZ2h0bHlcIixcInRpbGxcIixcInRpbWVcIixcInRpblwiLFwidGlueVwiLFwidGlwXCIsXG4gIFwidGlyZWRcIixcInRpdGxlXCIsXCJ0b1wiLFwidG9iYWNjb1wiLFwidG9kYXlcIixcInRvZ2V0aGVyXCIsXCJ0b2xkXCIsXCJ0b21vcnJvd1wiLFxuICBcInRvbmVcIixcInRvbmd1ZVwiLFwidG9uaWdodFwiLFwidG9vXCIsXCJ0b29rXCIsXCJ0b29sXCIsXCJ0b3BcIixcInRvcGljXCIsXG4gIFwidG9yblwiLFwidG90YWxcIixcInRvdWNoXCIsXCJ0b3dhcmRcIixcInRvd2VyXCIsXCJ0b3duXCIsXCJ0b3lcIixcInRyYWNlXCIsXG4gIFwidHJhY2tcIixcInRyYWRlXCIsXCJ0cmFmZmljXCIsXCJ0cmFpbFwiLFwidHJhaW5cIixcInRyYW5zcG9ydGF0aW9uXCIsXCJ0cmFwXCIsXCJ0cmF2ZWxcIixcbiAgXCJ0cmVhdGVkXCIsXCJ0cmVlXCIsXCJ0cmlhbmdsZVwiLFwidHJpYmVcIixcInRyaWNrXCIsXCJ0cmllZFwiLFwidHJpcFwiLFwidHJvb3BzXCIsXG4gIFwidHJvcGljYWxcIixcInRyb3VibGVcIixcInRydWNrXCIsXCJ0cnVua1wiLFwidHJ1dGhcIixcInRyeVwiLFwidHViZVwiLFwidHVuZVwiLFxuICBcInR1cm5cIixcInR3ZWx2ZVwiLFwidHdlbnR5XCIsXCJ0d2ljZVwiLFwidHdvXCIsXCJ0eXBlXCIsXCJ0eXBpY2FsXCIsXCJ1bmNsZVwiLFxuICBcInVuZGVyXCIsXCJ1bmRlcmxpbmVcIixcInVuZGVyc3RhbmRpbmdcIixcInVuaGFwcHlcIixcInVuaW9uXCIsXCJ1bml0XCIsXCJ1bml2ZXJzZVwiLFwidW5rbm93blwiLFxuICBcInVubGVzc1wiLFwidW50aWxcIixcInVudXN1YWxcIixcInVwXCIsXCJ1cG9uXCIsXCJ1cHBlclwiLFwidXB3YXJkXCIsXCJ1c1wiLFxuICBcInVzZVwiLFwidXNlZnVsXCIsXCJ1c2luZ1wiLFwidXN1YWxcIixcInVzdWFsbHlcIixcInZhbGxleVwiLFwidmFsdWFibGVcIixcInZhbHVlXCIsXG4gIFwidmFwb3JcIixcInZhcmlldHlcIixcInZhcmlvdXNcIixcInZhc3RcIixcInZlZ2V0YWJsZVwiLFwidmVyYlwiLFwidmVydGljYWxcIixcInZlcnlcIixcbiAgXCJ2ZXNzZWxzXCIsXCJ2aWN0b3J5XCIsXCJ2aWV3XCIsXCJ2aWxsYWdlXCIsXCJ2aXNpdFwiLFwidmlzaXRvclwiLFwidm9pY2VcIixcInZvbHVtZVwiLFxuICBcInZvdGVcIixcInZvd2VsXCIsXCJ2b3lhZ2VcIixcIndhZ29uXCIsXCJ3YWl0XCIsXCJ3YWxrXCIsXCJ3YWxsXCIsXCJ3YW50XCIsXG4gIFwid2FyXCIsXCJ3YXJtXCIsXCJ3YXJuXCIsXCJ3YXNcIixcIndhc2hcIixcIndhc3RlXCIsXCJ3YXRjaFwiLFwid2F0ZXJcIixcbiAgXCJ3YXZlXCIsXCJ3YXlcIixcIndlXCIsXCJ3ZWFrXCIsXCJ3ZWFsdGhcIixcIndlYXJcIixcIndlYXRoZXJcIixcIndlZWtcIixcbiAgXCJ3ZWlnaFwiLFwid2VpZ2h0XCIsXCJ3ZWxjb21lXCIsXCJ3ZWxsXCIsXCJ3ZW50XCIsXCJ3ZXJlXCIsXCJ3ZXN0XCIsXCJ3ZXN0ZXJuXCIsXG4gIFwid2V0XCIsXCJ3aGFsZVwiLFwid2hhdFwiLFwid2hhdGV2ZXJcIixcIndoZWF0XCIsXCJ3aGVlbFwiLFwid2hlblwiLFwid2hlbmV2ZXJcIixcbiAgXCJ3aGVyZVwiLFwid2hlcmV2ZXJcIixcIndoZXRoZXJcIixcIndoaWNoXCIsXCJ3aGlsZVwiLFwid2hpc3BlcmVkXCIsXCJ3aGlzdGxlXCIsXCJ3aGl0ZVwiLFxuICBcIndob1wiLFwid2hvbGVcIixcIndob21cIixcIndob3NlXCIsXCJ3aHlcIixcIndpZGVcIixcIndpZGVseVwiLFwid2lmZVwiLFxuICBcIndpbGRcIixcIndpbGxcIixcIndpbGxpbmdcIixcIndpblwiLFwid2luZFwiLFwid2luZG93XCIsXCJ3aW5nXCIsXCJ3aW50ZXJcIixcbiAgXCJ3aXJlXCIsXCJ3aXNlXCIsXCJ3aXNoXCIsXCJ3aXRoXCIsXCJ3aXRoaW5cIixcIndpdGhvdXRcIixcIndvbGZcIixcIndvbWVuXCIsXG4gIFwid29uXCIsXCJ3b25kZXJcIixcIndvbmRlcmZ1bFwiLFwid29vZFwiLFwid29vZGVuXCIsXCJ3b29sXCIsXCJ3b3JkXCIsXCJ3b3JlXCIsXG4gIFwid29ya1wiLFwid29ya2VyXCIsXCJ3b3JsZFwiLFwid29ycmllZFwiLFwid29ycnlcIixcIndvcnNlXCIsXCJ3b3J0aFwiLFwid291bGRcIixcbiAgXCJ3cmFwcGVkXCIsXCJ3cml0ZVwiLFwid3JpdGVyXCIsXCJ3cml0aW5nXCIsXCJ3cml0dGVuXCIsXCJ3cm9uZ1wiLFwid3JvdGVcIixcInlhcmRcIixcbiAgXCJ5ZWFyXCIsXCJ5ZWxsb3dcIixcInllc1wiLFwieWVzdGVyZGF5XCIsXCJ5ZXRcIixcInlvdVwiLFwieW91bmdcIixcInlvdW5nZXJcIixcbiAgXCJ5b3VyXCIsXCJ5b3Vyc2VsZlwiLFwieW91dGhcIixcInplcm9cIixcInplYnJhXCIsXCJ6aXBwZXJcIixcInpvb1wiLFwienVsdVwiXG5dO1xuXG5mdW5jdGlvbiB3b3JkcyhvcHRpb25zKSB7XG5cbiAgZnVuY3Rpb24gd29yZCgpIHtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLm1heExlbmd0aCA+IDEpIHtcbiAgICAgIHJldHVybiBnZW5lcmF0ZVdvcmRXaXRoTWF4TGVuZ3RoKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZW5lcmF0ZVJhbmRvbVdvcmQoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZW5lcmF0ZVdvcmRXaXRoTWF4TGVuZ3RoKCkge1xuICAgIHZhciByaWdodFNpemUgPSBmYWxzZTtcbiAgICB2YXIgd29yZFVzZWQ7XG4gICAgd2hpbGUgKCFyaWdodFNpemUpIHsgIFxuICAgICAgd29yZFVzZWQgPSBnZW5lcmF0ZVJhbmRvbVdvcmQoKTtcbiAgICAgIGlmKHdvcmRVc2VkLmxlbmd0aCA8PSBvcHRpb25zLm1heExlbmd0aCkge1xuICAgICAgICByaWdodFNpemUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgfVxuICAgIHJldHVybiB3b3JkVXNlZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdlbmVyYXRlUmFuZG9tV29yZCgpIHtcbiAgICByZXR1cm4gd29yZExpc3RbcmFuZEludCh3b3JkTGlzdC5sZW5ndGgpXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJhbmRJbnQobGVzc1RoYW4pIHtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbGVzc1RoYW4pO1xuICB9XG5cbiAgLy8gTm8gYXJndW1lbnRzID0gZ2VuZXJhdGUgb25lIHdvcmRcbiAgaWYgKHR5cGVvZihvcHRpb25zKSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gd29yZCgpO1xuICB9XG5cbiAgLy8gSnVzdCBhIG51bWJlciA9IHJldHVybiB0aGF0IG1hbnkgd29yZHNcbiAgaWYgKHR5cGVvZihvcHRpb25zKSA9PT0gJ251bWJlcicpIHtcbiAgICBvcHRpb25zID0geyBleGFjdGx5OiBvcHRpb25zIH07XG4gIH1cblxuICAvLyBvcHRpb25zIHN1cHBvcnRlZDogZXhhY3RseSwgbWluLCBtYXgsIGpvaW5cbiAgaWYgKG9wdGlvbnMuZXhhY3RseSkge1xuICAgIG9wdGlvbnMubWluID0gb3B0aW9ucy5leGFjdGx5O1xuICAgIG9wdGlvbnMubWF4ID0gb3B0aW9ucy5leGFjdGx5O1xuICB9XG4gIFxuICAvLyBub3QgYSBudW1iZXIgPSBvbmUgd29yZCBwYXIgc3RyaW5nXG4gIGlmICh0eXBlb2Yob3B0aW9ucy53b3Jkc1BlclN0cmluZykgIT09ICdudW1iZXInKSB7XG4gICAgb3B0aW9ucy53b3Jkc1BlclN0cmluZyA9IDE7XG4gIH1cblxuICAvL25vdCBhIGZ1bmN0aW9uID0gcmV0dXJucyB0aGUgcmF3IHdvcmRcbiAgaWYgKHR5cGVvZihvcHRpb25zLmZvcm1hdHRlcikgIT09ICdmdW5jdGlvbicpIHtcbiAgICBvcHRpb25zLmZvcm1hdHRlciA9ICh3b3JkKSA9PiB3b3JkO1xuICB9XG5cbiAgLy9ub3QgYSBzdHJpbmcgPSBzZXBhcmF0b3IgaXMgYSBzcGFjZVxuICBpZiAodHlwZW9mKG9wdGlvbnMuc2VwYXJhdG9yKSAhPT0gJ3N0cmluZycpIHtcbiAgICBvcHRpb25zLnNlcGFyYXRvciA9ICcgJztcbiAgfVxuXG4gIHZhciB0b3RhbCA9IG9wdGlvbnMubWluICsgcmFuZEludChvcHRpb25zLm1heCArIDEgLSBvcHRpb25zLm1pbik7XG4gIHZhciByZXN1bHRzID0gW107XG4gIHZhciB0b2tlbiA9ICcnO1xuICB2YXIgcmVsYXRpdmVJbmRleCA9IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IChpIDwgdG90YWwgKiBvcHRpb25zLndvcmRzUGVyU3RyaW5nKTsgaSsrKSB7XG4gICAgaWYgKHJlbGF0aXZlSW5kZXggPT09IG9wdGlvbnMud29yZHNQZXJTdHJpbmcgLSAxKSB7XG4gICAgICB0b2tlbiArPSBvcHRpb25zLmZvcm1hdHRlcih3b3JkKCksIHJlbGF0aXZlSW5kZXgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRva2VuICs9IG9wdGlvbnMuZm9ybWF0dGVyKHdvcmQoKSwgcmVsYXRpdmVJbmRleCkgKyBvcHRpb25zLnNlcGFyYXRvcjtcbiAgICB9XG4gICAgcmVsYXRpdmVJbmRleCsrO1xuICAgIGlmICgoaSArIDEpICUgb3B0aW9ucy53b3Jkc1BlclN0cmluZyA9PT0gMCkge1xuICAgICAgcmVzdWx0cy5wdXNoKHRva2VuKTtcbiAgICAgIHRva2VuID0gJyc7IFxuICAgICAgcmVsYXRpdmVJbmRleCA9IDA7XG4gICAgfVxuICAgXG4gIH1cbiAgaWYgKHR5cGVvZiBvcHRpb25zLmpvaW4gPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0cyA9IHJlc3VsdHMuam9pbihvcHRpb25zLmpvaW4pO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbnZhciByYW5kb21Xb3JkcyQxID0gd29yZHM7XG4vLyBFeHBvcnQgdGhlIHdvcmQgbGlzdCBhcyBpdCBpcyBvZnRlbiB1c2VmdWxcbndvcmRzLndvcmRMaXN0ID0gd29yZExpc3Q7XG5cbnZhciBhbGVhID0ge2V4cG9ydHM6IHt9fTtcblxuKGZ1bmN0aW9uIChtb2R1bGUpIHtcbi8vIEEgcG9ydCBvZiBhbiBhbGdvcml0aG0gYnkgSm9oYW5uZXMgQmFhZ8O4ZSA8YmFhZ29lQGJhYWdvZS5jb20+LCAyMDEwXG4vLyBodHRwOi8vYmFhZ29lLmNvbS9lbi9SYW5kb21NdXNpbmdzL2phdmFzY3JpcHQvXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbnF1aW5sYW4vYmV0dGVyLXJhbmRvbS1udW1iZXJzLWZvci1qYXZhc2NyaXB0LW1pcnJvclxuLy8gT3JpZ2luYWwgd29yayBpcyB1bmRlciBNSVQgbGljZW5zZSAtXG5cbi8vIENvcHlyaWdodCAoQykgMjAxMCBieSBKb2hhbm5lcyBCYWFnw7hlIDxiYWFnb2VAYmFhZ29lLm9yZz5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5cblxuKGZ1bmN0aW9uKGdsb2JhbCwgbW9kdWxlLCBkZWZpbmUpIHtcblxuZnVuY3Rpb24gQWxlYShzZWVkKSB7XG4gIHZhciBtZSA9IHRoaXMsIG1hc2ggPSBNYXNoKCk7XG5cbiAgbWUubmV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0ID0gMjA5MTYzOSAqIG1lLnMwICsgbWUuYyAqIDIuMzI4MzA2NDM2NTM4Njk2M2UtMTA7IC8vIDJeLTMyXG4gICAgbWUuczAgPSBtZS5zMTtcbiAgICBtZS5zMSA9IG1lLnMyO1xuICAgIHJldHVybiBtZS5zMiA9IHQgLSAobWUuYyA9IHQgfCAwKTtcbiAgfTtcblxuICAvLyBBcHBseSB0aGUgc2VlZGluZyBhbGdvcml0aG0gZnJvbSBCYWFnb2UuXG4gIG1lLmMgPSAxO1xuICBtZS5zMCA9IG1hc2goJyAnKTtcbiAgbWUuczEgPSBtYXNoKCcgJyk7XG4gIG1lLnMyID0gbWFzaCgnICcpO1xuICBtZS5zMCAtPSBtYXNoKHNlZWQpO1xuICBpZiAobWUuczAgPCAwKSB7IG1lLnMwICs9IDE7IH1cbiAgbWUuczEgLT0gbWFzaChzZWVkKTtcbiAgaWYgKG1lLnMxIDwgMCkgeyBtZS5zMSArPSAxOyB9XG4gIG1lLnMyIC09IG1hc2goc2VlZCk7XG4gIGlmIChtZS5zMiA8IDApIHsgbWUuczIgKz0gMTsgfVxuICBtYXNoID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gY29weShmLCB0KSB7XG4gIHQuYyA9IGYuYztcbiAgdC5zMCA9IGYuczA7XG4gIHQuczEgPSBmLnMxO1xuICB0LnMyID0gZi5zMjtcbiAgcmV0dXJuIHQ7XG59XG5cbmZ1bmN0aW9uIGltcGwoc2VlZCwgb3B0cykge1xuICB2YXIgeGcgPSBuZXcgQWxlYShzZWVkKSxcbiAgICAgIHN0YXRlID0gb3B0cyAmJiBvcHRzLnN0YXRlLFxuICAgICAgcHJuZyA9IHhnLm5leHQ7XG4gIHBybmcuaW50MzIgPSBmdW5jdGlvbigpIHsgcmV0dXJuICh4Zy5uZXh0KCkgKiAweDEwMDAwMDAwMCkgfCAwOyB9O1xuICBwcm5nLmRvdWJsZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBwcm5nKCkgKyAocHJuZygpICogMHgyMDAwMDAgfCAwKSAqIDEuMTEwMjIzMDI0NjI1MTU2NWUtMTY7IC8vIDJeLTUzXG4gIH07XG4gIHBybmcucXVpY2sgPSBwcm5nO1xuICBpZiAoc3RhdGUpIHtcbiAgICBpZiAodHlwZW9mKHN0YXRlKSA9PSAnb2JqZWN0JykgY29weShzdGF0ZSwgeGcpO1xuICAgIHBybmcuc3RhdGUgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGNvcHkoeGcsIHt9KTsgfTtcbiAgfVxuICByZXR1cm4gcHJuZztcbn1cblxuZnVuY3Rpb24gTWFzaCgpIHtcbiAgdmFyIG4gPSAweGVmYzgyNDlkO1xuXG4gIHZhciBtYXNoID0gZnVuY3Rpb24oZGF0YSkge1xuICAgIGRhdGEgPSBTdHJpbmcoZGF0YSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBuICs9IGRhdGEuY2hhckNvZGVBdChpKTtcbiAgICAgIHZhciBoID0gMC4wMjUxOTYwMzI4MjQxNjkzOCAqIG47XG4gICAgICBuID0gaCA+Pj4gMDtcbiAgICAgIGggLT0gbjtcbiAgICAgIGggKj0gbjtcbiAgICAgIG4gPSBoID4+PiAwO1xuICAgICAgaCAtPSBuO1xuICAgICAgbiArPSBoICogMHgxMDAwMDAwMDA7IC8vIDJeMzJcbiAgICB9XG4gICAgcmV0dXJuIChuID4+PiAwKSAqIDIuMzI4MzA2NDM2NTM4Njk2M2UtMTA7IC8vIDJeLTMyXG4gIH07XG5cbiAgcmV0dXJuIG1hc2g7XG59XG5cblxuaWYgKG1vZHVsZSAmJiBtb2R1bGUuZXhwb3J0cykge1xuICBtb2R1bGUuZXhwb3J0cyA9IGltcGw7XG59IGVsc2UgaWYgKGRlZmluZSAmJiBkZWZpbmUuYW1kKSB7XG4gIGRlZmluZShmdW5jdGlvbigpIHsgcmV0dXJuIGltcGw7IH0pO1xufSBlbHNlIHtcbiAgdGhpcy5hbGVhID0gaW1wbDtcbn1cblxufSkoXG4gIGNvbW1vbmpzR2xvYmFsLFxuICBtb2R1bGUsICAgIC8vIHByZXNlbnQgaW4gbm9kZS5qc1xuICAodHlwZW9mIHVuZGVmaW5lZCkgPT0gJ2Z1bmN0aW9uJyAgICAvLyBwcmVzZW50IHdpdGggYW4gQU1EIGxvYWRlclxuKTtcbn0oYWxlYSkpO1xuXG52YXIgc2VlZHJhbmRvbSA9IGFsZWEuZXhwb3J0cztcblxuLyoqXHJcbiAqIFVzZXMgdGhlIGBzZWVkcmFuZG9tYCBwYWNrYWdlIHRvIHJlcGxhY2UgTWF0aC5yYW5kb20oKSB3aXRoIGEgc2VlZGFibGUgUFJORy5cclxuICpcclxuICogQHBhcmFtIHNlZWQgQW4gb3B0aW9uYWwgc2VlZC4gSWYgbm9uZSBpcyBnaXZlbiwgYSByYW5kb20gc2VlZCB3aWxsIGJlIGdlbmVyYXRlZC5cclxuICogQHJldHVybnMgVGhlIHNlZWQgdmFsdWUuXHJcbiAqL1xyXG5mdW5jdGlvbiBzZXRTZWVkKHNlZWQgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCkpIHtcclxuICAgIE1hdGgucmFuZG9tID0gc2VlZHJhbmRvbShzZWVkKTtcclxuICAgIHJldHVybiBzZWVkO1xyXG59XHJcbmZ1bmN0aW9uIHJlcGVhdChhcnJheSwgcmVwZXRpdGlvbnMsIHVucGFjayA9IGZhbHNlKSB7XHJcbiAgICBjb25zdCBhcnJfaXNBcnJheSA9IEFycmF5LmlzQXJyYXkoYXJyYXkpO1xyXG4gICAgY29uc3QgcmVwX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5KHJlcGV0aXRpb25zKTtcclxuICAgIC8vIGlmIGFycmF5IGlzIG5vdCBhbiBhcnJheSwgdGhlbiB3ZSBqdXN0IHJlcGVhdCB0aGUgaXRlbVxyXG4gICAgaWYgKCFhcnJfaXNBcnJheSkge1xyXG4gICAgICAgIGlmICghcmVwX2lzQXJyYXkpIHtcclxuICAgICAgICAgICAgYXJyYXkgPSBbYXJyYXldO1xyXG4gICAgICAgICAgICByZXBldGl0aW9ucyA9IFtyZXBldGl0aW9uc107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXBldGl0aW9ucyA9IFtyZXBldGl0aW9uc1swXV07XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVW5jbGVhciBwYXJhbWV0ZXJzIGdpdmVuIHRvIHJhbmRvbWl6YXRpb24ucmVwZWF0LiBNdWx0aXBsZSBzZXQgc2l6ZXMgc3BlY2lmaWVkLCBidXQgb25seSBvbmUgaXRlbSBleGlzdHMgdG8gc2FtcGxlLiBQcm9jZWVkaW5nIHVzaW5nIHRoZSBmaXJzdCBzZXQgc2l6ZS5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgLy8gaWYgcmVwZXRpdGlvbnMgaXMgbm90IGFuIGFycmF5LCBidXQgYXJyYXkgaXMsIHRoZW4gd2VcclxuICAgICAgICAvLyByZXBlYXQgcmVwZXRpdGlvbnMgZm9yIGVhY2ggZW50cnkgaW4gYXJyYXlcclxuICAgICAgICBpZiAoIXJlcF9pc0FycmF5KSB7XHJcbiAgICAgICAgICAgIGxldCByZXBzID0gW107XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHJlcHMucHVzaChyZXBldGl0aW9ucyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVwZXRpdGlvbnMgPSByZXBzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCAhPSByZXBldGl0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlVuY2xlYXIgcGFyYW1ldGVycyBnaXZlbiB0byByYW5kb21pemF0aW9uLnJlcGVhdC4gSXRlbXMgYW5kIHJlcGV0aXRpb25zIGFyZSB1bmVxdWFsIGxlbmd0aHMuIEJlaGF2aW9yIG1heSBub3QgYmUgYXMgZXhwZWN0ZWQuXCIpO1xyXG4gICAgICAgICAgICAgICAgLy8gdGhyb3cgd2FybmluZyBpZiByZXBldGl0aW9ucyBpcyB0b28gc2hvcnQsIHVzZSBmaXJzdCByZXAgT05MWS5cclxuICAgICAgICAgICAgICAgIGlmIChyZXBldGl0aW9ucy5sZW5ndGggPCBhcnJheS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVwcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwcy5wdXNoKHJlcGV0aXRpb25zKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmVwZXRpdGlvbnMgPSByZXBzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3cgd2FybmluZyBpZiB0b28gbG9uZywgYW5kIHRoZW4gdXNlIHRoZSBmaXJzdCBOXHJcbiAgICAgICAgICAgICAgICAgICAgcmVwZXRpdGlvbnMgPSByZXBldGl0aW9ucy5zbGljZSgwLCBhcnJheS5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gc2hvdWxkIGJlIGNsZWFyIGF0IHRoaXMgcG9pbnQgdG8gYXNzdW1lIHRoYXQgYXJyYXkgYW5kIHJlcGV0aXRpb25zIGFyZSBhcnJheXMgd2l0aCA9PSBsZW5ndGhcclxuICAgIGxldCBhbGxzYW1wbGVzID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZXBldGl0aW9uc1tpXTsgaisrKSB7XHJcbiAgICAgICAgICAgIGlmIChhcnJheVtpXSA9PSBudWxsIHx8IHR5cGVvZiBhcnJheVtpXSAhPSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgICAgICAgICBhbGxzYW1wbGVzLnB1c2goYXJyYXlbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYWxsc2FtcGxlcy5wdXNoKE9iamVjdC5hc3NpZ24oe30sIGFycmF5W2ldKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgb3V0ID0gc2h1ZmZsZShhbGxzYW1wbGVzKTtcclxuICAgIGlmICh1bnBhY2spIHtcclxuICAgICAgICBvdXQgPSB1bnBhY2tBcnJheShvdXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG91dDtcclxufVxyXG5mdW5jdGlvbiBzaHVmZmxlKGFycmF5KSB7XHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyYXkpKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkFyZ3VtZW50IHRvIHNodWZmbGUoKSBtdXN0IGJlIGFuIGFycmF5LlwiKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGNvcHlfYXJyYXkgPSBhcnJheS5zbGljZSgwKTtcclxuICAgIGxldCBtID0gY29weV9hcnJheS5sZW5ndGgsIHQsIGk7XHJcbiAgICAvLyBXaGlsZSB0aGVyZSByZW1haW4gZWxlbWVudHMgdG8gc2h1ZmZsZeKAplxyXG4gICAgd2hpbGUgKG0pIHtcclxuICAgICAgICAvLyBQaWNrIGEgcmVtYWluaW5nIGVsZW1lbnTigKZcclxuICAgICAgICBpID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbS0tKTtcclxuICAgICAgICAvLyBBbmQgc3dhcCBpdCB3aXRoIHRoZSBjdXJyZW50IGVsZW1lbnQuXHJcbiAgICAgICAgdCA9IGNvcHlfYXJyYXlbbV07XHJcbiAgICAgICAgY29weV9hcnJheVttXSA9IGNvcHlfYXJyYXlbaV07XHJcbiAgICAgICAgY29weV9hcnJheVtpXSA9IHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29weV9hcnJheTtcclxufVxyXG5mdW5jdGlvbiBzaHVmZmxlTm9SZXBlYXRzKGFyciwgZXF1YWxpdHlUZXN0KSB7XHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGaXJzdCBhcmd1bWVudCB0byBzaHVmZmxlTm9SZXBlYXRzKCkgbXVzdCBiZSBhbiBhcnJheS5cIik7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIGVxdWFsaXR5VGVzdCAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgZXF1YWxpdHlUZXN0ICE9PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiU2Vjb25kIGFyZ3VtZW50IHRvIHNodWZmbGVOb1JlcGVhdHMoKSBtdXN0IGJlIGEgZnVuY3Rpb24uXCIpO1xyXG4gICAgfVxyXG4gICAgLy8gZGVmaW5lIGEgZGVmYXVsdCBlcXVhbGl0eVRlc3RcclxuICAgIGlmICh0eXBlb2YgZXF1YWxpdHlUZXN0ID09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICBlcXVhbGl0eVRlc3QgPSBmdW5jdGlvbiAoYSwgYikge1xyXG4gICAgICAgICAgICBpZiAoYSA9PT0gYikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgY29uc3QgcmFuZG9tX3NodWZmbGUgPSBzaHVmZmxlKGFycik7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmRvbV9zaHVmZmxlLmxlbmd0aCAtIDE7IGkrKykge1xyXG4gICAgICAgIGlmIChlcXVhbGl0eVRlc3QocmFuZG9tX3NodWZmbGVbaV0sIHJhbmRvbV9zaHVmZmxlW2kgKyAxXSkpIHtcclxuICAgICAgICAgICAgLy8gbmVpZ2hib3JzIGFyZSBlcXVhbCwgcGljayBhIG5ldyByYW5kb20gbmVpZ2hib3IgdG8gc3dhcCAobm90IHRoZSBmaXJzdCBvciBsYXN0IGVsZW1lbnQsIHRvIGF2b2lkIGVkZ2UgY2FzZXMpXHJcbiAgICAgICAgICAgIGxldCByYW5kb21fcGljayA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChyYW5kb21fc2h1ZmZsZS5sZW5ndGggLSAyKSkgKyAxO1xyXG4gICAgICAgICAgICAvLyB0ZXN0IHRvIG1ha2Ugc3VyZSB0aGUgbmV3IG5laWdoYm9yIGlzbid0IGVxdWFsIHRvIHRoZSBvbGQgb25lXHJcbiAgICAgICAgICAgIHdoaWxlIChlcXVhbGl0eVRlc3QocmFuZG9tX3NodWZmbGVbaSArIDFdLCByYW5kb21fc2h1ZmZsZVtyYW5kb21fcGlja10pIHx8XHJcbiAgICAgICAgICAgICAgICBlcXVhbGl0eVRlc3QocmFuZG9tX3NodWZmbGVbaSArIDFdLCByYW5kb21fc2h1ZmZsZVtyYW5kb21fcGljayArIDFdKSB8fFxyXG4gICAgICAgICAgICAgICAgZXF1YWxpdHlUZXN0KHJhbmRvbV9zaHVmZmxlW2kgKyAxXSwgcmFuZG9tX3NodWZmbGVbcmFuZG9tX3BpY2sgLSAxXSkpIHtcclxuICAgICAgICAgICAgICAgIHJhbmRvbV9waWNrID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKHJhbmRvbV9zaHVmZmxlLmxlbmd0aCAtIDIpKSArIDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgbmV3X25laWdoYm9yID0gcmFuZG9tX3NodWZmbGVbcmFuZG9tX3BpY2tdO1xyXG4gICAgICAgICAgICByYW5kb21fc2h1ZmZsZVtyYW5kb21fcGlja10gPSByYW5kb21fc2h1ZmZsZVtpICsgMV07XHJcbiAgICAgICAgICAgIHJhbmRvbV9zaHVmZmxlW2kgKyAxXSA9IG5ld19uZWlnaGJvcjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmFuZG9tX3NodWZmbGU7XHJcbn1cclxuZnVuY3Rpb24gc2h1ZmZsZUFsdGVybmF0ZUdyb3VwcyhhcnJfZ3JvdXBzLCByYW5kb21fZ3JvdXBfb3JkZXIgPSBmYWxzZSkge1xyXG4gICAgY29uc3Qgbl9ncm91cHMgPSBhcnJfZ3JvdXBzLmxlbmd0aDtcclxuICAgIGlmIChuX2dyb3VwcyA9PSAxKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKFwic2h1ZmZsZUFsdGVybmF0ZUdyb3VwcygpIHdhcyBjYWxsZWQgd2l0aCBvbmx5IG9uZSBncm91cC4gRGVmYXVsdGluZyB0byBzaW1wbGUgc2h1ZmZsZS5cIik7XHJcbiAgICAgICAgcmV0dXJuIHNodWZmbGUoYXJyX2dyb3Vwc1swXSk7XHJcbiAgICB9XHJcbiAgICBsZXQgZ3JvdXBfb3JkZXIgPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbl9ncm91cHM7IGkrKykge1xyXG4gICAgICAgIGdyb3VwX29yZGVyLnB1c2goaSk7XHJcbiAgICB9XHJcbiAgICBpZiAocmFuZG9tX2dyb3VwX29yZGVyKSB7XHJcbiAgICAgICAgZ3JvdXBfb3JkZXIgPSBzaHVmZmxlKGdyb3VwX29yZGVyKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHJhbmRvbWl6ZWRfZ3JvdXBzID0gW107XHJcbiAgICBsZXQgbWluX2xlbmd0aCA9IG51bGw7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5fZ3JvdXBzOyBpKyspIHtcclxuICAgICAgICBtaW5fbGVuZ3RoID1cclxuICAgICAgICAgICAgbWluX2xlbmd0aCA9PT0gbnVsbCA/IGFycl9ncm91cHNbaV0ubGVuZ3RoIDogTWF0aC5taW4obWluX2xlbmd0aCwgYXJyX2dyb3Vwc1tpXS5sZW5ndGgpO1xyXG4gICAgICAgIHJhbmRvbWl6ZWRfZ3JvdXBzLnB1c2goc2h1ZmZsZShhcnJfZ3JvdXBzW2ldKSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBvdXQgPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWluX2xlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBncm91cF9vcmRlci5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICBvdXQucHVzaChyYW5kb21pemVkX2dyb3Vwc1tncm91cF9vcmRlcltqXV1baV0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBvdXQ7XHJcbn1cclxuZnVuY3Rpb24gc2FtcGxlV2l0aG91dFJlcGxhY2VtZW50KGFyciwgc2l6ZSkge1xyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFycikpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiRmlyc3QgYXJndW1lbnQgdG8gc2FtcGxlV2l0aG91dFJlcGxhY2VtZW50KCkgbXVzdCBiZSBhbiBhcnJheVwiKTtcclxuICAgIH1cclxuICAgIGlmIChzaXplID4gYXJyLmxlbmd0aCkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDYW5ub3QgdGFrZSBhIHNhbXBsZSBsYXJnZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgc2V0IG9mIGl0ZW1zIHRvIHNhbXBsZS5cIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc2h1ZmZsZShhcnIpLnNsaWNlKDAsIHNpemUpO1xyXG59XHJcbmZ1bmN0aW9uIHNhbXBsZVdpdGhSZXBsYWNlbWVudChhcnIsIHNpemUsIHdlaWdodHMpIHtcclxuICAgIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkZpcnN0IGFyZ3VtZW50IHRvIHNhbXBsZVdpdGhSZXBsYWNlbWVudCgpIG11c3QgYmUgYW4gYXJyYXlcIik7XHJcbiAgICB9XHJcbiAgICBjb25zdCBub3JtYWxpemVkX3dlaWdodHMgPSBbXTtcclxuICAgIGlmICh0eXBlb2Ygd2VpZ2h0cyAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgIGlmICh3ZWlnaHRzLmxlbmd0aCAhPT0gYXJyLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiVGhlIGxlbmd0aCBvZiB0aGUgd2VpZ2h0cyBhcnJheSBtdXN0IGVxdWFsIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5IFwiICtcclxuICAgICAgICAgICAgICAgIFwidG8gYmUgc2FtcGxlZCBmcm9tLlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHdlaWdodF9zdW0gPSAwO1xyXG4gICAgICAgIGZvciAoY29uc3Qgd2VpZ2h0IG9mIHdlaWdodHMpIHtcclxuICAgICAgICAgICAgd2VpZ2h0X3N1bSArPSB3ZWlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAoY29uc3Qgd2VpZ2h0IG9mIHdlaWdodHMpIHtcclxuICAgICAgICAgICAgbm9ybWFsaXplZF93ZWlnaHRzLnB1c2god2VpZ2h0IC8gd2VpZ2h0X3N1bSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbm9ybWFsaXplZF93ZWlnaHRzLnB1c2goMSAvIGFyci5sZW5ndGgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IGN1bXVsYXRpdmVfd2VpZ2h0cyA9IFtub3JtYWxpemVkX3dlaWdodHNbMF1dO1xyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBub3JtYWxpemVkX3dlaWdodHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjdW11bGF0aXZlX3dlaWdodHMucHVzaChub3JtYWxpemVkX3dlaWdodHNbaV0gKyBjdW11bGF0aXZlX3dlaWdodHNbaSAtIDFdKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHNhbXAgPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XHJcbiAgICAgICAgY29uc3Qgcm5kID0gTWF0aC5yYW5kb20oKTtcclxuICAgICAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgICAgIHdoaWxlIChybmQgPiBjdW11bGF0aXZlX3dlaWdodHNbaW5kZXhdKSB7XHJcbiAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNhbXAucHVzaChhcnJbaW5kZXhdKTtcclxuICAgIH1cclxuICAgIHJldHVybiBzYW1wO1xyXG59XHJcbmZ1bmN0aW9uIGZhY3RvcmlhbChmYWN0b3JzLCByZXBldGl0aW9ucyA9IDEsIHVucGFjayA9IGZhbHNlKSB7XHJcbiAgICBsZXQgZGVzaWduID0gW3t9XTtcclxuICAgIGZvciAoY29uc3QgW2ZhY3Rvck5hbWUsIGZhY3Rvcl0gb2YgT2JqZWN0LmVudHJpZXMoZmFjdG9ycykpIHtcclxuICAgICAgICBjb25zdCBuZXdfZGVzaWduID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCBsZXZlbCBvZiBmYWN0b3IpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIGRlc2lnbikge1xyXG4gICAgICAgICAgICAgICAgbmV3X2Rlc2lnbi5wdXNoKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY2VsbCksIHsgW2ZhY3Rvck5hbWVdOiBsZXZlbCB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZGVzaWduID0gbmV3X2Rlc2lnbjtcclxuICAgIH1cclxuICAgIHJldHVybiByZXBlYXQoZGVzaWduLCByZXBldGl0aW9ucywgdW5wYWNrKTtcclxufVxyXG5mdW5jdGlvbiByYW5kb21JRChsZW5ndGggPSAzMikge1xyXG4gICAgbGV0IHJlc3VsdCA9IFwiXCI7XHJcbiAgICBjb25zdCBjaGFycyA9IFwiMDEyMzQ1Njc4OWFiY2RlZmdoamtsbW5vcHFyc3R1dnd4eXpcIjtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICByZXN1bHQgKz0gY2hhcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcnMubGVuZ3RoKV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcbi8qKlxyXG4gKiBHZW5lcmF0ZSBhIHJhbmRvbSBpbnRlZ2VyIGZyb20gYGxvd2VyYCB0byBgdXBwZXJgLCBpbmNsdXNpdmUgb2YgYm90aCBlbmQgcG9pbnRzLlxyXG4gKiBAcGFyYW0gbG93ZXIgVGhlIGxvd2VzdCB2YWx1ZSBpdCBpcyBwb3NzaWJsZSB0byBnZW5lcmF0ZVxyXG4gKiBAcGFyYW0gdXBwZXIgVGhlIGhpZ2hlc3QgdmFsdWUgaXQgaXMgcG9zc2libGUgdG8gZ2VuZXJhdGVcclxuICogQHJldHVybnMgQSByYW5kb20gaW50ZWdlclxyXG4gKi9cclxuZnVuY3Rpb24gcmFuZG9tSW50KGxvd2VyLCB1cHBlcikge1xyXG4gICAgaWYgKHVwcGVyIDwgbG93ZXIpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVcHBlciBib3VuZGFyeSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBsb3dlciBib3VuZGFyeVwiKTtcclxuICAgIH1cclxuICAgIHJldHVybiBsb3dlciArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqICh1cHBlciAtIGxvd2VyICsgMSkpO1xyXG59XHJcbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSByYW5kb20gc2FtcGxlIGZyb20gYSBCZXJub3VsbGkgZGlzdHJpYnV0aW9uLlxyXG4gKiBAcGFyYW0gcCBUaGUgcHJvYmFiaWxpdHkgb2Ygc2FtcGxpbmcgMS5cclxuICogQHJldHVybnMgMCwgd2l0aCBwcm9iYWJpbGl0eSAxLXAsIG9yIDEsIHdpdGggcHJvYmFiaWxpdHkgcC5cclxuICovXHJcbmZ1bmN0aW9uIHNhbXBsZUJlcm5vdWxsaShwKSB7XHJcbiAgICByZXR1cm4gTWF0aC5yYW5kb20oKSA8PSBwID8gMSA6IDA7XHJcbn1cclxuZnVuY3Rpb24gc2FtcGxlTm9ybWFsKG1lYW4sIHN0YW5kYXJkX2RldmlhdGlvbikge1xyXG4gICAgcmV0dXJuIHJhbmRuX2JtKCkgKiBzdGFuZGFyZF9kZXZpYXRpb24gKyBtZWFuO1xyXG59XHJcbmZ1bmN0aW9uIHNhbXBsZUV4cG9uZW50aWFsKHJhdGUpIHtcclxuICAgIHJldHVybiAtTWF0aC5sb2coTWF0aC5yYW5kb20oKSkgLyByYXRlO1xyXG59XHJcbmZ1bmN0aW9uIHNhbXBsZUV4R2F1c3NpYW4obWVhbiwgc3RhbmRhcmRfZGV2aWF0aW9uLCByYXRlLCBwb3NpdGl2ZSA9IGZhbHNlKSB7XHJcbiAgICBsZXQgcyA9IHNhbXBsZU5vcm1hbChtZWFuLCBzdGFuZGFyZF9kZXZpYXRpb24pICsgc2FtcGxlRXhwb25lbnRpYWwocmF0ZSk7XHJcbiAgICBpZiAocG9zaXRpdmUpIHtcclxuICAgICAgICB3aGlsZSAocyA8PSAwKSB7XHJcbiAgICAgICAgICAgIHMgPSBzYW1wbGVOb3JtYWwobWVhbiwgc3RhbmRhcmRfZGV2aWF0aW9uKSArIHNhbXBsZUV4cG9uZW50aWFsKHJhdGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzO1xyXG59XHJcbi8qKlxyXG4gKiBHZW5lcmF0ZSBvbmUgb3IgbW9yZSByYW5kb20gd29yZHMuXHJcbiAqXHJcbiAqIFRoaXMgaXMgYSB3cmFwcGVyIGZ1bmN0aW9uIGZvciB0aGUge0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL3JhbmRvbS13b3JkcyBgcmFuZG9tLXdvcmRzYCBucG0gcGFja2FnZX0uXHJcbiAqXHJcbiAqIEBwYXJhbSBvcHRzIEFuIG9iamVjdCB3aXRoIG9wdGlvbmFsIHByb3BlcnRpZXMgYG1pbmAsIGBtYXhgLCBgZXhhY3RseWAsXHJcbiAqIGBqb2luYCwgYG1heExlbmd0aGAsIGB3b3Jkc1BlclN0cmluZ2AsIGBzZXBhcmF0b3JgLCBhbmQgYGZvcm1hdHRlcmAuXHJcbiAqXHJcbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHdvcmRzIG9yIGEgc2luZ2xlIHN0cmluZywgZGVwZW5kaW5nIG9uIHBhcmFtZXRlciBjaG9pY2VzLlxyXG4gKi9cclxuZnVuY3Rpb24gcmFuZG9tV29yZHMob3B0cykge1xyXG4gICAgcmV0dXJuIHJhbmRvbVdvcmRzJDEob3B0cyk7XHJcbn1cclxuLy8gQm94LU11bGxlciB0cmFuc2Zvcm1hdGlvbiBmb3IgYSByYW5kb20gc2FtcGxlIGZyb20gbm9ybWFsIGRpc3RyaWJ1dGlvbiB3aXRoIG1lYW4gPSAwLCBzdGQgPSAxXHJcbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zNjQ4MTA1OS8zNzI2NjczXHJcbmZ1bmN0aW9uIHJhbmRuX2JtKCkge1xyXG4gICAgdmFyIHUgPSAwLCB2ID0gMDtcclxuICAgIHdoaWxlICh1ID09PSAwKVxyXG4gICAgICAgIHUgPSBNYXRoLnJhbmRvbSgpOyAvL0NvbnZlcnRpbmcgWzAsMSkgdG8gKDAsMSlcclxuICAgIHdoaWxlICh2ID09PSAwKVxyXG4gICAgICAgIHYgPSBNYXRoLnJhbmRvbSgpO1xyXG4gICAgcmV0dXJuIE1hdGguc3FydCgtMi4wICogTWF0aC5sb2codSkpICogTWF0aC5jb3MoMi4wICogTWF0aC5QSSAqIHYpO1xyXG59XHJcbmZ1bmN0aW9uIHVucGFja0FycmF5KGFycmF5KSB7XHJcbiAgICBjb25zdCBvdXQgPSB7fTtcclxuICAgIGZvciAoY29uc3QgeCBvZiBhcnJheSkge1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHgpKSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3V0W2tleV0gPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgICAgIG91dFtrZXldID0gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3V0W2tleV0ucHVzaCh4W2tleV0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBvdXQ7XHJcbn1cblxudmFyIHJhbmRvbWl6YXRpb24gPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIHNldFNlZWQ6IHNldFNlZWQsXG4gICAgcmVwZWF0OiByZXBlYXQsXG4gICAgc2h1ZmZsZTogc2h1ZmZsZSxcbiAgICBzaHVmZmxlTm9SZXBlYXRzOiBzaHVmZmxlTm9SZXBlYXRzLFxuICAgIHNodWZmbGVBbHRlcm5hdGVHcm91cHM6IHNodWZmbGVBbHRlcm5hdGVHcm91cHMsXG4gICAgc2FtcGxlV2l0aG91dFJlcGxhY2VtZW50OiBzYW1wbGVXaXRob3V0UmVwbGFjZW1lbnQsXG4gICAgc2FtcGxlV2l0aFJlcGxhY2VtZW50OiBzYW1wbGVXaXRoUmVwbGFjZW1lbnQsXG4gICAgZmFjdG9yaWFsOiBmYWN0b3JpYWwsXG4gICAgcmFuZG9tSUQ6IHJhbmRvbUlELFxuICAgIHJhbmRvbUludDogcmFuZG9tSW50LFxuICAgIHNhbXBsZUJlcm5vdWxsaTogc2FtcGxlQmVybm91bGxpLFxuICAgIHNhbXBsZU5vcm1hbDogc2FtcGxlTm9ybWFsLFxuICAgIHNhbXBsZUV4cG9uZW50aWFsOiBzYW1wbGVFeHBvbmVudGlhbCxcbiAgICBzYW1wbGVFeEdhdXNzaWFuOiBzYW1wbGVFeEdhdXNzaWFuLFxuICAgIHJhbmRvbVdvcmRzOiByYW5kb21Xb3Jkc1xufSk7XG5cbi8qKlxyXG4gKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBNZWNoYW5pY2FsIFR1cmsgRW52aXJvbm1lbnQsIEhJVCwgQXNzaWdubWVudCwgYW5kIFdvcmtlclxyXG4gKiBieSBwYXJzaW5nIHRoZSBVUkwgdmFyaWFibGVzIHRoYXQgTWVjaGFuaWNhbCBUdXJrIGdlbmVyYXRlcy5cclxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIE1lY2hhbmljYWwgVHVyayBFbnZpcm9ubWVudCwgSElULCBBc3NpZ25tZW50LCBhbmQgV29ya2VyLlxyXG4gKi9cclxuZnVuY3Rpb24gdHVya0luZm8oKSB7XHJcbiAgICBjb25zdCB0dXJrID0ge1xyXG4gICAgICAgIHByZXZpZXdNb2RlOiBmYWxzZSxcclxuICAgICAgICBvdXRzaWRlVHVyazogZmFsc2UsXHJcbiAgICAgICAgaGl0SWQ6IFwiSU5WQUxJRF9VUkxfUEFSQU1FVEVSXCIsXHJcbiAgICAgICAgYXNzaWdubWVudElkOiBcIklOVkFMSURfVVJMX1BBUkFNRVRFUlwiLFxyXG4gICAgICAgIHdvcmtlcklkOiBcIklOVkFMSURfVVJMX1BBUkFNRVRFUlwiLFxyXG4gICAgICAgIHR1cmtTdWJtaXRUbzogXCJJTlZBTElEX1VSTF9QQVJBTUVURVJcIixcclxuICAgIH07XHJcbiAgICBjb25zdCBwYXJhbSA9IGZ1bmN0aW9uICh1cmwsIG5hbWUpIHtcclxuICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC9bXFxbXS8sIFwiXFxcXFtcIikucmVwbGFjZSgvW1xcXV0vLCBcIlxcXFxdXCIpO1xyXG4gICAgICAgIGNvbnN0IHJlZ2V4UyA9IFwiW1xcXFw/Jl1cIiArIG5hbWUgKyBcIj0oW14mI10qKVwiO1xyXG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChyZWdleFMpO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSByZWdleC5leGVjKHVybCk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdHMgPT0gbnVsbCA/IFwiXCIgOiByZXN1bHRzWzFdO1xyXG4gICAgfTtcclxuICAgIGNvbnN0IHNyYyA9IHBhcmFtKHdpbmRvdy5sb2NhdGlvbi5ocmVmLCBcImFzc2lnbm1lbnRJZFwiKVxyXG4gICAgICAgID8gd2luZG93LmxvY2F0aW9uLmhyZWZcclxuICAgICAgICA6IGRvY3VtZW50LnJlZmVycmVyO1xyXG4gICAgY29uc3Qga2V5cyA9IFtcImFzc2lnbm1lbnRJZFwiLCBcImhpdElkXCIsIFwid29ya2VySWRcIiwgXCJ0dXJrU3VibWl0VG9cIl07XHJcbiAgICBrZXlzLm1hcChmdW5jdGlvbiAoa2V5KSB7XHJcbiAgICAgICAgdHVya1trZXldID0gdW5lc2NhcGUocGFyYW0oc3JjLCBrZXkpKTtcclxuICAgIH0pO1xyXG4gICAgdHVyay5wcmV2aWV3TW9kZSA9IHR1cmsuYXNzaWdubWVudElkID09IFwiQVNTSUdOTUVOVF9JRF9OT1RfQVZBSUxBQkxFXCI7XHJcbiAgICB0dXJrLm91dHNpZGVUdXJrID1cclxuICAgICAgICAhdHVyay5wcmV2aWV3TW9kZSAmJiB0dXJrLmhpdElkID09PSBcIlwiICYmIHR1cmsuYXNzaWdubWVudElkID09IFwiXCIgJiYgdHVyay53b3JrZXJJZCA9PSBcIlwiO1xyXG4gICAgcmV0dXJuIHR1cms7XHJcbn1cclxuLyoqXHJcbiAqIFNlbmQgZGF0YSB0byBNZWNobmljYWwgVHVyayBmb3Igc3RvcmFnZS5cclxuICogQHBhcmFtIGRhdGEgQW4gb2JqZWN0IGNvbnRhaW5pbmcgYGtleTp2YWx1ZWAgcGFpcnMgdG8gc2VuZCB0byBNZWNoYW5pY2FsIFR1cmsuIFZhbHVlc1xyXG4gKiBjYW5ub3QgY29udGFpbiBuZXN0ZWQgb2JqZWN0cywgYXJyYXlzLCBvciBmdW5jdGlvbnMuXHJcbiAqIEByZXR1cm5zIE5vdGhpbmdcclxuICovXHJcbmZ1bmN0aW9uIHN1Ym1pdFRvVHVyayhkYXRhKSB7XHJcbiAgICBjb25zdCB0dXJrID0gdHVya0luZm8oKTtcclxuICAgIGNvbnN0IGFzc2lnbm1lbnRJZCA9IHR1cmsuYXNzaWdubWVudElkO1xyXG4gICAgY29uc3QgdHVya1N1Ym1pdFRvID0gdHVyay50dXJrU3VibWl0VG87XHJcbiAgICBpZiAoIWFzc2lnbm1lbnRJZCB8fCAhdHVya1N1Ym1pdFRvKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIGNvbnN0IGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZm9ybVwiKTtcclxuICAgIGZvcm0ubWV0aG9kID0gXCJQT1NUXCI7XHJcbiAgICBmb3JtLmFjdGlvbiA9IHR1cmtTdWJtaXRUbyArIFwiL210dXJrL2V4dGVybmFsU3VibWl0P2Fzc2lnbm1lbnRJZD1cIiArIGFzc2lnbm1lbnRJZDtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcclxuICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhpZGRlbkZpZWxkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xyXG4gICAgICAgICAgICBoaWRkZW5GaWVsZC50eXBlID0gXCJoaWRkZW5cIjtcclxuICAgICAgICAgICAgaGlkZGVuRmllbGQubmFtZSA9IGtleTtcclxuICAgICAgICAgICAgaGlkZGVuRmllbGQuaWQgPSBrZXk7XHJcbiAgICAgICAgICAgIGhpZGRlbkZpZWxkLnZhbHVlID0gZGF0YVtrZXldO1xyXG4gICAgICAgICAgICBmb3JtLmFwcGVuZENoaWxkKGhpZGRlbkZpZWxkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGZvcm0pO1xyXG4gICAgZm9ybS5zdWJtaXQoKTtcclxufVxuXG52YXIgdHVyayA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgdHVya0luZm86IHR1cmtJbmZvLFxuICAgIHN1Ym1pdFRvVHVyazogc3VibWl0VG9UdXJrXG59KTtcblxuY2xhc3MgVGltZWxpbmVOb2RlIHtcclxuICAgIC8vIGNvbnN0cnVjdG9yXHJcbiAgICBjb25zdHJ1Y3Rvcihqc1BzeWNoLCBwYXJhbWV0ZXJzLCBwYXJlbnQsIHJlbGF0aXZlSUQpIHtcclxuICAgICAgICB0aGlzLmpzUHN5Y2ggPSBqc1BzeWNoO1xyXG4gICAgICAgIC8vIHRyYWNrIHByb2dyZXNzIHRocm91Z2ggdGhlIG5vZGVcclxuICAgICAgICB0aGlzLnByb2dyZXNzID0ge1xyXG4gICAgICAgICAgICBjdXJyZW50X2xvY2F0aW9uOiAtMSxcclxuICAgICAgICAgICAgY3VycmVudF92YXJpYWJsZV9zZXQ6IDAsXHJcbiAgICAgICAgICAgIGN1cnJlbnRfcmVwZXRpdGlvbjogMCxcclxuICAgICAgICAgICAgY3VycmVudF9pdGVyYXRpb246IDAsXHJcbiAgICAgICAgICAgIGRvbmU6IGZhbHNlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy8gc3RvcmUgYSBsaW5rIHRvIHRoZSBwYXJlbnQgb2YgdGhpcyBub2RlXHJcbiAgICAgICAgdGhpcy5wYXJlbnRfbm9kZSA9IHBhcmVudDtcclxuICAgICAgICAvLyBjcmVhdGUgdGhlIElEIGZvciB0aGlzIG5vZGVcclxuICAgICAgICB0aGlzLnJlbGF0aXZlX2lkID0gdHlwZW9mIHBhcmVudCA9PT0gXCJ1bmRlZmluZWRcIiA/IDAgOiByZWxhdGl2ZUlEO1xyXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgdGltZWxpbmUgcGFyYW1ldGVyXHJcbiAgICAgICAgLy8gaWYgdGhlcmUgaXMsIHRoZW4gdGhpcyBub2RlIGhhcyBpdHMgb3duIHRpbWVsaW5lXHJcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJhbWV0ZXJzLnRpbWVsaW5lICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIC8vIGNyZWF0ZSB0aW1lbGluZSBwcm9wZXJ0aWVzXHJcbiAgICAgICAgICAgIHRoaXMudGltZWxpbmVfcGFyYW1ldGVycyA9IHtcclxuICAgICAgICAgICAgICAgIHRpbWVsaW5lOiBbXSxcclxuICAgICAgICAgICAgICAgIGxvb3BfZnVuY3Rpb246IHBhcmFtZXRlcnMubG9vcF9mdW5jdGlvbixcclxuICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsX2Z1bmN0aW9uOiBwYXJhbWV0ZXJzLmNvbmRpdGlvbmFsX2Z1bmN0aW9uLFxyXG4gICAgICAgICAgICAgICAgc2FtcGxlOiBwYXJhbWV0ZXJzLnNhbXBsZSxcclxuICAgICAgICAgICAgICAgIHJhbmRvbWl6ZV9vcmRlcjogdHlwZW9mIHBhcmFtZXRlcnMucmFuZG9taXplX29yZGVyID09IFwidW5kZWZpbmVkXCIgPyBmYWxzZSA6IHBhcmFtZXRlcnMucmFuZG9taXplX29yZGVyLFxyXG4gICAgICAgICAgICAgICAgcmVwZXRpdGlvbnM6IHR5cGVvZiBwYXJhbWV0ZXJzLnJlcGV0aXRpb25zID09IFwidW5kZWZpbmVkXCIgPyAxIDogcGFyYW1ldGVycy5yZXBldGl0aW9ucyxcclxuICAgICAgICAgICAgICAgIHRpbWVsaW5lX3ZhcmlhYmxlczogdHlwZW9mIHBhcmFtZXRlcnMudGltZWxpbmVfdmFyaWFibGVzID09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgICAgICAgICA/IFt7fV1cclxuICAgICAgICAgICAgICAgICAgICA6IHBhcmFtZXRlcnMudGltZWxpbmVfdmFyaWFibGVzLFxyXG4gICAgICAgICAgICAgICAgb25fdGltZWxpbmVfZmluaXNoOiBwYXJhbWV0ZXJzLm9uX3RpbWVsaW5lX2ZpbmlzaCxcclxuICAgICAgICAgICAgICAgIG9uX3RpbWVsaW5lX3N0YXJ0OiBwYXJhbWV0ZXJzLm9uX3RpbWVsaW5lX3N0YXJ0LFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLnNldFRpbWVsaW5lVmFyaWFibGVzT3JkZXIoKTtcclxuICAgICAgICAgICAgLy8gZXh0cmFjdCBhbGwgb2YgdGhlIG5vZGUgbGV2ZWwgZGF0YSBhbmQgcGFyYW1ldGVyc1xyXG4gICAgICAgICAgICAvLyBidXQgcmVtb3ZlIGFsbCBvZiB0aGUgdGltZWxpbmUtbGV2ZWwgc3BlY2lmaWMgaW5mb3JtYXRpb25cclxuICAgICAgICAgICAgLy8gc2luY2UgdGhpcyB3aWxsIGJlIHVzZWQgdG8gY29weSB0aGluZ3MgZG93biBoaWVyYXJjaGljYWxseVxyXG4gICAgICAgICAgICB2YXIgbm9kZV9kYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgcGFyYW1ldGVycyk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBub2RlX2RhdGEudGltZWxpbmU7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBub2RlX2RhdGEuY29uZGl0aW9uYWxfZnVuY3Rpb247XHJcbiAgICAgICAgICAgIGRlbGV0ZSBub2RlX2RhdGEubG9vcF9mdW5jdGlvbjtcclxuICAgICAgICAgICAgZGVsZXRlIG5vZGVfZGF0YS5yYW5kb21pemVfb3JkZXI7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBub2RlX2RhdGEucmVwZXRpdGlvbnM7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBub2RlX2RhdGEudGltZWxpbmVfdmFyaWFibGVzO1xyXG4gICAgICAgICAgICBkZWxldGUgbm9kZV9kYXRhLnNhbXBsZTtcclxuICAgICAgICAgICAgZGVsZXRlIG5vZGVfZGF0YS5vbl90aW1lbGluZV9zdGFydDtcclxuICAgICAgICAgICAgZGVsZXRlIG5vZGVfZGF0YS5vbl90aW1lbGluZV9maW5pc2g7XHJcbiAgICAgICAgICAgIHRoaXMubm9kZV90cmlhbF9kYXRhID0gbm9kZV9kYXRhOyAvLyBzdG9yZSBmb3IgbGF0ZXIuLi5cclxuICAgICAgICAgICAgLy8gY3JlYXRlIGEgVGltZWxpbmVOb2RlIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIHRpbWVsaW5lXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyYW1ldGVycy50aW1lbGluZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgLy8gbWVyZ2UgcGFyYW1ldGVyc1xyXG4gICAgICAgICAgICAgICAgdmFyIG1lcmdlZF9wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgbm9kZV9kYXRhLCBwYXJhbWV0ZXJzLnRpbWVsaW5lW2ldKTtcclxuICAgICAgICAgICAgICAgIC8vIG1lcmdlIGFueSBkYXRhIGZyb20gdGhlIHBhcmVudCBub2RlIGludG8gY2hpbGQgbm9kZXNcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygbm9kZV9kYXRhLmRhdGEgPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcGFyYW1ldGVycy50aW1lbGluZVtpXS5kYXRhID09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbWVyZ2VkX2RhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBub2RlX2RhdGEuZGF0YSwgcGFyYW1ldGVycy50aW1lbGluZVtpXS5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICBtZXJnZWRfcGFyYW1ldGVycy5kYXRhID0gbWVyZ2VkX2RhdGE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVsaW5lX3BhcmFtZXRlcnMudGltZWxpbmUucHVzaChuZXcgVGltZWxpbmVOb2RlKHRoaXMuanNQc3ljaCwgbWVyZ2VkX3BhcmFtZXRlcnMsIHRoaXMsIGkpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyB0aW1lbGluZSBwYXJhbWV0ZXIsIHRoZW4gdGhpcyBub2RlIGlzIGEgdHJpYWwgbm9kZVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgYSB2YWxpZCB0cmlhbCB0eXBlIGlzIGRlZmluZWRcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbWV0ZXJzLnR5cGUgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RyaWFsIGxldmVsIG5vZGUgaXMgbWlzc2luZyB0aGUgXCJ0eXBlXCIgcGFyYW1ldGVyLiBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIG5vZGUgYXJlOiAnICtcclxuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShwYXJhbWV0ZXJzKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gY3JlYXRlIGEgZGVlcCBjb3B5IG9mIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgdHJpYWxcclxuICAgICAgICAgICAgdGhpcy50cmlhbF9wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgcGFyYW1ldGVycyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gcmVjdXJzaXZlbHkgZ2V0IHRoZSBuZXh0IHRyaWFsIHRvIHJ1bi5cclxuICAgIC8vIGlmIHRoaXMgbm9kZSBpcyBhIGxlYWYgKHRyaWFsKSwgdGhlbiByZXR1cm4gdGhlIHRyaWFsLlxyXG4gICAgLy8gb3RoZXJ3aXNlLCByZWN1cnNpdmVseSBmaW5kIHRoZSBuZXh0IHRyaWFsIGluIHRoZSBjaGlsZCB0aW1lbGluZS5cclxuICAgIHRyaWFsKCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50aW1lbGluZV9wYXJhbWV0ZXJzID09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgLy8gcmV0dXJucyBhIGNsb25lIG9mIHRoZSB0cmlhbF9wYXJhbWV0ZXJzIHRvXHJcbiAgICAgICAgICAgIC8vIHByb3RlY3QgZnVuY3Rpb25zLlxyXG4gICAgICAgICAgICByZXR1cm4gZGVlcENvcHkodGhpcy50cmlhbF9wYXJhbWV0ZXJzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnByb2dyZXNzLmN1cnJlbnRfbG9jYXRpb24gPj0gdGhpcy50aW1lbGluZV9wYXJhbWV0ZXJzLnRpbWVsaW5lLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50aW1lbGluZV9wYXJhbWV0ZXJzLnRpbWVsaW5lW3RoaXMucHJvZ3Jlc3MuY3VycmVudF9sb2NhdGlvbl0udHJpYWwoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIG1hcmtDdXJyZW50VHJpYWxDb21wbGV0ZSgpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudGltZWxpbmVfcGFyYW1ldGVycyA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzLmRvbmUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy50aW1lbGluZV9wYXJhbWV0ZXJzLnRpbWVsaW5lW3RoaXMucHJvZ3Jlc3MuY3VycmVudF9sb2NhdGlvbl0ubWFya0N1cnJlbnRUcmlhbENvbXBsZXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgbmV4dFJlcGV0aXRvbigpIHtcclxuICAgICAgICB0aGlzLnNldFRpbWVsaW5lVmFyaWFibGVzT3JkZXIoKTtcclxuICAgICAgICB0aGlzLnByb2dyZXNzLmN1cnJlbnRfbG9jYXRpb24gPSAtMTtcclxuICAgICAgICB0aGlzLnByb2dyZXNzLmN1cnJlbnRfdmFyaWFibGVfc2V0ID0gMDtcclxuICAgICAgICB0aGlzLnByb2dyZXNzLmN1cnJlbnRfcmVwZXRpdGlvbisrO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy50aW1lbGluZV9wYXJhbWV0ZXJzLnRpbWVsaW5lLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGltZWxpbmVfcGFyYW1ldGVycy50aW1lbGluZVtpXS5yZXNldCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHNldCB0aGUgb3JkZXIgZm9yIGdvaW5nIHRocm91Z2ggdGhlIHRpbWVsaW5lIHZhcmlhYmxlcyBhcnJheVxyXG4gICAgc2V0VGltZWxpbmVWYXJpYWJsZXNPcmRlcigpIHtcclxuICAgICAgICBjb25zdCB0aW1lbGluZV9wYXJhbWV0ZXJzID0gdGhpcy50aW1lbGluZV9wYXJhbWV0ZXJzO1xyXG4gICAgICAgIC8vIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGlzIG5vZGUgaGFzIHZhcmlhYmxlc1xyXG4gICAgICAgIGlmICh0eXBlb2YgdGltZWxpbmVfcGFyYW1ldGVycyA9PT0gXCJ1bmRlZmluZWRcIiB8fFxyXG4gICAgICAgICAgICB0eXBlb2YgdGltZWxpbmVfcGFyYW1ldGVycy50aW1lbGluZV92YXJpYWJsZXMgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgb3JkZXIgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRpbWVsaW5lX3BhcmFtZXRlcnMudGltZWxpbmVfdmFyaWFibGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIG9yZGVyLnB1c2goaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgdGltZWxpbmVfcGFyYW1ldGVycy5zYW1wbGUgIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgaWYgKHRpbWVsaW5lX3BhcmFtZXRlcnMuc2FtcGxlLnR5cGUgPT0gXCJjdXN0b21cIikge1xyXG4gICAgICAgICAgICAgICAgb3JkZXIgPSB0aW1lbGluZV9wYXJhbWV0ZXJzLnNhbXBsZS5mbihvcmRlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodGltZWxpbmVfcGFyYW1ldGVycy5zYW1wbGUudHlwZSA9PSBcIndpdGgtcmVwbGFjZW1lbnRcIikge1xyXG4gICAgICAgICAgICAgICAgb3JkZXIgPSBzYW1wbGVXaXRoUmVwbGFjZW1lbnQob3JkZXIsIHRpbWVsaW5lX3BhcmFtZXRlcnMuc2FtcGxlLnNpemUsIHRpbWVsaW5lX3BhcmFtZXRlcnMuc2FtcGxlLndlaWdodHMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRpbWVsaW5lX3BhcmFtZXRlcnMuc2FtcGxlLnR5cGUgPT0gXCJ3aXRob3V0LXJlcGxhY2VtZW50XCIpIHtcclxuICAgICAgICAgICAgICAgIG9yZGVyID0gc2FtcGxlV2l0aG91dFJlcGxhY2VtZW50KG9yZGVyLCB0aW1lbGluZV9wYXJhbWV0ZXJzLnNhbXBsZS5zaXplKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0aW1lbGluZV9wYXJhbWV0ZXJzLnNhbXBsZS50eXBlID09IFwiZml4ZWQtcmVwZXRpdGlvbnNcIikge1xyXG4gICAgICAgICAgICAgICAgb3JkZXIgPSByZXBlYXQob3JkZXIsIHRpbWVsaW5lX3BhcmFtZXRlcnMuc2FtcGxlLnNpemUsIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0aW1lbGluZV9wYXJhbWV0ZXJzLnNhbXBsZS50eXBlID09IFwiYWx0ZXJuYXRlLWdyb3Vwc1wiKSB7XHJcbiAgICAgICAgICAgICAgICBvcmRlciA9IHNodWZmbGVBbHRlcm5hdGVHcm91cHModGltZWxpbmVfcGFyYW1ldGVycy5zYW1wbGUuZ3JvdXBzLCB0aW1lbGluZV9wYXJhbWV0ZXJzLnNhbXBsZS5yYW5kb21pemVfZ3JvdXBfb3JkZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignSW52YWxpZCB0eXBlIGluIHRpbWVsaW5lIHNhbXBsZSBwYXJhbWV0ZXJzLiBWYWxpZCBvcHRpb25zIGZvciB0eXBlIGFyZSBcImN1c3RvbVwiLCBcIndpdGgtcmVwbGFjZW1lbnRcIiwgXCJ3aXRob3V0LXJlcGxhY2VtZW50XCIsIFwiZml4ZWQtcmVwZXRpdGlvbnNcIiwgYW5kIFwiYWx0ZXJuYXRlLWdyb3Vwc1wiJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRpbWVsaW5lX3BhcmFtZXRlcnMucmFuZG9taXplX29yZGVyKSB7XHJcbiAgICAgICAgICAgIG9yZGVyID0gc2h1ZmZsZShvcmRlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3Mub3JkZXIgPSBvcmRlcjtcclxuICAgIH1cclxuICAgIC8vIG5leHQgdmFyaWFibGUgc2V0XHJcbiAgICBuZXh0U2V0KCkge1xyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MuY3VycmVudF9sb2NhdGlvbiA9IC0xO1xyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MuY3VycmVudF92YXJpYWJsZV9zZXQrKztcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudGltZWxpbmVfcGFyYW1ldGVycy50aW1lbGluZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLnRpbWVsaW5lX3BhcmFtZXRlcnMudGltZWxpbmVbaV0ucmVzZXQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyB1cGRhdGUgdGhlIGN1cnJlbnQgdHJpYWwgbm9kZSB0byBiZSBjb21wbGV0ZWRcclxuICAgIC8vIHJldHVybnMgdHJ1ZSBpZiB0aGUgbm9kZSBpcyBjb21wbGV0ZSBhZnRlciBhZHZhbmNlIChhbGwgc3Vibm9kZXMgYXJlIGFsc28gY29tcGxldGUpXHJcbiAgICAvLyByZXR1cm5zIGZhbHNlIG90aGVyd2lzZVxyXG4gICAgYWR2YW5jZSgpIHtcclxuICAgICAgICBjb25zdCBwcm9ncmVzcyA9IHRoaXMucHJvZ3Jlc3M7XHJcbiAgICAgICAgY29uc3QgdGltZWxpbmVfcGFyYW1ldGVycyA9IHRoaXMudGltZWxpbmVfcGFyYW1ldGVycztcclxuICAgICAgICBjb25zdCBpbnRlcm5hbCA9IHRoaXMuanNQc3ljaC5pbnRlcm5hbDtcclxuICAgICAgICAvLyBmaXJzdCBjaGVjayB0byBzZWUgaWYgZG9uZVxyXG4gICAgICAgIGlmIChwcm9ncmVzcy5kb25lKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZiBub2RlIGhhcyBub3Qgc3RhcnRlZCB5ZXQgKHByb2dyZXNzLmN1cnJlbnRfbG9jYXRpb24gPT0gLTEpLFxyXG4gICAgICAgIC8vIHRoZW4gdHJ5IHRvIHN0YXJ0IHRoZSBub2RlLlxyXG4gICAgICAgIGlmIChwcm9ncmVzcy5jdXJyZW50X2xvY2F0aW9uID09IC0xKSB7XHJcbiAgICAgICAgICAgIC8vIGNoZWNrIGZvciBvbl90aW1lbGluZV9zdGFydCBhbmQgY29uZGl0b25hbCBmdW5jdGlvbiBvbiBub2RlcyB3aXRoIHRpbWVsaW5lc1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRpbWVsaW5lX3BhcmFtZXRlcnMgIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgICAgIC8vIG9ubHkgcnVuIHRoZSBjb25kaXRpb25hbCBmdW5jdGlvbiBpZiB0aGlzIGlzIHRoZSBmaXJzdCByZXBldGl0aW9uIG9mIHRoZSB0aW1lbGluZSB3aGVuXHJcbiAgICAgICAgICAgICAgICAvLyByZXBldGl0aW9ucyA+IDEsIGFuZCBvbmx5IHdoZW4gb24gdGhlIGZpcnN0IHZhcmlhYmxlIHNldFxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aW1lbGluZV9wYXJhbWV0ZXJzLmNvbmRpdGlvbmFsX2Z1bmN0aW9uICE9PSBcInVuZGVmaW5lZFwiICYmXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MuY3VycmVudF9yZXBldGl0aW9uID09IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcy5jdXJyZW50X3ZhcmlhYmxlX3NldCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwuY2FsbF9pbW1lZGlhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb25kaXRpb25hbF9yZXN1bHQgPSB0aW1lbGluZV9wYXJhbWV0ZXJzLmNvbmRpdGlvbmFsX2Z1bmN0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwuY2FsbF9pbW1lZGlhdGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY29uZGl0aW9uYWxfZnVuY3Rpb24oKSByZXR1cm5zIGZhbHNlLCB0aGVuIHRoZSB0aW1lbGluZVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGRvZXNuJ3QgcnVuIGFuZCBpcyBtYXJrZWQgYXMgY29tcGxldGUuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpdGlvbmFsX3Jlc3VsdCA9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcy5kb25lID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gaWYgd2UgcmVhY2ggdGhpcyBwb2ludCB0aGVuIHRoZSBub2RlIGhhcyBpdHMgb3duIHRpbWVsaW5lIGFuZCB3aWxsIHN0YXJ0XHJcbiAgICAgICAgICAgICAgICAvLyBzbyB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZXJlIGlzIGFuIG9uX3RpbWVsaW5lX3N0YXJ0IGZ1bmN0aW9uIGlmIHdlIGFyZSBvbiB0aGUgZmlyc3QgdmFyaWFibGUgc2V0XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRpbWVsaW5lX3BhcmFtZXRlcnMub25fdGltZWxpbmVfc3RhcnQgIT09IFwidW5kZWZpbmVkXCIgJiZcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcy5jdXJyZW50X3ZhcmlhYmxlX3NldCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGltZWxpbmVfcGFyYW1ldGVycy5vbl90aW1lbGluZV9zdGFydCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGlmIHdlIHJlYWNoIHRoaXMgcG9pbnQsIHRoZW4gZWl0aGVyIHRoZSBub2RlIGRvZXNuJ3QgaGF2ZSBhIHRpbWVsaW5lIG9mIHRoZVxyXG4gICAgICAgICAgICAvLyBjb25kaXRpb25hbCBmdW5jdGlvbiByZXR1cm5lZCB0cnVlIGFuZCBpdCBjYW4gc3RhcnRcclxuICAgICAgICAgICAgcHJvZ3Jlc3MuY3VycmVudF9sb2NhdGlvbiA9IDA7XHJcbiAgICAgICAgICAgIC8vIGNhbGwgYWR2YW5jZSBhZ2FpbiBvbiB0aGlzIG5vZGUgbm93IHRoYXQgaXQgaXMgcG9pbnRpbmcgdG8gYSBuZXcgbG9jYXRpb25cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWR2YW5jZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZiB0aGlzIG5vZGUgaGFzIGEgdGltZWxpbmUsIHByb3BvZ2F0ZSBkb3duIHRvIHRoZSBjdXJyZW50IHRyaWFsLlxyXG4gICAgICAgIGlmICh0eXBlb2YgdGltZWxpbmVfcGFyYW1ldGVycyAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICB2YXIgaGF2ZV9ub2RlX3RvX3J1biA9IGZhbHNlO1xyXG4gICAgICAgICAgICAvLyBrZWVwIGluY3JlbWVudGluZyB0aGUgbG9jYXRpb24gaW4gdGhlIHRpbWVsaW5lIHVudGlsIG9uZSBvZiB0aGUgbm9kZXMgcmVhY2hlZCBpcyBpbmNvbXBsZXRlXHJcbiAgICAgICAgICAgIHdoaWxlIChwcm9ncmVzcy5jdXJyZW50X2xvY2F0aW9uIDwgdGltZWxpbmVfcGFyYW1ldGVycy50aW1lbGluZS5sZW5ndGggJiZcclxuICAgICAgICAgICAgICAgIGhhdmVfbm9kZV90b19ydW4gPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRvIHNlZSBpZiB0aGUgbm9kZSBjdXJyZW50bHkgcG9pbnRlZCBhdCBpcyBkb25lXHJcbiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0X2NvbXBsZXRlID0gdGltZWxpbmVfcGFyYW1ldGVycy50aW1lbGluZVtwcm9ncmVzcy5jdXJyZW50X2xvY2F0aW9uXS5hZHZhbmNlKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldF9jb21wbGV0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGhhdmVfbm9kZV90b19ydW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzLmN1cnJlbnRfbG9jYXRpb24rKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBpZiB3ZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHRpbWVsaW5lICh3aGljaCwgaWYgdGhlIGNvZGUgaXMgaGVyZSwgd2UgaGF2ZSlcclxuICAgICAgICAgICAgLy8gdGhlcmUgYXJlIGEgZmV3IHN0ZXBzIHRvIHNlZSB3aGF0IHRvIGRvIG5leHQuLi5cclxuICAgICAgICAgICAgLy8gZmlyc3QsIGNoZWNrIHRoZSB0aW1lbGluZV92YXJpYWJsZXMgdG8gc2VlIGlmIHdlIG5lZWQgdG8gbG9vcCB0aHJvdWdoIGFnYWluXHJcbiAgICAgICAgICAgIC8vIHdpdGggYSBuZXcgc2V0IG9mIHZhcmlhYmxlc1xyXG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3MuY3VycmVudF92YXJpYWJsZV9zZXQgPCBwcm9ncmVzcy5vcmRlci5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgICAgICAvLyByZXNldCB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIG5vZGUgdG8gYmUgd2l0aCB0aGUgbmV3IHNldFxyXG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0U2V0KCk7XHJcbiAgICAgICAgICAgICAgICAvLyB0aGVuIHRyeSB0byBhZHZhbmNlIHRoaXMgbm9kZSBhZ2Fpbi5cclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFkdmFuY2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBpZiB3ZSdyZSBhbGwgZG9uZSB3aXRoIHRoZSB0aW1lbGluZV92YXJpYWJsZXMsIHRoZW4gY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGFyZSBtb3JlIHJlcGV0aXRpb25zXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHByb2dyZXNzLmN1cnJlbnRfcmVwZXRpdGlvbiA8IHRpbWVsaW5lX3BhcmFtZXRlcnMucmVwZXRpdGlvbnMgLSAxKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5leHRSZXBldGl0b24oKTtcclxuICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhbiBvbl90aW1lbGluZV9maW5pc2ggZnVuY3Rpb25cclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGltZWxpbmVfcGFyYW1ldGVycy5vbl90aW1lbGluZV9maW5pc2ggIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aW1lbGluZV9wYXJhbWV0ZXJzLm9uX3RpbWVsaW5lX2ZpbmlzaCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWR2YW5jZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGFsbCBkb25lIHdpdGggdGhlIHJlcGV0aXRpb25zLi4uXHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGFuIG9uX3RpbWVsaW5lX2ZpbmlzaCBmdW5jdGlvblxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aW1lbGluZV9wYXJhbWV0ZXJzLm9uX3RpbWVsaW5lX2ZpbmlzaCAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpbWVsaW5lX3BhcmFtZXRlcnMub25fdGltZWxpbmVfZmluaXNoKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBhbGwgZG9uZSB3aXRoIHRoZSByZXBldGl0aW9ucywgY2hlY2sgaWYgdGhlcmUgaXMgYSBsb29wIGZ1bmN0aW9uLlxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aW1lbGluZV9wYXJhbWV0ZXJzLmxvb3BfZnVuY3Rpb24gIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbC5jYWxsX2ltbWVkaWF0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVsaW5lX3BhcmFtZXRlcnMubG9vcF9mdW5jdGlvbih0aGlzLmdlbmVyYXRlZERhdGEoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbC5jYWxsX2ltbWVkaWF0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnRfbm9kZS5hZHZhbmNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcy5kb25lID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwuY2FsbF9pbW1lZGlhdGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIG5vIG1vcmUgbG9vcHMgb24gdGhpcyB0aW1lbGluZSwgd2UncmUgZG9uZSFcclxuICAgICAgICAgICAgcHJvZ3Jlc3MuZG9uZSA9IHRydWU7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGNoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIGRvbmUgZmxhZ1xyXG4gICAgaXNDb21wbGV0ZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9ncmVzcy5kb25lO1xyXG4gICAgfVxyXG4gICAgLy8gZ2V0dGVyIG1ldGhvZCBmb3IgdGltZWxpbmUgdmFyaWFibGVzXHJcbiAgICBnZXRUaW1lbGluZVZhcmlhYmxlVmFsdWUodmFyaWFibGVfbmFtZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50aW1lbGluZV9wYXJhbWV0ZXJzID09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHYgPSB0aGlzLnRpbWVsaW5lX3BhcmFtZXRlcnMudGltZWxpbmVfdmFyaWFibGVzW3RoaXMucHJvZ3Jlc3Mub3JkZXJbdGhpcy5wcm9ncmVzcy5jdXJyZW50X3ZhcmlhYmxlX3NldF1dW3ZhcmlhYmxlX25hbWVdO1xyXG4gICAgICAgIHJldHVybiB2O1xyXG4gICAgfVxyXG4gICAgLy8gcmVjdXJzaXZlIHVwd2FyZCBzZWFyY2ggZm9yIHRpbWVsaW5lIHZhcmlhYmxlc1xyXG4gICAgZmluZFRpbWVsaW5lVmFyaWFibGUodmFyaWFibGVfbmFtZSkge1xyXG4gICAgICAgIHZhciB2ID0gdGhpcy5nZXRUaW1lbGluZVZhcmlhYmxlVmFsdWUodmFyaWFibGVfbmFtZSk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2ID09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBhcmVudF9ub2RlICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnRfbm9kZS5maW5kVGltZWxpbmVWYXJpYWJsZSh2YXJpYWJsZV9uYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHJlY3Vyc2l2ZSBkb3dud2FyZCBzZWFyY2ggZm9yIGFjdGl2ZSB0cmlhbCB0byBleHRyYWN0IHRpbWVsaW5lIHZhcmlhYmxlXHJcbiAgICB0aW1lbGluZVZhcmlhYmxlKHZhcmlhYmxlX25hbWUpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudGltZWxpbmVfcGFyYW1ldGVycyA9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmRUaW1lbGluZVZhcmlhYmxlKHZhcmlhYmxlX25hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gaWYgcHJvZ3Jlc3MuY3VycmVudF9sb2NhdGlvbiBpcyAtMSwgdGhlbiB0aGUgdGltZWxpbmUgdmFyaWFibGUgaXMgYmVpbmcgZXZhbHVhdGVkXHJcbiAgICAgICAgICAgIC8vIGluIGEgZnVuY3Rpb24gdGhhdCBydW5zIHByaW9yIHRvIHRoZSB0cmlhbCBzdGFydGluZywgc28gd2Ugc2hvdWxkIHRyZWF0IHRoYXQgdHJpYWxcclxuICAgICAgICAgICAgLy8gYXMgYmVpbmcgdGhlIGFjdGl2ZSB0cmlhbCBmb3IgcHVycG9zZXMgb2YgZmluZGluZyB0aGUgdmFsdWUgb2YgdGhlIHRpbWVsaW5lIHZhcmlhYmxlXHJcbiAgICAgICAgICAgIHZhciBsb2MgPSBNYXRoLm1heCgwLCB0aGlzLnByb2dyZXNzLmN1cnJlbnRfbG9jYXRpb24pO1xyXG4gICAgICAgICAgICAvLyBpZiBsb2MgaXMgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgb24gdGhpcyB0aW1lbGluZSwgdGhlbiB0aGUgdGltZWxpbmVcclxuICAgICAgICAgICAgLy8gdmFyaWFibGUgaXMgYmVpbmcgZXZhbHVhdGVkIGluIGEgZnVuY3Rpb24gdGhhdCBydW5zIGFmdGVyIHRoZSB0cmlhbCBvbiB0aGUgdGltZWxpbmVcclxuICAgICAgICAgICAgLy8gYXJlIGNvbXBsZXRlIGJ1dCBiZWZvcmUgYWR2YW5jaW5nIHRvIHRoZSBuZXh0IChsaWtlIGEgbG9vcF9mdW5jdGlvbikuXHJcbiAgICAgICAgICAgIC8vIHRyZWF0IHRoZSBsYXN0IGFjdGl2ZSB0cmlhbCBhcyB0aGUgYWN0aXZlIHRyaWFsIGZvciB0aGlzIHB1cnBvc2UuXHJcbiAgICAgICAgICAgIGlmIChsb2MgPT0gdGhpcy50aW1lbGluZV9wYXJhbWV0ZXJzLnRpbWVsaW5lLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgbG9jID0gbG9jIC0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBub3cgZmluZCB0aGUgdmFyaWFibGVcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGltZWxpbmVfcGFyYW1ldGVycy50aW1lbGluZVtsb2NdLnRpbWVsaW5lVmFyaWFibGUodmFyaWFibGVfbmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gcmVjdXJzaXZlbHkgZ2V0IGFsbCB0aGUgdGltZWxpbmUgdmFyaWFibGVzIGZvciB0aGlzIHRyaWFsXHJcbiAgICBhbGxUaW1lbGluZVZhcmlhYmxlcygpIHtcclxuICAgICAgICB2YXIgYWxsX3R2cyA9IHRoaXMuYWxsVGltZWxpbmVWYXJpYWJsZXNOYW1lcygpO1xyXG4gICAgICAgIHZhciBhbGxfdHZzX3ZhbHMgPSB7fTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbF90dnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgYWxsX3R2c192YWxzW2FsbF90dnNbaV1dID0gdGhpcy50aW1lbGluZVZhcmlhYmxlKGFsbF90dnNbaV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYWxsX3R2c192YWxzO1xyXG4gICAgfVxyXG4gICAgLy8gaGVscGVyIHRvIGdldCBhbGwgdGhlIG5hbWVzIGF0IHRoaXMgc3RhZ2UuXHJcbiAgICBhbGxUaW1lbGluZVZhcmlhYmxlc05hbWVzKHNvX2ZhciA9IFtdKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRpbWVsaW5lX3BhcmFtZXRlcnMgIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgc29fZmFyID0gc29fZmFyLmNvbmNhdChPYmplY3Qua2V5cyh0aGlzLnRpbWVsaW5lX3BhcmFtZXRlcnMudGltZWxpbmVfdmFyaWFibGVzW3RoaXMucHJvZ3Jlc3Mub3JkZXJbdGhpcy5wcm9ncmVzcy5jdXJyZW50X3ZhcmlhYmxlX3NldF1dKSk7XHJcbiAgICAgICAgICAgIC8vIGlmIHByb2dyZXNzLmN1cnJlbnRfbG9jYXRpb24gaXMgLTEsIHRoZW4gdGhlIHRpbWVsaW5lIHZhcmlhYmxlIGlzIGJlaW5nIGV2YWx1YXRlZFxyXG4gICAgICAgICAgICAvLyBpbiBhIGZ1bmN0aW9uIHRoYXQgcnVucyBwcmlvciB0byB0aGUgdHJpYWwgc3RhcnRpbmcsIHNvIHdlIHNob3VsZCB0cmVhdCB0aGF0IHRyaWFsXHJcbiAgICAgICAgICAgIC8vIGFzIGJlaW5nIHRoZSBhY3RpdmUgdHJpYWwgZm9yIHB1cnBvc2VzIG9mIGZpbmRpbmcgdGhlIHZhbHVlIG9mIHRoZSB0aW1lbGluZSB2YXJpYWJsZVxyXG4gICAgICAgICAgICB2YXIgbG9jID0gTWF0aC5tYXgoMCwgdGhpcy5wcm9ncmVzcy5jdXJyZW50X2xvY2F0aW9uKTtcclxuICAgICAgICAgICAgLy8gaWYgbG9jIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9uIHRoaXMgdGltZWxpbmUsIHRoZW4gdGhlIHRpbWVsaW5lXHJcbiAgICAgICAgICAgIC8vIHZhcmlhYmxlIGlzIGJlaW5nIGV2YWx1YXRlZCBpbiBhIGZ1bmN0aW9uIHRoYXQgcnVucyBhZnRlciB0aGUgdHJpYWwgb24gdGhlIHRpbWVsaW5lXHJcbiAgICAgICAgICAgIC8vIGFyZSBjb21wbGV0ZSBidXQgYmVmb3JlIGFkdmFuY2luZyB0byB0aGUgbmV4dCAobGlrZSBhIGxvb3BfZnVuY3Rpb24pLlxyXG4gICAgICAgICAgICAvLyB0cmVhdCB0aGUgbGFzdCBhY3RpdmUgdHJpYWwgYXMgdGhlIGFjdGl2ZSB0cmlhbCBmb3IgdGhpcyBwdXJwb3NlLlxyXG4gICAgICAgICAgICBpZiAobG9jID09IHRoaXMudGltZWxpbmVfcGFyYW1ldGVycy50aW1lbGluZS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGxvYyA9IGxvYyAtIDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gbm93IGZpbmQgdGhlIHZhcmlhYmxlXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRpbWVsaW5lX3BhcmFtZXRlcnMudGltZWxpbmVbbG9jXS5hbGxUaW1lbGluZVZhcmlhYmxlc05hbWVzKHNvX2Zhcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50aW1lbGluZV9wYXJhbWV0ZXJzID09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHNvX2ZhcjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyByZWN1cnNpdmVseSBnZXQgdGhlIG51bWJlciBvZiAqKnRyaWFscyoqIGNvbnRhaW5lZCBpbiB0aGUgdGltZWxpbmVcclxuICAgIC8vIGFzc3VtaW5nIHRoYXQgd2hpbGUgbG9vcHMgZXhlY3V0ZSBleGFjdGx5IG9uY2UgYW5kIGlmIGNvbmRpdGlvbmFsc1xyXG4gICAgLy8gYWx3YXlzIHJ1blxyXG4gICAgbGVuZ3RoKCkge1xyXG4gICAgICAgIHZhciBsZW5ndGggPSAwO1xyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50aW1lbGluZV9wYXJhbWV0ZXJzICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy50aW1lbGluZV9wYXJhbWV0ZXJzLnRpbWVsaW5lLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZW5ndGggKz0gdGhpcy50aW1lbGluZV9wYXJhbWV0ZXJzLnRpbWVsaW5lW2ldLmxlbmd0aCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGxlbmd0aDtcclxuICAgIH1cclxuICAgIC8vIHJldHVybiB0aGUgcGVyY2VudGFnZSBvZiB0cmlhbHMgY29tcGxldGVkLCBncm91cGVkIGF0IHRoZSBmaXJzdCBjaGlsZCBsZXZlbFxyXG4gICAgLy8gY291bnRzIGEgc2V0IG9mIHRyaWFscyBhcyBjb21wbGV0ZSB3aGVuIHRoZSBjaGlsZCBub2RlIGlzIGRvbmVcclxuICAgIHBlcmNlbnRDb21wbGV0ZSgpIHtcclxuICAgICAgICB2YXIgdG90YWxfdHJpYWxzID0gdGhpcy5sZW5ndGgoKTtcclxuICAgICAgICB2YXIgY29tcGxldGVkX3RyaWFscyA9IDA7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnRpbWVsaW5lX3BhcmFtZXRlcnMudGltZWxpbmUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMudGltZWxpbmVfcGFyYW1ldGVycy50aW1lbGluZVtpXS5pc0NvbXBsZXRlKCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbXBsZXRlZF90cmlhbHMgKz0gdGhpcy50aW1lbGluZV9wYXJhbWV0ZXJzLnRpbWVsaW5lW2ldLmxlbmd0aCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoY29tcGxldGVkX3RyaWFscyAvIHRvdGFsX3RyaWFscykgKiAxMDA7XHJcbiAgICB9XHJcbiAgICAvLyByZXNldHMgdGhlIG5vZGUgYW5kIGFsbCBzdWJub2RlcyB0byBvcmlnaW5hbCBzdGF0ZVxyXG4gICAgLy8gYnV0IGluY3JlbWVudHMgdGhlIGN1cnJlbnRfaXRlcmF0aW9uIGNvdW50ZXJcclxuICAgIHJlc2V0KCkge1xyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MuY3VycmVudF9sb2NhdGlvbiA9IC0xO1xyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MuY3VycmVudF9yZXBldGl0aW9uID0gMDtcclxuICAgICAgICB0aGlzLnByb2dyZXNzLmN1cnJlbnRfdmFyaWFibGVfc2V0ID0gMDtcclxuICAgICAgICB0aGlzLnByb2dyZXNzLmN1cnJlbnRfaXRlcmF0aW9uKys7XHJcbiAgICAgICAgdGhpcy5wcm9ncmVzcy5kb25lID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zZXRUaW1lbGluZVZhcmlhYmxlc09yZGVyKCk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRpbWVsaW5lX3BhcmFtZXRlcnMgIT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudGltZWxpbmVfcGFyYW1ldGVycy50aW1lbGluZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50aW1lbGluZV9wYXJhbWV0ZXJzLnRpbWVsaW5lW2ldLnJlc2V0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBtYXJrIHRoaXMgbm9kZSBhcyBmaW5pc2hlZFxyXG4gICAgZW5kKCkge1xyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MuZG9uZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICAvLyByZWN1cnNpdmVseSBlbmQgd2hhdGV2ZXIgc3ViLW5vZGUgaXMgcnVubmluZyB0aGUgY3VycmVudCB0cmlhbFxyXG4gICAgZW5kQWN0aXZlTm9kZSgpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudGltZWxpbmVfcGFyYW1ldGVycyA9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kKCk7XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50X25vZGUuZW5kKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnRpbWVsaW5lX3BhcmFtZXRlcnMudGltZWxpbmVbdGhpcy5wcm9ncmVzcy5jdXJyZW50X2xvY2F0aW9uXS5lbmRBY3RpdmVOb2RlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gZ2V0IGEgdW5pcXVlIElEIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGVcclxuICAgIC8vIHRoZSBJRCByZWZsZWN0cyB0aGUgY3VycmVudCBpdGVyYXRpb24gdGhyb3VnaCB0aGlzIG5vZGUuXHJcbiAgICBJRCgpIHtcclxuICAgICAgICB2YXIgaWQgPSBcIlwiO1xyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wYXJlbnRfbm9kZSA9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBcIjAuXCIgKyB0aGlzLnByb2dyZXNzLmN1cnJlbnRfaXRlcmF0aW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWQgKz0gdGhpcy5wYXJlbnRfbm9kZS5JRCgpICsgXCItXCI7XHJcbiAgICAgICAgICAgIGlkICs9IHRoaXMucmVsYXRpdmVfaWQgKyBcIi5cIiArIHRoaXMucHJvZ3Jlc3MuY3VycmVudF9pdGVyYXRpb247XHJcbiAgICAgICAgICAgIHJldHVybiBpZDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBnZXQgdGhlIElEIG9mIHRoZSBhY3RpdmUgdHJpYWxcclxuICAgIGFjdGl2ZUlEKCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50aW1lbGluZV9wYXJhbWV0ZXJzID09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuSUQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRpbWVsaW5lX3BhcmFtZXRlcnMudGltZWxpbmVbdGhpcy5wcm9ncmVzcy5jdXJyZW50X2xvY2F0aW9uXS5hY3RpdmVJRCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGdldCBhbGwgdGhlIGRhdGEgZ2VuZXJhdGVkIHdpdGhpbiB0aGlzIG5vZGVcclxuICAgIGdlbmVyYXRlZERhdGEoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuanNQc3ljaC5kYXRhLmdldERhdGFCeVRpbWVsaW5lTm9kZSh0aGlzLklEKCkpO1xyXG4gICAgfVxyXG4gICAgLy8gZ2V0IGFsbCB0aGUgdHJpYWxzIG9mIGEgcGFydGljdWxhciB0eXBlXHJcbiAgICB0cmlhbHNPZlR5cGUodHlwZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50aW1lbGluZV9wYXJhbWV0ZXJzID09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMudHJpYWxfcGFyYW1ldGVycy50eXBlID09IHR5cGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyaWFsX3BhcmFtZXRlcnM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciB0cmlhbHMgPSBbXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnRpbWVsaW5lX3BhcmFtZXRlcnMudGltZWxpbmUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy50aW1lbGluZV9wYXJhbWV0ZXJzLnRpbWVsaW5lW2ldLnRyaWFsc09mVHlwZSh0eXBlKTtcclxuICAgICAgICAgICAgICAgIHRyaWFscyA9IHRyaWFscy5jb25jYXQodCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRyaWFscztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBhZGQgbmV3IHRyaWFscyB0byBlbmQgb2YgdGhpcyB0aW1lbGluZVxyXG4gICAgaW5zZXJ0KHBhcmFtZXRlcnMpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudGltZWxpbmVfcGFyYW1ldGVycyA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQ2Fubm90IGFkZCBuZXcgdHJpYWxzIHRvIGEgdHJpYWwtbGV2ZWwgbm9kZS5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnRpbWVsaW5lX3BhcmFtZXRlcnMudGltZWxpbmUucHVzaChuZXcgVGltZWxpbmVOb2RlKHRoaXMuanNQc3ljaCwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0aGlzLm5vZGVfdHJpYWxfZGF0YSksIHBhcmFtZXRlcnMpLCB0aGlzLCB0aGlzLnRpbWVsaW5lX3BhcmFtZXRlcnMudGltZWxpbmUubGVuZ3RoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbmZ1bmN0aW9uIGRlbGF5KG1zKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcclxufVxyXG5jbGFzcyBKc1BzeWNoIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcclxuICAgICAgICB0aGlzLmV4dGVuc2lvbnMgPSB7fTtcclxuICAgICAgICB0aGlzLnR1cmsgPSB0dXJrO1xyXG4gICAgICAgIHRoaXMucmFuZG9taXphdGlvbiA9IHJhbmRvbWl6YXRpb247XHJcbiAgICAgICAgdGhpcy51dGlscyA9IHV0aWxzO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgLy8gcHJpdmF0ZSB2YXJpYWJsZXNcclxuICAgICAgICAvL1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIG9wdGlvbnNcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm9wdHMgPSB7fTtcclxuICAgICAgICAvLyBmbG93IGNvbnRyb2xcclxuICAgICAgICB0aGlzLmdsb2JhbF90cmlhbF9pbmRleCA9IDA7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50X3RyaWFsID0ge307XHJcbiAgICAgICAgdGhpcy5jdXJyZW50X3RyaWFsX2ZpbmlzaGVkID0gZmFsc2U7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogaXMgdGhlIGV4cGVyaW1lbnQgcGF1c2VkP1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucGF1c2VkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy53YWl0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogaXMgdGhlIHBhZ2UgcmV0cmlldmVkIGRpcmVjdGx5IHZpYSBmaWxlOi8vIHByb3RvY29sICh0cnVlKSBvciBob3N0ZWQgb24gYSBzZXJ2ZXIgKGZhbHNlKT9cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZpbGVfcHJvdG9jb2wgPSBmYWxzZTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBpcyB0aGUgZXhwZXJpbWVudCBydW5uaW5nIGluIGBzaW11bGF0ZSgpYCBtb2RlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zaW11bGF0aW9uX21vZGUgPSBudWxsO1xyXG4gICAgICAgIC8vIHN0b3JpbmcgYSBzaW5nbGUgd2ViYXVkaW8gY29udGV4dCB0byBwcmV2ZW50IHByb2JsZW1zIHdpdGggbXVsdGlwbGUgaW5pdHNcclxuICAgICAgICAvLyBvZiBqc1BzeWNoXHJcbiAgICAgICAgdGhpcy53ZWJhdWRpb19jb250ZXh0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLmludGVybmFsID0ge1xyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogdGhpcyBmbGFnIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UgYXJlIGluIGEgc2NvcGUgd2hlcmVcclxuICAgICAgICAgICAgICoganNQc3ljaC50aW1lbGluZVZhcmlhYmxlKCkgc2hvdWxkIGJlIGV4ZWN1dGVkIGltbWVkaWF0ZWx5IG9yXHJcbiAgICAgICAgICAgICAqIHdoZXRoZXIgaXQgc2hvdWxkIHJldHVybiBhIGZ1bmN0aW9uIHRvIGFjY2VzcyB0aGUgdmFyaWFibGUgbGF0ZXIuXHJcbiAgICAgICAgICAgICAqXHJcbiAgICAgICAgICAgICAqKi9cclxuICAgICAgICAgICAgY2FsbF9pbW1lZGlhdGU6IGZhbHNlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5wcm9ncmVzc19iYXJfYW1vdW50ID0gMDtcclxuICAgICAgICAvLyBvdmVycmlkZSBkZWZhdWx0IG9wdGlvbnMgaWYgdXNlciBzcGVjaWZpZXMgYW4gb3B0aW9uXHJcbiAgICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oeyBkaXNwbGF5X2VsZW1lbnQ6IHVuZGVmaW5lZCwgb25fZmluaXNoOiAoKSA9PiB7IH0sIG9uX3RyaWFsX3N0YXJ0OiAoKSA9PiB7IH0sIG9uX3RyaWFsX2ZpbmlzaDogKCkgPT4geyB9LCBvbl9kYXRhX3VwZGF0ZTogKCkgPT4geyB9LCBvbl9pbnRlcmFjdGlvbl9kYXRhX3VwZGF0ZTogKCkgPT4geyB9LCBvbl9jbG9zZTogKCkgPT4geyB9LCB1c2Vfd2ViYXVkaW86IHRydWUsIGV4Y2x1c2lvbnM6IHt9LCBzaG93X3Byb2dyZXNzX2JhcjogZmFsc2UsIG1lc3NhZ2VfcHJvZ3Jlc3NfYmFyOiBcIkNvbXBsZXRpb24gUHJvZ3Jlc3NcIiwgYXV0b191cGRhdGVfcHJvZ3Jlc3NfYmFyOiB0cnVlLCBkZWZhdWx0X2l0aTogMCwgbWluaW11bV92YWxpZF9ydDogMCwgZXhwZXJpbWVudF93aWR0aDogbnVsbCwgb3ZlcnJpZGVfc2FmZV9tb2RlOiBmYWxzZSwgY2FzZV9zZW5zaXRpdmVfcmVzcG9uc2VzOiBmYWxzZSwgZXh0ZW5zaW9uczogW10gfSwgb3B0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5vcHRzID0gb3B0aW9ucztcclxuICAgICAgICBhdXRvQmluZCh0aGlzKTsgLy8gc28gd2UgY2FuIHBhc3MgSnNQc3ljaCBtZXRob2RzIGFzIGNhbGxiYWNrcyBhbmQgYHRoaXNgIHJlbWFpbnMgdGhlIEpzUHN5Y2ggaW5zdGFuY2VcclxuICAgICAgICB0aGlzLndlYmF1ZGlvX2NvbnRleHQgPVxyXG4gICAgICAgICAgICB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiB3aW5kb3cuQXVkaW9Db250ZXh0ICE9PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgICAgICA/IG5ldyBBdWRpb0NvbnRleHQoKVxyXG4gICAgICAgICAgICAgICAgOiBudWxsO1xyXG4gICAgICAgIC8vIGRldGVjdCB3aGV0aGVyIHBhZ2UgaXMgcnVubmluZyBpbiBicm93c2VyIGFzIGEgbG9jYWwgZmlsZSwgYW5kIGlmIHNvLCBkaXNhYmxlIHdlYiBhdWRpbyBhbmQgdmlkZW8gcHJlbG9hZGluZyB0byBwcmV2ZW50IENPUlMgaXNzdWVzXHJcbiAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PSBcImZpbGU6XCIgJiZcclxuICAgICAgICAgICAgKG9wdGlvbnMub3ZlcnJpZGVfc2FmZV9tb2RlID09PSBmYWxzZSB8fCB0eXBlb2Ygb3B0aW9ucy5vdmVycmlkZV9zYWZlX21vZGUgPT09IFwidW5kZWZpbmVkXCIpKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMudXNlX3dlYmF1ZGlvID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsZV9wcm90b2NvbCA9IHRydWU7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcImpzUHN5Y2ggZGV0ZWN0ZWQgdGhhdCBpdCBpcyBydW5uaW5nIHZpYSB0aGUgZmlsZTovLyBwcm90b2NvbCBhbmQgbm90IG9uIGEgd2ViIHNlcnZlci4gXCIgK1xyXG4gICAgICAgICAgICAgICAgXCJUbyBwcmV2ZW50IGlzc3VlcyB3aXRoIGNyb3NzLW9yaWdpbiByZXF1ZXN0cywgV2ViIEF1ZGlvIGFuZCB2aWRlbyBwcmVsb2FkaW5nIGhhdmUgYmVlbiBkaXNhYmxlZC4gXCIgK1xyXG4gICAgICAgICAgICAgICAgXCJJZiB5b3Ugd291bGQgbGlrZSB0byBvdmVycmlkZSB0aGlzIHNldHRpbmcsIHlvdSBjYW4gc2V0ICdvdmVycmlkZV9zYWZlX21vZGUnIHRvICd0cnVlJyBpbiBpbml0SnNQc3ljaC4gXCIgK1xyXG4gICAgICAgICAgICAgICAgXCJGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlOiBodHRwczovL3d3dy5qc3BzeWNoLm9yZy9vdmVydmlldy9ydW5uaW5nLWV4cGVyaW1lbnRzXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpbml0aWFsaXplIG1vZHVsZXNcclxuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgSnNQc3ljaERhdGEodGhpcyk7XHJcbiAgICAgICAgdGhpcy5wbHVnaW5BUEkgPSBjcmVhdGVKb2ludFBsdWdpbkFQSU9iamVjdCh0aGlzKTtcclxuICAgICAgICAvLyBjcmVhdGUgaW5zdGFuY2VzIG9mIGV4dGVuc2lvbnNcclxuICAgICAgICBmb3IgKGNvbnN0IGV4dGVuc2lvbiBvZiBvcHRpb25zLmV4dGVuc2lvbnMpIHtcclxuICAgICAgICAgICAgdGhpcy5leHRlbnNpb25zW2V4dGVuc2lvbi50eXBlLmluZm8ubmFtZV0gPSBuZXcgZXh0ZW5zaW9uLnR5cGUodGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGluaXRpYWxpemUgYXVkaW8gY29udGV4dCBiYXNlZCBvbiBvcHRpb25zIGFuZCBicm93c2VyIGNhcGFiaWxpdGllc1xyXG4gICAgICAgIHRoaXMucGx1Z2luQVBJLmluaXRBdWRpbygpO1xyXG4gICAgfVxyXG4gICAgdmVyc2lvbigpIHtcclxuICAgICAgICByZXR1cm4gdmVyc2lvbjtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU3RhcnRzIGFuIGV4cGVyaW1lbnQgdXNpbmcgdGhlIHByb3ZpZGVkIHRpbWVsaW5lIGFuZCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW5cclxuICAgICAqIHRoZSBleHBlcmltZW50IGlzIGZpbmlzaGVkLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB0aW1lbGluZSBUaGUgdGltZWxpbmUgdG8gYmUgcnVuXHJcbiAgICAgKi9cclxuICAgIHJ1bih0aW1lbGluZSkge1xyXG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGltZWxpbmUgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJObyB0aW1lbGluZSBkZWNsYXJlZCBpbiBqc1BzeWNoLnJ1bi4gQ2Fubm90IHN0YXJ0IGV4cGVyaW1lbnQuXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aW1lbGluZS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJObyB0cmlhbHMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSB0aW1lbGluZSAodGhlIHRpbWVsaW5lIGlzIGFuIGVtcHR5IGFycmF5KS4gQ2Fubm90IHN0YXJ0IGV4cGVyaW1lbnQuXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBleHBlcmltZW50IHRpbWVsaW5lXHJcbiAgICAgICAgICAgIHRoaXMudGltZWxpbmVEZXNjcmlwdGlvbiA9IHRpbWVsaW5lO1xyXG4gICAgICAgICAgICB0aGlzLnRpbWVsaW5lID0gbmV3IFRpbWVsaW5lTm9kZSh0aGlzLCB7IHRpbWVsaW5lIH0pO1xyXG4gICAgICAgICAgICB5aWVsZCB0aGlzLnByZXBhcmVEb20oKTtcclxuICAgICAgICAgICAgeWllbGQgdGhpcy5jaGVja0V4Y2x1c2lvbnModGhpcy5vcHRzLmV4Y2x1c2lvbnMpO1xyXG4gICAgICAgICAgICB5aWVsZCB0aGlzLmxvYWRFeHRlbnNpb25zKHRoaXMub3B0cy5leHRlbnNpb25zKTtcclxuICAgICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNldEF0dHJpYnV0ZShcImpzcHN5Y2hcIiwgXCJwcmVzZW50XCIpO1xyXG4gICAgICAgICAgICB0aGlzLnN0YXJ0RXhwZXJpbWVudCgpO1xyXG4gICAgICAgICAgICB5aWVsZCB0aGlzLmZpbmlzaGVkO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgc2ltdWxhdGUodGltZWxpbmUsIHNpbXVsYXRpb25fbW9kZSA9IFwiZGF0YS1vbmx5XCIsIHNpbXVsYXRpb25fb3B0aW9ucyA9IHt9KSB7XHJcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICAgICAgdGhpcy5zaW11bGF0aW9uX21vZGUgPSBzaW11bGF0aW9uX21vZGU7XHJcbiAgICAgICAgICAgIHRoaXMuc2ltdWxhdGlvbl9vcHRpb25zID0gc2ltdWxhdGlvbl9vcHRpb25zO1xyXG4gICAgICAgICAgICB5aWVsZCB0aGlzLnJ1bih0aW1lbGluZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBnZXRQcm9ncmVzcygpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0b3RhbF90cmlhbHM6IHR5cGVvZiB0aGlzLnRpbWVsaW5lID09PSBcInVuZGVmaW5lZFwiID8gdW5kZWZpbmVkIDogdGhpcy50aW1lbGluZS5sZW5ndGgoKSxcclxuICAgICAgICAgICAgY3VycmVudF90cmlhbF9nbG9iYWw6IHRoaXMuZ2xvYmFsX3RyaWFsX2luZGV4LFxyXG4gICAgICAgICAgICBwZXJjZW50X2NvbXBsZXRlOiB0eXBlb2YgdGhpcy50aW1lbGluZSA9PT0gXCJ1bmRlZmluZWRcIiA/IDAgOiB0aGlzLnRpbWVsaW5lLnBlcmNlbnRDb21wbGV0ZSgpLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBnZXRTdGFydFRpbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwX3N0YXJ0X3RpbWU7XHJcbiAgICB9XHJcbiAgICBnZXRUb3RhbFRpbWUoKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmV4cF9zdGFydF90aW1lID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSB0aGlzLmV4cF9zdGFydF90aW1lLmdldFRpbWUoKTtcclxuICAgIH1cclxuICAgIGdldERpc3BsYXlFbGVtZW50KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLkRPTV90YXJnZXQ7XHJcbiAgICB9XHJcbiAgICBnZXREaXNwbGF5Q29udGFpbmVyRWxlbWVudCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ET01fY29udGFpbmVyO1xyXG4gICAgfVxyXG4gICAgZmluaXNoVHJpYWwoZGF0YSA9IHt9KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudF90cmlhbF9maW5pc2hlZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY3VycmVudF90cmlhbF9maW5pc2hlZCA9IHRydWU7XHJcbiAgICAgICAgLy8gcmVtb3ZlIGFueSBDU1MgY2xhc3NlcyB0aGF0IHdlcmUgYWRkZWQgdG8gdGhlIERPTSB2aWEgY3NzX2NsYXNzZXMgcGFyYW1ldGVyXHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmN1cnJlbnRfdHJpYWwuY3NzX2NsYXNzZXMgIT09IFwidW5kZWZpbmVkXCIgJiZcclxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLmN1cnJlbnRfdHJpYWwuY3NzX2NsYXNzZXMpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuRE9NX3RhcmdldC5jbGFzc0xpc3QucmVtb3ZlKC4uLnRoaXMuY3VycmVudF90cmlhbC5jc3NfY2xhc3Nlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHdyaXRlIHRoZSBkYXRhIGZyb20gdGhlIHRyaWFsXHJcbiAgICAgICAgdGhpcy5kYXRhLndyaXRlKGRhdGEpO1xyXG4gICAgICAgIC8vIGdldCBiYWNrIHRoZSBkYXRhIHdpdGggYWxsIG9mIHRoZSBkZWZhdWx0cyBpblxyXG4gICAgICAgIGNvbnN0IHRyaWFsX2RhdGEgPSB0aGlzLmRhdGEuZ2V0KCkuZmlsdGVyKHsgdHJpYWxfaW5kZXg6IHRoaXMuZ2xvYmFsX3RyaWFsX2luZGV4IH0pO1xyXG4gICAgICAgIC8vIGZvciB0cmlhbC1sZXZlbCBjYWxsYmFja3MsIHdlIGp1c3Qgd2FudCB0byBwYXNzIGluIGEgcmVmZXJlbmNlIHRvIHRoZSB2YWx1ZXNcclxuICAgICAgICAvLyBvZiB0aGUgRGF0YUNvbGxlY3Rpb24sIGZvciBlYXN5IGFjY2VzcyBhbmQgZWRpdGluZy5cclxuICAgICAgICBjb25zdCB0cmlhbF9kYXRhX3ZhbHVlcyA9IHRyaWFsX2RhdGEudmFsdWVzKClbMF07XHJcbiAgICAgICAgY29uc3QgY3VycmVudF90cmlhbCA9IHRoaXMuY3VycmVudF90cmlhbDtcclxuICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRfdHJpYWwuc2F2ZV90cmlhbF9wYXJhbWV0ZXJzID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGN1cnJlbnRfdHJpYWwuc2F2ZV90cmlhbF9wYXJhbWV0ZXJzKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qga2V5X3ZhbCA9IGN1cnJlbnRfdHJpYWwuc2F2ZV90cmlhbF9wYXJhbWV0ZXJzW2tleV07XHJcbiAgICAgICAgICAgICAgICBpZiAoa2V5X3ZhbCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudF90cmlhbFtrZXldID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgSW52YWxpZCBwYXJhbWV0ZXIgc3BlY2lmaWVkIGluIHNhdmVfdHJpYWxfcGFyYW1ldGVycy4gVHJpYWwgaGFzIG5vIHByb3BlcnR5IGNhbGxlZCBcIiR7a2V5fVwiLmApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgY3VycmVudF90cmlhbFtrZXldID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJpYWxfZGF0YV92YWx1ZXNba2V5XSA9IGN1cnJlbnRfdHJpYWxba2V5XS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJpYWxfZGF0YV92YWx1ZXNba2V5XSA9IGN1cnJlbnRfdHJpYWxba2V5XTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoa2V5X3ZhbCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBhbGxvdyBpbnRlcm5hbF9ub2RlX2lkIG9yIHRyaWFsX2luZGV4IHRvIGJlIGRlbGV0ZWQgYmVjYXVzZSBpdCB3b3VsZCBicmVhayBvdGhlciB0aGluZ3NcclxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ICE9PSBcImludGVybmFsX25vZGVfaWRcIiAmJiBrZXkgIT09IFwidHJpYWxfaW5kZXhcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdHJpYWxfZGF0YV92YWx1ZXNba2V5XTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaGFuZGxlIGV4dGVuc2lvbiBjYWxsYmFja3NcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50X3RyaWFsLmV4dGVuc2lvbnMpKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZXh0ZW5zaW9uIG9mIGN1cnJlbnRfdHJpYWwuZXh0ZW5zaW9ucykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXh0X2RhdGFfdmFsdWVzID0gdGhpcy5leHRlbnNpb25zW2V4dGVuc2lvbi50eXBlLmluZm8ubmFtZV0ub25fZmluaXNoKGV4dGVuc2lvbi5wYXJhbXMpO1xyXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0cmlhbF9kYXRhX3ZhbHVlcywgZXh0X2RhdGFfdmFsdWVzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBhYm91dCB0byBleGVjdXRlIGxvdHMgb2YgY2FsbGJhY2tzLCBzbyBzd2l0Y2ggY29udGV4dC5cclxuICAgICAgICB0aGlzLmludGVybmFsLmNhbGxfaW1tZWRpYXRlID0gdHJ1ZTtcclxuICAgICAgICAvLyBoYW5kbGUgY2FsbGJhY2sgYXQgcGx1Z2luIGxldmVsXHJcbiAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50X3RyaWFsLm9uX2ZpbmlzaCA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRfdHJpYWwub25fZmluaXNoKHRyaWFsX2RhdGFfdmFsdWVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaGFuZGxlIGNhbGxiYWNrIGF0IHdob2xlLWV4cGVyaW1lbnQgbGV2ZWxcclxuICAgICAgICB0aGlzLm9wdHMub25fdHJpYWxfZmluaXNoKHRyaWFsX2RhdGFfdmFsdWVzKTtcclxuICAgICAgICAvLyBhZnRlciB0aGUgYWJvdmUgY2FsbGJhY2tzIGFyZSBjb21wbGV0ZSwgdGhlbiB0aGUgZGF0YSBzaG91bGQgYmUgZmluYWxpemVkXHJcbiAgICAgICAgLy8gZm9yIHRoaXMgdHJpYWwuIGNhbGwgdGhlIG9uX2RhdGFfdXBkYXRlIGhhbmRsZXIsIHBhc3NpbmcgaW4gdGhlIHNhbWVcclxuICAgICAgICAvLyBkYXRhIG9iamVjdCB0aGF0IGp1c3Qgd2VudCB0aHJvdWdoIHRoZSB0cmlhbCdzIGZpbmlzaCBoYW5kbGVycy5cclxuICAgICAgICB0aGlzLm9wdHMub25fZGF0YV91cGRhdGUodHJpYWxfZGF0YV92YWx1ZXMpO1xyXG4gICAgICAgIC8vIGRvbmUgd2l0aCBjYWxsYmFja3NcclxuICAgICAgICB0aGlzLmludGVybmFsLmNhbGxfaW1tZWRpYXRlID0gZmFsc2U7XHJcbiAgICAgICAgLy8gd2FpdCBmb3IgaXRpXHJcbiAgICAgICAgaWYgKHRoaXMuc2ltdWxhdGlvbl9tb2RlID09PSBcImRhdGEtb25seVwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmV4dFRyaWFsKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBjdXJyZW50X3RyaWFsLnBvc3RfdHJpYWxfZ2FwID09PSBudWxsIHx8XHJcbiAgICAgICAgICAgIHR5cGVvZiBjdXJyZW50X3RyaWFsLnBvc3RfdHJpYWxfZ2FwID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuZGVmYXVsdF9pdGkgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHRoaXMubmV4dFRyaWFsLCB0aGlzLm9wdHMuZGVmYXVsdF9pdGkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0VHJpYWwoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRfdHJpYWwucG9zdF90cmlhbF9nYXAgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHRoaXMubmV4dFRyaWFsLCBjdXJyZW50X3RyaWFsLnBvc3RfdHJpYWxfZ2FwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubmV4dFRyaWFsKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbmRFeHBlcmltZW50KGVuZF9tZXNzYWdlID0gXCJcIiwgZGF0YSA9IHt9KSB7XHJcbiAgICAgICAgdGhpcy50aW1lbGluZS5lbmRfbWVzc2FnZSA9IGVuZF9tZXNzYWdlO1xyXG4gICAgICAgIHRoaXMudGltZWxpbmUuZW5kKCk7XHJcbiAgICAgICAgdGhpcy5wbHVnaW5BUEkuY2FuY2VsQWxsS2V5Ym9hcmRSZXNwb25zZXMoKTtcclxuICAgICAgICB0aGlzLnBsdWdpbkFQSS5jbGVhckFsbFRpbWVvdXRzKCk7XHJcbiAgICAgICAgdGhpcy5maW5pc2hUcmlhbChkYXRhKTtcclxuICAgIH1cclxuICAgIGVuZEN1cnJlbnRUaW1lbGluZSgpIHtcclxuICAgICAgICB0aGlzLnRpbWVsaW5lLmVuZEFjdGl2ZU5vZGUoKTtcclxuICAgIH1cclxuICAgIGdldEN1cnJlbnRUcmlhbCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50X3RyaWFsO1xyXG4gICAgfVxyXG4gICAgZ2V0SW5pdFNldHRpbmdzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9wdHM7XHJcbiAgICB9XHJcbiAgICBnZXRDdXJyZW50VGltZWxpbmVOb2RlSUQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGltZWxpbmUuYWN0aXZlSUQoKTtcclxuICAgIH1cclxuICAgIHRpbWVsaW5lVmFyaWFibGUodmFybmFtZSwgaW1tZWRpYXRlID0gZmFsc2UpIHtcclxuICAgICAgICBpZiAodGhpcy5pbnRlcm5hbC5jYWxsX2ltbWVkaWF0ZSB8fCBpbW1lZGlhdGUgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGltZWxpbmUudGltZWxpbmVWYXJpYWJsZSh2YXJuYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0aW1lbGluZVZhcmlhYmxlUGxhY2Vob2xkZXI6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB0aW1lbGluZVZhcmlhYmxlRnVuY3Rpb246ICgpID0+IHRoaXMudGltZWxpbmUudGltZWxpbmVWYXJpYWJsZSh2YXJuYW1lKSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXRBbGxUaW1lbGluZVZhcmlhYmxlcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50aW1lbGluZS5hbGxUaW1lbGluZVZhcmlhYmxlcygpO1xyXG4gICAgfVxyXG4gICAgYWRkTm9kZVRvRW5kT2ZUaW1lbGluZShuZXdfdGltZWxpbmUsIHByZWxvYWRfY2FsbGJhY2spIHtcclxuICAgICAgICB0aGlzLnRpbWVsaW5lLmluc2VydChuZXdfdGltZWxpbmUpO1xyXG4gICAgfVxyXG4gICAgcGF1c2VFeHBlcmltZW50KCkge1xyXG4gICAgICAgIHRoaXMucGF1c2VkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJlc3VtZUV4cGVyaW1lbnQoKSB7XHJcbiAgICAgICAgdGhpcy5wYXVzZWQgPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy53YWl0aW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMud2FpdGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLm5leHRUcmlhbCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGxvYWRGYWlsKG1lc3NhZ2UpIHtcclxuICAgICAgICBtZXNzYWdlID0gbWVzc2FnZSB8fCBcIjxwPlRoZSBleHBlcmltZW50IGZhaWxlZCB0byBsb2FkLjwvcD5cIjtcclxuICAgICAgICB0aGlzLkRPTV90YXJnZXQuaW5uZXJIVE1MID0gbWVzc2FnZTtcclxuICAgIH1cclxuICAgIGdldFNhZmVNb2RlU3RhdHVzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZpbGVfcHJvdG9jb2w7XHJcbiAgICB9XHJcbiAgICBnZXRUaW1lbGluZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50aW1lbGluZURlc2NyaXB0aW9uO1xyXG4gICAgfVxyXG4gICAgcHJlcGFyZURvbSgpIHtcclxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xyXG4gICAgICAgICAgICAvLyBXYWl0IHVudGlsIHRoZSBkb2N1bWVudCBpcyByZWFkeVxyXG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSAhPT0gXCJjb21wbGV0ZVwiKSB7XHJcbiAgICAgICAgICAgICAgICB5aWVsZCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCByZXNvbHZlKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdHM7XHJcbiAgICAgICAgICAgIC8vIHNldCBET00gZWxlbWVudCB3aGVyZSBqc1BzeWNoIHdpbGwgcmVuZGVyIGNvbnRlbnRcclxuICAgICAgICAgICAgLy8gaWYgdW5kZWZpbmVkLCB0aGVuIGpzUHN5Y2ggd2lsbCB1c2UgdGhlIDxib2R5PiB0YWcgYW5kIHRoZSBlbnRpcmUgcGFnZVxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZGlzcGxheV9lbGVtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhIGJvZHkgZWxlbWVudCBvbiB0aGUgcGFnZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJib2R5XCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGJvZHkgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJvZHlcIikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gdXNpbmcgdGhlIGZ1bGwgcGFnZSwgc28gd2UgbmVlZCB0aGUgSFRNTCBlbGVtZW50IHRvXHJcbiAgICAgICAgICAgICAgICAvLyBoYXZlIDEwMCUgaGVpZ2h0LCBhbmQgYm9keSB0byBiZSBmdWxsIHdpZHRoIGFuZCBoZWlnaHQgd2l0aFxyXG4gICAgICAgICAgICAgICAgLy8gbm8gbWFyZ2luXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiaHRtbFwiKS5zdHlsZS5oZWlnaHQgPSBcIjEwMCVcIjtcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJib2R5XCIpLnN0eWxlLm1hcmdpbiA9IFwiMHB4XCI7XHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiYm9keVwiKS5zdHlsZS5oZWlnaHQgPSBcIjEwMCVcIjtcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJib2R5XCIpLnN0eWxlLndpZHRoID0gXCIxMDAlXCI7XHJcbiAgICAgICAgICAgICAgICBvcHRpb25zLmRpc3BsYXlfZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJib2R5XCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIGRpc3BsYXkgZWxlbWVudCBleGlzdHMgb24gdGhlIHBhZ2VcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRpc3BsYXkgPSBvcHRpb25zLmRpc3BsYXlfZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICA/IG9wdGlvbnMuZGlzcGxheV9lbGVtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI1wiICsgb3B0aW9ucy5kaXNwbGF5X2VsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRpc3BsYXkgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiVGhlIGRpc3BsYXlfZWxlbWVudCBzcGVjaWZpZWQgaW4gaW5pdEpzUHN5Y2goKSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgRE9NLlwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZGlzcGxheV9lbGVtZW50ID0gZGlzcGxheTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcHRpb25zLmRpc3BsYXlfZWxlbWVudC5pbm5lckhUTUwgPVxyXG4gICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJqc3BzeWNoLWNvbnRlbnQtd3JhcHBlclwiPjxkaXYgaWQ9XCJqc3BzeWNoLWNvbnRlbnRcIj48L2Rpdj48L2Rpdj4nO1xyXG4gICAgICAgICAgICB0aGlzLkRPTV9jb250YWluZXIgPSBvcHRpb25zLmRpc3BsYXlfZWxlbWVudDtcclxuICAgICAgICAgICAgdGhpcy5ET01fdGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNqc3BzeWNoLWNvbnRlbnRcIik7XHJcbiAgICAgICAgICAgIC8vIHNldCBleHBlcmltZW50X3dpZHRoIGlmIG5vdCBudWxsXHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmV4cGVyaW1lbnRfd2lkdGggIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuRE9NX3RhcmdldC5zdHlsZS53aWR0aCA9IG9wdGlvbnMuZXhwZXJpbWVudF93aWR0aCArIFwicHhcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBhZGQgdGFiSW5kZXggYXR0cmlidXRlIHRvIHNjb3BlIGV2ZW50IGxpc3RlbmVyc1xyXG4gICAgICAgICAgICBvcHRpb25zLmRpc3BsYXlfZWxlbWVudC50YWJJbmRleCA9IDA7XHJcbiAgICAgICAgICAgIC8vIGFkZCBDU1MgY2xhc3MgdG8gRE9NX3RhcmdldFxyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5kaXNwbGF5X2VsZW1lbnQuY2xhc3NOYW1lLmluZGV4T2YoXCJqc3BzeWNoLWRpc3BsYXktZWxlbWVudFwiKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZGlzcGxheV9lbGVtZW50LmNsYXNzTmFtZSArPSBcIiBqc3BzeWNoLWRpc3BsYXktZWxlbWVudFwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuRE9NX3RhcmdldC5jbGFzc05hbWUgKz0gXCJqc3BzeWNoLWNvbnRlbnRcIjtcclxuICAgICAgICAgICAgLy8gY3JlYXRlIGxpc3RlbmVycyBmb3IgdXNlciBicm93c2VyIGludGVyYWN0aW9uXHJcbiAgICAgICAgICAgIHRoaXMuZGF0YS5jcmVhdGVJbnRlcmFjdGlvbkxpc3RlbmVycygpO1xyXG4gICAgICAgICAgICAvLyBhZGQgZXZlbnQgZm9yIGNsb3Npbmcgd2luZG93XHJcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsIG9wdGlvbnMub25fY2xvc2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgbG9hZEV4dGVuc2lvbnMoZXh0ZW5zaW9ucykge1xyXG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XHJcbiAgICAgICAgICAgIC8vIHJ1biB0aGUgLmluaXRpYWxpemUgbWV0aG9kIG9mIGFueSBleHRlbnNpb25zIHRoYXQgYXJlIGluIHVzZVxyXG4gICAgICAgICAgICAvLyB0aGVzZSBzaG91bGQgcmV0dXJuIGEgUHJvbWlzZSB0byBpbmRpY2F0ZSB3aGVuIGxvYWRpbmcgaXMgY29tcGxldGVcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHlpZWxkIFByb21pc2UuYWxsKGV4dGVuc2lvbnMubWFwKChleHRlbnNpb24pID0+IHRoaXMuZXh0ZW5zaW9uc1tleHRlbnNpb24udHlwZS5pbmZvLm5hbWVdLmluaXRpYWxpemUoZXh0ZW5zaW9uLnBhcmFtcyB8fCB7fSkpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZXJyb3JfbWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcl9tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcl9tZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgc3RhcnRFeHBlcmltZW50KCkge1xyXG4gICAgICAgIHRoaXMuZmluaXNoZWQgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlc29sdmVGaW5pc2hlZFByb21pc2UgPSByZXNvbHZlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIHNob3cgcHJvZ3Jlc3MgYmFyIGlmIHJlcXVlc3RlZFxyXG4gICAgICAgIGlmICh0aGlzLm9wdHMuc2hvd19wcm9ncmVzc19iYXIgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy5kcmF3UHJvZ3Jlc3NCYXIodGhpcy5vcHRzLm1lc3NhZ2VfcHJvZ3Jlc3NfYmFyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gcmVjb3JkIHRoZSBzdGFydCB0aW1lXHJcbiAgICAgICAgdGhpcy5leHBfc3RhcnRfdGltZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgLy8gYmVnaW4hXHJcbiAgICAgICAgdGhpcy50aW1lbGluZS5hZHZhbmNlKCk7XHJcbiAgICAgICAgdGhpcy5kb1RyaWFsKHRoaXMudGltZWxpbmUudHJpYWwoKSk7XHJcbiAgICB9XHJcbiAgICBmaW5pc2hFeHBlcmltZW50KCkge1xyXG4gICAgICAgIGNvbnN0IGZpbmlzaF9yZXN1bHQgPSB0aGlzLm9wdHMub25fZmluaXNoKHRoaXMuZGF0YS5nZXQoKSk7XHJcbiAgICAgICAgY29uc3QgZG9uZV9oYW5kbGVyID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMudGltZWxpbmUuZW5kX21lc3NhZ2UgIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuRE9NX3RhcmdldC5pbm5lckhUTUwgPSB0aGlzLnRpbWVsaW5lLmVuZF9tZXNzYWdlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZUZpbmlzaGVkUHJvbWlzZSgpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKGZpbmlzaF9yZXN1bHQpIHtcclxuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKGZpbmlzaF9yZXN1bHQpLnRoZW4oZG9uZV9oYW5kbGVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGRvbmVfaGFuZGxlcigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIG5leHRUcmlhbCgpIHtcclxuICAgICAgICAvLyBpZiBleHBlcmltZW50IGlzIHBhdXNlZCwgZG9uJ3QgZG8gYW55dGhpbmcuXHJcbiAgICAgICAgaWYgKHRoaXMucGF1c2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMud2FpdGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5nbG9iYWxfdHJpYWxfaW5kZXgrKztcclxuICAgICAgICAvLyBhZHZhbmNlIHRpbWVsaW5lXHJcbiAgICAgICAgdGhpcy50aW1lbGluZS5tYXJrQ3VycmVudFRyaWFsQ29tcGxldGUoKTtcclxuICAgICAgICBjb25zdCBjb21wbGV0ZSA9IHRoaXMudGltZWxpbmUuYWR2YW5jZSgpO1xyXG4gICAgICAgIC8vIHVwZGF0ZSBwcm9ncmVzcyBiYXIgaWYgc2hvd25cclxuICAgICAgICBpZiAodGhpcy5vcHRzLnNob3dfcHJvZ3Jlc3NfYmFyID09PSB0cnVlICYmIHRoaXMub3B0cy5hdXRvX3VwZGF0ZV9wcm9ncmVzc19iYXIgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVQcm9ncmVzc0JhcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjaGVjayBpZiBleHBlcmltZW50IGlzIG92ZXJcclxuICAgICAgICBpZiAoY29tcGxldGUpIHtcclxuICAgICAgICAgICAgdGhpcy5maW5pc2hFeHBlcmltZW50KCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5kb1RyaWFsKHRoaXMudGltZWxpbmUudHJpYWwoKSk7XHJcbiAgICB9XHJcbiAgICBkb1RyaWFsKHRyaWFsKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50X3RyaWFsID0gdHJpYWw7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50X3RyaWFsX2ZpbmlzaGVkID0gZmFsc2U7XHJcbiAgICAgICAgLy8gcHJvY2VzcyBhbGwgdGltZWxpbmUgdmFyaWFibGVzIGZvciB0aGlzIHRyaWFsXHJcbiAgICAgICAgdGhpcy5ldmFsdWF0ZVRpbWVsaW5lVmFyaWFibGVzKHRyaWFsKTtcclxuICAgICAgICBpZiAodHlwZW9mIHRyaWFsLnR5cGUgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE1pZ3JhdGlvbkVycm9yKFwiQSBzdHJpbmcgd2FzIHByb3ZpZGVkIGFzIHRoZSB0cmlhbCdzIGB0eXBlYCBwYXJhbWV0ZXIuIFNpbmNlIGpzUHN5Y2ggdjcsIHRoZSBgdHlwZWAgcGFyYW1ldGVyIG5lZWRzIHRvIGJlIGEgcGx1Z2luIG9iamVjdC5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGluc3RhbnRpYXRlIHRoZSBwbHVnaW4gZm9yIHRoaXMgdHJpYWxcclxuICAgICAgICB0cmlhbC50eXBlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhdXRvQmluZChuZXcgdHJpYWwudHlwZSh0aGlzKSkpLCB7IGluZm86IHRyaWFsLnR5cGUuaW5mbyB9KTtcclxuICAgICAgICAvLyBldmFsdWF0ZSB2YXJpYWJsZXMgdGhhdCBhcmUgZnVuY3Rpb25zXHJcbiAgICAgICAgdGhpcy5ldmFsdWF0ZUZ1bmN0aW9uUGFyYW1ldGVycyh0cmlhbCk7XHJcbiAgICAgICAgLy8gZ2V0IGRlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXHJcbiAgICAgICAgdGhpcy5zZXREZWZhdWx0VmFsdWVzKHRyaWFsKTtcclxuICAgICAgICAvLyBhYm91dCB0byBleGVjdXRlIGNhbGxiYWNrc1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWwuY2FsbF9pbW1lZGlhdGUgPSB0cnVlO1xyXG4gICAgICAgIC8vIGNhbGwgZXhwZXJpbWVudCB3aWRlIGNhbGxiYWNrXHJcbiAgICAgICAgdGhpcy5vcHRzLm9uX3RyaWFsX3N0YXJ0KHRyaWFsKTtcclxuICAgICAgICAvLyBjYWxsIHRyaWFsIHNwZWNpZmljIGNhbGxiYWNrIGlmIGl0IGV4aXN0c1xyXG4gICAgICAgIGlmICh0eXBlb2YgdHJpYWwub25fc3RhcnQgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICB0cmlhbC5vbl9zdGFydCh0cmlhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNhbGwgYW55IG9uX3N0YXJ0IGZ1bmN0aW9ucyBmb3IgZXh0ZW5zaW9uc1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRyaWFsLmV4dGVuc2lvbnMpKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZXh0ZW5zaW9uIG9mIHRyaWFsLmV4dGVuc2lvbnMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uc1tleHRlbnNpb24udHlwZS5pbmZvLm5hbWVdLm9uX3N0YXJ0KGV4dGVuc2lvbi5wYXJhbXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGFwcGx5IHRoZSBmb2N1cyB0byB0aGUgZWxlbWVudCBjb250YWluaW5nIHRoZSBleHBlcmltZW50LlxyXG4gICAgICAgIHRoaXMuRE9NX2NvbnRhaW5lci5mb2N1cygpO1xyXG4gICAgICAgIC8vIHJlc2V0IHRoZSBzY3JvbGwgb24gdGhlIERPTSB0YXJnZXRcclxuICAgICAgICB0aGlzLkRPTV90YXJnZXQuc2Nyb2xsVG9wID0gMDtcclxuICAgICAgICAvLyBhZGQgQ1NTIGNsYXNzZXMgdG8gdGhlIERPTV90YXJnZXQgaWYgdGhleSBleGlzdCBpbiB0cmlhbC5jc3NfY2xhc3Nlc1xyXG4gICAgICAgIGlmICh0eXBlb2YgdHJpYWwuY3NzX2NsYXNzZXMgIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRyaWFsLmNzc19jbGFzc2VzKSAmJiB0eXBlb2YgdHJpYWwuY3NzX2NsYXNzZXMgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgICAgIHRyaWFsLmNzc19jbGFzc2VzID0gW3RyaWFsLmNzc19jbGFzc2VzXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0cmlhbC5jc3NfY2xhc3NlcykpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuRE9NX3RhcmdldC5jbGFzc0xpc3QuYWRkKC4uLnRyaWFsLmNzc19jbGFzc2VzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBzZXR1cCBvbl9sb2FkIGV2ZW50IGNhbGxiYWNrXHJcbiAgICAgICAgY29uc3QgbG9hZF9jYWxsYmFjayA9ICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0cmlhbC5vbl9sb2FkID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgICAgIHRyaWFsLm9uX2xvYWQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBjYWxsIGFueSBvbl9sb2FkIGZ1bmN0aW9ucyBmb3IgZXh0ZW5zaW9uc1xyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0cmlhbC5leHRlbnNpb25zKSkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBleHRlbnNpb24gb2YgdHJpYWwuZXh0ZW5zaW9ucykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uc1tleHRlbnNpb24udHlwZS5pbmZvLm5hbWVdLm9uX2xvYWQoZXh0ZW5zaW9uLnBhcmFtcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIGxldCB0cmlhbF9jb21wbGV0ZTtcclxuICAgICAgICBpZiAoIXRoaXMuc2ltdWxhdGlvbl9tb2RlKSB7XHJcbiAgICAgICAgICAgIHRyaWFsX2NvbXBsZXRlID0gdHJpYWwudHlwZS50cmlhbCh0aGlzLkRPTV90YXJnZXQsIHRyaWFsLCBsb2FkX2NhbGxiYWNrKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuc2ltdWxhdGlvbl9tb2RlKSB7XHJcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSB0cmlhbCBzdXBwb3J0cyBzaW11bGF0aW9uXHJcbiAgICAgICAgICAgIGlmICh0cmlhbC50eXBlLnNpbXVsYXRlKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdHJpYWxfc2ltX29wdHM7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRyaWFsLnNpbXVsYXRpb25fb3B0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyaWFsX3NpbV9vcHRzID0gdGhpcy5zaW11bGF0aW9uX29wdGlvbnMuZGVmYXVsdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0cmlhbC5zaW11bGF0aW9uX29wdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRyaWFsLnNpbXVsYXRpb25fb3B0aW9ucyA9PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNpbXVsYXRpb25fb3B0aW9uc1t0cmlhbC5zaW11bGF0aW9uX29wdGlvbnNdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlhbF9zaW1fb3B0cyA9IHRoaXMuc2ltdWxhdGlvbl9vcHRpb25zW3RyaWFsLnNpbXVsYXRpb25fb3B0aW9uc107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zaW11bGF0aW9uX29wdGlvbnMuZGVmYXVsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYE5vIG1hdGNoaW5nIHNpbXVsYXRpb24gb3B0aW9ucyBmb3VuZCBmb3IgXCIke3RyaWFsLnNpbXVsYXRpb25fb3B0aW9uc31cIi4gVXNpbmcgXCJkZWZhdWx0XCIgb3B0aW9ucy5gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWFsX3NpbV9vcHRzID0gdGhpcy5zaW11bGF0aW9uX29wdGlvbnMuZGVmYXVsdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBObyBtYXRjaGluZyBzaW11bGF0aW9uIG9wdGlvbnMgZm91bmQgZm9yIFwiJHt0cmlhbC5zaW11bGF0aW9uX29wdGlvbnN9XCIgYW5kIG5vIFwiZGVmYXVsdFwiIG9wdGlvbnMgcHJvdmlkZWQuIFVzaW5nIHRoZSBkZWZhdWx0IHZhbHVlcyBwcm92aWRlZCBieSB0aGUgcGx1Z2luLmApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpYWxfc2ltX29wdHMgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJpYWxfc2ltX29wdHMgPSB0cmlhbC5zaW11bGF0aW9uX29wdGlvbnM7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdHJpYWxfc2ltX29wdHMgPSB0aGlzLnV0aWxzLmRlZXBDb3B5KHRyaWFsX3NpbV9vcHRzKTtcclxuICAgICAgICAgICAgICAgIHRyaWFsX3NpbV9vcHRzID0gdGhpcy5yZXBsYWNlRnVuY3Rpb25zV2l0aFZhbHVlcyh0cmlhbF9zaW1fb3B0cywgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoKHRyaWFsX3NpbV9vcHRzID09PSBudWxsIHx8IHRyaWFsX3NpbV9vcHRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0cmlhbF9zaW1fb3B0cy5zaW11bGF0ZSkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpYWxfY29tcGxldGUgPSB0cmlhbC50eXBlLnRyaWFsKHRoaXMuRE9NX3RhcmdldCwgdHJpYWwsIGxvYWRfY2FsbGJhY2spO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpYWxfY29tcGxldGUgPSB0cmlhbC50eXBlLnNpbXVsYXRlKHRyaWFsLCAodHJpYWxfc2ltX29wdHMgPT09IG51bGwgfHwgdHJpYWxfc2ltX29wdHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRyaWFsX3NpbV9vcHRzLm1vZGUpIHx8IHRoaXMuc2ltdWxhdGlvbl9tb2RlLCB0cmlhbF9zaW1fb3B0cywgbG9hZF9jYWxsYmFjayk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyB0cmlhbCBkb2Vzbid0IGhhdmUgYSBzaW11bGF0ZSBtZXRob2QsIHNvIGp1c3QgcnVuIGFzIHVzdWFsXHJcbiAgICAgICAgICAgICAgICB0cmlhbF9jb21wbGV0ZSA9IHRyaWFsLnR5cGUudHJpYWwodGhpcy5ET01fdGFyZ2V0LCB0cmlhbCwgbG9hZF9jYWxsYmFjayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gc2VlIGlmIHRyaWFsX2NvbXBsZXRlIGlzIGEgUHJvbWlzZSBieSBsb29raW5nIGZvciAudGhlbigpIGZ1bmN0aW9uXHJcbiAgICAgICAgY29uc3QgaXNfcHJvbWlzZSA9IHRyaWFsX2NvbXBsZXRlICYmIHR5cGVvZiB0cmlhbF9jb21wbGV0ZS50aGVuID09IFwiZnVuY3Rpb25cIjtcclxuICAgICAgICAvLyBpbiBzaW11bGF0aW9uIG1vZGUgd2UgbGV0IHRoZSBzaW11bGF0ZSBmdW5jdGlvbiBjYWxsIHRoZSBsb2FkX2NhbGxiYWNrIGFsd2F5cy5cclxuICAgICAgICBpZiAoIWlzX3Byb21pc2UgJiYgIXRoaXMuc2ltdWxhdGlvbl9tb2RlKSB7XHJcbiAgICAgICAgICAgIGxvYWRfY2FsbGJhY2soKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZG9uZSB3aXRoIGNhbGxiYWNrc1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWwuY2FsbF9pbW1lZGlhdGUgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGV2YWx1YXRlVGltZWxpbmVWYXJpYWJsZXModHJpYWwpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0cmlhbCkpIHtcclxuICAgICAgICAgICAgLy8gdGltZWxpbmUgdmFyaWFibGVzIG9uIHRoZSByb290IGxldmVsXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdHJpYWxba2V5XSA9PT0gXCJvYmplY3RcIiAmJlxyXG4gICAgICAgICAgICAgICAgdHJpYWxba2V5XSAhPT0gbnVsbCAmJlxyXG4gICAgICAgICAgICAgICAgdHlwZW9mIHRyaWFsW2tleV0udGltZWxpbmVWYXJpYWJsZVBsYWNlaG9sZGVyICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgICAgICAvKnRyaWFsW2tleV0udG9TdHJpbmcoKS5yZXBsYWNlKC9cXHMvZywgXCJcIikgPT1cclxuICAgICAgICAgICAgICAgICAgXCJmdW5jdGlvbigpe3JldHVybnRpbWVsaW5lLnRpbWVsaW5lVmFyaWFibGUodmFybmFtZSk7fVwiXHJcbiAgICAgICAgICAgICAgKSovIHRyaWFsW2tleV0gPSB0cmlhbFtrZXldLnRpbWVsaW5lVmFyaWFibGVGdW5jdGlvbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIHRpbWVsaW5lIHZhcmlhYmxlcyB0aGF0IGFyZSBuZXN0ZWQgaW4gb2JqZWN0c1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRyaWFsW2tleV0gPT09IFwib2JqZWN0XCIgJiYgdHJpYWxba2V5XSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ldmFsdWF0ZVRpbWVsaW5lVmFyaWFibGVzKHRyaWFsW2tleV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZXZhbHVhdGVGdW5jdGlvblBhcmFtZXRlcnModHJpYWwpIHtcclxuICAgICAgICAvLyBzZXQgYSBmbGFnIHNvIHRoYXQganNQc3ljaC50aW1lbGluZVZhcmlhYmxlKCkgaXMgaW1tZWRpYXRlbHkgZXhlY3V0ZWQgaW4gdGhpcyBjb250ZXh0XHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbC5jYWxsX2ltbWVkaWF0ZSA9IHRydWU7XHJcbiAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIGVhY2ggcGFyYW1ldGVyXHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModHJpYWwpKSB7XHJcbiAgICAgICAgICAgIC8vIGNoZWNrIHRvIG1ha2Ugc3VyZSBwYXJhbWV0ZXIgaXMgbm90IFwidHlwZVwiLCBzaW5jZSB0aGF0IHdhcyBldmFsJ2QgYWJvdmUuXHJcbiAgICAgICAgICAgIGlmIChrZXkgIT09IFwidHlwZVwiKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGlmIHN0YXRlbWVudCBpcyBjaGVja2luZyB0byBzZWUgaWYgdGhlIHBhcmFtZXRlciB0eXBlIGlzIGV4cGVjdGVkIHRvIGJlIGEgZnVuY3Rpb24sIGluIHdoaWNoIGNhc2Ugd2Ugc2hvdWxkIE5PVCBldmFsdWF0ZSBpdC5cclxuICAgICAgICAgICAgICAgIC8vIHRoZSBmaXJzdCBsaW5lIGNoZWNrcyBpZiB0aGUgcGFyYW1ldGVyIGlzIGRlZmluZWQgaW4gdGhlIHVuaXZlcnNhbFBsdWdpblBhcmFtZXRlcnMgc2V0XHJcbiAgICAgICAgICAgICAgICAvLyB0aGUgc2Vjb25kIGxpbmUgY2hlY2tzIHRoZSBwbHVnaW4tc3BlY2lmaWMgcGFyYW1ldGVyc1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB1bml2ZXJzYWxQbHVnaW5QYXJhbWV0ZXJzW2tleV0gIT09IFwidW5kZWZpbmVkXCIgJiZcclxuICAgICAgICAgICAgICAgICAgICB1bml2ZXJzYWxQbHVnaW5QYXJhbWV0ZXJzW2tleV0udHlwZSAhPT0gUGFyYW1ldGVyVHlwZS5GVU5DVElPTikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyaWFsW2tleV0gPSB0aGlzLnJlcGxhY2VGdW5jdGlvbnNXaXRoVmFsdWVzKHRyaWFsW2tleV0sIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0cmlhbC50eXBlLmluZm8ucGFyYW1ldGVyc1trZXldICE9PSBcInVuZGVmaW5lZFwiICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdHJpYWwudHlwZS5pbmZvLnBhcmFtZXRlcnNba2V5XS50eXBlICE9PSBQYXJhbWV0ZXJUeXBlLkZVTkNUSU9OKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpYWxba2V5XSA9IHRoaXMucmVwbGFjZUZ1bmN0aW9uc1dpdGhWYWx1ZXModHJpYWxba2V5XSwgdHJpYWwudHlwZS5pbmZvLnBhcmFtZXRlcnNba2V5XSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gcmVzZXQgc28ganNQc3ljaC50aW1lbGluZVZhcmlhYmxlKCkgaXMgbm8gbG9uZ2VyIGltbWVkaWF0ZWx5IGV4ZWN1dGVkXHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbC5jYWxsX2ltbWVkaWF0ZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmVwbGFjZUZ1bmN0aW9uc1dpdGhWYWx1ZXMob2JqLCBpbmZvKSB7XHJcbiAgICAgICAgLy8gbnVsbCB0eXBlb2YgaXMgJ29iamVjdCcgKD8hPyEpLCBzbyBuZWVkIHRvIHJ1biB0aGlzIGZpcnN0IVxyXG4gICAgICAgIGlmIChvYmogPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9iajtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gYXJyYXlzXHJcbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBvYmpbaV0gPSB0aGlzLnJlcGxhY2VGdW5jdGlvbnNXaXRoVmFsdWVzKG9ialtpXSwgaW5mbyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gb2JqZWN0c1xyXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICAgICAgaWYgKGluZm8gPT09IG51bGwgfHwgIWluZm8ubmVzdGVkKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvYmopKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gXCJ0eXBlXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIHRoZSBvYmplY3QncyBgdHlwZWAgZmllbGQgYmVjYXVzZSBpdCBjb250YWlucyBhIHBsdWdpbiBhbmQgd2UgZG8gbm90IHdhbnQgdG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbCBwbHVnaW4gZnVuY3Rpb25zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBvYmpba2V5XSA9IHRoaXMucmVwbGFjZUZ1bmN0aW9uc1dpdGhWYWx1ZXMob2JqW2tleV0sIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5mby5uZXN0ZWRba2V5XSA9PT0gXCJvYmplY3RcIiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLm5lc3RlZFtrZXldLnR5cGUgIT09IFBhcmFtZXRlclR5cGUuRlVOQ1RJT04pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqW2tleV0gPSB0aGlzLnJlcGxhY2VGdW5jdGlvbnNXaXRoVmFsdWVzKG9ialtrZXldLCBpbmZvLm5lc3RlZFtrZXldKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvYmooKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxuICAgIHNldERlZmF1bHRWYWx1ZXModHJpYWwpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IHBhcmFtIGluIHRyaWFsLnR5cGUuaW5mby5wYXJhbWV0ZXJzKSB7XHJcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHBhcmFtZXRlciBpcyBjb21wbGV4IHdpdGggbmVzdGVkIGRlZmF1bHRzXHJcbiAgICAgICAgICAgIGlmICh0cmlhbC50eXBlLmluZm8ucGFyYW1ldGVyc1twYXJhbV0udHlwZSA9PT0gUGFyYW1ldGVyVHlwZS5DT01QTEVYKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodHJpYWwudHlwZS5pbmZvLnBhcmFtZXRlcnNbcGFyYW1dLmFycmF5ID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIGVhY2ggZW50cnkgaW4gdGhlIGFycmF5XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpYWxbcGFyYW1dLmZvckVhY2goZnVuY3Rpb24gKGlwLCBpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGVhY2ggcGFyYW1ldGVyIGluIHRoZSBwbHVnaW4gZGVzY3JpcHRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwIGluIHRyaWFsLnR5cGUuaW5mby5wYXJhbWV0ZXJzW3BhcmFtXS5uZXN0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdHJpYWxbcGFyYW1dW2ldW3BdID09PSBcInVuZGVmaW5lZFwiIHx8IHRyaWFsW3BhcmFtXVtpXVtwXSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdHJpYWwudHlwZS5pbmZvLnBhcmFtZXRlcnNbcGFyYW1dLm5lc3RlZFtwXS5kZWZhdWx0ID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJZb3UgbXVzdCBzcGVjaWZ5IGEgdmFsdWUgZm9yIHRoZSBcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIHBhcmFtZXRlciAobmVzdGVkIGluIHRoZSBcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBwYXJhbWV0ZXIpIGluIHRoZSBcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlhbC50eXBlICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIHBsdWdpbi5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlhbFtwYXJhbV1baV1bcF0gPSB0cmlhbC50eXBlLmluZm8ucGFyYW1ldGVyc1twYXJhbV0ubmVzdGVkW3BdLmRlZmF1bHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gaWYgaXQncyBub3QgbmVzdGVkLCBjaGVja2luZyBpcyBtdWNoIGVhc2llciBhbmQgZG8gdGhhdCBoZXJlOlxyXG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgdHJpYWxbcGFyYW1dID09PSBcInVuZGVmaW5lZFwiIHx8IHRyaWFsW3BhcmFtXSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0cmlhbC50eXBlLmluZm8ucGFyYW1ldGVyc1twYXJhbV0uZGVmYXVsdCA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJZb3UgbXVzdCBzcGVjaWZ5IGEgdmFsdWUgZm9yIHRoZSBcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCIgcGFyYW1ldGVyIGluIHRoZSBcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWFsLnR5cGUuaW5mby5uYW1lICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCIgcGx1Z2luLlwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyaWFsW3BhcmFtXSA9IHRyaWFsLnR5cGUuaW5mby5wYXJhbWV0ZXJzW3BhcmFtXS5kZWZhdWx0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2hlY2tFeGNsdXNpb25zKGV4Y2x1c2lvbnMpIHtcclxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xyXG4gICAgICAgICAgICBpZiAoZXhjbHVzaW9ucy5taW5fd2lkdGggfHwgZXhjbHVzaW9ucy5taW5faGVpZ2h0IHx8IGV4Y2x1c2lvbnMuYXVkaW8pIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlRoZSBleGNsdXNpb25zIG9wdGlvbiBpbiBgaW5pdEpzUHN5Y2goKWAgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uIFdlIHJlY29tbWVuZCB1c2luZyB0aGUgYnJvd3Nlci1jaGVjayBwbHVnaW4gaW5zdGVhZC4gU2VlIGh0dHBzOi8vd3d3LmpzcHN5Y2gub3JnL2xhdGVzdC9wbHVnaW5zL2Jyb3dzZXItY2hlY2svLlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBNSU5JTVVNIFNJWkVcclxuICAgICAgICAgICAgaWYgKGV4Y2x1c2lvbnMubWluX3dpZHRoIHx8IGV4Y2x1c2lvbnMubWluX2hlaWdodCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbXcgPSBleGNsdXNpb25zLm1pbl93aWR0aCB8fCAwO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWggPSBleGNsdXNpb25zLm1pbl9oZWlnaHQgfHwgMDtcclxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA8IG13IHx8IHdpbmRvdy5pbm5lckhlaWdodCA8IG1oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXREaXNwbGF5RWxlbWVudCgpLmlubmVySFRNTCA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiPHA+WW91ciBicm93c2VyIHdpbmRvdyBpcyB0b28gc21hbGwgdG8gY29tcGxldGUgdGhpcyBleHBlcmltZW50LiBcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlBsZWFzZSBtYXhpbWl6ZSB0aGUgc2l6ZSBvZiB5b3VyIGJyb3dzZXIgd2luZG93LiBJZiB5b3VyIGJyb3dzZXIgd2luZG93IGlzIGFscmVhZHkgbWF4aW1pemVkLCBcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGNvbXBsZXRlIHRoaXMgZXhwZXJpbWVudC48L3A+XCIgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI8cD5UaGUgbWluaW11bSB3aWR0aCBpcyBcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInB4LiBZb3VyIGN1cnJlbnQgd2lkdGggaXMgXCIgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmlubmVyV2lkdGggK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJweC48L3A+XCIgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI8cD5UaGUgbWluaW11bSBoZWlnaHQgaXMgXCIgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWggK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJweC4gWW91ciBjdXJyZW50IGhlaWdodCBpcyBcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuaW5uZXJIZWlnaHQgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJweC48L3A+XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gV2FpdCBmb3Igd2luZG93IHNpemUgdG8gaW5jcmVhc2VcclxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAod2luZG93LmlubmVyV2lkdGggPCBtdyB8fCB3aW5kb3cuaW5uZXJIZWlnaHQgPCBtaCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBkZWxheSgxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldERpc3BsYXlFbGVtZW50KCkuaW5uZXJIVE1MID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBXRUIgQVVESU8gQVBJXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXhjbHVzaW9ucy5hdWRpbyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBleGNsdXNpb25zLmF1ZGlvKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5oYXNPd25Qcm9wZXJ0eShcIkF1ZGlvQ29udGV4dFwiKSAmJiAhd2luZG93Lmhhc093blByb3BlcnR5KFwid2Via2l0QXVkaW9Db250ZXh0XCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXREaXNwbGF5RWxlbWVudCgpLmlubmVySFRNTCA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiPHA+WW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIFdlYkF1ZGlvIEFQSSwgd2hpY2ggbWVhbnMgdGhhdCB5b3Ugd2lsbCBub3QgXCIgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJiZSBhYmxlIHRvIGNvbXBsZXRlIHRoZSBleHBlcmltZW50LjwvcD48cD5Ccm93c2VycyB0aGF0IHN1cHBvcnQgdGhlIFdlYkF1ZGlvIEFQSSBpbmNsdWRlIFwiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQ2hyb21lLCBGaXJlZm94LCBTYWZhcmksIGFuZCBFZGdlLjwvcD5cIjtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZHJhd1Byb2dyZXNzQmFyKG1zZykge1xyXG4gICAgICAgIGRvY3VtZW50XHJcbiAgICAgICAgICAgIC5xdWVyeVNlbGVjdG9yKFwiLmpzcHN5Y2gtZGlzcGxheS1lbGVtZW50XCIpXHJcbiAgICAgICAgICAgIC5pbnNlcnRBZGphY2VudEhUTUwoXCJhZnRlcmJlZ2luXCIsICc8ZGl2IGlkPVwianNwc3ljaC1wcm9ncmVzc2Jhci1jb250YWluZXJcIj4nICtcclxuICAgICAgICAgICAgXCI8c3Bhbj5cIiArXHJcbiAgICAgICAgICAgIG1zZyArXHJcbiAgICAgICAgICAgIFwiPC9zcGFuPlwiICtcclxuICAgICAgICAgICAgJzxkaXYgaWQ9XCJqc3BzeWNoLXByb2dyZXNzYmFyLW91dGVyXCI+JyArXHJcbiAgICAgICAgICAgICc8ZGl2IGlkPVwianNwc3ljaC1wcm9ncmVzc2Jhci1pbm5lclwiPjwvZGl2PicgK1xyXG4gICAgICAgICAgICBcIjwvZGl2PjwvZGl2PlwiKTtcclxuICAgIH1cclxuICAgIHVwZGF0ZVByb2dyZXNzQmFyKCkge1xyXG4gICAgICAgIHRoaXMuc2V0UHJvZ3Jlc3NCYXIodGhpcy5nZXRQcm9ncmVzcygpLnBlcmNlbnRfY29tcGxldGUgLyAxMDApO1xyXG4gICAgfVxyXG4gICAgc2V0UHJvZ3Jlc3NCYXIocHJvcG9ydGlvbl9jb21wbGV0ZSkge1xyXG4gICAgICAgIHByb3BvcnRpb25fY29tcGxldGUgPSBNYXRoLm1heChNYXRoLm1pbigxLCBwcm9wb3J0aW9uX2NvbXBsZXRlKSwgMCk7XHJcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNqc3BzeWNoLXByb2dyZXNzYmFyLWlubmVyXCIpLnN0eWxlLndpZHRoID1cclxuICAgICAgICAgICAgcHJvcG9ydGlvbl9jb21wbGV0ZSAqIDEwMCArIFwiJVwiO1xyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3NfYmFyX2Ftb3VudCA9IHByb3BvcnRpb25fY29tcGxldGU7XHJcbiAgICB9XHJcbiAgICBnZXRQcm9ncmVzc0JhckNvbXBsZXRlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9ncmVzc19iYXJfYW1vdW50O1xyXG4gICAgfVxyXG59XG5cbi8vIHRlbXBvcmFyeSBwYXRjaCBmb3IgU2FmYXJpXHJcbmlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmXHJcbiAgICB3aW5kb3cuaGFzT3duUHJvcGVydHkoXCJ3ZWJraXRBdWRpb0NvbnRleHRcIikgJiZcclxuICAgICF3aW5kb3cuaGFzT3duUHJvcGVydHkoXCJBdWRpb0NvbnRleHRcIikpIHtcclxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcclxuICAgIHdpbmRvdy5BdWRpb0NvbnRleHQgPSB3ZWJraXRBdWRpb0NvbnRleHQ7XHJcbn1cclxuLy8gZW5kIHBhdGNoXHJcbi8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gcHJvdmlkZXMgYSB1bmlmb3JtIGludGVyZmFjZSB0byBpbml0aWFsaXplIGpzUHN5Y2gsIG5vIG1hdHRlciB3aGV0aGVyIGFcclxuLy8gYnJvd3NlciBzdXBwb3J0cyBFUzYgY2xhc3NlcyBvciBub3QgKGFuZCB3aGV0aGVyIHRoZSBFUzYgYnVpbGQgb3IgdGhlIEJhYmVsIGJ1aWxkIGlzIHVzZWQpLlxyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBKc1BzeWNoIGluc3RhbmNlIHVzaW5nIHRoZSBwcm92aWRlZCBvcHRpb25zLlxyXG4gKlxyXG4gKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBKc1BzeWNoIGNvbnN0cnVjdG9yXHJcbiAqIEByZXR1cm5zIEEgbmV3IEpzUHN5Y2ggaW5zdGFuY2VcclxuICovXHJcbmZ1bmN0aW9uIGluaXRKc1BzeWNoKG9wdGlvbnMpIHtcclxuICAgIGNvbnN0IGpzUHN5Y2ggPSBuZXcgSnNQc3ljaChvcHRpb25zKTtcclxuICAgIC8vIEhhbmRsZSBpbnZvY2F0aW9ucyBvZiBub24tZXhpc3RlbnQgdjYgbWV0aG9kcyB3aXRoIG1pZ3JhdGlvbiBlcnJvcnNcclxuICAgIGNvbnN0IG1pZ3JhdGlvbk1lc3NhZ2VzID0ge1xyXG4gICAgICAgIGluaXQ6IFwiYGpzUHN5Y2guaW5pdCgpYCB3YXMgcmVwbGFjZWQgYnkgYGluaXRKc1BzeWNoKClgIGluIGpzUHN5Y2ggdjcuXCIsXHJcbiAgICAgICAgQUxMX0tFWVM6ICdqc1BzeWNoLkFMTF9LRVlTIHdhcyByZXBsYWNlZCBieSB0aGUgXCJBTExfS0VZU1wiIHN0cmluZyBpbiBqc1BzeWNoIHY3LicsXHJcbiAgICAgICAgTk9fS0VZUzogJ2pzUHN5Y2guTk9fS0VZUyB3YXMgcmVwbGFjZWQgYnkgdGhlIFwiTk9fS0VZU1wiIHN0cmluZyBpbiBqc1BzeWNoIHY3LicsXHJcbiAgICAgICAgLy8gR2V0dGVyIGZ1bmN0aW9ucyB0aGF0IHdlcmUgcmVuYW1lZFxyXG4gICAgICAgIGN1cnJlbnRUaW1lbGluZU5vZGVJRDogXCJgY3VycmVudFRpbWVsaW5lTm9kZUlEKClgIHdhcyByZW5hbWVkIHRvIGBnZXRDdXJyZW50VGltZWxpbmVOb2RlSUQoKWAgaW4ganNQc3ljaCB2Ny5cIixcclxuICAgICAgICBwcm9ncmVzczogXCJgcHJvZ3Jlc3MoKWAgd2FzIHJlbmFtZWQgdG8gYGdldFByb2dyZXNzKClgIGluIGpzUHN5Y2ggdjcuXCIsXHJcbiAgICAgICAgc3RhcnRUaW1lOiBcImBzdGFydFRpbWUoKWAgd2FzIHJlbmFtZWQgdG8gYGdldFN0YXJ0VGltZSgpYCBpbiBqc1BzeWNoIHY3LlwiLFxyXG4gICAgICAgIHRvdGFsVGltZTogXCJgdG90YWxUaW1lKClgIHdhcyByZW5hbWVkIHRvIGBnZXRUb3RhbFRpbWUoKWAgaW4ganNQc3ljaCB2Ny5cIixcclxuICAgICAgICBjdXJyZW50VHJpYWw6IFwiYGN1cnJlbnRUcmlhbCgpYCB3YXMgcmVuYW1lZCB0byBgZ2V0Q3VycmVudFRyaWFsKClgIGluIGpzUHN5Y2ggdjcuXCIsXHJcbiAgICAgICAgaW5pdFNldHRpbmdzOiBcImBpbml0U2V0dGluZ3MoKWAgd2FzIHJlbmFtZWQgdG8gYGdldEluaXRTZXR0aW5ncygpYCBpbiBqc1BzeWNoIHY3LlwiLFxyXG4gICAgICAgIGFsbFRpbWVsaW5lVmFyaWFibGVzOiBcImBhbGxUaW1lbGluZVZhcmlhYmxlcygpYCB3YXMgcmVuYW1lZCB0byBgZ2V0QWxsVGltZWxpbmVWYXJpYWJsZXMoKWAgaW4ganNQc3ljaCB2Ny5cIixcclxuICAgIH07XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhqc1BzeWNoLCBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMobWlncmF0aW9uTWVzc2FnZXMpLm1hcCgoW2tleSwgbWVzc2FnZV0pID0+IFtcclxuICAgICAgICBrZXksXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBnZXQoKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWlncmF0aW9uRXJyb3IobWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgIF0pKSk7XHJcbiAgICByZXR1cm4ganNQc3ljaDtcclxufVxuXG5leHBvcnQgeyBKc1BzeWNoLCBQYXJhbWV0ZXJUeXBlLCBpbml0SnNQc3ljaCwgdW5pdmVyc2FsUGx1Z2luUGFyYW1ldGVycyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdGlkOiBtb2R1bGVJZCxcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuLy8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbl9fd2VicGFja19yZXF1aXJlX18ubSA9IF9fd2VicGFja19tb2R1bGVzX187XG5cbiIsInZhciB3ZWJwYWNrVGhlbiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiA/IFN5bWJvbChcIndlYnBhY2sgdGhlblwiKSA6IFwiX193ZWJwYWNrX3RoZW5fX1wiO1xudmFyIHdlYnBhY2tFeHBvcnRzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiID8gU3ltYm9sKFwid2VicGFjayBleHBvcnRzXCIpIDogXCJfX3dlYnBhY2tfZXhwb3J0c19fXCI7XG52YXIgd2VicGFja0Vycm9yID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiID8gU3ltYm9sKFwid2VicGFjayBlcnJvclwiKSA6IFwiX193ZWJwYWNrX2Vycm9yX19cIjtcbnZhciBjb21wbGV0ZVF1ZXVlID0gKHF1ZXVlKSA9PiB7XG5cdGlmKHF1ZXVlKSB7XG5cdFx0cXVldWUuZm9yRWFjaCgoZm4pID0+IChmbi5yLS0pKTtcblx0XHRxdWV1ZS5mb3JFYWNoKChmbikgPT4gKGZuLnItLSA/IGZuLnIrKyA6IGZuKCkpKTtcblx0fVxufVxudmFyIGNvbXBsZXRlRnVuY3Rpb24gPSAoZm4pID0+ICghLS1mbi5yICYmIGZuKCkpO1xudmFyIHF1ZXVlRnVuY3Rpb24gPSAocXVldWUsIGZuKSA9PiAocXVldWUgPyBxdWV1ZS5wdXNoKGZuKSA6IGNvbXBsZXRlRnVuY3Rpb24oZm4pKTtcbnZhciB3cmFwRGVwcyA9IChkZXBzKSA9PiAoZGVwcy5tYXAoKGRlcCkgPT4ge1xuXHRpZihkZXAgIT09IG51bGwgJiYgdHlwZW9mIGRlcCA9PT0gXCJvYmplY3RcIikge1xuXHRcdGlmKGRlcFt3ZWJwYWNrVGhlbl0pIHJldHVybiBkZXA7XG5cdFx0aWYoZGVwLnRoZW4pIHtcblx0XHRcdHZhciBxdWV1ZSA9IFtdO1xuXHRcdFx0ZGVwLnRoZW4oKHIpID0+IHtcblx0XHRcdFx0b2JqW3dlYnBhY2tFeHBvcnRzXSA9IHI7XG5cdFx0XHRcdGNvbXBsZXRlUXVldWUocXVldWUpO1xuXHRcdFx0XHRxdWV1ZSA9IDA7XG5cdFx0XHR9LCAoZSkgPT4ge1xuXHRcdFx0XHRvYmpbd2VicGFja0Vycm9yXSA9IGU7XG5cdFx0XHRcdGNvbXBsZXRlUXVldWUocXVldWUpO1xuXHRcdFx0XHRxdWV1ZSA9IDA7XG5cdFx0XHR9KTtcblx0XHRcdHZhciBvYmogPSB7fTtcblx0XHRcdG9ialt3ZWJwYWNrVGhlbl0gPSAoZm4sIHJlamVjdCkgPT4gKHF1ZXVlRnVuY3Rpb24ocXVldWUsIGZuKSwgZGVwWydjYXRjaCddKHJlamVjdCkpO1xuXHRcdFx0cmV0dXJuIG9iajtcblx0XHR9XG5cdH1cblx0dmFyIHJldCA9IHt9O1xuXHRyZXRbd2VicGFja1RoZW5dID0gKGZuKSA9PiAoY29tcGxldGVGdW5jdGlvbihmbikpO1xuXHRyZXRbd2VicGFja0V4cG9ydHNdID0gZGVwO1xuXHRyZXR1cm4gcmV0O1xufSkpO1xuX193ZWJwYWNrX3JlcXVpcmVfXy5hID0gKG1vZHVsZSwgYm9keSwgaGFzQXdhaXQpID0+IHtcblx0dmFyIHF1ZXVlID0gaGFzQXdhaXQgJiYgW107XG5cdHZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHM7XG5cdHZhciBjdXJyZW50RGVwcztcblx0dmFyIG91dGVyUmVzb2x2ZTtcblx0dmFyIHJlamVjdDtcblx0dmFyIGlzRXZhbHVhdGluZyA9IHRydWU7XG5cdHZhciBuZXN0ZWQgPSBmYWxzZTtcblx0dmFyIHdoZW5BbGwgPSAoZGVwcywgb25SZXNvbHZlLCBvblJlamVjdCkgPT4ge1xuXHRcdGlmIChuZXN0ZWQpIHJldHVybjtcblx0XHRuZXN0ZWQgPSB0cnVlO1xuXHRcdG9uUmVzb2x2ZS5yICs9IGRlcHMubGVuZ3RoO1xuXHRcdGRlcHMubWFwKChkZXAsIGkpID0+IChkZXBbd2VicGFja1RoZW5dKG9uUmVzb2x2ZSwgb25SZWplY3QpKSk7XG5cdFx0bmVzdGVkID0gZmFsc2U7XG5cdH07XG5cdHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlaikgPT4ge1xuXHRcdHJlamVjdCA9IHJlajtcblx0XHRvdXRlclJlc29sdmUgPSAoKSA9PiAocmVzb2x2ZShleHBvcnRzKSwgY29tcGxldGVRdWV1ZShxdWV1ZSksIHF1ZXVlID0gMCk7XG5cdH0pO1xuXHRwcm9taXNlW3dlYnBhY2tFeHBvcnRzXSA9IGV4cG9ydHM7XG5cdHByb21pc2Vbd2VicGFja1RoZW5dID0gKGZuLCByZWplY3RGbikgPT4ge1xuXHRcdGlmIChpc0V2YWx1YXRpbmcpIHsgcmV0dXJuIGNvbXBsZXRlRnVuY3Rpb24oZm4pOyB9XG5cdFx0aWYgKGN1cnJlbnREZXBzKSB3aGVuQWxsKGN1cnJlbnREZXBzLCBmbiwgcmVqZWN0Rm4pO1xuXHRcdHF1ZXVlRnVuY3Rpb24ocXVldWUsIGZuKTtcblx0XHRwcm9taXNlWydjYXRjaCddKHJlamVjdEZuKTtcblx0fTtcblx0bW9kdWxlLmV4cG9ydHMgPSBwcm9taXNlO1xuXHRib2R5KChkZXBzKSA9PiB7XG5cdFx0Y3VycmVudERlcHMgPSB3cmFwRGVwcyhkZXBzKTtcblx0XHR2YXIgZm47XG5cdFx0dmFyIGdldFJlc3VsdCA9ICgpID0+IChjdXJyZW50RGVwcy5tYXAoKGQpID0+IHtcblx0XHRcdGlmKGRbd2VicGFja0Vycm9yXSkgdGhyb3cgZFt3ZWJwYWNrRXJyb3JdO1xuXHRcdFx0cmV0dXJuIGRbd2VicGFja0V4cG9ydHNdO1xuXHRcdH0pKVxuXHRcdHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0Zm4gPSAoKSA9PiAocmVzb2x2ZShnZXRSZXN1bHQpKTtcblx0XHRcdGZuLnIgPSAwO1xuXHRcdFx0d2hlbkFsbChjdXJyZW50RGVwcywgZm4sIHJlamVjdCk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGZuLnIgPyBwcm9taXNlIDogZ2V0UmVzdWx0KCk7XG5cdH0sIChlcnIpID0+IChlcnIgJiYgcmVqZWN0KHByb21pc2Vbd2VicGFja0Vycm9yXSA9IGVyciksIG91dGVyUmVzb2x2ZSgpKSk7XG5cdGlzRXZhbHVhdGluZyA9IGZhbHNlO1xufTsiLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHtcblx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuIGdsb2JhbFRoaXM7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7XG5cdH1cbn0pKCk7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsInZhciBzY3JpcHRVcmw7XG5pZiAoX193ZWJwYWNrX3JlcXVpcmVfXy5nLmltcG9ydFNjcmlwdHMpIHNjcmlwdFVybCA9IF9fd2VicGFja19yZXF1aXJlX18uZy5sb2NhdGlvbiArIFwiXCI7XG52YXIgZG9jdW1lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLmcuZG9jdW1lbnQ7XG5pZiAoIXNjcmlwdFVybCAmJiBkb2N1bWVudCkge1xuXHRpZiAoZG9jdW1lbnQuY3VycmVudFNjcmlwdClcblx0XHRzY3JpcHRVcmwgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyY1xuXHRpZiAoIXNjcmlwdFVybCkge1xuXHRcdHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzY3JpcHRcIik7XG5cdFx0aWYoc2NyaXB0cy5sZW5ndGgpIHNjcmlwdFVybCA9IHNjcmlwdHNbc2NyaXB0cy5sZW5ndGggLSAxXS5zcmNcblx0fVxufVxuLy8gV2hlbiBzdXBwb3J0aW5nIGJyb3dzZXJzIHdoZXJlIGFuIGF1dG9tYXRpYyBwdWJsaWNQYXRoIGlzIG5vdCBzdXBwb3J0ZWQgeW91IG11c3Qgc3BlY2lmeSBhbiBvdXRwdXQucHVibGljUGF0aCBtYW51YWxseSB2aWEgY29uZmlndXJhdGlvblxuLy8gb3IgcGFzcyBhbiBlbXB0eSBzdHJpbmcgKFwiXCIpIGFuZCBzZXQgdGhlIF9fd2VicGFja19wdWJsaWNfcGF0aF9fIHZhcmlhYmxlIGZyb20geW91ciBjb2RlIHRvIHVzZSB5b3VyIG93biBsb2dpYy5cbmlmICghc2NyaXB0VXJsKSB0aHJvdyBuZXcgRXJyb3IoXCJBdXRvbWF0aWMgcHVibGljUGF0aCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlclwiKTtcbnNjcmlwdFVybCA9IHNjcmlwdFVybC5yZXBsYWNlKC8jLiokLywgXCJcIikucmVwbGFjZSgvXFw/LiokLywgXCJcIikucmVwbGFjZSgvXFwvW15cXC9dKyQvLCBcIi9cIik7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBzY3JpcHRVcmw7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5iID0gZG9jdW1lbnQuYmFzZVVSSSB8fCBzZWxmLmxvY2F0aW9uLmhyZWY7XG5cbi8vIG9iamVjdCB0byBzdG9yZSBsb2FkZWQgYW5kIGxvYWRpbmcgY2h1bmtzXG4vLyB1bmRlZmluZWQgPSBjaHVuayBub3QgbG9hZGVkLCBudWxsID0gY2h1bmsgcHJlbG9hZGVkL3ByZWZldGNoZWRcbi8vIFtyZXNvbHZlLCByZWplY3QsIFByb21pc2VdID0gY2h1bmsgbG9hZGluZywgMCA9IGNodW5rIGxvYWRlZFxudmFyIGluc3RhbGxlZENodW5rcyA9IHtcblx0XCJpbmRleFwiOiAwXG59O1xuXG4vLyBubyBjaHVuayBvbiBkZW1hbmQgbG9hZGluZ1xuXG4vLyBubyBwcmVmZXRjaGluZ1xuXG4vLyBubyBwcmVsb2FkZWRcblxuLy8gbm8gSE1SXG5cbi8vIG5vIEhNUiBtYW5pZmVzdFxuXG4vLyBubyBvbiBjaHVua3MgbG9hZGVkXG5cbi8vIG5vIGpzb25wIGZ1bmN0aW9uIiwiIiwiLy8gc3RhcnR1cFxuLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vLyBUaGlzIGVudHJ5IG1vZHVsZSB1c2VkICdtb2R1bGUnIHNvIGl0IGNhbid0IGJlIGlubGluZWRcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyhcIi4vc3JjL2luZGV4LmpzXCIpO1xuIiwiIl0sIm5hbWVzIjpbImluaXRpYWxpemVBcHAiLCJnZXRGaXJlc3RvcmUiLCJkb2MiLCJmaXJlYmFzZUNvbmZpZyIsImFwaUtleSIsImF1dGhEb21haW4iLCJwcm9qZWN0SWQiLCJzdG9yYWdlQnVja2V0IiwibWVzc2FnaW5nU2VuZGVySWQiLCJhcHBJZCIsIm1lYXN1cmVtZW50SWQiLCJmaXJlYmFzZUFwcCIsImRiIiwicm9vdERvYyIsImluaXRKc1BzeWNoIiwic3VydmV5VGV4dCIsImZ1bGxTY3JlZW4iLCJodG1sS2V5Ym9hcmRSZXNwb25zZSIsInZpZGVvS2V5Ym9hcmRSZXNwb25zZSIsImpzUHN5Y2hSZGsiLCJSb2FyRmlyZWtpdCIsImFzdGVyb2lkQXR0YWNrSW50cm8iLCJhc3Rlcm9pZEF0dGFja0VuZCIsImFzdGVyb2lkQXR0YWNrTGV2ZWxVcDEiLCJhc3Rlcm9pZEF0dGFja0xldmVsVXAyIiwiYXN0ZXJvaWRBdHRhY2tMZXZlbFVwMyIsImFzdGVyb2lkQXR0YWNrTGV2ZWxVcDQiLCJhc3Rlcm9pZEF0dGFja0xldmVsVXA1IiwianNQc3ljaFBhdmxvdmlhIiwianNQc3ljaEZvclVSTCIsInBhcnRpY2lwYW50SWQiLCJkYXRhIiwiZ2V0VVJMVmFyaWFibGUiLCJncmFkZSIsInNjaG9vbElkIiwiZmlyZWtpdCIsInRhc2tJbmZvIiwidGFza0lkIiwidGFza05hbWUiLCJ2YXJpYW50TmFtZSIsInRhc2tEZXNjcmlwdGlvbiIsInZhcmlhbnREZXNjcmlwdGlvbiIsImJsb2NrcyIsImJsb2NrTnVtYmVyIiwidHJpYWxNZXRob2QiLCJjb3JwdXMiLCJ1bmRlZmluZWQiLCJtaW5pbWFsVXNlckluZm8iLCJpZCIsInVzZXJJbmZvIiwic3RhcnRSdW4iLCJqc1BzeWNoIiwidGltZWxpbmUiLCJwYXZsb3ZpYUluaXQiLCJ0eXBlIiwiY29tbWFuZCIsInB1c2giLCJnZXRQaWQiLCJxdWVzdGlvbnMiLCJwcm9tcHQiLCJuYW1lIiwicGxhY2Vob2xkZXIiLCJyZXF1aXJlZCIsIm9uX2ZpbmlzaCIsInJlc3BvbnNlIiwicGFydGljaXBhbnRfaW5mbyIsIkdyYWRlIiwiaWZHZXRQaWQiLCJjb25kaXRpb25hbF9mdW5jdGlvbiIsIm9uX3RpbWVsaW5lX2ZpbmlzaCIsImNsYXNzSWQiLCJmdWxsc2NyZWVuX21vZGUiLCJzZXRIdG1sQmdHcmF5IiwiZG9jdW1lbnQiLCJib2R5Iiwic3R5bGUiLCJiYWNrZ3JvdW5kQ29sb3IiLCJ3ZWxjb21lIiwib25fc3RhcnQiLCJzdGltdWx1cyIsImNob2ljZXMiLCJ0cmlhbF9kdXJhdGlvbiIsImludHJvMSIsInJlc3BvbnNlX2FsbG93ZWRfd2hpbGVfcGxheWluZyIsIndpZHRoIiwiaGVpZ2h0IiwidGVzdEJsb2NrIiwidGltaW5nX3Bvc3RfdHJpYWwiLCJudW1iZXJfb2ZfZG90cyIsImNvaGVyZW50X2RpcmVjdGlvbiIsInRpbWVsaW5lVmFyaWFibGUiLCJjb2hlcmVuY2UiLCJjb3JyZWN0X2Nob2ljZSIsIlJES190eXBlIiwiYXBlcnR1cmVfdHlwZSIsImFwZXJ0dXJlX2NlbnRlcl94IiwiYXBlcnR1cmVfY2VudGVyX3kiLCJhcGVydHVyZV93aWR0aCIsImZpeGF0aW9uX2Nyb3NzIiwiZml4YXRpb25fY3Jvc3Nfd2lkdGgiLCJmaXhhdGlvbl9jcm9zc19oZWlnaHQiLCJmaXhhdGlvbl9jcm9zc190aGlja25lc3MiLCJkb3RfY29sb3IiLCJkb3RfcmFkaXVzIiwibW92ZV9kaXN0YW5jZSIsImRvdF9saWZlIiwicmVpbnNlcnRfdHlwZSIsImFjY3VyYWN5Iiwid3JpdGVUcmlhbCIsImNvbmRpdGlvbiIsImJsb2NrVHlwZSIsInBhcnRpY2lwYW50IiwicHJhY3RpY2VCbG9jayIsInByYWN0aWNlVHJpYWxzIiwicHJhY3RpY2VJbmZvIiwicmFuZG9taXphdGlvbiIsInJlcGVhdCIsInRyaWFscyIsInRyaWFsSW5mbyIsImZlZWRiYWNrQmxvY2siLCJsYXN0VHJpYWxBY2N1cmFjeSIsImdldExhc3RUcmlhbERhdGEiLCJ2YWx1ZXMiLCJJQkkxIiwiSUJJMiIsIklCSTMiLCJJQkk0IiwiSUJJNSIsIklCSUVuZCIsImZpbmlzaFJ1biIsIlByYWN0aWNlUHJvY2VkdXJlIiwidGltZWxpbmVfdmFyaWFibGVzIiwicmFuZG9taXplX29yZGVyIiwicmVwZXRpdGlvbiIsIk1vdGlvbkNvaFByb2NlZHVyZSIsInBhdmxvdmlhRmluaXNoIiwicnVuIiwiUGF2bG92aWFQbHVnaW4iLCJfanNQc3ljaCIsImRpc3BsYXlfZWxlbWVudCIsInRyaWFsIiwidG9Mb3dlckNhc2UiLCJfaW5pdCIsImdldCIsImNzdiIsIl9maW5pc2giLCJlcnJvckNhbGxiYWNrIiwiZmluaXNoVHJpYWwiLCJjb25maWdVUkwiLCJfY29uZmlndXJlIiwiX2NvbmZpZyIsImNvbmZpZyIsIl9sb2ciLCJfb3BlblNlc3Npb24iLCJfYmVmb3JldW5sb2FkQ2FsbGJhY2siLCJldmVudCIsInByZXZlbnREZWZhdWx0IiwicmV0dXJuVmFsdWUiLCJ3aW5kb3ciLCJhZGRFdmVudExpc3RlbmVyIiwic2Vzc2lvbiIsInN0YXR1cyIsImV4cGVyaW1lbnQiLCJzYXZlSW5jb21wbGV0ZVJlc3VsdHMiLCJfc2F2ZSIsIl9jbG9zZVNlc3Npb24iLCJyZW1vdmVFdmVudExpc3RlbmVyIiwibXNnIiwiZGlzcGxheUVsZW1lbnQiLCJnZXREaXNwbGF5RWxlbWVudCIsImlubmVySFRNTCIsImdldEVsZW1lbnRCeUlkIiwidGV4dENvbnRlbnQiLCJzeW5jIiwic2VydmVyRGF0YSIsIm9yaWdpbiIsImNvbnRleHQiLCJfZ2V0Q29uZmlndXJhdGlvbiIsImNvbmZpZ3VyYXRpb25SZXNwb25zZSIsInBzeWNob0pzTWFuYWdlciIsInBhdmxvdmlhIiwiVVJMIiwidXJsUXVlcnkiLCJsb2NhdGlvbiIsInNlYXJjaCIsInNsaWNlIiwidXJsUGFyYW1ldGVycyIsIlVSTFNlYXJjaFBhcmFtcyIsImZvckVhY2giLCJ2YWx1ZSIsImtleSIsImluZGV4T2YiLCJfc2VydmVyTXNnIiwic2V0IiwiZXJyb3IiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImZldGNoIiwibWV0aG9kIiwibW9kZSIsImNhY2hlIiwiY3JlZGVudGlhbHMiLCJoZWFkZXJzIiwicmVkaXJlY3QiLCJyZWZlcnJlclBvbGljeSIsInNlcnZlclJlc3BvbnNlIiwianNvbiIsImNvbnNvbGUiLCJmdWxscGF0aCIsImZvcm1EYXRhIiwiRm9ybURhdGEiLCJoYXMiLCJhcHBlbmQiLCJ1cmwiLCJnaXRsYWIiLCJPYmplY3QiLCJhc3NpZ24iLCJ0b2tlbiIsInN0YXR1czIiLCJzYXZlRm9ybWF0IiwiU3ltYm9sIiwibGljZW5zZSIsInJ1bk1vZGUiLCJpc0NvbXBsZXRlZCIsIm5hdmlnYXRvciIsInNlbmRCZWFjb24iLCJkYXRlIiwiRGF0ZSIsImRhdGVTdHJpbmciLCJnZXRGdWxsWWVhciIsImdldE1vbnRoIiwiZ2V0RGF0ZSIsImdldEhvdXJzIiwiZ2V0TWludXRlcyIsImdldFNlY29uZHMiLCJnZXRNaWxsaXNlY29uZHMiLCJmaWx0ZXJlZERhdGEiLCJkYXRhRmlsdGVyIiwiX3VwbG9hZERhdGEiLCJfb2ZmZXJEYXRhRm9yRG93bmxvYWQiLCJtZXNzYWdlIiwibWVzc2FnZXMiLCJsb2ciLCJ2ZXJzaW9uIiwiZmlsZW5hbWUiLCJibG9iIiwiQmxvYiIsIm1zU2F2ZU9yT3BlbkJsb2IiLCJtc1NhdmVCbG9iIiwiZWxlbSIsImNyZWF0ZUVsZW1lbnQiLCJocmVmIiwiY3JlYXRlT2JqZWN0VVJMIiwiZG93bmxvYWQiLCJhcHBlbmRDaGlsZCIsImNsaWNrIiwicmVtb3ZlQ2hpbGQiLCJodG1sQ29kZSIsInF1ZXJ5U2VsZWN0b3IiLCJNYXAiLCJpbmZvIiwiZGVzY3JpcHRpb24iLCJwYXJhbWV0ZXJzIiwiUGFyYW1ldGVyVHlwZSIsIlNUUklORyIsInByZXR0eV9uYW1lIiwiRlVOQ1RJT04iLCJkZWZhdWx0RXJyb3JDYWxsYmFjayIsImRlZmF1bHREYXRhRmlsdGVyIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/index.html b/index.html deleted file mode 100644 index 8df3c8e..0000000 --- a/index.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Asteroid Attack - - - - \ No newline at end of file diff --git a/jsPsychPavlovia.bundle.js b/jsPsychPavlovia.bundle.js deleted file mode 100644 index eeed36a..0000000 --- a/jsPsychPavlovia.bundle.js +++ /dev/null @@ -1,1001 +0,0 @@ -/******/ (() => { // webpackBootstrap -/******/ "use strict"; -/******/ // The require scope -/******/ var __webpack_require__ = {}; -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -/*!********************************!*\ - !*** ./src/jsPsychPavlovia.js ***! - \********************************/ -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "jsPsychPavlovia": () => (/* binding */ jsPsychPavlovia) -/* harmony export */ }); -function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } - -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } - -function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } - -/* eslint-disable */ - -/** - * jsPsych plugin (version > 7.0) for pavlovia.org - * - * This plugin handles communications with the pavlovia.org server: it opens and closes sessions, - * and uploads data to the server. - * - * @author Alain Pitiot - * @version 2022.1.1 - * @copyright (c) 2017-2020 Ilixa Ltd. (http://ilixa.com) (c) 2020-2021 Open Science Tools Ltd. - * (https://opensciencetools.org) - * @license Distributed under the terms of the MIT License - */ -var jsPsychPavlovia = function jsPsychPavlovia(jsPsych) { - 'use strict'; - /** - * **pavlovia** - * - * This plugin handles communications with the pavlovia.org server: it opens and closes sessions, - * and uploads data to the server. - * - * @author Alain Pitiot - * @see {@link https://pavlovia.org/docs/experiments/create-jsPsych Running jsPsych experiments from Pavlovia} - */ - - var PavloviaPlugin = /*#__PURE__*/function () { - function PavloviaPlugin(jsPsych) { - _classCallCheck(this, PavloviaPlugin); - - this._jsPsych = jsPsych; - } - /** - * Run the plugin. - * - * @param {HTMLElement} display_element - the HTML DOM element where jsPsych content - * is rendered - * @param {Object} trial - the jsPsych trial - * @public - */ - - - _createClass(PavloviaPlugin, [{ - key: "trial", - value: function () { - var _trial2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(display_element, _trial) { - var data; - return regeneratorRuntime.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - _context.t0 = _trial.command.toLowerCase(); - _context.next = _context.t0 === 'init' ? 3 : _context.t0 === 'finish' ? 6 : 10; - break; - - case 3: - _context.next = 5; - return this._init(_trial); - - case 5: - return _context.abrupt("break", 11); - - case 6: - data = this._jsPsych.data.get().csv(); - _context.next = 9; - return this._finish(_trial, data); - - case 9: - return _context.abrupt("break", 11); - - case 10: - _trial.errorCallback('unknown command: ' + _trial.command); - - case 11: - // end trial - this._jsPsych.finishTrial(); - - case 12: - case "end": - return _context.stop(); - } - } - }, _callee, this); - })); - - function trial(_x, _x2) { - return _trial2.apply(this, arguments); - } - - return trial; - }() - /** - * The default error callback function. - * - * Error messages are displayed in the body of the document and in the browser's console. - * - * @param {Object} error - the error json object to be displayed. - * @public - */ - - }, { - key: "_init", - value: - /** - * Initialise the connection with pavlovia.org: configure the plugin and open a new session. - * - * @param {Object} trial - the jsPsych trial - * @param {string} [configURL= "config.json"] - the URL of the pavlovia.org json configuration file - * @returns {Promise} - * @private - */ - function () { - var _init2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(trial) { - var _this = this; - - var configURL, - response, - _beforeunloadCallback, - _args2 = arguments; - - return regeneratorRuntime.wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - configURL = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : 'config.json'; - _context2.prev = 1; - _context2.next = 4; - return this._configure(configURL); - - case 4: - response = _context2.sent; - PavloviaPlugin._config = response.config; - - this._log('init | _configure.response=', response); // open a new session: - - - _context2.next = 9; - return this._openSession(); - - case 9: - response = _context2.sent; - - // _config.experiment.token = response.token; - this._log('init | _openSession.response=', response); // warn the user when they attempt to close the tab or browser: - - - _beforeunloadCallback = function _beforeunloadCallback(event) { - // preventDefault should ensure that the user gets prompted: - event.preventDefault(); // Chrome requires returnValue to be set: - - event.returnValue = ''; - }; - - window.addEventListener('beforeunload', _beforeunloadCallback); // when the user closes the tab or browser, we attempt to close the session - // and optionally save the results - // note: we communicate with the server using the Beacon API - - window.addEventListener('unload', function (event) { - if (PavloviaPlugin._config.session.status === 'OPEN') { - // get and save the incomplete results if need be: - if (PavloviaPlugin._config.experiment.saveIncompleteResults) { - var data = _this._jsPsych.data.get().csv(); - - _this._save(trial, data, true); - } // close the session: - - - _this._closeSession(false, true); - } - }); - _context2.next = 19; - break; - - case 16: - _context2.prev = 16; - _context2.t0 = _context2["catch"](1); - trial.errorCallback(_context2.t0); - - case 19: - case "end": - return _context2.stop(); - } - } - }, _callee2, this, [[1, 16]]); - })); - - function _init(_x3) { - return _init2.apply(this, arguments); - } - - return _init; - }() - /** - * Finish the connection with pavlovia.org: upload the collected data and close the session. - * - * @param {Object} trial - the jsPsych trial - * @param {Object} data - the experiment data to be uploaded - * @returns {Promise} - * @private - */ - - }, { - key: "_finish", - value: function () { - var _finish2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(trial, data) { - var msg, displayElement, sync, response; - return regeneratorRuntime.wrap(function _callee3$(_context3) { - while (1) { - switch (_context3.prev = _context3.next) { - case 0: - _context3.prev = 0; - // remove the beforeunload listener: - window.removeEventListener('beforeunload', PavloviaPlugin._beforeunloadCallback); // tell the participant that the data is being uploaded: - - msg = 'Please wait a moment while the data are uploaded to the pavlovia.org server...'; - displayElement = this._jsPsych.getDisplayElement(); - displayElement.innerHTML = '
';
-                  document.getElementById('pavlovia-data-upload').textContent = msg; // upload the data to pavlovia.org:
-
-                  sync = typeof trial.sync !== 'undefined' ? trial.sync : false;
-                  _context3.next = 9;
-                  return this._save(trial, data, sync);
-
-                case 9:
-                  response = _context3.sent;
-
-                  this._log('finish | _save.response=', response); // check for errors:
-
-
-                  if (!('serverData' in response && 'error' in response.serverData)) {
-                    _context3.next = 13;
-                    break;
-                  }
-
-                  throw response.serverData;
-
-                case 13:
-                  _context3.next = 15;
-                  return this._closeSession(true, false);
-
-                case 15:
-                  response = _context3.sent;
-
-                  this._log('finish | _closeSession.response=', response);
-
-                  _context3.next = 22;
-                  break;
-
-                case 19:
-                  _context3.prev = 19;
-                  _context3.t0 = _context3["catch"](0);
-                  trial.errorCallback(_context3.t0);
-
-                case 22:
-                case "end":
-                  return _context3.stop();
-              }
-            }
-          }, _callee3, this, [[0, 19]]);
-        }));
-
-        function _finish(_x4, _x5) {
-          return _finish2.apply(this, arguments);
-        }
-
-        return _finish;
-      }()
-      /**
-       * Configure the plugin by reading the configuration file created upon activation
-       * of the experiment.
-       *
-       * @param {string} [configURL= "config.json"] - the URL of the pavlovia.org json
-       * 	configuration file
-       * @returns {Promise}
-       * @private
-       */
-
-    }, {
-      key: "_configure",
-      value: function () {
-        var _configure2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4(configURL) {
-          var response, configurationResponse, urlQuery, urlParameters;
-          return regeneratorRuntime.wrap(function _callee4$(_context4) {
-            while (1) {
-              switch (_context4.prev = _context4.next) {
-                case 0:
-                  response = {
-                    origin: '_configure',
-                    context: 'when configuring the plugin'
-                  };
-                  _context4.prev = 1;
-                  _context4.next = 4;
-                  return this._getConfiguration(configURL);
-
-                case 4:
-                  configurationResponse = _context4.sent;
-
-                  // legacy experiments had a psychoJsManager block instead of a pavlovia block, and the URL
-                  // pointed to https://pavlovia.org/server
-                  if ('psychoJsManager' in configurationResponse.config) {
-                    delete configurationResponse.config.psychoJsManager;
-                    configurationResponse.config.pavlovia = {
-                      URL: 'https://pavlovia.org'
-                    };
-                  } // tests for the presence of essential blocks in the configuration:
-
-
-                  if ('experiment' in configurationResponse.config) {
-                    _context4.next = 8;
-                    break;
-                  }
-
-                  throw 'missing experiment block in configuration';
-
-                case 8:
-                  if ('name' in configurationResponse.config.experiment) {
-                    _context4.next = 10;
-                    break;
-                  }
-
-                  throw 'missing name in experiment block in configuration';
-
-                case 10:
-                  if ('fullpath' in configurationResponse.config.experiment) {
-                    _context4.next = 12;
-                    break;
-                  }
-
-                  throw 'missing fullpath in experiment block in configuration';
-
-                case 12:
-                  if ('pavlovia' in configurationResponse.config) {
-                    _context4.next = 14;
-                    break;
-                  }
-
-                  throw 'missing pavlovia block in configuration';
-
-                case 14:
-                  if ('URL' in configurationResponse.config.pavlovia) {
-                    _context4.next = 16;
-                    break;
-                  }
-
-                  throw 'missing URL in pavlovia block in configuration';
-
-                case 16:
-                  // get the server parameters (those starting with a double underscore):
-                  urlQuery = window.location.search.slice(1);
-                  urlParameters = new URLSearchParams(urlQuery);
-                  urlParameters.forEach(function (value, key) {
-                    if (key.indexOf('__') === 0) {
-                      PavloviaPlugin._serverMsg.set(key, value);
-                    }
-                  });
-                  return _context4.abrupt("return", configurationResponse);
-
-                case 22:
-                  _context4.prev = 22;
-                  _context4.t0 = _context4["catch"](1);
-                  throw _objectSpread(_objectSpread({}, response), {}, {
-                    error: _context4.t0
-                  });
-
-                case 25:
-                case "end":
-                  return _context4.stop();
-              }
-            }
-          }, _callee4, this, [[1, 22]]);
-        }));
-
-        function _configure(_x6) {
-          return _configure2.apply(this, arguments);
-        }
-
-        return _configure;
-      }()
-      /**
-       * Get the pavlovia.org json configuration file.
-       *
-       * @param {string} configURL - the URL of the pavlovia.org json configuration file
-       * @returns {Promise}
-       * @private
-       */
-
-    }, {
-      key: "_getConfiguration",
-      value: function _getConfiguration(configURL) {
-        var response = {
-          origin: '_getConfiguration',
-          context: 'when reading the configuration file: ' + configURL
-        };
-        return new Promise( /*#__PURE__*/function () {
-          var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5(resolve, reject) {
-            var serverResponse, serverData;
-            return regeneratorRuntime.wrap(function _callee5$(_context5) {
-              while (1) {
-                switch (_context5.prev = _context5.next) {
-                  case 0:
-                    _context5.prev = 0;
-                    _context5.next = 3;
-                    return fetch(configURL, {
-                      method: 'GET',
-                      mode: 'cors',
-                      cache: 'no-cache',
-                      credentials: 'same-origin',
-                      headers: {
-                        'Content-Type': 'application/json'
-                      },
-                      redirect: 'follow',
-                      referrerPolicy: 'no-referrer'
-                    });
-
-                  case 3:
-                    serverResponse = _context5.sent;
-                    _context5.next = 6;
-                    return serverResponse.json();
-
-                  case 6:
-                    serverData = _context5.sent;
-                    resolve(_objectSpread(_objectSpread({}, response), {}, {
-                      config: serverData
-                    }));
-                    _context5.next = 14;
-                    break;
-
-                  case 10:
-                    _context5.prev = 10;
-                    _context5.t0 = _context5["catch"](0);
-                    console.error(_context5.t0);
-                    reject(_objectSpread(_objectSpread({}, response), {}, {
-                      error: _context5.t0
-                    }));
-
-                  case 14:
-                  case "end":
-                    return _context5.stop();
-                }
-              }
-            }, _callee5, null, [[0, 10]]);
-          }));
-
-          return function (_x7, _x8) {
-            return _ref.apply(this, arguments);
-          };
-        }());
-      }
-      /**
-       * Open a new session for this experiment on pavlovia.org.
-       *
-       * @returns {Promise}
-       * @private
-       */
-
-    }, {
-      key: "_openSession",
-      value: function _openSession() {
-        var response = {
-          origin: '_openSession',
-          context: 'when opening a session for experiment: ' + PavloviaPlugin._config.experiment.fullpath
-        }; // prepare a POST query:
-
-        var formData = new FormData();
-
-        if (PavloviaPlugin._serverMsg.has('__pilotToken')) {
-          formData.append('pilotToken', PavloviaPlugin._serverMsg.get('__pilotToken'));
-        } // query pavlovia server:
-
-
-        return new Promise( /*#__PURE__*/function () {
-          var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee6(resolve, reject) {
-            var url, serverResponse, serverData;
-            return regeneratorRuntime.wrap(function _callee6$(_context6) {
-              while (1) {
-                switch (_context6.prev = _context6.next) {
-                  case 0:
-                    url = "".concat(PavloviaPlugin._config.pavlovia.URL, "/api/v2/experiments/").concat(PavloviaPlugin._config.gitlab.projectId, "/sessions");
-                    _context6.prev = 1;
-                    _context6.next = 4;
-                    return fetch(url, {
-                      method: 'POST',
-                      mode: 'cors',
-                      cache: 'no-cache',
-                      credentials: 'same-origin',
-                      headers: {
-                        'Content-Type': 'application/json'
-                      },
-                      redirect: 'follow',
-                      referrerPolicy: 'no-referrer',
-                      body: formData
-                    });
-
-                  case 4:
-                    serverResponse = _context6.sent;
-                    _context6.next = 7;
-                    return serverResponse.json();
-
-                  case 7:
-                    serverData = _context6.sent;
-
-                    // check for required attributes:
-                    if (!('token' in serverData)) {
-                      reject(Object.assign(response, {
-                        error: 'unexpected answer from server: no token'
-                      }));
-                    }
-
-                    if (!('experiment' in serverData)) {
-                      reject(Object.assign(response, {
-                        error: 'unexpected answer from server: no experiment'
-                      }));
-                    } // update the configuration:
-
-
-                    PavloviaPlugin._config.session = {
-                      token: serverData.token,
-                      status: 'OPEN'
-                    };
-                    PavloviaPlugin._config.experiment.status = serverData.experiment.status2;
-                    PavloviaPlugin._config.experiment.saveFormat = Symbol["for"](serverData.experiment.saveFormat);
-                    PavloviaPlugin._config.experiment.saveIncompleteResults = serverData.experiment.saveIncompleteResults;
-                    PavloviaPlugin._config.experiment.license = serverData.experiment.license;
-                    PavloviaPlugin._config.runMode = serverData.experiment.runMode;
-                    resolve(Object.assign(response, {
-                      token: serverData.token,
-                      status: serverData.experiment.status2
-                    }));
-                    _context6.next = 23;
-                    break;
-
-                  case 19:
-                    _context6.prev = 19;
-                    _context6.t0 = _context6["catch"](1);
-                    console.error(_context6.t0);
-                    reject(_objectSpread(_objectSpread({}, response), {}, {
-                      error: _context6.t0
-                    }));
-
-                  case 23:
-                  case "end":
-                    return _context6.stop();
-                }
-              }
-            }, _callee6, null, [[1, 19]]);
-          }));
-
-          return function (_x9, _x10) {
-            return _ref2.apply(this, arguments);
-          };
-        }());
-      }
-      /**
-       * Close the previously opened session on pavlovia.org.
-       *
-       * @param {boolean} isCompleted - whether or not the participant completed the experiment
-       * @param {boolean} [sync = false] - whether or not to use the Beacon API to communicate
-       * 	with the server
-       * @private
-       */
-
-    }, {
-      key: "_closeSession",
-      value: function _closeSession() {
-        var isCompleted = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
-        var sync = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
-        var response = {
-          origin: '_closeSession',
-          context: 'when closing the session for experiment: ' + PavloviaPlugin._config.experiment.fullpath
-        }; // prepare a DELETE query:
-
-        var url = PavloviaPlugin._config.pavlovia.URL + '/api/v2/experiments/' + PavloviaPlugin._config.gitlab.projectId + '/sessions/' + PavloviaPlugin._config.session.token;
-        var formData = new FormData();
-        formData.append('isCompleted', isCompleted); // synchronously query the pavlovia server:
-
-        if (sync) {
-          navigator.sendBeacon(url + '/delete', formData);
-          PavloviaPlugin._config.session.status = 'CLOSED';
-        } else {
-          // asynchronously query the pavlovia server:
-          return new Promise( /*#__PURE__*/function () {
-            var _ref3 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee7(resolve, reject) {
-              var serverResponse, serverData;
-              return regeneratorRuntime.wrap(function _callee7$(_context7) {
-                while (1) {
-                  switch (_context7.prev = _context7.next) {
-                    case 0:
-                      _context7.prev = 0;
-                      _context7.next = 3;
-                      return fetch(url, {
-                        method: 'DELETE',
-                        mode: 'cors',
-                        cache: 'no-cache',
-                        credentials: 'same-origin',
-                        redirect: 'follow',
-                        referrerPolicy: 'no-referrer',
-                        body: formData
-                      });
-
-                    case 3:
-                      serverResponse = _context7.sent;
-                      _context7.next = 6;
-                      return serverResponse.json();
-
-                    case 6:
-                      serverData = _context7.sent;
-                      PavloviaPlugin._config.session.status = 'CLOSED';
-                      resolve(Object.assign(response, {
-                        serverData: serverData
-                      }));
-                      _context7.next = 15;
-                      break;
-
-                    case 11:
-                      _context7.prev = 11;
-                      _context7.t0 = _context7["catch"](0);
-                      console.error(_context7.t0);
-                      reject(_objectSpread(_objectSpread({}, response), {}, {
-                        error: _context7.t0
-                      }));
-
-                    case 15:
-                    case "end":
-                      return _context7.stop();
-                  }
-                }
-              }, _callee7, null, [[0, 11]]);
-            }));
-
-            return function (_x11, _x12) {
-              return _ref3.apply(this, arguments);
-            };
-          }());
-        }
-      }
-      /**
-       * Upload data to the pavlovia.org server.
-       *
-       * @param {Object} trial - the jsPsych trial
-       * @param {string} data - the experiment data to be uploaded
-       * @param {boolean} [sync = false] - whether or not to use the Beacon API to communicate
-       * 	with the server
-       * @return {Promise}
-       * @private
-       */
-
-    }, {
-      key: "_save",
-      value: function () {
-        var _save2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee8(trial, data) {
-          var sync,
-              date,
-              dateString,
-              key,
-              filteredData,
-              _args8 = arguments;
-          return regeneratorRuntime.wrap(function _callee8$(_context8) {
-            while (1) {
-              switch (_context8.prev = _context8.next) {
-                case 0:
-                  sync = _args8.length > 2 && _args8[2] !== undefined ? _args8[2] : false;
-                  date = new Date();
-                  dateString = date.getFullYear() + '-' + ('0' + (1 + date.getMonth())).slice(-2) + '-' + ('0' + date.getDate()).slice(-2) + '_';
-                  dateString += ('0' + date.getHours()).slice(-2) + 'h' + ('0' + date.getMinutes()).slice(-2) + '.' + ('0' + date.getSeconds()).slice(-2) + '.' + date.getMilliseconds();
-                  key = PavloviaPlugin._config.experiment.name + '_' + trial.participantId + '_' + 'SESSION' + '_' + dateString + '.csv';
-                  filteredData = trial.dataFilter(data);
-
-                  if (!(PavloviaPlugin._config.experiment.status === 'RUNNING' && !PavloviaPlugin._serverMsg.has('__pilotToken'))) {
-                    _context8.next = 12;
-                    break;
-                  }
-
-                  _context8.next = 9;
-                  return this._uploadData(key, filteredData, sync);
-
-                case 9:
-                  return _context8.abrupt("return", _context8.sent);
-
-                case 12:
-                  this._offerDataForDownload(key, filteredData, 'text/csv');
-
-                  return _context8.abrupt("return", {
-                    origin: '_save',
-                    context: 'when saving results for experiment: ' + PavloviaPlugin._config.experiment.fullpath,
-                    message: 'offered the .csv file for download'
-                  });
-
-                case 14:
-                case "end":
-                  return _context8.stop();
-              }
-            }
-          }, _callee8, this);
-        }));
-
-        function _save(_x13, _x14) {
-          return _save2.apply(this, arguments);
-        }
-
-        return _save;
-      }()
-      /**
-       * Upload data (a key/value pair) to pavlovia.org.
-       *
-       * @param {string} key - the key
-       * @param {string} value - the value
-       * @param {boolean} [sync = false] - whether or not to upload the data using the Beacon API
-       * @returns {Promise}
-       * @private
-       */
-
-    }, {
-      key: "_uploadData",
-      value: function _uploadData(key, value) {
-        var sync = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
-        var response = {
-          origin: '_uploadData',
-          context: "when uploading participant' results for experiment: " + PavloviaPlugin._config.experiment.fullpath
-        };
-        var url = PavloviaPlugin._config.pavlovia.URL + '/api/v2/experiments/' + PavloviaPlugin._config.gitlab.projectId + '/sessions/' + PavloviaPlugin._config.session.token + '/results';
-        var formData = new FormData();
-        formData.append('key', key);
-        formData.append('value', value); // synchronous query the pavlovia server:
-
-        if (sync) {
-          navigator.sendBeacon(url, formData);
-        } // asynchronously query the pavlovia server:
-        else {
-          return new Promise( /*#__PURE__*/function () {
-            var _ref4 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee9(resolve, reject) {
-              var serverResponse, serverData;
-              return regeneratorRuntime.wrap(function _callee9$(_context9) {
-                while (1) {
-                  switch (_context9.prev = _context9.next) {
-                    case 0:
-                      _context9.prev = 0;
-                      _context9.next = 3;
-                      return fetch(url, {
-                        method: 'POST',
-                        mode: 'cors',
-                        cache: 'no-cache',
-                        credentials: 'same-origin',
-                        redirect: 'follow',
-                        referrerPolicy: 'no-referrer',
-                        body: formData
-                      });
-
-                    case 3:
-                      serverResponse = _context9.sent;
-                      _context9.next = 6;
-                      return serverResponse.json();
-
-                    case 6:
-                      serverData = _context9.sent;
-                      resolve(Object.assign(response, {
-                        serverData: serverData
-                      }));
-                      _context9.next = 14;
-                      break;
-
-                    case 10:
-                      _context9.prev = 10;
-                      _context9.t0 = _context9["catch"](0);
-                      console.error(_context9.t0);
-                      reject(_objectSpread(_objectSpread({}, response), {}, {
-                        error: _context9.t0
-                      }));
-
-                    case 14:
-                    case "end":
-                      return _context9.stop();
-                  }
-                }
-              }, _callee9, null, [[0, 10]]);
-            }));
-
-            return function (_x15, _x16) {
-              return _ref4.apply(this, arguments);
-            };
-          }());
-        }
-      }
-      /**
-       * Log messages to the browser's console.
-       *
-       * @param {...*} messages - the messages to be displayed in the browser's console
-       * @private
-       */
-
-    }, {
-      key: "_log",
-      value: function _log() {
-        var _console;
-
-        for (var _len = arguments.length, messages = new Array(_len), _key = 0; _key < _len; _key++) {
-          messages[_key] = arguments[_key];
-        }
-
-        (_console = console).log.apply(_console, ['[pavlovia ' + PavloviaPlugin.version + ']'].concat(messages));
-      }
-      /**
-       * Offer data as download in the browser.
-       *
-       * @param {string} filename - the name of the file to be downloaded
-       * @param {*} data - the data
-       * @param {string} type - the MIME type of the data, e.g. 'text/csv' or 'application/json'
-       * @private
-       */
-
-    }, {
-      key: "_offerDataForDownload",
-      value: function _offerDataForDownload(filename, data, type) {
-        var blob = new Blob([data], {
-          type: type
-        });
-
-        if (window.navigator.msSaveOrOpenBlob) {
-          window.navigator.msSaveBlob(blob, filename);
-        } else {
-          var elem = window.document.createElement('a');
-          elem.href = window.URL.createObjectURL(blob);
-          elem.download = filename;
-          document.body.appendChild(elem);
-          elem.click();
-          document.body.removeChild(elem);
-        }
-      }
-    }], [{
-      key: "defaultErrorCallback",
-      value: function defaultErrorCallback(error) {
-        // output the error to the console:
-        console.error('[pavlovia ' + PavloviaPlugin.version + ']', error); // output the error to the html body:
-
-        var htmlCode = '

[jspsych-pavlovia plugin ' + PavloviaPlugin.version + '] Error

    '; - - while (true) { - if (_typeof(error) === 'object' && 'context' in error) { - htmlCode += '
  • ' + error.context + '
  • '; - error = error.error; - } else { - htmlCode += '
  • ' + error + '
  • '; - break; - } - } - - htmlCode += '
'; - document.querySelector('body').innerHTML = htmlCode; - } - /** - * The default data filter, applied to the data gathered by jsPsych, before they are - * uploaded to the server. - * - * The filter typically prunes and reformat jsPsych.data.get().csv(). - * - * @param {Object} data - input data, typically from jsPsych.data.get().csv() - * @returns filtered data, ready for upload to the server - * @public - */ - - }, { - key: "defaultDataFilter", - value: function defaultDataFilter(data) { - return data; - } - }]); - - return PavloviaPlugin; - }(); - /** - * Plugin version: - * @public - */ - - - PavloviaPlugin.version = '2022.1.1'; - /** - * The pavlovia.org configuration (usually read from the config.json configuration file). - * - * @type {Object} - * @private - */ - - PavloviaPlugin._config = {}; - /** - * The callback for the beforeunload event, which is triggered when the participant - * tries to leave the experiment by closing the tab or browser. - * - * @type {null} - * @private - */ - - PavloviaPlugin._beforeunloadCallback = null; - /** - * The server parameters (those starting with a double underscore). - * - * @type {Object} - * @private - */ - - PavloviaPlugin._serverMsg = new Map(); - /** - * Plugin information. - * @public - */ - - PavloviaPlugin.info = { - name: 'pavlovia', - description: 'communication with pavlovia.org', - parameters: { - command: { - type: jsPsych.ParameterType.STRING, - pretty_name: 'Command', - "default": 'init', - description: 'The pavlovia command: "init" (default) or "finish"' - }, - participantId: { - type: jsPsych.ParameterType.STRING, - pretty_name: 'Participant Id', - "default": 'PARTICIPANT', - description: 'The participant Id: "PARTICIPANT" (default) or any string' - }, - errorCallback: { - type: jsPsych.ParameterType.FUNCTION, - pretty_name: 'ErrorCallback', - "default": PavloviaPlugin.defaultErrorCallback, - description: 'The callback function called whenever an error has occurred' - }, - dataFilter: { - type: jsPsych.ParameterType.FUNCTION, - pretty_name: 'DataFilter', - "default": PavloviaPlugin.defaultDataFilter, - description: 'The filter applied to the data gathered by jsPsych before upload to the server' - } - } - }; - return PavloviaPlugin; -}; -/******/ })() -; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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UzFJLGNBQWMsQ0FBQzZJLGlCQUhkO0FBSVZQLFFBQUFBLFdBQVcsRUFDVDtBQUxRO0FBckJGO0FBSFEsR0FBdEI7QUFrQ0EsU0FBT3RJLGNBQVA7QUFDRCxDQTVuQk0sQyIsInNvdXJjZXMiOlsid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9hc3Rlcm9pZC1hdHRhY2svd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL2FzdGVyb2lkLWF0dGFjay8uL3NyYy9qc1BzeWNoUGF2bG92aWEuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhlIHJlcXVpcmUgc2NvcGVcbnZhciBfX3dlYnBhY2tfcmVxdWlyZV9fID0ge307XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyoqXG4gKiBqc1BzeWNoIHBsdWdpbiAodmVyc2lvbiA+IDcuMCkgZm9yIHBhdmxvdmlhLm9yZ1xuICpcbiAqIFRoaXMgcGx1Z2luIGhhbmRsZXMgY29tbXVuaWNhdGlvbnMgd2l0aCB0aGUgcGF2bG92aWEub3JnIHNlcnZlcjogaXQgb3BlbnMgYW5kIGNsb3NlcyBzZXNzaW9ucyxcbiAqIGFuZCB1cGxvYWRzIGRhdGEgdG8gdGhlIHNlcnZlci5cbiAqXG4gKiBAYXV0aG9yIEFsYWluIFBpdGlvdFxuICogQHZlcnNpb24gMjAyMi4xLjFcbiAqIEBjb3B5cmlnaHQgKGMpIDIwMTctMjAyMCBJbGl4YSBMdGQuIChodHRwOi8vaWxpeGEuY29tKSAoYykgMjAyMC0yMDIxIE9wZW4gU2NpZW5jZSBUb29scyBMdGQuXG4gKiAgIChodHRwczovL29wZW5zY2llbmNldG9vbHMub3JnKVxuICogQGxpY2Vuc2UgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNSVQgTGljZW5zZVxuICovXG5cbmV4cG9ydCBjb25zdCBqc1BzeWNoUGF2bG92aWEgPSAoanNQc3ljaCkgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLyoqXG4gICAqICoqcGF2bG92aWEqKlxuICAgKlxuICAgKiBUaGlzIHBsdWdpbiBoYW5kbGVzIGNvbW11bmljYXRpb25zIHdpdGggdGhlIHBhdmxvdmlhLm9yZyBzZXJ2ZXI6IGl0IG9wZW5zIGFuZCBjbG9zZXMgc2Vzc2lvbnMsXG4gICAqIGFuZCB1cGxvYWRzIGRhdGEgdG8gdGhlIHNlcnZlci5cbiAgICpcbiAgICogQGF1dGhvciBBbGFpbiBQaXRpb3RcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9wYXZsb3ZpYS5vcmcvZG9jcy9leHBlcmltZW50cy9jcmVhdGUtanNQc3ljaCBSdW5uaW5nIGpzUHN5Y2ggZXhwZXJpbWVudHMgZnJvbSBQYXZsb3ZpYX1cbiAgICovXG4gIGNsYXNzIFBhdmxvdmlhUGx1Z2luIHtcbiAgICBjb25zdHJ1Y3Rvcihqc1BzeWNoKSB7XG4gICAgICB0aGlzLl9qc1BzeWNoID0ganNQc3ljaDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSdW4gdGhlIHBsdWdpbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGRpc3BsYXlfZWxlbWVudCAtIHRoZSBIVE1MIERPTSBlbGVtZW50IHdoZXJlIGpzUHN5Y2ggY29udGVudFxuICAgICAqIFx0aXMgcmVuZGVyZWRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdHJpYWwgLSB0aGUganNQc3ljaCB0cmlhbFxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBhc3luYyB0cmlhbChkaXNwbGF5X2VsZW1lbnQsIHRyaWFsKSB7XG4gICAgICAvLyBleGVjdXRlIHRoZSBjb21tYW5kOlxuICAgICAgc3dpdGNoICh0cmlhbC5jb21tYW5kLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgY2FzZSAnaW5pdCc6XG4gICAgICAgICAgYXdhaXQgdGhpcy5faW5pdCh0cmlhbCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnZmluaXNoJzpcbiAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5fanNQc3ljaC5kYXRhLmdldCgpLmNzdigpO1xuICAgICAgICAgIGF3YWl0IHRoaXMuX2ZpbmlzaCh0cmlhbCwgZGF0YSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0cmlhbC5lcnJvckNhbGxiYWNrKCd1bmtub3duIGNvbW1hbmQ6ICcgKyB0cmlhbC5jb21tYW5kKTtcbiAgICAgIH1cblxuICAgICAgLy8gZW5kIHRyaWFsXG4gICAgICB0aGlzLl9qc1BzeWNoLmZpbmlzaFRyaWFsKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgZXJyb3IgY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBFcnJvciBtZXNzYWdlcyBhcmUgZGlzcGxheWVkIGluIHRoZSBib2R5IG9mIHRoZSBkb2N1bWVudCBhbmQgaW4gdGhlIGJyb3dzZXIncyBjb25zb2xlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVycm9yIC0gdGhlIGVycm9yIGpzb24gb2JqZWN0IHRvIGJlIGRpc3BsYXllZC5cbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgc3RhdGljIGRlZmF1bHRFcnJvckNhbGxiYWNrKGVycm9yKSB7XG4gICAgICAvLyBvdXRwdXQgdGhlIGVycm9yIHRvIHRoZSBjb25zb2xlOlxuICAgICAgY29uc29sZS5lcnJvcignW3BhdmxvdmlhICcgKyBQYXZsb3ZpYVBsdWdpbi52ZXJzaW9uICsgJ10nLCBlcnJvcik7XG5cbiAgICAgIC8vIG91dHB1dCB0aGUgZXJyb3IgdG8gdGhlIGh0bWwgYm9keTpcbiAgICAgIGxldCBodG1sQ29kZSA9XG4gICAgICAgICc8aDM+W2pzcHN5Y2gtcGF2bG92aWEgcGx1Z2luICcgK1xuICAgICAgICBQYXZsb3ZpYVBsdWdpbi52ZXJzaW9uICtcbiAgICAgICAgJ10gRXJyb3I8L2gzPjx1bD4nO1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgJ2NvbnRleHQnIGluIGVycm9yKSB7XG4gICAgICAgICAgaHRtbENvZGUgKz0gJzxsaT4nICsgZXJyb3IuY29udGV4dCArICc8L2xpPic7XG4gICAgICAgICAgZXJyb3IgPSBlcnJvci5lcnJvcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBodG1sQ29kZSArPSAnPGxpPjxiPicgKyBlcnJvciArICc8L2I+PC9saT4nO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBodG1sQ29kZSArPSAnPC91bD4nO1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keScpLmlubmVySFRNTCA9IGh0bWxDb2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IGRhdGEgZmlsdGVyLCBhcHBsaWVkIHRvIHRoZSBkYXRhIGdhdGhlcmVkIGJ5IGpzUHN5Y2gsIGJlZm9yZSB0aGV5IGFyZVxuICAgICAqIHVwbG9hZGVkIHRvIHRoZSBzZXJ2ZXIuXG4gICAgICpcbiAgICAgKiBUaGUgZmlsdGVyIHR5cGljYWxseSBwcnVuZXMgYW5kIHJlZm9ybWF0IGpzUHN5Y2guZGF0YS5nZXQoKS5jc3YoKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gaW5wdXQgZGF0YSwgdHlwaWNhbGx5IGZyb20ganNQc3ljaC5kYXRhLmdldCgpLmNzdigpXG4gICAgICogQHJldHVybnMgZmlsdGVyZWQgZGF0YSwgcmVhZHkgZm9yIHVwbG9hZCB0byB0aGUgc2VydmVyXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIHN0YXRpYyBkZWZhdWx0RGF0YUZpbHRlcihkYXRhKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXNlIHRoZSBjb25uZWN0aW9uIHdpdGggcGF2bG92aWEub3JnOiBjb25maWd1cmUgdGhlIHBsdWdpbiBhbmQgb3BlbiBhIG5ldyBzZXNzaW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHRyaWFsIC0gdGhlIGpzUHN5Y2ggdHJpYWxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NvbmZpZ1VSTD0gXCJjb25maWcuanNvblwiXSAtIHRoZSBVUkwgb2YgdGhlIHBhdmxvdmlhLm9yZyBqc29uIGNvbmZpZ3VyYXRpb24gZmlsZVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgYXN5bmMgX2luaXQodHJpYWwsIGNvbmZpZ1VSTCA9ICdjb25maWcuanNvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGNvbmZpZ3VyZTpcbiAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fY29uZmlndXJlKGNvbmZpZ1VSTCk7XG4gICAgICAgIFBhdmxvdmlhUGx1Z2luLl9jb25maWcgPSByZXNwb25zZS5jb25maWc7XG4gICAgICAgIHRoaXMuX2xvZygnaW5pdCB8IF9jb25maWd1cmUucmVzcG9uc2U9JywgcmVzcG9uc2UpO1xuXG4gICAgICAgIC8vIG9wZW4gYSBuZXcgc2Vzc2lvbjpcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9vcGVuU2Vzc2lvbigpO1xuICAgICAgICAvLyBfY29uZmlnLmV4cGVyaW1lbnQudG9rZW4gPSByZXNwb25zZS50b2tlbjtcbiAgICAgICAgdGhpcy5fbG9nKCdpbml0IHwgX29wZW5TZXNzaW9uLnJlc3BvbnNlPScsIHJlc3BvbnNlKTtcblxuICAgICAgICAvLyB3YXJuIHRoZSB1c2VyIHdoZW4gdGhleSBhdHRlbXB0IHRvIGNsb3NlIHRoZSB0YWIgb3IgYnJvd3NlcjpcbiAgICAgICAgY29uc3QgX2JlZm9yZXVubG9hZENhbGxiYWNrID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgLy8gcHJldmVudERlZmF1bHQgc2hvdWxkIGVuc3VyZSB0aGF0IHRoZSB1c2VyIGdldHMgcHJvbXB0ZWQ6XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgIC8vIENocm9tZSByZXF1aXJlcyByZXR1cm5WYWx1ZSB0byBiZSBzZXQ6XG4gICAgICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSAnJztcbiAgICAgICAgfTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIF9iZWZvcmV1bmxvYWRDYWxsYmFjayk7XG5cbiAgICAgICAgLy8gd2hlbiB0aGUgdXNlciBjbG9zZXMgdGhlIHRhYiBvciBicm93c2VyLCB3ZSBhdHRlbXB0IHRvIGNsb3NlIHRoZSBzZXNzaW9uXG4gICAgICAgIC8vIGFuZCBvcHRpb25hbGx5IHNhdmUgdGhlIHJlc3VsdHNcbiAgICAgICAgLy8gbm90ZTogd2UgY29tbXVuaWNhdGUgd2l0aCB0aGUgc2VydmVyIHVzaW5nIHRoZSBCZWFjb24gQVBJXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd1bmxvYWQnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoUGF2bG92aWFQbHVnaW4uX2NvbmZpZy5zZXNzaW9uLnN0YXR1cyA9PT0gJ09QRU4nKSB7XG4gICAgICAgICAgICAvLyBnZXQgYW5kIHNhdmUgdGhlIGluY29tcGxldGUgcmVzdWx0cyBpZiBuZWVkIGJlOlxuICAgICAgICAgICAgaWYgKFBhdmxvdmlhUGx1Z2luLl9jb25maWcuZXhwZXJpbWVudC5zYXZlSW5jb21wbGV0ZVJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuX2pzUHN5Y2guZGF0YS5nZXQoKS5jc3YoKTtcbiAgICAgICAgICAgICAgdGhpcy5fc2F2ZSh0cmlhbCwgZGF0YSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNsb3NlIHRoZSBzZXNzaW9uOlxuICAgICAgICAgICAgdGhpcy5fY2xvc2VTZXNzaW9uKGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdHJpYWwuZXJyb3JDYWxsYmFjayhlcnJvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluaXNoIHRoZSBjb25uZWN0aW9uIHdpdGggcGF2bG92aWEub3JnOiB1cGxvYWQgdGhlIGNvbGxlY3RlZCBkYXRhIGFuZCBjbG9zZSB0aGUgc2Vzc2lvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0cmlhbCAtIHRoZSBqc1BzeWNoIHRyaWFsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSB0aGUgZXhwZXJpbWVudCBkYXRhIHRvIGJlIHVwbG9hZGVkXG4gICAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBhc3luYyBfZmluaXNoKHRyaWFsLCBkYXRhKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyByZW1vdmUgdGhlIGJlZm9yZXVubG9hZCBsaXN0ZW5lcjpcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgJ2JlZm9yZXVubG9hZCcsXG4gICAgICAgICAgUGF2bG92aWFQbHVnaW4uX2JlZm9yZXVubG9hZENhbGxiYWNrXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gdGVsbCB0aGUgcGFydGljaXBhbnQgdGhhdCB0aGUgZGF0YSBpcyBiZWluZyB1cGxvYWRlZDpcbiAgICAgICAgY29uc3QgbXNnID1cbiAgICAgICAgICAnUGxlYXNlIHdhaXQgYSBtb21lbnQgd2hpbGUgdGhlIGRhdGEgYXJlIHVwbG9hZGVkIHRvIHRoZSBwYXZsb3ZpYS5vcmcgc2VydmVyLi4uJztcbiAgICAgICAgY29uc3QgZGlzcGxheUVsZW1lbnQgPSB0aGlzLl9qc1BzeWNoLmdldERpc3BsYXlFbGVtZW50KCk7XG4gICAgICAgIGRpc3BsYXlFbGVtZW50LmlubmVySFRNTCA9ICc8cHJlIGlkPVwicGF2bG92aWEtZGF0YS11cGxvYWRcIj48L3ByZT4nO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGF2bG92aWEtZGF0YS11cGxvYWQnKS50ZXh0Q29udGVudCA9IG1zZztcblxuICAgICAgICAvLyB1cGxvYWQgdGhlIGRhdGEgdG8gcGF2bG92aWEub3JnOlxuICAgICAgICBjb25zdCBzeW5jID0gdHlwZW9mIHRyaWFsLnN5bmMgIT09ICd1bmRlZmluZWQnID8gdHJpYWwuc3luYyA6IGZhbHNlO1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zYXZlKHRyaWFsLCBkYXRhLCBzeW5jKTtcbiAgICAgICAgdGhpcy5fbG9nKCdmaW5pc2ggfCBfc2F2ZS5yZXNwb25zZT0nLCByZXNwb25zZSk7XG5cbiAgICAgICAgLy8gY2hlY2sgZm9yIGVycm9yczpcbiAgICAgICAgaWYgKCdzZXJ2ZXJEYXRhJyBpbiByZXNwb25zZSAmJiAnZXJyb3InIGluIHJlc3BvbnNlLnNlcnZlckRhdGEpIHtcbiAgICAgICAgICB0aHJvdyByZXNwb25zZS5zZXJ2ZXJEYXRhO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2xvc2UgdGhlIHNlc3Npb246XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fY2xvc2VTZXNzaW9uKHRydWUsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fbG9nKCdmaW5pc2ggfCBfY2xvc2VTZXNzaW9uLnJlc3BvbnNlPScsIHJlc3BvbnNlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRyaWFsLmVycm9yQ2FsbGJhY2soZXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSB0aGUgcGx1Z2luIGJ5IHJlYWRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBjcmVhdGVkIHVwb24gYWN0aXZhdGlvblxuICAgICAqIG9mIHRoZSBleHBlcmltZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjb25maWdVUkw9IFwiY29uZmlnLmpzb25cIl0gLSB0aGUgVVJMIG9mIHRoZSBwYXZsb3ZpYS5vcmcganNvblxuICAgICAqIFx0Y29uZmlndXJhdGlvbiBmaWxlXG4gICAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGFzeW5jIF9jb25maWd1cmUoY29uZmlnVVJMKSB7XG4gICAgICBsZXQgcmVzcG9uc2UgPSB7XG4gICAgICAgIG9yaWdpbjogJ19jb25maWd1cmUnLFxuICAgICAgICBjb250ZXh0OiAnd2hlbiBjb25maWd1cmluZyB0aGUgcGx1Z2luJyxcbiAgICAgIH07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZ3VyYXRpb25SZXNwb25zZSA9IGF3YWl0IHRoaXMuX2dldENvbmZpZ3VyYXRpb24oY29uZmlnVVJMKTtcblxuICAgICAgICAvLyBsZWdhY3kgZXhwZXJpbWVudHMgaGFkIGEgcHN5Y2hvSnNNYW5hZ2VyIGJsb2NrIGluc3RlYWQgb2YgYSBwYXZsb3ZpYSBibG9jaywgYW5kIHRoZSBVUkxcbiAgICAgICAgLy8gcG9pbnRlZCB0byBodHRwczovL3BhdmxvdmlhLm9yZy9zZXJ2ZXJcbiAgICAgICAgaWYgKCdwc3ljaG9Kc01hbmFnZXInIGluIGNvbmZpZ3VyYXRpb25SZXNwb25zZS5jb25maWcpIHtcbiAgICAgICAgICBkZWxldGUgY29uZmlndXJhdGlvblJlc3BvbnNlLmNvbmZpZy5wc3ljaG9Kc01hbmFnZXI7XG4gICAgICAgICAgY29uZmlndXJhdGlvblJlc3BvbnNlLmNvbmZpZy5wYXZsb3ZpYSA9IHtcbiAgICAgICAgICAgIFVSTDogJ2h0dHBzOi8vcGF2bG92aWEub3JnJyxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGVzdHMgZm9yIHRoZSBwcmVzZW5jZSBvZiBlc3NlbnRpYWwgYmxvY2tzIGluIHRoZSBjb25maWd1cmF0aW9uOlxuICAgICAgICBpZiAoISgnZXhwZXJpbWVudCcgaW4gY29uZmlndXJhdGlvblJlc3BvbnNlLmNvbmZpZykpIHtcbiAgICAgICAgICB0aHJvdyAnbWlzc2luZyBleHBlcmltZW50IGJsb2NrIGluIGNvbmZpZ3VyYXRpb24nO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKCduYW1lJyBpbiBjb25maWd1cmF0aW9uUmVzcG9uc2UuY29uZmlnLmV4cGVyaW1lbnQpKSB7XG4gICAgICAgICAgdGhyb3cgJ21pc3NpbmcgbmFtZSBpbiBleHBlcmltZW50IGJsb2NrIGluIGNvbmZpZ3VyYXRpb24nO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKCdmdWxscGF0aCcgaW4gY29uZmlndXJhdGlvblJlc3BvbnNlLmNvbmZpZy5leHBlcmltZW50KSkge1xuICAgICAgICAgIHRocm93ICdtaXNzaW5nIGZ1bGxwYXRoIGluIGV4cGVyaW1lbnQgYmxvY2sgaW4gY29uZmlndXJhdGlvbic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoJ3BhdmxvdmlhJyBpbiBjb25maWd1cmF0aW9uUmVzcG9uc2UuY29uZmlnKSkge1xuICAgICAgICAgIHRocm93ICdtaXNzaW5nIHBhdmxvdmlhIGJsb2NrIGluIGNvbmZpZ3VyYXRpb24nO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKCdVUkwnIGluIGNvbmZpZ3VyYXRpb25SZXNwb25zZS5jb25maWcucGF2bG92aWEpKSB7XG4gICAgICAgICAgdGhyb3cgJ21pc3NpbmcgVVJMIGluIHBhdmxvdmlhIGJsb2NrIGluIGNvbmZpZ3VyYXRpb24nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZ2V0IHRoZSBzZXJ2ZXIgcGFyYW1ldGVycyAodGhvc2Ugc3RhcnRpbmcgd2l0aCBhIGRvdWJsZSB1bmRlcnNjb3JlKTpcbiAgICAgICAgY29uc3QgdXJsUXVlcnkgPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoLnNsaWNlKDEpO1xuICAgICAgICBjb25zdCB1cmxQYXJhbWV0ZXJzID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh1cmxRdWVyeSk7XG4gICAgICAgIHVybFBhcmFtZXRlcnMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgIGlmIChrZXkuaW5kZXhPZignX18nKSA9PT0gMCkge1xuICAgICAgICAgICAgUGF2bG92aWFQbHVnaW4uX3NlcnZlck1zZy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvblJlc3BvbnNlO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgeyAuLi5yZXNwb25zZSwgZXJyb3IgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHBhdmxvdmlhLm9yZyBqc29uIGNvbmZpZ3VyYXRpb24gZmlsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb25maWdVUkwgLSB0aGUgVVJMIG9mIHRoZSBwYXZsb3ZpYS5vcmcganNvbiBjb25maWd1cmF0aW9uIGZpbGVcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2dldENvbmZpZ3VyYXRpb24oY29uZmlnVVJMKSB7XG4gICAgICBsZXQgcmVzcG9uc2UgPSB7XG4gICAgICAgIG9yaWdpbjogJ19nZXRDb25maWd1cmF0aW9uJyxcbiAgICAgICAgY29udGV4dDogJ3doZW4gcmVhZGluZyB0aGUgY29uZmlndXJhdGlvbiBmaWxlOiAnICsgY29uZmlnVVJMLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBxdWVyeSB0aGUgcGF2bG92aWEgc2VydmVyOlxuICAgICAgICAgIGNvbnN0IHNlcnZlclJlc3BvbnNlID0gYXdhaXQgZmV0Y2goY29uZmlnVVJMLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgbW9kZTogJ2NvcnMnLFxuICAgICAgICAgICAgY2FjaGU6ICduby1jYWNoZScsXG4gICAgICAgICAgICBjcmVkZW50aWFsczogJ3NhbWUtb3JpZ2luJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWRpcmVjdDogJ2ZvbGxvdycsXG4gICAgICAgICAgICByZWZlcnJlclBvbGljeTogJ25vLXJlZmVycmVyJyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBzZXJ2ZXJEYXRhID0gYXdhaXQgc2VydmVyUmVzcG9uc2UuanNvbigpO1xuXG4gICAgICAgICAgcmVzb2x2ZSh7IC4uLnJlc3BvbnNlLCBjb25maWc6IHNlcnZlckRhdGEgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgcmVqZWN0KHsgLi4ucmVzcG9uc2UsIGVycm9yIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVuIGEgbmV3IHNlc3Npb24gZm9yIHRoaXMgZXhwZXJpbWVudCBvbiBwYXZsb3ZpYS5vcmcuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX29wZW5TZXNzaW9uKCkge1xuICAgICAgbGV0IHJlc3BvbnNlID0ge1xuICAgICAgICBvcmlnaW46ICdfb3BlblNlc3Npb24nLFxuICAgICAgICBjb250ZXh0OlxuICAgICAgICAgICd3aGVuIG9wZW5pbmcgYSBzZXNzaW9uIGZvciBleHBlcmltZW50OiAnICtcbiAgICAgICAgICBQYXZsb3ZpYVBsdWdpbi5fY29uZmlnLmV4cGVyaW1lbnQuZnVsbHBhdGgsXG4gICAgICB9O1xuXG4gICAgICAvLyBwcmVwYXJlIGEgUE9TVCBxdWVyeTpcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICBpZiAoUGF2bG92aWFQbHVnaW4uX3NlcnZlck1zZy5oYXMoJ19fcGlsb3RUb2tlbicpKSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChcbiAgICAgICAgICAncGlsb3RUb2tlbicsXG4gICAgICAgICAgUGF2bG92aWFQbHVnaW4uX3NlcnZlck1zZy5nZXQoJ19fcGlsb3RUb2tlbicpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIHF1ZXJ5IHBhdmxvdmlhIHNlcnZlcjpcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke1BhdmxvdmlhUGx1Z2luLl9jb25maWcucGF2bG92aWEuVVJMfS9hcGkvdjIvZXhwZXJpbWVudHMvJHtQYXZsb3ZpYVBsdWdpbi5fY29uZmlnLmdpdGxhYi5wcm9qZWN0SWR9L3Nlc3Npb25zYDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBxdWVyeSB0aGUgcGF2bG92aWEgc2VydmVyOlxuICAgICAgICAgIGNvbnN0IHNlcnZlclJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIG1vZGU6ICdjb3JzJyxcbiAgICAgICAgICAgIGNhY2hlOiAnbm8tY2FjaGUnLFxuICAgICAgICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVkaXJlY3Q6ICdmb2xsb3cnLFxuICAgICAgICAgICAgcmVmZXJyZXJQb2xpY3k6ICduby1yZWZlcnJlcicsXG4gICAgICAgICAgICBib2R5OiBmb3JtRGF0YSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBzZXJ2ZXJEYXRhID0gYXdhaXQgc2VydmVyUmVzcG9uc2UuanNvbigpO1xuXG4gICAgICAgICAgLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGF0dHJpYnV0ZXM6XG4gICAgICAgICAgaWYgKCEoJ3Rva2VuJyBpbiBzZXJ2ZXJEYXRhKSkge1xuICAgICAgICAgICAgcmVqZWN0KFxuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHJlc3BvbnNlLCB7XG4gICAgICAgICAgICAgICAgZXJyb3I6ICd1bmV4cGVjdGVkIGFuc3dlciBmcm9tIHNlcnZlcjogbm8gdG9rZW4nLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCEoJ2V4cGVyaW1lbnQnIGluIHNlcnZlckRhdGEpKSB7XG4gICAgICAgICAgICByZWplY3QoXG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ocmVzcG9uc2UsIHtcbiAgICAgICAgICAgICAgICBlcnJvcjogJ3VuZXhwZWN0ZWQgYW5zd2VyIGZyb20gc2VydmVyOiBubyBleHBlcmltZW50JyxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBjb25maWd1cmF0aW9uOlxuICAgICAgICAgIFBhdmxvdmlhUGx1Z2luLl9jb25maWcuc2Vzc2lvbiA9IHtcbiAgICAgICAgICAgIHRva2VuOiBzZXJ2ZXJEYXRhLnRva2VuLFxuICAgICAgICAgICAgc3RhdHVzOiAnT1BFTicsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBQYXZsb3ZpYVBsdWdpbi5fY29uZmlnLmV4cGVyaW1lbnQuc3RhdHVzID1cbiAgICAgICAgICAgIHNlcnZlckRhdGEuZXhwZXJpbWVudC5zdGF0dXMyO1xuICAgICAgICAgIFBhdmxvdmlhUGx1Z2luLl9jb25maWcuZXhwZXJpbWVudC5zYXZlRm9ybWF0ID0gU3ltYm9sLmZvcihcbiAgICAgICAgICAgIHNlcnZlckRhdGEuZXhwZXJpbWVudC5zYXZlRm9ybWF0XG4gICAgICAgICAgKTtcbiAgICAgICAgICBQYXZsb3ZpYVBsdWdpbi5fY29uZmlnLmV4cGVyaW1lbnQuc2F2ZUluY29tcGxldGVSZXN1bHRzID1cbiAgICAgICAgICAgIHNlcnZlckRhdGEuZXhwZXJpbWVudC5zYXZlSW5jb21wbGV0ZVJlc3VsdHM7XG4gICAgICAgICAgUGF2bG92aWFQbHVnaW4uX2NvbmZpZy5leHBlcmltZW50LmxpY2Vuc2UgPVxuICAgICAgICAgICAgc2VydmVyRGF0YS5leHBlcmltZW50LmxpY2Vuc2U7XG4gICAgICAgICAgUGF2bG92aWFQbHVnaW4uX2NvbmZpZy5ydW5Nb2RlID0gc2VydmVyRGF0YS5leHBlcmltZW50LnJ1bk1vZGU7XG5cbiAgICAgICAgICByZXNvbHZlKFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihyZXNwb25zZSwge1xuICAgICAgICAgICAgICB0b2tlbjogc2VydmVyRGF0YS50b2tlbixcbiAgICAgICAgICAgICAgc3RhdHVzOiBzZXJ2ZXJEYXRhLmV4cGVyaW1lbnQuc3RhdHVzMixcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICByZWplY3QoeyAuLi5yZXNwb25zZSwgZXJyb3IgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlIHRoZSBwcmV2aW91c2x5IG9wZW5lZCBzZXNzaW9uIG9uIHBhdmxvdmlhLm9yZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNDb21wbGV0ZWQgLSB3aGV0aGVyIG9yIG5vdCB0aGUgcGFydGljaXBhbnQgY29tcGxldGVkIHRoZSBleHBlcmltZW50XG4gICAgICogQHBhcmFtIHtib29sZWFufSBbc3luYyA9IGZhbHNlXSAtIHdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgQmVhY29uIEFQSSB0byBjb21tdW5pY2F0ZVxuICAgICAqIFx0d2l0aCB0aGUgc2VydmVyXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfY2xvc2VTZXNzaW9uKGlzQ29tcGxldGVkID0gdHJ1ZSwgc3luYyA9IGZhbHNlKSB7XG4gICAgICBsZXQgcmVzcG9uc2UgPSB7XG4gICAgICAgIG9yaWdpbjogJ19jbG9zZVNlc3Npb24nLFxuICAgICAgICBjb250ZXh0OlxuICAgICAgICAgICd3aGVuIGNsb3NpbmcgdGhlIHNlc3Npb24gZm9yIGV4cGVyaW1lbnQ6ICcgK1xuICAgICAgICAgIFBhdmxvdmlhUGx1Z2luLl9jb25maWcuZXhwZXJpbWVudC5mdWxscGF0aCxcbiAgICAgIH07XG5cbiAgICAgIC8vIHByZXBhcmUgYSBERUxFVEUgcXVlcnk6XG4gICAgICBjb25zdCB1cmwgPVxuICAgICAgICBQYXZsb3ZpYVBsdWdpbi5fY29uZmlnLnBhdmxvdmlhLlVSTCArXG4gICAgICAgICcvYXBpL3YyL2V4cGVyaW1lbnRzLycgK1xuICAgICAgICBQYXZsb3ZpYVBsdWdpbi5fY29uZmlnLmdpdGxhYi5wcm9qZWN0SWQgK1xuICAgICAgICAnL3Nlc3Npb25zLycgK1xuICAgICAgICBQYXZsb3ZpYVBsdWdpbi5fY29uZmlnLnNlc3Npb24udG9rZW47XG4gICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgZm9ybURhdGEuYXBwZW5kKCdpc0NvbXBsZXRlZCcsIGlzQ29tcGxldGVkKTtcblxuICAgICAgLy8gc3luY2hyb25vdXNseSBxdWVyeSB0aGUgcGF2bG92aWEgc2VydmVyOlxuICAgICAgaWYgKHN5bmMpIHtcbiAgICAgICAgbmF2aWdhdG9yLnNlbmRCZWFjb24odXJsICsgJy9kZWxldGUnLCBmb3JtRGF0YSk7XG4gICAgICAgIFBhdmxvdmlhUGx1Z2luLl9jb25maWcuc2Vzc2lvbi5zdGF0dXMgPSAnQ0xPU0VEJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGFzeW5jaHJvbm91c2x5IHF1ZXJ5IHRoZSBwYXZsb3ZpYSBzZXJ2ZXI6XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIHF1ZXJ5IHRoZSBwYXZsb3ZpYSBzZXJ2ZXI6XG4gICAgICAgICAgICBjb25zdCBzZXJ2ZXJSZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICAgICAgICBtb2RlOiAnY29ycycsXG4gICAgICAgICAgICAgIGNhY2hlOiAnbm8tY2FjaGUnLFxuICAgICAgICAgICAgICBjcmVkZW50aWFsczogJ3NhbWUtb3JpZ2luJyxcbiAgICAgICAgICAgICAgcmVkaXJlY3Q6ICdmb2xsb3cnLFxuICAgICAgICAgICAgICByZWZlcnJlclBvbGljeTogJ25vLXJlZmVycmVyJyxcbiAgICAgICAgICAgICAgYm9keTogZm9ybURhdGEsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHNlcnZlckRhdGEgPSBhd2FpdCBzZXJ2ZXJSZXNwb25zZS5qc29uKCk7XG5cbiAgICAgICAgICAgIFBhdmxvdmlhUGx1Z2luLl9jb25maWcuc2Vzc2lvbi5zdGF0dXMgPSAnQ0xPU0VEJztcbiAgICAgICAgICAgIHJlc29sdmUoT2JqZWN0LmFzc2lnbihyZXNwb25zZSwgeyBzZXJ2ZXJEYXRhIH0pKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICByZWplY3QoeyAuLi5yZXNwb25zZSwgZXJyb3IgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGxvYWQgZGF0YSB0byB0aGUgcGF2bG92aWEub3JnIHNlcnZlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0cmlhbCAtIHRoZSBqc1BzeWNoIHRyaWFsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGEgLSB0aGUgZXhwZXJpbWVudCBkYXRhIHRvIGJlIHVwbG9hZGVkXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbc3luYyA9IGZhbHNlXSAtIHdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgQmVhY29uIEFQSSB0byBjb21tdW5pY2F0ZVxuICAgICAqIFx0d2l0aCB0aGUgc2VydmVyXG4gICAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgYXN5bmMgX3NhdmUodHJpYWwsIGRhdGEsIHN5bmMgPSBmYWxzZSkge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICBsZXQgZGF0ZVN0cmluZyA9XG4gICAgICAgIGRhdGUuZ2V0RnVsbFllYXIoKSArXG4gICAgICAgICctJyArXG4gICAgICAgICgnMCcgKyAoMSArIGRhdGUuZ2V0TW9udGgoKSkpLnNsaWNlKC0yKSArXG4gICAgICAgICctJyArXG4gICAgICAgICgnMCcgKyBkYXRlLmdldERhdGUoKSkuc2xpY2UoLTIpICtcbiAgICAgICAgJ18nO1xuICAgICAgZGF0ZVN0cmluZyArPVxuICAgICAgICAoJzAnICsgZGF0ZS5nZXRIb3VycygpKS5zbGljZSgtMikgK1xuICAgICAgICAnaCcgK1xuICAgICAgICAoJzAnICsgZGF0ZS5nZXRNaW51dGVzKCkpLnNsaWNlKC0yKSArXG4gICAgICAgICcuJyArXG4gICAgICAgICgnMCcgKyBkYXRlLmdldFNlY29uZHMoKSkuc2xpY2UoLTIpICtcbiAgICAgICAgJy4nICtcbiAgICAgICAgZGF0ZS5nZXRNaWxsaXNlY29uZHMoKTtcblxuICAgICAgY29uc3Qga2V5ID1cbiAgICAgICAgUGF2bG92aWFQbHVnaW4uX2NvbmZpZy5leHBlcmltZW50Lm5hbWUgK1xuICAgICAgICAnXycgK1xuICAgICAgICB0cmlhbC5wYXJ0aWNpcGFudElkICtcbiAgICAgICAgJ18nICtcbiAgICAgICAgJ1NFU1NJT04nICtcbiAgICAgICAgJ18nICtcbiAgICAgICAgZGF0ZVN0cmluZyArXG4gICAgICAgICcuY3N2JztcbiAgICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IHRyaWFsLmRhdGFGaWx0ZXIoZGF0YSk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgUGF2bG92aWFQbHVnaW4uX2NvbmZpZy5leHBlcmltZW50LnN0YXR1cyA9PT0gJ1JVTk5JTkcnICYmXG4gICAgICAgICFQYXZsb3ZpYVBsdWdpbi5fc2VydmVyTXNnLmhhcygnX19waWxvdFRva2VuJylcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fdXBsb2FkRGF0YShrZXksIGZpbHRlcmVkRGF0YSwgc3luYyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9vZmZlckRhdGFGb3JEb3dubG9hZChrZXksIGZpbHRlcmVkRGF0YSwgJ3RleHQvY3N2Jyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgb3JpZ2luOiAnX3NhdmUnLFxuICAgICAgICAgIGNvbnRleHQ6XG4gICAgICAgICAgICAnd2hlbiBzYXZpbmcgcmVzdWx0cyBmb3IgZXhwZXJpbWVudDogJyArXG4gICAgICAgICAgICBQYXZsb3ZpYVBsdWdpbi5fY29uZmlnLmV4cGVyaW1lbnQuZnVsbHBhdGgsXG4gICAgICAgICAgbWVzc2FnZTogJ29mZmVyZWQgdGhlIC5jc3YgZmlsZSBmb3IgZG93bmxvYWQnLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwbG9hZCBkYXRhIChhIGtleS92YWx1ZSBwYWlyKSB0byBwYXZsb3ZpYS5vcmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gdGhlIGtleVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIHRoZSB2YWx1ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3N5bmMgPSBmYWxzZV0gLSB3aGV0aGVyIG9yIG5vdCB0byB1cGxvYWQgdGhlIGRhdGEgdXNpbmcgdGhlIEJlYWNvbiBBUElcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3VwbG9hZERhdGEoa2V5LCB2YWx1ZSwgc3luYyA9IGZhbHNlKSB7XG4gICAgICBsZXQgcmVzcG9uc2UgPSB7XG4gICAgICAgIG9yaWdpbjogJ191cGxvYWREYXRhJyxcbiAgICAgICAgY29udGV4dDpcbiAgICAgICAgICBcIndoZW4gdXBsb2FkaW5nIHBhcnRpY2lwYW50JyByZXN1bHRzIGZvciBleHBlcmltZW50OiBcIiArXG4gICAgICAgICAgUGF2bG92aWFQbHVnaW4uX2NvbmZpZy5leHBlcmltZW50LmZ1bGxwYXRoLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdXJsID1cbiAgICAgICAgUGF2bG92aWFQbHVnaW4uX2NvbmZpZy5wYXZsb3ZpYS5VUkwgK1xuICAgICAgICAnL2FwaS92Mi9leHBlcmltZW50cy8nICtcbiAgICAgICAgUGF2bG92aWFQbHVnaW4uX2NvbmZpZy5naXRsYWIucHJvamVjdElkICtcbiAgICAgICAgJy9zZXNzaW9ucy8nICtcbiAgICAgICAgUGF2bG92aWFQbHVnaW4uX2NvbmZpZy5zZXNzaW9uLnRva2VuICtcbiAgICAgICAgJy9yZXN1bHRzJztcblxuICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgna2V5Jywga2V5KTtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgndmFsdWUnLCB2YWx1ZSk7XG5cbiAgICAgIC8vIHN5bmNocm9ub3VzIHF1ZXJ5IHRoZSBwYXZsb3ZpYSBzZXJ2ZXI6XG4gICAgICBpZiAoc3luYykge1xuICAgICAgICBuYXZpZ2F0b3Iuc2VuZEJlYWNvbih1cmwsIGZvcm1EYXRhKTtcbiAgICAgIH1cbiAgICAgIC8vIGFzeW5jaHJvbm91c2x5IHF1ZXJ5IHRoZSBwYXZsb3ZpYSBzZXJ2ZXI6XG4gICAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgc2VydmVyUmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgIG1vZGU6ICdjb3JzJyxcbiAgICAgICAgICAgICAgY2FjaGU6ICduby1jYWNoZScsXG4gICAgICAgICAgICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLFxuICAgICAgICAgICAgICByZWRpcmVjdDogJ2ZvbGxvdycsXG4gICAgICAgICAgICAgIHJlZmVycmVyUG9saWN5OiAnbm8tcmVmZXJyZXInLFxuICAgICAgICAgICAgICBib2R5OiBmb3JtRGF0YSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qgc2VydmVyRGF0YSA9IGF3YWl0IHNlcnZlclJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgICAgICAgcmVzb2x2ZShPYmplY3QuYXNzaWduKHJlc3BvbnNlLCB7IHNlcnZlckRhdGEgfSkpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHJlamVjdCh7IC4uLnJlc3BvbnNlLCBlcnJvciB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvZyBtZXNzYWdlcyB0byB0aGUgYnJvd3NlcidzIGNvbnNvbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gey4uLip9IG1lc3NhZ2VzIC0gdGhlIG1lc3NhZ2VzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgYnJvd3NlcidzIGNvbnNvbGVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9sb2coLi4ubWVzc2FnZXMpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdbcGF2bG92aWEgJyArIFBhdmxvdmlhUGx1Z2luLnZlcnNpb24gKyAnXScsIC4uLm1lc3NhZ2VzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPZmZlciBkYXRhIGFzIGRvd25sb2FkIGluIHRoZSBicm93c2VyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gYmUgZG93bmxvYWRlZFxuICAgICAqIEBwYXJhbSB7Kn0gZGF0YSAtIHRoZSBkYXRhXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSB0aGUgTUlNRSB0eXBlIG9mIHRoZSBkYXRhLCBlLmcuICd0ZXh0L2Nzdicgb3IgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfb2ZmZXJEYXRhRm9yRG93bmxvYWQoZmlsZW5hbWUsIGRhdGEsIHR5cGUpIHtcbiAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbZGF0YV0sIHsgdHlwZSB9KTtcblxuICAgICAgaWYgKHdpbmRvdy5uYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYikge1xuICAgICAgICB3aW5kb3cubmF2aWdhdG9yLm1zU2F2ZUJsb2IoYmxvYiwgZmlsZW5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZWxlbSA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgIGVsZW0uaHJlZiA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICBlbGVtLmRvd25sb2FkID0gZmlsZW5hbWU7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWxlbSk7XG4gICAgICAgIGVsZW0uY2xpY2soKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChlbGVtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGx1Z2luIHZlcnNpb246XG4gICAqIEBwdWJsaWNcbiAgICovXG4gIFBhdmxvdmlhUGx1Z2luLnZlcnNpb24gPSAnMjAyMi4xLjEnO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF2bG92aWEub3JnIGNvbmZpZ3VyYXRpb24gKHVzdWFsbHkgcmVhZCBmcm9tIHRoZSBjb25maWcuanNvbiBjb25maWd1cmF0aW9uIGZpbGUpLlxuICAgKlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgUGF2bG92aWFQbHVnaW4uX2NvbmZpZyA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgZm9yIHRoZSBiZWZvcmV1bmxvYWQgZXZlbnQsIHdoaWNoIGlzIHRyaWdnZXJlZCB3aGVuIHRoZSBwYXJ0aWNpcGFudFxuICAgKiB0cmllcyB0byBsZWF2ZSB0aGUgZXhwZXJpbWVudCBieSBjbG9zaW5nIHRoZSB0YWIgb3IgYnJvd3Nlci5cbiAgICpcbiAgICogQHR5cGUge251bGx9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBQYXZsb3ZpYVBsdWdpbi5fYmVmb3JldW5sb2FkQ2FsbGJhY2sgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VydmVyIHBhcmFtZXRlcnMgKHRob3NlIHN0YXJ0aW5nIHdpdGggYSBkb3VibGUgdW5kZXJzY29yZSkuXG4gICAqXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBQYXZsb3ZpYVBsdWdpbi5fc2VydmVyTXNnID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICAgKiBQbHVnaW4gaW5mb3JtYXRpb24uXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIFBhdmxvdmlhUGx1Z2luLmluZm8gPSB7XG4gICAgbmFtZTogJ3BhdmxvdmlhJyxcbiAgICBkZXNjcmlwdGlvbjogJ2NvbW11bmljYXRpb24gd2l0aCBwYXZsb3ZpYS5vcmcnLFxuICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgIGNvbW1hbmQ6IHtcbiAgICAgICAgdHlwZToganNQc3ljaC5QYXJhbWV0ZXJUeXBlLlNUUklORyxcbiAgICAgICAgcHJldHR5X25hbWU6ICdDb21tYW5kJyxcbiAgICAgICAgZGVmYXVsdDogJ2luaXQnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBwYXZsb3ZpYSBjb21tYW5kOiBcImluaXRcIiAoZGVmYXVsdCkgb3IgXCJmaW5pc2hcIicsXG4gICAgICB9LFxuICAgICAgcGFydGljaXBhbnRJZDoge1xuICAgICAgICB0eXBlOiBqc1BzeWNoLlBhcmFtZXRlclR5cGUuU1RSSU5HLFxuICAgICAgICBwcmV0dHlfbmFtZTogJ1BhcnRpY2lwYW50IElkJyxcbiAgICAgICAgZGVmYXVsdDogJ1BBUlRJQ0lQQU5UJyxcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgJ1RoZSBwYXJ0aWNpcGFudCBJZDogXCJQQVJUSUNJUEFOVFwiIChkZWZhdWx0KSBvciBhbnkgc3RyaW5nJyxcbiAgICAgIH0sXG4gICAgICBlcnJvckNhbGxiYWNrOiB7XG4gICAgICAgIHR5cGU6IGpzUHN5Y2guUGFyYW1ldGVyVHlwZS5GVU5DVElPTixcbiAgICAgICAgcHJldHR5X25hbWU6ICdFcnJvckNhbGxiYWNrJyxcbiAgICAgICAgZGVmYXVsdDogUGF2bG92aWFQbHVnaW4uZGVmYXVsdEVycm9yQ2FsbGJhY2ssXG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICdUaGUgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIHdoZW5ldmVyIGFuIGVycm9yIGhhcyBvY2N1cnJlZCcsXG4gICAgICB9LFxuICAgICAgZGF0YUZpbHRlcjoge1xuICAgICAgICB0eXBlOiBqc1BzeWNoLlBhcmFtZXRlclR5cGUuRlVOQ1RJT04sXG4gICAgICAgIHByZXR0eV9uYW1lOiAnRGF0YUZpbHRlcicsXG4gICAgICAgIGRlZmF1bHQ6IFBhdmxvdmlhUGx1Z2luLmRlZmF1bHREYXRhRmlsdGVyLFxuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAnVGhlIGZpbHRlciBhcHBsaWVkIHRvIHRoZSBkYXRhIGdhdGhlcmVkIGJ5IGpzUHN5Y2ggYmVmb3JlIHVwbG9hZCB0byB0aGUgc2VydmVyJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gUGF2bG92aWFQbHVnaW47XG59O1xuIl0sIm5hbWVzIjpbImpzUHN5Y2hQYXZsb3ZpYSIsImpzUHN5Y2giLCJQYXZsb3ZpYVBsdWdpbiIsIl9qc1BzeWNoIiwiZGlzcGxheV9lbGVtZW50IiwidHJpYWwiLCJjb21tYW5kIiwidG9Mb3dlckNhc2UiLCJfaW5pdCIsImRhdGEiLCJnZXQiLCJjc3YiLCJfZmluaXNoIiwiZXJyb3JDYWxsYmFjayIsImZpbmlzaFRyaWFsIiwiY29uZmlnVVJMIiwiX2NvbmZpZ3VyZSIsInJlc3BvbnNlIiwiX2NvbmZpZyIsImNvbmZpZyIsIl9sb2ciLCJfb3BlblNlc3Npb24iLCJfYmVmb3JldW5sb2FkQ2FsbGJhY2siLCJldmVudCIsInByZXZlbnREZWZhdWx0IiwicmV0dXJuVmFsdWUiLCJ3aW5kb3ciLCJhZGRFdmVudExpc3RlbmVyIiwic2Vzc2lvbiIsInN0YXR1cyIsImV4cGVyaW1lbnQiLCJzYXZlSW5jb21wbGV0ZVJlc3VsdHMiLCJfc2F2ZSIsIl9jbG9zZVNlc3Npb24iLCJyZW1vdmVFdmVudExpc3RlbmVyIiwibXNnIiwiZGlzcGxheUVsZW1lbnQiLCJnZXREaXNwbGF5RWxlbWVudCIsImlubmVySFRNTCIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJ0ZXh0Q29udGVudCIsInN5bmMiLCJzZXJ2ZXJEYXRhIiwib3JpZ2luIiwiY29udGV4dCIsIl9nZXRDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvblJlc3BvbnNlIiwicHN5Y2hvSnNNYW5hZ2VyIiwicGF2bG92aWEiLCJVUkwiLCJ1cmxRdWVyeSIsImxvY2F0aW9uIiwic2VhcmNoIiwic2xpY2UiLCJ1cmxQYXJhbWV0ZXJzIiwiVVJMU2VhcmNoUGFyYW1zIiwiZm9yRWFjaCIsInZhbHVlIiwia2V5IiwiaW5kZXhPZiIsIl9zZXJ2ZXJNc2ciLCJzZXQiLCJlcnJvciIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZmV0Y2giLCJtZXRob2QiLCJtb2RlIiwiY2FjaGUiLCJjcmVkZW50aWFscyIsImhlYWRlcnMiLCJyZWRpcmVjdCIsInJlZmVycmVyUG9saWN5Iiwic2VydmVyUmVzcG9uc2UiLCJqc29uIiwiY29uc29sZSIsImZ1bGxwYXRoIiwiZm9ybURhdGEiLCJGb3JtRGF0YSIsImhhcyIsImFwcGVuZCIsInVybCIsImdpdGxhYiIsInByb2plY3RJZCIsImJvZHkiLCJPYmplY3QiLCJhc3NpZ24iLCJ0b2tlbiIsInN0YXR1czIiLCJzYXZlRm9ybWF0IiwiU3ltYm9sIiwibGljZW5zZSIsInJ1bk1vZGUiLCJpc0NvbXBsZXRlZCIsIm5hdmlnYXRvciIsInNlbmRCZWFjb24iLCJkYXRlIiwiRGF0ZSIsImRhdGVTdHJpbmciLCJnZXRGdWxsWWVhciIsImdldE1vbnRoIiwiZ2V0RGF0ZSIsImdldEhvdXJzIiwiZ2V0TWludXRlcyIsImdldFNlY29uZHMiLCJnZXRNaWxsaXNlY29uZHMiLCJuYW1lIiwicGFydGljaXBhbnRJZCIsImZpbHRlcmVkRGF0YSIsImRhdGFGaWx0ZXIiLCJfdXBsb2FkRGF0YSIsIl9vZmZlckRhdGFGb3JEb3dubG9hZCIsIm1lc3NhZ2UiLCJtZXNzYWdlcyIsImxvZyIsInZlcnNpb24iLCJmaWxlbmFtZSIsInR5cGUiLCJibG9iIiwiQmxvYiIsIm1zU2F2ZU9yT3BlbkJsb2IiLCJtc1NhdmVCbG9iIiwiZWxlbSIsImNyZWF0ZUVsZW1lbnQiLCJocmVmIiwiY3JlYXRlT2JqZWN0VVJMIiwiZG93bmxvYWQiLCJhcHBlbmRDaGlsZCIsImNsaWNrIiwicmVtb3ZlQ2hpbGQiLCJodG1sQ29kZSIsInF1ZXJ5U2VsZWN0b3IiLCJNYXAiLCJpbmZvIiwiZGVzY3JpcHRpb24iLCJwYXJhbWV0ZXJzIiwiUGFyYW1ldGVyVHlwZSIsIlNUUklORyIsInByZXR0eV9uYW1lIiwiRlVOQ1RJT04iLCJkZWZhdWx0RXJyb3JDYWxsYmFjayIsImRlZmF1bHREYXRhRmlsdGVyIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index c51c5d3..ce02d76 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "@bdelab/roar-firekit": "^0.1.3", "@jspsych-contrib/plugin-rdk": "^1.1.0", + "@jspsych/config": "^1.2.0", "@jspsych/plugin-audio-keyboard-response": "^1.1.0", "@jspsych/plugin-fullscreen": "^1.1.0", "@jspsych/plugin-html-keyboard-response": "^1.1.0", @@ -41,7 +42,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", - "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.0" }, @@ -49,11 +49,74 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/cli": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.15.7.tgz", + "integrity": "sha512-YW5wOprO2LzMjoWZ5ZG6jfbY9JnkDxuHDwvnrThnuYtByorova/I0HNXJedrUfwuXFQfYOjcqDA4PU3qlZGZjg==", + "dependencies": { + "commander": "^4.0.1", + "convert-source-map": "^1.1.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.0.0", + "make-dir": "^2.1.0", + "slash": "^2.0.0", + "source-map": "^0.5.0" + }, + "bin": { + "babel": "bin/babel.js", + "babel-external-helpers": "bin/babel-external-helpers.js" + }, + "engines": { + "node": ">=6.9.0" + }, + "optionalDependencies": { + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", + "chokidar": "^3.4.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/cli/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@babel/cli/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/cli/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@babel/cli/node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "engines": { + "node": ">=6" + } + }, "node_modules/@babel/code-frame": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, "dependencies": { "@babel/highlight": "^7.16.7" }, @@ -65,7 +128,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -74,7 +136,6 @@ "version": "7.17.8", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", - "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", @@ -104,7 +165,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", - "dev": true, "dependencies": { "@babel/types": "^7.17.0", "jsesc": "^2.5.1", @@ -118,7 +178,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", - "dev": true, "dependencies": { "@babel/types": "^7.16.7" }, @@ -130,7 +189,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", - "dev": true, "dependencies": { "@babel/helper-explode-assignable-expression": "^7.16.7", "@babel/types": "^7.16.7" @@ -143,7 +201,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", - "dev": true, "dependencies": { "@babel/compat-data": "^7.17.7", "@babel/helper-validator-option": "^7.16.7", @@ -161,7 +218,6 @@ "version": "7.17.6", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz", "integrity": "sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==", - "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7", @@ -182,7 +238,6 @@ "version": "7.17.0", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", - "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", "regexpu-core": "^5.0.1" @@ -217,7 +272,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dev": true, "dependencies": { "@babel/types": "^7.16.7" }, @@ -229,7 +283,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", - "dev": true, "dependencies": { "@babel/types": "^7.16.7" }, @@ -241,7 +294,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", - "dev": true, "dependencies": { "@babel/helper-get-function-arity": "^7.16.7", "@babel/template": "^7.16.7", @@ -255,7 +307,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "dev": true, "dependencies": { "@babel/types": "^7.16.7" }, @@ -267,7 +318,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dev": true, "dependencies": { "@babel/types": "^7.16.7" }, @@ -279,7 +329,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", - "dev": true, "dependencies": { "@babel/types": "^7.17.0" }, @@ -291,7 +340,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dev": true, "dependencies": { "@babel/types": "^7.16.7" }, @@ -303,7 +351,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", - "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", @@ -322,7 +369,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", - "dev": true, "dependencies": { "@babel/types": "^7.16.7" }, @@ -334,7 +380,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -343,7 +388,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", - "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-wrap-function": "^7.16.8", @@ -357,7 +401,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", - "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-member-expression-to-functions": "^7.16.7", @@ -373,7 +416,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", - "dev": true, "dependencies": { "@babel/types": "^7.17.0" }, @@ -385,7 +427,6 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", - "dev": true, "dependencies": { "@babel/types": "^7.16.0" }, @@ -397,7 +438,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dev": true, "dependencies": { "@babel/types": "^7.16.7" }, @@ -409,7 +449,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -418,7 +457,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -427,7 +465,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", - "dev": true, "dependencies": { "@babel/helper-function-name": "^7.16.7", "@babel/template": "^7.16.7", @@ -442,7 +479,6 @@ "version": "7.17.8", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", - "dev": true, "dependencies": { "@babel/template": "^7.16.7", "@babel/traverse": "^7.17.3", @@ -456,7 +492,6 @@ "version": "7.16.10", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", @@ -470,7 +505,6 @@ "version": "7.17.8", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==", - "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -497,7 +531,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", @@ -514,7 +547,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-remap-async-to-generator": "^7.16.8", @@ -531,7 +563,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", - "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7" @@ -547,7 +578,6 @@ "version": "7.17.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", - "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.17.6", "@babel/helper-plugin-utils": "^7.16.7", @@ -564,7 +594,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" @@ -580,7 +609,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" @@ -596,7 +624,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-json-strings": "^7.8.3" @@ -612,7 +639,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" @@ -628,7 +654,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -644,7 +669,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -660,7 +684,6 @@ "version": "7.17.3", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", - "dev": true, "dependencies": { "@babel/compat-data": "^7.17.0", "@babel/helper-compilation-targets": "^7.16.7", @@ -679,7 +702,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" @@ -695,7 +717,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", @@ -712,7 +733,6 @@ "version": "7.16.11", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", - "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.16.10", "@babel/helper-plugin-utils": "^7.16.7" @@ -728,7 +748,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", - "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-create-class-features-plugin": "^7.16.7", @@ -746,7 +765,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", - "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7" @@ -762,7 +780,17 @@ "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -774,7 +802,6 @@ "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -786,7 +813,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -801,7 +827,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -813,7 +838,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" }, @@ -821,11 +845,21 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -837,7 +871,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -849,7 +882,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -861,7 +893,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -873,7 +904,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -885,7 +915,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -897,7 +926,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -909,7 +937,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -924,7 +951,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -935,11 +961,24 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", + "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -954,7 +993,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", - "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", @@ -971,7 +1009,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -986,7 +1023,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1001,7 +1037,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", - "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7", @@ -1023,7 +1058,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1038,7 +1072,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1053,7 +1086,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", - "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7" @@ -1069,7 +1101,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1084,7 +1115,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", - "dev": true, "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7" @@ -1100,7 +1130,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1115,7 +1144,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", - "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.16.7", "@babel/helper-function-name": "^7.16.7", @@ -1132,7 +1160,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1147,7 +1174,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1162,7 +1188,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", - "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", @@ -1179,7 +1204,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.7.tgz", "integrity": "sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==", - "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", @@ -1197,7 +1221,6 @@ "version": "7.17.8", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", - "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-module-transforms": "^7.17.7", @@ -1216,7 +1239,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", - "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7" @@ -1232,7 +1254,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", - "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.16.7" }, @@ -1247,7 +1268,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1262,7 +1282,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-replace-supers": "^7.16.7" @@ -1278,7 +1297,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1293,7 +1311,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1308,7 +1325,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz", "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==", - "dev": true, "dependencies": { "regenerator-transform": "^0.14.2" }, @@ -1323,7 +1339,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1338,7 +1353,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1353,7 +1367,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" @@ -1369,7 +1382,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1384,7 +1396,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1399,7 +1410,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1414,7 +1424,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1429,7 +1438,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", - "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7" @@ -1533,7 +1541,6 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", @@ -1549,7 +1556,6 @@ "version": "7.17.8", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.8.tgz", "integrity": "sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==", - "dev": true, "dependencies": { "regenerator-runtime": "^0.13.4" }, @@ -1561,7 +1567,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.16.7", "@babel/parser": "^7.16.7", @@ -1575,7 +1580,6 @@ "version": "7.17.3", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.17.3", @@ -1596,7 +1600,6 @@ "version": "7.17.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" @@ -1605,6 +1608,11 @@ "node": ">=6.9.0" } }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, "node_modules/@bdelab/roar-firekit": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@bdelab/roar-firekit/-/roar-firekit-0.1.3.tgz", @@ -2173,2155 +2181,2344 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", - "dev": true, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, "engines": { - "node": ">=6.0.0" + "node": ">=8" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", - "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", - "dev": true, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "sprintf-js": "~1.0.2" } }, - "node_modules/@jspsych-contrib/plugin-rdk": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@jspsych-contrib/plugin-rdk/-/plugin-rdk-1.1.0.tgz", - "integrity": "sha512-wd/3Txwt3mfs9wmC1ZRmuJzD1z3HNcAOHa77KroiaoandbcKu4JfA7ec1onT0WZwTTWTN0EpY4B96AT3/QkL3g==", - "peerDependencies": { - "jspsych": ">=7.0.0" + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@jspsych/plugin-audio-keyboard-response": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@jspsych/plugin-audio-keyboard-response/-/plugin-audio-keyboard-response-1.1.0.tgz", - "integrity": "sha512-fE9qSl0gdPM5ggWL0dBGWYeZhxQTYAwyS5BhYrKE22ADEz+N9LkaDmh5dSPYzA2oDP2GK8faWMGByU34OaXr2g==", - "peerDependencies": { - "jspsych": ">=7.1.0" + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "engines": { + "node": ">=8" } }, - "node_modules/@jspsych/plugin-fullscreen": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@jspsych/plugin-fullscreen/-/plugin-fullscreen-1.1.0.tgz", - "integrity": "sha512-JoAg+oxqodMNwlNznvBEVZ04fEldOKELX7JIlcqyMUxwbTxsjAetbyT1KFj8TBA4ABM6wBSgJxzGALmhbgIVwQ==", - "peerDependencies": { - "jspsych": ">=7.1.0" + "node_modules/@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@jspsych/plugin-html-keyboard-response": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@jspsych/plugin-html-keyboard-response/-/plugin-html-keyboard-response-1.1.0.tgz", - "integrity": "sha512-oyB97ntzQLbdX5Kvn2RqEmhuPKNQAaxs4i5/4M5DkVQrIuY7+pY5d1neOYdcPZqNiyd5Xih2t9NRN3DgiFq2+A==", - "peerDependencies": { - "jspsych": ">=7.1.0" + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jspsych/plugin-image-keyboard-response": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@jspsych/plugin-image-keyboard-response/-/plugin-image-keyboard-response-1.1.0.tgz", - "integrity": "sha512-HT7NqACtbW9vfdk1Uhmq3RIqRlq8widE/PdpKFAmwx40+qu2H/H1LHi2ZoN3okPCAUw9gB9L6xs0IxTI0/SGxg==", - "peerDependencies": { - "jspsych": ">=7.1.0" + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jspsych/plugin-survey-text": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@jspsych/plugin-survey-text/-/plugin-survey-text-1.1.0.tgz", - "integrity": "sha512-Oh3FIhOmPCbt2wX8LGo38Gb2DM9f0ibxEWhncE2WHqhF5RmlDHO0bxHAaRhfM7c1L9c8p8hvqFjuoFrFu8L6jw==", - "peerDependencies": { - "jspsych": ">=7.1.0" + "node_modules/@jest/console/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/@jspsych/plugin-video-keyboard-response": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@jspsych/plugin-video-keyboard-response/-/plugin-video-keyboard-response-1.1.0.tgz", - "integrity": "sha512-G6LYRmHIgW+GxaxcrTi2P2NCMgqDLCmNRxGw1vDJWt0qOC6ndhZ3khXK3LIZaWnc7gJav521d51CRQoMO3tDuw==", - "peerDependencies": { - "jspsych": ">=7.1.0" + "node_modules/@jest/console/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@jest/console/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, + "node_modules/@jest/console/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, + "node_modules/@jest/core": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, "engines": { - "node": ">= 8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 8" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + "node_modules/@jest/core/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + "node_modules/@jest/core/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + "node_modules/@jest/core/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, + "node_modules/@jest/core/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "@types/connect": "*", - "@types/node": "*" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "dev": true, + "node_modules/@jest/environment": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", "dependencies": { - "@types/node": "*" + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, + "node_modules/@jest/fake-timers": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", "dependencies": { - "@types/node": "*" + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", - "dev": true, + "node_modules/@jest/globals": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@types/eslint": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz", - "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" + "node_modules/@jest/reporters": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", - "dev": true, + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, - "node_modules/@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", - "dev": true, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.28", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", - "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", - "dev": true, + "node_modules/@jest/reporters/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "dev": true + "node_modules/@jest/reporters/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/@types/http-proxy": { - "version": "1.17.8", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", - "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", - "dev": true, - "dependencies": { - "@types/node": "*" + "node_modules/@jest/reporters/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" } }, - "node_modules/@types/json-schema": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.10.tgz", - "integrity": "sha512-BLO9bBq59vW3fxCpD4o0N4U+DXsvwvIcl+jofw0frQo/GrBFC+/jRZj1E7kgp6dvTyNmA4y6JCV5Id/r3mNP5A==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true - }, - "node_modules/@types/long": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", - "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" - }, - "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "dev": true + "node_modules/@jest/reporters/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/@types/node": { - "version": "17.0.22", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.22.tgz", - "integrity": "sha512-8FwbVoG4fy+ykY86XCAclKZDORttqE5/s7dyWZKLXTdv3vRy5HozBEinG5IqhvPXXzIZEcTVbuHlQEI6iuwcmw==" + "node_modules/@jest/reporters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true + "node_modules/@jest/source-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true + "node_modules/@jest/source-map/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/@types/retry": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", - "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", - "dev": true + "node_modules/@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } }, - "node_modules/@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "dev": true, + "node_modules/@jest/test-sequencer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", "dependencies": { - "@types/express": "*" + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@types/serve-static": { - "version": "1.13.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", - "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", - "dev": true, + "node_modules/@jest/transform": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", "dependencies": { - "@types/mime": "^1", - "@types/node": "*" + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "dev": true, + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "@types/node": "*" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", - "dev": true, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "@types/node": "*" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, + "node_modules/@jest/transform/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true + "node_modules/@jest/transform/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true + "node_modules/@jest/transform/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true + "node_modules/@jest/transform/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, + "node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "@xtuc/ieee754": "^1.2.0" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "@xtuc/long": "4.2.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, + "node_modules/@jest/types/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } + "node_modules/@jest/types/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "node_modules/@jest/types/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" } }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" + "node_modules/@jridgewell/resolve-uri": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@webpack-cli/configtest": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", - "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", - "dev": true, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" - } + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" }, - "node_modules/@webpack-cli/info": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz", - "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==", - "dev": true, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", + "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", "dependencies": { - "envinfo": "^7.7.3" - }, - "peerDependencies": { - "webpack-cli": "4.x.x" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@webpack-cli/serve": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", - "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", - "dev": true, + "node_modules/@jspsych-contrib/plugin-rdk": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jspsych-contrib/plugin-rdk/-/plugin-rdk-1.1.0.tgz", + "integrity": "sha512-wd/3Txwt3mfs9wmC1ZRmuJzD1z3HNcAOHa77KroiaoandbcKu4JfA7ec1onT0WZwTTWTN0EpY4B96AT3/QkL3g==", "peerDependencies": { - "webpack-cli": "4.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } + "jspsych": ">=7.0.0" } }, - "node_modules/@xtuc/ieee754": { + "node_modules/@jspsych/config": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "resolved": "https://registry.npmjs.org/@jspsych/config/-/config-1.2.0.tgz", + "integrity": "sha512-dcwyJA00TM6yUw1GKHM4k64Zz/n4sAeJ/V+KHT4kqbVS4mw8366WdqOwkvyFmaPUQK7jglO4P91qb20Il5CnKQ==", + "dependencies": { + "@babel/cli": "7.15.7", + "@babel/core": "7.15.5", + "@babel/preset-env": "7.15.6", + "@rollup/plugin-babel": "5.3.0", + "@rollup/plugin-commonjs": "19.0.0", + "@rollup/plugin-json": "4.1.0", + "@rollup/plugin-node-resolve": "13.0.5", + "@types/gulp": "4.0.9", + "@types/jest": "27.0.2", + "babel-preset-minify": "0.5.1", + "canvas": "2.8.0", + "gulp": "4.0.2", + "gulp-cli": "2.3.0", + "gulp-file": "^0.4.0", + "gulp-rename": "2.0.0", + "gulp-replace": "1.1.3", + "gulp-zip": "5.1.0", + "jest": "27.2.4", + "jest-environment-jsdom": "27.2.4", + "merge-stream": "2.0.0", + "rollup": "2.58.0", + "rollup-plugin-terser": "7.0.2", + "rollup-plugin-typescript2": "0.30.0", + "ts-jest": "27.0.5", + "tslib": "2.3.1", + "typescript": "4.4.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@jspsych/config/node_modules/@babel/core": { + "version": "7.15.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.5.tgz", + "integrity": "sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==", + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helpers": "^7.15.4", + "@babel/parser": "^7.15.5", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" }, "engines": { - "node": ">= 0.6" + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "dev": true, - "bin": { - "acorn": "bin/acorn" + "node_modules/@jspsych/config/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.4.tgz", + "integrity": "sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" }, - "engines": { - "node": ">=0.4.0" + "peerDependencies": { + "@babel/core": "^7.4.0-0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, + "node_modules/@jspsych/config/node_modules/@babel/preset-env": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.6.tgz", + "integrity": "sha512-L+6jcGn7EWu7zqaO2uoTDjjMBW+88FXzV8KvrBl2z6MtRNxlsmUNRlZPaNNPUTgqhyC5DHNFk/2Jmra+ublZWw==", + "dependencies": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.15.4", + "@babel/plugin-proposal-async-generator-functions": "^7.15.4", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.15.4", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.15.6", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.15.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.15.3", + "@babel/plugin-transform-classes": "^7.15.4", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.15.4", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.15.4", + "@babel/plugin-transform-modules-systemjs": "^7.15.4", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.15.4", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.14.6", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.15.6", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.16.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { - "acorn": "^8" + "@babel/core": "^7.0.0-0" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, + "node_modules/@jspsych/config/node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz", + "integrity": "sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA==", + "dependencies": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.4", + "semver": "^6.1.1" + }, "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, + "node_modules/@jspsych/config/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz", + "integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==", "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.16.2" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, + "node_modules/@jspsych/config/node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.3.tgz", + "integrity": "sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g==", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@babel/helper-define-polyfill-provider": "^0.2.4" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, + "node_modules/@jspsych/plugin-audio-keyboard-response": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jspsych/plugin-audio-keyboard-response/-/plugin-audio-keyboard-response-1.1.0.tgz", + "integrity": "sha512-fE9qSl0gdPM5ggWL0dBGWYeZhxQTYAwyS5BhYrKE22ADEz+N9LkaDmh5dSPYzA2oDP2GK8faWMGByU34OaXr2g==", "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "jspsych": ">=7.1.0" } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "node_modules/@jspsych/plugin-fullscreen": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jspsych/plugin-fullscreen/-/plugin-fullscreen-1.1.0.tgz", + "integrity": "sha512-JoAg+oxqodMNwlNznvBEVZ04fEldOKELX7JIlcqyMUxwbTxsjAetbyT1KFj8TBA4ABM6wBSgJxzGALmhbgIVwQ==", + "peerDependencies": { + "jspsych": ">=7.1.0" } }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "node_modules/@jspsych/plugin-html-keyboard-response": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jspsych/plugin-html-keyboard-response/-/plugin-html-keyboard-response-1.1.0.tgz", + "integrity": "sha512-oyB97ntzQLbdX5Kvn2RqEmhuPKNQAaxs4i5/4M5DkVQrIuY7+pY5d1neOYdcPZqNiyd5Xih2t9NRN3DgiFq2+A==", + "peerDependencies": { + "jspsych": ">=7.1.0" + } }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, + "node_modules/@jspsych/plugin-image-keyboard-response": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jspsych/plugin-image-keyboard-response/-/plugin-image-keyboard-response-1.1.0.tgz", + "integrity": "sha512-HT7NqACtbW9vfdk1Uhmq3RIqRlq8widE/PdpKFAmwx40+qu2H/H1LHi2ZoN3okPCAUw9gB9L6xs0IxTI0/SGxg==", "peerDependencies": { - "ajv": "^6.9.1" + "jspsych": ">=7.1.0" } }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" + "node_modules/@jspsych/plugin-survey-text": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jspsych/plugin-survey-text/-/plugin-survey-text-1.1.0.tgz", + "integrity": "sha512-Oh3FIhOmPCbt2wX8LGo38Gb2DM9f0ibxEWhncE2WHqhF5RmlDHO0bxHAaRhfM7c1L9c8p8hvqFjuoFrFu8L6jw==", + "peerDependencies": { + "jspsych": ">=7.1.0" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" + "node_modules/@jspsych/plugin-video-keyboard-response": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jspsych/plugin-video-keyboard-response/-/plugin-video-keyboard-response-1.1.0.tgz", + "integrity": "sha512-G6LYRmHIgW+GxaxcrTi2P2NCMgqDLCmNRxGw1vDJWt0qOC6ndhZ3khXK3LIZaWnc7gJav521d51CRQoMO3tDuw==", + "peerDependencies": { + "jspsych": ">=7.1.0" } }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz", + "integrity": "sha512-CMGKi28CF+qlbXh26hDe6NxCd7amqeAzEqnS6IHeO6LoaKyM/n+Xw3HT1COdq8cuioOdlKdqn/hCmqPUOMOywg==", "dependencies": { - "color-convert": "^1.9.0" + "detect-libc": "^1.0.3", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.5", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" }, - "engines": { - "node": ">=4" + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" } }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">= 8" + "node": ">=10" } }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true + "node_modules/@nicolo-ribaudo/chokidar-2": { + "version": "2.1.8-no-fsevents.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", + "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", + "optional": true }, - "node_modules/array-includes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 8" } }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 8" } }, - "node_modules/async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", "dependencies": { - "lodash": "^4.17.14" + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" } }, - "node_modules/auto-bind": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", - "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==", + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + }, + "node_modules/@rollup/plugin-babel": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz", + "integrity": "sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw==", + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + }, "engines": { - "node": ">=8" + "node": ">= 10.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } } }, - "node_modules/babel-loader": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.4.tgz", - "integrity": "sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==", - "dev": true, + "node_modules/@rollup/plugin-commonjs": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-19.0.0.tgz", + "integrity": "sha512-adTpD6ATGbehdaQoZQ6ipDFhdjqsTgpOAhFiPwl+dzre4pPshsecptDPyEFb61JMJ1+mGljktaC4jI8ARMSNyw==", "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" + "@rollup/pluginutils": "^3.1.0", + "commondir": "^1.0.1", + "estree-walker": "^2.0.1", + "glob": "^7.1.6", + "is-reference": "^1.2.1", + "magic-string": "^0.25.7", + "resolve": "^1.17.0" }, "engines": { - "node": ">= 8.9" + "node": ">= 8.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" - } - }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "dependencies": { - "object.assign": "^4.1.0" + "rollup": "^2.38.3" } }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", - "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", - "dev": true, + "node_modules/@rollup/plugin-json": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz", + "integrity": "sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==", "dependencies": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.1", - "semver": "^6.1.1" + "@rollup/pluginutils": "^3.0.8" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "rollup": "^1.20.0 || ^2.0.0" } }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", - "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", - "dev": true, + "node_modules/@rollup/plugin-node-resolve": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.0.5.tgz", + "integrity": "sha512-mVaw6uxtvuGx/XCI4qBQXsDZJUfyx5vp39iE0J/7Hd6wDhEbjHr6aES7Nr9yWbuE0BY+oKp6N7Bq6jX5NCGNmQ==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.1", - "core-js-compat": "^3.21.0" + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">= 10.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "rollup": "^2.42.0" } }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", - "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", - "dev": true, + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.1" + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "rollup": "^1.20.0||^2.0.0" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true + "node_modules/@rollup/pluginutils/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "engines": { - "node": "*" - } + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dependencies": { + "type-detect": "4.0.8" } }, - "node_modules/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", - "dev": true, + "node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" - }, - "engines": { - "node": ">= 0.8" + "@sinonjs/commons": "^1.7.0" } }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "engines": { - "node": ">= 0.8" + "node": ">= 6" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, + "node_modules/@types/babel__core": { + "version": "7.1.19", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", + "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", "dependencies": { - "ms": "2.0.0" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", "dependencies": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" + "@babel/types": "^7.0.0" } }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@types/babel__traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", + "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@babel/types": "^7.3.0" } }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" + "@types/connect": "*", + "@types/node": "*" } }, - "node_modules/browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], "dependencies": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "@types/node": "*" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", "dev": true, - "engines": { - "node": ">= 0.8" + "dependencies": { + "@types/node": "*" } }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "node_modules/@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@types/express-serve-static-core": "*", + "@types/node": "*" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/@types/eslint": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz", + "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==", "dev": true, - "engines": { - "node": ">=6" + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" } }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "node_modules/@types/eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", "dev": true, "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" + "@types/eslint": "*", + "@types/estree": "*" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001319", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001319.tgz", - "integrity": "sha512-xjlIAFHucBRSMUo1kb5D4LYgcN1M45qdKP++lhqowDpwJwGkpIRTt5qQqnhxjj1vHcI7nrJxWhCC1ATrCEBTcw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] + "node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@types/expect": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", + "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==" + }, + "node_modules/@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" } }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "node_modules/@types/express-serve-static-core": { + "version": "4.17.28", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", + "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" } }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "engines": { - "node": ">=6.0" + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" } }, - "node_modules/clean-css": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.4.tgz", - "integrity": "sha512-nKseG8wCzEuji/4yrgM/5cthL9oTDc5UOQyFMvW/Q53oP6gLH690o1NbuTh6Y18nujr7BxlsFuS7gXLnLzKJGg==", - "dev": true, + "node_modules/@types/glob-stream": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/glob-stream/-/glob-stream-6.1.1.tgz", + "integrity": "sha512-AGOUTsTdbPkRS0qDeyeS+6KypmfVpbT5j23SN8UPG63qjKXNKjXn6V9wZUr8Fin0m9l8oGYaPK8b2WUMF8xI1A==", "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" + "@types/glob": "*", + "@types/node": "*" } }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node_modules/@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dependencies": { + "@types/node": "*" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "node_modules/@types/gulp": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/gulp/-/gulp-4.0.9.tgz", + "integrity": "sha512-zzT+wfQ8uwoXjDhRK9Zkmmk09/fbLLmN/yDHFizJiEKIve85qutOnXcP/TM2sKPBTU+Jc16vfPbOMkORMUBN7Q==", + "dependencies": { + "@types/undertaker": "*", + "@types/vinyl-fs": "*", + "chokidar": "^3.3.1" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.8", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", + "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", "dev": true, - "engines": { - "node": ">=6" + "dependencies": { + "@types/node": "*" } }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "@types/istanbul-lib-coverage": "*" } }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" + "@types/istanbul-lib-report": "*" } }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, + "node_modules/@types/jest": { + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.0.2.tgz", + "integrity": "sha512-4dRxkS/AFX0c5XW6IPMNOydLn2tEhNhJV7DnYK+0bjoJZ+QTmfucBlihX7aoEsh/ocYtkLC73UbnBXBXIxsULA==", "dependencies": { - "color-name": "1.1.3" + "jest-diff": "^27.0.0", + "pretty-format": "^27.0.0" } }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "node_modules/@types/json-schema": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.10.tgz", + "integrity": "sha512-BLO9bBq59vW3fxCpD4o0N4U+DXsvwvIcl+jofw0frQo/GrBFC+/jRZj1E7kgp6dvTyNmA4y6JCV5Id/r3mNP5A==", "dev": true }, - "node_modules/colorette": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", - "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, - "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "engines": { - "node": ">= 12" + "node_modules/@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" + }, + "node_modules/@types/node": { + "version": "17.0.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.22.tgz", + "integrity": "sha512-8FwbVoG4fy+ykY86XCAclKZDORttqE5/s7dyWZKLXTdv3vRy5HozBEinG5IqhvPXXzIZEcTVbuHlQEI6iuwcmw==" + }, + "node_modules/@types/prettier": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.4.tgz", + "integrity": "sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dependencies": { + "@types/node": "*" } }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "node_modules/@types/retry": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", + "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", "dev": true }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", "dev": true, "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" + "@types/express": "*" } }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "node_modules/@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", "dev": true, "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" + "@types/mime": "^1", + "@types/node": "*" } }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", "dev": true, "dependencies": { - "ms": "2.0.0" + "@types/node": "*" } }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "node_modules/@types/undertaker": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/undertaker/-/undertaker-1.2.7.tgz", + "integrity": "sha512-xuY7nBwo1zSRoY2aitp/HArHfTulFAKql2Fr4b4mWbBBP+F50n7Jm6nwISTTMaDk2xvl92O10TTejVF0Q9mInw==", + "dependencies": { + "@types/node": "*", + "@types/undertaker-registry": "*", + "async-done": "~1.3.2" + } }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true + "node_modules/@types/undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha512-Z4TYuEKn9+RbNVk1Ll2SS4x1JeLHecolIbM/a8gveaHsW0Hr+RQMraZACwTO2VD7JvepgA6UO1A1VrbktQrIbQ==" }, - "node_modules/connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true, - "engines": { - "node": ">=0.8" + "node_modules/@types/vinyl": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.6.tgz", + "integrity": "sha512-ayJ0iOCDNHnKpKTgBG6Q6JOnHTj9zFta+3j2b8Ejza0e4cvRyMn0ZoLEmbPrTHe5YYRlDYPvPWVdV4cTaRyH7g==", + "dependencies": { + "@types/expect": "^1.20.4", + "@types/node": "*" } }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, + "node_modules/@types/vinyl-fs": { + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/@types/vinyl-fs/-/vinyl-fs-2.4.12.tgz", + "integrity": "sha512-LgBpYIWuuGsihnlF+OOWWz4ovwCYlT03gd3DuLwex50cYZLmX3yrW+sFF9ndtmh7zcZpS6Ri47PrIu+fV+sbXw==", "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" + "@types/glob-stream": "*", + "@types/node": "*", + "@types/vinyl": "*" } }, - "node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "node_modules/@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "dependencies": { + "@types/node": "*" + } }, - "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true, - "engines": { - "node": ">= 0.6" + "node_modules/@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dependencies": { + "@types/yargs-parser": "*" } }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "dev": true, "dependencies": { - "safe-buffer": "~5.1.1" + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" } }, - "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "dev": true, - "engines": { - "node": ">= 0.6" + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" } }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", "dev": true }, - "node_modules/core-js": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" } }, - "node_modules/core-js-compat": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz", - "integrity": "sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==", + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "dev": true, "dependencies": { - "browserslist": "^4.19.1", - "semver": "7.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "@xtuc/ieee754": "^1.2.0" } }, - "node_modules/core-js-compat/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "@xtuc/long": "4.2.2" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "dev": true, "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" } }, - "node_modules/css-loader": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", - "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "dev": true, "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.7", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.5" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, - "node_modules/css-loader/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" } }, - "node_modules/css-select": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", - "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "dev": true, "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^5.1.0", - "domhandler": "^4.3.0", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", - "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" } }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "node_modules/@webpack-cli/configtest": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", + "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" } }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@webpack-cli/info": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz", + "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==", "dev": true, "dependencies": { - "ms": "2.1.2" + "envinfo": "^7.7.3" }, - "engines": { - "node": ">=6.0" + "peerDependencies": { + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", + "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", + "dev": true, + "peerDependencies": { + "webpack-cli": "4.x.x" }, "peerDependenciesMeta": { - "supports-color": { + "webpack-dev-server": { "optional": true } } }, - "node_modules/deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "dependencies": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "node_modules/abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "dependencies": { - "execa": "^5.0.0" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { - "node": ">= 10" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "dependencies": { - "object-keys": "^1.0.12" + "node_modules/acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">= 0.4" + "node": ">=0.4.0" } }, - "node_modules/del": { + "node_modules/acorn-globals": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", - "dev": true, + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" } }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, "engines": { - "node": ">= 0.6" + "node": ">=0.4.0" } }, - "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" + "peerDependencies": { + "acorn": "^8" } }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "node_modules/dns-packet": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "dependencies": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "dependencies": { - "buffer-indexof": "^1.0.0" + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "engines": { + "node": ">=0.4.0" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dependencies": { - "esutils": "^2.0.2" + "debug": "4" }, "engines": { - "node": ">=6.0.0" + "node": ">= 6.0.0" } }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, "dependencies": { - "utila": "~0.4" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, "dependencies": { - "domelementtype": "^2.2.0" + "ajv": "^8.0.0" }, - "engines": { - "node": ">= 4" + "peerDependencies": { + "ajv": "^8.0.0" }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.89", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.89.tgz", - "integrity": "sha512-z1Axg0Fu54fse8wN4fd+GAINdU5mJmLtcl6bqIcYyzNVGONcfHAeeJi88KYMQVKalhXlYuVPzKkFIU5VD0raUw==", + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, - "engines": { - "node": ">= 4" + "peerDependencies": { + "ajv": "^6.9.1" } }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true, + "node_modules/ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dependencies": { + "ansi-wrap": "^0.1.0" + }, "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" } }, - "node_modules/enhanced-resolve": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz", - "integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==", - "dev": true, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "type-fest": "^0.21.3" }, "engines": { - "node": ">=10.13.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "node_modules/ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "dev": true, + "engines": [ + "node >= 0.8.0" + ], "bin": { - "envinfo": "dist/cli.js" + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" }, "engines": { "node": ">=4" } }, - "node_modules/es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", - "dev": true, + "node_modules/ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", - "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">= 0.4" + "node": ">= 8" + } + }, + "node_modules/append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "dependencies": { + "buffer-equal": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10" } }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, "engines": { - "node": ">=6" + "node": ">= 6" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "engines": { - "node": ">=0.8.0" + "node": ">=0.10.0" } }, - "node_modules/eslint": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.11.0.tgz", - "integrity": "sha512-/KRpd9mIRg2raGxHRGwW9ZywYNAClZrHjdueHcrVDuO3a6bj83eoTirCCk0M0yPwOjWYKHwRVRid+xK4F/GHgA==", - "dev": true, + "node_modules/arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", "dependencies": { - "@eslint/eslintrc": "^1.2.1", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" + "make-iterator": "^1.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=0.10.0" } }, - "node_modules/eslint-config-airbnb-base": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", - "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", - "dev": true, - "dependencies": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" - }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "peerDependencies": { - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.2" + "node": ">=0.10.0" } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "dev": true, + "node_modules/arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", "dependencies": { - "debug": "^3.2.7", - "resolve": "^1.20.0" + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/eslint-module-utils": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", - "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "find-up": "^2.1.0" - }, + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true }, - "node_modules/eslint-module-utils/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "node_modules/array-includes": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", + "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", "dev": true, "dependencies": { - "locate-path": "^2.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-module-utils/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, + "node_modules/array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "array-slice": "^1.0.0", + "is-number": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/eslint-module-utils/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, + "node_modules/array-initial/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/eslint-module-utils/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, + "node_modules/array-last": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", "dependencies": { - "p-limit": "^1.1.0" + "is-number": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/eslint-module-utils/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true, + "node_modules/array-last/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/eslint-module-utils/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, + "node_modules/array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import": { - "version": "2.25.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz", - "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==", - "dev": true, + "node_modules/array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.2", - "has": "^1.0.3", - "is-core-module": "^2.8.0", - "is-glob": "^4.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.5", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.12.0" + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" }, "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" + "node_modules/array-sort/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { + "node_modules/array-union": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "engines": { - "node": ">=8.0.0" + "node": ">=0.10.0" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "node_modules/array.prototype.flat": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", + "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^2.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" }, "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "node_modules/async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 0.10" } }, - "node_modules/eslint/node_modules/ansi-styles": { + "node_modules/async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "node_modules/async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "dependencies": { + "async-done": "^1.2.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/auto-bind": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", + "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-helper-evaluate-path": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.5.0.tgz", + "integrity": "sha512-mUh0UhS607bGh5wUMAQfOpt2JX2ThXMtppHRdRU1kL7ZLRWIXxoV2UIV1r2cAeeNeU1M5SB5/RSUgUxrK8yOkA==" + }, + "node_modules/babel-helper-flip-expressions": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.4.3.tgz", + "integrity": "sha1-NpZzahKKwYvCUlS19AoizrPB0/0=" + }, + "node_modules/babel-helper-is-nodes-equiv": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz", + "integrity": "sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ=" + }, + "node_modules/babel-helper-is-void-0": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.4.3.tgz", + "integrity": "sha1-fZwBtFYee5Xb2g9u7kj1tg5nMT4=" + }, + "node_modules/babel-helper-mark-eval-scopes": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.4.3.tgz", + "integrity": "sha1-0kSjvvmESHJgP/tG4izorN9VFWI=" + }, + "node_modules/babel-helper-remove-or-void": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.4.3.tgz", + "integrity": "sha1-pPA7QAd6D/6I5F0HAQ3uJB/1rmA=" + }, + "node_modules/babel-helper-to-multiple-sequence-expressions": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.5.0.tgz", + "integrity": "sha512-m2CvfDW4+1qfDdsrtf4dwOslQC3yhbgyBFptncp4wvtdrDHqueW7slsYv4gArie056phvQFhT2nRcGS4bnm6mA==" + }, + "node_modules/babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "dependencies": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-jest/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -4332,11 +4529,10 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eslint/node_modules/chalk": { + "node_modules/babel-jest/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4348,11 +4544,10 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/eslint/node_modules/color-convert": { + "node_modules/babel-jest/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -4360,2876 +4555,2915 @@ "node": ">=7.0.0" } }, - "node_modules/eslint/node_modules/color-name": { + "node_modules/babel-jest/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/eslint/node_modules/escape-string-regexp": { + "node_modules/babel-jest/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, + "node_modules/babel-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "has-flag": "^4.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" + "node": ">=8" } }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/babel-loader": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.4.tgz", + "integrity": "sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==", "dev": true, "dependencies": { - "is-glob": "^4.0.3" + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" }, "engines": { - "node": ">=10.13.0" + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", - "dev": true, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "object.assign": "^4.1.0" } }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + "node_modules/babel-plugin-jest-hoist": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", "dependencies": { - "has-flag": "^4.0.0" + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" }, "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/espree": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", - "dev": true, + "node_modules/babel-plugin-minify-builtins": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.5.0.tgz", + "integrity": "sha512-wpqbN7Ov5hsNwGdzuzvFcjgRlzbIeVv1gMIlICbPj0xkexnfoIDe7q+AZHMkQmAE/F9R5jkrB6TLfTegImlXag==" + }, + "node_modules/babel-plugin-minify-constant-folding": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.5.0.tgz", + "integrity": "sha512-Vj97CTn/lE9hR1D+jKUeHfNy+m1baNiJ1wJvoGyOBUx7F7kJqDZxr9nCHjO/Ad+irbR3HzR6jABpSSA29QsrXQ==", "dependencies": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "babel-helper-evaluate-path": "^0.5.0" } }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, + "node_modules/babel-plugin-minify-dead-code-elimination": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.5.1.tgz", + "integrity": "sha512-x8OJOZIrRmQBcSqxBcLbMIK8uPmTvNWPXH2bh5MDCW1latEqYiRMuUkPImKcfpo59pTUB2FT7HfcgtG8ZlR5Qg==", "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" + "babel-helper-evaluate-path": "^0.5.0", + "babel-helper-mark-eval-scopes": "^0.4.3", + "babel-helper-remove-or-void": "^0.4.3", + "lodash": "^4.17.11" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" + "node_modules/babel-plugin-minify-flip-comparisons": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.4.3.tgz", + "integrity": "sha1-AMqHDLjxO0XAOLPB68DyJyk8llo=", + "dependencies": { + "babel-helper-is-void-0": "^0.4.3" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, + "node_modules/babel-plugin-minify-guarded-expressions": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.4.4.tgz", + "integrity": "sha512-RMv0tM72YuPPfLT9QLr3ix9nwUIq+sHT6z8Iu3sLbqldzC1Dls8DPCywzUIzkTx9Zh1hWX4q/m9BPoPed9GOfA==", "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" + "babel-helper-evaluate-path": "^0.5.0", + "babel-helper-flip-expressions": "^0.4.3" } }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" + "node_modules/babel-plugin-minify-infinity": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.4.3.tgz", + "integrity": "sha1-37h2obCKBldjhO8/kuZTumB7Oco=" + }, + "node_modules/babel-plugin-minify-mangle-names": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.5.0.tgz", + "integrity": "sha512-3jdNv6hCAw6fsX1p2wBGPfWuK69sfOjfd3zjUXkbq8McbohWy23tpXfy5RnToYWggvqzuMOwlId1PhyHOfgnGw==", + "dependencies": { + "babel-helper-mark-eval-scopes": "^0.4.3" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" + "node_modules/babel-plugin-minify-numeric-literals": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.4.3.tgz", + "integrity": "sha1-jk/VYcefeAEob/YOjF/Z3u6TwLw=" + }, + "node_modules/babel-plugin-minify-replace": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.5.0.tgz", + "integrity": "sha512-aXZiaqWDNUbyNNNpWs/8NyST+oU7QTpK7J9zFEFSA0eOmtUNMU3fczlTTTlnCxHmq/jYNFEmkkSG3DDBtW3Y4Q==" + }, + "node_modules/babel-plugin-minify-simplify": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.5.1.tgz", + "integrity": "sha512-OSYDSnoCxP2cYDMk9gxNAed6uJDiDz65zgL6h8d3tm8qXIagWGMLWhqysT6DY3Vs7Fgq7YUDcjOomhVUb+xX6A==", + "dependencies": { + "babel-helper-evaluate-path": "^0.5.0", + "babel-helper-flip-expressions": "^0.4.3", + "babel-helper-is-nodes-equiv": "^0.0.1", + "babel-helper-to-multiple-sequence-expressions": "^0.5.0" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node_modules/babel-plugin-minify-type-constructors": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.4.3.tgz", + "integrity": "sha1-G8bxW4f3qxCF1CszC3F2V6IVZQA=", + "dependencies": { + "babel-helper-is-void-0": "^0.4.3" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", "dev": true, - "engines": { - "node": ">= 0.6" + "dependencies": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.1", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", + "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.21.0" }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", "dev": true, "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.19.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.4.2", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.9.7", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", - "setprototypeof": "1.2.0", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "@babel/helper-define-polyfill-provider": "^0.3.1" }, - "engines": { - "node": ">= 0.10.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } + "node_modules/babel-plugin-transform-inline-consecutive-adds": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.4.3.tgz", + "integrity": "sha1-Mj1Ho+pjqDp6w8gRro5pQfrysNE=" }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "node_modules/babel-plugin-transform-member-expression-literals": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.9.4.tgz", + "integrity": "sha1-NwOcmgwzE6OUlfqsL/OmtbnQOL8=" }, - "node_modules/express/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/babel-plugin-transform-merge-sibling-variables": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.9.4.tgz", + "integrity": "sha1-hbQi/DN3tEnJ0c3kQIcgNTJAHa4=" }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "node_modules/babel-plugin-transform-minify-booleans": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.9.4.tgz", + "integrity": "sha1-rLs+VqNVXdI5KOS1gtKFFi3SsZg=" }, - "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, + "node_modules/babel-plugin-transform-property-literals": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.9.4.tgz", + "integrity": "sha1-mMHSHiVXNlc/k+zlRFn2ziSYXTk=", "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" + "esutils": "^2.0.2" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "node_modules/babel-plugin-transform-regexp-constructors": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.4.3.tgz", + "integrity": "sha1-WLd3W2OvzzMyj66aX4j71PsLSWU=" }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "node_modules/babel-plugin-transform-remove-console": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz", + "integrity": "sha1-uYA2DAZzhOJLNXpYjYB9PINSd4A=" }, - "node_modules/fastest-levenshtein": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", - "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", - "dev": true + "node_modules/babel-plugin-transform-remove-debugger": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.9.4.tgz", + "integrity": "sha1-QrcnYxyXl44estGZp67IShgznvI=" }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, + "node_modules/babel-plugin-transform-remove-undefined": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.5.0.tgz", + "integrity": "sha512-+M7fJYFaEE/M9CXa0/IRkDbiV3wRELzA1kKQFCJ4ifhrzLKn/9VCCgj9OFmYWwBd8IB48YdgPkHYtbYq+4vtHQ==", "dependencies": { - "reusify": "^1.0.4" + "babel-helper-evaluate-path": "^0.5.0" } }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } + "node_modules/babel-plugin-transform-simplify-comparison-operators": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.9.4.tgz", + "integrity": "sha1-9ir+CWyrDh9ootdT/fKDiIRxzrk=" }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, + "node_modules/babel-plugin-transform-undefined-to-void": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.9.4.tgz", + "integrity": "sha1-viQcqBQEAwZ4t0hxcyK4nQyP4oA=" + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dependencies": { - "flat-cache": "^3.0.4" + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "dev": true, + "node_modules/babel-preset-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" }, "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "@babel/core": "^7.0.0" } }, - "node_modules/file-loader/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, + "node_modules/babel-preset-minify": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.5.1.tgz", + "integrity": "sha512-1IajDumYOAPYImkHbrKeiN5AKKP9iOmRoO2IPbIuVp0j2iuCcj0n7P260z38siKMZZ+85d3mJZdtW8IgOv+Tzg==", + "dependencies": { + "babel-plugin-minify-builtins": "^0.5.0", + "babel-plugin-minify-constant-folding": "^0.5.0", + "babel-plugin-minify-dead-code-elimination": "^0.5.1", + "babel-plugin-minify-flip-comparisons": "^0.4.3", + "babel-plugin-minify-guarded-expressions": "^0.4.4", + "babel-plugin-minify-infinity": "^0.4.3", + "babel-plugin-minify-mangle-names": "^0.5.0", + "babel-plugin-minify-numeric-literals": "^0.4.3", + "babel-plugin-minify-replace": "^0.5.0", + "babel-plugin-minify-simplify": "^0.5.1", + "babel-plugin-minify-type-constructors": "^0.4.3", + "babel-plugin-transform-inline-consecutive-adds": "^0.4.3", + "babel-plugin-transform-member-expression-literals": "^6.9.4", + "babel-plugin-transform-merge-sibling-variables": "^6.9.4", + "babel-plugin-transform-minify-booleans": "^6.9.4", + "babel-plugin-transform-property-literals": "^6.9.4", + "babel-plugin-transform-regexp-constructors": "^0.4.3", + "babel-plugin-transform-remove-console": "^6.9.4", + "babel-plugin-transform-remove-debugger": "^6.9.4", + "babel-plugin-transform-remove-undefined": "^0.5.0", + "babel-plugin-transform-simplify-comparison-operators": "^6.9.4", + "babel-plugin-transform-undefined-to-void": "^6.9.4", + "lodash": "^4.17.11" + } + }, + "node_modules/bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">= 0.10" } }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dependencies": { - "to-regex-range": "^5.0.1" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" + "is-descriptor": "^1.0.0" }, "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" + "node": ">=0.10.0" } }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", "dev": true }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "engines": { "node": ">=8" + } + }, + "node_modules/binaryextensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.3.0.tgz", + "integrity": "sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==", + "engines": { + "node": ">=0.8" }, "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + "url": "https://bevry.me/fund" } }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", "dev": true, "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" }, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/firebase": { - "version": "9.6.9", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-9.6.9.tgz", - "integrity": "sha512-S9OmI+vMLNE8dr8ISyAdF88t8JxSMvbSULFq2Eox0q4P3MUN5N0/68NDIhibXTp6hdLI6/hs7b50SAplTCx9NA==", + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { - "@firebase/analytics": "0.7.6", - "@firebase/analytics-compat": "0.1.7", - "@firebase/app": "0.7.19", - "@firebase/app-check": "0.5.4", - "@firebase/app-check-compat": "0.2.4", - "@firebase/app-compat": "0.1.20", - "@firebase/app-types": "0.7.0", - "@firebase/auth": "0.19.10", - "@firebase/auth-compat": "0.2.10", - "@firebase/database": "0.12.6", - "@firebase/database-compat": "0.1.6", - "@firebase/firestore": "3.4.6", - "@firebase/firestore-compat": "0.1.15", - "@firebase/functions": "0.7.9", - "@firebase/functions-compat": "0.1.10", - "@firebase/installations": "0.5.6", - "@firebase/messaging": "0.9.10", - "@firebase/messaging-compat": "0.1.10", - "@firebase/performance": "0.5.6", - "@firebase/performance-compat": "0.1.6", - "@firebase/polyfill": "0.3.36", - "@firebase/remote-config": "0.3.5", - "@firebase/remote-config-compat": "0.1.6", - "@firebase/storage": "0.9.3", - "@firebase/storage-compat": "0.1.11", - "@firebase/util": "1.5.0" + "ms": "2.0.0" } }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", "dev": true, "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=8" } }, - "node_modules/flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, - "node_modules/follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", - "dev": true, + "node_modules/browserslist": { + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", "funding": [ { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" } ], + "dependencies": { + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", + "escalade": "^3.1.1", + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist": "cli.js" + }, "engines": { - "node": ">=4.0" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dependencies": { + "fast-json-stable-stringify": "2.x" }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "engines": { + "node": ">= 6" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", "engines": { - "node": ">= 0.6" + "node": "*" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true, + "node_modules/buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", "engines": { - "node": ">= 0.6" + "node": ">=0.4.0" } }, - "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", "dev": true }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "node_modules/builtin-modules": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">= 0.8" } }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/functional-red-black-tree": { + "node_modules/cache-base": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=0.10.0" } }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dependencies": { "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "get-intrinsic": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6" } }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "node_modules/caniuse-lite": { + "version": "1.0.30001319", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001319.tgz", + "integrity": "sha512-xjlIAFHucBRSMUo1kb5D4LYgcN1M45qdKP++lhqowDpwJwGkpIRTt5qQqnhxjj1vHcI7nrJxWhCC1ATrCEBTcw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/canvas": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.8.0.tgz", + "integrity": "sha512-gLTi17X8WY9Cf5GZ2Yns8T5lfBOcGgFehDFb+JQwDqdOoBOcECS9ZWMEAqMSVcMYwXD659J8NyzjRY/2aE+C2Q==", + "hasInstallScript": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "@mapbox/node-pre-gyp": "^1.0.0", + "nan": "^2.14.0", + "simple-get": "^3.0.3" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=6" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dependencies": { - "is-glob": "^4.0.1" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">= 6" + "node": ">=4" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": ">=10" + "node": ">= 8.10.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", - "dev": true - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } }, - "node_modules/has": { + "node_modules/chrome-trace-event": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", + "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==" + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dependencies": { - "function-bind": "^1.1.1" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "engines": { - "node": ">= 0.4.0" + "node": ">=0.10.0" } }, - "node_modules/has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, + "node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dependencies": { + "kind-of": "^3.0.2" + }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" + "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, + "node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dependencies": { - "has-symbols": "^1.0.2" + "kind-of": "^3.0.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" + "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/html-entities": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", - "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", - "dev": true + "node_modules/class-utils/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "node_modules/clean-css": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.4.tgz", + "integrity": "sha512-nKseG8wCzEuji/4yrgM/5cthL9oTDc5UOQyFMvW/Q53oP6gLH690o1NbuTh6Y18nujr7BxlsFuS7gXLnLzKJGg==", "dev": true, "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" + "source-map": "~0.6.0" }, "engines": { - "node": ">=12" + "node": ">= 10.0" } }, - "node_modules/html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "webpack": "^5.20.0" + "node": ">=0.10.0" } }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" + "engines": { + "node": ">=6" } }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dev": true, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", "engines": { - "node": ">= 0.6" + "node": ">=0.8" } }, - "node_modules/http-parser-js": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", - "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==" + "node_modules/clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "engines": { + "node": ">= 0.10" + } }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=6" } }, - "node_modules/http-proxy-middleware": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz", - "integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==", - "dev": true, + "node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" + }, + "node_modules/cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" } }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "engines": { - "node": ">=10.17.0" + "node": ">=0.10.0" } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" + }, + "node_modules/collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" }, - "peerDependencies": { - "postcss": "^8.1.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" } }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true, "engines": { - "node": ">=4" + "node": ">= 12" } }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, "engines": { - "node": ">=0.8.19" + "node": ">= 0.6" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "ms": "2.0.0" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true, - "engines": { - "node": ">= 0.10" + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, - "node_modules/ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", "dev": true }, - "node_modules/ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", "dev": true, "engines": { - "node": ">= 10" + "node": ">=0.8" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "safe-buffer": "5.2.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.6" } }, - "node_modules/is-bigint": { + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/content-type": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.6" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" + "safe-buffer": "~5.1.1" } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.6" } }, - "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "dev": true, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dev": true, + "node_modules/copy-props": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz", + "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==", "dependencies": { - "has": "^1.0.3" - }, + "each-props": "^1.3.2", + "is-plain-object": "^5.0.0" + } + }, + "node_modules/copy-props/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-js": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", + "hasInstallScript": true, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, + "node_modules/core-js-compat": { + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz", + "integrity": "sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==", "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "browserslist": "^4.19.1", + "semver": "7.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, + "node_modules/core-js-compat/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", "bin": { - "is-docker": "cli.js" + "semver": "bin/semver.js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 8" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "node_modules/css-loader": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", + "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.7", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.5" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/css-loader/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/css-select": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", + "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", "dev": true, "dependencies": { - "is-extglob": "^2.1.1" + "boolbase": "^1.0.0", + "css-what": "^5.1.0", + "domhandler": "^4.3.0", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "node_modules/css-what": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", "dev": true, "engines": { - "node": ">= 0.4" + "node": ">= 6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, "engines": { - "node": ">=0.12.0" + "node": ">=4" } }, - "node_modules/is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", - "dev": true, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "dependencies": { - "has-tostringtag": "^1.0.0" + "cssom": "~0.3.6" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, + "node_modules/data-urls/node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dependencies": { + "punycode": "^2.1.1" + }, "engines": { "node": ">=8" } }, - "node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true, + "node_modules/data-urls/node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10.4" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", "dependencies": { - "isobject": "^3.0.1" + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "ms": "2.1.2" }, "engines": { - "node": ">= 0.4" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, + "node_modules/decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, + "node_modules/decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", "dependencies": { - "has-tostringtag": "^1.0.0" + "mimic-response": "^2.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, + "node_modules/default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", "dependencies": { - "is-docker": "^2.0.0" + "kind-of": "^5.0.2" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, + "node_modules/default-compare/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "engines": { "node": ">=0.10.0" } }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "dev": true, "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "execa": "^5.0.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 10" } }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true, "engines": { "node": ">=8" } }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dependencies": { - "has-flag": "^4.0.0" + "object-keys": "^1.0.12" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">= 0.4" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dependencies": { - "argparse": "^2.0.1" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "node_modules/del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", "dev": true, - "bin": { - "jsesc": "bin/jsesc" + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", "dev": true }, - "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "bin": { - "json5": "lib/cli.js" + "detect-libc": "bin/detect-libc.js" }, "engines": { - "node": ">=6" + "node": ">=0.10" } }, - "node_modules/jspsych": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/jspsych/-/jspsych-7.2.1.tgz", - "integrity": "sha512-226/vyFNL60WoLzS9tqZXm2xWD96+G5xIq7lVTOFWkGlkriqgCoWb+nzW+ZsA/z5wUk1qxsN8Ds4nnBrqFp8Hw==", - "dependencies": { - "auto-bind": "^4.0.0", - "random-words": "^1.1.1", - "seedrandom": "^3.0.5" + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "engines": { + "node": ">=8" } }, - "node_modules/jszip": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz", - "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==", - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "set-immediate-shim": "~1.0.1" - } + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, + "node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", "engines": { - "node": ">=0.10.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "path-type": "^4.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dependencies": { - "immediate": "~3.0.5" - } + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true }, - "node_modules/loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "node_modules/dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", "dev": true, - "engines": { - "node": ">=6.11.5" + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" } }, - "node_modules/loader-utils": { + "node_modules/dns-txt": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", "dev": true, "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" + "buffer-indexof": "^1.0.0" } }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "dependencies": { - "p-locate": "^4.1.0" + "esutils": "^2.0.2" }, "engines": { - "node": ">=8" + "node": ">=6.0.0" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "dependencies": { + "utila": "~0.4" + } }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "node_modules/dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", "dev": true, "dependencies": { - "tslib": "^2.0.3" + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", "dependencies": { - "yallist": "^4.0.0" + "webidl-conversions": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, "dependencies": { - "semver": "^6.0.0" + "domelementtype": "^2.2.0" }, "engines": { - "node": ">=8" + "node": ">= 4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, - "engines": { - "node": ">= 0.6" + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/memfs": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", - "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "dev": true, "dependencies": { - "fs-monkey": "1.0.3" - }, - "engines": { - "node": ">= 4.0.0" + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "node_modules/each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "dependencies": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/electron-to-chromium": { + "version": "1.4.89", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.89.tgz", + "integrity": "sha512-z1Axg0Fu54fse8wN4fd+GAINdU5mJmLtcl6bqIcYyzNVGONcfHAeeJi88KYMQVKalhXlYuVPzKkFIU5VD0raUw==" + }, + "node_modules/emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true, "engines": { - "node": ">= 8" + "node": ">= 4" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, - "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz", + "integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==", "dev": true, "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { - "node": ">=8.6" + "node": ">=10.13.0" } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", "dev": true, "bin": { - "mime": "cli.js" + "envinfo": "dist/cli.js" }, "engines": { "node": ">=4" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", "dev": true, "dependencies": { - "mime-db": "1.52.0" + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" }, "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" + "node": ">= 0.4" }, - "bin": { - "mkdirp": "bin/cmd.js" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, + "node_modules/es5-ext": { + "version": "0.10.59", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.59.tgz", + "integrity": "sha512-cOgyhW0tIJyQY1Kfw6Kr0viu9ZlUctVchRMZ7R0HiH3dxTSp5zJDLecwxUqPUrGKMsgBI1wd1FL+d9Jxfi4cLw==", + "hasInstallScript": true, "dependencies": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=0.10" } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" + "d": "^1.0.1", + "ext": "^1.1.2" } }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" } }, - "node_modules/node-forge": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz", - "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==", - "dev": true, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "engines": { - "node": ">= 6.13.0" + "node": ">=6" } }, - "node_modules/node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", "dev": true }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "engines": { - "node": ">=0.10.0" + "node": ">=0.8.0" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, + "node_modules/escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", "dependencies": { - "path-key": "^3.0.0" + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": ">=8" - } - }, - "node_modules/nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "node_modules/object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" } }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" }, "engines": { - "node": ">= 0.4" + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "engines": { - "node": ">= 0.4" + "node": ">= 0.8.0" } }, - "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", - "dev": true, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "prelude-ls": "~1.1.2" }, "engines": { - "node": ">= 0.4" + "node": ">= 0.8.0" } }, - "node_modules/object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "node_modules/eslint": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.11.0.tgz", + "integrity": "sha512-/KRpd9mIRg2raGxHRGwW9ZywYNAClZrHjdueHcrVDuO3a6bj83eoTirCCk0M0yPwOjWYKHwRVRid+xK4F/GHgA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "@eslint/eslintrc": "^1.2.1", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": ">= 0.4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", "dev": true, "dependencies": { - "ee-first": "1.1.1" + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" }, "engines": { - "node": ">= 0.8" + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" } }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "node_modules/eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dependencies": { - "wrappy": "1" + "debug": "^3.2.7", + "resolve": "^1.20.0" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "ms": "^2.1.1" } }, - "node_modules/open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "node_modules/eslint-module-utils": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", + "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", "dev": true, "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" + "debug": "^3.2.7", + "find-up": "^2.1.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" + "ms": "^2.1.1" } }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/eslint-module-utils/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "locate-path": "^2.0.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/eslint-module-utils/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "dependencies": { - "p-limit": "^2.2.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "node_modules/eslint-module-utils/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "dependencies": { - "aggregate-error": "^3.0.0" + "p-try": "^1.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/p-retry": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", - "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", + "node_modules/eslint-module-utils/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "dependencies": { - "@types/retry": "^0.12.0", - "retry": "^0.13.1" + "p-limit": "^1.1.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/eslint-module-utils/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "node_modules/eslint-module-utils/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true, - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" + "engines": { + "node": ">=4" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "node_modules/eslint-plugin-import": { + "version": "2.25.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz", + "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==", "dev": true, "dependencies": { - "callsites": "^3.0.0" + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.2", + "has": "^1.0.3", + "is-core-module": "^2.8.0", + "is-glob": "^4.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.5", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.12.0" }, "engines": { - "node": ">=6" + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "engines": { - "node": ">= 0.8" + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, "engines": { - "node": ">=8" + "node": ">=8.0.0" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=8.6" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "find-up": "^4.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 0.12.0" + "node": ">=7.0.0" } }, - "node_modules/portfinder/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "dependencies": { - "ms": "^2.1.1" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss": { - "version": "8.4.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", - "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], "dependencies": { - "nanoid": "^3.3.1", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=4.0" } }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" + "is-glob": "^4.0.3" }, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=10.13.0" } }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "node_modules/eslint/node_modules/globals": { + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.4" + "type-fest": "^0.20.2" }, "engines": { - "node": "^10 || ^12 || >= 14" + "node": ">=8" }, - "peerDependencies": { - "postcss": "^8.1.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-modules-values": { + "node_modules/eslint/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "icss-utils": "^5.0.0" - }, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=8" } }, - "node_modules/postcss-selector-parser": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", - "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "node_modules/espree": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", + "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", "dev": true, "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" + "acorn": "^8.7.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/promise-polyfill": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.1.3.tgz", - "integrity": "sha512-MG5r82wBzh7pSKDRa9y+vllNHz3e3d4CNj1PQE4BQYxLme0gKYYBm9YENq+UkEikyZ0XbiGWxYlVw3Rl9O/U8g==" - }, - "node_modules/protobufjs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", - "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", - "hasInstallScript": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^4.0.0" - }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "estraverse": "^5.1.0" }, "engines": { - "node": ">= 0.10" + "node": ">=0.10" } }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { - "node": ">= 0.10" + "node": ">=4.0" } }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, "engines": { - "node": ">=6" + "node": ">=4.0" } }, - "node_modules/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4.0" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "engines": { + "node": ">=4.0" + } }, - "node_modules/random-words": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/random-words/-/random-words-1.1.2.tgz", - "integrity": "sha512-GwgC+Yu+D5/044grf2QqaYk3ZrQip7yfgvkj/6bJ3H3B3KrE7qoNPbWaYd06hrigqAkrPzNVEpRlnBaNx4bDuA==" + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", "dev": true, "engines": { "node": ">= 0.6" } }, - "node_modules/raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dependencies": { - "bytes": "3.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "engines": { - "node": ">= 0.8" + "node": ">= 0.8.0" } }, - "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "picomatch": "^2.2.1" + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" }, "engines": { - "node": ">=8.10.0" + "node": ">=0.10.0" } }, - "node_modules/rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dependencies": { - "resolve": "^1.9.0" + "is-extendable": "^0.1.0" }, "engines": { - "node": ">= 0.10" + "node": ">=0.10.0" } }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", - "dev": true, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dependencies": { - "regenerate": "^1.4.2" + "kind-of": "^3.0.2" }, "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" - }, - "node_modules/regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" + "node": ">=0.10.0" } }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", - "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==", - "dev": true, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" + "is-buffer": "^1.1.5" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" + "node": ">=0.10.0" } }, - "node_modules/regexpu-core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", - "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", - "dev": true, + "node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" + "kind-of": "^3.0.2" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", - "dev": true - }, - "node_modules/regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", - "dev": true, + "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dependencies": { - "jsesc": "~0.5.0" + "is-buffer": "^1.1.5" }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true, "engines": { - "node": ">= 0.10" + "node": ">=0.10.0" } }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dev": true, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "node_modules/expand-brackets/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "engines": { "node": ">=0.10.0" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, + "node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "engines": { "node": ">=0.10.0" } }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "homedir-polyfill": "^1.0.1" }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, + "node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", "dependencies": { - "resolve-from": "^5.0.0" + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" }, "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/express": { + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.19.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.9.7", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, "engines": { - "node": ">=8" + "node": ">= 0.10.0" } }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, - "engines": { - "node": ">= 4" - } + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "ms": "2.0.0" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, "funding": [ { @@ -7244,727 +7478,747 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "dependencies": { - "queue-microtask": "^1.2.2" + ] + }, + "node_modules/ext": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", + "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", + "dependencies": { + "type": "^2.5.0" } }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node_modules/ext/node_modules/type": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.6.0.tgz", + "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==" }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, - "node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">=0.10.0" } }, - "node_modules/seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/selenium-webdriver": { - "version": "4.0.0-rc-1", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.0.0-rc-1.tgz", - "integrity": "sha512-bcrwFPRax8fifRP60p7xkWDGSJJoMkPAzufMlk5K2NyLPht/YZzR2WcIk1+3gR8VOCLlst1P2PI+MXACaFzpIw==", + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dependencies": { - "jszip": "^3.6.0", - "rimraf": "^3.0.2", - "tmp": "^0.2.1", - "ws": ">=7.4.6" + "is-descriptor": "^1.0.0" }, "engines": { - "node": ">= 10.15.0" + "node": ">=0.10.0" } }, - "node_modules/selfsigned": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.0.tgz", - "integrity": "sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ==", - "dev": true, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dependencies": { - "node-forge": "^1.2.0" + "is-extendable": "^0.1.0" }, "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node_modules/extglob/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", - "dev": true, + "node_modules/fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", "dependencies": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "1.8.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.10" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "dependencies": { - "ms": "2.0.0" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" } }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", "dev": true }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, "dependencies": { - "randombytes": "^2.1.0" + "reusify": "^1.0.4" } }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" + "websocket-driver": ">=0.5.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">=0.8.0" } }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, + "node_modules/fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", "dependencies": { - "ms": "2.0.0" + "bser": "2.1.1" } }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "flat-cache": "^3.0.4" }, "engines": { - "node": ">= 0.6" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "node_modules/serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", "dev": true, "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.2" + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" }, "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "engines": { - "node": ">=0.10.0" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "dependencies": { - "kind-of": "^6.0.2" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">=8" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dependencies": { - "shebang-regex": "^3.0.0" + "to-regex-range": "^5.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "ms": "2.0.0" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, + "node_modules/findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.10" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, + "node_modules/findup-sync/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, + "node_modules/findup-sync/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" + "is-extendable": "^0.1.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=0.10.0" } }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, + "node_modules/findup-sync/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/spdy-transport/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, + "node_modules/findup-sync/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "is-extendable": "^0.1.0" }, "engines": { - "node": ">= 6" + "node": ">=0.10.0" } }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true, + "node_modules/findup-sync/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "engines": { - "node": ">= 0.6" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" + "node": ">=0.10.0" } }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/findup-sync/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "kind-of": "^3.0.2" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, + "node_modules/findup-sync/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "is-buffer": "^1.1.5" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, + "node_modules/findup-sync/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/findup-sync/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dependencies": { - "ansi-regex": "^5.0.1" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" }, "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.10" } }, - "node_modules/style-loader": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", - "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", - "dev": true, + "node_modules/firebase": { + "version": "9.6.9", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-9.6.9.tgz", + "integrity": "sha512-S9OmI+vMLNE8dr8ISyAdF88t8JxSMvbSULFq2Eox0q4P3MUN5N0/68NDIhibXTp6hdLI6/hs7b50SAplTCx9NA==", + "dependencies": { + "@firebase/analytics": "0.7.6", + "@firebase/analytics-compat": "0.1.7", + "@firebase/app": "0.7.19", + "@firebase/app-check": "0.5.4", + "@firebase/app-check-compat": "0.2.4", + "@firebase/app-compat": "0.1.20", + "@firebase/app-types": "0.7.0", + "@firebase/auth": "0.19.10", + "@firebase/auth-compat": "0.2.10", + "@firebase/database": "0.12.6", + "@firebase/database-compat": "0.1.6", + "@firebase/firestore": "3.4.6", + "@firebase/firestore-compat": "0.1.15", + "@firebase/functions": "0.7.9", + "@firebase/functions-compat": "0.1.10", + "@firebase/installations": "0.5.6", + "@firebase/messaging": "0.9.10", + "@firebase/messaging-compat": "0.1.10", + "@firebase/performance": "0.5.6", + "@firebase/performance-compat": "0.1.6", + "@firebase/polyfill": "0.3.36", + "@firebase/remote-config": "0.3.5", + "@firebase/remote-config-compat": "0.1.6", + "@firebase/storage": "0.9.3", + "@firebase/storage-compat": "0.1.11", + "@firebase/util": "1.5.0" + } + }, + "node_modules/flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" + "node": ">= 0.10" } }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=4" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "node_modules/flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/follow-redirects": { + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "engines": { - "node": ">= 0.4" + "node": ">=4.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/terser": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", - "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", - "dev": true, + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", "dependencies": { - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" + "for-in": "^1.0.1" }, "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", - "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", - "dev": true, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dependencies": { - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.2" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } + "node": ">= 6" } }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">= 0.6" } }, - "node_modules/terser-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dependencies": { + "map-cache": "^0.2.2" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/terser/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true, "engines": { - "node": ">= 8" + "node": ">= 0.6" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dependencies": { - "rimraf": "^3.0.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=8.17.0" + "node": ">=6 <7 || >=8" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, "engines": { - "node": ">=4" + "node": ">= 8" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, + "node_modules/fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", "dependencies": { - "is-number": "^7.0.0" + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" }, "engines": { - "node": ">=8.0" + "node": ">= 0.10" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "engines": { - "node": ">=0.6" + "node_modules/fs-mkdirp-stream/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "node_modules/fs-mkdirp-stream/node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" } }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" + "node_modules/fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true + }, + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" }, - "bin": { - "json5": "lib/cli.js" + "engines": { + "node": ">=10" } }, - "node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "dependencies": { - "prelude-ls": "^1.2.1" + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "engines": { - "node": ">= 0.8.0" + "node": ">=8.0.0" } }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "engines": { "node": ">=10" }, @@ -7972,5064 +8226,17554 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, "engines": { - "node": ">= 0.6" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=4" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", - "dev": true, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, "engines": { - "node": ">=4" + "node": ">= 6" } }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", - "dev": true, + "node_modules/glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "dependencies": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + }, "engines": { - "node": ">=4" + "node": ">= 0.10" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true, - "engines": { - "node": ">= 0.8" + "node_modules/glob-stream/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, + "node_modules/glob-stream/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dependencies": { - "punycode": "^2.1.0" + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true, + "node_modules/glob-watcher": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz", + "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==", + "dependencies": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "normalize-path": "^3.0.0", + "object.defaults": "^1.1.0" + }, "engines": { - "node": ">= 0.4.0" + "node": ">= 0.10" } }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" + "node_modules/glob-watcher/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true + "node_modules/glob-watcher/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true, + "node_modules/glob-watcher/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" } }, - "node_modules/watchpack": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", - "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", - "dev": true, + "node_modules/glob-watcher/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "engines": { - "node": ">=10.13.0" + "node": ">=0.10.0" } }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, + "node_modules/glob-watcher/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dependencies": { - "minimalistic-assert": "^1.0.0" + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "node_modules/webpack": { - "version": "5.70.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", - "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", - "dev": true, + "node_modules/glob-watcher/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.2", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", - "webpack-sources": "^3.2.3" + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" }, - "bin": { - "webpack": "bin/webpack.js" + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/glob-watcher/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "engines": { - "node": ">=10.13.0" + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } + "engines": { + "node": ">= 4.0" } }, - "node_modules/webpack-cli": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz", - "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==", - "dev": true, + "node_modules/glob-watcher/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.1.1", - "@webpack-cli/info": "^1.4.1", - "@webpack-cli/serve": "^1.6.1", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "execa": "^5.0.0", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-watcher/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dependencies": { + "is-extglob": "^2.1.0" }, - "bin": { - "webpack-cli": "bin/cli.js" + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dependencies": { + "binary-extensions": "^1.0.0" }, "engines": { - "node": ">=10.13.0" + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" }, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x" + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "@webpack-cli/migrate": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } + "engines": { + "node": ">=0.10.0" } }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, + "node_modules/glob-watcher/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, "engines": { - "node": ">= 10" + "node": ">=0.10.0" } }, - "node_modules/webpack-dev-middleware": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz", - "integrity": "sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg==", - "dev": true, + "node_modules/glob-watcher/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.1", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" }, "engines": { - "node": ">= 12.13.0" + "node": ">=0.10" + } + }, + "node_modules/glob-watcher/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dependencies": { - "fast-deep-equal": "^3.1.3" + "isexe": "^2.0.0" }, - "peerDependencies": { - "ajv": "^8.8.2" + "bin": { + "which": "bin/which" } }, - "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } }, - "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/webpack-dev-server": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.4.tgz", - "integrity": "sha512-nfdsb02Zi2qzkNmgtZjkrMOcXnYZ6FLKcQwpxT7MvmHKc+oTtDsBju8j+NMyAygZ9GW1jMEUpy3itHtqgEhe1A==", - "dev": true, + "node_modules/glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.2.2", - "ansi-html-community": "^0.0.8", - "bonjour": "^3.5.0", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "default-gateway": "^6.0.3", - "del": "^6.0.0", - "express": "^4.17.1", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.0", - "ipaddr.js": "^2.0.1", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "portfinder": "^1.0.28", - "schema-utils": "^4.0.0", - "selfsigned": "^2.0.0", - "serve-index": "^1.9.1", - "sockjs": "^0.3.21", - "spdy": "^4.0.2", - "strip-ansi": "^7.0.0", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" + "sparkles": "^1.0.0" }, "engines": { - "node": ">= 12.13.0" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } + "node": ">= 0.10" } }, - "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, + "node_modules/graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + }, + "node_modules/gulp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.10" } }, - "node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" + "node_modules/gulp-cli": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz", + "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", + "dependencies": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.4.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.2.0", + "yargs": "^7.1.0" }, - "peerDependencies": { - "ajv": "^8.8.2" + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.10" } }, - "node_modules/webpack-dev-server/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, + "node_modules/gulp-cli/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">=0.10.0" } }, - "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, + "node_modules/gulp-cli/node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">=0.10.0" } }, - "node_modules/webpack-dev-server/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, + "node_modules/gulp-cli/node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" } }, - "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, + "node_modules/gulp-cli/node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "node_modules/gulp-cli/node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "engines": { - "node": ">=10.0.0" + "node": ">= 0.10" } }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, + "node_modules/gulp-cli/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dependencies": { + "number-is-nan": "^1.0.0" + }, "engines": { - "node": ">=10.13.0" + "node": ">=0.10.0" } }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, + "node_modules/gulp-cli/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">=0.10.0" } }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "node_modules/gulp-cli/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" + "ansi-regex": "^2.0.0" }, "engines": { - "node": ">=0.8.0" + "node": ">=0.10.0" } }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "node_modules/gulp-cli/node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, "engines": { - "node": ">=0.8.0" + "node": ">=0.10.0" } }, - "node_modules/whatwg-fetch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" + "node_modules/gulp-cli/node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "node_modules/gulp-cli/node_modules/yargs": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz", + "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==", "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.1" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, + "node_modules/gulp-cli/node_modules/yargs-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", + "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" } }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, + "node_modules/gulp-file": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/gulp-file/-/gulp-file-0.4.0.tgz", + "integrity": "sha1-RRNWoqxQicbbkaBEQlKgVDZXAGs=", "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "through2": "^0.4.1", + "vinyl": "^2.1.0" } }, - "node_modules/wildcard": { + "node_modules/gulp-rename": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, + "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-2.0.0.tgz", + "integrity": "sha512-97Vba4KBzbYmR5VBs9mWmK+HwIf5mj+/zioxfZhOKeXtx5ZjBk57KFlePf5nxq9QsTtFl0ejnHE3zTC9MHXqyQ==", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/gulp-replace": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-1.1.3.tgz", + "integrity": "sha512-HcPHpWY4XdF8zxYkDODHnG2+7a3nD/Y8Mfu3aBgMiCFDW3X2GiOKXllsAmILcxe3KZT2BXoN18WrpEFm48KfLQ==", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "@types/node": "^14.14.41", + "@types/vinyl": "^2.0.4", + "istextorbinary": "^3.0.0", + "replacestream": "^4.0.3", + "yargs-parser": ">=5.0.0-security.0" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/gulp-replace/node_modules/@types/node": { + "version": "14.18.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", + "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==" + }, + "node_modules/gulp-zip": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/gulp-zip/-/gulp-zip-5.1.0.tgz", + "integrity": "sha512-XZr/y91IliK/SpR74g3TkZejGkGEmK7CSDjSghT1jXshgO+dFvpLIz9w9fpuwkew6i7k4F+G24TubNgq1ISzEw==", "dependencies": { - "color-convert": "^2.0.1" + "get-stream": "^5.2.0", + "plugin-error": "^1.0.1", + "through2": "^3.0.1", + "vinyl": "^2.1.0", + "yazl": "^2.5.1" }, "engines": { "node": ">=8" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "gulp": ">=4" + }, + "peerDependenciesMeta": { + "gulp": { + "optional": true + } } }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/gulp-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dependencies": { - "color-name": "~1.1.4" + "pump": "^3.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "node_modules/gulp-zip/node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } }, - "node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "node_modules/gulp-zip/node_modules/through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" } }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "node_modules/gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dependencies": { + "glogg": "^1.0.0" + }, "engines": { - "node": ">=10" + "node": ">= 0.10" } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "function-bind": "^1.1.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4.0" } }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "engines": { - "node": ">=10" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.7" + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" } }, - "@babel/compat-data": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", - "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", - "dev": true - }, - "@babel/core": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", - "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.7", - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.8", - "@babel/parser": "^7.17.8", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0" + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@babel/generator": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", - "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, - "requires": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", - "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.16.7", - "@babel/types": "^7.16.7" + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "@babel/helper-compilation-targets": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", - "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", - "semver": "^6.3.0" + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "@babel/helper-create-class-features-plugin": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz", - "integrity": "sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7" + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", - "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "regexpu-core": "^5.0.1" + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "@babel/helper-define-polyfill-provider": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", - "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, - "requires": { - "@babel/types": "^7.16.7" + "bin": { + "he": "bin/he" } }, - "@babel/helper-explode-assignable-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", - "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "@babel/helper-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", - "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" - } + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" }, - "@babel/helper-get-function-arity": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", - "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", "dev": true, - "requires": { - "@babel/types": "^7.16.7" + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" } }, - "@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", - "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", - "dev": true, - "requires": { - "@babel/types": "^7.17.0" - } + "node_modules/html-entities": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", + "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", + "dev": true }, - "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", "dev": true, - "requires": { - "@babel/types": "^7.16.7" + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" } }, - "@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", + "node_modules/html-webpack-plugin": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "webpack": "^5.20.0" } }, - "@babel/helper-optimise-call-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", - "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", "dev": true, - "requires": { - "@babel/types": "^7.16.7" + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" } }, - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", "dev": true }, - "@babel/helper-remap-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", - "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", + "node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-wrap-function": "^7.16.8", - "@babel/types": "^7.16.8" + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" } }, - "@babel/helper-replace-supers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", - "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" - } + "node_modules/http-parser-js": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", + "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==" }, - "@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, - "requires": { - "@babel/types": "^7.17.0" + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", - "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" } }, - "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "node_modules/http-proxy-middleware": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz", + "integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==", "dev": true, - "requires": { - "@babel/types": "^7.16.7" + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } } }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } }, - "@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "dev": true + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } }, - "@babel/helper-wrap-function": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", - "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.8", - "@babel/types": "^7.16.8" + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" } }, - "@babel/helpers": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", - "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true, - "requires": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "engines": { + "node": ">= 4" } }, - "@babel/parser": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", - "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==", - "dev": true + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", - "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", - "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.7" + "engines": { + "node": ">=4" } }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", - "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-remap-async-to-generator": "^7.16.8", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/plugin-proposal-class-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", - "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "engines": { + "node": ">=0.8.19" } }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", - "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.17.6", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "engines": { + "node": ">=8" } }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", - "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" } }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", - "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" } }, - "@babel/plugin-proposal-json-strings": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", - "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "engines": { + "node": ">= 0.10" } }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", - "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "engines": { + "node": ">=0.10.0" } }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", - "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "node_modules/ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "engines": { + "node": ">= 10" } }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", - "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", - "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.17.0", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.7" + "node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", - "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", - "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, - "@babel/plugin-proposal-private-methods": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", - "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.10", - "@babel/helper-plugin-utils": "^7.16.7" + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", - "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", - "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "node_modules/is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" } }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "engines": { + "node": ">=0.10.0" } }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" } }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "engines": { + "node": ">=6" } }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "node_modules/is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "engines": { + "node": ">=0.10.0" } }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", - "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" } }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", - "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", + "node_modules/is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-remap-async-to-generator": "^7.16.8" + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", - "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "engines": { + "node": ">=6" } }, - "@babel/plugin-transform-block-scoping": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", - "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "engines": { + "node": ">=8" } }, - "@babel/plugin-transform-classes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", - "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "globals": "^11.1.0" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/plugin-transform-computed-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", - "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "@babel/plugin-transform-destructuring": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", - "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", - "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dependencies": { + "@types/estree": "*" } }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", - "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", - "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "@babel/plugin-transform-for-of": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", - "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", + "node_modules/is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@babel/plugin-transform-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", - "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/plugin-transform-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", - "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", - "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@babel/plugin-transform-modules-amd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", - "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" - } + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.7.tgz", - "integrity": "sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "babel-plugin-dynamic-import-node": "^2.3.3" + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", - "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "node_modules/is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "engines": { + "node": ">=0.10.0" } }, - "@babel/plugin-transform-modules-umd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", - "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", - "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7" + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "engines": { + "node": ">=0.10.0" } }, - "@babel/plugin-transform-new-target": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", - "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "@babel/plugin-transform-object-super": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", - "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7" + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "engines": { + "node": ">=0.10.0" } }, - "@babel/plugin-transform-parameters": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", - "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "engines": { + "node": ">=8" } }, - "@babel/plugin-transform-property-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", - "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "node_modules/istanbul-lib-instrument": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", + "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" } }, - "@babel/plugin-transform-regenerator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz", - "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==", - "dev": true, - "requires": { - "regenerator-transform": "^0.14.2" + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" } }, - "@babel/plugin-transform-reserved-words": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", - "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" } }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", - "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "@babel/plugin-transform-spread": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", - "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" } }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", - "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" } }, - "@babel/plugin-transform-template-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", - "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "node_modules/istanbul-reports": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", + "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", - "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "node_modules/istextorbinary": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-3.3.0.tgz", + "integrity": "sha512-Tvq1W6NAcZeJ8op+Hq7tdZ434rqnMx4CCZ7H0ff83uEloDvVbqAwaMTZcafKGJT0VHkYzuXUiCY4hlXQg6WfoQ==", + "dependencies": { + "binaryextensions": "^2.2.0", + "textextensions": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://bevry.me/fund" } }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", - "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "node_modules/jest": { + "version": "27.2.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.2.4.tgz", + "integrity": "sha512-h4uqb1EQLfPulWyUFFWv9e9Nn8sCqsJ/j3wk/KCY0p4s4s0ICCfP3iMf6hRf5hEhsDyvyrCgKiZXma63gMz16A==", + "dependencies": { + "@jest/core": "^27.2.4", + "import-local": "^3.0.2", + "jest-cli": "^27.2.4" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", - "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "node_modules/jest-changed-files": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "dependencies": { + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "@babel/preset-env": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", - "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.16.8", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-async-generator-functions": "^7.16.8", - "@babel/plugin-proposal-class-properties": "^7.16.7", - "@babel/plugin-proposal-class-static-block": "^7.16.7", - "@babel/plugin-proposal-dynamic-import": "^7.16.7", - "@babel/plugin-proposal-export-namespace-from": "^7.16.7", - "@babel/plugin-proposal-json-strings": "^7.16.7", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", - "@babel/plugin-proposal-numeric-separator": "^7.16.7", - "@babel/plugin-proposal-object-rest-spread": "^7.16.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", - "@babel/plugin-proposal-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-private-methods": "^7.16.11", - "@babel/plugin-proposal-private-property-in-object": "^7.16.7", - "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.16.7", - "@babel/plugin-transform-async-to-generator": "^7.16.8", - "@babel/plugin-transform-block-scoped-functions": "^7.16.7", - "@babel/plugin-transform-block-scoping": "^7.16.7", - "@babel/plugin-transform-classes": "^7.16.7", - "@babel/plugin-transform-computed-properties": "^7.16.7", - "@babel/plugin-transform-destructuring": "^7.16.7", - "@babel/plugin-transform-dotall-regex": "^7.16.7", - "@babel/plugin-transform-duplicate-keys": "^7.16.7", - "@babel/plugin-transform-exponentiation-operator": "^7.16.7", - "@babel/plugin-transform-for-of": "^7.16.7", - "@babel/plugin-transform-function-name": "^7.16.7", - "@babel/plugin-transform-literals": "^7.16.7", - "@babel/plugin-transform-member-expression-literals": "^7.16.7", - "@babel/plugin-transform-modules-amd": "^7.16.7", - "@babel/plugin-transform-modules-commonjs": "^7.16.8", - "@babel/plugin-transform-modules-systemjs": "^7.16.7", - "@babel/plugin-transform-modules-umd": "^7.16.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", - "@babel/plugin-transform-new-target": "^7.16.7", - "@babel/plugin-transform-object-super": "^7.16.7", - "@babel/plugin-transform-parameters": "^7.16.7", - "@babel/plugin-transform-property-literals": "^7.16.7", - "@babel/plugin-transform-regenerator": "^7.16.7", - "@babel/plugin-transform-reserved-words": "^7.16.7", - "@babel/plugin-transform-shorthand-properties": "^7.16.7", - "@babel/plugin-transform-spread": "^7.16.7", - "@babel/plugin-transform-sticky-regex": "^7.16.7", - "@babel/plugin-transform-template-literals": "^7.16.7", - "@babel/plugin-transform-typeof-symbol": "^7.16.7", - "@babel/plugin-transform-unicode-escapes": "^7.16.7", - "@babel/plugin-transform-unicode-regex": "^7.16.7", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.16.8", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.5.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", - "core-js-compat": "^3.20.2", - "semver": "^6.3.0" + "node_modules/jest-circus": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "@babel/runtime": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.8.tgz", - "integrity": "sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" + "node_modules/jest-circus/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - } + "node_modules/jest-circus/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", - "debug": "^4.1.0", - "globals": "^11.1.0" + "node_modules/jest-circus/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" } }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" + "node_modules/jest-circus/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "@bdelab/roar-firekit": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@bdelab/roar-firekit/-/roar-firekit-0.1.3.tgz", - "integrity": "sha512-XzbPgwA6OhirUK0qu95VzbXf9cgX7dHu78aaQnMd1nZeH3lhqipERTfiw7kDaAcpAmYmA8Om2zwKoUEmGkyZ6g==", - "requires": { - "firebase": "^9.6.8", - "uuid": "^8.3.2" + "node_modules/jest-cli": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "dependencies": { + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", - "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.1", - "globals": "^13.9.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, + "node_modules/jest-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - } + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "@firebase/analytics": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.7.6.tgz", - "integrity": "sha512-hfN+cnWuRY5QfbeBeZOOD9xC/ePavPaAPh3Bc1u0yZLMgF3No3ME6K2dVHKWK1K0BIPzLsliojYYRYnWMF6TZw==", - "requires": { - "@firebase/component": "0.5.11", - "@firebase/installations": "0.5.6", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.5.0", - "tslib": "^2.1.0" + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "@firebase/analytics-compat": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.1.7.tgz", - "integrity": "sha512-bVnv+xM2YwAouWjeo+HCN0GWu6i0sLzM2AcpmfsQuC97SNRFqIpRUYmjaeTdDALt3k1fIUzYMcZZE4xuC2qK/A==", - "requires": { - "@firebase/analytics": "0.7.6", - "@firebase/analytics-types": "0.7.0", - "@firebase/component": "0.5.11", - "@firebase/util": "1.5.0", - "tslib": "^2.1.0" + "node_modules/jest-cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "@firebase/analytics-types": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.7.0.tgz", - "integrity": "sha512-DNE2Waiwy5+zZnCfintkDtBfaW6MjIG883474v6Z0K1XZIvl76cLND4iv0YUb48leyF+PJK1KO2XrgHb/KpmhQ==" + "node_modules/jest-cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "@firebase/app": { - "version": "0.7.19", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.7.19.tgz", - "integrity": "sha512-Xs8s3OF4Tn7Ls833TOTAUSMDq/pDs1fDsLRprR1+B4wyxyWCYBisgDMnPx25z9wKJESOWoZTDjyBVHrn6sG92w==", - "requires": { - "@firebase/component": "0.5.11", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.5.0", - "tslib": "^2.1.0" + "node_modules/jest-cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" } }, - "@firebase/app-check": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.5.4.tgz", - "integrity": "sha512-UX6IcuapbLb8Q4zYaUq5UKbpXURY4lrK41Is2c56Q/h7i4zRiMYLKEETJZIfVATE2vKsbjxSxn02xS9g/VPftw==", - "requires": { - "@firebase/component": "0.5.11", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.5.0", - "tslib": "^2.1.0" + "node_modules/jest-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "@firebase/app-check-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.2.4.tgz", - "integrity": "sha512-CnbjhzIdpL7671wwcWMgYDBfCxuMjjg8OITlTtP2vN8h6uBFuPosRpc2GZ/h32IA3fzwyeFplFjy/y8Gyhh6Dw==", - "requires": { - "@firebase/app-check": "0.5.4", - "@firebase/component": "0.5.11", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.5.0", - "tslib": "^2.1.0" + "node_modules/jest-config": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "dependencies": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } } }, - "@firebase/app-check-interop-types": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.1.0.tgz", - "integrity": "sha512-uZfn9s4uuRsaX5Lwx+gFP3B6YsyOKUE+Rqa6z9ojT4VSRAsZFko9FRn6OxQUA1z5t5d08fY4pf+/+Dkd5wbdbA==" - }, - "@firebase/app-compat": { - "version": "0.1.20", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.1.20.tgz", - "integrity": "sha512-s+MQQv5acNZ2Mx/TNyr+B0XaqATq14hkAL9247exIvV0RBwP28THuadPVw99kjrwkHilQtBMFJmmCm1S5ZoktQ==", - "requires": { - "@firebase/app": "0.7.19", - "@firebase/component": "0.5.11", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.5.0", - "tslib": "^2.1.0" + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "@firebase/app-types": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.7.0.tgz", - "integrity": "sha512-6fbHQwDv2jp/v6bXhBw2eSRbNBpxHcd1NBF864UksSMVIqIyri9qpJB1Mn6sGZE+bnDsSQBC5j2TbMxYsJQkQg==" - }, - "@firebase/auth": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.19.10.tgz", - "integrity": "sha512-FqKHohxZriJM4S8hY0RbNwGVb+Y5INsWkWsqOaWQ9pM0hEolYruE10gKqrOHO9kauXhKbdUUGPgKHJJ9+r8eVg==", - "requires": { - "@firebase/component": "0.5.11", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.5.0", - "node-fetch": "2.6.7", - "selenium-webdriver": "4.0.0-rc-1", - "tslib": "^2.1.0" + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "@firebase/auth-compat": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.2.10.tgz", - "integrity": "sha512-FYsU18N3nZq/l7gfnmH8tYOPDWSU3pPJa/JAmflfcwcDJnYLAiHRHZb0KmLV5baRMD8QdMdER5bGbzWgtOmczQ==", - "requires": { - "@firebase/auth": "0.19.10", - "@firebase/auth-types": "0.11.0", - "@firebase/component": "0.5.11", - "@firebase/util": "1.5.0", - "node-fetch": "2.6.7", - "selenium-webdriver": "^4.0.0-beta.2", - "tslib": "^2.1.0" + "node_modules/jest-config/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "@firebase/auth-interop-types": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.6.tgz", - "integrity": "sha512-etIi92fW3CctsmR9e3sYM3Uqnoq861M0Id9mdOPF6PWIg38BXL5k4upCNBggGUpLIS0H1grMOvy/wn1xymwe2g==", - "requires": {} - }, - "@firebase/auth-types": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.11.0.tgz", - "integrity": "sha512-q7Bt6cx+ySj9elQHTsKulwk3+qDezhzRBFC9zlQ1BjgMueUOnGMcvqmU0zuKlQ4RhLSH7MNAdBV2znVaoN3Vxw==", - "requires": {} + "node_modules/jest-config/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "@firebase/component": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.5.11.tgz", - "integrity": "sha512-amtUrJxfJhJdjR3JzXqkHIoghJJ34o8OiSDj3gq96uKL4BRkSpmPaxi0+1r8DcDQ6bQxh3kDSoge8bRCDQCvsw==", - "requires": { - "@firebase/util": "1.5.0", - "tslib": "^2.1.0" + "node_modules/jest-config/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" } }, - "@firebase/database": { - "version": "0.12.6", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.12.6.tgz", - "integrity": "sha512-vokGkgpk+4bvy1d/s0lsPP9GmC1nrAtctQwEEDH5ZO4WCYPj16Y6rKILsOjrWwJ+Ih21ORnekxSzfpKyd1KHEg==", - "requires": { - "@firebase/auth-interop-types": "0.1.6", - "@firebase/component": "0.5.11", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.5.0", - "faye-websocket": "0.11.4", - "tslib": "^2.1.0" + "node_modules/jest-config/node_modules/jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "@firebase/database-compat": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-0.1.6.tgz", - "integrity": "sha512-fDAJWI5ZdXPlS84NC87Et7pE6mJxF5uUoePCaQFpU56wrYVk58COomcSXtFrdX9U5/1FHjR3TaDWV5pJakv83g==", - "requires": { - "@firebase/component": "0.5.11", - "@firebase/database": "0.12.6", - "@firebase/database-types": "0.9.5", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.5.0", - "tslib": "^2.1.0" + "node_modules/jest-config/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "@firebase/database-types": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.9.5.tgz", - "integrity": "sha512-0p9BDmoZCbW5c//tl7IUn8hOIM4M6wCnLmVdbVUvD30V4hZT36phdhajf36pcMgE9suMsz4xtvWlngEy9FeHwA==", - "requires": { - "@firebase/app-types": "0.7.0", - "@firebase/util": "1.5.0" + "node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "@firebase/firestore": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-3.4.6.tgz", - "integrity": "sha512-HVyrg1LAVePvut+qf856mCSdZbVL9dhnK1skZ6LY2KquS71RW0v7/iu+/Wn00kPHbZSmHGvYzHD6JOf+kjjbuQ==", - "requires": { - "@firebase/component": "0.5.11", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.5.0", - "@firebase/webchannel-wrapper": "0.6.1", - "@grpc/grpc-js": "^1.3.2", - "@grpc/proto-loader": "^0.6.0", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "@firebase/firestore-compat": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.1.15.tgz", - "integrity": "sha512-bk0f2JbdgJc0P0eHnQBrqRF7xgMiSh6qyYqDTUh08/5kwdJed1SlmvF/3BSDhQHABcji99YhgR3E1ms6uoZwdg==", - "requires": { - "@firebase/component": "0.5.11", - "@firebase/firestore": "3.4.6", - "@firebase/firestore-types": "2.5.0", - "@firebase/util": "1.5.0", - "tslib": "^2.1.0" - } - }, - "@firebase/firestore-types": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-2.5.0.tgz", - "integrity": "sha512-I6c2m1zUhZ5SH0cWPmINabDyH5w0PPFHk2UHsjBpKdZllzJZ2TwTkXbDtpHUZNmnc/zAa0WNMNMvcvbb/xJLKA==", - "requires": {} - }, - "@firebase/functions": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.7.9.tgz", - "integrity": "sha512-C8FpECq2tSOXnWT+npw/qDihxWvs6vT0NdsOEV0artNKphf0tzUleo8NgklyqSmwnAy0v35YGTNdVvxCWt5N8A==", - "requires": { - "@firebase/app-check-interop-types": "0.1.0", - "@firebase/auth-interop-types": "0.1.6", - "@firebase/component": "0.5.11", - "@firebase/messaging-interop-types": "0.1.0", - "@firebase/util": "1.5.0", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "@firebase/functions-compat": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.1.10.tgz", - "integrity": "sha512-Iqq1335rnhed+6WcOGUr+C8PzBAUwGnrQCKmo0YkyiLrO7UwRhIEeS/su4cthp4KNTsT5bdZWzEh9I4ZJ00bjw==", - "requires": { - "@firebase/component": "0.5.11", - "@firebase/functions": "0.7.9", - "@firebase/functions-types": "0.5.0", - "@firebase/util": "1.5.0", - "tslib": "^2.1.0" + "node_modules/jest-diff/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "@firebase/functions-types": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.5.0.tgz", - "integrity": "sha512-qza0M5EwX+Ocrl1cYI14zoipUX4gI/Shwqv0C1nB864INAD42Dgv4v94BCyxGHBg2kzlWy8PNafdP7zPO8aJQA==" + "node_modules/jest-diff/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "@firebase/installations": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.5.6.tgz", - "integrity": "sha512-e/sDDungY/haSw9H+DmknZkf6M8Q3O9CLUHoVldqX96lvOpT8le6YndJOgK6fTHiRs0ro3amg+4ef2mn40NqzQ==", - "requires": { - "@firebase/component": "0.5.11", - "@firebase/util": "1.5.0", - "tslib": "^2.1.0" + "node_modules/jest-diff/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" } }, - "@firebase/logger": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.3.2.tgz", - "integrity": "sha512-lzLrcJp9QBWpo40OcOM9B8QEtBw2Fk1zOZQdvv+rWS6gKmhQBCEMc4SMABQfWdjsylBcDfniD1Q+fUX1dcBTXA==", - "requires": { - "tslib": "^2.1.0" + "node_modules/jest-diff/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "@firebase/messaging": { - "version": "0.9.10", - "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.9.10.tgz", - "integrity": "sha512-Q59obc+hhqDxz5oJh012lI7kCKxcnNV7nMB74Hc7LGT7/oZ3abPl1rmnC0KKdaAHm37/riJgEgDW0HrUTc5REA==", - "requires": { - "@firebase/component": "0.5.11", - "@firebase/installations": "0.5.6", - "@firebase/messaging-interop-types": "0.1.0", - "@firebase/util": "1.5.0", - "tslib": "^2.1.0" + "node_modules/jest-docblock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "@firebase/messaging-compat": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.1.10.tgz", - "integrity": "sha512-RtdXnn8MWPvWm/1BKR0g0U763RcAALzqPl8zEIkjFBq9wBS7rWqbj9zZ+c4rFUVks4vleLqLv9v6M0O/FsieMg==", - "requires": { - "@firebase/component": "0.5.11", - "@firebase/messaging": "0.9.10", - "@firebase/util": "1.5.0", - "tslib": "^2.1.0" + "node_modules/jest-each": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "@firebase/messaging-interop-types": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.1.0.tgz", - "integrity": "sha512-DbvUl/rXAZpQeKBnwz0NYY5OCqr2nFA0Bj28Fmr3NXGqR4PAkfTOHuQlVtLO1Nudo3q0HxAYLa68ZDAcuv2uKQ==" + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "@firebase/performance": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.5.6.tgz", - "integrity": "sha512-QfVq2Pa5PSoYLgwVyEFApb1i0mKISDzBRDC76VHx5wOSi28c31coYK0qrHjVkHlG51nnyEtBIWqXC2fFaOzr5Q==", - "requires": { - "@firebase/component": "0.5.11", - "@firebase/installations": "0.5.6", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.5.0", - "tslib": "^2.1.0" + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "@firebase/performance-compat": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.1.6.tgz", - "integrity": "sha512-DHGw/u4iGZGeEj95CQooA3oOBcPBUw4+JuMSnk7qmY6iYBsYmkcUPVCFsgYNcAVtHBdU64DJX9RZbjkMmNX0uQ==", - "requires": { - "@firebase/component": "0.5.11", - "@firebase/logger": "0.3.2", - "@firebase/performance": "0.5.6", - "@firebase/performance-types": "0.1.0", - "@firebase/util": "1.5.0", - "tslib": "^2.1.0" + "node_modules/jest-each/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "@firebase/performance-types": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.1.0.tgz", - "integrity": "sha512-6p1HxrH0mpx+622Ql6fcxFxfkYSBpE3LSuwM7iTtYU2nw91Hj6THC8Bc8z4nboIq7WvgsT/kOTYVVZzCSlXl8w==" + "node_modules/jest-each/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "@firebase/polyfill": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@firebase/polyfill/-/polyfill-0.3.36.tgz", - "integrity": "sha512-zMM9oSJgY6cT2jx3Ce9LYqb0eIpDE52meIzd/oe/y70F+v9u1LDqk5kUF5mf16zovGBWMNFmgzlsh6Wj0OsFtg==", - "requires": { - "core-js": "3.6.5", - "promise-polyfill": "8.1.3", - "whatwg-fetch": "2.0.4" + "node_modules/jest-each/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" } }, - "@firebase/remote-config": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.3.5.tgz", - "integrity": "sha512-sxV8dpgQNWVPWDAVX7KtLCbkBJyox1L+RlGn/Djpj47YgeNuLOqjRZeEoydL9RO3EdzKG6EcHeqOhdpMBgeiNA==", - "requires": { - "@firebase/component": "0.5.11", - "@firebase/installations": "0.5.6", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.5.0", - "tslib": "^2.1.0" + "node_modules/jest-each/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "@firebase/remote-config-compat": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.1.6.tgz", - "integrity": "sha512-OEGADnpKIoVQF1blOTxzFBrP6LzEXR+IA7vyLwh7lL+qXpDJGvmg0Eoxb4yxZw4cQCZBGO6fcilBZkDmTDEp/w==", - "requires": { - "@firebase/component": "0.5.11", - "@firebase/logger": "0.3.2", - "@firebase/remote-config": "0.3.5", - "@firebase/remote-config-types": "0.2.0", - "@firebase/util": "1.5.0", - "tslib": "^2.1.0" + "node_modules/jest-environment-jsdom": { + "version": "27.2.4", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.2.4.tgz", + "integrity": "sha512-X70pTXFSypD7AIzKT1mLnDi5hP9w9mdTRcOGOmoDoBrNyNEg4rYm6d4LQWFLc9ps1VnMuDOkFSG0wjSNYGjkng==", + "dependencies": { + "@jest/environment": "^27.2.4", + "@jest/fake-timers": "^27.2.4", + "@jest/types": "^27.2.4", + "@types/node": "*", + "jest-mock": "^27.2.4", + "jest-util": "^27.2.4", + "jsdom": "^16.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "@firebase/remote-config-types": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.2.0.tgz", - "integrity": "sha512-hqK5sCPeZvcHQ1D6VjJZdW6EexLTXNMJfPdTwbD8NrXUw6UjWC4KWhLK/TSlL0QPsQtcKRkaaoP+9QCgKfMFPw==" - }, - "@firebase/storage": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.9.3.tgz", - "integrity": "sha512-bi1sxMGduTl/cidtIqVyPyIAHEjMrQ5cMry2s4LfJMwaztUdSjgeSZRKLo5Nqy5/CC5fPhNIU3ueLhDm9z7dsA==", - "requires": { - "@firebase/component": "0.5.11", - "@firebase/util": "1.5.0", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" + "node_modules/jest-environment-node": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "@firebase/storage-compat": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.1.11.tgz", - "integrity": "sha512-dD0OaFKgNqtNvirOB6omXw2RJEDGnfJtus2K93cgIqkUxso0NawTA/7LyD3nMccb2L11BMh57GcdyKHL0AWoJQ==", - "requires": { - "@firebase/component": "0.5.11", - "@firebase/storage": "0.9.3", - "@firebase/storage-types": "0.6.0", - "@firebase/util": "1.5.0", - "tslib": "^2.1.0" + "node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "@firebase/storage-types": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.6.0.tgz", - "integrity": "sha512-1LpWhcCb1ftpkP/akhzjzeFxgVefs6eMD2QeKiJJUGH1qOiows2w5o0sKCUSQrvrRQS1lz3SFGvNR1Ck/gqxeA==", - "requires": {} - }, - "@firebase/util": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.5.0.tgz", - "integrity": "sha512-4w4OY3YJVHV/4UBZ8OcXb8BD8I83P5n2y+FW0dHhn9OLXdYDg8bvCTA08P0nszpZqBhwutKQ4OS7c530SGjeLg==", - "requires": { - "tslib": "^2.1.0" + "node_modules/jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" } }, - "@firebase/webchannel-wrapper": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.6.1.tgz", - "integrity": "sha512-9FqhNjKQWpQ3fGnSOCovHOm+yhhiorKEqYLAfd525jWavunDJcx8rOW6i6ozAh+FbwcYMkL7b+3j4UR/30MpoQ==" - }, - "@grpc/grpc-js": { - "version": "1.5.9", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.5.9.tgz", - "integrity": "sha512-un+cXqErq5P4p3+WgYVNVh7FB51MSnaoRef7QWDcMXKR6FX2R6Z/bltcJMxNNdTUMC85lkOQcpnAAetFziPSng==", - "requires": { - "@grpc/proto-loader": "^0.6.4", - "@types/node": ">=12.12.47" + "node_modules/jest-jasmine2": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "@grpc/proto-loader": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.9.tgz", - "integrity": "sha512-UlcCS8VbsU9d3XTXGiEVFonN7hXk+oMXZtoHHG2oSA1/GcDP1q6OUgs20PzHDGizzyi8ufGSUDlk3O2NyY7leg==", - "requires": { - "@types/long": "^4.0.1", - "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^6.10.0", - "yargs": "^16.2.0" + "node_modules/jest-jasmine2/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "@humanwhocodes/config-array": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", - "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" + "node_modules/jest-jasmine2/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", - "dev": true + "node_modules/jest-jasmine2/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", - "dev": true + "node_modules/jest-jasmine2/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "@jridgewell/trace-mapping": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", - "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "node_modules/jest-jasmine2/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" } }, - "@jspsych-contrib/plugin-rdk": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@jspsych-contrib/plugin-rdk/-/plugin-rdk-1.1.0.tgz", - "integrity": "sha512-wd/3Txwt3mfs9wmC1ZRmuJzD1z3HNcAOHa77KroiaoandbcKu4JfA7ec1onT0WZwTTWTN0EpY4B96AT3/QkL3g==", - "requires": {} + "node_modules/jest-jasmine2/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "@jspsych/plugin-audio-keyboard-response": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@jspsych/plugin-audio-keyboard-response/-/plugin-audio-keyboard-response-1.1.0.tgz", - "integrity": "sha512-fE9qSl0gdPM5ggWL0dBGWYeZhxQTYAwyS5BhYrKE22ADEz+N9LkaDmh5dSPYzA2oDP2GK8faWMGByU34OaXr2g==", - "requires": {} + "node_modules/jest-leak-detector": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "dependencies": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } }, - "@jspsych/plugin-fullscreen": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@jspsych/plugin-fullscreen/-/plugin-fullscreen-1.1.0.tgz", - "integrity": "sha512-JoAg+oxqodMNwlNznvBEVZ04fEldOKELX7JIlcqyMUxwbTxsjAetbyT1KFj8TBA4ABM6wBSgJxzGALmhbgIVwQ==", - "requires": {} + "node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } }, - "@jspsych/plugin-html-keyboard-response": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@jspsych/plugin-html-keyboard-response/-/plugin-html-keyboard-response-1.1.0.tgz", - "integrity": "sha512-oyB97ntzQLbdX5Kvn2RqEmhuPKNQAaxs4i5/4M5DkVQrIuY7+pY5d1neOYdcPZqNiyd5Xih2t9NRN3DgiFq2+A==", - "requires": {} + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "@jspsych/plugin-image-keyboard-response": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@jspsych/plugin-image-keyboard-response/-/plugin-image-keyboard-response-1.1.0.tgz", - "integrity": "sha512-HT7NqACtbW9vfdk1Uhmq3RIqRlq8widE/PdpKFAmwx40+qu2H/H1LHi2ZoN3okPCAUw9gB9L6xs0IxTI0/SGxg==", - "requires": {} + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } }, - "@jspsych/plugin-survey-text": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@jspsych/plugin-survey-text/-/plugin-survey-text-1.1.0.tgz", - "integrity": "sha512-Oh3FIhOmPCbt2wX8LGo38Gb2DM9f0ibxEWhncE2WHqhF5RmlDHO0bxHAaRhfM7c1L9c8p8hvqFjuoFrFu8L6jw==", - "requires": {} + "node_modules/jest-matcher-utils/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } }, - "@jspsych/plugin-video-keyboard-response": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@jspsych/plugin-video-keyboard-response/-/plugin-video-keyboard-response-1.1.0.tgz", - "integrity": "sha512-G6LYRmHIgW+GxaxcrTi2P2NCMgqDLCmNRxGw1vDJWt0qOC6ndhZ3khXK3LIZaWnc7gJav521d51CRQoMO3tDuw==", - "requires": {} + "node_modules/jest-matcher-utils/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "node_modules/jest-matcher-utils/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" } }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true + "node_modules/jest-matcher-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" - }, - "@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" - }, - "@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", - "requires": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" - }, - "@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } }, - "@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + "node_modules/jest-message-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } }, - "@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + "node_modules/jest-message-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + "node_modules/jest-message-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } }, - "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "dev": true, - "requires": { + "node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "dependencies": { + "@jest/types": "^27.5.1", "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, - "requires": { - "@types/node": "*" + "node_modules/jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } } }, - "@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", - "dev": true, - "requires": { - "@types/express-serve-static-core": "*", - "@types/node": "*" + "node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "@types/eslint": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz", - "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" + "node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "@types/eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" + "node_modules/jest-resolve-dependencies": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "@types/express-serve-static-core": { - "version": "4.17.28", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", - "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" + "node_modules/jest-resolve/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "dev": true + "node_modules/jest-resolve/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "@types/http-proxy": { - "version": "1.17.8", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", - "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", - "dev": true, - "requires": { - "@types/node": "*" + "node_modules/jest-resolve/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" } }, - "@types/json-schema": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.10.tgz", - "integrity": "sha512-BLO9bBq59vW3fxCpD4o0N4U+DXsvwvIcl+jofw0frQo/GrBFC+/jRZj1E7kgp6dvTyNmA4y6JCV5Id/r3mNP5A==", - "dev": true + "node_modules/jest-resolve/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true - }, - "@types/long": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", - "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" - }, - "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "dev": true + "node_modules/jest-runner": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } }, - "@types/node": { - "version": "17.0.22", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.22.tgz", - "integrity": "sha512-8FwbVoG4fy+ykY86XCAclKZDORttqE5/s7dyWZKLXTdv3vRy5HozBEinG5IqhvPXXzIZEcTVbuHlQEI6iuwcmw==" + "node_modules/jest-runner/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true + "node_modules/jest-runner/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } }, - "@types/retry": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", - "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", - "dev": true + "node_modules/jest-runner/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "dev": true, - "requires": { - "@types/express": "*" + "node_modules/jest-runner/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" } }, - "@types/serve-static": { - "version": "1.13.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", - "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", - "dev": true, - "requires": { - "@types/mime": "^1", - "@types/node": "*" + "node_modules/jest-runner/node_modules/jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "dev": true, - "requires": { - "@types/node": "*" + "node_modules/jest-runner/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", - "dev": true, - "requires": { - "@types/node": "*" + "node_modules/jest-runtime": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "node_modules/jest-runtime/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true + "node_modules/jest-runtime/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true + "node_modules/jest-runtime/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" + "node_modules/jest-runtime/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" } }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true + "node_modules/jest-runtime/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "engines": { + "node": ">=8" + } }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "node_modules/jest-runtime/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" + "node_modules/jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" + "node_modules/jest-snapshot": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "node_modules/jest-snapshot/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } + "node_modules/jest-snapshot/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" + "node_modules/jest-snapshot/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" } }, - "@webpack-cli/configtest": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", - "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", - "dev": true, - "requires": {} - }, - "@webpack-cli/info": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz", - "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==", - "dev": true, - "requires": { - "envinfo": "^7.7.3" + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "@webpack-cli/serve": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", - "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", - "dev": true, - "requires": {} - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "node_modules/jest-snapshot/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true + "node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "dev": true + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "requires": {} + "node_modules/jest-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} + "node_modules/jest-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "node_modules/jest-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" } }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "requires": { - "ajv": "^8.0.0" - }, + "node_modules/jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "argparse": { + "node_modules/jest-validate/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "array-includes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true + "node_modules/jest-validate/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "node_modules/jest-validate/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" } }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" + "node_modules/jest-validate/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "auto-bind": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", - "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==" + "node_modules/jest-watcher": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "dependencies": { + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } }, - "babel-loader": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.4.tgz", - "integrity": "sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==", - "dev": true, - "requires": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" + "node_modules/jest-watcher/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "babel-plugin-polyfill-corejs2": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", - "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.1", - "semver": "^6.1.1" + "node_modules/jest-watcher/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "babel-plugin-polyfill-corejs3": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", - "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.1", - "core-js-compat": "^3.21.0" + "node_modules/jest-watcher/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-watcher/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" } }, - "babel-plugin-polyfill-regenerator": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", - "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.1" + "node_modules/jest-watcher/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, - "body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" - }, "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true } } }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" + "node_modules/jsdom/node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" } }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true + "node_modules/jsdom/node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "engines": { + "node": ">=10.4" + } }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" } }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" + "node_modules/jsdom/node_modules/ws": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", + "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" } }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "node_modules/json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } }, - "camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "requires": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "caniuse-lite": { - "version": "1.0.30001319", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001319.tgz", - "integrity": "sha512-xjlIAFHucBRSMUo1kb5D4LYgcN1M45qdKP++lhqowDpwJwGkpIRTt5qQqnhxjj1vHcI7nrJxWhCC1ATrCEBTcw==", - "dev": true + "node_modules/jspsych": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/jspsych/-/jspsych-7.2.1.tgz", + "integrity": "sha512-226/vyFNL60WoLzS9tqZXm2xWD96+G5xIq7lVTOFWkGlkriqgCoWb+nzW+ZsA/z5wUk1qxsN8Ds4nnBrqFp8Hw==", + "dependencies": { + "auto-bind": "^4.0.0", + "random-words": "^1.1.1", + "seedrandom": "^3.0.5" + } }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "node_modules/jszip": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz", + "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" } }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "node_modules/just-debounce": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz", + "integrity": "sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" } }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } }, - "clean-css": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.4.tgz", - "integrity": "sha512-nKseG8wCzEuji/4yrgM/5cthL9oTDc5UOQyFMvW/Q53oP6gLH690o1NbuTh6Y18nujr7BxlsFuS7gXLnLzKJGg==", - "dev": true, - "requires": { - "source-map": "~0.6.0" + "node_modules/last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "dependencies": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" } }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "node_modules/lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "dependencies": { + "flush-write-stream": "^1.0.2" + }, + "engines": { + "node": ">= 0.10" } }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "engines": { + "node": ">=6" } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "requires": { - "color-name": "1.1.3" + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } }, - "colorette": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", - "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", - "dev": true + "node_modules/liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", + "dependencies": { + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">= 0.8" + } }, - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true + "node_modules/liftoff/node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true + "node_modules/load-json-file/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "engines": { + "node": ">=0.10.0" + } }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "node_modules/loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", "dev": true, - "requires": { - "safe-buffer": "5.2.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } + "engines": { + "node": ">=6.11.5" } }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "node_modules/loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", "dev": true, - "requires": { - "safe-buffer": "~5.1.1" + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" } }, - "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "dev": true + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "core-js": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, - "core-js-compat": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz", - "integrity": "sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==", + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "dev": true, - "requires": { - "browserslist": "^4.19.1", - "semver": "7.0.0" - }, "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } + "tslib": "^2.0.3" } }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dependencies": { + "sourcemap-codec": "^1.4.8" } }, - "css-loader": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", - "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", - "dev": true, - "requires": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.7", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.5" + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "node_modules/make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dependencies": { + "kind-of": "^6.0.2" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } + "tmpl": "1.0.5" } }, - "css-select": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", - "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^5.1.0", - "domhandler": "^4.3.0", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "engines": { + "node": ">=0.10.0" } }, - "css-what": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", - "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", - "dev": true + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true + "node_modules/matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", + "dependencies": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "engines": { + "node": ">= 0.10.0" + } }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" + "node_modules/matchdep/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" + "node_modules/matchdep/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "node_modules/matchdep/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, - "requires": { - "execa": "^5.0.0" + "node_modules/matchdep/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "define-lazy-prop": { + "node_modules/matchdep/node_modules/findup-sync": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" + "node_modules/matchdep/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "engines": { + "node": ">=0.10.0" } }, - "del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", - "dev": true, - "requires": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" + "node_modules/matchdep/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" + "node_modules/matchdep/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" + "node_modules/matchdep/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" + "node_modules/matchdep/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" + "node_modules/matchdep/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true, - "requires": { - "utila": "~0.4" + "engines": { + "node": ">= 0.6" } }, - "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "node_modules/memfs": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", + "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "dependencies": { + "fs-monkey": "1.0.3" + }, + "engines": { + "node": ">= 4.0.0" } }, - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", "dev": true }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "engines": { + "node": ">= 8" } }, - "dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" + "engines": { + "node": ">= 0.6" } }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } }, - "electron-to-chromium": { - "version": "1.4.89", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.89.tgz", - "integrity": "sha512-z1Axg0Fu54fse8wN4fd+GAINdU5mJmLtcl6bqIcYyzNVGONcfHAeeJi88KYMQVKalhXlYuVPzKkFIU5VD0raUw==", - "dev": true + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } }, - "enhanced-resolve": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz", - "integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true }, - "envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, - "es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "node_modules/minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", - "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, - "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "dependencies": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", "dev": true }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "node_modules/mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" + }, + "node_modules/nanoid": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "eslint": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.11.0.tgz", - "integrity": "sha512-/KRpd9mIRg2raGxHRGwW9ZywYNAClZrHjdueHcrVDuO3a6bj83eoTirCCk0M0yPwOjWYKHwRVRid+xK4F/GHgA==", + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "dev": true, - "requires": { - "@eslint/eslintrc": "^1.2.1", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-forge": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz", + "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" + }, + "node_modules/node-releases": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" } }, - "eslint-config-airbnb-base": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", - "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", - "dev": true, - "requires": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } + "once": "^1.3.2" + }, + "engines": { + "node": ">= 0.10" } }, - "eslint-module-utils": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", - "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "find-up": "^2.1.0" + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" } }, - "eslint-plugin-import": { - "version": "2.25.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz", - "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==", + "node_modules/nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", "dev": true, - "requires": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.2", - "has": "^1.0.3", - "is-core-module": "^2.8.0", - "is-glob": "^4.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.5", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.12.0" - }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "engines": { + "node": ">=0.10.0" } }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" + "node_modules/nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } }, - "espree": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", "dev": true, - "requires": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.3.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "dev": true, - "requires": { - "estraverse": "^5.1.0" + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dependencies": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.entries": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", "dev": true, - "requires": { - "estraverse": "^5.2.0" + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true + "node_modules/object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true + "node_modules/object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "dev": true }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "engines": { + "node": ">= 0.8" } }, - "express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", - "dev": true, - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.19.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.4.2", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.9.7", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", - "setprototypeof": "1.2.0", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } + "wrappy": "1" } }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastest-levenshtein": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", - "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, - "requires": { - "reusify": "^1.0.4" + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" } }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "requires": { - "websocket-driver": ">=0.5.1" + "node_modules/ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "dependencies": { + "readable-stream": "^2.0.1" } }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dependencies": { - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, - "requires": { - "to-regex-range": "^5.0.1" + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "node_modules/p-retry": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", + "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } + "@types/retry": "^0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" } }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "firebase": { - "version": "9.6.9", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-9.6.9.tgz", - "integrity": "sha512-S9OmI+vMLNE8dr8ISyAdF88t8JxSMvbSULFq2Eox0q4P3MUN5N0/68NDIhibXTp6hdLI6/hs7b50SAplTCx9NA==", - "requires": { - "@firebase/analytics": "0.7.6", - "@firebase/analytics-compat": "0.1.7", - "@firebase/app": "0.7.19", - "@firebase/app-check": "0.5.4", - "@firebase/app-check-compat": "0.2.4", - "@firebase/app-compat": "0.1.20", - "@firebase/app-types": "0.7.0", - "@firebase/auth": "0.19.10", - "@firebase/auth-compat": "0.2.10", - "@firebase/database": "0.12.6", - "@firebase/database-compat": "0.1.6", - "@firebase/firestore": "3.4.6", - "@firebase/firestore-compat": "0.1.15", - "@firebase/functions": "0.7.9", - "@firebase/functions-compat": "0.1.10", - "@firebase/installations": "0.5.6", - "@firebase/messaging": "0.9.10", - "@firebase/messaging-compat": "0.1.10", - "@firebase/performance": "0.5.6", - "@firebase/performance-compat": "0.1.6", - "@firebase/polyfill": "0.3.36", - "@firebase/remote-config": "0.3.5", - "@firebase/remote-config-compat": "0.1.6", - "@firebase/storage": "0.9.3", - "@firebase/storage-compat": "0.1.11", - "@firebase/util": "1.5.0" + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" } }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "engines": { + "node": ">= 0.10" + } }, - "follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", - "dev": true + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "engines": { + "node": ">=0.10.0" + } }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "dev": true + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "engines": { + "node": ">=0.10.0" + } }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } }, - "functional-red-black-tree": { + "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", "dev": true }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "engines": { + "node": ">=8" } }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" } }, - "graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", - "dev": true + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "engines": { + "node": ">=0.10.0" + } }, - "handle-thing": { + "node_modules/pinkie-promise": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "engines": { + "node": ">= 6" + } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true + "node_modules/plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dependencies": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + }, + "engines": { + "node": ">= 0.10" + } }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "node_modules/portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", "dev": true, - "requires": { - "has-symbols": "^1.0.2" + "dependencies": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "engines": { + "node": ">= 0.12.0" } }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" + "dependencies": { + "ms": "^2.1.1" } }, - "html-entities": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", - "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", - "dev": true - }, - "html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dev": true, - "requires": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "engines": { + "node": ">=0.10.0" } }, - "html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "node_modules/postcss": { + "version": "8.4.12", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", + "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", "dev": true, - "requires": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.1", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" } }, - "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "http-parser-js": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", - "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==" - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "http-proxy-middleware": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz", - "integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==", + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, - "requires": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/postcss-selector-parser": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", + "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" } }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "requires": {} - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } + "engines": { + "node": ">= 0.8.0" } }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" } }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "internal-slot": { + "node_modules/pretty-hrtime": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "engines": { + "node": ">= 0.8" } }, - "interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true + "node_modules/promise-polyfill": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.1.3.tgz", + "integrity": "sha512-MG5r82wBzh7pSKDRa9y+vllNHz3e3d4CNj1PQE4BQYxLme0gKYYBm9YENq+UkEikyZ0XbiGWxYlVw3Rl9O/U8g==" }, - "ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", - "dev": true + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "node_modules/protobufjs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", + "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" } }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, - "requires": { - "has-bigints": "^1.0.1" + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" } }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true, - "requires": { - "binary-extensions": "^2.0.0" + "engines": { + "node": ">= 0.10" } }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "dev": true + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } }, - "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dev": true, - "requires": { - "has": "^1.0.3" + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" } }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "node_modules/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "node_modules/random-words": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/random-words/-/random-words-1.1.2.tgz", + "integrity": "sha512-GwgC+Yu+D5/044grf2QqaYk3ZrQip7yfgvkj/6bJ3H3B3KrE7qoNPbWaYd06hrigqAkrPzNVEpRlnBaNx4bDuA==" }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, - "requires": { - "is-extglob": "^2.1.1" + "engines": { + "node": ">= 0.6" } }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "node_modules/raw-body": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } }, - "is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" + "engines": { + "node": ">= 0.8" } }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true + "node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true + "node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "dev": true + "node_modules/read-pkg/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true + "node_modules/read-pkg/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "engines": { + "node": ">=0.10.0" + } }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" } }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", "dev": true, - "requires": { - "call-bind": "^1.0.2" + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", + "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, + "node_modules/regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", + "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/regexpu-core": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", + "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==" + }, + "node_modules/regjsparser": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", + "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dependencies": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "dependencies": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-bom-stream/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/remove-bom-stream/node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", + "dependencies": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/replacestream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz", + "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==", + "dependencies": { + "escape-string-regexp": "^1.0.3", + "object-assign": "^4.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dependencies": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "dependencies": { + "value-or-function": "^3.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated" + }, + "node_modules/resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "2.58.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.58.0.tgz", + "integrity": "sha512-NOXpusKnaRpbS7ZVSzcEXqxcLDOagN6iFS8p45RkoiMqPHDLwJm758UF05KlMoCRbLBTZsPOIa887gZJ1AiXvw==", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/rollup-plugin-terser/node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/rollup-plugin-typescript2": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.30.0.tgz", + "integrity": "sha512-NUFszIQyhgDdhRS9ya/VEmsnpTe+GERDMmFo0Y+kf8ds51Xy57nPNGglJY+W6x1vcouA7Au7nsTgsLFj2I0PxQ==", + "dependencies": { + "@rollup/pluginutils": "^4.1.0", + "find-cache-dir": "^3.3.1", + "fs-extra": "8.1.0", + "resolve": "1.20.0", + "tslib": "2.1.0" + }, + "peerDependencies": { + "rollup": ">=1.26.3", + "typescript": ">=2.4.0" + } + }, + "node_modules/rollup-plugin-typescript2/node_modules/@rollup/pluginutils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.0.tgz", + "integrity": "sha512-2WUyJNRkyH5p487pGnn4tWAsxhEFKN/pT8CMgHshd5H+IXkOnKvKZwsz5ZWz+YCXkleZRAU5kwbfgF8CPfDRqA==", + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/rollup-plugin-typescript2/node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rollup-plugin-typescript2/node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/seedrandom": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "node_modules/selenium-webdriver": { + "version": "4.0.0-rc-1", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.0.0-rc-1.tgz", + "integrity": "sha512-bcrwFPRax8fifRP60p7xkWDGSJJoMkPAzufMlk5K2NyLPht/YZzR2WcIk1+3gR8VOCLlst1P2PI+MXACaFzpIw==", + "dependencies": { + "jszip": "^3.6.0", + "rimraf": "^3.0.2", + "tmp": "^0.2.1", + "ws": ">=7.4.6" + }, + "engines": { + "node": ">= 10.15.0" + } + }, + "node_modules/selfsigned": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.0.tgz", + "integrity": "sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ==", + "dev": true, + "dependencies": { + "node-forge": "^1.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", + "dependencies": { + "sver-compat": "^1.5.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/send": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "1.8.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-static": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "node_modules/set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "dependencies": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated" + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "node_modules/sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==" + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "engines": { + "node": "*" + } + }, + "node_modules/stack-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==" + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-loader": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", + "dependencies": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", + "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", + "dependencies": { + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", + "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", + "dev": true, + "dependencies": { + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1", + "terser": "^5.7.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/textextensions": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-3.3.0.tgz", + "integrity": "sha512-mk82dS8eRABNbeVJrEiN5/UMSCliINAuz8mkUwH4SwslkNP//gbEzlWNS5au0z5Dpx40SQxzqZevZkn+WYJ9Dw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/throat": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==" + }, + "node_modules/through2": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", + "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", + "dependencies": { + "readable-stream": "~1.0.17", + "xtend": "~2.1.1" + } + }, + "node_modules/through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dependencies": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "node_modules/through2-filter/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2-filter/node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/through2/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" + }, + "node_modules/to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "dependencies": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "dependencies": { + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/to-through/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/to-through/node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "node_modules/ts-jest": { + "version": "27.0.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.0.5.tgz", + "integrity": "sha512-lIJApzfTaSSbtlksfFNHkWOzLJuuSm4faFAfo5kvzOiRAuoN4/eKxVJ2zEAho8aecE04qX6K1pAzfH5QHL1/8w==", + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^27.0.0", + "json5": "2.x", + "lodash": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "20.x" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@types/jest": "^27.0.0", + "babel-jest": ">=27.0.0 <28", + "jest": "^27.0.0", + "typescript": ">=3.8 <5.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@types/jest": { + "optional": true + }, + "babel-jest": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", + "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/undertaker": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", + "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==", + "dependencies": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "fast-levenshtein": "^1.0.0", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/undertaker/node_modules/fast-levenshtein": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz", + "integrity": "sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/union-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dependencies": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated" + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dependencies": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-fs/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/vinyl-fs/node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "dependencies": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-sourcemap/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "node_modules/webpack": { + "version": "5.70.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", + "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.9.2", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz", + "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.1.1", + "@webpack-cli/info": "^1.4.1", + "@webpack-cli/serve": "^1.6.1", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz", + "integrity": "sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.1", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.4.tgz", + "integrity": "sha512-nfdsb02Zi2qzkNmgtZjkrMOcXnYZ6FLKcQwpxT7MvmHKc+oTtDsBju8j+NMyAygZ9GW1jMEUpy3itHtqgEhe1A==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.2.2", + "ansi-html-community": "^0.0.8", + "bonjour": "^3.5.0", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "default-gateway": "^6.0.3", + "del": "^6.0.0", + "express": "^4.17.1", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.0", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "portfinder": "^1.0.28", + "schema-utils": "^4.0.0", + "selfsigned": "^2.0.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "spdy": "^4.0.2", + "strip-ansi": "^7.0.0", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-fetch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "node_modules/xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dependencies": { + "object-keys": "~0.4.0" + }, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/xtend/node_modules/object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "dependencies": { + "buffer-crc32": "~0.2.3" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", + "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "requires": { + "@jridgewell/trace-mapping": "^0.3.0" + } + }, + "@babel/cli": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.15.7.tgz", + "integrity": "sha512-YW5wOprO2LzMjoWZ5ZG6jfbY9JnkDxuHDwvnrThnuYtByorova/I0HNXJedrUfwuXFQfYOjcqDA4PU3qlZGZjg==", + "requires": { + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", + "chokidar": "^3.4.0", + "commander": "^4.0.1", + "convert-source-map": "^1.1.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.0.0", + "make-dir": "^2.1.0", + "slash": "^2.0.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + } + } + }, + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/compat-data": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", + "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==" + }, + "@babel/core": { + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", + "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.7", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helpers": "^7.17.8", + "@babel/parser": "^7.17.8", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0" + } + }, + "@babel/generator": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", + "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", + "requires": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", + "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", + "requires": { + "@babel/helper-explode-assignable-expression": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", + "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", + "requires": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.17.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz", + "integrity": "sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", + "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "regexpu-core": "^5.0.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", + "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "requires": { + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", + "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", + "requires": { + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-transforms": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", + "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", + "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-wrap-function": "^7.16.8", + "@babel/types": "^7.16.8" + } + }, + "@babel/helper-replace-supers": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", + "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-simple-access": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", + "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", + "requires": { + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==" + }, + "@babel/helper-wrap-function": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", + "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", + "requires": { + "@babel/helper-function-name": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8" + } + }, + "@babel/helpers": { + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", + "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", + "requires": { + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" + } + }, + "@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", + "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==" + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", + "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", + "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.7" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", + "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", + "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.17.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", + "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.17.6", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", + "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", + "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", + "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", + "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", + "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", + "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", + "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", + "requires": { + "@babel/compat-data": "^7.17.0", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.16.7" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", + "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", + "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", + "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.10", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", + "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", + "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", + "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", + "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", + "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", + "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", + "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", + "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", + "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", + "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", + "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", + "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", + "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", + "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", + "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", + "requires": { + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", + "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", + "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", + "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", + "requires": { + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.7.tgz", + "integrity": "sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==", + "requires": { + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", + "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", + "requires": { + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", + "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", + "requires": { + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", + "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", + "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", + "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", + "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", + "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz", + "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==", + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", + "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", + "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", + "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", + "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", + "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", + "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", + "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", + "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/preset-env": { + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", + "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-async-generator-functions": "^7.16.8", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-class-static-block": "^7.16.7", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.16.7", + "@babel/plugin-proposal-json-strings": "^7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.16.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.16.7", + "@babel/plugin-transform-async-to-generator": "^7.16.8", + "@babel/plugin-transform-block-scoped-functions": "^7.16.7", + "@babel/plugin-transform-block-scoping": "^7.16.7", + "@babel/plugin-transform-classes": "^7.16.7", + "@babel/plugin-transform-computed-properties": "^7.16.7", + "@babel/plugin-transform-destructuring": "^7.16.7", + "@babel/plugin-transform-dotall-regex": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.16.7", + "@babel/plugin-transform-exponentiation-operator": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.16.7", + "@babel/plugin-transform-function-name": "^7.16.7", + "@babel/plugin-transform-literals": "^7.16.7", + "@babel/plugin-transform-member-expression-literals": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.16.7", + "@babel/plugin-transform-modules-commonjs": "^7.16.8", + "@babel/plugin-transform-modules-systemjs": "^7.16.7", + "@babel/plugin-transform-modules-umd": "^7.16.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", + "@babel/plugin-transform-new-target": "^7.16.7", + "@babel/plugin-transform-object-super": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.16.7", + "@babel/plugin-transform-property-literals": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.16.7", + "@babel/plugin-transform-reserved-words": "^7.16.7", + "@babel/plugin-transform-shorthand-properties": "^7.16.7", + "@babel/plugin-transform-spread": "^7.16.7", + "@babel/plugin-transform-sticky-regex": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.16.7", + "@babel/plugin-transform-typeof-symbol": "^7.16.7", + "@babel/plugin-transform-unicode-escapes": "^7.16.7", + "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.16.8", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.20.2", + "semver": "^6.3.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.8.tgz", + "integrity": "sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", + "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, + "@bdelab/roar-firekit": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@bdelab/roar-firekit/-/roar-firekit-0.1.3.tgz", + "integrity": "sha512-XzbPgwA6OhirUK0qu95VzbXf9cgX7dHu78aaQnMd1nZeH3lhqipERTfiw7kDaAcpAmYmA8Om2zwKoUEmGkyZ6g==", + "requires": { + "firebase": "^9.6.8", + "uuid": "^8.3.2" + } + }, + "@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", + "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.1", + "globals": "^13.9.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + } + } + }, + "@firebase/analytics": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.7.6.tgz", + "integrity": "sha512-hfN+cnWuRY5QfbeBeZOOD9xC/ePavPaAPh3Bc1u0yZLMgF3No3ME6K2dVHKWK1K0BIPzLsliojYYRYnWMF6TZw==", + "requires": { + "@firebase/component": "0.5.11", + "@firebase/installations": "0.5.6", + "@firebase/logger": "0.3.2", + "@firebase/util": "1.5.0", + "tslib": "^2.1.0" + } + }, + "@firebase/analytics-compat": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.1.7.tgz", + "integrity": "sha512-bVnv+xM2YwAouWjeo+HCN0GWu6i0sLzM2AcpmfsQuC97SNRFqIpRUYmjaeTdDALt3k1fIUzYMcZZE4xuC2qK/A==", + "requires": { + "@firebase/analytics": "0.7.6", + "@firebase/analytics-types": "0.7.0", + "@firebase/component": "0.5.11", + "@firebase/util": "1.5.0", + "tslib": "^2.1.0" + } + }, + "@firebase/analytics-types": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.7.0.tgz", + "integrity": "sha512-DNE2Waiwy5+zZnCfintkDtBfaW6MjIG883474v6Z0K1XZIvl76cLND4iv0YUb48leyF+PJK1KO2XrgHb/KpmhQ==" + }, + "@firebase/app": { + "version": "0.7.19", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.7.19.tgz", + "integrity": "sha512-Xs8s3OF4Tn7Ls833TOTAUSMDq/pDs1fDsLRprR1+B4wyxyWCYBisgDMnPx25z9wKJESOWoZTDjyBVHrn6sG92w==", + "requires": { + "@firebase/component": "0.5.11", + "@firebase/logger": "0.3.2", + "@firebase/util": "1.5.0", + "tslib": "^2.1.0" + } + }, + "@firebase/app-check": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.5.4.tgz", + "integrity": "sha512-UX6IcuapbLb8Q4zYaUq5UKbpXURY4lrK41Is2c56Q/h7i4zRiMYLKEETJZIfVATE2vKsbjxSxn02xS9g/VPftw==", + "requires": { + "@firebase/component": "0.5.11", + "@firebase/logger": "0.3.2", + "@firebase/util": "1.5.0", + "tslib": "^2.1.0" + } + }, + "@firebase/app-check-compat": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.2.4.tgz", + "integrity": "sha512-CnbjhzIdpL7671wwcWMgYDBfCxuMjjg8OITlTtP2vN8h6uBFuPosRpc2GZ/h32IA3fzwyeFplFjy/y8Gyhh6Dw==", + "requires": { + "@firebase/app-check": "0.5.4", + "@firebase/component": "0.5.11", + "@firebase/logger": "0.3.2", + "@firebase/util": "1.5.0", + "tslib": "^2.1.0" + } + }, + "@firebase/app-check-interop-types": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.1.0.tgz", + "integrity": "sha512-uZfn9s4uuRsaX5Lwx+gFP3B6YsyOKUE+Rqa6z9ojT4VSRAsZFko9FRn6OxQUA1z5t5d08fY4pf+/+Dkd5wbdbA==" + }, + "@firebase/app-compat": { + "version": "0.1.20", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.1.20.tgz", + "integrity": "sha512-s+MQQv5acNZ2Mx/TNyr+B0XaqATq14hkAL9247exIvV0RBwP28THuadPVw99kjrwkHilQtBMFJmmCm1S5ZoktQ==", + "requires": { + "@firebase/app": "0.7.19", + "@firebase/component": "0.5.11", + "@firebase/logger": "0.3.2", + "@firebase/util": "1.5.0", + "tslib": "^2.1.0" + } + }, + "@firebase/app-types": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.7.0.tgz", + "integrity": "sha512-6fbHQwDv2jp/v6bXhBw2eSRbNBpxHcd1NBF864UksSMVIqIyri9qpJB1Mn6sGZE+bnDsSQBC5j2TbMxYsJQkQg==" + }, + "@firebase/auth": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.19.10.tgz", + "integrity": "sha512-FqKHohxZriJM4S8hY0RbNwGVb+Y5INsWkWsqOaWQ9pM0hEolYruE10gKqrOHO9kauXhKbdUUGPgKHJJ9+r8eVg==", + "requires": { + "@firebase/component": "0.5.11", + "@firebase/logger": "0.3.2", + "@firebase/util": "1.5.0", + "node-fetch": "2.6.7", + "selenium-webdriver": "4.0.0-rc-1", + "tslib": "^2.1.0" + } + }, + "@firebase/auth-compat": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.2.10.tgz", + "integrity": "sha512-FYsU18N3nZq/l7gfnmH8tYOPDWSU3pPJa/JAmflfcwcDJnYLAiHRHZb0KmLV5baRMD8QdMdER5bGbzWgtOmczQ==", + "requires": { + "@firebase/auth": "0.19.10", + "@firebase/auth-types": "0.11.0", + "@firebase/component": "0.5.11", + "@firebase/util": "1.5.0", + "node-fetch": "2.6.7", + "selenium-webdriver": "^4.0.0-beta.2", + "tslib": "^2.1.0" + } + }, + "@firebase/auth-interop-types": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.6.tgz", + "integrity": "sha512-etIi92fW3CctsmR9e3sYM3Uqnoq861M0Id9mdOPF6PWIg38BXL5k4upCNBggGUpLIS0H1grMOvy/wn1xymwe2g==", + "requires": {} + }, + "@firebase/auth-types": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.11.0.tgz", + "integrity": "sha512-q7Bt6cx+ySj9elQHTsKulwk3+qDezhzRBFC9zlQ1BjgMueUOnGMcvqmU0zuKlQ4RhLSH7MNAdBV2znVaoN3Vxw==", + "requires": {} + }, + "@firebase/component": { + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.5.11.tgz", + "integrity": "sha512-amtUrJxfJhJdjR3JzXqkHIoghJJ34o8OiSDj3gq96uKL4BRkSpmPaxi0+1r8DcDQ6bQxh3kDSoge8bRCDQCvsw==", + "requires": { + "@firebase/util": "1.5.0", + "tslib": "^2.1.0" + } + }, + "@firebase/database": { + "version": "0.12.6", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.12.6.tgz", + "integrity": "sha512-vokGkgpk+4bvy1d/s0lsPP9GmC1nrAtctQwEEDH5ZO4WCYPj16Y6rKILsOjrWwJ+Ih21ORnekxSzfpKyd1KHEg==", + "requires": { + "@firebase/auth-interop-types": "0.1.6", + "@firebase/component": "0.5.11", + "@firebase/logger": "0.3.2", + "@firebase/util": "1.5.0", + "faye-websocket": "0.11.4", + "tslib": "^2.1.0" + } + }, + "@firebase/database-compat": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-0.1.6.tgz", + "integrity": "sha512-fDAJWI5ZdXPlS84NC87Et7pE6mJxF5uUoePCaQFpU56wrYVk58COomcSXtFrdX9U5/1FHjR3TaDWV5pJakv83g==", + "requires": { + "@firebase/component": "0.5.11", + "@firebase/database": "0.12.6", + "@firebase/database-types": "0.9.5", + "@firebase/logger": "0.3.2", + "@firebase/util": "1.5.0", + "tslib": "^2.1.0" + } + }, + "@firebase/database-types": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.9.5.tgz", + "integrity": "sha512-0p9BDmoZCbW5c//tl7IUn8hOIM4M6wCnLmVdbVUvD30V4hZT36phdhajf36pcMgE9suMsz4xtvWlngEy9FeHwA==", + "requires": { + "@firebase/app-types": "0.7.0", + "@firebase/util": "1.5.0" + } + }, + "@firebase/firestore": { + "version": "3.4.6", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-3.4.6.tgz", + "integrity": "sha512-HVyrg1LAVePvut+qf856mCSdZbVL9dhnK1skZ6LY2KquS71RW0v7/iu+/Wn00kPHbZSmHGvYzHD6JOf+kjjbuQ==", + "requires": { + "@firebase/component": "0.5.11", + "@firebase/logger": "0.3.2", + "@firebase/util": "1.5.0", + "@firebase/webchannel-wrapper": "0.6.1", + "@grpc/grpc-js": "^1.3.2", + "@grpc/proto-loader": "^0.6.0", + "node-fetch": "2.6.7", + "tslib": "^2.1.0" + } + }, + "@firebase/firestore-compat": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.1.15.tgz", + "integrity": "sha512-bk0f2JbdgJc0P0eHnQBrqRF7xgMiSh6qyYqDTUh08/5kwdJed1SlmvF/3BSDhQHABcji99YhgR3E1ms6uoZwdg==", + "requires": { + "@firebase/component": "0.5.11", + "@firebase/firestore": "3.4.6", + "@firebase/firestore-types": "2.5.0", + "@firebase/util": "1.5.0", + "tslib": "^2.1.0" + } + }, + "@firebase/firestore-types": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-2.5.0.tgz", + "integrity": "sha512-I6c2m1zUhZ5SH0cWPmINabDyH5w0PPFHk2UHsjBpKdZllzJZ2TwTkXbDtpHUZNmnc/zAa0WNMNMvcvbb/xJLKA==", + "requires": {} + }, + "@firebase/functions": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.7.9.tgz", + "integrity": "sha512-C8FpECq2tSOXnWT+npw/qDihxWvs6vT0NdsOEV0artNKphf0tzUleo8NgklyqSmwnAy0v35YGTNdVvxCWt5N8A==", + "requires": { + "@firebase/app-check-interop-types": "0.1.0", + "@firebase/auth-interop-types": "0.1.6", + "@firebase/component": "0.5.11", + "@firebase/messaging-interop-types": "0.1.0", + "@firebase/util": "1.5.0", + "node-fetch": "2.6.7", + "tslib": "^2.1.0" + } + }, + "@firebase/functions-compat": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.1.10.tgz", + "integrity": "sha512-Iqq1335rnhed+6WcOGUr+C8PzBAUwGnrQCKmo0YkyiLrO7UwRhIEeS/su4cthp4KNTsT5bdZWzEh9I4ZJ00bjw==", + "requires": { + "@firebase/component": "0.5.11", + "@firebase/functions": "0.7.9", + "@firebase/functions-types": "0.5.0", + "@firebase/util": "1.5.0", + "tslib": "^2.1.0" + } + }, + "@firebase/functions-types": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.5.0.tgz", + "integrity": "sha512-qza0M5EwX+Ocrl1cYI14zoipUX4gI/Shwqv0C1nB864INAD42Dgv4v94BCyxGHBg2kzlWy8PNafdP7zPO8aJQA==" + }, + "@firebase/installations": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.5.6.tgz", + "integrity": "sha512-e/sDDungY/haSw9H+DmknZkf6M8Q3O9CLUHoVldqX96lvOpT8le6YndJOgK6fTHiRs0ro3amg+4ef2mn40NqzQ==", + "requires": { + "@firebase/component": "0.5.11", + "@firebase/util": "1.5.0", + "tslib": "^2.1.0" + } + }, + "@firebase/logger": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.3.2.tgz", + "integrity": "sha512-lzLrcJp9QBWpo40OcOM9B8QEtBw2Fk1zOZQdvv+rWS6gKmhQBCEMc4SMABQfWdjsylBcDfniD1Q+fUX1dcBTXA==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@firebase/messaging": { + "version": "0.9.10", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.9.10.tgz", + "integrity": "sha512-Q59obc+hhqDxz5oJh012lI7kCKxcnNV7nMB74Hc7LGT7/oZ3abPl1rmnC0KKdaAHm37/riJgEgDW0HrUTc5REA==", + "requires": { + "@firebase/component": "0.5.11", + "@firebase/installations": "0.5.6", + "@firebase/messaging-interop-types": "0.1.0", + "@firebase/util": "1.5.0", + "tslib": "^2.1.0" + } + }, + "@firebase/messaging-compat": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.1.10.tgz", + "integrity": "sha512-RtdXnn8MWPvWm/1BKR0g0U763RcAALzqPl8zEIkjFBq9wBS7rWqbj9zZ+c4rFUVks4vleLqLv9v6M0O/FsieMg==", + "requires": { + "@firebase/component": "0.5.11", + "@firebase/messaging": "0.9.10", + "@firebase/util": "1.5.0", + "tslib": "^2.1.0" + } + }, + "@firebase/messaging-interop-types": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.1.0.tgz", + "integrity": "sha512-DbvUl/rXAZpQeKBnwz0NYY5OCqr2nFA0Bj28Fmr3NXGqR4PAkfTOHuQlVtLO1Nudo3q0HxAYLa68ZDAcuv2uKQ==" + }, + "@firebase/performance": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.5.6.tgz", + "integrity": "sha512-QfVq2Pa5PSoYLgwVyEFApb1i0mKISDzBRDC76VHx5wOSi28c31coYK0qrHjVkHlG51nnyEtBIWqXC2fFaOzr5Q==", + "requires": { + "@firebase/component": "0.5.11", + "@firebase/installations": "0.5.6", + "@firebase/logger": "0.3.2", + "@firebase/util": "1.5.0", + "tslib": "^2.1.0" + } + }, + "@firebase/performance-compat": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.1.6.tgz", + "integrity": "sha512-DHGw/u4iGZGeEj95CQooA3oOBcPBUw4+JuMSnk7qmY6iYBsYmkcUPVCFsgYNcAVtHBdU64DJX9RZbjkMmNX0uQ==", + "requires": { + "@firebase/component": "0.5.11", + "@firebase/logger": "0.3.2", + "@firebase/performance": "0.5.6", + "@firebase/performance-types": "0.1.0", + "@firebase/util": "1.5.0", + "tslib": "^2.1.0" + } + }, + "@firebase/performance-types": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.1.0.tgz", + "integrity": "sha512-6p1HxrH0mpx+622Ql6fcxFxfkYSBpE3LSuwM7iTtYU2nw91Hj6THC8Bc8z4nboIq7WvgsT/kOTYVVZzCSlXl8w==" + }, + "@firebase/polyfill": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@firebase/polyfill/-/polyfill-0.3.36.tgz", + "integrity": "sha512-zMM9oSJgY6cT2jx3Ce9LYqb0eIpDE52meIzd/oe/y70F+v9u1LDqk5kUF5mf16zovGBWMNFmgzlsh6Wj0OsFtg==", + "requires": { + "core-js": "3.6.5", + "promise-polyfill": "8.1.3", + "whatwg-fetch": "2.0.4" + } + }, + "@firebase/remote-config": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.3.5.tgz", + "integrity": "sha512-sxV8dpgQNWVPWDAVX7KtLCbkBJyox1L+RlGn/Djpj47YgeNuLOqjRZeEoydL9RO3EdzKG6EcHeqOhdpMBgeiNA==", + "requires": { + "@firebase/component": "0.5.11", + "@firebase/installations": "0.5.6", + "@firebase/logger": "0.3.2", + "@firebase/util": "1.5.0", + "tslib": "^2.1.0" + } + }, + "@firebase/remote-config-compat": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.1.6.tgz", + "integrity": "sha512-OEGADnpKIoVQF1blOTxzFBrP6LzEXR+IA7vyLwh7lL+qXpDJGvmg0Eoxb4yxZw4cQCZBGO6fcilBZkDmTDEp/w==", + "requires": { + "@firebase/component": "0.5.11", + "@firebase/logger": "0.3.2", + "@firebase/remote-config": "0.3.5", + "@firebase/remote-config-types": "0.2.0", + "@firebase/util": "1.5.0", + "tslib": "^2.1.0" + } + }, + "@firebase/remote-config-types": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.2.0.tgz", + "integrity": "sha512-hqK5sCPeZvcHQ1D6VjJZdW6EexLTXNMJfPdTwbD8NrXUw6UjWC4KWhLK/TSlL0QPsQtcKRkaaoP+9QCgKfMFPw==" + }, + "@firebase/storage": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.9.3.tgz", + "integrity": "sha512-bi1sxMGduTl/cidtIqVyPyIAHEjMrQ5cMry2s4LfJMwaztUdSjgeSZRKLo5Nqy5/CC5fPhNIU3ueLhDm9z7dsA==", + "requires": { + "@firebase/component": "0.5.11", + "@firebase/util": "1.5.0", + "node-fetch": "2.6.7", + "tslib": "^2.1.0" + } + }, + "@firebase/storage-compat": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.1.11.tgz", + "integrity": "sha512-dD0OaFKgNqtNvirOB6omXw2RJEDGnfJtus2K93cgIqkUxso0NawTA/7LyD3nMccb2L11BMh57GcdyKHL0AWoJQ==", + "requires": { + "@firebase/component": "0.5.11", + "@firebase/storage": "0.9.3", + "@firebase/storage-types": "0.6.0", + "@firebase/util": "1.5.0", + "tslib": "^2.1.0" + } + }, + "@firebase/storage-types": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.6.0.tgz", + "integrity": "sha512-1LpWhcCb1ftpkP/akhzjzeFxgVefs6eMD2QeKiJJUGH1qOiows2w5o0sKCUSQrvrRQS1lz3SFGvNR1Ck/gqxeA==", + "requires": {} + }, + "@firebase/util": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.5.0.tgz", + "integrity": "sha512-4w4OY3YJVHV/4UBZ8OcXb8BD8I83P5n2y+FW0dHhn9OLXdYDg8bvCTA08P0nszpZqBhwutKQ4OS7c530SGjeLg==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@firebase/webchannel-wrapper": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.6.1.tgz", + "integrity": "sha512-9FqhNjKQWpQ3fGnSOCovHOm+yhhiorKEqYLAfd525jWavunDJcx8rOW6i6ozAh+FbwcYMkL7b+3j4UR/30MpoQ==" + }, + "@grpc/grpc-js": { + "version": "1.5.9", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.5.9.tgz", + "integrity": "sha512-un+cXqErq5P4p3+WgYVNVh7FB51MSnaoRef7QWDcMXKR6FX2R6Z/bltcJMxNNdTUMC85lkOQcpnAAetFziPSng==", + "requires": { + "@grpc/proto-loader": "^0.6.4", + "@types/node": ">=12.12.47" + } + }, + "@grpc/proto-loader": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.9.tgz", + "integrity": "sha512-UlcCS8VbsU9d3XTXGiEVFonN7hXk+oMXZtoHHG2oSA1/GcDP1q6OUgs20PzHDGizzyi8ufGSUDlk3O2NyY7leg==", + "requires": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.10.0", + "yargs": "^16.2.0" + } + }, + "@humanwhocodes/config-array": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" + }, + "@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/core": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "requires": { + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/environment": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "requires": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + } + }, + "@jest/fake-timers": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "requires": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + } + }, + "@jest/globals": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "requires": { + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + } + }, + "@jest/reporters": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/source-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "requires": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "requires": { + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" + } + }, + "@jest/transform": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jridgewell/resolve-uri": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==" + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", + "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jspsych-contrib/plugin-rdk": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jspsych-contrib/plugin-rdk/-/plugin-rdk-1.1.0.tgz", + "integrity": "sha512-wd/3Txwt3mfs9wmC1ZRmuJzD1z3HNcAOHa77KroiaoandbcKu4JfA7ec1onT0WZwTTWTN0EpY4B96AT3/QkL3g==", + "requires": {} + }, + "@jspsych/config": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@jspsych/config/-/config-1.2.0.tgz", + "integrity": "sha512-dcwyJA00TM6yUw1GKHM4k64Zz/n4sAeJ/V+KHT4kqbVS4mw8366WdqOwkvyFmaPUQK7jglO4P91qb20Il5CnKQ==", + "requires": { + "@babel/cli": "7.15.7", + "@babel/core": "7.15.5", + "@babel/preset-env": "7.15.6", + "@rollup/plugin-babel": "5.3.0", + "@rollup/plugin-commonjs": "19.0.0", + "@rollup/plugin-json": "4.1.0", + "@rollup/plugin-node-resolve": "13.0.5", + "@types/gulp": "4.0.9", + "@types/jest": "27.0.2", + "babel-preset-minify": "0.5.1", + "canvas": "2.8.0", + "gulp": "4.0.2", + "gulp-cli": "2.3.0", + "gulp-file": "^0.4.0", + "gulp-rename": "2.0.0", + "gulp-replace": "1.1.3", + "gulp-zip": "5.1.0", + "jest": "27.2.4", + "jest-environment-jsdom": "27.2.4", + "merge-stream": "2.0.0", + "rollup": "2.58.0", + "rollup-plugin-terser": "7.0.2", + "rollup-plugin-typescript2": "0.30.0", + "ts-jest": "27.0.5", + "tslib": "2.3.1", + "typescript": "4.4.3" + }, + "dependencies": { + "@babel/core": { + "version": "7.15.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.5.tgz", + "integrity": "sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helpers": "^7.15.4", + "@babel/parser": "^7.15.5", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.4.tgz", + "integrity": "sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ==", + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + } + }, + "@babel/preset-env": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.6.tgz", + "integrity": "sha512-L+6jcGn7EWu7zqaO2uoTDjjMBW+88FXzV8KvrBl2z6MtRNxlsmUNRlZPaNNPUTgqhyC5DHNFk/2Jmra+ublZWw==", + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.15.4", + "@babel/plugin-proposal-async-generator-functions": "^7.15.4", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.15.4", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.15.6", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.15.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.15.3", + "@babel/plugin-transform-classes": "^7.15.4", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.15.4", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.15.4", + "@babel/plugin-transform-modules-systemjs": "^7.15.4", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.15.4", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.14.6", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.15.6", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.16.0", + "semver": "^6.3.0" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz", + "integrity": "sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA==", + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.4", + "semver": "^6.1.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz", + "integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.16.2" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.3.tgz", + "integrity": "sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.4" + } + } + } + }, + "@jspsych/plugin-audio-keyboard-response": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jspsych/plugin-audio-keyboard-response/-/plugin-audio-keyboard-response-1.1.0.tgz", + "integrity": "sha512-fE9qSl0gdPM5ggWL0dBGWYeZhxQTYAwyS5BhYrKE22ADEz+N9LkaDmh5dSPYzA2oDP2GK8faWMGByU34OaXr2g==", + "requires": {} + }, + "@jspsych/plugin-fullscreen": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jspsych/plugin-fullscreen/-/plugin-fullscreen-1.1.0.tgz", + "integrity": "sha512-JoAg+oxqodMNwlNznvBEVZ04fEldOKELX7JIlcqyMUxwbTxsjAetbyT1KFj8TBA4ABM6wBSgJxzGALmhbgIVwQ==", + "requires": {} + }, + "@jspsych/plugin-html-keyboard-response": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jspsych/plugin-html-keyboard-response/-/plugin-html-keyboard-response-1.1.0.tgz", + "integrity": "sha512-oyB97ntzQLbdX5Kvn2RqEmhuPKNQAaxs4i5/4M5DkVQrIuY7+pY5d1neOYdcPZqNiyd5Xih2t9NRN3DgiFq2+A==", + "requires": {} + }, + "@jspsych/plugin-image-keyboard-response": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jspsych/plugin-image-keyboard-response/-/plugin-image-keyboard-response-1.1.0.tgz", + "integrity": "sha512-HT7NqACtbW9vfdk1Uhmq3RIqRlq8widE/PdpKFAmwx40+qu2H/H1LHi2ZoN3okPCAUw9gB9L6xs0IxTI0/SGxg==", + "requires": {} + }, + "@jspsych/plugin-survey-text": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jspsych/plugin-survey-text/-/plugin-survey-text-1.1.0.tgz", + "integrity": "sha512-Oh3FIhOmPCbt2wX8LGo38Gb2DM9f0ibxEWhncE2WHqhF5RmlDHO0bxHAaRhfM7c1L9c8p8hvqFjuoFrFu8L6jw==", + "requires": {} + }, + "@jspsych/plugin-video-keyboard-response": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jspsych/plugin-video-keyboard-response/-/plugin-video-keyboard-response-1.1.0.tgz", + "integrity": "sha512-G6LYRmHIgW+GxaxcrTi2P2NCMgqDLCmNRxGw1vDJWt0qOC6ndhZ3khXK3LIZaWnc7gJav521d51CRQoMO3tDuw==", + "requires": {} + }, + "@mapbox/node-pre-gyp": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz", + "integrity": "sha512-CMGKi28CF+qlbXh26hDe6NxCd7amqeAzEqnS6IHeO6LoaKyM/n+Xw3HT1COdq8cuioOdlKdqn/hCmqPUOMOywg==", + "requires": { + "detect-libc": "^1.0.3", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.5", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@nicolo-ribaudo/chokidar-2": { + "version": "2.1.8-no-fsevents.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", + "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", + "optional": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + }, + "@rollup/plugin-babel": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz", + "integrity": "sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw==", + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + } + }, + "@rollup/plugin-commonjs": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-19.0.0.tgz", + "integrity": "sha512-adTpD6ATGbehdaQoZQ6ipDFhdjqsTgpOAhFiPwl+dzre4pPshsecptDPyEFb61JMJ1+mGljktaC4jI8ARMSNyw==", + "requires": { + "@rollup/pluginutils": "^3.1.0", + "commondir": "^1.0.1", + "estree-walker": "^2.0.1", + "glob": "^7.1.6", + "is-reference": "^1.2.1", + "magic-string": "^0.25.7", + "resolve": "^1.17.0" + } + }, + "@rollup/plugin-json": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz", + "integrity": "sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==", + "requires": { + "@rollup/pluginutils": "^3.0.8" + } + }, + "@rollup/plugin-node-resolve": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.0.5.tgz", + "integrity": "sha512-mVaw6uxtvuGx/XCI4qBQXsDZJUfyx5vp39iE0J/7Hd6wDhEbjHr6aES7Nr9yWbuE0BY+oKp6N7Bq6jX5NCGNmQ==", + "requires": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "dependencies": { + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + }, + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" + } + } + }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" + }, + "@types/babel__core": { + "version": "7.1.19", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", + "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", + "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "@types/eslint": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz", + "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + }, + "@types/expect": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", + "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==" + }, + "@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.28", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", + "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/glob-stream": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/glob-stream/-/glob-stream-6.1.1.tgz", + "integrity": "sha512-AGOUTsTdbPkRS0qDeyeS+6KypmfVpbT5j23SN8UPG63qjKXNKjXn6V9wZUr8Fin0m9l8oGYaPK8b2WUMF8xI1A==", + "requires": { + "@types/glob": "*", + "@types/node": "*" + } + }, + "@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "requires": { + "@types/node": "*" + } + }, + "@types/gulp": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/gulp/-/gulp-4.0.9.tgz", + "integrity": "sha512-zzT+wfQ8uwoXjDhRK9Zkmmk09/fbLLmN/yDHFizJiEKIve85qutOnXcP/TM2sKPBTU+Jc16vfPbOMkORMUBN7Q==", + "requires": { + "@types/undertaker": "*", + "@types/vinyl-fs": "*", + "chokidar": "^3.3.1" + } + }, + "@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true + }, + "@types/http-proxy": { + "version": "1.17.8", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", + "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.0.2.tgz", + "integrity": "sha512-4dRxkS/AFX0c5XW6IPMNOydLn2tEhNhJV7DnYK+0bjoJZ+QTmfucBlihX7aoEsh/ocYtkLC73UbnBXBXIxsULA==", + "requires": { + "jest-diff": "^27.0.0", + "pretty-format": "^27.0.0" + } + }, + "@types/json-schema": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.10.tgz", + "integrity": "sha512-BLO9bBq59vW3fxCpD4o0N4U+DXsvwvIcl+jofw0frQo/GrBFC+/jRZj1E7kgp6dvTyNmA4y6JCV5Id/r3mNP5A==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" + }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" + }, + "@types/node": { + "version": "17.0.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.22.tgz", + "integrity": "sha512-8FwbVoG4fy+ykY86XCAclKZDORttqE5/s7dyWZKLXTdv3vRy5HozBEinG5IqhvPXXzIZEcTVbuHlQEI6iuwcmw==" + }, + "@types/prettier": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.4.tgz", + "integrity": "sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "requires": { + "@types/node": "*" + } + }, + "@types/retry": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", + "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", + "dev": true + }, + "@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, + "@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" + }, + "@types/undertaker": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/undertaker/-/undertaker-1.2.7.tgz", + "integrity": "sha512-xuY7nBwo1zSRoY2aitp/HArHfTulFAKql2Fr4b4mWbBBP+F50n7Jm6nwISTTMaDk2xvl92O10TTejVF0Q9mInw==", + "requires": { + "@types/node": "*", + "@types/undertaker-registry": "*", + "async-done": "~1.3.2" + } + }, + "@types/undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha512-Z4TYuEKn9+RbNVk1Ll2SS4x1JeLHecolIbM/a8gveaHsW0Hr+RQMraZACwTO2VD7JvepgA6UO1A1VrbktQrIbQ==" + }, + "@types/vinyl": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.6.tgz", + "integrity": "sha512-ayJ0iOCDNHnKpKTgBG6Q6JOnHTj9zFta+3j2b8Ejza0e4cvRyMn0ZoLEmbPrTHe5YYRlDYPvPWVdV4cTaRyH7g==", + "requires": { + "@types/expect": "^1.20.4", + "@types/node": "*" + } + }, + "@types/vinyl-fs": { + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/@types/vinyl-fs/-/vinyl-fs-2.4.12.tgz", + "integrity": "sha512-LgBpYIWuuGsihnlF+OOWWz4ovwCYlT03gd3DuLwex50cYZLmX3yrW+sFF9ndtmh7zcZpS6Ri47PrIu+fV+sbXw==", + "requires": { + "@types/glob-stream": "*", + "@types/node": "*", + "@types/vinyl": "*" + } + }, + "@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + }, + "@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/configtest": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", + "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", + "dev": true, + "requires": {} + }, + "@webpack-cli/info": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz", + "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==", + "dev": true, + "requires": { + "envinfo": "^7.7.3" + } + }, + "@webpack-cli/serve": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", + "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", + "dev": true, + "requires": {} + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + } + } + }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "requires": {} + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "requires": { + "ansi-wrap": "^0.1.0" + } + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + } + } + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "requires": { + "buffer-equal": "^1.0.0" + } + }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" + }, + "are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=" + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-includes": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", + "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + } + }, + "array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "requires": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + } + } + }, + "array-last": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "requires": { + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + } + } + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==" + }, + "array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "requires": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "array.prototype.flat": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", + "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "requires": { + "async-done": "^1.2.2" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "auto-bind": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", + "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==" + }, + "babel-helper-evaluate-path": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.5.0.tgz", + "integrity": "sha512-mUh0UhS607bGh5wUMAQfOpt2JX2ThXMtppHRdRU1kL7ZLRWIXxoV2UIV1r2cAeeNeU1M5SB5/RSUgUxrK8yOkA==" + }, + "babel-helper-flip-expressions": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.4.3.tgz", + "integrity": "sha1-NpZzahKKwYvCUlS19AoizrPB0/0=" + }, + "babel-helper-is-nodes-equiv": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz", + "integrity": "sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ=" + }, + "babel-helper-is-void-0": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.4.3.tgz", + "integrity": "sha1-fZwBtFYee5Xb2g9u7kj1tg5nMT4=" + }, + "babel-helper-mark-eval-scopes": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.4.3.tgz", + "integrity": "sha1-0kSjvvmESHJgP/tG4izorN9VFWI=" + }, + "babel-helper-remove-or-void": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.4.3.tgz", + "integrity": "sha1-pPA7QAd6D/6I5F0HAQ3uJB/1rmA=" + }, + "babel-helper-to-multiple-sequence-expressions": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.5.0.tgz", + "integrity": "sha512-m2CvfDW4+1qfDdsrtf4dwOslQC3yhbgyBFptncp4wvtdrDHqueW7slsYv4gArie056phvQFhT2nRcGS4bnm6mA==" + }, + "babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "requires": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "babel-loader": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.4.tgz", + "integrity": "sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==", + "dev": true, + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-minify-builtins": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.5.0.tgz", + "integrity": "sha512-wpqbN7Ov5hsNwGdzuzvFcjgRlzbIeVv1gMIlICbPj0xkexnfoIDe7q+AZHMkQmAE/F9R5jkrB6TLfTegImlXag==" + }, + "babel-plugin-minify-constant-folding": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.5.0.tgz", + "integrity": "sha512-Vj97CTn/lE9hR1D+jKUeHfNy+m1baNiJ1wJvoGyOBUx7F7kJqDZxr9nCHjO/Ad+irbR3HzR6jABpSSA29QsrXQ==", + "requires": { + "babel-helper-evaluate-path": "^0.5.0" + } + }, + "babel-plugin-minify-dead-code-elimination": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.5.1.tgz", + "integrity": "sha512-x8OJOZIrRmQBcSqxBcLbMIK8uPmTvNWPXH2bh5MDCW1latEqYiRMuUkPImKcfpo59pTUB2FT7HfcgtG8ZlR5Qg==", + "requires": { + "babel-helper-evaluate-path": "^0.5.0", + "babel-helper-mark-eval-scopes": "^0.4.3", + "babel-helper-remove-or-void": "^0.4.3", + "lodash": "^4.17.11" + } + }, + "babel-plugin-minify-flip-comparisons": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.4.3.tgz", + "integrity": "sha1-AMqHDLjxO0XAOLPB68DyJyk8llo=", + "requires": { + "babel-helper-is-void-0": "^0.4.3" + } + }, + "babel-plugin-minify-guarded-expressions": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.4.4.tgz", + "integrity": "sha512-RMv0tM72YuPPfLT9QLr3ix9nwUIq+sHT6z8Iu3sLbqldzC1Dls8DPCywzUIzkTx9Zh1hWX4q/m9BPoPed9GOfA==", + "requires": { + "babel-helper-evaluate-path": "^0.5.0", + "babel-helper-flip-expressions": "^0.4.3" + } + }, + "babel-plugin-minify-infinity": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.4.3.tgz", + "integrity": "sha1-37h2obCKBldjhO8/kuZTumB7Oco=" + }, + "babel-plugin-minify-mangle-names": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.5.0.tgz", + "integrity": "sha512-3jdNv6hCAw6fsX1p2wBGPfWuK69sfOjfd3zjUXkbq8McbohWy23tpXfy5RnToYWggvqzuMOwlId1PhyHOfgnGw==", + "requires": { + "babel-helper-mark-eval-scopes": "^0.4.3" + } + }, + "babel-plugin-minify-numeric-literals": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.4.3.tgz", + "integrity": "sha1-jk/VYcefeAEob/YOjF/Z3u6TwLw=" + }, + "babel-plugin-minify-replace": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.5.0.tgz", + "integrity": "sha512-aXZiaqWDNUbyNNNpWs/8NyST+oU7QTpK7J9zFEFSA0eOmtUNMU3fczlTTTlnCxHmq/jYNFEmkkSG3DDBtW3Y4Q==" + }, + "babel-plugin-minify-simplify": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.5.1.tgz", + "integrity": "sha512-OSYDSnoCxP2cYDMk9gxNAed6uJDiDz65zgL6h8d3tm8qXIagWGMLWhqysT6DY3Vs7Fgq7YUDcjOomhVUb+xX6A==", + "requires": { + "babel-helper-evaluate-path": "^0.5.0", + "babel-helper-flip-expressions": "^0.4.3", + "babel-helper-is-nodes-equiv": "^0.0.1", + "babel-helper-to-multiple-sequence-expressions": "^0.5.0" + } + }, + "babel-plugin-minify-type-constructors": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.4.3.tgz", + "integrity": "sha1-G8bxW4f3qxCF1CszC3F2V6IVZQA=", + "requires": { + "babel-helper-is-void-0": "^0.4.3" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.1", + "semver": "^6.1.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", + "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.21.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.1" + } + }, + "babel-plugin-transform-inline-consecutive-adds": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.4.3.tgz", + "integrity": "sha1-Mj1Ho+pjqDp6w8gRro5pQfrysNE=" + }, + "babel-plugin-transform-member-expression-literals": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.9.4.tgz", + "integrity": "sha1-NwOcmgwzE6OUlfqsL/OmtbnQOL8=" + }, + "babel-plugin-transform-merge-sibling-variables": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.9.4.tgz", + "integrity": "sha1-hbQi/DN3tEnJ0c3kQIcgNTJAHa4=" + }, + "babel-plugin-transform-minify-booleans": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.9.4.tgz", + "integrity": "sha1-rLs+VqNVXdI5KOS1gtKFFi3SsZg=" + }, + "babel-plugin-transform-property-literals": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.9.4.tgz", + "integrity": "sha1-mMHSHiVXNlc/k+zlRFn2ziSYXTk=", + "requires": { + "esutils": "^2.0.2" + } + }, + "babel-plugin-transform-regexp-constructors": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.4.3.tgz", + "integrity": "sha1-WLd3W2OvzzMyj66aX4j71PsLSWU=" + }, + "babel-plugin-transform-remove-console": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz", + "integrity": "sha1-uYA2DAZzhOJLNXpYjYB9PINSd4A=" + }, + "babel-plugin-transform-remove-debugger": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.9.4.tgz", + "integrity": "sha1-QrcnYxyXl44estGZp67IShgznvI=" + }, + "babel-plugin-transform-remove-undefined": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.5.0.tgz", + "integrity": "sha512-+M7fJYFaEE/M9CXa0/IRkDbiV3wRELzA1kKQFCJ4ifhrzLKn/9VCCgj9OFmYWwBd8IB48YdgPkHYtbYq+4vtHQ==", + "requires": { + "babel-helper-evaluate-path": "^0.5.0" + } + }, + "babel-plugin-transform-simplify-comparison-operators": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.9.4.tgz", + "integrity": "sha1-9ir+CWyrDh9ootdT/fKDiIRxzrk=" + }, + "babel-plugin-transform-undefined-to-void": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.9.4.tgz", + "integrity": "sha1-viQcqBQEAwZ4t0hxcyK4nQyP4oA=" + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "requires": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "babel-preset-minify": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.5.1.tgz", + "integrity": "sha512-1IajDumYOAPYImkHbrKeiN5AKKP9iOmRoO2IPbIuVp0j2iuCcj0n7P260z38siKMZZ+85d3mJZdtW8IgOv+Tzg==", + "requires": { + "babel-plugin-minify-builtins": "^0.5.0", + "babel-plugin-minify-constant-folding": "^0.5.0", + "babel-plugin-minify-dead-code-elimination": "^0.5.1", + "babel-plugin-minify-flip-comparisons": "^0.4.3", + "babel-plugin-minify-guarded-expressions": "^0.4.4", + "babel-plugin-minify-infinity": "^0.4.3", + "babel-plugin-minify-mangle-names": "^0.5.0", + "babel-plugin-minify-numeric-literals": "^0.4.3", + "babel-plugin-minify-replace": "^0.5.0", + "babel-plugin-minify-simplify": "^0.5.1", + "babel-plugin-minify-type-constructors": "^0.4.3", + "babel-plugin-transform-inline-consecutive-adds": "^0.4.3", + "babel-plugin-transform-member-expression-literals": "^6.9.4", + "babel-plugin-transform-merge-sibling-variables": "^6.9.4", + "babel-plugin-transform-minify-booleans": "^6.9.4", + "babel-plugin-transform-property-literals": "^6.9.4", + "babel-plugin-transform-regexp-constructors": "^0.4.3", + "babel-plugin-transform-remove-console": "^6.9.4", + "babel-plugin-transform-remove-debugger": "^6.9.4", + "babel-plugin-transform-remove-undefined": "^0.5.0", + "babel-plugin-transform-simplify-comparison-operators": "^6.9.4", + "babel-plugin-transform-undefined-to-void": "^6.9.4", + "lodash": "^4.17.11" + } + }, + "bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "requires": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "binaryextensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.3.0.tgz", + "integrity": "sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==" + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, + "browserslist": { + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", + "requires": { + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", + "escalade": "^3.1.1", + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" + } + }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=" + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "builtin-modules": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "caniuse-lite": { + "version": "1.0.30001319", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001319.tgz", + "integrity": "sha512-xjlIAFHucBRSMUo1kb5D4LYgcN1M45qdKP++lhqowDpwJwGkpIRTt5qQqnhxjj1vHcI7nrJxWhCC1ATrCEBTcw==" + }, + "canvas": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.8.0.tgz", + "integrity": "sha512-gLTi17X8WY9Cf5GZ2Yns8T5lfBOcGgFehDFb+JQwDqdOoBOcECS9ZWMEAqMSVcMYwXD659J8NyzjRY/2aE+C2Q==", + "requires": { + "@mapbox/node-pre-gyp": "^1.0.0", + "nan": "^2.14.0", + "simple-get": "^3.0.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "ci-info": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", + "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==" + }, + "cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "clean-css": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.4.tgz", + "integrity": "sha512-nKseG8wCzEuji/4yrgM/5cthL9oTDc5UOQyFMvW/Q53oP6gLH690o1NbuTh6Y18nujr7BxlsFuS7gXLnLzKJGg==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=" + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" + }, + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" + }, + "collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "requires": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, + "colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "requires": { + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "copy-props": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz", + "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==", + "requires": { + "each-props": "^1.3.2", + "is-plain-object": "^5.0.0" + }, + "dependencies": { + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + } + } + }, + "core-js": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" + }, + "core-js-compat": { + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz", + "integrity": "sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==", + "requires": { + "browserslist": "^4.19.1", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + } + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "css-loader": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", + "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", + "dev": true, + "requires": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.7", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "css-select": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", + "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^5.1.0", + "domhandler": "^4.3.0", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + } + } + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "dependencies": { + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "requires": { + "punycode": "^2.1.1" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + } + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "requires": { + "mimic-response": "^2.0.0" + } + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "requires": { + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "requires": { + "execa": "^5.0.0" + } + }, + "default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=" + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "dev": true, + "requires": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==" + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==" + } + } + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "requires": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.89", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.89.tgz", + "integrity": "sha512-z1Axg0Fu54fse8wN4fd+GAINdU5mJmLtcl6bqIcYyzNVGONcfHAeeJi88KYMQVKalhXlYuVPzKkFIU5VD0raUw==" + }, + "emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz", + "integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.59", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.59.tgz", + "integrity": "sha512-cOgyhW0tIJyQY1Kfw6Kr0viu9ZlUctVchRMZ7R0HiH3dxTSp5zJDLecwxUqPUrGKMsgBI1wd1FL+d9Jxfi4cLw==", + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "eslint": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.11.0.tgz", + "integrity": "sha512-/KRpd9mIRg2raGxHRGwW9ZywYNAClZrHjdueHcrVDuO3a6bj83eoTirCCk0M0yPwOjWYKHwRVRid+xK4F/GHgA==", + "dev": true, + "requires": { + "@eslint/eslintrc": "^1.2.1", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-module-utils": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", + "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "find-up": "^2.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "eslint-plugin-import": { + "version": "2.25.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz", + "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==", + "dev": true, + "requires": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.2", + "has": "^1.0.3", + "is-core-module": "^2.8.0", + "is-glob": "^4.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.5", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.12.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "espree": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", + "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", + "dev": true, + "requires": { + "acorn": "^8.7.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.3.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "requires": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + } + }, + "express": { + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "dev": true, + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.19.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.9.7", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "ext": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", + "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", + "requires": { + "type": "^2.5.0" + }, + "dependencies": { + "type": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.6.0.tgz", + "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + } + } + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "requires": { + "bser": "2.1.1" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "firebase": { + "version": "9.6.9", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-9.6.9.tgz", + "integrity": "sha512-S9OmI+vMLNE8dr8ISyAdF88t8JxSMvbSULFq2Eox0q4P3MUN5N0/68NDIhibXTp6hdLI6/hs7b50SAplTCx9NA==", + "requires": { + "@firebase/analytics": "0.7.6", + "@firebase/analytics-compat": "0.1.7", + "@firebase/app": "0.7.19", + "@firebase/app-check": "0.5.4", + "@firebase/app-check-compat": "0.2.4", + "@firebase/app-compat": "0.1.20", + "@firebase/app-types": "0.7.0", + "@firebase/auth": "0.19.10", + "@firebase/auth-compat": "0.2.10", + "@firebase/database": "0.12.6", + "@firebase/database-compat": "0.1.6", + "@firebase/firestore": "3.4.6", + "@firebase/firestore-compat": "0.1.15", + "@firebase/functions": "0.7.9", + "@firebase/functions-compat": "0.1.10", + "@firebase/installations": "0.5.6", + "@firebase/messaging": "0.9.10", + "@firebase/messaging-compat": "0.1.10", + "@firebase/performance": "0.5.6", + "@firebase/performance-compat": "0.1.6", + "@firebase/polyfill": "0.3.36", + "@firebase/remote-config": "0.3.5", + "@firebase/remote-config-compat": "0.1.6", + "@firebase/storage": "0.9.3", + "@firebase/storage-compat": "0.1.11", + "@firebase/util": "1.5.0" + } + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==" + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "requires": { + "for-in": "^1.0.1" + } + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "requires": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + } + } + }, + "fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true + }, + "fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + } + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "requires": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + }, + "dependencies": { + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "glob-watcher": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz", + "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==", + "requires": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "normalize-path": "^3.0.0", + "object.defaults": "^1.1.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "requires": { + "sparkles": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + }, + "gulp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", + "requires": { + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" + } + }, + "gulp-cli": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz", + "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", + "requires": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.4.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.2.0", + "yargs": "^7.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" + }, + "yargs": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz", + "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==", + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.1" + } + }, + "yargs-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", + "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", + "requires": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + } + } + }, + "gulp-file": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/gulp-file/-/gulp-file-0.4.0.tgz", + "integrity": "sha1-RRNWoqxQicbbkaBEQlKgVDZXAGs=", + "requires": { + "through2": "^0.4.1", + "vinyl": "^2.1.0" + } + }, + "gulp-rename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-2.0.0.tgz", + "integrity": "sha512-97Vba4KBzbYmR5VBs9mWmK+HwIf5mj+/zioxfZhOKeXtx5ZjBk57KFlePf5nxq9QsTtFl0ejnHE3zTC9MHXqyQ==" + }, + "gulp-replace": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-1.1.3.tgz", + "integrity": "sha512-HcPHpWY4XdF8zxYkDODHnG2+7a3nD/Y8Mfu3aBgMiCFDW3X2GiOKXllsAmILcxe3KZT2BXoN18WrpEFm48KfLQ==", + "requires": { + "@types/node": "^14.14.41", + "@types/vinyl": "^2.0.4", + "istextorbinary": "^3.0.0", + "replacestream": "^4.0.3", + "yargs-parser": ">=5.0.0-security.0" + }, + "dependencies": { + "@types/node": { + "version": "14.18.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", + "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==" + } + } + }, + "gulp-zip": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/gulp-zip/-/gulp-zip-5.1.0.tgz", + "integrity": "sha512-XZr/y91IliK/SpR74g3TkZejGkGEmK7CSDjSghT1jXshgO+dFvpLIz9w9fpuwkew6i7k4F+G24TubNgq1ISzEw==", + "requires": { + "get-stream": "^5.2.0", + "plugin-error": "^1.0.1", + "through2": "^3.0.1", + "vinyl": "^2.1.0", + "yazl": "^2.5.1" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "requires": { + "glogg": "^1.0.0" + } + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "html-entities": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", + "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "requires": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + } + }, + "html-webpack-plugin": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "dev": true, + "requires": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + } + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + } + }, + "http-parser-js": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", + "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==" + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "http-proxy-middleware": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz", + "integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==", + "dev": true, + "requires": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "requires": {} + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "dev": true + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, + "is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" + }, + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=" + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, + "is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "requires": { + "@types/estree": "*" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=" + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==" + }, + "istanbul-lib-instrument": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", + "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "istanbul-reports": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", + "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "istextorbinary": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-3.3.0.tgz", + "integrity": "sha512-Tvq1W6NAcZeJ8op+Hq7tdZ434rqnMx4CCZ7H0ff83uEloDvVbqAwaMTZcafKGJT0VHkYzuXUiCY4hlXQg6WfoQ==", + "requires": { + "binaryextensions": "^2.2.0", + "textextensions": "^3.2.0" + } + }, + "jest": { + "version": "27.2.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.2.4.tgz", + "integrity": "sha512-h4uqb1EQLfPulWyUFFWv9e9Nn8sCqsJ/j3wk/KCY0p4s4s0ICCfP3iMf6hRf5hEhsDyvyrCgKiZXma63gMz16A==", + "requires": { + "@jest/core": "^27.2.4", + "import-local": "^3.0.2", + "jest-cli": "^27.2.4" + } + }, + "jest-changed-files": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "requires": { + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + } + }, + "jest-circus": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "requires": { + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-cli": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "requires": { + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-config": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "requires": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "requires": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-docblock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "requires": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-environment-jsdom": { + "version": "27.2.4", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.2.4.tgz", + "integrity": "sha512-X70pTXFSypD7AIzKT1mLnDi5hP9w9mdTRcOGOmoDoBrNyNEg4rYm6d4LQWFLc9ps1VnMuDOkFSG0wjSNYGjkng==", + "requires": { + "@jest/environment": "^27.2.4", + "@jest/fake-timers": "^27.2.4", + "@jest/types": "^27.2.4", + "@types/node": "*", + "jest-mock": "^27.2.4", + "jest-util": "^27.2.4", + "jsdom": "^16.6.0" + } + }, + "jest-environment-node": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "requires": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + } + }, + "jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==" + }, + "jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "requires": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + } + }, + "jest-jasmine2": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "requires": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-leak-detector": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "requires": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + } + }, + "jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*" + } + }, + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "requires": {} + }, + "jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==" + }, + "jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "requires": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "requires": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + } + }, + "jest-runner": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "requires": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "requires": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-runtime": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "requires": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + } + }, + "jest-snapshot": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "requires": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "requires": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, + "jest-watcher": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", "requires": { - "is-docker": "^2.0.0" + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, "jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, "requires": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -13039,14 +25783,12 @@ "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -13056,8 +25798,7 @@ "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { "version": "4.1.0", @@ -13068,11 +25809,75 @@ "argparse": "^2.0.1" } }, + "jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "requires": { + "punycode": "^2.1.1" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + }, + "ws": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", + "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", + "requires": {} + } + } + }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, "json-parse-better-errors": { "version": "1.0.2", @@ -13080,6 +25885,11 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -13089,14 +25899,20 @@ "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" }, "json5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } }, "jspsych": { "version": "7.2.1", @@ -13119,11 +25935,58 @@ "set-immediate-shim": "~1.0.1" } }, + "just-debounce": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz", + "integrity": "sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==" + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, + "last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "requires": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + } + }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "requires": { + "readable-stream": "^2.0.5" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "requires": { + "flush-write-stream": "^1.0.2" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" }, "levn": { "version": "0.4.1", @@ -13143,6 +26006,71 @@ "immediate": "~3.0.5" } }, + "liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", + "requires": { + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + }, + "dependencies": { + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + } + } + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, "loader-runner": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", @@ -13164,7 +26092,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, "requires": { "p-locate": "^4.1.0" } @@ -13172,8 +26099,7 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "lodash.camelcase": { "version": "4.3.0", @@ -13183,8 +26109,7 @@ "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", - "dev": true + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" }, "lodash.merge": { "version": "4.6.2", @@ -13210,20 +26135,192 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "requires": { "yallist": "^4.0.0" } }, + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, "requires": { "semver": "^6.0.0" } }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "requires": { + "tmpl": "1.0.5" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", + "requires": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -13248,8 +26345,7 @@ "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "merge2": { "version": "1.4.1", @@ -13267,7 +26363,6 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, "requires": { "braces": "^3.0.1", "picomatch": "^2.2.3" @@ -13282,14 +26377,12 @@ "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "requires": { "mime-db": "1.52.0" } @@ -13297,8 +26390,12 @@ "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" }, "minimalistic-assert": { "version": "1.0.1", @@ -13311,14 +26408,40 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" } }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + } }, "mkdirp": { "version": "0.5.6", @@ -13332,8 +26455,7 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multicast-dns": { "version": "6.2.3", @@ -13351,17 +26473,44 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", "dev": true }, + "mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==" + }, + "nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" + }, "nanoid": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", "dev": true }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" }, "negotiator": { "version": "0.6.3", @@ -13375,6 +26524,11 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, "no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -13399,27 +26553,74 @@ "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==", "dev": true }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" + }, "node-releases": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", - "dev": true + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "requires": { + "once": "^1.3.2" + } }, "npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, "requires": { "path-key": "^3.0.0" } }, + "npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, "nth-check": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", @@ -13429,6 +26630,82 @@ "boolbase": "^1.0.0" } }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "object-inspect": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", @@ -13448,14 +26725,20 @@ "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } }, "object.assign": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", @@ -13463,6 +26746,17 @@ "object-keys": "^1.1.1" } }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, "object.entries": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", @@ -13474,6 +26768,32 @@ "es-abstract": "^1.19.1" } }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, "object.values": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", @@ -13518,7 +26838,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, "requires": { "mimic-fn": "^2.1.0" } @@ -13548,11 +26867,26 @@ "word-wrap": "^1.2.3" } }, + "ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "requires": { + "readable-stream": "^2.0.1" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, "requires": { "p-try": "^2.0.0" } @@ -13561,7 +26895,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, "requires": { "p-limit": "^2.2.0" } @@ -13588,8 +26921,7 @@ "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "pako": { "version": "1.0.11", @@ -13615,6 +26947,42 @@ "callsites": "^3.0.0" } }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==" + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -13631,11 +26999,20 @@ "tslib": "^2.0.3" } }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" }, "path-is-absolute": { "version": "1.0.1", @@ -13645,14 +27022,25 @@ "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=" }, "path-to-regexp": { "version": "0.1.7", @@ -13669,24 +27057,55 @@ "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==" }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, "requires": { "find-up": "^4.0.0" } }, + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "requires": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + } + }, "portfinder": { "version": "1.0.28", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", @@ -13709,6 +27128,11 @@ } } }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, "postcss": { "version": "8.4.12", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", @@ -13788,6 +27212,28 @@ "renderkid": "^3.0.0" } }, + "pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + } + } + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -13798,6 +27244,15 @@ "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.1.3.tgz", "integrity": "sha512-MG5r82wBzh7pSKDRa9y+vllNHz3e3d4CNj1PQE4BQYxLme0gKYYBm9YENq+UkEikyZ0XbiGWxYlVw3Rl9O/U8g==" }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, "protobufjs": { "version": "6.11.2", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", @@ -13836,11 +27291,34 @@ } } }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "qs": { "version": "6.9.7", @@ -13863,7 +27341,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, "requires": { "safe-buffer": "^5.1.0" } @@ -13894,6 +27371,66 @@ } } }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -13912,7 +27449,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "requires": { "picomatch": "^2.2.1" } @@ -13929,14 +27465,12 @@ "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "regenerate-unicode-properties": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", - "dev": true, "requires": { "regenerate": "^1.4.2" } @@ -13950,11 +27484,19 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", - "dev": true, "requires": { "@babel/runtime": "^7.8.4" } }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, "regexp.prototype.flags": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", @@ -13975,7 +27517,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", - "dev": true, "requires": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.0.1", @@ -13988,14 +27529,12 @@ "regjsgen": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", - "dev": true + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==" }, "regjsparser": { "version": "0.8.4", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", - "dev": true, "requires": { "jsesc": "~0.5.0" }, @@ -14003,8 +27542,7 @@ "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" } } }, @@ -14014,17 +27552,92 @@ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", "dev": true }, + "remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "requires": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + } + }, + "remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "requires": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, "renderkid": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", "dev": true, "requires": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==" + }, + "replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", + "requires": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + } + }, + "replacestream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz", + "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==", + "requires": { + "escape-string-regexp": "^1.0.3", + "object-assign": "^4.0.1", + "readable-stream": "^2.0.2" } }, "require-directory": { @@ -14038,6 +27651,11 @@ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -14048,7 +27666,6 @@ "version": "1.22.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, "requires": { "is-core-module": "^2.8.1", "path-parse": "^1.0.7", @@ -14059,16 +27676,46 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, "requires": { "resolve-from": "^5.0.0" } }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + }, + "resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "requires": { + "value-or-function": "^3.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==" + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, "retry": { "version": "0.13.1", @@ -14090,6 +27737,95 @@ "glob": "^7.1.3" } }, + "rollup": { + "version": "2.58.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.58.0.tgz", + "integrity": "sha512-NOXpusKnaRpbS7ZVSzcEXqxcLDOagN6iFS8p45RkoiMqPHDLwJm758UF05KlMoCRbLBTZsPOIa887gZJ1AiXvw==", + "requires": { + "fsevents": "~2.3.2" + } + }, + "rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "rollup-plugin-typescript2": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.30.0.tgz", + "integrity": "sha512-NUFszIQyhgDdhRS9ya/VEmsnpTe+GERDMmFo0Y+kf8ds51Xy57nPNGglJY+W6x1vcouA7Au7nsTgsLFj2I0PxQ==", + "requires": { + "@rollup/pluginutils": "^4.1.0", + "find-cache-dir": "^3.3.1", + "fs-extra": "8.1.0", + "resolve": "1.20.0", + "tslib": "2.1.0" + }, + "dependencies": { + "@rollup/pluginutils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.0.tgz", + "integrity": "sha512-2WUyJNRkyH5p487pGnn4tWAsxhEFKN/pT8CMgHshd5H+IXkOnKvKZwsz5ZWz+YCXkleZRAU5kwbfgF8CPfDRqA==", + "requires": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + } + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + } + } + }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -14104,11 +27840,26 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "requires": { + "xmlchars": "^2.2.0" + } }, "schema-utils": { "version": "2.7.1", @@ -14155,8 +27906,15 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", + "requires": { + "sver-compat": "^1.5.0" + } }, "send": { "version": "0.17.2", @@ -14281,11 +28039,42 @@ "send": "0.17.2" } }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, "set-immediate-shim": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + } + } + }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -14305,7 +28094,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "requires": { "shebang-regex": "^3.0.0" } @@ -14313,8 +28101,7 @@ "shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, "side-channel": { "version": "1.0.4", @@ -14330,14 +28117,172 @@ "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" + }, + "simple-get": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "requires": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } }, "sockjs": { "version": "0.3.24", @@ -14353,8 +28298,7 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, "source-map-js": { "version": "1.0.2", @@ -14362,11 +28306,22 @@ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, "source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -14375,11 +28330,53 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==" + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==" + }, "spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", @@ -14420,12 +28417,125 @@ } } }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + }, + "stack-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + } + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, + "stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==" + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -14434,6 +28544,15 @@ "safe-buffer": "~5.1.0" } }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -14481,14 +28600,12 @@ "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, "style-loader": { "version": "3.3.1", @@ -14501,16 +28618,52 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "requires": { "has-flag": "^3.0.0" } }, + "supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", + "requires": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, "tapable": { "version": "2.2.1", @@ -14518,11 +28671,39 @@ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, "terser": { "version": "5.12.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", - "dev": true, "requires": { "acorn": "^8.5.0", "commander": "^2.20.0", @@ -14533,14 +28714,12 @@ "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "source-map": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" } } }, @@ -14576,18 +28755,100 @@ } } }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "textextensions": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-3.3.0.tgz", + "integrity": "sha512-mk82dS8eRABNbeVJrEiN5/UMSCliINAuz8mkUwH4SwslkNP//gbEzlWNS5au0z5Dpx40SQxzqZevZkn+WYJ9Dw==" + }, + "throat": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==" + }, + "through2": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", + "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", + "requires": { + "readable-stream": "~1.0.17", + "xtend": "~2.1.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + } + } + }, "thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" + }, "tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -14596,32 +28857,132 @@ "rimraf": "^3.0.0" } }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" + }, + "to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "requires": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + } + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "requires": { "is-number": "^7.0.0" } }, + "to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "requires": { + "through2": "^2.0.3" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + } + } + }, "toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true }, + "tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + } + }, "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" }, + "ts-jest": { + "version": "27.0.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.0.5.tgz", + "integrity": "sha512-lIJApzfTaSSbtlksfFNHkWOzLJuuSm4faFAfo5kvzOiRAuoN4/eKxVJ2zEAho8aecE04qX6K1pAzfH5QHL1/8w==", + "requires": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^27.0.0", + "json5": "2.x", + "lodash": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "20.x" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, "tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -14650,6 +29011,11 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -14659,6 +29025,11 @@ "prelude-ls": "^1.2.1" } }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -14675,6 +29046,24 @@ "mime-types": "~2.1.24" } }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", + "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==" + }, "unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", @@ -14687,17 +29076,49 @@ "which-boxed-primitive": "^1.0.2" } }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" + }, + "undertaker": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", + "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==", + "requires": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "fast-levenshtein": "^1.0.0", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + }, + "dependencies": { + "fast-levenshtein": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz", + "integrity": "sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=" + } + } + }, + "undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=" + }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" }, "unicode-match-property-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, "requires": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -14706,14 +29127,44 @@ "unicode-match-property-value-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", - "dev": true + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==" }, "unicode-property-aliases-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", - "dev": true + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==" + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + } + } + }, + "unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "requires": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, "unpipe": { "version": "1.0.0", @@ -14721,6 +29172,47 @@ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -14730,6 +29222,16 @@ "punycode": "^2.1.0" } }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -14758,12 +29260,152 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, + "v8-to-istanbul": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, + "v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, + "vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + }, + "vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "requires": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + } + } + }, + "vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "requires": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "requires": { + "makeerror": "1.0.12" + } + }, "watchpack": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", @@ -15040,11 +29682,24 @@ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "requires": { + "iconv-lite": "0.4.24" + } + }, "whatwg-fetch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + }, "whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -15058,7 +29713,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "requires": { "isexe": "^2.0.0" } @@ -15076,6 +29730,19 @@ "is-symbol": "^1.0.3" } }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, "wildcard": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", @@ -15085,8 +29752,7 @@ "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, "wrap-ansi": { "version": "7.0.0", @@ -15126,12 +29792,48 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, "ws": { "version": "8.5.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", "requires": {} }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "requires": { + "object-keys": "~0.4.0" + }, + "dependencies": { + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" + } + } + }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -15140,8 +29842,7 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yargs": { "version": "16.2.0", @@ -15161,6 +29862,14 @@ "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" + }, + "yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "requires": { + "buffer-crc32": "~0.2.3" + } } } } diff --git a/package.json b/package.json index 9c8c674..a920295 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "dependencies": { "@bdelab/roar-firekit": "^0.1.3", "@jspsych-contrib/plugin-rdk": "^1.1.0", + "@jspsych/config": "^1.2.0", "@jspsych/plugin-audio-keyboard-response": "^1.1.0", "@jspsych/plugin-fullscreen": "^1.1.0", "@jspsych/plugin-html-keyboard-response": "^1.1.0", diff --git a/regeneratorRuntime.bundle.js b/regeneratorRuntime.bundle.js deleted file mode 100644 index 04d6d51..0000000 --- a/regeneratorRuntime.bundle.js +++ /dev/null @@ -1,803 +0,0 @@ -/******/ (() => { // webpackBootstrap -/******/ var __webpack_modules__ = ({ - -/***/ "./node_modules/regenerator-runtime/runtime.js": -/*!*****************************************************!*\ - !*** ./node_modules/regenerator-runtime/runtime.js ***! - \*****************************************************/ -/***/ ((module) => { - -/** - * Copyright (c) 2014-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -var runtime = (function (exports) { - "use strict"; - - var Op = Object.prototype; - var hasOwn = Op.hasOwnProperty; - var undefined; // More compressible than void 0. - var $Symbol = typeof Symbol === "function" ? Symbol : {}; - var iteratorSymbol = $Symbol.iterator || "@@iterator"; - var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator"; - var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; - - function define(obj, key, value) { - Object.defineProperty(obj, key, { - value: value, - enumerable: true, - configurable: true, - writable: true - }); - return obj[key]; - } - try { - // IE 8 has a broken Object.defineProperty that only works on DOM objects. - define({}, ""); - } catch (err) { - define = function(obj, key, value) { - return obj[key] = value; - }; - } - - function wrap(innerFn, outerFn, self, tryLocsList) { - // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator. - var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator; - var generator = Object.create(protoGenerator.prototype); - var context = new Context(tryLocsList || []); - - // The ._invoke method unifies the implementations of the .next, - // .throw, and .return methods. - generator._invoke = makeInvokeMethod(innerFn, self, context); - - return generator; - } - exports.wrap = wrap; - - // Try/catch helper to minimize deoptimizations. Returns a completion - // record like context.tryEntries[i].completion. This interface could - // have been (and was previously) designed to take a closure to be - // invoked without arguments, but in all the cases we care about we - // already have an existing method we want to call, so there's no need - // to create a new function object. We can even get away with assuming - // the method takes exactly one argument, since that happens to be true - // in every case, so we don't have to touch the arguments object. The - // only additional allocation required is the completion record, which - // has a stable shape and so hopefully should be cheap to allocate. - function tryCatch(fn, obj, arg) { - try { - return { type: "normal", arg: fn.call(obj, arg) }; - } catch (err) { - return { type: "throw", arg: err }; - } - } - - var GenStateSuspendedStart = "suspendedStart"; - var GenStateSuspendedYield = "suspendedYield"; - var GenStateExecuting = "executing"; - var GenStateCompleted = "completed"; - - // Returning this object from the innerFn has the same effect as - // breaking out of the dispatch switch statement. - var ContinueSentinel = {}; - - // Dummy constructor functions that we use as the .constructor and - // .constructor.prototype properties for functions that return Generator - // objects. For full spec compliance, you may wish to configure your - // minifier not to mangle the names of these two functions. - function Generator() {} - function GeneratorFunction() {} - function GeneratorFunctionPrototype() {} - - // This is a polyfill for %IteratorPrototype% for environments that - // don't natively support it. - var IteratorPrototype = {}; - define(IteratorPrototype, iteratorSymbol, function () { - return this; - }); - - var getProto = Object.getPrototypeOf; - var NativeIteratorPrototype = getProto && getProto(getProto(values([]))); - if (NativeIteratorPrototype && - NativeIteratorPrototype !== Op && - hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) { - // This environment has a native %IteratorPrototype%; use it instead - // of the polyfill. - IteratorPrototype = NativeIteratorPrototype; - } - - var Gp = GeneratorFunctionPrototype.prototype = - Generator.prototype = Object.create(IteratorPrototype); - GeneratorFunction.prototype = GeneratorFunctionPrototype; - define(Gp, "constructor", GeneratorFunctionPrototype); - define(GeneratorFunctionPrototype, "constructor", GeneratorFunction); - GeneratorFunction.displayName = define( - GeneratorFunctionPrototype, - toStringTagSymbol, - "GeneratorFunction" - ); - - // Helper for defining the .next, .throw, and .return methods of the - // Iterator interface in terms of a single ._invoke method. - function defineIteratorMethods(prototype) { - ["next", "throw", "return"].forEach(function(method) { - define(prototype, method, function(arg) { - return this._invoke(method, arg); - }); - }); - } - - exports.isGeneratorFunction = function(genFun) { - var ctor = typeof genFun === "function" && genFun.constructor; - return ctor - ? ctor === GeneratorFunction || - // For the native GeneratorFunction constructor, the best we can - // do is to check its .name property. - (ctor.displayName || ctor.name) === "GeneratorFunction" - : false; - }; - - exports.mark = function(genFun) { - if (Object.setPrototypeOf) { - Object.setPrototypeOf(genFun, GeneratorFunctionPrototype); - } else { - genFun.__proto__ = GeneratorFunctionPrototype; - define(genFun, toStringTagSymbol, "GeneratorFunction"); - } - genFun.prototype = Object.create(Gp); - return genFun; - }; - - // Within the body of any async function, `await x` is transformed to - // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test - // `hasOwn.call(value, "__await")` to determine if the yielded value is - // meant to be awaited. - exports.awrap = function(arg) { - return { __await: arg }; - }; - - function AsyncIterator(generator, PromiseImpl) { - function invoke(method, arg, resolve, reject) { - var record = tryCatch(generator[method], generator, arg); - if (record.type === "throw") { - reject(record.arg); - } else { - var result = record.arg; - var value = result.value; - if (value && - typeof value === "object" && - hasOwn.call(value, "__await")) { - return PromiseImpl.resolve(value.__await).then(function(value) { - invoke("next", value, resolve, reject); - }, function(err) { - invoke("throw", err, resolve, reject); - }); - } - - return PromiseImpl.resolve(value).then(function(unwrapped) { - // When a yielded Promise is resolved, its final value becomes - // the .value of the Promise<{value,done}> result for the - // current iteration. - result.value = unwrapped; - resolve(result); - }, function(error) { - // If a rejected Promise was yielded, throw the rejection back - // into the async generator function so it can be handled there. - return invoke("throw", error, resolve, reject); - }); - } - } - - var previousPromise; - - function enqueue(method, arg) { - function callInvokeWithMethodAndArg() { - return new PromiseImpl(function(resolve, reject) { - invoke(method, arg, resolve, reject); - }); - } - - return previousPromise = - // If enqueue has been called before, then we want to wait until - // all previous Promises have been resolved before calling invoke, - // so that results are always delivered in the correct order. If - // enqueue has not been called before, then it is important to - // call invoke immediately, without waiting on a callback to fire, - // so that the async generator function has the opportunity to do - // any necessary setup in a predictable way. This predictability - // is why the Promise constructor synchronously invokes its - // executor callback, and why async functions synchronously - // execute code before the first await. Since we implement simple - // async functions in terms of async generators, it is especially - // important to get this right, even though it requires care. - previousPromise ? previousPromise.then( - callInvokeWithMethodAndArg, - // Avoid propagating failures to Promises returned by later - // invocations of the iterator. - callInvokeWithMethodAndArg - ) : callInvokeWithMethodAndArg(); - } - - // Define the unified helper method that is used to implement .next, - // .throw, and .return (see defineIteratorMethods). - this._invoke = enqueue; - } - - defineIteratorMethods(AsyncIterator.prototype); - define(AsyncIterator.prototype, asyncIteratorSymbol, function () { - return this; - }); - exports.AsyncIterator = AsyncIterator; - - // Note that simple async functions are implemented on top of - // AsyncIterator objects; they just return a Promise for the value of - // the final result produced by the iterator. - exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) { - if (PromiseImpl === void 0) PromiseImpl = Promise; - - var iter = new AsyncIterator( - wrap(innerFn, outerFn, self, tryLocsList), - PromiseImpl - ); - - return exports.isGeneratorFunction(outerFn) - ? iter // If outerFn is a generator, return the full iterator. - : iter.next().then(function(result) { - return result.done ? result.value : iter.next(); - }); - }; - - function makeInvokeMethod(innerFn, self, context) { - var state = GenStateSuspendedStart; - - return function invoke(method, arg) { - if (state === GenStateExecuting) { - throw new Error("Generator is already running"); - } - - if (state === GenStateCompleted) { - if (method === "throw") { - throw arg; - } - - // Be forgiving, per 25.3.3.3.3 of the spec: - // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume - return doneResult(); - } - - context.method = method; - context.arg = arg; - - while (true) { - var delegate = context.delegate; - if (delegate) { - var delegateResult = maybeInvokeDelegate(delegate, context); - if (delegateResult) { - if (delegateResult === ContinueSentinel) continue; - return delegateResult; - } - } - - if (context.method === "next") { - // Setting context._sent for legacy support of Babel's - // function.sent implementation. - context.sent = context._sent = context.arg; - - } else if (context.method === "throw") { - if (state === GenStateSuspendedStart) { - state = GenStateCompleted; - throw context.arg; - } - - context.dispatchException(context.arg); - - } else if (context.method === "return") { - context.abrupt("return", context.arg); - } - - state = GenStateExecuting; - - var record = tryCatch(innerFn, self, context); - if (record.type === "normal") { - // If an exception is thrown from innerFn, we leave state === - // GenStateExecuting and loop back for another invocation. - state = context.done - ? GenStateCompleted - : GenStateSuspendedYield; - - if (record.arg === ContinueSentinel) { - continue; - } - - return { - value: record.arg, - done: context.done - }; - - } else if (record.type === "throw") { - state = GenStateCompleted; - // Dispatch the exception by looping back around to the - // context.dispatchException(context.arg) call above. - context.method = "throw"; - context.arg = record.arg; - } - } - }; - } - - // Call delegate.iterator[context.method](context.arg) and handle the - // result, either by returning a { value, done } result from the - // delegate iterator, or by modifying context.method and context.arg, - // setting context.delegate to null, and returning the ContinueSentinel. - function maybeInvokeDelegate(delegate, context) { - var method = delegate.iterator[context.method]; - if (method === undefined) { - // A .throw or .return when the delegate iterator has no .throw - // method always terminates the yield* loop. - context.delegate = null; - - if (context.method === "throw") { - // Note: ["return"] must be used for ES3 parsing compatibility. - if (delegate.iterator["return"]) { - // If the delegate iterator has a return method, give it a - // chance to clean up. - context.method = "return"; - context.arg = undefined; - maybeInvokeDelegate(delegate, context); - - if (context.method === "throw") { - // If maybeInvokeDelegate(context) changed context.method from - // "return" to "throw", let that override the TypeError below. - return ContinueSentinel; - } - } - - context.method = "throw"; - context.arg = new TypeError( - "The iterator does not provide a 'throw' method"); - } - - return ContinueSentinel; - } - - var record = tryCatch(method, delegate.iterator, context.arg); - - if (record.type === "throw") { - context.method = "throw"; - context.arg = record.arg; - context.delegate = null; - return ContinueSentinel; - } - - var info = record.arg; - - if (! info) { - context.method = "throw"; - context.arg = new TypeError("iterator result is not an object"); - context.delegate = null; - return ContinueSentinel; - } - - if (info.done) { - // Assign the result of the finished delegate to the temporary - // variable specified by delegate.resultName (see delegateYield). - context[delegate.resultName] = info.value; - - // Resume execution at the desired location (see delegateYield). - context.next = delegate.nextLoc; - - // If context.method was "throw" but the delegate handled the - // exception, let the outer generator proceed normally. If - // context.method was "next", forget context.arg since it has been - // "consumed" by the delegate iterator. If context.method was - // "return", allow the original .return call to continue in the - // outer generator. - if (context.method !== "return") { - context.method = "next"; - context.arg = undefined; - } - - } else { - // Re-yield the result returned by the delegate method. - return info; - } - - // The delegate iterator is finished, so forget it and continue with - // the outer generator. - context.delegate = null; - return ContinueSentinel; - } - - // Define Generator.prototype.{next,throw,return} in terms of the - // unified ._invoke helper method. - defineIteratorMethods(Gp); - - define(Gp, toStringTagSymbol, "Generator"); - - // A Generator should always return itself as the iterator object when the - // @@iterator function is called on it. Some browsers' implementations of the - // iterator prototype chain incorrectly implement this, causing the Generator - // object to not be returned from this call. This ensures that doesn't happen. - // See https://github.com/facebook/regenerator/issues/274 for more details. - define(Gp, iteratorSymbol, function() { - return this; - }); - - define(Gp, "toString", function() { - return "[object Generator]"; - }); - - function pushTryEntry(locs) { - var entry = { tryLoc: locs[0] }; - - if (1 in locs) { - entry.catchLoc = locs[1]; - } - - if (2 in locs) { - entry.finallyLoc = locs[2]; - entry.afterLoc = locs[3]; - } - - this.tryEntries.push(entry); - } - - function resetTryEntry(entry) { - var record = entry.completion || {}; - record.type = "normal"; - delete record.arg; - entry.completion = record; - } - - function Context(tryLocsList) { - // The root entry object (effectively a try statement without a catch - // or a finally block) gives us a place to store values thrown from - // locations where there is no enclosing try statement. - this.tryEntries = [{ tryLoc: "root" }]; - tryLocsList.forEach(pushTryEntry, this); - this.reset(true); - } - - exports.keys = function(object) { - var keys = []; - for (var key in object) { - keys.push(key); - } - keys.reverse(); - - // Rather than returning an object with a next method, we keep - // things simple and return the next function itself. - return function next() { - while (keys.length) { - var key = keys.pop(); - if (key in object) { - next.value = key; - next.done = false; - return next; - } - } - - // To avoid creating an additional object, we just hang the .value - // and .done properties off the next function object itself. This - // also ensures that the minifier will not anonymize the function. - next.done = true; - return next; - }; - }; - - function values(iterable) { - if (iterable) { - var iteratorMethod = iterable[iteratorSymbol]; - if (iteratorMethod) { - return iteratorMethod.call(iterable); - } - - if (typeof iterable.next === "function") { - return iterable; - } - - if (!isNaN(iterable.length)) { - var i = -1, next = function next() { - while (++i < iterable.length) { - if (hasOwn.call(iterable, i)) { - next.value = iterable[i]; - next.done = false; - return next; - } - } - - next.value = undefined; - next.done = true; - - return next; - }; - - return next.next = next; - } - } - - // Return an iterator with no values. - return { next: doneResult }; - } - exports.values = values; - - function doneResult() { - return { value: undefined, done: true }; - } - - Context.prototype = { - constructor: Context, - - reset: function(skipTempReset) { - this.prev = 0; - this.next = 0; - // Resetting context._sent for legacy support of Babel's - // function.sent implementation. - this.sent = this._sent = undefined; - this.done = false; - this.delegate = null; - - this.method = "next"; - this.arg = undefined; - - this.tryEntries.forEach(resetTryEntry); - - if (!skipTempReset) { - for (var name in this) { - // Not sure about the optimal order of these conditions: - if (name.charAt(0) === "t" && - hasOwn.call(this, name) && - !isNaN(+name.slice(1))) { - this[name] = undefined; - } - } - } - }, - - stop: function() { - this.done = true; - - var rootEntry = this.tryEntries[0]; - var rootRecord = rootEntry.completion; - if (rootRecord.type === "throw") { - throw rootRecord.arg; - } - - return this.rval; - }, - - dispatchException: function(exception) { - if (this.done) { - throw exception; - } - - var context = this; - function handle(loc, caught) { - record.type = "throw"; - record.arg = exception; - context.next = loc; - - if (caught) { - // If the dispatched exception was caught by a catch block, - // then let that catch block handle the exception normally. - context.method = "next"; - context.arg = undefined; - } - - return !! caught; - } - - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - var record = entry.completion; - - if (entry.tryLoc === "root") { - // Exception thrown outside of any try block that could handle - // it, so set the completion value of the entire function to - // throw the exception. - return handle("end"); - } - - if (entry.tryLoc <= this.prev) { - var hasCatch = hasOwn.call(entry, "catchLoc"); - var hasFinally = hasOwn.call(entry, "finallyLoc"); - - if (hasCatch && hasFinally) { - if (this.prev < entry.catchLoc) { - return handle(entry.catchLoc, true); - } else if (this.prev < entry.finallyLoc) { - return handle(entry.finallyLoc); - } - - } else if (hasCatch) { - if (this.prev < entry.catchLoc) { - return handle(entry.catchLoc, true); - } - - } else if (hasFinally) { - if (this.prev < entry.finallyLoc) { - return handle(entry.finallyLoc); - } - - } else { - throw new Error("try statement without catch or finally"); - } - } - } - }, - - abrupt: function(type, arg) { - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - if (entry.tryLoc <= this.prev && - hasOwn.call(entry, "finallyLoc") && - this.prev < entry.finallyLoc) { - var finallyEntry = entry; - break; - } - } - - if (finallyEntry && - (type === "break" || - type === "continue") && - finallyEntry.tryLoc <= arg && - arg <= finallyEntry.finallyLoc) { - // Ignore the finally entry if control is not jumping to a - // location outside the try/catch block. - finallyEntry = null; - } - - var record = finallyEntry ? finallyEntry.completion : {}; - record.type = type; - record.arg = arg; - - if (finallyEntry) { - this.method = "next"; - this.next = finallyEntry.finallyLoc; - return ContinueSentinel; - } - - return this.complete(record); - }, - - complete: function(record, afterLoc) { - if (record.type === "throw") { - throw record.arg; - } - - if (record.type === "break" || - record.type === "continue") { - this.next = record.arg; - } else if (record.type === "return") { - this.rval = this.arg = record.arg; - this.method = "return"; - this.next = "end"; - } else if (record.type === "normal" && afterLoc) { - this.next = afterLoc; - } - - return ContinueSentinel; - }, - - finish: function(finallyLoc) { - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - if (entry.finallyLoc === finallyLoc) { - this.complete(entry.completion, entry.afterLoc); - resetTryEntry(entry); - return ContinueSentinel; - } - } - }, - - "catch": function(tryLoc) { - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - if (entry.tryLoc === tryLoc) { - var record = entry.completion; - if (record.type === "throw") { - var thrown = record.arg; - resetTryEntry(entry); - } - return thrown; - } - } - - // The context.catch method must only be called with a location - // argument that corresponds to a known catch block. - throw new Error("illegal catch attempt"); - }, - - delegateYield: function(iterable, resultName, nextLoc) { - this.delegate = { - iterator: values(iterable), - resultName: resultName, - nextLoc: nextLoc - }; - - if (this.method === "next") { - // Deliberately forget the last sent value so that we don't - // accidentally pass it on to the delegate. - this.arg = undefined; - } - - return ContinueSentinel; - } - }; - - // Regardless of whether this script is executing as a CommonJS module - // or not, return the runtime object so that we can declare the variable - // regeneratorRuntime in the outer scope, which allows this module to be - // injected easily by `bin/regenerator --include-runtime script.js`. - return exports; - -}( - // If this script is executing as a CommonJS module, use module.exports - // as the regeneratorRuntime namespace. Otherwise create a new empty - // object. Either way, the resulting object will be used to initialize - // the regeneratorRuntime variable at the top of this file. - true ? module.exports : 0 -)); - -try { - regeneratorRuntime = runtime; -} catch (accidentalStrictMode) { - // This module should not be running in strict mode, so the above - // assignment should always work unless something is misconfigured. Just - // in case runtime.js accidentally runs in strict mode, in modern engines - // we can explicitly access globalThis. In older engines we can escape - // strict mode using a global Function call. This could conceivably fail - // if a Content Security Policy forbids using Function, but in that case - // the proper solution is to fix the accidental strict mode problem. If - // you've misconfigured your bundler to force strict mode and applied a - // CSP to forbid Function, and you're not willing to fix either of those - // problems, please detail your unique predicament in a GitHub issue. - if (typeof globalThis === "object") { - globalThis.regeneratorRuntime = runtime; - } else { - Function("r", "regeneratorRuntime = r")(runtime); - } -} - - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ -/******/ // startup -/******/ // Load entry module and return exports -/******/ // This entry module is referenced by other modules so it can't be inlined -/******/ var __webpack_exports__ = __webpack_require__("./node_modules/regenerator-runtime/runtime.js"); -/******/ -/******/ })() -; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnZW5lcmF0b3JSdW50aW1lLmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZixNQUFNO0FBQ04sZUFBZTtBQUNmO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQ7QUFDMUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQSx3Q0FBd0MsV0FBVztBQUNuRDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLFVBQVU7QUFDVjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EscUNBQXFDLGNBQWM7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUNBQWlDLG1CQUFtQjtBQUNwRDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLGtCQUFrQjs7QUFFbEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLGdCQUFnQjtBQUN6QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsK0NBQStDLFFBQVE7QUFDdkQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUEsWUFBWTtBQUNaO0FBQ0E7QUFDQTs7QUFFQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsK0NBQStDLFFBQVE7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSwrQ0FBK0MsUUFBUTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSwrQ0FBK0MsUUFBUTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsS0FBMEIsb0JBQW9CLENBQUU7QUFDbEQ7O0FBRUE7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOzs7Ozs7O1VDanZCQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBOztVQUVBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBOzs7O1VFdEJBO1VBQ0E7VUFDQTtVQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrLy4vbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcyIsIndlYnBhY2s6Ly9hc3Rlcm9pZC1hdHRhY2svd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrL3dlYnBhY2svYmVmb3JlLXN0YXJ0dXAiLCJ3ZWJwYWNrOi8vYXN0ZXJvaWQtYXR0YWNrL3dlYnBhY2svc3RhcnR1cCIsIndlYnBhY2s6Ly9hc3Rlcm9pZC1hdHRhY2svd2VicGFjay9hZnRlci1zdGFydHVwIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxudmFyIHJ1bnRpbWUgPSAoZnVuY3Rpb24gKGV4cG9ydHMpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgdmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xuICB2YXIgdW5kZWZpbmVkOyAvLyBNb3JlIGNvbXByZXNzaWJsZSB0aGFuIHZvaWQgMC5cbiAgdmFyICRTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgPyBTeW1ib2wgOiB7fTtcbiAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIjtcbiAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIjtcbiAgdmFyIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcblxuICBmdW5jdGlvbiBkZWZpbmUob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gb2JqW2tleV07XG4gIH1cbiAgdHJ5IHtcbiAgICAvLyBJRSA4IGhhcyBhIGJyb2tlbiBPYmplY3QuZGVmaW5lUHJvcGVydHkgdGhhdCBvbmx5IHdvcmtzIG9uIERPTSBvYmplY3RzLlxuICAgIGRlZmluZSh7fSwgXCJcIik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGRlZmluZSA9IGZ1bmN0aW9uKG9iaiwga2V5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG9ialtrZXldID0gdmFsdWU7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkIGFuZCBvdXRlckZuLnByb3RvdHlwZSBpcyBhIEdlbmVyYXRvciwgdGhlbiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvci5cbiAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjtcbiAgICB2YXIgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuXG4gICAgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcy5cbiAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG4gIGV4cG9ydHMud3JhcCA9IHdyYXA7XG5cbiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uXG4gIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmVcbiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmdcbiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWVcbiAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2hcbiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLlxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9IFwic3VzcGVuZGVkWWllbGRcIjtcbiAgdmFyIEdlblN0YXRlRXhlY3V0aW5nID0gXCJleGVjdXRpbmdcIjtcbiAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcblxuICAvLyBSZXR1cm5pbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgaW5uZXJGbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzXG4gIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICAvLyBEdW1teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmRcbiAgLy8gLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gR2VuZXJhdG9yXG4gIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuXG4gIC8vIFRoaXMgaXMgYSBwb2x5ZmlsbCBmb3IgJUl0ZXJhdG9yUHJvdG90eXBlJSBmb3IgZW52aXJvbm1lbnRzIHRoYXRcbiAgLy8gZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdC5cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIGRlZmluZShJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSk7XG5cbiAgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuICB2YXIgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90byAmJiBnZXRQcm90byhnZXRQcm90byh2YWx1ZXMoW10pKSk7XG4gIGlmIChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAmJlxuICAgICAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmXG4gICAgICBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpKSB7XG4gICAgLy8gVGhpcyBlbnZpcm9ubWVudCBoYXMgYSBuYXRpdmUgJUl0ZXJhdG9yUHJvdG90eXBlJTsgdXNlIGl0IGluc3RlYWRcbiAgICAvLyBvZiB0aGUgcG9seWZpbGwuXG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBOYXRpdmVJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxuXG4gIHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9XG4gICAgR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgZGVmaW5lKEdwLCBcImNvbnN0cnVjdG9yXCIsIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKTtcbiAgZGVmaW5lKEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCBcImNvbnN0cnVjdG9yXCIsIEdlbmVyYXRvckZ1bmN0aW9uKTtcbiAgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkZWZpbmUoXG4gICAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsXG4gICAgdG9TdHJpbmdUYWdTeW1ib2wsXG4gICAgXCJHZW5lcmF0b3JGdW5jdGlvblwiXG4gICk7XG5cbiAgLy8gSGVscGVyIGZvciBkZWZpbmluZyB0aGUgLm5leHQsIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcyBvZiB0aGVcbiAgLy8gSXRlcmF0b3IgaW50ZXJmYWNlIGluIHRlcm1zIG9mIGEgc2luZ2xlIC5faW52b2tlIG1ldGhvZC5cbiAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHByb3RvdHlwZSkge1xuICAgIFtcIm5leHRcIiwgXCJ0aHJvd1wiLCBcInJldHVyblwiXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgZGVmaW5lKHByb3RvdHlwZSwgbWV0aG9kLCBmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbiA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIHZhciBjdG9yID0gdHlwZW9mIGdlbkZ1biA9PT0gXCJmdW5jdGlvblwiICYmIGdlbkZ1bi5jb25zdHJ1Y3RvcjtcbiAgICByZXR1cm4gY3RvclxuICAgICAgPyBjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fFxuICAgICAgICAvLyBGb3IgdGhlIG5hdGl2ZSBHZW5lcmF0b3JGdW5jdGlvbiBjb25zdHJ1Y3RvciwgdGhlIGJlc3Qgd2UgY2FuXG4gICAgICAgIC8vIGRvIGlzIHRvIGNoZWNrIGl0cyAubmFtZSBwcm9wZXJ0eS5cbiAgICAgICAgKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSA9PT0gXCJHZW5lcmF0b3JGdW5jdGlvblwiXG4gICAgICA6IGZhbHNlO1xuICB9O1xuXG4gIGV4cG9ydHMubWFyayA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihnZW5GdW4sIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICAgICAgZGVmaW5lKGdlbkZ1biwgdG9TdHJpbmdUYWdTeW1ib2wsIFwiR2VuZXJhdG9yRnVuY3Rpb25cIik7XG4gICAgfVxuICAgIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKTtcbiAgICByZXR1cm4gZ2VuRnVuO1xuICB9O1xuXG4gIC8vIFdpdGhpbiB0aGUgYm9keSBvZiBhbnkgYXN5bmMgZnVuY3Rpb24sIGBhd2FpdCB4YCBpcyB0cmFuc2Zvcm1lZCB0b1xuICAvLyBgeWllbGQgcmVnZW5lcmF0b3JSdW50aW1lLmF3cmFwKHgpYCwgc28gdGhhdCB0aGUgcnVudGltZSBjYW4gdGVzdFxuICAvLyBgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKWAgdG8gZGV0ZXJtaW5lIGlmIHRoZSB5aWVsZGVkIHZhbHVlIGlzXG4gIC8vIG1lYW50IHRvIGJlIGF3YWl0ZWQuXG4gIGV4cG9ydHMuYXdyYXAgPSBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4geyBfX2F3YWl0OiBhcmcgfTtcbiAgfTtcblxuICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvciwgUHJvbWlzZUltcGwpIHtcbiAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICByZWplY3QocmVjb3JkLmFyZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZztcbiAgICAgICAgdmFyIHZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGludm9rZShcIm5leHRcIiwgdmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJ0aHJvd1wiLCBlcnIsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbih1bndyYXBwZWQpIHtcbiAgICAgICAgICAvLyBXaGVuIGEgeWllbGRlZCBQcm9taXNlIGlzIHJlc29sdmVkLCBpdHMgZmluYWwgdmFsdWUgYmVjb21lc1xuICAgICAgICAgIC8vIHRoZSAudmFsdWUgb2YgdGhlIFByb21pc2U8e3ZhbHVlLGRvbmV9PiByZXN1bHQgZm9yIHRoZVxuICAgICAgICAgIC8vIGN1cnJlbnQgaXRlcmF0aW9uLlxuICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZDtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgLy8gSWYgYSByZWplY3RlZCBQcm9taXNlIHdhcyB5aWVsZGVkLCB0aHJvdyB0aGUgcmVqZWN0aW9uIGJhY2tcbiAgICAgICAgICAvLyBpbnRvIHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gc28gaXQgY2FuIGJlIGhhbmRsZWQgdGhlcmUuXG4gICAgICAgICAgcmV0dXJuIGludm9rZShcInRocm93XCIsIGVycm9yLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNQcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gZW5xdWV1ZShtZXRob2QsIGFyZykge1xuICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZUltcGwoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9XG4gICAgICAgIC8vIElmIGVucXVldWUgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIHdhaXQgdW50aWxcbiAgICAgICAgLy8gYWxsIHByZXZpb3VzIFByb21pc2VzIGhhdmUgYmVlbiByZXNvbHZlZCBiZWZvcmUgY2FsbGluZyBpbnZva2UsXG4gICAgICAgIC8vIHNvIHRoYXQgcmVzdWx0cyBhcmUgYWx3YXlzIGRlbGl2ZXJlZCBpbiB0aGUgY29ycmVjdCBvcmRlci4gSWZcbiAgICAgICAgLy8gZW5xdWV1ZSBoYXMgbm90IGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiBpdCBpcyBpbXBvcnRhbnQgdG9cbiAgICAgICAgLy8gY2FsbCBpbnZva2UgaW1tZWRpYXRlbHksIHdpdGhvdXQgd2FpdGluZyBvbiBhIGNhbGxiYWNrIHRvIGZpcmUsXG4gICAgICAgIC8vIHNvIHRoYXQgdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBoYXMgdGhlIG9wcG9ydHVuaXR5IHRvIGRvXG4gICAgICAgIC8vIGFueSBuZWNlc3Nhcnkgc2V0dXAgaW4gYSBwcmVkaWN0YWJsZSB3YXkuIFRoaXMgcHJlZGljdGFiaWxpdHlcbiAgICAgICAgLy8gaXMgd2h5IHRoZSBQcm9taXNlIGNvbnN0cnVjdG9yIHN5bmNocm9ub3VzbHkgaW52b2tlcyBpdHNcbiAgICAgICAgLy8gZXhlY3V0b3IgY2FsbGJhY2ssIGFuZCB3aHkgYXN5bmMgZnVuY3Rpb25zIHN5bmNocm9ub3VzbHlcbiAgICAgICAgLy8gZXhlY3V0ZSBjb2RlIGJlZm9yZSB0aGUgZmlyc3QgYXdhaXQuIFNpbmNlIHdlIGltcGxlbWVudCBzaW1wbGVcbiAgICAgICAgLy8gYXN5bmMgZnVuY3Rpb25zIGluIHRlcm1zIG9mIGFzeW5jIGdlbmVyYXRvcnMsIGl0IGlzIGVzcGVjaWFsbHlcbiAgICAgICAgLy8gaW1wb3J0YW50IHRvIGdldCB0aGlzIHJpZ2h0LCBldmVuIHRob3VnaCBpdCByZXF1aXJlcyBjYXJlLlxuICAgICAgICBwcmV2aW91c1Byb21pc2UgPyBwcmV2aW91c1Byb21pc2UudGhlbihcbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyxcbiAgICAgICAgICAvLyBBdm9pZCBwcm9wYWdhdGluZyBmYWlsdXJlcyB0byBQcm9taXNlcyByZXR1cm5lZCBieSBsYXRlclxuICAgICAgICAgIC8vIGludm9jYXRpb25zIG9mIHRoZSBpdGVyYXRvci5cbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZ1xuICAgICAgICApIDogY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKTtcbiAgICB9XG5cbiAgICAvLyBEZWZpbmUgdGhlIHVuaWZpZWQgaGVscGVyIG1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gaW1wbGVtZW50IC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gKHNlZSBkZWZpbmVJdGVyYXRvck1ldGhvZHMpLlxuICAgIHRoaXMuX2ludm9rZSA9IGVucXVldWU7XG4gIH1cblxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpO1xuICBkZWZpbmUoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUsIGFzeW5jSXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSk7XG4gIGV4cG9ydHMuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3I7XG5cbiAgLy8gTm90ZSB0aGF0IHNpbXBsZSBhc3luYyBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZlxuICAvLyBBc3luY0l0ZXJhdG9yIG9iamVjdHM7IHRoZXkganVzdCByZXR1cm4gYSBQcm9taXNlIGZvciB0aGUgdmFsdWUgb2ZcbiAgLy8gdGhlIGZpbmFsIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgaXRlcmF0b3IuXG4gIGV4cG9ydHMuYXN5bmMgPSBmdW5jdGlvbihpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCwgUHJvbWlzZUltcGwpIHtcbiAgICBpZiAoUHJvbWlzZUltcGwgPT09IHZvaWQgMCkgUHJvbWlzZUltcGwgPSBQcm9taXNlO1xuXG4gICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcihcbiAgICAgIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpLFxuICAgICAgUHJvbWlzZUltcGxcbiAgICApO1xuXG4gICAgcmV0dXJuIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kO1xuICAgICAgY29udGV4dC5hcmcgPSBhcmc7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgICAgdGhyb3cgY29udGV4dC5hcmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG5cbiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09XG4gICAgICAgICAgLy8gR2VuU3RhdGVFeGVjdXRpbmcgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhlciBpbnZvY2F0aW9uLlxuICAgICAgICAgIHN0YXRlID0gY29udGV4dC5kb25lXG4gICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkXG4gICAgICAgICAgICA6IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lXG4gICAgICAgICAgfTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBleGNlcHRpb24gYnkgbG9vcGluZyBiYWNrIGFyb3VuZCB0byB0aGVcbiAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGVcbiAgLy8gcmVzdWx0LCBlaXRoZXIgYnkgcmV0dXJuaW5nIGEgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCBmcm9tIHRoZVxuICAvLyBkZWxlZ2F0ZSBpdGVyYXRvciwgb3IgYnkgbW9kaWZ5aW5nIGNvbnRleHQubWV0aG9kIGFuZCBjb250ZXh0LmFyZyxcbiAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuXG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdO1xuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQSAudGhyb3cgb3IgLnJldHVybiB3aGVuIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgbm8gLnRocm93XG4gICAgICAvLyBtZXRob2QgYWx3YXlzIHRlcm1pbmF0ZXMgdGhlIHlpZWxkKiBsb29wLlxuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIC8vIE5vdGU6IFtcInJldHVyblwiXSBtdXN0IGJlIHVzZWQgZm9yIEVTMyBwYXJzaW5nIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvcltcInJldHVyblwiXSkge1xuICAgICAgICAgIC8vIElmIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgYSByZXR1cm4gbWV0aG9kLCBnaXZlIGl0IGFcbiAgICAgICAgICAvLyBjaGFuY2UgdG8gY2xlYW4gdXAuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuXG4gICAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIC8vIElmIG1heWJlSW52b2tlRGVsZWdhdGUoY29udGV4dCkgY2hhbmdlZCBjb250ZXh0Lm1ldGhvZCBmcm9tXG4gICAgICAgICAgICAvLyBcInJldHVyblwiIHRvIFwidGhyb3dcIiwgbGV0IHRoYXQgb3ZlcnJpZGUgdGhlIFR5cGVFcnJvciBiZWxvdy5cbiAgICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpO1xuXG4gICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7XG5cbiAgICBpZiAoISBpbmZvKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAvLyBBc3NpZ24gdGhlIHJlc3VsdCBvZiB0aGUgZmluaXNoZWQgZGVsZWdhdGUgdG8gdGhlIHRlbXBvcmFyeVxuICAgICAgLy8gdmFyaWFibGUgc3BlY2lmaWVkIGJ5IGRlbGVnYXRlLnJlc3VsdE5hbWUgKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlO1xuXG4gICAgICAvLyBSZXN1bWUgZXhlY3V0aW9uIGF0IHRoZSBkZXNpcmVkIGxvY2F0aW9uIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jO1xuXG4gICAgICAvLyBJZiBjb250ZXh0Lm1ldGhvZCB3YXMgXCJ0aHJvd1wiIGJ1dCB0aGUgZGVsZWdhdGUgaGFuZGxlZCB0aGVcbiAgICAgIC8vIGV4Y2VwdGlvbiwgbGV0IHRoZSBvdXRlciBnZW5lcmF0b3IgcHJvY2VlZCBub3JtYWxseS4gSWZcbiAgICAgIC8vIGNvbnRleHQubWV0aG9kIHdhcyBcIm5leHRcIiwgZm9yZ2V0IGNvbnRleHQuYXJnIHNpbmNlIGl0IGhhcyBiZWVuXG4gICAgICAvLyBcImNvbnN1bWVkXCIgYnkgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yLiBJZiBjb250ZXh0Lm1ldGhvZCB3YXNcbiAgICAgIC8vIFwicmV0dXJuXCIsIGFsbG93IHRoZSBvcmlnaW5hbCAucmV0dXJuIGNhbGwgdG8gY29udGludWUgaW4gdGhlXG4gICAgICAvLyBvdXRlciBnZW5lcmF0b3IuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgIT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmUteWllbGQgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgZGVsZWdhdGUgbWV0aG9kLlxuICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgLy8gVGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGlzIGZpbmlzaGVkLCBzbyBmb3JnZXQgaXQgYW5kIGNvbnRpbnVlIHdpdGhcbiAgICAvLyB0aGUgb3V0ZXIgZ2VuZXJhdG9yLlxuICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICB9XG5cbiAgLy8gRGVmaW5lIEdlbmVyYXRvci5wcm90b3R5cGUue25leHQsdGhyb3cscmV0dXJufSBpbiB0ZXJtcyBvZiB0aGVcbiAgLy8gdW5pZmllZCAuX2ludm9rZSBoZWxwZXIgbWV0aG9kLlxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApO1xuXG4gIGRlZmluZShHcCwgdG9TdHJpbmdUYWdTeW1ib2wsIFwiR2VuZXJhdG9yXCIpO1xuXG4gIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlXG4gIC8vIEBAaXRlcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGl0LiBTb21lIGJyb3dzZXJzJyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlXG4gIC8vIGl0ZXJhdG9yIHByb3RvdHlwZSBjaGFpbiBpbmNvcnJlY3RseSBpbXBsZW1lbnQgdGhpcywgY2F1c2luZyB0aGUgR2VuZXJhdG9yXG4gIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2lzc3Vlcy8yNzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgZGVmaW5lKEdwLCBpdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pO1xuXG4gIGRlZmluZShHcCwgXCJ0b1N0cmluZ1wiLCBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfSk7XG5cbiAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHtcbiAgICB2YXIgZW50cnkgPSB7IHRyeUxvYzogbG9jc1swXSB9O1xuXG4gICAgaWYgKDEgaW4gbG9jcykge1xuICAgICAgZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdO1xuICAgIH1cblxuICAgIGlmICgyIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmZpbmFsbHlMb2MgPSBsb2NzWzJdO1xuICAgICAgZW50cnkuYWZ0ZXJMb2MgPSBsb2NzWzNdO1xuICAgIH1cblxuICAgIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHtcbiAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTtcbiAgICByZWNvcmQudHlwZSA9IFwibm9ybWFsXCI7XG4gICAgZGVsZXRlIHJlY29yZC5hcmc7XG4gICAgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIENvbnRleHQodHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBUaGUgcm9vdCBlbnRyeSBvYmplY3QgKGVmZmVjdGl2ZWx5IGEgdHJ5IHN0YXRlbWVudCB3aXRob3V0IGEgY2F0Y2hcbiAgICAvLyBvciBhIGZpbmFsbHkgYmxvY2spIGdpdmVzIHVzIGEgcGxhY2UgdG8gc3RvcmUgdmFsdWVzIHRocm93biBmcm9tXG4gICAgLy8gbG9jYXRpb25zIHdoZXJlIHRoZXJlIGlzIG5vIGVuY2xvc2luZyB0cnkgc3RhdGVtZW50LlxuICAgIHRoaXMudHJ5RW50cmllcyA9IFt7IHRyeUxvYzogXCJyb290XCIgfV07XG4gICAgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpO1xuICAgIHRoaXMucmVzZXQodHJ1ZSk7XG4gIH1cblxuICBleHBvcnRzLmtleXMgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgICBrZXlzLnJldmVyc2UoKTtcblxuICAgIC8vIFJhdGhlciB0aGFuIHJldHVybmluZyBhbiBvYmplY3Qgd2l0aCBhIG5leHQgbWV0aG9kLCB3ZSBrZWVwXG4gICAgLy8gdGhpbmdzIHNpbXBsZSBhbmQgcmV0dXJuIHRoZSBuZXh0IGZ1bmN0aW9uIGl0c2VsZi5cbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTtcbiAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICBuZXh0LnZhbHVlID0ga2V5O1xuICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRvIGF2b2lkIGNyZWF0aW5nIGFuIGFkZGl0aW9uYWwgb2JqZWN0LCB3ZSBqdXN0IGhhbmcgdGhlIC52YWx1ZVxuICAgICAgLy8gYW5kIC5kb25lIHByb3BlcnRpZXMgb2ZmIHRoZSBuZXh0IGZ1bmN0aW9uIG9iamVjdCBpdHNlbGYuIFRoaXNcbiAgICAgIC8vIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBtaW5pZmllciB3aWxsIG5vdCBhbm9ueW1pemUgdGhlIGZ1bmN0aW9uLlxuICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7XG4gICAgaWYgKGl0ZXJhYmxlKSB7XG4gICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07XG4gICAgICBpZiAoaXRlcmF0b3JNZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGl0ZXJhYmxlLm5leHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gaXRlcmFibGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkge1xuICAgICAgICB2YXIgaSA9IC0xLCBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgaXRlcmFibGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoaXRlcmFibGUsIGkpKSB7XG4gICAgICAgICAgICAgIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXTtcbiAgICAgICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5leHQudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBhbiBpdGVyYXRvciB3aXRoIG5vIHZhbHVlcy5cbiAgICByZXR1cm4geyBuZXh0OiBkb25lUmVzdWx0IH07XG4gIH1cbiAgZXhwb3J0cy52YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHtcbiAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIH1cblxuICBDb250ZXh0LnByb3RvdHlwZSA9IHtcbiAgICBjb25zdHJ1Y3RvcjogQ29udGV4dCxcblxuICAgIHJlc2V0OiBmdW5jdGlvbihza2lwVGVtcFJlc2V0KSB7XG4gICAgICB0aGlzLnByZXYgPSAwO1xuICAgICAgdGhpcy5uZXh0ID0gMDtcbiAgICAgIC8vIFJlc2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcblxuICAgICAgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSk7XG5cbiAgICAgIGlmICghc2tpcFRlbXBSZXNldCkge1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHtcbiAgICAgICAgICAvLyBOb3Qgc3VyZSBhYm91dCB0aGUgb3B0aW1hbCBvcmRlciBvZiB0aGVzZSBjb25kaXRpb25zOlxuICAgICAgICAgIGlmIChuYW1lLmNoYXJBdCgwKSA9PT0gXCJ0XCIgJiZcbiAgICAgICAgICAgICAgaGFzT3duLmNhbGwodGhpcywgbmFtZSkgJiZcbiAgICAgICAgICAgICAgIWlzTmFOKCtuYW1lLnNsaWNlKDEpKSkge1xuICAgICAgICAgICAgdGhpc1tuYW1lXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuXG4gICAgICB2YXIgcm9vdEVudHJ5ID0gdGhpcy50cnlFbnRyaWVzWzBdO1xuICAgICAgdmFyIHJvb3RSZWNvcmQgPSByb290RW50cnkuY29tcGxldGlvbjtcbiAgICAgIGlmIChyb290UmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByb290UmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucnZhbDtcbiAgICB9LFxuXG4gICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uKGV4Y2VwdGlvbikge1xuICAgICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgICB0aHJvdyBleGNlcHRpb247XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkge1xuICAgICAgICByZWNvcmQudHlwZSA9IFwidGhyb3dcIjtcbiAgICAgICAgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbjtcbiAgICAgICAgY29udGV4dC5uZXh0ID0gbG9jO1xuXG4gICAgICAgIGlmIChjYXVnaHQpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGlzcGF0Y2hlZCBleGNlcHRpb24gd2FzIGNhdWdodCBieSBhIGNhdGNoIGJsb2NrLFxuICAgICAgICAgIC8vIHRoZW4gbGV0IHRoYXQgY2F0Y2ggYmxvY2sgaGFuZGxlIHRoZSBleGNlcHRpb24gbm9ybWFsbHkuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhISBjYXVnaHQ7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSBcInJvb3RcIikge1xuICAgICAgICAgIC8vIEV4Y2VwdGlvbiB0aHJvd24gb3V0c2lkZSBvZiBhbnkgdHJ5IGJsb2NrIHRoYXQgY291bGQgaGFuZGxlXG4gICAgICAgICAgLy8gaXQsIHNvIHNldCB0aGUgY29tcGxldGlvbiB2YWx1ZSBvZiB0aGUgZW50aXJlIGZ1bmN0aW9uIHRvXG4gICAgICAgICAgLy8gdGhyb3cgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXR1cm4gaGFuZGxlKFwiZW5kXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHtcbiAgICAgICAgICB2YXIgaGFzQ2F0Y2ggPSBoYXNPd24uY2FsbChlbnRyeSwgXCJjYXRjaExvY1wiKTtcbiAgICAgICAgICB2YXIgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIik7XG5cbiAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHlcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFicnVwdDogZnVuY3Rpb24odHlwZSwgYXJnKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIikgJiZcbiAgICAgICAgICAgIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB2YXIgZmluYWxseUVudHJ5ID0gZW50cnk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSAmJlxuICAgICAgICAgICh0eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICAgdHlwZSA9PT0gXCJjb250aW51ZVwiKSAmJlxuICAgICAgICAgIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmXG4gICAgICAgICAgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgIC8vIElnbm9yZSB0aGUgZmluYWxseSBlbnRyeSBpZiBjb250cm9sIGlzIG5vdCBqdW1waW5nIHRvIGFcbiAgICAgICAgLy8gbG9jYXRpb24gb3V0c2lkZSB0aGUgdHJ5L2NhdGNoIGJsb2NrLlxuICAgICAgICBmaW5hbGx5RW50cnkgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVjb3JkID0gZmluYWxseUVudHJ5ID8gZmluYWxseUVudHJ5LmNvbXBsZXRpb24gOiB7fTtcbiAgICAgIHJlY29yZC50eXBlID0gdHlwZTtcbiAgICAgIHJlY29yZC5hcmcgPSBhcmc7XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkpIHtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2M7XG4gICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZShyZWNvcmQpO1xuICAgIH0sXG5cbiAgICBjb21wbGV0ZTogZnVuY3Rpb24ocmVjb3JkLCBhZnRlckxvYykge1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICByZWNvcmQudHlwZSA9PT0gXCJjb250aW51ZVwiKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IHJlY29yZC5hcmc7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInJldHVyblwiKSB7XG4gICAgICAgIHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICB0aGlzLm5leHQgPSBcImVuZFwiO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIiAmJiBhZnRlckxvYykge1xuICAgICAgICB0aGlzLm5leHQgPSBhZnRlckxvYztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oZmluYWxseUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyk7XG4gICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgXCJjYXRjaFwiOiBmdW5jdGlvbih0cnlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHtcbiAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRocm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgY29udGV4dC5jYXRjaCBtZXRob2QgbXVzdCBvbmx5IGJlIGNhbGxlZCB3aXRoIGEgbG9jYXRpb25cbiAgICAgIC8vIGFyZ3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBrbm93biBjYXRjaCBibG9jay5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICB9LFxuXG4gICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24oaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLFxuICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLFxuICAgICAgICBuZXh0TG9jOiBuZXh0TG9jXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgIC8vIERlbGliZXJhdGVseSBmb3JnZXQgdGhlIGxhc3Qgc2VudCB2YWx1ZSBzbyB0aGF0IHdlIGRvbid0XG4gICAgICAgIC8vIGFjY2lkZW50YWxseSBwYXNzIGl0IG9uIHRvIHRoZSBkZWxlZ2F0ZS5cbiAgICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cbiAgfTtcblxuICAvLyBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhpcyBzY3JpcHQgaXMgZXhlY3V0aW5nIGFzIGEgQ29tbW9uSlMgbW9kdWxlXG4gIC8vIG9yIG5vdCwgcmV0dXJuIHRoZSBydW50aW1lIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBkZWNsYXJlIHRoZSB2YXJpYWJsZVxuICAvLyByZWdlbmVyYXRvclJ1bnRpbWUgaW4gdGhlIG91dGVyIHNjb3BlLCB3aGljaCBhbGxvd3MgdGhpcyBtb2R1bGUgdG8gYmVcbiAgLy8gaW5qZWN0ZWQgZWFzaWx5IGJ5IGBiaW4vcmVnZW5lcmF0b3IgLS1pbmNsdWRlLXJ1bnRpbWUgc2NyaXB0LmpzYC5cbiAgcmV0dXJuIGV4cG9ydHM7XG5cbn0oXG4gIC8vIElmIHRoaXMgc2NyaXB0IGlzIGV4ZWN1dGluZyBhcyBhIENvbW1vbkpTIG1vZHVsZSwgdXNlIG1vZHVsZS5leHBvcnRzXG4gIC8vIGFzIHRoZSByZWdlbmVyYXRvclJ1bnRpbWUgbmFtZXNwYWNlLiBPdGhlcndpc2UgY3JlYXRlIGEgbmV3IGVtcHR5XG4gIC8vIG9iamVjdC4gRWl0aGVyIHdheSwgdGhlIHJlc3VsdGluZyBvYmplY3Qgd2lsbCBiZSB1c2VkIHRvIGluaXRpYWxpemVcbiAgLy8gdGhlIHJlZ2VuZXJhdG9yUnVudGltZSB2YXJpYWJsZSBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS5cbiAgdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiA/IG1vZHVsZS5leHBvcnRzIDoge31cbikpO1xuXG50cnkge1xuICByZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lO1xufSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHtcbiAgLy8gVGhpcyBtb2R1bGUgc2hvdWxkIG5vdCBiZSBydW5uaW5nIGluIHN0cmljdCBtb2RlLCBzbyB0aGUgYWJvdmVcbiAgLy8gYXNzaWdubWVudCBzaG91bGQgYWx3YXlzIHdvcmsgdW5sZXNzIHNvbWV0aGluZyBpcyBtaXNjb25maWd1cmVkLiBKdXN0XG4gIC8vIGluIGNhc2UgcnVudGltZS5qcyBhY2NpZGVudGFsbHkgcnVucyBpbiBzdHJpY3QgbW9kZSwgaW4gbW9kZXJuIGVuZ2luZXNcbiAgLy8gd2UgY2FuIGV4cGxpY2l0bHkgYWNjZXNzIGdsb2JhbFRoaXMuIEluIG9sZGVyIGVuZ2luZXMgd2UgY2FuIGVzY2FwZVxuICAvLyBzdHJpY3QgbW9kZSB1c2luZyBhIGdsb2JhbCBGdW5jdGlvbiBjYWxsLiBUaGlzIGNvdWxkIGNvbmNlaXZhYmx5IGZhaWxcbiAgLy8gaWYgYSBDb250ZW50IFNlY3VyaXR5IFBvbGljeSBmb3JiaWRzIHVzaW5nIEZ1bmN0aW9uLCBidXQgaW4gdGhhdCBjYXNlXG4gIC8vIHRoZSBwcm9wZXIgc29sdXRpb24gaXMgdG8gZml4IHRoZSBhY2NpZGVudGFsIHN0cmljdCBtb2RlIHByb2JsZW0uIElmXG4gIC8vIHlvdSd2ZSBtaXNjb25maWd1cmVkIHlvdXIgYnVuZGxlciB0byBmb3JjZSBzdHJpY3QgbW9kZSBhbmQgYXBwbGllZCBhXG4gIC8vIENTUCB0byBmb3JiaWQgRnVuY3Rpb24sIGFuZCB5b3UncmUgbm90IHdpbGxpbmcgdG8gZml4IGVpdGhlciBvZiB0aG9zZVxuICAvLyBwcm9ibGVtcywgcGxlYXNlIGRldGFpbCB5b3VyIHVuaXF1ZSBwcmVkaWNhbWVudCBpbiBhIEdpdEh1YiBpc3N1ZS5cbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSBcIm9iamVjdFwiKSB7XG4gICAgZ2xvYmFsVGhpcy5yZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lO1xuICB9IGVsc2Uge1xuICAgIEZ1bmN0aW9uKFwiclwiLCBcInJlZ2VuZXJhdG9yUnVudGltZSA9IHJcIikocnVudGltZSk7XG4gIH1cbn1cbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIiLCIvLyBzdGFydHVwXG4vLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8vIFRoaXMgZW50cnkgbW9kdWxlIGlzIHJlZmVyZW5jZWQgYnkgb3RoZXIgbW9kdWxlcyBzbyBpdCBjYW4ndCBiZSBpbmxpbmVkXG52YXIgX193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oXCIuL25vZGVfbW9kdWxlcy9yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanNcIik7XG4iLCIiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/src/index.js b/src/index.js index 69b1b3b..9880f7b 100644 --- a/src/index.js +++ b/src/index.js @@ -20,7 +20,7 @@ import asteroidAttackLevelUp3 from './video/Asteroid_Attack_Level_Up_3.mp4'; import asteroidAttackLevelUp4 from './video/Asteroid_Attack_Level_Up_4.mp4'; import asteroidAttackLevelUp5 from './video/Asteroid_Attack_Level_Up_5.mp4'; import { rootDoc } from './firebaseConfig'; -import { jsPsychPavlovia } from './jsPsychPavlovia'; +import jsPsychPavlovia from './jsPsychPavlovia'; // Set up all experiment related info here const jsPsychForURL = initJsPsych(); @@ -83,11 +83,15 @@ const jsPsych = initJsPsych(); const timeline = []; /* init connection with pavlovia.org */ -const pavloviaInit = { - type: jsPsychPavlovia(jsPsych), - command: 'init', -}; -timeline.push(pavloviaInit); +const isOnPavlovia = window.location.href.includes('run.pavlovia.org'); + +if (isOnPavlovia) { + const pavloviaInit = { + type: jsPsychPavlovia, + command: 'init', + }; + timeline.push(pavloviaInit); +} const getPid = { type: surveyText, @@ -480,12 +484,14 @@ timeline.push(MotionCohProcedure); timeline.push(IBIEnd); /* finish connection with pavlovia.org */ -const pavloviaFinish = { - type: jsPsychPavlovia(jsPsych), - command: 'finish', - participantId, -}; -timeline.push(pavloviaFinish); +if (isOnPavlovia) { + const pavloviaFinish = { + type: jsPsychPavlovia, + command: 'finish', + participantId, + }; + timeline.push(pavloviaFinish); +} // ---------Run the experiment--------- jsPsych.run(timeline); diff --git a/src/jsPsychPavlovia.js b/src/jsPsychPavlovia.js index 14755eb..846b1ac 100644 --- a/src/jsPsychPavlovia.js +++ b/src/jsPsychPavlovia.js @@ -1,3 +1,5 @@ +import { ParameterType } from 'jspsych'; + /* eslint-disable */ /** * jsPsych plugin (version > 7.0) for pavlovia.org @@ -12,640 +14,635 @@ * @license Distributed under the terms of the MIT License */ -export const jsPsychPavlovia = (jsPsych) => { - 'use strict'; +/** + * **pavlovia** + * + * This plugin handles communications with the pavlovia.org server: it opens and closes sessions, + * and uploads data to the server. + * + * @author Alain Pitiot + * @see {@link https://pavlovia.org/docs/experiments/create-jsPsych Running jsPsych experiments from Pavlovia} + */ +class PavloviaPlugin { + constructor(jsPsych) { + this._jsPsych = jsPsych; + } /** - * **pavlovia** - * - * This plugin handles communications with the pavlovia.org server: it opens and closes sessions, - * and uploads data to the server. + * Run the plugin. * - * @author Alain Pitiot - * @see {@link https://pavlovia.org/docs/experiments/create-jsPsych Running jsPsych experiments from Pavlovia} + * @param {HTMLElement} display_element - the HTML DOM element where jsPsych content + * is rendered + * @param {Object} trial - the jsPsych trial + * @public */ - class PavloviaPlugin { - constructor(jsPsych) { - this._jsPsych = jsPsych; + async trial(display_element, trial) { + // execute the command: + switch (trial.command.toLowerCase()) { + case 'init': + await this._init(trial); + break; + + case 'finish': + const data = this._jsPsych.data.get().csv(); + await this._finish(trial, data); + break; + + default: + trial.errorCallback('unknown command: ' + trial.command); } - /** - * Run the plugin. - * - * @param {HTMLElement} display_element - the HTML DOM element where jsPsych content - * is rendered - * @param {Object} trial - the jsPsych trial - * @public - */ - async trial(display_element, trial) { - // execute the command: - switch (trial.command.toLowerCase()) { - case 'init': - await this._init(trial); - break; - - case 'finish': - const data = this._jsPsych.data.get().csv(); - await this._finish(trial, data); - break; - - default: - trial.errorCallback('unknown command: ' + trial.command); - } + // end trial + this._jsPsych.finishTrial(); + } - // end trial - this._jsPsych.finishTrial(); + /** + * The default error callback function. + * + * Error messages are displayed in the body of the document and in the browser's console. + * + * @param {Object} error - the error json object to be displayed. + * @public + */ + static defaultErrorCallback(error) { + // output the error to the console: + console.error('[pavlovia ' + PavloviaPlugin.version + ']', error); + + // output the error to the html body: + let htmlCode = + '

[jspsych-pavlovia plugin ' + + PavloviaPlugin.version + + '] Error

    '; + while (true) { + if (typeof error === 'object' && 'context' in error) { + htmlCode += '
  • ' + error.context + '
  • '; + error = error.error; + } else { + htmlCode += '
  • ' + error + '
  • '; + break; + } } + htmlCode += '
'; + document.querySelector('body').innerHTML = htmlCode; + } - /** - * The default error callback function. - * - * Error messages are displayed in the body of the document and in the browser's console. - * - * @param {Object} error - the error json object to be displayed. - * @public - */ - static defaultErrorCallback(error) { - // output the error to the console: - console.error('[pavlovia ' + PavloviaPlugin.version + ']', error); - - // output the error to the html body: - let htmlCode = - '

[jspsych-pavlovia plugin ' + - PavloviaPlugin.version + - '] Error

    '; - while (true) { - if (typeof error === 'object' && 'context' in error) { - htmlCode += '
  • ' + error.context + '
  • '; - error = error.error; - } else { - htmlCode += '
  • ' + error + '
  • '; - break; + /** + * The default data filter, applied to the data gathered by jsPsych, before they are + * uploaded to the server. + * + * The filter typically prunes and reformat jsPsych.data.get().csv(). + * + * @param {Object} data - input data, typically from jsPsych.data.get().csv() + * @returns filtered data, ready for upload to the server + * @public + */ + static defaultDataFilter(data) { + return data; + } + + /** + * Initialise the connection with pavlovia.org: configure the plugin and open a new session. + * + * @param {Object} trial - the jsPsych trial + * @param {string} [configURL= "config.json"] - the URL of the pavlovia.org json configuration file + * @returns {Promise} + * @private + */ + async _init(trial, configURL = 'config.json') { + try { + // configure: + let response = await this._configure(configURL); + PavloviaPlugin._config = response.config; + this._log('init | _configure.response=', response); + + // open a new session: + response = await this._openSession(); + // _config.experiment.token = response.token; + this._log('init | _openSession.response=', response); + + // warn the user when they attempt to close the tab or browser: + const _beforeunloadCallback = (event) => { + // preventDefault should ensure that the user gets prompted: + event.preventDefault(); + + // Chrome requires returnValue to be set: + event.returnValue = ''; + }; + window.addEventListener('beforeunload', _beforeunloadCallback); + + // when the user closes the tab or browser, we attempt to close the session + // and optionally save the results + // note: we communicate with the server using the Beacon API + window.addEventListener('unload', (event) => { + if (PavloviaPlugin._config.session.status === 'OPEN') { + // get and save the incomplete results if need be: + if (PavloviaPlugin._config.experiment.saveIncompleteResults) { + const data = this._jsPsych.data.get().csv(); + this._save(trial, data, true); + } + + // close the session: + this._closeSession(false, true); } - } - htmlCode += '
'; - document.querySelector('body').innerHTML = htmlCode; + }); + } catch (error) { + trial.errorCallback(error); } + } - /** - * The default data filter, applied to the data gathered by jsPsych, before they are - * uploaded to the server. - * - * The filter typically prunes and reformat jsPsych.data.get().csv(). - * - * @param {Object} data - input data, typically from jsPsych.data.get().csv() - * @returns filtered data, ready for upload to the server - * @public - */ - static defaultDataFilter(data) { - return data; + /** + * Finish the connection with pavlovia.org: upload the collected data and close the session. + * + * @param {Object} trial - the jsPsych trial + * @param {Object} data - the experiment data to be uploaded + * @returns {Promise} + * @private + */ + async _finish(trial, data) { + try { + // remove the beforeunload listener: + window.removeEventListener( + 'beforeunload', + PavloviaPlugin._beforeunloadCallback + ); + + // tell the participant that the data is being uploaded: + const msg = + 'Please wait a moment while the data are uploaded to the pavlovia.org server...'; + const displayElement = this._jsPsych.getDisplayElement(); + displayElement.innerHTML = '
';
+      document.getElementById('pavlovia-data-upload').textContent = msg;
+
+      // upload the data to pavlovia.org:
+      const sync = typeof trial.sync !== 'undefined' ? trial.sync : false;
+      let response = await this._save(trial, data, sync);
+      this._log('finish | _save.response=', response);
+
+      // check for errors:
+      if ('serverData' in response && 'error' in response.serverData) {
+        throw response.serverData;
+      }
+
+      // close the session:
+      response = await this._closeSession(true, false);
+      this._log('finish | _closeSession.response=', response);
+    } catch (error) {
+      trial.errorCallback(error);
     }
+  }
 
-    /**
-     * Initialise the connection with pavlovia.org: configure the plugin and open a new session.
-     *
-     * @param {Object} trial - the jsPsych trial
-     * @param {string} [configURL= "config.json"] - the URL of the pavlovia.org json configuration file
-     * @returns {Promise}
-     * @private
-     */
-    async _init(trial, configURL = 'config.json') {
-      try {
-        // configure:
-        let response = await this._configure(configURL);
-        PavloviaPlugin._config = response.config;
-        this._log('init | _configure.response=', response);
-
-        // open a new session:
-        response = await this._openSession();
-        // _config.experiment.token = response.token;
-        this._log('init | _openSession.response=', response);
-
-        // warn the user when they attempt to close the tab or browser:
-        const _beforeunloadCallback = (event) => {
-          // preventDefault should ensure that the user gets prompted:
-          event.preventDefault();
-
-          // Chrome requires returnValue to be set:
-          event.returnValue = '';
+  /**
+   * Configure the plugin by reading the configuration file created upon activation
+   * of the experiment.
+   *
+   * @param {string} [configURL= "config.json"] - the URL of the pavlovia.org json
+   * 	configuration file
+   * @returns {Promise}
+   * @private
+   */
+  async _configure(configURL) {
+    let response = {
+      origin: '_configure',
+      context: 'when configuring the plugin',
+    };
+
+    try {
+      const configurationResponse = await this._getConfiguration(configURL);
+
+      // legacy experiments had a psychoJsManager block instead of a pavlovia block, and the URL
+      // pointed to https://pavlovia.org/server
+      if ('psychoJsManager' in configurationResponse.config) {
+        delete configurationResponse.config.psychoJsManager;
+        configurationResponse.config.pavlovia = {
+          URL: 'https://pavlovia.org',
         };
-        window.addEventListener('beforeunload', _beforeunloadCallback);
-
-        // when the user closes the tab or browser, we attempt to close the session
-        // and optionally save the results
-        // note: we communicate with the server using the Beacon API
-        window.addEventListener('unload', (event) => {
-          if (PavloviaPlugin._config.session.status === 'OPEN') {
-            // get and save the incomplete results if need be:
-            if (PavloviaPlugin._config.experiment.saveIncompleteResults) {
-              const data = this._jsPsych.data.get().csv();
-              this._save(trial, data, true);
-            }
-
-            // close the session:
-            this._closeSession(false, true);
-          }
-        });
-      } catch (error) {
-        trial.errorCallback(error);
       }
-    }
 
-    /**
-     * Finish the connection with pavlovia.org: upload the collected data and close the session.
-     *
-     * @param {Object} trial - the jsPsych trial
-     * @param {Object} data - the experiment data to be uploaded
-     * @returns {Promise}
-     * @private
-     */
-    async _finish(trial, data) {
-      try {
-        // remove the beforeunload listener:
-        window.removeEventListener(
-          'beforeunload',
-          PavloviaPlugin._beforeunloadCallback
-        );
+      // tests for the presence of essential blocks in the configuration:
+      if (!('experiment' in configurationResponse.config)) {
+        throw 'missing experiment block in configuration';
+      }
+      if (!('name' in configurationResponse.config.experiment)) {
+        throw 'missing name in experiment block in configuration';
+      }
+      if (!('fullpath' in configurationResponse.config.experiment)) {
+        throw 'missing fullpath in experiment block in configuration';
+      }
+      if (!('pavlovia' in configurationResponse.config)) {
+        throw 'missing pavlovia block in configuration';
+      }
+      if (!('URL' in configurationResponse.config.pavlovia)) {
+        throw 'missing URL in pavlovia block in configuration';
+      }
 
-        // tell the participant that the data is being uploaded:
-        const msg =
-          'Please wait a moment while the data are uploaded to the pavlovia.org server...';
-        const displayElement = this._jsPsych.getDisplayElement();
-        displayElement.innerHTML = '
';
-        document.getElementById('pavlovia-data-upload').textContent = msg;
-
-        // upload the data to pavlovia.org:
-        const sync = typeof trial.sync !== 'undefined' ? trial.sync : false;
-        let response = await this._save(trial, data, sync);
-        this._log('finish | _save.response=', response);
-
-        // check for errors:
-        if ('serverData' in response && 'error' in response.serverData) {
-          throw response.serverData;
+      // get the server parameters (those starting with a double underscore):
+      const urlQuery = window.location.search.slice(1);
+      const urlParameters = new URLSearchParams(urlQuery);
+      urlParameters.forEach((value, key) => {
+        if (key.indexOf('__') === 0) {
+          PavloviaPlugin._serverMsg.set(key, value);
         }
+      });
 
-        // close the session:
-        response = await this._closeSession(true, false);
-        this._log('finish | _closeSession.response=', response);
+      return configurationResponse;
+    } catch (error) {
+      throw { ...response, error };
+    }
+  }
+
+  /**
+   * Get the pavlovia.org json configuration file.
+   *
+   * @param {string} configURL - the URL of the pavlovia.org json configuration file
+   * @returns {Promise}
+   * @private
+   */
+  _getConfiguration(configURL) {
+    let response = {
+      origin: '_getConfiguration',
+      context: 'when reading the configuration file: ' + configURL,
+    };
+
+    return new Promise(async (resolve, reject) => {
+      try {
+        // query the pavlovia server:
+        const serverResponse = await fetch(configURL, {
+          method: 'GET',
+          mode: 'cors',
+          cache: 'no-cache',
+          credentials: 'same-origin',
+          headers: {
+            'Content-Type': 'application/json',
+          },
+          redirect: 'follow',
+          referrerPolicy: 'no-referrer',
+        });
+        const serverData = await serverResponse.json();
+
+        resolve({ ...response, config: serverData });
       } catch (error) {
-        trial.errorCallback(error);
+        console.error(error);
+        reject({ ...response, error });
       }
-    }
+    });
+  }
 
-    /**
-     * Configure the plugin by reading the configuration file created upon activation
-     * of the experiment.
-     *
-     * @param {string} [configURL= "config.json"] - the URL of the pavlovia.org json
-     * 	configuration file
-     * @returns {Promise}
-     * @private
-     */
-    async _configure(configURL) {
-      let response = {
-        origin: '_configure',
-        context: 'when configuring the plugin',
-      };
+  /**
+   * Open a new session for this experiment on pavlovia.org.
+   *
+   * @returns {Promise}
+   * @private
+   */
+  _openSession() {
+    let response = {
+      origin: '_openSession',
+      context:
+        'when opening a session for experiment: ' +
+        PavloviaPlugin._config.experiment.fullpath,
+    };
+
+    // prepare a POST query:
+    const formData = new FormData();
+    if (PavloviaPlugin._serverMsg.has('__pilotToken')) {
+      formData.append(
+        'pilotToken',
+        PavloviaPlugin._serverMsg.get('__pilotToken')
+      );
+    }
 
+    // query pavlovia server:
+    return new Promise(async (resolve, reject) => {
+      const url = `${PavloviaPlugin._config.pavlovia.URL}/api/v2/experiments/${PavloviaPlugin._config.gitlab.projectId}/sessions`;
       try {
-        const configurationResponse = await this._getConfiguration(configURL);
-
-        // legacy experiments had a psychoJsManager block instead of a pavlovia block, and the URL
-        // pointed to https://pavlovia.org/server
-        if ('psychoJsManager' in configurationResponse.config) {
-          delete configurationResponse.config.psychoJsManager;
-          configurationResponse.config.pavlovia = {
-            URL: 'https://pavlovia.org',
-          };
-        }
+        // query the pavlovia server:
+        const serverResponse = await fetch(url, {
+          method: 'POST',
+          mode: 'cors',
+          cache: 'no-cache',
+          credentials: 'same-origin',
+          headers: {
+            'Content-Type': 'application/json',
+          },
+          redirect: 'follow',
+          referrerPolicy: 'no-referrer',
+          body: formData,
+        });
+        const serverData = await serverResponse.json();
 
-        // tests for the presence of essential blocks in the configuration:
-        if (!('experiment' in configurationResponse.config)) {
-          throw 'missing experiment block in configuration';
-        }
-        if (!('name' in configurationResponse.config.experiment)) {
-          throw 'missing name in experiment block in configuration';
-        }
-        if (!('fullpath' in configurationResponse.config.experiment)) {
-          throw 'missing fullpath in experiment block in configuration';
-        }
-        if (!('pavlovia' in configurationResponse.config)) {
-          throw 'missing pavlovia block in configuration';
+        // check for required attributes:
+        if (!('token' in serverData)) {
+          reject(
+            Object.assign(response, {
+              error: 'unexpected answer from server: no token',
+            })
+          );
         }
-        if (!('URL' in configurationResponse.config.pavlovia)) {
-          throw 'missing URL in pavlovia block in configuration';
+        if (!('experiment' in serverData)) {
+          reject(
+            Object.assign(response, {
+              error: 'unexpected answer from server: no experiment',
+            })
+          );
         }
 
-        // get the server parameters (those starting with a double underscore):
-        const urlQuery = window.location.search.slice(1);
-        const urlParameters = new URLSearchParams(urlQuery);
-        urlParameters.forEach((value, key) => {
-          if (key.indexOf('__') === 0) {
-            PavloviaPlugin._serverMsg.set(key, value);
-          }
-        });
-
-        return configurationResponse;
+        // update the configuration:
+        PavloviaPlugin._config.session = {
+          token: serverData.token,
+          status: 'OPEN',
+        };
+        PavloviaPlugin._config.experiment.status =
+          serverData.experiment.status2;
+        PavloviaPlugin._config.experiment.saveFormat = Symbol.for(
+          serverData.experiment.saveFormat
+        );
+        PavloviaPlugin._config.experiment.saveIncompleteResults =
+          serverData.experiment.saveIncompleteResults;
+        PavloviaPlugin._config.experiment.license =
+          serverData.experiment.license;
+        PavloviaPlugin._config.runMode = serverData.experiment.runMode;
+
+        resolve(
+          Object.assign(response, {
+            token: serverData.token,
+            status: serverData.experiment.status2,
+          })
+        );
       } catch (error) {
-        throw { ...response, error };
+        console.error(error);
+        reject({ ...response, error });
       }
-    }
-
-    /**
-     * Get the pavlovia.org json configuration file.
-     *
-     * @param {string} configURL - the URL of the pavlovia.org json configuration file
-     * @returns {Promise}
-     * @private
-     */
-    _getConfiguration(configURL) {
-      let response = {
-        origin: '_getConfiguration',
-        context: 'when reading the configuration file: ' + configURL,
-      };
+    });
+  }
 
+  /**
+   * Close the previously opened session on pavlovia.org.
+   *
+   * @param {boolean} isCompleted - whether or not the participant completed the experiment
+   * @param {boolean} [sync = false] - whether or not to use the Beacon API to communicate
+   * 	with the server
+   * @private
+   */
+  _closeSession(isCompleted = true, sync = false) {
+    let response = {
+      origin: '_closeSession',
+      context:
+        'when closing the session for experiment: ' +
+        PavloviaPlugin._config.experiment.fullpath,
+    };
+
+    // prepare a DELETE query:
+    const url =
+      PavloviaPlugin._config.pavlovia.URL +
+      '/api/v2/experiments/' +
+      PavloviaPlugin._config.gitlab.projectId +
+      '/sessions/' +
+      PavloviaPlugin._config.session.token;
+    const formData = new FormData();
+    formData.append('isCompleted', isCompleted);
+
+    // synchronously query the pavlovia server:
+    if (sync) {
+      navigator.sendBeacon(url + '/delete', formData);
+      PavloviaPlugin._config.session.status = 'CLOSED';
+    } else {
+      // asynchronously query the pavlovia server:
       return new Promise(async (resolve, reject) => {
         try {
           // query the pavlovia server:
-          const serverResponse = await fetch(configURL, {
-            method: 'GET',
+          const serverResponse = await fetch(url, {
+            method: 'DELETE',
             mode: 'cors',
             cache: 'no-cache',
             credentials: 'same-origin',
-            headers: {
-              'Content-Type': 'application/json',
-            },
             redirect: 'follow',
             referrerPolicy: 'no-referrer',
+            body: formData,
           });
           const serverData = await serverResponse.json();
 
-          resolve({ ...response, config: serverData });
+          PavloviaPlugin._config.session.status = 'CLOSED';
+          resolve(Object.assign(response, { serverData }));
         } catch (error) {
           console.error(error);
           reject({ ...response, error });
         }
       });
     }
+  }
 
-    /**
-     * Open a new session for this experiment on pavlovia.org.
-     *
-     * @returns {Promise}
-     * @private
-     */
-    _openSession() {
-      let response = {
-        origin: '_openSession',
+  /**
+   * Upload data to the pavlovia.org server.
+   *
+   * @param {Object} trial - the jsPsych trial
+   * @param {string} data - the experiment data to be uploaded
+   * @param {boolean} [sync = false] - whether or not to use the Beacon API to communicate
+   * 	with the server
+   * @return {Promise}
+   * @private
+   */
+  async _save(trial, data, sync = false) {
+    const date = new Date();
+    let dateString =
+      date.getFullYear() +
+      '-' +
+      ('0' + (1 + date.getMonth())).slice(-2) +
+      '-' +
+      ('0' + date.getDate()).slice(-2) +
+      '_';
+    dateString +=
+      ('0' + date.getHours()).slice(-2) +
+      'h' +
+      ('0' + date.getMinutes()).slice(-2) +
+      '.' +
+      ('0' + date.getSeconds()).slice(-2) +
+      '.' +
+      date.getMilliseconds();
+
+    const key =
+      PavloviaPlugin._config.experiment.name +
+      '_' +
+      trial.participantId +
+      '_' +
+      'SESSION' +
+      '_' +
+      dateString +
+      '.csv';
+    const filteredData = trial.dataFilter(data);
+
+    if (
+      PavloviaPlugin._config.experiment.status === 'RUNNING' &&
+      !PavloviaPlugin._serverMsg.has('__pilotToken')
+    ) {
+      return await this._uploadData(key, filteredData, sync);
+    } else {
+      this._offerDataForDownload(key, filteredData, 'text/csv');
+      return {
+        origin: '_save',
         context:
-          'when opening a session for experiment: ' +
+          'when saving results for experiment: ' +
           PavloviaPlugin._config.experiment.fullpath,
+        message: 'offered the .csv file for download',
       };
+    }
+  }
 
-      // prepare a POST query:
-      const formData = new FormData();
-      if (PavloviaPlugin._serverMsg.has('__pilotToken')) {
-        formData.append(
-          'pilotToken',
-          PavloviaPlugin._serverMsg.get('__pilotToken')
-        );
-      }
-
-      // query pavlovia server:
+  /**
+   * Upload data (a key/value pair) to pavlovia.org.
+   *
+   * @param {string} key - the key
+   * @param {string} value - the value
+   * @param {boolean} [sync = false] - whether or not to upload the data using the Beacon API
+   * @returns {Promise}
+   * @private
+   */
+  _uploadData(key, value, sync = false) {
+    let response = {
+      origin: '_uploadData',
+      context:
+        "when uploading participant' results for experiment: " +
+        PavloviaPlugin._config.experiment.fullpath,
+    };
+
+    const url =
+      PavloviaPlugin._config.pavlovia.URL +
+      '/api/v2/experiments/' +
+      PavloviaPlugin._config.gitlab.projectId +
+      '/sessions/' +
+      PavloviaPlugin._config.session.token +
+      '/results';
+
+    const formData = new FormData();
+    formData.append('key', key);
+    formData.append('value', value);
+
+    // synchronous query the pavlovia server:
+    if (sync) {
+      navigator.sendBeacon(url, formData);
+    }
+    // asynchronously query the pavlovia server:
+    else {
       return new Promise(async (resolve, reject) => {
-        const url = `${PavloviaPlugin._config.pavlovia.URL}/api/v2/experiments/${PavloviaPlugin._config.gitlab.projectId}/sessions`;
         try {
-          // query the pavlovia server:
           const serverResponse = await fetch(url, {
             method: 'POST',
             mode: 'cors',
             cache: 'no-cache',
             credentials: 'same-origin',
-            headers: {
-              'Content-Type': 'application/json',
-            },
             redirect: 'follow',
             referrerPolicy: 'no-referrer',
             body: formData,
           });
           const serverData = await serverResponse.json();
 
-          // check for required attributes:
-          if (!('token' in serverData)) {
-            reject(
-              Object.assign(response, {
-                error: 'unexpected answer from server: no token',
-              })
-            );
-          }
-          if (!('experiment' in serverData)) {
-            reject(
-              Object.assign(response, {
-                error: 'unexpected answer from server: no experiment',
-              })
-            );
-          }
-
-          // update the configuration:
-          PavloviaPlugin._config.session = {
-            token: serverData.token,
-            status: 'OPEN',
-          };
-          PavloviaPlugin._config.experiment.status =
-            serverData.experiment.status2;
-          PavloviaPlugin._config.experiment.saveFormat = Symbol.for(
-            serverData.experiment.saveFormat
-          );
-          PavloviaPlugin._config.experiment.saveIncompleteResults =
-            serverData.experiment.saveIncompleteResults;
-          PavloviaPlugin._config.experiment.license =
-            serverData.experiment.license;
-          PavloviaPlugin._config.runMode = serverData.experiment.runMode;
-
-          resolve(
-            Object.assign(response, {
-              token: serverData.token,
-              status: serverData.experiment.status2,
-            })
-          );
+          resolve(Object.assign(response, { serverData }));
         } catch (error) {
           console.error(error);
           reject({ ...response, error });
         }
       });
     }
-
-    /**
-     * Close the previously opened session on pavlovia.org.
-     *
-     * @param {boolean} isCompleted - whether or not the participant completed the experiment
-     * @param {boolean} [sync = false] - whether or not to use the Beacon API to communicate
-     * 	with the server
-     * @private
-     */
-    _closeSession(isCompleted = true, sync = false) {
-      let response = {
-        origin: '_closeSession',
-        context:
-          'when closing the session for experiment: ' +
-          PavloviaPlugin._config.experiment.fullpath,
-      };
-
-      // prepare a DELETE query:
-      const url =
-        PavloviaPlugin._config.pavlovia.URL +
-        '/api/v2/experiments/' +
-        PavloviaPlugin._config.gitlab.projectId +
-        '/sessions/' +
-        PavloviaPlugin._config.session.token;
-      const formData = new FormData();
-      formData.append('isCompleted', isCompleted);
-
-      // synchronously query the pavlovia server:
-      if (sync) {
-        navigator.sendBeacon(url + '/delete', formData);
-        PavloviaPlugin._config.session.status = 'CLOSED';
-      } else {
-        // asynchronously query the pavlovia server:
-        return new Promise(async (resolve, reject) => {
-          try {
-            // query the pavlovia server:
-            const serverResponse = await fetch(url, {
-              method: 'DELETE',
-              mode: 'cors',
-              cache: 'no-cache',
-              credentials: 'same-origin',
-              redirect: 'follow',
-              referrerPolicy: 'no-referrer',
-              body: formData,
-            });
-            const serverData = await serverResponse.json();
-
-            PavloviaPlugin._config.session.status = 'CLOSED';
-            resolve(Object.assign(response, { serverData }));
-          } catch (error) {
-            console.error(error);
-            reject({ ...response, error });
-          }
-        });
-      }
-    }
-
-    /**
-     * Upload data to the pavlovia.org server.
-     *
-     * @param {Object} trial - the jsPsych trial
-     * @param {string} data - the experiment data to be uploaded
-     * @param {boolean} [sync = false] - whether or not to use the Beacon API to communicate
-     * 	with the server
-     * @return {Promise}
-     * @private
-     */
-    async _save(trial, data, sync = false) {
-      const date = new Date();
-      let dateString =
-        date.getFullYear() +
-        '-' +
-        ('0' + (1 + date.getMonth())).slice(-2) +
-        '-' +
-        ('0' + date.getDate()).slice(-2) +
-        '_';
-      dateString +=
-        ('0' + date.getHours()).slice(-2) +
-        'h' +
-        ('0' + date.getMinutes()).slice(-2) +
-        '.' +
-        ('0' + date.getSeconds()).slice(-2) +
-        '.' +
-        date.getMilliseconds();
-
-      const key =
-        PavloviaPlugin._config.experiment.name +
-        '_' +
-        trial.participantId +
-        '_' +
-        'SESSION' +
-        '_' +
-        dateString +
-        '.csv';
-      const filteredData = trial.dataFilter(data);
-
-      if (
-        PavloviaPlugin._config.experiment.status === 'RUNNING' &&
-        !PavloviaPlugin._serverMsg.has('__pilotToken')
-      ) {
-        return await this._uploadData(key, filteredData, sync);
-      } else {
-        this._offerDataForDownload(key, filteredData, 'text/csv');
-        return {
-          origin: '_save',
-          context:
-            'when saving results for experiment: ' +
-            PavloviaPlugin._config.experiment.fullpath,
-          message: 'offered the .csv file for download',
-        };
-      }
-    }
-
-    /**
-     * Upload data (a key/value pair) to pavlovia.org.
-     *
-     * @param {string} key - the key
-     * @param {string} value - the value
-     * @param {boolean} [sync = false] - whether or not to upload the data using the Beacon API
-     * @returns {Promise}
-     * @private
-     */
-    _uploadData(key, value, sync = false) {
-      let response = {
-        origin: '_uploadData',
-        context:
-          "when uploading participant' results for experiment: " +
-          PavloviaPlugin._config.experiment.fullpath,
-      };
-
-      const url =
-        PavloviaPlugin._config.pavlovia.URL +
-        '/api/v2/experiments/' +
-        PavloviaPlugin._config.gitlab.projectId +
-        '/sessions/' +
-        PavloviaPlugin._config.session.token +
-        '/results';
-
-      const formData = new FormData();
-      formData.append('key', key);
-      formData.append('value', value);
-
-      // synchronous query the pavlovia server:
-      if (sync) {
-        navigator.sendBeacon(url, formData);
-      }
-      // asynchronously query the pavlovia server:
-      else {
-        return new Promise(async (resolve, reject) => {
-          try {
-            const serverResponse = await fetch(url, {
-              method: 'POST',
-              mode: 'cors',
-              cache: 'no-cache',
-              credentials: 'same-origin',
-              redirect: 'follow',
-              referrerPolicy: 'no-referrer',
-              body: formData,
-            });
-            const serverData = await serverResponse.json();
-
-            resolve(Object.assign(response, { serverData }));
-          } catch (error) {
-            console.error(error);
-            reject({ ...response, error });
-          }
-        });
-      }
-    }
-
-    /**
-     * Log messages to the browser's console.
-     *
-     * @param {...*} messages - the messages to be displayed in the browser's console
-     * @private
-     */
-    _log(...messages) {
-      console.log('[pavlovia ' + PavloviaPlugin.version + ']', ...messages);
-    }
-
-    /**
-     * Offer data as download in the browser.
-     *
-     * @param {string} filename - the name of the file to be downloaded
-     * @param {*} data - the data
-     * @param {string} type - the MIME type of the data, e.g. 'text/csv' or 'application/json'
-     * @private
-     */
-    _offerDataForDownload(filename, data, type) {
-      const blob = new Blob([data], { type });
-
-      if (window.navigator.msSaveOrOpenBlob) {
-        window.navigator.msSaveBlob(blob, filename);
-      } else {
-        const elem = window.document.createElement('a');
-        elem.href = window.URL.createObjectURL(blob);
-        elem.download = filename;
-        document.body.appendChild(elem);
-        elem.click();
-        document.body.removeChild(elem);
-      }
-    }
   }
 
   /**
-   * Plugin version:
-   * @public
-   */
-  PavloviaPlugin.version = '2022.1.1';
-
-  /**
-   * The pavlovia.org configuration (usually read from the config.json configuration file).
+   * Log messages to the browser's console.
    *
-   * @type {Object}
+   * @param {...*} messages - the messages to be displayed in the browser's console
    * @private
    */
-  PavloviaPlugin._config = {};
+  _log(...messages) {
+    console.log('[pavlovia ' + PavloviaPlugin.version + ']', ...messages);
+  }
 
   /**
-   * The callback for the beforeunload event, which is triggered when the participant
-   * tries to leave the experiment by closing the tab or browser.
+   * Offer data as download in the browser.
    *
-   * @type {null}
+   * @param {string} filename - the name of the file to be downloaded
+   * @param {*} data - the data
+   * @param {string} type - the MIME type of the data, e.g. 'text/csv' or 'application/json'
    * @private
    */
-  PavloviaPlugin._beforeunloadCallback = null;
+  _offerDataForDownload(filename, data, type) {
+    const blob = new Blob([data], { type });
+
+    if (window.navigator.msSaveOrOpenBlob) {
+      window.navigator.msSaveBlob(blob, filename);
+    } else {
+      const elem = window.document.createElement('a');
+      elem.href = window.URL.createObjectURL(blob);
+      elem.download = filename;
+      document.body.appendChild(elem);
+      elem.click();
+      document.body.removeChild(elem);
+    }
+  }
+}
 
-  /**
-   * The server parameters (those starting with a double underscore).
-   *
-   * @type {Object}
-   * @private
-   */
-  PavloviaPlugin._serverMsg = new Map();
+/**
+ * Plugin version:
+ * @public
+ */
+PavloviaPlugin.version = '2022.1.1';
 
-  /**
-   * Plugin information.
-   * @public
-   */
-  PavloviaPlugin.info = {
-    name: 'pavlovia',
-    description: 'communication with pavlovia.org',
-    parameters: {
-      command: {
-        type: jsPsych.ParameterType.STRING,
-        pretty_name: 'Command',
-        default: 'init',
-        description: 'The pavlovia command: "init" (default) or "finish"',
-      },
-      participantId: {
-        type: jsPsych.ParameterType.STRING,
-        pretty_name: 'Participant Id',
-        default: 'PARTICIPANT',
-        description:
-          'The participant Id: "PARTICIPANT" (default) or any string',
-      },
-      errorCallback: {
-        type: jsPsych.ParameterType.FUNCTION,
-        pretty_name: 'ErrorCallback',
-        default: PavloviaPlugin.defaultErrorCallback,
-        description:
-          'The callback function called whenever an error has occurred',
-      },
-      dataFilter: {
-        type: jsPsych.ParameterType.FUNCTION,
-        pretty_name: 'DataFilter',
-        default: PavloviaPlugin.defaultDataFilter,
-        description:
-          'The filter applied to the data gathered by jsPsych before upload to the server',
-      },
-    },
-  };
+/**
+ * The pavlovia.org configuration (usually read from the config.json configuration file).
+ *
+ * @type {Object}
+ * @private
+ */
+PavloviaPlugin._config = {};
 
-  return PavloviaPlugin;
+/**
+ * The callback for the beforeunload event, which is triggered when the participant
+ * tries to leave the experiment by closing the tab or browser.
+ *
+ * @type {null}
+ * @private
+ */
+PavloviaPlugin._beforeunloadCallback = null;
+
+/**
+ * The server parameters (those starting with a double underscore).
+ *
+ * @type {Object}
+ * @private
+ */
+PavloviaPlugin._serverMsg = new Map();
+
+/**
+ * Plugin information.
+ * @public
+ */
+PavloviaPlugin.info = {
+  name: 'pavlovia',
+  description: 'communication with pavlovia.org',
+  parameters: {
+    command: {
+      type: ParameterType.STRING,
+      pretty_name: 'Command',
+      default: 'init',
+      description: 'The pavlovia command: "init" (default) or "finish"',
+    },
+    participantId: {
+      type: ParameterType.STRING,
+      pretty_name: 'Participant Id',
+      default: 'PARTICIPANT',
+      description: 'The participant Id: "PARTICIPANT" (default) or any string',
+    },
+    errorCallback: {
+      type: ParameterType.FUNCTION,
+      pretty_name: 'ErrorCallback',
+      default: PavloviaPlugin.defaultErrorCallback,
+      description:
+        'The callback function called whenever an error has occurred',
+    },
+    dataFilter: {
+      type: ParameterType.FUNCTION,
+      pretty_name: 'DataFilter',
+      default: PavloviaPlugin.defaultDataFilter,
+      description:
+        'The filter applied to the data gathered by jsPsych before upload to the server',
+    },
+  },
 };
+
+export default PavloviaPlugin;
diff --git a/webpack.config.js b/webpack.config.js
index fb54123..ab837f8 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -27,7 +27,7 @@ module.exports = {
     rules: [
       {
         test: /\.js$/,
-        exclude: /(node_modules)/,
+        exclude: /node_modules/,
         use: {
           loader: 'babel-loader',
           options: {